diff --git a/ts_debugserver/bundled.ts b/ts_debugserver/bundled.ts index e49c0b0..caeaf83 100644 --- a/ts_debugserver/bundled.ts +++ b/ts_debugserver/bundled.ts @@ -2,7 +2,7 @@ export const files: { path: string; contentBase64: string }[] = [ { "path": "bundle.js", - "contentBase64": "dmFyIF9fY3JlYXRlID0gT2JqZWN0LmNyZWF0ZTsKdmFyIF9fZGVmUHJvcCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsKdmFyIF9fZ2V0T3duUHJvcERlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOwp2YXIgX19nZXRPd25Qcm9wTmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lczsKdmFyIF9fZ2V0UHJvdG9PZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjsKdmFyIF9faGFzT3duUHJvcCA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7CnZhciBfX2tub3duU3ltYm9sID0gKG5hbWUsIHN5bWJvbCkgPT4gKHN5bWJvbCA9IFN5bWJvbFtuYW1lXSkgPyBzeW1ib2wgOiAvKiBAX19QVVJFX18gKi8gU3ltYm9sLmZvcigiU3ltYm9sLiIgKyBuYW1lKTsKdmFyIF9fdHlwZUVycm9yID0gKG1zZykgPT4gewogIHRocm93IFR5cGVFcnJvcihtc2cpOwp9Owp2YXIgX19kZWZOb3JtYWxQcm9wID0gKG9iaiwga2V5MiwgdmFsdWUyKSA9PiBrZXkyIGluIG9iaiA/IF9fZGVmUHJvcChvYmosIGtleTIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlMiB9KSA6IG9ialtrZXkyXSA9IHZhbHVlMjsKdmFyIF9fbmFtZSA9ICh0YXJnZXQsIHZhbHVlMikgPT4gX19kZWZQcm9wKHRhcmdldCwgIm5hbWUiLCB7IHZhbHVlOiB2YWx1ZTIsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTsKdmFyIF9fcmVxdWlyZSA9IC8qIEBfX1BVUkVfXyAqLyAoKHgzKSA9PiB0eXBlb2YgcmVxdWlyZSAhPT0gInVuZGVmaW5lZCIgPyByZXF1aXJlIDogdHlwZW9mIFByb3h5ICE9PSAidW5kZWZpbmVkIiA/IG5ldyBQcm94eSh4MywgewogIGdldDogKGE0LCBiNCkgPT4gKHR5cGVvZiByZXF1aXJlICE9PSAidW5kZWZpbmVkIiA/IHJlcXVpcmUgOiBhNClbYjRdCn0pIDogeDMpKGZ1bmN0aW9uKHgzKSB7CiAgaWYgKHR5cGVvZiByZXF1aXJlICE9PSAidW5kZWZpbmVkIikgcmV0dXJuIHJlcXVpcmUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB0aHJvdyBFcnJvcignRHluYW1pYyByZXF1aXJlIG9mICInICsgeDMgKyAnIiBpcyBub3Qgc3VwcG9ydGVkJyk7Cn0pOwp2YXIgX19jb21tb25KUyA9IChjYiwgbW9kKSA9PiBmdW5jdGlvbiBfX3JlcXVpcmUyKCkgewogIHJldHVybiBtb2QgfHwgKDAsIGNiW19fZ2V0T3duUHJvcE5hbWVzKGNiKVswXV0pKChtb2QgPSB7IGV4cG9ydHM6IHt9IH0pLmV4cG9ydHMsIG1vZCksIG1vZC5leHBvcnRzOwp9Owp2YXIgX19leHBvcnQgPSAodGFyZ2V0LCBhbGwzKSA9PiB7CiAgZm9yICh2YXIgbmFtZSBpbiBhbGwzKQogICAgX19kZWZQcm9wKHRhcmdldCwgbmFtZSwgeyBnZXQ6IGFsbDNbbmFtZV0sIGVudW1lcmFibGU6IHRydWUgfSk7Cn07CnZhciBfX2NvcHlQcm9wcyA9ICh0bywgZnJvbTIsIGV4Y2VwdCwgZGVzYykgPT4gewogIGlmIChmcm9tMiAmJiB0eXBlb2YgZnJvbTIgPT09ICJvYmplY3QiIHx8IHR5cGVvZiBmcm9tMiA9PT0gImZ1bmN0aW9uIikgewogICAgZm9yIChsZXQga2V5MiBvZiBfX2dldE93blByb3BOYW1lcyhmcm9tMikpCiAgICAgIGlmICghX19oYXNPd25Qcm9wLmNhbGwodG8sIGtleTIpICYmIGtleTIgIT09IGV4Y2VwdCkKICAgICAgICBfX2RlZlByb3AodG8sIGtleTIsIHsgZ2V0OiAoKSA9PiBmcm9tMltrZXkyXSwgZW51bWVyYWJsZTogIShkZXNjID0gX19nZXRPd25Qcm9wRGVzYyhmcm9tMiwga2V5MikpIHx8IGRlc2MuZW51bWVyYWJsZSB9KTsKICB9CiAgcmV0dXJuIHRvOwp9Owp2YXIgX190b0VTTSA9IChtb2QsIGlzTm9kZU1vZGUsIHRhcmdldCkgPT4gKHRhcmdldCA9IG1vZCAhPSBudWxsID8gX19jcmVhdGUoX19nZXRQcm90b09mKG1vZCkpIDoge30sIF9fY29weVByb3BzKAogIC8vIElmIHRoZSBpbXBvcnRlciBpcyBpbiBub2RlIGNvbXBhdGliaWxpdHkgbW9kZSBvciB0aGlzIGlzIG5vdCBhbiBFU00KICAvLyBmaWxlIHRoYXQgaGFzIGJlZW4gY29udmVydGVkIHRvIGEgQ29tbW9uSlMgZmlsZSB1c2luZyBhIEJhYmVsLQogIC8vIGNvbXBhdGlibGUgdHJhbnNmb3JtIChpLmUuICJfX2VzTW9kdWxlIiBoYXMgbm90IGJlZW4gc2V0KSwgdGhlbiBzZXQKICAvLyAiZGVmYXVsdCIgdG8gdGhlIENvbW1vbkpTICJtb2R1bGUuZXhwb3J0cyIgZm9yIG5vZGUgY29tcGF0aWJpbGl0eS4KICBpc05vZGVNb2RlIHx8ICFtb2QgfHwgIW1vZC5fX2VzTW9kdWxlID8gX19kZWZQcm9wKHRhcmdldCwgImRlZmF1bHQiLCB7IHZhbHVlOiBtb2QsIGVudW1lcmFibGU6IHRydWUgfSkgOiB0YXJnZXQsCiAgbW9kCikpOwp2YXIgX19kZWNvcmF0b3JTdGFydCA9IChiYXNlKSA9PiBbLCAsICwgX19jcmVhdGUoYmFzZT8uW19fa25vd25TeW1ib2woIm1ldGFkYXRhIildID8/IG51bGwpXTsKdmFyIF9fZGVjb3JhdG9yU3RyaW5ncyA9IFsiY2xhc3MiLCAibWV0aG9kIiwgImdldHRlciIsICJzZXR0ZXIiLCAiYWNjZXNzb3IiLCAiZmllbGQiLCAidmFsdWUiLCAiZ2V0IiwgInNldCJdOwp2YXIgX19leHBlY3RGbiA9IChmbikgPT4gZm4gIT09IHZvaWQgMCAmJiB0eXBlb2YgZm4gIT09ICJmdW5jdGlvbiIgPyBfX3R5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKSA6IGZuOwp2YXIgX19kZWNvcmF0b3JDb250ZXh0ID0gKGtpbmQsIG5hbWUsIGRvbmUsIG1ldGFkYXRhLCBmbnMpID0+ICh7IGtpbmQ6IF9fZGVjb3JhdG9yU3RyaW5nc1traW5kXSwgbmFtZSwgbWV0YWRhdGEsIGFkZEluaXRpYWxpemVyOiAoZm4pID0+IGRvbmUuXyA/IF9fdHlwZUVycm9yKCJBbHJlYWR5IGluaXRpYWxpemVkIikgOiBmbnMucHVzaChfX2V4cGVjdEZuKGZuIHx8IG51bGwpKSB9KTsKdmFyIF9fZGVjb3JhdG9yTWV0YWRhdGEgPSAoYXJyYXksIHRhcmdldCkgPT4gX19kZWZOb3JtYWxQcm9wKHRhcmdldCwgX19rbm93blN5bWJvbCgibWV0YWRhdGEiKSwgYXJyYXlbM10pOwp2YXIgX19ydW5Jbml0aWFsaXplcnMgPSAoYXJyYXksIGZsYWdzLCBzZWxmMiwgdmFsdWUyKSA9PiB7CiAgZm9yICh2YXIgaTEwID0gMCwgZm5zID0gYXJyYXlbZmxhZ3MgPj4gMV0sIG4xMSA9IGZucyAmJiBmbnMubGVuZ3RoOyBpMTAgPCBuMTE7IGkxMCsrKSBmbGFncyAmIDEgPyBmbnNbaTEwXS5jYWxsKHNlbGYyKSA6IHZhbHVlMiA9IGZuc1tpMTBdLmNhbGwoc2VsZjIsIHZhbHVlMik7CiAgcmV0dXJuIHZhbHVlMjsKfTsKdmFyIF9fZGVjb3JhdGVFbGVtZW50ID0gKGFycmF5LCBmbGFncywgbmFtZSwgZGVjb3JhdG9ycywgdGFyZ2V0LCBleHRyYSkgPT4gewogIHZhciBmbiwgaXQsIGRvbmUsIGN0eCwgYWNjZXNzLCBrMyA9IGZsYWdzICYgNywgczkgPSAhIShmbGFncyAmIDgpLCBwNiA9ICEhKGZsYWdzICYgMTYpOwogIHZhciBqMyA9IGszID4gMyA/IGFycmF5Lmxlbmd0aCArIDEgOiBrMyA/IHM5ID8gMSA6IDIgOiAwLCBrZXkyID0gX19kZWNvcmF0b3JTdHJpbmdzW2szICsgNV07CiAgdmFyIGluaXRpYWxpemVycyA9IGszID4gMyAmJiAoYXJyYXlbajMgLSAxXSA9IFtdKSwgZXh0cmFJbml0aWFsaXplcnMgPSBhcnJheVtqM10gfHwgKGFycmF5W2ozXSA9IFtdKTsKICB2YXIgZGVzYyA9IGszICYmICghcDYgJiYgIXM5ICYmICh0YXJnZXQgPSB0YXJnZXQucHJvdG90eXBlKSwgazMgPCA1ICYmIChrMyA+IDMgfHwgIXA2KSAmJiBfX2dldE93blByb3BEZXNjKGszIDwgNCA/IHRhcmdldCA6IHsgZ2V0IFtuYW1lXSgpIHsKICAgIHJldHVybiBfX3ByaXZhdGVHZXQodGhpcywgZXh0cmEpOwogIH0sIHNldCBbbmFtZV0oeDMpIHsKICAgIHJldHVybiBfX3ByaXZhdGVTZXQodGhpcywgZXh0cmEsIHgzKTsKICB9IH0sIG5hbWUpKTsKICBrMyA/IHA2ICYmIGszIDwgNCAmJiBfX25hbWUoZXh0cmEsIChrMyA+IDIgPyAic2V0ICIgOiBrMyA+IDEgPyAiZ2V0ICIgOiAiIikgKyBuYW1lKSA6IF9fbmFtZSh0YXJnZXQsIG5hbWUpOwogIGZvciAodmFyIGkxMCA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTEwID49IDA7IGkxMC0tKSB7CiAgICBjdHggPSBfX2RlY29yYXRvckNvbnRleHQoazMsIG5hbWUsIGRvbmUgPSB7fSwgYXJyYXlbM10sIGV4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIGlmIChrMykgewogICAgICBjdHguc3RhdGljID0gczksIGN0eC5wcml2YXRlID0gcDYsIGFjY2VzcyA9IGN0eC5hY2Nlc3MgPSB7IGhhczogcDYgPyAoeDMpID0+IF9fcHJpdmF0ZUluKHRhcmdldCwgeDMpIDogKHgzKSA9PiBuYW1lIGluIHgzIH07CiAgICAgIGlmIChrMyBeIDMpIGFjY2Vzcy5nZXQgPSBwNiA/ICh4MykgPT4gKGszIF4gMSA/IF9fcHJpdmF0ZUdldCA6IF9fcHJpdmF0ZU1ldGhvZCkoeDMsIHRhcmdldCwgazMgXiA0ID8gZXh0cmEgOiBkZXNjLmdldCkgOiAoeDMpID0+IHgzW25hbWVdOwogICAgICBpZiAoazMgPiAyKSBhY2Nlc3Muc2V0ID0gcDYgPyAoeDMsIHkzKSA9PiBfX3ByaXZhdGVTZXQoeDMsIHRhcmdldCwgeTMsIGszIF4gNCA/IGV4dHJhIDogZGVzYy5zZXQpIDogKHgzLCB5MykgPT4geDNbbmFtZV0gPSB5MzsKICAgIH0KICAgIGl0ID0gKDAsIGRlY29yYXRvcnNbaTEwXSkoazMgPyBrMyA8IDQgPyBwNiA/IGV4dHJhIDogZGVzY1trZXkyXSA6IGszID4gNCA/IHZvaWQgMCA6IHsgZ2V0OiBkZXNjLmdldCwgc2V0OiBkZXNjLnNldCB9IDogdGFyZ2V0LCBjdHgpLCBkb25lLl8gPSAxOwogICAgaWYgKGszIF4gNCB8fCBpdCA9PT0gdm9pZCAwKSBfX2V4cGVjdEZuKGl0KSAmJiAoazMgPiA0ID8gaW5pdGlhbGl6ZXJzLnVuc2hpZnQoaXQpIDogazMgPyBwNiA/IGV4dHJhID0gaXQgOiBkZXNjW2tleTJdID0gaXQgOiB0YXJnZXQgPSBpdCk7CiAgICBlbHNlIGlmICh0eXBlb2YgaXQgIT09ICJvYmplY3QiIHx8IGl0ID09PSBudWxsKSBfX3R5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICBlbHNlIF9fZXhwZWN0Rm4oZm4gPSBpdC5nZXQpICYmIChkZXNjLmdldCA9IGZuKSwgX19leHBlY3RGbihmbiA9IGl0LnNldCkgJiYgKGRlc2Muc2V0ID0gZm4pLCBfX2V4cGVjdEZuKGZuID0gaXQuaW5pdCkgJiYgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoZm4pOwogIH0KICByZXR1cm4gazMgfHwgX19kZWNvcmF0b3JNZXRhZGF0YShhcnJheSwgdGFyZ2V0KSwgZGVzYyAmJiBfX2RlZlByb3AodGFyZ2V0LCBuYW1lLCBkZXNjKSwgcDYgPyBrMyBeIDQgPyBleHRyYSA6IGRlc2MgOiB0YXJnZXQ7Cn07CnZhciBfX3B1YmxpY0ZpZWxkID0gKG9iaiwga2V5MiwgdmFsdWUyKSA9PiBfX2RlZk5vcm1hbFByb3Aob2JqLCB0eXBlb2Yga2V5MiAhPT0gInN5bWJvbCIgPyBrZXkyICsgIiIgOiBrZXkyLCB2YWx1ZTIpOwp2YXIgX19hY2Nlc3NDaGVjayA9IChvYmosIG1lbWJlciwgbXNnKSA9PiBtZW1iZXIuaGFzKG9iaikgfHwgX190eXBlRXJyb3IoIkNhbm5vdCAiICsgbXNnKTsKdmFyIF9fcHJpdmF0ZUluID0gKG1lbWJlciwgb2JqKSA9PiBPYmplY3Qob2JqKSAhPT0gb2JqID8gX190eXBlRXJyb3IoJ0Nhbm5vdCB1c2UgdGhlICJpbiIgb3BlcmF0b3Igb24gdGhpcyB2YWx1ZScpIDogbWVtYmVyLmhhcyhvYmopOwp2YXIgX19wcml2YXRlR2V0ID0gKG9iaiwgbWVtYmVyLCBnZXR0ZXIpID0+IChfX2FjY2Vzc0NoZWNrKG9iaiwgbWVtYmVyLCAicmVhZCBmcm9tIHByaXZhdGUgZmllbGQiKSwgZ2V0dGVyID8gZ2V0dGVyLmNhbGwob2JqKSA6IG1lbWJlci5nZXQob2JqKSk7CnZhciBfX3ByaXZhdGVBZGQgPSAob2JqLCBtZW1iZXIsIHZhbHVlMikgPT4gbWVtYmVyLmhhcyhvYmopID8gX190eXBlRXJyb3IoIkNhbm5vdCBhZGQgdGhlIHNhbWUgcHJpdmF0ZSBtZW1iZXIgbW9yZSB0aGFuIG9uY2UiKSA6IG1lbWJlciBpbnN0YW5jZW9mIFdlYWtTZXQgPyBtZW1iZXIuYWRkKG9iaikgOiBtZW1iZXIuc2V0KG9iaiwgdmFsdWUyKTsKdmFyIF9fcHJpdmF0ZVNldCA9IChvYmosIG1lbWJlciwgdmFsdWUyLCBzZXR0ZXIpID0+IChfX2FjY2Vzc0NoZWNrKG9iaiwgbWVtYmVyLCAid3JpdGUgdG8gcHJpdmF0ZSBmaWVsZCIpLCBzZXR0ZXIgPyBzZXR0ZXIuY2FsbChvYmosIHZhbHVlMikgOiBtZW1iZXIuc2V0KG9iaiwgdmFsdWUyKSwgdmFsdWUyKTsKdmFyIF9fcHJpdmF0ZU1ldGhvZCA9IChvYmosIG1lbWJlciwgbWV0aG9kKSA9PiAoX19hY2Nlc3NDaGVjayhvYmosIG1lbWJlciwgImFjY2VzcyBwcml2YXRlIG1ldGhvZCIpLCBtZXRob2QpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2lzb3VuaXF1ZUAxLjAuNS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvaXNvdW5pcXVlL2Rpc3RfdHMvaW5kZXguanMKdmFyIHJlcXVpcmVfZGlzdF90cyA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3MraXNvdW5pcXVlQDEuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9pc291bmlxdWUvZGlzdF90cy9pbmRleC5qcyIoZXhwb3J0cykgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMudW5pID0gdm9pZCAwOwogICAgdmFyIHVuaTIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChwcmVmaXggPSAidW5pIikgPT4gewogICAgICByZXR1cm4gYCR7cHJlZml4fV8ke2B4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhgLnJlcGxhY2UoL1t4eV0vZywgKGMxMCkgPT4gewogICAgICAgIGNvbnN0IHIxMCA9IE1hdGgucmFuZG9tKCkgKiAxNiB8IDA7CiAgICAgICAgY29uc3QgdjQgPSBjMTAgPT09ICJ4IiA/IHIxMCA6IHIxMCAmIDMgfCA4OwogICAgICAgIHJldHVybiB2NC50b1N0cmluZygxNik7CiAgICAgIH0pfWA7CiAgICB9LCAidW5pIik7CiAgICBleHBvcnRzLnVuaSA9IHVuaTI7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXlqc0AxLjExLjIwL25vZGVfbW9kdWxlcy9kYXlqcy9kYXlqcy5taW4uanMKdmFyIHJlcXVpcmVfZGF5anNfbWluID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXlqc0AxLjExLjIwL25vZGVfbW9kdWxlcy9kYXlqcy9kYXlqcy5taW4uanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgIShmdW5jdGlvbih0OCwgZTEwKSB7CiAgICAgICJvYmplY3QiID09IHR5cGVvZiBleHBvcnRzICYmICJ1bmRlZmluZWQiICE9IHR5cGVvZiBtb2R1bGUgPyBtb2R1bGUuZXhwb3J0cyA9IGUxMCgpIDogImZ1bmN0aW9uIiA9PSB0eXBlb2YgZGVmaW5lICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZTEwKSA6ICh0OCA9ICJ1bmRlZmluZWQiICE9IHR5cGVvZiBnbG9iYWxUaGlzID8gZ2xvYmFsVGhpcyA6IHQ4IHx8IHNlbGYpLmRheWpzID0gZTEwKCk7CiAgICB9KShleHBvcnRzLCAoZnVuY3Rpb24oKSB7CiAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgdmFyIHQ4ID0gMWUzLCBlMTAgPSA2ZTQsIG4xMSA9IDM2ZTUsIHIxMCA9ICJtaWxsaXNlY29uZCIsIGkxMCA9ICJzZWNvbmQiLCBzOSA9ICJtaW51dGUiLCB1NiA9ICJob3VyIiwgYTQgPSAiZGF5IiwgbzEyID0gIndlZWsiLCBjMTAgPSAibW9udGgiLCBmNiA9ICJxdWFydGVyIiwgaDcgPSAieWVhciIsIGQ0ID0gImRhdGUiLCBsNSA9ICJJbnZhbGlkIERhdGUiLCAkMyA9IC9eKFxkezR9KVstL10/KFxkezEsMn0pP1stL10/KFxkezAsMn0pW1R0XHNdKihcZHsxLDJ9KT86PyhcZHsxLDJ9KT86PyhcZHsxLDJ9KT9bLjpdPyhcZCspPyQvLCB5MyA9IC9cWyhbXlxdXSspXXxZezEsNH18TXsxLDR9fER7MSwyfXxkezEsNH18SHsxLDJ9fGh7MSwyfXxhfEF8bXsxLDJ9fHN7MSwyfXxaezEsMn18U1NTL2csIE0zID0geyBuYW1lOiAiZW4iLCB3ZWVrZGF5czogIlN1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5Ii5zcGxpdCgiXyIpLCBtb250aHM6ICJKYW51YXJ5X0ZlYnJ1YXJ5X01hcmNoX0FwcmlsX01heV9KdW5lX0p1bHlfQXVndXN0X1NlcHRlbWJlcl9PY3RvYmVyX05vdmVtYmVyX0RlY2VtYmVyIi5zcGxpdCgiXyIpLCBvcmRpbmFsOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKHQ5KSB7CiAgICAgICAgdmFyIGUxMSA9IFsidGgiLCAic3QiLCAibmQiLCAicmQiXSwgbjEyID0gdDkgJSAxMDA7CiAgICAgICAgcmV0dXJuICJbIiArIHQ5ICsgKGUxMVsobjEyIC0gMjApICUgMTBdIHx8IGUxMVtuMTJdIHx8IGUxMVswXSkgKyAiXSI7CiAgICAgIH0sICJvcmRpbmFsIikgfSwgbTUgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKHQ5LCBlMTEsIG4xMikgewogICAgICAgIHZhciByMTEgPSBTdHJpbmcodDkpOwogICAgICAgIHJldHVybiAhcjExIHx8IHIxMS5sZW5ndGggPj0gZTExID8gdDkgOiAiIiArIEFycmF5KGUxMSArIDEgLSByMTEubGVuZ3RoKS5qb2luKG4xMikgKyB0OTsKICAgICAgfSwgIm0iKSwgdjQgPSB7IHM6IG01LCB6OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKHQ5KSB7CiAgICAgICAgdmFyIGUxMSA9IC10OS51dGNPZmZzZXQoKSwgbjEyID0gTWF0aC5hYnMoZTExKSwgcjExID0gTWF0aC5mbG9vcihuMTIgLyA2MCksIGkxMSA9IG4xMiAlIDYwOwogICAgICAgIHJldHVybiAoZTExIDw9IDAgPyAiKyIgOiAiLSIpICsgbTUocjExLCAyLCAiMCIpICsgIjoiICsgbTUoaTExLCAyLCAiMCIpOwogICAgICB9LCAieiIpLCBtOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uIHQ5KGUxMSwgbjEyKSB7CiAgICAgICAgaWYgKGUxMS5kYXRlKCkgPCBuMTIuZGF0ZSgpKSByZXR1cm4gLXQ5KG4xMiwgZTExKTsKICAgICAgICB2YXIgcjExID0gMTIgKiAobjEyLnllYXIoKSAtIGUxMS55ZWFyKCkpICsgKG4xMi5tb250aCgpIC0gZTExLm1vbnRoKCkpLCBpMTEgPSBlMTEuY2xvbmUoKS5hZGQocjExLCBjMTApLCBzMTAgPSBuMTIgLSBpMTEgPCAwLCB1NyA9IGUxMS5jbG9uZSgpLmFkZChyMTEgKyAoczEwID8gLTEgOiAxKSwgYzEwKTsKICAgICAgICByZXR1cm4gKygtKHIxMSArIChuMTIgLSBpMTEpIC8gKHMxMCA/IGkxMSAtIHU3IDogdTcgLSBpMTEpKSB8fCAwKTsKICAgICAgfSwgInQiKSwgYTogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbih0OSkgewogICAgICAgIHJldHVybiB0OSA8IDAgPyBNYXRoLmNlaWwodDkpIHx8IDAgOiBNYXRoLmZsb29yKHQ5KTsKICAgICAgfSwgImEiKSwgcDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbih0OSkgewogICAgICAgIHJldHVybiB7IE06IGMxMCwgeTogaDcsIHc6IG8xMiwgZDogYTQsIEQ6IGQ0LCBoOiB1NiwgbTogczksIHM6IGkxMCwgbXM6IHIxMCwgUTogZjYgfVt0OV0gfHwgU3RyaW5nKHQ5IHx8ICIiKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL3MkLywgIiIpOwogICAgICB9LCAicCIpLCB1OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKHQ5KSB7CiAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gdDk7CiAgICAgIH0sICJ1IikgfSwgZzMgPSAiZW4iLCBEMyA9IHt9OwogICAgICBEM1tnM10gPSBNMzsKICAgICAgdmFyIHA2ID0gIiRpc0RheWpzT2JqZWN0IiwgUzMgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKHQ5KSB7CiAgICAgICAgcmV0dXJuIHQ5IGluc3RhbmNlb2YgXzMgfHwgISghdDkgfHwgIXQ5W3A2XSk7CiAgICAgIH0sICJTIiksIHczID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbiB0OShlMTEsIG4xMiwgcjExKSB7CiAgICAgICAgdmFyIGkxMTsKICAgICAgICBpZiAoIWUxMSkgcmV0dXJuIGczOwogICAgICAgIGlmICgic3RyaW5nIiA9PSB0eXBlb2YgZTExKSB7CiAgICAgICAgICB2YXIgczEwID0gZTExLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICBEM1tzMTBdICYmIChpMTEgPSBzMTApLCBuMTIgJiYgKEQzW3MxMF0gPSBuMTIsIGkxMSA9IHMxMCk7CiAgICAgICAgICB2YXIgdTcgPSBlMTEuc3BsaXQoIi0iKTsKICAgICAgICAgIGlmICghaTExICYmIHU3Lmxlbmd0aCA+IDEpIHJldHVybiB0OSh1N1swXSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciBhNSA9IGUxMS5uYW1lOwogICAgICAgICAgRDNbYTVdID0gZTExLCBpMTEgPSBhNTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICFyMTEgJiYgaTExICYmIChnMyA9IGkxMSksIGkxMSB8fCAhcjExICYmIGczOwogICAgICB9LCAidCIpLCBPMiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24odDksIGUxMSkgewogICAgICAgIGlmIChTMyh0OSkpIHJldHVybiB0OS5jbG9uZSgpOwogICAgICAgIHZhciBuMTIgPSAib2JqZWN0IiA9PSB0eXBlb2YgZTExID8gZTExIDoge307CiAgICAgICAgcmV0dXJuIG4xMi5kYXRlID0gdDksIG4xMi5hcmdzID0gYXJndW1lbnRzLCBuZXcgXzMobjEyKTsKICAgICAgfSwgIk8iKSwgYjQgPSB2NDsKICAgICAgYjQubCA9IHczLCBiNC5pID0gUzMsIGI0LncgPSBmdW5jdGlvbih0OSwgZTExKSB7CiAgICAgICAgcmV0dXJuIE8yKHQ5LCB7IGxvY2FsZTogZTExLiRMLCB1dGM6IGUxMS4kdSwgeDogZTExLiR4LCAkb2Zmc2V0OiBlMTEuJG9mZnNldCB9KTsKICAgICAgfTsKICAgICAgdmFyIF8zID0gKGZ1bmN0aW9uKCkgewogICAgICAgIGZ1bmN0aW9uIE00KHQ5KSB7CiAgICAgICAgICB0aGlzLiRMID0gdzModDkubG9jYWxlLCBudWxsLCB0cnVlKSwgdGhpcy5wYXJzZSh0OSksIHRoaXMuJHggPSB0aGlzLiR4IHx8IHQ5LnggfHwge30sIHRoaXNbcDZdID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgX19uYW1lKE00LCAiTSIpOwogICAgICAgIHZhciBtNiA9IE00LnByb3RvdHlwZTsKICAgICAgICByZXR1cm4gbTYucGFyc2UgPSBmdW5jdGlvbih0OSkgewogICAgICAgICAgdGhpcy4kZCA9IChmdW5jdGlvbih0MTApIHsKICAgICAgICAgICAgdmFyIGUxMSA9IHQxMC5kYXRlLCBuMTIgPSB0MTAudXRjOwogICAgICAgICAgICBpZiAobnVsbCA9PT0gZTExKSByZXR1cm4gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKE5hTik7CiAgICAgICAgICAgIGlmIChiNC51KGUxMSkpIHJldHVybiAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKTsKICAgICAgICAgICAgaWYgKGUxMSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiBuZXcgRGF0ZShlMTEpOwogICAgICAgICAgICBpZiAoInN0cmluZyIgPT0gdHlwZW9mIGUxMSAmJiAhL1okL2kudGVzdChlMTEpKSB7CiAgICAgICAgICAgICAgdmFyIHIxMSA9IGUxMS5tYXRjaCgkMyk7CiAgICAgICAgICAgICAgaWYgKHIxMSkgewogICAgICAgICAgICAgICAgdmFyIGkxMSA9IHIxMVsyXSAtIDEgfHwgMCwgczEwID0gKHIxMVs3XSB8fCAiMCIpLnN1YnN0cmluZygwLCAzKTsKICAgICAgICAgICAgICAgIHJldHVybiBuMTIgPyBuZXcgRGF0ZShEYXRlLlVUQyhyMTFbMV0sIGkxMSwgcjExWzNdIHx8IDEsIHIxMVs0XSB8fCAwLCByMTFbNV0gfHwgMCwgcjExWzZdIHx8IDAsIHMxMCkpIDogbmV3IERhdGUocjExWzFdLCBpMTEsIHIxMVszXSB8fCAxLCByMTFbNF0gfHwgMCwgcjExWzVdIHx8IDAsIHIxMVs2XSB8fCAwLCBzMTApOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoZTExKTsKICAgICAgICAgIH0pKHQ5KSwgdGhpcy5pbml0KCk7CiAgICAgICAgfSwgbTYuaW5pdCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgdmFyIHQ5ID0gdGhpcy4kZDsKICAgICAgICAgIHRoaXMuJHkgPSB0OS5nZXRGdWxsWWVhcigpLCB0aGlzLiRNID0gdDkuZ2V0TW9udGgoKSwgdGhpcy4kRCA9IHQ5LmdldERhdGUoKSwgdGhpcy4kVyA9IHQ5LmdldERheSgpLCB0aGlzLiRIID0gdDkuZ2V0SG91cnMoKSwgdGhpcy4kbSA9IHQ5LmdldE1pbnV0ZXMoKSwgdGhpcy4kcyA9IHQ5LmdldFNlY29uZHMoKSwgdGhpcy4kbXMgPSB0OS5nZXRNaWxsaXNlY29uZHMoKTsKICAgICAgICB9LCBtNi4kdXRpbHMgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBiNDsKICAgICAgICB9LCBtNi5pc1ZhbGlkID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gISh0aGlzLiRkLnRvU3RyaW5nKCkgPT09IGw1KTsKICAgICAgICB9LCBtNi5pc1NhbWUgPSBmdW5jdGlvbih0OSwgZTExKSB7CiAgICAgICAgICB2YXIgbjEyID0gTzIodDkpOwogICAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRPZihlMTEpIDw9IG4xMiAmJiBuMTIgPD0gdGhpcy5lbmRPZihlMTEpOwogICAgICAgIH0sIG02LmlzQWZ0ZXIgPSBmdW5jdGlvbih0OSwgZTExKSB7CiAgICAgICAgICByZXR1cm4gTzIodDkpIDwgdGhpcy5zdGFydE9mKGUxMSk7CiAgICAgICAgfSwgbTYuaXNCZWZvcmUgPSBmdW5jdGlvbih0OSwgZTExKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5lbmRPZihlMTEpIDwgTzIodDkpOwogICAgICAgIH0sIG02LiRnID0gZnVuY3Rpb24odDksIGUxMSwgbjEyKSB7CiAgICAgICAgICByZXR1cm4gYjQudSh0OSkgPyB0aGlzW2UxMV0gOiB0aGlzLnNldChuMTIsIHQ5KTsKICAgICAgICB9LCBtNi51bml4ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcih0aGlzLnZhbHVlT2YoKSAvIDFlMyk7CiAgICAgICAgfSwgbTYudmFsdWVPZiA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuJGQuZ2V0VGltZSgpOwogICAgICAgIH0sIG02LnN0YXJ0T2YgPSBmdW5jdGlvbih0OSwgZTExKSB7CiAgICAgICAgICB2YXIgbjEyID0gdGhpcywgcjExID0gISFiNC51KGUxMSkgfHwgZTExLCBmNyA9IGI0LnAodDkpLCBsNiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24odDEwLCBlMTIpIHsKICAgICAgICAgICAgdmFyIGkxMSA9IGI0LncobjEyLiR1ID8gRGF0ZS5VVEMobjEyLiR5LCBlMTIsIHQxMCkgOiBuZXcgRGF0ZShuMTIuJHksIGUxMiwgdDEwKSwgbjEyKTsKICAgICAgICAgICAgcmV0dXJuIHIxMSA/IGkxMSA6IGkxMS5lbmRPZihhNCk7CiAgICAgICAgICB9LCAibCIpLCAkNCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24odDEwLCBlMTIpIHsKICAgICAgICAgICAgcmV0dXJuIGI0LncobjEyLnRvRGF0ZSgpW3QxMF0uYXBwbHkobjEyLnRvRGF0ZSgicyIpLCAocjExID8gWzAsIDAsIDAsIDBdIDogWzIzLCA1OSwgNTksIDk5OV0pLnNsaWNlKGUxMikpLCBuMTIpOwogICAgICAgICAgfSwgIiQiKSwgeTQgPSB0aGlzLiRXLCBNNSA9IHRoaXMuJE0sIG03ID0gdGhpcy4kRCwgdjUgPSAic2V0IiArICh0aGlzLiR1ID8gIlVUQyIgOiAiIik7CiAgICAgICAgICBzd2l0Y2ggKGY3KSB7CiAgICAgICAgICAgIGNhc2UgaDc6CiAgICAgICAgICAgICAgcmV0dXJuIHIxMSA/IGw2KDEsIDApIDogbDYoMzEsIDExKTsKICAgICAgICAgICAgY2FzZSBjMTA6CiAgICAgICAgICAgICAgcmV0dXJuIHIxMSA/IGw2KDEsIE01KSA6IGw2KDAsIE01ICsgMSk7CiAgICAgICAgICAgIGNhc2UgbzEyOgogICAgICAgICAgICAgIHZhciBnNCA9IHRoaXMuJGxvY2FsZSgpLndlZWtTdGFydCB8fCAwLCBENCA9ICh5NCA8IGc0ID8geTQgKyA3IDogeTQpIC0gZzQ7CiAgICAgICAgICAgICAgcmV0dXJuIGw2KHIxMSA/IG03IC0gRDQgOiBtNyArICg2IC0gRDQpLCBNNSk7CiAgICAgICAgICAgIGNhc2UgYTQ6CiAgICAgICAgICAgIGNhc2UgZDQ6CiAgICAgICAgICAgICAgcmV0dXJuICQ0KHY1ICsgIkhvdXJzIiwgMCk7CiAgICAgICAgICAgIGNhc2UgdTY6CiAgICAgICAgICAgICAgcmV0dXJuICQ0KHY1ICsgIk1pbnV0ZXMiLCAxKTsKICAgICAgICAgICAgY2FzZSBzOToKICAgICAgICAgICAgICByZXR1cm4gJDQodjUgKyAiU2Vjb25kcyIsIDIpOwogICAgICAgICAgICBjYXNlIGkxMDoKICAgICAgICAgICAgICByZXR1cm4gJDQodjUgKyAiTWlsbGlzZWNvbmRzIiwgMyk7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKTsKICAgICAgICAgIH0KICAgICAgICB9LCBtNi5lbmRPZiA9IGZ1bmN0aW9uKHQ5KSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5zdGFydE9mKHQ5LCBmYWxzZSk7CiAgICAgICAgfSwgbTYuJHNldCA9IGZ1bmN0aW9uKHQ5LCBlMTEpIHsKICAgICAgICAgIHZhciBuMTIsIG8xMyA9IGI0LnAodDkpLCBmNyA9ICJzZXQiICsgKHRoaXMuJHUgPyAiVVRDIiA6ICIiKSwgbDYgPSAobjEyID0ge30sIG4xMlthNF0gPSBmNyArICJEYXRlIiwgbjEyW2Q0XSA9IGY3ICsgIkRhdGUiLCBuMTJbYzEwXSA9IGY3ICsgIk1vbnRoIiwgbjEyW2g3XSA9IGY3ICsgIkZ1bGxZZWFyIiwgbjEyW3U2XSA9IGY3ICsgIkhvdXJzIiwgbjEyW3M5XSA9IGY3ICsgIk1pbnV0ZXMiLCBuMTJbaTEwXSA9IGY3ICsgIlNlY29uZHMiLCBuMTJbcjEwXSA9IGY3ICsgIk1pbGxpc2Vjb25kcyIsIG4xMilbbzEzXSwgJDQgPSBvMTMgPT09IGE0ID8gdGhpcy4kRCArIChlMTEgLSB0aGlzLiRXKSA6IGUxMTsKICAgICAgICAgIGlmIChvMTMgPT09IGMxMCB8fCBvMTMgPT09IGg3KSB7CiAgICAgICAgICAgIHZhciB5NCA9IHRoaXMuY2xvbmUoKS5zZXQoZDQsIDEpOwogICAgICAgICAgICB5NC4kZFtsNl0oJDQpLCB5NC5pbml0KCksIHRoaXMuJGQgPSB5NC5zZXQoZDQsIE1hdGgubWluKHRoaXMuJEQsIHk0LmRheXNJbk1vbnRoKCkpKS4kZDsKICAgICAgICAgIH0gZWxzZSBsNiAmJiB0aGlzLiRkW2w2XSgkNCk7CiAgICAgICAgICByZXR1cm4gdGhpcy5pbml0KCksIHRoaXM7CiAgICAgICAgfSwgbTYuc2V0ID0gZnVuY3Rpb24odDksIGUxMSkgewogICAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS4kc2V0KHQ5LCBlMTEpOwogICAgICAgIH0sIG02LmdldCA9IGZ1bmN0aW9uKHQ5KSB7CiAgICAgICAgICByZXR1cm4gdGhpc1tiNC5wKHQ5KV0oKTsKICAgICAgICB9LCBtNi5hZGQgPSBmdW5jdGlvbihyMTEsIGY3KSB7CiAgICAgICAgICB2YXIgZDUsIGw2ID0gdGhpczsKICAgICAgICAgIHIxMSA9IE51bWJlcihyMTEpOwogICAgICAgICAgdmFyICQ0ID0gYjQucChmNyksIHk0ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbih0OSkgewogICAgICAgICAgICB2YXIgZTExID0gTzIobDYpOwogICAgICAgICAgICByZXR1cm4gYjQudyhlMTEuZGF0ZShlMTEuZGF0ZSgpICsgTWF0aC5yb3VuZCh0OSAqIHIxMSkpLCBsNik7CiAgICAgICAgICB9LCAieSIpOwogICAgICAgICAgaWYgKCQ0ID09PSBjMTApIHJldHVybiB0aGlzLnNldChjMTAsIHRoaXMuJE0gKyByMTEpOwogICAgICAgICAgaWYgKCQ0ID09PSBoNykgcmV0dXJuIHRoaXMuc2V0KGg3LCB0aGlzLiR5ICsgcjExKTsKICAgICAgICAgIGlmICgkNCA9PT0gYTQpIHJldHVybiB5NCgxKTsKICAgICAgICAgIGlmICgkNCA9PT0gbzEyKSByZXR1cm4geTQoNyk7CiAgICAgICAgICB2YXIgTTUgPSAoZDUgPSB7fSwgZDVbczldID0gZTEwLCBkNVt1Nl0gPSBuMTEsIGQ1W2kxMF0gPSB0OCwgZDUpWyQ0XSB8fCAxLCBtNyA9IHRoaXMuJGQuZ2V0VGltZSgpICsgcjExICogTTU7CiAgICAgICAgICByZXR1cm4gYjQudyhtNywgdGhpcyk7CiAgICAgICAgfSwgbTYuc3VidHJhY3QgPSBmdW5jdGlvbih0OSwgZTExKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5hZGQoLTEgKiB0OSwgZTExKTsKICAgICAgICB9LCBtNi5mb3JtYXQgPSBmdW5jdGlvbih0OSkgewogICAgICAgICAgdmFyIGUxMSA9IHRoaXMsIG4xMiA9IHRoaXMuJGxvY2FsZSgpOwogICAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkgcmV0dXJuIG4xMi5pbnZhbGlkRGF0ZSB8fCBsNTsKICAgICAgICAgIHZhciByMTEgPSB0OSB8fCAiWVlZWS1NTS1ERFRISDptbTpzc1oiLCBpMTEgPSBiNC56KHRoaXMpLCBzMTAgPSB0aGlzLiRILCB1NyA9IHRoaXMuJG0sIGE1ID0gdGhpcy4kTSwgbzEzID0gbjEyLndlZWtkYXlzLCBjMTEgPSBuMTIubW9udGhzLCBmNyA9IG4xMi5tZXJpZGllbSwgaDggPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKHQxMCwgbjEzLCBpMTIsIHMxMSkgewogICAgICAgICAgICByZXR1cm4gdDEwICYmICh0MTBbbjEzXSB8fCB0MTAoZTExLCByMTEpKSB8fCBpMTJbbjEzXS5zbGljZSgwLCBzMTEpOwogICAgICAgICAgfSwgImgiKSwgZDUgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKHQxMCkgewogICAgICAgICAgICByZXR1cm4gYjQucyhzMTAgJSAxMiB8fCAxMiwgdDEwLCAiMCIpOwogICAgICAgICAgfSwgImQiKSwgJDQgPSBmNyB8fCBmdW5jdGlvbih0MTAsIGUxMiwgbjEzKSB7CiAgICAgICAgICAgIHZhciByMTIgPSB0MTAgPCAxMiA/ICJBTSIgOiAiUE0iOwogICAgICAgICAgICByZXR1cm4gbjEzID8gcjEyLnRvTG93ZXJDYXNlKCkgOiByMTI7CiAgICAgICAgICB9OwogICAgICAgICAgcmV0dXJuIHIxMS5yZXBsYWNlKHkzLCAoZnVuY3Rpb24odDEwLCByMTIpIHsKICAgICAgICAgICAgcmV0dXJuIHIxMiB8fCAoZnVuY3Rpb24odDExKSB7CiAgICAgICAgICAgICAgc3dpdGNoICh0MTEpIHsKICAgICAgICAgICAgICAgIGNhc2UgIllZIjoKICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhlMTEuJHkpLnNsaWNlKC0yKTsKICAgICAgICAgICAgICAgIGNhc2UgIllZWVkiOgogICAgICAgICAgICAgICAgICByZXR1cm4gYjQucyhlMTEuJHksIDQsICIwIik7CiAgICAgICAgICAgICAgICBjYXNlICJNIjoKICAgICAgICAgICAgICAgICAgcmV0dXJuIGE1ICsgMTsKICAgICAgICAgICAgICAgIGNhc2UgIk1NIjoKICAgICAgICAgICAgICAgICAgcmV0dXJuIGI0LnMoYTUgKyAxLCAyLCAiMCIpOwogICAgICAgICAgICAgICAgY2FzZSAiTU1NIjoKICAgICAgICAgICAgICAgICAgcmV0dXJuIGg4KG4xMi5tb250aHNTaG9ydCwgYTUsIGMxMSwgMyk7CiAgICAgICAgICAgICAgICBjYXNlICJNTU1NIjoKICAgICAgICAgICAgICAgICAgcmV0dXJuIGg4KGMxMSwgYTUpOwogICAgICAgICAgICAgICAgY2FzZSAiRCI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBlMTEuJEQ7CiAgICAgICAgICAgICAgICBjYXNlICJERCI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBiNC5zKGUxMS4kRCwgMiwgIjAiKTsKICAgICAgICAgICAgICAgIGNhc2UgImQiOgogICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKGUxMS4kVyk7CiAgICAgICAgICAgICAgICBjYXNlICJkZCI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBoOChuMTIud2Vla2RheXNNaW4sIGUxMS4kVywgbzEzLCAyKTsKICAgICAgICAgICAgICAgIGNhc2UgImRkZCI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBoOChuMTIud2Vla2RheXNTaG9ydCwgZTExLiRXLCBvMTMsIDMpOwogICAgICAgICAgICAgICAgY2FzZSAiZGRkZCI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBvMTNbZTExLiRXXTsKICAgICAgICAgICAgICAgIGNhc2UgIkgiOgogICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKHMxMCk7CiAgICAgICAgICAgICAgICBjYXNlICJISCI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBiNC5zKHMxMCwgMiwgIjAiKTsKICAgICAgICAgICAgICAgIGNhc2UgImgiOgogICAgICAgICAgICAgICAgICByZXR1cm4gZDUoMSk7CiAgICAgICAgICAgICAgICBjYXNlICJoaCI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBkNSgyKTsKICAgICAgICAgICAgICAgIGNhc2UgImEiOgogICAgICAgICAgICAgICAgICByZXR1cm4gJDQoczEwLCB1NywgdHJ1ZSk7CiAgICAgICAgICAgICAgICBjYXNlICJBIjoKICAgICAgICAgICAgICAgICAgcmV0dXJuICQ0KHMxMCwgdTcsIGZhbHNlKTsKICAgICAgICAgICAgICAgIGNhc2UgIm0iOgogICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKHU3KTsKICAgICAgICAgICAgICAgIGNhc2UgIm1tIjoKICAgICAgICAgICAgICAgICAgcmV0dXJuIGI0LnModTcsIDIsICIwIik7CiAgICAgICAgICAgICAgICBjYXNlICJzIjoKICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhlMTEuJHMpOwogICAgICAgICAgICAgICAgY2FzZSAic3MiOgogICAgICAgICAgICAgICAgICByZXR1cm4gYjQucyhlMTEuJHMsIDIsICIwIik7CiAgICAgICAgICAgICAgICBjYXNlICJTU1MiOgogICAgICAgICAgICAgICAgICByZXR1cm4gYjQucyhlMTEuJG1zLCAzLCAiMCIpOwogICAgICAgICAgICAgICAgY2FzZSAiWiI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBpMTE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9KSh0MTApIHx8IGkxMS5yZXBsYWNlKCI6IiwgIiIpOwogICAgICAgICAgfSkpOwogICAgICAgIH0sIG02LnV0Y09mZnNldCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIDE1ICogLU1hdGgucm91bmQodGhpcy4kZC5nZXRUaW1lem9uZU9mZnNldCgpIC8gMTUpOwogICAgICAgIH0sIG02LmRpZmYgPSBmdW5jdGlvbihyMTEsIGQ1LCBsNikgewogICAgICAgICAgdmFyICQ0LCB5NCA9IHRoaXMsIE01ID0gYjQucChkNSksIG03ID0gTzIocjExKSwgdjUgPSAobTcudXRjT2Zmc2V0KCkgLSB0aGlzLnV0Y09mZnNldCgpKSAqIGUxMCwgZzQgPSB0aGlzIC0gbTcsIEQ0ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIGI0Lm0oeTQsIG03KTsKICAgICAgICAgIH0sICJEIik7CiAgICAgICAgICBzd2l0Y2ggKE01KSB7CiAgICAgICAgICAgIGNhc2UgaDc6CiAgICAgICAgICAgICAgJDQgPSBENCgpIC8gMTI7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgYzEwOgogICAgICAgICAgICAgICQ0ID0gRDQoKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBmNjoKICAgICAgICAgICAgICAkNCA9IEQ0KCkgLyAzOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIG8xMjoKICAgICAgICAgICAgICAkNCA9IChnNCAtIHY1KSAvIDYwNDhlNTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBhNDoKICAgICAgICAgICAgICAkNCA9IChnNCAtIHY1KSAvIDg2NGU1OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIHU2OgogICAgICAgICAgICAgICQ0ID0gZzQgLyBuMTE7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2Ugczk6CiAgICAgICAgICAgICAgJDQgPSBnNCAvIGUxMDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBpMTA6CiAgICAgICAgICAgICAgJDQgPSBnNCAvIHQ4OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICQ0ID0gZzQ7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbDYgPyAkNCA6IGI0LmEoJDQpOwogICAgICAgIH0sIG02LmRheXNJbk1vbnRoID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5lbmRPZihjMTApLiREOwogICAgICAgIH0sIG02LiRsb2NhbGUgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBEM1t0aGlzLiRMXTsKICAgICAgICB9LCBtNi5sb2NhbGUgPSBmdW5jdGlvbih0OSwgZTExKSB7CiAgICAgICAgICBpZiAoIXQ5KSByZXR1cm4gdGhpcy4kTDsKICAgICAgICAgIHZhciBuMTIgPSB0aGlzLmNsb25lKCksIHIxMSA9IHczKHQ5LCBlMTEsIHRydWUpOwogICAgICAgICAgcmV0dXJuIHIxMSAmJiAobjEyLiRMID0gcjExKSwgbjEyOwogICAgICAgIH0sIG02LmNsb25lID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gYjQudyh0aGlzLiRkLCB0aGlzKTsKICAgICAgICB9LCBtNi50b0RhdGUgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSh0aGlzLnZhbHVlT2YoKSk7CiAgICAgICAgfSwgbTYudG9KU09OID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyB0aGlzLnRvSVNPU3RyaW5nKCkgOiBudWxsOwogICAgICAgIH0sIG02LnRvSVNPU3RyaW5nID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy4kZC50b0lTT1N0cmluZygpOwogICAgICAgIH0sIG02LnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy4kZC50b1VUQ1N0cmluZygpOwogICAgICAgIH0sIE00OwogICAgICB9KSgpLCBrMyA9IF8zLnByb3RvdHlwZTsKICAgICAgcmV0dXJuIE8yLnByb3RvdHlwZSA9IGszLCBbWyIkbXMiLCByMTBdLCBbIiRzIiwgaTEwXSwgWyIkbSIsIHM5XSwgWyIkSCIsIHU2XSwgWyIkVyIsIGE0XSwgWyIkTSIsIGMxMF0sIFsiJHkiLCBoN10sIFsiJEQiLCBkNF1dLmZvckVhY2goKGZ1bmN0aW9uKHQ5KSB7CiAgICAgICAgazNbdDlbMV1dID0gZnVuY3Rpb24oZTExKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy4kZyhlMTEsIHQ5WzBdLCB0OVsxXSk7CiAgICAgICAgfTsKICAgICAgfSkpLCBPMi5leHRlbmQgPSBmdW5jdGlvbih0OSwgZTExKSB7CiAgICAgICAgcmV0dXJuIHQ5LiRpIHx8ICh0OShlMTEsIF8zLCBPMiksIHQ5LiRpID0gdHJ1ZSksIE8yOwogICAgICB9LCBPMi5sb2NhbGUgPSB3MywgTzIuaXNEYXlqcyA9IFMzLCBPMi51bml4ID0gZnVuY3Rpb24odDkpIHsKICAgICAgICByZXR1cm4gTzIoMWUzICogdDkpOwogICAgICB9LCBPMi5lbiA9IEQzW2czXSwgTzIuTHMgPSBEMywgTzIucCA9IHt9LCBPMjsKICAgIH0pKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RheWpzQDEuMTEuMjAvbm9kZV9tb2R1bGVzL2RheWpzL3BsdWdpbi9pc1RvZGF5LmpzCnZhciByZXF1aXJlX2lzVG9kYXkgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RheWpzQDEuMTEuMjAvbm9kZV9tb2R1bGVzL2RheWpzL3BsdWdpbi9pc1RvZGF5LmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICEoZnVuY3Rpb24oZTEwLCBvMTIpIHsKICAgICAgIm9iamVjdCIgPT0gdHlwZW9mIGV4cG9ydHMgJiYgInVuZGVmaW5lZCIgIT0gdHlwZW9mIG1vZHVsZSA/IG1vZHVsZS5leHBvcnRzID0gbzEyKCkgOiAiZnVuY3Rpb24iID09IHR5cGVvZiBkZWZpbmUgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShvMTIpIDogKGUxMCA9ICJ1bmRlZmluZWQiICE9IHR5cGVvZiBnbG9iYWxUaGlzID8gZ2xvYmFsVGhpcyA6IGUxMCB8fCBzZWxmKS5kYXlqc19wbHVnaW5faXNUb2RheSA9IG8xMigpOwogICAgfSkoZXhwb3J0cywgKGZ1bmN0aW9uKCkgewogICAgICAidXNlIHN0cmljdCI7CiAgICAgIHJldHVybiBmdW5jdGlvbihlMTAsIG8xMiwgdDgpIHsKICAgICAgICBvMTIucHJvdG90eXBlLmlzVG9kYXkgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIHZhciBlMTEgPSAiWVlZWS1NTS1ERCIsIG8xMyA9IHQ4KCk7CiAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXQoZTExKSA9PT0gbzEzLmZvcm1hdChlMTEpOwogICAgICAgIH07CiAgICAgIH07CiAgICB9KSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9zeW1ib2wtdHJlZUAzLjIuNC9ub2RlX21vZHVsZXMvc3ltYm9sLXRyZWUvbGliL1N5bWJvbFRyZWVOb2RlLmpzCnZhciByZXF1aXJlX1N5bWJvbFRyZWVOb2RlID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9zeW1ib2wtdHJlZUAzLjIuNC9ub2RlX21vZHVsZXMvc3ltYm9sLXRyZWUvbGliL1N5bWJvbFRyZWVOb2RlLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIG1vZHVsZS5leHBvcnRzID0gY2xhc3MgU3ltYm9sVHJlZU5vZGUgewogICAgICBzdGF0aWMgewogICAgICAgIF9fbmFtZSh0aGlzLCAiU3ltYm9sVHJlZU5vZGUiKTsKICAgICAgfQogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLnBhcmVudCA9IG51bGw7CiAgICAgICAgdGhpcy5wcmV2aW91c1NpYmxpbmcgPSBudWxsOwogICAgICAgIHRoaXMubmV4dFNpYmxpbmcgPSBudWxsOwogICAgICAgIHRoaXMuZmlyc3RDaGlsZCA9IG51bGw7CiAgICAgICAgdGhpcy5sYXN0Q2hpbGQgPSBudWxsOwogICAgICAgIHRoaXMuY2hpbGRyZW5WZXJzaW9uID0gMDsKICAgICAgICB0aGlzLmNoaWxkSW5kZXhDYWNoZWRVcFRvID0gbnVsbDsKICAgICAgICB0aGlzLmNhY2hlZEluZGV4ID0gLTE7CiAgICAgICAgdGhpcy5jYWNoZWRJbmRleFZlcnNpb24gPSBOYU47CiAgICAgIH0KICAgICAgZ2V0IGlzQXR0YWNoZWQoKSB7CiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5wYXJlbnQgfHwgdGhpcy5wcmV2aW91c1NpYmxpbmcgfHwgdGhpcy5uZXh0U2libGluZyk7CiAgICAgIH0KICAgICAgZ2V0IGhhc0NoaWxkcmVuKCkgewogICAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuZmlyc3RDaGlsZCk7CiAgICAgIH0KICAgICAgY2hpbGRyZW5DaGFuZ2VkKCkgewogICAgICAgIHRoaXMuY2hpbGRyZW5WZXJzaW9uID0gdGhpcy5jaGlsZHJlblZlcnNpb24gKyAxICYgNDI5NDk2NzI5NTsKICAgICAgICB0aGlzLmNoaWxkSW5kZXhDYWNoZWRVcFRvID0gbnVsbDsKICAgICAgfQogICAgICBnZXRDYWNoZWRJbmRleChwYXJlbnROb2RlKSB7CiAgICAgICAgaWYgKHRoaXMuY2FjaGVkSW5kZXhWZXJzaW9uICE9PSBwYXJlbnROb2RlLmNoaWxkcmVuVmVyc2lvbikgewogICAgICAgICAgdGhpcy5jYWNoZWRJbmRleFZlcnNpb24gPSBOYU47CiAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLmNhY2hlZEluZGV4OwogICAgICB9CiAgICAgIHNldENhY2hlZEluZGV4KHBhcmVudE5vZGUsIGluZGV4MikgewogICAgICAgIHRoaXMuY2FjaGVkSW5kZXhWZXJzaW9uID0gcGFyZW50Tm9kZS5jaGlsZHJlblZlcnNpb247CiAgICAgICAgdGhpcy5jYWNoZWRJbmRleCA9IGluZGV4MjsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3N5bWJvbC10cmVlQDMuMi40L25vZGVfbW9kdWxlcy9zeW1ib2wtdHJlZS9saWIvVHJlZVBvc2l0aW9uLmpzCnZhciByZXF1aXJlX1RyZWVQb3NpdGlvbiA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vc3ltYm9sLXRyZWVAMy4yLjQvbm9kZV9tb2R1bGVzL3N5bWJvbC10cmVlL2xpYi9UcmVlUG9zaXRpb24uanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgbW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuZnJlZXplKHsKICAgICAgLy8gc2FtZSBhcyBET00gRE9DVU1FTlRfUE9TSVRJT05fCiAgICAgIERJU0NPTk5FQ1RFRDogMSwKICAgICAgUFJFQ0VESU5HOiAyLAogICAgICBGT0xMT1dJTkc6IDQsCiAgICAgIENPTlRBSU5TOiA4LAogICAgICBDT05UQUlORURfQlk6IDE2CiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3N5bWJvbC10cmVlQDMuMi40L25vZGVfbW9kdWxlcy9zeW1ib2wtdHJlZS9saWIvVHJlZUl0ZXJhdG9yLmpzCnZhciByZXF1aXJlX1RyZWVJdGVyYXRvciA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vc3ltYm9sLXRyZWVAMy4yLjQvbm9kZV9tb2R1bGVzL3N5bWJvbC10cmVlL2xpYi9UcmVlSXRlcmF0b3IuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIFRSRUUgPSAvKiBAX19QVVJFX18gKi8gU3ltYm9sKCk7CiAgICB2YXIgUk9PVCA9IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2woKTsKICAgIHZhciBORVhUID0gLyogQF9fUFVSRV9fICovIFN5bWJvbCgpOwogICAgdmFyIElURVJBVEVfRlVOQyA9IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2woKTsKICAgIHZhciBUcmVlSXRlcmF0b3IgPSBjbGFzcyB7CiAgICAgIHN0YXRpYyB7CiAgICAgICAgX19uYW1lKHRoaXMsICJUcmVlSXRlcmF0b3IiKTsKICAgICAgfQogICAgICBjb25zdHJ1Y3Rvcih0cmVlLCByb290NiwgZmlyc3RSZXN1bHQsIGl0ZXJhdGVGdW5jdGlvbikgewogICAgICAgIHRoaXNbVFJFRV0gPSB0cmVlOwogICAgICAgIHRoaXNbUk9PVF0gPSByb290NjsKICAgICAgICB0aGlzW05FWFRdID0gZmlyc3RSZXN1bHQ7CiAgICAgICAgdGhpc1tJVEVSQVRFX0ZVTkNdID0gaXRlcmF0ZUZ1bmN0aW9uOwogICAgICB9CiAgICAgIG5leHQoKSB7CiAgICAgICAgY29uc3QgdHJlZSA9IHRoaXNbVFJFRV07CiAgICAgICAgY29uc3QgaXRlcmF0ZUZ1bmMgPSB0aGlzW0lURVJBVEVfRlVOQ107CiAgICAgICAgY29uc3Qgcm9vdDYgPSB0aGlzW1JPT1RdOwogICAgICAgIGlmICghdGhpc1tORVhUXSkgewogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgZG9uZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IHJvb3Q2CiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBjb25zdCB2YWx1ZTIgPSB0aGlzW05FWFRdOwogICAgICAgIGlmIChpdGVyYXRlRnVuYyA9PT0gMSkgewogICAgICAgICAgdGhpc1tORVhUXSA9IHRyZWUuX25vZGUodmFsdWUyKS5wcmV2aW91c1NpYmxpbmc7CiAgICAgICAgfSBlbHNlIGlmIChpdGVyYXRlRnVuYyA9PT0gMikgewogICAgICAgICAgdGhpc1tORVhUXSA9IHRyZWUuX25vZGUodmFsdWUyKS5uZXh0U2libGluZzsKICAgICAgICB9IGVsc2UgaWYgKGl0ZXJhdGVGdW5jID09PSAzKSB7CiAgICAgICAgICB0aGlzW05FWFRdID0gdHJlZS5fbm9kZSh2YWx1ZTIpLnBhcmVudDsKICAgICAgICB9IGVsc2UgaWYgKGl0ZXJhdGVGdW5jID09PSA0KSB7CiAgICAgICAgICB0aGlzW05FWFRdID0gdHJlZS5wcmVjZWRpbmcodmFsdWUyLCB7IHJvb3Q6IHJvb3Q2IH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzW05FWFRdID0gdHJlZS5mb2xsb3dpbmcodmFsdWUyLCB7IHJvb3Q6IHJvb3Q2IH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gewogICAgICAgICAgZG9uZTogZmFsc2UsCiAgICAgICAgICB2YWx1ZTogdmFsdWUyCiAgICAgICAgfTsKICAgICAgfQogICAgfTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUcmVlSXRlcmF0b3IucHJvdG90eXBlLCBTeW1ib2wuaXRlcmF0b3IsIHsKICAgICAgdmFsdWU6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0sICJ2YWx1ZSIpLAogICAgICB3cml0YWJsZTogZmFsc2UKICAgIH0pOwogICAgVHJlZUl0ZXJhdG9yLlBSRVYgPSAxOwogICAgVHJlZUl0ZXJhdG9yLk5FWFQgPSAyOwogICAgVHJlZUl0ZXJhdG9yLlBBUkVOVCA9IDM7CiAgICBUcmVlSXRlcmF0b3IuUFJFQ0VESU5HID0gNDsKICAgIFRyZWVJdGVyYXRvci5GT0xMT1dJTkcgPSA1OwogICAgT2JqZWN0LmZyZWV6ZShUcmVlSXRlcmF0b3IpOwogICAgT2JqZWN0LmZyZWV6ZShUcmVlSXRlcmF0b3IucHJvdG90eXBlKTsKICAgIG1vZHVsZS5leHBvcnRzID0gVHJlZUl0ZXJhdG9yOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vc3ltYm9sLXRyZWVAMy4yLjQvbm9kZV9tb2R1bGVzL3N5bWJvbC10cmVlL2xpYi9TeW1ib2xUcmVlLmpzCnZhciByZXF1aXJlX1N5bWJvbFRyZWUgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3N5bWJvbC10cmVlQDMuMi40L25vZGVfbW9kdWxlcy9zeW1ib2wtdHJlZS9saWIvU3ltYm9sVHJlZS5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgU3ltYm9sVHJlZU5vZGUgPSByZXF1aXJlX1N5bWJvbFRyZWVOb2RlKCk7CiAgICB2YXIgVHJlZVBvc2l0aW9uID0gcmVxdWlyZV9UcmVlUG9zaXRpb24oKTsKICAgIHZhciBUcmVlSXRlcmF0b3IgPSByZXF1aXJlX1RyZWVJdGVyYXRvcigpOwogICAgZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBfX25hbWUocmV0dXJuVHJ1ZSwgInJldHVyblRydWUiKTsKICAgIGZ1bmN0aW9uIHJldmVyc2VBcnJheUluZGV4KGFycmF5LCByZXZlcnNlSW5kZXgpIHsKICAgICAgcmV0dXJuIGFycmF5W2FycmF5Lmxlbmd0aCAtIDEgLSByZXZlcnNlSW5kZXhdOwogICAgfQogICAgX19uYW1lKHJldmVyc2VBcnJheUluZGV4LCAicmV2ZXJzZUFycmF5SW5kZXgiKTsKICAgIHZhciBTeW1ib2xUcmVlID0gY2xhc3MgewogICAgICBzdGF0aWMgewogICAgICAgIF9fbmFtZSh0aGlzLCAiU3ltYm9sVHJlZSIpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBAY29uc3RydWN0b3IKICAgICAgICogQGFsaWFzIG1vZHVsZTpzeW1ib2wtdHJlZQogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2Rlc2NyaXB0aW9uPSdTeW1ib2xUcmVlIGRhdGEnXSBEZXNjcmlwdGlvbiB1c2VkIGZvciB0aGUgU3ltYm9sCiAgICAgICAqLwogICAgICBjb25zdHJ1Y3RvcihkZXNjcmlwdGlvbikgewogICAgICAgIHRoaXMuc3ltYm9sID0gU3ltYm9sKGRlc2NyaXB0aW9uIHx8ICJTeW1ib2xUcmVlIGRhdGEiKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogWW91IGNhbiB1c2UgdGhpcyBmdW5jdGlvbiB0byAob3B0aW9uYWxseSkgaW5pdGlhbGl6ZSBhbiBvYmplY3QgcmlnaHQgYWZ0ZXIgaXRzIGNyZWF0aW9uLAogICAgICAgKiB0byB0YWtlIGFkdmFudGFnZSBvZiBWOCdzIGZhc3QgcHJvcGVydGllcy4gQWxzbyB1c2VmdWwgaWYgeW91IHdvdWxkIGxpa2UgdG8KICAgICAgICogZnJlZXplIHlvdXIgb2JqZWN0LgogICAgICAgKgogICAgICAgKiBgTygxKWAKICAgICAgICoKICAgICAgICogQG1ldGhvZAogICAgICAgKiBAYWxpYXMgbW9kdWxlOnN5bWJvbC10cmVlI2luaXRpYWxpemUKICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdAogICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IG9iamVjdAogICAgICAgKi8KICAgICAgaW5pdGlhbGl6ZShvYmplY3QpIHsKICAgICAgICB0aGlzLl9ub2RlKG9iamVjdCk7CiAgICAgICAgcmV0dXJuIG9iamVjdDsKICAgICAgfQogICAgICBfbm9kZShvYmplY3QpIHsKICAgICAgICBpZiAoIW9iamVjdCkgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG5vZGUyID0gb2JqZWN0W3RoaXMuc3ltYm9sXTsKICAgICAgICBpZiAobm9kZTIpIHsKICAgICAgICAgIHJldHVybiBub2RlMjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG9iamVjdFt0aGlzLnN5bWJvbF0gPSBuZXcgU3ltYm9sVHJlZU5vZGUoKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdCBoYXMgYW55IGNoaWxkcmVuLiBPdGhlcndpc2UgaXQgcmV0dXJucyBgZmFsc2VgLgogICAgICAgKgogICAgICAgKiAqIGBPKDEpYAogICAgICAgKgogICAgICAgKiBAbWV0aG9kIGhhc0NoaWxkcmVuCiAgICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6c3ltYm9sLXRyZWUjCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QKICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0KICAgICAgICovCiAgICAgIGhhc0NoaWxkcmVuKG9iamVjdCkgewogICAgICAgIHJldHVybiB0aGlzLl9ub2RlKG9iamVjdCkuaGFzQ2hpbGRyZW47CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIGZpcnN0IGNoaWxkIG9mIHRoZSBnaXZlbiBvYmplY3QuCiAgICAgICAqCiAgICAgICAqICogYE8oMSlgCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgZmlyc3RDaGlsZAogICAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOnN5bWJvbC10cmVlIwogICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0CiAgICAgICAqIEByZXR1cm4ge09iamVjdH0KICAgICAgICovCiAgICAgIGZpcnN0Q2hpbGQob2JqZWN0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX25vZGUob2JqZWN0KS5maXJzdENoaWxkOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSBsYXN0IGNoaWxkIG9mIHRoZSBnaXZlbiBvYmplY3QuCiAgICAgICAqCiAgICAgICAqICogYE8oMSlgCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgbGFzdENoaWxkCiAgICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6c3ltYm9sLXRyZWUjCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QKICAgICAgICogQHJldHVybiB7T2JqZWN0fQogICAgICAgKi8KICAgICAgbGFzdENoaWxkKG9iamVjdCkgewogICAgICAgIHJldHVybiB0aGlzLl9ub2RlKG9iamVjdCkubGFzdENoaWxkOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSBwcmV2aW91cyBzaWJsaW5nIG9mIHRoZSBnaXZlbiBvYmplY3QuCiAgICAgICAqCiAgICAgICAqICogYE8oMSlgCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgcHJldmlvdXNTaWJsaW5nCiAgICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6c3ltYm9sLXRyZWUjCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QKICAgICAgICogQHJldHVybiB7T2JqZWN0fQogICAgICAgKi8KICAgICAgcHJldmlvdXNTaWJsaW5nKG9iamVjdCkgewogICAgICAgIHJldHVybiB0aGlzLl9ub2RlKG9iamVjdCkucHJldmlvdXNTaWJsaW5nOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IHNpYmxpbmcgb2YgdGhlIGdpdmVuIG9iamVjdC4KICAgICAgICoKICAgICAgICogKiBgTygxKWAKICAgICAgICoKICAgICAgICogQG1ldGhvZCBuZXh0U2libGluZwogICAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOnN5bWJvbC10cmVlIwogICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0CiAgICAgICAqIEByZXR1cm4ge09iamVjdH0KICAgICAgICovCiAgICAgIG5leHRTaWJsaW5nKG9iamVjdCkgewogICAgICAgIHJldHVybiB0aGlzLl9ub2RlKG9iamVjdCkubmV4dFNpYmxpbmc7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFJldHVybiB0aGUgcGFyZW50IG9mIHRoZSBnaXZlbiBvYmplY3QuCiAgICAgICAqCiAgICAgICAqICogYE8oMSlgCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgcGFyZW50CiAgICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6c3ltYm9sLXRyZWUjCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QKICAgICAgICogQHJldHVybiB7T2JqZWN0fQogICAgICAgKi8KICAgICAgcGFyZW50KG9iamVjdCkgewogICAgICAgIHJldHVybiB0aGlzLl9ub2RlKG9iamVjdCkucGFyZW50OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBGaW5kIHRoZSBpbmNsdXNpdmUgZGVzY2VuZGFudCB0aGF0IGlzIGxhc3QgaW4gdHJlZSBvcmRlciBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgogICAgICAgKgogICAgICAgKiAqIGBPKG4pYCAod29yc3QgY2FzZSkgd2hlcmUgYG5gIGlzIHRoZSBkZXB0aCBvZiB0aGUgc3VidHJlZSBvZiBgb2JqZWN0YAogICAgICAgKgogICAgICAgKiBAbWV0aG9kIGxhc3RJbmNsdXNpdmVEZXNjZW5kYW50CiAgICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6c3ltYm9sLXRyZWUjCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QKICAgICAgICogQHJldHVybiB7T2JqZWN0fQogICAgICAgKi8KICAgICAgbGFzdEluY2x1c2l2ZURlc2NlbmRhbnQob2JqZWN0KSB7CiAgICAgICAgbGV0IGxhc3RDaGlsZDsKICAgICAgICBsZXQgY3VycmVudCA9IG9iamVjdDsKICAgICAgICB3aGlsZSAobGFzdENoaWxkID0gdGhpcy5fbm9kZShjdXJyZW50KS5sYXN0Q2hpbGQpIHsKICAgICAgICAgIGN1cnJlbnQgPSBsYXN0Q2hpbGQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjdXJyZW50OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBGaW5kIHRoZSBwcmVjZWRpbmcgb2JqZWN0IChBKSBvZiB0aGUgZ2l2ZW4gb2JqZWN0IChCKS4KICAgICAgICogQW4gb2JqZWN0IEEgaXMgcHJlY2VkaW5nIGFuIG9iamVjdCBCIGlmIEEgYW5kIEIgYXJlIGluIHRoZSBzYW1lIHRyZWUKICAgICAgICogYW5kIEEgY29tZXMgYmVmb3JlIEIgaW4gdHJlZSBvcmRlci4KICAgICAgICoKICAgICAgICogKiBgTyhuKWAgKHdvcnN0IGNhc2UpCiAgICAgICAqICogYE8oMSlgIChhbW9ydGl6ZWQgd2hlbiB3YWxraW5nIHRoZSBlbnRpcmUgdHJlZSkKICAgICAgICoKICAgICAgICogQG1ldGhvZCBwcmVjZWRpbmcKICAgICAgICogQG1lbWJlck9mIG1vZHVsZTpzeW1ib2wtdHJlZSMKICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdAogICAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5yb290XSBJZiBzZXQsIGByb290YCBtdXN0IGJlIGFuIGluY2x1c2l2ZSBhbmNlc3RvcgogICAgICAgKiAgICAgICAgb2YgdGhlIHJldHVybiB2YWx1ZSAob3IgZWxzZSBudWxsIGlzIHJldHVybmVkKS4gVGhpcyBjaGVjayBfYXNzdW1lc18KICAgICAgICogICAgICAgIHRoYXQgYHJvb3RgIGlzIGFsc28gYW4gaW5jbHVzaXZlIGFuY2VzdG9yIG9mIHRoZSBnaXZlbiBgb2JqZWN0YAogICAgICAgKiBAcmV0dXJuIHs/T2JqZWN0fQogICAgICAgKi8KICAgICAgcHJlY2VkaW5nKG9iamVjdCwgb3B0aW9ucykgewogICAgICAgIGNvbnN0IHRyZWVSb290ID0gb3B0aW9ucyAmJiBvcHRpb25zLnJvb3Q7CiAgICAgICAgaWYgKG9iamVjdCA9PT0gdHJlZVJvb3QpIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBjb25zdCBwcmV2aW91c1NpYmxpbmcgPSB0aGlzLl9ub2RlKG9iamVjdCkucHJldmlvdXNTaWJsaW5nOwogICAgICAgIGlmIChwcmV2aW91c1NpYmxpbmcpIHsKICAgICAgICAgIHJldHVybiB0aGlzLmxhc3RJbmNsdXNpdmVEZXNjZW5kYW50KHByZXZpb3VzU2libGluZyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9ub2RlKG9iamVjdCkucGFyZW50OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBGaW5kIHRoZSBmb2xsb3dpbmcgb2JqZWN0IChBKSBvZiB0aGUgZ2l2ZW4gb2JqZWN0IChCKS4KICAgICAgICogQW4gb2JqZWN0IEEgaXMgZm9sbG93aW5nIGFuIG9iamVjdCBCIGlmIEEgYW5kIEIgYXJlIGluIHRoZSBzYW1lIHRyZWUKICAgICAgICogYW5kIEEgY29tZXMgYWZ0ZXIgQiBpbiB0cmVlIG9yZGVyLgogICAgICAgKgogICAgICAgKiAqIGBPKG4pYCAod29yc3QgY2FzZSkgd2hlcmUgYG5gIGlzIHRoZSBhbW91bnQgb2Ygb2JqZWN0cyBpbiB0aGUgZW50aXJlIHRyZWUKICAgICAgICogKiBgTygxKWAgKGFtb3J0aXplZCB3aGVuIHdhbGtpbmcgdGhlIGVudGlyZSB0cmVlKQogICAgICAgKgogICAgICAgKiBAbWV0aG9kIGZvbGxvd2luZwogICAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOnN5bWJvbC10cmVlIwogICAgICAgKiBAcGFyYW0geyFPYmplY3R9IG9iamVjdAogICAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5yb290XSBJZiBzZXQsIGByb290YCBtdXN0IGJlIGFuIGluY2x1c2l2ZSBhbmNlc3RvcgogICAgICAgKiAgICAgICAgb2YgdGhlIHJldHVybiB2YWx1ZSAob3IgZWxzZSBudWxsIGlzIHJldHVybmVkKS4gVGhpcyBjaGVjayBfYXNzdW1lc18KICAgICAgICogICAgICAgIHRoYXQgYHJvb3RgIGlzIGFsc28gYW4gaW5jbHVzaXZlIGFuY2VzdG9yIG9mIHRoZSBnaXZlbiBgb2JqZWN0YAogICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNraXBDaGlsZHJlbj1mYWxzZV0gSWYgc2V0LCBpZ25vcmUgdGhlIGNoaWxkcmVuIG9mIGBvYmplY3RgCiAgICAgICAqIEByZXR1cm4gez9PYmplY3R9CiAgICAgICAqLwogICAgICBmb2xsb3dpbmcob2JqZWN0LCBvcHRpb25zKSB7CiAgICAgICAgY29uc3QgdHJlZVJvb3QgPSBvcHRpb25zICYmIG9wdGlvbnMucm9vdDsKICAgICAgICBjb25zdCBza2lwQ2hpbGRyZW4gPSBvcHRpb25zICYmIG9wdGlvbnMuc2tpcENoaWxkcmVuOwogICAgICAgIGNvbnN0IGZpcnN0Q2hpbGQgPSAhc2tpcENoaWxkcmVuICYmIHRoaXMuX25vZGUob2JqZWN0KS5maXJzdENoaWxkOwogICAgICAgIGlmIChmaXJzdENoaWxkKSB7CiAgICAgICAgICByZXR1cm4gZmlyc3RDaGlsZDsKICAgICAgICB9CiAgICAgICAgbGV0IGN1cnJlbnQgPSBvYmplY3Q7CiAgICAgICAgZG8gewogICAgICAgICAgaWYgKGN1cnJlbnQgPT09IHRyZWVSb290KSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgbmV4dFNpYmxpbmcgPSB0aGlzLl9ub2RlKGN1cnJlbnQpLm5leHRTaWJsaW5nOwogICAgICAgICAgaWYgKG5leHRTaWJsaW5nKSB7CiAgICAgICAgICAgIHJldHVybiBuZXh0U2libGluZzsKICAgICAgICAgIH0KICAgICAgICAgIGN1cnJlbnQgPSB0aGlzLl9ub2RlKGN1cnJlbnQpLnBhcmVudDsKICAgICAgICB9IHdoaWxlIChjdXJyZW50KTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICAvKioKICAgICAgICogQXBwZW5kIGFsbCBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gb2JqZWN0IHRvIGFuIGFycmF5LgogICAgICAgKgogICAgICAgKiAqIGBPKG4pYCB3aGVyZSBgbmAgaXMgdGhlIGFtb3VudCBvZiBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gYHBhcmVudGAKICAgICAgICoKICAgICAgICogQG1ldGhvZCBjaGlsZHJlblRvQXJyYXkKICAgICAgICogQG1lbWJlck9mIG1vZHVsZTpzeW1ib2wtdHJlZSMKICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmVudAogICAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0W119IFtvcHRpb25zLmFycmF5PVtdXQogICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5maWx0ZXJdIEZ1bmN0aW9uIHRvIHRlc3QgZWFjaCBvYmplY3QgYmVmb3JlIGl0IGlzIGFkZGVkIHRvIHRoZSBhcnJheS4KICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52b2tlZCB3aXRoIGFyZ3VtZW50cyAob2JqZWN0KS4gU2hvdWxkIHJldHVybiBgdHJ1ZWAgaWYgYW4gb2JqZWN0CiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHRvIGJlIGluY2x1ZGVkLgogICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zLnRoaXNBcmddIFZhbHVlIHRvIHVzZSBhcyBgdGhpc2Agd2hlbiBleGVjdXRpbmcgYGZpbHRlcmAuCiAgICAgICAqIEByZXR1cm4ge09iamVjdFtdfQogICAgICAgKi8KICAgICAgY2hpbGRyZW5Ub0FycmF5KHBhcmVudCwgb3B0aW9ucykgewogICAgICAgIGNvbnN0IGFycmF5ID0gb3B0aW9ucyAmJiBvcHRpb25zLmFycmF5IHx8IFtdOwogICAgICAgIGNvbnN0IGZpbHRlcjIgPSBvcHRpb25zICYmIG9wdGlvbnMuZmlsdGVyIHx8IHJldHVyblRydWU7CiAgICAgICAgY29uc3QgdGhpc0FyZyA9IG9wdGlvbnMgJiYgb3B0aW9ucy50aGlzQXJnIHx8IHZvaWQgMDsKICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gdGhpcy5fbm9kZShwYXJlbnQpOwogICAgICAgIGxldCBvYmplY3QgPSBwYXJlbnROb2RlLmZpcnN0Q2hpbGQ7CiAgICAgICAgbGV0IGluZGV4MiA9IDA7CiAgICAgICAgd2hpbGUgKG9iamVjdCkgewogICAgICAgICAgY29uc3Qgbm9kZTIgPSB0aGlzLl9ub2RlKG9iamVjdCk7CiAgICAgICAgICBub2RlMi5zZXRDYWNoZWRJbmRleChwYXJlbnROb2RlLCBpbmRleDIpOwogICAgICAgICAgaWYgKGZpbHRlcjIuY2FsbCh0aGlzQXJnLCBvYmplY3QpKSB7CiAgICAgICAgICAgIGFycmF5LnB1c2gob2JqZWN0KTsKICAgICAgICAgIH0KICAgICAgICAgIG9iamVjdCA9IG5vZGUyLm5leHRTaWJsaW5nOwogICAgICAgICAgKytpbmRleDI7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhcnJheTsKICAgICAgfQogICAgICAvKioKICAgICAgICogQXBwZW5kIGFsbCBpbmNsdXNpdmUgYW5jZXN0b3JzIG9mIHRoZSBnaXZlbiBvYmplY3QgdG8gYW4gYXJyYXkuCiAgICAgICAqCiAgICAgICAqICogYE8obilgIHdoZXJlIGBuYCBpcyB0aGUgYW1vdW50IG9mIGFuY2VzdG9ycyBvZiB0aGUgZ2l2ZW4gYG9iamVjdGAKICAgICAgICoKICAgICAgICogQG1ldGhvZCBhbmNlc3RvcnNUb0FycmF5CiAgICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6c3ltYm9sLXRyZWUjCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QKICAgICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXQogICAgICAgKiBAcGFyYW0ge09iamVjdFtdfSBbb3B0aW9ucy5hcnJheT1bXV0KICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuZmlsdGVyXSBGdW5jdGlvbiB0byB0ZXN0IGVhY2ggb2JqZWN0IGJlZm9yZSBpdCBpcyBhZGRlZCB0byB0aGUgYXJyYXkuCiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludm9rZWQgd2l0aCBhcmd1bWVudHMgKG9iamVjdCkuIFNob3VsZCByZXR1cm4gYHRydWVgIGlmIGFuIG9iamVjdAogICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB0byBiZSBpbmNsdWRlZC4KICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9ucy50aGlzQXJnXSBWYWx1ZSB0byB1c2UgYXMgYHRoaXNgIHdoZW4gZXhlY3V0aW5nIGBmaWx0ZXJgLgogICAgICAgKiBAcmV0dXJuIHtPYmplY3RbXX0KICAgICAgICovCiAgICAgIGFuY2VzdG9yc1RvQXJyYXkob2JqZWN0LCBvcHRpb25zKSB7CiAgICAgICAgY29uc3QgYXJyYXkgPSBvcHRpb25zICYmIG9wdGlvbnMuYXJyYXkgfHwgW107CiAgICAgICAgY29uc3QgZmlsdGVyMiA9IG9wdGlvbnMgJiYgb3B0aW9ucy5maWx0ZXIgfHwgcmV0dXJuVHJ1ZTsKICAgICAgICBjb25zdCB0aGlzQXJnID0gb3B0aW9ucyAmJiBvcHRpb25zLnRoaXNBcmcgfHwgdm9pZCAwOwogICAgICAgIGxldCBhbmNlc3RvciA9IG9iamVjdDsKICAgICAgICB3aGlsZSAoYW5jZXN0b3IpIHsKICAgICAgICAgIGlmIChmaWx0ZXIyLmNhbGwodGhpc0FyZywgYW5jZXN0b3IpKSB7CiAgICAgICAgICAgIGFycmF5LnB1c2goYW5jZXN0b3IpOwogICAgICAgICAgfQogICAgICAgICAgYW5jZXN0b3IgPSB0aGlzLl9ub2RlKGFuY2VzdG9yKS5wYXJlbnQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhcnJheTsKICAgICAgfQogICAgICAvKioKICAgICAgICogQXBwZW5kIGFsbCBkZXNjZW5kYW50cyBvZiB0aGUgZ2l2ZW4gb2JqZWN0IHRvIGFuIGFycmF5IChpbiB0cmVlIG9yZGVyKS4KICAgICAgICoKICAgICAgICogKiBgTyhuKWAgd2hlcmUgYG5gIGlzIHRoZSBhbW91bnQgb2Ygb2JqZWN0cyBpbiB0aGUgc3ViLXRyZWUgb2YgdGhlIGdpdmVuIGBvYmplY3RgCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgdHJlZVRvQXJyYXkKICAgICAgICogQG1lbWJlck9mIG1vZHVsZTpzeW1ib2wtdHJlZSMKICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJvb3QKICAgICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXQogICAgICAgKiBAcGFyYW0ge09iamVjdFtdfSBbb3B0aW9ucy5hcnJheT1bXV0KICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuZmlsdGVyXSBGdW5jdGlvbiB0byB0ZXN0IGVhY2ggb2JqZWN0IGJlZm9yZSBpdCBpcyBhZGRlZCB0byB0aGUgYXJyYXkuCiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludm9rZWQgd2l0aCBhcmd1bWVudHMgKG9iamVjdCkuIFNob3VsZCByZXR1cm4gYHRydWVgIGlmIGFuIG9iamVjdAogICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB0byBiZSBpbmNsdWRlZC4KICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9ucy50aGlzQXJnXSBWYWx1ZSB0byB1c2UgYXMgYHRoaXNgIHdoZW4gZXhlY3V0aW5nIGBmaWx0ZXJgLgogICAgICAgKiBAcmV0dXJuIHtPYmplY3RbXX0KICAgICAgICovCiAgICAgIHRyZWVUb0FycmF5KHJvb3Q2LCBvcHRpb25zKSB7CiAgICAgICAgY29uc3QgYXJyYXkgPSBvcHRpb25zICYmIG9wdGlvbnMuYXJyYXkgfHwgW107CiAgICAgICAgY29uc3QgZmlsdGVyMiA9IG9wdGlvbnMgJiYgb3B0aW9ucy5maWx0ZXIgfHwgcmV0dXJuVHJ1ZTsKICAgICAgICBjb25zdCB0aGlzQXJnID0gb3B0aW9ucyAmJiBvcHRpb25zLnRoaXNBcmcgfHwgdm9pZCAwOwogICAgICAgIGxldCBvYmplY3QgPSByb290NjsKICAgICAgICB3aGlsZSAob2JqZWN0KSB7CiAgICAgICAgICBpZiAoZmlsdGVyMi5jYWxsKHRoaXNBcmcsIG9iamVjdCkpIHsKICAgICAgICAgICAgYXJyYXkucHVzaChvYmplY3QpOwogICAgICAgICAgfQogICAgICAgICAgb2JqZWN0ID0gdGhpcy5mb2xsb3dpbmcob2JqZWN0LCB7IHJvb3Q6IHJvb3Q2IH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEl0ZXJhdGUgb3ZlciBhbGwgY2hpbGRyZW4gb2YgdGhlIGdpdmVuIG9iamVjdAogICAgICAgKgogICAgICAgKiAqIGBPKDEpYCBmb3IgYSBzaW5nbGUgaXRlcmF0aW9uCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgY2hpbGRyZW5JdGVyYXRvcgogICAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOnN5bWJvbC10cmVlIwogICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyZW50CiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10KICAgICAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5yZXZlcnNlPWZhbHNlXQogICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEFuIGl0ZXJhYmxlIGl0ZXJhdG9yIChFUzYpCiAgICAgICAqLwogICAgICBjaGlsZHJlbkl0ZXJhdG9yKHBhcmVudCwgb3B0aW9ucykgewogICAgICAgIGNvbnN0IHJldmVyc2UgPSBvcHRpb25zICYmIG9wdGlvbnMucmV2ZXJzZTsKICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gdGhpcy5fbm9kZShwYXJlbnQpOwogICAgICAgIHJldHVybiBuZXcgVHJlZUl0ZXJhdG9yKAogICAgICAgICAgdGhpcywKICAgICAgICAgIHBhcmVudCwKICAgICAgICAgIHJldmVyc2UgPyBwYXJlbnROb2RlLmxhc3RDaGlsZCA6IHBhcmVudE5vZGUuZmlyc3RDaGlsZCwKICAgICAgICAgIHJldmVyc2UgPyBUcmVlSXRlcmF0b3IuUFJFViA6IFRyZWVJdGVyYXRvci5ORVhUCiAgICAgICAgKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogSXRlcmF0ZSBvdmVyIGFsbCB0aGUgcHJldmlvdXMgc2libGluZ3Mgb2YgdGhlIGdpdmVuIG9iamVjdC4gKGluIHJldmVyc2UgdHJlZSBvcmRlcikKICAgICAgICoKICAgICAgICogKiBgTygxKWAgZm9yIGEgc2luZ2xlIGl0ZXJhdGlvbgogICAgICAgKgogICAgICAgKiBAbWV0aG9kIHByZXZpb3VzU2libGluZ3NJdGVyYXRvcgogICAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOnN5bWJvbC10cmVlIwogICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0CiAgICAgICAqIEByZXR1cm4ge09iamVjdH0gQW4gaXRlcmFibGUgaXRlcmF0b3IgKEVTNikKICAgICAgICovCiAgICAgIHByZXZpb3VzU2libGluZ3NJdGVyYXRvcihvYmplY3QpIHsKICAgICAgICByZXR1cm4gbmV3IFRyZWVJdGVyYXRvcigKICAgICAgICAgIHRoaXMsCiAgICAgICAgICBvYmplY3QsCiAgICAgICAgICB0aGlzLl9ub2RlKG9iamVjdCkucHJldmlvdXNTaWJsaW5nLAogICAgICAgICAgVHJlZUl0ZXJhdG9yLlBSRVYKICAgICAgICApOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBJdGVyYXRlIG92ZXIgYWxsIHRoZSBuZXh0IHNpYmxpbmdzIG9mIHRoZSBnaXZlbiBvYmplY3QuIChpbiB0cmVlIG9yZGVyKQogICAgICAgKgogICAgICAgKiAqIGBPKDEpYCBmb3IgYSBzaW5nbGUgaXRlcmF0aW9uCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgbmV4dFNpYmxpbmdzSXRlcmF0b3IKICAgICAgICogQG1lbWJlck9mIG1vZHVsZTpzeW1ib2wtdHJlZSMKICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdAogICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEFuIGl0ZXJhYmxlIGl0ZXJhdG9yIChFUzYpCiAgICAgICAqLwogICAgICBuZXh0U2libGluZ3NJdGVyYXRvcihvYmplY3QpIHsKICAgICAgICByZXR1cm4gbmV3IFRyZWVJdGVyYXRvcigKICAgICAgICAgIHRoaXMsCiAgICAgICAgICBvYmplY3QsCiAgICAgICAgICB0aGlzLl9ub2RlKG9iamVjdCkubmV4dFNpYmxpbmcsCiAgICAgICAgICBUcmVlSXRlcmF0b3IuTkVYVAogICAgICAgICk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEl0ZXJhdGUgb3ZlciBhbGwgaW5jbHVzaXZlIGFuY2VzdG9ycyBvZiB0aGUgZ2l2ZW4gb2JqZWN0CiAgICAgICAqCiAgICAgICAqICogYE8oMSlgIGZvciBhIHNpbmdsZSBpdGVyYXRpb24KICAgICAgICoKICAgICAgICogQG1ldGhvZCBhbmNlc3RvcnNJdGVyYXRvcgogICAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOnN5bWJvbC10cmVlIwogICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0CiAgICAgICAqIEByZXR1cm4ge09iamVjdH0gQW4gaXRlcmFibGUgaXRlcmF0b3IgKEVTNikKICAgICAgICovCiAgICAgIGFuY2VzdG9yc0l0ZXJhdG9yKG9iamVjdCkgewogICAgICAgIHJldHVybiBuZXcgVHJlZUl0ZXJhdG9yKAogICAgICAgICAgdGhpcywKICAgICAgICAgIG9iamVjdCwKICAgICAgICAgIG9iamVjdCwKICAgICAgICAgIFRyZWVJdGVyYXRvci5QQVJFTlQKICAgICAgICApOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBJdGVyYXRlIG92ZXIgYWxsIGRlc2NlbmRhbnRzIG9mIHRoZSBnaXZlbiBvYmplY3QgKGluIHRyZWUgb3JkZXIpLgogICAgICAgKgogICAgICAgKiBXaGVyZSBgbmAgaXMgdGhlIGFtb3VudCBvZiBvYmplY3RzIGluIHRoZSBzdWItdHJlZSBvZiB0aGUgZ2l2ZW4gYHJvb3RgOgogICAgICAgKgogICAgICAgKiAqIGBPKG4pYCAod29yc3QgY2FzZSBmb3IgYSBzaW5nbGUgaXRlcmF0aW9uKQogICAgICAgKiAqIGBPKG4pYCAoYW1vcnRpemVkLCB3aGVuIGNvbXBsZXRpbmcgdGhlIGl0ZXJhdG9yKQogICAgICAgKgogICAgICAgKiBAbWV0aG9kIHRyZWVJdGVyYXRvcgogICAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOnN5bWJvbC10cmVlIwogICAgICAgKiBAcGFyYW0ge09iamVjdH0gcm9vdAogICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucwogICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnJldmVyc2U9ZmFsc2VdCiAgICAgICAqIEByZXR1cm4ge09iamVjdH0gQW4gaXRlcmFibGUgaXRlcmF0b3IgKEVTNikKICAgICAgICovCiAgICAgIHRyZWVJdGVyYXRvcihyb290Niwgb3B0aW9ucykgewogICAgICAgIGNvbnN0IHJldmVyc2UgPSBvcHRpb25zICYmIG9wdGlvbnMucmV2ZXJzZTsKICAgICAgICByZXR1cm4gbmV3IFRyZWVJdGVyYXRvcigKICAgICAgICAgIHRoaXMsCiAgICAgICAgICByb290NiwKICAgICAgICAgIHJldmVyc2UgPyB0aGlzLmxhc3RJbmNsdXNpdmVEZXNjZW5kYW50KHJvb3Q2KSA6IHJvb3Q2LAogICAgICAgICAgcmV2ZXJzZSA/IFRyZWVJdGVyYXRvci5QUkVDRURJTkcgOiBUcmVlSXRlcmF0b3IuRk9MTE9XSU5HCiAgICAgICAgKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogRmluZCB0aGUgaW5kZXggb2YgdGhlIGdpdmVuIG9iamVjdCAodGhlIG51bWJlciBvZiBwcmVjZWRpbmcgc2libGluZ3MpLgogICAgICAgKgogICAgICAgKiAqIGBPKG4pYCB3aGVyZSBgbmAgaXMgdGhlIGFtb3VudCBvZiBwcmVjZWRpbmcgc2libGluZ3MKICAgICAgICogKiBgTygxKWAgKGFtb3J0aXplZCwgaWYgdGhlIHRyZWUgaXMgbm90IG1vZGlmaWVkKQogICAgICAgKgogICAgICAgKiBAbWV0aG9kIGluZGV4CiAgICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6c3ltYm9sLXRyZWUjCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjaGlsZAogICAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IFRoZSBudW1iZXIgb2YgcHJlY2VkaW5nIHNpYmxpbmdzLCBvciAtMSBpZiB0aGUgb2JqZWN0IGhhcyBubyBwYXJlbnQKICAgICAgICovCiAgICAgIGluZGV4KGNoaWxkKSB7CiAgICAgICAgY29uc3QgY2hpbGROb2RlID0gdGhpcy5fbm9kZShjaGlsZCk7CiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuX25vZGUoY2hpbGROb2RlLnBhcmVudCk7CiAgICAgICAgaWYgKCFwYXJlbnROb2RlKSB7CiAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgICAgIGxldCBjdXJyZW50SW5kZXggPSBjaGlsZE5vZGUuZ2V0Q2FjaGVkSW5kZXgocGFyZW50Tm9kZSk7CiAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA+PSAwKSB7CiAgICAgICAgICByZXR1cm4gY3VycmVudEluZGV4OwogICAgICAgIH0KICAgICAgICBjdXJyZW50SW5kZXggPSAwOwogICAgICAgIGxldCBvYmplY3QgPSBwYXJlbnROb2RlLmZpcnN0Q2hpbGQ7CiAgICAgICAgaWYgKHBhcmVudE5vZGUuY2hpbGRJbmRleENhY2hlZFVwVG8pIHsKICAgICAgICAgIGNvbnN0IGNhY2hlZFVwVG9Ob2RlID0gdGhpcy5fbm9kZShwYXJlbnROb2RlLmNoaWxkSW5kZXhDYWNoZWRVcFRvKTsKICAgICAgICAgIG9iamVjdCA9IGNhY2hlZFVwVG9Ob2RlLm5leHRTaWJsaW5nOwogICAgICAgICAgY3VycmVudEluZGV4ID0gY2FjaGVkVXBUb05vZGUuZ2V0Q2FjaGVkSW5kZXgocGFyZW50Tm9kZSkgKyAxOwogICAgICAgIH0KICAgICAgICB3aGlsZSAob2JqZWN0KSB7CiAgICAgICAgICBjb25zdCBub2RlMiA9IHRoaXMuX25vZGUob2JqZWN0KTsKICAgICAgICAgIG5vZGUyLnNldENhY2hlZEluZGV4KHBhcmVudE5vZGUsIGN1cnJlbnRJbmRleCk7CiAgICAgICAgICBpZiAob2JqZWN0ID09PSBjaGlsZCkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgICsrY3VycmVudEluZGV4OwogICAgICAgICAgb2JqZWN0ID0gbm9kZTIubmV4dFNpYmxpbmc7CiAgICAgICAgfQogICAgICAgIHBhcmVudE5vZGUuY2hpbGRJbmRleENhY2hlZFVwVG8gPSBjaGlsZDsKICAgICAgICByZXR1cm4gY3VycmVudEluZGV4OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBjaGlsZHJlbi4KICAgICAgICoKICAgICAgICogKiBgTyhuKWAgd2hlcmUgYG5gIGlzIHRoZSBhbW91bnQgb2YgY2hpbGRyZW4KICAgICAgICogKiBgTygxKWAgKGFtb3J0aXplZCwgaWYgdGhlIHRyZWUgaXMgbm90IG1vZGlmaWVkKQogICAgICAgKgogICAgICAgKiBAbWV0aG9kIGNoaWxkcmVuQ291bnQKICAgICAgICogQG1lbWJlck9mIG1vZHVsZTpzeW1ib2wtdHJlZSMKICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmVudAogICAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9CiAgICAgICAqLwogICAgICBjaGlsZHJlbkNvdW50KHBhcmVudCkgewogICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLl9ub2RlKHBhcmVudCk7CiAgICAgICAgaWYgKCFwYXJlbnROb2RlLmxhc3RDaGlsZCkgewogICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLmluZGV4KHBhcmVudE5vZGUubGFzdENoaWxkKSArIDE7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIENvbXBhcmUgdGhlIHBvc2l0aW9uIG9mIGFuIG9iamVjdCByZWxhdGl2ZSB0byBhbm90aGVyIG9iamVjdC4gQSBiaXQgc2V0IGlzIHJldHVybmVkOgogICAgICAgKgogICAgICAgKiA8dWw+CiAgICAgICAqICAgICA8bGk+RElTQ09OTkVDVEVEIDogMTwvbGk+CiAgICAgICAqICAgICA8bGk+UFJFQ0VESU5HIDogMjwvbGk+CiAgICAgICAqICAgICA8bGk+Rk9MTE9XSU5HIDogNDwvbGk+CiAgICAgICAqICAgICA8bGk+Q09OVEFJTlMgOiA4PC9saT4KICAgICAgICogICAgIDxsaT5DT05UQUlORURfQlkgOiAxNjwvbGk+CiAgICAgICAqIDwvdWw+CiAgICAgICAqCiAgICAgICAqIFRoZSBzZW1hbnRpY3MgYXJlIHRoZSBzYW1lIGFzIGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIGluIERPTSwgd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQKICAgICAgICogRElTQ09OTkVDVEVEIG5ldmVyIG9jY3VycyB3aXRoIGFueSBvdGhlciBiaXQuCiAgICAgICAqCiAgICAgICAqIHdoZXJlIGBuYCBhbmQgYG1gIGFyZSB0aGUgYW1vdW50IG9mIGFuY2VzdG9ycyBvZiBgbGVmdGAgYW5kIGByaWdodGA7CiAgICAgICAqIHdoZXJlIGBvYCBpcyB0aGUgYW1vdW50IG9mIGNoaWxkcmVuIG9mIHRoZSBsb3dlc3QgY29tbW9uIGFuY2VzdG9yIG9mIGBsZWZ0YCBhbmQgYHJpZ2h0YDoKICAgICAgICoKICAgICAgICogKiBgTyhuICsgbSArIG8pYCAod29yc3QgY2FzZSkKICAgICAgICogKiBgTyhuICsgbSlgIChhbW9ydGl6ZWQsIGlmIHRoZSB0cmVlIGlzIG5vdCBtb2RpZmllZCkKICAgICAgICoKICAgICAgICogQG1ldGhvZCBjb21wYXJlVHJlZVBvc2l0aW9uCiAgICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6c3ltYm9sLXRyZWUjCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBsZWZ0CiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByaWdodAogICAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9CiAgICAgICAqLwogICAgICBjb21wYXJlVHJlZVBvc2l0aW9uKGxlZnQsIHJpZ2h0KSB7CiAgICAgICAgaWYgKGxlZnQgPT09IHJpZ2h0KSB7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgY29uc3QgbGVmdEFuY2VzdG9ycyA9IFtdOwogICAgICAgIHsKICAgICAgICAgIGxldCBsZWZ0QW5jZXN0b3IgPSBsZWZ0OwogICAgICAgICAgd2hpbGUgKGxlZnRBbmNlc3RvcikgewogICAgICAgICAgICBpZiAobGVmdEFuY2VzdG9yID09PSByaWdodCkgewogICAgICAgICAgICAgIHJldHVybiBUcmVlUG9zaXRpb24uQ09OVEFJTlMgfCBUcmVlUG9zaXRpb24uUFJFQ0VESU5HOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxlZnRBbmNlc3RvcnMucHVzaChsZWZ0QW5jZXN0b3IpOwogICAgICAgICAgICBsZWZ0QW5jZXN0b3IgPSB0aGlzLnBhcmVudChsZWZ0QW5jZXN0b3IpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCByaWdodEFuY2VzdG9ycyA9IFtdOwogICAgICAgIHsKICAgICAgICAgIGxldCByaWdodEFuY2VzdG9yID0gcmlnaHQ7CiAgICAgICAgICB3aGlsZSAocmlnaHRBbmNlc3RvcikgewogICAgICAgICAgICBpZiAocmlnaHRBbmNlc3RvciA9PT0gbGVmdCkgewogICAgICAgICAgICAgIHJldHVybiBUcmVlUG9zaXRpb24uQ09OVEFJTkVEX0JZIHwgVHJlZVBvc2l0aW9uLkZPTExPV0lORzsKICAgICAgICAgICAgfQogICAgICAgICAgICByaWdodEFuY2VzdG9ycy5wdXNoKHJpZ2h0QW5jZXN0b3IpOwogICAgICAgICAgICByaWdodEFuY2VzdG9yID0gdGhpcy5wYXJlbnQocmlnaHRBbmNlc3Rvcik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJvb3Q2ID0gcmV2ZXJzZUFycmF5SW5kZXgobGVmdEFuY2VzdG9ycywgMCk7CiAgICAgICAgaWYgKCFyb290NiB8fCByb290NiAhPT0gcmV2ZXJzZUFycmF5SW5kZXgocmlnaHRBbmNlc3RvcnMsIDApKSB7CiAgICAgICAgICByZXR1cm4gVHJlZVBvc2l0aW9uLkRJU0NPTk5FQ1RFRDsKICAgICAgICB9CiAgICAgICAgbGV0IGNvbW1vbkFuY2VzdG9ySW5kZXggPSAwOwogICAgICAgIGNvbnN0IGFuY2VzdG9yc01pbkxlbmd0aCA9IE1hdGgubWluKGxlZnRBbmNlc3RvcnMubGVuZ3RoLCByaWdodEFuY2VzdG9ycy5sZW5ndGgpOwogICAgICAgIGZvciAobGV0IGkxMCA9IDA7IGkxMCA8IGFuY2VzdG9yc01pbkxlbmd0aDsgKytpMTApIHsKICAgICAgICAgIGNvbnN0IGxlZnRBbmNlc3RvciA9IHJldmVyc2VBcnJheUluZGV4KGxlZnRBbmNlc3RvcnMsIGkxMCk7CiAgICAgICAgICBjb25zdCByaWdodEFuY2VzdG9yID0gcmV2ZXJzZUFycmF5SW5kZXgocmlnaHRBbmNlc3RvcnMsIGkxMCk7CiAgICAgICAgICBpZiAobGVmdEFuY2VzdG9yICE9PSByaWdodEFuY2VzdG9yKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY29tbW9uQW5jZXN0b3JJbmRleCA9IGkxMDsKICAgICAgICB9CiAgICAgICAgY29uc3QgbGVmdEluZGV4ID0gdGhpcy5pbmRleChyZXZlcnNlQXJyYXlJbmRleChsZWZ0QW5jZXN0b3JzLCBjb21tb25BbmNlc3RvckluZGV4ICsgMSkpOwogICAgICAgIGNvbnN0IHJpZ2h0SW5kZXggPSB0aGlzLmluZGV4KHJldmVyc2VBcnJheUluZGV4KHJpZ2h0QW5jZXN0b3JzLCBjb21tb25BbmNlc3RvckluZGV4ICsgMSkpOwogICAgICAgIHJldHVybiByaWdodEluZGV4IDwgbGVmdEluZGV4ID8gVHJlZVBvc2l0aW9uLlBSRUNFRElORyA6IFRyZWVQb3NpdGlvbi5GT0xMT1dJTkc7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFJlbW92ZSB0aGUgb2JqZWN0IGZyb20gdGhpcyB0cmVlLgogICAgICAgKiBIYXMgbm8gZWZmZWN0IGlmIGFscmVhZHkgcmVtb3ZlZC4KICAgICAgICoKICAgICAgICogKiBgTygxKWAKICAgICAgICoKICAgICAgICogQG1ldGhvZCByZW1vdmUKICAgICAgICogQG1lbWJlck9mIG1vZHVsZTpzeW1ib2wtdHJlZSMKICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlbW92ZU9iamVjdAogICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHJlbW92ZU9iamVjdAogICAgICAgKi8KICAgICAgcmVtb3ZlKHJlbW92ZU9iamVjdCkgewogICAgICAgIGNvbnN0IHJlbW92ZU5vZGUgPSB0aGlzLl9ub2RlKHJlbW92ZU9iamVjdCk7CiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuX25vZGUocmVtb3ZlTm9kZS5wYXJlbnQpOwogICAgICAgIGNvbnN0IHByZXZOb2RlID0gdGhpcy5fbm9kZShyZW1vdmVOb2RlLnByZXZpb3VzU2libGluZyk7CiAgICAgICAgY29uc3QgbmV4dE5vZGUgPSB0aGlzLl9ub2RlKHJlbW92ZU5vZGUubmV4dFNpYmxpbmcpOwogICAgICAgIGlmIChwYXJlbnROb2RlKSB7CiAgICAgICAgICBpZiAocGFyZW50Tm9kZS5maXJzdENoaWxkID09PSByZW1vdmVPYmplY3QpIHsKICAgICAgICAgICAgcGFyZW50Tm9kZS5maXJzdENoaWxkID0gcmVtb3ZlTm9kZS5uZXh0U2libGluZzsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChwYXJlbnROb2RlLmxhc3RDaGlsZCA9PT0gcmVtb3ZlT2JqZWN0KSB7CiAgICAgICAgICAgIHBhcmVudE5vZGUubGFzdENoaWxkID0gcmVtb3ZlTm9kZS5wcmV2aW91c1NpYmxpbmc7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChwcmV2Tm9kZSkgewogICAgICAgICAgcHJldk5vZGUubmV4dFNpYmxpbmcgPSByZW1vdmVOb2RlLm5leHRTaWJsaW5nOwogICAgICAgIH0KICAgICAgICBpZiAobmV4dE5vZGUpIHsKICAgICAgICAgIG5leHROb2RlLnByZXZpb3VzU2libGluZyA9IHJlbW92ZU5vZGUucHJldmlvdXNTaWJsaW5nOwogICAgICAgIH0KICAgICAgICByZW1vdmVOb2RlLnBhcmVudCA9IG51bGw7CiAgICAgICAgcmVtb3ZlTm9kZS5wcmV2aW91c1NpYmxpbmcgPSBudWxsOwogICAgICAgIHJlbW92ZU5vZGUubmV4dFNpYmxpbmcgPSBudWxsOwogICAgICAgIHJlbW92ZU5vZGUuY2FjaGVkSW5kZXggPSAtMTsKICAgICAgICByZW1vdmVOb2RlLmNhY2hlZEluZGV4VmVyc2lvbiA9IE5hTjsKICAgICAgICBpZiAocGFyZW50Tm9kZSkgewogICAgICAgICAgcGFyZW50Tm9kZS5jaGlsZHJlbkNoYW5nZWQoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlbW92ZU9iamVjdDsKICAgICAgfQogICAgICAvKioKICAgICAgICogSW5zZXJ0IHRoZSBnaXZlbiBvYmplY3QgYmVmb3JlIHRoZSByZWZlcmVuY2Ugb2JqZWN0LgogICAgICAgKiBgbmV3T2JqZWN0YCBpcyBub3cgdGhlIHByZXZpb3VzIHNpYmxpbmcgb2YgYHJlZmVyZW5jZU9iamVjdGAuCiAgICAgICAqCiAgICAgICAqICogYE8oMSlgCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgaW5zZXJ0QmVmb3JlCiAgICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6c3ltYm9sLXRyZWUjCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZWZlcmVuY2VPYmplY3QKICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5ld09iamVjdAogICAgICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIG5ld09iamVjdCBpcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhpcyBTeW1ib2xUcmVlCiAgICAgICAqIEByZXR1cm4ge09iamVjdH0gbmV3T2JqZWN0CiAgICAgICAqLwogICAgICBpbnNlcnRCZWZvcmUocmVmZXJlbmNlT2JqZWN0LCBuZXdPYmplY3QpIHsKICAgICAgICBjb25zdCByZWZlcmVuY2VOb2RlID0gdGhpcy5fbm9kZShyZWZlcmVuY2VPYmplY3QpOwogICAgICAgIGNvbnN0IHByZXZOb2RlID0gdGhpcy5fbm9kZShyZWZlcmVuY2VOb2RlLnByZXZpb3VzU2libGluZyk7CiAgICAgICAgY29uc3QgbmV3Tm9kZSA9IHRoaXMuX25vZGUobmV3T2JqZWN0KTsKICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gdGhpcy5fbm9kZShyZWZlcmVuY2VOb2RlLnBhcmVudCk7CiAgICAgICAgaWYgKG5ld05vZGUuaXNBdHRhY2hlZCkgewogICAgICAgICAgdGhyb3cgRXJyb3IoIkdpdmVuIG9iamVjdCBpcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhpcyBTeW1ib2xUcmVlLCByZW1vdmUgaXQgZmlyc3QiKTsKICAgICAgICB9CiAgICAgICAgbmV3Tm9kZS5wYXJlbnQgPSByZWZlcmVuY2VOb2RlLnBhcmVudDsKICAgICAgICBuZXdOb2RlLnByZXZpb3VzU2libGluZyA9IHJlZmVyZW5jZU5vZGUucHJldmlvdXNTaWJsaW5nOwogICAgICAgIG5ld05vZGUubmV4dFNpYmxpbmcgPSByZWZlcmVuY2VPYmplY3Q7CiAgICAgICAgcmVmZXJlbmNlTm9kZS5wcmV2aW91c1NpYmxpbmcgPSBuZXdPYmplY3Q7CiAgICAgICAgaWYgKHByZXZOb2RlKSB7CiAgICAgICAgICBwcmV2Tm9kZS5uZXh0U2libGluZyA9IG5ld09iamVjdDsKICAgICAgICB9CiAgICAgICAgaWYgKHBhcmVudE5vZGUgJiYgcGFyZW50Tm9kZS5maXJzdENoaWxkID09PSByZWZlcmVuY2VPYmplY3QpIHsKICAgICAgICAgIHBhcmVudE5vZGUuZmlyc3RDaGlsZCA9IG5ld09iamVjdDsKICAgICAgICB9CiAgICAgICAgaWYgKHBhcmVudE5vZGUpIHsKICAgICAgICAgIHBhcmVudE5vZGUuY2hpbGRyZW5DaGFuZ2VkKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXdPYmplY3Q7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEluc2VydCB0aGUgZ2l2ZW4gb2JqZWN0IGFmdGVyIHRoZSByZWZlcmVuY2Ugb2JqZWN0LgogICAgICAgKiBgbmV3T2JqZWN0YCBpcyBub3cgdGhlIG5leHQgc2libGluZyBvZiBgcmVmZXJlbmNlT2JqZWN0YC4KICAgICAgICoKICAgICAgICogKiBgTygxKWAKICAgICAgICoKICAgICAgICogQG1ldGhvZCBpbnNlcnRBZnRlcgogICAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOnN5bWJvbC10cmVlIwogICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVmZXJlbmNlT2JqZWN0CiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuZXdPYmplY3QKICAgICAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBuZXdPYmplY3QgaXMgYWxyZWFkeSBwcmVzZW50IGluIHRoaXMgU3ltYm9sVHJlZQogICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IG5ld09iamVjdAogICAgICAgKi8KICAgICAgaW5zZXJ0QWZ0ZXIocmVmZXJlbmNlT2JqZWN0LCBuZXdPYmplY3QpIHsKICAgICAgICBjb25zdCByZWZlcmVuY2VOb2RlID0gdGhpcy5fbm9kZShyZWZlcmVuY2VPYmplY3QpOwogICAgICAgIGNvbnN0IG5leHROb2RlID0gdGhpcy5fbm9kZShyZWZlcmVuY2VOb2RlLm5leHRTaWJsaW5nKTsKICAgICAgICBjb25zdCBuZXdOb2RlID0gdGhpcy5fbm9kZShuZXdPYmplY3QpOwogICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLl9ub2RlKHJlZmVyZW5jZU5vZGUucGFyZW50KTsKICAgICAgICBpZiAobmV3Tm9kZS5pc0F0dGFjaGVkKSB7CiAgICAgICAgICB0aHJvdyBFcnJvcigiR2l2ZW4gb2JqZWN0IGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGlzIFN5bWJvbFRyZWUsIHJlbW92ZSBpdCBmaXJzdCIpOwogICAgICAgIH0KICAgICAgICBuZXdOb2RlLnBhcmVudCA9IHJlZmVyZW5jZU5vZGUucGFyZW50OwogICAgICAgIG5ld05vZGUucHJldmlvdXNTaWJsaW5nID0gcmVmZXJlbmNlT2JqZWN0OwogICAgICAgIG5ld05vZGUubmV4dFNpYmxpbmcgPSByZWZlcmVuY2VOb2RlLm5leHRTaWJsaW5nOwogICAgICAgIHJlZmVyZW5jZU5vZGUubmV4dFNpYmxpbmcgPSBuZXdPYmplY3Q7CiAgICAgICAgaWYgKG5leHROb2RlKSB7CiAgICAgICAgICBuZXh0Tm9kZS5wcmV2aW91c1NpYmxpbmcgPSBuZXdPYmplY3Q7CiAgICAgICAgfQogICAgICAgIGlmIChwYXJlbnROb2RlICYmIHBhcmVudE5vZGUubGFzdENoaWxkID09PSByZWZlcmVuY2VPYmplY3QpIHsKICAgICAgICAgIHBhcmVudE5vZGUubGFzdENoaWxkID0gbmV3T2JqZWN0OwogICAgICAgIH0KICAgICAgICBpZiAocGFyZW50Tm9kZSkgewogICAgICAgICAgcGFyZW50Tm9kZS5jaGlsZHJlbkNoYW5nZWQoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ld09iamVjdDsKICAgICAgfQogICAgICAvKioKICAgICAgICogSW5zZXJ0IHRoZSBnaXZlbiBvYmplY3QgYXMgdGhlIGZpcnN0IGNoaWxkIG9mIHRoZSBnaXZlbiByZWZlcmVuY2Ugb2JqZWN0LgogICAgICAgKiBgbmV3T2JqZWN0YCBpcyBub3cgdGhlIGZpcnN0IGNoaWxkIG9mIGByZWZlcmVuY2VPYmplY3RgLgogICAgICAgKgogICAgICAgKiAqIGBPKDEpYAogICAgICAgKgogICAgICAgKiBAbWV0aG9kIHByZXBlbmRDaGlsZAogICAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOnN5bWJvbC10cmVlIwogICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVmZXJlbmNlT2JqZWN0CiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuZXdPYmplY3QKICAgICAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBuZXdPYmplY3QgaXMgYWxyZWFkeSBwcmVzZW50IGluIHRoaXMgU3ltYm9sVHJlZQogICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IG5ld09iamVjdAogICAgICAgKi8KICAgICAgcHJlcGVuZENoaWxkKHJlZmVyZW5jZU9iamVjdCwgbmV3T2JqZWN0KSB7CiAgICAgICAgY29uc3QgcmVmZXJlbmNlTm9kZSA9IHRoaXMuX25vZGUocmVmZXJlbmNlT2JqZWN0KTsKICAgICAgICBjb25zdCBuZXdOb2RlID0gdGhpcy5fbm9kZShuZXdPYmplY3QpOwogICAgICAgIGlmIChuZXdOb2RlLmlzQXR0YWNoZWQpIHsKICAgICAgICAgIHRocm93IEVycm9yKCJHaXZlbiBvYmplY3QgaXMgYWxyZWFkeSBwcmVzZW50IGluIHRoaXMgU3ltYm9sVHJlZSwgcmVtb3ZlIGl0IGZpcnN0Iik7CiAgICAgICAgfQogICAgICAgIGlmIChyZWZlcmVuY2VOb2RlLmhhc0NoaWxkcmVuKSB7CiAgICAgICAgICB0aGlzLmluc2VydEJlZm9yZShyZWZlcmVuY2VOb2RlLmZpcnN0Q2hpbGQsIG5ld09iamVjdCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG5ld05vZGUucGFyZW50ID0gcmVmZXJlbmNlT2JqZWN0OwogICAgICAgICAgcmVmZXJlbmNlTm9kZS5maXJzdENoaWxkID0gbmV3T2JqZWN0OwogICAgICAgICAgcmVmZXJlbmNlTm9kZS5sYXN0Q2hpbGQgPSBuZXdPYmplY3Q7CiAgICAgICAgICByZWZlcmVuY2VOb2RlLmNoaWxkcmVuQ2hhbmdlZCgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3T2JqZWN0OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBJbnNlcnQgdGhlIGdpdmVuIG9iamVjdCBhcyB0aGUgbGFzdCBjaGlsZCBvZiB0aGUgZ2l2ZW4gcmVmZXJlbmNlIG9iamVjdC4KICAgICAgICogYG5ld09iamVjdGAgaXMgbm93IHRoZSBsYXN0IGNoaWxkIG9mIGByZWZlcmVuY2VPYmplY3RgLgogICAgICAgKgogICAgICAgKiAqIGBPKDEpYAogICAgICAgKgogICAgICAgKiBAbWV0aG9kIGFwcGVuZENoaWxkCiAgICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6c3ltYm9sLXRyZWUjCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZWZlcmVuY2VPYmplY3QKICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5ld09iamVjdAogICAgICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIG5ld09iamVjdCBpcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhpcyBTeW1ib2xUcmVlCiAgICAgICAqIEByZXR1cm4ge09iamVjdH0gbmV3T2JqZWN0CiAgICAgICAqLwogICAgICBhcHBlbmRDaGlsZChyZWZlcmVuY2VPYmplY3QsIG5ld09iamVjdCkgewogICAgICAgIGNvbnN0IHJlZmVyZW5jZU5vZGUgPSB0aGlzLl9ub2RlKHJlZmVyZW5jZU9iamVjdCk7CiAgICAgICAgY29uc3QgbmV3Tm9kZSA9IHRoaXMuX25vZGUobmV3T2JqZWN0KTsKICAgICAgICBpZiAobmV3Tm9kZS5pc0F0dGFjaGVkKSB7CiAgICAgICAgICB0aHJvdyBFcnJvcigiR2l2ZW4gb2JqZWN0IGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGlzIFN5bWJvbFRyZWUsIHJlbW92ZSBpdCBmaXJzdCIpOwogICAgICAgIH0KICAgICAgICBpZiAocmVmZXJlbmNlTm9kZS5oYXNDaGlsZHJlbikgewogICAgICAgICAgdGhpcy5pbnNlcnRBZnRlcihyZWZlcmVuY2VOb2RlLmxhc3RDaGlsZCwgbmV3T2JqZWN0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbmV3Tm9kZS5wYXJlbnQgPSByZWZlcmVuY2VPYmplY3Q7CiAgICAgICAgICByZWZlcmVuY2VOb2RlLmZpcnN0Q2hpbGQgPSBuZXdPYmplY3Q7CiAgICAgICAgICByZWZlcmVuY2VOb2RlLmxhc3RDaGlsZCA9IG5ld09iamVjdDsKICAgICAgICAgIHJlZmVyZW5jZU5vZGUuY2hpbGRyZW5DaGFuZ2VkKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXdPYmplY3Q7CiAgICAgIH0KICAgIH07CiAgICBtb2R1bGUuZXhwb3J0cyA9IFN5bWJvbFRyZWU7CiAgICBTeW1ib2xUcmVlLlRyZWVQb3NpdGlvbiA9IFRyZWVQb3NpdGlvbjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2xvZGFzaC5jbG9uZWRlZXBANC41LjAvbm9kZV9tb2R1bGVzL2xvZGFzaC5jbG9uZWRlZXAvaW5kZXguanMKdmFyIHJlcXVpcmVfbG9kYXNoID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sb2Rhc2guY2xvbmVkZWVwQDQuNS4wL25vZGVfbW9kdWxlcy9sb2Rhc2guY2xvbmVkZWVwL2luZGV4LmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgIHZhciBMQVJHRV9BUlJBWV9TSVpFID0gMjAwOwogICAgdmFyIEhBU0hfVU5ERUZJTkVEID0gIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iOwogICAgdmFyIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxOwogICAgdmFyIGFyZ3NUYWcgPSAiW29iamVjdCBBcmd1bWVudHNdIiwgYXJyYXlUYWcgPSAiW29iamVjdCBBcnJheV0iLCBib29sVGFnID0gIltvYmplY3QgQm9vbGVhbl0iLCBkYXRlVGFnID0gIltvYmplY3QgRGF0ZV0iLCBlcnJvclRhZyA9ICJbb2JqZWN0IEVycm9yXSIsIGZ1bmNUYWcgPSAiW29iamVjdCBGdW5jdGlvbl0iLCBnZW5UYWcgPSAiW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLCBtYXBUYWcgPSAiW29iamVjdCBNYXBdIiwgbnVtYmVyVGFnID0gIltvYmplY3QgTnVtYmVyXSIsIG9iamVjdFRhZyA9ICJbb2JqZWN0IE9iamVjdF0iLCBwcm9taXNlVGFnID0gIltvYmplY3QgUHJvbWlzZV0iLCByZWdleHBUYWcgPSAiW29iamVjdCBSZWdFeHBdIiwgc2V0VGFnID0gIltvYmplY3QgU2V0XSIsIHN0cmluZ1RhZyA9ICJbb2JqZWN0IFN0cmluZ10iLCBzeW1ib2xUYWcgPSAiW29iamVjdCBTeW1ib2xdIiwgd2Vha01hcFRhZyA9ICJbb2JqZWN0IFdlYWtNYXBdIjsKICAgIHZhciBhcnJheUJ1ZmZlclRhZyA9ICJbb2JqZWN0IEFycmF5QnVmZmVyXSIsIGRhdGFWaWV3VGFnID0gIltvYmplY3QgRGF0YVZpZXddIiwgZmxvYXQzMlRhZyA9ICJbb2JqZWN0IEZsb2F0MzJBcnJheV0iLCBmbG9hdDY0VGFnID0gIltvYmplY3QgRmxvYXQ2NEFycmF5XSIsIGludDhUYWcgPSAiW29iamVjdCBJbnQ4QXJyYXldIiwgaW50MTZUYWcgPSAiW29iamVjdCBJbnQxNkFycmF5XSIsIGludDMyVGFnID0gIltvYmplY3QgSW50MzJBcnJheV0iLCB1aW50OFRhZyA9ICJbb2JqZWN0IFVpbnQ4QXJyYXldIiwgdWludDhDbGFtcGVkVGFnID0gIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIiwgdWludDE2VGFnID0gIltvYmplY3QgVWludDE2QXJyYXldIiwgdWludDMyVGFnID0gIltvYmplY3QgVWludDMyQXJyYXldIjsKICAgIHZhciByZVJlZ0V4cENoYXIgPSAvW1xcXiQuKis/KClbXF17fXxdL2c7CiAgICB2YXIgcmVGbGFncyA9IC9cdyokLzsKICAgIHZhciByZUlzSG9zdEN0b3IgPSAvXlxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXF0kLzsKICAgIHZhciByZUlzVWludCA9IC9eKD86MHxbMS05XVxkKikkLzsKICAgIHZhciBjbG9uZWFibGVUYWdzID0ge307CiAgICBjbG9uZWFibGVUYWdzW2FyZ3NUYWddID0gY2xvbmVhYmxlVGFnc1thcnJheVRhZ10gPSBjbG9uZWFibGVUYWdzW2FycmF5QnVmZmVyVGFnXSA9IGNsb25lYWJsZVRhZ3NbZGF0YVZpZXdUYWddID0gY2xvbmVhYmxlVGFnc1tib29sVGFnXSA9IGNsb25lYWJsZVRhZ3NbZGF0ZVRhZ10gPSBjbG9uZWFibGVUYWdzW2Zsb2F0MzJUYWddID0gY2xvbmVhYmxlVGFnc1tmbG9hdDY0VGFnXSA9IGNsb25lYWJsZVRhZ3NbaW50OFRhZ10gPSBjbG9uZWFibGVUYWdzW2ludDE2VGFnXSA9IGNsb25lYWJsZVRhZ3NbaW50MzJUYWddID0gY2xvbmVhYmxlVGFnc1ttYXBUYWddID0gY2xvbmVhYmxlVGFnc1tudW1iZXJUYWddID0gY2xvbmVhYmxlVGFnc1tvYmplY3RUYWddID0gY2xvbmVhYmxlVGFnc1tyZWdleHBUYWddID0gY2xvbmVhYmxlVGFnc1tzZXRUYWddID0gY2xvbmVhYmxlVGFnc1tzdHJpbmdUYWddID0gY2xvbmVhYmxlVGFnc1tzeW1ib2xUYWddID0gY2xvbmVhYmxlVGFnc1t1aW50OFRhZ10gPSBjbG9uZWFibGVUYWdzW3VpbnQ4Q2xhbXBlZFRhZ10gPSBjbG9uZWFibGVUYWdzW3VpbnQxNlRhZ10gPSBjbG9uZWFibGVUYWdzW3VpbnQzMlRhZ10gPSB0cnVlOwogICAgY2xvbmVhYmxlVGFnc1tlcnJvclRhZ10gPSBjbG9uZWFibGVUYWdzW2Z1bmNUYWddID0gY2xvbmVhYmxlVGFnc1t3ZWFrTWFwVGFnXSA9IGZhbHNlOwogICAgdmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICJvYmplY3QiICYmIGdsb2JhbCAmJiBnbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgZ2xvYmFsOwogICAgdmFyIGZyZWVTZWxmID0gdHlwZW9mIHNlbGYgPT0gIm9iamVjdCIgJiYgc2VsZiAmJiBzZWxmLk9iamVjdCA9PT0gT2JqZWN0ICYmIHNlbGY7CiAgICB2YXIgcm9vdDYgPSBmcmVlR2xvYmFsIHx8IGZyZWVTZWxmIHx8IEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCk7CiAgICB2YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAib2JqZWN0IiAmJiBleHBvcnRzICYmICFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7CiAgICB2YXIgZnJlZU1vZHVsZSA9IGZyZWVFeHBvcnRzICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIgJiYgbW9kdWxlICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlOwogICAgdmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7CiAgICBmdW5jdGlvbiBhZGRNYXBFbnRyeShtYXA3LCBwYWlyKSB7CiAgICAgIG1hcDcuc2V0KHBhaXJbMF0sIHBhaXJbMV0pOwogICAgICByZXR1cm4gbWFwNzsKICAgIH0KICAgIF9fbmFtZShhZGRNYXBFbnRyeSwgImFkZE1hcEVudHJ5Iik7CiAgICBmdW5jdGlvbiBhZGRTZXRFbnRyeShzZXQyLCB2YWx1ZTIpIHsKICAgICAgc2V0Mi5hZGQodmFsdWUyKTsKICAgICAgcmV0dXJuIHNldDI7CiAgICB9CiAgICBfX25hbWUoYWRkU2V0RW50cnksICJhZGRTZXRFbnRyeSIpOwogICAgZnVuY3Rpb24gYXJyYXlFYWNoKGFycmF5LCBpdGVyYXRlZSkgewogICAgICB2YXIgaW5kZXgyID0gLTEsIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMDsKICAgICAgd2hpbGUgKCsraW5kZXgyIDwgbGVuZ3RoKSB7CiAgICAgICAgaWYgKGl0ZXJhdGVlKGFycmF5W2luZGV4Ml0sIGluZGV4MiwgYXJyYXkpID09PSBmYWxzZSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBhcnJheTsKICAgIH0KICAgIF9fbmFtZShhcnJheUVhY2gsICJhcnJheUVhY2giKTsKICAgIGZ1bmN0aW9uIGFycmF5UHVzaChhcnJheSwgdmFsdWVzKSB7CiAgICAgIHZhciBpbmRleDIgPSAtMSwgbGVuZ3RoID0gdmFsdWVzLmxlbmd0aCwgb2Zmc2V0ID0gYXJyYXkubGVuZ3RoOwogICAgICB3aGlsZSAoKytpbmRleDIgPCBsZW5ndGgpIHsKICAgICAgICBhcnJheVtvZmZzZXQgKyBpbmRleDJdID0gdmFsdWVzW2luZGV4Ml07CiAgICAgIH0KICAgICAgcmV0dXJuIGFycmF5OwogICAgfQogICAgX19uYW1lKGFycmF5UHVzaCwgImFycmF5UHVzaCIpOwogICAgZnVuY3Rpb24gYXJyYXlSZWR1Y2UoYXJyYXksIGl0ZXJhdGVlLCBhY2N1bXVsYXRvciwgaW5pdEFjY3VtKSB7CiAgICAgIHZhciBpbmRleDIgPSAtMSwgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwOwogICAgICBpZiAoaW5pdEFjY3VtICYmIGxlbmd0aCkgewogICAgICAgIGFjY3VtdWxhdG9yID0gYXJyYXlbKytpbmRleDJdOwogICAgICB9CiAgICAgIHdoaWxlICgrK2luZGV4MiA8IGxlbmd0aCkgewogICAgICAgIGFjY3VtdWxhdG9yID0gaXRlcmF0ZWUoYWNjdW11bGF0b3IsIGFycmF5W2luZGV4Ml0sIGluZGV4MiwgYXJyYXkpOwogICAgICB9CiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjsKICAgIH0KICAgIF9fbmFtZShhcnJheVJlZHVjZSwgImFycmF5UmVkdWNlIik7CiAgICBmdW5jdGlvbiBiYXNlVGltZXMobjExLCBpdGVyYXRlZSkgewogICAgICB2YXIgaW5kZXgyID0gLTEsIHJlc3VsdCA9IEFycmF5KG4xMSk7CiAgICAgIHdoaWxlICgrK2luZGV4MiA8IG4xMSkgewogICAgICAgIHJlc3VsdFtpbmRleDJdID0gaXRlcmF0ZWUoaW5kZXgyKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgX19uYW1lKGJhc2VUaW1lcywgImJhc2VUaW1lcyIpOwogICAgZnVuY3Rpb24gZ2V0VmFsdWUob2JqZWN0LCBrZXkyKSB7CiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHZvaWQgMCA6IG9iamVjdFtrZXkyXTsKICAgIH0KICAgIF9fbmFtZShnZXRWYWx1ZSwgImdldFZhbHVlIik7CiAgICBmdW5jdGlvbiBpc0hvc3RPYmplY3QodmFsdWUyKSB7CiAgICAgIHZhciByZXN1bHQgPSBmYWxzZTsKICAgICAgaWYgKHZhbHVlMiAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZTIudG9TdHJpbmcgIT0gImZ1bmN0aW9uIikgewogICAgICAgIHRyeSB7CiAgICAgICAgICByZXN1bHQgPSAhISh2YWx1ZTIgKyAiIik7CiAgICAgICAgfSBjYXRjaCAoZTEwKSB7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBfX25hbWUoaXNIb3N0T2JqZWN0LCAiaXNIb3N0T2JqZWN0Iik7CiAgICBmdW5jdGlvbiBtYXBUb0FycmF5KG1hcDcpIHsKICAgICAgdmFyIGluZGV4MiA9IC0xLCByZXN1bHQgPSBBcnJheShtYXA3LnNpemUpOwogICAgICBtYXA3LmZvckVhY2goZnVuY3Rpb24odmFsdWUyLCBrZXkyKSB7CiAgICAgICAgcmVzdWx0WysraW5kZXgyXSA9IFtrZXkyLCB2YWx1ZTJdOwogICAgICB9KTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIF9fbmFtZShtYXBUb0FycmF5LCAibWFwVG9BcnJheSIpOwogICAgZnVuY3Rpb24gb3ZlckFyZyhmdW5jLCB0cmFuc2Zvcm0yKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihhcmcpIHsKICAgICAgICByZXR1cm4gZnVuYyh0cmFuc2Zvcm0yKGFyZykpOwogICAgICB9OwogICAgfQogICAgX19uYW1lKG92ZXJBcmcsICJvdmVyQXJnIik7CiAgICBmdW5jdGlvbiBzZXRUb0FycmF5KHNldDIpIHsKICAgICAgdmFyIGluZGV4MiA9IC0xLCByZXN1bHQgPSBBcnJheShzZXQyLnNpemUpOwogICAgICBzZXQyLmZvckVhY2goZnVuY3Rpb24odmFsdWUyKSB7CiAgICAgICAgcmVzdWx0WysraW5kZXgyXSA9IHZhbHVlMjsKICAgICAgfSk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBfX25hbWUoc2V0VG9BcnJheSwgInNldFRvQXJyYXkiKTsKICAgIHZhciBhcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlLCBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsIG9iamVjdFByb3RvMiA9IE9iamVjdC5wcm90b3R5cGU7CiAgICB2YXIgY29yZUpzRGF0YSA9IHJvb3Q2WyJfX2NvcmUtanNfc2hhcmVkX18iXTsKICAgIHZhciBtYXNrU3JjS2V5ID0gKGZ1bmN0aW9uKCkgewogICAgICB2YXIgdWlkID0gL1teLl0rJC8uZXhlYyhjb3JlSnNEYXRhICYmIGNvcmVKc0RhdGEua2V5cyAmJiBjb3JlSnNEYXRhLmtleXMuSUVfUFJPVE8gfHwgIiIpOwogICAgICByZXR1cm4gdWlkID8gIlN5bWJvbChzcmMpXzEuIiArIHVpZCA6ICIiOwogICAgfSkoKTsKICAgIHZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7CiAgICB2YXIgaGFzT3duUHJvcGVydHkzID0gb2JqZWN0UHJvdG8yLmhhc093blByb3BlcnR5OwogICAgdmFyIG9iamVjdFRvU3RyaW5nMiA9IG9iamVjdFByb3RvMi50b1N0cmluZzsKICAgIHZhciByZUlzTmF0aXZlID0gUmVnRXhwKAogICAgICAiXiIgKyBmdW5jVG9TdHJpbmcuY2FsbChoYXNPd25Qcm9wZXJ0eTMpLnJlcGxhY2UocmVSZWdFeHBDaGFyLCAiXFwkJiIpLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFwoKXwgZm9yIC4rPyg/PVxcXF0pL2csICIkMS4qPyIpICsgIiQiCiAgICApOwogICAgdmFyIEJ1ZmZlcjIgPSBtb2R1bGVFeHBvcnRzID8gcm9vdDYuQnVmZmVyIDogdm9pZCAwLCBTeW1ib2wyID0gcm9vdDYuU3ltYm9sLCBVaW50OEFycmF5MiA9IHJvb3Q2LlVpbnQ4QXJyYXksIGdldFByb3RvdHlwZSA9IG92ZXJBcmcoT2JqZWN0LmdldFByb3RvdHlwZU9mLCBPYmplY3QpLCBvYmplY3RDcmVhdGUgPSBPYmplY3QuY3JlYXRlLCBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IG9iamVjdFByb3RvMi5wcm9wZXJ0eUlzRW51bWVyYWJsZSwgc3BsaWNlMiA9IGFycmF5UHJvdG8uc3BsaWNlOwogICAgdmFyIG5hdGl2ZUdldFN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLCBuYXRpdmVJc0J1ZmZlciA9IEJ1ZmZlcjIgPyBCdWZmZXIyLmlzQnVmZmVyIDogdm9pZCAwLCBuYXRpdmVLZXlzID0gb3ZlckFyZyhPYmplY3Qua2V5cywgT2JqZWN0KTsKICAgIHZhciBEYXRhVmlldzIgPSBnZXROYXRpdmUocm9vdDYsICJEYXRhVmlldyIpLCBNYXAyID0gZ2V0TmF0aXZlKHJvb3Q2LCAiTWFwIiksIFByb21pc2UyID0gZ2V0TmF0aXZlKHJvb3Q2LCAiUHJvbWlzZSIpLCBTZXQyID0gZ2V0TmF0aXZlKHJvb3Q2LCAiU2V0IiksIFdlYWtNYXAyID0gZ2V0TmF0aXZlKHJvb3Q2LCAiV2Vha01hcCIpLCBuYXRpdmVDcmVhdGUgPSBnZXROYXRpdmUoT2JqZWN0LCAiY3JlYXRlIik7CiAgICB2YXIgZGF0YVZpZXdDdG9yU3RyaW5nID0gdG9Tb3VyY2UoRGF0YVZpZXcyKSwgbWFwQ3RvclN0cmluZyA9IHRvU291cmNlKE1hcDIpLCBwcm9taXNlQ3RvclN0cmluZyA9IHRvU291cmNlKFByb21pc2UyKSwgc2V0Q3RvclN0cmluZyA9IHRvU291cmNlKFNldDIpLCB3ZWFrTWFwQ3RvclN0cmluZyA9IHRvU291cmNlKFdlYWtNYXAyKTsKICAgIHZhciBzeW1ib2xQcm90byA9IFN5bWJvbDIgPyBTeW1ib2wyLnByb3RvdHlwZSA6IHZvaWQgMCwgc3ltYm9sVmFsdWVPZiA9IHN5bWJvbFByb3RvID8gc3ltYm9sUHJvdG8udmFsdWVPZiA6IHZvaWQgMDsKICAgIGZ1bmN0aW9uIEhhc2goZW50cmllcykgewogICAgICB2YXIgaW5kZXgyID0gLTEsIGxlbmd0aCA9IGVudHJpZXMgPyBlbnRyaWVzLmxlbmd0aCA6IDA7CiAgICAgIHRoaXMuY2xlYXIoKTsKICAgICAgd2hpbGUgKCsraW5kZXgyIDwgbGVuZ3RoKSB7CiAgICAgICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleDJdOwogICAgICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7CiAgICAgIH0KICAgIH0KICAgIF9fbmFtZShIYXNoLCAiSGFzaCIpOwogICAgZnVuY3Rpb24gaGFzaENsZWFyKCkgewogICAgICB0aGlzLl9fZGF0YV9fID0gbmF0aXZlQ3JlYXRlID8gbmF0aXZlQ3JlYXRlKG51bGwpIDoge307CiAgICB9CiAgICBfX25hbWUoaGFzaENsZWFyLCAiaGFzaENsZWFyIik7CiAgICBmdW5jdGlvbiBoYXNoRGVsZXRlKGtleTIpIHsKICAgICAgcmV0dXJuIHRoaXMuaGFzKGtleTIpICYmIGRlbGV0ZSB0aGlzLl9fZGF0YV9fW2tleTJdOwogICAgfQogICAgX19uYW1lKGhhc2hEZWxldGUsICJoYXNoRGVsZXRlIik7CiAgICBmdW5jdGlvbiBoYXNoR2V0KGtleTIpIHsKICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fOwogICAgICBpZiAobmF0aXZlQ3JlYXRlKSB7CiAgICAgICAgdmFyIHJlc3VsdCA9IGRhdGFba2V5Ml07CiAgICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gSEFTSF9VTkRFRklORUQgPyB2b2lkIDAgOiByZXN1bHQ7CiAgICAgIH0KICAgICAgcmV0dXJuIGhhc093blByb3BlcnR5My5jYWxsKGRhdGEsIGtleTIpID8gZGF0YVtrZXkyXSA6IHZvaWQgMDsKICAgIH0KICAgIF9fbmFtZShoYXNoR2V0LCAiaGFzaEdldCIpOwogICAgZnVuY3Rpb24gaGFzaEhhcyhrZXkyKSB7CiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXzsKICAgICAgcmV0dXJuIG5hdGl2ZUNyZWF0ZSA/IGRhdGFba2V5Ml0gIT09IHZvaWQgMCA6IGhhc093blByb3BlcnR5My5jYWxsKGRhdGEsIGtleTIpOwogICAgfQogICAgX19uYW1lKGhhc2hIYXMsICJoYXNoSGFzIik7CiAgICBmdW5jdGlvbiBoYXNoU2V0KGtleTIsIHZhbHVlMikgewogICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187CiAgICAgIGRhdGFba2V5Ml0gPSBuYXRpdmVDcmVhdGUgJiYgdmFsdWUyID09PSB2b2lkIDAgPyBIQVNIX1VOREVGSU5FRCA6IHZhbHVlMjsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBfX25hbWUoaGFzaFNldCwgImhhc2hTZXQiKTsKICAgIEhhc2gucHJvdG90eXBlLmNsZWFyID0gaGFzaENsZWFyOwogICAgSGFzaC5wcm90b3R5cGVbImRlbGV0ZSJdID0gaGFzaERlbGV0ZTsKICAgIEhhc2gucHJvdG90eXBlLmdldCA9IGhhc2hHZXQ7CiAgICBIYXNoLnByb3RvdHlwZS5oYXMgPSBoYXNoSGFzOwogICAgSGFzaC5wcm90b3R5cGUuc2V0ID0gaGFzaFNldDsKICAgIGZ1bmN0aW9uIExpc3RDYWNoZShlbnRyaWVzKSB7CiAgICAgIHZhciBpbmRleDIgPSAtMSwgbGVuZ3RoID0gZW50cmllcyA/IGVudHJpZXMubGVuZ3RoIDogMDsKICAgICAgdGhpcy5jbGVhcigpOwogICAgICB3aGlsZSAoKytpbmRleDIgPCBsZW5ndGgpIHsKICAgICAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4Ml07CiAgICAgICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTsKICAgICAgfQogICAgfQogICAgX19uYW1lKExpc3RDYWNoZSwgIkxpc3RDYWNoZSIpOwogICAgZnVuY3Rpb24gbGlzdENhY2hlQ2xlYXIoKSB7CiAgICAgIHRoaXMuX19kYXRhX18gPSBbXTsKICAgIH0KICAgIF9fbmFtZShsaXN0Q2FjaGVDbGVhciwgImxpc3RDYWNoZUNsZWFyIik7CiAgICBmdW5jdGlvbiBsaXN0Q2FjaGVEZWxldGUoa2V5MikgewogICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sIGluZGV4MiA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkyKTsKICAgICAgaWYgKGluZGV4MiA8IDApIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgdmFyIGxhc3RJbmRleCA9IGRhdGEubGVuZ3RoIC0gMTsKICAgICAgaWYgKGluZGV4MiA9PSBsYXN0SW5kZXgpIHsKICAgICAgICBkYXRhLnBvcCgpOwogICAgICB9IGVsc2UgewogICAgICAgIHNwbGljZTIuY2FsbChkYXRhLCBpbmRleDIsIDEpOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgX19uYW1lKGxpc3RDYWNoZURlbGV0ZSwgImxpc3RDYWNoZURlbGV0ZSIpOwogICAgZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleTIpIHsKICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLCBpbmRleDIgPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5Mik7CiAgICAgIHJldHVybiBpbmRleDIgPCAwID8gdm9pZCAwIDogZGF0YVtpbmRleDJdWzFdOwogICAgfQogICAgX19uYW1lKGxpc3RDYWNoZUdldCwgImxpc3RDYWNoZUdldCIpOwogICAgZnVuY3Rpb24gbGlzdENhY2hlSGFzKGtleTIpIHsKICAgICAgcmV0dXJuIGFzc29jSW5kZXhPZih0aGlzLl9fZGF0YV9fLCBrZXkyKSA+IC0xOwogICAgfQogICAgX19uYW1lKGxpc3RDYWNoZUhhcywgImxpc3RDYWNoZUhhcyIpOwogICAgZnVuY3Rpb24gbGlzdENhY2hlU2V0KGtleTIsIHZhbHVlMikgewogICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sIGluZGV4MiA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkyKTsKICAgICAgaWYgKGluZGV4MiA8IDApIHsKICAgICAgICBkYXRhLnB1c2goW2tleTIsIHZhbHVlMl0pOwogICAgICB9IGVsc2UgewogICAgICAgIGRhdGFbaW5kZXgyXVsxXSA9IHZhbHVlMjsKICAgICAgfQogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIF9fbmFtZShsaXN0Q2FjaGVTZXQsICJsaXN0Q2FjaGVTZXQiKTsKICAgIExpc3RDYWNoZS5wcm90b3R5cGUuY2xlYXIgPSBsaXN0Q2FjaGVDbGVhcjsKICAgIExpc3RDYWNoZS5wcm90b3R5cGVbImRlbGV0ZSJdID0gbGlzdENhY2hlRGVsZXRlOwogICAgTGlzdENhY2hlLnByb3RvdHlwZS5nZXQgPSBsaXN0Q2FjaGVHZXQ7CiAgICBMaXN0Q2FjaGUucHJvdG90eXBlLmhhcyA9IGxpc3RDYWNoZUhhczsKICAgIExpc3RDYWNoZS5wcm90b3R5cGUuc2V0ID0gbGlzdENhY2hlU2V0OwogICAgZnVuY3Rpb24gTWFwQ2FjaGUoZW50cmllcykgewogICAgICB2YXIgaW5kZXgyID0gLTEsIGxlbmd0aCA9IGVudHJpZXMgPyBlbnRyaWVzLmxlbmd0aCA6IDA7CiAgICAgIHRoaXMuY2xlYXIoKTsKICAgICAgd2hpbGUgKCsraW5kZXgyIDwgbGVuZ3RoKSB7CiAgICAgICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleDJdOwogICAgICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7CiAgICAgIH0KICAgIH0KICAgIF9fbmFtZShNYXBDYWNoZSwgIk1hcENhY2hlIik7CiAgICBmdW5jdGlvbiBtYXBDYWNoZUNsZWFyKCkgewogICAgICB0aGlzLl9fZGF0YV9fID0gewogICAgICAgICJoYXNoIjogbmV3IEhhc2goKSwKICAgICAgICAibWFwIjogbmV3IChNYXAyIHx8IExpc3RDYWNoZSkoKSwKICAgICAgICAic3RyaW5nIjogbmV3IEhhc2goKQogICAgICB9OwogICAgfQogICAgX19uYW1lKG1hcENhY2hlQ2xlYXIsICJtYXBDYWNoZUNsZWFyIik7CiAgICBmdW5jdGlvbiBtYXBDYWNoZURlbGV0ZShrZXkyKSB7CiAgICAgIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleTIpWyJkZWxldGUiXShrZXkyKTsKICAgIH0KICAgIF9fbmFtZShtYXBDYWNoZURlbGV0ZSwgIm1hcENhY2hlRGVsZXRlIik7CiAgICBmdW5jdGlvbiBtYXBDYWNoZUdldChrZXkyKSB7CiAgICAgIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleTIpLmdldChrZXkyKTsKICAgIH0KICAgIF9fbmFtZShtYXBDYWNoZUdldCwgIm1hcENhY2hlR2V0Iik7CiAgICBmdW5jdGlvbiBtYXBDYWNoZUhhcyhrZXkyKSB7CiAgICAgIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleTIpLmhhcyhrZXkyKTsKICAgIH0KICAgIF9fbmFtZShtYXBDYWNoZUhhcywgIm1hcENhY2hlSGFzIik7CiAgICBmdW5jdGlvbiBtYXBDYWNoZVNldChrZXkyLCB2YWx1ZTIpIHsKICAgICAgZ2V0TWFwRGF0YSh0aGlzLCBrZXkyKS5zZXQoa2V5MiwgdmFsdWUyKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBfX25hbWUobWFwQ2FjaGVTZXQsICJtYXBDYWNoZVNldCIpOwogICAgTWFwQ2FjaGUucHJvdG90eXBlLmNsZWFyID0gbWFwQ2FjaGVDbGVhcjsKICAgIE1hcENhY2hlLnByb3RvdHlwZVsiZGVsZXRlIl0gPSBtYXBDYWNoZURlbGV0ZTsKICAgIE1hcENhY2hlLnByb3RvdHlwZS5nZXQgPSBtYXBDYWNoZUdldDsKICAgIE1hcENhY2hlLnByb3RvdHlwZS5oYXMgPSBtYXBDYWNoZUhhczsKICAgIE1hcENhY2hlLnByb3RvdHlwZS5zZXQgPSBtYXBDYWNoZVNldDsKICAgIGZ1bmN0aW9uIFN0YWNrKGVudHJpZXMpIHsKICAgICAgdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGUoZW50cmllcyk7CiAgICB9CiAgICBfX25hbWUoU3RhY2ssICJTdGFjayIpOwogICAgZnVuY3Rpb24gc3RhY2tDbGVhcigpIHsKICAgICAgdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGUoKTsKICAgIH0KICAgIF9fbmFtZShzdGFja0NsZWFyLCAic3RhY2tDbGVhciIpOwogICAgZnVuY3Rpb24gc3RhY2tEZWxldGUoa2V5MikgewogICAgICByZXR1cm4gdGhpcy5fX2RhdGFfX1siZGVsZXRlIl0oa2V5Mik7CiAgICB9CiAgICBfX25hbWUoc3RhY2tEZWxldGUsICJzdGFja0RlbGV0ZSIpOwogICAgZnVuY3Rpb24gc3RhY2tHZXQoa2V5MikgewogICAgICByZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQoa2V5Mik7CiAgICB9CiAgICBfX25hbWUoc3RhY2tHZXQsICJzdGFja0dldCIpOwogICAgZnVuY3Rpb24gc3RhY2tIYXMoa2V5MikgewogICAgICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXMoa2V5Mik7CiAgICB9CiAgICBfX25hbWUoc3RhY2tIYXMsICJzdGFja0hhcyIpOwogICAgZnVuY3Rpb24gc3RhY2tTZXQoa2V5MiwgdmFsdWUyKSB7CiAgICAgIHZhciBjYWNoZSA9IHRoaXMuX19kYXRhX187CiAgICAgIGlmIChjYWNoZSBpbnN0YW5jZW9mIExpc3RDYWNoZSkgewogICAgICAgIHZhciBwYWlyczIgPSBjYWNoZS5fX2RhdGFfXzsKICAgICAgICBpZiAoIU1hcDIgfHwgcGFpcnMyLmxlbmd0aCA8IExBUkdFX0FSUkFZX1NJWkUgLSAxKSB7CiAgICAgICAgICBwYWlyczIucHVzaChba2V5MiwgdmFsdWUyXSk7CiAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9CiAgICAgICAgY2FjaGUgPSB0aGlzLl9fZGF0YV9fID0gbmV3IE1hcENhY2hlKHBhaXJzMik7CiAgICAgIH0KICAgICAgY2FjaGUuc2V0KGtleTIsIHZhbHVlMik7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgX19uYW1lKHN0YWNrU2V0LCAic3RhY2tTZXQiKTsKICAgIFN0YWNrLnByb3RvdHlwZS5jbGVhciA9IHN0YWNrQ2xlYXI7CiAgICBTdGFjay5wcm90b3R5cGVbImRlbGV0ZSJdID0gc3RhY2tEZWxldGU7CiAgICBTdGFjay5wcm90b3R5cGUuZ2V0ID0gc3RhY2tHZXQ7CiAgICBTdGFjay5wcm90b3R5cGUuaGFzID0gc3RhY2tIYXM7CiAgICBTdGFjay5wcm90b3R5cGUuc2V0ID0gc3RhY2tTZXQ7CiAgICBmdW5jdGlvbiBhcnJheUxpa2VLZXlzKHZhbHVlMiwgaW5oZXJpdGVkKSB7CiAgICAgIHZhciByZXN1bHQgPSBpc0FycmF5NSh2YWx1ZTIpIHx8IGlzQXJndW1lbnRzKHZhbHVlMikgPyBiYXNlVGltZXModmFsdWUyLmxlbmd0aCwgU3RyaW5nKSA6IFtdOwogICAgICB2YXIgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aCwgc2tpcEluZGV4ZXMgPSAhIWxlbmd0aDsKICAgICAgZm9yICh2YXIga2V5MiBpbiB2YWx1ZTIpIHsKICAgICAgICBpZiAoKGluaGVyaXRlZCB8fCBoYXNPd25Qcm9wZXJ0eTMuY2FsbCh2YWx1ZTIsIGtleTIpKSAmJiAhKHNraXBJbmRleGVzICYmIChrZXkyID09ICJsZW5ndGgiIHx8IGlzSW5kZXgoa2V5MiwgbGVuZ3RoKSkpKSB7CiAgICAgICAgICByZXN1bHQucHVzaChrZXkyKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIF9fbmFtZShhcnJheUxpa2VLZXlzLCAiYXJyYXlMaWtlS2V5cyIpOwogICAgZnVuY3Rpb24gYXNzaWduVmFsdWUob2JqZWN0LCBrZXkyLCB2YWx1ZTIpIHsKICAgICAgdmFyIG9ialZhbHVlID0gb2JqZWN0W2tleTJdOwogICAgICBpZiAoIShoYXNPd25Qcm9wZXJ0eTMuY2FsbChvYmplY3QsIGtleTIpICYmIGVxKG9ialZhbHVlLCB2YWx1ZTIpKSB8fCB2YWx1ZTIgPT09IHZvaWQgMCAmJiAhKGtleTIgaW4gb2JqZWN0KSkgewogICAgICAgIG9iamVjdFtrZXkyXSA9IHZhbHVlMjsKICAgICAgfQogICAgfQogICAgX19uYW1lKGFzc2lnblZhbHVlLCAiYXNzaWduVmFsdWUiKTsKICAgIGZ1bmN0aW9uIGFzc29jSW5kZXhPZihhcnJheSwga2V5MikgewogICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOwogICAgICB3aGlsZSAobGVuZ3RoLS0pIHsKICAgICAgICBpZiAoZXEoYXJyYXlbbGVuZ3RoXVswXSwga2V5MikpIHsKICAgICAgICAgIHJldHVybiBsZW5ndGg7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIF9fbmFtZShhc3NvY0luZGV4T2YsICJhc3NvY0luZGV4T2YiKTsKICAgIGZ1bmN0aW9uIGJhc2VBc3NpZ24ob2JqZWN0LCBzb3VyY2UpIHsKICAgICAgcmV0dXJuIG9iamVjdCAmJiBjb3B5T2JqZWN0KHNvdXJjZSwga2V5czIoc291cmNlKSwgb2JqZWN0KTsKICAgIH0KICAgIF9fbmFtZShiYXNlQXNzaWduLCAiYmFzZUFzc2lnbiIpOwogICAgZnVuY3Rpb24gYmFzZUNsb25lKHZhbHVlMiwgaXNEZWVwLCBpc0Z1bGwsIGN1c3RvbWl6ZXIsIGtleTIsIG9iamVjdCwgc3RhY2spIHsKICAgICAgdmFyIHJlc3VsdDsKICAgICAgaWYgKGN1c3RvbWl6ZXIpIHsKICAgICAgICByZXN1bHQgPSBvYmplY3QgPyBjdXN0b21pemVyKHZhbHVlMiwga2V5Miwgb2JqZWN0LCBzdGFjaykgOiBjdXN0b21pemVyKHZhbHVlMik7CiAgICAgIH0KICAgICAgaWYgKHJlc3VsdCAhPT0gdm9pZCAwKSB7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgICBpZiAoIWlzT2JqZWN0Myh2YWx1ZTIpKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlMjsKICAgICAgfQogICAgICB2YXIgaXNBcnIgPSBpc0FycmF5NSh2YWx1ZTIpOwogICAgICBpZiAoaXNBcnIpIHsKICAgICAgICByZXN1bHQgPSBpbml0Q2xvbmVBcnJheSh2YWx1ZTIpOwogICAgICAgIGlmICghaXNEZWVwKSB7CiAgICAgICAgICByZXR1cm4gY29weUFycmF5KHZhbHVlMiwgcmVzdWx0KTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIHRhZyA9IGdldFRhZyh2YWx1ZTIpLCBpc0Z1bmMgPSB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnOwogICAgICAgIGlmIChpc0J1ZmZlcih2YWx1ZTIpKSB7CiAgICAgICAgICByZXR1cm4gY2xvbmVCdWZmZXIodmFsdWUyLCBpc0RlZXApOwogICAgICAgIH0KICAgICAgICBpZiAodGFnID09IG9iamVjdFRhZyB8fCB0YWcgPT0gYXJnc1RhZyB8fCBpc0Z1bmMgJiYgIW9iamVjdCkgewogICAgICAgICAgaWYgKGlzSG9zdE9iamVjdCh2YWx1ZTIpKSB7CiAgICAgICAgICAgIHJldHVybiBvYmplY3QgPyB2YWx1ZTIgOiB7fTsKICAgICAgICAgIH0KICAgICAgICAgIHJlc3VsdCA9IGluaXRDbG9uZU9iamVjdChpc0Z1bmMgPyB7fSA6IHZhbHVlMik7CiAgICAgICAgICBpZiAoIWlzRGVlcCkgewogICAgICAgICAgICByZXR1cm4gY29weVN5bWJvbHModmFsdWUyLCBiYXNlQXNzaWduKHJlc3VsdCwgdmFsdWUyKSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICghY2xvbmVhYmxlVGFnc1t0YWddKSB7CiAgICAgICAgICAgIHJldHVybiBvYmplY3QgPyB2YWx1ZTIgOiB7fTsKICAgICAgICAgIH0KICAgICAgICAgIHJlc3VsdCA9IGluaXRDbG9uZUJ5VGFnKHZhbHVlMiwgdGFnLCBiYXNlQ2xvbmUsIGlzRGVlcCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjaygpKTsKICAgICAgdmFyIHN0YWNrZWQgPSBzdGFjay5nZXQodmFsdWUyKTsKICAgICAgaWYgKHN0YWNrZWQpIHsKICAgICAgICByZXR1cm4gc3RhY2tlZDsKICAgICAgfQogICAgICBzdGFjay5zZXQodmFsdWUyLCByZXN1bHQpOwogICAgICBpZiAoIWlzQXJyKSB7CiAgICAgICAgdmFyIHByb3BzID0gaXNGdWxsID8gZ2V0QWxsS2V5cyh2YWx1ZTIpIDoga2V5czIodmFsdWUyKTsKICAgICAgfQogICAgICBhcnJheUVhY2gocHJvcHMgfHwgdmFsdWUyLCBmdW5jdGlvbihzdWJWYWx1ZSwga2V5MykgewogICAgICAgIGlmIChwcm9wcykgewogICAgICAgICAga2V5MyA9IHN1YlZhbHVlOwogICAgICAgICAgc3ViVmFsdWUgPSB2YWx1ZTJba2V5M107CiAgICAgICAgfQogICAgICAgIGFzc2lnblZhbHVlKHJlc3VsdCwga2V5MywgYmFzZUNsb25lKHN1YlZhbHVlLCBpc0RlZXAsIGlzRnVsbCwgY3VzdG9taXplciwga2V5MywgdmFsdWUyLCBzdGFjaykpOwogICAgICB9KTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIF9fbmFtZShiYXNlQ2xvbmUsICJiYXNlQ2xvbmUiKTsKICAgIGZ1bmN0aW9uIGJhc2VDcmVhdGUocHJvdG8pIHsKICAgICAgcmV0dXJuIGlzT2JqZWN0Myhwcm90bykgPyBvYmplY3RDcmVhdGUocHJvdG8pIDoge307CiAgICB9CiAgICBfX25hbWUoYmFzZUNyZWF0ZSwgImJhc2VDcmVhdGUiKTsKICAgIGZ1bmN0aW9uIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5c0Z1bmMsIHN5bWJvbHNGdW5jKSB7CiAgICAgIHZhciByZXN1bHQgPSBrZXlzRnVuYyhvYmplY3QpOwogICAgICByZXR1cm4gaXNBcnJheTUob2JqZWN0KSA/IHJlc3VsdCA6IGFycmF5UHVzaChyZXN1bHQsIHN5bWJvbHNGdW5jKG9iamVjdCkpOwogICAgfQogICAgX19uYW1lKGJhc2VHZXRBbGxLZXlzLCAiYmFzZUdldEFsbEtleXMiKTsKICAgIGZ1bmN0aW9uIGJhc2VHZXRUYWcodmFsdWUyKSB7CiAgICAgIHJldHVybiBvYmplY3RUb1N0cmluZzIuY2FsbCh2YWx1ZTIpOwogICAgfQogICAgX19uYW1lKGJhc2VHZXRUYWcsICJiYXNlR2V0VGFnIik7CiAgICBmdW5jdGlvbiBiYXNlSXNOYXRpdmUodmFsdWUyKSB7CiAgICAgIGlmICghaXNPYmplY3QzKHZhbHVlMikgfHwgaXNNYXNrZWQodmFsdWUyKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICB2YXIgcGF0dGVybiA9IGlzRnVuY3Rpb24yKHZhbHVlMikgfHwgaXNIb3N0T2JqZWN0KHZhbHVlMikgPyByZUlzTmF0aXZlIDogcmVJc0hvc3RDdG9yOwogICAgICByZXR1cm4gcGF0dGVybi50ZXN0KHRvU291cmNlKHZhbHVlMikpOwogICAgfQogICAgX19uYW1lKGJhc2VJc05hdGl2ZSwgImJhc2VJc05hdGl2ZSIpOwogICAgZnVuY3Rpb24gYmFzZUtleXMob2JqZWN0KSB7CiAgICAgIGlmICghaXNQcm90b3R5cGUob2JqZWN0KSkgewogICAgICAgIHJldHVybiBuYXRpdmVLZXlzKG9iamVjdCk7CiAgICAgIH0KICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICBmb3IgKHZhciBrZXkyIGluIE9iamVjdChvYmplY3QpKSB7CiAgICAgICAgaWYgKGhhc093blByb3BlcnR5My5jYWxsKG9iamVjdCwga2V5MikgJiYga2V5MiAhPSAiY29uc3RydWN0b3IiKSB7CiAgICAgICAgICByZXN1bHQucHVzaChrZXkyKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIF9fbmFtZShiYXNlS2V5cywgImJhc2VLZXlzIik7CiAgICBmdW5jdGlvbiBjbG9uZUJ1ZmZlcihidWZmZXIyLCBpc0RlZXApIHsKICAgICAgaWYgKGlzRGVlcCkgewogICAgICAgIHJldHVybiBidWZmZXIyLnNsaWNlKCk7CiAgICAgIH0KICAgICAgdmFyIHJlc3VsdCA9IG5ldyBidWZmZXIyLmNvbnN0cnVjdG9yKGJ1ZmZlcjIubGVuZ3RoKTsKICAgICAgYnVmZmVyMi5jb3B5KHJlc3VsdCk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBfX25hbWUoY2xvbmVCdWZmZXIsICJjbG9uZUJ1ZmZlciIpOwogICAgZnVuY3Rpb24gY2xvbmVBcnJheUJ1ZmZlcihhcnJheUJ1ZmZlcikgewogICAgICB2YXIgcmVzdWx0ID0gbmV3IGFycmF5QnVmZmVyLmNvbnN0cnVjdG9yKGFycmF5QnVmZmVyLmJ5dGVMZW5ndGgpOwogICAgICBuZXcgVWludDhBcnJheTIocmVzdWx0KS5zZXQobmV3IFVpbnQ4QXJyYXkyKGFycmF5QnVmZmVyKSk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBfX25hbWUoY2xvbmVBcnJheUJ1ZmZlciwgImNsb25lQXJyYXlCdWZmZXIiKTsKICAgIGZ1bmN0aW9uIGNsb25lRGF0YVZpZXcoZGF0YVZpZXcsIGlzRGVlcCkgewogICAgICB2YXIgYnVmZmVyMiA9IGlzRGVlcCA/IGNsb25lQXJyYXlCdWZmZXIoZGF0YVZpZXcuYnVmZmVyKSA6IGRhdGFWaWV3LmJ1ZmZlcjsKICAgICAgcmV0dXJuIG5ldyBkYXRhVmlldy5jb25zdHJ1Y3RvcihidWZmZXIyLCBkYXRhVmlldy5ieXRlT2Zmc2V0LCBkYXRhVmlldy5ieXRlTGVuZ3RoKTsKICAgIH0KICAgIF9fbmFtZShjbG9uZURhdGFWaWV3LCAiY2xvbmVEYXRhVmlldyIpOwogICAgZnVuY3Rpb24gY2xvbmVNYXAobWFwNywgaXNEZWVwLCBjbG9uZUZ1bmMpIHsKICAgICAgdmFyIGFycmF5ID0gaXNEZWVwID8gY2xvbmVGdW5jKG1hcFRvQXJyYXkobWFwNyksIHRydWUpIDogbWFwVG9BcnJheShtYXA3KTsKICAgICAgcmV0dXJuIGFycmF5UmVkdWNlKGFycmF5LCBhZGRNYXBFbnRyeSwgbmV3IG1hcDcuY29uc3RydWN0b3IoKSk7CiAgICB9CiAgICBfX25hbWUoY2xvbmVNYXAsICJjbG9uZU1hcCIpOwogICAgZnVuY3Rpb24gY2xvbmVSZWdFeHAocmVnZXhwKSB7CiAgICAgIHZhciByZXN1bHQgPSBuZXcgcmVnZXhwLmNvbnN0cnVjdG9yKHJlZ2V4cC5zb3VyY2UsIHJlRmxhZ3MuZXhlYyhyZWdleHApKTsKICAgICAgcmVzdWx0Lmxhc3RJbmRleCA9IHJlZ2V4cC5sYXN0SW5kZXg7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBfX25hbWUoY2xvbmVSZWdFeHAsICJjbG9uZVJlZ0V4cCIpOwogICAgZnVuY3Rpb24gY2xvbmVTZXQoc2V0MiwgaXNEZWVwLCBjbG9uZUZ1bmMpIHsKICAgICAgdmFyIGFycmF5ID0gaXNEZWVwID8gY2xvbmVGdW5jKHNldFRvQXJyYXkoc2V0MiksIHRydWUpIDogc2V0VG9BcnJheShzZXQyKTsKICAgICAgcmV0dXJuIGFycmF5UmVkdWNlKGFycmF5LCBhZGRTZXRFbnRyeSwgbmV3IHNldDIuY29uc3RydWN0b3IoKSk7CiAgICB9CiAgICBfX25hbWUoY2xvbmVTZXQsICJjbG9uZVNldCIpOwogICAgZnVuY3Rpb24gY2xvbmVTeW1ib2woc3ltYm9sKSB7CiAgICAgIHJldHVybiBzeW1ib2xWYWx1ZU9mID8gT2JqZWN0KHN5bWJvbFZhbHVlT2YuY2FsbChzeW1ib2wpKSA6IHt9OwogICAgfQogICAgX19uYW1lKGNsb25lU3ltYm9sLCAiY2xvbmVTeW1ib2wiKTsKICAgIGZ1bmN0aW9uIGNsb25lVHlwZWRBcnJheSh0eXBlZEFycmF5LCBpc0RlZXApIHsKICAgICAgdmFyIGJ1ZmZlcjIgPSBpc0RlZXAgPyBjbG9uZUFycmF5QnVmZmVyKHR5cGVkQXJyYXkuYnVmZmVyKSA6IHR5cGVkQXJyYXkuYnVmZmVyOwogICAgICByZXR1cm4gbmV3IHR5cGVkQXJyYXkuY29uc3RydWN0b3IoYnVmZmVyMiwgdHlwZWRBcnJheS5ieXRlT2Zmc2V0LCB0eXBlZEFycmF5Lmxlbmd0aCk7CiAgICB9CiAgICBfX25hbWUoY2xvbmVUeXBlZEFycmF5LCAiY2xvbmVUeXBlZEFycmF5Iik7CiAgICBmdW5jdGlvbiBjb3B5QXJyYXkoc291cmNlLCBhcnJheSkgewogICAgICB2YXIgaW5kZXgyID0gLTEsIGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7CiAgICAgIGFycmF5IHx8IChhcnJheSA9IEFycmF5KGxlbmd0aCkpOwogICAgICB3aGlsZSAoKytpbmRleDIgPCBsZW5ndGgpIHsKICAgICAgICBhcnJheVtpbmRleDJdID0gc291cmNlW2luZGV4Ml07CiAgICAgIH0KICAgICAgcmV0dXJuIGFycmF5OwogICAgfQogICAgX19uYW1lKGNvcHlBcnJheSwgImNvcHlBcnJheSIpOwogICAgZnVuY3Rpb24gY29weU9iamVjdChzb3VyY2UsIHByb3BzLCBvYmplY3QsIGN1c3RvbWl6ZXIpIHsKICAgICAgb2JqZWN0IHx8IChvYmplY3QgPSB7fSk7CiAgICAgIHZhciBpbmRleDIgPSAtMSwgbGVuZ3RoID0gcHJvcHMubGVuZ3RoOwogICAgICB3aGlsZSAoKytpbmRleDIgPCBsZW5ndGgpIHsKICAgICAgICB2YXIga2V5MiA9IHByb3BzW2luZGV4Ml07CiAgICAgICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplciA/IGN1c3RvbWl6ZXIob2JqZWN0W2tleTJdLCBzb3VyY2Vba2V5Ml0sIGtleTIsIG9iamVjdCwgc291cmNlKSA6IHZvaWQgMDsKICAgICAgICBhc3NpZ25WYWx1ZShvYmplY3QsIGtleTIsIG5ld1ZhbHVlID09PSB2b2lkIDAgPyBzb3VyY2Vba2V5Ml0gOiBuZXdWYWx1ZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIG9iamVjdDsKICAgIH0KICAgIF9fbmFtZShjb3B5T2JqZWN0LCAiY29weU9iamVjdCIpOwogICAgZnVuY3Rpb24gY29weVN5bWJvbHMoc291cmNlLCBvYmplY3QpIHsKICAgICAgcmV0dXJuIGNvcHlPYmplY3Qoc291cmNlLCBnZXRTeW1ib2xzKHNvdXJjZSksIG9iamVjdCk7CiAgICB9CiAgICBfX25hbWUoY29weVN5bWJvbHMsICJjb3B5U3ltYm9scyIpOwogICAgZnVuY3Rpb24gZ2V0QWxsS2V5cyhvYmplY3QpIHsKICAgICAgcmV0dXJuIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5czIsIGdldFN5bWJvbHMpOwogICAgfQogICAgX19uYW1lKGdldEFsbEtleXMsICJnZXRBbGxLZXlzIik7CiAgICBmdW5jdGlvbiBnZXRNYXBEYXRhKG1hcDcsIGtleTIpIHsKICAgICAgdmFyIGRhdGEgPSBtYXA3Ll9fZGF0YV9fOwogICAgICByZXR1cm4gaXNLZXlhYmxlKGtleTIpID8gZGF0YVt0eXBlb2Yga2V5MiA9PSAic3RyaW5nIiA/ICJzdHJpbmciIDogImhhc2giXSA6IGRhdGEubWFwOwogICAgfQogICAgX19uYW1lKGdldE1hcERhdGEsICJnZXRNYXBEYXRhIik7CiAgICBmdW5jdGlvbiBnZXROYXRpdmUob2JqZWN0LCBrZXkyKSB7CiAgICAgIHZhciB2YWx1ZTIgPSBnZXRWYWx1ZShvYmplY3QsIGtleTIpOwogICAgICByZXR1cm4gYmFzZUlzTmF0aXZlKHZhbHVlMikgPyB2YWx1ZTIgOiB2b2lkIDA7CiAgICB9CiAgICBfX25hbWUoZ2V0TmF0aXZlLCAiZ2V0TmF0aXZlIik7CiAgICB2YXIgZ2V0U3ltYm9scyA9IG5hdGl2ZUdldFN5bWJvbHMgPyBvdmVyQXJnKG5hdGl2ZUdldFN5bWJvbHMsIE9iamVjdCkgOiBzdHViQXJyYXk7CiAgICB2YXIgZ2V0VGFnID0gYmFzZUdldFRhZzsKICAgIGlmIChEYXRhVmlldzIgJiYgZ2V0VGFnKG5ldyBEYXRhVmlldzIobmV3IEFycmF5QnVmZmVyKDEpKSkgIT0gZGF0YVZpZXdUYWcgfHwgTWFwMiAmJiBnZXRUYWcobmV3IE1hcDIoKSkgIT0gbWFwVGFnIHx8IFByb21pc2UyICYmIGdldFRhZyhQcm9taXNlMi5yZXNvbHZlKCkpICE9IHByb21pc2VUYWcgfHwgU2V0MiAmJiBnZXRUYWcobmV3IFNldDIoKSkgIT0gc2V0VGFnIHx8IFdlYWtNYXAyICYmIGdldFRhZyhuZXcgV2Vha01hcDIoKSkgIT0gd2Vha01hcFRhZykgewogICAgICBnZXRUYWcgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKHZhbHVlMikgewogICAgICAgIHZhciByZXN1bHQgPSBvYmplY3RUb1N0cmluZzIuY2FsbCh2YWx1ZTIpLCBDdG9yID0gcmVzdWx0ID09IG9iamVjdFRhZyA/IHZhbHVlMi5jb25zdHJ1Y3RvciA6IHZvaWQgMCwgY3RvclN0cmluZyA9IEN0b3IgPyB0b1NvdXJjZShDdG9yKSA6IHZvaWQgMDsKICAgICAgICBpZiAoY3RvclN0cmluZykgewogICAgICAgICAgc3dpdGNoIChjdG9yU3RyaW5nKSB7CiAgICAgICAgICAgIGNhc2UgZGF0YVZpZXdDdG9yU3RyaW5nOgogICAgICAgICAgICAgIHJldHVybiBkYXRhVmlld1RhZzsKICAgICAgICAgICAgY2FzZSBtYXBDdG9yU3RyaW5nOgogICAgICAgICAgICAgIHJldHVybiBtYXBUYWc7CiAgICAgICAgICAgIGNhc2UgcHJvbWlzZUN0b3JTdHJpbmc6CiAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2VUYWc7CiAgICAgICAgICAgIGNhc2Ugc2V0Q3RvclN0cmluZzoKICAgICAgICAgICAgICByZXR1cm4gc2V0VGFnOwogICAgICAgICAgICBjYXNlIHdlYWtNYXBDdG9yU3RyaW5nOgogICAgICAgICAgICAgIHJldHVybiB3ZWFrTWFwVGFnOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9LCAiZ2V0VGFnIik7CiAgICB9CiAgICBmdW5jdGlvbiBpbml0Q2xvbmVBcnJheShhcnJheSkgewogICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLCByZXN1bHQgPSBhcnJheS5jb25zdHJ1Y3RvcihsZW5ndGgpOwogICAgICBpZiAobGVuZ3RoICYmIHR5cGVvZiBhcnJheVswXSA9PSAic3RyaW5nIiAmJiBoYXNPd25Qcm9wZXJ0eTMuY2FsbChhcnJheSwgImluZGV4IikpIHsKICAgICAgICByZXN1bHQuaW5kZXggPSBhcnJheS5pbmRleDsKICAgICAgICByZXN1bHQuaW5wdXQgPSBhcnJheS5pbnB1dDsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgX19uYW1lKGluaXRDbG9uZUFycmF5LCAiaW5pdENsb25lQXJyYXkiKTsKICAgIGZ1bmN0aW9uIGluaXRDbG9uZU9iamVjdChvYmplY3QpIHsKICAgICAgcmV0dXJuIHR5cGVvZiBvYmplY3QuY29uc3RydWN0b3IgPT0gImZ1bmN0aW9uIiAmJiAhaXNQcm90b3R5cGUob2JqZWN0KSA/IGJhc2VDcmVhdGUoZ2V0UHJvdG90eXBlKG9iamVjdCkpIDoge307CiAgICB9CiAgICBfX25hbWUoaW5pdENsb25lT2JqZWN0LCAiaW5pdENsb25lT2JqZWN0Iik7CiAgICBmdW5jdGlvbiBpbml0Q2xvbmVCeVRhZyhvYmplY3QsIHRhZywgY2xvbmVGdW5jLCBpc0RlZXApIHsKICAgICAgdmFyIEN0b3IgPSBvYmplY3QuY29uc3RydWN0b3I7CiAgICAgIHN3aXRjaCAodGFnKSB7CiAgICAgICAgY2FzZSBhcnJheUJ1ZmZlclRhZzoKICAgICAgICAgIHJldHVybiBjbG9uZUFycmF5QnVmZmVyKG9iamVjdCk7CiAgICAgICAgY2FzZSBib29sVGFnOgogICAgICAgIGNhc2UgZGF0ZVRhZzoKICAgICAgICAgIHJldHVybiBuZXcgQ3Rvcigrb2JqZWN0KTsKICAgICAgICBjYXNlIGRhdGFWaWV3VGFnOgogICAgICAgICAgcmV0dXJuIGNsb25lRGF0YVZpZXcob2JqZWN0LCBpc0RlZXApOwogICAgICAgIGNhc2UgZmxvYXQzMlRhZzoKICAgICAgICBjYXNlIGZsb2F0NjRUYWc6CiAgICAgICAgY2FzZSBpbnQ4VGFnOgogICAgICAgIGNhc2UgaW50MTZUYWc6CiAgICAgICAgY2FzZSBpbnQzMlRhZzoKICAgICAgICBjYXNlIHVpbnQ4VGFnOgogICAgICAgIGNhc2UgdWludDhDbGFtcGVkVGFnOgogICAgICAgIGNhc2UgdWludDE2VGFnOgogICAgICAgIGNhc2UgdWludDMyVGFnOgogICAgICAgICAgcmV0dXJuIGNsb25lVHlwZWRBcnJheShvYmplY3QsIGlzRGVlcCk7CiAgICAgICAgY2FzZSBtYXBUYWc6CiAgICAgICAgICByZXR1cm4gY2xvbmVNYXAob2JqZWN0LCBpc0RlZXAsIGNsb25lRnVuYyk7CiAgICAgICAgY2FzZSBudW1iZXJUYWc6CiAgICAgICAgY2FzZSBzdHJpbmdUYWc6CiAgICAgICAgICByZXR1cm4gbmV3IEN0b3Iob2JqZWN0KTsKICAgICAgICBjYXNlIHJlZ2V4cFRhZzoKICAgICAgICAgIHJldHVybiBjbG9uZVJlZ0V4cChvYmplY3QpOwogICAgICAgIGNhc2Ugc2V0VGFnOgogICAgICAgICAgcmV0dXJuIGNsb25lU2V0KG9iamVjdCwgaXNEZWVwLCBjbG9uZUZ1bmMpOwogICAgICAgIGNhc2Ugc3ltYm9sVGFnOgogICAgICAgICAgcmV0dXJuIGNsb25lU3ltYm9sKG9iamVjdCk7CiAgICAgIH0KICAgIH0KICAgIF9fbmFtZShpbml0Q2xvbmVCeVRhZywgImluaXRDbG9uZUJ5VGFnIik7CiAgICBmdW5jdGlvbiBpc0luZGV4KHZhbHVlMiwgbGVuZ3RoKSB7CiAgICAgIGxlbmd0aCA9IGxlbmd0aCA9PSBudWxsID8gTUFYX1NBRkVfSU5URUdFUiA6IGxlbmd0aDsKICAgICAgcmV0dXJuICEhbGVuZ3RoICYmICh0eXBlb2YgdmFsdWUyID09ICJudW1iZXIiIHx8IHJlSXNVaW50LnRlc3QodmFsdWUyKSkgJiYgKHZhbHVlMiA+IC0xICYmIHZhbHVlMiAlIDEgPT0gMCAmJiB2YWx1ZTIgPCBsZW5ndGgpOwogICAgfQogICAgX19uYW1lKGlzSW5kZXgsICJpc0luZGV4Iik7CiAgICBmdW5jdGlvbiBpc0tleWFibGUodmFsdWUyKSB7CiAgICAgIHZhciB0eXBlNSA9IHR5cGVvZiB2YWx1ZTI7CiAgICAgIHJldHVybiB0eXBlNSA9PSAic3RyaW5nIiB8fCB0eXBlNSA9PSAibnVtYmVyIiB8fCB0eXBlNSA9PSAic3ltYm9sIiB8fCB0eXBlNSA9PSAiYm9vbGVhbiIgPyB2YWx1ZTIgIT09ICJfX3Byb3RvX18iIDogdmFsdWUyID09PSBudWxsOwogICAgfQogICAgX19uYW1lKGlzS2V5YWJsZSwgImlzS2V5YWJsZSIpOwogICAgZnVuY3Rpb24gaXNNYXNrZWQoZnVuYykgewogICAgICByZXR1cm4gISFtYXNrU3JjS2V5ICYmIG1hc2tTcmNLZXkgaW4gZnVuYzsKICAgIH0KICAgIF9fbmFtZShpc01hc2tlZCwgImlzTWFza2VkIik7CiAgICBmdW5jdGlvbiBpc1Byb3RvdHlwZSh2YWx1ZTIpIHsKICAgICAgdmFyIEN0b3IgPSB2YWx1ZTIgJiYgdmFsdWUyLmNvbnN0cnVjdG9yLCBwcm90byA9IHR5cGVvZiBDdG9yID09ICJmdW5jdGlvbiIgJiYgQ3Rvci5wcm90b3R5cGUgfHwgb2JqZWN0UHJvdG8yOwogICAgICByZXR1cm4gdmFsdWUyID09PSBwcm90bzsKICAgIH0KICAgIF9fbmFtZShpc1Byb3RvdHlwZSwgImlzUHJvdG90eXBlIik7CiAgICBmdW5jdGlvbiB0b1NvdXJjZShmdW5jKSB7CiAgICAgIGlmIChmdW5jICE9IG51bGwpIHsKICAgICAgICB0cnkgewogICAgICAgICAgcmV0dXJuIGZ1bmNUb1N0cmluZy5jYWxsKGZ1bmMpOwogICAgICAgIH0gY2F0Y2ggKGUxMCkgewogICAgICAgIH0KICAgICAgICB0cnkgewogICAgICAgICAgcmV0dXJuIGZ1bmMgKyAiIjsKICAgICAgICB9IGNhdGNoIChlMTApIHsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuICIiOwogICAgfQogICAgX19uYW1lKHRvU291cmNlLCAidG9Tb3VyY2UiKTsKICAgIGZ1bmN0aW9uIGNsb25lRGVlcCh2YWx1ZTIpIHsKICAgICAgcmV0dXJuIGJhc2VDbG9uZSh2YWx1ZTIsIHRydWUsIHRydWUpOwogICAgfQogICAgX19uYW1lKGNsb25lRGVlcCwgImNsb25lRGVlcCIpOwogICAgZnVuY3Rpb24gZXEodmFsdWUyLCBvdGhlcikgewogICAgICByZXR1cm4gdmFsdWUyID09PSBvdGhlciB8fCB2YWx1ZTIgIT09IHZhbHVlMiAmJiBvdGhlciAhPT0gb3RoZXI7CiAgICB9CiAgICBfX25hbWUoZXEsICJlcSIpOwogICAgZnVuY3Rpb24gaXNBcmd1bWVudHModmFsdWUyKSB7CiAgICAgIHJldHVybiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZTIpICYmIGhhc093blByb3BlcnR5My5jYWxsKHZhbHVlMiwgImNhbGxlZSIpICYmICghcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh2YWx1ZTIsICJjYWxsZWUiKSB8fCBvYmplY3RUb1N0cmluZzIuY2FsbCh2YWx1ZTIpID09IGFyZ3NUYWcpOwogICAgfQogICAgX19uYW1lKGlzQXJndW1lbnRzLCAiaXNBcmd1bWVudHMiKTsKICAgIHZhciBpc0FycmF5NSA9IEFycmF5LmlzQXJyYXk7CiAgICBmdW5jdGlvbiBpc0FycmF5TGlrZTIodmFsdWUyKSB7CiAgICAgIHJldHVybiB2YWx1ZTIgIT0gbnVsbCAmJiBpc0xlbmd0aCh2YWx1ZTIubGVuZ3RoKSAmJiAhaXNGdW5jdGlvbjIodmFsdWUyKTsKICAgIH0KICAgIF9fbmFtZShpc0FycmF5TGlrZTIsICJpc0FycmF5TGlrZSIpOwogICAgZnVuY3Rpb24gaXNBcnJheUxpa2VPYmplY3QodmFsdWUyKSB7CiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUyKSAmJiBpc0FycmF5TGlrZTIodmFsdWUyKTsKICAgIH0KICAgIF9fbmFtZShpc0FycmF5TGlrZU9iamVjdCwgImlzQXJyYXlMaWtlT2JqZWN0Iik7CiAgICB2YXIgaXNCdWZmZXIgPSBuYXRpdmVJc0J1ZmZlciB8fCBzdHViRmFsc2U7CiAgICBmdW5jdGlvbiBpc0Z1bmN0aW9uMih2YWx1ZTIpIHsKICAgICAgdmFyIHRhZyA9IGlzT2JqZWN0Myh2YWx1ZTIpID8gb2JqZWN0VG9TdHJpbmcyLmNhbGwodmFsdWUyKSA6ICIiOwogICAgICByZXR1cm4gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZzsKICAgIH0KICAgIF9fbmFtZShpc0Z1bmN0aW9uMiwgImlzRnVuY3Rpb24iKTsKICAgIGZ1bmN0aW9uIGlzTGVuZ3RoKHZhbHVlMikgewogICAgICByZXR1cm4gdHlwZW9mIHZhbHVlMiA9PSAibnVtYmVyIiAmJiB2YWx1ZTIgPiAtMSAmJiB2YWx1ZTIgJSAxID09IDAgJiYgdmFsdWUyIDw9IE1BWF9TQUZFX0lOVEVHRVI7CiAgICB9CiAgICBfX25hbWUoaXNMZW5ndGgsICJpc0xlbmd0aCIpOwogICAgZnVuY3Rpb24gaXNPYmplY3QzKHZhbHVlMikgewogICAgICB2YXIgdHlwZTUgPSB0eXBlb2YgdmFsdWUyOwogICAgICByZXR1cm4gISF2YWx1ZTIgJiYgKHR5cGU1ID09ICJvYmplY3QiIHx8IHR5cGU1ID09ICJmdW5jdGlvbiIpOwogICAgfQogICAgX19uYW1lKGlzT2JqZWN0MywgImlzT2JqZWN0Iik7CiAgICBmdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUyKSB7CiAgICAgIHJldHVybiAhIXZhbHVlMiAmJiB0eXBlb2YgdmFsdWUyID09ICJvYmplY3QiOwogICAgfQogICAgX19uYW1lKGlzT2JqZWN0TGlrZSwgImlzT2JqZWN0TGlrZSIpOwogICAgZnVuY3Rpb24ga2V5czIob2JqZWN0KSB7CiAgICAgIHJldHVybiBpc0FycmF5TGlrZTIob2JqZWN0KSA/IGFycmF5TGlrZUtleXMob2JqZWN0KSA6IGJhc2VLZXlzKG9iamVjdCk7CiAgICB9CiAgICBfX25hbWUoa2V5czIsICJrZXlzIik7CiAgICBmdW5jdGlvbiBzdHViQXJyYXkoKSB7CiAgICAgIHJldHVybiBbXTsKICAgIH0KICAgIF9fbmFtZShzdHViQXJyYXksICJzdHViQXJyYXkiKTsKICAgIGZ1bmN0aW9uIHN0dWJGYWxzZSgpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgX19uYW1lKHN0dWJGYWxzZSwgInN0dWJGYWxzZSIpOwogICAgbW9kdWxlLmV4cG9ydHMgPSBjbG9uZURlZXA7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeUAyLjEuMC9ub2RlX21vZHVsZXMvZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnkvaW5kZXguanMKdmFyIHJlcXVpcmVfZmFzdF9qc29uX3N0YWJsZV9zdHJpbmdpZnkgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2Zhc3QtanNvbi1zdGFibGUtc3RyaW5naWZ5QDIuMS4wL25vZGVfbW9kdWxlcy9mYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeS9pbmRleC5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGRhdGEsIG9wdHMpIHsKICAgICAgaWYgKCFvcHRzKSBvcHRzID0ge307CiAgICAgIGlmICh0eXBlb2Ygb3B0cyA9PT0gImZ1bmN0aW9uIikgb3B0cyA9IHsgY21wOiBvcHRzIH07CiAgICAgIHZhciBjeWNsZXMgPSB0eXBlb2Ygb3B0cy5jeWNsZXMgPT09ICJib29sZWFuIiA/IG9wdHMuY3ljbGVzIDogZmFsc2U7CiAgICAgIHZhciBjbXAgPSBvcHRzLmNtcCAmJiAvKiBAX19QVVJFX18gKi8gKGZ1bmN0aW9uKGY2KSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUyKSB7CiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oYTQsIGI0KSB7CiAgICAgICAgICAgIHZhciBhb2JqID0geyBrZXk6IGE0LCB2YWx1ZTogbm9kZTJbYTRdIH07CiAgICAgICAgICAgIHZhciBib2JqID0geyBrZXk6IGI0LCB2YWx1ZTogbm9kZTJbYjRdIH07CiAgICAgICAgICAgIHJldHVybiBmNihhb2JqLCBib2JqKTsKICAgICAgICAgIH07CiAgICAgICAgfTsKICAgICAgfSkob3B0cy5jbXApOwogICAgICB2YXIgc2VlbiA9IFtdOwogICAgICByZXR1cm4gKC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGZ1bmN0aW9uIHN0cmluZ2lmeTcobm9kZTIpIHsKICAgICAgICBpZiAobm9kZTIgJiYgbm9kZTIudG9KU09OICYmIHR5cGVvZiBub2RlMi50b0pTT04gPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgIG5vZGUyID0gbm9kZTIudG9KU09OKCk7CiAgICAgICAgfQogICAgICAgIGlmIChub2RlMiA9PT0gdm9pZCAwKSByZXR1cm47CiAgICAgICAgaWYgKHR5cGVvZiBub2RlMiA9PSAibnVtYmVyIikgcmV0dXJuIGlzRmluaXRlKG5vZGUyKSA/ICIiICsgbm9kZTIgOiAibnVsbCI7CiAgICAgICAgaWYgKHR5cGVvZiBub2RlMiAhPT0gIm9iamVjdCIpIHJldHVybiBKU09OLnN0cmluZ2lmeShub2RlMik7CiAgICAgICAgdmFyIGkxMCwgb3V0OwogICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5vZGUyKSkgewogICAgICAgICAgb3V0ID0gIlsiOwogICAgICAgICAgZm9yIChpMTAgPSAwOyBpMTAgPCBub2RlMi5sZW5ndGg7IGkxMCsrKSB7CiAgICAgICAgICAgIGlmIChpMTApIG91dCArPSAiLCI7CiAgICAgICAgICAgIG91dCArPSBzdHJpbmdpZnk3KG5vZGUyW2kxMF0pIHx8ICJudWxsIjsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBvdXQgKyAiXSI7CiAgICAgICAgfQogICAgICAgIGlmIChub2RlMiA9PT0gbnVsbCkgcmV0dXJuICJudWxsIjsKICAgICAgICBpZiAoc2Vlbi5pbmRleE9mKG5vZGUyKSAhPT0gLTEpIHsKICAgICAgICAgIGlmIChjeWNsZXMpIHJldHVybiBKU09OLnN0cmluZ2lmeSgiX19jeWNsZV9fIik7CiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJDb252ZXJ0aW5nIGNpcmN1bGFyIHN0cnVjdHVyZSB0byBKU09OIik7CiAgICAgICAgfQogICAgICAgIHZhciBzZWVuSW5kZXggPSBzZWVuLnB1c2gobm9kZTIpIC0gMTsKICAgICAgICB2YXIga2V5czIgPSBPYmplY3Qua2V5cyhub2RlMikuc29ydChjbXAgJiYgY21wKG5vZGUyKSk7CiAgICAgICAgb3V0ID0gIiI7CiAgICAgICAgZm9yIChpMTAgPSAwOyBpMTAgPCBrZXlzMi5sZW5ndGg7IGkxMCsrKSB7CiAgICAgICAgICB2YXIga2V5MiA9IGtleXMyW2kxMF07CiAgICAgICAgICB2YXIgdmFsdWUyID0gc3RyaW5naWZ5Nyhub2RlMltrZXkyXSk7CiAgICAgICAgICBpZiAoIXZhbHVlMikgY29udGludWU7CiAgICAgICAgICBpZiAob3V0KSBvdXQgKz0gIiwiOwogICAgICAgICAgb3V0ICs9IEpTT04uc3RyaW5naWZ5KGtleTIpICsgIjoiICsgdmFsdWUyOwogICAgICAgIH0KICAgICAgICBzZWVuLnNwbGljZShzZWVuSW5kZXgsIDEpOwogICAgICAgIHJldHVybiAieyIgKyBvdXQgKyAifSI7CiAgICAgIH0pLCAic3RyaW5naWZ5IikpKGRhdGEpOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL2NvbW1vbi5qcwp2YXIgcmVxdWlyZV9jb21tb24gPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL2NvbW1vbi5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBmdW5jdGlvbiBpc05vdGhpbmcoc3ViamVjdCkgewogICAgICByZXR1cm4gdHlwZW9mIHN1YmplY3QgPT09ICJ1bmRlZmluZWQiIHx8IHN1YmplY3QgPT09IG51bGw7CiAgICB9CiAgICBfX25hbWUoaXNOb3RoaW5nLCAiaXNOb3RoaW5nIik7CiAgICBmdW5jdGlvbiBpc09iamVjdDMoc3ViamVjdCkgewogICAgICByZXR1cm4gdHlwZW9mIHN1YmplY3QgPT09ICJvYmplY3QiICYmIHN1YmplY3QgIT09IG51bGw7CiAgICB9CiAgICBfX25hbWUoaXNPYmplY3QzLCAiaXNPYmplY3QiKTsKICAgIGZ1bmN0aW9uIHRvQXJyYXkyKHNlcXVlbmNlKSB7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KHNlcXVlbmNlKSkgcmV0dXJuIHNlcXVlbmNlOwogICAgICBlbHNlIGlmIChpc05vdGhpbmcoc2VxdWVuY2UpKSByZXR1cm4gW107CiAgICAgIHJldHVybiBbc2VxdWVuY2VdOwogICAgfQogICAgX19uYW1lKHRvQXJyYXkyLCAidG9BcnJheSIpOwogICAgZnVuY3Rpb24gZXh0ZW5kMyh0YXJnZXQsIHNvdXJjZSkgewogICAgICB2YXIgaW5kZXgyLCBsZW5ndGgsIGtleTIsIHNvdXJjZUtleXM7CiAgICAgIGlmIChzb3VyY2UpIHsKICAgICAgICBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsKICAgICAgICBmb3IgKGluZGV4MiA9IDAsIGxlbmd0aCA9IHNvdXJjZUtleXMubGVuZ3RoOyBpbmRleDIgPCBsZW5ndGg7IGluZGV4MiArPSAxKSB7CiAgICAgICAgICBrZXkyID0gc291cmNlS2V5c1tpbmRleDJdOwogICAgICAgICAgdGFyZ2V0W2tleTJdID0gc291cmNlW2tleTJdOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdGFyZ2V0OwogICAgfQogICAgX19uYW1lKGV4dGVuZDMsICJleHRlbmQiKTsKICAgIGZ1bmN0aW9uIHJlcGVhdDMoc3RyaW5nMywgY291bnQyKSB7CiAgICAgIHZhciByZXN1bHQgPSAiIiwgY3ljbGU7CiAgICAgIGZvciAoY3ljbGUgPSAwOyBjeWNsZSA8IGNvdW50MjsgY3ljbGUgKz0gMSkgewogICAgICAgIHJlc3VsdCArPSBzdHJpbmczOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBfX25hbWUocmVwZWF0MywgInJlcGVhdCIpOwogICAgZnVuY3Rpb24gaXNOZWdhdGl2ZVplcm8obnVtYmVyMikgewogICAgICByZXR1cm4gbnVtYmVyMiA9PT0gMCAmJiBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgPT09IDEgLyBudW1iZXIyOwogICAgfQogICAgX19uYW1lKGlzTmVnYXRpdmVaZXJvLCAiaXNOZWdhdGl2ZVplcm8iKTsKICAgIG1vZHVsZS5leHBvcnRzLmlzTm90aGluZyA9IGlzTm90aGluZzsKICAgIG1vZHVsZS5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3QzOwogICAgbW9kdWxlLmV4cG9ydHMudG9BcnJheSA9IHRvQXJyYXkyOwogICAgbW9kdWxlLmV4cG9ydHMucmVwZWF0ID0gcmVwZWF0MzsKICAgIG1vZHVsZS5leHBvcnRzLmlzTmVnYXRpdmVaZXJvID0gaXNOZWdhdGl2ZVplcm87CiAgICBtb2R1bGUuZXhwb3J0cy5leHRlbmQgPSBleHRlbmQzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvZXhjZXB0aW9uLmpzCnZhciByZXF1aXJlX2V4Y2VwdGlvbiA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvZXhjZXB0aW9uLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIGZ1bmN0aW9uIFlBTUxFeGNlcHRpb24ocmVhc29uLCBtYXJrMikgewogICAgICBFcnJvci5jYWxsKHRoaXMpOwogICAgICB0aGlzLm5hbWUgPSAiWUFNTEV4Y2VwdGlvbiI7CiAgICAgIHRoaXMucmVhc29uID0gcmVhc29uOwogICAgICB0aGlzLm1hcmsgPSBtYXJrMjsKICAgICAgdGhpcy5tZXNzYWdlID0gKHRoaXMucmVhc29uIHx8ICIodW5rbm93biByZWFzb24pIikgKyAodGhpcy5tYXJrID8gIiAiICsgdGhpcy5tYXJrLnRvU3RyaW5nKCkgOiAiIik7CiAgICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkgewogICAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuc3RhY2sgPSBuZXcgRXJyb3IoKS5zdGFjayB8fCAiIjsKICAgICAgfQogICAgfQogICAgX19uYW1lKFlBTUxFeGNlcHRpb24sICJZQU1MRXhjZXB0aW9uIik7CiAgICBZQU1MRXhjZXB0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTsKICAgIFlBTUxFeGNlcHRpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gWUFNTEV4Y2VwdGlvbjsKICAgIFlBTUxFeGNlcHRpb24ucHJvdG90eXBlLnRvU3RyaW5nID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbiB0b1N0cmluZzMoY29tcGFjdCkgewogICAgICB2YXIgcmVzdWx0ID0gdGhpcy5uYW1lICsgIjogIjsKICAgICAgcmVzdWx0ICs9IHRoaXMucmVhc29uIHx8ICIodW5rbm93biByZWFzb24pIjsKICAgICAgaWYgKCFjb21wYWN0ICYmIHRoaXMubWFyaykgewogICAgICAgIHJlc3VsdCArPSAiICIgKyB0aGlzLm1hcmsudG9TdHJpbmcoKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfSwgInRvU3RyaW5nIik7CiAgICBtb2R1bGUuZXhwb3J0cyA9IFlBTUxFeGNlcHRpb247CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9tYXJrLmpzCnZhciByZXF1aXJlX21hcmsgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL21hcmsuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIGNvbW1vbiA9IHJlcXVpcmVfY29tbW9uKCk7CiAgICBmdW5jdGlvbiBNYXJrKG5hbWUsIGJ1ZmZlcjIsIHBvc2l0aW9uMywgbGluZSwgY29sdW1uKSB7CiAgICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyMjsKICAgICAgdGhpcy5wb3NpdGlvbiA9IHBvc2l0aW9uMzsKICAgICAgdGhpcy5saW5lID0gbGluZTsKICAgICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47CiAgICB9CiAgICBfX25hbWUoTWFyaywgIk1hcmsiKTsKICAgIE1hcmsucHJvdG90eXBlLmdldFNuaXBwZXQgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uIGdldFNuaXBwZXQoaW5kZW50MywgbWF4TGVuZ3RoKSB7CiAgICAgIHZhciBoZWFkMiwgc3RhcnQsIHRhaWwsIGVuZCwgc25pcHBldDsKICAgICAgaWYgKCF0aGlzLmJ1ZmZlcikgcmV0dXJuIG51bGw7CiAgICAgIGluZGVudDMgPSBpbmRlbnQzIHx8IDQ7CiAgICAgIG1heExlbmd0aCA9IG1heExlbmd0aCB8fCA3NTsKICAgICAgaGVhZDIgPSAiIjsKICAgICAgc3RhcnQgPSB0aGlzLnBvc2l0aW9uOwogICAgICB3aGlsZSAoc3RhcnQgPiAwICYmICJcMFxyXG5ceDg1XHUyMDI4XHUyMDI5Ii5pbmRleE9mKHRoaXMuYnVmZmVyLmNoYXJBdChzdGFydCAtIDEpKSA9PT0gLTEpIHsKICAgICAgICBzdGFydCAtPSAxOwogICAgICAgIGlmICh0aGlzLnBvc2l0aW9uIC0gc3RhcnQgPiBtYXhMZW5ndGggLyAyIC0gMSkgewogICAgICAgICAgaGVhZDIgPSAiIC4uLiAiOwogICAgICAgICAgc3RhcnQgKz0gNTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICB0YWlsID0gIiI7CiAgICAgIGVuZCA9IHRoaXMucG9zaXRpb247CiAgICAgIHdoaWxlIChlbmQgPCB0aGlzLmJ1ZmZlci5sZW5ndGggJiYgIlwwXHJcblx4ODVcdTIwMjhcdTIwMjkiLmluZGV4T2YodGhpcy5idWZmZXIuY2hhckF0KGVuZCkpID09PSAtMSkgewogICAgICAgIGVuZCArPSAxOwogICAgICAgIGlmIChlbmQgLSB0aGlzLnBvc2l0aW9uID4gbWF4TGVuZ3RoIC8gMiAtIDEpIHsKICAgICAgICAgIHRhaWwgPSAiIC4uLiAiOwogICAgICAgICAgZW5kIC09IDU7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgc25pcHBldCA9IHRoaXMuYnVmZmVyLnNsaWNlKHN0YXJ0LCBlbmQpOwogICAgICByZXR1cm4gY29tbW9uLnJlcGVhdCgiICIsIGluZGVudDMpICsgaGVhZDIgKyBzbmlwcGV0ICsgdGFpbCArICJcbiIgKyBjb21tb24ucmVwZWF0KCIgIiwgaW5kZW50MyArIHRoaXMucG9zaXRpb24gLSBzdGFydCArIGhlYWQyLmxlbmd0aCkgKyAiXiI7CiAgICB9LCAiZ2V0U25pcHBldCIpOwogICAgTWFyay5wcm90b3R5cGUudG9TdHJpbmcgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uIHRvU3RyaW5nMyhjb21wYWN0KSB7CiAgICAgIHZhciBzbmlwcGV0LCB3aGVyZSA9ICIiOwogICAgICBpZiAodGhpcy5uYW1lKSB7CiAgICAgICAgd2hlcmUgKz0gJ2luICInICsgdGhpcy5uYW1lICsgJyIgJzsKICAgICAgfQogICAgICB3aGVyZSArPSAiYXQgbGluZSAiICsgKHRoaXMubGluZSArIDEpICsgIiwgY29sdW1uICIgKyAodGhpcy5jb2x1bW4gKyAxKTsKICAgICAgaWYgKCFjb21wYWN0KSB7CiAgICAgICAgc25pcHBldCA9IHRoaXMuZ2V0U25pcHBldCgpOwogICAgICAgIGlmIChzbmlwcGV0KSB7CiAgICAgICAgICB3aGVyZSArPSAiOlxuIiArIHNuaXBwZXQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB3aGVyZTsKICAgIH0sICJ0b1N0cmluZyIpOwogICAgbW9kdWxlLmV4cG9ydHMgPSBNYXJrOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS5qcwp2YXIgcmVxdWlyZV90eXBlID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBZQU1MRXhjZXB0aW9uID0gcmVxdWlyZV9leGNlcHRpb24oKTsKICAgIHZhciBUWVBFX0NPTlNUUlVDVE9SX09QVElPTlMgPSBbCiAgICAgICJraW5kIiwKICAgICAgInJlc29sdmUiLAogICAgICAiY29uc3RydWN0IiwKICAgICAgImluc3RhbmNlT2YiLAogICAgICAicHJlZGljYXRlIiwKICAgICAgInJlcHJlc2VudCIsCiAgICAgICJkZWZhdWx0U3R5bGUiLAogICAgICAic3R5bGVBbGlhc2VzIgogICAgXTsKICAgIHZhciBZQU1MX05PREVfS0lORFMgPSBbCiAgICAgICJzY2FsYXIiLAogICAgICAic2VxdWVuY2UiLAogICAgICAibWFwcGluZyIKICAgIF07CiAgICBmdW5jdGlvbiBjb21waWxlU3R5bGVBbGlhc2VzKG1hcDcpIHsKICAgICAgdmFyIHJlc3VsdCA9IHt9OwogICAgICBpZiAobWFwNyAhPT0gbnVsbCkgewogICAgICAgIE9iamVjdC5rZXlzKG1hcDcpLmZvckVhY2goZnVuY3Rpb24oc3R5bGUpIHsKICAgICAgICAgIG1hcDdbc3R5bGVdLmZvckVhY2goZnVuY3Rpb24oYWxpYXMpIHsKICAgICAgICAgICAgcmVzdWx0W1N0cmluZyhhbGlhcyldID0gc3R5bGU7CiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgX19uYW1lKGNvbXBpbGVTdHlsZUFsaWFzZXMsICJjb21waWxlU3R5bGVBbGlhc2VzIik7CiAgICBmdW5jdGlvbiBUeXBlKHRhZywgb3B0aW9ucykgewogICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKICAgICAgT2JqZWN0LmtleXMob3B0aW9ucykuZm9yRWFjaChmdW5jdGlvbihuYW1lKSB7CiAgICAgICAgaWYgKFRZUEVfQ09OU1RSVUNUT1JfT1BUSU9OUy5pbmRleE9mKG5hbWUpID09PSAtMSkgewogICAgICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ1Vua25vd24gb3B0aW9uICInICsgbmFtZSArICciIGlzIG1ldCBpbiBkZWZpbml0aW9uIG9mICInICsgdGFnICsgJyIgWUFNTCB0eXBlLicpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHRoaXMudGFnID0gdGFnOwogICAgICB0aGlzLmtpbmQgPSBvcHRpb25zWyJraW5kIl0gfHwgbnVsbDsKICAgICAgdGhpcy5yZXNvbHZlID0gb3B0aW9uc1sicmVzb2x2ZSJdIHx8IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9OwogICAgICB0aGlzLmNvbnN0cnVjdCA9IG9wdGlvbnNbImNvbnN0cnVjdCJdIHx8IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICByZXR1cm4gZGF0YTsKICAgICAgfTsKICAgICAgdGhpcy5pbnN0YW5jZU9mID0gb3B0aW9uc1siaW5zdGFuY2VPZiJdIHx8IG51bGw7CiAgICAgIHRoaXMucHJlZGljYXRlID0gb3B0aW9uc1sicHJlZGljYXRlIl0gfHwgbnVsbDsKICAgICAgdGhpcy5yZXByZXNlbnQgPSBvcHRpb25zWyJyZXByZXNlbnQiXSB8fCBudWxsOwogICAgICB0aGlzLmRlZmF1bHRTdHlsZSA9IG9wdGlvbnNbImRlZmF1bHRTdHlsZSJdIHx8IG51bGw7CiAgICAgIHRoaXMuc3R5bGVBbGlhc2VzID0gY29tcGlsZVN0eWxlQWxpYXNlcyhvcHRpb25zWyJzdHlsZUFsaWFzZXMiXSB8fCBudWxsKTsKICAgICAgaWYgKFlBTUxfTk9ERV9LSU5EUy5pbmRleE9mKHRoaXMua2luZCkgPT09IC0xKSB7CiAgICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ1Vua25vd24ga2luZCAiJyArIHRoaXMua2luZCArICciIGlzIHNwZWNpZmllZCBmb3IgIicgKyB0YWcgKyAnIiBZQU1MIHR5cGUuJyk7CiAgICAgIH0KICAgIH0KICAgIF9fbmFtZShUeXBlLCAiVHlwZSIpOwogICAgbW9kdWxlLmV4cG9ydHMgPSBUeXBlOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hLmpzCnZhciByZXF1aXJlX3NjaGVtYSA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBjb21tb24gPSByZXF1aXJlX2NvbW1vbigpOwogICAgdmFyIFlBTUxFeGNlcHRpb24gPSByZXF1aXJlX2V4Y2VwdGlvbigpOwogICAgdmFyIFR5cGUgPSByZXF1aXJlX3R5cGUoKTsKICAgIGZ1bmN0aW9uIGNvbXBpbGVMaXN0KHNjaGVtYSwgbmFtZSwgcmVzdWx0KSB7CiAgICAgIHZhciBleGNsdWRlID0gW107CiAgICAgIHNjaGVtYS5pbmNsdWRlLmZvckVhY2goZnVuY3Rpb24oaW5jbHVkZWRTY2hlbWEpIHsKICAgICAgICByZXN1bHQgPSBjb21waWxlTGlzdChpbmNsdWRlZFNjaGVtYSwgbmFtZSwgcmVzdWx0KTsKICAgICAgfSk7CiAgICAgIHNjaGVtYVtuYW1lXS5mb3JFYWNoKGZ1bmN0aW9uKGN1cnJlbnRUeXBlKSB7CiAgICAgICAgcmVzdWx0LmZvckVhY2goZnVuY3Rpb24ocHJldmlvdXNUeXBlLCBwcmV2aW91c0luZGV4KSB7CiAgICAgICAgICBpZiAocHJldmlvdXNUeXBlLnRhZyA9PT0gY3VycmVudFR5cGUudGFnICYmIHByZXZpb3VzVHlwZS5raW5kID09PSBjdXJyZW50VHlwZS5raW5kKSB7CiAgICAgICAgICAgIGV4Y2x1ZGUucHVzaChwcmV2aW91c0luZGV4KTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICByZXN1bHQucHVzaChjdXJyZW50VHlwZSk7CiAgICAgIH0pOwogICAgICByZXR1cm4gcmVzdWx0LmZpbHRlcihmdW5jdGlvbih0eXBlNSwgaW5kZXgyKSB7CiAgICAgICAgcmV0dXJuIGV4Y2x1ZGUuaW5kZXhPZihpbmRleDIpID09PSAtMTsKICAgICAgfSk7CiAgICB9CiAgICBfX25hbWUoY29tcGlsZUxpc3QsICJjb21waWxlTGlzdCIpOwogICAgZnVuY3Rpb24gY29tcGlsZU1hcCgpIHsKICAgICAgdmFyIHJlc3VsdCA9IHsKICAgICAgICBzY2FsYXI6IHt9LAogICAgICAgIHNlcXVlbmNlOiB7fSwKICAgICAgICBtYXBwaW5nOiB7fSwKICAgICAgICBmYWxsYmFjazoge30KICAgICAgfSwgaW5kZXgyLCBsZW5ndGg7CiAgICAgIGZ1bmN0aW9uIGNvbGxlY3RUeXBlKHR5cGU1KSB7CiAgICAgICAgcmVzdWx0W3R5cGU1LmtpbmRdW3R5cGU1LnRhZ10gPSByZXN1bHRbImZhbGxiYWNrIl1bdHlwZTUudGFnXSA9IHR5cGU1OwogICAgICB9CiAgICAgIF9fbmFtZShjb2xsZWN0VHlwZSwgImNvbGxlY3RUeXBlIik7CiAgICAgIGZvciAoaW5kZXgyID0gMCwgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsgaW5kZXgyIDwgbGVuZ3RoOyBpbmRleDIgKz0gMSkgewogICAgICAgIGFyZ3VtZW50c1tpbmRleDJdLmZvckVhY2goY29sbGVjdFR5cGUpOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBfX25hbWUoY29tcGlsZU1hcCwgImNvbXBpbGVNYXAiKTsKICAgIGZ1bmN0aW9uIFNjaGVtYTIoZGVmaW5pdGlvbjMpIHsKICAgICAgdGhpcy5pbmNsdWRlID0gZGVmaW5pdGlvbjMuaW5jbHVkZSB8fCBbXTsKICAgICAgdGhpcy5pbXBsaWNpdCA9IGRlZmluaXRpb24zLmltcGxpY2l0IHx8IFtdOwogICAgICB0aGlzLmV4cGxpY2l0ID0gZGVmaW5pdGlvbjMuZXhwbGljaXQgfHwgW107CiAgICAgIHRoaXMuaW1wbGljaXQuZm9yRWFjaChmdW5jdGlvbih0eXBlNSkgewogICAgICAgIGlmICh0eXBlNS5sb2FkS2luZCAmJiB0eXBlNS5sb2FkS2luZCAhPT0gInNjYWxhciIpIHsKICAgICAgICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCJUaGVyZSBpcyBhIG5vbi1zY2FsYXIgdHlwZSBpbiB0aGUgaW1wbGljaXQgbGlzdCBvZiBhIHNjaGVtYS4gSW1wbGljaXQgcmVzb2x2aW5nIG9mIHN1Y2ggdHlwZXMgaXMgbm90IHN1cHBvcnRlZC4iKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICB0aGlzLmNvbXBpbGVkSW1wbGljaXQgPSBjb21waWxlTGlzdCh0aGlzLCAiaW1wbGljaXQiLCBbXSk7CiAgICAgIHRoaXMuY29tcGlsZWRFeHBsaWNpdCA9IGNvbXBpbGVMaXN0KHRoaXMsICJleHBsaWNpdCIsIFtdKTsKICAgICAgdGhpcy5jb21waWxlZFR5cGVNYXAgPSBjb21waWxlTWFwKHRoaXMuY29tcGlsZWRJbXBsaWNpdCwgdGhpcy5jb21waWxlZEV4cGxpY2l0KTsKICAgIH0KICAgIF9fbmFtZShTY2hlbWEyLCAiU2NoZW1hIik7CiAgICBTY2hlbWEyLkRFRkFVTFQgPSBudWxsOwogICAgU2NoZW1hMi5jcmVhdGUgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uIGNyZWF0ZVNjaGVtYSgpIHsKICAgICAgdmFyIHNjaGVtYXMsIHR5cGVzOwogICAgICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICBjYXNlIDE6CiAgICAgICAgICBzY2hlbWFzID0gU2NoZW1hMi5ERUZBVUxUOwogICAgICAgICAgdHlwZXMgPSBhcmd1bWVudHNbMF07CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI6CiAgICAgICAgICBzY2hlbWFzID0gYXJndW1lbnRzWzBdOwogICAgICAgICAgdHlwZXMgPSBhcmd1bWVudHNbMV07CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIFNjaGVtYS5jcmVhdGUgZnVuY3Rpb24iKTsKICAgICAgfQogICAgICBzY2hlbWFzID0gY29tbW9uLnRvQXJyYXkoc2NoZW1hcyk7CiAgICAgIHR5cGVzID0gY29tbW9uLnRvQXJyYXkodHlwZXMpOwogICAgICBpZiAoIXNjaGVtYXMuZXZlcnkoZnVuY3Rpb24oc2NoZW1hKSB7CiAgICAgICAgcmV0dXJuIHNjaGVtYSBpbnN0YW5jZW9mIFNjaGVtYTI7CiAgICAgIH0pKSB7CiAgICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oIlNwZWNpZmllZCBsaXN0IG9mIHN1cGVyIHNjaGVtYXMgKG9yIGEgc2luZ2xlIFNjaGVtYSBvYmplY3QpIGNvbnRhaW5zIGEgbm9uLVNjaGVtYSBvYmplY3QuIik7CiAgICAgIH0KICAgICAgaWYgKCF0eXBlcy5ldmVyeShmdW5jdGlvbih0eXBlNSkgewogICAgICAgIHJldHVybiB0eXBlNSBpbnN0YW5jZW9mIFR5cGU7CiAgICAgIH0pKSB7CiAgICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oIlNwZWNpZmllZCBsaXN0IG9mIFlBTUwgdHlwZXMgKG9yIGEgc2luZ2xlIFR5cGUgb2JqZWN0KSBjb250YWlucyBhIG5vbi1UeXBlIG9iamVjdC4iKTsKICAgICAgfQogICAgICByZXR1cm4gbmV3IFNjaGVtYTIoewogICAgICAgIGluY2x1ZGU6IHNjaGVtYXMsCiAgICAgICAgZXhwbGljaXQ6IHR5cGVzCiAgICAgIH0pOwogICAgfSwgImNyZWF0ZVNjaGVtYSIpOwogICAgbW9kdWxlLmV4cG9ydHMgPSBTY2hlbWEyOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9zdHIuanMKdmFyIHJlcXVpcmVfc3RyID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL3N0ci5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgVHlwZSA9IHJlcXVpcmVfdHlwZSgpOwogICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgidGFnOnlhbWwub3JnLDIwMDI6c3RyIiwgewogICAgICBraW5kOiAic2NhbGFyIiwKICAgICAgY29uc3RydWN0OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICByZXR1cm4gZGF0YSAhPT0gbnVsbCA/IGRhdGEgOiAiIjsKICAgICAgfSwgImNvbnN0cnVjdCIpCiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvc2VxLmpzCnZhciByZXF1aXJlX3NlcSA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9zZXEuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIFR5cGUgPSByZXF1aXJlX3R5cGUoKTsKICAgIG1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoInRhZzp5YW1sLm9yZywyMDAyOnNlcSIsIHsKICAgICAga2luZDogInNlcXVlbmNlIiwKICAgICAgY29uc3RydWN0OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICByZXR1cm4gZGF0YSAhPT0gbnVsbCA/IGRhdGEgOiBbXTsKICAgICAgfSwgImNvbnN0cnVjdCIpCiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvbWFwLmpzCnZhciByZXF1aXJlX21hcCA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9tYXAuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIFR5cGUgPSByZXF1aXJlX3R5cGUoKTsKICAgIG1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoInRhZzp5YW1sLm9yZywyMDAyOm1hcCIsIHsKICAgICAga2luZDogIm1hcHBpbmciLAogICAgICBjb25zdHJ1Y3Q6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oZGF0YSkgewogICAgICAgIHJldHVybiBkYXRhICE9PSBudWxsID8gZGF0YSA6IHt9OwogICAgICB9LCAiY29uc3RydWN0IikKICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hL2ZhaWxzYWZlLmpzCnZhciByZXF1aXJlX2ZhaWxzYWZlID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvZmFpbHNhZmUuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIFNjaGVtYTIgPSByZXF1aXJlX3NjaGVtYSgpOwogICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgU2NoZW1hMih7CiAgICAgIGV4cGxpY2l0OiBbCiAgICAgICAgcmVxdWlyZV9zdHIoKSwKICAgICAgICByZXF1aXJlX3NlcSgpLAogICAgICAgIHJlcXVpcmVfbWFwKCkKICAgICAgXQogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL251bGwuanMKdmFyIHJlcXVpcmVfbnVsbCA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9udWxsLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBUeXBlID0gcmVxdWlyZV90eXBlKCk7CiAgICBmdW5jdGlvbiByZXNvbHZlWWFtbE51bGwoZGF0YSkgewogICAgICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIHRydWU7CiAgICAgIHZhciBtYXgzID0gZGF0YS5sZW5ndGg7CiAgICAgIHJldHVybiBtYXgzID09PSAxICYmIGRhdGEgPT09ICJ+IiB8fCBtYXgzID09PSA0ICYmIChkYXRhID09PSAibnVsbCIgfHwgZGF0YSA9PT0gIk51bGwiIHx8IGRhdGEgPT09ICJOVUxMIik7CiAgICB9CiAgICBfX25hbWUocmVzb2x2ZVlhbWxOdWxsLCAicmVzb2x2ZVlhbWxOdWxsIik7CiAgICBmdW5jdGlvbiBjb25zdHJ1Y3RZYW1sTnVsbCgpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBfX25hbWUoY29uc3RydWN0WWFtbE51bGwsICJjb25zdHJ1Y3RZYW1sTnVsbCIpOwogICAgZnVuY3Rpb24gaXNOdWxsKG9iamVjdCkgewogICAgICByZXR1cm4gb2JqZWN0ID09PSBudWxsOwogICAgfQogICAgX19uYW1lKGlzTnVsbCwgImlzTnVsbCIpOwogICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgidGFnOnlhbWwub3JnLDIwMDI6bnVsbCIsIHsKICAgICAga2luZDogInNjYWxhciIsCiAgICAgIHJlc29sdmU6IHJlc29sdmVZYW1sTnVsbCwKICAgICAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sTnVsbCwKICAgICAgcHJlZGljYXRlOiBpc051bGwsCiAgICAgIHJlcHJlc2VudDogewogICAgICAgIGNhbm9uaWNhbDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiAifiI7CiAgICAgICAgfSwgImNhbm9uaWNhbCIpLAogICAgICAgIGxvd2VyY2FzZTogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiAibnVsbCI7CiAgICAgICAgfSwgImxvd2VyY2FzZSIpLAogICAgICAgIHVwcGVyY2FzZTogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiAiTlVMTCI7CiAgICAgICAgfSwgInVwcGVyY2FzZSIpLAogICAgICAgIGNhbWVsY2FzZTogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiAiTnVsbCI7CiAgICAgICAgfSwgImNhbWVsY2FzZSIpCiAgICAgIH0sCiAgICAgIGRlZmF1bHRTdHlsZTogImxvd2VyY2FzZSIKICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9ib29sLmpzCnZhciByZXF1aXJlX2Jvb2wgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvYm9vbC5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgVHlwZSA9IHJlcXVpcmVfdHlwZSgpOwogICAgZnVuY3Rpb24gcmVzb2x2ZVlhbWxCb29sZWFuKGRhdGEpIHsKICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTsKICAgICAgdmFyIG1heDMgPSBkYXRhLmxlbmd0aDsKICAgICAgcmV0dXJuIG1heDMgPT09IDQgJiYgKGRhdGEgPT09ICJ0cnVlIiB8fCBkYXRhID09PSAiVHJ1ZSIgfHwgZGF0YSA9PT0gIlRSVUUiKSB8fCBtYXgzID09PSA1ICYmIChkYXRhID09PSAiZmFsc2UiIHx8IGRhdGEgPT09ICJGYWxzZSIgfHwgZGF0YSA9PT0gIkZBTFNFIik7CiAgICB9CiAgICBfX25hbWUocmVzb2x2ZVlhbWxCb29sZWFuLCAicmVzb2x2ZVlhbWxCb29sZWFuIik7CiAgICBmdW5jdGlvbiBjb25zdHJ1Y3RZYW1sQm9vbGVhbihkYXRhKSB7CiAgICAgIHJldHVybiBkYXRhID09PSAidHJ1ZSIgfHwgZGF0YSA9PT0gIlRydWUiIHx8IGRhdGEgPT09ICJUUlVFIjsKICAgIH0KICAgIF9fbmFtZShjb25zdHJ1Y3RZYW1sQm9vbGVhbiwgImNvbnN0cnVjdFlhbWxCb29sZWFuIik7CiAgICBmdW5jdGlvbiBpc0Jvb2xlYW4ob2JqZWN0KSB7CiAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PT0gIltvYmplY3QgQm9vbGVhbl0iOwogICAgfQogICAgX19uYW1lKGlzQm9vbGVhbiwgImlzQm9vbGVhbiIpOwogICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgidGFnOnlhbWwub3JnLDIwMDI6Ym9vbCIsIHsKICAgICAga2luZDogInNjYWxhciIsCiAgICAgIHJlc29sdmU6IHJlc29sdmVZYW1sQm9vbGVhbiwKICAgICAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sQm9vbGVhbiwKICAgICAgcHJlZGljYXRlOiBpc0Jvb2xlYW4sCiAgICAgIHJlcHJlc2VudDogewogICAgICAgIGxvd2VyY2FzZTogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihvYmplY3QpIHsKICAgICAgICAgIHJldHVybiBvYmplY3QgPyAidHJ1ZSIgOiAiZmFsc2UiOwogICAgICAgIH0sICJsb3dlcmNhc2UiKSwKICAgICAgICB1cHBlcmNhc2U6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24ob2JqZWN0KSB7CiAgICAgICAgICByZXR1cm4gb2JqZWN0ID8gIlRSVUUiIDogIkZBTFNFIjsKICAgICAgICB9LCAidXBwZXJjYXNlIiksCiAgICAgICAgY2FtZWxjYXNlOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKG9iamVjdCkgewogICAgICAgICAgcmV0dXJuIG9iamVjdCA/ICJUcnVlIiA6ICJGYWxzZSI7CiAgICAgICAgfSwgImNhbWVsY2FzZSIpCiAgICAgIH0sCiAgICAgIGRlZmF1bHRTdHlsZTogImxvd2VyY2FzZSIKICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9pbnQuanMKdmFyIHJlcXVpcmVfaW50ID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2ludC5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgY29tbW9uID0gcmVxdWlyZV9jb21tb24oKTsKICAgIHZhciBUeXBlID0gcmVxdWlyZV90eXBlKCk7CiAgICBmdW5jdGlvbiBpc0hleENvZGUoYzEwKSB7CiAgICAgIHJldHVybiA0OCA8PSBjMTAgJiYgYzEwIDw9IDU3IHx8IDY1IDw9IGMxMCAmJiBjMTAgPD0gNzAgfHwgOTcgPD0gYzEwICYmIGMxMCA8PSAxMDI7CiAgICB9CiAgICBfX25hbWUoaXNIZXhDb2RlLCAiaXNIZXhDb2RlIik7CiAgICBmdW5jdGlvbiBpc09jdENvZGUoYzEwKSB7CiAgICAgIHJldHVybiA0OCA8PSBjMTAgJiYgYzEwIDw9IDU1OwogICAgfQogICAgX19uYW1lKGlzT2N0Q29kZSwgImlzT2N0Q29kZSIpOwogICAgZnVuY3Rpb24gaXNEZWNDb2RlKGMxMCkgewogICAgICByZXR1cm4gNDggPD0gYzEwICYmIGMxMCA8PSA1NzsKICAgIH0KICAgIF9fbmFtZShpc0RlY0NvZGUsICJpc0RlY0NvZGUiKTsKICAgIGZ1bmN0aW9uIHJlc29sdmVZYW1sSW50ZWdlcihkYXRhKSB7CiAgICAgIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICAgIHZhciBtYXgzID0gZGF0YS5sZW5ndGgsIGluZGV4MiA9IDAsIGhhc0RpZ2l0cyA9IGZhbHNlLCBjaDsKICAgICAgaWYgKCFtYXgzKSByZXR1cm4gZmFsc2U7CiAgICAgIGNoID0gZGF0YVtpbmRleDJdOwogICAgICBpZiAoY2ggPT09ICItIiB8fCBjaCA9PT0gIisiKSB7CiAgICAgICAgY2ggPSBkYXRhWysraW5kZXgyXTsKICAgICAgfQogICAgICBpZiAoY2ggPT09ICIwIikgewogICAgICAgIGlmIChpbmRleDIgKyAxID09PSBtYXgzKSByZXR1cm4gdHJ1ZTsKICAgICAgICBjaCA9IGRhdGFbKytpbmRleDJdOwogICAgICAgIGlmIChjaCA9PT0gImIiKSB7CiAgICAgICAgICBpbmRleDIrKzsKICAgICAgICAgIGZvciAoOyBpbmRleDIgPCBtYXgzOyBpbmRleDIrKykgewogICAgICAgICAgICBjaCA9IGRhdGFbaW5kZXgyXTsKICAgICAgICAgICAgaWYgKGNoID09PSAiXyIpIGNvbnRpbnVlOwogICAgICAgICAgICBpZiAoY2ggIT09ICIwIiAmJiBjaCAhPT0gIjEiKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIGhhc0RpZ2l0cyA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gaGFzRGlnaXRzICYmIGNoICE9PSAiXyI7CiAgICAgICAgfQogICAgICAgIGlmIChjaCA9PT0gIngiKSB7CiAgICAgICAgICBpbmRleDIrKzsKICAgICAgICAgIGZvciAoOyBpbmRleDIgPCBtYXgzOyBpbmRleDIrKykgewogICAgICAgICAgICBjaCA9IGRhdGFbaW5kZXgyXTsKICAgICAgICAgICAgaWYgKGNoID09PSAiXyIpIGNvbnRpbnVlOwogICAgICAgICAgICBpZiAoIWlzSGV4Q29kZShkYXRhLmNoYXJDb2RlQXQoaW5kZXgyKSkpIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgaGFzRGlnaXRzID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBoYXNEaWdpdHMgJiYgY2ggIT09ICJfIjsKICAgICAgICB9CiAgICAgICAgZm9yICg7IGluZGV4MiA8IG1heDM7IGluZGV4MisrKSB7CiAgICAgICAgICBjaCA9IGRhdGFbaW5kZXgyXTsKICAgICAgICAgIGlmIChjaCA9PT0gIl8iKSBjb250aW51ZTsKICAgICAgICAgIGlmICghaXNPY3RDb2RlKGRhdGEuY2hhckNvZGVBdChpbmRleDIpKSkgcmV0dXJuIGZhbHNlOwogICAgICAgICAgaGFzRGlnaXRzID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGhhc0RpZ2l0cyAmJiBjaCAhPT0gIl8iOwogICAgICB9CiAgICAgIGlmIChjaCA9PT0gIl8iKSByZXR1cm4gZmFsc2U7CiAgICAgIGZvciAoOyBpbmRleDIgPCBtYXgzOyBpbmRleDIrKykgewogICAgICAgIGNoID0gZGF0YVtpbmRleDJdOwogICAgICAgIGlmIChjaCA9PT0gIl8iKSBjb250aW51ZTsKICAgICAgICBpZiAoY2ggPT09ICI6IikgYnJlYWs7CiAgICAgICAgaWYgKCFpc0RlY0NvZGUoZGF0YS5jaGFyQ29kZUF0KGluZGV4MikpKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGhhc0RpZ2l0cyA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKCFoYXNEaWdpdHMgfHwgY2ggPT09ICJfIikgcmV0dXJuIGZhbHNlOwogICAgICBpZiAoY2ggIT09ICI6IikgcmV0dXJuIHRydWU7CiAgICAgIHJldHVybiAvXig6WzAtNV0/WzAtOV0pKyQvLnRlc3QoZGF0YS5zbGljZShpbmRleDIpKTsKICAgIH0KICAgIF9fbmFtZShyZXNvbHZlWWFtbEludGVnZXIsICJyZXNvbHZlWWFtbEludGVnZXIiKTsKICAgIGZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxJbnRlZ2VyKGRhdGEpIHsKICAgICAgdmFyIHZhbHVlMiA9IGRhdGEsIHNpZ24gPSAxLCBjaCwgYmFzZSwgZGlnaXRzID0gW107CiAgICAgIGlmICh2YWx1ZTIuaW5kZXhPZigiXyIpICE9PSAtMSkgewogICAgICAgIHZhbHVlMiA9IHZhbHVlMi5yZXBsYWNlKC9fL2csICIiKTsKICAgICAgfQogICAgICBjaCA9IHZhbHVlMlswXTsKICAgICAgaWYgKGNoID09PSAiLSIgfHwgY2ggPT09ICIrIikgewogICAgICAgIGlmIChjaCA9PT0gIi0iKSBzaWduID0gLTE7CiAgICAgICAgdmFsdWUyID0gdmFsdWUyLnNsaWNlKDEpOwogICAgICAgIGNoID0gdmFsdWUyWzBdOwogICAgICB9CiAgICAgIGlmICh2YWx1ZTIgPT09ICIwIikgcmV0dXJuIDA7CiAgICAgIGlmIChjaCA9PT0gIjAiKSB7CiAgICAgICAgaWYgKHZhbHVlMlsxXSA9PT0gImIiKSByZXR1cm4gc2lnbiAqIHBhcnNlSW50KHZhbHVlMi5zbGljZSgyKSwgMik7CiAgICAgICAgaWYgKHZhbHVlMlsxXSA9PT0gIngiKSByZXR1cm4gc2lnbiAqIHBhcnNlSW50KHZhbHVlMiwgMTYpOwogICAgICAgIHJldHVybiBzaWduICogcGFyc2VJbnQodmFsdWUyLCA4KTsKICAgICAgfQogICAgICBpZiAodmFsdWUyLmluZGV4T2YoIjoiKSAhPT0gLTEpIHsKICAgICAgICB2YWx1ZTIuc3BsaXQoIjoiKS5mb3JFYWNoKGZ1bmN0aW9uKHY0KSB7CiAgICAgICAgICBkaWdpdHMudW5zaGlmdChwYXJzZUludCh2NCwgMTApKTsKICAgICAgICB9KTsKICAgICAgICB2YWx1ZTIgPSAwOwogICAgICAgIGJhc2UgPSAxOwogICAgICAgIGRpZ2l0cy5mb3JFYWNoKGZ1bmN0aW9uKGQ0KSB7CiAgICAgICAgICB2YWx1ZTIgKz0gZDQgKiBiYXNlOwogICAgICAgICAgYmFzZSAqPSA2MDsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gc2lnbiAqIHZhbHVlMjsKICAgICAgfQogICAgICByZXR1cm4gc2lnbiAqIHBhcnNlSW50KHZhbHVlMiwgMTApOwogICAgfQogICAgX19uYW1lKGNvbnN0cnVjdFlhbWxJbnRlZ2VyLCAiY29uc3RydWN0WWFtbEludGVnZXIiKTsKICAgIGZ1bmN0aW9uIGlzSW50ZWdlcihvYmplY3QpIHsKICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09PSAiW29iamVjdCBOdW1iZXJdIiAmJiAob2JqZWN0ICUgMSA9PT0gMCAmJiAhY29tbW9uLmlzTmVnYXRpdmVaZXJvKG9iamVjdCkpOwogICAgfQogICAgX19uYW1lKGlzSW50ZWdlciwgImlzSW50ZWdlciIpOwogICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgidGFnOnlhbWwub3JnLDIwMDI6aW50IiwgewogICAgICBraW5kOiAic2NhbGFyIiwKICAgICAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxJbnRlZ2VyLAogICAgICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxJbnRlZ2VyLAogICAgICBwcmVkaWNhdGU6IGlzSW50ZWdlciwKICAgICAgcmVwcmVzZW50OiB7CiAgICAgICAgYmluYXJ5OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKG9iaikgewogICAgICAgICAgcmV0dXJuIG9iaiA+PSAwID8gIjBiIiArIG9iai50b1N0cmluZygyKSA6ICItMGIiICsgb2JqLnRvU3RyaW5nKDIpLnNsaWNlKDEpOwogICAgICAgIH0sICJiaW5hcnkiKSwKICAgICAgICBvY3RhbDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihvYmopIHsKICAgICAgICAgIHJldHVybiBvYmogPj0gMCA/ICIwIiArIG9iai50b1N0cmluZyg4KSA6ICItMCIgKyBvYmoudG9TdHJpbmcoOCkuc2xpY2UoMSk7CiAgICAgICAgfSwgIm9jdGFsIiksCiAgICAgICAgZGVjaW1hbDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihvYmopIHsKICAgICAgICAgIHJldHVybiBvYmoudG9TdHJpbmcoMTApOwogICAgICAgIH0sICJkZWNpbWFsIiksCiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqLwogICAgICAgIGhleGFkZWNpbWFsOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKG9iaikgewogICAgICAgICAgcmV0dXJuIG9iaiA+PSAwID8gIjB4IiArIG9iai50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSA6ICItMHgiICsgb2JqLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpLnNsaWNlKDEpOwogICAgICAgIH0sICJoZXhhZGVjaW1hbCIpCiAgICAgIH0sCiAgICAgIGRlZmF1bHRTdHlsZTogImRlY2ltYWwiLAogICAgICBzdHlsZUFsaWFzZXM6IHsKICAgICAgICBiaW5hcnk6IFsyLCAiYmluIl0sCiAgICAgICAgb2N0YWw6IFs4LCAib2N0Il0sCiAgICAgICAgZGVjaW1hbDogWzEwLCAiZGVjIl0sCiAgICAgICAgaGV4YWRlY2ltYWw6IFsxNiwgImhleCJdCiAgICAgIH0KICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9mbG9hdC5qcwp2YXIgcmVxdWlyZV9mbG9hdCA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9mbG9hdC5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgY29tbW9uID0gcmVxdWlyZV9jb21tb24oKTsKICAgIHZhciBUeXBlID0gcmVxdWlyZV90eXBlKCk7CiAgICB2YXIgWUFNTF9GTE9BVF9QQVRURVJOID0gbmV3IFJlZ0V4cCgKICAgICAgLy8gMi41ZTQsIDIuNSBhbmQgaW50ZWdlcnMKICAgICAgIl4oPzpbLStdPyg/OjB8WzEtOV1bMC05X10qKSg/OlxcLlswLTlfXSopPyg/OltlRV1bLStdP1swLTldKyk/fFxcLlswLTlfXSsoPzpbZUVdWy0rXT9bMC05XSspP3xbLStdP1swLTldWzAtOV9dKig/OjpbMC01XT9bMC05XSkrXFwuWzAtOV9dKnxbLStdP1xcLig/OmluZnxJbmZ8SU5GKXxcXC4oPzpuYW58TmFOfE5BTikpJCIKICAgICk7CiAgICBmdW5jdGlvbiByZXNvbHZlWWFtbEZsb2F0KGRhdGEpIHsKICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTsKICAgICAgaWYgKCFZQU1MX0ZMT0FUX1BBVFRFUk4udGVzdChkYXRhKSB8fCAvLyBRdWljayBoYWNrIHRvIG5vdCBhbGxvdyBpbnRlZ2VycyBlbmQgd2l0aCBgX2AKICAgICAgLy8gUHJvYmFibHkgc2hvdWxkIHVwZGF0ZSByZWdleHAgJiBjaGVjayBzcGVlZAogICAgICBkYXRhW2RhdGEubGVuZ3RoIC0gMV0gPT09ICJfIikgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIF9fbmFtZShyZXNvbHZlWWFtbEZsb2F0LCAicmVzb2x2ZVlhbWxGbG9hdCIpOwogICAgZnVuY3Rpb24gY29uc3RydWN0WWFtbEZsb2F0KGRhdGEpIHsKICAgICAgdmFyIHZhbHVlMiwgc2lnbiwgYmFzZSwgZGlnaXRzOwogICAgICB2YWx1ZTIgPSBkYXRhLnJlcGxhY2UoL18vZywgIiIpLnRvTG93ZXJDYXNlKCk7CiAgICAgIHNpZ24gPSB2YWx1ZTJbMF0gPT09ICItIiA/IC0xIDogMTsKICAgICAgZGlnaXRzID0gW107CiAgICAgIGlmICgiKy0iLmluZGV4T2YodmFsdWUyWzBdKSA+PSAwKSB7CiAgICAgICAgdmFsdWUyID0gdmFsdWUyLnNsaWNlKDEpOwogICAgICB9CiAgICAgIGlmICh2YWx1ZTIgPT09ICIuaW5mIikgewogICAgICAgIHJldHVybiBzaWduID09PSAxID8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIDogTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZOwogICAgICB9IGVsc2UgaWYgKHZhbHVlMiA9PT0gIi5uYW4iKSB7CiAgICAgICAgcmV0dXJuIE5hTjsKICAgICAgfSBlbHNlIGlmICh2YWx1ZTIuaW5kZXhPZigiOiIpID49IDApIHsKICAgICAgICB2YWx1ZTIuc3BsaXQoIjoiKS5mb3JFYWNoKGZ1bmN0aW9uKHY0KSB7CiAgICAgICAgICBkaWdpdHMudW5zaGlmdChwYXJzZUZsb2F0KHY0LCAxMCkpOwogICAgICAgIH0pOwogICAgICAgIHZhbHVlMiA9IDA7CiAgICAgICAgYmFzZSA9IDE7CiAgICAgICAgZGlnaXRzLmZvckVhY2goZnVuY3Rpb24oZDQpIHsKICAgICAgICAgIHZhbHVlMiArPSBkNCAqIGJhc2U7CiAgICAgICAgICBiYXNlICo9IDYwOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBzaWduICogdmFsdWUyOwogICAgICB9CiAgICAgIHJldHVybiBzaWduICogcGFyc2VGbG9hdCh2YWx1ZTIsIDEwKTsKICAgIH0KICAgIF9fbmFtZShjb25zdHJ1Y3RZYW1sRmxvYXQsICJjb25zdHJ1Y3RZYW1sRmxvYXQiKTsKICAgIHZhciBTQ0lFTlRJRklDX1dJVEhPVVRfRE9UID0gL15bLStdP1swLTldK2UvOwogICAgZnVuY3Rpb24gcmVwcmVzZW50WWFtbEZsb2F0KG9iamVjdCwgc3R5bGUpIHsKICAgICAgdmFyIHJlczsKICAgICAgaWYgKGlzTmFOKG9iamVjdCkpIHsKICAgICAgICBzd2l0Y2ggKHN0eWxlKSB7CiAgICAgICAgICBjYXNlICJsb3dlcmNhc2UiOgogICAgICAgICAgICByZXR1cm4gIi5uYW4iOwogICAgICAgICAgY2FzZSAidXBwZXJjYXNlIjoKICAgICAgICAgICAgcmV0dXJuICIuTkFOIjsKICAgICAgICAgIGNhc2UgImNhbWVsY2FzZSI6CiAgICAgICAgICAgIHJldHVybiAiLk5hTiI7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKE51bWJlci5QT1NJVElWRV9JTkZJTklUWSA9PT0gb2JqZWN0KSB7CiAgICAgICAgc3dpdGNoIChzdHlsZSkgewogICAgICAgICAgY2FzZSAibG93ZXJjYXNlIjoKICAgICAgICAgICAgcmV0dXJuICIuaW5mIjsKICAgICAgICAgIGNhc2UgInVwcGVyY2FzZSI6CiAgICAgICAgICAgIHJldHVybiAiLklORiI7CiAgICAgICAgICBjYXNlICJjYW1lbGNhc2UiOgogICAgICAgICAgICByZXR1cm4gIi5JbmYiOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgPT09IG9iamVjdCkgewogICAgICAgIHN3aXRjaCAoc3R5bGUpIHsKICAgICAgICAgIGNhc2UgImxvd2VyY2FzZSI6CiAgICAgICAgICAgIHJldHVybiAiLS5pbmYiOwogICAgICAgICAgY2FzZSAidXBwZXJjYXNlIjoKICAgICAgICAgICAgcmV0dXJuICItLklORiI7CiAgICAgICAgICBjYXNlICJjYW1lbGNhc2UiOgogICAgICAgICAgICByZXR1cm4gIi0uSW5mIjsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoY29tbW9uLmlzTmVnYXRpdmVaZXJvKG9iamVjdCkpIHsKICAgICAgICByZXR1cm4gIi0wLjAiOwogICAgICB9CiAgICAgIHJlcyA9IG9iamVjdC50b1N0cmluZygxMCk7CiAgICAgIHJldHVybiBTQ0lFTlRJRklDX1dJVEhPVVRfRE9ULnRlc3QocmVzKSA/IHJlcy5yZXBsYWNlKCJlIiwgIi5lIikgOiByZXM7CiAgICB9CiAgICBfX25hbWUocmVwcmVzZW50WWFtbEZsb2F0LCAicmVwcmVzZW50WWFtbEZsb2F0Iik7CiAgICBmdW5jdGlvbiBpc0Zsb2F0KG9iamVjdCkgewogICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkgPT09ICJbb2JqZWN0IE51bWJlcl0iICYmIChvYmplY3QgJSAxICE9PSAwIHx8IGNvbW1vbi5pc05lZ2F0aXZlWmVybyhvYmplY3QpKTsKICAgIH0KICAgIF9fbmFtZShpc0Zsb2F0LCAiaXNGbG9hdCIpOwogICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgidGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQiLCB7CiAgICAgIGtpbmQ6ICJzY2FsYXIiLAogICAgICByZXNvbHZlOiByZXNvbHZlWWFtbEZsb2F0LAogICAgICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxGbG9hdCwKICAgICAgcHJlZGljYXRlOiBpc0Zsb2F0LAogICAgICByZXByZXNlbnQ6IHJlcHJlc2VudFlhbWxGbG9hdCwKICAgICAgZGVmYXVsdFN0eWxlOiAibG93ZXJjYXNlIgogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvanNvbi5qcwp2YXIgcmVxdWlyZV9qc29uID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvanNvbi5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgU2NoZW1hMiA9IHJlcXVpcmVfc2NoZW1hKCk7CiAgICBtb2R1bGUuZXhwb3J0cyA9IG5ldyBTY2hlbWEyKHsKICAgICAgaW5jbHVkZTogWwogICAgICAgIHJlcXVpcmVfZmFpbHNhZmUoKQogICAgICBdLAogICAgICBpbXBsaWNpdDogWwogICAgICAgIHJlcXVpcmVfbnVsbCgpLAogICAgICAgIHJlcXVpcmVfYm9vbCgpLAogICAgICAgIHJlcXVpcmVfaW50KCksCiAgICAgICAgcmVxdWlyZV9mbG9hdCgpCiAgICAgIF0KICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hL2NvcmUuanMKdmFyIHJlcXVpcmVfY29yZSA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hL2NvcmUuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIFNjaGVtYTIgPSByZXF1aXJlX3NjaGVtYSgpOwogICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgU2NoZW1hMih7CiAgICAgIGluY2x1ZGU6IFsKICAgICAgICByZXF1aXJlX2pzb24oKQogICAgICBdCiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvdGltZXN0YW1wLmpzCnZhciByZXF1aXJlX3RpbWVzdGFtcCA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS90aW1lc3RhbXAuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIFR5cGUgPSByZXF1aXJlX3R5cGUoKTsKICAgIHZhciBZQU1MX0RBVEVfUkVHRVhQID0gbmV3IFJlZ0V4cCgKICAgICAgIl4oWzAtOV1bMC05XVswLTldWzAtOV0pLShbMC05XVswLTldKS0oWzAtOV1bMC05XSkkIgogICAgKTsKICAgIHZhciBZQU1MX1RJTUVTVEFNUF9SRUdFWFAgPSBuZXcgUmVnRXhwKAogICAgICAiXihbMC05XVswLTldWzAtOV1bMC05XSktKFswLTldWzAtOV0/KS0oWzAtOV1bMC05XT8pKD86W1R0XXxbIFxcdF0rKShbMC05XVswLTldPyk6KFswLTldWzAtOV0pOihbMC05XVswLTldKSg/OlxcLihbMC05XSopKT8oPzpbIFxcdF0qKFp8KFstK10pKFswLTldWzAtOV0/KSg/OjooWzAtOV1bMC05XSkpPykpPyQiCiAgICApOwogICAgZnVuY3Rpb24gcmVzb2x2ZVlhbWxUaW1lc3RhbXAoZGF0YSkgewogICAgICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgICBpZiAoWUFNTF9EQVRFX1JFR0VYUC5leGVjKGRhdGEpICE9PSBudWxsKSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKFlBTUxfVElNRVNUQU1QX1JFR0VYUC5leGVjKGRhdGEpICE9PSBudWxsKSByZXR1cm4gdHJ1ZTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgX19uYW1lKHJlc29sdmVZYW1sVGltZXN0YW1wLCAicmVzb2x2ZVlhbWxUaW1lc3RhbXAiKTsKICAgIGZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxUaW1lc3RhbXAoZGF0YSkgewogICAgICB2YXIgbWF0Y2gyLCB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgZnJhY3Rpb24gPSAwLCBkZWx0YSA9IG51bGwsIHR6X2hvdXIsIHR6X21pbnV0ZSwgZGF0ZTsKICAgICAgbWF0Y2gyID0gWUFNTF9EQVRFX1JFR0VYUC5leGVjKGRhdGEpOwogICAgICBpZiAobWF0Y2gyID09PSBudWxsKSBtYXRjaDIgPSBZQU1MX1RJTUVTVEFNUF9SRUdFWFAuZXhlYyhkYXRhKTsKICAgICAgaWYgKG1hdGNoMiA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCJEYXRlIHJlc29sdmUgZXJyb3IiKTsKICAgICAgeWVhciA9ICttYXRjaDJbMV07CiAgICAgIG1vbnRoID0gK21hdGNoMlsyXSAtIDE7CiAgICAgIGRheSA9ICttYXRjaDJbM107CiAgICAgIGlmICghbWF0Y2gyWzRdKSB7CiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKHllYXIsIG1vbnRoLCBkYXkpKTsKICAgICAgfQogICAgICBob3VyID0gK21hdGNoMls0XTsKICAgICAgbWludXRlID0gK21hdGNoMls1XTsKICAgICAgc2Vjb25kID0gK21hdGNoMls2XTsKICAgICAgaWYgKG1hdGNoMls3XSkgewogICAgICAgIGZyYWN0aW9uID0gbWF0Y2gyWzddLnNsaWNlKDAsIDMpOwogICAgICAgIHdoaWxlIChmcmFjdGlvbi5sZW5ndGggPCAzKSB7CiAgICAgICAgICBmcmFjdGlvbiArPSAiMCI7CiAgICAgICAgfQogICAgICAgIGZyYWN0aW9uID0gK2ZyYWN0aW9uOwogICAgICB9CiAgICAgIGlmIChtYXRjaDJbOV0pIHsKICAgICAgICB0el9ob3VyID0gK21hdGNoMlsxMF07CiAgICAgICAgdHpfbWludXRlID0gKyhtYXRjaDJbMTFdIHx8IDApOwogICAgICAgIGRlbHRhID0gKHR6X2hvdXIgKiA2MCArIHR6X21pbnV0ZSkgKiA2ZTQ7CiAgICAgICAgaWYgKG1hdGNoMls5XSA9PT0gIi0iKSBkZWx0YSA9IC1kZWx0YTsKICAgICAgfQogICAgICBkYXRlID0gbmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIGZyYWN0aW9uKSk7CiAgICAgIGlmIChkZWx0YSkgZGF0ZS5zZXRUaW1lKGRhdGUuZ2V0VGltZSgpIC0gZGVsdGEpOwogICAgICByZXR1cm4gZGF0ZTsKICAgIH0KICAgIF9fbmFtZShjb25zdHJ1Y3RZYW1sVGltZXN0YW1wLCAiY29uc3RydWN0WWFtbFRpbWVzdGFtcCIpOwogICAgZnVuY3Rpb24gcmVwcmVzZW50WWFtbFRpbWVzdGFtcChvYmplY3QpIHsKICAgICAgcmV0dXJuIG9iamVjdC50b0lTT1N0cmluZygpOwogICAgfQogICAgX19uYW1lKHJlcHJlc2VudFlhbWxUaW1lc3RhbXAsICJyZXByZXNlbnRZYW1sVGltZXN0YW1wIik7CiAgICBtb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCJ0YWc6eWFtbC5vcmcsMjAwMjp0aW1lc3RhbXAiLCB7CiAgICAgIGtpbmQ6ICJzY2FsYXIiLAogICAgICByZXNvbHZlOiByZXNvbHZlWWFtbFRpbWVzdGFtcCwKICAgICAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sVGltZXN0YW1wLAogICAgICBpbnN0YW5jZU9mOiBEYXRlLAogICAgICByZXByZXNlbnQ6IHJlcHJlc2VudFlhbWxUaW1lc3RhbXAKICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9tZXJnZS5qcwp2YXIgcmVxdWlyZV9tZXJnZSA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9tZXJnZS5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgVHlwZSA9IHJlcXVpcmVfdHlwZSgpOwogICAgZnVuY3Rpb24gcmVzb2x2ZVlhbWxNZXJnZShkYXRhKSB7CiAgICAgIHJldHVybiBkYXRhID09PSAiPDwiIHx8IGRhdGEgPT09IG51bGw7CiAgICB9CiAgICBfX25hbWUocmVzb2x2ZVlhbWxNZXJnZSwgInJlc29sdmVZYW1sTWVyZ2UiKTsKICAgIG1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoInRhZzp5YW1sLm9yZywyMDAyOm1lcmdlIiwgewogICAgICBraW5kOiAic2NhbGFyIiwKICAgICAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxNZXJnZQogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2JpbmFyeS5qcwp2YXIgcmVxdWlyZV9iaW5hcnkgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvYmluYXJ5LmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBOb2RlQnVmZmVyOwogICAgdHJ5IHsKICAgICAgX3JlcXVpcmUgPSBfX3JlcXVpcmU7CiAgICAgIE5vZGVCdWZmZXIgPSBfcmVxdWlyZSgiYnVmZmVyIikuQnVmZmVyOwogICAgfSBjYXRjaCAoX18pIHsKICAgIH0KICAgIHZhciBUeXBlID0gcmVxdWlyZV90eXBlKCk7CiAgICB2YXIgQkFTRTY0X01BUCA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPVxuXHIiOwogICAgZnVuY3Rpb24gcmVzb2x2ZVlhbWxCaW5hcnkoZGF0YSkgewogICAgICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgICB2YXIgY29kZTQsIGlkeCwgYml0bGVuID0gMCwgbWF4MyA9IGRhdGEubGVuZ3RoLCBtYXA3ID0gQkFTRTY0X01BUDsKICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBtYXgzOyBpZHgrKykgewogICAgICAgIGNvZGU0ID0gbWFwNy5pbmRleE9mKGRhdGEuY2hhckF0KGlkeCkpOwogICAgICAgIGlmIChjb2RlNCA+IDY0KSBjb250aW51ZTsKICAgICAgICBpZiAoY29kZTQgPCAwKSByZXR1cm4gZmFsc2U7CiAgICAgICAgYml0bGVuICs9IDY7CiAgICAgIH0KICAgICAgcmV0dXJuIGJpdGxlbiAlIDggPT09IDA7CiAgICB9CiAgICBfX25hbWUocmVzb2x2ZVlhbWxCaW5hcnksICJyZXNvbHZlWWFtbEJpbmFyeSIpOwogICAgZnVuY3Rpb24gY29uc3RydWN0WWFtbEJpbmFyeShkYXRhKSB7CiAgICAgIHZhciBpZHgsIHRhaWxiaXRzLCBpbnB1dCA9IGRhdGEucmVwbGFjZSgvW1xyXG49XS9nLCAiIiksIG1heDMgPSBpbnB1dC5sZW5ndGgsIG1hcDcgPSBCQVNFNjRfTUFQLCBiaXRzID0gMCwgcmVzdWx0ID0gW107CiAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgbWF4MzsgaWR4KyspIHsKICAgICAgICBpZiAoaWR4ICUgNCA9PT0gMCAmJiBpZHgpIHsKICAgICAgICAgIHJlc3VsdC5wdXNoKGJpdHMgPj4gMTYgJiAyNTUpOwogICAgICAgICAgcmVzdWx0LnB1c2goYml0cyA+PiA4ICYgMjU1KTsKICAgICAgICAgIHJlc3VsdC5wdXNoKGJpdHMgJiAyNTUpOwogICAgICAgIH0KICAgICAgICBiaXRzID0gYml0cyA8PCA2IHwgbWFwNy5pbmRleE9mKGlucHV0LmNoYXJBdChpZHgpKTsKICAgICAgfQogICAgICB0YWlsYml0cyA9IG1heDMgJSA0ICogNjsKICAgICAgaWYgKHRhaWxiaXRzID09PSAwKSB7CiAgICAgICAgcmVzdWx0LnB1c2goYml0cyA+PiAxNiAmIDI1NSk7CiAgICAgICAgcmVzdWx0LnB1c2goYml0cyA+PiA4ICYgMjU1KTsKICAgICAgICByZXN1bHQucHVzaChiaXRzICYgMjU1KTsKICAgICAgfSBlbHNlIGlmICh0YWlsYml0cyA9PT0gMTgpIHsKICAgICAgICByZXN1bHQucHVzaChiaXRzID4+IDEwICYgMjU1KTsKICAgICAgICByZXN1bHQucHVzaChiaXRzID4+IDIgJiAyNTUpOwogICAgICB9IGVsc2UgaWYgKHRhaWxiaXRzID09PSAxMikgewogICAgICAgIHJlc3VsdC5wdXNoKGJpdHMgPj4gNCAmIDI1NSk7CiAgICAgIH0KICAgICAgaWYgKE5vZGVCdWZmZXIpIHsKICAgICAgICByZXR1cm4gTm9kZUJ1ZmZlci5mcm9tID8gTm9kZUJ1ZmZlci5mcm9tKHJlc3VsdCkgOiBuZXcgTm9kZUJ1ZmZlcihyZXN1bHQpOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBfX25hbWUoY29uc3RydWN0WWFtbEJpbmFyeSwgImNvbnN0cnVjdFlhbWxCaW5hcnkiKTsKICAgIGZ1bmN0aW9uIHJlcHJlc2VudFlhbWxCaW5hcnkob2JqZWN0KSB7CiAgICAgIHZhciByZXN1bHQgPSAiIiwgYml0cyA9IDAsIGlkeCwgdGFpbCwgbWF4MyA9IG9iamVjdC5sZW5ndGgsIG1hcDcgPSBCQVNFNjRfTUFQOwogICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IG1heDM7IGlkeCsrKSB7CiAgICAgICAgaWYgKGlkeCAlIDMgPT09IDAgJiYgaWR4KSB7CiAgICAgICAgICByZXN1bHQgKz0gbWFwN1tiaXRzID4+IDE4ICYgNjNdOwogICAgICAgICAgcmVzdWx0ICs9IG1hcDdbYml0cyA+PiAxMiAmIDYzXTsKICAgICAgICAgIHJlc3VsdCArPSBtYXA3W2JpdHMgPj4gNiAmIDYzXTsKICAgICAgICAgIHJlc3VsdCArPSBtYXA3W2JpdHMgJiA2M107CiAgICAgICAgfQogICAgICAgIGJpdHMgPSAoYml0cyA8PCA4KSArIG9iamVjdFtpZHhdOwogICAgICB9CiAgICAgIHRhaWwgPSBtYXgzICUgMzsKICAgICAgaWYgKHRhaWwgPT09IDApIHsKICAgICAgICByZXN1bHQgKz0gbWFwN1tiaXRzID4+IDE4ICYgNjNdOwogICAgICAgIHJlc3VsdCArPSBtYXA3W2JpdHMgPj4gMTIgJiA2M107CiAgICAgICAgcmVzdWx0ICs9IG1hcDdbYml0cyA+PiA2ICYgNjNdOwogICAgICAgIHJlc3VsdCArPSBtYXA3W2JpdHMgJiA2M107CiAgICAgIH0gZWxzZSBpZiAodGFpbCA9PT0gMikgewogICAgICAgIHJlc3VsdCArPSBtYXA3W2JpdHMgPj4gMTAgJiA2M107CiAgICAgICAgcmVzdWx0ICs9IG1hcDdbYml0cyA+PiA0ICYgNjNdOwogICAgICAgIHJlc3VsdCArPSBtYXA3W2JpdHMgPDwgMiAmIDYzXTsKICAgICAgICByZXN1bHQgKz0gbWFwN1s2NF07CiAgICAgIH0gZWxzZSBpZiAodGFpbCA9PT0gMSkgewogICAgICAgIHJlc3VsdCArPSBtYXA3W2JpdHMgPj4gMiAmIDYzXTsKICAgICAgICByZXN1bHQgKz0gbWFwN1tiaXRzIDw8IDQgJiA2M107CiAgICAgICAgcmVzdWx0ICs9IG1hcDdbNjRdOwogICAgICAgIHJlc3VsdCArPSBtYXA3WzY0XTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgX19uYW1lKHJlcHJlc2VudFlhbWxCaW5hcnksICJyZXByZXNlbnRZYW1sQmluYXJ5Iik7CiAgICBmdW5jdGlvbiBpc0JpbmFyeShvYmplY3QpIHsKICAgICAgcmV0dXJuIE5vZGVCdWZmZXIgJiYgTm9kZUJ1ZmZlci5pc0J1ZmZlcihvYmplY3QpOwogICAgfQogICAgX19uYW1lKGlzQmluYXJ5LCAiaXNCaW5hcnkiKTsKICAgIG1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoInRhZzp5YW1sLm9yZywyMDAyOmJpbmFyeSIsIHsKICAgICAga2luZDogInNjYWxhciIsCiAgICAgIHJlc29sdmU6IHJlc29sdmVZYW1sQmluYXJ5LAogICAgICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxCaW5hcnksCiAgICAgIHByZWRpY2F0ZTogaXNCaW5hcnksCiAgICAgIHJlcHJlc2VudDogcmVwcmVzZW50WWFtbEJpbmFyeQogICAgfSk7CiAgICB2YXIgX3JlcXVpcmU7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL29tYXAuanMKdmFyIHJlcXVpcmVfb21hcCA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9vbWFwLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBUeXBlID0gcmVxdWlyZV90eXBlKCk7CiAgICB2YXIgX2hhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTsKICAgIHZhciBfdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nOwogICAgZnVuY3Rpb24gcmVzb2x2ZVlhbWxPbWFwKGRhdGEpIHsKICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiB0cnVlOwogICAgICB2YXIgb2JqZWN0S2V5cyA9IFtdLCBpbmRleDIsIGxlbmd0aCwgcGFpciwgcGFpcktleSwgcGFpckhhc0tleSwgb2JqZWN0ID0gZGF0YTsKICAgICAgZm9yIChpbmRleDIgPSAwLCBsZW5ndGggPSBvYmplY3QubGVuZ3RoOyBpbmRleDIgPCBsZW5ndGg7IGluZGV4MiArPSAxKSB7CiAgICAgICAgcGFpciA9IG9iamVjdFtpbmRleDJdOwogICAgICAgIHBhaXJIYXNLZXkgPSBmYWxzZTsKICAgICAgICBpZiAoX3RvU3RyaW5nLmNhbGwocGFpcikgIT09ICJbb2JqZWN0IE9iamVjdF0iKSByZXR1cm4gZmFsc2U7CiAgICAgICAgZm9yIChwYWlyS2V5IGluIHBhaXIpIHsKICAgICAgICAgIGlmIChfaGFzT3duUHJvcGVydHkuY2FsbChwYWlyLCBwYWlyS2V5KSkgewogICAgICAgICAgICBpZiAoIXBhaXJIYXNLZXkpIHBhaXJIYXNLZXkgPSB0cnVlOwogICAgICAgICAgICBlbHNlIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFwYWlySGFzS2V5KSByZXR1cm4gZmFsc2U7CiAgICAgICAgaWYgKG9iamVjdEtleXMuaW5kZXhPZihwYWlyS2V5KSA9PT0gLTEpIG9iamVjdEtleXMucHVzaChwYWlyS2V5KTsKICAgICAgICBlbHNlIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIF9fbmFtZShyZXNvbHZlWWFtbE9tYXAsICJyZXNvbHZlWWFtbE9tYXAiKTsKICAgIGZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxPbWFwKGRhdGEpIHsKICAgICAgcmV0dXJuIGRhdGEgIT09IG51bGwgPyBkYXRhIDogW107CiAgICB9CiAgICBfX25hbWUoY29uc3RydWN0WWFtbE9tYXAsICJjb25zdHJ1Y3RZYW1sT21hcCIpOwogICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgidGFnOnlhbWwub3JnLDIwMDI6b21hcCIsIHsKICAgICAga2luZDogInNlcXVlbmNlIiwKICAgICAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxPbWFwLAogICAgICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxPbWFwCiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvcGFpcnMuanMKdmFyIHJlcXVpcmVfcGFpcnMgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvcGFpcnMuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIFR5cGUgPSByZXF1aXJlX3R5cGUoKTsKICAgIHZhciBfdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nOwogICAgZnVuY3Rpb24gcmVzb2x2ZVlhbWxQYWlycyhkYXRhKSB7CiAgICAgIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gdHJ1ZTsKICAgICAgdmFyIGluZGV4MiwgbGVuZ3RoLCBwYWlyLCBrZXlzMiwgcmVzdWx0LCBvYmplY3QgPSBkYXRhOwogICAgICByZXN1bHQgPSBuZXcgQXJyYXkob2JqZWN0Lmxlbmd0aCk7CiAgICAgIGZvciAoaW5kZXgyID0gMCwgbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aDsgaW5kZXgyIDwgbGVuZ3RoOyBpbmRleDIgKz0gMSkgewogICAgICAgIHBhaXIgPSBvYmplY3RbaW5kZXgyXTsKICAgICAgICBpZiAoX3RvU3RyaW5nLmNhbGwocGFpcikgIT09ICJbb2JqZWN0IE9iamVjdF0iKSByZXR1cm4gZmFsc2U7CiAgICAgICAga2V5czIgPSBPYmplY3Qua2V5cyhwYWlyKTsKICAgICAgICBpZiAoa2V5czIubGVuZ3RoICE9PSAxKSByZXR1cm4gZmFsc2U7CiAgICAgICAgcmVzdWx0W2luZGV4Ml0gPSBba2V5czJbMF0sIHBhaXJba2V5czJbMF1dXTsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIF9fbmFtZShyZXNvbHZlWWFtbFBhaXJzLCAicmVzb2x2ZVlhbWxQYWlycyIpOwogICAgZnVuY3Rpb24gY29uc3RydWN0WWFtbFBhaXJzKGRhdGEpIHsKICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBbXTsKICAgICAgdmFyIGluZGV4MiwgbGVuZ3RoLCBwYWlyLCBrZXlzMiwgcmVzdWx0LCBvYmplY3QgPSBkYXRhOwogICAgICByZXN1bHQgPSBuZXcgQXJyYXkob2JqZWN0Lmxlbmd0aCk7CiAgICAgIGZvciAoaW5kZXgyID0gMCwgbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aDsgaW5kZXgyIDwgbGVuZ3RoOyBpbmRleDIgKz0gMSkgewogICAgICAgIHBhaXIgPSBvYmplY3RbaW5kZXgyXTsKICAgICAgICBrZXlzMiA9IE9iamVjdC5rZXlzKHBhaXIpOwogICAgICAgIHJlc3VsdFtpbmRleDJdID0gW2tleXMyWzBdLCBwYWlyW2tleXMyWzBdXV07CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIF9fbmFtZShjb25zdHJ1Y3RZYW1sUGFpcnMsICJjb25zdHJ1Y3RZYW1sUGFpcnMiKTsKICAgIG1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoInRhZzp5YW1sLm9yZywyMDAyOnBhaXJzIiwgewogICAgICBraW5kOiAic2VxdWVuY2UiLAogICAgICByZXNvbHZlOiByZXNvbHZlWWFtbFBhaXJzLAogICAgICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxQYWlycwogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL3NldC5qcwp2YXIgcmVxdWlyZV9zZXQgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvc2V0LmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBUeXBlID0gcmVxdWlyZV90eXBlKCk7CiAgICB2YXIgX2hhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTsKICAgIGZ1bmN0aW9uIHJlc29sdmVZYW1sU2V0KGRhdGEpIHsKICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiB0cnVlOwogICAgICB2YXIga2V5Miwgb2JqZWN0ID0gZGF0YTsKICAgICAgZm9yIChrZXkyIGluIG9iamVjdCkgewogICAgICAgIGlmIChfaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleTIpKSB7CiAgICAgICAgICBpZiAob2JqZWN0W2tleTJdICE9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgX19uYW1lKHJlc29sdmVZYW1sU2V0LCAicmVzb2x2ZVlhbWxTZXQiKTsKICAgIGZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxTZXQoZGF0YSkgewogICAgICByZXR1cm4gZGF0YSAhPT0gbnVsbCA/IGRhdGEgOiB7fTsKICAgIH0KICAgIF9fbmFtZShjb25zdHJ1Y3RZYW1sU2V0LCAiY29uc3RydWN0WWFtbFNldCIpOwogICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgidGFnOnlhbWwub3JnLDIwMDI6c2V0IiwgewogICAgICBraW5kOiAibWFwcGluZyIsCiAgICAgIHJlc29sdmU6IHJlc29sdmVZYW1sU2V0LAogICAgICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxTZXQKICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hL2RlZmF1bHRfc2FmZS5qcwp2YXIgcmVxdWlyZV9kZWZhdWx0X3NhZmUgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3NjaGVtYS9kZWZhdWx0X3NhZmUuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIFNjaGVtYTIgPSByZXF1aXJlX3NjaGVtYSgpOwogICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgU2NoZW1hMih7CiAgICAgIGluY2x1ZGU6IFsKICAgICAgICByZXF1aXJlX2NvcmUoKQogICAgICBdLAogICAgICBpbXBsaWNpdDogWwogICAgICAgIHJlcXVpcmVfdGltZXN0YW1wKCksCiAgICAgICAgcmVxdWlyZV9tZXJnZSgpCiAgICAgIF0sCiAgICAgIGV4cGxpY2l0OiBbCiAgICAgICAgcmVxdWlyZV9iaW5hcnkoKSwKICAgICAgICByZXF1aXJlX29tYXAoKSwKICAgICAgICByZXF1aXJlX3BhaXJzKCksCiAgICAgICAgcmVxdWlyZV9zZXQoKQogICAgICBdCiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvanMvdW5kZWZpbmVkLmpzCnZhciByZXF1aXJlX3VuZGVmaW5lZCA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9qcy91bmRlZmluZWQuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIFR5cGUgPSByZXF1aXJlX3R5cGUoKTsKICAgIGZ1bmN0aW9uIHJlc29sdmVKYXZhc2NyaXB0VW5kZWZpbmVkKCkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIF9fbmFtZShyZXNvbHZlSmF2YXNjcmlwdFVuZGVmaW5lZCwgInJlc29sdmVKYXZhc2NyaXB0VW5kZWZpbmVkIik7CiAgICBmdW5jdGlvbiBjb25zdHJ1Y3RKYXZhc2NyaXB0VW5kZWZpbmVkKCkgewogICAgICByZXR1cm4gdm9pZCAwOwogICAgfQogICAgX19uYW1lKGNvbnN0cnVjdEphdmFzY3JpcHRVbmRlZmluZWQsICJjb25zdHJ1Y3RKYXZhc2NyaXB0VW5kZWZpbmVkIik7CiAgICBmdW5jdGlvbiByZXByZXNlbnRKYXZhc2NyaXB0VW5kZWZpbmVkKCkgewogICAgICByZXR1cm4gIiI7CiAgICB9CiAgICBfX25hbWUocmVwcmVzZW50SmF2YXNjcmlwdFVuZGVmaW5lZCwgInJlcHJlc2VudEphdmFzY3JpcHRVbmRlZmluZWQiKTsKICAgIGZ1bmN0aW9uIGlzVW5kZWZpbmVkKG9iamVjdCkgewogICAgICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gInVuZGVmaW5lZCI7CiAgICB9CiAgICBfX25hbWUoaXNVbmRlZmluZWQsICJpc1VuZGVmaW5lZCIpOwogICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgidGFnOnlhbWwub3JnLDIwMDI6anMvdW5kZWZpbmVkIiwgewogICAgICBraW5kOiAic2NhbGFyIiwKICAgICAgcmVzb2x2ZTogcmVzb2x2ZUphdmFzY3JpcHRVbmRlZmluZWQsCiAgICAgIGNvbnN0cnVjdDogY29uc3RydWN0SmF2YXNjcmlwdFVuZGVmaW5lZCwKICAgICAgcHJlZGljYXRlOiBpc1VuZGVmaW5lZCwKICAgICAgcmVwcmVzZW50OiByZXByZXNlbnRKYXZhc2NyaXB0VW5kZWZpbmVkCiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvanMvcmVnZXhwLmpzCnZhciByZXF1aXJlX3JlZ2V4cCA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9qcy9yZWdleHAuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIFR5cGUgPSByZXF1aXJlX3R5cGUoKTsKICAgIGZ1bmN0aW9uIHJlc29sdmVKYXZhc2NyaXB0UmVnRXhwKGRhdGEpIHsKICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTsKICAgICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7CiAgICAgIHZhciByZWdleHAgPSBkYXRhLCB0YWlsID0gL1wvKFtnaW1dKikkLy5leGVjKGRhdGEpLCBtb2RpZmllcnMgPSAiIjsKICAgICAgaWYgKHJlZ2V4cFswXSA9PT0gIi8iKSB7CiAgICAgICAgaWYgKHRhaWwpIG1vZGlmaWVycyA9IHRhaWxbMV07CiAgICAgICAgaWYgKG1vZGlmaWVycy5sZW5ndGggPiAzKSByZXR1cm4gZmFsc2U7CiAgICAgICAgaWYgKHJlZ2V4cFtyZWdleHAubGVuZ3RoIC0gbW9kaWZpZXJzLmxlbmd0aCAtIDFdICE9PSAiLyIpIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIF9fbmFtZShyZXNvbHZlSmF2YXNjcmlwdFJlZ0V4cCwgInJlc29sdmVKYXZhc2NyaXB0UmVnRXhwIik7CiAgICBmdW5jdGlvbiBjb25zdHJ1Y3RKYXZhc2NyaXB0UmVnRXhwKGRhdGEpIHsKICAgICAgdmFyIHJlZ2V4cCA9IGRhdGEsIHRhaWwgPSAvXC8oW2dpbV0qKSQvLmV4ZWMoZGF0YSksIG1vZGlmaWVycyA9ICIiOwogICAgICBpZiAocmVnZXhwWzBdID09PSAiLyIpIHsKICAgICAgICBpZiAodGFpbCkgbW9kaWZpZXJzID0gdGFpbFsxXTsKICAgICAgICByZWdleHAgPSByZWdleHAuc2xpY2UoMSwgcmVnZXhwLmxlbmd0aCAtIG1vZGlmaWVycy5sZW5ndGggLSAxKTsKICAgICAgfQogICAgICByZXR1cm4gbmV3IFJlZ0V4cChyZWdleHAsIG1vZGlmaWVycyk7CiAgICB9CiAgICBfX25hbWUoY29uc3RydWN0SmF2YXNjcmlwdFJlZ0V4cCwgImNvbnN0cnVjdEphdmFzY3JpcHRSZWdFeHAiKTsKICAgIGZ1bmN0aW9uIHJlcHJlc2VudEphdmFzY3JpcHRSZWdFeHAob2JqZWN0KSB7CiAgICAgIHZhciByZXN1bHQgPSAiLyIgKyBvYmplY3Quc291cmNlICsgIi8iOwogICAgICBpZiAob2JqZWN0Lmdsb2JhbCkgcmVzdWx0ICs9ICJnIjsKICAgICAgaWYgKG9iamVjdC5tdWx0aWxpbmUpIHJlc3VsdCArPSAibSI7CiAgICAgIGlmIChvYmplY3QuaWdub3JlQ2FzZSkgcmVzdWx0ICs9ICJpIjsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIF9fbmFtZShyZXByZXNlbnRKYXZhc2NyaXB0UmVnRXhwLCAicmVwcmVzZW50SmF2YXNjcmlwdFJlZ0V4cCIpOwogICAgZnVuY3Rpb24gaXNSZWdFeHAob2JqZWN0KSB7CiAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PT0gIltvYmplY3QgUmVnRXhwXSI7CiAgICB9CiAgICBfX25hbWUoaXNSZWdFeHAsICJpc1JlZ0V4cCIpOwogICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgidGFnOnlhbWwub3JnLDIwMDI6anMvcmVnZXhwIiwgewogICAgICBraW5kOiAic2NhbGFyIiwKICAgICAgcmVzb2x2ZTogcmVzb2x2ZUphdmFzY3JpcHRSZWdFeHAsCiAgICAgIGNvbnN0cnVjdDogY29uc3RydWN0SmF2YXNjcmlwdFJlZ0V4cCwKICAgICAgcHJlZGljYXRlOiBpc1JlZ0V4cCwKICAgICAgcmVwcmVzZW50OiByZXByZXNlbnRKYXZhc2NyaXB0UmVnRXhwCiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvanMvZnVuY3Rpb24uanMKdmFyIHJlcXVpcmVfZnVuY3Rpb24gPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvanMvZnVuY3Rpb24uanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIGVzcHJpbWE7CiAgICB0cnkgewogICAgICBfcmVxdWlyZSA9IF9fcmVxdWlyZTsKICAgICAgZXNwcmltYSA9IF9yZXF1aXJlKCJlc3ByaW1hIik7CiAgICB9IGNhdGNoIChfMykgewogICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gInVuZGVmaW5lZCIpIGVzcHJpbWEgPSB3aW5kb3cuZXNwcmltYTsKICAgIH0KICAgIHZhciBUeXBlID0gcmVxdWlyZV90eXBlKCk7CiAgICBmdW5jdGlvbiByZXNvbHZlSmF2YXNjcmlwdEZ1bmN0aW9uKGRhdGEpIHsKICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgc291cmNlID0gIigiICsgZGF0YSArICIpIiwgYXN0ID0gZXNwcmltYS5wYXJzZShzb3VyY2UsIHsgcmFuZ2U6IHRydWUgfSk7CiAgICAgICAgaWYgKGFzdC50eXBlICE9PSAiUHJvZ3JhbSIgfHwgYXN0LmJvZHkubGVuZ3RoICE9PSAxIHx8IGFzdC5ib2R5WzBdLnR5cGUgIT09ICJFeHByZXNzaW9uU3RhdGVtZW50IiB8fCBhc3QuYm9keVswXS5leHByZXNzaW9uLnR5cGUgIT09ICJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbiIgJiYgYXN0LmJvZHlbMF0uZXhwcmVzc2lvbi50eXBlICE9PSAiRnVuY3Rpb25FeHByZXNzaW9uIikgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICBfX25hbWUocmVzb2x2ZUphdmFzY3JpcHRGdW5jdGlvbiwgInJlc29sdmVKYXZhc2NyaXB0RnVuY3Rpb24iKTsKICAgIGZ1bmN0aW9uIGNvbnN0cnVjdEphdmFzY3JpcHRGdW5jdGlvbihkYXRhKSB7CiAgICAgIHZhciBzb3VyY2UgPSAiKCIgKyBkYXRhICsgIikiLCBhc3QgPSBlc3ByaW1hLnBhcnNlKHNvdXJjZSwgeyByYW5nZTogdHJ1ZSB9KSwgcGFyYW1zID0gW10sIGJvZHkzOwogICAgICBpZiAoYXN0LnR5cGUgIT09ICJQcm9ncmFtIiB8fCBhc3QuYm9keS5sZW5ndGggIT09IDEgfHwgYXN0LmJvZHlbMF0udHlwZSAhPT0gIkV4cHJlc3Npb25TdGF0ZW1lbnQiIHx8IGFzdC5ib2R5WzBdLmV4cHJlc3Npb24udHlwZSAhPT0gIkFycm93RnVuY3Rpb25FeHByZXNzaW9uIiAmJiBhc3QuYm9keVswXS5leHByZXNzaW9uLnR5cGUgIT09ICJGdW5jdGlvbkV4cHJlc3Npb24iKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJGYWlsZWQgdG8gcmVzb2x2ZSBmdW5jdGlvbiIpOwogICAgICB9CiAgICAgIGFzdC5ib2R5WzBdLmV4cHJlc3Npb24ucGFyYW1zLmZvckVhY2goZnVuY3Rpb24ocGFyYW0pIHsKICAgICAgICBwYXJhbXMucHVzaChwYXJhbS5uYW1lKTsKICAgICAgfSk7CiAgICAgIGJvZHkzID0gYXN0LmJvZHlbMF0uZXhwcmVzc2lvbi5ib2R5LnJhbmdlOwogICAgICBpZiAoYXN0LmJvZHlbMF0uZXhwcmVzc2lvbi5ib2R5LnR5cGUgPT09ICJCbG9ja1N0YXRlbWVudCIpIHsKICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKHBhcmFtcywgc291cmNlLnNsaWNlKGJvZHkzWzBdICsgMSwgYm9keTNbMV0gLSAxKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbihwYXJhbXMsICJyZXR1cm4gIiArIHNvdXJjZS5zbGljZShib2R5M1swXSwgYm9keTNbMV0pKTsKICAgIH0KICAgIF9fbmFtZShjb25zdHJ1Y3RKYXZhc2NyaXB0RnVuY3Rpb24sICJjb25zdHJ1Y3RKYXZhc2NyaXB0RnVuY3Rpb24iKTsKICAgIGZ1bmN0aW9uIHJlcHJlc2VudEphdmFzY3JpcHRGdW5jdGlvbihvYmplY3QpIHsKICAgICAgcmV0dXJuIG9iamVjdC50b1N0cmluZygpOwogICAgfQogICAgX19uYW1lKHJlcHJlc2VudEphdmFzY3JpcHRGdW5jdGlvbiwgInJlcHJlc2VudEphdmFzY3JpcHRGdW5jdGlvbiIpOwogICAgZnVuY3Rpb24gaXNGdW5jdGlvbjIob2JqZWN0KSB7CiAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PT0gIltvYmplY3QgRnVuY3Rpb25dIjsKICAgIH0KICAgIF9fbmFtZShpc0Z1bmN0aW9uMiwgImlzRnVuY3Rpb24iKTsKICAgIG1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoInRhZzp5YW1sLm9yZywyMDAyOmpzL2Z1bmN0aW9uIiwgewogICAgICBraW5kOiAic2NhbGFyIiwKICAgICAgcmVzb2x2ZTogcmVzb2x2ZUphdmFzY3JpcHRGdW5jdGlvbiwKICAgICAgY29uc3RydWN0OiBjb25zdHJ1Y3RKYXZhc2NyaXB0RnVuY3Rpb24sCiAgICAgIHByZWRpY2F0ZTogaXNGdW5jdGlvbjIsCiAgICAgIHJlcHJlc2VudDogcmVwcmVzZW50SmF2YXNjcmlwdEZ1bmN0aW9uCiAgICB9KTsKICAgIHZhciBfcmVxdWlyZTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3NjaGVtYS9kZWZhdWx0X2Z1bGwuanMKdmFyIHJlcXVpcmVfZGVmYXVsdF9mdWxsID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvZGVmYXVsdF9mdWxsLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBTY2hlbWEyID0gcmVxdWlyZV9zY2hlbWEoKTsKICAgIG1vZHVsZS5leHBvcnRzID0gU2NoZW1hMi5ERUZBVUxUID0gbmV3IFNjaGVtYTIoewogICAgICBpbmNsdWRlOiBbCiAgICAgICAgcmVxdWlyZV9kZWZhdWx0X3NhZmUoKQogICAgICBdLAogICAgICBleHBsaWNpdDogWwogICAgICAgIHJlcXVpcmVfdW5kZWZpbmVkKCksCiAgICAgICAgcmVxdWlyZV9yZWdleHAoKSwKICAgICAgICByZXF1aXJlX2Z1bmN0aW9uKCkKICAgICAgXQogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9sb2FkZXIuanMKdmFyIHJlcXVpcmVfbG9hZGVyID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9sb2FkZXIuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIGNvbW1vbiA9IHJlcXVpcmVfY29tbW9uKCk7CiAgICB2YXIgWUFNTEV4Y2VwdGlvbiA9IHJlcXVpcmVfZXhjZXB0aW9uKCk7CiAgICB2YXIgTWFyayA9IHJlcXVpcmVfbWFyaygpOwogICAgdmFyIERFRkFVTFRfU0FGRV9TQ0hFTUEgPSByZXF1aXJlX2RlZmF1bHRfc2FmZSgpOwogICAgdmFyIERFRkFVTFRfRlVMTF9TQ0hFTUEgPSByZXF1aXJlX2RlZmF1bHRfZnVsbCgpOwogICAgdmFyIF9oYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7CiAgICB2YXIgQ09OVEVYVF9GTE9XX0lOID0gMTsKICAgIHZhciBDT05URVhUX0ZMT1dfT1VUID0gMjsKICAgIHZhciBDT05URVhUX0JMT0NLX0lOID0gMzsKICAgIHZhciBDT05URVhUX0JMT0NLX09VVCA9IDQ7CiAgICB2YXIgQ0hPTVBJTkdfQ0xJUCA9IDE7CiAgICB2YXIgQ0hPTVBJTkdfU1RSSVAgPSAyOwogICAgdmFyIENIT01QSU5HX0tFRVAgPSAzOwogICAgdmFyIFBBVFRFUk5fTk9OX1BSSU5UQUJMRSA9IC9bXHgwMC1ceDA4XHgwQlx4MENceDBFLVx4MUZceDdGLVx4ODRceDg2LVx4OUZcdUZGRkVcdUZGRkZdfFtcdUQ4MDAtXHVEQkZGXSg/IVtcdURDMDAtXHVERkZGXSl8KD86W15cdUQ4MDAtXHVEQkZGXXxeKVtcdURDMDAtXHVERkZGXS87CiAgICB2YXIgUEFUVEVSTl9OT05fQVNDSUlfTElORV9CUkVBS1MgPSAvW1x4ODVcdTIwMjhcdTIwMjldLzsKICAgIHZhciBQQVRURVJOX0ZMT1dfSU5ESUNBVE9SUyA9IC9bLFxbXF1ce1x9XS87CiAgICB2YXIgUEFUVEVSTl9UQUdfSEFORExFID0gL14oPzohfCEhfCFbYS16XC1dKyEpJC9pOwogICAgdmFyIFBBVFRFUk5fVEFHX1VSSSA9IC9eKD86IXxbXixcW1xdXHtcfV0pKD86JVswLTlhLWZdezJ9fFswLTlhLXpcLSM7XC9cPzpAJj1cK1wkLF9cLiF+XConXChcKVxbXF1dKSokL2k7CiAgICBmdW5jdGlvbiBfY2xhc3Mob2JqKSB7CiAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKTsKICAgIH0KICAgIF9fbmFtZShfY2xhc3MsICJfY2xhc3MiKTsKICAgIGZ1bmN0aW9uIGlzX0VPTChjMTApIHsKICAgICAgcmV0dXJuIGMxMCA9PT0gMTAgfHwgYzEwID09PSAxMzsKICAgIH0KICAgIF9fbmFtZShpc19FT0wsICJpc19FT0wiKTsKICAgIGZ1bmN0aW9uIGlzX1dISVRFX1NQQUNFKGMxMCkgewogICAgICByZXR1cm4gYzEwID09PSA5IHx8IGMxMCA9PT0gMzI7CiAgICB9CiAgICBfX25hbWUoaXNfV0hJVEVfU1BBQ0UsICJpc19XSElURV9TUEFDRSIpOwogICAgZnVuY3Rpb24gaXNfV1NfT1JfRU9MKGMxMCkgewogICAgICByZXR1cm4gYzEwID09PSA5IHx8IGMxMCA9PT0gMzIgfHwgYzEwID09PSAxMCB8fCBjMTAgPT09IDEzOwogICAgfQogICAgX19uYW1lKGlzX1dTX09SX0VPTCwgImlzX1dTX09SX0VPTCIpOwogICAgZnVuY3Rpb24gaXNfRkxPV19JTkRJQ0FUT1IoYzEwKSB7CiAgICAgIHJldHVybiBjMTAgPT09IDQ0IHx8IGMxMCA9PT0gOTEgfHwgYzEwID09PSA5MyB8fCBjMTAgPT09IDEyMyB8fCBjMTAgPT09IDEyNTsKICAgIH0KICAgIF9fbmFtZShpc19GTE9XX0lORElDQVRPUiwgImlzX0ZMT1dfSU5ESUNBVE9SIik7CiAgICBmdW5jdGlvbiBmcm9tSGV4Q29kZShjMTApIHsKICAgICAgdmFyIGxjOwogICAgICBpZiAoNDggPD0gYzEwICYmIGMxMCA8PSA1NykgewogICAgICAgIHJldHVybiBjMTAgLSA0ODsKICAgICAgfQogICAgICBsYyA9IGMxMCB8IDMyOwogICAgICBpZiAoOTcgPD0gbGMgJiYgbGMgPD0gMTAyKSB7CiAgICAgICAgcmV0dXJuIGxjIC0gOTcgKyAxMDsKICAgICAgfQogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBfX25hbWUoZnJvbUhleENvZGUsICJmcm9tSGV4Q29kZSIpOwogICAgZnVuY3Rpb24gZXNjYXBlZEhleExlbihjMTApIHsKICAgICAgaWYgKGMxMCA9PT0gMTIwKSB7CiAgICAgICAgcmV0dXJuIDI7CiAgICAgIH0KICAgICAgaWYgKGMxMCA9PT0gMTE3KSB7CiAgICAgICAgcmV0dXJuIDQ7CiAgICAgIH0KICAgICAgaWYgKGMxMCA9PT0gODUpIHsKICAgICAgICByZXR1cm4gODsKICAgICAgfQogICAgICByZXR1cm4gMDsKICAgIH0KICAgIF9fbmFtZShlc2NhcGVkSGV4TGVuLCAiZXNjYXBlZEhleExlbiIpOwogICAgZnVuY3Rpb24gZnJvbURlY2ltYWxDb2RlKGMxMCkgewogICAgICBpZiAoNDggPD0gYzEwICYmIGMxMCA8PSA1NykgewogICAgICAgIHJldHVybiBjMTAgLSA0ODsKICAgICAgfQogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBfX25hbWUoZnJvbURlY2ltYWxDb2RlLCAiZnJvbURlY2ltYWxDb2RlIik7CiAgICBmdW5jdGlvbiBzaW1wbGVFc2NhcGVTZXF1ZW5jZShjMTApIHsKICAgICAgcmV0dXJuIGMxMCA9PT0gNDggPyAiXDAiIDogYzEwID09PSA5NyA/ICJceDA3IiA6IGMxMCA9PT0gOTggPyAiXGIiIDogYzEwID09PSAxMTYgPyAiCSIgOiBjMTAgPT09IDkgPyAiCSIgOiBjMTAgPT09IDExMCA/ICJcbiIgOiBjMTAgPT09IDExOCA/ICJcdiIgOiBjMTAgPT09IDEwMiA/ICJcZiIgOiBjMTAgPT09IDExNCA/ICJcciIgOiBjMTAgPT09IDEwMSA/ICJceDFCIiA6IGMxMCA9PT0gMzIgPyAiICIgOiBjMTAgPT09IDM0ID8gJyInIDogYzEwID09PSA0NyA/ICIvIiA6IGMxMCA9PT0gOTIgPyAiXFwiIDogYzEwID09PSA3OCA/ICJceDg1IiA6IGMxMCA9PT0gOTUgPyAiXHhBMCIgOiBjMTAgPT09IDc2ID8gIlx1MjAyOCIgOiBjMTAgPT09IDgwID8gIlx1MjAyOSIgOiAiIjsKICAgIH0KICAgIF9fbmFtZShzaW1wbGVFc2NhcGVTZXF1ZW5jZSwgInNpbXBsZUVzY2FwZVNlcXVlbmNlIik7CiAgICBmdW5jdGlvbiBjaGFyRnJvbUNvZGVwb2ludChjMTApIHsKICAgICAgaWYgKGMxMCA8PSA2NTUzNSkgewogICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGMxMCk7CiAgICAgIH0KICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoCiAgICAgICAgKGMxMCAtIDY1NTM2ID4+IDEwKSArIDU1Mjk2LAogICAgICAgIChjMTAgLSA2NTUzNiAmIDEwMjMpICsgNTYzMjAKICAgICAgKTsKICAgIH0KICAgIF9fbmFtZShjaGFyRnJvbUNvZGVwb2ludCwgImNoYXJGcm9tQ29kZXBvaW50Iik7CiAgICBmdW5jdGlvbiBzZXRQcm9wZXJ0eShvYmplY3QsIGtleTIsIHZhbHVlMikgewogICAgICBpZiAoa2V5MiA9PT0gIl9fcHJvdG9fXyIpIHsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBrZXkyLCB7CiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgd3JpdGFibGU6IHRydWUsCiAgICAgICAgICB2YWx1ZTogdmFsdWUyCiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgb2JqZWN0W2tleTJdID0gdmFsdWUyOwogICAgICB9CiAgICB9CiAgICBfX25hbWUoc2V0UHJvcGVydHksICJzZXRQcm9wZXJ0eSIpOwogICAgdmFyIHNpbXBsZUVzY2FwZUNoZWNrID0gbmV3IEFycmF5KDI1Nik7CiAgICB2YXIgc2ltcGxlRXNjYXBlTWFwID0gbmV3IEFycmF5KDI1Nik7CiAgICBmb3IgKGkxMCA9IDA7IGkxMCA8IDI1NjsgaTEwKyspIHsKICAgICAgc2ltcGxlRXNjYXBlQ2hlY2tbaTEwXSA9IHNpbXBsZUVzY2FwZVNlcXVlbmNlKGkxMCkgPyAxIDogMDsKICAgICAgc2ltcGxlRXNjYXBlTWFwW2kxMF0gPSBzaW1wbGVFc2NhcGVTZXF1ZW5jZShpMTApOwogICAgfQogICAgZnVuY3Rpb24gU3RhdGUoaW5wdXQsIG9wdGlvbnMpIHsKICAgICAgdGhpcy5pbnB1dCA9IGlucHV0OwogICAgICB0aGlzLmZpbGVuYW1lID0gb3B0aW9uc1siZmlsZW5hbWUiXSB8fCBudWxsOwogICAgICB0aGlzLnNjaGVtYSA9IG9wdGlvbnNbInNjaGVtYSJdIHx8IERFRkFVTFRfRlVMTF9TQ0hFTUE7CiAgICAgIHRoaXMub25XYXJuaW5nID0gb3B0aW9uc1sib25XYXJuaW5nIl0gfHwgbnVsbDsKICAgICAgdGhpcy5sZWdhY3kgPSBvcHRpb25zWyJsZWdhY3kiXSB8fCBmYWxzZTsKICAgICAgdGhpcy5qc29uID0gb3B0aW9uc1sianNvbiJdIHx8IGZhbHNlOwogICAgICB0aGlzLmxpc3RlbmVyID0gb3B0aW9uc1sibGlzdGVuZXIiXSB8fCBudWxsOwogICAgICB0aGlzLmltcGxpY2l0VHlwZXMgPSB0aGlzLnNjaGVtYS5jb21waWxlZEltcGxpY2l0OwogICAgICB0aGlzLnR5cGVNYXAgPSB0aGlzLnNjaGVtYS5jb21waWxlZFR5cGVNYXA7CiAgICAgIHRoaXMubGVuZ3RoID0gaW5wdXQubGVuZ3RoOwogICAgICB0aGlzLnBvc2l0aW9uID0gMDsKICAgICAgdGhpcy5saW5lID0gMDsKICAgICAgdGhpcy5saW5lU3RhcnQgPSAwOwogICAgICB0aGlzLmxpbmVJbmRlbnQgPSAwOwogICAgICB0aGlzLmRvY3VtZW50cyA9IFtdOwogICAgfQogICAgX19uYW1lKFN0YXRlLCAiU3RhdGUiKTsKICAgIGZ1bmN0aW9uIGdlbmVyYXRlRXJyb3Ioc3RhdGUsIG1lc3NhZ2UyKSB7CiAgICAgIHJldHVybiBuZXcgWUFNTEV4Y2VwdGlvbigKICAgICAgICBtZXNzYWdlMiwKICAgICAgICBuZXcgTWFyayhzdGF0ZS5maWxlbmFtZSwgc3RhdGUuaW5wdXQsIHN0YXRlLnBvc2l0aW9uLCBzdGF0ZS5saW5lLCBzdGF0ZS5wb3NpdGlvbiAtIHN0YXRlLmxpbmVTdGFydCkKICAgICAgKTsKICAgIH0KICAgIF9fbmFtZShnZW5lcmF0ZUVycm9yLCAiZ2VuZXJhdGVFcnJvciIpOwogICAgZnVuY3Rpb24gdGhyb3dFcnJvcjIoc3RhdGUsIG1lc3NhZ2UyKSB7CiAgICAgIHRocm93IGdlbmVyYXRlRXJyb3Ioc3RhdGUsIG1lc3NhZ2UyKTsKICAgIH0KICAgIF9fbmFtZSh0aHJvd0Vycm9yMiwgInRocm93RXJyb3IiKTsKICAgIGZ1bmN0aW9uIHRocm93V2FybmluZyhzdGF0ZSwgbWVzc2FnZTIpIHsKICAgICAgaWYgKHN0YXRlLm9uV2FybmluZykgewogICAgICAgIHN0YXRlLm9uV2FybmluZy5jYWxsKG51bGwsIGdlbmVyYXRlRXJyb3Ioc3RhdGUsIG1lc3NhZ2UyKSk7CiAgICAgIH0KICAgIH0KICAgIF9fbmFtZSh0aHJvd1dhcm5pbmcsICJ0aHJvd1dhcm5pbmciKTsKICAgIHZhciBkaXJlY3RpdmVIYW5kbGVycyA9IHsKICAgICAgWUFNTDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbiBoYW5kbGVZYW1sRGlyZWN0aXZlKHN0YXRlLCBuYW1lLCBhcmdzKSB7CiAgICAgICAgdmFyIG1hdGNoMiwgbWFqb3IsIG1pbm9yOwogICAgICAgIGlmIChzdGF0ZS52ZXJzaW9uICE9PSBudWxsKSB7CiAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZSwgImR1cGxpY2F0aW9uIG9mICVZQU1MIGRpcmVjdGl2ZSIpOwogICAgICAgIH0KICAgICAgICBpZiAoYXJncy5sZW5ndGggIT09IDEpIHsKICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlLCAiWUFNTCBkaXJlY3RpdmUgYWNjZXB0cyBleGFjdGx5IG9uZSBhcmd1bWVudCIpOwogICAgICAgIH0KICAgICAgICBtYXRjaDIgPSAvXihbMC05XSspXC4oWzAtOV0rKSQvLmV4ZWMoYXJnc1swXSk7CiAgICAgICAgaWYgKG1hdGNoMiA9PT0gbnVsbCkgewogICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJpbGwtZm9ybWVkIGFyZ3VtZW50IG9mIHRoZSBZQU1MIGRpcmVjdGl2ZSIpOwogICAgICAgIH0KICAgICAgICBtYWpvciA9IHBhcnNlSW50KG1hdGNoMlsxXSwgMTApOwogICAgICAgIG1pbm9yID0gcGFyc2VJbnQobWF0Y2gyWzJdLCAxMCk7CiAgICAgICAgaWYgKG1ham9yICE9PSAxKSB7CiAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZSwgInVuYWNjZXB0YWJsZSBZQU1MIHZlcnNpb24gb2YgdGhlIGRvY3VtZW50Iik7CiAgICAgICAgfQogICAgICAgIHN0YXRlLnZlcnNpb24gPSBhcmdzWzBdOwogICAgICAgIHN0YXRlLmNoZWNrTGluZUJyZWFrcyA9IG1pbm9yIDwgMjsKICAgICAgICBpZiAobWlub3IgIT09IDEgJiYgbWlub3IgIT09IDIpIHsKICAgICAgICAgIHRocm93V2FybmluZyhzdGF0ZSwgInVuc3VwcG9ydGVkIFlBTUwgdmVyc2lvbiBvZiB0aGUgZG9jdW1lbnQiKTsKICAgICAgICB9CiAgICAgIH0sICJoYW5kbGVZYW1sRGlyZWN0aXZlIiksCiAgICAgIFRBRzogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbiBoYW5kbGVUYWdEaXJlY3RpdmUoc3RhdGUsIG5hbWUsIGFyZ3MpIHsKICAgICAgICB2YXIgaGFuZGxlMywgcHJlZml4OwogICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPT0gMikgewogICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJUQUcgZGlyZWN0aXZlIGFjY2VwdHMgZXhhY3RseSB0d28gYXJndW1lbnRzIik7CiAgICAgICAgfQogICAgICAgIGhhbmRsZTMgPSBhcmdzWzBdOwogICAgICAgIHByZWZpeCA9IGFyZ3NbMV07CiAgICAgICAgaWYgKCFQQVRURVJOX1RBR19IQU5ETEUudGVzdChoYW5kbGUzKSkgewogICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJpbGwtZm9ybWVkIHRhZyBoYW5kbGUgKGZpcnN0IGFyZ3VtZW50KSBvZiB0aGUgVEFHIGRpcmVjdGl2ZSIpOwogICAgICAgIH0KICAgICAgICBpZiAoX2hhc093blByb3BlcnR5LmNhbGwoc3RhdGUudGFnTWFwLCBoYW5kbGUzKSkgewogICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICd0aGVyZSBpcyBhIHByZXZpb3VzbHkgZGVjbGFyZWQgc3VmZml4IGZvciAiJyArIGhhbmRsZTMgKyAnIiB0YWcgaGFuZGxlJyk7CiAgICAgICAgfQogICAgICAgIGlmICghUEFUVEVSTl9UQUdfVVJJLnRlc3QocHJlZml4KSkgewogICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJpbGwtZm9ybWVkIHRhZyBwcmVmaXggKHNlY29uZCBhcmd1bWVudCkgb2YgdGhlIFRBRyBkaXJlY3RpdmUiKTsKICAgICAgICB9CiAgICAgICAgc3RhdGUudGFnTWFwW2hhbmRsZTNdID0gcHJlZml4OwogICAgICB9LCAiaGFuZGxlVGFnRGlyZWN0aXZlIikKICAgIH07CiAgICBmdW5jdGlvbiBjYXB0dXJlU2VnbWVudChzdGF0ZSwgc3RhcnQsIGVuZCwgY2hlY2tKc29uKSB7CiAgICAgIHZhciBfcG9zaXRpb24sIF9sZW5ndGgsIF9jaGFyYWN0ZXIsIF9yZXN1bHQ7CiAgICAgIGlmIChzdGFydCA8IGVuZCkgewogICAgICAgIF9yZXN1bHQgPSBzdGF0ZS5pbnB1dC5zbGljZShzdGFydCwgZW5kKTsKICAgICAgICBpZiAoY2hlY2tKc29uKSB7CiAgICAgICAgICBmb3IgKF9wb3NpdGlvbiA9IDAsIF9sZW5ndGggPSBfcmVzdWx0Lmxlbmd0aDsgX3Bvc2l0aW9uIDwgX2xlbmd0aDsgX3Bvc2l0aW9uICs9IDEpIHsKICAgICAgICAgICAgX2NoYXJhY3RlciA9IF9yZXN1bHQuY2hhckNvZGVBdChfcG9zaXRpb24pOwogICAgICAgICAgICBpZiAoIShfY2hhcmFjdGVyID09PSA5IHx8IDMyIDw9IF9jaGFyYWN0ZXIgJiYgX2NoYXJhY3RlciA8PSAxMTE0MTExKSkgewogICAgICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlLCAiZXhwZWN0ZWQgdmFsaWQgSlNPTiBjaGFyYWN0ZXIiKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoUEFUVEVSTl9OT05fUFJJTlRBQkxFLnRlc3QoX3Jlc3VsdCkpIHsKICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlLCAidGhlIHN0cmVhbSBjb250YWlucyBub24tcHJpbnRhYmxlIGNoYXJhY3RlcnMiKTsKICAgICAgICB9CiAgICAgICAgc3RhdGUucmVzdWx0ICs9IF9yZXN1bHQ7CiAgICAgIH0KICAgIH0KICAgIF9fbmFtZShjYXB0dXJlU2VnbWVudCwgImNhcHR1cmVTZWdtZW50Iik7CiAgICBmdW5jdGlvbiBtZXJnZU1hcHBpbmdzKHN0YXRlLCBkZXN0aW5hdGlvbiwgc291cmNlLCBvdmVycmlkYWJsZUtleXMpIHsKICAgICAgdmFyIHNvdXJjZUtleXMsIGtleTIsIGluZGV4MiwgcXVhbnRpdHk7CiAgICAgIGlmICghY29tbW9uLmlzT2JqZWN0KHNvdXJjZSkpIHsKICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZSwgImNhbm5vdCBtZXJnZSBtYXBwaW5nczsgdGhlIHByb3ZpZGVkIHNvdXJjZSBvYmplY3QgaXMgdW5hY2NlcHRhYmxlIik7CiAgICAgIH0KICAgICAgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7CiAgICAgIGZvciAoaW5kZXgyID0gMCwgcXVhbnRpdHkgPSBzb3VyY2VLZXlzLmxlbmd0aDsgaW5kZXgyIDwgcXVhbnRpdHk7IGluZGV4MiArPSAxKSB7CiAgICAgICAga2V5MiA9IHNvdXJjZUtleXNbaW5kZXgyXTsKICAgICAgICBpZiAoIV9oYXNPd25Qcm9wZXJ0eS5jYWxsKGRlc3RpbmF0aW9uLCBrZXkyKSkgewogICAgICAgICAgc2V0UHJvcGVydHkoZGVzdGluYXRpb24sIGtleTIsIHNvdXJjZVtrZXkyXSk7CiAgICAgICAgICBvdmVycmlkYWJsZUtleXNba2V5Ml0gPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgX19uYW1lKG1lcmdlTWFwcGluZ3MsICJtZXJnZU1hcHBpbmdzIik7CiAgICBmdW5jdGlvbiBzdG9yZU1hcHBpbmdQYWlyKHN0YXRlLCBfcmVzdWx0LCBvdmVycmlkYWJsZUtleXMsIGtleVRhZywga2V5Tm9kZSwgdmFsdWVOb2RlLCBzdGFydExpbmUsIHN0YXJ0UG9zKSB7CiAgICAgIHZhciBpbmRleDIsIHF1YW50aXR5OwogICAgICBpZiAoQXJyYXkuaXNBcnJheShrZXlOb2RlKSkgewogICAgICAgIGtleU5vZGUgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChrZXlOb2RlKTsKICAgICAgICBmb3IgKGluZGV4MiA9IDAsIHF1YW50aXR5ID0ga2V5Tm9kZS5sZW5ndGg7IGluZGV4MiA8IHF1YW50aXR5OyBpbmRleDIgKz0gMSkgewogICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoa2V5Tm9kZVtpbmRleDJdKSkgewogICAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZSwgIm5lc3RlZCBhcnJheXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW5zaWRlIGtleXMiKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0eXBlb2Yga2V5Tm9kZSA9PT0gIm9iamVjdCIgJiYgX2NsYXNzKGtleU5vZGVbaW5kZXgyXSkgPT09ICJbb2JqZWN0IE9iamVjdF0iKSB7CiAgICAgICAgICAgIGtleU5vZGVbaW5kZXgyXSA9ICJbb2JqZWN0IE9iamVjdF0iOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAodHlwZW9mIGtleU5vZGUgPT09ICJvYmplY3QiICYmIF9jbGFzcyhrZXlOb2RlKSA9PT0gIltvYmplY3QgT2JqZWN0XSIpIHsKICAgICAgICBrZXlOb2RlID0gIltvYmplY3QgT2JqZWN0XSI7CiAgICAgIH0KICAgICAga2V5Tm9kZSA9IFN0cmluZyhrZXlOb2RlKTsKICAgICAgaWYgKF9yZXN1bHQgPT09IG51bGwpIHsKICAgICAgICBfcmVzdWx0ID0ge307CiAgICAgIH0KICAgICAgaWYgKGtleVRhZyA9PT0gInRhZzp5YW1sLm9yZywyMDAyOm1lcmdlIikgewogICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlTm9kZSkpIHsKICAgICAgICAgIGZvciAoaW5kZXgyID0gMCwgcXVhbnRpdHkgPSB2YWx1ZU5vZGUubGVuZ3RoOyBpbmRleDIgPCBxdWFudGl0eTsgaW5kZXgyICs9IDEpIHsKICAgICAgICAgICAgbWVyZ2VNYXBwaW5ncyhzdGF0ZSwgX3Jlc3VsdCwgdmFsdWVOb2RlW2luZGV4Ml0sIG92ZXJyaWRhYmxlS2V5cyk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG1lcmdlTWFwcGluZ3Moc3RhdGUsIF9yZXN1bHQsIHZhbHVlTm9kZSwgb3ZlcnJpZGFibGVLZXlzKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKCFzdGF0ZS5qc29uICYmICFfaGFzT3duUHJvcGVydHkuY2FsbChvdmVycmlkYWJsZUtleXMsIGtleU5vZGUpICYmIF9oYXNPd25Qcm9wZXJ0eS5jYWxsKF9yZXN1bHQsIGtleU5vZGUpKSB7CiAgICAgICAgICBzdGF0ZS5saW5lID0gc3RhcnRMaW5lIHx8IHN0YXRlLmxpbmU7CiAgICAgICAgICBzdGF0ZS5wb3NpdGlvbiA9IHN0YXJ0UG9zIHx8IHN0YXRlLnBvc2l0aW9uOwogICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJkdXBsaWNhdGVkIG1hcHBpbmcga2V5Iik7CiAgICAgICAgfQogICAgICAgIHNldFByb3BlcnR5KF9yZXN1bHQsIGtleU5vZGUsIHZhbHVlTm9kZSk7CiAgICAgICAgZGVsZXRlIG92ZXJyaWRhYmxlS2V5c1trZXlOb2RlXTsKICAgICAgfQogICAgICByZXR1cm4gX3Jlc3VsdDsKICAgIH0KICAgIF9fbmFtZShzdG9yZU1hcHBpbmdQYWlyLCAic3RvcmVNYXBwaW5nUGFpciIpOwogICAgZnVuY3Rpb24gcmVhZExpbmVCcmVhayhzdGF0ZSkgewogICAgICB2YXIgY2g7CiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7CiAgICAgIGlmIChjaCA9PT0gMTApIHsKICAgICAgICBzdGF0ZS5wb3NpdGlvbisrOwogICAgICB9IGVsc2UgaWYgKGNoID09PSAxMykgewogICAgICAgIHN0YXRlLnBvc2l0aW9uKys7CiAgICAgICAgaWYgKHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pID09PSAxMCkgewogICAgICAgICAgc3RhdGUucG9zaXRpb24rKzsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJhIGxpbmUgYnJlYWsgaXMgZXhwZWN0ZWQiKTsKICAgICAgfQogICAgICBzdGF0ZS5saW5lICs9IDE7CiAgICAgIHN0YXRlLmxpbmVTdGFydCA9IHN0YXRlLnBvc2l0aW9uOwogICAgfQogICAgX19uYW1lKHJlYWRMaW5lQnJlYWssICJyZWFkTGluZUJyZWFrIik7CiAgICBmdW5jdGlvbiBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCBhbGxvd0NvbW1lbnRzLCBjaGVja0luZGVudCkgewogICAgICB2YXIgbGluZUJyZWFrcyA9IDAsIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7CiAgICAgIHdoaWxlIChjaCAhPT0gMCkgewogICAgICAgIHdoaWxlIChpc19XSElURV9TUEFDRShjaCkpIHsKICAgICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTsKICAgICAgICB9CiAgICAgICAgaWYgKGFsbG93Q29tbWVudHMgJiYgY2ggPT09IDM1KSB7CiAgICAgICAgICBkbyB7CiAgICAgICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTsKICAgICAgICAgIH0gd2hpbGUgKGNoICE9PSAxMCAmJiBjaCAhPT0gMTMgJiYgY2ggIT09IDApOwogICAgICAgIH0KICAgICAgICBpZiAoaXNfRU9MKGNoKSkgewogICAgICAgICAgcmVhZExpbmVCcmVhayhzdGF0ZSk7CiAgICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pOwogICAgICAgICAgbGluZUJyZWFrcysrOwogICAgICAgICAgc3RhdGUubGluZUluZGVudCA9IDA7CiAgICAgICAgICB3aGlsZSAoY2ggPT09IDMyKSB7CiAgICAgICAgICAgIHN0YXRlLmxpbmVJbmRlbnQrKzsKICAgICAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGNoZWNrSW5kZW50ICE9PSAtMSAmJiBsaW5lQnJlYWtzICE9PSAwICYmIHN0YXRlLmxpbmVJbmRlbnQgPCBjaGVja0luZGVudCkgewogICAgICAgIHRocm93V2FybmluZyhzdGF0ZSwgImRlZmljaWVudCBpbmRlbnRhdGlvbiIpOwogICAgICB9CiAgICAgIHJldHVybiBsaW5lQnJlYWtzOwogICAgfQogICAgX19uYW1lKHNraXBTZXBhcmF0aW9uU3BhY2UsICJza2lwU2VwYXJhdGlvblNwYWNlIik7CiAgICBmdW5jdGlvbiB0ZXN0RG9jdW1lbnRTZXBhcmF0b3Ioc3RhdGUpIHsKICAgICAgdmFyIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uLCBjaDsKICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KF9wb3NpdGlvbik7CiAgICAgIGlmICgoY2ggPT09IDQ1IHx8IGNoID09PSA0NikgJiYgY2ggPT09IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoX3Bvc2l0aW9uICsgMSkgJiYgY2ggPT09IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoX3Bvc2l0aW9uICsgMikpIHsKICAgICAgICBfcG9zaXRpb24gKz0gMzsKICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoX3Bvc2l0aW9uKTsKICAgICAgICBpZiAoY2ggPT09IDAgfHwgaXNfV1NfT1JfRU9MKGNoKSkgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIF9fbmFtZSh0ZXN0RG9jdW1lbnRTZXBhcmF0b3IsICJ0ZXN0RG9jdW1lbnRTZXBhcmF0b3IiKTsKICAgIGZ1bmN0aW9uIHdyaXRlRm9sZGVkTGluZXMoc3RhdGUsIGNvdW50MikgewogICAgICBpZiAoY291bnQyID09PSAxKSB7CiAgICAgICAgc3RhdGUucmVzdWx0ICs9ICIgIjsKICAgICAgfSBlbHNlIGlmIChjb3VudDIgPiAxKSB7CiAgICAgICAgc3RhdGUucmVzdWx0ICs9IGNvbW1vbi5yZXBlYXQoIlxuIiwgY291bnQyIC0gMSk7CiAgICAgIH0KICAgIH0KICAgIF9fbmFtZSh3cml0ZUZvbGRlZExpbmVzLCAid3JpdGVGb2xkZWRMaW5lcyIpOwogICAgZnVuY3Rpb24gcmVhZFBsYWluU2NhbGFyKHN0YXRlLCBub2RlSW5kZW50LCB3aXRoaW5GbG93Q29sbGVjdGlvbikgewogICAgICB2YXIgcHJlY2VkaW5nLCBmb2xsb3dpbmcsIGNhcHR1cmVTdGFydCwgY2FwdHVyZUVuZCwgaGFzUGVuZGluZ0NvbnRlbnQsIF9saW5lLCBfbGluZVN0YXJ0LCBfbGluZUluZGVudCwgX2tpbmQgPSBzdGF0ZS5raW5kLCBfcmVzdWx0ID0gc3RhdGUucmVzdWx0LCBjaDsKICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTsKICAgICAgaWYgKGlzX1dTX09SX0VPTChjaCkgfHwgaXNfRkxPV19JTkRJQ0FUT1IoY2gpIHx8IGNoID09PSAzNSB8fCBjaCA9PT0gMzggfHwgY2ggPT09IDQyIHx8IGNoID09PSAzMyB8fCBjaCA9PT0gMTI0IHx8IGNoID09PSA2MiB8fCBjaCA9PT0gMzkgfHwgY2ggPT09IDM0IHx8IGNoID09PSAzNyB8fCBjaCA9PT0gNjQgfHwgY2ggPT09IDk2KSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGlmIChjaCA9PT0gNjMgfHwgY2ggPT09IDQ1KSB7CiAgICAgICAgZm9sbG93aW5nID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbiArIDEpOwogICAgICAgIGlmIChpc19XU19PUl9FT0woZm9sbG93aW5nKSB8fCB3aXRoaW5GbG93Q29sbGVjdGlvbiAmJiBpc19GTE9XX0lORElDQVRPUihmb2xsb3dpbmcpKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIHN0YXRlLmtpbmQgPSAic2NhbGFyIjsKICAgICAgc3RhdGUucmVzdWx0ID0gIiI7CiAgICAgIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjsKICAgICAgaGFzUGVuZGluZ0NvbnRlbnQgPSBmYWxzZTsKICAgICAgd2hpbGUgKGNoICE9PSAwKSB7CiAgICAgICAgaWYgKGNoID09PSA1OCkgewogICAgICAgICAgZm9sbG93aW5nID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbiArIDEpOwogICAgICAgICAgaWYgKGlzX1dTX09SX0VPTChmb2xsb3dpbmcpIHx8IHdpdGhpbkZsb3dDb2xsZWN0aW9uICYmIGlzX0ZMT1dfSU5ESUNBVE9SKGZvbGxvd2luZykpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMzUpIHsKICAgICAgICAgIHByZWNlZGluZyA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gLSAxKTsKICAgICAgICAgIGlmIChpc19XU19PUl9FT0wocHJlY2VkaW5nKSkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLnBvc2l0aW9uID09PSBzdGF0ZS5saW5lU3RhcnQgJiYgdGVzdERvY3VtZW50U2VwYXJhdG9yKHN0YXRlKSB8fCB3aXRoaW5GbG93Q29sbGVjdGlvbiAmJiBpc19GTE9XX0lORElDQVRPUihjaCkpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0gZWxzZSBpZiAoaXNfRU9MKGNoKSkgewogICAgICAgICAgX2xpbmUgPSBzdGF0ZS5saW5lOwogICAgICAgICAgX2xpbmVTdGFydCA9IHN0YXRlLmxpbmVTdGFydDsKICAgICAgICAgIF9saW5lSW5kZW50ID0gc3RhdGUubGluZUluZGVudDsKICAgICAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIGZhbHNlLCAtMSk7CiAgICAgICAgICBpZiAoc3RhdGUubGluZUluZGVudCA+PSBub2RlSW5kZW50KSB7CiAgICAgICAgICAgIGhhc1BlbmRpbmdDb250ZW50ID0gdHJ1ZTsKICAgICAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdGF0ZS5wb3NpdGlvbiA9IGNhcHR1cmVFbmQ7CiAgICAgICAgICAgIHN0YXRlLmxpbmUgPSBfbGluZTsKICAgICAgICAgICAgc3RhdGUubGluZVN0YXJ0ID0gX2xpbmVTdGFydDsKICAgICAgICAgICAgc3RhdGUubGluZUluZGVudCA9IF9saW5lSW5kZW50OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGhhc1BlbmRpbmdDb250ZW50KSB7CiAgICAgICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBjYXB0dXJlRW5kLCBmYWxzZSk7CiAgICAgICAgICB3cml0ZUZvbGRlZExpbmVzKHN0YXRlLCBzdGF0ZS5saW5lIC0gX2xpbmUpOwogICAgICAgICAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uOwogICAgICAgICAgaGFzUGVuZGluZ0NvbnRlbnQgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKCFpc19XSElURV9TUEFDRShjaCkpIHsKICAgICAgICAgIGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbiArIDE7CiAgICAgICAgfQogICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTsKICAgICAgfQogICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBjYXB0dXJlRW5kLCBmYWxzZSk7CiAgICAgIGlmIChzdGF0ZS5yZXN1bHQpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBzdGF0ZS5raW5kID0gX2tpbmQ7CiAgICAgIHN0YXRlLnJlc3VsdCA9IF9yZXN1bHQ7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIF9fbmFtZShyZWFkUGxhaW5TY2FsYXIsICJyZWFkUGxhaW5TY2FsYXIiKTsKICAgIGZ1bmN0aW9uIHJlYWRTaW5nbGVRdW90ZWRTY2FsYXIoc3RhdGUsIG5vZGVJbmRlbnQpIHsKICAgICAgdmFyIGNoLCBjYXB0dXJlU3RhcnQsIGNhcHR1cmVFbmQ7CiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7CiAgICAgIGlmIChjaCAhPT0gMzkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgc3RhdGUua2luZCA9ICJzY2FsYXIiOwogICAgICBzdGF0ZS5yZXN1bHQgPSAiIjsKICAgICAgc3RhdGUucG9zaXRpb24rKzsKICAgICAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uOwogICAgICB3aGlsZSAoKGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbikpICE9PSAwKSB7CiAgICAgICAgaWYgKGNoID09PSAzOSkgewogICAgICAgICAgY2FwdHVyZVNlZ21lbnQoc3RhdGUsIGNhcHR1cmVTdGFydCwgc3RhdGUucG9zaXRpb24sIHRydWUpOwogICAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOwogICAgICAgICAgaWYgKGNoID09PSAzOSkgewogICAgICAgICAgICBjYXB0dXJlU3RhcnQgPSBzdGF0ZS5wb3NpdGlvbjsKICAgICAgICAgICAgc3RhdGUucG9zaXRpb24rKzsKICAgICAgICAgICAgY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChpc19FT0woY2gpKSB7CiAgICAgICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBjYXB0dXJlRW5kLCB0cnVlKTsKICAgICAgICAgIHdyaXRlRm9sZGVkTGluZXMoc3RhdGUsIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIGZhbHNlLCBub2RlSW5kZW50KSk7CiAgICAgICAgICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247CiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5wb3NpdGlvbiA9PT0gc3RhdGUubGluZVN0YXJ0ICYmIHRlc3REb2N1bWVudFNlcGFyYXRvcihzdGF0ZSkpIHsKICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlLCAidW5leHBlY3RlZCBlbmQgb2YgdGhlIGRvY3VtZW50IHdpdGhpbiBhIHNpbmdsZSBxdW90ZWQgc2NhbGFyIik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN0YXRlLnBvc2l0aW9uKys7CiAgICAgICAgICBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247CiAgICAgICAgfQogICAgICB9CiAgICAgIHRocm93RXJyb3IyKHN0YXRlLCAidW5leHBlY3RlZCBlbmQgb2YgdGhlIHN0cmVhbSB3aXRoaW4gYSBzaW5nbGUgcXVvdGVkIHNjYWxhciIpOwogICAgfQogICAgX19uYW1lKHJlYWRTaW5nbGVRdW90ZWRTY2FsYXIsICJyZWFkU2luZ2xlUXVvdGVkU2NhbGFyIik7CiAgICBmdW5jdGlvbiByZWFkRG91YmxlUXVvdGVkU2NhbGFyKHN0YXRlLCBub2RlSW5kZW50KSB7CiAgICAgIHZhciBjYXB0dXJlU3RhcnQsIGNhcHR1cmVFbmQsIGhleExlbmd0aCwgaGV4UmVzdWx0LCB0bXAsIGNoOwogICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pOwogICAgICBpZiAoY2ggIT09IDM0KSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHN0YXRlLmtpbmQgPSAic2NhbGFyIjsKICAgICAgc3RhdGUucmVzdWx0ID0gIiI7CiAgICAgIHN0YXRlLnBvc2l0aW9uKys7CiAgICAgIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjsKICAgICAgd2hpbGUgKChjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pKSAhPT0gMCkgewogICAgICAgIGlmIChjaCA9PT0gMzQpIHsKICAgICAgICAgIGNhcHR1cmVTZWdtZW50KHN0YXRlLCBjYXB0dXJlU3RhcnQsIHN0YXRlLnBvc2l0aW9uLCB0cnVlKTsKICAgICAgICAgIHN0YXRlLnBvc2l0aW9uKys7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGVsc2UgaWYgKGNoID09PSA5MikgewogICAgICAgICAgY2FwdHVyZVNlZ21lbnQoc3RhdGUsIGNhcHR1cmVTdGFydCwgc3RhdGUucG9zaXRpb24sIHRydWUpOwogICAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOwogICAgICAgICAgaWYgKGlzX0VPTChjaCkpIHsKICAgICAgICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgZmFsc2UsIG5vZGVJbmRlbnQpOwogICAgICAgICAgfSBlbHNlIGlmIChjaCA8IDI1NiAmJiBzaW1wbGVFc2NhcGVDaGVja1tjaF0pIHsKICAgICAgICAgICAgc3RhdGUucmVzdWx0ICs9IHNpbXBsZUVzY2FwZU1hcFtjaF07CiAgICAgICAgICAgIHN0YXRlLnBvc2l0aW9uKys7CiAgICAgICAgICB9IGVsc2UgaWYgKCh0bXAgPSBlc2NhcGVkSGV4TGVuKGNoKSkgPiAwKSB7CiAgICAgICAgICAgIGhleExlbmd0aCA9IHRtcDsKICAgICAgICAgICAgaGV4UmVzdWx0ID0gMDsKICAgICAgICAgICAgZm9yICg7IGhleExlbmd0aCA+IDA7IGhleExlbmd0aC0tKSB7CiAgICAgICAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOwogICAgICAgICAgICAgIGlmICgodG1wID0gZnJvbUhleENvZGUoY2gpKSA+PSAwKSB7CiAgICAgICAgICAgICAgICBoZXhSZXN1bHQgPSAoaGV4UmVzdWx0IDw8IDQpICsgdG1wOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZSwgImV4cGVjdGVkIGhleGFkZWNpbWFsIGNoYXJhY3RlciIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gY2hhckZyb21Db2RlcG9pbnQoaGV4UmVzdWx0KTsKICAgICAgICAgICAgc3RhdGUucG9zaXRpb24rKzsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlLCAidW5rbm93biBlc2NhcGUgc2VxdWVuY2UiKTsKICAgICAgICAgIH0KICAgICAgICAgIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjsKICAgICAgICB9IGVsc2UgaWYgKGlzX0VPTChjaCkpIHsKICAgICAgICAgIGNhcHR1cmVTZWdtZW50KHN0YXRlLCBjYXB0dXJlU3RhcnQsIGNhcHR1cmVFbmQsIHRydWUpOwogICAgICAgICAgd3JpdGVGb2xkZWRMaW5lcyhzdGF0ZSwgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgZmFsc2UsIG5vZGVJbmRlbnQpKTsKICAgICAgICAgIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjsKICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLnBvc2l0aW9uID09PSBzdGF0ZS5saW5lU3RhcnQgJiYgdGVzdERvY3VtZW50U2VwYXJhdG9yKHN0YXRlKSkgewogICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJ1bmV4cGVjdGVkIGVuZCBvZiB0aGUgZG9jdW1lbnQgd2l0aGluIGEgZG91YmxlIHF1b3RlZCBzY2FsYXIiKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RhdGUucG9zaXRpb24rKzsKICAgICAgICAgIGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJ1bmV4cGVjdGVkIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGhpbiBhIGRvdWJsZSBxdW90ZWQgc2NhbGFyIik7CiAgICB9CiAgICBfX25hbWUocmVhZERvdWJsZVF1b3RlZFNjYWxhciwgInJlYWREb3VibGVRdW90ZWRTY2FsYXIiKTsKICAgIGZ1bmN0aW9uIHJlYWRGbG93Q29sbGVjdGlvbihzdGF0ZSwgbm9kZUluZGVudCkgewogICAgICB2YXIgcmVhZE5leHQgPSB0cnVlLCBfbGluZSwgX3RhZyA9IHN0YXRlLnRhZywgX3Jlc3VsdCwgX2FuY2hvciA9IHN0YXRlLmFuY2hvciwgZm9sbG93aW5nLCB0ZXJtaW5hdG9yLCBpc1BhaXIsIGlzRXhwbGljaXRQYWlyLCBpc01hcHBpbmcsIG92ZXJyaWRhYmxlS2V5cyA9IHt9LCBrZXlOb2RlLCBrZXlUYWcsIHZhbHVlTm9kZSwgY2g7CiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7CiAgICAgIGlmIChjaCA9PT0gOTEpIHsKICAgICAgICB0ZXJtaW5hdG9yID0gOTM7CiAgICAgICAgaXNNYXBwaW5nID0gZmFsc2U7CiAgICAgICAgX3Jlc3VsdCA9IFtdOwogICAgICB9IGVsc2UgaWYgKGNoID09PSAxMjMpIHsKICAgICAgICB0ZXJtaW5hdG9yID0gMTI1OwogICAgICAgIGlzTWFwcGluZyA9IHRydWU7CiAgICAgICAgX3Jlc3VsdCA9IHt9OwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBpZiAoc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7CiAgICAgICAgc3RhdGUuYW5jaG9yTWFwW3N0YXRlLmFuY2hvcl0gPSBfcmVzdWx0OwogICAgICB9CiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTsKICAgICAgd2hpbGUgKGNoICE9PSAwKSB7CiAgICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgbm9kZUluZGVudCk7CiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTsKICAgICAgICBpZiAoY2ggPT09IHRlcm1pbmF0b3IpIHsKICAgICAgICAgIHN0YXRlLnBvc2l0aW9uKys7CiAgICAgICAgICBzdGF0ZS50YWcgPSBfdGFnOwogICAgICAgICAgc3RhdGUuYW5jaG9yID0gX2FuY2hvcjsKICAgICAgICAgIHN0YXRlLmtpbmQgPSBpc01hcHBpbmcgPyAibWFwcGluZyIgOiAic2VxdWVuY2UiOwogICAgICAgICAgc3RhdGUucmVzdWx0ID0gX3Jlc3VsdDsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAoIXJlYWROZXh0KSB7CiAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZSwgIm1pc3NlZCBjb21tYSBiZXR3ZWVuIGZsb3cgY29sbGVjdGlvbiBlbnRyaWVzIik7CiAgICAgICAgfQogICAgICAgIGtleVRhZyA9IGtleU5vZGUgPSB2YWx1ZU5vZGUgPSBudWxsOwogICAgICAgIGlzUGFpciA9IGlzRXhwbGljaXRQYWlyID0gZmFsc2U7CiAgICAgICAgaWYgKGNoID09PSA2MykgewogICAgICAgICAgZm9sbG93aW5nID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbiArIDEpOwogICAgICAgICAgaWYgKGlzX1dTX09SX0VPTChmb2xsb3dpbmcpKSB7CiAgICAgICAgICAgIGlzUGFpciA9IGlzRXhwbGljaXRQYWlyID0gdHJ1ZTsKICAgICAgICAgICAgc3RhdGUucG9zaXRpb24rKzsKICAgICAgICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgbm9kZUluZGVudCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIF9saW5lID0gc3RhdGUubGluZTsKICAgICAgICBjb21wb3NlTm9kZShzdGF0ZSwgbm9kZUluZGVudCwgQ09OVEVYVF9GTE9XX0lOLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAga2V5VGFnID0gc3RhdGUudGFnOwogICAgICAgIGtleU5vZGUgPSBzdGF0ZS5yZXN1bHQ7CiAgICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgbm9kZUluZGVudCk7CiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTsKICAgICAgICBpZiAoKGlzRXhwbGljaXRQYWlyIHx8IHN0YXRlLmxpbmUgPT09IF9saW5lKSAmJiBjaCA9PT0gNTgpIHsKICAgICAgICAgIGlzUGFpciA9IHRydWU7CiAgICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7CiAgICAgICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCBub2RlSW5kZW50KTsKICAgICAgICAgIGNvbXBvc2VOb2RlKHN0YXRlLCBub2RlSW5kZW50LCBDT05URVhUX0ZMT1dfSU4sIGZhbHNlLCB0cnVlKTsKICAgICAgICAgIHZhbHVlTm9kZSA9IHN0YXRlLnJlc3VsdDsKICAgICAgICB9CiAgICAgICAgaWYgKGlzTWFwcGluZykgewogICAgICAgICAgc3RvcmVNYXBwaW5nUGFpcihzdGF0ZSwgX3Jlc3VsdCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIHZhbHVlTm9kZSk7CiAgICAgICAgfSBlbHNlIGlmIChpc1BhaXIpIHsKICAgICAgICAgIF9yZXN1bHQucHVzaChzdG9yZU1hcHBpbmdQYWlyKHN0YXRlLCBudWxsLCBvdmVycmlkYWJsZUtleXMsIGtleVRhZywga2V5Tm9kZSwgdmFsdWVOb2RlKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIF9yZXN1bHQucHVzaChrZXlOb2RlKTsKICAgICAgICB9CiAgICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgbm9kZUluZGVudCk7CiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTsKICAgICAgICBpZiAoY2ggPT09IDQ0KSB7CiAgICAgICAgICByZWFkTmV4dCA9IHRydWU7CiAgICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlYWROZXh0ID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRocm93RXJyb3IyKHN0YXRlLCAidW5leHBlY3RlZCBlbmQgb2YgdGhlIHN0cmVhbSB3aXRoaW4gYSBmbG93IGNvbGxlY3Rpb24iKTsKICAgIH0KICAgIF9fbmFtZShyZWFkRmxvd0NvbGxlY3Rpb24sICJyZWFkRmxvd0NvbGxlY3Rpb24iKTsKICAgIGZ1bmN0aW9uIHJlYWRCbG9ja1NjYWxhcihzdGF0ZSwgbm9kZUluZGVudCkgewogICAgICB2YXIgY2FwdHVyZVN0YXJ0LCBmb2xkaW5nLCBjaG9tcGluZyA9IENIT01QSU5HX0NMSVAsIGRpZFJlYWRDb250ZW50ID0gZmFsc2UsIGRldGVjdGVkSW5kZW50ID0gZmFsc2UsIHRleHRJbmRlbnQgPSBub2RlSW5kZW50LCBlbXB0eUxpbmVzID0gMCwgYXRNb3JlSW5kZW50ZWQgPSBmYWxzZSwgdG1wLCBjaDsKICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTsKICAgICAgaWYgKGNoID09PSAxMjQpIHsKICAgICAgICBmb2xkaW5nID0gZmFsc2U7CiAgICAgIH0gZWxzZSBpZiAoY2ggPT09IDYyKSB7CiAgICAgICAgZm9sZGluZyA9IHRydWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHN0YXRlLmtpbmQgPSAic2NhbGFyIjsKICAgICAgc3RhdGUucmVzdWx0ID0gIiI7CiAgICAgIHdoaWxlIChjaCAhPT0gMCkgewogICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTsKICAgICAgICBpZiAoY2ggPT09IDQzIHx8IGNoID09PSA0NSkgewogICAgICAgICAgaWYgKENIT01QSU5HX0NMSVAgPT09IGNob21waW5nKSB7CiAgICAgICAgICAgIGNob21waW5nID0gY2ggPT09IDQzID8gQ0hPTVBJTkdfS0VFUCA6IENIT01QSU5HX1NUUklQOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJyZXBlYXQgb2YgYSBjaG9tcGluZyBtb2RlIGlkZW50aWZpZXIiKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKCh0bXAgPSBmcm9tRGVjaW1hbENvZGUoY2gpKSA+PSAwKSB7CiAgICAgICAgICBpZiAodG1wID09PSAwKSB7CiAgICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlLCAiYmFkIGV4cGxpY2l0IGluZGVudGF0aW9uIHdpZHRoIG9mIGEgYmxvY2sgc2NhbGFyOyBpdCBjYW5ub3QgYmUgbGVzcyB0aGFuIG9uZSIpOwogICAgICAgICAgfSBlbHNlIGlmICghZGV0ZWN0ZWRJbmRlbnQpIHsKICAgICAgICAgICAgdGV4dEluZGVudCA9IG5vZGVJbmRlbnQgKyB0bXAgLSAxOwogICAgICAgICAgICBkZXRlY3RlZEluZGVudCA9IHRydWU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZSwgInJlcGVhdCBvZiBhbiBpbmRlbnRhdGlvbiB3aWR0aCBpZGVudGlmaWVyIik7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoaXNfV0hJVEVfU1BBQ0UoY2gpKSB7CiAgICAgICAgZG8gewogICAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOwogICAgICAgIH0gd2hpbGUgKGlzX1dISVRFX1NQQUNFKGNoKSk7CiAgICAgICAgaWYgKGNoID09PSAzNSkgewogICAgICAgICAgZG8gewogICAgICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7CiAgICAgICAgICB9IHdoaWxlICghaXNfRU9MKGNoKSAmJiBjaCAhPT0gMCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHdoaWxlIChjaCAhPT0gMCkgewogICAgICAgIHJlYWRMaW5lQnJlYWsoc3RhdGUpOwogICAgICAgIHN0YXRlLmxpbmVJbmRlbnQgPSAwOwogICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7CiAgICAgICAgd2hpbGUgKCghZGV0ZWN0ZWRJbmRlbnQgfHwgc3RhdGUubGluZUluZGVudCA8IHRleHRJbmRlbnQpICYmIGNoID09PSAzMikgewogICAgICAgICAgc3RhdGUubGluZUluZGVudCsrOwogICAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOwogICAgICAgIH0KICAgICAgICBpZiAoIWRldGVjdGVkSW5kZW50ICYmIHN0YXRlLmxpbmVJbmRlbnQgPiB0ZXh0SW5kZW50KSB7CiAgICAgICAgICB0ZXh0SW5kZW50ID0gc3RhdGUubGluZUluZGVudDsKICAgICAgICB9CiAgICAgICAgaWYgKGlzX0VPTChjaCkpIHsKICAgICAgICAgIGVtcHR5TGluZXMrKzsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAoc3RhdGUubGluZUluZGVudCA8IHRleHRJbmRlbnQpIHsKICAgICAgICAgIGlmIChjaG9tcGluZyA9PT0gQ0hPTVBJTkdfS0VFUCkgewogICAgICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gY29tbW9uLnJlcGVhdCgiXG4iLCBkaWRSZWFkQ29udGVudCA/IDEgKyBlbXB0eUxpbmVzIDogZW1wdHlMaW5lcyk7CiAgICAgICAgICB9IGVsc2UgaWYgKGNob21waW5nID09PSBDSE9NUElOR19DTElQKSB7CiAgICAgICAgICAgIGlmIChkaWRSZWFkQ29udGVudCkgewogICAgICAgICAgICAgIHN0YXRlLnJlc3VsdCArPSAiXG4iOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKGZvbGRpbmcpIHsKICAgICAgICAgIGlmIChpc19XSElURV9TUEFDRShjaCkpIHsKICAgICAgICAgICAgYXRNb3JlSW5kZW50ZWQgPSB0cnVlOwogICAgICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gY29tbW9uLnJlcGVhdCgiXG4iLCBkaWRSZWFkQ29udGVudCA/IDEgKyBlbXB0eUxpbmVzIDogZW1wdHlMaW5lcyk7CiAgICAgICAgICB9IGVsc2UgaWYgKGF0TW9yZUluZGVudGVkKSB7CiAgICAgICAgICAgIGF0TW9yZUluZGVudGVkID0gZmFsc2U7CiAgICAgICAgICAgIHN0YXRlLnJlc3VsdCArPSBjb21tb24ucmVwZWF0KCJcbiIsIGVtcHR5TGluZXMgKyAxKTsKICAgICAgICAgIH0gZWxzZSBpZiAoZW1wdHlMaW5lcyA9PT0gMCkgewogICAgICAgICAgICBpZiAoZGlkUmVhZENvbnRlbnQpIHsKICAgICAgICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gIiAiOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gY29tbW9uLnJlcGVhdCgiXG4iLCBlbXB0eUxpbmVzKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RhdGUucmVzdWx0ICs9IGNvbW1vbi5yZXBlYXQoIlxuIiwgZGlkUmVhZENvbnRlbnQgPyAxICsgZW1wdHlMaW5lcyA6IGVtcHR5TGluZXMpOwogICAgICAgIH0KICAgICAgICBkaWRSZWFkQ29udGVudCA9IHRydWU7CiAgICAgICAgZGV0ZWN0ZWRJbmRlbnQgPSB0cnVlOwogICAgICAgIGVtcHR5TGluZXMgPSAwOwogICAgICAgIGNhcHR1cmVTdGFydCA9IHN0YXRlLnBvc2l0aW9uOwogICAgICAgIHdoaWxlICghaXNfRU9MKGNoKSAmJiBjaCAhPT0gMCkgewogICAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOwogICAgICAgIH0KICAgICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBzdGF0ZS5wb3NpdGlvbiwgZmFsc2UpOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgX19uYW1lKHJlYWRCbG9ja1NjYWxhciwgInJlYWRCbG9ja1NjYWxhciIpOwogICAgZnVuY3Rpb24gcmVhZEJsb2NrU2VxdWVuY2Uoc3RhdGUsIG5vZGVJbmRlbnQpIHsKICAgICAgdmFyIF9saW5lLCBfdGFnID0gc3RhdGUudGFnLCBfYW5jaG9yID0gc3RhdGUuYW5jaG9yLCBfcmVzdWx0ID0gW10sIGZvbGxvd2luZywgZGV0ZWN0ZWQgPSBmYWxzZSwgY2g7CiAgICAgIGlmIChzdGF0ZS5hbmNob3IgIT09IG51bGwpIHsKICAgICAgICBzdGF0ZS5hbmNob3JNYXBbc3RhdGUuYW5jaG9yXSA9IF9yZXN1bHQ7CiAgICAgIH0KICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTsKICAgICAgd2hpbGUgKGNoICE9PSAwKSB7CiAgICAgICAgaWYgKGNoICE9PSA0NSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGZvbGxvd2luZyA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gKyAxKTsKICAgICAgICBpZiAoIWlzX1dTX09SX0VPTChmb2xsb3dpbmcpKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgZGV0ZWN0ZWQgPSB0cnVlOwogICAgICAgIHN0YXRlLnBvc2l0aW9uKys7CiAgICAgICAgaWYgKHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKSkgewogICAgICAgICAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPD0gbm9kZUluZGVudCkgewogICAgICAgICAgICBfcmVzdWx0LnB1c2gobnVsbCk7CiAgICAgICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBfbGluZSA9IHN0YXRlLmxpbmU7CiAgICAgICAgY29tcG9zZU5vZGUoc3RhdGUsIG5vZGVJbmRlbnQsIENPTlRFWFRfQkxPQ0tfSU4sIGZhbHNlLCB0cnVlKTsKICAgICAgICBfcmVzdWx0LnB1c2goc3RhdGUucmVzdWx0KTsKICAgICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7CiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTsKICAgICAgICBpZiAoKHN0YXRlLmxpbmUgPT09IF9saW5lIHx8IHN0YXRlLmxpbmVJbmRlbnQgPiBub2RlSW5kZW50KSAmJiBjaCAhPT0gMCkgewogICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJiYWQgaW5kZW50YXRpb24gb2YgYSBzZXF1ZW5jZSBlbnRyeSIpOwogICAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGluZUluZGVudCA8IG5vZGVJbmRlbnQpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZGV0ZWN0ZWQpIHsKICAgICAgICBzdGF0ZS50YWcgPSBfdGFnOwogICAgICAgIHN0YXRlLmFuY2hvciA9IF9hbmNob3I7CiAgICAgICAgc3RhdGUua2luZCA9ICJzZXF1ZW5jZSI7CiAgICAgICAgc3RhdGUucmVzdWx0ID0gX3Jlc3VsdDsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBfX25hbWUocmVhZEJsb2NrU2VxdWVuY2UsICJyZWFkQmxvY2tTZXF1ZW5jZSIpOwogICAgZnVuY3Rpb24gcmVhZEJsb2NrTWFwcGluZyhzdGF0ZSwgbm9kZUluZGVudCwgZmxvd0luZGVudCkgewogICAgICB2YXIgZm9sbG93aW5nLCBhbGxvd0NvbXBhY3QsIF9saW5lLCBfcG9zLCBfdGFnID0gc3RhdGUudGFnLCBfYW5jaG9yID0gc3RhdGUuYW5jaG9yLCBfcmVzdWx0ID0ge30sIG92ZXJyaWRhYmxlS2V5cyA9IHt9LCBrZXlUYWcgPSBudWxsLCBrZXlOb2RlID0gbnVsbCwgdmFsdWVOb2RlID0gbnVsbCwgYXRFeHBsaWNpdEtleSA9IGZhbHNlLCBkZXRlY3RlZCA9IGZhbHNlLCBjaDsKICAgICAgaWYgKHN0YXRlLmFuY2hvciAhPT0gbnVsbCkgewogICAgICAgIHN0YXRlLmFuY2hvck1hcFtzdGF0ZS5hbmNob3JdID0gX3Jlc3VsdDsKICAgICAgfQogICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pOwogICAgICB3aGlsZSAoY2ggIT09IDApIHsKICAgICAgICBmb2xsb3dpbmcgPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uICsgMSk7CiAgICAgICAgX2xpbmUgPSBzdGF0ZS5saW5lOwogICAgICAgIF9wb3MgPSBzdGF0ZS5wb3NpdGlvbjsKICAgICAgICBpZiAoKGNoID09PSA2MyB8fCBjaCA9PT0gNTgpICYmIGlzX1dTX09SX0VPTChmb2xsb3dpbmcpKSB7CiAgICAgICAgICBpZiAoY2ggPT09IDYzKSB7CiAgICAgICAgICAgIGlmIChhdEV4cGxpY2l0S2V5KSB7CiAgICAgICAgICAgICAgc3RvcmVNYXBwaW5nUGFpcihzdGF0ZSwgX3Jlc3VsdCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIG51bGwpOwogICAgICAgICAgICAgIGtleVRhZyA9IGtleU5vZGUgPSB2YWx1ZU5vZGUgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRldGVjdGVkID0gdHJ1ZTsKICAgICAgICAgICAgYXRFeHBsaWNpdEtleSA9IHRydWU7CiAgICAgICAgICAgIGFsbG93Q29tcGFjdCA9IHRydWU7CiAgICAgICAgICB9IGVsc2UgaWYgKGF0RXhwbGljaXRLZXkpIHsKICAgICAgICAgICAgYXRFeHBsaWNpdEtleSA9IGZhbHNlOwogICAgICAgICAgICBhbGxvd0NvbXBhY3QgPSB0cnVlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJpbmNvbXBsZXRlIGV4cGxpY2l0IG1hcHBpbmcgcGFpcjsgYSBrZXkgbm9kZSBpcyBtaXNzZWQ7IG9yIGZvbGxvd2VkIGJ5IGEgbm9uLXRhYnVsYXRlZCBlbXB0eSBsaW5lIik7CiAgICAgICAgICB9CiAgICAgICAgICBzdGF0ZS5wb3NpdGlvbiArPSAxOwogICAgICAgICAgY2ggPSBmb2xsb3dpbmc7CiAgICAgICAgfSBlbHNlIGlmIChjb21wb3NlTm9kZShzdGF0ZSwgZmxvd0luZGVudCwgQ09OVEVYVF9GTE9XX09VVCwgZmFsc2UsIHRydWUpKSB7CiAgICAgICAgICBpZiAoc3RhdGUubGluZSA9PT0gX2xpbmUpIHsKICAgICAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTsKICAgICAgICAgICAgd2hpbGUgKGlzX1dISVRFX1NQQUNFKGNoKSkgewogICAgICAgICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2ggPT09IDU4KSB7CiAgICAgICAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOwogICAgICAgICAgICAgIGlmICghaXNfV1NfT1JfRU9MKGNoKSkgewogICAgICAgICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJhIHdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIGV4cGVjdGVkIGFmdGVyIHRoZSBrZXktdmFsdWUgc2VwYXJhdG9yIHdpdGhpbiBhIGJsb2NrIG1hcHBpbmciKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGF0RXhwbGljaXRLZXkpIHsKICAgICAgICAgICAgICAgIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCBudWxsKTsKICAgICAgICAgICAgICAgIGtleVRhZyA9IGtleU5vZGUgPSB2YWx1ZU5vZGUgPSBudWxsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBkZXRlY3RlZCA9IHRydWU7CiAgICAgICAgICAgICAgYXRFeHBsaWNpdEtleSA9IGZhbHNlOwogICAgICAgICAgICAgIGFsbG93Q29tcGFjdCA9IGZhbHNlOwogICAgICAgICAgICAgIGtleVRhZyA9IHN0YXRlLnRhZzsKICAgICAgICAgICAgICBrZXlOb2RlID0gc3RhdGUucmVzdWx0OwogICAgICAgICAgICB9IGVsc2UgaWYgKGRldGVjdGVkKSB7CiAgICAgICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJjYW4gbm90IHJlYWQgYW4gaW1wbGljaXQgbWFwcGluZyBwYWlyOyBhIGNvbG9uIGlzIG1pc3NlZCIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHN0YXRlLnRhZyA9IF90YWc7CiAgICAgICAgICAgICAgc3RhdGUuYW5jaG9yID0gX2FuY2hvcjsKICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIGlmIChkZXRlY3RlZCkgewogICAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZSwgImNhbiBub3QgcmVhZCBhIGJsb2NrIG1hcHBpbmcgZW50cnk7IGEgbXVsdGlsaW5lIGtleSBtYXkgbm90IGJlIGFuIGltcGxpY2l0IGtleSIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RhdGUudGFnID0gX3RhZzsKICAgICAgICAgICAgc3RhdGUuYW5jaG9yID0gX2FuY2hvcjsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoc3RhdGUubGluZSA9PT0gX2xpbmUgfHwgc3RhdGUubGluZUluZGVudCA+IG5vZGVJbmRlbnQpIHsKICAgICAgICAgIGlmIChjb21wb3NlTm9kZShzdGF0ZSwgbm9kZUluZGVudCwgQ09OVEVYVF9CTE9DS19PVVQsIHRydWUsIGFsbG93Q29tcGFjdCkpIHsKICAgICAgICAgICAgaWYgKGF0RXhwbGljaXRLZXkpIHsKICAgICAgICAgICAgICBrZXlOb2RlID0gc3RhdGUucmVzdWx0OwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHZhbHVlTm9kZSA9IHN0YXRlLnJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKCFhdEV4cGxpY2l0S2V5KSB7CiAgICAgICAgICAgIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCB2YWx1ZU5vZGUsIF9saW5lLCBfcG9zKTsKICAgICAgICAgICAga2V5VGFnID0ga2V5Tm9kZSA9IHZhbHVlTm9kZSA9IG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7CiAgICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pOwogICAgICAgIH0KICAgICAgICBpZiAoc3RhdGUubGluZUluZGVudCA+IG5vZGVJbmRlbnQgJiYgY2ggIT09IDApIHsKICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlLCAiYmFkIGluZGVudGF0aW9uIG9mIGEgbWFwcGluZyBlbnRyeSIpOwogICAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGluZUluZGVudCA8IG5vZGVJbmRlbnQpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoYXRFeHBsaWNpdEtleSkgewogICAgICAgIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCBudWxsKTsKICAgICAgfQogICAgICBpZiAoZGV0ZWN0ZWQpIHsKICAgICAgICBzdGF0ZS50YWcgPSBfdGFnOwogICAgICAgIHN0YXRlLmFuY2hvciA9IF9hbmNob3I7CiAgICAgICAgc3RhdGUua2luZCA9ICJtYXBwaW5nIjsKICAgICAgICBzdGF0ZS5yZXN1bHQgPSBfcmVzdWx0OwogICAgICB9CiAgICAgIHJldHVybiBkZXRlY3RlZDsKICAgIH0KICAgIF9fbmFtZShyZWFkQmxvY2tNYXBwaW5nLCAicmVhZEJsb2NrTWFwcGluZyIpOwogICAgZnVuY3Rpb24gcmVhZFRhZ1Byb3BlcnR5KHN0YXRlKSB7CiAgICAgIHZhciBfcG9zaXRpb24sIGlzVmVyYmF0aW0gPSBmYWxzZSwgaXNOYW1lZCA9IGZhbHNlLCB0YWdIYW5kbGUsIHRhZ05hbWUsIGNoOwogICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pOwogICAgICBpZiAoY2ggIT09IDMzKSByZXR1cm4gZmFsc2U7CiAgICAgIGlmIChzdGF0ZS50YWcgIT09IG51bGwpIHsKICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZSwgImR1cGxpY2F0aW9uIG9mIGEgdGFnIHByb3BlcnR5Iik7CiAgICAgIH0KICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOwogICAgICBpZiAoY2ggPT09IDYwKSB7CiAgICAgICAgaXNWZXJiYXRpbSA9IHRydWU7CiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOwogICAgICB9IGVsc2UgaWYgKGNoID09PSAzMykgewogICAgICAgIGlzTmFtZWQgPSB0cnVlOwogICAgICAgIHRhZ0hhbmRsZSA9ICIhISI7CiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOwogICAgICB9IGVsc2UgewogICAgICAgIHRhZ0hhbmRsZSA9ICIhIjsKICAgICAgfQogICAgICBfcG9zaXRpb24gPSBzdGF0ZS5wb3NpdGlvbjsKICAgICAgaWYgKGlzVmVyYmF0aW0pIHsKICAgICAgICBkbyB7CiAgICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7CiAgICAgICAgfSB3aGlsZSAoY2ggIT09IDAgJiYgY2ggIT09IDYyKTsKICAgICAgICBpZiAoc3RhdGUucG9zaXRpb24gPCBzdGF0ZS5sZW5ndGgpIHsKICAgICAgICAgIHRhZ05hbWUgPSBzdGF0ZS5pbnB1dC5zbGljZShfcG9zaXRpb24sIHN0YXRlLnBvc2l0aW9uKTsKICAgICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJ1bmV4cGVjdGVkIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGhpbiBhIHZlcmJhdGltIHRhZyIpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB3aGlsZSAoY2ggIT09IDAgJiYgIWlzX1dTX09SX0VPTChjaCkpIHsKICAgICAgICAgIGlmIChjaCA9PT0gMzMpIHsKICAgICAgICAgICAgaWYgKCFpc05hbWVkKSB7CiAgICAgICAgICAgICAgdGFnSGFuZGxlID0gc3RhdGUuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uIC0gMSwgc3RhdGUucG9zaXRpb24gKyAxKTsKICAgICAgICAgICAgICBpZiAoIVBBVFRFUk5fVEFHX0hBTkRMRS50ZXN0KHRhZ0hhbmRsZSkpIHsKICAgICAgICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlLCAibmFtZWQgdGFnIGhhbmRsZSBjYW5ub3QgY29udGFpbiBzdWNoIGNoYXJhY3RlcnMiKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaXNOYW1lZCA9IHRydWU7CiAgICAgICAgICAgICAgX3Bvc2l0aW9uID0gc3RhdGUucG9zaXRpb24gKyAxOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlLCAidGFnIHN1ZmZpeCBjYW5ub3QgY29udGFpbiBleGNsYW1hdGlvbiBtYXJrcyIpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7CiAgICAgICAgfQogICAgICAgIHRhZ05hbWUgPSBzdGF0ZS5pbnB1dC5zbGljZShfcG9zaXRpb24sIHN0YXRlLnBvc2l0aW9uKTsKICAgICAgICBpZiAoUEFUVEVSTl9GTE9XX0lORElDQVRPUlMudGVzdCh0YWdOYW1lKSkgewogICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJ0YWcgc3VmZml4IGNhbm5vdCBjb250YWluIGZsb3cgaW5kaWNhdG9yIGNoYXJhY3RlcnMiKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHRhZ05hbWUgJiYgIVBBVFRFUk5fVEFHX1VSSS50ZXN0KHRhZ05hbWUpKSB7CiAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJ0YWcgbmFtZSBjYW5ub3QgY29udGFpbiBzdWNoIGNoYXJhY3RlcnM6ICIgKyB0YWdOYW1lKTsKICAgICAgfQogICAgICBpZiAoaXNWZXJiYXRpbSkgewogICAgICAgIHN0YXRlLnRhZyA9IHRhZ05hbWU7CiAgICAgIH0gZWxzZSBpZiAoX2hhc093blByb3BlcnR5LmNhbGwoc3RhdGUudGFnTWFwLCB0YWdIYW5kbGUpKSB7CiAgICAgICAgc3RhdGUudGFnID0gc3RhdGUudGFnTWFwW3RhZ0hhbmRsZV0gKyB0YWdOYW1lOwogICAgICB9IGVsc2UgaWYgKHRhZ0hhbmRsZSA9PT0gIiEiKSB7CiAgICAgICAgc3RhdGUudGFnID0gIiEiICsgdGFnTmFtZTsKICAgICAgfSBlbHNlIGlmICh0YWdIYW5kbGUgPT09ICIhISIpIHsKICAgICAgICBzdGF0ZS50YWcgPSAidGFnOnlhbWwub3JnLDIwMDI6IiArIHRhZ05hbWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICd1bmRlY2xhcmVkIHRhZyBoYW5kbGUgIicgKyB0YWdIYW5kbGUgKyAnIicpOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgX19uYW1lKHJlYWRUYWdQcm9wZXJ0eSwgInJlYWRUYWdQcm9wZXJ0eSIpOwogICAgZnVuY3Rpb24gcmVhZEFuY2hvclByb3BlcnR5KHN0YXRlKSB7CiAgICAgIHZhciBfcG9zaXRpb24sIGNoOwogICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pOwogICAgICBpZiAoY2ggIT09IDM4KSByZXR1cm4gZmFsc2U7CiAgICAgIGlmIChzdGF0ZS5hbmNob3IgIT09IG51bGwpIHsKICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZSwgImR1cGxpY2F0aW9uIG9mIGFuIGFuY2hvciBwcm9wZXJ0eSIpOwogICAgICB9CiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTsKICAgICAgX3Bvc2l0aW9uID0gc3RhdGUucG9zaXRpb247CiAgICAgIHdoaWxlIChjaCAhPT0gMCAmJiAhaXNfV1NfT1JfRU9MKGNoKSAmJiAhaXNfRkxPV19JTkRJQ0FUT1IoY2gpKSB7CiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOwogICAgICB9CiAgICAgIGlmIChzdGF0ZS5wb3NpdGlvbiA9PT0gX3Bvc2l0aW9uKSB7CiAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJuYW1lIG9mIGFuIGFuY2hvciBub2RlIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIik7CiAgICAgIH0KICAgICAgc3RhdGUuYW5jaG9yID0gc3RhdGUuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uLCBzdGF0ZS5wb3NpdGlvbik7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgX19uYW1lKHJlYWRBbmNob3JQcm9wZXJ0eSwgInJlYWRBbmNob3JQcm9wZXJ0eSIpOwogICAgZnVuY3Rpb24gcmVhZEFsaWFzKHN0YXRlKSB7CiAgICAgIHZhciBfcG9zaXRpb24sIGFsaWFzLCBjaDsKICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTsKICAgICAgaWYgKGNoICE9PSA0MikgcmV0dXJuIGZhbHNlOwogICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7CiAgICAgIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uOwogICAgICB3aGlsZSAoY2ggIT09IDAgJiYgIWlzX1dTX09SX0VPTChjaCkgJiYgIWlzX0ZMT1dfSU5ESUNBVE9SKGNoKSkgewogICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTsKICAgICAgfQogICAgICBpZiAoc3RhdGUucG9zaXRpb24gPT09IF9wb3NpdGlvbikgewogICAgICAgIHRocm93RXJyb3IyKHN0YXRlLCAibmFtZSBvZiBhbiBhbGlhcyBub2RlIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIik7CiAgICAgIH0KICAgICAgYWxpYXMgPSBzdGF0ZS5pbnB1dC5zbGljZShfcG9zaXRpb24sIHN0YXRlLnBvc2l0aW9uKTsKICAgICAgaWYgKCFfaGFzT3duUHJvcGVydHkuY2FsbChzdGF0ZS5hbmNob3JNYXAsIGFsaWFzKSkgewogICAgICAgIHRocm93RXJyb3IyKHN0YXRlLCAndW5pZGVudGlmaWVkIGFsaWFzICInICsgYWxpYXMgKyAnIicpOwogICAgICB9CiAgICAgIHN0YXRlLnJlc3VsdCA9IHN0YXRlLmFuY2hvck1hcFthbGlhc107CiAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBfX25hbWUocmVhZEFsaWFzLCAicmVhZEFsaWFzIik7CiAgICBmdW5jdGlvbiBjb21wb3NlTm9kZShzdGF0ZSwgcGFyZW50SW5kZW50LCBub2RlQ29udGV4dCwgYWxsb3dUb1NlZWssIGFsbG93Q29tcGFjdCkgewogICAgICB2YXIgYWxsb3dCbG9ja1N0eWxlcywgYWxsb3dCbG9ja1NjYWxhcnMsIGFsbG93QmxvY2tDb2xsZWN0aW9ucywgaW5kZW50U3RhdHVzID0gMSwgYXROZXdMaW5lID0gZmFsc2UsIGhhc0NvbnRlbnQgPSBmYWxzZSwgdHlwZUluZGV4LCB0eXBlUXVhbnRpdHksIHR5cGU1LCBmbG93SW5kZW50LCBibG9ja0luZGVudDsKICAgICAgaWYgKHN0YXRlLmxpc3RlbmVyICE9PSBudWxsKSB7CiAgICAgICAgc3RhdGUubGlzdGVuZXIoIm9wZW4iLCBzdGF0ZSk7CiAgICAgIH0KICAgICAgc3RhdGUudGFnID0gbnVsbDsKICAgICAgc3RhdGUuYW5jaG9yID0gbnVsbDsKICAgICAgc3RhdGUua2luZCA9IG51bGw7CiAgICAgIHN0YXRlLnJlc3VsdCA9IG51bGw7CiAgICAgIGFsbG93QmxvY2tTdHlsZXMgPSBhbGxvd0Jsb2NrU2NhbGFycyA9IGFsbG93QmxvY2tDb2xsZWN0aW9ucyA9IENPTlRFWFRfQkxPQ0tfT1VUID09PSBub2RlQ29udGV4dCB8fCBDT05URVhUX0JMT0NLX0lOID09PSBub2RlQ29udGV4dDsKICAgICAgaWYgKGFsbG93VG9TZWVrKSB7CiAgICAgICAgaWYgKHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKSkgewogICAgICAgICAgYXROZXdMaW5lID0gdHJ1ZTsKICAgICAgICAgIGlmIChzdGF0ZS5saW5lSW5kZW50ID4gcGFyZW50SW5kZW50KSB7CiAgICAgICAgICAgIGluZGVudFN0YXR1cyA9IDE7CiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPT09IHBhcmVudEluZGVudCkgewogICAgICAgICAgICBpbmRlbnRTdGF0dXMgPSAwOwogICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5saW5lSW5kZW50IDwgcGFyZW50SW5kZW50KSB7CiAgICAgICAgICAgIGluZGVudFN0YXR1cyA9IC0xOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoaW5kZW50U3RhdHVzID09PSAxKSB7CiAgICAgICAgd2hpbGUgKHJlYWRUYWdQcm9wZXJ0eShzdGF0ZSkgfHwgcmVhZEFuY2hvclByb3BlcnR5KHN0YXRlKSkgewogICAgICAgICAgaWYgKHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKSkgewogICAgICAgICAgICBhdE5ld0xpbmUgPSB0cnVlOwogICAgICAgICAgICBhbGxvd0Jsb2NrQ29sbGVjdGlvbnMgPSBhbGxvd0Jsb2NrU3R5bGVzOwogICAgICAgICAgICBpZiAoc3RhdGUubGluZUluZGVudCA+IHBhcmVudEluZGVudCkgewogICAgICAgICAgICAgIGluZGVudFN0YXR1cyA9IDE7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGluZUluZGVudCA9PT0gcGFyZW50SW5kZW50KSB7CiAgICAgICAgICAgICAgaW5kZW50U3RhdHVzID0gMDsKICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5saW5lSW5kZW50IDwgcGFyZW50SW5kZW50KSB7CiAgICAgICAgICAgICAgaW5kZW50U3RhdHVzID0gLTE7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGFsbG93QmxvY2tDb2xsZWN0aW9ucyA9IGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoYWxsb3dCbG9ja0NvbGxlY3Rpb25zKSB7CiAgICAgICAgYWxsb3dCbG9ja0NvbGxlY3Rpb25zID0gYXROZXdMaW5lIHx8IGFsbG93Q29tcGFjdDsKICAgICAgfQogICAgICBpZiAoaW5kZW50U3RhdHVzID09PSAxIHx8IENPTlRFWFRfQkxPQ0tfT1VUID09PSBub2RlQ29udGV4dCkgewogICAgICAgIGlmIChDT05URVhUX0ZMT1dfSU4gPT09IG5vZGVDb250ZXh0IHx8IENPTlRFWFRfRkxPV19PVVQgPT09IG5vZGVDb250ZXh0KSB7CiAgICAgICAgICBmbG93SW5kZW50ID0gcGFyZW50SW5kZW50OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBmbG93SW5kZW50ID0gcGFyZW50SW5kZW50ICsgMTsKICAgICAgICB9CiAgICAgICAgYmxvY2tJbmRlbnQgPSBzdGF0ZS5wb3NpdGlvbiAtIHN0YXRlLmxpbmVTdGFydDsKICAgICAgICBpZiAoaW5kZW50U3RhdHVzID09PSAxKSB7CiAgICAgICAgICBpZiAoYWxsb3dCbG9ja0NvbGxlY3Rpb25zICYmIChyZWFkQmxvY2tTZXF1ZW5jZShzdGF0ZSwgYmxvY2tJbmRlbnQpIHx8IHJlYWRCbG9ja01hcHBpbmcoc3RhdGUsIGJsb2NrSW5kZW50LCBmbG93SW5kZW50KSkgfHwgcmVhZEZsb3dDb2xsZWN0aW9uKHN0YXRlLCBmbG93SW5kZW50KSkgewogICAgICAgICAgICBoYXNDb250ZW50ID0gdHJ1ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChhbGxvd0Jsb2NrU2NhbGFycyAmJiByZWFkQmxvY2tTY2FsYXIoc3RhdGUsIGZsb3dJbmRlbnQpIHx8IHJlYWRTaW5nbGVRdW90ZWRTY2FsYXIoc3RhdGUsIGZsb3dJbmRlbnQpIHx8IHJlYWREb3VibGVRdW90ZWRTY2FsYXIoc3RhdGUsIGZsb3dJbmRlbnQpKSB7CiAgICAgICAgICAgICAgaGFzQ29udGVudCA9IHRydWU7CiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVhZEFsaWFzKHN0YXRlKSkgewogICAgICAgICAgICAgIGhhc0NvbnRlbnQgPSB0cnVlOwogICAgICAgICAgICAgIGlmIChzdGF0ZS50YWcgIT09IG51bGwgfHwgc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZSwgImFsaWFzIG5vZGUgc2hvdWxkIG5vdCBoYXZlIGFueSBwcm9wZXJ0aWVzIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKHJlYWRQbGFpblNjYWxhcihzdGF0ZSwgZmxvd0luZGVudCwgQ09OVEVYVF9GTE9XX0lOID09PSBub2RlQ29udGV4dCkpIHsKICAgICAgICAgICAgICBoYXNDb250ZW50ID0gdHJ1ZTsKICAgICAgICAgICAgICBpZiAoc3RhdGUudGFnID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICBzdGF0ZS50YWcgPSAiPyI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdGF0ZS5hbmNob3IgIT09IG51bGwpIHsKICAgICAgICAgICAgICBzdGF0ZS5hbmNob3JNYXBbc3RhdGUuYW5jaG9yXSA9IHN0YXRlLnJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoaW5kZW50U3RhdHVzID09PSAwKSB7CiAgICAgICAgICBoYXNDb250ZW50ID0gYWxsb3dCbG9ja0NvbGxlY3Rpb25zICYmIHJlYWRCbG9ja1NlcXVlbmNlKHN0YXRlLCBibG9ja0luZGVudCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChzdGF0ZS50YWcgIT09IG51bGwgJiYgc3RhdGUudGFnICE9PSAiISIpIHsKICAgICAgICBpZiAoc3RhdGUudGFnID09PSAiPyIpIHsKICAgICAgICAgIGlmIChzdGF0ZS5yZXN1bHQgIT09IG51bGwgJiYgc3RhdGUua2luZCAhPT0gInNjYWxhciIpIHsKICAgICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICd1bmFjY2VwdGFibGUgbm9kZSBraW5kIGZvciAhPD8+IHRhZzsgaXQgc2hvdWxkIGJlICJzY2FsYXIiLCBub3QgIicgKyBzdGF0ZS5raW5kICsgJyInKTsKICAgICAgICAgIH0KICAgICAgICAgIGZvciAodHlwZUluZGV4ID0gMCwgdHlwZVF1YW50aXR5ID0gc3RhdGUuaW1wbGljaXRUeXBlcy5sZW5ndGg7IHR5cGVJbmRleCA8IHR5cGVRdWFudGl0eTsgdHlwZUluZGV4ICs9IDEpIHsKICAgICAgICAgICAgdHlwZTUgPSBzdGF0ZS5pbXBsaWNpdFR5cGVzW3R5cGVJbmRleF07CiAgICAgICAgICAgIGlmICh0eXBlNS5yZXNvbHZlKHN0YXRlLnJlc3VsdCkpIHsKICAgICAgICAgICAgICBzdGF0ZS5yZXN1bHQgPSB0eXBlNS5jb25zdHJ1Y3Qoc3RhdGUucmVzdWx0KTsKICAgICAgICAgICAgICBzdGF0ZS50YWcgPSB0eXBlNS50YWc7CiAgICAgICAgICAgICAgaWYgKHN0YXRlLmFuY2hvciAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgc3RhdGUuYW5jaG9yTWFwW3N0YXRlLmFuY2hvcl0gPSBzdGF0ZS5yZXN1bHQ7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChfaGFzT3duUHJvcGVydHkuY2FsbChzdGF0ZS50eXBlTWFwW3N0YXRlLmtpbmQgfHwgImZhbGxiYWNrIl0sIHN0YXRlLnRhZykpIHsKICAgICAgICAgIHR5cGU1ID0gc3RhdGUudHlwZU1hcFtzdGF0ZS5raW5kIHx8ICJmYWxsYmFjayJdW3N0YXRlLnRhZ107CiAgICAgICAgICBpZiAoc3RhdGUucmVzdWx0ICE9PSBudWxsICYmIHR5cGU1LmtpbmQgIT09IHN0YXRlLmtpbmQpIHsKICAgICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJ1bmFjY2VwdGFibGUgbm9kZSBraW5kIGZvciAhPCIgKyBzdGF0ZS50YWcgKyAnPiB0YWc7IGl0IHNob3VsZCBiZSAiJyArIHR5cGU1LmtpbmQgKyAnIiwgbm90ICInICsgc3RhdGUua2luZCArICciJyk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIXR5cGU1LnJlc29sdmUoc3RhdGUucmVzdWx0KSkgewogICAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZSwgImNhbm5vdCByZXNvbHZlIGEgbm9kZSB3aXRoICE8IiArIHN0YXRlLnRhZyArICI+IGV4cGxpY2l0IHRhZyIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RhdGUucmVzdWx0ID0gdHlwZTUuY29uc3RydWN0KHN0YXRlLnJlc3VsdCk7CiAgICAgICAgICAgIGlmIChzdGF0ZS5hbmNob3IgIT09IG51bGwpIHsKICAgICAgICAgICAgICBzdGF0ZS5hbmNob3JNYXBbc3RhdGUuYW5jaG9yXSA9IHN0YXRlLnJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZSwgInVua25vd24gdGFnICE8IiArIHN0YXRlLnRhZyArICI+Iik7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChzdGF0ZS5saXN0ZW5lciAhPT0gbnVsbCkgewogICAgICAgIHN0YXRlLmxpc3RlbmVyKCJjbG9zZSIsIHN0YXRlKTsKICAgICAgfQogICAgICByZXR1cm4gc3RhdGUudGFnICE9PSBudWxsIHx8IHN0YXRlLmFuY2hvciAhPT0gbnVsbCB8fCBoYXNDb250ZW50OwogICAgfQogICAgX19uYW1lKGNvbXBvc2VOb2RlLCAiY29tcG9zZU5vZGUiKTsKICAgIGZ1bmN0aW9uIHJlYWREb2N1bWVudChzdGF0ZSkgewogICAgICB2YXIgZG9jdW1lbnRTdGFydCA9IHN0YXRlLnBvc2l0aW9uLCBfcG9zaXRpb24sIGRpcmVjdGl2ZU5hbWUsIGRpcmVjdGl2ZUFyZ3MsIGhhc0RpcmVjdGl2ZXMgPSBmYWxzZSwgY2g7CiAgICAgIHN0YXRlLnZlcnNpb24gPSBudWxsOwogICAgICBzdGF0ZS5jaGVja0xpbmVCcmVha3MgPSBzdGF0ZS5sZWdhY3k7CiAgICAgIHN0YXRlLnRhZ01hcCA9IHt9OwogICAgICBzdGF0ZS5hbmNob3JNYXAgPSB7fTsKICAgICAgd2hpbGUgKChjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pKSAhPT0gMCkgewogICAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTsKICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pOwogICAgICAgIGlmIChzdGF0ZS5saW5lSW5kZW50ID4gMCB8fCBjaCAhPT0gMzcpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBoYXNEaXJlY3RpdmVzID0gdHJ1ZTsKICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7CiAgICAgICAgX3Bvc2l0aW9uID0gc3RhdGUucG9zaXRpb247CiAgICAgICAgd2hpbGUgKGNoICE9PSAwICYmICFpc19XU19PUl9FT0woY2gpKSB7CiAgICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7CiAgICAgICAgfQogICAgICAgIGRpcmVjdGl2ZU5hbWUgPSBzdGF0ZS5pbnB1dC5zbGljZShfcG9zaXRpb24sIHN0YXRlLnBvc2l0aW9uKTsKICAgICAgICBkaXJlY3RpdmVBcmdzID0gW107CiAgICAgICAgaWYgKGRpcmVjdGl2ZU5hbWUubGVuZ3RoIDwgMSkgewogICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJkaXJlY3RpdmUgbmFtZSBtdXN0IG5vdCBiZSBsZXNzIHRoYW4gb25lIGNoYXJhY3RlciBpbiBsZW5ndGgiKTsKICAgICAgICB9CiAgICAgICAgd2hpbGUgKGNoICE9PSAwKSB7CiAgICAgICAgICB3aGlsZSAoaXNfV0hJVEVfU1BBQ0UoY2gpKSB7CiAgICAgICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChjaCA9PT0gMzUpIHsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTsKICAgICAgICAgICAgfSB3aGlsZSAoY2ggIT09IDAgJiYgIWlzX0VPTChjaCkpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChpc19FT0woY2gpKSBicmVhazsKICAgICAgICAgIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uOwogICAgICAgICAgd2hpbGUgKGNoICE9PSAwICYmICFpc19XU19PUl9FT0woY2gpKSB7CiAgICAgICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTsKICAgICAgICAgIH0KICAgICAgICAgIGRpcmVjdGl2ZUFyZ3MucHVzaChzdGF0ZS5pbnB1dC5zbGljZShfcG9zaXRpb24sIHN0YXRlLnBvc2l0aW9uKSk7CiAgICAgICAgfQogICAgICAgIGlmIChjaCAhPT0gMCkgcmVhZExpbmVCcmVhayhzdGF0ZSk7CiAgICAgICAgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKGRpcmVjdGl2ZUhhbmRsZXJzLCBkaXJlY3RpdmVOYW1lKSkgewogICAgICAgICAgZGlyZWN0aXZlSGFuZGxlcnNbZGlyZWN0aXZlTmFtZV0oc3RhdGUsIGRpcmVjdGl2ZU5hbWUsIGRpcmVjdGl2ZUFyZ3MpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvd1dhcm5pbmcoc3RhdGUsICd1bmtub3duIGRvY3VtZW50IGRpcmVjdGl2ZSAiJyArIGRpcmVjdGl2ZU5hbWUgKyAnIicpOwogICAgICAgIH0KICAgICAgfQogICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7CiAgICAgIGlmIChzdGF0ZS5saW5lSW5kZW50ID09PSAwICYmIHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pID09PSA0NSAmJiBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uICsgMSkgPT09IDQ1ICYmIHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gKyAyKSA9PT0gNDUpIHsKICAgICAgICBzdGF0ZS5wb3NpdGlvbiArPSAzOwogICAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTsKICAgICAgfSBlbHNlIGlmIChoYXNEaXJlY3RpdmVzKSB7CiAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJkaXJlY3RpdmVzIGVuZCBtYXJrIGlzIGV4cGVjdGVkIik7CiAgICAgIH0KICAgICAgY29tcG9zZU5vZGUoc3RhdGUsIHN0YXRlLmxpbmVJbmRlbnQgLSAxLCBDT05URVhUX0JMT0NLX09VVCwgZmFsc2UsIHRydWUpOwogICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7CiAgICAgIGlmIChzdGF0ZS5jaGVja0xpbmVCcmVha3MgJiYgUEFUVEVSTl9OT05fQVNDSUlfTElORV9CUkVBS1MudGVzdChzdGF0ZS5pbnB1dC5zbGljZShkb2N1bWVudFN0YXJ0LCBzdGF0ZS5wb3NpdGlvbikpKSB7CiAgICAgICAgdGhyb3dXYXJuaW5nKHN0YXRlLCAibm9uLUFTQ0lJIGxpbmUgYnJlYWtzIGFyZSBpbnRlcnByZXRlZCBhcyBjb250ZW50Iik7CiAgICAgIH0KICAgICAgc3RhdGUuZG9jdW1lbnRzLnB1c2goc3RhdGUucmVzdWx0KTsKICAgICAgaWYgKHN0YXRlLnBvc2l0aW9uID09PSBzdGF0ZS5saW5lU3RhcnQgJiYgdGVzdERvY3VtZW50U2VwYXJhdG9yKHN0YXRlKSkgewogICAgICAgIGlmIChzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKSA9PT0gNDYpIHsKICAgICAgICAgIHN0YXRlLnBvc2l0aW9uICs9IDM7CiAgICAgICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoc3RhdGUucG9zaXRpb24gPCBzdGF0ZS5sZW5ndGggLSAxKSB7CiAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJlbmQgb2YgdGhlIHN0cmVhbSBvciBhIGRvY3VtZW50IHNlcGFyYXRvciBpcyBleHBlY3RlZCIpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQogICAgX19uYW1lKHJlYWREb2N1bWVudCwgInJlYWREb2N1bWVudCIpOwogICAgZnVuY3Rpb24gbG9hZERvY3VtZW50cyhpbnB1dCwgb3B0aW9ucykgewogICAgICBpbnB1dCA9IFN0cmluZyhpbnB1dCk7CiAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgICBpZiAoaW5wdXQubGVuZ3RoICE9PSAwKSB7CiAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQoaW5wdXQubGVuZ3RoIC0gMSkgIT09IDEwICYmIGlucHV0LmNoYXJDb2RlQXQoaW5wdXQubGVuZ3RoIC0gMSkgIT09IDEzKSB7CiAgICAgICAgICBpbnB1dCArPSAiXG4iOwogICAgICAgIH0KICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdCgwKSA9PT0gNjUyNzkpIHsKICAgICAgICAgIGlucHV0ID0gaW5wdXQuc2xpY2UoMSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhciBzdGF0ZSA9IG5ldyBTdGF0ZShpbnB1dCwgb3B0aW9ucyk7CiAgICAgIHZhciBudWxscG9zID0gaW5wdXQuaW5kZXhPZigiXDAiKTsKICAgICAgaWYgKG51bGxwb3MgIT09IC0xKSB7CiAgICAgICAgc3RhdGUucG9zaXRpb24gPSBudWxscG9zOwogICAgICAgIHRocm93RXJyb3IyKHN0YXRlLCAibnVsbCBieXRlIGlzIG5vdCBhbGxvd2VkIGluIGlucHV0Iik7CiAgICAgIH0KICAgICAgc3RhdGUuaW5wdXQgKz0gIlwwIjsKICAgICAgd2hpbGUgKHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pID09PSAzMikgewogICAgICAgIHN0YXRlLmxpbmVJbmRlbnQgKz0gMTsKICAgICAgICBzdGF0ZS5wb3NpdGlvbiArPSAxOwogICAgICB9CiAgICAgIHdoaWxlIChzdGF0ZS5wb3NpdGlvbiA8IHN0YXRlLmxlbmd0aCAtIDEpIHsKICAgICAgICByZWFkRG9jdW1lbnQoc3RhdGUpOwogICAgICB9CiAgICAgIHJldHVybiBzdGF0ZS5kb2N1bWVudHM7CiAgICB9CiAgICBfX25hbWUobG9hZERvY3VtZW50cywgImxvYWREb2N1bWVudHMiKTsKICAgIGZ1bmN0aW9uIGxvYWRBbGwoaW5wdXQsIGl0ZXJhdG9yMiwgb3B0aW9ucykgewogICAgICBpZiAoaXRlcmF0b3IyICE9PSBudWxsICYmIHR5cGVvZiBpdGVyYXRvcjIgPT09ICJvYmplY3QiICYmIHR5cGVvZiBvcHRpb25zID09PSAidW5kZWZpbmVkIikgewogICAgICAgIG9wdGlvbnMgPSBpdGVyYXRvcjI7CiAgICAgICAgaXRlcmF0b3IyID0gbnVsbDsKICAgICAgfQogICAgICB2YXIgZG9jdW1lbnRzID0gbG9hZERvY3VtZW50cyhpbnB1dCwgb3B0aW9ucyk7CiAgICAgIGlmICh0eXBlb2YgaXRlcmF0b3IyICE9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50czsKICAgICAgfQogICAgICBmb3IgKHZhciBpbmRleDIgPSAwLCBsZW5ndGggPSBkb2N1bWVudHMubGVuZ3RoOyBpbmRleDIgPCBsZW5ndGg7IGluZGV4MiArPSAxKSB7CiAgICAgICAgaXRlcmF0b3IyKGRvY3VtZW50c1tpbmRleDJdKTsKICAgICAgfQogICAgfQogICAgX19uYW1lKGxvYWRBbGwsICJsb2FkQWxsIik7CiAgICBmdW5jdGlvbiBsb2FkKGlucHV0LCBvcHRpb25zKSB7CiAgICAgIHZhciBkb2N1bWVudHMgPSBsb2FkRG9jdW1lbnRzKGlucHV0LCBvcHRpb25zKTsKICAgICAgaWYgKGRvY3VtZW50cy5sZW5ndGggPT09IDApIHsKICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICB9IGVsc2UgaWYgKGRvY3VtZW50cy5sZW5ndGggPT09IDEpIHsKICAgICAgICByZXR1cm4gZG9jdW1lbnRzWzBdOwogICAgICB9CiAgICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCJleHBlY3RlZCBhIHNpbmdsZSBkb2N1bWVudCBpbiB0aGUgc3RyZWFtLCBidXQgZm91bmQgbW9yZSIpOwogICAgfQogICAgX19uYW1lKGxvYWQsICJsb2FkIik7CiAgICBmdW5jdGlvbiBzYWZlTG9hZEFsbChpbnB1dCwgaXRlcmF0b3IyLCBvcHRpb25zKSB7CiAgICAgIGlmICh0eXBlb2YgaXRlcmF0b3IyID09PSAib2JqZWN0IiAmJiBpdGVyYXRvcjIgIT09IG51bGwgJiYgdHlwZW9mIG9wdGlvbnMgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgb3B0aW9ucyA9IGl0ZXJhdG9yMjsKICAgICAgICBpdGVyYXRvcjIgPSBudWxsOwogICAgICB9CiAgICAgIHJldHVybiBsb2FkQWxsKGlucHV0LCBpdGVyYXRvcjIsIGNvbW1vbi5leHRlbmQoeyBzY2hlbWE6IERFRkFVTFRfU0FGRV9TQ0hFTUEgfSwgb3B0aW9ucykpOwogICAgfQogICAgX19uYW1lKHNhZmVMb2FkQWxsLCAic2FmZUxvYWRBbGwiKTsKICAgIGZ1bmN0aW9uIHNhZmVMb2FkKGlucHV0LCBvcHRpb25zKSB7CiAgICAgIHJldHVybiBsb2FkKGlucHV0LCBjb21tb24uZXh0ZW5kKHsgc2NoZW1hOiBERUZBVUxUX1NBRkVfU0NIRU1BIH0sIG9wdGlvbnMpKTsKICAgIH0KICAgIF9fbmFtZShzYWZlTG9hZCwgInNhZmVMb2FkIik7CiAgICBtb2R1bGUuZXhwb3J0cy5sb2FkQWxsID0gbG9hZEFsbDsKICAgIG1vZHVsZS5leHBvcnRzLmxvYWQgPSBsb2FkOwogICAgbW9kdWxlLmV4cG9ydHMuc2FmZUxvYWRBbGwgPSBzYWZlTG9hZEFsbDsKICAgIG1vZHVsZS5leHBvcnRzLnNhZmVMb2FkID0gc2FmZUxvYWQ7CiAgICB2YXIgaTEwOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvZHVtcGVyLmpzCnZhciByZXF1aXJlX2R1bXBlciA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvZHVtcGVyLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBjb21tb24gPSByZXF1aXJlX2NvbW1vbigpOwogICAgdmFyIFlBTUxFeGNlcHRpb24gPSByZXF1aXJlX2V4Y2VwdGlvbigpOwogICAgdmFyIERFRkFVTFRfRlVMTF9TQ0hFTUEgPSByZXF1aXJlX2RlZmF1bHRfZnVsbCgpOwogICAgdmFyIERFRkFVTFRfU0FGRV9TQ0hFTUEgPSByZXF1aXJlX2RlZmF1bHRfc2FmZSgpOwogICAgdmFyIF90b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7CiAgICB2YXIgX2hhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTsKICAgIHZhciBDSEFSX1RBQiA9IDk7CiAgICB2YXIgQ0hBUl9MSU5FX0ZFRUQgPSAxMDsKICAgIHZhciBDSEFSX0NBUlJJQUdFX1JFVFVSTiA9IDEzOwogICAgdmFyIENIQVJfU1BBQ0UgPSAzMjsKICAgIHZhciBDSEFSX0VYQ0xBTUFUSU9OID0gMzM7CiAgICB2YXIgQ0hBUl9ET1VCTEVfUVVPVEUgPSAzNDsKICAgIHZhciBDSEFSX1NIQVJQID0gMzU7CiAgICB2YXIgQ0hBUl9QRVJDRU5UID0gMzc7CiAgICB2YXIgQ0hBUl9BTVBFUlNBTkQgPSAzODsKICAgIHZhciBDSEFSX1NJTkdMRV9RVU9URSA9IDM5OwogICAgdmFyIENIQVJfQVNURVJJU0sgPSA0MjsKICAgIHZhciBDSEFSX0NPTU1BID0gNDQ7CiAgICB2YXIgQ0hBUl9NSU5VUyA9IDQ1OwogICAgdmFyIENIQVJfQ09MT04gPSA1ODsKICAgIHZhciBDSEFSX0VRVUFMUyA9IDYxOwogICAgdmFyIENIQVJfR1JFQVRFUl9USEFOID0gNjI7CiAgICB2YXIgQ0hBUl9RVUVTVElPTiA9IDYzOwogICAgdmFyIENIQVJfQ09NTUVSQ0lBTF9BVCA9IDY0OwogICAgdmFyIENIQVJfTEVGVF9TUVVBUkVfQlJBQ0tFVCA9IDkxOwogICAgdmFyIENIQVJfUklHSFRfU1FVQVJFX0JSQUNLRVQgPSA5MzsKICAgIHZhciBDSEFSX0dSQVZFX0FDQ0VOVCA9IDk2OwogICAgdmFyIENIQVJfTEVGVF9DVVJMWV9CUkFDS0VUID0gMTIzOwogICAgdmFyIENIQVJfVkVSVElDQUxfTElORSA9IDEyNDsKICAgIHZhciBDSEFSX1JJR0hUX0NVUkxZX0JSQUNLRVQgPSAxMjU7CiAgICB2YXIgRVNDQVBFX1NFUVVFTkNFUyA9IHt9OwogICAgRVNDQVBFX1NFUVVFTkNFU1swXSA9ICJcXDAiOwogICAgRVNDQVBFX1NFUVVFTkNFU1s3XSA9ICJcXGEiOwogICAgRVNDQVBFX1NFUVVFTkNFU1s4XSA9ICJcXGIiOwogICAgRVNDQVBFX1NFUVVFTkNFU1s5XSA9ICJcXHQiOwogICAgRVNDQVBFX1NFUVVFTkNFU1sxMF0gPSAiXFxuIjsKICAgIEVTQ0FQRV9TRVFVRU5DRVNbMTFdID0gIlxcdiI7CiAgICBFU0NBUEVfU0VRVUVOQ0VTWzEyXSA9ICJcXGYiOwogICAgRVNDQVBFX1NFUVVFTkNFU1sxM10gPSAiXFxyIjsKICAgIEVTQ0FQRV9TRVFVRU5DRVNbMjddID0gIlxcZSI7CiAgICBFU0NBUEVfU0VRVUVOQ0VTWzM0XSA9ICdcXCInOwogICAgRVNDQVBFX1NFUVVFTkNFU1s5Ml0gPSAiXFxcXCI7CiAgICBFU0NBUEVfU0VRVUVOQ0VTWzEzM10gPSAiXFxOIjsKICAgIEVTQ0FQRV9TRVFVRU5DRVNbMTYwXSA9ICJcXF8iOwogICAgRVNDQVBFX1NFUVVFTkNFU1s4MjMyXSA9ICJcXEwiOwogICAgRVNDQVBFX1NFUVVFTkNFU1s4MjMzXSA9ICJcXFAiOwogICAgdmFyIERFUFJFQ0FURURfQk9PTEVBTlNfU1lOVEFYID0gWwogICAgICAieSIsCiAgICAgICJZIiwKICAgICAgInllcyIsCiAgICAgICJZZXMiLAogICAgICAiWUVTIiwKICAgICAgIm9uIiwKICAgICAgIk9uIiwKICAgICAgIk9OIiwKICAgICAgIm4iLAogICAgICAiTiIsCiAgICAgICJubyIsCiAgICAgICJObyIsCiAgICAgICJOTyIsCiAgICAgICJvZmYiLAogICAgICAiT2ZmIiwKICAgICAgIk9GRiIKICAgIF07CiAgICBmdW5jdGlvbiBjb21waWxlU3R5bGVNYXAoc2NoZW1hLCBtYXA3KSB7CiAgICAgIHZhciByZXN1bHQsIGtleXMyLCBpbmRleDIsIGxlbmd0aCwgdGFnLCBzdHlsZSwgdHlwZTU7CiAgICAgIGlmIChtYXA3ID09PSBudWxsKSByZXR1cm4ge307CiAgICAgIHJlc3VsdCA9IHt9OwogICAgICBrZXlzMiA9IE9iamVjdC5rZXlzKG1hcDcpOwogICAgICBmb3IgKGluZGV4MiA9IDAsIGxlbmd0aCA9IGtleXMyLmxlbmd0aDsgaW5kZXgyIDwgbGVuZ3RoOyBpbmRleDIgKz0gMSkgewogICAgICAgIHRhZyA9IGtleXMyW2luZGV4Ml07CiAgICAgICAgc3R5bGUgPSBTdHJpbmcobWFwN1t0YWddKTsKICAgICAgICBpZiAodGFnLnNsaWNlKDAsIDIpID09PSAiISEiKSB7CiAgICAgICAgICB0YWcgPSAidGFnOnlhbWwub3JnLDIwMDI6IiArIHRhZy5zbGljZSgyKTsKICAgICAgICB9CiAgICAgICAgdHlwZTUgPSBzY2hlbWEuY29tcGlsZWRUeXBlTWFwWyJmYWxsYmFjayJdW3RhZ107CiAgICAgICAgaWYgKHR5cGU1ICYmIF9oYXNPd25Qcm9wZXJ0eS5jYWxsKHR5cGU1LnN0eWxlQWxpYXNlcywgc3R5bGUpKSB7CiAgICAgICAgICBzdHlsZSA9IHR5cGU1LnN0eWxlQWxpYXNlc1tzdHlsZV07CiAgICAgICAgfQogICAgICAgIHJlc3VsdFt0YWddID0gc3R5bGU7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIF9fbmFtZShjb21waWxlU3R5bGVNYXAsICJjb21waWxlU3R5bGVNYXAiKTsKICAgIGZ1bmN0aW9uIGVuY29kZUhleChjaGFyYWN0ZXIpIHsKICAgICAgdmFyIHN0cmluZzMsIGhhbmRsZTMsIGxlbmd0aDsKICAgICAgc3RyaW5nMyA9IGNoYXJhY3Rlci50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTsKICAgICAgaWYgKGNoYXJhY3RlciA8PSAyNTUpIHsKICAgICAgICBoYW5kbGUzID0gIngiOwogICAgICAgIGxlbmd0aCA9IDI7CiAgICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyIDw9IDY1NTM1KSB7CiAgICAgICAgaGFuZGxlMyA9ICJ1IjsKICAgICAgICBsZW5ndGggPSA0OwogICAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciA8PSA0Mjk0OTY3Mjk1KSB7CiAgICAgICAgaGFuZGxlMyA9ICJVIjsKICAgICAgICBsZW5ndGggPSA4OwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCJjb2RlIHBvaW50IHdpdGhpbiBhIHN0cmluZyBtYXkgbm90IGJlIGdyZWF0ZXIgdGhhbiAweEZGRkZGRkZGIik7CiAgICAgIH0KICAgICAgcmV0dXJuICJcXCIgKyBoYW5kbGUzICsgY29tbW9uLnJlcGVhdCgiMCIsIGxlbmd0aCAtIHN0cmluZzMubGVuZ3RoKSArIHN0cmluZzM7CiAgICB9CiAgICBfX25hbWUoZW5jb2RlSGV4LCAiZW5jb2RlSGV4Iik7CiAgICBmdW5jdGlvbiBTdGF0ZShvcHRpb25zKSB7CiAgICAgIHRoaXMuc2NoZW1hID0gb3B0aW9uc1sic2NoZW1hIl0gfHwgREVGQVVMVF9GVUxMX1NDSEVNQTsKICAgICAgdGhpcy5pbmRlbnQgPSBNYXRoLm1heCgxLCBvcHRpb25zWyJpbmRlbnQiXSB8fCAyKTsKICAgICAgdGhpcy5ub0FycmF5SW5kZW50ID0gb3B0aW9uc1sibm9BcnJheUluZGVudCJdIHx8IGZhbHNlOwogICAgICB0aGlzLnNraXBJbnZhbGlkID0gb3B0aW9uc1sic2tpcEludmFsaWQiXSB8fCBmYWxzZTsKICAgICAgdGhpcy5mbG93TGV2ZWwgPSBjb21tb24uaXNOb3RoaW5nKG9wdGlvbnNbImZsb3dMZXZlbCJdKSA/IC0xIDogb3B0aW9uc1siZmxvd0xldmVsIl07CiAgICAgIHRoaXMuc3R5bGVNYXAgPSBjb21waWxlU3R5bGVNYXAodGhpcy5zY2hlbWEsIG9wdGlvbnNbInN0eWxlcyJdIHx8IG51bGwpOwogICAgICB0aGlzLnNvcnRLZXlzID0gb3B0aW9uc1sic29ydEtleXMiXSB8fCBmYWxzZTsKICAgICAgdGhpcy5saW5lV2lkdGggPSBvcHRpb25zWyJsaW5lV2lkdGgiXSB8fCA4MDsKICAgICAgdGhpcy5ub1JlZnMgPSBvcHRpb25zWyJub1JlZnMiXSB8fCBmYWxzZTsKICAgICAgdGhpcy5ub0NvbXBhdE1vZGUgPSBvcHRpb25zWyJub0NvbXBhdE1vZGUiXSB8fCBmYWxzZTsKICAgICAgdGhpcy5jb25kZW5zZUZsb3cgPSBvcHRpb25zWyJjb25kZW5zZUZsb3ciXSB8fCBmYWxzZTsKICAgICAgdGhpcy5pbXBsaWNpdFR5cGVzID0gdGhpcy5zY2hlbWEuY29tcGlsZWRJbXBsaWNpdDsKICAgICAgdGhpcy5leHBsaWNpdFR5cGVzID0gdGhpcy5zY2hlbWEuY29tcGlsZWRFeHBsaWNpdDsKICAgICAgdGhpcy50YWcgPSBudWxsOwogICAgICB0aGlzLnJlc3VsdCA9ICIiOwogICAgICB0aGlzLmR1cGxpY2F0ZXMgPSBbXTsKICAgICAgdGhpcy51c2VkRHVwbGljYXRlcyA9IG51bGw7CiAgICB9CiAgICBfX25hbWUoU3RhdGUsICJTdGF0ZSIpOwogICAgZnVuY3Rpb24gaW5kZW50U3RyaW5nKHN0cmluZzMsIHNwYWNlcykgewogICAgICB2YXIgaW5kID0gY29tbW9uLnJlcGVhdCgiICIsIHNwYWNlcyksIHBvc2l0aW9uMyA9IDAsIG5leHQyID0gLTEsIHJlc3VsdCA9ICIiLCBsaW5lLCBsZW5ndGggPSBzdHJpbmczLmxlbmd0aDsKICAgICAgd2hpbGUgKHBvc2l0aW9uMyA8IGxlbmd0aCkgewogICAgICAgIG5leHQyID0gc3RyaW5nMy5pbmRleE9mKCJcbiIsIHBvc2l0aW9uMyk7CiAgICAgICAgaWYgKG5leHQyID09PSAtMSkgewogICAgICAgICAgbGluZSA9IHN0cmluZzMuc2xpY2UocG9zaXRpb24zKTsKICAgICAgICAgIHBvc2l0aW9uMyA9IGxlbmd0aDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbGluZSA9IHN0cmluZzMuc2xpY2UocG9zaXRpb24zLCBuZXh0MiArIDEpOwogICAgICAgICAgcG9zaXRpb24zID0gbmV4dDIgKyAxOwogICAgICAgIH0KICAgICAgICBpZiAobGluZS5sZW5ndGggJiYgbGluZSAhPT0gIlxuIikgcmVzdWx0ICs9IGluZDsKICAgICAgICByZXN1bHQgKz0gbGluZTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgX19uYW1lKGluZGVudFN0cmluZywgImluZGVudFN0cmluZyIpOwogICAgZnVuY3Rpb24gZ2VuZXJhdGVOZXh0TGluZShzdGF0ZSwgbGV2ZWwpIHsKICAgICAgcmV0dXJuICJcbiIgKyBjb21tb24ucmVwZWF0KCIgIiwgc3RhdGUuaW5kZW50ICogbGV2ZWwpOwogICAgfQogICAgX19uYW1lKGdlbmVyYXRlTmV4dExpbmUsICJnZW5lcmF0ZU5leHRMaW5lIik7CiAgICBmdW5jdGlvbiB0ZXN0SW1wbGljaXRSZXNvbHZpbmcoc3RhdGUsIHN0cikgewogICAgICB2YXIgaW5kZXgyLCBsZW5ndGgsIHR5cGU1OwogICAgICBmb3IgKGluZGV4MiA9IDAsIGxlbmd0aCA9IHN0YXRlLmltcGxpY2l0VHlwZXMubGVuZ3RoOyBpbmRleDIgPCBsZW5ndGg7IGluZGV4MiArPSAxKSB7CiAgICAgICAgdHlwZTUgPSBzdGF0ZS5pbXBsaWNpdFR5cGVzW2luZGV4Ml07CiAgICAgICAgaWYgKHR5cGU1LnJlc29sdmUoc3RyKSkgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIF9fbmFtZSh0ZXN0SW1wbGljaXRSZXNvbHZpbmcsICJ0ZXN0SW1wbGljaXRSZXNvbHZpbmciKTsKICAgIGZ1bmN0aW9uIGlzV2hpdGVzcGFjZShjMTApIHsKICAgICAgcmV0dXJuIGMxMCA9PT0gQ0hBUl9TUEFDRSB8fCBjMTAgPT09IENIQVJfVEFCOwogICAgfQogICAgX19uYW1lKGlzV2hpdGVzcGFjZSwgImlzV2hpdGVzcGFjZSIpOwogICAgZnVuY3Rpb24gaXNQcmludGFibGUoYzEwKSB7CiAgICAgIHJldHVybiAzMiA8PSBjMTAgJiYgYzEwIDw9IDEyNiB8fCAxNjEgPD0gYzEwICYmIGMxMCA8PSA1NTI5NSAmJiBjMTAgIT09IDgyMzIgJiYgYzEwICE9PSA4MjMzIHx8IDU3MzQ0IDw9IGMxMCAmJiBjMTAgPD0gNjU1MzMgJiYgYzEwICE9PSA2NTI3OSB8fCA2NTUzNiA8PSBjMTAgJiYgYzEwIDw9IDExMTQxMTE7CiAgICB9CiAgICBfX25hbWUoaXNQcmludGFibGUsICJpc1ByaW50YWJsZSIpOwogICAgZnVuY3Rpb24gaXNOc0NoYXIoYzEwKSB7CiAgICAgIHJldHVybiBpc1ByaW50YWJsZShjMTApICYmICFpc1doaXRlc3BhY2UoYzEwKSAmJiBjMTAgIT09IDY1Mjc5ICYmIGMxMCAhPT0gQ0hBUl9DQVJSSUFHRV9SRVRVUk4gJiYgYzEwICE9PSBDSEFSX0xJTkVfRkVFRDsKICAgIH0KICAgIF9fbmFtZShpc05zQ2hhciwgImlzTnNDaGFyIik7CiAgICBmdW5jdGlvbiBpc1BsYWluU2FmZShjMTAsIHByZXYpIHsKICAgICAgcmV0dXJuIGlzUHJpbnRhYmxlKGMxMCkgJiYgYzEwICE9PSA2NTI3OSAmJiBjMTAgIT09IENIQVJfQ09NTUEgJiYgYzEwICE9PSBDSEFSX0xFRlRfU1FVQVJFX0JSQUNLRVQgJiYgYzEwICE9PSBDSEFSX1JJR0hUX1NRVUFSRV9CUkFDS0VUICYmIGMxMCAhPT0gQ0hBUl9MRUZUX0NVUkxZX0JSQUNLRVQgJiYgYzEwICE9PSBDSEFSX1JJR0hUX0NVUkxZX0JSQUNLRVQgJiYgYzEwICE9PSBDSEFSX0NPTE9OICYmIChjMTAgIT09IENIQVJfU0hBUlAgfHwgcHJldiAmJiBpc05zQ2hhcihwcmV2KSk7CiAgICB9CiAgICBfX25hbWUoaXNQbGFpblNhZmUsICJpc1BsYWluU2FmZSIpOwogICAgZnVuY3Rpb24gaXNQbGFpblNhZmVGaXJzdChjMTApIHsKICAgICAgcmV0dXJuIGlzUHJpbnRhYmxlKGMxMCkgJiYgYzEwICE9PSA2NTI3OSAmJiAhaXNXaGl0ZXNwYWNlKGMxMCkgJiYgYzEwICE9PSBDSEFSX01JTlVTICYmIGMxMCAhPT0gQ0hBUl9RVUVTVElPTiAmJiBjMTAgIT09IENIQVJfQ09MT04gJiYgYzEwICE9PSBDSEFSX0NPTU1BICYmIGMxMCAhPT0gQ0hBUl9MRUZUX1NRVUFSRV9CUkFDS0VUICYmIGMxMCAhPT0gQ0hBUl9SSUdIVF9TUVVBUkVfQlJBQ0tFVCAmJiBjMTAgIT09IENIQVJfTEVGVF9DVVJMWV9CUkFDS0VUICYmIGMxMCAhPT0gQ0hBUl9SSUdIVF9DVVJMWV9CUkFDS0VUICYmIGMxMCAhPT0gQ0hBUl9TSEFSUCAmJiBjMTAgIT09IENIQVJfQU1QRVJTQU5EICYmIGMxMCAhPT0gQ0hBUl9BU1RFUklTSyAmJiBjMTAgIT09IENIQVJfRVhDTEFNQVRJT04gJiYgYzEwICE9PSBDSEFSX1ZFUlRJQ0FMX0xJTkUgJiYgYzEwICE9PSBDSEFSX0VRVUFMUyAmJiBjMTAgIT09IENIQVJfR1JFQVRFUl9USEFOICYmIGMxMCAhPT0gQ0hBUl9TSU5HTEVfUVVPVEUgJiYgYzEwICE9PSBDSEFSX0RPVUJMRV9RVU9URSAmJiBjMTAgIT09IENIQVJfUEVSQ0VOVCAmJiBjMTAgIT09IENIQVJfQ09NTUVSQ0lBTF9BVCAmJiBjMTAgIT09IENIQVJfR1JBVkVfQUNDRU5UOwogICAgfQogICAgX19uYW1lKGlzUGxhaW5TYWZlRmlyc3QsICJpc1BsYWluU2FmZUZpcnN0Iik7CiAgICBmdW5jdGlvbiBuZWVkSW5kZW50SW5kaWNhdG9yKHN0cmluZzMpIHsKICAgICAgdmFyIGxlYWRpbmdTcGFjZVJlID0gL15cbiogLzsKICAgICAgcmV0dXJuIGxlYWRpbmdTcGFjZVJlLnRlc3Qoc3RyaW5nMyk7CiAgICB9CiAgICBfX25hbWUobmVlZEluZGVudEluZGljYXRvciwgIm5lZWRJbmRlbnRJbmRpY2F0b3IiKTsKICAgIHZhciBTVFlMRV9QTEFJTiA9IDEsIFNUWUxFX1NJTkdMRSA9IDIsIFNUWUxFX0xJVEVSQUwgPSAzLCBTVFlMRV9GT0xERUQgPSA0LCBTVFlMRV9ET1VCTEUgPSA1OwogICAgZnVuY3Rpb24gY2hvb3NlU2NhbGFyU3R5bGUoc3RyaW5nMywgc2luZ2xlTGluZU9ubHksIGluZGVudFBlckxldmVsLCBsaW5lV2lkdGgsIHRlc3RBbWJpZ3VvdXNUeXBlKSB7CiAgICAgIHZhciBpMTA7CiAgICAgIHZhciBjaGFyLCBwcmV2X2NoYXI7CiAgICAgIHZhciBoYXNMaW5lQnJlYWsgPSBmYWxzZTsKICAgICAgdmFyIGhhc0ZvbGRhYmxlTGluZSA9IGZhbHNlOwogICAgICB2YXIgc2hvdWxkVHJhY2tXaWR0aCA9IGxpbmVXaWR0aCAhPT0gLTE7CiAgICAgIHZhciBwcmV2aW91c0xpbmVCcmVhayA9IC0xOwogICAgICB2YXIgcGxhaW4gPSBpc1BsYWluU2FmZUZpcnN0KHN0cmluZzMuY2hhckNvZGVBdCgwKSkgJiYgIWlzV2hpdGVzcGFjZShzdHJpbmczLmNoYXJDb2RlQXQoc3RyaW5nMy5sZW5ndGggLSAxKSk7CiAgICAgIGlmIChzaW5nbGVMaW5lT25seSkgewogICAgICAgIGZvciAoaTEwID0gMDsgaTEwIDwgc3RyaW5nMy5sZW5ndGg7IGkxMCsrKSB7CiAgICAgICAgICBjaGFyID0gc3RyaW5nMy5jaGFyQ29kZUF0KGkxMCk7CiAgICAgICAgICBpZiAoIWlzUHJpbnRhYmxlKGNoYXIpKSB7CiAgICAgICAgICAgIHJldHVybiBTVFlMRV9ET1VCTEU7CiAgICAgICAgICB9CiAgICAgICAgICBwcmV2X2NoYXIgPSBpMTAgPiAwID8gc3RyaW5nMy5jaGFyQ29kZUF0KGkxMCAtIDEpIDogbnVsbDsKICAgICAgICAgIHBsYWluID0gcGxhaW4gJiYgaXNQbGFpblNhZmUoY2hhciwgcHJldl9jaGFyKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yIChpMTAgPSAwOyBpMTAgPCBzdHJpbmczLmxlbmd0aDsgaTEwKyspIHsKICAgICAgICAgIGNoYXIgPSBzdHJpbmczLmNoYXJDb2RlQXQoaTEwKTsKICAgICAgICAgIGlmIChjaGFyID09PSBDSEFSX0xJTkVfRkVFRCkgewogICAgICAgICAgICBoYXNMaW5lQnJlYWsgPSB0cnVlOwogICAgICAgICAgICBpZiAoc2hvdWxkVHJhY2tXaWR0aCkgewogICAgICAgICAgICAgIGhhc0ZvbGRhYmxlTGluZSA9IGhhc0ZvbGRhYmxlTGluZSB8fCAvLyBGb2xkYWJsZSBsaW5lID0gdG9vIGxvbmcsIGFuZCBub3QgbW9yZS1pbmRlbnRlZC4KICAgICAgICAgICAgICBpMTAgLSBwcmV2aW91c0xpbmVCcmVhayAtIDEgPiBsaW5lV2lkdGggJiYgc3RyaW5nM1twcmV2aW91c0xpbmVCcmVhayArIDFdICE9PSAiICI7CiAgICAgICAgICAgICAgcHJldmlvdXNMaW5lQnJlYWsgPSBpMTA7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAoIWlzUHJpbnRhYmxlKGNoYXIpKSB7CiAgICAgICAgICAgIHJldHVybiBTVFlMRV9ET1VCTEU7CiAgICAgICAgICB9CiAgICAgICAgICBwcmV2X2NoYXIgPSBpMTAgPiAwID8gc3RyaW5nMy5jaGFyQ29kZUF0KGkxMCAtIDEpIDogbnVsbDsKICAgICAgICAgIHBsYWluID0gcGxhaW4gJiYgaXNQbGFpblNhZmUoY2hhciwgcHJldl9jaGFyKTsKICAgICAgICB9CiAgICAgICAgaGFzRm9sZGFibGVMaW5lID0gaGFzRm9sZGFibGVMaW5lIHx8IHNob3VsZFRyYWNrV2lkdGggJiYgKGkxMCAtIHByZXZpb3VzTGluZUJyZWFrIC0gMSA+IGxpbmVXaWR0aCAmJiBzdHJpbmczW3ByZXZpb3VzTGluZUJyZWFrICsgMV0gIT09ICIgIik7CiAgICAgIH0KICAgICAgaWYgKCFoYXNMaW5lQnJlYWsgJiYgIWhhc0ZvbGRhYmxlTGluZSkgewogICAgICAgIHJldHVybiBwbGFpbiAmJiAhdGVzdEFtYmlndW91c1R5cGUoc3RyaW5nMykgPyBTVFlMRV9QTEFJTiA6IFNUWUxFX1NJTkdMRTsKICAgICAgfQogICAgICBpZiAoaW5kZW50UGVyTGV2ZWwgPiA5ICYmIG5lZWRJbmRlbnRJbmRpY2F0b3Ioc3RyaW5nMykpIHsKICAgICAgICByZXR1cm4gU1RZTEVfRE9VQkxFOwogICAgICB9CiAgICAgIHJldHVybiBoYXNGb2xkYWJsZUxpbmUgPyBTVFlMRV9GT0xERUQgOiBTVFlMRV9MSVRFUkFMOwogICAgfQogICAgX19uYW1lKGNob29zZVNjYWxhclN0eWxlLCAiY2hvb3NlU2NhbGFyU3R5bGUiKTsKICAgIGZ1bmN0aW9uIHdyaXRlU2NhbGFyKHN0YXRlLCBzdHJpbmczLCBsZXZlbCwgaXNrZXkpIHsKICAgICAgc3RhdGUuZHVtcCA9IChmdW5jdGlvbigpIHsKICAgICAgICBpZiAoc3RyaW5nMy5sZW5ndGggPT09IDApIHsKICAgICAgICAgIHJldHVybiAiJyciOwogICAgICAgIH0KICAgICAgICBpZiAoIXN0YXRlLm5vQ29tcGF0TW9kZSAmJiBERVBSRUNBVEVEX0JPT0xFQU5TX1NZTlRBWC5pbmRleE9mKHN0cmluZzMpICE9PSAtMSkgewogICAgICAgICAgcmV0dXJuICInIiArIHN0cmluZzMgKyAiJyI7CiAgICAgICAgfQogICAgICAgIHZhciBpbmRlbnQzID0gc3RhdGUuaW5kZW50ICogTWF0aC5tYXgoMSwgbGV2ZWwpOwogICAgICAgIHZhciBsaW5lV2lkdGggPSBzdGF0ZS5saW5lV2lkdGggPT09IC0xID8gLTEgOiBNYXRoLm1heChNYXRoLm1pbihzdGF0ZS5saW5lV2lkdGgsIDQwKSwgc3RhdGUubGluZVdpZHRoIC0gaW5kZW50Myk7CiAgICAgICAgdmFyIHNpbmdsZUxpbmVPbmx5ID0gaXNrZXkgfHwgc3RhdGUuZmxvd0xldmVsID4gLTEgJiYgbGV2ZWwgPj0gc3RhdGUuZmxvd0xldmVsOwogICAgICAgIGZ1bmN0aW9uIHRlc3RBbWJpZ3VpdHkoc3RyaW5nNCkgewogICAgICAgICAgcmV0dXJuIHRlc3RJbXBsaWNpdFJlc29sdmluZyhzdGF0ZSwgc3RyaW5nNCk7CiAgICAgICAgfQogICAgICAgIF9fbmFtZSh0ZXN0QW1iaWd1aXR5LCAidGVzdEFtYmlndWl0eSIpOwogICAgICAgIHN3aXRjaCAoY2hvb3NlU2NhbGFyU3R5bGUoc3RyaW5nMywgc2luZ2xlTGluZU9ubHksIHN0YXRlLmluZGVudCwgbGluZVdpZHRoLCB0ZXN0QW1iaWd1aXR5KSkgewogICAgICAgICAgY2FzZSBTVFlMRV9QTEFJTjoKICAgICAgICAgICAgcmV0dXJuIHN0cmluZzM7CiAgICAgICAgICBjYXNlIFNUWUxFX1NJTkdMRToKICAgICAgICAgICAgcmV0dXJuICInIiArIHN0cmluZzMucmVwbGFjZSgvJy9nLCAiJyciKSArICInIjsKICAgICAgICAgIGNhc2UgU1RZTEVfTElURVJBTDoKICAgICAgICAgICAgcmV0dXJuICJ8IiArIGJsb2NrSGVhZGVyKHN0cmluZzMsIHN0YXRlLmluZGVudCkgKyBkcm9wRW5kaW5nTmV3bGluZShpbmRlbnRTdHJpbmcoc3RyaW5nMywgaW5kZW50MykpOwogICAgICAgICAgY2FzZSBTVFlMRV9GT0xERUQ6CiAgICAgICAgICAgIHJldHVybiAiPiIgKyBibG9ja0hlYWRlcihzdHJpbmczLCBzdGF0ZS5pbmRlbnQpICsgZHJvcEVuZGluZ05ld2xpbmUoaW5kZW50U3RyaW5nKGZvbGRTdHJpbmcoc3RyaW5nMywgbGluZVdpZHRoKSwgaW5kZW50MykpOwogICAgICAgICAgY2FzZSBTVFlMRV9ET1VCTEU6CiAgICAgICAgICAgIHJldHVybiAnIicgKyBlc2NhcGVTdHJpbmcoc3RyaW5nMywgbGluZVdpZHRoKSArICciJzsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCJpbXBvc3NpYmxlIGVycm9yOiBpbnZhbGlkIHNjYWxhciBzdHlsZSIpOwogICAgICAgIH0KICAgICAgfSkoKTsKICAgIH0KICAgIF9fbmFtZSh3cml0ZVNjYWxhciwgIndyaXRlU2NhbGFyIik7CiAgICBmdW5jdGlvbiBibG9ja0hlYWRlcihzdHJpbmczLCBpbmRlbnRQZXJMZXZlbCkgewogICAgICB2YXIgaW5kZW50SW5kaWNhdG9yID0gbmVlZEluZGVudEluZGljYXRvcihzdHJpbmczKSA/IFN0cmluZyhpbmRlbnRQZXJMZXZlbCkgOiAiIjsKICAgICAgdmFyIGNsaXAgPSBzdHJpbmczW3N0cmluZzMubGVuZ3RoIC0gMV0gPT09ICJcbiI7CiAgICAgIHZhciBrZWVwID0gY2xpcCAmJiAoc3RyaW5nM1tzdHJpbmczLmxlbmd0aCAtIDJdID09PSAiXG4iIHx8IHN0cmluZzMgPT09ICJcbiIpOwogICAgICB2YXIgY2hvbXAgPSBrZWVwID8gIisiIDogY2xpcCA/ICIiIDogIi0iOwogICAgICByZXR1cm4gaW5kZW50SW5kaWNhdG9yICsgY2hvbXAgKyAiXG4iOwogICAgfQogICAgX19uYW1lKGJsb2NrSGVhZGVyLCAiYmxvY2tIZWFkZXIiKTsKICAgIGZ1bmN0aW9uIGRyb3BFbmRpbmdOZXdsaW5lKHN0cmluZzMpIHsKICAgICAgcmV0dXJuIHN0cmluZzNbc3RyaW5nMy5sZW5ndGggLSAxXSA9PT0gIlxuIiA/IHN0cmluZzMuc2xpY2UoMCwgLTEpIDogc3RyaW5nMzsKICAgIH0KICAgIF9fbmFtZShkcm9wRW5kaW5nTmV3bGluZSwgImRyb3BFbmRpbmdOZXdsaW5lIik7CiAgICBmdW5jdGlvbiBmb2xkU3RyaW5nKHN0cmluZzMsIHdpZHRoKSB7CiAgICAgIHZhciBsaW5lUmUgPSAvKFxuKykoW15cbl0qKS9nOwogICAgICB2YXIgcmVzdWx0ID0gKGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBuZXh0TEYgPSBzdHJpbmczLmluZGV4T2YoIlxuIik7CiAgICAgICAgbmV4dExGID0gbmV4dExGICE9PSAtMSA/IG5leHRMRiA6IHN0cmluZzMubGVuZ3RoOwogICAgICAgIGxpbmVSZS5sYXN0SW5kZXggPSBuZXh0TEY7CiAgICAgICAgcmV0dXJuIGZvbGRMaW5lKHN0cmluZzMuc2xpY2UoMCwgbmV4dExGKSwgd2lkdGgpOwogICAgICB9KSgpOwogICAgICB2YXIgcHJldk1vcmVJbmRlbnRlZCA9IHN0cmluZzNbMF0gPT09ICJcbiIgfHwgc3RyaW5nM1swXSA9PT0gIiAiOwogICAgICB2YXIgbW9yZUluZGVudGVkOwogICAgICB2YXIgbWF0Y2gyOwogICAgICB3aGlsZSAobWF0Y2gyID0gbGluZVJlLmV4ZWMoc3RyaW5nMykpIHsKICAgICAgICB2YXIgcHJlZml4ID0gbWF0Y2gyWzFdLCBsaW5lID0gbWF0Y2gyWzJdOwogICAgICAgIG1vcmVJbmRlbnRlZCA9IGxpbmVbMF0gPT09ICIgIjsKICAgICAgICByZXN1bHQgKz0gcHJlZml4ICsgKCFwcmV2TW9yZUluZGVudGVkICYmICFtb3JlSW5kZW50ZWQgJiYgbGluZSAhPT0gIiIgPyAiXG4iIDogIiIpICsgZm9sZExpbmUobGluZSwgd2lkdGgpOwogICAgICAgIHByZXZNb3JlSW5kZW50ZWQgPSBtb3JlSW5kZW50ZWQ7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIF9fbmFtZShmb2xkU3RyaW5nLCAiZm9sZFN0cmluZyIpOwogICAgZnVuY3Rpb24gZm9sZExpbmUobGluZSwgd2lkdGgpIHsKICAgICAgaWYgKGxpbmUgPT09ICIiIHx8IGxpbmVbMF0gPT09ICIgIikgcmV0dXJuIGxpbmU7CiAgICAgIHZhciBicmVha1JlID0gLyBbXiBdL2c7CiAgICAgIHZhciBtYXRjaDI7CiAgICAgIHZhciBzdGFydCA9IDAsIGVuZCwgY3VyciA9IDAsIG5leHQyID0gMDsKICAgICAgdmFyIHJlc3VsdCA9ICIiOwogICAgICB3aGlsZSAobWF0Y2gyID0gYnJlYWtSZS5leGVjKGxpbmUpKSB7CiAgICAgICAgbmV4dDIgPSBtYXRjaDIuaW5kZXg7CiAgICAgICAgaWYgKG5leHQyIC0gc3RhcnQgPiB3aWR0aCkgewogICAgICAgICAgZW5kID0gY3VyciA+IHN0YXJ0ID8gY3VyciA6IG5leHQyOwogICAgICAgICAgcmVzdWx0ICs9ICJcbiIgKyBsaW5lLnNsaWNlKHN0YXJ0LCBlbmQpOwogICAgICAgICAgc3RhcnQgPSBlbmQgKyAxOwogICAgICAgIH0KICAgICAgICBjdXJyID0gbmV4dDI7CiAgICAgIH0KICAgICAgcmVzdWx0ICs9ICJcbiI7CiAgICAgIGlmIChsaW5lLmxlbmd0aCAtIHN0YXJ0ID4gd2lkdGggJiYgY3VyciA+IHN0YXJ0KSB7CiAgICAgICAgcmVzdWx0ICs9IGxpbmUuc2xpY2Uoc3RhcnQsIGN1cnIpICsgIlxuIiArIGxpbmUuc2xpY2UoY3VyciArIDEpOwogICAgICB9IGVsc2UgewogICAgICAgIHJlc3VsdCArPSBsaW5lLnNsaWNlKHN0YXJ0KTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0LnNsaWNlKDEpOwogICAgfQogICAgX19uYW1lKGZvbGRMaW5lLCAiZm9sZExpbmUiKTsKICAgIGZ1bmN0aW9uIGVzY2FwZVN0cmluZyhzdHJpbmczKSB7CiAgICAgIHZhciByZXN1bHQgPSAiIjsKICAgICAgdmFyIGNoYXIsIG5leHRDaGFyOwogICAgICB2YXIgZXNjYXBlU2VxOwogICAgICBmb3IgKHZhciBpMTAgPSAwOyBpMTAgPCBzdHJpbmczLmxlbmd0aDsgaTEwKyspIHsKICAgICAgICBjaGFyID0gc3RyaW5nMy5jaGFyQ29kZUF0KGkxMCk7CiAgICAgICAgaWYgKGNoYXIgPj0gNTUyOTYgJiYgY2hhciA8PSA1NjMxOSkgewogICAgICAgICAgbmV4dENoYXIgPSBzdHJpbmczLmNoYXJDb2RlQXQoaTEwICsgMSk7CiAgICAgICAgICBpZiAobmV4dENoYXIgPj0gNTYzMjAgJiYgbmV4dENoYXIgPD0gNTczNDMpIHsKICAgICAgICAgICAgcmVzdWx0ICs9IGVuY29kZUhleCgoY2hhciAtIDU1Mjk2KSAqIDEwMjQgKyBuZXh0Q2hhciAtIDU2MzIwICsgNjU1MzYpOwogICAgICAgICAgICBpMTArKzsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVzY2FwZVNlcSA9IEVTQ0FQRV9TRVFVRU5DRVNbY2hhcl07CiAgICAgICAgcmVzdWx0ICs9ICFlc2NhcGVTZXEgJiYgaXNQcmludGFibGUoY2hhcikgPyBzdHJpbmczW2kxMF0gOiBlc2NhcGVTZXEgfHwgZW5jb2RlSGV4KGNoYXIpOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBfX25hbWUoZXNjYXBlU3RyaW5nLCAiZXNjYXBlU3RyaW5nIik7CiAgICBmdW5jdGlvbiB3cml0ZUZsb3dTZXF1ZW5jZShzdGF0ZSwgbGV2ZWwsIG9iamVjdCkgewogICAgICB2YXIgX3Jlc3VsdCA9ICIiLCBfdGFnID0gc3RhdGUudGFnLCBpbmRleDIsIGxlbmd0aDsKICAgICAgZm9yIChpbmRleDIgPSAwLCBsZW5ndGggPSBvYmplY3QubGVuZ3RoOyBpbmRleDIgPCBsZW5ndGg7IGluZGV4MiArPSAxKSB7CiAgICAgICAgaWYgKHdyaXRlTm9kZShzdGF0ZSwgbGV2ZWwsIG9iamVjdFtpbmRleDJdLCBmYWxzZSwgZmFsc2UpKSB7CiAgICAgICAgICBpZiAoaW5kZXgyICE9PSAwKSBfcmVzdWx0ICs9ICIsIiArICghc3RhdGUuY29uZGVuc2VGbG93ID8gIiAiIDogIiIpOwogICAgICAgICAgX3Jlc3VsdCArPSBzdGF0ZS5kdW1wOwogICAgICAgIH0KICAgICAgfQogICAgICBzdGF0ZS50YWcgPSBfdGFnOwogICAgICBzdGF0ZS5kdW1wID0gIlsiICsgX3Jlc3VsdCArICJdIjsKICAgIH0KICAgIF9fbmFtZSh3cml0ZUZsb3dTZXF1ZW5jZSwgIndyaXRlRmxvd1NlcXVlbmNlIik7CiAgICBmdW5jdGlvbiB3cml0ZUJsb2NrU2VxdWVuY2Uoc3RhdGUsIGxldmVsLCBvYmplY3QsIGNvbXBhY3QpIHsKICAgICAgdmFyIF9yZXN1bHQgPSAiIiwgX3RhZyA9IHN0YXRlLnRhZywgaW5kZXgyLCBsZW5ndGg7CiAgICAgIGZvciAoaW5kZXgyID0gMCwgbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aDsgaW5kZXgyIDwgbGVuZ3RoOyBpbmRleDIgKz0gMSkgewogICAgICAgIGlmICh3cml0ZU5vZGUoc3RhdGUsIGxldmVsICsgMSwgb2JqZWN0W2luZGV4Ml0sIHRydWUsIHRydWUpKSB7CiAgICAgICAgICBpZiAoIWNvbXBhY3QgfHwgaW5kZXgyICE9PSAwKSB7CiAgICAgICAgICAgIF9yZXN1bHQgKz0gZ2VuZXJhdGVOZXh0TGluZShzdGF0ZSwgbGV2ZWwpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHN0YXRlLmR1bXAgJiYgQ0hBUl9MSU5FX0ZFRUQgPT09IHN0YXRlLmR1bXAuY2hhckNvZGVBdCgwKSkgewogICAgICAgICAgICBfcmVzdWx0ICs9ICItIjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIF9yZXN1bHQgKz0gIi0gIjsKICAgICAgICAgIH0KICAgICAgICAgIF9yZXN1bHQgKz0gc3RhdGUuZHVtcDsKICAgICAgICB9CiAgICAgIH0KICAgICAgc3RhdGUudGFnID0gX3RhZzsKICAgICAgc3RhdGUuZHVtcCA9IF9yZXN1bHQgfHwgIltdIjsKICAgIH0KICAgIF9fbmFtZSh3cml0ZUJsb2NrU2VxdWVuY2UsICJ3cml0ZUJsb2NrU2VxdWVuY2UiKTsKICAgIGZ1bmN0aW9uIHdyaXRlRmxvd01hcHBpbmcoc3RhdGUsIGxldmVsLCBvYmplY3QpIHsKICAgICAgdmFyIF9yZXN1bHQgPSAiIiwgX3RhZyA9IHN0YXRlLnRhZywgb2JqZWN0S2V5TGlzdCA9IE9iamVjdC5rZXlzKG9iamVjdCksIGluZGV4MiwgbGVuZ3RoLCBvYmplY3RLZXksIG9iamVjdFZhbHVlLCBwYWlyQnVmZmVyOwogICAgICBmb3IgKGluZGV4MiA9IDAsIGxlbmd0aCA9IG9iamVjdEtleUxpc3QubGVuZ3RoOyBpbmRleDIgPCBsZW5ndGg7IGluZGV4MiArPSAxKSB7CiAgICAgICAgcGFpckJ1ZmZlciA9ICIiOwogICAgICAgIGlmIChpbmRleDIgIT09IDApIHBhaXJCdWZmZXIgKz0gIiwgIjsKICAgICAgICBpZiAoc3RhdGUuY29uZGVuc2VGbG93KSBwYWlyQnVmZmVyICs9ICciJzsKICAgICAgICBvYmplY3RLZXkgPSBvYmplY3RLZXlMaXN0W2luZGV4Ml07CiAgICAgICAgb2JqZWN0VmFsdWUgPSBvYmplY3Rbb2JqZWN0S2V5XTsKICAgICAgICBpZiAoIXdyaXRlTm9kZShzdGF0ZSwgbGV2ZWwsIG9iamVjdEtleSwgZmFsc2UsIGZhbHNlKSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmIChzdGF0ZS5kdW1wLmxlbmd0aCA+IDEwMjQpIHBhaXJCdWZmZXIgKz0gIj8gIjsKICAgICAgICBwYWlyQnVmZmVyICs9IHN0YXRlLmR1bXAgKyAoc3RhdGUuY29uZGVuc2VGbG93ID8gJyInIDogIiIpICsgIjoiICsgKHN0YXRlLmNvbmRlbnNlRmxvdyA/ICIiIDogIiAiKTsKICAgICAgICBpZiAoIXdyaXRlTm9kZShzdGF0ZSwgbGV2ZWwsIG9iamVjdFZhbHVlLCBmYWxzZSwgZmFsc2UpKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgcGFpckJ1ZmZlciArPSBzdGF0ZS5kdW1wOwogICAgICAgIF9yZXN1bHQgKz0gcGFpckJ1ZmZlcjsKICAgICAgfQogICAgICBzdGF0ZS50YWcgPSBfdGFnOwogICAgICBzdGF0ZS5kdW1wID0gInsiICsgX3Jlc3VsdCArICJ9IjsKICAgIH0KICAgIF9fbmFtZSh3cml0ZUZsb3dNYXBwaW5nLCAid3JpdGVGbG93TWFwcGluZyIpOwogICAgZnVuY3Rpb24gd3JpdGVCbG9ja01hcHBpbmcoc3RhdGUsIGxldmVsLCBvYmplY3QsIGNvbXBhY3QpIHsKICAgICAgdmFyIF9yZXN1bHQgPSAiIiwgX3RhZyA9IHN0YXRlLnRhZywgb2JqZWN0S2V5TGlzdCA9IE9iamVjdC5rZXlzKG9iamVjdCksIGluZGV4MiwgbGVuZ3RoLCBvYmplY3RLZXksIG9iamVjdFZhbHVlLCBleHBsaWNpdFBhaXIsIHBhaXJCdWZmZXI7CiAgICAgIGlmIChzdGF0ZS5zb3J0S2V5cyA9PT0gdHJ1ZSkgewogICAgICAgIG9iamVjdEtleUxpc3Quc29ydCgpOwogICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzdGF0ZS5zb3J0S2V5cyA9PT0gImZ1bmN0aW9uIikgewogICAgICAgIG9iamVjdEtleUxpc3Quc29ydChzdGF0ZS5zb3J0S2V5cyk7CiAgICAgIH0gZWxzZSBpZiAoc3RhdGUuc29ydEtleXMpIHsKICAgICAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbigic29ydEtleXMgbXVzdCBiZSBhIGJvb2xlYW4gb3IgYSBmdW5jdGlvbiIpOwogICAgICB9CiAgICAgIGZvciAoaW5kZXgyID0gMCwgbGVuZ3RoID0gb2JqZWN0S2V5TGlzdC5sZW5ndGg7IGluZGV4MiA8IGxlbmd0aDsgaW5kZXgyICs9IDEpIHsKICAgICAgICBwYWlyQnVmZmVyID0gIiI7CiAgICAgICAgaWYgKCFjb21wYWN0IHx8IGluZGV4MiAhPT0gMCkgewogICAgICAgICAgcGFpckJ1ZmZlciArPSBnZW5lcmF0ZU5leHRMaW5lKHN0YXRlLCBsZXZlbCk7CiAgICAgICAgfQogICAgICAgIG9iamVjdEtleSA9IG9iamVjdEtleUxpc3RbaW5kZXgyXTsKICAgICAgICBvYmplY3RWYWx1ZSA9IG9iamVjdFtvYmplY3RLZXldOwogICAgICAgIGlmICghd3JpdGVOb2RlKHN0YXRlLCBsZXZlbCArIDEsIG9iamVjdEtleSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSkpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBleHBsaWNpdFBhaXIgPSBzdGF0ZS50YWcgIT09IG51bGwgJiYgc3RhdGUudGFnICE9PSAiPyIgfHwgc3RhdGUuZHVtcCAmJiBzdGF0ZS5kdW1wLmxlbmd0aCA+IDEwMjQ7CiAgICAgICAgaWYgKGV4cGxpY2l0UGFpcikgewogICAgICAgICAgaWYgKHN0YXRlLmR1bXAgJiYgQ0hBUl9MSU5FX0ZFRUQgPT09IHN0YXRlLmR1bXAuY2hhckNvZGVBdCgwKSkgewogICAgICAgICAgICBwYWlyQnVmZmVyICs9ICI/IjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHBhaXJCdWZmZXIgKz0gIj8gIjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcGFpckJ1ZmZlciArPSBzdGF0ZS5kdW1wOwogICAgICAgIGlmIChleHBsaWNpdFBhaXIpIHsKICAgICAgICAgIHBhaXJCdWZmZXIgKz0gZ2VuZXJhdGVOZXh0TGluZShzdGF0ZSwgbGV2ZWwpOwogICAgICAgIH0KICAgICAgICBpZiAoIXdyaXRlTm9kZShzdGF0ZSwgbGV2ZWwgKyAxLCBvYmplY3RWYWx1ZSwgdHJ1ZSwgZXhwbGljaXRQYWlyKSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmIChzdGF0ZS5kdW1wICYmIENIQVJfTElORV9GRUVEID09PSBzdGF0ZS5kdW1wLmNoYXJDb2RlQXQoMCkpIHsKICAgICAgICAgIHBhaXJCdWZmZXIgKz0gIjoiOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwYWlyQnVmZmVyICs9ICI6ICI7CiAgICAgICAgfQogICAgICAgIHBhaXJCdWZmZXIgKz0gc3RhdGUuZHVtcDsKICAgICAgICBfcmVzdWx0ICs9IHBhaXJCdWZmZXI7CiAgICAgIH0KICAgICAgc3RhdGUudGFnID0gX3RhZzsKICAgICAgc3RhdGUuZHVtcCA9IF9yZXN1bHQgfHwgInt9IjsKICAgIH0KICAgIF9fbmFtZSh3cml0ZUJsb2NrTWFwcGluZywgIndyaXRlQmxvY2tNYXBwaW5nIik7CiAgICBmdW5jdGlvbiBkZXRlY3RUeXBlKHN0YXRlLCBvYmplY3QsIGV4cGxpY2l0KSB7CiAgICAgIHZhciBfcmVzdWx0LCB0eXBlTGlzdCwgaW5kZXgyLCBsZW5ndGgsIHR5cGU1LCBzdHlsZTsKICAgICAgdHlwZUxpc3QgPSBleHBsaWNpdCA/IHN0YXRlLmV4cGxpY2l0VHlwZXMgOiBzdGF0ZS5pbXBsaWNpdFR5cGVzOwogICAgICBmb3IgKGluZGV4MiA9IDAsIGxlbmd0aCA9IHR5cGVMaXN0Lmxlbmd0aDsgaW5kZXgyIDwgbGVuZ3RoOyBpbmRleDIgKz0gMSkgewogICAgICAgIHR5cGU1ID0gdHlwZUxpc3RbaW5kZXgyXTsKICAgICAgICBpZiAoKHR5cGU1Lmluc3RhbmNlT2YgfHwgdHlwZTUucHJlZGljYXRlKSAmJiAoIXR5cGU1Lmluc3RhbmNlT2YgfHwgdHlwZW9mIG9iamVjdCA9PT0gIm9iamVjdCIgJiYgb2JqZWN0IGluc3RhbmNlb2YgdHlwZTUuaW5zdGFuY2VPZikgJiYgKCF0eXBlNS5wcmVkaWNhdGUgfHwgdHlwZTUucHJlZGljYXRlKG9iamVjdCkpKSB7CiAgICAgICAgICBzdGF0ZS50YWcgPSBleHBsaWNpdCA/IHR5cGU1LnRhZyA6ICI/IjsKICAgICAgICAgIGlmICh0eXBlNS5yZXByZXNlbnQpIHsKICAgICAgICAgICAgc3R5bGUgPSBzdGF0ZS5zdHlsZU1hcFt0eXBlNS50YWddIHx8IHR5cGU1LmRlZmF1bHRTdHlsZTsKICAgICAgICAgICAgaWYgKF90b1N0cmluZy5jYWxsKHR5cGU1LnJlcHJlc2VudCkgPT09ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsKICAgICAgICAgICAgICBfcmVzdWx0ID0gdHlwZTUucmVwcmVzZW50KG9iamVjdCwgc3R5bGUpOwogICAgICAgICAgICB9IGVsc2UgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKHR5cGU1LnJlcHJlc2VudCwgc3R5bGUpKSB7CiAgICAgICAgICAgICAgX3Jlc3VsdCA9IHR5cGU1LnJlcHJlc2VudFtzdHlsZV0ob2JqZWN0LCBzdHlsZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oIiE8IiArIHR5cGU1LnRhZyArICc+IHRhZyByZXNvbHZlciBhY2NlcHRzIG5vdCAiJyArIHN0eWxlICsgJyIgc3R5bGUnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdGF0ZS5kdW1wID0gX3Jlc3VsdDsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBfX25hbWUoZGV0ZWN0VHlwZSwgImRldGVjdFR5cGUiKTsKICAgIGZ1bmN0aW9uIHdyaXRlTm9kZShzdGF0ZSwgbGV2ZWwsIG9iamVjdCwgYmxvY2ssIGNvbXBhY3QsIGlza2V5KSB7CiAgICAgIHN0YXRlLnRhZyA9IG51bGw7CiAgICAgIHN0YXRlLmR1bXAgPSBvYmplY3Q7CiAgICAgIGlmICghZGV0ZWN0VHlwZShzdGF0ZSwgb2JqZWN0LCBmYWxzZSkpIHsKICAgICAgICBkZXRlY3RUeXBlKHN0YXRlLCBvYmplY3QsIHRydWUpOwogICAgICB9CiAgICAgIHZhciB0eXBlNSA9IF90b1N0cmluZy5jYWxsKHN0YXRlLmR1bXApOwogICAgICBpZiAoYmxvY2spIHsKICAgICAgICBibG9jayA9IHN0YXRlLmZsb3dMZXZlbCA8IDAgfHwgc3RhdGUuZmxvd0xldmVsID4gbGV2ZWw7CiAgICAgIH0KICAgICAgdmFyIG9iamVjdE9yQXJyYXkgPSB0eXBlNSA9PT0gIltvYmplY3QgT2JqZWN0XSIgfHwgdHlwZTUgPT09ICJbb2JqZWN0IEFycmF5XSIsIGR1cGxpY2F0ZUluZGV4LCBkdXBsaWNhdGU7CiAgICAgIGlmIChvYmplY3RPckFycmF5KSB7CiAgICAgICAgZHVwbGljYXRlSW5kZXggPSBzdGF0ZS5kdXBsaWNhdGVzLmluZGV4T2Yob2JqZWN0KTsKICAgICAgICBkdXBsaWNhdGUgPSBkdXBsaWNhdGVJbmRleCAhPT0gLTE7CiAgICAgIH0KICAgICAgaWYgKHN0YXRlLnRhZyAhPT0gbnVsbCAmJiBzdGF0ZS50YWcgIT09ICI/IiB8fCBkdXBsaWNhdGUgfHwgc3RhdGUuaW5kZW50ICE9PSAyICYmIGxldmVsID4gMCkgewogICAgICAgIGNvbXBhY3QgPSBmYWxzZTsKICAgICAgfQogICAgICBpZiAoZHVwbGljYXRlICYmIHN0YXRlLnVzZWREdXBsaWNhdGVzW2R1cGxpY2F0ZUluZGV4XSkgewogICAgICAgIHN0YXRlLmR1bXAgPSAiKnJlZl8iICsgZHVwbGljYXRlSW5kZXg7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKG9iamVjdE9yQXJyYXkgJiYgZHVwbGljYXRlICYmICFzdGF0ZS51c2VkRHVwbGljYXRlc1tkdXBsaWNhdGVJbmRleF0pIHsKICAgICAgICAgIHN0YXRlLnVzZWREdXBsaWNhdGVzW2R1cGxpY2F0ZUluZGV4XSA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlNSA9PT0gIltvYmplY3QgT2JqZWN0XSIpIHsKICAgICAgICAgIGlmIChibG9jayAmJiBPYmplY3Qua2V5cyhzdGF0ZS5kdW1wKS5sZW5ndGggIT09IDApIHsKICAgICAgICAgICAgd3JpdGVCbG9ja01hcHBpbmcoc3RhdGUsIGxldmVsLCBzdGF0ZS5kdW1wLCBjb21wYWN0KTsKICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZSkgewogICAgICAgICAgICAgIHN0YXRlLmR1bXAgPSAiJnJlZl8iICsgZHVwbGljYXRlSW5kZXggKyBzdGF0ZS5kdW1wOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3cml0ZUZsb3dNYXBwaW5nKHN0YXRlLCBsZXZlbCwgc3RhdGUuZHVtcCk7CiAgICAgICAgICAgIGlmIChkdXBsaWNhdGUpIHsKICAgICAgICAgICAgICBzdGF0ZS5kdW1wID0gIiZyZWZfIiArIGR1cGxpY2F0ZUluZGV4ICsgIiAiICsgc3RhdGUuZHVtcDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodHlwZTUgPT09ICJbb2JqZWN0IEFycmF5XSIpIHsKICAgICAgICAgIHZhciBhcnJheUxldmVsID0gc3RhdGUubm9BcnJheUluZGVudCAmJiBsZXZlbCA+IDAgPyBsZXZlbCAtIDEgOiBsZXZlbDsKICAgICAgICAgIGlmIChibG9jayAmJiBzdGF0ZS5kdW1wLmxlbmd0aCAhPT0gMCkgewogICAgICAgICAgICB3cml0ZUJsb2NrU2VxdWVuY2Uoc3RhdGUsIGFycmF5TGV2ZWwsIHN0YXRlLmR1bXAsIGNvbXBhY3QpOwogICAgICAgICAgICBpZiAoZHVwbGljYXRlKSB7CiAgICAgICAgICAgICAgc3RhdGUuZHVtcCA9ICImcmVmXyIgKyBkdXBsaWNhdGVJbmRleCArIHN0YXRlLmR1bXA7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHdyaXRlRmxvd1NlcXVlbmNlKHN0YXRlLCBhcnJheUxldmVsLCBzdGF0ZS5kdW1wKTsKICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZSkgewogICAgICAgICAgICAgIHN0YXRlLmR1bXAgPSAiJnJlZl8iICsgZHVwbGljYXRlSW5kZXggKyAiICIgKyBzdGF0ZS5kdW1wOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0eXBlNSA9PT0gIltvYmplY3QgU3RyaW5nXSIpIHsKICAgICAgICAgIGlmIChzdGF0ZS50YWcgIT09ICI/IikgewogICAgICAgICAgICB3cml0ZVNjYWxhcihzdGF0ZSwgc3RhdGUuZHVtcCwgbGV2ZWwsIGlza2V5KTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKHN0YXRlLnNraXBJbnZhbGlkKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbigidW5hY2NlcHRhYmxlIGtpbmQgb2YgYW4gb2JqZWN0IHRvIGR1bXAgIiArIHR5cGU1KTsKICAgICAgICB9CiAgICAgICAgaWYgKHN0YXRlLnRhZyAhPT0gbnVsbCAmJiBzdGF0ZS50YWcgIT09ICI/IikgewogICAgICAgICAgc3RhdGUuZHVtcCA9ICIhPCIgKyBzdGF0ZS50YWcgKyAiPiAiICsgc3RhdGUuZHVtcDsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBfX25hbWUod3JpdGVOb2RlLCAid3JpdGVOb2RlIik7CiAgICBmdW5jdGlvbiBnZXREdXBsaWNhdGVSZWZlcmVuY2VzKG9iamVjdCwgc3RhdGUpIHsKICAgICAgdmFyIG9iamVjdHMgPSBbXSwgZHVwbGljYXRlc0luZGV4ZXMgPSBbXSwgaW5kZXgyLCBsZW5ndGg7CiAgICAgIGluc3BlY3ROb2RlKG9iamVjdCwgb2JqZWN0cywgZHVwbGljYXRlc0luZGV4ZXMpOwogICAgICBmb3IgKGluZGV4MiA9IDAsIGxlbmd0aCA9IGR1cGxpY2F0ZXNJbmRleGVzLmxlbmd0aDsgaW5kZXgyIDwgbGVuZ3RoOyBpbmRleDIgKz0gMSkgewogICAgICAgIHN0YXRlLmR1cGxpY2F0ZXMucHVzaChvYmplY3RzW2R1cGxpY2F0ZXNJbmRleGVzW2luZGV4Ml1dKTsKICAgICAgfQogICAgICBzdGF0ZS51c2VkRHVwbGljYXRlcyA9IG5ldyBBcnJheShsZW5ndGgpOwogICAgfQogICAgX19uYW1lKGdldER1cGxpY2F0ZVJlZmVyZW5jZXMsICJnZXREdXBsaWNhdGVSZWZlcmVuY2VzIik7CiAgICBmdW5jdGlvbiBpbnNwZWN0Tm9kZShvYmplY3QsIG9iamVjdHMsIGR1cGxpY2F0ZXNJbmRleGVzKSB7CiAgICAgIHZhciBvYmplY3RLZXlMaXN0LCBpbmRleDIsIGxlbmd0aDsKICAgICAgaWYgKG9iamVjdCAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqZWN0ID09PSAib2JqZWN0IikgewogICAgICAgIGluZGV4MiA9IG9iamVjdHMuaW5kZXhPZihvYmplY3QpOwogICAgICAgIGlmIChpbmRleDIgIT09IC0xKSB7CiAgICAgICAgICBpZiAoZHVwbGljYXRlc0luZGV4ZXMuaW5kZXhPZihpbmRleDIpID09PSAtMSkgewogICAgICAgICAgICBkdXBsaWNhdGVzSW5kZXhlcy5wdXNoKGluZGV4Mik7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG9iamVjdHMucHVzaChvYmplY3QpOwogICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0KSkgewogICAgICAgICAgICBmb3IgKGluZGV4MiA9IDAsIGxlbmd0aCA9IG9iamVjdC5sZW5ndGg7IGluZGV4MiA8IGxlbmd0aDsgaW5kZXgyICs9IDEpIHsKICAgICAgICAgICAgICBpbnNwZWN0Tm9kZShvYmplY3RbaW5kZXgyXSwgb2JqZWN0cywgZHVwbGljYXRlc0luZGV4ZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBvYmplY3RLZXlMaXN0ID0gT2JqZWN0LmtleXMob2JqZWN0KTsKICAgICAgICAgICAgZm9yIChpbmRleDIgPSAwLCBsZW5ndGggPSBvYmplY3RLZXlMaXN0Lmxlbmd0aDsgaW5kZXgyIDwgbGVuZ3RoOyBpbmRleDIgKz0gMSkgewogICAgICAgICAgICAgIGluc3BlY3ROb2RlKG9iamVjdFtvYmplY3RLZXlMaXN0W2luZGV4Ml1dLCBvYmplY3RzLCBkdXBsaWNhdGVzSW5kZXhlcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIF9fbmFtZShpbnNwZWN0Tm9kZSwgImluc3BlY3ROb2RlIik7CiAgICBmdW5jdGlvbiBkdW1wKGlucHV0LCBvcHRpb25zKSB7CiAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgICB2YXIgc3RhdGUgPSBuZXcgU3RhdGUob3B0aW9ucyk7CiAgICAgIGlmICghc3RhdGUubm9SZWZzKSBnZXREdXBsaWNhdGVSZWZlcmVuY2VzKGlucHV0LCBzdGF0ZSk7CiAgICAgIGlmICh3cml0ZU5vZGUoc3RhdGUsIDAsIGlucHV0LCB0cnVlLCB0cnVlKSkgcmV0dXJuIHN0YXRlLmR1bXAgKyAiXG4iOwogICAgICByZXR1cm4gIiI7CiAgICB9CiAgICBfX25hbWUoZHVtcCwgImR1bXAiKTsKICAgIGZ1bmN0aW9uIHNhZmVEdW1wKGlucHV0LCBvcHRpb25zKSB7CiAgICAgIHJldHVybiBkdW1wKGlucHV0LCBjb21tb24uZXh0ZW5kKHsgc2NoZW1hOiBERUZBVUxUX1NBRkVfU0NIRU1BIH0sIG9wdGlvbnMpKTsKICAgIH0KICAgIF9fbmFtZShzYWZlRHVtcCwgInNhZmVEdW1wIik7CiAgICBtb2R1bGUuZXhwb3J0cy5kdW1wID0gZHVtcDsKICAgIG1vZHVsZS5leHBvcnRzLnNhZmVEdW1wID0gc2FmZUR1bXA7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC5qcwp2YXIgcmVxdWlyZV9qc195YW1sID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgbG9hZGVyID0gcmVxdWlyZV9sb2FkZXIoKTsKICAgIHZhciBkdW1wZXIgPSByZXF1aXJlX2R1bXBlcigpOwogICAgZnVuY3Rpb24gZGVwcmVjYXRlZChuYW1lKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkZ1bmN0aW9uICIgKyBuYW1lICsgIiBpcyBkZXByZWNhdGVkIGFuZCBjYW5ub3QgYmUgdXNlZC4iKTsKICAgICAgfTsKICAgIH0KICAgIF9fbmFtZShkZXByZWNhdGVkLCAiZGVwcmVjYXRlZCIpOwogICAgbW9kdWxlLmV4cG9ydHMuVHlwZSA9IHJlcXVpcmVfdHlwZSgpOwogICAgbW9kdWxlLmV4cG9ydHMuU2NoZW1hID0gcmVxdWlyZV9zY2hlbWEoKTsKICAgIG1vZHVsZS5leHBvcnRzLkZBSUxTQUZFX1NDSEVNQSA9IHJlcXVpcmVfZmFpbHNhZmUoKTsKICAgIG1vZHVsZS5leHBvcnRzLkpTT05fU0NIRU1BID0gcmVxdWlyZV9qc29uKCk7CiAgICBtb2R1bGUuZXhwb3J0cy5DT1JFX1NDSEVNQSA9IHJlcXVpcmVfY29yZSgpOwogICAgbW9kdWxlLmV4cG9ydHMuREVGQVVMVF9TQUZFX1NDSEVNQSA9IHJlcXVpcmVfZGVmYXVsdF9zYWZlKCk7CiAgICBtb2R1bGUuZXhwb3J0cy5ERUZBVUxUX0ZVTExfU0NIRU1BID0gcmVxdWlyZV9kZWZhdWx0X2Z1bGwoKTsKICAgIG1vZHVsZS5leHBvcnRzLmxvYWQgPSBsb2FkZXIubG9hZDsKICAgIG1vZHVsZS5leHBvcnRzLmxvYWRBbGwgPSBsb2FkZXIubG9hZEFsbDsKICAgIG1vZHVsZS5leHBvcnRzLnNhZmVMb2FkID0gbG9hZGVyLnNhZmVMb2FkOwogICAgbW9kdWxlLmV4cG9ydHMuc2FmZUxvYWRBbGwgPSBsb2FkZXIuc2FmZUxvYWRBbGw7CiAgICBtb2R1bGUuZXhwb3J0cy5kdW1wID0gZHVtcGVyLmR1bXA7CiAgICBtb2R1bGUuZXhwb3J0cy5zYWZlRHVtcCA9IGR1bXBlci5zYWZlRHVtcDsKICAgIG1vZHVsZS5leHBvcnRzLllBTUxFeGNlcHRpb24gPSByZXF1aXJlX2V4Y2VwdGlvbigpOwogICAgbW9kdWxlLmV4cG9ydHMuTUlOSU1BTF9TQ0hFTUEgPSByZXF1aXJlX2ZhaWxzYWZlKCk7CiAgICBtb2R1bGUuZXhwb3J0cy5TQUZFX1NDSEVNQSA9IHJlcXVpcmVfZGVmYXVsdF9zYWZlKCk7CiAgICBtb2R1bGUuZXhwb3J0cy5ERUZBVUxUX1NDSEVNQSA9IHJlcXVpcmVfZGVmYXVsdF9mdWxsKCk7CiAgICBtb2R1bGUuZXhwb3J0cy5zY2FuID0gZGVwcmVjYXRlZCgic2NhbiIpOwogICAgbW9kdWxlLmV4cG9ydHMucGFyc2UgPSBkZXByZWNhdGVkKCJwYXJzZSIpOwogICAgbW9kdWxlLmV4cG9ydHMuY29tcG9zZSA9IGRlcHJlY2F0ZWQoImNvbXBvc2UiKTsKICAgIG1vZHVsZS5leHBvcnRzLmFkZENvbnN0cnVjdG9yID0gZGVwcmVjYXRlZCgiYWRkQ29uc3RydWN0b3IiKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2luZGV4LmpzCnZhciByZXF1aXJlX2pzX3lhbWwyID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9pbmRleC5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgeWFtbCA9IHJlcXVpcmVfanNfeWFtbCgpOwogICAgbW9kdWxlLmV4cG9ydHMgPSB5YW1sOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR5YW1sQDIuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHlhbWwvZGlzdF90cy9zbWFydHlhbWwucGx1Z2lucy5qcwp2YXIgcmVxdWlyZV9zbWFydHlhbWxfcGx1Z2lucyA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR5YW1sQDIuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHlhbWwvZGlzdF90cy9zbWFydHlhbWwucGx1Z2lucy5qcyIoZXhwb3J0cykgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIF9fY3JlYXRlQmluZGluZzIgPSBleHBvcnRzICYmIGV4cG9ydHMuX19jcmVhdGVCaW5kaW5nIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8xMiwgbTUsIGszLCBrMjIpIHsKICAgICAgaWYgKGsyMiA9PT0gdm9pZCAwKSBrMjIgPSBrMzsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8xMiwgazIyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gbTVbazNdOwogICAgICB9LCAiZ2V0IikgfSk7CiAgICB9KSA6IChmdW5jdGlvbihvMTIsIG01LCBrMywgazIyKSB7CiAgICAgIGlmIChrMjIgPT09IHZvaWQgMCkgazIyID0gazM7CiAgICAgIG8xMltrMjJdID0gbTVbazNdOwogICAgfSkpOwogICAgdmFyIF9fc2V0TW9kdWxlRGVmYXVsdDIgPSBleHBvcnRzICYmIGV4cG9ydHMuX19zZXRNb2R1bGVEZWZhdWx0IHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8xMiwgdjQpIHsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8xMiwgImRlZmF1bHQiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2NCB9KTsKICAgIH0pIDogZnVuY3Rpb24obzEyLCB2NCkgewogICAgICBvMTJbImRlZmF1bHQiXSA9IHY0OwogICAgfSk7CiAgICB2YXIgX19pbXBvcnRTdGFyMiA9IGV4cG9ydHMgJiYgZXhwb3J0cy5fX2ltcG9ydFN0YXIgfHwgZnVuY3Rpb24obW9kKSB7CiAgICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7CiAgICAgIHZhciByZXN1bHQgPSB7fTsKICAgICAgaWYgKG1vZCAhPSBudWxsKSB7CiAgICAgICAgZm9yICh2YXIgazMgaW4gbW9kKSBpZiAoazMgIT09ICJkZWZhdWx0IiAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGszKSkgX19jcmVhdGVCaW5kaW5nMihyZXN1bHQsIG1vZCwgazMpOwogICAgICB9CiAgICAgIF9fc2V0TW9kdWxlRGVmYXVsdDIocmVzdWx0LCBtb2QpOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzLmpzWWFtbCA9IHZvaWQgMDsKICAgIHZhciBqc1lhbWwgPSBfX2ltcG9ydFN0YXIyKHJlcXVpcmVfanNfeWFtbDIoKSk7CiAgICBleHBvcnRzLmpzWWFtbCA9IGpzWWFtbDsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0eWFtbEAyLjAuNS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnR5YW1sL2Rpc3RfdHMvaW5kZXguanMKdmFyIHJlcXVpcmVfZGlzdF90czIgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0eWFtbEAyLjAuNS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnR5YW1sL2Rpc3RfdHMvaW5kZXguanMiKGV4cG9ydHMpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBfX2NyZWF0ZUJpbmRpbmcyID0gZXhwb3J0cyAmJiBleHBvcnRzLl9fY3JlYXRlQmluZGluZyB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvMTIsIG01LCBrMywgazIyKSB7CiAgICAgIGlmIChrMjIgPT09IHZvaWQgMCkgazIyID0gazM7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvMTIsIGsyMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIG01W2szXTsKICAgICAgfSwgImdldCIpIH0pOwogICAgfSkgOiAoZnVuY3Rpb24obzEyLCBtNSwgazMsIGsyMikgewogICAgICBpZiAoazIyID09PSB2b2lkIDApIGsyMiA9IGszOwogICAgICBvMTJbazIyXSA9IG01W2szXTsKICAgIH0pKTsKICAgIHZhciBfX3NldE1vZHVsZURlZmF1bHQyID0gZXhwb3J0cyAmJiBleHBvcnRzLl9fc2V0TW9kdWxlRGVmYXVsdCB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvMTIsIHY0KSB7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvMTIsICJkZWZhdWx0IiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdjQgfSk7CiAgICB9KSA6IGZ1bmN0aW9uKG8xMiwgdjQpIHsKICAgICAgbzEyWyJkZWZhdWx0Il0gPSB2NDsKICAgIH0pOwogICAgdmFyIF9faW1wb3J0U3RhcjIgPSBleHBvcnRzICYmIGV4cG9ydHMuX19pbXBvcnRTdGFyIHx8IGZ1bmN0aW9uKG1vZCkgewogICAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kOwogICAgICB2YXIgcmVzdWx0ID0ge307CiAgICAgIGlmIChtb2QgIT0gbnVsbCkgewogICAgICAgIGZvciAodmFyIGszIGluIG1vZCkgaWYgKGszICE9PSAiZGVmYXVsdCIgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrMykpIF9fY3JlYXRlQmluZGluZzIocmVzdWx0LCBtb2QsIGszKTsKICAgICAgfQogICAgICBfX3NldE1vZHVsZURlZmF1bHQyKHJlc3VsdCwgbW9kKTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH07CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0cy5vYmplY3RUb1lhbWxTdHJpbmcgPSBleHBvcnRzLnlhbWxTdHJpbmdUb09iamVjdCA9IHZvaWQgMDsKICAgIHZhciBwbHVnaW5zID0gX19pbXBvcnRTdGFyMihyZXF1aXJlX3NtYXJ0eWFtbF9wbHVnaW5zKCkpOwogICAgZXhwb3J0cy55YW1sU3RyaW5nVG9PYmplY3QgPSBhc3luYyAoeWFtbFN0cmluZ0FyZywgb3B0aW9uc0FyZyA9IHt9KSA9PiB7CiAgICAgIHJldHVybiBwbHVnaW5zLmpzWWFtbC5zYWZlTG9hZCh5YW1sU3RyaW5nQXJnKTsKICAgIH07CiAgICBleHBvcnRzLm9iamVjdFRvWWFtbFN0cmluZyA9IGFzeW5jIChvYmplY3RBcmcsIG9wdGlvbnNBcmcgPSB7fSkgPT4gewogICAgICByZXR1cm4gcGx1Z2lucy5qc1lhbWwuc2FmZUR1bXAob2JqZWN0QXJnKTsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9leHRlbmRAMy4wLjIvbm9kZV9tb2R1bGVzL2V4dGVuZC9pbmRleC5qcwp2YXIgcmVxdWlyZV9leHRlbmQgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2V4dGVuZEAzLjAuMi9ub2RlX21vZHVsZXMvZXh0ZW5kL2luZGV4LmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5OwogICAgdmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsKICAgIHZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsKICAgIHZhciBnT1BEID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsKICAgIHZhciBpc0FycmF5NSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gaXNBcnJheTYoYXJyKSB7CiAgICAgIGlmICh0eXBlb2YgQXJyYXkuaXNBcnJheSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGFycik7CiAgICAgIH0KICAgICAgcmV0dXJuIHRvU3RyLmNhbGwoYXJyKSA9PT0gIltvYmplY3QgQXJyYXldIjsKICAgIH0sICJpc0FycmF5Iik7CiAgICB2YXIgaXNQbGFpbk9iamVjdDIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uIGlzUGxhaW5PYmplY3QzKG9iaikgewogICAgICBpZiAoIW9iaiB8fCB0b1N0ci5jYWxsKG9iaikgIT09ICJbb2JqZWN0IE9iamVjdF0iKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHZhciBoYXNPd25Db25zdHJ1Y3RvciA9IGhhc093bi5jYWxsKG9iaiwgImNvbnN0cnVjdG9yIik7CiAgICAgIHZhciBoYXNJc1Byb3RvdHlwZU9mID0gb2JqLmNvbnN0cnVjdG9yICYmIG9iai5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgJiYgaGFzT3duLmNhbGwob2JqLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwgImlzUHJvdG90eXBlT2YiKTsKICAgICAgaWYgKG9iai5jb25zdHJ1Y3RvciAmJiAhaGFzT3duQ29uc3RydWN0b3IgJiYgIWhhc0lzUHJvdG90eXBlT2YpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgdmFyIGtleTI7CiAgICAgIGZvciAoa2V5MiBpbiBvYmopIHsKICAgICAgfQogICAgICByZXR1cm4gdHlwZW9mIGtleTIgPT09ICJ1bmRlZmluZWQiIHx8IGhhc093bi5jYWxsKG9iaiwga2V5Mik7CiAgICB9LCAiaXNQbGFpbk9iamVjdCIpOwogICAgdmFyIHNldFByb3BlcnR5ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbiBzZXRQcm9wZXJ0eTIodGFyZ2V0LCBvcHRpb25zKSB7CiAgICAgIGlmIChkZWZpbmVQcm9wZXJ0eSAmJiBvcHRpb25zLm5hbWUgPT09ICJfX3Byb3RvX18iKSB7CiAgICAgICAgZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBvcHRpb25zLm5hbWUsIHsKICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICB2YWx1ZTogb3B0aW9ucy5uZXdWYWx1ZSwKICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGFyZ2V0W29wdGlvbnMubmFtZV0gPSBvcHRpb25zLm5ld1ZhbHVlOwogICAgICB9CiAgICB9LCAic2V0UHJvcGVydHkiKTsKICAgIHZhciBnZXRQcm9wZXJ0eSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gZ2V0UHJvcGVydHkyKG9iaiwgbmFtZSkgewogICAgICBpZiAobmFtZSA9PT0gIl9fcHJvdG9fXyIpIHsKICAgICAgICBpZiAoIWhhc093bi5jYWxsKG9iaiwgbmFtZSkpIHsKICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgfSBlbHNlIGlmIChnT1BEKSB7CiAgICAgICAgICByZXR1cm4gZ09QRChvYmosIG5hbWUpLnZhbHVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gb2JqW25hbWVdOwogICAgfSwgImdldFByb3BlcnR5Iik7CiAgICBtb2R1bGUuZXhwb3J0cyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gZXh0ZW5kMygpIHsKICAgICAgdmFyIG9wdGlvbnMsIG5hbWUsIHNyYywgY29weSwgY29weUlzQXJyYXksIGNsb25lOwogICAgICB2YXIgdGFyZ2V0ID0gYXJndW1lbnRzWzBdOwogICAgICB2YXIgaTEwID0gMTsKICAgICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7CiAgICAgIHZhciBkZWVwID0gZmFsc2U7CiAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSAiYm9vbGVhbiIpIHsKICAgICAgICBkZWVwID0gdGFyZ2V0OwogICAgICAgIHRhcmdldCA9IGFyZ3VtZW50c1sxXSB8fCB7fTsKICAgICAgICBpMTAgPSAyOwogICAgICB9CiAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCB8fCB0eXBlb2YgdGFyZ2V0ICE9PSAib2JqZWN0IiAmJiB0eXBlb2YgdGFyZ2V0ICE9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgdGFyZ2V0ID0ge307CiAgICAgIH0KICAgICAgZm9yICg7IGkxMCA8IGxlbmd0aDsgKytpMTApIHsKICAgICAgICBvcHRpb25zID0gYXJndW1lbnRzW2kxMF07CiAgICAgICAgaWYgKG9wdGlvbnMgIT0gbnVsbCkgewogICAgICAgICAgZm9yIChuYW1lIGluIG9wdGlvbnMpIHsKICAgICAgICAgICAgc3JjID0gZ2V0UHJvcGVydHkodGFyZ2V0LCBuYW1lKTsKICAgICAgICAgICAgY29weSA9IGdldFByb3BlcnR5KG9wdGlvbnMsIG5hbWUpOwogICAgICAgICAgICBpZiAodGFyZ2V0ICE9PSBjb3B5KSB7CiAgICAgICAgICAgICAgaWYgKGRlZXAgJiYgY29weSAmJiAoaXNQbGFpbk9iamVjdDIoY29weSkgfHwgKGNvcHlJc0FycmF5ID0gaXNBcnJheTUoY29weSkpKSkgewogICAgICAgICAgICAgICAgaWYgKGNvcHlJc0FycmF5KSB7CiAgICAgICAgICAgICAgICAgIGNvcHlJc0FycmF5ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgIGNsb25lID0gc3JjICYmIGlzQXJyYXk1KHNyYykgPyBzcmMgOiBbXTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGNsb25lID0gc3JjICYmIGlzUGxhaW5PYmplY3QyKHNyYykgPyBzcmMgOiB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNldFByb3BlcnR5KHRhcmdldCwgeyBuYW1lLCBuZXdWYWx1ZTogZXh0ZW5kMyhkZWVwLCBjbG9uZSwgY29weSkgfSk7CiAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgY29weSAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgIHNldFByb3BlcnR5KHRhcmdldCwgeyBuYW1lLCBuZXdWYWx1ZTogY29weSB9KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0sICJleHRlbmQiKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2Zvcm1hdEAwLjIuMi9ub2RlX21vZHVsZXMvZm9ybWF0L2Zvcm1hdC5qcwp2YXIgcmVxdWlyZV9mb3JtYXQgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2Zvcm1hdEAwLjIuMi9ub2RlX21vZHVsZXMvZm9ybWF0L2Zvcm1hdC5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICA7CiAgICAoZnVuY3Rpb24oKSB7CiAgICAgIHZhciBuYW1lc3BhY2U7CiAgICAgIGlmICh0eXBlb2YgbW9kdWxlICE9PSAidW5kZWZpbmVkIikgewogICAgICAgIG5hbWVzcGFjZSA9IG1vZHVsZS5leHBvcnRzID0gZm9ybWF0MjsKICAgICAgfSBlbHNlIHsKICAgICAgICBuYW1lc3BhY2UgPSAoZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gdGhpcyB8fCAoMSwgZXZhbCkoInRoaXMiKTsKICAgICAgICB9KSgpOwogICAgICB9CiAgICAgIG5hbWVzcGFjZS5mb3JtYXQgPSBmb3JtYXQyOwogICAgICBuYW1lc3BhY2UudnNwcmludGYgPSB2c3ByaW50ZjsKICAgICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAidW5kZWZpbmVkIiAmJiB0eXBlb2YgY29uc29sZS5sb2cgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICBuYW1lc3BhY2UucHJpbnRmID0gcHJpbnRmOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIHByaW50ZigpIHsKICAgICAgICBjb25zb2xlLmxvZyhmb3JtYXQyLmFwcGx5KG51bGwsIGFyZ3VtZW50cykpOwogICAgICB9CiAgICAgIF9fbmFtZShwcmludGYsICJwcmludGYiKTsKICAgICAgZnVuY3Rpb24gdnNwcmludGYoZm10LCByZXBsYWNlbWVudHMpIHsKICAgICAgICByZXR1cm4gZm9ybWF0Mi5hcHBseShudWxsLCBbZm10XS5jb25jYXQocmVwbGFjZW1lbnRzKSk7CiAgICAgIH0KICAgICAgX19uYW1lKHZzcHJpbnRmLCAidnNwcmludGYiKTsKICAgICAgZnVuY3Rpb24gZm9ybWF0MihmbXQpIHsKICAgICAgICB2YXIgYXJnSW5kZXggPSAxLCBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMpLCBpMTAgPSAwLCBuMTEgPSBmbXQubGVuZ3RoLCByZXN1bHQgPSAiIiwgYzEwLCBlc2NhcGVkID0gZmFsc2UsIGFyZywgdG1wLCBsZWFkaW5nWmVybyA9IGZhbHNlLCBwcmVjaXNpb24sIG5leHRBcmcgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIGFyZ3NbYXJnSW5kZXgrK107CiAgICAgICAgfSwgIm5leHRBcmciKSwgc2x1cnBOdW1iZXIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCkgewogICAgICAgICAgdmFyIGRpZ2l0cyA9ICIiOwogICAgICAgICAgd2hpbGUgKC9cZC8udGVzdChmbXRbaTEwXSkpIHsKICAgICAgICAgICAgZGlnaXRzICs9IGZtdFtpMTArK107CiAgICAgICAgICAgIGMxMCA9IGZtdFtpMTBdOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGRpZ2l0cy5sZW5ndGggPiAwID8gcGFyc2VJbnQoZGlnaXRzKSA6IG51bGw7CiAgICAgICAgfSwgInNsdXJwTnVtYmVyIik7CiAgICAgICAgZm9yICg7IGkxMCA8IG4xMTsgKytpMTApIHsKICAgICAgICAgIGMxMCA9IGZtdFtpMTBdOwogICAgICAgICAgaWYgKGVzY2FwZWQpIHsKICAgICAgICAgICAgZXNjYXBlZCA9IGZhbHNlOwogICAgICAgICAgICBpZiAoYzEwID09ICIuIikgewogICAgICAgICAgICAgIGxlYWRpbmdaZXJvID0gZmFsc2U7CiAgICAgICAgICAgICAgYzEwID0gZm10WysraTEwXTsKICAgICAgICAgICAgfSBlbHNlIGlmIChjMTAgPT0gIjAiICYmIGZtdFtpMTAgKyAxXSA9PSAiLiIpIHsKICAgICAgICAgICAgICBsZWFkaW5nWmVybyA9IHRydWU7CiAgICAgICAgICAgICAgaTEwICs9IDI7CiAgICAgICAgICAgICAgYzEwID0gZm10W2kxMF07CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgbGVhZGluZ1plcm8gPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHByZWNpc2lvbiA9IHNsdXJwTnVtYmVyKCk7CiAgICAgICAgICAgIHN3aXRjaCAoYzEwKSB7CiAgICAgICAgICAgICAgY2FzZSAiYiI6CiAgICAgICAgICAgICAgICByZXN1bHQgKz0gcGFyc2VJbnQobmV4dEFyZygpLCAxMCkudG9TdHJpbmcoMik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlICJjIjoKICAgICAgICAgICAgICAgIGFyZyA9IG5leHRBcmcoKTsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYXJnID09PSAic3RyaW5nIiB8fCBhcmcgaW5zdGFuY2VvZiBTdHJpbmcpCiAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBhcmc7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGFyZywgMTApKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgImQiOgogICAgICAgICAgICAgICAgcmVzdWx0ICs9IHBhcnNlSW50KG5leHRBcmcoKSwgMTApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSAiZiI6CiAgICAgICAgICAgICAgICB0bXAgPSBTdHJpbmcocGFyc2VGbG9hdChuZXh0QXJnKCkpLnRvRml4ZWQocHJlY2lzaW9uIHx8IDYpKTsKICAgICAgICAgICAgICAgIHJlc3VsdCArPSBsZWFkaW5nWmVybyA/IHRtcCA6IHRtcC5yZXBsYWNlKC9eMC8sICIiKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgImoiOgogICAgICAgICAgICAgICAgcmVzdWx0ICs9IEpTT04uc3RyaW5naWZ5KG5leHRBcmcoKSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlICJvIjoKICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiMCIgKyBwYXJzZUludChuZXh0QXJnKCksIDEwKS50b1N0cmluZyg4KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgInMiOgogICAgICAgICAgICAgICAgcmVzdWx0ICs9IG5leHRBcmcoKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgIngiOgogICAgICAgICAgICAgICAgcmVzdWx0ICs9ICIweCIgKyBwYXJzZUludChuZXh0QXJnKCksIDEwKS50b1N0cmluZygxNik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlICJYIjoKICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiMHgiICsgcGFyc2VJbnQobmV4dEFyZygpLCAxMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgcmVzdWx0ICs9IGMxMDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKGMxMCA9PT0gIiUiKSB7CiAgICAgICAgICAgIGVzY2FwZWQgPSB0cnVlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVzdWx0ICs9IGMxMDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgICBfX25hbWUoZm9ybWF0MiwgImZvcm1hdCIpOwogICAgfSkoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3BhdGgtdG8tcmVnZXhwQDguMy4wL25vZGVfbW9kdWxlcy9wYXRoLXRvLXJlZ2V4cC9kaXN0L2luZGV4LmpzCnZhciByZXF1aXJlX2Rpc3QgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3BhdGgtdG8tcmVnZXhwQDguMy4wL25vZGVfbW9kdWxlcy9wYXRoLXRvLXJlZ2V4cC9kaXN0L2luZGV4LmpzIihleHBvcnRzKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0cy5QYXRoRXJyb3IgPSBleHBvcnRzLlRva2VuRGF0YSA9IHZvaWQgMDsKICAgIGV4cG9ydHMucGFyc2UgPSBwYXJzZTk7CiAgICBleHBvcnRzLmNvbXBpbGUgPSBjb21waWxlMjsKICAgIGV4cG9ydHMubWF0Y2ggPSBtYXRjaDI7CiAgICBleHBvcnRzLnBhdGhUb1JlZ2V4cCA9IHBhdGhUb1JlZ2V4cDsKICAgIGV4cG9ydHMuc3RyaW5naWZ5ID0gc3RyaW5naWZ5NzsKICAgIHZhciBERUZBVUxUX0RFTElNSVRFUiA9ICIvIjsKICAgIHZhciBOT09QX1ZBTFVFID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgodmFsdWUyKSA9PiB2YWx1ZTIsICJOT09QX1ZBTFVFIik7CiAgICB2YXIgSURfU1RBUlQgPSAvXlskX1xwe0lEX1N0YXJ0fV0kL3U7CiAgICB2YXIgSURfQ09OVElOVUUgPSAvXlskXHUyMDBjXHUyMDBkXHB7SURfQ29udGludWV9XSQvdTsKICAgIHZhciBTSU1QTEVfVE9LRU5TID0gewogICAgICAvLyBHcm91cHMuCiAgICAgICJ7IjogInsiLAogICAgICAifSI6ICJ9IiwKICAgICAgLy8gUmVzZXJ2ZWQuCiAgICAgICIoIjogIigiLAogICAgICAiKSI6ICIpIiwKICAgICAgIlsiOiAiWyIsCiAgICAgICJdIjogIl0iLAogICAgICAiKyI6ICIrIiwKICAgICAgIj8iOiAiPyIsCiAgICAgICIhIjogIiEiCiAgICB9OwogICAgZnVuY3Rpb24gZXNjYXBlVGV4dChzdHIpIHsKICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9be30oKVxbXF0rPyE6KlxcXS9nLCAiXFwkJiIpOwogICAgfQogICAgX19uYW1lKGVzY2FwZVRleHQsICJlc2NhcGVUZXh0Iik7CiAgICBmdW5jdGlvbiBlc2NhcGUoc3RyKSB7CiAgICAgIHJldHVybiBzdHIucmVwbGFjZSgvWy4rKj9eJHt9KClbXF18L1xcXS9nLCAiXFwkJiIpOwogICAgfQogICAgX19uYW1lKGVzY2FwZSwgImVzY2FwZSIpOwogICAgdmFyIFRva2VuRGF0YSA9IGNsYXNzIHsKICAgICAgc3RhdGljIHsKICAgICAgICBfX25hbWUodGhpcywgIlRva2VuRGF0YSIpOwogICAgICB9CiAgICAgIGNvbnN0cnVjdG9yKHRva2Vucywgb3JpZ2luYWxQYXRoKSB7CiAgICAgICAgdGhpcy50b2tlbnMgPSB0b2tlbnM7CiAgICAgICAgdGhpcy5vcmlnaW5hbFBhdGggPSBvcmlnaW5hbFBhdGg7CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzLlRva2VuRGF0YSA9IFRva2VuRGF0YTsKICAgIHZhciBQYXRoRXJyb3IgPSBjbGFzcyBleHRlbmRzIFR5cGVFcnJvciB7CiAgICAgIHN0YXRpYyB7CiAgICAgICAgX19uYW1lKHRoaXMsICJQYXRoRXJyb3IiKTsKICAgICAgfQogICAgICBjb25zdHJ1Y3RvcihtZXNzYWdlMiwgb3JpZ2luYWxQYXRoKSB7CiAgICAgICAgbGV0IHRleHQ4ID0gbWVzc2FnZTI7CiAgICAgICAgaWYgKG9yaWdpbmFsUGF0aCkKICAgICAgICAgIHRleHQ4ICs9IGA6ICR7b3JpZ2luYWxQYXRofWA7CiAgICAgICAgdGV4dDggKz0gYDsgdmlzaXQgaHR0cHM6Ly9naXQubmV3L3BhdGhUb1JlZ2V4cEVycm9yIGZvciBpbmZvYDsKICAgICAgICBzdXBlcih0ZXh0OCk7CiAgICAgICAgdGhpcy5vcmlnaW5hbFBhdGggPSBvcmlnaW5hbFBhdGg7CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzLlBhdGhFcnJvciA9IFBhdGhFcnJvcjsKICAgIGZ1bmN0aW9uIHBhcnNlOShzdHIsIG9wdGlvbnMgPSB7fSkgewogICAgICBjb25zdCB7IGVuY29kZVBhdGggPSBOT09QX1ZBTFVFIH0gPSBvcHRpb25zOwogICAgICBjb25zdCBjaGFycyA9IFsuLi5zdHJdOwogICAgICBjb25zdCB0b2tlbnMgPSBbXTsKICAgICAgbGV0IGluZGV4MiA9IDA7CiAgICAgIGxldCBwb3MgPSAwOwogICAgICBmdW5jdGlvbiBuYW1lKCkgewogICAgICAgIGxldCB2YWx1ZTIgPSAiIjsKICAgICAgICBpZiAoSURfU1RBUlQudGVzdChjaGFyc1tpbmRleDJdKSkgewogICAgICAgICAgZG8gewogICAgICAgICAgICB2YWx1ZTIgKz0gY2hhcnNbaW5kZXgyKytdOwogICAgICAgICAgfSB3aGlsZSAoSURfQ09OVElOVUUudGVzdChjaGFyc1tpbmRleDJdKSk7CiAgICAgICAgfSBlbHNlIGlmIChjaGFyc1tpbmRleDJdID09PSAnIicpIHsKICAgICAgICAgIGxldCBxdW90ZVN0YXJ0ID0gaW5kZXgyOwogICAgICAgICAgd2hpbGUgKGluZGV4MisrIDwgY2hhcnMubGVuZ3RoKSB7CiAgICAgICAgICAgIGlmIChjaGFyc1tpbmRleDJdID09PSAnIicpIHsKICAgICAgICAgICAgICBpbmRleDIrKzsKICAgICAgICAgICAgICBxdW90ZVN0YXJ0ID0gMDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2hhcnNbaW5kZXgyXSA9PT0gIlxcIikKICAgICAgICAgICAgICBpbmRleDIrKzsKICAgICAgICAgICAgdmFsdWUyICs9IGNoYXJzW2luZGV4Ml07CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocXVvdGVTdGFydCkgewogICAgICAgICAgICB0aHJvdyBuZXcgUGF0aEVycm9yKGBVbnRlcm1pbmF0ZWQgcXVvdGUgYXQgaW5kZXggJHtxdW90ZVN0YXJ0fWAsIHN0cik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghdmFsdWUyKSB7CiAgICAgICAgICB0aHJvdyBuZXcgUGF0aEVycm9yKGBNaXNzaW5nIHBhcmFtZXRlciBuYW1lIGF0IGluZGV4ICR7aW5kZXgyfWAsIHN0cik7CiAgICAgICAgfQogICAgICAgIHJldHVybiB2YWx1ZTI7CiAgICAgIH0KICAgICAgX19uYW1lKG5hbWUsICJuYW1lIik7CiAgICAgIHdoaWxlIChpbmRleDIgPCBjaGFycy5sZW5ndGgpIHsKICAgICAgICBjb25zdCB2YWx1ZTIgPSBjaGFyc1tpbmRleDJdOwogICAgICAgIGNvbnN0IHR5cGU1ID0gU0lNUExFX1RPS0VOU1t2YWx1ZTJdOwogICAgICAgIGlmICh0eXBlNSkgewogICAgICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiB0eXBlNSwgaW5kZXg6IGluZGV4MisrLCB2YWx1ZTogdmFsdWUyIH0pOwogICAgICAgIH0gZWxzZSBpZiAodmFsdWUyID09PSAiXFwiKSB7CiAgICAgICAgICB0b2tlbnMucHVzaCh7IHR5cGU6ICJlc2NhcGUiLCBpbmRleDogaW5kZXgyKyssIHZhbHVlOiBjaGFyc1tpbmRleDIrK10gfSk7CiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZTIgPT09ICI6IikgewogICAgICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiAicGFyYW0iLCBpbmRleDogaW5kZXgyKyssIHZhbHVlOiBuYW1lKCkgfSk7CiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZTIgPT09ICIqIikgewogICAgICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiAid2lsZGNhcmQiLCBpbmRleDogaW5kZXgyKyssIHZhbHVlOiBuYW1lKCkgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogImNoYXIiLCBpbmRleDogaW5kZXgyKyssIHZhbHVlOiB2YWx1ZTIgfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogImVuZCIsIGluZGV4OiBpbmRleDIsIHZhbHVlOiAiIiB9KTsKICAgICAgZnVuY3Rpb24gY29uc3VtZVVudGlsKGVuZFR5cGUpIHsKICAgICAgICBjb25zdCBvdXRwdXQgPSBbXTsKICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbcG9zKytdOwogICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09IGVuZFR5cGUpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICJjaGFyIiB8fCB0b2tlbi50eXBlID09PSAiZXNjYXBlIikgewogICAgICAgICAgICBsZXQgcGF0aDIgPSB0b2tlbi52YWx1ZTsKICAgICAgICAgICAgbGV0IGN1ciA9IHRva2Vuc1twb3NdOwogICAgICAgICAgICB3aGlsZSAoY3VyLnR5cGUgPT09ICJjaGFyIiB8fCBjdXIudHlwZSA9PT0gImVzY2FwZSIpIHsKICAgICAgICAgICAgICBwYXRoMiArPSBjdXIudmFsdWU7CiAgICAgICAgICAgICAgY3VyID0gdG9rZW5zWysrcG9zXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvdXRwdXQucHVzaCh7CiAgICAgICAgICAgICAgdHlwZTogInRleHQiLAogICAgICAgICAgICAgIHZhbHVlOiBlbmNvZGVQYXRoKHBhdGgyKQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gInBhcmFtIiB8fCB0b2tlbi50eXBlID09PSAid2lsZGNhcmQiKSB7CiAgICAgICAgICAgIG91dHB1dC5wdXNoKHsKICAgICAgICAgICAgICB0eXBlOiB0b2tlbi50eXBlLAogICAgICAgICAgICAgIG5hbWU6IHRva2VuLnZhbHVlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0b2tlbi50eXBlID09PSAieyIpIHsKICAgICAgICAgICAgb3V0cHV0LnB1c2goewogICAgICAgICAgICAgIHR5cGU6ICJncm91cCIsCiAgICAgICAgICAgICAgdG9rZW5zOiBjb25zdW1lVW50aWwoIn0iKQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICB0aHJvdyBuZXcgUGF0aEVycm9yKGBVbmV4cGVjdGVkICR7dG9rZW4udHlwZX0gYXQgaW5kZXggJHt0b2tlbi5pbmRleH0sIGV4cGVjdGVkICR7ZW5kVHlwZX1gLCBzdHIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gb3V0cHV0OwogICAgICB9CiAgICAgIF9fbmFtZShjb25zdW1lVW50aWwsICJjb25zdW1lVW50aWwiKTsKICAgICAgcmV0dXJuIG5ldyBUb2tlbkRhdGEoY29uc3VtZVVudGlsKCJlbmQiKSwgc3RyKTsKICAgIH0KICAgIF9fbmFtZShwYXJzZTksICJwYXJzZSIpOwogICAgZnVuY3Rpb24gY29tcGlsZTIocGF0aDIsIG9wdGlvbnMgPSB7fSkgewogICAgICBjb25zdCB7IGVuY29kZTogZW5jb2RlMiA9IGVuY29kZVVSSUNvbXBvbmVudCwgZGVsaW1pdGVyID0gREVGQVVMVF9ERUxJTUlURVIgfSA9IG9wdGlvbnM7CiAgICAgIGNvbnN0IGRhdGEgPSB0eXBlb2YgcGF0aDIgPT09ICJvYmplY3QiID8gcGF0aDIgOiBwYXJzZTkocGF0aDIsIG9wdGlvbnMpOwogICAgICBjb25zdCBmbiA9IHRva2Vuc1RvRnVuY3Rpb24oZGF0YS50b2tlbnMsIGRlbGltaXRlciwgZW5jb2RlMik7CiAgICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uIHBhdGgzKHBhcmFtcyA9IHt9KSB7CiAgICAgICAgY29uc3QgW3BhdGg0LCAuLi5taXNzaW5nXSA9IGZuKHBhcmFtcyk7CiAgICAgICAgaWYgKG1pc3NpbmcubGVuZ3RoKSB7CiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBNaXNzaW5nIHBhcmFtZXRlcnM6ICR7bWlzc2luZy5qb2luKCIsICIpfWApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcGF0aDQ7CiAgICAgIH0sICJwYXRoIik7CiAgICB9CiAgICBfX25hbWUoY29tcGlsZTIsICJjb21waWxlIik7CiAgICBmdW5jdGlvbiB0b2tlbnNUb0Z1bmN0aW9uKHRva2VucywgZGVsaW1pdGVyLCBlbmNvZGUyKSB7CiAgICAgIGNvbnN0IGVuY29kZXJzID0gdG9rZW5zLm1hcCgodG9rZW4pID0+IHRva2VuVG9GdW5jdGlvbih0b2tlbiwgZGVsaW1pdGVyLCBlbmNvZGUyKSk7CiAgICAgIHJldHVybiAoZGF0YSkgPT4gewogICAgICAgIGNvbnN0IHJlc3VsdCA9IFsiIl07CiAgICAgICAgZm9yIChjb25zdCBlbmNvZGVyIG9mIGVuY29kZXJzKSB7CiAgICAgICAgICBjb25zdCBbdmFsdWUyLCAuLi5leHRyYXNdID0gZW5jb2RlcihkYXRhKTsKICAgICAgICAgIHJlc3VsdFswXSArPSB2YWx1ZTI7CiAgICAgICAgICByZXN1bHQucHVzaCguLi5leHRyYXMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgfQogICAgX19uYW1lKHRva2Vuc1RvRnVuY3Rpb24sICJ0b2tlbnNUb0Z1bmN0aW9uIik7CiAgICBmdW5jdGlvbiB0b2tlblRvRnVuY3Rpb24odG9rZW4sIGRlbGltaXRlciwgZW5jb2RlMikgewogICAgICBpZiAodG9rZW4udHlwZSA9PT0gInRleHQiKQogICAgICAgIHJldHVybiAoKSA9PiBbdG9rZW4udmFsdWVdOwogICAgICBpZiAodG9rZW4udHlwZSA9PT0gImdyb3VwIikgewogICAgICAgIGNvbnN0IGZuID0gdG9rZW5zVG9GdW5jdGlvbih0b2tlbi50b2tlbnMsIGRlbGltaXRlciwgZW5jb2RlMik7CiAgICAgICAgcmV0dXJuIChkYXRhKSA9PiB7CiAgICAgICAgICBjb25zdCBbdmFsdWUyLCAuLi5taXNzaW5nXSA9IGZuKGRhdGEpOwogICAgICAgICAgaWYgKCFtaXNzaW5nLmxlbmd0aCkKICAgICAgICAgICAgcmV0dXJuIFt2YWx1ZTJdOwogICAgICAgICAgcmV0dXJuIFsiIl07CiAgICAgICAgfTsKICAgICAgfQogICAgICBjb25zdCBlbmNvZGVWYWx1ZSA9IGVuY29kZTIgfHwgTk9PUF9WQUxVRTsKICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICJ3aWxkY2FyZCIgJiYgZW5jb2RlMiAhPT0gZmFsc2UpIHsKICAgICAgICByZXR1cm4gKGRhdGEpID0+IHsKICAgICAgICAgIGNvbnN0IHZhbHVlMiA9IGRhdGFbdG9rZW4ubmFtZV07CiAgICAgICAgICBpZiAodmFsdWUyID09IG51bGwpCiAgICAgICAgICAgIHJldHVybiBbIiIsIHRva2VuLm5hbWVdOwogICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlMikgfHwgdmFsdWUyLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCAiJHt0b2tlbi5uYW1lfSIgdG8gYmUgYSBub24tZW1wdHkgYXJyYXlgKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgIHZhbHVlMi5tYXAoKHZhbHVlMywgaW5kZXgyKSA9PiB7CiAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZTMgIT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCAiJHt0b2tlbi5uYW1lfS8ke2luZGV4Mn0iIHRvIGJlIGEgc3RyaW5nYCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiBlbmNvZGVWYWx1ZSh2YWx1ZTMpOwogICAgICAgICAgICB9KS5qb2luKGRlbGltaXRlcikKICAgICAgICAgIF07CiAgICAgICAgfTsKICAgICAgfQogICAgICByZXR1cm4gKGRhdGEpID0+IHsKICAgICAgICBjb25zdCB2YWx1ZTIgPSBkYXRhW3Rva2VuLm5hbWVdOwogICAgICAgIGlmICh2YWx1ZTIgPT0gbnVsbCkKICAgICAgICAgIHJldHVybiBbIiIsIHRva2VuLm5hbWVdOwogICAgICAgIGlmICh0eXBlb2YgdmFsdWUyICE9PSAic3RyaW5nIikgewogICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgIiR7dG9rZW4ubmFtZX0iIHRvIGJlIGEgc3RyaW5nYCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBbZW5jb2RlVmFsdWUodmFsdWUyKV07CiAgICAgIH07CiAgICB9CiAgICBfX25hbWUodG9rZW5Ub0Z1bmN0aW9uLCAidG9rZW5Ub0Z1bmN0aW9uIik7CiAgICBmdW5jdGlvbiBtYXRjaDIocGF0aDIsIG9wdGlvbnMgPSB7fSkgewogICAgICBjb25zdCB7IGRlY29kZTogZGVjb2RlMiA9IGRlY29kZVVSSUNvbXBvbmVudCwgZGVsaW1pdGVyID0gREVGQVVMVF9ERUxJTUlURVIgfSA9IG9wdGlvbnM7CiAgICAgIGNvbnN0IHsgcmVnZXhwLCBrZXlzOiBrZXlzMiB9ID0gcGF0aFRvUmVnZXhwKHBhdGgyLCBvcHRpb25zKTsKICAgICAgY29uc3QgZGVjb2RlcnMgPSBrZXlzMi5tYXAoKGtleTIpID0+IHsKICAgICAgICBpZiAoZGVjb2RlMiA9PT0gZmFsc2UpCiAgICAgICAgICByZXR1cm4gTk9PUF9WQUxVRTsKICAgICAgICBpZiAoa2V5Mi50eXBlID09PSAicGFyYW0iKQogICAgICAgICAgcmV0dXJuIGRlY29kZTI7CiAgICAgICAgcmV0dXJuICh2YWx1ZTIpID0+IHZhbHVlMi5zcGxpdChkZWxpbWl0ZXIpLm1hcChkZWNvZGUyKTsKICAgICAgfSk7CiAgICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uIG1hdGNoMyhpbnB1dCkgewogICAgICAgIGNvbnN0IG01ID0gcmVnZXhwLmV4ZWMoaW5wdXQpOwogICAgICAgIGlmICghbTUpCiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgY29uc3QgcGF0aDMgPSBtNVswXTsKICAgICAgICBjb25zdCBwYXJhbXMgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICBmb3IgKGxldCBpMTAgPSAxOyBpMTAgPCBtNS5sZW5ndGg7IGkxMCsrKSB7CiAgICAgICAgICBpZiAobTVbaTEwXSA9PT0gdm9pZCAwKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIGNvbnN0IGtleTIgPSBrZXlzMltpMTAgLSAxXTsKICAgICAgICAgIGNvbnN0IGRlY29kZXIgPSBkZWNvZGVyc1tpMTAgLSAxXTsKICAgICAgICAgIHBhcmFtc1trZXkyLm5hbWVdID0gZGVjb2RlcihtNVtpMTBdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgcGF0aDogcGF0aDMsIHBhcmFtcyB9OwogICAgICB9LCAibWF0Y2giKTsKICAgIH0KICAgIF9fbmFtZShtYXRjaDIsICJtYXRjaCIpOwogICAgZnVuY3Rpb24gcGF0aFRvUmVnZXhwKHBhdGgyLCBvcHRpb25zID0ge30pIHsKICAgICAgY29uc3QgeyBkZWxpbWl0ZXIgPSBERUZBVUxUX0RFTElNSVRFUiwgZW5kID0gdHJ1ZSwgc2Vuc2l0aXZlID0gZmFsc2UsIHRyYWlsaW5nID0gdHJ1ZSB9ID0gb3B0aW9uczsKICAgICAgY29uc3Qga2V5czIgPSBbXTsKICAgICAgY29uc3QgZmxhZ3MgPSBzZW5zaXRpdmUgPyAiIiA6ICJpIjsKICAgICAgY29uc3Qgc291cmNlcyA9IFtdOwogICAgICBmb3IgKGNvbnN0IGlucHV0IG9mIHBhdGhzVG9BcnJheShwYXRoMiwgW10pKSB7CiAgICAgICAgY29uc3QgZGF0YSA9IHR5cGVvZiBpbnB1dCA9PT0gIm9iamVjdCIgPyBpbnB1dCA6IHBhcnNlOShpbnB1dCwgb3B0aW9ucyk7CiAgICAgICAgZm9yIChjb25zdCB0b2tlbnMgb2YgZmxhdHRlbihkYXRhLnRva2VucywgMCwgW10pKSB7CiAgICAgICAgICBzb3VyY2VzLnB1c2godG9SZWdFeHBTb3VyY2UodG9rZW5zLCBkZWxpbWl0ZXIsIGtleXMyLCBkYXRhLm9yaWdpbmFsUGF0aCkpOwogICAgICAgIH0KICAgICAgfQogICAgICBsZXQgcGF0dGVybiA9IGBeKD86JHtzb3VyY2VzLmpvaW4oInwiKX0pYDsKICAgICAgaWYgKHRyYWlsaW5nKQogICAgICAgIHBhdHRlcm4gKz0gYCg/OiR7ZXNjYXBlKGRlbGltaXRlcil9JCk/YDsKICAgICAgcGF0dGVybiArPSBlbmQgPyAiJCIgOiBgKD89JHtlc2NhcGUoZGVsaW1pdGVyKX18JClgOwogICAgICBjb25zdCByZWdleHAgPSBuZXcgUmVnRXhwKHBhdHRlcm4sIGZsYWdzKTsKICAgICAgcmV0dXJuIHsgcmVnZXhwLCBrZXlzOiBrZXlzMiB9OwogICAgfQogICAgX19uYW1lKHBhdGhUb1JlZ2V4cCwgInBhdGhUb1JlZ2V4cCIpOwogICAgZnVuY3Rpb24gcGF0aHNUb0FycmF5KHBhdGhzLCBpbml0KSB7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhdGhzKSkgewogICAgICAgIGZvciAoY29uc3QgcDYgb2YgcGF0aHMpCiAgICAgICAgICBwYXRoc1RvQXJyYXkocDYsIGluaXQpOwogICAgICB9IGVsc2UgewogICAgICAgIGluaXQucHVzaChwYXRocyk7CiAgICAgIH0KICAgICAgcmV0dXJuIGluaXQ7CiAgICB9CiAgICBfX25hbWUocGF0aHNUb0FycmF5LCAicGF0aHNUb0FycmF5Iik7CiAgICBmdW5jdGlvbiogZmxhdHRlbih0b2tlbnMsIGluZGV4MiwgaW5pdCkgewogICAgICBpZiAoaW5kZXgyID09PSB0b2tlbnMubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuIHlpZWxkIGluaXQ7CiAgICAgIH0KICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbaW5kZXgyXTsKICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICJncm91cCIpIHsKICAgICAgICBmb3IgKGNvbnN0IHNlcSBvZiBmbGF0dGVuKHRva2VuLnRva2VucywgMCwgaW5pdC5zbGljZSgpKSkgewogICAgICAgICAgeWllbGQqIGZsYXR0ZW4odG9rZW5zLCBpbmRleDIgKyAxLCBzZXEpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBpbml0LnB1c2godG9rZW4pOwogICAgICB9CiAgICAgIHlpZWxkKiBmbGF0dGVuKHRva2VucywgaW5kZXgyICsgMSwgaW5pdCk7CiAgICB9CiAgICBfX25hbWUoZmxhdHRlbiwgImZsYXR0ZW4iKTsKICAgIGZ1bmN0aW9uIHRvUmVnRXhwU291cmNlKHRva2VucywgZGVsaW1pdGVyLCBrZXlzMiwgb3JpZ2luYWxQYXRoKSB7CiAgICAgIGxldCByZXN1bHQgPSAiIjsKICAgICAgbGV0IGJhY2t0cmFjayA9ICIiOwogICAgICBsZXQgaXNTYWZlU2VnbWVudFBhcmFtID0gdHJ1ZTsKICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiB0b2tlbnMpIHsKICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gInRleHQiKSB7CiAgICAgICAgICByZXN1bHQgKz0gZXNjYXBlKHRva2VuLnZhbHVlKTsKICAgICAgICAgIGJhY2t0cmFjayArPSB0b2tlbi52YWx1ZTsKICAgICAgICAgIGlzU2FmZVNlZ21lbnRQYXJhbSB8fCAoaXNTYWZlU2VnbWVudFBhcmFtID0gdG9rZW4udmFsdWUuaW5jbHVkZXMoZGVsaW1pdGVyKSk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICJwYXJhbSIgfHwgdG9rZW4udHlwZSA9PT0gIndpbGRjYXJkIikgewogICAgICAgICAgaWYgKCFpc1NhZmVTZWdtZW50UGFyYW0gJiYgIWJhY2t0cmFjaykgewogICAgICAgICAgICB0aHJvdyBuZXcgUGF0aEVycm9yKGBNaXNzaW5nIHRleHQgYmVmb3JlICIke3Rva2VuLm5hbWV9IiAke3Rva2VuLnR5cGV9YCwgb3JpZ2luYWxQYXRoKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0b2tlbi50eXBlID09PSAicGFyYW0iKSB7CiAgICAgICAgICAgIHJlc3VsdCArPSBgKCR7bmVnYXRlKGRlbGltaXRlciwgaXNTYWZlU2VnbWVudFBhcmFtID8gIiIgOiBiYWNrdHJhY2spfSspYDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJlc3VsdCArPSBgKFtcXHNcXFNdKylgOwogICAgICAgICAgfQogICAgICAgICAga2V5czIucHVzaCh0b2tlbik7CiAgICAgICAgICBiYWNrdHJhY2sgPSAiIjsKICAgICAgICAgIGlzU2FmZVNlZ21lbnRQYXJhbSA9IGZhbHNlOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBfX25hbWUodG9SZWdFeHBTb3VyY2UsICJ0b1JlZ0V4cFNvdXJjZSIpOwogICAgZnVuY3Rpb24gbmVnYXRlKGRlbGltaXRlciwgYmFja3RyYWNrKSB7CiAgICAgIGlmIChiYWNrdHJhY2subGVuZ3RoIDwgMikgewogICAgICAgIGlmIChkZWxpbWl0ZXIubGVuZ3RoIDwgMikKICAgICAgICAgIHJldHVybiBgW14ke2VzY2FwZShkZWxpbWl0ZXIgKyBiYWNrdHJhY2spfV1gOwogICAgICAgIHJldHVybiBgKD86KD8hJHtlc2NhcGUoZGVsaW1pdGVyKX0pW14ke2VzY2FwZShiYWNrdHJhY2spfV0pYDsKICAgICAgfQogICAgICBpZiAoZGVsaW1pdGVyLmxlbmd0aCA8IDIpIHsKICAgICAgICByZXR1cm4gYCg/Oig/ISR7ZXNjYXBlKGJhY2t0cmFjayl9KVteJHtlc2NhcGUoZGVsaW1pdGVyKX1dKWA7CiAgICAgIH0KICAgICAgcmV0dXJuIGAoPzooPyEke2VzY2FwZShiYWNrdHJhY2spfXwke2VzY2FwZShkZWxpbWl0ZXIpfSlbXFxzXFxTXSlgOwogICAgfQogICAgX19uYW1lKG5lZ2F0ZSwgIm5lZ2F0ZSIpOwogICAgZnVuY3Rpb24gc3RyaW5naWZ5VG9rZW5zKHRva2VucykgewogICAgICBsZXQgdmFsdWUyID0gIiI7CiAgICAgIGxldCBpMTAgPSAwOwogICAgICBmdW5jdGlvbiBuYW1lKHZhbHVlMykgewogICAgICAgIGNvbnN0IGlzU2FmZSA9IGlzTmFtZVNhZmUodmFsdWUzKSAmJiBpc05leHROYW1lU2FmZSh0b2tlbnNbaTEwXSk7CiAgICAgICAgcmV0dXJuIGlzU2FmZSA/IHZhbHVlMyA6IEpTT04uc3RyaW5naWZ5KHZhbHVlMyk7CiAgICAgIH0KICAgICAgX19uYW1lKG5hbWUsICJuYW1lIik7CiAgICAgIHdoaWxlIChpMTAgPCB0b2tlbnMubGVuZ3RoKSB7CiAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbaTEwKytdOwogICAgICAgIGlmICh0b2tlbi50eXBlID09PSAidGV4dCIpIHsKICAgICAgICAgIHZhbHVlMiArPSBlc2NhcGVUZXh0KHRva2VuLnZhbHVlKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gImdyb3VwIikgewogICAgICAgICAgdmFsdWUyICs9IGB7JHtzdHJpbmdpZnlUb2tlbnModG9rZW4udG9rZW5zKX19YDsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gInBhcmFtIikgewogICAgICAgICAgdmFsdWUyICs9IGA6JHtuYW1lKHRva2VuLm5hbWUpfWA7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICJ3aWxkY2FyZCIpIHsKICAgICAgICAgIHZhbHVlMiArPSBgKiR7bmFtZSh0b2tlbi5uYW1lKX1gOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFVua25vd24gdG9rZW4gdHlwZTogJHt0b2tlbi50eXBlfWApOwogICAgICB9CiAgICAgIHJldHVybiB2YWx1ZTI7CiAgICB9CiAgICBfX25hbWUoc3RyaW5naWZ5VG9rZW5zLCAic3RyaW5naWZ5VG9rZW5zIik7CiAgICBmdW5jdGlvbiBzdHJpbmdpZnk3KGRhdGEpIHsKICAgICAgcmV0dXJuIHN0cmluZ2lmeVRva2VucyhkYXRhLnRva2Vucyk7CiAgICB9CiAgICBfX25hbWUoc3RyaW5naWZ5NywgInN0cmluZ2lmeSIpOwogICAgZnVuY3Rpb24gaXNOYW1lU2FmZShuYW1lKSB7CiAgICAgIGNvbnN0IFtmaXJzdDIsIC4uLnJlc3RdID0gbmFtZTsKICAgICAgcmV0dXJuIElEX1NUQVJULnRlc3QoZmlyc3QyKSAmJiByZXN0LmV2ZXJ5KChjaGFyKSA9PiBJRF9DT05USU5VRS50ZXN0KGNoYXIpKTsKICAgIH0KICAgIF9fbmFtZShpc05hbWVTYWZlLCAiaXNOYW1lU2FmZSIpOwogICAgZnVuY3Rpb24gaXNOZXh0TmFtZVNhZmUodG9rZW4pIHsKICAgICAgaWYgKHRva2VuICYmIHRva2VuLnR5cGUgPT09ICJ0ZXh0IikKICAgICAgICByZXR1cm4gIUlEX0NPTlRJTlVFLnRlc3QodG9rZW4udmFsdWVbMF0pOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIF9fbmFtZShpc05leHROYW1lU2FmZSwgImlzTmV4dE5hbWVTYWZlIik7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9zd2VldC1zY3JvbGxANC4wLjAvbm9kZV9tb2R1bGVzL3N3ZWV0LXNjcm9sbC9zd2VldC1zY3JvbGwuanMKdmFyIHJlcXVpcmVfc3dlZXRfc2Nyb2xsID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9zd2VldC1zY3JvbGxANC4wLjAvbm9kZV9tb2R1bGVzL3N3ZWV0LXNjcm9sbC9zd2VldC1zY3JvbGwuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgKGZ1bmN0aW9uKGdsb2JhbDIsIGZhY3RvcnkpIHsKICAgICAgdHlwZW9mIGV4cG9ydHMgPT09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgIT09ICJ1bmRlZmluZWQiID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOiB0eXBlb2YgZGVmaW5lID09PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOiAoZ2xvYmFsMiA9IGdsb2JhbDIgfHwgc2VsZiwgZ2xvYmFsMi5Td2VldFNjcm9sbCA9IGZhY3RvcnkoKSk7CiAgICB9KShleHBvcnRzLCBmdW5jdGlvbigpIHsKICAgICAgInVzZSBzdHJpY3QiOwogICAgICB2YXIgX19hc3NpZ24yID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHsKICAgICAgICBfX2Fzc2lnbjIgPSBPYmplY3QuYXNzaWduIHx8IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gX19hc3NpZ24zKHQ4KSB7CiAgICAgICAgICBmb3IgKHZhciBzOSwgaTEwID0gMSwgbjExID0gYXJndW1lbnRzLmxlbmd0aDsgaTEwIDwgbjExOyBpMTArKykgewogICAgICAgICAgICBzOSA9IGFyZ3VtZW50c1tpMTBdOwogICAgICAgICAgICBmb3IgKHZhciBwNiBpbiBzOSkgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzOSwgcDYpKSB0OFtwNl0gPSBzOVtwNl07CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdDg7CiAgICAgICAgfSwgIl9fYXNzaWduIik7CiAgICAgICAgcmV0dXJuIF9fYXNzaWduMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICB9LCAiX19hc3NpZ24iKTsKICAgICAgdmFyIGNhblVzZURPTSA9ICEhKHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiICYmIHdpbmRvdy5kb2N1bWVudCAmJiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7CiAgICAgIHZhciBjYW5Vc2VIaXN0b3J5ID0gIWNhblVzZURPTSA/IGZhbHNlIDogd2luZG93Lmhpc3RvcnkgJiYgInB1c2hTdGF0ZSIgaW4gd2luZG93Lmhpc3RvcnkgJiYgd2luZG93LmxvY2F0aW9uLnByb3RvY29sICE9PSAiZmlsZToiOwogICAgICB2YXIgY2FuVXNlUGFzc2l2ZU9wdGlvbiA9IChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc3VwcG9ydCA9IGZhbHNlOwogICAgICAgIGlmICghY2FuVXNlRE9NKSB7CiAgICAgICAgICByZXR1cm4gc3VwcG9ydDsKICAgICAgICB9CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHZhciB3aW4gPSB3aW5kb3c7CiAgICAgICAgICB2YXIgb3B0cyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgInBhc3NpdmUiLCB7CiAgICAgICAgICAgIGdldDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHsKICAgICAgICAgICAgICBzdXBwb3J0ID0gdHJ1ZTsKICAgICAgICAgICAgfSwgImdldCIpCiAgICAgICAgICB9KTsKICAgICAgICAgIHdpbi5hZGRFdmVudExpc3RlbmVyKCJ0ZXN0IiwgbnVsbCwgb3B0cyk7CiAgICAgICAgICB3aW4ucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGVzdCIsIG51bGwsIG9wdHMpOwogICAgICAgIH0gY2F0Y2ggKGUxMCkgewogICAgICAgIH0KICAgICAgICByZXR1cm4gc3VwcG9ydDsKICAgICAgfSkoKTsKICAgICAgdmFyIGlzU3RyaW5nMyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICJzdHJpbmciOwogICAgICB9LCAiaXNTdHJpbmciKTsKICAgICAgdmFyIGlzRnVuY3Rpb24yID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihvYmopIHsKICAgICAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gImZ1bmN0aW9uIjsKICAgICAgfSwgImlzRnVuY3Rpb24iKTsKICAgICAgdmFyIGlzQXJyYXk1ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihvYmopIHsKICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShvYmopOwogICAgICB9LCAiaXNBcnJheSIpOwogICAgICB2YXIgaXNOdW1lcmljID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihvYmopIHsKICAgICAgICByZXR1cm4gIWlzQXJyYXk1KG9iaikgJiYgb2JqIC0gcGFyc2VGbG9hdChvYmopICsgMSA+PSAwOwogICAgICB9LCAiaXNOdW1lcmljIik7CiAgICAgIHZhciBoYXNQcm9wID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihvYmosIGtleTIpIHsKICAgICAgICByZXR1cm4gb2JqICYmIG9iai5oYXNPd25Qcm9wZXJ0eShrZXkyKTsKICAgICAgfSwgImhhc1Byb3AiKTsKICAgICAgdmFyIHJhZiA9IGNhblVzZURPTSA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpIDogbnVsbDsKICAgICAgdmFyIGNhZiA9IGNhblVzZURPTSA/IHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdykgOiBudWxsOwogICAgICB2YXIgY29zID0gTWF0aC5jb3MsIHNpbiA9IE1hdGguc2luLCBwb3cgPSBNYXRoLnBvdywgc3FydCA9IE1hdGguc3FydCwgUEkgPSBNYXRoLlBJOwogICAgICB2YXIgZWFzaW5ncyA9IHsKICAgICAgICBsaW5lYXI6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24ocDYpIHsKICAgICAgICAgIHJldHVybiBwNjsKICAgICAgICB9LCAibGluZWFyIiksCiAgICAgICAgZWFzZUluUXVhZDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihfMywgdDgsIGI0LCBjMTAsIGQ0KSB7CiAgICAgICAgICByZXR1cm4gYzEwICogKHQ4IC89IGQ0KSAqIHQ4ICsgYjQ7CiAgICAgICAgfSwgImVhc2VJblF1YWQiKSwKICAgICAgICBlYXNlT3V0UXVhZDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihfMywgdDgsIGI0LCBjMTAsIGQ0KSB7CiAgICAgICAgICByZXR1cm4gLWMxMCAqICh0OCAvPSBkNCkgKiAodDggLSAyKSArIGI0OwogICAgICAgIH0sICJlYXNlT3V0UXVhZCIpLAogICAgICAgIGVhc2VJbk91dFF1YWQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oXzMsIHQ4LCBiNCwgYzEwLCBkNCkgewogICAgICAgICAgcmV0dXJuICh0OCAvPSBkNCAvIDIpIDwgMSA/IGMxMCAvIDIgKiB0OCAqIHQ4ICsgYjQgOiAtYzEwIC8gMiAqICgtLXQ4ICogKHQ4IC0gMikgLSAxKSArIGI0OwogICAgICAgIH0sICJlYXNlSW5PdXRRdWFkIiksCiAgICAgICAgZWFzZUluQ3ViaWM6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oXzMsIHQ4LCBiNCwgYzEwLCBkNCkgewogICAgICAgICAgcmV0dXJuIGMxMCAqICh0OCAvPSBkNCkgKiB0OCAqIHQ4ICsgYjQ7CiAgICAgICAgfSwgImVhc2VJbkN1YmljIiksCiAgICAgICAgZWFzZU91dEN1YmljOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKF8zLCB0OCwgYjQsIGMxMCwgZDQpIHsKICAgICAgICAgIHJldHVybiBjMTAgKiAoKHQ4ID0gdDggLyBkNCAtIDEpICogdDggKiB0OCArIDEpICsgYjQ7CiAgICAgICAgfSwgImVhc2VPdXRDdWJpYyIpLAogICAgICAgIGVhc2VJbk91dEN1YmljOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKF8zLCB0OCwgYjQsIGMxMCwgZDQpIHsKICAgICAgICAgIHJldHVybiAodDggLz0gZDQgLyAyKSA8IDEgPyBjMTAgLyAyICogdDggKiB0OCAqIHQ4ICsgYjQgOiBjMTAgLyAyICogKCh0OCAtPSAyKSAqIHQ4ICogdDggKyAyKSArIGI0OwogICAgICAgIH0sICJlYXNlSW5PdXRDdWJpYyIpLAogICAgICAgIGVhc2VJblF1YXJ0OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKF8zLCB0OCwgYjQsIGMxMCwgZDQpIHsKICAgICAgICAgIHJldHVybiBjMTAgKiAodDggLz0gZDQpICogdDggKiB0OCAqIHQ4ICsgYjQ7CiAgICAgICAgfSwgImVhc2VJblF1YXJ0IiksCiAgICAgICAgZWFzZU91dFF1YXJ0OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKF8zLCB0OCwgYjQsIGMxMCwgZDQpIHsKICAgICAgICAgIHJldHVybiAtYzEwICogKCh0OCA9IHQ4IC8gZDQgLSAxKSAqIHQ4ICogdDggKiB0OCAtIDEpICsgYjQ7CiAgICAgICAgfSwgImVhc2VPdXRRdWFydCIpLAogICAgICAgIGVhc2VJbk91dFF1YXJ0OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKF8zLCB0OCwgYjQsIGMxMCwgZDQpIHsKICAgICAgICAgIHJldHVybiAodDggLz0gZDQgLyAyKSA8IDEgPyBjMTAgLyAyICogdDggKiB0OCAqIHQ4ICogdDggKyBiNCA6IC1jMTAgLyAyICogKCh0OCAtPSAyKSAqIHQ4ICogdDggKiB0OCAtIDIpICsgYjQ7CiAgICAgICAgfSwgImVhc2VJbk91dFF1YXJ0IiksCiAgICAgICAgZWFzZUluUXVpbnQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oXzMsIHQ4LCBiNCwgYzEwLCBkNCkgewogICAgICAgICAgcmV0dXJuIGMxMCAqICh0OCAvPSBkNCkgKiB0OCAqIHQ4ICogdDggKiB0OCArIGI0OwogICAgICAgIH0sICJlYXNlSW5RdWludCIpLAogICAgICAgIGVhc2VPdXRRdWludDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihfMywgdDgsIGI0LCBjMTAsIGQ0KSB7CiAgICAgICAgICByZXR1cm4gYzEwICogKCh0OCA9IHQ4IC8gZDQgLSAxKSAqIHQ4ICogdDggKiB0OCAqIHQ4ICsgMSkgKyBiNDsKICAgICAgICB9LCAiZWFzZU91dFF1aW50IiksCiAgICAgICAgZWFzZUluT3V0UXVpbnQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oXzMsIHQ4LCBiNCwgYzEwLCBkNCkgewogICAgICAgICAgcmV0dXJuICh0OCAvPSBkNCAvIDIpIDwgMSA/IGMxMCAvIDIgKiB0OCAqIHQ4ICogdDggKiB0OCAqIHQ4ICsgYjQgOiBjMTAgLyAyICogKCh0OCAtPSAyKSAqIHQ4ICogdDggKiB0OCAqIHQ4ICsgMikgKyBiNDsKICAgICAgICB9LCAiZWFzZUluT3V0UXVpbnQiKSwKICAgICAgICBlYXNlSW5TaW5lOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKF8zLCB0OCwgYjQsIGMxMCwgZDQpIHsKICAgICAgICAgIHJldHVybiAtYzEwICogY29zKHQ4IC8gZDQgKiAoUEkgLyAyKSkgKyBjMTAgKyBiNDsKICAgICAgICB9LCAiZWFzZUluU2luZSIpLAogICAgICAgIGVhc2VPdXRTaW5lOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKF8zLCB0OCwgYjQsIGMxMCwgZDQpIHsKICAgICAgICAgIHJldHVybiBjMTAgKiBzaW4odDggLyBkNCAqIChQSSAvIDIpKSArIGI0OwogICAgICAgIH0sICJlYXNlT3V0U2luZSIpLAogICAgICAgIGVhc2VJbk91dFNpbmU6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oXzMsIHQ4LCBiNCwgYzEwLCBkNCkgewogICAgICAgICAgcmV0dXJuIC1jMTAgLyAyICogKGNvcyhQSSAqIHQ4IC8gZDQpIC0gMSkgKyBiNDsKICAgICAgICB9LCAiZWFzZUluT3V0U2luZSIpLAogICAgICAgIGVhc2VJbkV4cG86IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oXzMsIHQ4LCBiNCwgYzEwLCBkNCkgewogICAgICAgICAgcmV0dXJuIHQ4ID09PSAwID8gYjQgOiBjMTAgKiBwb3coMiwgMTAgKiAodDggLyBkNCAtIDEpKSArIGI0OwogICAgICAgIH0sICJlYXNlSW5FeHBvIiksCiAgICAgICAgZWFzZU91dEV4cG86IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oXzMsIHQ4LCBiNCwgYzEwLCBkNCkgewogICAgICAgICAgcmV0dXJuIHQ4ID09PSBkNCA/IGI0ICsgYzEwIDogYzEwICogKC1wb3coMiwgLTEwICogdDggLyBkNCkgKyAxKSArIGI0OwogICAgICAgIH0sICJlYXNlT3V0RXhwbyIpLAogICAgICAgIGVhc2VJbk91dEV4cG86IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oXzMsIHQ4LCBiNCwgYzEwLCBkNCkgewogICAgICAgICAgaWYgKHQ4ID09PSAwKQogICAgICAgICAgICByZXR1cm4gYjQ7CiAgICAgICAgICBpZiAodDggPT09IGQ0KQogICAgICAgICAgICByZXR1cm4gYjQgKyBjMTA7CiAgICAgICAgICBpZiAoKHQ4IC89IGQ0IC8gMikgPCAxKQogICAgICAgICAgICByZXR1cm4gYzEwIC8gMiAqIHBvdygyLCAxMCAqICh0OCAtIDEpKSArIGI0OwogICAgICAgICAgcmV0dXJuIGMxMCAvIDIgKiAoLXBvdygyLCAtMTAgKiAtLXQ4KSArIDIpICsgYjQ7CiAgICAgICAgfSwgImVhc2VJbk91dEV4cG8iKSwKICAgICAgICBlYXNlSW5DaXJjOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKF8zLCB0OCwgYjQsIGMxMCwgZDQpIHsKICAgICAgICAgIHJldHVybiAtYzEwICogKHNxcnQoMSAtICh0OCAvPSBkNCkgKiB0OCkgLSAxKSArIGI0OwogICAgICAgIH0sICJlYXNlSW5DaXJjIiksCiAgICAgICAgZWFzZU91dENpcmM6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oXzMsIHQ4LCBiNCwgYzEwLCBkNCkgewogICAgICAgICAgcmV0dXJuIGMxMCAqIHNxcnQoMSAtICh0OCA9IHQ4IC8gZDQgLSAxKSAqIHQ4KSArIGI0OwogICAgICAgIH0sICJlYXNlT3V0Q2lyYyIpLAogICAgICAgIGVhc2VJbk91dENpcmM6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oXzMsIHQ4LCBiNCwgYzEwLCBkNCkgewogICAgICAgICAgcmV0dXJuICh0OCAvPSBkNCAvIDIpIDwgMSA/IC1jMTAgLyAyICogKHNxcnQoMSAtIHQ4ICogdDgpIC0gMSkgKyBiNCA6IGMxMCAvIDIgKiAoc3FydCgxIC0gKHQ4IC09IDIpICogdDgpICsgMSkgKyBiNDsKICAgICAgICB9LCAiZWFzZUluT3V0Q2lyYyIpCiAgICAgIH07CiAgICAgIHZhciAkJCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oc2VsZWN0b3IpIHsKICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIXNlbGVjdG9yID8gW10gOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSk7CiAgICAgIH0sICIkJCIpOwogICAgICB2YXIgJDMgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKHNlbGVjdG9yKSB7CiAgICAgICAgcmV0dXJuICQkKHNlbGVjdG9yKS5zaGlmdCgpIHx8IG51bGw7CiAgICAgIH0sICIkIik7CiAgICAgIHZhciBpc0VsZW1lbnQgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKG9iaikgewogICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBFbGVtZW50OwogICAgICB9LCAiaXNFbGVtZW50Iik7CiAgICAgIHZhciBpc1dpbmRvdyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oJGVsKSB7CiAgICAgICAgcmV0dXJuICRlbCA9PT0gd2luZG93OwogICAgICB9LCAiaXNXaW5kb3ciKTsKICAgICAgdmFyIGlzUm9vdENvbnRhaW5lciA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oJGVsKSB7CiAgICAgICAgcmV0dXJuICRlbCA9PT0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8ICRlbCA9PT0gZG9jdW1lbnQuYm9keTsKICAgICAgfSwgImlzUm9vdENvbnRhaW5lciIpOwogICAgICB2YXIgbWF0Y2hlcyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oJGVsLCBzZWxlY3RvcikgewogICAgICAgIGlmIChpc0VsZW1lbnQoc2VsZWN0b3IpKSB7CiAgICAgICAgICByZXR1cm4gJGVsID09PSBzZWxlY3RvcjsKICAgICAgICB9CiAgICAgICAgdmFyIHJlc3VsdHMgPSAkJChzZWxlY3Rvcik7CiAgICAgICAgdmFyIGkxMCA9IHJlc3VsdHMubGVuZ3RoOwogICAgICAgIHdoaWxlICgtLWkxMCA+PSAwICYmIHJlc3VsdHNbaTEwXSAhPT0gJGVsKSB7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpMTAgPiAtMTsKICAgICAgfSwgIm1hdGNoZXMiKTsKICAgICAgdmFyIGdldEhlaWdodCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oJGVsKSB7CiAgICAgICAgcmV0dXJuIE1hdGgubWF4KCRlbC5zY3JvbGxIZWlnaHQsICRlbC5jbGllbnRIZWlnaHQsICRlbC5vZmZzZXRIZWlnaHQpOwogICAgICB9LCAiZ2V0SGVpZ2h0Iik7CiAgICAgIHZhciBnZXRXaWR0aCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oJGVsKSB7CiAgICAgICAgcmV0dXJuIE1hdGgubWF4KCRlbC5zY3JvbGxXaWR0aCwgJGVsLmNsaWVudFdpZHRoLCAkZWwub2Zmc2V0V2lkdGgpOwogICAgICB9LCAiZ2V0V2lkdGgiKTsKICAgICAgdmFyIGdldFNpemUgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCRlbCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICB3aWR0aDogZ2V0V2lkdGgoJGVsKSwKICAgICAgICAgIGhlaWdodDogZ2V0SGVpZ2h0KCRlbCkKICAgICAgICB9OwogICAgICB9LCAiZ2V0U2l6ZSIpOwogICAgICB2YXIgZ2V0Vmlld3BvcnRBbmRFbGVtZW50U2l6ZXMgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCRlbCkgewogICAgICAgIHZhciBpc1Jvb3QgPSBpc1dpbmRvdygkZWwpIHx8IGlzUm9vdENvbnRhaW5lcigkZWwpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICB2aWV3cG9ydDogewogICAgICAgICAgICB3aWR0aDogaXNSb290ID8gTWF0aC5taW4od2luZG93LmlubmVyV2lkdGgsIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkgOiAkZWwuY2xpZW50V2lkdGgsCiAgICAgICAgICAgIGhlaWdodDogaXNSb290ID8gd2luZG93LmlubmVySGVpZ2h0IDogJGVsLmNsaWVudEhlaWdodAogICAgICAgICAgfSwKICAgICAgICAgIHNpemU6IGlzUm9vdCA/IHsKICAgICAgICAgICAgd2lkdGg6IE1hdGgubWF4KGdldFdpZHRoKGRvY3VtZW50LmJvZHkpLCBnZXRXaWR0aChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpKSwKICAgICAgICAgICAgaGVpZ2h0OiBNYXRoLm1heChnZXRIZWlnaHQoZG9jdW1lbnQuYm9keSksIGdldEhlaWdodChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpKQogICAgICAgICAgfSA6IGdldFNpemUoJGVsKQogICAgICAgIH07CiAgICAgIH0sICJnZXRWaWV3cG9ydEFuZEVsZW1lbnRTaXplcyIpOwogICAgICB2YXIgZGlyZWN0aW9uTWV0aG9kTWFwID0gewogICAgICAgIHk6ICJzY3JvbGxUb3AiLAogICAgICAgIHg6ICJzY3JvbGxMZWZ0IgogICAgICB9OwogICAgICB2YXIgZGlyZWN0aW9uUHJvcE1hcCA9IHsKICAgICAgICB5OiAicGFnZVlPZmZzZXQiLAogICAgICAgIHg6ICJwYWdlWE9mZnNldCIKICAgICAgfTsKICAgICAgdmFyIGdldFNjcm9sbCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oJGVsLCBkaXJlY3Rpb24pIHsKICAgICAgICByZXR1cm4gaXNXaW5kb3coJGVsKSA/ICRlbFtkaXJlY3Rpb25Qcm9wTWFwW2RpcmVjdGlvbl1dIDogJGVsW2RpcmVjdGlvbk1ldGhvZE1hcFtkaXJlY3Rpb25dXTsKICAgICAgfSwgImdldFNjcm9sbCIpOwogICAgICB2YXIgc2V0U2Nyb2xsID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigkZWwsIG9mZnNldCwgZGlyZWN0aW9uKSB7CiAgICAgICAgaWYgKGlzV2luZG93KCRlbCkpIHsKICAgICAgICAgIHZhciB0b3BfMSA9IGRpcmVjdGlvbiA9PT0gInkiOwogICAgICAgICAgJGVsLnNjcm9sbFRvKCF0b3BfMSA/IG9mZnNldCA6ICRlbC5wYWdlWE9mZnNldCwgdG9wXzEgPyBvZmZzZXQgOiAkZWwucGFnZVlPZmZzZXQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAkZWxbZGlyZWN0aW9uTWV0aG9kTWFwW2RpcmVjdGlvbl1dID0gb2Zmc2V0OwogICAgICAgIH0KICAgICAgfSwgInNldFNjcm9sbCIpOwogICAgICB2YXIgZ2V0T2Zmc2V0ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigkZWwsICRjb250ZXh0KSB7CiAgICAgICAgdmFyIHJlY3QgPSAkZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgaWYgKHJlY3Qud2lkdGggfHwgcmVjdC5oZWlnaHQpIHsKICAgICAgICAgIHZhciBzY3JvbGxfMSA9IHsgdG9wOiAwLCBsZWZ0OiAwIH07CiAgICAgICAgICB2YXIgJGN0eCA9IHZvaWQgMDsKICAgICAgICAgIGlmIChpc1dpbmRvdygkY29udGV4dCkgfHwgaXNSb290Q29udGFpbmVyKCRjb250ZXh0KSkgewogICAgICAgICAgICAkY3R4ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwogICAgICAgICAgICBzY3JvbGxfMS50b3AgPSB3aW5kb3dbZGlyZWN0aW9uUHJvcE1hcC55XTsKICAgICAgICAgICAgc2Nyb2xsXzEubGVmdCA9IHdpbmRvd1tkaXJlY3Rpb25Qcm9wTWFwLnhdOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGN0eCA9ICRjb250ZXh0OwogICAgICAgICAgICB2YXIgY1JlY3QgPSAkY3R4LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgICAgICBzY3JvbGxfMS50b3AgPSBjUmVjdC50b3AgKiAtMSArICRjdHhbZGlyZWN0aW9uTWV0aG9kTWFwLnldOwogICAgICAgICAgICBzY3JvbGxfMS5sZWZ0ID0gY1JlY3QubGVmdCAqIC0xICsgJGN0eFtkaXJlY3Rpb25NZXRob2RNYXAueF07CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0b3A6IHJlY3QudG9wICsgc2Nyb2xsXzEudG9wIC0gJGN0eC5jbGllbnRUb3AsCiAgICAgICAgICAgIGxlZnQ6IHJlY3QubGVmdCArIHNjcm9sbF8xLmxlZnQgLSAkY3R4LmNsaWVudExlZnQKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiByZWN0OwogICAgICB9LCAiZ2V0T2Zmc2V0Iik7CiAgICAgIHZhciB3aGVlbEV2ZW50TmFtZSA9IChmdW5jdGlvbigpIHsKICAgICAgICBpZiAoIWNhblVzZURPTSkgewogICAgICAgICAgcmV0dXJuICJ3aGVlbCI7CiAgICAgICAgfQogICAgICAgIHJldHVybiAib253aGVlbCIgaW4gZG9jdW1lbnQgPyAid2hlZWwiIDogIm1vdXNld2hlZWwiOwogICAgICB9KSgpOwogICAgICB2YXIgZXZlbnROYW1lID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihuYW1lKSB7CiAgICAgICAgcmV0dXJuIG5hbWUgPT09ICJ3aGVlbCIgPyB3aGVlbEV2ZW50TmFtZSA6IG5hbWU7CiAgICAgIH0sICJldmVudE5hbWUiKTsKICAgICAgdmFyIGFwcGx5ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigkZWwsIG1ldGhvZCwgZXZlbnQsIGxpc3RlbmVyLCBwYXNzaXZlKSB7CiAgICAgICAgZXZlbnQuc3BsaXQoIiAiKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpIHsKICAgICAgICAgICRlbFttZXRob2RdKGV2ZW50TmFtZShuYW1lKSwgbGlzdGVuZXIsIGNhblVzZVBhc3NpdmVPcHRpb24gPyB7IHBhc3NpdmUgfSA6IGZhbHNlKTsKICAgICAgICB9KTsKICAgICAgfSwgImFwcGx5Iik7CiAgICAgIHZhciBhZGRFdmVudCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oJGVsLCBldmVudCwgbGlzdGVuZXIsIHBhc3NpdmUpIHsKICAgICAgICByZXR1cm4gYXBwbHkoJGVsLCAiYWRkRXZlbnRMaXN0ZW5lciIsIGV2ZW50LCBsaXN0ZW5lciwgcGFzc2l2ZSk7CiAgICAgIH0sICJhZGRFdmVudCIpOwogICAgICB2YXIgcmVtb3ZlRXZlbnQgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCRlbCwgZXZlbnQsIGxpc3RlbmVyLCBwYXNzaXZlKSB7CiAgICAgICAgcmV0dXJuIGFwcGx5KCRlbCwgInJlbW92ZUV2ZW50TGlzdGVuZXIiLCBldmVudCwgbGlzdGVuZXIsIHBhc3NpdmUpOwogICAgICB9LCAicmVtb3ZlRXZlbnQiKTsKICAgICAgdmFyIHJlUmVsYXRpdmVUb2tlbiA9IC9eKFwrfC0pPShcZCsoPzpcLlxkKyk/KSQvOwogICAgICB2YXIgcGFyc2VDb29yZGluYXRlID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihjb29yZGluYXRlLCBlbmFibGVWZXJ0aWNhbCkgewogICAgICAgIHZhciByZXMgPSB7IHRvcDogMCwgbGVmdDogMCwgcmVsYXRpdmU6IGZhbHNlIH07CiAgICAgICAgaWYgKGhhc1Byb3AoY29vcmRpbmF0ZSwgInRvcCIpIHx8IGhhc1Byb3AoY29vcmRpbmF0ZSwgImxlZnQiKSkgewogICAgICAgICAgcmVzID0gX19hc3NpZ24yKHt9LCByZXMsIGNvb3JkaW5hdGUpOwogICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheTUoY29vcmRpbmF0ZSkpIHsKICAgICAgICAgIGlmIChjb29yZGluYXRlLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgcmVzLnRvcCA9IGNvb3JkaW5hdGVbMF07CiAgICAgICAgICAgIHJlcy5sZWZ0ID0gY29vcmRpbmF0ZVsxXTsKICAgICAgICAgIH0gZWxzZSBpZiAoY29vcmRpbmF0ZS5sZW5ndGggPT09IDEpIHsKICAgICAgICAgICAgcmVzLnRvcCA9IGVuYWJsZVZlcnRpY2FsID8gY29vcmRpbmF0ZVswXSA6IDA7CiAgICAgICAgICAgIHJlcy5sZWZ0ID0gIWVuYWJsZVZlcnRpY2FsID8gY29vcmRpbmF0ZVswXSA6IDA7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGlzTnVtZXJpYyhjb29yZGluYXRlKSkgewogICAgICAgICAgaWYgKGVuYWJsZVZlcnRpY2FsKSB7CiAgICAgICAgICAgIHJlcy50b3AgPSBjb29yZGluYXRlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVzLmxlZnQgPSBjb29yZGluYXRlOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoaXNTdHJpbmczKGNvb3JkaW5hdGUpKSB7CiAgICAgICAgICB2YXIgbTUgPSBjb29yZGluYXRlLnRyaW0oKS5tYXRjaChyZVJlbGF0aXZlVG9rZW4pOwogICAgICAgICAgaWYgKCFtNSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBvcCA9IG01WzFdOwogICAgICAgICAgdmFyIHZhbCA9IHBhcnNlSW50KG01WzJdLCAxMCk7CiAgICAgICAgICBpZiAob3AgPT09ICIrIikgewogICAgICAgICAgICByZXMudG9wID0gZW5hYmxlVmVydGljYWwgPyB2YWwgOiAwOwogICAgICAgICAgICByZXMubGVmdCA9ICFlbmFibGVWZXJ0aWNhbCA/IHZhbCA6IDA7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXMudG9wID0gZW5hYmxlVmVydGljYWwgPyAtdmFsIDogMDsKICAgICAgICAgICAgcmVzLmxlZnQgPSAhZW5hYmxlVmVydGljYWwgPyAtdmFsIDogMDsKICAgICAgICAgIH0KICAgICAgICAgIHJlcy5yZWxhdGl2ZSA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzOwogICAgICB9LCAicGFyc2VDb29yZGluYXRlIik7CiAgICAgIHZhciBkZWZhdWx0T3B0aW9uczIgPSB7CiAgICAgICAgdHJpZ2dlcjogIltkYXRhLXNjcm9sbF0iLAogICAgICAgIGhlYWRlcjogIltkYXRhLXNjcm9sbC1oZWFkZXJdIiwKICAgICAgICBkdXJhdGlvbjogMWUzLAogICAgICAgIGVhc2luZzogImVhc2VPdXRRdWludCIsCiAgICAgICAgb2Zmc2V0OiAwLAogICAgICAgIHZlcnRpY2FsOiB0cnVlLAogICAgICAgIGhvcml6b250YWw6IGZhbHNlLAogICAgICAgIGNhbmNlbGxhYmxlOiB0cnVlLAogICAgICAgIHVwZGF0ZVVSTDogZmFsc2UsCiAgICAgICAgcHJldmVudERlZmF1bHQ6IHRydWUsCiAgICAgICAgc3RvcFByb3BhZ2F0aW9uOiB0cnVlLAogICAgICAgIC8vIENhbGxiYWNrcwogICAgICAgIGJlZm9yZTogbnVsbCwKICAgICAgICBhZnRlcjogbnVsbCwKICAgICAgICBjYW5jZWw6IG51bGwsCiAgICAgICAgY29tcGxldGU6IG51bGwsCiAgICAgICAgc3RlcDogbnVsbAogICAgICB9OwogICAgICB2YXIgQ09OVEFJTkVSX0NMSUNLX0VWRU5UID0gImNsaWNrIjsKICAgICAgdmFyIENPTlRBSU5FUl9TVE9QX0VWRU5UID0gIndoZWVsIHRvdWNoc3RhcnQgdG91Y2htb3ZlIjsKICAgICAgdmFyIFN3ZWV0U2Nyb2xsMyA9ICgKICAgICAgICAvKiogQGNsYXNzICovCiAgICAgICAgKGZ1bmN0aW9uKCkgewogICAgICAgICAgZnVuY3Rpb24gU3dlZXRTY3JvbGw0KG9wdGlvbnMsIGNvbnRhaW5lcikgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICB0aGlzLiRlbCA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuY3R4ID0gewogICAgICAgICAgICAgICR0cmlnZ2VyOiBudWxsLAogICAgICAgICAgICAgIG9wdHM6IG51bGwsCiAgICAgICAgICAgICAgcHJvZ3Jlc3M6IGZhbHNlLAogICAgICAgICAgICAgIHBvczogbnVsbCwKICAgICAgICAgICAgICBzdGFydFBvczogbnVsbCwKICAgICAgICAgICAgICBlYXNpbmc6IG51bGwsCiAgICAgICAgICAgICAgc3RhcnQ6IDAsCiAgICAgICAgICAgICAgaWQ6IDAsCiAgICAgICAgICAgICAgY2FuY2VsOiBmYWxzZSwKICAgICAgICAgICAgICBoYXNoOiBudWxsCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMubG9vcCA9IGZ1bmN0aW9uKHRpbWUpIHsKICAgICAgICAgICAgICB2YXIgX2EyID0gX3RoaXMsICRlbCA9IF9hMi4kZWwsIGN0eCA9IF9hMi5jdHg7CiAgICAgICAgICAgICAgaWYgKCFjdHguc3RhcnQpIHsKICAgICAgICAgICAgICAgIGN0eC5zdGFydCA9IHRpbWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmICghY3R4LnByb2dyZXNzIHx8ICEkZWwpIHsKICAgICAgICAgICAgICAgIF90aGlzLnN0b3AoKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdmFyIG9wdGlvbnMyID0gY3R4Lm9wdHM7CiAgICAgICAgICAgICAgdmFyIG9mZnNldCA9IGN0eC5wb3M7CiAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gY3R4LnN0YXJ0OwogICAgICAgICAgICAgIHZhciBzdGFydE9mZnNldCA9IGN0eC5zdGFydFBvczsKICAgICAgICAgICAgICB2YXIgZWFzaW5nID0gY3R4LmVhc2luZzsKICAgICAgICAgICAgICB2YXIgZHVyYXRpb24gPSBvcHRpb25zMi5kdXJhdGlvbjsKICAgICAgICAgICAgICB2YXIgZGlyZWN0aW9uTWFwID0geyB0b3A6ICJ5IiwgbGVmdDogIngiIH07CiAgICAgICAgICAgICAgdmFyIHRpbWVFbGFwc2VkID0gdGltZSAtIHN0YXJ0OwogICAgICAgICAgICAgIHZhciB0OCA9IE1hdGgubWluKDEsIE1hdGgubWF4KHRpbWVFbGFwc2VkIC8gZHVyYXRpb24sIDApKTsKICAgICAgICAgICAgICBPYmplY3Qua2V5cyhvZmZzZXQpLmZvckVhY2goZnVuY3Rpb24oa2V5MikgewogICAgICAgICAgICAgICAgdmFyIHZhbHVlMiA9IG9mZnNldFtrZXkyXTsKICAgICAgICAgICAgICAgIHZhciBpbml0aWFsID0gc3RhcnRPZmZzZXRba2V5Ml07CiAgICAgICAgICAgICAgICB2YXIgZGVsdGEgPSB2YWx1ZTIgLSBpbml0aWFsOwogICAgICAgICAgICAgICAgaWYgKGRlbHRhICE9PSAwKSB7CiAgICAgICAgICAgICAgICAgIHZhciB2YWwgPSBlYXNpbmcodDgsIGR1cmF0aW9uICogdDgsIDAsIDEsIGR1cmF0aW9uKTsKICAgICAgICAgICAgICAgICAgc2V0U2Nyb2xsKCRlbCwgTWF0aC5yb3VuZChpbml0aWFsICsgZGVsdGEgKiB2YWwpLCBkaXJlY3Rpb25NYXBba2V5Ml0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIGlmICh0aW1lRWxhcHNlZCA8PSBkdXJhdGlvbikgewogICAgICAgICAgICAgICAgX3RoaXMuaG9vayhvcHRpb25zMiwgInN0ZXAiLCB0OCk7CiAgICAgICAgICAgICAgICBjdHguaWQgPSBTd2VldFNjcm9sbDQucmFmKF90aGlzLmxvb3ApOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBfdGhpcy5zdG9wKHRydWUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGhpcy5oYW5kbGVDbGljayA9IGZ1bmN0aW9uKGUxMCkgewogICAgICAgICAgICAgIHZhciBvcHRzID0gX3RoaXMub3B0czsKICAgICAgICAgICAgICB2YXIgJGVsID0gZTEwLnRhcmdldDsKICAgICAgICAgICAgICBmb3IgKDsgJGVsICYmICRlbCAhPT0gZG9jdW1lbnQ7ICRlbCA9ICRlbC5wYXJlbnROb2RlKSB7CiAgICAgICAgICAgICAgICBpZiAoIW1hdGNoZXMoJGVsLCBvcHRzLnRyaWdnZXIpKSB7CiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGRhdGFPcHRpb25zID0gSlNPTi5wYXJzZSgkZWwuZ2V0QXR0cmlidXRlKCJkYXRhLXNjcm9sbC1vcHRpb25zIikgfHwgInt9Iik7CiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9ICRlbC5nZXRBdHRyaWJ1dGUoImRhdGEtc2Nyb2xsIik7CiAgICAgICAgICAgICAgICB2YXIgdG8gPSBkYXRhIHx8ICRlbC5nZXRBdHRyaWJ1dGUoImhyZWYiKTsKICAgICAgICAgICAgICAgIHZhciBvcHRpb25zMiA9IF9fYXNzaWduMih7fSwgb3B0cywgZGF0YU9wdGlvbnMpOwogICAgICAgICAgICAgICAgdmFyIHByZXZlbnREZWZhdWx0ID0gb3B0aW9uczIucHJldmVudERlZmF1bHQsIHN0b3BQcm9wYWdhdGlvbiA9IG9wdGlvbnMyLnN0b3BQcm9wYWdhdGlvbiwgdmVydGljYWwgPSBvcHRpb25zMi52ZXJ0aWNhbCwgaG9yaXpvbnRhbCA9IG9wdGlvbnMyLmhvcml6b250YWw7CiAgICAgICAgICAgICAgICBpZiAocHJldmVudERlZmF1bHQpIHsKICAgICAgICAgICAgICAgICAgZTEwLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc3RvcFByb3BhZ2F0aW9uKSB7CiAgICAgICAgICAgICAgICAgIGUxMC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF90aGlzLmN0eC4kdHJpZ2dlciA9ICRlbDsKICAgICAgICAgICAgICAgIGlmIChob3Jpem9udGFsICYmIHZlcnRpY2FsKSB7CiAgICAgICAgICAgICAgICAgIF90aGlzLnRvKHRvLCBvcHRpb25zMik7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZlcnRpY2FsKSB7CiAgICAgICAgICAgICAgICAgIF90aGlzLnRvVG9wKHRvLCBvcHRpb25zMik7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhvcml6b250YWwpIHsKICAgICAgICAgICAgICAgICAgX3RoaXMudG9MZWZ0KHRvLCBvcHRpb25zMik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuaGFuZGxlU3RvcCA9IGZ1bmN0aW9uKGUxMCkgewogICAgICAgICAgICAgIHZhciBjdHggPSBfdGhpcy5jdHg7CiAgICAgICAgICAgICAgdmFyIG9wdHMgPSBjdHgub3B0czsKICAgICAgICAgICAgICBpZiAob3B0cyAmJiBvcHRzLmNhbmNlbGxhYmxlKSB7CiAgICAgICAgICAgICAgICBjdHguY2FuY2VsID0gdHJ1ZTsKICAgICAgICAgICAgICAgIF90aGlzLnN0b3AoKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZTEwLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLm9wdHMgPSBfX2Fzc2lnbjIoe30sIGRlZmF1bHRPcHRpb25zMiwgb3B0aW9ucyB8fCB7fSk7CiAgICAgICAgICAgIHZhciAkY29udGFpbmVyID0gbnVsbDsKICAgICAgICAgICAgaWYgKGNhblVzZURPTSkgewogICAgICAgICAgICAgIGlmICh0eXBlb2YgY29udGFpbmVyID09PSAic3RyaW5nIikgewogICAgICAgICAgICAgICAgJGNvbnRhaW5lciA9ICQzKGNvbnRhaW5lcik7CiAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb250YWluZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgJGNvbnRhaW5lciA9IGNvbnRhaW5lcjsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGNvbnRhaW5lciA9IHdpbmRvdzsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy4kZWwgPSAkY29udGFpbmVyOwogICAgICAgICAgICBpZiAoJGNvbnRhaW5lcikgewogICAgICAgICAgICAgIHRoaXMuYmluZCh0cnVlLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIF9fbmFtZShTd2VldFNjcm9sbDQsICJTd2VldFNjcm9sbCIpOwogICAgICAgICAgU3dlZXRTY3JvbGw0LmNyZWF0ZSA9IGZ1bmN0aW9uKG9wdGlvbnMsIGNvbnRhaW5lcikgewogICAgICAgICAgICByZXR1cm4gbmV3IFN3ZWV0U2Nyb2xsNChvcHRpb25zLCBjb250YWluZXIpOwogICAgICAgICAgfTsKICAgICAgICAgIFN3ZWV0U2Nyb2xsNC5wcm90b3R5cGUudG8gPSBmdW5jdGlvbihkaXN0YW5jZSwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIWNhblVzZURPTSkgewogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgX2EyID0gdGhpcywgJGVsID0gX2EyLiRlbCwgY3R4ID0gX2EyLmN0eCwgY3VycmVudE9wdGlvbnMgPSBfYTIub3B0czsKICAgICAgICAgICAgdmFyICR0cmlnZ2VyID0gY3R4LiR0cmlnZ2VyOwogICAgICAgICAgICB2YXIgb3B0cyA9IF9fYXNzaWduMih7fSwgY3VycmVudE9wdGlvbnMsIG9wdGlvbnMgfHwge30pOwogICAgICAgICAgICB2YXIgb3B0T2Zmc2V0ID0gb3B0cy5vZmZzZXQsIHZlcnRpY2FsID0gb3B0cy52ZXJ0aWNhbCwgaG9yaXpvbnRhbCA9IG9wdHMuaG9yaXpvbnRhbDsKICAgICAgICAgICAgdmFyICRoZWFkZXIgPSBpc0VsZW1lbnQob3B0cy5oZWFkZXIpID8gb3B0cy5oZWFkZXIgOiAkMyhvcHRzLmhlYWRlcik7CiAgICAgICAgICAgIHZhciByZWcgPSAvXiMvOwogICAgICAgICAgICB2YXIgaGFzaCA9IGlzU3RyaW5nMyhkaXN0YW5jZSkgJiYgcmVnLnRlc3QoZGlzdGFuY2UpID8gZGlzdGFuY2UgOiBudWxsOwogICAgICAgICAgICBjdHgub3B0cyA9IG9wdHM7CiAgICAgICAgICAgIGN0eC5jYW5jZWwgPSBmYWxzZTsKICAgICAgICAgICAgY3R4Lmhhc2ggPSBoYXNoOwogICAgICAgICAgICB0aGlzLnN0b3AoKTsKICAgICAgICAgICAgaWYgKCEkZWwpIHsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIG9mZnNldCA9IHBhcnNlQ29vcmRpbmF0ZShvcHRPZmZzZXQsIHZlcnRpY2FsKTsKICAgICAgICAgICAgdmFyIGNvb3JkaW5hdGUgPSBwYXJzZUNvb3JkaW5hdGUoZGlzdGFuY2UsIHZlcnRpY2FsKTsKICAgICAgICAgICAgdmFyIHNjcm9sbCA9IHsgdG9wOiAwLCBsZWZ0OiAwIH07CiAgICAgICAgICAgIGlmIChjb29yZGluYXRlKSB7CiAgICAgICAgICAgICAgaWYgKGNvb3JkaW5hdGUucmVsYXRpdmUpIHsKICAgICAgICAgICAgICAgIHZhciBjdXJyZW50ID0gZ2V0U2Nyb2xsKCRlbCwgdmVydGljYWwgPyAieSIgOiAieCIpOwogICAgICAgICAgICAgICAgc2Nyb2xsLnRvcCA9IHZlcnRpY2FsID8gY3VycmVudCArIGNvb3JkaW5hdGUudG9wIDogY29vcmRpbmF0ZS50b3A7CiAgICAgICAgICAgICAgICBzY3JvbGwubGVmdCA9ICF2ZXJ0aWNhbCA/IGN1cnJlbnQgKyBjb29yZGluYXRlLmxlZnQgOiBjb29yZGluYXRlLmxlZnQ7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHNjcm9sbCA9IGNvb3JkaW5hdGU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKGlzU3RyaW5nMyhkaXN0YW5jZSkgJiYgZGlzdGFuY2UgIT09ICIjIikgewogICAgICAgICAgICAgIHZhciAkdGFyZ2V0ID0gJDMoZGlzdGFuY2UpOwogICAgICAgICAgICAgIGlmICghJHRhcmdldCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBzY3JvbGwgPSBnZXRPZmZzZXQoJHRhcmdldCwgJGVsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAob2Zmc2V0KSB7CiAgICAgICAgICAgICAgc2Nyb2xsLnRvcCArPSBvZmZzZXQudG9wOwogICAgICAgICAgICAgIHNjcm9sbC5sZWZ0ICs9IG9mZnNldC5sZWZ0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkaGVhZGVyKSB7CiAgICAgICAgICAgICAgc2Nyb2xsLnRvcCA9IE1hdGgubWF4KDAsIHNjcm9sbC50b3AgLSBnZXRTaXplKCRoZWFkZXIpLmhlaWdodCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIF9iID0gZ2V0Vmlld3BvcnRBbmRFbGVtZW50U2l6ZXMoJGVsKSwgdmlld3BvcnQgPSBfYi52aWV3cG9ydCwgc2l6ZSA9IF9iLnNpemU7CiAgICAgICAgICAgIHNjcm9sbC50b3AgPSB2ZXJ0aWNhbCA/IE1hdGgubWF4KDAsIE1hdGgubWluKHNpemUuaGVpZ2h0IC0gdmlld3BvcnQuaGVpZ2h0LCBzY3JvbGwudG9wKSkgOiBnZXRTY3JvbGwoJGVsLCAieSIpOwogICAgICAgICAgICBzY3JvbGwubGVmdCA9IGhvcml6b250YWwgPyBNYXRoLm1heCgwLCBNYXRoLm1pbihzaXplLndpZHRoIC0gdmlld3BvcnQud2lkdGgsIHNjcm9sbC5sZWZ0KSkgOiBnZXRTY3JvbGwoJGVsLCAieCIpOwogICAgICAgICAgICBpZiAodGhpcy5ob29rKG9wdHMsICJiZWZvcmUiLCBzY3JvbGwsICR0cmlnZ2VyKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICBjdHgub3B0cyA9IG51bGw7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGN0eC5wb3MgPSBzY3JvbGw7CiAgICAgICAgICAgIHRoaXMuc3RhcnQob3B0cyk7CiAgICAgICAgICAgIHRoaXMuYmluZChmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICB9OwogICAgICAgICAgU3dlZXRTY3JvbGw0LnByb3RvdHlwZS50b1RvcCA9IGZ1bmN0aW9uKGRpc3RhbmNlLCBvcHRpb25zKSB7CiAgICAgICAgICAgIHRoaXMudG8oZGlzdGFuY2UsIF9fYXNzaWduMih7fSwgb3B0aW9ucyB8fCB7fSwgeyB2ZXJ0aWNhbDogdHJ1ZSwgaG9yaXpvbnRhbDogZmFsc2UgfSkpOwogICAgICAgICAgfTsKICAgICAgICAgIFN3ZWV0U2Nyb2xsNC5wcm90b3R5cGUudG9MZWZ0ID0gZnVuY3Rpb24oZGlzdGFuY2UsIG9wdGlvbnMpIHsKICAgICAgICAgICAgdGhpcy50byhkaXN0YW5jZSwgX19hc3NpZ24yKHt9LCBvcHRpb25zIHx8IHt9LCB7IHZlcnRpY2FsOiBmYWxzZSwgaG9yaXpvbnRhbDogdHJ1ZSB9KSk7CiAgICAgICAgICB9OwogICAgICAgICAgU3dlZXRTY3JvbGw0LnByb3RvdHlwZS50b0VsZW1lbnQgPSBmdW5jdGlvbigkZWxlbWVudCwgb3B0aW9ucykgewogICAgICAgICAgICB2YXIgJGVsID0gdGhpcy4kZWw7CiAgICAgICAgICAgIGlmICghY2FuVXNlRE9NIHx8ICEkZWwpIHsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy50byhnZXRPZmZzZXQoJGVsZW1lbnQsICRlbCksIG9wdGlvbnMgfHwge30pOwogICAgICAgICAgfTsKICAgICAgICAgIFN3ZWV0U2Nyb2xsNC5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uKGdvdG9FbmQpIHsKICAgICAgICAgICAgaWYgKGdvdG9FbmQgPT09IHZvaWQgMCkgewogICAgICAgICAgICAgIGdvdG9FbmQgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgX2EyID0gdGhpcywgJGVsID0gX2EyLiRlbCwgY3R4ID0gX2EyLmN0eDsKICAgICAgICAgICAgdmFyIHBvcyA9IGN0eC5wb3M7CiAgICAgICAgICAgIGlmICghJGVsIHx8ICFjdHgucHJvZ3Jlc3MpIHsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgU3dlZXRTY3JvbGw0LmNhZihjdHguaWQpOwogICAgICAgICAgICBjdHgucHJvZ3Jlc3MgPSBmYWxzZTsKICAgICAgICAgICAgY3R4LnN0YXJ0ID0gMDsKICAgICAgICAgICAgY3R4LmlkID0gMDsKICAgICAgICAgICAgaWYgKGdvdG9FbmQgJiYgcG9zKSB7CiAgICAgICAgICAgICAgc2V0U2Nyb2xsKCRlbCwgcG9zLmxlZnQsICJ4Iik7CiAgICAgICAgICAgICAgc2V0U2Nyb2xsKCRlbCwgcG9zLnRvcCwgInkiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmNvbXBsZXRlKCk7CiAgICAgICAgICB9OwogICAgICAgICAgU3dlZXRTY3JvbGw0LnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgICAgICAgICAgIGlmICh0aGlzLiRlbCkgewogICAgICAgICAgICAgIHZhciBvcHRzID0gX19hc3NpZ24yKHt9LCB0aGlzLm9wdHMsIG9wdGlvbnMpOwogICAgICAgICAgICAgIHRoaXMuc3RvcCgpOwogICAgICAgICAgICAgIHRoaXMudW5iaW5kKHRydWUsIHRydWUpOwogICAgICAgICAgICAgIHRoaXMub3B0cyA9IG9wdHM7CiAgICAgICAgICAgICAgdGhpcy5iaW5kKHRydWUsIGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfTsKICAgICAgICAgIFN3ZWV0U2Nyb2xsNC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAodGhpcy4kZWwpIHsKICAgICAgICAgICAgICB0aGlzLnN0b3AoKTsKICAgICAgICAgICAgICB0aGlzLnVuYmluZCh0cnVlLCB0cnVlKTsKICAgICAgICAgICAgICB0aGlzLiRlbCA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgIH07CiAgICAgICAgICBTd2VldFNjcm9sbDQucHJvdG90eXBlLm9uQmVmb3JlID0gZnVuY3Rpb24oXzMsIF9fKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfTsKICAgICAgICAgIFN3ZWV0U2Nyb2xsNC5wcm90b3R5cGUub25TdGVwID0gZnVuY3Rpb24oXzMpIHsKICAgICAgICAgIH07CiAgICAgICAgICBTd2VldFNjcm9sbDQucHJvdG90eXBlLm9uQWZ0ZXIgPSBmdW5jdGlvbihfMywgX18pIHsKICAgICAgICAgIH07CiAgICAgICAgICBTd2VldFNjcm9sbDQucHJvdG90eXBlLm9uQ2FuY2VsID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICB9OwogICAgICAgICAgU3dlZXRTY3JvbGw0LnByb3RvdHlwZS5vbkNvbXBsZXRlID0gZnVuY3Rpb24oXzMpIHsKICAgICAgICAgIH07CiAgICAgICAgICBTd2VldFNjcm9sbDQucHJvdG90eXBlLnN0YXJ0ID0gZnVuY3Rpb24ob3B0cykgewogICAgICAgICAgICB2YXIgY3R4ID0gdGhpcy5jdHg7CiAgICAgICAgICAgIGN0eC5vcHRzID0gb3B0czsKICAgICAgICAgICAgY3R4LnByb2dyZXNzID0gdHJ1ZTsKICAgICAgICAgICAgY3R4LmVhc2luZyA9IGlzRnVuY3Rpb24yKG9wdHMuZWFzaW5nKSA/IG9wdHMuZWFzaW5nIDogZWFzaW5nc1tvcHRzLmVhc2luZ107CiAgICAgICAgICAgIHZhciAkY29udGFpbmVyID0gdGhpcy4kZWw7CiAgICAgICAgICAgIHZhciBzdGFydCA9IHsKICAgICAgICAgICAgICB0b3A6IGdldFNjcm9sbCgkY29udGFpbmVyLCAieSIpLAogICAgICAgICAgICAgIGxlZnQ6IGdldFNjcm9sbCgkY29udGFpbmVyLCAieCIpCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGN0eC5zdGFydFBvcyA9IHN0YXJ0OwogICAgICAgICAgICBjdHguaWQgPSBTd2VldFNjcm9sbDQucmFmKHRoaXMubG9vcCk7CiAgICAgICAgICB9OwogICAgICAgICAgU3dlZXRTY3JvbGw0LnByb3RvdHlwZS5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgX2EyID0gdGhpcywgJGVsID0gX2EyLiRlbCwgY3R4ID0gX2EyLmN0eDsKICAgICAgICAgICAgdmFyIGhhc2ggPSBjdHguaGFzaCwgY2FuY2VsID0gY3R4LmNhbmNlbCwgb3B0cyA9IGN0eC5vcHRzLCBwb3MgPSBjdHgucG9zLCAkdHJpZ2dlciA9IGN0eC4kdHJpZ2dlcjsKICAgICAgICAgICAgaWYgKCEkZWwgfHwgIW9wdHMpIHsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGhhc2ggIT0gbnVsbCAmJiBoYXNoICE9PSB3aW5kb3cubG9jYXRpb24uaGFzaCkgewogICAgICAgICAgICAgIHZhciB1cGRhdGVVUkwgPSBvcHRzLnVwZGF0ZVVSTDsKICAgICAgICAgICAgICBpZiAoY2FuVXNlRE9NICYmIGNhblVzZUhpc3RvcnkgJiYgdXBkYXRlVVJMICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgd2luZG93Lmhpc3RvcnlbdXBkYXRlVVJMID09PSAicmVwbGFjZSIgPyAicmVwbGFjZVN0YXRlIiA6ICJwdXNoU3RhdGUiXShudWxsLCAiIiwgaGFzaCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMudW5iaW5kKGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgY3R4Lm9wdHMgPSBudWxsOwogICAgICAgICAgICBjdHguJHRyaWdnZXIgPSBudWxsOwogICAgICAgICAgICBpZiAoY2FuY2VsKSB7CiAgICAgICAgICAgICAgdGhpcy5ob29rKG9wdHMsICJjYW5jZWwiKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aGlzLmhvb2sob3B0cywgImFmdGVyIiwgcG9zLCAkdHJpZ2dlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5ob29rKG9wdHMsICJjb21wbGV0ZSIsIGNhbmNlbCk7CiAgICAgICAgICB9OwogICAgICAgICAgU3dlZXRTY3JvbGw0LnByb3RvdHlwZS5ob29rID0gZnVuY3Rpb24ob3B0aW9ucywgdHlwZTUpIHsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAyOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKICAgICAgICAgICAgICBhcmdzW19pIC0gMl0gPSBhcmd1bWVudHNbX2ldOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBfYTI7CiAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IG9wdGlvbnNbdHlwZTVdOwogICAgICAgICAgICB2YXIgY2FsbGJhY2tSZXN1bHQ7CiAgICAgICAgICAgIHZhciBtZXRob2RSZXN1bHQ7CiAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uMihjYWxsYmFjaykpIHsKICAgICAgICAgICAgICBjYWxsYmFja1Jlc3VsdCA9IGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3MuY29uY2F0KFt0aGlzXSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG1ldGhvZFJlc3VsdCA9IChfYTIgPSB0aGlzKVsib24iICsgKHR5cGU1WzBdLnRvVXBwZXJDYXNlKCkgKyB0eXBlNS5zbGljZSgxKSldLmFwcGx5KF9hMiwgYXJncyk7CiAgICAgICAgICAgIHJldHVybiBjYWxsYmFja1Jlc3VsdCAhPT0gdm9pZCAwID8gY2FsbGJhY2tSZXN1bHQgOiBtZXRob2RSZXN1bHQ7CiAgICAgICAgICB9OwogICAgICAgICAgU3dlZXRTY3JvbGw0LnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24oY2xpY2ssIHN0b3ApIHsKICAgICAgICAgICAgdmFyIF9hMiA9IHRoaXMsICRlbCA9IF9hMi4kZWwsIG9wdHMgPSBfYTIuY3R4Lm9wdHM7CiAgICAgICAgICAgIGlmICgkZWwpIHsKICAgICAgICAgICAgICBpZiAoY2xpY2spIHsKICAgICAgICAgICAgICAgIGFkZEV2ZW50KCRlbCwgQ09OVEFJTkVSX0NMSUNLX0VWRU5ULCB0aGlzLmhhbmRsZUNsaWNrLCBmYWxzZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChzdG9wKSB7CiAgICAgICAgICAgICAgICBhZGRFdmVudCgkZWwsIENPTlRBSU5FUl9TVE9QX0VWRU5ULCB0aGlzLmhhbmRsZVN0b3AsIG9wdHMgPyBvcHRzLmNhbmNlbGxhYmxlIDogdHJ1ZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9OwogICAgICAgICAgU3dlZXRTY3JvbGw0LnByb3RvdHlwZS51bmJpbmQgPSBmdW5jdGlvbihjbGljaywgc3RvcCkgewogICAgICAgICAgICB2YXIgX2EyID0gdGhpcywgJGVsID0gX2EyLiRlbCwgb3B0cyA9IF9hMi5jdHgub3B0czsKICAgICAgICAgICAgaWYgKCRlbCkgewogICAgICAgICAgICAgIGlmIChjbGljaykgewogICAgICAgICAgICAgICAgcmVtb3ZlRXZlbnQoJGVsLCBDT05UQUlORVJfQ0xJQ0tfRVZFTlQsIHRoaXMuaGFuZGxlQ2xpY2ssIGZhbHNlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHN0b3ApIHsKICAgICAgICAgICAgICAgIHJlbW92ZUV2ZW50KCRlbCwgQ09OVEFJTkVSX1NUT1BfRVZFTlQsIHRoaXMuaGFuZGxlU3RvcCwgb3B0cyA/IG9wdHMuY2FuY2VsbGFibGUgOiB0cnVlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH07CiAgICAgICAgICBTd2VldFNjcm9sbDQucmFmID0gcmFmOwogICAgICAgICAgU3dlZXRTY3JvbGw0LmNhZiA9IGNhZjsKICAgICAgICAgIHJldHVybiBTd2VldFNjcm9sbDQ7CiAgICAgICAgfSkoKQogICAgICApOwogICAgICByZXR1cm4gU3dlZXRTY3JvbGwzOwogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AbGl0K3JlYWN0aXZlLWVsZW1lbnRAMi4xLjIvbm9kZV9tb2R1bGVzL0BsaXQvcmVhY3RpdmUtZWxlbWVudC9jc3MtdGFnLmpzCnZhciB0ID0gZ2xvYmFsVGhpcywgZSA9IHQuU2hhZG93Um9vdCAmJiAodm9pZCAwID09PSB0LlNoYWR5Q1NTIHx8IHQuU2hhZHlDU1MubmF0aXZlU2hhZG93KSAmJiAiYWRvcHRlZFN0eWxlU2hlZXRzIiBpbiBEb2N1bWVudC5wcm90b3R5cGUgJiYgInJlcGxhY2UiIGluIENTU1N0eWxlU2hlZXQucHJvdG90eXBlLCBzID0gLyogQF9fUFVSRV9fICovIFN5bWJvbCgpLCBvID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7CnZhciBuID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIm4iKTsKICB9CiAgY29uc3RydWN0b3IodDgsIGUxMCwgbzEyKSB7CiAgICBpZiAodGhpcy5fJGNzc1Jlc3VsdCQgPSB0cnVlLCBvMTIgIT09IHMpIHRocm93IEVycm9yKCJDU1NSZXN1bHQgaXMgbm90IGNvbnN0cnVjdGFibGUuIFVzZSBgdW5zYWZlQ1NTYCBvciBgY3NzYCBpbnN0ZWFkLiIpOwogICAgdGhpcy5jc3NUZXh0ID0gdDgsIHRoaXMudCA9IGUxMDsKICB9CiAgZ2V0IHN0eWxlU2hlZXQoKSB7CiAgICBsZXQgdDggPSB0aGlzLm87CiAgICBjb25zdCBzOSA9IHRoaXMudDsKICAgIGlmIChlICYmIHZvaWQgMCA9PT0gdDgpIHsKICAgICAgY29uc3QgZTEwID0gdm9pZCAwICE9PSBzOSAmJiAxID09PSBzOS5sZW5ndGg7CiAgICAgIGUxMCAmJiAodDggPSBvLmdldChzOSkpLCB2b2lkIDAgPT09IHQ4ICYmICgodGhpcy5vID0gdDggPSBuZXcgQ1NTU3R5bGVTaGVldCgpKS5yZXBsYWNlU3luYyh0aGlzLmNzc1RleHQpLCBlMTAgJiYgby5zZXQoczksIHQ4KSk7CiAgICB9CiAgICByZXR1cm4gdDg7CiAgfQogIHRvU3RyaW5nKCkgewogICAgcmV0dXJuIHRoaXMuY3NzVGV4dDsKICB9Cn07CnZhciByID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgodDgpID0+IG5ldyBuKCJzdHJpbmciID09IHR5cGVvZiB0OCA/IHQ4IDogdDggKyAiIiwgdm9pZCAwLCBzKSwgInIiKSwgaSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHQ4LCAuLi5lMTApID0+IHsKICBjb25zdCBvMTIgPSAxID09PSB0OC5sZW5ndGggPyB0OFswXSA6IGUxMC5yZWR1Y2UoKGUxMSwgczksIG8xMykgPT4gZTExICsgKCh0OSkgPT4gewogICAgaWYgKHRydWUgPT09IHQ5Ll8kY3NzUmVzdWx0JCkgcmV0dXJuIHQ5LmNzc1RleHQ7CiAgICBpZiAoIm51bWJlciIgPT0gdHlwZW9mIHQ5KSByZXR1cm4gdDk7CiAgICB0aHJvdyBFcnJvcigiVmFsdWUgcGFzc2VkIHRvICdjc3MnIGZ1bmN0aW9uIG11c3QgYmUgYSAnY3NzJyBmdW5jdGlvbiByZXN1bHQ6ICIgKyB0OSArICIuIFVzZSAndW5zYWZlQ1NTJyB0byBwYXNzIG5vbi1saXRlcmFsIHZhbHVlcywgYnV0IHRha2UgY2FyZSB0byBlbnN1cmUgcGFnZSBzZWN1cml0eS4iKTsKICB9KShzOSkgKyB0OFtvMTMgKyAxXSwgdDhbMF0pOwogIHJldHVybiBuZXcgbihvMTIsIHQ4LCBzKTsKfSwgImkiKSwgUyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHM5LCBvMTIpID0+IHsKICBpZiAoZSkgczkuYWRvcHRlZFN0eWxlU2hlZXRzID0gbzEyLm1hcCgodDgpID0+IHQ4IGluc3RhbmNlb2YgQ1NTU3R5bGVTaGVldCA/IHQ4IDogdDguc3R5bGVTaGVldCk7CiAgZWxzZSBmb3IgKGNvbnN0IGUxMCBvZiBvMTIpIHsKICAgIGNvbnN0IG8xMyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIiksIG4xMSA9IHQubGl0Tm9uY2U7CiAgICB2b2lkIDAgIT09IG4xMSAmJiBvMTMuc2V0QXR0cmlidXRlKCJub25jZSIsIG4xMSksIG8xMy50ZXh0Q29udGVudCA9IGUxMC5jc3NUZXh0LCBzOS5hcHBlbmRDaGlsZChvMTMpOwogIH0KfSwgIlMiKSwgYyA9IGUgPyAodDgpID0+IHQ4IDogKHQ4KSA9PiB0OCBpbnN0YW5jZW9mIENTU1N0eWxlU2hlZXQgPyAoKHQ5KSA9PiB7CiAgbGV0IGUxMCA9ICIiOwogIGZvciAoY29uc3Qgczkgb2YgdDkuY3NzUnVsZXMpIGUxMCArPSBzOS5jc3NUZXh0OwogIHJldHVybiByKGUxMCk7Cn0pKHQ4KSA6IHQ4OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BsaXQrcmVhY3RpdmUtZWxlbWVudEAyLjEuMi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L3JlYWN0aXZlLWVsZW1lbnQuanMKdmFyIHsgaXM6IGkyLCBkZWZpbmVQcm9wZXJ0eTogZTIsIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogaCwgZ2V0T3duUHJvcGVydHlOYW1lczogcjIsIGdldE93blByb3BlcnR5U3ltYm9sczogbzIsIGdldFByb3RvdHlwZU9mOiBuMiB9ID0gT2JqZWN0LCBhID0gZ2xvYmFsVGhpcywgYzIgPSBhLnRydXN0ZWRUeXBlcywgbCA9IGMyID8gYzIuZW1wdHlTY3JpcHQgOiAiIiwgcCA9IGEucmVhY3RpdmVFbGVtZW50UG9seWZpbGxTdXBwb3J0LCBkID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgodDgsIHM5KSA9PiB0OCwgImQiKSwgdSA9IHsgdG9BdHRyaWJ1dGUodDgsIHM5KSB7CiAgc3dpdGNoIChzOSkgewogICAgY2FzZSBCb29sZWFuOgogICAgICB0OCA9IHQ4ID8gbCA6IG51bGw7CiAgICAgIGJyZWFrOwogICAgY2FzZSBPYmplY3Q6CiAgICBjYXNlIEFycmF5OgogICAgICB0OCA9IG51bGwgPT0gdDggPyB0OCA6IEpTT04uc3RyaW5naWZ5KHQ4KTsKICB9CiAgcmV0dXJuIHQ4Owp9LCBmcm9tQXR0cmlidXRlKHQ4LCBzOSkgewogIGxldCBpMTAgPSB0ODsKICBzd2l0Y2ggKHM5KSB7CiAgICBjYXNlIEJvb2xlYW46CiAgICAgIGkxMCA9IG51bGwgIT09IHQ4OwogICAgICBicmVhazsKICAgIGNhc2UgTnVtYmVyOgogICAgICBpMTAgPSBudWxsID09PSB0OCA/IG51bGwgOiBOdW1iZXIodDgpOwogICAgICBicmVhazsKICAgIGNhc2UgT2JqZWN0OgogICAgY2FzZSBBcnJheToKICAgICAgdHJ5IHsKICAgICAgICBpMTAgPSBKU09OLnBhcnNlKHQ4KTsKICAgICAgfSBjYXRjaCAodDkpIHsKICAgICAgICBpMTAgPSBudWxsOwogICAgICB9CiAgfQogIHJldHVybiBpMTA7Cn0gfSwgZiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHQ4LCBzOSkgPT4gIWkyKHQ4LCBzOSksICJmIiksIGIgPSB7IGF0dHJpYnV0ZTogdHJ1ZSwgdHlwZTogU3RyaW5nLCBjb252ZXJ0ZXI6IHUsIHJlZmxlY3Q6IGZhbHNlLCB1c2VEZWZhdWx0OiBmYWxzZSwgaGFzQ2hhbmdlZDogZiB9OwpTeW1ib2wubWV0YWRhdGEgPz89IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2woIm1ldGFkYXRhIiksIGEubGl0UHJvcGVydHlNZXRhZGF0YSA/Pz0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7CnZhciB5ID0gY2xhc3MgZXh0ZW5kcyBIVE1MRWxlbWVudCB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAieSIpOwogIH0KICBzdGF0aWMgYWRkSW5pdGlhbGl6ZXIodDgpIHsKICAgIHRoaXMuXyRFaSgpLCAodGhpcy5sID8/PSBbXSkucHVzaCh0OCk7CiAgfQogIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkgewogICAgcmV0dXJuIHRoaXMuZmluYWxpemUoKSwgdGhpcy5fJEVoICYmIFsuLi50aGlzLl8kRWgua2V5cygpXTsKICB9CiAgc3RhdGljIGNyZWF0ZVByb3BlcnR5KHQ4LCBzOSA9IGIpIHsKICAgIGlmIChzOS5zdGF0ZSAmJiAoczkuYXR0cmlidXRlID0gZmFsc2UpLCB0aGlzLl8kRWkoKSwgdGhpcy5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkodDgpICYmICgoczkgPSBPYmplY3QuY3JlYXRlKHM5KSkud3JhcHBlZCA9IHRydWUpLCB0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzLnNldCh0OCwgczkpLCAhczkubm9BY2Nlc3NvcikgewogICAgICBjb25zdCBpMTAgPSAvKiBAX19QVVJFX18gKi8gU3ltYm9sKCksIGg3ID0gdGhpcy5nZXRQcm9wZXJ0eURlc2NyaXB0b3IodDgsIGkxMCwgczkpOwogICAgICB2b2lkIDAgIT09IGg3ICYmIGUyKHRoaXMucHJvdG90eXBlLCB0OCwgaDcpOwogICAgfQogIH0KICBzdGF0aWMgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKHQ4LCBzOSwgaTEwKSB7CiAgICBjb25zdCB7IGdldDogZTEwLCBzZXQ6IHIxMCB9ID0gaCh0aGlzLnByb3RvdHlwZSwgdDgpID8/IHsgZ2V0KCkgewogICAgICByZXR1cm4gdGhpc1tzOV07CiAgICB9LCBzZXQodDkpIHsKICAgICAgdGhpc1tzOV0gPSB0OTsKICAgIH0gfTsKICAgIHJldHVybiB7IGdldDogZTEwLCBzZXQoczEwKSB7CiAgICAgIGNvbnN0IGg3ID0gZTEwPy5jYWxsKHRoaXMpOwogICAgICByMTA/LmNhbGwodGhpcywgczEwKSwgdGhpcy5yZXF1ZXN0VXBkYXRlKHQ4LCBoNywgaTEwKTsKICAgIH0sIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgZW51bWVyYWJsZTogdHJ1ZSB9OwogIH0KICBzdGF0aWMgZ2V0UHJvcGVydHlPcHRpb25zKHQ4KSB7CiAgICByZXR1cm4gdGhpcy5lbGVtZW50UHJvcGVydGllcy5nZXQodDgpID8/IGI7CiAgfQogIHN0YXRpYyBfJEVpKCkgewogICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZCgiZWxlbWVudFByb3BlcnRpZXMiKSkpIHJldHVybjsKICAgIGNvbnN0IHQ4ID0gbjIodGhpcyk7CiAgICB0OC5maW5hbGl6ZSgpLCB2b2lkIDAgIT09IHQ4LmwgJiYgKHRoaXMubCA9IFsuLi50OC5sXSksIHRoaXMuZWxlbWVudFByb3BlcnRpZXMgPSBuZXcgTWFwKHQ4LmVsZW1lbnRQcm9wZXJ0aWVzKTsKICB9CiAgc3RhdGljIGZpbmFsaXplKCkgewogICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZCgiZmluYWxpemVkIikpKSByZXR1cm47CiAgICBpZiAodGhpcy5maW5hbGl6ZWQgPSB0cnVlLCB0aGlzLl8kRWkoKSwgdGhpcy5oYXNPd25Qcm9wZXJ0eShkKCJwcm9wZXJ0aWVzIikpKSB7CiAgICAgIGNvbnN0IHQ5ID0gdGhpcy5wcm9wZXJ0aWVzLCBzOSA9IFsuLi5yMih0OSksIC4uLm8yKHQ5KV07CiAgICAgIGZvciAoY29uc3QgaTEwIG9mIHM5KSB0aGlzLmNyZWF0ZVByb3BlcnR5KGkxMCwgdDlbaTEwXSk7CiAgICB9CiAgICBjb25zdCB0OCA9IHRoaXNbU3ltYm9sLm1ldGFkYXRhXTsKICAgIGlmIChudWxsICE9PSB0OCkgewogICAgICBjb25zdCBzOSA9IGxpdFByb3BlcnR5TWV0YWRhdGEuZ2V0KHQ4KTsKICAgICAgaWYgKHZvaWQgMCAhPT0gczkpIGZvciAoY29uc3QgW3Q5LCBpMTBdIG9mIHM5KSB0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzLnNldCh0OSwgaTEwKTsKICAgIH0KICAgIHRoaXMuXyRFaCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICBmb3IgKGNvbnN0IFt0OSwgczldIG9mIHRoaXMuZWxlbWVudFByb3BlcnRpZXMpIHsKICAgICAgY29uc3QgaTEwID0gdGhpcy5fJEV1KHQ5LCBzOSk7CiAgICAgIHZvaWQgMCAhPT0gaTEwICYmIHRoaXMuXyRFaC5zZXQoaTEwLCB0OSk7CiAgICB9CiAgICB0aGlzLmVsZW1lbnRTdHlsZXMgPSB0aGlzLmZpbmFsaXplU3R5bGVzKHRoaXMuc3R5bGVzKTsKICB9CiAgc3RhdGljIGZpbmFsaXplU3R5bGVzKHM5KSB7CiAgICBjb25zdCBpMTAgPSBbXTsKICAgIGlmIChBcnJheS5pc0FycmF5KHM5KSkgewogICAgICBjb25zdCBlMTAgPSBuZXcgU2V0KHM5LmZsYXQoMSAvIDApLnJldmVyc2UoKSk7CiAgICAgIGZvciAoY29uc3QgczEwIG9mIGUxMCkgaTEwLnVuc2hpZnQoYyhzMTApKTsKICAgIH0gZWxzZSB2b2lkIDAgIT09IHM5ICYmIGkxMC5wdXNoKGMoczkpKTsKICAgIHJldHVybiBpMTA7CiAgfQogIHN0YXRpYyBfJEV1KHQ4LCBzOSkgewogICAgY29uc3QgaTEwID0gczkuYXR0cmlidXRlOwogICAgcmV0dXJuIGZhbHNlID09PSBpMTAgPyB2b2lkIDAgOiAic3RyaW5nIiA9PSB0eXBlb2YgaTEwID8gaTEwIDogInN0cmluZyIgPT0gdHlwZW9mIHQ4ID8gdDgudG9Mb3dlckNhc2UoKSA6IHZvaWQgMDsKICB9CiAgY29uc3RydWN0b3IoKSB7CiAgICBzdXBlcigpLCB0aGlzLl8kRXAgPSB2b2lkIDAsIHRoaXMuaXNVcGRhdGVQZW5kaW5nID0gZmFsc2UsIHRoaXMuaGFzVXBkYXRlZCA9IGZhbHNlLCB0aGlzLl8kRW0gPSBudWxsLCB0aGlzLl8kRXYoKTsKICB9CiAgXyRFdigpIHsKICAgIHRoaXMuXyRFUyA9IG5ldyBQcm9taXNlKCh0OCkgPT4gdGhpcy5lbmFibGVVcGRhdGluZyA9IHQ4KSwgdGhpcy5fJEFMID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSwgdGhpcy5fJEVfKCksIHRoaXMucmVxdWVzdFVwZGF0ZSgpLCB0aGlzLmNvbnN0cnVjdG9yLmw/LmZvckVhY2goKHQ4KSA9PiB0OCh0aGlzKSk7CiAgfQogIGFkZENvbnRyb2xsZXIodDgpIHsKICAgICh0aGlzLl8kRU8gPz89IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCkpLmFkZCh0OCksIHZvaWQgMCAhPT0gdGhpcy5yZW5kZXJSb290ICYmIHRoaXMuaXNDb25uZWN0ZWQgJiYgdDguaG9zdENvbm5lY3RlZD8uKCk7CiAgfQogIHJlbW92ZUNvbnRyb2xsZXIodDgpIHsKICAgIHRoaXMuXyRFTz8uZGVsZXRlKHQ4KTsKICB9CiAgXyRFXygpIHsKICAgIGNvbnN0IHQ4ID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSwgczkgPSB0aGlzLmNvbnN0cnVjdG9yLmVsZW1lbnRQcm9wZXJ0aWVzOwogICAgZm9yIChjb25zdCBpMTAgb2Ygczkua2V5cygpKSB0aGlzLmhhc093blByb3BlcnR5KGkxMCkgJiYgKHQ4LnNldChpMTAsIHRoaXNbaTEwXSksIGRlbGV0ZSB0aGlzW2kxMF0pOwogICAgdDguc2l6ZSA+IDAgJiYgKHRoaXMuXyRFcCA9IHQ4KTsKICB9CiAgY3JlYXRlUmVuZGVyUm9vdCgpIHsKICAgIGNvbnN0IHQ4ID0gdGhpcy5zaGFkb3dSb290ID8/IHRoaXMuYXR0YWNoU2hhZG93KHRoaXMuY29uc3RydWN0b3Iuc2hhZG93Um9vdE9wdGlvbnMpOwogICAgcmV0dXJuIFModDgsIHRoaXMuY29uc3RydWN0b3IuZWxlbWVudFN0eWxlcyksIHQ4OwogIH0KICBjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgIHRoaXMucmVuZGVyUm9vdCA/Pz0gdGhpcy5jcmVhdGVSZW5kZXJSb290KCksIHRoaXMuZW5hYmxlVXBkYXRpbmcodHJ1ZSksIHRoaXMuXyRFTz8uZm9yRWFjaCgodDgpID0+IHQ4Lmhvc3RDb25uZWN0ZWQ/LigpKTsKICB9CiAgZW5hYmxlVXBkYXRpbmcodDgpIHsKICB9CiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICB0aGlzLl8kRU8/LmZvckVhY2goKHQ4KSA9PiB0OC5ob3N0RGlzY29ubmVjdGVkPy4oKSk7CiAgfQogIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayh0OCwgczksIGkxMCkgewogICAgdGhpcy5fJEFLKHQ4LCBpMTApOwogIH0KICBfJEVUKHQ4LCBzOSkgewogICAgY29uc3QgaTEwID0gdGhpcy5jb25zdHJ1Y3Rvci5lbGVtZW50UHJvcGVydGllcy5nZXQodDgpLCBlMTAgPSB0aGlzLmNvbnN0cnVjdG9yLl8kRXUodDgsIGkxMCk7CiAgICBpZiAodm9pZCAwICE9PSBlMTAgJiYgdHJ1ZSA9PT0gaTEwLnJlZmxlY3QpIHsKICAgICAgY29uc3QgaDcgPSAodm9pZCAwICE9PSBpMTAuY29udmVydGVyPy50b0F0dHJpYnV0ZSA/IGkxMC5jb252ZXJ0ZXIgOiB1KS50b0F0dHJpYnV0ZShzOSwgaTEwLnR5cGUpOwogICAgICB0aGlzLl8kRW0gPSB0OCwgbnVsbCA9PSBoNyA/IHRoaXMucmVtb3ZlQXR0cmlidXRlKGUxMCkgOiB0aGlzLnNldEF0dHJpYnV0ZShlMTAsIGg3KSwgdGhpcy5fJEVtID0gbnVsbDsKICAgIH0KICB9CiAgXyRBSyh0OCwgczkpIHsKICAgIGNvbnN0IGkxMCA9IHRoaXMuY29uc3RydWN0b3IsIGUxMCA9IGkxMC5fJEVoLmdldCh0OCk7CiAgICBpZiAodm9pZCAwICE9PSBlMTAgJiYgdGhpcy5fJEVtICE9PSBlMTApIHsKICAgICAgY29uc3QgdDkgPSBpMTAuZ2V0UHJvcGVydHlPcHRpb25zKGUxMCksIGg3ID0gImZ1bmN0aW9uIiA9PSB0eXBlb2YgdDkuY29udmVydGVyID8geyBmcm9tQXR0cmlidXRlOiB0OS5jb252ZXJ0ZXIgfSA6IHZvaWQgMCAhPT0gdDkuY29udmVydGVyPy5mcm9tQXR0cmlidXRlID8gdDkuY29udmVydGVyIDogdTsKICAgICAgdGhpcy5fJEVtID0gZTEwOwogICAgICBjb25zdCByMTAgPSBoNy5mcm9tQXR0cmlidXRlKHM5LCB0OS50eXBlKTsKICAgICAgdGhpc1tlMTBdID0gcjEwID8/IHRoaXMuXyRFaj8uZ2V0KGUxMCkgPz8gcjEwLCB0aGlzLl8kRW0gPSBudWxsOwogICAgfQogIH0KICByZXF1ZXN0VXBkYXRlKHQ4LCBzOSwgaTEwLCBlMTAgPSBmYWxzZSwgaDcpIHsKICAgIGlmICh2b2lkIDAgIT09IHQ4KSB7CiAgICAgIGNvbnN0IHIxMCA9IHRoaXMuY29uc3RydWN0b3I7CiAgICAgIGlmIChmYWxzZSA9PT0gZTEwICYmIChoNyA9IHRoaXNbdDhdKSwgaTEwID8/PSByMTAuZ2V0UHJvcGVydHlPcHRpb25zKHQ4KSwgISgoaTEwLmhhc0NoYW5nZWQgPz8gZikoaDcsIHM5KSB8fCBpMTAudXNlRGVmYXVsdCAmJiBpMTAucmVmbGVjdCAmJiBoNyA9PT0gdGhpcy5fJEVqPy5nZXQodDgpICYmICF0aGlzLmhhc0F0dHJpYnV0ZShyMTAuXyRFdSh0OCwgaTEwKSkpKSByZXR1cm47CiAgICAgIHRoaXMuQyh0OCwgczksIGkxMCk7CiAgICB9CiAgICBmYWxzZSA9PT0gdGhpcy5pc1VwZGF0ZVBlbmRpbmcgJiYgKHRoaXMuXyRFUyA9IHRoaXMuXyRFUCgpKTsKICB9CiAgQyh0OCwgczksIHsgdXNlRGVmYXVsdDogaTEwLCByZWZsZWN0OiBlMTAsIHdyYXBwZWQ6IGg3IH0sIHIxMCkgewogICAgaTEwICYmICEodGhpcy5fJEVqID8/PSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpKS5oYXModDgpICYmICh0aGlzLl8kRWouc2V0KHQ4LCByMTAgPz8gczkgPz8gdGhpc1t0OF0pLCB0cnVlICE9PSBoNyB8fCB2b2lkIDAgIT09IHIxMCkgfHwgKHRoaXMuXyRBTC5oYXModDgpIHx8ICh0aGlzLmhhc1VwZGF0ZWQgfHwgaTEwIHx8IChzOSA9IHZvaWQgMCksIHRoaXMuXyRBTC5zZXQodDgsIHM5KSksIHRydWUgPT09IGUxMCAmJiB0aGlzLl8kRW0gIT09IHQ4ICYmICh0aGlzLl8kRXEgPz89IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCkpLmFkZCh0OCkpOwogIH0KICBhc3luYyBfJEVQKCkgewogICAgdGhpcy5pc1VwZGF0ZVBlbmRpbmcgPSB0cnVlOwogICAgdHJ5IHsKICAgICAgYXdhaXQgdGhpcy5fJEVTOwogICAgfSBjYXRjaCAodDkpIHsKICAgICAgUHJvbWlzZS5yZWplY3QodDkpOwogICAgfQogICAgY29uc3QgdDggPSB0aGlzLnNjaGVkdWxlVXBkYXRlKCk7CiAgICByZXR1cm4gbnVsbCAhPSB0OCAmJiBhd2FpdCB0OCwgIXRoaXMuaXNVcGRhdGVQZW5kaW5nOwogIH0KICBzY2hlZHVsZVVwZGF0ZSgpIHsKICAgIHJldHVybiB0aGlzLnBlcmZvcm1VcGRhdGUoKTsKICB9CiAgcGVyZm9ybVVwZGF0ZSgpIHsKICAgIGlmICghdGhpcy5pc1VwZGF0ZVBlbmRpbmcpIHJldHVybjsKICAgIGlmICghdGhpcy5oYXNVcGRhdGVkKSB7CiAgICAgIGlmICh0aGlzLnJlbmRlclJvb3QgPz89IHRoaXMuY3JlYXRlUmVuZGVyUm9vdCgpLCB0aGlzLl8kRXApIHsKICAgICAgICBmb3IgKGNvbnN0IFt0MTAsIHMxMF0gb2YgdGhpcy5fJEVwKSB0aGlzW3QxMF0gPSBzMTA7CiAgICAgICAgdGhpcy5fJEVwID0gdm9pZCAwOwogICAgICB9CiAgICAgIGNvbnN0IHQ5ID0gdGhpcy5jb25zdHJ1Y3Rvci5lbGVtZW50UHJvcGVydGllczsKICAgICAgaWYgKHQ5LnNpemUgPiAwKSBmb3IgKGNvbnN0IFtzMTAsIGkxMF0gb2YgdDkpIHsKICAgICAgICBjb25zdCB7IHdyYXBwZWQ6IHQxMCB9ID0gaTEwLCBlMTAgPSB0aGlzW3MxMF07CiAgICAgICAgdHJ1ZSAhPT0gdDEwIHx8IHRoaXMuXyRBTC5oYXMoczEwKSB8fCB2b2lkIDAgPT09IGUxMCB8fCB0aGlzLkMoczEwLCB2b2lkIDAsIGkxMCwgZTEwKTsKICAgICAgfQogICAgfQogICAgbGV0IHQ4ID0gZmFsc2U7CiAgICBjb25zdCBzOSA9IHRoaXMuXyRBTDsKICAgIHRyeSB7CiAgICAgIHQ4ID0gdGhpcy5zaG91bGRVcGRhdGUoczkpLCB0OCA/ICh0aGlzLndpbGxVcGRhdGUoczkpLCB0aGlzLl8kRU8/LmZvckVhY2goKHQ5KSA9PiB0OS5ob3N0VXBkYXRlPy4oKSksIHRoaXMudXBkYXRlKHM5KSkgOiB0aGlzLl8kRU0oKTsKICAgIH0gY2F0Y2ggKHMxMCkgewogICAgICB0aHJvdyB0OCA9IGZhbHNlLCB0aGlzLl8kRU0oKSwgczEwOwogICAgfQogICAgdDggJiYgdGhpcy5fJEFFKHM5KTsKICB9CiAgd2lsbFVwZGF0ZSh0OCkgewogIH0KICBfJEFFKHQ4KSB7CiAgICB0aGlzLl8kRU8/LmZvckVhY2goKHQ5KSA9PiB0OS5ob3N0VXBkYXRlZD8uKCkpLCB0aGlzLmhhc1VwZGF0ZWQgfHwgKHRoaXMuaGFzVXBkYXRlZCA9IHRydWUsIHRoaXMuZmlyc3RVcGRhdGVkKHQ4KSksIHRoaXMudXBkYXRlZCh0OCk7CiAgfQogIF8kRU0oKSB7CiAgICB0aGlzLl8kQUwgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLCB0aGlzLmlzVXBkYXRlUGVuZGluZyA9IGZhbHNlOwogIH0KICBnZXQgdXBkYXRlQ29tcGxldGUoKSB7CiAgICByZXR1cm4gdGhpcy5nZXRVcGRhdGVDb21wbGV0ZSgpOwogIH0KICBnZXRVcGRhdGVDb21wbGV0ZSgpIHsKICAgIHJldHVybiB0aGlzLl8kRVM7CiAgfQogIHNob3VsZFVwZGF0ZSh0OCkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIHVwZGF0ZSh0OCkgewogICAgdGhpcy5fJEVxICYmPSB0aGlzLl8kRXEuZm9yRWFjaCgodDkpID0+IHRoaXMuXyRFVCh0OSwgdGhpc1t0OV0pKSwgdGhpcy5fJEVNKCk7CiAgfQogIHVwZGF0ZWQodDgpIHsKICB9CiAgZmlyc3RVcGRhdGVkKHQ4KSB7CiAgfQp9Owp5LmVsZW1lbnRTdHlsZXMgPSBbXSwgeS5zaGFkb3dSb290T3B0aW9ucyA9IHsgbW9kZTogIm9wZW4iIH0sIHlbZCgiZWxlbWVudFByb3BlcnRpZXMiKV0gPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLCB5W2QoImZpbmFsaXplZCIpXSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCksIHA/Lih7IFJlYWN0aXZlRWxlbWVudDogeSB9KSwgKGEucmVhY3RpdmVFbGVtZW50VmVyc2lvbnMgPz89IFtdKS5wdXNoKCIyLjEuMiIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2xpdC1odG1sQDMuMy4yL25vZGVfbW9kdWxlcy9saXQtaHRtbC9saXQtaHRtbC5qcwp2YXIgdDIgPSBnbG9iYWxUaGlzLCBpMyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHQ4KSA9PiB0OCwgImkiKSwgczIgPSB0Mi50cnVzdGVkVHlwZXMsIGUzID0gczIgPyBzMi5jcmVhdGVQb2xpY3koImxpdC1odG1sIiwgeyBjcmVhdGVIVE1MOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh0OCkgPT4gdDgsICJjcmVhdGVIVE1MIikgfSkgOiB2b2lkIDAsIGgyID0gIiRsaXQkIiwgbzMgPSBgbGl0JCR7TWF0aC5yYW5kb20oKS50b0ZpeGVkKDkpLnNsaWNlKDIpfSRgLCBuMyA9ICI/IiArIG8zLCByMyA9IGA8JHtuM30+YCwgbDIgPSBkb2N1bWVudCwgYzMgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCgpID0+IGwyLmNyZWF0ZUNvbW1lbnQoIiIpLCAiYyIpLCBhMiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHQ4KSA9PiBudWxsID09PSB0OCB8fCAib2JqZWN0IiAhPSB0eXBlb2YgdDggJiYgImZ1bmN0aW9uIiAhPSB0eXBlb2YgdDgsICJhIiksIHUyID0gQXJyYXkuaXNBcnJheSwgZDIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh0OCkgPT4gdTIodDgpIHx8ICJmdW5jdGlvbiIgPT0gdHlwZW9mIHQ4Py5bU3ltYm9sLml0ZXJhdG9yXSwgImQiKSwgZjIgPSAiWyAJXG5cZlxyXSIsIHYgPSAvPCg/OighLS18XC9bXmEtekEtWl0pfChcLz9bYS16QS1aXVtePlxzXSopfChcLz8kKSkvZywgXyA9IC8tLT4vZywgbSA9IC8+L2csIHAyID0gUmVnRXhwKGA+fCR7ZjJ9KD86KFteXFxzIic+PS9dKykoJHtmMn0qPSR7ZjJ9Kig/OlteIAkKXGZcciInXGA8Pj1dfCgifCcpfCkpfCQpYCwgImciKSwgZyA9IC8nL2csICQgPSAvIi9nLCB5MiA9IC9eKD86c2NyaXB0fHN0eWxlfHRleHRhcmVhfHRpdGxlKSQvaSwgeCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHQ4KSA9PiAoaTEwLCAuLi5zOSkgPT4gKHsgXyRsaXRUeXBlJDogdDgsIHN0cmluZ3M6IGkxMCwgdmFsdWVzOiBzOSB9KSwgIngiKSwgYjIgPSB4KDEpLCB3ID0geCgyKSwgVCA9IHgoMyksIEUgPSAvKiBAX19QVVJFX18gKi8gU3ltYm9sLmZvcigibGl0LW5vQ2hhbmdlIiksIEEgPSAvKiBAX19QVVJFX18gKi8gU3ltYm9sLmZvcigibGl0LW5vdGhpbmciKSwgQyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpLCBQID0gbDIuY3JlYXRlVHJlZVdhbGtlcihsMiwgMTI5KTsKZnVuY3Rpb24gVih0OCwgaTEwKSB7CiAgaWYgKCF1Mih0OCkgfHwgIXQ4Lmhhc093blByb3BlcnR5KCJyYXciKSkgdGhyb3cgRXJyb3IoImludmFsaWQgdGVtcGxhdGUgc3RyaW5ncyBhcnJheSIpOwogIHJldHVybiB2b2lkIDAgIT09IGUzID8gZTMuY3JlYXRlSFRNTChpMTApIDogaTEwOwp9Cl9fbmFtZShWLCAiViIpOwp2YXIgTiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHQ4LCBpMTApID0+IHsKICBjb25zdCBzOSA9IHQ4Lmxlbmd0aCAtIDEsIGUxMCA9IFtdOwogIGxldCBuMTEsIGw1ID0gMiA9PT0gaTEwID8gIjxzdmc+IiA6IDMgPT09IGkxMCA/ICI8bWF0aD4iIDogIiIsIGMxMCA9IHY7CiAgZm9yIChsZXQgaTExID0gMDsgaTExIDwgczk7IGkxMSsrKSB7CiAgICBjb25zdCBzMTAgPSB0OFtpMTFdOwogICAgbGV0IGE0LCB1NiwgZDQgPSAtMSwgZjYgPSAwOwogICAgZm9yICg7IGY2IDwgczEwLmxlbmd0aCAmJiAoYzEwLmxhc3RJbmRleCA9IGY2LCB1NiA9IGMxMC5leGVjKHMxMCksIG51bGwgIT09IHU2KTsgKSBmNiA9IGMxMC5sYXN0SW5kZXgsIGMxMCA9PT0gdiA/ICIhLS0iID09PSB1NlsxXSA/IGMxMCA9IF8gOiB2b2lkIDAgIT09IHU2WzFdID8gYzEwID0gbSA6IHZvaWQgMCAhPT0gdTZbMl0gPyAoeTIudGVzdCh1NlsyXSkgJiYgKG4xMSA9IFJlZ0V4cCgiPC8iICsgdTZbMl0sICJnIikpLCBjMTAgPSBwMikgOiB2b2lkIDAgIT09IHU2WzNdICYmIChjMTAgPSBwMikgOiBjMTAgPT09IHAyID8gIj4iID09PSB1NlswXSA/IChjMTAgPSBuMTEgPz8gdiwgZDQgPSAtMSkgOiB2b2lkIDAgPT09IHU2WzFdID8gZDQgPSAtMiA6IChkNCA9IGMxMC5sYXN0SW5kZXggLSB1NlsyXS5sZW5ndGgsIGE0ID0gdTZbMV0sIGMxMCA9IHZvaWQgMCA9PT0gdTZbM10gPyBwMiA6ICciJyA9PT0gdTZbM10gPyAkIDogZykgOiBjMTAgPT09ICQgfHwgYzEwID09PSBnID8gYzEwID0gcDIgOiBjMTAgPT09IF8gfHwgYzEwID09PSBtID8gYzEwID0gdiA6IChjMTAgPSBwMiwgbjExID0gdm9pZCAwKTsKICAgIGNvbnN0IHgzID0gYzEwID09PSBwMiAmJiB0OFtpMTEgKyAxXS5zdGFydHNXaXRoKCIvPiIpID8gIiAiIDogIiI7CiAgICBsNSArPSBjMTAgPT09IHYgPyBzMTAgKyByMyA6IGQ0ID49IDAgPyAoZTEwLnB1c2goYTQpLCBzMTAuc2xpY2UoMCwgZDQpICsgaDIgKyBzMTAuc2xpY2UoZDQpICsgbzMgKyB4MykgOiBzMTAgKyBvMyArICgtMiA9PT0gZDQgPyBpMTEgOiB4Myk7CiAgfQogIHJldHVybiBbVih0OCwgbDUgKyAodDhbczldIHx8ICI8Pz4iKSArICgyID09PSBpMTAgPyAiPC9zdmc+IiA6IDMgPT09IGkxMCA/ICI8L21hdGg+IiA6ICIiKSksIGUxMF07Cn0sICJOIik7CnZhciBTMiA9IGNsYXNzIF9TIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJTIik7CiAgfQogIGNvbnN0cnVjdG9yKHsgc3RyaW5nczogdDgsIF8kbGl0VHlwZSQ6IGkxMCB9LCBlMTApIHsKICAgIGxldCByMTA7CiAgICB0aGlzLnBhcnRzID0gW107CiAgICBsZXQgbDUgPSAwLCBhNCA9IDA7CiAgICBjb25zdCB1NiA9IHQ4Lmxlbmd0aCAtIDEsIGQ0ID0gdGhpcy5wYXJ0cywgW2Y2LCB2NF0gPSBOKHQ4LCBpMTApOwogICAgaWYgKHRoaXMuZWwgPSBfUy5jcmVhdGVFbGVtZW50KGY2LCBlMTApLCBQLmN1cnJlbnROb2RlID0gdGhpcy5lbC5jb250ZW50LCAyID09PSBpMTAgfHwgMyA9PT0gaTEwKSB7CiAgICAgIGNvbnN0IHQ5ID0gdGhpcy5lbC5jb250ZW50LmZpcnN0Q2hpbGQ7CiAgICAgIHQ5LnJlcGxhY2VXaXRoKC4uLnQ5LmNoaWxkTm9kZXMpOwogICAgfQogICAgZm9yICg7IG51bGwgIT09IChyMTAgPSBQLm5leHROb2RlKCkpICYmIGQ0Lmxlbmd0aCA8IHU2OyApIHsKICAgICAgaWYgKDEgPT09IHIxMC5ub2RlVHlwZSkgewogICAgICAgIGlmIChyMTAuaGFzQXR0cmlidXRlcygpKSBmb3IgKGNvbnN0IHQ5IG9mIHIxMC5nZXRBdHRyaWJ1dGVOYW1lcygpKSBpZiAodDkuZW5kc1dpdGgoaDIpKSB7CiAgICAgICAgICBjb25zdCBpMTEgPSB2NFthNCsrXSwgczkgPSByMTAuZ2V0QXR0cmlidXRlKHQ5KS5zcGxpdChvMyksIGUxMSA9IC8oWy4/QF0pPyguKikvLmV4ZWMoaTExKTsKICAgICAgICAgIGQ0LnB1c2goeyB0eXBlOiAxLCBpbmRleDogbDUsIG5hbWU6IGUxMVsyXSwgc3RyaW5nczogczksIGN0b3I6ICIuIiA9PT0gZTExWzFdID8gSSA6ICI/IiA9PT0gZTExWzFdID8gTCA6ICJAIiA9PT0gZTExWzFdID8geiA6IEggfSksIHIxMC5yZW1vdmVBdHRyaWJ1dGUodDkpOwogICAgICAgIH0gZWxzZSB0OS5zdGFydHNXaXRoKG8zKSAmJiAoZDQucHVzaCh7IHR5cGU6IDYsIGluZGV4OiBsNSB9KSwgcjEwLnJlbW92ZUF0dHJpYnV0ZSh0OSkpOwogICAgICAgIGlmICh5Mi50ZXN0KHIxMC50YWdOYW1lKSkgewogICAgICAgICAgY29uc3QgdDkgPSByMTAudGV4dENvbnRlbnQuc3BsaXQobzMpLCBpMTEgPSB0OS5sZW5ndGggLSAxOwogICAgICAgICAgaWYgKGkxMSA+IDApIHsKICAgICAgICAgICAgcjEwLnRleHRDb250ZW50ID0gczIgPyBzMi5lbXB0eVNjcmlwdCA6ICIiOwogICAgICAgICAgICBmb3IgKGxldCBzOSA9IDA7IHM5IDwgaTExOyBzOSsrKSByMTAuYXBwZW5kKHQ5W3M5XSwgYzMoKSksIFAubmV4dE5vZGUoKSwgZDQucHVzaCh7IHR5cGU6IDIsIGluZGV4OiArK2w1IH0pOwogICAgICAgICAgICByMTAuYXBwZW5kKHQ5W2kxMV0sIGMzKCkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICg4ID09PSByMTAubm9kZVR5cGUpIGlmIChyMTAuZGF0YSA9PT0gbjMpIGQ0LnB1c2goeyB0eXBlOiAyLCBpbmRleDogbDUgfSk7CiAgICAgIGVsc2UgewogICAgICAgIGxldCB0OSA9IC0xOwogICAgICAgIGZvciAoOyAtMSAhPT0gKHQ5ID0gcjEwLmRhdGEuaW5kZXhPZihvMywgdDkgKyAxKSk7ICkgZDQucHVzaCh7IHR5cGU6IDcsIGluZGV4OiBsNSB9KSwgdDkgKz0gbzMubGVuZ3RoIC0gMTsKICAgICAgfQogICAgICBsNSsrOwogICAgfQogIH0KICBzdGF0aWMgY3JlYXRlRWxlbWVudCh0OCwgaTEwKSB7CiAgICBjb25zdCBzOSA9IGwyLmNyZWF0ZUVsZW1lbnQoInRlbXBsYXRlIik7CiAgICByZXR1cm4gczkuaW5uZXJIVE1MID0gdDgsIHM5OwogIH0KfTsKZnVuY3Rpb24gTSh0OCwgaTEwLCBzOSA9IHQ4LCBlMTApIHsKICBpZiAoaTEwID09PSBFKSByZXR1cm4gaTEwOwogIGxldCBoNyA9IHZvaWQgMCAhPT0gZTEwID8gczkuXyRDbz8uW2UxMF0gOiBzOS5fJENsOwogIGNvbnN0IG8xMiA9IGEyKGkxMCkgPyB2b2lkIDAgOiBpMTAuXyRsaXREaXJlY3RpdmUkOwogIHJldHVybiBoNz8uY29uc3RydWN0b3IgIT09IG8xMiAmJiAoaDc/Ll8kQU8/LihmYWxzZSksIHZvaWQgMCA9PT0gbzEyID8gaDcgPSB2b2lkIDAgOiAoaDcgPSBuZXcgbzEyKHQ4KSwgaDcuXyRBVCh0OCwgczksIGUxMCkpLCB2b2lkIDAgIT09IGUxMCA/IChzOS5fJENvID8/PSBbXSlbZTEwXSA9IGg3IDogczkuXyRDbCA9IGg3KSwgdm9pZCAwICE9PSBoNyAmJiAoaTEwID0gTSh0OCwgaDcuXyRBUyh0OCwgaTEwLnZhbHVlcyksIGg3LCBlMTApKSwgaTEwOwp9Cl9fbmFtZShNLCAiTSIpOwp2YXIgUiA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJSIik7CiAgfQogIGNvbnN0cnVjdG9yKHQ4LCBpMTApIHsKICAgIHRoaXMuXyRBViA9IFtdLCB0aGlzLl8kQU4gPSB2b2lkIDAsIHRoaXMuXyRBRCA9IHQ4LCB0aGlzLl8kQU0gPSBpMTA7CiAgfQogIGdldCBwYXJlbnROb2RlKCkgewogICAgcmV0dXJuIHRoaXMuXyRBTS5wYXJlbnROb2RlOwogIH0KICBnZXQgXyRBVSgpIHsKICAgIHJldHVybiB0aGlzLl8kQU0uXyRBVTsKICB9CiAgdSh0OCkgewogICAgY29uc3QgeyBlbDogeyBjb250ZW50OiBpMTAgfSwgcGFydHM6IHM5IH0gPSB0aGlzLl8kQUQsIGUxMCA9ICh0OD8uY3JlYXRpb25TY29wZSA/PyBsMikuaW1wb3J0Tm9kZShpMTAsIHRydWUpOwogICAgUC5jdXJyZW50Tm9kZSA9IGUxMDsKICAgIGxldCBoNyA9IFAubmV4dE5vZGUoKSwgbzEyID0gMCwgbjExID0gMCwgcjEwID0gczlbMF07CiAgICBmb3IgKDsgdm9pZCAwICE9PSByMTA7ICkgewogICAgICBpZiAobzEyID09PSByMTAuaW5kZXgpIHsKICAgICAgICBsZXQgaTExOwogICAgICAgIDIgPT09IHIxMC50eXBlID8gaTExID0gbmV3IGsoaDcsIGg3Lm5leHRTaWJsaW5nLCB0aGlzLCB0OCkgOiAxID09PSByMTAudHlwZSA/IGkxMSA9IG5ldyByMTAuY3RvcihoNywgcjEwLm5hbWUsIHIxMC5zdHJpbmdzLCB0aGlzLCB0OCkgOiA2ID09PSByMTAudHlwZSAmJiAoaTExID0gbmV3IFooaDcsIHRoaXMsIHQ4KSksIHRoaXMuXyRBVi5wdXNoKGkxMSksIHIxMCA9IHM5WysrbjExXTsKICAgICAgfQogICAgICBvMTIgIT09IHIxMD8uaW5kZXggJiYgKGg3ID0gUC5uZXh0Tm9kZSgpLCBvMTIrKyk7CiAgICB9CiAgICByZXR1cm4gUC5jdXJyZW50Tm9kZSA9IGwyLCBlMTA7CiAgfQogIHAodDgpIHsKICAgIGxldCBpMTAgPSAwOwogICAgZm9yIChjb25zdCBzOSBvZiB0aGlzLl8kQVYpIHZvaWQgMCAhPT0gczkgJiYgKHZvaWQgMCAhPT0gczkuc3RyaW5ncyA/IChzOS5fJEFJKHQ4LCBzOSwgaTEwKSwgaTEwICs9IHM5LnN0cmluZ3MubGVuZ3RoIC0gMikgOiBzOS5fJEFJKHQ4W2kxMF0pKSwgaTEwKys7CiAgfQp9Owp2YXIgayA9IGNsYXNzIF9rIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJrIik7CiAgfQogIGdldCBfJEFVKCkgewogICAgcmV0dXJuIHRoaXMuXyRBTT8uXyRBVSA/PyB0aGlzLl8kQ3Y7CiAgfQogIGNvbnN0cnVjdG9yKHQ4LCBpMTAsIHM5LCBlMTApIHsKICAgIHRoaXMudHlwZSA9IDIsIHRoaXMuXyRBSCA9IEEsIHRoaXMuXyRBTiA9IHZvaWQgMCwgdGhpcy5fJEFBID0gdDgsIHRoaXMuXyRBQiA9IGkxMCwgdGhpcy5fJEFNID0gczksIHRoaXMub3B0aW9ucyA9IGUxMCwgdGhpcy5fJEN2ID0gZTEwPy5pc0Nvbm5lY3RlZCA/PyB0cnVlOwogIH0KICBnZXQgcGFyZW50Tm9kZSgpIHsKICAgIGxldCB0OCA9IHRoaXMuXyRBQS5wYXJlbnROb2RlOwogICAgY29uc3QgaTEwID0gdGhpcy5fJEFNOwogICAgcmV0dXJuIHZvaWQgMCAhPT0gaTEwICYmIDExID09PSB0OD8ubm9kZVR5cGUgJiYgKHQ4ID0gaTEwLnBhcmVudE5vZGUpLCB0ODsKICB9CiAgZ2V0IHN0YXJ0Tm9kZSgpIHsKICAgIHJldHVybiB0aGlzLl8kQUE7CiAgfQogIGdldCBlbmROb2RlKCkgewogICAgcmV0dXJuIHRoaXMuXyRBQjsKICB9CiAgXyRBSSh0OCwgaTEwID0gdGhpcykgewogICAgdDggPSBNKHRoaXMsIHQ4LCBpMTApLCBhMih0OCkgPyB0OCA9PT0gQSB8fCBudWxsID09IHQ4IHx8ICIiID09PSB0OCA/ICh0aGlzLl8kQUggIT09IEEgJiYgdGhpcy5fJEFSKCksIHRoaXMuXyRBSCA9IEEpIDogdDggIT09IHRoaXMuXyRBSCAmJiB0OCAhPT0gRSAmJiB0aGlzLl8odDgpIDogdm9pZCAwICE9PSB0OC5fJGxpdFR5cGUkID8gdGhpcy4kKHQ4KSA6IHZvaWQgMCAhPT0gdDgubm9kZVR5cGUgPyB0aGlzLlQodDgpIDogZDIodDgpID8gdGhpcy5rKHQ4KSA6IHRoaXMuXyh0OCk7CiAgfQogIE8odDgpIHsKICAgIHJldHVybiB0aGlzLl8kQUEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodDgsIHRoaXMuXyRBQik7CiAgfQogIFQodDgpIHsKICAgIHRoaXMuXyRBSCAhPT0gdDggJiYgKHRoaXMuXyRBUigpLCB0aGlzLl8kQUggPSB0aGlzLk8odDgpKTsKICB9CiAgXyh0OCkgewogICAgdGhpcy5fJEFIICE9PSBBICYmIGEyKHRoaXMuXyRBSCkgPyB0aGlzLl8kQUEubmV4dFNpYmxpbmcuZGF0YSA9IHQ4IDogdGhpcy5UKGwyLmNyZWF0ZVRleHROb2RlKHQ4KSksIHRoaXMuXyRBSCA9IHQ4OwogIH0KICAkKHQ4KSB7CiAgICBjb25zdCB7IHZhbHVlczogaTEwLCBfJGxpdFR5cGUkOiBzOSB9ID0gdDgsIGUxMCA9ICJudW1iZXIiID09IHR5cGVvZiBzOSA/IHRoaXMuXyRBQyh0OCkgOiAodm9pZCAwID09PSBzOS5lbCAmJiAoczkuZWwgPSBTMi5jcmVhdGVFbGVtZW50KFYoczkuaCwgczkuaFswXSksIHRoaXMub3B0aW9ucykpLCBzOSk7CiAgICBpZiAodGhpcy5fJEFIPy5fJEFEID09PSBlMTApIHRoaXMuXyRBSC5wKGkxMCk7CiAgICBlbHNlIHsKICAgICAgY29uc3QgdDkgPSBuZXcgUihlMTAsIHRoaXMpLCBzMTAgPSB0OS51KHRoaXMub3B0aW9ucyk7CiAgICAgIHQ5LnAoaTEwKSwgdGhpcy5UKHMxMCksIHRoaXMuXyRBSCA9IHQ5OwogICAgfQogIH0KICBfJEFDKHQ4KSB7CiAgICBsZXQgaTEwID0gQy5nZXQodDguc3RyaW5ncyk7CiAgICByZXR1cm4gdm9pZCAwID09PSBpMTAgJiYgQy5zZXQodDguc3RyaW5ncywgaTEwID0gbmV3IFMyKHQ4KSksIGkxMDsKICB9CiAgayh0OCkgewogICAgdTIodGhpcy5fJEFIKSB8fCAodGhpcy5fJEFIID0gW10sIHRoaXMuXyRBUigpKTsKICAgIGNvbnN0IGkxMCA9IHRoaXMuXyRBSDsKICAgIGxldCBzOSwgZTEwID0gMDsKICAgIGZvciAoY29uc3QgaDcgb2YgdDgpIGUxMCA9PT0gaTEwLmxlbmd0aCA/IGkxMC5wdXNoKHM5ID0gbmV3IF9rKHRoaXMuTyhjMygpKSwgdGhpcy5PKGMzKCkpLCB0aGlzLCB0aGlzLm9wdGlvbnMpKSA6IHM5ID0gaTEwW2UxMF0sIHM5Ll8kQUkoaDcpLCBlMTArKzsKICAgIGUxMCA8IGkxMC5sZW5ndGggJiYgKHRoaXMuXyRBUihzOSAmJiBzOS5fJEFCLm5leHRTaWJsaW5nLCBlMTApLCBpMTAubGVuZ3RoID0gZTEwKTsKICB9CiAgXyRBUih0OCA9IHRoaXMuXyRBQS5uZXh0U2libGluZywgczkpIHsKICAgIGZvciAodGhpcy5fJEFQPy4oZmFsc2UsIHRydWUsIHM5KTsgdDggIT09IHRoaXMuXyRBQjsgKSB7CiAgICAgIGNvbnN0IHMxMCA9IGkzKHQ4KS5uZXh0U2libGluZzsKICAgICAgaTModDgpLnJlbW92ZSgpLCB0OCA9IHMxMDsKICAgIH0KICB9CiAgc2V0Q29ubmVjdGVkKHQ4KSB7CiAgICB2b2lkIDAgPT09IHRoaXMuXyRBTSAmJiAodGhpcy5fJEN2ID0gdDgsIHRoaXMuXyRBUD8uKHQ4KSk7CiAgfQp9Owp2YXIgSCA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJIIik7CiAgfQogIGdldCB0YWdOYW1lKCkgewogICAgcmV0dXJuIHRoaXMuZWxlbWVudC50YWdOYW1lOwogIH0KICBnZXQgXyRBVSgpIHsKICAgIHJldHVybiB0aGlzLl8kQU0uXyRBVTsKICB9CiAgY29uc3RydWN0b3IodDgsIGkxMCwgczksIGUxMCwgaDcpIHsKICAgIHRoaXMudHlwZSA9IDEsIHRoaXMuXyRBSCA9IEEsIHRoaXMuXyRBTiA9IHZvaWQgMCwgdGhpcy5lbGVtZW50ID0gdDgsIHRoaXMubmFtZSA9IGkxMCwgdGhpcy5fJEFNID0gZTEwLCB0aGlzLm9wdGlvbnMgPSBoNywgczkubGVuZ3RoID4gMiB8fCAiIiAhPT0gczlbMF0gfHwgIiIgIT09IHM5WzFdID8gKHRoaXMuXyRBSCA9IEFycmF5KHM5Lmxlbmd0aCAtIDEpLmZpbGwobmV3IFN0cmluZygpKSwgdGhpcy5zdHJpbmdzID0gczkpIDogdGhpcy5fJEFIID0gQTsKICB9CiAgXyRBSSh0OCwgaTEwID0gdGhpcywgczksIGUxMCkgewogICAgY29uc3QgaDcgPSB0aGlzLnN0cmluZ3M7CiAgICBsZXQgbzEyID0gZmFsc2U7CiAgICBpZiAodm9pZCAwID09PSBoNykgdDggPSBNKHRoaXMsIHQ4LCBpMTAsIDApLCBvMTIgPSAhYTIodDgpIHx8IHQ4ICE9PSB0aGlzLl8kQUggJiYgdDggIT09IEUsIG8xMiAmJiAodGhpcy5fJEFIID0gdDgpOwogICAgZWxzZSB7CiAgICAgIGNvbnN0IGUxMSA9IHQ4OwogICAgICBsZXQgbjExLCByMTA7CiAgICAgIGZvciAodDggPSBoN1swXSwgbjExID0gMDsgbjExIDwgaDcubGVuZ3RoIC0gMTsgbjExKyspIHIxMCA9IE0odGhpcywgZTExW3M5ICsgbjExXSwgaTEwLCBuMTEpLCByMTAgPT09IEUgJiYgKHIxMCA9IHRoaXMuXyRBSFtuMTFdKSwgbzEyIHx8PSAhYTIocjEwKSB8fCByMTAgIT09IHRoaXMuXyRBSFtuMTFdLCByMTAgPT09IEEgPyB0OCA9IEEgOiB0OCAhPT0gQSAmJiAodDggKz0gKHIxMCA/PyAiIikgKyBoN1tuMTEgKyAxXSksIHRoaXMuXyRBSFtuMTFdID0gcjEwOwogICAgfQogICAgbzEyICYmICFlMTAgJiYgdGhpcy5qKHQ4KTsKICB9CiAgaih0OCkgewogICAgdDggPT09IEEgPyB0aGlzLmVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKHRoaXMubmFtZSkgOiB0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKHRoaXMubmFtZSwgdDggPz8gIiIpOwogIH0KfTsKdmFyIEkgPSBjbGFzcyBleHRlbmRzIEggewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkkiKTsKICB9CiAgY29uc3RydWN0b3IoKSB7CiAgICBzdXBlciguLi5hcmd1bWVudHMpLCB0aGlzLnR5cGUgPSAzOwogIH0KICBqKHQ4KSB7CiAgICB0aGlzLmVsZW1lbnRbdGhpcy5uYW1lXSA9IHQ4ID09PSBBID8gdm9pZCAwIDogdDg7CiAgfQp9Owp2YXIgTCA9IGNsYXNzIGV4dGVuZHMgSCB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiTCIpOwogIH0KICBjb25zdHJ1Y3RvcigpIHsKICAgIHN1cGVyKC4uLmFyZ3VtZW50cyksIHRoaXMudHlwZSA9IDQ7CiAgfQogIGoodDgpIHsKICAgIHRoaXMuZWxlbWVudC50b2dnbGVBdHRyaWJ1dGUodGhpcy5uYW1lLCAhIXQ4ICYmIHQ4ICE9PSBBKTsKICB9Cn07CnZhciB6ID0gY2xhc3MgZXh0ZW5kcyBIIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJ6Iik7CiAgfQogIGNvbnN0cnVjdG9yKHQ4LCBpMTAsIHM5LCBlMTAsIGg3KSB7CiAgICBzdXBlcih0OCwgaTEwLCBzOSwgZTEwLCBoNyksIHRoaXMudHlwZSA9IDU7CiAgfQogIF8kQUkodDgsIGkxMCA9IHRoaXMpIHsKICAgIGlmICgodDggPSBNKHRoaXMsIHQ4LCBpMTAsIDApID8/IEEpID09PSBFKSByZXR1cm47CiAgICBjb25zdCBzOSA9IHRoaXMuXyRBSCwgZTEwID0gdDggPT09IEEgJiYgczkgIT09IEEgfHwgdDguY2FwdHVyZSAhPT0gczkuY2FwdHVyZSB8fCB0OC5vbmNlICE9PSBzOS5vbmNlIHx8IHQ4LnBhc3NpdmUgIT09IHM5LnBhc3NpdmUsIGg3ID0gdDggIT09IEEgJiYgKHM5ID09PSBBIHx8IGUxMCk7CiAgICBlMTAgJiYgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcy5uYW1lLCB0aGlzLCBzOSksIGg3ICYmIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHRoaXMubmFtZSwgdGhpcywgdDgpLCB0aGlzLl8kQUggPSB0ODsKICB9CiAgaGFuZGxlRXZlbnQodDgpIHsKICAgICJmdW5jdGlvbiIgPT0gdHlwZW9mIHRoaXMuXyRBSCA/IHRoaXMuXyRBSC5jYWxsKHRoaXMub3B0aW9ucz8uaG9zdCA/PyB0aGlzLmVsZW1lbnQsIHQ4KSA6IHRoaXMuXyRBSC5oYW5kbGVFdmVudCh0OCk7CiAgfQp9Owp2YXIgWiA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJaIik7CiAgfQogIGNvbnN0cnVjdG9yKHQ4LCBpMTAsIHM5KSB7CiAgICB0aGlzLmVsZW1lbnQgPSB0OCwgdGhpcy50eXBlID0gNiwgdGhpcy5fJEFOID0gdm9pZCAwLCB0aGlzLl8kQU0gPSBpMTAsIHRoaXMub3B0aW9ucyA9IHM5OwogIH0KICBnZXQgXyRBVSgpIHsKICAgIHJldHVybiB0aGlzLl8kQU0uXyRBVTsKICB9CiAgXyRBSSh0OCkgewogICAgTSh0aGlzLCB0OCk7CiAgfQp9Owp2YXIgaiA9IHsgTTogaDIsIFA6IG8zLCBBOiBuMywgQzogMSwgTDogTiwgUiwgRDogZDIsIFY6IE0sIEk6IGssIEgsIE46IEwsIFU6IHosIEI6IEksIEY6IFogfSwgQiA9IHQyLmxpdEh0bWxQb2x5ZmlsbFN1cHBvcnQ7CkI/LihTMiwgayksICh0Mi5saXRIdG1sVmVyc2lvbnMgPz89IFtdKS5wdXNoKCIzLjMuMiIpOwp2YXIgRCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHQ4LCBpMTAsIHM5KSA9PiB7CiAgY29uc3QgZTEwID0gczk/LnJlbmRlckJlZm9yZSA/PyBpMTA7CiAgbGV0IGg3ID0gZTEwLl8kbGl0UGFydCQ7CiAgaWYgKHZvaWQgMCA9PT0gaDcpIHsKICAgIGNvbnN0IHQ5ID0gczk/LnJlbmRlckJlZm9yZSA/PyBudWxsOwogICAgZTEwLl8kbGl0UGFydCQgPSBoNyA9IG5ldyBrKGkxMC5pbnNlcnRCZWZvcmUoYzMoKSwgdDkpLCB0OSwgdm9pZCAwLCBzOSA/PyB7fSk7CiAgfQogIHJldHVybiBoNy5fJEFJKHQ4KSwgaDc7Cn0sICJEIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbGl0LWVsZW1lbnRANC4yLjIvbm9kZV9tb2R1bGVzL2xpdC1lbGVtZW50L2xpdC1lbGVtZW50LmpzCnZhciBzMyA9IGdsb2JhbFRoaXM7CnZhciBpNCA9IGNsYXNzIGV4dGVuZHMgeSB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiaSIpOwogIH0KICBjb25zdHJ1Y3RvcigpIHsKICAgIHN1cGVyKC4uLmFyZ3VtZW50cyksIHRoaXMucmVuZGVyT3B0aW9ucyA9IHsgaG9zdDogdGhpcyB9LCB0aGlzLl8kRG8gPSB2b2lkIDA7CiAgfQogIGNyZWF0ZVJlbmRlclJvb3QoKSB7CiAgICBjb25zdCB0OCA9IHN1cGVyLmNyZWF0ZVJlbmRlclJvb3QoKTsKICAgIHJldHVybiB0aGlzLnJlbmRlck9wdGlvbnMucmVuZGVyQmVmb3JlID8/PSB0OC5maXJzdENoaWxkLCB0ODsKICB9CiAgdXBkYXRlKHQ4KSB7CiAgICBjb25zdCByMTAgPSB0aGlzLnJlbmRlcigpOwogICAgdGhpcy5oYXNVcGRhdGVkIHx8ICh0aGlzLnJlbmRlck9wdGlvbnMuaXNDb25uZWN0ZWQgPSB0aGlzLmlzQ29ubmVjdGVkKSwgc3VwZXIudXBkYXRlKHQ4KSwgdGhpcy5fJERvID0gRChyMTAsIHRoaXMucmVuZGVyUm9vdCwgdGhpcy5yZW5kZXJPcHRpb25zKTsKICB9CiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpLCB0aGlzLl8kRG8/LnNldENvbm5lY3RlZCh0cnVlKTsKICB9CiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpLCB0aGlzLl8kRG8/LnNldENvbm5lY3RlZChmYWxzZSk7CiAgfQogIHJlbmRlcigpIHsKICAgIHJldHVybiBFOwogIH0KfTsKaTQuXyRsaXRFbGVtZW50JCA9IHRydWUsIGk0WyJmaW5hbGl6ZWQiXSA9IHRydWUsIHMzLmxpdEVsZW1lbnRIeWRyYXRlU3VwcG9ydD8uKHsgTGl0RWxlbWVudDogaTQgfSk7CnZhciBvNCA9IHMzLmxpdEVsZW1lbnRQb2x5ZmlsbFN1cHBvcnQ7Cm80Py4oeyBMaXRFbGVtZW50OiBpNCB9KTsKdmFyIG40ID0geyBfJEFLOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh0OCwgZTEwLCByMTApID0+IHsKICB0OC5fJEFLKGUxMCwgcjEwKTsKfSwgIl8kQUsiKSwgXyRBTDogLyogQF9fUFVSRV9fICovIF9fbmFtZSgodDgpID0+IHQ4Ll8kQUwsICJfJEFMIikgfTsKKHMzLmxpdEVsZW1lbnRWZXJzaW9ucyA/Pz0gW10pLnB1c2goIjQuMi4yIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbGl0LWh0bWxAMy4zLjIvbm9kZV9tb2R1bGVzL2xpdC1odG1sL2lzLXNlcnZlci5qcwp2YXIgbzUgPSBmYWxzZTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHJ4QDMuMC4xMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRyeC9kaXN0X3RzL2luZGV4LmpzCnZhciBkaXN0X3RzX2V4cG9ydHMyID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czIsIHsKICBPYnNlcnZhYmxlSW50YWtlOiAoKSA9PiBPYnNlcnZhYmxlSW50YWtlLAogIE9ic2VydmFibGVtYXA6ICgpID0+IE9ic2VydmFibGVtYXAsCiAgZnJvbVN0cmVhbVdpdGhCYWNrcHJlc3N1cmU6ICgpID0+IGZyb21TdHJlYW1XaXRoQmFja3ByZXNzdXJlLAogIHJ4anM6ICgpID0+IHNtYXJ0cnhfcGx1Z2luc19yeGpzX2V4cG9ydHMKfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRwcm9taXNlQDQuMi4zL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHByb21pc2UvZGlzdF90cy9pbmRleC5qcwp2YXIgZGlzdF90c19leHBvcnRzID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0cywgewogIEN1bXVsYXRpdmVEZWZlcnJlZDogKCkgPT4gQ3VtdWxhdGl2ZURlZmVycmVkLAogIERlZmVycmVkOiAoKSA9PiBEZWZlcnJlZCwKICBjdW11bGF0aXZlRGVmZXI6ICgpID0+IGN1bXVsYXRpdmVEZWZlciwKICBkZWZlcjogKCkgPT4gZGVmZXIsCiAgZnJvbUNhbGxiYWNrOiAoKSA9PiBmcm9tQ2FsbGJhY2ssCiAgZ2V0Rmlyc3RUcnVlT3JGYWxzZTogKCkgPT4gZ2V0Rmlyc3RUcnVlT3JGYWxzZSwKICBtYXA6ICgpID0+IG1hcCwKICByZWplY3RlZFByb21pc2U6ICgpID0+IHJlamVjdGVkUHJvbWlzZSwKICByZXNvbHZlZFByb21pc2U6ICgpID0+IHJlc29sdmVkUHJvbWlzZSwKICB0aW1lb3V0QW5kQ29udGludWU6ICgpID0+IHRpbWVvdXRBbmRDb250aW51ZSwKICB0aW1lb3V0V3JhcDogKCkgPT4gdGltZW91dFdyYXAKfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRwcm9taXNlQDQuMi4zL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHByb21pc2UvZGlzdF90cy9zbWFydHByb21pc2UuY2xhc3Nlcy5kZWZlcnJlZC5qcwp2YXIgRGVmZXJyZWQgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiRGVmZXJyZWQiKTsKICB9CiAgY2xhaW0oKSB7CiAgICBpZiAodGhpcy5jbGFpbWVkKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiRGVmZXJyZWQgYWxyZWFkeSBjbGFpbWVkIik7CiAgICB9CiAgICB0aGlzLmNsYWltZWQgPSB0cnVlOwogIH0KICBnZXQgZHVyYXRpb24oKSB7CiAgICBpZiAodGhpcy5zdG9wcGVkQXQpIHsKICAgICAgcmV0dXJuIHRoaXMuc3RvcHBlZEF0IC0gdGhpcy5zdGFydGVkQXQ7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gRGF0ZS5ub3coKSAtIHRoaXMuc3RhcnRlZEF0OwogICAgfQogIH0KICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMuY2xhaW1lZCA9IGZhbHNlOwogICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUyLCByZWplY3QpID0+IHsKICAgICAgdGhpcy5yZXNvbHZlID0gKHZhbHVlQXJnKSA9PiB7CiAgICAgICAgdGhpcy5zdGF0dXMgPSAiZnVsZmlsbGVkIjsKICAgICAgICB0aGlzLnN0b3BwZWRBdCA9IERhdGUubm93KCk7CiAgICAgICAgcmVzb2x2ZTIodmFsdWVBcmcpOwogICAgICB9OwogICAgICB0aGlzLnJlamVjdCA9IChyZWFzb24pID0+IHsKICAgICAgICB0aGlzLnN0YXR1cyA9ICJyZWplY3RlZCI7CiAgICAgICAgdGhpcy5zdG9wcGVkQXQgPSBEYXRlLm5vdygpOwogICAgICAgIHJlamVjdChyZWFzb24pOwogICAgICB9OwogICAgICB0aGlzLnN0YXJ0ZWRBdCA9IERhdGUubm93KCk7CiAgICAgIHRoaXMuc3RhdHVzID0gInBlbmRpbmciOwogICAgfSk7CiAgfQp9Owp2YXIgZGVmZXIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCgpID0+IHsKICByZXR1cm4gbmV3IERlZmVycmVkKCk7Cn0sICJkZWZlciIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0cHJvbWlzZUA0LjIuMy9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRwcm9taXNlL2Rpc3RfdHMvc21hcnRwcm9taXNlLmNsYXNzZXMuY3VtdWxhdGl2ZWRlZmVycmVkLmpzCnZhciBDdW11bGF0aXZlRGVmZXJyZWQgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiQ3VtdWxhdGl2ZURlZmVycmVkIik7CiAgfQogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5hY2N1bXVsYXRlZFByb21pc2VzID0gW107CiAgICB0aGlzLmRlZmVycmVkID0gZGVmZXIoKTsKICAgIHRoaXMucHJvbWlzZSA9IHRoaXMuZGVmZXJyZWQucHJvbWlzZTsKICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4gewogICAgICB3aGlsZSAodGhpcy5hY2N1bXVsYXRlZFByb21pc2VzLmxlbmd0aCA+IDApIHsKICAgICAgICBjb25zdCBwb3BwZWRQcm9taXNlID0gdGhpcy5hY2N1bXVsYXRlZFByb21pc2VzLnNoaWZ0KCk7CiAgICAgICAgYXdhaXQgcG9wcGVkUHJvbWlzZTsKICAgICAgfQogICAgICB0aGlzLmRlZmVycmVkLnJlc29sdmUoKTsKICAgIH0sIDApOwogIH0KICBzdWJEZWZlcigpIHsKICAgIGNvbnN0IGRvbmUgPSBkZWZlcigpOwogICAgdGhpcy5hZGRQcm9taXNlKGRvbmUucHJvbWlzZSk7CiAgICByZXR1cm4gZG9uZTsKICB9CiAgYWRkUHJvbWlzZShwcm9taXNlQXJnKSB7CiAgICB0aGlzLmFjY3VtdWxhdGVkUHJvbWlzZXMucHVzaChwcm9taXNlQXJnKTsKICB9Cn07CnZhciBjdW11bGF0aXZlRGVmZXIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCgpID0+IHsKICByZXR1cm4gbmV3IEN1bXVsYXRpdmVEZWZlcnJlZCgpOwp9LCAiY3VtdWxhdGl2ZURlZmVyIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRwcm9taXNlQDQuMi4zL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHByb21pc2UvZGlzdF90cy9pbmRleC5qcwp2YXIgcmVzb2x2ZWRQcm9taXNlID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgodmFsdWUyKSA9PiB7CiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWx1ZTIpOwp9LCAicmVzb2x2ZWRQcm9taXNlIik7CnZhciByZWplY3RlZFByb21pc2UgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChlcnIpID0+IHsKICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTsKfSwgInJlamVjdGVkUHJvbWlzZSIpOwp2YXIgbWFwID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShhc3luYyAoaW5wdXRBcmcsIGZ1bmN0aW9uQXJnKSA9PiB7CiAgY29uc3QgcHJvbWlzZUFycmF5ID0gW107CiAgY29uc3QgcmVzdWx0QXJyYXkgPSBbXTsKICBmb3IgKGNvbnN0IGl0ZW0gb2YgaW5wdXRBcmcpIHsKICAgIGNvbnN0IHByb21pc2UgPSBmdW5jdGlvbkFyZyhpdGVtKTsKICAgIHByb21pc2VBcnJheS5wdXNoKHByb21pc2UpOwogICAgcHJvbWlzZS50aGVuKCh4MykgPT4gewogICAgICByZXN1bHRBcnJheS5wdXNoKHgzKTsKICAgIH0pOwogIH0KICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlQXJyYXkpOwogIHJldHVybiByZXN1bHRBcnJheTsKfSwgIm1hcCIpOwp2YXIgdGltZW91dFdyYXAgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGFzeW5jIChwcm9taXNlQXJnLCB0aW1lb3V0SW5Nc0FyZywgcmVqZWN0QXJnID0gdHJ1ZSkgPT4gewogIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTIsIHJlamVjdCkgPT4gewogICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgIGlmIChyZWplY3RBcmcpIHsKICAgICAgICByZWplY3QobmV3IEVycm9yKCJ0aW1lb3V0IikpOwogICAgICB9IGVsc2UgewogICAgICAgIHJlc29sdmUyKG51bGwpOwogICAgICB9CiAgICB9LCB0aW1lb3V0SW5Nc0FyZyk7CiAgICBwcm9taXNlQXJnLnRoZW4ocmVzb2x2ZTIsIHJlamVjdCk7CiAgfSk7Cn0sICJ0aW1lb3V0V3JhcCIpOwp2YXIgdGltZW91dEFuZENvbnRpbnVlID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShhc3luYyAocHJvbWlzZUFyZywgdGltZW91dEluTXNBcmcgPSA2ZTQpID0+IHsKICByZXR1cm4gdGltZW91dFdyYXAocHJvbWlzZUFyZywgdGltZW91dEluTXNBcmcsIGZhbHNlKTsKfSwgInRpbWVvdXRBbmRDb250aW51ZSIpOwp2YXIgZ2V0Rmlyc3RUcnVlT3JGYWxzZSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoYXN5bmMgKHByb21pc2VzQXJnKSA9PiB7CiAgY29uc3QgZG9uZSA9IGRlZmVyKCk7CiAgZm9yIChjb25zdCBwcm9taXNlQXJnIG9mIHByb21pc2VzQXJnKSB7CiAgICBwcm9taXNlQXJnLnRoZW4oKHJlc3VsdEFyZykgPT4gewogICAgICBpZiAocmVzdWx0QXJnID09PSB0cnVlKSB7CiAgICAgICAgZG9uZS5yZXNvbHZlKHRydWUpOwogICAgICB9CiAgICB9KTsKICB9CiAgUHJvbWlzZS5hbGwocHJvbWlzZXNBcmcpLnRoZW4oKCkgPT4gewogICAgZG9uZS5yZXNvbHZlKGZhbHNlKTsKICB9KTsKICByZXR1cm4gZG9uZS5wcm9taXNlOwp9LCAiZ2V0Rmlyc3RUcnVlT3JGYWxzZSIpOwp2YXIgZnJvbUNhbGxiYWNrID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoZm4pID0+IHsKICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUyLCByZWplY3QpID0+IHsKICAgIGZuKChlcnIsIHJlc3VsdCkgPT4gewogICAgICBpZiAoZXJyKSB7CiAgICAgICAgcmVqZWN0KGVycik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzb2x2ZTIocmVzdWx0KTsKICAgICAgfQogICAgfSk7CiAgfSk7Cn0sICJmcm9tQ2FsbGJhY2siKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHJ4QDMuMC4xMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRyeC9kaXN0X3RzL3NtYXJ0cngucGx1Z2lucy5yeGpzLmpzCnZhciBzbWFydHJ4X3BsdWdpbnNfcnhqc19leHBvcnRzID0ge307Cl9fZXhwb3J0KHNtYXJ0cnhfcGx1Z2luc19yeGpzX2V4cG9ydHMsIHsKICBPYnNlcnZhYmxlOiAoKSA9PiBPYnNlcnZhYmxlLAogIFJlcGxheVN1YmplY3Q6ICgpID0+IFJlcGxheVN1YmplY3QsCiAgU3ViamVjdDogKCkgPT4gU3ViamVjdCwKICBTdWJzY3JpcHRpb246ICgpID0+IFN1YnNjcmlwdGlvbiwKICBmcm9tOiAoKSA9PiBmcm9tLAogIGZyb21FdmVudDogKCkgPT4gZnJvbUV2ZW50LAogIG9mOiAoKSA9PiBvZiwKICBvcHM6ICgpID0+IG9wcwp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS90c2xpYkAyLjguMS9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2Lm1qcwp2YXIgZXh0ZW5kU3RhdGljcyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oZDQsIGI0KSB7CiAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uKGQ1LCBiNSkgewogICAgZDUuX19wcm90b19fID0gYjU7CiAgfSB8fCBmdW5jdGlvbihkNSwgYjUpIHsKICAgIGZvciAodmFyIHA2IGluIGI1KSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGI1LCBwNikpIGQ1W3A2XSA9IGI1W3A2XTsKICB9OwogIHJldHVybiBleHRlbmRTdGF0aWNzKGQ0LCBiNCk7Cn0sICJleHRlbmRTdGF0aWNzIik7CmZ1bmN0aW9uIF9fZXh0ZW5kcyhkNCwgYjQpIHsKICBpZiAodHlwZW9mIGI0ICE9PSAiZnVuY3Rpb24iICYmIGI0ICE9PSBudWxsKQogICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSAiICsgU3RyaW5nKGI0KSArICIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbCIpOwogIGV4dGVuZFN0YXRpY3MoZDQsIGI0KTsKICBmdW5jdGlvbiBfXygpIHsKICAgIHRoaXMuY29uc3RydWN0b3IgPSBkNDsKICB9CiAgX19uYW1lKF9fLCAiX18iKTsKICBkNC5wcm90b3R5cGUgPSBiNCA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYjQpIDogKF9fLnByb3RvdHlwZSA9IGI0LnByb3RvdHlwZSwgbmV3IF9fKCkpOwp9Cl9fbmFtZShfX2V4dGVuZHMsICJfX2V4dGVuZHMiKTsKdmFyIF9fYXNzaWduID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHsKICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbiBfX2Fzc2lnbjIodDgpIHsKICAgIGZvciAodmFyIHM5LCBpMTAgPSAxLCBuMTEgPSBhcmd1bWVudHMubGVuZ3RoOyBpMTAgPCBuMTE7IGkxMCsrKSB7CiAgICAgIHM5ID0gYXJndW1lbnRzW2kxMF07CiAgICAgIGZvciAodmFyIHA2IGluIHM5KSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHM5LCBwNikpIHQ4W3A2XSA9IHM5W3A2XTsKICAgIH0KICAgIHJldHVybiB0ODsKICB9LCAiX19hc3NpZ24iKTsKICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKfSwgIl9fYXNzaWduIik7CmZ1bmN0aW9uIF9fcmVzdChzOSwgZTEwKSB7CiAgdmFyIHQ4ID0ge307CiAgZm9yICh2YXIgcDYgaW4gczkpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoczksIHA2KSAmJiBlMTAuaW5kZXhPZihwNikgPCAwKQogICAgdDhbcDZdID0gczlbcDZdOwogIGlmIChzOSAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSAiZnVuY3Rpb24iKQogICAgZm9yICh2YXIgaTEwID0gMCwgcDYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHM5KTsgaTEwIDwgcDYubGVuZ3RoOyBpMTArKykgewogICAgICBpZiAoZTEwLmluZGV4T2YocDZbaTEwXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzOSwgcDZbaTEwXSkpCiAgICAgICAgdDhbcDZbaTEwXV0gPSBzOVtwNltpMTBdXTsKICAgIH0KICByZXR1cm4gdDg7Cn0KX19uYW1lKF9fcmVzdCwgIl9fcmVzdCIpOwpmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5MiwgZGVzYykgewogIHZhciBjMTAgPSBhcmd1bWVudHMubGVuZ3RoLCByMTAgPSBjMTAgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5MikgOiBkZXNjLCBkNDsKICBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICJvYmplY3QiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSAiZnVuY3Rpb24iKSByMTAgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5MiwgZGVzYyk7CiAgZWxzZSBmb3IgKHZhciBpMTAgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMCA+PSAwOyBpMTAtLSkgaWYgKGQ0ID0gZGVjb3JhdG9yc1tpMTBdKSByMTAgPSAoYzEwIDwgMyA/IGQ0KHIxMCkgOiBjMTAgPiAzID8gZDQodGFyZ2V0LCBrZXkyLCByMTApIDogZDQodGFyZ2V0LCBrZXkyKSkgfHwgcjEwOwogIHJldHVybiBjMTAgPiAzICYmIHIxMCAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXkyLCByMTApLCByMTA7Cn0KX19uYW1lKF9fZGVjb3JhdGUsICJfX2RlY29yYXRlIik7CmZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKHRhcmdldCwga2V5MikgewogICAgZGVjb3JhdG9yKHRhcmdldCwga2V5MiwgcGFyYW1JbmRleCk7CiAgfTsKfQpfX25hbWUoX19wYXJhbSwgIl9fcGFyYW0iKTsKZnVuY3Rpb24gX19lc0RlY29yYXRlKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY2KSB7CiAgICBpZiAoZjYgIT09IHZvaWQgMCAmJiB0eXBlb2YgZjYgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjY7CiAgfQogIF9fbmFtZShhY2NlcHQsICJhY2NlcHQiKTsKICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzMsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTAgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMCA+PSAwOyBpMTAtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwNiBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A2XSA9IHA2ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A2XTsKICAgIGZvciAodmFyIHA2IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twNl0gPSBjb250ZXh0SW4uYWNjZXNzW3A2XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjYpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmNiB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMF0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzMgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzM7CiAgICAgIGlmIChfMyA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfMzsKICAgICAgaWYgKF8zID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzMpOwogICAgfSBlbHNlIGlmIChfMyA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfMyk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF8zOwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn0KX19uYW1lKF9fZXNEZWNvcmF0ZSwgIl9fZXNEZWNvcmF0ZSIpOwo7CmZ1bmN0aW9uIF9fcnVuSW5pdGlhbGl6ZXJzMih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMCA9IDA7IGkxMCA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMCsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTBdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTBdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfQpfX25hbWUoX19ydW5Jbml0aWFsaXplcnMyLCAiX19ydW5Jbml0aWFsaXplcnMiKTsKOwpmdW5jdGlvbiBfX3Byb3BLZXkoeDMpIHsKICByZXR1cm4gdHlwZW9mIHgzID09PSAic3ltYm9sIiA/IHgzIDogIiIuY29uY2F0KHgzKTsKfQpfX25hbWUoX19wcm9wS2V5LCAiX19wcm9wS2V5Iik7CjsKZnVuY3Rpb24gX19zZXRGdW5jdGlvbk5hbWUoZjYsIG5hbWUsIHByZWZpeCkgewogIGlmICh0eXBlb2YgbmFtZSA9PT0gInN5bWJvbCIpIG5hbWUgPSBuYW1lLmRlc2NyaXB0aW9uID8gIlsiLmNvbmNhdChuYW1lLmRlc2NyaXB0aW9uLCAiXSIpIDogIiI7CiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmNiwgIm5hbWUiLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHByZWZpeCA/ICIiLmNvbmNhdChwcmVmaXgsICIgIiwgbmFtZSkgOiBuYW1lIH0pOwp9Cl9fbmFtZShfX3NldEZ1bmN0aW9uTmFtZSwgIl9fc2V0RnVuY3Rpb25OYW1lIik7CjsKZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkgewogIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gIm9iamVjdCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09ICJmdW5jdGlvbiIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTsKfQpfX25hbWUoX19tZXRhZGF0YSwgIl9fbWV0YWRhdGEiKTsKZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAzLCBnZW5lcmF0b3IpIHsKICBmdW5jdGlvbiBhZG9wdCh2YWx1ZTIpIHsKICAgIHJldHVybiB2YWx1ZTIgaW5zdGFuY2VvZiBQMyA/IHZhbHVlMiA6IG5ldyBQMyhmdW5jdGlvbihyZXNvbHZlMikgewogICAgICByZXNvbHZlMih2YWx1ZTIpOwogICAgfSk7CiAgfQogIF9fbmFtZShhZG9wdCwgImFkb3B0Iik7CiAgcmV0dXJuIG5ldyAoUDMgfHwgKFAzID0gUHJvbWlzZSkpKGZ1bmN0aW9uKHJlc29sdmUyLCByZWplY3QpIHsKICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZTIpIHsKICAgICAgdHJ5IHsKICAgICAgICBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlMikpOwogICAgICB9IGNhdGNoIChlMTApIHsKICAgICAgICByZWplY3QoZTEwKTsKICAgICAgfQogICAgfQogICAgX19uYW1lKGZ1bGZpbGxlZCwgImZ1bGZpbGxlZCIpOwogICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUyKSB7CiAgICAgIHRyeSB7CiAgICAgICAgc3RlcChnZW5lcmF0b3JbInRocm93Il0odmFsdWUyKSk7CiAgICAgIH0gY2F0Y2ggKGUxMCkgewogICAgICAgIHJlamVjdChlMTApOwogICAgICB9CiAgICB9CiAgICBfX25hbWUocmVqZWN0ZWQsICJyZWplY3RlZCIpOwogICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsKICAgICAgcmVzdWx0LmRvbmUgPyByZXNvbHZlMihyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOwogICAgfQogICAgX19uYW1lKHN0ZXAsICJzdGVwIik7CiAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7CiAgfSk7Cn0KX19uYW1lKF9fYXdhaXRlciwgIl9fYXdhaXRlciIpOwpmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5MykgewogIHZhciBfMyA9IHsgbGFiZWw6IDAsIHNlbnQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oKSB7CiAgICBpZiAodDhbMF0gJiAxKSB0aHJvdyB0OFsxXTsKICAgIHJldHVybiB0OFsxXTsKICB9LCAic2VudCIpLCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmNiwgeTMsIHQ4LCBnMyA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBJdGVyYXRvciA9PT0gImZ1bmN0aW9uIiA/IEl0ZXJhdG9yIDogT2JqZWN0KS5wcm90b3R5cGUpOwogIHJldHVybiBnMy5uZXh0ID0gdmVyYigwKSwgZzNbInRocm93Il0gPSB2ZXJiKDEpLCBnM1sicmV0dXJuIl0gPSB2ZXJiKDIpLCB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIChnM1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpczsKICB9KSwgZzM7CiAgZnVuY3Rpb24gdmVyYihuMTEpIHsKICAgIHJldHVybiBmdW5jdGlvbih2NCkgewogICAgICByZXR1cm4gc3RlcChbbjExLCB2NF0pOwogICAgfTsKICB9CiAgX19uYW1lKHZlcmIsICJ2ZXJiIik7CiAgZnVuY3Rpb24gc3RlcChvcCkgewogICAgaWYgKGY2KSB0aHJvdyBuZXcgVHlwZUVycm9yKCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuIik7CiAgICB3aGlsZSAoZzMgJiYgKGczID0gMCwgb3BbMF0gJiYgKF8zID0gMCkpLCBfMykgdHJ5IHsKICAgICAgaWYgKGY2ID0gMSwgeTMgJiYgKHQ4ID0gb3BbMF0gJiAyID8geTNbInJldHVybiJdIDogb3BbMF0gPyB5M1sidGhyb3ciXSB8fCAoKHQ4ID0geTNbInJldHVybiJdKSAmJiB0OC5jYWxsKHkzKSwgMCkgOiB5My5uZXh0KSAmJiAhKHQ4ID0gdDguY2FsbCh5Mywgb3BbMV0pKS5kb25lKSByZXR1cm4gdDg7CiAgICAgIGlmICh5MyA9IDAsIHQ4KSBvcCA9IFtvcFswXSAmIDIsIHQ4LnZhbHVlXTsKICAgICAgc3dpdGNoIChvcFswXSkgewogICAgICAgIGNhc2UgMDoKICAgICAgICBjYXNlIDE6CiAgICAgICAgICB0OCA9IG9wOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA0OgogICAgICAgICAgXzMubGFiZWwrKzsKICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTsKICAgICAgICBjYXNlIDU6CiAgICAgICAgICBfMy5sYWJlbCsrOwogICAgICAgICAgeTMgPSBvcFsxXTsKICAgICAgICAgIG9wID0gWzBdOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgY2FzZSA3OgogICAgICAgICAgb3AgPSBfMy5vcHMucG9wKCk7CiAgICAgICAgICBfMy50cnlzLnBvcCgpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIGlmICghKHQ4ID0gXzMudHJ5cywgdDggPSB0OC5sZW5ndGggPiAwICYmIHQ4W3Q4Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7CiAgICAgICAgICAgIF8zID0gMDsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0OCB8fCBvcFsxXSA+IHQ4WzBdICYmIG9wWzFdIDwgdDhbM10pKSB7CiAgICAgICAgICAgIF8zLmxhYmVsID0gb3BbMV07CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8zLmxhYmVsIDwgdDhbMV0pIHsKICAgICAgICAgICAgXzMubGFiZWwgPSB0OFsxXTsKICAgICAgICAgICAgdDggPSBvcDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodDggJiYgXzMubGFiZWwgPCB0OFsyXSkgewogICAgICAgICAgICBfMy5sYWJlbCA9IHQ4WzJdOwogICAgICAgICAgICBfMy5vcHMucHVzaChvcCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHQ4WzJdKSBfMy5vcHMucG9wKCk7CiAgICAgICAgICBfMy50cnlzLnBvcCgpOwogICAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgb3AgPSBib2R5My5jYWxsKHRoaXNBcmcsIF8zKTsKICAgIH0gY2F0Y2ggKGUxMCkgewogICAgICBvcCA9IFs2LCBlMTBdOwogICAgICB5MyA9IDA7CiAgICB9IGZpbmFsbHkgewogICAgICBmNiA9IHQ4ID0gMDsKICAgIH0KICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOwogICAgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTsKICB9CiAgX19uYW1lKHN0ZXAsICJzdGVwIik7Cn0KX19uYW1lKF9fZ2VuZXJhdG9yLCAiX19nZW5lcmF0b3IiKTsKdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obzEyLCBtNSwgazMsIGsyMikgewogIGlmIChrMjIgPT09IHZvaWQgMCkgazIyID0gazM7CiAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG01LCBrMyk7CiAgaWYgKCFkZXNjIHx8ICgiZ2V0IiBpbiBkZXNjID8gIW01Ll9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkgewogICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gbTVbazNdOwogICAgfSwgImdldCIpIH07CiAgfQogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvMTIsIGsyMiwgZGVzYyk7Cn0pIDogKGZ1bmN0aW9uKG8xMiwgbTUsIGszLCBrMjIpIHsKICBpZiAoazIyID09PSB2b2lkIDApIGsyMiA9IGszOwogIG8xMltrMjJdID0gbTVbazNdOwp9KTsKZnVuY3Rpb24gX19leHBvcnRTdGFyKG01LCBvMTIpIHsKICBmb3IgKHZhciBwNiBpbiBtNSkgaWYgKHA2ICE9PSAiZGVmYXVsdCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvMTIsIHA2KSkgX19jcmVhdGVCaW5kaW5nKG8xMiwgbTUsIHA2KTsKfQpfX25hbWUoX19leHBvcnRTdGFyLCAiX19leHBvcnRTdGFyIik7CmZ1bmN0aW9uIF9fdmFsdWVzKG8xMikgewogIHZhciBzOSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtNSA9IHM5ICYmIG8xMltzOV0sIGkxMCA9IDA7CiAgaWYgKG01KSByZXR1cm4gbTUuY2FsbChvMTIpOwogIGlmIChvMTIgJiYgdHlwZW9mIG8xMi5sZW5ndGggPT09ICJudW1iZXIiKSByZXR1cm4gewogICAgbmV4dDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHsKICAgICAgaWYgKG8xMiAmJiBpMTAgPj0gbzEyLmxlbmd0aCkgbzEyID0gdm9pZCAwOwogICAgICByZXR1cm4geyB2YWx1ZTogbzEyICYmIG8xMltpMTArK10sIGRvbmU6ICFvMTIgfTsKICAgIH0sICJuZXh0IikKICB9OwogIHRocm93IG5ldyBUeXBlRXJyb3IoczkgPyAiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS4iIDogIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC4iKTsKfQpfX25hbWUoX192YWx1ZXMsICJfX3ZhbHVlcyIpOwpmdW5jdGlvbiBfX3JlYWQobzEyLCBuMTEpIHsKICB2YXIgbTUgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIG8xMltTeW1ib2wuaXRlcmF0b3JdOwogIGlmICghbTUpIHJldHVybiBvMTI7CiAgdmFyIGkxMCA9IG01LmNhbGwobzEyKSwgcjEwLCBhciA9IFtdLCBlMTA7CiAgdHJ5IHsKICAgIHdoaWxlICgobjExID09PSB2b2lkIDAgfHwgbjExLS0gPiAwKSAmJiAhKHIxMCA9IGkxMC5uZXh0KCkpLmRvbmUpIGFyLnB1c2gocjEwLnZhbHVlKTsKICB9IGNhdGNoIChlcnJvcikgewogICAgZTEwID0geyBlcnJvciB9OwogIH0gZmluYWxseSB7CiAgICB0cnkgewogICAgICBpZiAocjEwICYmICFyMTAuZG9uZSAmJiAobTUgPSBpMTBbInJldHVybiJdKSkgbTUuY2FsbChpMTApOwogICAgfSBmaW5hbGx5IHsKICAgICAgaWYgKGUxMCkgdGhyb3cgZTEwLmVycm9yOwogICAgfQogIH0KICByZXR1cm4gYXI7Cn0KX19uYW1lKF9fcmVhZCwgIl9fcmVhZCIpOwpmdW5jdGlvbiBfX3NwcmVhZCgpIHsKICBmb3IgKHZhciBhciA9IFtdLCBpMTAgPSAwOyBpMTAgPCBhcmd1bWVudHMubGVuZ3RoOyBpMTArKykKICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaTEwXSkpOwogIHJldHVybiBhcjsKfQpfX25hbWUoX19zcHJlYWQsICJfX3NwcmVhZCIpOwpmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHsKICBmb3IgKHZhciBzOSA9IDAsIGkxMCA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaTEwIDwgaWw7IGkxMCsrKSBzOSArPSBhcmd1bWVudHNbaTEwXS5sZW5ndGg7CiAgZm9yICh2YXIgcjEwID0gQXJyYXkoczkpLCBrMyA9IDAsIGkxMCA9IDA7IGkxMCA8IGlsOyBpMTArKykKICAgIGZvciAodmFyIGE0ID0gYXJndW1lbnRzW2kxMF0sIGozID0gMCwgamwgPSBhNC5sZW5ndGg7IGozIDwgamw7IGozKyssIGszKyspCiAgICAgIHIxMFtrM10gPSBhNFtqM107CiAgcmV0dXJuIHIxMDsKfQpfX25hbWUoX19zcHJlYWRBcnJheXMsICJfX3NwcmVhZEFycmF5cyIpOwpmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tMiwgcGFjaykgewogIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkxMCA9IDAsIGw1ID0gZnJvbTIubGVuZ3RoLCBhcjsgaTEwIDwgbDU7IGkxMCsrKSB7CiAgICBpZiAoYXIgfHwgIShpMTAgaW4gZnJvbTIpKSB7CiAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbTIsIDAsIGkxMCk7CiAgICAgIGFyW2kxMF0gPSBmcm9tMltpMTBdOwogICAgfQogIH0KICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20yKSk7Cn0KX19uYW1lKF9fc3ByZWFkQXJyYXksICJfX3NwcmVhZEFycmF5Iik7CmZ1bmN0aW9uIF9fYXdhaXQodjQpIHsKICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdjQsIHRoaXMpIDogbmV3IF9fYXdhaXQodjQpOwp9Cl9fbmFtZShfX2F3YWl0LCAiX19hd2FpdCIpOwpmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikgewogIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLiIpOwogIHZhciBnMyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaTEwLCBxID0gW107CiAgcmV0dXJuIGkxMCA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBBc3luY0l0ZXJhdG9yID09PSAiZnVuY3Rpb24iID8gQXN5bmNJdGVyYXRvciA6IE9iamVjdCkucHJvdG90eXBlKSwgdmVyYigibmV4dCIpLCB2ZXJiKCJ0aHJvdyIpLCB2ZXJiKCJyZXR1cm4iLCBhd2FpdFJldHVybiksIGkxMFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzOwogIH0sIGkxMDsKICBmdW5jdGlvbiBhd2FpdFJldHVybihmNikgewogICAgcmV0dXJuIGZ1bmN0aW9uKHY0KSB7CiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodjQpLnRoZW4oZjYsIHJlamVjdCk7CiAgICB9OwogIH0KICBfX25hbWUoYXdhaXRSZXR1cm4sICJhd2FpdFJldHVybiIpOwogIGZ1bmN0aW9uIHZlcmIobjExLCBmNikgewogICAgaWYgKGczW24xMV0pIHsKICAgICAgaTEwW24xMV0gPSBmdW5jdGlvbih2NCkgewogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihhNCwgYjQpIHsKICAgICAgICAgIHEucHVzaChbbjExLCB2NCwgYTQsIGI0XSkgPiAxIHx8IHJlc3VtZShuMTEsIHY0KTsKICAgICAgICB9KTsKICAgICAgfTsKICAgICAgaWYgKGY2KSBpMTBbbjExXSA9IGY2KGkxMFtuMTFdKTsKICAgIH0KICB9CiAgX19uYW1lKHZlcmIsICJ2ZXJiIik7CiAgZnVuY3Rpb24gcmVzdW1lKG4xMSwgdjQpIHsKICAgIHRyeSB7CiAgICAgIHN0ZXAoZzNbbjExXSh2NCkpOwogICAgfSBjYXRjaCAoZTEwKSB7CiAgICAgIHNldHRsZShxWzBdWzNdLCBlMTApOwogICAgfQogIH0KICBfX25hbWUocmVzdW1lLCAicmVzdW1lIik7CiAgZnVuY3Rpb24gc3RlcChyMTApIHsKICAgIHIxMC52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUocjEwLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByMTApOwogIH0KICBfX25hbWUoc3RlcCwgInN0ZXAiKTsKICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlMikgewogICAgcmVzdW1lKCJuZXh0IiwgdmFsdWUyKTsKICB9CiAgX19uYW1lKGZ1bGZpbGwsICJmdWxmaWxsIik7CiAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlMikgewogICAgcmVzdW1lKCJ0aHJvdyIsIHZhbHVlMik7CiAgfQogIF9fbmFtZShyZWplY3QsICJyZWplY3QiKTsKICBmdW5jdGlvbiBzZXR0bGUoZjYsIHY0KSB7CiAgICBpZiAoZjYodjQpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7CiAgfQogIF9fbmFtZShzZXR0bGUsICJzZXR0bGUiKTsKfQpfX25hbWUoX19hc3luY0dlbmVyYXRvciwgIl9fYXN5bmNHZW5lcmF0b3IiKTsKZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvMTIpIHsKICB2YXIgaTEwLCBwNjsKICByZXR1cm4gaTEwID0ge30sIHZlcmIoIm5leHQiKSwgdmVyYigidGhyb3ciLCBmdW5jdGlvbihlMTApIHsKICAgIHRocm93IGUxMDsKICB9KSwgdmVyYigicmV0dXJuIiksIGkxMFtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpczsKICB9LCBpMTA7CiAgZnVuY3Rpb24gdmVyYihuMTEsIGY2KSB7CiAgICBpMTBbbjExXSA9IG8xMltuMTFdID8gZnVuY3Rpb24odjQpIHsKICAgICAgcmV0dXJuIChwNiA9ICFwNikgPyB7IHZhbHVlOiBfX2F3YWl0KG8xMltuMTFdKHY0KSksIGRvbmU6IGZhbHNlIH0gOiBmNiA/IGY2KHY0KSA6IHY0OwogICAgfSA6IGY2OwogIH0KICBfX25hbWUodmVyYiwgInZlcmIiKTsKfQpfX25hbWUoX19hc3luY0RlbGVnYXRvciwgIl9fYXN5bmNEZWxlZ2F0b3IiKTsKZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvMTIpIHsKICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC4iKTsKICB2YXIgbTUgPSBvMTJbU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpMTA7CiAgcmV0dXJuIG01ID8gbTUuY2FsbChvMTIpIDogKG8xMiA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gImZ1bmN0aW9uIiA/IF9fdmFsdWVzKG8xMikgOiBvMTJbU3ltYm9sLml0ZXJhdG9yXSgpLCBpMTAgPSB7fSwgdmVyYigibmV4dCIpLCB2ZXJiKCJ0aHJvdyIpLCB2ZXJiKCJyZXR1cm4iKSwgaTEwW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXM7CiAgfSwgaTEwKTsKICBmdW5jdGlvbiB2ZXJiKG4xMSkgewogICAgaTEwW24xMV0gPSBvMTJbbjExXSAmJiBmdW5jdGlvbih2NCkgewogICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZTIsIHJlamVjdCkgewogICAgICAgIHY0ID0gbzEyW24xMV0odjQpLCBzZXR0bGUocmVzb2x2ZTIsIHJlamVjdCwgdjQuZG9uZSwgdjQudmFsdWUpOwogICAgICB9KTsKICAgIH07CiAgfQogIF9fbmFtZSh2ZXJiLCAidmVyYiIpOwogIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlMiwgcmVqZWN0LCBkNCwgdjQpIHsKICAgIFByb21pc2UucmVzb2x2ZSh2NCkudGhlbihmdW5jdGlvbih2NSkgewogICAgICByZXNvbHZlMih7IHZhbHVlOiB2NSwgZG9uZTogZDQgfSk7CiAgICB9LCByZWplY3QpOwogIH0KICBfX25hbWUoc2V0dGxlLCAic2V0dGxlIik7Cn0KX19uYW1lKF9fYXN5bmNWYWx1ZXMsICJfX2FzeW5jVmFsdWVzIik7CmZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3MikgewogIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsICJyYXciLCB7IHZhbHVlOiByYXcyIH0pOwogIH0gZWxzZSB7CiAgICBjb29rZWQucmF3ID0gcmF3MjsKICB9CiAgcmV0dXJuIGNvb2tlZDsKfQpfX25hbWUoX19tYWtlVGVtcGxhdGVPYmplY3QsICJfX21ha2VUZW1wbGF0ZU9iamVjdCIpOwo7CnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8xMiwgdjQpIHsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkobzEyLCAiZGVmYXVsdCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHY0IH0pOwp9KSA6IGZ1bmN0aW9uKG8xMiwgdjQpIHsKICBvMTJbImRlZmF1bHQiXSA9IHY0Owp9Owp2YXIgb3duS2V5cyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24obzEyKSB7CiAgb3duS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uKG8xMykgewogICAgdmFyIGFyID0gW107CiAgICBmb3IgKHZhciBrMyBpbiBvMTMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobzEzLCBrMykpIGFyW2FyLmxlbmd0aF0gPSBrMzsKICAgIHJldHVybiBhcjsKICB9OwogIHJldHVybiBvd25LZXlzKG8xMik7Cn0sICJvd25LZXlzIik7CmZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHsKICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kOwogIHZhciByZXN1bHQgPSB7fTsKICBpZiAobW9kICE9IG51bGwpIHsKICAgIGZvciAodmFyIGszID0gb3duS2V5cyhtb2QpLCBpMTAgPSAwOyBpMTAgPCBrMy5sZW5ndGg7IGkxMCsrKSBpZiAoazNbaTEwXSAhPT0gImRlZmF1bHQiKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGszW2kxMF0pOwogIH0KICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpOwogIHJldHVybiByZXN1bHQ7Cn0KX19uYW1lKF9faW1wb3J0U3RhciwgIl9faW1wb3J0U3RhciIpOwpmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7CiAgcmV0dXJuIG1vZCAmJiBtb2QuX19lc01vZHVsZSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07Cn0KX19uYW1lKF9faW1wb3J0RGVmYXVsdCwgIl9faW1wb3J0RGVmYXVsdCIpOwpmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZjYpIHsKICBpZiAoa2luZCA9PT0gImEiICYmICFmNikgdGhyb3cgbmV3IFR5cGVFcnJvcigiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyIik7CiAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gImZ1bmN0aW9uIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZjYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0Iik7CiAgcmV0dXJuIGtpbmQgPT09ICJtIiA/IGY2IDoga2luZCA9PT0gImEiID8gZjYuY2FsbChyZWNlaXZlcikgOiBmNiA/IGY2LnZhbHVlIDogc3RhdGUuZ2V0KHJlY2VpdmVyKTsKfQpfX25hbWUoX19jbGFzc1ByaXZhdGVGaWVsZEdldCwgIl9fY2xhc3NQcml2YXRlRmllbGRHZXQiKTsKZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlMiwga2luZCwgZjYpIHsKICBpZiAoa2luZCA9PT0gIm0iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGUiKTsKICBpZiAoa2luZCA9PT0gImEiICYmICFmNikgdGhyb3cgbmV3IFR5cGVFcnJvcigiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyIik7CiAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gImZ1bmN0aW9uIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZjYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXQiKTsKICByZXR1cm4ga2luZCA9PT0gImEiID8gZjYuY2FsbChyZWNlaXZlciwgdmFsdWUyKSA6IGY2ID8gZjYudmFsdWUgPSB2YWx1ZTIgOiBzdGF0ZS5zZXQocmVjZWl2ZXIsIHZhbHVlMiksIHZhbHVlMjsKfQpfX25hbWUoX19jbGFzc1ByaXZhdGVGaWVsZFNldCwgIl9fY2xhc3NQcml2YXRlRmllbGRTZXQiKTsKZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEluKHN0YXRlLCByZWNlaXZlcikgewogIGlmIChyZWNlaXZlciA9PT0gbnVsbCB8fCB0eXBlb2YgcmVjZWl2ZXIgIT09ICJvYmplY3QiICYmIHR5cGVvZiByZWNlaXZlciAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IHVzZSAnaW4nIG9wZXJhdG9yIG9uIG5vbi1vYmplY3QiKTsKICByZXR1cm4gdHlwZW9mIHN0YXRlID09PSAiZnVuY3Rpb24iID8gcmVjZWl2ZXIgPT09IHN0YXRlIDogc3RhdGUuaGFzKHJlY2VpdmVyKTsKfQpfX25hbWUoX19jbGFzc1ByaXZhdGVGaWVsZEluLCAiX19jbGFzc1ByaXZhdGVGaWVsZEluIik7CmZ1bmN0aW9uIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudjIsIHZhbHVlMiwgYXN5bmMyKSB7CiAgaWYgKHZhbHVlMiAhPT0gbnVsbCAmJiB2YWx1ZTIgIT09IHZvaWQgMCkgewogICAgaWYgKHR5cGVvZiB2YWx1ZTIgIT09ICJvYmplY3QiICYmIHR5cGVvZiB2YWx1ZTIgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZC4iKTsKICAgIHZhciBkaXNwb3NlLCBpbm5lcjsKICAgIGlmIChhc3luYzIpIHsKICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJTeW1ib2wuYXN5bmNEaXNwb3NlIGlzIG5vdCBkZWZpbmVkLiIpOwogICAgICBkaXNwb3NlID0gdmFsdWUyW1N5bWJvbC5hc3luY0Rpc3Bvc2VdOwogICAgfQogICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkgewogICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJTeW1ib2wuZGlzcG9zZSBpcyBub3QgZGVmaW5lZC4iKTsKICAgICAgZGlzcG9zZSA9IHZhbHVlMltTeW1ib2wuZGlzcG9zZV07CiAgICAgIGlmIChhc3luYzIpIGlubmVyID0gZGlzcG9zZTsKICAgIH0KICAgIGlmICh0eXBlb2YgZGlzcG9zZSAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IG5vdCBkaXNwb3NhYmxlLiIpOwogICAgaWYgKGlubmVyKSBkaXNwb3NlID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHsKICAgICAgdHJ5IHsKICAgICAgICBpbm5lci5jYWxsKHRoaXMpOwogICAgICB9IGNhdGNoIChlMTApIHsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZTEwKTsKICAgICAgfQogICAgfSwgImRpc3Bvc2UiKTsKICAgIGVudjIuc3RhY2sucHVzaCh7IHZhbHVlOiB2YWx1ZTIsIGRpc3Bvc2UsIGFzeW5jOiBhc3luYzIgfSk7CiAgfSBlbHNlIGlmIChhc3luYzIpIHsKICAgIGVudjIuc3RhY2sucHVzaCh7IGFzeW5jOiB0cnVlIH0pOwogIH0KICByZXR1cm4gdmFsdWUyOwp9Cl9fbmFtZShfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSwgIl9fYWRkRGlzcG9zYWJsZVJlc291cmNlIik7CnZhciBfU3VwcHJlc3NlZEVycm9yID0gdHlwZW9mIFN1cHByZXNzZWRFcnJvciA9PT0gImZ1bmN0aW9uIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uKGVycm9yLCBzdXBwcmVzc2VkLCBtZXNzYWdlMikgewogIHZhciBlMTAgPSBuZXcgRXJyb3IobWVzc2FnZTIpOwogIHJldHVybiBlMTAubmFtZSA9ICJTdXBwcmVzc2VkRXJyb3IiLCBlMTAuZXJyb3IgPSBlcnJvciwgZTEwLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlMTA7Cn07CmZ1bmN0aW9uIF9fZGlzcG9zZVJlc291cmNlcyhlbnYyKSB7CiAgZnVuY3Rpb24gZmFpbChlMTApIHsKICAgIGVudjIuZXJyb3IgPSBlbnYyLmhhc0Vycm9yID8gbmV3IF9TdXBwcmVzc2VkRXJyb3IoZTEwLCBlbnYyLmVycm9yLCAiQW4gZXJyb3Igd2FzIHN1cHByZXNzZWQgZHVyaW5nIGRpc3Bvc2FsLiIpIDogZTEwOwogICAgZW52Mi5oYXNFcnJvciA9IHRydWU7CiAgfQogIF9fbmFtZShmYWlsLCAiZmFpbCIpOwogIHZhciByMTAsIHM5ID0gMDsKICBmdW5jdGlvbiBuZXh0MigpIHsKICAgIHdoaWxlIChyMTAgPSBlbnYyLnN0YWNrLnBvcCgpKSB7CiAgICAgIHRyeSB7CiAgICAgICAgaWYgKCFyMTAuYXN5bmMgJiYgczkgPT09IDEpIHJldHVybiBzOSA9IDAsIGVudjIuc3RhY2sucHVzaChyMTApLCBQcm9taXNlLnJlc29sdmUoKS50aGVuKG5leHQyKTsKICAgICAgICBpZiAocjEwLmRpc3Bvc2UpIHsKICAgICAgICAgIHZhciByZXN1bHQgPSByMTAuZGlzcG9zZS5jYWxsKHIxMC52YWx1ZSk7CiAgICAgICAgICBpZiAocjEwLmFzeW5jKSByZXR1cm4gczkgfD0gMiwgUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihuZXh0MiwgZnVuY3Rpb24oZTEwKSB7CiAgICAgICAgICAgIGZhaWwoZTEwKTsKICAgICAgICAgICAgcmV0dXJuIG5leHQyKCk7CiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgczkgfD0gMTsKICAgICAgfSBjYXRjaCAoZTEwKSB7CiAgICAgICAgZmFpbChlMTApOwogICAgICB9CiAgICB9CiAgICBpZiAoczkgPT09IDEpIHJldHVybiBlbnYyLmhhc0Vycm9yID8gUHJvbWlzZS5yZWplY3QoZW52Mi5lcnJvcikgOiBQcm9taXNlLnJlc29sdmUoKTsKICAgIGlmIChlbnYyLmhhc0Vycm9yKSB0aHJvdyBlbnYyLmVycm9yOwogIH0KICBfX25hbWUobmV4dDIsICJuZXh0Iik7CiAgcmV0dXJuIG5leHQyKCk7Cn0KX19uYW1lKF9fZGlzcG9zZVJlc291cmNlcywgIl9fZGlzcG9zZVJlc291cmNlcyIpOwpmdW5jdGlvbiBfX3Jld3JpdGVSZWxhdGl2ZUltcG9ydEV4dGVuc2lvbihwYXRoMiwgcHJlc2VydmVKc3gpIHsKICBpZiAodHlwZW9mIHBhdGgyID09PSAic3RyaW5nIiAmJiAvXlwuXC4/XC8vLnRlc3QocGF0aDIpKSB7CiAgICByZXR1cm4gcGF0aDIucmVwbGFjZSgvXC4odHN4KSR8KCg/OlwuZCk/KSgoPzpcLlteLi9dKz8pPylcLihbY21dPyl0cyQvaSwgZnVuY3Rpb24obTUsIHRzeCwgZDQsIGV4dCwgY20pIHsKICAgICAgcmV0dXJuIHRzeCA/IHByZXNlcnZlSnN4ID8gIi5qc3giIDogIi5qcyIgOiBkNCAmJiAoIWV4dCB8fCAhY20pID8gbTUgOiBkNCArIGV4dCArICIuIiArIGNtLnRvTG93ZXJDYXNlKCkgKyAianMiOwogICAgfSk7CiAgfQogIHJldHVybiBwYXRoMjsKfQpfX25hbWUoX19yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb24sICJfX3Jld3JpdGVSZWxhdGl2ZUltcG9ydEV4dGVuc2lvbiIpOwp2YXIgdHNsaWJfZXM2X2RlZmF1bHQgPSB7CiAgX19leHRlbmRzLAogIF9fYXNzaWduLAogIF9fcmVzdCwKICBfX2RlY29yYXRlLAogIF9fcGFyYW0sCiAgX19lc0RlY29yYXRlLAogIF9fcnVuSW5pdGlhbGl6ZXJzOiBfX3J1bkluaXRpYWxpemVyczIsCiAgX19wcm9wS2V5LAogIF9fc2V0RnVuY3Rpb25OYW1lLAogIF9fbWV0YWRhdGEsCiAgX19hd2FpdGVyLAogIF9fZ2VuZXJhdG9yLAogIF9fY3JlYXRlQmluZGluZywKICBfX2V4cG9ydFN0YXIsCiAgX192YWx1ZXMsCiAgX19yZWFkLAogIF9fc3ByZWFkLAogIF9fc3ByZWFkQXJyYXlzLAogIF9fc3ByZWFkQXJyYXksCiAgX19hd2FpdCwKICBfX2FzeW5jR2VuZXJhdG9yLAogIF9fYXN5bmNEZWxlZ2F0b3IsCiAgX19hc3luY1ZhbHVlcywKICBfX21ha2VUZW1wbGF0ZU9iamVjdCwKICBfX2ltcG9ydFN0YXIsCiAgX19pbXBvcnREZWZhdWx0LAogIF9fY2xhc3NQcml2YXRlRmllbGRHZXQsCiAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCwKICBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4sCiAgX19hZGREaXNwb3NhYmxlUmVzb3VyY2UsCiAgX19kaXNwb3NlUmVzb3VyY2VzLAogIF9fcmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9uCn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9pc0Z1bmN0aW9uLmpzCmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUyKSB7CiAgcmV0dXJuIHR5cGVvZiB2YWx1ZTIgPT09ICJmdW5jdGlvbiI7Cn0KX19uYW1lKGlzRnVuY3Rpb24sICJpc0Z1bmN0aW9uIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9jcmVhdGVFcnJvckNsYXNzLmpzCmZ1bmN0aW9uIGNyZWF0ZUVycm9yQ2xhc3MoY3JlYXRlSW1wbCkgewogIHZhciBfc3VwZXIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGluc3RhbmNlKSB7CiAgICBFcnJvci5jYWxsKGluc3RhbmNlKTsKICAgIGluc3RhbmNlLnN0YWNrID0gbmV3IEVycm9yKCkuc3RhY2s7CiAgfSwgIl9zdXBlciIpOwogIHZhciBjdG9yRnVuYyA9IGNyZWF0ZUltcGwoX3N1cGVyKTsKICBjdG9yRnVuYy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7CiAgY3RvckZ1bmMucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvckZ1bmM7CiAgcmV0dXJuIGN0b3JGdW5jOwp9Cl9fbmFtZShjcmVhdGVFcnJvckNsYXNzLCAiY3JlYXRlRXJyb3JDbGFzcyIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvVW5zdWJzY3JpcHRpb25FcnJvci5qcwp2YXIgVW5zdWJzY3JpcHRpb25FcnJvciA9IGNyZWF0ZUVycm9yQ2xhc3MoZnVuY3Rpb24oX3N1cGVyKSB7CiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gVW5zdWJzY3JpcHRpb25FcnJvckltcGwoZXJyb3JzKSB7CiAgICBfc3VwZXIodGhpcyk7CiAgICB0aGlzLm1lc3NhZ2UgPSBlcnJvcnMgPyBlcnJvcnMubGVuZ3RoICsgIiBlcnJvcnMgb2NjdXJyZWQgZHVyaW5nIHVuc3Vic2NyaXB0aW9uOlxuIiArIGVycm9ycy5tYXAoZnVuY3Rpb24oZXJyLCBpMTApIHsKICAgICAgcmV0dXJuIGkxMCArIDEgKyAiKSAiICsgZXJyLnRvU3RyaW5nKCk7CiAgICB9KS5qb2luKCJcbiAgIikgOiAiIjsKICAgIHRoaXMubmFtZSA9ICJVbnN1YnNjcmlwdGlvbkVycm9yIjsKICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzOwogIH0sICJVbnN1YnNjcmlwdGlvbkVycm9ySW1wbCIpOwp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2FyclJlbW92ZS5qcwpmdW5jdGlvbiBhcnJSZW1vdmUoYXJyLCBpdGVtKSB7CiAgaWYgKGFycikgewogICAgdmFyIGluZGV4MiA9IGFyci5pbmRleE9mKGl0ZW0pOwogICAgMCA8PSBpbmRleDIgJiYgYXJyLnNwbGljZShpbmRleDIsIDEpOwogIH0KfQpfX25hbWUoYXJyUmVtb3ZlLCAiYXJyUmVtb3ZlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvU3Vic2NyaXB0aW9uLmpzCnZhciBTdWJzY3JpcHRpb24gPSAoZnVuY3Rpb24oKSB7CiAgZnVuY3Rpb24gU3Vic2NyaXB0aW9uMihpbml0aWFsVGVhcmRvd24pIHsKICAgIHRoaXMuaW5pdGlhbFRlYXJkb3duID0gaW5pdGlhbFRlYXJkb3duOwogICAgdGhpcy5jbG9zZWQgPSBmYWxzZTsKICAgIHRoaXMuX3BhcmVudGFnZSA9IG51bGw7CiAgICB0aGlzLl9maW5hbGl6ZXJzID0gbnVsbDsKICB9CiAgX19uYW1lKFN1YnNjcmlwdGlvbjIsICJTdWJzY3JpcHRpb24iKTsKICBTdWJzY3JpcHRpb24yLnByb3RvdHlwZS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGVfMSwgX2EyLCBlXzIsIF9iOwogICAgdmFyIGVycm9yczsKICAgIGlmICghdGhpcy5jbG9zZWQpIHsKICAgICAgdGhpcy5jbG9zZWQgPSB0cnVlOwogICAgICB2YXIgX3BhcmVudGFnZSA9IHRoaXMuX3BhcmVudGFnZTsKICAgICAgaWYgKF9wYXJlbnRhZ2UpIHsKICAgICAgICB0aGlzLl9wYXJlbnRhZ2UgPSBudWxsOwogICAgICAgIGlmIChBcnJheS5pc0FycmF5KF9wYXJlbnRhZ2UpKSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBmb3IgKHZhciBfcGFyZW50YWdlXzEgPSBfX3ZhbHVlcyhfcGFyZW50YWdlKSwgX3BhcmVudGFnZV8xXzEgPSBfcGFyZW50YWdlXzEubmV4dCgpOyAhX3BhcmVudGFnZV8xXzEuZG9uZTsgX3BhcmVudGFnZV8xXzEgPSBfcGFyZW50YWdlXzEubmV4dCgpKSB7CiAgICAgICAgICAgICAgdmFyIHBhcmVudF8xID0gX3BhcmVudGFnZV8xXzEudmFsdWU7CiAgICAgICAgICAgICAgcGFyZW50XzEucmVtb3ZlKHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGNhdGNoIChlXzFfMSkgewogICAgICAgICAgICBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OwogICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBpZiAoX3BhcmVudGFnZV8xXzEgJiYgIV9wYXJlbnRhZ2VfMV8xLmRvbmUgJiYgKF9hMiA9IF9wYXJlbnRhZ2VfMS5yZXR1cm4pKSBfYTIuY2FsbChfcGFyZW50YWdlXzEpOwogICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgIGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBfcGFyZW50YWdlLnJlbW92ZSh0aGlzKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFyIGluaXRpYWxGaW5hbGl6ZXIgPSB0aGlzLmluaXRpYWxUZWFyZG93bjsKICAgICAgaWYgKGlzRnVuY3Rpb24oaW5pdGlhbEZpbmFsaXplcikpIHsKICAgICAgICB0cnkgewogICAgICAgICAgaW5pdGlhbEZpbmFsaXplcigpOwogICAgICAgIH0gY2F0Y2ggKGUxMCkgewogICAgICAgICAgZXJyb3JzID0gZTEwIGluc3RhbmNlb2YgVW5zdWJzY3JpcHRpb25FcnJvciA/IGUxMC5lcnJvcnMgOiBbZTEwXTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFyIF9maW5hbGl6ZXJzID0gdGhpcy5fZmluYWxpemVyczsKICAgICAgaWYgKF9maW5hbGl6ZXJzKSB7CiAgICAgICAgdGhpcy5fZmluYWxpemVycyA9IG51bGw7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGZvciAodmFyIF9maW5hbGl6ZXJzXzEgPSBfX3ZhbHVlcyhfZmluYWxpemVycyksIF9maW5hbGl6ZXJzXzFfMSA9IF9maW5hbGl6ZXJzXzEubmV4dCgpOyAhX2ZpbmFsaXplcnNfMV8xLmRvbmU7IF9maW5hbGl6ZXJzXzFfMSA9IF9maW5hbGl6ZXJzXzEubmV4dCgpKSB7CiAgICAgICAgICAgIHZhciBmaW5hbGl6ZXIgPSBfZmluYWxpemVyc18xXzEudmFsdWU7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgZXhlY0ZpbmFsaXplcihmaW5hbGl6ZXIpOwogICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMgIT09IG51bGwgJiYgZXJyb3JzICE9PSB2b2lkIDAgPyBlcnJvcnMgOiBbXTsKICAgICAgICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgVW5zdWJzY3JpcHRpb25FcnJvcikgewogICAgICAgICAgICAgICAgZXJyb3JzID0gX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoZXJyb3JzKSksIF9fcmVhZChlcnIuZXJyb3JzKSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGVycik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoZV8yXzEpIHsKICAgICAgICAgIGVfMiA9IHsgZXJyb3I6IGVfMl8xIH07CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmIChfZmluYWxpemVyc18xXzEgJiYgIV9maW5hbGl6ZXJzXzFfMS5kb25lICYmIChfYiA9IF9maW5hbGl6ZXJzXzEucmV0dXJuKSkgX2IuY2FsbChfZmluYWxpemVyc18xKTsKICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgIGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGVycm9ycykgewogICAgICAgIHRocm93IG5ldyBVbnN1YnNjcmlwdGlvbkVycm9yKGVycm9ycyk7CiAgICAgIH0KICAgIH0KICB9OwogIFN1YnNjcmlwdGlvbjIucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKHRlYXJkb3duKSB7CiAgICB2YXIgX2EyOwogICAgaWYgKHRlYXJkb3duICYmIHRlYXJkb3duICE9PSB0aGlzKSB7CiAgICAgIGlmICh0aGlzLmNsb3NlZCkgewogICAgICAgIGV4ZWNGaW5hbGl6ZXIodGVhcmRvd24pOwogICAgICB9IGVsc2UgewogICAgICAgIGlmICh0ZWFyZG93biBpbnN0YW5jZW9mIFN1YnNjcmlwdGlvbjIpIHsKICAgICAgICAgIGlmICh0ZWFyZG93bi5jbG9zZWQgfHwgdGVhcmRvd24uX2hhc1BhcmVudCh0aGlzKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICB0ZWFyZG93bi5fYWRkUGFyZW50KHRoaXMpOwogICAgICAgIH0KICAgICAgICAodGhpcy5fZmluYWxpemVycyA9IChfYTIgPSB0aGlzLl9maW5hbGl6ZXJzKSAhPT0gbnVsbCAmJiBfYTIgIT09IHZvaWQgMCA/IF9hMiA6IFtdKS5wdXNoKHRlYXJkb3duKTsKICAgICAgfQogICAgfQogIH07CiAgU3Vic2NyaXB0aW9uMi5wcm90b3R5cGUuX2hhc1BhcmVudCA9IGZ1bmN0aW9uKHBhcmVudCkgewogICAgdmFyIF9wYXJlbnRhZ2UgPSB0aGlzLl9wYXJlbnRhZ2U7CiAgICByZXR1cm4gX3BhcmVudGFnZSA9PT0gcGFyZW50IHx8IEFycmF5LmlzQXJyYXkoX3BhcmVudGFnZSkgJiYgX3BhcmVudGFnZS5pbmNsdWRlcyhwYXJlbnQpOwogIH07CiAgU3Vic2NyaXB0aW9uMi5wcm90b3R5cGUuX2FkZFBhcmVudCA9IGZ1bmN0aW9uKHBhcmVudCkgewogICAgdmFyIF9wYXJlbnRhZ2UgPSB0aGlzLl9wYXJlbnRhZ2U7CiAgICB0aGlzLl9wYXJlbnRhZ2UgPSBBcnJheS5pc0FycmF5KF9wYXJlbnRhZ2UpID8gKF9wYXJlbnRhZ2UucHVzaChwYXJlbnQpLCBfcGFyZW50YWdlKSA6IF9wYXJlbnRhZ2UgPyBbX3BhcmVudGFnZSwgcGFyZW50XSA6IHBhcmVudDsKICB9OwogIFN1YnNjcmlwdGlvbjIucHJvdG90eXBlLl9yZW1vdmVQYXJlbnQgPSBmdW5jdGlvbihwYXJlbnQpIHsKICAgIHZhciBfcGFyZW50YWdlID0gdGhpcy5fcGFyZW50YWdlOwogICAgaWYgKF9wYXJlbnRhZ2UgPT09IHBhcmVudCkgewogICAgICB0aGlzLl9wYXJlbnRhZ2UgPSBudWxsOwogICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KF9wYXJlbnRhZ2UpKSB7CiAgICAgIGFyclJlbW92ZShfcGFyZW50YWdlLCBwYXJlbnQpOwogICAgfQogIH07CiAgU3Vic2NyaXB0aW9uMi5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24odGVhcmRvd24pIHsKICAgIHZhciBfZmluYWxpemVycyA9IHRoaXMuX2ZpbmFsaXplcnM7CiAgICBfZmluYWxpemVycyAmJiBhcnJSZW1vdmUoX2ZpbmFsaXplcnMsIHRlYXJkb3duKTsKICAgIGlmICh0ZWFyZG93biBpbnN0YW5jZW9mIFN1YnNjcmlwdGlvbjIpIHsKICAgICAgdGVhcmRvd24uX3JlbW92ZVBhcmVudCh0aGlzKTsKICAgIH0KICB9OwogIFN1YnNjcmlwdGlvbjIuRU1QVFkgPSAoZnVuY3Rpb24oKSB7CiAgICB2YXIgZW1wdHk0ID0gbmV3IFN1YnNjcmlwdGlvbjIoKTsKICAgIGVtcHR5NC5jbG9zZWQgPSB0cnVlOwogICAgcmV0dXJuIGVtcHR5NDsKICB9KSgpOwogIHJldHVybiBTdWJzY3JpcHRpb24yOwp9KSgpOwp2YXIgRU1QVFlfU1VCU0NSSVBUSU9OID0gU3Vic2NyaXB0aW9uLkVNUFRZOwpmdW5jdGlvbiBpc1N1YnNjcmlwdGlvbih2YWx1ZTIpIHsKICByZXR1cm4gdmFsdWUyIGluc3RhbmNlb2YgU3Vic2NyaXB0aW9uIHx8IHZhbHVlMiAmJiAiY2xvc2VkIiBpbiB2YWx1ZTIgJiYgaXNGdW5jdGlvbih2YWx1ZTIucmVtb3ZlKSAmJiBpc0Z1bmN0aW9uKHZhbHVlMi5hZGQpICYmIGlzRnVuY3Rpb24odmFsdWUyLnVuc3Vic2NyaWJlKTsKfQpfX25hbWUoaXNTdWJzY3JpcHRpb24sICJpc1N1YnNjcmlwdGlvbiIpOwpmdW5jdGlvbiBleGVjRmluYWxpemVyKGZpbmFsaXplcikgewogIGlmIChpc0Z1bmN0aW9uKGZpbmFsaXplcikpIHsKICAgIGZpbmFsaXplcigpOwogIH0gZWxzZSB7CiAgICBmaW5hbGl6ZXIudW5zdWJzY3JpYmUoKTsKICB9Cn0KX19uYW1lKGV4ZWNGaW5hbGl6ZXIsICJleGVjRmluYWxpemVyIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvY29uZmlnLmpzCnZhciBjb25maWcgPSB7CiAgb25VbmhhbmRsZWRFcnJvcjogbnVsbCwKICBvblN0b3BwZWROb3RpZmljYXRpb246IG51bGwsCiAgUHJvbWlzZTogdm9pZCAwLAogIHVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmc6IGZhbHNlLAogIHVzZURlcHJlY2F0ZWROZXh0Q29udGV4dDogZmFsc2UKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvdGltZW91dFByb3ZpZGVyLmpzCnZhciB0aW1lb3V0UHJvdmlkZXIgPSB7CiAgc2V0VGltZW91dDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihoYW5kbGVyMiwgdGltZW91dDIpIHsKICAgIHZhciBhcmdzID0gW107CiAgICBmb3IgKHZhciBfaSA9IDI7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykgewogICAgICBhcmdzW19pIC0gMl0gPSBhcmd1bWVudHNbX2ldOwogICAgfQogICAgdmFyIGRlbGVnYXRlID0gdGltZW91dFByb3ZpZGVyLmRlbGVnYXRlOwogICAgaWYgKGRlbGVnYXRlID09PSBudWxsIHx8IGRlbGVnYXRlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkZWxlZ2F0ZS5zZXRUaW1lb3V0KSB7CiAgICAgIHJldHVybiBkZWxlZ2F0ZS5zZXRUaW1lb3V0LmFwcGx5KGRlbGVnYXRlLCBfX3NwcmVhZEFycmF5KFtoYW5kbGVyMiwgdGltZW91dDJdLCBfX3JlYWQoYXJncykpKTsKICAgIH0KICAgIHJldHVybiBzZXRUaW1lb3V0LmFwcGx5KHZvaWQgMCwgX19zcHJlYWRBcnJheShbaGFuZGxlcjIsIHRpbWVvdXQyXSwgX19yZWFkKGFyZ3MpKSk7CiAgfSwgInNldFRpbWVvdXQiKSwKICBjbGVhclRpbWVvdXQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oaGFuZGxlMykgewogICAgdmFyIGRlbGVnYXRlID0gdGltZW91dFByb3ZpZGVyLmRlbGVnYXRlOwogICAgcmV0dXJuICgoZGVsZWdhdGUgPT09IG51bGwgfHwgZGVsZWdhdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRlbGVnYXRlLmNsZWFyVGltZW91dCkgfHwgY2xlYXJUaW1lb3V0KShoYW5kbGUzKTsKICB9LCAiY2xlYXJUaW1lb3V0IiksCiAgZGVsZWdhdGU6IHZvaWQgMAp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvcmVwb3J0VW5oYW5kbGVkRXJyb3IuanMKZnVuY3Rpb24gcmVwb3J0VW5oYW5kbGVkRXJyb3IoZXJyKSB7CiAgdGltZW91dFByb3ZpZGVyLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICB2YXIgb25VbmhhbmRsZWRFcnJvciA9IGNvbmZpZy5vblVuaGFuZGxlZEVycm9yOwogICAgaWYgKG9uVW5oYW5kbGVkRXJyb3IpIHsKICAgICAgb25VbmhhbmRsZWRFcnJvcihlcnIpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgZXJyOwogICAgfQogIH0pOwp9Cl9fbmFtZShyZXBvcnRVbmhhbmRsZWRFcnJvciwgInJlcG9ydFVuaGFuZGxlZEVycm9yIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9ub29wLmpzCmZ1bmN0aW9uIG5vb3AoKSB7Cn0KX19uYW1lKG5vb3AsICJub29wIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvTm90aWZpY2F0aW9uRmFjdG9yaWVzLmpzCnZhciBDT01QTEVURV9OT1RJRklDQVRJT04gPSAoZnVuY3Rpb24oKSB7CiAgcmV0dXJuIGNyZWF0ZU5vdGlmaWNhdGlvbigiQyIsIHZvaWQgMCwgdm9pZCAwKTsKfSkoKTsKZnVuY3Rpb24gZXJyb3JOb3RpZmljYXRpb24oZXJyb3IpIHsKICByZXR1cm4gY3JlYXRlTm90aWZpY2F0aW9uKCJFIiwgdm9pZCAwLCBlcnJvcik7Cn0KX19uYW1lKGVycm9yTm90aWZpY2F0aW9uLCAiZXJyb3JOb3RpZmljYXRpb24iKTsKZnVuY3Rpb24gbmV4dE5vdGlmaWNhdGlvbih2YWx1ZTIpIHsKICByZXR1cm4gY3JlYXRlTm90aWZpY2F0aW9uKCJOIiwgdmFsdWUyLCB2b2lkIDApOwp9Cl9fbmFtZShuZXh0Tm90aWZpY2F0aW9uLCAibmV4dE5vdGlmaWNhdGlvbiIpOwpmdW5jdGlvbiBjcmVhdGVOb3RpZmljYXRpb24oa2luZCwgdmFsdWUyLCBlcnJvcikgewogIHJldHVybiB7CiAgICBraW5kLAogICAgdmFsdWU6IHZhbHVlMiwKICAgIGVycm9yCiAgfTsKfQpfX25hbWUoY3JlYXRlTm90aWZpY2F0aW9uLCAiY3JlYXRlTm90aWZpY2F0aW9uIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9lcnJvckNvbnRleHQuanMKdmFyIGNvbnRleHQgPSBudWxsOwpmdW5jdGlvbiBlcnJvckNvbnRleHQoY2IpIHsKICBpZiAoY29uZmlnLnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcpIHsKICAgIHZhciBpc1Jvb3QgPSAhY29udGV4dDsKICAgIGlmIChpc1Jvb3QpIHsKICAgICAgY29udGV4dCA9IHsgZXJyb3JUaHJvd246IGZhbHNlLCBlcnJvcjogbnVsbCB9OwogICAgfQogICAgY2IoKTsKICAgIGlmIChpc1Jvb3QpIHsKICAgICAgdmFyIF9hMiA9IGNvbnRleHQsIGVycm9yVGhyb3duID0gX2EyLmVycm9yVGhyb3duLCBlcnJvciA9IF9hMi5lcnJvcjsKICAgICAgY29udGV4dCA9IG51bGw7CiAgICAgIGlmIChlcnJvclRocm93bikgewogICAgICAgIHRocm93IGVycm9yOwogICAgICB9CiAgICB9CiAgfSBlbHNlIHsKICAgIGNiKCk7CiAgfQp9Cl9fbmFtZShlcnJvckNvbnRleHQsICJlcnJvckNvbnRleHQiKTsKZnVuY3Rpb24gY2FwdHVyZUVycm9yKGVycikgewogIGlmIChjb25maWcudXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZyAmJiBjb250ZXh0KSB7CiAgICBjb250ZXh0LmVycm9yVGhyb3duID0gdHJ1ZTsKICAgIGNvbnRleHQuZXJyb3IgPSBlcnI7CiAgfQp9Cl9fbmFtZShjYXB0dXJlRXJyb3IsICJjYXB0dXJlRXJyb3IiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9TdWJzY3JpYmVyLmpzCnZhciBTdWJzY3JpYmVyID0gKGZ1bmN0aW9uKF9zdXBlcikgewogIF9fZXh0ZW5kcyhTdWJzY3JpYmVyMiwgX3N1cGVyKTsKICBmdW5jdGlvbiBTdWJzY3JpYmVyMihkZXN0aW5hdGlvbikgewogICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpczsKICAgIF90aGlzLmlzU3RvcHBlZCA9IGZhbHNlOwogICAgaWYgKGRlc3RpbmF0aW9uKSB7CiAgICAgIF90aGlzLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb247CiAgICAgIGlmIChpc1N1YnNjcmlwdGlvbihkZXN0aW5hdGlvbikpIHsKICAgICAgICBkZXN0aW5hdGlvbi5hZGQoX3RoaXMpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBfdGhpcy5kZXN0aW5hdGlvbiA9IEVNUFRZX09CU0VSVkVSOwogICAgfQogICAgcmV0dXJuIF90aGlzOwogIH0KICBfX25hbWUoU3Vic2NyaWJlcjIsICJTdWJzY3JpYmVyIik7CiAgU3Vic2NyaWJlcjIuY3JlYXRlID0gZnVuY3Rpb24obmV4dDIsIGVycm9yLCBjb21wbGV0ZSkgewogICAgcmV0dXJuIG5ldyBTYWZlU3Vic2NyaWJlcihuZXh0MiwgZXJyb3IsIGNvbXBsZXRlKTsKICB9OwogIFN1YnNjcmliZXIyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24odmFsdWUyKSB7CiAgICBpZiAodGhpcy5pc1N0b3BwZWQpIHsKICAgICAgaGFuZGxlU3RvcHBlZE5vdGlmaWNhdGlvbihuZXh0Tm90aWZpY2F0aW9uKHZhbHVlMiksIHRoaXMpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5fbmV4dCh2YWx1ZTIpOwogICAgfQogIH07CiAgU3Vic2NyaWJlcjIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24oZXJyKSB7CiAgICBpZiAodGhpcy5pc1N0b3BwZWQpIHsKICAgICAgaGFuZGxlU3RvcHBlZE5vdGlmaWNhdGlvbihlcnJvck5vdGlmaWNhdGlvbihlcnIpLCB0aGlzKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTsKICAgICAgdGhpcy5fZXJyb3IoZXJyKTsKICAgIH0KICB9OwogIFN1YnNjcmliZXIyLnByb3RvdHlwZS5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMuaXNTdG9wcGVkKSB7CiAgICAgIGhhbmRsZVN0b3BwZWROb3RpZmljYXRpb24oQ09NUExFVEVfTk9USUZJQ0FUSU9OLCB0aGlzKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTsKICAgICAgdGhpcy5fY29tcGxldGUoKTsKICAgIH0KICB9OwogIFN1YnNjcmliZXIyLnByb3RvdHlwZS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKCkgewogICAgaWYgKCF0aGlzLmNsb3NlZCkgewogICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7CiAgICAgIF9zdXBlci5wcm90b3R5cGUudW5zdWJzY3JpYmUuY2FsbCh0aGlzKTsKICAgICAgdGhpcy5kZXN0aW5hdGlvbiA9IG51bGw7CiAgICB9CiAgfTsKICBTdWJzY3JpYmVyMi5wcm90b3R5cGUuX25leHQgPSBmdW5jdGlvbih2YWx1ZTIpIHsKICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dCh2YWx1ZTIpOwogIH07CiAgU3Vic2NyaWJlcjIucHJvdG90eXBlLl9lcnJvciA9IGZ1bmN0aW9uKGVycikgewogICAgdHJ5IHsKICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpOwogICAgfSBmaW5hbGx5IHsKICAgICAgdGhpcy51bnN1YnNjcmliZSgpOwogICAgfQogIH07CiAgU3Vic2NyaWJlcjIucHJvdG90eXBlLl9jb21wbGV0ZSA9IGZ1bmN0aW9uKCkgewogICAgdHJ5IHsKICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgfSBmaW5hbGx5IHsKICAgICAgdGhpcy51bnN1YnNjcmliZSgpOwogICAgfQogIH07CiAgcmV0dXJuIFN1YnNjcmliZXIyOwp9KShTdWJzY3JpcHRpb24pOwp2YXIgX2JpbmQgPSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZDsKZnVuY3Rpb24gYmluZChmbiwgdGhpc0FyZykgewogIHJldHVybiBfYmluZC5jYWxsKGZuLCB0aGlzQXJnKTsKfQpfX25hbWUoYmluZCwgImJpbmQiKTsKdmFyIENvbnN1bWVyT2JzZXJ2ZXIgPSAoZnVuY3Rpb24oKSB7CiAgZnVuY3Rpb24gQ29uc3VtZXJPYnNlcnZlcjIocGFydGlhbE9ic2VydmVyKSB7CiAgICB0aGlzLnBhcnRpYWxPYnNlcnZlciA9IHBhcnRpYWxPYnNlcnZlcjsKICB9CiAgX19uYW1lKENvbnN1bWVyT2JzZXJ2ZXIyLCAiQ29uc3VtZXJPYnNlcnZlciIpOwogIENvbnN1bWVyT2JzZXJ2ZXIyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24odmFsdWUyKSB7CiAgICB2YXIgcGFydGlhbE9ic2VydmVyID0gdGhpcy5wYXJ0aWFsT2JzZXJ2ZXI7CiAgICBpZiAocGFydGlhbE9ic2VydmVyLm5leHQpIHsKICAgICAgdHJ5IHsKICAgICAgICBwYXJ0aWFsT2JzZXJ2ZXIubmV4dCh2YWx1ZTIpOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGhhbmRsZVVuaGFuZGxlZEVycm9yKGVycm9yKTsKICAgICAgfQogICAgfQogIH07CiAgQ29uc3VtZXJPYnNlcnZlcjIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24oZXJyKSB7CiAgICB2YXIgcGFydGlhbE9ic2VydmVyID0gdGhpcy5wYXJ0aWFsT2JzZXJ2ZXI7CiAgICBpZiAocGFydGlhbE9ic2VydmVyLmVycm9yKSB7CiAgICAgIHRyeSB7CiAgICAgICAgcGFydGlhbE9ic2VydmVyLmVycm9yKGVycik7CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgaGFuZGxlVW5oYW5kbGVkRXJyb3IoZXJyb3IpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBoYW5kbGVVbmhhbmRsZWRFcnJvcihlcnIpOwogICAgfQogIH07CiAgQ29uc3VtZXJPYnNlcnZlcjIucHJvdG90eXBlLmNvbXBsZXRlID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgcGFydGlhbE9ic2VydmVyID0gdGhpcy5wYXJ0aWFsT2JzZXJ2ZXI7CiAgICBpZiAocGFydGlhbE9ic2VydmVyLmNvbXBsZXRlKSB7CiAgICAgIHRyeSB7CiAgICAgICAgcGFydGlhbE9ic2VydmVyLmNvbXBsZXRlKCk7CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgaGFuZGxlVW5oYW5kbGVkRXJyb3IoZXJyb3IpOwogICAgICB9CiAgICB9CiAgfTsKICByZXR1cm4gQ29uc3VtZXJPYnNlcnZlcjI7Cn0pKCk7CnZhciBTYWZlU3Vic2NyaWJlciA9IChmdW5jdGlvbihfc3VwZXIpIHsKICBfX2V4dGVuZHMoU2FmZVN1YnNjcmliZXIyLCBfc3VwZXIpOwogIGZ1bmN0aW9uIFNhZmVTdWJzY3JpYmVyMihvYnNlcnZlck9yTmV4dCwgZXJyb3IsIGNvbXBsZXRlKSB7CiAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgdmFyIHBhcnRpYWxPYnNlcnZlcjsKICAgIGlmIChpc0Z1bmN0aW9uKG9ic2VydmVyT3JOZXh0KSB8fCAhb2JzZXJ2ZXJPck5leHQpIHsKICAgICAgcGFydGlhbE9ic2VydmVyID0gewogICAgICAgIG5leHQ6IG9ic2VydmVyT3JOZXh0ICE9PSBudWxsICYmIG9ic2VydmVyT3JOZXh0ICE9PSB2b2lkIDAgPyBvYnNlcnZlck9yTmV4dCA6IHZvaWQgMCwKICAgICAgICBlcnJvcjogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogdm9pZCAwLAogICAgICAgIGNvbXBsZXRlOiBjb21wbGV0ZSAhPT0gbnVsbCAmJiBjb21wbGV0ZSAhPT0gdm9pZCAwID8gY29tcGxldGUgOiB2b2lkIDAKICAgICAgfTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBjb250ZXh0XzE7CiAgICAgIGlmIChfdGhpcyAmJiBjb25maWcudXNlRGVwcmVjYXRlZE5leHRDb250ZXh0KSB7CiAgICAgICAgY29udGV4dF8xID0gT2JqZWN0LmNyZWF0ZShvYnNlcnZlck9yTmV4dCk7CiAgICAgICAgY29udGV4dF8xLnVuc3Vic2NyaWJlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gX3RoaXMudW5zdWJzY3JpYmUoKTsKICAgICAgICB9OwogICAgICAgIHBhcnRpYWxPYnNlcnZlciA9IHsKICAgICAgICAgIG5leHQ6IG9ic2VydmVyT3JOZXh0Lm5leHQgJiYgYmluZChvYnNlcnZlck9yTmV4dC5uZXh0LCBjb250ZXh0XzEpLAogICAgICAgICAgZXJyb3I6IG9ic2VydmVyT3JOZXh0LmVycm9yICYmIGJpbmQob2JzZXJ2ZXJPck5leHQuZXJyb3IsIGNvbnRleHRfMSksCiAgICAgICAgICBjb21wbGV0ZTogb2JzZXJ2ZXJPck5leHQuY29tcGxldGUgJiYgYmluZChvYnNlcnZlck9yTmV4dC5jb21wbGV0ZSwgY29udGV4dF8xKQogICAgICAgIH07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGFydGlhbE9ic2VydmVyID0gb2JzZXJ2ZXJPck5leHQ7CiAgICAgIH0KICAgIH0KICAgIF90aGlzLmRlc3RpbmF0aW9uID0gbmV3IENvbnN1bWVyT2JzZXJ2ZXIocGFydGlhbE9ic2VydmVyKTsKICAgIHJldHVybiBfdGhpczsKICB9CiAgX19uYW1lKFNhZmVTdWJzY3JpYmVyMiwgIlNhZmVTdWJzY3JpYmVyIik7CiAgcmV0dXJuIFNhZmVTdWJzY3JpYmVyMjsKfSkoU3Vic2NyaWJlcik7CmZ1bmN0aW9uIGhhbmRsZVVuaGFuZGxlZEVycm9yKGVycm9yKSB7CiAgaWYgKGNvbmZpZy51c2VEZXByZWNhdGVkU3luY2hyb25vdXNFcnJvckhhbmRsaW5nKSB7CiAgICBjYXB0dXJlRXJyb3IoZXJyb3IpOwogIH0gZWxzZSB7CiAgICByZXBvcnRVbmhhbmRsZWRFcnJvcihlcnJvcik7CiAgfQp9Cl9fbmFtZShoYW5kbGVVbmhhbmRsZWRFcnJvciwgImhhbmRsZVVuaGFuZGxlZEVycm9yIik7CmZ1bmN0aW9uIGRlZmF1bHRFcnJvckhhbmRsZXIoZXJyKSB7CiAgdGhyb3cgZXJyOwp9Cl9fbmFtZShkZWZhdWx0RXJyb3JIYW5kbGVyLCAiZGVmYXVsdEVycm9ySGFuZGxlciIpOwpmdW5jdGlvbiBoYW5kbGVTdG9wcGVkTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgc3Vic2NyaWJlcikgewogIHZhciBvblN0b3BwZWROb3RpZmljYXRpb24gPSBjb25maWcub25TdG9wcGVkTm90aWZpY2F0aW9uOwogIG9uU3RvcHBlZE5vdGlmaWNhdGlvbiAmJiB0aW1lb3V0UHJvdmlkZXIuc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgIHJldHVybiBvblN0b3BwZWROb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBzdWJzY3JpYmVyKTsKICB9KTsKfQpfX25hbWUoaGFuZGxlU3RvcHBlZE5vdGlmaWNhdGlvbiwgImhhbmRsZVN0b3BwZWROb3RpZmljYXRpb24iKTsKdmFyIEVNUFRZX09CU0VSVkVSID0gewogIGNsb3NlZDogdHJ1ZSwKICBuZXh0OiBub29wLAogIGVycm9yOiBkZWZhdWx0RXJyb3JIYW5kbGVyLAogIGNvbXBsZXRlOiBub29wCn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc3ltYm9sL29ic2VydmFibGUuanMKdmFyIG9ic2VydmFibGUgPSAoZnVuY3Rpb24oKSB7CiAgcmV0dXJuIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm9ic2VydmFibGUgfHwgIkBAb2JzZXJ2YWJsZSI7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9pZGVudGl0eS5qcwpmdW5jdGlvbiBpZGVudGl0eSh4MykgewogIHJldHVybiB4MzsKfQpfX25hbWUoaWRlbnRpdHksICJpZGVudGl0eSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvcGlwZS5qcwpmdW5jdGlvbiBwaXBlKCkgewogIHZhciBmbnMgPSBbXTsKICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykgewogICAgZm5zW19pXSA9IGFyZ3VtZW50c1tfaV07CiAgfQogIHJldHVybiBwaXBlRnJvbUFycmF5KGZucyk7Cn0KX19uYW1lKHBpcGUsICJwaXBlIik7CmZ1bmN0aW9uIHBpcGVGcm9tQXJyYXkoZm5zKSB7CiAgaWYgKGZucy5sZW5ndGggPT09IDApIHsKICAgIHJldHVybiBpZGVudGl0eTsKICB9CiAgaWYgKGZucy5sZW5ndGggPT09IDEpIHsKICAgIHJldHVybiBmbnNbMF07CiAgfQogIHJldHVybiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uIHBpcGVkKGlucHV0KSB7CiAgICByZXR1cm4gZm5zLnJlZHVjZShmdW5jdGlvbihwcmV2LCBmbikgewogICAgICByZXR1cm4gZm4ocHJldik7CiAgICB9LCBpbnB1dCk7CiAgfSwgInBpcGVkIik7Cn0KX19uYW1lKHBpcGVGcm9tQXJyYXksICJwaXBlRnJvbUFycmF5Iik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvT2JzZXJ2YWJsZS5qcwp2YXIgT2JzZXJ2YWJsZSA9IChmdW5jdGlvbigpIHsKICBmdW5jdGlvbiBPYnNlcnZhYmxlMihzdWJzY3JpYmUyKSB7CiAgICBpZiAoc3Vic2NyaWJlMikgewogICAgICB0aGlzLl9zdWJzY3JpYmUgPSBzdWJzY3JpYmUyOwogICAgfQogIH0KICBfX25hbWUoT2JzZXJ2YWJsZTIsICJPYnNlcnZhYmxlIik7CiAgT2JzZXJ2YWJsZTIucHJvdG90eXBlLmxpZnQgPSBmdW5jdGlvbihvcGVyYXRvcikgewogICAgdmFyIG9ic2VydmFibGUyID0gbmV3IE9ic2VydmFibGUyKCk7CiAgICBvYnNlcnZhYmxlMi5zb3VyY2UgPSB0aGlzOwogICAgb2JzZXJ2YWJsZTIub3BlcmF0b3IgPSBvcGVyYXRvcjsKICAgIHJldHVybiBvYnNlcnZhYmxlMjsKICB9OwogIE9ic2VydmFibGUyLnByb3RvdHlwZS5zdWJzY3JpYmUgPSBmdW5jdGlvbihvYnNlcnZlck9yTmV4dCwgZXJyb3IsIGNvbXBsZXRlKSB7CiAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgdmFyIHN1YnNjcmliZXIgPSBpc1N1YnNjcmliZXIob2JzZXJ2ZXJPck5leHQpID8gb2JzZXJ2ZXJPck5leHQgOiBuZXcgU2FmZVN1YnNjcmliZXIob2JzZXJ2ZXJPck5leHQsIGVycm9yLCBjb21wbGV0ZSk7CiAgICBlcnJvckNvbnRleHQoZnVuY3Rpb24oKSB7CiAgICAgIHZhciBfYTIgPSBfdGhpcywgb3BlcmF0b3IgPSBfYTIub3BlcmF0b3IsIHNvdXJjZSA9IF9hMi5zb3VyY2U7CiAgICAgIHN1YnNjcmliZXIuYWRkKG9wZXJhdG9yID8gb3BlcmF0b3IuY2FsbChzdWJzY3JpYmVyLCBzb3VyY2UpIDogc291cmNlID8gX3RoaXMuX3N1YnNjcmliZShzdWJzY3JpYmVyKSA6IF90aGlzLl90cnlTdWJzY3JpYmUoc3Vic2NyaWJlcikpOwogICAgfSk7CiAgICByZXR1cm4gc3Vic2NyaWJlcjsKICB9OwogIE9ic2VydmFibGUyLnByb3RvdHlwZS5fdHJ5U3Vic2NyaWJlID0gZnVuY3Rpb24oc2luaykgewogICAgdHJ5IHsKICAgICAgcmV0dXJuIHRoaXMuX3N1YnNjcmliZShzaW5rKTsKICAgIH0gY2F0Y2ggKGVycikgewogICAgICBzaW5rLmVycm9yKGVycik7CiAgICB9CiAgfTsKICBPYnNlcnZhYmxlMi5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uKG5leHQyLCBwcm9taXNlQ3RvcikgewogICAgdmFyIF90aGlzID0gdGhpczsKICAgIHByb21pc2VDdG9yID0gZ2V0UHJvbWlzZUN0b3IocHJvbWlzZUN0b3IpOwogICAgcmV0dXJuIG5ldyBwcm9taXNlQ3RvcihmdW5jdGlvbihyZXNvbHZlMiwgcmVqZWN0KSB7CiAgICAgIHZhciBzdWJzY3JpYmVyID0gbmV3IFNhZmVTdWJzY3JpYmVyKHsKICAgICAgICBuZXh0OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKHZhbHVlMikgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgbmV4dDIodmFsdWUyKTsKICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICByZWplY3QoZXJyKTsKICAgICAgICAgICAgc3Vic2NyaWJlci51bnN1YnNjcmliZSgpOwogICAgICAgICAgfQogICAgICAgIH0sICJuZXh0IiksCiAgICAgICAgZXJyb3I6IHJlamVjdCwKICAgICAgICBjb21wbGV0ZTogcmVzb2x2ZTIKICAgICAgfSk7CiAgICAgIF90aGlzLnN1YnNjcmliZShzdWJzY3JpYmVyKTsKICAgIH0pOwogIH07CiAgT2JzZXJ2YWJsZTIucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICB2YXIgX2EyOwogICAgcmV0dXJuIChfYTIgPSB0aGlzLnNvdXJjZSkgPT09IG51bGwgfHwgX2EyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYTIuc3Vic2NyaWJlKHN1YnNjcmliZXIpOwogIH07CiAgT2JzZXJ2YWJsZTIucHJvdG90eXBlW29ic2VydmFibGVdID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpczsKICB9OwogIE9ic2VydmFibGUyLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgb3BlcmF0aW9ucyA9IFtdOwogICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKICAgICAgb3BlcmF0aW9uc1tfaV0gPSBhcmd1bWVudHNbX2ldOwogICAgfQogICAgcmV0dXJuIHBpcGVGcm9tQXJyYXkob3BlcmF0aW9ucykodGhpcyk7CiAgfTsKICBPYnNlcnZhYmxlMi5wcm90b3R5cGUudG9Qcm9taXNlID0gZnVuY3Rpb24ocHJvbWlzZUN0b3IpIHsKICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICBwcm9taXNlQ3RvciA9IGdldFByb21pc2VDdG9yKHByb21pc2VDdG9yKTsKICAgIHJldHVybiBuZXcgcHJvbWlzZUN0b3IoZnVuY3Rpb24ocmVzb2x2ZTIsIHJlamVjdCkgewogICAgICB2YXIgdmFsdWUyOwogICAgICBfdGhpcy5zdWJzY3JpYmUoZnVuY3Rpb24oeDMpIHsKICAgICAgICByZXR1cm4gdmFsdWUyID0geDM7CiAgICAgIH0sIGZ1bmN0aW9uKGVycikgewogICAgICAgIHJldHVybiByZWplY3QoZXJyKTsKICAgICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHJlc29sdmUyKHZhbHVlMik7CiAgICAgIH0pOwogICAgfSk7CiAgfTsKICBPYnNlcnZhYmxlMi5jcmVhdGUgPSBmdW5jdGlvbihzdWJzY3JpYmUyKSB7CiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUyKHN1YnNjcmliZTIpOwogIH07CiAgcmV0dXJuIE9ic2VydmFibGUyOwp9KSgpOwpmdW5jdGlvbiBnZXRQcm9taXNlQ3Rvcihwcm9taXNlQ3RvcikgewogIHZhciBfYTI7CiAgcmV0dXJuIChfYTIgPSBwcm9taXNlQ3RvciAhPT0gbnVsbCAmJiBwcm9taXNlQ3RvciAhPT0gdm9pZCAwID8gcHJvbWlzZUN0b3IgOiBjb25maWcuUHJvbWlzZSkgIT09IG51bGwgJiYgX2EyICE9PSB2b2lkIDAgPyBfYTIgOiBQcm9taXNlOwp9Cl9fbmFtZShnZXRQcm9taXNlQ3RvciwgImdldFByb21pc2VDdG9yIik7CmZ1bmN0aW9uIGlzT2JzZXJ2ZXIodmFsdWUyKSB7CiAgcmV0dXJuIHZhbHVlMiAmJiBpc0Z1bmN0aW9uKHZhbHVlMi5uZXh0KSAmJiBpc0Z1bmN0aW9uKHZhbHVlMi5lcnJvcikgJiYgaXNGdW5jdGlvbih2YWx1ZTIuY29tcGxldGUpOwp9Cl9fbmFtZShpc09ic2VydmVyLCAiaXNPYnNlcnZlciIpOwpmdW5jdGlvbiBpc1N1YnNjcmliZXIodmFsdWUyKSB7CiAgcmV0dXJuIHZhbHVlMiAmJiB2YWx1ZTIgaW5zdGFuY2VvZiBTdWJzY3JpYmVyIHx8IGlzT2JzZXJ2ZXIodmFsdWUyKSAmJiBpc1N1YnNjcmlwdGlvbih2YWx1ZTIpOwp9Cl9fbmFtZShpc1N1YnNjcmliZXIsICJpc1N1YnNjcmliZXIiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2xpZnQuanMKZnVuY3Rpb24gaGFzTGlmdChzb3VyY2UpIHsKICByZXR1cm4gaXNGdW5jdGlvbihzb3VyY2UgPT09IG51bGwgfHwgc291cmNlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzb3VyY2UubGlmdCk7Cn0KX19uYW1lKGhhc0xpZnQsICJoYXNMaWZ0Iik7CmZ1bmN0aW9uIG9wZXJhdGUoaW5pdCkgewogIHJldHVybiBmdW5jdGlvbihzb3VyY2UpIHsKICAgIGlmIChoYXNMaWZ0KHNvdXJjZSkpIHsKICAgICAgcmV0dXJuIHNvdXJjZS5saWZ0KGZ1bmN0aW9uKGxpZnRlZFNvdXJjZSkgewogICAgICAgIHRyeSB7CiAgICAgICAgICByZXR1cm4gaW5pdChsaWZ0ZWRTb3VyY2UsIHRoaXMpOwogICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgdGhpcy5lcnJvcihlcnIpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmFibGUgdG8gbGlmdCB1bmtub3duIE9ic2VydmFibGUgdHlwZSIpOwogIH07Cn0KX19uYW1lKG9wZXJhdGUsICJvcGVyYXRlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL09wZXJhdG9yU3Vic2NyaWJlci5qcwpmdW5jdGlvbiBjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoZGVzdGluYXRpb24sIG9uTmV4dCwgb25Db21wbGV0ZSwgb25FcnJvciwgb25GaW5hbGl6ZSkgewogIHJldHVybiBuZXcgT3BlcmF0b3JTdWJzY3JpYmVyKGRlc3RpbmF0aW9uLCBvbk5leHQsIG9uQ29tcGxldGUsIG9uRXJyb3IsIG9uRmluYWxpemUpOwp9Cl9fbmFtZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIsICJjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIiKTsKdmFyIE9wZXJhdG9yU3Vic2NyaWJlciA9IChmdW5jdGlvbihfc3VwZXIpIHsKICBfX2V4dGVuZHMoT3BlcmF0b3JTdWJzY3JpYmVyMiwgX3N1cGVyKTsKICBmdW5jdGlvbiBPcGVyYXRvclN1YnNjcmliZXIyKGRlc3RpbmF0aW9uLCBvbk5leHQsIG9uQ29tcGxldGUsIG9uRXJyb3IsIG9uRmluYWxpemUsIHNob3VsZFVuc3Vic2NyaWJlKSB7CiAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbikgfHwgdGhpczsKICAgIF90aGlzLm9uRmluYWxpemUgPSBvbkZpbmFsaXplOwogICAgX3RoaXMuc2hvdWxkVW5zdWJzY3JpYmUgPSBzaG91bGRVbnN1YnNjcmliZTsKICAgIF90aGlzLl9uZXh0ID0gb25OZXh0ID8gZnVuY3Rpb24odmFsdWUyKSB7CiAgICAgIHRyeSB7CiAgICAgICAgb25OZXh0KHZhbHVlMik7CiAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgIGRlc3RpbmF0aW9uLmVycm9yKGVycik7CiAgICAgIH0KICAgIH0gOiBfc3VwZXIucHJvdG90eXBlLl9uZXh0OwogICAgX3RoaXMuX2Vycm9yID0gb25FcnJvciA/IGZ1bmN0aW9uKGVycikgewogICAgICB0cnkgewogICAgICAgIG9uRXJyb3IoZXJyKTsKICAgICAgfSBjYXRjaCAoZXJyMikgewogICAgICAgIGRlc3RpbmF0aW9uLmVycm9yKGVycjIpOwogICAgICB9IGZpbmFsbHkgewogICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTsKICAgICAgfQogICAgfSA6IF9zdXBlci5wcm90b3R5cGUuX2Vycm9yOwogICAgX3RoaXMuX2NvbXBsZXRlID0gb25Db21wbGV0ZSA/IGZ1bmN0aW9uKCkgewogICAgICB0cnkgewogICAgICAgIG9uQ29tcGxldGUoKTsKICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgZGVzdGluYXRpb24uZXJyb3IoZXJyKTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICAgIH0KICAgIH0gOiBfc3VwZXIucHJvdG90eXBlLl9jb21wbGV0ZTsKICAgIHJldHVybiBfdGhpczsKICB9CiAgX19uYW1lKE9wZXJhdG9yU3Vic2NyaWJlcjIsICJPcGVyYXRvclN1YnNjcmliZXIiKTsKICBPcGVyYXRvclN1YnNjcmliZXIyLnByb3RvdHlwZS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKCkgewogICAgdmFyIF9hMjsKICAgIGlmICghdGhpcy5zaG91bGRVbnN1YnNjcmliZSB8fCB0aGlzLnNob3VsZFVuc3Vic2NyaWJlKCkpIHsKICAgICAgdmFyIGNsb3NlZF8xID0gdGhpcy5jbG9zZWQ7CiAgICAgIF9zdXBlci5wcm90b3R5cGUudW5zdWJzY3JpYmUuY2FsbCh0aGlzKTsKICAgICAgIWNsb3NlZF8xICYmICgoX2EyID0gdGhpcy5vbkZpbmFsaXplKSA9PT0gbnVsbCB8fCBfYTIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hMi5jYWxsKHRoaXMpKTsKICAgIH0KICB9OwogIHJldHVybiBPcGVyYXRvclN1YnNjcmliZXIyOwp9KShTdWJzY3JpYmVyKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL09iamVjdFVuc3Vic2NyaWJlZEVycm9yLmpzCnZhciBPYmplY3RVbnN1YnNjcmliZWRFcnJvciA9IGNyZWF0ZUVycm9yQ2xhc3MoZnVuY3Rpb24oX3N1cGVyKSB7CiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3JJbXBsKCkgewogICAgX3N1cGVyKHRoaXMpOwogICAgdGhpcy5uYW1lID0gIk9iamVjdFVuc3Vic2NyaWJlZEVycm9yIjsKICAgIHRoaXMubWVzc2FnZSA9ICJvYmplY3QgdW5zdWJzY3JpYmVkIjsKICB9LCAiT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3JJbXBsIik7Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL1N1YmplY3QuanMKdmFyIFN1YmplY3QgPSAoZnVuY3Rpb24oX3N1cGVyKSB7CiAgX19leHRlbmRzKFN1YmplY3QyLCBfc3VwZXIpOwogIGZ1bmN0aW9uIFN1YmplY3QyKCkgewogICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpczsKICAgIF90aGlzLmNsb3NlZCA9IGZhbHNlOwogICAgX3RoaXMuY3VycmVudE9ic2VydmVycyA9IG51bGw7CiAgICBfdGhpcy5vYnNlcnZlcnMgPSBbXTsKICAgIF90aGlzLmlzU3RvcHBlZCA9IGZhbHNlOwogICAgX3RoaXMuaGFzRXJyb3IgPSBmYWxzZTsKICAgIF90aGlzLnRocm93bkVycm9yID0gbnVsbDsKICAgIHJldHVybiBfdGhpczsKICB9CiAgX19uYW1lKFN1YmplY3QyLCAiU3ViamVjdCIpOwogIFN1YmplY3QyLnByb3RvdHlwZS5saWZ0ID0gZnVuY3Rpb24ob3BlcmF0b3IpIHsKICAgIHZhciBzdWJqZWN0ID0gbmV3IEFub255bW91c1N1YmplY3QodGhpcywgdGhpcyk7CiAgICBzdWJqZWN0Lm9wZXJhdG9yID0gb3BlcmF0b3I7CiAgICByZXR1cm4gc3ViamVjdDsKICB9OwogIFN1YmplY3QyLnByb3RvdHlwZS5fdGhyb3dJZkNsb3NlZCA9IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMuY2xvc2VkKSB7CiAgICAgIHRocm93IG5ldyBPYmplY3RVbnN1YnNjcmliZWRFcnJvcigpOwogICAgfQogIH07CiAgU3ViamVjdDIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbih2YWx1ZTIpIHsKICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICBlcnJvckNvbnRleHQoZnVuY3Rpb24oKSB7CiAgICAgIHZhciBlXzEsIF9hMjsKICAgICAgX3RoaXMuX3Rocm93SWZDbG9zZWQoKTsKICAgICAgaWYgKCFfdGhpcy5pc1N0b3BwZWQpIHsKICAgICAgICBpZiAoIV90aGlzLmN1cnJlbnRPYnNlcnZlcnMpIHsKICAgICAgICAgIF90aGlzLmN1cnJlbnRPYnNlcnZlcnMgPSBBcnJheS5mcm9tKF90aGlzLm9ic2VydmVycyk7CiAgICAgICAgfQogICAgICAgIHRyeSB7CiAgICAgICAgICBmb3IgKHZhciBfYiA9IF9fdmFsdWVzKF90aGlzLmN1cnJlbnRPYnNlcnZlcnMpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7CiAgICAgICAgICAgIHZhciBvYnNlcnZlciA9IF9jLnZhbHVlOwogICAgICAgICAgICBvYnNlcnZlci5uZXh0KHZhbHVlMik7CiAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoZV8xXzEpIHsKICAgICAgICAgIGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EyID0gX2IucmV0dXJuKSkgX2EyLmNhbGwoX2IpOwogICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgfTsKICBTdWJqZWN0Mi5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbihlcnIpIHsKICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICBlcnJvckNvbnRleHQoZnVuY3Rpb24oKSB7CiAgICAgIF90aGlzLl90aHJvd0lmQ2xvc2VkKCk7CiAgICAgIGlmICghX3RoaXMuaXNTdG9wcGVkKSB7CiAgICAgICAgX3RoaXMuaGFzRXJyb3IgPSBfdGhpcy5pc1N0b3BwZWQgPSB0cnVlOwogICAgICAgIF90aGlzLnRocm93bkVycm9yID0gZXJyOwogICAgICAgIHZhciBvYnNlcnZlcnMgPSBfdGhpcy5vYnNlcnZlcnM7CiAgICAgICAgd2hpbGUgKG9ic2VydmVycy5sZW5ndGgpIHsKICAgICAgICAgIG9ic2VydmVycy5zaGlmdCgpLmVycm9yKGVycik7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICB9OwogIFN1YmplY3QyLnByb3RvdHlwZS5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkgewogICAgdmFyIF90aGlzID0gdGhpczsKICAgIGVycm9yQ29udGV4dChmdW5jdGlvbigpIHsKICAgICAgX3RoaXMuX3Rocm93SWZDbG9zZWQoKTsKICAgICAgaWYgKCFfdGhpcy5pc1N0b3BwZWQpIHsKICAgICAgICBfdGhpcy5pc1N0b3BwZWQgPSB0cnVlOwogICAgICAgIHZhciBvYnNlcnZlcnMgPSBfdGhpcy5vYnNlcnZlcnM7CiAgICAgICAgd2hpbGUgKG9ic2VydmVycy5sZW5ndGgpIHsKICAgICAgICAgIG9ic2VydmVycy5zaGlmdCgpLmNvbXBsZXRlKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICB9OwogIFN1YmplY3QyLnByb3RvdHlwZS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5pc1N0b3BwZWQgPSB0aGlzLmNsb3NlZCA9IHRydWU7CiAgICB0aGlzLm9ic2VydmVycyA9IHRoaXMuY3VycmVudE9ic2VydmVycyA9IG51bGw7CiAgfTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU3ViamVjdDIucHJvdG90eXBlLCAib2JzZXJ2ZWQiLCB7CiAgICBnZXQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oKSB7CiAgICAgIHZhciBfYTI7CiAgICAgIHJldHVybiAoKF9hMiA9IHRoaXMub2JzZXJ2ZXJzKSA9PT0gbnVsbCB8fCBfYTIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hMi5sZW5ndGgpID4gMDsKICAgIH0sICJnZXQiKSwKICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgY29uZmlndXJhYmxlOiB0cnVlCiAgfSk7CiAgU3ViamVjdDIucHJvdG90eXBlLl90cnlTdWJzY3JpYmUgPSBmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICB0aGlzLl90aHJvd0lmQ2xvc2VkKCk7CiAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5fdHJ5U3Vic2NyaWJlLmNhbGwodGhpcywgc3Vic2NyaWJlcik7CiAgfTsKICBTdWJqZWN0Mi5wcm90b3R5cGUuX3N1YnNjcmliZSA9IGZ1bmN0aW9uKHN1YnNjcmliZXIpIHsKICAgIHRoaXMuX3Rocm93SWZDbG9zZWQoKTsKICAgIHRoaXMuX2NoZWNrRmluYWxpemVkU3RhdHVzZXMoc3Vic2NyaWJlcik7CiAgICByZXR1cm4gdGhpcy5faW5uZXJTdWJzY3JpYmUoc3Vic2NyaWJlcik7CiAgfTsKICBTdWJqZWN0Mi5wcm90b3R5cGUuX2lubmVyU3Vic2NyaWJlID0gZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgdmFyIF90aGlzID0gdGhpczsKICAgIHZhciBfYTIgPSB0aGlzLCBoYXNFcnJvciA9IF9hMi5oYXNFcnJvciwgaXNTdG9wcGVkID0gX2EyLmlzU3RvcHBlZCwgb2JzZXJ2ZXJzID0gX2EyLm9ic2VydmVyczsKICAgIGlmIChoYXNFcnJvciB8fCBpc1N0b3BwZWQpIHsKICAgICAgcmV0dXJuIEVNUFRZX1NVQlNDUklQVElPTjsKICAgIH0KICAgIHRoaXMuY3VycmVudE9ic2VydmVycyA9IG51bGw7CiAgICBvYnNlcnZlcnMucHVzaChzdWJzY3JpYmVyKTsKICAgIHJldHVybiBuZXcgU3Vic2NyaXB0aW9uKGZ1bmN0aW9uKCkgewogICAgICBfdGhpcy5jdXJyZW50T2JzZXJ2ZXJzID0gbnVsbDsKICAgICAgYXJyUmVtb3ZlKG9ic2VydmVycywgc3Vic2NyaWJlcik7CiAgICB9KTsKICB9OwogIFN1YmplY3QyLnByb3RvdHlwZS5fY2hlY2tGaW5hbGl6ZWRTdGF0dXNlcyA9IGZ1bmN0aW9uKHN1YnNjcmliZXIpIHsKICAgIHZhciBfYTIgPSB0aGlzLCBoYXNFcnJvciA9IF9hMi5oYXNFcnJvciwgdGhyb3duRXJyb3IgPSBfYTIudGhyb3duRXJyb3IsIGlzU3RvcHBlZCA9IF9hMi5pc1N0b3BwZWQ7CiAgICBpZiAoaGFzRXJyb3IpIHsKICAgICAgc3Vic2NyaWJlci5lcnJvcih0aHJvd25FcnJvcik7CiAgICB9IGVsc2UgaWYgKGlzU3RvcHBlZCkgewogICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICB9CiAgfTsKICBTdWJqZWN0Mi5wcm90b3R5cGUuYXNPYnNlcnZhYmxlID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgb2JzZXJ2YWJsZTIgPSBuZXcgT2JzZXJ2YWJsZSgpOwogICAgb2JzZXJ2YWJsZTIuc291cmNlID0gdGhpczsKICAgIHJldHVybiBvYnNlcnZhYmxlMjsKICB9OwogIFN1YmplY3QyLmNyZWF0ZSA9IGZ1bmN0aW9uKGRlc3RpbmF0aW9uLCBzb3VyY2UpIHsKICAgIHJldHVybiBuZXcgQW5vbnltb3VzU3ViamVjdChkZXN0aW5hdGlvbiwgc291cmNlKTsKICB9OwogIHJldHVybiBTdWJqZWN0MjsKfSkoT2JzZXJ2YWJsZSk7CnZhciBBbm9ueW1vdXNTdWJqZWN0ID0gKGZ1bmN0aW9uKF9zdXBlcikgewogIF9fZXh0ZW5kcyhBbm9ueW1vdXNTdWJqZWN0MiwgX3N1cGVyKTsKICBmdW5jdGlvbiBBbm9ueW1vdXNTdWJqZWN0MihkZXN0aW5hdGlvbiwgc291cmNlKSB7CiAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgX3RoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjsKICAgIF90aGlzLnNvdXJjZSA9IHNvdXJjZTsKICAgIHJldHVybiBfdGhpczsKICB9CiAgX19uYW1lKEFub255bW91c1N1YmplY3QyLCAiQW5vbnltb3VzU3ViamVjdCIpOwogIEFub255bW91c1N1YmplY3QyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24odmFsdWUyKSB7CiAgICB2YXIgX2EyLCBfYjsKICAgIChfYiA9IChfYTIgPSB0aGlzLmRlc3RpbmF0aW9uKSA9PT0gbnVsbCB8fCBfYTIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hMi5uZXh0KSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChfYTIsIHZhbHVlMik7CiAgfTsKICBBbm9ueW1vdXNTdWJqZWN0Mi5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbihlcnIpIHsKICAgIHZhciBfYTIsIF9iOwogICAgKF9iID0gKF9hMiA9IHRoaXMuZGVzdGluYXRpb24pID09PSBudWxsIHx8IF9hMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EyLmVycm9yKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChfYTIsIGVycik7CiAgfTsKICBBbm9ueW1vdXNTdWJqZWN0Mi5wcm90b3R5cGUuY29tcGxldGUgPSBmdW5jdGlvbigpIHsKICAgIHZhciBfYTIsIF9iOwogICAgKF9iID0gKF9hMiA9IHRoaXMuZGVzdGluYXRpb24pID09PSBudWxsIHx8IF9hMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EyLmNvbXBsZXRlKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChfYTIpOwogIH07CiAgQW5vbnltb3VzU3ViamVjdDIucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICB2YXIgX2EyLCBfYjsKICAgIHJldHVybiAoX2IgPSAoX2EyID0gdGhpcy5zb3VyY2UpID09PSBudWxsIHx8IF9hMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EyLnN1YnNjcmliZShzdWJzY3JpYmVyKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogRU1QVFlfU1VCU0NSSVBUSU9OOwogIH07CiAgcmV0dXJuIEFub255bW91c1N1YmplY3QyOwp9KShTdWJqZWN0KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvZGF0ZVRpbWVzdGFtcFByb3ZpZGVyLmpzCnZhciBkYXRlVGltZXN0YW1wUHJvdmlkZXIgPSB7CiAgbm93OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIChkYXRlVGltZXN0YW1wUHJvdmlkZXIuZGVsZWdhdGUgfHwgRGF0ZSkubm93KCk7CiAgfSwgIm5vdyIpLAogIGRlbGVnYXRlOiB2b2lkIDAKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9SZXBsYXlTdWJqZWN0LmpzCnZhciBSZXBsYXlTdWJqZWN0ID0gKGZ1bmN0aW9uKF9zdXBlcikgewogIF9fZXh0ZW5kcyhSZXBsYXlTdWJqZWN0MiwgX3N1cGVyKTsKICBmdW5jdGlvbiBSZXBsYXlTdWJqZWN0MihfYnVmZmVyU2l6ZSwgX3dpbmRvd1RpbWUsIF90aW1lc3RhbXBQcm92aWRlcikgewogICAgaWYgKF9idWZmZXJTaXplID09PSB2b2lkIDApIHsKICAgICAgX2J1ZmZlclNpemUgPSBJbmZpbml0eTsKICAgIH0KICAgIGlmIChfd2luZG93VGltZSA9PT0gdm9pZCAwKSB7CiAgICAgIF93aW5kb3dUaW1lID0gSW5maW5pdHk7CiAgICB9CiAgICBpZiAoX3RpbWVzdGFtcFByb3ZpZGVyID09PSB2b2lkIDApIHsKICAgICAgX3RpbWVzdGFtcFByb3ZpZGVyID0gZGF0ZVRpbWVzdGFtcFByb3ZpZGVyOwogICAgfQogICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpczsKICAgIF90aGlzLl9idWZmZXJTaXplID0gX2J1ZmZlclNpemU7CiAgICBfdGhpcy5fd2luZG93VGltZSA9IF93aW5kb3dUaW1lOwogICAgX3RoaXMuX3RpbWVzdGFtcFByb3ZpZGVyID0gX3RpbWVzdGFtcFByb3ZpZGVyOwogICAgX3RoaXMuX2J1ZmZlciA9IFtdOwogICAgX3RoaXMuX2luZmluaXRlVGltZVdpbmRvdyA9IHRydWU7CiAgICBfdGhpcy5faW5maW5pdGVUaW1lV2luZG93ID0gX3dpbmRvd1RpbWUgPT09IEluZmluaXR5OwogICAgX3RoaXMuX2J1ZmZlclNpemUgPSBNYXRoLm1heCgxLCBfYnVmZmVyU2l6ZSk7CiAgICBfdGhpcy5fd2luZG93VGltZSA9IE1hdGgubWF4KDEsIF93aW5kb3dUaW1lKTsKICAgIHJldHVybiBfdGhpczsKICB9CiAgX19uYW1lKFJlcGxheVN1YmplY3QyLCAiUmVwbGF5U3ViamVjdCIpOwogIFJlcGxheVN1YmplY3QyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24odmFsdWUyKSB7CiAgICB2YXIgX2EyID0gdGhpcywgaXNTdG9wcGVkID0gX2EyLmlzU3RvcHBlZCwgX2J1ZmZlciA9IF9hMi5fYnVmZmVyLCBfaW5maW5pdGVUaW1lV2luZG93ID0gX2EyLl9pbmZpbml0ZVRpbWVXaW5kb3csIF90aW1lc3RhbXBQcm92aWRlciA9IF9hMi5fdGltZXN0YW1wUHJvdmlkZXIsIF93aW5kb3dUaW1lID0gX2EyLl93aW5kb3dUaW1lOwogICAgaWYgKCFpc1N0b3BwZWQpIHsKICAgICAgX2J1ZmZlci5wdXNoKHZhbHVlMik7CiAgICAgICFfaW5maW5pdGVUaW1lV2luZG93ICYmIF9idWZmZXIucHVzaChfdGltZXN0YW1wUHJvdmlkZXIubm93KCkgKyBfd2luZG93VGltZSk7CiAgICB9CiAgICB0aGlzLl90cmltQnVmZmVyKCk7CiAgICBfc3VwZXIucHJvdG90eXBlLm5leHQuY2FsbCh0aGlzLCB2YWx1ZTIpOwogIH07CiAgUmVwbGF5U3ViamVjdDIucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICB0aGlzLl90aHJvd0lmQ2xvc2VkKCk7CiAgICB0aGlzLl90cmltQnVmZmVyKCk7CiAgICB2YXIgc3Vic2NyaXB0aW9uID0gdGhpcy5faW5uZXJTdWJzY3JpYmUoc3Vic2NyaWJlcik7CiAgICB2YXIgX2EyID0gdGhpcywgX2luZmluaXRlVGltZVdpbmRvdyA9IF9hMi5faW5maW5pdGVUaW1lV2luZG93LCBfYnVmZmVyID0gX2EyLl9idWZmZXI7CiAgICB2YXIgY29weSA9IF9idWZmZXIuc2xpY2UoKTsKICAgIGZvciAodmFyIGkxMCA9IDA7IGkxMCA8IGNvcHkubGVuZ3RoICYmICFzdWJzY3JpYmVyLmNsb3NlZDsgaTEwICs9IF9pbmZpbml0ZVRpbWVXaW5kb3cgPyAxIDogMikgewogICAgICBzdWJzY3JpYmVyLm5leHQoY29weVtpMTBdKTsKICAgIH0KICAgIHRoaXMuX2NoZWNrRmluYWxpemVkU3RhdHVzZXMoc3Vic2NyaWJlcik7CiAgICByZXR1cm4gc3Vic2NyaXB0aW9uOwogIH07CiAgUmVwbGF5U3ViamVjdDIucHJvdG90eXBlLl90cmltQnVmZmVyID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgX2EyID0gdGhpcywgX2J1ZmZlclNpemUgPSBfYTIuX2J1ZmZlclNpemUsIF90aW1lc3RhbXBQcm92aWRlciA9IF9hMi5fdGltZXN0YW1wUHJvdmlkZXIsIF9idWZmZXIgPSBfYTIuX2J1ZmZlciwgX2luZmluaXRlVGltZVdpbmRvdyA9IF9hMi5faW5maW5pdGVUaW1lV2luZG93OwogICAgdmFyIGFkanVzdGVkQnVmZmVyU2l6ZSA9IChfaW5maW5pdGVUaW1lV2luZG93ID8gMSA6IDIpICogX2J1ZmZlclNpemU7CiAgICBfYnVmZmVyU2l6ZSA8IEluZmluaXR5ICYmIGFkanVzdGVkQnVmZmVyU2l6ZSA8IF9idWZmZXIubGVuZ3RoICYmIF9idWZmZXIuc3BsaWNlKDAsIF9idWZmZXIubGVuZ3RoIC0gYWRqdXN0ZWRCdWZmZXJTaXplKTsKICAgIGlmICghX2luZmluaXRlVGltZVdpbmRvdykgewogICAgICB2YXIgbm93MiA9IF90aW1lc3RhbXBQcm92aWRlci5ub3coKTsKICAgICAgdmFyIGxhc3QzID0gMDsKICAgICAgZm9yICh2YXIgaTEwID0gMTsgaTEwIDwgX2J1ZmZlci5sZW5ndGggJiYgX2J1ZmZlcltpMTBdIDw9IG5vdzI7IGkxMCArPSAyKSB7CiAgICAgICAgbGFzdDMgPSBpMTA7CiAgICAgIH0KICAgICAgbGFzdDMgJiYgX2J1ZmZlci5zcGxpY2UoMCwgbGFzdDMgKyAxKTsKICAgIH0KICB9OwogIHJldHVybiBSZXBsYXlTdWJqZWN0MjsKfSkoU3ViamVjdCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVyL0FjdGlvbi5qcwp2YXIgQWN0aW9uID0gKGZ1bmN0aW9uKF9zdXBlcikgewogIF9fZXh0ZW5kcyhBY3Rpb24yLCBfc3VwZXIpOwogIGZ1bmN0aW9uIEFjdGlvbjIoc2NoZWR1bGVyLCB3b3JrKSB7CiAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpczsKICB9CiAgX19uYW1lKEFjdGlvbjIsICJBY3Rpb24iKTsKICBBY3Rpb24yLnByb3RvdHlwZS5zY2hlZHVsZSA9IGZ1bmN0aW9uKHN0YXRlLCBkZWxheTIpIHsKICAgIGlmIChkZWxheTIgPT09IHZvaWQgMCkgewogICAgICBkZWxheTIgPSAwOwogICAgfQogICAgcmV0dXJuIHRoaXM7CiAgfTsKICByZXR1cm4gQWN0aW9uMjsKfSkoU3Vic2NyaXB0aW9uKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvaW50ZXJ2YWxQcm92aWRlci5qcwp2YXIgaW50ZXJ2YWxQcm92aWRlciA9IHsKICBzZXRJbnRlcnZhbDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihoYW5kbGVyMiwgdGltZW91dDIpIHsKICAgIHZhciBhcmdzID0gW107CiAgICBmb3IgKHZhciBfaSA9IDI7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykgewogICAgICBhcmdzW19pIC0gMl0gPSBhcmd1bWVudHNbX2ldOwogICAgfQogICAgdmFyIGRlbGVnYXRlID0gaW50ZXJ2YWxQcm92aWRlci5kZWxlZ2F0ZTsKICAgIGlmIChkZWxlZ2F0ZSA9PT0gbnVsbCB8fCBkZWxlZ2F0ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGVsZWdhdGUuc2V0SW50ZXJ2YWwpIHsKICAgICAgcmV0dXJuIGRlbGVnYXRlLnNldEludGVydmFsLmFwcGx5KGRlbGVnYXRlLCBfX3NwcmVhZEFycmF5KFtoYW5kbGVyMiwgdGltZW91dDJdLCBfX3JlYWQoYXJncykpKTsKICAgIH0KICAgIHJldHVybiBzZXRJbnRlcnZhbC5hcHBseSh2b2lkIDAsIF9fc3ByZWFkQXJyYXkoW2hhbmRsZXIyLCB0aW1lb3V0Ml0sIF9fcmVhZChhcmdzKSkpOwogIH0sICJzZXRJbnRlcnZhbCIpLAogIGNsZWFySW50ZXJ2YWw6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oaGFuZGxlMykgewogICAgdmFyIGRlbGVnYXRlID0gaW50ZXJ2YWxQcm92aWRlci5kZWxlZ2F0ZTsKICAgIHJldHVybiAoKGRlbGVnYXRlID09PSBudWxsIHx8IGRlbGVnYXRlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkZWxlZ2F0ZS5jbGVhckludGVydmFsKSB8fCBjbGVhckludGVydmFsKShoYW5kbGUzKTsKICB9LCAiY2xlYXJJbnRlcnZhbCIpLAogIGRlbGVnYXRlOiB2b2lkIDAKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvQXN5bmNBY3Rpb24uanMKdmFyIEFzeW5jQWN0aW9uID0gKGZ1bmN0aW9uKF9zdXBlcikgewogIF9fZXh0ZW5kcyhBc3luY0FjdGlvbjIsIF9zdXBlcik7CiAgZnVuY3Rpb24gQXN5bmNBY3Rpb24yKHNjaGVkdWxlciwgd29yaykgewogICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgc2NoZWR1bGVyLCB3b3JrKSB8fCB0aGlzOwogICAgX3RoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyOwogICAgX3RoaXMud29yayA9IHdvcms7CiAgICBfdGhpcy5wZW5kaW5nID0gZmFsc2U7CiAgICByZXR1cm4gX3RoaXM7CiAgfQogIF9fbmFtZShBc3luY0FjdGlvbjIsICJBc3luY0FjdGlvbiIpOwogIEFzeW5jQWN0aW9uMi5wcm90b3R5cGUuc2NoZWR1bGUgPSBmdW5jdGlvbihzdGF0ZSwgZGVsYXkyKSB7CiAgICB2YXIgX2EyOwogICAgaWYgKGRlbGF5MiA9PT0gdm9pZCAwKSB7CiAgICAgIGRlbGF5MiA9IDA7CiAgICB9CiAgICBpZiAodGhpcy5jbG9zZWQpIHsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICB0aGlzLnN0YXRlID0gc3RhdGU7CiAgICB2YXIgaWQgPSB0aGlzLmlkOwogICAgdmFyIHNjaGVkdWxlciA9IHRoaXMuc2NoZWR1bGVyOwogICAgaWYgKGlkICE9IG51bGwpIHsKICAgICAgdGhpcy5pZCA9IHRoaXMucmVjeWNsZUFzeW5jSWQoc2NoZWR1bGVyLCBpZCwgZGVsYXkyKTsKICAgIH0KICAgIHRoaXMucGVuZGluZyA9IHRydWU7CiAgICB0aGlzLmRlbGF5ID0gZGVsYXkyOwogICAgdGhpcy5pZCA9IChfYTIgPSB0aGlzLmlkKSAhPT0gbnVsbCAmJiBfYTIgIT09IHZvaWQgMCA/IF9hMiA6IHRoaXMucmVxdWVzdEFzeW5jSWQoc2NoZWR1bGVyLCB0aGlzLmlkLCBkZWxheTIpOwogICAgcmV0dXJuIHRoaXM7CiAgfTsKICBBc3luY0FjdGlvbjIucHJvdG90eXBlLnJlcXVlc3RBc3luY0lkID0gZnVuY3Rpb24oc2NoZWR1bGVyLCBfaWQsIGRlbGF5MikgewogICAgaWYgKGRlbGF5MiA9PT0gdm9pZCAwKSB7CiAgICAgIGRlbGF5MiA9IDA7CiAgICB9CiAgICByZXR1cm4gaW50ZXJ2YWxQcm92aWRlci5zZXRJbnRlcnZhbChzY2hlZHVsZXIuZmx1c2guYmluZChzY2hlZHVsZXIsIHRoaXMpLCBkZWxheTIpOwogIH07CiAgQXN5bmNBY3Rpb24yLnByb3RvdHlwZS5yZWN5Y2xlQXN5bmNJZCA9IGZ1bmN0aW9uKF9zY2hlZHVsZXIsIGlkLCBkZWxheTIpIHsKICAgIGlmIChkZWxheTIgPT09IHZvaWQgMCkgewogICAgICBkZWxheTIgPSAwOwogICAgfQogICAgaWYgKGRlbGF5MiAhPSBudWxsICYmIHRoaXMuZGVsYXkgPT09IGRlbGF5MiAmJiB0aGlzLnBlbmRpbmcgPT09IGZhbHNlKSB7CiAgICAgIHJldHVybiBpZDsKICAgIH0KICAgIGlmIChpZCAhPSBudWxsKSB7CiAgICAgIGludGVydmFsUHJvdmlkZXIuY2xlYXJJbnRlcnZhbChpZCk7CiAgICB9CiAgICByZXR1cm4gdm9pZCAwOwogIH07CiAgQXN5bmNBY3Rpb24yLnByb3RvdHlwZS5leGVjdXRlID0gZnVuY3Rpb24oc3RhdGUsIGRlbGF5MikgewogICAgaWYgKHRoaXMuY2xvc2VkKSB7CiAgICAgIHJldHVybiBuZXcgRXJyb3IoImV4ZWN1dGluZyBhIGNhbmNlbGxlZCBhY3Rpb24iKTsKICAgIH0KICAgIHRoaXMucGVuZGluZyA9IGZhbHNlOwogICAgdmFyIGVycm9yID0gdGhpcy5fZXhlY3V0ZShzdGF0ZSwgZGVsYXkyKTsKICAgIGlmIChlcnJvcikgewogICAgICByZXR1cm4gZXJyb3I7CiAgICB9IGVsc2UgaWYgKHRoaXMucGVuZGluZyA9PT0gZmFsc2UgJiYgdGhpcy5pZCAhPSBudWxsKSB7CiAgICAgIHRoaXMuaWQgPSB0aGlzLnJlY3ljbGVBc3luY0lkKHRoaXMuc2NoZWR1bGVyLCB0aGlzLmlkLCBudWxsKTsKICAgIH0KICB9OwogIEFzeW5jQWN0aW9uMi5wcm90b3R5cGUuX2V4ZWN1dGUgPSBmdW5jdGlvbihzdGF0ZSwgX2RlbGF5KSB7CiAgICB2YXIgZXJyb3JlZCA9IGZhbHNlOwogICAgdmFyIGVycm9yVmFsdWU7CiAgICB0cnkgewogICAgICB0aGlzLndvcmsoc3RhdGUpOwogICAgfSBjYXRjaCAoZTEwKSB7CiAgICAgIGVycm9yZWQgPSB0cnVlOwogICAgICBlcnJvclZhbHVlID0gZTEwID8gZTEwIDogbmV3IEVycm9yKCJTY2hlZHVsZWQgYWN0aW9uIHRocmV3IGZhbHN5IGVycm9yIik7CiAgICB9CiAgICBpZiAoZXJyb3JlZCkgewogICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICAgIHJldHVybiBlcnJvclZhbHVlOwogICAgfQogIH07CiAgQXN5bmNBY3Rpb24yLnByb3RvdHlwZS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKCkgewogICAgaWYgKCF0aGlzLmNsb3NlZCkgewogICAgICB2YXIgX2EyID0gdGhpcywgaWQgPSBfYTIuaWQsIHNjaGVkdWxlciA9IF9hMi5zY2hlZHVsZXI7CiAgICAgIHZhciBhY3Rpb25zID0gc2NoZWR1bGVyLmFjdGlvbnM7CiAgICAgIHRoaXMud29yayA9IHRoaXMuc3RhdGUgPSB0aGlzLnNjaGVkdWxlciA9IG51bGw7CiAgICAgIHRoaXMucGVuZGluZyA9IGZhbHNlOwogICAgICBhcnJSZW1vdmUoYWN0aW9ucywgdGhpcyk7CiAgICAgIGlmIChpZCAhPSBudWxsKSB7CiAgICAgICAgdGhpcy5pZCA9IHRoaXMucmVjeWNsZUFzeW5jSWQoc2NoZWR1bGVyLCBpZCwgbnVsbCk7CiAgICAgIH0KICAgICAgdGhpcy5kZWxheSA9IG51bGw7CiAgICAgIF9zdXBlci5wcm90b3R5cGUudW5zdWJzY3JpYmUuY2FsbCh0aGlzKTsKICAgIH0KICB9OwogIHJldHVybiBBc3luY0FjdGlvbjI7Cn0pKEFjdGlvbik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvU2NoZWR1bGVyLmpzCnZhciBTY2hlZHVsZXIgPSAoZnVuY3Rpb24oKSB7CiAgZnVuY3Rpb24gU2NoZWR1bGVyMihzY2hlZHVsZXJBY3Rpb25DdG9yLCBub3cyKSB7CiAgICBpZiAobm93MiA9PT0gdm9pZCAwKSB7CiAgICAgIG5vdzIgPSBTY2hlZHVsZXIyLm5vdzsKICAgIH0KICAgIHRoaXMuc2NoZWR1bGVyQWN0aW9uQ3RvciA9IHNjaGVkdWxlckFjdGlvbkN0b3I7CiAgICB0aGlzLm5vdyA9IG5vdzI7CiAgfQogIF9fbmFtZShTY2hlZHVsZXIyLCAiU2NoZWR1bGVyIik7CiAgU2NoZWR1bGVyMi5wcm90b3R5cGUuc2NoZWR1bGUgPSBmdW5jdGlvbih3b3JrLCBkZWxheTIsIHN0YXRlKSB7CiAgICBpZiAoZGVsYXkyID09PSB2b2lkIDApIHsKICAgICAgZGVsYXkyID0gMDsKICAgIH0KICAgIHJldHVybiBuZXcgdGhpcy5zY2hlZHVsZXJBY3Rpb25DdG9yKHRoaXMsIHdvcmspLnNjaGVkdWxlKHN0YXRlLCBkZWxheTIpOwogIH07CiAgU2NoZWR1bGVyMi5ub3cgPSBkYXRlVGltZXN0YW1wUHJvdmlkZXIubm93OwogIHJldHVybiBTY2hlZHVsZXIyOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlci9Bc3luY1NjaGVkdWxlci5qcwp2YXIgQXN5bmNTY2hlZHVsZXIgPSAoZnVuY3Rpb24oX3N1cGVyKSB7CiAgX19leHRlbmRzKEFzeW5jU2NoZWR1bGVyMiwgX3N1cGVyKTsKICBmdW5jdGlvbiBBc3luY1NjaGVkdWxlcjIoU2NoZWR1bGVyQWN0aW9uLCBub3cyKSB7CiAgICBpZiAobm93MiA9PT0gdm9pZCAwKSB7CiAgICAgIG5vdzIgPSBTY2hlZHVsZXIubm93OwogICAgfQogICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgU2NoZWR1bGVyQWN0aW9uLCBub3cyKSB8fCB0aGlzOwogICAgX3RoaXMuYWN0aW9ucyA9IFtdOwogICAgX3RoaXMuX2FjdGl2ZSA9IGZhbHNlOwogICAgcmV0dXJuIF90aGlzOwogIH0KICBfX25hbWUoQXN5bmNTY2hlZHVsZXIyLCAiQXN5bmNTY2hlZHVsZXIiKTsKICBBc3luY1NjaGVkdWxlcjIucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24oYWN0aW9uKSB7CiAgICB2YXIgYWN0aW9ucyA9IHRoaXMuYWN0aW9uczsKICAgIGlmICh0aGlzLl9hY3RpdmUpIHsKICAgICAgYWN0aW9ucy5wdXNoKGFjdGlvbik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHZhciBlcnJvcjsKICAgIHRoaXMuX2FjdGl2ZSA9IHRydWU7CiAgICBkbyB7CiAgICAgIGlmIChlcnJvciA9IGFjdGlvbi5leGVjdXRlKGFjdGlvbi5zdGF0ZSwgYWN0aW9uLmRlbGF5KSkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9IHdoaWxlIChhY3Rpb24gPSBhY3Rpb25zLnNoaWZ0KCkpOwogICAgdGhpcy5fYWN0aXZlID0gZmFsc2U7CiAgICBpZiAoZXJyb3IpIHsKICAgICAgd2hpbGUgKGFjdGlvbiA9IGFjdGlvbnMuc2hpZnQoKSkgewogICAgICAgIGFjdGlvbi51bnN1YnNjcmliZSgpOwogICAgICB9CiAgICAgIHRocm93IGVycm9yOwogICAgfQogIH07CiAgcmV0dXJuIEFzeW5jU2NoZWR1bGVyMjsKfSkoU2NoZWR1bGVyKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvYXN5bmMuanMKdmFyIGFzeW5jU2NoZWR1bGVyID0gbmV3IEFzeW5jU2NoZWR1bGVyKEFzeW5jQWN0aW9uKTsKdmFyIGFzeW5jID0gYXN5bmNTY2hlZHVsZXI7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9pc1NjaGVkdWxlci5qcwpmdW5jdGlvbiBpc1NjaGVkdWxlcih2YWx1ZTIpIHsKICByZXR1cm4gdmFsdWUyICYmIGlzRnVuY3Rpb24odmFsdWUyLnNjaGVkdWxlKTsKfQpfX25hbWUoaXNTY2hlZHVsZXIsICJpc1NjaGVkdWxlciIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvYXJncy5qcwpmdW5jdGlvbiBsYXN0KGFycikgewogIHJldHVybiBhcnJbYXJyLmxlbmd0aCAtIDFdOwp9Cl9fbmFtZShsYXN0LCAibGFzdCIpOwpmdW5jdGlvbiBwb3BSZXN1bHRTZWxlY3RvcihhcmdzKSB7CiAgcmV0dXJuIGlzRnVuY3Rpb24obGFzdChhcmdzKSkgPyBhcmdzLnBvcCgpIDogdm9pZCAwOwp9Cl9fbmFtZShwb3BSZXN1bHRTZWxlY3RvciwgInBvcFJlc3VsdFNlbGVjdG9yIik7CmZ1bmN0aW9uIHBvcFNjaGVkdWxlcihhcmdzKSB7CiAgcmV0dXJuIGlzU2NoZWR1bGVyKGxhc3QoYXJncykpID8gYXJncy5wb3AoKSA6IHZvaWQgMDsKfQpfX25hbWUocG9wU2NoZWR1bGVyLCAicG9wU2NoZWR1bGVyIik7CmZ1bmN0aW9uIHBvcE51bWJlcihhcmdzLCBkZWZhdWx0VmFsdWUpIHsKICByZXR1cm4gdHlwZW9mIGxhc3QoYXJncykgPT09ICJudW1iZXIiID8gYXJncy5wb3AoKSA6IGRlZmF1bHRWYWx1ZTsKfQpfX25hbWUocG9wTnVtYmVyLCAicG9wTnVtYmVyIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9pc0FycmF5TGlrZS5qcwp2YXIgaXNBcnJheUxpa2UgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChmdW5jdGlvbih4MykgewogIHJldHVybiB4MyAmJiB0eXBlb2YgeDMubGVuZ3RoID09PSAibnVtYmVyIiAmJiB0eXBlb2YgeDMgIT09ICJmdW5jdGlvbiI7Cn0pLCAiaXNBcnJheUxpa2UiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2lzUHJvbWlzZS5qcwpmdW5jdGlvbiBpc1Byb21pc2UodmFsdWUyKSB7CiAgcmV0dXJuIGlzRnVuY3Rpb24odmFsdWUyID09PSBudWxsIHx8IHZhbHVlMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdmFsdWUyLnRoZW4pOwp9Cl9fbmFtZShpc1Byb21pc2UsICJpc1Byb21pc2UiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2lzSW50ZXJvcE9ic2VydmFibGUuanMKZnVuY3Rpb24gaXNJbnRlcm9wT2JzZXJ2YWJsZShpbnB1dCkgewogIHJldHVybiBpc0Z1bmN0aW9uKGlucHV0W29ic2VydmFibGVdKTsKfQpfX25hbWUoaXNJbnRlcm9wT2JzZXJ2YWJsZSwgImlzSW50ZXJvcE9ic2VydmFibGUiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2lzQXN5bmNJdGVyYWJsZS5qcwpmdW5jdGlvbiBpc0FzeW5jSXRlcmFibGUob2JqKSB7CiAgcmV0dXJuIFN5bWJvbC5hc3luY0l0ZXJhdG9yICYmIGlzRnVuY3Rpb24ob2JqID09PSBudWxsIHx8IG9iaiA9PT0gdm9pZCAwID8gdm9pZCAwIDogb2JqW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSk7Cn0KX19uYW1lKGlzQXN5bmNJdGVyYWJsZSwgImlzQXN5bmNJdGVyYWJsZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvdGhyb3dVbm9ic2VydmFibGVFcnJvci5qcwpmdW5jdGlvbiBjcmVhdGVJbnZhbGlkT2JzZXJ2YWJsZVR5cGVFcnJvcihpbnB1dCkgewogIHJldHVybiBuZXcgVHlwZUVycm9yKCJZb3UgcHJvdmlkZWQgIiArIChpbnB1dCAhPT0gbnVsbCAmJiB0eXBlb2YgaW5wdXQgPT09ICJvYmplY3QiID8gImFuIGludmFsaWQgb2JqZWN0IiA6ICInIiArIGlucHV0ICsgIiciKSArICIgd2hlcmUgYSBzdHJlYW0gd2FzIGV4cGVjdGVkLiBZb3UgY2FuIHByb3ZpZGUgYW4gT2JzZXJ2YWJsZSwgUHJvbWlzZSwgUmVhZGFibGVTdHJlYW0sIEFycmF5LCBBc3luY0l0ZXJhYmxlLCBvciBJdGVyYWJsZS4iKTsKfQpfX25hbWUoY3JlYXRlSW52YWxpZE9ic2VydmFibGVUeXBlRXJyb3IsICJjcmVhdGVJbnZhbGlkT2JzZXJ2YWJsZVR5cGVFcnJvciIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3N5bWJvbC9pdGVyYXRvci5qcwpmdW5jdGlvbiBnZXRTeW1ib2xJdGVyYXRvcigpIHsKICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gImZ1bmN0aW9uIiB8fCAhU3ltYm9sLml0ZXJhdG9yKSB7CiAgICByZXR1cm4gIkBAaXRlcmF0b3IiOwogIH0KICByZXR1cm4gU3ltYm9sLml0ZXJhdG9yOwp9Cl9fbmFtZShnZXRTeW1ib2xJdGVyYXRvciwgImdldFN5bWJvbEl0ZXJhdG9yIik7CnZhciBpdGVyYXRvciA9IGdldFN5bWJvbEl0ZXJhdG9yKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9pc0l0ZXJhYmxlLmpzCmZ1bmN0aW9uIGlzSXRlcmFibGUoaW5wdXQpIHsKICByZXR1cm4gaXNGdW5jdGlvbihpbnB1dCA9PT0gbnVsbCB8fCBpbnB1dCA9PT0gdm9pZCAwID8gdm9pZCAwIDogaW5wdXRbaXRlcmF0b3JdKTsKfQpfX25hbWUoaXNJdGVyYWJsZSwgImlzSXRlcmFibGUiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2lzUmVhZGFibGVTdHJlYW1MaWtlLmpzCmZ1bmN0aW9uIHJlYWRhYmxlU3RyZWFtTGlrZVRvQXN5bmNHZW5lcmF0b3IocmVhZGFibGVTdHJlYW0pIHsKICByZXR1cm4gX19hc3luY0dlbmVyYXRvcih0aGlzLCBhcmd1bWVudHMsIC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gcmVhZGFibGVTdHJlYW1MaWtlVG9Bc3luY0dlbmVyYXRvcl8xKCkgewogICAgdmFyIHJlYWRlciwgX2EyLCB2YWx1ZTIsIGRvbmU7CiAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24oX2IpIHsKICAgICAgc3dpdGNoIChfYi5sYWJlbCkgewogICAgICAgIGNhc2UgMDoKICAgICAgICAgIHJlYWRlciA9IHJlYWRhYmxlU3RyZWFtLmdldFJlYWRlcigpOwogICAgICAgICAgX2IubGFiZWwgPSAxOwogICAgICAgIGNhc2UgMToKICAgICAgICAgIF9iLnRyeXMucHVzaChbMSwgLCA5LCAxMF0pOwogICAgICAgICAgX2IubGFiZWwgPSAyOwogICAgICAgIGNhc2UgMjoKICAgICAgICAgIGlmIChmYWxzZSkgcmV0dXJuIFszLCA4XTsKICAgICAgICAgIHJldHVybiBbNCwgX19hd2FpdChyZWFkZXIucmVhZCgpKV07CiAgICAgICAgY2FzZSAzOgogICAgICAgICAgX2EyID0gX2Iuc2VudCgpLCB2YWx1ZTIgPSBfYTIudmFsdWUsIGRvbmUgPSBfYTIuZG9uZTsKICAgICAgICAgIGlmICghZG9uZSkgcmV0dXJuIFszLCA1XTsKICAgICAgICAgIHJldHVybiBbNCwgX19hd2FpdCh2b2lkIDApXTsKICAgICAgICBjYXNlIDQ6CiAgICAgICAgICByZXR1cm4gWzIsIF9iLnNlbnQoKV07CiAgICAgICAgY2FzZSA1OgogICAgICAgICAgcmV0dXJuIFs0LCBfX2F3YWl0KHZhbHVlMildOwogICAgICAgIGNhc2UgNjoKICAgICAgICAgIHJldHVybiBbNCwgX2Iuc2VudCgpXTsKICAgICAgICBjYXNlIDc6CiAgICAgICAgICBfYi5zZW50KCk7CiAgICAgICAgICByZXR1cm4gWzMsIDJdOwogICAgICAgIGNhc2UgODoKICAgICAgICAgIHJldHVybiBbMywgMTBdOwogICAgICAgIGNhc2UgOToKICAgICAgICAgIHJlYWRlci5yZWxlYXNlTG9jaygpOwogICAgICAgICAgcmV0dXJuIFs3XTsKICAgICAgICBjYXNlIDEwOgogICAgICAgICAgcmV0dXJuIFsyXTsKICAgICAgfQogICAgfSk7CiAgfSwgInJlYWRhYmxlU3RyZWFtTGlrZVRvQXN5bmNHZW5lcmF0b3JfMSIpKTsKfQpfX25hbWUocmVhZGFibGVTdHJlYW1MaWtlVG9Bc3luY0dlbmVyYXRvciwgInJlYWRhYmxlU3RyZWFtTGlrZVRvQXN5bmNHZW5lcmF0b3IiKTsKZnVuY3Rpb24gaXNSZWFkYWJsZVN0cmVhbUxpa2Uob2JqKSB7CiAgcmV0dXJuIGlzRnVuY3Rpb24ob2JqID09PSBudWxsIHx8IG9iaiA9PT0gdm9pZCAwID8gdm9pZCAwIDogb2JqLmdldFJlYWRlcik7Cn0KX19uYW1lKGlzUmVhZGFibGVTdHJlYW1MaWtlLCAiaXNSZWFkYWJsZVN0cmVhbUxpa2UiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL2lubmVyRnJvbS5qcwpmdW5jdGlvbiBpbm5lckZyb20oaW5wdXQpIHsKICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB7CiAgICByZXR1cm4gaW5wdXQ7CiAgfQogIGlmIChpbnB1dCAhPSBudWxsKSB7CiAgICBpZiAoaXNJbnRlcm9wT2JzZXJ2YWJsZShpbnB1dCkpIHsKICAgICAgcmV0dXJuIGZyb21JbnRlcm9wT2JzZXJ2YWJsZShpbnB1dCk7CiAgICB9CiAgICBpZiAoaXNBcnJheUxpa2UoaW5wdXQpKSB7CiAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKGlucHV0KTsKICAgIH0KICAgIGlmIChpc1Byb21pc2UoaW5wdXQpKSB7CiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShpbnB1dCk7CiAgICB9CiAgICBpZiAoaXNBc3luY0l0ZXJhYmxlKGlucHV0KSkgewogICAgICByZXR1cm4gZnJvbUFzeW5jSXRlcmFibGUoaW5wdXQpOwogICAgfQogICAgaWYgKGlzSXRlcmFibGUoaW5wdXQpKSB7CiAgICAgIHJldHVybiBmcm9tSXRlcmFibGUoaW5wdXQpOwogICAgfQogICAgaWYgKGlzUmVhZGFibGVTdHJlYW1MaWtlKGlucHV0KSkgewogICAgICByZXR1cm4gZnJvbVJlYWRhYmxlU3RyZWFtTGlrZShpbnB1dCk7CiAgICB9CiAgfQogIHRocm93IGNyZWF0ZUludmFsaWRPYnNlcnZhYmxlVHlwZUVycm9yKGlucHV0KTsKfQpfX25hbWUoaW5uZXJGcm9tLCAiaW5uZXJGcm9tIik7CmZ1bmN0aW9uIGZyb21JbnRlcm9wT2JzZXJ2YWJsZShvYmopIHsKICByZXR1cm4gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgdmFyIG9icyA9IG9ialtvYnNlcnZhYmxlXSgpOwogICAgaWYgKGlzRnVuY3Rpb24ob2JzLnN1YnNjcmliZSkpIHsKICAgICAgcmV0dXJuIG9icy5zdWJzY3JpYmUoc3Vic2NyaWJlcik7CiAgICB9CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJQcm92aWRlZCBvYmplY3QgZG9lcyBub3QgY29ycmVjdGx5IGltcGxlbWVudCBTeW1ib2wub2JzZXJ2YWJsZSIpOwogIH0pOwp9Cl9fbmFtZShmcm9tSW50ZXJvcE9ic2VydmFibGUsICJmcm9tSW50ZXJvcE9ic2VydmFibGUiKTsKZnVuY3Rpb24gZnJvbUFycmF5TGlrZShhcnJheSkgewogIHJldHVybiBuZXcgT2JzZXJ2YWJsZShmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICBmb3IgKHZhciBpMTAgPSAwOyBpMTAgPCBhcnJheS5sZW5ndGggJiYgIXN1YnNjcmliZXIuY2xvc2VkOyBpMTArKykgewogICAgICBzdWJzY3JpYmVyLm5leHQoYXJyYXlbaTEwXSk7CiAgICB9CiAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgfSk7Cn0KX19uYW1lKGZyb21BcnJheUxpa2UsICJmcm9tQXJyYXlMaWtlIik7CmZ1bmN0aW9uIGZyb21Qcm9taXNlKHByb21pc2UpIHsKICByZXR1cm4gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKHZhbHVlMikgewogICAgICBpZiAoIXN1YnNjcmliZXIuY2xvc2VkKSB7CiAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlMik7CiAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgICB9CiAgICB9LCBmdW5jdGlvbihlcnIpIHsKICAgICAgcmV0dXJuIHN1YnNjcmliZXIuZXJyb3IoZXJyKTsKICAgIH0pLnRoZW4obnVsbCwgcmVwb3J0VW5oYW5kbGVkRXJyb3IpOwogIH0pOwp9Cl9fbmFtZShmcm9tUHJvbWlzZSwgImZyb21Qcm9taXNlIik7CmZ1bmN0aW9uIGZyb21JdGVyYWJsZShpdGVyYWJsZSkgewogIHJldHVybiBuZXcgT2JzZXJ2YWJsZShmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICB2YXIgZV8xLCBfYTI7CiAgICB0cnkgewogICAgICBmb3IgKHZhciBpdGVyYWJsZV8xID0gX192YWx1ZXMoaXRlcmFibGUpLCBpdGVyYWJsZV8xXzEgPSBpdGVyYWJsZV8xLm5leHQoKTsgIWl0ZXJhYmxlXzFfMS5kb25lOyBpdGVyYWJsZV8xXzEgPSBpdGVyYWJsZV8xLm5leHQoKSkgewogICAgICAgIHZhciB2YWx1ZTIgPSBpdGVyYWJsZV8xXzEudmFsdWU7CiAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlMik7CiAgICAgICAgaWYgKHN1YnNjcmliZXIuY2xvc2VkKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICB9CiAgICB9IGNhdGNoIChlXzFfMSkgewogICAgICBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OwogICAgfSBmaW5hbGx5IHsKICAgICAgdHJ5IHsKICAgICAgICBpZiAoaXRlcmFibGVfMV8xICYmICFpdGVyYWJsZV8xXzEuZG9uZSAmJiAoX2EyID0gaXRlcmFibGVfMS5yZXR1cm4pKSBfYTIuY2FsbChpdGVyYWJsZV8xKTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7CiAgICAgIH0KICAgIH0KICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICB9KTsKfQpfX25hbWUoZnJvbUl0ZXJhYmxlLCAiZnJvbUl0ZXJhYmxlIik7CmZ1bmN0aW9uIGZyb21Bc3luY0l0ZXJhYmxlKGFzeW5jSXRlcmFibGUpIHsKICByZXR1cm4gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgcHJvY2VzczIoYXN5bmNJdGVyYWJsZSwgc3Vic2NyaWJlcikuY2F0Y2goZnVuY3Rpb24oZXJyKSB7CiAgICAgIHJldHVybiBzdWJzY3JpYmVyLmVycm9yKGVycik7CiAgICB9KTsKICB9KTsKfQpfX25hbWUoZnJvbUFzeW5jSXRlcmFibGUsICJmcm9tQXN5bmNJdGVyYWJsZSIpOwpmdW5jdGlvbiBmcm9tUmVhZGFibGVTdHJlYW1MaWtlKHJlYWRhYmxlU3RyZWFtKSB7CiAgcmV0dXJuIGZyb21Bc3luY0l0ZXJhYmxlKHJlYWRhYmxlU3RyZWFtTGlrZVRvQXN5bmNHZW5lcmF0b3IocmVhZGFibGVTdHJlYW0pKTsKfQpfX25hbWUoZnJvbVJlYWRhYmxlU3RyZWFtTGlrZSwgImZyb21SZWFkYWJsZVN0cmVhbUxpa2UiKTsKZnVuY3Rpb24gcHJvY2VzczIoYXN5bmNJdGVyYWJsZSwgc3Vic2NyaWJlcikgewogIHZhciBhc3luY0l0ZXJhYmxlXzEsIGFzeW5jSXRlcmFibGVfMV8xOwogIHZhciBlXzIsIF9hMjsKICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbigpIHsKICAgIHZhciB2YWx1ZTIsIGVfMl8xOwogICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uKF9iKSB7CiAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHsKICAgICAgICBjYXNlIDA6CiAgICAgICAgICBfYi50cnlzLnB1c2goWzAsIDUsIDYsIDExXSk7CiAgICAgICAgICBhc3luY0l0ZXJhYmxlXzEgPSBfX2FzeW5jVmFsdWVzKGFzeW5jSXRlcmFibGUpOwogICAgICAgICAgX2IubGFiZWwgPSAxOwogICAgICAgIGNhc2UgMToKICAgICAgICAgIHJldHVybiBbNCwgYXN5bmNJdGVyYWJsZV8xLm5leHQoKV07CiAgICAgICAgY2FzZSAyOgogICAgICAgICAgaWYgKCEoYXN5bmNJdGVyYWJsZV8xXzEgPSBfYi5zZW50KCksICFhc3luY0l0ZXJhYmxlXzFfMS5kb25lKSkgcmV0dXJuIFszLCA0XTsKICAgICAgICAgIHZhbHVlMiA9IGFzeW5jSXRlcmFibGVfMV8xLnZhbHVlOwogICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlMik7CiAgICAgICAgICBpZiAoc3Vic2NyaWJlci5jbG9zZWQpIHsKICAgICAgICAgICAgcmV0dXJuIFsyXTsKICAgICAgICAgIH0KICAgICAgICAgIF9iLmxhYmVsID0gMzsKICAgICAgICBjYXNlIDM6CiAgICAgICAgICByZXR1cm4gWzMsIDFdOwogICAgICAgIGNhc2UgNDoKICAgICAgICAgIHJldHVybiBbMywgMTFdOwogICAgICAgIGNhc2UgNToKICAgICAgICAgIGVfMl8xID0gX2Iuc2VudCgpOwogICAgICAgICAgZV8yID0geyBlcnJvcjogZV8yXzEgfTsKICAgICAgICAgIHJldHVybiBbMywgMTFdOwogICAgICAgIGNhc2UgNjoKICAgICAgICAgIF9iLnRyeXMucHVzaChbNiwgLCA5LCAxMF0pOwogICAgICAgICAgaWYgKCEoYXN5bmNJdGVyYWJsZV8xXzEgJiYgIWFzeW5jSXRlcmFibGVfMV8xLmRvbmUgJiYgKF9hMiA9IGFzeW5jSXRlcmFibGVfMS5yZXR1cm4pKSkgcmV0dXJuIFszLCA4XTsKICAgICAgICAgIHJldHVybiBbNCwgX2EyLmNhbGwoYXN5bmNJdGVyYWJsZV8xKV07CiAgICAgICAgY2FzZSA3OgogICAgICAgICAgX2Iuc2VudCgpOwogICAgICAgICAgX2IubGFiZWwgPSA4OwogICAgICAgIGNhc2UgODoKICAgICAgICAgIHJldHVybiBbMywgMTBdOwogICAgICAgIGNhc2UgOToKICAgICAgICAgIGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjsKICAgICAgICAgIHJldHVybiBbN107CiAgICAgICAgY2FzZSAxMDoKICAgICAgICAgIHJldHVybiBbN107CiAgICAgICAgY2FzZSAxMToKICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICAgIHJldHVybiBbMl07CiAgICAgIH0KICAgIH0pOwogIH0pOwp9Cl9fbmFtZShwcm9jZXNzMiwgInByb2Nlc3MiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2V4ZWN1dGVTY2hlZHVsZS5qcwpmdW5jdGlvbiBleGVjdXRlU2NoZWR1bGUocGFyZW50U3Vic2NyaXB0aW9uLCBzY2hlZHVsZXIsIHdvcmssIGRlbGF5MiwgcmVwZWF0MykgewogIGlmIChkZWxheTIgPT09IHZvaWQgMCkgewogICAgZGVsYXkyID0gMDsKICB9CiAgaWYgKHJlcGVhdDMgPT09IHZvaWQgMCkgewogICAgcmVwZWF0MyA9IGZhbHNlOwogIH0KICB2YXIgc2NoZWR1bGVTdWJzY3JpcHRpb24gPSBzY2hlZHVsZXIuc2NoZWR1bGUoZnVuY3Rpb24oKSB7CiAgICB3b3JrKCk7CiAgICBpZiAocmVwZWF0MykgewogICAgICBwYXJlbnRTdWJzY3JpcHRpb24uYWRkKHRoaXMuc2NoZWR1bGUobnVsbCwgZGVsYXkyKSk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICB9CiAgfSwgZGVsYXkyKTsKICBwYXJlbnRTdWJzY3JpcHRpb24uYWRkKHNjaGVkdWxlU3Vic2NyaXB0aW9uKTsKICBpZiAoIXJlcGVhdDMpIHsKICAgIHJldHVybiBzY2hlZHVsZVN1YnNjcmlwdGlvbjsKICB9Cn0KX19uYW1lKGV4ZWN1dGVTY2hlZHVsZSwgImV4ZWN1dGVTY2hlZHVsZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9vYnNlcnZlT24uanMKZnVuY3Rpb24gb2JzZXJ2ZU9uKHNjaGVkdWxlciwgZGVsYXkyKSB7CiAgaWYgKGRlbGF5MiA9PT0gdm9pZCAwKSB7CiAgICBkZWxheTIgPSAwOwogIH0KICByZXR1cm4gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHsKICAgIHNvdXJjZS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlMikgewogICAgICByZXR1cm4gZXhlY3V0ZVNjaGVkdWxlKHN1YnNjcmliZXIsIHNjaGVkdWxlciwgZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHN1YnNjcmliZXIubmV4dCh2YWx1ZTIpOwogICAgICB9LCBkZWxheTIpOwogICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBleGVjdXRlU2NoZWR1bGUoc3Vic2NyaWJlciwgc2NoZWR1bGVyLCBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgICB9LCBkZWxheTIpOwogICAgfSwgZnVuY3Rpb24oZXJyKSB7CiAgICAgIHJldHVybiBleGVjdXRlU2NoZWR1bGUoc3Vic2NyaWJlciwgc2NoZWR1bGVyLCBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gc3Vic2NyaWJlci5lcnJvcihlcnIpOwogICAgICB9LCBkZWxheTIpOwogICAgfSkpOwogIH0pOwp9Cl9fbmFtZShvYnNlcnZlT24sICJvYnNlcnZlT24iKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvc3Vic2NyaWJlT24uanMKZnVuY3Rpb24gc3Vic2NyaWJlT24oc2NoZWR1bGVyLCBkZWxheTIpIHsKICBpZiAoZGVsYXkyID09PSB2b2lkIDApIHsKICAgIGRlbGF5MiA9IDA7CiAgfQogIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgc3Vic2NyaWJlci5hZGQoc2NoZWR1bGVyLnNjaGVkdWxlKGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShzdWJzY3JpYmVyKTsKICAgIH0sIGRlbGF5MikpOwogIH0pOwp9Cl9fbmFtZShzdWJzY3JpYmVPbiwgInN1YnNjcmliZU9uIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVkL3NjaGVkdWxlT2JzZXJ2YWJsZS5qcwpmdW5jdGlvbiBzY2hlZHVsZU9ic2VydmFibGUoaW5wdXQsIHNjaGVkdWxlcikgewogIHJldHVybiBpbm5lckZyb20oaW5wdXQpLnBpcGUoc3Vic2NyaWJlT24oc2NoZWR1bGVyKSwgb2JzZXJ2ZU9uKHNjaGVkdWxlcikpOwp9Cl9fbmFtZShzY2hlZHVsZU9ic2VydmFibGUsICJzY2hlZHVsZU9ic2VydmFibGUiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZWQvc2NoZWR1bGVQcm9taXNlLmpzCmZ1bmN0aW9uIHNjaGVkdWxlUHJvbWlzZShpbnB1dCwgc2NoZWR1bGVyKSB7CiAgcmV0dXJuIGlubmVyRnJvbShpbnB1dCkucGlwZShzdWJzY3JpYmVPbihzY2hlZHVsZXIpLCBvYnNlcnZlT24oc2NoZWR1bGVyKSk7Cn0KX19uYW1lKHNjaGVkdWxlUHJvbWlzZSwgInNjaGVkdWxlUHJvbWlzZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlZC9zY2hlZHVsZUFycmF5LmpzCmZ1bmN0aW9uIHNjaGVkdWxlQXJyYXkoaW5wdXQsIHNjaGVkdWxlcikgewogIHJldHVybiBuZXcgT2JzZXJ2YWJsZShmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICB2YXIgaTEwID0gMDsKICAgIHJldHVybiBzY2hlZHVsZXIuc2NoZWR1bGUoZnVuY3Rpb24oKSB7CiAgICAgIGlmIChpMTAgPT09IGlucHV0Lmxlbmd0aCkgewogICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdWJzY3JpYmVyLm5leHQoaW5wdXRbaTEwKytdKTsKICAgICAgICBpZiAoIXN1YnNjcmliZXIuY2xvc2VkKSB7CiAgICAgICAgICB0aGlzLnNjaGVkdWxlKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICB9KTsKfQpfX25hbWUoc2NoZWR1bGVBcnJheSwgInNjaGVkdWxlQXJyYXkiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZWQvc2NoZWR1bGVJdGVyYWJsZS5qcwpmdW5jdGlvbiBzY2hlZHVsZUl0ZXJhYmxlKGlucHV0LCBzY2hlZHVsZXIpIHsKICByZXR1cm4gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgdmFyIGl0ZXJhdG9yMjsKICAgIGV4ZWN1dGVTY2hlZHVsZShzdWJzY3JpYmVyLCBzY2hlZHVsZXIsIGZ1bmN0aW9uKCkgewogICAgICBpdGVyYXRvcjIgPSBpbnB1dFtpdGVyYXRvcl0oKTsKICAgICAgZXhlY3V0ZVNjaGVkdWxlKHN1YnNjcmliZXIsIHNjaGVkdWxlciwgZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIF9hMjsKICAgICAgICB2YXIgdmFsdWUyOwogICAgICAgIHZhciBkb25lOwogICAgICAgIHRyeSB7CiAgICAgICAgICBfYTIgPSBpdGVyYXRvcjIubmV4dCgpLCB2YWx1ZTIgPSBfYTIudmFsdWUsIGRvbmUgPSBfYTIuZG9uZTsKICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IoZXJyKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKGRvbmUpIHsKICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlMik7CiAgICAgICAgfQogICAgICB9LCAwLCB0cnVlKTsKICAgIH0pOwogICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gaXNGdW5jdGlvbihpdGVyYXRvcjIgPT09IG51bGwgfHwgaXRlcmF0b3IyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBpdGVyYXRvcjIucmV0dXJuKSAmJiBpdGVyYXRvcjIucmV0dXJuKCk7CiAgICB9OwogIH0pOwp9Cl9fbmFtZShzY2hlZHVsZUl0ZXJhYmxlLCAic2NoZWR1bGVJdGVyYWJsZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlZC9zY2hlZHVsZUFzeW5jSXRlcmFibGUuanMKZnVuY3Rpb24gc2NoZWR1bGVBc3luY0l0ZXJhYmxlKGlucHV0LCBzY2hlZHVsZXIpIHsKICBpZiAoIWlucHV0KSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoIkl0ZXJhYmxlIGNhbm5vdCBiZSBudWxsIik7CiAgfQogIHJldHVybiBuZXcgT2JzZXJ2YWJsZShmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICBleGVjdXRlU2NoZWR1bGUoc3Vic2NyaWJlciwgc2NoZWR1bGVyLCBmdW5jdGlvbigpIHsKICAgICAgdmFyIGl0ZXJhdG9yMiA9IGlucHV0W1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpOwogICAgICBleGVjdXRlU2NoZWR1bGUoc3Vic2NyaWJlciwgc2NoZWR1bGVyLCBmdW5jdGlvbigpIHsKICAgICAgICBpdGVyYXRvcjIubmV4dCgpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHsKICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHJlc3VsdC52YWx1ZSk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0sIDAsIHRydWUpOwogICAgfSk7CiAgfSk7Cn0KX19uYW1lKHNjaGVkdWxlQXN5bmNJdGVyYWJsZSwgInNjaGVkdWxlQXN5bmNJdGVyYWJsZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlZC9zY2hlZHVsZVJlYWRhYmxlU3RyZWFtTGlrZS5qcwpmdW5jdGlvbiBzY2hlZHVsZVJlYWRhYmxlU3RyZWFtTGlrZShpbnB1dCwgc2NoZWR1bGVyKSB7CiAgcmV0dXJuIHNjaGVkdWxlQXN5bmNJdGVyYWJsZShyZWFkYWJsZVN0cmVhbUxpa2VUb0FzeW5jR2VuZXJhdG9yKGlucHV0KSwgc2NoZWR1bGVyKTsKfQpfX25hbWUoc2NoZWR1bGVSZWFkYWJsZVN0cmVhbUxpa2UsICJzY2hlZHVsZVJlYWRhYmxlU3RyZWFtTGlrZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlZC9zY2hlZHVsZWQuanMKZnVuY3Rpb24gc2NoZWR1bGVkKGlucHV0LCBzY2hlZHVsZXIpIHsKICBpZiAoaW5wdXQgIT0gbnVsbCkgewogICAgaWYgKGlzSW50ZXJvcE9ic2VydmFibGUoaW5wdXQpKSB7CiAgICAgIHJldHVybiBzY2hlZHVsZU9ic2VydmFibGUoaW5wdXQsIHNjaGVkdWxlcik7CiAgICB9CiAgICBpZiAoaXNBcnJheUxpa2UoaW5wdXQpKSB7CiAgICAgIHJldHVybiBzY2hlZHVsZUFycmF5KGlucHV0LCBzY2hlZHVsZXIpOwogICAgfQogICAgaWYgKGlzUHJvbWlzZShpbnB1dCkpIHsKICAgICAgcmV0dXJuIHNjaGVkdWxlUHJvbWlzZShpbnB1dCwgc2NoZWR1bGVyKTsKICAgIH0KICAgIGlmIChpc0FzeW5jSXRlcmFibGUoaW5wdXQpKSB7CiAgICAgIHJldHVybiBzY2hlZHVsZUFzeW5jSXRlcmFibGUoaW5wdXQsIHNjaGVkdWxlcik7CiAgICB9CiAgICBpZiAoaXNJdGVyYWJsZShpbnB1dCkpIHsKICAgICAgcmV0dXJuIHNjaGVkdWxlSXRlcmFibGUoaW5wdXQsIHNjaGVkdWxlcik7CiAgICB9CiAgICBpZiAoaXNSZWFkYWJsZVN0cmVhbUxpa2UoaW5wdXQpKSB7CiAgICAgIHJldHVybiBzY2hlZHVsZVJlYWRhYmxlU3RyZWFtTGlrZShpbnB1dCwgc2NoZWR1bGVyKTsKICAgIH0KICB9CiAgdGhyb3cgY3JlYXRlSW52YWxpZE9ic2VydmFibGVUeXBlRXJyb3IoaW5wdXQpOwp9Cl9fbmFtZShzY2hlZHVsZWQsICJzY2hlZHVsZWQiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL2Zyb20uanMKZnVuY3Rpb24gZnJvbShpbnB1dCwgc2NoZWR1bGVyKSB7CiAgcmV0dXJuIHNjaGVkdWxlciA/IHNjaGVkdWxlZChpbnB1dCwgc2NoZWR1bGVyKSA6IGlubmVyRnJvbShpbnB1dCk7Cn0KX19uYW1lKGZyb20sICJmcm9tIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9vZi5qcwpmdW5jdGlvbiBvZigpIHsKICB2YXIgYXJncyA9IFtdOwogIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07CiAgfQogIHZhciBzY2hlZHVsZXIgPSBwb3BTY2hlZHVsZXIoYXJncyk7CiAgcmV0dXJuIGZyb20oYXJncywgc2NoZWR1bGVyKTsKfQpfX25hbWUob2YsICJvZiIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvaXNEYXRlLmpzCmZ1bmN0aW9uIGlzVmFsaWREYXRlKHZhbHVlMikgewogIHJldHVybiB2YWx1ZTIgaW5zdGFuY2VvZiBEYXRlICYmICFpc05hTih2YWx1ZTIpOwp9Cl9fbmFtZShpc1ZhbGlkRGF0ZSwgImlzVmFsaWREYXRlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL21hcC5qcwpmdW5jdGlvbiBtYXAyKHByb2plY3QsIHRoaXNBcmcpIHsKICByZXR1cm4gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHsKICAgIHZhciBpbmRleDIgPSAwOwogICAgc291cmNlLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUyKSB7CiAgICAgIHN1YnNjcmliZXIubmV4dChwcm9qZWN0LmNhbGwodGhpc0FyZywgdmFsdWUyLCBpbmRleDIrKykpOwogICAgfSkpOwogIH0pOwp9Cl9fbmFtZShtYXAyLCAibWFwIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9tYXBPbmVPck1hbnlBcmdzLmpzCnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTsKZnVuY3Rpb24gY2FsbE9yQXBwbHkoZm4sIGFyZ3MpIHsKICByZXR1cm4gaXNBcnJheShhcmdzKSA/IGZuLmFwcGx5KHZvaWQgMCwgX19zcHJlYWRBcnJheShbXSwgX19yZWFkKGFyZ3MpKSkgOiBmbihhcmdzKTsKfQpfX25hbWUoY2FsbE9yQXBwbHksICJjYWxsT3JBcHBseSIpOwpmdW5jdGlvbiBtYXBPbmVPck1hbnlBcmdzKGZuKSB7CiAgcmV0dXJuIG1hcDIoZnVuY3Rpb24oYXJncykgewogICAgcmV0dXJuIGNhbGxPckFwcGx5KGZuLCBhcmdzKTsKICB9KTsKfQpfX25hbWUobWFwT25lT3JNYW55QXJncywgIm1hcE9uZU9yTWFueUFyZ3MiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2FyZ3NBcmdBcnJheU9yT2JqZWN0LmpzCnZhciBpc0FycmF5MiA9IEFycmF5LmlzQXJyYXk7CnZhciBnZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiwgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlLCBnZXRLZXlzID0gT2JqZWN0LmtleXM7CmZ1bmN0aW9uIGFyZ3NBcmdBcnJheU9yT2JqZWN0KGFyZ3MpIHsKICBpZiAoYXJncy5sZW5ndGggPT09IDEpIHsKICAgIHZhciBmaXJzdF8xID0gYXJnc1swXTsKICAgIGlmIChpc0FycmF5MihmaXJzdF8xKSkgewogICAgICByZXR1cm4geyBhcmdzOiBmaXJzdF8xLCBrZXlzOiBudWxsIH07CiAgICB9CiAgICBpZiAoaXNQT0pPKGZpcnN0XzEpKSB7CiAgICAgIHZhciBrZXlzMiA9IGdldEtleXMoZmlyc3RfMSk7CiAgICAgIHJldHVybiB7CiAgICAgICAgYXJnczoga2V5czIubWFwKGZ1bmN0aW9uKGtleTIpIHsKICAgICAgICAgIHJldHVybiBmaXJzdF8xW2tleTJdOwogICAgICAgIH0pLAogICAgICAgIGtleXM6IGtleXMyCiAgICAgIH07CiAgICB9CiAgfQogIHJldHVybiB7IGFyZ3MsIGtleXM6IG51bGwgfTsKfQpfX25hbWUoYXJnc0FyZ0FycmF5T3JPYmplY3QsICJhcmdzQXJnQXJyYXlPck9iamVjdCIpOwpmdW5jdGlvbiBpc1BPSk8ob2JqKSB7CiAgcmV0dXJuIG9iaiAmJiB0eXBlb2Ygb2JqID09PSAib2JqZWN0IiAmJiBnZXRQcm90b3R5cGVPZihvYmopID09PSBvYmplY3RQcm90bzsKfQpfX25hbWUoaXNQT0pPLCAiaXNQT0pPIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9jcmVhdGVPYmplY3QuanMKZnVuY3Rpb24gY3JlYXRlT2JqZWN0KGtleXMyLCB2YWx1ZXMpIHsKICByZXR1cm4ga2V5czIucmVkdWNlKGZ1bmN0aW9uKHJlc3VsdCwga2V5MiwgaTEwKSB7CiAgICByZXR1cm4gcmVzdWx0W2tleTJdID0gdmFsdWVzW2kxMF0sIHJlc3VsdDsKICB9LCB7fSk7Cn0KX19uYW1lKGNyZWF0ZU9iamVjdCwgImNyZWF0ZU9iamVjdCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvY29tYmluZUxhdGVzdC5qcwpmdW5jdGlvbiBjb21iaW5lTGF0ZXN0KCkgewogIHZhciBhcmdzID0gW107CiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTsKICB9CiAgdmFyIHNjaGVkdWxlciA9IHBvcFNjaGVkdWxlcihhcmdzKTsKICB2YXIgcmVzdWx0U2VsZWN0b3IgPSBwb3BSZXN1bHRTZWxlY3RvcihhcmdzKTsKICB2YXIgX2EyID0gYXJnc0FyZ0FycmF5T3JPYmplY3QoYXJncyksIG9ic2VydmFibGVzID0gX2EyLmFyZ3MsIGtleXMyID0gX2EyLmtleXM7CiAgaWYgKG9ic2VydmFibGVzLmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuIGZyb20oW10sIHNjaGVkdWxlcik7CiAgfQogIHZhciByZXN1bHQgPSBuZXcgT2JzZXJ2YWJsZShjb21iaW5lTGF0ZXN0SW5pdChvYnNlcnZhYmxlcywgc2NoZWR1bGVyLCBrZXlzMiA/IGZ1bmN0aW9uKHZhbHVlcykgewogICAgcmV0dXJuIGNyZWF0ZU9iamVjdChrZXlzMiwgdmFsdWVzKTsKICB9IDogaWRlbnRpdHkpKTsKICByZXR1cm4gcmVzdWx0U2VsZWN0b3IgPyByZXN1bHQucGlwZShtYXBPbmVPck1hbnlBcmdzKHJlc3VsdFNlbGVjdG9yKSkgOiByZXN1bHQ7Cn0KX19uYW1lKGNvbWJpbmVMYXRlc3QsICJjb21iaW5lTGF0ZXN0Iik7CmZ1bmN0aW9uIGNvbWJpbmVMYXRlc3RJbml0KG9ic2VydmFibGVzLCBzY2hlZHVsZXIsIHZhbHVlVHJhbnNmb3JtKSB7CiAgaWYgKHZhbHVlVHJhbnNmb3JtID09PSB2b2lkIDApIHsKICAgIHZhbHVlVHJhbnNmb3JtID0gaWRlbnRpdHk7CiAgfQogIHJldHVybiBmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICBtYXliZVNjaGVkdWxlKHNjaGVkdWxlciwgZnVuY3Rpb24oKSB7CiAgICAgIHZhciBsZW5ndGggPSBvYnNlcnZhYmxlcy5sZW5ndGg7CiAgICAgIHZhciB2YWx1ZXMgPSBuZXcgQXJyYXkobGVuZ3RoKTsKICAgICAgdmFyIGFjdGl2ZSA9IGxlbmd0aDsKICAgICAgdmFyIHJlbWFpbmluZ0ZpcnN0VmFsdWVzID0gbGVuZ3RoOwogICAgICB2YXIgX2xvb3BfMSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oaTExKSB7CiAgICAgICAgbWF5YmVTY2hlZHVsZShzY2hlZHVsZXIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgdmFyIHNvdXJjZSA9IGZyb20ob2JzZXJ2YWJsZXNbaTExXSwgc2NoZWR1bGVyKTsKICAgICAgICAgIHZhciBoYXNGaXJzdFZhbHVlID0gZmFsc2U7CiAgICAgICAgICBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZTIpIHsKICAgICAgICAgICAgdmFsdWVzW2kxMV0gPSB2YWx1ZTI7CiAgICAgICAgICAgIGlmICghaGFzRmlyc3RWYWx1ZSkgewogICAgICAgICAgICAgIGhhc0ZpcnN0VmFsdWUgPSB0cnVlOwogICAgICAgICAgICAgIHJlbWFpbmluZ0ZpcnN0VmFsdWVzLS07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFyZW1haW5pbmdGaXJzdFZhbHVlcykgewogICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dCh2YWx1ZVRyYW5zZm9ybSh2YWx1ZXMuc2xpY2UoKSkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgaWYgKCEtLWFjdGl2ZSkgewogICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSkpOwogICAgICAgIH0sIHN1YnNjcmliZXIpOwogICAgICB9LCAiX2xvb3BfMSIpOwogICAgICBmb3IgKHZhciBpMTAgPSAwOyBpMTAgPCBsZW5ndGg7IGkxMCsrKSB7CiAgICAgICAgX2xvb3BfMShpMTApOwogICAgICB9CiAgICB9LCBzdWJzY3JpYmVyKTsKICB9Owp9Cl9fbmFtZShjb21iaW5lTGF0ZXN0SW5pdCwgImNvbWJpbmVMYXRlc3RJbml0Iik7CmZ1bmN0aW9uIG1heWJlU2NoZWR1bGUoc2NoZWR1bGVyLCBleGVjdXRlLCBzdWJzY3JpcHRpb24pIHsKICBpZiAoc2NoZWR1bGVyKSB7CiAgICBleGVjdXRlU2NoZWR1bGUoc3Vic2NyaXB0aW9uLCBzY2hlZHVsZXIsIGV4ZWN1dGUpOwogIH0gZWxzZSB7CiAgICBleGVjdXRlKCk7CiAgfQp9Cl9fbmFtZShtYXliZVNjaGVkdWxlLCAibWF5YmVTY2hlZHVsZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9tZXJnZUludGVybmFscy5qcwpmdW5jdGlvbiBtZXJnZUludGVybmFscyhzb3VyY2UsIHN1YnNjcmliZXIsIHByb2plY3QsIGNvbmN1cnJlbnQsIG9uQmVmb3JlTmV4dCwgZXhwYW5kMiwgaW5uZXJTdWJTY2hlZHVsZXIsIGFkZGl0aW9uYWxGaW5hbGl6ZXIpIHsKICB2YXIgYnVmZmVyMiA9IFtdOwogIHZhciBhY3RpdmUgPSAwOwogIHZhciBpbmRleDIgPSAwOwogIHZhciBpc0NvbXBsZXRlID0gZmFsc2U7CiAgdmFyIGNoZWNrQ29tcGxldGUgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCkgewogICAgaWYgKGlzQ29tcGxldGUgJiYgIWJ1ZmZlcjIubGVuZ3RoICYmICFhY3RpdmUpIHsKICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgfQogIH0sICJjaGVja0NvbXBsZXRlIik7CiAgdmFyIG91dGVyTmV4dCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24odmFsdWUyKSB7CiAgICByZXR1cm4gYWN0aXZlIDwgY29uY3VycmVudCA/IGRvSW5uZXJTdWIodmFsdWUyKSA6IGJ1ZmZlcjIucHVzaCh2YWx1ZTIpOwogIH0sICJvdXRlck5leHQiKTsKICB2YXIgZG9Jbm5lclN1YiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24odmFsdWUyKSB7CiAgICBleHBhbmQyICYmIHN1YnNjcmliZXIubmV4dCh2YWx1ZTIpOwogICAgYWN0aXZlKys7CiAgICB2YXIgaW5uZXJDb21wbGV0ZSA9IGZhbHNlOwogICAgaW5uZXJGcm9tKHByb2plY3QodmFsdWUyLCBpbmRleDIrKykpLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24oaW5uZXJWYWx1ZSkgewogICAgICBvbkJlZm9yZU5leHQgPT09IG51bGwgfHwgb25CZWZvcmVOZXh0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJlZm9yZU5leHQoaW5uZXJWYWx1ZSk7CiAgICAgIGlmIChleHBhbmQyKSB7CiAgICAgICAgb3V0ZXJOZXh0KGlubmVyVmFsdWUpOwogICAgICB9IGVsc2UgewogICAgICAgIHN1YnNjcmliZXIubmV4dChpbm5lclZhbHVlKTsKICAgICAgfQogICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgIGlubmVyQ29tcGxldGUgPSB0cnVlOwogICAgfSwgdm9pZCAwLCBmdW5jdGlvbigpIHsKICAgICAgaWYgKGlubmVyQ29tcGxldGUpIHsKICAgICAgICB0cnkgewogICAgICAgICAgYWN0aXZlLS07CiAgICAgICAgICB2YXIgX2xvb3BfMSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBidWZmZXJlZFZhbHVlID0gYnVmZmVyMi5zaGlmdCgpOwogICAgICAgICAgICBpZiAoaW5uZXJTdWJTY2hlZHVsZXIpIHsKICAgICAgICAgICAgICBleGVjdXRlU2NoZWR1bGUoc3Vic2NyaWJlciwgaW5uZXJTdWJTY2hlZHVsZXIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGRvSW5uZXJTdWIoYnVmZmVyZWRWYWx1ZSk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgZG9Jbm5lclN1YihidWZmZXJlZFZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgIl9sb29wXzEiKTsKICAgICAgICAgIHdoaWxlIChidWZmZXIyLmxlbmd0aCAmJiBhY3RpdmUgPCBjb25jdXJyZW50KSB7CiAgICAgICAgICAgIF9sb29wXzEoKTsKICAgICAgICAgIH0KICAgICAgICAgIGNoZWNrQ29tcGxldGUoKTsKICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IoZXJyKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pKTsKICB9LCAiZG9Jbm5lclN1YiIpOwogIHNvdXJjZS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIG91dGVyTmV4dCwgZnVuY3Rpb24oKSB7CiAgICBpc0NvbXBsZXRlID0gdHJ1ZTsKICAgIGNoZWNrQ29tcGxldGUoKTsKICB9KSk7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgYWRkaXRpb25hbEZpbmFsaXplciA9PT0gbnVsbCB8fCBhZGRpdGlvbmFsRmluYWxpemVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhZGRpdGlvbmFsRmluYWxpemVyKCk7CiAgfTsKfQpfX25hbWUobWVyZ2VJbnRlcm5hbHMsICJtZXJnZUludGVybmFscyIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9tZXJnZU1hcC5qcwpmdW5jdGlvbiBtZXJnZU1hcChwcm9qZWN0LCByZXN1bHRTZWxlY3RvciwgY29uY3VycmVudCkgewogIGlmIChjb25jdXJyZW50ID09PSB2b2lkIDApIHsKICAgIGNvbmN1cnJlbnQgPSBJbmZpbml0eTsKICB9CiAgaWYgKGlzRnVuY3Rpb24ocmVzdWx0U2VsZWN0b3IpKSB7CiAgICByZXR1cm4gbWVyZ2VNYXAoZnVuY3Rpb24oYTQsIGkxMCkgewogICAgICByZXR1cm4gbWFwMihmdW5jdGlvbihiNCwgaWkpIHsKICAgICAgICByZXR1cm4gcmVzdWx0U2VsZWN0b3IoYTQsIGI0LCBpMTAsIGlpKTsKICAgICAgfSkoaW5uZXJGcm9tKHByb2plY3QoYTQsIGkxMCkpKTsKICAgIH0sIGNvbmN1cnJlbnQpOwogIH0gZWxzZSBpZiAodHlwZW9mIHJlc3VsdFNlbGVjdG9yID09PSAibnVtYmVyIikgewogICAgY29uY3VycmVudCA9IHJlc3VsdFNlbGVjdG9yOwogIH0KICByZXR1cm4gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHsKICAgIHJldHVybiBtZXJnZUludGVybmFscyhzb3VyY2UsIHN1YnNjcmliZXIsIHByb2plY3QsIGNvbmN1cnJlbnQpOwogIH0pOwp9Cl9fbmFtZShtZXJnZU1hcCwgIm1lcmdlTWFwIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL21lcmdlQWxsLmpzCmZ1bmN0aW9uIG1lcmdlQWxsKGNvbmN1cnJlbnQpIHsKICBpZiAoY29uY3VycmVudCA9PT0gdm9pZCAwKSB7CiAgICBjb25jdXJyZW50ID0gSW5maW5pdHk7CiAgfQogIHJldHVybiBtZXJnZU1hcChpZGVudGl0eSwgY29uY3VycmVudCk7Cn0KX19uYW1lKG1lcmdlQWxsLCAibWVyZ2VBbGwiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvY29uY2F0QWxsLmpzCmZ1bmN0aW9uIGNvbmNhdEFsbCgpIHsKICByZXR1cm4gbWVyZ2VBbGwoMSk7Cn0KX19uYW1lKGNvbmNhdEFsbCwgImNvbmNhdEFsbCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvY29uY2F0LmpzCmZ1bmN0aW9uIGNvbmNhdCgpIHsKICB2YXIgYXJncyA9IFtdOwogIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07CiAgfQogIHJldHVybiBjb25jYXRBbGwoKShmcm9tKGFyZ3MsIHBvcFNjaGVkdWxlcihhcmdzKSkpOwp9Cl9fbmFtZShjb25jYXQsICJjb25jYXQiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL2Zyb21FdmVudC5qcwp2YXIgbm9kZUV2ZW50RW1pdHRlck1ldGhvZHMgPSBbImFkZExpc3RlbmVyIiwgInJlbW92ZUxpc3RlbmVyIl07CnZhciBldmVudFRhcmdldE1ldGhvZHMgPSBbImFkZEV2ZW50TGlzdGVuZXIiLCAicmVtb3ZlRXZlbnRMaXN0ZW5lciJdOwp2YXIganF1ZXJ5TWV0aG9kcyA9IFsib24iLCAib2ZmIl07CmZ1bmN0aW9uIGZyb21FdmVudCh0YXJnZXQsIGV2ZW50TmFtZSwgb3B0aW9ucywgcmVzdWx0U2VsZWN0b3IpIHsKICBpZiAoaXNGdW5jdGlvbihvcHRpb25zKSkgewogICAgcmVzdWx0U2VsZWN0b3IgPSBvcHRpb25zOwogICAgb3B0aW9ucyA9IHZvaWQgMDsKICB9CiAgaWYgKHJlc3VsdFNlbGVjdG9yKSB7CiAgICByZXR1cm4gZnJvbUV2ZW50KHRhcmdldCwgZXZlbnROYW1lLCBvcHRpb25zKS5waXBlKG1hcE9uZU9yTWFueUFyZ3MocmVzdWx0U2VsZWN0b3IpKTsKICB9CiAgdmFyIF9hMiA9IF9fcmVhZChpc0V2ZW50VGFyZ2V0KHRhcmdldCkgPyBldmVudFRhcmdldE1ldGhvZHMubWFwKGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHsKICAgIHJldHVybiBmdW5jdGlvbihoYW5kbGVyMikgewogICAgICByZXR1cm4gdGFyZ2V0W21ldGhvZE5hbWVdKGV2ZW50TmFtZSwgaGFuZGxlcjIsIG9wdGlvbnMpOwogICAgfTsKICB9KSA6IGlzTm9kZVN0eWxlRXZlbnRFbWl0dGVyKHRhcmdldCkgPyBub2RlRXZlbnRFbWl0dGVyTWV0aG9kcy5tYXAodG9Db21tb25IYW5kbGVyUmVnaXN0cnkodGFyZ2V0LCBldmVudE5hbWUpKSA6IGlzSlF1ZXJ5U3R5bGVFdmVudEVtaXR0ZXIodGFyZ2V0KSA/IGpxdWVyeU1ldGhvZHMubWFwKHRvQ29tbW9uSGFuZGxlclJlZ2lzdHJ5KHRhcmdldCwgZXZlbnROYW1lKSkgOiBbXSwgMiksIGFkZDIgPSBfYTJbMF0sIHJlbW92ZTIgPSBfYTJbMV07CiAgaWYgKCFhZGQyKSB7CiAgICBpZiAoaXNBcnJheUxpa2UodGFyZ2V0KSkgewogICAgICByZXR1cm4gbWVyZ2VNYXAoZnVuY3Rpb24oc3ViVGFyZ2V0KSB7CiAgICAgICAgcmV0dXJuIGZyb21FdmVudChzdWJUYXJnZXQsIGV2ZW50TmFtZSwgb3B0aW9ucyk7CiAgICAgIH0pKGlubmVyRnJvbSh0YXJnZXQpKTsKICAgIH0KICB9CiAgaWYgKCFhZGQyKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGV2ZW50IHRhcmdldCIpOwogIH0KICByZXR1cm4gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgdmFyIGhhbmRsZXIyID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHsKICAgICAgdmFyIGFyZ3MgPSBbXTsKICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07CiAgICAgIH0KICAgICAgcmV0dXJuIHN1YnNjcmliZXIubmV4dCgxIDwgYXJncy5sZW5ndGggPyBhcmdzIDogYXJnc1swXSk7CiAgICB9LCAiaGFuZGxlciIpOwogICAgYWRkMihoYW5kbGVyMik7CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiByZW1vdmUyKGhhbmRsZXIyKTsKICAgIH07CiAgfSk7Cn0KX19uYW1lKGZyb21FdmVudCwgImZyb21FdmVudCIpOwpmdW5jdGlvbiB0b0NvbW1vbkhhbmRsZXJSZWdpc3RyeSh0YXJnZXQsIGV2ZW50TmFtZSkgewogIHJldHVybiBmdW5jdGlvbihtZXRob2ROYW1lKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oaGFuZGxlcjIpIHsKICAgICAgcmV0dXJuIHRhcmdldFttZXRob2ROYW1lXShldmVudE5hbWUsIGhhbmRsZXIyKTsKICAgIH07CiAgfTsKfQpfX25hbWUodG9Db21tb25IYW5kbGVyUmVnaXN0cnksICJ0b0NvbW1vbkhhbmRsZXJSZWdpc3RyeSIpOwpmdW5jdGlvbiBpc05vZGVTdHlsZUV2ZW50RW1pdHRlcih0YXJnZXQpIHsKICByZXR1cm4gaXNGdW5jdGlvbih0YXJnZXQuYWRkTGlzdGVuZXIpICYmIGlzRnVuY3Rpb24odGFyZ2V0LnJlbW92ZUxpc3RlbmVyKTsKfQpfX25hbWUoaXNOb2RlU3R5bGVFdmVudEVtaXR0ZXIsICJpc05vZGVTdHlsZUV2ZW50RW1pdHRlciIpOwpmdW5jdGlvbiBpc0pRdWVyeVN0eWxlRXZlbnRFbWl0dGVyKHRhcmdldCkgewogIHJldHVybiBpc0Z1bmN0aW9uKHRhcmdldC5vbikgJiYgaXNGdW5jdGlvbih0YXJnZXQub2ZmKTsKfQpfX25hbWUoaXNKUXVlcnlTdHlsZUV2ZW50RW1pdHRlciwgImlzSlF1ZXJ5U3R5bGVFdmVudEVtaXR0ZXIiKTsKZnVuY3Rpb24gaXNFdmVudFRhcmdldCh0YXJnZXQpIHsKICByZXR1cm4gaXNGdW5jdGlvbih0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcikgJiYgaXNGdW5jdGlvbih0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcik7Cn0KX19uYW1lKGlzRXZlbnRUYXJnZXQsICJpc0V2ZW50VGFyZ2V0Iik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS90aW1lci5qcwpmdW5jdGlvbiB0aW1lcihkdWVUaW1lLCBpbnRlcnZhbE9yU2NoZWR1bGVyLCBzY2hlZHVsZXIpIHsKICBpZiAoZHVlVGltZSA9PT0gdm9pZCAwKSB7CiAgICBkdWVUaW1lID0gMDsKICB9CiAgaWYgKHNjaGVkdWxlciA9PT0gdm9pZCAwKSB7CiAgICBzY2hlZHVsZXIgPSBhc3luYzsKICB9CiAgdmFyIGludGVydmFsRHVyYXRpb24gPSAtMTsKICBpZiAoaW50ZXJ2YWxPclNjaGVkdWxlciAhPSBudWxsKSB7CiAgICBpZiAoaXNTY2hlZHVsZXIoaW50ZXJ2YWxPclNjaGVkdWxlcikpIHsKICAgICAgc2NoZWR1bGVyID0gaW50ZXJ2YWxPclNjaGVkdWxlcjsKICAgIH0gZWxzZSB7CiAgICAgIGludGVydmFsRHVyYXRpb24gPSBpbnRlcnZhbE9yU2NoZWR1bGVyOwogICAgfQogIH0KICByZXR1cm4gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgdmFyIGR1ZSA9IGlzVmFsaWREYXRlKGR1ZVRpbWUpID8gK2R1ZVRpbWUgLSBzY2hlZHVsZXIubm93KCkgOiBkdWVUaW1lOwogICAgaWYgKGR1ZSA8IDApIHsKICAgICAgZHVlID0gMDsKICAgIH0KICAgIHZhciBuMTEgPSAwOwogICAgcmV0dXJuIHNjaGVkdWxlci5zY2hlZHVsZShmdW5jdGlvbigpIHsKICAgICAgaWYgKCFzdWJzY3JpYmVyLmNsb3NlZCkgewogICAgICAgIHN1YnNjcmliZXIubmV4dChuMTErKyk7CiAgICAgICAgaWYgKDAgPD0gaW50ZXJ2YWxEdXJhdGlvbikgewogICAgICAgICAgdGhpcy5zY2hlZHVsZSh2b2lkIDAsIGludGVydmFsRHVyYXRpb24pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9LCBkdWUpOwogIH0pOwp9Cl9fbmFtZSh0aW1lciwgInRpbWVyIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2ZpbHRlci5qcwpmdW5jdGlvbiBmaWx0ZXIocHJlZGljYXRlLCB0aGlzQXJnKSB7CiAgcmV0dXJuIG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICB2YXIgaW5kZXgyID0gMDsKICAgIHNvdXJjZS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlMikgewogICAgICByZXR1cm4gcHJlZGljYXRlLmNhbGwodGhpc0FyZywgdmFsdWUyLCBpbmRleDIrKykgJiYgc3Vic2NyaWJlci5uZXh0KHZhbHVlMik7CiAgICB9KSk7CiAgfSk7Cn0KX19uYW1lKGZpbHRlciwgImZpbHRlciIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9idWZmZXIuanMKZnVuY3Rpb24gYnVmZmVyKGNsb3NpbmdOb3RpZmllcikgewogIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgdmFyIGN1cnJlbnRCdWZmZXIgPSBbXTsKICAgIHNvdXJjZS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlMikgewogICAgICByZXR1cm4gY3VycmVudEJ1ZmZlci5wdXNoKHZhbHVlMik7CiAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgc3Vic2NyaWJlci5uZXh0KGN1cnJlbnRCdWZmZXIpOwogICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICB9KSk7CiAgICBpbm5lckZyb20oY2xvc2luZ05vdGlmaWVyKS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKCkgewogICAgICB2YXIgYjQgPSBjdXJyZW50QnVmZmVyOwogICAgICBjdXJyZW50QnVmZmVyID0gW107CiAgICAgIHN1YnNjcmliZXIubmV4dChiNCk7CiAgICB9LCBub29wKSk7CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgIGN1cnJlbnRCdWZmZXIgPSBudWxsOwogICAgfTsKICB9KTsKfQpfX25hbWUoYnVmZmVyLCAiYnVmZmVyIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2J1ZmZlckNvdW50LmpzCmZ1bmN0aW9uIGJ1ZmZlckNvdW50KGJ1ZmZlclNpemUsIHN0YXJ0QnVmZmVyRXZlcnkpIHsKICBpZiAoc3RhcnRCdWZmZXJFdmVyeSA9PT0gdm9pZCAwKSB7CiAgICBzdGFydEJ1ZmZlckV2ZXJ5ID0gbnVsbDsKICB9CiAgc3RhcnRCdWZmZXJFdmVyeSA9IHN0YXJ0QnVmZmVyRXZlcnkgIT09IG51bGwgJiYgc3RhcnRCdWZmZXJFdmVyeSAhPT0gdm9pZCAwID8gc3RhcnRCdWZmZXJFdmVyeSA6IGJ1ZmZlclNpemU7CiAgcmV0dXJuIG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICB2YXIgYnVmZmVycyA9IFtdOwogICAgdmFyIGNvdW50MiA9IDA7CiAgICBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZTIpIHsKICAgICAgdmFyIGVfMSwgX2EyLCBlXzIsIF9iOwogICAgICB2YXIgdG9FbWl0ID0gbnVsbDsKICAgICAgaWYgKGNvdW50MisrICUgc3RhcnRCdWZmZXJFdmVyeSA9PT0gMCkgewogICAgICAgIGJ1ZmZlcnMucHVzaChbXSk7CiAgICAgIH0KICAgICAgdHJ5IHsKICAgICAgICBmb3IgKHZhciBidWZmZXJzXzEgPSBfX3ZhbHVlcyhidWZmZXJzKSwgYnVmZmVyc18xXzEgPSBidWZmZXJzXzEubmV4dCgpOyAhYnVmZmVyc18xXzEuZG9uZTsgYnVmZmVyc18xXzEgPSBidWZmZXJzXzEubmV4dCgpKSB7CiAgICAgICAgICB2YXIgYnVmZmVyMiA9IGJ1ZmZlcnNfMV8xLnZhbHVlOwogICAgICAgICAgYnVmZmVyMi5wdXNoKHZhbHVlMik7CiAgICAgICAgICBpZiAoYnVmZmVyU2l6ZSA8PSBidWZmZXIyLmxlbmd0aCkgewogICAgICAgICAgICB0b0VtaXQgPSB0b0VtaXQgIT09IG51bGwgJiYgdG9FbWl0ICE9PSB2b2lkIDAgPyB0b0VtaXQgOiBbXTsKICAgICAgICAgICAgdG9FbWl0LnB1c2goYnVmZmVyMik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlXzFfMSkgewogICAgICAgIGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGlmIChidWZmZXJzXzFfMSAmJiAhYnVmZmVyc18xXzEuZG9uZSAmJiAoX2EyID0gYnVmZmVyc18xLnJldHVybikpIF9hMi5jYWxsKGJ1ZmZlcnNfMSk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHRvRW1pdCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBmb3IgKHZhciB0b0VtaXRfMSA9IF9fdmFsdWVzKHRvRW1pdCksIHRvRW1pdF8xXzEgPSB0b0VtaXRfMS5uZXh0KCk7ICF0b0VtaXRfMV8xLmRvbmU7IHRvRW1pdF8xXzEgPSB0b0VtaXRfMS5uZXh0KCkpIHsKICAgICAgICAgICAgdmFyIGJ1ZmZlcjIgPSB0b0VtaXRfMV8xLnZhbHVlOwogICAgICAgICAgICBhcnJSZW1vdmUoYnVmZmVycywgYnVmZmVyMik7CiAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChidWZmZXIyKTsKICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlXzJfMSkgewogICAgICAgICAgZV8yID0geyBlcnJvcjogZV8yXzEgfTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKHRvRW1pdF8xXzEgJiYgIXRvRW1pdF8xXzEuZG9uZSAmJiAoX2IgPSB0b0VtaXRfMS5yZXR1cm4pKSBfYi5jYWxsKHRvRW1pdF8xKTsKICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgIGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0sIGZ1bmN0aW9uKCkgewogICAgICB2YXIgZV8zLCBfYTI7CiAgICAgIHRyeSB7CiAgICAgICAgZm9yICh2YXIgYnVmZmVyc18yID0gX192YWx1ZXMoYnVmZmVycyksIGJ1ZmZlcnNfMl8xID0gYnVmZmVyc18yLm5leHQoKTsgIWJ1ZmZlcnNfMl8xLmRvbmU7IGJ1ZmZlcnNfMl8xID0gYnVmZmVyc18yLm5leHQoKSkgewogICAgICAgICAgdmFyIGJ1ZmZlcjIgPSBidWZmZXJzXzJfMS52YWx1ZTsKICAgICAgICAgIHN1YnNjcmliZXIubmV4dChidWZmZXIyKTsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGVfM18xKSB7CiAgICAgICAgZV8zID0geyBlcnJvcjogZV8zXzEgfTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICB0cnkgewogICAgICAgICAgaWYgKGJ1ZmZlcnNfMl8xICYmICFidWZmZXJzXzJfMS5kb25lICYmIChfYTIgPSBidWZmZXJzXzIucmV0dXJuKSkgX2EyLmNhbGwoYnVmZmVyc18yKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgaWYgKGVfMykgdGhyb3cgZV8zLmVycm9yOwogICAgICAgIH0KICAgICAgfQogICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICB9LCB2b2lkIDAsIGZ1bmN0aW9uKCkgewogICAgICBidWZmZXJzID0gbnVsbDsKICAgIH0pKTsKICB9KTsKfQpfX25hbWUoYnVmZmVyQ291bnQsICJidWZmZXJDb3VudCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9idWZmZXJUaW1lLmpzCmZ1bmN0aW9uIGJ1ZmZlclRpbWUoYnVmZmVyVGltZVNwYW4pIHsKICB2YXIgX2EyLCBfYjsKICB2YXIgb3RoZXJBcmdzID0gW107CiAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKICAgIG90aGVyQXJnc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTsKICB9CiAgdmFyIHNjaGVkdWxlciA9IChfYTIgPSBwb3BTY2hlZHVsZXIob3RoZXJBcmdzKSkgIT09IG51bGwgJiYgX2EyICE9PSB2b2lkIDAgPyBfYTIgOiBhc3luY1NjaGVkdWxlcjsKICB2YXIgYnVmZmVyQ3JlYXRpb25JbnRlcnZhbCA9IChfYiA9IG90aGVyQXJnc1swXSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogbnVsbDsKICB2YXIgbWF4QnVmZmVyU2l6ZSA9IG90aGVyQXJnc1sxXSB8fCBJbmZpbml0eTsKICByZXR1cm4gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHsKICAgIHZhciBidWZmZXJSZWNvcmRzID0gW107CiAgICB2YXIgcmVzdGFydE9uRW1pdCA9IGZhbHNlOwogICAgdmFyIGVtaXQgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKHJlY29yZCkgewogICAgICB2YXIgYnVmZmVyMiA9IHJlY29yZC5idWZmZXIsIHN1YnMgPSByZWNvcmQuc3ViczsKICAgICAgc3Vicy51bnN1YnNjcmliZSgpOwogICAgICBhcnJSZW1vdmUoYnVmZmVyUmVjb3JkcywgcmVjb3JkKTsKICAgICAgc3Vic2NyaWJlci5uZXh0KGJ1ZmZlcjIpOwogICAgICByZXN0YXJ0T25FbWl0ICYmIHN0YXJ0QnVmZmVyKCk7CiAgICB9LCAiZW1pdCIpOwogICAgdmFyIHN0YXJ0QnVmZmVyID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHsKICAgICAgaWYgKGJ1ZmZlclJlY29yZHMpIHsKICAgICAgICB2YXIgc3VicyA9IG5ldyBTdWJzY3JpcHRpb24oKTsKICAgICAgICBzdWJzY3JpYmVyLmFkZChzdWJzKTsKICAgICAgICB2YXIgYnVmZmVyMiA9IFtdOwogICAgICAgIHZhciByZWNvcmRfMSA9IHsKICAgICAgICAgIGJ1ZmZlcjogYnVmZmVyMiwKICAgICAgICAgIHN1YnMKICAgICAgICB9OwogICAgICAgIGJ1ZmZlclJlY29yZHMucHVzaChyZWNvcmRfMSk7CiAgICAgICAgZXhlY3V0ZVNjaGVkdWxlKHN1YnMsIHNjaGVkdWxlciwgZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gZW1pdChyZWNvcmRfMSk7CiAgICAgICAgfSwgYnVmZmVyVGltZVNwYW4pOwogICAgICB9CiAgICB9LCAic3RhcnRCdWZmZXIiKTsKICAgIGlmIChidWZmZXJDcmVhdGlvbkludGVydmFsICE9PSBudWxsICYmIGJ1ZmZlckNyZWF0aW9uSW50ZXJ2YWwgPj0gMCkgewogICAgICBleGVjdXRlU2NoZWR1bGUoc3Vic2NyaWJlciwgc2NoZWR1bGVyLCBzdGFydEJ1ZmZlciwgYnVmZmVyQ3JlYXRpb25JbnRlcnZhbCwgdHJ1ZSk7CiAgICB9IGVsc2UgewogICAgICByZXN0YXJ0T25FbWl0ID0gdHJ1ZTsKICAgIH0KICAgIHN0YXJ0QnVmZmVyKCk7CiAgICB2YXIgYnVmZmVyVGltZVN1YnNjcmliZXIgPSBjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUyKSB7CiAgICAgIHZhciBlXzEsIF9hMzsKICAgICAgdmFyIHJlY29yZHNDb3B5ID0gYnVmZmVyUmVjb3Jkcy5zbGljZSgpOwogICAgICB0cnkgewogICAgICAgIGZvciAodmFyIHJlY29yZHNDb3B5XzEgPSBfX3ZhbHVlcyhyZWNvcmRzQ29weSksIHJlY29yZHNDb3B5XzFfMSA9IHJlY29yZHNDb3B5XzEubmV4dCgpOyAhcmVjb3Jkc0NvcHlfMV8xLmRvbmU7IHJlY29yZHNDb3B5XzFfMSA9IHJlY29yZHNDb3B5XzEubmV4dCgpKSB7CiAgICAgICAgICB2YXIgcmVjb3JkID0gcmVjb3Jkc0NvcHlfMV8xLnZhbHVlOwogICAgICAgICAgdmFyIGJ1ZmZlcjIgPSByZWNvcmQuYnVmZmVyOwogICAgICAgICAgYnVmZmVyMi5wdXNoKHZhbHVlMik7CiAgICAgICAgICBtYXhCdWZmZXJTaXplIDw9IGJ1ZmZlcjIubGVuZ3RoICYmIGVtaXQocmVjb3JkKTsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGVfMV8xKSB7CiAgICAgICAgZV8xID0geyBlcnJvcjogZV8xXzEgfTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICB0cnkgewogICAgICAgICAgaWYgKHJlY29yZHNDb3B5XzFfMSAmJiAhcmVjb3Jkc0NvcHlfMV8xLmRvbmUgJiYgKF9hMyA9IHJlY29yZHNDb3B5XzEucmV0dXJuKSkgX2EzLmNhbGwocmVjb3Jkc0NvcHlfMSk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsKICAgICAgICB9CiAgICAgIH0KICAgIH0sIGZ1bmN0aW9uKCkgewogICAgICB3aGlsZSAoYnVmZmVyUmVjb3JkcyA9PT0gbnVsbCB8fCBidWZmZXJSZWNvcmRzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBidWZmZXJSZWNvcmRzLmxlbmd0aCkgewogICAgICAgIHN1YnNjcmliZXIubmV4dChidWZmZXJSZWNvcmRzLnNoaWZ0KCkuYnVmZmVyKTsKICAgICAgfQogICAgICBidWZmZXJUaW1lU3Vic2NyaWJlciA9PT0gbnVsbCB8fCBidWZmZXJUaW1lU3Vic2NyaWJlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogYnVmZmVyVGltZVN1YnNjcmliZXIudW5zdWJzY3JpYmUoKTsKICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgICBzdWJzY3JpYmVyLnVuc3Vic2NyaWJlKCk7CiAgICB9LCB2b2lkIDAsIGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gYnVmZmVyUmVjb3JkcyA9IG51bGw7CiAgICB9KTsKICAgIHNvdXJjZS5zdWJzY3JpYmUoYnVmZmVyVGltZVN1YnNjcmliZXIpOwogIH0pOwp9Cl9fbmFtZShidWZmZXJUaW1lLCAiYnVmZmVyVGltZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9kZWJvdW5jZS5qcwpmdW5jdGlvbiBkZWJvdW5jZShkdXJhdGlvblNlbGVjdG9yKSB7CiAgcmV0dXJuIG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICB2YXIgaGFzVmFsdWUgPSBmYWxzZTsKICAgIHZhciBsYXN0VmFsdWUgPSBudWxsOwogICAgdmFyIGR1cmF0aW9uU3Vic2NyaWJlciA9IG51bGw7CiAgICB2YXIgZW1pdCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oKSB7CiAgICAgIGR1cmF0aW9uU3Vic2NyaWJlciA9PT0gbnVsbCB8fCBkdXJhdGlvblN1YnNjcmliZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGR1cmF0aW9uU3Vic2NyaWJlci51bnN1YnNjcmliZSgpOwogICAgICBkdXJhdGlvblN1YnNjcmliZXIgPSBudWxsOwogICAgICBpZiAoaGFzVmFsdWUpIHsKICAgICAgICBoYXNWYWx1ZSA9IGZhbHNlOwogICAgICAgIHZhciB2YWx1ZTIgPSBsYXN0VmFsdWU7CiAgICAgICAgbGFzdFZhbHVlID0gbnVsbDsKICAgICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWUyKTsKICAgICAgfQogICAgfSwgImVtaXQiKTsKICAgIHNvdXJjZS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlMikgewogICAgICBkdXJhdGlvblN1YnNjcmliZXIgPT09IG51bGwgfHwgZHVyYXRpb25TdWJzY3JpYmVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkdXJhdGlvblN1YnNjcmliZXIudW5zdWJzY3JpYmUoKTsKICAgICAgaGFzVmFsdWUgPSB0cnVlOwogICAgICBsYXN0VmFsdWUgPSB2YWx1ZTI7CiAgICAgIGR1cmF0aW9uU3Vic2NyaWJlciA9IGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBlbWl0LCBub29wKTsKICAgICAgaW5uZXJGcm9tKGR1cmF0aW9uU2VsZWN0b3IodmFsdWUyKSkuc3Vic2NyaWJlKGR1cmF0aW9uU3Vic2NyaWJlcik7CiAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgZW1pdCgpOwogICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICB9LCB2b2lkIDAsIGZ1bmN0aW9uKCkgewogICAgICBsYXN0VmFsdWUgPSBkdXJhdGlvblN1YnNjcmliZXIgPSBudWxsOwogICAgfSkpOwogIH0pOwp9Cl9fbmFtZShkZWJvdW5jZSwgImRlYm91bmNlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2RlYm91bmNlVGltZS5qcwpmdW5jdGlvbiBkZWJvdW5jZVRpbWUoZHVlVGltZSwgc2NoZWR1bGVyKSB7CiAgaWYgKHNjaGVkdWxlciA9PT0gdm9pZCAwKSB7CiAgICBzY2hlZHVsZXIgPSBhc3luY1NjaGVkdWxlcjsKICB9CiAgcmV0dXJuIG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICB2YXIgYWN0aXZlVGFzayA9IG51bGw7CiAgICB2YXIgbGFzdFZhbHVlID0gbnVsbDsKICAgIHZhciBsYXN0VGltZSA9IG51bGw7CiAgICB2YXIgZW1pdCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oKSB7CiAgICAgIGlmIChhY3RpdmVUYXNrKSB7CiAgICAgICAgYWN0aXZlVGFzay51bnN1YnNjcmliZSgpOwogICAgICAgIGFjdGl2ZVRhc2sgPSBudWxsOwogICAgICAgIHZhciB2YWx1ZTIgPSBsYXN0VmFsdWU7CiAgICAgICAgbGFzdFZhbHVlID0gbnVsbDsKICAgICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWUyKTsKICAgICAgfQogICAgfSwgImVtaXQiKTsKICAgIGZ1bmN0aW9uIGVtaXRXaGVuSWRsZSgpIHsKICAgICAgdmFyIHRhcmdldFRpbWUgPSBsYXN0VGltZSArIGR1ZVRpbWU7CiAgICAgIHZhciBub3cyID0gc2NoZWR1bGVyLm5vdygpOwogICAgICBpZiAobm93MiA8IHRhcmdldFRpbWUpIHsKICAgICAgICBhY3RpdmVUYXNrID0gdGhpcy5zY2hlZHVsZSh2b2lkIDAsIHRhcmdldFRpbWUgLSBub3cyKTsKICAgICAgICBzdWJzY3JpYmVyLmFkZChhY3RpdmVUYXNrKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgZW1pdCgpOwogICAgfQogICAgX19uYW1lKGVtaXRXaGVuSWRsZSwgImVtaXRXaGVuSWRsZSIpOwogICAgc291cmNlLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUyKSB7CiAgICAgIGxhc3RWYWx1ZSA9IHZhbHVlMjsKICAgICAgbGFzdFRpbWUgPSBzY2hlZHVsZXIubm93KCk7CiAgICAgIGlmICghYWN0aXZlVGFzaykgewogICAgICAgIGFjdGl2ZVRhc2sgPSBzY2hlZHVsZXIuc2NoZWR1bGUoZW1pdFdoZW5JZGxlLCBkdWVUaW1lKTsKICAgICAgICBzdWJzY3JpYmVyLmFkZChhY3RpdmVUYXNrKTsKICAgICAgfQogICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgIGVtaXQoKTsKICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgfSwgdm9pZCAwLCBmdW5jdGlvbigpIHsKICAgICAgbGFzdFZhbHVlID0gYWN0aXZlVGFzayA9IG51bGw7CiAgICB9KSk7CiAgfSk7Cn0KX19uYW1lKGRlYm91bmNlVGltZSwgImRlYm91bmNlVGltZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9zaGFyZS5qcwpmdW5jdGlvbiBzaGFyZShvcHRpb25zKSB7CiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgewogICAgb3B0aW9ucyA9IHt9OwogIH0KICB2YXIgX2EyID0gb3B0aW9ucy5jb25uZWN0b3IsIGNvbm5lY3RvciA9IF9hMiA9PT0gdm9pZCAwID8gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gbmV3IFN1YmplY3QoKTsKICB9IDogX2EyLCBfYiA9IG9wdGlvbnMucmVzZXRPbkVycm9yLCByZXNldE9uRXJyb3IgPSBfYiA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9iLCBfYyA9IG9wdGlvbnMucmVzZXRPbkNvbXBsZXRlLCByZXNldE9uQ29tcGxldGUgPSBfYyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9jLCBfZCA9IG9wdGlvbnMucmVzZXRPblJlZkNvdW50WmVybywgcmVzZXRPblJlZkNvdW50WmVybyA9IF9kID09PSB2b2lkIDAgPyB0cnVlIDogX2Q7CiAgcmV0dXJuIGZ1bmN0aW9uKHdyYXBwZXJTb3VyY2UpIHsKICAgIHZhciBjb25uZWN0aW9uOwogICAgdmFyIHJlc2V0Q29ubmVjdGlvbjsKICAgIHZhciBzdWJqZWN0OwogICAgdmFyIHJlZkNvdW50MiA9IDA7CiAgICB2YXIgaGFzQ29tcGxldGVkID0gZmFsc2U7CiAgICB2YXIgaGFzRXJyb3JlZCA9IGZhbHNlOwogICAgdmFyIGNhbmNlbFJlc2V0ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHsKICAgICAgcmVzZXRDb25uZWN0aW9uID09PSBudWxsIHx8IHJlc2V0Q29ubmVjdGlvbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVzZXRDb25uZWN0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgIHJlc2V0Q29ubmVjdGlvbiA9IHZvaWQgMDsKICAgIH0sICJjYW5jZWxSZXNldCIpOwogICAgdmFyIHJlc2V0ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHsKICAgICAgY2FuY2VsUmVzZXQoKTsKICAgICAgY29ubmVjdGlvbiA9IHN1YmplY3QgPSB2b2lkIDA7CiAgICAgIGhhc0NvbXBsZXRlZCA9IGhhc0Vycm9yZWQgPSBmYWxzZTsKICAgIH0sICJyZXNldCIpOwogICAgdmFyIHJlc2V0QW5kVW5zdWJzY3JpYmUgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCkgewogICAgICB2YXIgY29ubiA9IGNvbm5lY3Rpb247CiAgICAgIHJlc2V0KCk7CiAgICAgIGNvbm4gPT09IG51bGwgfHwgY29ubiA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29ubi51bnN1YnNjcmliZSgpOwogICAgfSwgInJlc2V0QW5kVW5zdWJzY3JpYmUiKTsKICAgIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgICByZWZDb3VudDIrKzsKICAgICAgaWYgKCFoYXNFcnJvcmVkICYmICFoYXNDb21wbGV0ZWQpIHsKICAgICAgICBjYW5jZWxSZXNldCgpOwogICAgICB9CiAgICAgIHZhciBkZXN0ID0gc3ViamVjdCA9IHN1YmplY3QgIT09IG51bGwgJiYgc3ViamVjdCAhPT0gdm9pZCAwID8gc3ViamVjdCA6IGNvbm5lY3RvcigpOwogICAgICBzdWJzY3JpYmVyLmFkZChmdW5jdGlvbigpIHsKICAgICAgICByZWZDb3VudDItLTsKICAgICAgICBpZiAocmVmQ291bnQyID09PSAwICYmICFoYXNFcnJvcmVkICYmICFoYXNDb21wbGV0ZWQpIHsKICAgICAgICAgIHJlc2V0Q29ubmVjdGlvbiA9IGhhbmRsZVJlc2V0KHJlc2V0QW5kVW5zdWJzY3JpYmUsIHJlc2V0T25SZWZDb3VudFplcm8pOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIGRlc3Quc3Vic2NyaWJlKHN1YnNjcmliZXIpOwogICAgICBpZiAoIWNvbm5lY3Rpb24gJiYgcmVmQ291bnQyID4gMCkgewogICAgICAgIGNvbm5lY3Rpb24gPSBuZXcgU2FmZVN1YnNjcmliZXIoewogICAgICAgICAgbmV4dDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbih2YWx1ZTIpIHsKICAgICAgICAgICAgcmV0dXJuIGRlc3QubmV4dCh2YWx1ZTIpOwogICAgICAgICAgfSwgIm5leHQiKSwKICAgICAgICAgIGVycm9yOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICBoYXNFcnJvcmVkID0gdHJ1ZTsKICAgICAgICAgICAgY2FuY2VsUmVzZXQoKTsKICAgICAgICAgICAgcmVzZXRDb25uZWN0aW9uID0gaGFuZGxlUmVzZXQocmVzZXQsIHJlc2V0T25FcnJvciwgZXJyKTsKICAgICAgICAgICAgZGVzdC5lcnJvcihlcnIpOwogICAgICAgICAgfSwgImVycm9yIiksCiAgICAgICAgICBjb21wbGV0ZTogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHsKICAgICAgICAgICAgaGFzQ29tcGxldGVkID0gdHJ1ZTsKICAgICAgICAgICAgY2FuY2VsUmVzZXQoKTsKICAgICAgICAgICAgcmVzZXRDb25uZWN0aW9uID0gaGFuZGxlUmVzZXQocmVzZXQsIHJlc2V0T25Db21wbGV0ZSk7CiAgICAgICAgICAgIGRlc3QuY29tcGxldGUoKTsKICAgICAgICAgIH0sICJjb21wbGV0ZSIpCiAgICAgICAgfSk7CiAgICAgICAgaW5uZXJGcm9tKHNvdXJjZSkuc3Vic2NyaWJlKGNvbm5lY3Rpb24pOwogICAgICB9CiAgICB9KSh3cmFwcGVyU291cmNlKTsKICB9Owp9Cl9fbmFtZShzaGFyZSwgInNoYXJlIik7CmZ1bmN0aW9uIGhhbmRsZVJlc2V0KHJlc2V0LCBvbikgewogIHZhciBhcmdzID0gW107CiAgZm9yICh2YXIgX2kgPSAyOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKICAgIGFyZ3NbX2kgLSAyXSA9IGFyZ3VtZW50c1tfaV07CiAgfQogIGlmIChvbiA9PT0gdHJ1ZSkgewogICAgcmVzZXQoKTsKICAgIHJldHVybjsKICB9CiAgaWYgKG9uID09PSBmYWxzZSkgewogICAgcmV0dXJuOwogIH0KICB2YXIgb25TdWJzY3JpYmVyID0gbmV3IFNhZmVTdWJzY3JpYmVyKHsKICAgIG5leHQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oKSB7CiAgICAgIG9uU3Vic2NyaWJlci51bnN1YnNjcmliZSgpOwogICAgICByZXNldCgpOwogICAgfSwgIm5leHQiKQogIH0pOwogIHJldHVybiBpbm5lckZyb20ob24uYXBwbHkodm9pZCAwLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoYXJncykpKSkuc3Vic2NyaWJlKG9uU3Vic2NyaWJlcik7Cn0KX19uYW1lKGhhbmRsZVJlc2V0LCAiaGFuZGxlUmVzZXQiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvc2hhcmVSZXBsYXkuanMKZnVuY3Rpb24gc2hhcmVSZXBsYXkoY29uZmlnT3JCdWZmZXJTaXplLCB3aW5kb3dUaW1lMiwgc2NoZWR1bGVyKSB7CiAgdmFyIF9hMiwgX2IsIF9jOwogIHZhciBidWZmZXJTaXplOwogIHZhciByZWZDb3VudDIgPSBmYWxzZTsKICBpZiAoY29uZmlnT3JCdWZmZXJTaXplICYmIHR5cGVvZiBjb25maWdPckJ1ZmZlclNpemUgPT09ICJvYmplY3QiKSB7CiAgICBfYTIgPSBjb25maWdPckJ1ZmZlclNpemUuYnVmZmVyU2l6ZSwgYnVmZmVyU2l6ZSA9IF9hMiA9PT0gdm9pZCAwID8gSW5maW5pdHkgOiBfYTIsIF9iID0gY29uZmlnT3JCdWZmZXJTaXplLndpbmRvd1RpbWUsIHdpbmRvd1RpbWUyID0gX2IgPT09IHZvaWQgMCA/IEluZmluaXR5IDogX2IsIF9jID0gY29uZmlnT3JCdWZmZXJTaXplLnJlZkNvdW50LCByZWZDb3VudDIgPSBfYyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfYywgc2NoZWR1bGVyID0gY29uZmlnT3JCdWZmZXJTaXplLnNjaGVkdWxlcjsKICB9IGVsc2UgewogICAgYnVmZmVyU2l6ZSA9IGNvbmZpZ09yQnVmZmVyU2l6ZSAhPT0gbnVsbCAmJiBjb25maWdPckJ1ZmZlclNpemUgIT09IHZvaWQgMCA/IGNvbmZpZ09yQnVmZmVyU2l6ZSA6IEluZmluaXR5OwogIH0KICByZXR1cm4gc2hhcmUoewogICAgY29ubmVjdG9yOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gbmV3IFJlcGxheVN1YmplY3QoYnVmZmVyU2l6ZSwgd2luZG93VGltZTIsIHNjaGVkdWxlcik7CiAgICB9LCAiY29ubmVjdG9yIiksCiAgICByZXNldE9uRXJyb3I6IHRydWUsCiAgICByZXNldE9uQ29tcGxldGU6IGZhbHNlLAogICAgcmVzZXRPblJlZkNvdW50WmVybzogcmVmQ291bnQyCiAgfSk7Cn0KX19uYW1lKHNoYXJlUmVwbGF5LCAic2hhcmVSZXBsYXkiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvc3RhcnRXaXRoLmpzCmZ1bmN0aW9uIHN0YXJ0V2l0aCgpIHsKICB2YXIgdmFsdWVzID0gW107CiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKICAgIHZhbHVlc1tfaV0gPSBhcmd1bWVudHNbX2ldOwogIH0KICB2YXIgc2NoZWR1bGVyID0gcG9wU2NoZWR1bGVyKHZhbHVlcyk7CiAgcmV0dXJuIG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICAoc2NoZWR1bGVyID8gY29uY2F0KHZhbHVlcywgc291cmNlLCBzY2hlZHVsZXIpIDogY29uY2F0KHZhbHVlcywgc291cmNlKSkuc3Vic2NyaWJlKHN1YnNjcmliZXIpOwogIH0pOwp9Cl9fbmFtZShzdGFydFdpdGgsICJzdGFydFdpdGgiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvdGFrZVVudGlsLmpzCmZ1bmN0aW9uIHRha2VVbnRpbChub3RpZmllcikgewogIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgaW5uZXJGcm9tKG5vdGlmaWVyKS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgfSwgbm9vcCkpOwogICAgIXN1YnNjcmliZXIuY2xvc2VkICYmIHNvdXJjZS5zdWJzY3JpYmUoc3Vic2NyaWJlcik7CiAgfSk7Cn0KX19uYW1lKHRha2VVbnRpbCwgInRha2VVbnRpbCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy90aHJvdHRsZS5qcwpmdW5jdGlvbiB0aHJvdHRsZShkdXJhdGlvblNlbGVjdG9yLCBjb25maWcyKSB7CiAgcmV0dXJuIG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICB2YXIgX2EyID0gY29uZmlnMiAhPT0gbnVsbCAmJiBjb25maWcyICE9PSB2b2lkIDAgPyBjb25maWcyIDoge30sIF9iID0gX2EyLmxlYWRpbmcsIGxlYWRpbmcgPSBfYiA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9iLCBfYyA9IF9hMi50cmFpbGluZywgdHJhaWxpbmcgPSBfYyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfYzsKICAgIHZhciBoYXNWYWx1ZSA9IGZhbHNlOwogICAgdmFyIHNlbmRWYWx1ZSA9IG51bGw7CiAgICB2YXIgdGhyb3R0bGVkID0gbnVsbDsKICAgIHZhciBpc0NvbXBsZXRlID0gZmFsc2U7CiAgICB2YXIgZW5kVGhyb3R0bGluZyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oKSB7CiAgICAgIHRocm90dGxlZCA9PT0gbnVsbCB8fCB0aHJvdHRsZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRocm90dGxlZC51bnN1YnNjcmliZSgpOwogICAgICB0aHJvdHRsZWQgPSBudWxsOwogICAgICBpZiAodHJhaWxpbmcpIHsKICAgICAgICBzZW5kKCk7CiAgICAgICAgaXNDb21wbGV0ZSAmJiBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgIH0KICAgIH0sICJlbmRUaHJvdHRsaW5nIik7CiAgICB2YXIgY2xlYW51cFRocm90dGxpbmcgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCkgewogICAgICB0aHJvdHRsZWQgPSBudWxsOwogICAgICBpc0NvbXBsZXRlICYmIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgIH0sICJjbGVhbnVwVGhyb3R0bGluZyIpOwogICAgdmFyIHN0YXJ0VGhyb3R0bGUgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKHZhbHVlMikgewogICAgICByZXR1cm4gdGhyb3R0bGVkID0gaW5uZXJGcm9tKGR1cmF0aW9uU2VsZWN0b3IodmFsdWUyKSkuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBlbmRUaHJvdHRsaW5nLCBjbGVhbnVwVGhyb3R0bGluZykpOwogICAgfSwgInN0YXJ0VGhyb3R0bGUiKTsKICAgIHZhciBzZW5kID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHsKICAgICAgaWYgKGhhc1ZhbHVlKSB7CiAgICAgICAgaGFzVmFsdWUgPSBmYWxzZTsKICAgICAgICB2YXIgdmFsdWUyID0gc2VuZFZhbHVlOwogICAgICAgIHNlbmRWYWx1ZSA9IG51bGw7CiAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlMik7CiAgICAgICAgIWlzQ29tcGxldGUgJiYgc3RhcnRUaHJvdHRsZSh2YWx1ZTIpOwogICAgICB9CiAgICB9LCAic2VuZCIpOwogICAgc291cmNlLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUyKSB7CiAgICAgIGhhc1ZhbHVlID0gdHJ1ZTsKICAgICAgc2VuZFZhbHVlID0gdmFsdWUyOwogICAgICAhKHRocm90dGxlZCAmJiAhdGhyb3R0bGVkLmNsb3NlZCkgJiYgKGxlYWRpbmcgPyBzZW5kKCkgOiBzdGFydFRocm90dGxlKHZhbHVlMikpOwogICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgIGlzQ29tcGxldGUgPSB0cnVlOwogICAgICAhKHRyYWlsaW5nICYmIGhhc1ZhbHVlICYmIHRocm90dGxlZCAmJiAhdGhyb3R0bGVkLmNsb3NlZCkgJiYgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgfSkpOwogIH0pOwp9Cl9fbmFtZSh0aHJvdHRsZSwgInRocm90dGxlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3Rocm90dGxlVGltZS5qcwpmdW5jdGlvbiB0aHJvdHRsZVRpbWUoZHVyYXRpb24sIHNjaGVkdWxlciwgY29uZmlnMikgewogIGlmIChzY2hlZHVsZXIgPT09IHZvaWQgMCkgewogICAgc2NoZWR1bGVyID0gYXN5bmNTY2hlZHVsZXI7CiAgfQogIHZhciBkdXJhdGlvbiQgPSB0aW1lcihkdXJhdGlvbiwgc2NoZWR1bGVyKTsKICByZXR1cm4gdGhyb3R0bGUoZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZHVyYXRpb24kOwogIH0sIGNvbmZpZzIpOwp9Cl9fbmFtZSh0aHJvdHRsZVRpbWUsICJ0aHJvdHRsZVRpbWUiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHJ4QDMuMC4xMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRyeC9kaXN0X3RzL3NtYXJ0cngucGx1Z2lucy5yeGpzLmpzCnZhciBvcHMgPSB7CiAgYnVmZmVyLAogIGJ1ZmZlckNvdW50LAogIGJ1ZmZlclRpbWUsCiAgZGVib3VuY2UsCiAgZGVib3VuY2VUaW1lLAogIGZpbHRlciwKICBtYXA6IG1hcDIsCiAgc3RhcnRXaXRoLAogIHRha2VVbnRpbCwKICB0aHJvdHRsZVRpbWUKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHJ4QDMuMC4xMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRyeC9kaXN0X3RzL3NtYXJ0cnguY2xhc3Nlcy5vYnNlcnZhYmxlbWFwLmpzCnZhciBPYnNlcnZhYmxlbWFwID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIk9ic2VydmFibGVtYXAiKTsKICB9CiAgY29uc3RydWN0b3IoKSB7CiAgICB0aGlzLm9ic2VydmFibGVFdmVudEVtaXR0ZXJCdW5kbGVBcnJheSA9IG5ldyBBcnJheSgpOwogICAgdGhpcy5vYnNlcnZhYmxlRXZlbnRUYXJnZXRCdW5kbGVBcnJheSA9IG5ldyBBcnJheSgpOwogIH0KICAvKioKICAgKiBjcmVhdGVzIGEgaG90IHN1YmplY3QgaWYgbm90IHlldCByZWdpc3RlcmVkIGZvciB0aGUgZXZlbnQuCiAgICogSW4gY2FzZSBldmVudCBoYXMgYmVlbiByZWdpc3RlcmVkIGJlZm9yZSB0aGUgc2FtZSBvYnNlcnZhYmxlIGlzIHJldHVybmVkLgogICAqLwogIGdldFN1YmplY3RGb3JFbWl0dGVyRXZlbnQoZW1pdHRlckFyZywgZXZlbnRBcmcpIHsKICAgIGNvbnN0IGV4aXN0aW5nQnVuZGxlID0gdGhpcy5vYnNlcnZhYmxlRXZlbnRFbWl0dGVyQnVuZGxlQXJyYXkuZmluZCgoYnVuZGxlQXJnKSA9PiB7CiAgICAgIHJldHVybiBidW5kbGVBcmcuZXZlbnRSZWYgPT09IGVtaXR0ZXJBcmcgJiYgYnVuZGxlQXJnLmV2ZW50ID09PSBldmVudEFyZzsKICAgIH0pOwogICAgaWYgKGV4aXN0aW5nQnVuZGxlKSB7CiAgICAgIHJldHVybiBleGlzdGluZ0J1bmRsZS5zdWJqZWN0OwogICAgfSBlbHNlIHsKICAgICAgY29uc3QgZW1pdHRlck9ic2VydmFibGUgPSBmcm9tRXZlbnQoZW1pdHRlckFyZywgZXZlbnRBcmcpOwogICAgICBjb25zdCBlbWl0dGVyU3ViamVjdCA9IG5ldyBTdWJqZWN0KCk7CiAgICAgIGVtaXR0ZXJPYnNlcnZhYmxlLnN1YnNjcmliZShlbWl0dGVyU3ViamVjdCk7CiAgICAgIGNvbnN0IG5ld0J1bmRsZSA9IHsKICAgICAgICBzdWJqZWN0OiBlbWl0dGVyU3ViamVjdCwKICAgICAgICBldmVudFJlZjogZW1pdHRlckFyZywKICAgICAgICBldmVudDogZXZlbnRBcmcKICAgICAgfTsKICAgICAgdGhpcy5vYnNlcnZhYmxlRXZlbnRFbWl0dGVyQnVuZGxlQXJyYXkucHVzaChuZXdCdW5kbGUpOwogICAgICByZXR1cm4gbmV3QnVuZGxlLnN1YmplY3Q7CiAgICB9CiAgfQogIGdldFN1YmplY3RGb3JFdmVudFRhcmdldChldmVudFRhcmdldEFyZywgZXZlbnROYW1lQXJnKSB7CiAgICBjb25zdCBleGlzdGluZ0J1bmRsZSA9IHRoaXMub2JzZXJ2YWJsZUV2ZW50VGFyZ2V0QnVuZGxlQXJyYXkuZmluZCgoYnVuZGxlQXJnKSA9PiB7CiAgICAgIHJldHVybiBidW5kbGVBcmcuZXZlbnRSZWYgPT09IGV2ZW50VGFyZ2V0QXJnICYmIGJ1bmRsZUFyZy5ldmVudCA9PT0gZXZlbnROYW1lQXJnOwogICAgfSk7CiAgICBpZiAoZXhpc3RpbmdCdW5kbGUpIHsKICAgICAgcmV0dXJuIGV4aXN0aW5nQnVuZGxlLnN1YmplY3Q7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBlbWl0dGVyU3ViamVjdCA9IG5ldyBTdWJqZWN0KCk7CiAgICAgIGNvbnN0IG5ld0J1bmRsZSA9IHsKICAgICAgICBzdWJqZWN0OiBlbWl0dGVyU3ViamVjdCwKICAgICAgICBldmVudFJlZjogZXZlbnRUYXJnZXRBcmcsCiAgICAgICAgZXZlbnQ6IGV2ZW50TmFtZUFyZwogICAgICB9OwogICAgICB0aGlzLm9ic2VydmFibGVFdmVudFRhcmdldEJ1bmRsZUFycmF5LnB1c2gobmV3QnVuZGxlKTsKICAgICAgcmV0dXJuIG5ld0J1bmRsZS5zdWJqZWN0OwogICAgfQogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHJ4QDMuMC4xMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRyeC9kaXN0X3RzL3NtYXJ0cnguY2xhc3Nlcy5vYnNlcnZhYmxlaW50YWtlLmpzCnZhciBPYnNlcnZhYmxlSW50YWtlID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIk9ic2VydmFibGVJbnRha2UiKTsKICB9CiAgY29uc3RydWN0b3IoKSB7CiAgICB0aGlzLm9ic2VydmFibGVGdW5jdGlvbnMgPSB7CiAgICAgIG5leHQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHBheWxvYWRBcmcpID0+IHsKICAgICAgfSwgIm5leHQiKSwKICAgICAgY29tcGxldGU6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHBheWxvYWRBcmcpID0+IHsKICAgICAgfSwgImNvbXBsZXRlIikKICAgIH07CiAgICB0aGlzLmdlbmVyYXRvciA9IG51bGw7CiAgICB0aGlzLmJ1ZmZlcmVkID0gZmFsc2U7CiAgICB0aGlzLnBheWxvYWRCdWZmZXIgPSBbXTsKICAgIHRoaXMub2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlckFyZykgPT4gewogICAgICB0aGlzLm9ic2VydmFibGVGdW5jdGlvbnMubmV4dCA9ICguLi5hcmdzKSA9PiB7CiAgICAgICAgcmV0dXJuIG9ic2VydmVyQXJnLm5leHQoYXJncyk7CiAgICAgIH07CiAgICAgIHRoaXMub2JzZXJ2YWJsZUZ1bmN0aW9ucy5jb21wbGV0ZSA9ICgpID0+IHsKICAgICAgICB0aGlzLmNvbXBsZXRlZERlZmZlcmVkLnJlc29sdmUoKTsKICAgICAgICByZXR1cm4gb2JzZXJ2ZXJBcmcuY29tcGxldGUoKTsKICAgICAgfTsKICAgIH0pOwogICAgdGhpcy5jb21wbGV0ZWREZWZmZXJlZCA9IGRpc3RfdHNfZXhwb3J0cy5kZWZlcigpOwogICAgdGhpcy5jb21wbGV0ZWQgPSB0aGlzLmNvbXBsZXRlZERlZmZlcmVkLnByb21pc2U7CiAgfQogIHNldE9ic2VydmFibGUob2JzZXJ2YWJsZUZ1bmMpIHsKICAgIHRoaXMub2JzZXJ2YWJsZSA9IG9ic2VydmFibGVGdW5jOwogIH0KICBwdXNoKHBheWxvYWRBcmcpIHsKICAgIGlmICh0aGlzLmJ1ZmZlcmVkKSB7CiAgICAgIHRoaXMucGF5bG9hZEJ1ZmZlci5wdXNoKHBheWxvYWRBcmcpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5pbnRlcm5hbFB1c2gocGF5bG9hZEFyZyk7CiAgICB9CiAgfQogIC8qKgogICAqIHB1c2hlcyBtYW55IHBheWxvYWRzIGFzIGFycmF5CiAgICogQHBhcmFtIHBheWxvYWRBcmdBcnJheQogICAqLwogIHB1c2hNYW55KHBheWxvYWRBcmdBcnJheSkgewogICAgZm9yIChjb25zdCBpdGVtIG9mIHBheWxvYWRBcmdBcnJheSkgewogICAgICB0aGlzLnB1c2goaXRlbSk7CiAgICB9CiAgfQogIC8qKgogICAqIHNldHMgYSBnZW5lcmF0b3IgdG8gcXVlcnkgdGhlIG5leHQgcHVzaGVkIHZhbHVlCiAgICogQHBhcmFtIGdlbmVyYXRvckFyZwogICAqLwogIHNldEdlbmVyYXRvcihnZW5lcmF0b3JBcmcpIHsKICAgIHRoaXMuZ2VuZXJhdG9yID0gZ2VuZXJhdG9yQXJnOwogIH0KICBtYWtlQnVmZmVyZWQoKSB7CiAgICB0aGlzLmJ1ZmZlcmVkID0gdHJ1ZTsKICB9CiAgc3Vic2NyaWJlKC4uLmFyZ3MpIHsKICAgIHJldHVybiB0aGlzLm9ic2VydmFibGUuc3Vic2NyaWJlKC4uLmFyZ3MpOwogIH0KICAvKioKICAgKiByZXF1ZXN0IHRoZSBuZXh0IHZhbHVlcyBpbiB0aGUgcXVhbnRpdHkgc3BlY2lmaWVkCiAgICogQHBhcmFtIGhvd01hbnlBcmcgaWYgYSBnZW5lcmF0b3IgaXMgc2V0LCBvZiBhIGJ1ZmZlciBleGlzdHMsIHRoaXMgYWxsb3dzIHJldHJpZXZpbmcgdmFsdWVzCiAgICovCiAgcmVxdWVzdChob3dNYW55QXJnKSB7CiAgICBpZiAoaG93TWFueUFyZyA9PT0gMCkgewogICAgICByZXR1cm47CiAgICB9IGVsc2UgewogICAgICBmb3IgKGxldCBpMTAgPSAwOyBpMTAgIT09IGhvd01hbnlBcmc7IGkxMCsrKSB7CiAgICAgICAgaWYgKHRoaXMucGF5bG9hZEJ1ZmZlci5sZW5ndGggPiAwKSB7CiAgICAgICAgICB0aGlzLmludGVybmFsUHVzaCh0aGlzLnBheWxvYWRCdWZmZXIuc2hpZnQoKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IG5leHRQYXlsb2FkID0gdGhpcy5nZW5lcmF0b3IubmV4dCgpOwogICAgICAgICAgdGhpcy5pbnRlcm5hbFB1c2gobmV4dFBheWxvYWQudmFsdWUpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICAvKioKICAgKiBzaWduYWxzIHRoZSBjb21wbGV0aW9uIG9mIHRoaXMgb2JzZXJ2YWJsZQogICAqLwogIHNpZ25hbENvbXBsZXRlKCkgewogICAgdGhpcy5vYnNlcnZhYmxlRnVuY3Rpb25zLmNvbXBsZXRlKCk7CiAgfQogIGludGVybmFsUHVzaChwYXlsb2FkQXJnKSB7CiAgICB0aGlzLm9ic2VydmFibGVGdW5jdGlvbnMubmV4dChwYXlsb2FkQXJnKTsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRyeEAzLjAuMTAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0cngvZGlzdF90cy9zbWFydHJ4LmZ1bmN0aW9ucy5qcwpmdW5jdGlvbiBmcm9tU3RyZWFtV2l0aEJhY2twcmVzc3VyZShzdHJlYW0pIHsKICByZXR1cm4gbmV3IE9ic2VydmFibGUoKHN1YnNjcmliZXIpID0+IHsKICAgIGNvbnN0IHBhdXNlU3RyZWFtID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoKSA9PiBzdHJlYW0ucGF1c2UoKSwgInBhdXNlU3RyZWFtIik7CiAgICBjb25zdCByZXN1bWVTdHJlYW0gPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCgpID0+IHByb2Nlc3MubmV4dFRpY2soKCkgPT4gc3RyZWFtLnJlc3VtZSgpKSwgInJlc3VtZVN0cmVhbSIpOwogICAgY29uc3Qgb25EYXRhID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoZGF0YSkgPT4gewogICAgICBwYXVzZVN0cmVhbSgpOwogICAgICBzdWJzY3JpYmVyLm5leHQoZGF0YSk7CiAgICAgIHJlc3VtZVN0cmVhbSgpOwogICAgfSwgIm9uRGF0YSIpOwogICAgc3RyZWFtLm9uKCJkYXRhIiwgb25EYXRhKTsKICAgIHN0cmVhbS5vbigiZXJyb3IiLCAoZXJyb3IpID0+IHN1YnNjcmliZXIuZXJyb3IoZXJyb3IpKTsKICAgIHN0cmVhbS5vbigiZW5kIiwgKCkgPT4gc3Vic2NyaWJlci5jb21wbGV0ZSgpKTsKICAgIHN0cmVhbS5vbigiY2xvc2UiLCAoKSA9PiBzdWJzY3JpYmVyLmNvbXBsZXRlKCkpOwogICAgcmV0dXJuICgpID0+IHsKICAgICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCJkYXRhIiwgb25EYXRhKTsKICAgICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsIHN1YnNjcmliZXIuZXJyb3IpOwogICAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoImVuZCIsIHN1YnNjcmliZXIuY29tcGxldGUpOwogICAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoImNsb3NlIiwgc3Vic2NyaWJlci5jb21wbGV0ZSk7CiAgICB9OwogIH0pOwp9Cl9fbmFtZShmcm9tU3RyZWFtV2l0aEJhY2twcmVzc3VyZSwgImZyb21TdHJlYW1XaXRoQmFja3ByZXNzdXJlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGxpdCtyZWFjdGl2ZS1lbGVtZW50QDIuMS4yL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGVjb3JhdG9ycy9wcm9wZXJ0eS5qcwp2YXIgbzYgPSB7IGF0dHJpYnV0ZTogdHJ1ZSwgdHlwZTogU3RyaW5nLCBjb252ZXJ0ZXI6IHUsIHJlZmxlY3Q6IGZhbHNlLCBoYXNDaGFuZ2VkOiBmIH0sIHI0ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgodDggPSBvNiwgZTEwLCByMTApID0+IHsKICBjb25zdCB7IGtpbmQ6IG4xMSwgbWV0YWRhdGE6IGkxMCB9ID0gcjEwOwogIGxldCBzOSA9IGdsb2JhbFRoaXMubGl0UHJvcGVydHlNZXRhZGF0YS5nZXQoaTEwKTsKICBpZiAodm9pZCAwID09PSBzOSAmJiBnbG9iYWxUaGlzLmxpdFByb3BlcnR5TWV0YWRhdGEuc2V0KGkxMCwgczkgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpKSwgInNldHRlciIgPT09IG4xMSAmJiAoKHQ4ID0gT2JqZWN0LmNyZWF0ZSh0OCkpLndyYXBwZWQgPSB0cnVlKSwgczkuc2V0KHIxMC5uYW1lLCB0OCksICJhY2Nlc3NvciIgPT09IG4xMSkgewogICAgY29uc3QgeyBuYW1lOiBvMTIgfSA9IHIxMDsKICAgIHJldHVybiB7IHNldChyMTEpIHsKICAgICAgY29uc3QgbjEyID0gZTEwLmdldC5jYWxsKHRoaXMpOwogICAgICBlMTAuc2V0LmNhbGwodGhpcywgcjExKSwgdGhpcy5yZXF1ZXN0VXBkYXRlKG8xMiwgbjEyLCB0OCwgdHJ1ZSwgcjExKTsKICAgIH0sIGluaXQoZTExKSB7CiAgICAgIHJldHVybiB2b2lkIDAgIT09IGUxMSAmJiB0aGlzLkMobzEyLCB2b2lkIDAsIHQ4LCBlMTEpLCBlMTE7CiAgICB9IH07CiAgfQogIGlmICgic2V0dGVyIiA9PT0gbjExKSB7CiAgICBjb25zdCB7IG5hbWU6IG8xMiB9ID0gcjEwOwogICAgcmV0dXJuIGZ1bmN0aW9uKHIxMSkgewogICAgICBjb25zdCBuMTIgPSB0aGlzW28xMl07CiAgICAgIGUxMC5jYWxsKHRoaXMsIHIxMSksIHRoaXMucmVxdWVzdFVwZGF0ZShvMTIsIG4xMiwgdDgsIHRydWUsIHIxMSk7CiAgICB9OwogIH0KICB0aHJvdyBFcnJvcigiVW5zdXBwb3J0ZWQgZGVjb3JhdG9yIGxvY2F0aW9uOiAiICsgbjExKTsKfSwgInIiKTsKZnVuY3Rpb24gbjUodDgpIHsKICByZXR1cm4gKGUxMCwgbzEyKSA9PiAib2JqZWN0IiA9PSB0eXBlb2YgbzEyID8gcjQodDgsIGUxMCwgbzEyKSA6ICgodDksIGUxMSwgbzEzKSA9PiB7CiAgICBjb25zdCByMTAgPSBlMTEuaGFzT3duUHJvcGVydHkobzEzKTsKICAgIHJldHVybiBlMTEuY29uc3RydWN0b3IuY3JlYXRlUHJvcGVydHkobzEzLCB0OSksIHIxMCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZTExLCBvMTMpIDogdm9pZCAwOwogIH0pKHQ4LCBlMTAsIG8xMik7Cn0KX19uYW1lKG41LCAibiIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZG9tdG9vbHNAMi41LjEvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZG9tdG9vbHMvZGlzdF90cy9pbmRleC5qcwp2YXIgZGlzdF90c19leHBvcnRzMjcgPSB7fTsKX19leHBvcnQoZGlzdF90c19leHBvcnRzMjcsIHsKICBEb21Ub29sczogKCkgPT4gRG9tVG9vbHMsCiAgVHlwZWRSZXF1ZXN0OiAoKSA9PiBUeXBlZFJlcXVlc3QsCiAgYnJlYWtwb2ludHM6ICgpID0+IGRvbXRvb2xzX2Nzc19icmVha3BvaW50c19leHBvcnRzLAogIGNzczogKCkgPT4gZG9tdG9vbHNfY3NzX2V4cG9ydHMsCiAgZWxlbWVudEJhc2ljOiAoKSA9PiBkb210b29sc19lbGVtZW50YmFzaWNfZXhwb3J0cywKICBwbHVnaW5zOiAoKSA9PiBkb210b29sc19wbHVnaW5leHBvcnRzX2V4cG9ydHMKfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1kb210b29sc0AyLjUuMS9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1kb210b29scy9kaXN0X3RzL2RvbXRvb2xzLmVsZW1lbnRiYXNpYy5qcwp2YXIgZG9tdG9vbHNfZWxlbWVudGJhc2ljX2V4cG9ydHMgPSB7fTsKX19leHBvcnQoZG9tdG9vbHNfZWxlbWVudGJhc2ljX2V4cG9ydHMsIHsKICBzZXR1cDogKCkgPT4gc2V0dXAsCiAgc3RhdGljU3R5bGVzOiAoKSA9PiBzdGF0aWNTdHlsZXMsCiAgc3R5bGVzOiAoKSA9PiBzdHlsZXMKfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jb21tc0AxLjAuMzAvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY29tbXMvZGlzdF90cy9pbmRleC5qcwp2YXIgZGlzdF90c19leHBvcnRzMTYgPSB7fTsKX19leHBvcnQoZGlzdF90c19leHBvcnRzMTYsIHsKICBEZWVzQ29tbXM6ICgpID0+IERlZXNDb21tcwp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydGRlbGF5QDMuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGRlbGF5L2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czMgPSB7fTsKX19leHBvcnQoZGlzdF90c19leHBvcnRzMywgewogIFRpbWVvdXQ6ICgpID0+IFRpbWVvdXQsCiAgZGVsYXlGb3I6ICgpID0+IGRlbGF5Rm9yLAogIGRlbGF5Rm9yUmFuZG9tOiAoKSA9PiBkZWxheUZvclJhbmRvbQp9KTsKdmFyIGRlbGF5Rm9yID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShhc3luYyAodGltZUluTWlsbGlzZWNvbmRBcmcsIHBhc3NPbkFyZywgdW5yZWZlZEFyZyA9IGZhbHNlKSA9PiB7CiAgY29uc3QgdGltZW91dDIgPSBuZXcgVGltZW91dCh0aW1lSW5NaWxsaXNlY29uZEFyZywgbnVsbCwgdW5yZWZlZEFyZyk7CiAgYXdhaXQgdGltZW91dDIucHJvbWlzZTsKICByZXR1cm4gcGFzc09uQXJnOwp9LCAiZGVsYXlGb3IiKTsKdmFyIGRlbGF5Rm9yUmFuZG9tID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShhc3luYyAodGltZU1pbkluTWlsbGlzZWNvbmRBcmcsIHRpbWVNYXhJbk1pbGxpc2Vjb25kQXJnLCBwYXNzT25BcmcsIHVucmVmZWRBcmcgPSBmYWxzZSkgPT4gewogIGF3YWl0IGRlbGF5Rm9yKE1hdGgucmFuZG9tKCkgKiAodGltZU1heEluTWlsbGlzZWNvbmRBcmcgLSB0aW1lTWluSW5NaWxsaXNlY29uZEFyZykgKyB0aW1lTWluSW5NaWxsaXNlY29uZEFyZywgbnVsbCwgdW5yZWZlZEFyZyk7CiAgcmV0dXJuIHBhc3NPbkFyZzsKfSwgImRlbGF5Rm9yUmFuZG9tIik7CnZhciBUaW1lb3V0ID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlRpbWVvdXQiKTsKICB9CiAgY29uc3RydWN0b3IodGltZUluTWlsbGlzZWNvbmRBcmcsIHBhc3NPbiwgdW5yZWZlZEFyZyA9IGZhbHNlKSB7CiAgICB0aGlzLl9jYW5jZWxsZWQgPSBmYWxzZTsKICAgIHRoaXMudGltZW91dEluTWlsbGlzID0gdGltZUluTWlsbGlzZWNvbmRBcmc7CiAgICB0aGlzLl9kZWZlcnJlZCA9IGRlZmVyKCk7CiAgICB0aGlzLnByb21pc2UgPSB0aGlzLl9kZWZlcnJlZC5wcm9taXNlOwogICAgdGhpcy5fdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICBpZiAoIXRoaXMuX2NhbmNlbGxlZCkgewogICAgICAgIHRoaXMuX2RlZmVycmVkLnJlc29sdmUocGFzc09uKTsKICAgICAgfQogICAgfSwgdGltZUluTWlsbGlzZWNvbmRBcmcpOwogICAgdGhpcy5zdGFydGVkID0gRGF0ZS5ub3coKTsKICAgIGlmICh1bnJlZmVkQXJnKSB7CiAgICAgIHRoaXMubWFrZVVucmVmZWQoKTsKICAgIH0KICB9CiAgLyoqCiAgICogdW5yZWZmaW5nIGEgdGltZW91dCBjYXVzZXMgdGhlIG5vZGUgcHJvY2VzcyB0byBub3Qgd2FpdCBmb3IgY29tcGxldGlvbiBiZWZvcmUgZXhpdAogICAqLwogIG1ha2VVbnJlZmVkKCkgewogICAgdGhpcy5fdGltZW91dC51bnJlZigpOwogIH0KICAvKioKICAgKiBjYW5jZWxzIHRoZSB0aW1lcgogICAqLwogIGNhbmNlbCgpIHsKICAgIHRoaXMuX2NhbmNlbGxlZCA9IHRydWU7CiAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCk7CiAgfQogIGdldFRpbWVMZWZ0KCkgewogICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zdGFydGVkICsgdGhpcy50aW1lb3V0SW5NaWxsaXMgLSBEYXRlLm5vdygpOwogICAgcmV0dXJuIHJlc3VsdCA+IDAgPyByZXN1bHQgOiAwOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AYXBpLmdsb2JhbCt0eXBlZHJlcXVlc3QtaW50ZXJmYWNlc0AzLjAuMTkvbm9kZV9tb2R1bGVzL0BhcGkuZ2xvYmFsL3R5cGVkcmVxdWVzdC1pbnRlcmZhY2VzL2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czQgPSB7fTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AYXBpLmdsb2JhbCt0eXBlZHJlcXVlc3RAMy4zLjAvbm9kZV9tb2R1bGVzL0BhcGkuZ2xvYmFsL3R5cGVkcmVxdWVzdC9kaXN0X3RzL2luZGV4LmpzCnZhciBkaXN0X3RzX2V4cG9ydHMxNSA9IHt9OwpfX2V4cG9ydChkaXN0X3RzX2V4cG9ydHMxNSwgewogIFR5cGVkSGFuZGxlcjogKCkgPT4gVHlwZWRIYW5kbGVyLAogIFR5cGVkUmVxdWVzdDogKCkgPT4gVHlwZWRSZXF1ZXN0LAogIFR5cGVkUmVzcG9uc2VFcnJvcjogKCkgPT4gVHlwZWRSZXNwb25zZUVycm9yLAogIFR5cGVkUm91dGVyOiAoKSA9PiBUeXBlZFJvdXRlciwKICBUeXBlZFRhcmdldDogKCkgPT4gVHlwZWRUYXJnZXQsCiAgVmlydHVhbFN0cmVhbTogKCkgPT4gVmlydHVhbFN0cmVhbQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytsaWtANi40LjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2xpay9kaXN0X3RzL2luZGV4LmpzCnZhciBkaXN0X3RzX2V4cG9ydHM2ID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czYsIHsKICBBc3luY0V4ZWN1dGlvblN0YWNrOiAoKSA9PiBBc3luY0V4ZWN1dGlvblN0YWNrLAogIEJhY2twcmVzc3VyZWRBcnJheTogKCkgPT4gQmFja3ByZXNzdXJlZEFycmF5LAogIEZhc3RNYXA6ICgpID0+IEZhc3RNYXAsCiAgSW50ZXJlc3Q6ICgpID0+IEludGVyZXN0LAogIEludGVyZXN0TWFwOiAoKSA9PiBJbnRlcmVzdE1hcCwKICBMaW1pdGVkQXJyYXk6ICgpID0+IExpbWl0ZWRBcnJheSwKICBMb29wVHJhY2tlcjogKCkgPT4gTG9vcFRyYWNrZXIsCiAgT2JqZWN0TWFwOiAoKSA9PiBPYmplY3RNYXAsCiAgU3RyaW5nbWFwOiAoKSA9PiBTdHJpbmdtYXAsCiAgVGltZWRBZ2dyZWdhdG9yOiAoKSA9PiBUaW1lZEFnZ3JlZ3RvciwKICBUaW1lZEFnZ3JlZ3RvcjogKCkgPT4gVGltZWRBZ2dyZWd0b3IsCiAgVHJlZTogKCkgPT4gVHJlZSwKICB1bmk6ICgpID0+IHVuaQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydG1hdGNoQDIuMC4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydG1hdGNoL2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czUgPSB7fTsKX19leHBvcnQoZGlzdF90c19leHBvcnRzNSwgewogIFNtYXJ0TWF0Y2g6ICgpID0+IFNtYXJ0TWF0Y2gKfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWF0Y2hlckA1LjAuMC9ub2RlX21vZHVsZXMvbWF0Y2hlci9pbmRleC5qcwp2YXIgbWF0Y2hlcl9leHBvcnRzID0ge307Cl9fZXhwb3J0KG1hdGNoZXJfZXhwb3J0cywgewogIGlzTWF0Y2g6ICgpID0+IGlzTWF0Y2gsCiAgbWF0Y2hlcjogKCkgPT4gbWF0Y2hlcgp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9lc2NhcGUtc3RyaW5nLXJlZ2V4cEA1LjAuMC9ub2RlX21vZHVsZXMvZXNjYXBlLXN0cmluZy1yZWdleHAvaW5kZXguanMKZnVuY3Rpb24gZXNjYXBlU3RyaW5nUmVnZXhwKHN0cmluZzMpIHsKICBpZiAodHlwZW9mIHN0cmluZzMgIT09ICJzdHJpbmciKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJFeHBlY3RlZCBhIHN0cmluZyIpOwogIH0KICByZXR1cm4gc3RyaW5nMy5yZXBsYWNlKC9bfFxce30oKVtcXV4kKyo/Ll0vZywgIlxcJCYiKS5yZXBsYWNlKC8tL2csICJcXHgyZCIpOwp9Cl9fbmFtZShlc2NhcGVTdHJpbmdSZWdleHAsICJlc2NhcGVTdHJpbmdSZWdleHAiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tYXRjaGVyQDUuMC4wL25vZGVfbW9kdWxlcy9tYXRjaGVyL2luZGV4LmpzCnZhciByZWdleHBDYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CnZhciBzYW5pdGl6ZUFycmF5ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoaW5wdXQsIGlucHV0TmFtZSkgPT4gewogIGlmICghQXJyYXkuaXNBcnJheShpbnB1dCkpIHsKICAgIHN3aXRjaCAodHlwZW9mIGlucHV0KSB7CiAgICAgIGNhc2UgInN0cmluZyI6CiAgICAgICAgaW5wdXQgPSBbaW5wdXRdOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJ1bmRlZmluZWQiOgogICAgICAgIGlucHV0ID0gW107CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgJyR7aW5wdXROYW1lfScgdG8gYmUgYSBzdHJpbmcgb3IgYW4gYXJyYXksIGJ1dCBnb3QgYSB0eXBlIG9mICcke3R5cGVvZiBpbnB1dH0nYCk7CiAgICB9CiAgfQogIHJldHVybiBpbnB1dC5maWx0ZXIoKHN0cmluZzMpID0+IHsKICAgIGlmICh0eXBlb2Ygc3RyaW5nMyAhPT0gInN0cmluZyIpIHsKICAgICAgaWYgKHR5cGVvZiBzdHJpbmczID09PSAidW5kZWZpbmVkIikgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCAnJHtpbnB1dE5hbWV9JyB0byBiZSBhbiBhcnJheSBvZiBzdHJpbmdzLCBidXQgZm91bmQgYSB0eXBlIG9mICcke3R5cGVvZiBzdHJpbmczfScgaW4gdGhlIGFycmF5YCk7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9KTsKfSwgInNhbml0aXplQXJyYXkiKTsKdmFyIG1ha2VSZWdleHAgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChwYXR0ZXJuLCBvcHRpb25zKSA9PiB7CiAgb3B0aW9ucyA9IHsKICAgIGNhc2VTZW5zaXRpdmU6IGZhbHNlLAogICAgLi4ub3B0aW9ucwogIH07CiAgY29uc3QgY2FjaGVLZXkgPSBwYXR0ZXJuICsgSlNPTi5zdHJpbmdpZnkob3B0aW9ucyk7CiAgaWYgKHJlZ2V4cENhY2hlLmhhcyhjYWNoZUtleSkpIHsKICAgIHJldHVybiByZWdleHBDYWNoZS5nZXQoY2FjaGVLZXkpOwogIH0KICBjb25zdCBuZWdhdGVkID0gcGF0dGVyblswXSA9PT0gIiEiOwogIGlmIChuZWdhdGVkKSB7CiAgICBwYXR0ZXJuID0gcGF0dGVybi5zbGljZSgxKTsKICB9CiAgcGF0dGVybiA9IGVzY2FwZVN0cmluZ1JlZ2V4cChwYXR0ZXJuKS5yZXBsYWNlKC9cXFwqL2csICJbXFxzXFxTXSoiKTsKICBjb25zdCByZWdleHAgPSBuZXcgUmVnRXhwKGBeJHtwYXR0ZXJufSRgLCBvcHRpb25zLmNhc2VTZW5zaXRpdmUgPyAiIiA6ICJpIik7CiAgcmVnZXhwLm5lZ2F0ZWQgPSBuZWdhdGVkOwogIHJlZ2V4cENhY2hlLnNldChjYWNoZUtleSwgcmVnZXhwKTsKICByZXR1cm4gcmVnZXhwOwp9LCAibWFrZVJlZ2V4cCIpOwp2YXIgYmFzZU1hdGNoZXIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChpbnB1dHMsIHBhdHRlcm5zMiwgb3B0aW9ucywgZmlyc3RNYXRjaE9ubHkpID0+IHsKICBpbnB1dHMgPSBzYW5pdGl6ZUFycmF5KGlucHV0cywgImlucHV0cyIpOwogIHBhdHRlcm5zMiA9IHNhbml0aXplQXJyYXkocGF0dGVybnMyLCAicGF0dGVybnMiKTsKICBpZiAocGF0dGVybnMyLmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuIFtdOwogIH0KICBwYXR0ZXJuczIgPSBwYXR0ZXJuczIubWFwKChwYXR0ZXJuKSA9PiBtYWtlUmVnZXhwKHBhdHRlcm4sIG9wdGlvbnMpKTsKICBjb25zdCB7IGFsbFBhdHRlcm5zIH0gPSBvcHRpb25zIHx8IHt9OwogIGNvbnN0IHJlc3VsdCA9IFtdOwogIGZvciAoY29uc3QgaW5wdXQgb2YgaW5wdXRzKSB7CiAgICBsZXQgbWF0Y2hlczsKICAgIGNvbnN0IGRpZEZpdCA9IFsuLi5wYXR0ZXJuczJdLmZpbGwoZmFsc2UpOwogICAgZm9yIChjb25zdCBbaW5kZXgyLCBwYXR0ZXJuXSBvZiBwYXR0ZXJuczIuZW50cmllcygpKSB7CiAgICAgIGlmIChwYXR0ZXJuLnRlc3QoaW5wdXQpKSB7CiAgICAgICAgZGlkRml0W2luZGV4Ml0gPSB0cnVlOwogICAgICAgIG1hdGNoZXMgPSAhcGF0dGVybi5uZWdhdGVkOwogICAgICAgIGlmICghbWF0Y2hlcykgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoIShtYXRjaGVzID09PSBmYWxzZSB8fCBtYXRjaGVzID09PSB2b2lkIDAgJiYgcGF0dGVybnMyLnNvbWUoKHBhdHRlcm4pID0+ICFwYXR0ZXJuLm5lZ2F0ZWQpIHx8IGFsbFBhdHRlcm5zICYmIGRpZEZpdC5zb21lKCh5ZXMsIGluZGV4MikgPT4gIXllcyAmJiAhcGF0dGVybnMyW2luZGV4Ml0ubmVnYXRlZCkpKSB7CiAgICAgIHJlc3VsdC5wdXNoKGlucHV0KTsKICAgICAgaWYgKGZpcnN0TWF0Y2hPbmx5KSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIHJlc3VsdDsKfSwgImJhc2VNYXRjaGVyIik7CmZ1bmN0aW9uIG1hdGNoZXIoaW5wdXRzLCBwYXR0ZXJuczIsIG9wdGlvbnMpIHsKICByZXR1cm4gYmFzZU1hdGNoZXIoaW5wdXRzLCBwYXR0ZXJuczIsIG9wdGlvbnMsIGZhbHNlKTsKfQpfX25hbWUobWF0Y2hlciwgIm1hdGNoZXIiKTsKZnVuY3Rpb24gaXNNYXRjaChpbnB1dHMsIHBhdHRlcm5zMiwgb3B0aW9ucykgewogIHJldHVybiBiYXNlTWF0Y2hlcihpbnB1dHMsIHBhdHRlcm5zMiwgb3B0aW9ucywgdHJ1ZSkubGVuZ3RoID4gMDsKfQpfX25hbWUoaXNNYXRjaCwgImlzTWF0Y2giKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydG1hdGNoQDIuMC4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydG1hdGNoL2Rpc3RfdHMvaW5kZXguanMKdmFyIFNtYXJ0TWF0Y2ggPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiU21hcnRNYXRjaCIpOwogIH0KICBjb25zdHJ1Y3Rvcih3aWxkY2FyZEFyZykgewogICAgdGhpcy53aWxkY2FyZCA9IHdpbGRjYXJkQXJnOwogIH0KICBtYXRjaChtYXRjaFN0cmluZ0FyZykgewogICAgcmV0dXJuIG1hdGNoZXJfZXhwb3J0cy5pc01hdGNoKG1hdGNoU3RyaW5nQXJnLCB0aGlzLndpbGRjYXJkKTsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR0aW1lQDQuMi4zL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHRpbWUvZGlzdF90cy9pbmRleC5qcwp2YXIgZGlzdF90c19leHBvcnRzNyA9IHt9OwpfX2V4cG9ydChkaXN0X3RzX2V4cG9ydHM3LCB7CiAgQ3JvbkpvYjogKCkgPT4gQ3JvbkpvYiwKICBDcm9uTWFuYWdlcjogKCkgPT4gQ3Jvbk1hbmFnZXIsCiAgRXh0ZW5kZWREYXRlOiAoKSA9PiBFeHRlbmRlZERhdGUsCiAgSHJ0TWVhc3VyZW1lbnQ6ICgpID0+IEhydE1lYXN1cmVtZW50LAogIEludGVydmFsOiAoKSA9PiBJbnRlcnZhbCwKICBUaW1lU3RhbXA6ICgpID0+IFRpbWVTdGFtcCwKICBUaW1lcjogKCkgPT4gVGltZXIsCiAgZ2V0TWlsbGlTZWNvbmRzQXNIdW1hblJlYWRhYmxlQWdvVGltZTogKCkgPT4gZ2V0TWlsbGlTZWNvbmRzQXNIdW1hblJlYWRhYmxlQWdvVGltZSwKICBnZXRNaWxsaVNlY29uZHNBc0h1bWFuUmVhZGFibGVTdHJpbmc6ICgpID0+IGdldE1pbGxpU2Vjb25kc0FzSHVtYW5SZWFkYWJsZVN0cmluZywKICBnZXRNaWxsaVNlY29uZHNGcm9tVW5pdHM6ICgpID0+IGdldE1pbGxpU2Vjb25kc0Zyb21Vbml0cywKICB1bml0czogKCkgPT4gdW5pdHMKfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vY3JvbmVyQDEwLjAuMS9ub2RlX21vZHVsZXMvY3JvbmVyL2Rpc3QvY3JvbmVyLmpzCnZhciBjcm9uZXJfZXhwb3J0cyA9IHt9OwpfX2V4cG9ydChjcm9uZXJfZXhwb3J0cywgewogIENyb246ICgpID0+IEUyLAogIENyb25EYXRlOiAoKSA9PiBtMiwKICBDcm9uUGF0dGVybjogKCkgPT4gQzIsCiAgc2NoZWR1bGVkSm9iczogKCkgPT4gdzIKfSk7CmZ1bmN0aW9uIFQyKHM5KSB7CiAgcmV0dXJuIERhdGUuVVRDKHM5LnksIHM5Lm0gLSAxLCBzOS5kLCBzOS5oLCBzOS5pLCBzOS5zKTsKfQpfX25hbWUoVDIsICJUIik7CmZ1bmN0aW9uIEQyKHM5LCBlMTApIHsKICByZXR1cm4gczkueSA9PT0gZTEwLnkgJiYgczkubSA9PT0gZTEwLm0gJiYgczkuZCA9PT0gZTEwLmQgJiYgczkuaCA9PT0gZTEwLmggJiYgczkuaSA9PT0gZTEwLmkgJiYgczkucyA9PT0gZTEwLnM7Cn0KX19uYW1lKEQyLCAiRCIpOwpmdW5jdGlvbiBBMihzOSwgZTEwKSB7CiAgbGV0IHQ4ID0gbmV3IERhdGUoRGF0ZS5wYXJzZShzOSkpOwogIGlmIChpc05hTih0OCkpIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBJU084NjAxIHBhc3NlZCB0byB0aW1lem9uZSBwYXJzZXIuIik7CiAgbGV0IHIxMCA9IHM5LnN1YnN0cmluZyg5KTsKICByZXR1cm4gcjEwLmluY2x1ZGVzKCJaIikgfHwgcjEwLmluY2x1ZGVzKCIrIikgfHwgcjEwLmluY2x1ZGVzKCItIikgPyBiMyh0OC5nZXRVVENGdWxsWWVhcigpLCB0OC5nZXRVVENNb250aCgpICsgMSwgdDguZ2V0VVRDRGF0ZSgpLCB0OC5nZXRVVENIb3VycygpLCB0OC5nZXRVVENNaW51dGVzKCksIHQ4LmdldFVUQ1NlY29uZHMoKSwgIkV0Yy9VVEMiKSA6IGIzKHQ4LmdldEZ1bGxZZWFyKCksIHQ4LmdldE1vbnRoKCkgKyAxLCB0OC5nZXREYXRlKCksIHQ4LmdldEhvdXJzKCksIHQ4LmdldE1pbnV0ZXMoKSwgdDguZ2V0U2Vjb25kcygpLCBlMTApOwp9Cl9fbmFtZShBMiwgIkEiKTsKZnVuY3Rpb24gdjIoczksIGUxMCwgdDgpIHsKICByZXR1cm4gazIoQTIoczksIGUxMCksIHQ4KTsKfQpfX25hbWUodjIsICJ2Iik7CmZ1bmN0aW9uIGsyKHM5LCBlMTApIHsKICBsZXQgdDggPSBuZXcgRGF0ZShUMihzOSkpLCByMTAgPSBnMih0OCwgczkudHopLCBuMTEgPSBUMihzOSksIGkxMCA9IFQyKHIxMCksIGE0ID0gbjExIC0gaTEwLCBvMTIgPSBuZXcgRGF0ZSh0OC5nZXRUaW1lKCkgKyBhNCksIGg3ID0gZzIobzEyLCBzOS50eik7CiAgaWYgKEQyKGg3LCBzOSkpIHsKICAgIGxldCB1NiA9IG5ldyBEYXRlKG8xMi5nZXRUaW1lKCkgLSAzNmU1KSwgZDQgPSBnMih1NiwgczkudHopOwogICAgcmV0dXJuIEQyKGQ0LCBzOSkgPyB1NiA6IG8xMjsKICB9CiAgbGV0IGw1ID0gbmV3IERhdGUobzEyLmdldFRpbWUoKSArIFQyKHM5KSAtIFQyKGg3KSksIHkzID0gZzIobDUsIHM5LnR6KTsKICBpZiAoRDIoeTMsIHM5KSkgcmV0dXJuIGw1OwogIGlmIChlMTApIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBkYXRlIHBhc3NlZCB0byBmcm9tVFooKSIpOwogIHJldHVybiBvMTIuZ2V0VGltZSgpID4gbDUuZ2V0VGltZSgpID8gbzEyIDogbDU7Cn0KX19uYW1lKGsyLCAiayIpOwpmdW5jdGlvbiBnMihzOSwgZTEwKSB7CiAgbGV0IHQ4LCByMTA7CiAgdHJ5IHsKICAgIHQ4ID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoImVuLVVTIiwgeyB0aW1lWm9uZTogZTEwLCB5ZWFyOiAibnVtZXJpYyIsIG1vbnRoOiAibnVtZXJpYyIsIGRheTogIm51bWVyaWMiLCBob3VyOiAibnVtZXJpYyIsIG1pbnV0ZTogIm51bWVyaWMiLCBzZWNvbmQ6ICJudW1lcmljIiwgaG91cjEyOiBmYWxzZSB9KSwgcjEwID0gdDguZm9ybWF0VG9QYXJ0cyhzOSk7CiAgfSBjYXRjaCAoaTEwKSB7CiAgICBsZXQgYTQgPSBpMTAgaW5zdGFuY2VvZiBFcnJvciA/IGkxMC5tZXNzYWdlIDogU3RyaW5nKGkxMCk7CiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgdG9UWjogSW52YWxpZCB0aW1lem9uZSAnJHtlMTB9JyBvciBkYXRlLiBQbGVhc2UgcHJvdmlkZSBhIHZhbGlkIElBTkEgdGltZXpvbmUgKGUuZy4sICdBbWVyaWNhL05ld19Zb3JrJywgJ0V1cm9wZS9TdG9ja2hvbG0nKS4gT3JpZ2luYWwgZXJyb3I6ICR7YTR9YCk7CiAgfQogIGxldCBuMTEgPSB7IHllYXI6IDAsIG1vbnRoOiAwLCBkYXk6IDAsIGhvdXI6IDAsIG1pbnV0ZTogMCwgc2Vjb25kOiAwIH07CiAgZm9yIChsZXQgaTEwIG9mIHIxMCkgKGkxMC50eXBlID09PSAieWVhciIgfHwgaTEwLnR5cGUgPT09ICJtb250aCIgfHwgaTEwLnR5cGUgPT09ICJkYXkiIHx8IGkxMC50eXBlID09PSAiaG91ciIgfHwgaTEwLnR5cGUgPT09ICJtaW51dGUiIHx8IGkxMC50eXBlID09PSAic2Vjb25kIikgJiYgKG4xMVtpMTAudHlwZV0gPSBwYXJzZUludChpMTAudmFsdWUsIDEwKSk7CiAgaWYgKGlzTmFOKG4xMS55ZWFyKSB8fCBpc05hTihuMTEubW9udGgpIHx8IGlzTmFOKG4xMS5kYXkpIHx8IGlzTmFOKG4xMS5ob3VyKSB8fCBpc05hTihuMTEubWludXRlKSB8fCBpc05hTihuMTEuc2Vjb25kKSkgdGhyb3cgbmV3IEVycm9yKGB0b1RaOiBGYWlsZWQgdG8gcGFyc2UgYWxsIGRhdGUgY29tcG9uZW50cyBmcm9tIHRpbWV6b25lICcke2UxMH0nLiBUaGlzIG1heSBpbmRpY2F0ZSBhbiBpbnZhbGlkIGRhdGUgb3IgdGltZXpvbmUgY29uZmlndXJhdGlvbi4gUGFyc2VkIGNvbXBvbmVudHM6ICR7SlNPTi5zdHJpbmdpZnkobjExKX1gKTsKICByZXR1cm4gbjExLmhvdXIgPT09IDI0ICYmIChuMTEuaG91ciA9IDApLCB7IHk6IG4xMS55ZWFyLCBtOiBuMTEubW9udGgsIGQ6IG4xMS5kYXksIGg6IG4xMS5ob3VyLCBpOiBuMTEubWludXRlLCBzOiBuMTEuc2Vjb25kLCB0ejogZTEwIH07Cn0KX19uYW1lKGcyLCAiZyIpOwpmdW5jdGlvbiBiMyhzOSwgZTEwLCB0OCwgcjEwLCBuMTEsIGkxMCwgYTQpIHsKICByZXR1cm4geyB5OiBzOSwgbTogZTEwLCBkOiB0OCwgaDogcjEwLCBpOiBuMTEsIHM6IGkxMCwgdHo6IGE0IH07Cn0KX19uYW1lKGIzLCAiYiIpOwp2YXIgTyA9IFsxLCAyLCA0LCA4LCAxNl0sIEMyID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkMiKTsKICB9CiAgcGF0dGVybjsKICB0aW1lem9uZTsKICBtb2RlOwogIGFsdGVybmF0aXZlV2Vla2RheXM7CiAgc2xvcHB5UmFuZ2VzOwogIHNlY29uZDsKICBtaW51dGU7CiAgaG91cjsKICBkYXk7CiAgbW9udGg7CiAgZGF5T2ZXZWVrOwogIHllYXI7CiAgbGFzdERheU9mTW9udGg7CiAgbGFzdFdlZWtkYXk7CiAgbmVhcmVzdFdlZWtkYXlzOwogIHN0YXJET007CiAgc3RhckRPVzsKICBzdGFyWWVhcjsKICB1c2VBbmRMb2dpYzsKICBjb25zdHJ1Y3RvcihlMTAsIHQ4LCByMTApIHsKICAgIHRoaXMucGF0dGVybiA9IGUxMCwgdGhpcy50aW1lem9uZSA9IHQ4LCB0aGlzLm1vZGUgPSByMTA/Lm1vZGUgPz8gImF1dG8iLCB0aGlzLmFsdGVybmF0aXZlV2Vla2RheXMgPSByMTA/LmFsdGVybmF0aXZlV2Vla2RheXMgPz8gZmFsc2UsIHRoaXMuc2xvcHB5UmFuZ2VzID0gcjEwPy5zbG9wcHlSYW5nZXMgPz8gZmFsc2UsIHRoaXMuc2Vjb25kID0gQXJyYXkoNjApLmZpbGwoMCksIHRoaXMubWludXRlID0gQXJyYXkoNjApLmZpbGwoMCksIHRoaXMuaG91ciA9IEFycmF5KDI0KS5maWxsKDApLCB0aGlzLmRheSA9IEFycmF5KDMxKS5maWxsKDApLCB0aGlzLm1vbnRoID0gQXJyYXkoMTIpLmZpbGwoMCksIHRoaXMuZGF5T2ZXZWVrID0gQXJyYXkoNykuZmlsbCgwKSwgdGhpcy55ZWFyID0gQXJyYXkoMWU0KS5maWxsKDApLCB0aGlzLmxhc3REYXlPZk1vbnRoID0gZmFsc2UsIHRoaXMubGFzdFdlZWtkYXkgPSBmYWxzZSwgdGhpcy5uZWFyZXN0V2Vla2RheXMgPSBBcnJheSgzMSkuZmlsbCgwKSwgdGhpcy5zdGFyRE9NID0gZmFsc2UsIHRoaXMuc3RhckRPVyA9IGZhbHNlLCB0aGlzLnN0YXJZZWFyID0gZmFsc2UsIHRoaXMudXNlQW5kTG9naWMgPSBmYWxzZSwgdGhpcy5wYXJzZSgpOwogIH0KICBwYXJzZSgpIHsKICAgIGlmICghKHR5cGVvZiB0aGlzLnBhdHRlcm4gPT0gInN0cmluZyIgfHwgdGhpcy5wYXR0ZXJuIGluc3RhbmNlb2YgU3RyaW5nKSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3JvblBhdHRlcm46IFBhdHRlcm4gaGFzIHRvIGJlIG9mIHR5cGUgc3RyaW5nLiIpOwogICAgdGhpcy5wYXR0ZXJuLmluZGV4T2YoIkAiKSA+PSAwICYmICh0aGlzLnBhdHRlcm4gPSB0aGlzLmhhbmRsZU5pY2tuYW1lcyh0aGlzLnBhdHRlcm4pLnRyaW0oKSk7CiAgICBsZXQgZTEwID0gdGhpcy5wYXR0ZXJuLm1hdGNoKC9cUysvZykgfHwgWyIiXSwgdDggPSBlMTAubGVuZ3RoOwogICAgaWYgKGUxMC5sZW5ndGggPCA1IHx8IGUxMC5sZW5ndGggPiA3KSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDcm9uUGF0dGVybjogaW52YWxpZCBjb25maWd1cmF0aW9uIGZvcm1hdCAoJyIgKyB0aGlzLnBhdHRlcm4gKyAiJyksIGV4YWN0bHkgZml2ZSwgc2l4LCBvciBzZXZlbiBzcGFjZSBzZXBhcmF0ZWQgcGFydHMgYXJlIHJlcXVpcmVkLiIpOwogICAgaWYgKHRoaXMubW9kZSAhPT0gImF1dG8iKSB7CiAgICAgIGxldCBuMTE7CiAgICAgIHN3aXRjaCAodGhpcy5tb2RlKSB7CiAgICAgICAgY2FzZSAiNS1wYXJ0IjoKICAgICAgICAgIG4xMSA9IDU7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICI2LXBhcnQiOgogICAgICAgICAgbjExID0gNjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIjctcGFydCI6CiAgICAgICAgICBuMTEgPSA3OwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiNS1vci02LXBhcnRzIjoKICAgICAgICAgIG4xMSA9IFs1LCA2XTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIjYtb3ItNy1wYXJ0cyI6CiAgICAgICAgICBuMTEgPSBbNiwgN107CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgbjExID0gMDsKICAgICAgfQogICAgICBpZiAoIShBcnJheS5pc0FycmF5KG4xMSkgPyBuMTEuaW5jbHVkZXModDgpIDogdDggPT09IG4xMSkpIHsKICAgICAgICBsZXQgYTQgPSBBcnJheS5pc0FycmF5KG4xMSkgPyBuMTEuam9pbigiIG9yICIpIDogbjExLnRvU3RyaW5nKCk7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgQ3JvblBhdHRlcm46IG1vZGUgJyR7dGhpcy5tb2RlfScgcmVxdWlyZXMgZXhhY3RseSAke2E0fSBwYXJ0cywgYnV0IHBhdHRlcm4gJyR7dGhpcy5wYXR0ZXJufScgaGFzICR7dDh9IHBhcnRzLmApOwogICAgICB9CiAgICB9CiAgICBpZiAoZTEwLmxlbmd0aCA9PT0gNSAmJiBlMTAudW5zaGlmdCgiMCIpLCBlMTAubGVuZ3RoID09PSA2ICYmIGUxMC5wdXNoKCIqIiksIGUxMFszXS50b1VwcGVyQ2FzZSgpID09PSAiTFciID8gKHRoaXMubGFzdFdlZWtkYXkgPSB0cnVlLCBlMTBbM10gPSAiIikgOiBlMTBbM10udG9VcHBlckNhc2UoKS5pbmRleE9mKCJMIikgPj0gMCAmJiAoZTEwWzNdID0gZTEwWzNdLnJlcGxhY2UoL0wvZ2ksICIiKSwgdGhpcy5sYXN0RGF5T2ZNb250aCA9IHRydWUpLCBlMTBbM10gPT0gIioiICYmICh0aGlzLnN0YXJET00gPSB0cnVlKSwgZTEwWzZdID09ICIqIiAmJiAodGhpcy5zdGFyWWVhciA9IHRydWUpLCBlMTBbNF0ubGVuZ3RoID49IDMgJiYgKGUxMFs0XSA9IHRoaXMucmVwbGFjZUFscGhhTW9udGhzKGUxMFs0XSkpLCBlMTBbNV0ubGVuZ3RoID49IDMgJiYgKGUxMFs1XSA9IHRoaXMuYWx0ZXJuYXRpdmVXZWVrZGF5cyA/IHRoaXMucmVwbGFjZUFscGhhRGF5c1F1YXJ0eihlMTBbNV0pIDogdGhpcy5yZXBsYWNlQWxwaGFEYXlzKGUxMFs1XSkpLCBlMTBbNV0uc3RhcnRzV2l0aCgiKyIpICYmICh0aGlzLnVzZUFuZExvZ2ljID0gdHJ1ZSwgZTEwWzVdID0gZTEwWzVdLnN1YnN0cmluZygxKSwgZTEwWzVdID09PSAiIikpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNyb25QYXR0ZXJuOiBEYXktb2Ytd2VlayBmaWVsZCBjYW5ub3QgYmUgZW1wdHkgYWZ0ZXIgJysnIG1vZGlmaWVyLiIpOwogICAgc3dpdGNoIChlMTBbNV0gPT0gIioiICYmICh0aGlzLnN0YXJET1cgPSB0cnVlKSwgdGhpcy5wYXR0ZXJuLmluZGV4T2YoIj8iKSA+PSAwICYmIChlMTBbMF0gPSBlMTBbMF0ucmVwbGFjZSgvXD8vZywgIioiKSwgZTEwWzFdID0gZTEwWzFdLnJlcGxhY2UoL1w/L2csICIqIiksIGUxMFsyXSA9IGUxMFsyXS5yZXBsYWNlKC9cPy9nLCAiKiIpLCBlMTBbM10gPSBlMTBbM10ucmVwbGFjZSgvXD8vZywgIioiKSwgZTEwWzRdID0gZTEwWzRdLnJlcGxhY2UoL1w/L2csICIqIiksIGUxMFs1XSA9IGUxMFs1XS5yZXBsYWNlKC9cPy9nLCAiKiIpLCBlMTBbNl0gJiYgKGUxMFs2XSA9IGUxMFs2XS5yZXBsYWNlKC9cPy9nLCAiKiIpKSksIHRoaXMubW9kZSkgewogICAgICBjYXNlICI1LXBhcnQiOgogICAgICAgIGUxMFswXSA9ICIwIiwgZTEwWzZdID0gIioiOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICI2LXBhcnQiOgogICAgICAgIGUxMFs2XSA9ICIqIjsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiNS1vci02LXBhcnRzIjoKICAgICAgICBlMTBbNl0gPSAiKiI7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIjYtb3ItNy1wYXJ0cyI6CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIjctcGFydCI6CiAgICAgIGNhc2UgImF1dG8iOgogICAgICAgIGJyZWFrOwogICAgfQogICAgdGhpcy50aHJvd0F0SWxsZWdhbENoYXJhY3RlcnMoZTEwKSwgdGhpcy5wYXJ0VG9BcnJheSgic2Vjb25kIiwgZTEwWzBdLCAwLCAxKSwgdGhpcy5wYXJ0VG9BcnJheSgibWludXRlIiwgZTEwWzFdLCAwLCAxKSwgdGhpcy5wYXJ0VG9BcnJheSgiaG91ciIsIGUxMFsyXSwgMCwgMSksIHRoaXMucGFydFRvQXJyYXkoImRheSIsIGUxMFszXSwgLTEsIDEpLCB0aGlzLnBhcnRUb0FycmF5KCJtb250aCIsIGUxMFs0XSwgLTEsIDEpOwogICAgbGV0IHIxMCA9IHRoaXMuYWx0ZXJuYXRpdmVXZWVrZGF5cyA/IC0xIDogMDsKICAgIHRoaXMucGFydFRvQXJyYXkoImRheU9mV2VlayIsIGUxMFs1XSwgcjEwLCA2MyksIHRoaXMucGFydFRvQXJyYXkoInllYXIiLCBlMTBbNl0sIDAsIDEpLCAhdGhpcy5hbHRlcm5hdGl2ZVdlZWtkYXlzICYmIHRoaXMuZGF5T2ZXZWVrWzddICYmICh0aGlzLmRheU9mV2Vla1swXSA9IHRoaXMuZGF5T2ZXZWVrWzddKTsKICB9CiAgcGFydFRvQXJyYXkoZTEwLCB0OCwgcjEwLCBuMTEpIHsKICAgIGxldCBpMTAgPSB0aGlzW2UxMF0sIGE0ID0gZTEwID09PSAiZGF5IiAmJiB0aGlzLmxhc3REYXlPZk1vbnRoLCBvMTIgPSBlMTAgPT09ICJkYXkiICYmIHRoaXMubGFzdFdlZWtkYXk7CiAgICBpZiAodDggPT09ICIiICYmICFhNCAmJiAhbzEyKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDcm9uUGF0dGVybjogY29uZmlndXJhdGlvbiBlbnRyeSAiICsgZTEwICsgIiAoIiArIHQ4ICsgIikgaXMgZW1wdHksIGNoZWNrIGZvciB0cmFpbGluZyBzcGFjZXMuIik7CiAgICBpZiAodDggPT09ICIqIikgcmV0dXJuIGkxMC5maWxsKG4xMSk7CiAgICBsZXQgaDcgPSB0OC5zcGxpdCgiLCIpOwogICAgaWYgKGg3Lmxlbmd0aCA+IDEpIGZvciAobGV0IGw1ID0gMDsgbDUgPCBoNy5sZW5ndGg7IGw1KyspIHRoaXMucGFydFRvQXJyYXkoZTEwLCBoN1tsNV0sIHIxMCwgbjExKTsKICAgIGVsc2UgdDguaW5kZXhPZigiLSIpICE9PSAtMSAmJiB0OC5pbmRleE9mKCIvIikgIT09IC0xID8gdGhpcy5oYW5kbGVSYW5nZVdpdGhTdGVwcGluZyh0OCwgZTEwLCByMTAsIG4xMSkgOiB0OC5pbmRleE9mKCItIikgIT09IC0xID8gdGhpcy5oYW5kbGVSYW5nZSh0OCwgZTEwLCByMTAsIG4xMSkgOiB0OC5pbmRleE9mKCIvIikgIT09IC0xID8gdGhpcy5oYW5kbGVTdGVwcGluZyh0OCwgZTEwLCByMTAsIG4xMSkgOiB0OCAhPT0gIiIgJiYgdGhpcy5oYW5kbGVOdW1iZXIodDgsIGUxMCwgcjEwLCBuMTEpOwogIH0KICB0aHJvd0F0SWxsZWdhbENoYXJhY3RlcnMoZTEwKSB7CiAgICBmb3IgKGxldCB0OCA9IDA7IHQ4IDwgZTEwLmxlbmd0aDsgdDgrKykgaWYgKCh0OCA9PT0gMyA/IC9bXi8qMC05LFwtV3dMbF0rLyA6IHQ4ID09PSA1ID8gL1teLyowLTksXC0jTGxdKy8gOiAvW14vKjAtOSxcLV0rLykudGVzdChlMTBbdDhdKSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3JvblBhdHRlcm46IGNvbmZpZ3VyYXRpb24gZW50cnkgIiArIHQ4ICsgIiAoIiArIGUxMFt0OF0gKyAiKSBjb250YWlucyBpbGxlZ2FsIGNoYXJhY3RlcnMuIik7CiAgfQogIGhhbmRsZU51bWJlcihlMTAsIHQ4LCByMTAsIG4xMSkgewogICAgbGV0IGkxMCA9IHRoaXMuZXh0cmFjdE50aChlMTAsIHQ4KSwgYTQgPSBlMTAudG9VcHBlckNhc2UoKS5pbmNsdWRlcygiVyIpOwogICAgaWYgKHQ4ICE9PSAiZGF5IiAmJiBhNCkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3JvblBhdHRlcm46IE5lYXJlc3Qgd2Vla2RheSBtb2RpZmllciAoVykgb25seSBhbGxvd2VkIGluIGRheS1vZi1tb250aC4iKTsKICAgIGE0ICYmICh0OCA9ICJuZWFyZXN0V2Vla2RheXMiKTsKICAgIGxldCBvMTIgPSBwYXJzZUludChpMTBbMF0sIDEwKSArIHIxMDsKICAgIGlmIChpc05hTihvMTIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDcm9uUGF0dGVybjogIiArIHQ4ICsgIiBpcyBub3QgYSBudW1iZXI6ICciICsgZTEwICsgIiciKTsKICAgIHRoaXMuc2V0UGFydCh0OCwgbzEyLCBpMTBbMV0gfHwgbjExKTsKICB9CiAgc2V0UGFydChlMTAsIHQ4LCByMTApIHsKICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMsIGUxMCkpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNyb25QYXR0ZXJuOiBJbnZhbGlkIHBhcnQgc3BlY2lmaWVkOiAiICsgZTEwKTsKICAgIGlmIChlMTAgPT09ICJkYXlPZldlZWsiKSB7CiAgICAgIGlmICh0OCA9PT0gNyAmJiAodDggPSAwKSwgdDggPCAwIHx8IHQ4ID4gNikgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkNyb25QYXR0ZXJuOiBJbnZhbGlkIHZhbHVlIGZvciBkYXlPZldlZWs6ICIgKyB0OCk7CiAgICAgIHRoaXMuc2V0TnRoV2Vla2RheU9mTW9udGgodDgsIHIxMCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChlMTAgPT09ICJzZWNvbmQiIHx8IGUxMCA9PT0gIm1pbnV0ZSIpIHsKICAgICAgaWYgKHQ4IDwgMCB8fCB0OCA+PSA2MCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkNyb25QYXR0ZXJuOiBJbnZhbGlkIHZhbHVlIGZvciAiICsgZTEwICsgIjogIiArIHQ4KTsKICAgIH0gZWxzZSBpZiAoZTEwID09PSAiaG91ciIpIHsKICAgICAgaWYgKHQ4IDwgMCB8fCB0OCA+PSAyNCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkNyb25QYXR0ZXJuOiBJbnZhbGlkIHZhbHVlIGZvciAiICsgZTEwICsgIjogIiArIHQ4KTsKICAgIH0gZWxzZSBpZiAoZTEwID09PSAiZGF5IiB8fCBlMTAgPT09ICJuZWFyZXN0V2Vla2RheXMiKSB7CiAgICAgIGlmICh0OCA8IDAgfHwgdDggPj0gMzEpIHRocm93IG5ldyBSYW5nZUVycm9yKCJDcm9uUGF0dGVybjogSW52YWxpZCB2YWx1ZSBmb3IgIiArIGUxMCArICI6ICIgKyB0OCk7CiAgICB9IGVsc2UgaWYgKGUxMCA9PT0gIm1vbnRoIikgewogICAgICBpZiAodDggPCAwIHx8IHQ4ID49IDEyKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQ3JvblBhdHRlcm46IEludmFsaWQgdmFsdWUgZm9yICIgKyBlMTAgKyAiOiAiICsgdDgpOwogICAgfSBlbHNlIGlmIChlMTAgPT09ICJ5ZWFyIiAmJiAodDggPCAxIHx8IHQ4ID49IDFlNCkpIHRocm93IG5ldyBSYW5nZUVycm9yKCJDcm9uUGF0dGVybjogSW52YWxpZCB2YWx1ZSBmb3IgIiArIGUxMCArICI6ICIgKyB0OCArICIgKHN1cHBvcnRlZCByYW5nZTogMS05OTk5KSIpOwogICAgdGhpc1tlMTBdW3Q4XSA9IHIxMDsKICB9CiAgdmFsaWRhdGVOb3ROYU4oZTEwLCB0OCkgewogICAgaWYgKGlzTmFOKGUxMCkpIHRocm93IG5ldyBUeXBlRXJyb3IodDgpOwogIH0KICB2YWxpZGF0ZVJhbmdlKGUxMCwgdDgsIHIxMCwgbjExLCBpMTApIHsKICAgIGlmIChlMTAgPiB0OCkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3JvblBhdHRlcm46IEZyb20gdmFsdWUgaXMgbGFyZ2VyIHRoYW4gdG8gdmFsdWU6ICciICsgaTEwICsgIiciKTsKICAgIGlmIChyMTAgIT09IHZvaWQgMCkgewogICAgICBpZiAocjEwID09PSAwKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDcm9uUGF0dGVybjogU3ludGF4IGVycm9yLCBpbGxlZ2FsIHN0ZXBwaW5nOiAwIik7CiAgICAgIGlmIChyMTAgPiB0aGlzW24xMV0ubGVuZ3RoKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDcm9uUGF0dGVybjogU3ludGF4IGVycm9yLCBzdGVwcyBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIG1heGltdW0gdmFsdWUgb2YgcGFydCAoIiArIHRoaXNbbjExXS5sZW5ndGggKyAiKSIpOwogICAgfQogIH0KICBoYW5kbGVSYW5nZVdpdGhTdGVwcGluZyhlMTAsIHQ4LCByMTAsIG4xMSkgewogICAgaWYgKGUxMC50b1VwcGVyQ2FzZSgpLmluY2x1ZGVzKCJXIikpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNyb25QYXR0ZXJuOiBTeW50YXggZXJyb3IsIFcgaXMgbm90IGFsbG93ZWQgaW4gcmFuZ2VzIHdpdGggc3RlcHBpbmcuIik7CiAgICBsZXQgaTEwID0gdGhpcy5leHRyYWN0TnRoKGUxMCwgdDgpLCBhNCA9IGkxMFswXS5tYXRjaCgvXihcZCspLShcZCspXC8oXGQrKSQvKTsKICAgIGlmIChhNCA9PT0gbnVsbCkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3JvblBhdHRlcm46IFN5bnRheCBlcnJvciwgaWxsZWdhbCByYW5nZSB3aXRoIHN0ZXBwaW5nOiAnIiArIGUxMCArICInIik7CiAgICBsZXQgWywgbzEyLCBoNywgbDVdID0gYTQsIHkzID0gcGFyc2VJbnQobzEyLCAxMCkgKyByMTAsIHU2ID0gcGFyc2VJbnQoaDcsIDEwKSArIHIxMCwgZDQgPSBwYXJzZUludChsNSwgMTApOwogICAgdGhpcy52YWxpZGF0ZU5vdE5hTih5MywgIkNyb25QYXR0ZXJuOiBTeW50YXggZXJyb3IsIGlsbGVnYWwgbG93ZXIgcmFuZ2UgKE5hTikiKSwgdGhpcy52YWxpZGF0ZU5vdE5hTih1NiwgIkNyb25QYXR0ZXJuOiBTeW50YXggZXJyb3IsIGlsbGVnYWwgdXBwZXIgcmFuZ2UgKE5hTikiKSwgdGhpcy52YWxpZGF0ZU5vdE5hTihkNCwgIkNyb25QYXR0ZXJuOiBTeW50YXggZXJyb3IsIGlsbGVnYWwgc3RlcHBpbmc6IChOYU4pIiksIHRoaXMudmFsaWRhdGVSYW5nZSh5MywgdTYsIGQ0LCB0OCwgZTEwKTsKICAgIGZvciAobGV0IGMxMCA9IHkzOyBjMTAgPD0gdTY7IGMxMCArPSBkNCkgdGhpcy5zZXRQYXJ0KHQ4LCBjMTAsIGkxMFsxXSB8fCBuMTEpOwogIH0KICBleHRyYWN0TnRoKGUxMCwgdDgpIHsKICAgIGxldCByMTAgPSBlMTAsIG4xMTsKICAgIGlmIChyMTAuaW5jbHVkZXMoIiMiKSkgewogICAgICBpZiAodDggIT09ICJkYXlPZldlZWsiKSB0aHJvdyBuZXcgRXJyb3IoIkNyb25QYXR0ZXJuOiBudGggKCMpIG9ubHkgYWxsb3dlZCBpbiBkYXktb2Ytd2VlayBmaWVsZCIpOwogICAgICBuMTEgPSByMTAuc3BsaXQoIiMiKVsxXSwgcjEwID0gcjEwLnNwbGl0KCIjIilbMF07CiAgICB9IGVsc2UgaWYgKHIxMC50b1VwcGVyQ2FzZSgpLmVuZHNXaXRoKCJMIikpIHsKICAgICAgaWYgKHQ4ICE9PSAiZGF5T2ZXZWVrIikgdGhyb3cgbmV3IEVycm9yKCJDcm9uUGF0dGVybjogTCBtb2RpZmllciBvbmx5IGFsbG93ZWQgaW4gZGF5LW9mLXdlZWsgZmllbGQgKHVzZSBMIGFsb25lIGZvciBkYXktb2YtbW9udGgpIik7CiAgICAgIG4xMSA9ICJMIiwgcjEwID0gcjEwLnNsaWNlKDAsIC0xKTsKICAgIH0KICAgIHJldHVybiBbcjEwLCBuMTFdOwogIH0KICBoYW5kbGVSYW5nZShlMTAsIHQ4LCByMTAsIG4xMSkgewogICAgaWYgKGUxMC50b1VwcGVyQ2FzZSgpLmluY2x1ZGVzKCJXIikpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNyb25QYXR0ZXJuOiBTeW50YXggZXJyb3IsIFcgaXMgbm90IGFsbG93ZWQgaW4gYSByYW5nZS4iKTsKICAgIGxldCBpMTAgPSB0aGlzLmV4dHJhY3ROdGgoZTEwLCB0OCksIGE0ID0gaTEwWzBdLnNwbGl0KCItIik7CiAgICBpZiAoYTQubGVuZ3RoICE9PSAyKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDcm9uUGF0dGVybjogU3ludGF4IGVycm9yLCBpbGxlZ2FsIHJhbmdlOiAnIiArIGUxMCArICInIik7CiAgICBsZXQgbzEyID0gcGFyc2VJbnQoYTRbMF0sIDEwKSArIHIxMCwgaDcgPSBwYXJzZUludChhNFsxXSwgMTApICsgcjEwOwogICAgdGhpcy52YWxpZGF0ZU5vdE5hTihvMTIsICJDcm9uUGF0dGVybjogU3ludGF4IGVycm9yLCBpbGxlZ2FsIGxvd2VyIHJhbmdlIChOYU4pIiksIHRoaXMudmFsaWRhdGVOb3ROYU4oaDcsICJDcm9uUGF0dGVybjogU3ludGF4IGVycm9yLCBpbGxlZ2FsIHVwcGVyIHJhbmdlIChOYU4pIiksIHRoaXMudmFsaWRhdGVSYW5nZShvMTIsIGg3LCB2b2lkIDAsIHQ4LCBlMTApOwogICAgZm9yIChsZXQgbDUgPSBvMTI7IGw1IDw9IGg3OyBsNSsrKSB0aGlzLnNldFBhcnQodDgsIGw1LCBpMTBbMV0gfHwgbjExKTsKICB9CiAgaGFuZGxlU3RlcHBpbmcoZTEwLCB0OCwgcjEwLCBuMTEpIHsKICAgIGlmIChlMTAudG9VcHBlckNhc2UoKS5pbmNsdWRlcygiVyIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDcm9uUGF0dGVybjogU3ludGF4IGVycm9yLCBXIGlzIG5vdCBhbGxvd2VkIGluIHBhcnRzIHdpdGggc3RlcHBpbmcuIik7CiAgICBsZXQgaTEwID0gdGhpcy5leHRyYWN0TnRoKGUxMCwgdDgpLCBhNCA9IGkxMFswXS5zcGxpdCgiLyIpOwogICAgaWYgKGE0Lmxlbmd0aCAhPT0gMikgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3JvblBhdHRlcm46IFN5bnRheCBlcnJvciwgaWxsZWdhbCBzdGVwcGluZzogJyIgKyBlMTAgKyAiJyIpOwogICAgaWYgKHRoaXMuc2xvcHB5UmFuZ2VzKSBhNFswXSA9PT0gIiIgJiYgKGE0WzBdID0gIioiKTsKICAgIGVsc2UgewogICAgICBpZiAoYTRbMF0gPT09ICIiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDcm9uUGF0dGVybjogU3ludGF4IGVycm9yLCBzdGVwcGluZyB3aXRoIG1pc3NpbmcgcHJlZml4ICgnIiArIGUxMCArICInKSBpcyBub3QgYWxsb3dlZC4gVXNlIHdpbGRjYXJkICgqL3N0ZXApIG9yIHJhbmdlIChtaW4tbWF4L3N0ZXApIGluc3RlYWQuIik7CiAgICAgIGlmIChhNFswXSAhPT0gIioiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDcm9uUGF0dGVybjogU3ludGF4IGVycm9yLCBzdGVwcGluZyB3aXRoIG51bWVyaWMgcHJlZml4ICgnIiArIGUxMCArICInKSBpcyBub3QgYWxsb3dlZC4gVXNlIHdpbGRjYXJkICgqL3N0ZXApIG9yIHJhbmdlIChtaW4tbWF4L3N0ZXApIGluc3RlYWQuIik7CiAgICB9CiAgICBsZXQgbzEyID0gMDsKICAgIGE0WzBdICE9PSAiKiIgJiYgKG8xMiA9IHBhcnNlSW50KGE0WzBdLCAxMCkgKyByMTApOwogICAgbGV0IGg3ID0gcGFyc2VJbnQoYTRbMV0sIDEwKTsKICAgIHRoaXMudmFsaWRhdGVOb3ROYU4oaDcsICJDcm9uUGF0dGVybjogU3ludGF4IGVycm9yLCBpbGxlZ2FsIHN0ZXBwaW5nOiAoTmFOKSIpLCB0aGlzLnZhbGlkYXRlUmFuZ2UoMCwgdGhpc1t0OF0ubGVuZ3RoIC0gMSwgaDcsIHQ4LCBlMTApOwogICAgZm9yIChsZXQgbDUgPSBvMTI7IGw1IDwgdGhpc1t0OF0ubGVuZ3RoOyBsNSArPSBoNykgdGhpcy5zZXRQYXJ0KHQ4LCBsNSwgaTEwWzFdIHx8IG4xMSk7CiAgfQogIHJlcGxhY2VBbHBoYURheXMoZTEwKSB7CiAgICByZXR1cm4gZTEwLnJlcGxhY2UoLy1zdW4vZ2ksICItNyIpLnJlcGxhY2UoL3N1bi9naSwgIjAiKS5yZXBsYWNlKC9tb24vZ2ksICIxIikucmVwbGFjZSgvdHVlL2dpLCAiMiIpLnJlcGxhY2UoL3dlZC9naSwgIjMiKS5yZXBsYWNlKC90aHUvZ2ksICI0IikucmVwbGFjZSgvZnJpL2dpLCAiNSIpLnJlcGxhY2UoL3NhdC9naSwgIjYiKTsKICB9CiAgcmVwbGFjZUFscGhhRGF5c1F1YXJ0eihlMTApIHsKICAgIHJldHVybiBlMTAucmVwbGFjZSgvc3VuL2dpLCAiMSIpLnJlcGxhY2UoL21vbi9naSwgIjIiKS5yZXBsYWNlKC90dWUvZ2ksICIzIikucmVwbGFjZSgvd2VkL2dpLCAiNCIpLnJlcGxhY2UoL3RodS9naSwgIjUiKS5yZXBsYWNlKC9mcmkvZ2ksICI2IikucmVwbGFjZSgvc2F0L2dpLCAiNyIpOwogIH0KICByZXBsYWNlQWxwaGFNb250aHMoZTEwKSB7CiAgICByZXR1cm4gZTEwLnJlcGxhY2UoL2phbi9naSwgIjEiKS5yZXBsYWNlKC9mZWIvZ2ksICIyIikucmVwbGFjZSgvbWFyL2dpLCAiMyIpLnJlcGxhY2UoL2Fwci9naSwgIjQiKS5yZXBsYWNlKC9tYXkvZ2ksICI1IikucmVwbGFjZSgvanVuL2dpLCAiNiIpLnJlcGxhY2UoL2p1bC9naSwgIjciKS5yZXBsYWNlKC9hdWcvZ2ksICI4IikucmVwbGFjZSgvc2VwL2dpLCAiOSIpLnJlcGxhY2UoL29jdC9naSwgIjEwIikucmVwbGFjZSgvbm92L2dpLCAiMTEiKS5yZXBsYWNlKC9kZWMvZ2ksICIxMiIpOwogIH0KICBoYW5kbGVOaWNrbmFtZXMoZTEwKSB7CiAgICBsZXQgdDggPSBlMTAudHJpbSgpLnRvTG93ZXJDYXNlKCk7CiAgICBpZiAodDggPT09ICJAeWVhcmx5IiB8fCB0OCA9PT0gIkBhbm51YWxseSIpIHJldHVybiAiMCAwIDEgMSAqIjsKICAgIGlmICh0OCA9PT0gIkBtb250aGx5IikgcmV0dXJuICIwIDAgMSAqICoiOwogICAgaWYgKHQ4ID09PSAiQHdlZWtseSIpIHJldHVybiAiMCAwICogKiAwIjsKICAgIGlmICh0OCA9PT0gIkBkYWlseSIgfHwgdDggPT09ICJAbWlkbmlnaHQiKSByZXR1cm4gIjAgMCAqICogKiI7CiAgICBpZiAodDggPT09ICJAaG91cmx5IikgcmV0dXJuICIwICogKiAqICoiOwogICAgaWYgKHQ4ID09PSAiQHJlYm9vdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNyb25QYXR0ZXJuOiBAcmVib290IGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudC4gVGhpcyBpcyBhbiBldmVudC1iYXNlZCB0cmlnZ2VyIHRoYXQgcmVxdWlyZXMgc3lzdGVtIHN0YXJ0dXAgZGV0ZWN0aW9uLiIpOwogICAgcmV0dXJuIGUxMDsKICB9CiAgc2V0TnRoV2Vla2RheU9mTW9udGgoZTEwLCB0OCkgewogICAgaWYgKHR5cGVvZiB0OCAhPSAibnVtYmVyIiAmJiB0OC50b1VwcGVyQ2FzZSgpID09PSAiTCIpIHRoaXMuZGF5T2ZXZWVrW2UxMF0gPSB0aGlzLmRheU9mV2Vla1tlMTBdIHwgMzI7CiAgICBlbHNlIGlmICh0OCA9PT0gNjMpIHRoaXMuZGF5T2ZXZWVrW2UxMF0gPSA2MzsKICAgIGVsc2UgaWYgKHQ4IDwgNiAmJiB0OCA+IDApIHRoaXMuZGF5T2ZXZWVrW2UxMF0gPSB0aGlzLmRheU9mV2Vla1tlMTBdIHwgT1t0OCAtIDFdOwogICAgZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKGBDcm9uUGF0dGVybjogbnRoIHdlZWtkYXkgb3V0IG9mIHJhbmdlLCBzaG91bGQgYmUgMS01IG9yIEwuIFZhbHVlOiAke3Q4fSwgVHlwZTogJHt0eXBlb2YgdDh9YCk7CiAgfQp9Owp2YXIgUDIgPSBbMzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMV0sIGYzID0gW1sibW9udGgiLCAieWVhciIsIDBdLCBbImRheSIsICJtb250aCIsIC0xXSwgWyJob3VyIiwgImRheSIsIDBdLCBbIm1pbnV0ZSIsICJob3VyIiwgMF0sIFsic2Vjb25kIiwgIm1pbnV0ZSIsIDBdXSwgbTIgPSBjbGFzcyBzNCB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAicyIpOwogIH0KICB0ejsKICBtczsKICBzZWNvbmQ7CiAgbWludXRlOwogIGhvdXI7CiAgZGF5OwogIG1vbnRoOwogIHllYXI7CiAgY29uc3RydWN0b3IoZTEwLCB0OCkgewogICAgaWYgKHRoaXMudHogPSB0OCwgZTEwICYmIGUxMCBpbnN0YW5jZW9mIERhdGUpIGlmICghaXNOYU4oZTEwKSkgdGhpcy5mcm9tRGF0ZShlMTApOwogICAgZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDcm9uRGF0ZTogSW52YWxpZCBkYXRlIHBhc3NlZCB0byBDcm9uRGF0ZSBjb25zdHJ1Y3RvciIpOwogICAgZWxzZSBpZiAoZTEwID09IG51bGwpIHRoaXMuZnJvbURhdGUoLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCkpOwogICAgZWxzZSBpZiAoZTEwICYmIHR5cGVvZiBlMTAgPT0gInN0cmluZyIpIHRoaXMuZnJvbVN0cmluZyhlMTApOwogICAgZWxzZSBpZiAoZTEwIGluc3RhbmNlb2YgczQpIHRoaXMuZnJvbUNyb25EYXRlKGUxMCk7CiAgICBlbHNlIHRocm93IG5ldyBUeXBlRXJyb3IoIkNyb25EYXRlOiBJbnZhbGlkIHR5cGUgKCIgKyB0eXBlb2YgZTEwICsgIikgcGFzc2VkIHRvIENyb25EYXRlIGNvbnN0cnVjdG9yIik7CiAgfQogIGdldExhc3REYXlPZk1vbnRoKGUxMCwgdDgpIHsKICAgIHJldHVybiB0OCAhPT0gMSA/IFAyW3Q4XSA6IG5ldyBEYXRlKERhdGUuVVRDKGUxMCwgdDggKyAxLCAwKSkuZ2V0VVRDRGF0ZSgpOwogIH0KICBnZXRMYXN0V2Vla2RheShlMTAsIHQ4KSB7CiAgICBsZXQgcjEwID0gdGhpcy5nZXRMYXN0RGF5T2ZNb250aChlMTAsIHQ4KSwgaTEwID0gbmV3IERhdGUoRGF0ZS5VVEMoZTEwLCB0OCwgcjEwKSkuZ2V0VVRDRGF5KCk7CiAgICByZXR1cm4gaTEwID09PSAwID8gcjEwIC0gMiA6IGkxMCA9PT0gNiA/IHIxMCAtIDEgOiByMTA7CiAgfQogIGdldE5lYXJlc3RXZWVrZGF5KGUxMCwgdDgsIHIxMCkgewogICAgbGV0IG4xMSA9IHRoaXMuZ2V0TGFzdERheU9mTW9udGgoZTEwLCB0OCk7CiAgICBpZiAocjEwID4gbjExKSByZXR1cm4gLTE7CiAgICBsZXQgYTQgPSBuZXcgRGF0ZShEYXRlLlVUQyhlMTAsIHQ4LCByMTApKS5nZXRVVENEYXkoKTsKICAgIHJldHVybiBhNCA9PT0gMCA/IHIxMCA9PT0gbjExID8gcjEwIC0gMiA6IHIxMCArIDEgOiBhNCA9PT0gNiA/IHIxMCA9PT0gMSA/IHIxMCArIDIgOiByMTAgLSAxIDogcjEwOwogIH0KICBpc050aFdlZWtkYXlPZk1vbnRoKGUxMCwgdDgsIHIxMCwgbjExKSB7CiAgICBsZXQgYTQgPSBuZXcgRGF0ZShEYXRlLlVUQyhlMTAsIHQ4LCByMTApKS5nZXRVVENEYXkoKSwgbzEyID0gMDsKICAgIGZvciAobGV0IGg3ID0gMTsgaDcgPD0gcjEwOyBoNysrKSBuZXcgRGF0ZShEYXRlLlVUQyhlMTAsIHQ4LCBoNykpLmdldFVUQ0RheSgpID09PSBhNCAmJiBvMTIrKzsKICAgIGlmIChuMTEgJiA2MyAmJiBPW28xMiAtIDFdICYgbjExKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChuMTEgJiAzMikgewogICAgICBsZXQgaDcgPSB0aGlzLmdldExhc3REYXlPZk1vbnRoKGUxMCwgdDgpOwogICAgICBmb3IgKGxldCBsNSA9IHIxMCArIDE7IGw1IDw9IGg3OyBsNSsrKSBpZiAobmV3IERhdGUoRGF0ZS5VVEMoZTEwLCB0OCwgbDUpKS5nZXRVVENEYXkoKSA9PT0gYTQpIHJldHVybiBmYWxzZTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGZyb21EYXRlKGUxMCkgewogICAgaWYgKHRoaXMudHogIT09IHZvaWQgMCkgaWYgKHR5cGVvZiB0aGlzLnR6ID09ICJudW1iZXIiKSB0aGlzLm1zID0gZTEwLmdldFVUQ01pbGxpc2Vjb25kcygpLCB0aGlzLnNlY29uZCA9IGUxMC5nZXRVVENTZWNvbmRzKCksIHRoaXMubWludXRlID0gZTEwLmdldFVUQ01pbnV0ZXMoKSArIHRoaXMudHosIHRoaXMuaG91ciA9IGUxMC5nZXRVVENIb3VycygpLCB0aGlzLmRheSA9IGUxMC5nZXRVVENEYXRlKCksIHRoaXMubW9udGggPSBlMTAuZ2V0VVRDTW9udGgoKSwgdGhpcy55ZWFyID0gZTEwLmdldFVUQ0Z1bGxZZWFyKCksIHRoaXMuYXBwbHkoKTsKICAgIGVsc2UgdHJ5IHsKICAgICAgbGV0IHQ4ID0gZzIoZTEwLCB0aGlzLnR6KTsKICAgICAgdGhpcy5tcyA9IGUxMC5nZXRNaWxsaXNlY29uZHMoKSwgdGhpcy5zZWNvbmQgPSB0OC5zLCB0aGlzLm1pbnV0ZSA9IHQ4LmksIHRoaXMuaG91ciA9IHQ4LmgsIHRoaXMuZGF5ID0gdDguZCwgdGhpcy5tb250aCA9IHQ4Lm0gLSAxLCB0aGlzLnllYXIgPSB0OC55OwogICAgfSBjYXRjaCAodDgpIHsKICAgICAgbGV0IHIxMCA9IHQ4IGluc3RhbmNlb2YgRXJyb3IgPyB0OC5tZXNzYWdlIDogU3RyaW5nKHQ4KTsKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgQ3JvbkRhdGU6IEZhaWxlZCB0byBjb252ZXJ0IGRhdGUgdG8gdGltZXpvbmUgJyR7dGhpcy50en0nLiBUaGlzIG1heSBoYXBwZW4gd2l0aCBpbnZhbGlkIHRpbWV6b25lIG5hbWVzIG9yIGRhdGVzLiBPcmlnaW5hbCBlcnJvcjogJHtyMTB9YCk7CiAgICB9CiAgICBlbHNlIHRoaXMubXMgPSBlMTAuZ2V0TWlsbGlzZWNvbmRzKCksIHRoaXMuc2Vjb25kID0gZTEwLmdldFNlY29uZHMoKSwgdGhpcy5taW51dGUgPSBlMTAuZ2V0TWludXRlcygpLCB0aGlzLmhvdXIgPSBlMTAuZ2V0SG91cnMoKSwgdGhpcy5kYXkgPSBlMTAuZ2V0RGF0ZSgpLCB0aGlzLm1vbnRoID0gZTEwLmdldE1vbnRoKCksIHRoaXMueWVhciA9IGUxMC5nZXRGdWxsWWVhcigpOwogIH0KICBmcm9tQ3JvbkRhdGUoZTEwKSB7CiAgICB0aGlzLnR6ID0gZTEwLnR6LCB0aGlzLnllYXIgPSBlMTAueWVhciwgdGhpcy5tb250aCA9IGUxMC5tb250aCwgdGhpcy5kYXkgPSBlMTAuZGF5LCB0aGlzLmhvdXIgPSBlMTAuaG91ciwgdGhpcy5taW51dGUgPSBlMTAubWludXRlLCB0aGlzLnNlY29uZCA9IGUxMC5zZWNvbmQsIHRoaXMubXMgPSBlMTAubXM7CiAgfQogIGFwcGx5KCkgewogICAgaWYgKHRoaXMubW9udGggPiAxMSB8fCB0aGlzLm1vbnRoIDwgMCB8fCB0aGlzLmRheSA+IFAyW3RoaXMubW9udGhdIHx8IHRoaXMuZGF5IDwgMSB8fCB0aGlzLmhvdXIgPiA1OSB8fCB0aGlzLm1pbnV0ZSA+IDU5IHx8IHRoaXMuc2Vjb25kID4gNTkgfHwgdGhpcy5ob3VyIDwgMCB8fCB0aGlzLm1pbnV0ZSA8IDAgfHwgdGhpcy5zZWNvbmQgPCAwKSB7CiAgICAgIGxldCBlMTAgPSBuZXcgRGF0ZShEYXRlLlVUQyh0aGlzLnllYXIsIHRoaXMubW9udGgsIHRoaXMuZGF5LCB0aGlzLmhvdXIsIHRoaXMubWludXRlLCB0aGlzLnNlY29uZCwgdGhpcy5tcykpOwogICAgICByZXR1cm4gdGhpcy5tcyA9IGUxMC5nZXRVVENNaWxsaXNlY29uZHMoKSwgdGhpcy5zZWNvbmQgPSBlMTAuZ2V0VVRDU2Vjb25kcygpLCB0aGlzLm1pbnV0ZSA9IGUxMC5nZXRVVENNaW51dGVzKCksIHRoaXMuaG91ciA9IGUxMC5nZXRVVENIb3VycygpLCB0aGlzLmRheSA9IGUxMC5nZXRVVENEYXRlKCksIHRoaXMubW9udGggPSBlMTAuZ2V0VVRDTW9udGgoKSwgdGhpcy55ZWFyID0gZTEwLmdldFVUQ0Z1bGxZZWFyKCksIHRydWU7CiAgICB9IGVsc2UgcmV0dXJuIGZhbHNlOwogIH0KICBmcm9tU3RyaW5nKGUxMCkgewogICAgaWYgKHR5cGVvZiB0aGlzLnR6ID09ICJudW1iZXIiKSB7CiAgICAgIGxldCB0OCA9IHYyKGUxMCk7CiAgICAgIHRoaXMubXMgPSB0OC5nZXRVVENNaWxsaXNlY29uZHMoKSwgdGhpcy5zZWNvbmQgPSB0OC5nZXRVVENTZWNvbmRzKCksIHRoaXMubWludXRlID0gdDguZ2V0VVRDTWludXRlcygpLCB0aGlzLmhvdXIgPSB0OC5nZXRVVENIb3VycygpLCB0aGlzLmRheSA9IHQ4LmdldFVUQ0RhdGUoKSwgdGhpcy5tb250aCA9IHQ4LmdldFVUQ01vbnRoKCksIHRoaXMueWVhciA9IHQ4LmdldFVUQ0Z1bGxZZWFyKCksIHRoaXMuYXBwbHkoKTsKICAgIH0gZWxzZSByZXR1cm4gdGhpcy5mcm9tRGF0ZSh2MihlMTAsIHRoaXMudHopKTsKICB9CiAgZmluZE5leHQoZTEwLCB0OCwgcjEwLCBuMTEpIHsKICAgIHJldHVybiB0aGlzLl9maW5kTWF0Y2goZTEwLCB0OCwgcjEwLCBuMTEsIDEpOwogIH0KICBfZmluZE1hdGNoKGUxMCwgdDgsIHIxMCwgbjExLCBpMTApIHsKICAgIGxldCBhNCA9IHRoaXNbdDhdLCBvMTI7CiAgICByMTAubGFzdERheU9mTW9udGggJiYgKG8xMiA9IHRoaXMuZ2V0TGFzdERheU9mTW9udGgodGhpcy55ZWFyLCB0aGlzLm1vbnRoKSk7CiAgICBsZXQgaDcgPSAhcjEwLnN0YXJET1cgJiYgdDggPT0gImRheSIgPyBuZXcgRGF0ZShEYXRlLlVUQyh0aGlzLnllYXIsIHRoaXMubW9udGgsIDEsIDAsIDAsIDAsIDApKS5nZXRVVENEYXkoKSA6IHZvaWQgMCwgbDUgPSB0aGlzW3Q4XSArIG4xMSwgeTMgPSBpMTAgPT09IDEgPyAodTYpID0+IHU2IDwgcjEwW3Q4XS5sZW5ndGggOiAodTYpID0+IHU2ID49IDA7CiAgICBmb3IgKGxldCB1NiA9IGw1OyB5Myh1Nik7IHU2ICs9IGkxMCkgewogICAgICBsZXQgZDQgPSByMTBbdDhdW3U2XTsKICAgICAgaWYgKHQ4ID09PSAiZGF5IiAmJiAhZDQpIHsKICAgICAgICBmb3IgKGxldCBjMTAgPSAwOyBjMTAgPCByMTAubmVhcmVzdFdlZWtkYXlzLmxlbmd0aDsgYzEwKyspIGlmIChyMTAubmVhcmVzdFdlZWtkYXlzW2MxMF0pIHsKICAgICAgICAgIGxldCBNMyA9IHRoaXMuZ2V0TmVhcmVzdFdlZWtkYXkodGhpcy55ZWFyLCB0aGlzLm1vbnRoLCBjMTAgLSBuMTEpOwogICAgICAgICAgaWYgKE0zID09PSAtMSkgY29udGludWU7CiAgICAgICAgICBpZiAoTTMgPT09IHU2IC0gbjExKSB7CiAgICAgICAgICAgIGQ0ID0gMTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICh0OCA9PT0gImRheSIgJiYgcjEwLmxhc3RXZWVrZGF5KSB7CiAgICAgICAgbGV0IGMxMCA9IHRoaXMuZ2V0TGFzdFdlZWtkYXkodGhpcy55ZWFyLCB0aGlzLm1vbnRoKTsKICAgICAgICB1NiAtIG4xMSA9PT0gYzEwICYmIChkNCA9IDEpOwogICAgICB9CiAgICAgIGlmICh0OCA9PT0gImRheSIgJiYgcjEwLmxhc3REYXlPZk1vbnRoICYmIHU2IC0gbjExID09IG8xMiAmJiAoZDQgPSAxKSwgdDggPT09ICJkYXkiICYmICFyMTAuc3RhckRPVykgewogICAgICAgIGxldCBjMTAgPSByMTAuZGF5T2ZXZWVrWyhoNyArICh1NiAtIG4xMSAtIDEpKSAlIDddOwogICAgICAgIGlmIChjMTAgJiYgYzEwICYgNjMpIGMxMCA9IHRoaXMuaXNOdGhXZWVrZGF5T2ZNb250aCh0aGlzLnllYXIsIHRoaXMubW9udGgsIHU2IC0gbjExLCBjMTApID8gMSA6IDA7CiAgICAgICAgZWxzZSBpZiAoYzEwKSB0aHJvdyBuZXcgRXJyb3IoYENyb25EYXRlOiBJbnZhbGlkIHZhbHVlIGZvciBkYXlPZldlZWsgZW5jb3VudGVyZWQuICR7YzEwfWApOwogICAgICAgIHIxMC51c2VBbmRMb2dpYyA/IGQ0ID0gZDQgJiYgYzEwIDogIWUxMC5kb21BbmREb3cgJiYgIXIxMC5zdGFyRE9NID8gZDQgPSBkNCB8fCBjMTAgOiBkNCA9IGQ0ICYmIGMxMDsKICAgICAgfQogICAgICBpZiAoZDQpIHJldHVybiB0aGlzW3Q4XSA9IHU2IC0gbjExLCBhNCAhPT0gdGhpc1t0OF0gPyAyIDogMTsKICAgIH0KICAgIHJldHVybiAzOwogIH0KICByZWN1cnNlKGUxMCwgdDgsIHIxMCkgewogICAgaWYgKHIxMCA9PT0gMCAmJiAhZTEwLnN0YXJZZWFyKSB7CiAgICAgIGlmICh0aGlzLnllYXIgPj0gMCAmJiB0aGlzLnllYXIgPCBlMTAueWVhci5sZW5ndGggJiYgZTEwLnllYXJbdGhpcy55ZWFyXSA9PT0gMCkgewogICAgICAgIGxldCBpMTAgPSAtMTsKICAgICAgICBmb3IgKGxldCBhNCA9IHRoaXMueWVhciArIDE7IGE0IDwgZTEwLnllYXIubGVuZ3RoICYmIGE0IDwgMWU0OyBhNCsrKSBpZiAoZTEwLnllYXJbYTRdID09PSAxKSB7CiAgICAgICAgICBpMTAgPSBhNDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoaTEwID09PSAtMSkgcmV0dXJuIG51bGw7CiAgICAgICAgdGhpcy55ZWFyID0gaTEwLCB0aGlzLm1vbnRoID0gMCwgdGhpcy5kYXkgPSAxLCB0aGlzLmhvdXIgPSAwLCB0aGlzLm1pbnV0ZSA9IDAsIHRoaXMuc2Vjb25kID0gMCwgdGhpcy5tcyA9IDA7CiAgICAgIH0KICAgICAgaWYgKHRoaXMueWVhciA+PSAxZTQpIHJldHVybiBudWxsOwogICAgfQogICAgbGV0IG4xMSA9IHRoaXMuZmluZE5leHQodDgsIGYzW3IxMF1bMF0sIGUxMCwgZjNbcjEwXVsyXSk7CiAgICBpZiAobjExID4gMSkgewogICAgICBsZXQgaTEwID0gcjEwICsgMTsKICAgICAgZm9yICg7IGkxMCA8IGYzLmxlbmd0aDsgKSB0aGlzW2YzW2kxMF1bMF1dID0gLWYzW2kxMF1bMl0sIGkxMCsrOwogICAgICBpZiAobjExID09PSAzKSB7CiAgICAgICAgaWYgKHRoaXNbZjNbcjEwXVsxXV0rKywgdGhpc1tmM1tyMTBdWzBdXSA9IC1mM1tyMTBdWzJdLCB0aGlzLmFwcGx5KCksIHIxMCA9PT0gMCAmJiAhZTEwLnN0YXJZZWFyKSB7CiAgICAgICAgICBmb3IgKDsgdGhpcy55ZWFyID49IDAgJiYgdGhpcy55ZWFyIDwgZTEwLnllYXIubGVuZ3RoICYmIGUxMC55ZWFyW3RoaXMueWVhcl0gPT09IDAgJiYgdGhpcy55ZWFyIDwgMWU0OyApIHRoaXMueWVhcisrOwogICAgICAgICAgaWYgKHRoaXMueWVhciA+PSAxZTQgfHwgdGhpcy55ZWFyID49IGUxMC55ZWFyLmxlbmd0aCkgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLnJlY3Vyc2UoZTEwLCB0OCwgMCk7CiAgICAgIH0gZWxzZSBpZiAodGhpcy5hcHBseSgpKSByZXR1cm4gdGhpcy5yZWN1cnNlKGUxMCwgdDgsIHIxMCAtIDEpOwogICAgfQogICAgcmV0dXJuIHIxMCArPSAxLCByMTAgPj0gZjMubGVuZ3RoID8gdGhpcyA6IChlMTAuc3RhclllYXIgPyB0aGlzLnllYXIgPj0gM2UzIDogdGhpcy55ZWFyID49IDFlNCkgPyBudWxsIDogdGhpcy5yZWN1cnNlKGUxMCwgdDgsIHIxMCk7CiAgfQogIGluY3JlbWVudChlMTAsIHQ4LCByMTApIHsKICAgIHJldHVybiB0aGlzLnNlY29uZCArPSB0OC5pbnRlcnZhbCAhPT0gdm9pZCAwICYmIHQ4LmludGVydmFsID4gMSAmJiByMTAgPyB0OC5pbnRlcnZhbCA6IDEsIHRoaXMubXMgPSAwLCB0aGlzLmFwcGx5KCksIHRoaXMucmVjdXJzZShlMTAsIHQ4LCAwKTsKICB9CiAgZGVjcmVtZW50KGUxMCwgdDgpIHsKICAgIHJldHVybiB0aGlzLnNlY29uZCAtPSB0OC5pbnRlcnZhbCAhPT0gdm9pZCAwICYmIHQ4LmludGVydmFsID4gMSA/IHQ4LmludGVydmFsIDogMSwgdGhpcy5tcyA9IDAsIHRoaXMuYXBwbHkoKSwgdGhpcy5yZWN1cnNlQmFja3dhcmQoZTEwLCB0OCwgMCwgMCk7CiAgfQogIHJlY3Vyc2VCYWNrd2FyZChlMTAsIHQ4LCByMTAsIG4xMSA9IDApIHsKICAgIGlmIChuMTEgPiAxZTQpIHJldHVybiBudWxsOwogICAgaWYgKHIxMCA9PT0gMCAmJiAhZTEwLnN0YXJZZWFyKSB7CiAgICAgIGlmICh0aGlzLnllYXIgPj0gMCAmJiB0aGlzLnllYXIgPCBlMTAueWVhci5sZW5ndGggJiYgZTEwLnllYXJbdGhpcy55ZWFyXSA9PT0gMCkgewogICAgICAgIGxldCBhNCA9IC0xOwogICAgICAgIGZvciAobGV0IG8xMiA9IHRoaXMueWVhciAtIDE7IG8xMiA+PSAwOyBvMTItLSkgaWYgKGUxMC55ZWFyW28xMl0gPT09IDEpIHsKICAgICAgICAgIGE0ID0gbzEyOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChhNCA9PT0gLTEpIHJldHVybiBudWxsOwogICAgICAgIHRoaXMueWVhciA9IGE0LCB0aGlzLm1vbnRoID0gMTEsIHRoaXMuZGF5ID0gMzEsIHRoaXMuaG91ciA9IDIzLCB0aGlzLm1pbnV0ZSA9IDU5LCB0aGlzLnNlY29uZCA9IDU5LCB0aGlzLm1zID0gMDsKICAgICAgfQogICAgICBpZiAodGhpcy55ZWFyIDwgMCkgcmV0dXJuIG51bGw7CiAgICB9CiAgICBsZXQgaTEwID0gdGhpcy5maW5kUHJldmlvdXModDgsIGYzW3IxMF1bMF0sIGUxMCwgZjNbcjEwXVsyXSk7CiAgICBpZiAoaTEwID4gMSkgewogICAgICBsZXQgYTQgPSByMTAgKyAxOwogICAgICBmb3IgKDsgYTQgPCBmMy5sZW5ndGg7ICkgewogICAgICAgIGxldCBvMTIgPSBmM1thNF1bMF0sIGg3ID0gZjNbYTRdWzJdLCBsNSA9IHRoaXMuZ2V0TWF4UGF0dGVyblZhbHVlKG8xMiwgZTEwLCBoNyk7CiAgICAgICAgdGhpc1tvMTJdID0gbDUsIGE0Kys7CiAgICAgIH0KICAgICAgaWYgKGkxMCA9PT0gMykgewogICAgICAgIGlmICh0aGlzW2YzW3IxMF1bMV1dLS0sIHIxMCA9PT0gMCkgewogICAgICAgICAgbGV0IHkzID0gdGhpcy5nZXRMYXN0RGF5T2ZNb250aCh0aGlzLnllYXIsIHRoaXMubW9udGgpOwogICAgICAgICAgdGhpcy5kYXkgPiB5MyAmJiAodGhpcy5kYXkgPSB5Myk7CiAgICAgICAgfQogICAgICAgIGlmIChyMTAgPT09IDEpIGlmICh0aGlzLmRheSA8PSAwKSB0aGlzLmRheSA9IDE7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBsZXQgeTMgPSB0aGlzLnllYXIsIHU2ID0gdGhpcy5tb250aDsKICAgICAgICAgIGZvciAoOyB1NiA8IDA7ICkgdTYgKz0gMTIsIHkzLS07CiAgICAgICAgICBmb3IgKDsgdTYgPiAxMTsgKSB1NiAtPSAxMiwgeTMrKzsKICAgICAgICAgIGxldCBkNCA9IHU2ICE9PSAxID8gUDJbdTZdIDogbmV3IERhdGUoRGF0ZS5VVEMoeTMsIHU2ICsgMSwgMCkpLmdldFVUQ0RhdGUoKTsKICAgICAgICAgIHRoaXMuZGF5ID4gZDQgJiYgKHRoaXMuZGF5ID0gZDQpOwogICAgICAgIH0KICAgICAgICB0aGlzLmFwcGx5KCk7CiAgICAgICAgbGV0IG8xMiA9IGYzW3IxMF1bMF0sIGg3ID0gZjNbcjEwXVsyXSwgbDUgPSB0aGlzLmdldE1heFBhdHRlcm5WYWx1ZShvMTIsIGUxMCwgaDcpOwogICAgICAgIGlmIChvMTIgPT09ICJkYXkiKSB7CiAgICAgICAgICBsZXQgeTMgPSB0aGlzLmdldExhc3REYXlPZk1vbnRoKHRoaXMueWVhciwgdGhpcy5tb250aCk7CiAgICAgICAgICB0aGlzW28xMl0gPSBNYXRoLm1pbihsNSwgeTMpOwogICAgICAgIH0gZWxzZSB0aGlzW28xMl0gPSBsNTsKICAgICAgICBpZiAodGhpcy5hcHBseSgpLCByMTAgPT09IDApIHsKICAgICAgICAgIGxldCB5MyA9IGYzWzFdWzJdLCB1NiA9IHRoaXMuZ2V0TWF4UGF0dGVyblZhbHVlKCJkYXkiLCBlMTAsIHkzKSwgZDQgPSB0aGlzLmdldExhc3REYXlPZk1vbnRoKHRoaXMueWVhciwgdGhpcy5tb250aCksIGMxMCA9IE1hdGgubWluKHU2LCBkNCk7CiAgICAgICAgICBjMTAgIT09IHRoaXMuZGF5ICYmICh0aGlzLmRheSA9IGMxMCwgdGhpcy5ob3VyID0gdGhpcy5nZXRNYXhQYXR0ZXJuVmFsdWUoImhvdXIiLCBlMTAsIGYzWzJdWzJdKSwgdGhpcy5taW51dGUgPSB0aGlzLmdldE1heFBhdHRlcm5WYWx1ZSgibWludXRlIiwgZTEwLCBmM1szXVsyXSksIHRoaXMuc2Vjb25kID0gdGhpcy5nZXRNYXhQYXR0ZXJuVmFsdWUoInNlY29uZCIsIGUxMCwgZjNbNF1bMl0pKTsKICAgICAgICB9CiAgICAgICAgaWYgKHIxMCA9PT0gMCAmJiAhZTEwLnN0YXJZZWFyKSB7CiAgICAgICAgICBmb3IgKDsgdGhpcy55ZWFyID49IDAgJiYgdGhpcy55ZWFyIDwgZTEwLnllYXIubGVuZ3RoICYmIGUxMC55ZWFyW3RoaXMueWVhcl0gPT09IDA7ICkgdGhpcy55ZWFyLS07CiAgICAgICAgICBpZiAodGhpcy55ZWFyIDwgMCkgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLnJlY3Vyc2VCYWNrd2FyZChlMTAsIHQ4LCAwLCBuMTEgKyAxKTsKICAgICAgfSBlbHNlIGlmICh0aGlzLmFwcGx5KCkpIHJldHVybiB0aGlzLnJlY3Vyc2VCYWNrd2FyZChlMTAsIHQ4LCByMTAgLSAxLCBuMTEgKyAxKTsKICAgIH0KICAgIHJldHVybiByMTAgKz0gMSwgcjEwID49IGYzLmxlbmd0aCA/IHRoaXMgOiB0aGlzLnllYXIgPCAwID8gbnVsbCA6IHRoaXMucmVjdXJzZUJhY2t3YXJkKGUxMCwgdDgsIHIxMCwgbjExICsgMSk7CiAgfQogIGdldE1heFBhdHRlcm5WYWx1ZShlMTAsIHQ4LCByMTApIHsKICAgIGlmIChlMTAgPT09ICJkYXkiICYmIHQ4Lmxhc3REYXlPZk1vbnRoKSByZXR1cm4gdGhpcy5nZXRMYXN0RGF5T2ZNb250aCh0aGlzLnllYXIsIHRoaXMubW9udGgpOwogICAgaWYgKGUxMCA9PT0gImRheSIgJiYgIXQ4LnN0YXJET1cpIHJldHVybiB0aGlzLmdldExhc3REYXlPZk1vbnRoKHRoaXMueWVhciwgdGhpcy5tb250aCk7CiAgICBmb3IgKGxldCBuMTEgPSB0OFtlMTBdLmxlbmd0aCAtIDE7IG4xMSA+PSAwOyBuMTEtLSkgaWYgKHQ4W2UxMF1bbjExXSkgcmV0dXJuIG4xMSAtIHIxMDsKICAgIHJldHVybiB0OFtlMTBdLmxlbmd0aCAtIDEgLSByMTA7CiAgfQogIGZpbmRQcmV2aW91cyhlMTAsIHQ4LCByMTAsIG4xMSkgewogICAgcmV0dXJuIHRoaXMuX2ZpbmRNYXRjaChlMTAsIHQ4LCByMTAsIG4xMSwgLTEpOwogIH0KICBnZXREYXRlKGUxMCkgewogICAgcmV0dXJuIGUxMCB8fCB0aGlzLnR6ID09PSB2b2lkIDAgPyBuZXcgRGF0ZSh0aGlzLnllYXIsIHRoaXMubW9udGgsIHRoaXMuZGF5LCB0aGlzLmhvdXIsIHRoaXMubWludXRlLCB0aGlzLnNlY29uZCwgdGhpcy5tcykgOiB0eXBlb2YgdGhpcy50eiA9PSAibnVtYmVyIiA/IG5ldyBEYXRlKERhdGUuVVRDKHRoaXMueWVhciwgdGhpcy5tb250aCwgdGhpcy5kYXksIHRoaXMuaG91ciwgdGhpcy5taW51dGUgLSB0aGlzLnR6LCB0aGlzLnNlY29uZCwgdGhpcy5tcykpIDogazIoYjModGhpcy55ZWFyLCB0aGlzLm1vbnRoICsgMSwgdGhpcy5kYXksIHRoaXMuaG91ciwgdGhpcy5taW51dGUsIHRoaXMuc2Vjb25kLCB0aGlzLnR6KSwgZmFsc2UpOwogIH0KICBnZXRUaW1lKCkgewogICAgcmV0dXJuIHRoaXMuZ2V0RGF0ZShmYWxzZSkuZ2V0VGltZSgpOwogIH0KICBtYXRjaChlMTAsIHQ4KSB7CiAgICBpZiAoIWUxMC5zdGFyWWVhciAmJiAodGhpcy55ZWFyIDwgMCB8fCB0aGlzLnllYXIgPj0gZTEwLnllYXIubGVuZ3RoIHx8IGUxMC55ZWFyW3RoaXMueWVhcl0gPT09IDApKSByZXR1cm4gZmFsc2U7CiAgICBmb3IgKGxldCByMTAgPSAwOyByMTAgPCBmMy5sZW5ndGg7IHIxMCsrKSB7CiAgICAgIGxldCBuMTEgPSBmM1tyMTBdWzBdLCBpMTAgPSBmM1tyMTBdWzJdLCBhNCA9IHRoaXNbbjExXTsKICAgICAgaWYgKGE0ICsgaTEwIDwgMCB8fCBhNCArIGkxMCA+PSBlMTBbbjExXS5sZW5ndGgpIHJldHVybiBmYWxzZTsKICAgICAgbGV0IG8xMiA9IGUxMFtuMTFdW2E0ICsgaTEwXTsKICAgICAgaWYgKG4xMSA9PT0gImRheSIpIHsKICAgICAgICBpZiAoIW8xMikgewogICAgICAgICAgZm9yIChsZXQgaDcgPSAwOyBoNyA8IGUxMC5uZWFyZXN0V2Vla2RheXMubGVuZ3RoOyBoNysrKSBpZiAoZTEwLm5lYXJlc3RXZWVrZGF5c1toN10pIHsKICAgICAgICAgICAgbGV0IGw1ID0gdGhpcy5nZXROZWFyZXN0V2Vla2RheSh0aGlzLnllYXIsIHRoaXMubW9udGgsIGg3IC0gaTEwKTsKICAgICAgICAgICAgaWYgKGw1ICE9PSAtMSAmJiBsNSA9PT0gYTQpIHsKICAgICAgICAgICAgICBvMTIgPSAxOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChlMTAubGFzdFdlZWtkYXkpIHsKICAgICAgICAgIGxldCBoNyA9IHRoaXMuZ2V0TGFzdFdlZWtkYXkodGhpcy55ZWFyLCB0aGlzLm1vbnRoKTsKICAgICAgICAgIGE0ID09PSBoNyAmJiAobzEyID0gMSk7CiAgICAgICAgfQogICAgICAgIGlmIChlMTAubGFzdERheU9mTW9udGgpIHsKICAgICAgICAgIGxldCBoNyA9IHRoaXMuZ2V0TGFzdERheU9mTW9udGgodGhpcy55ZWFyLCB0aGlzLm1vbnRoKTsKICAgICAgICAgIGE0ID09PSBoNyAmJiAobzEyID0gMSk7CiAgICAgICAgfQogICAgICAgIGlmICghZTEwLnN0YXJET1cpIHsKICAgICAgICAgIGxldCBoNyA9IG5ldyBEYXRlKERhdGUuVVRDKHRoaXMueWVhciwgdGhpcy5tb250aCwgMSwgMCwgMCwgMCwgMCkpLmdldFVUQ0RheSgpLCBsNSA9IGUxMC5kYXlPZldlZWtbKGg3ICsgKGE0IC0gMSkpICUgN107CiAgICAgICAgICBsNSAmJiBsNSAmIDYzICYmIChsNSA9IHRoaXMuaXNOdGhXZWVrZGF5T2ZNb250aCh0aGlzLnllYXIsIHRoaXMubW9udGgsIGE0LCBsNSkgPyAxIDogMCksIGUxMC51c2VBbmRMb2dpYyA/IG8xMiA9IG8xMiAmJiBsNSA6ICF0OC5kb21BbmREb3cgJiYgIWUxMC5zdGFyRE9NID8gbzEyID0gbzEyIHx8IGw1IDogbzEyID0gbzEyICYmIGw1OwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoIW8xMikgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQp9OwpmdW5jdGlvbiBSMihzOSkgewogIGlmIChzOSA9PT0gdm9pZCAwICYmIChzOSA9IHt9KSwgZGVsZXRlIHM5Lm5hbWUsIHM5LmxlZ2FjeU1vZGUgIT09IHZvaWQgMCAmJiBzOS5kb21BbmREb3cgPT09IHZvaWQgMCA/IHM5LmRvbUFuZERvdyA9ICFzOS5sZWdhY3lNb2RlIDogczkuZG9tQW5kRG93ID09PSB2b2lkIDAgJiYgKHM5LmRvbUFuZERvdyA9IGZhbHNlKSwgczkubGVnYWN5TW9kZSA9ICFzOS5kb21BbmREb3csIHM5LnBhdXNlZCA9IHM5LnBhdXNlZCA9PT0gdm9pZCAwID8gZmFsc2UgOiBzOS5wYXVzZWQsIHM5Lm1heFJ1bnMgPSBzOS5tYXhSdW5zID09PSB2b2lkIDAgPyAxIC8gMCA6IHM5Lm1heFJ1bnMsIHM5LmNhdGNoID0gczkuY2F0Y2ggPT09IHZvaWQgMCA/IGZhbHNlIDogczkuY2F0Y2gsIHM5LmludGVydmFsID0gczkuaW50ZXJ2YWwgPT09IHZvaWQgMCA/IDAgOiBwYXJzZUludChzOS5pbnRlcnZhbC50b1N0cmluZygpLCAxMCksIHM5LnV0Y09mZnNldCA9IHM5LnV0Y09mZnNldCA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyc2VJbnQoczkudXRjT2Zmc2V0LnRvU3RyaW5nKCksIDEwKSwgczkuZGF5T2Zmc2V0ID0gczkuZGF5T2Zmc2V0ID09PSB2b2lkIDAgPyAwIDogcGFyc2VJbnQoczkuZGF5T2Zmc2V0LnRvU3RyaW5nKCksIDEwKSwgczkudW5yZWYgPSBzOS51bnJlZiA9PT0gdm9pZCAwID8gZmFsc2UgOiBzOS51bnJlZiwgczkubW9kZSA9IHM5Lm1vZGUgPT09IHZvaWQgMCA/ICJhdXRvIiA6IHM5Lm1vZGUsIHM5LmFsdGVybmF0aXZlV2Vla2RheXMgPSBzOS5hbHRlcm5hdGl2ZVdlZWtkYXlzID09PSB2b2lkIDAgPyBmYWxzZSA6IHM5LmFsdGVybmF0aXZlV2Vla2RheXMsIHM5LnNsb3BweVJhbmdlcyA9IHM5LnNsb3BweVJhbmdlcyA9PT0gdm9pZCAwID8gZmFsc2UgOiBzOS5zbG9wcHlSYW5nZXMsICFbImF1dG8iLCAiNS1wYXJ0IiwgIjYtcGFydCIsICI3LXBhcnQiLCAiNS1vci02LXBhcnRzIiwgIjYtb3ItNy1wYXJ0cyJdLmluY2x1ZGVzKHM5Lm1vZGUpKSB0aHJvdyBuZXcgRXJyb3IoIkNyb25PcHRpb25zOiBtb2RlIG11c3QgYmUgb25lIG9mICdhdXRvJywgJzUtcGFydCcsICc2LXBhcnQnLCAnNy1wYXJ0JywgJzUtb3ItNi1wYXJ0cycsIG9yICc2LW9yLTctcGFydHMnLiIpOwogIGlmIChzOS5zdGFydEF0ICYmIChzOS5zdGFydEF0ID0gbmV3IG0yKHM5LnN0YXJ0QXQsIHM5LnRpbWV6b25lKSksIHM5LnN0b3BBdCAmJiAoczkuc3RvcEF0ID0gbmV3IG0yKHM5LnN0b3BBdCwgczkudGltZXpvbmUpKSwgczkuaW50ZXJ2YWwgIT09IG51bGwpIHsKICAgIGlmIChpc05hTihzOS5pbnRlcnZhbCkpIHRocm93IG5ldyBFcnJvcigiQ3Jvbk9wdGlvbnM6IFN1cHBsaWVkIHZhbHVlIGZvciBpbnRlcnZhbCBpcyBub3QgYSBudW1iZXIiKTsKICAgIGlmIChzOS5pbnRlcnZhbCA8IDApIHRocm93IG5ldyBFcnJvcigiQ3Jvbk9wdGlvbnM6IFN1cHBsaWVkIHZhbHVlIGZvciBpbnRlcnZhbCBjYW4gbm90IGJlIG5lZ2F0aXZlIik7CiAgfQogIGlmIChzOS51dGNPZmZzZXQgIT09IHZvaWQgMCkgewogICAgaWYgKGlzTmFOKHM5LnV0Y09mZnNldCkpIHRocm93IG5ldyBFcnJvcigiQ3Jvbk9wdGlvbnM6IEludmFsaWQgdmFsdWUgcGFzc2VkIGZvciB1dGNPZmZzZXQsIHNob3VsZCBiZSBudW1iZXIgcmVwcmVzZW50aW5nIG1pbnV0ZXMgb2Zmc2V0IGZyb20gVVRDLiIpOwogICAgaWYgKHM5LnV0Y09mZnNldCA8IC04NzAgfHwgczkudXRjT2Zmc2V0ID4gODcwKSB0aHJvdyBuZXcgRXJyb3IoIkNyb25PcHRpb25zOiB1dGNPZmZzZXQgb3V0IG9mIGJvdW5kcy4iKTsKICAgIGlmIChzOS51dGNPZmZzZXQgIT09IHZvaWQgMCAmJiBzOS50aW1lem9uZSkgdGhyb3cgbmV3IEVycm9yKCJDcm9uT3B0aW9uczogQ29tYmluaW5nICd1dGNPZmZzZXQnIHdpdGggJ3RpbWV6b25lJyBpcyBub3QgYWxsb3dlZC4iKTsKICB9CiAgaWYgKHM5LnVucmVmICE9PSB0cnVlICYmIHM5LnVucmVmICE9PSBmYWxzZSkgdGhyb3cgbmV3IEVycm9yKCJDcm9uT3B0aW9uczogVW5yZWYgc2hvdWxkIGJlIGVpdGhlciB0cnVlLCBmYWxzZSBvciB1bmRlZmluZWQoZmFsc2UpLiIpOwogIGlmIChzOS5kYXlPZmZzZXQgIT09IHZvaWQgMCAmJiBzOS5kYXlPZmZzZXQgIT09IDAgJiYgaXNOYU4oczkuZGF5T2Zmc2V0KSkgdGhyb3cgbmV3IEVycm9yKCJDcm9uT3B0aW9uczogSW52YWxpZCB2YWx1ZSBwYXNzZWQgZm9yIGRheU9mZnNldCwgc2hvdWxkIGJlIGEgbnVtYmVyIHJlcHJlc2VudGluZyBkYXlzIHRvIG9mZnNldC4iKTsKICByZXR1cm4gczk7Cn0KX19uYW1lKFIyLCAiUiIpOwpmdW5jdGlvbiBwMyhzOSkgewogIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoczkpID09PSAiW29iamVjdCBGdW5jdGlvbl0iIHx8IHR5cGVvZiBzOSA9PSAiZnVuY3Rpb24iIHx8IHM5IGluc3RhbmNlb2YgRnVuY3Rpb247Cn0KX19uYW1lKHAzLCAicCIpOwpmdW5jdGlvbiBfMihzOSkgewogIHJldHVybiBwMyhzOSk7Cn0KX19uYW1lKF8yLCAiXyIpOwpmdW5jdGlvbiB4MihzOSkgewogIHR5cGVvZiBEZW5vIDwgInUiICYmIHR5cGVvZiBEZW5vLnVucmVmVGltZXIgPCAidSIgPyBEZW5vLnVucmVmVGltZXIoczkpIDogczkgJiYgdHlwZW9mIHM5LnVucmVmIDwgInUiICYmIHM5LnVucmVmKCk7Cn0KX19uYW1lKHgyLCAieCIpOwp2YXIgVyA9IDMwICogMWUzLCB3MiA9IFtdLCBFMiA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJFIik7CiAgfQogIG5hbWU7CiAgb3B0aW9uczsKICBfc3RhdGVzOwogIGZuOwogIGdldFR6KCkgewogICAgcmV0dXJuIHRoaXMub3B0aW9ucy50aW1lem9uZSB8fCB0aGlzLm9wdGlvbnMudXRjT2Zmc2V0OwogIH0KICBhcHBseURheU9mZnNldChlMTApIHsKICAgIGlmICh0aGlzLm9wdGlvbnMuZGF5T2Zmc2V0ICE9PSB2b2lkIDAgJiYgdGhpcy5vcHRpb25zLmRheU9mZnNldCAhPT0gMCkgewogICAgICBsZXQgdDggPSB0aGlzLm9wdGlvbnMuZGF5T2Zmc2V0ICogMjQgKiA2MCAqIDYwICogMWUzOwogICAgICByZXR1cm4gbmV3IERhdGUoZTEwLmdldFRpbWUoKSArIHQ4KTsKICAgIH0KICAgIHJldHVybiBlMTA7CiAgfQogIGNvbnN0cnVjdG9yKGUxMCwgdDgsIHIxMCkgewogICAgbGV0IG4xMSwgaTEwOwogICAgaWYgKHAzKHQ4KSkgaTEwID0gdDg7CiAgICBlbHNlIGlmICh0eXBlb2YgdDggPT0gIm9iamVjdCIpIG4xMSA9IHQ4OwogICAgZWxzZSBpZiAodDggIT09IHZvaWQgMCkgdGhyb3cgbmV3IEVycm9yKCJDcm9uOiBJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCBmb3Igb3B0aW9uc0luLiBTaG91bGQgYmUgb25lIG9mIGZ1bmN0aW9uLCBvciBvYmplY3QgKG9wdGlvbnMpLiIpOwogICAgaWYgKHAzKHIxMCkpIGkxMCA9IHIxMDsKICAgIGVsc2UgaWYgKHR5cGVvZiByMTAgPT0gIm9iamVjdCIpIG4xMSA9IHIxMDsKICAgIGVsc2UgaWYgKHIxMCAhPT0gdm9pZCAwKSB0aHJvdyBuZXcgRXJyb3IoIkNyb246IEludmFsaWQgYXJndW1lbnQgcGFzc2VkIGZvciBmdW5jSW4uIFNob3VsZCBiZSBvbmUgb2YgZnVuY3Rpb24sIG9yIG9iamVjdCAob3B0aW9ucykuIik7CiAgICBpZiAodGhpcy5uYW1lID0gbjExPy5uYW1lLCB0aGlzLm9wdGlvbnMgPSBSMihuMTEpLCB0aGlzLl9zdGF0ZXMgPSB7IGtpbGw6IGZhbHNlLCBibG9ja2luZzogZmFsc2UsIHByZXZpb3VzUnVuOiB2b2lkIDAsIGN1cnJlbnRSdW46IHZvaWQgMCwgb25jZTogdm9pZCAwLCBjdXJyZW50VGltZW91dDogdm9pZCAwLCBtYXhSdW5zOiBuMTEgPyBuMTEubWF4UnVucyA6IHZvaWQgMCwgcGF1c2VkOiBuMTEgPyBuMTEucGF1c2VkIDogZmFsc2UsIHBhdHRlcm46IG5ldyBDMigiKiAqICogKiAqIiwgdm9pZCAwLCB7IG1vZGU6ICJhdXRvIiB9KSB9LCBlMTAgJiYgKGUxMCBpbnN0YW5jZW9mIERhdGUgfHwgdHlwZW9mIGUxMCA9PSAic3RyaW5nIiAmJiBlMTAuaW5kZXhPZigiOiIpID4gMCkgPyB0aGlzLl9zdGF0ZXMub25jZSA9IG5ldyBtMihlMTAsIHRoaXMuZ2V0VHooKSkgOiB0aGlzLl9zdGF0ZXMucGF0dGVybiA9IG5ldyBDMihlMTAsIHRoaXMub3B0aW9ucy50aW1lem9uZSwgeyBtb2RlOiB0aGlzLm9wdGlvbnMubW9kZSwgYWx0ZXJuYXRpdmVXZWVrZGF5czogdGhpcy5vcHRpb25zLmFsdGVybmF0aXZlV2Vla2RheXMsIHNsb3BweVJhbmdlczogdGhpcy5vcHRpb25zLnNsb3BweVJhbmdlcyB9KSwgdGhpcy5uYW1lKSB7CiAgICAgIGlmICh3Mi5maW5kKChvMTIpID0+IG8xMi5uYW1lID09PSB0aGlzLm5hbWUpKSB0aHJvdyBuZXcgRXJyb3IoIkNyb246IFRyaWVkIHRvIGluaXRpYWxpemUgbmV3IG5hbWVkIGpvYiAnIiArIHRoaXMubmFtZSArICInLCBidXQgbmFtZSBhbHJlYWR5IHRha2VuLiIpOwogICAgICB3Mi5wdXNoKHRoaXMpOwogICAgfQogICAgcmV0dXJuIGkxMCAhPT0gdm9pZCAwICYmIF8yKGkxMCkgJiYgKHRoaXMuZm4gPSBpMTAsIHRoaXMuc2NoZWR1bGUoKSksIHRoaXM7CiAgfQogIG5leHRSdW4oZTEwKSB7CiAgICBsZXQgdDggPSB0aGlzLl9uZXh0KGUxMCk7CiAgICByZXR1cm4gdDggPyB0aGlzLmFwcGx5RGF5T2Zmc2V0KHQ4LmdldERhdGUoZmFsc2UpKSA6IG51bGw7CiAgfQogIG5leHRSdW5zKGUxMCwgdDgpIHsKICAgIHRoaXMuX3N0YXRlcy5tYXhSdW5zICE9PSB2b2lkIDAgJiYgZTEwID4gdGhpcy5fc3RhdGVzLm1heFJ1bnMgJiYgKGUxMCA9IHRoaXMuX3N0YXRlcy5tYXhSdW5zKTsKICAgIGxldCByMTAgPSB0OCB8fCB0aGlzLl9zdGF0ZXMuY3VycmVudFJ1biB8fCB2b2lkIDA7CiAgICByZXR1cm4gdGhpcy5fZW51bWVyYXRlUnVucyhlMTAsIHIxMCwgIm5leHQiKTsKICB9CiAgcHJldmlvdXNSdW5zKGUxMCwgdDgpIHsKICAgIHJldHVybiB0aGlzLl9lbnVtZXJhdGVSdW5zKGUxMCwgdDggfHwgdm9pZCAwLCAicHJldmlvdXMiKTsKICB9CiAgX2VudW1lcmF0ZVJ1bnMoZTEwLCB0OCwgcjEwKSB7CiAgICBsZXQgbjExID0gW10sIGkxMCA9IHQ4ID8gbmV3IG0yKHQ4LCB0aGlzLmdldFR6KCkpIDogbnVsbCwgYTQgPSByMTAgPT09ICJuZXh0IiA/IHRoaXMuX25leHQgOiB0aGlzLl9wcmV2aW91czsKICAgIGZvciAoOyBlMTAtLTsgKSB7CiAgICAgIGxldCBvMTIgPSBhNC5jYWxsKHRoaXMsIGkxMCk7CiAgICAgIGlmICghbzEyKSBicmVhazsKICAgICAgbGV0IGg3ID0gbzEyLmdldERhdGUoZmFsc2UpOwogICAgICBuMTEucHVzaCh0aGlzLmFwcGx5RGF5T2Zmc2V0KGg3KSksIGkxMCA9IG8xMjsKICAgIH0KICAgIHJldHVybiBuMTE7CiAgfQogIG1hdGNoKGUxMCkgewogICAgaWYgKHRoaXMuX3N0YXRlcy5vbmNlKSB7CiAgICAgIGxldCByMTAgPSBuZXcgbTIoZTEwLCB0aGlzLmdldFR6KCkpOwogICAgICByMTAubXMgPSAwOwogICAgICBsZXQgbjExID0gbmV3IG0yKHRoaXMuX3N0YXRlcy5vbmNlLCB0aGlzLmdldFR6KCkpOwogICAgICByZXR1cm4gbjExLm1zID0gMCwgcjEwLmdldFRpbWUoKSA9PT0gbjExLmdldFRpbWUoKTsKICAgIH0KICAgIGxldCB0OCA9IG5ldyBtMihlMTAsIHRoaXMuZ2V0VHooKSk7CiAgICByZXR1cm4gdDgubXMgPSAwLCB0OC5tYXRjaCh0aGlzLl9zdGF0ZXMucGF0dGVybiwgdGhpcy5vcHRpb25zKTsKICB9CiAgZ2V0UGF0dGVybigpIHsKICAgIGlmICghdGhpcy5fc3RhdGVzLm9uY2UpIHJldHVybiB0aGlzLl9zdGF0ZXMucGF0dGVybiA/IHRoaXMuX3N0YXRlcy5wYXR0ZXJuLnBhdHRlcm4gOiB2b2lkIDA7CiAgfQogIGdldE9uY2UoKSB7CiAgICByZXR1cm4gdGhpcy5fc3RhdGVzLm9uY2UgPyB0aGlzLl9zdGF0ZXMub25jZS5nZXREYXRlKCkgOiBudWxsOwogIH0KICBpc1J1bm5pbmcoKSB7CiAgICBsZXQgZTEwID0gdGhpcy5uZXh0UnVuKHRoaXMuX3N0YXRlcy5jdXJyZW50UnVuKSwgdDggPSAhdGhpcy5fc3RhdGVzLnBhdXNlZCwgcjEwID0gdGhpcy5mbiAhPT0gdm9pZCAwLCBuMTEgPSAhdGhpcy5fc3RhdGVzLmtpbGw7CiAgICByZXR1cm4gdDggJiYgcjEwICYmIG4xMSAmJiBlMTAgIT09IG51bGw7CiAgfQogIGlzU3RvcHBlZCgpIHsKICAgIHJldHVybiB0aGlzLl9zdGF0ZXMua2lsbDsKICB9CiAgaXNCdXN5KCkgewogICAgcmV0dXJuIHRoaXMuX3N0YXRlcy5ibG9ja2luZzsKICB9CiAgY3VycmVudFJ1bigpIHsKICAgIHJldHVybiB0aGlzLl9zdGF0ZXMuY3VycmVudFJ1biA/IHRoaXMuX3N0YXRlcy5jdXJyZW50UnVuLmdldERhdGUoKSA6IG51bGw7CiAgfQogIHByZXZpb3VzUnVuKCkgewogICAgcmV0dXJuIHRoaXMuX3N0YXRlcy5wcmV2aW91c1J1biA/IHRoaXMuX3N0YXRlcy5wcmV2aW91c1J1bi5nZXREYXRlKCkgOiBudWxsOwogIH0KICBtc1RvTmV4dChlMTApIHsKICAgIGxldCB0OCA9IHRoaXMuX25leHQoZTEwKTsKICAgIHJldHVybiB0OCA/IGUxMCBpbnN0YW5jZW9mIG0yIHx8IGUxMCBpbnN0YW5jZW9mIERhdGUgPyB0OC5nZXRUaW1lKCkgLSBlMTAuZ2V0VGltZSgpIDogdDguZ2V0VGltZSgpIC0gbmV3IG0yKGUxMCkuZ2V0VGltZSgpIDogbnVsbDsKICB9CiAgc3RvcCgpIHsKICAgIHRoaXMuX3N0YXRlcy5raWxsID0gdHJ1ZSwgdGhpcy5fc3RhdGVzLmN1cnJlbnRUaW1lb3V0ICYmIGNsZWFyVGltZW91dCh0aGlzLl9zdGF0ZXMuY3VycmVudFRpbWVvdXQpOwogICAgbGV0IGUxMCA9IHcyLmluZGV4T2YodGhpcyk7CiAgICBlMTAgPj0gMCAmJiB3Mi5zcGxpY2UoZTEwLCAxKTsKICB9CiAgcGF1c2UoKSB7CiAgICByZXR1cm4gdGhpcy5fc3RhdGVzLnBhdXNlZCA9IHRydWUsICF0aGlzLl9zdGF0ZXMua2lsbDsKICB9CiAgcmVzdW1lKCkgewogICAgcmV0dXJuIHRoaXMuX3N0YXRlcy5wYXVzZWQgPSBmYWxzZSwgIXRoaXMuX3N0YXRlcy5raWxsOwogIH0KICBzY2hlZHVsZShlMTApIHsKICAgIGlmIChlMTAgJiYgdGhpcy5mbikgdGhyb3cgbmV3IEVycm9yKCJDcm9uOiBJdCBpcyBub3QgYWxsb3dlZCB0byBzY2hlZHVsZSB0d28gZnVuY3Rpb25zIHVzaW5nIHRoZSBzYW1lIENyb25lciBpbnN0YW5jZS4iKTsKICAgIGUxMCAmJiAodGhpcy5mbiA9IGUxMCk7CiAgICBsZXQgdDggPSB0aGlzLm1zVG9OZXh0KCksIHIxMCA9IHRoaXMubmV4dFJ1bih0aGlzLl9zdGF0ZXMuY3VycmVudFJ1bik7CiAgICByZXR1cm4gdDggPT0gbnVsbCB8fCBpc05hTih0OCkgfHwgcjEwID09PSBudWxsID8gdGhpcyA6ICh0OCA+IFcgJiYgKHQ4ID0gVyksIHRoaXMuX3N0YXRlcy5jdXJyZW50VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5fY2hlY2tUcmlnZ2VyKHIxMCksIHQ4KSwgdGhpcy5fc3RhdGVzLmN1cnJlbnRUaW1lb3V0ICYmIHRoaXMub3B0aW9ucy51bnJlZiAmJiB4Mih0aGlzLl9zdGF0ZXMuY3VycmVudFRpbWVvdXQpLCB0aGlzKTsKICB9CiAgYXN5bmMgX3RyaWdnZXIoZTEwKSB7CiAgICB0aGlzLl9zdGF0ZXMuYmxvY2tpbmcgPSB0cnVlLCB0aGlzLl9zdGF0ZXMuY3VycmVudFJ1biA9IG5ldyBtMih2b2lkIDAsIHRoaXMuZ2V0VHooKSk7CiAgICB0cnkgewogICAgICBpZiAodGhpcy5vcHRpb25zLmNhdGNoKSB0cnkgewogICAgICAgIHRoaXMuZm4gIT09IHZvaWQgMCAmJiBhd2FpdCB0aGlzLmZuKHRoaXMsIHRoaXMub3B0aW9ucy5jb250ZXh0KTsKICAgICAgfSBjYXRjaCAodDgpIHsKICAgICAgICBpZiAocDModGhpcy5vcHRpb25zLmNhdGNoKSkgdHJ5IHsKICAgICAgICAgIHRoaXMub3B0aW9ucy5jYXRjaCh0OCwgdGhpcyk7CiAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgfQogICAgICB9CiAgICAgIGVsc2UgdGhpcy5mbiAhPT0gdm9pZCAwICYmIGF3YWl0IHRoaXMuZm4odGhpcywgdGhpcy5vcHRpb25zLmNvbnRleHQpOwogICAgfSBmaW5hbGx5IHsKICAgICAgdGhpcy5fc3RhdGVzLnByZXZpb3VzUnVuID0gbmV3IG0yKGUxMCwgdGhpcy5nZXRUeigpKSwgdGhpcy5fc3RhdGVzLmJsb2NraW5nID0gZmFsc2U7CiAgICB9CiAgfQogIGFzeW5jIHRyaWdnZXIoKSB7CiAgICBhd2FpdCB0aGlzLl90cmlnZ2VyKCk7CiAgfQogIHJ1bnNMZWZ0KCkgewogICAgcmV0dXJuIHRoaXMuX3N0YXRlcy5tYXhSdW5zOwogIH0KICBfY2hlY2tUcmlnZ2VyKGUxMCkgewogICAgbGV0IHQ4ID0gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCksIHIxMCA9ICF0aGlzLl9zdGF0ZXMucGF1c2VkICYmIHQ4LmdldFRpbWUoKSA+PSBlMTAuZ2V0VGltZSgpLCBuMTEgPSB0aGlzLl9zdGF0ZXMuYmxvY2tpbmcgJiYgdGhpcy5vcHRpb25zLnByb3RlY3Q7CiAgICByMTAgJiYgIW4xMSA/ICh0aGlzLl9zdGF0ZXMubWF4UnVucyAhPT0gdm9pZCAwICYmIHRoaXMuX3N0YXRlcy5tYXhSdW5zLS0sIHRoaXMuX3RyaWdnZXIoKSkgOiByMTAgJiYgbjExICYmIHAzKHRoaXMub3B0aW9ucy5wcm90ZWN0KSAmJiBzZXRUaW1lb3V0KCgpID0+IHRoaXMub3B0aW9ucy5wcm90ZWN0KHRoaXMpLCAwKSwgdGhpcy5zY2hlZHVsZSgpOwogIH0KICBfbmV4dChlMTApIHsKICAgIGxldCB0OCA9ICEhKGUxMCB8fCB0aGlzLl9zdGF0ZXMuY3VycmVudFJ1biksIHIxMCA9IGZhbHNlOwogICAgIWUxMCAmJiB0aGlzLm9wdGlvbnMuc3RhcnRBdCAmJiB0aGlzLm9wdGlvbnMuaW50ZXJ2YWwgJiYgKFtlMTAsIHQ4XSA9IHRoaXMuX2NhbGN1bGF0ZVByZXZpb3VzUnVuKGUxMCwgdDgpLCByMTAgPSAhZTEwKSwgZTEwID0gbmV3IG0yKGUxMCwgdGhpcy5nZXRUeigpKSwgdGhpcy5vcHRpb25zLnN0YXJ0QXQgJiYgZTEwICYmIGUxMC5nZXRUaW1lKCkgPCB0aGlzLm9wdGlvbnMuc3RhcnRBdC5nZXRUaW1lKCkgJiYgKGUxMCA9IHRoaXMub3B0aW9ucy5zdGFydEF0KTsKICAgIGxldCBuMTEgPSB0aGlzLl9zdGF0ZXMub25jZSB8fCBuZXcgbTIoZTEwLCB0aGlzLmdldFR6KCkpOwogICAgcmV0dXJuICFyMTAgJiYgbjExICE9PSB0aGlzLl9zdGF0ZXMub25jZSAmJiAobjExID0gbjExLmluY3JlbWVudCh0aGlzLl9zdGF0ZXMucGF0dGVybiwgdGhpcy5vcHRpb25zLCB0OCkpLCB0aGlzLl9zdGF0ZXMub25jZSAmJiB0aGlzLl9zdGF0ZXMub25jZS5nZXRUaW1lKCkgPD0gZTEwLmdldFRpbWUoKSB8fCBuMTEgPT09IG51bGwgfHwgdGhpcy5fc3RhdGVzLm1heFJ1bnMgIT09IHZvaWQgMCAmJiB0aGlzLl9zdGF0ZXMubWF4UnVucyA8PSAwIHx8IHRoaXMuX3N0YXRlcy5raWxsIHx8IHRoaXMub3B0aW9ucy5zdG9wQXQgJiYgbjExLmdldFRpbWUoKSA+PSB0aGlzLm9wdGlvbnMuc3RvcEF0LmdldFRpbWUoKSA/IG51bGwgOiBuMTE7CiAgfQogIF9wcmV2aW91cyhlMTApIHsKICAgIGxldCB0OCA9IG5ldyBtMihlMTAsIHRoaXMuZ2V0VHooKSk7CiAgICB0aGlzLm9wdGlvbnMuc3RvcEF0ICYmIHQ4LmdldFRpbWUoKSA+IHRoaXMub3B0aW9ucy5zdG9wQXQuZ2V0VGltZSgpICYmICh0OCA9IHRoaXMub3B0aW9ucy5zdG9wQXQpOwogICAgbGV0IHIxMCA9IG5ldyBtMih0OCwgdGhpcy5nZXRUeigpKTsKICAgIHJldHVybiB0aGlzLl9zdGF0ZXMub25jZSA/IHRoaXMuX3N0YXRlcy5vbmNlLmdldFRpbWUoKSA8IHQ4LmdldFRpbWUoKSA/IHRoaXMuX3N0YXRlcy5vbmNlIDogbnVsbCA6IChyMTAgPSByMTAuZGVjcmVtZW50KHRoaXMuX3N0YXRlcy5wYXR0ZXJuLCB0aGlzLm9wdGlvbnMpLCByMTAgPT09IG51bGwgfHwgdGhpcy5vcHRpb25zLnN0YXJ0QXQgJiYgcjEwLmdldFRpbWUoKSA8IHRoaXMub3B0aW9ucy5zdGFydEF0LmdldFRpbWUoKSA/IG51bGwgOiByMTApOwogIH0KICBfY2FsY3VsYXRlUHJldmlvdXNSdW4oZTEwLCB0OCkgewogICAgbGV0IHIxMCA9IG5ldyBtMih2b2lkIDAsIHRoaXMuZ2V0VHooKSksIG4xMSA9IGUxMDsKICAgIGlmICh0aGlzLm9wdGlvbnMuc3RhcnRBdC5nZXRUaW1lKCkgPD0gcjEwLmdldFRpbWUoKSkgewogICAgICBuMTEgPSB0aGlzLm9wdGlvbnMuc3RhcnRBdDsKICAgICAgbGV0IGkxMCA9IG4xMS5nZXRUaW1lKCkgKyB0aGlzLm9wdGlvbnMuaW50ZXJ2YWwgKiAxZTM7CiAgICAgIGZvciAoOyBpMTAgPD0gcjEwLmdldFRpbWUoKTsgKSBuMTEgPSBuZXcgbTIobjExLCB0aGlzLmdldFR6KCkpLmluY3JlbWVudCh0aGlzLl9zdGF0ZXMucGF0dGVybiwgdGhpcy5vcHRpb25zLCB0cnVlKSwgaTEwID0gbjExLmdldFRpbWUoKSArIHRoaXMub3B0aW9ucy5pbnRlcnZhbCAqIDFlMzsKICAgICAgdDggPSB0cnVlOwogICAgfQogICAgcmV0dXJuIG4xMSA9PT0gbnVsbCAmJiAobjExID0gdm9pZCAwKSwgW24xMSwgdDhdOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaW5kZXguanMKdmFyIGRhdGVfZm5zX2V4cG9ydHMgPSB7fTsKX19leHBvcnQoZGF0ZV9mbnNfZXhwb3J0cywgewogIGFkZDogKCkgPT4gYWRkLAogIGFkZEJ1c2luZXNzRGF5czogKCkgPT4gYWRkQnVzaW5lc3NEYXlzLAogIGFkZERheXM6ICgpID0+IGFkZERheXMsCiAgYWRkSG91cnM6ICgpID0+IGFkZEhvdXJzLAogIGFkZElTT1dlZWtZZWFyczogKCkgPT4gYWRkSVNPV2Vla1llYXJzLAogIGFkZE1pbGxpc2Vjb25kczogKCkgPT4gYWRkTWlsbGlzZWNvbmRzLAogIGFkZE1pbnV0ZXM6ICgpID0+IGFkZE1pbnV0ZXMsCiAgYWRkTW9udGhzOiAoKSA9PiBhZGRNb250aHMsCiAgYWRkUXVhcnRlcnM6ICgpID0+IGFkZFF1YXJ0ZXJzLAogIGFkZFNlY29uZHM6ICgpID0+IGFkZFNlY29uZHMsCiAgYWRkV2Vla3M6ICgpID0+IGFkZFdlZWtzLAogIGFkZFllYXJzOiAoKSA9PiBhZGRZZWFycywKICBhcmVJbnRlcnZhbHNPdmVybGFwcGluZzogKCkgPT4gYXJlSW50ZXJ2YWxzT3ZlcmxhcHBpbmcsCiAgY2xhbXA6ICgpID0+IGNsYW1wLAogIGNsb3Nlc3RJbmRleFRvOiAoKSA9PiBjbG9zZXN0SW5kZXhUbywKICBjbG9zZXN0VG86ICgpID0+IGNsb3Nlc3RUbywKICBjb21wYXJlQXNjOiAoKSA9PiBjb21wYXJlQXNjLAogIGNvbXBhcmVEZXNjOiAoKSA9PiBjb21wYXJlRGVzYywKICBjb25zdHJ1Y3RGcm9tOiAoKSA9PiBjb25zdHJ1Y3RGcm9tLAogIGNvbnN0cnVjdE5vdzogKCkgPT4gY29uc3RydWN0Tm93LAogIGRheXNUb1dlZWtzOiAoKSA9PiBkYXlzVG9XZWVrcywKICBkaWZmZXJlbmNlSW5CdXNpbmVzc0RheXM6ICgpID0+IGRpZmZlcmVuY2VJbkJ1c2luZXNzRGF5cywKICBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXM6ICgpID0+IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cywKICBkaWZmZXJlbmNlSW5DYWxlbmRhcklTT1dlZWtZZWFyczogKCkgPT4gZGlmZmVyZW5jZUluQ2FsZW5kYXJJU09XZWVrWWVhcnMsCiAgZGlmZmVyZW5jZUluQ2FsZW5kYXJJU09XZWVrczogKCkgPT4gZGlmZmVyZW5jZUluQ2FsZW5kYXJJU09XZWVrcywKICBkaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRoczogKCkgPT4gZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMsCiAgZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVyczogKCkgPT4gZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVycywKICBkaWZmZXJlbmNlSW5DYWxlbmRhcldlZWtzOiAoKSA9PiBkaWZmZXJlbmNlSW5DYWxlbmRhcldlZWtzLAogIGRpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnM6ICgpID0+IGRpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnMsCiAgZGlmZmVyZW5jZUluRGF5czogKCkgPT4gZGlmZmVyZW5jZUluRGF5cywKICBkaWZmZXJlbmNlSW5Ib3VyczogKCkgPT4gZGlmZmVyZW5jZUluSG91cnMsCiAgZGlmZmVyZW5jZUluSVNPV2Vla1llYXJzOiAoKSA9PiBkaWZmZXJlbmNlSW5JU09XZWVrWWVhcnMsCiAgZGlmZmVyZW5jZUluTWlsbGlzZWNvbmRzOiAoKSA9PiBkaWZmZXJlbmNlSW5NaWxsaXNlY29uZHMsCiAgZGlmZmVyZW5jZUluTWludXRlczogKCkgPT4gZGlmZmVyZW5jZUluTWludXRlcywKICBkaWZmZXJlbmNlSW5Nb250aHM6ICgpID0+IGRpZmZlcmVuY2VJbk1vbnRocywKICBkaWZmZXJlbmNlSW5RdWFydGVyczogKCkgPT4gZGlmZmVyZW5jZUluUXVhcnRlcnMsCiAgZGlmZmVyZW5jZUluU2Vjb25kczogKCkgPT4gZGlmZmVyZW5jZUluU2Vjb25kcywKICBkaWZmZXJlbmNlSW5XZWVrczogKCkgPT4gZGlmZmVyZW5jZUluV2Vla3MsCiAgZGlmZmVyZW5jZUluWWVhcnM6ICgpID0+IGRpZmZlcmVuY2VJblllYXJzLAogIGVhY2hEYXlPZkludGVydmFsOiAoKSA9PiBlYWNoRGF5T2ZJbnRlcnZhbCwKICBlYWNoSG91ck9mSW50ZXJ2YWw6ICgpID0+IGVhY2hIb3VyT2ZJbnRlcnZhbCwKICBlYWNoTWludXRlT2ZJbnRlcnZhbDogKCkgPT4gZWFjaE1pbnV0ZU9mSW50ZXJ2YWwsCiAgZWFjaE1vbnRoT2ZJbnRlcnZhbDogKCkgPT4gZWFjaE1vbnRoT2ZJbnRlcnZhbCwKICBlYWNoUXVhcnRlck9mSW50ZXJ2YWw6ICgpID0+IGVhY2hRdWFydGVyT2ZJbnRlcnZhbCwKICBlYWNoV2Vla09mSW50ZXJ2YWw6ICgpID0+IGVhY2hXZWVrT2ZJbnRlcnZhbCwKICBlYWNoV2Vla2VuZE9mSW50ZXJ2YWw6ICgpID0+IGVhY2hXZWVrZW5kT2ZJbnRlcnZhbCwKICBlYWNoV2Vla2VuZE9mTW9udGg6ICgpID0+IGVhY2hXZWVrZW5kT2ZNb250aCwKICBlYWNoV2Vla2VuZE9mWWVhcjogKCkgPT4gZWFjaFdlZWtlbmRPZlllYXIsCiAgZWFjaFllYXJPZkludGVydmFsOiAoKSA9PiBlYWNoWWVhck9mSW50ZXJ2YWwsCiAgZW5kT2ZEYXk6ICgpID0+IGVuZE9mRGF5LAogIGVuZE9mRGVjYWRlOiAoKSA9PiBlbmRPZkRlY2FkZSwKICBlbmRPZkhvdXI6ICgpID0+IGVuZE9mSG91ciwKICBlbmRPZklTT1dlZWs6ICgpID0+IGVuZE9mSVNPV2VlaywKICBlbmRPZklTT1dlZWtZZWFyOiAoKSA9PiBlbmRPZklTT1dlZWtZZWFyLAogIGVuZE9mTWludXRlOiAoKSA9PiBlbmRPZk1pbnV0ZSwKICBlbmRPZk1vbnRoOiAoKSA9PiBlbmRPZk1vbnRoLAogIGVuZE9mUXVhcnRlcjogKCkgPT4gZW5kT2ZRdWFydGVyLAogIGVuZE9mU2Vjb25kOiAoKSA9PiBlbmRPZlNlY29uZCwKICBlbmRPZlRvZGF5OiAoKSA9PiBlbmRPZlRvZGF5LAogIGVuZE9mVG9tb3Jyb3c6ICgpID0+IGVuZE9mVG9tb3Jyb3csCiAgZW5kT2ZXZWVrOiAoKSA9PiBlbmRPZldlZWssCiAgZW5kT2ZZZWFyOiAoKSA9PiBlbmRPZlllYXIsCiAgZW5kT2ZZZXN0ZXJkYXk6ICgpID0+IGVuZE9mWWVzdGVyZGF5LAogIGZvcm1hdDogKCkgPT4gZm9ybWF0LAogIGZvcm1hdERhdGU6ICgpID0+IGZvcm1hdCwKICBmb3JtYXREaXN0YW5jZTogKCkgPT4gZm9ybWF0RGlzdGFuY2UyLAogIGZvcm1hdERpc3RhbmNlU3RyaWN0OiAoKSA9PiBmb3JtYXREaXN0YW5jZVN0cmljdCwKICBmb3JtYXREaXN0YW5jZVRvTm93OiAoKSA9PiBmb3JtYXREaXN0YW5jZVRvTm93LAogIGZvcm1hdERpc3RhbmNlVG9Ob3dTdHJpY3Q6ICgpID0+IGZvcm1hdERpc3RhbmNlVG9Ob3dTdHJpY3QsCiAgZm9ybWF0RHVyYXRpb246ICgpID0+IGZvcm1hdER1cmF0aW9uLAogIGZvcm1hdElTTzogKCkgPT4gZm9ybWF0SVNPLAogIGZvcm1hdElTTzkwNzU6ICgpID0+IGZvcm1hdElTTzkwNzUsCiAgZm9ybWF0SVNPRHVyYXRpb246ICgpID0+IGZvcm1hdElTT0R1cmF0aW9uLAogIGZvcm1hdFJGQzMzMzk6ICgpID0+IGZvcm1hdFJGQzMzMzksCiAgZm9ybWF0UkZDNzIzMTogKCkgPT4gZm9ybWF0UkZDNzIzMSwKICBmb3JtYXRSZWxhdGl2ZTogKCkgPT4gZm9ybWF0UmVsYXRpdmUyLAogIGZvcm1hdHRlcnM6ICgpID0+IGZvcm1hdHRlcnMsCiAgZnJvbVVuaXhUaW1lOiAoKSA9PiBmcm9tVW5peFRpbWUsCiAgZ2V0RGF0ZTogKCkgPT4gZ2V0RGF0ZSwKICBnZXREYXk6ICgpID0+IGdldERheSwKICBnZXREYXlPZlllYXI6ICgpID0+IGdldERheU9mWWVhciwKICBnZXREYXlzSW5Nb250aDogKCkgPT4gZ2V0RGF5c0luTW9udGgsCiAgZ2V0RGF5c0luWWVhcjogKCkgPT4gZ2V0RGF5c0luWWVhciwKICBnZXREZWNhZGU6ICgpID0+IGdldERlY2FkZSwKICBnZXREZWZhdWx0T3B0aW9uczogKCkgPT4gZ2V0RGVmYXVsdE9wdGlvbnMyLAogIGdldEhvdXJzOiAoKSA9PiBnZXRIb3VycywKICBnZXRJU09EYXk6ICgpID0+IGdldElTT0RheSwKICBnZXRJU09XZWVrOiAoKSA9PiBnZXRJU09XZWVrLAogIGdldElTT1dlZWtZZWFyOiAoKSA9PiBnZXRJU09XZWVrWWVhciwKICBnZXRJU09XZWVrc0luWWVhcjogKCkgPT4gZ2V0SVNPV2Vla3NJblllYXIsCiAgZ2V0TWlsbGlzZWNvbmRzOiAoKSA9PiBnZXRNaWxsaXNlY29uZHMsCiAgZ2V0TWludXRlczogKCkgPT4gZ2V0TWludXRlcywKICBnZXRNb250aDogKCkgPT4gZ2V0TW9udGgsCiAgZ2V0T3ZlcmxhcHBpbmdEYXlzSW5JbnRlcnZhbHM6ICgpID0+IGdldE92ZXJsYXBwaW5nRGF5c0luSW50ZXJ2YWxzLAogIGdldFF1YXJ0ZXI6ICgpID0+IGdldFF1YXJ0ZXIsCiAgZ2V0U2Vjb25kczogKCkgPT4gZ2V0U2Vjb25kcywKICBnZXRUaW1lOiAoKSA9PiBnZXRUaW1lLAogIGdldFVuaXhUaW1lOiAoKSA9PiBnZXRVbml4VGltZSwKICBnZXRXZWVrOiAoKSA9PiBnZXRXZWVrLAogIGdldFdlZWtPZk1vbnRoOiAoKSA9PiBnZXRXZWVrT2ZNb250aCwKICBnZXRXZWVrWWVhcjogKCkgPT4gZ2V0V2Vla1llYXIsCiAgZ2V0V2Vla3NJbk1vbnRoOiAoKSA9PiBnZXRXZWVrc0luTW9udGgsCiAgZ2V0WWVhcjogKCkgPT4gZ2V0WWVhciwKICBob3Vyc1RvTWlsbGlzZWNvbmRzOiAoKSA9PiBob3Vyc1RvTWlsbGlzZWNvbmRzLAogIGhvdXJzVG9NaW51dGVzOiAoKSA9PiBob3Vyc1RvTWludXRlcywKICBob3Vyc1RvU2Vjb25kczogKCkgPT4gaG91cnNUb1NlY29uZHMsCiAgaW50ZXJ2YWw6ICgpID0+IGludGVydmFsMiwKICBpbnRlcnZhbFRvRHVyYXRpb246ICgpID0+IGludGVydmFsVG9EdXJhdGlvbiwKICBpbnRsRm9ybWF0OiAoKSA9PiBpbnRsRm9ybWF0LAogIGludGxGb3JtYXREaXN0YW5jZTogKCkgPT4gaW50bEZvcm1hdERpc3RhbmNlLAogIGlzQWZ0ZXI6ICgpID0+IGlzQWZ0ZXIsCiAgaXNCZWZvcmU6ICgpID0+IGlzQmVmb3JlLAogIGlzRGF0ZTogKCkgPT4gaXNEYXRlLAogIGlzRXF1YWw6ICgpID0+IGlzRXF1YWwsCiAgaXNFeGlzdHM6ICgpID0+IGlzRXhpc3RzLAogIGlzRmlyc3REYXlPZk1vbnRoOiAoKSA9PiBpc0ZpcnN0RGF5T2ZNb250aCwKICBpc0ZyaWRheTogKCkgPT4gaXNGcmlkYXksCiAgaXNGdXR1cmU6ICgpID0+IGlzRnV0dXJlLAogIGlzTGFzdERheU9mTW9udGg6ICgpID0+IGlzTGFzdERheU9mTW9udGgsCiAgaXNMZWFwWWVhcjogKCkgPT4gaXNMZWFwWWVhciwKICBpc01hdGNoOiAoKSA9PiBpc01hdGNoMiwKICBpc01vbmRheTogKCkgPT4gaXNNb25kYXksCiAgaXNQYXN0OiAoKSA9PiBpc1Bhc3QsCiAgaXNTYW1lRGF5OiAoKSA9PiBpc1NhbWVEYXksCiAgaXNTYW1lSG91cjogKCkgPT4gaXNTYW1lSG91ciwKICBpc1NhbWVJU09XZWVrOiAoKSA9PiBpc1NhbWVJU09XZWVrLAogIGlzU2FtZUlTT1dlZWtZZWFyOiAoKSA9PiBpc1NhbWVJU09XZWVrWWVhciwKICBpc1NhbWVNaW51dGU6ICgpID0+IGlzU2FtZU1pbnV0ZSwKICBpc1NhbWVNb250aDogKCkgPT4gaXNTYW1lTW9udGgsCiAgaXNTYW1lUXVhcnRlcjogKCkgPT4gaXNTYW1lUXVhcnRlciwKICBpc1NhbWVTZWNvbmQ6ICgpID0+IGlzU2FtZVNlY29uZCwKICBpc1NhbWVXZWVrOiAoKSA9PiBpc1NhbWVXZWVrLAogIGlzU2FtZVllYXI6ICgpID0+IGlzU2FtZVllYXIsCiAgaXNTYXR1cmRheTogKCkgPT4gaXNTYXR1cmRheSwKICBpc1N1bmRheTogKCkgPT4gaXNTdW5kYXksCiAgaXNUaGlzSG91cjogKCkgPT4gaXNUaGlzSG91ciwKICBpc1RoaXNJU09XZWVrOiAoKSA9PiBpc1RoaXNJU09XZWVrLAogIGlzVGhpc01pbnV0ZTogKCkgPT4gaXNUaGlzTWludXRlLAogIGlzVGhpc01vbnRoOiAoKSA9PiBpc1RoaXNNb250aCwKICBpc1RoaXNRdWFydGVyOiAoKSA9PiBpc1RoaXNRdWFydGVyLAogIGlzVGhpc1NlY29uZDogKCkgPT4gaXNUaGlzU2Vjb25kLAogIGlzVGhpc1dlZWs6ICgpID0+IGlzVGhpc1dlZWssCiAgaXNUaGlzWWVhcjogKCkgPT4gaXNUaGlzWWVhciwKICBpc1RodXJzZGF5OiAoKSA9PiBpc1RodXJzZGF5LAogIGlzVG9kYXk6ICgpID0+IGlzVG9kYXksCiAgaXNUb21vcnJvdzogKCkgPT4gaXNUb21vcnJvdywKICBpc1R1ZXNkYXk6ICgpID0+IGlzVHVlc2RheSwKICBpc1ZhbGlkOiAoKSA9PiBpc1ZhbGlkLAogIGlzV2VkbmVzZGF5OiAoKSA9PiBpc1dlZG5lc2RheSwKICBpc1dlZWtlbmQ6ICgpID0+IGlzV2Vla2VuZCwKICBpc1dpdGhpbkludGVydmFsOiAoKSA9PiBpc1dpdGhpbkludGVydmFsLAogIGlzWWVzdGVyZGF5OiAoKSA9PiBpc1llc3RlcmRheSwKICBsYXN0RGF5T2ZEZWNhZGU6ICgpID0+IGxhc3REYXlPZkRlY2FkZSwKICBsYXN0RGF5T2ZJU09XZWVrOiAoKSA9PiBsYXN0RGF5T2ZJU09XZWVrLAogIGxhc3REYXlPZklTT1dlZWtZZWFyOiAoKSA9PiBsYXN0RGF5T2ZJU09XZWVrWWVhciwKICBsYXN0RGF5T2ZNb250aDogKCkgPT4gbGFzdERheU9mTW9udGgsCiAgbGFzdERheU9mUXVhcnRlcjogKCkgPT4gbGFzdERheU9mUXVhcnRlciwKICBsYXN0RGF5T2ZXZWVrOiAoKSA9PiBsYXN0RGF5T2ZXZWVrLAogIGxhc3REYXlPZlllYXI6ICgpID0+IGxhc3REYXlPZlllYXIsCiAgbGlnaHRGb3JtYXQ6ICgpID0+IGxpZ2h0Rm9ybWF0LAogIGxpZ2h0Rm9ybWF0dGVyczogKCkgPT4gbGlnaHRGb3JtYXR0ZXJzLAogIGxvbmdGb3JtYXR0ZXJzOiAoKSA9PiBsb25nRm9ybWF0dGVycywKICBtYXg6ICgpID0+IG1heDIsCiAgbWlsbGlzZWNvbmRzOiAoKSA9PiBtaWxsaXNlY29uZHMsCiAgbWlsbGlzZWNvbmRzVG9Ib3VyczogKCkgPT4gbWlsbGlzZWNvbmRzVG9Ib3VycywKICBtaWxsaXNlY29uZHNUb01pbnV0ZXM6ICgpID0+IG1pbGxpc2Vjb25kc1RvTWludXRlcywKICBtaWxsaXNlY29uZHNUb1NlY29uZHM6ICgpID0+IG1pbGxpc2Vjb25kc1RvU2Vjb25kcywKICBtaW46ICgpID0+IG1pbjIsCiAgbWludXRlc1RvSG91cnM6ICgpID0+IG1pbnV0ZXNUb0hvdXJzLAogIG1pbnV0ZXNUb01pbGxpc2Vjb25kczogKCkgPT4gbWludXRlc1RvTWlsbGlzZWNvbmRzLAogIG1pbnV0ZXNUb1NlY29uZHM6ICgpID0+IG1pbnV0ZXNUb1NlY29uZHMsCiAgbW9udGhzVG9RdWFydGVyczogKCkgPT4gbW9udGhzVG9RdWFydGVycywKICBtb250aHNUb1llYXJzOiAoKSA9PiBtb250aHNUb1llYXJzLAogIG5leHREYXk6ICgpID0+IG5leHREYXksCiAgbmV4dEZyaWRheTogKCkgPT4gbmV4dEZyaWRheSwKICBuZXh0TW9uZGF5OiAoKSA9PiBuZXh0TW9uZGF5LAogIG5leHRTYXR1cmRheTogKCkgPT4gbmV4dFNhdHVyZGF5LAogIG5leHRTdW5kYXk6ICgpID0+IG5leHRTdW5kYXksCiAgbmV4dFRodXJzZGF5OiAoKSA9PiBuZXh0VGh1cnNkYXksCiAgbmV4dFR1ZXNkYXk6ICgpID0+IG5leHRUdWVzZGF5LAogIG5leHRXZWRuZXNkYXk6ICgpID0+IG5leHRXZWRuZXNkYXksCiAgcGFyc2U6ICgpID0+IHBhcnNlLAogIHBhcnNlSVNPOiAoKSA9PiBwYXJzZUlTTywKICBwYXJzZUpTT046ICgpID0+IHBhcnNlSlNPTiwKICBwYXJzZXJzOiAoKSA9PiBwYXJzZXJzLAogIHByZXZpb3VzRGF5OiAoKSA9PiBwcmV2aW91c0RheSwKICBwcmV2aW91c0ZyaWRheTogKCkgPT4gcHJldmlvdXNGcmlkYXksCiAgcHJldmlvdXNNb25kYXk6ICgpID0+IHByZXZpb3VzTW9uZGF5LAogIHByZXZpb3VzU2F0dXJkYXk6ICgpID0+IHByZXZpb3VzU2F0dXJkYXksCiAgcHJldmlvdXNTdW5kYXk6ICgpID0+IHByZXZpb3VzU3VuZGF5LAogIHByZXZpb3VzVGh1cnNkYXk6ICgpID0+IHByZXZpb3VzVGh1cnNkYXksCiAgcHJldmlvdXNUdWVzZGF5OiAoKSA9PiBwcmV2aW91c1R1ZXNkYXksCiAgcHJldmlvdXNXZWRuZXNkYXk6ICgpID0+IHByZXZpb3VzV2VkbmVzZGF5LAogIHF1YXJ0ZXJzVG9Nb250aHM6ICgpID0+IHF1YXJ0ZXJzVG9Nb250aHMsCiAgcXVhcnRlcnNUb1llYXJzOiAoKSA9PiBxdWFydGVyc1RvWWVhcnMsCiAgcm91bmRUb05lYXJlc3RIb3VyczogKCkgPT4gcm91bmRUb05lYXJlc3RIb3VycywKICByb3VuZFRvTmVhcmVzdE1pbnV0ZXM6ICgpID0+IHJvdW5kVG9OZWFyZXN0TWludXRlcywKICBzZWNvbmRzVG9Ib3VyczogKCkgPT4gc2Vjb25kc1RvSG91cnMsCiAgc2Vjb25kc1RvTWlsbGlzZWNvbmRzOiAoKSA9PiBzZWNvbmRzVG9NaWxsaXNlY29uZHMsCiAgc2Vjb25kc1RvTWludXRlczogKCkgPT4gc2Vjb25kc1RvTWludXRlcywKICBzZXQ6ICgpID0+IHNldCwKICBzZXREYXRlOiAoKSA9PiBzZXREYXRlLAogIHNldERheTogKCkgPT4gc2V0RGF5LAogIHNldERheU9mWWVhcjogKCkgPT4gc2V0RGF5T2ZZZWFyLAogIHNldERlZmF1bHRPcHRpb25zOiAoKSA9PiBzZXREZWZhdWx0T3B0aW9uczIsCiAgc2V0SG91cnM6ICgpID0+IHNldEhvdXJzLAogIHNldElTT0RheTogKCkgPT4gc2V0SVNPRGF5LAogIHNldElTT1dlZWs6ICgpID0+IHNldElTT1dlZWssCiAgc2V0SVNPV2Vla1llYXI6ICgpID0+IHNldElTT1dlZWtZZWFyLAogIHNldE1pbGxpc2Vjb25kczogKCkgPT4gc2V0TWlsbGlzZWNvbmRzLAogIHNldE1pbnV0ZXM6ICgpID0+IHNldE1pbnV0ZXMsCiAgc2V0TW9udGg6ICgpID0+IHNldE1vbnRoLAogIHNldFF1YXJ0ZXI6ICgpID0+IHNldFF1YXJ0ZXIsCiAgc2V0U2Vjb25kczogKCkgPT4gc2V0U2Vjb25kcywKICBzZXRXZWVrOiAoKSA9PiBzZXRXZWVrLAogIHNldFdlZWtZZWFyOiAoKSA9PiBzZXRXZWVrWWVhciwKICBzZXRZZWFyOiAoKSA9PiBzZXRZZWFyLAogIHN0YXJ0T2ZEYXk6ICgpID0+IHN0YXJ0T2ZEYXksCiAgc3RhcnRPZkRlY2FkZTogKCkgPT4gc3RhcnRPZkRlY2FkZSwKICBzdGFydE9mSG91cjogKCkgPT4gc3RhcnRPZkhvdXIsCiAgc3RhcnRPZklTT1dlZWs6ICgpID0+IHN0YXJ0T2ZJU09XZWVrLAogIHN0YXJ0T2ZJU09XZWVrWWVhcjogKCkgPT4gc3RhcnRPZklTT1dlZWtZZWFyLAogIHN0YXJ0T2ZNaW51dGU6ICgpID0+IHN0YXJ0T2ZNaW51dGUsCiAgc3RhcnRPZk1vbnRoOiAoKSA9PiBzdGFydE9mTW9udGgsCiAgc3RhcnRPZlF1YXJ0ZXI6ICgpID0+IHN0YXJ0T2ZRdWFydGVyLAogIHN0YXJ0T2ZTZWNvbmQ6ICgpID0+IHN0YXJ0T2ZTZWNvbmQsCiAgc3RhcnRPZlRvZGF5OiAoKSA9PiBzdGFydE9mVG9kYXksCiAgc3RhcnRPZlRvbW9ycm93OiAoKSA9PiBzdGFydE9mVG9tb3Jyb3csCiAgc3RhcnRPZldlZWs6ICgpID0+IHN0YXJ0T2ZXZWVrLAogIHN0YXJ0T2ZXZWVrWWVhcjogKCkgPT4gc3RhcnRPZldlZWtZZWFyLAogIHN0YXJ0T2ZZZWFyOiAoKSA9PiBzdGFydE9mWWVhciwKICBzdGFydE9mWWVzdGVyZGF5OiAoKSA9PiBzdGFydE9mWWVzdGVyZGF5LAogIHN1YjogKCkgPT4gc3ViLAogIHN1YkJ1c2luZXNzRGF5czogKCkgPT4gc3ViQnVzaW5lc3NEYXlzLAogIHN1YkRheXM6ICgpID0+IHN1YkRheXMsCiAgc3ViSG91cnM6ICgpID0+IHN1YkhvdXJzLAogIHN1YklTT1dlZWtZZWFyczogKCkgPT4gc3ViSVNPV2Vla1llYXJzLAogIHN1Yk1pbGxpc2Vjb25kczogKCkgPT4gc3ViTWlsbGlzZWNvbmRzLAogIHN1Yk1pbnV0ZXM6ICgpID0+IHN1Yk1pbnV0ZXMsCiAgc3ViTW9udGhzOiAoKSA9PiBzdWJNb250aHMsCiAgc3ViUXVhcnRlcnM6ICgpID0+IHN1YlF1YXJ0ZXJzLAogIHN1YlNlY29uZHM6ICgpID0+IHN1YlNlY29uZHMsCiAgc3ViV2Vla3M6ICgpID0+IHN1YldlZWtzLAogIHN1YlllYXJzOiAoKSA9PiBzdWJZZWFycywKICB0b0RhdGU6ICgpID0+IHRvRGF0ZSwKICB0cmFuc3Bvc2U6ICgpID0+IHRyYW5zcG9zZSwKICB3ZWVrc1RvRGF5czogKCkgPT4gd2Vla3NUb0RheXMsCiAgeWVhcnNUb0RheXM6ICgpID0+IHllYXJzVG9EYXlzLAogIHllYXJzVG9Nb250aHM6ICgpID0+IHllYXJzVG9Nb250aHMsCiAgeWVhcnNUb1F1YXJ0ZXJzOiAoKSA9PiB5ZWFyc1RvUXVhcnRlcnMKfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2NvbnN0YW50cy5qcwp2YXIgZGF5c0luV2VlayA9IDc7CnZhciBkYXlzSW5ZZWFyID0gMzY1LjI0MjU7CnZhciBtYXhUaW1lID0gTWF0aC5wb3coMTAsIDgpICogMjQgKiA2MCAqIDYwICogMWUzOwp2YXIgbWluVGltZSA9IC1tYXhUaW1lOwp2YXIgbWlsbGlzZWNvbmRzSW5XZWVrID0gNjA0OGU1Owp2YXIgbWlsbGlzZWNvbmRzSW5EYXkgPSA4NjRlNTsKdmFyIG1pbGxpc2Vjb25kc0luTWludXRlID0gNmU0Owp2YXIgbWlsbGlzZWNvbmRzSW5Ib3VyID0gMzZlNTsKdmFyIG1pbGxpc2Vjb25kc0luU2Vjb25kID0gMWUzOwp2YXIgbWludXRlc0luWWVhciA9IDUyNTYwMDsKdmFyIG1pbnV0ZXNJbk1vbnRoID0gNDMyMDA7CnZhciBtaW51dGVzSW5EYXkgPSAxNDQwOwp2YXIgbWludXRlc0luSG91ciA9IDYwOwp2YXIgbW9udGhzSW5RdWFydGVyID0gMzsKdmFyIG1vbnRoc0luWWVhciA9IDEyOwp2YXIgcXVhcnRlcnNJblllYXIgPSA0Owp2YXIgc2Vjb25kc0luSG91ciA9IDM2MDA7CnZhciBzZWNvbmRzSW5NaW51dGUgPSA2MDsKdmFyIHNlY29uZHNJbkRheSA9IHNlY29uZHNJbkhvdXIgKiAyNDsKdmFyIHNlY29uZHNJbldlZWsgPSBzZWNvbmRzSW5EYXkgKiA3Owp2YXIgc2Vjb25kc0luWWVhciA9IHNlY29uZHNJbkRheSAqIGRheXNJblllYXI7CnZhciBzZWNvbmRzSW5Nb250aCA9IHNlY29uZHNJblllYXIgLyAxMjsKdmFyIHNlY29uZHNJblF1YXJ0ZXIgPSBzZWNvbmRzSW5Nb250aCAqIDM7CnZhciBjb25zdHJ1Y3RGcm9tU3ltYm9sID0gLyogQF9fUFVSRV9fICovIFN5bWJvbC5mb3IoImNvbnN0cnVjdERhdGVGcm9tIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2NvbnN0cnVjdEZyb20uanMKZnVuY3Rpb24gY29uc3RydWN0RnJvbShkYXRlLCB2YWx1ZTIpIHsKICBpZiAodHlwZW9mIGRhdGUgPT09ICJmdW5jdGlvbiIpIHJldHVybiBkYXRlKHZhbHVlMik7CiAgaWYgKGRhdGUgJiYgdHlwZW9mIGRhdGUgPT09ICJvYmplY3QiICYmIGNvbnN0cnVjdEZyb21TeW1ib2wgaW4gZGF0ZSkKICAgIHJldHVybiBkYXRlW2NvbnN0cnVjdEZyb21TeW1ib2xdKHZhbHVlMik7CiAgaWYgKGRhdGUgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gbmV3IGRhdGUuY29uc3RydWN0b3IodmFsdWUyKTsKICByZXR1cm4gbmV3IERhdGUodmFsdWUyKTsKfQpfX25hbWUoY29uc3RydWN0RnJvbSwgImNvbnN0cnVjdEZyb20iKTsKdmFyIGNvbnN0cnVjdEZyb21fZGVmYXVsdCA9IGNvbnN0cnVjdEZyb207CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3RvRGF0ZS5qcwpmdW5jdGlvbiB0b0RhdGUoYXJndW1lbnQsIGNvbnRleHQyKSB7CiAgcmV0dXJuIGNvbnN0cnVjdEZyb20oY29udGV4dDIgfHwgYXJndW1lbnQsIGFyZ3VtZW50KTsKfQpfX25hbWUodG9EYXRlLCAidG9EYXRlIik7CnZhciB0b0RhdGVfZGVmYXVsdCA9IHRvRGF0ZTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkRGF5cy5qcwpmdW5jdGlvbiBhZGREYXlzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBpZiAoaXNOYU4oYW1vdW50KSkgcmV0dXJuIGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4gfHwgZGF0ZSwgTmFOKTsKICBpZiAoIWFtb3VudCkgcmV0dXJuIF9kYXRlOwogIF9kYXRlLnNldERhdGUoX2RhdGUuZ2V0RGF0ZSgpICsgYW1vdW50KTsKICByZXR1cm4gX2RhdGU7Cn0KX19uYW1lKGFkZERheXMsICJhZGREYXlzIik7CnZhciBhZGREYXlzX2RlZmF1bHQgPSBhZGREYXlzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGRNb250aHMuanMKZnVuY3Rpb24gYWRkTW9udGhzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBpZiAoaXNOYU4oYW1vdW50KSkgcmV0dXJuIGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4gfHwgZGF0ZSwgTmFOKTsKICBpZiAoIWFtb3VudCkgewogICAgcmV0dXJuIF9kYXRlOwogIH0KICBjb25zdCBkYXlPZk1vbnRoID0gX2RhdGUuZ2V0RGF0ZSgpOwogIGNvbnN0IGVuZE9mRGVzaXJlZE1vbnRoID0gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCBfZGF0ZS5nZXRUaW1lKCkpOwogIGVuZE9mRGVzaXJlZE1vbnRoLnNldE1vbnRoKF9kYXRlLmdldE1vbnRoKCkgKyBhbW91bnQgKyAxLCAwKTsKICBjb25zdCBkYXlzSW5Nb250aCA9IGVuZE9mRGVzaXJlZE1vbnRoLmdldERhdGUoKTsKICBpZiAoZGF5T2ZNb250aCA+PSBkYXlzSW5Nb250aCkgewogICAgcmV0dXJuIGVuZE9mRGVzaXJlZE1vbnRoOwogIH0gZWxzZSB7CiAgICBfZGF0ZS5zZXRGdWxsWWVhcigKICAgICAgZW5kT2ZEZXNpcmVkTW9udGguZ2V0RnVsbFllYXIoKSwKICAgICAgZW5kT2ZEZXNpcmVkTW9udGguZ2V0TW9udGgoKSwKICAgICAgZGF5T2ZNb250aAogICAgKTsKICAgIHJldHVybiBfZGF0ZTsKICB9Cn0KX19uYW1lKGFkZE1vbnRocywgImFkZE1vbnRocyIpOwp2YXIgYWRkTW9udGhzX2RlZmF1bHQgPSBhZGRNb250aHM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZC5qcwpmdW5jdGlvbiBhZGQoZGF0ZSwgZHVyYXRpb24sIG9wdGlvbnMpIHsKICBjb25zdCB7CiAgICB5ZWFycyA9IDAsCiAgICBtb250aHM6IG1vbnRoczIgPSAwLAogICAgd2Vla3MgPSAwLAogICAgZGF5czogZGF5czIgPSAwLAogICAgaG91cnMgPSAwLAogICAgbWludXRlcyA9IDAsCiAgICBzZWNvbmRzID0gMAogIH0gPSBkdXJhdGlvbjsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgZGF0ZVdpdGhNb250aHMgPSBtb250aHMyIHx8IHllYXJzID8gYWRkTW9udGhzKF9kYXRlLCBtb250aHMyICsgeWVhcnMgKiAxMikgOiBfZGF0ZTsKICBjb25zdCBkYXRlV2l0aERheXMgPSBkYXlzMiB8fCB3ZWVrcyA/IGFkZERheXMoZGF0ZVdpdGhNb250aHMsIGRheXMyICsgd2Vla3MgKiA3KSA6IGRhdGVXaXRoTW9udGhzOwogIGNvbnN0IG1pbnV0ZXNUb0FkZCA9IG1pbnV0ZXMgKyBob3VycyAqIDYwOwogIGNvbnN0IHNlY29uZHNUb0FkZCA9IHNlY29uZHMgKyBtaW51dGVzVG9BZGQgKiA2MDsKICBjb25zdCBtc1RvQWRkID0gc2Vjb25kc1RvQWRkICogMWUzOwogIHJldHVybiBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsICtkYXRlV2l0aERheXMgKyBtc1RvQWRkKTsKfQpfX25hbWUoYWRkLCAiYWRkIik7CnZhciBhZGRfZGVmYXVsdCA9IGFkZDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNTYXR1cmRheS5qcwpmdW5jdGlvbiBpc1NhdHVyZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKS5nZXREYXkoKSA9PT0gNjsKfQpfX25hbWUoaXNTYXR1cmRheSwgImlzU2F0dXJkYXkiKTsKdmFyIGlzU2F0dXJkYXlfZGVmYXVsdCA9IGlzU2F0dXJkYXk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzU3VuZGF5LmpzCmZ1bmN0aW9uIGlzU3VuZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKS5nZXREYXkoKSA9PT0gMDsKfQpfX25hbWUoaXNTdW5kYXksICJpc1N1bmRheSIpOwp2YXIgaXNTdW5kYXlfZGVmYXVsdCA9IGlzU3VuZGF5OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1dlZWtlbmQuanMKZnVuY3Rpb24gaXNXZWVrZW5kKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBkYXkgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pLmdldERheSgpOwogIHJldHVybiBkYXkgPT09IDAgfHwgZGF5ID09PSA2Owp9Cl9fbmFtZShpc1dlZWtlbmQsICJpc1dlZWtlbmQiKTsKdmFyIGlzV2Vla2VuZF9kZWZhdWx0ID0gaXNXZWVrZW5kOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGRCdXNpbmVzc0RheXMuanMKZnVuY3Rpb24gYWRkQnVzaW5lc3NEYXlzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCBzdGFydGVkT25XZWVrZW5kID0gaXNXZWVrZW5kKF9kYXRlLCBvcHRpb25zKTsKICBpZiAoaXNOYU4oYW1vdW50KSkgcmV0dXJuIGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4sIE5hTik7CiAgY29uc3QgaG91cnMgPSBfZGF0ZS5nZXRIb3VycygpOwogIGNvbnN0IHNpZ24gPSBhbW91bnQgPCAwID8gLTEgOiAxOwogIGNvbnN0IGZ1bGxXZWVrcyA9IE1hdGgudHJ1bmMoYW1vdW50IC8gNSk7CiAgX2RhdGUuc2V0RGF0ZShfZGF0ZS5nZXREYXRlKCkgKyBmdWxsV2Vla3MgKiA3KTsKICBsZXQgcmVzdERheXMgPSBNYXRoLmFicyhhbW91bnQgJSA1KTsKICB3aGlsZSAocmVzdERheXMgPiAwKSB7CiAgICBfZGF0ZS5zZXREYXRlKF9kYXRlLmdldERhdGUoKSArIHNpZ24pOwogICAgaWYgKCFpc1dlZWtlbmQoX2RhdGUsIG9wdGlvbnMpKSByZXN0RGF5cyAtPSAxOwogIH0KICBpZiAoc3RhcnRlZE9uV2Vla2VuZCAmJiBpc1dlZWtlbmQoX2RhdGUsIG9wdGlvbnMpICYmIGFtb3VudCAhPT0gMCkgewogICAgaWYgKGlzU2F0dXJkYXkoX2RhdGUsIG9wdGlvbnMpKQogICAgICBfZGF0ZS5zZXREYXRlKF9kYXRlLmdldERhdGUoKSArIChzaWduIDwgMCA/IDIgOiAtMSkpOwogICAgaWYgKGlzU3VuZGF5KF9kYXRlLCBvcHRpb25zKSkKICAgICAgX2RhdGUuc2V0RGF0ZShfZGF0ZS5nZXREYXRlKCkgKyAoc2lnbiA8IDAgPyAxIDogLTIpKTsKICB9CiAgX2RhdGUuc2V0SG91cnMoaG91cnMpOwogIHJldHVybiBfZGF0ZTsKfQpfX25hbWUoYWRkQnVzaW5lc3NEYXlzLCAiYWRkQnVzaW5lc3NEYXlzIik7CnZhciBhZGRCdXNpbmVzc0RheXNfZGVmYXVsdCA9IGFkZEJ1c2luZXNzRGF5czsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkTWlsbGlzZWNvbmRzLmpzCmZ1bmN0aW9uIGFkZE1pbGxpc2Vjb25kcyhkYXRlLCBhbW91bnQsIG9wdGlvbnMpIHsKICByZXR1cm4gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCArdG9EYXRlKGRhdGUpICsgYW1vdW50KTsKfQpfX25hbWUoYWRkTWlsbGlzZWNvbmRzLCAiYWRkTWlsbGlzZWNvbmRzIik7CnZhciBhZGRNaWxsaXNlY29uZHNfZGVmYXVsdCA9IGFkZE1pbGxpc2Vjb25kczsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkSG91cnMuanMKZnVuY3Rpb24gYWRkSG91cnMoZGF0ZSwgYW1vdW50LCBvcHRpb25zKSB7CiAgcmV0dXJuIGFkZE1pbGxpc2Vjb25kcyhkYXRlLCBhbW91bnQgKiBtaWxsaXNlY29uZHNJbkhvdXIsIG9wdGlvbnMpOwp9Cl9fbmFtZShhZGRIb3VycywgImFkZEhvdXJzIik7CnZhciBhZGRIb3Vyc19kZWZhdWx0ID0gYWRkSG91cnM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvZGVmYXVsdE9wdGlvbnMuanMKdmFyIGRlZmF1bHRPcHRpb25zID0ge307CmZ1bmN0aW9uIGdldERlZmF1bHRPcHRpb25zKCkgewogIHJldHVybiBkZWZhdWx0T3B0aW9uczsKfQpfX25hbWUoZ2V0RGVmYXVsdE9wdGlvbnMsICJnZXREZWZhdWx0T3B0aW9ucyIpOwpmdW5jdGlvbiBzZXREZWZhdWx0T3B0aW9ucyhuZXdPcHRpb25zKSB7CiAgZGVmYXVsdE9wdGlvbnMgPSBuZXdPcHRpb25zOwp9Cl9fbmFtZShzZXREZWZhdWx0T3B0aW9ucywgInNldERlZmF1bHRPcHRpb25zIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZXZWVrLmpzCmZ1bmN0aW9uIHN0YXJ0T2ZXZWVrKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBkZWZhdWx0T3B0aW9uczIgPSBnZXREZWZhdWx0T3B0aW9ucygpOwogIGNvbnN0IHdlZWtTdGFydHNPbiA9IG9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyBkZWZhdWx0T3B0aW9uczIud2Vla1N0YXJ0c09uID8/IGRlZmF1bHRPcHRpb25zMi5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyAwOwogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCBkYXkgPSBfZGF0ZS5nZXREYXkoKTsKICBjb25zdCBkaWZmID0gKGRheSA8IHdlZWtTdGFydHNPbiA/IDcgOiAwKSArIGRheSAtIHdlZWtTdGFydHNPbjsKICBfZGF0ZS5zZXREYXRlKF9kYXRlLmdldERhdGUoKSAtIGRpZmYpOwogIF9kYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogIHJldHVybiBfZGF0ZTsKfQpfX25hbWUoc3RhcnRPZldlZWssICJzdGFydE9mV2VlayIpOwp2YXIgc3RhcnRPZldlZWtfZGVmYXVsdCA9IHN0YXJ0T2ZXZWVrOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mSVNPV2Vlay5qcwpmdW5jdGlvbiBzdGFydE9mSVNPV2VlayhkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIHN0YXJ0T2ZXZWVrKGRhdGUsIHsgLi4ub3B0aW9ucywgd2Vla1N0YXJ0c09uOiAxIH0pOwp9Cl9fbmFtZShzdGFydE9mSVNPV2VlaywgInN0YXJ0T2ZJU09XZWVrIik7CnZhciBzdGFydE9mSVNPV2Vla19kZWZhdWx0ID0gc3RhcnRPZklTT1dlZWs7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldElTT1dlZWtZZWFyLmpzCmZ1bmN0aW9uIGdldElTT1dlZWtZZWFyKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgeWVhciA9IF9kYXRlLmdldEZ1bGxZZWFyKCk7CiAgY29uc3QgZm91cnRoT2ZKYW51YXJ5T2ZOZXh0WWVhciA9IGNvbnN0cnVjdEZyb20oX2RhdGUsIDApOwogIGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIuc2V0RnVsbFllYXIoeWVhciArIDEsIDAsIDQpOwogIGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgY29uc3Qgc3RhcnRPZk5leHRZZWFyID0gc3RhcnRPZklTT1dlZWsoZm91cnRoT2ZKYW51YXJ5T2ZOZXh0WWVhcik7CiAgY29uc3QgZm91cnRoT2ZKYW51YXJ5T2ZUaGlzWWVhciA9IGNvbnN0cnVjdEZyb20oX2RhdGUsIDApOwogIGZvdXJ0aE9mSmFudWFyeU9mVGhpc1llYXIuc2V0RnVsbFllYXIoeWVhciwgMCwgNCk7CiAgZm91cnRoT2ZKYW51YXJ5T2ZUaGlzWWVhci5zZXRIb3VycygwLCAwLCAwLCAwKTsKICBjb25zdCBzdGFydE9mVGhpc1llYXIgPSBzdGFydE9mSVNPV2Vlayhmb3VydGhPZkphbnVhcnlPZlRoaXNZZWFyKTsKICBpZiAoX2RhdGUuZ2V0VGltZSgpID49IHN0YXJ0T2ZOZXh0WWVhci5nZXRUaW1lKCkpIHsKICAgIHJldHVybiB5ZWFyICsgMTsKICB9IGVsc2UgaWYgKF9kYXRlLmdldFRpbWUoKSA+PSBzdGFydE9mVGhpc1llYXIuZ2V0VGltZSgpKSB7CiAgICByZXR1cm4geWVhcjsKICB9IGVsc2UgewogICAgcmV0dXJuIHllYXIgLSAxOwogIH0KfQpfX25hbWUoZ2V0SVNPV2Vla1llYXIsICJnZXRJU09XZWVrWWVhciIpOwp2YXIgZ2V0SVNPV2Vla1llYXJfZGVmYXVsdCA9IGdldElTT1dlZWtZZWFyOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9fbGliL2dldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMuanMKZnVuY3Rpb24gZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyhkYXRlKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSk7CiAgY29uc3QgdXRjRGF0ZSA9IG5ldyBEYXRlKAogICAgRGF0ZS5VVEMoCiAgICAgIF9kYXRlLmdldEZ1bGxZZWFyKCksCiAgICAgIF9kYXRlLmdldE1vbnRoKCksCiAgICAgIF9kYXRlLmdldERhdGUoKSwKICAgICAgX2RhdGUuZ2V0SG91cnMoKSwKICAgICAgX2RhdGUuZ2V0TWludXRlcygpLAogICAgICBfZGF0ZS5nZXRTZWNvbmRzKCksCiAgICAgIF9kYXRlLmdldE1pbGxpc2Vjb25kcygpCiAgICApCiAgKTsKICB1dGNEYXRlLnNldFVUQ0Z1bGxZZWFyKF9kYXRlLmdldEZ1bGxZZWFyKCkpOwogIHJldHVybiArZGF0ZSAtICt1dGNEYXRlOwp9Cl9fbmFtZShnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzLCAiZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9fbGliL25vcm1hbGl6ZURhdGVzLmpzCmZ1bmN0aW9uIG5vcm1hbGl6ZURhdGVzKGNvbnRleHQyLCAuLi5kYXRlcykgewogIGNvbnN0IG5vcm1hbGl6ZTQgPSBjb25zdHJ1Y3RGcm9tLmJpbmQoCiAgICBudWxsLAogICAgY29udGV4dDIgfHwgZGF0ZXMuZmluZCgoZGF0ZSkgPT4gdHlwZW9mIGRhdGUgPT09ICJvYmplY3QiKQogICk7CiAgcmV0dXJuIGRhdGVzLm1hcChub3JtYWxpemU0KTsKfQpfX25hbWUobm9ybWFsaXplRGF0ZXMsICJub3JtYWxpemVEYXRlcyIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mRGF5LmpzCmZ1bmN0aW9uIHN0YXJ0T2ZEYXkoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBfZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICByZXR1cm4gX2RhdGU7Cn0KX19uYW1lKHN0YXJ0T2ZEYXksICJzdGFydE9mRGF5Iik7CnZhciBzdGFydE9mRGF5X2RlZmF1bHQgPSBzdGFydE9mRGF5OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5DYWxlbmRhckRheXMuanMKZnVuY3Rpb24gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBbbGF0ZXJEYXRlXywgZWFybGllckRhdGVfXSA9IG5vcm1hbGl6ZURhdGVzKAogICAgb3B0aW9ucz8uaW4sCiAgICBsYXRlckRhdGUsCiAgICBlYXJsaWVyRGF0ZQogICk7CiAgY29uc3QgbGF0ZXJTdGFydE9mRGF5ID0gc3RhcnRPZkRheShsYXRlckRhdGVfKTsKICBjb25zdCBlYXJsaWVyU3RhcnRPZkRheSA9IHN0YXJ0T2ZEYXkoZWFybGllckRhdGVfKTsKICBjb25zdCBsYXRlclRpbWVzdGFtcCA9ICtsYXRlclN0YXJ0T2ZEYXkgLSBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKGxhdGVyU3RhcnRPZkRheSk7CiAgY29uc3QgZWFybGllclRpbWVzdGFtcCA9ICtlYXJsaWVyU3RhcnRPZkRheSAtIGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMoZWFybGllclN0YXJ0T2ZEYXkpOwogIHJldHVybiBNYXRoLnJvdW5kKChsYXRlclRpbWVzdGFtcCAtIGVhcmxpZXJUaW1lc3RhbXApIC8gbWlsbGlzZWNvbmRzSW5EYXkpOwp9Cl9fbmFtZShkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMsICJkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMiKTsKdmFyIGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5c19kZWZhdWx0ID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mSVNPV2Vla1llYXIuanMKZnVuY3Rpb24gc3RhcnRPZklTT1dlZWtZZWFyKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCB5ZWFyID0gZ2V0SVNPV2Vla1llYXIoZGF0ZSwgb3B0aW9ucyk7CiAgY29uc3QgZm91cnRoT2ZKYW51YXJ5ID0gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCAwKTsKICBmb3VydGhPZkphbnVhcnkuc2V0RnVsbFllYXIoeWVhciwgMCwgNCk7CiAgZm91cnRoT2ZKYW51YXJ5LnNldEhvdXJzKDAsIDAsIDAsIDApOwogIHJldHVybiBzdGFydE9mSVNPV2Vlayhmb3VydGhPZkphbnVhcnkpOwp9Cl9fbmFtZShzdGFydE9mSVNPV2Vla1llYXIsICJzdGFydE9mSVNPV2Vla1llYXIiKTsKdmFyIHN0YXJ0T2ZJU09XZWVrWWVhcl9kZWZhdWx0ID0gc3RhcnRPZklTT1dlZWtZZWFyOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRJU09XZWVrWWVhci5qcwpmdW5jdGlvbiBzZXRJU09XZWVrWWVhcihkYXRlLCB3ZWVrWWVhciwgb3B0aW9ucykgewogIGxldCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgZGlmZiA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cygKICAgIF9kYXRlLAogICAgc3RhcnRPZklTT1dlZWtZZWFyKF9kYXRlLCBvcHRpb25zKQogICk7CiAgY29uc3QgZm91cnRoT2ZKYW51YXJ5ID0gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCAwKTsKICBmb3VydGhPZkphbnVhcnkuc2V0RnVsbFllYXIod2Vla1llYXIsIDAsIDQpOwogIGZvdXJ0aE9mSmFudWFyeS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICBfZGF0ZSA9IHN0YXJ0T2ZJU09XZWVrWWVhcihmb3VydGhPZkphbnVhcnkpOwogIF9kYXRlLnNldERhdGUoX2RhdGUuZ2V0RGF0ZSgpICsgZGlmZik7CiAgcmV0dXJuIF9kYXRlOwp9Cl9fbmFtZShzZXRJU09XZWVrWWVhciwgInNldElTT1dlZWtZZWFyIik7CnZhciBzZXRJU09XZWVrWWVhcl9kZWZhdWx0ID0gc2V0SVNPV2Vla1llYXI7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZElTT1dlZWtZZWFycy5qcwpmdW5jdGlvbiBhZGRJU09XZWVrWWVhcnMoZGF0ZSwgYW1vdW50LCBvcHRpb25zKSB7CiAgcmV0dXJuIHNldElTT1dlZWtZZWFyKGRhdGUsIGdldElTT1dlZWtZZWFyKGRhdGUsIG9wdGlvbnMpICsgYW1vdW50LCBvcHRpb25zKTsKfQpfX25hbWUoYWRkSVNPV2Vla1llYXJzLCAiYWRkSVNPV2Vla1llYXJzIik7CnZhciBhZGRJU09XZWVrWWVhcnNfZGVmYXVsdCA9IGFkZElTT1dlZWtZZWFyczsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkTWludXRlcy5qcwpmdW5jdGlvbiBhZGRNaW51dGVzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBfZGF0ZS5zZXRUaW1lKF9kYXRlLmdldFRpbWUoKSArIGFtb3VudCAqIG1pbGxpc2Vjb25kc0luTWludXRlKTsKICByZXR1cm4gX2RhdGU7Cn0KX19uYW1lKGFkZE1pbnV0ZXMsICJhZGRNaW51dGVzIik7CnZhciBhZGRNaW51dGVzX2RlZmF1bHQgPSBhZGRNaW51dGVzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGRRdWFydGVycy5qcwpmdW5jdGlvbiBhZGRRdWFydGVycyhkYXRlLCBhbW91bnQsIG9wdGlvbnMpIHsKICByZXR1cm4gYWRkTW9udGhzKGRhdGUsIGFtb3VudCAqIDMsIG9wdGlvbnMpOwp9Cl9fbmFtZShhZGRRdWFydGVycywgImFkZFF1YXJ0ZXJzIik7CnZhciBhZGRRdWFydGVyc19kZWZhdWx0ID0gYWRkUXVhcnRlcnM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZFNlY29uZHMuanMKZnVuY3Rpb24gYWRkU2Vjb25kcyhkYXRlLCBhbW91bnQsIG9wdGlvbnMpIHsKICByZXR1cm4gYWRkTWlsbGlzZWNvbmRzKGRhdGUsIGFtb3VudCAqIDFlMywgb3B0aW9ucyk7Cn0KX19uYW1lKGFkZFNlY29uZHMsICJhZGRTZWNvbmRzIik7CnZhciBhZGRTZWNvbmRzX2RlZmF1bHQgPSBhZGRTZWNvbmRzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGRXZWVrcy5qcwpmdW5jdGlvbiBhZGRXZWVrcyhkYXRlLCBhbW91bnQsIG9wdGlvbnMpIHsKICByZXR1cm4gYWRkRGF5cyhkYXRlLCBhbW91bnQgKiA3LCBvcHRpb25zKTsKfQpfX25hbWUoYWRkV2Vla3MsICJhZGRXZWVrcyIpOwp2YXIgYWRkV2Vla3NfZGVmYXVsdCA9IGFkZFdlZWtzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGRZZWFycy5qcwpmdW5jdGlvbiBhZGRZZWFycyhkYXRlLCBhbW91bnQsIG9wdGlvbnMpIHsKICByZXR1cm4gYWRkTW9udGhzKGRhdGUsIGFtb3VudCAqIDEyLCBvcHRpb25zKTsKfQpfX25hbWUoYWRkWWVhcnMsICJhZGRZZWFycyIpOwp2YXIgYWRkWWVhcnNfZGVmYXVsdCA9IGFkZFllYXJzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hcmVJbnRlcnZhbHNPdmVybGFwcGluZy5qcwpmdW5jdGlvbiBhcmVJbnRlcnZhbHNPdmVybGFwcGluZyhpbnRlcnZhbExlZnQsIGludGVydmFsUmlnaHQsIG9wdGlvbnMpIHsKICBjb25zdCBbbGVmdFN0YXJ0VGltZSwgbGVmdEVuZFRpbWVdID0gWwogICAgK3RvRGF0ZShpbnRlcnZhbExlZnQuc3RhcnQsIG9wdGlvbnM/LmluKSwKICAgICt0b0RhdGUoaW50ZXJ2YWxMZWZ0LmVuZCwgb3B0aW9ucz8uaW4pCiAgXS5zb3J0KChhNCwgYjQpID0+IGE0IC0gYjQpOwogIGNvbnN0IFtyaWdodFN0YXJ0VGltZSwgcmlnaHRFbmRUaW1lXSA9IFsKICAgICt0b0RhdGUoaW50ZXJ2YWxSaWdodC5zdGFydCwgb3B0aW9ucz8uaW4pLAogICAgK3RvRGF0ZShpbnRlcnZhbFJpZ2h0LmVuZCwgb3B0aW9ucz8uaW4pCiAgXS5zb3J0KChhNCwgYjQpID0+IGE0IC0gYjQpOwogIGlmIChvcHRpb25zPy5pbmNsdXNpdmUpCiAgICByZXR1cm4gbGVmdFN0YXJ0VGltZSA8PSByaWdodEVuZFRpbWUgJiYgcmlnaHRTdGFydFRpbWUgPD0gbGVmdEVuZFRpbWU7CiAgcmV0dXJuIGxlZnRTdGFydFRpbWUgPCByaWdodEVuZFRpbWUgJiYgcmlnaHRTdGFydFRpbWUgPCBsZWZ0RW5kVGltZTsKfQpfX25hbWUoYXJlSW50ZXJ2YWxzT3ZlcmxhcHBpbmcsICJhcmVJbnRlcnZhbHNPdmVybGFwcGluZyIpOwp2YXIgYXJlSW50ZXJ2YWxzT3ZlcmxhcHBpbmdfZGVmYXVsdCA9IGFyZUludGVydmFsc092ZXJsYXBwaW5nOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9tYXguanMKZnVuY3Rpb24gbWF4MihkYXRlcywgb3B0aW9ucykgewogIGxldCByZXN1bHQ7CiAgbGV0IGNvbnRleHQyID0gb3B0aW9ucz8uaW47CiAgZGF0ZXMuZm9yRWFjaCgoZGF0ZSkgPT4gewogICAgaWYgKCFjb250ZXh0MiAmJiB0eXBlb2YgZGF0ZSA9PT0gIm9iamVjdCIpCiAgICAgIGNvbnRleHQyID0gY29uc3RydWN0RnJvbS5iaW5kKG51bGwsIGRhdGUpOwogICAgY29uc3QgZGF0ZV8gPSB0b0RhdGUoZGF0ZSwgY29udGV4dDIpOwogICAgaWYgKCFyZXN1bHQgfHwgcmVzdWx0IDwgZGF0ZV8gfHwgaXNOYU4oK2RhdGVfKSkgcmVzdWx0ID0gZGF0ZV87CiAgfSk7CiAgcmV0dXJuIGNvbnN0cnVjdEZyb20oY29udGV4dDIsIHJlc3VsdCB8fCBOYU4pOwp9Cl9fbmFtZShtYXgyLCAibWF4Iik7CnZhciBtYXhfZGVmYXVsdCA9IG1heDI7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL21pbi5qcwpmdW5jdGlvbiBtaW4yKGRhdGVzLCBvcHRpb25zKSB7CiAgbGV0IHJlc3VsdDsKICBsZXQgY29udGV4dDIgPSBvcHRpb25zPy5pbjsKICBkYXRlcy5mb3JFYWNoKChkYXRlKSA9PiB7CiAgICBpZiAoIWNvbnRleHQyICYmIHR5cGVvZiBkYXRlID09PSAib2JqZWN0IikKICAgICAgY29udGV4dDIgPSBjb25zdHJ1Y3RGcm9tLmJpbmQobnVsbCwgZGF0ZSk7CiAgICBjb25zdCBkYXRlXyA9IHRvRGF0ZShkYXRlLCBjb250ZXh0Mik7CiAgICBpZiAoIXJlc3VsdCB8fCByZXN1bHQgPiBkYXRlXyB8fCBpc05hTigrZGF0ZV8pKSByZXN1bHQgPSBkYXRlXzsKICB9KTsKICByZXR1cm4gY29uc3RydWN0RnJvbShjb250ZXh0MiwgcmVzdWx0IHx8IE5hTik7Cn0KX19uYW1lKG1pbjIsICJtaW4iKTsKdmFyIG1pbl9kZWZhdWx0ID0gbWluMjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvY2xhbXAuanMKZnVuY3Rpb24gY2xhbXAoZGF0ZSwgaW50ZXJ2YWwzLCBvcHRpb25zKSB7CiAgY29uc3QgW2RhdGVfLCBzdGFydCwgZW5kXSA9IG5vcm1hbGl6ZURhdGVzKAogICAgb3B0aW9ucz8uaW4sCiAgICBkYXRlLAogICAgaW50ZXJ2YWwzLnN0YXJ0LAogICAgaW50ZXJ2YWwzLmVuZAogICk7CiAgcmV0dXJuIG1pbjIoW21heDIoW2RhdGVfLCBzdGFydF0sIG9wdGlvbnMpLCBlbmRdLCBvcHRpb25zKTsKfQpfX25hbWUoY2xhbXAsICJjbGFtcCIpOwp2YXIgY2xhbXBfZGVmYXVsdCA9IGNsYW1wOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9jbG9zZXN0SW5kZXhUby5qcwpmdW5jdGlvbiBjbG9zZXN0SW5kZXhUbyhkYXRlVG9Db21wYXJlLCBkYXRlcykgewogIGNvbnN0IHRpbWVUb0NvbXBhcmUgPSArdG9EYXRlKGRhdGVUb0NvbXBhcmUpOwogIGlmIChpc05hTih0aW1lVG9Db21wYXJlKSkgcmV0dXJuIE5hTjsKICBsZXQgcmVzdWx0OwogIGxldCBtaW5EaXN0YW5jZTsKICBkYXRlcy5mb3JFYWNoKChkYXRlLCBpbmRleDIpID0+IHsKICAgIGNvbnN0IGRhdGVfID0gdG9EYXRlKGRhdGUpOwogICAgaWYgKGlzTmFOKCtkYXRlXykpIHsKICAgICAgcmVzdWx0ID0gTmFOOwogICAgICBtaW5EaXN0YW5jZSA9IE5hTjsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLmFicyh0aW1lVG9Db21wYXJlIC0gK2RhdGVfKTsKICAgIGlmIChyZXN1bHQgPT0gbnVsbCB8fCBkaXN0YW5jZSA8IG1pbkRpc3RhbmNlKSB7CiAgICAgIHJlc3VsdCA9IGluZGV4MjsKICAgICAgbWluRGlzdGFuY2UgPSBkaXN0YW5jZTsKICAgIH0KICB9KTsKICByZXR1cm4gcmVzdWx0Owp9Cl9fbmFtZShjbG9zZXN0SW5kZXhUbywgImNsb3Nlc3RJbmRleFRvIik7CnZhciBjbG9zZXN0SW5kZXhUb19kZWZhdWx0ID0gY2xvc2VzdEluZGV4VG87CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2Nsb3Nlc3RUby5qcwpmdW5jdGlvbiBjbG9zZXN0VG8oZGF0ZVRvQ29tcGFyZSwgZGF0ZXMsIG9wdGlvbnMpIHsKICBjb25zdCBbZGF0ZVRvQ29tcGFyZV8sIC4uLmRhdGVzX10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgZGF0ZVRvQ29tcGFyZSwKICAgIC4uLmRhdGVzCiAgKTsKICBjb25zdCBpbmRleDIgPSBjbG9zZXN0SW5kZXhUbyhkYXRlVG9Db21wYXJlXywgZGF0ZXNfKTsKICBpZiAodHlwZW9mIGluZGV4MiA9PT0gIm51bWJlciIgJiYgaXNOYU4oaW5kZXgyKSkKICAgIHJldHVybiBjb25zdHJ1Y3RGcm9tKGRhdGVUb0NvbXBhcmVfLCBOYU4pOwogIGlmIChpbmRleDIgIT09IHZvaWQgMCkgcmV0dXJuIGRhdGVzX1tpbmRleDJdOwp9Cl9fbmFtZShjbG9zZXN0VG8sICJjbG9zZXN0VG8iKTsKdmFyIGNsb3Nlc3RUb19kZWZhdWx0ID0gY2xvc2VzdFRvOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9jb21wYXJlQXNjLmpzCmZ1bmN0aW9uIGNvbXBhcmVBc2MoZGF0ZUxlZnQsIGRhdGVSaWdodCkgewogIGNvbnN0IGRpZmYgPSArdG9EYXRlKGRhdGVMZWZ0KSAtICt0b0RhdGUoZGF0ZVJpZ2h0KTsKICBpZiAoZGlmZiA8IDApIHJldHVybiAtMTsKICBlbHNlIGlmIChkaWZmID4gMCkgcmV0dXJuIDE7CiAgcmV0dXJuIGRpZmY7Cn0KX19uYW1lKGNvbXBhcmVBc2MsICJjb21wYXJlQXNjIik7CnZhciBjb21wYXJlQXNjX2RlZmF1bHQgPSBjb21wYXJlQXNjOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9jb21wYXJlRGVzYy5qcwpmdW5jdGlvbiBjb21wYXJlRGVzYyhkYXRlTGVmdCwgZGF0ZVJpZ2h0KSB7CiAgY29uc3QgZGlmZiA9ICt0b0RhdGUoZGF0ZUxlZnQpIC0gK3RvRGF0ZShkYXRlUmlnaHQpOwogIGlmIChkaWZmID4gMCkgcmV0dXJuIC0xOwogIGVsc2UgaWYgKGRpZmYgPCAwKSByZXR1cm4gMTsKICByZXR1cm4gZGlmZjsKfQpfX25hbWUoY29tcGFyZURlc2MsICJjb21wYXJlRGVzYyIpOwp2YXIgY29tcGFyZURlc2NfZGVmYXVsdCA9IGNvbXBhcmVEZXNjOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9jb25zdHJ1Y3ROb3cuanMKZnVuY3Rpb24gY29uc3RydWN0Tm93KGRhdGUpIHsKICByZXR1cm4gY29uc3RydWN0RnJvbShkYXRlLCBEYXRlLm5vdygpKTsKfQpfX25hbWUoY29uc3RydWN0Tm93LCAiY29uc3RydWN0Tm93Iik7CnZhciBjb25zdHJ1Y3ROb3dfZGVmYXVsdCA9IGNvbnN0cnVjdE5vdzsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGF5c1RvV2Vla3MuanMKZnVuY3Rpb24gZGF5c1RvV2Vla3MoZGF5czIpIHsKICBjb25zdCByZXN1bHQgPSBNYXRoLnRydW5jKGRheXMyIC8gZGF5c0luV2Vlayk7CiAgcmV0dXJuIHJlc3VsdCA9PT0gMCA/IDAgOiByZXN1bHQ7Cn0KX19uYW1lKGRheXNUb1dlZWtzLCAiZGF5c1RvV2Vla3MiKTsKdmFyIGRheXNUb1dlZWtzX2RlZmF1bHQgPSBkYXlzVG9XZWVrczsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNTYW1lRGF5LmpzCmZ1bmN0aW9uIGlzU2FtZURheShsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgW2RhdGVMZWZ0XywgZGF0ZVJpZ2h0X10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgbGF0ZXJEYXRlLAogICAgZWFybGllckRhdGUKICApOwogIHJldHVybiArc3RhcnRPZkRheShkYXRlTGVmdF8pID09PSArc3RhcnRPZkRheShkYXRlUmlnaHRfKTsKfQpfX25hbWUoaXNTYW1lRGF5LCAiaXNTYW1lRGF5Iik7CnZhciBpc1NhbWVEYXlfZGVmYXVsdCA9IGlzU2FtZURheTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNEYXRlLmpzCmZ1bmN0aW9uIGlzRGF0ZSh2YWx1ZTIpIHsKICByZXR1cm4gdmFsdWUyIGluc3RhbmNlb2YgRGF0ZSB8fCB0eXBlb2YgdmFsdWUyID09PSAib2JqZWN0IiAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUyKSA9PT0gIltvYmplY3QgRGF0ZV0iOwp9Cl9fbmFtZShpc0RhdGUsICJpc0RhdGUiKTsKdmFyIGlzRGF0ZV9kZWZhdWx0ID0gaXNEYXRlOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1ZhbGlkLmpzCmZ1bmN0aW9uIGlzVmFsaWQoZGF0ZSkgewogIHJldHVybiAhKCFpc0RhdGUoZGF0ZSkgJiYgdHlwZW9mIGRhdGUgIT09ICJudW1iZXIiIHx8IGlzTmFOKCt0b0RhdGUoZGF0ZSkpKTsKfQpfX25hbWUoaXNWYWxpZCwgImlzVmFsaWQiKTsKdmFyIGlzVmFsaWRfZGVmYXVsdCA9IGlzVmFsaWQ7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2RpZmZlcmVuY2VJbkJ1c2luZXNzRGF5cy5qcwpmdW5jdGlvbiBkaWZmZXJlbmNlSW5CdXNpbmVzc0RheXMobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IFtsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV9dID0gbm9ybWFsaXplRGF0ZXMoCiAgICBvcHRpb25zPy5pbiwKICAgIGxhdGVyRGF0ZSwKICAgIGVhcmxpZXJEYXRlCiAgKTsKICBpZiAoIWlzVmFsaWQobGF0ZXJEYXRlXykgfHwgIWlzVmFsaWQoZWFybGllckRhdGVfKSkgcmV0dXJuIE5hTjsKICBjb25zdCBkaWZmID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGxhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlXyk7CiAgY29uc3Qgc2lnbiA9IGRpZmYgPCAwID8gLTEgOiAxOwogIGNvbnN0IHdlZWtzID0gTWF0aC50cnVuYyhkaWZmIC8gNyk7CiAgbGV0IHJlc3VsdCA9IHdlZWtzICogNTsKICBsZXQgbW92aW5nRGF0ZSA9IGFkZERheXMoZWFybGllckRhdGVfLCB3ZWVrcyAqIDcpOwogIHdoaWxlICghaXNTYW1lRGF5KGxhdGVyRGF0ZV8sIG1vdmluZ0RhdGUpKSB7CiAgICByZXN1bHQgKz0gaXNXZWVrZW5kKG1vdmluZ0RhdGUsIG9wdGlvbnMpID8gMCA6IHNpZ247CiAgICBtb3ZpbmdEYXRlID0gYWRkRGF5cyhtb3ZpbmdEYXRlLCBzaWduKTsKICB9CiAgcmV0dXJuIHJlc3VsdCA9PT0gMCA/IDAgOiByZXN1bHQ7Cn0KX19uYW1lKGRpZmZlcmVuY2VJbkJ1c2luZXNzRGF5cywgImRpZmZlcmVuY2VJbkJ1c2luZXNzRGF5cyIpOwp2YXIgZGlmZmVyZW5jZUluQnVzaW5lc3NEYXlzX2RlZmF1bHQgPSBkaWZmZXJlbmNlSW5CdXNpbmVzc0RheXM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2RpZmZlcmVuY2VJbkNhbGVuZGFySVNPV2Vla1llYXJzLmpzCmZ1bmN0aW9uIGRpZmZlcmVuY2VJbkNhbGVuZGFySVNPV2Vla1llYXJzKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBbbGF0ZXJEYXRlXywgZWFybGllckRhdGVfXSA9IG5vcm1hbGl6ZURhdGVzKAogICAgb3B0aW9ucz8uaW4sCiAgICBsYXRlckRhdGUsCiAgICBlYXJsaWVyRGF0ZQogICk7CiAgcmV0dXJuIGdldElTT1dlZWtZZWFyKGxhdGVyRGF0ZV8sIG9wdGlvbnMpIC0gZ2V0SVNPV2Vla1llYXIoZWFybGllckRhdGVfLCBvcHRpb25zKTsKfQpfX25hbWUoZGlmZmVyZW5jZUluQ2FsZW5kYXJJU09XZWVrWWVhcnMsICJkaWZmZXJlbmNlSW5DYWxlbmRhcklTT1dlZWtZZWFycyIpOwp2YXIgZGlmZmVyZW5jZUluQ2FsZW5kYXJJU09XZWVrWWVhcnNfZGVmYXVsdCA9IGRpZmZlcmVuY2VJbkNhbGVuZGFySVNPV2Vla1llYXJzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5DYWxlbmRhcklTT1dlZWtzLmpzCmZ1bmN0aW9uIGRpZmZlcmVuY2VJbkNhbGVuZGFySVNPV2Vla3MobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IFtsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV9dID0gbm9ybWFsaXplRGF0ZXMoCiAgICBvcHRpb25zPy5pbiwKICAgIGxhdGVyRGF0ZSwKICAgIGVhcmxpZXJEYXRlCiAgKTsKICBjb25zdCBzdGFydE9mSVNPV2Vla0xlZnQgPSBzdGFydE9mSVNPV2VlayhsYXRlckRhdGVfKTsKICBjb25zdCBzdGFydE9mSVNPV2Vla1JpZ2h0ID0gc3RhcnRPZklTT1dlZWsoZWFybGllckRhdGVfKTsKICBjb25zdCB0aW1lc3RhbXBMZWZ0ID0gK3N0YXJ0T2ZJU09XZWVrTGVmdCAtIGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMoc3RhcnRPZklTT1dlZWtMZWZ0KTsKICBjb25zdCB0aW1lc3RhbXBSaWdodCA9ICtzdGFydE9mSVNPV2Vla1JpZ2h0IC0gZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyhzdGFydE9mSVNPV2Vla1JpZ2h0KTsKICByZXR1cm4gTWF0aC5yb3VuZCgodGltZXN0YW1wTGVmdCAtIHRpbWVzdGFtcFJpZ2h0KSAvIG1pbGxpc2Vjb25kc0luV2Vlayk7Cn0KX19uYW1lKGRpZmZlcmVuY2VJbkNhbGVuZGFySVNPV2Vla3MsICJkaWZmZXJlbmNlSW5DYWxlbmRhcklTT1dlZWtzIik7CnZhciBkaWZmZXJlbmNlSW5DYWxlbmRhcklTT1dlZWtzX2RlZmF1bHQgPSBkaWZmZXJlbmNlSW5DYWxlbmRhcklTT1dlZWtzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocy5qcwpmdW5jdGlvbiBkaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgW2xhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgbGF0ZXJEYXRlLAogICAgZWFybGllckRhdGUKICApOwogIGNvbnN0IHllYXJzRGlmZiA9IGxhdGVyRGF0ZV8uZ2V0RnVsbFllYXIoKSAtIGVhcmxpZXJEYXRlXy5nZXRGdWxsWWVhcigpOwogIGNvbnN0IG1vbnRoc0RpZmYgPSBsYXRlckRhdGVfLmdldE1vbnRoKCkgLSBlYXJsaWVyRGF0ZV8uZ2V0TW9udGgoKTsKICByZXR1cm4geWVhcnNEaWZmICogMTIgKyBtb250aHNEaWZmOwp9Cl9fbmFtZShkaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocywgImRpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzIik7CnZhciBkaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRoc19kZWZhdWx0ID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldFF1YXJ0ZXIuanMKZnVuY3Rpb24gZ2V0UXVhcnRlcihkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGNvbnN0IHF1YXJ0ZXIgPSBNYXRoLnRydW5jKF9kYXRlLmdldE1vbnRoKCkgLyAzKSArIDE7CiAgcmV0dXJuIHF1YXJ0ZXI7Cn0KX19uYW1lKGdldFF1YXJ0ZXIsICJnZXRRdWFydGVyIik7CnZhciBnZXRRdWFydGVyX2RlZmF1bHQgPSBnZXRRdWFydGVyOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5DYWxlbmRhclF1YXJ0ZXJzLmpzCmZ1bmN0aW9uIGRpZmZlcmVuY2VJbkNhbGVuZGFyUXVhcnRlcnMobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IFtsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV9dID0gbm9ybWFsaXplRGF0ZXMoCiAgICBvcHRpb25zPy5pbiwKICAgIGxhdGVyRGF0ZSwKICAgIGVhcmxpZXJEYXRlCiAgKTsKICBjb25zdCB5ZWFyc0RpZmYgPSBsYXRlckRhdGVfLmdldEZ1bGxZZWFyKCkgLSBlYXJsaWVyRGF0ZV8uZ2V0RnVsbFllYXIoKTsKICBjb25zdCBxdWFydGVyc0RpZmYgPSBnZXRRdWFydGVyKGxhdGVyRGF0ZV8pIC0gZ2V0UXVhcnRlcihlYXJsaWVyRGF0ZV8pOwogIHJldHVybiB5ZWFyc0RpZmYgKiA0ICsgcXVhcnRlcnNEaWZmOwp9Cl9fbmFtZShkaWZmZXJlbmNlSW5DYWxlbmRhclF1YXJ0ZXJzLCAiZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVycyIpOwp2YXIgZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVyc19kZWZhdWx0ID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVyczsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluQ2FsZW5kYXJXZWVrcy5qcwpmdW5jdGlvbiBkaWZmZXJlbmNlSW5DYWxlbmRhcldlZWtzKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBbbGF0ZXJEYXRlXywgZWFybGllckRhdGVfXSA9IG5vcm1hbGl6ZURhdGVzKAogICAgb3B0aW9ucz8uaW4sCiAgICBsYXRlckRhdGUsCiAgICBlYXJsaWVyRGF0ZQogICk7CiAgY29uc3QgbGF0ZXJTdGFydE9mV2VlayA9IHN0YXJ0T2ZXZWVrKGxhdGVyRGF0ZV8sIG9wdGlvbnMpOwogIGNvbnN0IGVhcmxpZXJTdGFydE9mV2VlayA9IHN0YXJ0T2ZXZWVrKGVhcmxpZXJEYXRlXywgb3B0aW9ucyk7CiAgY29uc3QgbGF0ZXJUaW1lc3RhbXAgPSArbGF0ZXJTdGFydE9mV2VlayAtIGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMobGF0ZXJTdGFydE9mV2Vlayk7CiAgY29uc3QgZWFybGllclRpbWVzdGFtcCA9ICtlYXJsaWVyU3RhcnRPZldlZWsgLSBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKGVhcmxpZXJTdGFydE9mV2Vlayk7CiAgcmV0dXJuIE1hdGgucm91bmQoKGxhdGVyVGltZXN0YW1wIC0gZWFybGllclRpbWVzdGFtcCkgLyBtaWxsaXNlY29uZHNJbldlZWspOwp9Cl9fbmFtZShkaWZmZXJlbmNlSW5DYWxlbmRhcldlZWtzLCAiZGlmZmVyZW5jZUluQ2FsZW5kYXJXZWVrcyIpOwp2YXIgZGlmZmVyZW5jZUluQ2FsZW5kYXJXZWVrc19kZWZhdWx0ID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJXZWVrczsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFycy5qcwpmdW5jdGlvbiBkaWZmZXJlbmNlSW5DYWxlbmRhclllYXJzKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBbbGF0ZXJEYXRlXywgZWFybGllckRhdGVfXSA9IG5vcm1hbGl6ZURhdGVzKAogICAgb3B0aW9ucz8uaW4sCiAgICBsYXRlckRhdGUsCiAgICBlYXJsaWVyRGF0ZQogICk7CiAgcmV0dXJuIGxhdGVyRGF0ZV8uZ2V0RnVsbFllYXIoKSAtIGVhcmxpZXJEYXRlXy5nZXRGdWxsWWVhcigpOwp9Cl9fbmFtZShkaWZmZXJlbmNlSW5DYWxlbmRhclllYXJzLCAiZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFycyIpOwp2YXIgZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFyc19kZWZhdWx0ID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFyczsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluRGF5cy5qcwpmdW5jdGlvbiBkaWZmZXJlbmNlSW5EYXlzKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBbbGF0ZXJEYXRlXywgZWFybGllckRhdGVfXSA9IG5vcm1hbGl6ZURhdGVzKAogICAgb3B0aW9ucz8uaW4sCiAgICBsYXRlckRhdGUsCiAgICBlYXJsaWVyRGF0ZQogICk7CiAgY29uc3Qgc2lnbiA9IGNvbXBhcmVMb2NhbEFzYyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pOwogIGNvbnN0IGRpZmZlcmVuY2UgPSBNYXRoLmFicygKICAgIGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pCiAgKTsKICBsYXRlckRhdGVfLnNldERhdGUobGF0ZXJEYXRlXy5nZXREYXRlKCkgLSBzaWduICogZGlmZmVyZW5jZSk7CiAgY29uc3QgaXNMYXN0RGF5Tm90RnVsbCA9IE51bWJlcigKICAgIGNvbXBhcmVMb2NhbEFzYyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pID09PSAtc2lnbgogICk7CiAgY29uc3QgcmVzdWx0ID0gc2lnbiAqIChkaWZmZXJlbmNlIC0gaXNMYXN0RGF5Tm90RnVsbCk7CiAgcmV0dXJuIHJlc3VsdCA9PT0gMCA/IDAgOiByZXN1bHQ7Cn0KX19uYW1lKGRpZmZlcmVuY2VJbkRheXMsICJkaWZmZXJlbmNlSW5EYXlzIik7CmZ1bmN0aW9uIGNvbXBhcmVMb2NhbEFzYyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlKSB7CiAgY29uc3QgZGlmZiA9IGxhdGVyRGF0ZS5nZXRGdWxsWWVhcigpIC0gZWFybGllckRhdGUuZ2V0RnVsbFllYXIoKSB8fCBsYXRlckRhdGUuZ2V0TW9udGgoKSAtIGVhcmxpZXJEYXRlLmdldE1vbnRoKCkgfHwgbGF0ZXJEYXRlLmdldERhdGUoKSAtIGVhcmxpZXJEYXRlLmdldERhdGUoKSB8fCBsYXRlckRhdGUuZ2V0SG91cnMoKSAtIGVhcmxpZXJEYXRlLmdldEhvdXJzKCkgfHwgbGF0ZXJEYXRlLmdldE1pbnV0ZXMoKSAtIGVhcmxpZXJEYXRlLmdldE1pbnV0ZXMoKSB8fCBsYXRlckRhdGUuZ2V0U2Vjb25kcygpIC0gZWFybGllckRhdGUuZ2V0U2Vjb25kcygpIHx8IGxhdGVyRGF0ZS5nZXRNaWxsaXNlY29uZHMoKSAtIGVhcmxpZXJEYXRlLmdldE1pbGxpc2Vjb25kcygpOwogIGlmIChkaWZmIDwgMCkgcmV0dXJuIC0xOwogIGlmIChkaWZmID4gMCkgcmV0dXJuIDE7CiAgcmV0dXJuIGRpZmY7Cn0KX19uYW1lKGNvbXBhcmVMb2NhbEFzYywgImNvbXBhcmVMb2NhbEFzYyIpOwp2YXIgZGlmZmVyZW5jZUluRGF5c19kZWZhdWx0ID0gZGlmZmVyZW5jZUluRGF5czsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9nZXRSb3VuZGluZ01ldGhvZC5qcwpmdW5jdGlvbiBnZXRSb3VuZGluZ01ldGhvZChtZXRob2QpIHsKICByZXR1cm4gKG51bWJlcjIpID0+IHsKICAgIGNvbnN0IHJvdW5kID0gbWV0aG9kID8gTWF0aFttZXRob2RdIDogTWF0aC50cnVuYzsKICAgIGNvbnN0IHJlc3VsdCA9IHJvdW5kKG51bWJlcjIpOwogICAgcmV0dXJuIHJlc3VsdCA9PT0gMCA/IDAgOiByZXN1bHQ7CiAgfTsKfQpfX25hbWUoZ2V0Um91bmRpbmdNZXRob2QsICJnZXRSb3VuZGluZ01ldGhvZCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5Ib3Vycy5qcwpmdW5jdGlvbiBkaWZmZXJlbmNlSW5Ib3VycyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgW2xhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgbGF0ZXJEYXRlLAogICAgZWFybGllckRhdGUKICApOwogIGNvbnN0IGRpZmYgPSAoK2xhdGVyRGF0ZV8gLSArZWFybGllckRhdGVfKSAvIG1pbGxpc2Vjb25kc0luSG91cjsKICByZXR1cm4gZ2V0Um91bmRpbmdNZXRob2Qob3B0aW9ucz8ucm91bmRpbmdNZXRob2QpKGRpZmYpOwp9Cl9fbmFtZShkaWZmZXJlbmNlSW5Ib3VycywgImRpZmZlcmVuY2VJbkhvdXJzIik7CnZhciBkaWZmZXJlbmNlSW5Ib3Vyc19kZWZhdWx0ID0gZGlmZmVyZW5jZUluSG91cnM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N1YklTT1dlZWtZZWFycy5qcwpmdW5jdGlvbiBzdWJJU09XZWVrWWVhcnMoZGF0ZSwgYW1vdW50LCBvcHRpb25zKSB7CiAgcmV0dXJuIGFkZElTT1dlZWtZZWFycyhkYXRlLCAtYW1vdW50LCBvcHRpb25zKTsKfQpfX25hbWUoc3ViSVNPV2Vla1llYXJzLCAic3ViSVNPV2Vla1llYXJzIik7CnZhciBzdWJJU09XZWVrWWVhcnNfZGVmYXVsdCA9IHN1YklTT1dlZWtZZWFyczsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluSVNPV2Vla1llYXJzLmpzCmZ1bmN0aW9uIGRpZmZlcmVuY2VJbklTT1dlZWtZZWFycyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgW2xhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgbGF0ZXJEYXRlLAogICAgZWFybGllckRhdGUKICApOwogIGNvbnN0IHNpZ24gPSBjb21wYXJlQXNjKGxhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlXyk7CiAgY29uc3QgZGlmZiA9IE1hdGguYWJzKAogICAgZGlmZmVyZW5jZUluQ2FsZW5kYXJJU09XZWVrWWVhcnMobGF0ZXJEYXRlXywgZWFybGllckRhdGVfLCBvcHRpb25zKQogICk7CiAgY29uc3QgYWRqdXN0ZWREYXRlID0gc3ViSVNPV2Vla1llYXJzKGxhdGVyRGF0ZV8sIHNpZ24gKiBkaWZmLCBvcHRpb25zKTsKICBjb25zdCBpc0xhc3RJU09XZWVrWWVhck5vdEZ1bGwgPSBOdW1iZXIoCiAgICBjb21wYXJlQXNjKGFkanVzdGVkRGF0ZSwgZWFybGllckRhdGVfKSA9PT0gLXNpZ24KICApOwogIGNvbnN0IHJlc3VsdCA9IHNpZ24gKiAoZGlmZiAtIGlzTGFzdElTT1dlZWtZZWFyTm90RnVsbCk7CiAgcmV0dXJuIHJlc3VsdCA9PT0gMCA/IDAgOiByZXN1bHQ7Cn0KX19uYW1lKGRpZmZlcmVuY2VJbklTT1dlZWtZZWFycywgImRpZmZlcmVuY2VJbklTT1dlZWtZZWFycyIpOwp2YXIgZGlmZmVyZW5jZUluSVNPV2Vla1llYXJzX2RlZmF1bHQgPSBkaWZmZXJlbmNlSW5JU09XZWVrWWVhcnM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2RpZmZlcmVuY2VJbk1pbGxpc2Vjb25kcy5qcwpmdW5jdGlvbiBkaWZmZXJlbmNlSW5NaWxsaXNlY29uZHMobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSkgewogIHJldHVybiArdG9EYXRlKGxhdGVyRGF0ZSkgLSArdG9EYXRlKGVhcmxpZXJEYXRlKTsKfQpfX25hbWUoZGlmZmVyZW5jZUluTWlsbGlzZWNvbmRzLCAiZGlmZmVyZW5jZUluTWlsbGlzZWNvbmRzIik7CnZhciBkaWZmZXJlbmNlSW5NaWxsaXNlY29uZHNfZGVmYXVsdCA9IGRpZmZlcmVuY2VJbk1pbGxpc2Vjb25kczsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluTWludXRlcy5qcwpmdW5jdGlvbiBkaWZmZXJlbmNlSW5NaW51dGVzKGRhdGVMZWZ0LCBkYXRlUmlnaHQsIG9wdGlvbnMpIHsKICBjb25zdCBkaWZmID0gZGlmZmVyZW5jZUluTWlsbGlzZWNvbmRzKGRhdGVMZWZ0LCBkYXRlUmlnaHQpIC8gbWlsbGlzZWNvbmRzSW5NaW51dGU7CiAgcmV0dXJuIGdldFJvdW5kaW5nTWV0aG9kKG9wdGlvbnM/LnJvdW5kaW5nTWV0aG9kKShkaWZmKTsKfQpfX25hbWUoZGlmZmVyZW5jZUluTWludXRlcywgImRpZmZlcmVuY2VJbk1pbnV0ZXMiKTsKdmFyIGRpZmZlcmVuY2VJbk1pbnV0ZXNfZGVmYXVsdCA9IGRpZmZlcmVuY2VJbk1pbnV0ZXM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VuZE9mRGF5LmpzCmZ1bmN0aW9uIGVuZE9mRGF5KGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgX2RhdGUuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KTsKICByZXR1cm4gX2RhdGU7Cn0KX19uYW1lKGVuZE9mRGF5LCAiZW5kT2ZEYXkiKTsKdmFyIGVuZE9mRGF5X2RlZmF1bHQgPSBlbmRPZkRheTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZW5kT2ZNb250aC5qcwpmdW5jdGlvbiBlbmRPZk1vbnRoKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgbW9udGggPSBfZGF0ZS5nZXRNb250aCgpOwogIF9kYXRlLnNldEZ1bGxZZWFyKF9kYXRlLmdldEZ1bGxZZWFyKCksIG1vbnRoICsgMSwgMCk7CiAgX2RhdGUuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KTsKICByZXR1cm4gX2RhdGU7Cn0KX19uYW1lKGVuZE9mTW9udGgsICJlbmRPZk1vbnRoIik7CnZhciBlbmRPZk1vbnRoX2RlZmF1bHQgPSBlbmRPZk1vbnRoOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc0xhc3REYXlPZk1vbnRoLmpzCmZ1bmN0aW9uIGlzTGFzdERheU9mTW9udGgoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICByZXR1cm4gK2VuZE9mRGF5KF9kYXRlLCBvcHRpb25zKSA9PT0gK2VuZE9mTW9udGgoX2RhdGUsIG9wdGlvbnMpOwp9Cl9fbmFtZShpc0xhc3REYXlPZk1vbnRoLCAiaXNMYXN0RGF5T2ZNb250aCIpOwp2YXIgaXNMYXN0RGF5T2ZNb250aF9kZWZhdWx0ID0gaXNMYXN0RGF5T2ZNb250aDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluTW9udGhzLmpzCmZ1bmN0aW9uIGRpZmZlcmVuY2VJbk1vbnRocyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgW2xhdGVyRGF0ZV8sIHdvcmtpbmdMYXRlckRhdGUsIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgbGF0ZXJEYXRlLAogICAgbGF0ZXJEYXRlLAogICAgZWFybGllckRhdGUKICApOwogIGNvbnN0IHNpZ24gPSBjb21wYXJlQXNjKHdvcmtpbmdMYXRlckRhdGUsIGVhcmxpZXJEYXRlXyk7CiAgY29uc3QgZGlmZmVyZW5jZSA9IE1hdGguYWJzKAogICAgZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMod29ya2luZ0xhdGVyRGF0ZSwgZWFybGllckRhdGVfKQogICk7CiAgaWYgKGRpZmZlcmVuY2UgPCAxKSByZXR1cm4gMDsKICBpZiAod29ya2luZ0xhdGVyRGF0ZS5nZXRNb250aCgpID09PSAxICYmIHdvcmtpbmdMYXRlckRhdGUuZ2V0RGF0ZSgpID4gMjcpCiAgICB3b3JraW5nTGF0ZXJEYXRlLnNldERhdGUoMzApOwogIHdvcmtpbmdMYXRlckRhdGUuc2V0TW9udGgod29ya2luZ0xhdGVyRGF0ZS5nZXRNb250aCgpIC0gc2lnbiAqIGRpZmZlcmVuY2UpOwogIGxldCBpc0xhc3RNb250aE5vdEZ1bGwgPSBjb21wYXJlQXNjKHdvcmtpbmdMYXRlckRhdGUsIGVhcmxpZXJEYXRlXykgPT09IC1zaWduOwogIGlmIChpc0xhc3REYXlPZk1vbnRoKGxhdGVyRGF0ZV8pICYmIGRpZmZlcmVuY2UgPT09IDEgJiYgY29tcGFyZUFzYyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pID09PSAxKSB7CiAgICBpc0xhc3RNb250aE5vdEZ1bGwgPSBmYWxzZTsKICB9CiAgY29uc3QgcmVzdWx0ID0gc2lnbiAqIChkaWZmZXJlbmNlIC0gK2lzTGFzdE1vbnRoTm90RnVsbCk7CiAgcmV0dXJuIHJlc3VsdCA9PT0gMCA/IDAgOiByZXN1bHQ7Cn0KX19uYW1lKGRpZmZlcmVuY2VJbk1vbnRocywgImRpZmZlcmVuY2VJbk1vbnRocyIpOwp2YXIgZGlmZmVyZW5jZUluTW9udGhzX2RlZmF1bHQgPSBkaWZmZXJlbmNlSW5Nb250aHM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2RpZmZlcmVuY2VJblF1YXJ0ZXJzLmpzCmZ1bmN0aW9uIGRpZmZlcmVuY2VJblF1YXJ0ZXJzKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBkaWZmID0gZGlmZmVyZW5jZUluTW9udGhzKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIC8gMzsKICByZXR1cm4gZ2V0Um91bmRpbmdNZXRob2Qob3B0aW9ucz8ucm91bmRpbmdNZXRob2QpKGRpZmYpOwp9Cl9fbmFtZShkaWZmZXJlbmNlSW5RdWFydGVycywgImRpZmZlcmVuY2VJblF1YXJ0ZXJzIik7CnZhciBkaWZmZXJlbmNlSW5RdWFydGVyc19kZWZhdWx0ID0gZGlmZmVyZW5jZUluUXVhcnRlcnM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2RpZmZlcmVuY2VJblNlY29uZHMuanMKZnVuY3Rpb24gZGlmZmVyZW5jZUluU2Vjb25kcyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgZGlmZiA9IGRpZmZlcmVuY2VJbk1pbGxpc2Vjb25kcyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlKSAvIDFlMzsKICByZXR1cm4gZ2V0Um91bmRpbmdNZXRob2Qob3B0aW9ucz8ucm91bmRpbmdNZXRob2QpKGRpZmYpOwp9Cl9fbmFtZShkaWZmZXJlbmNlSW5TZWNvbmRzLCAiZGlmZmVyZW5jZUluU2Vjb25kcyIpOwp2YXIgZGlmZmVyZW5jZUluU2Vjb25kc19kZWZhdWx0ID0gZGlmZmVyZW5jZUluU2Vjb25kczsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluV2Vla3MuanMKZnVuY3Rpb24gZGlmZmVyZW5jZUluV2Vla3MobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IGRpZmYgPSBkaWZmZXJlbmNlSW5EYXlzKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIC8gNzsKICByZXR1cm4gZ2V0Um91bmRpbmdNZXRob2Qob3B0aW9ucz8ucm91bmRpbmdNZXRob2QpKGRpZmYpOwp9Cl9fbmFtZShkaWZmZXJlbmNlSW5XZWVrcywgImRpZmZlcmVuY2VJbldlZWtzIik7CnZhciBkaWZmZXJlbmNlSW5XZWVrc19kZWZhdWx0ID0gZGlmZmVyZW5jZUluV2Vla3M7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2RpZmZlcmVuY2VJblllYXJzLmpzCmZ1bmN0aW9uIGRpZmZlcmVuY2VJblllYXJzKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBbbGF0ZXJEYXRlXywgZWFybGllckRhdGVfXSA9IG5vcm1hbGl6ZURhdGVzKAogICAgb3B0aW9ucz8uaW4sCiAgICBsYXRlckRhdGUsCiAgICBlYXJsaWVyRGF0ZQogICk7CiAgY29uc3Qgc2lnbiA9IGNvbXBhcmVBc2MobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKTsKICBjb25zdCBkaWZmID0gTWF0aC5hYnMoZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFycyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pKTsKICBsYXRlckRhdGVfLnNldEZ1bGxZZWFyKDE1ODQpOwogIGVhcmxpZXJEYXRlXy5zZXRGdWxsWWVhcigxNTg0KTsKICBjb25zdCBwYXJ0aWFsID0gY29tcGFyZUFzYyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pID09PSAtc2lnbjsKICBjb25zdCByZXN1bHQgPSBzaWduICogKGRpZmYgLSArcGFydGlhbCk7CiAgcmV0dXJuIHJlc3VsdCA9PT0gMCA/IDAgOiByZXN1bHQ7Cn0KX19uYW1lKGRpZmZlcmVuY2VJblllYXJzLCAiZGlmZmVyZW5jZUluWWVhcnMiKTsKdmFyIGRpZmZlcmVuY2VJblllYXJzX2RlZmF1bHQgPSBkaWZmZXJlbmNlSW5ZZWFyczsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9ub3JtYWxpemVJbnRlcnZhbC5qcwpmdW5jdGlvbiBub3JtYWxpemVJbnRlcnZhbChjb250ZXh0MiwgaW50ZXJ2YWwzKSB7CiAgY29uc3QgW3N0YXJ0LCBlbmRdID0gbm9ybWFsaXplRGF0ZXMoY29udGV4dDIsIGludGVydmFsMy5zdGFydCwgaW50ZXJ2YWwzLmVuZCk7CiAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9Owp9Cl9fbmFtZShub3JtYWxpemVJbnRlcnZhbCwgIm5vcm1hbGl6ZUludGVydmFsIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VhY2hEYXlPZkludGVydmFsLmpzCmZ1bmN0aW9uIGVhY2hEYXlPZkludGVydmFsKGludGVydmFsMywgb3B0aW9ucykgewogIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gbm9ybWFsaXplSW50ZXJ2YWwob3B0aW9ucz8uaW4sIGludGVydmFsMyk7CiAgbGV0IHJldmVyc2VkID0gK3N0YXJ0ID4gK2VuZDsKICBjb25zdCBlbmRUaW1lID0gcmV2ZXJzZWQgPyArc3RhcnQgOiArZW5kOwogIGNvbnN0IGRhdGUgPSByZXZlcnNlZCA/IGVuZCA6IHN0YXJ0OwogIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgbGV0IHN0ZXAgPSBvcHRpb25zPy5zdGVwID8/IDE7CiAgaWYgKCFzdGVwKSByZXR1cm4gW107CiAgaWYgKHN0ZXAgPCAwKSB7CiAgICBzdGVwID0gLXN0ZXA7CiAgICByZXZlcnNlZCA9ICFyZXZlcnNlZDsKICB9CiAgY29uc3QgZGF0ZXMgPSBbXTsKICB3aGlsZSAoK2RhdGUgPD0gZW5kVGltZSkgewogICAgZGF0ZXMucHVzaChjb25zdHJ1Y3RGcm9tKHN0YXJ0LCBkYXRlKSk7CiAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyBzdGVwKTsKICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgfQogIHJldHVybiByZXZlcnNlZCA/IGRhdGVzLnJldmVyc2UoKSA6IGRhdGVzOwp9Cl9fbmFtZShlYWNoRGF5T2ZJbnRlcnZhbCwgImVhY2hEYXlPZkludGVydmFsIik7CnZhciBlYWNoRGF5T2ZJbnRlcnZhbF9kZWZhdWx0ID0gZWFjaERheU9mSW50ZXJ2YWw7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VhY2hIb3VyT2ZJbnRlcnZhbC5qcwpmdW5jdGlvbiBlYWNoSG91ck9mSW50ZXJ2YWwoaW50ZXJ2YWwzLCBvcHRpb25zKSB7CiAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSBub3JtYWxpemVJbnRlcnZhbChvcHRpb25zPy5pbiwgaW50ZXJ2YWwzKTsKICBsZXQgcmV2ZXJzZWQgPSArc3RhcnQgPiArZW5kOwogIGNvbnN0IGVuZFRpbWUgPSByZXZlcnNlZCA/ICtzdGFydCA6ICtlbmQ7CiAgY29uc3QgZGF0ZSA9IHJldmVyc2VkID8gZW5kIDogc3RhcnQ7CiAgZGF0ZS5zZXRNaW51dGVzKDAsIDAsIDApOwogIGxldCBzdGVwID0gb3B0aW9ucz8uc3RlcCA/PyAxOwogIGlmICghc3RlcCkgcmV0dXJuIFtdOwogIGlmIChzdGVwIDwgMCkgewogICAgc3RlcCA9IC1zdGVwOwogICAgcmV2ZXJzZWQgPSAhcmV2ZXJzZWQ7CiAgfQogIGNvbnN0IGRhdGVzID0gW107CiAgd2hpbGUgKCtkYXRlIDw9IGVuZFRpbWUpIHsKICAgIGRhdGVzLnB1c2goY29uc3RydWN0RnJvbShzdGFydCwgZGF0ZSkpOwogICAgZGF0ZS5zZXRIb3VycyhkYXRlLmdldEhvdXJzKCkgKyBzdGVwKTsKICB9CiAgcmV0dXJuIHJldmVyc2VkID8gZGF0ZXMucmV2ZXJzZSgpIDogZGF0ZXM7Cn0KX19uYW1lKGVhY2hIb3VyT2ZJbnRlcnZhbCwgImVhY2hIb3VyT2ZJbnRlcnZhbCIpOwp2YXIgZWFjaEhvdXJPZkludGVydmFsX2RlZmF1bHQgPSBlYWNoSG91ck9mSW50ZXJ2YWw7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VhY2hNaW51dGVPZkludGVydmFsLmpzCmZ1bmN0aW9uIGVhY2hNaW51dGVPZkludGVydmFsKGludGVydmFsMywgb3B0aW9ucykgewogIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gbm9ybWFsaXplSW50ZXJ2YWwob3B0aW9ucz8uaW4sIGludGVydmFsMyk7CiAgc3RhcnQuc2V0U2Vjb25kcygwLCAwKTsKICBsZXQgcmV2ZXJzZWQgPSArc3RhcnQgPiArZW5kOwogIGNvbnN0IGVuZFRpbWUgPSByZXZlcnNlZCA/ICtzdGFydCA6ICtlbmQ7CiAgbGV0IGRhdGUgPSByZXZlcnNlZCA/IGVuZCA6IHN0YXJ0OwogIGxldCBzdGVwID0gb3B0aW9ucz8uc3RlcCA/PyAxOwogIGlmICghc3RlcCkgcmV0dXJuIFtdOwogIGlmIChzdGVwIDwgMCkgewogICAgc3RlcCA9IC1zdGVwOwogICAgcmV2ZXJzZWQgPSAhcmV2ZXJzZWQ7CiAgfQogIGNvbnN0IGRhdGVzID0gW107CiAgd2hpbGUgKCtkYXRlIDw9IGVuZFRpbWUpIHsKICAgIGRhdGVzLnB1c2goY29uc3RydWN0RnJvbShzdGFydCwgZGF0ZSkpOwogICAgZGF0ZSA9IGFkZE1pbnV0ZXMoZGF0ZSwgc3RlcCk7CiAgfQogIHJldHVybiByZXZlcnNlZCA/IGRhdGVzLnJldmVyc2UoKSA6IGRhdGVzOwp9Cl9fbmFtZShlYWNoTWludXRlT2ZJbnRlcnZhbCwgImVhY2hNaW51dGVPZkludGVydmFsIik7CnZhciBlYWNoTWludXRlT2ZJbnRlcnZhbF9kZWZhdWx0ID0gZWFjaE1pbnV0ZU9mSW50ZXJ2YWw7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VhY2hNb250aE9mSW50ZXJ2YWwuanMKZnVuY3Rpb24gZWFjaE1vbnRoT2ZJbnRlcnZhbChpbnRlcnZhbDMsIG9wdGlvbnMpIHsKICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IG5vcm1hbGl6ZUludGVydmFsKG9wdGlvbnM/LmluLCBpbnRlcnZhbDMpOwogIGxldCByZXZlcnNlZCA9ICtzdGFydCA+ICtlbmQ7CiAgY29uc3QgZW5kVGltZSA9IHJldmVyc2VkID8gK3N0YXJ0IDogK2VuZDsKICBjb25zdCBkYXRlID0gcmV2ZXJzZWQgPyBlbmQgOiBzdGFydDsKICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogIGRhdGUuc2V0RGF0ZSgxKTsKICBsZXQgc3RlcCA9IG9wdGlvbnM/LnN0ZXAgPz8gMTsKICBpZiAoIXN0ZXApIHJldHVybiBbXTsKICBpZiAoc3RlcCA8IDApIHsKICAgIHN0ZXAgPSAtc3RlcDsKICAgIHJldmVyc2VkID0gIXJldmVyc2VkOwogIH0KICBjb25zdCBkYXRlcyA9IFtdOwogIHdoaWxlICgrZGF0ZSA8PSBlbmRUaW1lKSB7CiAgICBkYXRlcy5wdXNoKGNvbnN0cnVjdEZyb20oc3RhcnQsIGRhdGUpKTsKICAgIGRhdGUuc2V0TW9udGgoZGF0ZS5nZXRNb250aCgpICsgc3RlcCk7CiAgfQogIHJldHVybiByZXZlcnNlZCA/IGRhdGVzLnJldmVyc2UoKSA6IGRhdGVzOwp9Cl9fbmFtZShlYWNoTW9udGhPZkludGVydmFsLCAiZWFjaE1vbnRoT2ZJbnRlcnZhbCIpOwp2YXIgZWFjaE1vbnRoT2ZJbnRlcnZhbF9kZWZhdWx0ID0gZWFjaE1vbnRoT2ZJbnRlcnZhbDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZlF1YXJ0ZXIuanMKZnVuY3Rpb24gc3RhcnRPZlF1YXJ0ZXIoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCBjdXJyZW50TW9udGggPSBfZGF0ZS5nZXRNb250aCgpOwogIGNvbnN0IG1vbnRoID0gY3VycmVudE1vbnRoIC0gY3VycmVudE1vbnRoICUgMzsKICBfZGF0ZS5zZXRNb250aChtb250aCwgMSk7CiAgX2RhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgcmV0dXJuIF9kYXRlOwp9Cl9fbmFtZShzdGFydE9mUXVhcnRlciwgInN0YXJ0T2ZRdWFydGVyIik7CnZhciBzdGFydE9mUXVhcnRlcl9kZWZhdWx0ID0gc3RhcnRPZlF1YXJ0ZXI7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VhY2hRdWFydGVyT2ZJbnRlcnZhbC5qcwpmdW5jdGlvbiBlYWNoUXVhcnRlck9mSW50ZXJ2YWwoaW50ZXJ2YWwzLCBvcHRpb25zKSB7CiAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSBub3JtYWxpemVJbnRlcnZhbChvcHRpb25zPy5pbiwgaW50ZXJ2YWwzKTsKICBsZXQgcmV2ZXJzZWQgPSArc3RhcnQgPiArZW5kOwogIGNvbnN0IGVuZFRpbWUgPSByZXZlcnNlZCA/ICtzdGFydE9mUXVhcnRlcihzdGFydCkgOiArc3RhcnRPZlF1YXJ0ZXIoZW5kKTsKICBsZXQgZGF0ZSA9IHJldmVyc2VkID8gc3RhcnRPZlF1YXJ0ZXIoZW5kKSA6IHN0YXJ0T2ZRdWFydGVyKHN0YXJ0KTsKICBsZXQgc3RlcCA9IG9wdGlvbnM/LnN0ZXAgPz8gMTsKICBpZiAoIXN0ZXApIHJldHVybiBbXTsKICBpZiAoc3RlcCA8IDApIHsKICAgIHN0ZXAgPSAtc3RlcDsKICAgIHJldmVyc2VkID0gIXJldmVyc2VkOwogIH0KICBjb25zdCBkYXRlcyA9IFtdOwogIHdoaWxlICgrZGF0ZSA8PSBlbmRUaW1lKSB7CiAgICBkYXRlcy5wdXNoKGNvbnN0cnVjdEZyb20oc3RhcnQsIGRhdGUpKTsKICAgIGRhdGUgPSBhZGRRdWFydGVycyhkYXRlLCBzdGVwKTsKICB9CiAgcmV0dXJuIHJldmVyc2VkID8gZGF0ZXMucmV2ZXJzZSgpIDogZGF0ZXM7Cn0KX19uYW1lKGVhY2hRdWFydGVyT2ZJbnRlcnZhbCwgImVhY2hRdWFydGVyT2ZJbnRlcnZhbCIpOwp2YXIgZWFjaFF1YXJ0ZXJPZkludGVydmFsX2RlZmF1bHQgPSBlYWNoUXVhcnRlck9mSW50ZXJ2YWw7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VhY2hXZWVrT2ZJbnRlcnZhbC5qcwpmdW5jdGlvbiBlYWNoV2Vla09mSW50ZXJ2YWwoaW50ZXJ2YWwzLCBvcHRpb25zKSB7CiAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSBub3JtYWxpemVJbnRlcnZhbChvcHRpb25zPy5pbiwgaW50ZXJ2YWwzKTsKICBsZXQgcmV2ZXJzZWQgPSArc3RhcnQgPiArZW5kOwogIGNvbnN0IHN0YXJ0RGF0ZVdlZWsgPSByZXZlcnNlZCA/IHN0YXJ0T2ZXZWVrKGVuZCwgb3B0aW9ucykgOiBzdGFydE9mV2VlayhzdGFydCwgb3B0aW9ucyk7CiAgY29uc3QgZW5kRGF0ZVdlZWsgPSByZXZlcnNlZCA/IHN0YXJ0T2ZXZWVrKHN0YXJ0LCBvcHRpb25zKSA6IHN0YXJ0T2ZXZWVrKGVuZCwgb3B0aW9ucyk7CiAgc3RhcnREYXRlV2Vlay5zZXRIb3VycygxNSk7CiAgZW5kRGF0ZVdlZWsuc2V0SG91cnMoMTUpOwogIGNvbnN0IGVuZFRpbWUgPSArZW5kRGF0ZVdlZWsuZ2V0VGltZSgpOwogIGxldCBjdXJyZW50RGF0ZSA9IHN0YXJ0RGF0ZVdlZWs7CiAgbGV0IHN0ZXAgPSBvcHRpb25zPy5zdGVwID8/IDE7CiAgaWYgKCFzdGVwKSByZXR1cm4gW107CiAgaWYgKHN0ZXAgPCAwKSB7CiAgICBzdGVwID0gLXN0ZXA7CiAgICByZXZlcnNlZCA9ICFyZXZlcnNlZDsKICB9CiAgY29uc3QgZGF0ZXMgPSBbXTsKICB3aGlsZSAoK2N1cnJlbnREYXRlIDw9IGVuZFRpbWUpIHsKICAgIGN1cnJlbnREYXRlLnNldEhvdXJzKDApOwogICAgZGF0ZXMucHVzaChjb25zdHJ1Y3RGcm9tKHN0YXJ0LCBjdXJyZW50RGF0ZSkpOwogICAgY3VycmVudERhdGUgPSBhZGRXZWVrcyhjdXJyZW50RGF0ZSwgc3RlcCk7CiAgICBjdXJyZW50RGF0ZS5zZXRIb3VycygxNSk7CiAgfQogIHJldHVybiByZXZlcnNlZCA/IGRhdGVzLnJldmVyc2UoKSA6IGRhdGVzOwp9Cl9fbmFtZShlYWNoV2Vla09mSW50ZXJ2YWwsICJlYWNoV2Vla09mSW50ZXJ2YWwiKTsKdmFyIGVhY2hXZWVrT2ZJbnRlcnZhbF9kZWZhdWx0ID0gZWFjaFdlZWtPZkludGVydmFsOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lYWNoV2Vla2VuZE9mSW50ZXJ2YWwuanMKZnVuY3Rpb24gZWFjaFdlZWtlbmRPZkludGVydmFsKGludGVydmFsMywgb3B0aW9ucykgewogIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gbm9ybWFsaXplSW50ZXJ2YWwob3B0aW9ucz8uaW4sIGludGVydmFsMyk7CiAgY29uc3QgZGF0ZUludGVydmFsID0gZWFjaERheU9mSW50ZXJ2YWwoeyBzdGFydCwgZW5kIH0sIG9wdGlvbnMpOwogIGNvbnN0IHdlZWtlbmRzID0gW107CiAgbGV0IGluZGV4MiA9IDA7CiAgd2hpbGUgKGluZGV4MiA8IGRhdGVJbnRlcnZhbC5sZW5ndGgpIHsKICAgIGNvbnN0IGRhdGUgPSBkYXRlSW50ZXJ2YWxbaW5kZXgyKytdOwogICAgaWYgKGlzV2Vla2VuZChkYXRlKSkgd2Vla2VuZHMucHVzaChjb25zdHJ1Y3RGcm9tKHN0YXJ0LCBkYXRlKSk7CiAgfQogIHJldHVybiB3ZWVrZW5kczsKfQpfX25hbWUoZWFjaFdlZWtlbmRPZkludGVydmFsLCAiZWFjaFdlZWtlbmRPZkludGVydmFsIik7CnZhciBlYWNoV2Vla2VuZE9mSW50ZXJ2YWxfZGVmYXVsdCA9IGVhY2hXZWVrZW5kT2ZJbnRlcnZhbDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZk1vbnRoLmpzCmZ1bmN0aW9uIHN0YXJ0T2ZNb250aChkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIF9kYXRlLnNldERhdGUoMSk7CiAgX2RhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgcmV0dXJuIF9kYXRlOwp9Cl9fbmFtZShzdGFydE9mTW9udGgsICJzdGFydE9mTW9udGgiKTsKdmFyIHN0YXJ0T2ZNb250aF9kZWZhdWx0ID0gc3RhcnRPZk1vbnRoOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lYWNoV2Vla2VuZE9mTW9udGguanMKZnVuY3Rpb24gZWFjaFdlZWtlbmRPZk1vbnRoKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBzdGFydCA9IHN0YXJ0T2ZNb250aChkYXRlLCBvcHRpb25zKTsKICBjb25zdCBlbmQgPSBlbmRPZk1vbnRoKGRhdGUsIG9wdGlvbnMpOwogIHJldHVybiBlYWNoV2Vla2VuZE9mSW50ZXJ2YWwoeyBzdGFydCwgZW5kIH0sIG9wdGlvbnMpOwp9Cl9fbmFtZShlYWNoV2Vla2VuZE9mTW9udGgsICJlYWNoV2Vla2VuZE9mTW9udGgiKTsKdmFyIGVhY2hXZWVrZW5kT2ZNb250aF9kZWZhdWx0ID0gZWFjaFdlZWtlbmRPZk1vbnRoOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lbmRPZlllYXIuanMKZnVuY3Rpb24gZW5kT2ZZZWFyKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgeWVhciA9IF9kYXRlLmdldEZ1bGxZZWFyKCk7CiAgX2RhdGUuc2V0RnVsbFllYXIoeWVhciArIDEsIDAsIDApOwogIF9kYXRlLnNldEhvdXJzKDIzLCA1OSwgNTksIDk5OSk7CiAgcmV0dXJuIF9kYXRlOwp9Cl9fbmFtZShlbmRPZlllYXIsICJlbmRPZlllYXIiKTsKdmFyIGVuZE9mWWVhcl9kZWZhdWx0ID0gZW5kT2ZZZWFyOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mWWVhci5qcwpmdW5jdGlvbiBzdGFydE9mWWVhcihkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgZGF0ZV8gPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGRhdGVfLnNldEZ1bGxZZWFyKGRhdGVfLmdldEZ1bGxZZWFyKCksIDAsIDEpOwogIGRhdGVfLnNldEhvdXJzKDAsIDAsIDAsIDApOwogIHJldHVybiBkYXRlXzsKfQpfX25hbWUoc3RhcnRPZlllYXIsICJzdGFydE9mWWVhciIpOwp2YXIgc3RhcnRPZlllYXJfZGVmYXVsdCA9IHN0YXJ0T2ZZZWFyOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lYWNoV2Vla2VuZE9mWWVhci5qcwpmdW5jdGlvbiBlYWNoV2Vla2VuZE9mWWVhcihkYXRlLCBvcHRpb25zKSB7CiAgY29uc3Qgc3RhcnQgPSBzdGFydE9mWWVhcihkYXRlLCBvcHRpb25zKTsKICBjb25zdCBlbmQgPSBlbmRPZlllYXIoZGF0ZSwgb3B0aW9ucyk7CiAgcmV0dXJuIGVhY2hXZWVrZW5kT2ZJbnRlcnZhbCh7IHN0YXJ0LCBlbmQgfSwgb3B0aW9ucyk7Cn0KX19uYW1lKGVhY2hXZWVrZW5kT2ZZZWFyLCAiZWFjaFdlZWtlbmRPZlllYXIiKTsKdmFyIGVhY2hXZWVrZW5kT2ZZZWFyX2RlZmF1bHQgPSBlYWNoV2Vla2VuZE9mWWVhcjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZWFjaFllYXJPZkludGVydmFsLmpzCmZ1bmN0aW9uIGVhY2hZZWFyT2ZJbnRlcnZhbChpbnRlcnZhbDMsIG9wdGlvbnMpIHsKICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IG5vcm1hbGl6ZUludGVydmFsKG9wdGlvbnM/LmluLCBpbnRlcnZhbDMpOwogIGxldCByZXZlcnNlZCA9ICtzdGFydCA+ICtlbmQ7CiAgY29uc3QgZW5kVGltZSA9IHJldmVyc2VkID8gK3N0YXJ0IDogK2VuZDsKICBjb25zdCBkYXRlID0gcmV2ZXJzZWQgPyBlbmQgOiBzdGFydDsKICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogIGRhdGUuc2V0TW9udGgoMCwgMSk7CiAgbGV0IHN0ZXAgPSBvcHRpb25zPy5zdGVwID8/IDE7CiAgaWYgKCFzdGVwKSByZXR1cm4gW107CiAgaWYgKHN0ZXAgPCAwKSB7CiAgICBzdGVwID0gLXN0ZXA7CiAgICByZXZlcnNlZCA9ICFyZXZlcnNlZDsKICB9CiAgY29uc3QgZGF0ZXMgPSBbXTsKICB3aGlsZSAoK2RhdGUgPD0gZW5kVGltZSkgewogICAgZGF0ZXMucHVzaChjb25zdHJ1Y3RGcm9tKHN0YXJ0LCBkYXRlKSk7CiAgICBkYXRlLnNldEZ1bGxZZWFyKGRhdGUuZ2V0RnVsbFllYXIoKSArIHN0ZXApOwogIH0KICByZXR1cm4gcmV2ZXJzZWQgPyBkYXRlcy5yZXZlcnNlKCkgOiBkYXRlczsKfQpfX25hbWUoZWFjaFllYXJPZkludGVydmFsLCAiZWFjaFllYXJPZkludGVydmFsIik7CnZhciBlYWNoWWVhck9mSW50ZXJ2YWxfZGVmYXVsdCA9IGVhY2hZZWFyT2ZJbnRlcnZhbDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZW5kT2ZEZWNhZGUuanMKZnVuY3Rpb24gZW5kT2ZEZWNhZGUoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCB5ZWFyID0gX2RhdGUuZ2V0RnVsbFllYXIoKTsKICBjb25zdCBkZWNhZGUgPSA5ICsgTWF0aC5mbG9vcih5ZWFyIC8gMTApICogMTA7CiAgX2RhdGUuc2V0RnVsbFllYXIoZGVjYWRlLCAxMSwgMzEpOwogIF9kYXRlLnNldEhvdXJzKDIzLCA1OSwgNTksIDk5OSk7CiAgcmV0dXJuIF9kYXRlOwp9Cl9fbmFtZShlbmRPZkRlY2FkZSwgImVuZE9mRGVjYWRlIik7CnZhciBlbmRPZkRlY2FkZV9kZWZhdWx0ID0gZW5kT2ZEZWNhZGU7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VuZE9mSG91ci5qcwpmdW5jdGlvbiBlbmRPZkhvdXIoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBfZGF0ZS5zZXRNaW51dGVzKDU5LCA1OSwgOTk5KTsKICByZXR1cm4gX2RhdGU7Cn0KX19uYW1lKGVuZE9mSG91ciwgImVuZE9mSG91ciIpOwp2YXIgZW5kT2ZIb3VyX2RlZmF1bHQgPSBlbmRPZkhvdXI7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VuZE9mV2Vlay5qcwpmdW5jdGlvbiBlbmRPZldlZWsoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IGRlZmF1bHRPcHRpb25zMiA9IGdldERlZmF1bHRPcHRpb25zKCk7CiAgY29uc3Qgd2Vla1N0YXJ0c09uID0gb3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/IG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/IGRlZmF1bHRPcHRpb25zMi53ZWVrU3RhcnRzT24gPz8gZGVmYXVsdE9wdGlvbnMyLmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/IDA7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGNvbnN0IGRheSA9IF9kYXRlLmdldERheSgpOwogIGNvbnN0IGRpZmYgPSAoZGF5IDwgd2Vla1N0YXJ0c09uID8gLTcgOiAwKSArIDYgLSAoZGF5IC0gd2Vla1N0YXJ0c09uKTsKICBfZGF0ZS5zZXREYXRlKF9kYXRlLmdldERhdGUoKSArIGRpZmYpOwogIF9kYXRlLnNldEhvdXJzKDIzLCA1OSwgNTksIDk5OSk7CiAgcmV0dXJuIF9kYXRlOwp9Cl9fbmFtZShlbmRPZldlZWssICJlbmRPZldlZWsiKTsKdmFyIGVuZE9mV2Vla19kZWZhdWx0ID0gZW5kT2ZXZWVrOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lbmRPZklTT1dlZWsuanMKZnVuY3Rpb24gZW5kT2ZJU09XZWVrKGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gZW5kT2ZXZWVrKGRhdGUsIHsgLi4ub3B0aW9ucywgd2Vla1N0YXJ0c09uOiAxIH0pOwp9Cl9fbmFtZShlbmRPZklTT1dlZWssICJlbmRPZklTT1dlZWsiKTsKdmFyIGVuZE9mSVNPV2Vla19kZWZhdWx0ID0gZW5kT2ZJU09XZWVrOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lbmRPZklTT1dlZWtZZWFyLmpzCmZ1bmN0aW9uIGVuZE9mSVNPV2Vla1llYXIoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IHllYXIgPSBnZXRJU09XZWVrWWVhcihkYXRlLCBvcHRpb25zKTsKICBjb25zdCBmb3VydGhPZkphbnVhcnlPZk5leHRZZWFyID0gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCAwKTsKICBmb3VydGhPZkphbnVhcnlPZk5leHRZZWFyLnNldEZ1bGxZZWFyKHllYXIgKyAxLCAwLCA0KTsKICBmb3VydGhPZkphbnVhcnlPZk5leHRZZWFyLnNldEhvdXJzKDAsIDAsIDAsIDApOwogIGNvbnN0IF9kYXRlID0gc3RhcnRPZklTT1dlZWsoZm91cnRoT2ZKYW51YXJ5T2ZOZXh0WWVhciwgb3B0aW9ucyk7CiAgX2RhdGUuc2V0TWlsbGlzZWNvbmRzKF9kYXRlLmdldE1pbGxpc2Vjb25kcygpIC0gMSk7CiAgcmV0dXJuIF9kYXRlOwp9Cl9fbmFtZShlbmRPZklTT1dlZWtZZWFyLCAiZW5kT2ZJU09XZWVrWWVhciIpOwp2YXIgZW5kT2ZJU09XZWVrWWVhcl9kZWZhdWx0ID0gZW5kT2ZJU09XZWVrWWVhcjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZW5kT2ZNaW51dGUuanMKZnVuY3Rpb24gZW5kT2ZNaW51dGUoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBfZGF0ZS5zZXRTZWNvbmRzKDU5LCA5OTkpOwogIHJldHVybiBfZGF0ZTsKfQpfX25hbWUoZW5kT2ZNaW51dGUsICJlbmRPZk1pbnV0ZSIpOwp2YXIgZW5kT2ZNaW51dGVfZGVmYXVsdCA9IGVuZE9mTWludXRlOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lbmRPZlF1YXJ0ZXIuanMKZnVuY3Rpb24gZW5kT2ZRdWFydGVyKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgY3VycmVudE1vbnRoID0gX2RhdGUuZ2V0TW9udGgoKTsKICBjb25zdCBtb250aCA9IGN1cnJlbnRNb250aCAtIGN1cnJlbnRNb250aCAlIDMgKyAzOwogIF9kYXRlLnNldE1vbnRoKG1vbnRoLCAwKTsKICBfZGF0ZS5zZXRIb3VycygyMywgNTksIDU5LCA5OTkpOwogIHJldHVybiBfZGF0ZTsKfQpfX25hbWUoZW5kT2ZRdWFydGVyLCAiZW5kT2ZRdWFydGVyIik7CnZhciBlbmRPZlF1YXJ0ZXJfZGVmYXVsdCA9IGVuZE9mUXVhcnRlcjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZW5kT2ZTZWNvbmQuanMKZnVuY3Rpb24gZW5kT2ZTZWNvbmQoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBfZGF0ZS5zZXRNaWxsaXNlY29uZHMoOTk5KTsKICByZXR1cm4gX2RhdGU7Cn0KX19uYW1lKGVuZE9mU2Vjb25kLCAiZW5kT2ZTZWNvbmQiKTsKdmFyIGVuZE9mU2Vjb25kX2RlZmF1bHQgPSBlbmRPZlNlY29uZDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZW5kT2ZUb2RheS5qcwpmdW5jdGlvbiBlbmRPZlRvZGF5KG9wdGlvbnMpIHsKICByZXR1cm4gZW5kT2ZEYXkoRGF0ZS5ub3coKSwgb3B0aW9ucyk7Cn0KX19uYW1lKGVuZE9mVG9kYXksICJlbmRPZlRvZGF5Iik7CnZhciBlbmRPZlRvZGF5X2RlZmF1bHQgPSBlbmRPZlRvZGF5OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lbmRPZlRvbW9ycm93LmpzCmZ1bmN0aW9uIGVuZE9mVG9tb3Jyb3cob3B0aW9ucykgewogIGNvbnN0IG5vdzIgPSBjb25zdHJ1Y3ROb3cob3B0aW9ucz8uaW4pOwogIGNvbnN0IHllYXIgPSBub3cyLmdldEZ1bGxZZWFyKCk7CiAgY29uc3QgbW9udGggPSBub3cyLmdldE1vbnRoKCk7CiAgY29uc3QgZGF5ID0gbm93Mi5nZXREYXRlKCk7CiAgY29uc3QgZGF0ZSA9IGNvbnN0cnVjdE5vdyhvcHRpb25zPy5pbik7CiAgZGF0ZS5zZXRGdWxsWWVhcih5ZWFyLCBtb250aCwgZGF5ICsgMSk7CiAgZGF0ZS5zZXRIb3VycygyMywgNTksIDU5LCA5OTkpOwogIHJldHVybiBvcHRpb25zPy5pbiA/IG9wdGlvbnMuaW4oZGF0ZSkgOiBkYXRlOwp9Cl9fbmFtZShlbmRPZlRvbW9ycm93LCAiZW5kT2ZUb21vcnJvdyIpOwp2YXIgZW5kT2ZUb21vcnJvd19kZWZhdWx0ID0gZW5kT2ZUb21vcnJvdzsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZW5kT2ZZZXN0ZXJkYXkuanMKZnVuY3Rpb24gZW5kT2ZZZXN0ZXJkYXkob3B0aW9ucykgewogIGNvbnN0IG5vdzIgPSBjb25zdHJ1Y3ROb3cob3B0aW9ucz8uaW4pOwogIGNvbnN0IGRhdGUgPSBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluLCAwKTsKICBkYXRlLnNldEZ1bGxZZWFyKG5vdzIuZ2V0RnVsbFllYXIoKSwgbm93Mi5nZXRNb250aCgpLCBub3cyLmdldERhdGUoKSAtIDEpOwogIGRhdGUuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KTsKICByZXR1cm4gZGF0ZTsKfQpfX25hbWUoZW5kT2ZZZXN0ZXJkYXksICJlbmRPZlllc3RlcmRheSIpOwp2YXIgZW5kT2ZZZXN0ZXJkYXlfZGVmYXVsdCA9IGVuZE9mWWVzdGVyZGF5OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZW4tVVMvX2xpYi9mb3JtYXREaXN0YW5jZS5qcwp2YXIgZm9ybWF0RGlzdGFuY2VMb2NhbGUgPSB7CiAgbGVzc1RoYW5YU2Vjb25kczogewogICAgb25lOiAibGVzcyB0aGFuIGEgc2Vjb25kIiwKICAgIG90aGVyOiAibGVzcyB0aGFuIHt7Y291bnR9fSBzZWNvbmRzIgogIH0sCiAgeFNlY29uZHM6IHsKICAgIG9uZTogIjEgc2Vjb25kIiwKICAgIG90aGVyOiAie3tjb3VudH19IHNlY29uZHMiCiAgfSwKICBoYWxmQU1pbnV0ZTogImhhbGYgYSBtaW51dGUiLAogIGxlc3NUaGFuWE1pbnV0ZXM6IHsKICAgIG9uZTogImxlc3MgdGhhbiBhIG1pbnV0ZSIsCiAgICBvdGhlcjogImxlc3MgdGhhbiB7e2NvdW50fX0gbWludXRlcyIKICB9LAogIHhNaW51dGVzOiB7CiAgICBvbmU6ICIxIG1pbnV0ZSIsCiAgICBvdGhlcjogInt7Y291bnR9fSBtaW51dGVzIgogIH0sCiAgYWJvdXRYSG91cnM6IHsKICAgIG9uZTogImFib3V0IDEgaG91ciIsCiAgICBvdGhlcjogImFib3V0IHt7Y291bnR9fSBob3VycyIKICB9LAogIHhIb3VyczogewogICAgb25lOiAiMSBob3VyIiwKICAgIG90aGVyOiAie3tjb3VudH19IGhvdXJzIgogIH0sCiAgeERheXM6IHsKICAgIG9uZTogIjEgZGF5IiwKICAgIG90aGVyOiAie3tjb3VudH19IGRheXMiCiAgfSwKICBhYm91dFhXZWVrczogewogICAgb25lOiAiYWJvdXQgMSB3ZWVrIiwKICAgIG90aGVyOiAiYWJvdXQge3tjb3VudH19IHdlZWtzIgogIH0sCiAgeFdlZWtzOiB7CiAgICBvbmU6ICIxIHdlZWsiLAogICAgb3RoZXI6ICJ7e2NvdW50fX0gd2Vla3MiCiAgfSwKICBhYm91dFhNb250aHM6IHsKICAgIG9uZTogImFib3V0IDEgbW9udGgiLAogICAgb3RoZXI6ICJhYm91dCB7e2NvdW50fX0gbW9udGhzIgogIH0sCiAgeE1vbnRoczogewogICAgb25lOiAiMSBtb250aCIsCiAgICBvdGhlcjogInt7Y291bnR9fSBtb250aHMiCiAgfSwKICBhYm91dFhZZWFyczogewogICAgb25lOiAiYWJvdXQgMSB5ZWFyIiwKICAgIG90aGVyOiAiYWJvdXQge3tjb3VudH19IHllYXJzIgogIH0sCiAgeFllYXJzOiB7CiAgICBvbmU6ICIxIHllYXIiLAogICAgb3RoZXI6ICJ7e2NvdW50fX0geWVhcnMiCiAgfSwKICBvdmVyWFllYXJzOiB7CiAgICBvbmU6ICJvdmVyIDEgeWVhciIsCiAgICBvdGhlcjogIm92ZXIge3tjb3VudH19IHllYXJzIgogIH0sCiAgYWxtb3N0WFllYXJzOiB7CiAgICBvbmU6ICJhbG1vc3QgMSB5ZWFyIiwKICAgIG90aGVyOiAiYWxtb3N0IHt7Y291bnR9fSB5ZWFycyIKICB9Cn07CnZhciBmb3JtYXREaXN0YW5jZSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHRva2VuLCBjb3VudDIsIG9wdGlvbnMpID0+IHsKICBsZXQgcmVzdWx0OwogIGNvbnN0IHRva2VuVmFsdWUgPSBmb3JtYXREaXN0YW5jZUxvY2FsZVt0b2tlbl07CiAgaWYgKHR5cGVvZiB0b2tlblZhbHVlID09PSAic3RyaW5nIikgewogICAgcmVzdWx0ID0gdG9rZW5WYWx1ZTsKICB9IGVsc2UgaWYgKGNvdW50MiA9PT0gMSkgewogICAgcmVzdWx0ID0gdG9rZW5WYWx1ZS5vbmU7CiAgfSBlbHNlIHsKICAgIHJlc3VsdCA9IHRva2VuVmFsdWUub3RoZXIucmVwbGFjZSgie3tjb3VudH19IiwgY291bnQyLnRvU3RyaW5nKCkpOwogIH0KICBpZiAob3B0aW9ucz8uYWRkU3VmZml4KSB7CiAgICBpZiAob3B0aW9ucy5jb21wYXJpc29uICYmIG9wdGlvbnMuY29tcGFyaXNvbiA+IDApIHsKICAgICAgcmV0dXJuICJpbiAiICsgcmVzdWx0OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHJlc3VsdCArICIgYWdvIjsKICAgIH0KICB9CiAgcmV0dXJuIHJlc3VsdDsKfSwgImZvcm1hdERpc3RhbmNlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9fbGliL2J1aWxkRm9ybWF0TG9uZ0ZuLmpzCmZ1bmN0aW9uIGJ1aWxkRm9ybWF0TG9uZ0ZuKGFyZ3MpIHsKICByZXR1cm4gKG9wdGlvbnMgPSB7fSkgPT4gewogICAgY29uc3Qgd2lkdGggPSBvcHRpb25zLndpZHRoID8gU3RyaW5nKG9wdGlvbnMud2lkdGgpIDogYXJncy5kZWZhdWx0V2lkdGg7CiAgICBjb25zdCBmb3JtYXQyID0gYXJncy5mb3JtYXRzW3dpZHRoXSB8fCBhcmdzLmZvcm1hdHNbYXJncy5kZWZhdWx0V2lkdGhdOwogICAgcmV0dXJuIGZvcm1hdDI7CiAgfTsKfQpfX25hbWUoYnVpbGRGb3JtYXRMb25nRm4sICJidWlsZEZvcm1hdExvbmdGbiIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZW4tVVMvX2xpYi9mb3JtYXRMb25nLmpzCnZhciBkYXRlRm9ybWF0cyA9IHsKICBmdWxsOiAiRUVFRSwgTU1NTSBkbywgeSIsCiAgbG9uZzogIk1NTU0gZG8sIHkiLAogIG1lZGl1bTogIk1NTSBkLCB5IiwKICBzaG9ydDogIk1NL2RkL3l5eXkiCn07CnZhciB0aW1lRm9ybWF0cyA9IHsKICBmdWxsOiAiaDptbTpzcyBhIHp6enoiLAogIGxvbmc6ICJoOm1tOnNzIGEgeiIsCiAgbWVkaXVtOiAiaDptbTpzcyBhIiwKICBzaG9ydDogImg6bW0gYSIKfTsKdmFyIGRhdGVUaW1lRm9ybWF0cyA9IHsKICBmdWxsOiAie3tkYXRlfX0gJ2F0JyB7e3RpbWV9fSIsCiAgbG9uZzogInt7ZGF0ZX19ICdhdCcge3t0aW1lfX0iLAogIG1lZGl1bTogInt7ZGF0ZX19LCB7e3RpbWV9fSIsCiAgc2hvcnQ6ICJ7e2RhdGV9fSwge3t0aW1lfX0iCn07CnZhciBmb3JtYXRMb25nID0gewogIGRhdGU6IGJ1aWxkRm9ybWF0TG9uZ0ZuKHsKICAgIGZvcm1hdHM6IGRhdGVGb3JtYXRzLAogICAgZGVmYXVsdFdpZHRoOiAiZnVsbCIKICB9KSwKICB0aW1lOiBidWlsZEZvcm1hdExvbmdGbih7CiAgICBmb3JtYXRzOiB0aW1lRm9ybWF0cywKICAgIGRlZmF1bHRXaWR0aDogImZ1bGwiCiAgfSksCiAgZGF0ZVRpbWU6IGJ1aWxkRm9ybWF0TG9uZ0ZuKHsKICAgIGZvcm1hdHM6IGRhdGVUaW1lRm9ybWF0cywKICAgIGRlZmF1bHRXaWR0aDogImZ1bGwiCiAgfSkKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL2VuLVVTL19saWIvZm9ybWF0UmVsYXRpdmUuanMKdmFyIGZvcm1hdFJlbGF0aXZlTG9jYWxlID0gewogIGxhc3RXZWVrOiAiJ2xhc3QnIGVlZWUgJ2F0JyBwIiwKICB5ZXN0ZXJkYXk6ICIneWVzdGVyZGF5IGF0JyBwIiwKICB0b2RheTogIid0b2RheSBhdCcgcCIsCiAgdG9tb3Jyb3c6ICIndG9tb3Jyb3cgYXQnIHAiLAogIG5leHRXZWVrOiAiZWVlZSAnYXQnIHAiLAogIG90aGVyOiAiUCIKfTsKdmFyIGZvcm1hdFJlbGF0aXZlID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgodG9rZW4sIF9kYXRlLCBfYmFzZURhdGUsIF9vcHRpb25zKSA9PiBmb3JtYXRSZWxhdGl2ZUxvY2FsZVt0b2tlbl0sICJmb3JtYXRSZWxhdGl2ZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvX2xpYi9idWlsZExvY2FsaXplRm4uanMKZnVuY3Rpb24gYnVpbGRMb2NhbGl6ZUZuKGFyZ3MpIHsKICByZXR1cm4gKHZhbHVlMiwgb3B0aW9ucykgPT4gewogICAgY29uc3QgY29udGV4dDIgPSBvcHRpb25zPy5jb250ZXh0ID8gU3RyaW5nKG9wdGlvbnMuY29udGV4dCkgOiAic3RhbmRhbG9uZSI7CiAgICBsZXQgdmFsdWVzQXJyYXk7CiAgICBpZiAoY29udGV4dDIgPT09ICJmb3JtYXR0aW5nIiAmJiBhcmdzLmZvcm1hdHRpbmdWYWx1ZXMpIHsKICAgICAgY29uc3QgZGVmYXVsdFdpZHRoID0gYXJncy5kZWZhdWx0Rm9ybWF0dGluZ1dpZHRoIHx8IGFyZ3MuZGVmYXVsdFdpZHRoOwogICAgICBjb25zdCB3aWR0aCA9IG9wdGlvbnM/LndpZHRoID8gU3RyaW5nKG9wdGlvbnMud2lkdGgpIDogZGVmYXVsdFdpZHRoOwogICAgICB2YWx1ZXNBcnJheSA9IGFyZ3MuZm9ybWF0dGluZ1ZhbHVlc1t3aWR0aF0gfHwgYXJncy5mb3JtYXR0aW5nVmFsdWVzW2RlZmF1bHRXaWR0aF07CiAgICB9IGVsc2UgewogICAgICBjb25zdCBkZWZhdWx0V2lkdGggPSBhcmdzLmRlZmF1bHRXaWR0aDsKICAgICAgY29uc3Qgd2lkdGggPSBvcHRpb25zPy53aWR0aCA/IFN0cmluZyhvcHRpb25zLndpZHRoKSA6IGFyZ3MuZGVmYXVsdFdpZHRoOwogICAgICB2YWx1ZXNBcnJheSA9IGFyZ3MudmFsdWVzW3dpZHRoXSB8fCBhcmdzLnZhbHVlc1tkZWZhdWx0V2lkdGhdOwogICAgfQogICAgY29uc3QgaW5kZXgyID0gYXJncy5hcmd1bWVudENhbGxiYWNrID8gYXJncy5hcmd1bWVudENhbGxiYWNrKHZhbHVlMikgOiB2YWx1ZTI7CiAgICByZXR1cm4gdmFsdWVzQXJyYXlbaW5kZXgyXTsKICB9Owp9Cl9fbmFtZShidWlsZExvY2FsaXplRm4sICJidWlsZExvY2FsaXplRm4iKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL2VuLVVTL19saWIvbG9jYWxpemUuanMKdmFyIGVyYVZhbHVlcyA9IHsKICBuYXJyb3c6IFsiQiIsICJBIl0sCiAgYWJicmV2aWF0ZWQ6IFsiQkMiLCAiQUQiXSwKICB3aWRlOiBbIkJlZm9yZSBDaHJpc3QiLCAiQW5ubyBEb21pbmkiXQp9Owp2YXIgcXVhcnRlclZhbHVlcyA9IHsKICBuYXJyb3c6IFsiMSIsICIyIiwgIjMiLCAiNCJdLAogIGFiYnJldmlhdGVkOiBbIlExIiwgIlEyIiwgIlEzIiwgIlE0Il0sCiAgd2lkZTogWyIxc3QgcXVhcnRlciIsICIybmQgcXVhcnRlciIsICIzcmQgcXVhcnRlciIsICI0dGggcXVhcnRlciJdCn07CnZhciBtb250aFZhbHVlcyA9IHsKICBuYXJyb3c6IFsiSiIsICJGIiwgIk0iLCAiQSIsICJNIiwgIkoiLCAiSiIsICJBIiwgIlMiLCAiTyIsICJOIiwgIkQiXSwKICBhYmJyZXZpYXRlZDogWwogICAgIkphbiIsCiAgICAiRmViIiwKICAgICJNYXIiLAogICAgIkFwciIsCiAgICAiTWF5IiwKICAgICJKdW4iLAogICAgIkp1bCIsCiAgICAiQXVnIiwKICAgICJTZXAiLAogICAgIk9jdCIsCiAgICAiTm92IiwKICAgICJEZWMiCiAgXSwKICB3aWRlOiBbCiAgICAiSmFudWFyeSIsCiAgICAiRmVicnVhcnkiLAogICAgIk1hcmNoIiwKICAgICJBcHJpbCIsCiAgICAiTWF5IiwKICAgICJKdW5lIiwKICAgICJKdWx5IiwKICAgICJBdWd1c3QiLAogICAgIlNlcHRlbWJlciIsCiAgICAiT2N0b2JlciIsCiAgICAiTm92ZW1iZXIiLAogICAgIkRlY2VtYmVyIgogIF0KfTsKdmFyIGRheVZhbHVlcyA9IHsKICBuYXJyb3c6IFsiUyIsICJNIiwgIlQiLCAiVyIsICJUIiwgIkYiLCAiUyJdLAogIHNob3J0OiBbIlN1IiwgIk1vIiwgIlR1IiwgIldlIiwgIlRoIiwgIkZyIiwgIlNhIl0sCiAgYWJicmV2aWF0ZWQ6IFsiU3VuIiwgIk1vbiIsICJUdWUiLCAiV2VkIiwgIlRodSIsICJGcmkiLCAiU2F0Il0sCiAgd2lkZTogWwogICAgIlN1bmRheSIsCiAgICAiTW9uZGF5IiwKICAgICJUdWVzZGF5IiwKICAgICJXZWRuZXNkYXkiLAogICAgIlRodXJzZGF5IiwKICAgICJGcmlkYXkiLAogICAgIlNhdHVyZGF5IgogIF0KfTsKdmFyIGRheVBlcmlvZFZhbHVlcyA9IHsKICBuYXJyb3c6IHsKICAgIGFtOiAiYSIsCiAgICBwbTogInAiLAogICAgbWlkbmlnaHQ6ICJtaSIsCiAgICBub29uOiAibiIsCiAgICBtb3JuaW5nOiAibW9ybmluZyIsCiAgICBhZnRlcm5vb246ICJhZnRlcm5vb24iLAogICAgZXZlbmluZzogImV2ZW5pbmciLAogICAgbmlnaHQ6ICJuaWdodCIKICB9LAogIGFiYnJldmlhdGVkOiB7CiAgICBhbTogIkFNIiwKICAgIHBtOiAiUE0iLAogICAgbWlkbmlnaHQ6ICJtaWRuaWdodCIsCiAgICBub29uOiAibm9vbiIsCiAgICBtb3JuaW5nOiAibW9ybmluZyIsCiAgICBhZnRlcm5vb246ICJhZnRlcm5vb24iLAogICAgZXZlbmluZzogImV2ZW5pbmciLAogICAgbmlnaHQ6ICJuaWdodCIKICB9LAogIHdpZGU6IHsKICAgIGFtOiAiYS5tLiIsCiAgICBwbTogInAubS4iLAogICAgbWlkbmlnaHQ6ICJtaWRuaWdodCIsCiAgICBub29uOiAibm9vbiIsCiAgICBtb3JuaW5nOiAibW9ybmluZyIsCiAgICBhZnRlcm5vb246ICJhZnRlcm5vb24iLAogICAgZXZlbmluZzogImV2ZW5pbmciLAogICAgbmlnaHQ6ICJuaWdodCIKICB9Cn07CnZhciBmb3JtYXR0aW5nRGF5UGVyaW9kVmFsdWVzID0gewogIG5hcnJvdzogewogICAgYW06ICJhIiwKICAgIHBtOiAicCIsCiAgICBtaWRuaWdodDogIm1pIiwKICAgIG5vb246ICJuIiwKICAgIG1vcm5pbmc6ICJpbiB0aGUgbW9ybmluZyIsCiAgICBhZnRlcm5vb246ICJpbiB0aGUgYWZ0ZXJub29uIiwKICAgIGV2ZW5pbmc6ICJpbiB0aGUgZXZlbmluZyIsCiAgICBuaWdodDogImF0IG5pZ2h0IgogIH0sCiAgYWJicmV2aWF0ZWQ6IHsKICAgIGFtOiAiQU0iLAogICAgcG06ICJQTSIsCiAgICBtaWRuaWdodDogIm1pZG5pZ2h0IiwKICAgIG5vb246ICJub29uIiwKICAgIG1vcm5pbmc6ICJpbiB0aGUgbW9ybmluZyIsCiAgICBhZnRlcm5vb246ICJpbiB0aGUgYWZ0ZXJub29uIiwKICAgIGV2ZW5pbmc6ICJpbiB0aGUgZXZlbmluZyIsCiAgICBuaWdodDogImF0IG5pZ2h0IgogIH0sCiAgd2lkZTogewogICAgYW06ICJhLm0uIiwKICAgIHBtOiAicC5tLiIsCiAgICBtaWRuaWdodDogIm1pZG5pZ2h0IiwKICAgIG5vb246ICJub29uIiwKICAgIG1vcm5pbmc6ICJpbiB0aGUgbW9ybmluZyIsCiAgICBhZnRlcm5vb246ICJpbiB0aGUgYWZ0ZXJub29uIiwKICAgIGV2ZW5pbmc6ICJpbiB0aGUgZXZlbmluZyIsCiAgICBuaWdodDogImF0IG5pZ2h0IgogIH0KfTsKdmFyIG9yZGluYWxOdW1iZXIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChkaXJ0eU51bWJlciwgX29wdGlvbnMpID0+IHsKICBjb25zdCBudW1iZXIyID0gTnVtYmVyKGRpcnR5TnVtYmVyKTsKICBjb25zdCByZW0xMDAgPSBudW1iZXIyICUgMTAwOwogIGlmIChyZW0xMDAgPiAyMCB8fCByZW0xMDAgPCAxMCkgewogICAgc3dpdGNoIChyZW0xMDAgJSAxMCkgewogICAgICBjYXNlIDE6CiAgICAgICAgcmV0dXJuIG51bWJlcjIgKyAic3QiOwogICAgICBjYXNlIDI6CiAgICAgICAgcmV0dXJuIG51bWJlcjIgKyAibmQiOwogICAgICBjYXNlIDM6CiAgICAgICAgcmV0dXJuIG51bWJlcjIgKyAicmQiOwogICAgfQogIH0KICByZXR1cm4gbnVtYmVyMiArICJ0aCI7Cn0sICJvcmRpbmFsTnVtYmVyIik7CnZhciBsb2NhbGl6ZSA9IHsKICBvcmRpbmFsTnVtYmVyLAogIGVyYTogYnVpbGRMb2NhbGl6ZUZuKHsKICAgIHZhbHVlczogZXJhVmFsdWVzLAogICAgZGVmYXVsdFdpZHRoOiAid2lkZSIKICB9KSwKICBxdWFydGVyOiBidWlsZExvY2FsaXplRm4oewogICAgdmFsdWVzOiBxdWFydGVyVmFsdWVzLAogICAgZGVmYXVsdFdpZHRoOiAid2lkZSIsCiAgICBhcmd1bWVudENhbGxiYWNrOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKChxdWFydGVyKSA9PiBxdWFydGVyIC0gMSwgImFyZ3VtZW50Q2FsbGJhY2siKQogIH0pLAogIG1vbnRoOiBidWlsZExvY2FsaXplRm4oewogICAgdmFsdWVzOiBtb250aFZhbHVlcywKICAgIGRlZmF1bHRXaWR0aDogIndpZGUiCiAgfSksCiAgZGF5OiBidWlsZExvY2FsaXplRm4oewogICAgdmFsdWVzOiBkYXlWYWx1ZXMsCiAgICBkZWZhdWx0V2lkdGg6ICJ3aWRlIgogIH0pLAogIGRheVBlcmlvZDogYnVpbGRMb2NhbGl6ZUZuKHsKICAgIHZhbHVlczogZGF5UGVyaW9kVmFsdWVzLAogICAgZGVmYXVsdFdpZHRoOiAid2lkZSIsCiAgICBmb3JtYXR0aW5nVmFsdWVzOiBmb3JtYXR0aW5nRGF5UGVyaW9kVmFsdWVzLAogICAgZGVmYXVsdEZvcm1hdHRpbmdXaWR0aDogIndpZGUiCiAgfSkKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL19saWIvYnVpbGRNYXRjaEZuLmpzCmZ1bmN0aW9uIGJ1aWxkTWF0Y2hGbihhcmdzKSB7CiAgcmV0dXJuIChzdHJpbmczLCBvcHRpb25zID0ge30pID0+IHsKICAgIGNvbnN0IHdpZHRoID0gb3B0aW9ucy53aWR0aDsKICAgIGNvbnN0IG1hdGNoUGF0dGVybiA9IHdpZHRoICYmIGFyZ3MubWF0Y2hQYXR0ZXJuc1t3aWR0aF0gfHwgYXJncy5tYXRjaFBhdHRlcm5zW2FyZ3MuZGVmYXVsdE1hdGNoV2lkdGhdOwogICAgY29uc3QgbWF0Y2hSZXN1bHQgPSBzdHJpbmczLm1hdGNoKG1hdGNoUGF0dGVybik7CiAgICBpZiAoIW1hdGNoUmVzdWx0KSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgbWF0Y2hlZFN0cmluZyA9IG1hdGNoUmVzdWx0WzBdOwogICAgY29uc3QgcGFyc2VQYXR0ZXJucyA9IHdpZHRoICYmIGFyZ3MucGFyc2VQYXR0ZXJuc1t3aWR0aF0gfHwgYXJncy5wYXJzZVBhdHRlcm5zW2FyZ3MuZGVmYXVsdFBhcnNlV2lkdGhdOwogICAgY29uc3Qga2V5MiA9IEFycmF5LmlzQXJyYXkocGFyc2VQYXR0ZXJucykgPyBmaW5kSW5kZXgyKHBhcnNlUGF0dGVybnMsIChwYXR0ZXJuKSA9PiBwYXR0ZXJuLnRlc3QobWF0Y2hlZFN0cmluZykpIDogKAogICAgICAvLyBbVE9ET10gLS0gSSBjaGFsbGVuZ2UgeW91IHRvIGZpeCB0aGUgdHlwZQogICAgICBmaW5kS2V5KHBhcnNlUGF0dGVybnMsIChwYXR0ZXJuKSA9PiBwYXR0ZXJuLnRlc3QobWF0Y2hlZFN0cmluZykpCiAgICApOwogICAgbGV0IHZhbHVlMjsKICAgIHZhbHVlMiA9IGFyZ3MudmFsdWVDYWxsYmFjayA/IGFyZ3MudmFsdWVDYWxsYmFjayhrZXkyKSA6IGtleTI7CiAgICB2YWx1ZTIgPSBvcHRpb25zLnZhbHVlQ2FsbGJhY2sgPyAoCiAgICAgIC8vIFtUT0RPXSAtLSBJIGNoYWxsZW5nZSB5b3UgdG8gZml4IHRoZSB0eXBlCiAgICAgIG9wdGlvbnMudmFsdWVDYWxsYmFjayh2YWx1ZTIpCiAgICApIDogdmFsdWUyOwogICAgY29uc3QgcmVzdCA9IHN0cmluZzMuc2xpY2UobWF0Y2hlZFN0cmluZy5sZW5ndGgpOwogICAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlMiwgcmVzdCB9OwogIH07Cn0KX19uYW1lKGJ1aWxkTWF0Y2hGbiwgImJ1aWxkTWF0Y2hGbiIpOwpmdW5jdGlvbiBmaW5kS2V5KG9iamVjdCwgcHJlZGljYXRlKSB7CiAgZm9yIChjb25zdCBrZXkyIGluIG9iamVjdCkgewogICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleTIpICYmIHByZWRpY2F0ZShvYmplY3Rba2V5Ml0pKSB7CiAgICAgIHJldHVybiBrZXkyOwogICAgfQogIH0KICByZXR1cm4gdm9pZCAwOwp9Cl9fbmFtZShmaW5kS2V5LCAiZmluZEtleSIpOwpmdW5jdGlvbiBmaW5kSW5kZXgyKGFycmF5LCBwcmVkaWNhdGUpIHsKICBmb3IgKGxldCBrZXkyID0gMDsga2V5MiA8IGFycmF5Lmxlbmd0aDsga2V5MisrKSB7CiAgICBpZiAocHJlZGljYXRlKGFycmF5W2tleTJdKSkgewogICAgICByZXR1cm4ga2V5MjsKICAgIH0KICB9CiAgcmV0dXJuIHZvaWQgMDsKfQpfX25hbWUoZmluZEluZGV4MiwgImZpbmRJbmRleCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvX2xpYi9idWlsZE1hdGNoUGF0dGVybkZuLmpzCmZ1bmN0aW9uIGJ1aWxkTWF0Y2hQYXR0ZXJuRm4oYXJncykgewogIHJldHVybiAoc3RyaW5nMywgb3B0aW9ucyA9IHt9KSA9PiB7CiAgICBjb25zdCBtYXRjaFJlc3VsdCA9IHN0cmluZzMubWF0Y2goYXJncy5tYXRjaFBhdHRlcm4pOwogICAgaWYgKCFtYXRjaFJlc3VsdCkgcmV0dXJuIG51bGw7CiAgICBjb25zdCBtYXRjaGVkU3RyaW5nID0gbWF0Y2hSZXN1bHRbMF07CiAgICBjb25zdCBwYXJzZVJlc3VsdCA9IHN0cmluZzMubWF0Y2goYXJncy5wYXJzZVBhdHRlcm4pOwogICAgaWYgKCFwYXJzZVJlc3VsdCkgcmV0dXJuIG51bGw7CiAgICBsZXQgdmFsdWUyID0gYXJncy52YWx1ZUNhbGxiYWNrID8gYXJncy52YWx1ZUNhbGxiYWNrKHBhcnNlUmVzdWx0WzBdKSA6IHBhcnNlUmVzdWx0WzBdOwogICAgdmFsdWUyID0gb3B0aW9ucy52YWx1ZUNhbGxiYWNrID8gb3B0aW9ucy52YWx1ZUNhbGxiYWNrKHZhbHVlMikgOiB2YWx1ZTI7CiAgICBjb25zdCByZXN0ID0gc3RyaW5nMy5zbGljZShtYXRjaGVkU3RyaW5nLmxlbmd0aCk7CiAgICByZXR1cm4geyB2YWx1ZTogdmFsdWUyLCByZXN0IH07CiAgfTsKfQpfX25hbWUoYnVpbGRNYXRjaFBhdHRlcm5GbiwgImJ1aWxkTWF0Y2hQYXR0ZXJuRm4iKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL2VuLVVTL19saWIvbWF0Y2guanMKdmFyIG1hdGNoT3JkaW5hbE51bWJlclBhdHRlcm4gPSAvXihcZCspKHRofHN0fG5kfHJkKT8vaTsKdmFyIHBhcnNlT3JkaW5hbE51bWJlclBhdHRlcm4gPSAvXGQrL2k7CnZhciBtYXRjaEVyYVBhdHRlcm5zID0gewogIG5hcnJvdzogL14oYnxhKS9pLAogIGFiYnJldmlhdGVkOiAvXihiXC4/XHM/Y1wuP3xiXC4/XHM/Y1wuP1xzP2VcLj98YVwuP1xzP2RcLj98Y1wuP1xzP2VcLj8pL2ksCiAgd2lkZTogL14oYmVmb3JlIGNocmlzdHxiZWZvcmUgY29tbW9uIGVyYXxhbm5vIGRvbWluaXxjb21tb24gZXJhKS9pCn07CnZhciBwYXJzZUVyYVBhdHRlcm5zID0gewogIGFueTogWy9eYi9pLCAvXihhfGMpL2ldCn07CnZhciBtYXRjaFF1YXJ0ZXJQYXR0ZXJucyA9IHsKICBuYXJyb3c6IC9eWzEyMzRdL2ksCiAgYWJicmV2aWF0ZWQ6IC9ecVsxMjM0XS9pLAogIHdpZGU6IC9eWzEyMzRdKHRofHN0fG5kfHJkKT8gcXVhcnRlci9pCn07CnZhciBwYXJzZVF1YXJ0ZXJQYXR0ZXJucyA9IHsKICBhbnk6IFsvMS9pLCAvMi9pLCAvMy9pLCAvNC9pXQp9Owp2YXIgbWF0Y2hNb250aFBhdHRlcm5zID0gewogIG5hcnJvdzogL15bamZtYXNvbmRdL2ksCiAgYWJicmV2aWF0ZWQ6IC9eKGphbnxmZWJ8bWFyfGFwcnxtYXl8anVufGp1bHxhdWd8c2VwfG9jdHxub3Z8ZGVjKS9pLAogIHdpZGU6IC9eKGphbnVhcnl8ZmVicnVhcnl8bWFyY2h8YXByaWx8bWF5fGp1bmV8anVseXxhdWd1c3R8c2VwdGVtYmVyfG9jdG9iZXJ8bm92ZW1iZXJ8ZGVjZW1iZXIpL2kKfTsKdmFyIHBhcnNlTW9udGhQYXR0ZXJucyA9IHsKICBuYXJyb3c6IFsKICAgIC9eai9pLAogICAgL15mL2ksCiAgICAvXm0vaSwKICAgIC9eYS9pLAogICAgL15tL2ksCiAgICAvXmovaSwKICAgIC9eai9pLAogICAgL15hL2ksCiAgICAvXnMvaSwKICAgIC9eby9pLAogICAgL15uL2ksCiAgICAvXmQvaQogIF0sCiAgYW55OiBbCiAgICAvXmphL2ksCiAgICAvXmYvaSwKICAgIC9ebWFyL2ksCiAgICAvXmFwL2ksCiAgICAvXm1heS9pLAogICAgL15qdW4vaSwKICAgIC9eanVsL2ksCiAgICAvXmF1L2ksCiAgICAvXnMvaSwKICAgIC9eby9pLAogICAgL15uL2ksCiAgICAvXmQvaQogIF0KfTsKdmFyIG1hdGNoRGF5UGF0dGVybnMgPSB7CiAgbmFycm93OiAvXltzbXR3Zl0vaSwKICBzaG9ydDogL14oc3V8bW98dHV8d2V8dGh8ZnJ8c2EpL2ksCiAgYWJicmV2aWF0ZWQ6IC9eKHN1bnxtb258dHVlfHdlZHx0aHV8ZnJpfHNhdCkvaSwKICB3aWRlOiAvXihzdW5kYXl8bW9uZGF5fHR1ZXNkYXl8d2VkbmVzZGF5fHRodXJzZGF5fGZyaWRheXxzYXR1cmRheSkvaQp9Owp2YXIgcGFyc2VEYXlQYXR0ZXJucyA9IHsKICBuYXJyb3c6IFsvXnMvaSwgL15tL2ksIC9edC9pLCAvXncvaSwgL150L2ksIC9eZi9pLCAvXnMvaV0sCiAgYW55OiBbL15zdS9pLCAvXm0vaSwgL150dS9pLCAvXncvaSwgL150aC9pLCAvXmYvaSwgL15zYS9pXQp9Owp2YXIgbWF0Y2hEYXlQZXJpb2RQYXR0ZXJucyA9IHsKICBuYXJyb3c6IC9eKGF8cHxtaXxufChpbiB0aGV8YXQpIChtb3JuaW5nfGFmdGVybm9vbnxldmVuaW5nfG5pZ2h0KSkvaSwKICBhbnk6IC9eKFthcF1cLj9ccz9tXC4/fG1pZG5pZ2h0fG5vb258KGluIHRoZXxhdCkgKG1vcm5pbmd8YWZ0ZXJub29ufGV2ZW5pbmd8bmlnaHQpKS9pCn07CnZhciBwYXJzZURheVBlcmlvZFBhdHRlcm5zID0gewogIGFueTogewogICAgYW06IC9eYS9pLAogICAgcG06IC9ecC9pLAogICAgbWlkbmlnaHQ6IC9ebWkvaSwKICAgIG5vb246IC9ebm8vaSwKICAgIG1vcm5pbmc6IC9tb3JuaW5nL2ksCiAgICBhZnRlcm5vb246IC9hZnRlcm5vb24vaSwKICAgIGV2ZW5pbmc6IC9ldmVuaW5nL2ksCiAgICBuaWdodDogL25pZ2h0L2kKICB9Cn07CnZhciBtYXRjaCA9IHsKICBvcmRpbmFsTnVtYmVyOiBidWlsZE1hdGNoUGF0dGVybkZuKHsKICAgIG1hdGNoUGF0dGVybjogbWF0Y2hPcmRpbmFsTnVtYmVyUGF0dGVybiwKICAgIHBhcnNlUGF0dGVybjogcGFyc2VPcmRpbmFsTnVtYmVyUGF0dGVybiwKICAgIHZhbHVlQ2FsbGJhY2s6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHZhbHVlMikgPT4gcGFyc2VJbnQodmFsdWUyLCAxMCksICJ2YWx1ZUNhbGxiYWNrIikKICB9KSwKICBlcmE6IGJ1aWxkTWF0Y2hGbih7CiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaEVyYVBhdHRlcm5zLAogICAgZGVmYXVsdE1hdGNoV2lkdGg6ICJ3aWRlIiwKICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlRXJhUGF0dGVybnMsCiAgICBkZWZhdWx0UGFyc2VXaWR0aDogImFueSIKICB9KSwKICBxdWFydGVyOiBidWlsZE1hdGNoRm4oewogICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hRdWFydGVyUGF0dGVybnMsCiAgICBkZWZhdWx0TWF0Y2hXaWR0aDogIndpZGUiLAogICAgcGFyc2VQYXR0ZXJuczogcGFyc2VRdWFydGVyUGF0dGVybnMsCiAgICBkZWZhdWx0UGFyc2VXaWR0aDogImFueSIsCiAgICB2YWx1ZUNhbGxiYWNrOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKChpbmRleDIpID0+IGluZGV4MiArIDEsICJ2YWx1ZUNhbGxiYWNrIikKICB9KSwKICBtb250aDogYnVpbGRNYXRjaEZuKHsKICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoTW9udGhQYXR0ZXJucywKICAgIGRlZmF1bHRNYXRjaFdpZHRoOiAid2lkZSIsCiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZU1vbnRoUGF0dGVybnMsCiAgICBkZWZhdWx0UGFyc2VXaWR0aDogImFueSIKICB9KSwKICBkYXk6IGJ1aWxkTWF0Y2hGbih7CiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaERheVBhdHRlcm5zLAogICAgZGVmYXVsdE1hdGNoV2lkdGg6ICJ3aWRlIiwKICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlRGF5UGF0dGVybnMsCiAgICBkZWZhdWx0UGFyc2VXaWR0aDogImFueSIKICB9KSwKICBkYXlQZXJpb2Q6IGJ1aWxkTWF0Y2hGbih7CiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaERheVBlcmlvZFBhdHRlcm5zLAogICAgZGVmYXVsdE1hdGNoV2lkdGg6ICJhbnkiLAogICAgcGFyc2VQYXR0ZXJuczogcGFyc2VEYXlQZXJpb2RQYXR0ZXJucywKICAgIGRlZmF1bHRQYXJzZVdpZHRoOiAiYW55IgogIH0pCn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9lbi1VUy5qcwp2YXIgZW5VUyA9IHsKICBjb2RlOiAiZW4tVVMiLAogIGZvcm1hdERpc3RhbmNlLAogIGZvcm1hdExvbmcsCiAgZm9ybWF0UmVsYXRpdmUsCiAgbG9jYWxpemUsCiAgbWF0Y2gsCiAgb3B0aW9uczogewogICAgd2Vla1N0YXJ0c09uOiAwLAogICAgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiAxCiAgfQp9Owp2YXIgZW5fVVNfZGVmYXVsdCA9IGVuVVM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldERheU9mWWVhci5qcwpmdW5jdGlvbiBnZXREYXlPZlllYXIoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCBkaWZmID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKF9kYXRlLCBzdGFydE9mWWVhcihfZGF0ZSkpOwogIGNvbnN0IGRheU9mWWVhciA9IGRpZmYgKyAxOwogIHJldHVybiBkYXlPZlllYXI7Cn0KX19uYW1lKGdldERheU9mWWVhciwgImdldERheU9mWWVhciIpOwp2YXIgZ2V0RGF5T2ZZZWFyX2RlZmF1bHQgPSBnZXREYXlPZlllYXI7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldElTT1dlZWsuanMKZnVuY3Rpb24gZ2V0SVNPV2VlayhkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGNvbnN0IGRpZmYgPSArc3RhcnRPZklTT1dlZWsoX2RhdGUpIC0gK3N0YXJ0T2ZJU09XZWVrWWVhcihfZGF0ZSk7CiAgcmV0dXJuIE1hdGgucm91bmQoZGlmZiAvIG1pbGxpc2Vjb25kc0luV2VlaykgKyAxOwp9Cl9fbmFtZShnZXRJU09XZWVrLCAiZ2V0SVNPV2VlayIpOwp2YXIgZ2V0SVNPV2Vla19kZWZhdWx0ID0gZ2V0SVNPV2VlazsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0V2Vla1llYXIuanMKZnVuY3Rpb24gZ2V0V2Vla1llYXIoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCB5ZWFyID0gX2RhdGUuZ2V0RnVsbFllYXIoKTsKICBjb25zdCBkZWZhdWx0T3B0aW9uczIgPSBnZXREZWZhdWx0T3B0aW9ucygpOwogIGNvbnN0IGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9IG9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyBkZWZhdWx0T3B0aW9uczIuZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/IGRlZmF1bHRPcHRpb25zMi5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyAxOwogIGNvbnN0IGZpcnN0V2Vla09mTmV4dFllYXIgPSBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIDApOwogIGZpcnN0V2Vla09mTmV4dFllYXIuc2V0RnVsbFllYXIoeWVhciArIDEsIDAsIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSk7CiAgZmlyc3RXZWVrT2ZOZXh0WWVhci5zZXRIb3VycygwLCAwLCAwLCAwKTsKICBjb25zdCBzdGFydE9mTmV4dFllYXIgPSBzdGFydE9mV2VlayhmaXJzdFdlZWtPZk5leHRZZWFyLCBvcHRpb25zKTsKICBjb25zdCBmaXJzdFdlZWtPZlRoaXNZZWFyID0gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCAwKTsKICBmaXJzdFdlZWtPZlRoaXNZZWFyLnNldEZ1bGxZZWFyKHllYXIsIDAsIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSk7CiAgZmlyc3RXZWVrT2ZUaGlzWWVhci5zZXRIb3VycygwLCAwLCAwLCAwKTsKICBjb25zdCBzdGFydE9mVGhpc1llYXIgPSBzdGFydE9mV2VlayhmaXJzdFdlZWtPZlRoaXNZZWFyLCBvcHRpb25zKTsKICBpZiAoK19kYXRlID49ICtzdGFydE9mTmV4dFllYXIpIHsKICAgIHJldHVybiB5ZWFyICsgMTsKICB9IGVsc2UgaWYgKCtfZGF0ZSA+PSArc3RhcnRPZlRoaXNZZWFyKSB7CiAgICByZXR1cm4geWVhcjsKICB9IGVsc2UgewogICAgcmV0dXJuIHllYXIgLSAxOwogIH0KfQpfX25hbWUoZ2V0V2Vla1llYXIsICJnZXRXZWVrWWVhciIpOwp2YXIgZ2V0V2Vla1llYXJfZGVmYXVsdCA9IGdldFdlZWtZZWFyOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mV2Vla1llYXIuanMKZnVuY3Rpb24gc3RhcnRPZldlZWtZZWFyKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBkZWZhdWx0T3B0aW9uczIgPSBnZXREZWZhdWx0T3B0aW9ucygpOwogIGNvbnN0IGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9IG9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyBkZWZhdWx0T3B0aW9uczIuZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/IGRlZmF1bHRPcHRpb25zMi5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyAxOwogIGNvbnN0IHllYXIgPSBnZXRXZWVrWWVhcihkYXRlLCBvcHRpb25zKTsKICBjb25zdCBmaXJzdFdlZWsgPSBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIDApOwogIGZpcnN0V2Vlay5zZXRGdWxsWWVhcih5ZWFyLCAwLCBmaXJzdFdlZWtDb250YWluc0RhdGUpOwogIGZpcnN0V2Vlay5zZXRIb3VycygwLCAwLCAwLCAwKTsKICBjb25zdCBfZGF0ZSA9IHN0YXJ0T2ZXZWVrKGZpcnN0V2Vlaywgb3B0aW9ucyk7CiAgcmV0dXJuIF9kYXRlOwp9Cl9fbmFtZShzdGFydE9mV2Vla1llYXIsICJzdGFydE9mV2Vla1llYXIiKTsKdmFyIHN0YXJ0T2ZXZWVrWWVhcl9kZWZhdWx0ID0gc3RhcnRPZldlZWtZZWFyOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRXZWVrLmpzCmZ1bmN0aW9uIGdldFdlZWsoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCBkaWZmID0gK3N0YXJ0T2ZXZWVrKF9kYXRlLCBvcHRpb25zKSAtICtzdGFydE9mV2Vla1llYXIoX2RhdGUsIG9wdGlvbnMpOwogIHJldHVybiBNYXRoLnJvdW5kKGRpZmYgLyBtaWxsaXNlY29uZHNJbldlZWspICsgMTsKfQpfX25hbWUoZ2V0V2VlaywgImdldFdlZWsiKTsKdmFyIGdldFdlZWtfZGVmYXVsdCA9IGdldFdlZWs7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvYWRkTGVhZGluZ1plcm9zLmpzCmZ1bmN0aW9uIGFkZExlYWRpbmdaZXJvcyhudW1iZXIyLCB0YXJnZXRMZW5ndGgpIHsKICBjb25zdCBzaWduID0gbnVtYmVyMiA8IDAgPyAiLSIgOiAiIjsKICBjb25zdCBvdXRwdXQgPSBNYXRoLmFicyhudW1iZXIyKS50b1N0cmluZygpLnBhZFN0YXJ0KHRhcmdldExlbmd0aCwgIjAiKTsKICByZXR1cm4gc2lnbiArIG91dHB1dDsKfQpfX25hbWUoYWRkTGVhZGluZ1plcm9zLCAiYWRkTGVhZGluZ1plcm9zIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvZm9ybWF0L2xpZ2h0Rm9ybWF0dGVycy5qcwp2YXIgbGlnaHRGb3JtYXR0ZXJzID0gewogIC8vIFllYXIKICB5KGRhdGUsIHRva2VuKSB7CiAgICBjb25zdCBzaWduZWRZZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpOwogICAgY29uc3QgeWVhciA9IHNpZ25lZFllYXIgPiAwID8gc2lnbmVkWWVhciA6IDEgLSBzaWduZWRZZWFyOwogICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyh0b2tlbiA9PT0gInl5IiA/IHllYXIgJSAxMDAgOiB5ZWFyLCB0b2tlbi5sZW5ndGgpOwogIH0sCiAgLy8gTW9udGgKICBNKGRhdGUsIHRva2VuKSB7CiAgICBjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKTsKICAgIHJldHVybiB0b2tlbiA9PT0gIk0iID8gU3RyaW5nKG1vbnRoICsgMSkgOiBhZGRMZWFkaW5nWmVyb3MobW9udGggKyAxLCAyKTsKICB9LAogIC8vIERheSBvZiB0aGUgbW9udGgKICBkKGRhdGUsIHRva2VuKSB7CiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRhdGUuZ2V0RGF0ZSgpLCB0b2tlbi5sZW5ndGgpOwogIH0sCiAgLy8gQU0gb3IgUE0KICBhKGRhdGUsIHRva2VuKSB7CiAgICBjb25zdCBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXRlLmdldEhvdXJzKCkgLyAxMiA+PSAxID8gInBtIiA6ICJhbSI7CiAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgIGNhc2UgImEiOgogICAgICBjYXNlICJhYSI6CiAgICAgICAgcmV0dXJuIGRheVBlcmlvZEVudW1WYWx1ZS50b1VwcGVyQ2FzZSgpOwogICAgICBjYXNlICJhYWEiOgogICAgICAgIHJldHVybiBkYXlQZXJpb2RFbnVtVmFsdWU7CiAgICAgIGNhc2UgImFhYWFhIjoKICAgICAgICByZXR1cm4gZGF5UGVyaW9kRW51bVZhbHVlWzBdOwogICAgICBjYXNlICJhYWFhIjoKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gZGF5UGVyaW9kRW51bVZhbHVlID09PSAiYW0iID8gImEubS4iIDogInAubS4iOwogICAgfQogIH0sCiAgLy8gSG91ciBbMS0xMl0KICBoKGRhdGUsIHRva2VuKSB7CiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRhdGUuZ2V0SG91cnMoKSAlIDEyIHx8IDEyLCB0b2tlbi5sZW5ndGgpOwogIH0sCiAgLy8gSG91ciBbMC0yM10KICBIKGRhdGUsIHRva2VuKSB7CiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRhdGUuZ2V0SG91cnMoKSwgdG9rZW4ubGVuZ3RoKTsKICB9LAogIC8vIE1pbnV0ZQogIG0oZGF0ZSwgdG9rZW4pIHsKICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoZGF0ZS5nZXRNaW51dGVzKCksIHRva2VuLmxlbmd0aCk7CiAgfSwKICAvLyBTZWNvbmQKICBzKGRhdGUsIHRva2VuKSB7CiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRhdGUuZ2V0U2Vjb25kcygpLCB0b2tlbi5sZW5ndGgpOwogIH0sCiAgLy8gRnJhY3Rpb24gb2Ygc2Vjb25kCiAgUyhkYXRlLCB0b2tlbikgewogICAgY29uc3QgbnVtYmVyT2ZEaWdpdHMgPSB0b2tlbi5sZW5ndGg7CiAgICBjb25zdCBtaWxsaXNlY29uZHMyID0gZGF0ZS5nZXRNaWxsaXNlY29uZHMoKTsKICAgIGNvbnN0IGZyYWN0aW9uYWxTZWNvbmRzID0gTWF0aC50cnVuYygKICAgICAgbWlsbGlzZWNvbmRzMiAqIE1hdGgucG93KDEwLCBudW1iZXJPZkRpZ2l0cyAtIDMpCiAgICApOwogICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhmcmFjdGlvbmFsU2Vjb25kcywgdG9rZW4ubGVuZ3RoKTsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvZm9ybWF0L2Zvcm1hdHRlcnMuanMKdmFyIGRheVBlcmlvZEVudW0gPSB7CiAgYW06ICJhbSIsCiAgcG06ICJwbSIsCiAgbWlkbmlnaHQ6ICJtaWRuaWdodCIsCiAgbm9vbjogIm5vb24iLAogIG1vcm5pbmc6ICJtb3JuaW5nIiwKICBhZnRlcm5vb246ICJhZnRlcm5vb24iLAogIGV2ZW5pbmc6ICJldmVuaW5nIiwKICBuaWdodDogIm5pZ2h0Igp9Owp2YXIgZm9ybWF0dGVycyA9IHsKICAvLyBFcmEKICBHOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGRhdGUsIHRva2VuLCBsb2NhbGl6ZTIpIHsKICAgIGNvbnN0IGVyYSA9IGRhdGUuZ2V0RnVsbFllYXIoKSA+IDAgPyAxIDogMDsKICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgLy8gQUQsIEJDCiAgICAgIGNhc2UgIkciOgogICAgICBjYXNlICJHRyI6CiAgICAgIGNhc2UgIkdHRyI6CiAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5lcmEoZXJhLCB7IHdpZHRoOiAiYWJicmV2aWF0ZWQiIH0pOwogICAgICAvLyBBLCBCCiAgICAgIGNhc2UgIkdHR0dHIjoKICAgICAgICByZXR1cm4gbG9jYWxpemUyLmVyYShlcmEsIHsgd2lkdGg6ICJuYXJyb3ciIH0pOwogICAgICAvLyBBbm5vIERvbWluaSwgQmVmb3JlIENocmlzdAogICAgICBjYXNlICJHR0dHIjoKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gbG9jYWxpemUyLmVyYShlcmEsIHsgd2lkdGg6ICJ3aWRlIiB9KTsKICAgIH0KICB9LCAiRyIpLAogIC8vIFllYXIKICB5OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGRhdGUsIHRva2VuLCBsb2NhbGl6ZTIpIHsKICAgIGlmICh0b2tlbiA9PT0gInlvIikgewogICAgICBjb25zdCBzaWduZWRZZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpOwogICAgICBjb25zdCB5ZWFyID0gc2lnbmVkWWVhciA+IDAgPyBzaWduZWRZZWFyIDogMSAtIHNpZ25lZFllYXI7CiAgICAgIHJldHVybiBsb2NhbGl6ZTIub3JkaW5hbE51bWJlcih5ZWFyLCB7IHVuaXQ6ICJ5ZWFyIiB9KTsKICAgIH0KICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMueShkYXRlLCB0b2tlbik7CiAgfSwgInkiKSwKICAvLyBMb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyCiAgWTogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihkYXRlLCB0b2tlbiwgbG9jYWxpemUyLCBvcHRpb25zKSB7CiAgICBjb25zdCBzaWduZWRXZWVrWWVhciA9IGdldFdlZWtZZWFyKGRhdGUsIG9wdGlvbnMpOwogICAgY29uc3Qgd2Vla1llYXIgPSBzaWduZWRXZWVrWWVhciA+IDAgPyBzaWduZWRXZWVrWWVhciA6IDEgLSBzaWduZWRXZWVrWWVhcjsKICAgIGlmICh0b2tlbiA9PT0gIllZIikgewogICAgICBjb25zdCB0d29EaWdpdFllYXIgPSB3ZWVrWWVhciAlIDEwMDsKICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyh0d29EaWdpdFllYXIsIDIpOwogICAgfQogICAgaWYgKHRva2VuID09PSAiWW8iKSB7CiAgICAgIHJldHVybiBsb2NhbGl6ZTIub3JkaW5hbE51bWJlcih3ZWVrWWVhciwgeyB1bml0OiAieWVhciIgfSk7CiAgICB9CiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHdlZWtZZWFyLCB0b2tlbi5sZW5ndGgpOwogIH0sICJZIiksCiAgLy8gSVNPIHdlZWstbnVtYmVyaW5nIHllYXIKICBSOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGRhdGUsIHRva2VuKSB7CiAgICBjb25zdCBpc29XZWVrWWVhciA9IGdldElTT1dlZWtZZWFyKGRhdGUpOwogICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhpc29XZWVrWWVhciwgdG9rZW4ubGVuZ3RoKTsKICB9LCAiUiIpLAogIC8vIEV4dGVuZGVkIHllYXIuIFRoaXMgaXMgYSBzaW5nbGUgbnVtYmVyIGRlc2lnbmF0aW5nIHRoZSB5ZWFyIG9mIHRoaXMgY2FsZW5kYXIgc3lzdGVtLgogIC8vIFRoZSBtYWluIGRpZmZlcmVuY2UgYmV0d2VlbiBgeWAgYW5kIGB1YCBsb2NhbGl6ZXJzIGFyZSBCLkMuIHllYXJzOgogIC8vIHwgWWVhciB8IGB5YCB8IGB1YCB8CiAgLy8gfC0tLS0tLXwtLS0tLXwtLS0tLXwKICAvLyB8IEFDIDEgfCAgIDEgfCAgIDEgfAogIC8vIHwgQkMgMSB8ICAgMSB8ICAgMCB8CiAgLy8gfCBCQyAyIHwgICAyIHwgIC0xIHwKICAvLyBBbHNvIGB5eWAgYWx3YXlzIHJldHVybnMgdGhlIGxhc3QgdHdvIGRpZ2l0cyBvZiBhIHllYXIsCiAgLy8gd2hpbGUgYHV1YCBwYWRzIHNpbmdsZSBkaWdpdCB5ZWFycyB0byAyIGNoYXJhY3RlcnMgYW5kIHJldHVybnMgb3RoZXIgeWVhcnMgdW5jaGFuZ2VkLgogIHU6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oZGF0ZSwgdG9rZW4pIHsKICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7CiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHllYXIsIHRva2VuLmxlbmd0aCk7CiAgfSwgInUiKSwKICAvLyBRdWFydGVyCiAgUTogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihkYXRlLCB0b2tlbiwgbG9jYWxpemUyKSB7CiAgICBjb25zdCBxdWFydGVyID0gTWF0aC5jZWlsKChkYXRlLmdldE1vbnRoKCkgKyAxKSAvIDMpOwogICAgc3dpdGNoICh0b2tlbikgewogICAgICAvLyAxLCAyLCAzLCA0CiAgICAgIGNhc2UgIlEiOgogICAgICAgIHJldHVybiBTdHJpbmcocXVhcnRlcik7CiAgICAgIC8vIDAxLCAwMiwgMDMsIDA0CiAgICAgIGNhc2UgIlFRIjoKICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHF1YXJ0ZXIsIDIpOwogICAgICAvLyAxc3QsIDJuZCwgM3JkLCA0dGgKICAgICAgY2FzZSAiUW8iOgogICAgICAgIHJldHVybiBsb2NhbGl6ZTIub3JkaW5hbE51bWJlcihxdWFydGVyLCB7IHVuaXQ6ICJxdWFydGVyIiB9KTsKICAgICAgLy8gUTEsIFEyLCBRMywgUTQKICAgICAgY2FzZSAiUVFRIjoKICAgICAgICByZXR1cm4gbG9jYWxpemUyLnF1YXJ0ZXIocXVhcnRlciwgewogICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICB9KTsKICAgICAgLy8gMSwgMiwgMywgNCAobmFycm93IHF1YXJ0ZXI7IGNvdWxkIGJlIG5vdCBudW1lcmljYWwpCiAgICAgIGNhc2UgIlFRUVFRIjoKICAgICAgICByZXR1cm4gbG9jYWxpemUyLnF1YXJ0ZXIocXVhcnRlciwgewogICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSk7CiAgICAgIC8vIDFzdCBxdWFydGVyLCAybmQgcXVhcnRlciwgLi4uCiAgICAgIGNhc2UgIlFRUVEiOgogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBsb2NhbGl6ZTIucXVhcnRlcihxdWFydGVyLCB7CiAgICAgICAgICB3aWR0aDogIndpZGUiLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSk7CiAgICB9CiAgfSwgIlEiKSwKICAvLyBTdGFuZC1hbG9uZSBxdWFydGVyCiAgcTogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihkYXRlLCB0b2tlbiwgbG9jYWxpemUyKSB7CiAgICBjb25zdCBxdWFydGVyID0gTWF0aC5jZWlsKChkYXRlLmdldE1vbnRoKCkgKyAxKSAvIDMpOwogICAgc3dpdGNoICh0b2tlbikgewogICAgICAvLyAxLCAyLCAzLCA0CiAgICAgIGNhc2UgInEiOgogICAgICAgIHJldHVybiBTdHJpbmcocXVhcnRlcik7CiAgICAgIC8vIDAxLCAwMiwgMDMsIDA0CiAgICAgIGNhc2UgInFxIjoKICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHF1YXJ0ZXIsIDIpOwogICAgICAvLyAxc3QsIDJuZCwgM3JkLCA0dGgKICAgICAgY2FzZSAicW8iOgogICAgICAgIHJldHVybiBsb2NhbGl6ZTIub3JkaW5hbE51bWJlcihxdWFydGVyLCB7IHVuaXQ6ICJxdWFydGVyIiB9KTsKICAgICAgLy8gUTEsIFEyLCBRMywgUTQKICAgICAgY2FzZSAicXFxIjoKICAgICAgICByZXR1cm4gbG9jYWxpemUyLnF1YXJ0ZXIocXVhcnRlciwgewogICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICBjb250ZXh0OiAic3RhbmRhbG9uZSIKICAgICAgICB9KTsKICAgICAgLy8gMSwgMiwgMywgNCAobmFycm93IHF1YXJ0ZXI7IGNvdWxkIGJlIG5vdCBudW1lcmljYWwpCiAgICAgIGNhc2UgInFxcXFxIjoKICAgICAgICByZXR1cm4gbG9jYWxpemUyLnF1YXJ0ZXIocXVhcnRlciwgewogICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgY29udGV4dDogInN0YW5kYWxvbmUiCiAgICAgICAgfSk7CiAgICAgIC8vIDFzdCBxdWFydGVyLCAybmQgcXVhcnRlciwgLi4uCiAgICAgIGNhc2UgInFxcXEiOgogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBsb2NhbGl6ZTIucXVhcnRlcihxdWFydGVyLCB7CiAgICAgICAgICB3aWR0aDogIndpZGUiLAogICAgICAgICAgY29udGV4dDogInN0YW5kYWxvbmUiCiAgICAgICAgfSk7CiAgICB9CiAgfSwgInEiKSwKICAvLyBNb250aAogIE06IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oZGF0ZSwgdG9rZW4sIGxvY2FsaXplMikgewogICAgY29uc3QgbW9udGggPSBkYXRlLmdldE1vbnRoKCk7CiAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgIGNhc2UgIk0iOgogICAgICBjYXNlICJNTSI6CiAgICAgICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy5NKGRhdGUsIHRva2VuKTsKICAgICAgLy8gMXN0LCAybmQsIC4uLiwgMTJ0aAogICAgICBjYXNlICJNbyI6CiAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5vcmRpbmFsTnVtYmVyKG1vbnRoICsgMSwgeyB1bml0OiAibW9udGgiIH0pOwogICAgICAvLyBKYW4sIEZlYiwgLi4uLCBEZWMKICAgICAgY2FzZSAiTU1NIjoKICAgICAgICByZXR1cm4gbG9jYWxpemUyLm1vbnRoKG1vbnRoLCB7CiAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pOwogICAgICAvLyBKLCBGLCAuLi4sIEQKICAgICAgY2FzZSAiTU1NTU0iOgogICAgICAgIHJldHVybiBsb2NhbGl6ZTIubW9udGgobW9udGgsIHsKICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pOwogICAgICAvLyBKYW51YXJ5LCBGZWJydWFyeSwgLi4uLCBEZWNlbWJlcgogICAgICBjYXNlICJNTU1NIjoKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gbG9jYWxpemUyLm1vbnRoKG1vbnRoLCB7IHdpZHRoOiAid2lkZSIsIGNvbnRleHQ6ICJmb3JtYXR0aW5nIiB9KTsKICAgIH0KICB9LCAiTSIpLAogIC8vIFN0YW5kLWFsb25lIG1vbnRoCiAgTDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihkYXRlLCB0b2tlbiwgbG9jYWxpemUyKSB7CiAgICBjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKTsKICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgLy8gMSwgMiwgLi4uLCAxMgogICAgICBjYXNlICJMIjoKICAgICAgICByZXR1cm4gU3RyaW5nKG1vbnRoICsgMSk7CiAgICAgIC8vIDAxLCAwMiwgLi4uLCAxMgogICAgICBjYXNlICJMTCI6CiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhtb250aCArIDEsIDIpOwogICAgICAvLyAxc3QsIDJuZCwgLi4uLCAxMnRoCiAgICAgIGNhc2UgIkxvIjoKICAgICAgICByZXR1cm4gbG9jYWxpemUyLm9yZGluYWxOdW1iZXIobW9udGggKyAxLCB7IHVuaXQ6ICJtb250aCIgfSk7CiAgICAgIC8vIEphbiwgRmViLCAuLi4sIERlYwogICAgICBjYXNlICJMTEwiOgogICAgICAgIHJldHVybiBsb2NhbGl6ZTIubW9udGgobW9udGgsIHsKICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgY29udGV4dDogInN0YW5kYWxvbmUiCiAgICAgICAgfSk7CiAgICAgIC8vIEosIEYsIC4uLiwgRAogICAgICBjYXNlICJMTExMTCI6CiAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5tb250aChtb250aCwgewogICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgY29udGV4dDogInN0YW5kYWxvbmUiCiAgICAgICAgfSk7CiAgICAgIC8vIEphbnVhcnksIEZlYnJ1YXJ5LCAuLi4sIERlY2VtYmVyCiAgICAgIGNhc2UgIkxMTEwiOgogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBsb2NhbGl6ZTIubW9udGgobW9udGgsIHsgd2lkdGg6ICJ3aWRlIiwgY29udGV4dDogInN0YW5kYWxvbmUiIH0pOwogICAgfQogIH0sICJMIiksCiAgLy8gTG9jYWwgd2VlayBvZiB5ZWFyCiAgdzogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihkYXRlLCB0b2tlbiwgbG9jYWxpemUyLCBvcHRpb25zKSB7CiAgICBjb25zdCB3ZWVrID0gZ2V0V2VlayhkYXRlLCBvcHRpb25zKTsKICAgIGlmICh0b2tlbiA9PT0gIndvIikgewogICAgICByZXR1cm4gbG9jYWxpemUyLm9yZGluYWxOdW1iZXIod2VlaywgeyB1bml0OiAid2VlayIgfSk7CiAgICB9CiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHdlZWssIHRva2VuLmxlbmd0aCk7CiAgfSwgInciKSwKICAvLyBJU08gd2VlayBvZiB5ZWFyCiAgSTogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihkYXRlLCB0b2tlbiwgbG9jYWxpemUyKSB7CiAgICBjb25zdCBpc29XZWVrID0gZ2V0SVNPV2VlayhkYXRlKTsKICAgIGlmICh0b2tlbiA9PT0gIklvIikgewogICAgICByZXR1cm4gbG9jYWxpemUyLm9yZGluYWxOdW1iZXIoaXNvV2VlaywgeyB1bml0OiAid2VlayIgfSk7CiAgICB9CiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGlzb1dlZWssIHRva2VuLmxlbmd0aCk7CiAgfSwgIkkiKSwKICAvLyBEYXkgb2YgdGhlIG1vbnRoCiAgZDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihkYXRlLCB0b2tlbiwgbG9jYWxpemUyKSB7CiAgICBpZiAodG9rZW4gPT09ICJkbyIpIHsKICAgICAgcmV0dXJuIGxvY2FsaXplMi5vcmRpbmFsTnVtYmVyKGRhdGUuZ2V0RGF0ZSgpLCB7IHVuaXQ6ICJkYXRlIiB9KTsKICAgIH0KICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMuZChkYXRlLCB0b2tlbik7CiAgfSwgImQiKSwKICAvLyBEYXkgb2YgeWVhcgogIEQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oZGF0ZSwgdG9rZW4sIGxvY2FsaXplMikgewogICAgY29uc3QgZGF5T2ZZZWFyID0gZ2V0RGF5T2ZZZWFyKGRhdGUpOwogICAgaWYgKHRva2VuID09PSAiRG8iKSB7CiAgICAgIHJldHVybiBsb2NhbGl6ZTIub3JkaW5hbE51bWJlcihkYXlPZlllYXIsIHsgdW5pdDogImRheU9mWWVhciIgfSk7CiAgICB9CiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRheU9mWWVhciwgdG9rZW4ubGVuZ3RoKTsKICB9LCAiRCIpLAogIC8vIERheSBvZiB3ZWVrCiAgRTogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihkYXRlLCB0b2tlbiwgbG9jYWxpemUyKSB7CiAgICBjb25zdCBkYXlPZldlZWsgPSBkYXRlLmdldERheSgpOwogICAgc3dpdGNoICh0b2tlbikgewogICAgICAvLyBUdWUKICAgICAgY2FzZSAiRSI6CiAgICAgIGNhc2UgIkVFIjoKICAgICAgY2FzZSAiRUVFIjoKICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheShkYXlPZldlZWssIHsKICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSk7CiAgICAgIC8vIFQKICAgICAgY2FzZSAiRUVFRUUiOgogICAgICAgIHJldHVybiBsb2NhbGl6ZTIuZGF5KGRheU9mV2VlaywgewogICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSk7CiAgICAgIC8vIFR1CiAgICAgIGNhc2UgIkVFRUVFRSI6CiAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5kYXkoZGF5T2ZXZWVrLCB7CiAgICAgICAgICB3aWR0aDogInNob3J0IiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pOwogICAgICAvLyBUdWVzZGF5CiAgICAgIGNhc2UgIkVFRUUiOgogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBsb2NhbGl6ZTIuZGF5KGRheU9mV2VlaywgewogICAgICAgICAgd2lkdGg6ICJ3aWRlIiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pOwogICAgfQogIH0sICJFIiksCiAgLy8gTG9jYWwgZGF5IG9mIHdlZWsKICBlOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGRhdGUsIHRva2VuLCBsb2NhbGl6ZTIsIG9wdGlvbnMpIHsKICAgIGNvbnN0IGRheU9mV2VlayA9IGRhdGUuZ2V0RGF5KCk7CiAgICBjb25zdCBsb2NhbERheU9mV2VlayA9IChkYXlPZldlZWsgLSBvcHRpb25zLndlZWtTdGFydHNPbiArIDgpICUgNyB8fCA3OwogICAgc3dpdGNoICh0b2tlbikgewogICAgICAvLyBOdW1lcmljYWwgdmFsdWUgKE50aCBkYXkgb2Ygd2VlayB3aXRoIGN1cnJlbnQgbG9jYWxlIG9yIHdlZWtTdGFydHNPbikKICAgICAgY2FzZSAiZSI6CiAgICAgICAgcmV0dXJuIFN0cmluZyhsb2NhbERheU9mV2Vlayk7CiAgICAgIC8vIFBhZGRlZCBudW1lcmljYWwgdmFsdWUKICAgICAgY2FzZSAiZWUiOgogICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MobG9jYWxEYXlPZldlZWssIDIpOwogICAgICAvLyAxc3QsIDJuZCwgLi4uLCA3dGgKICAgICAgY2FzZSAiZW8iOgogICAgICAgIHJldHVybiBsb2NhbGl6ZTIub3JkaW5hbE51bWJlcihsb2NhbERheU9mV2VlaywgeyB1bml0OiAiZGF5IiB9KTsKICAgICAgY2FzZSAiZWVlIjoKICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheShkYXlPZldlZWssIHsKICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSk7CiAgICAgIC8vIFQKICAgICAgY2FzZSAiZWVlZWUiOgogICAgICAgIHJldHVybiBsb2NhbGl6ZTIuZGF5KGRheU9mV2VlaywgewogICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSk7CiAgICAgIC8vIFR1CiAgICAgIGNhc2UgImVlZWVlZSI6CiAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5kYXkoZGF5T2ZXZWVrLCB7CiAgICAgICAgICB3aWR0aDogInNob3J0IiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pOwogICAgICAvLyBUdWVzZGF5CiAgICAgIGNhc2UgImVlZWUiOgogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBsb2NhbGl6ZTIuZGF5KGRheU9mV2VlaywgewogICAgICAgICAgd2lkdGg6ICJ3aWRlIiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pOwogICAgfQogIH0sICJlIiksCiAgLy8gU3RhbmQtYWxvbmUgbG9jYWwgZGF5IG9mIHdlZWsKICBjOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGRhdGUsIHRva2VuLCBsb2NhbGl6ZTIsIG9wdGlvbnMpIHsKICAgIGNvbnN0IGRheU9mV2VlayA9IGRhdGUuZ2V0RGF5KCk7CiAgICBjb25zdCBsb2NhbERheU9mV2VlayA9IChkYXlPZldlZWsgLSBvcHRpb25zLndlZWtTdGFydHNPbiArIDgpICUgNyB8fCA3OwogICAgc3dpdGNoICh0b2tlbikgewogICAgICAvLyBOdW1lcmljYWwgdmFsdWUgKHNhbWUgYXMgaW4gYGVgKQogICAgICBjYXNlICJjIjoKICAgICAgICByZXR1cm4gU3RyaW5nKGxvY2FsRGF5T2ZXZWVrKTsKICAgICAgLy8gUGFkZGVkIG51bWVyaWNhbCB2YWx1ZQogICAgICBjYXNlICJjYyI6CiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhsb2NhbERheU9mV2VlaywgdG9rZW4ubGVuZ3RoKTsKICAgICAgLy8gMXN0LCAybmQsIC4uLiwgN3RoCiAgICAgIGNhc2UgImNvIjoKICAgICAgICByZXR1cm4gbG9jYWxpemUyLm9yZGluYWxOdW1iZXIobG9jYWxEYXlPZldlZWssIHsgdW5pdDogImRheSIgfSk7CiAgICAgIGNhc2UgImNjYyI6CiAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5kYXkoZGF5T2ZXZWVrLCB7CiAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgIGNvbnRleHQ6ICJzdGFuZGFsb25lIgogICAgICAgIH0pOwogICAgICAvLyBUCiAgICAgIGNhc2UgImNjY2NjIjoKICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheShkYXlPZldlZWssIHsKICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgIGNvbnRleHQ6ICJzdGFuZGFsb25lIgogICAgICAgIH0pOwogICAgICAvLyBUdQogICAgICBjYXNlICJjY2NjY2MiOgogICAgICAgIHJldHVybiBsb2NhbGl6ZTIuZGF5KGRheU9mV2VlaywgewogICAgICAgICAgd2lkdGg6ICJzaG9ydCIsCiAgICAgICAgICBjb250ZXh0OiAic3RhbmRhbG9uZSIKICAgICAgICB9KTsKICAgICAgLy8gVHVlc2RheQogICAgICBjYXNlICJjY2NjIjoKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheShkYXlPZldlZWssIHsKICAgICAgICAgIHdpZHRoOiAid2lkZSIsCiAgICAgICAgICBjb250ZXh0OiAic3RhbmRhbG9uZSIKICAgICAgICB9KTsKICAgIH0KICB9LCAiYyIpLAogIC8vIElTTyBkYXkgb2Ygd2VlawogIGk6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oZGF0ZSwgdG9rZW4sIGxvY2FsaXplMikgewogICAgY29uc3QgZGF5T2ZXZWVrID0gZGF0ZS5nZXREYXkoKTsKICAgIGNvbnN0IGlzb0RheU9mV2VlayA9IGRheU9mV2VlayA9PT0gMCA/IDcgOiBkYXlPZldlZWs7CiAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgIC8vIDIKICAgICAgY2FzZSAiaSI6CiAgICAgICAgcmV0dXJuIFN0cmluZyhpc29EYXlPZldlZWspOwogICAgICAvLyAwMgogICAgICBjYXNlICJpaSI6CiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhpc29EYXlPZldlZWssIHRva2VuLmxlbmd0aCk7CiAgICAgIC8vIDJuZAogICAgICBjYXNlICJpbyI6CiAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5vcmRpbmFsTnVtYmVyKGlzb0RheU9mV2VlaywgeyB1bml0OiAiZGF5IiB9KTsKICAgICAgLy8gVHVlCiAgICAgIGNhc2UgImlpaSI6CiAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5kYXkoZGF5T2ZXZWVrLCB7CiAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pOwogICAgICAvLyBUCiAgICAgIGNhc2UgImlpaWlpIjoKICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheShkYXlPZldlZWssIHsKICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pOwogICAgICAvLyBUdQogICAgICBjYXNlICJpaWlpaWkiOgogICAgICAgIHJldHVybiBsb2NhbGl6ZTIuZGF5KGRheU9mV2VlaywgewogICAgICAgICAgd2lkdGg6ICJzaG9ydCIsCiAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICB9KTsKICAgICAgLy8gVHVlc2RheQogICAgICBjYXNlICJpaWlpIjoKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheShkYXlPZldlZWssIHsKICAgICAgICAgIHdpZHRoOiAid2lkZSIsCiAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICB9KTsKICAgIH0KICB9LCAiaSIpLAogIC8vIEFNIG9yIFBNCiAgYTogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihkYXRlLCB0b2tlbiwgbG9jYWxpemUyKSB7CiAgICBjb25zdCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKTsKICAgIGNvbnN0IGRheVBlcmlvZEVudW1WYWx1ZSA9IGhvdXJzIC8gMTIgPj0gMSA/ICJwbSIgOiAiYW0iOwogICAgc3dpdGNoICh0b2tlbikgewogICAgICBjYXNlICJhIjoKICAgICAgY2FzZSAiYWEiOgogICAgICAgIHJldHVybiBsb2NhbGl6ZTIuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwgewogICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICB9KTsKICAgICAgY2FzZSAiYWFhIjoKICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHsKICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSkudG9Mb3dlckNhc2UoKTsKICAgICAgY2FzZSAiYWFhYWEiOgogICAgICAgIHJldHVybiBsb2NhbGl6ZTIuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwgewogICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSk7CiAgICAgIGNhc2UgImFhYWEiOgogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBsb2NhbGl6ZTIuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwgewogICAgICAgICAgd2lkdGg6ICJ3aWRlIiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pOwogICAgfQogIH0sICJhIiksCiAgLy8gQU0sIFBNLCBtaWRuaWdodCwgbm9vbgogIGI6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oZGF0ZSwgdG9rZW4sIGxvY2FsaXplMikgewogICAgY29uc3QgaG91cnMgPSBkYXRlLmdldEhvdXJzKCk7CiAgICBsZXQgZGF5UGVyaW9kRW51bVZhbHVlOwogICAgaWYgKGhvdXJzID09PSAxMikgewogICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLm5vb247CiAgICB9IGVsc2UgaWYgKGhvdXJzID09PSAwKSB7CiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0ubWlkbmlnaHQ7CiAgICB9IGVsc2UgewogICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBob3VycyAvIDEyID49IDEgPyAicG0iIDogImFtIjsKICAgIH0KICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgY2FzZSAiYiI6CiAgICAgIGNhc2UgImJiIjoKICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHsKICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSk7CiAgICAgIGNhc2UgImJiYiI6CiAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7CiAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pLnRvTG93ZXJDYXNlKCk7CiAgICAgIGNhc2UgImJiYmJiIjoKICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHsKICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pOwogICAgICBjYXNlICJiYmJiIjoKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHsKICAgICAgICAgIHdpZHRoOiAid2lkZSIsCiAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICB9KTsKICAgIH0KICB9LCAiYiIpLAogIC8vIGluIHRoZSBtb3JuaW5nLCBpbiB0aGUgYWZ0ZXJub29uLCBpbiB0aGUgZXZlbmluZywgYXQgbmlnaHQKICBCOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGRhdGUsIHRva2VuLCBsb2NhbGl6ZTIpIHsKICAgIGNvbnN0IGhvdXJzID0gZGF0ZS5nZXRIb3VycygpOwogICAgbGV0IGRheVBlcmlvZEVudW1WYWx1ZTsKICAgIGlmIChob3VycyA+PSAxNykgewogICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLmV2ZW5pbmc7CiAgICB9IGVsc2UgaWYgKGhvdXJzID49IDEyKSB7CiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0uYWZ0ZXJub29uOwogICAgfSBlbHNlIGlmIChob3VycyA+PSA0KSB7CiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0ubW9ybmluZzsKICAgIH0gZWxzZSB7CiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0ubmlnaHQ7CiAgICB9CiAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgIGNhc2UgIkIiOgogICAgICBjYXNlICJCQiI6CiAgICAgIGNhc2UgIkJCQiI6CiAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7CiAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pOwogICAgICBjYXNlICJCQkJCQiI6CiAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7CiAgICAgICAgICB3aWR0aDogIm5hcnJvdyIsCiAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICB9KTsKICAgICAgY2FzZSAiQkJCQiI6CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7CiAgICAgICAgICB3aWR0aDogIndpZGUiLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSk7CiAgICB9CiAgfSwgIkIiKSwKICAvLyBIb3VyIFsxLTEyXQogIGg6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oZGF0ZSwgdG9rZW4sIGxvY2FsaXplMikgewogICAgaWYgKHRva2VuID09PSAiaG8iKSB7CiAgICAgIGxldCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKSAlIDEyOwogICAgICBpZiAoaG91cnMgPT09IDApIGhvdXJzID0gMTI7CiAgICAgIHJldHVybiBsb2NhbGl6ZTIub3JkaW5hbE51bWJlcihob3VycywgeyB1bml0OiAiaG91ciIgfSk7CiAgICB9CiAgICByZXR1cm4gbGlnaHRGb3JtYXR0ZXJzLmgoZGF0ZSwgdG9rZW4pOwogIH0sICJoIiksCiAgLy8gSG91ciBbMC0yM10KICBIOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGRhdGUsIHRva2VuLCBsb2NhbGl6ZTIpIHsKICAgIGlmICh0b2tlbiA9PT0gIkhvIikgewogICAgICByZXR1cm4gbG9jYWxpemUyLm9yZGluYWxOdW1iZXIoZGF0ZS5nZXRIb3VycygpLCB7IHVuaXQ6ICJob3VyIiB9KTsKICAgIH0KICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMuSChkYXRlLCB0b2tlbik7CiAgfSwgIkgiKSwKICAvLyBIb3VyIFswLTExXQogIEs6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oZGF0ZSwgdG9rZW4sIGxvY2FsaXplMikgewogICAgY29uc3QgaG91cnMgPSBkYXRlLmdldEhvdXJzKCkgJSAxMjsKICAgIGlmICh0b2tlbiA9PT0gIktvIikgewogICAgICByZXR1cm4gbG9jYWxpemUyLm9yZGluYWxOdW1iZXIoaG91cnMsIHsgdW5pdDogImhvdXIiIH0pOwogICAgfQogICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhob3VycywgdG9rZW4ubGVuZ3RoKTsKICB9LCAiSyIpLAogIC8vIEhvdXIgWzEtMjRdCiAgazogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihkYXRlLCB0b2tlbiwgbG9jYWxpemUyKSB7CiAgICBsZXQgaG91cnMgPSBkYXRlLmdldEhvdXJzKCk7CiAgICBpZiAoaG91cnMgPT09IDApIGhvdXJzID0gMjQ7CiAgICBpZiAodG9rZW4gPT09ICJrbyIpIHsKICAgICAgcmV0dXJuIGxvY2FsaXplMi5vcmRpbmFsTnVtYmVyKGhvdXJzLCB7IHVuaXQ6ICJob3VyIiB9KTsKICAgIH0KICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoaG91cnMsIHRva2VuLmxlbmd0aCk7CiAgfSwgImsiKSwKICAvLyBNaW51dGUKICBtOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGRhdGUsIHRva2VuLCBsb2NhbGl6ZTIpIHsKICAgIGlmICh0b2tlbiA9PT0gIm1vIikgewogICAgICByZXR1cm4gbG9jYWxpemUyLm9yZGluYWxOdW1iZXIoZGF0ZS5nZXRNaW51dGVzKCksIHsgdW5pdDogIm1pbnV0ZSIgfSk7CiAgICB9CiAgICByZXR1cm4gbGlnaHRGb3JtYXR0ZXJzLm0oZGF0ZSwgdG9rZW4pOwogIH0sICJtIiksCiAgLy8gU2Vjb25kCiAgczogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihkYXRlLCB0b2tlbiwgbG9jYWxpemUyKSB7CiAgICBpZiAodG9rZW4gPT09ICJzbyIpIHsKICAgICAgcmV0dXJuIGxvY2FsaXplMi5vcmRpbmFsTnVtYmVyKGRhdGUuZ2V0U2Vjb25kcygpLCB7IHVuaXQ6ICJzZWNvbmQiIH0pOwogICAgfQogICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy5zKGRhdGUsIHRva2VuKTsKICB9LCAicyIpLAogIC8vIEZyYWN0aW9uIG9mIHNlY29uZAogIFM6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oZGF0ZSwgdG9rZW4pIHsKICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMuUyhkYXRlLCB0b2tlbik7CiAgfSwgIlMiKSwKICAvLyBUaW1lem9uZSAoSVNPLTg2MDEuIElmIG9mZnNldCBpcyAwLCBvdXRwdXQgaXMgYWx3YXlzIGAnWidgKQogIFg6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkgewogICAgY29uc3QgdGltZXpvbmVPZmZzZXQgPSBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7CiAgICBpZiAodGltZXpvbmVPZmZzZXQgPT09IDApIHsKICAgICAgcmV0dXJuICJaIjsKICAgIH0KICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgLy8gSG91cnMgYW5kIG9wdGlvbmFsIG1pbnV0ZXMKICAgICAgY2FzZSAiWCI6CiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWV6b25lV2l0aE9wdGlvbmFsTWludXRlcyh0aW1lem9uZU9mZnNldCk7CiAgICAgIC8vIEhvdXJzLCBtaW51dGVzIGFuZCBvcHRpb25hbCBzZWNvbmRzIHdpdGhvdXQgYDpgIGRlbGltaXRlcgogICAgICAvLyBOb3RlOiBuZWl0aGVyIElTTy04NjAxIG5vciBKYXZhU2NyaXB0IHN1cHBvcnRzIHNlY29uZHMgaW4gdGltZXpvbmUgb2Zmc2V0cwogICAgICAvLyBzbyB0aGlzIHRva2VuIGFsd2F5cyBoYXMgdGhlIHNhbWUgb3V0cHV0IGFzIGBYWGAKICAgICAgY2FzZSAiWFhYWCI6CiAgICAgIGNhc2UgIlhYIjoKICAgICAgICByZXR1cm4gZm9ybWF0VGltZXpvbmUodGltZXpvbmVPZmZzZXQpOwogICAgICAvLyBIb3VycywgbWludXRlcyBhbmQgb3B0aW9uYWwgc2Vjb25kcyB3aXRoIGA6YCBkZWxpbWl0ZXIKICAgICAgLy8gTm90ZTogbmVpdGhlciBJU08tODYwMSBub3IgSmF2YVNjcmlwdCBzdXBwb3J0cyBzZWNvbmRzIGluIHRpbWV6b25lIG9mZnNldHMKICAgICAgLy8gc28gdGhpcyB0b2tlbiBhbHdheXMgaGFzIHRoZSBzYW1lIG91dHB1dCBhcyBgWFhYYAogICAgICBjYXNlICJYWFhYWCI6CiAgICAgIGNhc2UgIlhYWCI6CiAgICAgIC8vIEhvdXJzIGFuZCBtaW51dGVzIHdpdGggYDpgIGRlbGltaXRlcgogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgIjoiKTsKICAgIH0KICB9LCAiWCIpLAogIC8vIFRpbWV6b25lIChJU08tODYwMS4gSWYgb2Zmc2V0IGlzIDAsIG91dHB1dCBpcyBgJyswMDowMCdgIG9yIGVxdWl2YWxlbnQpCiAgeDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihkYXRlLCB0b2tlbiwgX2xvY2FsaXplKSB7CiAgICBjb25zdCB0aW1lem9uZU9mZnNldCA9IGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKTsKICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgLy8gSG91cnMgYW5kIG9wdGlvbmFsIG1pbnV0ZXMKICAgICAgY2FzZSAieCI6CiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWV6b25lV2l0aE9wdGlvbmFsTWludXRlcyh0aW1lem9uZU9mZnNldCk7CiAgICAgIC8vIEhvdXJzLCBtaW51dGVzIGFuZCBvcHRpb25hbCBzZWNvbmRzIHdpdGhvdXQgYDpgIGRlbGltaXRlcgogICAgICAvLyBOb3RlOiBuZWl0aGVyIElTTy04NjAxIG5vciBKYXZhU2NyaXB0IHN1cHBvcnRzIHNlY29uZHMgaW4gdGltZXpvbmUgb2Zmc2V0cwogICAgICAvLyBzbyB0aGlzIHRva2VuIGFsd2F5cyBoYXMgdGhlIHNhbWUgb3V0cHV0IGFzIGB4eGAKICAgICAgY2FzZSAieHh4eCI6CiAgICAgIGNhc2UgInh4IjoKICAgICAgICByZXR1cm4gZm9ybWF0VGltZXpvbmUodGltZXpvbmVPZmZzZXQpOwogICAgICAvLyBIb3VycywgbWludXRlcyBhbmQgb3B0aW9uYWwgc2Vjb25kcyB3aXRoIGA6YCBkZWxpbWl0ZXIKICAgICAgLy8gTm90ZTogbmVpdGhlciBJU08tODYwMSBub3IgSmF2YVNjcmlwdCBzdXBwb3J0cyBzZWNvbmRzIGluIHRpbWV6b25lIG9mZnNldHMKICAgICAgLy8gc28gdGhpcyB0b2tlbiBhbHdheXMgaGFzIHRoZSBzYW1lIG91dHB1dCBhcyBgeHh4YAogICAgICBjYXNlICJ4eHh4eCI6CiAgICAgIGNhc2UgInh4eCI6CiAgICAgIC8vIEhvdXJzIGFuZCBtaW51dGVzIHdpdGggYDpgIGRlbGltaXRlcgogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgIjoiKTsKICAgIH0KICB9LCAieCIpLAogIC8vIFRpbWV6b25lIChHTVQpCiAgTzogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihkYXRlLCB0b2tlbiwgX2xvY2FsaXplKSB7CiAgICBjb25zdCB0aW1lem9uZU9mZnNldCA9IGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKTsKICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgLy8gU2hvcnQKICAgICAgY2FzZSAiTyI6CiAgICAgIGNhc2UgIk9PIjoKICAgICAgY2FzZSAiT09PIjoKICAgICAgICByZXR1cm4gIkdNVCIgKyBmb3JtYXRUaW1lem9uZVNob3J0KHRpbWV6b25lT2Zmc2V0LCAiOiIpOwogICAgICAvLyBMb25nCiAgICAgIGNhc2UgIk9PT08iOgogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiAiR01UIiArIGZvcm1hdFRpbWV6b25lKHRpbWV6b25lT2Zmc2V0LCAiOiIpOwogICAgfQogIH0sICJPIiksCiAgLy8gVGltZXpvbmUgKHNwZWNpZmljIG5vbi1sb2NhdGlvbikKICB6OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGRhdGUsIHRva2VuLCBfbG9jYWxpemUpIHsKICAgIGNvbnN0IHRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpOwogICAgc3dpdGNoICh0b2tlbikgewogICAgICAvLyBTaG9ydAogICAgICBjYXNlICJ6IjoKICAgICAgY2FzZSAienoiOgogICAgICBjYXNlICJ6enoiOgogICAgICAgIHJldHVybiAiR01UIiArIGZvcm1hdFRpbWV6b25lU2hvcnQodGltZXpvbmVPZmZzZXQsICI6Iik7CiAgICAgIC8vIExvbmcKICAgICAgY2FzZSAienp6eiI6CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuICJHTVQiICsgZm9ybWF0VGltZXpvbmUodGltZXpvbmVPZmZzZXQsICI6Iik7CiAgICB9CiAgfSwgInoiKSwKICAvLyBTZWNvbmRzIHRpbWVzdGFtcAogIHQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkgewogICAgY29uc3QgdGltZXN0YW1wMiA9IE1hdGgudHJ1bmMoK2RhdGUgLyAxZTMpOwogICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyh0aW1lc3RhbXAyLCB0b2tlbi5sZW5ndGgpOwogIH0sICJ0IiksCiAgLy8gTWlsbGlzZWNvbmRzIHRpbWVzdGFtcAogIFQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkgewogICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcygrZGF0ZSwgdG9rZW4ubGVuZ3RoKTsKICB9LCAiVCIpCn07CmZ1bmN0aW9uIGZvcm1hdFRpbWV6b25lU2hvcnQob2Zmc2V0LCBkZWxpbWl0ZXIgPSAiIikgewogIGNvbnN0IHNpZ24gPSBvZmZzZXQgPiAwID8gIi0iIDogIisiOwogIGNvbnN0IGFic09mZnNldCA9IE1hdGguYWJzKG9mZnNldCk7CiAgY29uc3QgaG91cnMgPSBNYXRoLnRydW5jKGFic09mZnNldCAvIDYwKTsKICBjb25zdCBtaW51dGVzID0gYWJzT2Zmc2V0ICUgNjA7CiAgaWYgKG1pbnV0ZXMgPT09IDApIHsKICAgIHJldHVybiBzaWduICsgU3RyaW5nKGhvdXJzKTsKICB9CiAgcmV0dXJuIHNpZ24gKyBTdHJpbmcoaG91cnMpICsgZGVsaW1pdGVyICsgYWRkTGVhZGluZ1plcm9zKG1pbnV0ZXMsIDIpOwp9Cl9fbmFtZShmb3JtYXRUaW1lem9uZVNob3J0LCAiZm9ybWF0VGltZXpvbmVTaG9ydCIpOwpmdW5jdGlvbiBmb3JtYXRUaW1lem9uZVdpdGhPcHRpb25hbE1pbnV0ZXMob2Zmc2V0LCBkZWxpbWl0ZXIpIHsKICBpZiAob2Zmc2V0ICUgNjAgPT09IDApIHsKICAgIGNvbnN0IHNpZ24gPSBvZmZzZXQgPiAwID8gIi0iIDogIisiOwogICAgcmV0dXJuIHNpZ24gKyBhZGRMZWFkaW5nWmVyb3MoTWF0aC5hYnMob2Zmc2V0KSAvIDYwLCAyKTsKICB9CiAgcmV0dXJuIGZvcm1hdFRpbWV6b25lKG9mZnNldCwgZGVsaW1pdGVyKTsKfQpfX25hbWUoZm9ybWF0VGltZXpvbmVXaXRoT3B0aW9uYWxNaW51dGVzLCAiZm9ybWF0VGltZXpvbmVXaXRoT3B0aW9uYWxNaW51dGVzIik7CmZ1bmN0aW9uIGZvcm1hdFRpbWV6b25lKG9mZnNldCwgZGVsaW1pdGVyID0gIiIpIHsKICBjb25zdCBzaWduID0gb2Zmc2V0ID4gMCA/ICItIiA6ICIrIjsKICBjb25zdCBhYnNPZmZzZXQgPSBNYXRoLmFicyhvZmZzZXQpOwogIGNvbnN0IGhvdXJzID0gYWRkTGVhZGluZ1plcm9zKE1hdGgudHJ1bmMoYWJzT2Zmc2V0IC8gNjApLCAyKTsKICBjb25zdCBtaW51dGVzID0gYWRkTGVhZGluZ1plcm9zKGFic09mZnNldCAlIDYwLCAyKTsKICByZXR1cm4gc2lnbiArIGhvdXJzICsgZGVsaW1pdGVyICsgbWludXRlczsKfQpfX25hbWUoZm9ybWF0VGltZXpvbmUsICJmb3JtYXRUaW1lem9uZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9fbGliL2Zvcm1hdC9sb25nRm9ybWF0dGVycy5qcwp2YXIgZGF0ZUxvbmdGb3JtYXR0ZXIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChwYXR0ZXJuLCBmb3JtYXRMb25nMikgPT4gewogIHN3aXRjaCAocGF0dGVybikgewogICAgY2FzZSAiUCI6CiAgICAgIHJldHVybiBmb3JtYXRMb25nMi5kYXRlKHsgd2lkdGg6ICJzaG9ydCIgfSk7CiAgICBjYXNlICJQUCI6CiAgICAgIHJldHVybiBmb3JtYXRMb25nMi5kYXRlKHsgd2lkdGg6ICJtZWRpdW0iIH0pOwogICAgY2FzZSAiUFBQIjoKICAgICAgcmV0dXJuIGZvcm1hdExvbmcyLmRhdGUoeyB3aWR0aDogImxvbmciIH0pOwogICAgY2FzZSAiUFBQUCI6CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gZm9ybWF0TG9uZzIuZGF0ZSh7IHdpZHRoOiAiZnVsbCIgfSk7CiAgfQp9LCAiZGF0ZUxvbmdGb3JtYXR0ZXIiKTsKdmFyIHRpbWVMb25nRm9ybWF0dGVyID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgocGF0dGVybiwgZm9ybWF0TG9uZzIpID0+IHsKICBzd2l0Y2ggKHBhdHRlcm4pIHsKICAgIGNhc2UgInAiOgogICAgICByZXR1cm4gZm9ybWF0TG9uZzIudGltZSh7IHdpZHRoOiAic2hvcnQiIH0pOwogICAgY2FzZSAicHAiOgogICAgICByZXR1cm4gZm9ybWF0TG9uZzIudGltZSh7IHdpZHRoOiAibWVkaXVtIiB9KTsKICAgIGNhc2UgInBwcCI6CiAgICAgIHJldHVybiBmb3JtYXRMb25nMi50aW1lKHsgd2lkdGg6ICJsb25nIiB9KTsKICAgIGNhc2UgInBwcHAiOgogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIGZvcm1hdExvbmcyLnRpbWUoeyB3aWR0aDogImZ1bGwiIH0pOwogIH0KfSwgInRpbWVMb25nRm9ybWF0dGVyIik7CnZhciBkYXRlVGltZUxvbmdGb3JtYXR0ZXIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChwYXR0ZXJuLCBmb3JtYXRMb25nMikgPT4gewogIGNvbnN0IG1hdGNoUmVzdWx0ID0gcGF0dGVybi5tYXRjaCgvKFArKShwKyk/LykgfHwgW107CiAgY29uc3QgZGF0ZVBhdHRlcm4gPSBtYXRjaFJlc3VsdFsxXTsKICBjb25zdCB0aW1lUGF0dGVybiA9IG1hdGNoUmVzdWx0WzJdOwogIGlmICghdGltZVBhdHRlcm4pIHsKICAgIHJldHVybiBkYXRlTG9uZ0Zvcm1hdHRlcihwYXR0ZXJuLCBmb3JtYXRMb25nMik7CiAgfQogIGxldCBkYXRlVGltZUZvcm1hdDsKICBzd2l0Y2ggKGRhdGVQYXR0ZXJuKSB7CiAgICBjYXNlICJQIjoKICAgICAgZGF0ZVRpbWVGb3JtYXQgPSBmb3JtYXRMb25nMi5kYXRlVGltZSh7IHdpZHRoOiAic2hvcnQiIH0pOwogICAgICBicmVhazsKICAgIGNhc2UgIlBQIjoKICAgICAgZGF0ZVRpbWVGb3JtYXQgPSBmb3JtYXRMb25nMi5kYXRlVGltZSh7IHdpZHRoOiAibWVkaXVtIiB9KTsKICAgICAgYnJlYWs7CiAgICBjYXNlICJQUFAiOgogICAgICBkYXRlVGltZUZvcm1hdCA9IGZvcm1hdExvbmcyLmRhdGVUaW1lKHsgd2lkdGg6ICJsb25nIiB9KTsKICAgICAgYnJlYWs7CiAgICBjYXNlICJQUFBQIjoKICAgIGRlZmF1bHQ6CiAgICAgIGRhdGVUaW1lRm9ybWF0ID0gZm9ybWF0TG9uZzIuZGF0ZVRpbWUoeyB3aWR0aDogImZ1bGwiIH0pOwogICAgICBicmVhazsKICB9CiAgcmV0dXJuIGRhdGVUaW1lRm9ybWF0LnJlcGxhY2UoInt7ZGF0ZX19IiwgZGF0ZUxvbmdGb3JtYXR0ZXIoZGF0ZVBhdHRlcm4sIGZvcm1hdExvbmcyKSkucmVwbGFjZSgie3t0aW1lfX0iLCB0aW1lTG9uZ0Zvcm1hdHRlcih0aW1lUGF0dGVybiwgZm9ybWF0TG9uZzIpKTsKfSwgImRhdGVUaW1lTG9uZ0Zvcm1hdHRlciIpOwp2YXIgbG9uZ0Zvcm1hdHRlcnMgPSB7CiAgcDogdGltZUxvbmdGb3JtYXR0ZXIsCiAgUDogZGF0ZVRpbWVMb25nRm9ybWF0dGVyCn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvcHJvdGVjdGVkVG9rZW5zLmpzCnZhciBkYXlPZlllYXJUb2tlblJFID0gL15EKyQvOwp2YXIgd2Vla1llYXJUb2tlblJFID0gL15ZKyQvOwp2YXIgdGhyb3dUb2tlbnMgPSBbIkQiLCAiREQiLCAiWVkiLCAiWVlZWSJdOwpmdW5jdGlvbiBpc1Byb3RlY3RlZERheU9mWWVhclRva2VuKHRva2VuKSB7CiAgcmV0dXJuIGRheU9mWWVhclRva2VuUkUudGVzdCh0b2tlbik7Cn0KX19uYW1lKGlzUHJvdGVjdGVkRGF5T2ZZZWFyVG9rZW4sICJpc1Byb3RlY3RlZERheU9mWWVhclRva2VuIik7CmZ1bmN0aW9uIGlzUHJvdGVjdGVkV2Vla1llYXJUb2tlbih0b2tlbikgewogIHJldHVybiB3ZWVrWWVhclRva2VuUkUudGVzdCh0b2tlbik7Cn0KX19uYW1lKGlzUHJvdGVjdGVkV2Vla1llYXJUb2tlbiwgImlzUHJvdGVjdGVkV2Vla1llYXJUb2tlbiIpOwpmdW5jdGlvbiB3YXJuT3JUaHJvd1Byb3RlY3RlZEVycm9yKHRva2VuLCBmb3JtYXQyLCBpbnB1dCkgewogIGNvbnN0IF9tZXNzYWdlID0gbWVzc2FnZSh0b2tlbiwgZm9ybWF0MiwgaW5wdXQpOwogIGNvbnNvbGUud2FybihfbWVzc2FnZSk7CiAgaWYgKHRocm93VG9rZW5zLmluY2x1ZGVzKHRva2VuKSkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoX21lc3NhZ2UpOwp9Cl9fbmFtZSh3YXJuT3JUaHJvd1Byb3RlY3RlZEVycm9yLCAid2Fybk9yVGhyb3dQcm90ZWN0ZWRFcnJvciIpOwpmdW5jdGlvbiBtZXNzYWdlKHRva2VuLCBmb3JtYXQyLCBpbnB1dCkgewogIGNvbnN0IHN1YmplY3QgPSB0b2tlblswXSA9PT0gIlkiID8gInllYXJzIiA6ICJkYXlzIG9mIHRoZSBtb250aCI7CiAgcmV0dXJuIGBVc2UgXGAke3Rva2VuLnRvTG93ZXJDYXNlKCl9XGAgaW5zdGVhZCBvZiBcYCR7dG9rZW59XGAgKGluIFxgJHtmb3JtYXQyfVxgKSBmb3IgZm9ybWF0dGluZyAke3N1YmplY3R9IHRvIHRoZSBpbnB1dCBcYCR7aW5wdXR9XGA7IHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZGA7Cn0KX19uYW1lKG1lc3NhZ2UsICJtZXNzYWdlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2Zvcm1hdC5qcwp2YXIgZm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cCA9IC9beVlRcU1Md0lkRGVjaWhIS2ttc11vfChcdylcMSp8Jyd8JygnJ3xbXiddKSsoJ3wkKXwuL2c7CnZhciBsb25nRm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cCA9IC9QK3ArfFArfHArfCcnfCcoJyd8W14nXSkrKCd8JCl8Li9nOwp2YXIgZXNjYXBlZFN0cmluZ1JlZ0V4cCA9IC9eJyhbXl0qPyknPyQvOwp2YXIgZG91YmxlUXVvdGVSZWdFeHAgPSAvJycvZzsKdmFyIHVuZXNjYXBlZExhdGluQ2hhcmFjdGVyUmVnRXhwID0gL1thLXpBLVpdLzsKZnVuY3Rpb24gZm9ybWF0KGRhdGUsIGZvcm1hdFN0ciwgb3B0aW9ucykgewogIGNvbnN0IGRlZmF1bHRPcHRpb25zMiA9IGdldERlZmF1bHRPcHRpb25zKCk7CiAgY29uc3QgbG9jYWxlID0gb3B0aW9ucz8ubG9jYWxlID8/IGRlZmF1bHRPcHRpb25zMi5sb2NhbGUgPz8gZW5VUzsKICBjb25zdCBmaXJzdFdlZWtDb250YWluc0RhdGUgPSBvcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz8gb3B0aW9ucz8ubG9jYWxlPy5vcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz8gZGVmYXVsdE9wdGlvbnMyLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyBkZWZhdWx0T3B0aW9uczIubG9jYWxlPy5vcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz8gMTsKICBjb25zdCB3ZWVrU3RhcnRzT24gPSBvcHRpb25zPy53ZWVrU3RhcnRzT24gPz8gb3B0aW9ucz8ubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz8gZGVmYXVsdE9wdGlvbnMyLndlZWtTdGFydHNPbiA/PyBkZWZhdWx0T3B0aW9uczIubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz8gMDsKICBjb25zdCBvcmlnaW5hbERhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGlmICghaXNWYWxpZChvcmlnaW5hbERhdGUpKSB7CiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0aW1lIHZhbHVlIik7CiAgfQogIGxldCBwYXJ0cyA9IGZvcm1hdFN0ci5tYXRjaChsb25nRm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cCkubWFwKChzdWJzdHJpbmcpID0+IHsKICAgIGNvbnN0IGZpcnN0Q2hhcmFjdGVyID0gc3Vic3RyaW5nWzBdOwogICAgaWYgKGZpcnN0Q2hhcmFjdGVyID09PSAicCIgfHwgZmlyc3RDaGFyYWN0ZXIgPT09ICJQIikgewogICAgICBjb25zdCBsb25nRm9ybWF0dGVyID0gbG9uZ0Zvcm1hdHRlcnNbZmlyc3RDaGFyYWN0ZXJdOwogICAgICByZXR1cm4gbG9uZ0Zvcm1hdHRlcihzdWJzdHJpbmcsIGxvY2FsZS5mb3JtYXRMb25nKTsKICAgIH0KICAgIHJldHVybiBzdWJzdHJpbmc7CiAgfSkuam9pbigiIikubWF0Y2goZm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cCkubWFwKChzdWJzdHJpbmcpID0+IHsKICAgIGlmIChzdWJzdHJpbmcgPT09ICInJyIpIHsKICAgICAgcmV0dXJuIHsgaXNUb2tlbjogZmFsc2UsIHZhbHVlOiAiJyIgfTsKICAgIH0KICAgIGNvbnN0IGZpcnN0Q2hhcmFjdGVyID0gc3Vic3RyaW5nWzBdOwogICAgaWYgKGZpcnN0Q2hhcmFjdGVyID09PSAiJyIpIHsKICAgICAgcmV0dXJuIHsgaXNUb2tlbjogZmFsc2UsIHZhbHVlOiBjbGVhbkVzY2FwZWRTdHJpbmcoc3Vic3RyaW5nKSB9OwogICAgfQogICAgaWYgKGZvcm1hdHRlcnNbZmlyc3RDaGFyYWN0ZXJdKSB7CiAgICAgIHJldHVybiB7IGlzVG9rZW46IHRydWUsIHZhbHVlOiBzdWJzdHJpbmcgfTsKICAgIH0KICAgIGlmIChmaXJzdENoYXJhY3Rlci5tYXRjaCh1bmVzY2FwZWRMYXRpbkNoYXJhY3RlclJlZ0V4cCkpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoCiAgICAgICAgIkZvcm1hdCBzdHJpbmcgY29udGFpbnMgYW4gdW5lc2NhcGVkIGxhdGluIGFscGhhYmV0IGNoYXJhY3RlciBgIiArIGZpcnN0Q2hhcmFjdGVyICsgImAiCiAgICAgICk7CiAgICB9CiAgICByZXR1cm4geyBpc1Rva2VuOiBmYWxzZSwgdmFsdWU6IHN1YnN0cmluZyB9OwogIH0pOwogIGlmIChsb2NhbGUubG9jYWxpemUucHJlcHJvY2Vzc29yKSB7CiAgICBwYXJ0cyA9IGxvY2FsZS5sb2NhbGl6ZS5wcmVwcm9jZXNzb3Iob3JpZ2luYWxEYXRlLCBwYXJ0cyk7CiAgfQogIGNvbnN0IGZvcm1hdHRlck9wdGlvbnMgPSB7CiAgICBmaXJzdFdlZWtDb250YWluc0RhdGUsCiAgICB3ZWVrU3RhcnRzT24sCiAgICBsb2NhbGUKICB9OwogIHJldHVybiBwYXJ0cy5tYXAoKHBhcnQpID0+IHsKICAgIGlmICghcGFydC5pc1Rva2VuKSByZXR1cm4gcGFydC52YWx1ZTsKICAgIGNvbnN0IHRva2VuID0gcGFydC52YWx1ZTsKICAgIGlmICghb3B0aW9ucz8udXNlQWRkaXRpb25hbFdlZWtZZWFyVG9rZW5zICYmIGlzUHJvdGVjdGVkV2Vla1llYXJUb2tlbih0b2tlbikgfHwgIW9wdGlvbnM/LnVzZUFkZGl0aW9uYWxEYXlPZlllYXJUb2tlbnMgJiYgaXNQcm90ZWN0ZWREYXlPZlllYXJUb2tlbih0b2tlbikpIHsKICAgICAgd2Fybk9yVGhyb3dQcm90ZWN0ZWRFcnJvcih0b2tlbiwgZm9ybWF0U3RyLCBTdHJpbmcoZGF0ZSkpOwogICAgfQogICAgY29uc3QgZm9ybWF0dGVyMiA9IGZvcm1hdHRlcnNbdG9rZW5bMF1dOwogICAgcmV0dXJuIGZvcm1hdHRlcjIob3JpZ2luYWxEYXRlLCB0b2tlbiwgbG9jYWxlLmxvY2FsaXplLCBmb3JtYXR0ZXJPcHRpb25zKTsKICB9KS5qb2luKCIiKTsKfQpfX25hbWUoZm9ybWF0LCAiZm9ybWF0Iik7CmZ1bmN0aW9uIGNsZWFuRXNjYXBlZFN0cmluZyhpbnB1dCkgewogIGNvbnN0IG1hdGNoZWQgPSBpbnB1dC5tYXRjaChlc2NhcGVkU3RyaW5nUmVnRXhwKTsKICBpZiAoIW1hdGNoZWQpIHsKICAgIHJldHVybiBpbnB1dDsKICB9CiAgcmV0dXJuIG1hdGNoZWRbMV0ucmVwbGFjZShkb3VibGVRdW90ZVJlZ0V4cCwgIiciKTsKfQpfX25hbWUoY2xlYW5Fc2NhcGVkU3RyaW5nLCAiY2xlYW5Fc2NhcGVkU3RyaW5nIik7CnZhciBmb3JtYXRfZGVmYXVsdCA9IGZvcm1hdDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZm9ybWF0RGlzdGFuY2UuanMKZnVuY3Rpb24gZm9ybWF0RGlzdGFuY2UyKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBkZWZhdWx0T3B0aW9uczIgPSBnZXREZWZhdWx0T3B0aW9ucygpOwogIGNvbnN0IGxvY2FsZSA9IG9wdGlvbnM/LmxvY2FsZSA/PyBkZWZhdWx0T3B0aW9uczIubG9jYWxlID8/IGVuVVM7CiAgY29uc3QgbWludXRlc0luQWxtb3N0VHdvRGF5cyA9IDI1MjA7CiAgY29uc3QgY29tcGFyaXNvbiA9IGNvbXBhcmVBc2MobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSk7CiAgaWYgKGlzTmFOKGNvbXBhcmlzb24pKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0aW1lIHZhbHVlIik7CiAgY29uc3QgbG9jYWxpemVPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucywgewogICAgYWRkU3VmZml4OiBvcHRpb25zPy5hZGRTdWZmaXgsCiAgICBjb21wYXJpc29uCiAgfSk7CiAgY29uc3QgW2xhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgLi4uY29tcGFyaXNvbiA+IDAgPyBbZWFybGllckRhdGUsIGxhdGVyRGF0ZV0gOiBbbGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZV0KICApOwogIGNvbnN0IHNlY29uZHMgPSBkaWZmZXJlbmNlSW5TZWNvbmRzKGVhcmxpZXJEYXRlXywgbGF0ZXJEYXRlXyk7CiAgY29uc3Qgb2Zmc2V0SW5TZWNvbmRzID0gKGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMoZWFybGllckRhdGVfKSAtIGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMobGF0ZXJEYXRlXykpIC8gMWUzOwogIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLnJvdW5kKChzZWNvbmRzIC0gb2Zmc2V0SW5TZWNvbmRzKSAvIDYwKTsKICBsZXQgbW9udGhzMjsKICBpZiAobWludXRlcyA8IDIpIHsKICAgIGlmIChvcHRpb25zPy5pbmNsdWRlU2Vjb25kcykgewogICAgICBpZiAoc2Vjb25kcyA8IDUpIHsKICAgICAgICByZXR1cm4gbG9jYWxlLmZvcm1hdERpc3RhbmNlKCJsZXNzVGhhblhTZWNvbmRzIiwgNSwgbG9jYWxpemVPcHRpb25zKTsKICAgICAgfSBlbHNlIGlmIChzZWNvbmRzIDwgMTApIHsKICAgICAgICByZXR1cm4gbG9jYWxlLmZvcm1hdERpc3RhbmNlKCJsZXNzVGhhblhTZWNvbmRzIiwgMTAsIGxvY2FsaXplT3B0aW9ucyk7CiAgICAgIH0gZWxzZSBpZiAoc2Vjb25kcyA8IDIwKSB7CiAgICAgICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZSgibGVzc1RoYW5YU2Vjb25kcyIsIDIwLCBsb2NhbGl6ZU9wdGlvbnMpOwogICAgICB9IGVsc2UgaWYgKHNlY29uZHMgPCA0MCkgewogICAgICAgIHJldHVybiBsb2NhbGUuZm9ybWF0RGlzdGFuY2UoImhhbGZBTWludXRlIiwgMCwgbG9jYWxpemVPcHRpb25zKTsKICAgICAgfSBlbHNlIGlmIChzZWNvbmRzIDwgNjApIHsKICAgICAgICByZXR1cm4gbG9jYWxlLmZvcm1hdERpc3RhbmNlKCJsZXNzVGhhblhNaW51dGVzIiwgMSwgbG9jYWxpemVPcHRpb25zKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbG9jYWxlLmZvcm1hdERpc3RhbmNlKCJ4TWludXRlcyIsIDEsIGxvY2FsaXplT3B0aW9ucyk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmIChtaW51dGVzID09PSAwKSB7CiAgICAgICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZSgibGVzc1RoYW5YTWludXRlcyIsIDEsIGxvY2FsaXplT3B0aW9ucyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZSgieE1pbnV0ZXMiLCBtaW51dGVzLCBsb2NhbGl6ZU9wdGlvbnMpOwogICAgICB9CiAgICB9CiAgfSBlbHNlIGlmIChtaW51dGVzIDwgNDUpIHsKICAgIHJldHVybiBsb2NhbGUuZm9ybWF0RGlzdGFuY2UoInhNaW51dGVzIiwgbWludXRlcywgbG9jYWxpemVPcHRpb25zKTsKICB9IGVsc2UgaWYgKG1pbnV0ZXMgPCA5MCkgewogICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZSgiYWJvdXRYSG91cnMiLCAxLCBsb2NhbGl6ZU9wdGlvbnMpOwogIH0gZWxzZSBpZiAobWludXRlcyA8IG1pbnV0ZXNJbkRheSkgewogICAgY29uc3QgaG91cnMgPSBNYXRoLnJvdW5kKG1pbnV0ZXMgLyA2MCk7CiAgICByZXR1cm4gbG9jYWxlLmZvcm1hdERpc3RhbmNlKCJhYm91dFhIb3VycyIsIGhvdXJzLCBsb2NhbGl6ZU9wdGlvbnMpOwogIH0gZWxzZSBpZiAobWludXRlcyA8IG1pbnV0ZXNJbkFsbW9zdFR3b0RheXMpIHsKICAgIHJldHVybiBsb2NhbGUuZm9ybWF0RGlzdGFuY2UoInhEYXlzIiwgMSwgbG9jYWxpemVPcHRpb25zKTsKICB9IGVsc2UgaWYgKG1pbnV0ZXMgPCBtaW51dGVzSW5Nb250aCkgewogICAgY29uc3QgZGF5czIgPSBNYXRoLnJvdW5kKG1pbnV0ZXMgLyBtaW51dGVzSW5EYXkpOwogICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZSgieERheXMiLCBkYXlzMiwgbG9jYWxpemVPcHRpb25zKTsKICB9IGVsc2UgaWYgKG1pbnV0ZXMgPCBtaW51dGVzSW5Nb250aCAqIDIpIHsKICAgIG1vbnRoczIgPSBNYXRoLnJvdW5kKG1pbnV0ZXMgLyBtaW51dGVzSW5Nb250aCk7CiAgICByZXR1cm4gbG9jYWxlLmZvcm1hdERpc3RhbmNlKCJhYm91dFhNb250aHMiLCBtb250aHMyLCBsb2NhbGl6ZU9wdGlvbnMpOwogIH0KICBtb250aHMyID0gZGlmZmVyZW5jZUluTW9udGhzKGVhcmxpZXJEYXRlXywgbGF0ZXJEYXRlXyk7CiAgaWYgKG1vbnRoczIgPCAxMikgewogICAgY29uc3QgbmVhcmVzdE1vbnRoID0gTWF0aC5yb3VuZChtaW51dGVzIC8gbWludXRlc0luTW9udGgpOwogICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZSgieE1vbnRocyIsIG5lYXJlc3RNb250aCwgbG9jYWxpemVPcHRpb25zKTsKICB9IGVsc2UgewogICAgY29uc3QgbW9udGhzU2luY2VTdGFydE9mWWVhciA9IG1vbnRoczIgJSAxMjsKICAgIGNvbnN0IHllYXJzID0gTWF0aC50cnVuYyhtb250aHMyIC8gMTIpOwogICAgaWYgKG1vbnRoc1NpbmNlU3RhcnRPZlllYXIgPCAzKSB7CiAgICAgIHJldHVybiBsb2NhbGUuZm9ybWF0RGlzdGFuY2UoImFib3V0WFllYXJzIiwgeWVhcnMsIGxvY2FsaXplT3B0aW9ucyk7CiAgICB9IGVsc2UgaWYgKG1vbnRoc1NpbmNlU3RhcnRPZlllYXIgPCA5KSB7CiAgICAgIHJldHVybiBsb2NhbGUuZm9ybWF0RGlzdGFuY2UoIm92ZXJYWWVhcnMiLCB5ZWFycywgbG9jYWxpemVPcHRpb25zKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBsb2NhbGUuZm9ybWF0RGlzdGFuY2UoImFsbW9zdFhZZWFycyIsIHllYXJzICsgMSwgbG9jYWxpemVPcHRpb25zKTsKICAgIH0KICB9Cn0KX19uYW1lKGZvcm1hdERpc3RhbmNlMiwgImZvcm1hdERpc3RhbmNlIik7CnZhciBmb3JtYXREaXN0YW5jZV9kZWZhdWx0ID0gZm9ybWF0RGlzdGFuY2UyOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9mb3JtYXREaXN0YW5jZVN0cmljdC5qcwpmdW5jdGlvbiBmb3JtYXREaXN0YW5jZVN0cmljdChsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgZGVmYXVsdE9wdGlvbnMyID0gZ2V0RGVmYXVsdE9wdGlvbnMoKTsKICBjb25zdCBsb2NhbGUgPSBvcHRpb25zPy5sb2NhbGUgPz8gZGVmYXVsdE9wdGlvbnMyLmxvY2FsZSA/PyBlblVTOwogIGNvbnN0IGNvbXBhcmlzb24gPSBjb21wYXJlQXNjKGxhdGVyRGF0ZSwgZWFybGllckRhdGUpOwogIGlmIChpc05hTihjb21wYXJpc29uKSkgewogICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgdGltZSB2YWx1ZSIpOwogIH0KICBjb25zdCBsb2NhbGl6ZU9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLCB7CiAgICBhZGRTdWZmaXg6IG9wdGlvbnM/LmFkZFN1ZmZpeCwKICAgIGNvbXBhcmlzb24KICB9KTsKICBjb25zdCBbbGF0ZXJEYXRlXywgZWFybGllckRhdGVfXSA9IG5vcm1hbGl6ZURhdGVzKAogICAgb3B0aW9ucz8uaW4sCiAgICAuLi5jb21wYXJpc29uID4gMCA/IFtlYXJsaWVyRGF0ZSwgbGF0ZXJEYXRlXSA6IFtsYXRlckRhdGUsIGVhcmxpZXJEYXRlXQogICk7CiAgY29uc3Qgcm91bmRpbmdNZXRob2QgPSBnZXRSb3VuZGluZ01ldGhvZChvcHRpb25zPy5yb3VuZGluZ01ldGhvZCA/PyAicm91bmQiKTsKICBjb25zdCBtaWxsaXNlY29uZHMyID0gZWFybGllckRhdGVfLmdldFRpbWUoKSAtIGxhdGVyRGF0ZV8uZ2V0VGltZSgpOwogIGNvbnN0IG1pbnV0ZXMgPSBtaWxsaXNlY29uZHMyIC8gbWlsbGlzZWNvbmRzSW5NaW51dGU7CiAgY29uc3QgdGltZXpvbmVPZmZzZXQgPSBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKGVhcmxpZXJEYXRlXykgLSBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKGxhdGVyRGF0ZV8pOwogIGNvbnN0IGRzdE5vcm1hbGl6ZWRNaW51dGVzID0gKG1pbGxpc2Vjb25kczIgLSB0aW1lem9uZU9mZnNldCkgLyBtaWxsaXNlY29uZHNJbk1pbnV0ZTsKICBjb25zdCBkZWZhdWx0VW5pdCA9IG9wdGlvbnM/LnVuaXQ7CiAgbGV0IHVuaXQ7CiAgaWYgKCFkZWZhdWx0VW5pdCkgewogICAgaWYgKG1pbnV0ZXMgPCAxKSB7CiAgICAgIHVuaXQgPSAic2Vjb25kIjsKICAgIH0gZWxzZSBpZiAobWludXRlcyA8IDYwKSB7CiAgICAgIHVuaXQgPSAibWludXRlIjsKICAgIH0gZWxzZSBpZiAobWludXRlcyA8IG1pbnV0ZXNJbkRheSkgewogICAgICB1bml0ID0gImhvdXIiOwogICAgfSBlbHNlIGlmIChkc3ROb3JtYWxpemVkTWludXRlcyA8IG1pbnV0ZXNJbk1vbnRoKSB7CiAgICAgIHVuaXQgPSAiZGF5IjsKICAgIH0gZWxzZSBpZiAoZHN0Tm9ybWFsaXplZE1pbnV0ZXMgPCBtaW51dGVzSW5ZZWFyKSB7CiAgICAgIHVuaXQgPSAibW9udGgiOwogICAgfSBlbHNlIHsKICAgICAgdW5pdCA9ICJ5ZWFyIjsKICAgIH0KICB9IGVsc2UgewogICAgdW5pdCA9IGRlZmF1bHRVbml0OwogIH0KICBpZiAodW5pdCA9PT0gInNlY29uZCIpIHsKICAgIGNvbnN0IHNlY29uZHMgPSByb3VuZGluZ01ldGhvZChtaWxsaXNlY29uZHMyIC8gMWUzKTsKICAgIHJldHVybiBsb2NhbGUuZm9ybWF0RGlzdGFuY2UoInhTZWNvbmRzIiwgc2Vjb25kcywgbG9jYWxpemVPcHRpb25zKTsKICB9IGVsc2UgaWYgKHVuaXQgPT09ICJtaW51dGUiKSB7CiAgICBjb25zdCByb3VuZGVkTWludXRlcyA9IHJvdW5kaW5nTWV0aG9kKG1pbnV0ZXMpOwogICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZSgieE1pbnV0ZXMiLCByb3VuZGVkTWludXRlcywgbG9jYWxpemVPcHRpb25zKTsKICB9IGVsc2UgaWYgKHVuaXQgPT09ICJob3VyIikgewogICAgY29uc3QgaG91cnMgPSByb3VuZGluZ01ldGhvZChtaW51dGVzIC8gNjApOwogICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZSgieEhvdXJzIiwgaG91cnMsIGxvY2FsaXplT3B0aW9ucyk7CiAgfSBlbHNlIGlmICh1bml0ID09PSAiZGF5IikgewogICAgY29uc3QgZGF5czIgPSByb3VuZGluZ01ldGhvZChkc3ROb3JtYWxpemVkTWludXRlcyAvIG1pbnV0ZXNJbkRheSk7CiAgICByZXR1cm4gbG9jYWxlLmZvcm1hdERpc3RhbmNlKCJ4RGF5cyIsIGRheXMyLCBsb2NhbGl6ZU9wdGlvbnMpOwogIH0gZWxzZSBpZiAodW5pdCA9PT0gIm1vbnRoIikgewogICAgY29uc3QgbW9udGhzMiA9IHJvdW5kaW5nTWV0aG9kKGRzdE5vcm1hbGl6ZWRNaW51dGVzIC8gbWludXRlc0luTW9udGgpOwogICAgcmV0dXJuIG1vbnRoczIgPT09IDEyICYmIGRlZmF1bHRVbml0ICE9PSAibW9udGgiID8gbG9jYWxlLmZvcm1hdERpc3RhbmNlKCJ4WWVhcnMiLCAxLCBsb2NhbGl6ZU9wdGlvbnMpIDogbG9jYWxlLmZvcm1hdERpc3RhbmNlKCJ4TW9udGhzIiwgbW9udGhzMiwgbG9jYWxpemVPcHRpb25zKTsKICB9IGVsc2UgewogICAgY29uc3QgeWVhcnMgPSByb3VuZGluZ01ldGhvZChkc3ROb3JtYWxpemVkTWludXRlcyAvIG1pbnV0ZXNJblllYXIpOwogICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZSgieFllYXJzIiwgeWVhcnMsIGxvY2FsaXplT3B0aW9ucyk7CiAgfQp9Cl9fbmFtZShmb3JtYXREaXN0YW5jZVN0cmljdCwgImZvcm1hdERpc3RhbmNlU3RyaWN0Iik7CnZhciBmb3JtYXREaXN0YW5jZVN0cmljdF9kZWZhdWx0ID0gZm9ybWF0RGlzdGFuY2VTdHJpY3Q7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2Zvcm1hdERpc3RhbmNlVG9Ob3cuanMKZnVuY3Rpb24gZm9ybWF0RGlzdGFuY2VUb05vdyhkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIGZvcm1hdERpc3RhbmNlMihkYXRlLCBjb25zdHJ1Y3ROb3coZGF0ZSksIG9wdGlvbnMpOwp9Cl9fbmFtZShmb3JtYXREaXN0YW5jZVRvTm93LCAiZm9ybWF0RGlzdGFuY2VUb05vdyIpOwp2YXIgZm9ybWF0RGlzdGFuY2VUb05vd19kZWZhdWx0ID0gZm9ybWF0RGlzdGFuY2VUb05vdzsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZm9ybWF0RGlzdGFuY2VUb05vd1N0cmljdC5qcwpmdW5jdGlvbiBmb3JtYXREaXN0YW5jZVRvTm93U3RyaWN0KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gZm9ybWF0RGlzdGFuY2VTdHJpY3QoZGF0ZSwgY29uc3RydWN0Tm93KGRhdGUpLCBvcHRpb25zKTsKfQpfX25hbWUoZm9ybWF0RGlzdGFuY2VUb05vd1N0cmljdCwgImZvcm1hdERpc3RhbmNlVG9Ob3dTdHJpY3QiKTsKdmFyIGZvcm1hdERpc3RhbmNlVG9Ob3dTdHJpY3RfZGVmYXVsdCA9IGZvcm1hdERpc3RhbmNlVG9Ob3dTdHJpY3Q7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2Zvcm1hdER1cmF0aW9uLmpzCnZhciBkZWZhdWx0Rm9ybWF0ID0gWwogICJ5ZWFycyIsCiAgIm1vbnRocyIsCiAgIndlZWtzIiwKICAiZGF5cyIsCiAgImhvdXJzIiwKICAibWludXRlcyIsCiAgInNlY29uZHMiCl07CmZ1bmN0aW9uIGZvcm1hdER1cmF0aW9uKGR1cmF0aW9uLCBvcHRpb25zKSB7CiAgY29uc3QgZGVmYXVsdE9wdGlvbnMyID0gZ2V0RGVmYXVsdE9wdGlvbnMoKTsKICBjb25zdCBsb2NhbGUgPSBvcHRpb25zPy5sb2NhbGUgPz8gZGVmYXVsdE9wdGlvbnMyLmxvY2FsZSA/PyBlblVTOwogIGNvbnN0IGZvcm1hdDIgPSBvcHRpb25zPy5mb3JtYXQgPz8gZGVmYXVsdEZvcm1hdDsKICBjb25zdCB6ZXJvID0gb3B0aW9ucz8uemVybyA/PyBmYWxzZTsKICBjb25zdCBkZWxpbWl0ZXIgPSBvcHRpb25zPy5kZWxpbWl0ZXIgPz8gIiAiOwogIGlmICghbG9jYWxlLmZvcm1hdERpc3RhbmNlKSB7CiAgICByZXR1cm4gIiI7CiAgfQogIGNvbnN0IHJlc3VsdCA9IGZvcm1hdDIucmVkdWNlKChhY2MsIHVuaXQpID0+IHsKICAgIGNvbnN0IHRva2VuID0gYHgke3VuaXQucmVwbGFjZSgvKF4uKS8sIChtNSkgPT4gbTUudG9VcHBlckNhc2UoKSl9YDsKICAgIGNvbnN0IHZhbHVlMiA9IGR1cmF0aW9uW3VuaXRdOwogICAgaWYgKHZhbHVlMiAhPT0gdm9pZCAwICYmICh6ZXJvIHx8IGR1cmF0aW9uW3VuaXRdKSkgewogICAgICByZXR1cm4gYWNjLmNvbmNhdChsb2NhbGUuZm9ybWF0RGlzdGFuY2UodG9rZW4sIHZhbHVlMikpOwogICAgfQogICAgcmV0dXJuIGFjYzsKICB9LCBbXSkuam9pbihkZWxpbWl0ZXIpOwogIHJldHVybiByZXN1bHQ7Cn0KX19uYW1lKGZvcm1hdER1cmF0aW9uLCAiZm9ybWF0RHVyYXRpb24iKTsKdmFyIGZvcm1hdER1cmF0aW9uX2RlZmF1bHQgPSBmb3JtYXREdXJhdGlvbjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZm9ybWF0SVNPLmpzCmZ1bmN0aW9uIGZvcm1hdElTTyhkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgZGF0ZV8gPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGlmIChpc05hTigrZGF0ZV8pKSB7CiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0aW1lIHZhbHVlIik7CiAgfQogIGNvbnN0IGZvcm1hdDIgPSBvcHRpb25zPy5mb3JtYXQgPz8gImV4dGVuZGVkIjsKICBjb25zdCByZXByZXNlbnRhdGlvbiA9IG9wdGlvbnM/LnJlcHJlc2VudGF0aW9uID8/ICJjb21wbGV0ZSI7CiAgbGV0IHJlc3VsdCA9ICIiOwogIGxldCB0ek9mZnNldCA9ICIiOwogIGNvbnN0IGRhdGVEZWxpbWl0ZXIgPSBmb3JtYXQyID09PSAiZXh0ZW5kZWQiID8gIi0iIDogIiI7CiAgY29uc3QgdGltZURlbGltaXRlciA9IGZvcm1hdDIgPT09ICJleHRlbmRlZCIgPyAiOiIgOiAiIjsKICBpZiAocmVwcmVzZW50YXRpb24gIT09ICJ0aW1lIikgewogICAgY29uc3QgZGF5ID0gYWRkTGVhZGluZ1plcm9zKGRhdGVfLmdldERhdGUoKSwgMik7CiAgICBjb25zdCBtb250aCA9IGFkZExlYWRpbmdaZXJvcyhkYXRlXy5nZXRNb250aCgpICsgMSwgMik7CiAgICBjb25zdCB5ZWFyID0gYWRkTGVhZGluZ1plcm9zKGRhdGVfLmdldEZ1bGxZZWFyKCksIDQpOwogICAgcmVzdWx0ID0gYCR7eWVhcn0ke2RhdGVEZWxpbWl0ZXJ9JHttb250aH0ke2RhdGVEZWxpbWl0ZXJ9JHtkYXl9YDsKICB9CiAgaWYgKHJlcHJlc2VudGF0aW9uICE9PSAiZGF0ZSIpIHsKICAgIGNvbnN0IG9mZnNldCA9IGRhdGVfLmdldFRpbWV6b25lT2Zmc2V0KCk7CiAgICBpZiAob2Zmc2V0ICE9PSAwKSB7CiAgICAgIGNvbnN0IGFic29sdXRlT2Zmc2V0ID0gTWF0aC5hYnMob2Zmc2V0KTsKICAgICAgY29uc3QgaG91ck9mZnNldCA9IGFkZExlYWRpbmdaZXJvcyhNYXRoLnRydW5jKGFic29sdXRlT2Zmc2V0IC8gNjApLCAyKTsKICAgICAgY29uc3QgbWludXRlT2Zmc2V0ID0gYWRkTGVhZGluZ1plcm9zKGFic29sdXRlT2Zmc2V0ICUgNjAsIDIpOwogICAgICBjb25zdCBzaWduID0gb2Zmc2V0IDwgMCA/ICIrIiA6ICItIjsKICAgICAgdHpPZmZzZXQgPSBgJHtzaWdufSR7aG91ck9mZnNldH06JHttaW51dGVPZmZzZXR9YDsKICAgIH0gZWxzZSB7CiAgICAgIHR6T2Zmc2V0ID0gIloiOwogICAgfQogICAgY29uc3QgaG91ciA9IGFkZExlYWRpbmdaZXJvcyhkYXRlXy5nZXRIb3VycygpLCAyKTsKICAgIGNvbnN0IG1pbnV0ZSA9IGFkZExlYWRpbmdaZXJvcyhkYXRlXy5nZXRNaW51dGVzKCksIDIpOwogICAgY29uc3Qgc2Vjb25kID0gYWRkTGVhZGluZ1plcm9zKGRhdGVfLmdldFNlY29uZHMoKSwgMik7CiAgICBjb25zdCBzZXBhcmF0b3IgPSByZXN1bHQgPT09ICIiID8gIiIgOiAiVCI7CiAgICBjb25zdCB0aW1lID0gW2hvdXIsIG1pbnV0ZSwgc2Vjb25kXS5qb2luKHRpbWVEZWxpbWl0ZXIpOwogICAgcmVzdWx0ID0gYCR7cmVzdWx0fSR7c2VwYXJhdG9yfSR7dGltZX0ke3R6T2Zmc2V0fWA7CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KX19uYW1lKGZvcm1hdElTTywgImZvcm1hdElTTyIpOwp2YXIgZm9ybWF0SVNPX2RlZmF1bHQgPSBmb3JtYXRJU087CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2Zvcm1hdElTTzkwNzUuanMKZnVuY3Rpb24gZm9ybWF0SVNPOTA3NShkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgZGF0ZV8gPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGlmICghaXNWYWxpZChkYXRlXykpIHsKICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCJJbnZhbGlkIHRpbWUgdmFsdWUiKTsKICB9CiAgY29uc3QgZm9ybWF0MiA9IG9wdGlvbnM/LmZvcm1hdCA/PyAiZXh0ZW5kZWQiOwogIGNvbnN0IHJlcHJlc2VudGF0aW9uID0gb3B0aW9ucz8ucmVwcmVzZW50YXRpb24gPz8gImNvbXBsZXRlIjsKICBsZXQgcmVzdWx0ID0gIiI7CiAgY29uc3QgZGF0ZURlbGltaXRlciA9IGZvcm1hdDIgPT09ICJleHRlbmRlZCIgPyAiLSIgOiAiIjsKICBjb25zdCB0aW1lRGVsaW1pdGVyID0gZm9ybWF0MiA9PT0gImV4dGVuZGVkIiA/ICI6IiA6ICIiOwogIGlmIChyZXByZXNlbnRhdGlvbiAhPT0gInRpbWUiKSB7CiAgICBjb25zdCBkYXkgPSBhZGRMZWFkaW5nWmVyb3MoZGF0ZV8uZ2V0RGF0ZSgpLCAyKTsKICAgIGNvbnN0IG1vbnRoID0gYWRkTGVhZGluZ1plcm9zKGRhdGVfLmdldE1vbnRoKCkgKyAxLCAyKTsKICAgIGNvbnN0IHllYXIgPSBhZGRMZWFkaW5nWmVyb3MoZGF0ZV8uZ2V0RnVsbFllYXIoKSwgNCk7CiAgICByZXN1bHQgPSBgJHt5ZWFyfSR7ZGF0ZURlbGltaXRlcn0ke21vbnRofSR7ZGF0ZURlbGltaXRlcn0ke2RheX1gOwogIH0KICBpZiAocmVwcmVzZW50YXRpb24gIT09ICJkYXRlIikgewogICAgY29uc3QgaG91ciA9IGFkZExlYWRpbmdaZXJvcyhkYXRlXy5nZXRIb3VycygpLCAyKTsKICAgIGNvbnN0IG1pbnV0ZSA9IGFkZExlYWRpbmdaZXJvcyhkYXRlXy5nZXRNaW51dGVzKCksIDIpOwogICAgY29uc3Qgc2Vjb25kID0gYWRkTGVhZGluZ1plcm9zKGRhdGVfLmdldFNlY29uZHMoKSwgMik7CiAgICBjb25zdCBzZXBhcmF0b3IgPSByZXN1bHQgPT09ICIiID8gIiIgOiAiICI7CiAgICByZXN1bHQgPSBgJHtyZXN1bHR9JHtzZXBhcmF0b3J9JHtob3VyfSR7dGltZURlbGltaXRlcn0ke21pbnV0ZX0ke3RpbWVEZWxpbWl0ZXJ9JHtzZWNvbmR9YDsKICB9CiAgcmV0dXJuIHJlc3VsdDsKfQpfX25hbWUoZm9ybWF0SVNPOTA3NSwgImZvcm1hdElTTzkwNzUiKTsKdmFyIGZvcm1hdElTTzkwNzVfZGVmYXVsdCA9IGZvcm1hdElTTzkwNzU7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2Zvcm1hdElTT0R1cmF0aW9uLmpzCmZ1bmN0aW9uIGZvcm1hdElTT0R1cmF0aW9uKGR1cmF0aW9uKSB7CiAgY29uc3QgewogICAgeWVhcnMgPSAwLAogICAgbW9udGhzOiBtb250aHMyID0gMCwKICAgIGRheXM6IGRheXMyID0gMCwKICAgIGhvdXJzID0gMCwKICAgIG1pbnV0ZXMgPSAwLAogICAgc2Vjb25kcyA9IDAKICB9ID0gZHVyYXRpb247CiAgcmV0dXJuIGBQJHt5ZWFyc31ZJHttb250aHMyfU0ke2RheXMyfURUJHtob3Vyc31IJHttaW51dGVzfU0ke3NlY29uZHN9U2A7Cn0KX19uYW1lKGZvcm1hdElTT0R1cmF0aW9uLCAiZm9ybWF0SVNPRHVyYXRpb24iKTsKdmFyIGZvcm1hdElTT0R1cmF0aW9uX2RlZmF1bHQgPSBmb3JtYXRJU09EdXJhdGlvbjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZm9ybWF0UkZDMzMzOS5qcwpmdW5jdGlvbiBmb3JtYXRSRkMzMzM5KGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBkYXRlXyA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgaWYgKCFpc1ZhbGlkKGRhdGVfKSkgewogICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgdGltZSB2YWx1ZSIpOwogIH0KICBjb25zdCBmcmFjdGlvbkRpZ2l0cyA9IG9wdGlvbnM/LmZyYWN0aW9uRGlnaXRzID8/IDA7CiAgY29uc3QgZGF5ID0gYWRkTGVhZGluZ1plcm9zKGRhdGVfLmdldERhdGUoKSwgMik7CiAgY29uc3QgbW9udGggPSBhZGRMZWFkaW5nWmVyb3MoZGF0ZV8uZ2V0TW9udGgoKSArIDEsIDIpOwogIGNvbnN0IHllYXIgPSBkYXRlXy5nZXRGdWxsWWVhcigpOwogIGNvbnN0IGhvdXIgPSBhZGRMZWFkaW5nWmVyb3MoZGF0ZV8uZ2V0SG91cnMoKSwgMik7CiAgY29uc3QgbWludXRlID0gYWRkTGVhZGluZ1plcm9zKGRhdGVfLmdldE1pbnV0ZXMoKSwgMik7CiAgY29uc3Qgc2Vjb25kID0gYWRkTGVhZGluZ1plcm9zKGRhdGVfLmdldFNlY29uZHMoKSwgMik7CiAgbGV0IGZyYWN0aW9uYWxTZWNvbmQgPSAiIjsKICBpZiAoZnJhY3Rpb25EaWdpdHMgPiAwKSB7CiAgICBjb25zdCBtaWxsaXNlY29uZHMyID0gZGF0ZV8uZ2V0TWlsbGlzZWNvbmRzKCk7CiAgICBjb25zdCBmcmFjdGlvbmFsU2Vjb25kcyA9IE1hdGgudHJ1bmMoCiAgICAgIG1pbGxpc2Vjb25kczIgKiBNYXRoLnBvdygxMCwgZnJhY3Rpb25EaWdpdHMgLSAzKQogICAgKTsKICAgIGZyYWN0aW9uYWxTZWNvbmQgPSAiLiIgKyBhZGRMZWFkaW5nWmVyb3MoZnJhY3Rpb25hbFNlY29uZHMsIGZyYWN0aW9uRGlnaXRzKTsKICB9CiAgbGV0IG9mZnNldCA9ICIiOwogIGNvbnN0IHR6T2Zmc2V0ID0gZGF0ZV8uZ2V0VGltZXpvbmVPZmZzZXQoKTsKICBpZiAodHpPZmZzZXQgIT09IDApIHsKICAgIGNvbnN0IGFic29sdXRlT2Zmc2V0ID0gTWF0aC5hYnModHpPZmZzZXQpOwogICAgY29uc3QgaG91ck9mZnNldCA9IGFkZExlYWRpbmdaZXJvcyhNYXRoLnRydW5jKGFic29sdXRlT2Zmc2V0IC8gNjApLCAyKTsKICAgIGNvbnN0IG1pbnV0ZU9mZnNldCA9IGFkZExlYWRpbmdaZXJvcyhhYnNvbHV0ZU9mZnNldCAlIDYwLCAyKTsKICAgIGNvbnN0IHNpZ24gPSB0ek9mZnNldCA8IDAgPyAiKyIgOiAiLSI7CiAgICBvZmZzZXQgPSBgJHtzaWdufSR7aG91ck9mZnNldH06JHttaW51dGVPZmZzZXR9YDsKICB9IGVsc2UgewogICAgb2Zmc2V0ID0gIloiOwogIH0KICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9VCR7aG91cn06JHttaW51dGV9OiR7c2Vjb25kfSR7ZnJhY3Rpb25hbFNlY29uZH0ke29mZnNldH1gOwp9Cl9fbmFtZShmb3JtYXRSRkMzMzM5LCAiZm9ybWF0UkZDMzMzOSIpOwp2YXIgZm9ybWF0UkZDMzMzOV9kZWZhdWx0ID0gZm9ybWF0UkZDMzMzOTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZm9ybWF0UkZDNzIzMS5qcwp2YXIgZGF5cyA9IFsiU3VuIiwgIk1vbiIsICJUdWUiLCAiV2VkIiwgIlRodSIsICJGcmkiLCAiU2F0Il07CnZhciBtb250aHMgPSBbCiAgIkphbiIsCiAgIkZlYiIsCiAgIk1hciIsCiAgIkFwciIsCiAgIk1heSIsCiAgIkp1biIsCiAgIkp1bCIsCiAgIkF1ZyIsCiAgIlNlcCIsCiAgIk9jdCIsCiAgIk5vdiIsCiAgIkRlYyIKXTsKZnVuY3Rpb24gZm9ybWF0UkZDNzIzMShkYXRlKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSk7CiAgaWYgKCFpc1ZhbGlkKF9kYXRlKSkgewogICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgdGltZSB2YWx1ZSIpOwogIH0KICBjb25zdCBkYXlOYW1lID0gZGF5c1tfZGF0ZS5nZXRVVENEYXkoKV07CiAgY29uc3QgZGF5T2ZNb250aCA9IGFkZExlYWRpbmdaZXJvcyhfZGF0ZS5nZXRVVENEYXRlKCksIDIpOwogIGNvbnN0IG1vbnRoTmFtZSA9IG1vbnRoc1tfZGF0ZS5nZXRVVENNb250aCgpXTsKICBjb25zdCB5ZWFyID0gX2RhdGUuZ2V0VVRDRnVsbFllYXIoKTsKICBjb25zdCBob3VyID0gYWRkTGVhZGluZ1plcm9zKF9kYXRlLmdldFVUQ0hvdXJzKCksIDIpOwogIGNvbnN0IG1pbnV0ZSA9IGFkZExlYWRpbmdaZXJvcyhfZGF0ZS5nZXRVVENNaW51dGVzKCksIDIpOwogIGNvbnN0IHNlY29uZCA9IGFkZExlYWRpbmdaZXJvcyhfZGF0ZS5nZXRVVENTZWNvbmRzKCksIDIpOwogIHJldHVybiBgJHtkYXlOYW1lfSwgJHtkYXlPZk1vbnRofSAke21vbnRoTmFtZX0gJHt5ZWFyfSAke2hvdXJ9OiR7bWludXRlfToke3NlY29uZH0gR01UYDsKfQpfX25hbWUoZm9ybWF0UkZDNzIzMSwgImZvcm1hdFJGQzcyMzEiKTsKdmFyIGZvcm1hdFJGQzcyMzFfZGVmYXVsdCA9IGZvcm1hdFJGQzcyMzE7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2Zvcm1hdFJlbGF0aXZlLmpzCmZ1bmN0aW9uIGZvcm1hdFJlbGF0aXZlMihkYXRlLCBiYXNlRGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IFtkYXRlXywgYmFzZURhdGVfXSA9IG5vcm1hbGl6ZURhdGVzKG9wdGlvbnM/LmluLCBkYXRlLCBiYXNlRGF0ZSk7CiAgY29uc3QgZGVmYXVsdE9wdGlvbnMyID0gZ2V0RGVmYXVsdE9wdGlvbnMoKTsKICBjb25zdCBsb2NhbGUgPSBvcHRpb25zPy5sb2NhbGUgPz8gZGVmYXVsdE9wdGlvbnMyLmxvY2FsZSA/PyBlblVTOwogIGNvbnN0IHdlZWtTdGFydHNPbiA9IG9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyBkZWZhdWx0T3B0aW9uczIud2Vla1N0YXJ0c09uID8/IGRlZmF1bHRPcHRpb25zMi5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyAwOwogIGNvbnN0IGRpZmYgPSBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoZGF0ZV8sIGJhc2VEYXRlXyk7CiAgaWYgKGlzTmFOKGRpZmYpKSB7CiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0aW1lIHZhbHVlIik7CiAgfQogIGxldCB0b2tlbjsKICBpZiAoZGlmZiA8IC02KSB7CiAgICB0b2tlbiA9ICJvdGhlciI7CiAgfSBlbHNlIGlmIChkaWZmIDwgLTEpIHsKICAgIHRva2VuID0gImxhc3RXZWVrIjsKICB9IGVsc2UgaWYgKGRpZmYgPCAwKSB7CiAgICB0b2tlbiA9ICJ5ZXN0ZXJkYXkiOwogIH0gZWxzZSBpZiAoZGlmZiA8IDEpIHsKICAgIHRva2VuID0gInRvZGF5IjsKICB9IGVsc2UgaWYgKGRpZmYgPCAyKSB7CiAgICB0b2tlbiA9ICJ0b21vcnJvdyI7CiAgfSBlbHNlIGlmIChkaWZmIDwgNykgewogICAgdG9rZW4gPSAibmV4dFdlZWsiOwogIH0gZWxzZSB7CiAgICB0b2tlbiA9ICJvdGhlciI7CiAgfQogIGNvbnN0IGZvcm1hdFN0ciA9IGxvY2FsZS5mb3JtYXRSZWxhdGl2ZSh0b2tlbiwgZGF0ZV8sIGJhc2VEYXRlXywgewogICAgbG9jYWxlLAogICAgd2Vla1N0YXJ0c09uCiAgfSk7CiAgcmV0dXJuIGZvcm1hdChkYXRlXywgZm9ybWF0U3RyLCB7IGxvY2FsZSwgd2Vla1N0YXJ0c09uIH0pOwp9Cl9fbmFtZShmb3JtYXRSZWxhdGl2ZTIsICJmb3JtYXRSZWxhdGl2ZSIpOwp2YXIgZm9ybWF0UmVsYXRpdmVfZGVmYXVsdCA9IGZvcm1hdFJlbGF0aXZlMjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZnJvbVVuaXhUaW1lLmpzCmZ1bmN0aW9uIGZyb21Vbml4VGltZSh1bml4VGltZSwgb3B0aW9ucykgewogIHJldHVybiB0b0RhdGUodW5peFRpbWUgKiAxZTMsIG9wdGlvbnM/LmluKTsKfQpfX25hbWUoZnJvbVVuaXhUaW1lLCAiZnJvbVVuaXhUaW1lIik7CnZhciBmcm9tVW5peFRpbWVfZGVmYXVsdCA9IGZyb21Vbml4VGltZTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0RGF0ZS5qcwpmdW5jdGlvbiBnZXREYXRlKGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKS5nZXREYXRlKCk7Cn0KX19uYW1lKGdldERhdGUsICJnZXREYXRlIik7CnZhciBnZXREYXRlX2RlZmF1bHQgPSBnZXREYXRlOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXREYXkuanMKZnVuY3Rpb24gZ2V0RGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKS5nZXREYXkoKTsKfQpfX25hbWUoZ2V0RGF5LCAiZ2V0RGF5Iik7CnZhciBnZXREYXlfZGVmYXVsdCA9IGdldERheTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0RGF5c0luTW9udGguanMKZnVuY3Rpb24gZ2V0RGF5c0luTW9udGgoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCB5ZWFyID0gX2RhdGUuZ2V0RnVsbFllYXIoKTsKICBjb25zdCBtb250aEluZGV4ID0gX2RhdGUuZ2V0TW9udGgoKTsKICBjb25zdCBsYXN0RGF5T2ZNb250aDIgPSBjb25zdHJ1Y3RGcm9tKF9kYXRlLCAwKTsKICBsYXN0RGF5T2ZNb250aDIuc2V0RnVsbFllYXIoeWVhciwgbW9udGhJbmRleCArIDEsIDApOwogIGxhc3REYXlPZk1vbnRoMi5zZXRIb3VycygwLCAwLCAwLCAwKTsKICByZXR1cm4gbGFzdERheU9mTW9udGgyLmdldERhdGUoKTsKfQpfX25hbWUoZ2V0RGF5c0luTW9udGgsICJnZXREYXlzSW5Nb250aCIpOwp2YXIgZ2V0RGF5c0luTW9udGhfZGVmYXVsdCA9IGdldERheXNJbk1vbnRoOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc0xlYXBZZWFyLmpzCmZ1bmN0aW9uIGlzTGVhcFllYXIoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCB5ZWFyID0gX2RhdGUuZ2V0RnVsbFllYXIoKTsKICByZXR1cm4geWVhciAlIDQwMCA9PT0gMCB8fCB5ZWFyICUgNCA9PT0gMCAmJiB5ZWFyICUgMTAwICE9PSAwOwp9Cl9fbmFtZShpc0xlYXBZZWFyLCAiaXNMZWFwWWVhciIpOwp2YXIgaXNMZWFwWWVhcl9kZWZhdWx0ID0gaXNMZWFwWWVhcjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0RGF5c0luWWVhci5qcwpmdW5jdGlvbiBnZXREYXlzSW5ZZWFyKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgaWYgKE51bWJlci5pc05hTigrX2RhdGUpKSByZXR1cm4gTmFOOwogIHJldHVybiBpc0xlYXBZZWFyKF9kYXRlKSA/IDM2NiA6IDM2NTsKfQpfX25hbWUoZ2V0RGF5c0luWWVhciwgImdldERheXNJblllYXIiKTsKdmFyIGdldERheXNJblllYXJfZGVmYXVsdCA9IGdldERheXNJblllYXI7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldERlY2FkZS5qcwpmdW5jdGlvbiBnZXREZWNhZGUoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCB5ZWFyID0gX2RhdGUuZ2V0RnVsbFllYXIoKTsKICBjb25zdCBkZWNhZGUgPSBNYXRoLmZsb29yKHllYXIgLyAxMCkgKiAxMDsKICByZXR1cm4gZGVjYWRlOwp9Cl9fbmFtZShnZXREZWNhZGUsICJnZXREZWNhZGUiKTsKdmFyIGdldERlY2FkZV9kZWZhdWx0ID0gZ2V0RGVjYWRlOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXREZWZhdWx0T3B0aW9ucy5qcwpmdW5jdGlvbiBnZXREZWZhdWx0T3B0aW9uczIoKSB7CiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGdldERlZmF1bHRPcHRpb25zKCkpOwp9Cl9fbmFtZShnZXREZWZhdWx0T3B0aW9uczIsICJnZXREZWZhdWx0T3B0aW9ucyIpOwp2YXIgZ2V0RGVmYXVsdE9wdGlvbnNfZGVmYXVsdCA9IGdldERlZmF1bHRPcHRpb25zMjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0SG91cnMuanMKZnVuY3Rpb24gZ2V0SG91cnMoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pLmdldEhvdXJzKCk7Cn0KX19uYW1lKGdldEhvdXJzLCAiZ2V0SG91cnMiKTsKdmFyIGdldEhvdXJzX2RlZmF1bHQgPSBnZXRIb3VyczsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0SVNPRGF5LmpzCmZ1bmN0aW9uIGdldElTT0RheShkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgZGF5ID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKS5nZXREYXkoKTsKICByZXR1cm4gZGF5ID09PSAwID8gNyA6IGRheTsKfQpfX25hbWUoZ2V0SVNPRGF5LCAiZ2V0SVNPRGF5Iik7CnZhciBnZXRJU09EYXlfZGVmYXVsdCA9IGdldElTT0RheTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0SVNPV2Vla3NJblllYXIuanMKZnVuY3Rpb24gZ2V0SVNPV2Vla3NJblllYXIoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IHRoaXNZZWFyID0gc3RhcnRPZklTT1dlZWtZZWFyKGRhdGUsIG9wdGlvbnMpOwogIGNvbnN0IG5leHRZZWFyID0gc3RhcnRPZklTT1dlZWtZZWFyKGFkZFdlZWtzKHRoaXNZZWFyLCA2MCkpOwogIGNvbnN0IGRpZmYgPSArbmV4dFllYXIgLSArdGhpc1llYXI7CiAgcmV0dXJuIE1hdGgucm91bmQoZGlmZiAvIG1pbGxpc2Vjb25kc0luV2Vlayk7Cn0KX19uYW1lKGdldElTT1dlZWtzSW5ZZWFyLCAiZ2V0SVNPV2Vla3NJblllYXIiKTsKdmFyIGdldElTT1dlZWtzSW5ZZWFyX2RlZmF1bHQgPSBnZXRJU09XZWVrc0luWWVhcjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0TWlsbGlzZWNvbmRzLmpzCmZ1bmN0aW9uIGdldE1pbGxpc2Vjb25kcyhkYXRlKSB7CiAgcmV0dXJuIHRvRGF0ZShkYXRlKS5nZXRNaWxsaXNlY29uZHMoKTsKfQpfX25hbWUoZ2V0TWlsbGlzZWNvbmRzLCAiZ2V0TWlsbGlzZWNvbmRzIik7CnZhciBnZXRNaWxsaXNlY29uZHNfZGVmYXVsdCA9IGdldE1pbGxpc2Vjb25kczsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0TWludXRlcy5qcwpmdW5jdGlvbiBnZXRNaW51dGVzKGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKS5nZXRNaW51dGVzKCk7Cn0KX19uYW1lKGdldE1pbnV0ZXMsICJnZXRNaW51dGVzIik7CnZhciBnZXRNaW51dGVzX2RlZmF1bHQgPSBnZXRNaW51dGVzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRNb250aC5qcwpmdW5jdGlvbiBnZXRNb250aChkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbikuZ2V0TW9udGgoKTsKfQpfX25hbWUoZ2V0TW9udGgsICJnZXRNb250aCIpOwp2YXIgZ2V0TW9udGhfZGVmYXVsdCA9IGdldE1vbnRoOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRPdmVybGFwcGluZ0RheXNJbkludGVydmFscy5qcwpmdW5jdGlvbiBnZXRPdmVybGFwcGluZ0RheXNJbkludGVydmFscyhpbnRlcnZhbExlZnQsIGludGVydmFsUmlnaHQpIHsKICBjb25zdCBbbGVmdFN0YXJ0LCBsZWZ0RW5kXSA9IFsKICAgICt0b0RhdGUoaW50ZXJ2YWxMZWZ0LnN0YXJ0KSwKICAgICt0b0RhdGUoaW50ZXJ2YWxMZWZ0LmVuZCkKICBdLnNvcnQoKGE0LCBiNCkgPT4gYTQgLSBiNCk7CiAgY29uc3QgW3JpZ2h0U3RhcnQsIHJpZ2h0RW5kXSA9IFsKICAgICt0b0RhdGUoaW50ZXJ2YWxSaWdodC5zdGFydCksCiAgICArdG9EYXRlKGludGVydmFsUmlnaHQuZW5kKQogIF0uc29ydCgoYTQsIGI0KSA9PiBhNCAtIGI0KTsKICBjb25zdCBpc092ZXJsYXBwaW5nID0gbGVmdFN0YXJ0IDwgcmlnaHRFbmQgJiYgcmlnaHRTdGFydCA8IGxlZnRFbmQ7CiAgaWYgKCFpc092ZXJsYXBwaW5nKSByZXR1cm4gMDsKICBjb25zdCBvdmVybGFwTGVmdCA9IHJpZ2h0U3RhcnQgPCBsZWZ0U3RhcnQgPyBsZWZ0U3RhcnQgOiByaWdodFN0YXJ0OwogIGNvbnN0IGxlZnQgPSBvdmVybGFwTGVmdCAtIGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMob3ZlcmxhcExlZnQpOwogIGNvbnN0IG92ZXJsYXBSaWdodCA9IHJpZ2h0RW5kID4gbGVmdEVuZCA/IGxlZnRFbmQgOiByaWdodEVuZDsKICBjb25zdCByaWdodCA9IG92ZXJsYXBSaWdodCAtIGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMob3ZlcmxhcFJpZ2h0KTsKICByZXR1cm4gTWF0aC5jZWlsKChyaWdodCAtIGxlZnQpIC8gbWlsbGlzZWNvbmRzSW5EYXkpOwp9Cl9fbmFtZShnZXRPdmVybGFwcGluZ0RheXNJbkludGVydmFscywgImdldE92ZXJsYXBwaW5nRGF5c0luSW50ZXJ2YWxzIik7CnZhciBnZXRPdmVybGFwcGluZ0RheXNJbkludGVydmFsc19kZWZhdWx0ID0gZ2V0T3ZlcmxhcHBpbmdEYXlzSW5JbnRlcnZhbHM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldFNlY29uZHMuanMKZnVuY3Rpb24gZ2V0U2Vjb25kcyhkYXRlKSB7CiAgcmV0dXJuIHRvRGF0ZShkYXRlKS5nZXRTZWNvbmRzKCk7Cn0KX19uYW1lKGdldFNlY29uZHMsICJnZXRTZWNvbmRzIik7CnZhciBnZXRTZWNvbmRzX2RlZmF1bHQgPSBnZXRTZWNvbmRzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRUaW1lLmpzCmZ1bmN0aW9uIGdldFRpbWUoZGF0ZSkgewogIHJldHVybiArdG9EYXRlKGRhdGUpOwp9Cl9fbmFtZShnZXRUaW1lLCAiZ2V0VGltZSIpOwp2YXIgZ2V0VGltZV9kZWZhdWx0ID0gZ2V0VGltZTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0VW5peFRpbWUuanMKZnVuY3Rpb24gZ2V0VW5peFRpbWUoZGF0ZSkgewogIHJldHVybiBNYXRoLnRydW5jKCt0b0RhdGUoZGF0ZSkgLyAxZTMpOwp9Cl9fbmFtZShnZXRVbml4VGltZSwgImdldFVuaXhUaW1lIik7CnZhciBnZXRVbml4VGltZV9kZWZhdWx0ID0gZ2V0VW5peFRpbWU7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldFdlZWtPZk1vbnRoLmpzCmZ1bmN0aW9uIGdldFdlZWtPZk1vbnRoKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBkZWZhdWx0T3B0aW9uczIgPSBnZXREZWZhdWx0T3B0aW9ucygpOwogIGNvbnN0IHdlZWtTdGFydHNPbiA9IG9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyBkZWZhdWx0T3B0aW9uczIud2Vla1N0YXJ0c09uID8/IGRlZmF1bHRPcHRpb25zMi5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyAwOwogIGNvbnN0IGN1cnJlbnREYXlPZk1vbnRoID0gZ2V0RGF0ZSh0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pKTsKICBpZiAoaXNOYU4oY3VycmVudERheU9mTW9udGgpKSByZXR1cm4gTmFOOwogIGNvbnN0IHN0YXJ0V2Vla0RheSA9IGdldERheShzdGFydE9mTW9udGgoZGF0ZSwgb3B0aW9ucykpOwogIGxldCBsYXN0RGF5T2ZGaXJzdFdlZWsgPSB3ZWVrU3RhcnRzT24gLSBzdGFydFdlZWtEYXk7CiAgaWYgKGxhc3REYXlPZkZpcnN0V2VlayA8PSAwKSBsYXN0RGF5T2ZGaXJzdFdlZWsgKz0gNzsKICBjb25zdCByZW1haW5pbmdEYXlzQWZ0ZXJGaXJzdFdlZWsgPSBjdXJyZW50RGF5T2ZNb250aCAtIGxhc3REYXlPZkZpcnN0V2VlazsKICByZXR1cm4gTWF0aC5jZWlsKHJlbWFpbmluZ0RheXNBZnRlckZpcnN0V2VlayAvIDcpICsgMTsKfQpfX25hbWUoZ2V0V2Vla09mTW9udGgsICJnZXRXZWVrT2ZNb250aCIpOwp2YXIgZ2V0V2Vla09mTW9udGhfZGVmYXVsdCA9IGdldFdlZWtPZk1vbnRoOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sYXN0RGF5T2ZNb250aC5qcwpmdW5jdGlvbiBsYXN0RGF5T2ZNb250aChkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGNvbnN0IG1vbnRoID0gX2RhdGUuZ2V0TW9udGgoKTsKICBfZGF0ZS5zZXRGdWxsWWVhcihfZGF0ZS5nZXRGdWxsWWVhcigpLCBtb250aCArIDEsIDApOwogIF9kYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogIHJldHVybiB0b0RhdGUoX2RhdGUsIG9wdGlvbnM/LmluKTsKfQpfX25hbWUobGFzdERheU9mTW9udGgsICJsYXN0RGF5T2ZNb250aCIpOwp2YXIgbGFzdERheU9mTW9udGhfZGVmYXVsdCA9IGxhc3REYXlPZk1vbnRoOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRXZWVrc0luTW9udGguanMKZnVuY3Rpb24gZ2V0V2Vla3NJbk1vbnRoKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBjb250ZXh0RGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgcmV0dXJuIGRpZmZlcmVuY2VJbkNhbGVuZGFyV2Vla3MoCiAgICBsYXN0RGF5T2ZNb250aChjb250ZXh0RGF0ZSwgb3B0aW9ucyksCiAgICBzdGFydE9mTW9udGgoY29udGV4dERhdGUsIG9wdGlvbnMpLAogICAgb3B0aW9ucwogICkgKyAxOwp9Cl9fbmFtZShnZXRXZWVrc0luTW9udGgsICJnZXRXZWVrc0luTW9udGgiKTsKdmFyIGdldFdlZWtzSW5Nb250aF9kZWZhdWx0ID0gZ2V0V2Vla3NJbk1vbnRoOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRZZWFyLmpzCmZ1bmN0aW9uIGdldFllYXIoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pLmdldEZ1bGxZZWFyKCk7Cn0KX19uYW1lKGdldFllYXIsICJnZXRZZWFyIik7CnZhciBnZXRZZWFyX2RlZmF1bHQgPSBnZXRZZWFyOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9ob3Vyc1RvTWlsbGlzZWNvbmRzLmpzCmZ1bmN0aW9uIGhvdXJzVG9NaWxsaXNlY29uZHMoaG91cnMpIHsKICByZXR1cm4gTWF0aC50cnVuYyhob3VycyAqIG1pbGxpc2Vjb25kc0luSG91cik7Cn0KX19uYW1lKGhvdXJzVG9NaWxsaXNlY29uZHMsICJob3Vyc1RvTWlsbGlzZWNvbmRzIik7CnZhciBob3Vyc1RvTWlsbGlzZWNvbmRzX2RlZmF1bHQgPSBob3Vyc1RvTWlsbGlzZWNvbmRzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9ob3Vyc1RvTWludXRlcy5qcwpmdW5jdGlvbiBob3Vyc1RvTWludXRlcyhob3VycykgewogIHJldHVybiBNYXRoLnRydW5jKGhvdXJzICogbWludXRlc0luSG91cik7Cn0KX19uYW1lKGhvdXJzVG9NaW51dGVzLCAiaG91cnNUb01pbnV0ZXMiKTsKdmFyIGhvdXJzVG9NaW51dGVzX2RlZmF1bHQgPSBob3Vyc1RvTWludXRlczsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaG91cnNUb1NlY29uZHMuanMKZnVuY3Rpb24gaG91cnNUb1NlY29uZHMoaG91cnMpIHsKICByZXR1cm4gTWF0aC50cnVuYyhob3VycyAqIHNlY29uZHNJbkhvdXIpOwp9Cl9fbmFtZShob3Vyc1RvU2Vjb25kcywgImhvdXJzVG9TZWNvbmRzIik7CnZhciBob3Vyc1RvU2Vjb25kc19kZWZhdWx0ID0gaG91cnNUb1NlY29uZHM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2ludGVydmFsLmpzCmZ1bmN0aW9uIGludGVydmFsMihzdGFydCwgZW5kLCBvcHRpb25zKSB7CiAgY29uc3QgW19zdGFydCwgX2VuZF0gPSBub3JtYWxpemVEYXRlcyhvcHRpb25zPy5pbiwgc3RhcnQsIGVuZCk7CiAgaWYgKGlzTmFOKCtfc3RhcnQpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJTdGFydCBkYXRlIGlzIGludmFsaWQiKTsKICBpZiAoaXNOYU4oK19lbmQpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJFbmQgZGF0ZSBpcyBpbnZhbGlkIik7CiAgaWYgKG9wdGlvbnM/LmFzc2VydFBvc2l0aXZlICYmICtfc3RhcnQgPiArX2VuZCkKICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkVuZCBkYXRlIG11c3QgYmUgYWZ0ZXIgc3RhcnQgZGF0ZSIpOwogIHJldHVybiB7IHN0YXJ0OiBfc3RhcnQsIGVuZDogX2VuZCB9Owp9Cl9fbmFtZShpbnRlcnZhbDIsICJpbnRlcnZhbCIpOwp2YXIgaW50ZXJ2YWxfZGVmYXVsdCA9IGludGVydmFsMjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaW50ZXJ2YWxUb0R1cmF0aW9uLmpzCmZ1bmN0aW9uIGludGVydmFsVG9EdXJhdGlvbihpbnRlcnZhbDMsIG9wdGlvbnMpIHsKICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IG5vcm1hbGl6ZUludGVydmFsKG9wdGlvbnM/LmluLCBpbnRlcnZhbDMpOwogIGNvbnN0IGR1cmF0aW9uID0ge307CiAgY29uc3QgeWVhcnMgPSBkaWZmZXJlbmNlSW5ZZWFycyhlbmQsIHN0YXJ0KTsKICBpZiAoeWVhcnMpIGR1cmF0aW9uLnllYXJzID0geWVhcnM7CiAgY29uc3QgcmVtYWluaW5nTW9udGhzID0gYWRkKHN0YXJ0LCB7IHllYXJzOiBkdXJhdGlvbi55ZWFycyB9KTsKICBjb25zdCBtb250aHMyID0gZGlmZmVyZW5jZUluTW9udGhzKGVuZCwgcmVtYWluaW5nTW9udGhzKTsKICBpZiAobW9udGhzMikgZHVyYXRpb24ubW9udGhzID0gbW9udGhzMjsKICBjb25zdCByZW1haW5pbmdEYXlzID0gYWRkKHJlbWFpbmluZ01vbnRocywgeyBtb250aHM6IGR1cmF0aW9uLm1vbnRocyB9KTsKICBjb25zdCBkYXlzMiA9IGRpZmZlcmVuY2VJbkRheXMoZW5kLCByZW1haW5pbmdEYXlzKTsKICBpZiAoZGF5czIpIGR1cmF0aW9uLmRheXMgPSBkYXlzMjsKICBjb25zdCByZW1haW5pbmdIb3VycyA9IGFkZChyZW1haW5pbmdEYXlzLCB7IGRheXM6IGR1cmF0aW9uLmRheXMgfSk7CiAgY29uc3QgaG91cnMgPSBkaWZmZXJlbmNlSW5Ib3VycyhlbmQsIHJlbWFpbmluZ0hvdXJzKTsKICBpZiAoaG91cnMpIGR1cmF0aW9uLmhvdXJzID0gaG91cnM7CiAgY29uc3QgcmVtYWluaW5nTWludXRlcyA9IGFkZChyZW1haW5pbmdIb3VycywgeyBob3VyczogZHVyYXRpb24uaG91cnMgfSk7CiAgY29uc3QgbWludXRlcyA9IGRpZmZlcmVuY2VJbk1pbnV0ZXMoZW5kLCByZW1haW5pbmdNaW51dGVzKTsKICBpZiAobWludXRlcykgZHVyYXRpb24ubWludXRlcyA9IG1pbnV0ZXM7CiAgY29uc3QgcmVtYWluaW5nU2Vjb25kcyA9IGFkZChyZW1haW5pbmdNaW51dGVzLCB7IG1pbnV0ZXM6IGR1cmF0aW9uLm1pbnV0ZXMgfSk7CiAgY29uc3Qgc2Vjb25kcyA9IGRpZmZlcmVuY2VJblNlY29uZHMoZW5kLCByZW1haW5pbmdTZWNvbmRzKTsKICBpZiAoc2Vjb25kcykgZHVyYXRpb24uc2Vjb25kcyA9IHNlY29uZHM7CiAgcmV0dXJuIGR1cmF0aW9uOwp9Cl9fbmFtZShpbnRlcnZhbFRvRHVyYXRpb24sICJpbnRlcnZhbFRvRHVyYXRpb24iKTsKdmFyIGludGVydmFsVG9EdXJhdGlvbl9kZWZhdWx0ID0gaW50ZXJ2YWxUb0R1cmF0aW9uOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pbnRsRm9ybWF0LmpzCmZ1bmN0aW9uIGludGxGb3JtYXQoZGF0ZSwgZm9ybWF0T3JMb2NhbGUsIGxvY2FsZU9wdGlvbnMpIHsKICBsZXQgZm9ybWF0T3B0aW9uczsKICBpZiAoaXNGb3JtYXRPcHRpb25zKGZvcm1hdE9yTG9jYWxlKSkgewogICAgZm9ybWF0T3B0aW9ucyA9IGZvcm1hdE9yTG9jYWxlOwogIH0gZWxzZSB7CiAgICBsb2NhbGVPcHRpb25zID0gZm9ybWF0T3JMb2NhbGU7CiAgfQogIHJldHVybiBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChsb2NhbGVPcHRpb25zPy5sb2NhbGUsIGZvcm1hdE9wdGlvbnMpLmZvcm1hdCgKICAgIHRvRGF0ZShkYXRlKQogICk7Cn0KX19uYW1lKGludGxGb3JtYXQsICJpbnRsRm9ybWF0Iik7CmZ1bmN0aW9uIGlzRm9ybWF0T3B0aW9ucyhvcHRzKSB7CiAgcmV0dXJuIG9wdHMgIT09IHZvaWQgMCAmJiAhKCJsb2NhbGUiIGluIG9wdHMpOwp9Cl9fbmFtZShpc0Zvcm1hdE9wdGlvbnMsICJpc0Zvcm1hdE9wdGlvbnMiKTsKdmFyIGludGxGb3JtYXRfZGVmYXVsdCA9IGludGxGb3JtYXQ7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2ludGxGb3JtYXREaXN0YW5jZS5qcwpmdW5jdGlvbiBpbnRsRm9ybWF0RGlzdGFuY2UobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgb3B0aW9ucykgewogIGxldCB2YWx1ZTIgPSAwOwogIGxldCB1bml0OwogIGNvbnN0IFtsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV9dID0gbm9ybWFsaXplRGF0ZXMoCiAgICBvcHRpb25zPy5pbiwKICAgIGxhdGVyRGF0ZSwKICAgIGVhcmxpZXJEYXRlCiAgKTsKICBpZiAoIW9wdGlvbnM/LnVuaXQpIHsKICAgIGNvbnN0IGRpZmZJblNlY29uZHMgPSBkaWZmZXJlbmNlSW5TZWNvbmRzKGxhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlXyk7CiAgICBpZiAoTWF0aC5hYnMoZGlmZkluU2Vjb25kcykgPCBzZWNvbmRzSW5NaW51dGUpIHsKICAgICAgdmFsdWUyID0gZGlmZmVyZW5jZUluU2Vjb25kcyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pOwogICAgICB1bml0ID0gInNlY29uZCI7CiAgICB9IGVsc2UgaWYgKE1hdGguYWJzKGRpZmZJblNlY29uZHMpIDwgc2Vjb25kc0luSG91cikgewogICAgICB2YWx1ZTIgPSBkaWZmZXJlbmNlSW5NaW51dGVzKGxhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlXyk7CiAgICAgIHVuaXQgPSAibWludXRlIjsKICAgIH0gZWxzZSBpZiAoTWF0aC5hYnMoZGlmZkluU2Vjb25kcykgPCBzZWNvbmRzSW5EYXkgJiYgTWF0aC5hYnMoZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGxhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlXykpIDwgMSkgewogICAgICB2YWx1ZTIgPSBkaWZmZXJlbmNlSW5Ib3VycyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pOwogICAgICB1bml0ID0gImhvdXIiOwogICAgfSBlbHNlIGlmIChNYXRoLmFicyhkaWZmSW5TZWNvbmRzKSA8IHNlY29uZHNJbldlZWsgJiYgKHZhbHVlMiA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pKSAmJiBNYXRoLmFicyh2YWx1ZTIpIDwgNykgewogICAgICB1bml0ID0gImRheSI7CiAgICB9IGVsc2UgaWYgKE1hdGguYWJzKGRpZmZJblNlY29uZHMpIDwgc2Vjb25kc0luTW9udGgpIHsKICAgICAgdmFsdWUyID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJXZWVrcyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pOwogICAgICB1bml0ID0gIndlZWsiOwogICAgfSBlbHNlIGlmIChNYXRoLmFicyhkaWZmSW5TZWNvbmRzKSA8IHNlY29uZHNJblF1YXJ0ZXIpIHsKICAgICAgdmFsdWUyID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKTsKICAgICAgdW5pdCA9ICJtb250aCI7CiAgICB9IGVsc2UgaWYgKE1hdGguYWJzKGRpZmZJblNlY29uZHMpIDwgc2Vjb25kc0luWWVhcikgewogICAgICBpZiAoZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVycyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pIDwgNCkgewogICAgICAgIHZhbHVlMiA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyUXVhcnRlcnMobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKTsKICAgICAgICB1bml0ID0gInF1YXJ0ZXIiOwogICAgICB9IGVsc2UgewogICAgICAgIHZhbHVlMiA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnMobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKTsKICAgICAgICB1bml0ID0gInllYXIiOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB2YWx1ZTIgPSBkaWZmZXJlbmNlSW5DYWxlbmRhclllYXJzKGxhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlXyk7CiAgICAgIHVuaXQgPSAieWVhciI7CiAgICB9CiAgfSBlbHNlIHsKICAgIHVuaXQgPSBvcHRpb25zPy51bml0OwogICAgaWYgKHVuaXQgPT09ICJzZWNvbmQiKSB7CiAgICAgIHZhbHVlMiA9IGRpZmZlcmVuY2VJblNlY29uZHMobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKTsKICAgIH0gZWxzZSBpZiAodW5pdCA9PT0gIm1pbnV0ZSIpIHsKICAgICAgdmFsdWUyID0gZGlmZmVyZW5jZUluTWludXRlcyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pOwogICAgfSBlbHNlIGlmICh1bml0ID09PSAiaG91ciIpIHsKICAgICAgdmFsdWUyID0gZGlmZmVyZW5jZUluSG91cnMobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKTsKICAgIH0gZWxzZSBpZiAodW5pdCA9PT0gImRheSIpIHsKICAgICAgdmFsdWUyID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGxhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlXyk7CiAgICB9IGVsc2UgaWYgKHVuaXQgPT09ICJ3ZWVrIikgewogICAgICB2YWx1ZTIgPSBkaWZmZXJlbmNlSW5DYWxlbmRhcldlZWtzKGxhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlXyk7CiAgICB9IGVsc2UgaWYgKHVuaXQgPT09ICJtb250aCIpIHsKICAgICAgdmFsdWUyID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKTsKICAgIH0gZWxzZSBpZiAodW5pdCA9PT0gInF1YXJ0ZXIiKSB7CiAgICAgIHZhbHVlMiA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyUXVhcnRlcnMobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKTsKICAgIH0gZWxzZSBpZiAodW5pdCA9PT0gInllYXIiKSB7CiAgICAgIHZhbHVlMiA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnMobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKTsKICAgIH0KICB9CiAgY29uc3QgcnRmID0gbmV3IEludGwuUmVsYXRpdmVUaW1lRm9ybWF0KG9wdGlvbnM/LmxvY2FsZSwgewogICAgbnVtZXJpYzogImF1dG8iLAogICAgLi4ub3B0aW9ucwogIH0pOwogIHJldHVybiBydGYuZm9ybWF0KHZhbHVlMiwgdW5pdCk7Cn0KX19uYW1lKGludGxGb3JtYXREaXN0YW5jZSwgImludGxGb3JtYXREaXN0YW5jZSIpOwp2YXIgaW50bEZvcm1hdERpc3RhbmNlX2RlZmF1bHQgPSBpbnRsRm9ybWF0RGlzdGFuY2U7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzQWZ0ZXIuanMKZnVuY3Rpb24gaXNBZnRlcihkYXRlLCBkYXRlVG9Db21wYXJlKSB7CiAgcmV0dXJuICt0b0RhdGUoZGF0ZSkgPiArdG9EYXRlKGRhdGVUb0NvbXBhcmUpOwp9Cl9fbmFtZShpc0FmdGVyLCAiaXNBZnRlciIpOwp2YXIgaXNBZnRlcl9kZWZhdWx0ID0gaXNBZnRlcjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNCZWZvcmUuanMKZnVuY3Rpb24gaXNCZWZvcmUoZGF0ZSwgZGF0ZVRvQ29tcGFyZSkgewogIHJldHVybiArdG9EYXRlKGRhdGUpIDwgK3RvRGF0ZShkYXRlVG9Db21wYXJlKTsKfQpfX25hbWUoaXNCZWZvcmUsICJpc0JlZm9yZSIpOwp2YXIgaXNCZWZvcmVfZGVmYXVsdCA9IGlzQmVmb3JlOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc0VxdWFsLmpzCmZ1bmN0aW9uIGlzRXF1YWwobGVmdERhdGUsIHJpZ2h0RGF0ZSkgewogIHJldHVybiArdG9EYXRlKGxlZnREYXRlKSA9PT0gK3RvRGF0ZShyaWdodERhdGUpOwp9Cl9fbmFtZShpc0VxdWFsLCAiaXNFcXVhbCIpOwp2YXIgaXNFcXVhbF9kZWZhdWx0ID0gaXNFcXVhbDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNFeGlzdHMuanMKZnVuY3Rpb24gaXNFeGlzdHMoeWVhciwgbW9udGgsIGRheSkgewogIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgZGF5KTsKICByZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpID09PSB5ZWFyICYmIGRhdGUuZ2V0TW9udGgoKSA9PT0gbW9udGggJiYgZGF0ZS5nZXREYXRlKCkgPT09IGRheTsKfQpfX25hbWUoaXNFeGlzdHMsICJpc0V4aXN0cyIpOwp2YXIgaXNFeGlzdHNfZGVmYXVsdCA9IGlzRXhpc3RzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc0ZpcnN0RGF5T2ZNb250aC5qcwpmdW5jdGlvbiBpc0ZpcnN0RGF5T2ZNb250aChkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbikuZ2V0RGF0ZSgpID09PSAxOwp9Cl9fbmFtZShpc0ZpcnN0RGF5T2ZNb250aCwgImlzRmlyc3REYXlPZk1vbnRoIik7CnZhciBpc0ZpcnN0RGF5T2ZNb250aF9kZWZhdWx0ID0gaXNGaXJzdERheU9mTW9udGg7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzRnJpZGF5LmpzCmZ1bmN0aW9uIGlzRnJpZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKS5nZXREYXkoKSA9PT0gNTsKfQpfX25hbWUoaXNGcmlkYXksICJpc0ZyaWRheSIpOwp2YXIgaXNGcmlkYXlfZGVmYXVsdCA9IGlzRnJpZGF5OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc0Z1dHVyZS5qcwpmdW5jdGlvbiBpc0Z1dHVyZShkYXRlKSB7CiAgcmV0dXJuICt0b0RhdGUoZGF0ZSkgPiBEYXRlLm5vdygpOwp9Cl9fbmFtZShpc0Z1dHVyZSwgImlzRnV0dXJlIik7CnZhciBpc0Z1dHVyZV9kZWZhdWx0ID0gaXNGdXR1cmU7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3RyYW5zcG9zZS5qcwpmdW5jdGlvbiB0cmFuc3Bvc2UoZGF0ZSwgY29uc3RydWN0b3IpIHsKICBjb25zdCBkYXRlXyA9IGlzQ29uc3RydWN0b3IoY29uc3RydWN0b3IpID8gbmV3IGNvbnN0cnVjdG9yKDApIDogY29uc3RydWN0RnJvbShjb25zdHJ1Y3RvciwgMCk7CiAgZGF0ZV8uc2V0RnVsbFllYXIoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIGRhdGUuZ2V0RGF0ZSgpKTsKICBkYXRlXy5zZXRIb3VycygKICAgIGRhdGUuZ2V0SG91cnMoKSwKICAgIGRhdGUuZ2V0TWludXRlcygpLAogICAgZGF0ZS5nZXRTZWNvbmRzKCksCiAgICBkYXRlLmdldE1pbGxpc2Vjb25kcygpCiAgKTsKICByZXR1cm4gZGF0ZV87Cn0KX19uYW1lKHRyYW5zcG9zZSwgInRyYW5zcG9zZSIpOwpmdW5jdGlvbiBpc0NvbnN0cnVjdG9yKGNvbnN0cnVjdG9yKSB7CiAgcmV0dXJuIHR5cGVvZiBjb25zdHJ1Y3RvciA9PT0gImZ1bmN0aW9uIiAmJiBjb25zdHJ1Y3Rvci5wcm90b3R5cGU/LmNvbnN0cnVjdG9yID09PSBjb25zdHJ1Y3RvcjsKfQpfX25hbWUoaXNDb25zdHJ1Y3RvciwgImlzQ29uc3RydWN0b3IiKTsKdmFyIHRyYW5zcG9zZV9kZWZhdWx0ID0gdHJhbnNwb3NlOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL1NldHRlci5qcwp2YXIgVElNRVpPTkVfVU5JVF9QUklPUklUWSA9IDEwOwp2YXIgU2V0dGVyID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlNldHRlciIpOwogIH0KICBzdWJQcmlvcml0eSA9IDA7CiAgdmFsaWRhdGUoX3V0Y0RhdGUsIF9vcHRpb25zKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9Cn07CnZhciBWYWx1ZVNldHRlciA9IGNsYXNzIGV4dGVuZHMgU2V0dGVyIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJWYWx1ZVNldHRlciIpOwogIH0KICBjb25zdHJ1Y3Rvcih2YWx1ZTIsIHZhbGlkYXRlVmFsdWUsIHNldFZhbHVlLCBwcmlvcml0eSwgc3ViUHJpb3JpdHkpIHsKICAgIHN1cGVyKCk7CiAgICB0aGlzLnZhbHVlID0gdmFsdWUyOwogICAgdGhpcy52YWxpZGF0ZVZhbHVlID0gdmFsaWRhdGVWYWx1ZTsKICAgIHRoaXMuc2V0VmFsdWUgPSBzZXRWYWx1ZTsKICAgIHRoaXMucHJpb3JpdHkgPSBwcmlvcml0eTsKICAgIGlmIChzdWJQcmlvcml0eSkgewogICAgICB0aGlzLnN1YlByaW9yaXR5ID0gc3ViUHJpb3JpdHk7CiAgICB9CiAgfQogIHZhbGlkYXRlKGRhdGUsIG9wdGlvbnMpIHsKICAgIHJldHVybiB0aGlzLnZhbGlkYXRlVmFsdWUoZGF0ZSwgdGhpcy52YWx1ZSwgb3B0aW9ucyk7CiAgfQogIHNldChkYXRlLCBmbGFncywgb3B0aW9ucykgewogICAgcmV0dXJuIHRoaXMuc2V0VmFsdWUoZGF0ZSwgZmxhZ3MsIHRoaXMudmFsdWUsIG9wdGlvbnMpOwogIH0KfTsKdmFyIERhdGVUaW1lem9uZVNldHRlciA9IGNsYXNzIGV4dGVuZHMgU2V0dGVyIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJEYXRlVGltZXpvbmVTZXR0ZXIiKTsKICB9CiAgcHJpb3JpdHkgPSBUSU1FWk9ORV9VTklUX1BSSU9SSVRZOwogIHN1YlByaW9yaXR5ID0gLTE7CiAgY29uc3RydWN0b3IoY29udGV4dDIsIHJlZmVyZW5jZSkgewogICAgc3VwZXIoKTsKICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQyIHx8ICgoZGF0ZSkgPT4gY29uc3RydWN0RnJvbShyZWZlcmVuY2UsIGRhdGUpKTsKICB9CiAgc2V0KGRhdGUsIGZsYWdzKSB7CiAgICBpZiAoZmxhZ3MudGltZXN0YW1wSXNTZXQpIHJldHVybiBkYXRlOwogICAgcmV0dXJuIGNvbnN0cnVjdEZyb20oZGF0ZSwgdHJhbnNwb3NlKGRhdGUsIHRoaXMuY29udGV4dCkpOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9QYXJzZXIuanMKdmFyIFBhcnNlciA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJQYXJzZXIiKTsKICB9CiAgcnVuKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaDIsIG9wdGlvbnMpIHsKICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoMiwgb3B0aW9ucyk7CiAgICBpZiAoIXJlc3VsdCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIHNldHRlcjogbmV3IFZhbHVlU2V0dGVyKAogICAgICAgIHJlc3VsdC52YWx1ZSwKICAgICAgICB0aGlzLnZhbGlkYXRlLAogICAgICAgIHRoaXMuc2V0LAogICAgICAgIHRoaXMucHJpb3JpdHksCiAgICAgICAgdGhpcy5zdWJQcmlvcml0eQogICAgICApLAogICAgICByZXN0OiByZXN1bHQucmVzdAogICAgfTsKICB9CiAgdmFsaWRhdGUoX3V0Y0RhdGUsIF92YWx1ZSwgX29wdGlvbnMpIHsKICAgIHJldHVybiB0cnVlOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0VyYVBhcnNlci5qcwp2YXIgRXJhUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkVyYVBhcnNlciIpOwogIH0KICBwcmlvcml0eSA9IDE0MDsKICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gyKSB7CiAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgIC8vIEFELCBCQwogICAgICBjYXNlICJHIjoKICAgICAgY2FzZSAiR0ciOgogICAgICBjYXNlICJHR0ciOgogICAgICAgIHJldHVybiBtYXRjaDIuZXJhKGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJhYmJyZXZpYXRlZCIgfSkgfHwgbWF0Y2gyLmVyYShkYXRlU3RyaW5nLCB7IHdpZHRoOiAibmFycm93IiB9KTsKICAgICAgLy8gQSwgQgogICAgICBjYXNlICJHR0dHRyI6CiAgICAgICAgcmV0dXJuIG1hdGNoMi5lcmEoZGF0ZVN0cmluZywgeyB3aWR0aDogIm5hcnJvdyIgfSk7CiAgICAgIC8vIEFubm8gRG9taW5pLCBCZWZvcmUgQ2hyaXN0CiAgICAgIGNhc2UgIkdHR0ciOgogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBtYXRjaDIuZXJhKGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJ3aWRlIiB9KSB8fCBtYXRjaDIuZXJhKGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJhYmJyZXZpYXRlZCIgfSkgfHwgbWF0Y2gyLmVyYShkYXRlU3RyaW5nLCB7IHdpZHRoOiAibmFycm93IiB9KTsKICAgIH0KICB9CiAgc2V0KGRhdGUsIGZsYWdzLCB2YWx1ZTIpIHsKICAgIGZsYWdzLmVyYSA9IHZhbHVlMjsKICAgIGRhdGUuc2V0RnVsbFllYXIodmFsdWUyLCAwLCAxKTsKICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgICByZXR1cm4gZGF0ZTsKICB9CiAgaW5jb21wYXRpYmxlVG9rZW5zID0gWyJSIiwgInUiLCAidCIsICJUIl07Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvY29uc3RhbnRzLmpzCnZhciBudW1lcmljUGF0dGVybnMgPSB7CiAgbW9udGg6IC9eKDFbMC0yXXwwP1xkKS8sCiAgLy8gMCB0byAxMgogIGRhdGU6IC9eKDNbMC0xXXxbMC0yXT9cZCkvLAogIC8vIDAgdG8gMzEKICBkYXlPZlllYXI6IC9eKDM2WzAtNl18M1swLTVdXGR8WzAtMl0/XGQ/XGQpLywKICAvLyAwIHRvIDM2NgogIHdlZWs6IC9eKDVbMC0zXXxbMC00XT9cZCkvLAogIC8vIDAgdG8gNTMKICBob3VyMjNoOiAvXigyWzAtM118WzAtMV0/XGQpLywKICAvLyAwIHRvIDIzCiAgaG91cjI0aDogL14oMlswLTRdfFswLTFdP1xkKS8sCiAgLy8gMCB0byAyNAogIGhvdXIxMWg6IC9eKDFbMC0xXXwwP1xkKS8sCiAgLy8gMCB0byAxMQogIGhvdXIxMmg6IC9eKDFbMC0yXXwwP1xkKS8sCiAgLy8gMCB0byAxMgogIG1pbnV0ZTogL15bMC01XT9cZC8sCiAgLy8gMCB0byA1OQogIHNlY29uZDogL15bMC01XT9cZC8sCiAgLy8gMCB0byA1OQogIHNpbmdsZURpZ2l0OiAvXlxkLywKICAvLyAwIHRvIDkKICB0d29EaWdpdHM6IC9eXGR7MSwyfS8sCiAgLy8gMCB0byA5OQogIHRocmVlRGlnaXRzOiAvXlxkezEsM30vLAogIC8vIDAgdG8gOTk5CiAgZm91ckRpZ2l0czogL15cZHsxLDR9LywKICAvLyAwIHRvIDk5OTkKICBhbnlEaWdpdHNTaWduZWQ6IC9eLT9cZCsvLAogIHNpbmdsZURpZ2l0U2lnbmVkOiAvXi0/XGQvLAogIC8vIDAgdG8gOSwgLTAgdG8gLTkKICB0d29EaWdpdHNTaWduZWQ6IC9eLT9cZHsxLDJ9LywKICAvLyAwIHRvIDk5LCAtMCB0byAtOTkKICB0aHJlZURpZ2l0c1NpZ25lZDogL14tP1xkezEsM30vLAogIC8vIDAgdG8gOTk5LCAtMCB0byAtOTk5CiAgZm91ckRpZ2l0c1NpZ25lZDogL14tP1xkezEsNH0vCiAgLy8gMCB0byA5OTk5LCAtMCB0byAtOTk5OQp9Owp2YXIgdGltZXpvbmVQYXR0ZXJucyA9IHsKICBiYXNpY09wdGlvbmFsTWludXRlczogL14oWystXSkoXGR7Mn0pKFxkezJ9KT98Wi8sCiAgYmFzaWM6IC9eKFsrLV0pKFxkezJ9KShcZHsyfSl8Wi8sCiAgYmFzaWNPcHRpb25hbFNlY29uZHM6IC9eKFsrLV0pKFxkezJ9KShcZHsyfSkoKFxkezJ9KSk/fFovLAogIGV4dGVuZGVkOiAvXihbKy1dKShcZHsyfSk6KFxkezJ9KXxaLywKICBleHRlbmRlZE9wdGlvbmFsU2Vjb25kczogL14oWystXSkoXGR7Mn0pOihcZHsyfSkoOihcZHsyfSkpP3xaLwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3V0aWxzLmpzCmZ1bmN0aW9uIG1hcFZhbHVlKHBhcnNlRm5SZXN1bHQsIG1hcEZuKSB7CiAgaWYgKCFwYXJzZUZuUmVzdWx0KSB7CiAgICByZXR1cm4gcGFyc2VGblJlc3VsdDsKICB9CiAgcmV0dXJuIHsKICAgIHZhbHVlOiBtYXBGbihwYXJzZUZuUmVzdWx0LnZhbHVlKSwKICAgIHJlc3Q6IHBhcnNlRm5SZXN1bHQucmVzdAogIH07Cn0KX19uYW1lKG1hcFZhbHVlLCAibWFwVmFsdWUiKTsKZnVuY3Rpb24gcGFyc2VOdW1lcmljUGF0dGVybihwYXR0ZXJuLCBkYXRlU3RyaW5nKSB7CiAgY29uc3QgbWF0Y2hSZXN1bHQgPSBkYXRlU3RyaW5nLm1hdGNoKHBhdHRlcm4pOwogIGlmICghbWF0Y2hSZXN1bHQpIHsKICAgIHJldHVybiBudWxsOwogIH0KICByZXR1cm4gewogICAgdmFsdWU6IHBhcnNlSW50KG1hdGNoUmVzdWx0WzBdLCAxMCksCiAgICByZXN0OiBkYXRlU3RyaW5nLnNsaWNlKG1hdGNoUmVzdWx0WzBdLmxlbmd0aCkKICB9Owp9Cl9fbmFtZShwYXJzZU51bWVyaWNQYXR0ZXJuLCAicGFyc2VOdW1lcmljUGF0dGVybiIpOwpmdW5jdGlvbiBwYXJzZVRpbWV6b25lUGF0dGVybihwYXR0ZXJuLCBkYXRlU3RyaW5nKSB7CiAgY29uc3QgbWF0Y2hSZXN1bHQgPSBkYXRlU3RyaW5nLm1hdGNoKHBhdHRlcm4pOwogIGlmICghbWF0Y2hSZXN1bHQpIHsKICAgIHJldHVybiBudWxsOwogIH0KICBpZiAobWF0Y2hSZXN1bHRbMF0gPT09ICJaIikgewogICAgcmV0dXJuIHsKICAgICAgdmFsdWU6IDAsCiAgICAgIHJlc3Q6IGRhdGVTdHJpbmcuc2xpY2UoMSkKICAgIH07CiAgfQogIGNvbnN0IHNpZ24gPSBtYXRjaFJlc3VsdFsxXSA9PT0gIisiID8gMSA6IC0xOwogIGNvbnN0IGhvdXJzID0gbWF0Y2hSZXN1bHRbMl0gPyBwYXJzZUludChtYXRjaFJlc3VsdFsyXSwgMTApIDogMDsKICBjb25zdCBtaW51dGVzID0gbWF0Y2hSZXN1bHRbM10gPyBwYXJzZUludChtYXRjaFJlc3VsdFszXSwgMTApIDogMDsKICBjb25zdCBzZWNvbmRzID0gbWF0Y2hSZXN1bHRbNV0gPyBwYXJzZUludChtYXRjaFJlc3VsdFs1XSwgMTApIDogMDsKICByZXR1cm4gewogICAgdmFsdWU6IHNpZ24gKiAoaG91cnMgKiBtaWxsaXNlY29uZHNJbkhvdXIgKyBtaW51dGVzICogbWlsbGlzZWNvbmRzSW5NaW51dGUgKyBzZWNvbmRzICogbWlsbGlzZWNvbmRzSW5TZWNvbmQpLAogICAgcmVzdDogZGF0ZVN0cmluZy5zbGljZShtYXRjaFJlc3VsdFswXS5sZW5ndGgpCiAgfTsKfQpfX25hbWUocGFyc2VUaW1lem9uZVBhdHRlcm4sICJwYXJzZVRpbWV6b25lUGF0dGVybiIpOwpmdW5jdGlvbiBwYXJzZUFueURpZ2l0c1NpZ25lZChkYXRlU3RyaW5nKSB7CiAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4obnVtZXJpY1BhdHRlcm5zLmFueURpZ2l0c1NpZ25lZCwgZGF0ZVN0cmluZyk7Cn0KX19uYW1lKHBhcnNlQW55RGlnaXRzU2lnbmVkLCAicGFyc2VBbnlEaWdpdHNTaWduZWQiKTsKZnVuY3Rpb24gcGFyc2VORGlnaXRzKG4xMSwgZGF0ZVN0cmluZykgewogIHN3aXRjaCAobjExKSB7CiAgICBjYXNlIDE6CiAgICAgIHJldHVybiBwYXJzZU51bWVyaWNQYXR0ZXJuKG51bWVyaWNQYXR0ZXJucy5zaW5nbGVEaWdpdCwgZGF0ZVN0cmluZyk7CiAgICBjYXNlIDI6CiAgICAgIHJldHVybiBwYXJzZU51bWVyaWNQYXR0ZXJuKG51bWVyaWNQYXR0ZXJucy50d29EaWdpdHMsIGRhdGVTdHJpbmcpOwogICAgY2FzZSAzOgogICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihudW1lcmljUGF0dGVybnMudGhyZWVEaWdpdHMsIGRhdGVTdHJpbmcpOwogICAgY2FzZSA0OgogICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihudW1lcmljUGF0dGVybnMuZm91ckRpZ2l0cywgZGF0ZVN0cmluZyk7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihuZXcgUmVnRXhwKCJeXFxkezEsIiArIG4xMSArICJ9IiksIGRhdGVTdHJpbmcpOwogIH0KfQpfX25hbWUocGFyc2VORGlnaXRzLCAicGFyc2VORGlnaXRzIik7CmZ1bmN0aW9uIHBhcnNlTkRpZ2l0c1NpZ25lZChuMTEsIGRhdGVTdHJpbmcpIHsKICBzd2l0Y2ggKG4xMSkgewogICAgY2FzZSAxOgogICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihudW1lcmljUGF0dGVybnMuc2luZ2xlRGlnaXRTaWduZWQsIGRhdGVTdHJpbmcpOwogICAgY2FzZSAyOgogICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihudW1lcmljUGF0dGVybnMudHdvRGlnaXRzU2lnbmVkLCBkYXRlU3RyaW5nKTsKICAgIGNhc2UgMzoKICAgICAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4obnVtZXJpY1BhdHRlcm5zLnRocmVlRGlnaXRzU2lnbmVkLCBkYXRlU3RyaW5nKTsKICAgIGNhc2UgNDoKICAgICAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4obnVtZXJpY1BhdHRlcm5zLmZvdXJEaWdpdHNTaWduZWQsIGRhdGVTdHJpbmcpOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4obmV3IFJlZ0V4cCgiXi0/XFxkezEsIiArIG4xMSArICJ9IiksIGRhdGVTdHJpbmcpOwogIH0KfQpfX25hbWUocGFyc2VORGlnaXRzU2lnbmVkLCAicGFyc2VORGlnaXRzU2lnbmVkIik7CmZ1bmN0aW9uIGRheVBlcmlvZEVudW1Ub0hvdXJzKGRheVBlcmlvZCkgewogIHN3aXRjaCAoZGF5UGVyaW9kKSB7CiAgICBjYXNlICJtb3JuaW5nIjoKICAgICAgcmV0dXJuIDQ7CiAgICBjYXNlICJldmVuaW5nIjoKICAgICAgcmV0dXJuIDE3OwogICAgY2FzZSAicG0iOgogICAgY2FzZSAibm9vbiI6CiAgICBjYXNlICJhZnRlcm5vb24iOgogICAgICByZXR1cm4gMTI7CiAgICBjYXNlICJhbSI6CiAgICBjYXNlICJtaWRuaWdodCI6CiAgICBjYXNlICJuaWdodCI6CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gMDsKICB9Cn0KX19uYW1lKGRheVBlcmlvZEVudW1Ub0hvdXJzLCAiZGF5UGVyaW9kRW51bVRvSG91cnMiKTsKZnVuY3Rpb24gbm9ybWFsaXplVHdvRGlnaXRZZWFyKHR3b0RpZ2l0WWVhciwgY3VycmVudFllYXIpIHsKICBjb25zdCBpc0NvbW1vbkVyYSA9IGN1cnJlbnRZZWFyID4gMDsKICBjb25zdCBhYnNDdXJyZW50WWVhciA9IGlzQ29tbW9uRXJhID8gY3VycmVudFllYXIgOiAxIC0gY3VycmVudFllYXI7CiAgbGV0IHJlc3VsdDsKICBpZiAoYWJzQ3VycmVudFllYXIgPD0gNTApIHsKICAgIHJlc3VsdCA9IHR3b0RpZ2l0WWVhciB8fCAxMDA7CiAgfSBlbHNlIHsKICAgIGNvbnN0IHJhbmdlRW5kID0gYWJzQ3VycmVudFllYXIgKyA1MDsKICAgIGNvbnN0IHJhbmdlRW5kQ2VudHVyeSA9IE1hdGgudHJ1bmMocmFuZ2VFbmQgLyAxMDApICogMTAwOwogICAgY29uc3QgaXNQcmV2aW91c0NlbnR1cnkgPSB0d29EaWdpdFllYXIgPj0gcmFuZ2VFbmQgJSAxMDA7CiAgICByZXN1bHQgPSB0d29EaWdpdFllYXIgKyByYW5nZUVuZENlbnR1cnkgLSAoaXNQcmV2aW91c0NlbnR1cnkgPyAxMDAgOiAwKTsKICB9CiAgcmV0dXJuIGlzQ29tbW9uRXJhID8gcmVzdWx0IDogMSAtIHJlc3VsdDsKfQpfX25hbWUobm9ybWFsaXplVHdvRGlnaXRZZWFyLCAibm9ybWFsaXplVHdvRGlnaXRZZWFyIik7CmZ1bmN0aW9uIGlzTGVhcFllYXJJbmRleCh5ZWFyKSB7CiAgcmV0dXJuIHllYXIgJSA0MDAgPT09IDAgfHwgeWVhciAlIDQgPT09IDAgJiYgeWVhciAlIDEwMCAhPT0gMDsKfQpfX25hbWUoaXNMZWFwWWVhckluZGV4LCAiaXNMZWFwWWVhckluZGV4Iik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9ZZWFyUGFyc2VyLmpzCnZhciBZZWFyUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlllYXJQYXJzZXIiKTsKICB9CiAgcHJpb3JpdHkgPSAxMzA7CiAgaW5jb21wYXRpYmxlVG9rZW5zID0gWyJZIiwgIlIiLCAidSIsICJ3IiwgIkkiLCAiaSIsICJlIiwgImMiLCAidCIsICJUIl07CiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoMikgewogICAgY29uc3QgdmFsdWVDYWxsYmFjayA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHllYXIpID0+ICh7CiAgICAgIHllYXIsCiAgICAgIGlzVHdvRGlnaXRZZWFyOiB0b2tlbiA9PT0gInl5IgogICAgfSksICJ2YWx1ZUNhbGxiYWNrIik7CiAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgIGNhc2UgInkiOgogICAgICAgIHJldHVybiBtYXBWYWx1ZShwYXJzZU5EaWdpdHMoNCwgZGF0ZVN0cmluZyksIHZhbHVlQ2FsbGJhY2spOwogICAgICBjYXNlICJ5byI6CiAgICAgICAgcmV0dXJuIG1hcFZhbHVlKAogICAgICAgICAgbWF0Y2gyLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgewogICAgICAgICAgICB1bml0OiAieWVhciIKICAgICAgICAgIH0pLAogICAgICAgICAgdmFsdWVDYWxsYmFjawogICAgICAgICk7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIG1hcFZhbHVlKHBhcnNlTkRpZ2l0cyh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpLCB2YWx1ZUNhbGxiYWNrKTsKICAgIH0KICB9CiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlMikgewogICAgcmV0dXJuIHZhbHVlMi5pc1R3b0RpZ2l0WWVhciB8fCB2YWx1ZTIueWVhciA+IDA7CiAgfQogIHNldChkYXRlLCBmbGFncywgdmFsdWUyKSB7CiAgICBjb25zdCBjdXJyZW50WWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTsKICAgIGlmICh2YWx1ZTIuaXNUd29EaWdpdFllYXIpIHsKICAgICAgY29uc3Qgbm9ybWFsaXplZFR3b0RpZ2l0WWVhciA9IG5vcm1hbGl6ZVR3b0RpZ2l0WWVhcigKICAgICAgICB2YWx1ZTIueWVhciwKICAgICAgICBjdXJyZW50WWVhcgogICAgICApOwogICAgICBkYXRlLnNldEZ1bGxZZWFyKG5vcm1hbGl6ZWRUd29EaWdpdFllYXIsIDAsIDEpOwogICAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgICByZXR1cm4gZGF0ZTsKICAgIH0KICAgIGNvbnN0IHllYXIgPSAhKCJlcmEiIGluIGZsYWdzKSB8fCBmbGFncy5lcmEgPT09IDEgPyB2YWx1ZTIueWVhciA6IDEgLSB2YWx1ZTIueWVhcjsKICAgIGRhdGUuc2V0RnVsbFllYXIoeWVhciwgMCwgMSk7CiAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgcmV0dXJuIGRhdGU7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvTG9jYWxXZWVrWWVhclBhcnNlci5qcwp2YXIgTG9jYWxXZWVrWWVhclBhcnNlciA9IGNsYXNzIGV4dGVuZHMgUGFyc2VyIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJMb2NhbFdlZWtZZWFyUGFyc2VyIik7CiAgfQogIHByaW9yaXR5ID0gMTMwOwogIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaDIpIHsKICAgIGNvbnN0IHZhbHVlQ2FsbGJhY2sgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh5ZWFyKSA9PiAoewogICAgICB5ZWFyLAogICAgICBpc1R3b0RpZ2l0WWVhcjogdG9rZW4gPT09ICJZWSIKICAgIH0pLCAidmFsdWVDYWxsYmFjayIpOwogICAgc3dpdGNoICh0b2tlbikgewogICAgICBjYXNlICJZIjoKICAgICAgICByZXR1cm4gbWFwVmFsdWUocGFyc2VORGlnaXRzKDQsIGRhdGVTdHJpbmcpLCB2YWx1ZUNhbGxiYWNrKTsKICAgICAgY2FzZSAiWW8iOgogICAgICAgIHJldHVybiBtYXBWYWx1ZSgKICAgICAgICAgIG1hdGNoMi5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgdW5pdDogInllYXIiCiAgICAgICAgICB9KSwKICAgICAgICAgIHZhbHVlQ2FsbGJhY2sKICAgICAgICApOwogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBtYXBWYWx1ZShwYXJzZU5EaWdpdHModG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKSwgdmFsdWVDYWxsYmFjayk7CiAgICB9CiAgfQogIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZTIpIHsKICAgIHJldHVybiB2YWx1ZTIuaXNUd29EaWdpdFllYXIgfHwgdmFsdWUyLnllYXIgPiAwOwogIH0KICBzZXQoZGF0ZSwgZmxhZ3MsIHZhbHVlMiwgb3B0aW9ucykgewogICAgY29uc3QgY3VycmVudFllYXIgPSBnZXRXZWVrWWVhcihkYXRlLCBvcHRpb25zKTsKICAgIGlmICh2YWx1ZTIuaXNUd29EaWdpdFllYXIpIHsKICAgICAgY29uc3Qgbm9ybWFsaXplZFR3b0RpZ2l0WWVhciA9IG5vcm1hbGl6ZVR3b0RpZ2l0WWVhcigKICAgICAgICB2YWx1ZTIueWVhciwKICAgICAgICBjdXJyZW50WWVhcgogICAgICApOwogICAgICBkYXRlLnNldEZ1bGxZZWFyKAogICAgICAgIG5vcm1hbGl6ZWRUd29EaWdpdFllYXIsCiAgICAgICAgMCwKICAgICAgICBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZQogICAgICApOwogICAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgICByZXR1cm4gc3RhcnRPZldlZWsoZGF0ZSwgb3B0aW9ucyk7CiAgICB9CiAgICBjb25zdCB5ZWFyID0gISgiZXJhIiBpbiBmbGFncykgfHwgZmxhZ3MuZXJhID09PSAxID8gdmFsdWUyLnllYXIgOiAxIC0gdmFsdWUyLnllYXI7CiAgICBkYXRlLnNldEZ1bGxZZWFyKHllYXIsIDAsIG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlKTsKICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgICByZXR1cm4gc3RhcnRPZldlZWsoZGF0ZSwgb3B0aW9ucyk7CiAgfQogIGluY29tcGF0aWJsZVRva2VucyA9IFsKICAgICJ5IiwKICAgICJSIiwKICAgICJ1IiwKICAgICJRIiwKICAgICJxIiwKICAgICJNIiwKICAgICJMIiwKICAgICJJIiwKICAgICJkIiwKICAgICJEIiwKICAgICJpIiwKICAgICJ0IiwKICAgICJUIgogIF07Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9JU09XZWVrWWVhclBhcnNlci5qcwp2YXIgSVNPV2Vla1llYXJQYXJzZXIgPSBjbGFzcyBleHRlbmRzIFBhcnNlciB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiSVNPV2Vla1llYXJQYXJzZXIiKTsKICB9CiAgcHJpb3JpdHkgPSAxMzA7CiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4pIHsKICAgIGlmICh0b2tlbiA9PT0gIlIiKSB7CiAgICAgIHJldHVybiBwYXJzZU5EaWdpdHNTaWduZWQoNCwgZGF0ZVN0cmluZyk7CiAgICB9CiAgICByZXR1cm4gcGFyc2VORGlnaXRzU2lnbmVkKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyk7CiAgfQogIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlMikgewogICAgY29uc3QgZmlyc3RXZWVrT2ZZZWFyID0gY29uc3RydWN0RnJvbShkYXRlLCAwKTsKICAgIGZpcnN0V2Vla09mWWVhci5zZXRGdWxsWWVhcih2YWx1ZTIsIDAsIDQpOwogICAgZmlyc3RXZWVrT2ZZZWFyLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgcmV0dXJuIHN0YXJ0T2ZJU09XZWVrKGZpcnN0V2Vla09mWWVhcik7CiAgfQogIGluY29tcGF0aWJsZVRva2VucyA9IFsKICAgICJHIiwKICAgICJ5IiwKICAgICJZIiwKICAgICJ1IiwKICAgICJRIiwKICAgICJxIiwKICAgICJNIiwKICAgICJMIiwKICAgICJ3IiwKICAgICJkIiwKICAgICJEIiwKICAgICJlIiwKICAgICJjIiwKICAgICJ0IiwKICAgICJUIgogIF07Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9FeHRlbmRlZFllYXJQYXJzZXIuanMKdmFyIEV4dGVuZGVkWWVhclBhcnNlciA9IGNsYXNzIGV4dGVuZHMgUGFyc2VyIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJFeHRlbmRlZFllYXJQYXJzZXIiKTsKICB9CiAgcHJpb3JpdHkgPSAxMzA7CiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4pIHsKICAgIGlmICh0b2tlbiA9PT0gInUiKSB7CiAgICAgIHJldHVybiBwYXJzZU5EaWdpdHNTaWduZWQoNCwgZGF0ZVN0cmluZyk7CiAgICB9CiAgICByZXR1cm4gcGFyc2VORGlnaXRzU2lnbmVkKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyk7CiAgfQogIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlMikgewogICAgZGF0ZS5zZXRGdWxsWWVhcih2YWx1ZTIsIDAsIDEpOwogICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICAgIHJldHVybiBkYXRlOwogIH0KICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbIkciLCAieSIsICJZIiwgIlIiLCAidyIsICJJIiwgImkiLCAiZSIsICJjIiwgInQiLCAiVCJdOwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvUXVhcnRlclBhcnNlci5qcwp2YXIgUXVhcnRlclBhcnNlciA9IGNsYXNzIGV4dGVuZHMgUGFyc2VyIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJRdWFydGVyUGFyc2VyIik7CiAgfQogIHByaW9yaXR5ID0gMTIwOwogIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaDIpIHsKICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgLy8gMSwgMiwgMywgNAogICAgICBjYXNlICJRIjoKICAgICAgY2FzZSAiUVEiOgogICAgICAgIHJldHVybiBwYXJzZU5EaWdpdHModG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTsKICAgICAgLy8gMXN0LCAybmQsIDNyZCwgNHRoCiAgICAgIGNhc2UgIlFvIjoKICAgICAgICByZXR1cm4gbWF0Y2gyLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiAicXVhcnRlciIgfSk7CiAgICAgIC8vIFExLCBRMiwgUTMsIFE0CiAgICAgIGNhc2UgIlFRUSI6CiAgICAgICAgcmV0dXJuIG1hdGNoMi5xdWFydGVyKGRhdGVTdHJpbmcsIHsKICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSkgfHwgbWF0Y2gyLnF1YXJ0ZXIoZGF0ZVN0cmluZywgewogICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSk7CiAgICAgIC8vIDEsIDIsIDMsIDQgKG5hcnJvdyBxdWFydGVyOyBjb3VsZCBiZSBub3QgbnVtZXJpY2FsKQogICAgICBjYXNlICJRUVFRUSI6CiAgICAgICAgcmV0dXJuIG1hdGNoMi5xdWFydGVyKGRhdGVTdHJpbmcsIHsKICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pOwogICAgICAvLyAxc3QgcXVhcnRlciwgMm5kIHF1YXJ0ZXIsIC4uLgogICAgICBjYXNlICJRUVFRIjoKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gbWF0Y2gyLnF1YXJ0ZXIoZGF0ZVN0cmluZywgewogICAgICAgICAgd2lkdGg6ICJ3aWRlIiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pIHx8IG1hdGNoMi5xdWFydGVyKGRhdGVTdHJpbmcsIHsKICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSkgfHwgbWF0Y2gyLnF1YXJ0ZXIoZGF0ZVN0cmluZywgewogICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSk7CiAgICB9CiAgfQogIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZTIpIHsKICAgIHJldHVybiB2YWx1ZTIgPj0gMSAmJiB2YWx1ZTIgPD0gNDsKICB9CiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUyKSB7CiAgICBkYXRlLnNldE1vbnRoKCh2YWx1ZTIgLSAxKSAqIDMsIDEpOwogICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICAgIHJldHVybiBkYXRlOwogIH0KICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbCiAgICAiWSIsCiAgICAiUiIsCiAgICAicSIsCiAgICAiTSIsCiAgICAiTCIsCiAgICAidyIsCiAgICAiSSIsCiAgICAiZCIsCiAgICAiRCIsCiAgICAiaSIsCiAgICAiZSIsCiAgICAiYyIsCiAgICAidCIsCiAgICAiVCIKICBdOwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvU3RhbmRBbG9uZVF1YXJ0ZXJQYXJzZXIuanMKdmFyIFN0YW5kQWxvbmVRdWFydGVyUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlN0YW5kQWxvbmVRdWFydGVyUGFyc2VyIik7CiAgfQogIHByaW9yaXR5ID0gMTIwOwogIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaDIpIHsKICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgLy8gMSwgMiwgMywgNAogICAgICBjYXNlICJxIjoKICAgICAgY2FzZSAicXEiOgogICAgICAgIHJldHVybiBwYXJzZU5EaWdpdHModG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTsKICAgICAgLy8gMXN0LCAybmQsIDNyZCwgNHRoCiAgICAgIGNhc2UgInFvIjoKICAgICAgICByZXR1cm4gbWF0Y2gyLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiAicXVhcnRlciIgfSk7CiAgICAgIC8vIFExLCBRMiwgUTMsIFE0CiAgICAgIGNhc2UgInFxcSI6CiAgICAgICAgcmV0dXJuIG1hdGNoMi5xdWFydGVyKGRhdGVTdHJpbmcsIHsKICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgY29udGV4dDogInN0YW5kYWxvbmUiCiAgICAgICAgfSkgfHwgbWF0Y2gyLnF1YXJ0ZXIoZGF0ZVN0cmluZywgewogICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgY29udGV4dDogInN0YW5kYWxvbmUiCiAgICAgICAgfSk7CiAgICAgIC8vIDEsIDIsIDMsIDQgKG5hcnJvdyBxdWFydGVyOyBjb3VsZCBiZSBub3QgbnVtZXJpY2FsKQogICAgICBjYXNlICJxcXFxcSI6CiAgICAgICAgcmV0dXJuIG1hdGNoMi5xdWFydGVyKGRhdGVTdHJpbmcsIHsKICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgIGNvbnRleHQ6ICJzdGFuZGFsb25lIgogICAgICAgIH0pOwogICAgICAvLyAxc3QgcXVhcnRlciwgMm5kIHF1YXJ0ZXIsIC4uLgogICAgICBjYXNlICJxcXFxIjoKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gbWF0Y2gyLnF1YXJ0ZXIoZGF0ZVN0cmluZywgewogICAgICAgICAgd2lkdGg6ICJ3aWRlIiwKICAgICAgICAgIGNvbnRleHQ6ICJzdGFuZGFsb25lIgogICAgICAgIH0pIHx8IG1hdGNoMi5xdWFydGVyKGRhdGVTdHJpbmcsIHsKICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgY29udGV4dDogInN0YW5kYWxvbmUiCiAgICAgICAgfSkgfHwgbWF0Y2gyLnF1YXJ0ZXIoZGF0ZVN0cmluZywgewogICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgY29udGV4dDogInN0YW5kYWxvbmUiCiAgICAgICAgfSk7CiAgICB9CiAgfQogIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZTIpIHsKICAgIHJldHVybiB2YWx1ZTIgPj0gMSAmJiB2YWx1ZTIgPD0gNDsKICB9CiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUyKSB7CiAgICBkYXRlLnNldE1vbnRoKCh2YWx1ZTIgLSAxKSAqIDMsIDEpOwogICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICAgIHJldHVybiBkYXRlOwogIH0KICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbCiAgICAiWSIsCiAgICAiUiIsCiAgICAiUSIsCiAgICAiTSIsCiAgICAiTCIsCiAgICAidyIsCiAgICAiSSIsCiAgICAiZCIsCiAgICAiRCIsCiAgICAiaSIsCiAgICAiZSIsCiAgICAiYyIsCiAgICAidCIsCiAgICAiVCIKICBdOwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvTW9udGhQYXJzZXIuanMKdmFyIE1vbnRoUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIk1vbnRoUGFyc2VyIik7CiAgfQogIGluY29tcGF0aWJsZVRva2VucyA9IFsKICAgICJZIiwKICAgICJSIiwKICAgICJxIiwKICAgICJRIiwKICAgICJMIiwKICAgICJ3IiwKICAgICJJIiwKICAgICJEIiwKICAgICJpIiwKICAgICJlIiwKICAgICJjIiwKICAgICJ0IiwKICAgICJUIgogIF07CiAgcHJpb3JpdHkgPSAxMTA7CiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoMikgewogICAgY29uc3QgdmFsdWVDYWxsYmFjayA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHZhbHVlMikgPT4gdmFsdWUyIC0gMSwgInZhbHVlQ2FsbGJhY2siKTsKICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgLy8gMSwgMiwgLi4uLCAxMgogICAgICBjYXNlICJNIjoKICAgICAgICByZXR1cm4gbWFwVmFsdWUoCiAgICAgICAgICBwYXJzZU51bWVyaWNQYXR0ZXJuKG51bWVyaWNQYXR0ZXJucy5tb250aCwgZGF0ZVN0cmluZyksCiAgICAgICAgICB2YWx1ZUNhbGxiYWNrCiAgICAgICAgKTsKICAgICAgLy8gMDEsIDAyLCAuLi4sIDEyCiAgICAgIGNhc2UgIk1NIjoKICAgICAgICByZXR1cm4gbWFwVmFsdWUocGFyc2VORGlnaXRzKDIsIGRhdGVTdHJpbmcpLCB2YWx1ZUNhbGxiYWNrKTsKICAgICAgLy8gMXN0LCAybmQsIC4uLiwgMTJ0aAogICAgICBjYXNlICJNbyI6CiAgICAgICAgcmV0dXJuIG1hcFZhbHVlKAogICAgICAgICAgbWF0Y2gyLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgewogICAgICAgICAgICB1bml0OiAibW9udGgiCiAgICAgICAgICB9KSwKICAgICAgICAgIHZhbHVlQ2FsbGJhY2sKICAgICAgICApOwogICAgICAvLyBKYW4sIEZlYiwgLi4uLCBEZWMKICAgICAgY2FzZSAiTU1NIjoKICAgICAgICByZXR1cm4gbWF0Y2gyLm1vbnRoKGRhdGVTdHJpbmcsIHsKICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSkgfHwgbWF0Y2gyLm1vbnRoKGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJuYXJyb3ciLCBjb250ZXh0OiAiZm9ybWF0dGluZyIgfSk7CiAgICAgIC8vIEosIEYsIC4uLiwgRAogICAgICBjYXNlICJNTU1NTSI6CiAgICAgICAgcmV0dXJuIG1hdGNoMi5tb250aChkYXRlU3RyaW5nLCB7CiAgICAgICAgICB3aWR0aDogIm5hcnJvdyIsCiAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICB9KTsKICAgICAgLy8gSmFudWFyeSwgRmVicnVhcnksIC4uLiwgRGVjZW1iZXIKICAgICAgY2FzZSAiTU1NTSI6CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIG1hdGNoMi5tb250aChkYXRlU3RyaW5nLCB7IHdpZHRoOiAid2lkZSIsIGNvbnRleHQ6ICJmb3JtYXR0aW5nIiB9KSB8fCBtYXRjaDIubW9udGgoZGF0ZVN0cmluZywgewogICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICB9KSB8fCBtYXRjaDIubW9udGgoZGF0ZVN0cmluZywgeyB3aWR0aDogIm5hcnJvdyIsIGNvbnRleHQ6ICJmb3JtYXR0aW5nIiB9KTsKICAgIH0KICB9CiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlMikgewogICAgcmV0dXJuIHZhbHVlMiA+PSAwICYmIHZhbHVlMiA8PSAxMTsKICB9CiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUyKSB7CiAgICBkYXRlLnNldE1vbnRoKHZhbHVlMiwgMSk7CiAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgcmV0dXJuIGRhdGU7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvU3RhbmRBbG9uZU1vbnRoUGFyc2VyLmpzCnZhciBTdGFuZEFsb25lTW9udGhQYXJzZXIgPSBjbGFzcyBleHRlbmRzIFBhcnNlciB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiU3RhbmRBbG9uZU1vbnRoUGFyc2VyIik7CiAgfQogIHByaW9yaXR5ID0gMTEwOwogIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaDIpIHsKICAgIGNvbnN0IHZhbHVlQ2FsbGJhY2sgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh2YWx1ZTIpID0+IHZhbHVlMiAtIDEsICJ2YWx1ZUNhbGxiYWNrIik7CiAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgIC8vIDEsIDIsIC4uLiwgMTIKICAgICAgY2FzZSAiTCI6CiAgICAgICAgcmV0dXJuIG1hcFZhbHVlKAogICAgICAgICAgcGFyc2VOdW1lcmljUGF0dGVybihudW1lcmljUGF0dGVybnMubW9udGgsIGRhdGVTdHJpbmcpLAogICAgICAgICAgdmFsdWVDYWxsYmFjawogICAgICAgICk7CiAgICAgIC8vIDAxLCAwMiwgLi4uLCAxMgogICAgICBjYXNlICJMTCI6CiAgICAgICAgcmV0dXJuIG1hcFZhbHVlKHBhcnNlTkRpZ2l0cygyLCBkYXRlU3RyaW5nKSwgdmFsdWVDYWxsYmFjayk7CiAgICAgIC8vIDFzdCwgMm5kLCAuLi4sIDEydGgKICAgICAgY2FzZSAiTG8iOgogICAgICAgIHJldHVybiBtYXBWYWx1ZSgKICAgICAgICAgIG1hdGNoMi5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgdW5pdDogIm1vbnRoIgogICAgICAgICAgfSksCiAgICAgICAgICB2YWx1ZUNhbGxiYWNrCiAgICAgICAgKTsKICAgICAgLy8gSmFuLCBGZWIsIC4uLiwgRGVjCiAgICAgIGNhc2UgIkxMTCI6CiAgICAgICAgcmV0dXJuIG1hdGNoMi5tb250aChkYXRlU3RyaW5nLCB7CiAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgIGNvbnRleHQ6ICJzdGFuZGFsb25lIgogICAgICAgIH0pIHx8IG1hdGNoMi5tb250aChkYXRlU3RyaW5nLCB7IHdpZHRoOiAibmFycm93IiwgY29udGV4dDogInN0YW5kYWxvbmUiIH0pOwogICAgICAvLyBKLCBGLCAuLi4sIEQKICAgICAgY2FzZSAiTExMTEwiOgogICAgICAgIHJldHVybiBtYXRjaDIubW9udGgoZGF0ZVN0cmluZywgewogICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgY29udGV4dDogInN0YW5kYWxvbmUiCiAgICAgICAgfSk7CiAgICAgIC8vIEphbnVhcnksIEZlYnJ1YXJ5LCAuLi4sIERlY2VtYmVyCiAgICAgIGNhc2UgIkxMTEwiOgogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBtYXRjaDIubW9udGgoZGF0ZVN0cmluZywgeyB3aWR0aDogIndpZGUiLCBjb250ZXh0OiAic3RhbmRhbG9uZSIgfSkgfHwgbWF0Y2gyLm1vbnRoKGRhdGVTdHJpbmcsIHsKICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgY29udGV4dDogInN0YW5kYWxvbmUiCiAgICAgICAgfSkgfHwgbWF0Y2gyLm1vbnRoKGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJuYXJyb3ciLCBjb250ZXh0OiAic3RhbmRhbG9uZSIgfSk7CiAgICB9CiAgfQogIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZTIpIHsKICAgIHJldHVybiB2YWx1ZTIgPj0gMCAmJiB2YWx1ZTIgPD0gMTE7CiAgfQogIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlMikgewogICAgZGF0ZS5zZXRNb250aCh2YWx1ZTIsIDEpOwogICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICAgIHJldHVybiBkYXRlOwogIH0KICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbCiAgICAiWSIsCiAgICAiUiIsCiAgICAicSIsCiAgICAiUSIsCiAgICAiTSIsCiAgICAidyIsCiAgICAiSSIsCiAgICAiRCIsCiAgICAiaSIsCiAgICAiZSIsCiAgICAiYyIsCiAgICAidCIsCiAgICAiVCIKICBdOwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRXZWVrLmpzCmZ1bmN0aW9uIHNldFdlZWsoZGF0ZSwgd2Vlaywgb3B0aW9ucykgewogIGNvbnN0IGRhdGVfID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCBkaWZmID0gZ2V0V2VlayhkYXRlXywgb3B0aW9ucykgLSB3ZWVrOwogIGRhdGVfLnNldERhdGUoZGF0ZV8uZ2V0RGF0ZSgpIC0gZGlmZiAqIDcpOwogIHJldHVybiB0b0RhdGUoZGF0ZV8sIG9wdGlvbnM/LmluKTsKfQpfX25hbWUoc2V0V2VlaywgInNldFdlZWsiKTsKdmFyIHNldFdlZWtfZGVmYXVsdCA9IHNldFdlZWs7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9Mb2NhbFdlZWtQYXJzZXIuanMKdmFyIExvY2FsV2Vla1BhcnNlciA9IGNsYXNzIGV4dGVuZHMgUGFyc2VyIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJMb2NhbFdlZWtQYXJzZXIiKTsKICB9CiAgcHJpb3JpdHkgPSAxMDA7CiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoMikgewogICAgc3dpdGNoICh0b2tlbikgewogICAgICBjYXNlICJ3IjoKICAgICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihudW1lcmljUGF0dGVybnMud2VlaywgZGF0ZVN0cmluZyk7CiAgICAgIGNhc2UgIndvIjoKICAgICAgICByZXR1cm4gbWF0Y2gyLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiAid2VlayIgfSk7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIHBhcnNlTkRpZ2l0cyh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpOwogICAgfQogIH0KICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUyKSB7CiAgICByZXR1cm4gdmFsdWUyID49IDEgJiYgdmFsdWUyIDw9IDUzOwogIH0KICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZTIsIG9wdGlvbnMpIHsKICAgIHJldHVybiBzdGFydE9mV2VlayhzZXRXZWVrKGRhdGUsIHZhbHVlMiwgb3B0aW9ucyksIG9wdGlvbnMpOwogIH0KICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbCiAgICAieSIsCiAgICAiUiIsCiAgICAidSIsCiAgICAicSIsCiAgICAiUSIsCiAgICAiTSIsCiAgICAiTCIsCiAgICAiSSIsCiAgICAiZCIsCiAgICAiRCIsCiAgICAiaSIsCiAgICAidCIsCiAgICAiVCIKICBdOwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRJU09XZWVrLmpzCmZ1bmN0aW9uIHNldElTT1dlZWsoZGF0ZSwgd2Vlaywgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCBkaWZmID0gZ2V0SVNPV2VlayhfZGF0ZSwgb3B0aW9ucykgLSB3ZWVrOwogIF9kYXRlLnNldERhdGUoX2RhdGUuZ2V0RGF0ZSgpIC0gZGlmZiAqIDcpOwogIHJldHVybiBfZGF0ZTsKfQpfX25hbWUoc2V0SVNPV2VlaywgInNldElTT1dlZWsiKTsKdmFyIHNldElTT1dlZWtfZGVmYXVsdCA9IHNldElTT1dlZWs7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9JU09XZWVrUGFyc2VyLmpzCnZhciBJU09XZWVrUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIklTT1dlZWtQYXJzZXIiKTsKICB9CiAgcHJpb3JpdHkgPSAxMDA7CiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoMikgewogICAgc3dpdGNoICh0b2tlbikgewogICAgICBjYXNlICJJIjoKICAgICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihudW1lcmljUGF0dGVybnMud2VlaywgZGF0ZVN0cmluZyk7CiAgICAgIGNhc2UgIklvIjoKICAgICAgICByZXR1cm4gbWF0Y2gyLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiAid2VlayIgfSk7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIHBhcnNlTkRpZ2l0cyh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpOwogICAgfQogIH0KICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUyKSB7CiAgICByZXR1cm4gdmFsdWUyID49IDEgJiYgdmFsdWUyIDw9IDUzOwogIH0KICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZTIpIHsKICAgIHJldHVybiBzdGFydE9mSVNPV2VlayhzZXRJU09XZWVrKGRhdGUsIHZhbHVlMikpOwogIH0KICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbCiAgICAieSIsCiAgICAiWSIsCiAgICAidSIsCiAgICAicSIsCiAgICAiUSIsCiAgICAiTSIsCiAgICAiTCIsCiAgICAidyIsCiAgICAiZCIsCiAgICAiRCIsCiAgICAiZSIsCiAgICAiYyIsCiAgICAidCIsCiAgICAiVCIKICBdOwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvRGF0ZVBhcnNlci5qcwp2YXIgREFZU19JTl9NT05USCA9IFszMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXTsKdmFyIERBWVNfSU5fTU9OVEhfTEVBUF9ZRUFSID0gWwogIDMxLAogIDI5LAogIDMxLAogIDMwLAogIDMxLAogIDMwLAogIDMxLAogIDMxLAogIDMwLAogIDMxLAogIDMwLAogIDMxCl07CnZhciBEYXRlUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkRhdGVQYXJzZXIiKTsKICB9CiAgcHJpb3JpdHkgPSA5MDsKICBzdWJQcmlvcml0eSA9IDE7CiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoMikgewogICAgc3dpdGNoICh0b2tlbikgewogICAgICBjYXNlICJkIjoKICAgICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihudW1lcmljUGF0dGVybnMuZGF0ZSwgZGF0ZVN0cmluZyk7CiAgICAgIGNhc2UgImRvIjoKICAgICAgICByZXR1cm4gbWF0Y2gyLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiAiZGF0ZSIgfSk7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIHBhcnNlTkRpZ2l0cyh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpOwogICAgfQogIH0KICB2YWxpZGF0ZShkYXRlLCB2YWx1ZTIpIHsKICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7CiAgICBjb25zdCBpc0xlYXBZZWFyMiA9IGlzTGVhcFllYXJJbmRleCh5ZWFyKTsKICAgIGNvbnN0IG1vbnRoID0gZGF0ZS5nZXRNb250aCgpOwogICAgaWYgKGlzTGVhcFllYXIyKSB7CiAgICAgIHJldHVybiB2YWx1ZTIgPj0gMSAmJiB2YWx1ZTIgPD0gREFZU19JTl9NT05USF9MRUFQX1lFQVJbbW9udGhdOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHZhbHVlMiA+PSAxICYmIHZhbHVlMiA8PSBEQVlTX0lOX01PTlRIW21vbnRoXTsKICAgIH0KICB9CiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUyKSB7CiAgICBkYXRlLnNldERhdGUodmFsdWUyKTsKICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgICByZXR1cm4gZGF0ZTsKICB9CiAgaW5jb21wYXRpYmxlVG9rZW5zID0gWwogICAgIlkiLAogICAgIlIiLAogICAgInEiLAogICAgIlEiLAogICAgInciLAogICAgIkkiLAogICAgIkQiLAogICAgImkiLAogICAgImUiLAogICAgImMiLAogICAgInQiLAogICAgIlQiCiAgXTsKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0RheU9mWWVhclBhcnNlci5qcwp2YXIgRGF5T2ZZZWFyUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkRheU9mWWVhclBhcnNlciIpOwogIH0KICBwcmlvcml0eSA9IDkwOwogIHN1YnByaW9yaXR5ID0gMTsKICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gyKSB7CiAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgIGNhc2UgIkQiOgogICAgICBjYXNlICJERCI6CiAgICAgICAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4obnVtZXJpY1BhdHRlcm5zLmRheU9mWWVhciwgZGF0ZVN0cmluZyk7CiAgICAgIGNhc2UgIkRvIjoKICAgICAgICByZXR1cm4gbWF0Y2gyLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiAiZGF0ZSIgfSk7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIHBhcnNlTkRpZ2l0cyh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpOwogICAgfQogIH0KICB2YWxpZGF0ZShkYXRlLCB2YWx1ZTIpIHsKICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7CiAgICBjb25zdCBpc0xlYXBZZWFyMiA9IGlzTGVhcFllYXJJbmRleCh5ZWFyKTsKICAgIGlmIChpc0xlYXBZZWFyMikgewogICAgICByZXR1cm4gdmFsdWUyID49IDEgJiYgdmFsdWUyIDw9IDM2NjsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB2YWx1ZTIgPj0gMSAmJiB2YWx1ZTIgPD0gMzY1OwogICAgfQogIH0KICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZTIpIHsKICAgIGRhdGUuc2V0TW9udGgoMCwgdmFsdWUyKTsKICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgICByZXR1cm4gZGF0ZTsKICB9CiAgaW5jb21wYXRpYmxlVG9rZW5zID0gWwogICAgIlkiLAogICAgIlIiLAogICAgInEiLAogICAgIlEiLAogICAgIk0iLAogICAgIkwiLAogICAgInciLAogICAgIkkiLAogICAgImQiLAogICAgIkUiLAogICAgImkiLAogICAgImUiLAogICAgImMiLAogICAgInQiLAogICAgIlQiCiAgXTsKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0RGF5LmpzCmZ1bmN0aW9uIHNldERheShkYXRlLCBkYXksIG9wdGlvbnMpIHsKICBjb25zdCBkZWZhdWx0T3B0aW9uczIgPSBnZXREZWZhdWx0T3B0aW9ucygpOwogIGNvbnN0IHdlZWtTdGFydHNPbiA9IG9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyBkZWZhdWx0T3B0aW9uczIud2Vla1N0YXJ0c09uID8/IGRlZmF1bHRPcHRpb25zMi5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyAwOwogIGNvbnN0IGRhdGVfID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCBjdXJyZW50RGF5ID0gZGF0ZV8uZ2V0RGF5KCk7CiAgY29uc3QgcmVtYWluZGVyID0gZGF5ICUgNzsKICBjb25zdCBkYXlJbmRleCA9IChyZW1haW5kZXIgKyA3KSAlIDc7CiAgY29uc3QgZGVsdGEgPSA3IC0gd2Vla1N0YXJ0c09uOwogIGNvbnN0IGRpZmYgPSBkYXkgPCAwIHx8IGRheSA+IDYgPyBkYXkgLSAoY3VycmVudERheSArIGRlbHRhKSAlIDcgOiAoZGF5SW5kZXggKyBkZWx0YSkgJSA3IC0gKGN1cnJlbnREYXkgKyBkZWx0YSkgJSA3OwogIHJldHVybiBhZGREYXlzKGRhdGVfLCBkaWZmLCBvcHRpb25zKTsKfQpfX25hbWUoc2V0RGF5LCAic2V0RGF5Iik7CnZhciBzZXREYXlfZGVmYXVsdCA9IHNldERheTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0RheVBhcnNlci5qcwp2YXIgRGF5UGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkRheVBhcnNlciIpOwogIH0KICBwcmlvcml0eSA9IDkwOwogIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaDIpIHsKICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgLy8gVHVlCiAgICAgIGNhc2UgIkUiOgogICAgICBjYXNlICJFRSI6CiAgICAgIGNhc2UgIkVFRSI6CiAgICAgICAgcmV0dXJuIG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgewogICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICB9KSB8fCBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJzaG9ydCIsIGNvbnRleHQ6ICJmb3JtYXR0aW5nIiB9KSB8fCBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJuYXJyb3ciLCBjb250ZXh0OiAiZm9ybWF0dGluZyIgfSk7CiAgICAgIC8vIFQKICAgICAgY2FzZSAiRUVFRUUiOgogICAgICAgIHJldHVybiBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsKICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pOwogICAgICAvLyBUdQogICAgICBjYXNlICJFRUVFRUUiOgogICAgICAgIHJldHVybiBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJzaG9ydCIsIGNvbnRleHQ6ICJmb3JtYXR0aW5nIiB9KSB8fCBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJuYXJyb3ciLCBjb250ZXh0OiAiZm9ybWF0dGluZyIgfSk7CiAgICAgIC8vIFR1ZXNkYXkKICAgICAgY2FzZSAiRUVFRSI6CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogIndpZGUiLCBjb250ZXh0OiAiZm9ybWF0dGluZyIgfSkgfHwgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7CiAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pIHx8IG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogInNob3J0IiwgY29udGV4dDogImZvcm1hdHRpbmciIH0pIHx8IG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogIm5hcnJvdyIsIGNvbnRleHQ6ICJmb3JtYXR0aW5nIiB9KTsKICAgIH0KICB9CiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlMikgewogICAgcmV0dXJuIHZhbHVlMiA+PSAwICYmIHZhbHVlMiA8PSA2OwogIH0KICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZTIsIG9wdGlvbnMpIHsKICAgIGRhdGUgPSBzZXREYXkoZGF0ZSwgdmFsdWUyLCBvcHRpb25zKTsKICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgICByZXR1cm4gZGF0ZTsKICB9CiAgaW5jb21wYXRpYmxlVG9rZW5zID0gWyJEIiwgImkiLCAiZSIsICJjIiwgInQiLCAiVCJdOwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvTG9jYWxEYXlQYXJzZXIuanMKdmFyIExvY2FsRGF5UGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkxvY2FsRGF5UGFyc2VyIik7CiAgfQogIHByaW9yaXR5ID0gOTA7CiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoMiwgb3B0aW9ucykgewogICAgY29uc3QgdmFsdWVDYWxsYmFjayA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHZhbHVlMikgPT4gewogICAgICBjb25zdCB3aG9sZVdlZWtEYXlzID0gTWF0aC5mbG9vcigodmFsdWUyIC0gMSkgLyA3KSAqIDc7CiAgICAgIHJldHVybiAodmFsdWUyICsgb3B0aW9ucy53ZWVrU3RhcnRzT24gKyA2KSAlIDcgKyB3aG9sZVdlZWtEYXlzOwogICAgfSwgInZhbHVlQ2FsbGJhY2siKTsKICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgLy8gMwogICAgICBjYXNlICJlIjoKICAgICAgY2FzZSAiZWUiOgogICAgICAgIHJldHVybiBtYXBWYWx1ZShwYXJzZU5EaWdpdHModG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKSwgdmFsdWVDYWxsYmFjayk7CiAgICAgIC8vIDNyZAogICAgICBjYXNlICJlbyI6CiAgICAgICAgcmV0dXJuIG1hcFZhbHVlKAogICAgICAgICAgbWF0Y2gyLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgewogICAgICAgICAgICB1bml0OiAiZGF5IgogICAgICAgICAgfSksCiAgICAgICAgICB2YWx1ZUNhbGxiYWNrCiAgICAgICAgKTsKICAgICAgLy8gVHVlCiAgICAgIGNhc2UgImVlZSI6CiAgICAgICAgcmV0dXJuIG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgewogICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICB9KSB8fCBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJzaG9ydCIsIGNvbnRleHQ6ICJmb3JtYXR0aW5nIiB9KSB8fCBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJuYXJyb3ciLCBjb250ZXh0OiAiZm9ybWF0dGluZyIgfSk7CiAgICAgIC8vIFQKICAgICAgY2FzZSAiZWVlZWUiOgogICAgICAgIHJldHVybiBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsKICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pOwogICAgICAvLyBUdQogICAgICBjYXNlICJlZWVlZWUiOgogICAgICAgIHJldHVybiBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJzaG9ydCIsIGNvbnRleHQ6ICJmb3JtYXR0aW5nIiB9KSB8fCBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJuYXJyb3ciLCBjb250ZXh0OiAiZm9ybWF0dGluZyIgfSk7CiAgICAgIC8vIFR1ZXNkYXkKICAgICAgY2FzZSAiZWVlZSI6CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogIndpZGUiLCBjb250ZXh0OiAiZm9ybWF0dGluZyIgfSkgfHwgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7CiAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pIHx8IG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogInNob3J0IiwgY29udGV4dDogImZvcm1hdHRpbmciIH0pIHx8IG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogIm5hcnJvdyIsIGNvbnRleHQ6ICJmb3JtYXR0aW5nIiB9KTsKICAgIH0KICB9CiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlMikgewogICAgcmV0dXJuIHZhbHVlMiA+PSAwICYmIHZhbHVlMiA8PSA2OwogIH0KICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZTIsIG9wdGlvbnMpIHsKICAgIGRhdGUgPSBzZXREYXkoZGF0ZSwgdmFsdWUyLCBvcHRpb25zKTsKICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgICByZXR1cm4gZGF0ZTsKICB9CiAgaW5jb21wYXRpYmxlVG9rZW5zID0gWwogICAgInkiLAogICAgIlIiLAogICAgInUiLAogICAgInEiLAogICAgIlEiLAogICAgIk0iLAogICAgIkwiLAogICAgIkkiLAogICAgImQiLAogICAgIkQiLAogICAgIkUiLAogICAgImkiLAogICAgImMiLAogICAgInQiLAogICAgIlQiCiAgXTsKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL1N0YW5kQWxvbmVMb2NhbERheVBhcnNlci5qcwp2YXIgU3RhbmRBbG9uZUxvY2FsRGF5UGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlN0YW5kQWxvbmVMb2NhbERheVBhcnNlciIpOwogIH0KICBwcmlvcml0eSA9IDkwOwogIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaDIsIG9wdGlvbnMpIHsKICAgIGNvbnN0IHZhbHVlQ2FsbGJhY2sgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh2YWx1ZTIpID0+IHsKICAgICAgY29uc3Qgd2hvbGVXZWVrRGF5cyA9IE1hdGguZmxvb3IoKHZhbHVlMiAtIDEpIC8gNykgKiA3OwogICAgICByZXR1cm4gKHZhbHVlMiArIG9wdGlvbnMud2Vla1N0YXJ0c09uICsgNikgJSA3ICsgd2hvbGVXZWVrRGF5czsKICAgIH0sICJ2YWx1ZUNhbGxiYWNrIik7CiAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgIC8vIDMKICAgICAgY2FzZSAiYyI6CiAgICAgIGNhc2UgImNjIjoKICAgICAgICByZXR1cm4gbWFwVmFsdWUocGFyc2VORGlnaXRzKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyksIHZhbHVlQ2FsbGJhY2spOwogICAgICAvLyAzcmQKICAgICAgY2FzZSAiY28iOgogICAgICAgIHJldHVybiBtYXBWYWx1ZSgKICAgICAgICAgIG1hdGNoMi5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgdW5pdDogImRheSIKICAgICAgICAgIH0pLAogICAgICAgICAgdmFsdWVDYWxsYmFjawogICAgICAgICk7CiAgICAgIC8vIFR1ZQogICAgICBjYXNlICJjY2MiOgogICAgICAgIHJldHVybiBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsKICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgY29udGV4dDogInN0YW5kYWxvbmUiCiAgICAgICAgfSkgfHwgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiAic2hvcnQiLCBjb250ZXh0OiAic3RhbmRhbG9uZSIgfSkgfHwgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiAibmFycm93IiwgY29udGV4dDogInN0YW5kYWxvbmUiIH0pOwogICAgICAvLyBUCiAgICAgIGNhc2UgImNjY2NjIjoKICAgICAgICByZXR1cm4gbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7CiAgICAgICAgICB3aWR0aDogIm5hcnJvdyIsCiAgICAgICAgICBjb250ZXh0OiAic3RhbmRhbG9uZSIKICAgICAgICB9KTsKICAgICAgLy8gVHUKICAgICAgY2FzZSAiY2NjY2NjIjoKICAgICAgICByZXR1cm4gbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiAic2hvcnQiLCBjb250ZXh0OiAic3RhbmRhbG9uZSIgfSkgfHwgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiAibmFycm93IiwgY29udGV4dDogInN0YW5kYWxvbmUiIH0pOwogICAgICAvLyBUdWVzZGF5CiAgICAgIGNhc2UgImNjY2MiOgogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJ3aWRlIiwgY29udGV4dDogInN0YW5kYWxvbmUiIH0pIHx8IG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgewogICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICBjb250ZXh0OiAic3RhbmRhbG9uZSIKICAgICAgICB9KSB8fCBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJzaG9ydCIsIGNvbnRleHQ6ICJzdGFuZGFsb25lIiB9KSB8fCBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJuYXJyb3ciLCBjb250ZXh0OiAic3RhbmRhbG9uZSIgfSk7CiAgICB9CiAgfQogIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZTIpIHsKICAgIHJldHVybiB2YWx1ZTIgPj0gMCAmJiB2YWx1ZTIgPD0gNjsKICB9CiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUyLCBvcHRpb25zKSB7CiAgICBkYXRlID0gc2V0RGF5KGRhdGUsIHZhbHVlMiwgb3B0aW9ucyk7CiAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgcmV0dXJuIGRhdGU7CiAgfQogIGluY29tcGF0aWJsZVRva2VucyA9IFsKICAgICJ5IiwKICAgICJSIiwKICAgICJ1IiwKICAgICJxIiwKICAgICJRIiwKICAgICJNIiwKICAgICJMIiwKICAgICJJIiwKICAgICJkIiwKICAgICJEIiwKICAgICJFIiwKICAgICJpIiwKICAgICJlIiwKICAgICJ0IiwKICAgICJUIgogIF07Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldElTT0RheS5qcwpmdW5jdGlvbiBzZXRJU09EYXkoZGF0ZSwgZGF5LCBvcHRpb25zKSB7CiAgY29uc3QgZGF0ZV8gPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGNvbnN0IGN1cnJlbnREYXkgPSBnZXRJU09EYXkoZGF0ZV8sIG9wdGlvbnMpOwogIGNvbnN0IGRpZmYgPSBkYXkgLSBjdXJyZW50RGF5OwogIHJldHVybiBhZGREYXlzKGRhdGVfLCBkaWZmLCBvcHRpb25zKTsKfQpfX25hbWUoc2V0SVNPRGF5LCAic2V0SVNPRGF5Iik7CnZhciBzZXRJU09EYXlfZGVmYXVsdCA9IHNldElTT0RheTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0lTT0RheVBhcnNlci5qcwp2YXIgSVNPRGF5UGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIklTT0RheVBhcnNlciIpOwogIH0KICBwcmlvcml0eSA9IDkwOwogIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaDIpIHsKICAgIGNvbnN0IHZhbHVlQ2FsbGJhY2sgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh2YWx1ZTIpID0+IHsKICAgICAgaWYgKHZhbHVlMiA9PT0gMCkgewogICAgICAgIHJldHVybiA3OwogICAgICB9CiAgICAgIHJldHVybiB2YWx1ZTI7CiAgICB9LCAidmFsdWVDYWxsYmFjayIpOwogICAgc3dpdGNoICh0b2tlbikgewogICAgICAvLyAyCiAgICAgIGNhc2UgImkiOgogICAgICBjYXNlICJpaSI6CiAgICAgICAgcmV0dXJuIHBhcnNlTkRpZ2l0cyh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpOwogICAgICAvLyAybmQKICAgICAgY2FzZSAiaW8iOgogICAgICAgIHJldHVybiBtYXRjaDIub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7IHVuaXQ6ICJkYXkiIH0pOwogICAgICAvLyBUdWUKICAgICAgY2FzZSAiaWlpIjoKICAgICAgICByZXR1cm4gbWFwVmFsdWUoCiAgICAgICAgICBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgfSkgfHwgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgIHdpZHRoOiAic2hvcnQiLAogICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgIH0pIHx8IG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgewogICAgICAgICAgICB3aWR0aDogIm5hcnJvdyIsCiAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgfSksCiAgICAgICAgICB2YWx1ZUNhbGxiYWNrCiAgICAgICAgKTsKICAgICAgLy8gVAogICAgICBjYXNlICJpaWlpaSI6CiAgICAgICAgcmV0dXJuIG1hcFZhbHVlKAogICAgICAgICAgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICB9KSwKICAgICAgICAgIHZhbHVlQ2FsbGJhY2sKICAgICAgICApOwogICAgICAvLyBUdQogICAgICBjYXNlICJpaWlpaWkiOgogICAgICAgIHJldHVybiBtYXBWYWx1ZSgKICAgICAgICAgIG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgewogICAgICAgICAgICB3aWR0aDogInNob3J0IiwKICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICB9KSB8fCBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgIH0pLAogICAgICAgICAgdmFsdWVDYWxsYmFjawogICAgICAgICk7CiAgICAgIC8vIFR1ZXNkYXkKICAgICAgY2FzZSAiaWlpaSI6CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIG1hcFZhbHVlKAogICAgICAgICAgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgIHdpZHRoOiAid2lkZSIsCiAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgfSkgfHwgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgIH0pIHx8IG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgewogICAgICAgICAgICB3aWR0aDogInNob3J0IiwKICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICB9KSB8fCBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgIH0pLAogICAgICAgICAgdmFsdWVDYWxsYmFjawogICAgICAgICk7CiAgICB9CiAgfQogIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZTIpIHsKICAgIHJldHVybiB2YWx1ZTIgPj0gMSAmJiB2YWx1ZTIgPD0gNzsKICB9CiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUyKSB7CiAgICBkYXRlID0gc2V0SVNPRGF5KGRhdGUsIHZhbHVlMik7CiAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgcmV0dXJuIGRhdGU7CiAgfQogIGluY29tcGF0aWJsZVRva2VucyA9IFsKICAgICJ5IiwKICAgICJZIiwKICAgICJ1IiwKICAgICJxIiwKICAgICJRIiwKICAgICJNIiwKICAgICJMIiwKICAgICJ3IiwKICAgICJkIiwKICAgICJEIiwKICAgICJFIiwKICAgICJlIiwKICAgICJjIiwKICAgICJ0IiwKICAgICJUIgogIF07Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9BTVBNUGFyc2VyLmpzCnZhciBBTVBNUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkFNUE1QYXJzZXIiKTsKICB9CiAgcHJpb3JpdHkgPSA4MDsKICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gyKSB7CiAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgIGNhc2UgImEiOgogICAgICBjYXNlICJhYSI6CiAgICAgIGNhc2UgImFhYSI6CiAgICAgICAgcmV0dXJuIG1hdGNoMi5kYXlQZXJpb2QoZGF0ZVN0cmluZywgewogICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICB9KSB8fCBtYXRjaDIuZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHsKICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pOwogICAgICBjYXNlICJhYWFhYSI6CiAgICAgICAgcmV0dXJuIG1hdGNoMi5kYXlQZXJpb2QoZGF0ZVN0cmluZywgewogICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSk7CiAgICAgIGNhc2UgImFhYWEiOgogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBtYXRjaDIuZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHsKICAgICAgICAgIHdpZHRoOiAid2lkZSIsCiAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICB9KSB8fCBtYXRjaDIuZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHsKICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSkgfHwgbWF0Y2gyLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7CiAgICAgICAgICB3aWR0aDogIm5hcnJvdyIsCiAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICB9KTsKICAgIH0KICB9CiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUyKSB7CiAgICBkYXRlLnNldEhvdXJzKGRheVBlcmlvZEVudW1Ub0hvdXJzKHZhbHVlMiksIDAsIDAsIDApOwogICAgcmV0dXJuIGRhdGU7CiAgfQogIGluY29tcGF0aWJsZVRva2VucyA9IFsiYiIsICJCIiwgIkgiLCAiayIsICJ0IiwgIlQiXTsKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0FNUE1NaWRuaWdodFBhcnNlci5qcwp2YXIgQU1QTU1pZG5pZ2h0UGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkFNUE1NaWRuaWdodFBhcnNlciIpOwogIH0KICBwcmlvcml0eSA9IDgwOwogIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaDIpIHsKICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgY2FzZSAiYiI6CiAgICAgIGNhc2UgImJiIjoKICAgICAgY2FzZSAiYmJiIjoKICAgICAgICByZXR1cm4gbWF0Y2gyLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7CiAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pIHx8IG1hdGNoMi5kYXlQZXJpb2QoZGF0ZVN0cmluZywgewogICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSk7CiAgICAgIGNhc2UgImJiYmJiIjoKICAgICAgICByZXR1cm4gbWF0Y2gyLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7CiAgICAgICAgICB3aWR0aDogIm5hcnJvdyIsCiAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICB9KTsKICAgICAgY2FzZSAiYmJiYiI6CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIG1hdGNoMi5kYXlQZXJpb2QoZGF0ZVN0cmluZywgewogICAgICAgICAgd2lkdGg6ICJ3aWRlIiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pIHx8IG1hdGNoMi5kYXlQZXJpb2QoZGF0ZVN0cmluZywgewogICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICB9KSB8fCBtYXRjaDIuZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHsKICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pOwogICAgfQogIH0KICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZTIpIHsKICAgIGRhdGUuc2V0SG91cnMoZGF5UGVyaW9kRW51bVRvSG91cnModmFsdWUyKSwgMCwgMCwgMCk7CiAgICByZXR1cm4gZGF0ZTsKICB9CiAgaW5jb21wYXRpYmxlVG9rZW5zID0gWyJhIiwgIkIiLCAiSCIsICJrIiwgInQiLCAiVCJdOwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvRGF5UGVyaW9kUGFyc2VyLmpzCnZhciBEYXlQZXJpb2RQYXJzZXIgPSBjbGFzcyBleHRlbmRzIFBhcnNlciB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiRGF5UGVyaW9kUGFyc2VyIik7CiAgfQogIHByaW9yaXR5ID0gODA7CiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoMikgewogICAgc3dpdGNoICh0b2tlbikgewogICAgICBjYXNlICJCIjoKICAgICAgY2FzZSAiQkIiOgogICAgICBjYXNlICJCQkIiOgogICAgICAgIHJldHVybiBtYXRjaDIuZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHsKICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSkgfHwgbWF0Y2gyLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7CiAgICAgICAgICB3aWR0aDogIm5hcnJvdyIsCiAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICB9KTsKICAgICAgY2FzZSAiQkJCQkIiOgogICAgICAgIHJldHVybiBtYXRjaDIuZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHsKICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pOwogICAgICBjYXNlICJCQkJCIjoKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gbWF0Y2gyLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7CiAgICAgICAgICB3aWR0aDogIndpZGUiLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSkgfHwgbWF0Y2gyLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7CiAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pIHx8IG1hdGNoMi5kYXlQZXJpb2QoZGF0ZVN0cmluZywgewogICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSk7CiAgICB9CiAgfQogIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlMikgewogICAgZGF0ZS5zZXRIb3VycyhkYXlQZXJpb2RFbnVtVG9Ib3Vycyh2YWx1ZTIpLCAwLCAwLCAwKTsKICAgIHJldHVybiBkYXRlOwogIH0KICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbImEiLCAiYiIsICJ0IiwgIlQiXTsKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0hvdXIxdG8xMlBhcnNlci5qcwp2YXIgSG91cjF0bzEyUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkhvdXIxdG8xMlBhcnNlciIpOwogIH0KICBwcmlvcml0eSA9IDcwOwogIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaDIpIHsKICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgY2FzZSAiaCI6CiAgICAgICAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4obnVtZXJpY1BhdHRlcm5zLmhvdXIxMmgsIGRhdGVTdHJpbmcpOwogICAgICBjYXNlICJobyI6CiAgICAgICAgcmV0dXJuIG1hdGNoMi5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogImhvdXIiIH0pOwogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBwYXJzZU5EaWdpdHModG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTsKICAgIH0KICB9CiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlMikgewogICAgcmV0dXJuIHZhbHVlMiA+PSAxICYmIHZhbHVlMiA8PSAxMjsKICB9CiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUyKSB7CiAgICBjb25zdCBpc1BNID0gZGF0ZS5nZXRIb3VycygpID49IDEyOwogICAgaWYgKGlzUE0gJiYgdmFsdWUyIDwgMTIpIHsKICAgICAgZGF0ZS5zZXRIb3Vycyh2YWx1ZTIgKyAxMiwgMCwgMCwgMCk7CiAgICB9IGVsc2UgaWYgKCFpc1BNICYmIHZhbHVlMiA9PT0gMTIpIHsKICAgICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICAgIH0gZWxzZSB7CiAgICAgIGRhdGUuc2V0SG91cnModmFsdWUyLCAwLCAwLCAwKTsKICAgIH0KICAgIHJldHVybiBkYXRlOwogIH0KICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbIkgiLCAiSyIsICJrIiwgInQiLCAiVCJdOwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvSG91cjB0bzIzUGFyc2VyLmpzCnZhciBIb3VyMHRvMjNQYXJzZXIgPSBjbGFzcyBleHRlbmRzIFBhcnNlciB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiSG91cjB0bzIzUGFyc2VyIik7CiAgfQogIHByaW9yaXR5ID0gNzA7CiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoMikgewogICAgc3dpdGNoICh0b2tlbikgewogICAgICBjYXNlICJIIjoKICAgICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihudW1lcmljUGF0dGVybnMuaG91cjIzaCwgZGF0ZVN0cmluZyk7CiAgICAgIGNhc2UgIkhvIjoKICAgICAgICByZXR1cm4gbWF0Y2gyLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiAiaG91ciIgfSk7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIHBhcnNlTkRpZ2l0cyh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpOwogICAgfQogIH0KICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUyKSB7CiAgICByZXR1cm4gdmFsdWUyID49IDAgJiYgdmFsdWUyIDw9IDIzOwogIH0KICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZTIpIHsKICAgIGRhdGUuc2V0SG91cnModmFsdWUyLCAwLCAwLCAwKTsKICAgIHJldHVybiBkYXRlOwogIH0KICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbImEiLCAiYiIsICJoIiwgIksiLCAiayIsICJ0IiwgIlQiXTsKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0hvdXIwVG8xMVBhcnNlci5qcwp2YXIgSG91cjBUbzExUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkhvdXIwVG8xMVBhcnNlciIpOwogIH0KICBwcmlvcml0eSA9IDcwOwogIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaDIpIHsKICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgY2FzZSAiSyI6CiAgICAgICAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4obnVtZXJpY1BhdHRlcm5zLmhvdXIxMWgsIGRhdGVTdHJpbmcpOwogICAgICBjYXNlICJLbyI6CiAgICAgICAgcmV0dXJuIG1hdGNoMi5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogImhvdXIiIH0pOwogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBwYXJzZU5EaWdpdHModG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTsKICAgIH0KICB9CiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlMikgewogICAgcmV0dXJuIHZhbHVlMiA+PSAwICYmIHZhbHVlMiA8PSAxMTsKICB9CiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUyKSB7CiAgICBjb25zdCBpc1BNID0gZGF0ZS5nZXRIb3VycygpID49IDEyOwogICAgaWYgKGlzUE0gJiYgdmFsdWUyIDwgMTIpIHsKICAgICAgZGF0ZS5zZXRIb3Vycyh2YWx1ZTIgKyAxMiwgMCwgMCwgMCk7CiAgICB9IGVsc2UgewogICAgICBkYXRlLnNldEhvdXJzKHZhbHVlMiwgMCwgMCwgMCk7CiAgICB9CiAgICByZXR1cm4gZGF0ZTsKICB9CiAgaW5jb21wYXRpYmxlVG9rZW5zID0gWyJoIiwgIkgiLCAiayIsICJ0IiwgIlQiXTsKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0hvdXIxVG8yNFBhcnNlci5qcwp2YXIgSG91cjFUbzI0UGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkhvdXIxVG8yNFBhcnNlciIpOwogIH0KICBwcmlvcml0eSA9IDcwOwogIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaDIpIHsKICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgY2FzZSAiayI6CiAgICAgICAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4obnVtZXJpY1BhdHRlcm5zLmhvdXIyNGgsIGRhdGVTdHJpbmcpOwogICAgICBjYXNlICJrbyI6CiAgICAgICAgcmV0dXJuIG1hdGNoMi5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogImhvdXIiIH0pOwogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBwYXJzZU5EaWdpdHModG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTsKICAgIH0KICB9CiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlMikgewogICAgcmV0dXJuIHZhbHVlMiA+PSAxICYmIHZhbHVlMiA8PSAyNDsKICB9CiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUyKSB7CiAgICBjb25zdCBob3VycyA9IHZhbHVlMiA8PSAyNCA/IHZhbHVlMiAlIDI0IDogdmFsdWUyOwogICAgZGF0ZS5zZXRIb3Vycyhob3VycywgMCwgMCwgMCk7CiAgICByZXR1cm4gZGF0ZTsKICB9CiAgaW5jb21wYXRpYmxlVG9rZW5zID0gWyJhIiwgImIiLCAiaCIsICJIIiwgIksiLCAidCIsICJUIl07Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9NaW51dGVQYXJzZXIuanMKdmFyIE1pbnV0ZVBhcnNlciA9IGNsYXNzIGV4dGVuZHMgUGFyc2VyIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJNaW51dGVQYXJzZXIiKTsKICB9CiAgcHJpb3JpdHkgPSA2MDsKICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gyKSB7CiAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgIGNhc2UgIm0iOgogICAgICAgIHJldHVybiBwYXJzZU51bWVyaWNQYXR0ZXJuKG51bWVyaWNQYXR0ZXJucy5taW51dGUsIGRhdGVTdHJpbmcpOwogICAgICBjYXNlICJtbyI6CiAgICAgICAgcmV0dXJuIG1hdGNoMi5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogIm1pbnV0ZSIgfSk7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIHBhcnNlTkRpZ2l0cyh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpOwogICAgfQogIH0KICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUyKSB7CiAgICByZXR1cm4gdmFsdWUyID49IDAgJiYgdmFsdWUyIDw9IDU5OwogIH0KICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZTIpIHsKICAgIGRhdGUuc2V0TWludXRlcyh2YWx1ZTIsIDAsIDApOwogICAgcmV0dXJuIGRhdGU7CiAgfQogIGluY29tcGF0aWJsZVRva2VucyA9IFsidCIsICJUIl07Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9TZWNvbmRQYXJzZXIuanMKdmFyIFNlY29uZFBhcnNlciA9IGNsYXNzIGV4dGVuZHMgUGFyc2VyIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJTZWNvbmRQYXJzZXIiKTsKICB9CiAgcHJpb3JpdHkgPSA1MDsKICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gyKSB7CiAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgIGNhc2UgInMiOgogICAgICAgIHJldHVybiBwYXJzZU51bWVyaWNQYXR0ZXJuKG51bWVyaWNQYXR0ZXJucy5zZWNvbmQsIGRhdGVTdHJpbmcpOwogICAgICBjYXNlICJzbyI6CiAgICAgICAgcmV0dXJuIG1hdGNoMi5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogInNlY29uZCIgfSk7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIHBhcnNlTkRpZ2l0cyh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpOwogICAgfQogIH0KICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUyKSB7CiAgICByZXR1cm4gdmFsdWUyID49IDAgJiYgdmFsdWUyIDw9IDU5OwogIH0KICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZTIpIHsKICAgIGRhdGUuc2V0U2Vjb25kcyh2YWx1ZTIsIDApOwogICAgcmV0dXJuIGRhdGU7CiAgfQogIGluY29tcGF0aWJsZVRva2VucyA9IFsidCIsICJUIl07Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9GcmFjdGlvbk9mU2Vjb25kUGFyc2VyLmpzCnZhciBGcmFjdGlvbk9mU2Vjb25kUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkZyYWN0aW9uT2ZTZWNvbmRQYXJzZXIiKTsKICB9CiAgcHJpb3JpdHkgPSAzMDsKICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbikgewogICAgY29uc3QgdmFsdWVDYWxsYmFjayA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHZhbHVlMikgPT4gTWF0aC50cnVuYyh2YWx1ZTIgKiBNYXRoLnBvdygxMCwgLXRva2VuLmxlbmd0aCArIDMpKSwgInZhbHVlQ2FsbGJhY2siKTsKICAgIHJldHVybiBtYXBWYWx1ZShwYXJzZU5EaWdpdHModG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKSwgdmFsdWVDYWxsYmFjayk7CiAgfQogIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlMikgewogICAgZGF0ZS5zZXRNaWxsaXNlY29uZHModmFsdWUyKTsKICAgIHJldHVybiBkYXRlOwogIH0KICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbInQiLCAiVCJdOwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvSVNPVGltZXpvbmVXaXRoWlBhcnNlci5qcwp2YXIgSVNPVGltZXpvbmVXaXRoWlBhcnNlciA9IGNsYXNzIGV4dGVuZHMgUGFyc2VyIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJJU09UaW1lem9uZVdpdGhaUGFyc2VyIik7CiAgfQogIHByaW9yaXR5ID0gMTA7CiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4pIHsKICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgY2FzZSAiWCI6CiAgICAgICAgcmV0dXJuIHBhcnNlVGltZXpvbmVQYXR0ZXJuKAogICAgICAgICAgdGltZXpvbmVQYXR0ZXJucy5iYXNpY09wdGlvbmFsTWludXRlcywKICAgICAgICAgIGRhdGVTdHJpbmcKICAgICAgICApOwogICAgICBjYXNlICJYWCI6CiAgICAgICAgcmV0dXJuIHBhcnNlVGltZXpvbmVQYXR0ZXJuKHRpbWV6b25lUGF0dGVybnMuYmFzaWMsIGRhdGVTdHJpbmcpOwogICAgICBjYXNlICJYWFhYIjoKICAgICAgICByZXR1cm4gcGFyc2VUaW1lem9uZVBhdHRlcm4oCiAgICAgICAgICB0aW1lem9uZVBhdHRlcm5zLmJhc2ljT3B0aW9uYWxTZWNvbmRzLAogICAgICAgICAgZGF0ZVN0cmluZwogICAgICAgICk7CiAgICAgIGNhc2UgIlhYWFhYIjoKICAgICAgICByZXR1cm4gcGFyc2VUaW1lem9uZVBhdHRlcm4oCiAgICAgICAgICB0aW1lem9uZVBhdHRlcm5zLmV4dGVuZGVkT3B0aW9uYWxTZWNvbmRzLAogICAgICAgICAgZGF0ZVN0cmluZwogICAgICAgICk7CiAgICAgIGNhc2UgIlhYWCI6CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIHBhcnNlVGltZXpvbmVQYXR0ZXJuKHRpbWV6b25lUGF0dGVybnMuZXh0ZW5kZWQsIGRhdGVTdHJpbmcpOwogICAgfQogIH0KICBzZXQoZGF0ZSwgZmxhZ3MsIHZhbHVlMikgewogICAgaWYgKGZsYWdzLnRpbWVzdGFtcElzU2V0KSByZXR1cm4gZGF0ZTsKICAgIHJldHVybiBjb25zdHJ1Y3RGcm9tKAogICAgICBkYXRlLAogICAgICBkYXRlLmdldFRpbWUoKSAtIGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMoZGF0ZSkgLSB2YWx1ZTIKICAgICk7CiAgfQogIGluY29tcGF0aWJsZVRva2VucyA9IFsidCIsICJUIiwgIngiXTsKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0lTT1RpbWV6b25lUGFyc2VyLmpzCnZhciBJU09UaW1lem9uZVBhcnNlciA9IGNsYXNzIGV4dGVuZHMgUGFyc2VyIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJJU09UaW1lem9uZVBhcnNlciIpOwogIH0KICBwcmlvcml0eSA9IDEwOwogIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuKSB7CiAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgIGNhc2UgIngiOgogICAgICAgIHJldHVybiBwYXJzZVRpbWV6b25lUGF0dGVybigKICAgICAgICAgIHRpbWV6b25lUGF0dGVybnMuYmFzaWNPcHRpb25hbE1pbnV0ZXMsCiAgICAgICAgICBkYXRlU3RyaW5nCiAgICAgICAgKTsKICAgICAgY2FzZSAieHgiOgogICAgICAgIHJldHVybiBwYXJzZVRpbWV6b25lUGF0dGVybih0aW1lem9uZVBhdHRlcm5zLmJhc2ljLCBkYXRlU3RyaW5nKTsKICAgICAgY2FzZSAieHh4eCI6CiAgICAgICAgcmV0dXJuIHBhcnNlVGltZXpvbmVQYXR0ZXJuKAogICAgICAgICAgdGltZXpvbmVQYXR0ZXJucy5iYXNpY09wdGlvbmFsU2Vjb25kcywKICAgICAgICAgIGRhdGVTdHJpbmcKICAgICAgICApOwogICAgICBjYXNlICJ4eHh4eCI6CiAgICAgICAgcmV0dXJuIHBhcnNlVGltZXpvbmVQYXR0ZXJuKAogICAgICAgICAgdGltZXpvbmVQYXR0ZXJucy5leHRlbmRlZE9wdGlvbmFsU2Vjb25kcywKICAgICAgICAgIGRhdGVTdHJpbmcKICAgICAgICApOwogICAgICBjYXNlICJ4eHgiOgogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBwYXJzZVRpbWV6b25lUGF0dGVybih0aW1lem9uZVBhdHRlcm5zLmV4dGVuZGVkLCBkYXRlU3RyaW5nKTsKICAgIH0KICB9CiAgc2V0KGRhdGUsIGZsYWdzLCB2YWx1ZTIpIHsKICAgIGlmIChmbGFncy50aW1lc3RhbXBJc1NldCkgcmV0dXJuIGRhdGU7CiAgICByZXR1cm4gY29uc3RydWN0RnJvbSgKICAgICAgZGF0ZSwKICAgICAgZGF0ZS5nZXRUaW1lKCkgLSBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKGRhdGUpIC0gdmFsdWUyCiAgICApOwogIH0KICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbInQiLCAiVCIsICJYIl07Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9UaW1lc3RhbXBTZWNvbmRzUGFyc2VyLmpzCnZhciBUaW1lc3RhbXBTZWNvbmRzUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlRpbWVzdGFtcFNlY29uZHNQYXJzZXIiKTsKICB9CiAgcHJpb3JpdHkgPSA0MDsKICBwYXJzZShkYXRlU3RyaW5nKSB7CiAgICByZXR1cm4gcGFyc2VBbnlEaWdpdHNTaWduZWQoZGF0ZVN0cmluZyk7CiAgfQogIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlMikgewogICAgcmV0dXJuIFtjb25zdHJ1Y3RGcm9tKGRhdGUsIHZhbHVlMiAqIDFlMyksIHsgdGltZXN0YW1wSXNTZXQ6IHRydWUgfV07CiAgfQogIGluY29tcGF0aWJsZVRva2VucyA9ICIqIjsKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL1RpbWVzdGFtcE1pbGxpc2Vjb25kc1BhcnNlci5qcwp2YXIgVGltZXN0YW1wTWlsbGlzZWNvbmRzUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlRpbWVzdGFtcE1pbGxpc2Vjb25kc1BhcnNlciIpOwogIH0KICBwcmlvcml0eSA9IDIwOwogIHBhcnNlKGRhdGVTdHJpbmcpIHsKICAgIHJldHVybiBwYXJzZUFueURpZ2l0c1NpZ25lZChkYXRlU3RyaW5nKTsKICB9CiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUyKSB7CiAgICByZXR1cm4gW2NvbnN0cnVjdEZyb20oZGF0ZSwgdmFsdWUyKSwgeyB0aW1lc3RhbXBJc1NldDogdHJ1ZSB9XTsKICB9CiAgaW5jb21wYXRpYmxlVG9rZW5zID0gIioiOwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMuanMKdmFyIHBhcnNlcnMgPSB7CiAgRzogbmV3IEVyYVBhcnNlcigpLAogIHk6IG5ldyBZZWFyUGFyc2VyKCksCiAgWTogbmV3IExvY2FsV2Vla1llYXJQYXJzZXIoKSwKICBSOiBuZXcgSVNPV2Vla1llYXJQYXJzZXIoKSwKICB1OiBuZXcgRXh0ZW5kZWRZZWFyUGFyc2VyKCksCiAgUTogbmV3IFF1YXJ0ZXJQYXJzZXIoKSwKICBxOiBuZXcgU3RhbmRBbG9uZVF1YXJ0ZXJQYXJzZXIoKSwKICBNOiBuZXcgTW9udGhQYXJzZXIoKSwKICBMOiBuZXcgU3RhbmRBbG9uZU1vbnRoUGFyc2VyKCksCiAgdzogbmV3IExvY2FsV2Vla1BhcnNlcigpLAogIEk6IG5ldyBJU09XZWVrUGFyc2VyKCksCiAgZDogbmV3IERhdGVQYXJzZXIoKSwKICBEOiBuZXcgRGF5T2ZZZWFyUGFyc2VyKCksCiAgRTogbmV3IERheVBhcnNlcigpLAogIGU6IG5ldyBMb2NhbERheVBhcnNlcigpLAogIGM6IG5ldyBTdGFuZEFsb25lTG9jYWxEYXlQYXJzZXIoKSwKICBpOiBuZXcgSVNPRGF5UGFyc2VyKCksCiAgYTogbmV3IEFNUE1QYXJzZXIoKSwKICBiOiBuZXcgQU1QTU1pZG5pZ2h0UGFyc2VyKCksCiAgQjogbmV3IERheVBlcmlvZFBhcnNlcigpLAogIGg6IG5ldyBIb3VyMXRvMTJQYXJzZXIoKSwKICBIOiBuZXcgSG91cjB0bzIzUGFyc2VyKCksCiAgSzogbmV3IEhvdXIwVG8xMVBhcnNlcigpLAogIGs6IG5ldyBIb3VyMVRvMjRQYXJzZXIoKSwKICBtOiBuZXcgTWludXRlUGFyc2VyKCksCiAgczogbmV3IFNlY29uZFBhcnNlcigpLAogIFM6IG5ldyBGcmFjdGlvbk9mU2Vjb25kUGFyc2VyKCksCiAgWDogbmV3IElTT1RpbWV6b25lV2l0aFpQYXJzZXIoKSwKICB4OiBuZXcgSVNPVGltZXpvbmVQYXJzZXIoKSwKICB0OiBuZXcgVGltZXN0YW1wU2Vjb25kc1BhcnNlcigpLAogIFQ6IG5ldyBUaW1lc3RhbXBNaWxsaXNlY29uZHNQYXJzZXIoKQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS5qcwp2YXIgZm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cDIgPSAvW3lZUXFNTHdJZERlY2loSEtrbXNdb3woXHcpXDEqfCcnfCcoJyd8W14nXSkrKCd8JCl8Li9nOwp2YXIgbG9uZ0Zvcm1hdHRpbmdUb2tlbnNSZWdFeHAyID0gL1ArcCt8UCt8cCt8Jyd8JygnJ3xbXiddKSsoJ3wkKXwuL2c7CnZhciBlc2NhcGVkU3RyaW5nUmVnRXhwMiA9IC9eJyhbXl0qPyknPyQvOwp2YXIgZG91YmxlUXVvdGVSZWdFeHAyID0gLycnL2c7CnZhciBub3RXaGl0ZXNwYWNlUmVnRXhwID0gL1xTLzsKdmFyIHVuZXNjYXBlZExhdGluQ2hhcmFjdGVyUmVnRXhwMiA9IC9bYS16QS1aXS87CmZ1bmN0aW9uIHBhcnNlKGRhdGVTdHIsIGZvcm1hdFN0ciwgcmVmZXJlbmNlRGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IGludmFsaWREYXRlID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoKSA9PiBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IHJlZmVyZW5jZURhdGUsIE5hTiksICJpbnZhbGlkRGF0ZSIpOwogIGNvbnN0IGRlZmF1bHRPcHRpb25zMiA9IGdldERlZmF1bHRPcHRpb25zMigpOwogIGNvbnN0IGxvY2FsZSA9IG9wdGlvbnM/LmxvY2FsZSA/PyBkZWZhdWx0T3B0aW9uczIubG9jYWxlID8/IGVuVVM7CiAgY29uc3QgZmlyc3RXZWVrQ29udGFpbnNEYXRlID0gb3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/IG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/IGRlZmF1bHRPcHRpb25zMi5maXJzdFdlZWtDb250YWluc0RhdGUgPz8gZGVmYXVsdE9wdGlvbnMyLmxvY2FsZT8ub3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/IDE7CiAgY29uc3Qgd2Vla1N0YXJ0c09uID0gb3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/IG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/IGRlZmF1bHRPcHRpb25zMi53ZWVrU3RhcnRzT24gPz8gZGVmYXVsdE9wdGlvbnMyLmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/IDA7CiAgaWYgKCFmb3JtYXRTdHIpCiAgICByZXR1cm4gZGF0ZVN0ciA/IGludmFsaWREYXRlKCkgOiB0b0RhdGUocmVmZXJlbmNlRGF0ZSwgb3B0aW9ucz8uaW4pOwogIGNvbnN0IHN1YkZuT3B0aW9ucyA9IHsKICAgIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSwKICAgIHdlZWtTdGFydHNPbiwKICAgIGxvY2FsZQogIH07CiAgY29uc3Qgc2V0dGVycyA9IFtuZXcgRGF0ZVRpbWV6b25lU2V0dGVyKG9wdGlvbnM/LmluLCByZWZlcmVuY2VEYXRlKV07CiAgY29uc3QgdG9rZW5zID0gZm9ybWF0U3RyLm1hdGNoKGxvbmdGb3JtYXR0aW5nVG9rZW5zUmVnRXhwMikubWFwKChzdWJzdHJpbmcpID0+IHsKICAgIGNvbnN0IGZpcnN0Q2hhcmFjdGVyID0gc3Vic3RyaW5nWzBdOwogICAgaWYgKGZpcnN0Q2hhcmFjdGVyIGluIGxvbmdGb3JtYXR0ZXJzKSB7CiAgICAgIGNvbnN0IGxvbmdGb3JtYXR0ZXIgPSBsb25nRm9ybWF0dGVyc1tmaXJzdENoYXJhY3Rlcl07CiAgICAgIHJldHVybiBsb25nRm9ybWF0dGVyKHN1YnN0cmluZywgbG9jYWxlLmZvcm1hdExvbmcpOwogICAgfQogICAgcmV0dXJuIHN1YnN0cmluZzsKICB9KS5qb2luKCIiKS5tYXRjaChmb3JtYXR0aW5nVG9rZW5zUmVnRXhwMik7CiAgY29uc3QgdXNlZFRva2VucyA9IFtdOwogIGZvciAobGV0IHRva2VuIG9mIHRva2VucykgewogICAgaWYgKCFvcHRpb25zPy51c2VBZGRpdGlvbmFsV2Vla1llYXJUb2tlbnMgJiYgaXNQcm90ZWN0ZWRXZWVrWWVhclRva2VuKHRva2VuKSkgewogICAgICB3YXJuT3JUaHJvd1Byb3RlY3RlZEVycm9yKHRva2VuLCBmb3JtYXRTdHIsIGRhdGVTdHIpOwogICAgfQogICAgaWYgKCFvcHRpb25zPy51c2VBZGRpdGlvbmFsRGF5T2ZZZWFyVG9rZW5zICYmIGlzUHJvdGVjdGVkRGF5T2ZZZWFyVG9rZW4odG9rZW4pKSB7CiAgICAgIHdhcm5PclRocm93UHJvdGVjdGVkRXJyb3IodG9rZW4sIGZvcm1hdFN0ciwgZGF0ZVN0cik7CiAgICB9CiAgICBjb25zdCBmaXJzdENoYXJhY3RlciA9IHRva2VuWzBdOwogICAgY29uc3QgcGFyc2VyID0gcGFyc2Vyc1tmaXJzdENoYXJhY3Rlcl07CiAgICBpZiAocGFyc2VyKSB7CiAgICAgIGNvbnN0IHsgaW5jb21wYXRpYmxlVG9rZW5zIH0gPSBwYXJzZXI7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KGluY29tcGF0aWJsZVRva2VucykpIHsKICAgICAgICBjb25zdCBpbmNvbXBhdGlibGVUb2tlbiA9IHVzZWRUb2tlbnMuZmluZCgKICAgICAgICAgICh1c2VkVG9rZW4pID0+IGluY29tcGF0aWJsZVRva2Vucy5pbmNsdWRlcyh1c2VkVG9rZW4udG9rZW4pIHx8IHVzZWRUb2tlbi50b2tlbiA9PT0gZmlyc3RDaGFyYWN0ZXIKICAgICAgICApOwogICAgICAgIGlmIChpbmNvbXBhdGlibGVUb2tlbikgewogICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoCiAgICAgICAgICAgIGBUaGUgZm9ybWF0IHN0cmluZyBtdXN0bid0IGNvbnRhaW4gXGAke2luY29tcGF0aWJsZVRva2VuLmZ1bGxUb2tlbn1cYCBhbmQgXGAke3Rva2VufVxgIGF0IHRoZSBzYW1lIHRpbWVgCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChwYXJzZXIuaW5jb21wYXRpYmxlVG9rZW5zID09PSAiKiIgJiYgdXNlZFRva2Vucy5sZW5ndGggPiAwKSB7CiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoCiAgICAgICAgICBgVGhlIGZvcm1hdCBzdHJpbmcgbXVzdG4ndCBjb250YWluIFxgJHt0b2tlbn1cYCBhbmQgYW55IG90aGVyIHRva2VuIGF0IHRoZSBzYW1lIHRpbWVgCiAgICAgICAgKTsKICAgICAgfQogICAgICB1c2VkVG9rZW5zLnB1c2goeyB0b2tlbjogZmlyc3RDaGFyYWN0ZXIsIGZ1bGxUb2tlbjogdG9rZW4gfSk7CiAgICAgIGNvbnN0IHBhcnNlUmVzdWx0ID0gcGFyc2VyLnJ1bigKICAgICAgICBkYXRlU3RyLAogICAgICAgIHRva2VuLAogICAgICAgIGxvY2FsZS5tYXRjaCwKICAgICAgICBzdWJGbk9wdGlvbnMKICAgICAgKTsKICAgICAgaWYgKCFwYXJzZVJlc3VsdCkgewogICAgICAgIHJldHVybiBpbnZhbGlkRGF0ZSgpOwogICAgICB9CiAgICAgIHNldHRlcnMucHVzaChwYXJzZVJlc3VsdC5zZXR0ZXIpOwogICAgICBkYXRlU3RyID0gcGFyc2VSZXN1bHQucmVzdDsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChmaXJzdENoYXJhY3Rlci5tYXRjaCh1bmVzY2FwZWRMYXRpbkNoYXJhY3RlclJlZ0V4cDIpKSB7CiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoCiAgICAgICAgICAiRm9ybWF0IHN0cmluZyBjb250YWlucyBhbiB1bmVzY2FwZWQgbGF0aW4gYWxwaGFiZXQgY2hhcmFjdGVyIGAiICsgZmlyc3RDaGFyYWN0ZXIgKyAiYCIKICAgICAgICApOwogICAgICB9CiAgICAgIGlmICh0b2tlbiA9PT0gIicnIikgewogICAgICAgIHRva2VuID0gIiciOwogICAgICB9IGVsc2UgaWYgKGZpcnN0Q2hhcmFjdGVyID09PSAiJyIpIHsKICAgICAgICB0b2tlbiA9IGNsZWFuRXNjYXBlZFN0cmluZzIodG9rZW4pOwogICAgICB9CiAgICAgIGlmIChkYXRlU3RyLmluZGV4T2YodG9rZW4pID09PSAwKSB7CiAgICAgICAgZGF0ZVN0ciA9IGRhdGVTdHIuc2xpY2UodG9rZW4ubGVuZ3RoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gaW52YWxpZERhdGUoKTsKICAgICAgfQogICAgfQogIH0KICBpZiAoZGF0ZVN0ci5sZW5ndGggPiAwICYmIG5vdFdoaXRlc3BhY2VSZWdFeHAudGVzdChkYXRlU3RyKSkgewogICAgcmV0dXJuIGludmFsaWREYXRlKCk7CiAgfQogIGNvbnN0IHVuaXF1ZVByaW9yaXR5U2V0dGVycyA9IHNldHRlcnMubWFwKChzZXR0ZXIpID0+IHNldHRlci5wcmlvcml0eSkuc29ydCgoYTQsIGI0KSA9PiBiNCAtIGE0KS5maWx0ZXIoKHByaW9yaXR5LCBpbmRleDIsIGFycmF5KSA9PiBhcnJheS5pbmRleE9mKHByaW9yaXR5KSA9PT0gaW5kZXgyKS5tYXAoCiAgICAocHJpb3JpdHkpID0+IHNldHRlcnMuZmlsdGVyKChzZXR0ZXIpID0+IHNldHRlci5wcmlvcml0eSA9PT0gcHJpb3JpdHkpLnNvcnQoKGE0LCBiNCkgPT4gYjQuc3ViUHJpb3JpdHkgLSBhNC5zdWJQcmlvcml0eSkKICApLm1hcCgoc2V0dGVyQXJyYXkpID0+IHNldHRlckFycmF5WzBdKTsKICBsZXQgZGF0ZSA9IHRvRGF0ZShyZWZlcmVuY2VEYXRlLCBvcHRpb25zPy5pbik7CiAgaWYgKGlzTmFOKCtkYXRlKSkgcmV0dXJuIGludmFsaWREYXRlKCk7CiAgY29uc3QgZmxhZ3MgPSB7fTsKICBmb3IgKGNvbnN0IHNldHRlciBvZiB1bmlxdWVQcmlvcml0eVNldHRlcnMpIHsKICAgIGlmICghc2V0dGVyLnZhbGlkYXRlKGRhdGUsIHN1YkZuT3B0aW9ucykpIHsKICAgICAgcmV0dXJuIGludmFsaWREYXRlKCk7CiAgICB9CiAgICBjb25zdCByZXN1bHQgPSBzZXR0ZXIuc2V0KGRhdGUsIGZsYWdzLCBzdWJGbk9wdGlvbnMpOwogICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkgewogICAgICBkYXRlID0gcmVzdWx0WzBdOwogICAgICBPYmplY3QuYXNzaWduKGZsYWdzLCByZXN1bHRbMV0pOwogICAgfSBlbHNlIHsKICAgICAgZGF0ZSA9IHJlc3VsdDsKICAgIH0KICB9CiAgcmV0dXJuIGRhdGU7Cn0KX19uYW1lKHBhcnNlLCAicGFyc2UiKTsKZnVuY3Rpb24gY2xlYW5Fc2NhcGVkU3RyaW5nMihpbnB1dCkgewogIHJldHVybiBpbnB1dC5tYXRjaChlc2NhcGVkU3RyaW5nUmVnRXhwMilbMV0ucmVwbGFjZShkb3VibGVRdW90ZVJlZ0V4cDIsICInIik7Cn0KX19uYW1lKGNsZWFuRXNjYXBlZFN0cmluZzIsICJjbGVhbkVzY2FwZWRTdHJpbmciKTsKdmFyIHBhcnNlX2RlZmF1bHQgPSBwYXJzZTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNNYXRjaC5qcwpmdW5jdGlvbiBpc01hdGNoMihkYXRlU3RyLCBmb3JtYXRTdHIsIG9wdGlvbnMpIHsKICByZXR1cm4gaXNWYWxpZChwYXJzZShkYXRlU3RyLCBmb3JtYXRTdHIsIC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpLCBvcHRpb25zKSk7Cn0KX19uYW1lKGlzTWF0Y2gyLCAiaXNNYXRjaCIpOwp2YXIgaXNNYXRjaF9kZWZhdWx0ID0gaXNNYXRjaDI7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzTW9uZGF5LmpzCmZ1bmN0aW9uIGlzTW9uZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKS5nZXREYXkoKSA9PT0gMTsKfQpfX25hbWUoaXNNb25kYXksICJpc01vbmRheSIpOwp2YXIgaXNNb25kYXlfZGVmYXVsdCA9IGlzTW9uZGF5OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1Bhc3QuanMKZnVuY3Rpb24gaXNQYXN0KGRhdGUpIHsKICByZXR1cm4gK3RvRGF0ZShkYXRlKSA8IERhdGUubm93KCk7Cn0KX19uYW1lKGlzUGFzdCwgImlzUGFzdCIpOwp2YXIgaXNQYXN0X2RlZmF1bHQgPSBpc1Bhc3Q7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZIb3VyLmpzCmZ1bmN0aW9uIHN0YXJ0T2ZIb3VyKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgX2RhdGUuc2V0TWludXRlcygwLCAwLCAwKTsKICByZXR1cm4gX2RhdGU7Cn0KX19uYW1lKHN0YXJ0T2ZIb3VyLCAic3RhcnRPZkhvdXIiKTsKdmFyIHN0YXJ0T2ZIb3VyX2RlZmF1bHQgPSBzdGFydE9mSG91cjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNTYW1lSG91ci5qcwpmdW5jdGlvbiBpc1NhbWVIb3VyKGRhdGVMZWZ0LCBkYXRlUmlnaHQsIG9wdGlvbnMpIHsKICBjb25zdCBbZGF0ZUxlZnRfLCBkYXRlUmlnaHRfXSA9IG5vcm1hbGl6ZURhdGVzKAogICAgb3B0aW9ucz8uaW4sCiAgICBkYXRlTGVmdCwKICAgIGRhdGVSaWdodAogICk7CiAgcmV0dXJuICtzdGFydE9mSG91cihkYXRlTGVmdF8pID09PSArc3RhcnRPZkhvdXIoZGF0ZVJpZ2h0Xyk7Cn0KX19uYW1lKGlzU2FtZUhvdXIsICJpc1NhbWVIb3VyIik7CnZhciBpc1NhbWVIb3VyX2RlZmF1bHQgPSBpc1NhbWVIb3VyOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1NhbWVXZWVrLmpzCmZ1bmN0aW9uIGlzU2FtZVdlZWsobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IFtsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV9dID0gbm9ybWFsaXplRGF0ZXMoCiAgICBvcHRpb25zPy5pbiwKICAgIGxhdGVyRGF0ZSwKICAgIGVhcmxpZXJEYXRlCiAgKTsKICByZXR1cm4gK3N0YXJ0T2ZXZWVrKGxhdGVyRGF0ZV8sIG9wdGlvbnMpID09PSArc3RhcnRPZldlZWsoZWFybGllckRhdGVfLCBvcHRpb25zKTsKfQpfX25hbWUoaXNTYW1lV2VlaywgImlzU2FtZVdlZWsiKTsKdmFyIGlzU2FtZVdlZWtfZGVmYXVsdCA9IGlzU2FtZVdlZWs7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzU2FtZUlTT1dlZWsuanMKZnVuY3Rpb24gaXNTYW1lSVNPV2VlayhsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIGlzU2FtZVdlZWsobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgeyAuLi5vcHRpb25zLCB3ZWVrU3RhcnRzT246IDEgfSk7Cn0KX19uYW1lKGlzU2FtZUlTT1dlZWssICJpc1NhbWVJU09XZWVrIik7CnZhciBpc1NhbWVJU09XZWVrX2RlZmF1bHQgPSBpc1NhbWVJU09XZWVrOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1NhbWVJU09XZWVrWWVhci5qcwpmdW5jdGlvbiBpc1NhbWVJU09XZWVrWWVhcihsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgW2xhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgbGF0ZXJEYXRlLAogICAgZWFybGllckRhdGUKICApOwogIHJldHVybiArc3RhcnRPZklTT1dlZWtZZWFyKGxhdGVyRGF0ZV8pID09PSArc3RhcnRPZklTT1dlZWtZZWFyKGVhcmxpZXJEYXRlXyk7Cn0KX19uYW1lKGlzU2FtZUlTT1dlZWtZZWFyLCAiaXNTYW1lSVNPV2Vla1llYXIiKTsKdmFyIGlzU2FtZUlTT1dlZWtZZWFyX2RlZmF1bHQgPSBpc1NhbWVJU09XZWVrWWVhcjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZk1pbnV0ZS5qcwpmdW5jdGlvbiBzdGFydE9mTWludXRlKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBkYXRlXyA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgZGF0ZV8uc2V0U2Vjb25kcygwLCAwKTsKICByZXR1cm4gZGF0ZV87Cn0KX19uYW1lKHN0YXJ0T2ZNaW51dGUsICJzdGFydE9mTWludXRlIik7CnZhciBzdGFydE9mTWludXRlX2RlZmF1bHQgPSBzdGFydE9mTWludXRlOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1NhbWVNaW51dGUuanMKZnVuY3Rpb24gaXNTYW1lTWludXRlKGxhdGVyRGF0ZSwgZWFybGllckRhdGUpIHsKICByZXR1cm4gK3N0YXJ0T2ZNaW51dGUobGF0ZXJEYXRlKSA9PT0gK3N0YXJ0T2ZNaW51dGUoZWFybGllckRhdGUpOwp9Cl9fbmFtZShpc1NhbWVNaW51dGUsICJpc1NhbWVNaW51dGUiKTsKdmFyIGlzU2FtZU1pbnV0ZV9kZWZhdWx0ID0gaXNTYW1lTWludXRlOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1NhbWVNb250aC5qcwpmdW5jdGlvbiBpc1NhbWVNb250aChsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgW2xhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgbGF0ZXJEYXRlLAogICAgZWFybGllckRhdGUKICApOwogIHJldHVybiBsYXRlckRhdGVfLmdldEZ1bGxZZWFyKCkgPT09IGVhcmxpZXJEYXRlXy5nZXRGdWxsWWVhcigpICYmIGxhdGVyRGF0ZV8uZ2V0TW9udGgoKSA9PT0gZWFybGllckRhdGVfLmdldE1vbnRoKCk7Cn0KX19uYW1lKGlzU2FtZU1vbnRoLCAiaXNTYW1lTW9udGgiKTsKdmFyIGlzU2FtZU1vbnRoX2RlZmF1bHQgPSBpc1NhbWVNb250aDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNTYW1lUXVhcnRlci5qcwpmdW5jdGlvbiBpc1NhbWVRdWFydGVyKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBbZGF0ZUxlZnRfLCBkYXRlUmlnaHRfXSA9IG5vcm1hbGl6ZURhdGVzKAogICAgb3B0aW9ucz8uaW4sCiAgICBsYXRlckRhdGUsCiAgICBlYXJsaWVyRGF0ZQogICk7CiAgcmV0dXJuICtzdGFydE9mUXVhcnRlcihkYXRlTGVmdF8pID09PSArc3RhcnRPZlF1YXJ0ZXIoZGF0ZVJpZ2h0Xyk7Cn0KX19uYW1lKGlzU2FtZVF1YXJ0ZXIsICJpc1NhbWVRdWFydGVyIik7CnZhciBpc1NhbWVRdWFydGVyX2RlZmF1bHQgPSBpc1NhbWVRdWFydGVyOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mU2Vjb25kLmpzCmZ1bmN0aW9uIHN0YXJ0T2ZTZWNvbmQoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IGRhdGVfID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBkYXRlXy5zZXRNaWxsaXNlY29uZHMoMCk7CiAgcmV0dXJuIGRhdGVfOwp9Cl9fbmFtZShzdGFydE9mU2Vjb25kLCAic3RhcnRPZlNlY29uZCIpOwp2YXIgc3RhcnRPZlNlY29uZF9kZWZhdWx0ID0gc3RhcnRPZlNlY29uZDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNTYW1lU2Vjb25kLmpzCmZ1bmN0aW9uIGlzU2FtZVNlY29uZChsYXRlckRhdGUsIGVhcmxpZXJEYXRlKSB7CiAgcmV0dXJuICtzdGFydE9mU2Vjb25kKGxhdGVyRGF0ZSkgPT09ICtzdGFydE9mU2Vjb25kKGVhcmxpZXJEYXRlKTsKfQpfX25hbWUoaXNTYW1lU2Vjb25kLCAiaXNTYW1lU2Vjb25kIik7CnZhciBpc1NhbWVTZWNvbmRfZGVmYXVsdCA9IGlzU2FtZVNlY29uZDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNTYW1lWWVhci5qcwpmdW5jdGlvbiBpc1NhbWVZZWFyKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBbbGF0ZXJEYXRlXywgZWFybGllckRhdGVfXSA9IG5vcm1hbGl6ZURhdGVzKAogICAgb3B0aW9ucz8uaW4sCiAgICBsYXRlckRhdGUsCiAgICBlYXJsaWVyRGF0ZQogICk7CiAgcmV0dXJuIGxhdGVyRGF0ZV8uZ2V0RnVsbFllYXIoKSA9PT0gZWFybGllckRhdGVfLmdldEZ1bGxZZWFyKCk7Cn0KX19uYW1lKGlzU2FtZVllYXIsICJpc1NhbWVZZWFyIik7CnZhciBpc1NhbWVZZWFyX2RlZmF1bHQgPSBpc1NhbWVZZWFyOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1RoaXNIb3VyLmpzCmZ1bmN0aW9uIGlzVGhpc0hvdXIoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiBpc1NhbWVIb3VyKAogICAgdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKSwKICAgIGNvbnN0cnVjdE5vdyhvcHRpb25zPy5pbiB8fCBkYXRlKQogICk7Cn0KX19uYW1lKGlzVGhpc0hvdXIsICJpc1RoaXNIb3VyIik7CnZhciBpc1RoaXNIb3VyX2RlZmF1bHQgPSBpc1RoaXNIb3VyOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1RoaXNJU09XZWVrLmpzCmZ1bmN0aW9uIGlzVGhpc0lTT1dlZWsoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiBpc1NhbWVJU09XZWVrKAogICAgY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCBkYXRlKSwKICAgIGNvbnN0cnVjdE5vdyhvcHRpb25zPy5pbiB8fCBkYXRlKQogICk7Cn0KX19uYW1lKGlzVGhpc0lTT1dlZWssICJpc1RoaXNJU09XZWVrIik7CnZhciBpc1RoaXNJU09XZWVrX2RlZmF1bHQgPSBpc1RoaXNJU09XZWVrOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1RoaXNNaW51dGUuanMKZnVuY3Rpb24gaXNUaGlzTWludXRlKGRhdGUpIHsKICByZXR1cm4gaXNTYW1lTWludXRlKGRhdGUsIGNvbnN0cnVjdE5vdyhkYXRlKSk7Cn0KX19uYW1lKGlzVGhpc01pbnV0ZSwgImlzVGhpc01pbnV0ZSIpOwp2YXIgaXNUaGlzTWludXRlX2RlZmF1bHQgPSBpc1RoaXNNaW51dGU7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzVGhpc01vbnRoLmpzCmZ1bmN0aW9uIGlzVGhpc01vbnRoKGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gaXNTYW1lTW9udGgoCiAgICBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIGRhdGUpLAogICAgY29uc3RydWN0Tm93KG9wdGlvbnM/LmluIHx8IGRhdGUpCiAgKTsKfQpfX25hbWUoaXNUaGlzTW9udGgsICJpc1RoaXNNb250aCIpOwp2YXIgaXNUaGlzTW9udGhfZGVmYXVsdCA9IGlzVGhpc01vbnRoOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1RoaXNRdWFydGVyLmpzCmZ1bmN0aW9uIGlzVGhpc1F1YXJ0ZXIoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiBpc1NhbWVRdWFydGVyKAogICAgY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCBkYXRlKSwKICAgIGNvbnN0cnVjdE5vdyhvcHRpb25zPy5pbiB8fCBkYXRlKQogICk7Cn0KX19uYW1lKGlzVGhpc1F1YXJ0ZXIsICJpc1RoaXNRdWFydGVyIik7CnZhciBpc1RoaXNRdWFydGVyX2RlZmF1bHQgPSBpc1RoaXNRdWFydGVyOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1RoaXNTZWNvbmQuanMKZnVuY3Rpb24gaXNUaGlzU2Vjb25kKGRhdGUpIHsKICByZXR1cm4gaXNTYW1lU2Vjb25kKGRhdGUsIGNvbnN0cnVjdE5vdyhkYXRlKSk7Cn0KX19uYW1lKGlzVGhpc1NlY29uZCwgImlzVGhpc1NlY29uZCIpOwp2YXIgaXNUaGlzU2Vjb25kX2RlZmF1bHQgPSBpc1RoaXNTZWNvbmQ7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzVGhpc1dlZWsuanMKZnVuY3Rpb24gaXNUaGlzV2VlayhkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIGlzU2FtZVdlZWsoCiAgICBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIGRhdGUpLAogICAgY29uc3RydWN0Tm93KG9wdGlvbnM/LmluIHx8IGRhdGUpLAogICAgb3B0aW9ucwogICk7Cn0KX19uYW1lKGlzVGhpc1dlZWssICJpc1RoaXNXZWVrIik7CnZhciBpc1RoaXNXZWVrX2RlZmF1bHQgPSBpc1RoaXNXZWVrOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1RoaXNZZWFyLmpzCmZ1bmN0aW9uIGlzVGhpc1llYXIoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiBpc1NhbWVZZWFyKAogICAgY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCBkYXRlKSwKICAgIGNvbnN0cnVjdE5vdyhvcHRpb25zPy5pbiB8fCBkYXRlKQogICk7Cn0KX19uYW1lKGlzVGhpc1llYXIsICJpc1RoaXNZZWFyIik7CnZhciBpc1RoaXNZZWFyX2RlZmF1bHQgPSBpc1RoaXNZZWFyOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1RodXJzZGF5LmpzCmZ1bmN0aW9uIGlzVGh1cnNkYXkoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pLmdldERheSgpID09PSA0Owp9Cl9fbmFtZShpc1RodXJzZGF5LCAiaXNUaHVyc2RheSIpOwp2YXIgaXNUaHVyc2RheV9kZWZhdWx0ID0gaXNUaHVyc2RheTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNUb2RheS5qcwpmdW5jdGlvbiBpc1RvZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gaXNTYW1lRGF5KAogICAgY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCBkYXRlKSwKICAgIGNvbnN0cnVjdE5vdyhvcHRpb25zPy5pbiB8fCBkYXRlKQogICk7Cn0KX19uYW1lKGlzVG9kYXksICJpc1RvZGF5Iik7CnZhciBpc1RvZGF5X2RlZmF1bHQgPSBpc1RvZGF5OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1RvbW9ycm93LmpzCmZ1bmN0aW9uIGlzVG9tb3Jyb3coZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiBpc1NhbWVEYXkoCiAgICBkYXRlLAogICAgYWRkRGF5cyhjb25zdHJ1Y3ROb3cob3B0aW9ucz8uaW4gfHwgZGF0ZSksIDEpLAogICAgb3B0aW9ucwogICk7Cn0KX19uYW1lKGlzVG9tb3Jyb3csICJpc1RvbW9ycm93Iik7CnZhciBpc1RvbW9ycm93X2RlZmF1bHQgPSBpc1RvbW9ycm93OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1R1ZXNkYXkuanMKZnVuY3Rpb24gaXNUdWVzZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKS5nZXREYXkoKSA9PT0gMjsKfQpfX25hbWUoaXNUdWVzZGF5LCAiaXNUdWVzZGF5Iik7CnZhciBpc1R1ZXNkYXlfZGVmYXVsdCA9IGlzVHVlc2RheTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNXZWRuZXNkYXkuanMKZnVuY3Rpb24gaXNXZWRuZXNkYXkoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pLmdldERheSgpID09PSAzOwp9Cl9fbmFtZShpc1dlZG5lc2RheSwgImlzV2VkbmVzZGF5Iik7CnZhciBpc1dlZG5lc2RheV9kZWZhdWx0ID0gaXNXZWRuZXNkYXk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzV2l0aGluSW50ZXJ2YWwuanMKZnVuY3Rpb24gaXNXaXRoaW5JbnRlcnZhbChkYXRlLCBpbnRlcnZhbDMsIG9wdGlvbnMpIHsKICBjb25zdCB0aW1lID0gK3RvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgW3N0YXJ0VGltZSwgZW5kVGltZV0gPSBbCiAgICArdG9EYXRlKGludGVydmFsMy5zdGFydCwgb3B0aW9ucz8uaW4pLAogICAgK3RvRGF0ZShpbnRlcnZhbDMuZW5kLCBvcHRpb25zPy5pbikKICBdLnNvcnQoKGE0LCBiNCkgPT4gYTQgLSBiNCk7CiAgcmV0dXJuIHRpbWUgPj0gc3RhcnRUaW1lICYmIHRpbWUgPD0gZW5kVGltZTsKfQpfX25hbWUoaXNXaXRoaW5JbnRlcnZhbCwgImlzV2l0aGluSW50ZXJ2YWwiKTsKdmFyIGlzV2l0aGluSW50ZXJ2YWxfZGVmYXVsdCA9IGlzV2l0aGluSW50ZXJ2YWw7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N1YkRheXMuanMKZnVuY3Rpb24gc3ViRGF5cyhkYXRlLCBhbW91bnQsIG9wdGlvbnMpIHsKICByZXR1cm4gYWRkRGF5cyhkYXRlLCAtYW1vdW50LCBvcHRpb25zKTsKfQpfX25hbWUoc3ViRGF5cywgInN1YkRheXMiKTsKdmFyIHN1YkRheXNfZGVmYXVsdCA9IHN1YkRheXM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzWWVzdGVyZGF5LmpzCmZ1bmN0aW9uIGlzWWVzdGVyZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gaXNTYW1lRGF5KAogICAgY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCBkYXRlKSwKICAgIHN1YkRheXMoY29uc3RydWN0Tm93KG9wdGlvbnM/LmluIHx8IGRhdGUpLCAxKQogICk7Cn0KX19uYW1lKGlzWWVzdGVyZGF5LCAiaXNZZXN0ZXJkYXkiKTsKdmFyIGlzWWVzdGVyZGF5X2RlZmF1bHQgPSBpc1llc3RlcmRheTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbGFzdERheU9mRGVjYWRlLmpzCmZ1bmN0aW9uIGxhc3REYXlPZkRlY2FkZShkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGNvbnN0IHllYXIgPSBfZGF0ZS5nZXRGdWxsWWVhcigpOwogIGNvbnN0IGRlY2FkZSA9IDkgKyBNYXRoLmZsb29yKHllYXIgLyAxMCkgKiAxMDsKICBfZGF0ZS5zZXRGdWxsWWVhcihkZWNhZGUgKyAxLCAwLCAwKTsKICBfZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICByZXR1cm4gdG9EYXRlKF9kYXRlLCBvcHRpb25zPy5pbik7Cn0KX19uYW1lKGxhc3REYXlPZkRlY2FkZSwgImxhc3REYXlPZkRlY2FkZSIpOwp2YXIgbGFzdERheU9mRGVjYWRlX2RlZmF1bHQgPSBsYXN0RGF5T2ZEZWNhZGU7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xhc3REYXlPZldlZWsuanMKZnVuY3Rpb24gbGFzdERheU9mV2VlayhkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgZGVmYXVsdE9wdGlvbnMyID0gZ2V0RGVmYXVsdE9wdGlvbnMoKTsKICBjb25zdCB3ZWVrU3RhcnRzT24gPSBvcHRpb25zPy53ZWVrU3RhcnRzT24gPz8gb3B0aW9ucz8ubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz8gZGVmYXVsdE9wdGlvbnMyLndlZWtTdGFydHNPbiA/PyBkZWZhdWx0T3B0aW9uczIubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz8gMDsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgZGF5ID0gX2RhdGUuZ2V0RGF5KCk7CiAgY29uc3QgZGlmZiA9IChkYXkgPCB3ZWVrU3RhcnRzT24gPyAtNyA6IDApICsgNiAtIChkYXkgLSB3ZWVrU3RhcnRzT24pOwogIF9kYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogIF9kYXRlLnNldERhdGUoX2RhdGUuZ2V0RGF0ZSgpICsgZGlmZik7CiAgcmV0dXJuIF9kYXRlOwp9Cl9fbmFtZShsYXN0RGF5T2ZXZWVrLCAibGFzdERheU9mV2VlayIpOwp2YXIgbGFzdERheU9mV2Vla19kZWZhdWx0ID0gbGFzdERheU9mV2VlazsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbGFzdERheU9mSVNPV2Vlay5qcwpmdW5jdGlvbiBsYXN0RGF5T2ZJU09XZWVrKGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gbGFzdERheU9mV2VlayhkYXRlLCB7IC4uLm9wdGlvbnMsIHdlZWtTdGFydHNPbjogMSB9KTsKfQpfX25hbWUobGFzdERheU9mSVNPV2VlaywgImxhc3REYXlPZklTT1dlZWsiKTsKdmFyIGxhc3REYXlPZklTT1dlZWtfZGVmYXVsdCA9IGxhc3REYXlPZklTT1dlZWs7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xhc3REYXlPZklTT1dlZWtZZWFyLmpzCmZ1bmN0aW9uIGxhc3REYXlPZklTT1dlZWtZZWFyKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCB5ZWFyID0gZ2V0SVNPV2Vla1llYXIoZGF0ZSwgb3B0aW9ucyk7CiAgY29uc3QgZm91cnRoT2ZKYW51YXJ5ID0gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCAwKTsKICBmb3VydGhPZkphbnVhcnkuc2V0RnVsbFllYXIoeWVhciArIDEsIDAsIDQpOwogIGZvdXJ0aE9mSmFudWFyeS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICBjb25zdCBkYXRlXyA9IHN0YXJ0T2ZJU09XZWVrKGZvdXJ0aE9mSmFudWFyeSwgb3B0aW9ucyk7CiAgZGF0ZV8uc2V0RGF0ZShkYXRlXy5nZXREYXRlKCkgLSAxKTsKICByZXR1cm4gZGF0ZV87Cn0KX19uYW1lKGxhc3REYXlPZklTT1dlZWtZZWFyLCAibGFzdERheU9mSVNPV2Vla1llYXIiKTsKdmFyIGxhc3REYXlPZklTT1dlZWtZZWFyX2RlZmF1bHQgPSBsYXN0RGF5T2ZJU09XZWVrWWVhcjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbGFzdERheU9mUXVhcnRlci5qcwpmdW5jdGlvbiBsYXN0RGF5T2ZRdWFydGVyKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBkYXRlXyA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgY3VycmVudE1vbnRoID0gZGF0ZV8uZ2V0TW9udGgoKTsKICBjb25zdCBtb250aCA9IGN1cnJlbnRNb250aCAtIGN1cnJlbnRNb250aCAlIDMgKyAzOwogIGRhdGVfLnNldE1vbnRoKG1vbnRoLCAwKTsKICBkYXRlXy5zZXRIb3VycygwLCAwLCAwLCAwKTsKICByZXR1cm4gZGF0ZV87Cn0KX19uYW1lKGxhc3REYXlPZlF1YXJ0ZXIsICJsYXN0RGF5T2ZRdWFydGVyIik7CnZhciBsYXN0RGF5T2ZRdWFydGVyX2RlZmF1bHQgPSBsYXN0RGF5T2ZRdWFydGVyOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sYXN0RGF5T2ZZZWFyLmpzCmZ1bmN0aW9uIGxhc3REYXlPZlllYXIoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IGRhdGVfID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCB5ZWFyID0gZGF0ZV8uZ2V0RnVsbFllYXIoKTsKICBkYXRlXy5zZXRGdWxsWWVhcih5ZWFyICsgMSwgMCwgMCk7CiAgZGF0ZV8uc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgcmV0dXJuIGRhdGVfOwp9Cl9fbmFtZShsYXN0RGF5T2ZZZWFyLCAibGFzdERheU9mWWVhciIpOwp2YXIgbGFzdERheU9mWWVhcl9kZWZhdWx0ID0gbGFzdERheU9mWWVhcjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbGlnaHRGb3JtYXQuanMKdmFyIGZvcm1hdHRpbmdUb2tlbnNSZWdFeHAzID0gLyhcdylcMSp8Jyd8JygnJ3xbXiddKSsoJ3wkKXwuL2c7CnZhciBlc2NhcGVkU3RyaW5nUmVnRXhwMyA9IC9eJyhbXl0qPyknPyQvOwp2YXIgZG91YmxlUXVvdGVSZWdFeHAzID0gLycnL2c7CnZhciB1bmVzY2FwZWRMYXRpbkNoYXJhY3RlclJlZ0V4cDMgPSAvW2EtekEtWl0vOwpmdW5jdGlvbiBsaWdodEZvcm1hdChkYXRlLCBmb3JtYXRTdHIpIHsKICBjb25zdCBkYXRlXyA9IHRvRGF0ZShkYXRlKTsKICBpZiAoIWlzVmFsaWQoZGF0ZV8pKSB7CiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0aW1lIHZhbHVlIik7CiAgfQogIGNvbnN0IHRva2VucyA9IGZvcm1hdFN0ci5tYXRjaChmb3JtYXR0aW5nVG9rZW5zUmVnRXhwMyk7CiAgaWYgKCF0b2tlbnMpIHJldHVybiAiIjsKICBjb25zdCByZXN1bHQgPSB0b2tlbnMubWFwKChzdWJzdHJpbmcpID0+IHsKICAgIGlmIChzdWJzdHJpbmcgPT09ICInJyIpIHsKICAgICAgcmV0dXJuICInIjsKICAgIH0KICAgIGNvbnN0IGZpcnN0Q2hhcmFjdGVyID0gc3Vic3RyaW5nWzBdOwogICAgaWYgKGZpcnN0Q2hhcmFjdGVyID09PSAiJyIpIHsKICAgICAgcmV0dXJuIGNsZWFuRXNjYXBlZFN0cmluZzMoc3Vic3RyaW5nKTsKICAgIH0KICAgIGNvbnN0IGZvcm1hdHRlcjIgPSBsaWdodEZvcm1hdHRlcnNbZmlyc3RDaGFyYWN0ZXJdOwogICAgaWYgKGZvcm1hdHRlcjIpIHsKICAgICAgcmV0dXJuIGZvcm1hdHRlcjIoZGF0ZV8sIHN1YnN0cmluZyk7CiAgICB9CiAgICBpZiAoZmlyc3RDaGFyYWN0ZXIubWF0Y2godW5lc2NhcGVkTGF0aW5DaGFyYWN0ZXJSZWdFeHAzKSkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigKICAgICAgICAiRm9ybWF0IHN0cmluZyBjb250YWlucyBhbiB1bmVzY2FwZWQgbGF0aW4gYWxwaGFiZXQgY2hhcmFjdGVyIGAiICsgZmlyc3RDaGFyYWN0ZXIgKyAiYCIKICAgICAgKTsKICAgIH0KICAgIHJldHVybiBzdWJzdHJpbmc7CiAgfSkuam9pbigiIik7CiAgcmV0dXJuIHJlc3VsdDsKfQpfX25hbWUobGlnaHRGb3JtYXQsICJsaWdodEZvcm1hdCIpOwpmdW5jdGlvbiBjbGVhbkVzY2FwZWRTdHJpbmczKGlucHV0KSB7CiAgY29uc3QgbWF0Y2hlcyA9IGlucHV0Lm1hdGNoKGVzY2FwZWRTdHJpbmdSZWdFeHAzKTsKICBpZiAoIW1hdGNoZXMpIHJldHVybiBpbnB1dDsKICByZXR1cm4gbWF0Y2hlc1sxXS5yZXBsYWNlKGRvdWJsZVF1b3RlUmVnRXhwMywgIiciKTsKfQpfX25hbWUoY2xlYW5Fc2NhcGVkU3RyaW5nMywgImNsZWFuRXNjYXBlZFN0cmluZyIpOwp2YXIgbGlnaHRGb3JtYXRfZGVmYXVsdCA9IGxpZ2h0Rm9ybWF0OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9taWxsaXNlY29uZHMuanMKZnVuY3Rpb24gbWlsbGlzZWNvbmRzKHsKICB5ZWFycywKICBtb250aHM6IG1vbnRoczIsCiAgd2Vla3MsCiAgZGF5czogZGF5czIsCiAgaG91cnMsCiAgbWludXRlcywKICBzZWNvbmRzCn0pIHsKICBsZXQgdG90YWxEYXlzID0gMDsKICBpZiAoeWVhcnMpIHRvdGFsRGF5cyArPSB5ZWFycyAqIGRheXNJblllYXI7CiAgaWYgKG1vbnRoczIpIHRvdGFsRGF5cyArPSBtb250aHMyICogKGRheXNJblllYXIgLyAxMik7CiAgaWYgKHdlZWtzKSB0b3RhbERheXMgKz0gd2Vla3MgKiA3OwogIGlmIChkYXlzMikgdG90YWxEYXlzICs9IGRheXMyOwogIGxldCB0b3RhbFNlY29uZHMgPSB0b3RhbERheXMgKiAyNCAqIDYwICogNjA7CiAgaWYgKGhvdXJzKSB0b3RhbFNlY29uZHMgKz0gaG91cnMgKiA2MCAqIDYwOwogIGlmIChtaW51dGVzKSB0b3RhbFNlY29uZHMgKz0gbWludXRlcyAqIDYwOwogIGlmIChzZWNvbmRzKSB0b3RhbFNlY29uZHMgKz0gc2Vjb25kczsKICByZXR1cm4gTWF0aC50cnVuYyh0b3RhbFNlY29uZHMgKiAxZTMpOwp9Cl9fbmFtZShtaWxsaXNlY29uZHMsICJtaWxsaXNlY29uZHMiKTsKdmFyIG1pbGxpc2Vjb25kc19kZWZhdWx0ID0gbWlsbGlzZWNvbmRzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9taWxsaXNlY29uZHNUb0hvdXJzLmpzCmZ1bmN0aW9uIG1pbGxpc2Vjb25kc1RvSG91cnMobWlsbGlzZWNvbmRzMikgewogIGNvbnN0IGhvdXJzID0gbWlsbGlzZWNvbmRzMiAvIG1pbGxpc2Vjb25kc0luSG91cjsKICByZXR1cm4gTWF0aC50cnVuYyhob3Vycyk7Cn0KX19uYW1lKG1pbGxpc2Vjb25kc1RvSG91cnMsICJtaWxsaXNlY29uZHNUb0hvdXJzIik7CnZhciBtaWxsaXNlY29uZHNUb0hvdXJzX2RlZmF1bHQgPSBtaWxsaXNlY29uZHNUb0hvdXJzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9taWxsaXNlY29uZHNUb01pbnV0ZXMuanMKZnVuY3Rpb24gbWlsbGlzZWNvbmRzVG9NaW51dGVzKG1pbGxpc2Vjb25kczIpIHsKICBjb25zdCBtaW51dGVzID0gbWlsbGlzZWNvbmRzMiAvIG1pbGxpc2Vjb25kc0luTWludXRlOwogIHJldHVybiBNYXRoLnRydW5jKG1pbnV0ZXMpOwp9Cl9fbmFtZShtaWxsaXNlY29uZHNUb01pbnV0ZXMsICJtaWxsaXNlY29uZHNUb01pbnV0ZXMiKTsKdmFyIG1pbGxpc2Vjb25kc1RvTWludXRlc19kZWZhdWx0ID0gbWlsbGlzZWNvbmRzVG9NaW51dGVzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9taWxsaXNlY29uZHNUb1NlY29uZHMuanMKZnVuY3Rpb24gbWlsbGlzZWNvbmRzVG9TZWNvbmRzKG1pbGxpc2Vjb25kczIpIHsKICBjb25zdCBzZWNvbmRzID0gbWlsbGlzZWNvbmRzMiAvIG1pbGxpc2Vjb25kc0luU2Vjb25kOwogIHJldHVybiBNYXRoLnRydW5jKHNlY29uZHMpOwp9Cl9fbmFtZShtaWxsaXNlY29uZHNUb1NlY29uZHMsICJtaWxsaXNlY29uZHNUb1NlY29uZHMiKTsKdmFyIG1pbGxpc2Vjb25kc1RvU2Vjb25kc19kZWZhdWx0ID0gbWlsbGlzZWNvbmRzVG9TZWNvbmRzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9taW51dGVzVG9Ib3Vycy5qcwpmdW5jdGlvbiBtaW51dGVzVG9Ib3VycyhtaW51dGVzKSB7CiAgY29uc3QgaG91cnMgPSBtaW51dGVzIC8gbWludXRlc0luSG91cjsKICByZXR1cm4gTWF0aC50cnVuYyhob3Vycyk7Cn0KX19uYW1lKG1pbnV0ZXNUb0hvdXJzLCAibWludXRlc1RvSG91cnMiKTsKdmFyIG1pbnV0ZXNUb0hvdXJzX2RlZmF1bHQgPSBtaW51dGVzVG9Ib3VyczsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbWludXRlc1RvTWlsbGlzZWNvbmRzLmpzCmZ1bmN0aW9uIG1pbnV0ZXNUb01pbGxpc2Vjb25kcyhtaW51dGVzKSB7CiAgcmV0dXJuIE1hdGgudHJ1bmMobWludXRlcyAqIG1pbGxpc2Vjb25kc0luTWludXRlKTsKfQpfX25hbWUobWludXRlc1RvTWlsbGlzZWNvbmRzLCAibWludXRlc1RvTWlsbGlzZWNvbmRzIik7CnZhciBtaW51dGVzVG9NaWxsaXNlY29uZHNfZGVmYXVsdCA9IG1pbnV0ZXNUb01pbGxpc2Vjb25kczsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbWludXRlc1RvU2Vjb25kcy5qcwpmdW5jdGlvbiBtaW51dGVzVG9TZWNvbmRzKG1pbnV0ZXMpIHsKICByZXR1cm4gTWF0aC50cnVuYyhtaW51dGVzICogc2Vjb25kc0luTWludXRlKTsKfQpfX25hbWUobWludXRlc1RvU2Vjb25kcywgIm1pbnV0ZXNUb1NlY29uZHMiKTsKdmFyIG1pbnV0ZXNUb1NlY29uZHNfZGVmYXVsdCA9IG1pbnV0ZXNUb1NlY29uZHM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL21vbnRoc1RvUXVhcnRlcnMuanMKZnVuY3Rpb24gbW9udGhzVG9RdWFydGVycyhtb250aHMyKSB7CiAgY29uc3QgcXVhcnRlcnMgPSBtb250aHMyIC8gbW9udGhzSW5RdWFydGVyOwogIHJldHVybiBNYXRoLnRydW5jKHF1YXJ0ZXJzKTsKfQpfX25hbWUobW9udGhzVG9RdWFydGVycywgIm1vbnRoc1RvUXVhcnRlcnMiKTsKdmFyIG1vbnRoc1RvUXVhcnRlcnNfZGVmYXVsdCA9IG1vbnRoc1RvUXVhcnRlcnM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL21vbnRoc1RvWWVhcnMuanMKZnVuY3Rpb24gbW9udGhzVG9ZZWFycyhtb250aHMyKSB7CiAgY29uc3QgeWVhcnMgPSBtb250aHMyIC8gbW9udGhzSW5ZZWFyOwogIHJldHVybiBNYXRoLnRydW5jKHllYXJzKTsKfQpfX25hbWUobW9udGhzVG9ZZWFycywgIm1vbnRoc1RvWWVhcnMiKTsKdmFyIG1vbnRoc1RvWWVhcnNfZGVmYXVsdCA9IG1vbnRoc1RvWWVhcnM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL25leHREYXkuanMKZnVuY3Rpb24gbmV4dERheShkYXRlLCBkYXksIG9wdGlvbnMpIHsKICBsZXQgZGVsdGEgPSBkYXkgLSBnZXREYXkoZGF0ZSwgb3B0aW9ucyk7CiAgaWYgKGRlbHRhIDw9IDApIGRlbHRhICs9IDc7CiAgcmV0dXJuIGFkZERheXMoZGF0ZSwgZGVsdGEsIG9wdGlvbnMpOwp9Cl9fbmFtZShuZXh0RGF5LCAibmV4dERheSIpOwp2YXIgbmV4dERheV9kZWZhdWx0ID0gbmV4dERheTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbmV4dEZyaWRheS5qcwpmdW5jdGlvbiBuZXh0RnJpZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gbmV4dERheShkYXRlLCA1LCBvcHRpb25zKTsKfQpfX25hbWUobmV4dEZyaWRheSwgIm5leHRGcmlkYXkiKTsKdmFyIG5leHRGcmlkYXlfZGVmYXVsdCA9IG5leHRGcmlkYXk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL25leHRNb25kYXkuanMKZnVuY3Rpb24gbmV4dE1vbmRheShkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIG5leHREYXkoZGF0ZSwgMSwgb3B0aW9ucyk7Cn0KX19uYW1lKG5leHRNb25kYXksICJuZXh0TW9uZGF5Iik7CnZhciBuZXh0TW9uZGF5X2RlZmF1bHQgPSBuZXh0TW9uZGF5OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9uZXh0U2F0dXJkYXkuanMKZnVuY3Rpb24gbmV4dFNhdHVyZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gbmV4dERheShkYXRlLCA2LCBvcHRpb25zKTsKfQpfX25hbWUobmV4dFNhdHVyZGF5LCAibmV4dFNhdHVyZGF5Iik7CnZhciBuZXh0U2F0dXJkYXlfZGVmYXVsdCA9IG5leHRTYXR1cmRheTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbmV4dFN1bmRheS5qcwpmdW5jdGlvbiBuZXh0U3VuZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gbmV4dERheShkYXRlLCAwLCBvcHRpb25zKTsKfQpfX25hbWUobmV4dFN1bmRheSwgIm5leHRTdW5kYXkiKTsKdmFyIG5leHRTdW5kYXlfZGVmYXVsdCA9IG5leHRTdW5kYXk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL25leHRUaHVyc2RheS5qcwpmdW5jdGlvbiBuZXh0VGh1cnNkYXkoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiBuZXh0RGF5KGRhdGUsIDQsIG9wdGlvbnMpOwp9Cl9fbmFtZShuZXh0VGh1cnNkYXksICJuZXh0VGh1cnNkYXkiKTsKdmFyIG5leHRUaHVyc2RheV9kZWZhdWx0ID0gbmV4dFRodXJzZGF5OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9uZXh0VHVlc2RheS5qcwpmdW5jdGlvbiBuZXh0VHVlc2RheShkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIG5leHREYXkoZGF0ZSwgMiwgb3B0aW9ucyk7Cn0KX19uYW1lKG5leHRUdWVzZGF5LCAibmV4dFR1ZXNkYXkiKTsKdmFyIG5leHRUdWVzZGF5X2RlZmF1bHQgPSBuZXh0VHVlc2RheTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbmV4dFdlZG5lc2RheS5qcwpmdW5jdGlvbiBuZXh0V2VkbmVzZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gbmV4dERheShkYXRlLCAzLCBvcHRpb25zKTsKfQpfX25hbWUobmV4dFdlZG5lc2RheSwgIm5leHRXZWRuZXNkYXkiKTsKdmFyIG5leHRXZWRuZXNkYXlfZGVmYXVsdCA9IG5leHRXZWRuZXNkYXk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlSVNPLmpzCmZ1bmN0aW9uIHBhcnNlSVNPKGFyZ3VtZW50LCBvcHRpb25zKSB7CiAgY29uc3QgaW52YWxpZERhdGUgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCgpID0+IGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4sIE5hTiksICJpbnZhbGlkRGF0ZSIpOwogIGNvbnN0IGFkZGl0aW9uYWxEaWdpdHMgPSBvcHRpb25zPy5hZGRpdGlvbmFsRGlnaXRzID8/IDI7CiAgY29uc3QgZGF0ZVN0cmluZ3MgPSBzcGxpdERhdGVTdHJpbmcoYXJndW1lbnQpOwogIGxldCBkYXRlOwogIGlmIChkYXRlU3RyaW5ncy5kYXRlKSB7CiAgICBjb25zdCBwYXJzZVllYXJSZXN1bHQgPSBwYXJzZVllYXIoZGF0ZVN0cmluZ3MuZGF0ZSwgYWRkaXRpb25hbERpZ2l0cyk7CiAgICBkYXRlID0gcGFyc2VEYXRlKHBhcnNlWWVhclJlc3VsdC5yZXN0RGF0ZVN0cmluZywgcGFyc2VZZWFyUmVzdWx0LnllYXIpOwogIH0KICBpZiAoIWRhdGUgfHwgaXNOYU4oK2RhdGUpKSByZXR1cm4gaW52YWxpZERhdGUoKTsKICBjb25zdCB0aW1lc3RhbXAyID0gK2RhdGU7CiAgbGV0IHRpbWUgPSAwOwogIGxldCBvZmZzZXQ7CiAgaWYgKGRhdGVTdHJpbmdzLnRpbWUpIHsKICAgIHRpbWUgPSBwYXJzZVRpbWUoZGF0ZVN0cmluZ3MudGltZSk7CiAgICBpZiAoaXNOYU4odGltZSkpIHJldHVybiBpbnZhbGlkRGF0ZSgpOwogIH0KICBpZiAoZGF0ZVN0cmluZ3MudGltZXpvbmUpIHsKICAgIG9mZnNldCA9IHBhcnNlVGltZXpvbmUoZGF0ZVN0cmluZ3MudGltZXpvbmUpOwogICAgaWYgKGlzTmFOKG9mZnNldCkpIHJldHVybiBpbnZhbGlkRGF0ZSgpOwogIH0gZWxzZSB7CiAgICBjb25zdCB0bXBEYXRlID0gbmV3IERhdGUodGltZXN0YW1wMiArIHRpbWUpOwogICAgY29uc3QgcmVzdWx0ID0gdG9EYXRlKDAsIG9wdGlvbnM/LmluKTsKICAgIHJlc3VsdC5zZXRGdWxsWWVhcigKICAgICAgdG1wRGF0ZS5nZXRVVENGdWxsWWVhcigpLAogICAgICB0bXBEYXRlLmdldFVUQ01vbnRoKCksCiAgICAgIHRtcERhdGUuZ2V0VVRDRGF0ZSgpCiAgICApOwogICAgcmVzdWx0LnNldEhvdXJzKAogICAgICB0bXBEYXRlLmdldFVUQ0hvdXJzKCksCiAgICAgIHRtcERhdGUuZ2V0VVRDTWludXRlcygpLAogICAgICB0bXBEYXRlLmdldFVUQ1NlY29uZHMoKSwKICAgICAgdG1wRGF0ZS5nZXRVVENNaWxsaXNlY29uZHMoKQogICAgKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQogIHJldHVybiB0b0RhdGUodGltZXN0YW1wMiArIHRpbWUgKyBvZmZzZXQsIG9wdGlvbnM/LmluKTsKfQpfX25hbWUocGFyc2VJU08sICJwYXJzZUlTTyIpOwp2YXIgcGF0dGVybnMgPSB7CiAgZGF0ZVRpbWVEZWxpbWl0ZXI6IC9bVCBdLywKICB0aW1lWm9uZURlbGltaXRlcjogL1taIF0vaSwKICB0aW1lem9uZTogLyhbWistXS4qKSQvCn07CnZhciBkYXRlUmVnZXggPSAvXi0/KD86KFxkezN9KXwoXGR7Mn0pKD86LT8oXGR7Mn0pKT98VyhcZHsyfSkoPzotPyhcZHsxfSkpP3wpJC87CnZhciB0aW1lUmVnZXggPSAvXihcZHsyfSg/OlsuLF1cZCopPykoPzo6PyhcZHsyfSg/OlsuLF1cZCopPykpPyg/Ojo/KFxkezJ9KD86Wy4sXVxkKik/KSk/JC87CnZhciB0aW1lem9uZVJlZ2V4ID0gL14oWystXSkoXGR7Mn0pKD86Oj8oXGR7Mn0pKT8kLzsKZnVuY3Rpb24gc3BsaXREYXRlU3RyaW5nKGRhdGVTdHJpbmcpIHsKICBjb25zdCBkYXRlU3RyaW5ncyA9IHt9OwogIGNvbnN0IGFycmF5ID0gZGF0ZVN0cmluZy5zcGxpdChwYXR0ZXJucy5kYXRlVGltZURlbGltaXRlcik7CiAgbGV0IHRpbWVTdHJpbmc7CiAgaWYgKGFycmF5Lmxlbmd0aCA+IDIpIHsKICAgIHJldHVybiBkYXRlU3RyaW5nczsKICB9CiAgaWYgKC86Ly50ZXN0KGFycmF5WzBdKSkgewogICAgdGltZVN0cmluZyA9IGFycmF5WzBdOwogIH0gZWxzZSB7CiAgICBkYXRlU3RyaW5ncy5kYXRlID0gYXJyYXlbMF07CiAgICB0aW1lU3RyaW5nID0gYXJyYXlbMV07CiAgICBpZiAocGF0dGVybnMudGltZVpvbmVEZWxpbWl0ZXIudGVzdChkYXRlU3RyaW5ncy5kYXRlKSkgewogICAgICBkYXRlU3RyaW5ncy5kYXRlID0gZGF0ZVN0cmluZy5zcGxpdChwYXR0ZXJucy50aW1lWm9uZURlbGltaXRlcilbMF07CiAgICAgIHRpbWVTdHJpbmcgPSBkYXRlU3RyaW5nLnN1YnN0cigKICAgICAgICBkYXRlU3RyaW5ncy5kYXRlLmxlbmd0aCwKICAgICAgICBkYXRlU3RyaW5nLmxlbmd0aAogICAgICApOwogICAgfQogIH0KICBpZiAodGltZVN0cmluZykgewogICAgY29uc3QgdG9rZW4gPSBwYXR0ZXJucy50aW1lem9uZS5leGVjKHRpbWVTdHJpbmcpOwogICAgaWYgKHRva2VuKSB7CiAgICAgIGRhdGVTdHJpbmdzLnRpbWUgPSB0aW1lU3RyaW5nLnJlcGxhY2UodG9rZW5bMV0sICIiKTsKICAgICAgZGF0ZVN0cmluZ3MudGltZXpvbmUgPSB0b2tlblsxXTsKICAgIH0gZWxzZSB7CiAgICAgIGRhdGVTdHJpbmdzLnRpbWUgPSB0aW1lU3RyaW5nOwogICAgfQogIH0KICByZXR1cm4gZGF0ZVN0cmluZ3M7Cn0KX19uYW1lKHNwbGl0RGF0ZVN0cmluZywgInNwbGl0RGF0ZVN0cmluZyIpOwpmdW5jdGlvbiBwYXJzZVllYXIoZGF0ZVN0cmluZywgYWRkaXRpb25hbERpZ2l0cykgewogIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cCgKICAgICJeKD86KFxcZHs0fXxbKy1dXFxkeyIgKyAoNCArIGFkZGl0aW9uYWxEaWdpdHMpICsgIn0pfChcXGR7Mn18WystXVxcZHsiICsgKDIgKyBhZGRpdGlvbmFsRGlnaXRzKSArICJ9KSQpIgogICk7CiAgY29uc3QgY2FwdHVyZXMgPSBkYXRlU3RyaW5nLm1hdGNoKHJlZ2V4KTsKICBpZiAoIWNhcHR1cmVzKSByZXR1cm4geyB5ZWFyOiBOYU4sIHJlc3REYXRlU3RyaW5nOiAiIiB9OwogIGNvbnN0IHllYXIgPSBjYXB0dXJlc1sxXSA/IHBhcnNlSW50KGNhcHR1cmVzWzFdKSA6IG51bGw7CiAgY29uc3QgY2VudHVyeSA9IGNhcHR1cmVzWzJdID8gcGFyc2VJbnQoY2FwdHVyZXNbMl0pIDogbnVsbDsKICByZXR1cm4gewogICAgeWVhcjogY2VudHVyeSA9PT0gbnVsbCA/IHllYXIgOiBjZW50dXJ5ICogMTAwLAogICAgcmVzdERhdGVTdHJpbmc6IGRhdGVTdHJpbmcuc2xpY2UoKGNhcHR1cmVzWzFdIHx8IGNhcHR1cmVzWzJdKS5sZW5ndGgpCiAgfTsKfQpfX25hbWUocGFyc2VZZWFyLCAicGFyc2VZZWFyIik7CmZ1bmN0aW9uIHBhcnNlRGF0ZShkYXRlU3RyaW5nLCB5ZWFyKSB7CiAgaWYgKHllYXIgPT09IG51bGwpIHJldHVybiAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoTmFOKTsKICBjb25zdCBjYXB0dXJlcyA9IGRhdGVTdHJpbmcubWF0Y2goZGF0ZVJlZ2V4KTsKICBpZiAoIWNhcHR1cmVzKSByZXR1cm4gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKE5hTik7CiAgY29uc3QgaXNXZWVrRGF0ZSA9ICEhY2FwdHVyZXNbNF07CiAgY29uc3QgZGF5T2ZZZWFyID0gcGFyc2VEYXRlVW5pdChjYXB0dXJlc1sxXSk7CiAgY29uc3QgbW9udGggPSBwYXJzZURhdGVVbml0KGNhcHR1cmVzWzJdKSAtIDE7CiAgY29uc3QgZGF5ID0gcGFyc2VEYXRlVW5pdChjYXB0dXJlc1szXSk7CiAgY29uc3Qgd2VlayA9IHBhcnNlRGF0ZVVuaXQoY2FwdHVyZXNbNF0pOwogIGNvbnN0IGRheU9mV2VlayA9IHBhcnNlRGF0ZVVuaXQoY2FwdHVyZXNbNV0pIC0gMTsKICBpZiAoaXNXZWVrRGF0ZSkgewogICAgaWYgKCF2YWxpZGF0ZVdlZWtEYXRlKHllYXIsIHdlZWssIGRheU9mV2VlaykpIHsKICAgICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZShOYU4pOwogICAgfQogICAgcmV0dXJuIGRheU9mSVNPV2Vla1llYXIoeWVhciwgd2VlaywgZGF5T2ZXZWVrKTsKICB9IGVsc2UgewogICAgY29uc3QgZGF0ZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgwKTsKICAgIGlmICghdmFsaWRhdGVEYXRlKHllYXIsIG1vbnRoLCBkYXkpIHx8ICF2YWxpZGF0ZURheU9mWWVhckRhdGUoeWVhciwgZGF5T2ZZZWFyKSkgewogICAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKE5hTik7CiAgICB9CiAgICBkYXRlLnNldFVUQ0Z1bGxZZWFyKHllYXIsIG1vbnRoLCBNYXRoLm1heChkYXlPZlllYXIsIGRheSkpOwogICAgcmV0dXJuIGRhdGU7CiAgfQp9Cl9fbmFtZShwYXJzZURhdGUsICJwYXJzZURhdGUiKTsKZnVuY3Rpb24gcGFyc2VEYXRlVW5pdCh2YWx1ZTIpIHsKICByZXR1cm4gdmFsdWUyID8gcGFyc2VJbnQodmFsdWUyKSA6IDE7Cn0KX19uYW1lKHBhcnNlRGF0ZVVuaXQsICJwYXJzZURhdGVVbml0Iik7CmZ1bmN0aW9uIHBhcnNlVGltZSh0aW1lU3RyaW5nKSB7CiAgY29uc3QgY2FwdHVyZXMgPSB0aW1lU3RyaW5nLm1hdGNoKHRpbWVSZWdleCk7CiAgaWYgKCFjYXB0dXJlcykgcmV0dXJuIE5hTjsKICBjb25zdCBob3VycyA9IHBhcnNlVGltZVVuaXQoY2FwdHVyZXNbMV0pOwogIGNvbnN0IG1pbnV0ZXMgPSBwYXJzZVRpbWVVbml0KGNhcHR1cmVzWzJdKTsKICBjb25zdCBzZWNvbmRzID0gcGFyc2VUaW1lVW5pdChjYXB0dXJlc1szXSk7CiAgaWYgKCF2YWxpZGF0ZVRpbWUoaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMpKSB7CiAgICByZXR1cm4gTmFOOwogIH0KICByZXR1cm4gaG91cnMgKiBtaWxsaXNlY29uZHNJbkhvdXIgKyBtaW51dGVzICogbWlsbGlzZWNvbmRzSW5NaW51dGUgKyBzZWNvbmRzICogMWUzOwp9Cl9fbmFtZShwYXJzZVRpbWUsICJwYXJzZVRpbWUiKTsKZnVuY3Rpb24gcGFyc2VUaW1lVW5pdCh2YWx1ZTIpIHsKICByZXR1cm4gdmFsdWUyICYmIHBhcnNlRmxvYXQodmFsdWUyLnJlcGxhY2UoIiwiLCAiLiIpKSB8fCAwOwp9Cl9fbmFtZShwYXJzZVRpbWVVbml0LCAicGFyc2VUaW1lVW5pdCIpOwpmdW5jdGlvbiBwYXJzZVRpbWV6b25lKHRpbWV6b25lU3RyaW5nKSB7CiAgaWYgKHRpbWV6b25lU3RyaW5nID09PSAiWiIpIHJldHVybiAwOwogIGNvbnN0IGNhcHR1cmVzID0gdGltZXpvbmVTdHJpbmcubWF0Y2godGltZXpvbmVSZWdleCk7CiAgaWYgKCFjYXB0dXJlcykgcmV0dXJuIDA7CiAgY29uc3Qgc2lnbiA9IGNhcHR1cmVzWzFdID09PSAiKyIgPyAtMSA6IDE7CiAgY29uc3QgaG91cnMgPSBwYXJzZUludChjYXB0dXJlc1syXSk7CiAgY29uc3QgbWludXRlcyA9IGNhcHR1cmVzWzNdICYmIHBhcnNlSW50KGNhcHR1cmVzWzNdKSB8fCAwOwogIGlmICghdmFsaWRhdGVUaW1lem9uZShob3VycywgbWludXRlcykpIHsKICAgIHJldHVybiBOYU47CiAgfQogIHJldHVybiBzaWduICogKGhvdXJzICogbWlsbGlzZWNvbmRzSW5Ib3VyICsgbWludXRlcyAqIG1pbGxpc2Vjb25kc0luTWludXRlKTsKfQpfX25hbWUocGFyc2VUaW1lem9uZSwgInBhcnNlVGltZXpvbmUiKTsKZnVuY3Rpb24gZGF5T2ZJU09XZWVrWWVhcihpc29XZWVrWWVhciwgd2VlaywgZGF5KSB7CiAgY29uc3QgZGF0ZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgwKTsKICBkYXRlLnNldFVUQ0Z1bGxZZWFyKGlzb1dlZWtZZWFyLCAwLCA0KTsKICBjb25zdCBmb3VydGhPZkphbnVhcnlEYXkgPSBkYXRlLmdldFVUQ0RheSgpIHx8IDc7CiAgY29uc3QgZGlmZiA9ICh3ZWVrIC0gMSkgKiA3ICsgZGF5ICsgMSAtIGZvdXJ0aE9mSmFudWFyeURheTsKICBkYXRlLnNldFVUQ0RhdGUoZGF0ZS5nZXRVVENEYXRlKCkgKyBkaWZmKTsKICByZXR1cm4gZGF0ZTsKfQpfX25hbWUoZGF5T2ZJU09XZWVrWWVhciwgImRheU9mSVNPV2Vla1llYXIiKTsKdmFyIGRheXNJbk1vbnRocyA9IFszMSwgbnVsbCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdOwpmdW5jdGlvbiBpc0xlYXBZZWFySW5kZXgyKHllYXIpIHsKICByZXR1cm4geWVhciAlIDQwMCA9PT0gMCB8fCB5ZWFyICUgNCA9PT0gMCAmJiB5ZWFyICUgMTAwICE9PSAwOwp9Cl9fbmFtZShpc0xlYXBZZWFySW5kZXgyLCAiaXNMZWFwWWVhckluZGV4Iik7CmZ1bmN0aW9uIHZhbGlkYXRlRGF0ZSh5ZWFyLCBtb250aCwgZGF0ZSkgewogIHJldHVybiBtb250aCA+PSAwICYmIG1vbnRoIDw9IDExICYmIGRhdGUgPj0gMSAmJiBkYXRlIDw9IChkYXlzSW5Nb250aHNbbW9udGhdIHx8IChpc0xlYXBZZWFySW5kZXgyKHllYXIpID8gMjkgOiAyOCkpOwp9Cl9fbmFtZSh2YWxpZGF0ZURhdGUsICJ2YWxpZGF0ZURhdGUiKTsKZnVuY3Rpb24gdmFsaWRhdGVEYXlPZlllYXJEYXRlKHllYXIsIGRheU9mWWVhcikgewogIHJldHVybiBkYXlPZlllYXIgPj0gMSAmJiBkYXlPZlllYXIgPD0gKGlzTGVhcFllYXJJbmRleDIoeWVhcikgPyAzNjYgOiAzNjUpOwp9Cl9fbmFtZSh2YWxpZGF0ZURheU9mWWVhckRhdGUsICJ2YWxpZGF0ZURheU9mWWVhckRhdGUiKTsKZnVuY3Rpb24gdmFsaWRhdGVXZWVrRGF0ZShfeWVhciwgd2VlaywgZGF5KSB7CiAgcmV0dXJuIHdlZWsgPj0gMSAmJiB3ZWVrIDw9IDUzICYmIGRheSA+PSAwICYmIGRheSA8PSA2Owp9Cl9fbmFtZSh2YWxpZGF0ZVdlZWtEYXRlLCAidmFsaWRhdGVXZWVrRGF0ZSIpOwpmdW5jdGlvbiB2YWxpZGF0ZVRpbWUoaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMpIHsKICBpZiAoaG91cnMgPT09IDI0KSB7CiAgICByZXR1cm4gbWludXRlcyA9PT0gMCAmJiBzZWNvbmRzID09PSAwOwogIH0KICByZXR1cm4gc2Vjb25kcyA+PSAwICYmIHNlY29uZHMgPCA2MCAmJiBtaW51dGVzID49IDAgJiYgbWludXRlcyA8IDYwICYmIGhvdXJzID49IDAgJiYgaG91cnMgPCAyNTsKfQpfX25hbWUodmFsaWRhdGVUaW1lLCAidmFsaWRhdGVUaW1lIik7CmZ1bmN0aW9uIHZhbGlkYXRlVGltZXpvbmUoX2hvdXJzLCBtaW51dGVzKSB7CiAgcmV0dXJuIG1pbnV0ZXMgPj0gMCAmJiBtaW51dGVzIDw9IDU5Owp9Cl9fbmFtZSh2YWxpZGF0ZVRpbWV6b25lLCAidmFsaWRhdGVUaW1lem9uZSIpOwp2YXIgcGFyc2VJU09fZGVmYXVsdCA9IHBhcnNlSVNPOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZUpTT04uanMKZnVuY3Rpb24gcGFyc2VKU09OKGRhdGVTdHIsIG9wdGlvbnMpIHsKICBjb25zdCBwYXJ0cyA9IGRhdGVTdHIubWF0Y2goCiAgICAvKFxkezR9KS0oXGR7Mn0pLShcZHsyfSlbVCBdKFxkezJ9KTooXGR7Mn0pOihcZHsyfSkoPzpcLihcZHswLDd9KSk/KD86WnwoLikoXGR7Mn0pOj8oXGR7Mn0pPyk/LwogICk7CiAgaWYgKCFwYXJ0cykgcmV0dXJuIHRvRGF0ZShOYU4sIG9wdGlvbnM/LmluKTsKICByZXR1cm4gdG9EYXRlKAogICAgRGF0ZS5VVEMoCiAgICAgICtwYXJ0c1sxXSwKICAgICAgK3BhcnRzWzJdIC0gMSwKICAgICAgK3BhcnRzWzNdLAogICAgICArcGFydHNbNF0gLSAoK3BhcnRzWzldIHx8IDApICogKHBhcnRzWzhdID09ICItIiA/IC0xIDogMSksCiAgICAgICtwYXJ0c1s1XSAtICgrcGFydHNbMTBdIHx8IDApICogKHBhcnRzWzhdID09ICItIiA/IC0xIDogMSksCiAgICAgICtwYXJ0c1s2XSwKICAgICAgKygocGFydHNbN10gfHwgIjAiKSArICIwMCIpLnN1YnN0cmluZygwLCAzKQogICAgKSwKICAgIG9wdGlvbnM/LmluCiAgKTsKfQpfX25hbWUocGFyc2VKU09OLCAicGFyc2VKU09OIik7CnZhciBwYXJzZUpTT05fZGVmYXVsdCA9IHBhcnNlSlNPTjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcHJldmlvdXNEYXkuanMKZnVuY3Rpb24gcHJldmlvdXNEYXkoZGF0ZSwgZGF5LCBvcHRpb25zKSB7CiAgbGV0IGRlbHRhID0gZ2V0RGF5KGRhdGUsIG9wdGlvbnMpIC0gZGF5OwogIGlmIChkZWx0YSA8PSAwKSBkZWx0YSArPSA3OwogIHJldHVybiBzdWJEYXlzKGRhdGUsIGRlbHRhLCBvcHRpb25zKTsKfQpfX25hbWUocHJldmlvdXNEYXksICJwcmV2aW91c0RheSIpOwp2YXIgcHJldmlvdXNEYXlfZGVmYXVsdCA9IHByZXZpb3VzRGF5OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wcmV2aW91c0ZyaWRheS5qcwpmdW5jdGlvbiBwcmV2aW91c0ZyaWRheShkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIHByZXZpb3VzRGF5KGRhdGUsIDUsIG9wdGlvbnMpOwp9Cl9fbmFtZShwcmV2aW91c0ZyaWRheSwgInByZXZpb3VzRnJpZGF5Iik7CnZhciBwcmV2aW91c0ZyaWRheV9kZWZhdWx0ID0gcHJldmlvdXNGcmlkYXk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3ByZXZpb3VzTW9uZGF5LmpzCmZ1bmN0aW9uIHByZXZpb3VzTW9uZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gcHJldmlvdXNEYXkoZGF0ZSwgMSwgb3B0aW9ucyk7Cn0KX19uYW1lKHByZXZpb3VzTW9uZGF5LCAicHJldmlvdXNNb25kYXkiKTsKdmFyIHByZXZpb3VzTW9uZGF5X2RlZmF1bHQgPSBwcmV2aW91c01vbmRheTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcHJldmlvdXNTYXR1cmRheS5qcwpmdW5jdGlvbiBwcmV2aW91c1NhdHVyZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gcHJldmlvdXNEYXkoZGF0ZSwgNiwgb3B0aW9ucyk7Cn0KX19uYW1lKHByZXZpb3VzU2F0dXJkYXksICJwcmV2aW91c1NhdHVyZGF5Iik7CnZhciBwcmV2aW91c1NhdHVyZGF5X2RlZmF1bHQgPSBwcmV2aW91c1NhdHVyZGF5OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wcmV2aW91c1N1bmRheS5qcwpmdW5jdGlvbiBwcmV2aW91c1N1bmRheShkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIHByZXZpb3VzRGF5KGRhdGUsIDAsIG9wdGlvbnMpOwp9Cl9fbmFtZShwcmV2aW91c1N1bmRheSwgInByZXZpb3VzU3VuZGF5Iik7CnZhciBwcmV2aW91c1N1bmRheV9kZWZhdWx0ID0gcHJldmlvdXNTdW5kYXk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3ByZXZpb3VzVGh1cnNkYXkuanMKZnVuY3Rpb24gcHJldmlvdXNUaHVyc2RheShkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIHByZXZpb3VzRGF5KGRhdGUsIDQsIG9wdGlvbnMpOwp9Cl9fbmFtZShwcmV2aW91c1RodXJzZGF5LCAicHJldmlvdXNUaHVyc2RheSIpOwp2YXIgcHJldmlvdXNUaHVyc2RheV9kZWZhdWx0ID0gcHJldmlvdXNUaHVyc2RheTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcHJldmlvdXNUdWVzZGF5LmpzCmZ1bmN0aW9uIHByZXZpb3VzVHVlc2RheShkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIHByZXZpb3VzRGF5KGRhdGUsIDIsIG9wdGlvbnMpOwp9Cl9fbmFtZShwcmV2aW91c1R1ZXNkYXksICJwcmV2aW91c1R1ZXNkYXkiKTsKdmFyIHByZXZpb3VzVHVlc2RheV9kZWZhdWx0ID0gcHJldmlvdXNUdWVzZGF5OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wcmV2aW91c1dlZG5lc2RheS5qcwpmdW5jdGlvbiBwcmV2aW91c1dlZG5lc2RheShkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIHByZXZpb3VzRGF5KGRhdGUsIDMsIG9wdGlvbnMpOwp9Cl9fbmFtZShwcmV2aW91c1dlZG5lc2RheSwgInByZXZpb3VzV2VkbmVzZGF5Iik7CnZhciBwcmV2aW91c1dlZG5lc2RheV9kZWZhdWx0ID0gcHJldmlvdXNXZWRuZXNkYXk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3F1YXJ0ZXJzVG9Nb250aHMuanMKZnVuY3Rpb24gcXVhcnRlcnNUb01vbnRocyhxdWFydGVycykgewogIHJldHVybiBNYXRoLnRydW5jKHF1YXJ0ZXJzICogbW9udGhzSW5RdWFydGVyKTsKfQpfX25hbWUocXVhcnRlcnNUb01vbnRocywgInF1YXJ0ZXJzVG9Nb250aHMiKTsKdmFyIHF1YXJ0ZXJzVG9Nb250aHNfZGVmYXVsdCA9IHF1YXJ0ZXJzVG9Nb250aHM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3F1YXJ0ZXJzVG9ZZWFycy5qcwpmdW5jdGlvbiBxdWFydGVyc1RvWWVhcnMocXVhcnRlcnMpIHsKICBjb25zdCB5ZWFycyA9IHF1YXJ0ZXJzIC8gcXVhcnRlcnNJblllYXI7CiAgcmV0dXJuIE1hdGgudHJ1bmMoeWVhcnMpOwp9Cl9fbmFtZShxdWFydGVyc1RvWWVhcnMsICJxdWFydGVyc1RvWWVhcnMiKTsKdmFyIHF1YXJ0ZXJzVG9ZZWFyc19kZWZhdWx0ID0gcXVhcnRlcnNUb1llYXJzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9yb3VuZFRvTmVhcmVzdEhvdXJzLmpzCmZ1bmN0aW9uIHJvdW5kVG9OZWFyZXN0SG91cnMoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IG5lYXJlc3RUbyA9IG9wdGlvbnM/Lm5lYXJlc3RUbyA/PyAxOwogIGlmIChuZWFyZXN0VG8gPCAxIHx8IG5lYXJlc3RUbyA+IDEyKQogICAgcmV0dXJuIGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4gfHwgZGF0ZSwgTmFOKTsKICBjb25zdCBkYXRlXyA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgZnJhY3Rpb25hbE1pbnV0ZXMgPSBkYXRlXy5nZXRNaW51dGVzKCkgLyA2MDsKICBjb25zdCBmcmFjdGlvbmFsU2Vjb25kcyA9IGRhdGVfLmdldFNlY29uZHMoKSAvIDYwIC8gNjA7CiAgY29uc3QgZnJhY3Rpb25hbE1pbGxpc2Vjb25kcyA9IGRhdGVfLmdldE1pbGxpc2Vjb25kcygpIC8gMWUzIC8gNjAgLyA2MDsKICBjb25zdCBob3VycyA9IGRhdGVfLmdldEhvdXJzKCkgKyBmcmFjdGlvbmFsTWludXRlcyArIGZyYWN0aW9uYWxTZWNvbmRzICsgZnJhY3Rpb25hbE1pbGxpc2Vjb25kczsKICBjb25zdCBtZXRob2QgPSBvcHRpb25zPy5yb3VuZGluZ01ldGhvZCA/PyAicm91bmQiOwogIGNvbnN0IHJvdW5kaW5nTWV0aG9kID0gZ2V0Um91bmRpbmdNZXRob2QobWV0aG9kKTsKICBjb25zdCByb3VuZGVkSG91cnMgPSByb3VuZGluZ01ldGhvZChob3VycyAvIG5lYXJlc3RUbykgKiBuZWFyZXN0VG87CiAgZGF0ZV8uc2V0SG91cnMocm91bmRlZEhvdXJzLCAwLCAwLCAwKTsKICByZXR1cm4gZGF0ZV87Cn0KX19uYW1lKHJvdW5kVG9OZWFyZXN0SG91cnMsICJyb3VuZFRvTmVhcmVzdEhvdXJzIik7CnZhciByb3VuZFRvTmVhcmVzdEhvdXJzX2RlZmF1bHQgPSByb3VuZFRvTmVhcmVzdEhvdXJzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9yb3VuZFRvTmVhcmVzdE1pbnV0ZXMuanMKZnVuY3Rpb24gcm91bmRUb05lYXJlc3RNaW51dGVzKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBuZWFyZXN0VG8gPSBvcHRpb25zPy5uZWFyZXN0VG8gPz8gMTsKICBpZiAobmVhcmVzdFRvIDwgMSB8fCBuZWFyZXN0VG8gPiAzMCkgcmV0dXJuIGNvbnN0cnVjdEZyb20oZGF0ZSwgTmFOKTsKICBjb25zdCBkYXRlXyA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgZnJhY3Rpb25hbFNlY29uZHMgPSBkYXRlXy5nZXRTZWNvbmRzKCkgLyA2MDsKICBjb25zdCBmcmFjdGlvbmFsTWlsbGlzZWNvbmRzID0gZGF0ZV8uZ2V0TWlsbGlzZWNvbmRzKCkgLyAxZTMgLyA2MDsKICBjb25zdCBtaW51dGVzID0gZGF0ZV8uZ2V0TWludXRlcygpICsgZnJhY3Rpb25hbFNlY29uZHMgKyBmcmFjdGlvbmFsTWlsbGlzZWNvbmRzOwogIGNvbnN0IG1ldGhvZCA9IG9wdGlvbnM/LnJvdW5kaW5nTWV0aG9kID8/ICJyb3VuZCI7CiAgY29uc3Qgcm91bmRpbmdNZXRob2QgPSBnZXRSb3VuZGluZ01ldGhvZChtZXRob2QpOwogIGNvbnN0IHJvdW5kZWRNaW51dGVzID0gcm91bmRpbmdNZXRob2QobWludXRlcyAvIG5lYXJlc3RUbykgKiBuZWFyZXN0VG87CiAgZGF0ZV8uc2V0TWludXRlcyhyb3VuZGVkTWludXRlcywgMCwgMCk7CiAgcmV0dXJuIGRhdGVfOwp9Cl9fbmFtZShyb3VuZFRvTmVhcmVzdE1pbnV0ZXMsICJyb3VuZFRvTmVhcmVzdE1pbnV0ZXMiKTsKdmFyIHJvdW5kVG9OZWFyZXN0TWludXRlc19kZWZhdWx0ID0gcm91bmRUb05lYXJlc3RNaW51dGVzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZWNvbmRzVG9Ib3Vycy5qcwpmdW5jdGlvbiBzZWNvbmRzVG9Ib3VycyhzZWNvbmRzKSB7CiAgY29uc3QgaG91cnMgPSBzZWNvbmRzIC8gc2Vjb25kc0luSG91cjsKICByZXR1cm4gTWF0aC50cnVuYyhob3Vycyk7Cn0KX19uYW1lKHNlY29uZHNUb0hvdXJzLCAic2Vjb25kc1RvSG91cnMiKTsKdmFyIHNlY29uZHNUb0hvdXJzX2RlZmF1bHQgPSBzZWNvbmRzVG9Ib3VyczsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2Vjb25kc1RvTWlsbGlzZWNvbmRzLmpzCmZ1bmN0aW9uIHNlY29uZHNUb01pbGxpc2Vjb25kcyhzZWNvbmRzKSB7CiAgcmV0dXJuIHNlY29uZHMgKiBtaWxsaXNlY29uZHNJblNlY29uZDsKfQpfX25hbWUoc2Vjb25kc1RvTWlsbGlzZWNvbmRzLCAic2Vjb25kc1RvTWlsbGlzZWNvbmRzIik7CnZhciBzZWNvbmRzVG9NaWxsaXNlY29uZHNfZGVmYXVsdCA9IHNlY29uZHNUb01pbGxpc2Vjb25kczsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2Vjb25kc1RvTWludXRlcy5qcwpmdW5jdGlvbiBzZWNvbmRzVG9NaW51dGVzKHNlY29uZHMpIHsKICBjb25zdCBtaW51dGVzID0gc2Vjb25kcyAvIHNlY29uZHNJbk1pbnV0ZTsKICByZXR1cm4gTWF0aC50cnVuYyhtaW51dGVzKTsKfQpfX25hbWUoc2Vjb25kc1RvTWludXRlcywgInNlY29uZHNUb01pbnV0ZXMiKTsKdmFyIHNlY29uZHNUb01pbnV0ZXNfZGVmYXVsdCA9IHNlY29uZHNUb01pbnV0ZXM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldE1vbnRoLmpzCmZ1bmN0aW9uIHNldE1vbnRoKGRhdGUsIG1vbnRoLCBvcHRpb25zKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGNvbnN0IHllYXIgPSBfZGF0ZS5nZXRGdWxsWWVhcigpOwogIGNvbnN0IGRheSA9IF9kYXRlLmdldERhdGUoKTsKICBjb25zdCBtaWRNb250aCA9IGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4gfHwgZGF0ZSwgMCk7CiAgbWlkTW9udGguc2V0RnVsbFllYXIoeWVhciwgbW9udGgsIDE1KTsKICBtaWRNb250aC5zZXRIb3VycygwLCAwLCAwLCAwKTsKICBjb25zdCBkYXlzSW5Nb250aCA9IGdldERheXNJbk1vbnRoKG1pZE1vbnRoKTsKICBfZGF0ZS5zZXRNb250aChtb250aCwgTWF0aC5taW4oZGF5LCBkYXlzSW5Nb250aCkpOwogIHJldHVybiBfZGF0ZTsKfQpfX25hbWUoc2V0TW9udGgsICJzZXRNb250aCIpOwp2YXIgc2V0TW9udGhfZGVmYXVsdCA9IHNldE1vbnRoOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXQuanMKZnVuY3Rpb24gc2V0KGRhdGUsIHZhbHVlcywgb3B0aW9ucykgewogIGxldCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgaWYgKGlzTmFOKCtfZGF0ZSkpIHJldHVybiBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIE5hTik7CiAgaWYgKHZhbHVlcy55ZWFyICE9IG51bGwpIF9kYXRlLnNldEZ1bGxZZWFyKHZhbHVlcy55ZWFyKTsKICBpZiAodmFsdWVzLm1vbnRoICE9IG51bGwpIF9kYXRlID0gc2V0TW9udGgoX2RhdGUsIHZhbHVlcy5tb250aCk7CiAgaWYgKHZhbHVlcy5kYXRlICE9IG51bGwpIF9kYXRlLnNldERhdGUodmFsdWVzLmRhdGUpOwogIGlmICh2YWx1ZXMuaG91cnMgIT0gbnVsbCkgX2RhdGUuc2V0SG91cnModmFsdWVzLmhvdXJzKTsKICBpZiAodmFsdWVzLm1pbnV0ZXMgIT0gbnVsbCkgX2RhdGUuc2V0TWludXRlcyh2YWx1ZXMubWludXRlcyk7CiAgaWYgKHZhbHVlcy5zZWNvbmRzICE9IG51bGwpIF9kYXRlLnNldFNlY29uZHModmFsdWVzLnNlY29uZHMpOwogIGlmICh2YWx1ZXMubWlsbGlzZWNvbmRzICE9IG51bGwpIF9kYXRlLnNldE1pbGxpc2Vjb25kcyh2YWx1ZXMubWlsbGlzZWNvbmRzKTsKICByZXR1cm4gX2RhdGU7Cn0KX19uYW1lKHNldCwgInNldCIpOwp2YXIgc2V0X2RlZmF1bHQgPSBzZXQ7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldERhdGUuanMKZnVuY3Rpb24gc2V0RGF0ZShkYXRlLCBkYXlPZk1vbnRoLCBvcHRpb25zKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIF9kYXRlLnNldERhdGUoZGF5T2ZNb250aCk7CiAgcmV0dXJuIF9kYXRlOwp9Cl9fbmFtZShzZXREYXRlLCAic2V0RGF0ZSIpOwp2YXIgc2V0RGF0ZV9kZWZhdWx0ID0gc2V0RGF0ZTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0RGF5T2ZZZWFyLmpzCmZ1bmN0aW9uIHNldERheU9mWWVhcihkYXRlLCBkYXlPZlllYXIsIG9wdGlvbnMpIHsKICBjb25zdCBkYXRlXyA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgZGF0ZV8uc2V0TW9udGgoMCk7CiAgZGF0ZV8uc2V0RGF0ZShkYXlPZlllYXIpOwogIHJldHVybiBkYXRlXzsKfQpfX25hbWUoc2V0RGF5T2ZZZWFyLCAic2V0RGF5T2ZZZWFyIik7CnZhciBzZXREYXlPZlllYXJfZGVmYXVsdCA9IHNldERheU9mWWVhcjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0RGVmYXVsdE9wdGlvbnMuanMKZnVuY3Rpb24gc2V0RGVmYXVsdE9wdGlvbnMyKG9wdGlvbnMpIHsKICBjb25zdCByZXN1bHQgPSB7fTsKICBjb25zdCBkZWZhdWx0T3B0aW9uczIgPSBnZXREZWZhdWx0T3B0aW9ucygpOwogIGZvciAoY29uc3QgcHJvcGVydHkgaW4gZGVmYXVsdE9wdGlvbnMyKSB7CiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRlZmF1bHRPcHRpb25zMiwgcHJvcGVydHkpKSB7CiAgICAgIHJlc3VsdFtwcm9wZXJ0eV0gPSBkZWZhdWx0T3B0aW9uczJbcHJvcGVydHldOwogICAgfQogIH0KICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIG9wdGlvbnMpIHsKICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucywgcHJvcGVydHkpKSB7CiAgICAgIGlmIChvcHRpb25zW3Byb3BlcnR5XSA9PT0gdm9pZCAwKSB7CiAgICAgICAgZGVsZXRlIHJlc3VsdFtwcm9wZXJ0eV07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzdWx0W3Byb3BlcnR5XSA9IG9wdGlvbnNbcHJvcGVydHldOwogICAgICB9CiAgICB9CiAgfQogIHNldERlZmF1bHRPcHRpb25zKHJlc3VsdCk7Cn0KX19uYW1lKHNldERlZmF1bHRPcHRpb25zMiwgInNldERlZmF1bHRPcHRpb25zIik7CnZhciBzZXREZWZhdWx0T3B0aW9uc19kZWZhdWx0ID0gc2V0RGVmYXVsdE9wdGlvbnMyOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRIb3Vycy5qcwpmdW5jdGlvbiBzZXRIb3VycyhkYXRlLCBob3Vycywgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBfZGF0ZS5zZXRIb3Vycyhob3Vycyk7CiAgcmV0dXJuIF9kYXRlOwp9Cl9fbmFtZShzZXRIb3VycywgInNldEhvdXJzIik7CnZhciBzZXRIb3Vyc19kZWZhdWx0ID0gc2V0SG91cnM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldE1pbGxpc2Vjb25kcy5qcwpmdW5jdGlvbiBzZXRNaWxsaXNlY29uZHMoZGF0ZSwgbWlsbGlzZWNvbmRzMiwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBfZGF0ZS5zZXRNaWxsaXNlY29uZHMobWlsbGlzZWNvbmRzMik7CiAgcmV0dXJuIF9kYXRlOwp9Cl9fbmFtZShzZXRNaWxsaXNlY29uZHMsICJzZXRNaWxsaXNlY29uZHMiKTsKdmFyIHNldE1pbGxpc2Vjb25kc19kZWZhdWx0ID0gc2V0TWlsbGlzZWNvbmRzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRNaW51dGVzLmpzCmZ1bmN0aW9uIHNldE1pbnV0ZXMoZGF0ZSwgbWludXRlcywgb3B0aW9ucykgewogIGNvbnN0IGRhdGVfID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBkYXRlXy5zZXRNaW51dGVzKG1pbnV0ZXMpOwogIHJldHVybiBkYXRlXzsKfQpfX25hbWUoc2V0TWludXRlcywgInNldE1pbnV0ZXMiKTsKdmFyIHNldE1pbnV0ZXNfZGVmYXVsdCA9IHNldE1pbnV0ZXM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldFF1YXJ0ZXIuanMKZnVuY3Rpb24gc2V0UXVhcnRlcihkYXRlLCBxdWFydGVyLCBvcHRpb25zKSB7CiAgY29uc3QgZGF0ZV8gPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGNvbnN0IG9sZFF1YXJ0ZXIgPSBNYXRoLnRydW5jKGRhdGVfLmdldE1vbnRoKCkgLyAzKSArIDE7CiAgY29uc3QgZGlmZiA9IHF1YXJ0ZXIgLSBvbGRRdWFydGVyOwogIHJldHVybiBzZXRNb250aChkYXRlXywgZGF0ZV8uZ2V0TW9udGgoKSArIGRpZmYgKiAzKTsKfQpfX25hbWUoc2V0UXVhcnRlciwgInNldFF1YXJ0ZXIiKTsKdmFyIHNldFF1YXJ0ZXJfZGVmYXVsdCA9IHNldFF1YXJ0ZXI7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldFNlY29uZHMuanMKZnVuY3Rpb24gc2V0U2Vjb25kcyhkYXRlLCBzZWNvbmRzLCBvcHRpb25zKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIF9kYXRlLnNldFNlY29uZHMoc2Vjb25kcyk7CiAgcmV0dXJuIF9kYXRlOwp9Cl9fbmFtZShzZXRTZWNvbmRzLCAic2V0U2Vjb25kcyIpOwp2YXIgc2V0U2Vjb25kc19kZWZhdWx0ID0gc2V0U2Vjb25kczsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0V2Vla1llYXIuanMKZnVuY3Rpb24gc2V0V2Vla1llYXIoZGF0ZSwgd2Vla1llYXIsIG9wdGlvbnMpIHsKICBjb25zdCBkZWZhdWx0T3B0aW9uczIgPSBnZXREZWZhdWx0T3B0aW9ucygpOwogIGNvbnN0IGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9IG9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyBkZWZhdWx0T3B0aW9uczIuZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/IGRlZmF1bHRPcHRpb25zMi5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyAxOwogIGNvbnN0IGRpZmYgPSBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoCiAgICB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pLAogICAgc3RhcnRPZldlZWtZZWFyKGRhdGUsIG9wdGlvbnMpLAogICAgb3B0aW9ucwogICk7CiAgY29uc3QgZmlyc3RXZWVrID0gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCAwKTsKICBmaXJzdFdlZWsuc2V0RnVsbFllYXIod2Vla1llYXIsIDAsIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSk7CiAgZmlyc3RXZWVrLnNldEhvdXJzKDAsIDAsIDAsIDApOwogIGNvbnN0IGRhdGVfID0gc3RhcnRPZldlZWtZZWFyKGZpcnN0V2Vlaywgb3B0aW9ucyk7CiAgZGF0ZV8uc2V0RGF0ZShkYXRlXy5nZXREYXRlKCkgKyBkaWZmKTsKICByZXR1cm4gZGF0ZV87Cn0KX19uYW1lKHNldFdlZWtZZWFyLCAic2V0V2Vla1llYXIiKTsKdmFyIHNldFdlZWtZZWFyX2RlZmF1bHQgPSBzZXRXZWVrWWVhcjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0WWVhci5qcwpmdW5jdGlvbiBzZXRZZWFyKGRhdGUsIHllYXIsIG9wdGlvbnMpIHsKICBjb25zdCBkYXRlXyA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgaWYgKGlzTmFOKCtkYXRlXykpIHJldHVybiBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIE5hTik7CiAgZGF0ZV8uc2V0RnVsbFllYXIoeWVhcik7CiAgcmV0dXJuIGRhdGVfOwp9Cl9fbmFtZShzZXRZZWFyLCAic2V0WWVhciIpOwp2YXIgc2V0WWVhcl9kZWZhdWx0ID0gc2V0WWVhcjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZkRlY2FkZS5qcwpmdW5jdGlvbiBzdGFydE9mRGVjYWRlKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgeWVhciA9IF9kYXRlLmdldEZ1bGxZZWFyKCk7CiAgY29uc3QgZGVjYWRlID0gTWF0aC5mbG9vcih5ZWFyIC8gMTApICogMTA7CiAgX2RhdGUuc2V0RnVsbFllYXIoZGVjYWRlLCAwLCAxKTsKICBfZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICByZXR1cm4gX2RhdGU7Cn0KX19uYW1lKHN0YXJ0T2ZEZWNhZGUsICJzdGFydE9mRGVjYWRlIik7CnZhciBzdGFydE9mRGVjYWRlX2RlZmF1bHQgPSBzdGFydE9mRGVjYWRlOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mVG9kYXkuanMKZnVuY3Rpb24gc3RhcnRPZlRvZGF5KG9wdGlvbnMpIHsKICByZXR1cm4gc3RhcnRPZkRheShEYXRlLm5vdygpLCBvcHRpb25zKTsKfQpfX25hbWUoc3RhcnRPZlRvZGF5LCAic3RhcnRPZlRvZGF5Iik7CnZhciBzdGFydE9mVG9kYXlfZGVmYXVsdCA9IHN0YXJ0T2ZUb2RheTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZlRvbW9ycm93LmpzCmZ1bmN0aW9uIHN0YXJ0T2ZUb21vcnJvdyhvcHRpb25zKSB7CiAgY29uc3Qgbm93MiA9IGNvbnN0cnVjdE5vdyhvcHRpb25zPy5pbik7CiAgY29uc3QgeWVhciA9IG5vdzIuZ2V0RnVsbFllYXIoKTsKICBjb25zdCBtb250aCA9IG5vdzIuZ2V0TW9udGgoKTsKICBjb25zdCBkYXkgPSBub3cyLmdldERhdGUoKTsKICBjb25zdCBkYXRlID0gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiwgMCk7CiAgZGF0ZS5zZXRGdWxsWWVhcih5ZWFyLCBtb250aCwgZGF5ICsgMSk7CiAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICByZXR1cm4gZGF0ZTsKfQpfX25hbWUoc3RhcnRPZlRvbW9ycm93LCAic3RhcnRPZlRvbW9ycm93Iik7CnZhciBzdGFydE9mVG9tb3Jyb3dfZGVmYXVsdCA9IHN0YXJ0T2ZUb21vcnJvdzsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZlllc3RlcmRheS5qcwpmdW5jdGlvbiBzdGFydE9mWWVzdGVyZGF5KG9wdGlvbnMpIHsKICBjb25zdCBub3cyID0gY29uc3RydWN0Tm93KG9wdGlvbnM/LmluKTsKICBjb25zdCB5ZWFyID0gbm93Mi5nZXRGdWxsWWVhcigpOwogIGNvbnN0IG1vbnRoID0gbm93Mi5nZXRNb250aCgpOwogIGNvbnN0IGRheSA9IG5vdzIuZ2V0RGF0ZSgpOwogIGNvbnN0IGRhdGUgPSBjb25zdHJ1Y3ROb3cob3B0aW9ucz8uaW4pOwogIGRhdGUuc2V0RnVsbFllYXIoeWVhciwgbW9udGgsIGRheSAtIDEpOwogIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgcmV0dXJuIGRhdGU7Cn0KX19uYW1lKHN0YXJ0T2ZZZXN0ZXJkYXksICJzdGFydE9mWWVzdGVyZGF5Iik7CnZhciBzdGFydE9mWWVzdGVyZGF5X2RlZmF1bHQgPSBzdGFydE9mWWVzdGVyZGF5OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJNb250aHMuanMKZnVuY3Rpb24gc3ViTW9udGhzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykgewogIHJldHVybiBhZGRNb250aHMoZGF0ZSwgLWFtb3VudCwgb3B0aW9ucyk7Cn0KX19uYW1lKHN1Yk1vbnRocywgInN1Yk1vbnRocyIpOwp2YXIgc3ViTW9udGhzX2RlZmF1bHQgPSBzdWJNb250aHM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N1Yi5qcwpmdW5jdGlvbiBzdWIoZGF0ZSwgZHVyYXRpb24sIG9wdGlvbnMpIHsKICBjb25zdCB7CiAgICB5ZWFycyA9IDAsCiAgICBtb250aHM6IG1vbnRoczIgPSAwLAogICAgd2Vla3MgPSAwLAogICAgZGF5czogZGF5czIgPSAwLAogICAgaG91cnMgPSAwLAogICAgbWludXRlcyA9IDAsCiAgICBzZWNvbmRzID0gMAogIH0gPSBkdXJhdGlvbjsKICBjb25zdCB3aXRob3V0TW9udGhzID0gc3ViTW9udGhzKGRhdGUsIG1vbnRoczIgKyB5ZWFycyAqIDEyLCBvcHRpb25zKTsKICBjb25zdCB3aXRob3V0RGF5cyA9IHN1YkRheXMod2l0aG91dE1vbnRocywgZGF5czIgKyB3ZWVrcyAqIDcsIG9wdGlvbnMpOwogIGNvbnN0IG1pbnV0ZXNUb1N1YiA9IG1pbnV0ZXMgKyBob3VycyAqIDYwOwogIGNvbnN0IHNlY29uZHNUb1N1YiA9IHNlY29uZHMgKyBtaW51dGVzVG9TdWIgKiA2MDsKICBjb25zdCBtc1RvU3ViID0gc2Vjb25kc1RvU3ViICogMWUzOwogIHJldHVybiBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsICt3aXRob3V0RGF5cyAtIG1zVG9TdWIpOwp9Cl9fbmFtZShzdWIsICJzdWIiKTsKdmFyIHN1Yl9kZWZhdWx0ID0gc3ViOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJCdXNpbmVzc0RheXMuanMKZnVuY3Rpb24gc3ViQnVzaW5lc3NEYXlzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykgewogIHJldHVybiBhZGRCdXNpbmVzc0RheXMoZGF0ZSwgLWFtb3VudCwgb3B0aW9ucyk7Cn0KX19uYW1lKHN1YkJ1c2luZXNzRGF5cywgInN1YkJ1c2luZXNzRGF5cyIpOwp2YXIgc3ViQnVzaW5lc3NEYXlzX2RlZmF1bHQgPSBzdWJCdXNpbmVzc0RheXM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N1YkhvdXJzLmpzCmZ1bmN0aW9uIHN1YkhvdXJzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykgewogIHJldHVybiBhZGRIb3VycyhkYXRlLCAtYW1vdW50LCBvcHRpb25zKTsKfQpfX25hbWUoc3ViSG91cnMsICJzdWJIb3VycyIpOwp2YXIgc3ViSG91cnNfZGVmYXVsdCA9IHN1YkhvdXJzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJNaWxsaXNlY29uZHMuanMKZnVuY3Rpb24gc3ViTWlsbGlzZWNvbmRzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykgewogIHJldHVybiBhZGRNaWxsaXNlY29uZHMoZGF0ZSwgLWFtb3VudCwgb3B0aW9ucyk7Cn0KX19uYW1lKHN1Yk1pbGxpc2Vjb25kcywgInN1Yk1pbGxpc2Vjb25kcyIpOwp2YXIgc3ViTWlsbGlzZWNvbmRzX2RlZmF1bHQgPSBzdWJNaWxsaXNlY29uZHM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N1Yk1pbnV0ZXMuanMKZnVuY3Rpb24gc3ViTWludXRlcyhkYXRlLCBhbW91bnQsIG9wdGlvbnMpIHsKICByZXR1cm4gYWRkTWludXRlcyhkYXRlLCAtYW1vdW50LCBvcHRpb25zKTsKfQpfX25hbWUoc3ViTWludXRlcywgInN1Yk1pbnV0ZXMiKTsKdmFyIHN1Yk1pbnV0ZXNfZGVmYXVsdCA9IHN1Yk1pbnV0ZXM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N1YlF1YXJ0ZXJzLmpzCmZ1bmN0aW9uIHN1YlF1YXJ0ZXJzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykgewogIHJldHVybiBhZGRRdWFydGVycyhkYXRlLCAtYW1vdW50LCBvcHRpb25zKTsKfQpfX25hbWUoc3ViUXVhcnRlcnMsICJzdWJRdWFydGVycyIpOwp2YXIgc3ViUXVhcnRlcnNfZGVmYXVsdCA9IHN1YlF1YXJ0ZXJzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJTZWNvbmRzLmpzCmZ1bmN0aW9uIHN1YlNlY29uZHMoZGF0ZSwgYW1vdW50LCBvcHRpb25zKSB7CiAgcmV0dXJuIGFkZFNlY29uZHMoZGF0ZSwgLWFtb3VudCwgb3B0aW9ucyk7Cn0KX19uYW1lKHN1YlNlY29uZHMsICJzdWJTZWNvbmRzIik7CnZhciBzdWJTZWNvbmRzX2RlZmF1bHQgPSBzdWJTZWNvbmRzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJXZWVrcy5qcwpmdW5jdGlvbiBzdWJXZWVrcyhkYXRlLCBhbW91bnQsIG9wdGlvbnMpIHsKICByZXR1cm4gYWRkV2Vla3MoZGF0ZSwgLWFtb3VudCwgb3B0aW9ucyk7Cn0KX19uYW1lKHN1YldlZWtzLCAic3ViV2Vla3MiKTsKdmFyIHN1YldlZWtzX2RlZmF1bHQgPSBzdWJXZWVrczsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3ViWWVhcnMuanMKZnVuY3Rpb24gc3ViWWVhcnMoZGF0ZSwgYW1vdW50LCBvcHRpb25zKSB7CiAgcmV0dXJuIGFkZFllYXJzKGRhdGUsIC1hbW91bnQsIG9wdGlvbnMpOwp9Cl9fbmFtZShzdWJZZWFycywgInN1YlllYXJzIik7CnZhciBzdWJZZWFyc19kZWZhdWx0ID0gc3ViWWVhcnM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3dlZWtzVG9EYXlzLmpzCmZ1bmN0aW9uIHdlZWtzVG9EYXlzKHdlZWtzKSB7CiAgcmV0dXJuIE1hdGgudHJ1bmMod2Vla3MgKiBkYXlzSW5XZWVrKTsKfQpfX25hbWUod2Vla3NUb0RheXMsICJ3ZWVrc1RvRGF5cyIpOwp2YXIgd2Vla3NUb0RheXNfZGVmYXVsdCA9IHdlZWtzVG9EYXlzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy95ZWFyc1RvRGF5cy5qcwpmdW5jdGlvbiB5ZWFyc1RvRGF5cyh5ZWFycykgewogIHJldHVybiBNYXRoLnRydW5jKHllYXJzICogZGF5c0luWWVhcik7Cn0KX19uYW1lKHllYXJzVG9EYXlzLCAieWVhcnNUb0RheXMiKTsKdmFyIHllYXJzVG9EYXlzX2RlZmF1bHQgPSB5ZWFyc1RvRGF5czsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMveWVhcnNUb01vbnRocy5qcwpmdW5jdGlvbiB5ZWFyc1RvTW9udGhzKHllYXJzKSB7CiAgcmV0dXJuIE1hdGgudHJ1bmMoeWVhcnMgKiBtb250aHNJblllYXIpOwp9Cl9fbmFtZSh5ZWFyc1RvTW9udGhzLCAieWVhcnNUb01vbnRocyIpOwp2YXIgeWVhcnNUb01vbnRoc19kZWZhdWx0ID0geWVhcnNUb01vbnRoczsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMveWVhcnNUb1F1YXJ0ZXJzLmpzCmZ1bmN0aW9uIHllYXJzVG9RdWFydGVycyh5ZWFycykgewogIHJldHVybiBNYXRoLnRydW5jKHllYXJzICogcXVhcnRlcnNJblllYXIpOwp9Cl9fbmFtZSh5ZWFyc1RvUXVhcnRlcnMsICJ5ZWFyc1RvUXVhcnRlcnMiKTsKdmFyIHllYXJzVG9RdWFydGVyc19kZWZhdWx0ID0geWVhcnNUb1F1YXJ0ZXJzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3BhcnNlLW1zQDQuMC4wL25vZGVfbW9kdWxlcy9wYXJzZS1tcy9pbmRleC5qcwp2YXIgdG9aZXJvSWZJbmZpbml0eSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHZhbHVlMikgPT4gTnVtYmVyLmlzRmluaXRlKHZhbHVlMikgPyB2YWx1ZTIgOiAwLCAidG9aZXJvSWZJbmZpbml0eSIpOwpmdW5jdGlvbiBwYXJzZU51bWJlcihtaWxsaXNlY29uZHMyKSB7CiAgcmV0dXJuIHsKICAgIGRheXM6IE1hdGgudHJ1bmMobWlsbGlzZWNvbmRzMiAvIDg2NGU1KSwKICAgIGhvdXJzOiBNYXRoLnRydW5jKG1pbGxpc2Vjb25kczIgLyAzNmU1ICUgMjQpLAogICAgbWludXRlczogTWF0aC50cnVuYyhtaWxsaXNlY29uZHMyIC8gNmU0ICUgNjApLAogICAgc2Vjb25kczogTWF0aC50cnVuYyhtaWxsaXNlY29uZHMyIC8gMWUzICUgNjApLAogICAgbWlsbGlzZWNvbmRzOiBNYXRoLnRydW5jKG1pbGxpc2Vjb25kczIgJSAxZTMpLAogICAgbWljcm9zZWNvbmRzOiBNYXRoLnRydW5jKHRvWmVyb0lmSW5maW5pdHkobWlsbGlzZWNvbmRzMiAqIDFlMykgJSAxZTMpLAogICAgbmFub3NlY29uZHM6IE1hdGgudHJ1bmModG9aZXJvSWZJbmZpbml0eShtaWxsaXNlY29uZHMyICogMWU2KSAlIDFlMykKICB9Owp9Cl9fbmFtZShwYXJzZU51bWJlciwgInBhcnNlTnVtYmVyIik7CmZ1bmN0aW9uIHBhcnNlQmlnaW50KG1pbGxpc2Vjb25kczIpIHsKICByZXR1cm4gewogICAgZGF5czogbWlsbGlzZWNvbmRzMiAvIDg2NDAwMDAwbiwKICAgIGhvdXJzOiBtaWxsaXNlY29uZHMyIC8gMzYwMDAwMG4gJSAyNG4sCiAgICBtaW51dGVzOiBtaWxsaXNlY29uZHMyIC8gNjAwMDBuICUgNjBuLAogICAgc2Vjb25kczogbWlsbGlzZWNvbmRzMiAvIDEwMDBuICUgNjBuLAogICAgbWlsbGlzZWNvbmRzOiBtaWxsaXNlY29uZHMyICUgMTAwMG4sCiAgICBtaWNyb3NlY29uZHM6IDBuLAogICAgbmFub3NlY29uZHM6IDBuCiAgfTsKfQpfX25hbWUocGFyc2VCaWdpbnQsICJwYXJzZUJpZ2ludCIpOwpmdW5jdGlvbiBwYXJzZU1pbGxpc2Vjb25kcyhtaWxsaXNlY29uZHMyKSB7CiAgc3dpdGNoICh0eXBlb2YgbWlsbGlzZWNvbmRzMikgewogICAgY2FzZSAibnVtYmVyIjogewogICAgICBpZiAoTnVtYmVyLmlzRmluaXRlKG1pbGxpc2Vjb25kczIpKSB7CiAgICAgICAgcmV0dXJuIHBhcnNlTnVtYmVyKG1pbGxpc2Vjb25kczIpOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgfQogICAgY2FzZSAiYmlnaW50IjogewogICAgICByZXR1cm4gcGFyc2VCaWdpbnQobWlsbGlzZWNvbmRzMik7CiAgICB9CiAgfQogIHRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIGEgZmluaXRlIG51bWJlciBvciBiaWdpbnQiKTsKfQpfX25hbWUocGFyc2VNaWxsaXNlY29uZHMsICJwYXJzZU1pbGxpc2Vjb25kcyIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3ByZXR0eS1tc0A5LjMuMC9ub2RlX21vZHVsZXMvcHJldHR5LW1zL2luZGV4LmpzCnZhciBpc1plcm8gPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh2YWx1ZTIpID0+IHZhbHVlMiA9PT0gMCB8fCB2YWx1ZTIgPT09IDBuLCAiaXNaZXJvIik7CnZhciBwbHVyYWxpemUgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh3b3JkLCBjb3VudDIpID0+IGNvdW50MiA9PT0gMSB8fCBjb3VudDIgPT09IDFuID8gd29yZCA6IGAke3dvcmR9c2AsICJwbHVyYWxpemUiKTsKdmFyIFNFQ09ORF9ST1VORElOR19FUFNJTE9OID0gMWUtNzsKdmFyIE9ORV9EQVlfSU5fTUlMTElTRUNPTkRTID0gMjRuICogNjBuICogNjBuICogMTAwMG47CmZ1bmN0aW9uIHByZXR0eU1pbGxpc2Vjb25kcyhtaWxsaXNlY29uZHMyLCBvcHRpb25zKSB7CiAgY29uc3QgaXNCaWdJbnQgPSB0eXBlb2YgbWlsbGlzZWNvbmRzMiA9PT0gImJpZ2ludCI7CiAgaWYgKCFpc0JpZ0ludCAmJiAhTnVtYmVyLmlzRmluaXRlKG1pbGxpc2Vjb25kczIpKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJFeHBlY3RlZCBhIGZpbml0ZSBudW1iZXIgb3IgYmlnaW50Iik7CiAgfQogIG9wdGlvbnMgPSB7IC4uLm9wdGlvbnMgfTsKICBjb25zdCBzaWduID0gbWlsbGlzZWNvbmRzMiA8IDAgPyAiLSIgOiAiIjsKICBtaWxsaXNlY29uZHMyID0gbWlsbGlzZWNvbmRzMiA8IDAgPyAtbWlsbGlzZWNvbmRzMiA6IG1pbGxpc2Vjb25kczI7CiAgaWYgKG9wdGlvbnMuY29sb25Ob3RhdGlvbikgewogICAgb3B0aW9ucy5jb21wYWN0ID0gZmFsc2U7CiAgICBvcHRpb25zLmZvcm1hdFN1Yk1pbGxpc2Vjb25kcyA9IGZhbHNlOwogICAgb3B0aW9ucy5zZXBhcmF0ZU1pbGxpc2Vjb25kcyA9IGZhbHNlOwogICAgb3B0aW9ucy52ZXJib3NlID0gZmFsc2U7CiAgfQogIGlmIChvcHRpb25zLmNvbXBhY3QpIHsKICAgIG9wdGlvbnMudW5pdENvdW50ID0gMTsKICAgIG9wdGlvbnMuc2Vjb25kc0RlY2ltYWxEaWdpdHMgPSAwOwogICAgb3B0aW9ucy5taWxsaXNlY29uZHNEZWNpbWFsRGlnaXRzID0gMDsKICB9CiAgbGV0IHJlc3VsdCA9IFtdOwogIGNvbnN0IGZsb29yRGVjaW1hbHMgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh2YWx1ZTIsIGRlY2ltYWxEaWdpdHMpID0+IHsKICAgIGNvbnN0IGZsb29yZWRJbnRlcmltVmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlMiAqIDEwICoqIGRlY2ltYWxEaWdpdHMgKyBTRUNPTkRfUk9VTkRJTkdfRVBTSUxPTik7CiAgICBjb25zdCBmbG9vcmVkVmFsdWUgPSBNYXRoLnJvdW5kKGZsb29yZWRJbnRlcmltVmFsdWUpIC8gMTAgKiogZGVjaW1hbERpZ2l0czsKICAgIHJldHVybiBmbG9vcmVkVmFsdWUudG9GaXhlZChkZWNpbWFsRGlnaXRzKTsKICB9LCAiZmxvb3JEZWNpbWFscyIpOwogIGNvbnN0IGFkZDIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh2YWx1ZTIsIGxvbmcsIHNob3J0LCB2YWx1ZVN0cmluZykgPT4gewogICAgaWYgKChyZXN1bHQubGVuZ3RoID09PSAwIHx8ICFvcHRpb25zLmNvbG9uTm90YXRpb24pICYmIGlzWmVybyh2YWx1ZTIpICYmICEob3B0aW9ucy5jb2xvbk5vdGF0aW9uICYmIHNob3J0ID09PSAibSIpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHZhbHVlU3RyaW5nID8/PSBTdHJpbmcodmFsdWUyKTsKICAgIGlmIChvcHRpb25zLmNvbG9uTm90YXRpb24pIHsKICAgICAgY29uc3Qgd2hvbGVEaWdpdHMgPSB2YWx1ZVN0cmluZy5pbmNsdWRlcygiLiIpID8gdmFsdWVTdHJpbmcuc3BsaXQoIi4iKVswXS5sZW5ndGggOiB2YWx1ZVN0cmluZy5sZW5ndGg7CiAgICAgIGNvbnN0IG1pbkxlbmd0aCA9IHJlc3VsdC5sZW5ndGggPiAwID8gMiA6IDE7CiAgICAgIHZhbHVlU3RyaW5nID0gIjAiLnJlcGVhdChNYXRoLm1heCgwLCBtaW5MZW5ndGggLSB3aG9sZURpZ2l0cykpICsgdmFsdWVTdHJpbmc7CiAgICB9IGVsc2UgewogICAgICB2YWx1ZVN0cmluZyArPSBvcHRpb25zLnZlcmJvc2UgPyAiICIgKyBwbHVyYWxpemUobG9uZywgdmFsdWUyKSA6IHNob3J0OwogICAgfQogICAgcmVzdWx0LnB1c2godmFsdWVTdHJpbmcpOwogIH0sICJhZGQiKTsKICBjb25zdCBwYXJzZWQgPSBwYXJzZU1pbGxpc2Vjb25kcyhtaWxsaXNlY29uZHMyKTsKICBjb25zdCBkYXlzMiA9IEJpZ0ludChwYXJzZWQuZGF5cyk7CiAgaWYgKG9wdGlvbnMuaGlkZVllYXJBbmREYXlzKSB7CiAgICBhZGQyKEJpZ0ludChkYXlzMikgKiAyNG4gKyBCaWdJbnQocGFyc2VkLmhvdXJzKSwgImhvdXIiLCAiaCIpOwogIH0gZWxzZSB7CiAgICBpZiAob3B0aW9ucy5oaWRlWWVhcikgewogICAgICBhZGQyKGRheXMyLCAiZGF5IiwgImQiKTsKICAgIH0gZWxzZSB7CiAgICAgIGFkZDIoZGF5czIgLyAzNjVuLCAieWVhciIsICJ5Iik7CiAgICAgIGFkZDIoZGF5czIgJSAzNjVuLCAiZGF5IiwgImQiKTsKICAgIH0KICAgIGFkZDIoTnVtYmVyKHBhcnNlZC5ob3VycyksICJob3VyIiwgImgiKTsKICB9CiAgYWRkMihOdW1iZXIocGFyc2VkLm1pbnV0ZXMpLCAibWludXRlIiwgIm0iKTsKICBpZiAoIW9wdGlvbnMuaGlkZVNlY29uZHMpIHsKICAgIGlmIChvcHRpb25zLnNlcGFyYXRlTWlsbGlzZWNvbmRzIHx8IG9wdGlvbnMuZm9ybWF0U3ViTWlsbGlzZWNvbmRzIHx8ICFvcHRpb25zLmNvbG9uTm90YXRpb24gJiYgbWlsbGlzZWNvbmRzMiA8IDFlMyAmJiAhb3B0aW9ucy5zdWJTZWNvbmRzQXNEZWNpbWFscykgewogICAgICBjb25zdCBzZWNvbmRzID0gTnVtYmVyKHBhcnNlZC5zZWNvbmRzKTsKICAgICAgY29uc3QgbWlsbGlzZWNvbmRzMyA9IE51bWJlcihwYXJzZWQubWlsbGlzZWNvbmRzKTsKICAgICAgY29uc3QgbWljcm9zZWNvbmRzID0gTnVtYmVyKHBhcnNlZC5taWNyb3NlY29uZHMpOwogICAgICBjb25zdCBuYW5vc2Vjb25kcyA9IE51bWJlcihwYXJzZWQubmFub3NlY29uZHMpOwogICAgICBhZGQyKHNlY29uZHMsICJzZWNvbmQiLCAicyIpOwogICAgICBpZiAob3B0aW9ucy5mb3JtYXRTdWJNaWxsaXNlY29uZHMpIHsKICAgICAgICBhZGQyKG1pbGxpc2Vjb25kczMsICJtaWxsaXNlY29uZCIsICJtcyIpOwogICAgICAgIGFkZDIobWljcm9zZWNvbmRzLCAibWljcm9zZWNvbmQiLCAiXHhCNXMiKTsKICAgICAgICBhZGQyKG5hbm9zZWNvbmRzLCAibmFub3NlY29uZCIsICJucyIpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IG1pbGxpc2Vjb25kc0FuZEJlbG93ID0gbWlsbGlzZWNvbmRzMyArIG1pY3Jvc2Vjb25kcyAvIDFlMyArIG5hbm9zZWNvbmRzIC8gMWU2OwogICAgICAgIGNvbnN0IG1pbGxpc2Vjb25kc0RlY2ltYWxEaWdpdHMgPSB0eXBlb2Ygb3B0aW9ucy5taWxsaXNlY29uZHNEZWNpbWFsRGlnaXRzID09PSAibnVtYmVyIiA/IG9wdGlvbnMubWlsbGlzZWNvbmRzRGVjaW1hbERpZ2l0cyA6IDA7CiAgICAgICAgY29uc3Qgcm91bmRlZE1pbGxpc2Vjb25kcyA9IG1pbGxpc2Vjb25kc0FuZEJlbG93ID49IDEgPyBNYXRoLnJvdW5kKG1pbGxpc2Vjb25kc0FuZEJlbG93KSA6IE1hdGguY2VpbChtaWxsaXNlY29uZHNBbmRCZWxvdyk7CiAgICAgICAgY29uc3QgbWlsbGlzZWNvbmRzU3RyaW5nID0gbWlsbGlzZWNvbmRzRGVjaW1hbERpZ2l0cyA/IG1pbGxpc2Vjb25kc0FuZEJlbG93LnRvRml4ZWQobWlsbGlzZWNvbmRzRGVjaW1hbERpZ2l0cykgOiByb3VuZGVkTWlsbGlzZWNvbmRzOwogICAgICAgIGFkZDIoCiAgICAgICAgICBOdW1iZXIucGFyc2VGbG9hdChtaWxsaXNlY29uZHNTdHJpbmcpLAogICAgICAgICAgIm1pbGxpc2Vjb25kIiwKICAgICAgICAgICJtcyIsCiAgICAgICAgICBtaWxsaXNlY29uZHNTdHJpbmcKICAgICAgICApOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBjb25zdCBzZWNvbmRzID0gKGlzQmlnSW50ID8gTnVtYmVyKG1pbGxpc2Vjb25kczIgJSBPTkVfREFZX0lOX01JTExJU0VDT05EUykgOiBtaWxsaXNlY29uZHMyKSAvIDFlMyAlIDYwOwogICAgICBjb25zdCBzZWNvbmRzRGVjaW1hbERpZ2l0cyA9IHR5cGVvZiBvcHRpb25zLnNlY29uZHNEZWNpbWFsRGlnaXRzID09PSAibnVtYmVyIiA/IG9wdGlvbnMuc2Vjb25kc0RlY2ltYWxEaWdpdHMgOiAxOwogICAgICBjb25zdCBzZWNvbmRzRml4ZWQgPSBmbG9vckRlY2ltYWxzKHNlY29uZHMsIHNlY29uZHNEZWNpbWFsRGlnaXRzKTsKICAgICAgY29uc3Qgc2Vjb25kc1N0cmluZyA9IG9wdGlvbnMua2VlcERlY2ltYWxzT25XaG9sZVNlY29uZHMgPyBzZWNvbmRzRml4ZWQgOiBzZWNvbmRzRml4ZWQucmVwbGFjZSgvXC4wKyQvLCAiIik7CiAgICAgIGFkZDIoTnVtYmVyLnBhcnNlRmxvYXQoc2Vjb25kc1N0cmluZyksICJzZWNvbmQiLCAicyIsIHNlY29uZHNTdHJpbmcpOwogICAgfQogIH0KICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuIHNpZ24gKyAiMCIgKyAob3B0aW9ucy52ZXJib3NlID8gIiBtaWxsaXNlY29uZHMiIDogIm1zIik7CiAgfQogIGNvbnN0IHNlcGFyYXRvciA9IG9wdGlvbnMuY29sb25Ob3RhdGlvbiA/ICI6IiA6ICIgIjsKICBpZiAodHlwZW9mIG9wdGlvbnMudW5pdENvdW50ID09PSAibnVtYmVyIikgewogICAgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKDAsIE1hdGgubWF4KG9wdGlvbnMudW5pdENvdW50LCAxKSk7CiAgfQogIHJldHVybiBzaWduICsgcmVzdWx0LmpvaW4oc2VwYXJhdG9yKTsKfQpfX25hbWUocHJldHR5TWlsbGlzZWNvbmRzLCAicHJldHR5TWlsbGlzZWNvbmRzIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR0aW1lQDQuMi4zL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHRpbWUvZGlzdF90cy9zbWFydHRpbWUucGx1Z2lucy5qcwp2YXIgaW1wb3J0X2RheWpzID0gX190b0VTTShyZXF1aXJlX2RheWpzX21pbigpLCAxKTsKdmFyIGltcG9ydF9pc1RvZGF5ID0gX190b0VTTShyZXF1aXJlX2lzVG9kYXkoKSwgMSk7CmltcG9ydF9kYXlqcy5kZWZhdWx0LmV4dGVuZChpbXBvcnRfaXNUb2RheS5kZWZhdWx0KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHRpbWVANC4yLjMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0dGltZS9kaXN0X3RzL3NtYXJ0dGltZS5jbGFzc2VzLmNyb25qb2IuanMKdmFyIENyb25Kb2IgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiQ3JvbkpvYiIpOwogIH0KICBjb25zdHJ1Y3Rvcihjcm9uTWFuYWdlciwgY3JvbkV4cHJlc3Npb25BcmcsIGpvYkZ1bmN0aW9uKSB7CiAgICB0aGlzLnN0YXR1cyA9ICJpbml0aWFsIjsKICAgIHRoaXMubmV4dEV4ZWN1dGlvblVuaXggPSAwOwogICAgdGhpcy5jcm9uRXhwcmVzc2lvbiA9IGNyb25FeHByZXNzaW9uQXJnOwogICAgdGhpcy5qb2JGdW5jdGlvbiA9IGpvYkZ1bmN0aW9uOwogICAgdGhpcy5jcm9uUGFyc2VyID0gbmV3IGNyb25lcl9leHBvcnRzLkNyb24oY3JvbkV4cHJlc3Npb25BcmcpOwogIH0KICAvKioKICAgKiBjaGVja3Mgd2V0aGVyIHRoZSBjcm9uam9iIG5lZWRzIHRvIGJlIGV4ZWN1dGVkCiAgICovCiAgY2hlY2tFeGVjdXRpb24oKSB7CiAgICBpZiAodGhpcy5zdGF0dXMgPT09ICJzdG9wcGVkIikgewogICAgICByZXR1cm4gdGhpcy5uZXh0RXhlY3V0aW9uVW5peDsKICAgIH0KICAgIGlmICh0aGlzLm5leHRFeGVjdXRpb25Vbml4ID09PSAwKSB7CiAgICAgIHRoaXMuZ2V0TmV4dEV4ZWN1dGlvblRpbWUoKTsKICAgIH0KICAgIGlmIChEYXRlLm5vdygpID4gdGhpcy5uZXh0RXhlY3V0aW9uVW5peCkgewogICAgICBjb25zdCBtYXliZVByb21pc2UgPSB0aGlzLmpvYkZ1bmN0aW9uKHRoaXMubmV4dEV4ZWN1dGlvblVuaXgpOwogICAgICBpZiAobWF5YmVQcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZSkgewogICAgICAgIG1heWJlUHJvbWlzZS5jYXRjaCgoZTEwKSA9PiBjb25zb2xlLmxvZyhlMTApKTsKICAgICAgfQogICAgICB0aGlzLm5leHRFeGVjdXRpb25Vbml4ID0gdGhpcy5nZXROZXh0RXhlY3V0aW9uVGltZSgpOwogICAgfQogICAgcmV0dXJuIHRoaXMubmV4dEV4ZWN1dGlvblVuaXg7CiAgfQogIGdldE5leHRFeGVjdXRpb25UaW1lKCkgewogICAgcmV0dXJuIHRoaXMubmV4dEV4ZWN1dGlvblVuaXggPSBEYXRlLm5vdygpICsgdGhpcy5nZXRUaW1lVG9OZXh0RXhlY3V0aW9uKCk7CiAgfQogIC8qKgogICAqIGdldHMgdGhlIHRpbWUgdG8gbmV4dCBleGVjdXRpb24KICAgKi8KICBnZXRUaW1lVG9OZXh0RXhlY3V0aW9uKCkgewogICAgcmV0dXJuIHRoaXMuY3JvblBhcnNlci5tc1RvTmV4dCgpOwogIH0KICBzdGFydCgpIHsKICAgIHRoaXMuc3RhdHVzID0gInN0YXJ0ZWQiOwogIH0KICBzdG9wKCkgewogICAgdGhpcy5zdGF0dXMgPSAic3RvcHBlZCI7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0dGltZUA0LjIuMy9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnR0aW1lL2Rpc3RfdHMvc21hcnR0aW1lLmNsYXNzZXMuY3Jvbm1hbmFnZXIuanMKdmFyIENyb25NYW5hZ2VyID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkNyb25NYW5hZ2VyIik7CiAgfQogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5zdGF0dXMgPSAic3RvcHBlZCI7CiAgICB0aGlzLmNyb25qb2JzID0gbmV3IGRpc3RfdHNfZXhwb3J0czYuT2JqZWN0TWFwKCk7CiAgICB0aGlzLmN5Y2xlV2FrZURlZmVycmVkID0gbnVsbDsKICB9CiAgLyoqCiAgICogUmVzb2x2ZXMgdGhlIGN1cnJlbnQgd2FrZSBkZWZlcnJlZCwgY2F1c2luZyB0aGUgc2xlZXBpbmcgY3ljbGUKICAgKiB0byBpbW1lZGlhdGVseSByZWNhbGN1bGF0ZSBpbnN0ZWFkIG9mIHdhaXRpbmcgZm9yIGl0cyB0aW1lb3V0LgogICAqLwogIHdha2VDeWNsZSgpIHsKICAgIGlmICh0aGlzLmN5Y2xlV2FrZURlZmVycmVkICYmIHRoaXMuY3ljbGVXYWtlRGVmZXJyZWQuc3RhdHVzID09PSAicGVuZGluZyIpIHsKICAgICAgdGhpcy5jeWNsZVdha2VEZWZlcnJlZC5yZXNvbHZlKCk7CiAgICB9CiAgfQogIGFkZENyb25qb2IoY3JvbklkZW50aWZpZXJBcmcsIGNyb25GdW5jdGlvbkFyZykgewogICAgY29uc3QgbmV3Q3JvbkpvYiA9IG5ldyBDcm9uSm9iKHRoaXMsIGNyb25JZGVudGlmaWVyQXJnLCBjcm9uRnVuY3Rpb25BcmcpOwogICAgdGhpcy5jcm9uam9icy5hZGQobmV3Q3JvbkpvYik7CiAgICBpZiAodGhpcy5zdGF0dXMgPT09ICJzdGFydGVkIikgewogICAgICBuZXdDcm9uSm9iLnN0YXJ0KCk7CiAgICAgIHRoaXMud2FrZUN5Y2xlKCk7CiAgICB9CiAgICByZXR1cm4gbmV3Q3JvbkpvYjsKICB9CiAgcmVtb3ZlQ3JvbmpvYihjcm9uam9iQXJnKSB7CiAgICBjcm9uam9iQXJnLnN0b3AoKTsKICAgIHRoaXMuY3JvbmpvYnMucmVtb3ZlKGNyb25qb2JBcmcpOwogICAgaWYgKHRoaXMuc3RhdHVzID09PSAic3RhcnRlZCIpIHsKICAgICAgdGhpcy53YWtlQ3ljbGUoKTsKICAgIH0KICB9CiAgLyoqCiAgICogc3RhcnRzIHRoZSBjcm9uam9iCiAgICovCiAgc3RhcnQoKSB7CiAgICBpZiAodGhpcy5zdGF0dXMgIT09ICJzdGFydGVkIikgewogICAgICB0aGlzLnN0YXR1cyA9ICJzdGFydGVkIjsKICAgICAgZm9yIChjb25zdCBjcm9uSm9iIG9mIHRoaXMuY3JvbmpvYnMuZ2V0QXJyYXkoKSkgewogICAgICAgIGNyb25Kb2Iuc3RhcnQoKTsKICAgICAgfQogICAgICB0aGlzLnJ1bkNyb25DeWNsZSgpOwogICAgfQogIH0KICBhc3luYyBydW5Dcm9uQ3ljbGUoKSB7CiAgICB3aGlsZSAodGhpcy5zdGF0dXMgPT09ICJzdGFydGVkIikgewogICAgICB0aGlzLmN5Y2xlV2FrZURlZmVycmVkID0gbmV3IGRpc3RfdHNfZXhwb3J0cy5EZWZlcnJlZCgpOwogICAgICBsZXQgc29vbmVzdE1zID0gSW5maW5pdHk7CiAgICAgIGZvciAoY29uc3QgY3JvbkpvYiBvZiB0aGlzLmNyb25qb2JzLmdldEFycmF5KCkpIHsKICAgICAgICBjcm9uSm9iLmNoZWNrRXhlY3V0aW9uKCk7CiAgICAgICAgY29uc3QgbXNUb05leHQgPSBjcm9uSm9iLmdldFRpbWVUb05leHRFeGVjdXRpb24oKTsKICAgICAgICBpZiAobXNUb05leHQgPCBzb29uZXN0TXMpIHsKICAgICAgICAgIHNvb25lc3RNcyA9IG1zVG9OZXh0OwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoc29vbmVzdE1zIDwgSW5maW5pdHkgJiYgc29vbmVzdE1zID4gMCkgewogICAgICAgIHRoaXMuZXhlY3V0aW9uVGltZW91dCA9IG5ldyBkaXN0X3RzX2V4cG9ydHMzLlRpbWVvdXQoc29vbmVzdE1zKTsKICAgICAgICBhd2FpdCBQcm9taXNlLnJhY2UoWwogICAgICAgICAgdGhpcy5leGVjdXRpb25UaW1lb3V0LnByb21pc2UsCiAgICAgICAgICB0aGlzLmN5Y2xlV2FrZURlZmVycmVkLnByb21pc2UKICAgICAgICBdKTsKICAgICAgICB0aGlzLmV4ZWN1dGlvblRpbWVvdXQuY2FuY2VsKCk7CiAgICAgIH0gZWxzZSBpZiAoc29vbmVzdE1zIDw9IDApIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhd2FpdCB0aGlzLmN5Y2xlV2FrZURlZmVycmVkLnByb21pc2U7CiAgICAgIH0KICAgIH0KICAgIHRoaXMuY3ljbGVXYWtlRGVmZXJyZWQgPSBudWxsOwogIH0KICAvKioKICAgKiBzdG9wcyBhbGwgY3JvbmpvYnMKICAgKi8KICBzdG9wKCkgewogICAgaWYgKHRoaXMuc3RhdHVzID09PSAic3RhcnRlZCIpIHsKICAgICAgdGhpcy5zdGF0dXMgPSAic3RvcHBlZCI7CiAgICAgIGlmICh0aGlzLmV4ZWN1dGlvblRpbWVvdXQpIHsKICAgICAgICB0aGlzLmV4ZWN1dGlvblRpbWVvdXQuY2FuY2VsKCk7CiAgICAgIH0KICAgICAgdGhpcy53YWtlQ3ljbGUoKTsKICAgIH0KICAgIGZvciAoY29uc3QgY3JvbiBvZiB0aGlzLmNyb25qb2JzLmdldEFycmF5KCkpIHsKICAgICAgY3Jvbi5zdG9wKCk7CiAgICB9CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0dGltZUA0LjIuMy9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnR0aW1lL2Rpc3RfdHMvc21hcnR0aW1lLnVuaXRzLmpzCnZhciB1bml0cyA9IHsKICB5ZWFyczogLyogQF9fUFVSRV9fICovIF9fbmFtZSgodGltZXNBcmcgPSAxKSA9PiB7CiAgICByZXR1cm4gdGltZXNBcmcgKiAzMTU0ZTc7CiAgfSwgInllYXJzIiksCiAgbW9udGhzOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh0aW1lc0FyZyA9IDEpID0+IHsKICAgIHJldHVybiB0aW1lc0FyZyAqIDI2MjhlNjsKICB9LCAibW9udGhzIiksCiAgd2Vla3M6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHRpbWVzQXJnID0gMSkgPT4gewogICAgcmV0dXJuIHRpbWVzQXJnICogNjA0OGU1OwogIH0sICJ3ZWVrcyIpLAogIGRheXM6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHRpbWVzQXJnID0gMSkgPT4gewogICAgcmV0dXJuIHRpbWVzQXJnICogODY0ZTU7CiAgfSwgImRheXMiKSwKICBob3VyczogLyogQF9fUFVSRV9fICovIF9fbmFtZSgodGltZXNBcmcgPSAxKSA9PiB7CiAgICByZXR1cm4gdGltZXNBcmcgKiAzNmU1OwogIH0sICJob3VycyIpLAogIG1pbnV0ZXM6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHRpbWVzQXJnID0gMSkgPT4gewogICAgcmV0dXJuIHRpbWVzQXJnICogNmU0OwogIH0sICJtaW51dGVzIiksCiAgc2Vjb25kczogLyogQF9fUFVSRV9fICovIF9fbmFtZSgodGltZXNBcmcgPSAxKSA9PiB7CiAgICByZXR1cm4gdGltZXNBcmcgKiAxZTM7CiAgfSwgInNlY29uZHMiKQp9Owp2YXIgZ2V0TWlsbGlTZWNvbmRzRnJvbVVuaXRzID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoY29tYmluYXRpb25BcmcpID0+IHsKICBsZXQgdGltZUluTWlsbGlzZWNvbmRzID0gMDsKICBsZXQgYWRkTWlsbGlTZWNvbmRzID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgobWlsbGlTZWNvbmRzQXJnKSA9PiB7CiAgICB0aW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lSW5NaWxsaXNlY29uZHMgKyBtaWxsaVNlY29uZHNBcmc7CiAgfSwgImFkZE1pbGxpU2Vjb25kcyIpOwogIGlmIChjb21iaW5hdGlvbkFyZy55ZWFycykgewogICAgYWRkTWlsbGlTZWNvbmRzKHVuaXRzLnllYXJzKGNvbWJpbmF0aW9uQXJnLnllYXJzKSk7CiAgfQogIGlmIChjb21iaW5hdGlvbkFyZy5tb250aHMpIHsKICAgIGFkZE1pbGxpU2Vjb25kcyh1bml0cy5tb250aHMoY29tYmluYXRpb25BcmcubW9udGhzKSk7CiAgfQogIGlmIChjb21iaW5hdGlvbkFyZy53ZWVrcykgewogICAgYWRkTWlsbGlTZWNvbmRzKHVuaXRzLndlZWtzKGNvbWJpbmF0aW9uQXJnLndlZWtzKSk7CiAgfQogIGlmIChjb21iaW5hdGlvbkFyZy5kYXlzKSB7CiAgICBhZGRNaWxsaVNlY29uZHModW5pdHMuZGF5cyhjb21iaW5hdGlvbkFyZy5kYXlzKSk7CiAgfQogIGlmIChjb21iaW5hdGlvbkFyZy5ob3VycykgewogICAgYWRkTWlsbGlTZWNvbmRzKHVuaXRzLmhvdXJzKGNvbWJpbmF0aW9uQXJnLmhvdXJzKSk7CiAgfQogIGlmIChjb21iaW5hdGlvbkFyZy5taW51dGVzKSB7CiAgICBhZGRNaWxsaVNlY29uZHModW5pdHMubWludXRlcyhjb21iaW5hdGlvbkFyZy5taW51dGVzKSk7CiAgfQogIGlmIChjb21iaW5hdGlvbkFyZy5zZWNvbmRzKSB7CiAgICBhZGRNaWxsaVNlY29uZHModW5pdHMuc2Vjb25kcyhjb21iaW5hdGlvbkFyZy5zZWNvbmRzKSk7CiAgfQogIHJldHVybiB0aW1lSW5NaWxsaXNlY29uZHM7Cn0sICJnZXRNaWxsaVNlY29uZHNGcm9tVW5pdHMiKTsKdmFyIGdldE1pbGxpU2Vjb25kc0FzSHVtYW5SZWFkYWJsZVN0cmluZyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKG1pbGxpU2Vjb25kc0FyZykgPT4gewogIHJldHVybiBwcmV0dHlNaWxsaXNlY29uZHMobWlsbGlTZWNvbmRzQXJnKTsKfSwgImdldE1pbGxpU2Vjb25kc0FzSHVtYW5SZWFkYWJsZVN0cmluZyIpOwp2YXIgZ2V0TWlsbGlTZWNvbmRzQXNIdW1hblJlYWRhYmxlQWdvVGltZSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHRpbWVTdGFtcEFyZykgPT4gewogIHJldHVybiBkYXRlX2Zuc19leHBvcnRzLmZvcm1hdERpc3RhbmNlVG9Ob3cobmV3IERhdGUodGltZVN0YW1wQXJnKSk7Cn0sICJnZXRNaWxsaVNlY29uZHNBc0h1bWFuUmVhZGFibGVBZ29UaW1lIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR0aW1lQDQuMi4zL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHRpbWUvZGlzdF90cy9zbWFydHRpbWUuY2xhc3Nlcy5leHRlbmRlZGRhdGUuanMKdmFyIEV4dGVuZGVkRGF0ZSA9IGNsYXNzIF9FeHRlbmRlZERhdGUgZXh0ZW5kcyBEYXRlIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJFeHRlbmRlZERhdGUiKTsKICB9CiAgLy8gU1RBVElDIGZhY3RvcmllcwogIHN0YXRpYyBmcm9tTWlsbGlzKG1pbGxpU2Vjb25kcykgewogICAgcmV0dXJuIG5ldyBfRXh0ZW5kZWREYXRlKG1pbGxpU2Vjb25kcyk7CiAgfQogIHN0YXRpYyBmcm9tRGF0ZShkYXRlQXJnKSB7CiAgICByZXR1cm4gbmV3IF9FeHRlbmRlZERhdGUoZGF0ZUFyZy5nZXRUaW1lKCkpOwogIH0KICBzdGF0aWMgZnJvbUV1cm9wZWFuRGF0ZShldXJvcGVhbkRhdGUpIHsKICAgIGNvbnN0IGRhdGVBcnJheSA9IC8oLiopXC4oLiopXC4oLiopLy5leGVjKGV1cm9wZWFuRGF0ZSk7CiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoCiAgICAgIHBhcnNlRmxvYXQoZGF0ZUFycmF5WzNdKSwKICAgICAgLy8geWVhcgogICAgICBwYXJzZUZsb2F0KGRhdGVBcnJheVsyXSkgLSAxLAogICAgICAvLyBtb250aAogICAgICBwYXJzZUZsb2F0KGRhdGVBcnJheVsxXSkKICAgICAgLy8gZGF5CiAgICApOwogICAgY29uc3QgdW5peE1pbGxpID0gZGF0ZS5nZXRUaW1lKCk7CiAgICByZXR1cm4gbmV3IF9FeHRlbmRlZERhdGUodW5peE1pbGxpKTsKICB9CiAgLyoqCiAgICogY3JlYXRlcyBhbiBFeHRlbmRlZCBkYXRlIGZyb20gYSBoeXBlZERhdGUgbGlrZSAiMjAxOC0wMy0yOCIKICAgKiBAcGFyYW0gZGF0ZVN0cmluZwogICAqLwogIHN0YXRpYyBmcm9tSHlwaGVkRGF0ZShkYXRlU3RyaW5nKSB7CiAgICBjb25zdCBkYXRlTWlsbGlzID0gbmV3IERhdGUoZGF0ZVN0cmluZykuZ2V0VGltZSgpOwogICAgcmV0dXJuIG5ldyBfRXh0ZW5kZWREYXRlKGRhdGVNaWxsaXMpOwogIH0KICAvKioKICAgKiBTYW1lIGFzIC5mcm9tRXVyb3BlYW5EYXRlKCksIGJ1dCBhY2NlcHRzIGFkZGl0aW9uYWwgdGltZUFyZyBhbmQgem9uZUFyZwogICAqLwogIHN0YXRpYyBmcm9tRXVyb3BlYW5EYXRlQW5kVGltZShldXJvcGVhbkRhdGVBcmcsIHRpbWVBcmcgPSAiMTI6MDA6MDAiLCB6b25lQXJnID0gIkV1cm9wZS9CZXJsaW4iKSB7CiAgICBjb25zdCBkYXRlQXJyYXkgPSAvKC4qKVwuKC4qKVwuKC4qKS8uZXhlYyhldXJvcGVhbkRhdGVBcmcpOwogICAgY29uc3Qgc2xpY2VEYXRlID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoZGF0ZVN0cmluZykgPT4gewogICAgICByZXR1cm4gYDAke2RhdGVTdHJpbmd9YC5zbGljZSgtMik7CiAgICB9LCAic2xpY2VEYXRlIik7CiAgICBjb25zdCBkYXRlVGltZVN0cmluZyA9IGAke2RhdGVBcnJheVszXX0tJHtzbGljZURhdGUoZGF0ZUFycmF5WzJdKX0tJHtzbGljZURhdGUoZGF0ZUFycmF5WzFdKX1UJHt0aW1lQXJnfWA7CiAgICBjb25zdCBkYXRlID0gaW1wb3J0X2RheWpzLmRlZmF1bHQoZGF0ZVRpbWVTdHJpbmcpOwogICAgY29uc3QgdW5peE1pbGxpID0gZGF0ZS50b0RhdGUoKS5nZXRUaW1lKCk7CiAgICByZXR1cm4gbmV3IF9FeHRlbmRlZERhdGUodW5peE1pbGxpKTsKICB9CiAgY29uc3RydWN0b3IodW5peE1pbGxpID0gRGF0ZS5ub3coKSkgewogICAgc3VwZXIodW5peE1pbGxpKTsKICB9CiAgLy8KICBleHBvcnRUb0V1cm9wZWFuRGF0ZSgpIHsKICAgIGNvbnN0IHVuaXRzMiA9IHRoaXMuZXhwb3J0VG9Vbml0cygpOwogICAgcmV0dXJuIGAke3VuaXRzMi5kYXlTdHJpbmd9LiR7dW5pdHMyLm1vbnRoU3RyaW5nfS4ke3VuaXRzMi55ZWFyU3RyaW5nfWA7CiAgfQogIGV4cG9ydFRvSHlwaGVkU29ydGFibGVEYXRlKCkgewogICAgY29uc3QgdW5pdHMyID0gdGhpcy5leHBvcnRUb1VuaXRzKCk7CiAgICByZXR1cm4gYCR7dW5pdHMyLnllYXJTdHJpbmd9LSR7dW5pdHMyLm1vbnRoU3RyaW5nfS0ke3VuaXRzMi5kYXlTdHJpbmd9YDsKICB9CiAgLyoqCiAgICogZXhwb3J0cyB1bml0cwogICAqLwogIGV4cG9ydFRvVW5pdHMoKSB7CiAgICBjb25zdCBtb250aHNBcnJheSA9IFsKICAgICAgIkphbnVhcnkiLAogICAgICAiRmVicnVhcnkiLAogICAgICAiTWFyY2giLAogICAgICAiQXByaWwiLAogICAgICAiTWF5IiwKICAgICAgIkp1bmUiLAogICAgICAiSnVseSIsCiAgICAgICJBdWd1c3QiLAogICAgICAiU2VwdGVtYmVyIiwKICAgICAgIk9jdG9iZXIiLAogICAgICAiTm92ZW1iZXIiLAogICAgICAiRGVjZW1iZXIiCiAgICBdOwogICAgY29uc3QgZGF5c0FycmF5ID0gWwogICAgICAiTW9uZGF5IiwKICAgICAgIlR1ZXNkYXkiLAogICAgICAiV2VkbmVzZGF5IiwKICAgICAgIlRodXJzZGF5IiwKICAgICAgIkZyaWRheSIsCiAgICAgICJTYXR1cmRheSIsCiAgICAgICJTdW5kYXkiCiAgICBdOwogICAgcmV0dXJuIHsKICAgICAgeWVhcjogdGhpcy5nZXRGdWxsWWVhcigpLAogICAgICB5ZWFyU3RyaW5nOiBgJHt0aGlzLmdldEZ1bGxZZWFyKCl9YCwKICAgICAgbW9udGg6IHRoaXMuZ2V0TW9udGgoKSArIDEsCiAgICAgIG1vbnRoU3RyaW5nOiAoIjAiICsgKHRoaXMuZ2V0TW9udGgoKSArIDEpKS5zbGljZSgtMiksCiAgICAgIG1vbnRoTmFtZTogbW9udGhzQXJyYXlbdGhpcy5nZXRNb250aCgpXSwKICAgICAgZGF5OiB0aGlzLmdldERhdGUoKSwKICAgICAgZGF5U3RyaW5nOiAoIjAiICsgdGhpcy5nZXREYXRlKCkpLnNsaWNlKC0yKSwKICAgICAgZGF5T2ZUaGVXZWVrOiB0aGlzLmdldERheSgpLAogICAgICBkYXlPZlRoZVdlZWtOYW1lOiBkYXlzQXJyYXlbdGhpcy5nZXREYXkoKV0KICAgIH07CiAgfQogIGZvcm1hdChmb3JtYXRBcmcpIHsKICAgIHJldHVybiBpbXBvcnRfZGF5anMuZGVmYXVsdCh0aGlzLmdldFRpbWUoKSkuZm9ybWF0KGZvcm1hdEFyZyk7CiAgfQogIC8qKgogICAqIGJvb2xlYW4gY2hlY2tzCiAgICovCiAgaXNUb2RheSgpIHsKICAgIHJldHVybiBpbXBvcnRfZGF5anMuZGVmYXVsdCh0aGlzLmdldFRpbWUoKSkuaXNUb2RheSgpOwogIH0KICBsZXNzVGltZVBhc3NlZFRvTm93KHVuaXRBcmdzKSB7CiAgICBjb25zdCBtYXhQYXNzZWRVbml4VGltZSA9IGdldE1pbGxpU2Vjb25kc0Zyb21Vbml0cyh1bml0QXJncyk7CiAgICBjb25zdCBhY3R1YWxQYXNzZWRVbml4VGltZSA9IERhdGUubm93KCkgLSB0aGlzLmdldFRpbWUoKTsKICAgIHJldHVybiBhY3R1YWxQYXNzZWRVbml4VGltZSA8IG1heFBhc3NlZFVuaXhUaW1lOwogIH0KICBtb3JlVGltZVBhc3NlZFRvTm93KHVuaXRBcmdzKSB7CiAgICByZXR1cm4gIXRoaXMubGVzc1RpbWVQYXNzZWRUb05vdyh1bml0QXJncyk7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0dGltZUA0LjIuMy9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnR0aW1lL2Rpc3RfdHMvc21hcnR0aW1lLmNsYXNzZXMuaHJ0bWVhc3VyZW1lbnQuanMKdmFyIEhydE1lYXN1cmVtZW50ID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkhydE1lYXN1cmVtZW50Iik7CiAgfQogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5uYW5vU2Vjb25kcyA9IG51bGw7CiAgICB0aGlzLm1pbGxpU2Vjb25kcyA9IG51bGw7CiAgICB0aGlzLl9taWxsaVN0YXJ0ID0gbnVsbDsKICAgIHRoaXMuX21pbGxpRGlmZiA9IG51bGw7CiAgICB0aGlzLl9zdGFydGVkID0gZmFsc2U7CiAgfQogIC8qKgogICAqIHN0YXJ0IHRoZSBtZWFzdXJlbWVudAogICAqLwogIHN0YXJ0KCkgewogICAgdGhpcy5fc3RhcnRlZCA9IHRydWU7CiAgICB0aGlzLl9taWxsaVN0YXJ0ID0gRGF0ZS5ub3coKTsKICB9CiAgLyoqCiAgICogc3RvcCB0aGUgbWVhc3VyZW1lbnQKICAgKi8KICBzdG9wKCkgewogICAgaWYgKHRoaXMuX3N0YXJ0ZWQgPT09IGZhbHNlKSB7CiAgICAgIGNvbnNvbGUubG9nKCJIYXNuJ3Qgc3RhcnRlZCB5ZXQiKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5fbWlsbGlEaWZmID0gRGF0ZS5ub3coKSAtIHRoaXMuX21pbGxpU3RhcnQ7CiAgICB0aGlzLm5hbm9TZWNvbmRzID0gdGhpcy5fbWlsbGlEaWZmICogMWUzOwogICAgdGhpcy5taWxsaVNlY29uZHMgPSB0aGlzLl9taWxsaURpZmY7CiAgICByZXR1cm4gdGhpczsKICB9CiAgLyoqCiAgICogcmVzZXQgdGhlIG1lYXN1cmVtZW50CiAgICovCiAgcmVzZXQoKSB7CiAgICB0aGlzLm5hbm9TZWNvbmRzID0gbnVsbDsKICAgIHRoaXMubWlsbGlTZWNvbmRzID0gbnVsbDsKICAgIHRoaXMuX21pbGxpU3RhcnQgPSBudWxsOwogICAgdGhpcy5fbWlsbGlEaWZmID0gbnVsbDsKICAgIHRoaXMuX3N0YXJ0ZWQgPSBmYWxzZTsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR0aW1lQDQuMi4zL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHRpbWUvZGlzdF90cy9zbWFydHRpbWUuY2xhc3Nlcy5pbnRlcnZhbC5qcwp2YXIgSW50ZXJ2YWwgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiSW50ZXJ2YWwiKTsKICB9CiAgY29uc3RydWN0b3IoaW50ZXJ2YWxNaWxsaXNlbmNvbmRzQXJnKSB7CiAgICB0aGlzLnN0YXR1cyA9ICJpbml0aWFsIjsKICAgIHRoaXMuc3RhdHVzQXV0aG9yaXphdGlvbiA9IG51bGw7CiAgICB0aGlzLmludGVydmFsSm9icyA9IFtdOwogICAgdGhpcy5pbnRlcnZhbE1pbGxpc2Vjb25kcyA9IGludGVydmFsTWlsbGlzZW5jb25kc0FyZzsKICB9CiAgc3RhcnQoKSB7CiAgICB0aGlzLnN0YXR1cyA9ICJzdGFydGVkIjsKICAgIGNvbnN0IHN0YXR1c0F1dGggPSAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKTsKICAgIHRoaXMuc3RhdHVzQXV0aG9yaXphdGlvbiA9IHN0YXR1c0F1dGg7CiAgICBjb25zdCBydW5JbnRlcnZhbCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoYXN5bmMgKCkgPT4gewogICAgICB3aGlsZSAodGhpcy5zdGF0dXMgPT09ICJzdGFydGVkIiAmJiB0aGlzLnN0YXR1c0F1dGhvcml6YXRpb24gPT09IHN0YXR1c0F1dGgpIHsKICAgICAgICBhd2FpdCBkaXN0X3RzX2V4cG9ydHMzLmRlbGF5Rm9yKHRoaXMuaW50ZXJ2YWxNaWxsaXNlY29uZHMpOwogICAgICAgIHRoaXMuZXhlY3V0ZUludGVydmFsSm9icygpOwogICAgICB9CiAgICB9LCAicnVuSW50ZXJ2YWwiKTsKICAgIHJ1bkludGVydmFsKCk7CiAgfQogIHN0b3AoKSB7CiAgICB0aGlzLnN0YXR1cyA9ICJzdG9wcGVkIjsKICAgIHRoaXMuc3RhdHVzQXV0aG9yaXphdGlvbiA9IG51bGw7CiAgfQogIGFkZEludGVydmFsSm9iKGZ1bmNBcmcpIHsKICAgIHRoaXMuaW50ZXJ2YWxKb2JzLnB1c2goZnVuY0FyZyk7CiAgfQogIGV4ZWN1dGVJbnRlcnZhbEpvYnMoKSB7CiAgICBmb3IgKGNvbnN0IGZ1bmNBcmcgb2YgdGhpcy5pbnRlcnZhbEpvYnMpIHsKICAgICAgZnVuY0FyZygpOwogICAgfQogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHRpbWVANC4yLjMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0dGltZS9kaXN0X3RzL3NtYXJ0dGltZS5jbGFzc2VzLnRpbWVzdGFtcC5qcwp2YXIgVGltZVN0YW1wID0gY2xhc3MgX1RpbWVTdGFtcCB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiVGltZVN0YW1wIik7CiAgfQogIC8qKgogICAqIHJldHVybnMgbmV3IFRpbWVTdGFtcCBmcm9tIG1pbGxpc2Vjb25kcwogICAqLwogIHN0YXRpYyBmcm9tTWlsbGlTZWNvbmRzKG1pbGxpU2Vjb25kc0FyZykgewogICAgcmV0dXJuIG5ldyBfVGltZVN0YW1wKG1pbGxpU2Vjb25kc0FyZyk7CiAgfQogIC8qKgogICAqIHJldHVybnMgbmV3IFRpbWVTdGFtcCBmb3Igbm93IHdpdGggY2hhbmdlIHNldAogICAqIEBwYXJhbSB0aW1lU3RhbXBBcmcKICAgKi8KICBzdGF0aWMgZnJvbVRpbWVTdGFtcCh0aW1lU3RhbXBBcmcpIHsKICAgIGNvbnN0IGxvY2FsVGltZVN0YW1wID0gbmV3IF9UaW1lU3RhbXAoKTsKICAgIGxvY2FsVGltZVN0YW1wLmNoYW5nZSA9IGxvY2FsVGltZVN0YW1wLm1pbGxpU2Vjb25kcyAtIHRpbWVTdGFtcEFyZy5taWxsaVNlY29uZHM7CiAgICByZXR1cm4gbG9jYWxUaW1lU3RhbXA7CiAgfQogIGNvbnN0cnVjdG9yKGNyZWF0b3JBcmcpIHsKICAgIHRoaXMuY2hhbmdlID0gbnVsbDsKICAgIGlmICghY3JlYXRvckFyZykgewogICAgICB0aGlzLmRhdGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKTsKICAgIH0gZWxzZSBpZiAodHlwZW9mIGNyZWF0b3JBcmcgPT09ICJudW1iZXIiKSB7CiAgICAgIHRoaXMuZGF0ZSA9IG5ldyBEYXRlKGNyZWF0b3JBcmcpOwogICAgfQogICAgdGhpcy5taWxsaVNlY29uZHMgPSB0aGlzLmRhdGUuZ2V0VGltZSgpOwogICAgdGhpcy5lcG9jaHRpbWUgPSBNYXRoLmZsb29yKHRoaXMubWlsbGlTZWNvbmRzIC8gMWUzKTsKICB9CiAgLyoqCiAgICogcmV0dXJucyBhIGJvb2xlYW4gZm9yIHdldGhlciB0aGUgdGltZXN0YW1wIGlzIG9sZGVyIHRoYW4gYW5vdGhlciB0aW1lc3RhbXAKICAgKiBAcGFyYW0gVGltZVN0YW1wQXJnCiAgICogQHBhcmFtIHRyZXNob2xkVGltZUFyZwogICAqLwogIGlzT2xkZXJUaGFuT3RoZXJUaW1lU3RhbXAoVGltZVN0YW1wQXJnLCB0cmVzaG9sZFRpbWVBcmcgPSAwKSB7CiAgICBpZiAodGhpcy5taWxsaVNlY29uZHMgPCBUaW1lU3RhbXBBcmcubWlsbGlTZWNvbmRzIC0gdHJlc2hvbGRUaW1lQXJnKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICAvKioKICAgKiBJcyB0aGUgY3VycmVudCBpbnN0YW5jZSBvbGRlciB0aGFuIHRoZSBhcmd1bWVudAogICAqIEBwYXJhbSBUaW1lU3RhbXBBcmcKICAgKi8KICBpc09sZGVyVGhhbihUaW1lU3RhbXBBcmcsIHRyZXNob2xkVGltZUFyZyA9IDApIHsKICAgIGlmICh0aGlzLm1pbGxpU2Vjb25kcyArIHRyZXNob2xkVGltZUFyZyA8IFRpbWVTdGFtcEFyZy5taWxsaVNlY29uZHMpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQogIC8qKgogICAqIHJldHVybnMgYSBib29sZWFuIGZvciB3ZXRoZXIgdGhlIHRpbWVzdGFtcCBpcyB5b3VuZ2VyIHRoYW4gYW5vdGhlciB0aW1lc3RhbXAKICAgKiBAcGFyYW0gVGltZVN0YW1wQXJnCiAgICogQHBhcmFtIHRyZXNob2xkVGltZUFyZwogICAqLwogIGlzWW91bmdlclRoYW5PdGhlclRpbWVTdGFtcChUaW1lU3RhbXBBcmcsIHRyZXNob2xkVGltZUFyZyA9IDApIHsKICAgIGlmICh0aGlzLm1pbGxpU2Vjb25kcyA+IFRpbWVTdGFtcEFyZy5taWxsaVNlY29uZHMgKyB0cmVzaG9sZFRpbWVBcmcpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQogIGlzWW91bmdlclRoYW5NaWxsaVNlY29uZHMobWlsbGlzZWNvbmRBcmcpIHsKICAgIGNvbnN0IG5vd1RpbWVTdGFtcCA9IG5ldyBfVGltZVN0YW1wKCk7CiAgICBjb25zdCBjb21wYXJlRXBvY2hUaW1lID0gbm93VGltZVN0YW1wLmVwb2NodGltZSAtIG1pbGxpc2Vjb25kQXJnOwogICAgY29uc3QgY29tcGFyZVRpbWVTdGFtcCA9IG5ldyBfVGltZVN0YW1wKGNvbXBhcmVFcG9jaFRpbWUpOwogICAgcmV0dXJuIHRoaXMuaXNZb3VuZ2VyVGhhbk90aGVyVGltZVN0YW1wKGNvbXBhcmVUaW1lU3RhbXApOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHRpbWVANC4yLjMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0dGltZS9kaXN0X3RzL3NtYXJ0dGltZS5jbGFzc2VzLnRpbWVyLmpzCnZhciBUaW1lciA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJUaW1lciIpOwogIH0KICBnZXQgdGltZUxlZnQoKSB7CiAgICByZXR1cm4gdGhpcy50aW1lSW5NaWxsaXNlY29uZHMgLSB0aGlzLnBhdXNlZEF0LmNoYW5nZTsKICB9CiAgY29uc3RydWN0b3IodGltZUluTWlsbGlzZWNvbmRzQXJnKSB7CiAgICB0aGlzLnN0YXRlID0gImluaXRpYXRlZCI7CiAgICB0aGlzLmNvbXBsZXRlZERlZmVycmVkID0gZGlzdF90c19leHBvcnRzLmRlZmVyKCk7CiAgICB0aGlzLnRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVJbk1pbGxpc2Vjb25kc0FyZzsKICAgIHRoaXMuY29tcGxldGVkID0gdGhpcy5jb21wbGV0ZWREZWZlcnJlZC5wcm9taXNlOwogIH0KICAvKioKICAgKiBzdGFydHMgdGhlIHRpbWVyCiAgICovCiAgc3RhcnQoKSB7CiAgICBpZiAoIXRoaXMuc3RhcnRlZEF0KSB7CiAgICAgIHRoaXMuY3VycmVudFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICB0aGlzLmNvbXBsZXRlZERlZmVycmVkLnJlc29sdmUoKTsKICAgICAgfSwgdGhpcy50aW1lSW5NaWxsaXNlY29uZHMpOwogICAgICB0aGlzLnN0YXJ0ZWRBdCA9IG5ldyBUaW1lU3RhbXAoKTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigidGltZXIgaGFzIGJlZW4gc3RhcnRlZCBiZWZvcmUuIFBsZWFzZSB1c2UgcmVzdW1lIGluc3RlYWQiKTsKICAgIH0KICB9CiAgcGF1c2UoKSB7CiAgICBpZiAodGhpcy5zdGFydGVkQXQpIHsKICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuY3VycmVudFRpbWVvdXQpOwogICAgICB0aGlzLmN1cnJlbnRUaW1lb3V0ID0gbnVsbDsKICAgICAgdGhpcy5wYXVzZWRBdCA9IFRpbWVTdGFtcC5mcm9tVGltZVN0YW1wKHRoaXMuc3RhcnRlZEF0KTsKICAgIH0KICB9CiAgcmVzdW1lKCkgewogICAgaWYgKHRoaXMuc3RhcnRlZEF0KSB7CiAgICAgIHRoaXMuY3VycmVudFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICB0aGlzLmNvbXBsZXRlZERlZmVycmVkLnJlc29sdmUoKTsKICAgICAgfSwgdGhpcy50aW1lTGVmdCk7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRXJyb3IoInRpbWVyIGhhcyBOT1QgYmVlbiBzdGFydGVkIGJlZm9yZS4gUGxlYXNlIHVzZSAuc3RhcnQoKSBpbnN0ZWFkIik7CiAgICB9CiAgfQogIHJlc2V0KCkgewogICAgdGhpcy5wYXVzZSgpOwogICAgdGhpcy5zdGFydGVkQXQgPSBudWxsOwogICAgdGhpcy5wYXVzZWRBdCA9IG51bGw7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjQuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvY2xhc3Nlcy5wbHVnaW5zLmpzCnZhciBpbXBvcnRfc3ltYm9sX3RyZWUgPSBfX3RvRVNNKHJlcXVpcmVfU3ltYm9sVHJlZSgpLCAxKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytsaWtANi40LjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2xpay9kaXN0X3RzL2NsYXNzZXMuYXN5bmNleGVjdXRpb25zdGFjay5qcwp2YXIgQXN5bmNFeGVjdXRpb25TdGFjayA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJBc3luY0V4ZWN1dGlvblN0YWNrIik7CiAgfQogIGV4ZWN1dGlvblNsb3RzID0gW107CiAgaXNQcm9jZXNzaW5nID0gZmFsc2U7CiAgLyoqIE1heGltdW0gY29uY3VycmVudCBub24tZXhjbHVzaXZlIHRhc2tzIChJbmZpbml0eSA9IHVubGltaXRlZCkgKi8KICBub25FeGNsdXNpdmVNYXhDb25jdXJyZW5jeSA9IEluZmluaXR5OwogIC8qKiBDdXJyZW50bHkgcnVubmluZyBub24tZXhjbHVzaXZlIHRhc2sgY291bnQgKi8KICBub25FeGNsdXNpdmVDdXJyZW50Q291bnQgPSAwOwogIC8qKiBRdWV1ZSBvZiByZXNvbHZlcnMgd2FpdGluZyBmb3IgYSBub24tZXhjbHVzaXZlIHNsb3QgKi8KICBub25FeGNsdXNpdmVQZW5kaW5nUXVldWUgPSBbXTsKICBhc3luYyBnZXRFeGNsdXNpdmVFeGVjdXRpb25TbG90KGZ1bmNBcmcsIHRpbWVvdXRBcmcpIHsKICAgIGNvbnN0IGV4ZWN1dGlvbkRlZmVycmVkID0gZGlzdF90c19leHBvcnRzLmRlZmVyKCk7CiAgICBjb25zdCBleGVjdXRpb25TbG90ID0gewogICAgICBmdW5jVG9FeGVjdXRlOiBmdW5jQXJnLAogICAgICBleGVjdXRpb25EZWZlcnJlZCwKICAgICAgdGltZW91dDogdGltZW91dEFyZywKICAgICAgbW9kZTogImV4Y2x1c2l2ZSIKICAgIH07CiAgICB0aGlzLmV4ZWN1dGlvblNsb3RzLnB1c2goZXhlY3V0aW9uU2xvdCk7CiAgICB0aGlzLnByb2Nlc3NFeGVjdXRpb25TbG90cygpOwogICAgcmV0dXJuIGV4ZWN1dGlvbkRlZmVycmVkLnByb21pc2U7CiAgfQogIGFzeW5jIGdldE5vbkV4Y2x1c2l2ZUV4ZWN1dGlvblNsb3QoZnVuY0FyZywgdGltZW91dEFyZykgewogICAgY29uc3QgZXhlY3V0aW9uRGVmZXJyZWQgPSBkaXN0X3RzX2V4cG9ydHMuZGVmZXIoKTsKICAgIGNvbnN0IGV4ZWN1dGlvblNsb3QgPSB7CiAgICAgIGZ1bmNUb0V4ZWN1dGU6IGZ1bmNBcmcsCiAgICAgIGV4ZWN1dGlvbkRlZmVycmVkLAogICAgICB0aW1lb3V0OiB0aW1lb3V0QXJnLAogICAgICBtb2RlOiAibm9uZXhjbHVzaXZlIgogICAgfTsKICAgIHRoaXMuZXhlY3V0aW9uU2xvdHMucHVzaChleGVjdXRpb25TbG90KTsKICAgIHRoaXMucHJvY2Vzc0V4ZWN1dGlvblNsb3RzKCk7CiAgICByZXR1cm4gZXhlY3V0aW9uRGVmZXJyZWQucHJvbWlzZTsKICB9CiAgLyoqCiAgICogU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25jdXJyZW50IG5vbi1leGNsdXNpdmUgdGFza3MuCiAgICogQHBhcmFtIGNvbmN1cnJlbmN5IG1pbmltdW0gMSAoSW5maW5pdHkgbWVhbnMgdW5saW1pdGVkKQogICAqLwogIHNldE5vbkV4Y2x1c2l2ZU1heENvbmN1cnJlbmN5KGNvbmN1cnJlbmN5KSB7CiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShjb25jdXJyZW5jeSkgfHwgY29uY3VycmVuY3kgPCAxKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigibm9uRXhjbHVzaXZlTWF4Q29uY3VycmVuY3kgbXVzdCBiZSBhIGZpbml0ZSBudW1iZXIgPj0gMSIpOwogICAgfQogICAgdGhpcy5ub25FeGNsdXNpdmVNYXhDb25jdXJyZW5jeSA9IGNvbmN1cnJlbmN5OwogIH0KICAvKiogR2V0IHRoZSBjb25maWd1cmVkIG1heCBjb25jdXJyZW5jeSBmb3Igbm9uLWV4Y2x1c2l2ZSB0YXNrcyAqLwogIGdldE5vbkV4Y2x1c2l2ZU1heENvbmN1cnJlbmN5KCkgewogICAgcmV0dXJuIHRoaXMubm9uRXhjbHVzaXZlTWF4Q29uY3VycmVuY3k7CiAgfQogIC8qKiBOdW1iZXIgb2Ygbm9uLWV4Y2x1c2l2ZSB0YXNrcyBjdXJyZW50bHkgcnVubmluZyAqLwogIGdldEFjdGl2ZU5vbkV4Y2x1c2l2ZUNvdW50KCkgewogICAgcmV0dXJuIHRoaXMubm9uRXhjbHVzaXZlQ3VycmVudENvdW50OwogIH0KICAvKiogTnVtYmVyIG9mIG5vbi1leGNsdXNpdmUgdGFza3Mgd2FpdGluZyBmb3IgYSBmcmVlIHNsb3QgKi8KICBnZXRQZW5kaW5nTm9uRXhjbHVzaXZlQ291bnQoKSB7CiAgICByZXR1cm4gdGhpcy5ub25FeGNsdXNpdmVQZW5kaW5nUXVldWUubGVuZ3RoOwogIH0KICBhc3luYyBwcm9jZXNzRXhlY3V0aW9uU2xvdHMoKSB7CiAgICBpZiAodGhpcy5pc1Byb2Nlc3NpbmcpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5pc1Byb2Nlc3NpbmcgPSB0cnVlOwogICAgd2hpbGUgKHRoaXMuZXhlY3V0aW9uU2xvdHMubGVuZ3RoID4gMCkgewogICAgICBjb25zdCBjdXJyZW50U2xvdCA9IHRoaXMuZXhlY3V0aW9uU2xvdHNbMF07CiAgICAgIGlmIChjdXJyZW50U2xvdC5tb2RlID09PSAiZXhjbHVzaXZlIikgewogICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZUV4Y2x1c2l2ZVNsb3QoY3VycmVudFNsb3QpOwogICAgICAgIHRoaXMuZXhlY3V0aW9uU2xvdHMuc2hpZnQoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBub25FeGNsdXNpdmVTbG90cyA9IFtdOwogICAgICAgIHdoaWxlICh0aGlzLmV4ZWN1dGlvblNsb3RzLmxlbmd0aCA+IDAgJiYgdGhpcy5leGVjdXRpb25TbG90c1swXS5tb2RlID09PSAibm9uZXhjbHVzaXZlIikgewogICAgICAgICAgbm9uRXhjbHVzaXZlU2xvdHMucHVzaCh0aGlzLmV4ZWN1dGlvblNsb3RzLnNoaWZ0KCkpOwogICAgICAgIH0KICAgICAgICBhd2FpdCB0aGlzLmV4ZWN1dGVOb25FeGNsdXNpdmVTbG90cyhub25FeGNsdXNpdmVTbG90cyk7CiAgICAgIH0KICAgIH0KICAgIHRoaXMuaXNQcm9jZXNzaW5nID0gZmFsc2U7CiAgfQogIGFzeW5jIGV4ZWN1dGVFeGNsdXNpdmVTbG90KHNsb3QpIHsKICAgIHRyeSB7CiAgICAgIGlmIChzbG90LnRpbWVvdXQpIHsKICAgICAgICBjb25zdCB0aW1lb3V0SW5zdGFuY2UgPSBuZXcgZGlzdF90c19leHBvcnRzMy5UaW1lb3V0KHNsb3QudGltZW91dCk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UucmFjZShbCiAgICAgICAgICAgIHNsb3QuZnVuY1RvRXhlY3V0ZSgpLAogICAgICAgICAgICB0aW1lb3V0SW5zdGFuY2UucHJvbWlzZS50aGVuKCgpID0+IHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRpbWVvdXQgcmVhY2hlZCIpOwogICAgICAgICAgICB9KQogICAgICAgICAgXSk7CiAgICAgICAgICB0aW1lb3V0SW5zdGFuY2UuY2FuY2VsKCk7CiAgICAgICAgICBzbG90LmV4ZWN1dGlvbkRlZmVycmVkLnJlc29sdmUocmVzdWx0KTsKICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgdGltZW91dEluc3RhbmNlLmNhbmNlbCgpOwogICAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNsb3QuZnVuY1RvRXhlY3V0ZSgpOwogICAgICAgIHNsb3QuZXhlY3V0aW9uRGVmZXJyZWQucmVzb2x2ZShyZXN1bHQpOwogICAgICB9CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBzbG90LmV4ZWN1dGlvbkRlZmVycmVkLnJlamVjdChlcnJvcik7CiAgICB9CiAgfQogIGFzeW5jIGV4ZWN1dGVOb25FeGNsdXNpdmVTbG90cyhzbG90cykgewogICAgY29uc3QgcHJvbWlzZXMgPSBzbG90cy5tYXAoYXN5bmMgKHNsb3QpID0+IHsKICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yTm9uRXhjbHVzaXZlU2xvdCgpOwogICAgICB0cnkgewogICAgICAgIGlmIChzbG90LnRpbWVvdXQpIHsKICAgICAgICAgIGNvbnN0IHRpbWVvdXRJbnN0YW5jZSA9IG5ldyBkaXN0X3RzX2V4cG9ydHMzLlRpbWVvdXQoc2xvdC50aW1lb3V0KTsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UucmFjZShbCiAgICAgICAgICAgICAgc2xvdC5mdW5jVG9FeGVjdXRlKCksCiAgICAgICAgICAgICAgdGltZW91dEluc3RhbmNlLnByb21pc2UudGhlbigoKSA9PiB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRpbWVvdXQgcmVhY2hlZCIpOwogICAgICAgICAgICAgIH0pCiAgICAgICAgICAgIF0pOwogICAgICAgICAgICB0aW1lb3V0SW5zdGFuY2UuY2FuY2VsKCk7CiAgICAgICAgICAgIHNsb3QuZXhlY3V0aW9uRGVmZXJyZWQucmVzb2x2ZShyZXN1bHQpOwogICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgdGltZW91dEluc3RhbmNlLmNhbmNlbCgpOwogICAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2xvdC5mdW5jVG9FeGVjdXRlKCk7CiAgICAgICAgICBzbG90LmV4ZWN1dGlvbkRlZmVycmVkLnJlc29sdmUocmVzdWx0KTsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgc2xvdC5leGVjdXRpb25EZWZlcnJlZC5yZWplY3QoZXJyb3IpOwogICAgICB9IGZpbmFsbHkgewogICAgICAgIHRoaXMucmVsZWFzZU5vbkV4Y2x1c2l2ZVNsb3QoKTsKICAgICAgfQogICAgfSk7CiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7CiAgfQogIC8qKgogICAqIFdhaXQgdW50aWwgYSBub24tZXhjbHVzaXZlIHNsb3QgaXMgYXZhaWxhYmxlIChyZXNwZWN0cyBtYXggY29uY3VycmVuY3kpLgogICAqLwogIHdhaXRGb3JOb25FeGNsdXNpdmVTbG90KCkgewogICAgaWYgKHRoaXMubm9uRXhjbHVzaXZlQ3VycmVudENvdW50IDwgdGhpcy5ub25FeGNsdXNpdmVNYXhDb25jdXJyZW5jeSkgewogICAgICB0aGlzLm5vbkV4Y2x1c2l2ZUN1cnJlbnRDb3VudCsrOwogICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7CiAgICB9CiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUyKSA9PiB7CiAgICAgIHRoaXMubm9uRXhjbHVzaXZlUGVuZGluZ1F1ZXVlLnB1c2goKCkgPT4gewogICAgICAgIHRoaXMubm9uRXhjbHVzaXZlQ3VycmVudENvdW50Kys7CiAgICAgICAgcmVzb2x2ZTIoKTsKICAgICAgfSk7CiAgICB9KTsKICB9CiAgLyoqIFJlbGVhc2UgYSBub24tZXhjbHVzaXZlIHNsb3QgYW5kIHdha2UgdGhlIG5leHQgd2FpdGVyLCBpZiBhbnkuICovCiAgcmVsZWFzZU5vbkV4Y2x1c2l2ZVNsb3QoKSB7CiAgICB0aGlzLm5vbkV4Y2x1c2l2ZUN1cnJlbnRDb3VudC0tOwogICAgY29uc3QgbmV4dDIgPSB0aGlzLm5vbkV4Y2x1c2l2ZVBlbmRpbmdRdWV1ZS5zaGlmdCgpOwogICAgaWYgKG5leHQyKSB7CiAgICAgIG5leHQyKCk7CiAgICB9CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjQuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvY2xhc3Nlcy5iYWNrcHJlc3N1cmVkYXJyYXkuanMKdmFyIEJhY2twcmVzc3VyZWRBcnJheSA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJCYWNrcHJlc3N1cmVkQXJyYXkiKTsKICB9CiAgZGF0YTsKICBoaWdoV2F0ZXJNYXJrOwogIGhhc1NwYWNlID0gbmV3IGRpc3RfdHNfZXhwb3J0czIucnhqcy5TdWJqZWN0KCk7CiAgaXRlbXNBdmFpbGFibGUgPSBuZXcgZGlzdF90c19leHBvcnRzMi5yeGpzLlN1YmplY3QoKTsKICBpc0Rlc3Ryb3llZCA9IGZhbHNlOwogIGNvbnN0cnVjdG9yKGhpZ2hXYXRlck1hcmsgPSAxNikgewogICAgdGhpcy5kYXRhID0gW107CiAgICB0aGlzLmhpZ2hXYXRlck1hcmsgPSBoaWdoV2F0ZXJNYXJrOwogIH0KICBnZXQgbGVuZ3RoKCkgewogICAgcmV0dXJuIHRoaXMuZGF0YS5sZW5ndGg7CiAgfQogIHB1c2goaXRlbSkgewogICAgdGhpcy5kYXRhLnB1c2goaXRlbSk7CiAgICB0aGlzLml0ZW1zQXZhaWxhYmxlLm5leHQoIml0ZW1zQXZhaWxhYmxlIik7CiAgICBjb25zdCBzcGFjZUF2YWlsYWJsZSA9IHRoaXMuY2hlY2tTcGFjZUF2YWlsYWJsZSgpOwogICAgaWYgKHNwYWNlQXZhaWxhYmxlKSB7CiAgICAgIHRoaXMuaGFzU3BhY2UubmV4dCgiaGFzU3BhY2UiKTsKICAgIH0KICAgIHJldHVybiBzcGFjZUF2YWlsYWJsZTsKICB9CiAgcHVzaE1hbnkoaXRlbXMpIHsKICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykgewogICAgICB0aGlzLnB1c2goaXRlbSk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5jaGVja1NwYWNlQXZhaWxhYmxlKCk7CiAgfQogIHNoaWZ0KCkgewogICAgY29uc3QgaXRlbSA9IHRoaXMuZGF0YS5zaGlmdCgpOwogICAgaWYgKHRoaXMuY2hlY2tTcGFjZUF2YWlsYWJsZSgpKSB7CiAgICAgIHRoaXMuaGFzU3BhY2UubmV4dCgiaGFzU3BhY2UiKTsKICAgIH0KICAgIHJldHVybiBpdGVtOwogIH0KICBwZWVrKCkgewogICAgcmV0dXJuIHRoaXMuZGF0YVswXTsKICB9CiAgY2hlY2tTcGFjZUF2YWlsYWJsZSgpIHsKICAgIHJldHVybiB0aGlzLmRhdGEubGVuZ3RoIDwgdGhpcy5oaWdoV2F0ZXJNYXJrOwogIH0KICBjaGVja0hhc0l0ZW1zKCkgewogICAgcmV0dXJuIHRoaXMuZGF0YS5sZW5ndGggPiAwOwogIH0KICB3YWl0Rm9yU3BhY2UoKSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUyKSA9PiB7CiAgICAgIGlmICh0aGlzLmNoZWNrU3BhY2VBdmFpbGFibGUoKSB8fCB0aGlzLmlzRGVzdHJveWVkKSB7CiAgICAgICAgcmVzb2x2ZTIoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSB0aGlzLmhhc1NwYWNlLnN1YnNjcmliZSh7CiAgICAgICAgICBuZXh0OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKCgpID0+IHsKICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgIHJlc29sdmUyKCk7CiAgICAgICAgICB9LCAibmV4dCIpLAogICAgICAgICAgY29tcGxldGU6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKCkgPT4gewogICAgICAgICAgICByZXNvbHZlMigpOwogICAgICAgICAgfSwgImNvbXBsZXRlIikKICAgICAgICB9KTsKICAgICAgfQogICAgfSk7CiAgfQogIHdhaXRGb3JJdGVtcygpIHsKICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTIpID0+IHsKICAgICAgaWYgKHRoaXMuZGF0YS5sZW5ndGggPiAwIHx8IHRoaXMuaXNEZXN0cm95ZWQpIHsKICAgICAgICByZXNvbHZlMigpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHRoaXMuaXRlbXNBdmFpbGFibGUuc3Vic2NyaWJlKHsKICAgICAgICAgIG5leHQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKCkgPT4gewogICAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgcmVzb2x2ZTIoKTsKICAgICAgICAgIH0sICJuZXh0IiksCiAgICAgICAgICBjb21wbGV0ZTogLyogQF9fUFVSRV9fICovIF9fbmFtZSgoKSA9PiB7CiAgICAgICAgICAgIHJlc29sdmUyKCk7CiAgICAgICAgICB9LCAiY29tcGxldGUiKQogICAgICAgIH0pOwogICAgICB9CiAgICB9KTsKICB9CiAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7CiAgICByZXR1cm4gdGhpcy5kYXRhW1N5bWJvbC5pdGVyYXRvcl0oKTsKICB9CiAgLyoqCiAgICogZGVzdHJveXMgdGhlIEJhY2twcmVzc3VyZWRBcnJheSwgY29tcGxldGluZyBhbGwgc3ViamVjdHMKICAgKi8KICBkZXN0cm95KCkgewogICAgdGhpcy5pc0Rlc3Ryb3llZCA9IHRydWU7CiAgICB0aGlzLmhhc1NwYWNlLmNvbXBsZXRlKCk7CiAgICB0aGlzLml0ZW1zQXZhaWxhYmxlLmNvbXBsZXRlKCk7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjQuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvY2xhc3Nlcy5mYXN0bWFwLmpzCnZhciBGYXN0TWFwID0gY2xhc3MgX0Zhc3RNYXAgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkZhc3RNYXAiKTsKICB9CiAgbWFwT2JqZWN0ID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICBpc1VuaXF1ZUtleShrZXlBcmcpIHsKICAgIHJldHVybiAhdGhpcy5tYXBPYmplY3QuaGFzKGtleUFyZyk7CiAgfQogIGhhcyhrZXlBcmcpIHsKICAgIHJldHVybiB0aGlzLm1hcE9iamVjdC5oYXMoa2V5QXJnKTsKICB9CiAgZ2V0IHNpemUoKSB7CiAgICByZXR1cm4gdGhpcy5tYXBPYmplY3Quc2l6ZTsKICB9CiAgYWRkVG9NYXAoa2V5QXJnLCBvYmplY3RBcmcsIG9wdGlvbnNBcmcpIHsKICAgIGlmICh0aGlzLmlzVW5pcXVlS2V5KGtleUFyZykgfHwgb3B0aW9uc0FyZyAmJiBvcHRpb25zQXJnLmZvcmNlKSB7CiAgICAgIHRoaXMubWFwT2JqZWN0LnNldChrZXlBcmcsIG9iamVjdEFyZyk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICBnZXRCeUtleShrZXlBcmcpIHsKICAgIHJldHVybiB0aGlzLm1hcE9iamVjdC5nZXQoa2V5QXJnKTsKICB9CiAgcmVtb3ZlRnJvbU1hcChrZXlBcmcpIHsKICAgIGNvbnN0IHJlbW92ZWRJdGVtID0gdGhpcy5tYXBPYmplY3QuZ2V0KGtleUFyZyk7CiAgICB0aGlzLm1hcE9iamVjdC5kZWxldGUoa2V5QXJnKTsKICAgIHJldHVybiByZW1vdmVkSXRlbTsKICB9CiAgZ2V0S2V5cygpIHsKICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMubWFwT2JqZWN0LmtleXMoKSk7CiAgfQogIHZhbHVlcygpIHsKICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMubWFwT2JqZWN0LnZhbHVlcygpKTsKICB9CiAgZW50cmllcygpIHsKICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMubWFwT2JqZWN0LmVudHJpZXMoKSk7CiAgfQogIGNsZWFuKCkgewogICAgdGhpcy5tYXBPYmplY3QuY2xlYXIoKTsKICB9CiAgLyoqCiAgICogcmV0dXJucyBhIG5ldyBGYXN0bWFwIHRoYXQgaW5jbHVkZXMgYWxsIHZhbHVlcyBmcm9tIHRoaXMgYW5kIGFsbCBmcm9tIHRoZSBmYXN0bWFwIGluIHRoZSBhcmd1bWVudAogICAqLwogIGNvbmNhdChmYXN0TWFwQXJnKSB7CiAgICBjb25zdCBjb25jYXRlZEZhc3RtYXAgPSBuZXcgX0Zhc3RNYXAoKTsKICAgIGZvciAoY29uc3Qga2V5MiBvZiB0aGlzLmdldEtleXMoKSkgewogICAgICBjb25jYXRlZEZhc3RtYXAuYWRkVG9NYXAoa2V5MiwgdGhpcy5nZXRCeUtleShrZXkyKSk7CiAgICB9CiAgICBmb3IgKGNvbnN0IGtleTIgb2YgZmFzdE1hcEFyZy5nZXRLZXlzKCkpIHsKICAgICAgY29uY2F0ZWRGYXN0bWFwLmFkZFRvTWFwKGtleTIsIGZhc3RNYXBBcmcuZ2V0QnlLZXkoa2V5MiksIHsKICAgICAgICBmb3JjZTogdHJ1ZQogICAgICB9KTsKICAgIH0KICAgIHJldHVybiBjb25jYXRlZEZhc3RtYXA7CiAgfQogIC8qKgogICAqIHRyaWVzIHRvIG1lcmdlIGFub3RoZXIgRmFzdG1hcAogICAqIE5vdGU6IHVuaXF1ZUtleUNvbGxpc2lvbnMgd2lsbCBjYXVzZSBvdmVyd3JpdGUKICAgKiBAcGFyYW0gZmFzdE1hcEFyZwogICAqLwogIGFkZEFsbEZyb21PdGhlcihmYXN0TWFwQXJnKSB7CiAgICBmb3IgKGNvbnN0IGtleTIgb2YgZmFzdE1hcEFyZy5nZXRLZXlzKCkpIHsKICAgICAgdGhpcy5hZGRUb01hcChrZXkyLCBmYXN0TWFwQXJnLmdldEJ5S2V5KGtleTIpLCB7CiAgICAgICAgZm9yY2U6IHRydWUKICAgICAgfSk7CiAgICB9CiAgfQogIGFzeW5jIGZpbmQoZmluZEZ1bmN0aW9uQXJnKSB7CiAgICBmb3IgKGNvbnN0IGtleTIgb2YgdGhpcy5nZXRLZXlzKCkpIHsKICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0QnlLZXkoa2V5Mik7CiAgICAgIGNvbnN0IGZpbmRGdW5jdGlvblJlc3VsdCA9IGF3YWl0IGZpbmRGdW5jdGlvbkFyZyhpdGVtKTsKICAgICAgaWYgKGZpbmRGdW5jdGlvblJlc3VsdCkgewogICAgICAgIHJldHVybiBpdGVtOwogICAgICB9CiAgICB9CiAgfQogIFtTeW1ib2wuaXRlcmF0b3JdKCkgewogICAgcmV0dXJuIHRoaXMubWFwT2JqZWN0LmVudHJpZXMoKTsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3MrbGlrQDYuNC4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9saWsvZGlzdF90cy9jbGFzc2VzLm9iamVjdG1hcC5qcwp2YXIgdW5pID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgocHJlZml4ID0gInVuaSIpID0+IHsKICByZXR1cm4gYCR7cHJlZml4fXh4eHh4eHh4eHh4YC5yZXBsYWNlKC9beHldL2csIChjMTApID0+IHsKICAgIGNvbnN0IHIxMCA9IE1hdGgucmFuZG9tKCkgKiAxNiB8IDA7CiAgICBjb25zdCB2NCA9IGMxMCA9PT0gIngiID8gcjEwIDogcjEwICYgMyB8IDg7CiAgICByZXR1cm4gdjQudG9TdHJpbmcoMTYpOwogIH0pOwp9LCAidW5pIik7CnZhciBPYmplY3RNYXAgPSBjbGFzcyBfT2JqZWN0TWFwIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJPYmplY3RNYXAiKTsKICB9CiAgZmFzdE1hcCA9IG5ldyBGYXN0TWFwKCk7CiAgcmV2ZXJzZU1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgLy8gZXZlbnRzCiAgZXZlbnRTdWJqZWN0ID0gbmV3IGRpc3RfdHNfZXhwb3J0czIucnhqcy5TdWJqZWN0KCk7CiAgLyoqCiAgICogcmV0dXJucyBhIG5ldyBpbnN0YW5jZQogICAqLwogIGNvbnN0cnVjdG9yKCkgewogIH0KICAvKioKICAgKiB0aGUgbnVtYmVyIG9mIG9iamVjdHMgaW4gdGhlIG1hcAogICAqLwogIGdldCBsZW5ndGgoKSB7CiAgICByZXR1cm4gdGhpcy5mYXN0TWFwLnNpemU7CiAgfQogIC8qKgogICAqIGFkZHMgYW4gb2JqZWN0IG1hcHBlZCB0byBhIHN0cmluZwogICAqIHRoZSBzdHJpbmcgbXVzdCBiZSB1bmlxdWUKICAgKi8KICBhZGRNYXBwZWRVbmlxdWUodW5pcXVlS2V5QXJnLCBvYmplY3RBcmcpIHsKICAgIHRoaXMuZmFzdE1hcC5hZGRUb01hcCh1bmlxdWVLZXlBcmcsIG9iamVjdEFyZyk7CiAgICB0aGlzLnJldmVyc2VNYXAuc2V0KG9iamVjdEFyZywgdW5pcXVlS2V5QXJnKTsKICB9CiAgLyoqCiAgICogZmFzdGVzdCB3YXkgdG8gZ2V0IGFuIG9iamVjdCBmcm9tIHRoZSBtYXAKICAgKiBAcGFyYW0gdW5pcXVlS2V5CiAgICovCiAgZ2V0TWFwcGVkVW5pcXVlKHVuaXF1ZUtleUFyZykgewogICAgcmV0dXJuIHRoaXMuZmFzdE1hcC5nZXRCeUtleSh1bmlxdWVLZXlBcmcpOwogIH0KICAvKioKICAgKiByZW1vdmUga2V5CiAgICogQHBhcmFtIGZ1bmN0aW9uQXJnCiAgICovCiAgcmVtb3ZlTWFwcGVkVW5pcXVlKHVuaXF1ZUtleSkgewogICAgY29uc3Qgb2JqZWN0ID0gdGhpcy5mYXN0TWFwLnJlbW92ZUZyb21NYXAodW5pcXVlS2V5KTsKICAgIGlmIChvYmplY3QgIT09IHZvaWQgMCkgewogICAgICB0aGlzLnJldmVyc2VNYXAuZGVsZXRlKG9iamVjdCk7CiAgICAgIHRoaXMuZXZlbnRTdWJqZWN0Lm5leHQoewogICAgICAgIG9wZXJhdGlvbjogInJlbW92ZSIsCiAgICAgICAgcGF5bG9hZDogb2JqZWN0CiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIG9iamVjdDsKICB9CiAgLyoqCiAgICogYWRkIG9iamVjdCB0byBPYmplY3RtYXAKICAgKiByZXR1cm5zIHRoZSBrZXkgZm9yIHRoZSBvYmplY3QgKGV4aXN0aW5nIG9yIG5ldykKICAgKi8KICBhZGQob2JqZWN0QXJnKSB7CiAgICBjb25zdCBleGlzdGluZ0tleSA9IHRoaXMucmV2ZXJzZU1hcC5nZXQob2JqZWN0QXJnKTsKICAgIGlmIChleGlzdGluZ0tleSAhPT0gdm9pZCAwKSB7CiAgICAgIHJldHVybiBleGlzdGluZ0tleTsKICAgIH0KICAgIGNvbnN0IHVuaXF1ZUtleSA9IHVuaSgia2V5Iik7CiAgICB0aGlzLmFkZE1hcHBlZFVuaXF1ZSh1bmlxdWVLZXksIG9iamVjdEFyZyk7CiAgICB0aGlzLmV2ZW50U3ViamVjdC5uZXh0KHsKICAgICAgb3BlcmF0aW9uOiAiYWRkIiwKICAgICAgcGF5bG9hZDogb2JqZWN0QXJnCiAgICB9KTsKICAgIHJldHVybiB1bmlxdWVLZXk7CiAgfQogIC8qKgogICAqIGxpa2UgLmFkZCBidXQgYWRkcyBhbiB3aG9sZSBhcnJheSBvZiBvYmplY3RzCiAgICovCiAgYWRkQXJyYXkob2JqZWN0QXJyYXlBcmcpIHsKICAgIGZvciAoY29uc3QgaXRlbSBvZiBvYmplY3RBcnJheUFyZykgewogICAgICB0aGlzLmFkZChpdGVtKTsKICAgIH0KICB9CiAgLyoqCiAgICogY2hlY2sgaWYgb2JqZWN0IGlzIGluIE9iamVjdG1hcAogICAqLwogIGNoZWNrRm9yT2JqZWN0KG9iamVjdEFyZykgewogICAgcmV0dXJuIHRoaXMucmV2ZXJzZU1hcC5oYXMob2JqZWN0QXJnKTsKICB9CiAgLyoqCiAgICogZ2V0IGtleSBmb3Igb2JqZWN0CiAgICovCiAgZ2V0S2V5Rm9yT2JqZWN0KG9iamVjdEFyZykgewogICAgcmV0dXJuIHRoaXMucmV2ZXJzZU1hcC5nZXQob2JqZWN0QXJnKSA/PyBudWxsOwogIH0KICAvKioKICAgKiBmaW5kIG9iamVjdAogICAqLwogIGFzeW5jIGZpbmQoZmluZEZ1bmN0aW9uKSB7CiAgICByZXR1cm4gdGhpcy5mYXN0TWFwLmZpbmQoZmluZEZ1bmN0aW9uKTsKICB9CiAgZmluZFN5bmMoZmluZEZ1bmN0aW9uKSB7CiAgICBmb3IgKGNvbnN0IGtleUFyZyBvZiB0aGlzLmZhc3RNYXAuZ2V0S2V5cygpKSB7CiAgICAgIGlmIChmaW5kRnVuY3Rpb24odGhpcy5mYXN0TWFwLmdldEJ5S2V5KGtleUFyZykpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TWFwcGVkVW5pcXVlKGtleUFyZyk7CiAgICAgIH0KICAgIH0KICB9CiAgLyoqCiAgICogZmluZHMgYSBzcGVjaWZpYyBlbGVtZW50IGFuZCB0aGVuIHJlbW92ZXMgaXQKICAgKi8KICBhc3luYyBmaW5kT25lQW5kUmVtb3ZlKGZpbmRGdW5jdGlvbikgewogICAgY29uc3QgZm91bmRFbGVtZW50ID0gYXdhaXQgdGhpcy5maW5kKGZpbmRGdW5jdGlvbik7CiAgICBpZiAoZm91bmRFbGVtZW50KSB7CiAgICAgIHRoaXMucmVtb3ZlKGZvdW5kRWxlbWVudCk7CiAgICB9CiAgICByZXR1cm4gZm91bmRFbGVtZW50OwogIH0KICBmaW5kT25lQW5kUmVtb3ZlU3luYyhmaW5kRnVuY3Rpb24pIHsKICAgIGNvbnN0IGZvdW5kRWxlbWVudCA9IHRoaXMuZmluZFN5bmMoZmluZEZ1bmN0aW9uKTsKICAgIGlmIChmb3VuZEVsZW1lbnQpIHsKICAgICAgdGhpcy5yZW1vdmUoZm91bmRFbGVtZW50KTsKICAgIH0KICAgIHJldHVybiBmb3VuZEVsZW1lbnQ7CiAgfQogIC8qKgogICAqIHJ1biBmdW5jdGlvbiBmb3IgZWFjaCBpdGVtIGluIE9iamVjdG1hcAogICAqLwogIGFzeW5jIGZvckVhY2goZnVuY3Rpb25BcmcpIHsKICAgIGZvciAoY29uc3Qga2V5QXJnIG9mIHRoaXMuZmFzdE1hcC5nZXRLZXlzKCkpIHsKICAgICAgYXdhaXQgZnVuY3Rpb25BcmcodGhpcy5mYXN0TWFwLmdldEJ5S2V5KGtleUFyZykpOwogICAgfQogIH0KICAvKioKICAgKiBnZXRzIGFuIG9iamVjdCBpbiB0aGUgT2JzZXJ2YWJsZW1hcCBhbmQgcmVtb3ZlcyBpdCwgc28gaXQgY2FuJ3QgYmUgcmV0cmlldmVkIGFnYWluCiAgICovCiAgZ2V0T25lQW5kUmVtb3ZlKCkgewogICAgY29uc3Qga2V5czIgPSB0aGlzLmZhc3RNYXAuZ2V0S2V5cygpOwogICAgaWYgKGtleXMyLmxlbmd0aCA9PT0gMCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGtleVRvVXNlID0ga2V5czJbMF07CiAgICAgIGNvbnN0IHJlbW92ZWRJdGVtID0gdGhpcy5mYXN0TWFwLnJlbW92ZUZyb21NYXAoa2V5VG9Vc2UpOwogICAgICB0aGlzLnJldmVyc2VNYXAuZGVsZXRlKHJlbW92ZWRJdGVtKTsKICAgICAgdGhpcy5ldmVudFN1YmplY3QubmV4dCh7CiAgICAgICAgb3BlcmF0aW9uOiAicmVtb3ZlIiwKICAgICAgICBwYXlsb2FkOiByZW1vdmVkSXRlbQogICAgICB9KTsKICAgICAgcmV0dXJuIHJlbW92ZWRJdGVtOwogICAgfQogIH0KICAvKioKICAgKiByZXR1cm5zIGEgY2xvbmVkIGFycmF5IG9mIGFsbCB0aGUgb2JqZWN0cyBjdXJyZW50bHkgaW4gdGhlIE9iamVjdG1hcAogICAqLwogIGdldEFycmF5KCkgewogICAgcmV0dXJuIHRoaXMuZmFzdE1hcC52YWx1ZXMoKTsKICB9CiAgLyoqCiAgICogY2hlY2sgaWYgT2JqZWN0bWFwIGlzdCBlbXB0eQogICAqLwogIGlzRW1wdHkoKSB7CiAgICByZXR1cm4gdGhpcy5mYXN0TWFwLnNpemUgPT09IDA7CiAgfQogIC8qKgogICAqIHJlbW92ZSBvYmplY3QgZnJvbSBPYmplY3RtYXAKICAgKi8KICByZW1vdmUob2JqZWN0QXJnKSB7CiAgICBjb25zdCBrZXlBcmcgPSB0aGlzLnJldmVyc2VNYXAuZ2V0KG9iamVjdEFyZyk7CiAgICBpZiAoa2V5QXJnICE9PSB2b2lkIDApIHsKICAgICAgY29uc3QgcmVtb3ZlZE9iamVjdCA9IHRoaXMuZmFzdE1hcC5yZW1vdmVGcm9tTWFwKGtleUFyZyk7CiAgICAgIHRoaXMucmV2ZXJzZU1hcC5kZWxldGUocmVtb3ZlZE9iamVjdCk7CiAgICAgIHRoaXMuZXZlbnRTdWJqZWN0Lm5leHQoewogICAgICAgIG9wZXJhdGlvbjogInJlbW92ZSIsCiAgICAgICAgcGF5bG9hZDogcmVtb3ZlZE9iamVjdAogICAgICB9KTsKICAgICAgcmV0dXJuIHJlbW92ZWRPYmplY3Q7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgLyoqCiAgICogd2lwZSBPYmplY3RtYXAKICAgKi8KICB3aXBlKCkgewogICAgY29uc3Qga2V5czIgPSB0aGlzLmZhc3RNYXAuZ2V0S2V5cygpOwogICAgZm9yIChjb25zdCBrZXlBcmcgb2Yga2V5czIpIHsKICAgICAgY29uc3QgcmVtb3ZlZE9iamVjdCA9IHRoaXMuZmFzdE1hcC5yZW1vdmVGcm9tTWFwKGtleUFyZyk7CiAgICAgIHRoaXMucmV2ZXJzZU1hcC5kZWxldGUocmVtb3ZlZE9iamVjdCk7CiAgICAgIHRoaXMuZXZlbnRTdWJqZWN0Lm5leHQoewogICAgICAgIG9wZXJhdGlvbjogInJlbW92ZSIsCiAgICAgICAgcGF5bG9hZDogcmVtb3ZlZE9iamVjdAogICAgICB9KTsKICAgIH0KICB9CiAgLyoqCiAgICogcmV0dXJucyBhIG5ldyBPYmplY3RtYXAgdGhhdCBpbmNsdWRlcwogICAqLwogIGNvbmNhdChvYmplY3RNYXBBcmcpIHsKICAgIGNvbnN0IGNvbmNhdHRlZE9iamVjdE1hcCA9IG5ldyBfT2JqZWN0TWFwKCk7CiAgICBjb25jYXR0ZWRPYmplY3RNYXAuZmFzdE1hcC5hZGRBbGxGcm9tT3RoZXIodGhpcy5mYXN0TWFwKTsKICAgIGNvbmNhdHRlZE9iamVjdE1hcC5mYXN0TWFwLmFkZEFsbEZyb21PdGhlcihvYmplY3RNYXBBcmcuZmFzdE1hcCk7CiAgICBmb3IgKGNvbnN0IGtleTIgb2YgY29uY2F0dGVkT2JqZWN0TWFwLmZhc3RNYXAuZ2V0S2V5cygpKSB7CiAgICAgIGNvbmNhdHRlZE9iamVjdE1hcC5yZXZlcnNlTWFwLnNldChjb25jYXR0ZWRPYmplY3RNYXAuZmFzdE1hcC5nZXRCeUtleShrZXkyKSwga2V5Mik7CiAgICB9CiAgICByZXR1cm4gY29uY2F0dGVkT2JqZWN0TWFwOwogIH0KICAvKioKICAgKiB0cmllcyB0byBtZXJnZSBhbm90aGVyIE9iamVjdG1hcAogICAqIE5vdGU6IHVuaXF1ZUtleUNvbGxpc2lvbnMgd2lsbCBjYXVzZSBvdmVyd3JpdGUKICAgKiBAcGFyYW0gb2JqZWN0TWFwQXJnCiAgICovCiAgYWRkQWxsRnJvbU90aGVyKG9iamVjdE1hcEFyZykgewogICAgdGhpcy5mYXN0TWFwLmFkZEFsbEZyb21PdGhlcihvYmplY3RNYXBBcmcuZmFzdE1hcCk7CiAgICBmb3IgKGNvbnN0IGtleTIgb2Ygb2JqZWN0TWFwQXJnLmZhc3RNYXAuZ2V0S2V5cygpKSB7CiAgICAgIHRoaXMucmV2ZXJzZU1hcC5zZXQob2JqZWN0TWFwQXJnLmZhc3RNYXAuZ2V0QnlLZXkoa2V5MiksIGtleTIpOwogICAgfQogIH0KICBtYXAoZm4pIHsKICAgIHJldHVybiB0aGlzLmdldEFycmF5KCkubWFwKGZuKTsKICB9CiAgZmlsdGVyKGZuKSB7CiAgICByZXR1cm4gdGhpcy5nZXRBcnJheSgpLmZpbHRlcihmbik7CiAgfQogIHJlZHVjZShmbiwgaW5pdGlhbCkgewogICAgcmV0dXJuIHRoaXMuZ2V0QXJyYXkoKS5yZWR1Y2UoZm4sIGluaXRpYWwpOwogIH0KICBbU3ltYm9sLml0ZXJhdG9yXSgpIHsKICAgIHJldHVybiB0aGlzLmdldEFycmF5KClbU3ltYm9sLml0ZXJhdG9yXSgpOwogIH0KICAvKioKICAgKiBkZXN0cm95cyB0aGUgT2JqZWN0TWFwLCBjb21wbGV0aW5nIHRoZSBldmVudFN1YmplY3QgYW5kIGNsZWFyaW5nIGFsbCBlbnRyaWVzCiAgICovCiAgZGVzdHJveSgpIHsKICAgIHRoaXMud2lwZSgpOwogICAgdGhpcy5yZXZlcnNlTWFwLmNsZWFyKCk7CiAgICB0aGlzLmV2ZW50U3ViamVjdC5jb21wbGV0ZSgpOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytsaWtANi40LjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2xpay9kaXN0X3RzL2NsYXNzZXMuaW50ZXJlc3RtYXAuaW50ZXJlc3QuanMKdmFyIEludGVyZXN0ID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkludGVyZXN0Iik7CiAgfQogIG9wdGlvbnM7CiAgaW50ZXJlc3RNYXBSZWY7CiAgb3JpZ2luYWxJbnRlcmVzdDsKICBjb21wYXJpc29uRnVuYzsKICBkZXN0cnVjdGlvblRpbWVyID0gbmV3IGRpc3RfdHNfZXhwb3J0czcuVGltZXIoMWU0KTsKICBpc0Z1bGxmaWxsZWQgPSBmYWxzZTsKICBpc0Rlc3Ryb3llZCA9IGZhbHNlOwogIC8qKgogICAqIGEgZ2VuZXJpYyBzdG9yZSB0byBzdG9yZSBvYmplY3RzIGluIHRoYXQgYXJlIG5lZWRlZCBmb3IgZnVsbGZpbGxtZW50OwogICAqLwogIGZ1bGxmaWxsbWVudFN0b3JlID0gW107CiAgLyoqCiAgICogYSBjYW5jZWxsYWJsZSB0aW1lb3V0IGZvciB0aGUgbWFya0xvc3RBZnRlckRlZmF1bHQgZmVhdHVyZQogICAqLwogIG1hcmtMb3N0VGltZW91dCA9IG51bGw7CiAgLyoqCiAgICogcXVpY2sgYWNjZXNzIHRvIGEgc3RyaW5nIHRoYXQgbWFrZXMgdGhlIGludGVyZXN0IGNvbXBhcmFibGUgZm9yIGNoZWNraW5nIGZvciBzaW1pbGFyIGludGVyZXN0cwogICAqLwogIGdldCBjb21wYXJpc29uU3RyaW5nKCkgewogICAgcmV0dXJuIHRoaXMuY29tcGFyaXNvbkZ1bmModGhpcy5vcmlnaW5hbEludGVyZXN0KTsKICB9CiAgaW50ZXJlc3REZWZlcnJlZCA9IG5ldyBkaXN0X3RzX2V4cG9ydHMuRGVmZXJyZWQoKTsKICBpbnRlcmVzdEZ1bGxmaWxsZWQgPSB0aGlzLmludGVyZXN0RGVmZXJyZWQucHJvbWlzZTsKICAvKioKICAgKiBmdWxsZmlsbCB0aGUgaW50ZXJlc3QKICAgKi8KICBmdWxsZmlsbEludGVyZXN0KG9iamVjdEFyZykgewogICAgdGhpcy5pc0Z1bGxmaWxsZWQgPSB0cnVlOwogICAgdGhpcy5mdWxsZmlsbG1lbnRTdG9yZSA9IFtdOwogICAgdGhpcy5pbnRlcmVzdERlZmVycmVkLnJlc29sdmUob2JqZWN0QXJnKTsKICAgIHRoaXMuZGVzdHJveSgpOwogIH0KICBjb25zdHJ1Y3RvcihpbnRlcmVzdE1hcEFyZywgaW50ZXJlc3RBcmcsIGNvbXBhcmlzb25GdW5jQXJnLCBvcHRpb25zQXJnKSB7CiAgICB0aGlzLmludGVyZXN0TWFwUmVmID0gaW50ZXJlc3RNYXBBcmc7CiAgICB0aGlzLm9yaWdpbmFsSW50ZXJlc3QgPSBpbnRlcmVzdEFyZzsKICAgIHRoaXMuY29tcGFyaXNvbkZ1bmMgPSBjb21wYXJpc29uRnVuY0FyZzsKICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNBcmc7CiAgICB0aGlzLmRlc3RydWN0aW9uVGltZXIuY29tcGxldGVkLnRoZW4oKCkgPT4gewogICAgICBpZiAoIXRoaXMuaXNEZXN0cm95ZWQpIHsKICAgICAgICB0aGlzLmRlc3Ryb3koKTsKICAgICAgfQogICAgfSk7CiAgICBpZiAodGhpcy5vcHRpb25zPy5tYXJrTG9zdEFmdGVyRGVmYXVsdCkgewogICAgICB0aGlzLm1hcmtMb3N0VGltZW91dCA9IG5ldyBkaXN0X3RzX2V4cG9ydHMzLlRpbWVvdXQodGhpcy5vcHRpb25zLm1hcmtMb3N0QWZ0ZXJEZWZhdWx0KTsKICAgICAgdGhpcy5tYXJrTG9zdFRpbWVvdXQucHJvbWlzZS50aGVuKCgpID0+IHsKICAgICAgICBpZiAoIXRoaXMuaXNEZXN0cm95ZWQpIHsKICAgICAgICAgIHRoaXMubWFya0xvc3QoKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogIH0KICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgLy8gTElGRUNZQ0xFIE1BTkFHRU1FTlQKICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgLyoqCiAgICogc2VsZiBkZXN0cnVjdHMgdGhlIGludGVyZXN0CiAgICovCiAgZGVzdHJveSgpIHsKICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXMuaXNEZXN0cm95ZWQgPSB0cnVlOwogICAgdGhpcy5kZXN0cnVjdGlvblRpbWVyLnJlc2V0KCk7CiAgICBpZiAodGhpcy5tYXJrTG9zdFRpbWVvdXQpIHsKICAgICAgdGhpcy5tYXJrTG9zdFRpbWVvdXQuY2FuY2VsKCk7CiAgICAgIHRoaXMubWFya0xvc3RUaW1lb3V0ID0gbnVsbDsKICAgIH0KICAgIHRoaXMuZnVsbGZpbGxtZW50U3RvcmUgPSBbXTsKICAgIHRoaXMuaW50ZXJlc3RNYXBSZWYucmVtb3ZlSW50ZXJlc3QodGhpcyk7CiAgICBpZiAoIXRoaXMuaXNGdWxsZmlsbGVkICYmIHRoaXMub3B0aW9ucz8uZGVmYXVsdEZ1bGxmaWxsbWVudCkgewogICAgICB0aGlzLmlzRnVsbGZpbGxlZCA9IHRydWU7CiAgICAgIHRoaXMuaW50ZXJlc3REZWZlcnJlZC5yZXNvbHZlKHRoaXMub3B0aW9ucy5kZWZhdWx0RnVsbGZpbGxtZW50KTsKICAgIH0KICB9CiAgLyoqCiAgICogbm90aWZpZXMgdGhlIGludGVyZXN0IHRoYXQgdGhlIGludGVyZXN0IGluIGl0IGhhcyBiZWVuIGxvc3QKICAgKi8KICBtYXJrTG9zdCgpIHsKICAgIHRoaXMuZGVzdHJ1Y3Rpb25UaW1lci5zdGFydCgpOwogIH0KICAvKioKICAgKiBub3RpZmllcyB0aGUgaW50ZXJlc3QgdGhhdCB0aGUgaW50ZXJlc3QgaW4gaXQgaGFzIGJlZW4gcmVzdG9yZWQKICAgKi8KICByZW5ldygpIHsKICAgIHRoaXMuZGVzdHJ1Y3Rpb25UaW1lci5yZXNldCgpOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytsaWtANi40LjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2xpay9kaXN0X3RzL2NsYXNzZXMuaW50ZXJlc3RtYXAuanMKdmFyIEludGVyZXN0TWFwID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkludGVyZXN0TWFwIik7CiAgfQogIG9wdGlvbnM7CiAgLyoqCiAgICogc3RvcmVzIGludGVyZXN0cyB0aGF0IGFyZSBjdXJyZW50bHkgZnVsbGZpbGxlZCBieSB0aGUgY2FjaGUKICAgKi8KICBpbnRlcmVzdE9iamVjdE1hcCA9IG5ldyBPYmplY3RNYXAoKTsKICAvKioKICAgKiBPKDEpIGxvb2t1cCBvZiBpbnRlcmVzdHMgYnkgdGhlaXIgY29tcGFyaXNvbiBzdHJpbmcKICAgKi8KICBpbnRlcmVzdHNCeUNvbXBhcmlzb25TdHJpbmcgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogIC8qKgogICAqIGEgZnVuY3Rpb24gdG8gY29tcGFyZSBpbnRlcmVzdHMKICAgKi8KICBjb21wYXJpc29uRnVuYzsKICBjb25zdHJ1Y3Rvcihjb21wYXJpc29uRnVuY0FyZywgb3B0aW9uc0FyZyA9IHt9KSB7CiAgICB0aGlzLmNvbXBhcmlzb25GdW5jID0gY29tcGFyaXNvbkZ1bmNBcmc7CiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zQXJnOwogIH0KICAvKioKICAgKiBhZGRzIGFuIGludGVyZXN0IHRvIHRoZSBJbnRlcmVzdE1hcAogICAqIEBwYXJhbSBpbnRlcmVzdElkCiAgICovCiAgYXN5bmMgYWRkSW50ZXJlc3QoaW50ZXJlc3RJZCwgZGVmYXVsdEZ1bGxmaWxsbWVudEFyZykgewogICAgY29uc3QgY29tcGFyaXNvblN0cmluZyA9IHRoaXMuY29tcGFyaXNvbkZ1bmMoaW50ZXJlc3RJZCk7CiAgICBsZXQgcmV0dXJuSW50ZXJlc3Q7CiAgICBjb25zdCBleGlzdGluZ0ludGVyZXN0ID0gdGhpcy5pbnRlcmVzdHNCeUNvbXBhcmlzb25TdHJpbmcuZ2V0KGNvbXBhcmlzb25TdHJpbmcpOwogICAgaWYgKGV4aXN0aW5nSW50ZXJlc3QpIHsKICAgICAgcmV0dXJuSW50ZXJlc3QgPSBleGlzdGluZ0ludGVyZXN0OwogICAgICByZXR1cm5JbnRlcmVzdC5yZW5ldygpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuSW50ZXJlc3QgPSBuZXcgSW50ZXJlc3QodGhpcywgaW50ZXJlc3RJZCwgdGhpcy5jb21wYXJpc29uRnVuYywgewogICAgICAgIG1hcmtMb3N0QWZ0ZXJEZWZhdWx0OiB0aGlzLm9wdGlvbnMubWFya0xvc3RBZnRlckRlZmF1bHQsCiAgICAgICAgZGVmYXVsdEZ1bGxmaWxsbWVudDogZGVmYXVsdEZ1bGxmaWxsbWVudEFyZwogICAgICB9KTsKICAgICAgdGhpcy5pbnRlcmVzdE9iamVjdE1hcC5hZGQocmV0dXJuSW50ZXJlc3QpOwogICAgICB0aGlzLmludGVyZXN0c0J5Q29tcGFyaXNvblN0cmluZy5zZXQoY29tcGFyaXNvblN0cmluZywgcmV0dXJuSW50ZXJlc3QpOwogICAgfQogICAgdGhpcy5pbnRlcmVzdE9ic2VydmFibGUucHVzaChyZXR1cm5JbnRlcmVzdCk7CiAgICByZXR1cm4gcmV0dXJuSW50ZXJlc3Q7CiAgfQogIGludGVyZXN0T2JzZXJ2YWJsZSA9IG5ldyBkaXN0X3RzX2V4cG9ydHMyLk9ic2VydmFibGVJbnRha2UoKTsKICAvKioKICAgKiByZW1vdmVzIGFuIGludGVyZXN0IGZyb20gdGhlIGludGVyZXN0IG1hcAogICAqLwogIHJlbW92ZUludGVyZXN0KGludGVyZXN0QXJnKSB7CiAgICB0aGlzLmludGVyZXN0T2JqZWN0TWFwLmZpbmRPbmVBbmRSZW1vdmVTeW5jKChpbnRlcmVzdEFyZzIpID0+IHsKICAgICAgcmV0dXJuIGludGVyZXN0QXJnLmNvbXBhcmlzb25TdHJpbmcgPT09IGludGVyZXN0QXJnMi5jb21wYXJpc29uU3RyaW5nOwogICAgfSk7CiAgICB0aGlzLmludGVyZXN0c0J5Q29tcGFyaXNvblN0cmluZy5kZWxldGUoaW50ZXJlc3RBcmcuY29tcGFyaXNvblN0cmluZyk7CiAgfQogIC8qKgogICAqIGNoZWNrIGludGVyZXN0CiAgICovCiAgY2hlY2tJbnRlcmVzdChvYmplY3RBcmcpIHsKICAgIGNvbnN0IGNvbXBhcmlzb25TdHJpbmcgPSB0aGlzLmNvbXBhcmlzb25GdW5jKG9iamVjdEFyZyk7CiAgICByZXR1cm4gdGhpcy5jaGVja0ludGVyZXN0QnlTdHJpbmcoY29tcGFyaXNvblN0cmluZyk7CiAgfQogIC8qKgogICAqIGNoZWNrcyBhbiBpbnRlcmVzdAogICAqIEBwYXJhbSBjb21wYXJpc29uU3RyaW5nQXJnCiAgICovCiAgY2hlY2tJbnRlcmVzdEJ5U3RyaW5nKGNvbXBhcmlzb25TdHJpbmdBcmcpIHsKICAgIHJldHVybiB0aGlzLmludGVyZXN0c0J5Q29tcGFyaXNvblN0cmluZy5oYXMoY29tcGFyaXNvblN0cmluZ0FyZyk7CiAgfQogIC8qKgogICAqIGluZm9ybSBsb3N0IGludGVyZXN0CiAgICogQHBhcmFtIGludGVyZXN0SWQKICAgKi8KICBpbmZvcm1Mb3N0SW50ZXJlc3QoaW50ZXJlc3RJZCkgewogICAgY29uc3Qgd2FudGVkSW50ZXJlc3QgPSB0aGlzLmZpbmRJbnRlcmVzdChpbnRlcmVzdElkKTsKICAgIGlmICh3YW50ZWRJbnRlcmVzdCkgewogICAgICB3YW50ZWRJbnRlcmVzdC5tYXJrTG9zdCgpOwogICAgfQogIH0KICAvKioKICAgKiBmaW5kcyBhbiBpbnRlcmVzdAogICAqIEBwYXJhbSBpbnRlcmVzdElkCiAgICovCiAgZmluZEludGVyZXN0KGludGVyZXN0SWQpIHsKICAgIGNvbnN0IGNvbXBhcmFibGVTdHJpbmcgPSB0aGlzLmNvbXBhcmlzb25GdW5jKGludGVyZXN0SWQpOwogICAgcmV0dXJuIHRoaXMuaW50ZXJlc3RzQnlDb21wYXJpc29uU3RyaW5nLmdldChjb21wYXJhYmxlU3RyaW5nKSA/PyBudWxsOwogIH0KICAvKioKICAgKiBkZXN0cm95cyB0aGUgSW50ZXJlc3RNYXAgYW5kIGNsZWFucyB1cCBhbGwgcmVzb3VyY2VzCiAgICovCiAgZGVzdHJveSgpIHsKICAgIGNvbnN0IGludGVyZXN0cyA9IHRoaXMuaW50ZXJlc3RPYmplY3RNYXAuZ2V0QXJyYXkoKTsKICAgIGZvciAoY29uc3QgaW50ZXJlc3Qgb2YgaW50ZXJlc3RzKSB7CiAgICAgIGludGVyZXN0LmRlc3Ryb3koKTsKICAgIH0KICAgIHRoaXMuaW50ZXJlc3RPYmplY3RNYXAud2lwZSgpOwogICAgdGhpcy5pbnRlcmVzdHNCeUNvbXBhcmlzb25TdHJpbmcuY2xlYXIoKTsKICAgIHRoaXMuaW50ZXJlc3RPYnNlcnZhYmxlLnNpZ25hbENvbXBsZXRlKCk7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjQuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvY2xhc3Nlcy5saW1pdGVkYXJyYXkuanMKdmFyIExpbWl0ZWRBcnJheSA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJMaW1pdGVkQXJyYXkiKTsKICB9CiAgYXJyYXkgPSBbXTsKICBhcnJheUxpbWl0OwogIGNvbnN0cnVjdG9yKGxpbWl0QXJnKSB7CiAgICB0aGlzLmFycmF5TGltaXQgPSBsaW1pdEFyZzsKICB9CiAgZ2V0IGxlbmd0aCgpIHsKICAgIHJldHVybiB0aGlzLmFycmF5Lmxlbmd0aDsKICB9CiAgYWRkT25lKG9iamVjdEFyZykgewogICAgdGhpcy5hcnJheS51bnNoaWZ0KG9iamVjdEFyZyk7CiAgICBpZiAodGhpcy5hcnJheS5sZW5ndGggPiB0aGlzLmFycmF5TGltaXQpIHsKICAgICAgdGhpcy5hcnJheS5sZW5ndGggPSB0aGlzLmFycmF5TGltaXQ7CiAgICB9CiAgfQogIGFkZE1hbnkob2JqZWN0QXJyYXlBcmcpIHsKICAgIGZvciAobGV0IG9iamVjdEFyZyBvZiBvYmplY3RBcnJheUFyZykgewogICAgICB0aGlzLmFkZE9uZShvYmplY3RBcmcpOwogICAgfQogIH0KICBzZXRMaW1pdChsaW1pdEFyZykgewogICAgdGhpcy5hcnJheUxpbWl0ID0gbGltaXRBcmc7CiAgICBpZiAodGhpcy5hcnJheS5sZW5ndGggPiB0aGlzLmFycmF5TGltaXQpIHsKICAgICAgdGhpcy5hcnJheS5sZW5ndGggPSB0aGlzLmFycmF5TGltaXQ7CiAgICB9CiAgfQogIGdldEF2ZXJhZ2UoKSB7CiAgICBpZiAodGhpcy5hcnJheS5sZW5ndGggPT09IDApIHsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBpZiAodHlwZW9mIHRoaXMuYXJyYXlbMF0gPT09ICJudW1iZXIiKSB7CiAgICAgIGxldCBzdW0gPSAwOwogICAgICBmb3IgKGxldCBsb2NhbE51bWJlciBvZiB0aGlzLmFycmF5KSB7CiAgICAgICAgbGV0IGxvY2FsTnVtYmVyQW55ID0gbG9jYWxOdW1iZXI7CiAgICAgICAgc3VtID0gc3VtICsgbG9jYWxOdW1iZXJBbnk7CiAgICAgIH0KICAgICAgcmV0dXJuIHN1bSAvIHRoaXMuYXJyYXkubGVuZ3RoOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQogIHJlbW92ZShpdGVtKSB7CiAgICBjb25zdCBpZHggPSB0aGlzLmFycmF5LmluZGV4T2YoaXRlbSk7CiAgICBpZiAoaWR4ICE9PSAtMSkgewogICAgICB0aGlzLmFycmF5LnNwbGljZShpZHgsIDEpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CiAgY2xlYXIoKSB7CiAgICB0aGlzLmFycmF5Lmxlbmd0aCA9IDA7CiAgfQogIGdldEFycmF5KCkgewogICAgcmV0dXJuIFsuLi50aGlzLmFycmF5XTsKICB9CiAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7CiAgICByZXR1cm4gdGhpcy5hcnJheVtTeW1ib2wuaXRlcmF0b3JdKCk7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjQuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvY2xhc3Nlcy5sb29wdHJhY2tlci5qcwp2YXIgTG9vcFRyYWNrZXIgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiTG9vcFRyYWNrZXIiKTsKICB9CiAgcmVmZXJlbmNlT2JqZWN0TWFwID0gbmV3IE9iamVjdE1hcCgpOwogIGNvbnN0cnVjdG9yKCkgewogIH0KICAvKioKICAgKiBjaGVja3MgYW5kIHRyYWNrcyBhbiBvYmplY3QKICAgKiBAcGFyYW0gb2JqZWN0QXJnCiAgICovCiAgY2hlY2tBbmRUcmFjayhvYmplY3RBcmcpIHsKICAgIGlmICghdGhpcy5yZWZlcmVuY2VPYmplY3RNYXAuY2hlY2tGb3JPYmplY3Qob2JqZWN0QXJnKSkgewogICAgICB0aGlzLnJlZmVyZW5jZU9iamVjdE1hcC5hZGQob2JqZWN0QXJnKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQogIC8qKgogICAqIHJlc2V0cyB0aGUgbG9vcCB0cmFja2VyLCBjbGVhcmluZyBhbGwgdHJhY2tlZCBvYmplY3RzCiAgICovCiAgcmVzZXQoKSB7CiAgICB0aGlzLnJlZmVyZW5jZU9iamVjdE1hcC53aXBlKCk7CiAgfQogIC8qKgogICAqIGRlc3Ryb3lzIHRoZSBsb29wIHRyYWNrZXIgYW5kIGl0cyB1bmRlcmx5aW5nIE9iamVjdE1hcAogICAqLwogIGRlc3Ryb3koKSB7CiAgICB0aGlzLnJlZmVyZW5jZU9iamVjdE1hcC5kZXN0cm95KCk7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjQuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvY2xhc3Nlcy5zdHJpbmdtYXAuanMKdmFyIFN0cmluZ21hcCA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJTdHJpbmdtYXAiKTsKICB9CiAgX3N0cmluZ0FycmF5ID0gW107CiAgX3RyaWdnZXJVbnRpbFRydWVGdW5jdGlvbkFycmF5ID0gW107CiAgY29uc3RydWN0b3IoKSB7CiAgfQogIC8qKgogICAqIGFkZCBhIHN0cmluZyB0byB0aGUgU3RyaW5nbWFwCiAgICovCiAgYWRkU3RyaW5nKHN0cmluZ0FyZykgewogICAgdGhpcy5fc3RyaW5nQXJyYXkucHVzaChzdHJpbmdBcmcpOwogICAgdGhpcy5ub3RpZnlUcmlnZ2VyKCk7CiAgfQogIC8qKgogICAqIGxpa2UgYWRkU3RyaW5nLCBidXQgYWNjZXB0cyBhbiBhcnJheSBvZiBzdHJpbmdzCiAgICovCiAgYWRkU3RyaW5nQXJyYXkoc3RyaW5nQXJyYXlBcmcpIHsKICAgIGZvciAoY29uc3Qgc3RyaW5nSXRlbSBvZiBzdHJpbmdBcnJheUFyZykgewogICAgICB0aGlzLmFkZFN0cmluZyhzdHJpbmdJdGVtKTsKICAgIH0KICB9CiAgLyoqCiAgICogcmVtb3ZlcyBhIHN0cmluZyBmcm9tIFN0cmluZ21hcAogICAqLwogIHJlbW92ZVN0cmluZyhzdHJpbmdBcmcpIHsKICAgIHRoaXMuX3N0cmluZ0FycmF5ID0gdGhpcy5fc3RyaW5nQXJyYXkuZmlsdGVyKChzOSkgPT4gczkgIT09IHN0cmluZ0FyZyk7CiAgICB0aGlzLm5vdGlmeVRyaWdnZXIoKTsKICB9CiAgLyoqCiAgICogd2lwZXMgdGhlIFN0cmluZ21hcAogICAqLwogIHdpcGUoKSB7CiAgICB0aGlzLl9zdHJpbmdBcnJheSA9IFtdOwogICAgdGhpcy5ub3RpZnlUcmlnZ2VyKCk7CiAgfQogIC8qKgogICAqIGNoZWNrIGlmIHN0cmluZyBpcyBpbiBTdHJpbmdtYXAKICAgKi8KICBjaGVja1N0cmluZyhzdHJpbmdBcmcpIHsKICAgIHJldHVybiB0aGlzLl9zdHJpbmdBcnJheS5pbmRleE9mKHN0cmluZ0FyZykgIT09IC0xOwogIH0KICAvKioKICAgKiBjaGVja3Mgc3RyaW5nUHJlc2VuY2Ugd2l0aCBtaW5pbWF0Y2gKICAgKi8KICBjaGVja01pbmltYXRjaChtaW5pTWF0Y2hTdHJpbmdBcmcpIHsKICAgIGNvbnN0IHNtYXJ0TWF0Y2hJbnN0YW5jZSA9IG5ldyBkaXN0X3RzX2V4cG9ydHM1LlNtYXJ0TWF0Y2gobWluaU1hdGNoU3RyaW5nQXJnKTsKICAgIGxldCBmb3VuZE1hdGNoID0gZmFsc2U7CiAgICBmb3IgKGNvbnN0IHN0cmluZ0l0ZW0gb2YgdGhpcy5fc3RyaW5nQXJyYXkpIHsKICAgICAgaWYgKHNtYXJ0TWF0Y2hJbnN0YW5jZS5tYXRjaChzdHJpbmdJdGVtKSkgewogICAgICAgIGZvdW5kTWF0Y2ggPSB0cnVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZm91bmRNYXRjaDsKICB9CiAgLyoqCiAgICogY2hlY2tzIGlmIHRoZSBTdHJpbmdtYXAgaXMgZW1wdHkKICAgKi8KICBjaGVja0lzRW1wdHkoKSB7CiAgICByZXR1cm4gdGhpcy5fc3RyaW5nQXJyYXkubGVuZ3RoID09PSAwOwogIH0KICAvKioKICAgKiBnZXRzIGEgY2xvbmVkIGNvcHkgb2YgdGhlIGN1cnJlbnQgc3RyaW5nIEFycmF5CiAgICovCiAgZ2V0U3RyaW5nQXJyYXkoKSB7CiAgICBjb25zdCByZXR1cm5BcnJheSA9IFtdOwogICAgZm9yIChjb25zdCBzdHJpbmdJdGVtIG9mIHRoaXMuX3N0cmluZ0FycmF5KSB7CiAgICAgIHJldHVybkFycmF5LnB1c2goc3RyaW5nSXRlbSk7CiAgICB9CiAgICByZXR1cm4gcmV0dXJuQXJyYXk7CiAgfQogIC8vIHRyaWdnZXIgcmVnaXN0ZXJpbmcKICAvKioKICAgKiByZWdpc3RlciBhIG5ldyB0cmlnZ2VyCiAgICovCiAgcmVnaXN0ZXJVbnRpbFRydWUoZnVuY3Rpb25BcmcsIGNhbGxiYWNrQXJnKSB7CiAgICBjb25zdCB0cnVlRGVmZXJyZWQgPSBkaXN0X3RzX2V4cG9ydHMuZGVmZXIoKTsKICAgIHRoaXMuX3RyaWdnZXJVbnRpbFRydWVGdW5jdGlvbkFycmF5LnB1c2goKCkgPT4gewogICAgICBjb25zdCByZXN1bHQgPSBmdW5jdGlvbkFyZyh0aGlzLmdldFN0cmluZ0FycmF5KCkpOwogICAgICBpZiAocmVzdWx0ID09PSB0cnVlKSB7CiAgICAgICAgaWYgKGNhbGxiYWNrQXJnKSB7CiAgICAgICAgICBjYWxsYmFja0FyZygpOwogICAgICAgIH0KICAgICAgICB0cnVlRGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9KTsKICAgIHRoaXMubm90aWZ5VHJpZ2dlcigpOwogICAgcmV0dXJuIHRydWVEZWZlcnJlZC5wcm9taXNlOwogIH0KICAvKioKICAgKiBub3RpZmllcyB0cmlnZ2VycwogICAqLwogIG5vdGlmeVRyaWdnZXIoKSB7CiAgICBjb25zdCBmaWx0ZXJlZEFycmF5ID0gdGhpcy5fdHJpZ2dlclVudGlsVHJ1ZUZ1bmN0aW9uQXJyYXkuZmlsdGVyKChmdW5jdGlvbkFyZykgPT4gewogICAgICByZXR1cm4gIWZ1bmN0aW9uQXJnKCk7CiAgICB9KTsKICAgIHRoaXMuX3RyaWdnZXJVbnRpbFRydWVGdW5jdGlvbkFycmF5ID0gZmlsdGVyZWRBcnJheTsKICB9CiAgLyoqCiAgICogZGVzdHJveXMgdGhlIFN0cmluZ21hcCwgY2xlYXJpbmcgYWxsIHN0cmluZ3MgYW5kIHBlbmRpbmcgdHJpZ2dlcnMKICAgKi8KICBkZXN0cm95KCkgewogICAgdGhpcy5fc3RyaW5nQXJyYXkgPSBbXTsKICAgIHRoaXMuX3RyaWdnZXJVbnRpbFRydWVGdW5jdGlvbkFycmF5ID0gW107CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjQuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvY2xhc3Nlcy50aW1lZGFnZ3JlZ2F0b3IuanMKdmFyIFRpbWVkQWdncmVndG9yID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlRpbWVkQWdncmVndG9yIik7CiAgfQogIG9wdGlvbnM7CiAgc3RvcmFnZUFycmF5ID0gW107CiAgaXNTdG9wcGVkID0gZmFsc2U7CiAgY29uc3RydWN0b3Iob3B0aW9uc0FyZykgewogICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc0FyZzsKICB9CiAgYWdncmVnYXRpb25UaW1lcjsKICBjaGVja0FnZ3JlZ2F0aW9uU3RhdHVzKCkgewogICAgaWYgKHRoaXMuaXNTdG9wcGVkKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGFkZEFnZ3JlZ2F0aW9uVGltZXIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCgpID0+IHsKICAgICAgdGhpcy5hZ2dyZWdhdGlvblRpbWVyID0gbmV3IGRpc3RfdHNfZXhwb3J0czcuVGltZXIodGhpcy5vcHRpb25zLmFnZ3JlZ2F0aW9uSW50ZXJ2YWxJbk1pbGxpcyk7CiAgICAgIHRoaXMuYWdncmVnYXRpb25UaW1lci5jb21wbGV0ZWQudGhlbigoKSA9PiB7CiAgICAgICAgaWYgKHRoaXMuaXNTdG9wcGVkKSB7CiAgICAgICAgICB0aGlzLmFnZ3JlZ2F0aW9uVGltZXIgPSBudWxsOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBhZ2dyZWdhdGVGb3JQcm9jZXNzaW5nID0gdGhpcy5zdG9yYWdlQXJyYXk7CiAgICAgICAgaWYgKGFnZ3JlZ2F0ZUZvclByb2Nlc3NpbmcubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICB0aGlzLmFnZ3JlZ2F0aW9uVGltZXIgPSBudWxsOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLnN0b3JhZ2VBcnJheSA9IFtdOwogICAgICAgIGFkZEFnZ3JlZ2F0aW9uVGltZXIoKTsKICAgICAgICB0aGlzLm9wdGlvbnMuZnVuY3Rpb25Gb3JBZ2dyZWdhdGlvbihhZ2dyZWdhdGVGb3JQcm9jZXNzaW5nKTsKICAgICAgfSk7CiAgICAgIHRoaXMuYWdncmVnYXRpb25UaW1lci5zdGFydCgpOwogICAgfSwgImFkZEFnZ3JlZ2F0aW9uVGltZXIiKTsKICAgIGlmICghdGhpcy5hZ2dyZWdhdGlvblRpbWVyKSB7CiAgICAgIGFkZEFnZ3JlZ2F0aW9uVGltZXIoKTsKICAgIH0KICB9CiAgYWRkKGFnZ3JlZ2F0aW9uQXJnKSB7CiAgICBpZiAodGhpcy5pc1N0b3BwZWQpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5zdG9yYWdlQXJyYXkucHVzaChhZ2dyZWdhdGlvbkFyZyk7CiAgICB0aGlzLmNoZWNrQWdncmVnYXRpb25TdGF0dXMoKTsKICB9CiAgLyoqCiAgICogc3RvcHMgdGhlIGFnZ3JlZ2F0aW9uIHRpbWVyIGNoYWluCiAgICogQHBhcmFtIGZsdXNoUmVtYWluaW5nIGlmIHRydWUsIGNhbGxzIGZ1bmN0aW9uRm9yQWdncmVnYXRpb24gd2l0aCBhbnkgcmVtYWluaW5nIGl0ZW1zCiAgICovCiAgc3RvcChmbHVzaFJlbWFpbmluZyA9IGZhbHNlKSB7CiAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7CiAgICBpZiAodGhpcy5hZ2dyZWdhdGlvblRpbWVyKSB7CiAgICAgIHRoaXMuYWdncmVnYXRpb25UaW1lci5yZXNldCgpOwogICAgICB0aGlzLmFnZ3JlZ2F0aW9uVGltZXIgPSBudWxsOwogICAgfQogICAgaWYgKGZsdXNoUmVtYWluaW5nICYmIHRoaXMuc3RvcmFnZUFycmF5Lmxlbmd0aCA+IDApIHsKICAgICAgY29uc3QgcmVtYWluaW5nID0gdGhpcy5zdG9yYWdlQXJyYXk7CiAgICAgIHRoaXMuc3RvcmFnZUFycmF5ID0gW107CiAgICAgIHRoaXMub3B0aW9ucy5mdW5jdGlvbkZvckFnZ3JlZ2F0aW9uKHJlbWFpbmluZyk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLnN0b3JhZ2VBcnJheSA9IFtdOwogICAgfQogIH0KICByZXN0YXJ0KCkgewogICAgdGhpcy5pc1N0b3BwZWQgPSBmYWxzZTsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3MrbGlrQDYuNC4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9saWsvZGlzdF90cy9jbGFzc2VzLnRyZWUuanMKdmFyIFRyZWUgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiVHJlZSIpOwogIH0KICBzeW1ib2xUcmVlOwogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5zeW1ib2xUcmVlID0gbmV3IGltcG9ydF9zeW1ib2xfdHJlZS5kZWZhdWx0KCk7CiAgfQogIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIC8vIEZ1bmN0aW9ucyB0aGF0IG1hcCB0byB0aGUgZnVuY3Rpb25hbGl0eSBvZiBzeW1ib2wtdHJlZQogIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIC8qKgogICAqCiAgICogQHBhcmFtIG9iamVjdEFyZwogICAqLwogIGluaXRpYWxpemUob2JqZWN0QXJnKSB7CiAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLmluaXRpYWxpemUob2JqZWN0QXJnKTsKICB9CiAgaGFzQ2hpbGRyZW4ob2JqZWN0QXJnKSB7CiAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLmhhc0NoaWxkcmVuKG9iamVjdEFyZyk7CiAgfQogIGZpcnN0Q2hpbGQob2JqZWN0QXJnKSB7CiAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLmZpcnN0Q2hpbGQob2JqZWN0QXJnKTsKICB9CiAgbGFzdENoaWxkKG9iamVjdEFyZykgewogICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS5sYXN0Q2hpbGQob2JqZWN0QXJnKTsKICB9CiAgcHJldmlvdXNTaWJsaW5nKG9iamVjdEFyZykgewogICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS5wcmV2aW91c1NpYmxpbmcob2JqZWN0QXJnKTsKICB9CiAgbmV4dFNpYmxpbmcob2JqZWN0QXJnKSB7CiAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLm5leHRTaWJsaW5nKG9iamVjdEFyZyk7CiAgfQogIHBhcmVudChvYmplY3RBcmcpIHsKICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUucGFyZW50KG9iamVjdEFyZyk7CiAgfQogIGxhc3RJbmNsdXNpdmVEZXNjZW5kYW50KG9iamVjdEFyZykgewogICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS5sYXN0SW5jbHVzaXZlRGVzY2VuZGFudChvYmplY3RBcmcpOwogIH0KICBwcmVjZWRpbmcob2JqZWN0QXJnLCBvcHRpb25zQXJnKSB7CiAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLnByZWNlZGluZyhvYmplY3RBcmcsIG9wdGlvbnNBcmcpOwogIH0KICBmb2xsb3dpbmcob2JqZWN0LCBvcHRpb25zQXJnKSB7CiAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLmZvbGxvd2luZyhvYmplY3QsIG9wdGlvbnNBcmcpOwogIH0KICBjaGlsZHJlblRvQXJyYXkocGFyZW50QXJnLCBvcHRpb25zQXJnKSB7CiAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLmNoaWxkcmVuVG9BcnJheShwYXJlbnRBcmcsIG9wdGlvbnNBcmcpOwogIH0KICBhbmNlc3RvcnNUb0FycmF5KG9iamVjdEFyZywgb3B0aW9uc0FyZykgewogICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS5hbmNlc3RvcnNUb0FycmF5KG9iamVjdEFyZywgb3B0aW9uc0FyZyk7CiAgfQogIHRyZWVUb0FycmF5KHJvb3RBcmcsIG9wdGlvbnNBcmcpIHsKICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUudHJlZVRvQXJyYXkocm9vdEFyZywgb3B0aW9uc0FyZyk7CiAgfQogIGNoaWxkcmVuSXRlcmF0b3IocGFyZW50QXJnLCBvcHRpb25zQXJnKSB7CiAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLmNoaWxkcmVuSXRlcmF0b3IocGFyZW50QXJnLCBvcHRpb25zQXJnKTsKICB9CiAgcHJldmlvdXNTaWJsaW5nc0l0ZXJhdG9yKG9iamVjdEFyZykgewogICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS5wcmV2aW91c1NpYmxpbmdzSXRlcmF0b3Iob2JqZWN0QXJnKTsKICB9CiAgbmV4dFNpYmxpbmdzSXRlcmF0b3Iob2JqZWN0QXJnKSB7CiAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLm5leHRTaWJsaW5nc0l0ZXJhdG9yKG9iamVjdEFyZyk7CiAgfQogIGFuY2VzdG9yc0l0ZXJhdG9yKG9iamVjdEFyZykgewogICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS5hbmNlc3RvcnNJdGVyYXRvcihvYmplY3RBcmcpOwogIH0KICB0cmVlSXRlcmF0b3Iocm9vdEFyZywgb3B0aW9uc0FyZykgewogICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS50cmVlSXRlcmF0b3Iocm9vdEFyZywgb3B0aW9uc0FyZyk7CiAgfQogIGluZGV4KGNoaWxkQXJnKSB7CiAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLmluZGV4KGNoaWxkQXJnKTsKICB9CiAgY2hpbGRyZW5Db3VudChwYXJlbnRBcmcpIHsKICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUuY2hpbGRyZW5Db3VudChwYXJlbnRBcmcpOwogIH0KICBjb21wYXJlVHJlZVBvc2l0aW9uKGxlZnRBcmcsIHJpZ2h0QXJnKSB7CiAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLmNvbXBhcmVUcmVlUG9zaXRpb24obGVmdEFyZywgcmlnaHRBcmcpOwogIH0KICByZW1vdmUocmVtb3ZlT2JqZWN0QXJnKSB7CiAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLnJlbW92ZShyZW1vdmVPYmplY3RBcmcpOwogIH0KICBpbnNlcnRCZWZvcmUocmVmZXJlbmNlT2JqZWN0QXJnLCBuZXdPYmplY3RBcmcpIHsKICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUuaW5zZXJ0QmVmb3JlKHJlZmVyZW5jZU9iamVjdEFyZywgbmV3T2JqZWN0QXJnKTsKICB9CiAgaW5zZXJ0QWZ0ZXIocmVmZXJlbmNlT2JqZWN0LCBuZXdPYmplY3RBcmcpIHsKICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUuaW5zZXJ0QWZ0ZXIocmVmZXJlbmNlT2JqZWN0LCBuZXdPYmplY3RBcmcpOwogIH0KICBwcmVwZW5kQ2hpbGQocmVmZXJlbmNlT2JqZWN0QXJnLCBuZXdPYmplY3RBcmcpIHsKICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUucHJlcGVuZENoaWxkKHJlZmVyZW5jZU9iamVjdEFyZywgbmV3T2JqZWN0QXJnKTsKICB9CiAgYXBwZW5kQ2hpbGQocmVmZXJlbmNlT2JqZWN0QXJnLCBuZXdPYmplY3RBcmcpIHsKICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUuYXBwZW5kQ2hpbGQocmVmZXJlbmNlT2JqZWN0QXJnLCBuZXdPYmplY3RBcmcpOwogIH0KICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgLy8gRnVuY3Rpb25hbGl0eSB0aGF0IGV4dGVuZHMgc3ltYm9sLXRyZWUKICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgLyoqCiAgICogcmV0dXJucyBhIGJyYW5jaCBvZiB0aGUgdHJlZSBhcyBhIHJlY3Vyc2l2ZSBKU09OIHN0cnVjdHVyZQogICAqLwogIHRvSnNvbldpdGhIaWVyYWNoeShyb290RWxlbWVudCkgewogICAgY29uc3QgYnVpbGROb2RlID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoZWxlbWVudDQpID0+IHsKICAgICAgY29uc3QgY2hpbGRyZW4yID0gW107CiAgICAgIGlmICh0aGlzLmhhc0NoaWxkcmVuKGVsZW1lbnQ0KSkgewogICAgICAgIGNvbnN0IGNoaWxkcmVuQXJyYXkgPSB0aGlzLmNoaWxkcmVuVG9BcnJheShlbGVtZW50NCwge30pOwogICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW5BcnJheSkgewogICAgICAgICAgY2hpbGRyZW4yLnB1c2goYnVpbGROb2RlKGNoaWxkKSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB7IGRhdGE6IGVsZW1lbnQ0LCBjaGlsZHJlbjogY2hpbGRyZW4yIH07CiAgICB9LCAiYnVpbGROb2RlIik7CiAgICByZXR1cm4gYnVpbGROb2RlKHJvb3RFbGVtZW50KTsKICB9CiAgLyoqCiAgICogYnVpbGRzIGEgdHJlZSBmcm9tIGEgcmVjdXJzaXZlIEpTT04gc3RydWN0dXJlCiAgICogQHBhcmFtIGpzb25Sb290IHRoZSByb290IG5vZGUgaW4gSVRyZWVOb2RlIGZvcm1hdAogICAqIEBwYXJhbSByZXZpdmVyIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIHJlY29uc3RydWN0IFQgZnJvbSBzZXJpYWxpemVkIGRhdGEKICAgKi8KICBmcm9tSnNvbldpdGhIaWVyYWNoeShqc29uUm9vdCwgcmV2aXZlcjMpIHsKICAgIGNvbnN0IGJ1aWxkVHJlZSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKG5vZGUyLCBwYXJlbnRFbGVtZW50KSA9PiB7CiAgICAgIGNvbnN0IGVsZW1lbnQ0ID0gcmV2aXZlcjMgPyByZXZpdmVyMyhub2RlMi5kYXRhKSA6IG5vZGUyLmRhdGE7CiAgICAgIHRoaXMuaW5pdGlhbGl6ZShlbGVtZW50NCk7CiAgICAgIGlmIChwYXJlbnRFbGVtZW50KSB7CiAgICAgICAgdGhpcy5hcHBlbmRDaGlsZChwYXJlbnRFbGVtZW50LCBlbGVtZW50NCk7CiAgICAgIH0KICAgICAgZm9yIChjb25zdCBjaGlsZE5vZGUgb2Ygbm9kZTIuY2hpbGRyZW4pIHsKICAgICAgICBidWlsZFRyZWUoY2hpbGROb2RlLCBlbGVtZW50NCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGVsZW1lbnQ0OwogICAgfSwgImJ1aWxkVHJlZSIpOwogICAgcmV0dXJuIGJ1aWxkVHJlZShqc29uUm9vdCk7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0YnVmZmVyQDMuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGJ1ZmZlci9kaXN0X3RzL2luZGV4LmpzCnZhciBkaXN0X3RzX2V4cG9ydHM4ID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czgsIHsKICBiYXNlNjRUb1VpbnQ4QXJyYXk6ICgpID0+IGJhc2U2NFRvVWludDhBcnJheTIsCiAgZW5zdXJlUHVyZVVpbnQ4QXJyYXk6ICgpID0+IGVuc3VyZVB1cmVVaW50OEFycmF5LAogIGlzQnVmZmVyTGlrZTogKCkgPT4gaXNCdWZmZXJMaWtlLAogIGlzVWludDhBcnJheTogKCkgPT4gaXNVaW50OEFycmF5MiwKICB1SW50OEFycmF5RXh0cmFzOiAoKSA9PiB1SW50OEFycmF5RXh0cmFzLAogIHVJbnQ4QXJyYXlUb0Jhc2U2NDogKCkgPT4gdUludDhBcnJheVRvQmFzZTY0Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3VpbnQ4YXJyYXktZXh0cmFzQDEuNS4wL25vZGVfbW9kdWxlcy91aW50OGFycmF5LWV4dHJhcy9pbmRleC5qcwp2YXIgdWludDhhcnJheV9leHRyYXNfZXhwb3J0cyA9IHt9OwpfX2V4cG9ydCh1aW50OGFycmF5X2V4dHJhc19leHBvcnRzLCB7CiAgYXJlVWludDhBcnJheXNFcXVhbDogKCkgPT4gYXJlVWludDhBcnJheXNFcXVhbCwKICBhc3NlcnRVaW50OEFycmF5OiAoKSA9PiBhc3NlcnRVaW50OEFycmF5LAogIGFzc2VydFVpbnQ4QXJyYXlPckFycmF5QnVmZmVyOiAoKSA9PiBhc3NlcnRVaW50OEFycmF5T3JBcnJheUJ1ZmZlciwKICBiYXNlNjRUb1N0cmluZzogKCkgPT4gYmFzZTY0VG9TdHJpbmcsCiAgYmFzZTY0VG9VaW50OEFycmF5OiAoKSA9PiBiYXNlNjRUb1VpbnQ4QXJyYXksCiAgY29tcGFyZVVpbnQ4QXJyYXlzOiAoKSA9PiBjb21wYXJlVWludDhBcnJheXMsCiAgY29uY2F0VWludDhBcnJheXM6ICgpID0+IGNvbmNhdFVpbnQ4QXJyYXlzLAogIGdldFVpbnRCRTogKCkgPT4gZ2V0VWludEJFLAogIGhleFRvVWludDhBcnJheTogKCkgPT4gaGV4VG9VaW50OEFycmF5LAogIGluY2x1ZGVzOiAoKSA9PiBpbmNsdWRlcywKICBpbmRleE9mOiAoKSA9PiBpbmRleE9mLAogIGlzVWludDhBcnJheTogKCkgPT4gaXNVaW50OEFycmF5LAogIHN0cmluZ1RvQmFzZTY0OiAoKSA9PiBzdHJpbmdUb0Jhc2U2NCwKICBzdHJpbmdUb1VpbnQ4QXJyYXk6ICgpID0+IHN0cmluZ1RvVWludDhBcnJheSwKICB0b1VpbnQ4QXJyYXk6ICgpID0+IHRvVWludDhBcnJheSwKICB1aW50OEFycmF5VG9CYXNlNjQ6ICgpID0+IHVpbnQ4QXJyYXlUb0Jhc2U2NCwKICB1aW50OEFycmF5VG9IZXg6ICgpID0+IHVpbnQ4QXJyYXlUb0hleCwKICB1aW50OEFycmF5VG9TdHJpbmc6ICgpID0+IHVpbnQ4QXJyYXlUb1N0cmluZwp9KTsKdmFyIG9iamVjdFRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsKdmFyIHVpbnQ4QXJyYXlTdHJpbmdpZmllZCA9ICJbb2JqZWN0IFVpbnQ4QXJyYXldIjsKdmFyIGFycmF5QnVmZmVyU3RyaW5naWZpZWQgPSAiW29iamVjdCBBcnJheUJ1ZmZlcl0iOwpmdW5jdGlvbiBpc1R5cGUodmFsdWUyLCB0eXBlQ29uc3RydWN0b3IsIHR5cGVTdHJpbmdpZmllZCkgewogIGlmICghdmFsdWUyKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGlmICh2YWx1ZTIuY29uc3RydWN0b3IgPT09IHR5cGVDb25zdHJ1Y3RvcikgewogICAgcmV0dXJuIHRydWU7CiAgfQogIHJldHVybiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlMikgPT09IHR5cGVTdHJpbmdpZmllZDsKfQpfX25hbWUoaXNUeXBlLCAiaXNUeXBlIik7CmZ1bmN0aW9uIGlzVWludDhBcnJheSh2YWx1ZTIpIHsKICByZXR1cm4gaXNUeXBlKHZhbHVlMiwgVWludDhBcnJheSwgdWludDhBcnJheVN0cmluZ2lmaWVkKTsKfQpfX25hbWUoaXNVaW50OEFycmF5LCAiaXNVaW50OEFycmF5Iik7CmZ1bmN0aW9uIGlzQXJyYXlCdWZmZXIodmFsdWUyKSB7CiAgcmV0dXJuIGlzVHlwZSh2YWx1ZTIsIEFycmF5QnVmZmVyLCBhcnJheUJ1ZmZlclN0cmluZ2lmaWVkKTsKfQpfX25hbWUoaXNBcnJheUJ1ZmZlciwgImlzQXJyYXlCdWZmZXIiKTsKZnVuY3Rpb24gaXNVaW50OEFycmF5T3JBcnJheUJ1ZmZlcih2YWx1ZTIpIHsKICByZXR1cm4gaXNVaW50OEFycmF5KHZhbHVlMikgfHwgaXNBcnJheUJ1ZmZlcih2YWx1ZTIpOwp9Cl9fbmFtZShpc1VpbnQ4QXJyYXlPckFycmF5QnVmZmVyLCAiaXNVaW50OEFycmF5T3JBcnJheUJ1ZmZlciIpOwpmdW5jdGlvbiBhc3NlcnRVaW50OEFycmF5KHZhbHVlMikgewogIGlmICghaXNVaW50OEFycmF5KHZhbHVlMikpIHsKICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIFxgVWludDhBcnJheVxgLCBnb3QgXGAke3R5cGVvZiB2YWx1ZTJ9XGBgKTsKICB9Cn0KX19uYW1lKGFzc2VydFVpbnQ4QXJyYXksICJhc3NlcnRVaW50OEFycmF5Iik7CmZ1bmN0aW9uIGFzc2VydFVpbnQ4QXJyYXlPckFycmF5QnVmZmVyKHZhbHVlMikgewogIGlmICghaXNVaW50OEFycmF5T3JBcnJheUJ1ZmZlcih2YWx1ZTIpKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBcYFVpbnQ4QXJyYXlcYCBvciBcYEFycmF5QnVmZmVyXGAsIGdvdCBcYCR7dHlwZW9mIHZhbHVlMn1cYGApOwogIH0KfQpfX25hbWUoYXNzZXJ0VWludDhBcnJheU9yQXJyYXlCdWZmZXIsICJhc3NlcnRVaW50OEFycmF5T3JBcnJheUJ1ZmZlciIpOwpmdW5jdGlvbiB0b1VpbnQ4QXJyYXkodmFsdWUyKSB7CiAgaWYgKHZhbHVlMiBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7CiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkodmFsdWUyKTsKICB9CiAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyh2YWx1ZTIpKSB7CiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkodmFsdWUyLmJ1ZmZlciwgdmFsdWUyLmJ5dGVPZmZzZXQsIHZhbHVlMi5ieXRlTGVuZ3RoKTsKICB9CiAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVW5zdXBwb3J0ZWQgdmFsdWUsIGdvdCBcYCR7dHlwZW9mIHZhbHVlMn1cYC5gKTsKfQpfX25hbWUodG9VaW50OEFycmF5LCAidG9VaW50OEFycmF5Iik7CmZ1bmN0aW9uIGNvbmNhdFVpbnQ4QXJyYXlzKGFycmF5cywgdG90YWxMZW5ndGgpIHsKICBpZiAoYXJyYXlzLmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KDApOwogIH0KICB0b3RhbExlbmd0aCA/Pz0gYXJyYXlzLnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJlbnRWYWx1ZSkgPT4gYWNjdW11bGF0b3IgKyBjdXJyZW50VmFsdWUubGVuZ3RoLCAwKTsKICBjb25zdCByZXR1cm5WYWx1ZSA9IG5ldyBVaW50OEFycmF5KHRvdGFsTGVuZ3RoKTsKICBsZXQgb2Zmc2V0ID0gMDsKICBmb3IgKGNvbnN0IGFycmF5IG9mIGFycmF5cykgewogICAgYXNzZXJ0VWludDhBcnJheShhcnJheSk7CiAgICByZXR1cm5WYWx1ZS5zZXQoYXJyYXksIG9mZnNldCk7CiAgICBvZmZzZXQgKz0gYXJyYXkubGVuZ3RoOwogIH0KICByZXR1cm4gcmV0dXJuVmFsdWU7Cn0KX19uYW1lKGNvbmNhdFVpbnQ4QXJyYXlzLCAiY29uY2F0VWludDhBcnJheXMiKTsKZnVuY3Rpb24gYXJlVWludDhBcnJheXNFcXVhbChhNCwgYjQpIHsKICBhc3NlcnRVaW50OEFycmF5KGE0KTsKICBhc3NlcnRVaW50OEFycmF5KGI0KTsKICBpZiAoYTQgPT09IGI0KSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgaWYgKGE0Lmxlbmd0aCAhPT0gYjQubGVuZ3RoKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGZvciAobGV0IGluZGV4MiA9IDA7IGluZGV4MiA8IGE0Lmxlbmd0aDsgaW5kZXgyKyspIHsKICAgIGlmIChhNFtpbmRleDJdICE9PSBiNFtpbmRleDJdKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgcmV0dXJuIHRydWU7Cn0KX19uYW1lKGFyZVVpbnQ4QXJyYXlzRXF1YWwsICJhcmVVaW50OEFycmF5c0VxdWFsIik7CmZ1bmN0aW9uIGNvbXBhcmVVaW50OEFycmF5cyhhNCwgYjQpIHsKICBhc3NlcnRVaW50OEFycmF5KGE0KTsKICBhc3NlcnRVaW50OEFycmF5KGI0KTsKICBjb25zdCBsZW5ndGggPSBNYXRoLm1pbihhNC5sZW5ndGgsIGI0Lmxlbmd0aCk7CiAgZm9yIChsZXQgaW5kZXgyID0gMDsgaW5kZXgyIDwgbGVuZ3RoOyBpbmRleDIrKykgewogICAgY29uc3QgZGlmZiA9IGE0W2luZGV4Ml0gLSBiNFtpbmRleDJdOwogICAgaWYgKGRpZmYgIT09IDApIHsKICAgICAgcmV0dXJuIE1hdGguc2lnbihkaWZmKTsKICAgIH0KICB9CiAgcmV0dXJuIE1hdGguc2lnbihhNC5sZW5ndGggLSBiNC5sZW5ndGgpOwp9Cl9fbmFtZShjb21wYXJlVWludDhBcnJheXMsICJjb21wYXJlVWludDhBcnJheXMiKTsKdmFyIGNhY2hlZERlY29kZXJzID0gewogIHV0Zjg6IG5ldyBnbG9iYWxUaGlzLlRleHREZWNvZGVyKCJ1dGY4IikKfTsKZnVuY3Rpb24gdWludDhBcnJheVRvU3RyaW5nKGFycmF5LCBlbmNvZGluZyA9ICJ1dGY4IikgewogIGFzc2VydFVpbnQ4QXJyYXlPckFycmF5QnVmZmVyKGFycmF5KTsKICBjYWNoZWREZWNvZGVyc1tlbmNvZGluZ10gPz89IG5ldyBnbG9iYWxUaGlzLlRleHREZWNvZGVyKGVuY29kaW5nKTsKICByZXR1cm4gY2FjaGVkRGVjb2RlcnNbZW5jb2RpbmddLmRlY29kZShhcnJheSk7Cn0KX19uYW1lKHVpbnQ4QXJyYXlUb1N0cmluZywgInVpbnQ4QXJyYXlUb1N0cmluZyIpOwpmdW5jdGlvbiBhc3NlcnRTdHJpbmcodmFsdWUyKSB7CiAgaWYgKHR5cGVvZiB2YWx1ZTIgIT09ICJzdHJpbmciKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBcYHN0cmluZ1xgLCBnb3QgXGAke3R5cGVvZiB2YWx1ZTJ9XGBgKTsKICB9Cn0KX19uYW1lKGFzc2VydFN0cmluZywgImFzc2VydFN0cmluZyIpOwp2YXIgY2FjaGVkRW5jb2RlciA9IG5ldyBnbG9iYWxUaGlzLlRleHRFbmNvZGVyKCk7CmZ1bmN0aW9uIHN0cmluZ1RvVWludDhBcnJheShzdHJpbmczKSB7CiAgYXNzZXJ0U3RyaW5nKHN0cmluZzMpOwogIHJldHVybiBjYWNoZWRFbmNvZGVyLmVuY29kZShzdHJpbmczKTsKfQpfX25hbWUoc3RyaW5nVG9VaW50OEFycmF5LCAic3RyaW5nVG9VaW50OEFycmF5Iik7CmZ1bmN0aW9uIGJhc2U2NFRvQmFzZTY0VXJsKGJhc2U2NDIpIHsKICByZXR1cm4gYmFzZTY0Mi5yZXBsYWNlQWxsKCIrIiwgIi0iKS5yZXBsYWNlQWxsKCIvIiwgIl8iKS5yZXBsYWNlKC89KyQvLCAiIik7Cn0KX19uYW1lKGJhc2U2NFRvQmFzZTY0VXJsLCAiYmFzZTY0VG9CYXNlNjRVcmwiKTsKZnVuY3Rpb24gYmFzZTY0VXJsVG9CYXNlNjQoYmFzZTY0dXJsKSB7CiAgY29uc3QgYmFzZTY0MiA9IGJhc2U2NHVybC5yZXBsYWNlQWxsKCItIiwgIisiKS5yZXBsYWNlQWxsKCJfIiwgIi8iKTsKICBjb25zdCBwYWRkaW5nID0gKDQgLSBiYXNlNjQyLmxlbmd0aCAlIDQpICUgNDsKICByZXR1cm4gYmFzZTY0MiArICI9Ii5yZXBlYXQocGFkZGluZyk7Cn0KX19uYW1lKGJhc2U2NFVybFRvQmFzZTY0LCAiYmFzZTY0VXJsVG9CYXNlNjQiKTsKdmFyIE1BWF9CTE9DS19TSVpFID0gNjU1MzU7CmZ1bmN0aW9uIHVpbnQ4QXJyYXlUb0Jhc2U2NChhcnJheSwgeyB1cmxTYWZlID0gZmFsc2UgfSA9IHt9KSB7CiAgYXNzZXJ0VWludDhBcnJheShhcnJheSk7CiAgbGV0IGJhc2U2NDIgPSAiIjsKICBmb3IgKGxldCBpbmRleDIgPSAwOyBpbmRleDIgPCBhcnJheS5sZW5ndGg7IGluZGV4MiArPSBNQVhfQkxPQ0tfU0laRSkgewogICAgY29uc3QgY2h1bmsgPSBhcnJheS5zdWJhcnJheShpbmRleDIsIGluZGV4MiArIE1BWF9CTE9DS19TSVpFKTsKICAgIGJhc2U2NDIgKz0gZ2xvYmFsVGhpcy5idG9hKFN0cmluZy5mcm9tQ29kZVBvaW50LmFwcGx5KHZvaWQgMCwgY2h1bmspKTsKICB9CiAgcmV0dXJuIHVybFNhZmUgPyBiYXNlNjRUb0Jhc2U2NFVybChiYXNlNjQyKSA6IGJhc2U2NDI7Cn0KX19uYW1lKHVpbnQ4QXJyYXlUb0Jhc2U2NCwgInVpbnQ4QXJyYXlUb0Jhc2U2NCIpOwpmdW5jdGlvbiBiYXNlNjRUb1VpbnQ4QXJyYXkoYmFzZTY0U3RyaW5nKSB7CiAgYXNzZXJ0U3RyaW5nKGJhc2U2NFN0cmluZyk7CiAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShnbG9iYWxUaGlzLmF0b2IoYmFzZTY0VXJsVG9CYXNlNjQoYmFzZTY0U3RyaW5nKSksICh4MykgPT4geDMuY29kZVBvaW50QXQoMCkpOwp9Cl9fbmFtZShiYXNlNjRUb1VpbnQ4QXJyYXksICJiYXNlNjRUb1VpbnQ4QXJyYXkiKTsKZnVuY3Rpb24gc3RyaW5nVG9CYXNlNjQoc3RyaW5nMywgeyB1cmxTYWZlID0gZmFsc2UgfSA9IHt9KSB7CiAgYXNzZXJ0U3RyaW5nKHN0cmluZzMpOwogIHJldHVybiB1aW50OEFycmF5VG9CYXNlNjQoc3RyaW5nVG9VaW50OEFycmF5KHN0cmluZzMpLCB7IHVybFNhZmUgfSk7Cn0KX19uYW1lKHN0cmluZ1RvQmFzZTY0LCAic3RyaW5nVG9CYXNlNjQiKTsKZnVuY3Rpb24gYmFzZTY0VG9TdHJpbmcoYmFzZTY0U3RyaW5nKSB7CiAgYXNzZXJ0U3RyaW5nKGJhc2U2NFN0cmluZyk7CiAgcmV0dXJuIHVpbnQ4QXJyYXlUb1N0cmluZyhiYXNlNjRUb1VpbnQ4QXJyYXkoYmFzZTY0U3RyaW5nKSk7Cn0KX19uYW1lKGJhc2U2NFRvU3RyaW5nLCAiYmFzZTY0VG9TdHJpbmciKTsKdmFyIGJ5dGVUb0hleExvb2t1cFRhYmxlID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogMjU2IH0sIChfMywgaW5kZXgyKSA9PiBpbmRleDIudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICIwIikpOwpmdW5jdGlvbiB1aW50OEFycmF5VG9IZXgoYXJyYXkpIHsKICBhc3NlcnRVaW50OEFycmF5KGFycmF5KTsKICBsZXQgaGV4U3RyaW5nID0gIiI7CiAgZm9yIChsZXQgaW5kZXgyID0gMDsgaW5kZXgyIDwgYXJyYXkubGVuZ3RoOyBpbmRleDIrKykgewogICAgaGV4U3RyaW5nICs9IGJ5dGVUb0hleExvb2t1cFRhYmxlW2FycmF5W2luZGV4Ml1dOwogIH0KICByZXR1cm4gaGV4U3RyaW5nOwp9Cl9fbmFtZSh1aW50OEFycmF5VG9IZXgsICJ1aW50OEFycmF5VG9IZXgiKTsKdmFyIGhleFRvRGVjaW1hbExvb2t1cFRhYmxlID0gewogIDA6IDAsCiAgMTogMSwKICAyOiAyLAogIDM6IDMsCiAgNDogNCwKICA1OiA1LAogIDY6IDYsCiAgNzogNywKICA4OiA4LAogIDk6IDksCiAgYTogMTAsCiAgYjogMTEsCiAgYzogMTIsCiAgZDogMTMsCiAgZTogMTQsCiAgZjogMTUsCiAgQTogMTAsCiAgQjogMTEsCiAgQzogMTIsCiAgRDogMTMsCiAgRTogMTQsCiAgRjogMTUKfTsKZnVuY3Rpb24gaGV4VG9VaW50OEFycmF5KGhleFN0cmluZykgewogIGFzc2VydFN0cmluZyhoZXhTdHJpbmcpOwogIGlmIChoZXhTdHJpbmcubGVuZ3RoICUgMiAhPT0gMCkgewogICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIEhleCBzdHJpbmcgbGVuZ3RoLiIpOwogIH0KICBjb25zdCByZXN1bHRMZW5ndGggPSBoZXhTdHJpbmcubGVuZ3RoIC8gMjsKICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KHJlc3VsdExlbmd0aCk7CiAgZm9yIChsZXQgaW5kZXgyID0gMDsgaW5kZXgyIDwgcmVzdWx0TGVuZ3RoOyBpbmRleDIrKykgewogICAgY29uc3QgaGlnaE5pYmJsZSA9IGhleFRvRGVjaW1hbExvb2t1cFRhYmxlW2hleFN0cmluZ1tpbmRleDIgKiAyXV07CiAgICBjb25zdCBsb3dOaWJibGUgPSBoZXhUb0RlY2ltYWxMb29rdXBUYWJsZVtoZXhTdHJpbmdbaW5kZXgyICogMiArIDFdXTsKICAgIGlmIChoaWdoTmliYmxlID09PSB2b2lkIDAgfHwgbG93TmliYmxlID09PSB2b2lkIDApIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIEhleCBjaGFyYWN0ZXIgZW5jb3VudGVyZWQgYXQgcG9zaXRpb24gJHtpbmRleDIgKiAyfWApOwogICAgfQogICAgYnl0ZXNbaW5kZXgyXSA9IGhpZ2hOaWJibGUgPDwgNCB8IGxvd05pYmJsZTsKICB9CiAgcmV0dXJuIGJ5dGVzOwp9Cl9fbmFtZShoZXhUb1VpbnQ4QXJyYXksICJoZXhUb1VpbnQ4QXJyYXkiKTsKZnVuY3Rpb24gZ2V0VWludEJFKHZpZXcpIHsKICBjb25zdCB7IGJ5dGVMZW5ndGggfSA9IHZpZXc7CiAgaWYgKGJ5dGVMZW5ndGggPT09IDYpIHsKICAgIHJldHVybiB2aWV3LmdldFVpbnQxNigwKSAqIDIgKiogMzIgKyB2aWV3LmdldFVpbnQzMigyKTsKICB9CiAgaWYgKGJ5dGVMZW5ndGggPT09IDUpIHsKICAgIHJldHVybiB2aWV3LmdldFVpbnQ4KDApICogMiAqKiAzMiArIHZpZXcuZ2V0VWludDMyKDEpOwogIH0KICBpZiAoYnl0ZUxlbmd0aCA9PT0gNCkgewogICAgcmV0dXJuIHZpZXcuZ2V0VWludDMyKDApOwogIH0KICBpZiAoYnl0ZUxlbmd0aCA9PT0gMykgewogICAgcmV0dXJuIHZpZXcuZ2V0VWludDgoMCkgKiAyICoqIDE2ICsgdmlldy5nZXRVaW50MTYoMSk7CiAgfQogIGlmIChieXRlTGVuZ3RoID09PSAyKSB7CiAgICByZXR1cm4gdmlldy5nZXRVaW50MTYoMCk7CiAgfQogIGlmIChieXRlTGVuZ3RoID09PSAxKSB7CiAgICByZXR1cm4gdmlldy5nZXRVaW50OCgwKTsKICB9Cn0KX19uYW1lKGdldFVpbnRCRSwgImdldFVpbnRCRSIpOwpmdW5jdGlvbiBpbmRleE9mKGFycmF5LCB2YWx1ZTIpIHsKICBjb25zdCBhcnJheUxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKICBjb25zdCB2YWx1ZUxlbmd0aCA9IHZhbHVlMi5sZW5ndGg7CiAgaWYgKHZhbHVlTGVuZ3RoID09PSAwKSB7CiAgICByZXR1cm4gLTE7CiAgfQogIGlmICh2YWx1ZUxlbmd0aCA+IGFycmF5TGVuZ3RoKSB7CiAgICByZXR1cm4gLTE7CiAgfQogIGNvbnN0IHZhbGlkT2Zmc2V0TGVuZ3RoID0gYXJyYXlMZW5ndGggLSB2YWx1ZUxlbmd0aDsKICBmb3IgKGxldCBpbmRleDIgPSAwOyBpbmRleDIgPD0gdmFsaWRPZmZzZXRMZW5ndGg7IGluZGV4MisrKSB7CiAgICBsZXQgaXNNYXRjaDMgPSB0cnVlOwogICAgZm9yIChsZXQgaW5kZXgyMiA9IDA7IGluZGV4MjIgPCB2YWx1ZUxlbmd0aDsgaW5kZXgyMisrKSB7CiAgICAgIGlmIChhcnJheVtpbmRleDIgKyBpbmRleDIyXSAhPT0gdmFsdWUyW2luZGV4MjJdKSB7CiAgICAgICAgaXNNYXRjaDMgPSBmYWxzZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaWYgKGlzTWF0Y2gzKSB7CiAgICAgIHJldHVybiBpbmRleDI7CiAgICB9CiAgfQogIHJldHVybiAtMTsKfQpfX25hbWUoaW5kZXhPZiwgImluZGV4T2YiKTsKZnVuY3Rpb24gaW5jbHVkZXMoYXJyYXksIHZhbHVlMikgewogIHJldHVybiBpbmRleE9mKGFycmF5LCB2YWx1ZTIpICE9PSAtMTsKfQpfX25hbWUoaW5jbHVkZXMsICJpbmNsdWRlcyIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0YnVmZmVyQDMuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGJ1ZmZlci9kaXN0X3RzL2luZGV4LmpzCnZhciB1SW50OEFycmF5RXh0cmFzID0gdWludDhhcnJheV9leHRyYXNfZXhwb3J0czsKZnVuY3Rpb24gdUludDhBcnJheVRvQmFzZTY0KHVJbnQ4QXJyYXkpIHsKICByZXR1cm4gdWludDhhcnJheV9leHRyYXNfZXhwb3J0cy51aW50OEFycmF5VG9CYXNlNjQodUludDhBcnJheSk7Cn0KX19uYW1lKHVJbnQ4QXJyYXlUb0Jhc2U2NCwgInVJbnQ4QXJyYXlUb0Jhc2U2NCIpOwpmdW5jdGlvbiBiYXNlNjRUb1VpbnQ4QXJyYXkyKGJhc2U2NDIpIHsKICByZXR1cm4gdWludDhhcnJheV9leHRyYXNfZXhwb3J0cy5iYXNlNjRUb1VpbnQ4QXJyYXkoYmFzZTY0Mik7Cn0KX19uYW1lKGJhc2U2NFRvVWludDhBcnJheTIsICJiYXNlNjRUb1VpbnQ4QXJyYXkiKTsKdmFyIGlzVWludDhBcnJheTIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChvYmopID0+IHsKICByZXR1cm4gdWludDhhcnJheV9leHRyYXNfZXhwb3J0cy5pc1VpbnQ4QXJyYXkob2JqKTsKfSwgImlzVWludDhBcnJheSIpOwpmdW5jdGlvbiBpc0J1ZmZlckxpa2Uob2JqKSB7CiAgaWYgKG9iaiAmJiB0eXBlb2Ygb2JqLmJ5dGVMZW5ndGggPT09ICJudW1iZXIiKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgaWYgKHR5cGVvZiBCdWZmZXIgIT09ICJ1bmRlZmluZWQiICYmIEJ1ZmZlci5pc0J1ZmZlcikgewogICAgcmV0dXJuIEJ1ZmZlci5pc0J1ZmZlcihvYmopOwogIH0KICByZXR1cm4gZmFsc2U7Cn0KX19uYW1lKGlzQnVmZmVyTGlrZSwgImlzQnVmZmVyTGlrZSIpOwpmdW5jdGlvbiBlbnN1cmVQdXJlVWludDhBcnJheShidWZmZXJBcmcpIHsKICBjb25zdCB1aW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyQXJnLmxlbmd0aCk7CiAgdWludDhBcnJheS5zZXQoYnVmZmVyQXJnKTsKICByZXR1cm4gdWludDhBcnJheTsKfQpfX25hbWUoZW5zdXJlUHVyZVVpbnQ4QXJyYXksICJlbnN1cmVQdXJlVWludDhBcnJheSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0Z3VhcmRAMy4xLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0Z3VhcmQvZGlzdF90cy9pbmRleC5qcwp2YXIgZGlzdF90c19leHBvcnRzOSA9IHt9OwpfX2V4cG9ydChkaXN0X3RzX2V4cG9ydHM5LCB7CiAgR3VhcmQ6ICgpID0+IEd1YXJkLAogIEd1YXJkRXJyb3I6ICgpID0+IEd1YXJkRXJyb3IsCiAgR3VhcmRTZXQ6ICgpID0+IEd1YXJkU2V0LAogIHBhc3NHdWFyZHNPclJlamVjdDogKCkgPT4gcGFzc0d1YXJkc09yUmVqZWN0Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0Z3VhcmRAMy4xLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0Z3VhcmQvZGlzdF90cy9jbGFzc2VzLmd1YXJkLmpzCnZhciBHdWFyZCA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJHdWFyZCIpOwogIH0KICBjb25zdHJ1Y3RvcihndWFyZEZ1bmN0aW9uQXJnLCBvcHRpb25zQXJnKSB7CiAgICB0aGlzLmd1YXJkRnVuY3Rpb24gPSBndWFyZEZ1bmN0aW9uQXJnOwogICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc0FyZzsKICB9CiAgLyoqCiAgICogZXhlY3V0ZXMgdGhlIGd1YXJkIGFnYWluc3QgYSBkYXRhIGFyZ3VtZW50OwogICAqIEBwYXJhbSBkYXRhQXJnCiAgICovCiAgYXN5bmMgZXhlYyhkYXRhQXJnKSB7CiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmd1YXJkRnVuY3Rpb24oZGF0YUFyZyk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KICBhc3luYyBnZXRGYWlsZWRIaW50KGRhdGFBcmcpIHsKICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlYyhkYXRhQXJnKTsKICAgIGlmICghcmVzdWx0KSB7CiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZmFpbGVkSGludDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydGd1YXJkQDMuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGd1YXJkL2Rpc3RfdHMvY2xhc3Nlcy5ndWFyZGVycm9yLmpzCnZhciBHdWFyZEVycm9yID0gY2xhc3MgZXh0ZW5kcyBFcnJvciB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiR3VhcmRFcnJvciIpOwogIH0KICBjb25zdHJ1Y3RvcihtZXNzYWdlMikgewogICAgc3VwZXIobWVzc2FnZTIpOwogICAgdGhpcy5uYW1lID0gIkd1YXJkRXJyb3IiOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydGd1YXJkQDMuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGd1YXJkL2Rpc3RfdHMvY2xhc3Nlcy5ndWFyZHNldC5qcwp2YXIgR3VhcmRTZXQgPSBjbGFzcyBleHRlbmRzIEd1YXJkIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJHdWFyZFNldCIpOwogIH0KICBjb25zdHJ1Y3RvcihndWFyZEFycmF5ID0gW10pIHsKICAgIHN1cGVyKGFzeW5jIChkYXRhQXJnKSA9PiB7CiAgICAgIHJldHVybiB0aGlzLmFsbEd1YXJkc1Bhc3MoZGF0YUFyZyk7CiAgICB9KTsKICAgIHRoaXMuZ3VhcmRzID0gZ3VhcmRBcnJheTsKICB9CiAgLyoqCiAgICogZXhlY3V0ZXMgYWxsIGd1YXJkcyBpbiBhbGwgZ3VhcmRTZXRzIGFnYWluc3QgYSBkYXRhIGFyZ3VtZW50CiAgICogQHBhcmFtIGRhdGFBcmcKICAgKi8KICBhc3luYyBleGVjQWxsV2l0aERhdGEoZGF0YUFyZywgb3B0aW9uc0FyZyA9IHsKICAgIG1vZGU6ICJwYXJhbGxlbCIsCiAgICBzdG9wT25GYWlsOiBmYWxzZQogIH0pIHsKICAgIGNvbnN0IHJlc3VsdFByb21pc2VzID0gW107CiAgICBmb3IgKGNvbnN0IGd1YXJkIG9mIHRoaXMuZ3VhcmRzKSB7CiAgICAgIGNvbnN0IGd1YXJkUmVzdWx0UHJvbWlzZSA9IGd1YXJkLmV4ZWMoZGF0YUFyZyk7CiAgICAgIGlmIChvcHRpb25zQXJnLm1vZGUgPT09ICJzZXJpYWwiKSB7CiAgICAgICAgYXdhaXQgZ3VhcmRSZXN1bHRQcm9taXNlOwogICAgICB9CiAgICAgIHJlc3VsdFByb21pc2VzLnB1c2goZ3VhcmRSZXN1bHRQcm9taXNlKTsKICAgICAgaWYgKG9wdGlvbnNBcmcuc3RvcE9uRmFpbCkgewogICAgICAgIGlmICghYXdhaXQgZ3VhcmRSZXN1bHRQcm9taXNlKSB7CiAgICAgICAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwocmVzdWx0UHJvbWlzZXMpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKHJlc3VsdFByb21pc2VzKTsKICAgIHJldHVybiByZXN1bHRzOwogIH0KICAvKioKICAgKiBjaGVja3MgaWYgYWxsIGd1YXJkcyBwYXNzCiAgICogQHBhcmFtIGRhdGFBcmcKICAgKi8KICBhc3luYyBhbGxHdWFyZHNQYXNzKGRhdGFBcmcsIG9wdGlvbnNBcmcgPSB7CiAgICBtb2RlOiAicGFyYWxsZWwiLAogICAgc3RvcE9uRmFpbDogZmFsc2UKICB9KSB7CiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5leGVjQWxsV2l0aERhdGEoZGF0YUFyZywgb3B0aW9uc0FyZyk7CiAgICByZXR1cm4gcmVzdWx0cy5ldmVyeSgocmVzdWx0KSA9PiByZXN1bHQpOwogIH0KICAvKioKICAgKiBjaGVja3MgaWYgYW55IGd1YXJkIHBhc3NlcwogICAqIEBwYXJhbSBkYXRhQXJnCiAgICovCiAgYXN5bmMgYW55R3VhcmRzUGFzcyhkYXRhQXJnKSB7CiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5leGVjQWxsV2l0aERhdGEoZGF0YUFyZywgewogICAgICBtb2RlOiAicGFyYWxsZWwiLAogICAgICBzdG9wT25GYWlsOiBmYWxzZQogICAgfSk7CiAgICByZXR1cm4gcmVzdWx0cy5zb21lKChyZXN1bHQpID0+IHJlc3VsdCk7CiAgfQogIC8qKgogICAqIHJldHVybnMgdGhlIGZpcnN0IHJlYXNvbiBmb3Igd2h5IHNvbWV0aGluZyBmYWlscwogICAqIEBwYXJhbSBkYXRhQXJnCiAgICogQHJldHVybnMKICAgKi8KICBnZXRGYWlsZWRIaW50KGRhdGFBcmcpIHsKICAgIGZvciAoY29uc3QgZ3VhcmQgb2YgdGhpcy5ndWFyZHMpIHsKICAgICAgY29uc3QgZmFpbGVkSGludCA9IGd1YXJkLmdldEZhaWxlZEhpbnQoZGF0YUFyZyk7CiAgICAgIGlmIChmYWlsZWRIaW50KSB7CiAgICAgICAgcmV0dXJuIGZhaWxlZEhpbnQ7CiAgICAgIH0KICAgIH0KICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRndWFyZEAzLjEuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRndWFyZC9kaXN0X3RzL2luZGV4LmpzCnZhciBwYXNzR3VhcmRzT3JSZWplY3QgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGFzeW5jIChkYXRhQXJnLCBndWFyZHMpID0+IHsKICBjb25zdCBndWFyZFNldCA9IG5ldyBHdWFyZFNldChndWFyZHMpOwogIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGd1YXJkU2V0LmFsbEd1YXJkc1Bhc3MoZGF0YUFyZyk7CiAgaWYgKCFyZXN1bHQpIHsKICAgIGNvbnN0IGZhaWxlZEhpbnQgPSBhd2FpdCBndWFyZFNldC5nZXRGYWlsZWRIaW50KGRhdGFBcmcpOwogICAgdGhyb3cgbmV3IEd1YXJkRXJyb3IoYEd1YXJkcyBmYWlsZWQ6CiR7ZmFpbGVkSGludH0KICAgIGApOwogIH0KICByZXR1cm47Cn0sICJwYXNzR3VhcmRzT3JSZWplY3QiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJyZXF1ZXN0QDQuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJyZXF1ZXN0L2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czE0ID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czE0LCB7CiAgQ2FjaGVNYW5hZ2VyOiAoKSA9PiBDYWNoZU1hbmFnZXIsCiAgQ2FjaGVTdG9yZTogKCkgPT4gQ2FjaGVTdG9yZSwKICBJbnRlcmNlcHRvck1hbmFnZXI6ICgpID0+IEludGVyY2VwdG9yTWFuYWdlciwKICBSZXF1ZXN0RGVkdXBsaWNhdG9yOiAoKSA9PiBSZXF1ZXN0RGVkdXBsaWNhdG9yLAogIFJldHJ5TWFuYWdlcjogKCkgPT4gUmV0cnlNYW5hZ2VyLAogIFdlYnJlcXVlc3RDbGllbnQ6ICgpID0+IFdlYnJlcXVlc3RDbGllbnQsCiAgY3JlYXRlQ29uZGl0aW9uYWxIZWFkZXJzOiAoKSA9PiBjcmVhdGVDb25kaXRpb25hbEhlYWRlcnMsCiAgZXh0cmFjdENhY2hlTWV0YWRhdGE6ICgpID0+IGV4dHJhY3RDYWNoZU1ldGFkYXRhLAogIGhlYWRlcnNUb09iamVjdDogKCkgPT4gaGVhZGVyc1RvT2JqZWN0LAogIGlzRnJlc2g6ICgpID0+IGlzRnJlc2gsCiAgb2JqZWN0VG9IZWFkZXJzOiAoKSA9PiBvYmplY3RUb0hlYWRlcnMsCiAgcmVxdWlyZXNSZXZhbGlkYXRpb246ICgpID0+IHJlcXVpcmVzUmV2YWxpZGF0aW9uLAogIHdlYnJlcXVlc3Q6ICgpID0+IHdlYnJlcXVlc3QKfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrd2VicmVxdWVzdEA0LjAuNS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2VicmVxdWVzdC9kaXN0X3RzL2ludGVyY2VwdG9ycy9pbnRlcmNlcHRvci5tYW5hZ2VyLmpzCnZhciBJbnRlcmNlcHRvck1hbmFnZXIgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiSW50ZXJjZXB0b3JNYW5hZ2VyIik7CiAgfQogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5yZXF1ZXN0SW50ZXJjZXB0b3JzID0gW107CiAgICB0aGlzLnJlc3BvbnNlSW50ZXJjZXB0b3JzID0gW107CiAgICB0aGlzLmVycm9ySW50ZXJjZXB0b3JzID0gW107CiAgfQogIC8qKgogICAqIEFkZCBhIHJlcXVlc3QgaW50ZXJjZXB0b3IKICAgKi8KICBhZGRSZXF1ZXN0SW50ZXJjZXB0b3IoaW50ZXJjZXB0b3IpIHsKICAgIHRoaXMucmVxdWVzdEludGVyY2VwdG9ycy5wdXNoKGludGVyY2VwdG9yKTsKICB9CiAgLyoqCiAgICogQWRkIGEgcmVzcG9uc2UgaW50ZXJjZXB0b3IKICAgKi8KICBhZGRSZXNwb25zZUludGVyY2VwdG9yKGludGVyY2VwdG9yKSB7CiAgICB0aGlzLnJlc3BvbnNlSW50ZXJjZXB0b3JzLnB1c2goaW50ZXJjZXB0b3IpOwogIH0KICAvKioKICAgKiBBZGQgYW4gZXJyb3IgaW50ZXJjZXB0b3IKICAgKi8KICBhZGRFcnJvckludGVyY2VwdG9yKGludGVyY2VwdG9yKSB7CiAgICB0aGlzLmVycm9ySW50ZXJjZXB0b3JzLnB1c2goaW50ZXJjZXB0b3IpOwogIH0KICAvKioKICAgKiBSZW1vdmUgYSByZXF1ZXN0IGludGVyY2VwdG9yCiAgICovCiAgcmVtb3ZlUmVxdWVzdEludGVyY2VwdG9yKGludGVyY2VwdG9yKSB7CiAgICBjb25zdCBpbmRleDIgPSB0aGlzLnJlcXVlc3RJbnRlcmNlcHRvcnMuaW5kZXhPZihpbnRlcmNlcHRvcik7CiAgICBpZiAoaW5kZXgyID4gLTEpIHsKICAgICAgdGhpcy5yZXF1ZXN0SW50ZXJjZXB0b3JzLnNwbGljZShpbmRleDIsIDEpOwogICAgfQogIH0KICAvKioKICAgKiBSZW1vdmUgYSByZXNwb25zZSBpbnRlcmNlcHRvcgogICAqLwogIHJlbW92ZVJlc3BvbnNlSW50ZXJjZXB0b3IoaW50ZXJjZXB0b3IpIHsKICAgIGNvbnN0IGluZGV4MiA9IHRoaXMucmVzcG9uc2VJbnRlcmNlcHRvcnMuaW5kZXhPZihpbnRlcmNlcHRvcik7CiAgICBpZiAoaW5kZXgyID4gLTEpIHsKICAgICAgdGhpcy5yZXNwb25zZUludGVyY2VwdG9ycy5zcGxpY2UoaW5kZXgyLCAxKTsKICAgIH0KICB9CiAgLyoqCiAgICogUmVtb3ZlIGFuIGVycm9yIGludGVyY2VwdG9yCiAgICovCiAgcmVtb3ZlRXJyb3JJbnRlcmNlcHRvcihpbnRlcmNlcHRvcikgewogICAgY29uc3QgaW5kZXgyID0gdGhpcy5lcnJvckludGVyY2VwdG9ycy5pbmRleE9mKGludGVyY2VwdG9yKTsKICAgIGlmIChpbmRleDIgPiAtMSkgewogICAgICB0aGlzLmVycm9ySW50ZXJjZXB0b3JzLnNwbGljZShpbmRleDIsIDEpOwogICAgfQogIH0KICAvKioKICAgKiBDbGVhciBhbGwgaW50ZXJjZXB0b3JzCiAgICovCiAgY2xlYXJBbGwoKSB7CiAgICB0aGlzLnJlcXVlc3RJbnRlcmNlcHRvcnMgPSBbXTsKICAgIHRoaXMucmVzcG9uc2VJbnRlcmNlcHRvcnMgPSBbXTsKICAgIHRoaXMuZXJyb3JJbnRlcmNlcHRvcnMgPSBbXTsKICB9CiAgLyoqCiAgICogUHJvY2VzcyByZXF1ZXN0IHRocm91Z2ggYWxsIHJlcXVlc3QgaW50ZXJjZXB0b3JzCiAgICovCiAgYXN5bmMgcHJvY2Vzc1JlcXVlc3QocmVxdWVzdCkgewogICAgbGV0IHByb2Nlc3NlZFJlcXVlc3QgPSByZXF1ZXN0OwogICAgZm9yIChjb25zdCBpbnRlcmNlcHRvciBvZiB0aGlzLnJlcXVlc3RJbnRlcmNlcHRvcnMpIHsKICAgICAgdHJ5IHsKICAgICAgICBwcm9jZXNzZWRSZXF1ZXN0ID0gYXdhaXQgaW50ZXJjZXB0b3IocHJvY2Vzc2VkUmVxdWVzdCk7CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgdGhyb3cgYXdhaXQgdGhpcy5wcm9jZXNzRXJyb3IoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHByb2Nlc3NlZFJlcXVlc3Q7CiAgfQogIC8qKgogICAqIFByb2Nlc3MgcmVzcG9uc2UgdGhyb3VnaCBhbGwgcmVzcG9uc2UgaW50ZXJjZXB0b3JzCiAgICovCiAgYXN5bmMgcHJvY2Vzc1Jlc3BvbnNlKHJlc3BvbnNlKSB7CiAgICBsZXQgcHJvY2Vzc2VkUmVzcG9uc2UgPSByZXNwb25zZTsKICAgIGZvciAoY29uc3QgaW50ZXJjZXB0b3Igb2YgdGhpcy5yZXNwb25zZUludGVyY2VwdG9ycykgewogICAgICB0cnkgewogICAgICAgIHByb2Nlc3NlZFJlc3BvbnNlID0gYXdhaXQgaW50ZXJjZXB0b3IocHJvY2Vzc2VkUmVzcG9uc2UpOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIHRocm93IGF3YWl0IHRoaXMucHJvY2Vzc0Vycm9yKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBwcm9jZXNzZWRSZXNwb25zZTsKICB9CiAgLyoqCiAgICogUHJvY2VzcyBlcnJvciB0aHJvdWdoIGFsbCBlcnJvciBpbnRlcmNlcHRvcnMKICAgKi8KICBhc3luYyBwcm9jZXNzRXJyb3IoZXJyb3IpIHsKICAgIGxldCBwcm9jZXNzZWRFcnJvciA9IGVycm9yOwogICAgZm9yIChjb25zdCBpbnRlcmNlcHRvciBvZiB0aGlzLmVycm9ySW50ZXJjZXB0b3JzKSB7CiAgICAgIHRyeSB7CiAgICAgICAgcHJvY2Vzc2VkRXJyb3IgPSBhd2FpdCBpbnRlcmNlcHRvcihwcm9jZXNzZWRFcnJvcik7CiAgICAgIH0gY2F0Y2ggKG5ld0Vycm9yKSB7CiAgICAgICAgcHJvY2Vzc2VkRXJyb3IgPSBuZXdFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gbmV3RXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKG5ld0Vycm9yKSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBwcm9jZXNzZWRFcnJvcjsKICB9CiAgLyoqCiAgICogR2V0IGNvdW50IG9mIHJlZ2lzdGVyZWQgaW50ZXJjZXB0b3JzCiAgICovCiAgZ2V0SW50ZXJjZXB0b3JDb3VudHMoKSB7CiAgICByZXR1cm4gewogICAgICByZXF1ZXN0OiB0aGlzLnJlcXVlc3RJbnRlcmNlcHRvcnMubGVuZ3RoLAogICAgICByZXNwb25zZTogdGhpcy5yZXNwb25zZUludGVyY2VwdG9ycy5sZW5ndGgsCiAgICAgIGVycm9yOiB0aGlzLmVycm9ySW50ZXJjZXB0b3JzLmxlbmd0aAogICAgfTsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRlbnZANi4wLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0ZW52L2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czEwID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czEwLCB7CiAgU21hcnRlbnY6ICgpID0+IFNtYXJ0ZW52Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0ZW52QDYuMC4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGVudi9kaXN0X3RzL3NtYXJ0ZW52LmNsYXNzZXMuc21hcnRlbnYuanMKdmFyIFNtYXJ0ZW52ID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlNtYXJ0ZW52Iik7CiAgfQogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5sb2FkZWRTY3JpcHRzID0gW107CiAgfQogIGFzeW5jIGdldEVudkF3YXJlTW9kdWxlKG9wdGlvbnNBcmcpIHsKICAgIGlmICh0aGlzLmlzTm9kZSkgewogICAgICBjb25zdCBtb2R1bGVSZXN1bHQgPSBhd2FpdCB0aGlzLmdldFNhZmVOb2RlTW9kdWxlKG9wdGlvbnNBcmcubm9kZU1vZHVsZU5hbWUpOwogICAgICByZXR1cm4gbW9kdWxlUmVzdWx0OwogICAgfSBlbHNlIGlmICh0aGlzLmlzQnJvd3NlcikgewogICAgICBjb25zdCBtb2R1bGVSZXN1bHQgPSBhd2FpdCB0aGlzLmdldFNhZmVXZWJNb2R1bGUob3B0aW9uc0FyZy53ZWJVcmxBcmcsIG9wdGlvbnNBcmcuZ2V0RnVuY3Rpb24pOwogICAgICByZXR1cm4gbW9kdWxlUmVzdWx0OwogICAgfSBlbHNlIHsKICAgICAgY29uc29sZS5lcnJvcigicGxhdGZvcm0gZm9yIGxvYWRpbmcgbm90IHN1cHBvcnRlZCBieSBzbWFydGVudiIpOwogICAgfQogIH0KICBhc3luYyBnZXRTYWZlTm9kZU1vZHVsZShtb2R1bGVOYW1lQXJnLCBydW5BZnRlckZ1bmMpIHsKICAgIGlmICghdGhpcy5pc05vZGUgJiYgIXRoaXMuaXNEZW5vICYmICF0aGlzLmlzQnVuKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoYFlvdSB0cmllZCB0byBsb2FkIGEgc2VydmVyIG1vZHVsZSBpbiBhIHdyb25nIGNvbnRleHQ6ICR7bW9kdWxlTmFtZUFyZ30uIFRoaXMgZG9lcyBub3QgdGhyb3cuYCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHJldHVyblZhbHVlID0gYXdhaXQgbmV3IEZ1bmN0aW9uKGByZXR1cm4gaW1wb3J0KCcke21vZHVsZU5hbWVBcmd9JylgKSgpOwogICAgaWYgKHJ1bkFmdGVyRnVuYykgewogICAgICBhd2FpdCBydW5BZnRlckZ1bmMocmV0dXJuVmFsdWUpOwogICAgfQogICAgcmV0dXJuIHJldHVyblZhbHVlOwogIH0KICBhc3luYyBnZXRTYWZlV2ViTW9kdWxlKHVybEFyZywgZ2V0RnVuY3Rpb25BcmcpIHsKICAgIGlmICghdGhpcy5pc0Jyb3dzZXIpIHsKICAgICAgY29uc29sZS5lcnJvcigiWW91IHRyaWVkIHRvIGxvYWQgYSB3ZWIgbW9kdWxlIGluIGEgd3JvbmcgY29udGV4dCIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodGhpcy5sb2FkZWRTY3JpcHRzLmluY2x1ZGVzKHVybEFyZykpIHsKICAgICAgcmV0dXJuIGdldEZ1bmN0aW9uQXJnKCk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmxvYWRlZFNjcmlwdHMucHVzaCh1cmxBcmcpOwogICAgfQogICAgY29uc3QgZG9uZSA9IGRpc3RfdHNfZXhwb3J0cy5kZWZlcigpOwogICAgaWYgKGdsb2JhbFRoaXMuaW1wb3J0U2NyaXB0cykgewogICAgICBnbG9iYWxUaGlzLmltcG9ydFNjcmlwdHModXJsQXJnKTsKICAgICAgZG9uZS5yZXNvbHZlKCk7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsKICAgICAgc2NyaXB0Lm9ubG9hZCA9ICgpID0+IHsKICAgICAgICBkb25lLnJlc29sdmUoKTsKICAgICAgfTsKICAgICAgc2NyaXB0LnNyYyA9IHVybEFyZzsKICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpOwogICAgfQogICAgYXdhaXQgZG9uZS5wcm9taXNlOwogICAgcmV0dXJuIGdldEZ1bmN0aW9uQXJnKCk7CiAgfQogIGdldCBydW50aW1lRW52KCkgewogICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzLkRlbm8gIT09ICJ1bmRlZmluZWQiICYmIHR5cGVvZiBnbG9iYWxUaGlzLkRlbm8/LnZlcnNpb24gIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgIHJldHVybiAiZGVubyI7CiAgICB9CiAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMuQnVuICE9PSAidW5kZWZpbmVkIiAmJiB0eXBlb2YgZ2xvYmFsVGhpcy5CdW4/LnZlcnNpb24gIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgIHJldHVybiAiYnVuIjsKICAgIH0KICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcy5wcm9jZXNzICE9PSAidW5kZWZpbmVkIiAmJiB0eXBlb2YgZ2xvYmFsVGhpcy5wcm9jZXNzPy52ZXJzaW9ucz8ubm9kZSAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgcmV0dXJuICJub2RlIjsKICAgIH0KICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcy53aW5kb3cgIT09ICJ1bmRlZmluZWQiICYmIHR5cGVvZiBnbG9iYWxUaGlzLmRvY3VtZW50ICE9PSAidW5kZWZpbmVkIikgewogICAgICByZXR1cm4gImJyb3dzZXIiOwogICAgfQogICAgcmV0dXJuICJicm93c2VyIjsKICB9CiAgZ2V0IGlzQnJvd3NlcigpIHsKICAgIHJldHVybiB0aGlzLnJ1bnRpbWVFbnYgPT09ICJicm93c2VyIjsKICB9CiAgZ2V0IGlzTm9kZSgpIHsKICAgIHJldHVybiB0aGlzLnJ1bnRpbWVFbnYgPT09ICJub2RlIjsKICB9CiAgZ2V0IGlzRGVubygpIHsKICAgIHJldHVybiB0aGlzLnJ1bnRpbWVFbnYgPT09ICJkZW5vIjsKICB9CiAgZ2V0IGlzQnVuKCkgewogICAgcmV0dXJuIHRoaXMucnVudGltZUVudiA9PT0gImJ1biI7CiAgfQogIGdldCB1c2VyQWdlbnQoKSB7CiAgICBpZiAodGhpcy5pc0Jyb3dzZXIpIHsKICAgICAgcmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQ7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gInVuZGVmaW5lZCI7CiAgICB9CiAgfQogIGdldCBub2RlVmVyc2lvbigpIHsKICAgIGlmICh0aGlzLmlzTm9kZSkgewogICAgICByZXR1cm4gcHJvY2Vzcy52ZXJzaW9uOwogICAgfQogICAgcmV0dXJuICJ1bmRlZmluZWQiOwogIH0KICBnZXQgZGVub1ZlcnNpb24oKSB7CiAgICBpZiAodGhpcy5pc0Rlbm8pIHsKICAgICAgcmV0dXJuIGdsb2JhbFRoaXMuRGVuby52ZXJzaW9uLmRlbm87CiAgICB9CiAgICByZXR1cm4gInVuZGVmaW5lZCI7CiAgfQogIGdldCBidW5WZXJzaW9uKCkgewogICAgaWYgKHRoaXMuaXNCdW4pIHsKICAgICAgcmV0dXJuIGdsb2JhbFRoaXMuQnVuLnZlcnNpb247CiAgICB9CiAgICByZXR1cm4gInVuZGVmaW5lZCI7CiAgfQogIC8qKgogICAqIExvYWQgYSBtb2R1bGUgb25seSBpZiB0aGUgY3VycmVudCBydW50aW1lIG1hdGNoZXMgdGhlIHRhcmdldCBydW50aW1lKHMpCiAgICogQHBhcmFtIHRhcmdldCAtIFNpbmdsZSBydW50aW1lLCBhcnJheSBvZiBydW50aW1lcywgb3IgJ3NlcnZlcicgZm9yIGFsbCBzZXJ2ZXItc2lkZSBydW50aW1lcwogICAqIEBwYXJhbSBtb2R1bGVOYW1lT3JVcmwgLSBNb2R1bGUgbmFtZSAoZm9yIE5vZGUvRGVuby9CdW4pIG9yIFVSTCAoZm9yIGJyb3dzZXIpCiAgICogQHBhcmFtIGdldEZ1bmN0aW9uIC0gT3B0aW9uYWwgZnVuY3Rpb24gdG8gcmV0cmlldmUgdGhlIG1vZHVsZSBpbiBicm93c2VyIGNvbnRleHQKICAgKiBAcmV0dXJucyBUaGUgbG9hZGVkIG1vZHVsZSBvciB1bmRlZmluZWQgaWYgcnVudGltZSBkb2Vzbid0IG1hdGNoCiAgICovCiAgYXN5bmMgZ2V0U2FmZU1vZHVsZUZvcih0YXJnZXQsIG1vZHVsZU5hbWVPclVybCwgZ2V0RnVuY3Rpb24pIHsKICAgIGxldCB0YXJnZXRSdW50aW1lczsKICAgIGlmIChBcnJheS5pc0FycmF5KHRhcmdldCkpIHsKICAgICAgdGFyZ2V0UnVudGltZXMgPSB0YXJnZXQuZmxhdE1hcCgodDgpID0+IHQ4ID09PSAic2VydmVyIiA/IFsibm9kZSIsICJkZW5vIiwgImJ1biJdIDogW3Q4XSk7CiAgICB9IGVsc2UgaWYgKHRhcmdldCA9PT0gInNlcnZlciIpIHsKICAgICAgdGFyZ2V0UnVudGltZXMgPSBbIm5vZGUiLCAiZGVubyIsICJidW4iXTsKICAgIH0gZWxzZSB7CiAgICAgIHRhcmdldFJ1bnRpbWVzID0gW3RhcmdldF07CiAgICB9CiAgICBpZiAoIXRhcmdldFJ1bnRpbWVzLmluY2x1ZGVzKHRoaXMucnVudGltZUVudikpIHsKICAgICAgY29uc29sZS53YXJuKGBNb2R1bGUgIiR7bW9kdWxlTmFtZU9yVXJsfSIgcmVxdWVzdGVkIGZvciBydW50aW1lKHMpIFske3RhcmdldFJ1bnRpbWVzLmpvaW4oIiwgIil9XSBidXQgY3VycmVudCBydW50aW1lIGlzICIke3RoaXMucnVudGltZUVudn0iLiBTa2lwcGluZyBsb2FkLmApOwogICAgICByZXR1cm4gdm9pZCAwOwogICAgfQogICAgaWYgKHRoaXMuaXNOb2RlIHx8IHRoaXMuaXNEZW5vIHx8IHRoaXMuaXNCdW4pIHsKICAgICAgY29uc3QgbW9kdWxlUmVzdWx0ID0gYXdhaXQgdGhpcy5nZXRTYWZlTm9kZU1vZHVsZShtb2R1bGVOYW1lT3JVcmwpOwogICAgICByZXR1cm4gbW9kdWxlUmVzdWx0OwogICAgfSBlbHNlIGlmICh0aGlzLmlzQnJvd3NlcikgewogICAgICBpZiAoIWdldEZ1bmN0aW9uKSB7CiAgICAgICAgY29uc29sZS5lcnJvcihgQnJvd3NlciBtb2R1bGUgbG9hZCByZXF1aXJlcyBnZXRGdW5jdGlvbiBwYXJhbWV0ZXIgZm9yICIke21vZHVsZU5hbWVPclVybH0iYCk7CiAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgfQogICAgICBjb25zdCBtb2R1bGVSZXN1bHQgPSBhd2FpdCB0aGlzLmdldFNhZmVXZWJNb2R1bGUobW9kdWxlTmFtZU9yVXJsLCBnZXRGdW5jdGlvbik7CiAgICAgIHJldHVybiBtb2R1bGVSZXN1bHQ7CiAgICB9CiAgICByZXR1cm4gdm9pZCAwOwogIH0KICBnZXQgaXNDSSgpIHsKICAgIGlmICh0aGlzLmlzTm9kZSkgewogICAgICBpZiAocHJvY2Vzcy5lbnYuQ0kpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgYXN5bmMgaXNNYWNBc3luYygpIHsKICAgIGlmICh0aGlzLmlzTm9kZSkgewogICAgICBjb25zdCBvcyA9IGF3YWl0IHRoaXMuZ2V0U2FmZU5vZGVNb2R1bGUoIm9zIik7CiAgICAgIHJldHVybiBvcy5wbGF0Zm9ybSgpID09PSAiZGFyd2luIjsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgYXN5bmMgaXNXaW5kb3dzQXN5bmMoKSB7CiAgICBpZiAodGhpcy5pc05vZGUpIHsKICAgICAgY29uc3Qgb3MgPSBhd2FpdCB0aGlzLmdldFNhZmVOb2RlTW9kdWxlKCJvcyIpOwogICAgICByZXR1cm4gb3MucGxhdGZvcm0oKSA9PT0gIndpbjMyIjsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgYXN5bmMgaXNMaW51eEFzeW5jKCkgewogICAgaWYgKHRoaXMuaXNOb2RlKSB7CiAgICAgIGNvbnN0IG9zID0gYXdhaXQgdGhpcy5nZXRTYWZlTm9kZU1vZHVsZSgib3MiKTsKICAgICAgcmV0dXJuIG9zLnBsYXRmb3JtKCkgPT09ICJsaW51eCI7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQogIC8qKgogICAqIHByaW50cyB0aGUgZW52aXJvbm1lbnQgdG8gY29uc29sZQogICAqLwogIGFzeW5jIHByaW50RW52KCkgewogICAgaWYgKHRoaXMuaXNOb2RlKSB7CiAgICAgIGNvbnNvbGUubG9nKCJydW5uaW5nIG9uIE5PREUiKTsKICAgICAgY29uc29sZS5sb2coIm5vZGUgdmVyc2lvbiBpcyAiICsgdGhpcy5ub2RlVmVyc2lvbik7CiAgICB9IGVsc2UgaWYgKHRoaXMuaXNEZW5vKSB7CiAgICAgIGNvbnNvbGUubG9nKCJydW5uaW5nIG9uIERFTk8iKTsKICAgICAgY29uc29sZS5sb2coImRlbm8gdmVyc2lvbiBpcyAiICsgdGhpcy5kZW5vVmVyc2lvbik7CiAgICB9IGVsc2UgaWYgKHRoaXMuaXNCdW4pIHsKICAgICAgY29uc29sZS5sb2coInJ1bm5pbmcgb24gQlVOIik7CiAgICAgIGNvbnNvbGUubG9nKCJidW4gdmVyc2lvbiBpcyAiICsgdGhpcy5idW5WZXJzaW9uKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnNvbGUubG9nKCJydW5uaW5nIG9uIEJST1dTRVIiKTsKICAgICAgY29uc29sZS5sb2coImJyb3dzZXIgaXMgIiArIHRoaXMudXNlckFnZW50KTsKICAgIH0KICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRqc29uQDYuMC4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGpzb24vZGlzdF90cy9pbmRleC5qcwp2YXIgZGlzdF90c19leHBvcnRzMTIgPSB7fTsKX19leHBvcnQoZGlzdF90c19leHBvcnRzMTIsIHsKICBTbWFydGpzb246ICgpID0+IFNtYXJ0anNvbiwKICBkZWVwRXF1YWxKc29uTFN0cmluZ3M6ICgpID0+IGRlZXBFcXVhbEpzb25MU3RyaW5ncywKICBkZWVwRXF1YWxPYmplY3RzOiAoKSA9PiBkZWVwRXF1YWxPYmplY3RzLAogIGZvbGREZWM6ICgpID0+IGZvbGREZWMsCiAgcGFyc2U6ICgpID0+IHBhcnNlMywKICBwYXJzZUJhc2U2NDogKCkgPT4gcGFyc2VCYXNlNjQsCiAgcGFyc2VKc29uTDogKCkgPT4gcGFyc2VKc29uTCwKICBzdGFibGVPbmVXYXlTdHJpbmdpZnk6ICgpID0+IHN0YWJsZU9uZVdheVN0cmluZ2lmeSwKICBzdHJpbmdpZnk6ICgpID0+IHN0cmluZ2lmeTIsCiAgc3RyaW5naWZ5QmFzZTY0OiAoKSA9PiBzdHJpbmdpZnlCYXNlNjQsCiAgc3RyaW5naWZ5SnNvbkw6ICgpID0+IHN0cmluZ2lmeUpzb25MLAogIHN0cmluZ2lmeVByZXR0eTogKCkgPT4gc3RyaW5naWZ5UHJldHR5Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0c3RyaW5nQDQuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHN0cmluZy9kaXN0X3RzL2luZGV4LmpzCnZhciBkaXN0X3RzX2V4cG9ydHMxMSA9IHt9OwpfX2V4cG9ydChkaXN0X3RzX2V4cG9ydHMxMSwgewogIEJhc2U2NDogKCkgPT4gQmFzZTY0LAogIERvbWFpbjogKCkgPT4gRG9tYWluLAogIEdpdFJlcG86ICgpID0+IEdpdFJlcG8sCiAgYmFzZTY0OiAoKSA9PiBiYXNlNjQsCiAgY3JlYXRlOiAoKSA9PiBzbWFydHN0cmluZ19jcmVhdGVfZXhwb3J0cywKICBkb2NrZXI6ICgpID0+IHNtYXJ0c3RyaW5nX2RvY2tlcl9leHBvcnRzLAogIGluZGVudDogKCkgPT4gc21hcnRzdHJpbmdfaW5kZW50X2V4cG9ydHMsCiAgbm9ybWFsaXplOiAoKSA9PiBzbWFydHN0cmluZ19ub3JtYWxpemVfZXhwb3J0cywKICB0eXBlOiAoKSA9PiBzbWFydHN0cmluZ190eXBlX2V4cG9ydHMKfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRzdHJpbmdANC4xLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0c3RyaW5nL2Rpc3RfdHMvc21hcnRzdHJpbmcuY3JlYXRlLmpzCnZhciBzbWFydHN0cmluZ19jcmVhdGVfZXhwb3J0cyA9IHt9OwpfX2V4cG9ydChzbWFydHN0cmluZ19jcmVhdGVfZXhwb3J0cywgewogIGNyZWF0ZUNyeXB0b1JhbmRvbVN0cmluZzogKCkgPT4gY3JlYXRlQ3J5cHRvUmFuZG9tU3RyaW5nLAogIGNyZWF0ZVJhbmRvbVN0cmluZzogKCkgPT4gY3JlYXRlUmFuZG9tU3RyaW5nCn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0c3RyaW5nQDQuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHN0cmluZy9kaXN0X3RzL3NtYXJ0c3RyaW5nLnBsdWdpbnMuanMKdmFyIGlzb3VuaXF1ZSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0X3RzKCksIDEpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0c3RyaW5nQDQuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHN0cmluZy9kaXN0X3RzL3NtYXJ0c3RyaW5nLmNyZWF0ZS5qcwp2YXIgZ2V0UmFuZG9tSW50ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgobWluMywgbWF4MykgPT4gewogIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gInVuZGVmaW5lZCIgJiYgZ2xvYmFsVGhpcy5jcnlwdG8gJiYgZ2xvYmFsVGhpcy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKSB7CiAgICBjb25zdCByYW5nZTIgPSBtYXgzIC0gbWluMzsKICAgIGNvbnN0IGFycmF5ID0gbmV3IFVpbnQzMkFycmF5KDEpOwogICAgZ2xvYmFsVGhpcy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycmF5KTsKICAgIHJldHVybiBtaW4zICsgYXJyYXlbMF0gJSByYW5nZTI7CiAgfSBlbHNlIHsKICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4MyAtIG1pbjMpKSArIG1pbjM7CiAgfQp9LCAiZ2V0UmFuZG9tSW50Iik7CnZhciBjdXN0b21SYW5kb21hdGljID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgocGF0dGVybiwgbGVuZ3RoLCBvcHRpb25zKSA9PiB7CiAgY29uc3QgY2hhclNldHMgPSB7CiAgICAiQSI6ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiIsCiAgICAiYSI6ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIsCiAgICAiMCI6ICIwMTIzNDU2Nzg5IiwKICAgICIhIjogIiFAIyQlXiYqKClfKy09W117fXw7OiwuPD4/IiwKICAgICIqIjogIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5IUAjJCVeJiooKV8rLT1bXXt9fDs6LC48Pj8iCiAgfTsKICBsZXQgYWN0dWFsUGF0dGVybiA9IHBhdHRlcm47CiAgaWYgKGxlbmd0aCAmJiBsZW5ndGggPiBwYXR0ZXJuLmxlbmd0aCkgewogICAgYWN0dWFsUGF0dGVybiA9IHBhdHRlcm4ucmVwZWF0KE1hdGguY2VpbChsZW5ndGggLyBwYXR0ZXJuLmxlbmd0aCkpLnNsaWNlKDAsIGxlbmd0aCk7CiAgfSBlbHNlIGlmIChsZW5ndGgpIHsKICAgIGFjdHVhbFBhdHRlcm4gPSBwYXR0ZXJuLnNsaWNlKDAsIGxlbmd0aCk7CiAgfQogIGxldCByZXN1bHQgPSAiIjsKICBmb3IgKGNvbnN0IGNoYXIgb2YgYWN0dWFsUGF0dGVybikgewogICAgaWYgKGNoYXJTZXRzW2NoYXJdKSB7CiAgICAgIGNvbnN0IGNoYXJTZXQgPSBjaGFyU2V0c1tjaGFyXTsKICAgICAgY29uc3QgcmFuZG9tSW5kZXggPSBnZXRSYW5kb21JbnQoMCwgY2hhclNldC5sZW5ndGgpOwogICAgICByZXN1bHQgKz0gY2hhclNldFtyYW5kb21JbmRleF07CiAgICB9IGVsc2UgewogICAgICByZXN1bHQgKz0gY2hhcjsKICAgIH0KICB9CiAgcmV0dXJuIHJlc3VsdDsKfSwgImN1c3RvbVJhbmRvbWF0aWMiKTsKdmFyIGNyZWF0ZVJhbmRvbVN0cmluZyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHBhdHRlcm5BcmcsIGxlbmd0aEFyZywgb3B0aW9uc0FyZykgPT4gewogIHJldHVybiBjdXN0b21SYW5kb21hdGljKHBhdHRlcm5BcmcsIGxlbmd0aEFyZywgb3B0aW9uc0FyZyk7Cn0sICJjcmVhdGVSYW5kb21TdHJpbmciKTsKdmFyIGNyZWF0ZUNyeXB0b1JhbmRvbVN0cmluZyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKCkgPT4gewogIHJldHVybiBpc291bmlxdWUudW5pKCk7Cn0sICJjcmVhdGVDcnlwdG9SYW5kb21TdHJpbmciKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHN0cmluZ0A0LjEuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRzdHJpbmcvZGlzdF90cy9zbWFydHN0cmluZy5kb2NrZXIuanMKdmFyIHNtYXJ0c3RyaW5nX2RvY2tlcl9leHBvcnRzID0ge307Cl9fZXhwb3J0KHNtYXJ0c3RyaW5nX2RvY2tlcl9leHBvcnRzLCB7CiAgbWFrZUVudk9iamVjdDogKCkgPT4gbWFrZUVudk9iamVjdAp9KTsKdmFyIG1ha2VFbnZPYmplY3QgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGVudkFycmF5QXJnKSB7CiAgbGV0IHJldHVybk9iamVjdCA9IHt9OwogIGxldCByZWdleFN0cmluZyA9IC8oLiopPSguKikvOwogIGlmICh0eXBlb2YgZW52QXJyYXlBcmcgIT09ICJ1bmRlZmluZWQiKSB7CiAgICBmb3IgKGxldCBlbnZLZXkgaW4gZW52QXJyYXlBcmcpIHsKICAgICAgbGV0IHJlZ2V4TWF0Y2hlcyA9IHJlZ2V4U3RyaW5nLmV4ZWMoZW52QXJyYXlBcmdbZW52S2V5XSk7CiAgICAgIHJldHVybk9iamVjdFtyZWdleE1hdGNoZXNbMV1dID0gcmVnZXhNYXRjaGVzWzJdOwogICAgfQogIH0KICByZXR1cm4gcmV0dXJuT2JqZWN0Owp9LCAibWFrZUVudk9iamVjdCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0c3RyaW5nQDQuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHN0cmluZy9kaXN0X3RzL3NtYXJ0c3RyaW5nLmluZGVudC5qcwp2YXIgc21hcnRzdHJpbmdfaW5kZW50X2V4cG9ydHMgPSB7fTsKX19leHBvcnQoc21hcnRzdHJpbmdfaW5kZW50X2V4cG9ydHMsIHsKICBpbmRlbnQ6ICgpID0+IGluZGVudCwKICBpbmRlbnRXaXRoUHJlZml4OiAoKSA9PiBpbmRlbnRXaXRoUHJlZml4LAogIG5vcm1hbGl6ZTogKCkgPT4gbm9ybWFsaXplCn0pOwp2YXIgc3BsaXRTdHJpbmdBdExpbmVCcmVhayA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHN0cmluZ0FyZykgPT4gewogIGxldCByZXN1bHRBcnJheSA9IHN0cmluZ0FyZy5zcGxpdCgiXG4iKTsKICByZXR1cm4gY2xlYW5TdHJpbmdBcnJheShyZXN1bHRBcnJheSk7Cn0sICJzcGxpdFN0cmluZ0F0TGluZUJyZWFrIik7CnZhciBqb2luU3RyaW5nV2l0aExpbmVCcmVha3MgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChzdHJpbmdBcnJheUFyZykgPT4gewogIGxldCByZXN1bHRTdHJpbmcgPSAiIjsKICBmb3IgKGxldCBsaW5lIG9mIHN0cmluZ0FycmF5QXJnKSB7CiAgICByZXN1bHRTdHJpbmcgPSByZXN1bHRTdHJpbmcgKyBsaW5lICsgIlxuIjsKICB9CiAgcmV0dXJuIHJlc3VsdFN0cmluZzsKfSwgImpvaW5TdHJpbmdXaXRoTGluZUJyZWFrcyIpOwp2YXIgY2xlYW5TdHJpbmdBcnJheSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHN0cmluZ0FycmF5QXJnKSA9PiB7CiAgbGV0IHRlc3RSZWdleCA9IC9eW1xzXSokLzsKICBpZiAodGVzdFJlZ2V4LnRlc3Qoc3RyaW5nQXJyYXlBcmdbMF0pKSB7CiAgICBzdHJpbmdBcnJheUFyZy5zaGlmdCgpOwogIH0KICBpZiAodGVzdFJlZ2V4LnRlc3Qoc3RyaW5nQXJyYXlBcmdbc3RyaW5nQXJyYXlBcmcubGVuZ3RoIC0gMV0pKSB7CiAgICBzdHJpbmdBcnJheUFyZy5wb3AoKTsKICB9CiAgcmV0dXJuIHN0cmluZ0FycmF5QXJnOwp9LCAiY2xlYW5TdHJpbmdBcnJheSIpOwp2YXIgaW5kZW50ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoc3RyaW5nQXJnLCBzcGFjZUFtb3VudCkgPT4gewogIGxldCBsb2NhbFN0cmluZ0FycmF5ID0gc3BsaXRTdHJpbmdBdExpbmVCcmVhayhzdHJpbmdBcmcpOwogIGZvciAobGV0IHN0cmluZ0FyZzIgb2YgbG9jYWxTdHJpbmdBcnJheSkgewogICAgc3RyaW5nQXJnMiA9ICIgIi5yZXBlYXQoc3BhY2VBbW91bnQpICsgc3RyaW5nQXJnMjsKICB9CiAgbGV0IHJlc3VsdFN0cmluZyA9IGpvaW5TdHJpbmdXaXRoTGluZUJyZWFrcyhsb2NhbFN0cmluZ0FycmF5KTsKICByZXR1cm4gcmVzdWx0U3RyaW5nOwp9LCAiaW5kZW50Iik7CnZhciBpbmRlbnRXaXRoUHJlZml4ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoc3RyaW5nQXJnLCBwcmVmaXhBcmcpID0+IHsKICBsZXQgcmVzdWx0U3RyaW5nOwogIGxldCBzdHJpbmdBcnJheSA9IHNwbGl0U3RyaW5nQXRMaW5lQnJlYWsoc3RyaW5nQXJnKTsKICBsZXQgcmVzdWx0QXJyYXkgPSBbXTsKICBmb3IgKGxldCBzdHJpbmdJdGVtIG9mIHN0cmluZ0FycmF5KSB7CiAgICByZXN1bHRBcnJheS5wdXNoKHByZWZpeEFyZyArIHN0cmluZ0l0ZW0pOwogIH0KICByZXN1bHRTdHJpbmcgPSBqb2luU3RyaW5nV2l0aExpbmVCcmVha3MocmVzdWx0QXJyYXkpOwogIHJldHVybiByZXN1bHRTdHJpbmc7Cn0sICJpbmRlbnRXaXRoUHJlZml4Iik7CnZhciBub3JtYWxpemUgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChzdHJpbmdBcmcpID0+IHsKICBsZXQgcmVzdWx0U3RyaW5nOwogIGxldCBzcGxpdFN0cmluZ0FycmF5ID0gc3BsaXRTdHJpbmdBdExpbmVCcmVhayhzdHJpbmdBcmcpOwogIGxldCBtaW5Db21tb25MZWZ0T2Zmc2V0OwogIGNvbnN0IGRlSW5kZW50UmVnZXggPSAvXihccyopLzsKICBjb25zdCBlbXB0eUxpbmVSZWdleCA9IC9eKFxzKikkLzsKICBmb3IgKGxldCBzdHJpbmdJdGVtIG9mIHNwbGl0U3RyaW5nQXJyYXkpIHsKICAgIGxldCBvZmZzZXRTdHJpbmcgPSBkZUluZGVudFJlZ2V4LmV4ZWMoc3RyaW5nSXRlbSlbMV07CiAgICBpZiAoKHR5cGVvZiBtaW5Db21tb25MZWZ0T2Zmc2V0ID09PSAidW5kZWZpbmVkIiB8fCBvZmZzZXRTdHJpbmcubGVuZ3RoIDwgbWluQ29tbW9uTGVmdE9mZnNldCkgJiYgIWVtcHR5TGluZVJlZ2V4LnRlc3Qoc3RyaW5nSXRlbSkpIHsKICAgICAgbWluQ29tbW9uTGVmdE9mZnNldCA9IG9mZnNldFN0cmluZy5sZW5ndGg7CiAgICB9CiAgfQogIGxldCByZXN1bHRTcGxpdFN0cmluZ0FycmF5ID0gW107CiAgZm9yIChsZXQgc3RyaW5nSXRlbSBvZiBzcGxpdFN0cmluZ0FycmF5KSB7CiAgICByZXN1bHRTcGxpdFN0cmluZ0FycmF5LnB1c2goc3RyaW5nSXRlbS5zdWJzdHIobWluQ29tbW9uTGVmdE9mZnNldCkpOwogIH0KICByZXN1bHRTdHJpbmcgPSBqb2luU3RyaW5nV2l0aExpbmVCcmVha3MocmVzdWx0U3BsaXRTdHJpbmdBcnJheSk7CiAgcmV0dXJuIHJlc3VsdFN0cmluZzsKfSwgIm5vcm1hbGl6ZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0c3RyaW5nQDQuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHN0cmluZy9kaXN0X3RzL3NtYXJ0c3RyaW5nLm5vcm1hbGl6ZS5qcwp2YXIgc21hcnRzdHJpbmdfbm9ybWFsaXplX2V4cG9ydHMgPSB7fTsKX19leHBvcnQoc21hcnRzdHJpbmdfbm9ybWFsaXplX2V4cG9ydHMsIHsKICByZXBsYWNlQWxsOiAoKSA9PiByZXBsYWNlQWxsLAogIHN0YW5kYXJkOiAoKSA9PiBzdGFuZGFyZAp9KTsKdmFyIHJlcGxhY2VBbGwgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChzdHJpbmdBcmcsIHNlYXJjaFBhdHRlcm4sIHJlcGxhY2VtZW50U3RyaW5nKSA9PiB7CiAgcmV0dXJuIHN0cmluZ0FyZy5yZXBsYWNlKG5ldyBSZWdFeHAoc2VhcmNoUGF0dGVybiwgImciKSwgcmVwbGFjZW1lbnRTdHJpbmcpOwp9LCAicmVwbGFjZUFsbCIpOwp2YXIgc3RyaXBJbmRlbnQgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChzdHIpID0+IHsKICBjb25zdCBsaW5lcyA9IHN0ci5zcGxpdCgiXG4iKTsKICBsZXQgbWluSW5kZW50ID0gSW5maW5pdHk7CiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7CiAgICBpZiAobGluZS50cmltKCkubGVuZ3RoID4gMCkgewogICAgICBjb25zdCBtYXRjaDIgPSBsaW5lLm1hdGNoKC9eKFxzKikvKTsKICAgICAgaWYgKG1hdGNoMikgewogICAgICAgIG1pbkluZGVudCA9IE1hdGgubWluKG1pbkluZGVudCwgbWF0Y2gyWzFdLmxlbmd0aCk7CiAgICAgIH0KICAgIH0KICB9CiAgaWYgKG1pbkluZGVudCA9PT0gSW5maW5pdHkgfHwgbWluSW5kZW50ID09PSAwKSB7CiAgICByZXR1cm4gc3RyOwogIH0KICByZXR1cm4gbGluZXMubWFwKChsaW5lKSA9PiB7CiAgICBpZiAobGluZS5sZW5ndGggPj0gbWluSW5kZW50KSB7CiAgICAgIHJldHVybiBsaW5lLnNsaWNlKG1pbkluZGVudCk7CiAgICB9CiAgICByZXR1cm4gbGluZTsKICB9KS5qb2luKCJcbiIpOwp9LCAic3RyaXBJbmRlbnQiKTsKdmFyIHN0YW5kYXJkID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoc3RyaW5nQXJnLCBvcHRpb25zKSA9PiB7CiAgbGV0IHJlc3VsdCA9IHN0cmluZ0FyZzsKICBpZiAoIW9wdGlvbnMgfHwgb3B0aW9ucy5zdHJpcEluZGVudCkgewogICAgcmVzdWx0ID0gc3RyaXBJbmRlbnQocmVzdWx0KTsKICB9CiAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMubm9ybWFsaXplTmV3bGluZSkgewogICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL1xyXG4vZywgIlxuIik7CiAgfQogIGlmICghb3B0aW9ucyB8fCBvcHRpb25zLnJlcGxhY2VUYWJzKSB7CiAgICByZXN1bHQgPSByZXBsYWNlQWxsKHJlc3VsdCwgIgkvIiwgIiAiKTsKICB9CiAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMuc3RyaXBMZWFkaW5nVHJhaWxpbmdFbXB0eUxpbmVzKSB7CiAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXlxzKltcclxuXS9nbSwgIiIpLnJlcGxhY2UoL1xzKltcclxuXSQvZ20sICIiKTsKICB9CiAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMuc3RyaXBBbGxFbXB0eUxpbmVzKSB7CiAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXlxzKltcclxuXS9nbSwgIiIpOwogIH0KICByZXR1cm4gcmVzdWx0Owp9LCAic3RhbmRhcmQiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHN0cmluZ0A0LjEuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRzdHJpbmcvZGlzdF90cy9zbWFydHN0cmluZy50eXBlLmpzCnZhciBzbWFydHN0cmluZ190eXBlX2V4cG9ydHMgPSB7fTsKX19leHBvcnQoc21hcnRzdHJpbmdfdHlwZV9leHBvcnRzLCB7CiAgaXNCYXNlNjQ6ICgpID0+IGlzQmFzZTY0LAogIGlzVXRmODogKCkgPT4gaXNVdGY4Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0c3RyaW5nQDQuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHN0cmluZy9kaXN0X3RzL3NtYXJ0c3RyaW5nLmJhc2U2NC5qcwp2YXIgdW5pdmVyc2FsQmFzZTY0ID0gewogIGVuY29kZTogLyogQF9fUFVSRV9fICovIF9fbmFtZSgoc3RyKSA9PiB7CiAgICBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHN0ciwgInV0ZjgiKS50b1N0cmluZygiYmFzZTY0Iik7CiAgICB9IGVsc2UgaWYgKHR5cGVvZiBidG9hICE9PSAidW5kZWZpbmVkIikgewogICAgICBjb25zdCB1dGY4Qnl0ZXMgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoc3RyKTsKICAgICAgY29uc3QgYmluYXJ5U3RyaW5nID0gQXJyYXkuZnJvbSh1dGY4Qnl0ZXMsIChieXRlKSA9PiBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGUpKS5qb2luKCIiKTsKICAgICAgcmV0dXJuIGJ0b2EoYmluYXJ5U3RyaW5nKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGNoYXJzID0gIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOwogICAgICBjb25zdCBieXRlcyA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShzdHIpOwogICAgICBsZXQgcmVzdWx0ID0gIiI7CiAgICAgIGxldCBpMTAgPSAwOwogICAgICB3aGlsZSAoaTEwIDwgYnl0ZXMubGVuZ3RoKSB7CiAgICAgICAgY29uc3QgYTQgPSBieXRlc1tpMTArK107CiAgICAgICAgY29uc3QgYjQgPSBpMTAgPCBieXRlcy5sZW5ndGggPyBieXRlc1tpMTArK10gOiAwOwogICAgICAgIGNvbnN0IGMxMCA9IGkxMCA8IGJ5dGVzLmxlbmd0aCA/IGJ5dGVzW2kxMCsrXSA6IDA7CiAgICAgICAgY29uc3QgYml0bWFwID0gYTQgPDwgMTYgfCBiNCA8PCA4IHwgYzEwOwogICAgICAgIHJlc3VsdCArPSBjaGFycy5jaGFyQXQoYml0bWFwID4+IDE4ICYgNjMpOwogICAgICAgIHJlc3VsdCArPSBjaGFycy5jaGFyQXQoYml0bWFwID4+IDEyICYgNjMpOwogICAgICAgIHJlc3VsdCArPSBpMTAgLSAyIDwgYnl0ZXMubGVuZ3RoID8gY2hhcnMuY2hhckF0KGJpdG1hcCA+PiA2ICYgNjMpIDogIj0iOwogICAgICAgIHJlc3VsdCArPSBpMTAgLSAxIDwgYnl0ZXMubGVuZ3RoID8gY2hhcnMuY2hhckF0KGJpdG1hcCAmIDYzKSA6ICI9IjsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogIH0sICJlbmNvZGUiKSwKICBkZWNvZGU6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHN0cikgPT4gewogICAgY29uc3QgYmFzZTY0U3RyaW5nID0gc3RyLnJlcGxhY2UoLy0vZywgIisiKS5yZXBsYWNlKC9fL2csICIvIikucGFkRW5kKHN0ci5sZW5ndGggKyAoNCAtIHN0ci5sZW5ndGggJSA0KSAlIDQsICI9Iik7CiAgICBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGJhc2U2NFN0cmluZywgImJhc2U2NCIpLnRvU3RyaW5nKCJ1dGY4Iik7CiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhdG9iICE9PSAidW5kZWZpbmVkIikgewogICAgICBjb25zdCBiaW5hcnlTdHJpbmcgPSBhdG9iKGJhc2U2NFN0cmluZyk7CiAgICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYmluYXJ5U3RyaW5nLmxlbmd0aCk7CiAgICAgIGZvciAobGV0IGkxMCA9IDA7IGkxMCA8IGJpbmFyeVN0cmluZy5sZW5ndGg7IGkxMCsrKSB7CiAgICAgICAgYnl0ZXNbaTEwXSA9IGJpbmFyeVN0cmluZy5jaGFyQ29kZUF0KGkxMCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShieXRlcyk7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBjaGFycyA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIjsKICAgICAgbGV0IGJ5dGVzID0gW107CiAgICAgIGxldCBpMTAgPSAwOwogICAgICB3aGlsZSAoaTEwIDwgYmFzZTY0U3RyaW5nLmxlbmd0aCkgewogICAgICAgIGNvbnN0IGVuY29kZWQxID0gY2hhcnMuaW5kZXhPZihiYXNlNjRTdHJpbmcuY2hhckF0KGkxMCsrKSk7CiAgICAgICAgY29uc3QgZW5jb2RlZDIgPSBjaGFycy5pbmRleE9mKGJhc2U2NFN0cmluZy5jaGFyQXQoaTEwKyspKTsKICAgICAgICBjb25zdCBlbmNvZGVkMyA9IGNoYXJzLmluZGV4T2YoYmFzZTY0U3RyaW5nLmNoYXJBdChpMTArKykpOwogICAgICAgIGNvbnN0IGVuY29kZWQ0ID0gY2hhcnMuaW5kZXhPZihiYXNlNjRTdHJpbmcuY2hhckF0KGkxMCsrKSk7CiAgICAgICAgY29uc3QgYml0bWFwID0gZW5jb2RlZDEgPDwgMTggfCBlbmNvZGVkMiA8PCAxMiB8IGVuY29kZWQzIDw8IDYgfCBlbmNvZGVkNDsKICAgICAgICBieXRlcy5wdXNoKGJpdG1hcCA+PiAxNiAmIDI1NSk7CiAgICAgICAgaWYgKGVuY29kZWQzICE9PSA2NCkKICAgICAgICAgIGJ5dGVzLnB1c2goYml0bWFwID4+IDggJiAyNTUpOwogICAgICAgIGlmIChlbmNvZGVkNCAhPT0gNjQpCiAgICAgICAgICBieXRlcy5wdXNoKGJpdG1hcCAmIDI1NSk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShuZXcgVWludDhBcnJheShieXRlcykpOwogICAgfQogIH0sICJkZWNvZGUiKQp9Owp2YXIgQmFzZTY0ID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkJhc2U2NCIpOwogIH0KICBjb25zdHJ1Y3RvcihpbnB1dFN0cmluZ0FyZywgdHlwZUFyZykgewogICAgc3dpdGNoICh0eXBlQXJnKSB7CiAgICAgIGNhc2UgInN0cmluZyI6CiAgICAgICAgdGhpcy5yZWZTdHJpbmcgPSBpbnB1dFN0cmluZ0FyZzsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiYmFzZTY0IjoKICAgICAgICB0aGlzLnJlZlN0cmluZyA9IGJhc2U2NC5kZWNvZGUoaW5wdXRTdHJpbmdBcmcpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJiYXNlNjR1cmkiOgogICAgICAgIHRoaXMucmVmU3RyaW5nID0gYmFzZTY0LmRlY29kZShpbnB1dFN0cmluZ0FyZyk7CiAgICB9CiAgfQogIC8qKgogICAqIHRoZSBzaW1wbGUgc3RyaW5nICh1bmVuY29kZWQpCiAgICovCiAgZ2V0IHNpbXBsZVN0cmluZygpIHsKICAgIHJldHVybiB0aGlzLnJlZlN0cmluZzsKICB9CiAgLyoqCiAgICogdGhlIGJhc2U2NCBlbmNvZGVkIHZlcnNpb24gb2YgdGhlIG9yaWdpbmFsIHN0cmluZwogICAqLwogIGdldCBiYXNlNjRTdHJpbmcoKSB7CiAgICByZXR1cm4gYmFzZTY0LmVuY29kZSh0aGlzLnJlZlN0cmluZyk7CiAgfQogIC8qKgogICAqIHRoZSBiYXNlNjR1cmkgZW5jb2RlZCB2ZXJzaW9uIG9mIHRoZSBvcmlnaW5hbCBzdHJpbmcKICAgKi8KICBnZXQgYmFzZTY0VXJpU3RyaW5nKCkgewogICAgcmV0dXJuIGJhc2U2NC5lbmNvZGVVcmkodGhpcy5yZWZTdHJpbmcpOwogIH0KfTsKdmFyIGJhc2U2NCA9IHsKICAvKioKICAgKiBlbmNvZGVzIHRoZSBzdHJpbmcKICAgKi8KICBlbmNvZGU6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHN0cmluZ0FyZykgPT4gewogICAgcmV0dXJuIHVuaXZlcnNhbEJhc2U2NC5lbmNvZGUoc3RyaW5nQXJnKTsKICB9LCAiZW5jb2RlIiksCiAgLyoqCiAgICogZW5jb2RlcyBhIHN0cmluZ0FyZyB0byBiYXNlNjQgdXJpIHN0eWxlCiAgICovCiAgZW5jb2RlVXJpOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKChzdHJpbmdBcmcpID0+IHsKICAgIHJldHVybiB1bml2ZXJzYWxCYXNlNjQuZW5jb2RlKHN0cmluZ0FyZykucmVwbGFjZSgvXCsvZywgIi0iKS5yZXBsYWNlKC9cLy9nLCAiXyIpLnJlcGxhY2UoLz0vZywgIiIpOwogIH0sICJlbmNvZGVVcmkiKSwKICAvKioKICAgKiBkZWNvZGVzIGEgYmFzZTY0IGVuY29kZWQgc3RyaW5nCiAgICovCiAgZGVjb2RlOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKChzdHJpbmdBcmcpID0+IHsKICAgIHJldHVybiB1bml2ZXJzYWxCYXNlNjQuZGVjb2RlKHN0cmluZ0FyZyk7CiAgfSwgImRlY29kZSIpLAogIC8qKgogICAqCiAgICogQHBhcmFtIHN0cmluZ0FyZwogICAqIGNoZWNrcyB3ZXRoZXIgdGhlIHN0cmluZyBpcyBiYXNlNjQgZW5jb2RlZAogICAqLwogIGlzQmFzZTY0OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKChzdHJpbmdBcmcpID0+IHsKICAgIGNvbnN0IHJlZ2V4ID0gL14oW0EtWmEtejAtOSsvXXs0fSkqKFtBLVphLXowLTkrL117M309fFtBLVphLXowLTkrL117Mn09PSk/JC87CiAgICByZXR1cm4gcmVnZXgudGVzdChzdHJpbmdBcmcpOwogIH0sICJpc0Jhc2U2NCIpCn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRzdHJpbmdANC4xLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0c3RyaW5nL2Rpc3RfdHMvc21hcnRzdHJpbmcudHlwZS5qcwp2YXIgaXNVdGY4ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoc3RyaW5nQXJnKSA9PiB7CiAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpOwogIGNvbnN0IGJ5dGVzID0gZW5jb2Rlci5lbmNvZGUoc3RyaW5nQXJnKTsKICBsZXQgaTEwID0gMDsKICB3aGlsZSAoaTEwIDwgYnl0ZXMubGVuZ3RoKSB7CiAgICBpZiAoCiAgICAgIC8vIEFTQ0lJCiAgICAgIGJ5dGVzW2kxMF0gPT09IDkgfHwgYnl0ZXNbaTEwXSA9PT0gMTAgfHwgYnl0ZXNbaTEwXSA9PT0gMTMgfHwgMzIgPD0gYnl0ZXNbaTEwXSAmJiBieXRlc1tpMTBdIDw9IDEyNgogICAgKSB7CiAgICAgIGkxMCArPSAxOwogICAgICBjb250aW51ZTsKICAgIH0KICAgIGlmICgKICAgICAgLy8gbm9uLW92ZXJsb25nIDItYnl0ZQogICAgICAxOTQgPD0gYnl0ZXNbaTEwXSAmJiBieXRlc1tpMTBdIDw9IDIyMyAmJiAxMjggPD0gYnl0ZXNbaTEwICsgMV0gJiYgYnl0ZXNbaTEwICsgMV0gPD0gMTkxCiAgICApIHsKICAgICAgaTEwICs9IDI7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgaWYgKAogICAgICAvLyBleGNsdWRpbmcgb3ZlcmxvbmdzCiAgICAgIGJ5dGVzW2kxMF0gPT09IDIyNCAmJiAxNjAgPD0gYnl0ZXNbaTEwICsgMV0gJiYgYnl0ZXNbaTEwICsgMV0gPD0gMTkxICYmIDEyOCA8PSBieXRlc1tpMTAgKyAyXSAmJiBieXRlc1tpMTAgKyAyXSA8PSAxOTEgfHwgLy8gc3RyYWlnaHQgMy1ieXRlCiAgICAgICgyMjUgPD0gYnl0ZXNbaTEwXSAmJiBieXRlc1tpMTBdIDw9IDIzNiB8fCBieXRlc1tpMTBdID09PSAyMzggfHwgYnl0ZXNbaTEwXSA9PT0gMjM5KSAmJiAxMjggPD0gYnl0ZXNbaTEwICsgMV0gJiYgYnl0ZXNbaTEwICsgMV0gPD0gMTkxICYmIDEyOCA8PSBieXRlc1tpMTAgKyAyXSAmJiBieXRlc1tpMTAgKyAyXSA8PSAxOTEgfHwgLy8gZXhjbHVkaW5nIHN1cnJvZ2F0ZXMKICAgICAgYnl0ZXNbaTEwXSA9PT0gMjM3ICYmIDEyOCA8PSBieXRlc1tpMTAgKyAxXSAmJiBieXRlc1tpMTAgKyAxXSA8PSAxNTkgJiYgMTI4IDw9IGJ5dGVzW2kxMCArIDJdICYmIGJ5dGVzW2kxMCArIDJdIDw9IDE5MQogICAgKSB7CiAgICAgIGkxMCArPSAzOwogICAgICBjb250aW51ZTsKICAgIH0KICAgIGlmICgKICAgICAgLy8gcGxhbmVzIDEtMwogICAgICBieXRlc1tpMTBdID09PSAyNDAgJiYgMTQ0IDw9IGJ5dGVzW2kxMCArIDFdICYmIGJ5dGVzW2kxMCArIDFdIDw9IDE5MSAmJiAxMjggPD0gYnl0ZXNbaTEwICsgMl0gJiYgYnl0ZXNbaTEwICsgMl0gPD0gMTkxICYmIDEyOCA8PSBieXRlc1tpMTAgKyAzXSAmJiBieXRlc1tpMTAgKyAzXSA8PSAxOTEgfHwgLy8gcGxhbmVzIDQtMTUKICAgICAgMjQxIDw9IGJ5dGVzW2kxMF0gJiYgYnl0ZXNbaTEwXSA8PSAyNDMgJiYgMTI4IDw9IGJ5dGVzW2kxMCArIDFdICYmIGJ5dGVzW2kxMCArIDFdIDw9IDE5MSAmJiAxMjggPD0gYnl0ZXNbaTEwICsgMl0gJiYgYnl0ZXNbaTEwICsgMl0gPD0gMTkxICYmIDEyOCA8PSBieXRlc1tpMTAgKyAzXSAmJiBieXRlc1tpMTAgKyAzXSA8PSAxOTEgfHwgLy8gcGxhbmUgMTYKICAgICAgYnl0ZXNbaTEwXSA9PT0gMjQ0ICYmIDEyOCA8PSBieXRlc1tpMTAgKyAxXSAmJiBieXRlc1tpMTAgKyAxXSA8PSAxNDMgJiYgMTI4IDw9IGJ5dGVzW2kxMCArIDJdICYmIGJ5dGVzW2kxMCArIDJdIDw9IDE5MSAmJiAxMjggPD0gYnl0ZXNbaTEwICsgM10gJiYgYnl0ZXNbaTEwICsgM10gPD0gMTkxCiAgICApIHsKICAgICAgaTEwICs9IDQ7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KICByZXR1cm4gdHJ1ZTsKfSwgImlzVXRmOCIpOwp2YXIgaXNCYXNlNjQgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChzdHJpbmdBcmcpID0+IHsKICBjb25zdCBub3RCYXNlNjQgPSAvW15BLVowLTkrXC89XS9pOwogIGNvbnN0IGxlbiA9IHN0cmluZ0FyZy5sZW5ndGg7CiAgaWYgKCFsZW4gfHwgbGVuICUgNCAhPT0gMCB8fCBub3RCYXNlNjQudGVzdChzdHJpbmdBcmcpKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGNvbnN0IGZpcnN0UGFkZGluZ0NoYXIgPSBzdHJpbmdBcmcuaW5kZXhPZigiPSIpOwogIHJldHVybiBmaXJzdFBhZGRpbmdDaGFyID09PSAtMSB8fCBmaXJzdFBhZGRpbmdDaGFyID09PSBsZW4gLSAxIHx8IGZpcnN0UGFkZGluZ0NoYXIgPT09IGxlbiAtIDIgJiYgc3RyaW5nQXJnW2xlbiAtIDFdID09PSAiPSI7Cn0sICJpc0Jhc2U2NCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0c3RyaW5nQDQuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHN0cmluZy9kaXN0X3RzL3NtYXJ0c3RyaW5nLmRvbWFpbi5qcwp2YXIgRG9tYWluID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkRvbWFpbiIpOwogIH0KICBjb25zdHJ1Y3Rvcihkb21haW5TdHJpbmdBcmcpIHsKICAgIHRoaXMucHJvdG9jb2wgPSB0aGlzLl9wcm90b2NvbFJlZ2V4KGRvbWFpblN0cmluZ0FyZyk7CiAgICBpZiAoIXRoaXMucHJvdG9jb2wpIHsKICAgICAgZG9tYWluU3RyaW5nQXJnID0gYGh0dHBzOi8vJHtkb21haW5TdHJpbmdBcmd9YDsKICAgIH0KICAgIHRoaXMubm9kZVBhcnNlZFVybCA9IG5ldyBVUkwoZG9tYWluU3RyaW5nQXJnKTsKICAgIHRoaXMucG9ydCA9IHRoaXMubm9kZVBhcnNlZFVybC5wb3J0OwogICAgY29uc3QgcmVnZXhNYXRjaGVzID0gdGhpcy5fZG9tYWluUmVnZXgoZG9tYWluU3RyaW5nQXJnLnJlcGxhY2UodGhpcy5ub2RlUGFyc2VkVXJsLnBhdGhuYW1lLCAiIikpOwogICAgdGhpcy5mdWxsTmFtZSA9ICIiOwogICAgZm9yIChsZXQgaTEwID0gMTsgaTEwIDw9IDU7IGkxMCsrKSB7CiAgICAgIGlmIChyZWdleE1hdGNoZXNbaTEwIC0gMV0pIHsKICAgICAgICBjb25zdCBsb2NhbE1hdGNoID0gcmVnZXhNYXRjaGVzW2kxMCAtIDFdOwogICAgICAgIHRoaXNbImxldmVsIiArIGkxMC50b1N0cmluZygpXSA9IGxvY2FsTWF0Y2g7CiAgICAgICAgaWYgKHRoaXMuZnVsbE5hbWUgPT09ICIiKSB7CiAgICAgICAgICB0aGlzLmZ1bGxOYW1lID0gbG9jYWxNYXRjaDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5mdWxsTmFtZSA9IGxvY2FsTWF0Y2ggKyAiLiIgKyB0aGlzLmZ1bGxOYW1lOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzWyJsZXZlbCIgKyBpMTAudG9TdHJpbmcoKV0gPSB2b2lkIDA7CiAgICAgIH0KICAgIH0KICAgIHRoaXMuem9uZU5hbWUgPSB0aGlzLmxldmVsMiArICIuIiArIHRoaXMubGV2ZWwxOwogICAgdGhpcy50b3BMZXZlbCA9IHRoaXMubGV2ZWwxOwogICAgdGhpcy5kb21haW5OYW1lID0gdGhpcy5sZXZlbDI7CiAgICB0aGlzLnN1YkRvbWFpbiA9IHRoaXMubGV2ZWwzOwogIH0KICAvLyBoZWxwZXIgZnVuY3Rpb25zCiAgLyoqICovCiAgX2RvbWFpblJlZ2V4KHN0cmluZ0FyZykgewogICAgY29uc3QgcmVnZXhTdHJpbmcgPSAvKFthLXpBLVowLTlcLVxfXSopXC57MCwxfShbYS16QS1aMC05XC1cX10qKVwuezAsMX0oW2EtekEtWjAtOVwtXF9dKilcLnswLDF9KFthLXpBLVowLTlcLVxfXSopXC57MCwxfShbYS16QS1aMC05XC1cX10qKVwuezAsMX0kLzsKICAgIGNvbnN0IHJlZ2V4TWF0Y2hlcyA9IHJlZ2V4U3RyaW5nLmV4ZWMoc3RyaW5nQXJnKTsKICAgIHJlZ2V4TWF0Y2hlcy5yZXZlcnNlKCk7CiAgICByZWdleE1hdGNoZXMucG9wKCk7CiAgICBjb25zdCByZWdleE1hdGNoZXNGaWx0ZXJlZCA9IHJlZ2V4TWF0Y2hlcy5maWx0ZXIoZnVuY3Rpb24oc3RyaW5nQXJnMikgewogICAgICByZXR1cm4gc3RyaW5nQXJnMiAhPT0gIiI7CiAgICB9KTsKICAgIHJldHVybiByZWdleE1hdGNoZXNGaWx0ZXJlZDsKICB9CiAgX3Byb3RvY29sUmVnZXgoc3RyaW5nQXJnKSB7CiAgICBjb25zdCByZWdleFN0cmluZyA9IC9eKFthLXpBLVowLTldKik6XC9cLy87CiAgICBjb25zdCByZWdleE1hdGNoZXMgPSByZWdleFN0cmluZy5leGVjKHN0cmluZ0FyZyk7CiAgICBpZiAocmVnZXhNYXRjaGVzKSB7CiAgICAgIHJldHVybiByZWdleE1hdGNoZXNbMV07CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gdm9pZCAwOwogICAgfQogIH0KICBfcG9ydFJlZ2V4KHN0cmluZ0FyZykgewogICAgY29uc3QgcmVnZXhTdHJpbmcgPSAvXihbYS16QS1aMC05XSopOlwvXC8vOwogICAgY29uc3QgcmVnZXhNYXRjaGVzID0gcmVnZXhTdHJpbmcuZXhlYyhzdHJpbmdBcmcpOwogICAgaWYgKHJlZ2V4TWF0Y2hlcykgewogICAgICByZXR1cm4gcmVnZXhNYXRjaGVzWzFdOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHZvaWQgMDsKICAgIH0KICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRzdHJpbmdANC4xLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0c3RyaW5nL2Rpc3RfdHMvc21hcnRzdHJpbmcuZ2l0LmpzCnZhciBHaXRSZXBvID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkdpdFJlcG8iKTsKICB9CiAgY29uc3RydWN0b3Ioc3RyaW5nQXJnLCB0b2tlbkFyZykgewogICAgbGV0IHJlZ2V4TWF0Y2hlcyA9IGdpdFJlZ2V4KHN0cmluZ0FyZyk7CiAgICB0aGlzLmhvc3QgPSByZWdleE1hdGNoZXNbMV07CiAgICB0aGlzLnVzZXIgPSByZWdleE1hdGNoZXNbMl07CiAgICB0aGlzLnJlcG8gPSByZWdleE1hdGNoZXNbM107CiAgICB0aGlzLmFjY2Vzc1Rva2VuID0gdG9rZW5Bcmc7CiAgICB0aGlzLnNzaFVybCA9IGdpdExpbmsodGhpcy5ob3N0LCB0aGlzLnVzZXIsIHRoaXMucmVwbywgdGhpcy5hY2Nlc3NUb2tlbiwgInNzaCIpOwogICAgdGhpcy5odHRwc1VybCA9IGdpdExpbmsodGhpcy5ob3N0LCB0aGlzLnVzZXIsIHRoaXMucmVwbywgdGhpcy5hY2Nlc3NUb2tlbiwgImh0dHBzIik7CiAgfQp9Owp2YXIgZ2l0UmVnZXggPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKHN0cmluZ0FyZykgewogIGNvbnN0IHJlZ2V4U3RyaW5nID0gLyhbYS16QS1aMC05XC1fXC5dKikoPzpcL3xcOikoW2EtekEtWjAtOVwtX1wuXSopKD86XC8pKFthLXpBLVowLTlcLV9cLl0qKSg/OlwuZ2l0KS87CiAgbGV0IHJlZ2V4TWF0Y2hlcyA9IHJlZ2V4U3RyaW5nLmV4ZWMoc3RyaW5nQXJnKTsKICByZXR1cm4gcmVnZXhNYXRjaGVzOwp9LCAiZ2l0UmVnZXgiKTsKdmFyIGdpdExpbmsgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGhvc3RBcmcsIHVzZXJBcmcsIHJlcG9BcmcsIHRva2VuQXJnID0gIiIsIGxpbmtUeXBlQXJnKSB7CiAgbGV0IHJldHVyblN0cmluZzsKICBpZiAodG9rZW5BcmcgIT09ICIiKSB7CiAgICB0b2tlbkFyZyA9IHRva2VuQXJnICsgIkAiOwogIH0KICBzd2l0Y2ggKGxpbmtUeXBlQXJnKSB7CiAgICBjYXNlICJodHRwcyI6CiAgICAgIHJldHVyblN0cmluZyA9ICJodHRwczovLyIgKyB0b2tlbkFyZyArIGhvc3RBcmcgKyAiLyIgKyB1c2VyQXJnICsgIi8iICsgcmVwb0FyZyArICIuZ2l0IjsKICAgICAgYnJlYWs7CiAgICBjYXNlICJzc2giOgogICAgICByZXR1cm5TdHJpbmcgPSAiZ2l0QCIgKyBob3N0QXJnICsgIjoiICsgdXNlckFyZyArICIvIiArIHJlcG9BcmcgKyAiLmdpdCI7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgY29uc29sZS5lcnJvcigiTGluayBUeXBlICIgKyBsaW5rVHlwZUFyZyArICIgbm90IGtub3duIik7CiAgICAgIGJyZWFrOwogIH0KICByZXR1cm4gcmV0dXJuU3RyaW5nOwp9LCAiZ2l0TGluayIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0anNvbkA2LjAuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRqc29uL2Rpc3RfdHMvc21hcnRqc29uLnBsdWdpbnMuanMKdmFyIGltcG9ydF9sb2Rhc2ggPSBfX3RvRVNNKHJlcXVpcmVfbG9kYXNoKCksIDEpOwp2YXIgaW1wb3J0X2Zhc3RfanNvbl9zdGFibGVfc3RyaW5naWZ5ID0gX190b0VTTShyZXF1aXJlX2Zhc3RfanNvbl9zdGFibGVfc3RyaW5naWZ5KCksIDEpOwp2YXIgc3RhYmxlSnNvbiA9IGltcG9ydF9mYXN0X2pzb25fc3RhYmxlX3N0cmluZ2lmeS5kZWZhdWx0OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0anNvbkA2LjAuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRqc29uL2Rpc3RfdHMvYnVmZmVyaGFuZGxpbmcuanMKZnVuY3Rpb24gYmFzZTY0RW5jb2RlKGRhdGEpIHsKICBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gInVuZGVmaW5lZCIpIHsKICAgIHJldHVybiBCdWZmZXIuZnJvbShkYXRhKS50b1N0cmluZygiYmFzZTY0Iik7CiAgfQogIHJldHVybiBidG9hKFN0cmluZy5mcm9tQ2hhckNvZGUoLi4uZGF0YSkpOwp9Cl9fbmFtZShiYXNlNjRFbmNvZGUsICJiYXNlNjRFbmNvZGUiKTsKZnVuY3Rpb24gYmFzZTY0RGVjb2RlKHN0cikgewogIGlmICh0eXBlb2YgQnVmZmVyICE9PSAidW5kZWZpbmVkIikgewogICAgY29uc3QgYnVmID0gQnVmZmVyLmZyb20oc3RyLCAiYmFzZTY0Iik7CiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYnVmLmJ1ZmZlciwgYnVmLmJ5dGVPZmZzZXQsIGJ1Zi5ieXRlTGVuZ3RoKTsKICB9CiAgcmV0dXJuIG5ldyBVaW50OEFycmF5KEFycmF5LmZyb20oYXRvYihzdHIpKS5tYXAoKGNoYXIpID0+IGNoYXIuY2hhckNvZGVBdCgwKSkpOwp9Cl9fbmFtZShiYXNlNjREZWNvZGUsICJiYXNlNjREZWNvZGUiKTsKZnVuY3Rpb24gc3RyaW5naWZ5KHZhbHVlMiwgc3BhY2UyKSB7CiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlMiwgcmVwbGFjZXIsIHNwYWNlMik7Cn0KX19uYW1lKHN0cmluZ2lmeSwgInN0cmluZ2lmeSIpOwpmdW5jdGlvbiBwYXJzZTIodGV4dDgpIHsKICByZXR1cm4gSlNPTi5wYXJzZSh0ZXh0OCwgcmV2aXZlcik7Cn0KX19uYW1lKHBhcnNlMiwgInBhcnNlIik7CnZhciByZXBsYWNlciA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGtleTIsIHZhbHVlMikgPT4gewogIGlmIChpc0J1ZmZlckxpa2UyKHZhbHVlMikpIHsKICAgIGxldCBidWZmZXJEYXRhOwogICAgaWYgKCJkYXRhIiBpbiB2YWx1ZTIgJiYgaXNBcnJheTModmFsdWUyLmRhdGEpKSB7CiAgICAgIGJ1ZmZlckRhdGEgPSBuZXcgVWludDhBcnJheSh2YWx1ZTIuZGF0YSk7CiAgICB9IGVsc2UgaWYgKHZhbHVlMiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHsKICAgICAgYnVmZmVyRGF0YSA9IHZhbHVlMjsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB2YWx1ZTI7CiAgICB9CiAgICBjb25zdCBiYXNlNjREYXRhID0gImJhc2U2NDoiICsgYmFzZTY0RW5jb2RlKGJ1ZmZlckRhdGEpOwogICAgcmV0dXJuIHsKICAgICAgdHlwZTogIkVuY29kZWRCdWZmZXIiLAogICAgICBkYXRhOiBiYXNlNjREYXRhCiAgICB9OwogIH0KICByZXR1cm4gdmFsdWUyOwp9LCAicmVwbGFjZXIiKTsKdmFyIHJldml2ZXIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChrZXkyLCB2YWx1ZTIpID0+IHsKICBpZiAoaXNFbmNvZGVkQnVmZmVyKHZhbHVlMikpIHsKICAgIGlmIChpc1N0cmluZyh2YWx1ZTIuZGF0YSkgJiYgdmFsdWUyLmRhdGEuc3RhcnRzV2l0aCgiYmFzZTY0OiIpKSB7CiAgICAgIGNvbnN0IGJhc2U2NERhdGEgPSB2YWx1ZTIuZGF0YS5zbGljZSg3KTsKICAgICAgY29uc3QgYnVmZmVyMiA9IGJhc2U2NERlY29kZShiYXNlNjREYXRhKTsKICAgICAgcmV0dXJuIGJ1ZmZlcjI7CiAgICB9CiAgfQogIHJldHVybiB2YWx1ZTI7Cn0sICJyZXZpdmVyIik7CmZ1bmN0aW9uIGlzRW5jb2RlZEJ1ZmZlcih4MykgewogIHJldHVybiBpc09iamVjdCh4MykgJiYgeDMudHlwZSA9PT0gIkVuY29kZWRCdWZmZXIiICYmIGlzU3RyaW5nKHgzLmRhdGEpOwp9Cl9fbmFtZShpc0VuY29kZWRCdWZmZXIsICJpc0VuY29kZWRCdWZmZXIiKTsKZnVuY3Rpb24gaXNCdWZmZXJMaWtlMih4MykgewogIHJldHVybiBpc09iamVjdCh4MykgJiYgKHgzLnR5cGUgPT09ICJCdWZmZXIiICYmIChpc0FycmF5Myh4My5kYXRhKSB8fCBpc1N0cmluZyh4My5kYXRhKSkpIHx8IHgzIGluc3RhbmNlb2YgVWludDhBcnJheTsKfQpfX25hbWUoaXNCdWZmZXJMaWtlMiwgImlzQnVmZmVyTGlrZSIpOwpmdW5jdGlvbiBpc0FycmF5Myh4MykgewogIHJldHVybiBBcnJheS5pc0FycmF5KHgzKTsKfQpfX25hbWUoaXNBcnJheTMsICJpc0FycmF5Iik7CmZ1bmN0aW9uIGlzU3RyaW5nKHgzKSB7CiAgcmV0dXJuIHR5cGVvZiB4MyA9PT0gInN0cmluZyI7Cn0KX19uYW1lKGlzU3RyaW5nLCAiaXNTdHJpbmciKTsKZnVuY3Rpb24gaXNPYmplY3QoeDMpIHsKICByZXR1cm4gdHlwZW9mIHgzID09PSAib2JqZWN0IiAmJiB4MyAhPT0gbnVsbDsKfQpfX25hbWUoaXNPYmplY3QsICJpc09iamVjdCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0anNvbkA2LjAuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRqc29uL2Rpc3RfdHMvaW5kZXguanMKdmFyIHBhcnNlMyA9IHBhcnNlMjsKdmFyIHBhcnNlSnNvbkwgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChqc29ubERhdGEpID0+IHsKICBjb25zdCBsaW5lcyA9IGpzb25sRGF0YS5zcGxpdCgiXG4iKTsKICBjb25zdCBwYXJzZWREYXRhID0gbGluZXMucmVkdWNlKChhY2MsIGxpbmUpID0+IHsKICAgIGNvbnN0IHRyaW1tZWQgPSBsaW5lLnRyaW0oKTsKICAgIGlmICh0cmltbWVkLmxlbmd0aCA+IDApIHsKICAgICAgYWNjLnB1c2gocGFyc2UzKHRyaW1tZWQpKTsKICAgIH0KICAgIHJldHVybiBhY2M7CiAgfSwgW10pOwogIHJldHVybiBwYXJzZWREYXRhOwp9LCAicGFyc2VKc29uTCIpOwp2YXIgc3RyaW5naWZ5SnNvbkwgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChpdGVtcykgPT4gewogIHJldHVybiBpdGVtcy5tYXAoKGl0ZW0pID0+IHN0cmluZ2lmeTIoaXRlbSkpLmpvaW4oIlxuIik7Cn0sICJzdHJpbmdpZnlKc29uTCIpOwp2YXIgc3RhYmxlT25lV2F5U3RyaW5naWZ5ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgob2JqQXJnLCBzaW1wbGVPcmRlckFycmF5LCBvcHRpb25zQXJnID0ge30pID0+IHsKICBjb25zdCB2aXNpdGVkID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrU2V0KCk7CiAgY29uc3Qgc2FuaXRpemUyID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgodmFsKSA9PiB7CiAgICBpZiAodmFsID09PSBudWxsIHx8IHR5cGVvZiB2YWwgIT09ICJvYmplY3QiKSB7CiAgICAgIHJldHVybiB2YWw7CiAgICB9CiAgICBjb25zdCByZXBsYWNlZCA9IHJlcGxhY2VyKCIiLCB2YWwpOwogICAgaWYgKHJlcGxhY2VkICYmIHJlcGxhY2VkLnR5cGUgPT09ICJFbmNvZGVkQnVmZmVyIiAmJiB0eXBlb2YgcmVwbGFjZWQuZGF0YSA9PT0gInN0cmluZyIpIHsKICAgICAgcmV0dXJuIHJlcGxhY2VkOwogICAgfQogICAgaWYgKHZpc2l0ZWQuaGFzKHZhbCkpIHsKICAgICAgcmV0dXJuICJfX2N5Y2xlX18iOwogICAgfQogICAgdmlzaXRlZC5hZGQodmFsKTsKICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHsKICAgICAgcmV0dXJuIHZhbC5tYXAoKGl0ZW0pID0+IHNhbml0aXplMihpdGVtKSk7CiAgICB9CiAgICBjb25zdCBvdXQgPSB7fTsKICAgIGZvciAoY29uc3Qga2V5MiBvZiBPYmplY3Qua2V5cyh2YWwpKSB7CiAgICAgIHRyeSB7CiAgICAgICAgb3V0W2tleTJdID0gc2FuaXRpemUyKHZhbFtrZXkyXSk7CiAgICAgIH0gY2F0Y2ggKGUxMCkgewogICAgICAgIG91dFtrZXkyXSA9ICJfX3Vuc2VyaWFsaXphYmxlX18iOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gb3V0OwogIH0sICJzYW5pdGl6ZSIpOwogIGNvbnN0IG9iaiA9IHNhbml0aXplMihvYmpBcmcpOwogIGNvbnN0IG9wdGlvbnMgPSB7CiAgICAuLi5vcHRpb25zQXJnLAogICAgY3ljbGVzOiB0cnVlCiAgfTsKICBpZiAoc2ltcGxlT3JkZXJBcnJheSAmJiAhb3B0aW9ucy5jbXApIHsKICAgIGNvbnN0IG9yZGVyMiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICBzaW1wbGVPcmRlckFycmF5LmZvckVhY2goKGtleTIsIGlkeCkgPT4gb3JkZXIyLnNldChrZXkyLCBpZHgpKTsKICAgIG9wdGlvbnMuY21wID0gKGE0LCBiNCkgPT4gewogICAgICBjb25zdCBhSWR4ID0gb3JkZXIyLmhhcyhhNC5rZXkpID8gb3JkZXIyLmdldChhNC5rZXkpIDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZOwogICAgICBjb25zdCBiSWR4ID0gb3JkZXIyLmhhcyhiNC5rZXkpID8gb3JkZXIyLmdldChiNC5rZXkpIDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZOwogICAgICBpZiAoYUlkeCAhPT0gYklkeCkKICAgICAgICByZXR1cm4gYUlkeCAtIGJJZHg7CiAgICAgIHJldHVybiBhNC5rZXkgPCBiNC5rZXkgPyAtMSA6IGE0LmtleSA+IGI0LmtleSA/IDEgOiAwOwogICAgfTsKICB9CiAgcmV0dXJuIHN0YWJsZUpzb24ob2JqLCBvcHRpb25zKTsKfSwgInN0YWJsZU9uZVdheVN0cmluZ2lmeSIpOwp2YXIgc3RyaW5naWZ5MiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKG9iakFyZywgc2ltcGxlT3JkZXJBcnJheSwgb3B0aW9uc0FyZyA9IHt9KSA9PiB7CiAgY29uc3QgYnVmZmVyZWRKc29uID0gc3RyaW5naWZ5KG9iakFyZyk7CiAgb2JqQXJnID0gSlNPTi5wYXJzZShidWZmZXJlZEpzb24pOwogIGxldCBvcHRpb25zID0geyAuLi5vcHRpb25zQXJnIH07CiAgaWYgKHNpbXBsZU9yZGVyQXJyYXkgJiYgIW9wdGlvbnMuY21wKSB7CiAgICBjb25zdCBvcmRlcjIgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgc2ltcGxlT3JkZXJBcnJheS5mb3JFYWNoKChrZXkyLCBpZHgpID0+IG9yZGVyMi5zZXQoa2V5MiwgaWR4KSk7CiAgICBvcHRpb25zLmNtcCA9IChhNCwgYjQpID0+IHsKICAgICAgY29uc3QgYUlkeCA9IG9yZGVyMi5oYXMoYTQua2V5KSA/IG9yZGVyMi5nZXQoYTQua2V5KSA6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTsKICAgICAgY29uc3QgYklkeCA9IG9yZGVyMi5oYXMoYjQua2V5KSA/IG9yZGVyMi5nZXQoYjQua2V5KSA6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTsKICAgICAgaWYgKGFJZHggIT09IGJJZHgpCiAgICAgICAgcmV0dXJuIGFJZHggLSBiSWR4OwogICAgICByZXR1cm4gYTQua2V5IDwgYjQua2V5ID8gLTEgOiBhNC5rZXkgPiBiNC5rZXkgPyAxIDogMDsKICAgIH07CiAgfQogIGxldCByZXR1cm5Kc29uID0gc3RhYmxlSnNvbihvYmpBcmcsIG9wdGlvbnMpOwogIHJldHVybiByZXR1cm5Kc29uOwp9LCAic3RyaW5naWZ5Iik7CnZhciBzdHJpbmdpZnlQcmV0dHkgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChvYmplY3RBcmcpID0+IHsKICBjb25zdCBzdHJpbmdpZmllZCA9IHN0cmluZ2lmeTIob2JqZWN0QXJnKTsKICBjb25zdCBvYmplY3QgPSBKU09OLnBhcnNlKHN0cmluZ2lmaWVkKTsKICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqZWN0LCBudWxsLCAyKTsKfSwgInN0cmluZ2lmeVByZXR0eSIpOwp2YXIgc3RyaW5naWZ5QmFzZTY0ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoLi4uYXJncykgPT4gewogIGNvbnN0IHN0cmluZ2lmaWVkUmVzdWx0ID0gc3RyaW5naWZ5MiguLi5hcmdzKTsKICByZXR1cm4gZGlzdF90c19leHBvcnRzMTEuYmFzZTY0LmVuY29kZVVyaShzdHJpbmdpZmllZFJlc3VsdCk7Cn0sICJzdHJpbmdpZnlCYXNlNjQiKTsKdmFyIHBhcnNlQmFzZTY0ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoYmFzZTY0SnNvblN0cmluZ0FyZykgPT4gewogIGNvbnN0IGJhc2U2NDIgPSBkaXN0X3RzX2V4cG9ydHMxMS5iYXNlNjQ7CiAgY29uc3QgZGVjb2RlRm4gPSBiYXNlNjQyLmRlY29kZVVyaSB8fCBiYXNlNjQyLmRlY29kZTsKICBjb25zdCBzaW1wbGVTdHJpbmdpZmllZCA9IGRlY29kZUZuKGJhc2U2NEpzb25TdHJpbmdBcmcpOwogIHJldHVybiBwYXJzZTMoc2ltcGxlU3RyaW5naWZpZWQpOwp9LCAicGFyc2VCYXNlNjQiKTsKdmFyIFNtYXJ0anNvbiA9IGNsYXNzIF9TbWFydGpzb24gewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlNtYXJ0anNvbiIpOwogIH0KICAvKioKICAgKiBlbmZvbGRzIGRhdGEgZnJvbSBhbiBvYmplY3QKICAgKi8KICBzdGF0aWMgZW5mb2xkRnJvbU9iamVjdChvYmplY3RBcmcpIHsKICAgIGNvbnN0IG5ld0luc3RhbmNlID0gbmV3IHRoaXMoKTsKICAgIGNvbnN0IHNhdmVhYmxlcyA9IG5ld0luc3RhbmNlLnNhdmVhYmxlUHJvcGVydGllcyB8fCBbXTsKICAgIGZvciAoY29uc3Qga2V5TmFtZSBpbiBvYmplY3RBcmcpIHsKICAgICAgaWYgKHNhdmVhYmxlcy5pbmRleE9mKGtleU5hbWUpICE9PSAtMSkgewogICAgICAgIG5ld0luc3RhbmNlW2tleU5hbWVdID0gb2JqZWN0QXJnW2tleU5hbWVdOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3SW5zdGFuY2U7CiAgfQogIC8qKgogICAqIGVuZm9sZCBmcm9tIGpzb24KICAgKi8KICBzdGF0aWMgZW5mb2xkRnJvbUpzb24oanNvbkFyZykgewogICAgY29uc3Qgb2JqZWN0RnJvbUpzb24gPSBwYXJzZTMoanNvbkFyZyk7CiAgICByZXR1cm4gdGhpcy5lbmZvbGRGcm9tT2JqZWN0KG9iamVjdEZyb21Kc29uKTsKICB9CiAgLy8gPT09PT09PT0KICAvLyBJTlNUQU5DRQogIC8vID09PT09PT09CiAgc2F2ZWFibGVQcm9wZXJ0aWVzOwogIC8qKgogICAqIGZvbGRzIGEgY2xhc3MgaW50byBhbiBvYmplY3QKICAgKi8KICBmb2xkVG9PYmplY3QoKSB7CiAgICBjb25zdCB0cmFja1NldCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7CiAgICB0cmFja1NldC5hZGQodGhpcyk7CiAgICByZXR1cm4gdGhpcy5mb2xkVG9PYmplY3RJbnRlcm5hbCh0cmFja1NldCk7CiAgfQogIGZvbGRUb09iamVjdEludGVybmFsKHRyYWNrU2V0KSB7CiAgICBjb25zdCByZXN1bHQgPSB7fTsKICAgIGNvbnN0IGZvbGRWYWx1ZSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHZhbCkgPT4gewogICAgICBpZiAodmFsIGluc3RhbmNlb2YgX1NtYXJ0anNvbikgewogICAgICAgIGlmICh0cmFja1NldC5oYXModmFsKSkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJjeWNsZSBkZXRlY3RlZCIpOwogICAgICAgIH0KICAgICAgICB0cmFja1NldC5hZGQodmFsKTsKICAgICAgICByZXR1cm4gdmFsLmZvbGRUb09iamVjdEludGVybmFsKHRyYWNrU2V0KTsKICAgICAgfQogICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7CiAgICAgICAgcmV0dXJuIHZhbC5tYXAoKGl0ZW0pID0+IGZvbGRWYWx1ZShpdGVtKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGltcG9ydF9sb2Rhc2guZGVmYXVsdCh2YWwpOwogICAgfSwgImZvbGRWYWx1ZSIpOwogICAgY29uc3QgcHJvcHMgPSB0aGlzLnNhdmVhYmxlUHJvcGVydGllcyB8fCBbXTsKICAgIGZvciAoY29uc3Qga2V5TmFtZSBvZiBwcm9wcykgewogICAgICBjb25zdCB2YWx1ZTIgPSB0aGlzW2tleU5hbWVdOwogICAgICByZXN1bHRba2V5TmFtZV0gPSBmb2xkVmFsdWUodmFsdWUyKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQogIC8qKgogICAqIGZvbGRzIGEgY2xhc3MgaW50byBhbiBvYmplY3QKICAgKi8KICBmb2xkVG9Kc29uKCkgewogICAgY29uc3QgZm9sZGVkT2JqZWN0ID0gdGhpcy5mb2xkVG9PYmplY3QoKTsKICAgIHJldHVybiBzdHJpbmdpZnkyKGZvbGRlZE9iamVjdCk7CiAgfQp9Owp2YXIgZm9sZERlYyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKCkgPT4gewogIHJldHVybiAoX3ZhbHVlLCBjb250ZXh0MikgPT4gewogICAgY29uc3QgcHJvcGVydHlOYW1lID0gU3RyaW5nKGNvbnRleHQyLm5hbWUpOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIoZnVuY3Rpb24oKSB7CiAgICAgIGlmICghdGhpcy5zYXZlYWJsZVByb3BlcnRpZXMpIHsKICAgICAgICB0aGlzLnNhdmVhYmxlUHJvcGVydGllcyA9IFtdOwogICAgICB9CiAgICAgIGlmICghdGhpcy5zYXZlYWJsZVByb3BlcnRpZXMuaW5jbHVkZXMocHJvcGVydHlOYW1lKSkgewogICAgICAgIHRoaXMuc2F2ZWFibGVQcm9wZXJ0aWVzLnB1c2gocHJvcGVydHlOYW1lKTsKICAgICAgfQogICAgfSk7CiAgfTsKfSwgImZvbGREZWMiKTsKdmFyIGRlZXBFcXVhbE9iamVjdHMgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChvYmplY3QxLCBvYmplY3QyKSA9PiB7CiAgY29uc3Qgb2JqZWN0MVN0cmluZyA9IHN0cmluZ2lmeTIob2JqZWN0MSk7CiAgY29uc3Qgb2JqZWN0MlN0cmluZyA9IHN0cmluZ2lmeTIob2JqZWN0Mik7CiAgcmV0dXJuIG9iamVjdDFTdHJpbmcgPT09IG9iamVjdDJTdHJpbmc7Cn0sICJkZWVwRXF1YWxPYmplY3RzIik7CnZhciBkZWVwRXF1YWxKc29uTFN0cmluZ3MgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChqc29uTFN0cmluZzEsIGpzb25MU3RyaW5nMikgPT4gewogIGNvbnN0IGZpcnN0QXJyYXkgPSBwYXJzZUpzb25MKGpzb25MU3RyaW5nMSk7CiAgY29uc3Qgc2Vjb25kQXJyYXkgPSBwYXJzZUpzb25MKGpzb25MU3RyaW5nMik7CiAgcmV0dXJuIGRlZXBFcXVhbE9iamVjdHMoZmlyc3RBcnJheSwgc2Vjb25kQXJyYXkpOwp9LCAiZGVlcEVxdWFsSnNvbkxTdHJpbmdzIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrd2Vic3RvcmVAMi4wLjIxL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJzdG9yZS9kaXN0X3RzL2luZGV4LmpzCnZhciBkaXN0X3RzX2V4cG9ydHMxMyA9IHt9OwpfX2V4cG9ydChkaXN0X3RzX2V4cG9ydHMxMywgewogIFR5cGVkcmVxdWVzdENhY2hlOiAoKSA9PiBUeXBlZHJlcXVlc3RDYWNoZSwKICBXZWJTdG9yZTogKCkgPT4gV2ViU3RvcmUKfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vaWRiQDguMC4zL25vZGVfbW9kdWxlcy9pZGIvYnVpbGQvaW5kZXguanMKdmFyIGJ1aWxkX2V4cG9ydHMgPSB7fTsKX19leHBvcnQoYnVpbGRfZXhwb3J0cywgewogIGRlbGV0ZURCOiAoKSA9PiBkZWxldGVEQiwKICBvcGVuREI6ICgpID0+IG9wZW5EQiwKICB1bndyYXA6ICgpID0+IHVud3JhcCwKICB3cmFwOiAoKSA9PiB3cmFwCn0pOwp2YXIgaW5zdGFuY2VPZkFueSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKG9iamVjdCwgY29uc3RydWN0b3JzKSA9PiBjb25zdHJ1Y3RvcnMuc29tZSgoYzEwKSA9PiBvYmplY3QgaW5zdGFuY2VvZiBjMTApLCAiaW5zdGFuY2VPZkFueSIpOwp2YXIgaWRiUHJveHlhYmxlVHlwZXM7CnZhciBjdXJzb3JBZHZhbmNlTWV0aG9kczsKZnVuY3Rpb24gZ2V0SWRiUHJveHlhYmxlVHlwZXMoKSB7CiAgcmV0dXJuIGlkYlByb3h5YWJsZVR5cGVzIHx8IChpZGJQcm94eWFibGVUeXBlcyA9IFsKICAgIElEQkRhdGFiYXNlLAogICAgSURCT2JqZWN0U3RvcmUsCiAgICBJREJJbmRleCwKICAgIElEQkN1cnNvciwKICAgIElEQlRyYW5zYWN0aW9uCiAgXSk7Cn0KX19uYW1lKGdldElkYlByb3h5YWJsZVR5cGVzLCAiZ2V0SWRiUHJveHlhYmxlVHlwZXMiKTsKZnVuY3Rpb24gZ2V0Q3Vyc29yQWR2YW5jZU1ldGhvZHMoKSB7CiAgcmV0dXJuIGN1cnNvckFkdmFuY2VNZXRob2RzIHx8IChjdXJzb3JBZHZhbmNlTWV0aG9kcyA9IFsKICAgIElEQkN1cnNvci5wcm90b3R5cGUuYWR2YW5jZSwKICAgIElEQkN1cnNvci5wcm90b3R5cGUuY29udGludWUsCiAgICBJREJDdXJzb3IucHJvdG90eXBlLmNvbnRpbnVlUHJpbWFyeUtleQogIF0pOwp9Cl9fbmFtZShnZXRDdXJzb3JBZHZhbmNlTWV0aG9kcywgImdldEN1cnNvckFkdmFuY2VNZXRob2RzIik7CnZhciB0cmFuc2FjdGlvbkRvbmVNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTsKdmFyIHRyYW5zZm9ybUNhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7CnZhciByZXZlcnNlVHJhbnNmb3JtQ2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTsKZnVuY3Rpb24gcHJvbWlzaWZ5UmVxdWVzdChyZXF1ZXN0KSB7CiAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlMiwgcmVqZWN0KSA9PiB7CiAgICBjb25zdCB1bmxpc3RlbiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKCkgPT4gewogICAgICByZXF1ZXN0LnJlbW92ZUV2ZW50TGlzdGVuZXIoInN1Y2Nlc3MiLCBzdWNjZXNzKTsKICAgICAgcmVxdWVzdC5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsIGVycm9yKTsKICAgIH0sICJ1bmxpc3RlbiIpOwogICAgY29uc3Qgc3VjY2VzcyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKCkgPT4gewogICAgICByZXNvbHZlMih3cmFwKHJlcXVlc3QucmVzdWx0KSk7CiAgICAgIHVubGlzdGVuKCk7CiAgICB9LCAic3VjY2VzcyIpOwogICAgY29uc3QgZXJyb3IgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCgpID0+IHsKICAgICAgcmVqZWN0KHJlcXVlc3QuZXJyb3IpOwogICAgICB1bmxpc3RlbigpOwogICAgfSwgImVycm9yIik7CiAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoInN1Y2Nlc3MiLCBzdWNjZXNzKTsKICAgIHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLCBlcnJvcik7CiAgfSk7CiAgcmV2ZXJzZVRyYW5zZm9ybUNhY2hlLnNldChwcm9taXNlLCByZXF1ZXN0KTsKICByZXR1cm4gcHJvbWlzZTsKfQpfX25hbWUocHJvbWlzaWZ5UmVxdWVzdCwgInByb21pc2lmeVJlcXVlc3QiKTsKZnVuY3Rpb24gY2FjaGVEb25lUHJvbWlzZUZvclRyYW5zYWN0aW9uKHR4KSB7CiAgaWYgKHRyYW5zYWN0aW9uRG9uZU1hcC5oYXModHgpKQogICAgcmV0dXJuOwogIGNvbnN0IGRvbmUgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZTIsIHJlamVjdCkgPT4gewogICAgY29uc3QgdW5saXN0ZW4gPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCgpID0+IHsKICAgICAgdHgucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLCBjb21wbGV0ZSk7CiAgICAgIHR4LnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIiwgZXJyb3IpOwogICAgICB0eC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsIGVycm9yKTsKICAgIH0sICJ1bmxpc3RlbiIpOwogICAgY29uc3QgY29tcGxldGUgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCgpID0+IHsKICAgICAgcmVzb2x2ZTIoKTsKICAgICAgdW5saXN0ZW4oKTsKICAgIH0sICJjb21wbGV0ZSIpOwogICAgY29uc3QgZXJyb3IgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCgpID0+IHsKICAgICAgcmVqZWN0KHR4LmVycm9yIHx8IG5ldyBET01FeGNlcHRpb24oIkFib3J0RXJyb3IiLCAiQWJvcnRFcnJvciIpKTsKICAgICAgdW5saXN0ZW4oKTsKICAgIH0sICJlcnJvciIpOwogICAgdHguYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLCBjb21wbGV0ZSk7CiAgICB0eC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsIGVycm9yKTsKICAgIHR4LmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IiwgZXJyb3IpOwogIH0pOwogIHRyYW5zYWN0aW9uRG9uZU1hcC5zZXQodHgsIGRvbmUpOwp9Cl9fbmFtZShjYWNoZURvbmVQcm9taXNlRm9yVHJhbnNhY3Rpb24sICJjYWNoZURvbmVQcm9taXNlRm9yVHJhbnNhY3Rpb24iKTsKdmFyIGlkYlByb3h5VHJhcHMgPSB7CiAgZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpIHsKICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBJREJUcmFuc2FjdGlvbikgewogICAgICBpZiAocHJvcCA9PT0gImRvbmUiKQogICAgICAgIHJldHVybiB0cmFuc2FjdGlvbkRvbmVNYXAuZ2V0KHRhcmdldCk7CiAgICAgIGlmIChwcm9wID09PSAic3RvcmUiKSB7CiAgICAgICAgcmV0dXJuIHJlY2VpdmVyLm9iamVjdFN0b3JlTmFtZXNbMV0gPyB2b2lkIDAgOiByZWNlaXZlci5vYmplY3RTdG9yZShyZWNlaXZlci5vYmplY3RTdG9yZU5hbWVzWzBdKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHdyYXAodGFyZ2V0W3Byb3BdKTsKICB9LAogIHNldCh0YXJnZXQsIHByb3AsIHZhbHVlMikgewogICAgdGFyZ2V0W3Byb3BdID0gdmFsdWUyOwogICAgcmV0dXJuIHRydWU7CiAgfSwKICBoYXModGFyZ2V0LCBwcm9wKSB7CiAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgSURCVHJhbnNhY3Rpb24gJiYgKHByb3AgPT09ICJkb25lIiB8fCBwcm9wID09PSAic3RvcmUiKSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBwcm9wIGluIHRhcmdldDsKICB9Cn07CmZ1bmN0aW9uIHJlcGxhY2VUcmFwcyhjYWxsYmFjaykgewogIGlkYlByb3h5VHJhcHMgPSBjYWxsYmFjayhpZGJQcm94eVRyYXBzKTsKfQpfX25hbWUocmVwbGFjZVRyYXBzLCAicmVwbGFjZVRyYXBzIik7CmZ1bmN0aW9uIHdyYXBGdW5jdGlvbihmdW5jKSB7CiAgaWYgKGdldEN1cnNvckFkdmFuY2VNZXRob2RzKCkuaW5jbHVkZXMoZnVuYykpIHsKICAgIHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7CiAgICAgIGZ1bmMuYXBwbHkodW53cmFwKHRoaXMpLCBhcmdzKTsKICAgICAgcmV0dXJuIHdyYXAodGhpcy5yZXF1ZXN0KTsKICAgIH07CiAgfQogIHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7CiAgICByZXR1cm4gd3JhcChmdW5jLmFwcGx5KHVud3JhcCh0aGlzKSwgYXJncykpOwogIH07Cn0KX19uYW1lKHdyYXBGdW5jdGlvbiwgIndyYXBGdW5jdGlvbiIpOwpmdW5jdGlvbiB0cmFuc2Zvcm1DYWNoYWJsZVZhbHVlKHZhbHVlMikgewogIGlmICh0eXBlb2YgdmFsdWUyID09PSAiZnVuY3Rpb24iKQogICAgcmV0dXJuIHdyYXBGdW5jdGlvbih2YWx1ZTIpOwogIGlmICh2YWx1ZTIgaW5zdGFuY2VvZiBJREJUcmFuc2FjdGlvbikKICAgIGNhY2hlRG9uZVByb21pc2VGb3JUcmFuc2FjdGlvbih2YWx1ZTIpOwogIGlmIChpbnN0YW5jZU9mQW55KHZhbHVlMiwgZ2V0SWRiUHJveHlhYmxlVHlwZXMoKSkpCiAgICByZXR1cm4gbmV3IFByb3h5KHZhbHVlMiwgaWRiUHJveHlUcmFwcyk7CiAgcmV0dXJuIHZhbHVlMjsKfQpfX25hbWUodHJhbnNmb3JtQ2FjaGFibGVWYWx1ZSwgInRyYW5zZm9ybUNhY2hhYmxlVmFsdWUiKTsKZnVuY3Rpb24gd3JhcCh2YWx1ZTIpIHsKICBpZiAodmFsdWUyIGluc3RhbmNlb2YgSURCUmVxdWVzdCkKICAgIHJldHVybiBwcm9taXNpZnlSZXF1ZXN0KHZhbHVlMik7CiAgaWYgKHRyYW5zZm9ybUNhY2hlLmhhcyh2YWx1ZTIpKQogICAgcmV0dXJuIHRyYW5zZm9ybUNhY2hlLmdldCh2YWx1ZTIpOwogIGNvbnN0IG5ld1ZhbHVlID0gdHJhbnNmb3JtQ2FjaGFibGVWYWx1ZSh2YWx1ZTIpOwogIGlmIChuZXdWYWx1ZSAhPT0gdmFsdWUyKSB7CiAgICB0cmFuc2Zvcm1DYWNoZS5zZXQodmFsdWUyLCBuZXdWYWx1ZSk7CiAgICByZXZlcnNlVHJhbnNmb3JtQ2FjaGUuc2V0KG5ld1ZhbHVlLCB2YWx1ZTIpOwogIH0KICByZXR1cm4gbmV3VmFsdWU7Cn0KX19uYW1lKHdyYXAsICJ3cmFwIik7CnZhciB1bndyYXAgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh2YWx1ZTIpID0+IHJldmVyc2VUcmFuc2Zvcm1DYWNoZS5nZXQodmFsdWUyKSwgInVud3JhcCIpOwpmdW5jdGlvbiBvcGVuREIobmFtZSwgdmVyc2lvbjIsIHsgYmxvY2tlZCwgdXBncmFkZSwgYmxvY2tpbmcsIHRlcm1pbmF0ZWQgfSA9IHt9KSB7CiAgY29uc3QgcmVxdWVzdCA9IGluZGV4ZWREQi5vcGVuKG5hbWUsIHZlcnNpb24yKTsKICBjb25zdCBvcGVuUHJvbWlzZSA9IHdyYXAocmVxdWVzdCk7CiAgaWYgKHVwZ3JhZGUpIHsKICAgIHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcigidXBncmFkZW5lZWRlZCIsIChldmVudCkgPT4gewogICAgICB1cGdyYWRlKHdyYXAocmVxdWVzdC5yZXN1bHQpLCBldmVudC5vbGRWZXJzaW9uLCBldmVudC5uZXdWZXJzaW9uLCB3cmFwKHJlcXVlc3QudHJhbnNhY3Rpb24pLCBldmVudCk7CiAgICB9KTsKICB9CiAgaWYgKGJsb2NrZWQpIHsKICAgIHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcigiYmxvY2tlZCIsIChldmVudCkgPT4gYmxvY2tlZCgKICAgICAgLy8gQ2FzdGluZyBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0LURPTS1saWItZ2VuZXJhdG9yL3B1bGwvMTQwNQogICAgICBldmVudC5vbGRWZXJzaW9uLAogICAgICBldmVudC5uZXdWZXJzaW9uLAogICAgICBldmVudAogICAgKSk7CiAgfQogIG9wZW5Qcm9taXNlLnRoZW4oKGRiKSA9PiB7CiAgICBpZiAodGVybWluYXRlZCkKICAgICAgZGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xvc2UiLCAoKSA9PiB0ZXJtaW5hdGVkKCkpOwogICAgaWYgKGJsb2NraW5nKSB7CiAgICAgIGRiLmFkZEV2ZW50TGlzdGVuZXIoInZlcnNpb25jaGFuZ2UiLCAoZXZlbnQpID0+IGJsb2NraW5nKGV2ZW50Lm9sZFZlcnNpb24sIGV2ZW50Lm5ld1ZlcnNpb24sIGV2ZW50KSk7CiAgICB9CiAgfSkuY2F0Y2goKCkgPT4gewogIH0pOwogIHJldHVybiBvcGVuUHJvbWlzZTsKfQpfX25hbWUob3BlbkRCLCAib3BlbkRCIik7CmZ1bmN0aW9uIGRlbGV0ZURCKG5hbWUsIHsgYmxvY2tlZCB9ID0ge30pIHsKICBjb25zdCByZXF1ZXN0ID0gaW5kZXhlZERCLmRlbGV0ZURhdGFiYXNlKG5hbWUpOwogIGlmIChibG9ja2VkKSB7CiAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoImJsb2NrZWQiLCAoZXZlbnQpID0+IGJsb2NrZWQoCiAgICAgIC8vIENhc3RpbmcgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC1ET00tbGliLWdlbmVyYXRvci9wdWxsLzE0MDUKICAgICAgZXZlbnQub2xkVmVyc2lvbiwKICAgICAgZXZlbnQKICAgICkpOwogIH0KICByZXR1cm4gd3JhcChyZXF1ZXN0KS50aGVuKCgpID0+IHZvaWQgMCk7Cn0KX19uYW1lKGRlbGV0ZURCLCAiZGVsZXRlREIiKTsKdmFyIHJlYWRNZXRob2RzID0gWyJnZXQiLCAiZ2V0S2V5IiwgImdldEFsbCIsICJnZXRBbGxLZXlzIiwgImNvdW50Il07CnZhciB3cml0ZU1ldGhvZHMgPSBbInB1dCIsICJhZGQiLCAiZGVsZXRlIiwgImNsZWFyIl07CnZhciBjYWNoZWRNZXRob2RzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKZnVuY3Rpb24gZ2V0TWV0aG9kKHRhcmdldCwgcHJvcCkgewogIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIElEQkRhdGFiYXNlICYmICEocHJvcCBpbiB0YXJnZXQpICYmIHR5cGVvZiBwcm9wID09PSAic3RyaW5nIikpIHsKICAgIHJldHVybjsKICB9CiAgaWYgKGNhY2hlZE1ldGhvZHMuZ2V0KHByb3ApKQogICAgcmV0dXJuIGNhY2hlZE1ldGhvZHMuZ2V0KHByb3ApOwogIGNvbnN0IHRhcmdldEZ1bmNOYW1lID0gcHJvcC5yZXBsYWNlKC9Gcm9tSW5kZXgkLywgIiIpOwogIGNvbnN0IHVzZUluZGV4ID0gcHJvcCAhPT0gdGFyZ2V0RnVuY05hbWU7CiAgY29uc3QgaXNXcml0ZSA9IHdyaXRlTWV0aG9kcy5pbmNsdWRlcyh0YXJnZXRGdW5jTmFtZSk7CiAgaWYgKAogICAgLy8gQmFpbCBpZiB0aGUgdGFyZ2V0IGRvZXNuJ3QgZXhpc3Qgb24gdGhlIHRhcmdldC4gRWcsIGdldEFsbCBpc24ndCBpbiBFZGdlLgogICAgISh0YXJnZXRGdW5jTmFtZSBpbiAodXNlSW5kZXggPyBJREJJbmRleCA6IElEQk9iamVjdFN0b3JlKS5wcm90b3R5cGUpIHx8ICEoaXNXcml0ZSB8fCByZWFkTWV0aG9kcy5pbmNsdWRlcyh0YXJnZXRGdW5jTmFtZSkpCiAgKSB7CiAgICByZXR1cm47CiAgfQogIGNvbnN0IG1ldGhvZCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoYXN5bmMgZnVuY3Rpb24oc3RvcmVOYW1lLCAuLi5hcmdzKSB7CiAgICBjb25zdCB0eCA9IHRoaXMudHJhbnNhY3Rpb24oc3RvcmVOYW1lLCBpc1dyaXRlID8gInJlYWR3cml0ZSIgOiAicmVhZG9ubHkiKTsKICAgIGxldCB0YXJnZXQyID0gdHguc3RvcmU7CiAgICBpZiAodXNlSW5kZXgpCiAgICAgIHRhcmdldDIgPSB0YXJnZXQyLmluZGV4KGFyZ3Muc2hpZnQoKSk7CiAgICByZXR1cm4gKGF3YWl0IFByb21pc2UuYWxsKFsKICAgICAgdGFyZ2V0Mlt0YXJnZXRGdW5jTmFtZV0oLi4uYXJncyksCiAgICAgIGlzV3JpdGUgJiYgdHguZG9uZQogICAgXSkpWzBdOwogIH0sICJtZXRob2QiKTsKICBjYWNoZWRNZXRob2RzLnNldChwcm9wLCBtZXRob2QpOwogIHJldHVybiBtZXRob2Q7Cn0KX19uYW1lKGdldE1ldGhvZCwgImdldE1ldGhvZCIpOwpyZXBsYWNlVHJhcHMoKG9sZFRyYXBzKSA9PiAoewogIC4uLm9sZFRyYXBzLAogIGdldDogLyogQF9fUFVSRV9fICovIF9fbmFtZSgodGFyZ2V0LCBwcm9wLCByZWNlaXZlcikgPT4gZ2V0TWV0aG9kKHRhcmdldCwgcHJvcCkgfHwgb2xkVHJhcHMuZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpLCAiZ2V0IiksCiAgaGFzOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh0YXJnZXQsIHByb3ApID0+ICEhZ2V0TWV0aG9kKHRhcmdldCwgcHJvcCkgfHwgb2xkVHJhcHMuaGFzKHRhcmdldCwgcHJvcCksICJoYXMiKQp9KSk7CnZhciBhZHZhbmNlTWV0aG9kUHJvcHMgPSBbImNvbnRpbnVlIiwgImNvbnRpbnVlUHJpbWFyeUtleSIsICJhZHZhbmNlIl07CnZhciBtZXRob2RNYXAgPSB7fTsKdmFyIGFkdmFuY2VSZXN1bHRzID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7CnZhciBpdHRyUHJveGllZEN1cnNvclRvT3JpZ2luYWxQcm94eSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpOwp2YXIgY3Vyc29ySXRlcmF0b3JUcmFwcyA9IHsKICBnZXQodGFyZ2V0LCBwcm9wKSB7CiAgICBpZiAoIWFkdmFuY2VNZXRob2RQcm9wcy5pbmNsdWRlcyhwcm9wKSkKICAgICAgcmV0dXJuIHRhcmdldFtwcm9wXTsKICAgIGxldCBjYWNoZWRGdW5jID0gbWV0aG9kTWFwW3Byb3BdOwogICAgaWYgKCFjYWNoZWRGdW5jKSB7CiAgICAgIGNhY2hlZEZ1bmMgPSBtZXRob2RNYXBbcHJvcF0gPSBmdW5jdGlvbiguLi5hcmdzKSB7CiAgICAgICAgYWR2YW5jZVJlc3VsdHMuc2V0KHRoaXMsIGl0dHJQcm94aWVkQ3Vyc29yVG9PcmlnaW5hbFByb3h5LmdldCh0aGlzKVtwcm9wXSguLi5hcmdzKSk7CiAgICAgIH07CiAgICB9CiAgICByZXR1cm4gY2FjaGVkRnVuYzsKICB9Cn07CmFzeW5jIGZ1bmN0aW9uKiBpdGVyYXRlKC4uLmFyZ3MpIHsKICBsZXQgY3Vyc29yID0gdGhpczsKICBpZiAoIShjdXJzb3IgaW5zdGFuY2VvZiBJREJDdXJzb3IpKSB7CiAgICBjdXJzb3IgPSBhd2FpdCBjdXJzb3Iub3BlbkN1cnNvciguLi5hcmdzKTsKICB9CiAgaWYgKCFjdXJzb3IpCiAgICByZXR1cm47CiAgY3Vyc29yID0gY3Vyc29yOwogIGNvbnN0IHByb3hpZWRDdXJzb3IgPSBuZXcgUHJveHkoY3Vyc29yLCBjdXJzb3JJdGVyYXRvclRyYXBzKTsKICBpdHRyUHJveGllZEN1cnNvclRvT3JpZ2luYWxQcm94eS5zZXQocHJveGllZEN1cnNvciwgY3Vyc29yKTsKICByZXZlcnNlVHJhbnNmb3JtQ2FjaGUuc2V0KHByb3hpZWRDdXJzb3IsIHVud3JhcChjdXJzb3IpKTsKICB3aGlsZSAoY3Vyc29yKSB7CiAgICB5aWVsZCBwcm94aWVkQ3Vyc29yOwogICAgY3Vyc29yID0gYXdhaXQgKGFkdmFuY2VSZXN1bHRzLmdldChwcm94aWVkQ3Vyc29yKSB8fCBjdXJzb3IuY29udGludWUoKSk7CiAgICBhZHZhbmNlUmVzdWx0cy5kZWxldGUocHJveGllZEN1cnNvcik7CiAgfQp9Cl9fbmFtZShpdGVyYXRlLCAiaXRlcmF0ZSIpOwpmdW5jdGlvbiBpc0l0ZXJhdG9yUHJvcCh0YXJnZXQsIHByb3ApIHsKICByZXR1cm4gcHJvcCA9PT0gU3ltYm9sLmFzeW5jSXRlcmF0b3IgJiYgaW5zdGFuY2VPZkFueSh0YXJnZXQsIFtJREJJbmRleCwgSURCT2JqZWN0U3RvcmUsIElEQkN1cnNvcl0pIHx8IHByb3AgPT09ICJpdGVyYXRlIiAmJiBpbnN0YW5jZU9mQW55KHRhcmdldCwgW0lEQkluZGV4LCBJREJPYmplY3RTdG9yZV0pOwp9Cl9fbmFtZShpc0l0ZXJhdG9yUHJvcCwgImlzSXRlcmF0b3JQcm9wIik7CnJlcGxhY2VUcmFwcygob2xkVHJhcHMpID0+ICh7CiAgLi4ub2xkVHJhcHMsCiAgZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpIHsKICAgIGlmIChpc0l0ZXJhdG9yUHJvcCh0YXJnZXQsIHByb3ApKQogICAgICByZXR1cm4gaXRlcmF0ZTsKICAgIHJldHVybiBvbGRUcmFwcy5nZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcik7CiAgfSwKICBoYXModGFyZ2V0LCBwcm9wKSB7CiAgICByZXR1cm4gaXNJdGVyYXRvclByb3AodGFyZ2V0LCBwcm9wKSB8fCBvbGRUcmFwcy5oYXModGFyZ2V0LCBwcm9wKTsKICB9Cn0pKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJzdG9yZUAyLjAuMjEvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnN0b3JlL2Rpc3RfdHMvd2Vic3RvcmUuY2xhc3Nlcy53ZWJzdG9yZS5qcwp2YXIgV2ViU3RvcmUgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiV2ViU3RvcmUiKTsKICB9CiAgY29uc3RydWN0b3Iob3B0aW9uc0FyZykgewogICAgdGhpcy5pbml0Q2FsbGVkID0gZmFsc2U7CiAgICB0aGlzLnJlYWR5RGVmZXJyZWQgPSBkaXN0X3RzX2V4cG9ydHMuZGVmZXIoKTsKICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNBcmc7CiAgfQogIGFzeW5jIGluaXQoKSB7CiAgICBpZiAodGhpcy5pbml0Q2FsbGVkKSB7CiAgICAgIGF3YWl0IHRoaXMucmVhZHlEZWZlcnJlZC5wcm9taXNlOwogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLmluaXRDYWxsZWQgPSB0cnVlOwogICAgY29uc3Qgc21hcnRlbnYgPSBuZXcgZGlzdF90c19leHBvcnRzMTAuU21hcnRlbnYoKTsKICAgIGlmICghc21hcnRlbnYuaXNCcm93c2VyICYmICFnbG9iYWxUaGlzLmluZGV4ZWREQikgewogICAgICBjb25zb2xlLmxvZygiaGV5Iik7CiAgICAgIGNvbnNvbGUubG9nKGdsb2JhbFRoaXMuaW5kZXhlZERCKTsKICAgICAgYXdhaXQgc21hcnRlbnYuZ2V0U2FmZU5vZGVNb2R1bGUoImZha2UtaW5kZXhlZGRiL2F1dG8iKTsKICAgICAgaWYgKCFnbG9iYWxUaGlzLmluZGV4ZWREQikgewogICAgICAgIGNvbnN0IG1vZCA9IGF3YWl0IHNtYXJ0ZW52LmdldFNhZmVOb2RlTW9kdWxlKCJmYWtlLWluZGV4ZWRkYiIpOwogICAgICAgIGdsb2JhbFRoaXMuaW5kZXhlZERCID0gbmV3IG1vZC5JREJGYWN0b3J5KCk7CiAgICAgIH0KICAgIH0KICAgIHRoaXMuZGIgPSBhd2FpdCBidWlsZF9leHBvcnRzLm9wZW5EQih0aGlzLm9wdGlvbnMuZGJOYW1lLCAxLCB7CiAgICAgIHVwZ3JhZGU6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGRiKSA9PiB7CiAgICAgICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUodGhpcy5vcHRpb25zLnN0b3JlTmFtZSk7CiAgICAgIH0sICJ1cGdyYWRlIikKICAgIH0pOwogICAgdGhpcy5yZWFkeURlZmVycmVkLnJlc29sdmUoKTsKICAgIHJldHVybjsKICB9CiAgYXN5bmMgZ2V0KGtleTIpIHsKICAgIGF3YWl0IHRoaXMuaW5pdCgpOwogICAgcmV0dXJuIHRoaXMuZGIuZ2V0KHRoaXMub3B0aW9ucy5zdG9yZU5hbWUsIGtleTIpOwogIH0KICBhc3luYyBjaGVjayhrZXlBcmcpIHsKICAgIGF3YWl0IHRoaXMuaW5pdCgpOwogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXQoa2V5QXJnKTsKICAgIHJldHVybiAhIXJlc3VsdDsKICB9CiAgYXN5bmMgc2V0KGtleTIsIHZhbCkgewogICAgYXdhaXQgdGhpcy5pbml0KCk7CiAgICByZXR1cm4gdGhpcy5kYi5wdXQodGhpcy5vcHRpb25zLnN0b3JlTmFtZSwgdmFsLCBrZXkyKTsKICB9CiAgYXN5bmMgZGVsZXRlKGtleTIpIHsKICAgIGF3YWl0IHRoaXMuaW5pdCgpOwogICAgcmV0dXJuIHRoaXMuZGIuZGVsZXRlKHRoaXMub3B0aW9ucy5zdG9yZU5hbWUsIGtleTIpOwogIH0KICBhc3luYyBjbGVhcigpIHsKICAgIGF3YWl0IHRoaXMuaW5pdCgpOwogICAgcmV0dXJuIHRoaXMuZGIuY2xlYXIodGhpcy5vcHRpb25zLnN0b3JlTmFtZSk7CiAgfQogIGFzeW5jIGtleXMoKSB7CiAgICBhd2FpdCB0aGlzLmluaXQoKTsKICAgIHJldHVybiB0aGlzLmRiLmdldEFsbEtleXModGhpcy5vcHRpb25zLnN0b3JlTmFtZSk7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnN0b3JlQDIuMC4yMS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2Vic3RvcmUvZGlzdF90cy93ZWJzdG9yZS5jbGFzc2VzLnR5cGVkcmVxdWVzdGNhY2hlLmpzCnZhciBUeXBlZHJlcXVlc3RDYWNoZSA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJUeXBlZHJlcXVlc3RDYWNoZSIpOwogIH0KICBjb25zdHJ1Y3Rvcihkb21haW5BcmcgPSAiZGVmYXVsdCIpIHsKICAgIHRoaXMud2Vic3RvcmUgPSBuZXcgV2ViU3RvcmUoewogICAgICBkYk5hbWU6ICJ0clN0b3JlIiwKICAgICAgc3RvcmVOYW1lOiBgdHJTdG9yZS0ke2RvbWFpbkFyZ31gCiAgICB9KTsKICB9CiAgYnVpbGRLZXkocmVxdWVzdEFyZykgewogICAgcmV0dXJuIGRpc3RfdHNfZXhwb3J0czEyLnN0cmluZ2lmeSh7CiAgICAgIG1ldGhvZDogcmVxdWVzdEFyZy5tZXRob2QsCiAgICAgIHJlcXVlc3Q6IHJlcXVlc3RBcmcucmVxdWVzdAogICAgfSk7CiAgfQogIC8qKgogICAqIHN0b3JlcyBieSByZXF1ZXN0CiAgICogQHBhcmFtIHR5cGVkcmVxdWVzdGFyZwogICAqLwogIGFzeW5jIHNldEJ5UmVxdWVzdCh0eXBlZHJlcXVlc3RBcmcpIHsKICAgIGlmICghdHlwZWRyZXF1ZXN0QXJnLnJlc3BvbnNlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiWW91IGNhbm5vdCBzdG9yZSByZXF1ZXN0cyB3aXRob3V0IGEgcmVzcG9uc2UgcHJlc2VudCIpOwogICAgfQogICAgYXdhaXQgdGhpcy53ZWJzdG9yZS5zZXQodGhpcy5idWlsZEtleSh0eXBlZHJlcXVlc3RBcmcpLCB0eXBlZHJlcXVlc3RBcmcpOwogIH0KICAvKioKICAgKiBnZXQgYnkgZnVsbCB0eW9lZHJlcXVlc3QgYnkgcGFydGlhbCB0eXBlZHJlcXVlc3QKICAgKiBAcGFyYW0gdHlwZWRyZXF1ZXN0YXJnCiAgICovCiAgYXN5bmMgZ2V0QnlSZXF1ZXN0KHR5cGVkcmVxdWVzdEFyZykgewogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy53ZWJzdG9yZS5nZXQodGhpcy5idWlsZEtleSh0eXBlZHJlcXVlc3RBcmcpKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnJlcXVlc3RANC4wLjUvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnJlcXVlc3QvZGlzdF90cy9jYWNoZS9jYWNoZS5zdG9yZS5qcwp2YXIgQ2FjaGVTdG9yZSA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJDYWNoZVN0b3JlIik7CiAgfQogIGNvbnN0cnVjdG9yKGRiTmFtZSA9ICJ3ZWJyZXF1ZXN0LXY0Iiwgc3RvcmVOYW1lID0gImNhY2hlIikgewogICAgdGhpcy53ZWJzdG9yZSA9IG5ldyBkaXN0X3RzX2V4cG9ydHMxMy5XZWJTdG9yZSh7CiAgICAgIGRiTmFtZSwKICAgICAgc3RvcmVOYW1lCiAgICB9KTsKICAgIHRoaXMuaW5pdFByb21pc2UgPSB0aGlzLmluaXQoKTsKICB9CiAgLyoqCiAgICogSW5pdGlhbGl6ZSB0aGUgc3RvcmUKICAgKi8KICBhc3luYyBpbml0KCkgewogIH0KICAvKioKICAgKiBHZW5lcmF0ZSBhIGNhY2hlIGtleSBmcm9tIGEgcmVxdWVzdAogICAqLwogIGdlbmVyYXRlQ2FjaGVLZXkocmVxdWVzdCkgewogICAgY29uc3QgdXJsID0gcmVxdWVzdC51cmw7CiAgICBjb25zdCBtZXRob2QgPSByZXF1ZXN0Lm1ldGhvZDsKICAgIGlmIChtZXRob2QgPT09ICJHRVQiKSB7CiAgICAgIHJldHVybiB1cmw7CiAgICB9CiAgICByZXR1cm4gYCR7bWV0aG9kfToke3VybH1gOwogIH0KICAvKioKICAgKiBTdG9yZSBhIHJlc3BvbnNlIGluIHRoZSBjYWNoZQogICAqLwogIGFzeW5jIHNldChjYWNoZUtleSwgZW50cnkpIHsKICAgIGF3YWl0IHRoaXMuaW5pdFByb21pc2U7CiAgICBhd2FpdCB0aGlzLndlYnN0b3JlLnNldChjYWNoZUtleSwgZW50cnkpOwogIH0KICAvKioKICAgKiBSZXRyaWV2ZSBhIGNhY2hlZCByZXNwb25zZQogICAqLwogIGFzeW5jIGdldChjYWNoZUtleSkgewogICAgYXdhaXQgdGhpcy5pbml0UHJvbWlzZTsKICAgIHRyeSB7CiAgICAgIGNvbnN0IGVudHJ5ID0gYXdhaXQgdGhpcy53ZWJzdG9yZS5nZXQoY2FjaGVLZXkpOwogICAgICByZXR1cm4gZW50cnkgfHwgbnVsbDsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KICAvKioKICAgKiBDaGVjayBpZiBhIGNhY2hlIGVudHJ5IGV4aXN0cwogICAqLwogIGFzeW5jIGhhcyhjYWNoZUtleSkgewogICAgYXdhaXQgdGhpcy5pbml0UHJvbWlzZTsKICAgIHJldHVybiBhd2FpdCB0aGlzLndlYnN0b3JlLmNoZWNrKGNhY2hlS2V5KTsKICB9CiAgLyoqCiAgICogRGVsZXRlIGEgY2FjaGUgZW50cnkKICAgKi8KICBhc3luYyBkZWxldGUoY2FjaGVLZXkpIHsKICAgIGF3YWl0IHRoaXMuaW5pdFByb21pc2U7CiAgICBhd2FpdCB0aGlzLndlYnN0b3JlLmRlbGV0ZShjYWNoZUtleSk7CiAgfQogIC8qKgogICAqIENsZWFyIGFsbCBjYWNoZSBlbnRyaWVzCiAgICovCiAgYXN5bmMgY2xlYXIoKSB7CiAgICBhd2FpdCB0aGlzLmluaXRQcm9taXNlOwogICAgYXdhaXQgdGhpcy53ZWJzdG9yZS5jbGVhcigpOwogIH0KICAvKioKICAgKiBDcmVhdGUgYSBSZXNwb25zZSBvYmplY3QgZnJvbSBhIGNhY2hlIGVudHJ5CiAgICovCiAgcmVzcG9uc2VGcm9tQ2FjaGVFbnRyeShlbnRyeSkgewogICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKGVudHJ5LmhlYWRlcnMpOwogICAgcmV0dXJuIG5ldyBSZXNwb25zZShlbnRyeS5yZXNwb25zZSwgewogICAgICBzdGF0dXM6IGVudHJ5LnN0YXR1cywKICAgICAgc3RhdHVzVGV4dDogZW50cnkuc3RhdHVzVGV4dCwKICAgICAgaGVhZGVycwogICAgfSk7CiAgfQogIC8qKgogICAqIENyZWF0ZSBhIGNhY2hlIGVudHJ5IGZyb20gYSBSZXNwb25zZSBvYmplY3QKICAgKi8KICBhc3luYyBjYWNoZUVudHJ5RnJvbVJlc3BvbnNlKHVybCwgcmVzcG9uc2UsIG1ldGFkYXRhKSB7CiAgICBjb25zdCBjbG9uZWRSZXNwb25zZSA9IHJlc3BvbnNlLmNsb25lKCk7CiAgICBjb25zdCBidWZmZXIyID0gYXdhaXQgY2xvbmVkUmVzcG9uc2UuYXJyYXlCdWZmZXIoKTsKICAgIGNvbnN0IGhlYWRlcnMgPSB7fTsKICAgIGNsb25lZFJlc3BvbnNlLmhlYWRlcnMuZm9yRWFjaCgodmFsdWUyLCBrZXkyKSA9PiB7CiAgICAgIGhlYWRlcnNba2V5Ml0gPSB2YWx1ZTI7CiAgICB9KTsKICAgIHJldHVybiB7CiAgICAgIHJlc3BvbnNlOiBidWZmZXIyLAogICAgICBoZWFkZXJzLAogICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksCiAgICAgIGV0YWc6IG1ldGFkYXRhPy5ldGFnIHx8IGNsb25lZFJlc3BvbnNlLmhlYWRlcnMuZ2V0KCJldGFnIikgfHwgdm9pZCAwLAogICAgICBsYXN0TW9kaWZpZWQ6IG1ldGFkYXRhPy5sYXN0TW9kaWZpZWQgfHwgY2xvbmVkUmVzcG9uc2UuaGVhZGVycy5nZXQoImxhc3QtbW9kaWZpZWQiKSB8fCB2b2lkIDAsCiAgICAgIG1heEFnZTogbWV0YWRhdGE/Lm1heEFnZSwKICAgICAgdXJsLAogICAgICBzdGF0dXM6IGNsb25lZFJlc3BvbnNlLnN0YXR1cywKICAgICAgc3RhdHVzVGV4dDogY2xvbmVkUmVzcG9uc2Uuc3RhdHVzVGV4dAogICAgfTsKICB9CiAgLyoqCiAgICogUHJ1bmUgZXhwaXJlZCBlbnRyaWVzIChnYXJiYWdlIGNvbGxlY3Rpb24pCiAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgZGVsZXRlZAogICAqLwogIGFzeW5jIHBydW5lRXhwaXJlZCgpIHsKICAgIGF3YWl0IHRoaXMuaW5pdFByb21pc2U7CiAgICByZXR1cm4gMDsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrd2VicmVxdWVzdEA0LjAuNS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2VicmVxdWVzdC9kaXN0X3RzL2NhY2hlL2NhY2hlLmhlYWRlcnMuanMKZnVuY3Rpb24gcGFyc2VDYWNoZUNvbnRyb2woY2FjaGVDb250cm9sSGVhZGVyKSB7CiAgY29uc3QgbWV0YWRhdGEgPSB7CiAgICBtYXhBZ2U6IDAsCiAgICBpbW11dGFibGU6IGZhbHNlLAogICAgbm9DYWNoZTogZmFsc2UsCiAgICBub1N0b3JlOiBmYWxzZSwKICAgIG11c3RSZXZhbGlkYXRlOiBmYWxzZQogIH07CiAgaWYgKCFjYWNoZUNvbnRyb2xIZWFkZXIpIHsKICAgIHJldHVybiBtZXRhZGF0YTsKICB9CiAgY29uc3QgZGlyZWN0aXZlcyA9IGNhY2hlQ29udHJvbEhlYWRlci50b0xvd2VyQ2FzZSgpLnNwbGl0KCIsIikubWFwKChkNCkgPT4gZDQudHJpbSgpKTsKICBmb3IgKGNvbnN0IGRpcmVjdGl2ZSBvZiBkaXJlY3RpdmVzKSB7CiAgICBpZiAoZGlyZWN0aXZlID09PSAibm8tY2FjaGUiKSB7CiAgICAgIG1ldGFkYXRhLm5vQ2FjaGUgPSB0cnVlOwogICAgfSBlbHNlIGlmIChkaXJlY3RpdmUgPT09ICJuby1zdG9yZSIpIHsKICAgICAgbWV0YWRhdGEubm9TdG9yZSA9IHRydWU7CiAgICB9IGVsc2UgaWYgKGRpcmVjdGl2ZSA9PT0gImltbXV0YWJsZSIpIHsKICAgICAgbWV0YWRhdGEuaW1tdXRhYmxlID0gdHJ1ZTsKICAgIH0gZWxzZSBpZiAoZGlyZWN0aXZlID09PSAibXVzdC1yZXZhbGlkYXRlIikgewogICAgICBtZXRhZGF0YS5tdXN0UmV2YWxpZGF0ZSA9IHRydWU7CiAgICB9IGVsc2UgaWYgKGRpcmVjdGl2ZS5zdGFydHNXaXRoKCJtYXgtYWdlPSIpKSB7CiAgICAgIGNvbnN0IG1heEFnZSA9IHBhcnNlSW50KGRpcmVjdGl2ZS5zcGxpdCgiPSIpWzFdLCAxMCk7CiAgICAgIGlmICghaXNOYU4obWF4QWdlKSkgewogICAgICAgIG1ldGFkYXRhLm1heEFnZSA9IG1heEFnZSAqIDFlMzsKICAgICAgfQogICAgfQogIH0KICByZXR1cm4gbWV0YWRhdGE7Cn0KX19uYW1lKHBhcnNlQ2FjaGVDb250cm9sLCAicGFyc2VDYWNoZUNvbnRyb2wiKTsKZnVuY3Rpb24gcGFyc2VFeHBpcmVzKGV4cGlyZXNIZWFkZXIpIHsKICBpZiAoIWV4cGlyZXNIZWFkZXIpIHsKICAgIHJldHVybiB2b2lkIDA7CiAgfQogIHRyeSB7CiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoZXhwaXJlc0hlYWRlcik7CiAgICByZXR1cm4gZGF0ZS5nZXRUaW1lKCk7CiAgfSBjYXRjaCB7CiAgICByZXR1cm4gdm9pZCAwOwogIH0KfQpfX25hbWUocGFyc2VFeHBpcmVzLCAicGFyc2VFeHBpcmVzIik7CmZ1bmN0aW9uIGV4dHJhY3RDYWNoZU1ldGFkYXRhKGhlYWRlcnMpIHsKICBjb25zdCBjYWNoZUNvbnRyb2wgPSBoZWFkZXJzLmdldCgiY2FjaGUtY29udHJvbCIpOwogIGNvbnN0IGV4cGlyZXMgPSBoZWFkZXJzLmdldCgiZXhwaXJlcyIpOwogIGNvbnN0IGV0YWcgPSBoZWFkZXJzLmdldCgiZXRhZyIpOwogIGNvbnN0IGxhc3RNb2RpZmllZCA9IGhlYWRlcnMuZ2V0KCJsYXN0LW1vZGlmaWVkIik7CiAgY29uc3QgbWV0YWRhdGEgPSBwYXJzZUNhY2hlQ29udHJvbChjYWNoZUNvbnRyb2wpOwogIGlmIChtZXRhZGF0YS5tYXhBZ2UgPT09IDAgJiYgZXhwaXJlcykgewogICAgY29uc3QgZXhwaXJlc1RpbWUgPSBwYXJzZUV4cGlyZXMoZXhwaXJlcyk7CiAgICBpZiAoZXhwaXJlc1RpbWUpIHsKICAgICAgbWV0YWRhdGEubWF4QWdlID0gTWF0aC5tYXgoMCwgZXhwaXJlc1RpbWUgLSBEYXRlLm5vdygpKTsKICAgIH0KICB9CiAgcmV0dXJuIHsKICAgIG1heEFnZTogbWV0YWRhdGEubWF4QWdlIHx8IDAsCiAgICBldGFnOiBldGFnIHx8IHZvaWQgMCwKICAgIGxhc3RNb2RpZmllZDogbGFzdE1vZGlmaWVkIHx8IHZvaWQgMCwKICAgIGltbXV0YWJsZTogbWV0YWRhdGEuaW1tdXRhYmxlIHx8IGZhbHNlLAogICAgbm9DYWNoZTogbWV0YWRhdGEubm9DYWNoZSB8fCBmYWxzZSwKICAgIG5vU3RvcmU6IG1ldGFkYXRhLm5vU3RvcmUgfHwgZmFsc2UsCiAgICBtdXN0UmV2YWxpZGF0ZTogbWV0YWRhdGEubXVzdFJldmFsaWRhdGUgfHwgZmFsc2UKICB9Owp9Cl9fbmFtZShleHRyYWN0Q2FjaGVNZXRhZGF0YSwgImV4dHJhY3RDYWNoZU1ldGFkYXRhIik7CmZ1bmN0aW9uIGlzRnJlc2goY2FjaGVFbnRyeSwgbWV0YWRhdGEpIHsKICBpZiAobWV0YWRhdGEubm9TdG9yZSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBpZiAobWV0YWRhdGEuaW1tdXRhYmxlKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgY29uc3QgYWdlID0gRGF0ZS5ub3coKSAtIGNhY2hlRW50cnkudGltZXN0YW1wOwogIGNvbnN0IG1heEFnZSA9IGNhY2hlRW50cnkubWF4QWdlIHx8IG1ldGFkYXRhLm1heEFnZSB8fCAwOwogIGlmIChtYXhBZ2UgPT09IDApIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgcmV0dXJuIGFnZSA8IG1heEFnZTsKfQpfX25hbWUoaXNGcmVzaCwgImlzRnJlc2giKTsKZnVuY3Rpb24gcmVxdWlyZXNSZXZhbGlkYXRpb24obWV0YWRhdGEpIHsKICByZXR1cm4gbWV0YWRhdGEubm9DYWNoZSB8fCBtZXRhZGF0YS5tdXN0UmV2YWxpZGF0ZTsKfQpfX25hbWUocmVxdWlyZXNSZXZhbGlkYXRpb24sICJyZXF1aXJlc1JldmFsaWRhdGlvbiIpOwpmdW5jdGlvbiBjcmVhdGVDb25kaXRpb25hbEhlYWRlcnMoY2FjaGVFbnRyeSkgewogIGNvbnN0IGhlYWRlcnMgPSB7fTsKICBpZiAoY2FjaGVFbnRyeS5ldGFnKSB7CiAgICBoZWFkZXJzWyJpZi1ub25lLW1hdGNoIl0gPSBjYWNoZUVudHJ5LmV0YWc7CiAgfQogIGlmIChjYWNoZUVudHJ5Lmxhc3RNb2RpZmllZCkgewogICAgaGVhZGVyc1siaWYtbW9kaWZpZWQtc2luY2UiXSA9IGNhY2hlRW50cnkubGFzdE1vZGlmaWVkOwogIH0KICByZXR1cm4gaGVhZGVyczsKfQpfX25hbWUoY3JlYXRlQ29uZGl0aW9uYWxIZWFkZXJzLCAiY3JlYXRlQ29uZGl0aW9uYWxIZWFkZXJzIik7CmZ1bmN0aW9uIGhlYWRlcnNUb09iamVjdChoZWFkZXJzKSB7CiAgY29uc3Qgb2JqID0ge307CiAgaGVhZGVycy5mb3JFYWNoKCh2YWx1ZTIsIGtleTIpID0+IHsKICAgIG9ialtrZXkyXSA9IHZhbHVlMjsKICB9KTsKICByZXR1cm4gb2JqOwp9Cl9fbmFtZShoZWFkZXJzVG9PYmplY3QsICJoZWFkZXJzVG9PYmplY3QiKTsKZnVuY3Rpb24gb2JqZWN0VG9IZWFkZXJzKG9iaikgewogIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycygpOwogIE9iamVjdC5lbnRyaWVzKG9iaikuZm9yRWFjaCgoW2tleTIsIHZhbHVlMl0pID0+IHsKICAgIGhlYWRlcnMuc2V0KGtleTIsIHZhbHVlMik7CiAgfSk7CiAgcmV0dXJuIGhlYWRlcnM7Cn0KX19uYW1lKG9iamVjdFRvSGVhZGVycywgIm9iamVjdFRvSGVhZGVycyIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnJlcXVlc3RANC4wLjUvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnJlcXVlc3QvZGlzdF90cy9jYWNoZS9jYWNoZS5zdHJhdGVnaWVzLmpzCnZhciBOZXR3b3JrRmlyc3RTdHJhdGVneSA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJOZXR3b3JrRmlyc3RTdHJhdGVneSIpOwogIH0KICBhc3luYyBleGVjdXRlKGNvbnRleHQyKSB7CiAgICB0cnkgewogICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNvbnRleHQyLmZldGNoRm4oY29udGV4dDIucmVxdWVzdCk7CiAgICAgIGlmIChyZXNwb25zZS5vaykgewogICAgICAgIGF3YWl0IHRoaXMuY2FjaGVSZXNwb25zZShjb250ZXh0MiwgcmVzcG9uc2UpOwogICAgICB9CiAgICAgIHJldHVybiB7CiAgICAgICAgcmVzcG9uc2UsCiAgICAgICAgZnJvbUNhY2hlOiBmYWxzZSwKICAgICAgICByZXZhbGlkYXRlZDogZmFsc2UKICAgICAgfTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGlmIChjb250ZXh0Mi5sb2dnaW5nKSB7CiAgICAgICAgY29uc29sZS5sb2coIlt3ZWJyZXF1ZXN0XSBOZXR3b3JrIGZhaWxlZCwgdHJ5aW5nIGNhY2hlOiIsIGVycm9yKTsKICAgICAgfQogICAgICBjb25zdCBjYWNoZWRFbnRyeSA9IGF3YWl0IGNvbnRleHQyLmNhY2hlU3RvcmUuZ2V0KGNvbnRleHQyLmNhY2hlS2V5KTsKICAgICAgaWYgKGNhY2hlZEVudHJ5KSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHJlc3BvbnNlOiBjb250ZXh0Mi5jYWNoZVN0b3JlLnJlc3BvbnNlRnJvbUNhY2hlRW50cnkoY2FjaGVkRW50cnkpLAogICAgICAgICAgZnJvbUNhY2hlOiB0cnVlLAogICAgICAgICAgcmV2YWxpZGF0ZWQ6IGZhbHNlCiAgICAgICAgfTsKICAgICAgfQogICAgICB0aHJvdyBlcnJvcjsKICAgIH0KICB9CiAgYXN5bmMgY2FjaGVSZXNwb25zZShjb250ZXh0MiwgcmVzcG9uc2UpIHsKICAgIGNvbnN0IG1ldGFkYXRhID0gZXh0cmFjdENhY2hlTWV0YWRhdGEocmVzcG9uc2UuaGVhZGVycyk7CiAgICBpZiAobWV0YWRhdGEubm9TdG9yZSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBlbnRyeSA9IGF3YWl0IGNvbnRleHQyLmNhY2hlU3RvcmUuY2FjaGVFbnRyeUZyb21SZXNwb25zZShjb250ZXh0Mi5yZXF1ZXN0LnVybCwgcmVzcG9uc2UsIG1ldGFkYXRhKTsKICAgIGF3YWl0IGNvbnRleHQyLmNhY2hlU3RvcmUuc2V0KGNvbnRleHQyLmNhY2hlS2V5LCBlbnRyeSk7CiAgfQp9Owp2YXIgQ2FjaGVGaXJzdFN0cmF0ZWd5ID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkNhY2hlRmlyc3RTdHJhdGVneSIpOwogIH0KICBhc3luYyBleGVjdXRlKGNvbnRleHQyKSB7CiAgICBjb25zdCBjYWNoZWRFbnRyeSA9IGF3YWl0IGNvbnRleHQyLmNhY2hlU3RvcmUuZ2V0KGNvbnRleHQyLmNhY2hlS2V5KTsKICAgIGlmIChjYWNoZWRFbnRyeSkgewogICAgICBjb25zdCBtZXRhZGF0YTIgPSBleHRyYWN0Q2FjaGVNZXRhZGF0YShuZXcgSGVhZGVycyhjYWNoZWRFbnRyeS5oZWFkZXJzKSk7CiAgICAgIGlmIChpc0ZyZXNoKGNhY2hlZEVudHJ5LCBtZXRhZGF0YTIpKSB7CiAgICAgICAgaWYgKGNvbnRleHQyLmxvZ2dpbmcpIHsKICAgICAgICAgIGNvbnNvbGUubG9nKCJbd2VicmVxdWVzdF0gQ2FjaGUgaGl0IChmcmVzaCk6IiwgY29udGV4dDIucmVxdWVzdC51cmwpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gewogICAgICAgICAgcmVzcG9uc2U6IGNvbnRleHQyLmNhY2hlU3RvcmUucmVzcG9uc2VGcm9tQ2FjaGVFbnRyeShjYWNoZWRFbnRyeSksCiAgICAgICAgICBmcm9tQ2FjaGU6IHRydWUsCiAgICAgICAgICByZXZhbGlkYXRlZDogZmFsc2UKICAgICAgICB9OwogICAgICB9CiAgICAgIGlmIChyZXF1aXJlc1JldmFsaWRhdGlvbihtZXRhZGF0YTIpICYmIChjYWNoZWRFbnRyeS5ldGFnIHx8IGNhY2hlZEVudHJ5Lmxhc3RNb2RpZmllZCkpIHsKICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXZhbGlkYXRlKGNvbnRleHQyLCBjYWNoZWRFbnRyeSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChjb250ZXh0Mi5sb2dnaW5nKSB7CiAgICAgIGNvbnNvbGUubG9nKCJbd2VicmVxdWVzdF0gQ2FjaGUgbWlzcywgZmV0Y2hpbmc6IiwgY29udGV4dDIucmVxdWVzdC51cmwpOwogICAgfQogICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjb250ZXh0Mi5mZXRjaEZuKGNvbnRleHQyLnJlcXVlc3QpOwogICAgY29uc3QgbWV0YWRhdGEgPSBleHRyYWN0Q2FjaGVNZXRhZGF0YShyZXNwb25zZS5oZWFkZXJzKTsKICAgIGlmICghbWV0YWRhdGEubm9TdG9yZSkgewogICAgICBjb25zdCBlbnRyeSA9IGF3YWl0IGNvbnRleHQyLmNhY2hlU3RvcmUuY2FjaGVFbnRyeUZyb21SZXNwb25zZShjb250ZXh0Mi5yZXF1ZXN0LnVybCwgcmVzcG9uc2UsIG1ldGFkYXRhKTsKICAgICAgYXdhaXQgY29udGV4dDIuY2FjaGVTdG9yZS5zZXQoY29udGV4dDIuY2FjaGVLZXksIGVudHJ5KTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIHJlc3BvbnNlLAogICAgICBmcm9tQ2FjaGU6IGZhbHNlLAogICAgICByZXZhbGlkYXRlZDogZmFsc2UKICAgIH07CiAgfQogIGFzeW5jIHJldmFsaWRhdGUoY29udGV4dDIsIGNhY2hlZEVudHJ5KSB7CiAgICBjb25zdCBjb25kaXRpb25hbEhlYWRlcnMgPSBjcmVhdGVDb25kaXRpb25hbEhlYWRlcnMoY2FjaGVkRW50cnkpOwogICAgY29uc3QgcmV2YWxpZGF0ZVJlcXVlc3QgPSBuZXcgUmVxdWVzdChjb250ZXh0Mi5yZXF1ZXN0LnVybCwgewogICAgICBtZXRob2Q6IGNvbnRleHQyLnJlcXVlc3QubWV0aG9kLAogICAgICBoZWFkZXJzOiB7CiAgICAgICAgLi4uaGVhZGVyc1RvT2JqZWN0KGNvbnRleHQyLnJlcXVlc3QuaGVhZGVycyksCiAgICAgICAgLi4uY29uZGl0aW9uYWxIZWFkZXJzCiAgICAgIH0KICAgIH0pOwogICAgdHJ5IHsKICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjb250ZXh0Mi5mZXRjaEZuKHJldmFsaWRhdGVSZXF1ZXN0KTsKICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMzA0KSB7CiAgICAgICAgaWYgKGNvbnRleHQyLmxvZ2dpbmcpIHsKICAgICAgICAgIGNvbnNvbGUubG9nKCJbd2VicmVxdWVzdF0gQ2FjaGUgcmV2YWxpZGF0ZWQgKDMwNCk6IiwgY29udGV4dDIucmVxdWVzdC51cmwpOwogICAgICAgIH0KICAgICAgICBjYWNoZWRFbnRyeS50aW1lc3RhbXAgPSBEYXRlLm5vdygpOwogICAgICAgIGF3YWl0IGNvbnRleHQyLmNhY2hlU3RvcmUuc2V0KGNvbnRleHQyLmNhY2hlS2V5LCBjYWNoZWRFbnRyeSk7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHJlc3BvbnNlOiBjb250ZXh0Mi5jYWNoZVN0b3JlLnJlc3BvbnNlRnJvbUNhY2hlRW50cnkoY2FjaGVkRW50cnkpLAogICAgICAgICAgZnJvbUNhY2hlOiB0cnVlLAogICAgICAgICAgcmV2YWxpZGF0ZWQ6IHRydWUKICAgICAgICB9OwogICAgICB9CiAgICAgIGlmIChyZXNwb25zZS5vaykgewogICAgICAgIGNvbnN0IG1ldGFkYXRhID0gZXh0cmFjdENhY2hlTWV0YWRhdGEocmVzcG9uc2UuaGVhZGVycyk7CiAgICAgICAgaWYgKCFtZXRhZGF0YS5ub1N0b3JlKSB7CiAgICAgICAgICBjb25zdCBlbnRyeSA9IGF3YWl0IGNvbnRleHQyLmNhY2hlU3RvcmUuY2FjaGVFbnRyeUZyb21SZXNwb25zZShjb250ZXh0Mi5yZXF1ZXN0LnVybCwgcmVzcG9uc2UsIG1ldGFkYXRhKTsKICAgICAgICAgIGF3YWl0IGNvbnRleHQyLmNhY2hlU3RvcmUuc2V0KGNvbnRleHQyLmNhY2hlS2V5LCBlbnRyeSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB7CiAgICAgICAgcmVzcG9uc2UsCiAgICAgICAgZnJvbUNhY2hlOiBmYWxzZSwKICAgICAgICByZXZhbGlkYXRlZDogdHJ1ZQogICAgICB9OwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgaWYgKGNvbnRleHQyLmxvZ2dpbmcpIHsKICAgICAgICBjb25zb2xlLmxvZygiW3dlYnJlcXVlc3RdIFJldmFsaWRhdGlvbiBmYWlsZWQsIHVzaW5nIGNhY2hlOiIsIGVycm9yKTsKICAgICAgfQogICAgICByZXR1cm4gewogICAgICAgIHJlc3BvbnNlOiBjb250ZXh0Mi5jYWNoZVN0b3JlLnJlc3BvbnNlRnJvbUNhY2hlRW50cnkoY2FjaGVkRW50cnkpLAogICAgICAgIGZyb21DYWNoZTogdHJ1ZSwKICAgICAgICByZXZhbGlkYXRlZDogZmFsc2UKICAgICAgfTsKICAgIH0KICB9Cn07CnZhciBTdGFsZVdoaWxlUmV2YWxpZGF0ZVN0cmF0ZWd5ID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlN0YWxlV2hpbGVSZXZhbGlkYXRlU3RyYXRlZ3kiKTsKICB9CiAgYXN5bmMgZXhlY3V0ZShjb250ZXh0MikgewogICAgY29uc3QgY2FjaGVkRW50cnkgPSBhd2FpdCBjb250ZXh0Mi5jYWNoZVN0b3JlLmdldChjb250ZXh0Mi5jYWNoZUtleSk7CiAgICBpZiAoY2FjaGVkRW50cnkpIHsKICAgICAgY29uc3QgY2FjaGVkUmVzcG9uc2UgPSBjb250ZXh0Mi5jYWNoZVN0b3JlLnJlc3BvbnNlRnJvbUNhY2hlRW50cnkoY2FjaGVkRW50cnkpOwogICAgICB0aGlzLnJldmFsaWRhdGVJbkJhY2tncm91bmQoY29udGV4dDIsIGNhY2hlZEVudHJ5KS5jYXRjaCgoZXJyb3IpID0+IHsKICAgICAgICBpZiAoY29udGV4dDIubG9nZ2luZykgewogICAgICAgICAgY29uc29sZS53YXJuKCJbd2VicmVxdWVzdF0gQmFja2dyb3VuZCByZXZhbGlkYXRpb24gZmFpbGVkOiIsIGVycm9yKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICByZXR1cm4gewogICAgICAgIHJlc3BvbnNlOiBjYWNoZWRSZXNwb25zZSwKICAgICAgICBmcm9tQ2FjaGU6IHRydWUsCiAgICAgICAgcmV2YWxpZGF0ZWQ6IGZhbHNlCiAgICAgIH07CiAgICB9CiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNvbnRleHQyLmZldGNoRm4oY29udGV4dDIucmVxdWVzdCk7CiAgICBjb25zdCBtZXRhZGF0YSA9IGV4dHJhY3RDYWNoZU1ldGFkYXRhKHJlc3BvbnNlLmhlYWRlcnMpOwogICAgaWYgKCFtZXRhZGF0YS5ub1N0b3JlICYmIHJlc3BvbnNlLm9rKSB7CiAgICAgIGNvbnN0IGVudHJ5ID0gYXdhaXQgY29udGV4dDIuY2FjaGVTdG9yZS5jYWNoZUVudHJ5RnJvbVJlc3BvbnNlKGNvbnRleHQyLnJlcXVlc3QudXJsLCByZXNwb25zZSwgbWV0YWRhdGEpOwogICAgICBhd2FpdCBjb250ZXh0Mi5jYWNoZVN0b3JlLnNldChjb250ZXh0Mi5jYWNoZUtleSwgZW50cnkpOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgcmVzcG9uc2UsCiAgICAgIGZyb21DYWNoZTogZmFsc2UsCiAgICAgIHJldmFsaWRhdGVkOiBmYWxzZQogICAgfTsKICB9CiAgYXN5bmMgcmV2YWxpZGF0ZUluQmFja2dyb3VuZChjb250ZXh0MiwgY2FjaGVkRW50cnkpIHsKICAgIGNvbnN0IG1ldGFkYXRhID0gZXh0cmFjdENhY2hlTWV0YWRhdGEobmV3IEhlYWRlcnMoY2FjaGVkRW50cnkuaGVhZGVycykpOwogICAgaWYgKGlzRnJlc2goY2FjaGVkRW50cnksIG1ldGFkYXRhKSAmJiAhcmVxdWlyZXNSZXZhbGlkYXRpb24obWV0YWRhdGEpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRyeSB7CiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY29udGV4dDIuZmV0Y2hGbihjb250ZXh0Mi5yZXF1ZXN0KTsKICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7CiAgICAgICAgY29uc3QgbmV3TWV0YWRhdGEgPSBleHRyYWN0Q2FjaGVNZXRhZGF0YShyZXNwb25zZS5oZWFkZXJzKTsKICAgICAgICBpZiAoIW5ld01ldGFkYXRhLm5vU3RvcmUpIHsKICAgICAgICAgIGNvbnN0IGVudHJ5ID0gYXdhaXQgY29udGV4dDIuY2FjaGVTdG9yZS5jYWNoZUVudHJ5RnJvbVJlc3BvbnNlKGNvbnRleHQyLnJlcXVlc3QudXJsLCByZXNwb25zZSwgbmV3TWV0YWRhdGEpOwogICAgICAgICAgYXdhaXQgY29udGV4dDIuY2FjaGVTdG9yZS5zZXQoY29udGV4dDIuY2FjaGVLZXksIGVudHJ5KTsKICAgICAgICAgIGlmIChjb250ZXh0Mi5sb2dnaW5nKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCJbd2VicmVxdWVzdF0gQmFja2dyb3VuZCByZXZhbGlkYXRpb24gY29tcGxldGU6IiwgY29udGV4dDIucmVxdWVzdC51cmwpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgaWYgKGNvbnRleHQyLmxvZ2dpbmcpIHsKICAgICAgICBjb25zb2xlLndhcm4oIlt3ZWJyZXF1ZXN0XSBCYWNrZ3JvdW5kIHJldmFsaWRhdGlvbiBmYWlsZWQ6IiwgZXJyb3IpOwogICAgICB9CiAgICB9CiAgfQp9Owp2YXIgTmV0d29ya09ubHlTdHJhdGVneSA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJOZXR3b3JrT25seVN0cmF0ZWd5Iik7CiAgfQogIGFzeW5jIGV4ZWN1dGUoY29udGV4dDIpIHsKICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY29udGV4dDIuZmV0Y2hGbihjb250ZXh0Mi5yZXF1ZXN0KTsKICAgIHJldHVybiB7CiAgICAgIHJlc3BvbnNlLAogICAgICBmcm9tQ2FjaGU6IGZhbHNlLAogICAgICByZXZhbGlkYXRlZDogZmFsc2UKICAgIH07CiAgfQp9Owp2YXIgQ2FjaGVPbmx5U3RyYXRlZ3kgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiQ2FjaGVPbmx5U3RyYXRlZ3kiKTsKICB9CiAgYXN5bmMgZXhlY3V0ZShjb250ZXh0MikgewogICAgY29uc3QgY2FjaGVkRW50cnkgPSBhd2FpdCBjb250ZXh0Mi5jYWNoZVN0b3JlLmdldChjb250ZXh0Mi5jYWNoZUtleSk7CiAgICBpZiAoIWNhY2hlZEVudHJ5KSB7CiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FjaGUgbWlzcyBmb3IgJHtjb250ZXh0Mi5yZXF1ZXN0LnVybH0gKGNhY2hlLW9ubHkgbW9kZSlgKTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIHJlc3BvbnNlOiBjb250ZXh0Mi5jYWNoZVN0b3JlLnJlc3BvbnNlRnJvbUNhY2hlRW50cnkoY2FjaGVkRW50cnkpLAogICAgICBmcm9tQ2FjaGU6IHRydWUsCiAgICAgIHJldmFsaWRhdGVkOiBmYWxzZQogICAgfTsKICB9Cn07CmZ1bmN0aW9uIGdldFN0cmF0ZWd5SGFuZGxlcihzdHJhdGVneSkgewogIHN3aXRjaCAoc3RyYXRlZ3kpIHsKICAgIGNhc2UgIm5ldHdvcmstZmlyc3QiOgogICAgICByZXR1cm4gbmV3IE5ldHdvcmtGaXJzdFN0cmF0ZWd5KCk7CiAgICBjYXNlICJjYWNoZS1maXJzdCI6CiAgICAgIHJldHVybiBuZXcgQ2FjaGVGaXJzdFN0cmF0ZWd5KCk7CiAgICBjYXNlICJzdGFsZS13aGlsZS1yZXZhbGlkYXRlIjoKICAgICAgcmV0dXJuIG5ldyBTdGFsZVdoaWxlUmV2YWxpZGF0ZVN0cmF0ZWd5KCk7CiAgICBjYXNlICJuZXR3b3JrLW9ubHkiOgogICAgICByZXR1cm4gbmV3IE5ldHdvcmtPbmx5U3RyYXRlZ3koKTsKICAgIGNhc2UgImNhY2hlLW9ubHkiOgogICAgICByZXR1cm4gbmV3IENhY2hlT25seVN0cmF0ZWd5KCk7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gbmV3IE5ldHdvcmtGaXJzdFN0cmF0ZWd5KCk7CiAgfQp9Cl9fbmFtZShnZXRTdHJhdGVneUhhbmRsZXIsICJnZXRTdHJhdGVneUhhbmRsZXIiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJyZXF1ZXN0QDQuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJyZXF1ZXN0L2Rpc3RfdHMvY2FjaGUvY2FjaGUubWFuYWdlci5qcwp2YXIgQ2FjaGVNYW5hZ2VyID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkNhY2hlTWFuYWdlciIpOwogIH0KICBjb25zdHJ1Y3RvcihkYk5hbWUsIHN0b3JlTmFtZSkgewogICAgdGhpcy5jYWNoZVN0b3JlID0gbmV3IENhY2hlU3RvcmUoZGJOYW1lLCBzdG9yZU5hbWUpOwogIH0KICAvKioKICAgKiBFeGVjdXRlIGEgcmVxdWVzdCB3aXRoIGNhY2hpbmcKICAgKi8KICBhc3luYyBleGVjdXRlKHJlcXVlc3QsIG9wdGlvbnMsIGZldGNoRm4pIHsKICAgIGNvbnN0IHN0cmF0ZWd5ID0gdGhpcy5kZXRlcm1pbmVTdHJhdGVneShyZXF1ZXN0LCBvcHRpb25zKTsKICAgIGlmIChzdHJhdGVneSA9PT0gIm5ldHdvcmstb25seSIpIHsKICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaEZuKHJlcXVlc3QpOwogICAgICByZXR1cm4gewogICAgICAgIHJlc3BvbnNlLAogICAgICAgIGZyb21DYWNoZTogZmFsc2UsCiAgICAgICAgcmV2YWxpZGF0ZWQ6IGZhbHNlCiAgICAgIH07CiAgICB9CiAgICBjb25zdCBjYWNoZUtleSA9IHRoaXMuZ2VuZXJhdGVDYWNoZUtleShyZXF1ZXN0LCBvcHRpb25zKTsKICAgIGNvbnN0IGhhbmRsZXIyID0gZ2V0U3RyYXRlZ3lIYW5kbGVyKHN0cmF0ZWd5KTsKICAgIGNvbnN0IGNvbnRleHQyID0gewogICAgICByZXF1ZXN0LAogICAgICBjYWNoZUtleSwKICAgICAgY2FjaGVTdG9yZTogdGhpcy5jYWNoZVN0b3JlLAogICAgICBmZXRjaEZuLAogICAgICBsb2dnaW5nOiBvcHRpb25zLmxvZ2dpbmcKICAgIH07CiAgICByZXR1cm4gYXdhaXQgaGFuZGxlcjIuZXhlY3V0ZShjb250ZXh0Mik7CiAgfQogIC8qKgogICAqIERldGVybWluZSB0aGUgY2FjaGluZyBzdHJhdGVneSBiYXNlZCBvbiBvcHRpb25zIGFuZCByZXF1ZXN0CiAgICovCiAgZGV0ZXJtaW5lU3RyYXRlZ3kocmVxdWVzdCwgb3B0aW9ucykgewogICAgaWYgKG9wdGlvbnMuY2FjaGVTdHJhdGVneSkgewogICAgICByZXR1cm4gb3B0aW9ucy5jYWNoZVN0cmF0ZWd5OwogICAgfQogICAgaWYgKG9wdGlvbnMuY2FjaGUpIHsKICAgICAgcmV0dXJuIHRoaXMubWFwQ2FjaGVNb2RlVG9TdHJhdGVneShvcHRpb25zLmNhY2hlKTsKICAgIH0KICAgIGlmIChyZXF1ZXN0LmNhY2hlKSB7CiAgICAgIHJldHVybiB0aGlzLm1hcENhY2hlTW9kZVRvU3RyYXRlZ3kocmVxdWVzdC5jYWNoZSk7CiAgICB9CiAgICByZXR1cm4gIm5ldHdvcmstZmlyc3QiOwogIH0KICAvKioKICAgKiBNYXAgc3RhbmRhcmQgZmV0Y2ggY2FjaGUgbW9kZXMgdG8gb3VyIHN0cmF0ZWdpZXMKICAgKi8KICBtYXBDYWNoZU1vZGVUb1N0cmF0ZWd5KGNhY2hlTW9kZSkgewogICAgc3dpdGNoIChjYWNoZU1vZGUpIHsKICAgICAgY2FzZSAiZGVmYXVsdCI6CiAgICAgICAgcmV0dXJuICJuZXR3b3JrLWZpcnN0IjsKICAgICAgY2FzZSAibm8tc3RvcmUiOgogICAgICBjYXNlICJyZWxvYWQiOgogICAgICAgIHJldHVybiAibmV0d29yay1vbmx5IjsKICAgICAgY2FzZSAibm8tY2FjaGUiOgogICAgICAgIHJldHVybiAibmV0d29yay1maXJzdCI7CiAgICAgIC8vIFdpbGwgdXNlIHJldmFsaWRhdGlvbgogICAgICBjYXNlICJmb3JjZS1jYWNoZSI6CiAgICAgICAgcmV0dXJuICJjYWNoZS1maXJzdCI7CiAgICAgIGNhc2UgIm9ubHktaWYtY2FjaGVkIjoKICAgICAgICByZXR1cm4gImNhY2hlLW9ubHkiOwogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiAibmV0d29yay1maXJzdCI7CiAgICB9CiAgfQogIC8qKgogICAqIEdlbmVyYXRlIGNhY2hlIGtleQogICAqLwogIGdlbmVyYXRlQ2FjaGVLZXkocmVxdWVzdCwgb3B0aW9ucykgewogICAgaWYgKG9wdGlvbnMuY2FjaGVLZXkpIHsKICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmNhY2hlS2V5ID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgcmV0dXJuIG9wdGlvbnMuY2FjaGVLZXkocmVxdWVzdCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG9wdGlvbnMuY2FjaGVLZXk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5jYWNoZVN0b3JlLmdlbmVyYXRlQ2FjaGVLZXkocmVxdWVzdCk7CiAgfQogIC8qKgogICAqIENsZWFyIHRoZSBjYWNoZQogICAqLwogIGFzeW5jIGNsZWFyKCkgewogICAgYXdhaXQgdGhpcy5jYWNoZVN0b3JlLmNsZWFyKCk7CiAgfQogIC8qKgogICAqIERlbGV0ZSBhIHNwZWNpZmljIGNhY2hlIGVudHJ5CiAgICovCiAgYXN5bmMgZGVsZXRlKGNhY2hlS2V5KSB7CiAgICBhd2FpdCB0aGlzLmNhY2hlU3RvcmUuZGVsZXRlKGNhY2hlS2V5KTsKICB9CiAgLyoqCiAgICogQ2hlY2sgaWYgYSBjYWNoZSBlbnRyeSBleGlzdHMKICAgKi8KICBhc3luYyBoYXMoY2FjaGVLZXkpIHsKICAgIHJldHVybiBhd2FpdCB0aGlzLmNhY2hlU3RvcmUuaGFzKGNhY2hlS2V5KTsKICB9CiAgLyoqCiAgICogR2V0IHRoZSB1bmRlcmx5aW5nIGNhY2hlIHN0b3JlCiAgICovCiAgZ2V0U3RvcmUoKSB7CiAgICByZXR1cm4gdGhpcy5jYWNoZVN0b3JlOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJyZXF1ZXN0QDQuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJyZXF1ZXN0L2Rpc3RfdHMvcmV0cnkvcmV0cnkuc3RyYXRlZ2llcy5qcwp2YXIgRXhwb25lbnRpYWxCYWNrb2ZmID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkV4cG9uZW50aWFsQmFja29mZiIpOwogIH0KICBjYWxjdWxhdGUoYXR0ZW1wdCwgaW5pdGlhbERlbGF5LCBtYXhEZWxheSkgewogICAgY29uc3QgZGVsYXkyID0gaW5pdGlhbERlbGF5ICogTWF0aC5wb3coMiwgYXR0ZW1wdCAtIDEpOwogICAgcmV0dXJuIE1hdGgubWluKGRlbGF5MiwgbWF4RGVsYXkpOwogIH0KfTsKdmFyIExpbmVhckJhY2tvZmYgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiTGluZWFyQmFja29mZiIpOwogIH0KICBjYWxjdWxhdGUoYXR0ZW1wdCwgaW5pdGlhbERlbGF5LCBtYXhEZWxheSkgewogICAgY29uc3QgZGVsYXkyID0gaW5pdGlhbERlbGF5ICogYXR0ZW1wdDsKICAgIHJldHVybiBNYXRoLm1pbihkZWxheTIsIG1heERlbGF5KTsKICB9Cn07CnZhciBDb25zdGFudEJhY2tvZmYgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiQ29uc3RhbnRCYWNrb2ZmIik7CiAgfQogIGNhbGN1bGF0ZShhdHRlbXB0LCBpbml0aWFsRGVsYXksIG1heERlbGF5KSB7CiAgICByZXR1cm4gTWF0aC5taW4oaW5pdGlhbERlbGF5LCBtYXhEZWxheSk7CiAgfQp9OwpmdW5jdGlvbiBnZXRCYWNrb2ZmQ2FsY3VsYXRvcihzdHJhdGVneSkgewogIHN3aXRjaCAoc3RyYXRlZ3kpIHsKICAgIGNhc2UgImV4cG9uZW50aWFsIjoKICAgICAgcmV0dXJuIG5ldyBFeHBvbmVudGlhbEJhY2tvZmYoKTsKICAgIGNhc2UgImxpbmVhciI6CiAgICAgIHJldHVybiBuZXcgTGluZWFyQmFja29mZigpOwogICAgY2FzZSAiY29uc3RhbnQiOgogICAgICByZXR1cm4gbmV3IENvbnN0YW50QmFja29mZigpOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIG5ldyBFeHBvbmVudGlhbEJhY2tvZmYoKTsKICB9Cn0KX19uYW1lKGdldEJhY2tvZmZDYWxjdWxhdG9yLCAiZ2V0QmFja29mZkNhbGN1bGF0b3IiKTsKZnVuY3Rpb24gYWRkSml0dGVyKGRlbGF5Miwgaml0dGVyRmFjdG9yID0gMC4xKSB7CiAgY29uc3Qgaml0dGVyID0gZGVsYXkyICogaml0dGVyRmFjdG9yICogTWF0aC5yYW5kb20oKTsKICByZXR1cm4gZGVsYXkyICsgaml0dGVyOwp9Cl9fbmFtZShhZGRKaXR0ZXIsICJhZGRKaXR0ZXIiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJyZXF1ZXN0QDQuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJyZXF1ZXN0L2Rpc3RfdHMvcmV0cnkvcmV0cnkubWFuYWdlci5qcwp2YXIgUmV0cnlNYW5hZ2VyID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlJldHJ5TWFuYWdlciIpOwogIH0KICBjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHsKICAgIHRoaXMub3B0aW9ucyA9IHsKICAgICAgbWF4QXR0ZW1wdHM6IG9wdGlvbnMubWF4QXR0ZW1wdHMgPz8gMywKICAgICAgYmFja29mZjogb3B0aW9ucy5iYWNrb2ZmID8/ICJleHBvbmVudGlhbCIsCiAgICAgIGluaXRpYWxEZWxheTogb3B0aW9ucy5pbml0aWFsRGVsYXkgPz8gMWUzLAogICAgICBtYXhEZWxheTogb3B0aW9ucy5tYXhEZWxheSA/PyAzZTQsCiAgICAgIHJldHJ5T246IG9wdGlvbnMucmV0cnlPbiA/PyBbNDA4LCA0MjksIDUwMCwgNTAyLCA1MDMsIDUwNF0sCiAgICAgIG9uUmV0cnk6IG9wdGlvbnMub25SZXRyeSA/PyAoKCkgPT4gewogICAgICB9KQogICAgfTsKICB9CiAgLyoqCiAgICogRXhlY3V0ZSBhIHJlcXVlc3Qgd2l0aCByZXRyeSBsb2dpYwogICAqLwogIGFzeW5jIGV4ZWN1dGUoZXhlY3V0ZUZuLCBzaG91bGRSZXRyeUZuKSB7CiAgICBsZXQgbGFzdEVycm9yOwogICAgbGV0IGxhc3RSZXNwb25zZTsKICAgIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IHRoaXMub3B0aW9ucy5tYXhBdHRlbXB0czsgYXR0ZW1wdCsrKSB7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlY3V0ZUZuKCk7CiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFJlc3BvbnNlKSB7CiAgICAgICAgICBpZiAodGhpcy5zaG91bGRSZXRyeVJlc3BvbnNlKHJlc3VsdCkpIHsKICAgICAgICAgICAgbGFzdFJlc3BvbnNlID0gcmVzdWx0OwogICAgICAgICAgICBpZiAoYXR0ZW1wdCA9PT0gdGhpcy5vcHRpb25zLm1heEF0dGVtcHRzKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBkZWxheTIgPSB0aGlzLmNhbGN1bGF0ZURlbGF5KGF0dGVtcHQpOwogICAgICAgICAgICB0aGlzLm9wdGlvbnMub25SZXRyeShhdHRlbXB0LCBuZXcgRXJyb3IoYEhUVFAgJHtyZXN1bHQuc3RhdHVzfWApLCBkZWxheTIpOwogICAgICAgICAgICBhd2FpdCB0aGlzLmRlbGF5KGRlbGF5Mik7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGxhc3RFcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKTsKICAgICAgICBjb25zdCBzaG91bGRSZXRyeSA9IHNob3VsZFJldHJ5Rm4gPyBzaG91bGRSZXRyeUZuKGVycm9yLCBhdHRlbXB0KSA6IHRoaXMuc2hvdWxkUmV0cnlFcnJvcihlcnJvcik7CiAgICAgICAgaWYgKGF0dGVtcHQgPT09IHRoaXMub3B0aW9ucy5tYXhBdHRlbXB0cyB8fCAhc2hvdWxkUmV0cnkpIHsKICAgICAgICAgIHRocm93IGxhc3RFcnJvcjsKICAgICAgICB9CiAgICAgICAgY29uc3QgZGVsYXkyID0gdGhpcy5jYWxjdWxhdGVEZWxheShhdHRlbXB0KTsKICAgICAgICB0aGlzLm9wdGlvbnMub25SZXRyeShhdHRlbXB0LCBsYXN0RXJyb3IsIGRlbGF5Mik7CiAgICAgICAgYXdhaXQgdGhpcy5kZWxheShkZWxheTIpOwogICAgICB9CiAgICB9CiAgICB0aHJvdyBsYXN0RXJyb3IgfHwgbmV3IEVycm9yKCJNYXggcmV0cnkgYXR0ZW1wdHMgcmVhY2hlZCIpOwogIH0KICAvKioKICAgKiBFeGVjdXRlIHdpdGggbXVsdGlwbGUgZmFsbGJhY2sgVVJMcwogICAqLwogIGFzeW5jIGV4ZWN1dGVXaXRoRmFsbGJhY2tzKHVybHMsIHJlcXVlc3RJbml0LCBmZXRjaEZuKSB7CiAgICBpZiAodXJscy5sZW5ndGggPT09IDApIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJObyBVUkxzIHByb3ZpZGVkIGZvciBmYWxsYmFjayBleGVjdXRpb24iKTsKICAgIH0KICAgIGxldCBsYXN0RXJyb3I7CiAgICBjb25zdCBmYWlsZWRVcmxzID0gW107CiAgICBmb3IgKGNvbnN0IHVybCBvZiB1cmxzKSB7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmV4ZWN1dGUoYXN5bmMgKCkgPT4gewogICAgICAgICAgcmV0dXJuIGF3YWl0IGZldGNoRm4odXJsLCByZXF1ZXN0SW5pdCk7CiAgICAgICAgfSk7CiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA8IDQwMCkgewogICAgICAgICAgcmV0dXJuIHJlc3BvbnNlOwogICAgICAgIH0KICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID49IDQwMCAmJiByZXNwb25zZS5zdGF0dXMgPCA1MDAgJiYgcmVzcG9uc2Uuc3RhdHVzICE9PSA0MDgpIHsKICAgICAgICAgIHJldHVybiByZXNwb25zZTsKICAgICAgICB9CiAgICAgICAgZmFpbGVkVXJscy5wdXNoKHVybCk7CiAgICAgICAgbGFzdEVycm9yID0gbmV3IEVycm9yKGBSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyAke3Jlc3BvbnNlLnN0YXR1c31gKTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBmYWlsZWRVcmxzLnB1c2godXJsKTsKICAgICAgICBsYXN0RXJyb3IgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSk7CiAgICAgIH0KICAgIH0KICAgIHRocm93IG5ldyBFcnJvcihgQWxsIFVSTHMgZmFpbGVkOiAke2ZhaWxlZFVybHMuam9pbigiLCAiKX0uIExhc3QgZXJyb3I6ICR7bGFzdEVycm9yPy5tZXNzYWdlIHx8ICJVbmtub3duIGVycm9yIn1gKTsKICB9CiAgLyoqCiAgICogQ2hlY2sgaWYgd2Ugc2hvdWxkIHJldHJ5IGJhc2VkIG9uIHJlc3BvbnNlIHN0YXR1cwogICAqLwogIHNob3VsZFJldHJ5UmVzcG9uc2UocmVzcG9uc2UpIHsKICAgIGNvbnN0IHJldHJ5T24gPSB0aGlzLm9wdGlvbnMucmV0cnlPbjsKICAgIGlmICh0eXBlb2YgcmV0cnlPbiA9PT0gImZ1bmN0aW9uIikgewogICAgICByZXR1cm4gcmV0cnlPbihyZXNwb25zZSk7CiAgICB9CiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXRyeU9uKSkgewogICAgICByZXR1cm4gcmV0cnlPbi5pbmNsdWRlcyhyZXNwb25zZS5zdGF0dXMpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KICAvKioKICAgKiBDaGVjayBpZiB3ZSBzaG91bGQgcmV0cnkgYmFzZWQgb24gZXJyb3IKICAgKi8KICBzaG91bGRSZXRyeUVycm9yKGVycm9yKSB7CiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBUeXBlRXJyb3IgJiYgZXJyb3IubWVzc2FnZS5pbmNsdWRlcygiZmV0Y2giKSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmIChlcnJvci5uYW1lID09PSAiQWJvcnRFcnJvciIgfHwgZXJyb3IubWVzc2FnZS5pbmNsdWRlcygidGltZW91dCIpKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgY29uc3QgcmV0cnlPbiA9IHRoaXMub3B0aW9ucy5yZXRyeU9uOwogICAgaWYgKHR5cGVvZiByZXRyeU9uID09PSAiZnVuY3Rpb24iKSB7CiAgICAgIHJldHVybiByZXRyeU9uKHZvaWQgMCwgZXJyb3IpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KICAvKioKICAgKiBDYWxjdWxhdGUgZGVsYXkgZm9yIG5leHQgcmV0cnkKICAgKi8KICBjYWxjdWxhdGVEZWxheShhdHRlbXB0KSB7CiAgICBjb25zdCBjYWxjdWxhdG9yID0gZ2V0QmFja29mZkNhbGN1bGF0b3IodGhpcy5vcHRpb25zLmJhY2tvZmYpOwogICAgY29uc3QgYmFzZURlbGF5ID0gY2FsY3VsYXRvci5jYWxjdWxhdGUoYXR0ZW1wdCwgdGhpcy5vcHRpb25zLmluaXRpYWxEZWxheSwgdGhpcy5vcHRpb25zLm1heERlbGF5KTsKICAgIHJldHVybiBhZGRKaXR0ZXIoYmFzZURlbGF5KTsKICB9CiAgLyoqCiAgICogRGVsYXkgZXhlY3V0aW9uCiAgICovCiAgYXN5bmMgZGVsYXkobXMpIHsKICAgIGF3YWl0IGRpc3RfdHNfZXhwb3J0czMuZGVsYXlGb3IobXMpOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJyZXF1ZXN0QDQuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJyZXF1ZXN0L2Rpc3RfdHMvdXRpbHMvZGVkdXBsaWNhdG9yLmpzCnZhciBSZXF1ZXN0RGVkdXBsaWNhdG9yID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlJlcXVlc3REZWR1cGxpY2F0b3IiKTsKICB9CiAgY29uc3RydWN0b3IoKSB7CiAgICB0aGlzLmluRmxpZ2h0UmVxdWVzdHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogIH0KICAvKioKICAgKiBHZW5lcmF0ZSBhIGRlZHVwbGljYXRpb24ga2V5IGZyb20gYSByZXF1ZXN0CiAgICovCiAgZ2VuZXJhdGVLZXkocmVxdWVzdCkgewogICAgY29uc3QgdXJsID0gcmVxdWVzdC51cmw7CiAgICBjb25zdCBtZXRob2QgPSByZXF1ZXN0Lm1ldGhvZDsKICAgIGlmIChtZXRob2QgPT09ICJHRVQiIHx8IG1ldGhvZCA9PT0gIkhFQUQiKSB7CiAgICAgIHJldHVybiBgJHttZXRob2R9OiR7dXJsfWA7CiAgICB9CiAgICByZXR1cm4gYCR7bWV0aG9kfToke3VybH06JHtEYXRlLm5vdygpfWA7CiAgfQogIC8qKgogICAqIEV4ZWN1dGUgYSByZXF1ZXN0IHdpdGggZGVkdXBsaWNhdGlvbgogICAqLwogIGFzeW5jIGV4ZWN1dGUoa2V5MiwgZXhlY3V0ZUZuKSB7CiAgICBjb25zdCBleGlzdGluZ0RlZmVycmVkID0gdGhpcy5pbkZsaWdodFJlcXVlc3RzLmdldChrZXkyKTsKICAgIGlmIChleGlzdGluZ0RlZmVycmVkKSB7CiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZXhpc3RpbmdEZWZlcnJlZC5wcm9taXNlOwogICAgICByZXR1cm4gewogICAgICAgIHJlc3BvbnNlOiByZXNwb25zZS5jbG9uZSgpLAogICAgICAgIHdhc0RlZHVwbGljYXRlZDogdHJ1ZQogICAgICB9OwogICAgfQogICAgY29uc3QgZGVmZXJyZWQgPSBkaXN0X3RzX2V4cG9ydHMuZGVmZXIoKTsKICAgIHRoaXMuaW5GbGlnaHRSZXF1ZXN0cy5zZXQoa2V5MiwgZGVmZXJyZWQpOwogICAgdHJ5IHsKICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBleGVjdXRlRm4oKTsKICAgICAgZGVmZXJyZWQucmVzb2x2ZShyZXNwb25zZSk7CiAgICAgIHRoaXMuaW5GbGlnaHRSZXF1ZXN0cy5kZWxldGUoa2V5Mik7CiAgICAgIHJldHVybiB7CiAgICAgICAgcmVzcG9uc2UsCiAgICAgICAgd2FzRGVkdXBsaWNhdGVkOiBmYWxzZQogICAgICB9OwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgZGVmZXJyZWQucmVqZWN0KGVycm9yKTsKICAgICAgdGhpcy5pbkZsaWdodFJlcXVlc3RzLmRlbGV0ZShrZXkyKTsKICAgICAgdGhyb3cgZXJyb3I7CiAgICB9CiAgfQogIC8qKgogICAqIENoZWNrIGlmIGEgcmVxdWVzdCBpcyBjdXJyZW50bHkgaW4gZmxpZ2h0CiAgICovCiAgaXNJbkZsaWdodChrZXkyKSB7CiAgICByZXR1cm4gdGhpcy5pbkZsaWdodFJlcXVlc3RzLmhhcyhrZXkyKTsKICB9CiAgLyoqCiAgICogR2V0IHRoZSBudW1iZXIgb2YgaW4tZmxpZ2h0IHJlcXVlc3RzCiAgICovCiAgZ2V0SW5GbGlnaHRDb3VudCgpIHsKICAgIHJldHVybiB0aGlzLmluRmxpZ2h0UmVxdWVzdHMuc2l6ZTsKICB9CiAgLyoqCiAgICogQ2xlYXIgYWxsIGluLWZsaWdodCByZXF1ZXN0cwogICAqLwogIGNsZWFyKCkgewogICAgdGhpcy5pbkZsaWdodFJlcXVlc3RzLmNsZWFyKCk7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnJlcXVlc3RANC4wLjUvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnJlcXVlc3QvZGlzdF90cy91dGlscy90aW1lb3V0LmpzCmZ1bmN0aW9uIGNyZWF0ZVRpbWVvdXRDb250cm9sbGVyKHRpbWVvdXRNcykgewogIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CiAgY29uc3QgdGltZW91dDIgPSBuZXcgZGlzdF90c19leHBvcnRzMy5UaW1lb3V0KHRpbWVvdXRNcywgbnVsbCk7CiAgdGltZW91dDIucHJvbWlzZS50aGVuKCgpID0+IHsKICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICB9KTsKICBjb25zdCBjbGVhbnVwID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoKSA9PiB7CiAgICB0aW1lb3V0Mi5jYW5jZWwoKTsKICB9LCAiY2xlYW51cCIpOwogIHJldHVybiB7IGNvbnRyb2xsZXIsIGNsZWFudXAgfTsKfQpfX25hbWUoY3JlYXRlVGltZW91dENvbnRyb2xsZXIsICJjcmVhdGVUaW1lb3V0Q29udHJvbGxlciIpOwphc3luYyBmdW5jdGlvbiBmZXRjaFdpdGhUaW1lb3V0KHVybCwgaW5pdCwgdGltZW91dE1zKSB7CiAgY29uc3QgeyBjb250cm9sbGVyLCBjbGVhbnVwIH0gPSBjcmVhdGVUaW1lb3V0Q29udHJvbGxlcih0aW1lb3V0TXMpOwogIHRyeSB7CiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgewogICAgICAuLi5pbml0LAogICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsCiAgICB9KTsKICAgIGNsZWFudXAoKTsKICAgIHJldHVybiByZXNwb25zZTsKICB9IGNhdGNoIChlcnJvcikgewogICAgY2xlYW51cCgpOwogICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubmFtZSA9PT0gIkFib3J0RXJyb3IiKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcihgUmVxdWVzdCB0aW1lb3V0IGFmdGVyICR7dGltZW91dE1zfW1zOiAke3VybH1gKTsKICAgIH0KICAgIHRocm93IGVycm9yOwogIH0KfQpfX25hbWUoZmV0Y2hXaXRoVGltZW91dCwgImZldGNoV2l0aFRpbWVvdXQiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJyZXF1ZXN0QDQuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJyZXF1ZXN0L2Rpc3RfdHMvd2VicmVxdWVzdC5jbGllbnQuanMKdmFyIFdlYnJlcXVlc3RDbGllbnQgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiV2VicmVxdWVzdENsaWVudCIpOwogIH0KICBjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHsKICAgIHRoaXMuZGVmYXVsdE9wdGlvbnMgPSBvcHRpb25zOwogICAgdGhpcy5pbnRlcmNlcHRvck1hbmFnZXIgPSBuZXcgSW50ZXJjZXB0b3JNYW5hZ2VyKCk7CiAgICB0aGlzLmNhY2hlTWFuYWdlciA9IG5ldyBDYWNoZU1hbmFnZXIoKTsKICAgIHRoaXMuZGVkdXBsaWNhdG9yID0gbmV3IFJlcXVlc3REZWR1cGxpY2F0b3IoKTsKICB9CiAgLyoqCiAgICogQWRkIGEgZ2xvYmFsIHJlcXVlc3QgaW50ZXJjZXB0b3IKICAgKi8KICBhZGRSZXF1ZXN0SW50ZXJjZXB0b3IoaW50ZXJjZXB0b3IpIHsKICAgIHRoaXMuaW50ZXJjZXB0b3JNYW5hZ2VyLmFkZFJlcXVlc3RJbnRlcmNlcHRvcihpbnRlcmNlcHRvcik7CiAgfQogIC8qKgogICAqIEFkZCBhIGdsb2JhbCByZXNwb25zZSBpbnRlcmNlcHRvcgogICAqLwogIGFkZFJlc3BvbnNlSW50ZXJjZXB0b3IoaW50ZXJjZXB0b3IpIHsKICAgIHRoaXMuaW50ZXJjZXB0b3JNYW5hZ2VyLmFkZFJlc3BvbnNlSW50ZXJjZXB0b3IoaW50ZXJjZXB0b3IpOwogIH0KICAvKioKICAgKiBBZGQgYSBnbG9iYWwgZXJyb3IgaW50ZXJjZXB0b3IKICAgKi8KICBhZGRFcnJvckludGVyY2VwdG9yKGludGVyY2VwdG9yKSB7CiAgICB0aGlzLmludGVyY2VwdG9yTWFuYWdlci5hZGRFcnJvckludGVyY2VwdG9yKGludGVyY2VwdG9yKTsKICB9CiAgLyoqCiAgICogUmVtb3ZlIGEgcmVxdWVzdCBpbnRlcmNlcHRvcgogICAqLwogIHJlbW92ZVJlcXVlc3RJbnRlcmNlcHRvcihpbnRlcmNlcHRvcikgewogICAgdGhpcy5pbnRlcmNlcHRvck1hbmFnZXIucmVtb3ZlUmVxdWVzdEludGVyY2VwdG9yKGludGVyY2VwdG9yKTsKICB9CiAgLyoqCiAgICogUmVtb3ZlIGEgcmVzcG9uc2UgaW50ZXJjZXB0b3IKICAgKi8KICByZW1vdmVSZXNwb25zZUludGVyY2VwdG9yKGludGVyY2VwdG9yKSB7CiAgICB0aGlzLmludGVyY2VwdG9yTWFuYWdlci5yZW1vdmVSZXNwb25zZUludGVyY2VwdG9yKGludGVyY2VwdG9yKTsKICB9CiAgLyoqCiAgICogUmVtb3ZlIGFuIGVycm9yIGludGVyY2VwdG9yCiAgICovCiAgcmVtb3ZlRXJyb3JJbnRlcmNlcHRvcihpbnRlcmNlcHRvcikgewogICAgdGhpcy5pbnRlcmNlcHRvck1hbmFnZXIucmVtb3ZlRXJyb3JJbnRlcmNlcHRvcihpbnRlcmNlcHRvcik7CiAgfQogIC8qKgogICAqIENsZWFyIGFsbCBpbnRlcmNlcHRvcnMKICAgKi8KICBjbGVhckludGVyY2VwdG9ycygpIHsKICAgIHRoaXMuaW50ZXJjZXB0b3JNYW5hZ2VyLmNsZWFyQWxsKCk7CiAgfQogIC8qKgogICAqIENsZWFyIHRoZSBjYWNoZQogICAqLwogIGFzeW5jIGNsZWFyQ2FjaGUoKSB7CiAgICBhd2FpdCB0aGlzLmNhY2hlTWFuYWdlci5jbGVhcigpOwogIH0KICAvKioKICAgKiBFeGVjdXRlIGEgcmVxdWVzdCB3aXRoIGFsbCBjb25maWd1cmVkIGZlYXR1cmVzCiAgICovCiAgYXN5bmMgcmVxdWVzdCh1cmwsIG9wdGlvbnMgPSB7fSkgewogICAgY29uc3QgbWVyZ2VkT3B0aW9ucyA9IHsKICAgICAgLi4udGhpcy5kZWZhdWx0T3B0aW9ucywKICAgICAgLi4ub3B0aW9ucwogICAgfTsKICAgIGxldCByZXF1ZXN0OwogICAgaWYgKHR5cGVvZiB1cmwgPT09ICJzdHJpbmciKSB7CiAgICAgIHJlcXVlc3QgPSBuZXcgUmVxdWVzdCh1cmwsIG1lcmdlZE9wdGlvbnMpOwogICAgfSBlbHNlIHsKICAgICAgcmVxdWVzdCA9IHVybDsKICAgIH0KICAgIHJlcXVlc3QgPSBhd2FpdCB0aGlzLmludGVyY2VwdG9yTWFuYWdlci5wcm9jZXNzUmVxdWVzdChyZXF1ZXN0KTsKICAgIGlmIChtZXJnZWRPcHRpb25zLmludGVyY2VwdG9ycz8ucmVxdWVzdCkgewogICAgICBmb3IgKGNvbnN0IGludGVyY2VwdG9yIG9mIG1lcmdlZE9wdGlvbnMuaW50ZXJjZXB0b3JzLnJlcXVlc3QpIHsKICAgICAgICByZXF1ZXN0ID0gYXdhaXQgaW50ZXJjZXB0b3IocmVxdWVzdCk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGRlZHVwbGljYXRlID0gbWVyZ2VkT3B0aW9ucy5kZWR1cGxpY2F0ZSA/PyBmYWxzZTsKICAgIGlmIChkZWR1cGxpY2F0ZSkgewogICAgICBjb25zdCBkZWR1cGVLZXkgPSB0aGlzLmRlZHVwbGljYXRvci5nZW5lcmF0ZUtleShyZXF1ZXN0KTsKICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5kZWR1cGxpY2F0b3IuZXhlY3V0ZShkZWR1cGVLZXksIGFzeW5jICgpID0+IHsKICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlUmVxdWVzdChyZXF1ZXN0LCBtZXJnZWRPcHRpb25zKTsKICAgICAgfSk7CiAgICAgIHJldHVybiByZXN1bHQucmVzcG9uc2U7CiAgICB9CiAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlUmVxdWVzdChyZXF1ZXN0LCBtZXJnZWRPcHRpb25zKTsKICB9CiAgLyoqCiAgICogSW50ZXJuYWwgcmVxdWVzdCBleGVjdXRpb24gd2l0aCBjYWNoaW5nIGFuZCByZXRyeQogICAqLwogIGFzeW5jIGV4ZWN1dGVSZXF1ZXN0KHJlcXVlc3QsIG9wdGlvbnMpIHsKICAgIHRyeSB7CiAgICAgIGNvbnN0IHJldHJ5T3B0aW9ucyA9IHR5cGVvZiBvcHRpb25zLnJldHJ5ID09PSAib2JqZWN0IiA/IG9wdGlvbnMucmV0cnkgOiBvcHRpb25zLnJldHJ5ID8ge30gOiB2b2lkIDA7CiAgICAgIGNvbnN0IGZldGNoRm5Gb3JSZXF1ZXN0ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShhc3luYyAocmVxKSA9PiB7CiAgICAgICAgY29uc3QgdGltZW91dDIgPSBvcHRpb25zLnRpbWVvdXQgPz8gNmU0OwogICAgICAgIHJldHVybiBhd2FpdCBmZXRjaFdpdGhUaW1lb3V0KHJlcS51cmwsIHsKICAgICAgICAgIG1ldGhvZDogcmVxLm1ldGhvZCwKICAgICAgICAgIGhlYWRlcnM6IHJlcS5oZWFkZXJzLAogICAgICAgICAgYm9keTogcmVxLmJvZHksCiAgICAgICAgICAuLi5vcHRpb25zCiAgICAgICAgfSwgdGltZW91dDIpOwogICAgICB9LCAiZmV0Y2hGbkZvclJlcXVlc3QiKTsKICAgICAgY29uc3QgZmV0Y2hGbkZvckZhbGxiYWNrcyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoYXN5bmMgKHVybCwgaW5pdCkgPT4gewogICAgICAgIGNvbnN0IHRpbWVvdXQyID0gb3B0aW9ucy50aW1lb3V0ID8/IDZlNDsKICAgICAgICByZXR1cm4gYXdhaXQgZmV0Y2hXaXRoVGltZW91dCh1cmwsIGluaXQsIHRpbWVvdXQyKTsKICAgICAgfSwgImZldGNoRm5Gb3JGYWxsYmFja3MiKTsKICAgICAgbGV0IHJlc3BvbnNlOwogICAgICBpZiAocmV0cnlPcHRpb25zKSB7CiAgICAgICAgY29uc3QgcmV0cnlNYW5hZ2VyID0gbmV3IFJldHJ5TWFuYWdlcihyZXRyeU9wdGlvbnMpOwogICAgICAgIGlmIChvcHRpb25zLmZhbGxiYWNrVXJscyAmJiBvcHRpb25zLmZhbGxiYWNrVXJscy5sZW5ndGggPiAwKSB7CiAgICAgICAgICBjb25zdCBhbGxVcmxzID0gW3JlcXVlc3QudXJsLCAuLi5vcHRpb25zLmZhbGxiYWNrVXJsc107CiAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IHJldHJ5TWFuYWdlci5leGVjdXRlV2l0aEZhbGxiYWNrcyhhbGxVcmxzLCB7CiAgICAgICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsCiAgICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycywKICAgICAgICAgICAgYm9keTogcmVxdWVzdC5ib2R5LAogICAgICAgICAgICAuLi5vcHRpb25zCiAgICAgICAgICB9LCBmZXRjaEZuRm9yRmFsbGJhY2tzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCByZXRyeU1hbmFnZXIuZXhlY3V0ZShhc3luYyAoKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY2FjaGVNYW5hZ2VyLmV4ZWN1dGUocmVxdWVzdCwgb3B0aW9ucywgZmV0Y2hGbkZvclJlcXVlc3QpOwogICAgICAgICAgICByZXR1cm4gcmVzdWx0LnJlc3BvbnNlOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY2FjaGVNYW5hZ2VyLmV4ZWN1dGUocmVxdWVzdCwgb3B0aW9ucywgZmV0Y2hGbkZvclJlcXVlc3QpOwogICAgICAgIHJlc3BvbnNlID0gcmVzdWx0LnJlc3BvbnNlOwogICAgICB9CiAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5pbnRlcmNlcHRvck1hbmFnZXIucHJvY2Vzc1Jlc3BvbnNlKHJlc3BvbnNlKTsKICAgICAgaWYgKG9wdGlvbnMuaW50ZXJjZXB0b3JzPy5yZXNwb25zZSkgewogICAgICAgIGZvciAoY29uc3QgaW50ZXJjZXB0b3Igb2Ygb3B0aW9ucy5pbnRlcmNlcHRvcnMucmVzcG9uc2UpIHsKICAgICAgICAgIHJlc3BvbnNlID0gYXdhaXQgaW50ZXJjZXB0b3IocmVzcG9uc2UpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmVzcG9uc2U7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBjb25zdCBwcm9jZXNzZWRFcnJvciA9IGF3YWl0IHRoaXMuaW50ZXJjZXB0b3JNYW5hZ2VyLnByb2Nlc3NFcnJvcihlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSkpOwogICAgICB0aHJvdyBwcm9jZXNzZWRFcnJvcjsKICAgIH0KICB9CiAgLyoqCiAgICogQ29udmVuaWVuY2UgbWV0aG9kOiBHRVQgcmVxdWVzdCByZXR1cm5pbmcgSlNPTgogICAqLwogIGFzeW5jIGdldEpzb24odXJsLCBvcHRpb25zID0ge30pIHsKICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5yZXF1ZXN0KHVybCwgewogICAgICAuLi5vcHRpb25zLAogICAgICBtZXRob2Q6ICJHRVQiLAogICAgICBoZWFkZXJzOiB7CiAgICAgICAgQWNjZXB0OiAiYXBwbGljYXRpb24vanNvbiIsCiAgICAgICAgLi4ub3B0aW9ucy5oZWFkZXJzIHx8IHt9CiAgICAgIH0KICAgIH0pOwogICAgaWYgKCFyZXNwb25zZS5vaykgewogICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9OiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7CiAgICB9CiAgICByZXR1cm4gYXdhaXQgcmVzcG9uc2UuanNvbigpOwogIH0KICAvKioKICAgKiBDb252ZW5pZW5jZSBtZXRob2Q6IFBPU1QgcmVxdWVzdCB3aXRoIEpTT04gYm9keQogICAqLwogIGFzeW5jIHBvc3RKc29uKHVybCwgZGF0YSwgb3B0aW9ucyA9IHt9KSB7CiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMucmVxdWVzdCh1cmwsIHsKICAgICAgLi4ub3B0aW9ucywKICAgICAgbWV0aG9kOiAiUE9TVCIsCiAgICAgIGhlYWRlcnM6IHsKICAgICAgICAiQ29udGVudC1UeXBlIjogImFwcGxpY2F0aW9uL2pzb24iLAogICAgICAgIEFjY2VwdDogImFwcGxpY2F0aW9uL2pzb24iLAogICAgICAgIC4uLm9wdGlvbnMuaGVhZGVycyB8fCB7fQogICAgICB9LAogICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShkYXRhKQogICAgfSk7CiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c306ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKTsKICAgIH0KICAgIHJldHVybiBhd2FpdCByZXNwb25zZS5qc29uKCk7CiAgfQogIC8qKgogICAqIENvbnZlbmllbmNlIG1ldGhvZDogUFVUIHJlcXVlc3Qgd2l0aCBKU09OIGJvZHkKICAgKi8KICBhc3luYyBwdXRKc29uKHVybCwgZGF0YSwgb3B0aW9ucyA9IHt9KSB7CiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMucmVxdWVzdCh1cmwsIHsKICAgICAgLi4ub3B0aW9ucywKICAgICAgbWV0aG9kOiAiUFVUIiwKICAgICAgaGVhZGVyczogewogICAgICAgICJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24vanNvbiIsCiAgICAgICAgQWNjZXB0OiAiYXBwbGljYXRpb24vanNvbiIsCiAgICAgICAgLi4ub3B0aW9ucy5oZWFkZXJzIHx8IHt9CiAgICAgIH0sCiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpCiAgICB9KTsKICAgIGlmICghcmVzcG9uc2Uub2spIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfTogJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApOwogICAgfQogICAgcmV0dXJuIGF3YWl0IHJlc3BvbnNlLmpzb24oKTsKICB9CiAgLyoqCiAgICogQ29udmVuaWVuY2UgbWV0aG9kOiBERUxFVEUgcmVxdWVzdAogICAqLwogIGFzeW5jIGRlbGV0ZUpzb24odXJsLCBvcHRpb25zID0ge30pIHsKICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5yZXF1ZXN0KHVybCwgewogICAgICAuLi5vcHRpb25zLAogICAgICBtZXRob2Q6ICJERUxFVEUiLAogICAgICBoZWFkZXJzOiB7CiAgICAgICAgQWNjZXB0OiAiYXBwbGljYXRpb24vanNvbiIsCiAgICAgICAgLi4ub3B0aW9ucy5oZWFkZXJzIHx8IHt9CiAgICAgIH0KICAgIH0pOwogICAgaWYgKCFyZXNwb25zZS5vaykgewogICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9OiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7CiAgICB9CiAgICByZXR1cm4gYXdhaXQgcmVzcG9uc2UuanNvbigpOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJyZXF1ZXN0QDQuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJyZXF1ZXN0L2Rpc3RfdHMvd2VicmVxdWVzdC5mdW5jdGlvbi5qcwp2YXIgZGVmYXVsdENsaWVudCA9IG5ldyBXZWJyZXF1ZXN0Q2xpZW50KCk7CmFzeW5jIGZ1bmN0aW9uIHdlYnJlcXVlc3QoaW5wdXQsIGluaXQpIHsKICBjb25zdCB1cmwgPSBpbnB1dCBpbnN0YW5jZW9mIFJlcXVlc3QgPyBpbnB1dC51cmwgOiBTdHJpbmcoaW5wdXQpOwogIGNvbnN0IHJlcXVlc3QgPSBpbnB1dCBpbnN0YW5jZW9mIFJlcXVlc3QgPyBpbnB1dCA6IG5ldyBSZXF1ZXN0KHVybCwgaW5pdCk7CiAgcmV0dXJuIGF3YWl0IGRlZmF1bHRDbGllbnQucmVxdWVzdChyZXF1ZXN0LCBpbml0KTsKfQpfX25hbWUod2VicmVxdWVzdCwgIndlYnJlcXVlc3QiKTsKd2VicmVxdWVzdC5nZXRKc29uID0gYXN5bmMgZnVuY3Rpb24odXJsLCBvcHRpb25zKSB7CiAgcmV0dXJuIGF3YWl0IGRlZmF1bHRDbGllbnQuZ2V0SnNvbih1cmwsIG9wdGlvbnMpOwp9Owp3ZWJyZXF1ZXN0LnBvc3RKc29uID0gYXN5bmMgZnVuY3Rpb24odXJsLCBkYXRhLCBvcHRpb25zKSB7CiAgcmV0dXJuIGF3YWl0IGRlZmF1bHRDbGllbnQucG9zdEpzb24odXJsLCBkYXRhLCBvcHRpb25zKTsKfTsKd2VicmVxdWVzdC5wdXRKc29uID0gYXN5bmMgZnVuY3Rpb24odXJsLCBkYXRhLCBvcHRpb25zKSB7CiAgcmV0dXJuIGF3YWl0IGRlZmF1bHRDbGllbnQucHV0SnNvbih1cmwsIGRhdGEsIG9wdGlvbnMpOwp9Owp3ZWJyZXF1ZXN0LmRlbGV0ZUpzb24gPSBhc3luYyBmdW5jdGlvbih1cmwsIG9wdGlvbnMpIHsKICByZXR1cm4gYXdhaXQgZGVmYXVsdENsaWVudC5kZWxldGVKc29uKHVybCwgb3B0aW9ucyk7Cn07CndlYnJlcXVlc3QuYWRkUmVxdWVzdEludGVyY2VwdG9yID0gZnVuY3Rpb24oaW50ZXJjZXB0b3IpIHsKICBkZWZhdWx0Q2xpZW50LmFkZFJlcXVlc3RJbnRlcmNlcHRvcihpbnRlcmNlcHRvcik7Cn07CndlYnJlcXVlc3QuYWRkUmVzcG9uc2VJbnRlcmNlcHRvciA9IGZ1bmN0aW9uKGludGVyY2VwdG9yKSB7CiAgZGVmYXVsdENsaWVudC5hZGRSZXNwb25zZUludGVyY2VwdG9yKGludGVyY2VwdG9yKTsKfTsKd2VicmVxdWVzdC5hZGRFcnJvckludGVyY2VwdG9yID0gZnVuY3Rpb24oaW50ZXJjZXB0b3IpIHsKICBkZWZhdWx0Q2xpZW50LmFkZEVycm9ySW50ZXJjZXB0b3IoaW50ZXJjZXB0b3IpOwp9Owp3ZWJyZXF1ZXN0LmNsZWFySW50ZXJjZXB0b3JzID0gZnVuY3Rpb24oKSB7CiAgZGVmYXVsdENsaWVudC5jbGVhckludGVyY2VwdG9ycygpOwp9Owp3ZWJyZXF1ZXN0LmNsZWFyQ2FjaGUgPSBhc3luYyBmdW5jdGlvbigpIHsKICBhd2FpdCBkZWZhdWx0Q2xpZW50LmNsZWFyQ2FjaGUoKTsKfTsKd2VicmVxdWVzdC5jcmVhdGVDbGllbnQgPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgcmV0dXJuIG5ldyBXZWJyZXF1ZXN0Q2xpZW50KG9wdGlvbnMpOwp9Owp3ZWJyZXF1ZXN0LmdldERlZmF1bHRDbGllbnQgPSBmdW5jdGlvbigpIHsKICByZXR1cm4gZGVmYXVsdENsaWVudDsKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AYXBpLmdsb2JhbCt0eXBlZHJlcXVlc3RAMy4zLjAvbm9kZV9tb2R1bGVzL0BhcGkuZ2xvYmFsL3R5cGVkcmVxdWVzdC9kaXN0X3RzL3BsdWdpbnMuanMKdmFyIGlzb3VuaXF1ZTIgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdF90cygpLCAxKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AYXBpLmdsb2JhbCt0eXBlZHJlcXVlc3RAMy4zLjAvbm9kZV9tb2R1bGVzL0BhcGkuZ2xvYmFsL3R5cGVkcmVxdWVzdC9kaXN0X3RzL2NsYXNzZXMudHlwZWRyZXNwb25zZWVycm9yLmpzCnZhciBUeXBlZFJlc3BvbnNlRXJyb3IgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiVHlwZWRSZXNwb25zZUVycm9yIik7CiAgfQogIGNvbnN0cnVjdG9yKGVycm9yVGV4dEFyZywgZXJyb3JEYXRhQXJnKSB7CiAgICB0aGlzLmVycm9yVGV4dCA9IGVycm9yVGV4dEFyZzsKICAgIHRoaXMuZXJyb3JEYXRhID0gZXJyb3JEYXRhQXJnOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AYXBpLmdsb2JhbCt0eXBlZHJlcXVlc3RAMy4zLjAvbm9kZV9tb2R1bGVzL0BhcGkuZ2xvYmFsL3R5cGVkcmVxdWVzdC9kaXN0X3RzL2NsYXNzZXMudHlwZWR0b29scy5qcwp2YXIgVHlwZWRUb29scyA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJUeXBlZFRvb2xzIik7CiAgfQogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5sb2NhbERhdGEgPSB7fTsKICB9CiAgYXN5bmMgcGFzc0d1YXJkcyhndWFyZHNBcmcsIGRhdGFBcmcpIHsKICAgIGNvbnN0IGd1YXJkU2V0ID0gbmV3IGRpc3RfdHNfZXhwb3J0czkuR3VhcmRTZXQoZ3VhcmRzQXJnKTsKICAgIGNvbnN0IGd1YXJkUmVzdWx0ID0gYXdhaXQgZ3VhcmRTZXQuYWxsR3VhcmRzUGFzcyhkYXRhQXJnKTsKICAgIGlmICghZ3VhcmRSZXN1bHQpIHsKICAgICAgY29uc3QgZmFpbGVkSGludCA9IGF3YWl0IGd1YXJkU2V0LmdldEZhaWxlZEhpbnQoZGF0YUFyZyk7CiAgICAgIHRocm93IG5ldyBUeXBlZFJlc3BvbnNlRXJyb3IoYGd1YXJkIGZhaWxlZDogJHtmYWlsZWRIaW50fWAsIHsgZmFpbGVkSGludCB9KTsKICAgIH0KICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGFwaS5nbG9iYWwrdHlwZWRyZXF1ZXN0QDMuMy4wL25vZGVfbW9kdWxlcy9AYXBpLmdsb2JhbC90eXBlZHJlcXVlc3QvZGlzdF90cy9jbGFzc2VzLnR5cGVkaGFuZGxlci5qcwp2YXIgVHlwZWRIYW5kbGVyID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlR5cGVkSGFuZGxlciIpOwogIH0KICBjb25zdHJ1Y3RvcihtZXRob2RBcmcsIGhhbmRsZXJGdW5jdGlvbkFyZykgewogICAgdGhpcy5tZXRob2QgPSBtZXRob2RBcmc7CiAgICB0aGlzLmhhbmRsZXJGdW5jdGlvbiA9IGhhbmRsZXJGdW5jdGlvbkFyZzsKICB9CiAgLyoqCiAgICogYWRkcyBhIHJlc3BvbnNlIHRvIHRoZSB0eXBlZFJlcXVlc3QKICAgKiBAcGFyYW0gdHlwZWRSZXF1ZXN0QXJnCiAgICovCiAgYXN5bmMgYWRkUmVzcG9uc2UodHlwZWRSZXF1ZXN0QXJnKSB7CiAgICBpZiAodHlwZWRSZXF1ZXN0QXJnLm1ldGhvZCAhPT0gdGhpcy5tZXRob2QpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJ0aGlzIGhhbmRsZXIgaGFzIGJlZW4gZ2l2ZW4gYSB3cm9uZyBtZXRob2QgdG8gYW5zd2VyIHRvLiBQbGVhc2UgdXNlIGEgVHlwZWRSb3V0ZXIgdG8gZmlsdGVyIHJlcXVlc3RzIik7CiAgICB9CiAgICBsZXQgdHlwZWRSZXNwb25zZUVycm9yOwogICAgY29uc3QgdHlwZWR0b29sc0luc3RhbmNlID0gbmV3IFR5cGVkVG9vbHMoKTsKICAgIGlmICh0eXBlZFJlcXVlc3RBcmcubG9jYWxEYXRhKSB7CiAgICAgIHR5cGVkdG9vbHNJbnN0YW5jZS5sb2NhbERhdGEgPSB0eXBlZFJlcXVlc3RBcmcubG9jYWxEYXRhOwogICAgfQogICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmhhbmRsZXJGdW5jdGlvbih0eXBlZFJlcXVlc3RBcmcucmVxdWVzdCwgdHlwZWR0b29sc0luc3RhbmNlKS5jYXRjaCgoZTEwKSA9PiB7CiAgICAgIGlmIChlMTAgaW5zdGFuY2VvZiBUeXBlZFJlc3BvbnNlRXJyb3IpIHsKICAgICAgICB0eXBlZFJlc3BvbnNlRXJyb3IgPSBlMTA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc29sZS5sb2coZTEwKTsKICAgICAgfQogICAgfSk7CiAgICBpZiAodHlwZWRSZXNwb25zZUVycm9yKSB7CiAgICAgIHR5cGVkUmVxdWVzdEFyZy5lcnJvciA9IHsKICAgICAgICB0ZXh0OiB0eXBlZFJlc3BvbnNlRXJyb3IuZXJyb3JUZXh0LAogICAgICAgIGRhdGE6IHR5cGVkUmVzcG9uc2VFcnJvci5lcnJvckRhdGEKICAgICAgfTsKICAgIH0KICAgIGlmIChyZXNwb25zZSkgewogICAgICB0eXBlZFJlcXVlc3RBcmcucmVzcG9uc2UgPSByZXNwb25zZTsKICAgIH0KICAgIHR5cGVkUmVxdWVzdEFyZz8uY29ycmVsYXRpb24/LnBoYXNlID8gdHlwZWRSZXF1ZXN0QXJnLmNvcnJlbGF0aW9uLnBoYXNlID0gInJlc3BvbnNlIiA6IG51bGw7CiAgICByZXR1cm4gdHlwZWRSZXF1ZXN0QXJnOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AYXBpLmdsb2JhbCt0eXBlZHJlcXVlc3RAMy4zLjAvbm9kZV9tb2R1bGVzL0BhcGkuZ2xvYmFsL3R5cGVkcmVxdWVzdC9kaXN0X3RzL2NsYXNzZXMudHlwZWRyb3V0ZXIuanMKdmFyIFR5cGVkUm91dGVyID0gY2xhc3MgX1R5cGVkUm91dGVyIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJUeXBlZFJvdXRlciIpOwogIH0KICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMuaG9va3MgPSB7fTsKICAgIHRoaXMucm91dGVyTWFwID0gbmV3IGRpc3RfdHNfZXhwb3J0czYuT2JqZWN0TWFwKCk7CiAgICB0aGlzLmhhbmRsZXJNYXAgPSBuZXcgZGlzdF90c19leHBvcnRzNi5PYmplY3RNYXAoKTsKICAgIHRoaXMucmVnaXN0ZXJlZFZpcnR1YWxTdHJlYW1zID0gbmV3IGRpc3RfdHNfZXhwb3J0czYuT2JqZWN0TWFwKCk7CiAgICB0aGlzLm1pZGRsZXdhcmVzID0gW107CiAgICB0aGlzLmZpcmVFdmVudEludGVyZXN0TWFwID0gbmV3IGRpc3RfdHNfZXhwb3J0czYuSW50ZXJlc3RNYXAoKGNvcnJlbGF0aW9uSWQpID0+IGNvcnJlbGF0aW9uSWQpOwogIH0KICAvLyBVc2UgZ2xvYmFsVGhpcyBmb3IgY3Jvc3MtYnVuZGxlIGhvb2sgc2hhcmluZwogIHN0YXRpYyBnZXQgZ2xvYmFsSG9va3MoKSB7CiAgICBpZiAoIWdsb2JhbFRoaXMuX190eXBlZFJvdXRlckdsb2JhbEhvb2tzKSB7CiAgICAgIGdsb2JhbFRoaXMuX190eXBlZFJvdXRlckdsb2JhbEhvb2tzID0ge307CiAgICB9CiAgICByZXR1cm4gZ2xvYmFsVGhpcy5fX3R5cGVkUm91dGVyR2xvYmFsSG9va3M7CiAgfQogIHN0YXRpYyBzZXQgZ2xvYmFsSG9va3ModmFsdWUyKSB7CiAgICBnbG9iYWxUaGlzLl9fdHlwZWRSb3V0ZXJHbG9iYWxIb29rcyA9IHZhbHVlMjsKICB9CiAgLyoqCiAgICogU2V0IGdsb2JhbCBob29rcyBmb3IgbW9uaXRvcmluZyBhbGwgVHlwZWRSZXF1ZXN0IHRyYWZmaWMKICAgKiBIb29rcyBhcmUgc2hhcmVkIGFjcm9zcyBhbGwgYnVuZGxlcyB2aWEgZ2xvYmFsVGhpcwogICAqLwogIHN0YXRpYyBzZXRHbG9iYWxIb29rcyhob29rcykgewogICAgY29uc3QgY3VycmVudCA9IF9UeXBlZFJvdXRlci5nbG9iYWxIb29rczsKICAgIF9UeXBlZFJvdXRlci5nbG9iYWxIb29rcyA9IHsgLi4uY3VycmVudCwgLi4uaG9va3MgfTsKICB9CiAgLyoqCiAgICogQ2xlYXIgYWxsIGdsb2JhbCBob29rcwogICAqLwogIHN0YXRpYyBjbGVhckdsb2JhbEhvb2tzKCkgewogICAgZ2xvYmFsVGhpcy5fX3R5cGVkUm91dGVyR2xvYmFsSG9va3MgPSB7fTsKICB9CiAgLyoqCiAgICogU2V0IGluc3RhbmNlLWxldmVsIGhvb2tzIGZvciBtb25pdG9yaW5nIHRyYWZmaWMgdGhyb3VnaCB0aGlzIHJvdXRlcgogICAqLwogIHNldEhvb2tzKGhvb2tzKSB7CiAgICB0aGlzLmhvb2tzID0geyAuLi50aGlzLmhvb2tzLCAuLi5ob29rcyB9OwogIH0KICAvKioKICAgKiBIZWxwZXIgdG8gY2FsbCBib3RoIGdsb2JhbCBhbmQgaW5zdGFuY2UgaG9va3MKICAgKi8KICBjYWxsSG9vayhob29rTmFtZSwgZW50cnkpIHsKICAgIHRyeSB7CiAgICAgIF9UeXBlZFJvdXRlci5nbG9iYWxIb29rc1tob29rTmFtZV0/LihlbnRyeSk7CiAgICAgIHRoaXMuaG9va3NbaG9va05hbWVdPy4oZW50cnkpOwogICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoYFR5cGVkUm91dGVyIGhvb2sgZXJyb3IgKCR7aG9va05hbWV9KTpgLCBlcnIpOwogICAgfQogIH0KICAvKioKICAgKiBBZGRzIGEgbWlkZGxld2FyZSBmdW5jdGlvbiB0aGF0IHJ1bnMgYmVmb3JlIHRoZSBoYW5kbGVyIG9uIHRoaXMgcm91dGVyLgogICAqIFRocm93IFR5cGVkUmVzcG9uc2VFcnJvciB0byByZWplY3QgdGhlIHJlcXVlc3QuCiAgICovCiAgYWRkTWlkZGxld2FyZShmbikgewogICAgdGhpcy5taWRkbGV3YXJlcy5wdXNoKGZuKTsKICB9CiAgLyoqCiAgICogYWRkcyB0aGUgaGFuZGxlciB0byB0aGUgcm91dGluZyBtYXAKICAgKiBAcGFyYW0gdHlwZWRIYW5kbGVyQXJnCiAgICovCiAgYWRkVHlwZWRIYW5kbGVyKHR5cGVkSGFuZGxlckFyZykgewogICAgY29uc3QgZXhpc3RpbmdUeXBlZEhhbmRsZXIgPSB0aGlzLmdldFR5cGVkSGFuZGxlckZvck1ldGhvZCh0eXBlZEhhbmRsZXJBcmcubWV0aG9kKTsKICAgIGlmIChleGlzdGluZ1R5cGVkSGFuZGxlcikgewogICAgICB0aHJvdyBuZXcgRXJyb3IoYGEgVHlwZWRIYW5kbGVyIGZvciAke3R5cGVkSGFuZGxlckFyZy5tZXRob2R9IGFscmVkeSBleGlzdHMhIENhbid0IGFkZCBhbm90aGVyIG9uZS5gKTsKICAgIH0KICAgIHRoaXMuaGFuZGxlck1hcC5hZGQodHlwZWRIYW5kbGVyQXJnKTsKICB9CiAgLyoqCiAgICogYWRkcyBhbm90aGVyIHN1YiB0eXBlZFJvdXRlcgogICAqIEBwYXJhbSB0eXBlZFJlcXVlc3QKICAgKi8KICBhZGRUeXBlZFJvdXRlcih0eXBlZFJvdXRlckFyZykgewogICAgY29uc3Qgcm91dGVyRXhpc3RzID0gdGhpcy5yb3V0ZXJNYXAuZmluZFN5bmMoKHJvdXRlckFyZykgPT4gcm91dGVyQXJnID09PSB0eXBlZFJvdXRlckFyZyk7CiAgICBpZiAoIXJvdXRlckV4aXN0cykgewogICAgICB0aGlzLnJvdXRlck1hcC5hZGQodHlwZWRSb3V0ZXJBcmcpOwogICAgICB0eXBlZFJvdXRlckFyZy5hZGRUeXBlZFJvdXRlcih0aGlzKTsKICAgIH0KICB9CiAgY2hlY2tGb3JUeXBlZEhhbmRsZXIobWV0aG9kQXJnKSB7CiAgICByZXR1cm4gISF0aGlzLmdldFR5cGVkSGFuZGxlckZvck1ldGhvZChtZXRob2RBcmcpOwogIH0KICAvKioKICAgKiBnZXRzIGEgdHlwZWQgUm91dGVyIGZyb20gdGhlIHJvdXRlciBjaGFpbiwgdXBzdHJlYW0gYW5kIGRvd25zdHJlYW0KICAgKiBAcGFyYW0gbWV0aG9kQXJnCiAgICogQHBhcmFtIGNoZWNrVXBzdHJlYW1Sb3V0ZXIKICAgKi8KICBnZXRUeXBlZEhhbmRsZXJGb3JNZXRob2QobWV0aG9kQXJnLCBjaGVja2VkUm91dGVycyA9IFtdKSB7CiAgICBjaGVja2VkUm91dGVycy5wdXNoKHRoaXMpOwogICAgbGV0IHR5cGVkSGFuZGxlcjsKICAgIHR5cGVkSGFuZGxlciA9IHRoaXMuaGFuZGxlck1hcC5maW5kU3luYygoaGFuZGxlcjIpID0+IHsKICAgICAgcmV0dXJuIGhhbmRsZXIyLm1ldGhvZCA9PT0gbWV0aG9kQXJnOwogICAgfSk7CiAgICBpZiAoIXR5cGVkSGFuZGxlcikgewogICAgICB0aGlzLnJvdXRlck1hcC5nZXRBcnJheSgpLmZvckVhY2goKHR5cGVkUm91dGVyQXJnKSA9PiB7CiAgICAgICAgaWYgKCF0eXBlZEhhbmRsZXIgJiYgIWNoZWNrZWRSb3V0ZXJzLmluY2x1ZGVzKHR5cGVkUm91dGVyQXJnKSkgewogICAgICAgICAgdHlwZWRIYW5kbGVyID0gdHlwZWRSb3V0ZXJBcmcuZ2V0VHlwZWRIYW5kbGVyRm9yTWV0aG9kKG1ldGhvZEFyZywgY2hlY2tlZFJvdXRlcnMpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gdHlwZWRIYW5kbGVyOwogIH0KICAvKioKICAgKiBGaW5kcyB0aGUgaGFuZGxlciBBTkQgaXRzIG93bmluZyByb3V0ZXIgZm9yIGEgZ2l2ZW4gbWV0aG9kLgogICAqIE5lZWRlZCB0byBrbm93IHdoaWNoIHJvdXRlcidzIG1pZGRsZXdhcmUgdG8gcnVuLgogICAqLwogIGdldFR5cGVkSGFuZGxlckFuZFJvdXRlcihtZXRob2RBcmcsIGNoZWNrZWRSb3V0ZXJzID0gW10pIHsKICAgIGNoZWNrZWRSb3V0ZXJzLnB1c2godGhpcyk7CiAgICBjb25zdCBoYW5kbGVyMiA9IHRoaXMuaGFuZGxlck1hcC5maW5kU3luYygoaDcpID0+IGg3Lm1ldGhvZCA9PT0gbWV0aG9kQXJnKTsKICAgIGlmIChoYW5kbGVyMikKICAgICAgcmV0dXJuIHsgaGFuZGxlcjogaGFuZGxlcjIsIHJvdXRlcjogdGhpcyB9OwogICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLnJvdXRlck1hcC5nZXRBcnJheSgpKSB7CiAgICAgIGlmICghY2hlY2tlZFJvdXRlcnMuaW5jbHVkZXMoY2hpbGQpKSB7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gY2hpbGQuZ2V0VHlwZWRIYW5kbGVyQW5kUm91dGVyKG1ldGhvZEFyZywgY2hlY2tlZFJvdXRlcnMpOwogICAgICAgIGlmIChyZXN1bHQpCiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgc3RhdGljIHsKICAgIHRoaXMuZGVmYXVsdFJvdXRlT3B0aW9ucyA9IHsKICAgICAgbG9jYWxSZXF1ZXN0OiBmYWxzZSwKICAgICAgc2tpcEhvb2tzOiBmYWxzZQogICAgfTsKICB9CiAgLyoqCiAgICogaWYgdHlwZWRyZXF1ZXN0IG9iamVjdCBoYXMgY29ycmVsYXRpb24ucGhhc2UgPT09ICdyZXF1ZXN0JyAtPiByb3V0ZXMgYSB0eXBlZCByZXF1ZXN0IG9iamVjdCB0byBhIGhhbmRsZXIKICAgKiBpZiB0eXBlZHJlcXVlc3Qgb2JqZWN0IGhhcyBjb3JyZWxhdGlvbi5waGFzZSA9PT0gJ3Jlc3BvbnNlJyAtPiByb3V0ZXMgYSB0eXBlZCByZXF1ZXN0IG9iamVjdCB0byByZXF1ZXN0IGZpcmUgZXZlbnQKICAgKiBAcGFyYW0gdHlwZWRSZXF1ZXN0QXJnCiAgICogQHBhcmFtIG9wdGlvbnNBcmcgLSBPcHRpb25zIG9iamVjdCB3aXRoOgogICAqICAgLSBsb2NhbFJlcXVlc3Q6IHRyZWF0IGFzIGxvY2FsIHJlcXVlc3QgKGRlZmF1bHQ6IGZhbHNlKQogICAqICAgLSBza2lwSG9va3M6IHNraXAgY2FsbGluZyBob29rcyBmb3IgdGhpcyByb3V0aW5nIChkZWZhdWx0OiBmYWxzZSwgdXNlIGZvciBicm9hZGNhc3QtcmVjZWl2ZWQgbWVzc2FnZXMpCiAgICovCiAgYXN5bmMgcm91dGVBbmRBZGRSZXNwb25zZSh0eXBlZFJlcXVlc3RBcmcsIG9wdGlvbnNBcmcgPSB7fSkgewogICAgY29uc3Qgb3B0aW9ucyA9IHsgLi4uX1R5cGVkUm91dGVyLmRlZmF1bHRSb3V0ZU9wdGlvbnMsIC4uLm9wdGlvbnNBcmcgfTsKICAgIHR5cGVkUmVxdWVzdEFyZyA9IFZpcnR1YWxTdHJlYW0uZGVjb2RlUGF5bG9hZEZyb21OZXR3b3JrKHR5cGVkUmVxdWVzdEFyZywgewogICAgICB0eXBlZHJvdXRlcjogdGhpcwogICAgfSk7CiAgICB0eXBlZFJlcXVlc3RBcmcubG9jYWxEYXRhID0gdHlwZWRSZXF1ZXN0QXJnLmxvY2FsRGF0YSB8fCB7fTsKICAgIHR5cGVkUmVxdWVzdEFyZy5sb2NhbERhdGEuZmlyc3RUeXBlZHJvdXRlciA9IHRoaXM7CiAgICBpZiAodHlwZWRSZXF1ZXN0QXJnLm1ldGhvZCA9PT0gIiMjVmlydHVhbFN0cmVhbSMjIikgewogICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmhhbmRsZVN0cmVhbVR5cGVkUmVxdWVzdCh0eXBlZFJlcXVlc3RBcmcpOwogICAgICByZXN1bHQubG9jYWxEYXRhID0gbnVsbDsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGlmICh0eXBlZFJlcXVlc3RBcmc/LmNvcnJlbGF0aW9uPy5waGFzZSA9PT0gInJlcXVlc3QiIHx8IG9wdGlvbnMubG9jYWxSZXF1ZXN0KSB7CiAgICAgIGNvbnN0IHJlcXVlc3RTdGFydFRpbWUgPSBEYXRlLm5vdygpOwogICAgICBpZiAoIW9wdGlvbnMuc2tpcEhvb2tzKSB7CiAgICAgICAgdGhpcy5jYWxsSG9vaygib25JbmNvbWluZ1JlcXVlc3QiLCB7CiAgICAgICAgICBjb3JyZWxhdGlvbklkOiB0eXBlZFJlcXVlc3RBcmcuY29ycmVsYXRpb24/LmlkIHx8ICJ1bmtub3duIiwKICAgICAgICAgIG1ldGhvZDogdHlwZWRSZXF1ZXN0QXJnLm1ldGhvZCwKICAgICAgICAgIGRpcmVjdGlvbjogImluY29taW5nIiwKICAgICAgICAgIHBoYXNlOiAicmVxdWVzdCIsCiAgICAgICAgICB0aW1lc3RhbXA6IHJlcXVlc3RTdGFydFRpbWUsCiAgICAgICAgICBwYXlsb2FkOiB0eXBlZFJlcXVlc3RBcmcucmVxdWVzdAogICAgICAgIH0pOwogICAgICB9CiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZ2V0VHlwZWRIYW5kbGVyQW5kUm91dGVyKHR5cGVkUmVxdWVzdEFyZy5tZXRob2QpOwogICAgICBpZiAoIXJlc3VsdCkgewogICAgICAgIGNvbnNvbGUubG9nKGBDYW5ub3QgZmluZCBoYW5kbGVyIGZvciBtZXRob2RuYW1lICR7dHlwZWRSZXF1ZXN0QXJnLm1ldGhvZH1gKTsKICAgICAgICB0eXBlZFJlcXVlc3RBcmcuZXJyb3IgPSB7CiAgICAgICAgICB0ZXh0OiAiVGhlcmUgaXMgbm8gYXZhaWxhYmxlIG1ldGhvZCBmb3IgdGhpcyBjYWxsIG9uIHRoZSBzZXJ2ZXIgc2lkZSIsCiAgICAgICAgICBkYXRhOiB7fQogICAgICAgIH07CiAgICAgICAgdHlwZWRSZXF1ZXN0QXJnLmNvcnJlbGF0aW9uLnBoYXNlID0gInJlc3BvbnNlIjsKICAgICAgICB0eXBlZFJlcXVlc3RBcmcubG9jYWxEYXRhID0gbnVsbDsKICAgICAgICB0eXBlZFJlcXVlc3RBcmcgPSBWaXJ0dWFsU3RyZWFtLmVuY29kZVBheWxvYWRGb3JOZXR3b3JrKHR5cGVkUmVxdWVzdEFyZywgewogICAgICAgICAgdHlwZWRyb3V0ZXI6IHRoaXMKICAgICAgICB9KTsKICAgICAgICBpZiAoIW9wdGlvbnMuc2tpcEhvb2tzKSB7CiAgICAgICAgICB0aGlzLmNhbGxIb29rKCJvbk91dGdvaW5nUmVzcG9uc2UiLCB7CiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHR5cGVkUmVxdWVzdEFyZy5jb3JyZWxhdGlvbj8uaWQgfHwgInVua25vd24iLAogICAgICAgICAgICBtZXRob2Q6IHR5cGVkUmVxdWVzdEFyZy5tZXRob2QsCiAgICAgICAgICAgIGRpcmVjdGlvbjogIm91dGdvaW5nIiwKICAgICAgICAgICAgcGhhc2U6ICJyZXNwb25zZSIsCiAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSwKICAgICAgICAgICAgZHVyYXRpb25NczogRGF0ZS5ub3coKSAtIHJlcXVlc3RTdGFydFRpbWUsCiAgICAgICAgICAgIHBheWxvYWQ6IHR5cGVkUmVxdWVzdEFyZy5yZXNwb25zZSwKICAgICAgICAgICAgZXJyb3I6IHR5cGVkUmVxdWVzdEFyZy5lcnJvcj8udGV4dAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0eXBlZFJlcXVlc3RBcmc7CiAgICAgIH0KICAgICAgY29uc3QgeyBoYW5kbGVyOiB0eXBlZEhhbmRsZXIsIHJvdXRlcjogb3duaW5nUm91dGVyIH0gPSByZXN1bHQ7CiAgICAgIGlmIChvd25pbmdSb3V0ZXIubWlkZGxld2FyZXMubGVuZ3RoID4gMCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBmb3IgKGNvbnN0IG13IG9mIG93bmluZ1JvdXRlci5taWRkbGV3YXJlcykgewogICAgICAgICAgICBhd2FpdCBtdyh0eXBlZFJlcXVlc3RBcmcpOwogICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKGUxMCkgewogICAgICAgICAgaWYgKGUxMCBpbnN0YW5jZW9mIFR5cGVkUmVzcG9uc2VFcnJvcikgewogICAgICAgICAgICB0eXBlZFJlcXVlc3RBcmcuZXJyb3IgPSB7IHRleHQ6IGUxMC5lcnJvclRleHQsIGRhdGE6IGUxMC5lcnJvckRhdGEgfHwge30gfTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHR5cGVkUmVxdWVzdEFyZy5lcnJvciA9IHsgdGV4dDogZTEwLm1lc3NhZ2UgfHwgIk1pZGRsZXdhcmUgZXJyb3IiLCBkYXRhOiB7fSB9OwogICAgICAgICAgfQogICAgICAgICAgdHlwZWRSZXF1ZXN0QXJnLmNvcnJlbGF0aW9uLnBoYXNlID0gInJlc3BvbnNlIjsKICAgICAgICAgIHR5cGVkUmVxdWVzdEFyZy5sb2NhbERhdGEgPSBudWxsOwogICAgICAgICAgdHlwZWRSZXF1ZXN0QXJnID0gVmlydHVhbFN0cmVhbS5lbmNvZGVQYXlsb2FkRm9yTmV0d29yayh0eXBlZFJlcXVlc3RBcmcsIHsKICAgICAgICAgICAgdHlwZWRyb3V0ZXI6IHRoaXMKICAgICAgICAgIH0pOwogICAgICAgICAgaWYgKCFvcHRpb25zLnNraXBIb29rcykgewogICAgICAgICAgICB0aGlzLmNhbGxIb29rKCJvbk91dGdvaW5nUmVzcG9uc2UiLCB7CiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogdHlwZWRSZXF1ZXN0QXJnLmNvcnJlbGF0aW9uPy5pZCB8fCAidW5rbm93biIsCiAgICAgICAgICAgICAgbWV0aG9kOiB0eXBlZFJlcXVlc3RBcmcubWV0aG9kLAogICAgICAgICAgICAgIGRpcmVjdGlvbjogIm91dGdvaW5nIiwKICAgICAgICAgICAgICBwaGFzZTogInJlc3BvbnNlIiwKICAgICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksCiAgICAgICAgICAgICAgZHVyYXRpb25NczogRGF0ZS5ub3coKSAtIHJlcXVlc3RTdGFydFRpbWUsCiAgICAgICAgICAgICAgcGF5bG9hZDogdHlwZWRSZXF1ZXN0QXJnLnJlc3BvbnNlLAogICAgICAgICAgICAgIGVycm9yOiB0eXBlZFJlcXVlc3RBcmcuZXJyb3I/LnRleHQKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdHlwZWRSZXF1ZXN0QXJnOwogICAgICAgIH0KICAgICAgfQogICAgICB0eXBlZFJlcXVlc3RBcmcgPSBhd2FpdCB0eXBlZEhhbmRsZXIuYWRkUmVzcG9uc2UodHlwZWRSZXF1ZXN0QXJnKTsKICAgICAgdHlwZWRSZXF1ZXN0QXJnLmxvY2FsRGF0YSA9IG51bGw7CiAgICAgIHR5cGVkUmVxdWVzdEFyZyA9IFZpcnR1YWxTdHJlYW0uZW5jb2RlUGF5bG9hZEZvck5ldHdvcmsodHlwZWRSZXF1ZXN0QXJnLCB7CiAgICAgICAgdHlwZWRyb3V0ZXI6IHRoaXMKICAgICAgfSk7CiAgICAgIGlmICghb3B0aW9ucy5za2lwSG9va3MpIHsKICAgICAgICB0aGlzLmNhbGxIb29rKCJvbk91dGdvaW5nUmVzcG9uc2UiLCB7CiAgICAgICAgICBjb3JyZWxhdGlvbklkOiB0eXBlZFJlcXVlc3RBcmcuY29ycmVsYXRpb24/LmlkIHx8ICJ1bmtub3duIiwKICAgICAgICAgIG1ldGhvZDogdHlwZWRSZXF1ZXN0QXJnLm1ldGhvZCwKICAgICAgICAgIGRpcmVjdGlvbjogIm91dGdvaW5nIiwKICAgICAgICAgIHBoYXNlOiAicmVzcG9uc2UiLAogICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLAogICAgICAgICAgZHVyYXRpb25NczogRGF0ZS5ub3coKSAtIHJlcXVlc3RTdGFydFRpbWUsCiAgICAgICAgICBwYXlsb2FkOiB0eXBlZFJlcXVlc3RBcmcucmVzcG9uc2UsCiAgICAgICAgICBlcnJvcjogdHlwZWRSZXF1ZXN0QXJnLmVycm9yPy50ZXh0CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHR5cGVkUmVxdWVzdEFyZzsKICAgIH0gZWxzZSBpZiAodHlwZWRSZXF1ZXN0QXJnPy5jb3JyZWxhdGlvbj8ucGhhc2UgPT09ICJyZXNwb25zZSIpIHsKICAgICAgaWYgKCFvcHRpb25zLnNraXBIb29rcykgewogICAgICAgIHRoaXMuY2FsbEhvb2soIm9uSW5jb21pbmdSZXNwb25zZSIsIHsKICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHR5cGVkUmVxdWVzdEFyZy5jb3JyZWxhdGlvbj8uaWQgfHwgInVua25vd24iLAogICAgICAgICAgbWV0aG9kOiB0eXBlZFJlcXVlc3RBcmcubWV0aG9kLAogICAgICAgICAgZGlyZWN0aW9uOiAiaW5jb21pbmciLAogICAgICAgICAgcGhhc2U6ICJyZXNwb25zZSIsCiAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksCiAgICAgICAgICBwYXlsb2FkOiB0eXBlZFJlcXVlc3RBcmcucmVzcG9uc2UsCiAgICAgICAgICBlcnJvcjogdHlwZWRSZXF1ZXN0QXJnLmVycm9yPy50ZXh0CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgdGhpcy5maXJlRXZlbnRJbnRlcmVzdE1hcC5maW5kSW50ZXJlc3QodHlwZWRSZXF1ZXN0QXJnLmNvcnJlbGF0aW9uLmlkKT8uZnVsbGZpbGxJbnRlcmVzdCh0eXBlZFJlcXVlc3RBcmcpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnNvbGUubG9nKCJyZWNlaXZlZCB3ZWlyZGx5IHNoYXBlZCByZXF1ZXN0Iik7CiAgICAgIGNvbnNvbGUubG9nKHR5cGVkUmVxdWVzdEFyZyk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KICAvKioKICAgKiBoYW5kbGUgc3RyZWFtaW5nCiAgICogQHBhcmFtIHN0cmVhbVRyQXJnCiAgICovCiAgYXN5bmMgaGFuZGxlU3RyZWFtVHlwZWRSZXF1ZXN0KHN0cmVhbVRyQXJnKSB7CiAgICBjb25zdCByZWxldmFudFZpcnR1YWxTdHJlYW0gPSBhd2FpdCB0aGlzLnJlZ2lzdGVyZWRWaXJ0dWFsU3RyZWFtcy5maW5kKGFzeW5jICh2aXJ0dWFsU3RyZWFtQXJnKSA9PiB7CiAgICAgIHJldHVybiB2aXJ0dWFsU3RyZWFtQXJnLnN0cmVhbUlkID09PSBzdHJlYW1UckFyZy5yZXF1ZXN0LnN0cmVhbUlkOwogICAgfSk7CiAgICBpZiAoIXJlbGV2YW50VmlydHVhbFN0cmVhbSkgewogICAgICBjb25zb2xlLmxvZyhgbm8gcmVsZXZhbnQgdmlydHVhbCBzdHJlYW0gZm91bmQgZm9yIHN0cmVhbSB3aXRoIGlkICR7c3RyZWFtVHJBcmcucmVxdWVzdC5zdHJlYW1JZH1gKTsKICAgICAgY29uc29sZS5sb2codGhpcy5yZWdpc3RlcmVkVmlydHVhbFN0cmVhbXMuZ2V0QXJyYXkoKSk7CiAgICAgIHJldHVybiBzdHJlYW1UckFyZzsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnNvbGUubG9nKGBzdWNjZXNzOiBmb3VuZCByZWxldmFudCB2aXJ0dWFsIHN0cmVhbSB3aXRoIGlkICR7c3RyZWFtVHJBcmcucmVxdWVzdC5zdHJlYW1JZH1gKTsKICAgIH0KICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlbGV2YW50VmlydHVhbFN0cmVhbS5oYW5kbGVTdHJlYW1UcihzdHJlYW1UckFyZyk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AYXBpLmdsb2JhbCt0eXBlZHJlcXVlc3RAMy4zLjAvbm9kZV9tb2R1bGVzL0BhcGkuZ2xvYmFsL3R5cGVkcmVxdWVzdC9kaXN0X3RzL2NsYXNzZXMudmlydHVhbHN0cmVhbS5qcwp2YXIgY2xvc2luZ0JpdCA9ICIjIyMjIyMjIyMjIyMjQ0xPU0lORyBCSVQjIyMjIyMjIyMjIyMjIjsKdmFyIFZpcnR1YWxTdHJlYW0gPSBjbGFzcyBfVmlydHVhbFN0cmVhbSB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiVmlydHVhbFN0cmVhbSIpOwogIH0KICAvLyBTVEFUSUMKICBzdGF0aWMgZW5jb2RlUGF5bG9hZEZvck5ldHdvcmsob2JqZWN0UGF5bG9hZCwgY29tbUZ1bmN0aW9ucywgb3JpZ2luYWxQYXlsb2FkLCBwYXRoMiA9IFtdKSB7CiAgICBpZiAoIW9iamVjdFBheWxvYWQpIHsKICAgICAgcmV0dXJuIG9iamVjdFBheWxvYWQ7CiAgICB9CiAgICBpZiAoZGlzdF90c19leHBvcnRzOC5pc0J1ZmZlckxpa2Uob2JqZWN0UGF5bG9hZCkpIHsKICAgICAgcmV0dXJuIG9iamVjdFBheWxvYWQ7CiAgICB9CiAgICBpZiAob2JqZWN0UGF5bG9hZCBpbnN0YW5jZW9mIF9WaXJ0dWFsU3RyZWFtKSB7CiAgICAgIGlmICghb2JqZWN0UGF5bG9hZC5zaWRlICYmIGNvbW1GdW5jdGlvbnMuc2VuZE1ldGhvZCkgewogICAgICAgIG9iamVjdFBheWxvYWQuc2lkZSA9ICJyZXF1ZXN0aW5nIjsKICAgICAgICBvYmplY3RQYXlsb2FkLnNlbmRNZXRob2QgPSBjb21tRnVuY3Rpb25zLnNlbmRNZXRob2Q7CiAgICAgIH0KICAgICAgaWYgKCFvYmplY3RQYXlsb2FkLnNpZGUgJiYgY29tbUZ1bmN0aW9ucy50eXBlZHJvdXRlcikgewogICAgICAgIG9iamVjdFBheWxvYWQuc2lkZSA9ICJyZXNwb25kaW5nIjsKICAgICAgICBvYmplY3RQYXlsb2FkLnR5cGVkcm91dGVyID0gY29tbUZ1bmN0aW9ucy50eXBlZHJvdXRlcjsKICAgICAgICBjb21tRnVuY3Rpb25zLnR5cGVkcm91dGVyLnJlZ2lzdGVyZWRWaXJ0dWFsU3RyZWFtcy5hZGQob2JqZWN0UGF5bG9hZCk7CiAgICAgIH0KICAgICAgaWYgKCFvcmlnaW5hbFBheWxvYWQucmVzcG9uc2UgfHwgcGF0aDIuaW5jbHVkZXMoInJlc3BvbnNlIikpIHsKICAgICAgICBvYmplY3RQYXlsb2FkLnN0YXJ0S2VlcEFsaXZlTG9vcCgpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICBfaXNWaXJ0dWFsU3RyZWFtOiB0cnVlLAogICAgICAgICAgc3RyZWFtSWQ6IG9iamVjdFBheWxvYWQuc3RyZWFtSWQKICAgICAgICB9OwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICBfT0JNSVRURURfVklSVFVBTF9TVFJFQU06IHRydWUsCiAgICAgICAgICByZWFzb246ICJwYXRoIGlzIHVuZGVyIC5yZXF1ZXN0OiBvYm1pdHRlZCBmb3IgZGVkdXBsaWNhdGlvbiByZWFzb25zIGluIHJlc3BvbnNlIGN5Y2xlLiIKICAgICAgICB9OwogICAgICB9CiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0UGF5bG9hZCkpIHsKICAgICAgcmV0dXJuIG9iamVjdFBheWxvYWQubWFwKChpdGVtLCBpbmRleDIpID0+IF9WaXJ0dWFsU3RyZWFtLmVuY29kZVBheWxvYWRGb3JOZXR3b3JrKAogICAgICAgIGl0ZW0sCiAgICAgICAgY29tbUZ1bmN0aW9ucywKICAgICAgICBvcmlnaW5hbFBheWxvYWQgfHwgb2JqZWN0UGF5bG9hZCwKICAgICAgICBwYXRoMi5jb25jYXQoU3RyaW5nKGluZGV4MikpCiAgICAgICAgLy8gQ29udmVydCBpbmRleCB0byBzdHJpbmcgYW5kIGNvbmNhdGVuYXRlIHRvIHBhdGgKICAgICAgKSk7CiAgICB9IGVsc2UgaWYgKG9iamVjdFBheWxvYWQgIT09IG51bGwgJiYgdHlwZW9mIG9iamVjdFBheWxvYWQgPT09ICJvYmplY3QiKSB7CiAgICAgIHJldHVybiBPYmplY3QuZW50cmllcyhvYmplY3RQYXlsb2FkKS5yZWR1Y2UoKGFjYywgW2tleTIsIHZhbHVlMl0pID0+IHsKICAgICAgICBjb25zdCBuZXdQYXRoID0gcGF0aDIuY29uY2F0KGtleTIpOwogICAgICAgIGFjY1trZXkyXSA9IF9WaXJ0dWFsU3RyZWFtLmVuY29kZVBheWxvYWRGb3JOZXR3b3JrKHZhbHVlMiwgY29tbUZ1bmN0aW9ucywgb3JpZ2luYWxQYXlsb2FkIHx8IG9iamVjdFBheWxvYWQsIG5ld1BhdGgpOwogICAgICAgIHJldHVybiBhY2M7CiAgICAgIH0sIHt9KTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBvYmplY3RQYXlsb2FkOwogICAgfQogIH0KICBzdGF0aWMgZGVjb2RlUGF5bG9hZEZyb21OZXR3b3JrKG9iamVjdFBheWxvYWQsIGNvbW1GdW5jdGlvbnMpIHsKICAgIGlmIChkaXN0X3RzX2V4cG9ydHM4LmlzQnVmZmVyTGlrZShvYmplY3RQYXlsb2FkKSB8fCBvYmplY3RQYXlsb2FkIGluc3RhbmNlb2YgVHlwZWRSb3V0ZXIpIHsKICAgICAgcmV0dXJuIG9iamVjdFBheWxvYWQ7CiAgICB9CiAgICBpZiAob2JqZWN0UGF5bG9hZCAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqZWN0UGF5bG9hZCA9PT0gIm9iamVjdCIpIHsKICAgICAgaWYgKG9iamVjdFBheWxvYWQgaW5zdGFuY2VvZiBTZXQgfHwgb2JqZWN0UGF5bG9hZCBpbnN0YW5jZW9mIE1hcCB8fCBvYmplY3RQYXlsb2FkIGluc3RhbmNlb2YgRGF0ZSB8fCBvYmplY3RQYXlsb2FkIGluc3RhbmNlb2YgUmVnRXhwIHx8IG9iamVjdFBheWxvYWQgaW5zdGFuY2VvZiBFcnJvciB8fCBvYmplY3RQYXlsb2FkIGluc3RhbmNlb2YgUHJvbWlzZSB8fCB0eXBlb2Ygb2JqZWN0UGF5bG9hZC50aGVuID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgcmV0dXJuIG9iamVjdFBheWxvYWQ7CiAgICAgIH0KICAgICAgaWYgKG9iamVjdFBheWxvYWQuX2lzVmlydHVhbFN0cmVhbSkgewogICAgICAgIGNvbnN0IHZpcnR1YWxTdHJlYW0gPSBuZXcgX1ZpcnR1YWxTdHJlYW0oKTsKICAgICAgICB2aXJ0dWFsU3RyZWFtLnN0cmVhbUlkID0gb2JqZWN0UGF5bG9hZC5zdHJlYW1JZDsKICAgICAgICBpZiAoIXZpcnR1YWxTdHJlYW0uc2lkZSAmJiBjb21tRnVuY3Rpb25zLnNlbmRNZXRob2QpIHsKICAgICAgICAgIHZpcnR1YWxTdHJlYW0uc2lkZSA9ICJyZXF1ZXN0aW5nIjsKICAgICAgICAgIHZpcnR1YWxTdHJlYW0uc2VuZE1ldGhvZCA9IGNvbW1GdW5jdGlvbnMuc2VuZE1ldGhvZDsKICAgICAgICB9CiAgICAgICAgaWYgKCF2aXJ0dWFsU3RyZWFtLnNpZGUgJiYgY29tbUZ1bmN0aW9ucy50eXBlZHJvdXRlcikgewogICAgICAgICAgdmlydHVhbFN0cmVhbS5zaWRlID0gInJlc3BvbmRpbmciOwogICAgICAgICAgdmlydHVhbFN0cmVhbS50eXBlZHJvdXRlciA9IGNvbW1GdW5jdGlvbnMudHlwZWRyb3V0ZXI7CiAgICAgICAgICBjb21tRnVuY3Rpb25zLnR5cGVkcm91dGVyLnJlZ2lzdGVyZWRWaXJ0dWFsU3RyZWFtcy5hZGQodmlydHVhbFN0cmVhbSk7CiAgICAgICAgfQogICAgICAgIHZpcnR1YWxTdHJlYW0uc3RhcnRLZWVwQWxpdmVMb29wKCk7CiAgICAgICAgcmV0dXJuIHZpcnR1YWxTdHJlYW07CiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvYmplY3RQYXlsb2FkKSkgewogICAgICAgIGNvbnN0IHJldHVybkFycmF5ID0gW107CiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG9iamVjdFBheWxvYWQpIHsKICAgICAgICAgIHJldHVybkFycmF5LnB1c2goX1ZpcnR1YWxTdHJlYW0uZGVjb2RlUGF5bG9hZEZyb21OZXR3b3JrKGl0ZW0sIGNvbW1GdW5jdGlvbnMpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldHVybkFycmF5OwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmplY3RQYXlsb2FkKS5yZWR1Y2UoKGFjYywga2V5MikgPT4gewogICAgICAgICAgYWNjW2tleTJdID0gX1ZpcnR1YWxTdHJlYW0uZGVjb2RlUGF5bG9hZEZyb21OZXR3b3JrKG9iamVjdFBheWxvYWRba2V5Ml0sIGNvbW1GdW5jdGlvbnMpOwogICAgICAgICAgcmV0dXJuIGFjYzsKICAgICAgICB9LCB7fSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBvYmplY3RQYXlsb2FkOwogICAgfQogIH0KICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMuc3RyZWFtSWQgPSBpc291bmlxdWUyLnVuaSgpOwogICAgdGhpcy5rZWVwQWxpdmUgPSB0cnVlOwogICAgdGhpcy5zZW5kQmFja3ByZXNzdXJlZEFycmF5ID0gbmV3IGRpc3RfdHNfZXhwb3J0czYuQmFja3ByZXNzdXJlZEFycmF5KDE2KTsKICAgIHRoaXMucmVjZWl2ZUJhY2twcmVzc3VyZWRBcnJheSA9IG5ldyBkaXN0X3RzX2V4cG9ydHM2LkJhY2twcmVzc3VyZWRBcnJheSgxNik7CiAgfQogIC8qKgogICAqIFJlY29uc3RpdHV0ZSBiaW5hcnkgZGF0YSB0aGF0IHdhcyBsb3N0IHRocm91Z2ggSlNPTiBzZXJpYWxpemF0aW9uLgogICAqIE5vZGUuanMgQnVmZmVyIGJlY29tZXMge3R5cGU6ICJCdWZmZXIiLCBkYXRhOiBbLi4uXX0sCiAgICogVWludDhBcnJheSBiZWNvbWVzIHsiMCI6IDEwNCwgIjEiOiAxMDEsIC4uLn0uCiAgICovCiAgc3RhdGljIHJlY29uc3RpdHV0ZUJpbmFyeURhdGEoZGF0YSkgewogICAgaWYgKGRhdGEgPT0gbnVsbCB8fCBkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSB8fCB0eXBlb2YgQnVmZmVyICE9PSAidW5kZWZpbmVkIiAmJiBCdWZmZXIuaXNCdWZmZXIoZGF0YSkpIHsKICAgICAgcmV0dXJuIGRhdGE7CiAgICB9CiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICJvYmplY3QiKSB7CiAgICAgIGlmIChkYXRhLnR5cGUgPT09ICJCdWZmZXIiICYmIEFycmF5LmlzQXJyYXkoZGF0YS5kYXRhKSkgewogICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShkYXRhLmRhdGEpOwogICAgICB9CiAgICAgIGNvbnN0IGtleXMyID0gT2JqZWN0LmtleXMoZGF0YSk7CiAgICAgIGlmIChrZXlzMi5sZW5ndGggPiAwICYmIGtleXMyLmV2ZXJ5KChrMykgPT4gL15cZCskLy50ZXN0KGszKSkpIHsKICAgICAgICBjb25zdCBhcnIgPSBuZXcgQXJyYXkoa2V5czIubGVuZ3RoKTsKICAgICAgICBmb3IgKGNvbnN0IGszIG9mIGtleXMyKSB7CiAgICAgICAgICBhcnJbTnVtYmVyKGszKV0gPSBkYXRhW2szXTsKICAgICAgICB9CiAgICAgICAgaWYgKGFyci5ldmVyeSgodjQpID0+IHR5cGVvZiB2NCA9PT0gIm51bWJlciIpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYXJyKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBkYXRhOwogIH0KICAvKioKICAgKiB0YWtlcyBjYXJlIG9mIHNlbmRpbmcKICAgKi8KICBhc3luYyB3b3JrT25RdWV1ZSgpIHsKICAgIGlmICh0aGlzLndvcmtpbmdEZWZlcnJlZCkgewogICAgICByZXR1cm4gdGhpcy53b3JraW5nRGVmZXJyZWQucHJvbWlzZTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMud29ya2luZ0RlZmVycmVkID0gZGlzdF90c19leHBvcnRzLmRlZmVyKCk7CiAgICB9CiAgICBpZiAodGhpcy5zaWRlID09PSAicmVxdWVzdGluZyIpIHsKICAgICAgbGV0IHRoaXNTaWRlSXNCYWNrcHJlc3N1cmVkID0gIXRoaXMucmVjZWl2ZUJhY2twcmVzc3VyZWRBcnJheS5jaGVja1NwYWNlQXZhaWxhYmxlKCk7CiAgICAgIGxldCBvdGhlclNpZGVIYXNOZXh0ID0gZmFsc2U7CiAgICAgIGxldCBvdGhlclNpZGVJc0JhY2twcmVzc3VyZWQgPSBmYWxzZTsKICAgICAgY29uc3QgZ2V0RmVlZGJhY2sgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGFzeW5jICgpID0+IHsKICAgICAgICBjb25zdCBzdHJlYW1UciA9IGF3YWl0IHRoaXMuc2VuZE1ldGhvZCh7CiAgICAgICAgICBtZXRob2Q6ICIjI1ZpcnR1YWxTdHJlYW0jIyIsCiAgICAgICAgICByZXF1ZXN0OiB7CiAgICAgICAgICAgIHN0cmVhbUlkOiB0aGlzLnN0cmVhbUlkLAogICAgICAgICAgICBjeWNsZUlkOiBpc291bmlxdWUyLnVuaSgpLAogICAgICAgICAgICBjeWNsZTogInJlcXVlc3QiLAogICAgICAgICAgICBtYWluUHVycG9zZTogImZlZWRiYWNrIiwKICAgICAgICAgICAgbmV4dDogdGhpcy5zZW5kQmFja3ByZXNzdXJlZEFycmF5LmRhdGEubGVuZ3RoID4gMCwKICAgICAgICAgICAgYmFja3ByZXNzdXJlOiAhdGhpcy5yZWNlaXZlQmFja3ByZXNzdXJlZEFycmF5LmNoZWNrU3BhY2VBdmFpbGFibGUoKQogICAgICAgICAgfSwKICAgICAgICAgIHJlc3BvbnNlOiBudWxsCiAgICAgICAgfSkuY2F0Y2goKCkgPT4gewogICAgICAgICAgY29uc29sZS5sb2coInN0cmVhbSBlbmRlZCBpbW1hdHVyZWx5Iik7CiAgICAgICAgICB0aGlzLmtlZXBBbGl2ZSA9IGZhbHNlOwogICAgICAgIH0pOwogICAgICAgIGlmIChzdHJlYW1UciAmJiBzdHJlYW1Uci5yZXNwb25zZSkgewogICAgICAgICAgb3RoZXJTaWRlSXNCYWNrcHJlc3N1cmVkID0gc3RyZWFtVHIucmVzcG9uc2UuYmFja3ByZXNzdXJlOwogICAgICAgICAgb3RoZXJTaWRlSGFzTmV4dCA9IHN0cmVhbVRyLnJlc3BvbnNlLm5leHQ7CiAgICAgICAgfQogICAgICB9LCAiZ2V0RmVlZGJhY2siKTsKICAgICAgYXdhaXQgZ2V0RmVlZGJhY2soKTsKICAgICAgd2hpbGUgKHRoaXMuc2VuZEJhY2twcmVzc3VyZWRBcnJheS5kYXRhLmxlbmd0aCA+IDAgfHwgb3RoZXJTaWRlSGFzTmV4dCkgewogICAgICAgIGlmIChvdGhlclNpZGVJc0JhY2twcmVzc3VyZWQpIHsKICAgICAgICAgIHdoaWxlIChvdGhlclNpZGVJc0JhY2twcmVzc3VyZWQpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coIndhaXRpbmcgZm9yIGZlZWRiYWNrIGJlY2F1c2Ugb2YgYmFja3ByZXNzdXJlLi4uIik7CiAgICAgICAgICAgIGF3YWl0IGRpc3RfdHNfZXhwb3J0czMuZGVsYXlGb3IoNTApOwogICAgICAgICAgICBhd2FpdCBnZXRGZWVkYmFjaygpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsZXQgZGF0YUFyZzsKICAgICAgICBpZiAodGhpcy5zZW5kQmFja3ByZXNzdXJlZEFycmF5LmRhdGEubGVuZ3RoID4gMCkgewogICAgICAgICAgZGF0YUFyZyA9IHRoaXMuc2VuZEJhY2twcmVzc3VyZWRBcnJheS5zaGlmdCgpOwogICAgICAgIH0KICAgICAgICBsZXQgc3RyZWFtVHI7CiAgICAgICAgc3RyZWFtVHIgPSBhd2FpdCB0aGlzLnNlbmRNZXRob2QoewogICAgICAgICAgbWV0aG9kOiAiIyNWaXJ0dWFsU3RyZWFtIyMiLAogICAgICAgICAgcmVxdWVzdDogewogICAgICAgICAgICBzdHJlYW1JZDogdGhpcy5zdHJlYW1JZCwKICAgICAgICAgICAgY3ljbGVJZDogaXNvdW5pcXVlMi51bmkoKSwKICAgICAgICAgICAgY3ljbGU6ICJyZXF1ZXN0IiwKICAgICAgICAgICAgbWFpblB1cnBvc2U6IGRhdGFBcmcgPyAiY2h1bmsiIDogInJlYWQiLAogICAgICAgICAgICBiYWNrcHJlc3N1cmU6IHRoaXNTaWRlSXNCYWNrcHJlc3N1cmVkLAogICAgICAgICAgICBuZXh0OiB0aGlzLnNlbmRCYWNrcHJlc3N1cmVkQXJyYXkuZGF0YS5sZW5ndGggPiAwLAogICAgICAgICAgICAuLi5kYXRhQXJnID8geyBjaHVua0RhdGE6IGRhdGFBcmcgfSA6IHt9CiAgICAgICAgICB9LAogICAgICAgICAgcmVzcG9uc2U6IG51bGwKICAgICAgICB9KS5jYXRjaCgoKSA9PiB7CiAgICAgICAgICBjb25zb2xlLmxvZygic3RyZWFtIGVuZGVkIGltbWF0dXJlbHkiKTsKICAgICAgICAgIHRoaXMua2VlcEFsaXZlID0gZmFsc2U7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9KTsKICAgICAgICBpZiAoc3RyZWFtVHIgJiYgc3RyZWFtVHIucmVzcG9uc2UgJiYgc3RyZWFtVHIucmVzcG9uc2UuY2h1bmtEYXRhKSB7CiAgICAgICAgICB0aGlzLnJlY2VpdmVCYWNrcHJlc3N1cmVkQXJyYXkucHVzaChfVmlydHVhbFN0cmVhbS5yZWNvbnN0aXR1dGVCaW5hcnlEYXRhKHN0cmVhbVRyLnJlc3BvbnNlLmNodW5rRGF0YSkpOwogICAgICAgIH0KICAgICAgICBvdGhlclNpZGVJc0JhY2twcmVzc3VyZWQgPSBzdHJlYW1UciAmJiBzdHJlYW1Uci5yZXNwb25zZSAmJiBzdHJlYW1Uci5yZXNwb25zZS5iYWNrcHJlc3N1cmU7CiAgICAgICAgdGhpc1NpZGVJc0JhY2twcmVzc3VyZWQgPSAhdGhpcy5yZWNlaXZlQmFja3ByZXNzdXJlZEFycmF5LmNoZWNrU3BhY2VBdmFpbGFibGUoKTsKICAgICAgICBvdGhlclNpZGVIYXNOZXh0ID0gc3RyZWFtVHIgJiYgc3RyZWFtVHIucmVzcG9uc2UgJiYgc3RyZWFtVHIucmVzcG9uc2UubmV4dDsKICAgICAgfQogICAgfQogICAgdGhpcy53b3JraW5nRGVmZXJyZWQucmVzb2x2ZSgpOwogICAgdGhpcy53b3JraW5nRGVmZXJyZWQgPSBudWxsOwogIH0KICAvKioKICAgKiBUaGlzIG1ldGhvZCBoYW5kbGVzIHRoZSBzdHJlYW0gb25seSBvbiB0aGUgcmVzcG9uZGluZyBzaWRlCiAgICogQHBhcmFtIHN0cmVhbVRyQXJnCiAgICogQHJldHVybnMKICAgKi8KICBhc3luYyBoYW5kbGVTdHJlYW1UcihzdHJlYW1UckFyZykgewogICAgaWYgKHN0cmVhbVRyQXJnLnJlcXVlc3Qua2VlcEFsaXZlID09PSB0cnVlICYmIHRoaXMua2VlcEFsaXZlID09PSB0cnVlKSB7CiAgICAgIHRoaXMubGFzdEtlZXBBbGl2ZUV2ZW50ID0gRGF0ZS5ub3coKTsKICAgIH0gZWxzZSBpZiAoc3RyZWFtVHJBcmcucmVxdWVzdC5rZWVwQWxpdmUgPT09IGZhbHNlKSB7CiAgICAgIHRoaXMua2VlcEFsaXZlID0gZmFsc2U7CiAgICB9CiAgICBpZiAoc3RyZWFtVHJBcmcucmVxdWVzdC5tYWluUHVycG9zZSA9PT0gImtlZXBBbGl2ZSIpIHsKICAgICAgc3RyZWFtVHJBcmcucmVzcG9uc2UgPSB7CiAgICAgICAgc3RyZWFtSWQ6IHRoaXMuc3RyZWFtSWQsCiAgICAgICAgY3ljbGVJZDogc3RyZWFtVHJBcmcucmVxdWVzdC5jeWNsZUlkLAogICAgICAgIGN5Y2xlOiAicmVzcG9uc2UiLAogICAgICAgIG1haW5QdXJwb3NlOiAia2VlcEFsaXZlIiwKICAgICAgICBrZWVwQWxpdmU6IHRoaXMua2VlcEFsaXZlLAogICAgICAgIG5leHQ6IHRoaXMuc2VuZEJhY2twcmVzc3VyZWRBcnJheS5kYXRhLmxlbmd0aCA+IDAsCiAgICAgICAgYmFja3ByZXNzdXJlOiAhdGhpcy5yZWNlaXZlQmFja3ByZXNzdXJlZEFycmF5LmNoZWNrU3BhY2VBdmFpbGFibGUoKQogICAgICB9OwogICAgfQogICAgaWYgKHN0cmVhbVRyQXJnLnJlcXVlc3QubWFpblB1cnBvc2UgPT09ICJmZWVkYmFjayIpIHsKICAgICAgc3RyZWFtVHJBcmcucmVzcG9uc2UgPSB7CiAgICAgICAgc3RyZWFtSWQ6IHRoaXMuc3RyZWFtSWQsCiAgICAgICAgY3ljbGVJZDogc3RyZWFtVHJBcmcucmVxdWVzdC5jeWNsZUlkLAogICAgICAgIGN5Y2xlOiAicmVzcG9uc2UiLAogICAgICAgIG1haW5QdXJwb3NlOiAiZmVlZGJhY2siLAogICAgICAgIG5leHQ6IHRoaXMuc2VuZEJhY2twcmVzc3VyZWRBcnJheS5kYXRhLmxlbmd0aCA+IDAsCiAgICAgICAgYmFja3ByZXNzdXJlOiAhdGhpcy5yZWNlaXZlQmFja3ByZXNzdXJlZEFycmF5LmNoZWNrU3BhY2VBdmFpbGFibGUoKQogICAgICB9OwogICAgfQogICAgaWYgKHN0cmVhbVRyQXJnLnJlcXVlc3QubWFpblB1cnBvc2UgPT09ICJjaHVuayIpIHsKICAgICAgdGhpcy5yZWNlaXZlQmFja3ByZXNzdXJlZEFycmF5LnB1c2goX1ZpcnR1YWxTdHJlYW0ucmVjb25zdGl0dXRlQmluYXJ5RGF0YShzdHJlYW1UckFyZy5yZXF1ZXN0LmNodW5rRGF0YSkpOwogICAgICBpZiAodGhpcy5zZW5kQmFja3ByZXNzdXJlZEFycmF5LmRhdGEubGVuZ3RoID4gMCAmJiBzdHJlYW1UckFyZy5yZXNwb25zZS5iYWNrcHJlc3N1cmUgPT09IGZhbHNlKSB7CiAgICAgICAgY29uc3QgZGF0YUFyZyA9IHRoaXMuc2VuZEJhY2twcmVzc3VyZWRBcnJheS5zaGlmdCgpOwogICAgICAgIHN0cmVhbVRyQXJnLnJlc3BvbnNlID0gewogICAgICAgICAgc3RyZWFtSWQ6IHRoaXMuc3RyZWFtSWQsCiAgICAgICAgICBjeWNsZUlkOiBzdHJlYW1UckFyZy5yZXF1ZXN0LmN5Y2xlSWQsCiAgICAgICAgICBjeWNsZTogInJlc3BvbnNlIiwKICAgICAgICAgIG1haW5QdXJwb3NlOiAiY2h1bmsiLAogICAgICAgICAgbmV4dDogdGhpcy5zZW5kQmFja3ByZXNzdXJlZEFycmF5LmRhdGEubGVuZ3RoID4gMSwKICAgICAgICAgIC8vIDEgYW5kIG5vdCAwIGJlY2F1c2Ugd2UgY2FsbCBzaGlmdCBhIGZldyBsaW5lcyBkb3duCiAgICAgICAgICBiYWNrcHJlc3N1cmU6ICF0aGlzLnJlY2VpdmVCYWNrcHJlc3N1cmVkQXJyYXkuY2hlY2tTcGFjZUF2YWlsYWJsZSgpLAogICAgICAgICAgY2h1bmtEYXRhOiB0aGlzLnNlbmRCYWNrcHJlc3N1cmVkQXJyYXkuc2hpZnQoKQogICAgICAgIH07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RyZWFtVHJBcmcucmVzcG9uc2UgPSB7CiAgICAgICAgICBzdHJlYW1JZDogdGhpcy5zdHJlYW1JZCwKICAgICAgICAgIGN5Y2xlSWQ6IHN0cmVhbVRyQXJnLnJlcXVlc3QuY3ljbGVJZCwKICAgICAgICAgIGN5Y2xlOiAicmVzcG9uc2UiLAogICAgICAgICAgbWFpblB1cnBvc2U6ICJmZWVkYmFjayIsCiAgICAgICAgICBuZXh0OiB0aGlzLnNlbmRCYWNrcHJlc3N1cmVkQXJyYXkuZGF0YS5sZW5ndGggPiAwLAogICAgICAgICAgYmFja3ByZXNzdXJlOiAhdGhpcy5yZWNlaXZlQmFja3ByZXNzdXJlZEFycmF5LmNoZWNrU3BhY2VBdmFpbGFibGUoKQogICAgICAgIH07CiAgICAgIH0KICAgICAgc3RyZWFtVHJBcmcucmVxdWVzdCA9IG51bGw7CiAgICB9CiAgICByZXR1cm4gc3RyZWFtVHJBcmc7CiAgfQogIC8vIGxpZmVjeWNsZSBtZXRob2RzCiAgLyoqCiAgICogY2xvc2VzIHRoZSB2aXJ0dWFsIHN0cmVhbQogICAqLwogIGFzeW5jIGNsZWFudXAoKSB7CiAgICBpZiAodGhpcy50eXBlZHJvdXRlcikgewogICAgICB0aGlzLnR5cGVkcm91dGVyLnJlZ2lzdGVyZWRWaXJ0dWFsU3RyZWFtcy5yZW1vdmUodGhpcyk7CiAgICB9CiAgfQogIC8qKgogICAqIGEga2VlcEFsaXZlIGxvb3AgdGhhdCB3b3JrcyBhY3Jvc3MgdGVjaG5vbG9naWVzCiAgICovCiAgYXN5bmMgc3RhcnRLZWVwQWxpdmVMb29wKCkgewogICAgaWYgKHRoaXMuc2lkZSA9PT0gInJlc3BvbmRpbmciKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGF3YWl0IGRpc3RfdHNfZXhwb3J0czMuZGVsYXlGb3IoMCk7CiAgICBjb25zb2xlLmxvZyhgc3RhcnRpbmcga2VlcGFsaXZlIGxvb3Agb24gc2lkZSAke3RoaXMuc2lkZX1gKTsKICAgIGxldCBjb3VudGVyID0gMDsKICAgIGtlZXBBbGl2ZUxvb3A6IHdoaWxlICh0aGlzLmtlZXBBbGl2ZSkgewogICAgICBhd2FpdCB0aGlzLnRyaWdnZXJLZWVwQWxpdmUoKTsKICAgICAgYXdhaXQgZGlzdF90c19leHBvcnRzMy5kZWxheUZvcigxZTMpOwogICAgfQogICAgYXdhaXQgZGlzdF90c19leHBvcnRzMy5kZWxheUZvcigxZTMpOwogICAgYXdhaXQgdGhpcy5jbGVhbnVwKCk7CiAgICBjb25zb2xlLmxvZyhgY2xlYW5lZCB1cCBmb3Igc3RyZWFtICR7dGhpcy5zdHJlYW1JZH1gKTsKICB9CiAgYXN5bmMgdHJpZ2dlcktlZXBBbGl2ZSgpIHsKICAgIGlmICh0aGlzLnNpZGUgPT09ICJyZXF1ZXN0aW5nIikgewogICAgICBjb25zb2xlLmxvZyhga2VlcGFsaXZlIHNlbnQuYCk7CiAgICAgIGNvbnN0IHN0cmVhbVRyID0gYXdhaXQgdGhpcy5zZW5kTWV0aG9kKHsKICAgICAgICBtZXRob2Q6ICIjI1ZpcnR1YWxTdHJlYW0jIyIsCiAgICAgICAgcmVxdWVzdDogewogICAgICAgICAgc3RyZWFtSWQ6IHRoaXMuc3RyZWFtSWQsCiAgICAgICAgICBjeWNsZUlkOiBpc291bmlxdWUyLnVuaSgpLAogICAgICAgICAgY3ljbGU6ICJyZXF1ZXN0IiwKICAgICAgICAgIG1haW5QdXJwb3NlOiAia2VlcEFsaXZlIiwKICAgICAgICAgIGtlZXBBbGl2ZTogdGhpcy5rZWVwQWxpdmUKICAgICAgICB9LAogICAgICAgIHJlc3BvbnNlOiBudWxsCiAgICAgIH0pLmNhdGNoKCgpID0+IHsKICAgICAgICB0aGlzLmtlZXBBbGl2ZSA9IGZhbHNlOwogICAgICB9KTsKICAgICAgaWYgKHN0cmVhbVRyICYmIHN0cmVhbVRyLnJlc3BvbnNlICYmIHN0cmVhbVRyLnJlc3BvbnNlLmtlZXBBbGl2ZSA9PT0gZmFsc2UpIHsKICAgICAgICB0aGlzLmtlZXBBbGl2ZSA9IGZhbHNlOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMubGFzdEtlZXBBbGl2ZUV2ZW50ID0gRGF0ZS5ub3coKTsKICAgICAgfQogICAgICBpZiAoc3RyZWFtVHIgJiYgc3RyZWFtVHIucmVzcG9uc2UgJiYgc3RyZWFtVHIucmVzcG9uc2UubmV4dCkgewogICAgICAgIHRoaXMud29ya09uUXVldWUoKTsKICAgICAgfQogICAgfQogICAgaWYgKERhdGUubm93KCkgLSB0aGlzLmxhc3RLZWVwQWxpdmVFdmVudCA+IDFlNCkgewogICAgICBjb25zb2xlLmxvZyhgY2xvc2luZyBzdHJlYW0gZm9yICR7dGhpcy5zdHJlYW1JZH1gKTsKICAgICAgdGhpcy5rZWVwQWxpdmUgPSBmYWxzZTsKICAgIH0KICB9CiAgLy8gRGF0YSBzZW5kaW5nIGFuZCByZWNlaXZpbmcKICBhc3luYyBzZW5kRGF0YShkYXRhQXJnKSB7CiAgICB0aGlzLnNlbmRCYWNrcHJlc3N1cmVkQXJyYXkucHVzaChkYXRhQXJnKTsKICAgIHRoaXMud29ya09uUXVldWUoKTsKICAgIGF3YWl0IHRoaXMuc2VuZEJhY2twcmVzc3VyZWRBcnJheS53YWl0Rm9yU3BhY2UoKTsKICB9CiAgYXN5bmMgZmV0Y2hEYXRhKCkgewogICAgaWYgKHRoaXMucmVjZWl2ZUJhY2twcmVzc3VyZWRBcnJheS5oYXNTcGFjZSkgewogICAgfQogICAgYXdhaXQgdGhpcy5yZWNlaXZlQmFja3ByZXNzdXJlZEFycmF5LndhaXRGb3JJdGVtcygpOwogICAgY29uc3QgZGF0YVBhY2thZ2UgPSB0aGlzLnJlY2VpdmVCYWNrcHJlc3N1cmVkQXJyYXkuc2hpZnQoKTsKICAgIHJldHVybiBkYXRhUGFja2FnZTsKICB9CiAgLyoqCiAgICogcmVhZHMgZnJvbSBhIFJlYWRhYmxlIGFuZCBzZW5kcyBpdCB0byB0aGUgb3RoZXIgc2lkZQogICAqIEBwYXJhbSByZWFkYWJsZVN0cmVhbUFyZwogICAqLwogIGFzeW5jIHJlYWRGcm9tV2Vic3RyZWFtKHJlYWRhYmxlU3RyZWFtQXJnLCBjbG9zZUFmdGVyUmVhZGluZyA9IHRydWUpIHsKICAgIGNvbnN0IHJlYWRlciA9IHJlYWRhYmxlU3RyZWFtQXJnLmdldFJlYWRlcigpOwogICAgbGV0IHN0cmVhbUlzRG9uZSA9IGZhbHNlOwogICAgd2hpbGUgKCFzdHJlYW1Jc0RvbmUpIHsKICAgICAgY29uc3QgeyB2YWx1ZTogdmFsdWUyLCBkb25lIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpOwogICAgICBpZiAodmFsdWUyKSB7CiAgICAgICAgYXdhaXQgdGhpcy5zZW5kRGF0YSh2YWx1ZTIpOwogICAgICB9CiAgICAgIHN0cmVhbUlzRG9uZSA9IGRvbmU7CiAgICB9CiAgICBpZiAoY2xvc2VBZnRlclJlYWRpbmcpIHsKICAgICAgYXdhaXQgdGhpcy5jbG9zZSh0cnVlKTsKICAgIH0KICB9CiAgYXN5bmMgd3JpdGVUb1dlYnN0cmVhbSh3cml0YWJsZVN0cmVhbUFyZykgewogICAgY29uc3Qgd3JpdGVyID0gd3JpdGFibGVTdHJlYW1BcmcuZ2V0V3JpdGVyKCk7CiAgICB3aGlsZSAodGhpcy5rZWVwQWxpdmUgfHwgdGhpcy5yZWNlaXZlQmFja3ByZXNzdXJlZEFycmF5LmNoZWNrSGFzSXRlbXMoKSkgewogICAgICBjb25zdCB2YWx1ZTIgPSBhd2FpdCB0aGlzLmZldGNoRGF0YSgpOwogICAgICBpZiAodmFsdWUyID09PSBjbG9zaW5nQml0KSB7CiAgICAgICAgd3JpdGVyLnJlbGVhc2VMb2NrKCk7CiAgICAgICAgYXdhaXQgd3JpdGFibGVTdHJlYW1BcmcuY2xvc2UoKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBhd2FpdCB3cml0ZXIud3JpdGUodmFsdWUyKTsKICAgIH0KICB9CiAgLyoqCiAgICogY2xvc2VzIHRoZSBzdHJlYW0KICAgKiBpZiBzZW5kQ2xvc2luZ0JpdEFyZyBpcyB0cnVlLCB0aGUgc3RyZWFtIHdpbGwgc2VuZCBhIGNsb3NpbmcgYml0CiAgICogQHBhcmFtIHNlbmRDbG9zaW5nQml0QXJnCiAgICovCiAgYXN5bmMgY2xvc2Uoc2VuZENsb3NpbmdCaXRBcmcgPSBmYWxzZSkgewogICAgaWYgKHNlbmRDbG9zaW5nQml0QXJnKSB7CiAgICAgIHRoaXMuc2VuZERhdGEoY2xvc2luZ0JpdCk7CiAgICB9CiAgICB0aGlzLmtlZXBBbGl2ZSA9IGZhbHNlOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AYXBpLmdsb2JhbCt0eXBlZHJlcXVlc3RAMy4zLjAvbm9kZV9tb2R1bGVzL0BhcGkuZ2xvYmFsL3R5cGVkcmVxdWVzdC9kaXN0X3RzL2NsYXNzZXMudHlwZWR0YXJnZXQuanMKdmFyIFR5cGVkVGFyZ2V0ID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlR5cGVkVGFyZ2V0Iik7CiAgfQogIGNvbnN0cnVjdG9yKG9wdGlvbnNBcmcpIHsKICAgIGlmIChvcHRpb25zQXJnLnBvc3RNZXRob2RXaXRoVHlwZWRSb3V0ZXIgJiYgIW9wdGlvbnNBcmcudHlwZWRSb3V0ZXJSZWYpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJ5b3UgaGF2ZSB0byBzcGVjaWZ5IGEgdHlwZWRyb3V0ZXIgd2hlbiB1c2luZyBwb3N0bWV0aG9kIHdpdGggdHlwZWRyb3V0ZXIiKTsKICAgIH0KICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNBcmc7CiAgfQogIGFzeW5jIHBvc3QocGF5bG9hZEFyZykgewogICAgbGV0IHJlc3BvbnNlSW50ZXJlc3Q7CiAgICBpZiAodGhpcy5vcHRpb25zLnR5cGVkUm91dGVyUmVmKSB7CiAgICAgIHJlc3BvbnNlSW50ZXJlc3QgPSBhd2FpdCB0aGlzLm9wdGlvbnMudHlwZWRSb3V0ZXJSZWYuZmlyZUV2ZW50SW50ZXJlc3RNYXAuYWRkSW50ZXJlc3QocGF5bG9hZEFyZy5jb3JyZWxhdGlvbi5pZCwgcGF5bG9hZEFyZyk7CiAgICB9CiAgICBjb25zdCBwb3N0TWV0aG9kID0gdGhpcy5vcHRpb25zLnBvc3RNZXRob2QgfHwgdGhpcy5vcHRpb25zLnBvc3RNZXRob2RXaXRoVHlwZWRSb3V0ZXI7CiAgICBjb25zdCBwb3N0TWV0aG9kUmV0dXJuVmFsdWUgPSBhd2FpdCBwb3N0TWV0aG9kKHBheWxvYWRBcmcpOwogICAgbGV0IHJlc3BvbnNlQm9keTsKICAgIGlmIChyZXNwb25zZUludGVyZXN0KSB7CiAgICAgIHJlc3BvbnNlQm9keSA9IGF3YWl0IHJlc3BvbnNlSW50ZXJlc3QuaW50ZXJlc3RGdWxsZmlsbGVkOwogICAgfSBlbHNlIGlmIChwb3N0TWV0aG9kUmV0dXJuVmFsdWUpIHsKICAgICAgcmVzcG9uc2VCb2R5ID0gcG9zdE1ldGhvZFJldHVyblZhbHVlOwogICAgfSBlbHNlIHsKICAgICAgcmVzcG9uc2VCb2R5ID0gcGF5bG9hZEFyZzsKICAgIH0KICAgIHJldHVybiByZXNwb25zZUJvZHk7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BhcGkuZ2xvYmFsK3R5cGVkcmVxdWVzdEAzLjMuMC9ub2RlX21vZHVsZXMvQGFwaS5nbG9iYWwvdHlwZWRyZXF1ZXN0L2Rpc3RfdHMvY2xhc3Nlcy50eXBlZHJlcXVlc3QuanMKdmFyIHdlYnJlcXVlc3RJbnN0YW5jZSA9IG5ldyBkaXN0X3RzX2V4cG9ydHMxNC5XZWJyZXF1ZXN0Q2xpZW50KCk7CmZ1bmN0aW9uIGNhbGxHbG9iYWxIb29rKGhvb2tOYW1lLCBlbnRyeSkgewogIHRyeSB7CiAgICBUeXBlZFJvdXRlci5nbG9iYWxIb29rc1tob29rTmFtZV0/LihlbnRyeSk7CiAgfSBjYXRjaCAoZXJyKSB7CiAgICBjb25zb2xlLmVycm9yKGBUeXBlZFJlcXVlc3QgaG9vayBlcnJvciAoJHtob29rTmFtZX0pOmAsIGVycik7CiAgfQp9Cl9fbmFtZShjYWxsR2xvYmFsSG9vaywgImNhbGxHbG9iYWxIb29rIik7CnZhciBUeXBlZFJlcXVlc3QgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiVHlwZWRSZXF1ZXN0Iik7CiAgfQogIC8qKgogICAqIEBwYXJhbSBwb3N0RW5kUG9pbnRBcmcKICAgKiBAcGFyYW0gbWV0aG9kQXJnCiAgICovCiAgY29uc3RydWN0b3IocG9zdFRhcmdldCwgbWV0aG9kQXJnKSB7CiAgICB0aGlzLnNraXBIb29rcyA9IGZhbHNlOwogICAgaWYgKHR5cGVvZiBwb3N0VGFyZ2V0ID09PSAic3RyaW5nIikgewogICAgICB0aGlzLnVybEVuZFBvaW50ID0gcG9zdFRhcmdldDsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMudHlwZWRUYXJnZXQgPSBwb3N0VGFyZ2V0OwogICAgfQogICAgdGhpcy5tZXRob2QgPSBtZXRob2RBcmc7CiAgfQogIC8qKgogICAqIGZpcmVzIHRoZSByZXF1ZXN0CiAgICovCiAgYXN5bmMgZmlyZShmaXJlQXJnLCB1c2VDYWNoZUFyZyA9IGZhbHNlKSB7CiAgICBjb25zdCByZXF1ZXN0U3RhcnRUaW1lID0gRGF0ZS5ub3coKTsKICAgIGxldCBwYXlsb2FkU2VuZGluZyA9IHsKICAgICAgbWV0aG9kOiB0aGlzLm1ldGhvZCwKICAgICAgcmVxdWVzdDogZmlyZUFyZywKICAgICAgcmVzcG9uc2U6IG51bGwsCiAgICAgIGNvcnJlbGF0aW9uOiB7CiAgICAgICAgaWQ6IGlzb3VuaXF1ZTIudW5pKCksCiAgICAgICAgcGhhc2U6ICJyZXF1ZXN0IgogICAgICB9CiAgICB9OwogICAgcGF5bG9hZFNlbmRpbmcgPSBWaXJ0dWFsU3RyZWFtLmVuY29kZVBheWxvYWRGb3JOZXR3b3JrKHBheWxvYWRTZW5kaW5nLCB7CiAgICAgIHNlbmRNZXRob2Q6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHBheWxvYWRBcmcpID0+IHsKICAgICAgICByZXR1cm4gdGhpcy5wb3N0VHJPYmplY3QocGF5bG9hZEFyZyk7CiAgICAgIH0sICJzZW5kTWV0aG9kIikKICAgIH0pOwogICAgaWYgKCF0aGlzLnNraXBIb29rcykgewogICAgICBjYWxsR2xvYmFsSG9vaygib25PdXRnb2luZ1JlcXVlc3QiLCB7CiAgICAgICAgY29ycmVsYXRpb25JZDogcGF5bG9hZFNlbmRpbmcuY29ycmVsYXRpb24uaWQsCiAgICAgICAgbWV0aG9kOiB0aGlzLm1ldGhvZCwKICAgICAgICBkaXJlY3Rpb246ICJvdXRnb2luZyIsCiAgICAgICAgcGhhc2U6ICJyZXF1ZXN0IiwKICAgICAgICB0aW1lc3RhbXA6IHJlcXVlc3RTdGFydFRpbWUsCiAgICAgICAgcGF5bG9hZDogZmlyZUFyZwogICAgICB9KTsKICAgIH0KICAgIGxldCBwYXlsb2FkUmVjZWl2aW5nOwogICAgcGF5bG9hZFJlY2VpdmluZyA9IGF3YWl0IHRoaXMucG9zdFRyT2JqZWN0KHBheWxvYWRTZW5kaW5nLCB1c2VDYWNoZUFyZyk7CiAgICBwYXlsb2FkUmVjZWl2aW5nID0gVmlydHVhbFN0cmVhbS5kZWNvZGVQYXlsb2FkRnJvbU5ldHdvcmsocGF5bG9hZFJlY2VpdmluZywgewogICAgICBzZW5kTWV0aG9kOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKChwYXlsb2FkQXJnKSA9PiB7CiAgICAgICAgcmV0dXJuIHRoaXMucG9zdFRyT2JqZWN0KHBheWxvYWRBcmcpOwogICAgICB9LCAic2VuZE1ldGhvZCIpCiAgICB9KTsKICAgIGlmICghdGhpcy5za2lwSG9va3MpIHsKICAgICAgY2FsbEdsb2JhbEhvb2soIm9uSW5jb21pbmdSZXNwb25zZSIsIHsKICAgICAgICBjb3JyZWxhdGlvbklkOiBwYXlsb2FkU2VuZGluZy5jb3JyZWxhdGlvbi5pZCwKICAgICAgICBtZXRob2Q6IHRoaXMubWV0aG9kLAogICAgICAgIGRpcmVjdGlvbjogImluY29taW5nIiwKICAgICAgICBwaGFzZTogInJlc3BvbnNlIiwKICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksCiAgICAgICAgZHVyYXRpb25NczogRGF0ZS5ub3coKSAtIHJlcXVlc3RTdGFydFRpbWUsCiAgICAgICAgcGF5bG9hZDogcGF5bG9hZFJlY2VpdmluZz8ucmVzcG9uc2UsCiAgICAgICAgZXJyb3I6IHBheWxvYWRSZWNlaXZpbmc/LmVycm9yPy50ZXh0CiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIHBheWxvYWRSZWNlaXZpbmcucmVzcG9uc2U7CiAgfQogIGFzeW5jIHBvc3RUck9iamVjdChwYXlsb2FkU2VuZGluZ0FyZywgdXNlQ2FjaGVBcmcgPSBmYWxzZSkgewogICAgbGV0IHBheWxvYWRSZWNlaXZpbmc7CiAgICBpZiAodGhpcy51cmxFbmRQb2ludCkgewogICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHdlYnJlcXVlc3RJbnN0YW5jZS5wb3N0SnNvbih0aGlzLnVybEVuZFBvaW50LCBwYXlsb2FkU2VuZGluZ0FyZywgdXNlQ2FjaGVBcmcgPyB7IGNhY2hlU3RyYXRlZ3k6ICJjYWNoZS1maXJzdCIgfSA6IHt9KTsKICAgICAgcGF5bG9hZFJlY2VpdmluZyA9IHJlc3BvbnNlOwogICAgfSBlbHNlIHsKICAgICAgcGF5bG9hZFJlY2VpdmluZyA9IGF3YWl0IHRoaXMudHlwZWRUYXJnZXQucG9zdChwYXlsb2FkU2VuZGluZ0FyZyk7CiAgICB9CiAgICBpZiAocGF5bG9hZFJlY2VpdmluZy5lcnJvcikgewogICAgICBjb25zb2xlLmVycm9yKGBtZXRob2Q6ID4+JHt0aGlzLm1ldGhvZH08PCBnb3QgYW4gRVJST1I6ICIke3BheWxvYWRSZWNlaXZpbmcuZXJyb3IudGV4dH0iIHdpdGggZGF0YSAke0pTT04uc3RyaW5naWZ5KHBheWxvYWRSZWNlaXZpbmcuZXJyb3IuZGF0YSwgbnVsbCwgMil9YCk7CiAgICAgIGlmICghcGF5bG9hZFJlY2VpdmluZy5yZXRyeSkgewogICAgICAgIHRocm93IG5ldyBUeXBlZFJlc3BvbnNlRXJyb3IocGF5bG9hZFJlY2VpdmluZy5lcnJvci50ZXh0LCBwYXlsb2FkUmVjZWl2aW5nLmVycm9yLmRhdGEpOwogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKHBheWxvYWRSZWNlaXZpbmcucmV0cnkpIHsKICAgICAgY29uc29sZS5sb2coYHNlcnZlciByZXF1ZXN0ZWQgcmV0cnkgZm9yIHRoZSBmb2xsb3dpbmcgcmVhc29uOiAke3BheWxvYWRSZWNlaXZpbmcucmV0cnkucmVhc29ufWApOwogICAgICBhd2FpdCBkaXN0X3RzX2V4cG9ydHMzLmRlbGF5Rm9yKHBheWxvYWRSZWNlaXZpbmcucmV0cnkud2FpdEZvck1zKTsKICAgICAgcGF5bG9hZFJlY2VpdmluZyA9IGF3YWl0IHRoaXMucG9zdFRyT2JqZWN0KHBheWxvYWRTZW5kaW5nQXJnLCB1c2VDYWNoZUFyZyk7CiAgICB9CiAgICByZXR1cm4gcGF5bG9hZFJlY2VpdmluZzsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vYnJvYWRjYXN0LWNoYW5uZWxANy4zLjAvbm9kZV9tb2R1bGVzL2Jyb2FkY2FzdC1jaGFubmVsL2Rpc3QvZXNicm93c2VyL3V0aWwuanMKZnVuY3Rpb24gaXNQcm9taXNlMihvYmopIHsKICByZXR1cm4gb2JqICYmIHR5cGVvZiBvYmoudGhlbiA9PT0gImZ1bmN0aW9uIjsKfQpfX25hbWUoaXNQcm9taXNlMiwgImlzUHJvbWlzZSIpOwp2YXIgUFJPTUlTRV9SRVNPTFZFRF9GQUxTRSA9IFByb21pc2UucmVzb2x2ZShmYWxzZSk7CnZhciBQUk9NSVNFX1JFU09MVkVEX1RSVUUgPSBQcm9taXNlLnJlc29sdmUodHJ1ZSk7CnZhciBQUk9NSVNFX1JFU09MVkVEX1ZPSUQgPSBQcm9taXNlLnJlc29sdmUoKTsKZnVuY3Rpb24gc2xlZXAodGltZSwgcmVzb2x2ZVdpdGgpIHsKICBpZiAoIXRpbWUpIHRpbWUgPSAwOwogIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXMpIHsKICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gcmVzKHJlc29sdmVXaXRoKTsKICAgIH0sIHRpbWUpOwogIH0pOwp9Cl9fbmFtZShzbGVlcCwgInNsZWVwIik7CmZ1bmN0aW9uIHJhbmRvbUludChtaW4zLCBtYXgzKSB7CiAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXgzIC0gbWluMyArIDEpICsgbWluMyk7Cn0KX19uYW1lKHJhbmRvbUludCwgInJhbmRvbUludCIpOwpmdW5jdGlvbiByYW5kb21Ub2tlbigpIHsKICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIpOwp9Cl9fbmFtZShyYW5kb21Ub2tlbiwgInJhbmRvbVRva2VuIik7CnZhciBsYXN0TXMgPSAwOwpmdW5jdGlvbiBtaWNyb1NlY29uZHMoKSB7CiAgdmFyIHJldCA9IERhdGUubm93KCkgKiAxZTM7CiAgaWYgKHJldCA8PSBsYXN0TXMpIHsKICAgIHJldCA9IGxhc3RNcyArIDE7CiAgfQogIGxhc3RNcyA9IHJldDsKICByZXR1cm4gcmV0Owp9Cl9fbmFtZShtaWNyb1NlY29uZHMsICJtaWNyb1NlY29uZHMiKTsKZnVuY3Rpb24gc3VwcG9ydHNXZWJMb2NrQVBJKCkgewogIGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSAidW5kZWZpbmVkIiAmJiB0eXBlb2YgbmF2aWdhdG9yLmxvY2tzICE9PSAidW5kZWZpbmVkIiAmJiB0eXBlb2YgbmF2aWdhdG9yLmxvY2tzLnJlcXVlc3QgPT09ICJmdW5jdGlvbiIpIHsKICAgIHJldHVybiB0cnVlOwogIH0gZWxzZSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9Cl9fbmFtZShzdXBwb3J0c1dlYkxvY2tBUEksICJzdXBwb3J0c1dlYkxvY2tBUEkiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9icm9hZGNhc3QtY2hhbm5lbEA3LjMuMC9ub2RlX21vZHVsZXMvYnJvYWRjYXN0LWNoYW5uZWwvZGlzdC9lc2Jyb3dzZXIvbWV0aG9kcy9uYXRpdmUuanMKdmFyIG1pY3JvU2Vjb25kczIgPSBtaWNyb1NlY29uZHM7CnZhciB0eXBlID0gIm5hdGl2ZSI7CmZ1bmN0aW9uIGNyZWF0ZShjaGFubmVsTmFtZSkgewogIHZhciBzdGF0ZSA9IHsKICAgIHRpbWU6IG1pY3JvU2Vjb25kcygpLAogICAgbWVzc2FnZXNDYWxsYmFjazogbnVsbCwKICAgIGJjOiBuZXcgQnJvYWRjYXN0Q2hhbm5lbChjaGFubmVsTmFtZSksCiAgICBzdWJGbnM6IFtdCiAgICAvLyBzdWJzY3JpYmVyRnVuY3Rpb25zCiAgfTsKICBzdGF0ZS5iYy5vbm1lc3NhZ2UgPSBmdW5jdGlvbihtc2dFdmVudCkgewogICAgaWYgKHN0YXRlLm1lc3NhZ2VzQ2FsbGJhY2spIHsKICAgICAgc3RhdGUubWVzc2FnZXNDYWxsYmFjayhtc2dFdmVudC5kYXRhKTsKICAgIH0KICB9OwogIHJldHVybiBzdGF0ZTsKfQpfX25hbWUoY3JlYXRlLCAiY3JlYXRlIik7CmZ1bmN0aW9uIGNsb3NlKGNoYW5uZWxTdGF0ZSkgewogIGNoYW5uZWxTdGF0ZS5iYy5jbG9zZSgpOwogIGNoYW5uZWxTdGF0ZS5zdWJGbnMgPSBbXTsKfQpfX25hbWUoY2xvc2UsICJjbG9zZSIpOwpmdW5jdGlvbiBwb3N0TWVzc2FnZShjaGFubmVsU3RhdGUsIG1lc3NhZ2VKc29uKSB7CiAgdHJ5IHsKICAgIGNoYW5uZWxTdGF0ZS5iYy5wb3N0TWVzc2FnZShtZXNzYWdlSnNvbiwgZmFsc2UpOwogICAgcmV0dXJuIFBST01JU0VfUkVTT0xWRURfVk9JRDsKICB9IGNhdGNoIChlcnIpIHsKICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpOwogIH0KfQpfX25hbWUocG9zdE1lc3NhZ2UsICJwb3N0TWVzc2FnZSIpOwpmdW5jdGlvbiBvbk1lc3NhZ2UoY2hhbm5lbFN0YXRlLCBmbikgewogIGNoYW5uZWxTdGF0ZS5tZXNzYWdlc0NhbGxiYWNrID0gZm47Cn0KX19uYW1lKG9uTWVzc2FnZSwgIm9uTWVzc2FnZSIpOwpmdW5jdGlvbiBjYW5CZVVzZWQoKSB7CiAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAidW5kZWZpbmVkIiAmJiBnbG9iYWxUaGlzLkRlbm8gJiYgZ2xvYmFsVGhpcy5EZW5vLmFyZ3MpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBpZiAoKHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiIHx8IHR5cGVvZiBzZWxmICE9PSAidW5kZWZpbmVkIikgJiYgdHlwZW9mIEJyb2FkY2FzdENoYW5uZWwgPT09ICJmdW5jdGlvbiIpIHsKICAgIGlmIChCcm9hZGNhc3RDaGFubmVsLl9wdWJrZXkpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJCcm9hZGNhc3RDaGFubmVsOiBEbyBub3Qgb3ZlcndyaXRlIHdpbmRvdy5Ccm9hZGNhc3RDaGFubmVsIHdpdGggdGhpcyBtb2R1bGUsIHRoaXMgaXMgbm90IGEgcG9seWZpbGwiKTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0gZWxzZSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9Cl9fbmFtZShjYW5CZVVzZWQsICJjYW5CZVVzZWQiKTsKZnVuY3Rpb24gYXZlcmFnZVJlc3BvbnNlVGltZSgpIHsKICByZXR1cm4gMTUwOwp9Cl9fbmFtZShhdmVyYWdlUmVzcG9uc2VUaW1lLCAiYXZlcmFnZVJlc3BvbnNlVGltZSIpOwp2YXIgTmF0aXZlTWV0aG9kID0gewogIGNyZWF0ZSwKICBjbG9zZSwKICBvbk1lc3NhZ2UsCiAgcG9zdE1lc3NhZ2UsCiAgY2FuQmVVc2VkLAogIHR5cGUsCiAgYXZlcmFnZVJlc3BvbnNlVGltZSwKICBtaWNyb1NlY29uZHM6IG1pY3JvU2Vjb25kczIKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9vYmxpdmlvdXMtc2V0QDIuMC4wL25vZGVfbW9kdWxlcy9vYmxpdmlvdXMtc2V0L2Rpc3QvZXNtL3NyYy9pbmRleC5qcwp2YXIgT2JsaXZpb3VzU2V0ID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIk9ibGl2aW91c1NldCIpOwogIH0KICB0dGw7CiAgbWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAvKioKICAgKiBDcmVhdGluZyBjYWxscyB0byBzZXRUaW1lb3V0KCkgaXMgZXhwZW5zaXZlLAogICAqIHNvIHdlIG9ubHkgZG8gdGhhdCBpZiB0aGVyZSBpcyBub3QgdGltZW91dCBhbHJlYWR5IG9wZW4uCiAgICovCiAgX3RvID0gZmFsc2U7CiAgY29uc3RydWN0b3IodHRsKSB7CiAgICB0aGlzLnR0bCA9IHR0bDsKICB9CiAgaGFzKHZhbHVlMikgewogICAgY29uc3QgdmFsdWVUaW1lID0gdGhpcy5tYXAuZ2V0KHZhbHVlMik7CiAgICBpZiAodHlwZW9mIHZhbHVlVGltZSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKHZhbHVlVGltZSA8IG5vdygpIC0gdGhpcy50dGwpIHsKICAgICAgdGhpcy5tYXAuZGVsZXRlKHZhbHVlMik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KICBhZGQodmFsdWUyKSB7CiAgICB0aGlzLm1hcC5kZWxldGUodmFsdWUyKTsKICAgIHRoaXMubWFwLnNldCh2YWx1ZTIsIG5vdygpKTsKICAgIGlmICghdGhpcy5fdG8pIHsKICAgICAgdGhpcy5fdG8gPSB0cnVlOwogICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICB0aGlzLl90byA9IGZhbHNlOwogICAgICAgIHJlbW92ZVRvb09sZFZhbHVlcyh0aGlzKTsKICAgICAgfSwgMCk7CiAgICB9CiAgfQogIGNsZWFyKCkgewogICAgdGhpcy5tYXAuY2xlYXIoKTsKICB9Cn07CmZ1bmN0aW9uIHJlbW92ZVRvb09sZFZhbHVlcyhvYmxpdmlvdXNTZXQpIHsKICBjb25zdCBvbGRlclRoZW4gPSBub3coKSAtIG9ibGl2aW91c1NldC50dGw7CiAgY29uc3QgaXRlcmF0b3IyID0gb2JsaXZpb3VzU2V0Lm1hcFtTeW1ib2wuaXRlcmF0b3JdKCk7CiAgd2hpbGUgKHRydWUpIHsKICAgIGNvbnN0IG5leHQyID0gaXRlcmF0b3IyLm5leHQoKS52YWx1ZTsKICAgIGlmICghbmV4dDIpIHsKICAgICAgYnJlYWs7CiAgICB9CiAgICBjb25zdCB2YWx1ZTIgPSBuZXh0MlswXTsKICAgIGNvbnN0IHRpbWUgPSBuZXh0MlsxXTsKICAgIGlmICh0aW1lIDwgb2xkZXJUaGVuKSB7CiAgICAgIG9ibGl2aW91c1NldC5tYXAuZGVsZXRlKHZhbHVlMik7CiAgICB9IGVsc2UgewogICAgICBicmVhazsKICAgIH0KICB9Cn0KX19uYW1lKHJlbW92ZVRvb09sZFZhbHVlcywgInJlbW92ZVRvb09sZFZhbHVlcyIpOwpmdW5jdGlvbiBub3coKSB7CiAgcmV0dXJuIERhdGUubm93KCk7Cn0KX19uYW1lKG5vdywgIm5vdyIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2Jyb2FkY2FzdC1jaGFubmVsQDcuMy4wL25vZGVfbW9kdWxlcy9icm9hZGNhc3QtY2hhbm5lbC9kaXN0L2VzYnJvd3Nlci9vcHRpb25zLmpzCmZ1bmN0aW9uIGZpbGxPcHRpb25zV2l0aERlZmF1bHRzKCkgewogIHZhciBvcmlnaW5hbE9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHZvaWQgMCA/IGFyZ3VtZW50c1swXSA6IHt9OwogIHZhciBvcHRpb25zID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvcmlnaW5hbE9wdGlvbnMpKTsKICBpZiAodHlwZW9mIG9wdGlvbnMud2ViV29ya2VyU3VwcG9ydCA9PT0gInVuZGVmaW5lZCIpIG9wdGlvbnMud2ViV29ya2VyU3VwcG9ydCA9IHRydWU7CiAgaWYgKCFvcHRpb25zLmlkYikgb3B0aW9ucy5pZGIgPSB7fTsKICBpZiAoIW9wdGlvbnMuaWRiLnR0bCkgb3B0aW9ucy5pZGIudHRsID0gMWUzICogNDU7CiAgaWYgKCFvcHRpb25zLmlkYi5mYWxsYmFja0ludGVydmFsKSBvcHRpb25zLmlkYi5mYWxsYmFja0ludGVydmFsID0gMTUwOwogIGlmIChvcmlnaW5hbE9wdGlvbnMuaWRiICYmIHR5cGVvZiBvcmlnaW5hbE9wdGlvbnMuaWRiLm9uY2xvc2UgPT09ICJmdW5jdGlvbiIpIG9wdGlvbnMuaWRiLm9uY2xvc2UgPSBvcmlnaW5hbE9wdGlvbnMuaWRiLm9uY2xvc2U7CiAgaWYgKCFvcHRpb25zLmxvY2Fsc3RvcmFnZSkgb3B0aW9ucy5sb2NhbHN0b3JhZ2UgPSB7fTsKICBpZiAoIW9wdGlvbnMubG9jYWxzdG9yYWdlLnJlbW92ZVRpbWVvdXQpIG9wdGlvbnMubG9jYWxzdG9yYWdlLnJlbW92ZVRpbWVvdXQgPSAxZTMgKiA2MDsKICBpZiAob3JpZ2luYWxPcHRpb25zLm1ldGhvZHMpIG9wdGlvbnMubWV0aG9kcyA9IG9yaWdpbmFsT3B0aW9ucy5tZXRob2RzOwogIGlmICghb3B0aW9ucy5ub2RlKSBvcHRpb25zLm5vZGUgPSB7fTsKICBpZiAoIW9wdGlvbnMubm9kZS50dGwpIG9wdGlvbnMubm9kZS50dGwgPSAxZTMgKiA2MCAqIDI7CiAgaWYgKCFvcHRpb25zLm5vZGUubWF4UGFyYWxsZWxXcml0ZXMpIG9wdGlvbnMubm9kZS5tYXhQYXJhbGxlbFdyaXRlcyA9IDIwNDg7CiAgaWYgKHR5cGVvZiBvcHRpb25zLm5vZGUudXNlRmFzdFBhdGggPT09ICJ1bmRlZmluZWQiKSBvcHRpb25zLm5vZGUudXNlRmFzdFBhdGggPSB0cnVlOwogIHJldHVybiBvcHRpb25zOwp9Cl9fbmFtZShmaWxsT3B0aW9uc1dpdGhEZWZhdWx0cywgImZpbGxPcHRpb25zV2l0aERlZmF1bHRzIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vYnJvYWRjYXN0LWNoYW5uZWxANy4zLjAvbm9kZV9tb2R1bGVzL2Jyb2FkY2FzdC1jaGFubmVsL2Rpc3QvZXNicm93c2VyL21ldGhvZHMvaW5kZXhlZC1kYi5qcwp2YXIgbWljcm9TZWNvbmRzMyA9IG1pY3JvU2Vjb25kczsKdmFyIERCX1BSRUZJWCA9ICJwdWJrZXkuYnJvYWRjYXN0LWNoYW5uZWwtMC0iOwp2YXIgT0JKRUNUX1NUT1JFX0lEID0gIm1lc3NhZ2VzIjsKdmFyIFRSQU5TQUNUSU9OX1NFVFRJTkdTID0gewogIGR1cmFiaWxpdHk6ICJyZWxheGVkIgp9Owp2YXIgdHlwZTIgPSAiaWRiIjsKZnVuY3Rpb24gZ2V0SWRiKCkgewogIGlmICh0eXBlb2YgaW5kZXhlZERCICE9PSAidW5kZWZpbmVkIikgcmV0dXJuIGluZGV4ZWREQjsKICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gInVuZGVmaW5lZCIpIHsKICAgIGlmICh0eXBlb2Ygd2luZG93Lm1vekluZGV4ZWREQiAhPT0gInVuZGVmaW5lZCIpIHJldHVybiB3aW5kb3cubW96SW5kZXhlZERCOwogICAgaWYgKHR5cGVvZiB3aW5kb3cud2Via2l0SW5kZXhlZERCICE9PSAidW5kZWZpbmVkIikgcmV0dXJuIHdpbmRvdy53ZWJraXRJbmRleGVkREI7CiAgICBpZiAodHlwZW9mIHdpbmRvdy5tc0luZGV4ZWREQiAhPT0gInVuZGVmaW5lZCIpIHJldHVybiB3aW5kb3cubXNJbmRleGVkREI7CiAgfQogIHJldHVybiBmYWxzZTsKfQpfX25hbWUoZ2V0SWRiLCAiZ2V0SWRiIik7CmZ1bmN0aW9uIGNvbW1pdEluZGV4ZWREQlRyYW5zYWN0aW9uKHR4KSB7CiAgaWYgKHR4LmNvbW1pdCkgewogICAgdHguY29tbWl0KCk7CiAgfQp9Cl9fbmFtZShjb21taXRJbmRleGVkREJUcmFuc2FjdGlvbiwgImNvbW1pdEluZGV4ZWREQlRyYW5zYWN0aW9uIik7CmZ1bmN0aW9uIGNyZWF0ZURhdGFiYXNlKGNoYW5uZWxOYW1lKSB7CiAgdmFyIEluZGV4ZWREQiA9IGdldElkYigpOwogIHZhciBkYk5hbWUgPSBEQl9QUkVGSVggKyBjaGFubmVsTmFtZTsKICB2YXIgb3BlblJlcXVlc3QgPSBJbmRleGVkREIub3BlbihkYk5hbWUpOwogIG9wZW5SZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9IGZ1bmN0aW9uKGV2KSB7CiAgICB2YXIgZGIgPSBldi50YXJnZXQucmVzdWx0OwogICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUoT0JKRUNUX1NUT1JFX0lELCB7CiAgICAgIGtleVBhdGg6ICJpZCIsCiAgICAgIGF1dG9JbmNyZW1lbnQ6IHRydWUKICAgIH0pOwogIH07CiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlcywgcmVqKSB7CiAgICBvcGVuUmVxdWVzdC5vbmVycm9yID0gZnVuY3Rpb24oZXYpIHsKICAgICAgcmV0dXJuIHJlaihldik7CiAgICB9OwogICAgb3BlblJlcXVlc3Qub25zdWNjZXNzID0gZnVuY3Rpb24oKSB7CiAgICAgIHJlcyhvcGVuUmVxdWVzdC5yZXN1bHQpOwogICAgfTsKICB9KTsKfQpfX25hbWUoY3JlYXRlRGF0YWJhc2UsICJjcmVhdGVEYXRhYmFzZSIpOwpmdW5jdGlvbiB3cml0ZU1lc3NhZ2UoZGIsIHJlYWRlclV1aWQsIG1lc3NhZ2VKc29uKSB7CiAgdmFyIHRpbWUgPSBEYXRlLm5vdygpOwogIHZhciB3cml0ZU9iamVjdCA9IHsKICAgIHV1aWQ6IHJlYWRlclV1aWQsCiAgICB0aW1lLAogICAgZGF0YTogbWVzc2FnZUpzb24KICB9OwogIHZhciB0eCA9IGRiLnRyYW5zYWN0aW9uKFtPQkpFQ1RfU1RPUkVfSURdLCAicmVhZHdyaXRlIiwgVFJBTlNBQ1RJT05fU0VUVElOR1MpOwogIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXMsIHJlaikgewogICAgdHgub25jb21wbGV0ZSA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gcmVzKCk7CiAgICB9OwogICAgdHgub25lcnJvciA9IGZ1bmN0aW9uKGV2KSB7CiAgICAgIHJldHVybiByZWooZXYpOwogICAgfTsKICAgIHZhciBvYmplY3RTdG9yZSA9IHR4Lm9iamVjdFN0b3JlKE9CSkVDVF9TVE9SRV9JRCk7CiAgICBvYmplY3RTdG9yZS5hZGQod3JpdGVPYmplY3QpOwogICAgY29tbWl0SW5kZXhlZERCVHJhbnNhY3Rpb24odHgpOwogIH0pOwp9Cl9fbmFtZSh3cml0ZU1lc3NhZ2UsICJ3cml0ZU1lc3NhZ2UiKTsKZnVuY3Rpb24gZ2V0QWxsTWVzc2FnZXMoZGIpIHsKICB2YXIgdHggPSBkYi50cmFuc2FjdGlvbihPQkpFQ1RfU1RPUkVfSUQsICJyZWFkb25seSIsIFRSQU5TQUNUSU9OX1NFVFRJTkdTKTsKICB2YXIgb2JqZWN0U3RvcmUgPSB0eC5vYmplY3RTdG9yZShPQkpFQ1RfU1RPUkVfSUQpOwogIHZhciByZXQgPSBbXTsKICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzKSB7CiAgICBvYmplY3RTdG9yZS5vcGVuQ3Vyc29yKCkub25zdWNjZXNzID0gZnVuY3Rpb24oZXYpIHsKICAgICAgdmFyIGN1cnNvciA9IGV2LnRhcmdldC5yZXN1bHQ7CiAgICAgIGlmIChjdXJzb3IpIHsKICAgICAgICByZXQucHVzaChjdXJzb3IudmFsdWUpOwogICAgICAgIGN1cnNvclsiY29udGludWUiXSgpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbW1pdEluZGV4ZWREQlRyYW5zYWN0aW9uKHR4KTsKICAgICAgICByZXMocmV0KTsKICAgICAgfQogICAgfTsKICB9KTsKfQpfX25hbWUoZ2V0QWxsTWVzc2FnZXMsICJnZXRBbGxNZXNzYWdlcyIpOwpmdW5jdGlvbiBnZXRNZXNzYWdlc0hpZ2hlclRoYW4oZGIsIGxhc3RDdXJzb3JJZCkgewogIHZhciB0eCA9IGRiLnRyYW5zYWN0aW9uKE9CSkVDVF9TVE9SRV9JRCwgInJlYWRvbmx5IiwgVFJBTlNBQ1RJT05fU0VUVElOR1MpOwogIHZhciBvYmplY3RTdG9yZSA9IHR4Lm9iamVjdFN0b3JlKE9CSkVDVF9TVE9SRV9JRCk7CiAgdmFyIHJldCA9IFtdOwogIHZhciBrZXlSYW5nZVZhbHVlID0gSURCS2V5UmFuZ2UuYm91bmQobGFzdEN1cnNvcklkICsgMSwgSW5maW5pdHkpOwogIGlmIChvYmplY3RTdG9yZS5nZXRBbGwpIHsKICAgIHZhciBnZXRBbGxSZXF1ZXN0ID0gb2JqZWN0U3RvcmUuZ2V0QWxsKGtleVJhbmdlVmFsdWUpOwogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlcywgcmVqKSB7CiAgICAgIGdldEFsbFJlcXVlc3Qub25lcnJvciA9IGZ1bmN0aW9uKGVycikgewogICAgICAgIHJldHVybiByZWooZXJyKTsKICAgICAgfTsKICAgICAgZ2V0QWxsUmVxdWVzdC5vbnN1Y2Nlc3MgPSBmdW5jdGlvbihlMTApIHsKICAgICAgICByZXMoZTEwLnRhcmdldC5yZXN1bHQpOwogICAgICB9OwogICAgfSk7CiAgfQogIGZ1bmN0aW9uIG9wZW5DdXJzb3IoKSB7CiAgICB0cnkgewogICAgICBrZXlSYW5nZVZhbHVlID0gSURCS2V5UmFuZ2UuYm91bmQobGFzdEN1cnNvcklkICsgMSwgSW5maW5pdHkpOwogICAgICByZXR1cm4gb2JqZWN0U3RvcmUub3BlbkN1cnNvcihrZXlSYW5nZVZhbHVlKTsKICAgIH0gY2F0Y2ggKGUxMCkgewogICAgICByZXR1cm4gb2JqZWN0U3RvcmUub3BlbkN1cnNvcigpOwogICAgfQogIH0KICBfX25hbWUob3BlbkN1cnNvciwgIm9wZW5DdXJzb3IiKTsKICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzLCByZWopIHsKICAgIHZhciBvcGVuQ3Vyc29yUmVxdWVzdCA9IG9wZW5DdXJzb3IoKTsKICAgIG9wZW5DdXJzb3JSZXF1ZXN0Lm9uZXJyb3IgPSBmdW5jdGlvbihlcnIpIHsKICAgICAgcmV0dXJuIHJlaihlcnIpOwogICAgfTsKICAgIG9wZW5DdXJzb3JSZXF1ZXN0Lm9uc3VjY2VzcyA9IGZ1bmN0aW9uKGV2KSB7CiAgICAgIHZhciBjdXJzb3IgPSBldi50YXJnZXQucmVzdWx0OwogICAgICBpZiAoY3Vyc29yKSB7CiAgICAgICAgaWYgKGN1cnNvci52YWx1ZS5pZCA8IGxhc3RDdXJzb3JJZCArIDEpIHsKICAgICAgICAgIGN1cnNvclsiY29udGludWUiXShsYXN0Q3Vyc29ySWQgKyAxKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0LnB1c2goY3Vyc29yLnZhbHVlKTsKICAgICAgICAgIGN1cnNvclsiY29udGludWUiXSgpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBjb21taXRJbmRleGVkREJUcmFuc2FjdGlvbih0eCk7CiAgICAgICAgcmVzKHJldCk7CiAgICAgIH0KICAgIH07CiAgfSk7Cn0KX19uYW1lKGdldE1lc3NhZ2VzSGlnaGVyVGhhbiwgImdldE1lc3NhZ2VzSGlnaGVyVGhhbiIpOwpmdW5jdGlvbiByZW1vdmVNZXNzYWdlc0J5SWQoY2hhbm5lbFN0YXRlLCBpZHMpIHsKICBpZiAoY2hhbm5lbFN0YXRlLmNsb3NlZCkgewogICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7CiAgfQogIHZhciB0eCA9IGNoYW5uZWxTdGF0ZS5kYi50cmFuc2FjdGlvbihPQkpFQ1RfU1RPUkVfSUQsICJyZWFkd3JpdGUiLCBUUkFOU0FDVElPTl9TRVRUSU5HUyk7CiAgdmFyIG9iamVjdFN0b3JlID0gdHgub2JqZWN0U3RvcmUoT0JKRUNUX1NUT1JFX0lEKTsKICByZXR1cm4gUHJvbWlzZS5hbGwoaWRzLm1hcChmdW5jdGlvbihpZCkgewogICAgdmFyIGRlbGV0ZVJlcXVlc3QgPSBvYmplY3RTdG9yZVsiZGVsZXRlIl0oaWQpOwogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlcykgewogICAgICBkZWxldGVSZXF1ZXN0Lm9uc3VjY2VzcyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiByZXMoKTsKICAgICAgfTsKICAgIH0pOwogIH0pKTsKfQpfX25hbWUocmVtb3ZlTWVzc2FnZXNCeUlkLCAicmVtb3ZlTWVzc2FnZXNCeUlkIik7CmZ1bmN0aW9uIGdldE9sZE1lc3NhZ2VzKGRiLCB0dGwpIHsKICB2YXIgb2xkZXJUaGVuID0gRGF0ZS5ub3coKSAtIHR0bDsKICB2YXIgdHggPSBkYi50cmFuc2FjdGlvbihPQkpFQ1RfU1RPUkVfSUQsICJyZWFkb25seSIsIFRSQU5TQUNUSU9OX1NFVFRJTkdTKTsKICB2YXIgb2JqZWN0U3RvcmUgPSB0eC5vYmplY3RTdG9yZShPQkpFQ1RfU1RPUkVfSUQpOwogIHZhciByZXQgPSBbXTsKICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzKSB7CiAgICBvYmplY3RTdG9yZS5vcGVuQ3Vyc29yKCkub25zdWNjZXNzID0gZnVuY3Rpb24oZXYpIHsKICAgICAgdmFyIGN1cnNvciA9IGV2LnRhcmdldC5yZXN1bHQ7CiAgICAgIGlmIChjdXJzb3IpIHsKICAgICAgICB2YXIgbXNnT2JrID0gY3Vyc29yLnZhbHVlOwogICAgICAgIGlmIChtc2dPYmsudGltZSA8IG9sZGVyVGhlbikgewogICAgICAgICAgcmV0LnB1c2gobXNnT2JrKTsKICAgICAgICAgIGN1cnNvclsiY29udGludWUiXSgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb21taXRJbmRleGVkREJUcmFuc2FjdGlvbih0eCk7CiAgICAgICAgICByZXMocmV0KTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzKHJldCk7CiAgICAgIH0KICAgIH07CiAgfSk7Cn0KX19uYW1lKGdldE9sZE1lc3NhZ2VzLCAiZ2V0T2xkTWVzc2FnZXMiKTsKZnVuY3Rpb24gY2xlYW5PbGRNZXNzYWdlcyhjaGFubmVsU3RhdGUpIHsKICByZXR1cm4gZ2V0T2xkTWVzc2FnZXMoY2hhbm5lbFN0YXRlLmRiLCBjaGFubmVsU3RhdGUub3B0aW9ucy5pZGIudHRsKS50aGVuKGZ1bmN0aW9uKHRvb09sZCkgewogICAgcmV0dXJuIHJlbW92ZU1lc3NhZ2VzQnlJZChjaGFubmVsU3RhdGUsIHRvb09sZC5tYXAoZnVuY3Rpb24obXNnKSB7CiAgICAgIHJldHVybiBtc2cuaWQ7CiAgICB9KSk7CiAgfSk7Cn0KX19uYW1lKGNsZWFuT2xkTWVzc2FnZXMsICJjbGVhbk9sZE1lc3NhZ2VzIik7CmZ1bmN0aW9uIGNyZWF0ZTIoY2hhbm5lbE5hbWUsIG9wdGlvbnMpIHsKICBvcHRpb25zID0gZmlsbE9wdGlvbnNXaXRoRGVmYXVsdHMob3B0aW9ucyk7CiAgcmV0dXJuIGNyZWF0ZURhdGFiYXNlKGNoYW5uZWxOYW1lKS50aGVuKGZ1bmN0aW9uKGRiKSB7CiAgICB2YXIgc3RhdGUgPSB7CiAgICAgIGNsb3NlZDogZmFsc2UsCiAgICAgIGxhc3RDdXJzb3JJZDogMCwKICAgICAgY2hhbm5lbE5hbWUsCiAgICAgIG9wdGlvbnMsCiAgICAgIHV1aWQ6IHJhbmRvbVRva2VuKCksCiAgICAgIC8qKgogICAgICAgKiBlbWl0dGVkTWVzc2FnZXNJZHMKICAgICAgICogY29udGFpbnMgYWxsIG1lc3NhZ2VzIHRoYXQgaGF2ZSBiZWVuIGVtaXR0ZWQgYmVmb3JlCiAgICAgICAqIEB0eXBlIHtPYmxpdmlvdXNTZXR9CiAgICAgICAqLwogICAgICBlTUlzOiBuZXcgT2JsaXZpb3VzU2V0KG9wdGlvbnMuaWRiLnR0bCAqIDIpLAogICAgICAvLyBlbnN1cmVzIHdlIGRvIG5vdCByZWFkIG1lc3NhZ2VzIGluIHBhcmFsbGVsCiAgICAgIHdyaXRlQmxvY2tQcm9taXNlOiBQUk9NSVNFX1JFU09MVkVEX1ZPSUQsCiAgICAgIG1lc3NhZ2VzQ2FsbGJhY2s6IG51bGwsCiAgICAgIHJlYWRRdWV1ZVByb21pc2VzOiBbXSwKICAgICAgZGIKICAgIH07CiAgICBkYi5vbmNsb3NlID0gZnVuY3Rpb24oKSB7CiAgICAgIHN0YXRlLmNsb3NlZCA9IHRydWU7CiAgICAgIGlmIChvcHRpb25zLmlkYi5vbmNsb3NlKSBvcHRpb25zLmlkYi5vbmNsb3NlKCk7CiAgICB9OwogICAgX3JlYWRMb29wKHN0YXRlKTsKICAgIHJldHVybiBzdGF0ZTsKICB9KTsKfQpfX25hbWUoY3JlYXRlMiwgImNyZWF0ZSIpOwpmdW5jdGlvbiBfcmVhZExvb3Aoc3RhdGUpIHsKICBpZiAoc3RhdGUuY2xvc2VkKSByZXR1cm47CiAgcmVhZE5ld01lc3NhZ2VzKHN0YXRlKS50aGVuKGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHNsZWVwKHN0YXRlLm9wdGlvbnMuaWRiLmZhbGxiYWNrSW50ZXJ2YWwpOwogIH0pLnRoZW4oZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gX3JlYWRMb29wKHN0YXRlKTsKICB9KTsKfQpfX25hbWUoX3JlYWRMb29wLCAiX3JlYWRMb29wIik7CmZ1bmN0aW9uIF9maWx0ZXJNZXNzYWdlKG1zZ09iaiwgc3RhdGUpIHsKICBpZiAobXNnT2JqLnV1aWQgPT09IHN0YXRlLnV1aWQpIHJldHVybiBmYWxzZTsKICBpZiAoc3RhdGUuZU1Jcy5oYXMobXNnT2JqLmlkKSkgcmV0dXJuIGZhbHNlOwogIGlmIChtc2dPYmouZGF0YS50aW1lIDwgc3RhdGUubWVzc2FnZXNDYWxsYmFja1RpbWUpIHJldHVybiBmYWxzZTsKICByZXR1cm4gdHJ1ZTsKfQpfX25hbWUoX2ZpbHRlck1lc3NhZ2UsICJfZmlsdGVyTWVzc2FnZSIpOwpmdW5jdGlvbiByZWFkTmV3TWVzc2FnZXMoc3RhdGUpIHsKICBpZiAoc3RhdGUuY2xvc2VkKSByZXR1cm4gUFJPTUlTRV9SRVNPTFZFRF9WT0lEOwogIGlmICghc3RhdGUubWVzc2FnZXNDYWxsYmFjaykgcmV0dXJuIFBST01JU0VfUkVTT0xWRURfVk9JRDsKICByZXR1cm4gZ2V0TWVzc2FnZXNIaWdoZXJUaGFuKHN0YXRlLmRiLCBzdGF0ZS5sYXN0Q3Vyc29ySWQpLnRoZW4oZnVuY3Rpb24obmV3ZXJNZXNzYWdlcykgewogICAgdmFyIHVzZU1lc3NhZ2VzID0gbmV3ZXJNZXNzYWdlcy5maWx0ZXIoZnVuY3Rpb24obXNnT2JqKSB7CiAgICAgIHJldHVybiAhIW1zZ09iajsKICAgIH0pLm1hcChmdW5jdGlvbihtc2dPYmopIHsKICAgICAgaWYgKG1zZ09iai5pZCA+IHN0YXRlLmxhc3RDdXJzb3JJZCkgewogICAgICAgIHN0YXRlLmxhc3RDdXJzb3JJZCA9IG1zZ09iai5pZDsKICAgICAgfQogICAgICByZXR1cm4gbXNnT2JqOwogICAgfSkuZmlsdGVyKGZ1bmN0aW9uKG1zZ09iaikgewogICAgICByZXR1cm4gX2ZpbHRlck1lc3NhZ2UobXNnT2JqLCBzdGF0ZSk7CiAgICB9KS5zb3J0KGZ1bmN0aW9uKG1zZ09iakEsIG1zZ09iakIpIHsKICAgICAgcmV0dXJuIG1zZ09iakEudGltZSAtIG1zZ09iakIudGltZTsKICAgIH0pOwogICAgdXNlTWVzc2FnZXMuZm9yRWFjaChmdW5jdGlvbihtc2dPYmopIHsKICAgICAgaWYgKHN0YXRlLm1lc3NhZ2VzQ2FsbGJhY2spIHsKICAgICAgICBzdGF0ZS5lTUlzLmFkZChtc2dPYmouaWQpOwogICAgICAgIHN0YXRlLm1lc3NhZ2VzQ2FsbGJhY2sobXNnT2JqLmRhdGEpOwogICAgICB9CiAgICB9KTsKICAgIHJldHVybiBQUk9NSVNFX1JFU09MVkVEX1ZPSUQ7CiAgfSk7Cn0KX19uYW1lKHJlYWROZXdNZXNzYWdlcywgInJlYWROZXdNZXNzYWdlcyIpOwpmdW5jdGlvbiBjbG9zZTIoY2hhbm5lbFN0YXRlKSB7CiAgY2hhbm5lbFN0YXRlLmNsb3NlZCA9IHRydWU7CiAgY2hhbm5lbFN0YXRlLmRiLmNsb3NlKCk7Cn0KX19uYW1lKGNsb3NlMiwgImNsb3NlIik7CmZ1bmN0aW9uIHBvc3RNZXNzYWdlMihjaGFubmVsU3RhdGUsIG1lc3NhZ2VKc29uKSB7CiAgY2hhbm5lbFN0YXRlLndyaXRlQmxvY2tQcm9taXNlID0gY2hhbm5lbFN0YXRlLndyaXRlQmxvY2tQcm9taXNlLnRoZW4oZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gd3JpdGVNZXNzYWdlKGNoYW5uZWxTdGF0ZS5kYiwgY2hhbm5lbFN0YXRlLnV1aWQsIG1lc3NhZ2VKc29uKTsKICB9KS50aGVuKGZ1bmN0aW9uKCkgewogICAgaWYgKHJhbmRvbUludCgwLCAxMCkgPT09IDApIHsKICAgICAgY2xlYW5PbGRNZXNzYWdlcyhjaGFubmVsU3RhdGUpOwogICAgfQogIH0pOwogIHJldHVybiBjaGFubmVsU3RhdGUud3JpdGVCbG9ja1Byb21pc2U7Cn0KX19uYW1lKHBvc3RNZXNzYWdlMiwgInBvc3RNZXNzYWdlIik7CmZ1bmN0aW9uIG9uTWVzc2FnZTIoY2hhbm5lbFN0YXRlLCBmbiwgdGltZSkgewogIGNoYW5uZWxTdGF0ZS5tZXNzYWdlc0NhbGxiYWNrVGltZSA9IHRpbWU7CiAgY2hhbm5lbFN0YXRlLm1lc3NhZ2VzQ2FsbGJhY2sgPSBmbjsKICByZWFkTmV3TWVzc2FnZXMoY2hhbm5lbFN0YXRlKTsKfQpfX25hbWUob25NZXNzYWdlMiwgIm9uTWVzc2FnZSIpOwpmdW5jdGlvbiBjYW5CZVVzZWQyKCkgewogIHJldHVybiAhIWdldElkYigpOwp9Cl9fbmFtZShjYW5CZVVzZWQyLCAiY2FuQmVVc2VkIik7CmZ1bmN0aW9uIGF2ZXJhZ2VSZXNwb25zZVRpbWUyKG9wdGlvbnMpIHsKICByZXR1cm4gb3B0aW9ucy5pZGIuZmFsbGJhY2tJbnRlcnZhbCAqIDI7Cn0KX19uYW1lKGF2ZXJhZ2VSZXNwb25zZVRpbWUyLCAiYXZlcmFnZVJlc3BvbnNlVGltZSIpOwp2YXIgSW5kZXhlZERCTWV0aG9kID0gewogIGNyZWF0ZTogY3JlYXRlMiwKICBjbG9zZTogY2xvc2UyLAogIG9uTWVzc2FnZTogb25NZXNzYWdlMiwKICBwb3N0TWVzc2FnZTogcG9zdE1lc3NhZ2UyLAogIGNhbkJlVXNlZDogY2FuQmVVc2VkMiwKICB0eXBlOiB0eXBlMiwKICBhdmVyYWdlUmVzcG9uc2VUaW1lOiBhdmVyYWdlUmVzcG9uc2VUaW1lMiwKICBtaWNyb1NlY29uZHM6IG1pY3JvU2Vjb25kczMKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9icm9hZGNhc3QtY2hhbm5lbEA3LjMuMC9ub2RlX21vZHVsZXMvYnJvYWRjYXN0LWNoYW5uZWwvZGlzdC9lc2Jyb3dzZXIvbWV0aG9kcy9sb2NhbHN0b3JhZ2UuanMKdmFyIG1pY3JvU2Vjb25kczQgPSBtaWNyb1NlY29uZHM7CnZhciBLRVlfUFJFRklYID0gInB1YmtleS5icm9hZGNhc3RDaGFubmVsLSI7CnZhciB0eXBlMyA9ICJsb2NhbHN0b3JhZ2UiOwpmdW5jdGlvbiBnZXRMb2NhbFN0b3JhZ2UoKSB7CiAgdmFyIGxvY2FsU3RvcmFnZTsKICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gInVuZGVmaW5lZCIpIHJldHVybiBudWxsOwogIHRyeSB7CiAgICBsb2NhbFN0b3JhZ2UgPSB3aW5kb3cubG9jYWxTdG9yYWdlOwogICAgbG9jYWxTdG9yYWdlID0gd2luZG93WyJpZTgtZXZlbnRsaXN0ZW5lci9zdG9yYWdlIl0gfHwgd2luZG93LmxvY2FsU3RvcmFnZTsKICB9IGNhdGNoIChlMTApIHsKICB9CiAgcmV0dXJuIGxvY2FsU3RvcmFnZTsKfQpfX25hbWUoZ2V0TG9jYWxTdG9yYWdlLCAiZ2V0TG9jYWxTdG9yYWdlIik7CmZ1bmN0aW9uIHN0b3JhZ2VLZXkoY2hhbm5lbE5hbWUpIHsKICByZXR1cm4gS0VZX1BSRUZJWCArIGNoYW5uZWxOYW1lOwp9Cl9fbmFtZShzdG9yYWdlS2V5LCAic3RvcmFnZUtleSIpOwpmdW5jdGlvbiBwb3N0TWVzc2FnZTMoY2hhbm5lbFN0YXRlLCBtZXNzYWdlSnNvbikgewogIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXMpIHsKICAgIHNsZWVwKCkudGhlbihmdW5jdGlvbigpIHsKICAgICAgdmFyIGtleTIgPSBzdG9yYWdlS2V5KGNoYW5uZWxTdGF0ZS5jaGFubmVsTmFtZSk7CiAgICAgIHZhciB3cml0ZU9iaiA9IHsKICAgICAgICB0b2tlbjogcmFuZG9tVG9rZW4oKSwKICAgICAgICB0aW1lOiBEYXRlLm5vdygpLAogICAgICAgIGRhdGE6IG1lc3NhZ2VKc29uLAogICAgICAgIHV1aWQ6IGNoYW5uZWxTdGF0ZS51dWlkCiAgICAgIH07CiAgICAgIHZhciB2YWx1ZTIgPSBKU09OLnN0cmluZ2lmeSh3cml0ZU9iaik7CiAgICAgIGdldExvY2FsU3RvcmFnZSgpLnNldEl0ZW0oa2V5MiwgdmFsdWUyKTsKICAgICAgdmFyIGV2ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50Iik7CiAgICAgIGV2LmluaXRFdmVudCgic3RvcmFnZSIsIHRydWUsIHRydWUpOwogICAgICBldi5rZXkgPSBrZXkyOwogICAgICBldi5uZXdWYWx1ZSA9IHZhbHVlMjsKICAgICAgd2luZG93LmRpc3BhdGNoRXZlbnQoZXYpOwogICAgICByZXMoKTsKICAgIH0pOwogIH0pOwp9Cl9fbmFtZShwb3N0TWVzc2FnZTMsICJwb3N0TWVzc2FnZSIpOwpmdW5jdGlvbiBhZGRTdG9yYWdlRXZlbnRMaXN0ZW5lcihjaGFubmVsTmFtZSwgZm4pIHsKICB2YXIga2V5MiA9IHN0b3JhZ2VLZXkoY2hhbm5lbE5hbWUpOwogIHZhciBsaXN0ZW5lciA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gbGlzdGVuZXIyKGV2KSB7CiAgICBpZiAoZXYua2V5ID09PSBrZXkyKSB7CiAgICAgIGZuKEpTT04ucGFyc2UoZXYubmV3VmFsdWUpKTsKICAgIH0KICB9LCAibGlzdGVuZXIiKTsKICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigic3RvcmFnZSIsIGxpc3RlbmVyKTsKICByZXR1cm4gbGlzdGVuZXI7Cn0KX19uYW1lKGFkZFN0b3JhZ2VFdmVudExpc3RlbmVyLCAiYWRkU3RvcmFnZUV2ZW50TGlzdGVuZXIiKTsKZnVuY3Rpb24gcmVtb3ZlU3RvcmFnZUV2ZW50TGlzdGVuZXIobGlzdGVuZXIpIHsKICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigic3RvcmFnZSIsIGxpc3RlbmVyKTsKfQpfX25hbWUocmVtb3ZlU3RvcmFnZUV2ZW50TGlzdGVuZXIsICJyZW1vdmVTdG9yYWdlRXZlbnRMaXN0ZW5lciIpOwpmdW5jdGlvbiBjcmVhdGUzKGNoYW5uZWxOYW1lLCBvcHRpb25zKSB7CiAgb3B0aW9ucyA9IGZpbGxPcHRpb25zV2l0aERlZmF1bHRzKG9wdGlvbnMpOwogIGlmICghY2FuQmVVc2VkMygpKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoIkJyb2FkY2FzdENoYW5uZWw6IGxvY2Fsc3RvcmFnZSBjYW5ub3QgYmUgdXNlZCIpOwogIH0KICB2YXIgdXVpZCA9IHJhbmRvbVRva2VuKCk7CiAgdmFyIGVNSXMgPSBuZXcgT2JsaXZpb3VzU2V0KG9wdGlvbnMubG9jYWxzdG9yYWdlLnJlbW92ZVRpbWVvdXQpOwogIHZhciBzdGF0ZSA9IHsKICAgIGNoYW5uZWxOYW1lLAogICAgdXVpZCwKICAgIGVNSXMKICAgIC8vIGVtaXR0ZWRNZXNzYWdlc0lkcwogIH07CiAgc3RhdGUubGlzdGVuZXIgPSBhZGRTdG9yYWdlRXZlbnRMaXN0ZW5lcihjaGFubmVsTmFtZSwgZnVuY3Rpb24obXNnT2JqKSB7CiAgICBpZiAoIXN0YXRlLm1lc3NhZ2VzQ2FsbGJhY2spIHJldHVybjsKICAgIGlmIChtc2dPYmoudXVpZCA9PT0gdXVpZCkgcmV0dXJuOwogICAgaWYgKCFtc2dPYmoudG9rZW4gfHwgZU1Jcy5oYXMobXNnT2JqLnRva2VuKSkgcmV0dXJuOwogICAgaWYgKG1zZ09iai5kYXRhLnRpbWUgJiYgbXNnT2JqLmRhdGEudGltZSA8IHN0YXRlLm1lc3NhZ2VzQ2FsbGJhY2tUaW1lKSByZXR1cm47CiAgICBlTUlzLmFkZChtc2dPYmoudG9rZW4pOwogICAgc3RhdGUubWVzc2FnZXNDYWxsYmFjayhtc2dPYmouZGF0YSk7CiAgfSk7CiAgcmV0dXJuIHN0YXRlOwp9Cl9fbmFtZShjcmVhdGUzLCAiY3JlYXRlIik7CmZ1bmN0aW9uIGNsb3NlMyhjaGFubmVsU3RhdGUpIHsKICByZW1vdmVTdG9yYWdlRXZlbnRMaXN0ZW5lcihjaGFubmVsU3RhdGUubGlzdGVuZXIpOwp9Cl9fbmFtZShjbG9zZTMsICJjbG9zZSIpOwpmdW5jdGlvbiBvbk1lc3NhZ2UzKGNoYW5uZWxTdGF0ZSwgZm4sIHRpbWUpIHsKICBjaGFubmVsU3RhdGUubWVzc2FnZXNDYWxsYmFja1RpbWUgPSB0aW1lOwogIGNoYW5uZWxTdGF0ZS5tZXNzYWdlc0NhbGxiYWNrID0gZm47Cn0KX19uYW1lKG9uTWVzc2FnZTMsICJvbk1lc3NhZ2UiKTsKZnVuY3Rpb24gY2FuQmVVc2VkMygpIHsKICB2YXIgbHMgPSBnZXRMb2NhbFN0b3JhZ2UoKTsKICBpZiAoIWxzKSByZXR1cm4gZmFsc2U7CiAgdHJ5IHsKICAgIHZhciBrZXkyID0gIl9fYnJvYWRjYXN0Y2hhbm5lbF9jaGVjayI7CiAgICBscy5zZXRJdGVtKGtleTIsICJ3b3JrcyIpOwogICAgbHMucmVtb3ZlSXRlbShrZXkyKTsKICB9IGNhdGNoIChlMTApIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgcmV0dXJuIHRydWU7Cn0KX19uYW1lKGNhbkJlVXNlZDMsICJjYW5CZVVzZWQiKTsKZnVuY3Rpb24gYXZlcmFnZVJlc3BvbnNlVGltZTMoKSB7CiAgdmFyIGRlZmF1bHRUaW1lID0gMTIwOwogIHZhciB1c2VyQWdlbnQgPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCk7CiAgaWYgKHVzZXJBZ2VudC5pbmNsdWRlcygic2FmYXJpIikgJiYgIXVzZXJBZ2VudC5pbmNsdWRlcygiY2hyb21lIikpIHsKICAgIHJldHVybiBkZWZhdWx0VGltZSAqIDI7CiAgfQogIHJldHVybiBkZWZhdWx0VGltZTsKfQpfX25hbWUoYXZlcmFnZVJlc3BvbnNlVGltZTMsICJhdmVyYWdlUmVzcG9uc2VUaW1lIik7CnZhciBMb2NhbHN0b3JhZ2VNZXRob2QgPSB7CiAgY3JlYXRlOiBjcmVhdGUzLAogIGNsb3NlOiBjbG9zZTMsCiAgb25NZXNzYWdlOiBvbk1lc3NhZ2UzLAogIHBvc3RNZXNzYWdlOiBwb3N0TWVzc2FnZTMsCiAgY2FuQmVVc2VkOiBjYW5CZVVzZWQzLAogIHR5cGU6IHR5cGUzLAogIGF2ZXJhZ2VSZXNwb25zZVRpbWU6IGF2ZXJhZ2VSZXNwb25zZVRpbWUzLAogIG1pY3JvU2Vjb25kczogbWljcm9TZWNvbmRzNAp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2Jyb2FkY2FzdC1jaGFubmVsQDcuMy4wL25vZGVfbW9kdWxlcy9icm9hZGNhc3QtY2hhbm5lbC9kaXN0L2VzYnJvd3Nlci9tZXRob2RzL3NpbXVsYXRlLmpzCnZhciBtaWNyb1NlY29uZHM1ID0gbWljcm9TZWNvbmRzOwp2YXIgdHlwZTQgPSAic2ltdWxhdGUiOwp2YXIgU0lNVUxBVEVfQ0hBTk5FTFMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpOwpmdW5jdGlvbiBjcmVhdGU0KGNoYW5uZWxOYW1lKSB7CiAgdmFyIHN0YXRlID0gewogICAgdGltZTogbWljcm9TZWNvbmRzNSgpLAogICAgbmFtZTogY2hhbm5lbE5hbWUsCiAgICBtZXNzYWdlc0NhbGxiYWNrOiBudWxsCiAgfTsKICBTSU1VTEFURV9DSEFOTkVMUy5hZGQoc3RhdGUpOwogIHJldHVybiBzdGF0ZTsKfQpfX25hbWUoY3JlYXRlNCwgImNyZWF0ZSIpOwpmdW5jdGlvbiBjbG9zZTQoY2hhbm5lbFN0YXRlKSB7CiAgU0lNVUxBVEVfQ0hBTk5FTFNbImRlbGV0ZSJdKGNoYW5uZWxTdGF0ZSk7Cn0KX19uYW1lKGNsb3NlNCwgImNsb3NlIik7CnZhciBTSU1VTEFURV9ERUxBWV9USU1FID0gNTsKZnVuY3Rpb24gcG9zdE1lc3NhZ2U0KGNoYW5uZWxTdGF0ZSwgbWVzc2FnZUpzb24pIHsKICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzKSB7CiAgICByZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgdmFyIGNoYW5uZWxBcnJheSA9IEFycmF5LmZyb20oU0lNVUxBVEVfQ0hBTk5FTFMpOwogICAgICBjaGFubmVsQXJyYXkuZm9yRWFjaChmdW5jdGlvbihjaGFubmVsKSB7CiAgICAgICAgaWYgKGNoYW5uZWwubmFtZSA9PT0gY2hhbm5lbFN0YXRlLm5hbWUgJiYgLy8gaGFzIHNhbWUgbmFtZQogICAgICAgIGNoYW5uZWwgIT09IGNoYW5uZWxTdGF0ZSAmJiAvLyBub3Qgb3duIGNoYW5uZWwKICAgICAgICAhIWNoYW5uZWwubWVzc2FnZXNDYWxsYmFjayAmJiAvLyBoYXMgc3Vic2NyaWJlcnMKICAgICAgICBjaGFubmVsLnRpbWUgPCBtZXNzYWdlSnNvbi50aW1lKSB7CiAgICAgICAgICBjaGFubmVsLm1lc3NhZ2VzQ2FsbGJhY2sobWVzc2FnZUpzb24pOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHJlcygpOwogICAgfSwgU0lNVUxBVEVfREVMQVlfVElNRSk7CiAgfSk7Cn0KX19uYW1lKHBvc3RNZXNzYWdlNCwgInBvc3RNZXNzYWdlIik7CmZ1bmN0aW9uIG9uTWVzc2FnZTQoY2hhbm5lbFN0YXRlLCBmbikgewogIGNoYW5uZWxTdGF0ZS5tZXNzYWdlc0NhbGxiYWNrID0gZm47Cn0KX19uYW1lKG9uTWVzc2FnZTQsICJvbk1lc3NhZ2UiKTsKZnVuY3Rpb24gY2FuQmVVc2VkNCgpIHsKICByZXR1cm4gdHJ1ZTsKfQpfX25hbWUoY2FuQmVVc2VkNCwgImNhbkJlVXNlZCIpOwpmdW5jdGlvbiBhdmVyYWdlUmVzcG9uc2VUaW1lNCgpIHsKICByZXR1cm4gU0lNVUxBVEVfREVMQVlfVElNRTsKfQpfX25hbWUoYXZlcmFnZVJlc3BvbnNlVGltZTQsICJhdmVyYWdlUmVzcG9uc2VUaW1lIik7CnZhciBTaW11bGF0ZU1ldGhvZCA9IHsKICBjcmVhdGU6IGNyZWF0ZTQsCiAgY2xvc2U6IGNsb3NlNCwKICBvbk1lc3NhZ2U6IG9uTWVzc2FnZTQsCiAgcG9zdE1lc3NhZ2U6IHBvc3RNZXNzYWdlNCwKICBjYW5CZVVzZWQ6IGNhbkJlVXNlZDQsCiAgdHlwZTogdHlwZTQsCiAgYXZlcmFnZVJlc3BvbnNlVGltZTogYXZlcmFnZVJlc3BvbnNlVGltZTQsCiAgbWljcm9TZWNvbmRzOiBtaWNyb1NlY29uZHM1Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vYnJvYWRjYXN0LWNoYW5uZWxANy4zLjAvbm9kZV9tb2R1bGVzL2Jyb2FkY2FzdC1jaGFubmVsL2Rpc3QvZXNicm93c2VyL21ldGhvZC1jaG9vc2VyLmpzCnZhciBNRVRIT0RTID0gWwogIE5hdGl2ZU1ldGhvZCwKICAvLyBmYXN0ZXN0CiAgSW5kZXhlZERCTWV0aG9kLAogIExvY2Fsc3RvcmFnZU1ldGhvZApdOwpmdW5jdGlvbiBjaG9vc2VNZXRob2Qob3B0aW9ucykgewogIHZhciBjaG9vc2VNZXRob2RzID0gW10uY29uY2F0KG9wdGlvbnMubWV0aG9kcywgTUVUSE9EUykuZmlsdGVyKEJvb2xlYW4pOwogIGlmIChvcHRpb25zLnR5cGUpIHsKICAgIGlmIChvcHRpb25zLnR5cGUgPT09ICJzaW11bGF0ZSIpIHsKICAgICAgcmV0dXJuIFNpbXVsYXRlTWV0aG9kOwogICAgfQogICAgdmFyIHJldCA9IGNob29zZU1ldGhvZHMuZmluZChmdW5jdGlvbihtNSkgewogICAgICByZXR1cm4gbTUudHlwZSA9PT0gb3B0aW9ucy50eXBlOwogICAgfSk7CiAgICBpZiAoIXJldCkgdGhyb3cgbmV3IEVycm9yKCJtZXRob2QtdHlwZSAiICsgb3B0aW9ucy50eXBlICsgIiBub3QgZm91bmQiKTsKICAgIGVsc2UgcmV0dXJuIHJldDsKICB9CiAgaWYgKCFvcHRpb25zLndlYldvcmtlclN1cHBvcnQpIHsKICAgIGNob29zZU1ldGhvZHMgPSBjaG9vc2VNZXRob2RzLmZpbHRlcihmdW5jdGlvbihtNSkgewogICAgICByZXR1cm4gbTUudHlwZSAhPT0gImlkYiI7CiAgICB9KTsKICB9CiAgdmFyIHVzZU1ldGhvZCA9IGNob29zZU1ldGhvZHMuZmluZChmdW5jdGlvbihtZXRob2QpIHsKICAgIHJldHVybiBtZXRob2QuY2FuQmVVc2VkKCk7CiAgfSk7CiAgaWYgKCF1c2VNZXRob2QpIHsKICAgIHRocm93IG5ldyBFcnJvcigiTm8gdXNhYmxlIG1ldGhvZCBmb3VuZCBpbiAiICsgSlNPTi5zdHJpbmdpZnkoTUVUSE9EUy5tYXAoZnVuY3Rpb24obTUpIHsKICAgICAgcmV0dXJuIG01LnR5cGU7CiAgICB9KSkpOwogIH0gZWxzZSB7CiAgICByZXR1cm4gdXNlTWV0aG9kOwogIH0KfQpfX25hbWUoY2hvb3NlTWV0aG9kLCAiY2hvb3NlTWV0aG9kIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vYnJvYWRjYXN0LWNoYW5uZWxANy4zLjAvbm9kZV9tb2R1bGVzL2Jyb2FkY2FzdC1jaGFubmVsL2Rpc3QvZXNicm93c2VyL2Jyb2FkY2FzdC1jaGFubmVsLmpzCnZhciBPUEVOX0JST0FEQ0FTVF9DSEFOTkVMUyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7CnZhciBsYXN0SWQgPSAwOwp2YXIgQnJvYWRjYXN0Q2hhbm5lbDIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uIEJyb2FkY2FzdENoYW5uZWwzKG5hbWUsIG9wdGlvbnMpIHsKICB0aGlzLmlkID0gbGFzdElkKys7CiAgT1BFTl9CUk9BRENBU1RfQ0hBTk5FTFMuYWRkKHRoaXMpOwogIHRoaXMubmFtZSA9IG5hbWU7CiAgaWYgKEVORk9SQ0VEX09QVElPTlMpIHsKICAgIG9wdGlvbnMgPSBFTkZPUkNFRF9PUFRJT05TOwogIH0KICB0aGlzLm9wdGlvbnMgPSBmaWxsT3B0aW9uc1dpdGhEZWZhdWx0cyhvcHRpb25zKTsKICB0aGlzLm1ldGhvZCA9IGNob29zZU1ldGhvZCh0aGlzLm9wdGlvbnMpOwogIHRoaXMuX2lMID0gZmFsc2U7CiAgdGhpcy5fb25NTCA9IG51bGw7CiAgdGhpcy5fYWRkRUwgPSB7CiAgICBtZXNzYWdlOiBbXSwKICAgIGludGVybmFsOiBbXQogIH07CiAgdGhpcy5fdU1QID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTsKICB0aGlzLl9iZWZDID0gW107CiAgdGhpcy5fcHJlcFAgPSBudWxsOwogIF9wcmVwYXJlQ2hhbm5lbCh0aGlzKTsKfSwgIkJyb2FkY2FzdENoYW5uZWwiKTsKQnJvYWRjYXN0Q2hhbm5lbDIuX3B1YmtleSA9IHRydWU7CmZ1bmN0aW9uIGNsZWFyTm9kZUZvbGRlcihvcHRpb25zKSB7CiAgb3B0aW9ucyA9IGZpbGxPcHRpb25zV2l0aERlZmF1bHRzKG9wdGlvbnMpOwogIHZhciBtZXRob2QgPSBjaG9vc2VNZXRob2Qob3B0aW9ucyk7CiAgaWYgKG1ldGhvZC50eXBlID09PSAibm9kZSIpIHsKICAgIHJldHVybiBtZXRob2QuY2xlYXJOb2RlRm9sZGVyKCkudGhlbihmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9KTsKICB9IGVsc2UgewogICAgcmV0dXJuIFBST01JU0VfUkVTT0xWRURfRkFMU0U7CiAgfQp9Cl9fbmFtZShjbGVhck5vZGVGb2xkZXIsICJjbGVhck5vZGVGb2xkZXIiKTsKdmFyIEVORk9SQ0VEX09QVElPTlM7CmZ1bmN0aW9uIGVuZm9yY2VPcHRpb25zKG9wdGlvbnMpIHsKICBFTkZPUkNFRF9PUFRJT05TID0gb3B0aW9uczsKfQpfX25hbWUoZW5mb3JjZU9wdGlvbnMsICJlbmZvcmNlT3B0aW9ucyIpOwpCcm9hZGNhc3RDaGFubmVsMi5wcm90b3R5cGUgPSB7CiAgcG9zdE1lc3NhZ2U6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gcG9zdE1lc3NhZ2U1KG1zZykgewogICAgaWYgKHRoaXMuY2xvc2VkKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiQnJvYWRjYXN0Q2hhbm5lbC5wb3N0TWVzc2FnZSgpOiBDYW5ub3QgcG9zdCBtZXNzYWdlIGFmdGVyIGNoYW5uZWwgaGFzIGNsb3NlZCAiICsgLyoqCiAgICAgICAqIEluIHRoZSBwYXN0IHdoZW4gdGhpcyBlcnJvciBhcHBlYXJlZCwgaXQgd2FzIHJlYWxseSBoYXJkIHRvIGRlYnVnLgogICAgICAgKiBTbyBub3cgd2UgbG9nIHRoZSBtc2cgdG9nZXRoZXIgd2l0aCB0aGUgZXJyb3Igc28gaXQgYXQgbGVhc3QKICAgICAgICogZ2l2ZXMgc29tZSBjbHVlIGFib3V0IHdoZXJlIGluIHlvdXIgYXBwbGljYXRpb24gdGhpcyBoYXBwZW5zLgogICAgICAgKi8KICAgICAgSlNPTi5zdHJpbmdpZnkobXNnKSk7CiAgICB9CiAgICByZXR1cm4gX3Bvc3QodGhpcywgIm1lc3NhZ2UiLCBtc2cpOwogIH0sICJwb3N0TWVzc2FnZSIpLAogIHBvc3RJbnRlcm5hbDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbiBwb3N0SW50ZXJuYWwobXNnKSB7CiAgICByZXR1cm4gX3Bvc3QodGhpcywgImludGVybmFsIiwgbXNnKTsKICB9LCAicG9zdEludGVybmFsIiksCiAgc2V0IG9ubWVzc2FnZShmbikgewogICAgdmFyIHRpbWUgPSB0aGlzLm1ldGhvZC5taWNyb1NlY29uZHMoKTsKICAgIHZhciBsaXN0ZW5PYmogPSB7CiAgICAgIHRpbWUsCiAgICAgIGZuCiAgICB9OwogICAgX3JlbW92ZUxpc3RlbmVyT2JqZWN0KHRoaXMsICJtZXNzYWdlIiwgdGhpcy5fb25NTCk7CiAgICBpZiAoZm4gJiYgdHlwZW9mIGZuID09PSAiZnVuY3Rpb24iKSB7CiAgICAgIHRoaXMuX29uTUwgPSBsaXN0ZW5PYmo7CiAgICAgIF9hZGRMaXN0ZW5lck9iamVjdCh0aGlzLCAibWVzc2FnZSIsIGxpc3Rlbk9iaik7CiAgICB9IGVsc2UgewogICAgICB0aGlzLl9vbk1MID0gbnVsbDsKICAgIH0KICB9LAogIGFkZEV2ZW50TGlzdGVuZXI6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcih0eXBlNSwgZm4pIHsKICAgIHZhciB0aW1lID0gdGhpcy5tZXRob2QubWljcm9TZWNvbmRzKCk7CiAgICB2YXIgbGlzdGVuT2JqID0gewogICAgICB0aW1lLAogICAgICBmbgogICAgfTsKICAgIF9hZGRMaXN0ZW5lck9iamVjdCh0aGlzLCB0eXBlNSwgbGlzdGVuT2JqKTsKICB9LCAiYWRkRXZlbnRMaXN0ZW5lciIpLAogIHJlbW92ZUV2ZW50TGlzdGVuZXI6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlNSwgZm4pIHsKICAgIHZhciBvYmogPSB0aGlzLl9hZGRFTFt0eXBlNV0uZmluZChmdW5jdGlvbihvYmoyKSB7CiAgICAgIHJldHVybiBvYmoyLmZuID09PSBmbjsKICAgIH0pOwogICAgX3JlbW92ZUxpc3RlbmVyT2JqZWN0KHRoaXMsIHR5cGU1LCBvYmopOwogIH0sICJyZW1vdmVFdmVudExpc3RlbmVyIiksCiAgY2xvc2U6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gY2xvc2U1KCkgewogICAgdmFyIF90aGlzID0gdGhpczsKICAgIGlmICh0aGlzLmNsb3NlZCkgewogICAgICByZXR1cm47CiAgICB9CiAgICBPUEVOX0JST0FEQ0FTVF9DSEFOTkVMU1siZGVsZXRlIl0odGhpcyk7CiAgICB0aGlzLmNsb3NlZCA9IHRydWU7CiAgICB2YXIgYXdhaXRQcmVwYXJlID0gdGhpcy5fcHJlcFAgPyB0aGlzLl9wcmVwUCA6IFBST01JU0VfUkVTT0xWRURfVk9JRDsKICAgIHRoaXMuX29uTUwgPSBudWxsOwogICAgdGhpcy5fYWRkRUwubWVzc2FnZSA9IFtdOwogICAgcmV0dXJuIGF3YWl0UHJlcGFyZS50aGVuKGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gUHJvbWlzZS5hbGwoQXJyYXkuZnJvbShfdGhpcy5fdU1QKSk7CiAgICB9KS50aGVuKGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gUHJvbWlzZS5hbGwoX3RoaXMuX2JlZkMubWFwKGZ1bmN0aW9uKGZuKSB7CiAgICAgICAgcmV0dXJuIGZuKCk7CiAgICAgIH0pKTsKICAgIH0pLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBfdGhpcy5tZXRob2QuY2xvc2UoX3RoaXMuX3N0YXRlKTsKICAgIH0pOwogIH0sICJjbG9zZSIpLAogIGdldCB0eXBlKCkgewogICAgcmV0dXJuIHRoaXMubWV0aG9kLnR5cGU7CiAgfSwKICBnZXQgaXNDbG9zZWQoKSB7CiAgICByZXR1cm4gdGhpcy5jbG9zZWQ7CiAgfQp9OwpmdW5jdGlvbiBfcG9zdChicm9hZGNhc3RDaGFubmVsLCB0eXBlNSwgbXNnKSB7CiAgdmFyIHRpbWUgPSBicm9hZGNhc3RDaGFubmVsLm1ldGhvZC5taWNyb1NlY29uZHMoKTsKICB2YXIgbXNnT2JqID0gewogICAgdGltZSwKICAgIHR5cGU6IHR5cGU1LAogICAgZGF0YTogbXNnCiAgfTsKICB2YXIgYXdhaXRQcmVwYXJlID0gYnJvYWRjYXN0Q2hhbm5lbC5fcHJlcFAgPyBicm9hZGNhc3RDaGFubmVsLl9wcmVwUCA6IFBST01JU0VfUkVTT0xWRURfVk9JRDsKICByZXR1cm4gYXdhaXRQcmVwYXJlLnRoZW4oZnVuY3Rpb24oKSB7CiAgICB2YXIgc2VuZFByb21pc2UgPSBicm9hZGNhc3RDaGFubmVsLm1ldGhvZC5wb3N0TWVzc2FnZShicm9hZGNhc3RDaGFubmVsLl9zdGF0ZSwgbXNnT2JqKTsKICAgIGJyb2FkY2FzdENoYW5uZWwuX3VNUC5hZGQoc2VuZFByb21pc2UpOwogICAgc2VuZFByb21pc2VbImNhdGNoIl0oKS50aGVuKGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gYnJvYWRjYXN0Q2hhbm5lbC5fdU1QWyJkZWxldGUiXShzZW5kUHJvbWlzZSk7CiAgICB9KTsKICAgIHJldHVybiBzZW5kUHJvbWlzZTsKICB9KTsKfQpfX25hbWUoX3Bvc3QsICJfcG9zdCIpOwpmdW5jdGlvbiBfcHJlcGFyZUNoYW5uZWwoY2hhbm5lbCkgewogIHZhciBtYXliZVByb21pc2UgPSBjaGFubmVsLm1ldGhvZC5jcmVhdGUoY2hhbm5lbC5uYW1lLCBjaGFubmVsLm9wdGlvbnMpOwogIGlmIChpc1Byb21pc2UyKG1heWJlUHJvbWlzZSkpIHsKICAgIGNoYW5uZWwuX3ByZXBQID0gbWF5YmVQcm9taXNlOwogICAgbWF5YmVQcm9taXNlLnRoZW4oZnVuY3Rpb24oczkpIHsKICAgICAgY2hhbm5lbC5fc3RhdGUgPSBzOTsKICAgIH0pOwogIH0gZWxzZSB7CiAgICBjaGFubmVsLl9zdGF0ZSA9IG1heWJlUHJvbWlzZTsKICB9Cn0KX19uYW1lKF9wcmVwYXJlQ2hhbm5lbCwgIl9wcmVwYXJlQ2hhbm5lbCIpOwpmdW5jdGlvbiBfaGFzTWVzc2FnZUxpc3RlbmVycyhjaGFubmVsKSB7CiAgaWYgKGNoYW5uZWwuX2FkZEVMLm1lc3NhZ2UubGVuZ3RoID4gMCkgcmV0dXJuIHRydWU7CiAgaWYgKGNoYW5uZWwuX2FkZEVMLmludGVybmFsLmxlbmd0aCA+IDApIHJldHVybiB0cnVlOwogIHJldHVybiBmYWxzZTsKfQpfX25hbWUoX2hhc01lc3NhZ2VMaXN0ZW5lcnMsICJfaGFzTWVzc2FnZUxpc3RlbmVycyIpOwpmdW5jdGlvbiBfYWRkTGlzdGVuZXJPYmplY3QoY2hhbm5lbCwgdHlwZTUsIG9iaikgewogIGNoYW5uZWwuX2FkZEVMW3R5cGU1XS5wdXNoKG9iaik7CiAgX3N0YXJ0TGlzdGVuaW5nKGNoYW5uZWwpOwp9Cl9fbmFtZShfYWRkTGlzdGVuZXJPYmplY3QsICJfYWRkTGlzdGVuZXJPYmplY3QiKTsKZnVuY3Rpb24gX3JlbW92ZUxpc3RlbmVyT2JqZWN0KGNoYW5uZWwsIHR5cGU1LCBvYmopIHsKICBjaGFubmVsLl9hZGRFTFt0eXBlNV0gPSBjaGFubmVsLl9hZGRFTFt0eXBlNV0uZmlsdGVyKGZ1bmN0aW9uKG8xMikgewogICAgcmV0dXJuIG8xMiAhPT0gb2JqOwogIH0pOwogIF9zdG9wTGlzdGVuaW5nKGNoYW5uZWwpOwp9Cl9fbmFtZShfcmVtb3ZlTGlzdGVuZXJPYmplY3QsICJfcmVtb3ZlTGlzdGVuZXJPYmplY3QiKTsKZnVuY3Rpb24gX3N0YXJ0TGlzdGVuaW5nKGNoYW5uZWwpIHsKICBpZiAoIWNoYW5uZWwuX2lMICYmIF9oYXNNZXNzYWdlTGlzdGVuZXJzKGNoYW5uZWwpKSB7CiAgICB2YXIgbGlzdGVuZXJGbiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gbGlzdGVuZXJGbjIobXNnT2JqKSB7CiAgICAgIGNoYW5uZWwuX2FkZEVMW21zZ09iai50eXBlXS5mb3JFYWNoKGZ1bmN0aW9uKGxpc3RlbmVyT2JqZWN0KSB7CiAgICAgICAgaWYgKG1zZ09iai50aW1lID49IGxpc3RlbmVyT2JqZWN0LnRpbWUpIHsKICAgICAgICAgIGxpc3RlbmVyT2JqZWN0LmZuKG1zZ09iai5kYXRhKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSwgImxpc3RlbmVyRm4iKTsKICAgIHZhciB0aW1lID0gY2hhbm5lbC5tZXRob2QubWljcm9TZWNvbmRzKCk7CiAgICBpZiAoY2hhbm5lbC5fcHJlcFApIHsKICAgICAgY2hhbm5lbC5fcHJlcFAudGhlbihmdW5jdGlvbigpIHsKICAgICAgICBjaGFubmVsLl9pTCA9IHRydWU7CiAgICAgICAgY2hhbm5lbC5tZXRob2Qub25NZXNzYWdlKGNoYW5uZWwuX3N0YXRlLCBsaXN0ZW5lckZuLCB0aW1lKTsKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBjaGFubmVsLl9pTCA9IHRydWU7CiAgICAgIGNoYW5uZWwubWV0aG9kLm9uTWVzc2FnZShjaGFubmVsLl9zdGF0ZSwgbGlzdGVuZXJGbiwgdGltZSk7CiAgICB9CiAgfQp9Cl9fbmFtZShfc3RhcnRMaXN0ZW5pbmcsICJfc3RhcnRMaXN0ZW5pbmciKTsKZnVuY3Rpb24gX3N0b3BMaXN0ZW5pbmcoY2hhbm5lbCkgewogIGlmIChjaGFubmVsLl9pTCAmJiAhX2hhc01lc3NhZ2VMaXN0ZW5lcnMoY2hhbm5lbCkpIHsKICAgIGNoYW5uZWwuX2lMID0gZmFsc2U7CiAgICB2YXIgdGltZSA9IGNoYW5uZWwubWV0aG9kLm1pY3JvU2Vjb25kcygpOwogICAgY2hhbm5lbC5tZXRob2Qub25NZXNzYWdlKGNoYW5uZWwuX3N0YXRlLCBudWxsLCB0aW1lKTsKICB9Cn0KX19uYW1lKF9zdG9wTGlzdGVuaW5nLCAiX3N0b3BMaXN0ZW5pbmciKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNvbW1zQDEuMC4zMC9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jb21tcy9kaXN0X3RzL2RlZXMtY29tbXMuY2xhc3Nlcy5kZWVzY29tbXMuanMKdmFyIEJyb2FkY2FzdENoYW5uZWw0ID0gZ2xvYmFsVGhpcy5Ccm9hZGNhc3RDaGFubmVsOwppZiAoIUJyb2FkY2FzdENoYW5uZWw0KSB7CiAgQnJvYWRjYXN0Q2hhbm5lbDQgPSBCcm9hZGNhc3RDaGFubmVsMjsKfQp2YXIgRGVlc0NvbW1zID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkRlZXNDb21tcyIpOwogIH0KICAvLyByZWNlaXZpbmcgbWVzc2FnZXMKICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMuYnJvYWRjYXN0Q2hhbm5lbCA9IG5ldyBCcm9hZGNhc3RDaGFubmVsNCgiZGVlcy1jb21tcyIpOwogICAgdGhpcy50eXBlZHJvdXRlciA9IG5ldyBkaXN0X3RzX2V4cG9ydHMxNS5UeXBlZFJvdXRlcigpOwogICAgdGhpcy50eXBlZHRhcmdldCA9IG5ldyBkaXN0X3RzX2V4cG9ydHMxNS5UeXBlZFRhcmdldCh7CiAgICAgIHBvc3RNZXRob2RXaXRoVHlwZWRSb3V0ZXI6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoYXN5bmMgKG1lc3NhZ2VBcmcpID0+IHsKICAgICAgICB0aGlzLnBvc3RNZXNzYWdlKG1lc3NhZ2VBcmcpOwogICAgICB9LCAicG9zdE1ldGhvZFdpdGhUeXBlZFJvdXRlciIpLAogICAgICB0eXBlZFJvdXRlclJlZjogdGhpcy50eXBlZHJvdXRlcgogICAgfSk7CiAgICB0aGlzLmJyb2FkY2FzdENoYW5uZWwub25tZXNzYWdlID0gYXN5bmMgKGV2ZW50QXJnKSA9PiB7CiAgICAgIGNvbnN0IG1lc3NhZ2UyID0gZXZlbnRBcmcubWV0aG9kID8gZXZlbnRBcmcgOiBldmVudEFyZy5kYXRhOwogICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShtZXNzYWdlMikpOwogICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMudHlwZWRyb3V0ZXIucm91dGVBbmRBZGRSZXNwb25zZShtZXNzYWdlMiwgeyBza2lwSG9va3M6IHRydWUgfSk7CiAgICAgIGlmIChyZXNwb25zZSAmJiAhcmVzcG9uc2UuZXJyb3IpIHsKICAgICAgICB0aGlzLnBvc3RNZXNzYWdlKHJlc3BvbnNlKTsKICAgICAgfSBlbHNlIHsKICAgICAgfQogICAgfTsKICB9CiAgLyoqCiAgICogY3JlYXRlcyBhIHR5cGVkcmVxdWVzdCB3aXRoIHRoaXMgY2xhc3NlcyBwb3N0TWVzc2FnZSBhcyBwb3N0TWV0aG9kCiAgICovCiAgY3JlYXRlVHlwZWRSZXF1ZXN0KG1ldGhvZE5hbWUpIHsKICAgIGNvbnN0IHR5cGVkcmVxdWVzdCA9IG5ldyBkaXN0X3RzX2V4cG9ydHMxNS5UeXBlZFJlcXVlc3QodGhpcy50eXBlZHRhcmdldCwgbWV0aG9kTmFtZSk7CiAgICByZXR1cm4gdHlwZWRyZXF1ZXN0OwogIH0KICAvKioKICAgKiBwb3N0cyBhIHR5cGVkcmVxdWVzdG1lc3NhZ2UKICAgKi8KICBhc3luYyBwb3N0TWVzc2FnZShtZXNzYWdlQXJnKSB7CiAgICB0aGlzLmJyb2FkY2FzdENoYW5uZWwucG9zdE1lc3NhZ2UobWVzc2FnZUFyZyk7CiAgfQogIC8qKgogICAqIHN1YnNjcmliZSB0byBtZXNzYWdlcwogICAqLwogIGFzeW5jIGNyZWF0ZVR5cGVkSGFuZGxlcihtZXRob2RBcmcsIGhhbmRsZXJGdW5jdGlvbikgewogICAgdGhpcy50eXBlZHJvdXRlci5hZGRUeXBlZEhhbmRsZXIobmV3IGRpc3RfdHNfZXhwb3J0czE1LlR5cGVkSGFuZGxlcihtZXRob2RBcmcsIGhhbmRsZXJGdW5jdGlvbikpOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydG1hcmtkb3duQDMuMC4zL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydG1hcmtkb3duL2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czE3ID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czE3LCB7CiAgU21hcnRNYXJrZG93bjogKCkgPT4gU21hcnRNYXJrZG93bgp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9iYWlsQDIuMC4yL25vZGVfbW9kdWxlcy9iYWlsL2luZGV4LmpzCmZ1bmN0aW9uIGJhaWwoZXJyb3IpIHsKICBpZiAoZXJyb3IpIHsKICAgIHRocm93IGVycm9yOwogIH0KfQpfX25hbWUoYmFpbCwgImJhaWwiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kZXZsb3BAMS4xLjAvbm9kZV9tb2R1bGVzL2RldmxvcC9saWIvZGVmYXVsdC5qcwpmdW5jdGlvbiBkZXByZWNhdGUoZm4pIHsKICByZXR1cm4gZm47Cn0KX19uYW1lKGRlcHJlY2F0ZSwgImRlcHJlY2F0ZSIpOwpmdW5jdGlvbiBlcXVhbCgpIHsKfQpfX25hbWUoZXF1YWwsICJlcXVhbCIpOwpmdW5jdGlvbiBvaygpIHsKfQpfX25hbWUob2ssICJvayIpOwpmdW5jdGlvbiB1bnJlYWNoYWJsZSgpIHsKfQpfX25hbWUodW5yZWFjaGFibGUsICJ1bnJlYWNoYWJsZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2lzLXBsYWluLW9iakA0LjEuMC9ub2RlX21vZHVsZXMvaXMtcGxhaW4tb2JqL2luZGV4LmpzCmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUyKSB7CiAgaWYgKHR5cGVvZiB2YWx1ZTIgIT09ICJvYmplY3QiIHx8IHZhbHVlMiA9PT0gbnVsbCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUyKTsKICByZXR1cm4gKHByb3RvdHlwZSA9PT0gbnVsbCB8fCBwcm90b3R5cGUgPT09IE9iamVjdC5wcm90b3R5cGUgfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSkgPT09IG51bGwpICYmICEoU3ltYm9sLnRvU3RyaW5nVGFnIGluIHZhbHVlMikgJiYgIShTeW1ib2wuaXRlcmF0b3IgaW4gdmFsdWUyKTsKfQpfX25hbWUoaXNQbGFpbk9iamVjdCwgImlzUGxhaW5PYmplY3QiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS90cm91Z2hAMi4yLjAvbm9kZV9tb2R1bGVzL3Ryb3VnaC9saWIvaW5kZXguanMKZnVuY3Rpb24gdHJvdWdoKCkgewogIGNvbnN0IGZucyA9IFtdOwogIGNvbnN0IHBpcGVsaW5lID0geyBydW4sIHVzZSB9OwogIHJldHVybiBwaXBlbGluZTsKICBmdW5jdGlvbiBydW4oLi4udmFsdWVzKSB7CiAgICBsZXQgbWlkZGxld2FyZUluZGV4ID0gLTE7CiAgICBjb25zdCBjYWxsYmFjayA9IHZhbHVlcy5wb3AoKTsKICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICJmdW5jdGlvbiIpIHsKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiRXhwZWN0ZWQgZnVuY3Rpb24gYXMgbGFzdCBhcmd1bWVudCwgbm90ICIgKyBjYWxsYmFjayk7CiAgICB9CiAgICBuZXh0MihudWxsLCAuLi52YWx1ZXMpOwogICAgZnVuY3Rpb24gbmV4dDIoZXJyb3IsIC4uLm91dHB1dCkgewogICAgICBjb25zdCBmbiA9IGZuc1srK21pZGRsZXdhcmVJbmRleF07CiAgICAgIGxldCBpbmRleDIgPSAtMTsKICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgY2FsbGJhY2soZXJyb3IpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB3aGlsZSAoKytpbmRleDIgPCB2YWx1ZXMubGVuZ3RoKSB7CiAgICAgICAgaWYgKG91dHB1dFtpbmRleDJdID09PSBudWxsIHx8IG91dHB1dFtpbmRleDJdID09PSB2b2lkIDApIHsKICAgICAgICAgIG91dHB1dFtpbmRleDJdID0gdmFsdWVzW2luZGV4Ml07CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhbHVlcyA9IG91dHB1dDsKICAgICAgaWYgKGZuKSB7CiAgICAgICAgd3JhcDIoZm4sIG5leHQyKSguLi5vdXRwdXQpOwogICAgICB9IGVsc2UgewogICAgICAgIGNhbGxiYWNrKG51bGwsIC4uLm91dHB1dCk7CiAgICAgIH0KICAgIH0KICAgIF9fbmFtZShuZXh0MiwgIm5leHQiKTsKICB9CiAgX19uYW1lKHJ1biwgInJ1biIpOwogIGZ1bmN0aW9uIHVzZShtaWRkZWx3YXJlKSB7CiAgICBpZiAodHlwZW9mIG1pZGRlbHdhcmUgIT09ICJmdW5jdGlvbiIpIHsKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigKICAgICAgICAiRXhwZWN0ZWQgYG1pZGRlbHdhcmVgIHRvIGJlIGEgZnVuY3Rpb24sIG5vdCAiICsgbWlkZGVsd2FyZQogICAgICApOwogICAgfQogICAgZm5zLnB1c2gobWlkZGVsd2FyZSk7CiAgICByZXR1cm4gcGlwZWxpbmU7CiAgfQogIF9fbmFtZSh1c2UsICJ1c2UiKTsKfQpfX25hbWUodHJvdWdoLCAidHJvdWdoIik7CmZ1bmN0aW9uIHdyYXAyKG1pZGRsZXdhcmUsIGNhbGxiYWNrKSB7CiAgbGV0IGNhbGxlZDsKICByZXR1cm4gd3JhcHBlZDsKICBmdW5jdGlvbiB3cmFwcGVkKC4uLnBhcmFtZXRlcnMpIHsKICAgIGNvbnN0IGZuRXhwZWN0c0NhbGxiYWNrID0gbWlkZGxld2FyZS5sZW5ndGggPiBwYXJhbWV0ZXJzLmxlbmd0aDsKICAgIGxldCByZXN1bHQ7CiAgICBpZiAoZm5FeHBlY3RzQ2FsbGJhY2spIHsKICAgICAgcGFyYW1ldGVycy5wdXNoKGRvbmUpOwogICAgfQogICAgdHJ5IHsKICAgICAgcmVzdWx0ID0gbWlkZGxld2FyZS5hcHBseSh0aGlzLCBwYXJhbWV0ZXJzKTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGNvbnN0IGV4Y2VwdGlvbiA9ICgKICAgICAgICAvKiogQHR5cGUge0Vycm9yfSAqLwogICAgICAgIGVycm9yCiAgICAgICk7CiAgICAgIGlmIChmbkV4cGVjdHNDYWxsYmFjayAmJiBjYWxsZWQpIHsKICAgICAgICB0aHJvdyBleGNlcHRpb247CiAgICAgIH0KICAgICAgcmV0dXJuIGRvbmUoZXhjZXB0aW9uKTsKICAgIH0KICAgIGlmICghZm5FeHBlY3RzQ2FsbGJhY2spIHsKICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQudGhlbiAmJiB0eXBlb2YgcmVzdWx0LnRoZW4gPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICByZXN1bHQudGhlbih0aGVuLCBkb25lKTsKICAgICAgfSBlbHNlIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikgewogICAgICAgIGRvbmUocmVzdWx0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGVuKHJlc3VsdCk7CiAgICAgIH0KICAgIH0KICB9CiAgX19uYW1lKHdyYXBwZWQsICJ3cmFwcGVkIik7CiAgZnVuY3Rpb24gZG9uZShlcnJvciwgLi4ub3V0cHV0KSB7CiAgICBpZiAoIWNhbGxlZCkgewogICAgICBjYWxsZWQgPSB0cnVlOwogICAgICBjYWxsYmFjayhlcnJvciwgLi4ub3V0cHV0KTsKICAgIH0KICB9CiAgX19uYW1lKGRvbmUsICJkb25lIik7CiAgZnVuY3Rpb24gdGhlbih2YWx1ZTIpIHsKICAgIGRvbmUobnVsbCwgdmFsdWUyKTsKICB9CiAgX19uYW1lKHRoZW4sICJ0aGVuIik7Cn0KX19uYW1lKHdyYXAyLCAid3JhcCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3VuaXN0LXV0aWwtc3RyaW5naWZ5LXBvc2l0aW9uQDQuMC4wL25vZGVfbW9kdWxlcy91bmlzdC11dGlsLXN0cmluZ2lmeS1wb3NpdGlvbi9saWIvaW5kZXguanMKZnVuY3Rpb24gc3RyaW5naWZ5UG9zaXRpb24odmFsdWUyKSB7CiAgaWYgKCF2YWx1ZTIgfHwgdHlwZW9mIHZhbHVlMiAhPT0gIm9iamVjdCIpIHsKICAgIHJldHVybiAiIjsKICB9CiAgaWYgKCJwb3NpdGlvbiIgaW4gdmFsdWUyIHx8ICJ0eXBlIiBpbiB2YWx1ZTIpIHsKICAgIHJldHVybiBwb3NpdGlvbih2YWx1ZTIucG9zaXRpb24pOwogIH0KICBpZiAoInN0YXJ0IiBpbiB2YWx1ZTIgfHwgImVuZCIgaW4gdmFsdWUyKSB7CiAgICByZXR1cm4gcG9zaXRpb24odmFsdWUyKTsKICB9CiAgaWYgKCJsaW5lIiBpbiB2YWx1ZTIgfHwgImNvbHVtbiIgaW4gdmFsdWUyKSB7CiAgICByZXR1cm4gcG9pbnQodmFsdWUyKTsKICB9CiAgcmV0dXJuICIiOwp9Cl9fbmFtZShzdHJpbmdpZnlQb3NpdGlvbiwgInN0cmluZ2lmeVBvc2l0aW9uIik7CmZ1bmN0aW9uIHBvaW50KHBvaW50NCkgewogIHJldHVybiBpbmRleChwb2ludDQgJiYgcG9pbnQ0LmxpbmUpICsgIjoiICsgaW5kZXgocG9pbnQ0ICYmIHBvaW50NC5jb2x1bW4pOwp9Cl9fbmFtZShwb2ludCwgInBvaW50Iik7CmZ1bmN0aW9uIHBvc2l0aW9uKHBvcykgewogIHJldHVybiBwb2ludChwb3MgJiYgcG9zLnN0YXJ0KSArICItIiArIHBvaW50KHBvcyAmJiBwb3MuZW5kKTsKfQpfX25hbWUocG9zaXRpb24sICJwb3NpdGlvbiIpOwpmdW5jdGlvbiBpbmRleCh2YWx1ZTIpIHsKICByZXR1cm4gdmFsdWUyICYmIHR5cGVvZiB2YWx1ZTIgPT09ICJudW1iZXIiID8gdmFsdWUyIDogMTsKfQpfX25hbWUoaW5kZXgsICJpbmRleCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3ZmaWxlLW1lc3NhZ2VANC4wLjMvbm9kZV9tb2R1bGVzL3ZmaWxlLW1lc3NhZ2UvbGliL2luZGV4LmpzCnZhciBWRmlsZU1lc3NhZ2UgPSBjbGFzcyBleHRlbmRzIEVycm9yIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJWRmlsZU1lc3NhZ2UiKTsKICB9CiAgLyoqCiAgICogQ3JlYXRlIGEgbWVzc2FnZSBmb3IgYHJlYXNvbmAuCiAgICoKICAgKiA+IPCfqqYgKipOb3RlKio6IGFsc28gaGFzIG9ic29sZXRlIHNpZ25hdHVyZXMuCiAgICoKICAgKiBAb3ZlcmxvYWQKICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uCiAgICogQHBhcmFtIHtPcHRpb25zIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29wdGlvbnNdCiAgICogQHJldHVybnMKICAgKgogICAqIEBvdmVybG9hZAogICAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24KICAgKiBAcGFyYW0ge05vZGUgfCBOb2RlTGlrZSB8IG51bGwgfCB1bmRlZmluZWR9IHBhcmVudAogICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgKiBAcmV0dXJucwogICAqCiAgICogQG92ZXJsb2FkCiAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbgogICAqIEBwYXJhbSB7UG9pbnQgfCBQb3NpdGlvbiB8IG51bGwgfCB1bmRlZmluZWR9IHBsYWNlCiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3JpZ2luXQogICAqIEByZXR1cm5zCiAgICoKICAgKiBAb3ZlcmxvYWQKICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uCiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3JpZ2luXQogICAqIEByZXR1cm5zCiAgICoKICAgKiBAb3ZlcmxvYWQKICAgKiBAcGFyYW0ge0Vycm9yIHwgVkZpbGVNZXNzYWdlfSBjYXVzZQogICAqIEBwYXJhbSB7Tm9kZSB8IE5vZGVMaWtlIHwgbnVsbCB8IHVuZGVmaW5lZH0gcGFyZW50CiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3JpZ2luXQogICAqIEByZXR1cm5zCiAgICoKICAgKiBAb3ZlcmxvYWQKICAgKiBAcGFyYW0ge0Vycm9yIHwgVkZpbGVNZXNzYWdlfSBjYXVzZQogICAqIEBwYXJhbSB7UG9pbnQgfCBQb3NpdGlvbiB8IG51bGwgfCB1bmRlZmluZWR9IHBsYWNlCiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3JpZ2luXQogICAqIEByZXR1cm5zCiAgICoKICAgKiBAb3ZlcmxvYWQKICAgKiBAcGFyYW0ge0Vycm9yIHwgVkZpbGVNZXNzYWdlfSBjYXVzZQogICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgKiBAcmV0dXJucwogICAqCiAgICogQHBhcmFtIHtFcnJvciB8IFZGaWxlTWVzc2FnZSB8IHN0cmluZ30gY2F1c2VPclJlYXNvbgogICAqICAgUmVhc29uIGZvciBtZXNzYWdlLCBzaG91bGQgdXNlIG1hcmtkb3duLgogICAqIEBwYXJhbSB7Tm9kZSB8IE5vZGVMaWtlIHwgT3B0aW9ucyB8IFBvaW50IHwgUG9zaXRpb24gfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3B0aW9uc09yUGFyZW50T3JQbGFjZV0KICAgKiAgIENvbmZpZ3VyYXRpb24gKG9wdGlvbmFsKS4KICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcmlnaW5dCiAgICogICBQbGFjZSBpbiBjb2RlIHdoZXJlIHRoZSBtZXNzYWdlIG9yaWdpbmF0ZXMgKGV4YW1wbGU6CiAgICogICBgJ215LXBhY2thZ2U6bXktcnVsZSdgIG9yIGAnbXktcnVsZSdgKS4KICAgKiBAcmV0dXJucwogICAqICAgSW5zdGFuY2Ugb2YgYFZGaWxlTWVzc2FnZWAuCiAgICovCiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHkKICBjb25zdHJ1Y3RvcihjYXVzZU9yUmVhc29uLCBvcHRpb25zT3JQYXJlbnRPclBsYWNlLCBvcmlnaW4pIHsKICAgIHN1cGVyKCk7CiAgICBpZiAodHlwZW9mIG9wdGlvbnNPclBhcmVudE9yUGxhY2UgPT09ICJzdHJpbmciKSB7CiAgICAgIG9yaWdpbiA9IG9wdGlvbnNPclBhcmVudE9yUGxhY2U7CiAgICAgIG9wdGlvbnNPclBhcmVudE9yUGxhY2UgPSB2b2lkIDA7CiAgICB9CiAgICBsZXQgcmVhc29uID0gIiI7CiAgICBsZXQgb3B0aW9ucyA9IHt9OwogICAgbGV0IGxlZ2FjeUNhdXNlID0gZmFsc2U7CiAgICBpZiAob3B0aW9uc09yUGFyZW50T3JQbGFjZSkgewogICAgICBpZiAoImxpbmUiIGluIG9wdGlvbnNPclBhcmVudE9yUGxhY2UgJiYgImNvbHVtbiIgaW4gb3B0aW9uc09yUGFyZW50T3JQbGFjZSkgewogICAgICAgIG9wdGlvbnMgPSB7IHBsYWNlOiBvcHRpb25zT3JQYXJlbnRPclBsYWNlIH07CiAgICAgIH0gZWxzZSBpZiAoInN0YXJ0IiBpbiBvcHRpb25zT3JQYXJlbnRPclBsYWNlICYmICJlbmQiIGluIG9wdGlvbnNPclBhcmVudE9yUGxhY2UpIHsKICAgICAgICBvcHRpb25zID0geyBwbGFjZTogb3B0aW9uc09yUGFyZW50T3JQbGFjZSB9OwogICAgICB9IGVsc2UgaWYgKCJ0eXBlIiBpbiBvcHRpb25zT3JQYXJlbnRPclBsYWNlKSB7CiAgICAgICAgb3B0aW9ucyA9IHsKICAgICAgICAgIGFuY2VzdG9yczogW29wdGlvbnNPclBhcmVudE9yUGxhY2VdLAogICAgICAgICAgcGxhY2U6IG9wdGlvbnNPclBhcmVudE9yUGxhY2UucG9zaXRpb24KICAgICAgICB9OwogICAgICB9IGVsc2UgewogICAgICAgIG9wdGlvbnMgPSB7IC4uLm9wdGlvbnNPclBhcmVudE9yUGxhY2UgfTsKICAgICAgfQogICAgfQogICAgaWYgKHR5cGVvZiBjYXVzZU9yUmVhc29uID09PSAic3RyaW5nIikgewogICAgICByZWFzb24gPSBjYXVzZU9yUmVhc29uOwogICAgfSBlbHNlIGlmICghb3B0aW9ucy5jYXVzZSAmJiBjYXVzZU9yUmVhc29uKSB7CiAgICAgIGxlZ2FjeUNhdXNlID0gdHJ1ZTsKICAgICAgcmVhc29uID0gY2F1c2VPclJlYXNvbi5tZXNzYWdlOwogICAgICBvcHRpb25zLmNhdXNlID0gY2F1c2VPclJlYXNvbjsKICAgIH0KICAgIGlmICghb3B0aW9ucy5ydWxlSWQgJiYgIW9wdGlvbnMuc291cmNlICYmIHR5cGVvZiBvcmlnaW4gPT09ICJzdHJpbmciKSB7CiAgICAgIGNvbnN0IGluZGV4MiA9IG9yaWdpbi5pbmRleE9mKCI6Iik7CiAgICAgIGlmIChpbmRleDIgPT09IC0xKSB7CiAgICAgICAgb3B0aW9ucy5ydWxlSWQgPSBvcmlnaW47CiAgICAgIH0gZWxzZSB7CiAgICAgICAgb3B0aW9ucy5zb3VyY2UgPSBvcmlnaW4uc2xpY2UoMCwgaW5kZXgyKTsKICAgICAgICBvcHRpb25zLnJ1bGVJZCA9IG9yaWdpbi5zbGljZShpbmRleDIgKyAxKTsKICAgICAgfQogICAgfQogICAgaWYgKCFvcHRpb25zLnBsYWNlICYmIG9wdGlvbnMuYW5jZXN0b3JzICYmIG9wdGlvbnMuYW5jZXN0b3JzKSB7CiAgICAgIGNvbnN0IHBhcmVudCA9IG9wdGlvbnMuYW5jZXN0b3JzW29wdGlvbnMuYW5jZXN0b3JzLmxlbmd0aCAtIDFdOwogICAgICBpZiAocGFyZW50KSB7CiAgICAgICAgb3B0aW9ucy5wbGFjZSA9IHBhcmVudC5wb3NpdGlvbjsKICAgICAgfQogICAgfQogICAgY29uc3Qgc3RhcnQgPSBvcHRpb25zLnBsYWNlICYmICJzdGFydCIgaW4gb3B0aW9ucy5wbGFjZSA/IG9wdGlvbnMucGxhY2Uuc3RhcnQgOiBvcHRpb25zLnBsYWNlOwogICAgdGhpcy5hbmNlc3RvcnMgPSBvcHRpb25zLmFuY2VzdG9ycyB8fCB2b2lkIDA7CiAgICB0aGlzLmNhdXNlID0gb3B0aW9ucy5jYXVzZSB8fCB2b2lkIDA7CiAgICB0aGlzLmNvbHVtbiA9IHN0YXJ0ID8gc3RhcnQuY29sdW1uIDogdm9pZCAwOwogICAgdGhpcy5mYXRhbCA9IHZvaWQgMDsKICAgIHRoaXMuZmlsZSA9ICIiOwogICAgdGhpcy5tZXNzYWdlID0gcmVhc29uOwogICAgdGhpcy5saW5lID0gc3RhcnQgPyBzdGFydC5saW5lIDogdm9pZCAwOwogICAgdGhpcy5uYW1lID0gc3RyaW5naWZ5UG9zaXRpb24ob3B0aW9ucy5wbGFjZSkgfHwgIjE6MSI7CiAgICB0aGlzLnBsYWNlID0gb3B0aW9ucy5wbGFjZSB8fCB2b2lkIDA7CiAgICB0aGlzLnJlYXNvbiA9IHRoaXMubWVzc2FnZTsKICAgIHRoaXMucnVsZUlkID0gb3B0aW9ucy5ydWxlSWQgfHwgdm9pZCAwOwogICAgdGhpcy5zb3VyY2UgPSBvcHRpb25zLnNvdXJjZSB8fCB2b2lkIDA7CiAgICB0aGlzLnN0YWNrID0gbGVnYWN5Q2F1c2UgJiYgb3B0aW9ucy5jYXVzZSAmJiB0eXBlb2Ygb3B0aW9ucy5jYXVzZS5zdGFjayA9PT0gInN0cmluZyIgPyBvcHRpb25zLmNhdXNlLnN0YWNrIDogIiI7CiAgICB0aGlzLmFjdHVhbCA9IHZvaWQgMDsKICAgIHRoaXMuZXhwZWN0ZWQgPSB2b2lkIDA7CiAgICB0aGlzLm5vdGUgPSB2b2lkIDA7CiAgICB0aGlzLnVybCA9IHZvaWQgMDsKICB9Cn07ClZGaWxlTWVzc2FnZS5wcm90b3R5cGUuZmlsZSA9ICIiOwpWRmlsZU1lc3NhZ2UucHJvdG90eXBlLm5hbWUgPSAiIjsKVkZpbGVNZXNzYWdlLnByb3RvdHlwZS5yZWFzb24gPSAiIjsKVkZpbGVNZXNzYWdlLnByb3RvdHlwZS5tZXNzYWdlID0gIiI7ClZGaWxlTWVzc2FnZS5wcm90b3R5cGUuc3RhY2sgPSAiIjsKVkZpbGVNZXNzYWdlLnByb3RvdHlwZS5jb2x1bW4gPSB2b2lkIDA7ClZGaWxlTWVzc2FnZS5wcm90b3R5cGUubGluZSA9IHZvaWQgMDsKVkZpbGVNZXNzYWdlLnByb3RvdHlwZS5hbmNlc3RvcnMgPSB2b2lkIDA7ClZGaWxlTWVzc2FnZS5wcm90b3R5cGUuY2F1c2UgPSB2b2lkIDA7ClZGaWxlTWVzc2FnZS5wcm90b3R5cGUuZmF0YWwgPSB2b2lkIDA7ClZGaWxlTWVzc2FnZS5wcm90b3R5cGUucGxhY2UgPSB2b2lkIDA7ClZGaWxlTWVzc2FnZS5wcm90b3R5cGUucnVsZUlkID0gdm9pZCAwOwpWRmlsZU1lc3NhZ2UucHJvdG90eXBlLnNvdXJjZSA9IHZvaWQgMDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS92ZmlsZUA2LjAuMy9ub2RlX21vZHVsZXMvdmZpbGUvbGliL21pbnBhdGguYnJvd3Nlci5qcwp2YXIgbWlucGF0aCA9IHsgYmFzZW5hbWUsIGRpcm5hbWUsIGV4dG5hbWUsIGpvaW4sIHNlcDogIi8iIH07CmZ1bmN0aW9uIGJhc2VuYW1lKHBhdGgyLCBleHRuYW1lMikgewogIGlmIChleHRuYW1lMiAhPT0gdm9pZCAwICYmIHR5cGVvZiBleHRuYW1lMiAhPT0gInN0cmluZyIpIHsKICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJyJleHQiIGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcnKTsKICB9CiAgYXNzZXJ0UGF0aChwYXRoMik7CiAgbGV0IHN0YXJ0ID0gMDsKICBsZXQgZW5kID0gLTE7CiAgbGV0IGluZGV4MiA9IHBhdGgyLmxlbmd0aDsKICBsZXQgc2Vlbk5vblNsYXNoOwogIGlmIChleHRuYW1lMiA9PT0gdm9pZCAwIHx8IGV4dG5hbWUyLmxlbmd0aCA9PT0gMCB8fCBleHRuYW1lMi5sZW5ndGggPiBwYXRoMi5sZW5ndGgpIHsKICAgIHdoaWxlIChpbmRleDItLSkgewogICAgICBpZiAocGF0aDIuY29kZVBvaW50QXQoaW5kZXgyKSA9PT0gNDcpIHsKICAgICAgICBpZiAoc2Vlbk5vblNsYXNoKSB7CiAgICAgICAgICBzdGFydCA9IGluZGV4MiArIDE7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZW5kIDwgMCkgewogICAgICAgIHNlZW5Ob25TbGFzaCA9IHRydWU7CiAgICAgICAgZW5kID0gaW5kZXgyICsgMTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGVuZCA8IDAgPyAiIiA6IHBhdGgyLnNsaWNlKHN0YXJ0LCBlbmQpOwogIH0KICBpZiAoZXh0bmFtZTIgPT09IHBhdGgyKSB7CiAgICByZXR1cm4gIiI7CiAgfQogIGxldCBmaXJzdE5vblNsYXNoRW5kID0gLTE7CiAgbGV0IGV4dG5hbWVJbmRleCA9IGV4dG5hbWUyLmxlbmd0aCAtIDE7CiAgd2hpbGUgKGluZGV4Mi0tKSB7CiAgICBpZiAocGF0aDIuY29kZVBvaW50QXQoaW5kZXgyKSA9PT0gNDcpIHsKICAgICAgaWYgKHNlZW5Ob25TbGFzaCkgewogICAgICAgIHN0YXJ0ID0gaW5kZXgyICsgMTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaWYgKGZpcnN0Tm9uU2xhc2hFbmQgPCAwKSB7CiAgICAgICAgc2Vlbk5vblNsYXNoID0gdHJ1ZTsKICAgICAgICBmaXJzdE5vblNsYXNoRW5kID0gaW5kZXgyICsgMTsKICAgICAgfQogICAgICBpZiAoZXh0bmFtZUluZGV4ID4gLTEpIHsKICAgICAgICBpZiAocGF0aDIuY29kZVBvaW50QXQoaW5kZXgyKSA9PT0gZXh0bmFtZTIuY29kZVBvaW50QXQoZXh0bmFtZUluZGV4LS0pKSB7CiAgICAgICAgICBpZiAoZXh0bmFtZUluZGV4IDwgMCkgewogICAgICAgICAgICBlbmQgPSBpbmRleDI7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGV4dG5hbWVJbmRleCA9IC0xOwogICAgICAgICAgZW5kID0gZmlyc3ROb25TbGFzaEVuZDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CiAgaWYgKHN0YXJ0ID09PSBlbmQpIHsKICAgIGVuZCA9IGZpcnN0Tm9uU2xhc2hFbmQ7CiAgfSBlbHNlIGlmIChlbmQgPCAwKSB7CiAgICBlbmQgPSBwYXRoMi5sZW5ndGg7CiAgfQogIHJldHVybiBwYXRoMi5zbGljZShzdGFydCwgZW5kKTsKfQpfX25hbWUoYmFzZW5hbWUsICJiYXNlbmFtZSIpOwpmdW5jdGlvbiBkaXJuYW1lKHBhdGgyKSB7CiAgYXNzZXJ0UGF0aChwYXRoMik7CiAgaWYgKHBhdGgyLmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuICIuIjsKICB9CiAgbGV0IGVuZCA9IC0xOwogIGxldCBpbmRleDIgPSBwYXRoMi5sZW5ndGg7CiAgbGV0IHVubWF0Y2hlZFNsYXNoOwogIHdoaWxlICgtLWluZGV4MikgewogICAgaWYgKHBhdGgyLmNvZGVQb2ludEF0KGluZGV4MikgPT09IDQ3KSB7CiAgICAgIGlmICh1bm1hdGNoZWRTbGFzaCkgewogICAgICAgIGVuZCA9IGluZGV4MjsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfSBlbHNlIGlmICghdW5tYXRjaGVkU2xhc2gpIHsKICAgICAgdW5tYXRjaGVkU2xhc2ggPSB0cnVlOwogICAgfQogIH0KICByZXR1cm4gZW5kIDwgMCA/IHBhdGgyLmNvZGVQb2ludEF0KDApID09PSA0NyA/ICIvIiA6ICIuIiA6IGVuZCA9PT0gMSAmJiBwYXRoMi5jb2RlUG9pbnRBdCgwKSA9PT0gNDcgPyAiLy8iIDogcGF0aDIuc2xpY2UoMCwgZW5kKTsKfQpfX25hbWUoZGlybmFtZSwgImRpcm5hbWUiKTsKZnVuY3Rpb24gZXh0bmFtZShwYXRoMikgewogIGFzc2VydFBhdGgocGF0aDIpOwogIGxldCBpbmRleDIgPSBwYXRoMi5sZW5ndGg7CiAgbGV0IGVuZCA9IC0xOwogIGxldCBzdGFydFBhcnQgPSAwOwogIGxldCBzdGFydERvdCA9IC0xOwogIGxldCBwcmVEb3RTdGF0ZSA9IDA7CiAgbGV0IHVubWF0Y2hlZFNsYXNoOwogIHdoaWxlIChpbmRleDItLSkgewogICAgY29uc3QgY29kZTQgPSBwYXRoMi5jb2RlUG9pbnRBdChpbmRleDIpOwogICAgaWYgKGNvZGU0ID09PSA0NykgewogICAgICBpZiAodW5tYXRjaGVkU2xhc2gpIHsKICAgICAgICBzdGFydFBhcnQgPSBpbmRleDIgKyAxOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgaWYgKGVuZCA8IDApIHsKICAgICAgdW5tYXRjaGVkU2xhc2ggPSB0cnVlOwogICAgICBlbmQgPSBpbmRleDIgKyAxOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA0NikgewogICAgICBpZiAoc3RhcnREb3QgPCAwKSB7CiAgICAgICAgc3RhcnREb3QgPSBpbmRleDI7CiAgICAgIH0gZWxzZSBpZiAocHJlRG90U3RhdGUgIT09IDEpIHsKICAgICAgICBwcmVEb3RTdGF0ZSA9IDE7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoc3RhcnREb3QgPiAtMSkgewogICAgICBwcmVEb3RTdGF0ZSA9IC0xOwogICAgfQogIH0KICBpZiAoc3RhcnREb3QgPCAwIHx8IGVuZCA8IDAgfHwgLy8gV2Ugc2F3IGEgbm9uLWRvdCBjaGFyYWN0ZXIgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBkb3QuCiAgcHJlRG90U3RhdGUgPT09IDAgfHwgLy8gVGhlIChyaWdodC1tb3N0KSB0cmltbWVkIHBhdGggY29tcG9uZW50IGlzIGV4YWN0bHkgYC4uYC4KICBwcmVEb3RTdGF0ZSA9PT0gMSAmJiBzdGFydERvdCA9PT0gZW5kIC0gMSAmJiBzdGFydERvdCA9PT0gc3RhcnRQYXJ0ICsgMSkgewogICAgcmV0dXJuICIiOwogIH0KICByZXR1cm4gcGF0aDIuc2xpY2Uoc3RhcnREb3QsIGVuZCk7Cn0KX19uYW1lKGV4dG5hbWUsICJleHRuYW1lIik7CmZ1bmN0aW9uIGpvaW4oLi4uc2VnbWVudHMpIHsKICBsZXQgaW5kZXgyID0gLTE7CiAgbGV0IGpvaW5lZDsKICB3aGlsZSAoKytpbmRleDIgPCBzZWdtZW50cy5sZW5ndGgpIHsKICAgIGFzc2VydFBhdGgoc2VnbWVudHNbaW5kZXgyXSk7CiAgICBpZiAoc2VnbWVudHNbaW5kZXgyXSkgewogICAgICBqb2luZWQgPSBqb2luZWQgPT09IHZvaWQgMCA/IHNlZ21lbnRzW2luZGV4Ml0gOiBqb2luZWQgKyAiLyIgKyBzZWdtZW50c1tpbmRleDJdOwogICAgfQogIH0KICByZXR1cm4gam9pbmVkID09PSB2b2lkIDAgPyAiLiIgOiBub3JtYWxpemUyKGpvaW5lZCk7Cn0KX19uYW1lKGpvaW4sICJqb2luIik7CmZ1bmN0aW9uIG5vcm1hbGl6ZTIocGF0aDIpIHsKICBhc3NlcnRQYXRoKHBhdGgyKTsKICBjb25zdCBhYnNvbHV0ZSA9IHBhdGgyLmNvZGVQb2ludEF0KDApID09PSA0NzsKICBsZXQgdmFsdWUyID0gbm9ybWFsaXplU3RyaW5nKHBhdGgyLCAhYWJzb2x1dGUpOwogIGlmICh2YWx1ZTIubGVuZ3RoID09PSAwICYmICFhYnNvbHV0ZSkgewogICAgdmFsdWUyID0gIi4iOwogIH0KICBpZiAodmFsdWUyLmxlbmd0aCA+IDAgJiYgcGF0aDIuY29kZVBvaW50QXQocGF0aDIubGVuZ3RoIC0gMSkgPT09IDQ3KSB7CiAgICB2YWx1ZTIgKz0gIi8iOwogIH0KICByZXR1cm4gYWJzb2x1dGUgPyAiLyIgKyB2YWx1ZTIgOiB2YWx1ZTI7Cn0KX19uYW1lKG5vcm1hbGl6ZTIsICJub3JtYWxpemUiKTsKZnVuY3Rpb24gbm9ybWFsaXplU3RyaW5nKHBhdGgyLCBhbGxvd0Fib3ZlUm9vdCkgewogIGxldCByZXN1bHQgPSAiIjsKICBsZXQgbGFzdFNlZ21lbnRMZW5ndGggPSAwOwogIGxldCBsYXN0U2xhc2ggPSAtMTsKICBsZXQgZG90cyA9IDA7CiAgbGV0IGluZGV4MiA9IC0xOwogIGxldCBjb2RlNDsKICBsZXQgbGFzdFNsYXNoSW5kZXg7CiAgd2hpbGUgKCsraW5kZXgyIDw9IHBhdGgyLmxlbmd0aCkgewogICAgaWYgKGluZGV4MiA8IHBhdGgyLmxlbmd0aCkgewogICAgICBjb2RlNCA9IHBhdGgyLmNvZGVQb2ludEF0KGluZGV4Mik7CiAgICB9IGVsc2UgaWYgKGNvZGU0ID09PSA0NykgewogICAgICBicmVhazsKICAgIH0gZWxzZSB7CiAgICAgIGNvZGU0ID0gNDc7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDQ3KSB7CiAgICAgIGlmIChsYXN0U2xhc2ggPT09IGluZGV4MiAtIDEgfHwgZG90cyA9PT0gMSkgewogICAgICB9IGVsc2UgaWYgKGxhc3RTbGFzaCAhPT0gaW5kZXgyIC0gMSAmJiBkb3RzID09PSAyKSB7CiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPCAyIHx8IGxhc3RTZWdtZW50TGVuZ3RoICE9PSAyIHx8IHJlc3VsdC5jb2RlUG9pbnRBdChyZXN1bHQubGVuZ3RoIC0gMSkgIT09IDQ2IHx8IHJlc3VsdC5jb2RlUG9pbnRBdChyZXN1bHQubGVuZ3RoIC0gMikgIT09IDQ2KSB7CiAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IDIpIHsKICAgICAgICAgICAgbGFzdFNsYXNoSW5kZXggPSByZXN1bHQubGFzdEluZGV4T2YoIi8iKTsKICAgICAgICAgICAgaWYgKGxhc3RTbGFzaEluZGV4ICE9PSByZXN1bHQubGVuZ3RoIC0gMSkgewogICAgICAgICAgICAgIGlmIChsYXN0U2xhc2hJbmRleCA8IDApIHsKICAgICAgICAgICAgICAgIHJlc3VsdCA9ICIiOwogICAgICAgICAgICAgICAgbGFzdFNlZ21lbnRMZW5ndGggPSAwOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc2xpY2UoMCwgbGFzdFNsYXNoSW5kZXgpOwogICAgICAgICAgICAgICAgbGFzdFNlZ21lbnRMZW5ndGggPSByZXN1bHQubGVuZ3RoIC0gMSAtIHJlc3VsdC5sYXN0SW5kZXhPZigiLyIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBsYXN0U2xhc2ggPSBpbmRleDI7CiAgICAgICAgICAgICAgZG90cyA9IDA7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgcmVzdWx0ID0gIiI7CiAgICAgICAgICAgIGxhc3RTZWdtZW50TGVuZ3RoID0gMDsKICAgICAgICAgICAgbGFzdFNsYXNoID0gaW5kZXgyOwogICAgICAgICAgICBkb3RzID0gMDsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChhbGxvd0Fib3ZlUm9vdCkgewogICAgICAgICAgcmVzdWx0ID0gcmVzdWx0Lmxlbmd0aCA+IDAgPyByZXN1bHQgKyAiLy4uIiA6ICIuLiI7CiAgICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9IDI7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMCkgewogICAgICAgICAgcmVzdWx0ICs9ICIvIiArIHBhdGgyLnNsaWNlKGxhc3RTbGFzaCArIDEsIGluZGV4Mik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlc3VsdCA9IHBhdGgyLnNsaWNlKGxhc3RTbGFzaCArIDEsIGluZGV4Mik7CiAgICAgICAgfQogICAgICAgIGxhc3RTZWdtZW50TGVuZ3RoID0gaW5kZXgyIC0gbGFzdFNsYXNoIC0gMTsKICAgICAgfQogICAgICBsYXN0U2xhc2ggPSBpbmRleDI7CiAgICAgIGRvdHMgPSAwOwogICAgfSBlbHNlIGlmIChjb2RlNCA9PT0gNDYgJiYgZG90cyA+IC0xKSB7CiAgICAgIGRvdHMrKzsKICAgIH0gZWxzZSB7CiAgICAgIGRvdHMgPSAtMTsKICAgIH0KICB9CiAgcmV0dXJuIHJlc3VsdDsKfQpfX25hbWUobm9ybWFsaXplU3RyaW5nLCAibm9ybWFsaXplU3RyaW5nIik7CmZ1bmN0aW9uIGFzc2VydFBhdGgocGF0aDIpIHsKICBpZiAodHlwZW9mIHBhdGgyICE9PSAic3RyaW5nIikgewogICAgdGhyb3cgbmV3IFR5cGVFcnJvcigKICAgICAgIlBhdGggbXVzdCBiZSBhIHN0cmluZy4gUmVjZWl2ZWQgIiArIEpTT04uc3RyaW5naWZ5KHBhdGgyKQogICAgKTsKICB9Cn0KX19uYW1lKGFzc2VydFBhdGgsICJhc3NlcnRQYXRoIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vdmZpbGVANi4wLjMvbm9kZV9tb2R1bGVzL3ZmaWxlL2xpYi9taW5wcm9jLmJyb3dzZXIuanMKdmFyIG1pbnByb2MgPSB7IGN3ZCB9OwpmdW5jdGlvbiBjd2QoKSB7CiAgcmV0dXJuICIvIjsKfQpfX25hbWUoY3dkLCAiY3dkIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vdmZpbGVANi4wLjMvbm9kZV9tb2R1bGVzL3ZmaWxlL2xpYi9taW51cmwuc2hhcmVkLmpzCmZ1bmN0aW9uIGlzVXJsKGZpbGVVcmxPclBhdGgpIHsKICByZXR1cm4gQm9vbGVhbigKICAgIGZpbGVVcmxPclBhdGggIT09IG51bGwgJiYgdHlwZW9mIGZpbGVVcmxPclBhdGggPT09ICJvYmplY3QiICYmICJocmVmIiBpbiBmaWxlVXJsT3JQYXRoICYmIGZpbGVVcmxPclBhdGguaHJlZiAmJiAicHJvdG9jb2wiIGluIGZpbGVVcmxPclBhdGggJiYgZmlsZVVybE9yUGF0aC5wcm90b2NvbCAmJiAvLyBAdHMtZXhwZWN0LWVycm9yOiBpbmRleGluZyBpcyBmaW5lLgogICAgZmlsZVVybE9yUGF0aC5hdXRoID09PSB2b2lkIDAKICApOwp9Cl9fbmFtZShpc1VybCwgImlzVXJsIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vdmZpbGVANi4wLjMvbm9kZV9tb2R1bGVzL3ZmaWxlL2xpYi9taW51cmwuYnJvd3Nlci5qcwpmdW5jdGlvbiB1cmxUb1BhdGgocGF0aDIpIHsKICBpZiAodHlwZW9mIHBhdGgyID09PSAic3RyaW5nIikgewogICAgcGF0aDIgPSBuZXcgVVJMKHBhdGgyKTsKICB9IGVsc2UgaWYgKCFpc1VybChwYXRoMikpIHsKICAgIGNvbnN0IGVycm9yID0gbmV3IFR5cGVFcnJvcigKICAgICAgJ1RoZSAicGF0aCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIHN0cmluZyBvciBhbiBpbnN0YW5jZSBvZiBVUkwuIFJlY2VpdmVkIGAnICsgcGF0aDIgKyAiYCIKICAgICk7CiAgICBlcnJvci5jb2RlID0gIkVSUl9JTlZBTElEX0FSR19UWVBFIjsKICAgIHRocm93IGVycm9yOwogIH0KICBpZiAocGF0aDIucHJvdG9jb2wgIT09ICJmaWxlOiIpIHsKICAgIGNvbnN0IGVycm9yID0gbmV3IFR5cGVFcnJvcigiVGhlIFVSTCBtdXN0IGJlIG9mIHNjaGVtZSBmaWxlIik7CiAgICBlcnJvci5jb2RlID0gIkVSUl9JTlZBTElEX1VSTF9TQ0hFTUUiOwogICAgdGhyb3cgZXJyb3I7CiAgfQogIHJldHVybiBnZXRQYXRoRnJvbVVSTFBvc2l4KHBhdGgyKTsKfQpfX25hbWUodXJsVG9QYXRoLCAidXJsVG9QYXRoIik7CmZ1bmN0aW9uIGdldFBhdGhGcm9tVVJMUG9zaXgodXJsKSB7CiAgaWYgKHVybC5ob3N0bmFtZSAhPT0gIiIpIHsKICAgIGNvbnN0IGVycm9yID0gbmV3IFR5cGVFcnJvcigKICAgICAgJ0ZpbGUgVVJMIGhvc3QgbXVzdCBiZSAibG9jYWxob3N0IiBvciBlbXB0eSBvbiBkYXJ3aW4nCiAgICApOwogICAgZXJyb3IuY29kZSA9ICJFUlJfSU5WQUxJRF9GSUxFX1VSTF9IT1NUIjsKICAgIHRocm93IGVycm9yOwogIH0KICBjb25zdCBwYXRobmFtZSA9IHVybC5wYXRobmFtZTsKICBsZXQgaW5kZXgyID0gLTE7CiAgd2hpbGUgKCsraW5kZXgyIDwgcGF0aG5hbWUubGVuZ3RoKSB7CiAgICBpZiAocGF0aG5hbWUuY29kZVBvaW50QXQoaW5kZXgyKSA9PT0gMzcgJiYgcGF0aG5hbWUuY29kZVBvaW50QXQoaW5kZXgyICsgMSkgPT09IDUwKSB7CiAgICAgIGNvbnN0IHRoaXJkID0gcGF0aG5hbWUuY29kZVBvaW50QXQoaW5kZXgyICsgMik7CiAgICAgIGlmICh0aGlyZCA9PT0gNzAgfHwgdGhpcmQgPT09IDEwMikgewogICAgICAgIGNvbnN0IGVycm9yID0gbmV3IFR5cGVFcnJvcigKICAgICAgICAgICJGaWxlIFVSTCBwYXRoIG11c3Qgbm90IGluY2x1ZGUgZW5jb2RlZCAvIGNoYXJhY3RlcnMiCiAgICAgICAgKTsKICAgICAgICBlcnJvci5jb2RlID0gIkVSUl9JTlZBTElEX0ZJTEVfVVJMX1BBVEgiOwogICAgICAgIHRocm93IGVycm9yOwogICAgICB9CiAgICB9CiAgfQogIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQocGF0aG5hbWUpOwp9Cl9fbmFtZShnZXRQYXRoRnJvbVVSTFBvc2l4LCAiZ2V0UGF0aEZyb21VUkxQb3NpeCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3ZmaWxlQDYuMC4zL25vZGVfbW9kdWxlcy92ZmlsZS9saWIvaW5kZXguanMKdmFyIG9yZGVyID0gKAogIC8qKiBAdHlwZSB7Y29uc3R9ICovCiAgWwogICAgImhpc3RvcnkiLAogICAgInBhdGgiLAogICAgImJhc2VuYW1lIiwKICAgICJzdGVtIiwKICAgICJleHRuYW1lIiwKICAgICJkaXJuYW1lIgogIF0KKTsKdmFyIFZGaWxlID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlZGaWxlIik7CiAgfQogIC8qKgogICAqIENyZWF0ZSBhIG5ldyB2aXJ0dWFsIGZpbGUuCiAgICoKICAgKiBgb3B0aW9uc2AgaXMgdHJlYXRlZCBhczoKICAgKgogICAqICogICBgc3RyaW5nYCBvciBgVWludDhBcnJheWAg4oCUIGB7dmFsdWU6IG9wdGlvbnN9YAogICAqICogICBgVVJMYCDigJQgYHtwYXRoOiBvcHRpb25zfWAKICAgKiAqICAgYFZGaWxlYCDigJQgc2hhbGxvdyBjb3BpZXMgaXRzIGRhdGEgb3ZlciB0byB0aGUgbmV3IGZpbGUKICAgKiAqICAgYG9iamVjdGAg4oCUIGFsbCBmaWVsZHMgYXJlIHNoYWxsb3cgY29waWVkIG92ZXIgdG8gdGhlIG5ldyBmaWxlCiAgICoKICAgKiBQYXRoIHJlbGF0ZWQgZmllbGRzIGFyZSBzZXQgaW4gdGhlIGZvbGxvd2luZyBvcmRlciAobGVhc3Qgc3BlY2lmaWMgdG8KICAgKiBtb3N0IHNwZWNpZmljKTogYGhpc3RvcnlgLCBgcGF0aGAsIGBiYXNlbmFtZWAsIGBzdGVtYCwgYGV4dG5hbWVgLAogICAqIGBkaXJuYW1lYC4KICAgKgogICAqIFlvdSBjYW5ub3Qgc2V0IGBkaXJuYW1lYCBvciBgZXh0bmFtZWAgd2l0aG91dCBzZXR0aW5nIGVpdGhlciBgaGlzdG9yeWAsCiAgICogYHBhdGhgLCBgYmFzZW5hbWVgLCBvciBgc3RlbWAgdG9vLgogICAqCiAgICogQHBhcmFtIHtDb21wYXRpYmxlIHwgbnVsbCB8IHVuZGVmaW5lZH0gW3ZhbHVlXQogICAqICAgRmlsZSB2YWx1ZS4KICAgKiBAcmV0dXJucwogICAqICAgTmV3IGluc3RhbmNlLgogICAqLwogIGNvbnN0cnVjdG9yKHZhbHVlMikgewogICAgbGV0IG9wdGlvbnM7CiAgICBpZiAoIXZhbHVlMikgewogICAgICBvcHRpb25zID0ge307CiAgICB9IGVsc2UgaWYgKGlzVXJsKHZhbHVlMikpIHsKICAgICAgb3B0aW9ucyA9IHsgcGF0aDogdmFsdWUyIH07CiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZTIgPT09ICJzdHJpbmciIHx8IGlzVWludDhBcnJheTModmFsdWUyKSkgewogICAgICBvcHRpb25zID0geyB2YWx1ZTogdmFsdWUyIH07CiAgICB9IGVsc2UgewogICAgICBvcHRpb25zID0gdmFsdWUyOwogICAgfQogICAgdGhpcy5jd2QgPSAiY3dkIiBpbiBvcHRpb25zID8gIiIgOiBtaW5wcm9jLmN3ZCgpOwogICAgdGhpcy5kYXRhID0ge307CiAgICB0aGlzLmhpc3RvcnkgPSBbXTsKICAgIHRoaXMubWVzc2FnZXMgPSBbXTsKICAgIHRoaXMudmFsdWU7CiAgICB0aGlzLm1hcDsKICAgIHRoaXMucmVzdWx0OwogICAgdGhpcy5zdG9yZWQ7CiAgICBsZXQgaW5kZXgyID0gLTE7CiAgICB3aGlsZSAoKytpbmRleDIgPCBvcmRlci5sZW5ndGgpIHsKICAgICAgY29uc3QgZmllbGQyID0gb3JkZXJbaW5kZXgyXTsKICAgICAgaWYgKGZpZWxkMiBpbiBvcHRpb25zICYmIG9wdGlvbnNbZmllbGQyXSAhPT0gdm9pZCAwICYmIG9wdGlvbnNbZmllbGQyXSAhPT0gbnVsbCkgewogICAgICAgIHRoaXNbZmllbGQyXSA9IGZpZWxkMiA9PT0gImhpc3RvcnkiID8gWy4uLm9wdGlvbnNbZmllbGQyXV0gOiBvcHRpb25zW2ZpZWxkMl07CiAgICAgIH0KICAgIH0KICAgIGxldCBmaWVsZDsKICAgIGZvciAoZmllbGQgaW4gb3B0aW9ucykgewogICAgICBpZiAoIW9yZGVyLmluY2x1ZGVzKGZpZWxkKSkgewogICAgICAgIHRoaXNbZmllbGRdID0gb3B0aW9uc1tmaWVsZF07CiAgICAgIH0KICAgIH0KICB9CiAgLyoqCiAgICogR2V0IHRoZSBiYXNlbmFtZSAoaW5jbHVkaW5nIGV4dG5hbWUpIChleGFtcGxlOiBgJ2luZGV4Lm1pbi5qcydgKS4KICAgKgogICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9CiAgICogICBCYXNlbmFtZS4KICAgKi8KICBnZXQgYmFzZW5hbWUoKSB7CiAgICByZXR1cm4gdHlwZW9mIHRoaXMucGF0aCA9PT0gInN0cmluZyIgPyBtaW5wYXRoLmJhc2VuYW1lKHRoaXMucGF0aCkgOiB2b2lkIDA7CiAgfQogIC8qKgogICAqIFNldCBiYXNlbmFtZSAoaW5jbHVkaW5nIGV4dG5hbWUpIChgJ2luZGV4Lm1pbi5qcydgKS4KICAgKgogICAqIENhbm5vdCBjb250YWluIHBhdGggc2VwYXJhdG9ycyAoYCcvJ2Agb24gdW5peCwgbWFjT1MsIGFuZCBicm93c2VycywgYCdcJ2AKICAgKiBvbiB3aW5kb3dzKS4KICAgKiBDYW5ub3QgYmUgbnVsbGlmaWVkICh1c2UgYGZpbGUucGF0aCA9IGZpbGUuZGlybmFtZWAgaW5zdGVhZCkuCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZW5hbWUKICAgKiAgIEJhc2VuYW1lLgogICAqIEByZXR1cm5zIHt1bmRlZmluZWR9CiAgICogICBOb3RoaW5nLgogICAqLwogIHNldCBiYXNlbmFtZShiYXNlbmFtZTIpIHsKICAgIGFzc2VydE5vbkVtcHR5KGJhc2VuYW1lMiwgImJhc2VuYW1lIik7CiAgICBhc3NlcnRQYXJ0KGJhc2VuYW1lMiwgImJhc2VuYW1lIik7CiAgICB0aGlzLnBhdGggPSBtaW5wYXRoLmpvaW4odGhpcy5kaXJuYW1lIHx8ICIiLCBiYXNlbmFtZTIpOwogIH0KICAvKioKICAgKiBHZXQgdGhlIHBhcmVudCBwYXRoIChleGFtcGxlOiBgJ34nYCkuCiAgICoKICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfQogICAqICAgRGlybmFtZS4KICAgKi8KICBnZXQgZGlybmFtZSgpIHsKICAgIHJldHVybiB0eXBlb2YgdGhpcy5wYXRoID09PSAic3RyaW5nIiA/IG1pbnBhdGguZGlybmFtZSh0aGlzLnBhdGgpIDogdm9pZCAwOwogIH0KICAvKioKICAgKiBTZXQgdGhlIHBhcmVudCBwYXRoIChleGFtcGxlOiBgJ34nYCkuCiAgICoKICAgKiBDYW5ub3QgYmUgc2V0IGlmIHRoZXJl4oCZcyBubyBgcGF0aGAgeWV0LgogICAqCiAgICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IGRpcm5hbWUKICAgKiAgIERpcm5hbWUuCiAgICogQHJldHVybnMge3VuZGVmaW5lZH0KICAgKiAgIE5vdGhpbmcuCiAgICovCiAgc2V0IGRpcm5hbWUoZGlybmFtZTIpIHsKICAgIGFzc2VydFBhdGgyKHRoaXMuYmFzZW5hbWUsICJkaXJuYW1lIik7CiAgICB0aGlzLnBhdGggPSBtaW5wYXRoLmpvaW4oZGlybmFtZTIgfHwgIiIsIHRoaXMuYmFzZW5hbWUpOwogIH0KICAvKioKICAgKiBHZXQgdGhlIGV4dG5hbWUgKGluY2x1ZGluZyBkb3QpIChleGFtcGxlOiBgJy5qcydgKS4KICAgKgogICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9CiAgICogICBFeHRuYW1lLgogICAqLwogIGdldCBleHRuYW1lKCkgewogICAgcmV0dXJuIHR5cGVvZiB0aGlzLnBhdGggPT09ICJzdHJpbmciID8gbWlucGF0aC5leHRuYW1lKHRoaXMucGF0aCkgOiB2b2lkIDA7CiAgfQogIC8qKgogICAqIFNldCB0aGUgZXh0bmFtZSAoaW5jbHVkaW5nIGRvdCkgKGV4YW1wbGU6IGAnLmpzJ2ApLgogICAqCiAgICogQ2Fubm90IGNvbnRhaW4gcGF0aCBzZXBhcmF0b3JzIChgJy8nYCBvbiB1bml4LCBtYWNPUywgYW5kIGJyb3dzZXJzLCBgJ1wnYAogICAqIG9uIHdpbmRvd3MpLgogICAqIENhbm5vdCBiZSBzZXQgaWYgdGhlcmXigJlzIG5vIGBwYXRoYCB5ZXQuCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gZXh0bmFtZQogICAqICAgRXh0bmFtZS4KICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfQogICAqICAgTm90aGluZy4KICAgKi8KICBzZXQgZXh0bmFtZShleHRuYW1lMikgewogICAgYXNzZXJ0UGFydChleHRuYW1lMiwgImV4dG5hbWUiKTsKICAgIGFzc2VydFBhdGgyKHRoaXMuZGlybmFtZSwgImV4dG5hbWUiKTsKICAgIGlmIChleHRuYW1lMikgewogICAgICBpZiAoZXh0bmFtZTIuY29kZVBvaW50QXQoMCkgIT09IDQ2KSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJgZXh0bmFtZWAgbXVzdCBzdGFydCB3aXRoIGAuYCIpOwogICAgICB9CiAgICAgIGlmIChleHRuYW1lMi5pbmNsdWRlcygiLiIsIDEpKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJgZXh0bmFtZWAgY2Fubm90IGNvbnRhaW4gbXVsdGlwbGUgZG90cyIpOwogICAgICB9CiAgICB9CiAgICB0aGlzLnBhdGggPSBtaW5wYXRoLmpvaW4odGhpcy5kaXJuYW1lLCB0aGlzLnN0ZW0gKyAoZXh0bmFtZTIgfHwgIiIpKTsKICB9CiAgLyoqCiAgICogR2V0IHRoZSBmdWxsIHBhdGggKGV4YW1wbGU6IGAnfi9pbmRleC5taW4uanMnYCkuCiAgICoKICAgKiBAcmV0dXJucyB7c3RyaW5nfQogICAqICAgUGF0aC4KICAgKi8KICBnZXQgcGF0aCgpIHsKICAgIHJldHVybiB0aGlzLmhpc3RvcnlbdGhpcy5oaXN0b3J5Lmxlbmd0aCAtIDFdOwogIH0KICAvKioKICAgKiBTZXQgdGhlIGZ1bGwgcGF0aCAoZXhhbXBsZTogYCd+L2luZGV4Lm1pbi5qcydgKS4KICAgKgogICAqIENhbm5vdCBiZSBudWxsaWZpZWQuCiAgICogWW91IGNhbiBzZXQgYSBmaWxlIFVSTCAoYSBgVVJMYCBvYmplY3Qgd2l0aCBhIGBmaWxlOmAgcHJvdG9jb2wpIHdoaWNoIHdpbGwKICAgKiBiZSB0dXJuZWQgaW50byBhIHBhdGggd2l0aCBgdXJsLmZpbGVVUkxUb1BhdGhgLgogICAqCiAgICogQHBhcmFtIHtVUkwgfCBzdHJpbmd9IHBhdGgKICAgKiAgIFBhdGguCiAgICogQHJldHVybnMge3VuZGVmaW5lZH0KICAgKiAgIE5vdGhpbmcuCiAgICovCiAgc2V0IHBhdGgocGF0aDIpIHsKICAgIGlmIChpc1VybChwYXRoMikpIHsKICAgICAgcGF0aDIgPSB1cmxUb1BhdGgocGF0aDIpOwogICAgfQogICAgYXNzZXJ0Tm9uRW1wdHkocGF0aDIsICJwYXRoIik7CiAgICBpZiAodGhpcy5wYXRoICE9PSBwYXRoMikgewogICAgICB0aGlzLmhpc3RvcnkucHVzaChwYXRoMik7CiAgICB9CiAgfQogIC8qKgogICAqIEdldCB0aGUgc3RlbSAoYmFzZW5hbWUgdy9vIGV4dG5hbWUpIChleGFtcGxlOiBgJ2luZGV4Lm1pbidgKS4KICAgKgogICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9CiAgICogICBTdGVtLgogICAqLwogIGdldCBzdGVtKCkgewogICAgcmV0dXJuIHR5cGVvZiB0aGlzLnBhdGggPT09ICJzdHJpbmciID8gbWlucGF0aC5iYXNlbmFtZSh0aGlzLnBhdGgsIHRoaXMuZXh0bmFtZSkgOiB2b2lkIDA7CiAgfQogIC8qKgogICAqIFNldCB0aGUgc3RlbSAoYmFzZW5hbWUgdy9vIGV4dG5hbWUpIChleGFtcGxlOiBgJ2luZGV4Lm1pbidgKS4KICAgKgogICAqIENhbm5vdCBjb250YWluIHBhdGggc2VwYXJhdG9ycyAoYCcvJ2Agb24gdW5peCwgbWFjT1MsIGFuZCBicm93c2VycywgYCdcJ2AKICAgKiBvbiB3aW5kb3dzKS4KICAgKiBDYW5ub3QgYmUgbnVsbGlmaWVkICh1c2UgYGZpbGUucGF0aCA9IGZpbGUuZGlybmFtZWAgaW5zdGVhZCkuCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gc3RlbQogICAqICAgU3RlbS4KICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfQogICAqICAgTm90aGluZy4KICAgKi8KICBzZXQgc3RlbShzdGVtKSB7CiAgICBhc3NlcnROb25FbXB0eShzdGVtLCAic3RlbSIpOwogICAgYXNzZXJ0UGFydChzdGVtLCAic3RlbSIpOwogICAgdGhpcy5wYXRoID0gbWlucGF0aC5qb2luKHRoaXMuZGlybmFtZSB8fCAiIiwgc3RlbSArICh0aGlzLmV4dG5hbWUgfHwgIiIpKTsKICB9CiAgLy8gTm9ybWFsIHByb3RvdHlwYWwgbWV0aG9kcy4KICAvKioKICAgKiBDcmVhdGUgYSBmYXRhbCBtZXNzYWdlIGZvciBgcmVhc29uYCBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbGUuCiAgICoKICAgKiBUaGUgYGZhdGFsYCBmaWVsZCBvZiB0aGUgbWVzc2FnZSBpcyBzZXQgdG8gYHRydWVgIChlcnJvcjsgZmlsZSBub3QgdXNhYmxlKQogICAqIGFuZCB0aGUgYGZpbGVgIGZpZWxkIGlzIHNldCB0byB0aGUgY3VycmVudCBmaWxlIHBhdGguCiAgICogVGhlIG1lc3NhZ2UgaXMgYWRkZWQgdG8gdGhlIGBtZXNzYWdlc2AgZmllbGQgb24gYGZpbGVgLgogICAqCiAgICogPiDwn6qmICoqTm90ZSoqOiBhbHNvIGhhcyBvYnNvbGV0ZSBzaWduYXR1cmVzLgogICAqCiAgICogQG92ZXJsb2FkCiAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbgogICAqIEBwYXJhbSB7TWVzc2FnZU9wdGlvbnMgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3B0aW9uc10KICAgKiBAcmV0dXJucyB7bmV2ZXJ9CiAgICoKICAgKiBAb3ZlcmxvYWQKICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uCiAgICogQHBhcmFtIHtOb2RlIHwgTm9kZUxpa2UgfCBudWxsIHwgdW5kZWZpbmVkfSBwYXJlbnQKICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcmlnaW5dCiAgICogQHJldHVybnMge25ldmVyfQogICAqCiAgICogQG92ZXJsb2FkCiAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbgogICAqIEBwYXJhbSB7UG9pbnQgfCBQb3NpdGlvbiB8IG51bGwgfCB1bmRlZmluZWR9IHBsYWNlCiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3JpZ2luXQogICAqIEByZXR1cm5zIHtuZXZlcn0KICAgKgogICAqIEBvdmVybG9hZAogICAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24KICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcmlnaW5dCiAgICogQHJldHVybnMge25ldmVyfQogICAqCiAgICogQG92ZXJsb2FkCiAgICogQHBhcmFtIHtFcnJvciB8IFZGaWxlTWVzc2FnZX0gY2F1c2UKICAgKiBAcGFyYW0ge05vZGUgfCBOb2RlTGlrZSB8IG51bGwgfCB1bmRlZmluZWR9IHBhcmVudAogICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgKiBAcmV0dXJucyB7bmV2ZXJ9CiAgICoKICAgKiBAb3ZlcmxvYWQKICAgKiBAcGFyYW0ge0Vycm9yIHwgVkZpbGVNZXNzYWdlfSBjYXVzZQogICAqIEBwYXJhbSB7UG9pbnQgfCBQb3NpdGlvbiB8IG51bGwgfCB1bmRlZmluZWR9IHBsYWNlCiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3JpZ2luXQogICAqIEByZXR1cm5zIHtuZXZlcn0KICAgKgogICAqIEBvdmVybG9hZAogICAqIEBwYXJhbSB7RXJyb3IgfCBWRmlsZU1lc3NhZ2V9IGNhdXNlCiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3JpZ2luXQogICAqIEByZXR1cm5zIHtuZXZlcn0KICAgKgogICAqIEBwYXJhbSB7RXJyb3IgfCBWRmlsZU1lc3NhZ2UgfCBzdHJpbmd9IGNhdXNlT3JSZWFzb24KICAgKiAgIFJlYXNvbiBmb3IgbWVzc2FnZSwgc2hvdWxkIHVzZSBtYXJrZG93bi4KICAgKiBAcGFyYW0ge05vZGUgfCBOb2RlTGlrZSB8IE1lc3NhZ2VPcHRpb25zIHwgUG9pbnQgfCBQb3NpdGlvbiB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcHRpb25zT3JQYXJlbnRPclBsYWNlXQogICAqICAgQ29uZmlndXJhdGlvbiAob3B0aW9uYWwpLgogICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgKiAgIFBsYWNlIGluIGNvZGUgd2hlcmUgdGhlIG1lc3NhZ2Ugb3JpZ2luYXRlcyAoZXhhbXBsZToKICAgKiAgIGAnbXktcGFja2FnZTpteS1ydWxlJ2Agb3IgYCdteS1ydWxlJ2ApLgogICAqIEByZXR1cm5zIHtuZXZlcn0KICAgKiAgIE5ldmVyLgogICAqIEB0aHJvd3Mge1ZGaWxlTWVzc2FnZX0KICAgKiAgIE1lc3NhZ2UuCiAgICovCiAgZmFpbChjYXVzZU9yUmVhc29uLCBvcHRpb25zT3JQYXJlbnRPclBsYWNlLCBvcmlnaW4pIHsKICAgIGNvbnN0IG1lc3NhZ2UyID0gdGhpcy5tZXNzYWdlKGNhdXNlT3JSZWFzb24sIG9wdGlvbnNPclBhcmVudE9yUGxhY2UsIG9yaWdpbik7CiAgICBtZXNzYWdlMi5mYXRhbCA9IHRydWU7CiAgICB0aHJvdyBtZXNzYWdlMjsKICB9CiAgLyoqCiAgICogQ3JlYXRlIGFuIGluZm8gbWVzc2FnZSBmb3IgYHJlYXNvbmAgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaWxlLgogICAqCiAgICogVGhlIGBmYXRhbGAgZmllbGQgb2YgdGhlIG1lc3NhZ2UgaXMgc2V0IHRvIGB1bmRlZmluZWRgIChpbmZvOyBjaGFuZ2UKICAgKiBsaWtlbHkgbm90IG5lZWRlZCkgYW5kIHRoZSBgZmlsZWAgZmllbGQgaXMgc2V0IHRvIHRoZSBjdXJyZW50IGZpbGUgcGF0aC4KICAgKiBUaGUgbWVzc2FnZSBpcyBhZGRlZCB0byB0aGUgYG1lc3NhZ2VzYCBmaWVsZCBvbiBgZmlsZWAuCiAgICoKICAgKiA+IPCfqqYgKipOb3RlKio6IGFsc28gaGFzIG9ic29sZXRlIHNpZ25hdHVyZXMuCiAgICoKICAgKiBAb3ZlcmxvYWQKICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uCiAgICogQHBhcmFtIHtNZXNzYWdlT3B0aW9ucyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcHRpb25zXQogICAqIEByZXR1cm5zIHtWRmlsZU1lc3NhZ2V9CiAgICoKICAgKiBAb3ZlcmxvYWQKICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uCiAgICogQHBhcmFtIHtOb2RlIHwgTm9kZUxpa2UgfCBudWxsIHwgdW5kZWZpbmVkfSBwYXJlbnQKICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcmlnaW5dCiAgICogQHJldHVybnMge1ZGaWxlTWVzc2FnZX0KICAgKgogICAqIEBvdmVybG9hZAogICAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24KICAgKiBAcGFyYW0ge1BvaW50IHwgUG9zaXRpb24gfCBudWxsIHwgdW5kZWZpbmVkfSBwbGFjZQogICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgKiBAcmV0dXJucyB7VkZpbGVNZXNzYWdlfQogICAqCiAgICogQG92ZXJsb2FkCiAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbgogICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgKiBAcmV0dXJucyB7VkZpbGVNZXNzYWdlfQogICAqCiAgICogQG92ZXJsb2FkCiAgICogQHBhcmFtIHtFcnJvciB8IFZGaWxlTWVzc2FnZX0gY2F1c2UKICAgKiBAcGFyYW0ge05vZGUgfCBOb2RlTGlrZSB8IG51bGwgfCB1bmRlZmluZWR9IHBhcmVudAogICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgKiBAcmV0dXJucyB7VkZpbGVNZXNzYWdlfQogICAqCiAgICogQG92ZXJsb2FkCiAgICogQHBhcmFtIHtFcnJvciB8IFZGaWxlTWVzc2FnZX0gY2F1c2UKICAgKiBAcGFyYW0ge1BvaW50IHwgUG9zaXRpb24gfCBudWxsIHwgdW5kZWZpbmVkfSBwbGFjZQogICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgKiBAcmV0dXJucyB7VkZpbGVNZXNzYWdlfQogICAqCiAgICogQG92ZXJsb2FkCiAgICogQHBhcmFtIHtFcnJvciB8IFZGaWxlTWVzc2FnZX0gY2F1c2UKICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcmlnaW5dCiAgICogQHJldHVybnMge1ZGaWxlTWVzc2FnZX0KICAgKgogICAqIEBwYXJhbSB7RXJyb3IgfCBWRmlsZU1lc3NhZ2UgfCBzdHJpbmd9IGNhdXNlT3JSZWFzb24KICAgKiAgIFJlYXNvbiBmb3IgbWVzc2FnZSwgc2hvdWxkIHVzZSBtYXJrZG93bi4KICAgKiBAcGFyYW0ge05vZGUgfCBOb2RlTGlrZSB8IE1lc3NhZ2VPcHRpb25zIHwgUG9pbnQgfCBQb3NpdGlvbiB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcHRpb25zT3JQYXJlbnRPclBsYWNlXQogICAqICAgQ29uZmlndXJhdGlvbiAob3B0aW9uYWwpLgogICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgKiAgIFBsYWNlIGluIGNvZGUgd2hlcmUgdGhlIG1lc3NhZ2Ugb3JpZ2luYXRlcyAoZXhhbXBsZToKICAgKiAgIGAnbXktcGFja2FnZTpteS1ydWxlJ2Agb3IgYCdteS1ydWxlJ2ApLgogICAqIEByZXR1cm5zIHtWRmlsZU1lc3NhZ2V9CiAgICogICBNZXNzYWdlLgogICAqLwogIGluZm8oY2F1c2VPclJlYXNvbiwgb3B0aW9uc09yUGFyZW50T3JQbGFjZSwgb3JpZ2luKSB7CiAgICBjb25zdCBtZXNzYWdlMiA9IHRoaXMubWVzc2FnZShjYXVzZU9yUmVhc29uLCBvcHRpb25zT3JQYXJlbnRPclBsYWNlLCBvcmlnaW4pOwogICAgbWVzc2FnZTIuZmF0YWwgPSB2b2lkIDA7CiAgICByZXR1cm4gbWVzc2FnZTI7CiAgfQogIC8qKgogICAqIENyZWF0ZSBhIG1lc3NhZ2UgZm9yIGByZWFzb25gIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZS4KICAgKgogICAqIFRoZSBgZmF0YWxgIGZpZWxkIG9mIHRoZSBtZXNzYWdlIGlzIHNldCB0byBgZmFsc2VgICh3YXJuaW5nOyBjaGFuZ2UgbWF5IGJlCiAgICogbmVlZGVkKSBhbmQgdGhlIGBmaWxlYCBmaWVsZCBpcyBzZXQgdG8gdGhlIGN1cnJlbnQgZmlsZSBwYXRoLgogICAqIFRoZSBtZXNzYWdlIGlzIGFkZGVkIHRvIHRoZSBgbWVzc2FnZXNgIGZpZWxkIG9uIGBmaWxlYC4KICAgKgogICAqID4g8J+qpiAqKk5vdGUqKjogYWxzbyBoYXMgb2Jzb2xldGUgc2lnbmF0dXJlcy4KICAgKgogICAqIEBvdmVybG9hZAogICAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24KICAgKiBAcGFyYW0ge01lc3NhZ2VPcHRpb25zIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29wdGlvbnNdCiAgICogQHJldHVybnMge1ZGaWxlTWVzc2FnZX0KICAgKgogICAqIEBvdmVybG9hZAogICAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24KICAgKiBAcGFyYW0ge05vZGUgfCBOb2RlTGlrZSB8IG51bGwgfCB1bmRlZmluZWR9IHBhcmVudAogICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgKiBAcmV0dXJucyB7VkZpbGVNZXNzYWdlfQogICAqCiAgICogQG92ZXJsb2FkCiAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbgogICAqIEBwYXJhbSB7UG9pbnQgfCBQb3NpdGlvbiB8IG51bGwgfCB1bmRlZmluZWR9IHBsYWNlCiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3JpZ2luXQogICAqIEByZXR1cm5zIHtWRmlsZU1lc3NhZ2V9CiAgICoKICAgKiBAb3ZlcmxvYWQKICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uCiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3JpZ2luXQogICAqIEByZXR1cm5zIHtWRmlsZU1lc3NhZ2V9CiAgICoKICAgKiBAb3ZlcmxvYWQKICAgKiBAcGFyYW0ge0Vycm9yIHwgVkZpbGVNZXNzYWdlfSBjYXVzZQogICAqIEBwYXJhbSB7Tm9kZSB8IE5vZGVMaWtlIHwgbnVsbCB8IHVuZGVmaW5lZH0gcGFyZW50CiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3JpZ2luXQogICAqIEByZXR1cm5zIHtWRmlsZU1lc3NhZ2V9CiAgICoKICAgKiBAb3ZlcmxvYWQKICAgKiBAcGFyYW0ge0Vycm9yIHwgVkZpbGVNZXNzYWdlfSBjYXVzZQogICAqIEBwYXJhbSB7UG9pbnQgfCBQb3NpdGlvbiB8IG51bGwgfCB1bmRlZmluZWR9IHBsYWNlCiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3JpZ2luXQogICAqIEByZXR1cm5zIHtWRmlsZU1lc3NhZ2V9CiAgICoKICAgKiBAb3ZlcmxvYWQKICAgKiBAcGFyYW0ge0Vycm9yIHwgVkZpbGVNZXNzYWdlfSBjYXVzZQogICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgKiBAcmV0dXJucyB7VkZpbGVNZXNzYWdlfQogICAqCiAgICogQHBhcmFtIHtFcnJvciB8IFZGaWxlTWVzc2FnZSB8IHN0cmluZ30gY2F1c2VPclJlYXNvbgogICAqICAgUmVhc29uIGZvciBtZXNzYWdlLCBzaG91bGQgdXNlIG1hcmtkb3duLgogICAqIEBwYXJhbSB7Tm9kZSB8IE5vZGVMaWtlIHwgTWVzc2FnZU9wdGlvbnMgfCBQb2ludCB8IFBvc2l0aW9uIHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29wdGlvbnNPclBhcmVudE9yUGxhY2VdCiAgICogICBDb25maWd1cmF0aW9uIChvcHRpb25hbCkuCiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3JpZ2luXQogICAqICAgUGxhY2UgaW4gY29kZSB3aGVyZSB0aGUgbWVzc2FnZSBvcmlnaW5hdGVzIChleGFtcGxlOgogICAqICAgYCdteS1wYWNrYWdlOm15LXJ1bGUnYCBvciBgJ215LXJ1bGUnYCkuCiAgICogQHJldHVybnMge1ZGaWxlTWVzc2FnZX0KICAgKiAgIE1lc3NhZ2UuCiAgICovCiAgbWVzc2FnZShjYXVzZU9yUmVhc29uLCBvcHRpb25zT3JQYXJlbnRPclBsYWNlLCBvcmlnaW4pIHsKICAgIGNvbnN0IG1lc3NhZ2UyID0gbmV3IFZGaWxlTWVzc2FnZSgKICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogdGhlIG92ZXJsb2FkcyBhcmUgZmluZS4KICAgICAgY2F1c2VPclJlYXNvbiwKICAgICAgb3B0aW9uc09yUGFyZW50T3JQbGFjZSwKICAgICAgb3JpZ2luCiAgICApOwogICAgaWYgKHRoaXMucGF0aCkgewogICAgICBtZXNzYWdlMi5uYW1lID0gdGhpcy5wYXRoICsgIjoiICsgbWVzc2FnZTIubmFtZTsKICAgICAgbWVzc2FnZTIuZmlsZSA9IHRoaXMucGF0aDsKICAgIH0KICAgIG1lc3NhZ2UyLmZhdGFsID0gZmFsc2U7CiAgICB0aGlzLm1lc3NhZ2VzLnB1c2gobWVzc2FnZTIpOwogICAgcmV0dXJuIG1lc3NhZ2UyOwogIH0KICAvKioKICAgKiBTZXJpYWxpemUgdGhlIGZpbGUuCiAgICoKICAgKiA+ICoqTm90ZSoqOiB3aGljaCBlbmNvZGluZ3MgYXJlIHN1cHBvcnRlZCBkZXBlbmRzIG9uIHRoZSBlbmdpbmUuCiAgICogPiBGb3IgaW5mbyBvbiBOb2RlLmpzLCBzZWU6CiAgICogPiA8aHR0cHM6Ly9ub2RlanMub3JnL2FwaS91dGlsLmh0bWwjd2hhdHdnLXN1cHBvcnRlZC1lbmNvZGluZ3M+LgogICAqCiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbZW5jb2Rpbmc9J3V0ZjgnXQogICAqICAgQ2hhcmFjdGVyIGVuY29kaW5nIHRvIHVuZGVyc3RhbmQgYHZhbHVlYCBhcyB3aGVuIGl04oCZcyBhIGBVaW50OEFycmF5YAogICAqICAgKGRlZmF1bHQ6IGAndXRmLTgnYCkuCiAgICogQHJldHVybnMge3N0cmluZ30KICAgKiAgIFNlcmlhbGl6ZWQgZmlsZS4KICAgKi8KICB0b1N0cmluZyhlbmNvZGluZykgewogICAgaWYgKHRoaXMudmFsdWUgPT09IHZvaWQgMCkgewogICAgICByZXR1cm4gIiI7CiAgICB9CiAgICBpZiAodHlwZW9mIHRoaXMudmFsdWUgPT09ICJzdHJpbmciKSB7CiAgICAgIHJldHVybiB0aGlzLnZhbHVlOwogICAgfQogICAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcihlbmNvZGluZyB8fCB2b2lkIDApOwogICAgcmV0dXJuIGRlY29kZXIuZGVjb2RlKHRoaXMudmFsdWUpOwogIH0KfTsKZnVuY3Rpb24gYXNzZXJ0UGFydChwYXJ0LCBuYW1lKSB7CiAgaWYgKHBhcnQgJiYgcGFydC5pbmNsdWRlcyhtaW5wYXRoLnNlcCkpIHsKICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgImAiICsgbmFtZSArICJgIGNhbm5vdCBiZSBhIHBhdGg6IGRpZCBub3QgZXhwZWN0IGAiICsgbWlucGF0aC5zZXAgKyAiYCIKICAgICk7CiAgfQp9Cl9fbmFtZShhc3NlcnRQYXJ0LCAiYXNzZXJ0UGFydCIpOwpmdW5jdGlvbiBhc3NlcnROb25FbXB0eShwYXJ0LCBuYW1lKSB7CiAgaWYgKCFwYXJ0KSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoImAiICsgbmFtZSArICJgIGNhbm5vdCBiZSBlbXB0eSIpOwogIH0KfQpfX25hbWUoYXNzZXJ0Tm9uRW1wdHksICJhc3NlcnROb25FbXB0eSIpOwpmdW5jdGlvbiBhc3NlcnRQYXRoMihwYXRoMiwgbmFtZSkgewogIGlmICghcGF0aDIpIHsKICAgIHRocm93IG5ldyBFcnJvcigiU2V0dGluZyBgIiArIG5hbWUgKyAiYCByZXF1aXJlcyBgcGF0aGAgdG8gYmUgc2V0IHRvbyIpOwogIH0KfQpfX25hbWUoYXNzZXJ0UGF0aDIsICJhc3NlcnRQYXRoIik7CmZ1bmN0aW9uIGlzVWludDhBcnJheTModmFsdWUyKSB7CiAgcmV0dXJuIEJvb2xlYW4oCiAgICB2YWx1ZTIgJiYgdHlwZW9mIHZhbHVlMiA9PT0gIm9iamVjdCIgJiYgImJ5dGVMZW5ndGgiIGluIHZhbHVlMiAmJiAiYnl0ZU9mZnNldCIgaW4gdmFsdWUyCiAgKTsKfQpfX25hbWUoaXNVaW50OEFycmF5MywgImlzVWludDhBcnJheSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3VuaWZpZWRAMTEuMC41L25vZGVfbW9kdWxlcy91bmlmaWVkL2xpYi9jYWxsYWJsZS1pbnN0YW5jZS5qcwp2YXIgQ2FsbGFibGVJbnN0YW5jZSA9ICgKICAvKioKICAgKiBAdHlwZSB7bmV3IDxQYXJhbWV0ZXJzIGV4dGVuZHMgQXJyYXk8dW5rbm93bj4sIFJlc3VsdD4ocHJvcGVydHk6IHN0cmluZyB8IHN5bWJvbCkgPT4gKC4uLnBhcmFtZXRlcnM6IFBhcmFtZXRlcnMpID0+IFJlc3VsdH0KICAgKi8KICAvKiogQHR5cGUge3Vua25vd259ICovCiAgLyoqCiAgICogQHRoaXMge0Z1bmN0aW9ufQogICAqIEBwYXJhbSB7c3RyaW5nIHwgc3ltYm9sfSBwcm9wZXJ0eQogICAqIEByZXR1cm5zIHsoLi4ucGFyYW1ldGVyczogQXJyYXk8dW5rbm93bj4pID0+IHVua25vd259CiAgICovCiAgLyogQF9fUFVSRV9fICovIF9fbmFtZSgoZnVuY3Rpb24ocHJvcGVydHkpIHsKICAgIGNvbnN0IHNlbGYyID0gdGhpczsKICAgIGNvbnN0IGNvbnN0ciA9IHNlbGYyLmNvbnN0cnVjdG9yOwogICAgY29uc3QgcHJvdG8gPSAoCiAgICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgRnVuY3Rpb24+fSAqLwogICAgICAvLyBQcm90b3R5cGVzIGRvIGV4aXN0LgogICAgICAvLyB0eXBlLWNvdmVyYWdlOmlnbm9yZS1uZXh0LWxpbmUKICAgICAgY29uc3RyLnByb3RvdHlwZQogICAgKTsKICAgIGNvbnN0IHZhbHVlMiA9IHByb3RvW3Byb3BlcnR5XTsKICAgIGNvbnN0IGFwcGx5ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHZhbHVlMi5hcHBseShhcHBseSwgYXJndW1lbnRzKTsKICAgIH0sICJhcHBseSIpOwogICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGFwcGx5LCBwcm90byk7CiAgICByZXR1cm4gYXBwbHk7CiAgfSksICJDYWxsYWJsZUluc3RhbmNlIikKKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS91bmlmaWVkQDExLjAuNS9ub2RlX21vZHVsZXMvdW5pZmllZC9saWIvaW5kZXguanMKdmFyIGltcG9ydF9leHRlbmQgPSBfX3RvRVNNKHJlcXVpcmVfZXh0ZW5kKCksIDEpOwp2YXIgb3duID0ge30uaGFzT3duUHJvcGVydHk7CnZhciBQcm9jZXNzb3IgPSBjbGFzcyBfUHJvY2Vzc29yIGV4dGVuZHMgQ2FsbGFibGVJbnN0YW5jZSB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiUHJvY2Vzc29yIik7CiAgfQogIC8qKgogICAqIENyZWF0ZSBhIHByb2Nlc3Nvci4KICAgKi8KICBjb25zdHJ1Y3RvcigpIHsKICAgIHN1cGVyKCJjb3B5Iik7CiAgICB0aGlzLkNvbXBpbGVyID0gdm9pZCAwOwogICAgdGhpcy5QYXJzZXIgPSB2b2lkIDA7CiAgICB0aGlzLmF0dGFjaGVycyA9IFtdOwogICAgdGhpcy5jb21waWxlciA9IHZvaWQgMDsKICAgIHRoaXMuZnJlZXplSW5kZXggPSAtMTsKICAgIHRoaXMuZnJvemVuID0gdm9pZCAwOwogICAgdGhpcy5uYW1lc3BhY2UgPSB7fTsKICAgIHRoaXMucGFyc2VyID0gdm9pZCAwOwogICAgdGhpcy50cmFuc2Zvcm1lcnMgPSB0cm91Z2goKTsKICB9CiAgLyoqCiAgICogQ29weSBhIHByb2Nlc3Nvci4KICAgKgogICAqIEBkZXByZWNhdGVkCiAgICogICBUaGlzIGlzIGEgcHJpdmF0ZSBpbnRlcm5hbCBtZXRob2QgYW5kIHNob3VsZCBub3QgYmUgdXNlZC4KICAgKiBAcmV0dXJucyB7UHJvY2Vzc29yPFBhcnNlVHJlZSwgSGVhZFRyZWUsIFRhaWxUcmVlLCBDb21waWxlVHJlZSwgQ29tcGlsZVJlc3VsdD59CiAgICogICBOZXcgKnVuZnJvemVuKiBwcm9jZXNzb3IgKHtAbGlua2NvZGUgUHJvY2Vzc29yfSkgdGhhdCBpcwogICAqICAgY29uZmlndXJlZCB0byB3b3JrIHRoZSBzYW1lIGFzIGl0cyBhbmNlc3Rvci4KICAgKiAgIFdoZW4gdGhlIGRlc2NlbmRhbnQgcHJvY2Vzc29yIGlzIGNvbmZpZ3VyZWQgaW4gdGhlIGZ1dHVyZSBpdCBkb2VzIG5vdAogICAqICAgYWZmZWN0IHRoZSBhbmNlc3RyYWwgcHJvY2Vzc29yLgogICAqLwogIGNvcHkoKSB7CiAgICBjb25zdCBkZXN0aW5hdGlvbiA9ICgKICAgICAgLyoqIEB0eXBlIHtQcm9jZXNzb3I8UGFyc2VUcmVlLCBIZWFkVHJlZSwgVGFpbFRyZWUsIENvbXBpbGVUcmVlLCBDb21waWxlUmVzdWx0Pn0gKi8KICAgICAgbmV3IF9Qcm9jZXNzb3IoKQogICAgKTsKICAgIGxldCBpbmRleDIgPSAtMTsKICAgIHdoaWxlICgrK2luZGV4MiA8IHRoaXMuYXR0YWNoZXJzLmxlbmd0aCkgewogICAgICBjb25zdCBhdHRhY2hlciA9IHRoaXMuYXR0YWNoZXJzW2luZGV4Ml07CiAgICAgIGRlc3RpbmF0aW9uLnVzZSguLi5hdHRhY2hlcik7CiAgICB9CiAgICBkZXN0aW5hdGlvbi5kYXRhKCgwLCBpbXBvcnRfZXh0ZW5kLmRlZmF1bHQpKHRydWUsIHt9LCB0aGlzLm5hbWVzcGFjZSkpOwogICAgcmV0dXJuIGRlc3RpbmF0aW9uOwogIH0KICAvKioKICAgKiBDb25maWd1cmUgdGhlIHByb2Nlc3NvciB3aXRoIGluZm8gYXZhaWxhYmxlIHRvIGFsbCBwbHVnaW5zLgogICAqIEluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbiBhbiBvYmplY3QuCiAgICoKICAgKiBUeXBpY2FsbHksIG9wdGlvbnMgY2FuIGJlIGdpdmVuIHRvIGEgc3BlY2lmaWMgcGx1Z2luLCBidXQgc29tZXRpbWVzIGl0CiAgICogbWFrZXMgc2Vuc2UgdG8gaGF2ZSBpbmZvcm1hdGlvbiBzaGFyZWQgd2l0aCBzZXZlcmFsIHBsdWdpbnMuCiAgICogRm9yIGV4YW1wbGUsIGEgbGlzdCBvZiBIVE1MIGVsZW1lbnRzIHRoYXQgYXJlIHNlbGYtY2xvc2luZywgd2hpY2ggaXMKICAgKiBuZWVkZWQgZHVyaW5nIGFsbCBwaGFzZXMuCiAgICoKICAgKiA+ICoqTm90ZSoqOiBzZXR0aW5nIGluZm9ybWF0aW9uIGNhbm5vdCBvY2N1ciBvbiAqZnJvemVuKiBwcm9jZXNzb3JzLgogICAqID4gQ2FsbCB0aGUgcHJvY2Vzc29yIGZpcnN0IHRvIGNyZWF0ZSBhIG5ldyB1bmZyb3plbiBwcm9jZXNzb3IuCiAgICoKICAgKiA+ICoqTm90ZSoqOiB0byByZWdpc3RlciBjdXN0b20gZGF0YSBpbiBUeXBlU2NyaXB0LCBhdWdtZW50IHRoZQogICAqID4ge0BsaW5rY29kZSBEYXRhfSBpbnRlcmZhY2UuCiAgICoKICAgKiBAZXhhbXBsZQogICAqICAgVGhpcyBleGFtcGxlIHNob3cgaG93IHRvIGdldCBhbmQgc2V0IGluZm86CiAgICoKICAgKiAgIGBgYGpzCiAgICogICBpbXBvcnQge3VuaWZpZWR9IGZyb20gJ3VuaWZpZWQnCiAgICoKICAgKiAgIGNvbnN0IHByb2Nlc3NvciA9IHVuaWZpZWQoKS5kYXRhKCdhbHBoYScsICdicmF2bycpCiAgICoKICAgKiAgIHByb2Nlc3Nvci5kYXRhKCdhbHBoYScpIC8vID0+ICdicmF2bycKICAgKgogICAqICAgcHJvY2Vzc29yLmRhdGEoKSAvLyA9PiB7YWxwaGE6ICdicmF2byd9CiAgICoKICAgKiAgIHByb2Nlc3Nvci5kYXRhKHtjaGFybGllOiAnZGVsdGEnfSkKICAgKgogICAqICAgcHJvY2Vzc29yLmRhdGEoKSAvLyA9PiB7Y2hhcmxpZTogJ2RlbHRhJ30KICAgKiAgIGBgYAogICAqCiAgICogQHRlbXBsYXRlIHtrZXlvZiBEYXRhfSBLZXkKICAgKgogICAqIEBvdmVybG9hZAogICAqIEByZXR1cm5zIHtEYXRhfQogICAqCiAgICogQG92ZXJsb2FkCiAgICogQHBhcmFtIHtEYXRhfSBkYXRhc2V0CiAgICogQHJldHVybnMge1Byb2Nlc3NvcjxQYXJzZVRyZWUsIEhlYWRUcmVlLCBUYWlsVHJlZSwgQ29tcGlsZVRyZWUsIENvbXBpbGVSZXN1bHQ+fQogICAqCiAgICogQG92ZXJsb2FkCiAgICogQHBhcmFtIHtLZXl9IGtleQogICAqIEByZXR1cm5zIHtEYXRhW0tleV19CiAgICoKICAgKiBAb3ZlcmxvYWQKICAgKiBAcGFyYW0ge0tleX0ga2V5CiAgICogQHBhcmFtIHtEYXRhW0tleV19IHZhbHVlCiAgICogQHJldHVybnMge1Byb2Nlc3NvcjxQYXJzZVRyZWUsIEhlYWRUcmVlLCBUYWlsVHJlZSwgQ29tcGlsZVRyZWUsIENvbXBpbGVSZXN1bHQ+fQogICAqCiAgICogQHBhcmFtIHtEYXRhIHwgS2V5fSBba2V5XQogICAqICAgS2V5IHRvIGdldCBvciBzZXQsIG9yIGVudGlyZSBkYXRhc2V0IHRvIHNldCwgb3Igbm90aGluZyB0byBnZXQgdGhlCiAgICogICBlbnRpcmUgZGF0YXNldCAob3B0aW9uYWwpLgogICAqIEBwYXJhbSB7RGF0YVtLZXldfSBbdmFsdWVdCiAgICogICBWYWx1ZSB0byBzZXQgKG9wdGlvbmFsKS4KICAgKiBAcmV0dXJucyB7dW5rbm93bn0KICAgKiAgIFRoZSBjdXJyZW50IHByb2Nlc3NvciB3aGVuIHNldHRpbmcsIHRoZSB2YWx1ZSBhdCBga2V5YCB3aGVuIGdldHRpbmcsIG9yCiAgICogICB0aGUgZW50aXJlIGRhdGFzZXQgd2hlbiBnZXR0aW5nIHdpdGhvdXQga2V5LgogICAqLwogIGRhdGEoa2V5MiwgdmFsdWUyKSB7CiAgICBpZiAodHlwZW9mIGtleTIgPT09ICJzdHJpbmciKSB7CiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7CiAgICAgICAgYXNzZXJ0VW5mcm96ZW4oImRhdGEiLCB0aGlzLmZyb3plbik7CiAgICAgICAgdGhpcy5uYW1lc3BhY2Vba2V5Ml0gPSB2YWx1ZTI7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgICAgcmV0dXJuIG93bi5jYWxsKHRoaXMubmFtZXNwYWNlLCBrZXkyKSAmJiB0aGlzLm5hbWVzcGFjZVtrZXkyXSB8fCB2b2lkIDA7CiAgICB9CiAgICBpZiAoa2V5MikgewogICAgICBhc3NlcnRVbmZyb3plbigiZGF0YSIsIHRoaXMuZnJvemVuKTsKICAgICAgdGhpcy5uYW1lc3BhY2UgPSBrZXkyOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHJldHVybiB0aGlzLm5hbWVzcGFjZTsKICB9CiAgLyoqCiAgICogRnJlZXplIGEgcHJvY2Vzc29yLgogICAqCiAgICogRnJvemVuIHByb2Nlc3NvcnMgYXJlIG1lYW50IHRvIGJlIGV4dGVuZGVkIGFuZCBub3QgdG8gYmUgY29uZmlndXJlZAogICAqIGRpcmVjdGx5LgogICAqCiAgICogV2hlbiBhIHByb2Nlc3NvciBpcyBmcm96ZW4gaXQgY2Fubm90IGJlIHVuZnJvemVuLgogICAqIE5ldyBwcm9jZXNzb3JzIHdvcmtpbmcgdGhlIHNhbWUgd2F5IGNhbiBiZSBjcmVhdGVkIGJ5IGNhbGxpbmcgdGhlCiAgICogcHJvY2Vzc29yLgogICAqCiAgICogSXTigJlzIHBvc3NpYmxlIHRvIGZyZWV6ZSBwcm9jZXNzb3JzIGV4cGxpY2l0bHkgYnkgY2FsbGluZyBgLmZyZWV6ZSgpYC4KICAgKiBQcm9jZXNzb3JzIGZyZWV6ZSBhdXRvbWF0aWNhbGx5IHdoZW4gYC5wYXJzZSgpYCwgYC5ydW4oKWAsIGAucnVuU3luYygpYCwKICAgKiBgLnN0cmluZ2lmeSgpYCwgYC5wcm9jZXNzKClgLCBvciBgLnByb2Nlc3NTeW5jKClgIGFyZSBjYWxsZWQuCiAgICoKICAgKiBAcmV0dXJucyB7UHJvY2Vzc29yPFBhcnNlVHJlZSwgSGVhZFRyZWUsIFRhaWxUcmVlLCBDb21waWxlVHJlZSwgQ29tcGlsZVJlc3VsdD59CiAgICogICBUaGUgY3VycmVudCBwcm9jZXNzb3IuCiAgICovCiAgZnJlZXplKCkgewogICAgaWYgKHRoaXMuZnJvemVuKSB7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgY29uc3Qgc2VsZjIgPSAoCiAgICAgIC8qKiBAdHlwZSB7UHJvY2Vzc29yfSAqLwogICAgICAvKiogQHR5cGUge3Vua25vd259ICovCiAgICAgIHRoaXMKICAgICk7CiAgICB3aGlsZSAoKyt0aGlzLmZyZWV6ZUluZGV4IDwgdGhpcy5hdHRhY2hlcnMubGVuZ3RoKSB7CiAgICAgIGNvbnN0IFthdHRhY2hlciwgLi4ub3B0aW9uc10gPSB0aGlzLmF0dGFjaGVyc1t0aGlzLmZyZWV6ZUluZGV4XTsKICAgICAgaWYgKG9wdGlvbnNbMF0gPT09IGZhbHNlKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKG9wdGlvbnNbMF0gPT09IHRydWUpIHsKICAgICAgICBvcHRpb25zWzBdID0gdm9pZCAwOwogICAgICB9CiAgICAgIGNvbnN0IHRyYW5zZm9ybWVyID0gYXR0YWNoZXIuY2FsbChzZWxmMiwgLi4ub3B0aW9ucyk7CiAgICAgIGlmICh0eXBlb2YgdHJhbnNmb3JtZXIgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICB0aGlzLnRyYW5zZm9ybWVycy51c2UodHJhbnNmb3JtZXIpOwogICAgICB9CiAgICB9CiAgICB0aGlzLmZyb3plbiA9IHRydWU7CiAgICB0aGlzLmZyZWV6ZUluZGV4ID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIC8qKgogICAqIFBhcnNlIHRleHQgdG8gYSBzeW50YXggdHJlZS4KICAgKgogICAqID4gKipOb3RlKio6IGBwYXJzZWAgZnJlZXplcyB0aGUgcHJvY2Vzc29yIGlmIG5vdCBhbHJlYWR5ICpmcm96ZW4qLgogICAqCiAgICogPiAqKk5vdGUqKjogYHBhcnNlYCBwZXJmb3JtcyB0aGUgcGFyc2UgcGhhc2UsIG5vdCB0aGUgcnVuIHBoYXNlIG9yIG90aGVyCiAgICogPiBwaGFzZXMuCiAgICoKICAgKiBAcGFyYW0ge0NvbXBhdGlibGUgfCB1bmRlZmluZWR9IFtmaWxlXQogICAqICAgZmlsZSB0byBwYXJzZSAob3B0aW9uYWwpOyB0eXBpY2FsbHkgYHN0cmluZ2Agb3IgYFZGaWxlYDsgYW55IHZhbHVlCiAgICogICBhY2NlcHRlZCBhcyBgeGAgaW4gYG5ldyBWRmlsZSh4KWAuCiAgICogQHJldHVybnMge1BhcnNlVHJlZSBleHRlbmRzIHVuZGVmaW5lZCA/IE5vZGUgOiBQYXJzZVRyZWV9CiAgICogICBTeW50YXggdHJlZSByZXByZXNlbnRpbmcgYGZpbGVgLgogICAqLwogIHBhcnNlKGZpbGUpIHsKICAgIHRoaXMuZnJlZXplKCk7CiAgICBjb25zdCByZWFsRmlsZSA9IHZmaWxlKGZpbGUpOwogICAgY29uc3QgcGFyc2VyID0gdGhpcy5wYXJzZXIgfHwgdGhpcy5QYXJzZXI7CiAgICBhc3NlcnRQYXJzZXIoInBhcnNlIiwgcGFyc2VyKTsKICAgIHJldHVybiBwYXJzZXIoU3RyaW5nKHJlYWxGaWxlKSwgcmVhbEZpbGUpOwogIH0KICAvKioKICAgKiBQcm9jZXNzIHRoZSBnaXZlbiBmaWxlIGFzIGNvbmZpZ3VyZWQgb24gdGhlIHByb2Nlc3Nvci4KICAgKgogICAqID4gKipOb3RlKio6IGBwcm9jZXNzYCBmcmVlemVzIHRoZSBwcm9jZXNzb3IgaWYgbm90IGFscmVhZHkgKmZyb3plbiouCiAgICoKICAgKiA+ICoqTm90ZSoqOiBgcHJvY2Vzc2AgcGVyZm9ybXMgdGhlIHBhcnNlLCBydW4sIGFuZCBzdHJpbmdpZnkgcGhhc2VzLgogICAqCiAgICogQG92ZXJsb2FkCiAgICogQHBhcmFtIHtDb21wYXRpYmxlIHwgdW5kZWZpbmVkfSBmaWxlCiAgICogQHBhcmFtIHtQcm9jZXNzQ2FsbGJhY2s8VkZpbGVXaXRoT3V0cHV0PENvbXBpbGVSZXN1bHQ+Pn0gZG9uZQogICAqIEByZXR1cm5zIHt1bmRlZmluZWR9CiAgICoKICAgKiBAb3ZlcmxvYWQKICAgKiBAcGFyYW0ge0NvbXBhdGlibGUgfCB1bmRlZmluZWR9IFtmaWxlXQogICAqIEByZXR1cm5zIHtQcm9taXNlPFZGaWxlV2l0aE91dHB1dDxDb21waWxlUmVzdWx0Pj59CiAgICoKICAgKiBAcGFyYW0ge0NvbXBhdGlibGUgfCB1bmRlZmluZWR9IFtmaWxlXQogICAqICAgRmlsZSAob3B0aW9uYWwpOyB0eXBpY2FsbHkgYHN0cmluZ2Agb3IgYFZGaWxlYF07IGFueSB2YWx1ZSBhY2NlcHRlZCBhcwogICAqICAgYHhgIGluIGBuZXcgVkZpbGUoeClgLgogICAqIEBwYXJhbSB7UHJvY2Vzc0NhbGxiYWNrPFZGaWxlV2l0aE91dHB1dDxDb21waWxlUmVzdWx0Pj4gfCB1bmRlZmluZWR9IFtkb25lXQogICAqICAgQ2FsbGJhY2sgKG9wdGlvbmFsKS4KICAgKiBAcmV0dXJucyB7UHJvbWlzZTxWRmlsZT4gfCB1bmRlZmluZWR9CiAgICogICBOb3RoaW5nIGlmIGBkb25lYCBpcyBnaXZlbi4KICAgKiAgIE90aGVyd2lzZSBhIHByb21pc2UsIHJlamVjdGVkIHdpdGggYSBmYXRhbCBlcnJvciBvciByZXNvbHZlZCB3aXRoIHRoZQogICAqICAgcHJvY2Vzc2VkIGZpbGUuCiAgICoKICAgKiAgIFRoZSBwYXJzZWQsIHRyYW5zZm9ybWVkLCBhbmQgY29tcGlsZWQgdmFsdWUgaXMgYXZhaWxhYmxlIGF0CiAgICogICBgZmlsZS52YWx1ZWAgKHNlZSBub3RlKS4KICAgKgogICAqICAgPiAqKk5vdGUqKjogdW5pZmllZCB0eXBpY2FsbHkgY29tcGlsZXMgYnkgc2VyaWFsaXppbmc6IG1vc3QKICAgKiAgID4gY29tcGlsZXJzIHJldHVybiBgc3RyaW5nYCAob3IgYFVpbnQ4QXJyYXlgKS4KICAgKiAgID4gU29tZSBjb21waWxlcnMsIHN1Y2ggYXMgdGhlIG9uZSBjb25maWd1cmVkIHdpdGgKICAgKiAgID4gW2ByZWh5cGUtcmVhY3RgXVtyZWh5cGUtcmVhY3RdLCByZXR1cm4gb3RoZXIgdmFsdWVzIChpbiB0aGlzIGNhc2UsIGEKICAgKiAgID4gUmVhY3QgdHJlZSkuCiAgICogICA+IElmIHlvdeKAmXJlIHVzaW5nIGEgY29tcGlsZXIgdGhhdCBkb2VzbuKAmXQgc2VyaWFsaXplLCBleHBlY3QgZGlmZmVyZW50CiAgICogICA+IHJlc3VsdCB2YWx1ZXMuCiAgICogICA+CiAgICogICA+IFRvIHJlZ2lzdGVyIGN1c3RvbSByZXN1bHRzIGluIFR5cGVTY3JpcHQsIGFkZCB0aGVtIHRvCiAgICogICA+IHtAbGlua2NvZGUgQ29tcGlsZVJlc3VsdE1hcH0uCiAgICoKICAgKiAgIFtyZWh5cGUtcmVhY3RdOiBodHRwczovL2dpdGh1Yi5jb20vcmVoeXBlanMvcmVoeXBlLXJlYWN0CiAgICovCiAgcHJvY2VzcyhmaWxlLCBkb25lKSB7CiAgICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgICB0aGlzLmZyZWV6ZSgpOwogICAgYXNzZXJ0UGFyc2VyKCJwcm9jZXNzIiwgdGhpcy5wYXJzZXIgfHwgdGhpcy5QYXJzZXIpOwogICAgYXNzZXJ0Q29tcGlsZXIoInByb2Nlc3MiLCB0aGlzLmNvbXBpbGVyIHx8IHRoaXMuQ29tcGlsZXIpOwogICAgcmV0dXJuIGRvbmUgPyBleGVjdXRvcih2b2lkIDAsIGRvbmUpIDogbmV3IFByb21pc2UoZXhlY3V0b3IpOwogICAgZnVuY3Rpb24gZXhlY3V0b3IocmVzb2x2ZTIsIHJlamVjdCkgewogICAgICBjb25zdCByZWFsRmlsZSA9IHZmaWxlKGZpbGUpOwogICAgICBjb25zdCBwYXJzZVRyZWUgPSAoCiAgICAgICAgLyoqIEB0eXBlIHtIZWFkVHJlZSBleHRlbmRzIHVuZGVmaW5lZCA/IE5vZGUgOiBIZWFkVHJlZX0gKi8KICAgICAgICAvKiogQHR5cGUge3Vua25vd259ICovCiAgICAgICAgc2VsZjIucGFyc2UocmVhbEZpbGUpCiAgICAgICk7CiAgICAgIHNlbGYyLnJ1bihwYXJzZVRyZWUsIHJlYWxGaWxlLCBmdW5jdGlvbihlcnJvciwgdHJlZSwgZmlsZTIpIHsKICAgICAgICBpZiAoZXJyb3IgfHwgIXRyZWUgfHwgIWZpbGUyKSB7CiAgICAgICAgICByZXR1cm4gcmVhbERvbmUoZXJyb3IpOwogICAgICAgIH0KICAgICAgICBjb25zdCBjb21waWxlVHJlZSA9ICgKICAgICAgICAgIC8qKiBAdHlwZSB7Q29tcGlsZVRyZWUgZXh0ZW5kcyB1bmRlZmluZWQgPyBOb2RlIDogQ29tcGlsZVRyZWV9ICovCiAgICAgICAgICAvKiogQHR5cGUge3Vua25vd259ICovCiAgICAgICAgICB0cmVlCiAgICAgICAgKTsKICAgICAgICBjb25zdCBjb21waWxlUmVzdWx0ID0gc2VsZjIuc3RyaW5naWZ5KGNvbXBpbGVUcmVlLCBmaWxlMik7CiAgICAgICAgaWYgKGxvb2tzTGlrZUFWYWx1ZShjb21waWxlUmVzdWx0KSkgewogICAgICAgICAgZmlsZTIudmFsdWUgPSBjb21waWxlUmVzdWx0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBmaWxlMi5yZXN1bHQgPSBjb21waWxlUmVzdWx0OwogICAgICAgIH0KICAgICAgICByZWFsRG9uZSgKICAgICAgICAgIGVycm9yLAogICAgICAgICAgLyoqIEB0eXBlIHtWRmlsZVdpdGhPdXRwdXQ8Q29tcGlsZVJlc3VsdD59ICovCiAgICAgICAgICBmaWxlMgogICAgICAgICk7CiAgICAgIH0pOwogICAgICBmdW5jdGlvbiByZWFsRG9uZShlcnJvciwgZmlsZTIpIHsKICAgICAgICBpZiAoZXJyb3IgfHwgIWZpbGUyKSB7CiAgICAgICAgICByZWplY3QoZXJyb3IpOwogICAgICAgIH0gZWxzZSBpZiAocmVzb2x2ZTIpIHsKICAgICAgICAgIHJlc29sdmUyKGZpbGUyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgb2soZG9uZSwgImBkb25lYCBpcyBkZWZpbmVkIGlmIGByZXNvbHZlYCBpcyBub3QiKTsKICAgICAgICAgIGRvbmUodm9pZCAwLCBmaWxlMik7CiAgICAgICAgfQogICAgICB9CiAgICAgIF9fbmFtZShyZWFsRG9uZSwgInJlYWxEb25lIik7CiAgICB9CiAgICBfX25hbWUoZXhlY3V0b3IsICJleGVjdXRvciIpOwogIH0KICAvKioKICAgKiBQcm9jZXNzIHRoZSBnaXZlbiBmaWxlIGFzIGNvbmZpZ3VyZWQgb24gdGhlIHByb2Nlc3Nvci4KICAgKgogICAqIEFuIGVycm9yIGlzIHRocm93biBpZiBhc3luY2hyb25vdXMgdHJhbnNmb3JtcyBhcmUgY29uZmlndXJlZC4KICAgKgogICAqID4gKipOb3RlKio6IGBwcm9jZXNzU3luY2AgZnJlZXplcyB0aGUgcHJvY2Vzc29yIGlmIG5vdCBhbHJlYWR5ICpmcm96ZW4qLgogICAqCiAgICogPiAqKk5vdGUqKjogYHByb2Nlc3NTeW5jYCBwZXJmb3JtcyB0aGUgcGFyc2UsIHJ1biwgYW5kIHN0cmluZ2lmeSBwaGFzZXMuCiAgICoKICAgKiBAcGFyYW0ge0NvbXBhdGlibGUgfCB1bmRlZmluZWR9IFtmaWxlXQogICAqICAgRmlsZSAob3B0aW9uYWwpOyB0eXBpY2FsbHkgYHN0cmluZ2Agb3IgYFZGaWxlYDsgYW55IHZhbHVlIGFjY2VwdGVkIGFzCiAgICogICBgeGAgaW4gYG5ldyBWRmlsZSh4KWAuCiAgICogQHJldHVybnMge1ZGaWxlV2l0aE91dHB1dDxDb21waWxlUmVzdWx0Pn0KICAgKiAgIFRoZSBwcm9jZXNzZWQgZmlsZS4KICAgKgogICAqICAgVGhlIHBhcnNlZCwgdHJhbnNmb3JtZWQsIGFuZCBjb21waWxlZCB2YWx1ZSBpcyBhdmFpbGFibGUgYXQKICAgKiAgIGBmaWxlLnZhbHVlYCAoc2VlIG5vdGUpLgogICAqCiAgICogICA+ICoqTm90ZSoqOiB1bmlmaWVkIHR5cGljYWxseSBjb21waWxlcyBieSBzZXJpYWxpemluZzogbW9zdAogICAqICAgPiBjb21waWxlcnMgcmV0dXJuIGBzdHJpbmdgIChvciBgVWludDhBcnJheWApLgogICAqICAgPiBTb21lIGNvbXBpbGVycywgc3VjaCBhcyB0aGUgb25lIGNvbmZpZ3VyZWQgd2l0aAogICAqICAgPiBbYHJlaHlwZS1yZWFjdGBdW3JlaHlwZS1yZWFjdF0sIHJldHVybiBvdGhlciB2YWx1ZXMgKGluIHRoaXMgY2FzZSwgYQogICAqICAgPiBSZWFjdCB0cmVlKS4KICAgKiAgID4gSWYgeW914oCZcmUgdXNpbmcgYSBjb21waWxlciB0aGF0IGRvZXNu4oCZdCBzZXJpYWxpemUsIGV4cGVjdCBkaWZmZXJlbnQKICAgKiAgID4gcmVzdWx0IHZhbHVlcy4KICAgKiAgID4KICAgKiAgID4gVG8gcmVnaXN0ZXIgY3VzdG9tIHJlc3VsdHMgaW4gVHlwZVNjcmlwdCwgYWRkIHRoZW0gdG8KICAgKiAgID4ge0BsaW5rY29kZSBDb21waWxlUmVzdWx0TWFwfS4KICAgKgogICAqICAgW3JlaHlwZS1yZWFjdF06IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWh5cGVqcy9yZWh5cGUtcmVhY3QKICAgKi8KICBwcm9jZXNzU3luYyhmaWxlKSB7CiAgICBsZXQgY29tcGxldGUgPSBmYWxzZTsKICAgIGxldCByZXN1bHQ7CiAgICB0aGlzLmZyZWV6ZSgpOwogICAgYXNzZXJ0UGFyc2VyKCJwcm9jZXNzU3luYyIsIHRoaXMucGFyc2VyIHx8IHRoaXMuUGFyc2VyKTsKICAgIGFzc2VydENvbXBpbGVyKCJwcm9jZXNzU3luYyIsIHRoaXMuY29tcGlsZXIgfHwgdGhpcy5Db21waWxlcik7CiAgICB0aGlzLnByb2Nlc3MoZmlsZSwgcmVhbERvbmUpOwogICAgYXNzZXJ0RG9uZSgicHJvY2Vzc1N5bmMiLCAicHJvY2VzcyIsIGNvbXBsZXRlKTsKICAgIG9rKHJlc3VsdCwgIndlIGVpdGhlciBiYWlsZWQgb24gYW4gZXJyb3Igb3IgaGF2ZSBhIHRyZWUiKTsKICAgIHJldHVybiByZXN1bHQ7CiAgICBmdW5jdGlvbiByZWFsRG9uZShlcnJvciwgZmlsZTIpIHsKICAgICAgY29tcGxldGUgPSB0cnVlOwogICAgICBiYWlsKGVycm9yKTsKICAgICAgcmVzdWx0ID0gZmlsZTI7CiAgICB9CiAgICBfX25hbWUocmVhbERvbmUsICJyZWFsRG9uZSIpOwogIH0KICAvKioKICAgKiBSdW4gKnRyYW5zZm9ybWVycyogb24gYSBzeW50YXggdHJlZS4KICAgKgogICAqID4gKipOb3RlKio6IGBydW5gIGZyZWV6ZXMgdGhlIHByb2Nlc3NvciBpZiBub3QgYWxyZWFkeSAqZnJvemVuKi4KICAgKgogICAqID4gKipOb3RlKio6IGBydW5gIHBlcmZvcm1zIHRoZSBydW4gcGhhc2UsIG5vdCBvdGhlciBwaGFzZXMuCiAgICoKICAgKiBAb3ZlcmxvYWQKICAgKiBAcGFyYW0ge0hlYWRUcmVlIGV4dGVuZHMgdW5kZWZpbmVkID8gTm9kZSA6IEhlYWRUcmVlfSB0cmVlCiAgICogQHBhcmFtIHtSdW5DYWxsYmFjazxUYWlsVHJlZSBleHRlbmRzIHVuZGVmaW5lZCA/IE5vZGUgOiBUYWlsVHJlZT59IGRvbmUKICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfQogICAqCiAgICogQG92ZXJsb2FkCiAgICogQHBhcmFtIHtIZWFkVHJlZSBleHRlbmRzIHVuZGVmaW5lZCA/IE5vZGUgOiBIZWFkVHJlZX0gdHJlZQogICAqIEBwYXJhbSB7Q29tcGF0aWJsZSB8IHVuZGVmaW5lZH0gZmlsZQogICAqIEBwYXJhbSB7UnVuQ2FsbGJhY2s8VGFpbFRyZWUgZXh0ZW5kcyB1bmRlZmluZWQgPyBOb2RlIDogVGFpbFRyZWU+fSBkb25lCiAgICogQHJldHVybnMge3VuZGVmaW5lZH0KICAgKgogICAqIEBvdmVybG9hZAogICAqIEBwYXJhbSB7SGVhZFRyZWUgZXh0ZW5kcyB1bmRlZmluZWQgPyBOb2RlIDogSGVhZFRyZWV9IHRyZWUKICAgKiBAcGFyYW0ge0NvbXBhdGlibGUgfCB1bmRlZmluZWR9IFtmaWxlXQogICAqIEByZXR1cm5zIHtQcm9taXNlPFRhaWxUcmVlIGV4dGVuZHMgdW5kZWZpbmVkID8gTm9kZSA6IFRhaWxUcmVlPn0KICAgKgogICAqIEBwYXJhbSB7SGVhZFRyZWUgZXh0ZW5kcyB1bmRlZmluZWQgPyBOb2RlIDogSGVhZFRyZWV9IHRyZWUKICAgKiAgIFRyZWUgdG8gdHJhbnNmb3JtIGFuZCBpbnNwZWN0LgogICAqIEBwYXJhbSB7KAogICAqICAgUnVuQ2FsbGJhY2s8VGFpbFRyZWUgZXh0ZW5kcyB1bmRlZmluZWQgPyBOb2RlIDogVGFpbFRyZWU+IHwKICAgKiAgIENvbXBhdGlibGUKICAgKiApfSBbZmlsZV0KICAgKiAgIEZpbGUgYXNzb2NpYXRlZCB3aXRoIGBub2RlYCAob3B0aW9uYWwpOyBhbnkgdmFsdWUgYWNjZXB0ZWQgYXMgYHhgIGluCiAgICogICBgbmV3IFZGaWxlKHgpYC4KICAgKiBAcGFyYW0ge1J1bkNhbGxiYWNrPFRhaWxUcmVlIGV4dGVuZHMgdW5kZWZpbmVkID8gTm9kZSA6IFRhaWxUcmVlPn0gW2RvbmVdCiAgICogICBDYWxsYmFjayAob3B0aW9uYWwpLgogICAqIEByZXR1cm5zIHtQcm9taXNlPFRhaWxUcmVlIGV4dGVuZHMgdW5kZWZpbmVkID8gTm9kZSA6IFRhaWxUcmVlPiB8IHVuZGVmaW5lZH0KICAgKiAgIE5vdGhpbmcgaWYgYGRvbmVgIGlzIGdpdmVuLgogICAqICAgT3RoZXJ3aXNlLCBhIHByb21pc2UgcmVqZWN0ZWQgd2l0aCBhIGZhdGFsIGVycm9yIG9yIHJlc29sdmVkIHdpdGggdGhlCiAgICogICB0cmFuc2Zvcm1lZCB0cmVlLgogICAqLwogIHJ1bih0cmVlLCBmaWxlLCBkb25lKSB7CiAgICBhc3NlcnROb2RlKHRyZWUpOwogICAgdGhpcy5mcmVlemUoKTsKICAgIGNvbnN0IHRyYW5zZm9ybWVycyA9IHRoaXMudHJhbnNmb3JtZXJzOwogICAgaWYgKCFkb25lICYmIHR5cGVvZiBmaWxlID09PSAiZnVuY3Rpb24iKSB7CiAgICAgIGRvbmUgPSBmaWxlOwogICAgICBmaWxlID0gdm9pZCAwOwogICAgfQogICAgcmV0dXJuIGRvbmUgPyBleGVjdXRvcih2b2lkIDAsIGRvbmUpIDogbmV3IFByb21pc2UoZXhlY3V0b3IpOwogICAgZnVuY3Rpb24gZXhlY3V0b3IocmVzb2x2ZTIsIHJlamVjdCkgewogICAgICBvaygKICAgICAgICB0eXBlb2YgZmlsZSAhPT0gImZ1bmN0aW9uIiwKICAgICAgICAiYGZpbGVgIGNhblx1MjAxOXQgYmUgYSBgZG9uZWAgYW55bW9yZSwgd2UgY2hlY2tlZCIKICAgICAgKTsKICAgICAgY29uc3QgcmVhbEZpbGUgPSB2ZmlsZShmaWxlKTsKICAgICAgdHJhbnNmb3JtZXJzLnJ1bih0cmVlLCByZWFsRmlsZSwgcmVhbERvbmUpOwogICAgICBmdW5jdGlvbiByZWFsRG9uZShlcnJvciwgb3V0cHV0VHJlZSwgZmlsZTIpIHsKICAgICAgICBjb25zdCByZXN1bHRpbmdUcmVlID0gKAogICAgICAgICAgLyoqIEB0eXBlIHtUYWlsVHJlZSBleHRlbmRzIHVuZGVmaW5lZCA/IE5vZGUgOiBUYWlsVHJlZX0gKi8KICAgICAgICAgIG91dHB1dFRyZWUgfHwgdHJlZQogICAgICAgICk7CiAgICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgICByZWplY3QoZXJyb3IpOwogICAgICAgIH0gZWxzZSBpZiAocmVzb2x2ZTIpIHsKICAgICAgICAgIHJlc29sdmUyKHJlc3VsdGluZ1RyZWUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBvayhkb25lLCAiYGRvbmVgIGlzIGRlZmluZWQgaWYgYHJlc29sdmVgIGlzIG5vdCIpOwogICAgICAgICAgZG9uZSh2b2lkIDAsIHJlc3VsdGluZ1RyZWUsIGZpbGUyKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgX19uYW1lKHJlYWxEb25lLCAicmVhbERvbmUiKTsKICAgIH0KICAgIF9fbmFtZShleGVjdXRvciwgImV4ZWN1dG9yIik7CiAgfQogIC8qKgogICAqIFJ1biAqdHJhbnNmb3JtZXJzKiBvbiBhIHN5bnRheCB0cmVlLgogICAqCiAgICogQW4gZXJyb3IgaXMgdGhyb3duIGlmIGFzeW5jaHJvbm91cyB0cmFuc2Zvcm1zIGFyZSBjb25maWd1cmVkLgogICAqCiAgICogPiAqKk5vdGUqKjogYHJ1blN5bmNgIGZyZWV6ZXMgdGhlIHByb2Nlc3NvciBpZiBub3QgYWxyZWFkeSAqZnJvemVuKi4KICAgKgogICAqID4gKipOb3RlKio6IGBydW5TeW5jYCBwZXJmb3JtcyB0aGUgcnVuIHBoYXNlLCBub3Qgb3RoZXIgcGhhc2VzLgogICAqCiAgICogQHBhcmFtIHtIZWFkVHJlZSBleHRlbmRzIHVuZGVmaW5lZCA/IE5vZGUgOiBIZWFkVHJlZX0gdHJlZQogICAqICAgVHJlZSB0byB0cmFuc2Zvcm0gYW5kIGluc3BlY3QuCiAgICogQHBhcmFtIHtDb21wYXRpYmxlIHwgdW5kZWZpbmVkfSBbZmlsZV0KICAgKiAgIEZpbGUgYXNzb2NpYXRlZCB3aXRoIGBub2RlYCAob3B0aW9uYWwpOyBhbnkgdmFsdWUgYWNjZXB0ZWQgYXMgYHhgIGluCiAgICogICBgbmV3IFZGaWxlKHgpYC4KICAgKiBAcmV0dXJucyB7VGFpbFRyZWUgZXh0ZW5kcyB1bmRlZmluZWQgPyBOb2RlIDogVGFpbFRyZWV9CiAgICogICBUcmFuc2Zvcm1lZCB0cmVlLgogICAqLwogIHJ1blN5bmModHJlZSwgZmlsZSkgewogICAgbGV0IGNvbXBsZXRlID0gZmFsc2U7CiAgICBsZXQgcmVzdWx0OwogICAgdGhpcy5ydW4odHJlZSwgZmlsZSwgcmVhbERvbmUpOwogICAgYXNzZXJ0RG9uZSgicnVuU3luYyIsICJydW4iLCBjb21wbGV0ZSk7CiAgICBvayhyZXN1bHQsICJ3ZSBlaXRoZXIgYmFpbGVkIG9uIGFuIGVycm9yIG9yIGhhdmUgYSB0cmVlIik7CiAgICByZXR1cm4gcmVzdWx0OwogICAgZnVuY3Rpb24gcmVhbERvbmUoZXJyb3IsIHRyZWUyKSB7CiAgICAgIGJhaWwoZXJyb3IpOwogICAgICByZXN1bHQgPSB0cmVlMjsKICAgICAgY29tcGxldGUgPSB0cnVlOwogICAgfQogICAgX19uYW1lKHJlYWxEb25lLCAicmVhbERvbmUiKTsKICB9CiAgLyoqCiAgICogQ29tcGlsZSBhIHN5bnRheCB0cmVlLgogICAqCiAgICogPiAqKk5vdGUqKjogYHN0cmluZ2lmeWAgZnJlZXplcyB0aGUgcHJvY2Vzc29yIGlmIG5vdCBhbHJlYWR5ICpmcm96ZW4qLgogICAqCiAgICogPiAqKk5vdGUqKjogYHN0cmluZ2lmeWAgcGVyZm9ybXMgdGhlIHN0cmluZ2lmeSBwaGFzZSwgbm90IHRoZSBydW4gcGhhc2UKICAgKiA+IG9yIG90aGVyIHBoYXNlcy4KICAgKgogICAqIEBwYXJhbSB7Q29tcGlsZVRyZWUgZXh0ZW5kcyB1bmRlZmluZWQgPyBOb2RlIDogQ29tcGlsZVRyZWV9IHRyZWUKICAgKiAgIFRyZWUgdG8gY29tcGlsZS4KICAgKiBAcGFyYW0ge0NvbXBhdGlibGUgfCB1bmRlZmluZWR9IFtmaWxlXQogICAqICAgRmlsZSBhc3NvY2lhdGVkIHdpdGggYG5vZGVgIChvcHRpb25hbCk7IGFueSB2YWx1ZSBhY2NlcHRlZCBhcyBgeGAgaW4KICAgKiAgIGBuZXcgVkZpbGUoeClgLgogICAqIEByZXR1cm5zIHtDb21waWxlUmVzdWx0IGV4dGVuZHMgdW5kZWZpbmVkID8gVmFsdWUgOiBDb21waWxlUmVzdWx0fQogICAqICAgVGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdHJlZSAoc2VlIG5vdGUpLgogICAqCiAgICogICA+ICoqTm90ZSoqOiB1bmlmaWVkIHR5cGljYWxseSBjb21waWxlcyBieSBzZXJpYWxpemluZzogbW9zdCBjb21waWxlcnMKICAgKiAgID4gcmV0dXJuIGBzdHJpbmdgIChvciBgVWludDhBcnJheWApLgogICAqICAgPiBTb21lIGNvbXBpbGVycywgc3VjaCBhcyB0aGUgb25lIGNvbmZpZ3VyZWQgd2l0aAogICAqICAgPiBbYHJlaHlwZS1yZWFjdGBdW3JlaHlwZS1yZWFjdF0sIHJldHVybiBvdGhlciB2YWx1ZXMgKGluIHRoaXMgY2FzZSwgYQogICAqICAgPiBSZWFjdCB0cmVlKS4KICAgKiAgID4gSWYgeW914oCZcmUgdXNpbmcgYSBjb21waWxlciB0aGF0IGRvZXNu4oCZdCBzZXJpYWxpemUsIGV4cGVjdCBkaWZmZXJlbnQKICAgKiAgID4gcmVzdWx0IHZhbHVlcy4KICAgKiAgID4KICAgKiAgID4gVG8gcmVnaXN0ZXIgY3VzdG9tIHJlc3VsdHMgaW4gVHlwZVNjcmlwdCwgYWRkIHRoZW0gdG8KICAgKiAgID4ge0BsaW5rY29kZSBDb21waWxlUmVzdWx0TWFwfS4KICAgKgogICAqICAgW3JlaHlwZS1yZWFjdF06IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWh5cGVqcy9yZWh5cGUtcmVhY3QKICAgKi8KICBzdHJpbmdpZnkodHJlZSwgZmlsZSkgewogICAgdGhpcy5mcmVlemUoKTsKICAgIGNvbnN0IHJlYWxGaWxlID0gdmZpbGUoZmlsZSk7CiAgICBjb25zdCBjb21waWxlcjIgPSB0aGlzLmNvbXBpbGVyIHx8IHRoaXMuQ29tcGlsZXI7CiAgICBhc3NlcnRDb21waWxlcigic3RyaW5naWZ5IiwgY29tcGlsZXIyKTsKICAgIGFzc2VydE5vZGUodHJlZSk7CiAgICByZXR1cm4gY29tcGlsZXIyKHRyZWUsIHJlYWxGaWxlKTsKICB9CiAgLyoqCiAgICogQ29uZmlndXJlIHRoZSBwcm9jZXNzb3IgdG8gdXNlIGEgcGx1Z2luLCBhIGxpc3Qgb2YgdXNhYmxlIHZhbHVlcywgb3IgYQogICAqIHByZXNldC4KICAgKgogICAqIElmIHRoZSBwcm9jZXNzb3IgaXMgYWxyZWFkeSB1c2luZyBhIHBsdWdpbiwgdGhlIHByZXZpb3VzIHBsdWdpbgogICAqIGNvbmZpZ3VyYXRpb24gaXMgY2hhbmdlZCBiYXNlZCBvbiB0aGUgb3B0aW9ucyB0aGF0IGFyZSBwYXNzZWQgaW4uCiAgICogSW4gb3RoZXIgd29yZHMsIHRoZSBwbHVnaW4gaXMgbm90IGFkZGVkIGEgc2Vjb25kIHRpbWUuCiAgICoKICAgKiA+ICoqTm90ZSoqOiBgdXNlYCBjYW5ub3QgYmUgY2FsbGVkIG9uICpmcm96ZW4qIHByb2Nlc3NvcnMuCiAgICogPiBDYWxsIHRoZSBwcm9jZXNzb3IgZmlyc3QgdG8gY3JlYXRlIGEgbmV3IHVuZnJvemVuIHByb2Nlc3Nvci4KICAgKgogICAqIEBleGFtcGxlCiAgICogICBUaGVyZSBhcmUgbWFueSB3YXlzIHRvIHBhc3MgcGx1Z2lucyB0byBgLnVzZSgpYC4KICAgKiAgIFRoaXMgZXhhbXBsZSBnaXZlcyBhbiBvdmVydmlldzoKICAgKgogICAqICAgYGBganMKICAgKiAgIGltcG9ydCB7dW5pZmllZH0gZnJvbSAndW5pZmllZCcKICAgKgogICAqICAgdW5pZmllZCgpCiAgICogICAgIC8vIFBsdWdpbiB3aXRoIG9wdGlvbnM6CiAgICogICAgIC51c2UocGx1Z2luQSwge3g6IHRydWUsIHk6IHRydWV9KQogICAqICAgICAvLyBQYXNzaW5nIHRoZSBzYW1lIHBsdWdpbiBhZ2FpbiBtZXJnZXMgY29uZmlndXJhdGlvbiAodG8gYHt4OiB0cnVlLCB5OiBmYWxzZSwgejogdHJ1ZX1gKToKICAgKiAgICAgLnVzZShwbHVnaW5BLCB7eTogZmFsc2UsIHo6IHRydWV9KQogICAqICAgICAvLyBQbHVnaW5zOgogICAqICAgICAudXNlKFtwbHVnaW5CLCBwbHVnaW5DXSkKICAgKiAgICAgLy8gVHdvIHBsdWdpbnMsIHRoZSBzZWNvbmQgd2l0aCBvcHRpb25zOgogICAqICAgICAudXNlKFtwbHVnaW5ELCBbcGx1Z2luRSwge31dXSkKICAgKiAgICAgLy8gUHJlc2V0IHdpdGggcGx1Z2lucyBhbmQgc2V0dGluZ3M6CiAgICogICAgIC51c2Uoe3BsdWdpbnM6IFtwbHVnaW5GLCBbcGx1Z2luRywge31dXSwgc2V0dGluZ3M6IHtwb3NpdGlvbjogZmFsc2V9fSkKICAgKiAgICAgLy8gU2V0dGluZ3Mgb25seToKICAgKiAgICAgLnVzZSh7c2V0dGluZ3M6IHtwb3NpdGlvbjogZmFsc2V9fSkKICAgKiAgIGBgYAogICAqCiAgICogQHRlbXBsYXRlIHtBcnJheTx1bmtub3duPn0gW1BhcmFtZXRlcnM9W11dCiAgICogQHRlbXBsYXRlIHtOb2RlIHwgc3RyaW5nIHwgdW5kZWZpbmVkfSBbSW5wdXQ9dW5kZWZpbmVkXQogICAqIEB0ZW1wbGF0ZSBbT3V0cHV0PUlucHV0XQogICAqCiAgICogQG92ZXJsb2FkCiAgICogQHBhcmFtIHtQcmVzZXQgfCBudWxsIHwgdW5kZWZpbmVkfSBbcHJlc2V0XQogICAqIEByZXR1cm5zIHtQcm9jZXNzb3I8UGFyc2VUcmVlLCBIZWFkVHJlZSwgVGFpbFRyZWUsIENvbXBpbGVUcmVlLCBDb21waWxlUmVzdWx0Pn0KICAgKgogICAqIEBvdmVybG9hZAogICAqIEBwYXJhbSB7UGx1Z2dhYmxlTGlzdH0gbGlzdAogICAqIEByZXR1cm5zIHtQcm9jZXNzb3I8UGFyc2VUcmVlLCBIZWFkVHJlZSwgVGFpbFRyZWUsIENvbXBpbGVUcmVlLCBDb21waWxlUmVzdWx0Pn0KICAgKgogICAqIEBvdmVybG9hZAogICAqIEBwYXJhbSB7UGx1Z2luPFBhcmFtZXRlcnMsIElucHV0LCBPdXRwdXQ+fSBwbHVnaW4KICAgKiBAcGFyYW0gey4uLihQYXJhbWV0ZXJzIHwgW2Jvb2xlYW5dKX0gcGFyYW1ldGVycwogICAqIEByZXR1cm5zIHtVc2VQbHVnaW48UGFyc2VUcmVlLCBIZWFkVHJlZSwgVGFpbFRyZWUsIENvbXBpbGVUcmVlLCBDb21waWxlUmVzdWx0LCBJbnB1dCwgT3V0cHV0Pn0KICAgKgogICAqIEBwYXJhbSB7UGx1Z2dhYmxlTGlzdCB8IFBsdWdpbiB8IFByZXNldCB8IG51bGwgfCB1bmRlZmluZWR9IHZhbHVlCiAgICogICBVc2FibGUgdmFsdWUuCiAgICogQHBhcmFtIHsuLi51bmtub3dufSBwYXJhbWV0ZXJzCiAgICogICBQYXJhbWV0ZXJzLCB3aGVuIGEgcGx1Z2luIGlzIGdpdmVuIGFzIGEgdXNhYmxlIHZhbHVlLgogICAqIEByZXR1cm5zIHtQcm9jZXNzb3I8UGFyc2VUcmVlLCBIZWFkVHJlZSwgVGFpbFRyZWUsIENvbXBpbGVUcmVlLCBDb21waWxlUmVzdWx0Pn0KICAgKiAgIEN1cnJlbnQgcHJvY2Vzc29yLgogICAqLwogIHVzZSh2YWx1ZTIsIC4uLnBhcmFtZXRlcnMpIHsKICAgIGNvbnN0IGF0dGFjaGVycyA9IHRoaXMuYXR0YWNoZXJzOwogICAgY29uc3QgbmFtZXNwYWNlID0gdGhpcy5uYW1lc3BhY2U7CiAgICBhc3NlcnRVbmZyb3plbigidXNlIiwgdGhpcy5mcm96ZW4pOwogICAgaWYgKHZhbHVlMiA9PT0gbnVsbCB8fCB2YWx1ZTIgPT09IHZvaWQgMCkgewogICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUyID09PSAiZnVuY3Rpb24iKSB7CiAgICAgIGFkZFBsdWdpbih2YWx1ZTIsIHBhcmFtZXRlcnMpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUyID09PSAib2JqZWN0IikgewogICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZTIpKSB7CiAgICAgICAgYWRkTGlzdCh2YWx1ZTIpOwogICAgICB9IGVsc2UgewogICAgICAgIGFkZFByZXNldCh2YWx1ZTIpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJFeHBlY3RlZCB1c2FibGUgdmFsdWUsIG5vdCBgIiArIHZhbHVlMiArICJgIik7CiAgICB9CiAgICByZXR1cm4gdGhpczsKICAgIGZ1bmN0aW9uIGFkZDIodmFsdWUzKSB7CiAgICAgIGlmICh0eXBlb2YgdmFsdWUzID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgYWRkUGx1Z2luKHZhbHVlMywgW10pOwogICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZTMgPT09ICJvYmplY3QiKSB7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUzKSkgewogICAgICAgICAgY29uc3QgW3BsdWdpbiwgLi4ucGFyYW1ldGVyczJdID0gKAogICAgICAgICAgICAvKiogQHR5cGUge1BsdWdpblR1cGxlPEFycmF5PHVua25vd24+Pn0gKi8KICAgICAgICAgICAgdmFsdWUzCiAgICAgICAgICApOwogICAgICAgICAgYWRkUGx1Z2luKHBsdWdpbiwgcGFyYW1ldGVyczIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBhZGRQcmVzZXQodmFsdWUzKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiRXhwZWN0ZWQgdXNhYmxlIHZhbHVlLCBub3QgYCIgKyB2YWx1ZTMgKyAiYCIpOwogICAgICB9CiAgICB9CiAgICBfX25hbWUoYWRkMiwgImFkZCIpOwogICAgZnVuY3Rpb24gYWRkUHJlc2V0KHJlc3VsdCkgewogICAgICBpZiAoISgicGx1Z2lucyIgaW4gcmVzdWx0KSAmJiAhKCJzZXR0aW5ncyIgaW4gcmVzdWx0KSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICJFeHBlY3RlZCB1c2FibGUgdmFsdWUgYnV0IHJlY2VpdmVkIGFuIGVtcHR5IHByZXNldCwgd2hpY2ggaXMgcHJvYmFibHkgYSBtaXN0YWtlOiBwcmVzZXRzIHR5cGljYWxseSBjb21lIHdpdGggYHBsdWdpbnNgIGFuZCBzb21ldGltZXMgd2l0aCBgc2V0dGluZ3NgLCBidXQgdGhpcyBoYXMgbmVpdGhlciIKICAgICAgICApOwogICAgICB9CiAgICAgIGFkZExpc3QocmVzdWx0LnBsdWdpbnMpOwogICAgICBpZiAocmVzdWx0LnNldHRpbmdzKSB7CiAgICAgICAgbmFtZXNwYWNlLnNldHRpbmdzID0gKDAsIGltcG9ydF9leHRlbmQuZGVmYXVsdCkodHJ1ZSwgbmFtZXNwYWNlLnNldHRpbmdzLCByZXN1bHQuc2V0dGluZ3MpOwogICAgICB9CiAgICB9CiAgICBfX25hbWUoYWRkUHJlc2V0LCAiYWRkUHJlc2V0Iik7CiAgICBmdW5jdGlvbiBhZGRMaXN0KHBsdWdpbnMpIHsKICAgICAgbGV0IGluZGV4MiA9IC0xOwogICAgICBpZiAocGx1Z2lucyA9PT0gbnVsbCB8fCBwbHVnaW5zID09PSB2b2lkIDApIHsKICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHBsdWdpbnMpKSB7CiAgICAgICAgd2hpbGUgKCsraW5kZXgyIDwgcGx1Z2lucy5sZW5ndGgpIHsKICAgICAgICAgIGNvbnN0IHRoaW5nID0gcGx1Z2luc1tpbmRleDJdOwogICAgICAgICAgYWRkMih0aGluZyk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIGEgbGlzdCBvZiBwbHVnaW5zLCBub3QgYCIgKyBwbHVnaW5zICsgImAiKTsKICAgICAgfQogICAgfQogICAgX19uYW1lKGFkZExpc3QsICJhZGRMaXN0Iik7CiAgICBmdW5jdGlvbiBhZGRQbHVnaW4ocGx1Z2luLCBwYXJhbWV0ZXJzMikgewogICAgICBsZXQgaW5kZXgyID0gLTE7CiAgICAgIGxldCBlbnRyeUluZGV4ID0gLTE7CiAgICAgIHdoaWxlICgrK2luZGV4MiA8IGF0dGFjaGVycy5sZW5ndGgpIHsKICAgICAgICBpZiAoYXR0YWNoZXJzW2luZGV4Ml1bMF0gPT09IHBsdWdpbikgewogICAgICAgICAgZW50cnlJbmRleCA9IGluZGV4MjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZW50cnlJbmRleCA9PT0gLTEpIHsKICAgICAgICBhdHRhY2hlcnMucHVzaChbcGx1Z2luLCAuLi5wYXJhbWV0ZXJzMl0pOwogICAgICB9IGVsc2UgaWYgKHBhcmFtZXRlcnMyLmxlbmd0aCA+IDApIHsKICAgICAgICBsZXQgW3ByaW1hcnksIC4uLnJlc3RdID0gcGFyYW1ldGVyczI7CiAgICAgICAgY29uc3QgY3VycmVudFByaW1hcnkgPSBhdHRhY2hlcnNbZW50cnlJbmRleF1bMV07CiAgICAgICAgaWYgKGlzUGxhaW5PYmplY3QoY3VycmVudFByaW1hcnkpICYmIGlzUGxhaW5PYmplY3QocHJpbWFyeSkpIHsKICAgICAgICAgIHByaW1hcnkgPSAoMCwgaW1wb3J0X2V4dGVuZC5kZWZhdWx0KSh0cnVlLCBjdXJyZW50UHJpbWFyeSwgcHJpbWFyeSk7CiAgICAgICAgfQogICAgICAgIGF0dGFjaGVyc1tlbnRyeUluZGV4XSA9IFtwbHVnaW4sIHByaW1hcnksIC4uLnJlc3RdOwogICAgICB9CiAgICB9CiAgICBfX25hbWUoYWRkUGx1Z2luLCAiYWRkUGx1Z2luIik7CiAgfQp9Owp2YXIgdW5pZmllZCA9IG5ldyBQcm9jZXNzb3IoKS5mcmVlemUoKTsKZnVuY3Rpb24gYXNzZXJ0UGFyc2VyKG5hbWUsIHZhbHVlMikgewogIGlmICh0eXBlb2YgdmFsdWUyICE9PSAiZnVuY3Rpb24iKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYCIgKyBuYW1lICsgImAgd2l0aG91dCBgcGFyc2VyYCIpOwogIH0KfQpfX25hbWUoYXNzZXJ0UGFyc2VyLCAiYXNzZXJ0UGFyc2VyIik7CmZ1bmN0aW9uIGFzc2VydENvbXBpbGVyKG5hbWUsIHZhbHVlMikgewogIGlmICh0eXBlb2YgdmFsdWUyICE9PSAiZnVuY3Rpb24iKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYCIgKyBuYW1lICsgImAgd2l0aG91dCBgY29tcGlsZXJgIik7CiAgfQp9Cl9fbmFtZShhc3NlcnRDb21waWxlciwgImFzc2VydENvbXBpbGVyIik7CmZ1bmN0aW9uIGFzc2VydFVuZnJvemVuKG5hbWUsIGZyb3plbikgewogIGlmIChmcm96ZW4pIHsKICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgIkNhbm5vdCBjYWxsIGAiICsgbmFtZSArICJgIG9uIGEgZnJvemVuIHByb2Nlc3Nvci5cbkNyZWF0ZSBhIG5ldyBwcm9jZXNzb3IgZmlyc3QsIGJ5IGNhbGxpbmcgaXQ6IHVzZSBgcHJvY2Vzc29yKClgIGluc3RlYWQgb2YgYHByb2Nlc3NvcmAuIgogICAgKTsKICB9Cn0KX19uYW1lKGFzc2VydFVuZnJvemVuLCAiYXNzZXJ0VW5mcm96ZW4iKTsKZnVuY3Rpb24gYXNzZXJ0Tm9kZShub2RlMikgewogIGlmICghaXNQbGFpbk9iamVjdChub2RlMikgfHwgdHlwZW9mIG5vZGUyLnR5cGUgIT09ICJzdHJpbmciKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJFeHBlY3RlZCBub2RlLCBnb3QgYCIgKyBub2RlMiArICJgIik7CiAgfQp9Cl9fbmFtZShhc3NlcnROb2RlLCAiYXNzZXJ0Tm9kZSIpOwpmdW5jdGlvbiBhc3NlcnREb25lKG5hbWUsIGFzeW5jTmFtZSwgY29tcGxldGUpIHsKICBpZiAoIWNvbXBsZXRlKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICJgIiArIG5hbWUgKyAiYCBmaW5pc2hlZCBhc3luYy4gVXNlIGAiICsgYXN5bmNOYW1lICsgImAgaW5zdGVhZCIKICAgICk7CiAgfQp9Cl9fbmFtZShhc3NlcnREb25lLCAiYXNzZXJ0RG9uZSIpOwpmdW5jdGlvbiB2ZmlsZSh2YWx1ZTIpIHsKICByZXR1cm4gbG9va3NMaWtlQVZGaWxlKHZhbHVlMikgPyB2YWx1ZTIgOiBuZXcgVkZpbGUodmFsdWUyKTsKfQpfX25hbWUodmZpbGUsICJ2ZmlsZSIpOwpmdW5jdGlvbiBsb29rc0xpa2VBVkZpbGUodmFsdWUyKSB7CiAgcmV0dXJuIEJvb2xlYW4oCiAgICB2YWx1ZTIgJiYgdHlwZW9mIHZhbHVlMiA9PT0gIm9iamVjdCIgJiYgIm1lc3NhZ2UiIGluIHZhbHVlMiAmJiAibWVzc2FnZXMiIGluIHZhbHVlMgogICk7Cn0KX19uYW1lKGxvb2tzTGlrZUFWRmlsZSwgImxvb2tzTGlrZUFWRmlsZSIpOwpmdW5jdGlvbiBsb29rc0xpa2VBVmFsdWUodmFsdWUyKSB7CiAgcmV0dXJuIHR5cGVvZiB2YWx1ZTIgPT09ICJzdHJpbmciIHx8IGlzVWludDhBcnJheTQodmFsdWUyKTsKfQpfX25hbWUobG9va3NMaWtlQVZhbHVlLCAibG9va3NMaWtlQVZhbHVlIik7CmZ1bmN0aW9uIGlzVWludDhBcnJheTQodmFsdWUyKSB7CiAgcmV0dXJuIEJvb2xlYW4oCiAgICB2YWx1ZTIgJiYgdHlwZW9mIHZhbHVlMiA9PT0gIm9iamVjdCIgJiYgImJ5dGVMZW5ndGgiIGluIHZhbHVlMiAmJiAiYnl0ZU9mZnNldCIgaW4gdmFsdWUyCiAgKTsKfQpfX25hbWUoaXNVaW50OEFycmF5NCwgImlzVWludDhBcnJheSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2Njb3VudEAyLjAuMS9ub2RlX21vZHVsZXMvY2NvdW50L2luZGV4LmpzCmZ1bmN0aW9uIGNjb3VudCh2YWx1ZTIsIGNoYXJhY3RlcikgewogIGNvbnN0IHNvdXJjZSA9IFN0cmluZyh2YWx1ZTIpOwogIGlmICh0eXBlb2YgY2hhcmFjdGVyICE9PSAic3RyaW5nIikgewogICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiRXhwZWN0ZWQgY2hhcmFjdGVyIik7CiAgfQogIGxldCBjb3VudDIgPSAwOwogIGxldCBpbmRleDIgPSBzb3VyY2UuaW5kZXhPZihjaGFyYWN0ZXIpOwogIHdoaWxlIChpbmRleDIgIT09IC0xKSB7CiAgICBjb3VudDIrKzsKICAgIGluZGV4MiA9IHNvdXJjZS5pbmRleE9mKGNoYXJhY3RlciwgaW5kZXgyICsgY2hhcmFjdGVyLmxlbmd0aCk7CiAgfQogIHJldHVybiBjb3VudDI7Cn0KX19uYW1lKGNjb3VudCwgImNjb3VudCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay11dGlsLWNoYXJhY3RlckAyLjEuMS9ub2RlX21vZHVsZXMvbWljcm9tYXJrLXV0aWwtY2hhcmFjdGVyL2luZGV4LmpzCnZhciBhc2NpaUFscGhhID0gcmVnZXhDaGVjaygvW0EtWmEtel0vKTsKdmFyIGFzY2lpQWxwaGFudW1lcmljID0gcmVnZXhDaGVjaygvW1xkQS1aYS16XS8pOwp2YXIgYXNjaWlBdGV4dCA9IHJlZ2V4Q2hlY2soL1sjLScqK1wtLTk9P0EtWl4tfl0vKTsKZnVuY3Rpb24gYXNjaWlDb250cm9sKGNvZGU0KSB7CiAgcmV0dXJuICgKICAgIC8vIFNwZWNpYWwgd2hpdGVzcGFjZSBjb2RlcyAod2hpY2ggaGF2ZSBuZWdhdGl2ZSB2YWx1ZXMpLCBDMCBhbmQgQ29udHJvbAogICAgLy8gY2hhcmFjdGVyIERFTAogICAgY29kZTQgIT09IG51bGwgJiYgKGNvZGU0IDwgMzIgfHwgY29kZTQgPT09IDEyNykKICApOwp9Cl9fbmFtZShhc2NpaUNvbnRyb2wsICJhc2NpaUNvbnRyb2wiKTsKdmFyIGFzY2lpRGlnaXQgPSByZWdleENoZWNrKC9cZC8pOwp2YXIgYXNjaWlIZXhEaWdpdCA9IHJlZ2V4Q2hlY2soL1tcZEEtRmEtZl0vKTsKdmFyIGFzY2lpUHVuY3R1YXRpb24gPSByZWdleENoZWNrKC9bIS0vOi1AWy1gey1+XS8pOwpmdW5jdGlvbiBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpIHsKICByZXR1cm4gY29kZTQgIT09IG51bGwgJiYgY29kZTQgPCAtMjsKfQpfX25hbWUobWFya2Rvd25MaW5lRW5kaW5nLCAibWFya2Rvd25MaW5lRW5kaW5nIik7CmZ1bmN0aW9uIG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpIHsKICByZXR1cm4gY29kZTQgIT09IG51bGwgJiYgKGNvZGU0IDwgMCB8fCBjb2RlNCA9PT0gMzIpOwp9Cl9fbmFtZShtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlLCAibWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZSIpOwpmdW5jdGlvbiBtYXJrZG93blNwYWNlKGNvZGU0KSB7CiAgcmV0dXJuIGNvZGU0ID09PSAtMiB8fCBjb2RlNCA9PT0gLTEgfHwgY29kZTQgPT09IDMyOwp9Cl9fbmFtZShtYXJrZG93blNwYWNlLCAibWFya2Rvd25TcGFjZSIpOwp2YXIgdW5pY29kZVB1bmN0dWF0aW9uID0gcmVnZXhDaGVjaygvXHB7UH18XHB7U30vdSk7CnZhciB1bmljb2RlV2hpdGVzcGFjZSA9IHJlZ2V4Q2hlY2soL1xzLyk7CmZ1bmN0aW9uIHJlZ2V4Q2hlY2socmVnZXgpIHsKICByZXR1cm4gY2hlY2s7CiAgZnVuY3Rpb24gY2hlY2soY29kZTQpIHsKICAgIHJldHVybiBjb2RlNCAhPT0gbnVsbCAmJiBjb2RlNCA+IC0xICYmIHJlZ2V4LnRlc3QoU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlNCkpOwogIH0KICBfX25hbWUoY2hlY2ssICJjaGVjayIpOwp9Cl9fbmFtZShyZWdleENoZWNrLCAicmVnZXhDaGVjayIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3VuaXN0LXV0aWwtaXNANi4wLjEvbm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtaXMvbGliL2luZGV4LmpzCnZhciBpcyA9ICgKICAvLyBOb3RlOiBvdmVybG9hZHMgaW4gSlNEb2MgY2Fu4oCZdCB5ZXQgdXNlIGRpZmZlcmVudCBgQHRlbXBsYXRlYHMuCiAgLyoqCiAgICogQHR5cGUgeygKICAgKiAgICg8Q29uZGl0aW9uIGV4dGVuZHMgUmVhZG9ubHlBcnJheTxzdHJpbmc+Pihub2RlOiB1bmtub3duLCB0ZXN0OiBDb25kaXRpb24sIGluZGV4PzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgcGFyZW50PzogUGFyZW50IHwgbnVsbCB8IHVuZGVmaW5lZCwgY29udGV4dD86IHVua25vd24pID0+IG5vZGUgaXMgTm9kZSAmIHt0eXBlOiBDb25kaXRpb25bbnVtYmVyXX0pICYKICAgKiAgICg8Q29uZGl0aW9uIGV4dGVuZHMgQXJyYXk8c3RyaW5nPj4obm9kZTogdW5rbm93biwgdGVzdDogQ29uZGl0aW9uLCBpbmRleD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHBhcmVudD86IFBhcmVudCB8IG51bGwgfCB1bmRlZmluZWQsIGNvbnRleHQ/OiB1bmtub3duKSA9PiBub2RlIGlzIE5vZGUgJiB7dHlwZTogQ29uZGl0aW9uW251bWJlcl19KSAmCiAgICogICAoPENvbmRpdGlvbiBleHRlbmRzIHN0cmluZz4obm9kZTogdW5rbm93biwgdGVzdDogQ29uZGl0aW9uLCBpbmRleD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHBhcmVudD86IFBhcmVudCB8IG51bGwgfCB1bmRlZmluZWQsIGNvbnRleHQ/OiB1bmtub3duKSA9PiBub2RlIGlzIE5vZGUgJiB7dHlwZTogQ29uZGl0aW9ufSkgJgogICAqICAgKDxDb25kaXRpb24gZXh0ZW5kcyBQcm9wcz4obm9kZTogdW5rbm93biwgdGVzdDogQ29uZGl0aW9uLCBpbmRleD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHBhcmVudD86IFBhcmVudCB8IG51bGwgfCB1bmRlZmluZWQsIGNvbnRleHQ/OiB1bmtub3duKSA9PiBub2RlIGlzIE5vZGUgJiBDb25kaXRpb24pICYKICAgKiAgICg8Q29uZGl0aW9uIGV4dGVuZHMgVGVzdEZ1bmN0aW9uPihub2RlOiB1bmtub3duLCB0ZXN0OiBDb25kaXRpb24sIGluZGV4PzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgcGFyZW50PzogUGFyZW50IHwgbnVsbCB8IHVuZGVmaW5lZCwgY29udGV4dD86IHVua25vd24pID0+IG5vZGUgaXMgTm9kZSAmIFByZWRpY2F0ZTxDb25kaXRpb24sIE5vZGU+KSAmCiAgICogICAoKG5vZGU/OiBudWxsIHwgdW5kZWZpbmVkKSA9PiBmYWxzZSkgJgogICAqICAgKChub2RlOiB1bmtub3duLCB0ZXN0PzogbnVsbCB8IHVuZGVmaW5lZCwgaW5kZXg/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBwYXJlbnQ/OiBQYXJlbnQgfCBudWxsIHwgdW5kZWZpbmVkLCBjb250ZXh0PzogdW5rbm93bikgPT4gbm9kZSBpcyBOb2RlKSAmCiAgICogICAoKG5vZGU6IHVua25vd24sIHRlc3Q/OiBUZXN0LCBpbmRleD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHBhcmVudD86IFBhcmVudCB8IG51bGwgfCB1bmRlZmluZWQsIGNvbnRleHQ/OiB1bmtub3duKSA9PiBib29sZWFuKQogICAqICl9CiAgICovCiAgLyoqCiAgICogQHBhcmFtIHt1bmtub3dufSBbbm9kZV0KICAgKiBAcGFyYW0ge1Rlc3R9IFt0ZXN0XQogICAqIEBwYXJhbSB7bnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZH0gW2luZGV4XQogICAqIEBwYXJhbSB7UGFyZW50IHwgbnVsbCB8IHVuZGVmaW5lZH0gW3BhcmVudF0KICAgKiBAcGFyYW0ge3Vua25vd259IFtjb250ZXh0XQogICAqIEByZXR1cm5zIHtib29sZWFufQogICAqLwogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtcGFyYW1zCiAgLyogQF9fUFVSRV9fICovIF9fbmFtZSgoZnVuY3Rpb24obm9kZTIsIHRlc3QsIGluZGV4MiwgcGFyZW50LCBjb250ZXh0MikgewogICAgY29uc3QgY2hlY2sgPSBjb252ZXJ0KHRlc3QpOwogICAgaWYgKGluZGV4MiAhPT0gdm9pZCAwICYmIGluZGV4MiAhPT0gbnVsbCAmJiAodHlwZW9mIGluZGV4MiAhPT0gIm51bWJlciIgfHwgaW5kZXgyIDwgMCB8fCBpbmRleDIgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RlZCBwb3NpdGl2ZSBmaW5pdGUgaW5kZXgiKTsKICAgIH0KICAgIGlmIChwYXJlbnQgIT09IHZvaWQgMCAmJiBwYXJlbnQgIT09IG51bGwgJiYgKCFpcyhwYXJlbnQpIHx8ICFwYXJlbnQuY2hpbGRyZW4pKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiRXhwZWN0ZWQgcGFyZW50IG5vZGUiKTsKICAgIH0KICAgIGlmICgocGFyZW50ID09PSB2b2lkIDAgfHwgcGFyZW50ID09PSBudWxsKSAhPT0gKGluZGV4MiA9PT0gdm9pZCAwIHx8IGluZGV4MiA9PT0gbnVsbCkpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RlZCBib3RoIHBhcmVudCBhbmQgaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBsb29rc0xpa2VBTm9kZShub2RlMikgPyBjaGVjay5jYWxsKGNvbnRleHQyLCBub2RlMiwgaW5kZXgyLCBwYXJlbnQpIDogZmFsc2U7CiAgfSksICJpcyIpCik7CnZhciBjb252ZXJ0ID0gKAogIC8vIE5vdGU6IG92ZXJsb2FkcyBpbiBKU0RvYyBjYW7igJl0IHlldCB1c2UgZGlmZmVyZW50IGBAdGVtcGxhdGVgcy4KICAvKioKICAgKiBAdHlwZSB7KAogICAqICAgKDxDb25kaXRpb24gZXh0ZW5kcyBzdHJpbmc+KHRlc3Q6IENvbmRpdGlvbikgPT4gKG5vZGU6IHVua25vd24sIGluZGV4PzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgcGFyZW50PzogUGFyZW50IHwgbnVsbCB8IHVuZGVmaW5lZCwgY29udGV4dD86IHVua25vd24pID0+IG5vZGUgaXMgTm9kZSAmIHt0eXBlOiBDb25kaXRpb259KSAmCiAgICogICAoPENvbmRpdGlvbiBleHRlbmRzIFByb3BzPih0ZXN0OiBDb25kaXRpb24pID0+IChub2RlOiB1bmtub3duLCBpbmRleD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHBhcmVudD86IFBhcmVudCB8IG51bGwgfCB1bmRlZmluZWQsIGNvbnRleHQ/OiB1bmtub3duKSA9PiBub2RlIGlzIE5vZGUgJiBDb25kaXRpb24pICYKICAgKiAgICg8Q29uZGl0aW9uIGV4dGVuZHMgVGVzdEZ1bmN0aW9uPih0ZXN0OiBDb25kaXRpb24pID0+IChub2RlOiB1bmtub3duLCBpbmRleD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHBhcmVudD86IFBhcmVudCB8IG51bGwgfCB1bmRlZmluZWQsIGNvbnRleHQ/OiB1bmtub3duKSA9PiBub2RlIGlzIE5vZGUgJiBQcmVkaWNhdGU8Q29uZGl0aW9uLCBOb2RlPikgJgogICAqICAgKCh0ZXN0PzogbnVsbCB8IHVuZGVmaW5lZCkgPT4gKG5vZGU/OiB1bmtub3duLCBpbmRleD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHBhcmVudD86IFBhcmVudCB8IG51bGwgfCB1bmRlZmluZWQsIGNvbnRleHQ/OiB1bmtub3duKSA9PiBub2RlIGlzIE5vZGUpICYKICAgKiAgICgodGVzdD86IFRlc3QpID0+IENoZWNrKQogICAqICl9CiAgICovCiAgLyoqCiAgICogQHBhcmFtIHtUZXN0fSBbdGVzdF0KICAgKiBAcmV0dXJucyB7Q2hlY2t9CiAgICovCiAgLyogQF9fUFVSRV9fICovIF9fbmFtZSgoZnVuY3Rpb24odGVzdCkgewogICAgaWYgKHRlc3QgPT09IG51bGwgfHwgdGVzdCA9PT0gdm9pZCAwKSB7CiAgICAgIHJldHVybiBvazI7CiAgICB9CiAgICBpZiAodHlwZW9mIHRlc3QgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgcmV0dXJuIGNhc3RGYWN0b3J5KHRlc3QpOwogICAgfQogICAgaWYgKHR5cGVvZiB0ZXN0ID09PSAib2JqZWN0IikgewogICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0ZXN0KSA/IGFueUZhY3RvcnkodGVzdCkgOiAoCiAgICAgICAgLy8gQ2FzdCBiZWNhdXNlIGBSZWFkb25seUFycmF5YCBnb2VzIGludG8gdGhlIGFib3ZlIGJ1dCBgaXNBcnJheWAKICAgICAgICAvLyBuYXJyb3dzIHRvIGBBcnJheWAuCiAgICAgICAgcHJvcGVydGllc0ZhY3RvcnkoCiAgICAgICAgICAvKiogQHR5cGUge1Byb3BzfSAqLwogICAgICAgICAgdGVzdAogICAgICAgICkKICAgICAgKTsKICAgIH0KICAgIGlmICh0eXBlb2YgdGVzdCA9PT0gInN0cmluZyIpIHsKICAgICAgcmV0dXJuIHR5cGVGYWN0b3J5KHRlc3QpOwogICAgfQogICAgdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RlZCBmdW5jdGlvbiwgc3RyaW5nLCBvciBvYmplY3QgYXMgdGVzdCIpOwogIH0pLCAiY29udmVydCIpCik7CmZ1bmN0aW9uIGFueUZhY3RvcnkodGVzdHMpIHsKICBjb25zdCBjaGVja3MyID0gW107CiAgbGV0IGluZGV4MiA9IC0xOwogIHdoaWxlICgrK2luZGV4MiA8IHRlc3RzLmxlbmd0aCkgewogICAgY2hlY2tzMltpbmRleDJdID0gY29udmVydCh0ZXN0c1tpbmRleDJdKTsKICB9CiAgcmV0dXJuIGNhc3RGYWN0b3J5KGFueSk7CiAgZnVuY3Rpb24gYW55KC4uLnBhcmFtZXRlcnMpIHsKICAgIGxldCBpbmRleDMgPSAtMTsKICAgIHdoaWxlICgrK2luZGV4MyA8IGNoZWNrczIubGVuZ3RoKSB7CiAgICAgIGlmIChjaGVja3MyW2luZGV4M10uYXBwbHkodGhpcywgcGFyYW1ldGVycykpIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KICBfX25hbWUoYW55LCAiYW55Iik7Cn0KX19uYW1lKGFueUZhY3RvcnksICJhbnlGYWN0b3J5Iik7CmZ1bmN0aW9uIHByb3BlcnRpZXNGYWN0b3J5KGNoZWNrKSB7CiAgY29uc3QgY2hlY2tBc1JlY29yZCA9ICgKICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovCiAgICBjaGVjawogICk7CiAgcmV0dXJuIGNhc3RGYWN0b3J5KGFsbDMpOwogIGZ1bmN0aW9uIGFsbDMobm9kZTIpIHsKICAgIGNvbnN0IG5vZGVBc1JlY29yZCA9ICgKICAgICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8KICAgICAgLyoqIEB0eXBlIHt1bmtub3dufSAqLwogICAgICBub2RlMgogICAgKTsKICAgIGxldCBrZXkyOwogICAgZm9yIChrZXkyIGluIGNoZWNrKSB7CiAgICAgIGlmIChub2RlQXNSZWNvcmRba2V5Ml0gIT09IGNoZWNrQXNSZWNvcmRba2V5Ml0pIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KICBfX25hbWUoYWxsMywgImFsbCIpOwp9Cl9fbmFtZShwcm9wZXJ0aWVzRmFjdG9yeSwgInByb3BlcnRpZXNGYWN0b3J5Iik7CmZ1bmN0aW9uIHR5cGVGYWN0b3J5KGNoZWNrKSB7CiAgcmV0dXJuIGNhc3RGYWN0b3J5KHR5cGU1KTsKICBmdW5jdGlvbiB0eXBlNShub2RlMikgewogICAgcmV0dXJuIG5vZGUyICYmIG5vZGUyLnR5cGUgPT09IGNoZWNrOwogIH0KICBfX25hbWUodHlwZTUsICJ0eXBlIik7Cn0KX19uYW1lKHR5cGVGYWN0b3J5LCAidHlwZUZhY3RvcnkiKTsKZnVuY3Rpb24gY2FzdEZhY3RvcnkodGVzdEZ1bmN0aW9uKSB7CiAgcmV0dXJuIGNoZWNrOwogIGZ1bmN0aW9uIGNoZWNrKHZhbHVlMiwgaW5kZXgyLCBwYXJlbnQpIHsKICAgIHJldHVybiBCb29sZWFuKAogICAgICBsb29rc0xpa2VBTm9kZSh2YWx1ZTIpICYmIHRlc3RGdW5jdGlvbi5jYWxsKAogICAgICAgIHRoaXMsCiAgICAgICAgdmFsdWUyLAogICAgICAgIHR5cGVvZiBpbmRleDIgPT09ICJudW1iZXIiID8gaW5kZXgyIDogdm9pZCAwLAogICAgICAgIHBhcmVudCB8fCB2b2lkIDAKICAgICAgKQogICAgKTsKICB9CiAgX19uYW1lKGNoZWNrLCAiY2hlY2siKTsKfQpfX25hbWUoY2FzdEZhY3RvcnksICJjYXN0RmFjdG9yeSIpOwpmdW5jdGlvbiBvazIoKSB7CiAgcmV0dXJuIHRydWU7Cn0KX19uYW1lKG9rMiwgIm9rIik7CmZ1bmN0aW9uIGxvb2tzTGlrZUFOb2RlKHZhbHVlMikgewogIHJldHVybiB2YWx1ZTIgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlMiA9PT0gIm9iamVjdCIgJiYgInR5cGUiIGluIHZhbHVlMjsKfQpfX25hbWUobG9va3NMaWtlQU5vZGUsICJsb29rc0xpa2VBTm9kZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3VuaXN0LXV0aWwtdmlzaXQtcGFyZW50c0A2LjAuMi9ub2RlX21vZHVsZXMvdW5pc3QtdXRpbC12aXNpdC1wYXJlbnRzL2xpYi9jb2xvci5qcwpmdW5jdGlvbiBjb2xvcihkNCkgewogIHJldHVybiBkNDsKfQpfX25hbWUoY29sb3IsICJjb2xvciIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3VuaXN0LXV0aWwtdmlzaXQtcGFyZW50c0A2LjAuMi9ub2RlX21vZHVsZXMvdW5pc3QtdXRpbC12aXNpdC1wYXJlbnRzL2xpYi9pbmRleC5qcwp2YXIgZW1wdHkyID0gW107CnZhciBDT05USU5VRSA9IHRydWU7CnZhciBFWElUID0gZmFsc2U7CnZhciBTS0lQID0gInNraXAiOwpmdW5jdGlvbiB2aXNpdFBhcmVudHModHJlZSwgdGVzdCwgdmlzaXRvciwgcmV2ZXJzZSkgewogIGxldCBjaGVjazsKICBpZiAodHlwZW9mIHRlc3QgPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIHZpc2l0b3IgIT09ICJmdW5jdGlvbiIpIHsKICAgIHJldmVyc2UgPSB2aXNpdG9yOwogICAgdmlzaXRvciA9IHRlc3Q7CiAgfSBlbHNlIHsKICAgIGNoZWNrID0gdGVzdDsKICB9CiAgY29uc3QgaXMzID0gY29udmVydChjaGVjayk7CiAgY29uc3Qgc3RlcCA9IHJldmVyc2UgPyAtMSA6IDE7CiAgZmFjdG9yeSh0cmVlLCB2b2lkIDAsIFtdKSgpOwogIGZ1bmN0aW9uIGZhY3Rvcnkobm9kZTIsIGluZGV4MiwgcGFyZW50cykgewogICAgY29uc3QgdmFsdWUyID0gKAogICAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLwogICAgICBub2RlMiAmJiB0eXBlb2Ygbm9kZTIgPT09ICJvYmplY3QiID8gbm9kZTIgOiB7fQogICAgKTsKICAgIGlmICh0eXBlb2YgdmFsdWUyLnR5cGUgPT09ICJzdHJpbmciKSB7CiAgICAgIGNvbnN0IG5hbWUgPSAoCiAgICAgICAgLy8gYGhhc3RgCiAgICAgICAgdHlwZW9mIHZhbHVlMi50YWdOYW1lID09PSAic3RyaW5nIiA/IHZhbHVlMi50YWdOYW1lIDogKAogICAgICAgICAgLy8gYHhhc3RgCiAgICAgICAgICB0eXBlb2YgdmFsdWUyLm5hbWUgPT09ICJzdHJpbmciID8gdmFsdWUyLm5hbWUgOiB2b2lkIDAKICAgICAgICApCiAgICAgICk7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2aXNpdDIsICJuYW1lIiwgewogICAgICAgIHZhbHVlOiAibm9kZSAoIiArIGNvbG9yKG5vZGUyLnR5cGUgKyAobmFtZSA/ICI8IiArIG5hbWUgKyAiPiIgOiAiIikpICsgIikiCiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIHZpc2l0MjsKICAgIGZ1bmN0aW9uIHZpc2l0MigpIHsKICAgICAgbGV0IHJlc3VsdCA9IGVtcHR5MjsKICAgICAgbGV0IHN1YnJlc3VsdDsKICAgICAgbGV0IG9mZnNldDsKICAgICAgbGV0IGdyYW5kcGFyZW50czsKICAgICAgaWYgKCF0ZXN0IHx8IGlzMyhub2RlMiwgaW5kZXgyLCBwYXJlbnRzW3BhcmVudHMubGVuZ3RoIC0gMV0gfHwgdm9pZCAwKSkgewogICAgICAgIHJlc3VsdCA9IHRvUmVzdWx0KHZpc2l0b3Iobm9kZTIsIHBhcmVudHMpKTsKICAgICAgICBpZiAocmVzdWx0WzBdID09PSBFWElUKSB7CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoImNoaWxkcmVuIiBpbiBub2RlMiAmJiBub2RlMi5jaGlsZHJlbikgewogICAgICAgIGNvbnN0IG5vZGVBc1BhcmVudCA9ICgKICAgICAgICAgIC8qKiBAdHlwZSB7VW5pc3RQYXJlbnR9ICovCiAgICAgICAgICBub2RlMgogICAgICAgICk7CiAgICAgICAgaWYgKG5vZGVBc1BhcmVudC5jaGlsZHJlbiAmJiByZXN1bHRbMF0gIT09IFNLSVApIHsKICAgICAgICAgIG9mZnNldCA9IChyZXZlcnNlID8gbm9kZUFzUGFyZW50LmNoaWxkcmVuLmxlbmd0aCA6IC0xKSArIHN0ZXA7CiAgICAgICAgICBncmFuZHBhcmVudHMgPSBwYXJlbnRzLmNvbmNhdChub2RlQXNQYXJlbnQpOwogICAgICAgICAgd2hpbGUgKG9mZnNldCA+IC0xICYmIG9mZnNldCA8IG5vZGVBc1BhcmVudC5jaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBub2RlQXNQYXJlbnQuY2hpbGRyZW5bb2Zmc2V0XTsKICAgICAgICAgICAgc3VicmVzdWx0ID0gZmFjdG9yeShjaGlsZCwgb2Zmc2V0LCBncmFuZHBhcmVudHMpKCk7CiAgICAgICAgICAgIGlmIChzdWJyZXN1bHRbMF0gPT09IEVYSVQpIHsKICAgICAgICAgICAgICByZXR1cm4gc3VicmVzdWx0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIG9mZnNldCA9IHR5cGVvZiBzdWJyZXN1bHRbMV0gPT09ICJudW1iZXIiID8gc3VicmVzdWx0WzFdIDogb2Zmc2V0ICsgc3RlcDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIF9fbmFtZSh2aXNpdDIsICJ2aXNpdCIpOwogIH0KICBfX25hbWUoZmFjdG9yeSwgImZhY3RvcnkiKTsKfQpfX25hbWUodmlzaXRQYXJlbnRzLCAidmlzaXRQYXJlbnRzIik7CmZ1bmN0aW9uIHRvUmVzdWx0KHZhbHVlMikgewogIGlmIChBcnJheS5pc0FycmF5KHZhbHVlMikpIHsKICAgIHJldHVybiB2YWx1ZTI7CiAgfQogIGlmICh0eXBlb2YgdmFsdWUyID09PSAibnVtYmVyIikgewogICAgcmV0dXJuIFtDT05USU5VRSwgdmFsdWUyXTsKICB9CiAgcmV0dXJuIHZhbHVlMiA9PT0gbnVsbCB8fCB2YWx1ZTIgPT09IHZvaWQgMCA/IGVtcHR5MiA6IFt2YWx1ZTJdOwp9Cl9fbmFtZSh0b1Jlc3VsdCwgInRvUmVzdWx0Iik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC1maW5kLWFuZC1yZXBsYWNlQDMuMC4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLWZpbmQtYW5kLXJlcGxhY2UvbGliL2luZGV4LmpzCmZ1bmN0aW9uIGZpbmRBbmRSZXBsYWNlKHRyZWUsIGxpc3Q1LCBvcHRpb25zKSB7CiAgY29uc3Qgc2V0dGluZ3MgPSBvcHRpb25zIHx8IHt9OwogIGNvbnN0IGlnbm9yZWQgPSBjb252ZXJ0KHNldHRpbmdzLmlnbm9yZSB8fCBbXSk7CiAgY29uc3QgcGFpcnMyID0gdG9QYWlycyhsaXN0NSk7CiAgbGV0IHBhaXJJbmRleCA9IC0xOwogIHdoaWxlICgrK3BhaXJJbmRleCA8IHBhaXJzMi5sZW5ndGgpIHsKICAgIHZpc2l0UGFyZW50cyh0cmVlLCAidGV4dCIsIHZpc2l0b3IpOwogIH0KICBmdW5jdGlvbiB2aXNpdG9yKG5vZGUyLCBwYXJlbnRzKSB7CiAgICBsZXQgaW5kZXgyID0gLTE7CiAgICBsZXQgZ3JhbmRwYXJlbnQ7CiAgICB3aGlsZSAoKytpbmRleDIgPCBwYXJlbnRzLmxlbmd0aCkgewogICAgICBjb25zdCBwYXJlbnQgPSBwYXJlbnRzW2luZGV4Ml07CiAgICAgIGNvbnN0IHNpYmxpbmdzMiA9IGdyYW5kcGFyZW50ID8gZ3JhbmRwYXJlbnQuY2hpbGRyZW4gOiB2b2lkIDA7CiAgICAgIGlmIChpZ25vcmVkKAogICAgICAgIHBhcmVudCwKICAgICAgICBzaWJsaW5nczIgPyBzaWJsaW5nczIuaW5kZXhPZihwYXJlbnQpIDogdm9pZCAwLAogICAgICAgIGdyYW5kcGFyZW50CiAgICAgICkpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgZ3JhbmRwYXJlbnQgPSBwYXJlbnQ7CiAgICB9CiAgICBpZiAoZ3JhbmRwYXJlbnQpIHsKICAgICAgcmV0dXJuIGhhbmRsZXIyKG5vZGUyLCBwYXJlbnRzKTsKICAgIH0KICB9CiAgX19uYW1lKHZpc2l0b3IsICJ2aXNpdG9yIik7CiAgZnVuY3Rpb24gaGFuZGxlcjIobm9kZTIsIHBhcmVudHMpIHsKICAgIGNvbnN0IHBhcmVudCA9IHBhcmVudHNbcGFyZW50cy5sZW5ndGggLSAxXTsKICAgIGNvbnN0IGZpbmQzID0gcGFpcnMyW3BhaXJJbmRleF1bMF07CiAgICBjb25zdCByZXBsYWNlMyA9IHBhaXJzMltwYWlySW5kZXhdWzFdOwogICAgbGV0IHN0YXJ0ID0gMDsKICAgIGNvbnN0IHNpYmxpbmdzMiA9IHBhcmVudC5jaGlsZHJlbjsKICAgIGNvbnN0IGluZGV4MiA9IHNpYmxpbmdzMi5pbmRleE9mKG5vZGUyKTsKICAgIGxldCBjaGFuZ2UgPSBmYWxzZTsKICAgIGxldCBub2RlcyA9IFtdOwogICAgZmluZDMubGFzdEluZGV4ID0gMDsKICAgIGxldCBtYXRjaDIgPSBmaW5kMy5leGVjKG5vZGUyLnZhbHVlKTsKICAgIHdoaWxlIChtYXRjaDIpIHsKICAgICAgY29uc3QgcG9zaXRpb24zID0gbWF0Y2gyLmluZGV4OwogICAgICBjb25zdCBtYXRjaE9iamVjdCA9IHsKICAgICAgICBpbmRleDogbWF0Y2gyLmluZGV4LAogICAgICAgIGlucHV0OiBtYXRjaDIuaW5wdXQsCiAgICAgICAgc3RhY2s6IFsuLi5wYXJlbnRzLCBub2RlMl0KICAgICAgfTsKICAgICAgbGV0IHZhbHVlMiA9IHJlcGxhY2UzKC4uLm1hdGNoMiwgbWF0Y2hPYmplY3QpOwogICAgICBpZiAodHlwZW9mIHZhbHVlMiA9PT0gInN0cmluZyIpIHsKICAgICAgICB2YWx1ZTIgPSB2YWx1ZTIubGVuZ3RoID4gMCA/IHsgdHlwZTogInRleHQiLCB2YWx1ZTogdmFsdWUyIH0gOiB2b2lkIDA7CiAgICAgIH0KICAgICAgaWYgKHZhbHVlMiA9PT0gZmFsc2UpIHsKICAgICAgICBmaW5kMy5sYXN0SW5kZXggPSBwb3NpdGlvbjMgKyAxOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChzdGFydCAhPT0gcG9zaXRpb24zKSB7CiAgICAgICAgICBub2Rlcy5wdXNoKHsKICAgICAgICAgICAgdHlwZTogInRleHQiLAogICAgICAgICAgICB2YWx1ZTogbm9kZTIudmFsdWUuc2xpY2Uoc3RhcnQsIHBvc2l0aW9uMykKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZTIpKSB7CiAgICAgICAgICBub2Rlcy5wdXNoKC4uLnZhbHVlMik7CiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZTIpIHsKICAgICAgICAgIG5vZGVzLnB1c2godmFsdWUyKTsKICAgICAgICB9CiAgICAgICAgc3RhcnQgPSBwb3NpdGlvbjMgKyBtYXRjaDJbMF0ubGVuZ3RoOwogICAgICAgIGNoYW5nZSA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKCFmaW5kMy5nbG9iYWwpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBtYXRjaDIgPSBmaW5kMy5leGVjKG5vZGUyLnZhbHVlKTsKICAgIH0KICAgIGlmIChjaGFuZ2UpIHsKICAgICAgaWYgKHN0YXJ0IDwgbm9kZTIudmFsdWUubGVuZ3RoKSB7CiAgICAgICAgbm9kZXMucHVzaCh7IHR5cGU6ICJ0ZXh0IiwgdmFsdWU6IG5vZGUyLnZhbHVlLnNsaWNlKHN0YXJ0KSB9KTsKICAgICAgfQogICAgICBwYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4MiwgMSwgLi4ubm9kZXMpOwogICAgfSBlbHNlIHsKICAgICAgbm9kZXMgPSBbbm9kZTJdOwogICAgfQogICAgcmV0dXJuIGluZGV4MiArIG5vZGVzLmxlbmd0aDsKICB9CiAgX19uYW1lKGhhbmRsZXIyLCAiaGFuZGxlciIpOwp9Cl9fbmFtZShmaW5kQW5kUmVwbGFjZSwgImZpbmRBbmRSZXBsYWNlIik7CmZ1bmN0aW9uIHRvUGFpcnModHVwbGVPckxpc3QpIHsKICBjb25zdCByZXN1bHQgPSBbXTsKICBpZiAoIUFycmF5LmlzQXJyYXkodHVwbGVPckxpc3QpKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJFeHBlY3RlZCBmaW5kIGFuZCByZXBsYWNlIHR1cGxlIG9yIGxpc3Qgb2YgdHVwbGVzIik7CiAgfQogIGNvbnN0IGxpc3Q1ID0gIXR1cGxlT3JMaXN0WzBdIHx8IEFycmF5LmlzQXJyYXkodHVwbGVPckxpc3RbMF0pID8gdHVwbGVPckxpc3QgOiBbdHVwbGVPckxpc3RdOwogIGxldCBpbmRleDIgPSAtMTsKICB3aGlsZSAoKytpbmRleDIgPCBsaXN0NS5sZW5ndGgpIHsKICAgIGNvbnN0IHR1cGxlID0gbGlzdDVbaW5kZXgyXTsKICAgIHJlc3VsdC5wdXNoKFt0b0V4cHJlc3Npb24odHVwbGVbMF0pLCB0b0Z1bmN0aW9uKHR1cGxlWzFdKV0pOwogIH0KICByZXR1cm4gcmVzdWx0Owp9Cl9fbmFtZSh0b1BhaXJzLCAidG9QYWlycyIpOwpmdW5jdGlvbiB0b0V4cHJlc3Npb24oZmluZDMpIHsKICByZXR1cm4gdHlwZW9mIGZpbmQzID09PSAic3RyaW5nIiA/IG5ldyBSZWdFeHAoZXNjYXBlU3RyaW5nUmVnZXhwKGZpbmQzKSwgImciKSA6IGZpbmQzOwp9Cl9fbmFtZSh0b0V4cHJlc3Npb24sICJ0b0V4cHJlc3Npb24iKTsKZnVuY3Rpb24gdG9GdW5jdGlvbihyZXBsYWNlMykgewogIHJldHVybiB0eXBlb2YgcmVwbGFjZTMgPT09ICJmdW5jdGlvbiIgPyByZXBsYWNlMyA6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHJlcGxhY2UzOwogIH07Cn0KX19uYW1lKHRvRnVuY3Rpb24sICJ0b0Z1bmN0aW9uIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC1nZm0tYXV0b2xpbmstbGl0ZXJhbEAyLjAuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1nZm0tYXV0b2xpbmstbGl0ZXJhbC9saWIvaW5kZXguanMKdmFyIGluQ29uc3RydWN0ID0gInBocmFzaW5nIjsKdmFyIG5vdEluQ29uc3RydWN0ID0gWyJhdXRvbGluayIsICJsaW5rIiwgImltYWdlIiwgImxhYmVsIl07CmZ1bmN0aW9uIGdmbUF1dG9saW5rTGl0ZXJhbEZyb21NYXJrZG93bigpIHsKICByZXR1cm4gewogICAgdHJhbnNmb3JtczogW3RyYW5zZm9ybUdmbUF1dG9saW5rTGl0ZXJhbHNdLAogICAgZW50ZXI6IHsKICAgICAgbGl0ZXJhbEF1dG9saW5rOiBlbnRlckxpdGVyYWxBdXRvbGluaywKICAgICAgbGl0ZXJhbEF1dG9saW5rRW1haWw6IGVudGVyTGl0ZXJhbEF1dG9saW5rVmFsdWUsCiAgICAgIGxpdGVyYWxBdXRvbGlua0h0dHA6IGVudGVyTGl0ZXJhbEF1dG9saW5rVmFsdWUsCiAgICAgIGxpdGVyYWxBdXRvbGlua1d3dzogZW50ZXJMaXRlcmFsQXV0b2xpbmtWYWx1ZQogICAgfSwKICAgIGV4aXQ6IHsKICAgICAgbGl0ZXJhbEF1dG9saW5rOiBleGl0TGl0ZXJhbEF1dG9saW5rLAogICAgICBsaXRlcmFsQXV0b2xpbmtFbWFpbDogZXhpdExpdGVyYWxBdXRvbGlua0VtYWlsLAogICAgICBsaXRlcmFsQXV0b2xpbmtIdHRwOiBleGl0TGl0ZXJhbEF1dG9saW5rSHR0cCwKICAgICAgbGl0ZXJhbEF1dG9saW5rV3d3OiBleGl0TGl0ZXJhbEF1dG9saW5rV3d3CiAgICB9CiAgfTsKfQpfX25hbWUoZ2ZtQXV0b2xpbmtMaXRlcmFsRnJvbU1hcmtkb3duLCAiZ2ZtQXV0b2xpbmtMaXRlcmFsRnJvbU1hcmtkb3duIik7CmZ1bmN0aW9uIGdmbUF1dG9saW5rTGl0ZXJhbFRvTWFya2Rvd24oKSB7CiAgcmV0dXJuIHsKICAgIHVuc2FmZTogWwogICAgICB7CiAgICAgICAgY2hhcmFjdGVyOiAiQCIsCiAgICAgICAgYmVmb3JlOiAiWytcXC0uXFx3XSIsCiAgICAgICAgYWZ0ZXI6ICJbXFwtLlxcd10iLAogICAgICAgIGluQ29uc3RydWN0LAogICAgICAgIG5vdEluQ29uc3RydWN0CiAgICAgIH0sCiAgICAgIHsKICAgICAgICBjaGFyYWN0ZXI6ICIuIiwKICAgICAgICBiZWZvcmU6ICJbV3ddIiwKICAgICAgICBhZnRlcjogIltcXC0uXFx3XSIsCiAgICAgICAgaW5Db25zdHJ1Y3QsCiAgICAgICAgbm90SW5Db25zdHJ1Y3QKICAgICAgfSwKICAgICAgewogICAgICAgIGNoYXJhY3RlcjogIjoiLAogICAgICAgIGJlZm9yZTogIltwc10iLAogICAgICAgIGFmdGVyOiAiXFwvIiwKICAgICAgICBpbkNvbnN0cnVjdCwKICAgICAgICBub3RJbkNvbnN0cnVjdAogICAgICB9CiAgICBdCiAgfTsKfQpfX25hbWUoZ2ZtQXV0b2xpbmtMaXRlcmFsVG9NYXJrZG93biwgImdmbUF1dG9saW5rTGl0ZXJhbFRvTWFya2Rvd24iKTsKZnVuY3Rpb24gZW50ZXJMaXRlcmFsQXV0b2xpbmsodG9rZW4pIHsKICB0aGlzLmVudGVyKHsgdHlwZTogImxpbmsiLCB0aXRsZTogbnVsbCwgdXJsOiAiIiwgY2hpbGRyZW46IFtdIH0sIHRva2VuKTsKfQpfX25hbWUoZW50ZXJMaXRlcmFsQXV0b2xpbmssICJlbnRlckxpdGVyYWxBdXRvbGluayIpOwpmdW5jdGlvbiBlbnRlckxpdGVyYWxBdXRvbGlua1ZhbHVlKHRva2VuKSB7CiAgdGhpcy5jb25maWcuZW50ZXIuYXV0b2xpbmtQcm90b2NvbC5jYWxsKHRoaXMsIHRva2VuKTsKfQpfX25hbWUoZW50ZXJMaXRlcmFsQXV0b2xpbmtWYWx1ZSwgImVudGVyTGl0ZXJhbEF1dG9saW5rVmFsdWUiKTsKZnVuY3Rpb24gZXhpdExpdGVyYWxBdXRvbGlua0h0dHAodG9rZW4pIHsKICB0aGlzLmNvbmZpZy5leGl0LmF1dG9saW5rUHJvdG9jb2wuY2FsbCh0aGlzLCB0b2tlbik7Cn0KX19uYW1lKGV4aXRMaXRlcmFsQXV0b2xpbmtIdHRwLCAiZXhpdExpdGVyYWxBdXRvbGlua0h0dHAiKTsKZnVuY3Rpb24gZXhpdExpdGVyYWxBdXRvbGlua1d3dyh0b2tlbikgewogIHRoaXMuY29uZmlnLmV4aXQuZGF0YS5jYWxsKHRoaXMsIHRva2VuKTsKICBjb25zdCBub2RlMiA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTsKICBvayhub2RlMi50eXBlID09PSAibGluayIpOwogIG5vZGUyLnVybCA9ICJodHRwOi8vIiArIHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pOwp9Cl9fbmFtZShleGl0TGl0ZXJhbEF1dG9saW5rV3d3LCAiZXhpdExpdGVyYWxBdXRvbGlua1d3dyIpOwpmdW5jdGlvbiBleGl0TGl0ZXJhbEF1dG9saW5rRW1haWwodG9rZW4pIHsKICB0aGlzLmNvbmZpZy5leGl0LmF1dG9saW5rRW1haWwuY2FsbCh0aGlzLCB0b2tlbik7Cn0KX19uYW1lKGV4aXRMaXRlcmFsQXV0b2xpbmtFbWFpbCwgImV4aXRMaXRlcmFsQXV0b2xpbmtFbWFpbCIpOwpmdW5jdGlvbiBleGl0TGl0ZXJhbEF1dG9saW5rKHRva2VuKSB7CiAgdGhpcy5leGl0KHRva2VuKTsKfQpfX25hbWUoZXhpdExpdGVyYWxBdXRvbGluaywgImV4aXRMaXRlcmFsQXV0b2xpbmsiKTsKZnVuY3Rpb24gdHJhbnNmb3JtR2ZtQXV0b2xpbmtMaXRlcmFscyh0cmVlKSB7CiAgZmluZEFuZFJlcGxhY2UoCiAgICB0cmVlLAogICAgWwogICAgICBbLyhodHRwcz86XC9cL3x3d3coPz1cLikpKFstLlx3XSspKFteIFx0XHJcbl0qKS9naSwgZmluZFVybF0sCiAgICAgIFsvKD88PV58XHN8XHB7UH18XHB7U30pKFstLlx3K10rKUAoWy1cd10rKD86XC5bLVx3XSspKykvZ3UsIGZpbmRFbWFpbF0KICAgIF0sCiAgICB7IGlnbm9yZTogWyJsaW5rIiwgImxpbmtSZWZlcmVuY2UiXSB9CiAgKTsKfQpfX25hbWUodHJhbnNmb3JtR2ZtQXV0b2xpbmtMaXRlcmFscywgInRyYW5zZm9ybUdmbUF1dG9saW5rTGl0ZXJhbHMiKTsKZnVuY3Rpb24gZmluZFVybChfMywgcHJvdG9jb2wsIGRvbWFpbjIsIHBhdGgyLCBtYXRjaDIpIHsKICBsZXQgcHJlZml4ID0gIiI7CiAgaWYgKCFwcmV2aW91cyhtYXRjaDIpKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGlmICgvXncvaS50ZXN0KHByb3RvY29sKSkgewogICAgZG9tYWluMiA9IHByb3RvY29sICsgZG9tYWluMjsKICAgIHByb3RvY29sID0gIiI7CiAgICBwcmVmaXggPSAiaHR0cDovLyI7CiAgfQogIGlmICghaXNDb3JyZWN0RG9tYWluKGRvbWFpbjIpKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGNvbnN0IHBhcnRzID0gc3BsaXRVcmwoZG9tYWluMiArIHBhdGgyKTsKICBpZiAoIXBhcnRzWzBdKSByZXR1cm4gZmFsc2U7CiAgY29uc3QgcmVzdWx0ID0gewogICAgdHlwZTogImxpbmsiLAogICAgdGl0bGU6IG51bGwsCiAgICB1cmw6IHByZWZpeCArIHByb3RvY29sICsgcGFydHNbMF0sCiAgICBjaGlsZHJlbjogW3sgdHlwZTogInRleHQiLCB2YWx1ZTogcHJvdG9jb2wgKyBwYXJ0c1swXSB9XQogIH07CiAgaWYgKHBhcnRzWzFdKSB7CiAgICByZXR1cm4gW3Jlc3VsdCwgeyB0eXBlOiAidGV4dCIsIHZhbHVlOiBwYXJ0c1sxXSB9XTsKICB9CiAgcmV0dXJuIHJlc3VsdDsKfQpfX25hbWUoZmluZFVybCwgImZpbmRVcmwiKTsKZnVuY3Rpb24gZmluZEVtYWlsKF8zLCBhdGV4dCwgbGFiZWwsIG1hdGNoMikgewogIGlmICgKICAgIC8vIE5vdCBhbiBleHBlY3RlZCBwcmV2aW91cyBjaGFyYWN0ZXIuCiAgICAhcHJldmlvdXMobWF0Y2gyLCB0cnVlKSB8fCAvLyBMYWJlbCBlbmRzIGluIG5vdCBhbGxvd2VkIGNoYXJhY3Rlci4KICAgIC9bLVxkX10kLy50ZXN0KGxhYmVsKQogICkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICByZXR1cm4gewogICAgdHlwZTogImxpbmsiLAogICAgdGl0bGU6IG51bGwsCiAgICB1cmw6ICJtYWlsdG86IiArIGF0ZXh0ICsgIkAiICsgbGFiZWwsCiAgICBjaGlsZHJlbjogW3sgdHlwZTogInRleHQiLCB2YWx1ZTogYXRleHQgKyAiQCIgKyBsYWJlbCB9XQogIH07Cn0KX19uYW1lKGZpbmRFbWFpbCwgImZpbmRFbWFpbCIpOwpmdW5jdGlvbiBpc0NvcnJlY3REb21haW4oZG9tYWluMikgewogIGNvbnN0IHBhcnRzID0gZG9tYWluMi5zcGxpdCgiLiIpOwogIGlmIChwYXJ0cy5sZW5ndGggPCAyIHx8IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdICYmICgvXy8udGVzdChwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXSkgfHwgIS9bYS16QS1aXGRdLy50ZXN0KHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdKSkgfHwgcGFydHNbcGFydHMubGVuZ3RoIC0gMl0gJiYgKC9fLy50ZXN0KHBhcnRzW3BhcnRzLmxlbmd0aCAtIDJdKSB8fCAhL1thLXpBLVpcZF0vLnRlc3QocGFydHNbcGFydHMubGVuZ3RoIC0gMl0pKSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICByZXR1cm4gdHJ1ZTsKfQpfX25hbWUoaXNDb3JyZWN0RG9tYWluLCAiaXNDb3JyZWN0RG9tYWluIik7CmZ1bmN0aW9uIHNwbGl0VXJsKHVybCkgewogIGNvbnN0IHRyYWlsRXhlYyA9IC9bISImJyksLjo7PD4/XF19XSskLy5leGVjKHVybCk7CiAgaWYgKCF0cmFpbEV4ZWMpIHsKICAgIHJldHVybiBbdXJsLCB2b2lkIDBdOwogIH0KICB1cmwgPSB1cmwuc2xpY2UoMCwgdHJhaWxFeGVjLmluZGV4KTsKICBsZXQgdHJhaWwyID0gdHJhaWxFeGVjWzBdOwogIGxldCBjbG9zaW5nUGFyZW5JbmRleCA9IHRyYWlsMi5pbmRleE9mKCIpIik7CiAgY29uc3Qgb3BlbmluZ1BhcmVucyA9IGNjb3VudCh1cmwsICIoIik7CiAgbGV0IGNsb3NpbmdQYXJlbnMgPSBjY291bnQodXJsLCAiKSIpOwogIHdoaWxlIChjbG9zaW5nUGFyZW5JbmRleCAhPT0gLTEgJiYgb3BlbmluZ1BhcmVucyA+IGNsb3NpbmdQYXJlbnMpIHsKICAgIHVybCArPSB0cmFpbDIuc2xpY2UoMCwgY2xvc2luZ1BhcmVuSW5kZXggKyAxKTsKICAgIHRyYWlsMiA9IHRyYWlsMi5zbGljZShjbG9zaW5nUGFyZW5JbmRleCArIDEpOwogICAgY2xvc2luZ1BhcmVuSW5kZXggPSB0cmFpbDIuaW5kZXhPZigiKSIpOwogICAgY2xvc2luZ1BhcmVucysrOwogIH0KICByZXR1cm4gW3VybCwgdHJhaWwyXTsKfQpfX25hbWUoc3BsaXRVcmwsICJzcGxpdFVybCIpOwpmdW5jdGlvbiBwcmV2aW91cyhtYXRjaDIsIGVtYWlsKSB7CiAgY29uc3QgY29kZTQgPSBtYXRjaDIuaW5wdXQuY2hhckNvZGVBdChtYXRjaDIuaW5kZXggLSAxKTsKICByZXR1cm4gKG1hdGNoMi5pbmRleCA9PT0gMCB8fCB1bmljb2RlV2hpdGVzcGFjZShjb2RlNCkgfHwgdW5pY29kZVB1bmN0dWF0aW9uKGNvZGU0KSkgJiYgLy8gSWYgaXTigJlzIGFuIGVtYWlsLCB0aGUgcHJldmlvdXMgY2hhcmFjdGVyIHNob3VsZCBub3QgYmUgYSBzbGFzaC4KICAoIWVtYWlsIHx8IGNvZGU0ICE9PSA0Nyk7Cn0KX19uYW1lKHByZXZpb3VzLCAicHJldmlvdXMiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstdXRpbC1ub3JtYWxpemUtaWRlbnRpZmllckAyLjAuMS9ub2RlX21vZHVsZXMvbWljcm9tYXJrLXV0aWwtbm9ybWFsaXplLWlkZW50aWZpZXIvaW5kZXguanMKZnVuY3Rpb24gbm9ybWFsaXplSWRlbnRpZmllcih2YWx1ZTIpIHsKICByZXR1cm4gdmFsdWUyLnJlcGxhY2UoL1tcdFxuXHIgXSsvZywgIiAiKS5yZXBsYWNlKC9eIHwgJC9nLCAiIikudG9Mb3dlckNhc2UoKS50b1VwcGVyQ2FzZSgpOwp9Cl9fbmFtZShub3JtYWxpemVJZGVudGlmaWVyLCAibm9ybWFsaXplSWRlbnRpZmllciIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtZ2ZtLWZvb3Rub3RlQDIuMS4wL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLWdmbS1mb290bm90ZS9saWIvaW5kZXguanMKZm9vdG5vdGVSZWZlcmVuY2UucGVlayA9IGZvb3Rub3RlUmVmZXJlbmNlUGVlazsKZnVuY3Rpb24gZW50ZXJGb290bm90ZUNhbGxTdHJpbmcoKSB7CiAgdGhpcy5idWZmZXIoKTsKfQpfX25hbWUoZW50ZXJGb290bm90ZUNhbGxTdHJpbmcsICJlbnRlckZvb3Rub3RlQ2FsbFN0cmluZyIpOwpmdW5jdGlvbiBlbnRlckZvb3Rub3RlQ2FsbCh0b2tlbikgewogIHRoaXMuZW50ZXIoeyB0eXBlOiAiZm9vdG5vdGVSZWZlcmVuY2UiLCBpZGVudGlmaWVyOiAiIiwgbGFiZWw6ICIiIH0sIHRva2VuKTsKfQpfX25hbWUoZW50ZXJGb290bm90ZUNhbGwsICJlbnRlckZvb3Rub3RlQ2FsbCIpOwpmdW5jdGlvbiBlbnRlckZvb3Rub3RlRGVmaW5pdGlvbkxhYmVsU3RyaW5nKCkgewogIHRoaXMuYnVmZmVyKCk7Cn0KX19uYW1lKGVudGVyRm9vdG5vdGVEZWZpbml0aW9uTGFiZWxTdHJpbmcsICJlbnRlckZvb3Rub3RlRGVmaW5pdGlvbkxhYmVsU3RyaW5nIik7CmZ1bmN0aW9uIGVudGVyRm9vdG5vdGVEZWZpbml0aW9uKHRva2VuKSB7CiAgdGhpcy5lbnRlcigKICAgIHsgdHlwZTogImZvb3Rub3RlRGVmaW5pdGlvbiIsIGlkZW50aWZpZXI6ICIiLCBsYWJlbDogIiIsIGNoaWxkcmVuOiBbXSB9LAogICAgdG9rZW4KICApOwp9Cl9fbmFtZShlbnRlckZvb3Rub3RlRGVmaW5pdGlvbiwgImVudGVyRm9vdG5vdGVEZWZpbml0aW9uIik7CmZ1bmN0aW9uIGV4aXRGb290bm90ZUNhbGxTdHJpbmcodG9rZW4pIHsKICBjb25zdCBsYWJlbCA9IHRoaXMucmVzdW1lKCk7CiAgY29uc3Qgbm9kZTIgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgb2sobm9kZTIudHlwZSA9PT0gImZvb3Rub3RlUmVmZXJlbmNlIik7CiAgbm9kZTIuaWRlbnRpZmllciA9IG5vcm1hbGl6ZUlkZW50aWZpZXIoCiAgICB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKQogICkudG9Mb3dlckNhc2UoKTsKICBub2RlMi5sYWJlbCA9IGxhYmVsOwp9Cl9fbmFtZShleGl0Rm9vdG5vdGVDYWxsU3RyaW5nLCAiZXhpdEZvb3Rub3RlQ2FsbFN0cmluZyIpOwpmdW5jdGlvbiBleGl0Rm9vdG5vdGVDYWxsKHRva2VuKSB7CiAgdGhpcy5leGl0KHRva2VuKTsKfQpfX25hbWUoZXhpdEZvb3Rub3RlQ2FsbCwgImV4aXRGb290bm90ZUNhbGwiKTsKZnVuY3Rpb24gZXhpdEZvb3Rub3RlRGVmaW5pdGlvbkxhYmVsU3RyaW5nKHRva2VuKSB7CiAgY29uc3QgbGFiZWwgPSB0aGlzLnJlc3VtZSgpOwogIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogIG9rKG5vZGUyLnR5cGUgPT09ICJmb290bm90ZURlZmluaXRpb24iKTsKICBub2RlMi5pZGVudGlmaWVyID0gbm9ybWFsaXplSWRlbnRpZmllcigKICAgIHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pCiAgKS50b0xvd2VyQ2FzZSgpOwogIG5vZGUyLmxhYmVsID0gbGFiZWw7Cn0KX19uYW1lKGV4aXRGb290bm90ZURlZmluaXRpb25MYWJlbFN0cmluZywgImV4aXRGb290bm90ZURlZmluaXRpb25MYWJlbFN0cmluZyIpOwpmdW5jdGlvbiBleGl0Rm9vdG5vdGVEZWZpbml0aW9uKHRva2VuKSB7CiAgdGhpcy5leGl0KHRva2VuKTsKfQpfX25hbWUoZXhpdEZvb3Rub3RlRGVmaW5pdGlvbiwgImV4aXRGb290bm90ZURlZmluaXRpb24iKTsKZnVuY3Rpb24gZm9vdG5vdGVSZWZlcmVuY2VQZWVrKCkgewogIHJldHVybiAiWyI7Cn0KX19uYW1lKGZvb3Rub3RlUmVmZXJlbmNlUGVlaywgImZvb3Rub3RlUmVmZXJlbmNlUGVlayIpOwpmdW5jdGlvbiBmb290bm90ZVJlZmVyZW5jZShub2RlMiwgXzMsIHN0YXRlLCBpbmZvKSB7CiAgY29uc3QgdHJhY2tlciA9IHN0YXRlLmNyZWF0ZVRyYWNrZXIoaW5mbyk7CiAgbGV0IHZhbHVlMiA9IHRyYWNrZXIubW92ZSgiW14iKTsKICBjb25zdCBleGl0MyA9IHN0YXRlLmVudGVyKCJmb290bm90ZVJlZmVyZW5jZSIpOwogIGNvbnN0IHN1YmV4aXQgPSBzdGF0ZS5lbnRlcigicmVmZXJlbmNlIik7CiAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgKICAgIHN0YXRlLnNhZmUoc3RhdGUuYXNzb2NpYXRpb25JZChub2RlMiksIHsgYWZ0ZXI6ICJdIiwgYmVmb3JlOiB2YWx1ZTIgfSkKICApOwogIHN1YmV4aXQoKTsKICBleGl0MygpOwogIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoIl0iKTsKICByZXR1cm4gdmFsdWUyOwp9Cl9fbmFtZShmb290bm90ZVJlZmVyZW5jZSwgImZvb3Rub3RlUmVmZXJlbmNlIik7CmZ1bmN0aW9uIGdmbUZvb3Rub3RlRnJvbU1hcmtkb3duKCkgewogIHJldHVybiB7CiAgICBlbnRlcjogewogICAgICBnZm1Gb290bm90ZUNhbGxTdHJpbmc6IGVudGVyRm9vdG5vdGVDYWxsU3RyaW5nLAogICAgICBnZm1Gb290bm90ZUNhbGw6IGVudGVyRm9vdG5vdGVDYWxsLAogICAgICBnZm1Gb290bm90ZURlZmluaXRpb25MYWJlbFN0cmluZzogZW50ZXJGb290bm90ZURlZmluaXRpb25MYWJlbFN0cmluZywKICAgICAgZ2ZtRm9vdG5vdGVEZWZpbml0aW9uOiBlbnRlckZvb3Rub3RlRGVmaW5pdGlvbgogICAgfSwKICAgIGV4aXQ6IHsKICAgICAgZ2ZtRm9vdG5vdGVDYWxsU3RyaW5nOiBleGl0Rm9vdG5vdGVDYWxsU3RyaW5nLAogICAgICBnZm1Gb290bm90ZUNhbGw6IGV4aXRGb290bm90ZUNhbGwsCiAgICAgIGdmbUZvb3Rub3RlRGVmaW5pdGlvbkxhYmVsU3RyaW5nOiBleGl0Rm9vdG5vdGVEZWZpbml0aW9uTGFiZWxTdHJpbmcsCiAgICAgIGdmbUZvb3Rub3RlRGVmaW5pdGlvbjogZXhpdEZvb3Rub3RlRGVmaW5pdGlvbgogICAgfQogIH07Cn0KX19uYW1lKGdmbUZvb3Rub3RlRnJvbU1hcmtkb3duLCAiZ2ZtRm9vdG5vdGVGcm9tTWFya2Rvd24iKTsKZnVuY3Rpb24gZ2ZtRm9vdG5vdGVUb01hcmtkb3duKG9wdGlvbnMpIHsKICBsZXQgZmlyc3RMaW5lQmxhbmsgPSBmYWxzZTsKICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmZpcnN0TGluZUJsYW5rKSB7CiAgICBmaXJzdExpbmVCbGFuayA9IHRydWU7CiAgfQogIHJldHVybiB7CiAgICBoYW5kbGVyczogeyBmb290bm90ZURlZmluaXRpb24sIGZvb3Rub3RlUmVmZXJlbmNlIH0sCiAgICAvLyBUaGlzIGlzIG9uIGJ5IGRlZmF1bHQgYWxyZWFkeS4KICAgIHVuc2FmZTogW3sgY2hhcmFjdGVyOiAiWyIsIGluQ29uc3RydWN0OiBbImxhYmVsIiwgInBocmFzaW5nIiwgInJlZmVyZW5jZSJdIH1dCiAgfTsKICBmdW5jdGlvbiBmb290bm90ZURlZmluaXRpb24obm9kZTIsIF8zLCBzdGF0ZSwgaW5mbykgewogICAgY29uc3QgdHJhY2tlciA9IHN0YXRlLmNyZWF0ZVRyYWNrZXIoaW5mbyk7CiAgICBsZXQgdmFsdWUyID0gdHJhY2tlci5tb3ZlKCJbXiIpOwogICAgY29uc3QgZXhpdDMgPSBzdGF0ZS5lbnRlcigiZm9vdG5vdGVEZWZpbml0aW9uIik7CiAgICBjb25zdCBzdWJleGl0ID0gc3RhdGUuZW50ZXIoImxhYmVsIik7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKAogICAgICBzdGF0ZS5zYWZlKHN0YXRlLmFzc29jaWF0aW9uSWQobm9kZTIpLCB7IGJlZm9yZTogdmFsdWUyLCBhZnRlcjogIl0iIH0pCiAgICApOwogICAgc3ViZXhpdCgpOwogICAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgiXToiKTsKICAgIGlmIChub2RlMi5jaGlsZHJlbiAmJiBub2RlMi5jaGlsZHJlbi5sZW5ndGggPiAwKSB7CiAgICAgIHRyYWNrZXIuc2hpZnQoNCk7CiAgICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoCiAgICAgICAgKGZpcnN0TGluZUJsYW5rID8gIlxuIiA6ICIgIikgKyBzdGF0ZS5pbmRlbnRMaW5lcygKICAgICAgICAgIHN0YXRlLmNvbnRhaW5lckZsb3cobm9kZTIsIHRyYWNrZXIuY3VycmVudCgpKSwKICAgICAgICAgIGZpcnN0TGluZUJsYW5rID8gbWFwQWxsIDogbWFwRXhjZXB0Rmlyc3QKICAgICAgICApCiAgICAgICk7CiAgICB9CiAgICBleGl0MygpOwogICAgcmV0dXJuIHZhbHVlMjsKICB9CiAgX19uYW1lKGZvb3Rub3RlRGVmaW5pdGlvbiwgImZvb3Rub3RlRGVmaW5pdGlvbiIpOwp9Cl9fbmFtZShnZm1Gb290bm90ZVRvTWFya2Rvd24sICJnZm1Gb290bm90ZVRvTWFya2Rvd24iKTsKZnVuY3Rpb24gbWFwRXhjZXB0Rmlyc3QobGluZSwgaW5kZXgyLCBibGFuaykgewogIHJldHVybiBpbmRleDIgPT09IDAgPyBsaW5lIDogbWFwQWxsKGxpbmUsIGluZGV4MiwgYmxhbmspOwp9Cl9fbmFtZShtYXBFeGNlcHRGaXJzdCwgIm1hcEV4Y2VwdEZpcnN0Iik7CmZ1bmN0aW9uIG1hcEFsbChsaW5lLCBpbmRleDIsIGJsYW5rKSB7CiAgcmV0dXJuIChibGFuayA/ICIiIDogIiAgICAiKSArIGxpbmU7Cn0KX19uYW1lKG1hcEFsbCwgIm1hcEFsbCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtZ2ZtLXN0cmlrZXRocm91Z2hAMi4wLjAvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtZ2ZtLXN0cmlrZXRocm91Z2gvbGliL2luZGV4LmpzCnZhciBjb25zdHJ1Y3RzV2l0aG91dFN0cmlrZXRocm91Z2ggPSBbCiAgImF1dG9saW5rIiwKICAiZGVzdGluYXRpb25MaXRlcmFsIiwKICAiZGVzdGluYXRpb25SYXciLAogICJyZWZlcmVuY2UiLAogICJ0aXRsZVF1b3RlIiwKICAidGl0bGVBcG9zdHJvcGhlIgpdOwpoYW5kbGVEZWxldGUucGVlayA9IHBlZWtEZWxldGU7CmZ1bmN0aW9uIGdmbVN0cmlrZXRocm91Z2hGcm9tTWFya2Rvd24oKSB7CiAgcmV0dXJuIHsKICAgIGNhbkNvbnRhaW5Fb2xzOiBbImRlbGV0ZSJdLAogICAgZW50ZXI6IHsgc3RyaWtldGhyb3VnaDogZW50ZXJTdHJpa2V0aHJvdWdoIH0sCiAgICBleGl0OiB7IHN0cmlrZXRocm91Z2g6IGV4aXRTdHJpa2V0aHJvdWdoIH0KICB9Owp9Cl9fbmFtZShnZm1TdHJpa2V0aHJvdWdoRnJvbU1hcmtkb3duLCAiZ2ZtU3RyaWtldGhyb3VnaEZyb21NYXJrZG93biIpOwpmdW5jdGlvbiBnZm1TdHJpa2V0aHJvdWdoVG9NYXJrZG93bigpIHsKICByZXR1cm4gewogICAgdW5zYWZlOiBbCiAgICAgIHsKICAgICAgICBjaGFyYWN0ZXI6ICJ+IiwKICAgICAgICBpbkNvbnN0cnVjdDogInBocmFzaW5nIiwKICAgICAgICBub3RJbkNvbnN0cnVjdDogY29uc3RydWN0c1dpdGhvdXRTdHJpa2V0aHJvdWdoCiAgICAgIH0KICAgIF0sCiAgICBoYW5kbGVyczogeyBkZWxldGU6IGhhbmRsZURlbGV0ZSB9CiAgfTsKfQpfX25hbWUoZ2ZtU3RyaWtldGhyb3VnaFRvTWFya2Rvd24sICJnZm1TdHJpa2V0aHJvdWdoVG9NYXJrZG93biIpOwpmdW5jdGlvbiBlbnRlclN0cmlrZXRocm91Z2godG9rZW4pIHsKICB0aGlzLmVudGVyKHsgdHlwZTogImRlbGV0ZSIsIGNoaWxkcmVuOiBbXSB9LCB0b2tlbik7Cn0KX19uYW1lKGVudGVyU3RyaWtldGhyb3VnaCwgImVudGVyU3RyaWtldGhyb3VnaCIpOwpmdW5jdGlvbiBleGl0U3RyaWtldGhyb3VnaCh0b2tlbikgewogIHRoaXMuZXhpdCh0b2tlbik7Cn0KX19uYW1lKGV4aXRTdHJpa2V0aHJvdWdoLCAiZXhpdFN0cmlrZXRocm91Z2giKTsKZnVuY3Rpb24gaGFuZGxlRGVsZXRlKG5vZGUyLCBfMywgc3RhdGUsIGluZm8pIHsKICBjb25zdCB0cmFja2VyID0gc3RhdGUuY3JlYXRlVHJhY2tlcihpbmZvKTsKICBjb25zdCBleGl0MyA9IHN0YXRlLmVudGVyKCJzdHJpa2V0aHJvdWdoIik7CiAgbGV0IHZhbHVlMiA9IHRyYWNrZXIubW92ZSgifn4iKTsKICB2YWx1ZTIgKz0gc3RhdGUuY29udGFpbmVyUGhyYXNpbmcobm9kZTIsIHsKICAgIC4uLnRyYWNrZXIuY3VycmVudCgpLAogICAgYmVmb3JlOiB2YWx1ZTIsCiAgICBhZnRlcjogIn4iCiAgfSk7CiAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgifn4iKTsKICBleGl0MygpOwogIHJldHVybiB2YWx1ZTI7Cn0KX19uYW1lKGhhbmRsZURlbGV0ZSwgImhhbmRsZURlbGV0ZSIpOwpmdW5jdGlvbiBwZWVrRGVsZXRlKCkgewogIHJldHVybiAifiI7Cn0KX19uYW1lKHBlZWtEZWxldGUsICJwZWVrRGVsZXRlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWFya2Rvd24tdGFibGVAMy4wLjQvbm9kZV9tb2R1bGVzL21hcmtkb3duLXRhYmxlL2luZGV4LmpzCmZ1bmN0aW9uIGRlZmF1bHRTdHJpbmdMZW5ndGgodmFsdWUyKSB7CiAgcmV0dXJuIHZhbHVlMi5sZW5ndGg7Cn0KX19uYW1lKGRlZmF1bHRTdHJpbmdMZW5ndGgsICJkZWZhdWx0U3RyaW5nTGVuZ3RoIik7CmZ1bmN0aW9uIG1hcmtkb3duVGFibGUodGFibGUyLCBvcHRpb25zKSB7CiAgY29uc3Qgc2V0dGluZ3MgPSBvcHRpb25zIHx8IHt9OwogIGNvbnN0IGFsaWduID0gKHNldHRpbmdzLmFsaWduIHx8IFtdKS5jb25jYXQoKTsKICBjb25zdCBzdHJpbmdMZW5ndGggPSBzZXR0aW5ncy5zdHJpbmdMZW5ndGggfHwgZGVmYXVsdFN0cmluZ0xlbmd0aDsKICBjb25zdCBhbGlnbm1lbnRzID0gW107CiAgY29uc3QgY2VsbE1hdHJpeCA9IFtdOwogIGNvbnN0IHNpemVNYXRyaXggPSBbXTsKICBjb25zdCBsb25nZXN0Q2VsbEJ5Q29sdW1uID0gW107CiAgbGV0IG1vc3RDZWxsc1BlclJvdyA9IDA7CiAgbGV0IHJvd0luZGV4ID0gLTE7CiAgd2hpbGUgKCsrcm93SW5kZXggPCB0YWJsZTIubGVuZ3RoKSB7CiAgICBjb25zdCByb3cyID0gW107CiAgICBjb25zdCBzaXplczIgPSBbXTsKICAgIGxldCBjb2x1bW5JbmRleDIgPSAtMTsKICAgIGlmICh0YWJsZTJbcm93SW5kZXhdLmxlbmd0aCA+IG1vc3RDZWxsc1BlclJvdykgewogICAgICBtb3N0Q2VsbHNQZXJSb3cgPSB0YWJsZTJbcm93SW5kZXhdLmxlbmd0aDsKICAgIH0KICAgIHdoaWxlICgrK2NvbHVtbkluZGV4MiA8IHRhYmxlMltyb3dJbmRleF0ubGVuZ3RoKSB7CiAgICAgIGNvbnN0IGNlbGwyID0gc2VyaWFsaXplKHRhYmxlMltyb3dJbmRleF1bY29sdW1uSW5kZXgyXSk7CiAgICAgIGlmIChzZXR0aW5ncy5hbGlnbkRlbGltaXRlcnMgIT09IGZhbHNlKSB7CiAgICAgICAgY29uc3Qgc2l6ZSA9IHN0cmluZ0xlbmd0aChjZWxsMik7CiAgICAgICAgc2l6ZXMyW2NvbHVtbkluZGV4Ml0gPSBzaXplOwogICAgICAgIGlmIChsb25nZXN0Q2VsbEJ5Q29sdW1uW2NvbHVtbkluZGV4Ml0gPT09IHZvaWQgMCB8fCBzaXplID4gbG9uZ2VzdENlbGxCeUNvbHVtbltjb2x1bW5JbmRleDJdKSB7CiAgICAgICAgICBsb25nZXN0Q2VsbEJ5Q29sdW1uW2NvbHVtbkluZGV4Ml0gPSBzaXplOwogICAgICAgIH0KICAgICAgfQogICAgICByb3cyLnB1c2goY2VsbDIpOwogICAgfQogICAgY2VsbE1hdHJpeFtyb3dJbmRleF0gPSByb3cyOwogICAgc2l6ZU1hdHJpeFtyb3dJbmRleF0gPSBzaXplczI7CiAgfQogIGxldCBjb2x1bW5JbmRleCA9IC0xOwogIGlmICh0eXBlb2YgYWxpZ24gPT09ICJvYmplY3QiICYmICJsZW5ndGgiIGluIGFsaWduKSB7CiAgICB3aGlsZSAoKytjb2x1bW5JbmRleCA8IG1vc3RDZWxsc1BlclJvdykgewogICAgICBhbGlnbm1lbnRzW2NvbHVtbkluZGV4XSA9IHRvQWxpZ25tZW50KGFsaWduW2NvbHVtbkluZGV4XSk7CiAgICB9CiAgfSBlbHNlIHsKICAgIGNvbnN0IGNvZGU0ID0gdG9BbGlnbm1lbnQoYWxpZ24pOwogICAgd2hpbGUgKCsrY29sdW1uSW5kZXggPCBtb3N0Q2VsbHNQZXJSb3cpIHsKICAgICAgYWxpZ25tZW50c1tjb2x1bW5JbmRleF0gPSBjb2RlNDsKICAgIH0KICB9CiAgY29sdW1uSW5kZXggPSAtMTsKICBjb25zdCByb3cgPSBbXTsKICBjb25zdCBzaXplcyA9IFtdOwogIHdoaWxlICgrK2NvbHVtbkluZGV4IDwgbW9zdENlbGxzUGVyUm93KSB7CiAgICBjb25zdCBjb2RlNCA9IGFsaWdubWVudHNbY29sdW1uSW5kZXhdOwogICAgbGV0IGJlZm9yZSA9ICIiOwogICAgbGV0IGFmdGVyID0gIiI7CiAgICBpZiAoY29kZTQgPT09IDk5KSB7CiAgICAgIGJlZm9yZSA9ICI6IjsKICAgICAgYWZ0ZXIgPSAiOiI7CiAgICB9IGVsc2UgaWYgKGNvZGU0ID09PSAxMDgpIHsKICAgICAgYmVmb3JlID0gIjoiOwogICAgfSBlbHNlIGlmIChjb2RlNCA9PT0gMTE0KSB7CiAgICAgIGFmdGVyID0gIjoiOwogICAgfQogICAgbGV0IHNpemUgPSBzZXR0aW5ncy5hbGlnbkRlbGltaXRlcnMgPT09IGZhbHNlID8gMSA6IE1hdGgubWF4KAogICAgICAxLAogICAgICBsb25nZXN0Q2VsbEJ5Q29sdW1uW2NvbHVtbkluZGV4XSAtIGJlZm9yZS5sZW5ndGggLSBhZnRlci5sZW5ndGgKICAgICk7CiAgICBjb25zdCBjZWxsMiA9IGJlZm9yZSArICItIi5yZXBlYXQoc2l6ZSkgKyBhZnRlcjsKICAgIGlmIChzZXR0aW5ncy5hbGlnbkRlbGltaXRlcnMgIT09IGZhbHNlKSB7CiAgICAgIHNpemUgPSBiZWZvcmUubGVuZ3RoICsgc2l6ZSArIGFmdGVyLmxlbmd0aDsKICAgICAgaWYgKHNpemUgPiBsb25nZXN0Q2VsbEJ5Q29sdW1uW2NvbHVtbkluZGV4XSkgewogICAgICAgIGxvbmdlc3RDZWxsQnlDb2x1bW5bY29sdW1uSW5kZXhdID0gc2l6ZTsKICAgICAgfQogICAgICBzaXplc1tjb2x1bW5JbmRleF0gPSBzaXplOwogICAgfQogICAgcm93W2NvbHVtbkluZGV4XSA9IGNlbGwyOwogIH0KICBjZWxsTWF0cml4LnNwbGljZSgxLCAwLCByb3cpOwogIHNpemVNYXRyaXguc3BsaWNlKDEsIDAsIHNpemVzKTsKICByb3dJbmRleCA9IC0xOwogIGNvbnN0IGxpbmVzID0gW107CiAgd2hpbGUgKCsrcm93SW5kZXggPCBjZWxsTWF0cml4Lmxlbmd0aCkgewogICAgY29uc3Qgcm93MiA9IGNlbGxNYXRyaXhbcm93SW5kZXhdOwogICAgY29uc3Qgc2l6ZXMyID0gc2l6ZU1hdHJpeFtyb3dJbmRleF07CiAgICBjb2x1bW5JbmRleCA9IC0xOwogICAgY29uc3QgbGluZSA9IFtdOwogICAgd2hpbGUgKCsrY29sdW1uSW5kZXggPCBtb3N0Q2VsbHNQZXJSb3cpIHsKICAgICAgY29uc3QgY2VsbDIgPSByb3cyW2NvbHVtbkluZGV4XSB8fCAiIjsKICAgICAgbGV0IGJlZm9yZSA9ICIiOwogICAgICBsZXQgYWZ0ZXIgPSAiIjsKICAgICAgaWYgKHNldHRpbmdzLmFsaWduRGVsaW1pdGVycyAhPT0gZmFsc2UpIHsKICAgICAgICBjb25zdCBzaXplID0gbG9uZ2VzdENlbGxCeUNvbHVtbltjb2x1bW5JbmRleF0gLSAoc2l6ZXMyW2NvbHVtbkluZGV4XSB8fCAwKTsKICAgICAgICBjb25zdCBjb2RlNCA9IGFsaWdubWVudHNbY29sdW1uSW5kZXhdOwogICAgICAgIGlmIChjb2RlNCA9PT0gMTE0KSB7CiAgICAgICAgICBiZWZvcmUgPSAiICIucmVwZWF0KHNpemUpOwogICAgICAgIH0gZWxzZSBpZiAoY29kZTQgPT09IDk5KSB7CiAgICAgICAgICBpZiAoc2l6ZSAlIDIpIHsKICAgICAgICAgICAgYmVmb3JlID0gIiAiLnJlcGVhdChzaXplIC8gMiArIDAuNSk7CiAgICAgICAgICAgIGFmdGVyID0gIiAiLnJlcGVhdChzaXplIC8gMiAtIDAuNSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBiZWZvcmUgPSAiICIucmVwZWF0KHNpemUgLyAyKTsKICAgICAgICAgICAgYWZ0ZXIgPSBiZWZvcmU7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGFmdGVyID0gIiAiLnJlcGVhdChzaXplKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHNldHRpbmdzLmRlbGltaXRlclN0YXJ0ICE9PSBmYWxzZSAmJiAhY29sdW1uSW5kZXgpIHsKICAgICAgICBsaW5lLnB1c2goInwiKTsKICAgICAgfQogICAgICBpZiAoc2V0dGluZ3MucGFkZGluZyAhPT0gZmFsc2UgJiYgLy8gRG9u4oCZdCBhZGQgdGhlIG9wZW5pbmcgc3BhY2UgaWYgd2XigJlyZSBub3QgYWxpZ25pbmcgYW5kIHRoZSBjZWxsIGlzCiAgICAgIC8vIGVtcHR5OiB0aGVyZSB3aWxsIGJlIGEgY2xvc2luZyBzcGFjZS4KICAgICAgIShzZXR0aW5ncy5hbGlnbkRlbGltaXRlcnMgPT09IGZhbHNlICYmIGNlbGwyID09PSAiIikgJiYgKHNldHRpbmdzLmRlbGltaXRlclN0YXJ0ICE9PSBmYWxzZSB8fCBjb2x1bW5JbmRleCkpIHsKICAgICAgICBsaW5lLnB1c2goIiAiKTsKICAgICAgfQogICAgICBpZiAoc2V0dGluZ3MuYWxpZ25EZWxpbWl0ZXJzICE9PSBmYWxzZSkgewogICAgICAgIGxpbmUucHVzaChiZWZvcmUpOwogICAgICB9CiAgICAgIGxpbmUucHVzaChjZWxsMik7CiAgICAgIGlmIChzZXR0aW5ncy5hbGlnbkRlbGltaXRlcnMgIT09IGZhbHNlKSB7CiAgICAgICAgbGluZS5wdXNoKGFmdGVyKTsKICAgICAgfQogICAgICBpZiAoc2V0dGluZ3MucGFkZGluZyAhPT0gZmFsc2UpIHsKICAgICAgICBsaW5lLnB1c2goIiAiKTsKICAgICAgfQogICAgICBpZiAoc2V0dGluZ3MuZGVsaW1pdGVyRW5kICE9PSBmYWxzZSB8fCBjb2x1bW5JbmRleCAhPT0gbW9zdENlbGxzUGVyUm93IC0gMSkgewogICAgICAgIGxpbmUucHVzaCgifCIpOwogICAgICB9CiAgICB9CiAgICBsaW5lcy5wdXNoKAogICAgICBzZXR0aW5ncy5kZWxpbWl0ZXJFbmQgPT09IGZhbHNlID8gbGluZS5qb2luKCIiKS5yZXBsYWNlKC8gKyQvLCAiIikgOiBsaW5lLmpvaW4oIiIpCiAgICApOwogIH0KICByZXR1cm4gbGluZXMuam9pbigiXG4iKTsKfQpfX25hbWUobWFya2Rvd25UYWJsZSwgIm1hcmtkb3duVGFibGUiKTsKZnVuY3Rpb24gc2VyaWFsaXplKHZhbHVlMikgewogIHJldHVybiB2YWx1ZTIgPT09IG51bGwgfHwgdmFsdWUyID09PSB2b2lkIDAgPyAiIiA6IFN0cmluZyh2YWx1ZTIpOwp9Cl9fbmFtZShzZXJpYWxpemUsICJzZXJpYWxpemUiKTsKZnVuY3Rpb24gdG9BbGlnbm1lbnQodmFsdWUyKSB7CiAgY29uc3QgY29kZTQgPSB0eXBlb2YgdmFsdWUyID09PSAic3RyaW5nIiA/IHZhbHVlMi5jb2RlUG9pbnRBdCgwKSA6IDA7CiAgcmV0dXJuIGNvZGU0ID09PSA2NyB8fCBjb2RlNCA9PT0gOTkgPyA5OSA6IGNvZGU0ID09PSA3NiB8fCBjb2RlNCA9PT0gMTA4ID8gMTA4IDogY29kZTQgPT09IDgyIHx8IGNvZGU0ID09PSAxMTQgPyAxMTQgOiAwOwp9Cl9fbmFtZSh0b0FsaWdubWVudCwgInRvQWxpZ25tZW50Iik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vendpdGNoQDIuMC40L25vZGVfbW9kdWxlcy96d2l0Y2gvaW5kZXguanMKdmFyIG93bjIgPSB7fS5oYXNPd25Qcm9wZXJ0eTsKZnVuY3Rpb24gendpdGNoKGtleTIsIG9wdGlvbnMpIHsKICBjb25zdCBzZXR0aW5ncyA9IG9wdGlvbnMgfHwge307CiAgZnVuY3Rpb24gb25lMyh2YWx1ZTIsIC4uLnBhcmFtZXRlcnMpIHsKICAgIGxldCBmbiA9IG9uZTMuaW52YWxpZDsKICAgIGNvbnN0IGhhbmRsZXJzMiA9IG9uZTMuaGFuZGxlcnM7CiAgICBpZiAodmFsdWUyICYmIG93bjIuY2FsbCh2YWx1ZTIsIGtleTIpKSB7CiAgICAgIGNvbnN0IGlkID0gU3RyaW5nKHZhbHVlMltrZXkyXSk7CiAgICAgIGZuID0gb3duMi5jYWxsKGhhbmRsZXJzMiwgaWQpID8gaGFuZGxlcnMyW2lkXSA6IG9uZTMudW5rbm93bjsKICAgIH0KICAgIGlmIChmbikgewogICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCB2YWx1ZTIsIC4uLnBhcmFtZXRlcnMpOwogICAgfQogIH0KICBfX25hbWUob25lMywgIm9uZSIpOwogIG9uZTMuaGFuZGxlcnMgPSBzZXR0aW5ncy5oYW5kbGVycyB8fCB7fTsKICBvbmUzLmludmFsaWQgPSBzZXR0aW5ncy5pbnZhbGlkOwogIG9uZTMudW5rbm93biA9IHNldHRpbmdzLnVua25vd247CiAgcmV0dXJuIG9uZTM7Cn0KX19uYW1lKHp3aXRjaCwgInp3aXRjaCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2NvbmZpZ3VyZS5qcwp2YXIgb3duMyA9IHt9Lmhhc093blByb3BlcnR5OwpmdW5jdGlvbiBjb25maWd1cmUoYmFzZSwgZXh0ZW5zaW9uMikgewogIGxldCBpbmRleDIgPSAtMTsKICBsZXQga2V5MjsKICBpZiAoZXh0ZW5zaW9uMi5leHRlbnNpb25zKSB7CiAgICB3aGlsZSAoKytpbmRleDIgPCBleHRlbnNpb24yLmV4dGVuc2lvbnMubGVuZ3RoKSB7CiAgICAgIGNvbmZpZ3VyZShiYXNlLCBleHRlbnNpb24yLmV4dGVuc2lvbnNbaW5kZXgyXSk7CiAgICB9CiAgfQogIGZvciAoa2V5MiBpbiBleHRlbnNpb24yKSB7CiAgICBpZiAob3duMy5jYWxsKGV4dGVuc2lvbjIsIGtleTIpKSB7CiAgICAgIHN3aXRjaCAoa2V5MikgewogICAgICAgIGNhc2UgImV4dGVuc2lvbnMiOiB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgLyogYzggaWdub3JlIG5leHQgNCAqLwogICAgICAgIGNhc2UgInVuc2FmZSI6IHsKICAgICAgICAgIGxpc3QoYmFzZVtrZXkyXSwgZXh0ZW5zaW9uMltrZXkyXSk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY2FzZSAiam9pbiI6IHsKICAgICAgICAgIGxpc3QoYmFzZVtrZXkyXSwgZXh0ZW5zaW9uMltrZXkyXSk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY2FzZSAiaGFuZGxlcnMiOiB7CiAgICAgICAgICBtYXAzKGJhc2Vba2V5Ml0sIGV4dGVuc2lvbjJba2V5Ml0pOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGRlZmF1bHQ6IHsKICAgICAgICAgIGJhc2Uub3B0aW9uc1trZXkyXSA9IGV4dGVuc2lvbjJba2V5Ml07CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIHJldHVybiBiYXNlOwp9Cl9fbmFtZShjb25maWd1cmUsICJjb25maWd1cmUiKTsKZnVuY3Rpb24gbGlzdChsZWZ0LCByaWdodCkgewogIGlmIChyaWdodCkgewogICAgbGVmdC5wdXNoKC4uLnJpZ2h0KTsKICB9Cn0KX19uYW1lKGxpc3QsICJsaXN0Iik7CmZ1bmN0aW9uIG1hcDMobGVmdCwgcmlnaHQpIHsKICBpZiAocmlnaHQpIHsKICAgIE9iamVjdC5hc3NpZ24obGVmdCwgcmlnaHQpOwogIH0KfQpfX25hbWUobWFwMywgIm1hcCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9ibG9ja3F1b3RlLmpzCmZ1bmN0aW9uIGJsb2NrcXVvdGUobm9kZTIsIF8zLCBzdGF0ZSwgaW5mbykgewogIGNvbnN0IGV4aXQzID0gc3RhdGUuZW50ZXIoImJsb2NrcXVvdGUiKTsKICBjb25zdCB0cmFja2VyID0gc3RhdGUuY3JlYXRlVHJhY2tlcihpbmZvKTsKICB0cmFja2VyLm1vdmUoIj4gIik7CiAgdHJhY2tlci5zaGlmdCgyKTsKICBjb25zdCB2YWx1ZTIgPSBzdGF0ZS5pbmRlbnRMaW5lcygKICAgIHN0YXRlLmNvbnRhaW5lckZsb3cobm9kZTIsIHRyYWNrZXIuY3VycmVudCgpKSwKICAgIG1hcDQKICApOwogIGV4aXQzKCk7CiAgcmV0dXJuIHZhbHVlMjsKfQpfX25hbWUoYmxvY2txdW90ZSwgImJsb2NrcXVvdGUiKTsKZnVuY3Rpb24gbWFwNChsaW5lLCBfMywgYmxhbmspIHsKICByZXR1cm4gIj4iICsgKGJsYW5rID8gIiIgOiAiICIpICsgbGluZTsKfQpfX25hbWUobWFwNCwgIm1hcCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvcGF0dGVybi1pbi1zY29wZS5qcwpmdW5jdGlvbiBwYXR0ZXJuSW5TY29wZShzdGFjaywgcGF0dGVybikgewogIHJldHVybiBsaXN0SW5TY29wZShzdGFjaywgcGF0dGVybi5pbkNvbnN0cnVjdCwgdHJ1ZSkgJiYgIWxpc3RJblNjb3BlKHN0YWNrLCBwYXR0ZXJuLm5vdEluQ29uc3RydWN0LCBmYWxzZSk7Cn0KX19uYW1lKHBhdHRlcm5JblNjb3BlLCAicGF0dGVybkluU2NvcGUiKTsKZnVuY3Rpb24gbGlzdEluU2NvcGUoc3RhY2ssIGxpc3Q1LCBub25lKSB7CiAgaWYgKHR5cGVvZiBsaXN0NSA9PT0gInN0cmluZyIpIHsKICAgIGxpc3Q1ID0gW2xpc3Q1XTsKICB9CiAgaWYgKCFsaXN0NSB8fCBsaXN0NS5sZW5ndGggPT09IDApIHsKICAgIHJldHVybiBub25lOwogIH0KICBsZXQgaW5kZXgyID0gLTE7CiAgd2hpbGUgKCsraW5kZXgyIDwgbGlzdDUubGVuZ3RoKSB7CiAgICBpZiAoc3RhY2suaW5jbHVkZXMobGlzdDVbaW5kZXgyXSkpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgfQogIHJldHVybiBmYWxzZTsKfQpfX25hbWUobGlzdEluU2NvcGUsICJsaXN0SW5TY29wZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9icmVhay5qcwpmdW5jdGlvbiBoYXJkQnJlYWsoXzMsIF8xLCBzdGF0ZSwgaW5mbykgewogIGxldCBpbmRleDIgPSAtMTsKICB3aGlsZSAoKytpbmRleDIgPCBzdGF0ZS51bnNhZmUubGVuZ3RoKSB7CiAgICBpZiAoc3RhdGUudW5zYWZlW2luZGV4Ml0uY2hhcmFjdGVyID09PSAiXG4iICYmIHBhdHRlcm5JblNjb3BlKHN0YXRlLnN0YWNrLCBzdGF0ZS51bnNhZmVbaW5kZXgyXSkpIHsKICAgICAgcmV0dXJuIC9bIFx0XS8udGVzdChpbmZvLmJlZm9yZSkgPyAiIiA6ICIgIjsKICAgIH0KICB9CiAgcmV0dXJuICJcXFxuIjsKfQpfX25hbWUoaGFyZEJyZWFrLCAiaGFyZEJyZWFrIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbG9uZ2VzdC1zdHJlYWtAMy4xLjAvbm9kZV9tb2R1bGVzL2xvbmdlc3Qtc3RyZWFrL2luZGV4LmpzCmZ1bmN0aW9uIGxvbmdlc3RTdHJlYWsodmFsdWUyLCBzdWJzdHJpbmcpIHsKICBjb25zdCBzb3VyY2UgPSBTdHJpbmcodmFsdWUyKTsKICBsZXQgaW5kZXgyID0gc291cmNlLmluZGV4T2Yoc3Vic3RyaW5nKTsKICBsZXQgZXhwZWN0ZWQgPSBpbmRleDI7CiAgbGV0IGNvdW50MiA9IDA7CiAgbGV0IG1heDMgPSAwOwogIGlmICh0eXBlb2Ygc3Vic3RyaW5nICE9PSAic3RyaW5nIikgewogICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiRXhwZWN0ZWQgc3Vic3RyaW5nIik7CiAgfQogIHdoaWxlIChpbmRleDIgIT09IC0xKSB7CiAgICBpZiAoaW5kZXgyID09PSBleHBlY3RlZCkgewogICAgICBpZiAoKytjb3VudDIgPiBtYXgzKSB7CiAgICAgICAgbWF4MyA9IGNvdW50MjsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgY291bnQyID0gMTsKICAgIH0KICAgIGV4cGVjdGVkID0gaW5kZXgyICsgc3Vic3RyaW5nLmxlbmd0aDsKICAgIGluZGV4MiA9IHNvdXJjZS5pbmRleE9mKHN1YnN0cmluZywgZXhwZWN0ZWQpOwogIH0KICByZXR1cm4gbWF4MzsKfQpfX25hbWUobG9uZ2VzdFN0cmVhaywgImxvbmdlc3RTdHJlYWsiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2Zvcm1hdC1jb2RlLWFzLWluZGVudGVkLmpzCmZ1bmN0aW9uIGZvcm1hdENvZGVBc0luZGVudGVkKG5vZGUyLCBzdGF0ZSkgewogIHJldHVybiBCb29sZWFuKAogICAgc3RhdGUub3B0aW9ucy5mZW5jZXMgPT09IGZhbHNlICYmIG5vZGUyLnZhbHVlICYmIC8vIElmIHRoZXJl4oCZcyBubyBpbmZv4oCmCiAgICAhbm9kZTIubGFuZyAmJiAvLyBBbmQgdGhlcmXigJlzIGEgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVy4oCmCiAgICAvW14gXHJcbl0vLnRlc3Qobm9kZTIudmFsdWUpICYmIC8vIEFuZCB0aGUgdmFsdWUgZG9lc27igJl0IHN0YXJ0IG9yIGVuZCBpbiBhIGJsYW5r4oCmCiAgICAhL15bXHQgXSooPzpbXHJcbl18JCl8KD86XnxbXHJcbl0pW1x0IF0qJC8udGVzdChub2RlMi52YWx1ZSkKICApOwp9Cl9fbmFtZShmb3JtYXRDb2RlQXNJbmRlbnRlZCwgImZvcm1hdENvZGVBc0luZGVudGVkIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9jaGVjay1mZW5jZS5qcwpmdW5jdGlvbiBjaGVja0ZlbmNlKHN0YXRlKSB7CiAgY29uc3QgbWFya2VyID0gc3RhdGUub3B0aW9ucy5mZW5jZSB8fCAiYCI7CiAgaWYgKG1hcmtlciAhPT0gImAiICYmIG1hcmtlciAhPT0gIn4iKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICJDYW5ub3Qgc2VyaWFsaXplIGNvZGUgd2l0aCBgIiArIG1hcmtlciArICJgIGZvciBgb3B0aW9ucy5mZW5jZWAsIGV4cGVjdGVkIGBgIGAgYGAgb3IgYH5gIgogICAgKTsKICB9CiAgcmV0dXJuIG1hcmtlcjsKfQpfX25hbWUoY2hlY2tGZW5jZSwgImNoZWNrRmVuY2UiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9oYW5kbGUvY29kZS5qcwpmdW5jdGlvbiBjb2RlKG5vZGUyLCBfMywgc3RhdGUsIGluZm8pIHsKICBjb25zdCBtYXJrZXIgPSBjaGVja0ZlbmNlKHN0YXRlKTsKICBjb25zdCByYXcyID0gbm9kZTIudmFsdWUgfHwgIiI7CiAgY29uc3Qgc3VmZml4ID0gbWFya2VyID09PSAiYCIgPyAiR3JhdmVBY2NlbnQiIDogIlRpbGRlIjsKICBpZiAoZm9ybWF0Q29kZUFzSW5kZW50ZWQobm9kZTIsIHN0YXRlKSkgewogICAgY29uc3QgZXhpdDQgPSBzdGF0ZS5lbnRlcigiY29kZUluZGVudGVkIik7CiAgICBjb25zdCB2YWx1ZTMgPSBzdGF0ZS5pbmRlbnRMaW5lcyhyYXcyLCBtYXA1KTsKICAgIGV4aXQ0KCk7CiAgICByZXR1cm4gdmFsdWUzOwogIH0KICBjb25zdCB0cmFja2VyID0gc3RhdGUuY3JlYXRlVHJhY2tlcihpbmZvKTsKICBjb25zdCBzZXF1ZW5jZSA9IG1hcmtlci5yZXBlYXQoTWF0aC5tYXgobG9uZ2VzdFN0cmVhayhyYXcyLCBtYXJrZXIpICsgMSwgMykpOwogIGNvbnN0IGV4aXQzID0gc3RhdGUuZW50ZXIoImNvZGVGZW5jZWQiKTsKICBsZXQgdmFsdWUyID0gdHJhY2tlci5tb3ZlKHNlcXVlbmNlKTsKICBpZiAobm9kZTIubGFuZykgewogICAgY29uc3Qgc3ViZXhpdCA9IHN0YXRlLmVudGVyKGBjb2RlRmVuY2VkTGFuZyR7c3VmZml4fWApOwogICAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgKICAgICAgc3RhdGUuc2FmZShub2RlMi5sYW5nLCB7CiAgICAgICAgYmVmb3JlOiB2YWx1ZTIsCiAgICAgICAgYWZ0ZXI6ICIgIiwKICAgICAgICBlbmNvZGU6IFsiYCJdLAogICAgICAgIC4uLnRyYWNrZXIuY3VycmVudCgpCiAgICAgIH0pCiAgICApOwogICAgc3ViZXhpdCgpOwogIH0KICBpZiAobm9kZTIubGFuZyAmJiBub2RlMi5tZXRhKSB7CiAgICBjb25zdCBzdWJleGl0ID0gc3RhdGUuZW50ZXIoYGNvZGVGZW5jZWRNZXRhJHtzdWZmaXh9YCk7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKCIgIik7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKAogICAgICBzdGF0ZS5zYWZlKG5vZGUyLm1ldGEsIHsKICAgICAgICBiZWZvcmU6IHZhbHVlMiwKICAgICAgICBhZnRlcjogIlxuIiwKICAgICAgICBlbmNvZGU6IFsiYCJdLAogICAgICAgIC4uLnRyYWNrZXIuY3VycmVudCgpCiAgICAgIH0pCiAgICApOwogICAgc3ViZXhpdCgpOwogIH0KICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKCJcbiIpOwogIGlmIChyYXcyKSB7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKHJhdzIgKyAiXG4iKTsKICB9CiAgdmFsdWUyICs9IHRyYWNrZXIubW92ZShzZXF1ZW5jZSk7CiAgZXhpdDMoKTsKICByZXR1cm4gdmFsdWUyOwp9Cl9fbmFtZShjb2RlLCAiY29kZSIpOwpmdW5jdGlvbiBtYXA1KGxpbmUsIF8zLCBibGFuaykgewogIHJldHVybiAoYmxhbmsgPyAiIiA6ICIgICAgIikgKyBsaW5lOwp9Cl9fbmFtZShtYXA1LCAibWFwIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9jaGVjay1xdW90ZS5qcwpmdW5jdGlvbiBjaGVja1F1b3RlKHN0YXRlKSB7CiAgY29uc3QgbWFya2VyID0gc3RhdGUub3B0aW9ucy5xdW90ZSB8fCAnIic7CiAgaWYgKG1hcmtlciAhPT0gJyInICYmIG1hcmtlciAhPT0gIiciKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICJDYW5ub3Qgc2VyaWFsaXplIHRpdGxlIHdpdGggYCIgKyBtYXJrZXIgKyAiYCBmb3IgYG9wdGlvbnMucXVvdGVgLCBleHBlY3RlZCBgXCJgLCBvciBgJ2AiCiAgICApOwogIH0KICByZXR1cm4gbWFya2VyOwp9Cl9fbmFtZShjaGVja1F1b3RlLCAiY2hlY2tRdW90ZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9kZWZpbml0aW9uLmpzCmZ1bmN0aW9uIGRlZmluaXRpb24obm9kZTIsIF8zLCBzdGF0ZSwgaW5mbykgewogIGNvbnN0IHF1b3RlID0gY2hlY2tRdW90ZShzdGF0ZSk7CiAgY29uc3Qgc3VmZml4ID0gcXVvdGUgPT09ICciJyA/ICJRdW90ZSIgOiAiQXBvc3Ryb3BoZSI7CiAgY29uc3QgZXhpdDMgPSBzdGF0ZS5lbnRlcigiZGVmaW5pdGlvbiIpOwogIGxldCBzdWJleGl0ID0gc3RhdGUuZW50ZXIoImxhYmVsIik7CiAgY29uc3QgdHJhY2tlciA9IHN0YXRlLmNyZWF0ZVRyYWNrZXIoaW5mbyk7CiAgbGV0IHZhbHVlMiA9IHRyYWNrZXIubW92ZSgiWyIpOwogIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoCiAgICBzdGF0ZS5zYWZlKHN0YXRlLmFzc29jaWF0aW9uSWQobm9kZTIpLCB7CiAgICAgIGJlZm9yZTogdmFsdWUyLAogICAgICBhZnRlcjogIl0iLAogICAgICAuLi50cmFja2VyLmN1cnJlbnQoKQogICAgfSkKICApOwogIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoIl06ICIpOwogIHN1YmV4aXQoKTsKICBpZiAoCiAgICAvLyBJZiB0aGVyZeKAmXMgbm8gdXJsLCBvcuKApgogICAgIW5vZGUyLnVybCB8fCAvLyBJZiB0aGVyZSBhcmUgY29udHJvbCBjaGFyYWN0ZXJzIG9yIHdoaXRlc3BhY2UuCiAgICAvW1wwLSBcdTAwN0ZdLy50ZXN0KG5vZGUyLnVybCkKICApIHsKICAgIHN1YmV4aXQgPSBzdGF0ZS5lbnRlcigiZGVzdGluYXRpb25MaXRlcmFsIik7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKCI8Iik7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKAogICAgICBzdGF0ZS5zYWZlKG5vZGUyLnVybCwgeyBiZWZvcmU6IHZhbHVlMiwgYWZ0ZXI6ICI+IiwgLi4udHJhY2tlci5jdXJyZW50KCkgfSkKICAgICk7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKCI+Iik7CiAgfSBlbHNlIHsKICAgIHN1YmV4aXQgPSBzdGF0ZS5lbnRlcigiZGVzdGluYXRpb25SYXciKTsKICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoCiAgICAgIHN0YXRlLnNhZmUobm9kZTIudXJsLCB7CiAgICAgICAgYmVmb3JlOiB2YWx1ZTIsCiAgICAgICAgYWZ0ZXI6IG5vZGUyLnRpdGxlID8gIiAiIDogIlxuIiwKICAgICAgICAuLi50cmFja2VyLmN1cnJlbnQoKQogICAgICB9KQogICAgKTsKICB9CiAgc3ViZXhpdCgpOwogIGlmIChub2RlMi50aXRsZSkgewogICAgc3ViZXhpdCA9IHN0YXRlLmVudGVyKGB0aXRsZSR7c3VmZml4fWApOwogICAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgiICIgKyBxdW90ZSk7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKAogICAgICBzdGF0ZS5zYWZlKG5vZGUyLnRpdGxlLCB7CiAgICAgICAgYmVmb3JlOiB2YWx1ZTIsCiAgICAgICAgYWZ0ZXI6IHF1b3RlLAogICAgICAgIC4uLnRyYWNrZXIuY3VycmVudCgpCiAgICAgIH0pCiAgICApOwogICAgdmFsdWUyICs9IHRyYWNrZXIubW92ZShxdW90ZSk7CiAgICBzdWJleGl0KCk7CiAgfQogIGV4aXQzKCk7CiAgcmV0dXJuIHZhbHVlMjsKfQpfX25hbWUoZGVmaW5pdGlvbiwgImRlZmluaXRpb24iKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2NoZWNrLWVtcGhhc2lzLmpzCmZ1bmN0aW9uIGNoZWNrRW1waGFzaXMoc3RhdGUpIHsKICBjb25zdCBtYXJrZXIgPSBzdGF0ZS5vcHRpb25zLmVtcGhhc2lzIHx8ICIqIjsKICBpZiAobWFya2VyICE9PSAiKiIgJiYgbWFya2VyICE9PSAiXyIpIHsKICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgIkNhbm5vdCBzZXJpYWxpemUgZW1waGFzaXMgd2l0aCBgIiArIG1hcmtlciArICJgIGZvciBgb3B0aW9ucy5lbXBoYXNpc2AsIGV4cGVjdGVkIGAqYCwgb3IgYF9gIgogICAgKTsKICB9CiAgcmV0dXJuIG1hcmtlcjsKfQpfX25hbWUoY2hlY2tFbXBoYXNpcywgImNoZWNrRW1waGFzaXMiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2VuY29kZS1jaGFyYWN0ZXItcmVmZXJlbmNlLmpzCmZ1bmN0aW9uIGVuY29kZUNoYXJhY3RlclJlZmVyZW5jZShjb2RlNCkgewogIHJldHVybiAiJiN4IiArIGNvZGU0LnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpICsgIjsiOwp9Cl9fbmFtZShlbmNvZGVDaGFyYWN0ZXJSZWZlcmVuY2UsICJlbmNvZGVDaGFyYWN0ZXJSZWZlcmVuY2UiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstdXRpbC1jbGFzc2lmeS1jaGFyYWN0ZXJAMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay11dGlsLWNsYXNzaWZ5LWNoYXJhY3Rlci9pbmRleC5qcwpmdW5jdGlvbiBjbGFzc2lmeUNoYXJhY3Rlcihjb2RlNCkgewogIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlKGNvZGU0KSB8fCB1bmljb2RlV2hpdGVzcGFjZShjb2RlNCkpIHsKICAgIHJldHVybiAxOwogIH0KICBpZiAodW5pY29kZVB1bmN0dWF0aW9uKGNvZGU0KSkgewogICAgcmV0dXJuIDI7CiAgfQp9Cl9fbmFtZShjbGFzc2lmeUNoYXJhY3RlciwgImNsYXNzaWZ5Q2hhcmFjdGVyIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9lbmNvZGUtaW5mby5qcwpmdW5jdGlvbiBlbmNvZGVJbmZvKG91dHNpZGUsIGluc2lkZSwgbWFya2VyKSB7CiAgY29uc3Qgb3V0c2lkZUtpbmQgPSBjbGFzc2lmeUNoYXJhY3RlcihvdXRzaWRlKTsKICBjb25zdCBpbnNpZGVLaW5kID0gY2xhc3NpZnlDaGFyYWN0ZXIoaW5zaWRlKTsKICBpZiAob3V0c2lkZUtpbmQgPT09IHZvaWQgMCkgewogICAgcmV0dXJuIGluc2lkZUtpbmQgPT09IHZvaWQgMCA/ICgKICAgICAgLy8gTGV0dGVyIGluc2lkZToKICAgICAgLy8gd2UgaGF2ZSB0byBlbmNvZGUgKmJvdGgqIGxldHRlcnMgZm9yIGBfYCBhcyBpdCBpcyBsb29zZXIuCiAgICAgIC8vIGl0IGFscmVhZHkgZm9ybXMgZm9yIGAqYCAoYW5kIEdGTXMgYH5gKS4KICAgICAgbWFya2VyID09PSAiXyIgPyB7IGluc2lkZTogdHJ1ZSwgb3V0c2lkZTogdHJ1ZSB9IDogeyBpbnNpZGU6IGZhbHNlLCBvdXRzaWRlOiBmYWxzZSB9CiAgICApIDogaW5zaWRlS2luZCA9PT0gMSA/ICgKICAgICAgLy8gV2hpdGVzcGFjZSBpbnNpZGU6IGVuY29kZSBib3RoIChsZXR0ZXIsIHdoaXRlc3BhY2UpLgogICAgICB7IGluc2lkZTogdHJ1ZSwgb3V0c2lkZTogdHJ1ZSB9CiAgICApIDogKAogICAgICAvLyBQdW5jdHVhdGlvbiBpbnNpZGU6IGVuY29kZSBvdXRlciAobGV0dGVyKQogICAgICB7IGluc2lkZTogZmFsc2UsIG91dHNpZGU6IHRydWUgfQogICAgKTsKICB9CiAgaWYgKG91dHNpZGVLaW5kID09PSAxKSB7CiAgICByZXR1cm4gaW5zaWRlS2luZCA9PT0gdm9pZCAwID8gKAogICAgICAvLyBMZXR0ZXIgaW5zaWRlOiBhbHJlYWR5IGZvcm1zLgogICAgICB7IGluc2lkZTogZmFsc2UsIG91dHNpZGU6IGZhbHNlIH0KICAgICkgOiBpbnNpZGVLaW5kID09PSAxID8gKAogICAgICAvLyBXaGl0ZXNwYWNlIGluc2lkZTogZW5jb2RlIGJvdGggKHdoaXRlc3BhY2UpLgogICAgICB7IGluc2lkZTogdHJ1ZSwgb3V0c2lkZTogdHJ1ZSB9CiAgICApIDogKAogICAgICAvLyBQdW5jdHVhdGlvbiBpbnNpZGU6IGFscmVhZHkgZm9ybXMuCiAgICAgIHsgaW5zaWRlOiBmYWxzZSwgb3V0c2lkZTogZmFsc2UgfQogICAgKTsKICB9CiAgcmV0dXJuIGluc2lkZUtpbmQgPT09IHZvaWQgMCA/ICgKICAgIC8vIExldHRlciBpbnNpZGU6IGFscmVhZHkgZm9ybXMuCiAgICB7IGluc2lkZTogZmFsc2UsIG91dHNpZGU6IGZhbHNlIH0KICApIDogaW5zaWRlS2luZCA9PT0gMSA/ICgKICAgIC8vIFdoaXRlc3BhY2UgaW5zaWRlOiBlbmNvZGUgaW5uZXIgKHdoaXRlc3BhY2UpLgogICAgeyBpbnNpZGU6IHRydWUsIG91dHNpZGU6IGZhbHNlIH0KICApIDogKAogICAgLy8gUHVuY3R1YXRpb24gaW5zaWRlOiBhbHJlYWR5IGZvcm1zLgogICAgeyBpbnNpZGU6IGZhbHNlLCBvdXRzaWRlOiBmYWxzZSB9CiAgKTsKfQpfX25hbWUoZW5jb2RlSW5mbywgImVuY29kZUluZm8iKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9oYW5kbGUvZW1waGFzaXMuanMKZW1waGFzaXMucGVlayA9IGVtcGhhc2lzUGVlazsKZnVuY3Rpb24gZW1waGFzaXMobm9kZTIsIF8zLCBzdGF0ZSwgaW5mbykgewogIGNvbnN0IG1hcmtlciA9IGNoZWNrRW1waGFzaXMoc3RhdGUpOwogIGNvbnN0IGV4aXQzID0gc3RhdGUuZW50ZXIoImVtcGhhc2lzIik7CiAgY29uc3QgdHJhY2tlciA9IHN0YXRlLmNyZWF0ZVRyYWNrZXIoaW5mbyk7CiAgY29uc3QgYmVmb3JlID0gdHJhY2tlci5tb3ZlKG1hcmtlcik7CiAgbGV0IGJldHdlZW4yID0gdHJhY2tlci5tb3ZlKAogICAgc3RhdGUuY29udGFpbmVyUGhyYXNpbmcobm9kZTIsIHsKICAgICAgYWZ0ZXI6IG1hcmtlciwKICAgICAgYmVmb3JlLAogICAgICAuLi50cmFja2VyLmN1cnJlbnQoKQogICAgfSkKICApOwogIGNvbnN0IGJldHdlZW5IZWFkID0gYmV0d2VlbjIuY2hhckNvZGVBdCgwKTsKICBjb25zdCBvcGVuID0gZW5jb2RlSW5mbygKICAgIGluZm8uYmVmb3JlLmNoYXJDb2RlQXQoaW5mby5iZWZvcmUubGVuZ3RoIC0gMSksCiAgICBiZXR3ZWVuSGVhZCwKICAgIG1hcmtlcgogICk7CiAgaWYgKG9wZW4uaW5zaWRlKSB7CiAgICBiZXR3ZWVuMiA9IGVuY29kZUNoYXJhY3RlclJlZmVyZW5jZShiZXR3ZWVuSGVhZCkgKyBiZXR3ZWVuMi5zbGljZSgxKTsKICB9CiAgY29uc3QgYmV0d2VlblRhaWwgPSBiZXR3ZWVuMi5jaGFyQ29kZUF0KGJldHdlZW4yLmxlbmd0aCAtIDEpOwogIGNvbnN0IGNsb3NlNyA9IGVuY29kZUluZm8oaW5mby5hZnRlci5jaGFyQ29kZUF0KDApLCBiZXR3ZWVuVGFpbCwgbWFya2VyKTsKICBpZiAoY2xvc2U3Lmluc2lkZSkgewogICAgYmV0d2VlbjIgPSBiZXR3ZWVuMi5zbGljZSgwLCAtMSkgKyBlbmNvZGVDaGFyYWN0ZXJSZWZlcmVuY2UoYmV0d2VlblRhaWwpOwogIH0KICBjb25zdCBhZnRlciA9IHRyYWNrZXIubW92ZShtYXJrZXIpOwogIGV4aXQzKCk7CiAgc3RhdGUuYXR0ZW50aW9uRW5jb2RlU3Vycm91bmRpbmdJbmZvID0gewogICAgYWZ0ZXI6IGNsb3NlNy5vdXRzaWRlLAogICAgYmVmb3JlOiBvcGVuLm91dHNpZGUKICB9OwogIHJldHVybiBiZWZvcmUgKyBiZXR3ZWVuMiArIGFmdGVyOwp9Cl9fbmFtZShlbXBoYXNpcywgImVtcGhhc2lzIik7CmZ1bmN0aW9uIGVtcGhhc2lzUGVlayhfMywgXzEsIHN0YXRlKSB7CiAgcmV0dXJuIHN0YXRlLm9wdGlvbnMuZW1waGFzaXMgfHwgIioiOwp9Cl9fbmFtZShlbXBoYXNpc1BlZWssICJlbXBoYXNpc1BlZWsiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS91bmlzdC11dGlsLXZpc2l0QDUuMS4wL25vZGVfbW9kdWxlcy91bmlzdC11dGlsLXZpc2l0L2xpYi9pbmRleC5qcwpmdW5jdGlvbiB2aXNpdCh0cmVlLCB0ZXN0T3JWaXNpdG9yLCB2aXNpdG9yT3JSZXZlcnNlLCBtYXliZVJldmVyc2UpIHsKICBsZXQgcmV2ZXJzZTsKICBsZXQgdGVzdDsKICBsZXQgdmlzaXRvcjsKICBpZiAodHlwZW9mIHRlc3RPclZpc2l0b3IgPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIHZpc2l0b3JPclJldmVyc2UgIT09ICJmdW5jdGlvbiIpIHsKICAgIHRlc3QgPSB2b2lkIDA7CiAgICB2aXNpdG9yID0gdGVzdE9yVmlzaXRvcjsKICAgIHJldmVyc2UgPSB2aXNpdG9yT3JSZXZlcnNlOwogIH0gZWxzZSB7CiAgICB0ZXN0ID0gdGVzdE9yVmlzaXRvcjsKICAgIHZpc2l0b3IgPSB2aXNpdG9yT3JSZXZlcnNlOwogICAgcmV2ZXJzZSA9IG1heWJlUmV2ZXJzZTsKICB9CiAgdmlzaXRQYXJlbnRzKHRyZWUsIHRlc3QsIG92ZXJsb2FkLCByZXZlcnNlKTsKICBmdW5jdGlvbiBvdmVybG9hZChub2RlMiwgcGFyZW50cykgewogICAgY29uc3QgcGFyZW50ID0gcGFyZW50c1twYXJlbnRzLmxlbmd0aCAtIDFdOwogICAgY29uc3QgaW5kZXgyID0gcGFyZW50ID8gcGFyZW50LmNoaWxkcmVuLmluZGV4T2Yobm9kZTIpIDogdm9pZCAwOwogICAgcmV0dXJuIHZpc2l0b3Iobm9kZTIsIGluZGV4MiwgcGFyZW50KTsKICB9CiAgX19uYW1lKG92ZXJsb2FkLCAib3ZlcmxvYWQiKTsKfQpfX25hbWUodmlzaXQsICJ2aXNpdCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tc3RyaW5nQDQuMC4wL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLXN0cmluZy9saWIvaW5kZXguanMKdmFyIGVtcHR5T3B0aW9ucyA9IHt9OwpmdW5jdGlvbiB0b1N0cmluZyh2YWx1ZTIsIG9wdGlvbnMpIHsKICBjb25zdCBzZXR0aW5ncyA9IG9wdGlvbnMgfHwgZW1wdHlPcHRpb25zOwogIGNvbnN0IGluY2x1ZGVJbWFnZUFsdCA9IHR5cGVvZiBzZXR0aW5ncy5pbmNsdWRlSW1hZ2VBbHQgPT09ICJib29sZWFuIiA/IHNldHRpbmdzLmluY2x1ZGVJbWFnZUFsdCA6IHRydWU7CiAgY29uc3QgaW5jbHVkZUh0bWwgPSB0eXBlb2Ygc2V0dGluZ3MuaW5jbHVkZUh0bWwgPT09ICJib29sZWFuIiA/IHNldHRpbmdzLmluY2x1ZGVIdG1sIDogdHJ1ZTsKICByZXR1cm4gb25lKHZhbHVlMiwgaW5jbHVkZUltYWdlQWx0LCBpbmNsdWRlSHRtbCk7Cn0KX19uYW1lKHRvU3RyaW5nLCAidG9TdHJpbmciKTsKZnVuY3Rpb24gb25lKHZhbHVlMiwgaW5jbHVkZUltYWdlQWx0LCBpbmNsdWRlSHRtbCkgewogIGlmIChub2RlKHZhbHVlMikpIHsKICAgIGlmICgidmFsdWUiIGluIHZhbHVlMikgewogICAgICByZXR1cm4gdmFsdWUyLnR5cGUgPT09ICJodG1sIiAmJiAhaW5jbHVkZUh0bWwgPyAiIiA6IHZhbHVlMi52YWx1ZTsKICAgIH0KICAgIGlmIChpbmNsdWRlSW1hZ2VBbHQgJiYgImFsdCIgaW4gdmFsdWUyICYmIHZhbHVlMi5hbHQpIHsKICAgICAgcmV0dXJuIHZhbHVlMi5hbHQ7CiAgICB9CiAgICBpZiAoImNoaWxkcmVuIiBpbiB2YWx1ZTIpIHsKICAgICAgcmV0dXJuIGFsbCh2YWx1ZTIuY2hpbGRyZW4sIGluY2x1ZGVJbWFnZUFsdCwgaW5jbHVkZUh0bWwpOwogICAgfQogIH0KICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZTIpKSB7CiAgICByZXR1cm4gYWxsKHZhbHVlMiwgaW5jbHVkZUltYWdlQWx0LCBpbmNsdWRlSHRtbCk7CiAgfQogIHJldHVybiAiIjsKfQpfX25hbWUob25lLCAib25lIik7CmZ1bmN0aW9uIGFsbCh2YWx1ZXMsIGluY2x1ZGVJbWFnZUFsdCwgaW5jbHVkZUh0bWwpIHsKICBjb25zdCByZXN1bHQgPSBbXTsKICBsZXQgaW5kZXgyID0gLTE7CiAgd2hpbGUgKCsraW5kZXgyIDwgdmFsdWVzLmxlbmd0aCkgewogICAgcmVzdWx0W2luZGV4Ml0gPSBvbmUodmFsdWVzW2luZGV4Ml0sIGluY2x1ZGVJbWFnZUFsdCwgaW5jbHVkZUh0bWwpOwogIH0KICByZXR1cm4gcmVzdWx0LmpvaW4oIiIpOwp9Cl9fbmFtZShhbGwsICJhbGwiKTsKZnVuY3Rpb24gbm9kZSh2YWx1ZTIpIHsKICByZXR1cm4gQm9vbGVhbih2YWx1ZTIgJiYgdHlwZW9mIHZhbHVlMiA9PT0gIm9iamVjdCIpOwp9Cl9fbmFtZShub2RlLCAibm9kZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvZm9ybWF0LWhlYWRpbmctYXMtc2V0ZXh0LmpzCmZ1bmN0aW9uIGZvcm1hdEhlYWRpbmdBc1NldGV4dChub2RlMiwgc3RhdGUpIHsKICBsZXQgbGl0ZXJhbFdpdGhCcmVhayA9IGZhbHNlOwogIHZpc2l0KG5vZGUyLCBmdW5jdGlvbihub2RlMykgewogICAgaWYgKCJ2YWx1ZSIgaW4gbm9kZTMgJiYgL1xyP1xufFxyLy50ZXN0KG5vZGUzLnZhbHVlKSB8fCBub2RlMy50eXBlID09PSAiYnJlYWsiKSB7CiAgICAgIGxpdGVyYWxXaXRoQnJlYWsgPSB0cnVlOwogICAgICByZXR1cm4gRVhJVDsKICAgIH0KICB9KTsKICByZXR1cm4gQm9vbGVhbigKICAgICghbm9kZTIuZGVwdGggfHwgbm9kZTIuZGVwdGggPCAzKSAmJiB0b1N0cmluZyhub2RlMikgJiYgKHN0YXRlLm9wdGlvbnMuc2V0ZXh0IHx8IGxpdGVyYWxXaXRoQnJlYWspCiAgKTsKfQpfX25hbWUoZm9ybWF0SGVhZGluZ0FzU2V0ZXh0LCAiZm9ybWF0SGVhZGluZ0FzU2V0ZXh0Iik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaGFuZGxlL2hlYWRpbmcuanMKZnVuY3Rpb24gaGVhZGluZyhub2RlMiwgXzMsIHN0YXRlLCBpbmZvKSB7CiAgY29uc3QgcmFuayA9IE1hdGgubWF4KE1hdGgubWluKDYsIG5vZGUyLmRlcHRoIHx8IDEpLCAxKTsKICBjb25zdCB0cmFja2VyID0gc3RhdGUuY3JlYXRlVHJhY2tlcihpbmZvKTsKICBpZiAoZm9ybWF0SGVhZGluZ0FzU2V0ZXh0KG5vZGUyLCBzdGF0ZSkpIHsKICAgIGNvbnN0IGV4aXQ0ID0gc3RhdGUuZW50ZXIoImhlYWRpbmdTZXRleHQiKTsKICAgIGNvbnN0IHN1YmV4aXQyID0gc3RhdGUuZW50ZXIoInBocmFzaW5nIik7CiAgICBjb25zdCB2YWx1ZTMgPSBzdGF0ZS5jb250YWluZXJQaHJhc2luZyhub2RlMiwgewogICAgICAuLi50cmFja2VyLmN1cnJlbnQoKSwKICAgICAgYmVmb3JlOiAiXG4iLAogICAgICBhZnRlcjogIlxuIgogICAgfSk7CiAgICBzdWJleGl0MigpOwogICAgZXhpdDQoKTsKICAgIHJldHVybiB2YWx1ZTMgKyAiXG4iICsgKHJhbmsgPT09IDEgPyAiPSIgOiAiLSIpLnJlcGVhdCgKICAgICAgLy8gVGhlIHdob2xlIHNpemXigKYKICAgICAgdmFsdWUzLmxlbmd0aCAtIC8vIE1pbnVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgY2hhcmFjdGVyIGFmdGVyIHRoZSBsYXN0IEVPTCAob3IKICAgICAgLy8gMCBpZiB0aGVyZSBpcyBub25lKeKApgogICAgICAoTWF0aC5tYXgodmFsdWUzLmxhc3RJbmRleE9mKCJcciIpLCB2YWx1ZTMubGFzdEluZGV4T2YoIlxuIikpICsgMSkKICAgICk7CiAgfQogIGNvbnN0IHNlcXVlbmNlID0gIiMiLnJlcGVhdChyYW5rKTsKICBjb25zdCBleGl0MyA9IHN0YXRlLmVudGVyKCJoZWFkaW5nQXR4Iik7CiAgY29uc3Qgc3ViZXhpdCA9IHN0YXRlLmVudGVyKCJwaHJhc2luZyIpOwogIHRyYWNrZXIubW92ZShzZXF1ZW5jZSArICIgIik7CiAgbGV0IHZhbHVlMiA9IHN0YXRlLmNvbnRhaW5lclBocmFzaW5nKG5vZGUyLCB7CiAgICBiZWZvcmU6ICIjICIsCiAgICBhZnRlcjogIlxuIiwKICAgIC4uLnRyYWNrZXIuY3VycmVudCgpCiAgfSk7CiAgaWYgKC9eW1x0IF0vLnRlc3QodmFsdWUyKSkgewogICAgdmFsdWUyID0gZW5jb2RlQ2hhcmFjdGVyUmVmZXJlbmNlKHZhbHVlMi5jaGFyQ29kZUF0KDApKSArIHZhbHVlMi5zbGljZSgxKTsKICB9CiAgdmFsdWUyID0gdmFsdWUyID8gc2VxdWVuY2UgKyAiICIgKyB2YWx1ZTIgOiBzZXF1ZW5jZTsKICBpZiAoc3RhdGUub3B0aW9ucy5jbG9zZUF0eCkgewogICAgdmFsdWUyICs9ICIgIiArIHNlcXVlbmNlOwogIH0KICBzdWJleGl0KCk7CiAgZXhpdDMoKTsKICByZXR1cm4gdmFsdWUyOwp9Cl9fbmFtZShoZWFkaW5nLCAiaGVhZGluZyIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9odG1sLmpzCmh0bWwucGVlayA9IGh0bWxQZWVrOwpmdW5jdGlvbiBodG1sKG5vZGUyKSB7CiAgcmV0dXJuIG5vZGUyLnZhbHVlIHx8ICIiOwp9Cl9fbmFtZShodG1sLCAiaHRtbCIpOwpmdW5jdGlvbiBodG1sUGVlaygpIHsKICByZXR1cm4gIjwiOwp9Cl9fbmFtZShodG1sUGVlaywgImh0bWxQZWVrIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaGFuZGxlL2ltYWdlLmpzCmltYWdlLnBlZWsgPSBpbWFnZVBlZWs7CmZ1bmN0aW9uIGltYWdlKG5vZGUyLCBfMywgc3RhdGUsIGluZm8pIHsKICBjb25zdCBxdW90ZSA9IGNoZWNrUXVvdGUoc3RhdGUpOwogIGNvbnN0IHN1ZmZpeCA9IHF1b3RlID09PSAnIicgPyAiUXVvdGUiIDogIkFwb3N0cm9waGUiOwogIGNvbnN0IGV4aXQzID0gc3RhdGUuZW50ZXIoImltYWdlIik7CiAgbGV0IHN1YmV4aXQgPSBzdGF0ZS5lbnRlcigibGFiZWwiKTsKICBjb25zdCB0cmFja2VyID0gc3RhdGUuY3JlYXRlVHJhY2tlcihpbmZvKTsKICBsZXQgdmFsdWUyID0gdHJhY2tlci5tb3ZlKCIhWyIpOwogIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoCiAgICBzdGF0ZS5zYWZlKG5vZGUyLmFsdCwgeyBiZWZvcmU6IHZhbHVlMiwgYWZ0ZXI6ICJdIiwgLi4udHJhY2tlci5jdXJyZW50KCkgfSkKICApOwogIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoIl0oIik7CiAgc3ViZXhpdCgpOwogIGlmICgKICAgIC8vIElmIHRoZXJl4oCZcyBubyB1cmwgYnV0IHRoZXJlIGlzIGEgdGl0bGXigKYKICAgICFub2RlMi51cmwgJiYgbm9kZTIudGl0bGUgfHwgLy8gSWYgdGhlcmUgYXJlIGNvbnRyb2wgY2hhcmFjdGVycyBvciB3aGl0ZXNwYWNlLgogICAgL1tcMC0gXHUwMDdGXS8udGVzdChub2RlMi51cmwpCiAgKSB7CiAgICBzdWJleGl0ID0gc3RhdGUuZW50ZXIoImRlc3RpbmF0aW9uTGl0ZXJhbCIpOwogICAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgiPCIpOwogICAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgKICAgICAgc3RhdGUuc2FmZShub2RlMi51cmwsIHsgYmVmb3JlOiB2YWx1ZTIsIGFmdGVyOiAiPiIsIC4uLnRyYWNrZXIuY3VycmVudCgpIH0pCiAgICApOwogICAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgiPiIpOwogIH0gZWxzZSB7CiAgICBzdWJleGl0ID0gc3RhdGUuZW50ZXIoImRlc3RpbmF0aW9uUmF3Iik7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKAogICAgICBzdGF0ZS5zYWZlKG5vZGUyLnVybCwgewogICAgICAgIGJlZm9yZTogdmFsdWUyLAogICAgICAgIGFmdGVyOiBub2RlMi50aXRsZSA/ICIgIiA6ICIpIiwKICAgICAgICAuLi50cmFja2VyLmN1cnJlbnQoKQogICAgICB9KQogICAgKTsKICB9CiAgc3ViZXhpdCgpOwogIGlmIChub2RlMi50aXRsZSkgewogICAgc3ViZXhpdCA9IHN0YXRlLmVudGVyKGB0aXRsZSR7c3VmZml4fWApOwogICAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgiICIgKyBxdW90ZSk7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKAogICAgICBzdGF0ZS5zYWZlKG5vZGUyLnRpdGxlLCB7CiAgICAgICAgYmVmb3JlOiB2YWx1ZTIsCiAgICAgICAgYWZ0ZXI6IHF1b3RlLAogICAgICAgIC4uLnRyYWNrZXIuY3VycmVudCgpCiAgICAgIH0pCiAgICApOwogICAgdmFsdWUyICs9IHRyYWNrZXIubW92ZShxdW90ZSk7CiAgICBzdWJleGl0KCk7CiAgfQogIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoIikiKTsKICBleGl0MygpOwogIHJldHVybiB2YWx1ZTI7Cn0KX19uYW1lKGltYWdlLCAiaW1hZ2UiKTsKZnVuY3Rpb24gaW1hZ2VQZWVrKCkgewogIHJldHVybiAiISI7Cn0KX19uYW1lKGltYWdlUGVlaywgImltYWdlUGVlayIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9pbWFnZS1yZWZlcmVuY2UuanMKaW1hZ2VSZWZlcmVuY2UucGVlayA9IGltYWdlUmVmZXJlbmNlUGVlazsKZnVuY3Rpb24gaW1hZ2VSZWZlcmVuY2Uobm9kZTIsIF8zLCBzdGF0ZSwgaW5mbykgewogIGNvbnN0IHR5cGU1ID0gbm9kZTIucmVmZXJlbmNlVHlwZTsKICBjb25zdCBleGl0MyA9IHN0YXRlLmVudGVyKCJpbWFnZVJlZmVyZW5jZSIpOwogIGxldCBzdWJleGl0ID0gc3RhdGUuZW50ZXIoImxhYmVsIik7CiAgY29uc3QgdHJhY2tlciA9IHN0YXRlLmNyZWF0ZVRyYWNrZXIoaW5mbyk7CiAgbGV0IHZhbHVlMiA9IHRyYWNrZXIubW92ZSgiIVsiKTsKICBjb25zdCBhbHQgPSBzdGF0ZS5zYWZlKG5vZGUyLmFsdCwgewogICAgYmVmb3JlOiB2YWx1ZTIsCiAgICBhZnRlcjogIl0iLAogICAgLi4udHJhY2tlci5jdXJyZW50KCkKICB9KTsKICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKGFsdCArICJdWyIpOwogIHN1YmV4aXQoKTsKICBjb25zdCBzdGFjayA9IHN0YXRlLnN0YWNrOwogIHN0YXRlLnN0YWNrID0gW107CiAgc3ViZXhpdCA9IHN0YXRlLmVudGVyKCJyZWZlcmVuY2UiKTsKICBjb25zdCByZWZlcmVuY2UgPSBzdGF0ZS5zYWZlKHN0YXRlLmFzc29jaWF0aW9uSWQobm9kZTIpLCB7CiAgICBiZWZvcmU6IHZhbHVlMiwKICAgIGFmdGVyOiAiXSIsCiAgICAuLi50cmFja2VyLmN1cnJlbnQoKQogIH0pOwogIHN1YmV4aXQoKTsKICBzdGF0ZS5zdGFjayA9IHN0YWNrOwogIGV4aXQzKCk7CiAgaWYgKHR5cGU1ID09PSAiZnVsbCIgfHwgIWFsdCB8fCBhbHQgIT09IHJlZmVyZW5jZSkgewogICAgdmFsdWUyICs9IHRyYWNrZXIubW92ZShyZWZlcmVuY2UgKyAiXSIpOwogIH0gZWxzZSBpZiAodHlwZTUgPT09ICJzaG9ydGN1dCIpIHsKICAgIHZhbHVlMiA9IHZhbHVlMi5zbGljZSgwLCAtMSk7CiAgfSBlbHNlIHsKICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoIl0iKTsKICB9CiAgcmV0dXJuIHZhbHVlMjsKfQpfX25hbWUoaW1hZ2VSZWZlcmVuY2UsICJpbWFnZVJlZmVyZW5jZSIpOwpmdW5jdGlvbiBpbWFnZVJlZmVyZW5jZVBlZWsoKSB7CiAgcmV0dXJuICIhIjsKfQpfX25hbWUoaW1hZ2VSZWZlcmVuY2VQZWVrLCAiaW1hZ2VSZWZlcmVuY2VQZWVrIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaGFuZGxlL2lubGluZS1jb2RlLmpzCmlubGluZUNvZGUucGVlayA9IGlubGluZUNvZGVQZWVrOwpmdW5jdGlvbiBpbmxpbmVDb2RlKG5vZGUyLCBfMywgc3RhdGUpIHsKICBsZXQgdmFsdWUyID0gbm9kZTIudmFsdWUgfHwgIiI7CiAgbGV0IHNlcXVlbmNlID0gImAiOwogIGxldCBpbmRleDIgPSAtMTsKICB3aGlsZSAobmV3IFJlZ0V4cCgiKF58W15gXSkiICsgc2VxdWVuY2UgKyAiKFteYF18JCkiKS50ZXN0KHZhbHVlMikpIHsKICAgIHNlcXVlbmNlICs9ICJgIjsKICB9CiAgaWYgKC9bXiBcclxuXS8udGVzdCh2YWx1ZTIpICYmICgvXlsgXHJcbl0vLnRlc3QodmFsdWUyKSAmJiAvWyBcclxuXSQvLnRlc3QodmFsdWUyKSB8fCAvXmB8YCQvLnRlc3QodmFsdWUyKSkpIHsKICAgIHZhbHVlMiA9ICIgIiArIHZhbHVlMiArICIgIjsKICB9CiAgd2hpbGUgKCsraW5kZXgyIDwgc3RhdGUudW5zYWZlLmxlbmd0aCkgewogICAgY29uc3QgcGF0dGVybiA9IHN0YXRlLnVuc2FmZVtpbmRleDJdOwogICAgY29uc3QgZXhwcmVzc2lvbiA9IHN0YXRlLmNvbXBpbGVQYXR0ZXJuKHBhdHRlcm4pOwogICAgbGV0IG1hdGNoMjsKICAgIGlmICghcGF0dGVybi5hdEJyZWFrKSBjb250aW51ZTsKICAgIHdoaWxlIChtYXRjaDIgPSBleHByZXNzaW9uLmV4ZWModmFsdWUyKSkgewogICAgICBsZXQgcG9zaXRpb24zID0gbWF0Y2gyLmluZGV4OwogICAgICBpZiAodmFsdWUyLmNoYXJDb2RlQXQocG9zaXRpb24zKSA9PT0gMTAgJiYgdmFsdWUyLmNoYXJDb2RlQXQocG9zaXRpb24zIC0gMSkgPT09IDEzKSB7CiAgICAgICAgcG9zaXRpb24zLS07CiAgICAgIH0KICAgICAgdmFsdWUyID0gdmFsdWUyLnNsaWNlKDAsIHBvc2l0aW9uMykgKyAiICIgKyB2YWx1ZTIuc2xpY2UobWF0Y2gyLmluZGV4ICsgMSk7CiAgICB9CiAgfQogIHJldHVybiBzZXF1ZW5jZSArIHZhbHVlMiArIHNlcXVlbmNlOwp9Cl9fbmFtZShpbmxpbmVDb2RlLCAiaW5saW5lQ29kZSIpOwpmdW5jdGlvbiBpbmxpbmVDb2RlUGVlaygpIHsKICByZXR1cm4gImAiOwp9Cl9fbmFtZShpbmxpbmVDb2RlUGVlaywgImlubGluZUNvZGVQZWVrIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9mb3JtYXQtbGluay1hcy1hdXRvbGluay5qcwpmdW5jdGlvbiBmb3JtYXRMaW5rQXNBdXRvbGluayhub2RlMiwgc3RhdGUpIHsKICBjb25zdCByYXcyID0gdG9TdHJpbmcobm9kZTIpOwogIHJldHVybiBCb29sZWFuKAogICAgIXN0YXRlLm9wdGlvbnMucmVzb3VyY2VMaW5rICYmIC8vIElmIHRoZXJl4oCZcyBhIHVybOKApgogICAgbm9kZTIudXJsICYmIC8vIEFuZCB0aGVyZeKAmXMgYSBubyB0aXRsZeKApgogICAgIW5vZGUyLnRpdGxlICYmIC8vIEFuZCB0aGUgY29udGVudCBvZiBgbm9kZWAgaXMgYSBzaW5nbGUgdGV4dCBub2Rl4oCmCiAgICBub2RlMi5jaGlsZHJlbiAmJiBub2RlMi5jaGlsZHJlbi5sZW5ndGggPT09IDEgJiYgbm9kZTIuY2hpbGRyZW5bMF0udHlwZSA9PT0gInRleHQiICYmIC8vIEFuZCBpZiB0aGUgdXJsIGlzIHRoZSBzYW1lIGFzIHRoZSBjb250ZW504oCmCiAgICAocmF3MiA9PT0gbm9kZTIudXJsIHx8ICJtYWlsdG86IiArIHJhdzIgPT09IG5vZGUyLnVybCkgJiYgLy8gQW5kIHRoYXQgc3RhcnRzIHcvIGEgcHJvdG9jb2zigKYKICAgIC9eW2Etel1bYS16Ky4tXSs6L2kudGVzdChub2RlMi51cmwpICYmIC8vIEFuZCB0aGF0IGRvZXNu4oCZdCBjb250YWluIEFTQ0lJIGNvbnRyb2wgY29kZXMgKGNoYXJhY3RlciBlc2NhcGVzIGFuZAogICAgLy8gcmVmZXJlbmNlcyBkb27igJl0IHdvcmspLCBzcGFjZSwgb3IgYW5nbGUgYnJhY2tldHPigKYKICAgICEvW1wwLSA8Plx1MDA3Rl0vLnRlc3Qobm9kZTIudXJsKQogICk7Cn0KX19uYW1lKGZvcm1hdExpbmtBc0F1dG9saW5rLCAiZm9ybWF0TGlua0FzQXV0b2xpbmsiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9oYW5kbGUvbGluay5qcwpsaW5rLnBlZWsgPSBsaW5rUGVlazsKZnVuY3Rpb24gbGluayhub2RlMiwgXzMsIHN0YXRlLCBpbmZvKSB7CiAgY29uc3QgcXVvdGUgPSBjaGVja1F1b3RlKHN0YXRlKTsKICBjb25zdCBzdWZmaXggPSBxdW90ZSA9PT0gJyInID8gIlF1b3RlIiA6ICJBcG9zdHJvcGhlIjsKICBjb25zdCB0cmFja2VyID0gc3RhdGUuY3JlYXRlVHJhY2tlcihpbmZvKTsKICBsZXQgZXhpdDM7CiAgbGV0IHN1YmV4aXQ7CiAgaWYgKGZvcm1hdExpbmtBc0F1dG9saW5rKG5vZGUyLCBzdGF0ZSkpIHsKICAgIGNvbnN0IHN0YWNrID0gc3RhdGUuc3RhY2s7CiAgICBzdGF0ZS5zdGFjayA9IFtdOwogICAgZXhpdDMgPSBzdGF0ZS5lbnRlcigiYXV0b2xpbmsiKTsKICAgIGxldCB2YWx1ZTMgPSB0cmFja2VyLm1vdmUoIjwiKTsKICAgIHZhbHVlMyArPSB0cmFja2VyLm1vdmUoCiAgICAgIHN0YXRlLmNvbnRhaW5lclBocmFzaW5nKG5vZGUyLCB7CiAgICAgICAgYmVmb3JlOiB2YWx1ZTMsCiAgICAgICAgYWZ0ZXI6ICI+IiwKICAgICAgICAuLi50cmFja2VyLmN1cnJlbnQoKQogICAgICB9KQogICAgKTsKICAgIHZhbHVlMyArPSB0cmFja2VyLm1vdmUoIj4iKTsKICAgIGV4aXQzKCk7CiAgICBzdGF0ZS5zdGFjayA9IHN0YWNrOwogICAgcmV0dXJuIHZhbHVlMzsKICB9CiAgZXhpdDMgPSBzdGF0ZS5lbnRlcigibGluayIpOwogIHN1YmV4aXQgPSBzdGF0ZS5lbnRlcigibGFiZWwiKTsKICBsZXQgdmFsdWUyID0gdHJhY2tlci5tb3ZlKCJbIik7CiAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgKICAgIHN0YXRlLmNvbnRhaW5lclBocmFzaW5nKG5vZGUyLCB7CiAgICAgIGJlZm9yZTogdmFsdWUyLAogICAgICBhZnRlcjogIl0oIiwKICAgICAgLi4udHJhY2tlci5jdXJyZW50KCkKICAgIH0pCiAgKTsKICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKCJdKCIpOwogIHN1YmV4aXQoKTsKICBpZiAoCiAgICAvLyBJZiB0aGVyZeKAmXMgbm8gdXJsIGJ1dCB0aGVyZSBpcyBhIHRpdGxl4oCmCiAgICAhbm9kZTIudXJsICYmIG5vZGUyLnRpdGxlIHx8IC8vIElmIHRoZXJlIGFyZSBjb250cm9sIGNoYXJhY3RlcnMgb3Igd2hpdGVzcGFjZS4KICAgIC9bXDAtIFx1MDA3Rl0vLnRlc3Qobm9kZTIudXJsKQogICkgewogICAgc3ViZXhpdCA9IHN0YXRlLmVudGVyKCJkZXN0aW5hdGlvbkxpdGVyYWwiKTsKICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoIjwiKTsKICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoCiAgICAgIHN0YXRlLnNhZmUobm9kZTIudXJsLCB7IGJlZm9yZTogdmFsdWUyLCBhZnRlcjogIj4iLCAuLi50cmFja2VyLmN1cnJlbnQoKSB9KQogICAgKTsKICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoIj4iKTsKICB9IGVsc2UgewogICAgc3ViZXhpdCA9IHN0YXRlLmVudGVyKCJkZXN0aW5hdGlvblJhdyIpOwogICAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgKICAgICAgc3RhdGUuc2FmZShub2RlMi51cmwsIHsKICAgICAgICBiZWZvcmU6IHZhbHVlMiwKICAgICAgICBhZnRlcjogbm9kZTIudGl0bGUgPyAiICIgOiAiKSIsCiAgICAgICAgLi4udHJhY2tlci5jdXJyZW50KCkKICAgICAgfSkKICAgICk7CiAgfQogIHN1YmV4aXQoKTsKICBpZiAobm9kZTIudGl0bGUpIHsKICAgIHN1YmV4aXQgPSBzdGF0ZS5lbnRlcihgdGl0bGUke3N1ZmZpeH1gKTsKICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoIiAiICsgcXVvdGUpOwogICAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgKICAgICAgc3RhdGUuc2FmZShub2RlMi50aXRsZSwgewogICAgICAgIGJlZm9yZTogdmFsdWUyLAogICAgICAgIGFmdGVyOiBxdW90ZSwKICAgICAgICAuLi50cmFja2VyLmN1cnJlbnQoKQogICAgICB9KQogICAgKTsKICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUocXVvdGUpOwogICAgc3ViZXhpdCgpOwogIH0KICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKCIpIik7CiAgZXhpdDMoKTsKICByZXR1cm4gdmFsdWUyOwp9Cl9fbmFtZShsaW5rLCAibGluayIpOwpmdW5jdGlvbiBsaW5rUGVlayhub2RlMiwgXzMsIHN0YXRlKSB7CiAgcmV0dXJuIGZvcm1hdExpbmtBc0F1dG9saW5rKG5vZGUyLCBzdGF0ZSkgPyAiPCIgOiAiWyI7Cn0KX19uYW1lKGxpbmtQZWVrLCAibGlua1BlZWsiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9oYW5kbGUvbGluay1yZWZlcmVuY2UuanMKbGlua1JlZmVyZW5jZS5wZWVrID0gbGlua1JlZmVyZW5jZVBlZWs7CmZ1bmN0aW9uIGxpbmtSZWZlcmVuY2Uobm9kZTIsIF8zLCBzdGF0ZSwgaW5mbykgewogIGNvbnN0IHR5cGU1ID0gbm9kZTIucmVmZXJlbmNlVHlwZTsKICBjb25zdCBleGl0MyA9IHN0YXRlLmVudGVyKCJsaW5rUmVmZXJlbmNlIik7CiAgbGV0IHN1YmV4aXQgPSBzdGF0ZS5lbnRlcigibGFiZWwiKTsKICBjb25zdCB0cmFja2VyID0gc3RhdGUuY3JlYXRlVHJhY2tlcihpbmZvKTsKICBsZXQgdmFsdWUyID0gdHJhY2tlci5tb3ZlKCJbIik7CiAgY29uc3QgdGV4dDggPSBzdGF0ZS5jb250YWluZXJQaHJhc2luZyhub2RlMiwgewogICAgYmVmb3JlOiB2YWx1ZTIsCiAgICBhZnRlcjogIl0iLAogICAgLi4udHJhY2tlci5jdXJyZW50KCkKICB9KTsKICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKHRleHQ4ICsgIl1bIik7CiAgc3ViZXhpdCgpOwogIGNvbnN0IHN0YWNrID0gc3RhdGUuc3RhY2s7CiAgc3RhdGUuc3RhY2sgPSBbXTsKICBzdWJleGl0ID0gc3RhdGUuZW50ZXIoInJlZmVyZW5jZSIpOwogIGNvbnN0IHJlZmVyZW5jZSA9IHN0YXRlLnNhZmUoc3RhdGUuYXNzb2NpYXRpb25JZChub2RlMiksIHsKICAgIGJlZm9yZTogdmFsdWUyLAogICAgYWZ0ZXI6ICJdIiwKICAgIC4uLnRyYWNrZXIuY3VycmVudCgpCiAgfSk7CiAgc3ViZXhpdCgpOwogIHN0YXRlLnN0YWNrID0gc3RhY2s7CiAgZXhpdDMoKTsKICBpZiAodHlwZTUgPT09ICJmdWxsIiB8fCAhdGV4dDggfHwgdGV4dDggIT09IHJlZmVyZW5jZSkgewogICAgdmFsdWUyICs9IHRyYWNrZXIubW92ZShyZWZlcmVuY2UgKyAiXSIpOwogIH0gZWxzZSBpZiAodHlwZTUgPT09ICJzaG9ydGN1dCIpIHsKICAgIHZhbHVlMiA9IHZhbHVlMi5zbGljZSgwLCAtMSk7CiAgfSBlbHNlIHsKICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoIl0iKTsKICB9CiAgcmV0dXJuIHZhbHVlMjsKfQpfX25hbWUobGlua1JlZmVyZW5jZSwgImxpbmtSZWZlcmVuY2UiKTsKZnVuY3Rpb24gbGlua1JlZmVyZW5jZVBlZWsoKSB7CiAgcmV0dXJuICJbIjsKfQpfX25hbWUobGlua1JlZmVyZW5jZVBlZWssICJsaW5rUmVmZXJlbmNlUGVlayIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvY2hlY2stYnVsbGV0LmpzCmZ1bmN0aW9uIGNoZWNrQnVsbGV0KHN0YXRlKSB7CiAgY29uc3QgbWFya2VyID0gc3RhdGUub3B0aW9ucy5idWxsZXQgfHwgIioiOwogIGlmIChtYXJrZXIgIT09ICIqIiAmJiBtYXJrZXIgIT09ICIrIiAmJiBtYXJrZXIgIT09ICItIikgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAiQ2Fubm90IHNlcmlhbGl6ZSBpdGVtcyB3aXRoIGAiICsgbWFya2VyICsgImAgZm9yIGBvcHRpb25zLmJ1bGxldGAsIGV4cGVjdGVkIGAqYCwgYCtgLCBvciBgLWAiCiAgICApOwogIH0KICByZXR1cm4gbWFya2VyOwp9Cl9fbmFtZShjaGVja0J1bGxldCwgImNoZWNrQnVsbGV0Iik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9jaGVjay1idWxsZXQtb3RoZXIuanMKZnVuY3Rpb24gY2hlY2tCdWxsZXRPdGhlcihzdGF0ZSkgewogIGNvbnN0IGJ1bGxldCA9IGNoZWNrQnVsbGV0KHN0YXRlKTsKICBjb25zdCBidWxsZXRPdGhlciA9IHN0YXRlLm9wdGlvbnMuYnVsbGV0T3RoZXI7CiAgaWYgKCFidWxsZXRPdGhlcikgewogICAgcmV0dXJuIGJ1bGxldCA9PT0gIioiID8gIi0iIDogIioiOwogIH0KICBpZiAoYnVsbGV0T3RoZXIgIT09ICIqIiAmJiBidWxsZXRPdGhlciAhPT0gIisiICYmIGJ1bGxldE90aGVyICE9PSAiLSIpIHsKICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgIkNhbm5vdCBzZXJpYWxpemUgaXRlbXMgd2l0aCBgIiArIGJ1bGxldE90aGVyICsgImAgZm9yIGBvcHRpb25zLmJ1bGxldE90aGVyYCwgZXhwZWN0ZWQgYCpgLCBgK2AsIG9yIGAtYCIKICAgICk7CiAgfQogIGlmIChidWxsZXRPdGhlciA9PT0gYnVsbGV0KSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICJFeHBlY3RlZCBgYnVsbGV0YCAoYCIgKyBidWxsZXQgKyAiYCkgYW5kIGBidWxsZXRPdGhlcmAgKGAiICsgYnVsbGV0T3RoZXIgKyAiYCkgdG8gYmUgZGlmZmVyZW50IgogICAgKTsKICB9CiAgcmV0dXJuIGJ1bGxldE90aGVyOwp9Cl9fbmFtZShjaGVja0J1bGxldE90aGVyLCAiY2hlY2tCdWxsZXRPdGhlciIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvY2hlY2stYnVsbGV0LW9yZGVyZWQuanMKZnVuY3Rpb24gY2hlY2tCdWxsZXRPcmRlcmVkKHN0YXRlKSB7CiAgY29uc3QgbWFya2VyID0gc3RhdGUub3B0aW9ucy5idWxsZXRPcmRlcmVkIHx8ICIuIjsKICBpZiAobWFya2VyICE9PSAiLiIgJiYgbWFya2VyICE9PSAiKSIpIHsKICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgIkNhbm5vdCBzZXJpYWxpemUgaXRlbXMgd2l0aCBgIiArIG1hcmtlciArICJgIGZvciBgb3B0aW9ucy5idWxsZXRPcmRlcmVkYCwgZXhwZWN0ZWQgYC5gIG9yIGApYCIKICAgICk7CiAgfQogIHJldHVybiBtYXJrZXI7Cn0KX19uYW1lKGNoZWNrQnVsbGV0T3JkZXJlZCwgImNoZWNrQnVsbGV0T3JkZXJlZCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvY2hlY2stcnVsZS5qcwpmdW5jdGlvbiBjaGVja1J1bGUoc3RhdGUpIHsKICBjb25zdCBtYXJrZXIgPSBzdGF0ZS5vcHRpb25zLnJ1bGUgfHwgIioiOwogIGlmIChtYXJrZXIgIT09ICIqIiAmJiBtYXJrZXIgIT09ICItIiAmJiBtYXJrZXIgIT09ICJfIikgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAiQ2Fubm90IHNlcmlhbGl6ZSBydWxlcyB3aXRoIGAiICsgbWFya2VyICsgImAgZm9yIGBvcHRpb25zLnJ1bGVgLCBleHBlY3RlZCBgKmAsIGAtYCwgb3IgYF9gIgogICAgKTsKICB9CiAgcmV0dXJuIG1hcmtlcjsKfQpfX25hbWUoY2hlY2tSdWxlLCAiY2hlY2tSdWxlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaGFuZGxlL2xpc3QuanMKZnVuY3Rpb24gbGlzdDIobm9kZTIsIHBhcmVudCwgc3RhdGUsIGluZm8pIHsKICBjb25zdCBleGl0MyA9IHN0YXRlLmVudGVyKCJsaXN0Iik7CiAgY29uc3QgYnVsbGV0Q3VycmVudCA9IHN0YXRlLmJ1bGxldEN1cnJlbnQ7CiAgbGV0IGJ1bGxldCA9IG5vZGUyLm9yZGVyZWQgPyBjaGVja0J1bGxldE9yZGVyZWQoc3RhdGUpIDogY2hlY2tCdWxsZXQoc3RhdGUpOwogIGNvbnN0IGJ1bGxldE90aGVyID0gbm9kZTIub3JkZXJlZCA/IGJ1bGxldCA9PT0gIi4iID8gIikiIDogIi4iIDogY2hlY2tCdWxsZXRPdGhlcihzdGF0ZSk7CiAgbGV0IHVzZURpZmZlcmVudE1hcmtlciA9IHBhcmVudCAmJiBzdGF0ZS5idWxsZXRMYXN0VXNlZCA/IGJ1bGxldCA9PT0gc3RhdGUuYnVsbGV0TGFzdFVzZWQgOiBmYWxzZTsKICBpZiAoIW5vZGUyLm9yZGVyZWQpIHsKICAgIGNvbnN0IGZpcnN0TGlzdEl0ZW0gPSBub2RlMi5jaGlsZHJlbiA/IG5vZGUyLmNoaWxkcmVuWzBdIDogdm9pZCAwOwogICAgaWYgKAogICAgICAvLyBCdWxsZXQgY291bGQgYmUgdXNlZCBhcyBhIHRoZW1hdGljIGJyZWFrIG1hcmtlcjoKICAgICAgKGJ1bGxldCA9PT0gIioiIHx8IGJ1bGxldCA9PT0gIi0iKSAmJiAvLyBFbXB0eSBmaXJzdCBsaXN0IGl0ZW06CiAgICAgIGZpcnN0TGlzdEl0ZW0gJiYgKCFmaXJzdExpc3RJdGVtLmNoaWxkcmVuIHx8ICFmaXJzdExpc3RJdGVtLmNoaWxkcmVuWzBdKSAmJiAvLyBEaXJlY3RseSBpbiB0d28gb3RoZXIgbGlzdCBpdGVtczoKICAgICAgc3RhdGUuc3RhY2tbc3RhdGUuc3RhY2subGVuZ3RoIC0gMV0gPT09ICJsaXN0IiAmJiBzdGF0ZS5zdGFja1tzdGF0ZS5zdGFjay5sZW5ndGggLSAyXSA9PT0gImxpc3RJdGVtIiAmJiBzdGF0ZS5zdGFja1tzdGF0ZS5zdGFjay5sZW5ndGggLSAzXSA9PT0gImxpc3QiICYmIHN0YXRlLnN0YWNrW3N0YXRlLnN0YWNrLmxlbmd0aCAtIDRdID09PSAibGlzdEl0ZW0iICYmIC8vIFRoYXQgYXJlIGVhY2ggdGhlIGZpcnN0IGNoaWxkLgogICAgICBzdGF0ZS5pbmRleFN0YWNrW3N0YXRlLmluZGV4U3RhY2subGVuZ3RoIC0gMV0gPT09IDAgJiYgc3RhdGUuaW5kZXhTdGFja1tzdGF0ZS5pbmRleFN0YWNrLmxlbmd0aCAtIDJdID09PSAwICYmIHN0YXRlLmluZGV4U3RhY2tbc3RhdGUuaW5kZXhTdGFjay5sZW5ndGggLSAzXSA9PT0gMAogICAgKSB7CiAgICAgIHVzZURpZmZlcmVudE1hcmtlciA9IHRydWU7CiAgICB9CiAgICBpZiAoY2hlY2tSdWxlKHN0YXRlKSA9PT0gYnVsbGV0ICYmIGZpcnN0TGlzdEl0ZW0pIHsKICAgICAgbGV0IGluZGV4MiA9IC0xOwogICAgICB3aGlsZSAoKytpbmRleDIgPCBub2RlMi5jaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgICBjb25zdCBpdGVtID0gbm9kZTIuY2hpbGRyZW5baW5kZXgyXTsKICAgICAgICBpZiAoaXRlbSAmJiBpdGVtLnR5cGUgPT09ICJsaXN0SXRlbSIgJiYgaXRlbS5jaGlsZHJlbiAmJiBpdGVtLmNoaWxkcmVuWzBdICYmIGl0ZW0uY2hpbGRyZW5bMF0udHlwZSA9PT0gInRoZW1hdGljQnJlYWsiKSB7CiAgICAgICAgICB1c2VEaWZmZXJlbnRNYXJrZXIgPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIGlmICh1c2VEaWZmZXJlbnRNYXJrZXIpIHsKICAgIGJ1bGxldCA9IGJ1bGxldE90aGVyOwogIH0KICBzdGF0ZS5idWxsZXRDdXJyZW50ID0gYnVsbGV0OwogIGNvbnN0IHZhbHVlMiA9IHN0YXRlLmNvbnRhaW5lckZsb3cobm9kZTIsIGluZm8pOwogIHN0YXRlLmJ1bGxldExhc3RVc2VkID0gYnVsbGV0OwogIHN0YXRlLmJ1bGxldEN1cnJlbnQgPSBidWxsZXRDdXJyZW50OwogIGV4aXQzKCk7CiAgcmV0dXJuIHZhbHVlMjsKfQpfX25hbWUobGlzdDIsICJsaXN0Iik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9jaGVjay1saXN0LWl0ZW0taW5kZW50LmpzCmZ1bmN0aW9uIGNoZWNrTGlzdEl0ZW1JbmRlbnQoc3RhdGUpIHsKICBjb25zdCBzdHlsZSA9IHN0YXRlLm9wdGlvbnMubGlzdEl0ZW1JbmRlbnQgfHwgIm9uZSI7CiAgaWYgKHN0eWxlICE9PSAidGFiIiAmJiBzdHlsZSAhPT0gIm9uZSIgJiYgc3R5bGUgIT09ICJtaXhlZCIpIHsKICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgIkNhbm5vdCBzZXJpYWxpemUgaXRlbXMgd2l0aCBgIiArIHN0eWxlICsgImAgZm9yIGBvcHRpb25zLmxpc3RJdGVtSW5kZW50YCwgZXhwZWN0ZWQgYHRhYmAsIGBvbmVgLCBvciBgbWl4ZWRgIgogICAgKTsKICB9CiAgcmV0dXJuIHN0eWxlOwp9Cl9fbmFtZShjaGVja0xpc3RJdGVtSW5kZW50LCAiY2hlY2tMaXN0SXRlbUluZGVudCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9saXN0LWl0ZW0uanMKZnVuY3Rpb24gbGlzdEl0ZW0obm9kZTIsIHBhcmVudCwgc3RhdGUsIGluZm8pIHsKICBjb25zdCBsaXN0SXRlbUluZGVudCA9IGNoZWNrTGlzdEl0ZW1JbmRlbnQoc3RhdGUpOwogIGxldCBidWxsZXQgPSBzdGF0ZS5idWxsZXRDdXJyZW50IHx8IGNoZWNrQnVsbGV0KHN0YXRlKTsKICBpZiAocGFyZW50ICYmIHBhcmVudC50eXBlID09PSAibGlzdCIgJiYgcGFyZW50Lm9yZGVyZWQpIHsKICAgIGJ1bGxldCA9ICh0eXBlb2YgcGFyZW50LnN0YXJ0ID09PSAibnVtYmVyIiAmJiBwYXJlbnQuc3RhcnQgPiAtMSA/IHBhcmVudC5zdGFydCA6IDEpICsgKHN0YXRlLm9wdGlvbnMuaW5jcmVtZW50TGlzdE1hcmtlciA9PT0gZmFsc2UgPyAwIDogcGFyZW50LmNoaWxkcmVuLmluZGV4T2Yobm9kZTIpKSArIGJ1bGxldDsKICB9CiAgbGV0IHNpemUgPSBidWxsZXQubGVuZ3RoICsgMTsKICBpZiAobGlzdEl0ZW1JbmRlbnQgPT09ICJ0YWIiIHx8IGxpc3RJdGVtSW5kZW50ID09PSAibWl4ZWQiICYmIChwYXJlbnQgJiYgcGFyZW50LnR5cGUgPT09ICJsaXN0IiAmJiBwYXJlbnQuc3ByZWFkIHx8IG5vZGUyLnNwcmVhZCkpIHsKICAgIHNpemUgPSBNYXRoLmNlaWwoc2l6ZSAvIDQpICogNDsKICB9CiAgY29uc3QgdHJhY2tlciA9IHN0YXRlLmNyZWF0ZVRyYWNrZXIoaW5mbyk7CiAgdHJhY2tlci5tb3ZlKGJ1bGxldCArICIgIi5yZXBlYXQoc2l6ZSAtIGJ1bGxldC5sZW5ndGgpKTsKICB0cmFja2VyLnNoaWZ0KHNpemUpOwogIGNvbnN0IGV4aXQzID0gc3RhdGUuZW50ZXIoImxpc3RJdGVtIik7CiAgY29uc3QgdmFsdWUyID0gc3RhdGUuaW5kZW50TGluZXMoCiAgICBzdGF0ZS5jb250YWluZXJGbG93KG5vZGUyLCB0cmFja2VyLmN1cnJlbnQoKSksCiAgICBtYXA3CiAgKTsKICBleGl0MygpOwogIHJldHVybiB2YWx1ZTI7CiAgZnVuY3Rpb24gbWFwNyhsaW5lLCBpbmRleDIsIGJsYW5rKSB7CiAgICBpZiAoaW5kZXgyKSB7CiAgICAgIHJldHVybiAoYmxhbmsgPyAiIiA6ICIgIi5yZXBlYXQoc2l6ZSkpICsgbGluZTsKICAgIH0KICAgIHJldHVybiAoYmxhbmsgPyBidWxsZXQgOiBidWxsZXQgKyAiICIucmVwZWF0KHNpemUgLSBidWxsZXQubGVuZ3RoKSkgKyBsaW5lOwogIH0KICBfX25hbWUobWFwNywgIm1hcCIpOwp9Cl9fbmFtZShsaXN0SXRlbSwgImxpc3RJdGVtIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaGFuZGxlL3BhcmFncmFwaC5qcwpmdW5jdGlvbiBwYXJhZ3JhcGgobm9kZTIsIF8zLCBzdGF0ZSwgaW5mbykgewogIGNvbnN0IGV4aXQzID0gc3RhdGUuZW50ZXIoInBhcmFncmFwaCIpOwogIGNvbnN0IHN1YmV4aXQgPSBzdGF0ZS5lbnRlcigicGhyYXNpbmciKTsKICBjb25zdCB2YWx1ZTIgPSBzdGF0ZS5jb250YWluZXJQaHJhc2luZyhub2RlMiwgaW5mbyk7CiAgc3ViZXhpdCgpOwogIGV4aXQzKCk7CiAgcmV0dXJuIHZhbHVlMjsKfQpfX25hbWUocGFyYWdyYXBoLCAicGFyYWdyYXBoIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC1waHJhc2luZ0A0LjEuMC9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1waHJhc2luZy9saWIvaW5kZXguanMKdmFyIHBocmFzaW5nID0gKAogIC8qKiBAdHlwZSB7KG5vZGU/OiB1bmtub3duKSA9PiBub2RlIGlzIEV4Y2x1ZGU8UGhyYXNpbmdDb250ZW50LCBIdG1sPn0gKi8KICBjb252ZXJ0KFsKICAgICJicmVhayIsCiAgICAiZGVsZXRlIiwKICAgICJlbXBoYXNpcyIsCiAgICAvLyBUbyBkbzogbmV4dCBtYWpvcjogcmVtb3ZlZCBzaW5jZSBmb290bm90ZXMgd2VyZSBhZGRlZCB0byBHRk0uCiAgICAiZm9vdG5vdGUiLAogICAgImZvb3Rub3RlUmVmZXJlbmNlIiwKICAgICJpbWFnZSIsCiAgICAiaW1hZ2VSZWZlcmVuY2UiLAogICAgImlubGluZUNvZGUiLAogICAgLy8gRW5hYmxlZCBieSBgbWRhc3QtdXRpbC1tYXRoYDoKICAgICJpbmxpbmVNYXRoIiwKICAgICJsaW5rIiwKICAgICJsaW5rUmVmZXJlbmNlIiwKICAgIC8vIEVuYWJsZWQgYnkgYG1kYXN0LXV0aWwtbWR4YDoKICAgICJtZHhKc3hUZXh0RWxlbWVudCIsCiAgICAvLyBFbmFibGVkIGJ5IGBtZGFzdC11dGlsLW1keGA6CiAgICAibWR4VGV4dEV4cHJlc3Npb24iLAogICAgInN0cm9uZyIsCiAgICAidGV4dCIsCiAgICAvLyBFbmFibGVkIGJ5IGBtZGFzdC11dGlsLWRpcmVjdGl2ZWA6CiAgICAidGV4dERpcmVjdGl2ZSIKICBdKQopOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9yb290LmpzCmZ1bmN0aW9uIHJvb3Qobm9kZTIsIF8zLCBzdGF0ZSwgaW5mbykgewogIGNvbnN0IGhhc1BocmFzaW5nID0gbm9kZTIuY2hpbGRyZW4uc29tZShmdW5jdGlvbihkNCkgewogICAgcmV0dXJuIHBocmFzaW5nKGQ0KTsKICB9KTsKICBjb25zdCBjb250YWluZXIgPSBoYXNQaHJhc2luZyA/IHN0YXRlLmNvbnRhaW5lclBocmFzaW5nIDogc3RhdGUuY29udGFpbmVyRmxvdzsKICByZXR1cm4gY29udGFpbmVyLmNhbGwoc3RhdGUsIG5vZGUyLCBpbmZvKTsKfQpfX25hbWUocm9vdCwgInJvb3QiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2NoZWNrLXN0cm9uZy5qcwpmdW5jdGlvbiBjaGVja1N0cm9uZyhzdGF0ZSkgewogIGNvbnN0IG1hcmtlciA9IHN0YXRlLm9wdGlvbnMuc3Ryb25nIHx8ICIqIjsKICBpZiAobWFya2VyICE9PSAiKiIgJiYgbWFya2VyICE9PSAiXyIpIHsKICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgIkNhbm5vdCBzZXJpYWxpemUgc3Ryb25nIHdpdGggYCIgKyBtYXJrZXIgKyAiYCBmb3IgYG9wdGlvbnMuc3Ryb25nYCwgZXhwZWN0ZWQgYCpgLCBvciBgX2AiCiAgICApOwogIH0KICByZXR1cm4gbWFya2VyOwp9Cl9fbmFtZShjaGVja1N0cm9uZywgImNoZWNrU3Ryb25nIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaGFuZGxlL3N0cm9uZy5qcwpzdHJvbmcucGVlayA9IHN0cm9uZ1BlZWs7CmZ1bmN0aW9uIHN0cm9uZyhub2RlMiwgXzMsIHN0YXRlLCBpbmZvKSB7CiAgY29uc3QgbWFya2VyID0gY2hlY2tTdHJvbmcoc3RhdGUpOwogIGNvbnN0IGV4aXQzID0gc3RhdGUuZW50ZXIoInN0cm9uZyIpOwogIGNvbnN0IHRyYWNrZXIgPSBzdGF0ZS5jcmVhdGVUcmFja2VyKGluZm8pOwogIGNvbnN0IGJlZm9yZSA9IHRyYWNrZXIubW92ZShtYXJrZXIgKyBtYXJrZXIpOwogIGxldCBiZXR3ZWVuMiA9IHRyYWNrZXIubW92ZSgKICAgIHN0YXRlLmNvbnRhaW5lclBocmFzaW5nKG5vZGUyLCB7CiAgICAgIGFmdGVyOiBtYXJrZXIsCiAgICAgIGJlZm9yZSwKICAgICAgLi4udHJhY2tlci5jdXJyZW50KCkKICAgIH0pCiAgKTsKICBjb25zdCBiZXR3ZWVuSGVhZCA9IGJldHdlZW4yLmNoYXJDb2RlQXQoMCk7CiAgY29uc3Qgb3BlbiA9IGVuY29kZUluZm8oCiAgICBpbmZvLmJlZm9yZS5jaGFyQ29kZUF0KGluZm8uYmVmb3JlLmxlbmd0aCAtIDEpLAogICAgYmV0d2VlbkhlYWQsCiAgICBtYXJrZXIKICApOwogIGlmIChvcGVuLmluc2lkZSkgewogICAgYmV0d2VlbjIgPSBlbmNvZGVDaGFyYWN0ZXJSZWZlcmVuY2UoYmV0d2VlbkhlYWQpICsgYmV0d2VlbjIuc2xpY2UoMSk7CiAgfQogIGNvbnN0IGJldHdlZW5UYWlsID0gYmV0d2VlbjIuY2hhckNvZGVBdChiZXR3ZWVuMi5sZW5ndGggLSAxKTsKICBjb25zdCBjbG9zZTcgPSBlbmNvZGVJbmZvKGluZm8uYWZ0ZXIuY2hhckNvZGVBdCgwKSwgYmV0d2VlblRhaWwsIG1hcmtlcik7CiAgaWYgKGNsb3NlNy5pbnNpZGUpIHsKICAgIGJldHdlZW4yID0gYmV0d2VlbjIuc2xpY2UoMCwgLTEpICsgZW5jb2RlQ2hhcmFjdGVyUmVmZXJlbmNlKGJldHdlZW5UYWlsKTsKICB9CiAgY29uc3QgYWZ0ZXIgPSB0cmFja2VyLm1vdmUobWFya2VyICsgbWFya2VyKTsKICBleGl0MygpOwogIHN0YXRlLmF0dGVudGlvbkVuY29kZVN1cnJvdW5kaW5nSW5mbyA9IHsKICAgIGFmdGVyOiBjbG9zZTcub3V0c2lkZSwKICAgIGJlZm9yZTogb3Blbi5vdXRzaWRlCiAgfTsKICByZXR1cm4gYmVmb3JlICsgYmV0d2VlbjIgKyBhZnRlcjsKfQpfX25hbWUoc3Ryb25nLCAic3Ryb25nIik7CmZ1bmN0aW9uIHN0cm9uZ1BlZWsoXzMsIF8xLCBzdGF0ZSkgewogIHJldHVybiBzdGF0ZS5vcHRpb25zLnN0cm9uZyB8fCAiKiI7Cn0KX19uYW1lKHN0cm9uZ1BlZWssICJzdHJvbmdQZWVrIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaGFuZGxlL3RleHQuanMKZnVuY3Rpb24gdGV4dChub2RlMiwgXzMsIHN0YXRlLCBpbmZvKSB7CiAgcmV0dXJuIHN0YXRlLnNhZmUobm9kZTIudmFsdWUsIGluZm8pOwp9Cl9fbmFtZSh0ZXh0LCAidGV4dCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvY2hlY2stcnVsZS1yZXBldGl0aW9uLmpzCmZ1bmN0aW9uIGNoZWNrUnVsZVJlcGV0aXRpb24oc3RhdGUpIHsKICBjb25zdCByZXBldGl0aW9uID0gc3RhdGUub3B0aW9ucy5ydWxlUmVwZXRpdGlvbiB8fCAzOwogIGlmIChyZXBldGl0aW9uIDwgMykgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAiQ2Fubm90IHNlcmlhbGl6ZSBydWxlcyB3aXRoIHJlcGV0aXRpb24gYCIgKyByZXBldGl0aW9uICsgImAgZm9yIGBvcHRpb25zLnJ1bGVSZXBldGl0aW9uYCwgZXhwZWN0ZWQgYDNgIG9yIG1vcmUiCiAgICApOwogIH0KICByZXR1cm4gcmVwZXRpdGlvbjsKfQpfX25hbWUoY2hlY2tSdWxlUmVwZXRpdGlvbiwgImNoZWNrUnVsZVJlcGV0aXRpb24iKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9oYW5kbGUvdGhlbWF0aWMtYnJlYWsuanMKZnVuY3Rpb24gdGhlbWF0aWNCcmVhayhfMywgXzEsIHN0YXRlKSB7CiAgY29uc3QgdmFsdWUyID0gKGNoZWNrUnVsZShzdGF0ZSkgKyAoc3RhdGUub3B0aW9ucy5ydWxlU3BhY2VzID8gIiAiIDogIiIpKS5yZXBlYXQoY2hlY2tSdWxlUmVwZXRpdGlvbihzdGF0ZSkpOwogIHJldHVybiBzdGF0ZS5vcHRpb25zLnJ1bGVTcGFjZXMgPyB2YWx1ZTIuc2xpY2UoMCwgLTEpIDogdmFsdWUyOwp9Cl9fbmFtZSh0aGVtYXRpY0JyZWFrLCAidGhlbWF0aWNCcmVhayIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9pbmRleC5qcwp2YXIgaGFuZGxlID0gewogIGJsb2NrcXVvdGUsCiAgYnJlYWs6IGhhcmRCcmVhaywKICBjb2RlLAogIGRlZmluaXRpb24sCiAgZW1waGFzaXMsCiAgaGFyZEJyZWFrLAogIGhlYWRpbmcsCiAgaHRtbCwKICBpbWFnZSwKICBpbWFnZVJlZmVyZW5jZSwKICBpbmxpbmVDb2RlLAogIGxpbmssCiAgbGlua1JlZmVyZW5jZSwKICBsaXN0OiBsaXN0MiwKICBsaXN0SXRlbSwKICBwYXJhZ3JhcGgsCiAgcm9vdCwKICBzdHJvbmcsCiAgdGV4dCwKICB0aGVtYXRpY0JyZWFrCn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvam9pbi5qcwp2YXIgam9pbjIgPSBbam9pbkRlZmF1bHRzXTsKZnVuY3Rpb24gam9pbkRlZmF1bHRzKGxlZnQsIHJpZ2h0LCBwYXJlbnQsIHN0YXRlKSB7CiAgaWYgKHJpZ2h0LnR5cGUgPT09ICJjb2RlIiAmJiBmb3JtYXRDb2RlQXNJbmRlbnRlZChyaWdodCwgc3RhdGUpICYmIChsZWZ0LnR5cGUgPT09ICJsaXN0IiB8fCBsZWZ0LnR5cGUgPT09IHJpZ2h0LnR5cGUgJiYgZm9ybWF0Q29kZUFzSW5kZW50ZWQobGVmdCwgc3RhdGUpKSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBpZiAoInNwcmVhZCIgaW4gcGFyZW50ICYmIHR5cGVvZiBwYXJlbnQuc3ByZWFkID09PSAiYm9vbGVhbiIpIHsKICAgIGlmIChsZWZ0LnR5cGUgPT09ICJwYXJhZ3JhcGgiICYmIC8vIFR3byBwYXJhZ3JhcGhzLgogICAgKGxlZnQudHlwZSA9PT0gcmlnaHQudHlwZSB8fCByaWdodC50eXBlID09PSAiZGVmaW5pdGlvbiIgfHwgLy8gUGFyYWdyYXBoIGZvbGxvd2VkIGJ5IGEgc2V0ZXh0IGhlYWRpbmcuCiAgICByaWdodC50eXBlID09PSAiaGVhZGluZyIgJiYgZm9ybWF0SGVhZGluZ0FzU2V0ZXh0KHJpZ2h0LCBzdGF0ZSkpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHJldHVybiBwYXJlbnQuc3ByZWFkID8gMSA6IDA7CiAgfQp9Cl9fbmFtZShqb2luRGVmYXVsdHMsICJqb2luRGVmYXVsdHMiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91bnNhZmUuanMKdmFyIGZ1bGxQaHJhc2luZ1NwYW5zID0gWwogICJhdXRvbGluayIsCiAgImRlc3RpbmF0aW9uTGl0ZXJhbCIsCiAgImRlc3RpbmF0aW9uUmF3IiwKICAicmVmZXJlbmNlIiwKICAidGl0bGVRdW90ZSIsCiAgInRpdGxlQXBvc3Ryb3BoZSIKXTsKdmFyIHVuc2FmZSA9IFsKICB7IGNoYXJhY3RlcjogIgkiLCBhZnRlcjogIltcXHJcXG5dIiwgaW5Db25zdHJ1Y3Q6ICJwaHJhc2luZyIgfSwKICB7IGNoYXJhY3RlcjogIgkiLCBiZWZvcmU6ICJbXFxyXFxuXSIsIGluQ29uc3RydWN0OiAicGhyYXNpbmciIH0sCiAgewogICAgY2hhcmFjdGVyOiAiCSIsCiAgICBpbkNvbnN0cnVjdDogWyJjb2RlRmVuY2VkTGFuZ0dyYXZlQWNjZW50IiwgImNvZGVGZW5jZWRMYW5nVGlsZGUiXQogIH0sCiAgewogICAgY2hhcmFjdGVyOiAiXHIiLAogICAgaW5Db25zdHJ1Y3Q6IFsKICAgICAgImNvZGVGZW5jZWRMYW5nR3JhdmVBY2NlbnQiLAogICAgICAiY29kZUZlbmNlZExhbmdUaWxkZSIsCiAgICAgICJjb2RlRmVuY2VkTWV0YUdyYXZlQWNjZW50IiwKICAgICAgImNvZGVGZW5jZWRNZXRhVGlsZGUiLAogICAgICAiZGVzdGluYXRpb25MaXRlcmFsIiwKICAgICAgImhlYWRpbmdBdHgiCiAgICBdCiAgfSwKICB7CiAgICBjaGFyYWN0ZXI6ICJcbiIsCiAgICBpbkNvbnN0cnVjdDogWwogICAgICAiY29kZUZlbmNlZExhbmdHcmF2ZUFjY2VudCIsCiAgICAgICJjb2RlRmVuY2VkTGFuZ1RpbGRlIiwKICAgICAgImNvZGVGZW5jZWRNZXRhR3JhdmVBY2NlbnQiLAogICAgICAiY29kZUZlbmNlZE1ldGFUaWxkZSIsCiAgICAgICJkZXN0aW5hdGlvbkxpdGVyYWwiLAogICAgICAiaGVhZGluZ0F0eCIKICAgIF0KICB9LAogIHsgY2hhcmFjdGVyOiAiICIsIGFmdGVyOiAiW1xcclxcbl0iLCBpbkNvbnN0cnVjdDogInBocmFzaW5nIiB9LAogIHsgY2hhcmFjdGVyOiAiICIsIGJlZm9yZTogIltcXHJcXG5dIiwgaW5Db25zdHJ1Y3Q6ICJwaHJhc2luZyIgfSwKICB7CiAgICBjaGFyYWN0ZXI6ICIgIiwKICAgIGluQ29uc3RydWN0OiBbImNvZGVGZW5jZWRMYW5nR3JhdmVBY2NlbnQiLCAiY29kZUZlbmNlZExhbmdUaWxkZSJdCiAgfSwKICAvLyBBbiBleGNsYW1hdGlvbiBtYXJrIGNhbiBzdGFydCBhbiBpbWFnZSwgaWYgaXQgaXMgZm9sbG93ZWQgYnkgYSBsaW5rIG9yCiAgLy8gYSBsaW5rIHJlZmVyZW5jZS4KICB7CiAgICBjaGFyYWN0ZXI6ICIhIiwKICAgIGFmdGVyOiAiXFxbIiwKICAgIGluQ29uc3RydWN0OiAicGhyYXNpbmciLAogICAgbm90SW5Db25zdHJ1Y3Q6IGZ1bGxQaHJhc2luZ1NwYW5zCiAgfSwKICAvLyBBIHF1b3RlIGNhbiBicmVhayBvdXQgb2YgYSB0aXRsZS4KICB7IGNoYXJhY3RlcjogJyInLCBpbkNvbnN0cnVjdDogInRpdGxlUXVvdGUiIH0sCiAgLy8gQSBudW1iZXIgc2lnbiBjb3VsZCBzdGFydCBhbiBBVFggaGVhZGluZyBpZiBpdCBzdGFydHMgYSBsaW5lLgogIHsgYXRCcmVhazogdHJ1ZSwgY2hhcmFjdGVyOiAiIyIgfSwKICB7IGNoYXJhY3RlcjogIiMiLCBpbkNvbnN0cnVjdDogImhlYWRpbmdBdHgiLCBhZnRlcjogIig/OltcclxuXXwkKSIgfSwKICAvLyBEb2xsYXIgc2lnbiBhbmQgcGVyY2VudGFnZSBhcmUgbm90IHVzZWQgaW4gbWFya2Rvd24uCiAgLy8gQW4gYW1wZXJzYW5kIGNvdWxkIHN0YXJ0IGEgY2hhcmFjdGVyIHJlZmVyZW5jZS4KICB7IGNoYXJhY3RlcjogIiYiLCBhZnRlcjogIlsjQS1aYS16XSIsIGluQ29uc3RydWN0OiAicGhyYXNpbmciIH0sCiAgLy8gQW4gYXBvc3Ryb3BoZSBjYW4gYnJlYWsgb3V0IG9mIGEgdGl0bGUuCiAgeyBjaGFyYWN0ZXI6ICInIiwgaW5Db25zdHJ1Y3Q6ICJ0aXRsZUFwb3N0cm9waGUiIH0sCiAgLy8gQSBsZWZ0IHBhcmVuIGNvdWxkIGJyZWFrIG91dCBvZiBhIGRlc3RpbmF0aW9uIHJhdy4KICB7IGNoYXJhY3RlcjogIigiLCBpbkNvbnN0cnVjdDogImRlc3RpbmF0aW9uUmF3IiB9LAogIC8vIEEgbGVmdCBwYXJlbiBmb2xsb3dlZCBieSBgXWAgY291bGQgbWFrZSBzb21ldGhpbmcgaW50byBhIGxpbmsgb3IgaW1hZ2UuCiAgewogICAgYmVmb3JlOiAiXFxdIiwKICAgIGNoYXJhY3RlcjogIigiLAogICAgaW5Db25zdHJ1Y3Q6ICJwaHJhc2luZyIsCiAgICBub3RJbkNvbnN0cnVjdDogZnVsbFBocmFzaW5nU3BhbnMKICB9LAogIC8vIEEgcmlnaHQgcGFyZW4gY291bGQgc3RhcnQgYSBsaXN0IGl0ZW0gb3IgYnJlYWsgb3V0IG9mIGEgZGVzdGluYXRpb24KICAvLyByYXcuCiAgeyBhdEJyZWFrOiB0cnVlLCBiZWZvcmU6ICJcXGQrIiwgY2hhcmFjdGVyOiAiKSIgfSwKICB7IGNoYXJhY3RlcjogIikiLCBpbkNvbnN0cnVjdDogImRlc3RpbmF0aW9uUmF3IiB9LAogIC8vIEFuIGFzdGVyaXNrIGNhbiBzdGFydCB0aGVtYXRpYyBicmVha3MsIGxpc3QgaXRlbXMsIGVtcGhhc2lzLCBzdHJvbmcuCiAgeyBhdEJyZWFrOiB0cnVlLCBjaGFyYWN0ZXI6ICIqIiwgYWZ0ZXI6ICIoPzpbIAlcclxuKl0pIiB9LAogIHsgY2hhcmFjdGVyOiAiKiIsIGluQ29uc3RydWN0OiAicGhyYXNpbmciLCBub3RJbkNvbnN0cnVjdDogZnVsbFBocmFzaW5nU3BhbnMgfSwKICAvLyBBIHBsdXMgc2lnbiBjb3VsZCBzdGFydCBhIGxpc3QgaXRlbS4KICB7IGF0QnJlYWs6IHRydWUsIGNoYXJhY3RlcjogIisiLCBhZnRlcjogIig/OlsgCVxyXG5dKSIgfSwKICAvLyBBIGRhc2ggY2FuIHN0YXJ0IHRoZW1hdGljIGJyZWFrcywgbGlzdCBpdGVtcywgYW5kIHNldGV4dCBoZWFkaW5nCiAgLy8gdW5kZXJsaW5lcy4KICB7IGF0QnJlYWs6IHRydWUsIGNoYXJhY3RlcjogIi0iLCBhZnRlcjogIig/OlsgCVxyXG4tXSkiIH0sCiAgLy8gQSBkb3QgY291bGQgc3RhcnQgYSBsaXN0IGl0ZW0uCiAgeyBhdEJyZWFrOiB0cnVlLCBiZWZvcmU6ICJcXGQrIiwgY2hhcmFjdGVyOiAiLiIsIGFmdGVyOiAiKD86WyAJXHJcbl18JCkiIH0sCiAgLy8gU2xhc2gsIGNvbG9uLCBhbmQgc2VtaWNvbG9uIGFyZSBub3QgdXNlZCBpbiBtYXJrZG93biBmb3IgY29uc3RydWN0cy4KICAvLyBBIGxlc3MgdGhhbiBjYW4gc3RhcnQgaHRtbCAoZmxvdyBvciB0ZXh0KSBvciBhbiBhdXRvbGluay4KICAvLyBIVE1MIGNvdWxkIHN0YXJ0IHdpdGggYW4gZXhjbGFtYXRpb24gbWFyayAoZGVjbGFyYXRpb24sIGNkYXRhLCBjb21tZW50KSwKICAvLyBzbGFzaCAoY2xvc2luZyB0YWcpLCBxdWVzdGlvbiBtYXJrIChpbnN0cnVjdGlvbiksIG9yIGEgbGV0dGVyICh0YWcpLgogIC8vIEFuIGF1dG9saW5rIGFsc28gc3RhcnRzIHdpdGggYSBsZXR0ZXIuCiAgLy8gRmluYWxseSwgaXQgY291bGQgYnJlYWsgb3V0IG9mIGEgZGVzdGluYXRpb24gbGl0ZXJhbC4KICB7IGF0QnJlYWs6IHRydWUsIGNoYXJhY3RlcjogIjwiLCBhZnRlcjogIlshLz9BLVphLXpdIiB9LAogIHsKICAgIGNoYXJhY3RlcjogIjwiLAogICAgYWZ0ZXI6ICJbIS8/QS1aYS16XSIsCiAgICBpbkNvbnN0cnVjdDogInBocmFzaW5nIiwKICAgIG5vdEluQ29uc3RydWN0OiBmdWxsUGhyYXNpbmdTcGFucwogIH0sCiAgeyBjaGFyYWN0ZXI6ICI8IiwgaW5Db25zdHJ1Y3Q6ICJkZXN0aW5hdGlvbkxpdGVyYWwiIH0sCiAgLy8gQW4gZXF1YWxzIHRvIGNhbiBzdGFydCBzZXRleHQgaGVhZGluZyB1bmRlcmxpbmVzLgogIHsgYXRCcmVhazogdHJ1ZSwgY2hhcmFjdGVyOiAiPSIgfSwKICAvLyBBIGdyZWF0ZXIgdGhhbiBjYW4gc3RhcnQgYmxvY2sgcXVvdGVzIGFuZCBpdCBjYW4gYnJlYWsgb3V0IG9mIGEKICAvLyBkZXN0aW5hdGlvbiBsaXRlcmFsLgogIHsgYXRCcmVhazogdHJ1ZSwgY2hhcmFjdGVyOiAiPiIgfSwKICB7IGNoYXJhY3RlcjogIj4iLCBpbkNvbnN0cnVjdDogImRlc3RpbmF0aW9uTGl0ZXJhbCIgfSwKICAvLyBRdWVzdGlvbiBtYXJrIGFuZCBhdCBzaWduIGFyZSBub3QgdXNlZCBpbiBtYXJrZG93biBmb3IgY29uc3RydWN0cy4KICAvLyBBIGxlZnQgYnJhY2tldCBjYW4gc3RhcnQgZGVmaW5pdGlvbnMsIHJlZmVyZW5jZXMsIGxhYmVscywKICB7IGF0QnJlYWs6IHRydWUsIGNoYXJhY3RlcjogIlsiIH0sCiAgeyBjaGFyYWN0ZXI6ICJbIiwgaW5Db25zdHJ1Y3Q6ICJwaHJhc2luZyIsIG5vdEluQ29uc3RydWN0OiBmdWxsUGhyYXNpbmdTcGFucyB9LAogIHsgY2hhcmFjdGVyOiAiWyIsIGluQ29uc3RydWN0OiBbImxhYmVsIiwgInJlZmVyZW5jZSJdIH0sCiAgLy8gQSBiYWNrc2xhc2ggY2FuIHN0YXJ0IGFuIGVzY2FwZSAod2hlbiBmb2xsb3dlZCBieSBwdW5jdHVhdGlvbikgb3IgYQogIC8vIGhhcmQgYnJlYWsgKHdoZW4gZm9sbG93ZWQgYnkgYW4gZW9sKS4KICAvLyBOb3RlOiB0eXBpY2FsIGVzY2FwZXMgYXJlIGhhbmRsZWQgaW4gYHNhZmVgIQogIHsgY2hhcmFjdGVyOiAiXFwiLCBhZnRlcjogIltcXHJcXG5dIiwgaW5Db25zdHJ1Y3Q6ICJwaHJhc2luZyIgfSwKICAvLyBBIHJpZ2h0IGJyYWNrZXQgY2FuIGV4aXQgbGFiZWxzLgogIHsgY2hhcmFjdGVyOiAiXSIsIGluQ29uc3RydWN0OiBbImxhYmVsIiwgInJlZmVyZW5jZSJdIH0sCiAgLy8gQ2FyZXQgaXMgbm90IHVzZWQgaW4gbWFya2Rvd24gZm9yIGNvbnN0cnVjdHMuCiAgLy8gQW4gdW5kZXJzY29yZSBjYW4gc3RhcnQgZW1waGFzaXMsIHN0cm9uZywgb3IgYSB0aGVtYXRpYyBicmVhay4KICB7IGF0QnJlYWs6IHRydWUsIGNoYXJhY3RlcjogIl8iIH0sCiAgeyBjaGFyYWN0ZXI6ICJfIiwgaW5Db25zdHJ1Y3Q6ICJwaHJhc2luZyIsIG5vdEluQ29uc3RydWN0OiBmdWxsUGhyYXNpbmdTcGFucyB9LAogIC8vIEEgZ3JhdmUgYWNjZW50IGNhbiBzdGFydCBjb2RlIChmZW5jZWQgb3IgdGV4dCksIG9yIGl0IGNhbiBicmVhayBvdXQgb2YKICAvLyBhIGdyYXZlIGFjY2VudCBjb2RlIGZlbmNlLgogIHsgYXRCcmVhazogdHJ1ZSwgY2hhcmFjdGVyOiAiYCIgfSwKICB7CiAgICBjaGFyYWN0ZXI6ICJgIiwKICAgIGluQ29uc3RydWN0OiBbImNvZGVGZW5jZWRMYW5nR3JhdmVBY2NlbnQiLCAiY29kZUZlbmNlZE1ldGFHcmF2ZUFjY2VudCJdCiAgfSwKICB7IGNoYXJhY3RlcjogImAiLCBpbkNvbnN0cnVjdDogInBocmFzaW5nIiwgbm90SW5Db25zdHJ1Y3Q6IGZ1bGxQaHJhc2luZ1NwYW5zIH0sCiAgLy8gTGVmdCBicmFjZSwgdmVydGljYWwgYmFyLCByaWdodCBicmFjZSBhcmUgbm90IHVzZWQgaW4gbWFya2Rvd24gZm9yCiAgLy8gY29uc3RydWN0cy4KICAvLyBBIHRpbGRlIGNhbiBzdGFydCBjb2RlIChmZW5jZWQpLgogIHsgYXRCcmVhazogdHJ1ZSwgY2hhcmFjdGVyOiAifiIgfQpdOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RlY29kZS1uYW1lZC1jaGFyYWN0ZXItcmVmZXJlbmNlQDEuMy4wL25vZGVfbW9kdWxlcy9kZWNvZGUtbmFtZWQtY2hhcmFjdGVyLXJlZmVyZW5jZS9pbmRleC5kb20uanMKdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpIik7CmZ1bmN0aW9uIGRlY29kZU5hbWVkQ2hhcmFjdGVyUmVmZXJlbmNlKHZhbHVlMikgewogIGNvbnN0IGNoYXJhY3RlclJlZmVyZW5jZTIgPSAiJiIgKyB2YWx1ZTIgKyAiOyI7CiAgZWxlbWVudC5pbm5lckhUTUwgPSBjaGFyYWN0ZXJSZWZlcmVuY2UyOwogIGNvbnN0IGNoYXJhY3RlciA9IGVsZW1lbnQudGV4dENvbnRlbnQ7CiAgaWYgKGNoYXJhY3Rlci5jaGFyQ29kZUF0KGNoYXJhY3Rlci5sZW5ndGggLSAxKSA9PT0gNTkgJiYgdmFsdWUyICE9PSAic2VtaSIpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgcmV0dXJuIGNoYXJhY3RlciA9PT0gY2hhcmFjdGVyUmVmZXJlbmNlMiA/IGZhbHNlIDogY2hhcmFjdGVyOwp9Cl9fbmFtZShkZWNvZGVOYW1lZENoYXJhY3RlclJlZmVyZW5jZSwgImRlY29kZU5hbWVkQ2hhcmFjdGVyUmVmZXJlbmNlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLXV0aWwtZGVjb2RlLW51bWVyaWMtY2hhcmFjdGVyLXJlZmVyZW5jZUAyLjAuMi9ub2RlX21vZHVsZXMvbWljcm9tYXJrLXV0aWwtZGVjb2RlLW51bWVyaWMtY2hhcmFjdGVyLXJlZmVyZW5jZS9pbmRleC5qcwpmdW5jdGlvbiBkZWNvZGVOdW1lcmljQ2hhcmFjdGVyUmVmZXJlbmNlKHZhbHVlMiwgYmFzZSkgewogIGNvbnN0IGNvZGU0ID0gTnVtYmVyLnBhcnNlSW50KHZhbHVlMiwgYmFzZSk7CiAgaWYgKAogICAgLy8gQzAgZXhjZXB0IGZvciBIVCwgTEYsIEZGLCBDUiwgc3BhY2UuCiAgICBjb2RlNCA8IDkgfHwgY29kZTQgPT09IDExIHx8IGNvZGU0ID4gMTMgJiYgY29kZTQgPCAzMiB8fCAvLyBDb250cm9sIGNoYXJhY3RlciAoREVMKSBvZiBDMCwgYW5kIEMxIGNvbnRyb2xzLgogICAgY29kZTQgPiAxMjYgJiYgY29kZTQgPCAxNjAgfHwgLy8gTG9uZSBoaWdoIHN1cnJvZ2F0ZXMgYW5kIGxvdyBzdXJyb2dhdGVzLgogICAgY29kZTQgPiA1NTI5NSAmJiBjb2RlNCA8IDU3MzQ0IHx8IC8vIE5vbmNoYXJhY3RlcnMuCiAgICBjb2RlNCA+IDY0OTc1ICYmIGNvZGU0IDwgNjUwMDggfHwgLyogZXNsaW50LWRpc2FibGUgbm8tYml0d2lzZSAqLwogICAgKGNvZGU0ICYgNjU1MzUpID09PSA2NTUzNSB8fCAoY29kZTQgJiA2NTUzNSkgPT09IDY1NTM0IHx8IC8qIGVzbGludC1lbmFibGUgbm8tYml0d2lzZSAqLwogICAgLy8gT3V0IG9mIHJhbmdlCiAgICBjb2RlNCA+IDExMTQxMTEKICApIHsKICAgIHJldHVybiAiXHVGRkZEIjsKICB9CiAgcmV0dXJuIFN0cmluZy5mcm9tQ29kZVBvaW50KGNvZGU0KTsKfQpfX25hbWUoZGVjb2RlTnVtZXJpY0NoYXJhY3RlclJlZmVyZW5jZSwgImRlY29kZU51bWVyaWNDaGFyYWN0ZXJSZWZlcmVuY2UiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstdXRpbC1kZWNvZGUtc3RyaW5nQDIuMC4xL25vZGVfbW9kdWxlcy9taWNyb21hcmstdXRpbC1kZWNvZGUtc3RyaW5nL2luZGV4LmpzCnZhciBjaGFyYWN0ZXJFc2NhcGVPclJlZmVyZW5jZSA9IC9cXChbIS0vOi1AWy1gey1+XSl8JigjKD86XGR7MSw3fXx4W1xkYS1mXXsxLDZ9KXxbXGRhLXpdezEsMzF9KTsvZ2k7CmZ1bmN0aW9uIGRlY29kZVN0cmluZyh2YWx1ZTIpIHsKICByZXR1cm4gdmFsdWUyLnJlcGxhY2UoY2hhcmFjdGVyRXNjYXBlT3JSZWZlcmVuY2UsIGRlY29kZSk7Cn0KX19uYW1lKGRlY29kZVN0cmluZywgImRlY29kZVN0cmluZyIpOwpmdW5jdGlvbiBkZWNvZGUoJDAsICQxLCAkMjIpIHsKICBpZiAoJDEpIHsKICAgIHJldHVybiAkMTsKICB9CiAgY29uc3QgaGVhZDIgPSAkMjIuY2hhckNvZGVBdCgwKTsKICBpZiAoaGVhZDIgPT09IDM1KSB7CiAgICBjb25zdCBoZWFkMyA9ICQyMi5jaGFyQ29kZUF0KDEpOwogICAgY29uc3QgaGV4MiA9IGhlYWQzID09PSAxMjAgfHwgaGVhZDMgPT09IDg4OwogICAgcmV0dXJuIGRlY29kZU51bWVyaWNDaGFyYWN0ZXJSZWZlcmVuY2UoJDIyLnNsaWNlKGhleDIgPyAyIDogMSksIGhleDIgPyAxNiA6IDEwKTsKICB9CiAgcmV0dXJuIGRlY29kZU5hbWVkQ2hhcmFjdGVyUmVmZXJlbmNlKCQyMikgfHwgJDA7Cn0KX19uYW1lKGRlY29kZSwgImRlY29kZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvYXNzb2NpYXRpb24uanMKZnVuY3Rpb24gYXNzb2NpYXRpb24obm9kZTIpIHsKICBpZiAobm9kZTIubGFiZWwgfHwgIW5vZGUyLmlkZW50aWZpZXIpIHsKICAgIHJldHVybiBub2RlMi5sYWJlbCB8fCAiIjsKICB9CiAgcmV0dXJuIGRlY29kZVN0cmluZyhub2RlMi5pZGVudGlmaWVyKTsKfQpfX25hbWUoYXNzb2NpYXRpb24sICJhc3NvY2lhdGlvbiIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvY29tcGlsZS1wYXR0ZXJuLmpzCmZ1bmN0aW9uIGNvbXBpbGVQYXR0ZXJuKHBhdHRlcm4pIHsKICBpZiAoIXBhdHRlcm4uX2NvbXBpbGVkKSB7CiAgICBjb25zdCBiZWZvcmUgPSAocGF0dGVybi5hdEJyZWFrID8gIltcXHJcXG5dW1xcdCBdKiIgOiAiIikgKyAocGF0dGVybi5iZWZvcmUgPyAiKD86IiArIHBhdHRlcm4uYmVmb3JlICsgIikiIDogIiIpOwogICAgcGF0dGVybi5fY29tcGlsZWQgPSBuZXcgUmVnRXhwKAogICAgICAoYmVmb3JlID8gIigiICsgYmVmb3JlICsgIikiIDogIiIpICsgKC9bfFxce30oKVtcXV4kKyo/Li1dLy50ZXN0KHBhdHRlcm4uY2hhcmFjdGVyKSA/ICJcXCIgOiAiIikgKyBwYXR0ZXJuLmNoYXJhY3RlciArIChwYXR0ZXJuLmFmdGVyID8gIig/OiIgKyBwYXR0ZXJuLmFmdGVyICsgIikiIDogIiIpLAogICAgICAiZyIKICAgICk7CiAgfQogIHJldHVybiBwYXR0ZXJuLl9jb21waWxlZDsKfQpfX25hbWUoY29tcGlsZVBhdHRlcm4sICJjb21waWxlUGF0dGVybiIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvY29udGFpbmVyLXBocmFzaW5nLmpzCmZ1bmN0aW9uIGNvbnRhaW5lclBocmFzaW5nKHBhcmVudCwgc3RhdGUsIGluZm8pIHsKICBjb25zdCBpbmRleFN0YWNrID0gc3RhdGUuaW5kZXhTdGFjazsKICBjb25zdCBjaGlsZHJlbjIgPSBwYXJlbnQuY2hpbGRyZW4gfHwgW107CiAgY29uc3QgcmVzdWx0cyA9IFtdOwogIGxldCBpbmRleDIgPSAtMTsKICBsZXQgYmVmb3JlID0gaW5mby5iZWZvcmU7CiAgbGV0IGVuY29kZUFmdGVyOwogIGluZGV4U3RhY2sucHVzaCgtMSk7CiAgbGV0IHRyYWNrZXIgPSBzdGF0ZS5jcmVhdGVUcmFja2VyKGluZm8pOwogIHdoaWxlICgrK2luZGV4MiA8IGNoaWxkcmVuMi5sZW5ndGgpIHsKICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW4yW2luZGV4Ml07CiAgICBsZXQgYWZ0ZXI7CiAgICBpbmRleFN0YWNrW2luZGV4U3RhY2subGVuZ3RoIC0gMV0gPSBpbmRleDI7CiAgICBpZiAoaW5kZXgyICsgMSA8IGNoaWxkcmVuMi5sZW5ndGgpIHsKICAgICAgbGV0IGhhbmRsZTMgPSBzdGF0ZS5oYW5kbGUuaGFuZGxlcnNbY2hpbGRyZW4yW2luZGV4MiArIDFdLnR5cGVdOwogICAgICBpZiAoaGFuZGxlMyAmJiBoYW5kbGUzLnBlZWspIGhhbmRsZTMgPSBoYW5kbGUzLnBlZWs7CiAgICAgIGFmdGVyID0gaGFuZGxlMyA/IGhhbmRsZTMoY2hpbGRyZW4yW2luZGV4MiArIDFdLCBwYXJlbnQsIHN0YXRlLCB7CiAgICAgICAgYmVmb3JlOiAiIiwKICAgICAgICBhZnRlcjogIiIsCiAgICAgICAgLi4udHJhY2tlci5jdXJyZW50KCkKICAgICAgfSkuY2hhckF0KDApIDogIiI7CiAgICB9IGVsc2UgewogICAgICBhZnRlciA9IGluZm8uYWZ0ZXI7CiAgICB9CiAgICBpZiAocmVzdWx0cy5sZW5ndGggPiAwICYmIChiZWZvcmUgPT09ICJcciIgfHwgYmVmb3JlID09PSAiXG4iKSAmJiBjaGlsZC50eXBlID09PSAiaHRtbCIpIHsKICAgICAgcmVzdWx0c1tyZXN1bHRzLmxlbmd0aCAtIDFdID0gcmVzdWx0c1tyZXN1bHRzLmxlbmd0aCAtIDFdLnJlcGxhY2UoCiAgICAgICAgLyhccj9cbnxccikkLywKICAgICAgICAiICIKICAgICAgKTsKICAgICAgYmVmb3JlID0gIiAiOwogICAgICB0cmFja2VyID0gc3RhdGUuY3JlYXRlVHJhY2tlcihpbmZvKTsKICAgICAgdHJhY2tlci5tb3ZlKHJlc3VsdHMuam9pbigiIikpOwogICAgfQogICAgbGV0IHZhbHVlMiA9IHN0YXRlLmhhbmRsZShjaGlsZCwgcGFyZW50LCBzdGF0ZSwgewogICAgICAuLi50cmFja2VyLmN1cnJlbnQoKSwKICAgICAgYWZ0ZXIsCiAgICAgIGJlZm9yZQogICAgfSk7CiAgICBpZiAoZW5jb2RlQWZ0ZXIgJiYgZW5jb2RlQWZ0ZXIgPT09IHZhbHVlMi5zbGljZSgwLCAxKSkgewogICAgICB2YWx1ZTIgPSBlbmNvZGVDaGFyYWN0ZXJSZWZlcmVuY2UoZW5jb2RlQWZ0ZXIuY2hhckNvZGVBdCgwKSkgKyB2YWx1ZTIuc2xpY2UoMSk7CiAgICB9CiAgICBjb25zdCBlbmNvZGluZ0luZm8gPSBzdGF0ZS5hdHRlbnRpb25FbmNvZGVTdXJyb3VuZGluZ0luZm87CiAgICBzdGF0ZS5hdHRlbnRpb25FbmNvZGVTdXJyb3VuZGluZ0luZm8gPSB2b2lkIDA7CiAgICBlbmNvZGVBZnRlciA9IHZvaWQgMDsKICAgIGlmIChlbmNvZGluZ0luZm8pIHsKICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID4gMCAmJiBlbmNvZGluZ0luZm8uYmVmb3JlICYmIGJlZm9yZSA9PT0gcmVzdWx0c1tyZXN1bHRzLmxlbmd0aCAtIDFdLnNsaWNlKC0xKSkgewogICAgICAgIHJlc3VsdHNbcmVzdWx0cy5sZW5ndGggLSAxXSA9IHJlc3VsdHNbcmVzdWx0cy5sZW5ndGggLSAxXS5zbGljZSgwLCAtMSkgKyBlbmNvZGVDaGFyYWN0ZXJSZWZlcmVuY2UoYmVmb3JlLmNoYXJDb2RlQXQoMCkpOwogICAgICB9CiAgICAgIGlmIChlbmNvZGluZ0luZm8uYWZ0ZXIpIGVuY29kZUFmdGVyID0gYWZ0ZXI7CiAgICB9CiAgICB0cmFja2VyLm1vdmUodmFsdWUyKTsKICAgIHJlc3VsdHMucHVzaCh2YWx1ZTIpOwogICAgYmVmb3JlID0gdmFsdWUyLnNsaWNlKC0xKTsKICB9CiAgaW5kZXhTdGFjay5wb3AoKTsKICByZXR1cm4gcmVzdWx0cy5qb2luKCIiKTsKfQpfX25hbWUoY29udGFpbmVyUGhyYXNpbmcsICJjb250YWluZXJQaHJhc2luZyIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvY29udGFpbmVyLWZsb3cuanMKZnVuY3Rpb24gY29udGFpbmVyRmxvdyhwYXJlbnQsIHN0YXRlLCBpbmZvKSB7CiAgY29uc3QgaW5kZXhTdGFjayA9IHN0YXRlLmluZGV4U3RhY2s7CiAgY29uc3QgY2hpbGRyZW4yID0gcGFyZW50LmNoaWxkcmVuIHx8IFtdOwogIGNvbnN0IHRyYWNrZXIgPSBzdGF0ZS5jcmVhdGVUcmFja2VyKGluZm8pOwogIGNvbnN0IHJlc3VsdHMgPSBbXTsKICBsZXQgaW5kZXgyID0gLTE7CiAgaW5kZXhTdGFjay5wdXNoKC0xKTsKICB3aGlsZSAoKytpbmRleDIgPCBjaGlsZHJlbjIubGVuZ3RoKSB7CiAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuMltpbmRleDJdOwogICAgaW5kZXhTdGFja1tpbmRleFN0YWNrLmxlbmd0aCAtIDFdID0gaW5kZXgyOwogICAgcmVzdWx0cy5wdXNoKAogICAgICB0cmFja2VyLm1vdmUoCiAgICAgICAgc3RhdGUuaGFuZGxlKGNoaWxkLCBwYXJlbnQsIHN0YXRlLCB7CiAgICAgICAgICBiZWZvcmU6ICJcbiIsCiAgICAgICAgICBhZnRlcjogIlxuIiwKICAgICAgICAgIC4uLnRyYWNrZXIuY3VycmVudCgpCiAgICAgICAgfSkKICAgICAgKQogICAgKTsKICAgIGlmIChjaGlsZC50eXBlICE9PSAibGlzdCIpIHsKICAgICAgc3RhdGUuYnVsbGV0TGFzdFVzZWQgPSB2b2lkIDA7CiAgICB9CiAgICBpZiAoaW5kZXgyIDwgY2hpbGRyZW4yLmxlbmd0aCAtIDEpIHsKICAgICAgcmVzdWx0cy5wdXNoKAogICAgICAgIHRyYWNrZXIubW92ZShiZXR3ZWVuKGNoaWxkLCBjaGlsZHJlbjJbaW5kZXgyICsgMV0sIHBhcmVudCwgc3RhdGUpKQogICAgICApOwogICAgfQogIH0KICBpbmRleFN0YWNrLnBvcCgpOwogIHJldHVybiByZXN1bHRzLmpvaW4oIiIpOwp9Cl9fbmFtZShjb250YWluZXJGbG93LCAiY29udGFpbmVyRmxvdyIpOwpmdW5jdGlvbiBiZXR3ZWVuKGxlZnQsIHJpZ2h0LCBwYXJlbnQsIHN0YXRlKSB7CiAgbGV0IGluZGV4MiA9IHN0YXRlLmpvaW4ubGVuZ3RoOwogIHdoaWxlIChpbmRleDItLSkgewogICAgY29uc3QgcmVzdWx0ID0gc3RhdGUuam9pbltpbmRleDJdKGxlZnQsIHJpZ2h0LCBwYXJlbnQsIHN0YXRlKTsKICAgIGlmIChyZXN1bHQgPT09IHRydWUgfHwgcmVzdWx0ID09PSAxKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICJudW1iZXIiKSB7CiAgICAgIHJldHVybiAiXG4iLnJlcGVhdCgxICsgcmVzdWx0KTsKICAgIH0KICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSB7CiAgICAgIHJldHVybiAiXG5cbjwhLS0tLT5cblxuIjsKICAgIH0KICB9CiAgcmV0dXJuICJcblxuIjsKfQpfX25hbWUoYmV0d2VlbiwgImJldHdlZW4iKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2luZGVudC1saW5lcy5qcwp2YXIgZW9sID0gL1xyP1xufFxyL2c7CmZ1bmN0aW9uIGluZGVudExpbmVzKHZhbHVlMiwgbWFwNykgewogIGNvbnN0IHJlc3VsdCA9IFtdOwogIGxldCBzdGFydCA9IDA7CiAgbGV0IGxpbmUgPSAwOwogIGxldCBtYXRjaDI7CiAgd2hpbGUgKG1hdGNoMiA9IGVvbC5leGVjKHZhbHVlMikpIHsKICAgIG9uZTModmFsdWUyLnNsaWNlKHN0YXJ0LCBtYXRjaDIuaW5kZXgpKTsKICAgIHJlc3VsdC5wdXNoKG1hdGNoMlswXSk7CiAgICBzdGFydCA9IG1hdGNoMi5pbmRleCArIG1hdGNoMlswXS5sZW5ndGg7CiAgICBsaW5lKys7CiAgfQogIG9uZTModmFsdWUyLnNsaWNlKHN0YXJ0KSk7CiAgcmV0dXJuIHJlc3VsdC5qb2luKCIiKTsKICBmdW5jdGlvbiBvbmUzKHZhbHVlMykgewogICAgcmVzdWx0LnB1c2gobWFwNyh2YWx1ZTMsIGxpbmUsICF2YWx1ZTMpKTsKICB9CiAgX19uYW1lKG9uZTMsICJvbmUiKTsKfQpfX25hbWUoaW5kZW50TGluZXMsICJpbmRlbnRMaW5lcyIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvc2FmZS5qcwpmdW5jdGlvbiBzYWZlKHN0YXRlLCBpbnB1dCwgY29uZmlnMikgewogIGNvbnN0IHZhbHVlMiA9IChjb25maWcyLmJlZm9yZSB8fCAiIikgKyAoaW5wdXQgfHwgIiIpICsgKGNvbmZpZzIuYWZ0ZXIgfHwgIiIpOwogIGNvbnN0IHBvc2l0aW9ucyA9IFtdOwogIGNvbnN0IHJlc3VsdCA9IFtdOwogIGNvbnN0IGluZm9zID0ge307CiAgbGV0IGluZGV4MiA9IC0xOwogIHdoaWxlICgrK2luZGV4MiA8IHN0YXRlLnVuc2FmZS5sZW5ndGgpIHsKICAgIGNvbnN0IHBhdHRlcm4gPSBzdGF0ZS51bnNhZmVbaW5kZXgyXTsKICAgIGlmICghcGF0dGVybkluU2NvcGUoc3RhdGUuc3RhY2ssIHBhdHRlcm4pKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uc3QgZXhwcmVzc2lvbiA9IHN0YXRlLmNvbXBpbGVQYXR0ZXJuKHBhdHRlcm4pOwogICAgbGV0IG1hdGNoMjsKICAgIHdoaWxlIChtYXRjaDIgPSBleHByZXNzaW9uLmV4ZWModmFsdWUyKSkgewogICAgICBjb25zdCBiZWZvcmUgPSAiYmVmb3JlIiBpbiBwYXR0ZXJuIHx8IEJvb2xlYW4ocGF0dGVybi5hdEJyZWFrKTsKICAgICAgY29uc3QgYWZ0ZXIgPSAiYWZ0ZXIiIGluIHBhdHRlcm47CiAgICAgIGNvbnN0IHBvc2l0aW9uMyA9IG1hdGNoMi5pbmRleCArIChiZWZvcmUgPyBtYXRjaDJbMV0ubGVuZ3RoIDogMCk7CiAgICAgIGlmIChwb3NpdGlvbnMuaW5jbHVkZXMocG9zaXRpb24zKSkgewogICAgICAgIGlmIChpbmZvc1twb3NpdGlvbjNdLmJlZm9yZSAmJiAhYmVmb3JlKSB7CiAgICAgICAgICBpbmZvc1twb3NpdGlvbjNdLmJlZm9yZSA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBpZiAoaW5mb3NbcG9zaXRpb24zXS5hZnRlciAmJiAhYWZ0ZXIpIHsKICAgICAgICAgIGluZm9zW3Bvc2l0aW9uM10uYWZ0ZXIgPSBmYWxzZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcG9zaXRpb25zLnB1c2gocG9zaXRpb24zKTsKICAgICAgICBpbmZvc1twb3NpdGlvbjNdID0geyBiZWZvcmUsIGFmdGVyIH07CiAgICAgIH0KICAgIH0KICB9CiAgcG9zaXRpb25zLnNvcnQobnVtZXJpY2FsKTsKICBsZXQgc3RhcnQgPSBjb25maWcyLmJlZm9yZSA/IGNvbmZpZzIuYmVmb3JlLmxlbmd0aCA6IDA7CiAgY29uc3QgZW5kID0gdmFsdWUyLmxlbmd0aCAtIChjb25maWcyLmFmdGVyID8gY29uZmlnMi5hZnRlci5sZW5ndGggOiAwKTsKICBpbmRleDIgPSAtMTsKICB3aGlsZSAoKytpbmRleDIgPCBwb3NpdGlvbnMubGVuZ3RoKSB7CiAgICBjb25zdCBwb3NpdGlvbjMgPSBwb3NpdGlvbnNbaW5kZXgyXTsKICAgIGlmIChwb3NpdGlvbjMgPCBzdGFydCB8fCBwb3NpdGlvbjMgPj0gZW5kKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgaWYgKHBvc2l0aW9uMyArIDEgPCBlbmQgJiYgcG9zaXRpb25zW2luZGV4MiArIDFdID09PSBwb3NpdGlvbjMgKyAxICYmIGluZm9zW3Bvc2l0aW9uM10uYWZ0ZXIgJiYgIWluZm9zW3Bvc2l0aW9uMyArIDFdLmJlZm9yZSAmJiAhaW5mb3NbcG9zaXRpb24zICsgMV0uYWZ0ZXIgfHwgcG9zaXRpb25zW2luZGV4MiAtIDFdID09PSBwb3NpdGlvbjMgLSAxICYmIGluZm9zW3Bvc2l0aW9uM10uYmVmb3JlICYmICFpbmZvc1twb3NpdGlvbjMgLSAxXS5iZWZvcmUgJiYgIWluZm9zW3Bvc2l0aW9uMyAtIDFdLmFmdGVyKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgaWYgKHN0YXJ0ICE9PSBwb3NpdGlvbjMpIHsKICAgICAgcmVzdWx0LnB1c2goZXNjYXBlQmFja3NsYXNoZXModmFsdWUyLnNsaWNlKHN0YXJ0LCBwb3NpdGlvbjMpLCAiXFwiKSk7CiAgICB9CiAgICBzdGFydCA9IHBvc2l0aW9uMzsKICAgIGlmICgvWyEtLzotQFstYHstfl0vLnRlc3QodmFsdWUyLmNoYXJBdChwb3NpdGlvbjMpKSAmJiAoIWNvbmZpZzIuZW5jb2RlIHx8ICFjb25maWcyLmVuY29kZS5pbmNsdWRlcyh2YWx1ZTIuY2hhckF0KHBvc2l0aW9uMykpKSkgewogICAgICByZXN1bHQucHVzaCgiXFwiKTsKICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdC5wdXNoKGVuY29kZUNoYXJhY3RlclJlZmVyZW5jZSh2YWx1ZTIuY2hhckNvZGVBdChwb3NpdGlvbjMpKSk7CiAgICAgIHN0YXJ0Kys7CiAgICB9CiAgfQogIHJlc3VsdC5wdXNoKGVzY2FwZUJhY2tzbGFzaGVzKHZhbHVlMi5zbGljZShzdGFydCwgZW5kKSwgY29uZmlnMi5hZnRlcikpOwogIHJldHVybiByZXN1bHQuam9pbigiIik7Cn0KX19uYW1lKHNhZmUsICJzYWZlIik7CmZ1bmN0aW9uIG51bWVyaWNhbChhNCwgYjQpIHsKICByZXR1cm4gYTQgLSBiNDsKfQpfX25hbWUobnVtZXJpY2FsLCAibnVtZXJpY2FsIik7CmZ1bmN0aW9uIGVzY2FwZUJhY2tzbGFzaGVzKHZhbHVlMiwgYWZ0ZXIpIHsKICBjb25zdCBleHByZXNzaW9uID0gL1xcKD89WyEtLzotQFstYHstfl0pL2c7CiAgY29uc3QgcG9zaXRpb25zID0gW107CiAgY29uc3QgcmVzdWx0cyA9IFtdOwogIGNvbnN0IHdob2xlID0gdmFsdWUyICsgYWZ0ZXI7CiAgbGV0IGluZGV4MiA9IC0xOwogIGxldCBzdGFydCA9IDA7CiAgbGV0IG1hdGNoMjsKICB3aGlsZSAobWF0Y2gyID0gZXhwcmVzc2lvbi5leGVjKHdob2xlKSkgewogICAgcG9zaXRpb25zLnB1c2gobWF0Y2gyLmluZGV4KTsKICB9CiAgd2hpbGUgKCsraW5kZXgyIDwgcG9zaXRpb25zLmxlbmd0aCkgewogICAgaWYgKHN0YXJ0ICE9PSBwb3NpdGlvbnNbaW5kZXgyXSkgewogICAgICByZXN1bHRzLnB1c2godmFsdWUyLnNsaWNlKHN0YXJ0LCBwb3NpdGlvbnNbaW5kZXgyXSkpOwogICAgfQogICAgcmVzdWx0cy5wdXNoKCJcXCIpOwogICAgc3RhcnQgPSBwb3NpdGlvbnNbaW5kZXgyXTsKICB9CiAgcmVzdWx0cy5wdXNoKHZhbHVlMi5zbGljZShzdGFydCkpOwogIHJldHVybiByZXN1bHRzLmpvaW4oIiIpOwp9Cl9fbmFtZShlc2NhcGVCYWNrc2xhc2hlcywgImVzY2FwZUJhY2tzbGFzaGVzIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC90cmFjay5qcwpmdW5jdGlvbiB0cmFjayhjb25maWcyKSB7CiAgY29uc3Qgb3B0aW9ucyA9IGNvbmZpZzIgfHwge307CiAgY29uc3Qgbm93MiA9IG9wdGlvbnMubm93IHx8IHt9OwogIGxldCBsaW5lU2hpZnQgPSBvcHRpb25zLmxpbmVTaGlmdCB8fCAwOwogIGxldCBsaW5lID0gbm93Mi5saW5lIHx8IDE7CiAgbGV0IGNvbHVtbiA9IG5vdzIuY29sdW1uIHx8IDE7CiAgcmV0dXJuIHsgbW92ZSwgY3VycmVudCwgc2hpZnQgfTsKICBmdW5jdGlvbiBjdXJyZW50KCkgewogICAgcmV0dXJuIHsgbm93OiB7IGxpbmUsIGNvbHVtbiB9LCBsaW5lU2hpZnQgfTsKICB9CiAgX19uYW1lKGN1cnJlbnQsICJjdXJyZW50Iik7CiAgZnVuY3Rpb24gc2hpZnQodmFsdWUyKSB7CiAgICBsaW5lU2hpZnQgKz0gdmFsdWUyOwogIH0KICBfX25hbWUoc2hpZnQsICJzaGlmdCIpOwogIGZ1bmN0aW9uIG1vdmUoaW5wdXQpIHsKICAgIGNvbnN0IHZhbHVlMiA9IGlucHV0IHx8ICIiOwogICAgY29uc3QgY2h1bmtzID0gdmFsdWUyLnNwbGl0KC9ccj9cbnxcci9nKTsKICAgIGNvbnN0IHRhaWwgPSBjaHVua3NbY2h1bmtzLmxlbmd0aCAtIDFdOwogICAgbGluZSArPSBjaHVua3MubGVuZ3RoIC0gMTsKICAgIGNvbHVtbiA9IGNodW5rcy5sZW5ndGggPT09IDEgPyBjb2x1bW4gKyB0YWlsLmxlbmd0aCA6IDEgKyB0YWlsLmxlbmd0aCArIGxpbmVTaGlmdDsKICAgIHJldHVybiB2YWx1ZTI7CiAgfQogIF9fbmFtZShtb3ZlLCAibW92ZSIpOwp9Cl9fbmFtZSh0cmFjaywgInRyYWNrIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaW5kZXguanMKZnVuY3Rpb24gdG9NYXJrZG93bih0cmVlLCBvcHRpb25zKSB7CiAgY29uc3Qgc2V0dGluZ3MgPSBvcHRpb25zIHx8IHt9OwogIGNvbnN0IHN0YXRlID0gewogICAgYXNzb2NpYXRpb25JZDogYXNzb2NpYXRpb24sCiAgICBjb250YWluZXJQaHJhc2luZzogY29udGFpbmVyUGhyYXNpbmdCb3VuZCwKICAgIGNvbnRhaW5lckZsb3c6IGNvbnRhaW5lckZsb3dCb3VuZCwKICAgIGNyZWF0ZVRyYWNrZXI6IHRyYWNrLAogICAgY29tcGlsZVBhdHRlcm4sCiAgICBlbnRlciwKICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IEdGTSAvIGZyb250bWF0dGVyIGFyZSB0eXBlZCBpbiBgbWRhc3RgIGJ1dCBub3QgZGVmaW5lZAogICAgLy8gaGVyZS4KICAgIGhhbmRsZXJzOiB7IC4uLmhhbmRsZSB9LAogICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogYWRkIGBoYW5kbGVgIGluIGEgc2Vjb25kLgogICAgaGFuZGxlOiB2b2lkIDAsCiAgICBpbmRlbnRMaW5lcywKICAgIGluZGV4U3RhY2s6IFtdLAogICAgam9pbjogWy4uLmpvaW4yXSwKICAgIG9wdGlvbnM6IHt9LAogICAgc2FmZTogc2FmZUJvdW5kLAogICAgc3RhY2s6IFtdLAogICAgdW5zYWZlOiBbLi4udW5zYWZlXQogIH07CiAgY29uZmlndXJlKHN0YXRlLCBzZXR0aW5ncyk7CiAgaWYgKHN0YXRlLm9wdGlvbnMudGlnaHREZWZpbml0aW9ucykgewogICAgc3RhdGUuam9pbi5wdXNoKGpvaW5EZWZpbml0aW9uKTsKICB9CiAgc3RhdGUuaGFuZGxlID0gendpdGNoKCJ0eXBlIiwgewogICAgaW52YWxpZCwKICAgIHVua25vd24sCiAgICBoYW5kbGVyczogc3RhdGUuaGFuZGxlcnMKICB9KTsKICBsZXQgcmVzdWx0ID0gc3RhdGUuaGFuZGxlKHRyZWUsIHZvaWQgMCwgc3RhdGUsIHsKICAgIGJlZm9yZTogIlxuIiwKICAgIGFmdGVyOiAiXG4iLAogICAgbm93OiB7IGxpbmU6IDEsIGNvbHVtbjogMSB9LAogICAgbGluZVNoaWZ0OiAwCiAgfSk7CiAgaWYgKHJlc3VsdCAmJiByZXN1bHQuY2hhckNvZGVBdChyZXN1bHQubGVuZ3RoIC0gMSkgIT09IDEwICYmIHJlc3VsdC5jaGFyQ29kZUF0KHJlc3VsdC5sZW5ndGggLSAxKSAhPT0gMTMpIHsKICAgIHJlc3VsdCArPSAiXG4iOwogIH0KICByZXR1cm4gcmVzdWx0OwogIGZ1bmN0aW9uIGVudGVyKG5hbWUpIHsKICAgIHN0YXRlLnN0YWNrLnB1c2gobmFtZSk7CiAgICByZXR1cm4gZXhpdDM7CiAgICBmdW5jdGlvbiBleGl0MygpIHsKICAgICAgc3RhdGUuc3RhY2sucG9wKCk7CiAgICB9CiAgICBfX25hbWUoZXhpdDMsICJleGl0Iik7CiAgfQogIF9fbmFtZShlbnRlciwgImVudGVyIik7Cn0KX19uYW1lKHRvTWFya2Rvd24sICJ0b01hcmtkb3duIik7CmZ1bmN0aW9uIGludmFsaWQodmFsdWUyKSB7CiAgdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaGFuZGxlIHZhbHVlIGAiICsgdmFsdWUyICsgImAsIGV4cGVjdGVkIG5vZGUiKTsKfQpfX25hbWUoaW52YWxpZCwgImludmFsaWQiKTsKZnVuY3Rpb24gdW5rbm93bih2YWx1ZTIpIHsKICBjb25zdCBub2RlMiA9ICgKICAgIC8qKiBAdHlwZSB7Tm9kZXN9ICovCiAgICB2YWx1ZTIKICApOwogIHRocm93IG5ldyBFcnJvcigiQ2Fubm90IGhhbmRsZSB1bmtub3duIG5vZGUgYCIgKyBub2RlMi50eXBlICsgImAiKTsKfQpfX25hbWUodW5rbm93biwgInVua25vd24iKTsKZnVuY3Rpb24gam9pbkRlZmluaXRpb24obGVmdCwgcmlnaHQpIHsKICBpZiAobGVmdC50eXBlID09PSAiZGVmaW5pdGlvbiIgJiYgbGVmdC50eXBlID09PSByaWdodC50eXBlKSB7CiAgICByZXR1cm4gMDsKICB9Cn0KX19uYW1lKGpvaW5EZWZpbml0aW9uLCAiam9pbkRlZmluaXRpb24iKTsKZnVuY3Rpb24gY29udGFpbmVyUGhyYXNpbmdCb3VuZChwYXJlbnQsIGluZm8pIHsKICByZXR1cm4gY29udGFpbmVyUGhyYXNpbmcocGFyZW50LCB0aGlzLCBpbmZvKTsKfQpfX25hbWUoY29udGFpbmVyUGhyYXNpbmdCb3VuZCwgImNvbnRhaW5lclBocmFzaW5nQm91bmQiKTsKZnVuY3Rpb24gY29udGFpbmVyRmxvd0JvdW5kKHBhcmVudCwgaW5mbykgewogIHJldHVybiBjb250YWluZXJGbG93KHBhcmVudCwgdGhpcywgaW5mbyk7Cn0KX19uYW1lKGNvbnRhaW5lckZsb3dCb3VuZCwgImNvbnRhaW5lckZsb3dCb3VuZCIpOwpmdW5jdGlvbiBzYWZlQm91bmQodmFsdWUyLCBjb25maWcyKSB7CiAgcmV0dXJuIHNhZmUodGhpcywgdmFsdWUyLCBjb25maWcyKTsKfQpfX25hbWUoc2FmZUJvdW5kLCAic2FmZUJvdW5kIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC1nZm0tdGFibGVAMi4wLjAvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtZ2ZtLXRhYmxlL2xpYi9pbmRleC5qcwpmdW5jdGlvbiBnZm1UYWJsZUZyb21NYXJrZG93bigpIHsKICByZXR1cm4gewogICAgZW50ZXI6IHsKICAgICAgdGFibGU6IGVudGVyVGFibGUsCiAgICAgIHRhYmxlRGF0YTogZW50ZXJDZWxsLAogICAgICB0YWJsZUhlYWRlcjogZW50ZXJDZWxsLAogICAgICB0YWJsZVJvdzogZW50ZXJSb3cKICAgIH0sCiAgICBleGl0OiB7CiAgICAgIGNvZGVUZXh0OiBleGl0Q29kZVRleHQsCiAgICAgIHRhYmxlOiBleGl0VGFibGUsCiAgICAgIHRhYmxlRGF0YTogZXhpdCwKICAgICAgdGFibGVIZWFkZXI6IGV4aXQsCiAgICAgIHRhYmxlUm93OiBleGl0CiAgICB9CiAgfTsKfQpfX25hbWUoZ2ZtVGFibGVGcm9tTWFya2Rvd24sICJnZm1UYWJsZUZyb21NYXJrZG93biIpOwpmdW5jdGlvbiBlbnRlclRhYmxlKHRva2VuKSB7CiAgY29uc3QgYWxpZ24gPSB0b2tlbi5fYWxpZ247CiAgb2soYWxpZ24sICJleHBlY3RlZCBgX2FsaWduYCBvbiB0YWJsZSIpOwogIHRoaXMuZW50ZXIoCiAgICB7CiAgICAgIHR5cGU6ICJ0YWJsZSIsCiAgICAgIGFsaWduOiBhbGlnbi5tYXAoZnVuY3Rpb24oZDQpIHsKICAgICAgICByZXR1cm4gZDQgPT09ICJub25lIiA/IG51bGwgOiBkNDsKICAgICAgfSksCiAgICAgIGNoaWxkcmVuOiBbXQogICAgfSwKICAgIHRva2VuCiAgKTsKICB0aGlzLmRhdGEuaW5UYWJsZSA9IHRydWU7Cn0KX19uYW1lKGVudGVyVGFibGUsICJlbnRlclRhYmxlIik7CmZ1bmN0aW9uIGV4aXRUYWJsZSh0b2tlbikgewogIHRoaXMuZXhpdCh0b2tlbik7CiAgdGhpcy5kYXRhLmluVGFibGUgPSB2b2lkIDA7Cn0KX19uYW1lKGV4aXRUYWJsZSwgImV4aXRUYWJsZSIpOwpmdW5jdGlvbiBlbnRlclJvdyh0b2tlbikgewogIHRoaXMuZW50ZXIoeyB0eXBlOiAidGFibGVSb3ciLCBjaGlsZHJlbjogW10gfSwgdG9rZW4pOwp9Cl9fbmFtZShlbnRlclJvdywgImVudGVyUm93Iik7CmZ1bmN0aW9uIGV4aXQodG9rZW4pIHsKICB0aGlzLmV4aXQodG9rZW4pOwp9Cl9fbmFtZShleGl0LCAiZXhpdCIpOwpmdW5jdGlvbiBlbnRlckNlbGwodG9rZW4pIHsKICB0aGlzLmVudGVyKHsgdHlwZTogInRhYmxlQ2VsbCIsIGNoaWxkcmVuOiBbXSB9LCB0b2tlbik7Cn0KX19uYW1lKGVudGVyQ2VsbCwgImVudGVyQ2VsbCIpOwpmdW5jdGlvbiBleGl0Q29kZVRleHQodG9rZW4pIHsKICBsZXQgdmFsdWUyID0gdGhpcy5yZXN1bWUoKTsKICBpZiAodGhpcy5kYXRhLmluVGFibGUpIHsKICAgIHZhbHVlMiA9IHZhbHVlMi5yZXBsYWNlKC9cXChbXFx8XSkvZywgcmVwbGFjZSk7CiAgfQogIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogIG9rKG5vZGUyLnR5cGUgPT09ICJpbmxpbmVDb2RlIik7CiAgbm9kZTIudmFsdWUgPSB2YWx1ZTI7CiAgdGhpcy5leGl0KHRva2VuKTsKfQpfX25hbWUoZXhpdENvZGVUZXh0LCAiZXhpdENvZGVUZXh0Iik7CmZ1bmN0aW9uIHJlcGxhY2UoJDAsICQxKSB7CiAgcmV0dXJuICQxID09PSAifCIgPyAkMSA6ICQwOwp9Cl9fbmFtZShyZXBsYWNlLCAicmVwbGFjZSIpOwpmdW5jdGlvbiBnZm1UYWJsZVRvTWFya2Rvd24ob3B0aW9ucykgewogIGNvbnN0IHNldHRpbmdzID0gb3B0aW9ucyB8fCB7fTsKICBjb25zdCBwYWRkaW5nID0gc2V0dGluZ3MudGFibGVDZWxsUGFkZGluZzsKICBjb25zdCBhbGlnbkRlbGltaXRlcnMgPSBzZXR0aW5ncy50YWJsZVBpcGVBbGlnbjsKICBjb25zdCBzdHJpbmdMZW5ndGggPSBzZXR0aW5ncy5zdHJpbmdMZW5ndGg7CiAgY29uc3QgYXJvdW5kID0gcGFkZGluZyA/ICIgIiA6ICJ8IjsKICByZXR1cm4gewogICAgdW5zYWZlOiBbCiAgICAgIHsgY2hhcmFjdGVyOiAiXHIiLCBpbkNvbnN0cnVjdDogInRhYmxlQ2VsbCIgfSwKICAgICAgeyBjaGFyYWN0ZXI6ICJcbiIsIGluQ29uc3RydWN0OiAidGFibGVDZWxsIiB9LAogICAgICAvLyBBIHBpcGUsIHdoZW4gZm9sbG93ZWQgYnkgYSB0YWIgb3Igc3BhY2UgKHBhZGRpbmcpLCBvciBhIGRhc2ggb3IgY29sb24KICAgICAgLy8gKHVucGFkZGVkIGRlbGltaXRlciByb3cpLCBjb3VsZCByZXN1bHQgaW4gYSB0YWJsZS4KICAgICAgeyBhdEJyZWFrOiB0cnVlLCBjaGFyYWN0ZXI6ICJ8IiwgYWZ0ZXI6ICJbCSA6LV0iIH0sCiAgICAgIC8vIEEgcGlwZSBpbiBhIGNlbGwgbXVzdCBiZSBlbmNvZGVkLgogICAgICB7IGNoYXJhY3RlcjogInwiLCBpbkNvbnN0cnVjdDogInRhYmxlQ2VsbCIgfSwKICAgICAgLy8gQSBjb2xvbiBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgZGFzaCwgaW4gd2hpY2ggY2FzZSBpdCBjb3VsZCBzdGFydCBhCiAgICAgIC8vIGRlbGltaXRlciByb3cuCiAgICAgIHsgYXRCcmVhazogdHJ1ZSwgY2hhcmFjdGVyOiAiOiIsIGFmdGVyOiAiLSIgfSwKICAgICAgLy8gQSBkZWxpbWl0ZXIgcm93IGNhbiBhbHNvIHN0YXJ0IHdpdGggYSBkYXNoLCB3aGVuIGZvbGxvd2VkIGJ5IG1vcmUKICAgICAgLy8gZGFzaGVzLCBhIGNvbG9uLCBvciBhIHBpcGUuCiAgICAgIC8vIFRoaXMgaXMgYSBzdHJpY3RlciB2ZXJzaW9uIHRoYW4gdGhlIGJ1aWx0IGluIGNoZWNrIGZvciBsaXN0cywgdGhlbWF0aWMKICAgICAgLy8gYnJlYWtzLCBhbmQgc2V0ZXggaGVhZGluZyB1bmRlcmxpbmVzIHRob3VnaDoKICAgICAgLy8gPGh0dHBzOi8vZ2l0aHViLmNvbS9zeW50YXgtdHJlZS9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2Jsb2IvNTFhMjAzOC9saWIvdW5zYWZlLmpzI0w1Nz4KICAgICAgeyBhdEJyZWFrOiB0cnVlLCBjaGFyYWN0ZXI6ICItIiwgYWZ0ZXI6ICJbOnwtXSIgfQogICAgXSwKICAgIGhhbmRsZXJzOiB7CiAgICAgIGlubGluZUNvZGU6IGlubGluZUNvZGVXaXRoVGFibGUsCiAgICAgIHRhYmxlOiBoYW5kbGVUYWJsZSwKICAgICAgdGFibGVDZWxsOiBoYW5kbGVUYWJsZUNlbGwsCiAgICAgIHRhYmxlUm93OiBoYW5kbGVUYWJsZVJvdwogICAgfQogIH07CiAgZnVuY3Rpb24gaGFuZGxlVGFibGUobm9kZTIsIF8zLCBzdGF0ZSwgaW5mbykgewogICAgcmV0dXJuIHNlcmlhbGl6ZURhdGEoaGFuZGxlVGFibGVBc0RhdGEobm9kZTIsIHN0YXRlLCBpbmZvKSwgbm9kZTIuYWxpZ24pOwogIH0KICBfX25hbWUoaGFuZGxlVGFibGUsICJoYW5kbGVUYWJsZSIpOwogIGZ1bmN0aW9uIGhhbmRsZVRhYmxlUm93KG5vZGUyLCBfMywgc3RhdGUsIGluZm8pIHsKICAgIGNvbnN0IHJvdyA9IGhhbmRsZVRhYmxlUm93QXNEYXRhKG5vZGUyLCBzdGF0ZSwgaW5mbyk7CiAgICBjb25zdCB2YWx1ZTIgPSBzZXJpYWxpemVEYXRhKFtyb3ddKTsKICAgIHJldHVybiB2YWx1ZTIuc2xpY2UoMCwgdmFsdWUyLmluZGV4T2YoIlxuIikpOwogIH0KICBfX25hbWUoaGFuZGxlVGFibGVSb3csICJoYW5kbGVUYWJsZVJvdyIpOwogIGZ1bmN0aW9uIGhhbmRsZVRhYmxlQ2VsbChub2RlMiwgXzMsIHN0YXRlLCBpbmZvKSB7CiAgICBjb25zdCBleGl0MyA9IHN0YXRlLmVudGVyKCJ0YWJsZUNlbGwiKTsKICAgIGNvbnN0IHN1YmV4aXQgPSBzdGF0ZS5lbnRlcigicGhyYXNpbmciKTsKICAgIGNvbnN0IHZhbHVlMiA9IHN0YXRlLmNvbnRhaW5lclBocmFzaW5nKG5vZGUyLCB7CiAgICAgIC4uLmluZm8sCiAgICAgIGJlZm9yZTogYXJvdW5kLAogICAgICBhZnRlcjogYXJvdW5kCiAgICB9KTsKICAgIHN1YmV4aXQoKTsKICAgIGV4aXQzKCk7CiAgICByZXR1cm4gdmFsdWUyOwogIH0KICBfX25hbWUoaGFuZGxlVGFibGVDZWxsLCAiaGFuZGxlVGFibGVDZWxsIik7CiAgZnVuY3Rpb24gc2VyaWFsaXplRGF0YShtYXRyaXgsIGFsaWduKSB7CiAgICByZXR1cm4gbWFya2Rvd25UYWJsZShtYXRyaXgsIHsKICAgICAgYWxpZ24sCiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IGBtYXJrZG93bi10YWJsZWAgdHlwZXMgc2hvdWxkIHN1cHBvcnQgYG51bGxgLgogICAgICBhbGlnbkRlbGltaXRlcnMsCiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IGBtYXJrZG93bi10YWJsZWAgdHlwZXMgc2hvdWxkIHN1cHBvcnQgYG51bGxgLgogICAgICBwYWRkaW5nLAogICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBgbWFya2Rvd24tdGFibGVgIHR5cGVzIHNob3VsZCBzdXBwb3J0IGBudWxsYC4KICAgICAgc3RyaW5nTGVuZ3RoCiAgICB9KTsKICB9CiAgX19uYW1lKHNlcmlhbGl6ZURhdGEsICJzZXJpYWxpemVEYXRhIik7CiAgZnVuY3Rpb24gaGFuZGxlVGFibGVBc0RhdGEobm9kZTIsIHN0YXRlLCBpbmZvKSB7CiAgICBjb25zdCBjaGlsZHJlbjIgPSBub2RlMi5jaGlsZHJlbjsKICAgIGxldCBpbmRleDIgPSAtMTsKICAgIGNvbnN0IHJlc3VsdCA9IFtdOwogICAgY29uc3Qgc3ViZXhpdCA9IHN0YXRlLmVudGVyKCJ0YWJsZSIpOwogICAgd2hpbGUgKCsraW5kZXgyIDwgY2hpbGRyZW4yLmxlbmd0aCkgewogICAgICByZXN1bHRbaW5kZXgyXSA9IGhhbmRsZVRhYmxlUm93QXNEYXRhKGNoaWxkcmVuMltpbmRleDJdLCBzdGF0ZSwgaW5mbyk7CiAgICB9CiAgICBzdWJleGl0KCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KICBfX25hbWUoaGFuZGxlVGFibGVBc0RhdGEsICJoYW5kbGVUYWJsZUFzRGF0YSIpOwogIGZ1bmN0aW9uIGhhbmRsZVRhYmxlUm93QXNEYXRhKG5vZGUyLCBzdGF0ZSwgaW5mbykgewogICAgY29uc3QgY2hpbGRyZW4yID0gbm9kZTIuY2hpbGRyZW47CiAgICBsZXQgaW5kZXgyID0gLTE7CiAgICBjb25zdCByZXN1bHQgPSBbXTsKICAgIGNvbnN0IHN1YmV4aXQgPSBzdGF0ZS5lbnRlcigidGFibGVSb3ciKTsKICAgIHdoaWxlICgrK2luZGV4MiA8IGNoaWxkcmVuMi5sZW5ndGgpIHsKICAgICAgcmVzdWx0W2luZGV4Ml0gPSBoYW5kbGVUYWJsZUNlbGwoY2hpbGRyZW4yW2luZGV4Ml0sIG5vZGUyLCBzdGF0ZSwgaW5mbyk7CiAgICB9CiAgICBzdWJleGl0KCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KICBfX25hbWUoaGFuZGxlVGFibGVSb3dBc0RhdGEsICJoYW5kbGVUYWJsZVJvd0FzRGF0YSIpOwogIGZ1bmN0aW9uIGlubGluZUNvZGVXaXRoVGFibGUobm9kZTIsIHBhcmVudCwgc3RhdGUpIHsKICAgIGxldCB2YWx1ZTIgPSBoYW5kbGUuaW5saW5lQ29kZShub2RlMiwgcGFyZW50LCBzdGF0ZSk7CiAgICBpZiAoc3RhdGUuc3RhY2suaW5jbHVkZXMoInRhYmxlQ2VsbCIpKSB7CiAgICAgIHZhbHVlMiA9IHZhbHVlMi5yZXBsYWNlKC9cfC9nLCAiXFwkJiIpOwogICAgfQogICAgcmV0dXJuIHZhbHVlMjsKICB9CiAgX19uYW1lKGlubGluZUNvZGVXaXRoVGFibGUsICJpbmxpbmVDb2RlV2l0aFRhYmxlIik7Cn0KX19uYW1lKGdmbVRhYmxlVG9NYXJrZG93biwgImdmbVRhYmxlVG9NYXJrZG93biIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtZ2ZtLXRhc2stbGlzdC1pdGVtQDIuMC4wL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLWdmbS10YXNrLWxpc3QtaXRlbS9saWIvaW5kZXguanMKZnVuY3Rpb24gZ2ZtVGFza0xpc3RJdGVtRnJvbU1hcmtkb3duKCkgewogIHJldHVybiB7CiAgICBleGl0OiB7CiAgICAgIHRhc2tMaXN0Q2hlY2tWYWx1ZUNoZWNrZWQ6IGV4aXRDaGVjaywKICAgICAgdGFza0xpc3RDaGVja1ZhbHVlVW5jaGVja2VkOiBleGl0Q2hlY2ssCiAgICAgIHBhcmFncmFwaDogZXhpdFBhcmFncmFwaFdpdGhUYXNrTGlzdEl0ZW0KICAgIH0KICB9Owp9Cl9fbmFtZShnZm1UYXNrTGlzdEl0ZW1Gcm9tTWFya2Rvd24sICJnZm1UYXNrTGlzdEl0ZW1Gcm9tTWFya2Rvd24iKTsKZnVuY3Rpb24gZ2ZtVGFza0xpc3RJdGVtVG9NYXJrZG93bigpIHsKICByZXR1cm4gewogICAgdW5zYWZlOiBbeyBhdEJyZWFrOiB0cnVlLCBjaGFyYWN0ZXI6ICItIiwgYWZ0ZXI6ICJbOnwtXSIgfV0sCiAgICBoYW5kbGVyczogeyBsaXN0SXRlbTogbGlzdEl0ZW1XaXRoVGFza0xpc3RJdGVtIH0KICB9Owp9Cl9fbmFtZShnZm1UYXNrTGlzdEl0ZW1Ub01hcmtkb3duLCAiZ2ZtVGFza0xpc3RJdGVtVG9NYXJrZG93biIpOwpmdW5jdGlvbiBleGl0Q2hlY2sodG9rZW4pIHsKICBjb25zdCBub2RlMiA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAyXTsKICBvayhub2RlMi50eXBlID09PSAibGlzdEl0ZW0iKTsKICBub2RlMi5jaGVja2VkID0gdG9rZW4udHlwZSA9PT0gInRhc2tMaXN0Q2hlY2tWYWx1ZUNoZWNrZWQiOwp9Cl9fbmFtZShleGl0Q2hlY2ssICJleGl0Q2hlY2siKTsKZnVuY3Rpb24gZXhpdFBhcmFncmFwaFdpdGhUYXNrTGlzdEl0ZW0odG9rZW4pIHsKICBjb25zdCBwYXJlbnQgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMl07CiAgaWYgKHBhcmVudCAmJiBwYXJlbnQudHlwZSA9PT0gImxpc3RJdGVtIiAmJiB0eXBlb2YgcGFyZW50LmNoZWNrZWQgPT09ICJib29sZWFuIikgewogICAgY29uc3Qgbm9kZTIgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgICBvayhub2RlMi50eXBlID09PSAicGFyYWdyYXBoIik7CiAgICBjb25zdCBoZWFkMiA9IG5vZGUyLmNoaWxkcmVuWzBdOwogICAgaWYgKGhlYWQyICYmIGhlYWQyLnR5cGUgPT09ICJ0ZXh0IikgewogICAgICBjb25zdCBzaWJsaW5nczIgPSBwYXJlbnQuY2hpbGRyZW47CiAgICAgIGxldCBpbmRleDIgPSAtMTsKICAgICAgbGV0IGZpcnN0UGFyYWdocmFwaDsKICAgICAgd2hpbGUgKCsraW5kZXgyIDwgc2libGluZ3MyLmxlbmd0aCkgewogICAgICAgIGNvbnN0IHNpYmxpbmcgPSBzaWJsaW5nczJbaW5kZXgyXTsKICAgICAgICBpZiAoc2libGluZy50eXBlID09PSAicGFyYWdyYXBoIikgewogICAgICAgICAgZmlyc3RQYXJhZ2hyYXBoID0gc2libGluZzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZmlyc3RQYXJhZ2hyYXBoID09PSBub2RlMikgewogICAgICAgIGhlYWQyLnZhbHVlID0gaGVhZDIudmFsdWUuc2xpY2UoMSk7CiAgICAgICAgaWYgKGhlYWQyLnZhbHVlLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgbm9kZTIuY2hpbGRyZW4uc2hpZnQoKTsKICAgICAgICB9IGVsc2UgaWYgKG5vZGUyLnBvc2l0aW9uICYmIGhlYWQyLnBvc2l0aW9uICYmIHR5cGVvZiBoZWFkMi5wb3NpdGlvbi5zdGFydC5vZmZzZXQgPT09ICJudW1iZXIiKSB7CiAgICAgICAgICBoZWFkMi5wb3NpdGlvbi5zdGFydC5jb2x1bW4rKzsKICAgICAgICAgIGhlYWQyLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldCsrOwogICAgICAgICAgbm9kZTIucG9zaXRpb24uc3RhcnQgPSBPYmplY3QuYXNzaWduKHt9LCBoZWFkMi5wb3NpdGlvbi5zdGFydCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIHRoaXMuZXhpdCh0b2tlbik7Cn0KX19uYW1lKGV4aXRQYXJhZ3JhcGhXaXRoVGFza0xpc3RJdGVtLCAiZXhpdFBhcmFncmFwaFdpdGhUYXNrTGlzdEl0ZW0iKTsKZnVuY3Rpb24gbGlzdEl0ZW1XaXRoVGFza0xpc3RJdGVtKG5vZGUyLCBwYXJlbnQsIHN0YXRlLCBpbmZvKSB7CiAgY29uc3QgaGVhZDIgPSBub2RlMi5jaGlsZHJlblswXTsKICBjb25zdCBjaGVja2FibGUgPSB0eXBlb2Ygbm9kZTIuY2hlY2tlZCA9PT0gImJvb2xlYW4iICYmIGhlYWQyICYmIGhlYWQyLnR5cGUgPT09ICJwYXJhZ3JhcGgiOwogIGNvbnN0IGNoZWNrYm94ID0gIlsiICsgKG5vZGUyLmNoZWNrZWQgPyAieCIgOiAiICIpICsgIl0gIjsKICBjb25zdCB0cmFja2VyID0gc3RhdGUuY3JlYXRlVHJhY2tlcihpbmZvKTsKICBpZiAoY2hlY2thYmxlKSB7CiAgICB0cmFja2VyLm1vdmUoY2hlY2tib3gpOwogIH0KICBsZXQgdmFsdWUyID0gaGFuZGxlLmxpc3RJdGVtKG5vZGUyLCBwYXJlbnQsIHN0YXRlLCB7CiAgICAuLi5pbmZvLAogICAgLi4udHJhY2tlci5jdXJyZW50KCkKICB9KTsKICBpZiAoY2hlY2thYmxlKSB7CiAgICB2YWx1ZTIgPSB2YWx1ZTIucmVwbGFjZSgvXig/OlsqKy1dfFxkK1wuKShbXHJcbl18IHsxLDN9KS8sIGNoZWNrKTsKICB9CiAgcmV0dXJuIHZhbHVlMjsKICBmdW5jdGlvbiBjaGVjaygkMCkgewogICAgcmV0dXJuICQwICsgY2hlY2tib3g7CiAgfQogIF9fbmFtZShjaGVjaywgImNoZWNrIik7Cn0KX19uYW1lKGxpc3RJdGVtV2l0aFRhc2tMaXN0SXRlbSwgImxpc3RJdGVtV2l0aFRhc2tMaXN0SXRlbSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtZ2ZtQDMuMS4wL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLWdmbS9saWIvaW5kZXguanMKZnVuY3Rpb24gZ2ZtRnJvbU1hcmtkb3duKCkgewogIHJldHVybiBbCiAgICBnZm1BdXRvbGlua0xpdGVyYWxGcm9tTWFya2Rvd24oKSwKICAgIGdmbUZvb3Rub3RlRnJvbU1hcmtkb3duKCksCiAgICBnZm1TdHJpa2V0aHJvdWdoRnJvbU1hcmtkb3duKCksCiAgICBnZm1UYWJsZUZyb21NYXJrZG93bigpLAogICAgZ2ZtVGFza0xpc3RJdGVtRnJvbU1hcmtkb3duKCkKICBdOwp9Cl9fbmFtZShnZm1Gcm9tTWFya2Rvd24sICJnZm1Gcm9tTWFya2Rvd24iKTsKZnVuY3Rpb24gZ2ZtVG9NYXJrZG93bihvcHRpb25zKSB7CiAgcmV0dXJuIHsKICAgIGV4dGVuc2lvbnM6IFsKICAgICAgZ2ZtQXV0b2xpbmtMaXRlcmFsVG9NYXJrZG93bigpLAogICAgICBnZm1Gb290bm90ZVRvTWFya2Rvd24ob3B0aW9ucyksCiAgICAgIGdmbVN0cmlrZXRocm91Z2hUb01hcmtkb3duKCksCiAgICAgIGdmbVRhYmxlVG9NYXJrZG93bihvcHRpb25zKSwKICAgICAgZ2ZtVGFza0xpc3RJdGVtVG9NYXJrZG93bigpCiAgICBdCiAgfTsKfQpfX25hbWUoZ2ZtVG9NYXJrZG93biwgImdmbVRvTWFya2Rvd24iKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstdXRpbC1jaHVua2VkQDIuMC4xL25vZGVfbW9kdWxlcy9taWNyb21hcmstdXRpbC1jaHVua2VkL2luZGV4LmpzCmZ1bmN0aW9uIHNwbGljZShsaXN0NSwgc3RhcnQsIHJlbW92ZTIsIGl0ZW1zKSB7CiAgY29uc3QgZW5kID0gbGlzdDUubGVuZ3RoOwogIGxldCBjaHVua1N0YXJ0ID0gMDsKICBsZXQgcGFyYW1ldGVyczsKICBpZiAoc3RhcnQgPCAwKSB7CiAgICBzdGFydCA9IC1zdGFydCA+IGVuZCA/IDAgOiBlbmQgKyBzdGFydDsKICB9IGVsc2UgewogICAgc3RhcnQgPSBzdGFydCA+IGVuZCA/IGVuZCA6IHN0YXJ0OwogIH0KICByZW1vdmUyID0gcmVtb3ZlMiA+IDAgPyByZW1vdmUyIDogMDsKICBpZiAoaXRlbXMubGVuZ3RoIDwgMWU0KSB7CiAgICBwYXJhbWV0ZXJzID0gQXJyYXkuZnJvbShpdGVtcyk7CiAgICBwYXJhbWV0ZXJzLnVuc2hpZnQoc3RhcnQsIHJlbW92ZTIpOwogICAgbGlzdDUuc3BsaWNlKC4uLnBhcmFtZXRlcnMpOwogIH0gZWxzZSB7CiAgICBpZiAocmVtb3ZlMikgbGlzdDUuc3BsaWNlKHN0YXJ0LCByZW1vdmUyKTsKICAgIHdoaWxlIChjaHVua1N0YXJ0IDwgaXRlbXMubGVuZ3RoKSB7CiAgICAgIHBhcmFtZXRlcnMgPSBpdGVtcy5zbGljZShjaHVua1N0YXJ0LCBjaHVua1N0YXJ0ICsgMWU0KTsKICAgICAgcGFyYW1ldGVycy51bnNoaWZ0KHN0YXJ0LCAwKTsKICAgICAgbGlzdDUuc3BsaWNlKC4uLnBhcmFtZXRlcnMpOwogICAgICBjaHVua1N0YXJ0ICs9IDFlNDsKICAgICAgc3RhcnQgKz0gMWU0OwogICAgfQogIH0KfQpfX25hbWUoc3BsaWNlLCAic3BsaWNlIik7CmZ1bmN0aW9uIHB1c2gobGlzdDUsIGl0ZW1zKSB7CiAgaWYgKGxpc3Q1Lmxlbmd0aCA+IDApIHsKICAgIHNwbGljZShsaXN0NSwgbGlzdDUubGVuZ3RoLCAwLCBpdGVtcyk7CiAgICByZXR1cm4gbGlzdDU7CiAgfQogIHJldHVybiBpdGVtczsKfQpfX25hbWUocHVzaCwgInB1c2giKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstdXRpbC1jb21iaW5lLWV4dGVuc2lvbnNAMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay11dGlsLWNvbWJpbmUtZXh0ZW5zaW9ucy9pbmRleC5qcwp2YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNPd25Qcm9wZXJ0eTsKZnVuY3Rpb24gY29tYmluZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucykgewogIGNvbnN0IGFsbDMgPSB7fTsKICBsZXQgaW5kZXgyID0gLTE7CiAgd2hpbGUgKCsraW5kZXgyIDwgZXh0ZW5zaW9ucy5sZW5ndGgpIHsKICAgIHN5bnRheEV4dGVuc2lvbihhbGwzLCBleHRlbnNpb25zW2luZGV4Ml0pOwogIH0KICByZXR1cm4gYWxsMzsKfQpfX25hbWUoY29tYmluZUV4dGVuc2lvbnMsICJjb21iaW5lRXh0ZW5zaW9ucyIpOwpmdW5jdGlvbiBzeW50YXhFeHRlbnNpb24oYWxsMywgZXh0ZW5zaW9uMikgewogIGxldCBob29rOwogIGZvciAoaG9vayBpbiBleHRlbnNpb24yKSB7CiAgICBjb25zdCBtYXliZSA9IGhhc093blByb3BlcnR5LmNhbGwoYWxsMywgaG9vaykgPyBhbGwzW2hvb2tdIDogdm9pZCAwOwogICAgY29uc3QgbGVmdCA9IG1heWJlIHx8IChhbGwzW2hvb2tdID0ge30pOwogICAgY29uc3QgcmlnaHQgPSBleHRlbnNpb24yW2hvb2tdOwogICAgbGV0IGNvZGU0OwogICAgaWYgKHJpZ2h0KSB7CiAgICAgIGZvciAoY29kZTQgaW4gcmlnaHQpIHsKICAgICAgICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwobGVmdCwgY29kZTQpKSBsZWZ0W2NvZGU0XSA9IFtdOwogICAgICAgIGNvbnN0IHZhbHVlMiA9IHJpZ2h0W2NvZGU0XTsKICAgICAgICBjb25zdHJ1Y3RzKAogICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBMb29rcyBsaWtlIGEgbGlzdC4KICAgICAgICAgIGxlZnRbY29kZTRdLAogICAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZTIpID8gdmFsdWUyIDogdmFsdWUyID8gW3ZhbHVlMl0gOiBbXQogICAgICAgICk7CiAgICAgIH0KICAgIH0KICB9Cn0KX19uYW1lKHN5bnRheEV4dGVuc2lvbiwgInN5bnRheEV4dGVuc2lvbiIpOwpmdW5jdGlvbiBjb25zdHJ1Y3RzKGV4aXN0aW5nLCBsaXN0NSkgewogIGxldCBpbmRleDIgPSAtMTsKICBjb25zdCBiZWZvcmUgPSBbXTsKICB3aGlsZSAoKytpbmRleDIgPCBsaXN0NS5sZW5ndGgpIHsKICAgIDsKICAgIChsaXN0NVtpbmRleDJdLmFkZCA9PT0gImFmdGVyIiA/IGV4aXN0aW5nIDogYmVmb3JlKS5wdXNoKGxpc3Q1W2luZGV4Ml0pOwogIH0KICBzcGxpY2UoZXhpc3RpbmcsIDAsIDAsIGJlZm9yZSk7Cn0KX19uYW1lKGNvbnN0cnVjdHMsICJjb25zdHJ1Y3RzIik7CmZ1bmN0aW9uIGNvbWJpbmVIdG1sRXh0ZW5zaW9ucyhodG1sRXh0ZW5zaW9ucykgewogIGNvbnN0IGhhbmRsZXJzMiA9IHt9OwogIGxldCBpbmRleDIgPSAtMTsKICB3aGlsZSAoKytpbmRleDIgPCBodG1sRXh0ZW5zaW9ucy5sZW5ndGgpIHsKICAgIGh0bWxFeHRlbnNpb24oaGFuZGxlcnMyLCBodG1sRXh0ZW5zaW9uc1tpbmRleDJdKTsKICB9CiAgcmV0dXJuIGhhbmRsZXJzMjsKfQpfX25hbWUoY29tYmluZUh0bWxFeHRlbnNpb25zLCAiY29tYmluZUh0bWxFeHRlbnNpb25zIik7CmZ1bmN0aW9uIGh0bWxFeHRlbnNpb24oYWxsMywgZXh0ZW5zaW9uMikgewogIGxldCBob29rOwogIGZvciAoaG9vayBpbiBleHRlbnNpb24yKSB7CiAgICBjb25zdCBtYXliZSA9IGhhc093blByb3BlcnR5LmNhbGwoYWxsMywgaG9vaykgPyBhbGwzW2hvb2tdIDogdm9pZCAwOwogICAgY29uc3QgbGVmdCA9IG1heWJlIHx8IChhbGwzW2hvb2tdID0ge30pOwogICAgY29uc3QgcmlnaHQgPSBleHRlbnNpb24yW2hvb2tdOwogICAgbGV0IHR5cGU1OwogICAgaWYgKHJpZ2h0KSB7CiAgICAgIGZvciAodHlwZTUgaW4gcmlnaHQpIHsKICAgICAgICBsZWZ0W3R5cGU1XSA9IHJpZ2h0W3R5cGU1XTsKICAgICAgfQogICAgfQogIH0KfQpfX25hbWUoaHRtbEV4dGVuc2lvbiwgImh0bWxFeHRlbnNpb24iKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS1hdXRvbGluay1saXRlcmFsQDIuMS4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS1hdXRvbGluay1saXRlcmFsL2xpYi9zeW50YXguanMKdmFyIHd3d1ByZWZpeCA9IHsKICB0b2tlbml6ZTogdG9rZW5pemVXd3dQcmVmaXgsCiAgcGFydGlhbDogdHJ1ZQp9Owp2YXIgZG9tYWluID0gewogIHRva2VuaXplOiB0b2tlbml6ZURvbWFpbiwKICBwYXJ0aWFsOiB0cnVlCn07CnZhciBwYXRoID0gewogIHRva2VuaXplOiB0b2tlbml6ZVBhdGgsCiAgcGFydGlhbDogdHJ1ZQp9Owp2YXIgdHJhaWwgPSB7CiAgdG9rZW5pemU6IHRva2VuaXplVHJhaWwsCiAgcGFydGlhbDogdHJ1ZQp9Owp2YXIgZW1haWxEb21haW5Eb3RUcmFpbCA9IHsKICB0b2tlbml6ZTogdG9rZW5pemVFbWFpbERvbWFpbkRvdFRyYWlsLAogIHBhcnRpYWw6IHRydWUKfTsKdmFyIHd3d0F1dG9saW5rID0gewogIG5hbWU6ICJ3d3dBdXRvbGluayIsCiAgdG9rZW5pemU6IHRva2VuaXplV3d3QXV0b2xpbmssCiAgcHJldmlvdXM6IHByZXZpb3VzV3d3Cn07CnZhciBwcm90b2NvbEF1dG9saW5rID0gewogIG5hbWU6ICJwcm90b2NvbEF1dG9saW5rIiwKICB0b2tlbml6ZTogdG9rZW5pemVQcm90b2NvbEF1dG9saW5rLAogIHByZXZpb3VzOiBwcmV2aW91c1Byb3RvY29sCn07CnZhciBlbWFpbEF1dG9saW5rID0gewogIG5hbWU6ICJlbWFpbEF1dG9saW5rIiwKICB0b2tlbml6ZTogdG9rZW5pemVFbWFpbEF1dG9saW5rLAogIHByZXZpb3VzOiBwcmV2aW91c0VtYWlsCn07CnZhciB0ZXh0MiA9IHt9OwpmdW5jdGlvbiBnZm1BdXRvbGlua0xpdGVyYWwoKSB7CiAgcmV0dXJuIHsKICAgIHRleHQ6IHRleHQyCiAgfTsKfQpfX25hbWUoZ2ZtQXV0b2xpbmtMaXRlcmFsLCAiZ2ZtQXV0b2xpbmtMaXRlcmFsIik7CnZhciBjb2RlMiA9IDQ4Owp3aGlsZSAoY29kZTIgPCAxMjMpIHsKICB0ZXh0Mltjb2RlMl0gPSBlbWFpbEF1dG9saW5rOwogIGNvZGUyKys7CiAgaWYgKGNvZGUyID09PSA1OCkgY29kZTIgPSA2NTsKICBlbHNlIGlmIChjb2RlMiA9PT0gOTEpIGNvZGUyID0gOTc7Cn0KdGV4dDJbNDNdID0gZW1haWxBdXRvbGluazsKdGV4dDJbNDVdID0gZW1haWxBdXRvbGluazsKdGV4dDJbNDZdID0gZW1haWxBdXRvbGluazsKdGV4dDJbOTVdID0gZW1haWxBdXRvbGluazsKdGV4dDJbNzJdID0gW2VtYWlsQXV0b2xpbmssIHByb3RvY29sQXV0b2xpbmtdOwp0ZXh0MlsxMDRdID0gW2VtYWlsQXV0b2xpbmssIHByb3RvY29sQXV0b2xpbmtdOwp0ZXh0Mls4N10gPSBbZW1haWxBdXRvbGluaywgd3d3QXV0b2xpbmtdOwp0ZXh0MlsxMTldID0gW2VtYWlsQXV0b2xpbmssIHd3d0F1dG9saW5rXTsKZnVuY3Rpb24gdG9rZW5pemVFbWFpbEF1dG9saW5rKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIGxldCBkb3Q7CiAgbGV0IGRhdGE7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBpZiAoIWdmbUF0ZXh0KGNvZGU0KSB8fCAhcHJldmlvdXNFbWFpbC5jYWxsKHNlbGYyLCBzZWxmMi5wcmV2aW91cykgfHwgcHJldmlvdXNVbmJhbGFuY2VkKHNlbGYyLmV2ZW50cykpIHsKICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICBlZmZlY3RzLmVudGVyKCJsaXRlcmFsQXV0b2xpbmsiKTsKICAgIGVmZmVjdHMuZW50ZXIoImxpdGVyYWxBdXRvbGlua0VtYWlsIik7CiAgICByZXR1cm4gYXRleHQoY29kZTQpOwogIH0KICBfX25hbWUoc3RhcnQsICJzdGFydCIpOwogIGZ1bmN0aW9uIGF0ZXh0KGNvZGU0KSB7CiAgICBpZiAoZ2ZtQXRleHQoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBhdGV4dDsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gNjQpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGVtYWlsRG9tYWluOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZShhdGV4dCwgImF0ZXh0Iik7CiAgZnVuY3Rpb24gZW1haWxEb21haW4oY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDYpIHsKICAgICAgcmV0dXJuIGVmZmVjdHMuY2hlY2soZW1haWxEb21haW5Eb3RUcmFpbCwgZW1haWxEb21haW5BZnRlciwgZW1haWxEb21haW5Eb3QpKGNvZGU0KTsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gNDUgfHwgY29kZTQgPT09IDk1IHx8IGFzY2lpQWxwaGFudW1lcmljKGNvZGU0KSkgewogICAgICBkYXRhID0gdHJ1ZTsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGVtYWlsRG9tYWluOwogICAgfQogICAgcmV0dXJuIGVtYWlsRG9tYWluQWZ0ZXIoY29kZTQpOwogIH0KICBfX25hbWUoZW1haWxEb21haW4sICJlbWFpbERvbWFpbiIpOwogIGZ1bmN0aW9uIGVtYWlsRG9tYWluRG90KGNvZGU0KSB7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgZG90ID0gdHJ1ZTsKICAgIHJldHVybiBlbWFpbERvbWFpbjsKICB9CiAgX19uYW1lKGVtYWlsRG9tYWluRG90LCAiZW1haWxEb21haW5Eb3QiKTsKICBmdW5jdGlvbiBlbWFpbERvbWFpbkFmdGVyKGNvZGU0KSB7CiAgICBpZiAoZGF0YSAmJiBkb3QgJiYgYXNjaWlBbHBoYShzZWxmMi5wcmV2aW91cykpIHsKICAgICAgZWZmZWN0cy5leGl0KCJsaXRlcmFsQXV0b2xpbmtFbWFpbCIpOwogICAgICBlZmZlY3RzLmV4aXQoImxpdGVyYWxBdXRvbGluayIpOwogICAgICByZXR1cm4gb2szKGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBfX25hbWUoZW1haWxEb21haW5BZnRlciwgImVtYWlsRG9tYWluQWZ0ZXIiKTsKfQpfX25hbWUodG9rZW5pemVFbWFpbEF1dG9saW5rLCAidG9rZW5pemVFbWFpbEF1dG9saW5rIik7CmZ1bmN0aW9uIHRva2VuaXplV3d3QXV0b2xpbmsoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgcmV0dXJuIHd3d1N0YXJ0OwogIGZ1bmN0aW9uIHd3d1N0YXJ0KGNvZGU0KSB7CiAgICBpZiAoY29kZTQgIT09IDg3ICYmIGNvZGU0ICE9PSAxMTkgfHwgIXByZXZpb3VzV3d3LmNhbGwoc2VsZjIsIHNlbGYyLnByZXZpb3VzKSB8fCBwcmV2aW91c1VuYmFsYW5jZWQoc2VsZjIuZXZlbnRzKSkgewogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuZW50ZXIoImxpdGVyYWxBdXRvbGluayIpOwogICAgZWZmZWN0cy5lbnRlcigibGl0ZXJhbEF1dG9saW5rV3d3Iik7CiAgICByZXR1cm4gZWZmZWN0cy5jaGVjayh3d3dQcmVmaXgsIGVmZmVjdHMuYXR0ZW1wdChkb21haW4sIGVmZmVjdHMuYXR0ZW1wdChwYXRoLCB3d3dBZnRlciksIG5vayksIG5vaykoY29kZTQpOwogIH0KICBfX25hbWUod3d3U3RhcnQsICJ3d3dTdGFydCIpOwogIGZ1bmN0aW9uIHd3d0FmdGVyKGNvZGU0KSB7CiAgICBlZmZlY3RzLmV4aXQoImxpdGVyYWxBdXRvbGlua1d3dyIpOwogICAgZWZmZWN0cy5leGl0KCJsaXRlcmFsQXV0b2xpbmsiKTsKICAgIHJldHVybiBvazMoY29kZTQpOwogIH0KICBfX25hbWUod3d3QWZ0ZXIsICJ3d3dBZnRlciIpOwp9Cl9fbmFtZSh0b2tlbml6ZVd3d0F1dG9saW5rLCAidG9rZW5pemVXd3dBdXRvbGluayIpOwpmdW5jdGlvbiB0b2tlbml6ZVByb3RvY29sQXV0b2xpbmsoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgbGV0IGJ1ZmZlcjIgPSAiIjsKICBsZXQgc2VlbiA9IGZhbHNlOwogIHJldHVybiBwcm90b2NvbFN0YXJ0OwogIGZ1bmN0aW9uIHByb3RvY29sU3RhcnQoY29kZTQpIHsKICAgIGlmICgoY29kZTQgPT09IDcyIHx8IGNvZGU0ID09PSAxMDQpICYmIHByZXZpb3VzUHJvdG9jb2wuY2FsbChzZWxmMiwgc2VsZjIucHJldmlvdXMpICYmICFwcmV2aW91c1VuYmFsYW5jZWQoc2VsZjIuZXZlbnRzKSkgewogICAgICBlZmZlY3RzLmVudGVyKCJsaXRlcmFsQXV0b2xpbmsiKTsKICAgICAgZWZmZWN0cy5lbnRlcigibGl0ZXJhbEF1dG9saW5rSHR0cCIpOwogICAgICBidWZmZXIyICs9IFN0cmluZy5mcm9tQ29kZVBvaW50KGNvZGU0KTsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHByb3RvY29sUHJlZml4SW5zaWRlOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZShwcm90b2NvbFN0YXJ0LCAicHJvdG9jb2xTdGFydCIpOwogIGZ1bmN0aW9uIHByb3RvY29sUHJlZml4SW5zaWRlKGNvZGU0KSB7CiAgICBpZiAoYXNjaWlBbHBoYShjb2RlNCkgJiYgYnVmZmVyMi5sZW5ndGggPCA1KSB7CiAgICAgIGJ1ZmZlcjIgKz0gU3RyaW5nLmZyb21Db2RlUG9pbnQoY29kZTQpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gcHJvdG9jb2xQcmVmaXhJbnNpZGU7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDU4KSB7CiAgICAgIGNvbnN0IHByb3RvY29sID0gYnVmZmVyMi50b0xvd2VyQ2FzZSgpOwogICAgICBpZiAocHJvdG9jb2wgPT09ICJodHRwIiB8fCBwcm90b2NvbCA9PT0gImh0dHBzIikgewogICAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgICAgcmV0dXJuIHByb3RvY29sU2xhc2hlc0luc2lkZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZShwcm90b2NvbFByZWZpeEluc2lkZSwgInByb3RvY29sUHJlZml4SW5zaWRlIik7CiAgZnVuY3Rpb24gcHJvdG9jb2xTbGFzaGVzSW5zaWRlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDQ3KSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGlmIChzZWVuKSB7CiAgICAgICAgcmV0dXJuIGFmdGVyUHJvdG9jb2w7CiAgICAgIH0KICAgICAgc2VlbiA9IHRydWU7CiAgICAgIHJldHVybiBwcm90b2NvbFNsYXNoZXNJbnNpZGU7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKHByb3RvY29sU2xhc2hlc0luc2lkZSwgInByb3RvY29sU2xhc2hlc0luc2lkZSIpOwogIGZ1bmN0aW9uIGFmdGVyUHJvdG9jb2woY29kZTQpIHsKICAgIHJldHVybiBjb2RlNCA9PT0gbnVsbCB8fCBhc2NpaUNvbnRyb2woY29kZTQpIHx8IG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpIHx8IHVuaWNvZGVXaGl0ZXNwYWNlKGNvZGU0KSB8fCB1bmljb2RlUHVuY3R1YXRpb24oY29kZTQpID8gbm9rKGNvZGU0KSA6IGVmZmVjdHMuYXR0ZW1wdChkb21haW4sIGVmZmVjdHMuYXR0ZW1wdChwYXRoLCBwcm90b2NvbEFmdGVyKSwgbm9rKShjb2RlNCk7CiAgfQogIF9fbmFtZShhZnRlclByb3RvY29sLCAiYWZ0ZXJQcm90b2NvbCIpOwogIGZ1bmN0aW9uIHByb3RvY29sQWZ0ZXIoY29kZTQpIHsKICAgIGVmZmVjdHMuZXhpdCgibGl0ZXJhbEF1dG9saW5rSHR0cCIpOwogICAgZWZmZWN0cy5leGl0KCJsaXRlcmFsQXV0b2xpbmsiKTsKICAgIHJldHVybiBvazMoY29kZTQpOwogIH0KICBfX25hbWUocHJvdG9jb2xBZnRlciwgInByb3RvY29sQWZ0ZXIiKTsKfQpfX25hbWUodG9rZW5pemVQcm90b2NvbEF1dG9saW5rLCAidG9rZW5pemVQcm90b2NvbEF1dG9saW5rIik7CmZ1bmN0aW9uIHRva2VuaXplV3d3UHJlZml4KGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgbGV0IHNpemUgPSAwOwogIHJldHVybiB3d3dQcmVmaXhJbnNpZGU7CiAgZnVuY3Rpb24gd3d3UHJlZml4SW5zaWRlKGNvZGU0KSB7CiAgICBpZiAoKGNvZGU0ID09PSA4NyB8fCBjb2RlNCA9PT0gMTE5KSAmJiBzaXplIDwgMykgewogICAgICBzaXplKys7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiB3d3dQcmVmaXhJbnNpZGU7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDQ2ICYmIHNpemUgPT09IDMpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHd3d1ByZWZpeEFmdGVyOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZSh3d3dQcmVmaXhJbnNpZGUsICJ3d3dQcmVmaXhJbnNpZGUiKTsKICBmdW5jdGlvbiB3d3dQcmVmaXhBZnRlcihjb2RlNCkgewogICAgcmV0dXJuIGNvZGU0ID09PSBudWxsID8gbm9rKGNvZGU0KSA6IG9rMyhjb2RlNCk7CiAgfQogIF9fbmFtZSh3d3dQcmVmaXhBZnRlciwgInd3d1ByZWZpeEFmdGVyIik7Cn0KX19uYW1lKHRva2VuaXplV3d3UHJlZml4LCAidG9rZW5pemVXd3dQcmVmaXgiKTsKZnVuY3Rpb24gdG9rZW5pemVEb21haW4oZWZmZWN0cywgb2szLCBub2spIHsKICBsZXQgdW5kZXJzY29yZUluTGFzdFNlZ21lbnQ7CiAgbGV0IHVuZGVyc2NvcmVJbkxhc3RMYXN0U2VnbWVudDsKICBsZXQgc2VlbjsKICByZXR1cm4gZG9tYWluSW5zaWRlOwogIGZ1bmN0aW9uIGRvbWFpbkluc2lkZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0NiB8fCBjb2RlNCA9PT0gOTUpIHsKICAgICAgcmV0dXJuIGVmZmVjdHMuY2hlY2sodHJhaWwsIGRvbWFpbkFmdGVyLCBkb21haW5BdFB1bmN0dWF0aW9uKShjb2RlNCk7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlNCkgfHwgdW5pY29kZVdoaXRlc3BhY2UoY29kZTQpIHx8IGNvZGU0ICE9PSA0NSAmJiB1bmljb2RlUHVuY3R1YXRpb24oY29kZTQpKSB7CiAgICAgIHJldHVybiBkb21haW5BZnRlcihjb2RlNCk7CiAgICB9CiAgICBzZWVuID0gdHJ1ZTsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gZG9tYWluSW5zaWRlOwogIH0KICBfX25hbWUoZG9tYWluSW5zaWRlLCAiZG9tYWluSW5zaWRlIik7CiAgZnVuY3Rpb24gZG9tYWluQXRQdW5jdHVhdGlvbihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA5NSkgewogICAgICB1bmRlcnNjb3JlSW5MYXN0U2VnbWVudCA9IHRydWU7CiAgICB9IGVsc2UgewogICAgICB1bmRlcnNjb3JlSW5MYXN0TGFzdFNlZ21lbnQgPSB1bmRlcnNjb3JlSW5MYXN0U2VnbWVudDsKICAgICAgdW5kZXJzY29yZUluTGFzdFNlZ21lbnQgPSB2b2lkIDA7CiAgICB9CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIGRvbWFpbkluc2lkZTsKICB9CiAgX19uYW1lKGRvbWFpbkF0UHVuY3R1YXRpb24sICJkb21haW5BdFB1bmN0dWF0aW9uIik7CiAgZnVuY3Rpb24gZG9tYWluQWZ0ZXIoY29kZTQpIHsKICAgIGlmICh1bmRlcnNjb3JlSW5MYXN0TGFzdFNlZ21lbnQgfHwgdW5kZXJzY29yZUluTGFzdFNlZ21lbnQgfHwgIXNlZW4pIHsKICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gb2szKGNvZGU0KTsKICB9CiAgX19uYW1lKGRvbWFpbkFmdGVyLCAiZG9tYWluQWZ0ZXIiKTsKfQpfX25hbWUodG9rZW5pemVEb21haW4sICJ0b2tlbml6ZURvbWFpbiIpOwpmdW5jdGlvbiB0b2tlbml6ZVBhdGgoZWZmZWN0cywgb2szKSB7CiAgbGV0IHNpemVPcGVuID0gMDsKICBsZXQgc2l6ZUNsb3NlID0gMDsKICByZXR1cm4gcGF0aEluc2lkZTsKICBmdW5jdGlvbiBwYXRoSW5zaWRlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDQwKSB7CiAgICAgIHNpemVPcGVuKys7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBwYXRoSW5zaWRlOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA0MSAmJiBzaXplQ2xvc2UgPCBzaXplT3BlbikgewogICAgICByZXR1cm4gcGF0aEF0UHVuY3R1YXRpb24oY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSAzMyB8fCBjb2RlNCA9PT0gMzQgfHwgY29kZTQgPT09IDM4IHx8IGNvZGU0ID09PSAzOSB8fCBjb2RlNCA9PT0gNDEgfHwgY29kZTQgPT09IDQyIHx8IGNvZGU0ID09PSA0NCB8fCBjb2RlNCA9PT0gNDYgfHwgY29kZTQgPT09IDU4IHx8IGNvZGU0ID09PSA1OSB8fCBjb2RlNCA9PT0gNjAgfHwgY29kZTQgPT09IDYzIHx8IGNvZGU0ID09PSA5MyB8fCBjb2RlNCA9PT0gOTUgfHwgY29kZTQgPT09IDEyNikgewogICAgICByZXR1cm4gZWZmZWN0cy5jaGVjayh0cmFpbCwgb2szLCBwYXRoQXRQdW5jdHVhdGlvbikoY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpIHx8IHVuaWNvZGVXaGl0ZXNwYWNlKGNvZGU0KSkgewogICAgICByZXR1cm4gb2szKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gcGF0aEluc2lkZTsKICB9CiAgX19uYW1lKHBhdGhJbnNpZGUsICJwYXRoSW5zaWRlIik7CiAgZnVuY3Rpb24gcGF0aEF0UHVuY3R1YXRpb24oY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDEpIHsKICAgICAgc2l6ZUNsb3NlKys7CiAgICB9CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIHBhdGhJbnNpZGU7CiAgfQogIF9fbmFtZShwYXRoQXRQdW5jdHVhdGlvbiwgInBhdGhBdFB1bmN0dWF0aW9uIik7Cn0KX19uYW1lKHRva2VuaXplUGF0aCwgInRva2VuaXplUGF0aCIpOwpmdW5jdGlvbiB0b2tlbml6ZVRyYWlsKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgcmV0dXJuIHRyYWlsMjsKICBmdW5jdGlvbiB0cmFpbDIoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gMzMgfHwgY29kZTQgPT09IDM0IHx8IGNvZGU0ID09PSAzOSB8fCBjb2RlNCA9PT0gNDEgfHwgY29kZTQgPT09IDQyIHx8IGNvZGU0ID09PSA0NCB8fCBjb2RlNCA9PT0gNDYgfHwgY29kZTQgPT09IDU4IHx8IGNvZGU0ID09PSA1OSB8fCBjb2RlNCA9PT0gNjMgfHwgY29kZTQgPT09IDk1IHx8IGNvZGU0ID09PSAxMjYpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHRyYWlsMjsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gMzgpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHRyYWlsQ2hhcmFjdGVyUmVmZXJlbmNlU3RhcnQ7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDkzKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiB0cmFpbEJyYWNrZXRBZnRlcjsKICAgIH0KICAgIGlmICgKICAgICAgLy8gYDxgIGlzIGFuIGVuZC4KICAgICAgY29kZTQgPT09IDYwIHx8IC8vIFNvIGlzIHdoaXRlc3BhY2UuCiAgICAgIGNvZGU0ID09PSBudWxsIHx8IG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpIHx8IHVuaWNvZGVXaGl0ZXNwYWNlKGNvZGU0KQogICAgKSB7CiAgICAgIHJldHVybiBvazMoY29kZTQpOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZSh0cmFpbDIsICJ0cmFpbCIpOwogIGZ1bmN0aW9uIHRyYWlsQnJhY2tldEFmdGVyKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgY29kZTQgPT09IDQwIHx8IGNvZGU0ID09PSA5MSB8fCBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlKGNvZGU0KSB8fCB1bmljb2RlV2hpdGVzcGFjZShjb2RlNCkpIHsKICAgICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gdHJhaWwyKGNvZGU0KTsKICB9CiAgX19uYW1lKHRyYWlsQnJhY2tldEFmdGVyLCAidHJhaWxCcmFja2V0QWZ0ZXIiKTsKICBmdW5jdGlvbiB0cmFpbENoYXJhY3RlclJlZmVyZW5jZVN0YXJ0KGNvZGU0KSB7CiAgICByZXR1cm4gYXNjaWlBbHBoYShjb2RlNCkgPyB0cmFpbENoYXJhY3RlclJlZmVyZW5jZUluc2lkZShjb2RlNCkgOiBub2soY29kZTQpOwogIH0KICBfX25hbWUodHJhaWxDaGFyYWN0ZXJSZWZlcmVuY2VTdGFydCwgInRyYWlsQ2hhcmFjdGVyUmVmZXJlbmNlU3RhcnQiKTsKICBmdW5jdGlvbiB0cmFpbENoYXJhY3RlclJlZmVyZW5jZUluc2lkZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA1OSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gdHJhaWwyOwogICAgfQogICAgaWYgKGFzY2lpQWxwaGEoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiB0cmFpbENoYXJhY3RlclJlZmVyZW5jZUluc2lkZTsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBfX25hbWUodHJhaWxDaGFyYWN0ZXJSZWZlcmVuY2VJbnNpZGUsICJ0cmFpbENoYXJhY3RlclJlZmVyZW5jZUluc2lkZSIpOwp9Cl9fbmFtZSh0b2tlbml6ZVRyYWlsLCAidG9rZW5pemVUcmFpbCIpOwpmdW5jdGlvbiB0b2tlbml6ZUVtYWlsRG9tYWluRG90VHJhaWwoZWZmZWN0cywgb2szLCBub2spIHsKICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gYWZ0ZXI7CiAgfQogIF9fbmFtZShzdGFydCwgInN0YXJ0Iik7CiAgZnVuY3Rpb24gYWZ0ZXIoY29kZTQpIHsKICAgIHJldHVybiBhc2NpaUFscGhhbnVtZXJpYyhjb2RlNCkgPyBub2soY29kZTQpIDogb2szKGNvZGU0KTsKICB9CiAgX19uYW1lKGFmdGVyLCAiYWZ0ZXIiKTsKfQpfX25hbWUodG9rZW5pemVFbWFpbERvbWFpbkRvdFRyYWlsLCAidG9rZW5pemVFbWFpbERvbWFpbkRvdFRyYWlsIik7CmZ1bmN0aW9uIHByZXZpb3VzV3d3KGNvZGU0KSB7CiAgcmV0dXJuIGNvZGU0ID09PSBudWxsIHx8IGNvZGU0ID09PSA0MCB8fCBjb2RlNCA9PT0gNDIgfHwgY29kZTQgPT09IDk1IHx8IGNvZGU0ID09PSA5MSB8fCBjb2RlNCA9PT0gOTMgfHwgY29kZTQgPT09IDEyNiB8fCBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlKGNvZGU0KTsKfQpfX25hbWUocHJldmlvdXNXd3csICJwcmV2aW91c1d3dyIpOwpmdW5jdGlvbiBwcmV2aW91c1Byb3RvY29sKGNvZGU0KSB7CiAgcmV0dXJuICFhc2NpaUFscGhhKGNvZGU0KTsKfQpfX25hbWUocHJldmlvdXNQcm90b2NvbCwgInByZXZpb3VzUHJvdG9jb2wiKTsKZnVuY3Rpb24gcHJldmlvdXNFbWFpbChjb2RlNCkgewogIHJldHVybiAhKGNvZGU0ID09PSA0NyB8fCBnZm1BdGV4dChjb2RlNCkpOwp9Cl9fbmFtZShwcmV2aW91c0VtYWlsLCAicHJldmlvdXNFbWFpbCIpOwpmdW5jdGlvbiBnZm1BdGV4dChjb2RlNCkgewogIHJldHVybiBjb2RlNCA9PT0gNDMgfHwgY29kZTQgPT09IDQ1IHx8IGNvZGU0ID09PSA0NiB8fCBjb2RlNCA9PT0gOTUgfHwgYXNjaWlBbHBoYW51bWVyaWMoY29kZTQpOwp9Cl9fbmFtZShnZm1BdGV4dCwgImdmbUF0ZXh0Iik7CmZ1bmN0aW9uIHByZXZpb3VzVW5iYWxhbmNlZChldmVudHMpIHsKICBsZXQgaW5kZXgyID0gZXZlbnRzLmxlbmd0aDsKICBsZXQgcmVzdWx0ID0gZmFsc2U7CiAgd2hpbGUgKGluZGV4Mi0tKSB7CiAgICBjb25zdCB0b2tlbiA9IGV2ZW50c1tpbmRleDJdWzFdOwogICAgaWYgKCh0b2tlbi50eXBlID09PSAibGFiZWxMaW5rIiB8fCB0b2tlbi50eXBlID09PSAibGFiZWxJbWFnZSIpICYmICF0b2tlbi5fYmFsYW5jZWQpIHsKICAgICAgcmVzdWx0ID0gdHJ1ZTsKICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAodG9rZW4uX2dmbUF1dG9saW5rTGl0ZXJhbFdhbGtlZEludG8pIHsKICAgICAgcmVzdWx0ID0gZmFsc2U7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICBpZiAoZXZlbnRzLmxlbmd0aCA+IDAgJiYgIXJlc3VsdCkgewogICAgZXZlbnRzW2V2ZW50cy5sZW5ndGggLSAxXVsxXS5fZ2ZtQXV0b2xpbmtMaXRlcmFsV2Fsa2VkSW50byA9IHRydWU7CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KX19uYW1lKHByZXZpb3VzVW5iYWxhbmNlZCwgInByZXZpb3VzVW5iYWxhbmNlZCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay11dGlsLWVuY29kZUAyLjAuMS9ub2RlX21vZHVsZXMvbWljcm9tYXJrLXV0aWwtZW5jb2RlL2luZGV4LmpzCnZhciBjaGFyYWN0ZXJSZWZlcmVuY2VzID0geyAnIic6ICJxdW90IiwgIiYiOiAiYW1wIiwgIjwiOiAibHQiLCAiPiI6ICJndCIgfTsKZnVuY3Rpb24gZW5jb2RlKHZhbHVlMikgewogIHJldHVybiB2YWx1ZTIucmVwbGFjZSgvWyImPD5dL2csIHJlcGxhY2UzKTsKICBmdW5jdGlvbiByZXBsYWNlMyh2YWx1ZTMpIHsKICAgIHJldHVybiAiJiIgKyBjaGFyYWN0ZXJSZWZlcmVuY2VzWwogICAgICAvKiogQHR5cGUge2tleW9mIHR5cGVvZiBjaGFyYWN0ZXJSZWZlcmVuY2VzfSAqLwogICAgICB2YWx1ZTMKICAgIF0gKyAiOyI7CiAgfQogIF9fbmFtZShyZXBsYWNlMywgInJlcGxhY2UiKTsKfQpfX25hbWUoZW5jb2RlLCAiZW5jb2RlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLXV0aWwtc2FuaXRpemUtdXJpQDIuMC4xL25vZGVfbW9kdWxlcy9taWNyb21hcmstdXRpbC1zYW5pdGl6ZS11cmkvaW5kZXguanMKZnVuY3Rpb24gc2FuaXRpemVVcmkodXJsLCBwcm90b2NvbCkgewogIGNvbnN0IHZhbHVlMiA9IGVuY29kZShub3JtYWxpemVVcmkodXJsIHx8ICIiKSk7CiAgaWYgKCFwcm90b2NvbCkgewogICAgcmV0dXJuIHZhbHVlMjsKICB9CiAgY29uc3QgY29sb24gPSB2YWx1ZTIuaW5kZXhPZigiOiIpOwogIGNvbnN0IHF1ZXN0aW9uTWFyayA9IHZhbHVlMi5pbmRleE9mKCI/Iik7CiAgY29uc3QgbnVtYmVyU2lnbiA9IHZhbHVlMi5pbmRleE9mKCIjIik7CiAgY29uc3Qgc2xhc2ggPSB2YWx1ZTIuaW5kZXhPZigiLyIpOwogIGlmICgKICAgIC8vIElmIHRoZXJlIGlzIG5vIHByb3RvY29sLCBpdOKAmXMgcmVsYXRpdmUuCiAgICBjb2xvbiA8IDAgfHwgLy8gSWYgdGhlIGZpcnN0IGNvbG9uIGlzIGFmdGVyIGEgYD9gLCBgI2AsIG9yIGAvYCwgaXTigJlzIG5vdCBhIHByb3RvY29sLgogICAgc2xhc2ggPiAtMSAmJiBjb2xvbiA+IHNsYXNoIHx8IHF1ZXN0aW9uTWFyayA+IC0xICYmIGNvbG9uID4gcXVlc3Rpb25NYXJrIHx8IG51bWJlclNpZ24gPiAtMSAmJiBjb2xvbiA+IG51bWJlclNpZ24gfHwgLy8gSXQgaXMgYSBwcm90b2NvbCwgaXQgc2hvdWxkIGJlIGFsbG93ZWQuCiAgICBwcm90b2NvbC50ZXN0KHZhbHVlMi5zbGljZSgwLCBjb2xvbikpCiAgKSB7CiAgICByZXR1cm4gdmFsdWUyOwogIH0KICByZXR1cm4gIiI7Cn0KX19uYW1lKHNhbml0aXplVXJpLCAic2FuaXRpemVVcmkiKTsKZnVuY3Rpb24gbm9ybWFsaXplVXJpKHZhbHVlMikgewogIGNvbnN0IHJlc3VsdCA9IFtdOwogIGxldCBpbmRleDIgPSAtMTsKICBsZXQgc3RhcnQgPSAwOwogIGxldCBza2lwMiA9IDA7CiAgd2hpbGUgKCsraW5kZXgyIDwgdmFsdWUyLmxlbmd0aCkgewogICAgY29uc3QgY29kZTQgPSB2YWx1ZTIuY2hhckNvZGVBdChpbmRleDIpOwogICAgbGV0IHJlcGxhY2UzID0gIiI7CiAgICBpZiAoY29kZTQgPT09IDM3ICYmIGFzY2lpQWxwaGFudW1lcmljKHZhbHVlMi5jaGFyQ29kZUF0KGluZGV4MiArIDEpKSAmJiBhc2NpaUFscGhhbnVtZXJpYyh2YWx1ZTIuY2hhckNvZGVBdChpbmRleDIgKyAyKSkpIHsKICAgICAgc2tpcDIgPSAyOwogICAgfSBlbHNlIGlmIChjb2RlNCA8IDEyOCkgewogICAgICBpZiAoIS9bISMkJi07PT8tWl9hLXp+XS8udGVzdChTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGU0KSkpIHsKICAgICAgICByZXBsYWNlMyA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZTQpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGNvZGU0ID4gNTUyOTUgJiYgY29kZTQgPCA1NzM0NCkgewogICAgICBjb25zdCBuZXh0MiA9IHZhbHVlMi5jaGFyQ29kZUF0KGluZGV4MiArIDEpOwogICAgICBpZiAoY29kZTQgPCA1NjMyMCAmJiBuZXh0MiA+IDU2MzE5ICYmIG5leHQyIDwgNTczNDQpIHsKICAgICAgICByZXBsYWNlMyA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZTQsIG5leHQyKTsKICAgICAgICBza2lwMiA9IDE7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVwbGFjZTMgPSAiXHVGRkZEIjsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmVwbGFjZTMgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGU0KTsKICAgIH0KICAgIGlmIChyZXBsYWNlMykgewogICAgICByZXN1bHQucHVzaCh2YWx1ZTIuc2xpY2Uoc3RhcnQsIGluZGV4MiksIGVuY29kZVVSSUNvbXBvbmVudChyZXBsYWNlMykpOwogICAgICBzdGFydCA9IGluZGV4MiArIHNraXAyICsgMTsKICAgICAgcmVwbGFjZTMgPSAiIjsKICAgIH0KICAgIGlmIChza2lwMikgewogICAgICBpbmRleDIgKz0gc2tpcDI7CiAgICAgIHNraXAyID0gMDsKICAgIH0KICB9CiAgcmV0dXJuIHJlc3VsdC5qb2luKCIiKSArIHZhbHVlMi5zbGljZShzdGFydCk7Cn0KX19uYW1lKG5vcm1hbGl6ZVVyaSwgIm5vcm1hbGl6ZVVyaSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLWF1dG9saW5rLWxpdGVyYWxAMi4xLjAvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLWF1dG9saW5rLWxpdGVyYWwvbGliL2h0bWwuanMKZnVuY3Rpb24gZ2ZtQXV0b2xpbmtMaXRlcmFsSHRtbCgpIHsKICByZXR1cm4gewogICAgZXhpdDogewogICAgICBsaXRlcmFsQXV0b2xpbmtFbWFpbCwKICAgICAgbGl0ZXJhbEF1dG9saW5rSHR0cCwKICAgICAgbGl0ZXJhbEF1dG9saW5rV3d3CiAgICB9CiAgfTsKfQpfX25hbWUoZ2ZtQXV0b2xpbmtMaXRlcmFsSHRtbCwgImdmbUF1dG9saW5rTGl0ZXJhbEh0bWwiKTsKZnVuY3Rpb24gbGl0ZXJhbEF1dG9saW5rV3d3KHRva2VuKSB7CiAgYW5jaG9yRnJvbVRva2VuLmNhbGwodGhpcywgdG9rZW4sICJodHRwOi8vIik7Cn0KX19uYW1lKGxpdGVyYWxBdXRvbGlua1d3dywgImxpdGVyYWxBdXRvbGlua1d3dyIpOwpmdW5jdGlvbiBsaXRlcmFsQXV0b2xpbmtFbWFpbCh0b2tlbikgewogIGFuY2hvckZyb21Ub2tlbi5jYWxsKHRoaXMsIHRva2VuLCAibWFpbHRvOiIpOwp9Cl9fbmFtZShsaXRlcmFsQXV0b2xpbmtFbWFpbCwgImxpdGVyYWxBdXRvbGlua0VtYWlsIik7CmZ1bmN0aW9uIGxpdGVyYWxBdXRvbGlua0h0dHAodG9rZW4pIHsKICBhbmNob3JGcm9tVG9rZW4uY2FsbCh0aGlzLCB0b2tlbik7Cn0KX19uYW1lKGxpdGVyYWxBdXRvbGlua0h0dHAsICJsaXRlcmFsQXV0b2xpbmtIdHRwIik7CmZ1bmN0aW9uIGFuY2hvckZyb21Ub2tlbih0b2tlbiwgcHJvdG9jb2wpIHsKICBjb25zdCB1cmwgPSB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKTsKICB0aGlzLnRhZygnPGEgaHJlZj0iJyArIHNhbml0aXplVXJpKChwcm90b2NvbCB8fCAiIikgKyB1cmwpICsgJyI+Jyk7CiAgdGhpcy5yYXcodGhpcy5lbmNvZGUodXJsKSk7CiAgdGhpcy50YWcoIjwvYT4iKTsKfQpfX25hbWUoYW5jaG9yRnJvbVRva2VuLCAiYW5jaG9yRnJvbVRva2VuIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLXV0aWwtcmVzb2x2ZS1hbGxAMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay11dGlsLXJlc29sdmUtYWxsL2luZGV4LmpzCmZ1bmN0aW9uIHJlc29sdmVBbGwoY29uc3RydWN0czIsIGV2ZW50cywgY29udGV4dDIpIHsKICBjb25zdCBjYWxsZWQgPSBbXTsKICBsZXQgaW5kZXgyID0gLTE7CiAgd2hpbGUgKCsraW5kZXgyIDwgY29uc3RydWN0czIubGVuZ3RoKSB7CiAgICBjb25zdCByZXNvbHZlMiA9IGNvbnN0cnVjdHMyW2luZGV4Ml0ucmVzb2x2ZUFsbDsKICAgIGlmIChyZXNvbHZlMiAmJiAhY2FsbGVkLmluY2x1ZGVzKHJlc29sdmUyKSkgewogICAgICBldmVudHMgPSByZXNvbHZlMihldmVudHMsIGNvbnRleHQyKTsKICAgICAgY2FsbGVkLnB1c2gocmVzb2x2ZTIpOwogICAgfQogIH0KICByZXR1cm4gZXZlbnRzOwp9Cl9fbmFtZShyZXNvbHZlQWxsLCAicmVzb2x2ZUFsbCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2F0dGVudGlvbi5qcwp2YXIgYXR0ZW50aW9uID0gewogIG5hbWU6ICJhdHRlbnRpb24iLAogIHJlc29sdmVBbGw6IHJlc29sdmVBbGxBdHRlbnRpb24sCiAgdG9rZW5pemU6IHRva2VuaXplQXR0ZW50aW9uCn07CmZ1bmN0aW9uIHJlc29sdmVBbGxBdHRlbnRpb24oZXZlbnRzLCBjb250ZXh0MikgewogIGxldCBpbmRleDIgPSAtMTsKICBsZXQgb3BlbjsKICBsZXQgZ3JvdXA7CiAgbGV0IHRleHQ4OwogIGxldCBvcGVuaW5nU2VxdWVuY2U7CiAgbGV0IGNsb3NpbmdTZXF1ZW5jZTsKICBsZXQgdXNlOwogIGxldCBuZXh0RXZlbnRzOwogIGxldCBvZmZzZXQ7CiAgd2hpbGUgKCsraW5kZXgyIDwgZXZlbnRzLmxlbmd0aCkgewogICAgaWYgKGV2ZW50c1tpbmRleDJdWzBdID09PSAiZW50ZXIiICYmIGV2ZW50c1tpbmRleDJdWzFdLnR5cGUgPT09ICJhdHRlbnRpb25TZXF1ZW5jZSIgJiYgZXZlbnRzW2luZGV4Ml1bMV0uX2Nsb3NlKSB7CiAgICAgIG9wZW4gPSBpbmRleDI7CiAgICAgIHdoaWxlIChvcGVuLS0pIHsKICAgICAgICBpZiAoZXZlbnRzW29wZW5dWzBdID09PSAiZXhpdCIgJiYgZXZlbnRzW29wZW5dWzFdLnR5cGUgPT09ICJhdHRlbnRpb25TZXF1ZW5jZSIgJiYgZXZlbnRzW29wZW5dWzFdLl9vcGVuICYmIC8vIElmIHRoZSBtYXJrZXJzIGFyZSB0aGUgc2FtZToKICAgICAgICBjb250ZXh0Mi5zbGljZVNlcmlhbGl6ZShldmVudHNbb3Blbl1bMV0pLmNoYXJDb2RlQXQoMCkgPT09IGNvbnRleHQyLnNsaWNlU2VyaWFsaXplKGV2ZW50c1tpbmRleDJdWzFdKS5jaGFyQ29kZUF0KDApKSB7CiAgICAgICAgICBpZiAoKGV2ZW50c1tvcGVuXVsxXS5fY2xvc2UgfHwgZXZlbnRzW2luZGV4Ml1bMV0uX29wZW4pICYmIChldmVudHNbaW5kZXgyXVsxXS5lbmQub2Zmc2V0IC0gZXZlbnRzW2luZGV4Ml1bMV0uc3RhcnQub2Zmc2V0KSAlIDMgJiYgISgoZXZlbnRzW29wZW5dWzFdLmVuZC5vZmZzZXQgLSBldmVudHNbb3Blbl1bMV0uc3RhcnQub2Zmc2V0ICsgZXZlbnRzW2luZGV4Ml1bMV0uZW5kLm9mZnNldCAtIGV2ZW50c1tpbmRleDJdWzFdLnN0YXJ0Lm9mZnNldCkgJSAzKSkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIHVzZSA9IGV2ZW50c1tvcGVuXVsxXS5lbmQub2Zmc2V0IC0gZXZlbnRzW29wZW5dWzFdLnN0YXJ0Lm9mZnNldCA+IDEgJiYgZXZlbnRzW2luZGV4Ml1bMV0uZW5kLm9mZnNldCAtIGV2ZW50c1tpbmRleDJdWzFdLnN0YXJ0Lm9mZnNldCA+IDEgPyAyIDogMTsKICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gewogICAgICAgICAgICAuLi5ldmVudHNbb3Blbl1bMV0uZW5kCiAgICAgICAgICB9OwogICAgICAgICAgY29uc3QgZW5kID0gewogICAgICAgICAgICAuLi5ldmVudHNbaW5kZXgyXVsxXS5zdGFydAogICAgICAgICAgfTsKICAgICAgICAgIG1vdmVQb2ludChzdGFydCwgLXVzZSk7CiAgICAgICAgICBtb3ZlUG9pbnQoZW5kLCB1c2UpOwogICAgICAgICAgb3BlbmluZ1NlcXVlbmNlID0gewogICAgICAgICAgICB0eXBlOiB1c2UgPiAxID8gInN0cm9uZ1NlcXVlbmNlIiA6ICJlbXBoYXNpc1NlcXVlbmNlIiwKICAgICAgICAgICAgc3RhcnQsCiAgICAgICAgICAgIGVuZDogewogICAgICAgICAgICAgIC4uLmV2ZW50c1tvcGVuXVsxXS5lbmQKICAgICAgICAgICAgfQogICAgICAgICAgfTsKICAgICAgICAgIGNsb3NpbmdTZXF1ZW5jZSA9IHsKICAgICAgICAgICAgdHlwZTogdXNlID4gMSA/ICJzdHJvbmdTZXF1ZW5jZSIgOiAiZW1waGFzaXNTZXF1ZW5jZSIsCiAgICAgICAgICAgIHN0YXJ0OiB7CiAgICAgICAgICAgICAgLi4uZXZlbnRzW2luZGV4Ml1bMV0uc3RhcnQKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZW5kCiAgICAgICAgICB9OwogICAgICAgICAgdGV4dDggPSB7CiAgICAgICAgICAgIHR5cGU6IHVzZSA+IDEgPyAic3Ryb25nVGV4dCIgOiAiZW1waGFzaXNUZXh0IiwKICAgICAgICAgICAgc3RhcnQ6IHsKICAgICAgICAgICAgICAuLi5ldmVudHNbb3Blbl1bMV0uZW5kCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGVuZDogewogICAgICAgICAgICAgIC4uLmV2ZW50c1tpbmRleDJdWzFdLnN0YXJ0CiAgICAgICAgICAgIH0KICAgICAgICAgIH07CiAgICAgICAgICBncm91cCA9IHsKICAgICAgICAgICAgdHlwZTogdXNlID4gMSA/ICJzdHJvbmciIDogImVtcGhhc2lzIiwKICAgICAgICAgICAgc3RhcnQ6IHsKICAgICAgICAgICAgICAuLi5vcGVuaW5nU2VxdWVuY2Uuc3RhcnQKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZW5kOiB7CiAgICAgICAgICAgICAgLi4uY2xvc2luZ1NlcXVlbmNlLmVuZAogICAgICAgICAgICB9CiAgICAgICAgICB9OwogICAgICAgICAgZXZlbnRzW29wZW5dWzFdLmVuZCA9IHsKICAgICAgICAgICAgLi4ub3BlbmluZ1NlcXVlbmNlLnN0YXJ0CiAgICAgICAgICB9OwogICAgICAgICAgZXZlbnRzW2luZGV4Ml1bMV0uc3RhcnQgPSB7CiAgICAgICAgICAgIC4uLmNsb3NpbmdTZXF1ZW5jZS5lbmQKICAgICAgICAgIH07CiAgICAgICAgICBuZXh0RXZlbnRzID0gW107CiAgICAgICAgICBpZiAoZXZlbnRzW29wZW5dWzFdLmVuZC5vZmZzZXQgLSBldmVudHNbb3Blbl1bMV0uc3RhcnQub2Zmc2V0KSB7CiAgICAgICAgICAgIG5leHRFdmVudHMgPSBwdXNoKG5leHRFdmVudHMsIFtbImVudGVyIiwgZXZlbnRzW29wZW5dWzFdLCBjb250ZXh0Ml0sIFsiZXhpdCIsIGV2ZW50c1tvcGVuXVsxXSwgY29udGV4dDJdXSk7CiAgICAgICAgICB9CiAgICAgICAgICBuZXh0RXZlbnRzID0gcHVzaChuZXh0RXZlbnRzLCBbWyJlbnRlciIsIGdyb3VwLCBjb250ZXh0Ml0sIFsiZW50ZXIiLCBvcGVuaW5nU2VxdWVuY2UsIGNvbnRleHQyXSwgWyJleGl0Iiwgb3BlbmluZ1NlcXVlbmNlLCBjb250ZXh0Ml0sIFsiZW50ZXIiLCB0ZXh0OCwgY29udGV4dDJdXSk7CiAgICAgICAgICBuZXh0RXZlbnRzID0gcHVzaChuZXh0RXZlbnRzLCByZXNvbHZlQWxsKGNvbnRleHQyLnBhcnNlci5jb25zdHJ1Y3RzLmluc2lkZVNwYW4ubnVsbCwgZXZlbnRzLnNsaWNlKG9wZW4gKyAxLCBpbmRleDIpLCBjb250ZXh0MikpOwogICAgICAgICAgbmV4dEV2ZW50cyA9IHB1c2gobmV4dEV2ZW50cywgW1siZXhpdCIsIHRleHQ4LCBjb250ZXh0Ml0sIFsiZW50ZXIiLCBjbG9zaW5nU2VxdWVuY2UsIGNvbnRleHQyXSwgWyJleGl0IiwgY2xvc2luZ1NlcXVlbmNlLCBjb250ZXh0Ml0sIFsiZXhpdCIsIGdyb3VwLCBjb250ZXh0Ml1dKTsKICAgICAgICAgIGlmIChldmVudHNbaW5kZXgyXVsxXS5lbmQub2Zmc2V0IC0gZXZlbnRzW2luZGV4Ml1bMV0uc3RhcnQub2Zmc2V0KSB7CiAgICAgICAgICAgIG9mZnNldCA9IDI7CiAgICAgICAgICAgIG5leHRFdmVudHMgPSBwdXNoKG5leHRFdmVudHMsIFtbImVudGVyIiwgZXZlbnRzW2luZGV4Ml1bMV0sIGNvbnRleHQyXSwgWyJleGl0IiwgZXZlbnRzW2luZGV4Ml1bMV0sIGNvbnRleHQyXV0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgb2Zmc2V0ID0gMDsKICAgICAgICAgIH0KICAgICAgICAgIHNwbGljZShldmVudHMsIG9wZW4gLSAxLCBpbmRleDIgLSBvcGVuICsgMywgbmV4dEV2ZW50cyk7CiAgICAgICAgICBpbmRleDIgPSBvcGVuICsgbmV4dEV2ZW50cy5sZW5ndGggLSBvZmZzZXQgLSAyOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIGluZGV4MiA9IC0xOwogIHdoaWxlICgrK2luZGV4MiA8IGV2ZW50cy5sZW5ndGgpIHsKICAgIGlmIChldmVudHNbaW5kZXgyXVsxXS50eXBlID09PSAiYXR0ZW50aW9uU2VxdWVuY2UiKSB7CiAgICAgIGV2ZW50c1tpbmRleDJdWzFdLnR5cGUgPSAiZGF0YSI7CiAgICB9CiAgfQogIHJldHVybiBldmVudHM7Cn0KX19uYW1lKHJlc29sdmVBbGxBdHRlbnRpb24sICJyZXNvbHZlQWxsQXR0ZW50aW9uIik7CmZ1bmN0aW9uIHRva2VuaXplQXR0ZW50aW9uKGVmZmVjdHMsIG9rMykgewogIGNvbnN0IGF0dGVudGlvbk1hcmtlcnMyID0gdGhpcy5wYXJzZXIuY29uc3RydWN0cy5hdHRlbnRpb25NYXJrZXJzLm51bGw7CiAgY29uc3QgcHJldmlvdXMzID0gdGhpcy5wcmV2aW91czsKICBjb25zdCBiZWZvcmUgPSBjbGFzc2lmeUNoYXJhY3RlcihwcmV2aW91czMpOwogIGxldCBtYXJrZXI7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBtYXJrZXIgPSBjb2RlNDsKICAgIGVmZmVjdHMuZW50ZXIoImF0dGVudGlvblNlcXVlbmNlIik7CiAgICByZXR1cm4gaW5zaWRlKGNvZGU0KTsKICB9CiAgX19uYW1lKHN0YXJ0LCAic3RhcnQiKTsKICBmdW5jdGlvbiBpbnNpZGUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbWFya2VyKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBpbnNpZGU7CiAgICB9CiAgICBjb25zdCB0b2tlbiA9IGVmZmVjdHMuZXhpdCgiYXR0ZW50aW9uU2VxdWVuY2UiKTsKICAgIGNvbnN0IGFmdGVyID0gY2xhc3NpZnlDaGFyYWN0ZXIoY29kZTQpOwogICAgY29uc3Qgb3BlbiA9ICFhZnRlciB8fCBhZnRlciA9PT0gMiAmJiBiZWZvcmUgfHwgYXR0ZW50aW9uTWFya2VyczIuaW5jbHVkZXMoY29kZTQpOwogICAgY29uc3QgY2xvc2U3ID0gIWJlZm9yZSB8fCBiZWZvcmUgPT09IDIgJiYgYWZ0ZXIgfHwgYXR0ZW50aW9uTWFya2VyczIuaW5jbHVkZXMocHJldmlvdXMzKTsKICAgIHRva2VuLl9vcGVuID0gQm9vbGVhbihtYXJrZXIgPT09IDQyID8gb3BlbiA6IG9wZW4gJiYgKGJlZm9yZSB8fCAhY2xvc2U3KSk7CiAgICB0b2tlbi5fY2xvc2UgPSBCb29sZWFuKG1hcmtlciA9PT0gNDIgPyBjbG9zZTcgOiBjbG9zZTcgJiYgKGFmdGVyIHx8ICFvcGVuKSk7CiAgICByZXR1cm4gb2szKGNvZGU0KTsKICB9CiAgX19uYW1lKGluc2lkZSwgImluc2lkZSIpOwp9Cl9fbmFtZSh0b2tlbml6ZUF0dGVudGlvbiwgInRva2VuaXplQXR0ZW50aW9uIik7CmZ1bmN0aW9uIG1vdmVQb2ludChwb2ludDQsIG9mZnNldCkgewogIHBvaW50NC5jb2x1bW4gKz0gb2Zmc2V0OwogIHBvaW50NC5vZmZzZXQgKz0gb2Zmc2V0OwogIHBvaW50NC5fYnVmZmVySW5kZXggKz0gb2Zmc2V0Owp9Cl9fbmFtZShtb3ZlUG9pbnQsICJtb3ZlUG9pbnQiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstY29yZS1jb21tb25tYXJrQDIuMC4zL25vZGVfbW9kdWxlcy9taWNyb21hcmstY29yZS1jb21tb25tYXJrL2xpYi9hdXRvbGluay5qcwp2YXIgYXV0b2xpbmsgPSB7CiAgbmFtZTogImF1dG9saW5rIiwKICB0b2tlbml6ZTogdG9rZW5pemVBdXRvbGluawp9OwpmdW5jdGlvbiB0b2tlbml6ZUF1dG9saW5rKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgbGV0IHNpemUgPSAwOwogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigiYXV0b2xpbmsiKTsKICAgIGVmZmVjdHMuZW50ZXIoImF1dG9saW5rTWFya2VyIik7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgZWZmZWN0cy5leGl0KCJhdXRvbGlua01hcmtlciIpOwogICAgZWZmZWN0cy5lbnRlcigiYXV0b2xpbmtQcm90b2NvbCIpOwogICAgcmV0dXJuIG9wZW47CiAgfQogIF9fbmFtZShzdGFydCwgInN0YXJ0Iik7CiAgZnVuY3Rpb24gb3Blbihjb2RlNCkgewogICAgaWYgKGFzY2lpQWxwaGEoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBzY2hlbWVPckVtYWlsQXRleHQ7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDY0KSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgcmV0dXJuIGVtYWlsQXRleHQoY29kZTQpOwogIH0KICBfX25hbWUob3BlbiwgIm9wZW4iKTsKICBmdW5jdGlvbiBzY2hlbWVPckVtYWlsQXRleHQoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDMgfHwgY29kZTQgPT09IDQ1IHx8IGNvZGU0ID09PSA0NiB8fCBhc2NpaUFscGhhbnVtZXJpYyhjb2RlNCkpIHsKICAgICAgc2l6ZSA9IDE7CiAgICAgIHJldHVybiBzY2hlbWVJbnNpZGVPckVtYWlsQXRleHQoY29kZTQpOwogICAgfQogICAgcmV0dXJuIGVtYWlsQXRleHQoY29kZTQpOwogIH0KICBfX25hbWUoc2NoZW1lT3JFbWFpbEF0ZXh0LCAic2NoZW1lT3JFbWFpbEF0ZXh0Iik7CiAgZnVuY3Rpb24gc2NoZW1lSW5zaWRlT3JFbWFpbEF0ZXh0KGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDU4KSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHNpemUgPSAwOwogICAgICByZXR1cm4gdXJsSW5zaWRlOwogICAgfQogICAgaWYgKChjb2RlNCA9PT0gNDMgfHwgY29kZTQgPT09IDQ1IHx8IGNvZGU0ID09PSA0NiB8fCBhc2NpaUFscGhhbnVtZXJpYyhjb2RlNCkpICYmIHNpemUrKyA8IDMyKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBzY2hlbWVJbnNpZGVPckVtYWlsQXRleHQ7CiAgICB9CiAgICBzaXplID0gMDsKICAgIHJldHVybiBlbWFpbEF0ZXh0KGNvZGU0KTsKICB9CiAgX19uYW1lKHNjaGVtZUluc2lkZU9yRW1haWxBdGV4dCwgInNjaGVtZUluc2lkZU9yRW1haWxBdGV4dCIpOwogIGZ1bmN0aW9uIHVybEluc2lkZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA2MikgewogICAgICBlZmZlY3RzLmV4aXQoImF1dG9saW5rUHJvdG9jb2wiKTsKICAgICAgZWZmZWN0cy5lbnRlcigiYXV0b2xpbmtNYXJrZXIiKTsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgZWZmZWN0cy5leGl0KCJhdXRvbGlua01hcmtlciIpOwogICAgICBlZmZlY3RzLmV4aXQoImF1dG9saW5rIik7CiAgICAgIHJldHVybiBvazM7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgY29kZTQgPT09IDMyIHx8IGNvZGU0ID09PSA2MCB8fCBhc2NpaUNvbnRyb2woY29kZTQpKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiB1cmxJbnNpZGU7CiAgfQogIF9fbmFtZSh1cmxJbnNpZGUsICJ1cmxJbnNpZGUiKTsKICBmdW5jdGlvbiBlbWFpbEF0ZXh0KGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDY0KSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBlbWFpbEF0U2lnbk9yRG90OwogICAgfQogICAgaWYgKGFzY2lpQXRleHQoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBlbWFpbEF0ZXh0OwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZShlbWFpbEF0ZXh0LCAiZW1haWxBdGV4dCIpOwogIGZ1bmN0aW9uIGVtYWlsQXRTaWduT3JEb3QoY29kZTQpIHsKICAgIHJldHVybiBhc2NpaUFscGhhbnVtZXJpYyhjb2RlNCkgPyBlbWFpbExhYmVsKGNvZGU0KSA6IG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZShlbWFpbEF0U2lnbk9yRG90LCAiZW1haWxBdFNpZ25PckRvdCIpOwogIGZ1bmN0aW9uIGVtYWlsTGFiZWwoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDYpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgc2l6ZSA9IDA7CiAgICAgIHJldHVybiBlbWFpbEF0U2lnbk9yRG90OwogICAgfQogICAgaWYgKGNvZGU0ID09PSA2MikgewogICAgICBlZmZlY3RzLmV4aXQoImF1dG9saW5rUHJvdG9jb2wiKS50eXBlID0gImF1dG9saW5rRW1haWwiOwogICAgICBlZmZlY3RzLmVudGVyKCJhdXRvbGlua01hcmtlciIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoImF1dG9saW5rTWFya2VyIik7CiAgICAgIGVmZmVjdHMuZXhpdCgiYXV0b2xpbmsiKTsKICAgICAgcmV0dXJuIG9rMzsKICAgIH0KICAgIHJldHVybiBlbWFpbFZhbHVlKGNvZGU0KTsKICB9CiAgX19uYW1lKGVtYWlsTGFiZWwsICJlbWFpbExhYmVsIik7CiAgZnVuY3Rpb24gZW1haWxWYWx1ZShjb2RlNCkgewogICAgaWYgKChjb2RlNCA9PT0gNDUgfHwgYXNjaWlBbHBoYW51bWVyaWMoY29kZTQpKSAmJiBzaXplKysgPCA2MykgewogICAgICBjb25zdCBuZXh0MiA9IGNvZGU0ID09PSA0NSA/IGVtYWlsVmFsdWUgOiBlbWFpbExhYmVsOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gbmV4dDI7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKGVtYWlsVmFsdWUsICJlbWFpbFZhbHVlIik7Cn0KX19uYW1lKHRva2VuaXplQXV0b2xpbmssICJ0b2tlbml6ZUF1dG9saW5rIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWZhY3Rvcnktc3BhY2VAMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1mYWN0b3J5LXNwYWNlL2luZGV4LmpzCmZ1bmN0aW9uIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBvazMsIHR5cGU1LCBtYXgzKSB7CiAgY29uc3QgbGltaXQgPSBtYXgzID8gbWF4MyAtIDEgOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7CiAgbGV0IHNpemUgPSAwOwogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuZW50ZXIodHlwZTUpOwogICAgICByZXR1cm4gcHJlZml4KGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBvazMoY29kZTQpOwogIH0KICBfX25hbWUoc3RhcnQsICJzdGFydCIpOwogIGZ1bmN0aW9uIHByZWZpeChjb2RlNCkgewogICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZTQpICYmIHNpemUrKyA8IGxpbWl0KSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBwcmVmaXg7CiAgICB9CiAgICBlZmZlY3RzLmV4aXQodHlwZTUpOwogICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgfQogIF9fbmFtZShwcmVmaXgsICJwcmVmaXgiKTsKfQpfX25hbWUoZmFjdG9yeVNwYWNlLCAiZmFjdG9yeVNwYWNlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvYmxhbmstbGluZS5qcwp2YXIgYmxhbmtMaW5lID0gewogIHBhcnRpYWw6IHRydWUsCiAgdG9rZW5pemU6IHRva2VuaXplQmxhbmtMaW5lCn07CmZ1bmN0aW9uIHRva2VuaXplQmxhbmtMaW5lKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICByZXR1cm4gbWFya2Rvd25TcGFjZShjb2RlNCkgPyBmYWN0b3J5U3BhY2UoZWZmZWN0cywgYWZ0ZXIsICJsaW5lUHJlZml4IikoY29kZTQpIDogYWZ0ZXIoY29kZTQpOwogIH0KICBfX25hbWUoc3RhcnQsICJzdGFydCIpOwogIGZ1bmN0aW9uIGFmdGVyKGNvZGU0KSB7CiAgICByZXR1cm4gY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSA/IG9rMyhjb2RlNCkgOiBub2soY29kZTQpOwogIH0KICBfX25hbWUoYWZ0ZXIsICJhZnRlciIpOwp9Cl9fbmFtZSh0b2tlbml6ZUJsYW5rTGluZSwgInRva2VuaXplQmxhbmtMaW5lIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvYmxvY2stcXVvdGUuanMKdmFyIGJsb2NrUXVvdGUgPSB7CiAgY29udGludWF0aW9uOiB7CiAgICB0b2tlbml6ZTogdG9rZW5pemVCbG9ja1F1b3RlQ29udGludWF0aW9uCiAgfSwKICBleGl0OiBleGl0MiwKICBuYW1lOiAiYmxvY2tRdW90ZSIsCiAgdG9rZW5pemU6IHRva2VuaXplQmxvY2tRdW90ZVN0YXJ0Cn07CmZ1bmN0aW9uIHRva2VuaXplQmxvY2tRdW90ZVN0YXJ0KGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA2MikgewogICAgICBjb25zdCBzdGF0ZSA9IHNlbGYyLmNvbnRhaW5lclN0YXRlOwogICAgICBpZiAoIXN0YXRlLm9wZW4pIHsKICAgICAgICBlZmZlY3RzLmVudGVyKCJibG9ja1F1b3RlIiwgewogICAgICAgICAgX2NvbnRhaW5lcjogdHJ1ZQogICAgICAgIH0pOwogICAgICAgIHN0YXRlLm9wZW4gPSB0cnVlOwogICAgICB9CiAgICAgIGVmZmVjdHMuZW50ZXIoImJsb2NrUXVvdGVQcmVmaXgiKTsKICAgICAgZWZmZWN0cy5lbnRlcigiYmxvY2tRdW90ZU1hcmtlciIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoImJsb2NrUXVvdGVNYXJrZXIiKTsKICAgICAgcmV0dXJuIGFmdGVyOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZShzdGFydCwgInN0YXJ0Iik7CiAgZnVuY3Rpb24gYWZ0ZXIoY29kZTQpIHsKICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmVudGVyKCJibG9ja1F1b3RlUHJlZml4V2hpdGVzcGFjZSIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoImJsb2NrUXVvdGVQcmVmaXhXaGl0ZXNwYWNlIik7CiAgICAgIGVmZmVjdHMuZXhpdCgiYmxvY2tRdW90ZVByZWZpeCIpOwogICAgICByZXR1cm4gb2szOwogICAgfQogICAgZWZmZWN0cy5leGl0KCJibG9ja1F1b3RlUHJlZml4Iik7CiAgICByZXR1cm4gb2szKGNvZGU0KTsKICB9CiAgX19uYW1lKGFmdGVyLCAiYWZ0ZXIiKTsKfQpfX25hbWUodG9rZW5pemVCbG9ja1F1b3RlU3RhcnQsICJ0b2tlbml6ZUJsb2NrUXVvdGVTdGFydCIpOwpmdW5jdGlvbiB0b2tlbml6ZUJsb2NrUXVvdGVDb250aW51YXRpb24oZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgcmV0dXJuIGNvbnRTdGFydDsKICBmdW5jdGlvbiBjb250U3RhcnQoY29kZTQpIHsKICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICByZXR1cm4gZmFjdG9yeVNwYWNlKGVmZmVjdHMsIGNvbnRCZWZvcmUsICJsaW5lUHJlZml4Iiwgc2VsZjIucGFyc2VyLmNvbnN0cnVjdHMuZGlzYWJsZS5udWxsLmluY2x1ZGVzKCJjb2RlSW5kZW50ZWQiKSA/IHZvaWQgMCA6IDQpKGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBjb250QmVmb3JlKGNvZGU0KTsKICB9CiAgX19uYW1lKGNvbnRTdGFydCwgImNvbnRTdGFydCIpOwogIGZ1bmN0aW9uIGNvbnRCZWZvcmUoY29kZTQpIHsKICAgIHJldHVybiBlZmZlY3RzLmF0dGVtcHQoYmxvY2tRdW90ZSwgb2szLCBub2spKGNvZGU0KTsKICB9CiAgX19uYW1lKGNvbnRCZWZvcmUsICJjb250QmVmb3JlIik7Cn0KX19uYW1lKHRva2VuaXplQmxvY2tRdW90ZUNvbnRpbnVhdGlvbiwgInRva2VuaXplQmxvY2tRdW90ZUNvbnRpbnVhdGlvbiIpOwpmdW5jdGlvbiBleGl0MihlZmZlY3RzKSB7CiAgZWZmZWN0cy5leGl0KCJibG9ja1F1b3RlIik7Cn0KX19uYW1lKGV4aXQyLCAiZXhpdCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2NoYXJhY3Rlci1lc2NhcGUuanMKdmFyIGNoYXJhY3RlckVzY2FwZSA9IHsKICBuYW1lOiAiY2hhcmFjdGVyRXNjYXBlIiwKICB0b2tlbml6ZTogdG9rZW5pemVDaGFyYWN0ZXJFc2NhcGUKfTsKZnVuY3Rpb24gdG9rZW5pemVDaGFyYWN0ZXJFc2NhcGUoZWZmZWN0cywgb2szLCBub2spIHsKICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIGVmZmVjdHMuZW50ZXIoImNoYXJhY3RlckVzY2FwZSIpOwogICAgZWZmZWN0cy5lbnRlcigiZXNjYXBlTWFya2VyIik7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgZWZmZWN0cy5leGl0KCJlc2NhcGVNYXJrZXIiKTsKICAgIHJldHVybiBpbnNpZGU7CiAgfQogIF9fbmFtZShzdGFydCwgInN0YXJ0Iik7CiAgZnVuY3Rpb24gaW5zaWRlKGNvZGU0KSB7CiAgICBpZiAoYXNjaWlQdW5jdHVhdGlvbihjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5lbnRlcigiY2hhcmFjdGVyRXNjYXBlVmFsdWUiKTsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgZWZmZWN0cy5leGl0KCJjaGFyYWN0ZXJFc2NhcGVWYWx1ZSIpOwogICAgICBlZmZlY3RzLmV4aXQoImNoYXJhY3RlckVzY2FwZSIpOwogICAgICByZXR1cm4gb2szOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZShpbnNpZGUsICJpbnNpZGUiKTsKfQpfX25hbWUodG9rZW5pemVDaGFyYWN0ZXJFc2NhcGUsICJ0b2tlbml6ZUNoYXJhY3RlckVzY2FwZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2NoYXJhY3Rlci1yZWZlcmVuY2UuanMKdmFyIGNoYXJhY3RlclJlZmVyZW5jZSA9IHsKICBuYW1lOiAiY2hhcmFjdGVyUmVmZXJlbmNlIiwKICB0b2tlbml6ZTogdG9rZW5pemVDaGFyYWN0ZXJSZWZlcmVuY2UKfTsKZnVuY3Rpb24gdG9rZW5pemVDaGFyYWN0ZXJSZWZlcmVuY2UoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgbGV0IHNpemUgPSAwOwogIGxldCBtYXgzOwogIGxldCB0ZXN0OwogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigiY2hhcmFjdGVyUmVmZXJlbmNlIik7CiAgICBlZmZlY3RzLmVudGVyKCJjaGFyYWN0ZXJSZWZlcmVuY2VNYXJrZXIiKTsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICBlZmZlY3RzLmV4aXQoImNoYXJhY3RlclJlZmVyZW5jZU1hcmtlciIpOwogICAgcmV0dXJuIG9wZW47CiAgfQogIF9fbmFtZShzdGFydCwgInN0YXJ0Iik7CiAgZnVuY3Rpb24gb3Blbihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSAzNSkgewogICAgICBlZmZlY3RzLmVudGVyKCJjaGFyYWN0ZXJSZWZlcmVuY2VNYXJrZXJOdW1lcmljIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgiY2hhcmFjdGVyUmVmZXJlbmNlTWFya2VyTnVtZXJpYyIpOwogICAgICByZXR1cm4gbnVtZXJpYzsKICAgIH0KICAgIGVmZmVjdHMuZW50ZXIoImNoYXJhY3RlclJlZmVyZW5jZVZhbHVlIik7CiAgICBtYXgzID0gMzE7CiAgICB0ZXN0ID0gYXNjaWlBbHBoYW51bWVyaWM7CiAgICByZXR1cm4gdmFsdWUyKGNvZGU0KTsKICB9CiAgX19uYW1lKG9wZW4sICJvcGVuIik7CiAgZnVuY3Rpb24gbnVtZXJpYyhjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA4OCB8fCBjb2RlNCA9PT0gMTIwKSB7CiAgICAgIGVmZmVjdHMuZW50ZXIoImNoYXJhY3RlclJlZmVyZW5jZU1hcmtlckhleGFkZWNpbWFsIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgiY2hhcmFjdGVyUmVmZXJlbmNlTWFya2VySGV4YWRlY2ltYWwiKTsKICAgICAgZWZmZWN0cy5lbnRlcigiY2hhcmFjdGVyUmVmZXJlbmNlVmFsdWUiKTsKICAgICAgbWF4MyA9IDY7CiAgICAgIHRlc3QgPSBhc2NpaUhleERpZ2l0OwogICAgICByZXR1cm4gdmFsdWUyOwogICAgfQogICAgZWZmZWN0cy5lbnRlcigiY2hhcmFjdGVyUmVmZXJlbmNlVmFsdWUiKTsKICAgIG1heDMgPSA3OwogICAgdGVzdCA9IGFzY2lpRGlnaXQ7CiAgICByZXR1cm4gdmFsdWUyKGNvZGU0KTsKICB9CiAgX19uYW1lKG51bWVyaWMsICJudW1lcmljIik7CiAgZnVuY3Rpb24gdmFsdWUyKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDU5ICYmIHNpemUpIHsKICAgICAgY29uc3QgdG9rZW4gPSBlZmZlY3RzLmV4aXQoImNoYXJhY3RlclJlZmVyZW5jZVZhbHVlIik7CiAgICAgIGlmICh0ZXN0ID09PSBhc2NpaUFscGhhbnVtZXJpYyAmJiAhZGVjb2RlTmFtZWRDaGFyYWN0ZXJSZWZlcmVuY2Uoc2VsZjIuc2xpY2VTZXJpYWxpemUodG9rZW4pKSkgewogICAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgICB9CiAgICAgIGVmZmVjdHMuZW50ZXIoImNoYXJhY3RlclJlZmVyZW5jZU1hcmtlciIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoImNoYXJhY3RlclJlZmVyZW5jZU1hcmtlciIpOwogICAgICBlZmZlY3RzLmV4aXQoImNoYXJhY3RlclJlZmVyZW5jZSIpOwogICAgICByZXR1cm4gb2szOwogICAgfQogICAgaWYgKHRlc3QoY29kZTQpICYmIHNpemUrKyA8IG1heDMpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHZhbHVlMjsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBfX25hbWUodmFsdWUyLCAidmFsdWUiKTsKfQpfX25hbWUodG9rZW5pemVDaGFyYWN0ZXJSZWZlcmVuY2UsICJ0b2tlbml6ZUNoYXJhY3RlclJlZmVyZW5jZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2NvZGUtZmVuY2VkLmpzCnZhciBub25MYXp5Q29udGludWF0aW9uID0gewogIHBhcnRpYWw6IHRydWUsCiAgdG9rZW5pemU6IHRva2VuaXplTm9uTGF6eUNvbnRpbnVhdGlvbgp9Owp2YXIgY29kZUZlbmNlZCA9IHsKICBjb25jcmV0ZTogdHJ1ZSwKICBuYW1lOiAiY29kZUZlbmNlZCIsCiAgdG9rZW5pemU6IHRva2VuaXplQ29kZUZlbmNlZAp9OwpmdW5jdGlvbiB0b2tlbml6ZUNvZGVGZW5jZWQoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgY29uc3QgY2xvc2VTdGFydCA9IHsKICAgIHBhcnRpYWw6IHRydWUsCiAgICB0b2tlbml6ZTogdG9rZW5pemVDbG9zZVN0YXJ0CiAgfTsKICBsZXQgaW5pdGlhbFByZWZpeCA9IDA7CiAgbGV0IHNpemVPcGVuID0gMDsKICBsZXQgbWFya2VyOwogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgcmV0dXJuIGJlZm9yZVNlcXVlbmNlT3Blbihjb2RlNCk7CiAgfQogIF9fbmFtZShzdGFydCwgInN0YXJ0Iik7CiAgZnVuY3Rpb24gYmVmb3JlU2VxdWVuY2VPcGVuKGNvZGU0KSB7CiAgICBjb25zdCB0YWlsID0gc2VsZjIuZXZlbnRzW3NlbGYyLmV2ZW50cy5sZW5ndGggLSAxXTsKICAgIGluaXRpYWxQcmVmaXggPSB0YWlsICYmIHRhaWxbMV0udHlwZSA9PT0gImxpbmVQcmVmaXgiID8gdGFpbFsyXS5zbGljZVNlcmlhbGl6ZSh0YWlsWzFdLCB0cnVlKS5sZW5ndGggOiAwOwogICAgbWFya2VyID0gY29kZTQ7CiAgICBlZmZlY3RzLmVudGVyKCJjb2RlRmVuY2VkIik7CiAgICBlZmZlY3RzLmVudGVyKCJjb2RlRmVuY2VkRmVuY2UiKTsKICAgIGVmZmVjdHMuZW50ZXIoImNvZGVGZW5jZWRGZW5jZVNlcXVlbmNlIik7CiAgICByZXR1cm4gc2VxdWVuY2VPcGVuKGNvZGU0KTsKICB9CiAgX19uYW1lKGJlZm9yZVNlcXVlbmNlT3BlbiwgImJlZm9yZVNlcXVlbmNlT3BlbiIpOwogIGZ1bmN0aW9uIHNlcXVlbmNlT3Blbihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBtYXJrZXIpIHsKICAgICAgc2l6ZU9wZW4rKzsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHNlcXVlbmNlT3BlbjsKICAgIH0KICAgIGlmIChzaXplT3BlbiA8IDMpIHsKICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICBlZmZlY3RzLmV4aXQoImNvZGVGZW5jZWRGZW5jZVNlcXVlbmNlIik7CiAgICByZXR1cm4gbWFya2Rvd25TcGFjZShjb2RlNCkgPyBmYWN0b3J5U3BhY2UoZWZmZWN0cywgaW5mb0JlZm9yZSwgIndoaXRlc3BhY2UiKShjb2RlNCkgOiBpbmZvQmVmb3JlKGNvZGU0KTsKICB9CiAgX19uYW1lKHNlcXVlbmNlT3BlbiwgInNlcXVlbmNlT3BlbiIpOwogIGZ1bmN0aW9uIGluZm9CZWZvcmUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuZXhpdCgiY29kZUZlbmNlZEZlbmNlIik7CiAgICAgIHJldHVybiBzZWxmMi5pbnRlcnJ1cHQgPyBvazMoY29kZTQpIDogZWZmZWN0cy5jaGVjayhub25MYXp5Q29udGludWF0aW9uLCBhdE5vbkxhenlCcmVhaywgYWZ0ZXIpKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuZW50ZXIoImNvZGVGZW5jZWRGZW5jZUluZm8iKTsKICAgIGVmZmVjdHMuZW50ZXIoImNodW5rU3RyaW5nIiwgewogICAgICBjb250ZW50VHlwZTogInN0cmluZyIKICAgIH0pOwogICAgcmV0dXJuIGluZm8oY29kZTQpOwogIH0KICBfX25hbWUoaW5mb0JlZm9yZSwgImluZm9CZWZvcmUiKTsKICBmdW5jdGlvbiBpbmZvKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmV4aXQoImNodW5rU3RyaW5nIik7CiAgICAgIGVmZmVjdHMuZXhpdCgiY29kZUZlbmNlZEZlbmNlSW5mbyIpOwogICAgICByZXR1cm4gaW5mb0JlZm9yZShjb2RlNCk7CiAgICB9CiAgICBpZiAobWFya2Rvd25TcGFjZShjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5leGl0KCJjaHVua1N0cmluZyIpOwogICAgICBlZmZlY3RzLmV4aXQoImNvZGVGZW5jZWRGZW5jZUluZm8iKTsKICAgICAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBtZXRhQmVmb3JlLCAid2hpdGVzcGFjZSIpKGNvZGU0KTsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gOTYgJiYgY29kZTQgPT09IG1hcmtlcikgewogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gaW5mbzsKICB9CiAgX19uYW1lKGluZm8sICJpbmZvIik7CiAgZnVuY3Rpb24gbWV0YUJlZm9yZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgcmV0dXJuIGluZm9CZWZvcmUoY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5lbnRlcigiY29kZUZlbmNlZEZlbmNlTWV0YSIpOwogICAgZWZmZWN0cy5lbnRlcigiY2h1bmtTdHJpbmciLCB7CiAgICAgIGNvbnRlbnRUeXBlOiAic3RyaW5nIgogICAgfSk7CiAgICByZXR1cm4gbWV0YShjb2RlNCk7CiAgfQogIF9fbmFtZShtZXRhQmVmb3JlLCAibWV0YUJlZm9yZSIpOwogIGZ1bmN0aW9uIG1ldGEoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuZXhpdCgiY2h1bmtTdHJpbmciKTsKICAgICAgZWZmZWN0cy5leGl0KCJjb2RlRmVuY2VkRmVuY2VNZXRhIik7CiAgICAgIHJldHVybiBpbmZvQmVmb3JlKGNvZGU0KTsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gOTYgJiYgY29kZTQgPT09IG1hcmtlcikgewogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gbWV0YTsKICB9CiAgX19uYW1lKG1ldGEsICJtZXRhIik7CiAgZnVuY3Rpb24gYXROb25MYXp5QnJlYWsoY29kZTQpIHsKICAgIHJldHVybiBlZmZlY3RzLmF0dGVtcHQoY2xvc2VTdGFydCwgYWZ0ZXIsIGNvbnRlbnRCZWZvcmUpKGNvZGU0KTsKICB9CiAgX19uYW1lKGF0Tm9uTGF6eUJyZWFrLCAiYXROb25MYXp5QnJlYWsiKTsKICBmdW5jdGlvbiBjb250ZW50QmVmb3JlKGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJsaW5lRW5kaW5nIik7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgZWZmZWN0cy5leGl0KCJsaW5lRW5kaW5nIik7CiAgICByZXR1cm4gY29udGVudFN0YXJ0OwogIH0KICBfX25hbWUoY29udGVudEJlZm9yZSwgImNvbnRlbnRCZWZvcmUiKTsKICBmdW5jdGlvbiBjb250ZW50U3RhcnQoY29kZTQpIHsKICAgIHJldHVybiBpbml0aWFsUHJlZml4ID4gMCAmJiBtYXJrZG93blNwYWNlKGNvZGU0KSA/IGZhY3RvcnlTcGFjZShlZmZlY3RzLCBiZWZvcmVDb250ZW50Q2h1bmssICJsaW5lUHJlZml4IiwgaW5pdGlhbFByZWZpeCArIDEpKGNvZGU0KSA6IGJlZm9yZUNvbnRlbnRDaHVuayhjb2RlNCk7CiAgfQogIF9fbmFtZShjb250ZW50U3RhcnQsICJjb250ZW50U3RhcnQiKTsKICBmdW5jdGlvbiBiZWZvcmVDb250ZW50Q2h1bmsoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIHJldHVybiBlZmZlY3RzLmNoZWNrKG5vbkxhenlDb250aW51YXRpb24sIGF0Tm9uTGF6eUJyZWFrLCBhZnRlcikoY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5lbnRlcigiY29kZUZsb3dWYWx1ZSIpOwogICAgcmV0dXJuIGNvbnRlbnRDaHVuayhjb2RlNCk7CiAgfQogIF9fbmFtZShiZWZvcmVDb250ZW50Q2h1bmssICJiZWZvcmVDb250ZW50Q2h1bmsiKTsKICBmdW5jdGlvbiBjb250ZW50Q2h1bmsoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuZXhpdCgiY29kZUZsb3dWYWx1ZSIpOwogICAgICByZXR1cm4gYmVmb3JlQ29udGVudENodW5rKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gY29udGVudENodW5rOwogIH0KICBfX25hbWUoY29udGVudENodW5rLCAiY29udGVudENodW5rIik7CiAgZnVuY3Rpb24gYWZ0ZXIoY29kZTQpIHsKICAgIGVmZmVjdHMuZXhpdCgiY29kZUZlbmNlZCIpOwogICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgfQogIF9fbmFtZShhZnRlciwgImFmdGVyIik7CiAgZnVuY3Rpb24gdG9rZW5pemVDbG9zZVN0YXJ0KGVmZmVjdHMyLCBvazQsIG5vazIpIHsKICAgIGxldCBzaXplID0gMDsKICAgIHJldHVybiBzdGFydEJlZm9yZTsKICAgIGZ1bmN0aW9uIHN0YXJ0QmVmb3JlKGNvZGU0KSB7CiAgICAgIGVmZmVjdHMyLmVudGVyKCJsaW5lRW5kaW5nIik7CiAgICAgIGVmZmVjdHMyLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzMi5leGl0KCJsaW5lRW5kaW5nIik7CiAgICAgIHJldHVybiBzdGFydDI7CiAgICB9CiAgICBfX25hbWUoc3RhcnRCZWZvcmUsICJzdGFydEJlZm9yZSIpOwogICAgZnVuY3Rpb24gc3RhcnQyKGNvZGU0KSB7CiAgICAgIGVmZmVjdHMyLmVudGVyKCJjb2RlRmVuY2VkRmVuY2UiKTsKICAgICAgcmV0dXJuIG1hcmtkb3duU3BhY2UoY29kZTQpID8gZmFjdG9yeVNwYWNlKGVmZmVjdHMyLCBiZWZvcmVTZXF1ZW5jZUNsb3NlLCAibGluZVByZWZpeCIsIHNlbGYyLnBhcnNlci5jb25zdHJ1Y3RzLmRpc2FibGUubnVsbC5pbmNsdWRlcygiY29kZUluZGVudGVkIikgPyB2b2lkIDAgOiA0KShjb2RlNCkgOiBiZWZvcmVTZXF1ZW5jZUNsb3NlKGNvZGU0KTsKICAgIH0KICAgIF9fbmFtZShzdGFydDIsICJzdGFydCIpOwogICAgZnVuY3Rpb24gYmVmb3JlU2VxdWVuY2VDbG9zZShjb2RlNCkgewogICAgICBpZiAoY29kZTQgPT09IG1hcmtlcikgewogICAgICAgIGVmZmVjdHMyLmVudGVyKCJjb2RlRmVuY2VkRmVuY2VTZXF1ZW5jZSIpOwogICAgICAgIHJldHVybiBzZXF1ZW5jZUNsb3NlKGNvZGU0KTsKICAgICAgfQogICAgICByZXR1cm4gbm9rMihjb2RlNCk7CiAgICB9CiAgICBfX25hbWUoYmVmb3JlU2VxdWVuY2VDbG9zZSwgImJlZm9yZVNlcXVlbmNlQ2xvc2UiKTsKICAgIGZ1bmN0aW9uIHNlcXVlbmNlQ2xvc2UoY29kZTQpIHsKICAgICAgaWYgKGNvZGU0ID09PSBtYXJrZXIpIHsKICAgICAgICBzaXplKys7CiAgICAgICAgZWZmZWN0czIuY29uc3VtZShjb2RlNCk7CiAgICAgICAgcmV0dXJuIHNlcXVlbmNlQ2xvc2U7CiAgICAgIH0KICAgICAgaWYgKHNpemUgPj0gc2l6ZU9wZW4pIHsKICAgICAgICBlZmZlY3RzMi5leGl0KCJjb2RlRmVuY2VkRmVuY2VTZXF1ZW5jZSIpOwogICAgICAgIHJldHVybiBtYXJrZG93blNwYWNlKGNvZGU0KSA/IGZhY3RvcnlTcGFjZShlZmZlY3RzMiwgc2VxdWVuY2VDbG9zZUFmdGVyLCAid2hpdGVzcGFjZSIpKGNvZGU0KSA6IHNlcXVlbmNlQ2xvc2VBZnRlcihjb2RlNCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5vazIoY29kZTQpOwogICAgfQogICAgX19uYW1lKHNlcXVlbmNlQ2xvc2UsICJzZXF1ZW5jZUNsb3NlIik7CiAgICBmdW5jdGlvbiBzZXF1ZW5jZUNsb3NlQWZ0ZXIoY29kZTQpIHsKICAgICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgICBlZmZlY3RzMi5leGl0KCJjb2RlRmVuY2VkRmVuY2UiKTsKICAgICAgICByZXR1cm4gb2s0KGNvZGU0KTsKICAgICAgfQogICAgICByZXR1cm4gbm9rMihjb2RlNCk7CiAgICB9CiAgICBfX25hbWUoc2VxdWVuY2VDbG9zZUFmdGVyLCAic2VxdWVuY2VDbG9zZUFmdGVyIik7CiAgfQogIF9fbmFtZSh0b2tlbml6ZUNsb3NlU3RhcnQsICJ0b2tlbml6ZUNsb3NlU3RhcnQiKTsKfQpfX25hbWUodG9rZW5pemVDb2RlRmVuY2VkLCAidG9rZW5pemVDb2RlRmVuY2VkIik7CmZ1bmN0aW9uIHRva2VuaXplTm9uTGF6eUNvbnRpbnVhdGlvbihlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCkgewogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuZW50ZXIoImxpbmVFbmRpbmciKTsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICBlZmZlY3RzLmV4aXQoImxpbmVFbmRpbmciKTsKICAgIHJldHVybiBsaW5lU3RhcnQ7CiAgfQogIF9fbmFtZShzdGFydCwgInN0YXJ0Iik7CiAgZnVuY3Rpb24gbGluZVN0YXJ0KGNvZGU0KSB7CiAgICByZXR1cm4gc2VsZjIucGFyc2VyLmxhenlbc2VsZjIubm93KCkubGluZV0gPyBub2soY29kZTQpIDogb2szKGNvZGU0KTsKICB9CiAgX19uYW1lKGxpbmVTdGFydCwgImxpbmVTdGFydCIpOwp9Cl9fbmFtZSh0b2tlbml6ZU5vbkxhenlDb250aW51YXRpb24sICJ0b2tlbml6ZU5vbkxhenlDb250aW51YXRpb24iKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstY29yZS1jb21tb25tYXJrQDIuMC4zL25vZGVfbW9kdWxlcy9taWNyb21hcmstY29yZS1jb21tb25tYXJrL2xpYi9jb2RlLWluZGVudGVkLmpzCnZhciBjb2RlSW5kZW50ZWQgPSB7CiAgbmFtZTogImNvZGVJbmRlbnRlZCIsCiAgdG9rZW5pemU6IHRva2VuaXplQ29kZUluZGVudGVkCn07CnZhciBmdXJ0aGVyU3RhcnQgPSB7CiAgcGFydGlhbDogdHJ1ZSwKICB0b2tlbml6ZTogdG9rZW5pemVGdXJ0aGVyU3RhcnQKfTsKZnVuY3Rpb24gdG9rZW5pemVDb2RlSW5kZW50ZWQoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJjb2RlSW5kZW50ZWQiKTsKICAgIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgYWZ0ZXJQcmVmaXgsICJsaW5lUHJlZml4IiwgNCArIDEpKGNvZGU0KTsKICB9CiAgX19uYW1lKHN0YXJ0LCAic3RhcnQiKTsKICBmdW5jdGlvbiBhZnRlclByZWZpeChjb2RlNCkgewogICAgY29uc3QgdGFpbCA9IHNlbGYyLmV2ZW50c1tzZWxmMi5ldmVudHMubGVuZ3RoIC0gMV07CiAgICByZXR1cm4gdGFpbCAmJiB0YWlsWzFdLnR5cGUgPT09ICJsaW5lUHJlZml4IiAmJiB0YWlsWzJdLnNsaWNlU2VyaWFsaXplKHRhaWxbMV0sIHRydWUpLmxlbmd0aCA+PSA0ID8gYXRCcmVhayhjb2RlNCkgOiBub2soY29kZTQpOwogIH0KICBfX25hbWUoYWZ0ZXJQcmVmaXgsICJhZnRlclByZWZpeCIpOwogIGZ1bmN0aW9uIGF0QnJlYWsoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCkgewogICAgICByZXR1cm4gYWZ0ZXIoY29kZTQpOwogICAgfQogICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgcmV0dXJuIGVmZmVjdHMuYXR0ZW1wdChmdXJ0aGVyU3RhcnQsIGF0QnJlYWssIGFmdGVyKShjb2RlNCk7CiAgICB9CiAgICBlZmZlY3RzLmVudGVyKCJjb2RlRmxvd1ZhbHVlIik7CiAgICByZXR1cm4gaW5zaWRlKGNvZGU0KTsKICB9CiAgX19uYW1lKGF0QnJlYWssICJhdEJyZWFrIik7CiAgZnVuY3Rpb24gaW5zaWRlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmV4aXQoImNvZGVGbG93VmFsdWUiKTsKICAgICAgcmV0dXJuIGF0QnJlYWsoY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBpbnNpZGU7CiAgfQogIF9fbmFtZShpbnNpZGUsICJpbnNpZGUiKTsKICBmdW5jdGlvbiBhZnRlcihjb2RlNCkgewogICAgZWZmZWN0cy5leGl0KCJjb2RlSW5kZW50ZWQiKTsKICAgIHJldHVybiBvazMoY29kZTQpOwogIH0KICBfX25hbWUoYWZ0ZXIsICJhZnRlciIpOwp9Cl9fbmFtZSh0b2tlbml6ZUNvZGVJbmRlbnRlZCwgInRva2VuaXplQ29kZUluZGVudGVkIik7CmZ1bmN0aW9uIHRva2VuaXplRnVydGhlclN0YXJ0KGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIHJldHVybiBmdXJ0aGVyU3RhcnQyOwogIGZ1bmN0aW9uIGZ1cnRoZXJTdGFydDIoY29kZTQpIHsKICAgIGlmIChzZWxmMi5wYXJzZXIubGF6eVtzZWxmMi5ub3coKS5saW5lXSkgewogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuZW50ZXIoImxpbmVFbmRpbmciKTsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgZWZmZWN0cy5leGl0KCJsaW5lRW5kaW5nIik7CiAgICAgIHJldHVybiBmdXJ0aGVyU3RhcnQyOwogICAgfQogICAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBhZnRlclByZWZpeCwgImxpbmVQcmVmaXgiLCA0ICsgMSkoY29kZTQpOwogIH0KICBfX25hbWUoZnVydGhlclN0YXJ0MiwgImZ1cnRoZXJTdGFydCIpOwogIGZ1bmN0aW9uIGFmdGVyUHJlZml4KGNvZGU0KSB7CiAgICBjb25zdCB0YWlsID0gc2VsZjIuZXZlbnRzW3NlbGYyLmV2ZW50cy5sZW5ndGggLSAxXTsKICAgIHJldHVybiB0YWlsICYmIHRhaWxbMV0udHlwZSA9PT0gImxpbmVQcmVmaXgiICYmIHRhaWxbMl0uc2xpY2VTZXJpYWxpemUodGFpbFsxXSwgdHJ1ZSkubGVuZ3RoID49IDQgPyBvazMoY29kZTQpIDogbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSA/IGZ1cnRoZXJTdGFydDIoY29kZTQpIDogbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKGFmdGVyUHJlZml4LCAiYWZ0ZXJQcmVmaXgiKTsKfQpfX25hbWUodG9rZW5pemVGdXJ0aGVyU3RhcnQsICJ0b2tlbml6ZUZ1cnRoZXJTdGFydCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2NvZGUtdGV4dC5qcwp2YXIgY29kZVRleHQgPSB7CiAgbmFtZTogImNvZGVUZXh0IiwKICBwcmV2aW91czogcHJldmlvdXMyLAogIHJlc29sdmU6IHJlc29sdmVDb2RlVGV4dCwKICB0b2tlbml6ZTogdG9rZW5pemVDb2RlVGV4dAp9OwpmdW5jdGlvbiByZXNvbHZlQ29kZVRleHQoZXZlbnRzKSB7CiAgbGV0IHRhaWxFeGl0SW5kZXggPSBldmVudHMubGVuZ3RoIC0gNDsKICBsZXQgaGVhZEVudGVySW5kZXggPSAzOwogIGxldCBpbmRleDI7CiAgbGV0IGVudGVyOwogIGlmICgoZXZlbnRzW2hlYWRFbnRlckluZGV4XVsxXS50eXBlID09PSAibGluZUVuZGluZyIgfHwgZXZlbnRzW2hlYWRFbnRlckluZGV4XVsxXS50eXBlID09PSAic3BhY2UiKSAmJiAoZXZlbnRzW3RhaWxFeGl0SW5kZXhdWzFdLnR5cGUgPT09ICJsaW5lRW5kaW5nIiB8fCBldmVudHNbdGFpbEV4aXRJbmRleF1bMV0udHlwZSA9PT0gInNwYWNlIikpIHsKICAgIGluZGV4MiA9IGhlYWRFbnRlckluZGV4OwogICAgd2hpbGUgKCsraW5kZXgyIDwgdGFpbEV4aXRJbmRleCkgewogICAgICBpZiAoZXZlbnRzW2luZGV4Ml1bMV0udHlwZSA9PT0gImNvZGVUZXh0RGF0YSIpIHsKICAgICAgICBldmVudHNbaGVhZEVudGVySW5kZXhdWzFdLnR5cGUgPSAiY29kZVRleHRQYWRkaW5nIjsKICAgICAgICBldmVudHNbdGFpbEV4aXRJbmRleF1bMV0udHlwZSA9ICJjb2RlVGV4dFBhZGRpbmciOwogICAgICAgIGhlYWRFbnRlckluZGV4ICs9IDI7CiAgICAgICAgdGFpbEV4aXRJbmRleCAtPSAyOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgfQogIGluZGV4MiA9IGhlYWRFbnRlckluZGV4IC0gMTsKICB0YWlsRXhpdEluZGV4Kys7CiAgd2hpbGUgKCsraW5kZXgyIDw9IHRhaWxFeGl0SW5kZXgpIHsKICAgIGlmIChlbnRlciA9PT0gdm9pZCAwKSB7CiAgICAgIGlmIChpbmRleDIgIT09IHRhaWxFeGl0SW5kZXggJiYgZXZlbnRzW2luZGV4Ml1bMV0udHlwZSAhPT0gImxpbmVFbmRpbmciKSB7CiAgICAgICAgZW50ZXIgPSBpbmRleDI7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoaW5kZXgyID09PSB0YWlsRXhpdEluZGV4IHx8IGV2ZW50c1tpbmRleDJdWzFdLnR5cGUgPT09ICJsaW5lRW5kaW5nIikgewogICAgICBldmVudHNbZW50ZXJdWzFdLnR5cGUgPSAiY29kZVRleHREYXRhIjsKICAgICAgaWYgKGluZGV4MiAhPT0gZW50ZXIgKyAyKSB7CiAgICAgICAgZXZlbnRzW2VudGVyXVsxXS5lbmQgPSBldmVudHNbaW5kZXgyIC0gMV1bMV0uZW5kOwogICAgICAgIGV2ZW50cy5zcGxpY2UoZW50ZXIgKyAyLCBpbmRleDIgLSBlbnRlciAtIDIpOwogICAgICAgIHRhaWxFeGl0SW5kZXggLT0gaW5kZXgyIC0gZW50ZXIgLSAyOwogICAgICAgIGluZGV4MiA9IGVudGVyICsgMjsKICAgICAgfQogICAgICBlbnRlciA9IHZvaWQgMDsKICAgIH0KICB9CiAgcmV0dXJuIGV2ZW50czsKfQpfX25hbWUocmVzb2x2ZUNvZGVUZXh0LCAicmVzb2x2ZUNvZGVUZXh0Iik7CmZ1bmN0aW9uIHByZXZpb3VzMihjb2RlNCkgewogIHJldHVybiBjb2RlNCAhPT0gOTYgfHwgdGhpcy5ldmVudHNbdGhpcy5ldmVudHMubGVuZ3RoIC0gMV1bMV0udHlwZSA9PT0gImNoYXJhY3RlckVzY2FwZSI7Cn0KX19uYW1lKHByZXZpb3VzMiwgInByZXZpb3VzIik7CmZ1bmN0aW9uIHRva2VuaXplQ29kZVRleHQoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgbGV0IHNpemVPcGVuID0gMDsKICBsZXQgc2l6ZTsKICBsZXQgdG9rZW47CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJjb2RlVGV4dCIpOwogICAgZWZmZWN0cy5lbnRlcigiY29kZVRleHRTZXF1ZW5jZSIpOwogICAgcmV0dXJuIHNlcXVlbmNlT3Blbihjb2RlNCk7CiAgfQogIF9fbmFtZShzdGFydCwgInN0YXJ0Iik7CiAgZnVuY3Rpb24gc2VxdWVuY2VPcGVuKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDk2KSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHNpemVPcGVuKys7CiAgICAgIHJldHVybiBzZXF1ZW5jZU9wZW47CiAgICB9CiAgICBlZmZlY3RzLmV4aXQoImNvZGVUZXh0U2VxdWVuY2UiKTsKICAgIHJldHVybiBiZXR3ZWVuMihjb2RlNCk7CiAgfQogIF9fbmFtZShzZXF1ZW5jZU9wZW4sICJzZXF1ZW5jZU9wZW4iKTsKICBmdW5jdGlvbiBiZXR3ZWVuMihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSAzMikgewogICAgICBlZmZlY3RzLmVudGVyKCJzcGFjZSIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoInNwYWNlIik7CiAgICAgIHJldHVybiBiZXR3ZWVuMjsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gOTYpIHsKICAgICAgdG9rZW4gPSBlZmZlY3RzLmVudGVyKCJjb2RlVGV4dFNlcXVlbmNlIik7CiAgICAgIHNpemUgPSAwOwogICAgICByZXR1cm4gc2VxdWVuY2VDbG9zZShjb2RlNCk7CiAgICB9CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmVudGVyKCJsaW5lRW5kaW5nIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgibGluZUVuZGluZyIpOwogICAgICByZXR1cm4gYmV0d2VlbjI7CiAgICB9CiAgICBlZmZlY3RzLmVudGVyKCJjb2RlVGV4dERhdGEiKTsKICAgIHJldHVybiBkYXRhKGNvZGU0KTsKICB9CiAgX19uYW1lKGJldHdlZW4yLCAiYmV0d2VlbiIpOwogIGZ1bmN0aW9uIGRhdGEoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBjb2RlNCA9PT0gMzIgfHwgY29kZTQgPT09IDk2IHx8IG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5leGl0KCJjb2RlVGV4dERhdGEiKTsKICAgICAgcmV0dXJuIGJldHdlZW4yKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gZGF0YTsKICB9CiAgX19uYW1lKGRhdGEsICJkYXRhIik7CiAgZnVuY3Rpb24gc2VxdWVuY2VDbG9zZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA5NikgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBzaXplKys7CiAgICAgIHJldHVybiBzZXF1ZW5jZUNsb3NlOwogICAgfQogICAgaWYgKHNpemUgPT09IHNpemVPcGVuKSB7CiAgICAgIGVmZmVjdHMuZXhpdCgiY29kZVRleHRTZXF1ZW5jZSIpOwogICAgICBlZmZlY3RzLmV4aXQoImNvZGVUZXh0Iik7CiAgICAgIHJldHVybiBvazMoY29kZTQpOwogICAgfQogICAgdG9rZW4udHlwZSA9ICJjb2RlVGV4dERhdGEiOwogICAgcmV0dXJuIGRhdGEoY29kZTQpOwogIH0KICBfX25hbWUoc2VxdWVuY2VDbG9zZSwgInNlcXVlbmNlQ2xvc2UiKTsKfQpfX25hbWUodG9rZW5pemVDb2RlVGV4dCwgInRva2VuaXplQ29kZVRleHQiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstdXRpbC1zdWJ0b2tlbml6ZUAyLjEuMC9ub2RlX21vZHVsZXMvbWljcm9tYXJrLXV0aWwtc3VidG9rZW5pemUvbGliL3NwbGljZS1idWZmZXIuanMKdmFyIFNwbGljZUJ1ZmZlciA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJTcGxpY2VCdWZmZXIiKTsKICB9CiAgLyoqCiAgICogQHBhcmFtIHtSZWFkb25seUFycmF5PFQ+IHwgbnVsbCB8IHVuZGVmaW5lZH0gW2luaXRpYWxdCiAgICogICBJbml0aWFsIGl0ZW1zIChvcHRpb25hbCkuCiAgICogQHJldHVybnMKICAgKiAgIFNwbGljZSBidWZmZXIuCiAgICovCiAgY29uc3RydWN0b3IoaW5pdGlhbCkgewogICAgdGhpcy5sZWZ0ID0gaW5pdGlhbCA/IFsuLi5pbml0aWFsXSA6IFtdOwogICAgdGhpcy5yaWdodCA9IFtdOwogIH0KICAvKioKICAgKiBBcnJheSBhY2Nlc3M7CiAgICogZG9lcyBub3QgbW92ZSB0aGUgY3Vyc29yLgogICAqCiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4CiAgICogICBJbmRleC4KICAgKiBAcmV0dXJuIHtUfQogICAqICAgSXRlbS4KICAgKi8KICBnZXQoaW5kZXgyKSB7CiAgICBpZiAoaW5kZXgyIDwgMCB8fCBpbmRleDIgPj0gdGhpcy5sZWZ0Lmxlbmd0aCArIHRoaXMucmlnaHQubGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCJDYW5ub3QgYWNjZXNzIGluZGV4IGAiICsgaW5kZXgyICsgImAgaW4gYSBzcGxpY2UgYnVmZmVyIG9mIHNpemUgYCIgKyAodGhpcy5sZWZ0Lmxlbmd0aCArIHRoaXMucmlnaHQubGVuZ3RoKSArICJgIik7CiAgICB9CiAgICBpZiAoaW5kZXgyIDwgdGhpcy5sZWZ0Lmxlbmd0aCkgcmV0dXJuIHRoaXMubGVmdFtpbmRleDJdOwogICAgcmV0dXJuIHRoaXMucmlnaHRbdGhpcy5yaWdodC5sZW5ndGggLSBpbmRleDIgKyB0aGlzLmxlZnQubGVuZ3RoIC0gMV07CiAgfQogIC8qKgogICAqIFRoZSBsZW5ndGggb2YgdGhlIHNwbGljZSBidWZmZXIsIG9uZSBncmVhdGVyIHRoYW4gdGhlIGxhcmdlc3QgaW5kZXggaW4gdGhlCiAgICogYXJyYXkuCiAgICovCiAgZ2V0IGxlbmd0aCgpIHsKICAgIHJldHVybiB0aGlzLmxlZnQubGVuZ3RoICsgdGhpcy5yaWdodC5sZW5ndGg7CiAgfQogIC8qKgogICAqIFJlbW92ZSBhbmQgcmV0dXJuIGBsaXN0WzBdYDsKICAgKiBtb3ZlcyB0aGUgY3Vyc29yIHRvIGAwYC4KICAgKgogICAqIEByZXR1cm5zIHtUIHwgdW5kZWZpbmVkfQogICAqICAgSXRlbSwgb3B0aW9uYWwuCiAgICovCiAgc2hpZnQoKSB7CiAgICB0aGlzLnNldEN1cnNvcigwKTsKICAgIHJldHVybiB0aGlzLnJpZ2h0LnBvcCgpOwogIH0KICAvKioKICAgKiBTbGljZSB0aGUgYnVmZmVyIHRvIGdldCBhbiBhcnJheTsKICAgKiBkb2VzIG5vdCBtb3ZlIHRoZSBjdXJzb3IuCiAgICoKICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQKICAgKiAgIFN0YXJ0LgogICAqIEBwYXJhbSB7bnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZH0gW2VuZF0KICAgKiAgIEVuZCAob3B0aW9uYWwpLgogICAqIEByZXR1cm5zIHtBcnJheTxUPn0KICAgKiAgIEFycmF5IG9mIGl0ZW1zLgogICAqLwogIHNsaWNlKHN0YXJ0LCBlbmQpIHsKICAgIGNvbnN0IHN0b3AgPSBlbmQgPT09IG51bGwgfHwgZW5kID09PSB2b2lkIDAgPyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgOiBlbmQ7CiAgICBpZiAoc3RvcCA8IHRoaXMubGVmdC5sZW5ndGgpIHsKICAgICAgcmV0dXJuIHRoaXMubGVmdC5zbGljZShzdGFydCwgc3RvcCk7CiAgICB9CiAgICBpZiAoc3RhcnQgPiB0aGlzLmxlZnQubGVuZ3RoKSB7CiAgICAgIHJldHVybiB0aGlzLnJpZ2h0LnNsaWNlKHRoaXMucmlnaHQubGVuZ3RoIC0gc3RvcCArIHRoaXMubGVmdC5sZW5ndGgsIHRoaXMucmlnaHQubGVuZ3RoIC0gc3RhcnQgKyB0aGlzLmxlZnQubGVuZ3RoKS5yZXZlcnNlKCk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5sZWZ0LnNsaWNlKHN0YXJ0KS5jb25jYXQodGhpcy5yaWdodC5zbGljZSh0aGlzLnJpZ2h0Lmxlbmd0aCAtIHN0b3AgKyB0aGlzLmxlZnQubGVuZ3RoKS5yZXZlcnNlKCkpOwogIH0KICAvKioKICAgKiBNaW1pY3MgdGhlIGJlaGF2aW9yIG9mIEFycmF5LnByb3RvdHlwZS5zcGxpY2UoKSBleGNlcHQgZm9yIHRoZSBjaGFuZ2Ugb2YKICAgKiBpbnRlcmZhY2UgbmVjZXNzYXJ5IHRvIGF2b2lkIHNlZ2ZhdWx0cyB3aGVuIHBhdGNoaW5nIGluIHZlcnkgbGFyZ2UgYXJyYXlzLgogICAqCiAgICogVGhpcyBvcGVyYXRpb24gbW92ZXMgY3Vyc29yIGlzIG1vdmVkIHRvIGBzdGFydGAgYW5kIHJlc3VsdHMgaW4gdGhlIGN1cnNvcgogICAqIHBsYWNlZCBhZnRlciBhbnkgaW5zZXJ0ZWQgaXRlbXMuCiAgICoKICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQKICAgKiAgIFN0YXJ0OwogICAqICAgemVyby1iYXNlZCBpbmRleCBhdCB3aGljaCB0byBzdGFydCBjaGFuZ2luZyB0aGUgYXJyYXk7CiAgICogICBuZWdhdGl2ZSBudW1iZXJzIGNvdW50IGJhY2t3YXJkcyBmcm9tIHRoZSBlbmQgb2YgdGhlIGFycmF5IGFuZCB2YWx1ZXMKICAgKiAgIHRoYXQgYXJlIG91dC1vZiBib3VuZHMgYXJlIGNsYW1wZWQgdG8gdGhlIGFwcHJvcHJpYXRlIGVuZCBvZiB0aGUgYXJyYXkuCiAgICogQHBhcmFtIHtudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkfSBbZGVsZXRlQ291bnQ9MF0KICAgKiAgIERlbGV0ZSBjb3VudCAoZGVmYXVsdDogYDBgKTsKICAgKiAgIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGRlbGV0ZSwgc3RhcnRpbmcgZnJvbSBzdGFydC4KICAgKiBAcGFyYW0ge0FycmF5PFQ+IHwgbnVsbCB8IHVuZGVmaW5lZH0gW2l0ZW1zPVtdXQogICAqICAgSXRlbXMgdG8gaW5jbHVkZSBpbiBwbGFjZSBvZiB0aGUgZGVsZXRlZCBpdGVtcyAoZGVmYXVsdDogYFtdYCkuCiAgICogQHJldHVybiB7QXJyYXk8VD59CiAgICogICBBbnkgcmVtb3ZlZCBpdGVtcy4KICAgKi8KICBzcGxpY2Uoc3RhcnQsIGRlbGV0ZUNvdW50LCBpdGVtcykgewogICAgY29uc3QgY291bnQyID0gZGVsZXRlQ291bnQgfHwgMDsKICAgIHRoaXMuc2V0Q3Vyc29yKE1hdGgudHJ1bmMoc3RhcnQpKTsKICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLnJpZ2h0LnNwbGljZSh0aGlzLnJpZ2h0Lmxlbmd0aCAtIGNvdW50MiwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTsKICAgIGlmIChpdGVtcykgY2h1bmtlZFB1c2godGhpcy5sZWZ0LCBpdGVtcyk7CiAgICByZXR1cm4gcmVtb3ZlZC5yZXZlcnNlKCk7CiAgfQogIC8qKgogICAqIFJlbW92ZSBhbmQgcmV0dXJuIHRoZSBoaWdoZXN0LW51bWJlcmVkIGl0ZW0gaW4gdGhlIGFycmF5LCBzbwogICAqIGBsaXN0W2xpc3QubGVuZ3RoIC0gMV1gOwogICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gYGxlbmd0aGAuCiAgICoKICAgKiBAcmV0dXJucyB7VCB8IHVuZGVmaW5lZH0KICAgKiAgIEl0ZW0sIG9wdGlvbmFsLgogICAqLwogIHBvcCgpIHsKICAgIHRoaXMuc2V0Q3Vyc29yKE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7CiAgICByZXR1cm4gdGhpcy5sZWZ0LnBvcCgpOwogIH0KICAvKioKICAgKiBJbnNlcnRzIGEgc2luZ2xlIGl0ZW0gdG8gdGhlIGhpZ2gtbnVtYmVyZWQgc2lkZSBvZiB0aGUgYXJyYXk7CiAgICogbW92ZXMgdGhlIGN1cnNvciB0byBgbGVuZ3RoYC4KICAgKgogICAqIEBwYXJhbSB7VH0gaXRlbQogICAqICAgSXRlbS4KICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfQogICAqICAgTm90aGluZy4KICAgKi8KICBwdXNoKGl0ZW0pIHsKICAgIHRoaXMuc2V0Q3Vyc29yKE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7CiAgICB0aGlzLmxlZnQucHVzaChpdGVtKTsKICB9CiAgLyoqCiAgICogSW5zZXJ0cyBtYW55IGl0ZW1zIHRvIHRoZSBoaWdoLW51bWJlcmVkIHNpZGUgb2YgdGhlIGFycmF5LgogICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gYGxlbmd0aGAuCiAgICoKICAgKiBAcGFyYW0ge0FycmF5PFQ+fSBpdGVtcwogICAqICAgSXRlbXMuCiAgICogQHJldHVybnMge3VuZGVmaW5lZH0KICAgKiAgIE5vdGhpbmcuCiAgICovCiAgcHVzaE1hbnkoaXRlbXMpIHsKICAgIHRoaXMuc2V0Q3Vyc29yKE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7CiAgICBjaHVua2VkUHVzaCh0aGlzLmxlZnQsIGl0ZW1zKTsKICB9CiAgLyoqCiAgICogSW5zZXJ0cyBhIHNpbmdsZSBpdGVtIHRvIHRoZSBsb3ctbnVtYmVyZWQgc2lkZSBvZiB0aGUgYXJyYXk7CiAgICogTW92ZXMgdGhlIGN1cnNvciB0byBgMGAuCiAgICoKICAgKiBAcGFyYW0ge1R9IGl0ZW0KICAgKiAgIEl0ZW0uCiAgICogQHJldHVybnMge3VuZGVmaW5lZH0KICAgKiAgIE5vdGhpbmcuCiAgICovCiAgdW5zaGlmdChpdGVtKSB7CiAgICB0aGlzLnNldEN1cnNvcigwKTsKICAgIHRoaXMucmlnaHQucHVzaChpdGVtKTsKICB9CiAgLyoqCiAgICogSW5zZXJ0cyBtYW55IGl0ZW1zIHRvIHRoZSBsb3ctbnVtYmVyZWQgc2lkZSBvZiB0aGUgYXJyYXk7CiAgICogbW92ZXMgdGhlIGN1cnNvciB0byBgMGAuCiAgICoKICAgKiBAcGFyYW0ge0FycmF5PFQ+fSBpdGVtcwogICAqICAgSXRlbXMuCiAgICogQHJldHVybnMge3VuZGVmaW5lZH0KICAgKiAgIE5vdGhpbmcuCiAgICovCiAgdW5zaGlmdE1hbnkoaXRlbXMpIHsKICAgIHRoaXMuc2V0Q3Vyc29yKDApOwogICAgY2h1bmtlZFB1c2godGhpcy5yaWdodCwgaXRlbXMucmV2ZXJzZSgpKTsKICB9CiAgLyoqCiAgICogTW92ZSB0aGUgY3Vyc29yIHRvIGEgc3BlY2lmaWMgcG9zaXRpb24gaW4gdGhlIGFycmF5LiBSZXF1aXJlcwogICAqIHRpbWUgcHJvcG9ydGlvbmFsIHRvIHRoZSBkaXN0YW5jZSBtb3ZlZC4KICAgKgogICAqIElmIGBuIDwgMGAsIHRoZSBjdXJzb3Igd2lsbCBlbmQgdXAgYXQgdGhlIGJlZ2lubmluZy4KICAgKiBJZiBgbiA+IGxlbmd0aGAsIHRoZSBjdXJzb3Igd2lsbCBlbmQgdXAgYXQgdGhlIGVuZC4KICAgKgogICAqIEBwYXJhbSB7bnVtYmVyfSBuCiAgICogICBQb3NpdGlvbi4KICAgKiBAcmV0dXJuIHt1bmRlZmluZWR9CiAgICogICBOb3RoaW5nLgogICAqLwogIHNldEN1cnNvcihuMTEpIHsKICAgIGlmIChuMTEgPT09IHRoaXMubGVmdC5sZW5ndGggfHwgbjExID4gdGhpcy5sZWZ0Lmxlbmd0aCAmJiB0aGlzLnJpZ2h0Lmxlbmd0aCA9PT0gMCB8fCBuMTEgPCAwICYmIHRoaXMubGVmdC5sZW5ndGggPT09IDApIHJldHVybjsKICAgIGlmIChuMTEgPCB0aGlzLmxlZnQubGVuZ3RoKSB7CiAgICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLmxlZnQuc3BsaWNlKG4xMSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTsKICAgICAgY2h1bmtlZFB1c2godGhpcy5yaWdodCwgcmVtb3ZlZC5yZXZlcnNlKCkpOwogICAgfSBlbHNlIHsKICAgICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMucmlnaHQuc3BsaWNlKHRoaXMubGVmdC5sZW5ndGggKyB0aGlzLnJpZ2h0Lmxlbmd0aCAtIG4xMSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTsKICAgICAgY2h1bmtlZFB1c2godGhpcy5sZWZ0LCByZW1vdmVkLnJldmVyc2UoKSk7CiAgICB9CiAgfQp9OwpmdW5jdGlvbiBjaHVua2VkUHVzaChsaXN0NSwgcmlnaHQpIHsKICBsZXQgY2h1bmtTdGFydCA9IDA7CiAgaWYgKHJpZ2h0Lmxlbmd0aCA8IDFlNCkgewogICAgbGlzdDUucHVzaCguLi5yaWdodCk7CiAgfSBlbHNlIHsKICAgIHdoaWxlIChjaHVua1N0YXJ0IDwgcmlnaHQubGVuZ3RoKSB7CiAgICAgIGxpc3Q1LnB1c2goLi4ucmlnaHQuc2xpY2UoY2h1bmtTdGFydCwgY2h1bmtTdGFydCArIDFlNCkpOwogICAgICBjaHVua1N0YXJ0ICs9IDFlNDsKICAgIH0KICB9Cn0KX19uYW1lKGNodW5rZWRQdXNoLCAiY2h1bmtlZFB1c2giKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstdXRpbC1zdWJ0b2tlbml6ZUAyLjEuMC9ub2RlX21vZHVsZXMvbWljcm9tYXJrLXV0aWwtc3VidG9rZW5pemUvaW5kZXguanMKZnVuY3Rpb24gc3VidG9rZW5pemUoZXZlbnRzQXJyYXkpIHsKICBjb25zdCBqdW1wcyA9IHt9OwogIGxldCBpbmRleDIgPSAtMTsKICBsZXQgZXZlbnQ7CiAgbGV0IGxpbmVJbmRleDsKICBsZXQgb3RoZXJJbmRleDsKICBsZXQgb3RoZXJFdmVudDsKICBsZXQgcGFyYW1ldGVyczsKICBsZXQgc3ViZXZlbnRzOwogIGxldCBtb3JlOwogIGNvbnN0IGV2ZW50cyA9IG5ldyBTcGxpY2VCdWZmZXIoZXZlbnRzQXJyYXkpOwogIHdoaWxlICgrK2luZGV4MiA8IGV2ZW50cy5sZW5ndGgpIHsKICAgIHdoaWxlIChpbmRleDIgaW4ganVtcHMpIHsKICAgICAgaW5kZXgyID0ganVtcHNbaW5kZXgyXTsKICAgIH0KICAgIGV2ZW50ID0gZXZlbnRzLmdldChpbmRleDIpOwogICAgaWYgKGluZGV4MiAmJiBldmVudFsxXS50eXBlID09PSAiY2h1bmtGbG93IiAmJiBldmVudHMuZ2V0KGluZGV4MiAtIDEpWzFdLnR5cGUgPT09ICJsaXN0SXRlbVByZWZpeCIpIHsKICAgICAgc3ViZXZlbnRzID0gZXZlbnRbMV0uX3Rva2VuaXplci5ldmVudHM7CiAgICAgIG90aGVySW5kZXggPSAwOwogICAgICBpZiAob3RoZXJJbmRleCA8IHN1YmV2ZW50cy5sZW5ndGggJiYgc3ViZXZlbnRzW290aGVySW5kZXhdWzFdLnR5cGUgPT09ICJsaW5lRW5kaW5nQmxhbmsiKSB7CiAgICAgICAgb3RoZXJJbmRleCArPSAyOwogICAgICB9CiAgICAgIGlmIChvdGhlckluZGV4IDwgc3ViZXZlbnRzLmxlbmd0aCAmJiBzdWJldmVudHNbb3RoZXJJbmRleF1bMV0udHlwZSA9PT0gImNvbnRlbnQiKSB7CiAgICAgICAgd2hpbGUgKCsrb3RoZXJJbmRleCA8IHN1YmV2ZW50cy5sZW5ndGgpIHsKICAgICAgICAgIGlmIChzdWJldmVudHNbb3RoZXJJbmRleF1bMV0udHlwZSA9PT0gImNvbnRlbnQiKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHN1YmV2ZW50c1tvdGhlckluZGV4XVsxXS50eXBlID09PSAiY2h1bmtUZXh0IikgewogICAgICAgICAgICBzdWJldmVudHNbb3RoZXJJbmRleF1bMV0uX2lzSW5GaXJzdENvbnRlbnRPZkxpc3RJdGVtID0gdHJ1ZTsKICAgICAgICAgICAgb3RoZXJJbmRleCsrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGV2ZW50WzBdID09PSAiZW50ZXIiKSB7CiAgICAgIGlmIChldmVudFsxXS5jb250ZW50VHlwZSkgewogICAgICAgIE9iamVjdC5hc3NpZ24oanVtcHMsIHN1YmNvbnRlbnQoZXZlbnRzLCBpbmRleDIpKTsKICAgICAgICBpbmRleDIgPSBqdW1wc1tpbmRleDJdOwogICAgICAgIG1vcmUgPSB0cnVlOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGV2ZW50WzFdLl9jb250YWluZXIpIHsKICAgICAgb3RoZXJJbmRleCA9IGluZGV4MjsKICAgICAgbGluZUluZGV4ID0gdm9pZCAwOwogICAgICB3aGlsZSAob3RoZXJJbmRleC0tKSB7CiAgICAgICAgb3RoZXJFdmVudCA9IGV2ZW50cy5nZXQob3RoZXJJbmRleCk7CiAgICAgICAgaWYgKG90aGVyRXZlbnRbMV0udHlwZSA9PT0gImxpbmVFbmRpbmciIHx8IG90aGVyRXZlbnRbMV0udHlwZSA9PT0gImxpbmVFbmRpbmdCbGFuayIpIHsKICAgICAgICAgIGlmIChvdGhlckV2ZW50WzBdID09PSAiZW50ZXIiKSB7CiAgICAgICAgICAgIGlmIChsaW5lSW5kZXgpIHsKICAgICAgICAgICAgICBldmVudHMuZ2V0KGxpbmVJbmRleClbMV0udHlwZSA9ICJsaW5lRW5kaW5nQmxhbmsiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG90aGVyRXZlbnRbMV0udHlwZSA9ICJsaW5lRW5kaW5nIjsKICAgICAgICAgICAgbGluZUluZGV4ID0gb3RoZXJJbmRleDsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKG90aGVyRXZlbnRbMV0udHlwZSA9PT0gImxpbmVQcmVmaXgiIHx8IG90aGVyRXZlbnRbMV0udHlwZSA9PT0gImxpc3RJdGVtSW5kZW50IikgewogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGxpbmVJbmRleCkgewogICAgICAgIGV2ZW50WzFdLmVuZCA9IHsKICAgICAgICAgIC4uLmV2ZW50cy5nZXQobGluZUluZGV4KVsxXS5zdGFydAogICAgICAgIH07CiAgICAgICAgcGFyYW1ldGVycyA9IGV2ZW50cy5zbGljZShsaW5lSW5kZXgsIGluZGV4Mik7CiAgICAgICAgcGFyYW1ldGVycy51bnNoaWZ0KGV2ZW50KTsKICAgICAgICBldmVudHMuc3BsaWNlKGxpbmVJbmRleCwgaW5kZXgyIC0gbGluZUluZGV4ICsgMSwgcGFyYW1ldGVycyk7CiAgICAgIH0KICAgIH0KICB9CiAgc3BsaWNlKGV2ZW50c0FycmF5LCAwLCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksIGV2ZW50cy5zbGljZSgwKSk7CiAgcmV0dXJuICFtb3JlOwp9Cl9fbmFtZShzdWJ0b2tlbml6ZSwgInN1YnRva2VuaXplIik7CmZ1bmN0aW9uIHN1YmNvbnRlbnQoZXZlbnRzLCBldmVudEluZGV4KSB7CiAgY29uc3QgdG9rZW4gPSBldmVudHMuZ2V0KGV2ZW50SW5kZXgpWzFdOwogIGNvbnN0IGNvbnRleHQyID0gZXZlbnRzLmdldChldmVudEluZGV4KVsyXTsKICBsZXQgc3RhcnRQb3NpdGlvbiA9IGV2ZW50SW5kZXggLSAxOwogIGNvbnN0IHN0YXJ0UG9zaXRpb25zID0gW107CiAgbGV0IHRva2VuaXplciA9IHRva2VuLl90b2tlbml6ZXI7CiAgaWYgKCF0b2tlbml6ZXIpIHsKICAgIHRva2VuaXplciA9IGNvbnRleHQyLnBhcnNlclt0b2tlbi5jb250ZW50VHlwZV0odG9rZW4uc3RhcnQpOwogICAgaWYgKHRva2VuLl9jb250ZW50VHlwZVRleHRUcmFpbGluZykgewogICAgICB0b2tlbml6ZXIuX2NvbnRlbnRUeXBlVGV4dFRyYWlsaW5nID0gdHJ1ZTsKICAgIH0KICB9CiAgY29uc3QgY2hpbGRFdmVudHMgPSB0b2tlbml6ZXIuZXZlbnRzOwogIGNvbnN0IGp1bXBzID0gW107CiAgY29uc3QgZ2FwcyA9IHt9OwogIGxldCBzdHJlYW07CiAgbGV0IHByZXZpb3VzMzsKICBsZXQgaW5kZXgyID0gLTE7CiAgbGV0IGN1cnJlbnQgPSB0b2tlbjsKICBsZXQgYWRqdXN0ID0gMDsKICBsZXQgc3RhcnQgPSAwOwogIGNvbnN0IGJyZWFrcyA9IFtzdGFydF07CiAgd2hpbGUgKGN1cnJlbnQpIHsKICAgIHdoaWxlIChldmVudHMuZ2V0KCsrc3RhcnRQb3NpdGlvbilbMV0gIT09IGN1cnJlbnQpIHsKICAgIH0KICAgIHN0YXJ0UG9zaXRpb25zLnB1c2goc3RhcnRQb3NpdGlvbik7CiAgICBpZiAoIWN1cnJlbnQuX3Rva2VuaXplcikgewogICAgICBzdHJlYW0gPSBjb250ZXh0Mi5zbGljZVN0cmVhbShjdXJyZW50KTsKICAgICAgaWYgKCFjdXJyZW50Lm5leHQpIHsKICAgICAgICBzdHJlYW0ucHVzaChudWxsKTsKICAgICAgfQogICAgICBpZiAocHJldmlvdXMzKSB7CiAgICAgICAgdG9rZW5pemVyLmRlZmluZVNraXAoY3VycmVudC5zdGFydCk7CiAgICAgIH0KICAgICAgaWYgKGN1cnJlbnQuX2lzSW5GaXJzdENvbnRlbnRPZkxpc3RJdGVtKSB7CiAgICAgICAgdG9rZW5pemVyLl9nZm1UYXNrbGlzdEZpcnN0Q29udGVudE9mTGlzdEl0ZW0gPSB0cnVlOwogICAgICB9CiAgICAgIHRva2VuaXplci53cml0ZShzdHJlYW0pOwogICAgICBpZiAoY3VycmVudC5faXNJbkZpcnN0Q29udGVudE9mTGlzdEl0ZW0pIHsKICAgICAgICB0b2tlbml6ZXIuX2dmbVRhc2tsaXN0Rmlyc3RDb250ZW50T2ZMaXN0SXRlbSA9IHZvaWQgMDsKICAgICAgfQogICAgfQogICAgcHJldmlvdXMzID0gY3VycmVudDsKICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7CiAgfQogIGN1cnJlbnQgPSB0b2tlbjsKICB3aGlsZSAoKytpbmRleDIgPCBjaGlsZEV2ZW50cy5sZW5ndGgpIHsKICAgIGlmICgKICAgICAgLy8gRmluZCBhIHZvaWQgdG9rZW4gdGhhdCBpbmNsdWRlcyBhIGJyZWFrLgogICAgICBjaGlsZEV2ZW50c1tpbmRleDJdWzBdID09PSAiZXhpdCIgJiYgY2hpbGRFdmVudHNbaW5kZXgyIC0gMV1bMF0gPT09ICJlbnRlciIgJiYgY2hpbGRFdmVudHNbaW5kZXgyXVsxXS50eXBlID09PSBjaGlsZEV2ZW50c1tpbmRleDIgLSAxXVsxXS50eXBlICYmIGNoaWxkRXZlbnRzW2luZGV4Ml1bMV0uc3RhcnQubGluZSAhPT0gY2hpbGRFdmVudHNbaW5kZXgyXVsxXS5lbmQubGluZQogICAgKSB7CiAgICAgIHN0YXJ0ID0gaW5kZXgyICsgMTsKICAgICAgYnJlYWtzLnB1c2goc3RhcnQpOwogICAgICBjdXJyZW50Ll90b2tlbml6ZXIgPSB2b2lkIDA7CiAgICAgIGN1cnJlbnQucHJldmlvdXMgPSB2b2lkIDA7CiAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7CiAgICB9CiAgfQogIHRva2VuaXplci5ldmVudHMgPSBbXTsKICBpZiAoY3VycmVudCkgewogICAgY3VycmVudC5fdG9rZW5pemVyID0gdm9pZCAwOwogICAgY3VycmVudC5wcmV2aW91cyA9IHZvaWQgMDsKICB9IGVsc2UgewogICAgYnJlYWtzLnBvcCgpOwogIH0KICBpbmRleDIgPSBicmVha3MubGVuZ3RoOwogIHdoaWxlIChpbmRleDItLSkgewogICAgY29uc3Qgc2xpY2UgPSBjaGlsZEV2ZW50cy5zbGljZShicmVha3NbaW5kZXgyXSwgYnJlYWtzW2luZGV4MiArIDFdKTsKICAgIGNvbnN0IHN0YXJ0MiA9IHN0YXJ0UG9zaXRpb25zLnBvcCgpOwogICAganVtcHMucHVzaChbc3RhcnQyLCBzdGFydDIgKyBzbGljZS5sZW5ndGggLSAxXSk7CiAgICBldmVudHMuc3BsaWNlKHN0YXJ0MiwgMiwgc2xpY2UpOwogIH0KICBqdW1wcy5yZXZlcnNlKCk7CiAgaW5kZXgyID0gLTE7CiAgd2hpbGUgKCsraW5kZXgyIDwganVtcHMubGVuZ3RoKSB7CiAgICBnYXBzW2FkanVzdCArIGp1bXBzW2luZGV4Ml1bMF1dID0gYWRqdXN0ICsganVtcHNbaW5kZXgyXVsxXTsKICAgIGFkanVzdCArPSBqdW1wc1tpbmRleDJdWzFdIC0ganVtcHNbaW5kZXgyXVswXSAtIDE7CiAgfQogIHJldHVybiBnYXBzOwp9Cl9fbmFtZShzdWJjb250ZW50LCAic3ViY29udGVudCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2NvbnRlbnQuanMKdmFyIGNvbnRlbnQgPSB7CiAgcmVzb2x2ZTogcmVzb2x2ZUNvbnRlbnQsCiAgdG9rZW5pemU6IHRva2VuaXplQ29udGVudAp9Owp2YXIgY29udGludWF0aW9uQ29uc3RydWN0ID0gewogIHBhcnRpYWw6IHRydWUsCiAgdG9rZW5pemU6IHRva2VuaXplQ29udGludWF0aW9uCn07CmZ1bmN0aW9uIHJlc29sdmVDb250ZW50KGV2ZW50cykgewogIHN1YnRva2VuaXplKGV2ZW50cyk7CiAgcmV0dXJuIGV2ZW50czsKfQpfX25hbWUocmVzb2x2ZUNvbnRlbnQsICJyZXNvbHZlQ29udGVudCIpOwpmdW5jdGlvbiB0b2tlbml6ZUNvbnRlbnQoZWZmZWN0cywgb2szKSB7CiAgbGV0IHByZXZpb3VzMzsKICByZXR1cm4gY2h1bmtTdGFydDsKICBmdW5jdGlvbiBjaHVua1N0YXJ0KGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJjb250ZW50Iik7CiAgICBwcmV2aW91czMgPSBlZmZlY3RzLmVudGVyKCJjaHVua0NvbnRlbnQiLCB7CiAgICAgIGNvbnRlbnRUeXBlOiAiY29udGVudCIKICAgIH0pOwogICAgcmV0dXJuIGNodW5rSW5zaWRlKGNvZGU0KTsKICB9CiAgX19uYW1lKGNodW5rU3RhcnQsICJjaHVua1N0YXJ0Iik7CiAgZnVuY3Rpb24gY2h1bmtJbnNpZGUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCkgewogICAgICByZXR1cm4gY29udGVudEVuZChjb2RlNCk7CiAgICB9CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICByZXR1cm4gZWZmZWN0cy5jaGVjayhjb250aW51YXRpb25Db25zdHJ1Y3QsIGNvbnRlbnRDb250aW51ZSwgY29udGVudEVuZCkoY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBjaHVua0luc2lkZTsKICB9CiAgX19uYW1lKGNodW5rSW5zaWRlLCAiY2h1bmtJbnNpZGUiKTsKICBmdW5jdGlvbiBjb250ZW50RW5kKGNvZGU0KSB7CiAgICBlZmZlY3RzLmV4aXQoImNodW5rQ29udGVudCIpOwogICAgZWZmZWN0cy5leGl0KCJjb250ZW50Iik7CiAgICByZXR1cm4gb2szKGNvZGU0KTsKICB9CiAgX19uYW1lKGNvbnRlbnRFbmQsICJjb250ZW50RW5kIik7CiAgZnVuY3Rpb24gY29udGVudENvbnRpbnVlKGNvZGU0KSB7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgZWZmZWN0cy5leGl0KCJjaHVua0NvbnRlbnQiKTsKICAgIHByZXZpb3VzMy5uZXh0ID0gZWZmZWN0cy5lbnRlcigiY2h1bmtDb250ZW50IiwgewogICAgICBjb250ZW50VHlwZTogImNvbnRlbnQiLAogICAgICBwcmV2aW91czogcHJldmlvdXMzCiAgICB9KTsKICAgIHByZXZpb3VzMyA9IHByZXZpb3VzMy5uZXh0OwogICAgcmV0dXJuIGNodW5rSW5zaWRlOwogIH0KICBfX25hbWUoY29udGVudENvbnRpbnVlLCAiY29udGVudENvbnRpbnVlIik7Cn0KX19uYW1lKHRva2VuaXplQ29udGVudCwgInRva2VuaXplQ29udGVudCIpOwpmdW5jdGlvbiB0b2tlbml6ZUNvbnRpbnVhdGlvbihlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICByZXR1cm4gc3RhcnRMb29rYWhlYWQ7CiAgZnVuY3Rpb24gc3RhcnRMb29rYWhlYWQoY29kZTQpIHsKICAgIGVmZmVjdHMuZXhpdCgiY2h1bmtDb250ZW50Iik7CiAgICBlZmZlY3RzLmVudGVyKCJsaW5lRW5kaW5nIik7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgZWZmZWN0cy5leGl0KCJsaW5lRW5kaW5nIik7CiAgICByZXR1cm4gZmFjdG9yeVNwYWNlKGVmZmVjdHMsIHByZWZpeGVkLCAibGluZVByZWZpeCIpOwogIH0KICBfX25hbWUoc3RhcnRMb29rYWhlYWQsICJzdGFydExvb2thaGVhZCIpOwogIGZ1bmN0aW9uIHByZWZpeGVkKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIGNvbnN0IHRhaWwgPSBzZWxmMi5ldmVudHNbc2VsZjIuZXZlbnRzLmxlbmd0aCAtIDFdOwogICAgaWYgKCFzZWxmMi5wYXJzZXIuY29uc3RydWN0cy5kaXNhYmxlLm51bGwuaW5jbHVkZXMoImNvZGVJbmRlbnRlZCIpICYmIHRhaWwgJiYgdGFpbFsxXS50eXBlID09PSAibGluZVByZWZpeCIgJiYgdGFpbFsyXS5zbGljZVNlcmlhbGl6ZSh0YWlsWzFdLCB0cnVlKS5sZW5ndGggPj0gNCkgewogICAgICByZXR1cm4gb2szKGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBlZmZlY3RzLmludGVycnVwdChzZWxmMi5wYXJzZXIuY29uc3RydWN0cy5mbG93LCBub2ssIG9rMykoY29kZTQpOwogIH0KICBfX25hbWUocHJlZml4ZWQsICJwcmVmaXhlZCIpOwp9Cl9fbmFtZSh0b2tlbml6ZUNvbnRpbnVhdGlvbiwgInRva2VuaXplQ29udGludWF0aW9uIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWZhY3RvcnktZGVzdGluYXRpb25AMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1mYWN0b3J5LWRlc3RpbmF0aW9uL2luZGV4LmpzCmZ1bmN0aW9uIGZhY3RvcnlEZXN0aW5hdGlvbihlZmZlY3RzLCBvazMsIG5vaywgdHlwZTUsIGxpdGVyYWxUeXBlLCBsaXRlcmFsTWFya2VyVHlwZSwgcmF3VHlwZSwgc3RyaW5nVHlwZSwgbWF4MykgewogIGNvbnN0IGxpbWl0ID0gbWF4MyB8fCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7CiAgbGV0IGJhbGFuY2UgPSAwOwogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA2MCkgewogICAgICBlZmZlY3RzLmVudGVyKHR5cGU1KTsKICAgICAgZWZmZWN0cy5lbnRlcihsaXRlcmFsVHlwZSk7CiAgICAgIGVmZmVjdHMuZW50ZXIobGl0ZXJhbE1hcmtlclR5cGUpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQobGl0ZXJhbE1hcmtlclR5cGUpOwogICAgICByZXR1cm4gZW5jbG9zZWRCZWZvcmU7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgY29kZTQgPT09IDMyIHx8IGNvZGU0ID09PSA0MSB8fCBhc2NpaUNvbnRyb2woY29kZTQpKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5lbnRlcih0eXBlNSk7CiAgICBlZmZlY3RzLmVudGVyKHJhd1R5cGUpOwogICAgZWZmZWN0cy5lbnRlcihzdHJpbmdUeXBlKTsKICAgIGVmZmVjdHMuZW50ZXIoImNodW5rU3RyaW5nIiwgewogICAgICBjb250ZW50VHlwZTogInN0cmluZyIKICAgIH0pOwogICAgcmV0dXJuIHJhdzIoY29kZTQpOwogIH0KICBfX25hbWUoc3RhcnQsICJzdGFydCIpOwogIGZ1bmN0aW9uIGVuY2xvc2VkQmVmb3JlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDYyKSB7CiAgICAgIGVmZmVjdHMuZW50ZXIobGl0ZXJhbE1hcmtlclR5cGUpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQobGl0ZXJhbE1hcmtlclR5cGUpOwogICAgICBlZmZlY3RzLmV4aXQobGl0ZXJhbFR5cGUpOwogICAgICBlZmZlY3RzLmV4aXQodHlwZTUpOwogICAgICByZXR1cm4gb2szOwogICAgfQogICAgZWZmZWN0cy5lbnRlcihzdHJpbmdUeXBlKTsKICAgIGVmZmVjdHMuZW50ZXIoImNodW5rU3RyaW5nIiwgewogICAgICBjb250ZW50VHlwZTogInN0cmluZyIKICAgIH0pOwogICAgcmV0dXJuIGVuY2xvc2VkKGNvZGU0KTsKICB9CiAgX19uYW1lKGVuY2xvc2VkQmVmb3JlLCAiZW5jbG9zZWRCZWZvcmUiKTsKICBmdW5jdGlvbiBlbmNsb3NlZChjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA2MikgewogICAgICBlZmZlY3RzLmV4aXQoImNodW5rU3RyaW5nIik7CiAgICAgIGVmZmVjdHMuZXhpdChzdHJpbmdUeXBlKTsKICAgICAgcmV0dXJuIGVuY2xvc2VkQmVmb3JlKGNvZGU0KTsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBjb2RlNCA9PT0gNjAgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gY29kZTQgPT09IDkyID8gZW5jbG9zZWRFc2NhcGUgOiBlbmNsb3NlZDsKICB9CiAgX19uYW1lKGVuY2xvc2VkLCAiZW5jbG9zZWQiKTsKICBmdW5jdGlvbiBlbmNsb3NlZEVzY2FwZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA2MCB8fCBjb2RlNCA9PT0gNjIgfHwgY29kZTQgPT09IDkyKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBlbmNsb3NlZDsKICAgIH0KICAgIHJldHVybiBlbmNsb3NlZChjb2RlNCk7CiAgfQogIF9fbmFtZShlbmNsb3NlZEVzY2FwZSwgImVuY2xvc2VkRXNjYXBlIik7CiAgZnVuY3Rpb24gcmF3Mihjb2RlNCkgewogICAgaWYgKCFiYWxhbmNlICYmIChjb2RlNCA9PT0gbnVsbCB8fCBjb2RlNCA9PT0gNDEgfHwgbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlNCkpKSB7CiAgICAgIGVmZmVjdHMuZXhpdCgiY2h1bmtTdHJpbmciKTsKICAgICAgZWZmZWN0cy5leGl0KHN0cmluZ1R5cGUpOwogICAgICBlZmZlY3RzLmV4aXQocmF3VHlwZSk7CiAgICAgIGVmZmVjdHMuZXhpdCh0eXBlNSk7CiAgICAgIHJldHVybiBvazMoY29kZTQpOwogICAgfQogICAgaWYgKGJhbGFuY2UgPCBsaW1pdCAmJiBjb2RlNCA9PT0gNDApIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgYmFsYW5jZSsrOwogICAgICByZXR1cm4gcmF3MjsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gNDEpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgYmFsYW5jZS0tOwogICAgICByZXR1cm4gcmF3MjsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBjb2RlNCA9PT0gMzIgfHwgY29kZTQgPT09IDQwIHx8IGFzY2lpQ29udHJvbChjb2RlNCkpIHsKICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIGNvZGU0ID09PSA5MiA/IHJhd0VzY2FwZSA6IHJhdzI7CiAgfQogIF9fbmFtZShyYXcyLCAicmF3Iik7CiAgZnVuY3Rpb24gcmF3RXNjYXBlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDQwIHx8IGNvZGU0ID09PSA0MSB8fCBjb2RlNCA9PT0gOTIpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHJhdzI7CiAgICB9CiAgICByZXR1cm4gcmF3Mihjb2RlNCk7CiAgfQogIF9fbmFtZShyYXdFc2NhcGUsICJyYXdFc2NhcGUiKTsKfQpfX25hbWUoZmFjdG9yeURlc3RpbmF0aW9uLCAiZmFjdG9yeURlc3RpbmF0aW9uIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWZhY3RvcnktbGFiZWxAMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1mYWN0b3J5LWxhYmVsL2luZGV4LmpzCmZ1bmN0aW9uIGZhY3RvcnlMYWJlbChlZmZlY3RzLCBvazMsIG5vaywgdHlwZTUsIG1hcmtlclR5cGUsIHN0cmluZ1R5cGUpIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgbGV0IHNpemUgPSAwOwogIGxldCBzZWVuOwogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcih0eXBlNSk7CiAgICBlZmZlY3RzLmVudGVyKG1hcmtlclR5cGUpOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIGVmZmVjdHMuZXhpdChtYXJrZXJUeXBlKTsKICAgIGVmZmVjdHMuZW50ZXIoc3RyaW5nVHlwZSk7CiAgICByZXR1cm4gYXRCcmVhazsKICB9CiAgX19uYW1lKHN0YXJ0LCAic3RhcnQiKTsKICBmdW5jdGlvbiBhdEJyZWFrKGNvZGU0KSB7CiAgICBpZiAoc2l6ZSA+IDk5OSB8fCBjb2RlNCA9PT0gbnVsbCB8fCBjb2RlNCA9PT0gOTEgfHwgY29kZTQgPT09IDkzICYmICFzZWVuIHx8IC8vIFRvIGRvOiByZW1vdmUgaW4gdGhlIGZ1dHVyZSBvbmNlIHdl4oCZdmUgc3dpdGNoZWQgZnJvbQogICAgLy8gYG1pY3JvbWFyay1leHRlbnNpb24tZm9vdG5vdGVgIHRvIGBtaWNyb21hcmstZXh0ZW5zaW9uLWdmbS1mb290bm90ZWAsCiAgICAvLyB3aGljaCBkb2VzbuKAmXQgbmVlZCB0aGlzLgogICAgLy8gSGlkZGVuIGZvb3Rub3RlcyBob29rLgogICAgLyogYzggaWdub3JlIG5leHQgMyAqLwogICAgY29kZTQgPT09IDk0ICYmICFzaXplICYmICJfaGlkZGVuRm9vdG5vdGVTdXBwb3J0IiBpbiBzZWxmMi5wYXJzZXIuY29uc3RydWN0cykgewogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gOTMpIHsKICAgICAgZWZmZWN0cy5leGl0KHN0cmluZ1R5cGUpOwogICAgICBlZmZlY3RzLmVudGVyKG1hcmtlclR5cGUpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQobWFya2VyVHlwZSk7CiAgICAgIGVmZmVjdHMuZXhpdCh0eXBlNSk7CiAgICAgIHJldHVybiBvazM7CiAgICB9CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmVudGVyKCJsaW5lRW5kaW5nIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgibGluZUVuZGluZyIpOwogICAgICByZXR1cm4gYXRCcmVhazsKICAgIH0KICAgIGVmZmVjdHMuZW50ZXIoImNodW5rU3RyaW5nIiwgewogICAgICBjb250ZW50VHlwZTogInN0cmluZyIKICAgIH0pOwogICAgcmV0dXJuIGxhYmVsSW5zaWRlKGNvZGU0KTsKICB9CiAgX19uYW1lKGF0QnJlYWssICJhdEJyZWFrIik7CiAgZnVuY3Rpb24gbGFiZWxJbnNpZGUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBjb2RlNCA9PT0gOTEgfHwgY29kZTQgPT09IDkzIHx8IG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkgfHwgc2l6ZSsrID4gOTk5KSB7CiAgICAgIGVmZmVjdHMuZXhpdCgiY2h1bmtTdHJpbmciKTsKICAgICAgcmV0dXJuIGF0QnJlYWsoY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIGlmICghc2Vlbikgc2VlbiA9ICFtYXJrZG93blNwYWNlKGNvZGU0KTsKICAgIHJldHVybiBjb2RlNCA9PT0gOTIgPyBsYWJlbEVzY2FwZSA6IGxhYmVsSW5zaWRlOwogIH0KICBfX25hbWUobGFiZWxJbnNpZGUsICJsYWJlbEluc2lkZSIpOwogIGZ1bmN0aW9uIGxhYmVsRXNjYXBlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDkxIHx8IGNvZGU0ID09PSA5MiB8fCBjb2RlNCA9PT0gOTMpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgc2l6ZSsrOwogICAgICByZXR1cm4gbGFiZWxJbnNpZGU7CiAgICB9CiAgICByZXR1cm4gbGFiZWxJbnNpZGUoY29kZTQpOwogIH0KICBfX25hbWUobGFiZWxFc2NhcGUsICJsYWJlbEVzY2FwZSIpOwp9Cl9fbmFtZShmYWN0b3J5TGFiZWwsICJmYWN0b3J5TGFiZWwiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZmFjdG9yeS10aXRsZUAyLjAuMS9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWZhY3RvcnktdGl0bGUvaW5kZXguanMKZnVuY3Rpb24gZmFjdG9yeVRpdGxlKGVmZmVjdHMsIG9rMywgbm9rLCB0eXBlNSwgbWFya2VyVHlwZSwgc3RyaW5nVHlwZSkgewogIGxldCBtYXJrZXI7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDM0IHx8IGNvZGU0ID09PSAzOSB8fCBjb2RlNCA9PT0gNDApIHsKICAgICAgZWZmZWN0cy5lbnRlcih0eXBlNSk7CiAgICAgIGVmZmVjdHMuZW50ZXIobWFya2VyVHlwZSk7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdChtYXJrZXJUeXBlKTsKICAgICAgbWFya2VyID0gY29kZTQgPT09IDQwID8gNDEgOiBjb2RlNDsKICAgICAgcmV0dXJuIGJlZ2luOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZShzdGFydCwgInN0YXJ0Iik7CiAgZnVuY3Rpb24gYmVnaW4oY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbWFya2VyKSB7CiAgICAgIGVmZmVjdHMuZW50ZXIobWFya2VyVHlwZSk7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdChtYXJrZXJUeXBlKTsKICAgICAgZWZmZWN0cy5leGl0KHR5cGU1KTsKICAgICAgcmV0dXJuIG9rMzsKICAgIH0KICAgIGVmZmVjdHMuZW50ZXIoc3RyaW5nVHlwZSk7CiAgICByZXR1cm4gYXRCcmVhayhjb2RlNCk7CiAgfQogIF9fbmFtZShiZWdpbiwgImJlZ2luIik7CiAgZnVuY3Rpb24gYXRCcmVhayhjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBtYXJrZXIpIHsKICAgICAgZWZmZWN0cy5leGl0KHN0cmluZ1R5cGUpOwogICAgICByZXR1cm4gYmVnaW4obWFya2VyKTsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gbnVsbCkgewogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuZW50ZXIoImxpbmVFbmRpbmciKTsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgZWZmZWN0cy5leGl0KCJsaW5lRW5kaW5nIik7CiAgICAgIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgYXRCcmVhaywgImxpbmVQcmVmaXgiKTsKICAgIH0KICAgIGVmZmVjdHMuZW50ZXIoImNodW5rU3RyaW5nIiwgewogICAgICBjb250ZW50VHlwZTogInN0cmluZyIKICAgIH0pOwogICAgcmV0dXJuIGluc2lkZShjb2RlNCk7CiAgfQogIF9fbmFtZShhdEJyZWFrLCAiYXRCcmVhayIpOwogIGZ1bmN0aW9uIGluc2lkZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBtYXJrZXIgfHwgY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmV4aXQoImNodW5rU3RyaW5nIik7CiAgICAgIHJldHVybiBhdEJyZWFrKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gY29kZTQgPT09IDkyID8gZXNjYXBlIDogaW5zaWRlOwogIH0KICBfX25hbWUoaW5zaWRlLCAiaW5zaWRlIik7CiAgZnVuY3Rpb24gZXNjYXBlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG1hcmtlciB8fCBjb2RlNCA9PT0gOTIpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGluc2lkZTsKICAgIH0KICAgIHJldHVybiBpbnNpZGUoY29kZTQpOwogIH0KICBfX25hbWUoZXNjYXBlLCAiZXNjYXBlIik7Cn0KX19uYW1lKGZhY3RvcnlUaXRsZSwgImZhY3RvcnlUaXRsZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1mYWN0b3J5LXdoaXRlc3BhY2VAMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1mYWN0b3J5LXdoaXRlc3BhY2UvaW5kZXguanMKZnVuY3Rpb24gZmFjdG9yeVdoaXRlc3BhY2UoZWZmZWN0cywgb2szKSB7CiAgbGV0IHNlZW47CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmVudGVyKCJsaW5lRW5kaW5nIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgibGluZUVuZGluZyIpOwogICAgICBzZWVuID0gdHJ1ZTsKICAgICAgcmV0dXJuIHN0YXJ0OwogICAgfQogICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZTQpKSB7CiAgICAgIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgc3RhcnQsIHNlZW4gPyAibGluZVByZWZpeCIgOiAibGluZVN1ZmZpeCIpKGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBvazMoY29kZTQpOwogIH0KICBfX25hbWUoc3RhcnQsICJzdGFydCIpOwp9Cl9fbmFtZShmYWN0b3J5V2hpdGVzcGFjZSwgImZhY3RvcnlXaGl0ZXNwYWNlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvZGVmaW5pdGlvbi5qcwp2YXIgZGVmaW5pdGlvbjIgPSB7CiAgbmFtZTogImRlZmluaXRpb24iLAogIHRva2VuaXplOiB0b2tlbml6ZURlZmluaXRpb24KfTsKdmFyIHRpdGxlQmVmb3JlID0gewogIHBhcnRpYWw6IHRydWUsCiAgdG9rZW5pemU6IHRva2VuaXplVGl0bGVCZWZvcmUKfTsKZnVuY3Rpb24gdG9rZW5pemVEZWZpbml0aW9uKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIGxldCBpZGVudGlmaWVyOwogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigiZGVmaW5pdGlvbiIpOwogICAgcmV0dXJuIGJlZm9yZShjb2RlNCk7CiAgfQogIF9fbmFtZShzdGFydCwgInN0YXJ0Iik7CiAgZnVuY3Rpb24gYmVmb3JlKGNvZGU0KSB7CiAgICByZXR1cm4gZmFjdG9yeUxhYmVsLmNhbGwoCiAgICAgIHNlbGYyLAogICAgICBlZmZlY3RzLAogICAgICBsYWJlbEFmdGVyLAogICAgICAvLyBOb3RlOiB3ZSBkb27igJl0IG5lZWQgdG8gcmVzZXQgdGhlIHdheSBgbWFya2Rvd24tcnNgIGRvZXMuCiAgICAgIG5vaywKICAgICAgImRlZmluaXRpb25MYWJlbCIsCiAgICAgICJkZWZpbml0aW9uTGFiZWxNYXJrZXIiLAogICAgICAiZGVmaW5pdGlvbkxhYmVsU3RyaW5nIgogICAgKShjb2RlNCk7CiAgfQogIF9fbmFtZShiZWZvcmUsICJiZWZvcmUiKTsKICBmdW5jdGlvbiBsYWJlbEFmdGVyKGNvZGU0KSB7CiAgICBpZGVudGlmaWVyID0gbm9ybWFsaXplSWRlbnRpZmllcihzZWxmMi5zbGljZVNlcmlhbGl6ZShzZWxmMi5ldmVudHNbc2VsZjIuZXZlbnRzLmxlbmd0aCAtIDFdWzFdKS5zbGljZSgxLCAtMSkpOwogICAgaWYgKGNvZGU0ID09PSA1OCkgewogICAgICBlZmZlY3RzLmVudGVyKCJkZWZpbml0aW9uTWFya2VyIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgiZGVmaW5pdGlvbk1hcmtlciIpOwogICAgICByZXR1cm4gbWFya2VyQWZ0ZXI7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKGxhYmVsQWZ0ZXIsICJsYWJlbEFmdGVyIik7CiAgZnVuY3Rpb24gbWFya2VyQWZ0ZXIoY29kZTQpIHsKICAgIHJldHVybiBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlKGNvZGU0KSA/IGZhY3RvcnlXaGl0ZXNwYWNlKGVmZmVjdHMsIGRlc3RpbmF0aW9uQmVmb3JlKShjb2RlNCkgOiBkZXN0aW5hdGlvbkJlZm9yZShjb2RlNCk7CiAgfQogIF9fbmFtZShtYXJrZXJBZnRlciwgIm1hcmtlckFmdGVyIik7CiAgZnVuY3Rpb24gZGVzdGluYXRpb25CZWZvcmUoY29kZTQpIHsKICAgIHJldHVybiBmYWN0b3J5RGVzdGluYXRpb24oCiAgICAgIGVmZmVjdHMsCiAgICAgIGRlc3RpbmF0aW9uQWZ0ZXIsCiAgICAgIC8vIE5vdGU6IHdlIGRvbuKAmXQgbmVlZCB0byByZXNldCB0aGUgd2F5IGBtYXJrZG93bi1yc2AgZG9lcy4KICAgICAgbm9rLAogICAgICAiZGVmaW5pdGlvbkRlc3RpbmF0aW9uIiwKICAgICAgImRlZmluaXRpb25EZXN0aW5hdGlvbkxpdGVyYWwiLAogICAgICAiZGVmaW5pdGlvbkRlc3RpbmF0aW9uTGl0ZXJhbE1hcmtlciIsCiAgICAgICJkZWZpbml0aW9uRGVzdGluYXRpb25SYXciLAogICAgICAiZGVmaW5pdGlvbkRlc3RpbmF0aW9uU3RyaW5nIgogICAgKShjb2RlNCk7CiAgfQogIF9fbmFtZShkZXN0aW5hdGlvbkJlZm9yZSwgImRlc3RpbmF0aW9uQmVmb3JlIik7CiAgZnVuY3Rpb24gZGVzdGluYXRpb25BZnRlcihjb2RlNCkgewogICAgcmV0dXJuIGVmZmVjdHMuYXR0ZW1wdCh0aXRsZUJlZm9yZSwgYWZ0ZXIsIGFmdGVyKShjb2RlNCk7CiAgfQogIF9fbmFtZShkZXN0aW5hdGlvbkFmdGVyLCAiZGVzdGluYXRpb25BZnRlciIpOwogIGZ1bmN0aW9uIGFmdGVyKGNvZGU0KSB7CiAgICByZXR1cm4gbWFya2Rvd25TcGFjZShjb2RlNCkgPyBmYWN0b3J5U3BhY2UoZWZmZWN0cywgYWZ0ZXJXaGl0ZXNwYWNlLCAid2hpdGVzcGFjZSIpKGNvZGU0KSA6IGFmdGVyV2hpdGVzcGFjZShjb2RlNCk7CiAgfQogIF9fbmFtZShhZnRlciwgImFmdGVyIik7CiAgZnVuY3Rpb24gYWZ0ZXJXaGl0ZXNwYWNlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmV4aXQoImRlZmluaXRpb24iKTsKICAgICAgc2VsZjIucGFyc2VyLmRlZmluZWQucHVzaChpZGVudGlmaWVyKTsKICAgICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKGFmdGVyV2hpdGVzcGFjZSwgImFmdGVyV2hpdGVzcGFjZSIpOwp9Cl9fbmFtZSh0b2tlbml6ZURlZmluaXRpb24sICJ0b2tlbml6ZURlZmluaXRpb24iKTsKZnVuY3Rpb24gdG9rZW5pemVUaXRsZUJlZm9yZShlZmZlY3RzLCBvazMsIG5vaykgewogIHJldHVybiB0aXRsZUJlZm9yZTI7CiAgZnVuY3Rpb24gdGl0bGVCZWZvcmUyKGNvZGU0KSB7CiAgICByZXR1cm4gbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlNCkgPyBmYWN0b3J5V2hpdGVzcGFjZShlZmZlY3RzLCBiZWZvcmVNYXJrZXIpKGNvZGU0KSA6IG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZSh0aXRsZUJlZm9yZTIsICJ0aXRsZUJlZm9yZSIpOwogIGZ1bmN0aW9uIGJlZm9yZU1hcmtlcihjb2RlNCkgewogICAgcmV0dXJuIGZhY3RvcnlUaXRsZShlZmZlY3RzLCB0aXRsZUFmdGVyLCBub2ssICJkZWZpbml0aW9uVGl0bGUiLCAiZGVmaW5pdGlvblRpdGxlTWFya2VyIiwgImRlZmluaXRpb25UaXRsZVN0cmluZyIpKGNvZGU0KTsKICB9CiAgX19uYW1lKGJlZm9yZU1hcmtlciwgImJlZm9yZU1hcmtlciIpOwogIGZ1bmN0aW9uIHRpdGxlQWZ0ZXIoY29kZTQpIHsKICAgIHJldHVybiBtYXJrZG93blNwYWNlKGNvZGU0KSA/IGZhY3RvcnlTcGFjZShlZmZlY3RzLCB0aXRsZUFmdGVyT3B0aW9uYWxXaGl0ZXNwYWNlLCAid2hpdGVzcGFjZSIpKGNvZGU0KSA6IHRpdGxlQWZ0ZXJPcHRpb25hbFdoaXRlc3BhY2UoY29kZTQpOwogIH0KICBfX25hbWUodGl0bGVBZnRlciwgInRpdGxlQWZ0ZXIiKTsKICBmdW5jdGlvbiB0aXRsZUFmdGVyT3B0aW9uYWxXaGl0ZXNwYWNlKGNvZGU0KSB7CiAgICByZXR1cm4gY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSA/IG9rMyhjb2RlNCkgOiBub2soY29kZTQpOwogIH0KICBfX25hbWUodGl0bGVBZnRlck9wdGlvbmFsV2hpdGVzcGFjZSwgInRpdGxlQWZ0ZXJPcHRpb25hbFdoaXRlc3BhY2UiKTsKfQpfX25hbWUodG9rZW5pemVUaXRsZUJlZm9yZSwgInRva2VuaXplVGl0bGVCZWZvcmUiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstY29yZS1jb21tb25tYXJrQDIuMC4zL25vZGVfbW9kdWxlcy9taWNyb21hcmstY29yZS1jb21tb25tYXJrL2xpYi9oYXJkLWJyZWFrLWVzY2FwZS5qcwp2YXIgaGFyZEJyZWFrRXNjYXBlID0gewogIG5hbWU6ICJoYXJkQnJlYWtFc2NhcGUiLAogIHRva2VuaXplOiB0b2tlbml6ZUhhcmRCcmVha0VzY2FwZQp9OwpmdW5jdGlvbiB0b2tlbml6ZUhhcmRCcmVha0VzY2FwZShlZmZlY3RzLCBvazMsIG5vaykgewogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigiaGFyZEJyZWFrRXNjYXBlIik7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIGFmdGVyOwogIH0KICBfX25hbWUoc3RhcnQsICJzdGFydCIpOwogIGZ1bmN0aW9uIGFmdGVyKGNvZGU0KSB7CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmV4aXQoImhhcmRCcmVha0VzY2FwZSIpOwogICAgICByZXR1cm4gb2szKGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBfX25hbWUoYWZ0ZXIsICJhZnRlciIpOwp9Cl9fbmFtZSh0b2tlbml6ZUhhcmRCcmVha0VzY2FwZSwgInRva2VuaXplSGFyZEJyZWFrRXNjYXBlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvaGVhZGluZy1hdHguanMKdmFyIGhlYWRpbmdBdHggPSB7CiAgbmFtZTogImhlYWRpbmdBdHgiLAogIHJlc29sdmU6IHJlc29sdmVIZWFkaW5nQXR4LAogIHRva2VuaXplOiB0b2tlbml6ZUhlYWRpbmdBdHgKfTsKZnVuY3Rpb24gcmVzb2x2ZUhlYWRpbmdBdHgoZXZlbnRzLCBjb250ZXh0MikgewogIGxldCBjb250ZW50RW5kID0gZXZlbnRzLmxlbmd0aCAtIDI7CiAgbGV0IGNvbnRlbnRTdGFydCA9IDM7CiAgbGV0IGNvbnRlbnQzOwogIGxldCB0ZXh0ODsKICBpZiAoZXZlbnRzW2NvbnRlbnRTdGFydF1bMV0udHlwZSA9PT0gIndoaXRlc3BhY2UiKSB7CiAgICBjb250ZW50U3RhcnQgKz0gMjsKICB9CiAgaWYgKGNvbnRlbnRFbmQgLSAyID4gY29udGVudFN0YXJ0ICYmIGV2ZW50c1tjb250ZW50RW5kXVsxXS50eXBlID09PSAid2hpdGVzcGFjZSIpIHsKICAgIGNvbnRlbnRFbmQgLT0gMjsKICB9CiAgaWYgKGV2ZW50c1tjb250ZW50RW5kXVsxXS50eXBlID09PSAiYXR4SGVhZGluZ1NlcXVlbmNlIiAmJiAoY29udGVudFN0YXJ0ID09PSBjb250ZW50RW5kIC0gMSB8fCBjb250ZW50RW5kIC0gNCA+IGNvbnRlbnRTdGFydCAmJiBldmVudHNbY29udGVudEVuZCAtIDJdWzFdLnR5cGUgPT09ICJ3aGl0ZXNwYWNlIikpIHsKICAgIGNvbnRlbnRFbmQgLT0gY29udGVudFN0YXJ0ICsgMSA9PT0gY29udGVudEVuZCA/IDIgOiA0OwogIH0KICBpZiAoY29udGVudEVuZCA+IGNvbnRlbnRTdGFydCkgewogICAgY29udGVudDMgPSB7CiAgICAgIHR5cGU6ICJhdHhIZWFkaW5nVGV4dCIsCiAgICAgIHN0YXJ0OiBldmVudHNbY29udGVudFN0YXJ0XVsxXS5zdGFydCwKICAgICAgZW5kOiBldmVudHNbY29udGVudEVuZF1bMV0uZW5kCiAgICB9OwogICAgdGV4dDggPSB7CiAgICAgIHR5cGU6ICJjaHVua1RleHQiLAogICAgICBzdGFydDogZXZlbnRzW2NvbnRlbnRTdGFydF1bMV0uc3RhcnQsCiAgICAgIGVuZDogZXZlbnRzW2NvbnRlbnRFbmRdWzFdLmVuZCwKICAgICAgY29udGVudFR5cGU6ICJ0ZXh0IgogICAgfTsKICAgIHNwbGljZShldmVudHMsIGNvbnRlbnRTdGFydCwgY29udGVudEVuZCAtIGNvbnRlbnRTdGFydCArIDEsIFtbImVudGVyIiwgY29udGVudDMsIGNvbnRleHQyXSwgWyJlbnRlciIsIHRleHQ4LCBjb250ZXh0Ml0sIFsiZXhpdCIsIHRleHQ4LCBjb250ZXh0Ml0sIFsiZXhpdCIsIGNvbnRlbnQzLCBjb250ZXh0Ml1dKTsKICB9CiAgcmV0dXJuIGV2ZW50czsKfQpfX25hbWUocmVzb2x2ZUhlYWRpbmdBdHgsICJyZXNvbHZlSGVhZGluZ0F0eCIpOwpmdW5jdGlvbiB0b2tlbml6ZUhlYWRpbmdBdHgoZWZmZWN0cywgb2szLCBub2spIHsKICBsZXQgc2l6ZSA9IDA7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJhdHhIZWFkaW5nIik7CiAgICByZXR1cm4gYmVmb3JlKGNvZGU0KTsKICB9CiAgX19uYW1lKHN0YXJ0LCAic3RhcnQiKTsKICBmdW5jdGlvbiBiZWZvcmUoY29kZTQpIHsKICAgIGVmZmVjdHMuZW50ZXIoImF0eEhlYWRpbmdTZXF1ZW5jZSIpOwogICAgcmV0dXJuIHNlcXVlbmNlT3Blbihjb2RlNCk7CiAgfQogIF9fbmFtZShiZWZvcmUsICJiZWZvcmUiKTsKICBmdW5jdGlvbiBzZXF1ZW5jZU9wZW4oY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gMzUgJiYgc2l6ZSsrIDwgNikgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gc2VxdWVuY2VPcGVuOwogICAgfQogICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuZXhpdCgiYXR4SGVhZGluZ1NlcXVlbmNlIik7CiAgICAgIHJldHVybiBhdEJyZWFrKGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBfX25hbWUoc2VxdWVuY2VPcGVuLCAic2VxdWVuY2VPcGVuIik7CiAgZnVuY3Rpb24gYXRCcmVhayhjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSAzNSkgewogICAgICBlZmZlY3RzLmVudGVyKCJhdHhIZWFkaW5nU2VxdWVuY2UiKTsKICAgICAgcmV0dXJuIHNlcXVlbmNlRnVydGhlcihjb2RlNCk7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmV4aXQoImF0eEhlYWRpbmciKTsKICAgICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgICB9CiAgICBpZiAobWFya2Rvd25TcGFjZShjb2RlNCkpIHsKICAgICAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBhdEJyZWFrLCAid2hpdGVzcGFjZSIpKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuZW50ZXIoImF0eEhlYWRpbmdUZXh0Iik7CiAgICByZXR1cm4gZGF0YShjb2RlNCk7CiAgfQogIF9fbmFtZShhdEJyZWFrLCAiYXRCcmVhayIpOwogIGZ1bmN0aW9uIHNlcXVlbmNlRnVydGhlcihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSAzNSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gc2VxdWVuY2VGdXJ0aGVyOwogICAgfQogICAgZWZmZWN0cy5leGl0KCJhdHhIZWFkaW5nU2VxdWVuY2UiKTsKICAgIHJldHVybiBhdEJyZWFrKGNvZGU0KTsKICB9CiAgX19uYW1lKHNlcXVlbmNlRnVydGhlciwgInNlcXVlbmNlRnVydGhlciIpOwogIGZ1bmN0aW9uIGRhdGEoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBjb2RlNCA9PT0gMzUgfHwgbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5leGl0KCJhdHhIZWFkaW5nVGV4dCIpOwogICAgICByZXR1cm4gYXRCcmVhayhjb2RlNCk7CiAgICB9CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIGRhdGE7CiAgfQogIF9fbmFtZShkYXRhLCAiZGF0YSIpOwp9Cl9fbmFtZSh0b2tlbml6ZUhlYWRpbmdBdHgsICJ0b2tlbml6ZUhlYWRpbmdBdHgiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstdXRpbC1odG1sLXRhZy1uYW1lQDIuMC4xL25vZGVfbW9kdWxlcy9taWNyb21hcmstdXRpbC1odG1sLXRhZy1uYW1lL2luZGV4LmpzCnZhciBodG1sQmxvY2tOYW1lcyA9IFsKICAiYWRkcmVzcyIsCiAgImFydGljbGUiLAogICJhc2lkZSIsCiAgImJhc2UiLAogICJiYXNlZm9udCIsCiAgImJsb2NrcXVvdGUiLAogICJib2R5IiwKICAiY2FwdGlvbiIsCiAgImNlbnRlciIsCiAgImNvbCIsCiAgImNvbGdyb3VwIiwKICAiZGQiLAogICJkZXRhaWxzIiwKICAiZGlhbG9nIiwKICAiZGlyIiwKICAiZGl2IiwKICAiZGwiLAogICJkdCIsCiAgImZpZWxkc2V0IiwKICAiZmlnY2FwdGlvbiIsCiAgImZpZ3VyZSIsCiAgImZvb3RlciIsCiAgImZvcm0iLAogICJmcmFtZSIsCiAgImZyYW1lc2V0IiwKICAiaDEiLAogICJoMiIsCiAgImgzIiwKICAiaDQiLAogICJoNSIsCiAgImg2IiwKICAiaGVhZCIsCiAgImhlYWRlciIsCiAgImhyIiwKICAiaHRtbCIsCiAgImlmcmFtZSIsCiAgImxlZ2VuZCIsCiAgImxpIiwKICAibGluayIsCiAgIm1haW4iLAogICJtZW51IiwKICAibWVudWl0ZW0iLAogICJuYXYiLAogICJub2ZyYW1lcyIsCiAgIm9sIiwKICAib3B0Z3JvdXAiLAogICJvcHRpb24iLAogICJwIiwKICAicGFyYW0iLAogICJzZWFyY2giLAogICJzZWN0aW9uIiwKICAic3VtbWFyeSIsCiAgInRhYmxlIiwKICAidGJvZHkiLAogICJ0ZCIsCiAgInRmb290IiwKICAidGgiLAogICJ0aGVhZCIsCiAgInRpdGxlIiwKICAidHIiLAogICJ0cmFjayIsCiAgInVsIgpdOwp2YXIgaHRtbFJhd05hbWVzID0gWyJwcmUiLCAic2NyaXB0IiwgInN0eWxlIiwgInRleHRhcmVhIl07CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvaHRtbC1mbG93LmpzCnZhciBodG1sRmxvdyA9IHsKICBjb25jcmV0ZTogdHJ1ZSwKICBuYW1lOiAiaHRtbEZsb3ciLAogIHJlc29sdmVUbzogcmVzb2x2ZVRvSHRtbEZsb3csCiAgdG9rZW5pemU6IHRva2VuaXplSHRtbEZsb3cKfTsKdmFyIGJsYW5rTGluZUJlZm9yZSA9IHsKICBwYXJ0aWFsOiB0cnVlLAogIHRva2VuaXplOiB0b2tlbml6ZUJsYW5rTGluZUJlZm9yZQp9Owp2YXIgbm9uTGF6eUNvbnRpbnVhdGlvblN0YXJ0ID0gewogIHBhcnRpYWw6IHRydWUsCiAgdG9rZW5pemU6IHRva2VuaXplTm9uTGF6eUNvbnRpbnVhdGlvblN0YXJ0Cn07CmZ1bmN0aW9uIHJlc29sdmVUb0h0bWxGbG93KGV2ZW50cykgewogIGxldCBpbmRleDIgPSBldmVudHMubGVuZ3RoOwogIHdoaWxlIChpbmRleDItLSkgewogICAgaWYgKGV2ZW50c1tpbmRleDJdWzBdID09PSAiZW50ZXIiICYmIGV2ZW50c1tpbmRleDJdWzFdLnR5cGUgPT09ICJodG1sRmxvdyIpIHsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIGlmIChpbmRleDIgPiAxICYmIGV2ZW50c1tpbmRleDIgLSAyXVsxXS50eXBlID09PSAibGluZVByZWZpeCIpIHsKICAgIGV2ZW50c1tpbmRleDJdWzFdLnN0YXJ0ID0gZXZlbnRzW2luZGV4MiAtIDJdWzFdLnN0YXJ0OwogICAgZXZlbnRzW2luZGV4MiArIDFdWzFdLnN0YXJ0ID0gZXZlbnRzW2luZGV4MiAtIDJdWzFdLnN0YXJ0OwogICAgZXZlbnRzLnNwbGljZShpbmRleDIgLSAyLCAyKTsKICB9CiAgcmV0dXJuIGV2ZW50czsKfQpfX25hbWUocmVzb2x2ZVRvSHRtbEZsb3csICJyZXNvbHZlVG9IdG1sRmxvdyIpOwpmdW5jdGlvbiB0b2tlbml6ZUh0bWxGbG93KGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIGxldCBtYXJrZXI7CiAgbGV0IGNsb3NpbmdUYWc7CiAgbGV0IGJ1ZmZlcjI7CiAgbGV0IGluZGV4MjsKICBsZXQgbWFya2VyQjsKICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIHJldHVybiBiZWZvcmUoY29kZTQpOwogIH0KICBfX25hbWUoc3RhcnQsICJzdGFydCIpOwogIGZ1bmN0aW9uIGJlZm9yZShjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigiaHRtbEZsb3ciKTsKICAgIGVmZmVjdHMuZW50ZXIoImh0bWxGbG93RGF0YSIpOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBvcGVuOwogIH0KICBfX25hbWUoYmVmb3JlLCAiYmVmb3JlIik7CiAgZnVuY3Rpb24gb3Blbihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSAzMykgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gZGVjbGFyYXRpb25PcGVuOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA0NykgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBjbG9zaW5nVGFnID0gdHJ1ZTsKICAgICAgcmV0dXJuIHRhZ0Nsb3NlU3RhcnQ7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDYzKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIG1hcmtlciA9IDM7CiAgICAgIHJldHVybiBzZWxmMi5pbnRlcnJ1cHQgPyBvazMgOiBjb250aW51YXRpb25EZWNsYXJhdGlvbkluc2lkZTsKICAgIH0KICAgIGlmIChhc2NpaUFscGhhKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBidWZmZXIyID0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlNCk7CiAgICAgIHJldHVybiB0YWdOYW1lOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZShvcGVuLCAib3BlbiIpOwogIGZ1bmN0aW9uIGRlY2xhcmF0aW9uT3Blbihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0NSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBtYXJrZXIgPSAyOwogICAgICByZXR1cm4gY29tbWVudE9wZW5JbnNpZGU7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDkxKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIG1hcmtlciA9IDU7CiAgICAgIGluZGV4MiA9IDA7CiAgICAgIHJldHVybiBjZGF0YU9wZW5JbnNpZGU7CiAgICB9CiAgICBpZiAoYXNjaWlBbHBoYShjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgbWFya2VyID0gNDsKICAgICAgcmV0dXJuIHNlbGYyLmludGVycnVwdCA/IG9rMyA6IGNvbnRpbnVhdGlvbkRlY2xhcmF0aW9uSW5zaWRlOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZShkZWNsYXJhdGlvbk9wZW4sICJkZWNsYXJhdGlvbk9wZW4iKTsKICBmdW5jdGlvbiBjb21tZW50T3Blbkluc2lkZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0NSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gc2VsZjIuaW50ZXJydXB0ID8gb2szIDogY29udGludWF0aW9uRGVjbGFyYXRpb25JbnNpZGU7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKGNvbW1lbnRPcGVuSW5zaWRlLCAiY29tbWVudE9wZW5JbnNpZGUiKTsKICBmdW5jdGlvbiBjZGF0YU9wZW5JbnNpZGUoY29kZTQpIHsKICAgIGNvbnN0IHZhbHVlMiA9ICJDREFUQVsiOwogICAgaWYgKGNvZGU0ID09PSB2YWx1ZTIuY2hhckNvZGVBdChpbmRleDIrKykpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgaWYgKGluZGV4MiA9PT0gdmFsdWUyLmxlbmd0aCkgewogICAgICAgIHJldHVybiBzZWxmMi5pbnRlcnJ1cHQgPyBvazMgOiBjb250aW51YXRpb247CiAgICAgIH0KICAgICAgcmV0dXJuIGNkYXRhT3Blbkluc2lkZTsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBfX25hbWUoY2RhdGFPcGVuSW5zaWRlLCAiY2RhdGFPcGVuSW5zaWRlIik7CiAgZnVuY3Rpb24gdGFnQ2xvc2VTdGFydChjb2RlNCkgewogICAgaWYgKGFzY2lpQWxwaGEoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGJ1ZmZlcjIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGU0KTsKICAgICAgcmV0dXJuIHRhZ05hbWU7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKHRhZ0Nsb3NlU3RhcnQsICJ0YWdDbG9zZVN0YXJ0Iik7CiAgZnVuY3Rpb24gdGFnTmFtZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IGNvZGU0ID09PSA0NyB8fCBjb2RlNCA9PT0gNjIgfHwgbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlNCkpIHsKICAgICAgY29uc3Qgc2xhc2ggPSBjb2RlNCA9PT0gNDc7CiAgICAgIGNvbnN0IG5hbWUgPSBidWZmZXIyLnRvTG93ZXJDYXNlKCk7CiAgICAgIGlmICghc2xhc2ggJiYgIWNsb3NpbmdUYWcgJiYgaHRtbFJhd05hbWVzLmluY2x1ZGVzKG5hbWUpKSB7CiAgICAgICAgbWFya2VyID0gMTsKICAgICAgICByZXR1cm4gc2VsZjIuaW50ZXJydXB0ID8gb2szKGNvZGU0KSA6IGNvbnRpbnVhdGlvbihjb2RlNCk7CiAgICAgIH0KICAgICAgaWYgKGh0bWxCbG9ja05hbWVzLmluY2x1ZGVzKGJ1ZmZlcjIudG9Mb3dlckNhc2UoKSkpIHsKICAgICAgICBtYXJrZXIgPSA2OwogICAgICAgIGlmIChzbGFzaCkgewogICAgICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgICAgIHJldHVybiBiYXNpY1NlbGZDbG9zaW5nOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc2VsZjIuaW50ZXJydXB0ID8gb2szKGNvZGU0KSA6IGNvbnRpbnVhdGlvbihjb2RlNCk7CiAgICAgIH0KICAgICAgbWFya2VyID0gNzsKICAgICAgcmV0dXJuIHNlbGYyLmludGVycnVwdCAmJiAhc2VsZjIucGFyc2VyLmxhenlbc2VsZjIubm93KCkubGluZV0gPyBub2soY29kZTQpIDogY2xvc2luZ1RhZyA/IGNvbXBsZXRlQ2xvc2luZ1RhZ0FmdGVyKGNvZGU0KSA6IGNvbXBsZXRlQXR0cmlidXRlTmFtZUJlZm9yZShjb2RlNCk7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDQ1IHx8IGFzY2lpQWxwaGFudW1lcmljKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBidWZmZXIyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZTQpOwogICAgICByZXR1cm4gdGFnTmFtZTsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBfX25hbWUodGFnTmFtZSwgInRhZ05hbWUiKTsKICBmdW5jdGlvbiBiYXNpY1NlbGZDbG9zaW5nKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDYyKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBzZWxmMi5pbnRlcnJ1cHQgPyBvazMgOiBjb250aW51YXRpb247CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKGJhc2ljU2VsZkNsb3NpbmcsICJiYXNpY1NlbGZDbG9zaW5nIik7CiAgZnVuY3Rpb24gY29tcGxldGVDbG9zaW5nVGFnQWZ0ZXIoY29kZTQpIHsKICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY29tcGxldGVDbG9zaW5nVGFnQWZ0ZXI7CiAgICB9CiAgICByZXR1cm4gY29tcGxldGVFbmQoY29kZTQpOwogIH0KICBfX25hbWUoY29tcGxldGVDbG9zaW5nVGFnQWZ0ZXIsICJjb21wbGV0ZUNsb3NpbmdUYWdBZnRlciIpOwogIGZ1bmN0aW9uIGNvbXBsZXRlQXR0cmlidXRlTmFtZUJlZm9yZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0NykgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY29tcGxldGVFbmQ7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDU4IHx8IGNvZGU0ID09PSA5NSB8fCBhc2NpaUFscGhhKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY29tcGxldGVBdHRyaWJ1dGVOYW1lOwogICAgfQogICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBjb21wbGV0ZUF0dHJpYnV0ZU5hbWVCZWZvcmU7CiAgICB9CiAgICByZXR1cm4gY29tcGxldGVFbmQoY29kZTQpOwogIH0KICBfX25hbWUoY29tcGxldGVBdHRyaWJ1dGVOYW1lQmVmb3JlLCAiY29tcGxldGVBdHRyaWJ1dGVOYW1lQmVmb3JlIik7CiAgZnVuY3Rpb24gY29tcGxldGVBdHRyaWJ1dGVOYW1lKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDQ1IHx8IGNvZGU0ID09PSA0NiB8fCBjb2RlNCA9PT0gNTggfHwgY29kZTQgPT09IDk1IHx8IGFzY2lpQWxwaGFudW1lcmljKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY29tcGxldGVBdHRyaWJ1dGVOYW1lOwogICAgfQogICAgcmV0dXJuIGNvbXBsZXRlQXR0cmlidXRlTmFtZUFmdGVyKGNvZGU0KTsKICB9CiAgX19uYW1lKGNvbXBsZXRlQXR0cmlidXRlTmFtZSwgImNvbXBsZXRlQXR0cmlidXRlTmFtZSIpOwogIGZ1bmN0aW9uIGNvbXBsZXRlQXR0cmlidXRlTmFtZUFmdGVyKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDYxKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBjb21wbGV0ZUF0dHJpYnV0ZVZhbHVlQmVmb3JlOwogICAgfQogICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBjb21wbGV0ZUF0dHJpYnV0ZU5hbWVBZnRlcjsKICAgIH0KICAgIHJldHVybiBjb21wbGV0ZUF0dHJpYnV0ZU5hbWVCZWZvcmUoY29kZTQpOwogIH0KICBfX25hbWUoY29tcGxldGVBdHRyaWJ1dGVOYW1lQWZ0ZXIsICJjb21wbGV0ZUF0dHJpYnV0ZU5hbWVBZnRlciIpOwogIGZ1bmN0aW9uIGNvbXBsZXRlQXR0cmlidXRlVmFsdWVCZWZvcmUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBjb2RlNCA9PT0gNjAgfHwgY29kZTQgPT09IDYxIHx8IGNvZGU0ID09PSA2MiB8fCBjb2RlNCA9PT0gOTYpIHsKICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDM0IHx8IGNvZGU0ID09PSAzOSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBtYXJrZXJCID0gY29kZTQ7CiAgICAgIHJldHVybiBjb21wbGV0ZUF0dHJpYnV0ZVZhbHVlUXVvdGVkOwogICAgfQogICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBjb21wbGV0ZUF0dHJpYnV0ZVZhbHVlQmVmb3JlOwogICAgfQogICAgcmV0dXJuIGNvbXBsZXRlQXR0cmlidXRlVmFsdWVVbnF1b3RlZChjb2RlNCk7CiAgfQogIF9fbmFtZShjb21wbGV0ZUF0dHJpYnV0ZVZhbHVlQmVmb3JlLCAiY29tcGxldGVBdHRyaWJ1dGVWYWx1ZUJlZm9yZSIpOwogIGZ1bmN0aW9uIGNvbXBsZXRlQXR0cmlidXRlVmFsdWVRdW90ZWQoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbWFya2VyQikgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBtYXJrZXJCID0gbnVsbDsKICAgICAgcmV0dXJuIGNvbXBsZXRlQXR0cmlidXRlVmFsdWVRdW90ZWRBZnRlcjsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBjb21wbGV0ZUF0dHJpYnV0ZVZhbHVlUXVvdGVkOwogIH0KICBfX25hbWUoY29tcGxldGVBdHRyaWJ1dGVWYWx1ZVF1b3RlZCwgImNvbXBsZXRlQXR0cmlidXRlVmFsdWVRdW90ZWQiKTsKICBmdW5jdGlvbiBjb21wbGV0ZUF0dHJpYnV0ZVZhbHVlVW5xdW90ZWQoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBjb2RlNCA9PT0gMzQgfHwgY29kZTQgPT09IDM5IHx8IGNvZGU0ID09PSA0NyB8fCBjb2RlNCA9PT0gNjAgfHwgY29kZTQgPT09IDYxIHx8IGNvZGU0ID09PSA2MiB8fCBjb2RlNCA9PT0gOTYgfHwgbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlNCkpIHsKICAgICAgcmV0dXJuIGNvbXBsZXRlQXR0cmlidXRlTmFtZUFmdGVyKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gY29tcGxldGVBdHRyaWJ1dGVWYWx1ZVVucXVvdGVkOwogIH0KICBfX25hbWUoY29tcGxldGVBdHRyaWJ1dGVWYWx1ZVVucXVvdGVkLCAiY29tcGxldGVBdHRyaWJ1dGVWYWx1ZVVucXVvdGVkIik7CiAgZnVuY3Rpb24gY29tcGxldGVBdHRyaWJ1dGVWYWx1ZVF1b3RlZEFmdGVyKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDQ3IHx8IGNvZGU0ID09PSA2MiB8fCBtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICByZXR1cm4gY29tcGxldGVBdHRyaWJ1dGVOYW1lQmVmb3JlKGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBfX25hbWUoY29tcGxldGVBdHRyaWJ1dGVWYWx1ZVF1b3RlZEFmdGVyLCAiY29tcGxldGVBdHRyaWJ1dGVWYWx1ZVF1b3RlZEFmdGVyIik7CiAgZnVuY3Rpb24gY29tcGxldGVFbmQoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNjIpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGNvbXBsZXRlQWZ0ZXI7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKGNvbXBsZXRlRW5kLCAiY29tcGxldGVFbmQiKTsKICBmdW5jdGlvbiBjb21wbGV0ZUFmdGVyKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICByZXR1cm4gY29udGludWF0aW9uKGNvZGU0KTsKICAgIH0KICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY29tcGxldGVBZnRlcjsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBfX25hbWUoY29tcGxldGVBZnRlciwgImNvbXBsZXRlQWZ0ZXIiKTsKICBmdW5jdGlvbiBjb250aW51YXRpb24oY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDUgJiYgbWFya2VyID09PSAyKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBjb250aW51YXRpb25Db21tZW50SW5zaWRlOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA2MCAmJiBtYXJrZXIgPT09IDEpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvblJhd1RhZ09wZW47CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDYyICYmIG1hcmtlciA9PT0gNCkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY29udGludWF0aW9uQ2xvc2U7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDYzICYmIG1hcmtlciA9PT0gMykgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY29udGludWF0aW9uRGVjbGFyYXRpb25JbnNpZGU7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDkzICYmIG1hcmtlciA9PT0gNSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY29udGludWF0aW9uQ2RhdGFJbnNpZGU7CiAgICB9CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSAmJiAobWFya2VyID09PSA2IHx8IG1hcmtlciA9PT0gNykpIHsKICAgICAgZWZmZWN0cy5leGl0KCJodG1sRmxvd0RhdGEiKTsKICAgICAgcmV0dXJuIGVmZmVjdHMuY2hlY2soYmxhbmtMaW5lQmVmb3JlLCBjb250aW51YXRpb25BZnRlciwgY29udGludWF0aW9uU3RhcnQpKGNvZGU0KTsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuZXhpdCgiaHRtbEZsb3dEYXRhIik7CiAgICAgIHJldHVybiBjb250aW51YXRpb25TdGFydChjb2RlNCk7CiAgICB9CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIGNvbnRpbnVhdGlvbjsKICB9CiAgX19uYW1lKGNvbnRpbnVhdGlvbiwgImNvbnRpbnVhdGlvbiIpOwogIGZ1bmN0aW9uIGNvbnRpbnVhdGlvblN0YXJ0KGNvZGU0KSB7CiAgICByZXR1cm4gZWZmZWN0cy5jaGVjayhub25MYXp5Q29udGludWF0aW9uU3RhcnQsIGNvbnRpbnVhdGlvblN0YXJ0Tm9uTGF6eSwgY29udGludWF0aW9uQWZ0ZXIpKGNvZGU0KTsKICB9CiAgX19uYW1lKGNvbnRpbnVhdGlvblN0YXJ0LCAiY29udGludWF0aW9uU3RhcnQiKTsKICBmdW5jdGlvbiBjb250aW51YXRpb25TdGFydE5vbkxhenkoY29kZTQpIHsKICAgIGVmZmVjdHMuZW50ZXIoImxpbmVFbmRpbmciKTsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICBlZmZlY3RzLmV4aXQoImxpbmVFbmRpbmciKTsKICAgIHJldHVybiBjb250aW51YXRpb25CZWZvcmU7CiAgfQogIF9fbmFtZShjb250aW51YXRpb25TdGFydE5vbkxhenksICJjb250aW51YXRpb25TdGFydE5vbkxhenkiKTsKICBmdW5jdGlvbiBjb250aW51YXRpb25CZWZvcmUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIHJldHVybiBjb250aW51YXRpb25TdGFydChjb2RlNCk7CiAgICB9CiAgICBlZmZlY3RzLmVudGVyKCJodG1sRmxvd0RhdGEiKTsKICAgIHJldHVybiBjb250aW51YXRpb24oY29kZTQpOwogIH0KICBfX25hbWUoY29udGludWF0aW9uQmVmb3JlLCAiY29udGludWF0aW9uQmVmb3JlIik7CiAgZnVuY3Rpb24gY29udGludWF0aW9uQ29tbWVudEluc2lkZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0NSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY29udGludWF0aW9uRGVjbGFyYXRpb25JbnNpZGU7CiAgICB9CiAgICByZXR1cm4gY29udGludWF0aW9uKGNvZGU0KTsKICB9CiAgX19uYW1lKGNvbnRpbnVhdGlvbkNvbW1lbnRJbnNpZGUsICJjb250aW51YXRpb25Db21tZW50SW5zaWRlIik7CiAgZnVuY3Rpb24gY29udGludWF0aW9uUmF3VGFnT3Blbihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0NykgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBidWZmZXIyID0gIiI7CiAgICAgIHJldHVybiBjb250aW51YXRpb25SYXdFbmRUYWc7CiAgICB9CiAgICByZXR1cm4gY29udGludWF0aW9uKGNvZGU0KTsKICB9CiAgX19uYW1lKGNvbnRpbnVhdGlvblJhd1RhZ09wZW4sICJjb250aW51YXRpb25SYXdUYWdPcGVuIik7CiAgZnVuY3Rpb24gY29udGludWF0aW9uUmF3RW5kVGFnKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDYyKSB7CiAgICAgIGNvbnN0IG5hbWUgPSBidWZmZXIyLnRvTG93ZXJDYXNlKCk7CiAgICAgIGlmIChodG1sUmF3TmFtZXMuaW5jbHVkZXMobmFtZSkpIHsKICAgICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICAgIHJldHVybiBjb250aW51YXRpb25DbG9zZTsKICAgICAgfQogICAgICByZXR1cm4gY29udGludWF0aW9uKGNvZGU0KTsKICAgIH0KICAgIGlmIChhc2NpaUFscGhhKGNvZGU0KSAmJiBidWZmZXIyLmxlbmd0aCA8IDgpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgYnVmZmVyMiArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGU0KTsKICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvblJhd0VuZFRhZzsKICAgIH0KICAgIHJldHVybiBjb250aW51YXRpb24oY29kZTQpOwogIH0KICBfX25hbWUoY29udGludWF0aW9uUmF3RW5kVGFnLCAiY29udGludWF0aW9uUmF3RW5kVGFnIik7CiAgZnVuY3Rpb24gY29udGludWF0aW9uQ2RhdGFJbnNpZGUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gOTMpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbkRlY2xhcmF0aW9uSW5zaWRlOwogICAgfQogICAgcmV0dXJuIGNvbnRpbnVhdGlvbihjb2RlNCk7CiAgfQogIF9fbmFtZShjb250aW51YXRpb25DZGF0YUluc2lkZSwgImNvbnRpbnVhdGlvbkNkYXRhSW5zaWRlIik7CiAgZnVuY3Rpb24gY29udGludWF0aW9uRGVjbGFyYXRpb25JbnNpZGUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNjIpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbkNsb3NlOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA0NSAmJiBtYXJrZXIgPT09IDIpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbkRlY2xhcmF0aW9uSW5zaWRlOwogICAgfQogICAgcmV0dXJuIGNvbnRpbnVhdGlvbihjb2RlNCk7CiAgfQogIF9fbmFtZShjb250aW51YXRpb25EZWNsYXJhdGlvbkluc2lkZSwgImNvbnRpbnVhdGlvbkRlY2xhcmF0aW9uSW5zaWRlIik7CiAgZnVuY3Rpb24gY29udGludWF0aW9uQ2xvc2UoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuZXhpdCgiaHRtbEZsb3dEYXRhIik7CiAgICAgIHJldHVybiBjb250aW51YXRpb25BZnRlcihjb2RlNCk7CiAgICB9CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIGNvbnRpbnVhdGlvbkNsb3NlOwogIH0KICBfX25hbWUoY29udGludWF0aW9uQ2xvc2UsICJjb250aW51YXRpb25DbG9zZSIpOwogIGZ1bmN0aW9uIGNvbnRpbnVhdGlvbkFmdGVyKGNvZGU0KSB7CiAgICBlZmZlY3RzLmV4aXQoImh0bWxGbG93Iik7CiAgICByZXR1cm4gb2szKGNvZGU0KTsKICB9CiAgX19uYW1lKGNvbnRpbnVhdGlvbkFmdGVyLCAiY29udGludWF0aW9uQWZ0ZXIiKTsKfQpfX25hbWUodG9rZW5pemVIdG1sRmxvdywgInRva2VuaXplSHRtbEZsb3ciKTsKZnVuY3Rpb24gdG9rZW5pemVOb25MYXp5Q29udGludWF0aW9uU3RhcnQoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmVudGVyKCJsaW5lRW5kaW5nIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgibGluZUVuZGluZyIpOwogICAgICByZXR1cm4gYWZ0ZXI7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKHN0YXJ0LCAic3RhcnQiKTsKICBmdW5jdGlvbiBhZnRlcihjb2RlNCkgewogICAgcmV0dXJuIHNlbGYyLnBhcnNlci5sYXp5W3NlbGYyLm5vdygpLmxpbmVdID8gbm9rKGNvZGU0KSA6IG9rMyhjb2RlNCk7CiAgfQogIF9fbmFtZShhZnRlciwgImFmdGVyIik7Cn0KX19uYW1lKHRva2VuaXplTm9uTGF6eUNvbnRpbnVhdGlvblN0YXJ0LCAidG9rZW5pemVOb25MYXp5Q29udGludWF0aW9uU3RhcnQiKTsKZnVuY3Rpb24gdG9rZW5pemVCbGFua0xpbmVCZWZvcmUoZWZmZWN0cywgb2szLCBub2spIHsKICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIGVmZmVjdHMuZW50ZXIoImxpbmVFbmRpbmciKTsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICBlZmZlY3RzLmV4aXQoImxpbmVFbmRpbmciKTsKICAgIHJldHVybiBlZmZlY3RzLmF0dGVtcHQoYmxhbmtMaW5lLCBvazMsIG5vayk7CiAgfQogIF9fbmFtZShzdGFydCwgInN0YXJ0Iik7Cn0KX19uYW1lKHRva2VuaXplQmxhbmtMaW5lQmVmb3JlLCAidG9rZW5pemVCbGFua0xpbmVCZWZvcmUiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstY29yZS1jb21tb25tYXJrQDIuMC4zL25vZGVfbW9kdWxlcy9taWNyb21hcmstY29yZS1jb21tb25tYXJrL2xpYi9odG1sLXRleHQuanMKdmFyIGh0bWxUZXh0ID0gewogIG5hbWU6ICJodG1sVGV4dCIsCiAgdG9rZW5pemU6IHRva2VuaXplSHRtbFRleHQKfTsKZnVuY3Rpb24gdG9rZW5pemVIdG1sVGV4dChlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICBsZXQgbWFya2VyOwogIGxldCBpbmRleDI7CiAgbGV0IHJldHVyblN0YXRlOwogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigiaHRtbFRleHQiKTsKICAgIGVmZmVjdHMuZW50ZXIoImh0bWxUZXh0RGF0YSIpOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBvcGVuOwogIH0KICBfX25hbWUoc3RhcnQsICJzdGFydCIpOwogIGZ1bmN0aW9uIG9wZW4oY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gMzMpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGRlY2xhcmF0aW9uT3BlbjsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gNDcpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHRhZ0Nsb3NlU3RhcnQ7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDYzKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBpbnN0cnVjdGlvbjsKICAgIH0KICAgIGlmIChhc2NpaUFscGhhKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gdGFnT3BlbjsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBfX25hbWUob3BlbiwgIm9wZW4iKTsKICBmdW5jdGlvbiBkZWNsYXJhdGlvbk9wZW4oY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDUpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGNvbW1lbnRPcGVuSW5zaWRlOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA5MSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBpbmRleDIgPSAwOwogICAgICByZXR1cm4gY2RhdGFPcGVuSW5zaWRlOwogICAgfQogICAgaWYgKGFzY2lpQWxwaGEoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBkZWNsYXJhdGlvbjsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBfX25hbWUoZGVjbGFyYXRpb25PcGVuLCAiZGVjbGFyYXRpb25PcGVuIik7CiAgZnVuY3Rpb24gY29tbWVudE9wZW5JbnNpZGUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDUpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGNvbW1lbnRFbmQ7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKGNvbW1lbnRPcGVuSW5zaWRlLCAiY29tbWVudE9wZW5JbnNpZGUiKTsKICBmdW5jdGlvbiBjb21tZW50Myhjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA0NSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY29tbWVudENsb3NlOwogICAgfQogICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgcmV0dXJuU3RhdGUgPSBjb21tZW50MzsKICAgICAgcmV0dXJuIGxpbmVFbmRpbmdCZWZvcmUoY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBjb21tZW50MzsKICB9CiAgX19uYW1lKGNvbW1lbnQzLCAiY29tbWVudCIpOwogIGZ1bmN0aW9uIGNvbW1lbnRDbG9zZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0NSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY29tbWVudEVuZDsKICAgIH0KICAgIHJldHVybiBjb21tZW50Myhjb2RlNCk7CiAgfQogIF9fbmFtZShjb21tZW50Q2xvc2UsICJjb21tZW50Q2xvc2UiKTsKICBmdW5jdGlvbiBjb21tZW50RW5kKGNvZGU0KSB7CiAgICByZXR1cm4gY29kZTQgPT09IDYyID8gZW5kKGNvZGU0KSA6IGNvZGU0ID09PSA0NSA/IGNvbW1lbnRDbG9zZShjb2RlNCkgOiBjb21tZW50Myhjb2RlNCk7CiAgfQogIF9fbmFtZShjb21tZW50RW5kLCAiY29tbWVudEVuZCIpOwogIGZ1bmN0aW9uIGNkYXRhT3Blbkluc2lkZShjb2RlNCkgewogICAgY29uc3QgdmFsdWUyID0gIkNEQVRBWyI7CiAgICBpZiAoY29kZTQgPT09IHZhbHVlMi5jaGFyQ29kZUF0KGluZGV4MisrKSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gaW5kZXgyID09PSB2YWx1ZTIubGVuZ3RoID8gY2RhdGEgOiBjZGF0YU9wZW5JbnNpZGU7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKGNkYXRhT3Blbkluc2lkZSwgImNkYXRhT3Blbkluc2lkZSIpOwogIGZ1bmN0aW9uIGNkYXRhKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwpIHsKICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDkzKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBjZGF0YUNsb3NlOwogICAgfQogICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgcmV0dXJuU3RhdGUgPSBjZGF0YTsKICAgICAgcmV0dXJuIGxpbmVFbmRpbmdCZWZvcmUoY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBjZGF0YTsKICB9CiAgX19uYW1lKGNkYXRhLCAiY2RhdGEiKTsKICBmdW5jdGlvbiBjZGF0YUNsb3NlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDkzKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBjZGF0YUVuZDsKICAgIH0KICAgIHJldHVybiBjZGF0YShjb2RlNCk7CiAgfQogIF9fbmFtZShjZGF0YUNsb3NlLCAiY2RhdGFDbG9zZSIpOwogIGZ1bmN0aW9uIGNkYXRhRW5kKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDYyKSB7CiAgICAgIHJldHVybiBlbmQoY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA5MykgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY2RhdGFFbmQ7CiAgICB9CiAgICByZXR1cm4gY2RhdGEoY29kZTQpOwogIH0KICBfX25hbWUoY2RhdGFFbmQsICJjZGF0YUVuZCIpOwogIGZ1bmN0aW9uIGRlY2xhcmF0aW9uKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgY29kZTQgPT09IDYyKSB7CiAgICAgIHJldHVybiBlbmQoY29kZTQpOwogICAgfQogICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgcmV0dXJuU3RhdGUgPSBkZWNsYXJhdGlvbjsKICAgICAgcmV0dXJuIGxpbmVFbmRpbmdCZWZvcmUoY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBkZWNsYXJhdGlvbjsKICB9CiAgX19uYW1lKGRlY2xhcmF0aW9uLCAiZGVjbGFyYXRpb24iKTsKICBmdW5jdGlvbiBpbnN0cnVjdGlvbihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA2MykgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25DbG9zZTsKICAgIH0KICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIHJldHVyblN0YXRlID0gaW5zdHJ1Y3Rpb247CiAgICAgIHJldHVybiBsaW5lRW5kaW5nQmVmb3JlKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gaW5zdHJ1Y3Rpb247CiAgfQogIF9fbmFtZShpbnN0cnVjdGlvbiwgImluc3RydWN0aW9uIik7CiAgZnVuY3Rpb24gaW5zdHJ1Y3Rpb25DbG9zZShjb2RlNCkgewogICAgcmV0dXJuIGNvZGU0ID09PSA2MiA/IGVuZChjb2RlNCkgOiBpbnN0cnVjdGlvbihjb2RlNCk7CiAgfQogIF9fbmFtZShpbnN0cnVjdGlvbkNsb3NlLCAiaW5zdHJ1Y3Rpb25DbG9zZSIpOwogIGZ1bmN0aW9uIHRhZ0Nsb3NlU3RhcnQoY29kZTQpIHsKICAgIGlmIChhc2NpaUFscGhhKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gdGFnQ2xvc2U7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKHRhZ0Nsb3NlU3RhcnQsICJ0YWdDbG9zZVN0YXJ0Iik7CiAgZnVuY3Rpb24gdGFnQ2xvc2UoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDUgfHwgYXNjaWlBbHBoYW51bWVyaWMoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiB0YWdDbG9zZTsKICAgIH0KICAgIHJldHVybiB0YWdDbG9zZUJldHdlZW4oY29kZTQpOwogIH0KICBfX25hbWUodGFnQ2xvc2UsICJ0YWdDbG9zZSIpOwogIGZ1bmN0aW9uIHRhZ0Nsb3NlQmV0d2Vlbihjb2RlNCkgewogICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgcmV0dXJuU3RhdGUgPSB0YWdDbG9zZUJldHdlZW47CiAgICAgIHJldHVybiBsaW5lRW5kaW5nQmVmb3JlKGNvZGU0KTsKICAgIH0KICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gdGFnQ2xvc2VCZXR3ZWVuOwogICAgfQogICAgcmV0dXJuIGVuZChjb2RlNCk7CiAgfQogIF9fbmFtZSh0YWdDbG9zZUJldHdlZW4sICJ0YWdDbG9zZUJldHdlZW4iKTsKICBmdW5jdGlvbiB0YWdPcGVuKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDQ1IHx8IGFzY2lpQWxwaGFudW1lcmljKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gdGFnT3BlbjsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gNDcgfHwgY29kZTQgPT09IDYyIHx8IG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpKSB7CiAgICAgIHJldHVybiB0YWdPcGVuQmV0d2Vlbihjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKHRhZ09wZW4sICJ0YWdPcGVuIik7CiAgZnVuY3Rpb24gdGFnT3BlbkJldHdlZW4oY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDcpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGVuZDsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gNTggfHwgY29kZTQgPT09IDk1IHx8IGFzY2lpQWxwaGEoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiB0YWdPcGVuQXR0cmlidXRlTmFtZTsKICAgIH0KICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIHJldHVyblN0YXRlID0gdGFnT3BlbkJldHdlZW47CiAgICAgIHJldHVybiBsaW5lRW5kaW5nQmVmb3JlKGNvZGU0KTsKICAgIH0KICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gdGFnT3BlbkJldHdlZW47CiAgICB9CiAgICByZXR1cm4gZW5kKGNvZGU0KTsKICB9CiAgX19uYW1lKHRhZ09wZW5CZXR3ZWVuLCAidGFnT3BlbkJldHdlZW4iKTsKICBmdW5jdGlvbiB0YWdPcGVuQXR0cmlidXRlTmFtZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0NSB8fCBjb2RlNCA9PT0gNDYgfHwgY29kZTQgPT09IDU4IHx8IGNvZGU0ID09PSA5NSB8fCBhc2NpaUFscGhhbnVtZXJpYyhjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHRhZ09wZW5BdHRyaWJ1dGVOYW1lOwogICAgfQogICAgcmV0dXJuIHRhZ09wZW5BdHRyaWJ1dGVOYW1lQWZ0ZXIoY29kZTQpOwogIH0KICBfX25hbWUodGFnT3BlbkF0dHJpYnV0ZU5hbWUsICJ0YWdPcGVuQXR0cmlidXRlTmFtZSIpOwogIGZ1bmN0aW9uIHRhZ09wZW5BdHRyaWJ1dGVOYW1lQWZ0ZXIoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNjEpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHRhZ09wZW5BdHRyaWJ1dGVWYWx1ZUJlZm9yZTsKICAgIH0KICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIHJldHVyblN0YXRlID0gdGFnT3BlbkF0dHJpYnV0ZU5hbWVBZnRlcjsKICAgICAgcmV0dXJuIGxpbmVFbmRpbmdCZWZvcmUoY29kZTQpOwogICAgfQogICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiB0YWdPcGVuQXR0cmlidXRlTmFtZUFmdGVyOwogICAgfQogICAgcmV0dXJuIHRhZ09wZW5CZXR3ZWVuKGNvZGU0KTsKICB9CiAgX19uYW1lKHRhZ09wZW5BdHRyaWJ1dGVOYW1lQWZ0ZXIsICJ0YWdPcGVuQXR0cmlidXRlTmFtZUFmdGVyIik7CiAgZnVuY3Rpb24gdGFnT3BlbkF0dHJpYnV0ZVZhbHVlQmVmb3JlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgY29kZTQgPT09IDYwIHx8IGNvZGU0ID09PSA2MSB8fCBjb2RlNCA9PT0gNjIgfHwgY29kZTQgPT09IDk2KSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSAzNCB8fCBjb2RlNCA9PT0gMzkpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgbWFya2VyID0gY29kZTQ7CiAgICAgIHJldHVybiB0YWdPcGVuQXR0cmlidXRlVmFsdWVRdW90ZWQ7CiAgICB9CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICByZXR1cm5TdGF0ZSA9IHRhZ09wZW5BdHRyaWJ1dGVWYWx1ZUJlZm9yZTsKICAgICAgcmV0dXJuIGxpbmVFbmRpbmdCZWZvcmUoY29kZTQpOwogICAgfQogICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiB0YWdPcGVuQXR0cmlidXRlVmFsdWVCZWZvcmU7CiAgICB9CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIHRhZ09wZW5BdHRyaWJ1dGVWYWx1ZVVucXVvdGVkOwogIH0KICBfX25hbWUodGFnT3BlbkF0dHJpYnV0ZVZhbHVlQmVmb3JlLCAidGFnT3BlbkF0dHJpYnV0ZVZhbHVlQmVmb3JlIik7CiAgZnVuY3Rpb24gdGFnT3BlbkF0dHJpYnV0ZVZhbHVlUXVvdGVkKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG1hcmtlcikgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBtYXJrZXIgPSB2b2lkIDA7CiAgICAgIHJldHVybiB0YWdPcGVuQXR0cmlidXRlVmFsdWVRdW90ZWRBZnRlcjsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gbnVsbCkgewogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIHJldHVyblN0YXRlID0gdGFnT3BlbkF0dHJpYnV0ZVZhbHVlUXVvdGVkOwogICAgICByZXR1cm4gbGluZUVuZGluZ0JlZm9yZShjb2RlNCk7CiAgICB9CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIHRhZ09wZW5BdHRyaWJ1dGVWYWx1ZVF1b3RlZDsKICB9CiAgX19uYW1lKHRhZ09wZW5BdHRyaWJ1dGVWYWx1ZVF1b3RlZCwgInRhZ09wZW5BdHRyaWJ1dGVWYWx1ZVF1b3RlZCIpOwogIGZ1bmN0aW9uIHRhZ09wZW5BdHRyaWJ1dGVWYWx1ZVVucXVvdGVkKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgY29kZTQgPT09IDM0IHx8IGNvZGU0ID09PSAzOSB8fCBjb2RlNCA9PT0gNjAgfHwgY29kZTQgPT09IDYxIHx8IGNvZGU0ID09PSA5NikgewogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gNDcgfHwgY29kZTQgPT09IDYyIHx8IG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpKSB7CiAgICAgIHJldHVybiB0YWdPcGVuQmV0d2Vlbihjb2RlNCk7CiAgICB9CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIHRhZ09wZW5BdHRyaWJ1dGVWYWx1ZVVucXVvdGVkOwogIH0KICBfX25hbWUodGFnT3BlbkF0dHJpYnV0ZVZhbHVlVW5xdW90ZWQsICJ0YWdPcGVuQXR0cmlidXRlVmFsdWVVbnF1b3RlZCIpOwogIGZ1bmN0aW9uIHRhZ09wZW5BdHRyaWJ1dGVWYWx1ZVF1b3RlZEFmdGVyKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDQ3IHx8IGNvZGU0ID09PSA2MiB8fCBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlKGNvZGU0KSkgewogICAgICByZXR1cm4gdGFnT3BlbkJldHdlZW4oY29kZTQpOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZSh0YWdPcGVuQXR0cmlidXRlVmFsdWVRdW90ZWRBZnRlciwgInRhZ09wZW5BdHRyaWJ1dGVWYWx1ZVF1b3RlZEFmdGVyIik7CiAgZnVuY3Rpb24gZW5kKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDYyKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgiaHRtbFRleHREYXRhIik7CiAgICAgIGVmZmVjdHMuZXhpdCgiaHRtbFRleHQiKTsKICAgICAgcmV0dXJuIG9rMzsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBfX25hbWUoZW5kLCAiZW5kIik7CiAgZnVuY3Rpb24gbGluZUVuZGluZ0JlZm9yZShjb2RlNCkgewogICAgZWZmZWN0cy5leGl0KCJodG1sVGV4dERhdGEiKTsKICAgIGVmZmVjdHMuZW50ZXIoImxpbmVFbmRpbmciKTsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICBlZmZlY3RzLmV4aXQoImxpbmVFbmRpbmciKTsKICAgIHJldHVybiBsaW5lRW5kaW5nQWZ0ZXI7CiAgfQogIF9fbmFtZShsaW5lRW5kaW5nQmVmb3JlLCAibGluZUVuZGluZ0JlZm9yZSIpOwogIGZ1bmN0aW9uIGxpbmVFbmRpbmdBZnRlcihjb2RlNCkgewogICAgcmV0dXJuIG1hcmtkb3duU3BhY2UoY29kZTQpID8gZmFjdG9yeVNwYWNlKGVmZmVjdHMsIGxpbmVFbmRpbmdBZnRlclByZWZpeCwgImxpbmVQcmVmaXgiLCBzZWxmMi5wYXJzZXIuY29uc3RydWN0cy5kaXNhYmxlLm51bGwuaW5jbHVkZXMoImNvZGVJbmRlbnRlZCIpID8gdm9pZCAwIDogNCkoY29kZTQpIDogbGluZUVuZGluZ0FmdGVyUHJlZml4KGNvZGU0KTsKICB9CiAgX19uYW1lKGxpbmVFbmRpbmdBZnRlciwgImxpbmVFbmRpbmdBZnRlciIpOwogIGZ1bmN0aW9uIGxpbmVFbmRpbmdBZnRlclByZWZpeChjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigiaHRtbFRleHREYXRhIik7CiAgICByZXR1cm4gcmV0dXJuU3RhdGUoY29kZTQpOwogIH0KICBfX25hbWUobGluZUVuZGluZ0FmdGVyUHJlZml4LCAibGluZUVuZGluZ0FmdGVyUHJlZml4Iik7Cn0KX19uYW1lKHRva2VuaXplSHRtbFRleHQsICJ0b2tlbml6ZUh0bWxUZXh0Iik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvbGFiZWwtZW5kLmpzCnZhciBsYWJlbEVuZCA9IHsKICBuYW1lOiAibGFiZWxFbmQiLAogIHJlc29sdmVBbGw6IHJlc29sdmVBbGxMYWJlbEVuZCwKICByZXNvbHZlVG86IHJlc29sdmVUb0xhYmVsRW5kLAogIHRva2VuaXplOiB0b2tlbml6ZUxhYmVsRW5kCn07CnZhciByZXNvdXJjZUNvbnN0cnVjdCA9IHsKICB0b2tlbml6ZTogdG9rZW5pemVSZXNvdXJjZQp9Owp2YXIgcmVmZXJlbmNlRnVsbENvbnN0cnVjdCA9IHsKICB0b2tlbml6ZTogdG9rZW5pemVSZWZlcmVuY2VGdWxsCn07CnZhciByZWZlcmVuY2VDb2xsYXBzZWRDb25zdHJ1Y3QgPSB7CiAgdG9rZW5pemU6IHRva2VuaXplUmVmZXJlbmNlQ29sbGFwc2VkCn07CmZ1bmN0aW9uIHJlc29sdmVBbGxMYWJlbEVuZChldmVudHMpIHsKICBsZXQgaW5kZXgyID0gLTE7CiAgY29uc3QgbmV3RXZlbnRzID0gW107CiAgd2hpbGUgKCsraW5kZXgyIDwgZXZlbnRzLmxlbmd0aCkgewogICAgY29uc3QgdG9rZW4gPSBldmVudHNbaW5kZXgyXVsxXTsKICAgIG5ld0V2ZW50cy5wdXNoKGV2ZW50c1tpbmRleDJdKTsKICAgIGlmICh0b2tlbi50eXBlID09PSAibGFiZWxJbWFnZSIgfHwgdG9rZW4udHlwZSA9PT0gImxhYmVsTGluayIgfHwgdG9rZW4udHlwZSA9PT0gImxhYmVsRW5kIikgewogICAgICBjb25zdCBvZmZzZXQgPSB0b2tlbi50eXBlID09PSAibGFiZWxJbWFnZSIgPyA0IDogMjsKICAgICAgdG9rZW4udHlwZSA9ICJkYXRhIjsKICAgICAgaW5kZXgyICs9IG9mZnNldDsKICAgIH0KICB9CiAgaWYgKGV2ZW50cy5sZW5ndGggIT09IG5ld0V2ZW50cy5sZW5ndGgpIHsKICAgIHNwbGljZShldmVudHMsIDAsIGV2ZW50cy5sZW5ndGgsIG5ld0V2ZW50cyk7CiAgfQogIHJldHVybiBldmVudHM7Cn0KX19uYW1lKHJlc29sdmVBbGxMYWJlbEVuZCwgInJlc29sdmVBbGxMYWJlbEVuZCIpOwpmdW5jdGlvbiByZXNvbHZlVG9MYWJlbEVuZChldmVudHMsIGNvbnRleHQyKSB7CiAgbGV0IGluZGV4MiA9IGV2ZW50cy5sZW5ndGg7CiAgbGV0IG9mZnNldCA9IDA7CiAgbGV0IHRva2VuOwogIGxldCBvcGVuOwogIGxldCBjbG9zZTc7CiAgbGV0IG1lZGlhOwogIHdoaWxlIChpbmRleDItLSkgewogICAgdG9rZW4gPSBldmVudHNbaW5kZXgyXVsxXTsKICAgIGlmIChvcGVuKSB7CiAgICAgIGlmICh0b2tlbi50eXBlID09PSAibGluayIgfHwgdG9rZW4udHlwZSA9PT0gImxhYmVsTGluayIgJiYgdG9rZW4uX2luYWN0aXZlKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKGV2ZW50c1tpbmRleDJdWzBdID09PSAiZW50ZXIiICYmIHRva2VuLnR5cGUgPT09ICJsYWJlbExpbmsiKSB7CiAgICAgICAgdG9rZW4uX2luYWN0aXZlID0gdHJ1ZTsKICAgICAgfQogICAgfSBlbHNlIGlmIChjbG9zZTcpIHsKICAgICAgaWYgKGV2ZW50c1tpbmRleDJdWzBdID09PSAiZW50ZXIiICYmICh0b2tlbi50eXBlID09PSAibGFiZWxJbWFnZSIgfHwgdG9rZW4udHlwZSA9PT0gImxhYmVsTGluayIpICYmICF0b2tlbi5fYmFsYW5jZWQpIHsKICAgICAgICBvcGVuID0gaW5kZXgyOwogICAgICAgIGlmICh0b2tlbi50eXBlICE9PSAibGFiZWxMaW5rIikgewogICAgICAgICAgb2Zmc2V0ID0gMjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIGlmICh0b2tlbi50eXBlID09PSAibGFiZWxFbmQiKSB7CiAgICAgIGNsb3NlNyA9IGluZGV4MjsKICAgIH0KICB9CiAgY29uc3QgZ3JvdXAgPSB7CiAgICB0eXBlOiBldmVudHNbb3Blbl1bMV0udHlwZSA9PT0gImxhYmVsTGluayIgPyAibGluayIgOiAiaW1hZ2UiLAogICAgc3RhcnQ6IHsKICAgICAgLi4uZXZlbnRzW29wZW5dWzFdLnN0YXJ0CiAgICB9LAogICAgZW5kOiB7CiAgICAgIC4uLmV2ZW50c1tldmVudHMubGVuZ3RoIC0gMV1bMV0uZW5kCiAgICB9CiAgfTsKICBjb25zdCBsYWJlbCA9IHsKICAgIHR5cGU6ICJsYWJlbCIsCiAgICBzdGFydDogewogICAgICAuLi5ldmVudHNbb3Blbl1bMV0uc3RhcnQKICAgIH0sCiAgICBlbmQ6IHsKICAgICAgLi4uZXZlbnRzW2Nsb3NlN11bMV0uZW5kCiAgICB9CiAgfTsKICBjb25zdCB0ZXh0OCA9IHsKICAgIHR5cGU6ICJsYWJlbFRleHQiLAogICAgc3RhcnQ6IHsKICAgICAgLi4uZXZlbnRzW29wZW4gKyBvZmZzZXQgKyAyXVsxXS5lbmQKICAgIH0sCiAgICBlbmQ6IHsKICAgICAgLi4uZXZlbnRzW2Nsb3NlNyAtIDJdWzFdLnN0YXJ0CiAgICB9CiAgfTsKICBtZWRpYSA9IFtbImVudGVyIiwgZ3JvdXAsIGNvbnRleHQyXSwgWyJlbnRlciIsIGxhYmVsLCBjb250ZXh0Ml1dOwogIG1lZGlhID0gcHVzaChtZWRpYSwgZXZlbnRzLnNsaWNlKG9wZW4gKyAxLCBvcGVuICsgb2Zmc2V0ICsgMykpOwogIG1lZGlhID0gcHVzaChtZWRpYSwgW1siZW50ZXIiLCB0ZXh0OCwgY29udGV4dDJdXSk7CiAgbWVkaWEgPSBwdXNoKG1lZGlhLCByZXNvbHZlQWxsKGNvbnRleHQyLnBhcnNlci5jb25zdHJ1Y3RzLmluc2lkZVNwYW4ubnVsbCwgZXZlbnRzLnNsaWNlKG9wZW4gKyBvZmZzZXQgKyA0LCBjbG9zZTcgLSAzKSwgY29udGV4dDIpKTsKICBtZWRpYSA9IHB1c2gobWVkaWEsIFtbImV4aXQiLCB0ZXh0OCwgY29udGV4dDJdLCBldmVudHNbY2xvc2U3IC0gMl0sIGV2ZW50c1tjbG9zZTcgLSAxXSwgWyJleGl0IiwgbGFiZWwsIGNvbnRleHQyXV0pOwogIG1lZGlhID0gcHVzaChtZWRpYSwgZXZlbnRzLnNsaWNlKGNsb3NlNyArIDEpKTsKICBtZWRpYSA9IHB1c2gobWVkaWEsIFtbImV4aXQiLCBncm91cCwgY29udGV4dDJdXSk7CiAgc3BsaWNlKGV2ZW50cywgb3BlbiwgZXZlbnRzLmxlbmd0aCwgbWVkaWEpOwogIHJldHVybiBldmVudHM7Cn0KX19uYW1lKHJlc29sdmVUb0xhYmVsRW5kLCAicmVzb2x2ZVRvTGFiZWxFbmQiKTsKZnVuY3Rpb24gdG9rZW5pemVMYWJlbEVuZChlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICBsZXQgaW5kZXgyID0gc2VsZjIuZXZlbnRzLmxlbmd0aDsKICBsZXQgbGFiZWxTdGFydDsKICBsZXQgZGVmaW5lZDsKICB3aGlsZSAoaW5kZXgyLS0pIHsKICAgIGlmICgoc2VsZjIuZXZlbnRzW2luZGV4Ml1bMV0udHlwZSA9PT0gImxhYmVsSW1hZ2UiIHx8IHNlbGYyLmV2ZW50c1tpbmRleDJdWzFdLnR5cGUgPT09ICJsYWJlbExpbmsiKSAmJiAhc2VsZjIuZXZlbnRzW2luZGV4Ml1bMV0uX2JhbGFuY2VkKSB7CiAgICAgIGxhYmVsU3RhcnQgPSBzZWxmMi5ldmVudHNbaW5kZXgyXVsxXTsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgaWYgKCFsYWJlbFN0YXJ0KSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgaWYgKGxhYmVsU3RhcnQuX2luYWN0aXZlKSB7CiAgICAgIHJldHVybiBsYWJlbEVuZE5vayhjb2RlNCk7CiAgICB9CiAgICBkZWZpbmVkID0gc2VsZjIucGFyc2VyLmRlZmluZWQuaW5jbHVkZXMobm9ybWFsaXplSWRlbnRpZmllcihzZWxmMi5zbGljZVNlcmlhbGl6ZSh7CiAgICAgIHN0YXJ0OiBsYWJlbFN0YXJ0LmVuZCwKICAgICAgZW5kOiBzZWxmMi5ub3coKQogICAgfSkpKTsKICAgIGVmZmVjdHMuZW50ZXIoImxhYmVsRW5kIik7CiAgICBlZmZlY3RzLmVudGVyKCJsYWJlbE1hcmtlciIpOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIGVmZmVjdHMuZXhpdCgibGFiZWxNYXJrZXIiKTsKICAgIGVmZmVjdHMuZXhpdCgibGFiZWxFbmQiKTsKICAgIHJldHVybiBhZnRlcjsKICB9CiAgX19uYW1lKHN0YXJ0LCAic3RhcnQiKTsKICBmdW5jdGlvbiBhZnRlcihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0MCkgewogICAgICByZXR1cm4gZWZmZWN0cy5hdHRlbXB0KHJlc291cmNlQ29uc3RydWN0LCBsYWJlbEVuZE9rLCBkZWZpbmVkID8gbGFiZWxFbmRPayA6IGxhYmVsRW5kTm9rKShjb2RlNCk7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDkxKSB7CiAgICAgIHJldHVybiBlZmZlY3RzLmF0dGVtcHQocmVmZXJlbmNlRnVsbENvbnN0cnVjdCwgbGFiZWxFbmRPaywgZGVmaW5lZCA/IHJlZmVyZW5jZU5vdEZ1bGwgOiBsYWJlbEVuZE5vaykoY29kZTQpOwogICAgfQogICAgcmV0dXJuIGRlZmluZWQgPyBsYWJlbEVuZE9rKGNvZGU0KSA6IGxhYmVsRW5kTm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKGFmdGVyLCAiYWZ0ZXIiKTsKICBmdW5jdGlvbiByZWZlcmVuY2VOb3RGdWxsKGNvZGU0KSB7CiAgICByZXR1cm4gZWZmZWN0cy5hdHRlbXB0KHJlZmVyZW5jZUNvbGxhcHNlZENvbnN0cnVjdCwgbGFiZWxFbmRPaywgbGFiZWxFbmROb2spKGNvZGU0KTsKICB9CiAgX19uYW1lKHJlZmVyZW5jZU5vdEZ1bGwsICJyZWZlcmVuY2VOb3RGdWxsIik7CiAgZnVuY3Rpb24gbGFiZWxFbmRPayhjb2RlNCkgewogICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgfQogIF9fbmFtZShsYWJlbEVuZE9rLCAibGFiZWxFbmRPayIpOwogIGZ1bmN0aW9uIGxhYmVsRW5kTm9rKGNvZGU0KSB7CiAgICBsYWJlbFN0YXJ0Ll9iYWxhbmNlZCA9IHRydWU7CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKGxhYmVsRW5kTm9rLCAibGFiZWxFbmROb2siKTsKfQpfX25hbWUodG9rZW5pemVMYWJlbEVuZCwgInRva2VuaXplTGFiZWxFbmQiKTsKZnVuY3Rpb24gdG9rZW5pemVSZXNvdXJjZShlZmZlY3RzLCBvazMsIG5vaykgewogIHJldHVybiByZXNvdXJjZVN0YXJ0OwogIGZ1bmN0aW9uIHJlc291cmNlU3RhcnQoY29kZTQpIHsKICAgIGVmZmVjdHMuZW50ZXIoInJlc291cmNlIik7CiAgICBlZmZlY3RzLmVudGVyKCJyZXNvdXJjZU1hcmtlciIpOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIGVmZmVjdHMuZXhpdCgicmVzb3VyY2VNYXJrZXIiKTsKICAgIHJldHVybiByZXNvdXJjZUJlZm9yZTsKICB9CiAgX19uYW1lKHJlc291cmNlU3RhcnQsICJyZXNvdXJjZVN0YXJ0Iik7CiAgZnVuY3Rpb24gcmVzb3VyY2VCZWZvcmUoY29kZTQpIHsKICAgIHJldHVybiBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlKGNvZGU0KSA/IGZhY3RvcnlXaGl0ZXNwYWNlKGVmZmVjdHMsIHJlc291cmNlT3BlbikoY29kZTQpIDogcmVzb3VyY2VPcGVuKGNvZGU0KTsKICB9CiAgX19uYW1lKHJlc291cmNlQmVmb3JlLCAicmVzb3VyY2VCZWZvcmUiKTsKICBmdW5jdGlvbiByZXNvdXJjZU9wZW4oY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDEpIHsKICAgICAgcmV0dXJuIHJlc291cmNlRW5kKGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBmYWN0b3J5RGVzdGluYXRpb24oZWZmZWN0cywgcmVzb3VyY2VEZXN0aW5hdGlvbkFmdGVyLCByZXNvdXJjZURlc3RpbmF0aW9uTWlzc2luZywgInJlc291cmNlRGVzdGluYXRpb24iLCAicmVzb3VyY2VEZXN0aW5hdGlvbkxpdGVyYWwiLCAicmVzb3VyY2VEZXN0aW5hdGlvbkxpdGVyYWxNYXJrZXIiLCAicmVzb3VyY2VEZXN0aW5hdGlvblJhdyIsICJyZXNvdXJjZURlc3RpbmF0aW9uU3RyaW5nIiwgMzIpKGNvZGU0KTsKICB9CiAgX19uYW1lKHJlc291cmNlT3BlbiwgInJlc291cmNlT3BlbiIpOwogIGZ1bmN0aW9uIHJlc291cmNlRGVzdGluYXRpb25BZnRlcihjb2RlNCkgewogICAgcmV0dXJuIG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpID8gZmFjdG9yeVdoaXRlc3BhY2UoZWZmZWN0cywgcmVzb3VyY2VCZXR3ZWVuKShjb2RlNCkgOiByZXNvdXJjZUVuZChjb2RlNCk7CiAgfQogIF9fbmFtZShyZXNvdXJjZURlc3RpbmF0aW9uQWZ0ZXIsICJyZXNvdXJjZURlc3RpbmF0aW9uQWZ0ZXIiKTsKICBmdW5jdGlvbiByZXNvdXJjZURlc3RpbmF0aW9uTWlzc2luZyhjb2RlNCkgewogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZShyZXNvdXJjZURlc3RpbmF0aW9uTWlzc2luZywgInJlc291cmNlRGVzdGluYXRpb25NaXNzaW5nIik7CiAgZnVuY3Rpb24gcmVzb3VyY2VCZXR3ZWVuKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDM0IHx8IGNvZGU0ID09PSAzOSB8fCBjb2RlNCA9PT0gNDApIHsKICAgICAgcmV0dXJuIGZhY3RvcnlUaXRsZShlZmZlY3RzLCByZXNvdXJjZVRpdGxlQWZ0ZXIsIG5vaywgInJlc291cmNlVGl0bGUiLCAicmVzb3VyY2VUaXRsZU1hcmtlciIsICJyZXNvdXJjZVRpdGxlU3RyaW5nIikoY29kZTQpOwogICAgfQogICAgcmV0dXJuIHJlc291cmNlRW5kKGNvZGU0KTsKICB9CiAgX19uYW1lKHJlc291cmNlQmV0d2VlbiwgInJlc291cmNlQmV0d2VlbiIpOwogIGZ1bmN0aW9uIHJlc291cmNlVGl0bGVBZnRlcihjb2RlNCkgewogICAgcmV0dXJuIG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpID8gZmFjdG9yeVdoaXRlc3BhY2UoZWZmZWN0cywgcmVzb3VyY2VFbmQpKGNvZGU0KSA6IHJlc291cmNlRW5kKGNvZGU0KTsKICB9CiAgX19uYW1lKHJlc291cmNlVGl0bGVBZnRlciwgInJlc291cmNlVGl0bGVBZnRlciIpOwogIGZ1bmN0aW9uIHJlc291cmNlRW5kKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDQxKSB7CiAgICAgIGVmZmVjdHMuZW50ZXIoInJlc291cmNlTWFya2VyIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgicmVzb3VyY2VNYXJrZXIiKTsKICAgICAgZWZmZWN0cy5leGl0KCJyZXNvdXJjZSIpOwogICAgICByZXR1cm4gb2szOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZShyZXNvdXJjZUVuZCwgInJlc291cmNlRW5kIik7Cn0KX19uYW1lKHRva2VuaXplUmVzb3VyY2UsICJ0b2tlbml6ZVJlc291cmNlIik7CmZ1bmN0aW9uIHRva2VuaXplUmVmZXJlbmNlRnVsbChlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICByZXR1cm4gcmVmZXJlbmNlRnVsbDsKICBmdW5jdGlvbiByZWZlcmVuY2VGdWxsKGNvZGU0KSB7CiAgICByZXR1cm4gZmFjdG9yeUxhYmVsLmNhbGwoc2VsZjIsIGVmZmVjdHMsIHJlZmVyZW5jZUZ1bGxBZnRlciwgcmVmZXJlbmNlRnVsbE1pc3NpbmcsICJyZWZlcmVuY2UiLCAicmVmZXJlbmNlTWFya2VyIiwgInJlZmVyZW5jZVN0cmluZyIpKGNvZGU0KTsKICB9CiAgX19uYW1lKHJlZmVyZW5jZUZ1bGwsICJyZWZlcmVuY2VGdWxsIik7CiAgZnVuY3Rpb24gcmVmZXJlbmNlRnVsbEFmdGVyKGNvZGU0KSB7CiAgICByZXR1cm4gc2VsZjIucGFyc2VyLmRlZmluZWQuaW5jbHVkZXMobm9ybWFsaXplSWRlbnRpZmllcihzZWxmMi5zbGljZVNlcmlhbGl6ZShzZWxmMi5ldmVudHNbc2VsZjIuZXZlbnRzLmxlbmd0aCAtIDFdWzFdKS5zbGljZSgxLCAtMSkpKSA/IG9rMyhjb2RlNCkgOiBub2soY29kZTQpOwogIH0KICBfX25hbWUocmVmZXJlbmNlRnVsbEFmdGVyLCAicmVmZXJlbmNlRnVsbEFmdGVyIik7CiAgZnVuY3Rpb24gcmVmZXJlbmNlRnVsbE1pc3NpbmcoY29kZTQpIHsKICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBfX25hbWUocmVmZXJlbmNlRnVsbE1pc3NpbmcsICJyZWZlcmVuY2VGdWxsTWlzc2luZyIpOwp9Cl9fbmFtZSh0b2tlbml6ZVJlZmVyZW5jZUZ1bGwsICJ0b2tlbml6ZVJlZmVyZW5jZUZ1bGwiKTsKZnVuY3Rpb24gdG9rZW5pemVSZWZlcmVuY2VDb2xsYXBzZWQoZWZmZWN0cywgb2szLCBub2spIHsKICByZXR1cm4gcmVmZXJlbmNlQ29sbGFwc2VkU3RhcnQ7CiAgZnVuY3Rpb24gcmVmZXJlbmNlQ29sbGFwc2VkU3RhcnQoY29kZTQpIHsKICAgIGVmZmVjdHMuZW50ZXIoInJlZmVyZW5jZSIpOwogICAgZWZmZWN0cy5lbnRlcigicmVmZXJlbmNlTWFya2VyIik7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgZWZmZWN0cy5leGl0KCJyZWZlcmVuY2VNYXJrZXIiKTsKICAgIHJldHVybiByZWZlcmVuY2VDb2xsYXBzZWRPcGVuOwogIH0KICBfX25hbWUocmVmZXJlbmNlQ29sbGFwc2VkU3RhcnQsICJyZWZlcmVuY2VDb2xsYXBzZWRTdGFydCIpOwogIGZ1bmN0aW9uIHJlZmVyZW5jZUNvbGxhcHNlZE9wZW4oY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gOTMpIHsKICAgICAgZWZmZWN0cy5lbnRlcigicmVmZXJlbmNlTWFya2VyIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgicmVmZXJlbmNlTWFya2VyIik7CiAgICAgIGVmZmVjdHMuZXhpdCgicmVmZXJlbmNlIik7CiAgICAgIHJldHVybiBvazM7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKHJlZmVyZW5jZUNvbGxhcHNlZE9wZW4sICJyZWZlcmVuY2VDb2xsYXBzZWRPcGVuIik7Cn0KX19uYW1lKHRva2VuaXplUmVmZXJlbmNlQ29sbGFwc2VkLCAidG9rZW5pemVSZWZlcmVuY2VDb2xsYXBzZWQiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstY29yZS1jb21tb25tYXJrQDIuMC4zL25vZGVfbW9kdWxlcy9taWNyb21hcmstY29yZS1jb21tb25tYXJrL2xpYi9sYWJlbC1zdGFydC1pbWFnZS5qcwp2YXIgbGFiZWxTdGFydEltYWdlID0gewogIG5hbWU6ICJsYWJlbFN0YXJ0SW1hZ2UiLAogIHJlc29sdmVBbGw6IGxhYmVsRW5kLnJlc29sdmVBbGwsCiAgdG9rZW5pemU6IHRva2VuaXplTGFiZWxTdGFydEltYWdlCn07CmZ1bmN0aW9uIHRva2VuaXplTGFiZWxTdGFydEltYWdlKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigibGFiZWxJbWFnZSIpOwogICAgZWZmZWN0cy5lbnRlcigibGFiZWxJbWFnZU1hcmtlciIpOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIGVmZmVjdHMuZXhpdCgibGFiZWxJbWFnZU1hcmtlciIpOwogICAgcmV0dXJuIG9wZW47CiAgfQogIF9fbmFtZShzdGFydCwgInN0YXJ0Iik7CiAgZnVuY3Rpb24gb3Blbihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA5MSkgewogICAgICBlZmZlY3RzLmVudGVyKCJsYWJlbE1hcmtlciIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoImxhYmVsTWFya2VyIik7CiAgICAgIGVmZmVjdHMuZXhpdCgibGFiZWxJbWFnZSIpOwogICAgICByZXR1cm4gYWZ0ZXI7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKG9wZW4sICJvcGVuIik7CiAgZnVuY3Rpb24gYWZ0ZXIoY29kZTQpIHsKICAgIHJldHVybiBjb2RlNCA9PT0gOTQgJiYgIl9oaWRkZW5Gb290bm90ZVN1cHBvcnQiIGluIHNlbGYyLnBhcnNlci5jb25zdHJ1Y3RzID8gbm9rKGNvZGU0KSA6IG9rMyhjb2RlNCk7CiAgfQogIF9fbmFtZShhZnRlciwgImFmdGVyIik7Cn0KX19uYW1lKHRva2VuaXplTGFiZWxTdGFydEltYWdlLCAidG9rZW5pemVMYWJlbFN0YXJ0SW1hZ2UiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstY29yZS1jb21tb25tYXJrQDIuMC4zL25vZGVfbW9kdWxlcy9taWNyb21hcmstY29yZS1jb21tb25tYXJrL2xpYi9sYWJlbC1zdGFydC1saW5rLmpzCnZhciBsYWJlbFN0YXJ0TGluayA9IHsKICBuYW1lOiAibGFiZWxTdGFydExpbmsiLAogIHJlc29sdmVBbGw6IGxhYmVsRW5kLnJlc29sdmVBbGwsCiAgdG9rZW5pemU6IHRva2VuaXplTGFiZWxTdGFydExpbmsKfTsKZnVuY3Rpb24gdG9rZW5pemVMYWJlbFN0YXJ0TGluayhlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIGVmZmVjdHMuZW50ZXIoImxhYmVsTGluayIpOwogICAgZWZmZWN0cy5lbnRlcigibGFiZWxNYXJrZXIiKTsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICBlZmZlY3RzLmV4aXQoImxhYmVsTWFya2VyIik7CiAgICBlZmZlY3RzLmV4aXQoImxhYmVsTGluayIpOwogICAgcmV0dXJuIGFmdGVyOwogIH0KICBfX25hbWUoc3RhcnQsICJzdGFydCIpOwogIGZ1bmN0aW9uIGFmdGVyKGNvZGU0KSB7CiAgICByZXR1cm4gY29kZTQgPT09IDk0ICYmICJfaGlkZGVuRm9vdG5vdGVTdXBwb3J0IiBpbiBzZWxmMi5wYXJzZXIuY29uc3RydWN0cyA/IG5vayhjb2RlNCkgOiBvazMoY29kZTQpOwogIH0KICBfX25hbWUoYWZ0ZXIsICJhZnRlciIpOwp9Cl9fbmFtZSh0b2tlbml6ZUxhYmVsU3RhcnRMaW5rLCAidG9rZW5pemVMYWJlbFN0YXJ0TGluayIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2xpbmUtZW5kaW5nLmpzCnZhciBsaW5lRW5kaW5nID0gewogIG5hbWU6ICJsaW5lRW5kaW5nIiwKICB0b2tlbml6ZTogdG9rZW5pemVMaW5lRW5kaW5nCn07CmZ1bmN0aW9uIHRva2VuaXplTGluZUVuZGluZyhlZmZlY3RzLCBvazMpIHsKICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIGVmZmVjdHMuZW50ZXIoImxpbmVFbmRpbmciKTsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICBlZmZlY3RzLmV4aXQoImxpbmVFbmRpbmciKTsKICAgIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgb2szLCAibGluZVByZWZpeCIpOwogIH0KICBfX25hbWUoc3RhcnQsICJzdGFydCIpOwp9Cl9fbmFtZSh0b2tlbml6ZUxpbmVFbmRpbmcsICJ0b2tlbml6ZUxpbmVFbmRpbmciKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstY29yZS1jb21tb25tYXJrQDIuMC4zL25vZGVfbW9kdWxlcy9taWNyb21hcmstY29yZS1jb21tb25tYXJrL2xpYi90aGVtYXRpYy1icmVhay5qcwp2YXIgdGhlbWF0aWNCcmVhazIgPSB7CiAgbmFtZTogInRoZW1hdGljQnJlYWsiLAogIHRva2VuaXplOiB0b2tlbml6ZVRoZW1hdGljQnJlYWsKfTsKZnVuY3Rpb24gdG9rZW5pemVUaGVtYXRpY0JyZWFrKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgbGV0IHNpemUgPSAwOwogIGxldCBtYXJrZXI7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJ0aGVtYXRpY0JyZWFrIik7CiAgICByZXR1cm4gYmVmb3JlKGNvZGU0KTsKICB9CiAgX19uYW1lKHN0YXJ0LCAic3RhcnQiKTsKICBmdW5jdGlvbiBiZWZvcmUoY29kZTQpIHsKICAgIG1hcmtlciA9IGNvZGU0OwogICAgcmV0dXJuIGF0QnJlYWsoY29kZTQpOwogIH0KICBfX25hbWUoYmVmb3JlLCAiYmVmb3JlIik7CiAgZnVuY3Rpb24gYXRCcmVhayhjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBtYXJrZXIpIHsKICAgICAgZWZmZWN0cy5lbnRlcigidGhlbWF0aWNCcmVha1NlcXVlbmNlIik7CiAgICAgIHJldHVybiBzZXF1ZW5jZShjb2RlNCk7CiAgICB9CiAgICBpZiAoc2l6ZSA+PSAzICYmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSkgewogICAgICBlZmZlY3RzLmV4aXQoInRoZW1hdGljQnJlYWsiKTsKICAgICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKGF0QnJlYWssICJhdEJyZWFrIik7CiAgZnVuY3Rpb24gc2VxdWVuY2UoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbWFya2VyKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHNpemUrKzsKICAgICAgcmV0dXJuIHNlcXVlbmNlOwogICAgfQogICAgZWZmZWN0cy5leGl0KCJ0aGVtYXRpY0JyZWFrU2VxdWVuY2UiKTsKICAgIHJldHVybiBtYXJrZG93blNwYWNlKGNvZGU0KSA/IGZhY3RvcnlTcGFjZShlZmZlY3RzLCBhdEJyZWFrLCAid2hpdGVzcGFjZSIpKGNvZGU0KSA6IGF0QnJlYWsoY29kZTQpOwogIH0KICBfX25hbWUoc2VxdWVuY2UsICJzZXF1ZW5jZSIpOwp9Cl9fbmFtZSh0b2tlbml6ZVRoZW1hdGljQnJlYWssICJ0b2tlbml6ZVRoZW1hdGljQnJlYWsiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstY29yZS1jb21tb25tYXJrQDIuMC4zL25vZGVfbW9kdWxlcy9taWNyb21hcmstY29yZS1jb21tb25tYXJrL2xpYi9saXN0LmpzCnZhciBsaXN0MyA9IHsKICBjb250aW51YXRpb246IHsKICAgIHRva2VuaXplOiB0b2tlbml6ZUxpc3RDb250aW51YXRpb24KICB9LAogIGV4aXQ6IHRva2VuaXplTGlzdEVuZCwKICBuYW1lOiAibGlzdCIsCiAgdG9rZW5pemU6IHRva2VuaXplTGlzdFN0YXJ0Cn07CnZhciBsaXN0SXRlbVByZWZpeFdoaXRlc3BhY2VDb25zdHJ1Y3QgPSB7CiAgcGFydGlhbDogdHJ1ZSwKICB0b2tlbml6ZTogdG9rZW5pemVMaXN0SXRlbVByZWZpeFdoaXRlc3BhY2UKfTsKdmFyIGluZGVudENvbnN0cnVjdCA9IHsKICBwYXJ0aWFsOiB0cnVlLAogIHRva2VuaXplOiB0b2tlbml6ZUluZGVudAp9OwpmdW5jdGlvbiB0b2tlbml6ZUxpc3RTdGFydChlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICBjb25zdCB0YWlsID0gc2VsZjIuZXZlbnRzW3NlbGYyLmV2ZW50cy5sZW5ndGggLSAxXTsKICBsZXQgaW5pdGlhbFNpemUgPSB0YWlsICYmIHRhaWxbMV0udHlwZSA9PT0gImxpbmVQcmVmaXgiID8gdGFpbFsyXS5zbGljZVNlcmlhbGl6ZSh0YWlsWzFdLCB0cnVlKS5sZW5ndGggOiAwOwogIGxldCBzaXplID0gMDsKICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIGNvbnN0IGtpbmQgPSBzZWxmMi5jb250YWluZXJTdGF0ZS50eXBlIHx8IChjb2RlNCA9PT0gNDIgfHwgY29kZTQgPT09IDQzIHx8IGNvZGU0ID09PSA0NSA/ICJsaXN0VW5vcmRlcmVkIiA6ICJsaXN0T3JkZXJlZCIpOwogICAgaWYgKGtpbmQgPT09ICJsaXN0VW5vcmRlcmVkIiA/ICFzZWxmMi5jb250YWluZXJTdGF0ZS5tYXJrZXIgfHwgY29kZTQgPT09IHNlbGYyLmNvbnRhaW5lclN0YXRlLm1hcmtlciA6IGFzY2lpRGlnaXQoY29kZTQpKSB7CiAgICAgIGlmICghc2VsZjIuY29udGFpbmVyU3RhdGUudHlwZSkgewogICAgICAgIHNlbGYyLmNvbnRhaW5lclN0YXRlLnR5cGUgPSBraW5kOwogICAgICAgIGVmZmVjdHMuZW50ZXIoa2luZCwgewogICAgICAgICAgX2NvbnRhaW5lcjogdHJ1ZQogICAgICAgIH0pOwogICAgICB9CiAgICAgIGlmIChraW5kID09PSAibGlzdFVub3JkZXJlZCIpIHsKICAgICAgICBlZmZlY3RzLmVudGVyKCJsaXN0SXRlbVByZWZpeCIpOwogICAgICAgIHJldHVybiBjb2RlNCA9PT0gNDIgfHwgY29kZTQgPT09IDQ1ID8gZWZmZWN0cy5jaGVjayh0aGVtYXRpY0JyZWFrMiwgbm9rLCBhdE1hcmtlcikoY29kZTQpIDogYXRNYXJrZXIoY29kZTQpOwogICAgICB9CiAgICAgIGlmICghc2VsZjIuaW50ZXJydXB0IHx8IGNvZGU0ID09PSA0OSkgewogICAgICAgIGVmZmVjdHMuZW50ZXIoImxpc3RJdGVtUHJlZml4Iik7CiAgICAgICAgZWZmZWN0cy5lbnRlcigibGlzdEl0ZW1WYWx1ZSIpOwogICAgICAgIHJldHVybiBpbnNpZGUoY29kZTQpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKHN0YXJ0LCAic3RhcnQiKTsKICBmdW5jdGlvbiBpbnNpZGUoY29kZTQpIHsKICAgIGlmIChhc2NpaURpZ2l0KGNvZGU0KSAmJiArK3NpemUgPCAxMCkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gaW5zaWRlOwogICAgfQogICAgaWYgKCghc2VsZjIuaW50ZXJydXB0IHx8IHNpemUgPCAyKSAmJiAoc2VsZjIuY29udGFpbmVyU3RhdGUubWFya2VyID8gY29kZTQgPT09IHNlbGYyLmNvbnRhaW5lclN0YXRlLm1hcmtlciA6IGNvZGU0ID09PSA0MSB8fCBjb2RlNCA9PT0gNDYpKSB7CiAgICAgIGVmZmVjdHMuZXhpdCgibGlzdEl0ZW1WYWx1ZSIpOwogICAgICByZXR1cm4gYXRNYXJrZXIoY29kZTQpOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZShpbnNpZGUsICJpbnNpZGUiKTsKICBmdW5jdGlvbiBhdE1hcmtlcihjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigibGlzdEl0ZW1NYXJrZXIiKTsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICBlZmZlY3RzLmV4aXQoImxpc3RJdGVtTWFya2VyIik7CiAgICBzZWxmMi5jb250YWluZXJTdGF0ZS5tYXJrZXIgPSBzZWxmMi5jb250YWluZXJTdGF0ZS5tYXJrZXIgfHwgY29kZTQ7CiAgICByZXR1cm4gZWZmZWN0cy5jaGVjaygKICAgICAgYmxhbmtMaW5lLAogICAgICAvLyBDYW7igJl0IGJlIGVtcHR5IHdoZW4gaW50ZXJydXB0aW5nLgogICAgICBzZWxmMi5pbnRlcnJ1cHQgPyBub2sgOiBvbkJsYW5rLAogICAgICBlZmZlY3RzLmF0dGVtcHQobGlzdEl0ZW1QcmVmaXhXaGl0ZXNwYWNlQ29uc3RydWN0LCBlbmRPZlByZWZpeCwgb3RoZXJQcmVmaXgpCiAgICApOwogIH0KICBfX25hbWUoYXRNYXJrZXIsICJhdE1hcmtlciIpOwogIGZ1bmN0aW9uIG9uQmxhbmsoY29kZTQpIHsKICAgIHNlbGYyLmNvbnRhaW5lclN0YXRlLmluaXRpYWxCbGFua0xpbmUgPSB0cnVlOwogICAgaW5pdGlhbFNpemUrKzsKICAgIHJldHVybiBlbmRPZlByZWZpeChjb2RlNCk7CiAgfQogIF9fbmFtZShvbkJsYW5rLCAib25CbGFuayIpOwogIGZ1bmN0aW9uIG90aGVyUHJlZml4KGNvZGU0KSB7CiAgICBpZiAobWFya2Rvd25TcGFjZShjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5lbnRlcigibGlzdEl0ZW1QcmVmaXhXaGl0ZXNwYWNlIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgibGlzdEl0ZW1QcmVmaXhXaGl0ZXNwYWNlIik7CiAgICAgIHJldHVybiBlbmRPZlByZWZpeDsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBfX25hbWUob3RoZXJQcmVmaXgsICJvdGhlclByZWZpeCIpOwogIGZ1bmN0aW9uIGVuZE9mUHJlZml4KGNvZGU0KSB7CiAgICBzZWxmMi5jb250YWluZXJTdGF0ZS5zaXplID0gaW5pdGlhbFNpemUgKyBzZWxmMi5zbGljZVNlcmlhbGl6ZShlZmZlY3RzLmV4aXQoImxpc3RJdGVtUHJlZml4IiksIHRydWUpLmxlbmd0aDsKICAgIHJldHVybiBvazMoY29kZTQpOwogIH0KICBfX25hbWUoZW5kT2ZQcmVmaXgsICJlbmRPZlByZWZpeCIpOwp9Cl9fbmFtZSh0b2tlbml6ZUxpc3RTdGFydCwgInRva2VuaXplTGlzdFN0YXJ0Iik7CmZ1bmN0aW9uIHRva2VuaXplTGlzdENvbnRpbnVhdGlvbihlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICBzZWxmMi5jb250YWluZXJTdGF0ZS5fY2xvc2VGbG93ID0gdm9pZCAwOwogIHJldHVybiBlZmZlY3RzLmNoZWNrKGJsYW5rTGluZSwgb25CbGFuaywgbm90QmxhbmspOwogIGZ1bmN0aW9uIG9uQmxhbmsoY29kZTQpIHsKICAgIHNlbGYyLmNvbnRhaW5lclN0YXRlLmZ1cnRoZXJCbGFua0xpbmVzID0gc2VsZjIuY29udGFpbmVyU3RhdGUuZnVydGhlckJsYW5rTGluZXMgfHwgc2VsZjIuY29udGFpbmVyU3RhdGUuaW5pdGlhbEJsYW5rTGluZTsKICAgIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgb2szLCAibGlzdEl0ZW1JbmRlbnQiLCBzZWxmMi5jb250YWluZXJTdGF0ZS5zaXplICsgMSkoY29kZTQpOwogIH0KICBfX25hbWUob25CbGFuaywgIm9uQmxhbmsiKTsKICBmdW5jdGlvbiBub3RCbGFuayhjb2RlNCkgewogICAgaWYgKHNlbGYyLmNvbnRhaW5lclN0YXRlLmZ1cnRoZXJCbGFua0xpbmVzIHx8ICFtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICBzZWxmMi5jb250YWluZXJTdGF0ZS5mdXJ0aGVyQmxhbmtMaW5lcyA9IHZvaWQgMDsKICAgICAgc2VsZjIuY29udGFpbmVyU3RhdGUuaW5pdGlhbEJsYW5rTGluZSA9IHZvaWQgMDsKICAgICAgcmV0dXJuIG5vdEluQ3VycmVudEl0ZW0oY29kZTQpOwogICAgfQogICAgc2VsZjIuY29udGFpbmVyU3RhdGUuZnVydGhlckJsYW5rTGluZXMgPSB2b2lkIDA7CiAgICBzZWxmMi5jb250YWluZXJTdGF0ZS5pbml0aWFsQmxhbmtMaW5lID0gdm9pZCAwOwogICAgcmV0dXJuIGVmZmVjdHMuYXR0ZW1wdChpbmRlbnRDb25zdHJ1Y3QsIG9rMywgbm90SW5DdXJyZW50SXRlbSkoY29kZTQpOwogIH0KICBfX25hbWUobm90QmxhbmssICJub3RCbGFuayIpOwogIGZ1bmN0aW9uIG5vdEluQ3VycmVudEl0ZW0oY29kZTQpIHsKICAgIHNlbGYyLmNvbnRhaW5lclN0YXRlLl9jbG9zZUZsb3cgPSB0cnVlOwogICAgc2VsZjIuaW50ZXJydXB0ID0gdm9pZCAwOwogICAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBlZmZlY3RzLmF0dGVtcHQobGlzdDMsIG9rMywgbm9rKSwgImxpbmVQcmVmaXgiLCBzZWxmMi5wYXJzZXIuY29uc3RydWN0cy5kaXNhYmxlLm51bGwuaW5jbHVkZXMoImNvZGVJbmRlbnRlZCIpID8gdm9pZCAwIDogNCkoY29kZTQpOwogIH0KICBfX25hbWUobm90SW5DdXJyZW50SXRlbSwgIm5vdEluQ3VycmVudEl0ZW0iKTsKfQpfX25hbWUodG9rZW5pemVMaXN0Q29udGludWF0aW9uLCAidG9rZW5pemVMaXN0Q29udGludWF0aW9uIik7CmZ1bmN0aW9uIHRva2VuaXplSW5kZW50KGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgYWZ0ZXJQcmVmaXgsICJsaXN0SXRlbUluZGVudCIsIHNlbGYyLmNvbnRhaW5lclN0YXRlLnNpemUgKyAxKTsKICBmdW5jdGlvbiBhZnRlclByZWZpeChjb2RlNCkgewogICAgY29uc3QgdGFpbCA9IHNlbGYyLmV2ZW50c1tzZWxmMi5ldmVudHMubGVuZ3RoIC0gMV07CiAgICByZXR1cm4gdGFpbCAmJiB0YWlsWzFdLnR5cGUgPT09ICJsaXN0SXRlbUluZGVudCIgJiYgdGFpbFsyXS5zbGljZVNlcmlhbGl6ZSh0YWlsWzFdLCB0cnVlKS5sZW5ndGggPT09IHNlbGYyLmNvbnRhaW5lclN0YXRlLnNpemUgPyBvazMoY29kZTQpIDogbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKGFmdGVyUHJlZml4LCAiYWZ0ZXJQcmVmaXgiKTsKfQpfX25hbWUodG9rZW5pemVJbmRlbnQsICJ0b2tlbml6ZUluZGVudCIpOwpmdW5jdGlvbiB0b2tlbml6ZUxpc3RFbmQoZWZmZWN0cykgewogIGVmZmVjdHMuZXhpdCh0aGlzLmNvbnRhaW5lclN0YXRlLnR5cGUpOwp9Cl9fbmFtZSh0b2tlbml6ZUxpc3RFbmQsICJ0b2tlbml6ZUxpc3RFbmQiKTsKZnVuY3Rpb24gdG9rZW5pemVMaXN0SXRlbVByZWZpeFdoaXRlc3BhY2UoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBhZnRlclByZWZpeCwgImxpc3RJdGVtUHJlZml4V2hpdGVzcGFjZSIsIHNlbGYyLnBhcnNlci5jb25zdHJ1Y3RzLmRpc2FibGUubnVsbC5pbmNsdWRlcygiY29kZUluZGVudGVkIikgPyB2b2lkIDAgOiA0ICsgMSk7CiAgZnVuY3Rpb24gYWZ0ZXJQcmVmaXgoY29kZTQpIHsKICAgIGNvbnN0IHRhaWwgPSBzZWxmMi5ldmVudHNbc2VsZjIuZXZlbnRzLmxlbmd0aCAtIDFdOwogICAgcmV0dXJuICFtYXJrZG93blNwYWNlKGNvZGU0KSAmJiB0YWlsICYmIHRhaWxbMV0udHlwZSA9PT0gImxpc3RJdGVtUHJlZml4V2hpdGVzcGFjZSIgPyBvazMoY29kZTQpIDogbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKGFmdGVyUHJlZml4LCAiYWZ0ZXJQcmVmaXgiKTsKfQpfX25hbWUodG9rZW5pemVMaXN0SXRlbVByZWZpeFdoaXRlc3BhY2UsICJ0b2tlbml6ZUxpc3RJdGVtUHJlZml4V2hpdGVzcGFjZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL3NldGV4dC11bmRlcmxpbmUuanMKdmFyIHNldGV4dFVuZGVybGluZSA9IHsKICBuYW1lOiAic2V0ZXh0VW5kZXJsaW5lIiwKICByZXNvbHZlVG86IHJlc29sdmVUb1NldGV4dFVuZGVybGluZSwKICB0b2tlbml6ZTogdG9rZW5pemVTZXRleHRVbmRlcmxpbmUKfTsKZnVuY3Rpb24gcmVzb2x2ZVRvU2V0ZXh0VW5kZXJsaW5lKGV2ZW50cywgY29udGV4dDIpIHsKICBsZXQgaW5kZXgyID0gZXZlbnRzLmxlbmd0aDsKICBsZXQgY29udGVudDM7CiAgbGV0IHRleHQ4OwogIGxldCBkZWZpbml0aW9uMzsKICB3aGlsZSAoaW5kZXgyLS0pIHsKICAgIGlmIChldmVudHNbaW5kZXgyXVswXSA9PT0gImVudGVyIikgewogICAgICBpZiAoZXZlbnRzW2luZGV4Ml1bMV0udHlwZSA9PT0gImNvbnRlbnQiKSB7CiAgICAgICAgY29udGVudDMgPSBpbmRleDI7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKGV2ZW50c1tpbmRleDJdWzFdLnR5cGUgPT09ICJwYXJhZ3JhcGgiKSB7CiAgICAgICAgdGV4dDggPSBpbmRleDI7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmIChldmVudHNbaW5kZXgyXVsxXS50eXBlID09PSAiY29udGVudCIpIHsKICAgICAgICBldmVudHMuc3BsaWNlKGluZGV4MiwgMSk7CiAgICAgIH0KICAgICAgaWYgKCFkZWZpbml0aW9uMyAmJiBldmVudHNbaW5kZXgyXVsxXS50eXBlID09PSAiZGVmaW5pdGlvbiIpIHsKICAgICAgICBkZWZpbml0aW9uMyA9IGluZGV4MjsKICAgICAgfQogICAgfQogIH0KICBjb25zdCBoZWFkaW5nMyA9IHsKICAgIHR5cGU6ICJzZXRleHRIZWFkaW5nIiwKICAgIHN0YXJ0OiB7CiAgICAgIC4uLmV2ZW50c1tjb250ZW50M11bMV0uc3RhcnQKICAgIH0sCiAgICBlbmQ6IHsKICAgICAgLi4uZXZlbnRzW2V2ZW50cy5sZW5ndGggLSAxXVsxXS5lbmQKICAgIH0KICB9OwogIGV2ZW50c1t0ZXh0OF1bMV0udHlwZSA9ICJzZXRleHRIZWFkaW5nVGV4dCI7CiAgaWYgKGRlZmluaXRpb24zKSB7CiAgICBldmVudHMuc3BsaWNlKHRleHQ4LCAwLCBbImVudGVyIiwgaGVhZGluZzMsIGNvbnRleHQyXSk7CiAgICBldmVudHMuc3BsaWNlKGRlZmluaXRpb24zICsgMSwgMCwgWyJleGl0IiwgZXZlbnRzW2NvbnRlbnQzXVsxXSwgY29udGV4dDJdKTsKICAgIGV2ZW50c1tjb250ZW50M11bMV0uZW5kID0gewogICAgICAuLi5ldmVudHNbZGVmaW5pdGlvbjNdWzFdLmVuZAogICAgfTsKICB9IGVsc2UgewogICAgZXZlbnRzW2NvbnRlbnQzXVsxXSA9IGhlYWRpbmczOwogIH0KICBldmVudHMucHVzaChbImV4aXQiLCBoZWFkaW5nMywgY29udGV4dDJdKTsKICByZXR1cm4gZXZlbnRzOwp9Cl9fbmFtZShyZXNvbHZlVG9TZXRleHRVbmRlcmxpbmUsICJyZXNvbHZlVG9TZXRleHRVbmRlcmxpbmUiKTsKZnVuY3Rpb24gdG9rZW5pemVTZXRleHRVbmRlcmxpbmUoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgbGV0IG1hcmtlcjsKICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIGxldCBpbmRleDIgPSBzZWxmMi5ldmVudHMubGVuZ3RoOwogICAgbGV0IHBhcmFncmFwaDM7CiAgICB3aGlsZSAoaW5kZXgyLS0pIHsKICAgICAgaWYgKHNlbGYyLmV2ZW50c1tpbmRleDJdWzFdLnR5cGUgIT09ICJsaW5lRW5kaW5nIiAmJiBzZWxmMi5ldmVudHNbaW5kZXgyXVsxXS50eXBlICE9PSAibGluZVByZWZpeCIgJiYgc2VsZjIuZXZlbnRzW2luZGV4Ml1bMV0udHlwZSAhPT0gImNvbnRlbnQiKSB7CiAgICAgICAgcGFyYWdyYXBoMyA9IHNlbGYyLmV2ZW50c1tpbmRleDJdWzFdLnR5cGUgPT09ICJwYXJhZ3JhcGgiOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBpZiAoIXNlbGYyLnBhcnNlci5sYXp5W3NlbGYyLm5vdygpLmxpbmVdICYmIChzZWxmMi5pbnRlcnJ1cHQgfHwgcGFyYWdyYXBoMykpIHsKICAgICAgZWZmZWN0cy5lbnRlcigic2V0ZXh0SGVhZGluZ0xpbmUiKTsKICAgICAgbWFya2VyID0gY29kZTQ7CiAgICAgIHJldHVybiBiZWZvcmUoY29kZTQpOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZShzdGFydCwgInN0YXJ0Iik7CiAgZnVuY3Rpb24gYmVmb3JlKGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJzZXRleHRIZWFkaW5nTGluZVNlcXVlbmNlIik7CiAgICByZXR1cm4gaW5zaWRlKGNvZGU0KTsKICB9CiAgX19uYW1lKGJlZm9yZSwgImJlZm9yZSIpOwogIGZ1bmN0aW9uIGluc2lkZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBtYXJrZXIpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGluc2lkZTsKICAgIH0KICAgIGVmZmVjdHMuZXhpdCgic2V0ZXh0SGVhZGluZ0xpbmVTZXF1ZW5jZSIpOwogICAgcmV0dXJuIG1hcmtkb3duU3BhY2UoY29kZTQpID8gZmFjdG9yeVNwYWNlKGVmZmVjdHMsIGFmdGVyLCAibGluZVN1ZmZpeCIpKGNvZGU0KSA6IGFmdGVyKGNvZGU0KTsKICB9CiAgX19uYW1lKGluc2lkZSwgImluc2lkZSIpOwogIGZ1bmN0aW9uIGFmdGVyKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmV4aXQoInNldGV4dEhlYWRpbmdMaW5lIik7CiAgICAgIHJldHVybiBvazMoY29kZTQpOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZShhZnRlciwgImFmdGVyIik7Cn0KX19uYW1lKHRva2VuaXplU2V0ZXh0VW5kZXJsaW5lLCAidG9rZW5pemVTZXRleHRVbmRlcmxpbmUiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS1mb290bm90ZUAyLjEuMC9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tZm9vdG5vdGUvbGliL3N5bnRheC5qcwp2YXIgaW5kZW50MiA9IHsKICB0b2tlbml6ZTogdG9rZW5pemVJbmRlbnQyLAogIHBhcnRpYWw6IHRydWUKfTsKZnVuY3Rpb24gZ2ZtRm9vdG5vdGUoKSB7CiAgcmV0dXJuIHsKICAgIGRvY3VtZW50OiB7CiAgICAgIFs5MV06IHsKICAgICAgICBuYW1lOiAiZ2ZtRm9vdG5vdGVEZWZpbml0aW9uIiwKICAgICAgICB0b2tlbml6ZTogdG9rZW5pemVEZWZpbml0aW9uU3RhcnQsCiAgICAgICAgY29udGludWF0aW9uOiB7CiAgICAgICAgICB0b2tlbml6ZTogdG9rZW5pemVEZWZpbml0aW9uQ29udGludWF0aW9uCiAgICAgICAgfSwKICAgICAgICBleGl0OiBnZm1Gb290bm90ZURlZmluaXRpb25FbmQKICAgICAgfQogICAgfSwKICAgIHRleHQ6IHsKICAgICAgWzkxXTogewogICAgICAgIG5hbWU6ICJnZm1Gb290bm90ZUNhbGwiLAogICAgICAgIHRva2VuaXplOiB0b2tlbml6ZUdmbUZvb3Rub3RlQ2FsbAogICAgICB9LAogICAgICBbOTNdOiB7CiAgICAgICAgbmFtZTogImdmbVBvdGVudGlhbEZvb3Rub3RlQ2FsbCIsCiAgICAgICAgYWRkOiAiYWZ0ZXIiLAogICAgICAgIHRva2VuaXplOiB0b2tlbml6ZVBvdGVudGlhbEdmbUZvb3Rub3RlQ2FsbCwKICAgICAgICByZXNvbHZlVG86IHJlc29sdmVUb1BvdGVudGlhbEdmbUZvb3Rub3RlQ2FsbAogICAgICB9CiAgICB9CiAgfTsKfQpfX25hbWUoZ2ZtRm9vdG5vdGUsICJnZm1Gb290bm90ZSIpOwpmdW5jdGlvbiB0b2tlbml6ZVBvdGVudGlhbEdmbUZvb3Rub3RlQ2FsbChlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICBsZXQgaW5kZXgyID0gc2VsZjIuZXZlbnRzLmxlbmd0aDsKICBjb25zdCBkZWZpbmVkID0gc2VsZjIucGFyc2VyLmdmbUZvb3Rub3RlcyB8fCAoc2VsZjIucGFyc2VyLmdmbUZvb3Rub3RlcyA9IFtdKTsKICBsZXQgbGFiZWxTdGFydDsKICB3aGlsZSAoaW5kZXgyLS0pIHsKICAgIGNvbnN0IHRva2VuID0gc2VsZjIuZXZlbnRzW2luZGV4Ml1bMV07CiAgICBpZiAodG9rZW4udHlwZSA9PT0gImxhYmVsSW1hZ2UiKSB7CiAgICAgIGxhYmVsU3RhcnQgPSB0b2tlbjsKICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAodG9rZW4udHlwZSA9PT0gImdmbUZvb3Rub3RlQ2FsbCIgfHwgdG9rZW4udHlwZSA9PT0gImxhYmVsTGluayIgfHwgdG9rZW4udHlwZSA9PT0gImxhYmVsIiB8fCB0b2tlbi50eXBlID09PSAiaW1hZ2UiIHx8IHRva2VuLnR5cGUgPT09ICJsaW5rIikgewogICAgICBicmVhazsKICAgIH0KICB9CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBpZiAoIWxhYmVsU3RhcnQgfHwgIWxhYmVsU3RhcnQuX2JhbGFuY2VkKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgY29uc3QgaWQgPSBub3JtYWxpemVJZGVudGlmaWVyKHNlbGYyLnNsaWNlU2VyaWFsaXplKHsKICAgICAgc3RhcnQ6IGxhYmVsU3RhcnQuZW5kLAogICAgICBlbmQ6IHNlbGYyLm5vdygpCiAgICB9KSk7CiAgICBpZiAoaWQuY29kZVBvaW50QXQoMCkgIT09IDk0IHx8ICFkZWZpbmVkLmluY2x1ZGVzKGlkLnNsaWNlKDEpKSkgewogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuZW50ZXIoImdmbUZvb3Rub3RlQ2FsbExhYmVsTWFya2VyIik7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgZWZmZWN0cy5leGl0KCJnZm1Gb290bm90ZUNhbGxMYWJlbE1hcmtlciIpOwogICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgfQogIF9fbmFtZShzdGFydCwgInN0YXJ0Iik7Cn0KX19uYW1lKHRva2VuaXplUG90ZW50aWFsR2ZtRm9vdG5vdGVDYWxsLCAidG9rZW5pemVQb3RlbnRpYWxHZm1Gb290bm90ZUNhbGwiKTsKZnVuY3Rpb24gcmVzb2x2ZVRvUG90ZW50aWFsR2ZtRm9vdG5vdGVDYWxsKGV2ZW50cywgY29udGV4dDIpIHsKICBsZXQgaW5kZXgyID0gZXZlbnRzLmxlbmd0aDsKICBsZXQgbGFiZWxTdGFydDsKICB3aGlsZSAoaW5kZXgyLS0pIHsKICAgIGlmIChldmVudHNbaW5kZXgyXVsxXS50eXBlID09PSAibGFiZWxJbWFnZSIgJiYgZXZlbnRzW2luZGV4Ml1bMF0gPT09ICJlbnRlciIpIHsKICAgICAgbGFiZWxTdGFydCA9IGV2ZW50c1tpbmRleDJdWzFdOwogICAgICBicmVhazsKICAgIH0KICB9CiAgZXZlbnRzW2luZGV4MiArIDFdWzFdLnR5cGUgPSAiZGF0YSI7CiAgZXZlbnRzW2luZGV4MiArIDNdWzFdLnR5cGUgPSAiZ2ZtRm9vdG5vdGVDYWxsTGFiZWxNYXJrZXIiOwogIGNvbnN0IGNhbGwgPSB7CiAgICB0eXBlOiAiZ2ZtRm9vdG5vdGVDYWxsIiwKICAgIHN0YXJ0OiBPYmplY3QuYXNzaWduKHt9LCBldmVudHNbaW5kZXgyICsgM11bMV0uc3RhcnQpLAogICAgZW5kOiBPYmplY3QuYXNzaWduKHt9LCBldmVudHNbZXZlbnRzLmxlbmd0aCAtIDFdWzFdLmVuZCkKICB9OwogIGNvbnN0IG1hcmtlciA9IHsKICAgIHR5cGU6ICJnZm1Gb290bm90ZUNhbGxNYXJrZXIiLAogICAgc3RhcnQ6IE9iamVjdC5hc3NpZ24oe30sIGV2ZW50c1tpbmRleDIgKyAzXVsxXS5lbmQpLAogICAgZW5kOiBPYmplY3QuYXNzaWduKHt9LCBldmVudHNbaW5kZXgyICsgM11bMV0uZW5kKQogIH07CiAgbWFya2VyLmVuZC5jb2x1bW4rKzsKICBtYXJrZXIuZW5kLm9mZnNldCsrOwogIG1hcmtlci5lbmQuX2J1ZmZlckluZGV4Kys7CiAgY29uc3Qgc3RyaW5nMyA9IHsKICAgIHR5cGU6ICJnZm1Gb290bm90ZUNhbGxTdHJpbmciLAogICAgc3RhcnQ6IE9iamVjdC5hc3NpZ24oe30sIG1hcmtlci5lbmQpLAogICAgZW5kOiBPYmplY3QuYXNzaWduKHt9LCBldmVudHNbZXZlbnRzLmxlbmd0aCAtIDFdWzFdLnN0YXJ0KQogIH07CiAgY29uc3QgY2h1bmsgPSB7CiAgICB0eXBlOiAiY2h1bmtTdHJpbmciLAogICAgY29udGVudFR5cGU6ICJzdHJpbmciLAogICAgc3RhcnQ6IE9iamVjdC5hc3NpZ24oe30sIHN0cmluZzMuc3RhcnQpLAogICAgZW5kOiBPYmplY3QuYXNzaWduKHt9LCBzdHJpbmczLmVuZCkKICB9OwogIGNvbnN0IHJlcGxhY2VtZW50ID0gWwogICAgLy8gVGFrZSB0aGUgYGxhYmVsSW1hZ2VNYXJrZXJgIChub3cgYGRhdGFgLCB0aGUgYCFgKQogICAgZXZlbnRzW2luZGV4MiArIDFdLAogICAgZXZlbnRzW2luZGV4MiArIDJdLAogICAgWyJlbnRlciIsIGNhbGwsIGNvbnRleHQyXSwKICAgIC8vIFRoZSBgW2AKICAgIGV2ZW50c1tpbmRleDIgKyAzXSwKICAgIGV2ZW50c1tpbmRleDIgKyA0XSwKICAgIC8vIFRoZSBgXmAuCiAgICBbImVudGVyIiwgbWFya2VyLCBjb250ZXh0Ml0sCiAgICBbImV4aXQiLCBtYXJrZXIsIGNvbnRleHQyXSwKICAgIC8vIEV2ZXJ5dGhpbmcgaW4gYmV0d2Vlbi4KICAgIFsiZW50ZXIiLCBzdHJpbmczLCBjb250ZXh0Ml0sCiAgICBbImVudGVyIiwgY2h1bmssIGNvbnRleHQyXSwKICAgIFsiZXhpdCIsIGNodW5rLCBjb250ZXh0Ml0sCiAgICBbImV4aXQiLCBzdHJpbmczLCBjb250ZXh0Ml0sCiAgICAvLyBUaGUgZW5kaW5nIChgXWAsIHByb3Blcmx5IHBhcnNlZCBhbmQgbGFiZWxsZWQpLgogICAgZXZlbnRzW2V2ZW50cy5sZW5ndGggLSAyXSwKICAgIGV2ZW50c1tldmVudHMubGVuZ3RoIC0gMV0sCiAgICBbImV4aXQiLCBjYWxsLCBjb250ZXh0Ml0KICBdOwogIGV2ZW50cy5zcGxpY2UoaW5kZXgyLCBldmVudHMubGVuZ3RoIC0gaW5kZXgyICsgMSwgLi4ucmVwbGFjZW1lbnQpOwogIHJldHVybiBldmVudHM7Cn0KX19uYW1lKHJlc29sdmVUb1BvdGVudGlhbEdmbUZvb3Rub3RlQ2FsbCwgInJlc29sdmVUb1BvdGVudGlhbEdmbUZvb3Rub3RlQ2FsbCIpOwpmdW5jdGlvbiB0b2tlbml6ZUdmbUZvb3Rub3RlQ2FsbChlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICBjb25zdCBkZWZpbmVkID0gc2VsZjIucGFyc2VyLmdmbUZvb3Rub3RlcyB8fCAoc2VsZjIucGFyc2VyLmdmbUZvb3Rub3RlcyA9IFtdKTsKICBsZXQgc2l6ZSA9IDA7CiAgbGV0IGRhdGE7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJnZm1Gb290bm90ZUNhbGwiKTsKICAgIGVmZmVjdHMuZW50ZXIoImdmbUZvb3Rub3RlQ2FsbExhYmVsTWFya2VyIik7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgZWZmZWN0cy5leGl0KCJnZm1Gb290bm90ZUNhbGxMYWJlbE1hcmtlciIpOwogICAgcmV0dXJuIGNhbGxTdGFydDsKICB9CiAgX19uYW1lKHN0YXJ0LCAic3RhcnQiKTsKICBmdW5jdGlvbiBjYWxsU3RhcnQoY29kZTQpIHsKICAgIGlmIChjb2RlNCAhPT0gOTQpIHJldHVybiBub2soY29kZTQpOwogICAgZWZmZWN0cy5lbnRlcigiZ2ZtRm9vdG5vdGVDYWxsTWFya2VyIik7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgZWZmZWN0cy5leGl0KCJnZm1Gb290bm90ZUNhbGxNYXJrZXIiKTsKICAgIGVmZmVjdHMuZW50ZXIoImdmbUZvb3Rub3RlQ2FsbFN0cmluZyIpOwogICAgZWZmZWN0cy5lbnRlcigiY2h1bmtTdHJpbmciKS5jb250ZW50VHlwZSA9ICJzdHJpbmciOwogICAgcmV0dXJuIGNhbGxEYXRhOwogIH0KICBfX25hbWUoY2FsbFN0YXJ0LCAiY2FsbFN0YXJ0Iik7CiAgZnVuY3Rpb24gY2FsbERhdGEoY29kZTQpIHsKICAgIGlmICgKICAgICAgLy8gVG9vIGxvbmcuCiAgICAgIHNpemUgPiA5OTkgfHwgLy8gQ2xvc2luZyBicmFjZSB3aXRoIG5vdGhpbmcuCiAgICAgIGNvZGU0ID09PSA5MyAmJiAhZGF0YSB8fCAvLyBTcGFjZSBvciB0YWIgaXMgbm90IHN1cHBvcnRlZCBieSBHRk0gZm9yIHNvbWUgcmVhc29uLgogICAgICAvLyBgXG5gIGFuZCBgW2Agbm90IGJlaW5nIHN1cHBvcnRlZCBtYWtlcyBzZW5zZS4KICAgICAgY29kZTQgPT09IG51bGwgfHwgY29kZTQgPT09IDkxIHx8IG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpCiAgICApIHsKICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDkzKSB7CiAgICAgIGVmZmVjdHMuZXhpdCgiY2h1bmtTdHJpbmciKTsKICAgICAgY29uc3QgdG9rZW4gPSBlZmZlY3RzLmV4aXQoImdmbUZvb3Rub3RlQ2FsbFN0cmluZyIpOwogICAgICBpZiAoIWRlZmluZWQuaW5jbHVkZXMobm9ybWFsaXplSWRlbnRpZmllcihzZWxmMi5zbGljZVNlcmlhbGl6ZSh0b2tlbikpKSkgewogICAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgICB9CiAgICAgIGVmZmVjdHMuZW50ZXIoImdmbUZvb3Rub3RlQ2FsbExhYmVsTWFya2VyIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgiZ2ZtRm9vdG5vdGVDYWxsTGFiZWxNYXJrZXIiKTsKICAgICAgZWZmZWN0cy5leGl0KCJnZm1Gb290bm90ZUNhbGwiKTsKICAgICAgcmV0dXJuIG9rMzsKICAgIH0KICAgIGlmICghbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlNCkpIHsKICAgICAgZGF0YSA9IHRydWU7CiAgICB9CiAgICBzaXplKys7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIGNvZGU0ID09PSA5MiA/IGNhbGxFc2NhcGUgOiBjYWxsRGF0YTsKICB9CiAgX19uYW1lKGNhbGxEYXRhLCAiY2FsbERhdGEiKTsKICBmdW5jdGlvbiBjYWxsRXNjYXBlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDkxIHx8IGNvZGU0ID09PSA5MiB8fCBjb2RlNCA9PT0gOTMpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgc2l6ZSsrOwogICAgICByZXR1cm4gY2FsbERhdGE7CiAgICB9CiAgICByZXR1cm4gY2FsbERhdGEoY29kZTQpOwogIH0KICBfX25hbWUoY2FsbEVzY2FwZSwgImNhbGxFc2NhcGUiKTsKfQpfX25hbWUodG9rZW5pemVHZm1Gb290bm90ZUNhbGwsICJ0b2tlbml6ZUdmbUZvb3Rub3RlQ2FsbCIpOwpmdW5jdGlvbiB0b2tlbml6ZURlZmluaXRpb25TdGFydChlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICBjb25zdCBkZWZpbmVkID0gc2VsZjIucGFyc2VyLmdmbUZvb3Rub3RlcyB8fCAoc2VsZjIucGFyc2VyLmdmbUZvb3Rub3RlcyA9IFtdKTsKICBsZXQgaWRlbnRpZmllcjsKICBsZXQgc2l6ZSA9IDA7CiAgbGV0IGRhdGE7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJnZm1Gb290bm90ZURlZmluaXRpb24iKS5fY29udGFpbmVyID0gdHJ1ZTsKICAgIGVmZmVjdHMuZW50ZXIoImdmbUZvb3Rub3RlRGVmaW5pdGlvbkxhYmVsIik7CiAgICBlZmZlY3RzLmVudGVyKCJnZm1Gb290bm90ZURlZmluaXRpb25MYWJlbE1hcmtlciIpOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIGVmZmVjdHMuZXhpdCgiZ2ZtRm9vdG5vdGVEZWZpbml0aW9uTGFiZWxNYXJrZXIiKTsKICAgIHJldHVybiBsYWJlbEF0TWFya2VyOwogIH0KICBfX25hbWUoc3RhcnQsICJzdGFydCIpOwogIGZ1bmN0aW9uIGxhYmVsQXRNYXJrZXIoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gOTQpIHsKICAgICAgZWZmZWN0cy5lbnRlcigiZ2ZtRm9vdG5vdGVEZWZpbml0aW9uTWFya2VyIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgiZ2ZtRm9vdG5vdGVEZWZpbml0aW9uTWFya2VyIik7CiAgICAgIGVmZmVjdHMuZW50ZXIoImdmbUZvb3Rub3RlRGVmaW5pdGlvbkxhYmVsU3RyaW5nIik7CiAgICAgIGVmZmVjdHMuZW50ZXIoImNodW5rU3RyaW5nIikuY29udGVudFR5cGUgPSAic3RyaW5nIjsKICAgICAgcmV0dXJuIGxhYmVsSW5zaWRlOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZShsYWJlbEF0TWFya2VyLCAibGFiZWxBdE1hcmtlciIpOwogIGZ1bmN0aW9uIGxhYmVsSW5zaWRlKGNvZGU0KSB7CiAgICBpZiAoCiAgICAgIC8vIFRvbyBsb25nLgogICAgICBzaXplID4gOTk5IHx8IC8vIENsb3NpbmcgYnJhY2Ugd2l0aCBub3RoaW5nLgogICAgICBjb2RlNCA9PT0gOTMgJiYgIWRhdGEgfHwgLy8gU3BhY2Ugb3IgdGFiIGlzIG5vdCBzdXBwb3J0ZWQgYnkgR0ZNIGZvciBzb21lIHJlYXNvbi4KICAgICAgLy8gYFxuYCBhbmQgYFtgIG5vdCBiZWluZyBzdXBwb3J0ZWQgbWFrZXMgc2Vuc2UuCiAgICAgIGNvZGU0ID09PSBudWxsIHx8IGNvZGU0ID09PSA5MSB8fCBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlKGNvZGU0KQogICAgKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA5MykgewogICAgICBlZmZlY3RzLmV4aXQoImNodW5rU3RyaW5nIik7CiAgICAgIGNvbnN0IHRva2VuID0gZWZmZWN0cy5leGl0KCJnZm1Gb290bm90ZURlZmluaXRpb25MYWJlbFN0cmluZyIpOwogICAgICBpZGVudGlmaWVyID0gbm9ybWFsaXplSWRlbnRpZmllcihzZWxmMi5zbGljZVNlcmlhbGl6ZSh0b2tlbikpOwogICAgICBlZmZlY3RzLmVudGVyKCJnZm1Gb290bm90ZURlZmluaXRpb25MYWJlbE1hcmtlciIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoImdmbUZvb3Rub3RlRGVmaW5pdGlvbkxhYmVsTWFya2VyIik7CiAgICAgIGVmZmVjdHMuZXhpdCgiZ2ZtRm9vdG5vdGVEZWZpbml0aW9uTGFiZWwiKTsKICAgICAgcmV0dXJuIGxhYmVsQWZ0ZXI7CiAgICB9CiAgICBpZiAoIW1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpKSB7CiAgICAgIGRhdGEgPSB0cnVlOwogICAgfQogICAgc2l6ZSsrOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBjb2RlNCA9PT0gOTIgPyBsYWJlbEVzY2FwZSA6IGxhYmVsSW5zaWRlOwogIH0KICBfX25hbWUobGFiZWxJbnNpZGUsICJsYWJlbEluc2lkZSIpOwogIGZ1bmN0aW9uIGxhYmVsRXNjYXBlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDkxIHx8IGNvZGU0ID09PSA5MiB8fCBjb2RlNCA9PT0gOTMpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgc2l6ZSsrOwogICAgICByZXR1cm4gbGFiZWxJbnNpZGU7CiAgICB9CiAgICByZXR1cm4gbGFiZWxJbnNpZGUoY29kZTQpOwogIH0KICBfX25hbWUobGFiZWxFc2NhcGUsICJsYWJlbEVzY2FwZSIpOwogIGZ1bmN0aW9uIGxhYmVsQWZ0ZXIoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNTgpIHsKICAgICAgZWZmZWN0cy5lbnRlcigiZGVmaW5pdGlvbk1hcmtlciIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoImRlZmluaXRpb25NYXJrZXIiKTsKICAgICAgaWYgKCFkZWZpbmVkLmluY2x1ZGVzKGlkZW50aWZpZXIpKSB7CiAgICAgICAgZGVmaW5lZC5wdXNoKGlkZW50aWZpZXIpOwogICAgICB9CiAgICAgIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgd2hpdGVzcGFjZUFmdGVyLCAiZ2ZtRm9vdG5vdGVEZWZpbml0aW9uV2hpdGVzcGFjZSIpOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZShsYWJlbEFmdGVyLCAibGFiZWxBZnRlciIpOwogIGZ1bmN0aW9uIHdoaXRlc3BhY2VBZnRlcihjb2RlNCkgewogICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgfQogIF9fbmFtZSh3aGl0ZXNwYWNlQWZ0ZXIsICJ3aGl0ZXNwYWNlQWZ0ZXIiKTsKfQpfX25hbWUodG9rZW5pemVEZWZpbml0aW9uU3RhcnQsICJ0b2tlbml6ZURlZmluaXRpb25TdGFydCIpOwpmdW5jdGlvbiB0b2tlbml6ZURlZmluaXRpb25Db250aW51YXRpb24oZWZmZWN0cywgb2szLCBub2spIHsKICByZXR1cm4gZWZmZWN0cy5jaGVjayhibGFua0xpbmUsIG9rMywgZWZmZWN0cy5hdHRlbXB0KGluZGVudDIsIG9rMywgbm9rKSk7Cn0KX19uYW1lKHRva2VuaXplRGVmaW5pdGlvbkNvbnRpbnVhdGlvbiwgInRva2VuaXplRGVmaW5pdGlvbkNvbnRpbnVhdGlvbiIpOwpmdW5jdGlvbiBnZm1Gb290bm90ZURlZmluaXRpb25FbmQoZWZmZWN0cykgewogIGVmZmVjdHMuZXhpdCgiZ2ZtRm9vdG5vdGVEZWZpbml0aW9uIik7Cn0KX19uYW1lKGdmbUZvb3Rub3RlRGVmaW5pdGlvbkVuZCwgImdmbUZvb3Rub3RlRGVmaW5pdGlvbkVuZCIpOwpmdW5jdGlvbiB0b2tlbml6ZUluZGVudDIoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBhZnRlclByZWZpeCwgImdmbUZvb3Rub3RlRGVmaW5pdGlvbkluZGVudCIsIDQgKyAxKTsKICBmdW5jdGlvbiBhZnRlclByZWZpeChjb2RlNCkgewogICAgY29uc3QgdGFpbCA9IHNlbGYyLmV2ZW50c1tzZWxmMi5ldmVudHMubGVuZ3RoIC0gMV07CiAgICByZXR1cm4gdGFpbCAmJiB0YWlsWzFdLnR5cGUgPT09ICJnZm1Gb290bm90ZURlZmluaXRpb25JbmRlbnQiICYmIHRhaWxbMl0uc2xpY2VTZXJpYWxpemUodGFpbFsxXSwgdHJ1ZSkubGVuZ3RoID09PSA0ID8gb2szKGNvZGU0KSA6IG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZShhZnRlclByZWZpeCwgImFmdGVyUHJlZml4Iik7Cn0KX19uYW1lKHRva2VuaXplSW5kZW50MiwgInRva2VuaXplSW5kZW50Iik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tZm9vdG5vdGVAMi4xLjAvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLWZvb3Rub3RlL2xpYi9odG1sLmpzCnZhciBvd240ID0ge30uaGFzT3duUHJvcGVydHk7CnZhciBlbXB0eU9wdGlvbnMyID0ge307CmZ1bmN0aW9uIGRlZmF1bHRCYWNrTGFiZWwocmVmZXJlbmNlSW5kZXgsIHJlcmVmZXJlbmNlSW5kZXgpIHsKICByZXR1cm4gIkJhY2sgdG8gcmVmZXJlbmNlICIgKyAocmVmZXJlbmNlSW5kZXggKyAxKSArIChyZXJlZmVyZW5jZUluZGV4ID4gMSA/ICItIiArIHJlcmVmZXJlbmNlSW5kZXggOiAiIik7Cn0KX19uYW1lKGRlZmF1bHRCYWNrTGFiZWwsICJkZWZhdWx0QmFja0xhYmVsIik7CmZ1bmN0aW9uIGdmbUZvb3Rub3RlSHRtbChvcHRpb25zKSB7CiAgY29uc3QgY29uZmlnMiA9IG9wdGlvbnMgfHwgZW1wdHlPcHRpb25zMjsKICBjb25zdCBsYWJlbCA9IGNvbmZpZzIubGFiZWwgfHwgIkZvb3Rub3RlcyI7CiAgY29uc3QgbGFiZWxUYWdOYW1lID0gY29uZmlnMi5sYWJlbFRhZ05hbWUgfHwgImgyIjsKICBjb25zdCBsYWJlbEF0dHJpYnV0ZXMgPSBjb25maWcyLmxhYmVsQXR0cmlidXRlcyA9PT0gbnVsbCB8fCBjb25maWcyLmxhYmVsQXR0cmlidXRlcyA9PT0gdm9pZCAwID8gJ2NsYXNzPSJzci1vbmx5IicgOiBjb25maWcyLmxhYmVsQXR0cmlidXRlczsKICBjb25zdCBiYWNrTGFiZWwgPSBjb25maWcyLmJhY2tMYWJlbCB8fCBkZWZhdWx0QmFja0xhYmVsOwogIGNvbnN0IGNsb2JiZXJQcmVmaXggPSBjb25maWcyLmNsb2JiZXJQcmVmaXggPT09IG51bGwgfHwgY29uZmlnMi5jbG9iYmVyUHJlZml4ID09PSB2b2lkIDAgPyAidXNlci1jb250ZW50LSIgOiBjb25maWcyLmNsb2JiZXJQcmVmaXg7CiAgcmV0dXJuIHsKICAgIGVudGVyOiB7CiAgICAgIGdmbUZvb3Rub3RlRGVmaW5pdGlvbigpIHsKICAgICAgICBjb25zdCBzdGFjayA9IHRoaXMuZ2V0RGF0YSgidGlnaHRTdGFjayIpOwogICAgICAgIHN0YWNrLnB1c2goZmFsc2UpOwogICAgICB9LAogICAgICBnZm1Gb290bm90ZURlZmluaXRpb25MYWJlbFN0cmluZygpIHsKICAgICAgICB0aGlzLmJ1ZmZlcigpOwogICAgICB9LAogICAgICBnZm1Gb290bm90ZUNhbGxTdHJpbmcoKSB7CiAgICAgICAgdGhpcy5idWZmZXIoKTsKICAgICAgfQogICAgfSwKICAgIGV4aXQ6IHsKICAgICAgZ2ZtRm9vdG5vdGVEZWZpbml0aW9uKCkgewogICAgICAgIGxldCBkZWZpbml0aW9ucyA9IHRoaXMuZ2V0RGF0YSgiZ2ZtRm9vdG5vdGVEZWZpbml0aW9ucyIpOwogICAgICAgIGNvbnN0IGZvb3Rub3RlU3RhY2sgPSB0aGlzLmdldERhdGEoImdmbUZvb3Rub3RlRGVmaW5pdGlvblN0YWNrIik7CiAgICAgICAgY29uc3QgdGlnaHRTdGFjayA9IHRoaXMuZ2V0RGF0YSgidGlnaHRTdGFjayIpOwogICAgICAgIGNvbnN0IGN1cnJlbnQgPSBmb290bm90ZVN0YWNrLnBvcCgpOwogICAgICAgIGNvbnN0IHZhbHVlMiA9IHRoaXMucmVzdW1lKCk7CiAgICAgICAgaWYgKCFkZWZpbml0aW9ucykgewogICAgICAgICAgdGhpcy5zZXREYXRhKCJnZm1Gb290bm90ZURlZmluaXRpb25zIiwgZGVmaW5pdGlvbnMgPSB7fSk7CiAgICAgICAgfQogICAgICAgIGlmICghb3duNC5jYWxsKGRlZmluaXRpb25zLCBjdXJyZW50KSkgZGVmaW5pdGlvbnNbY3VycmVudF0gPSB2YWx1ZTI7CiAgICAgICAgdGlnaHRTdGFjay5wb3AoKTsKICAgICAgICB0aGlzLnNldERhdGEoInNsdXJwT25lTGluZUVuZGluZyIsIHRydWUpOwogICAgICAgIHRoaXMuc2V0RGF0YSgibGFzdFdhc1RhZyIpOwogICAgICB9LAogICAgICBnZm1Gb290bm90ZURlZmluaXRpb25MYWJlbFN0cmluZyh0b2tlbikgewogICAgICAgIGxldCBmb290bm90ZVN0YWNrID0gdGhpcy5nZXREYXRhKCJnZm1Gb290bm90ZURlZmluaXRpb25TdGFjayIpOwogICAgICAgIGlmICghZm9vdG5vdGVTdGFjaykgewogICAgICAgICAgdGhpcy5zZXREYXRhKCJnZm1Gb290bm90ZURlZmluaXRpb25TdGFjayIsIGZvb3Rub3RlU3RhY2sgPSBbXSk7CiAgICAgICAgfQogICAgICAgIGZvb3Rub3RlU3RhY2sucHVzaChub3JtYWxpemVJZGVudGlmaWVyKHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pKSk7CiAgICAgICAgdGhpcy5yZXN1bWUoKTsKICAgICAgICB0aGlzLmJ1ZmZlcigpOwogICAgICB9LAogICAgICBnZm1Gb290bm90ZUNhbGxTdHJpbmcodG9rZW4pIHsKICAgICAgICBsZXQgY2FsbHMgPSB0aGlzLmdldERhdGEoImdmbUZvb3Rub3RlQ2FsbE9yZGVyIik7CiAgICAgICAgbGV0IGNvdW50cyA9IHRoaXMuZ2V0RGF0YSgiZ2ZtRm9vdG5vdGVDYWxsQ291bnRzIik7CiAgICAgICAgY29uc3QgaWQgPSBub3JtYWxpemVJZGVudGlmaWVyKHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pKTsKICAgICAgICBsZXQgY291bnRlcjsKICAgICAgICB0aGlzLnJlc3VtZSgpOwogICAgICAgIGlmICghY2FsbHMpIHRoaXMuc2V0RGF0YSgiZ2ZtRm9vdG5vdGVDYWxsT3JkZXIiLCBjYWxscyA9IFtdKTsKICAgICAgICBpZiAoIWNvdW50cykgdGhpcy5zZXREYXRhKCJnZm1Gb290bm90ZUNhbGxDb3VudHMiLCBjb3VudHMgPSB7fSk7CiAgICAgICAgY29uc3QgaW5kZXgyID0gY2FsbHMuaW5kZXhPZihpZCk7CiAgICAgICAgY29uc3Qgc2FmZUlkID0gc2FuaXRpemVVcmkoaWQudG9Mb3dlckNhc2UoKSk7CiAgICAgICAgaWYgKGluZGV4MiA9PT0gLTEpIHsKICAgICAgICAgIGNhbGxzLnB1c2goaWQpOwogICAgICAgICAgY291bnRzW2lkXSA9IDE7CiAgICAgICAgICBjb3VudGVyID0gY2FsbHMubGVuZ3RoOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb3VudHNbaWRdKys7CiAgICAgICAgICBjb3VudGVyID0gaW5kZXgyICsgMTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmV1c2VDb3VudGVyID0gY291bnRzW2lkXTsKICAgICAgICB0aGlzLnRhZygnPHN1cD48YSBocmVmPSIjJyArIGNsb2JiZXJQcmVmaXggKyAiZm4tIiArIHNhZmVJZCArICciIGlkPSInICsgY2xvYmJlclByZWZpeCArICJmbnJlZi0iICsgc2FmZUlkICsgKHJldXNlQ291bnRlciA+IDEgPyAiLSIgKyByZXVzZUNvdW50ZXIgOiAiIikgKyAnIiBkYXRhLWZvb3Rub3RlLXJlZj0iIiBhcmlhLWRlc2NyaWJlZGJ5PSJmb290bm90ZS1sYWJlbCI+JyArIFN0cmluZyhjb3VudGVyKSArICI8L2E+PC9zdXA+Iik7CiAgICAgIH0sCiAgICAgIG51bGwoKSB7CiAgICAgICAgY29uc3QgY2FsbHMgPSB0aGlzLmdldERhdGEoImdmbUZvb3Rub3RlQ2FsbE9yZGVyIikgfHwgW107CiAgICAgICAgY29uc3QgY291bnRzID0gdGhpcy5nZXREYXRhKCJnZm1Gb290bm90ZUNhbGxDb3VudHMiKSB8fCB7fTsKICAgICAgICBjb25zdCBkZWZpbml0aW9ucyA9IHRoaXMuZ2V0RGF0YSgiZ2ZtRm9vdG5vdGVEZWZpbml0aW9ucyIpIHx8IHt9OwogICAgICAgIGxldCBpbmRleDIgPSAtMTsKICAgICAgICBpZiAoY2FsbHMubGVuZ3RoID4gMCkgewogICAgICAgICAgdGhpcy5saW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgICAgICAgIHRoaXMudGFnKCc8c2VjdGlvbiBkYXRhLWZvb3Rub3Rlcz0iIiBjbGFzcz0iZm9vdG5vdGVzIj48JyArIGxhYmVsVGFnTmFtZSArICcgaWQ9ImZvb3Rub3RlLWxhYmVsIicgKyAobGFiZWxBdHRyaWJ1dGVzID8gIiAiICsgbGFiZWxBdHRyaWJ1dGVzIDogIiIpICsgIj4iKTsKICAgICAgICAgIHRoaXMucmF3KHRoaXMuZW5jb2RlKGxhYmVsKSk7CiAgICAgICAgICB0aGlzLnRhZygiPC8iICsgbGFiZWxUYWdOYW1lICsgIj4iKTsKICAgICAgICAgIHRoaXMubGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICAgICAgICB0aGlzLnRhZygiPG9sPiIpOwogICAgICAgIH0KICAgICAgICB3aGlsZSAoKytpbmRleDIgPCBjYWxscy5sZW5ndGgpIHsKICAgICAgICAgIGNvbnN0IGlkID0gY2FsbHNbaW5kZXgyXTsKICAgICAgICAgIGNvbnN0IHNhZmVJZCA9IHNhbml0aXplVXJpKGlkLnRvTG93ZXJDYXNlKCkpOwogICAgICAgICAgbGV0IHJlZmVyZW5jZUluZGV4ID0gMDsKICAgICAgICAgIGNvbnN0IHJlZmVyZW5jZXMgPSBbXTsKICAgICAgICAgIHdoaWxlICgrK3JlZmVyZW5jZUluZGV4IDw9IGNvdW50c1tpZF0pIHsKICAgICAgICAgICAgcmVmZXJlbmNlcy5wdXNoKCc8YSBocmVmPSIjJyArIGNsb2JiZXJQcmVmaXggKyAiZm5yZWYtIiArIHNhZmVJZCArIChyZWZlcmVuY2VJbmRleCA+IDEgPyAiLSIgKyByZWZlcmVuY2VJbmRleCA6ICIiKSArICciIGRhdGEtZm9vdG5vdGUtYmFja3JlZj0iIiBhcmlhLWxhYmVsPSInICsgdGhpcy5lbmNvZGUodHlwZW9mIGJhY2tMYWJlbCA9PT0gInN0cmluZyIgPyBiYWNrTGFiZWwgOiBiYWNrTGFiZWwoaW5kZXgyLCByZWZlcmVuY2VJbmRleCkpICsgJyIgY2xhc3M9ImRhdGEtZm9vdG5vdGUtYmFja3JlZiI+XHUyMUE5JyArIChyZWZlcmVuY2VJbmRleCA+IDEgPyAiPHN1cD4iICsgcmVmZXJlbmNlSW5kZXggKyAiPC9zdXA+IiA6ICIiKSArICI8L2E+Iik7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCByZWZlcmVuY2UgPSByZWZlcmVuY2VzLmpvaW4oIiAiKTsKICAgICAgICAgIGxldCBpbmplY3RlZCA9IGZhbHNlOwogICAgICAgICAgdGhpcy5saW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgICAgICAgIHRoaXMudGFnKCc8bGkgaWQ9IicgKyBjbG9iYmVyUHJlZml4ICsgImZuLSIgKyBzYWZlSWQgKyAnIj4nKTsKICAgICAgICAgIHRoaXMubGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICAgICAgICB0aGlzLnRhZyhkZWZpbml0aW9uc1tpZF0ucmVwbGFjZSgvPFwvcD4oPzpccj9cbnxccik/JC8sIGZ1bmN0aW9uKCQwKSB7CiAgICAgICAgICAgIGluamVjdGVkID0gdHJ1ZTsKICAgICAgICAgICAgcmV0dXJuICIgIiArIHJlZmVyZW5jZSArICQwOwogICAgICAgICAgfSkpOwogICAgICAgICAgaWYgKCFpbmplY3RlZCkgewogICAgICAgICAgICB0aGlzLmxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgICAgICAgICB0aGlzLnRhZyhyZWZlcmVuY2UpOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5saW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgICAgICAgIHRoaXMudGFnKCI8L2xpPiIpOwogICAgICAgIH0KICAgICAgICBpZiAoY2FsbHMubGVuZ3RoID4gMCkgewogICAgICAgICAgdGhpcy5saW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgICAgICAgIHRoaXMudGFnKCI8L29sPiIpOwogICAgICAgICAgdGhpcy5saW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgICAgICAgIHRoaXMudGFnKCI8L3NlY3Rpb24+Iik7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfTsKfQpfX25hbWUoZ2ZtRm9vdG5vdGVIdG1sLCAiZ2ZtRm9vdG5vdGVIdG1sIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tc3RyaWtldGhyb3VnaEAyLjEuMC9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tc3RyaWtldGhyb3VnaC9saWIvaHRtbC5qcwpmdW5jdGlvbiBnZm1TdHJpa2V0aHJvdWdoSHRtbCgpIHsKICByZXR1cm4gewogICAgZW50ZXI6IHsKICAgICAgc3RyaWtldGhyb3VnaCgpIHsKICAgICAgICB0aGlzLnRhZygiPGRlbD4iKTsKICAgICAgfQogICAgfSwKICAgIGV4aXQ6IHsKICAgICAgc3RyaWtldGhyb3VnaCgpIHsKICAgICAgICB0aGlzLnRhZygiPC9kZWw+Iik7CiAgICAgIH0KICAgIH0KICB9Owp9Cl9fbmFtZShnZm1TdHJpa2V0aHJvdWdoSHRtbCwgImdmbVN0cmlrZXRocm91Z2hIdG1sIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tc3RyaWtldGhyb3VnaEAyLjEuMC9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tc3RyaWtldGhyb3VnaC9saWIvc3ludGF4LmpzCmZ1bmN0aW9uIGdmbVN0cmlrZXRocm91Z2gob3B0aW9ucykgewogIGNvbnN0IG9wdGlvbnNfID0gb3B0aW9ucyB8fCB7fTsKICBsZXQgc2luZ2xlMiA9IG9wdGlvbnNfLnNpbmdsZVRpbGRlOwogIGNvbnN0IHRva2VuaXplciA9IHsKICAgIG5hbWU6ICJzdHJpa2V0aHJvdWdoIiwKICAgIHRva2VuaXplOiB0b2tlbml6ZVN0cmlrZXRocm91Z2gsCiAgICByZXNvbHZlQWxsOiByZXNvbHZlQWxsU3RyaWtldGhyb3VnaAogIH07CiAgaWYgKHNpbmdsZTIgPT09IG51bGwgfHwgc2luZ2xlMiA9PT0gdm9pZCAwKSB7CiAgICBzaW5nbGUyID0gdHJ1ZTsKICB9CiAgcmV0dXJuIHsKICAgIHRleHQ6IHsKICAgICAgWzEyNl06IHRva2VuaXplcgogICAgfSwKICAgIGluc2lkZVNwYW46IHsKICAgICAgbnVsbDogW3Rva2VuaXplcl0KICAgIH0sCiAgICBhdHRlbnRpb25NYXJrZXJzOiB7CiAgICAgIG51bGw6IFsxMjZdCiAgICB9CiAgfTsKICBmdW5jdGlvbiByZXNvbHZlQWxsU3RyaWtldGhyb3VnaChldmVudHMsIGNvbnRleHQyKSB7CiAgICBsZXQgaW5kZXgyID0gLTE7CiAgICB3aGlsZSAoKytpbmRleDIgPCBldmVudHMubGVuZ3RoKSB7CiAgICAgIGlmIChldmVudHNbaW5kZXgyXVswXSA9PT0gImVudGVyIiAmJiBldmVudHNbaW5kZXgyXVsxXS50eXBlID09PSAic3RyaWtldGhyb3VnaFNlcXVlbmNlVGVtcG9yYXJ5IiAmJiBldmVudHNbaW5kZXgyXVsxXS5fY2xvc2UpIHsKICAgICAgICBsZXQgb3BlbiA9IGluZGV4MjsKICAgICAgICB3aGlsZSAob3Blbi0tKSB7CiAgICAgICAgICBpZiAoZXZlbnRzW29wZW5dWzBdID09PSAiZXhpdCIgJiYgZXZlbnRzW29wZW5dWzFdLnR5cGUgPT09ICJzdHJpa2V0aHJvdWdoU2VxdWVuY2VUZW1wb3JhcnkiICYmIGV2ZW50c1tvcGVuXVsxXS5fb3BlbiAmJiAvLyBJZiB0aGUgc2l6ZXMgYXJlIHRoZSBzYW1lOgogICAgICAgICAgZXZlbnRzW2luZGV4Ml1bMV0uZW5kLm9mZnNldCAtIGV2ZW50c1tpbmRleDJdWzFdLnN0YXJ0Lm9mZnNldCA9PT0gZXZlbnRzW29wZW5dWzFdLmVuZC5vZmZzZXQgLSBldmVudHNbb3Blbl1bMV0uc3RhcnQub2Zmc2V0KSB7CiAgICAgICAgICAgIGV2ZW50c1tpbmRleDJdWzFdLnR5cGUgPSAic3RyaWtldGhyb3VnaFNlcXVlbmNlIjsKICAgICAgICAgICAgZXZlbnRzW29wZW5dWzFdLnR5cGUgPSAic3RyaWtldGhyb3VnaFNlcXVlbmNlIjsKICAgICAgICAgICAgY29uc3Qgc3RyaWtldGhyb3VnaDMgPSB7CiAgICAgICAgICAgICAgdHlwZTogInN0cmlrZXRocm91Z2giLAogICAgICAgICAgICAgIHN0YXJ0OiBPYmplY3QuYXNzaWduKHt9LCBldmVudHNbb3Blbl1bMV0uc3RhcnQpLAogICAgICAgICAgICAgIGVuZDogT2JqZWN0LmFzc2lnbih7fSwgZXZlbnRzW2luZGV4Ml1bMV0uZW5kKQogICAgICAgICAgICB9OwogICAgICAgICAgICBjb25zdCB0ZXh0OCA9IHsKICAgICAgICAgICAgICB0eXBlOiAic3RyaWtldGhyb3VnaFRleHQiLAogICAgICAgICAgICAgIHN0YXJ0OiBPYmplY3QuYXNzaWduKHt9LCBldmVudHNbb3Blbl1bMV0uZW5kKSwKICAgICAgICAgICAgICBlbmQ6IE9iamVjdC5hc3NpZ24oe30sIGV2ZW50c1tpbmRleDJdWzFdLnN0YXJ0KQogICAgICAgICAgICB9OwogICAgICAgICAgICBjb25zdCBuZXh0RXZlbnRzID0gW1siZW50ZXIiLCBzdHJpa2V0aHJvdWdoMywgY29udGV4dDJdLCBbImVudGVyIiwgZXZlbnRzW29wZW5dWzFdLCBjb250ZXh0Ml0sIFsiZXhpdCIsIGV2ZW50c1tvcGVuXVsxXSwgY29udGV4dDJdLCBbImVudGVyIiwgdGV4dDgsIGNvbnRleHQyXV07CiAgICAgICAgICAgIGNvbnN0IGluc2lkZVNwYW4yID0gY29udGV4dDIucGFyc2VyLmNvbnN0cnVjdHMuaW5zaWRlU3Bhbi5udWxsOwogICAgICAgICAgICBpZiAoaW5zaWRlU3BhbjIpIHsKICAgICAgICAgICAgICBzcGxpY2UobmV4dEV2ZW50cywgbmV4dEV2ZW50cy5sZW5ndGgsIDAsIHJlc29sdmVBbGwoaW5zaWRlU3BhbjIsIGV2ZW50cy5zbGljZShvcGVuICsgMSwgaW5kZXgyKSwgY29udGV4dDIpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzcGxpY2UobmV4dEV2ZW50cywgbmV4dEV2ZW50cy5sZW5ndGgsIDAsIFtbImV4aXQiLCB0ZXh0OCwgY29udGV4dDJdLCBbImVudGVyIiwgZXZlbnRzW2luZGV4Ml1bMV0sIGNvbnRleHQyXSwgWyJleGl0IiwgZXZlbnRzW2luZGV4Ml1bMV0sIGNvbnRleHQyXSwgWyJleGl0Iiwgc3RyaWtldGhyb3VnaDMsIGNvbnRleHQyXV0pOwogICAgICAgICAgICBzcGxpY2UoZXZlbnRzLCBvcGVuIC0gMSwgaW5kZXgyIC0gb3BlbiArIDMsIG5leHRFdmVudHMpOwogICAgICAgICAgICBpbmRleDIgPSBvcGVuICsgbmV4dEV2ZW50cy5sZW5ndGggLSAyOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGluZGV4MiA9IC0xOwogICAgd2hpbGUgKCsraW5kZXgyIDwgZXZlbnRzLmxlbmd0aCkgewogICAgICBpZiAoZXZlbnRzW2luZGV4Ml1bMV0udHlwZSA9PT0gInN0cmlrZXRocm91Z2hTZXF1ZW5jZVRlbXBvcmFyeSIpIHsKICAgICAgICBldmVudHNbaW5kZXgyXVsxXS50eXBlID0gImRhdGEiOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZXZlbnRzOwogIH0KICBfX25hbWUocmVzb2x2ZUFsbFN0cmlrZXRocm91Z2gsICJyZXNvbHZlQWxsU3RyaWtldGhyb3VnaCIpOwogIGZ1bmN0aW9uIHRva2VuaXplU3RyaWtldGhyb3VnaChlZmZlY3RzLCBvazMsIG5vaykgewogICAgY29uc3QgcHJldmlvdXMzID0gdGhpcy5wcmV2aW91czsKICAgIGNvbnN0IGV2ZW50cyA9IHRoaXMuZXZlbnRzOwogICAgbGV0IHNpemUgPSAwOwogICAgcmV0dXJuIHN0YXJ0OwogICAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgICAgaWYgKHByZXZpb3VzMyA9PT0gMTI2ICYmIGV2ZW50c1tldmVudHMubGVuZ3RoIC0gMV1bMV0udHlwZSAhPT0gImNoYXJhY3RlckVzY2FwZSIpIHsKICAgICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgICAgfQogICAgICBlZmZlY3RzLmVudGVyKCJzdHJpa2V0aHJvdWdoU2VxdWVuY2VUZW1wb3JhcnkiKTsKICAgICAgcmV0dXJuIG1vcmUoY29kZTQpOwogICAgfQogICAgX19uYW1lKHN0YXJ0LCAic3RhcnQiKTsKICAgIGZ1bmN0aW9uIG1vcmUoY29kZTQpIHsKICAgICAgY29uc3QgYmVmb3JlID0gY2xhc3NpZnlDaGFyYWN0ZXIocHJldmlvdXMzKTsKICAgICAgaWYgKGNvZGU0ID09PSAxMjYpIHsKICAgICAgICBpZiAoc2l6ZSA+IDEpIHJldHVybiBub2soY29kZTQpOwogICAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgICAgc2l6ZSsrOwogICAgICAgIHJldHVybiBtb3JlOwogICAgICB9CiAgICAgIGlmIChzaXplIDwgMiAmJiAhc2luZ2xlMikgcmV0dXJuIG5vayhjb2RlNCk7CiAgICAgIGNvbnN0IHRva2VuID0gZWZmZWN0cy5leGl0KCJzdHJpa2V0aHJvdWdoU2VxdWVuY2VUZW1wb3JhcnkiKTsKICAgICAgY29uc3QgYWZ0ZXIgPSBjbGFzc2lmeUNoYXJhY3Rlcihjb2RlNCk7CiAgICAgIHRva2VuLl9vcGVuID0gIWFmdGVyIHx8IGFmdGVyID09PSAyICYmIEJvb2xlYW4oYmVmb3JlKTsKICAgICAgdG9rZW4uX2Nsb3NlID0gIWJlZm9yZSB8fCBiZWZvcmUgPT09IDIgJiYgQm9vbGVhbihhZnRlcik7CiAgICAgIHJldHVybiBvazMoY29kZTQpOwogICAgfQogICAgX19uYW1lKG1vcmUsICJtb3JlIik7CiAgfQogIF9fbmFtZSh0b2tlbml6ZVN0cmlrZXRocm91Z2gsICJ0b2tlbml6ZVN0cmlrZXRocm91Z2giKTsKfQpfX25hbWUoZ2ZtU3RyaWtldGhyb3VnaCwgImdmbVN0cmlrZXRocm91Z2giKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS10YWJsZUAyLjEuMS9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFibGUvbGliL2h0bWwuanMKdmFyIGFsaWdubWVudCA9IHsKICBub25lOiAiIiwKICBsZWZ0OiAnIGFsaWduPSJsZWZ0IicsCiAgcmlnaHQ6ICcgYWxpZ249InJpZ2h0IicsCiAgY2VudGVyOiAnIGFsaWduPSJjZW50ZXIiJwp9OwpmdW5jdGlvbiBnZm1UYWJsZUh0bWwoKSB7CiAgcmV0dXJuIHsKICAgIGVudGVyOiB7CiAgICAgIHRhYmxlKHRva2VuKSB7CiAgICAgICAgY29uc3QgdGFibGVBbGlnbiA9IHRva2VuLl9hbGlnbjsKICAgICAgICB0aGlzLmxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgICAgIHRoaXMudGFnKCI8dGFibGU+Iik7CiAgICAgICAgdGhpcy5zZXREYXRhKCJ0YWJsZUFsaWduIiwgdGFibGVBbGlnbik7CiAgICAgIH0sCiAgICAgIHRhYmxlQm9keSgpIHsKICAgICAgICB0aGlzLnRhZygiPHRib2R5PiIpOwogICAgICB9LAogICAgICB0YWJsZURhdGEoKSB7CiAgICAgICAgY29uc3QgdGFibGVBbGlnbiA9IHRoaXMuZ2V0RGF0YSgidGFibGVBbGlnbiIpOwogICAgICAgIGNvbnN0IHRhYmxlQ29sdW1uID0gdGhpcy5nZXREYXRhKCJ0YWJsZUNvbHVtbiIpOwogICAgICAgIGNvbnN0IGFsaWduID0gYWxpZ25tZW50W3RhYmxlQWxpZ25bdGFibGVDb2x1bW5dXTsKICAgICAgICBpZiAoYWxpZ24gPT09IHZvaWQgMCkgewogICAgICAgICAgdGhpcy5idWZmZXIoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5saW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgICAgICAgIHRoaXMudGFnKCI8dGQiICsgYWxpZ24gKyAiPiIpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgdGFibGVIZWFkKCkgewogICAgICAgIHRoaXMubGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICAgICAgdGhpcy50YWcoIjx0aGVhZD4iKTsKICAgICAgfSwKICAgICAgdGFibGVIZWFkZXIoKSB7CiAgICAgICAgY29uc3QgdGFibGVBbGlnbiA9IHRoaXMuZ2V0RGF0YSgidGFibGVBbGlnbiIpOwogICAgICAgIGNvbnN0IHRhYmxlQ29sdW1uID0gdGhpcy5nZXREYXRhKCJ0YWJsZUNvbHVtbiIpOwogICAgICAgIGNvbnN0IGFsaWduID0gYWxpZ25tZW50W3RhYmxlQWxpZ25bdGFibGVDb2x1bW5dXTsKICAgICAgICB0aGlzLmxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgICAgIHRoaXMudGFnKCI8dGgiICsgYWxpZ24gKyAiPiIpOwogICAgICB9LAogICAgICB0YWJsZVJvdygpIHsKICAgICAgICB0aGlzLnNldERhdGEoInRhYmxlQ29sdW1uIiwgMCk7CiAgICAgICAgdGhpcy5saW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgICAgICB0aGlzLnRhZygiPHRyPiIpOwogICAgICB9CiAgICB9LAogICAgZXhpdDogewogICAgICAvLyBPdmVyd3JpdGUgdGhlIGRlZmF1bHQgY29kZSB0ZXh0IGRhdGEgaGFuZGxlciB0byB1bmVzY2FwZSBlc2NhcGVkIHBpcGVzIHdoZW4KICAgICAgLy8gdGhleSBhcmUgaW4gdGFibGVzLgogICAgICBjb2RlVGV4dERhdGEodG9rZW4pIHsKICAgICAgICBsZXQgdmFsdWUyID0gdGhpcy5zbGljZVNlcmlhbGl6ZSh0b2tlbik7CiAgICAgICAgaWYgKHRoaXMuZ2V0RGF0YSgidGFibGVBbGlnbiIpKSB7CiAgICAgICAgICB2YWx1ZTIgPSB2YWx1ZTIucmVwbGFjZSgvXFwoW1xcfF0pL2csIHJlcGxhY2UyKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5yYXcodGhpcy5lbmNvZGUodmFsdWUyKSk7CiAgICAgIH0sCiAgICAgIHRhYmxlKCkgewogICAgICAgIHRoaXMuc2V0RGF0YSgidGFibGVBbGlnbiIpOwogICAgICAgIHRoaXMuc2V0RGF0YSgic2x1cnBBbGxMaW5lRW5kaW5ncyIpOwogICAgICAgIHRoaXMubGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICAgICAgdGhpcy50YWcoIjwvdGFibGU+Iik7CiAgICAgIH0sCiAgICAgIHRhYmxlQm9keSgpIHsKICAgICAgICB0aGlzLmxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgICAgIHRoaXMudGFnKCI8L3Rib2R5PiIpOwogICAgICB9LAogICAgICB0YWJsZURhdGEoKSB7CiAgICAgICAgY29uc3QgdGFibGVBbGlnbiA9IHRoaXMuZ2V0RGF0YSgidGFibGVBbGlnbiIpOwogICAgICAgIGNvbnN0IHRhYmxlQ29sdW1uID0gdGhpcy5nZXREYXRhKCJ0YWJsZUNvbHVtbiIpOwogICAgICAgIGlmICh0YWJsZUNvbHVtbiBpbiB0YWJsZUFsaWduKSB7CiAgICAgICAgICB0aGlzLnRhZygiPC90ZD4iKTsKICAgICAgICAgIHRoaXMuc2V0RGF0YSgidGFibGVDb2x1bW4iLCB0YWJsZUNvbHVtbiArIDEpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLnJlc3VtZSgpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgdGFibGVIZWFkKCkgewogICAgICAgIHRoaXMubGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICAgICAgdGhpcy50YWcoIjwvdGhlYWQ+Iik7CiAgICAgIH0sCiAgICAgIHRhYmxlSGVhZGVyKCkgewogICAgICAgIGNvbnN0IHRhYmxlQ29sdW1uID0gdGhpcy5nZXREYXRhKCJ0YWJsZUNvbHVtbiIpOwogICAgICAgIHRoaXMudGFnKCI8L3RoPiIpOwogICAgICAgIHRoaXMuc2V0RGF0YSgidGFibGVDb2x1bW4iLCB0YWJsZUNvbHVtbiArIDEpOwogICAgICB9LAogICAgICB0YWJsZVJvdygpIHsKICAgICAgICBjb25zdCB0YWJsZUFsaWduID0gdGhpcy5nZXREYXRhKCJ0YWJsZUFsaWduIik7CiAgICAgICAgbGV0IHRhYmxlQ29sdW1uID0gdGhpcy5nZXREYXRhKCJ0YWJsZUNvbHVtbiIpOwogICAgICAgIHdoaWxlICh0YWJsZUNvbHVtbiA8IHRhYmxlQWxpZ24ubGVuZ3RoKSB7CiAgICAgICAgICB0aGlzLmxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgICAgICAgdGhpcy50YWcoIjx0ZCIgKyBhbGlnbm1lbnRbdGFibGVBbGlnblt0YWJsZUNvbHVtbl1dICsgIj48L3RkPiIpOwogICAgICAgICAgdGFibGVDb2x1bW4rKzsKICAgICAgICB9CiAgICAgICAgdGhpcy5zZXREYXRhKCJ0YWJsZUNvbHVtbiIsIHRhYmxlQ29sdW1uKTsKICAgICAgICB0aGlzLmxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgICAgIHRoaXMudGFnKCI8L3RyPiIpOwogICAgICB9CiAgICB9CiAgfTsKfQpfX25hbWUoZ2ZtVGFibGVIdG1sLCAiZ2ZtVGFibGVIdG1sIik7CmZ1bmN0aW9uIHJlcGxhY2UyKCQwLCAkMSkgewogIHJldHVybiAkMSA9PT0gInwiID8gJDEgOiAkMDsKfQpfX25hbWUocmVwbGFjZTIsICJyZXBsYWNlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFibGVAMi4xLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhYmxlL2xpYi9lZGl0LW1hcC5qcwp2YXIgRWRpdE1hcCA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJFZGl0TWFwIik7CiAgfQogIC8qKgogICAqIENyZWF0ZSBhIG5ldyBlZGl0IG1hcC4KICAgKi8KICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMubWFwID0gW107CiAgfQogIC8qKgogICAqIENyZWF0ZSBhbiBlZGl0OiBhIHJlbW92ZSBhbmQvb3IgYWRkIGF0IGEgY2VydGFpbiBwbGFjZS4KICAgKgogICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleAogICAqIEBwYXJhbSB7bnVtYmVyfSByZW1vdmUKICAgKiBAcGFyYW0ge0FycmF5PEV2ZW50Pn0gYWRkCiAgICogQHJldHVybnMge3VuZGVmaW5lZH0KICAgKi8KICBhZGQoaW5kZXgyLCByZW1vdmUyLCBhZGQyKSB7CiAgICBhZGRJbXBsZW1lbnRhdGlvbih0aGlzLCBpbmRleDIsIHJlbW92ZTIsIGFkZDIpOwogIH0KICAvLyBUbyBkbzogYWRkIHRoaXMgd2hlbiBtb3ZpbmcgdG8gYG1pY3JvbWFya2AuCiAgLy8gLyoqCiAgLy8gICogQ3JlYXRlIGFuIGVkaXQ6IGJ1dCBpbnNlcnQgYGFkZGAgYmVmb3JlIGV4aXN0aW5nIGFkZGl0aW9ucy4KICAvLyAgKgogIC8vICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleAogIC8vICAqIEBwYXJhbSB7bnVtYmVyfSByZW1vdmUKICAvLyAgKiBAcGFyYW0ge0FycmF5PEV2ZW50Pn0gYWRkCiAgLy8gICogQHJldHVybnMge3VuZGVmaW5lZH0KICAvLyAgKi8KICAvLyBhZGRCZWZvcmUoaW5kZXgsIHJlbW92ZSwgYWRkKSB7CiAgLy8gICBhZGRJbXBsZW1lbnRhdGlvbih0aGlzLCBpbmRleCwgcmVtb3ZlLCBhZGQsIHRydWUpCiAgLy8gfQogIC8qKgogICAqIERvbmUsIGNoYW5nZSB0aGUgZXZlbnRzLgogICAqCiAgICogQHBhcmFtIHtBcnJheTxFdmVudD59IGV2ZW50cwogICAqIEByZXR1cm5zIHt1bmRlZmluZWR9CiAgICovCiAgY29uc3VtZShldmVudHMpIHsKICAgIHRoaXMubWFwLnNvcnQoZnVuY3Rpb24oYTQsIGI0KSB7CiAgICAgIHJldHVybiBhNFswXSAtIGI0WzBdOwogICAgfSk7CiAgICBpZiAodGhpcy5tYXAubGVuZ3RoID09PSAwKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGxldCBpbmRleDIgPSB0aGlzLm1hcC5sZW5ndGg7CiAgICBjb25zdCB2ZWNzID0gW107CiAgICB3aGlsZSAoaW5kZXgyID4gMCkgewogICAgICBpbmRleDIgLT0gMTsKICAgICAgdmVjcy5wdXNoKGV2ZW50cy5zbGljZSh0aGlzLm1hcFtpbmRleDJdWzBdICsgdGhpcy5tYXBbaW5kZXgyXVsxXSksIHRoaXMubWFwW2luZGV4Ml1bMl0pOwogICAgICBldmVudHMubGVuZ3RoID0gdGhpcy5tYXBbaW5kZXgyXVswXTsKICAgIH0KICAgIHZlY3MucHVzaChldmVudHMuc2xpY2UoKSk7CiAgICBldmVudHMubGVuZ3RoID0gMDsKICAgIGxldCBzbGljZSA9IHZlY3MucG9wKCk7CiAgICB3aGlsZSAoc2xpY2UpIHsKICAgICAgZm9yIChjb25zdCBlbGVtZW50NCBvZiBzbGljZSkgewogICAgICAgIGV2ZW50cy5wdXNoKGVsZW1lbnQ0KTsKICAgICAgfQogICAgICBzbGljZSA9IHZlY3MucG9wKCk7CiAgICB9CiAgICB0aGlzLm1hcC5sZW5ndGggPSAwOwogIH0KfTsKZnVuY3Rpb24gYWRkSW1wbGVtZW50YXRpb24oZWRpdE1hcCwgYXQsIHJlbW92ZTIsIGFkZDIpIHsKICBsZXQgaW5kZXgyID0gMDsKICBpZiAocmVtb3ZlMiA9PT0gMCAmJiBhZGQyLmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuOwogIH0KICB3aGlsZSAoaW5kZXgyIDwgZWRpdE1hcC5tYXAubGVuZ3RoKSB7CiAgICBpZiAoZWRpdE1hcC5tYXBbaW5kZXgyXVswXSA9PT0gYXQpIHsKICAgICAgZWRpdE1hcC5tYXBbaW5kZXgyXVsxXSArPSByZW1vdmUyOwogICAgICBlZGl0TWFwLm1hcFtpbmRleDJdWzJdLnB1c2goLi4uYWRkMik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGluZGV4MiArPSAxOwogIH0KICBlZGl0TWFwLm1hcC5wdXNoKFthdCwgcmVtb3ZlMiwgYWRkMl0pOwp9Cl9fbmFtZShhZGRJbXBsZW1lbnRhdGlvbiwgImFkZEltcGxlbWVudGF0aW9uIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFibGVAMi4xLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhYmxlL2xpYi9pbmZlci5qcwpmdW5jdGlvbiBnZm1UYWJsZUFsaWduKGV2ZW50cywgaW5kZXgyKSB7CiAgbGV0IGluRGVsaW1pdGVyUm93ID0gZmFsc2U7CiAgY29uc3QgYWxpZ24gPSBbXTsKICB3aGlsZSAoaW5kZXgyIDwgZXZlbnRzLmxlbmd0aCkgewogICAgY29uc3QgZXZlbnQgPSBldmVudHNbaW5kZXgyXTsKICAgIGlmIChpbkRlbGltaXRlclJvdykgewogICAgICBpZiAoZXZlbnRbMF0gPT09ICJlbnRlciIpIHsKICAgICAgICBpZiAoZXZlbnRbMV0udHlwZSA9PT0gInRhYmxlQ29udGVudCIpIHsKICAgICAgICAgIGFsaWduLnB1c2goZXZlbnRzW2luZGV4MiArIDFdWzFdLnR5cGUgPT09ICJ0YWJsZURlbGltaXRlck1hcmtlciIgPyAibGVmdCIgOiAibm9uZSIpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChldmVudFsxXS50eXBlID09PSAidGFibGVDb250ZW50IikgewogICAgICAgIGlmIChldmVudHNbaW5kZXgyIC0gMV1bMV0udHlwZSA9PT0gInRhYmxlRGVsaW1pdGVyTWFya2VyIikgewogICAgICAgICAgY29uc3QgYWxpZ25JbmRleCA9IGFsaWduLmxlbmd0aCAtIDE7CiAgICAgICAgICBhbGlnblthbGlnbkluZGV4XSA9IGFsaWduW2FsaWduSW5kZXhdID09PSAibGVmdCIgPyAiY2VudGVyIiA6ICJyaWdodCI7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGV2ZW50WzFdLnR5cGUgPT09ICJ0YWJsZURlbGltaXRlclJvdyIpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfSBlbHNlIGlmIChldmVudFswXSA9PT0gImVudGVyIiAmJiBldmVudFsxXS50eXBlID09PSAidGFibGVEZWxpbWl0ZXJSb3ciKSB7CiAgICAgIGluRGVsaW1pdGVyUm93ID0gdHJ1ZTsKICAgIH0KICAgIGluZGV4MiArPSAxOwogIH0KICByZXR1cm4gYWxpZ247Cn0KX19uYW1lKGdmbVRhYmxlQWxpZ24sICJnZm1UYWJsZUFsaWduIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFibGVAMi4xLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhYmxlL2xpYi9zeW50YXguanMKZnVuY3Rpb24gZ2ZtVGFibGUoKSB7CiAgcmV0dXJuIHsKICAgIGZsb3c6IHsKICAgICAgbnVsbDogewogICAgICAgIG5hbWU6ICJ0YWJsZSIsCiAgICAgICAgdG9rZW5pemU6IHRva2VuaXplVGFibGUsCiAgICAgICAgcmVzb2x2ZUFsbDogcmVzb2x2ZVRhYmxlCiAgICAgIH0KICAgIH0KICB9Owp9Cl9fbmFtZShnZm1UYWJsZSwgImdmbVRhYmxlIik7CmZ1bmN0aW9uIHRva2VuaXplVGFibGUoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgbGV0IHNpemUgPSAwOwogIGxldCBzaXplQiA9IDA7CiAgbGV0IHNlZW47CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBsZXQgaW5kZXgyID0gc2VsZjIuZXZlbnRzLmxlbmd0aCAtIDE7CiAgICB3aGlsZSAoaW5kZXgyID4gLTEpIHsKICAgICAgY29uc3QgdHlwZTUgPSBzZWxmMi5ldmVudHNbaW5kZXgyXVsxXS50eXBlOwogICAgICBpZiAodHlwZTUgPT09ICJsaW5lRW5kaW5nIiB8fCAvLyBOb3RlOiBtYXJrZG93bi1ycyB1c2VzIGB3aGl0ZXNwYWNlYCBpbnN0ZWFkIG9mIGBsaW5lUHJlZml4YAogICAgICB0eXBlNSA9PT0gImxpbmVQcmVmaXgiKSBpbmRleDItLTsKICAgICAgZWxzZSBicmVhazsKICAgIH0KICAgIGNvbnN0IHRhaWwgPSBpbmRleDIgPiAtMSA/IHNlbGYyLmV2ZW50c1tpbmRleDJdWzFdLnR5cGUgOiBudWxsOwogICAgY29uc3QgbmV4dDIgPSB0YWlsID09PSAidGFibGVIZWFkIiB8fCB0YWlsID09PSAidGFibGVSb3ciID8gYm9keVJvd1N0YXJ0IDogaGVhZFJvd0JlZm9yZTsKICAgIGlmIChuZXh0MiA9PT0gYm9keVJvd1N0YXJ0ICYmIHNlbGYyLnBhcnNlci5sYXp5W3NlbGYyLm5vdygpLmxpbmVdKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgcmV0dXJuIG5leHQyKGNvZGU0KTsKICB9CiAgX19uYW1lKHN0YXJ0LCAic3RhcnQiKTsKICBmdW5jdGlvbiBoZWFkUm93QmVmb3JlKGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJ0YWJsZUhlYWQiKTsKICAgIGVmZmVjdHMuZW50ZXIoInRhYmxlUm93Iik7CiAgICByZXR1cm4gaGVhZFJvd1N0YXJ0KGNvZGU0KTsKICB9CiAgX19uYW1lKGhlYWRSb3dCZWZvcmUsICJoZWFkUm93QmVmb3JlIik7CiAgZnVuY3Rpb24gaGVhZFJvd1N0YXJ0KGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDEyNCkgewogICAgICByZXR1cm4gaGVhZFJvd0JyZWFrKGNvZGU0KTsKICAgIH0KICAgIHNlZW4gPSB0cnVlOwogICAgc2l6ZUIgKz0gMTsKICAgIHJldHVybiBoZWFkUm93QnJlYWsoY29kZTQpOwogIH0KICBfX25hbWUoaGVhZFJvd1N0YXJ0LCAiaGVhZFJvd1N0YXJ0Iik7CiAgZnVuY3Rpb24gaGVhZFJvd0JyZWFrKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwpIHsKICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBpZiAoc2l6ZUIgPiAxKSB7CiAgICAgICAgc2l6ZUIgPSAwOwogICAgICAgIHNlbGYyLmludGVycnVwdCA9IHRydWU7CiAgICAgICAgZWZmZWN0cy5leGl0KCJ0YWJsZVJvdyIpOwogICAgICAgIGVmZmVjdHMuZW50ZXIoImxpbmVFbmRpbmciKTsKICAgICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICAgIGVmZmVjdHMuZXhpdCgibGluZUVuZGluZyIpOwogICAgICAgIHJldHVybiBoZWFkRGVsaW1pdGVyU3RhcnQ7CiAgICAgIH0KICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICBpZiAobWFya2Rvd25TcGFjZShjb2RlNCkpIHsKICAgICAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBoZWFkUm93QnJlYWssICJ3aGl0ZXNwYWNlIikoY29kZTQpOwogICAgfQogICAgc2l6ZUIgKz0gMTsKICAgIGlmIChzZWVuKSB7CiAgICAgIHNlZW4gPSBmYWxzZTsKICAgICAgc2l6ZSArPSAxOwogICAgfQogICAgaWYgKGNvZGU0ID09PSAxMjQpIHsKICAgICAgZWZmZWN0cy5lbnRlcigidGFibGVDZWxsRGl2aWRlciIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoInRhYmxlQ2VsbERpdmlkZXIiKTsKICAgICAgc2VlbiA9IHRydWU7CiAgICAgIHJldHVybiBoZWFkUm93QnJlYWs7CiAgICB9CiAgICBlZmZlY3RzLmVudGVyKCJkYXRhIik7CiAgICByZXR1cm4gaGVhZFJvd0RhdGEoY29kZTQpOwogIH0KICBfX25hbWUoaGVhZFJvd0JyZWFrLCAiaGVhZFJvd0JyZWFrIik7CiAgZnVuY3Rpb24gaGVhZFJvd0RhdGEoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBjb2RlNCA9PT0gMTI0IHx8IG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuZXhpdCgiZGF0YSIpOwogICAgICByZXR1cm4gaGVhZFJvd0JyZWFrKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gY29kZTQgPT09IDkyID8gaGVhZFJvd0VzY2FwZSA6IGhlYWRSb3dEYXRhOwogIH0KICBfX25hbWUoaGVhZFJvd0RhdGEsICJoZWFkUm93RGF0YSIpOwogIGZ1bmN0aW9uIGhlYWRSb3dFc2NhcGUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gOTIgfHwgY29kZTQgPT09IDEyNCkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gaGVhZFJvd0RhdGE7CiAgICB9CiAgICByZXR1cm4gaGVhZFJvd0RhdGEoY29kZTQpOwogIH0KICBfX25hbWUoaGVhZFJvd0VzY2FwZSwgImhlYWRSb3dFc2NhcGUiKTsKICBmdW5jdGlvbiBoZWFkRGVsaW1pdGVyU3RhcnQoY29kZTQpIHsKICAgIHNlbGYyLmludGVycnVwdCA9IGZhbHNlOwogICAgaWYgKHNlbGYyLnBhcnNlci5sYXp5W3NlbGYyLm5vdygpLmxpbmVdKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5lbnRlcigidGFibGVEZWxpbWl0ZXJSb3ciKTsKICAgIHNlZW4gPSBmYWxzZTsKICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICByZXR1cm4gZmFjdG9yeVNwYWNlKGVmZmVjdHMsIGhlYWREZWxpbWl0ZXJCZWZvcmUsICJsaW5lUHJlZml4Iiwgc2VsZjIucGFyc2VyLmNvbnN0cnVjdHMuZGlzYWJsZS5udWxsLmluY2x1ZGVzKCJjb2RlSW5kZW50ZWQiKSA/IHZvaWQgMCA6IDQpKGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBoZWFkRGVsaW1pdGVyQmVmb3JlKGNvZGU0KTsKICB9CiAgX19uYW1lKGhlYWREZWxpbWl0ZXJTdGFydCwgImhlYWREZWxpbWl0ZXJTdGFydCIpOwogIGZ1bmN0aW9uIGhlYWREZWxpbWl0ZXJCZWZvcmUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDUgfHwgY29kZTQgPT09IDU4KSB7CiAgICAgIHJldHVybiBoZWFkRGVsaW1pdGVyVmFsdWVCZWZvcmUoY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSAxMjQpIHsKICAgICAgc2VlbiA9IHRydWU7CiAgICAgIGVmZmVjdHMuZW50ZXIoInRhYmxlQ2VsbERpdmlkZXIiKTsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgZWZmZWN0cy5leGl0KCJ0YWJsZUNlbGxEaXZpZGVyIik7CiAgICAgIHJldHVybiBoZWFkRGVsaW1pdGVyQ2VsbEJlZm9yZTsKICAgIH0KICAgIHJldHVybiBoZWFkRGVsaW1pdGVyTm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKGhlYWREZWxpbWl0ZXJCZWZvcmUsICJoZWFkRGVsaW1pdGVyQmVmb3JlIik7CiAgZnVuY3Rpb24gaGVhZERlbGltaXRlckNlbGxCZWZvcmUoY29kZTQpIHsKICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICByZXR1cm4gZmFjdG9yeVNwYWNlKGVmZmVjdHMsIGhlYWREZWxpbWl0ZXJWYWx1ZUJlZm9yZSwgIndoaXRlc3BhY2UiKShjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gaGVhZERlbGltaXRlclZhbHVlQmVmb3JlKGNvZGU0KTsKICB9CiAgX19uYW1lKGhlYWREZWxpbWl0ZXJDZWxsQmVmb3JlLCAiaGVhZERlbGltaXRlckNlbGxCZWZvcmUiKTsKICBmdW5jdGlvbiBoZWFkRGVsaW1pdGVyVmFsdWVCZWZvcmUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNTgpIHsKICAgICAgc2l6ZUIgKz0gMTsKICAgICAgc2VlbiA9IHRydWU7CiAgICAgIGVmZmVjdHMuZW50ZXIoInRhYmxlRGVsaW1pdGVyTWFya2VyIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgidGFibGVEZWxpbWl0ZXJNYXJrZXIiKTsKICAgICAgcmV0dXJuIGhlYWREZWxpbWl0ZXJMZWZ0QWxpZ25tZW50QWZ0ZXI7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDQ1KSB7CiAgICAgIHNpemVCICs9IDE7CiAgICAgIHJldHVybiBoZWFkRGVsaW1pdGVyTGVmdEFsaWdubWVudEFmdGVyKGNvZGU0KTsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIHJldHVybiBoZWFkRGVsaW1pdGVyQ2VsbEFmdGVyKGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBoZWFkRGVsaW1pdGVyTm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKGhlYWREZWxpbWl0ZXJWYWx1ZUJlZm9yZSwgImhlYWREZWxpbWl0ZXJWYWx1ZUJlZm9yZSIpOwogIGZ1bmN0aW9uIGhlYWREZWxpbWl0ZXJMZWZ0QWxpZ25tZW50QWZ0ZXIoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDUpIHsKICAgICAgZWZmZWN0cy5lbnRlcigidGFibGVEZWxpbWl0ZXJGaWxsZXIiKTsKICAgICAgcmV0dXJuIGhlYWREZWxpbWl0ZXJGaWxsZXIoY29kZTQpOwogICAgfQogICAgcmV0dXJuIGhlYWREZWxpbWl0ZXJOb2soY29kZTQpOwogIH0KICBfX25hbWUoaGVhZERlbGltaXRlckxlZnRBbGlnbm1lbnRBZnRlciwgImhlYWREZWxpbWl0ZXJMZWZ0QWxpZ25tZW50QWZ0ZXIiKTsKICBmdW5jdGlvbiBoZWFkRGVsaW1pdGVyRmlsbGVyKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDQ1KSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBoZWFkRGVsaW1pdGVyRmlsbGVyOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA1OCkgewogICAgICBzZWVuID0gdHJ1ZTsKICAgICAgZWZmZWN0cy5leGl0KCJ0YWJsZURlbGltaXRlckZpbGxlciIpOwogICAgICBlZmZlY3RzLmVudGVyKCJ0YWJsZURlbGltaXRlck1hcmtlciIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoInRhYmxlRGVsaW1pdGVyTWFya2VyIik7CiAgICAgIHJldHVybiBoZWFkRGVsaW1pdGVyUmlnaHRBbGlnbm1lbnRBZnRlcjsKICAgIH0KICAgIGVmZmVjdHMuZXhpdCgidGFibGVEZWxpbWl0ZXJGaWxsZXIiKTsKICAgIHJldHVybiBoZWFkRGVsaW1pdGVyUmlnaHRBbGlnbm1lbnRBZnRlcihjb2RlNCk7CiAgfQogIF9fbmFtZShoZWFkRGVsaW1pdGVyRmlsbGVyLCAiaGVhZERlbGltaXRlckZpbGxlciIpOwogIGZ1bmN0aW9uIGhlYWREZWxpbWl0ZXJSaWdodEFsaWdubWVudEFmdGVyKGNvZGU0KSB7CiAgICBpZiAobWFya2Rvd25TcGFjZShjb2RlNCkpIHsKICAgICAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBoZWFkRGVsaW1pdGVyQ2VsbEFmdGVyLCAid2hpdGVzcGFjZSIpKGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBoZWFkRGVsaW1pdGVyQ2VsbEFmdGVyKGNvZGU0KTsKICB9CiAgX19uYW1lKGhlYWREZWxpbWl0ZXJSaWdodEFsaWdubWVudEFmdGVyLCAiaGVhZERlbGltaXRlclJpZ2h0QWxpZ25tZW50QWZ0ZXIiKTsKICBmdW5jdGlvbiBoZWFkRGVsaW1pdGVyQ2VsbEFmdGVyKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDEyNCkgewogICAgICByZXR1cm4gaGVhZERlbGltaXRlckJlZm9yZShjb2RlNCk7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBpZiAoIXNlZW4gfHwgc2l6ZSAhPT0gc2l6ZUIpIHsKICAgICAgICByZXR1cm4gaGVhZERlbGltaXRlck5vayhjb2RlNCk7CiAgICAgIH0KICAgICAgZWZmZWN0cy5leGl0KCJ0YWJsZURlbGltaXRlclJvdyIpOwogICAgICBlZmZlY3RzLmV4aXQoInRhYmxlSGVhZCIpOwogICAgICByZXR1cm4gb2szKGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBoZWFkRGVsaW1pdGVyTm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKGhlYWREZWxpbWl0ZXJDZWxsQWZ0ZXIsICJoZWFkRGVsaW1pdGVyQ2VsbEFmdGVyIik7CiAgZnVuY3Rpb24gaGVhZERlbGltaXRlck5vayhjb2RlNCkgewogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZShoZWFkRGVsaW1pdGVyTm9rLCAiaGVhZERlbGltaXRlck5vayIpOwogIGZ1bmN0aW9uIGJvZHlSb3dTdGFydChjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigidGFibGVSb3ciKTsKICAgIHJldHVybiBib2R5Um93QnJlYWsoY29kZTQpOwogIH0KICBfX25hbWUoYm9keVJvd1N0YXJ0LCAiYm9keVJvd1N0YXJ0Iik7CiAgZnVuY3Rpb24gYm9keVJvd0JyZWFrKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDEyNCkgewogICAgICBlZmZlY3RzLmVudGVyKCJ0YWJsZUNlbGxEaXZpZGVyIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgidGFibGVDZWxsRGl2aWRlciIpOwogICAgICByZXR1cm4gYm9keVJvd0JyZWFrOwogICAgfQogICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5leGl0KCJ0YWJsZVJvdyIpOwogICAgICByZXR1cm4gb2szKGNvZGU0KTsKICAgIH0KICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICByZXR1cm4gZmFjdG9yeVNwYWNlKGVmZmVjdHMsIGJvZHlSb3dCcmVhaywgIndoaXRlc3BhY2UiKShjb2RlNCk7CiAgICB9CiAgICBlZmZlY3RzLmVudGVyKCJkYXRhIik7CiAgICByZXR1cm4gYm9keVJvd0RhdGEoY29kZTQpOwogIH0KICBfX25hbWUoYm9keVJvd0JyZWFrLCAiYm9keVJvd0JyZWFrIik7CiAgZnVuY3Rpb24gYm9keVJvd0RhdGEoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBjb2RlNCA9PT0gMTI0IHx8IG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuZXhpdCgiZGF0YSIpOwogICAgICByZXR1cm4gYm9keVJvd0JyZWFrKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gY29kZTQgPT09IDkyID8gYm9keVJvd0VzY2FwZSA6IGJvZHlSb3dEYXRhOwogIH0KICBfX25hbWUoYm9keVJvd0RhdGEsICJib2R5Um93RGF0YSIpOwogIGZ1bmN0aW9uIGJvZHlSb3dFc2NhcGUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gOTIgfHwgY29kZTQgPT09IDEyNCkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gYm9keVJvd0RhdGE7CiAgICB9CiAgICByZXR1cm4gYm9keVJvd0RhdGEoY29kZTQpOwogIH0KICBfX25hbWUoYm9keVJvd0VzY2FwZSwgImJvZHlSb3dFc2NhcGUiKTsKfQpfX25hbWUodG9rZW5pemVUYWJsZSwgInRva2VuaXplVGFibGUiKTsKZnVuY3Rpb24gcmVzb2x2ZVRhYmxlKGV2ZW50cywgY29udGV4dDIpIHsKICBsZXQgaW5kZXgyID0gLTE7CiAgbGV0IGluRmlyc3RDZWxsQXdhaXRpbmdQaXBlID0gdHJ1ZTsKICBsZXQgcm93S2luZCA9IDA7CiAgbGV0IGxhc3RDZWxsID0gWzAsIDAsIDAsIDBdOwogIGxldCBjZWxsMiA9IFswLCAwLCAwLCAwXTsKICBsZXQgYWZ0ZXJIZWFkQXdhaXRpbmdGaXJzdEJvZHlSb3cgPSBmYWxzZTsKICBsZXQgbGFzdFRhYmxlRW5kID0gMDsKICBsZXQgY3VycmVudFRhYmxlOwogIGxldCBjdXJyZW50Qm9keTsKICBsZXQgY3VycmVudENlbGw7CiAgY29uc3QgbWFwNyA9IG5ldyBFZGl0TWFwKCk7CiAgd2hpbGUgKCsraW5kZXgyIDwgZXZlbnRzLmxlbmd0aCkgewogICAgY29uc3QgZXZlbnQgPSBldmVudHNbaW5kZXgyXTsKICAgIGNvbnN0IHRva2VuID0gZXZlbnRbMV07CiAgICBpZiAoZXZlbnRbMF0gPT09ICJlbnRlciIpIHsKICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICJ0YWJsZUhlYWQiKSB7CiAgICAgICAgYWZ0ZXJIZWFkQXdhaXRpbmdGaXJzdEJvZHlSb3cgPSBmYWxzZTsKICAgICAgICBpZiAobGFzdFRhYmxlRW5kICE9PSAwKSB7CiAgICAgICAgICBmbHVzaFRhYmxlRW5kKG1hcDcsIGNvbnRleHQyLCBsYXN0VGFibGVFbmQsIGN1cnJlbnRUYWJsZSwgY3VycmVudEJvZHkpOwogICAgICAgICAgY3VycmVudEJvZHkgPSB2b2lkIDA7CiAgICAgICAgICBsYXN0VGFibGVFbmQgPSAwOwogICAgICAgIH0KICAgICAgICBjdXJyZW50VGFibGUgPSB7CiAgICAgICAgICB0eXBlOiAidGFibGUiLAogICAgICAgICAgc3RhcnQ6IE9iamVjdC5hc3NpZ24oe30sIHRva2VuLnN0YXJ0KSwKICAgICAgICAgIC8vIE5vdGU6IGNvcnJlY3QgZW5kIGlzIHNldCBsYXRlci4KICAgICAgICAgIGVuZDogT2JqZWN0LmFzc2lnbih7fSwgdG9rZW4uZW5kKQogICAgICAgIH07CiAgICAgICAgbWFwNy5hZGQoaW5kZXgyLCAwLCBbWyJlbnRlciIsIGN1cnJlbnRUYWJsZSwgY29udGV4dDJdXSk7CiAgICAgIH0gZWxzZSBpZiAodG9rZW4udHlwZSA9PT0gInRhYmxlUm93IiB8fCB0b2tlbi50eXBlID09PSAidGFibGVEZWxpbWl0ZXJSb3ciKSB7CiAgICAgICAgaW5GaXJzdENlbGxBd2FpdGluZ1BpcGUgPSB0cnVlOwogICAgICAgIGN1cnJlbnRDZWxsID0gdm9pZCAwOwogICAgICAgIGxhc3RDZWxsID0gWzAsIDAsIDAsIDBdOwogICAgICAgIGNlbGwyID0gWzAsIGluZGV4MiArIDEsIDAsIDBdOwogICAgICAgIGlmIChhZnRlckhlYWRBd2FpdGluZ0ZpcnN0Qm9keVJvdykgewogICAgICAgICAgYWZ0ZXJIZWFkQXdhaXRpbmdGaXJzdEJvZHlSb3cgPSBmYWxzZTsKICAgICAgICAgIGN1cnJlbnRCb2R5ID0gewogICAgICAgICAgICB0eXBlOiAidGFibGVCb2R5IiwKICAgICAgICAgICAgc3RhcnQ6IE9iamVjdC5hc3NpZ24oe30sIHRva2VuLnN0YXJ0KSwKICAgICAgICAgICAgLy8gTm90ZTogY29ycmVjdCBlbmQgaXMgc2V0IGxhdGVyLgogICAgICAgICAgICBlbmQ6IE9iamVjdC5hc3NpZ24oe30sIHRva2VuLmVuZCkKICAgICAgICAgIH07CiAgICAgICAgICBtYXA3LmFkZChpbmRleDIsIDAsIFtbImVudGVyIiwgY3VycmVudEJvZHksIGNvbnRleHQyXV0pOwogICAgICAgIH0KICAgICAgICByb3dLaW5kID0gdG9rZW4udHlwZSA9PT0gInRhYmxlRGVsaW1pdGVyUm93IiA/IDIgOiBjdXJyZW50Qm9keSA/IDMgOiAxOwogICAgICB9IGVsc2UgaWYgKHJvd0tpbmQgJiYgKHRva2VuLnR5cGUgPT09ICJkYXRhIiB8fCB0b2tlbi50eXBlID09PSAidGFibGVEZWxpbWl0ZXJNYXJrZXIiIHx8IHRva2VuLnR5cGUgPT09ICJ0YWJsZURlbGltaXRlckZpbGxlciIpKSB7CiAgICAgICAgaW5GaXJzdENlbGxBd2FpdGluZ1BpcGUgPSBmYWxzZTsKICAgICAgICBpZiAoY2VsbDJbMl0gPT09IDApIHsKICAgICAgICAgIGlmIChsYXN0Q2VsbFsxXSAhPT0gMCkgewogICAgICAgICAgICBjZWxsMlswXSA9IGNlbGwyWzFdOwogICAgICAgICAgICBjdXJyZW50Q2VsbCA9IGZsdXNoQ2VsbChtYXA3LCBjb250ZXh0MiwgbGFzdENlbGwsIHJvd0tpbmQsIHZvaWQgMCwgY3VycmVudENlbGwpOwogICAgICAgICAgICBsYXN0Q2VsbCA9IFswLCAwLCAwLCAwXTsKICAgICAgICAgIH0KICAgICAgICAgIGNlbGwyWzJdID0gaW5kZXgyOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh0b2tlbi50eXBlID09PSAidGFibGVDZWxsRGl2aWRlciIpIHsKICAgICAgICBpZiAoaW5GaXJzdENlbGxBd2FpdGluZ1BpcGUpIHsKICAgICAgICAgIGluRmlyc3RDZWxsQXdhaXRpbmdQaXBlID0gZmFsc2U7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChsYXN0Q2VsbFsxXSAhPT0gMCkgewogICAgICAgICAgICBjZWxsMlswXSA9IGNlbGwyWzFdOwogICAgICAgICAgICBjdXJyZW50Q2VsbCA9IGZsdXNoQ2VsbChtYXA3LCBjb250ZXh0MiwgbGFzdENlbGwsIHJvd0tpbmQsIHZvaWQgMCwgY3VycmVudENlbGwpOwogICAgICAgICAgfQogICAgICAgICAgbGFzdENlbGwgPSBjZWxsMjsKICAgICAgICAgIGNlbGwyID0gW2xhc3RDZWxsWzFdLCBpbmRleDIsIDAsIDBdOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIGlmICh0b2tlbi50eXBlID09PSAidGFibGVIZWFkIikgewogICAgICBhZnRlckhlYWRBd2FpdGluZ0ZpcnN0Qm9keVJvdyA9IHRydWU7CiAgICAgIGxhc3RUYWJsZUVuZCA9IGluZGV4MjsKICAgIH0gZWxzZSBpZiAodG9rZW4udHlwZSA9PT0gInRhYmxlUm93IiB8fCB0b2tlbi50eXBlID09PSAidGFibGVEZWxpbWl0ZXJSb3ciKSB7CiAgICAgIGxhc3RUYWJsZUVuZCA9IGluZGV4MjsKICAgICAgaWYgKGxhc3RDZWxsWzFdICE9PSAwKSB7CiAgICAgICAgY2VsbDJbMF0gPSBjZWxsMlsxXTsKICAgICAgICBjdXJyZW50Q2VsbCA9IGZsdXNoQ2VsbChtYXA3LCBjb250ZXh0MiwgbGFzdENlbGwsIHJvd0tpbmQsIGluZGV4MiwgY3VycmVudENlbGwpOwogICAgICB9IGVsc2UgaWYgKGNlbGwyWzFdICE9PSAwKSB7CiAgICAgICAgY3VycmVudENlbGwgPSBmbHVzaENlbGwobWFwNywgY29udGV4dDIsIGNlbGwyLCByb3dLaW5kLCBpbmRleDIsIGN1cnJlbnRDZWxsKTsKICAgICAgfQogICAgICByb3dLaW5kID0gMDsKICAgIH0gZWxzZSBpZiAocm93S2luZCAmJiAodG9rZW4udHlwZSA9PT0gImRhdGEiIHx8IHRva2VuLnR5cGUgPT09ICJ0YWJsZURlbGltaXRlck1hcmtlciIgfHwgdG9rZW4udHlwZSA9PT0gInRhYmxlRGVsaW1pdGVyRmlsbGVyIikpIHsKICAgICAgY2VsbDJbM10gPSBpbmRleDI7CiAgICB9CiAgfQogIGlmIChsYXN0VGFibGVFbmQgIT09IDApIHsKICAgIGZsdXNoVGFibGVFbmQobWFwNywgY29udGV4dDIsIGxhc3RUYWJsZUVuZCwgY3VycmVudFRhYmxlLCBjdXJyZW50Qm9keSk7CiAgfQogIG1hcDcuY29uc3VtZShjb250ZXh0Mi5ldmVudHMpOwogIGluZGV4MiA9IC0xOwogIHdoaWxlICgrK2luZGV4MiA8IGNvbnRleHQyLmV2ZW50cy5sZW5ndGgpIHsKICAgIGNvbnN0IGV2ZW50ID0gY29udGV4dDIuZXZlbnRzW2luZGV4Ml07CiAgICBpZiAoZXZlbnRbMF0gPT09ICJlbnRlciIgJiYgZXZlbnRbMV0udHlwZSA9PT0gInRhYmxlIikgewogICAgICBldmVudFsxXS5fYWxpZ24gPSBnZm1UYWJsZUFsaWduKGNvbnRleHQyLmV2ZW50cywgaW5kZXgyKTsKICAgIH0KICB9CiAgcmV0dXJuIGV2ZW50czsKfQpfX25hbWUocmVzb2x2ZVRhYmxlLCAicmVzb2x2ZVRhYmxlIik7CmZ1bmN0aW9uIGZsdXNoQ2VsbChtYXA3LCBjb250ZXh0MiwgcmFuZ2UyLCByb3dLaW5kLCByb3dFbmQsIHByZXZpb3VzQ2VsbCkgewogIGNvbnN0IGdyb3VwTmFtZSA9IHJvd0tpbmQgPT09IDEgPyAidGFibGVIZWFkZXIiIDogcm93S2luZCA9PT0gMiA/ICJ0YWJsZURlbGltaXRlciIgOiAidGFibGVEYXRhIjsKICBjb25zdCB2YWx1ZU5hbWUgPSAidGFibGVDb250ZW50IjsKICBpZiAocmFuZ2UyWzBdICE9PSAwKSB7CiAgICBwcmV2aW91c0NlbGwuZW5kID0gT2JqZWN0LmFzc2lnbih7fSwgZ2V0UG9pbnQoY29udGV4dDIuZXZlbnRzLCByYW5nZTJbMF0pKTsKICAgIG1hcDcuYWRkKHJhbmdlMlswXSwgMCwgW1siZXhpdCIsIHByZXZpb3VzQ2VsbCwgY29udGV4dDJdXSk7CiAgfQogIGNvbnN0IG5vdzIgPSBnZXRQb2ludChjb250ZXh0Mi5ldmVudHMsIHJhbmdlMlsxXSk7CiAgcHJldmlvdXNDZWxsID0gewogICAgdHlwZTogZ3JvdXBOYW1lLAogICAgc3RhcnQ6IE9iamVjdC5hc3NpZ24oe30sIG5vdzIpLAogICAgLy8gTm90ZTogY29ycmVjdCBlbmQgaXMgc2V0IGxhdGVyLgogICAgZW5kOiBPYmplY3QuYXNzaWduKHt9LCBub3cyKQogIH07CiAgbWFwNy5hZGQocmFuZ2UyWzFdLCAwLCBbWyJlbnRlciIsIHByZXZpb3VzQ2VsbCwgY29udGV4dDJdXSk7CiAgaWYgKHJhbmdlMlsyXSAhPT0gMCkgewogICAgY29uc3QgcmVsYXRlZFN0YXJ0ID0gZ2V0UG9pbnQoY29udGV4dDIuZXZlbnRzLCByYW5nZTJbMl0pOwogICAgY29uc3QgcmVsYXRlZEVuZCA9IGdldFBvaW50KGNvbnRleHQyLmV2ZW50cywgcmFuZ2UyWzNdKTsKICAgIGNvbnN0IHZhbHVlVG9rZW4gPSB7CiAgICAgIHR5cGU6IHZhbHVlTmFtZSwKICAgICAgc3RhcnQ6IE9iamVjdC5hc3NpZ24oe30sIHJlbGF0ZWRTdGFydCksCiAgICAgIGVuZDogT2JqZWN0LmFzc2lnbih7fSwgcmVsYXRlZEVuZCkKICAgIH07CiAgICBtYXA3LmFkZChyYW5nZTJbMl0sIDAsIFtbImVudGVyIiwgdmFsdWVUb2tlbiwgY29udGV4dDJdXSk7CiAgICBpZiAocm93S2luZCAhPT0gMikgewogICAgICBjb25zdCBzdGFydCA9IGNvbnRleHQyLmV2ZW50c1tyYW5nZTJbMl1dOwogICAgICBjb25zdCBlbmQgPSBjb250ZXh0Mi5ldmVudHNbcmFuZ2UyWzNdXTsKICAgICAgc3RhcnRbMV0uZW5kID0gT2JqZWN0LmFzc2lnbih7fSwgZW5kWzFdLmVuZCk7CiAgICAgIHN0YXJ0WzFdLnR5cGUgPSAiY2h1bmtUZXh0IjsKICAgICAgc3RhcnRbMV0uY29udGVudFR5cGUgPSAidGV4dCI7CiAgICAgIGlmIChyYW5nZTJbM10gPiByYW5nZTJbMl0gKyAxKSB7CiAgICAgICAgY29uc3QgYTQgPSByYW5nZTJbMl0gKyAxOwogICAgICAgIGNvbnN0IGI0ID0gcmFuZ2UyWzNdIC0gcmFuZ2UyWzJdIC0gMTsKICAgICAgICBtYXA3LmFkZChhNCwgYjQsIFtdKTsKICAgICAgfQogICAgfQogICAgbWFwNy5hZGQocmFuZ2UyWzNdICsgMSwgMCwgW1siZXhpdCIsIHZhbHVlVG9rZW4sIGNvbnRleHQyXV0pOwogIH0KICBpZiAocm93RW5kICE9PSB2b2lkIDApIHsKICAgIHByZXZpb3VzQ2VsbC5lbmQgPSBPYmplY3QuYXNzaWduKHt9LCBnZXRQb2ludChjb250ZXh0Mi5ldmVudHMsIHJvd0VuZCkpOwogICAgbWFwNy5hZGQocm93RW5kLCAwLCBbWyJleGl0IiwgcHJldmlvdXNDZWxsLCBjb250ZXh0Ml1dKTsKICAgIHByZXZpb3VzQ2VsbCA9IHZvaWQgMDsKICB9CiAgcmV0dXJuIHByZXZpb3VzQ2VsbDsKfQpfX25hbWUoZmx1c2hDZWxsLCAiZmx1c2hDZWxsIik7CmZ1bmN0aW9uIGZsdXNoVGFibGVFbmQobWFwNywgY29udGV4dDIsIGluZGV4MiwgdGFibGUyLCB0YWJsZUJvZHkpIHsKICBjb25zdCBleGl0cyA9IFtdOwogIGNvbnN0IHJlbGF0ZWQgPSBnZXRQb2ludChjb250ZXh0Mi5ldmVudHMsIGluZGV4Mik7CiAgaWYgKHRhYmxlQm9keSkgewogICAgdGFibGVCb2R5LmVuZCA9IE9iamVjdC5hc3NpZ24oe30sIHJlbGF0ZWQpOwogICAgZXhpdHMucHVzaChbImV4aXQiLCB0YWJsZUJvZHksIGNvbnRleHQyXSk7CiAgfQogIHRhYmxlMi5lbmQgPSBPYmplY3QuYXNzaWduKHt9LCByZWxhdGVkKTsKICBleGl0cy5wdXNoKFsiZXhpdCIsIHRhYmxlMiwgY29udGV4dDJdKTsKICBtYXA3LmFkZChpbmRleDIgKyAxLCAwLCBleGl0cyk7Cn0KX19uYW1lKGZsdXNoVGFibGVFbmQsICJmbHVzaFRhYmxlRW5kIik7CmZ1bmN0aW9uIGdldFBvaW50KGV2ZW50cywgaW5kZXgyKSB7CiAgY29uc3QgZXZlbnQgPSBldmVudHNbaW5kZXgyXTsKICBjb25zdCBzaWRlID0gZXZlbnRbMF0gPT09ICJlbnRlciIgPyAic3RhcnQiIDogImVuZCI7CiAgcmV0dXJuIGV2ZW50WzFdW3NpZGVdOwp9Cl9fbmFtZShnZXRQb2ludCwgImdldFBvaW50Iik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFnZmlsdGVyQDIuMC4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS10YWdmaWx0ZXIvbGliL2luZGV4LmpzCnZhciByZUZsb3cgPSAvPChcLz8pKGlmcmFtZXxub2VtYmVkfG5vZnJhbWVzfHBsYWludGV4dHxzY3JpcHR8c3R5bGV8dGl0bGV8dGV4dGFyZWF8eG1wKSg/PVtcdFxuXGZcciAvPl0pL2dpOwp2YXIgcmVUZXh0ID0gbmV3IFJlZ0V4cCgiXiIgKyByZUZsb3cuc291cmNlLCAiaSIpOwpmdW5jdGlvbiBnZm1UYWdmaWx0ZXJIdG1sKCkgewogIHJldHVybiB7CiAgICBleGl0OiB7CiAgICAgIGh0bWxGbG93RGF0YSh0b2tlbikgewogICAgICAgIGV4aXRIdG1sRGF0YS5jYWxsKHRoaXMsIHRva2VuLCByZUZsb3cpOwogICAgICB9LAogICAgICBodG1sVGV4dERhdGEodG9rZW4pIHsKICAgICAgICBleGl0SHRtbERhdGEuY2FsbCh0aGlzLCB0b2tlbiwgcmVUZXh0KTsKICAgICAgfQogICAgfQogIH07Cn0KX19uYW1lKGdmbVRhZ2ZpbHRlckh0bWwsICJnZm1UYWdmaWx0ZXJIdG1sIik7CmZ1bmN0aW9uIGV4aXRIdG1sRGF0YSh0b2tlbiwgZmlsdGVyMikgewogIGxldCB2YWx1ZTIgPSB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKTsKICBpZiAodGhpcy5vcHRpb25zLmFsbG93RGFuZ2Vyb3VzSHRtbCkgewogICAgdmFsdWUyID0gdmFsdWUyLnJlcGxhY2UoZmlsdGVyMiwgIiZsdDskMSQyIik7CiAgfQogIHRoaXMucmF3KHRoaXMuZW5jb2RlKHZhbHVlMikpOwp9Cl9fbmFtZShleGl0SHRtbERhdGEsICJleGl0SHRtbERhdGEiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS10YXNrLWxpc3QtaXRlbUAyLjEuMC9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFzay1saXN0LWl0ZW0vbGliL2h0bWwuanMKZnVuY3Rpb24gZ2ZtVGFza0xpc3RJdGVtSHRtbCgpIHsKICByZXR1cm4gewogICAgZW50ZXI6IHsKICAgICAgdGFza0xpc3RDaGVjaygpIHsKICAgICAgICB0aGlzLnRhZygnPGlucHV0IHR5cGU9ImNoZWNrYm94IiBkaXNhYmxlZD0iIiAnKTsKICAgICAgfQogICAgfSwKICAgIGV4aXQ6IHsKICAgICAgdGFza0xpc3RDaGVjaygpIHsKICAgICAgICB0aGlzLnRhZygiLz4iKTsKICAgICAgfSwKICAgICAgdGFza0xpc3RDaGVja1ZhbHVlQ2hlY2tlZCgpIHsKICAgICAgICB0aGlzLnRhZygnY2hlY2tlZD0iIiAnKTsKICAgICAgfQogICAgfQogIH07Cn0KX19uYW1lKGdmbVRhc2tMaXN0SXRlbUh0bWwsICJnZm1UYXNrTGlzdEl0ZW1IdG1sIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFzay1saXN0LWl0ZW1AMi4xLjAvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhc2stbGlzdC1pdGVtL2xpYi9zeW50YXguanMKdmFyIHRhc2tsaXN0Q2hlY2sgPSB7CiAgbmFtZTogInRhc2tsaXN0Q2hlY2siLAogIHRva2VuaXplOiB0b2tlbml6ZVRhc2tsaXN0Q2hlY2sKfTsKZnVuY3Rpb24gZ2ZtVGFza0xpc3RJdGVtKCkgewogIHJldHVybiB7CiAgICB0ZXh0OiB7CiAgICAgIFs5MV06IHRhc2tsaXN0Q2hlY2sKICAgIH0KICB9Owp9Cl9fbmFtZShnZm1UYXNrTGlzdEl0ZW0sICJnZm1UYXNrTGlzdEl0ZW0iKTsKZnVuY3Rpb24gdG9rZW5pemVUYXNrbGlzdENoZWNrKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIHJldHVybiBvcGVuOwogIGZ1bmN0aW9uIG9wZW4oY29kZTQpIHsKICAgIGlmICgKICAgICAgLy8gRXhpdCBpZiB0aGVyZeKAmXMgc3R1ZmYgYmVmb3JlLgogICAgICBzZWxmMi5wcmV2aW91cyAhPT0gbnVsbCB8fCAvLyBFeGl0IGlmIG5vdCBpbiB0aGUgZmlyc3QgY29udGVudCB0aGF0IGlzIHRoZSBmaXJzdCBjaGlsZCBvZiBhIGxpc3QKICAgICAgLy8gaXRlbS4KICAgICAgIXNlbGYyLl9nZm1UYXNrbGlzdEZpcnN0Q29udGVudE9mTGlzdEl0ZW0KICAgICkgewogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuZW50ZXIoInRhc2tMaXN0Q2hlY2siKTsKICAgIGVmZmVjdHMuZW50ZXIoInRhc2tMaXN0Q2hlY2tNYXJrZXIiKTsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICBlZmZlY3RzLmV4aXQoInRhc2tMaXN0Q2hlY2tNYXJrZXIiKTsKICAgIHJldHVybiBpbnNpZGU7CiAgfQogIF9fbmFtZShvcGVuLCAib3BlbiIpOwogIGZ1bmN0aW9uIGluc2lkZShjb2RlNCkgewogICAgaWYgKG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuZW50ZXIoInRhc2tMaXN0Q2hlY2tWYWx1ZVVuY2hlY2tlZCIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoInRhc2tMaXN0Q2hlY2tWYWx1ZVVuY2hlY2tlZCIpOwogICAgICByZXR1cm4gY2xvc2U3OwogICAgfQogICAgaWYgKGNvZGU0ID09PSA4OCB8fCBjb2RlNCA9PT0gMTIwKSB7CiAgICAgIGVmZmVjdHMuZW50ZXIoInRhc2tMaXN0Q2hlY2tWYWx1ZUNoZWNrZWQiKTsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgZWZmZWN0cy5leGl0KCJ0YXNrTGlzdENoZWNrVmFsdWVDaGVja2VkIik7CiAgICAgIHJldHVybiBjbG9zZTc7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKGluc2lkZSwgImluc2lkZSIpOwogIGZ1bmN0aW9uIGNsb3NlNyhjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA5MykgewogICAgICBlZmZlY3RzLmVudGVyKCJ0YXNrTGlzdENoZWNrTWFya2VyIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgidGFza0xpc3RDaGVja01hcmtlciIpOwogICAgICBlZmZlY3RzLmV4aXQoInRhc2tMaXN0Q2hlY2siKTsKICAgICAgcmV0dXJuIGFmdGVyOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZShjbG9zZTcsICJjbG9zZSIpOwogIGZ1bmN0aW9uIGFmdGVyKGNvZGU0KSB7CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICByZXR1cm4gb2szKGNvZGU0KTsKICAgIH0KICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICByZXR1cm4gZWZmZWN0cy5jaGVjayh7CiAgICAgICAgdG9rZW5pemU6IHNwYWNlVGhlbk5vblNwYWNlCiAgICAgIH0sIG9rMywgbm9rKShjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKGFmdGVyLCAiYWZ0ZXIiKTsKfQpfX25hbWUodG9rZW5pemVUYXNrbGlzdENoZWNrLCAidG9rZW5pemVUYXNrbGlzdENoZWNrIik7CmZ1bmN0aW9uIHNwYWNlVGhlbk5vblNwYWNlKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBhZnRlciwgIndoaXRlc3BhY2UiKTsKICBmdW5jdGlvbiBhZnRlcihjb2RlNCkgewogICAgcmV0dXJuIGNvZGU0ID09PSBudWxsID8gbm9rKGNvZGU0KSA6IG9rMyhjb2RlNCk7CiAgfQogIF9fbmFtZShhZnRlciwgImFmdGVyIik7Cn0KX19uYW1lKHNwYWNlVGhlbk5vblNwYWNlLCAic3BhY2VUaGVuTm9uU3BhY2UiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZXh0ZW5zaW9uLWdmbUAzLjAuMC9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0vaW5kZXguanMKZnVuY3Rpb24gZ2ZtKG9wdGlvbnMpIHsKICByZXR1cm4gY29tYmluZUV4dGVuc2lvbnMoWwogICAgZ2ZtQXV0b2xpbmtMaXRlcmFsKCksCiAgICBnZm1Gb290bm90ZSgpLAogICAgZ2ZtU3RyaWtldGhyb3VnaChvcHRpb25zKSwKICAgIGdmbVRhYmxlKCksCiAgICBnZm1UYXNrTGlzdEl0ZW0oKQogIF0pOwp9Cl9fbmFtZShnZm0sICJnZm0iKTsKZnVuY3Rpb24gZ2ZtSHRtbChvcHRpb25zKSB7CiAgcmV0dXJuIGNvbWJpbmVIdG1sRXh0ZW5zaW9ucyhbCiAgICBnZm1BdXRvbGlua0xpdGVyYWxIdG1sKCksCiAgICBnZm1Gb290bm90ZUh0bWwob3B0aW9ucyksCiAgICBnZm1TdHJpa2V0aHJvdWdoSHRtbCgpLAogICAgZ2ZtVGFibGVIdG1sKCksCiAgICBnZm1UYWdmaWx0ZXJIdG1sKCksCiAgICBnZm1UYXNrTGlzdEl0ZW1IdG1sKCkKICBdKTsKfQpfX25hbWUoZ2ZtSHRtbCwgImdmbUh0bWwiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yZW1hcmstZ2ZtQDQuMC4xL25vZGVfbW9kdWxlcy9yZW1hcmstZ2ZtL2xpYi9pbmRleC5qcwp2YXIgZW1wdHlPcHRpb25zMyA9IHt9OwpmdW5jdGlvbiByZW1hcmtHZm0ob3B0aW9ucykgewogIGNvbnN0IHNlbGYyID0gKAogICAgLyoqIEB0eXBlIHtQcm9jZXNzb3I8Um9vdD59ICovCiAgICB0aGlzCiAgKTsKICBjb25zdCBzZXR0aW5ncyA9IG9wdGlvbnMgfHwgZW1wdHlPcHRpb25zMzsKICBjb25zdCBkYXRhID0gc2VsZjIuZGF0YSgpOwogIGNvbnN0IG1pY3JvbWFya0V4dGVuc2lvbnMgPSBkYXRhLm1pY3JvbWFya0V4dGVuc2lvbnMgfHwgKGRhdGEubWljcm9tYXJrRXh0ZW5zaW9ucyA9IFtdKTsKICBjb25zdCBmcm9tTWFya2Rvd25FeHRlbnNpb25zID0gZGF0YS5mcm9tTWFya2Rvd25FeHRlbnNpb25zIHx8IChkYXRhLmZyb21NYXJrZG93bkV4dGVuc2lvbnMgPSBbXSk7CiAgY29uc3QgdG9NYXJrZG93bkV4dGVuc2lvbnMgPSBkYXRhLnRvTWFya2Rvd25FeHRlbnNpb25zIHx8IChkYXRhLnRvTWFya2Rvd25FeHRlbnNpb25zID0gW10pOwogIG1pY3JvbWFya0V4dGVuc2lvbnMucHVzaChnZm0oc2V0dGluZ3MpKTsKICBmcm9tTWFya2Rvd25FeHRlbnNpb25zLnB1c2goZ2ZtRnJvbU1hcmtkb3duKCkpOwogIHRvTWFya2Rvd25FeHRlbnNpb25zLnB1c2goZ2ZtVG9NYXJrZG93bihzZXR0aW5ncykpOwp9Cl9fbmFtZShyZW1hcmtHZm0sICJyZW1hcmtHZm0iKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmtANC4wLjIvbm9kZV9tb2R1bGVzL21pY3JvbWFyay9saWIvY29tcGlsZS5qcwp2YXIgaGFzT3duUHJvcGVydHkyID0ge30uaGFzT3duUHJvcGVydHk7CnZhciBwcm90b2NvbEhyZWYgPSAvXihodHRwcz98aXJjcz98bWFpbHRvfHhtcHApJC9pOwp2YXIgcHJvdG9jb2xTb3VyY2UgPSAvXmh0dHBzPyQvaTsKZnVuY3Rpb24gY29tcGlsZShvcHRpb25zKSB7CiAgY29uc3Qgc2V0dGluZ3MgPSBvcHRpb25zIHx8IHt9OwogIGxldCB0YWdzID0gdHJ1ZTsKICBjb25zdCBkZWZpbml0aW9ucyA9IHt9OwogIGNvbnN0IGJ1ZmZlcnMgPSBbW11dOwogIGNvbnN0IG1lZGlhU3RhY2sgPSBbXTsKICBjb25zdCB0aWdodFN0YWNrID0gW107CiAgY29uc3QgZGVmYXVsdEhhbmRsZXJzID0gewogICAgZW50ZXI6IHsKICAgICAgYmxvY2tRdW90ZTogb25lbnRlcmJsb2NrcXVvdGUsCiAgICAgIGNvZGVGZW5jZWQ6IG9uZW50ZXJjb2RlZmVuY2VkLAogICAgICBjb2RlRmVuY2VkRmVuY2VJbmZvOiBidWZmZXIyLAogICAgICBjb2RlRmVuY2VkRmVuY2VNZXRhOiBidWZmZXIyLAogICAgICBjb2RlSW5kZW50ZWQ6IG9uZW50ZXJjb2RlaW5kZW50ZWQsCiAgICAgIGNvZGVUZXh0OiBvbmVudGVyY29kZXRleHQsCiAgICAgIGNvbnRlbnQ6IG9uZW50ZXJjb250ZW50LAogICAgICBkZWZpbml0aW9uOiBvbmVudGVyZGVmaW5pdGlvbiwKICAgICAgZGVmaW5pdGlvbkRlc3RpbmF0aW9uU3RyaW5nOiBvbmVudGVyZGVmaW5pdGlvbmRlc3RpbmF0aW9uc3RyaW5nLAogICAgICBkZWZpbml0aW9uTGFiZWxTdHJpbmc6IGJ1ZmZlcjIsCiAgICAgIGRlZmluaXRpb25UaXRsZVN0cmluZzogYnVmZmVyMiwKICAgICAgZW1waGFzaXM6IG9uZW50ZXJlbXBoYXNpcywKICAgICAgaHRtbEZsb3c6IG9uZW50ZXJodG1sZmxvdywKICAgICAgaHRtbFRleHQ6IG9uZW50ZXJodG1sLAogICAgICBpbWFnZTogb25lbnRlcmltYWdlLAogICAgICBsYWJlbDogYnVmZmVyMiwKICAgICAgbGluazogb25lbnRlcmxpbmssCiAgICAgIGxpc3RJdGVtTWFya2VyOiBvbmVudGVybGlzdGl0ZW1tYXJrZXIsCiAgICAgIGxpc3RJdGVtVmFsdWU6IG9uZW50ZXJsaXN0aXRlbXZhbHVlLAogICAgICBsaXN0T3JkZXJlZDogb25lbnRlcmxpc3RvcmRlcmVkLAogICAgICBsaXN0VW5vcmRlcmVkOiBvbmVudGVybGlzdHVub3JkZXJlZCwKICAgICAgcGFyYWdyYXBoOiBvbmVudGVycGFyYWdyYXBoLAogICAgICByZWZlcmVuY2U6IGJ1ZmZlcjIsCiAgICAgIHJlc291cmNlOiBvbmVudGVycmVzb3VyY2UsCiAgICAgIHJlc291cmNlRGVzdGluYXRpb25TdHJpbmc6IG9uZW50ZXJyZXNvdXJjZWRlc3RpbmF0aW9uc3RyaW5nLAogICAgICByZXNvdXJjZVRpdGxlU3RyaW5nOiBidWZmZXIyLAogICAgICBzZXRleHRIZWFkaW5nOiBvbmVudGVyc2V0ZXh0aGVhZGluZywKICAgICAgc3Ryb25nOiBvbmVudGVyc3Ryb25nCiAgICB9LAogICAgZXhpdDogewogICAgICBhdHhIZWFkaW5nOiBvbmV4aXRhdHhoZWFkaW5nLAogICAgICBhdHhIZWFkaW5nU2VxdWVuY2U6IG9uZXhpdGF0eGhlYWRpbmdzZXF1ZW5jZSwKICAgICAgYXV0b2xpbmtFbWFpbDogb25leGl0YXV0b2xpbmtlbWFpbCwKICAgICAgYXV0b2xpbmtQcm90b2NvbDogb25leGl0YXV0b2xpbmtwcm90b2NvbCwKICAgICAgYmxvY2tRdW90ZTogb25leGl0YmxvY2txdW90ZSwKICAgICAgY2hhcmFjdGVyRXNjYXBlVmFsdWU6IG9uZXhpdGRhdGEsCiAgICAgIGNoYXJhY3RlclJlZmVyZW5jZU1hcmtlckhleGFkZWNpbWFsOiBvbmV4aXRjaGFyYWN0ZXJyZWZlcmVuY2VtYXJrZXIsCiAgICAgIGNoYXJhY3RlclJlZmVyZW5jZU1hcmtlck51bWVyaWM6IG9uZXhpdGNoYXJhY3RlcnJlZmVyZW5jZW1hcmtlciwKICAgICAgY2hhcmFjdGVyUmVmZXJlbmNlVmFsdWU6IG9uZXhpdGNoYXJhY3RlcnJlZmVyZW5jZXZhbHVlLAogICAgICBjb2RlRmVuY2VkOiBvbmV4aXRmbG93Y29kZSwKICAgICAgY29kZUZlbmNlZEZlbmNlOiBvbmV4aXRjb2RlZmVuY2VkZmVuY2UsCiAgICAgIGNvZGVGZW5jZWRGZW5jZUluZm86IG9uZXhpdGNvZGVmZW5jZWRmZW5jZWluZm8sCiAgICAgIGNvZGVGZW5jZWRGZW5jZU1ldGE6IG9ucmVzdW1lZHJvcCwKICAgICAgY29kZUZsb3dWYWx1ZTogb25leGl0Y29kZWZsb3d2YWx1ZSwKICAgICAgY29kZUluZGVudGVkOiBvbmV4aXRmbG93Y29kZSwKICAgICAgY29kZVRleHQ6IG9uZXhpdGNvZGV0ZXh0LAogICAgICBjb2RlVGV4dERhdGE6IG9uZXhpdGRhdGEsCiAgICAgIGRhdGE6IG9uZXhpdGRhdGEsCiAgICAgIGRlZmluaXRpb246IG9uZXhpdGRlZmluaXRpb24sCiAgICAgIGRlZmluaXRpb25EZXN0aW5hdGlvblN0cmluZzogb25leGl0ZGVmaW5pdGlvbmRlc3RpbmF0aW9uc3RyaW5nLAogICAgICBkZWZpbml0aW9uTGFiZWxTdHJpbmc6IG9uZXhpdGRlZmluaXRpb25sYWJlbHN0cmluZywKICAgICAgZGVmaW5pdGlvblRpdGxlU3RyaW5nOiBvbmV4aXRkZWZpbml0aW9udGl0bGVzdHJpbmcsCiAgICAgIGVtcGhhc2lzOiBvbmV4aXRlbXBoYXNpcywKICAgICAgaGFyZEJyZWFrRXNjYXBlOiBvbmV4aXRoYXJkYnJlYWssCiAgICAgIGhhcmRCcmVha1RyYWlsaW5nOiBvbmV4aXRoYXJkYnJlYWssCiAgICAgIGh0bWxGbG93OiBvbmV4aXRodG1sLAogICAgICBodG1sRmxvd0RhdGE6IG9uZXhpdGRhdGEsCiAgICAgIGh0bWxUZXh0OiBvbmV4aXRodG1sLAogICAgICBodG1sVGV4dERhdGE6IG9uZXhpdGRhdGEsCiAgICAgIGltYWdlOiBvbmV4aXRtZWRpYSwKICAgICAgbGFiZWw6IG9uZXhpdGxhYmVsLAogICAgICBsYWJlbFRleHQ6IG9uZXhpdGxhYmVsdGV4dCwKICAgICAgbGluZUVuZGluZzogb25leGl0bGluZWVuZGluZywKICAgICAgbGluazogb25leGl0bWVkaWEsCiAgICAgIGxpc3RPcmRlcmVkOiBvbmV4aXRsaXN0b3JkZXJlZCwKICAgICAgbGlzdFVub3JkZXJlZDogb25leGl0bGlzdHVub3JkZXJlZCwKICAgICAgcGFyYWdyYXBoOiBvbmV4aXRwYXJhZ3JhcGgsCiAgICAgIHJlZmVyZW5jZTogb25yZXN1bWVkcm9wLAogICAgICByZWZlcmVuY2VTdHJpbmc6IG9uZXhpdHJlZmVyZW5jZXN0cmluZywKICAgICAgcmVzb3VyY2U6IG9ucmVzdW1lZHJvcCwKICAgICAgcmVzb3VyY2VEZXN0aW5hdGlvblN0cmluZzogb25leGl0cmVzb3VyY2VkZXN0aW5hdGlvbnN0cmluZywKICAgICAgcmVzb3VyY2VUaXRsZVN0cmluZzogb25leGl0cmVzb3VyY2V0aXRsZXN0cmluZywKICAgICAgc2V0ZXh0SGVhZGluZzogb25leGl0c2V0ZXh0aGVhZGluZywKICAgICAgc2V0ZXh0SGVhZGluZ0xpbmVTZXF1ZW5jZTogb25leGl0c2V0ZXh0aGVhZGluZ2xpbmVzZXF1ZW5jZSwKICAgICAgc2V0ZXh0SGVhZGluZ1RleHQ6IG9uZXhpdHNldGV4dGhlYWRpbmd0ZXh0LAogICAgICBzdHJvbmc6IG9uZXhpdHN0cm9uZywKICAgICAgdGhlbWF0aWNCcmVhazogb25leGl0dGhlbWF0aWNicmVhawogICAgfQogIH07CiAgY29uc3QgaGFuZGxlcnMyID0gKAogICAgLyoqIEB0eXBlIHtOb3JtYWxpemVkSHRtbEV4dGVuc2lvbn0gKi8KICAgIGNvbWJpbmVIdG1sRXh0ZW5zaW9ucyhbZGVmYXVsdEhhbmRsZXJzLCAuLi5zZXR0aW5ncy5odG1sRXh0ZW5zaW9ucyB8fCBbXV0pCiAgKTsKICBjb25zdCBkYXRhID0gewogICAgZGVmaW5pdGlvbnMsCiAgICB0aWdodFN0YWNrCiAgfTsKICBjb25zdCBjb250ZXh0MiA9IHsKICAgIGJ1ZmZlcjogYnVmZmVyMiwKICAgIGVuY29kZTogZW5jb2RlMiwKICAgIGdldERhdGEsCiAgICBsaW5lRW5kaW5nSWZOZWVkZWQsCiAgICBvcHRpb25zOiBzZXR0aW5ncywKICAgIHJhdzogcmF3MiwKICAgIHJlc3VtZSwKICAgIHNldERhdGEsCiAgICB0YWcKICB9OwogIGxldCBsaW5lRW5kaW5nU3R5bGUgPSBzZXR0aW5ncy5kZWZhdWx0TGluZUVuZGluZzsKICByZXR1cm4gY29tcGlsZTI7CiAgZnVuY3Rpb24gY29tcGlsZTIoZXZlbnRzKSB7CiAgICBsZXQgaW5kZXgyID0gLTE7CiAgICBsZXQgc3RhcnQgPSAwOwogICAgY29uc3QgbGlzdFN0YWNrID0gW107CiAgICBsZXQgaGVhZDIgPSBbXTsKICAgIGxldCBib2R5MyA9IFtdOwogICAgd2hpbGUgKCsraW5kZXgyIDwgZXZlbnRzLmxlbmd0aCkgewogICAgICBpZiAoIWxpbmVFbmRpbmdTdHlsZSAmJiAoZXZlbnRzW2luZGV4Ml1bMV0udHlwZSA9PT0gImxpbmVFbmRpbmciIHx8IGV2ZW50c1tpbmRleDJdWzFdLnR5cGUgPT09ICJsaW5lRW5kaW5nQmxhbmsiKSkgewogICAgICAgIGxpbmVFbmRpbmdTdHlsZSA9IC8qKiBAdHlwZSB7TGluZUVuZGluZ30gKi8KICAgICAgICBldmVudHNbaW5kZXgyXVsyXS5zbGljZVNlcmlhbGl6ZShldmVudHNbaW5kZXgyXVsxXSk7CiAgICAgIH0KICAgICAgaWYgKGV2ZW50c1tpbmRleDJdWzFdLnR5cGUgPT09ICJsaXN0T3JkZXJlZCIgfHwgZXZlbnRzW2luZGV4Ml1bMV0udHlwZSA9PT0gImxpc3RVbm9yZGVyZWQiKSB7CiAgICAgICAgaWYgKGV2ZW50c1tpbmRleDJdWzBdID09PSAiZW50ZXIiKSB7CiAgICAgICAgICBsaXN0U3RhY2sucHVzaChpbmRleDIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwcmVwYXJlTGlzdChldmVudHMuc2xpY2UobGlzdFN0YWNrLnBvcCgpLCBpbmRleDIpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGV2ZW50c1tpbmRleDJdWzFdLnR5cGUgPT09ICJkZWZpbml0aW9uIikgewogICAgICAgIGlmIChldmVudHNbaW5kZXgyXVswXSA9PT0gImVudGVyIikgewogICAgICAgICAgYm9keTMgPSBwdXNoKGJvZHkzLCBldmVudHMuc2xpY2Uoc3RhcnQsIGluZGV4MikpOwogICAgICAgICAgc3RhcnQgPSBpbmRleDI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGhlYWQyID0gcHVzaChoZWFkMiwgZXZlbnRzLnNsaWNlKHN0YXJ0LCBpbmRleDIgKyAxKSk7CiAgICAgICAgICBzdGFydCA9IGluZGV4MiArIDE7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBoZWFkMiA9IHB1c2goaGVhZDIsIGJvZHkzKTsKICAgIGhlYWQyID0gcHVzaChoZWFkMiwgZXZlbnRzLnNsaWNlKHN0YXJ0KSk7CiAgICBpbmRleDIgPSAtMTsKICAgIGNvbnN0IHJlc3VsdCA9IGhlYWQyOwogICAgaWYgKGhhbmRsZXJzMi5lbnRlci5udWxsKSB7CiAgICAgIGhhbmRsZXJzMi5lbnRlci5udWxsLmNhbGwoY29udGV4dDIpOwogICAgfQogICAgd2hpbGUgKCsraW5kZXgyIDwgZXZlbnRzLmxlbmd0aCkgewogICAgICBjb25zdCBoYW5kbGVzID0gaGFuZGxlcnMyW3Jlc3VsdFtpbmRleDJdWzBdXTsKICAgICAgY29uc3Qga2luZCA9IHJlc3VsdFtpbmRleDJdWzFdLnR5cGU7CiAgICAgIGNvbnN0IGhhbmRsZTMgPSBoYW5kbGVzW2tpbmRdOwogICAgICBpZiAoaGFzT3duUHJvcGVydHkyLmNhbGwoaGFuZGxlcywga2luZCkgJiYgaGFuZGxlMykgewogICAgICAgIGhhbmRsZTMuY2FsbCh7CiAgICAgICAgICBzbGljZVNlcmlhbGl6ZTogcmVzdWx0W2luZGV4Ml1bMl0uc2xpY2VTZXJpYWxpemUsCiAgICAgICAgICAuLi5jb250ZXh0MgogICAgICAgIH0sIHJlc3VsdFtpbmRleDJdWzFdKTsKICAgICAgfQogICAgfQogICAgaWYgKGhhbmRsZXJzMi5leGl0Lm51bGwpIHsKICAgICAgaGFuZGxlcnMyLmV4aXQubnVsbC5jYWxsKGNvbnRleHQyKTsKICAgIH0KICAgIHJldHVybiBidWZmZXJzWzBdLmpvaW4oIiIpOwogIH0KICBfX25hbWUoY29tcGlsZTIsICJjb21waWxlIik7CiAgZnVuY3Rpb24gcHJlcGFyZUxpc3Qoc2xpY2UpIHsKICAgIGNvbnN0IGxlbmd0aCA9IHNsaWNlLmxlbmd0aDsKICAgIGxldCBpbmRleDIgPSAwOwogICAgbGV0IGNvbnRhaW5lckJhbGFuY2UgPSAwOwogICAgbGV0IGxvb3NlID0gZmFsc2U7CiAgICBsZXQgYXRNYXJrZXI7CiAgICB3aGlsZSAoKytpbmRleDIgPCBsZW5ndGgpIHsKICAgICAgY29uc3QgZXZlbnQgPSBzbGljZVtpbmRleDJdOwogICAgICBpZiAoZXZlbnRbMV0uX2NvbnRhaW5lcikgewogICAgICAgIGF0TWFya2VyID0gdm9pZCAwOwogICAgICAgIGlmIChldmVudFswXSA9PT0gImVudGVyIikgewogICAgICAgICAgY29udGFpbmVyQmFsYW5jZSsrOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb250YWluZXJCYWxhbmNlLS07CiAgICAgICAgfQogICAgICB9IGVsc2Ugc3dpdGNoIChldmVudFsxXS50eXBlKSB7CiAgICAgICAgY2FzZSAibGlzdEl0ZW1QcmVmaXgiOiB7CiAgICAgICAgICBpZiAoZXZlbnRbMF0gPT09ICJleGl0IikgewogICAgICAgICAgICBhdE1hcmtlciA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY2FzZSAibGluZVByZWZpeCI6IHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjYXNlICJsaW5lRW5kaW5nQmxhbmsiOiB7CiAgICAgICAgICBpZiAoZXZlbnRbMF0gPT09ICJlbnRlciIgJiYgIWNvbnRhaW5lckJhbGFuY2UpIHsKICAgICAgICAgICAgaWYgKGF0TWFya2VyKSB7CiAgICAgICAgICAgICAgYXRNYXJrZXIgPSB2b2lkIDA7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgbG9vc2UgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgZGVmYXVsdDogewogICAgICAgICAgYXRNYXJrZXIgPSB2b2lkIDA7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBzbGljZVswXVsxXS5fbG9vc2UgPSBsb29zZTsKICB9CiAgX19uYW1lKHByZXBhcmVMaXN0LCAicHJlcGFyZUxpc3QiKTsKICBmdW5jdGlvbiBzZXREYXRhKGtleTIsIHZhbHVlMikgewogICAgZGF0YVtrZXkyXSA9IHZhbHVlMjsKICB9CiAgX19uYW1lKHNldERhdGEsICJzZXREYXRhIik7CiAgZnVuY3Rpb24gZ2V0RGF0YShrZXkyKSB7CiAgICByZXR1cm4gZGF0YVtrZXkyXTsKICB9CiAgX19uYW1lKGdldERhdGEsICJnZXREYXRhIik7CiAgZnVuY3Rpb24gYnVmZmVyMigpIHsKICAgIGJ1ZmZlcnMucHVzaChbXSk7CiAgfQogIF9fbmFtZShidWZmZXIyLCAiYnVmZmVyIik7CiAgZnVuY3Rpb24gcmVzdW1lKCkgewogICAgY29uc3QgYnVmID0gYnVmZmVycy5wb3AoKTsKICAgIHJldHVybiBidWYuam9pbigiIik7CiAgfQogIF9fbmFtZShyZXN1bWUsICJyZXN1bWUiKTsKICBmdW5jdGlvbiB0YWcodmFsdWUyKSB7CiAgICBpZiAoIXRhZ3MpIHJldHVybjsKICAgIHNldERhdGEoImxhc3RXYXNUYWciLCB0cnVlKTsKICAgIGJ1ZmZlcnNbYnVmZmVycy5sZW5ndGggLSAxXS5wdXNoKHZhbHVlMik7CiAgfQogIF9fbmFtZSh0YWcsICJ0YWciKTsKICBmdW5jdGlvbiByYXcyKHZhbHVlMikgewogICAgc2V0RGF0YSgibGFzdFdhc1RhZyIpOwogICAgYnVmZmVyc1tidWZmZXJzLmxlbmd0aCAtIDFdLnB1c2godmFsdWUyKTsKICB9CiAgX19uYW1lKHJhdzIsICJyYXciKTsKICBmdW5jdGlvbiBsaW5lRW5kaW5nMigpIHsKICAgIHJhdzIobGluZUVuZGluZ1N0eWxlIHx8ICJcbiIpOwogIH0KICBfX25hbWUobGluZUVuZGluZzIsICJsaW5lRW5kaW5nIik7CiAgZnVuY3Rpb24gbGluZUVuZGluZ0lmTmVlZGVkKCkgewogICAgY29uc3QgYnVmZmVyMyA9IGJ1ZmZlcnNbYnVmZmVycy5sZW5ndGggLSAxXTsKICAgIGNvbnN0IHNsaWNlID0gYnVmZmVyM1tidWZmZXIzLmxlbmd0aCAtIDFdOwogICAgY29uc3QgcHJldmlvdXMzID0gc2xpY2UgPyBzbGljZS5jaGFyQ29kZUF0KHNsaWNlLmxlbmd0aCAtIDEpIDogbnVsbDsKICAgIGlmIChwcmV2aW91czMgPT09IDEwIHx8IHByZXZpb3VzMyA9PT0gMTMgfHwgcHJldmlvdXMzID09PSBudWxsKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGxpbmVFbmRpbmcyKCk7CiAgfQogIF9fbmFtZShsaW5lRW5kaW5nSWZOZWVkZWQsICJsaW5lRW5kaW5nSWZOZWVkZWQiKTsKICBmdW5jdGlvbiBlbmNvZGUyKHZhbHVlMikgewogICAgcmV0dXJuIGdldERhdGEoImlnbm9yZUVuY29kZSIpID8gdmFsdWUyIDogZW5jb2RlKHZhbHVlMik7CiAgfQogIF9fbmFtZShlbmNvZGUyLCAiZW5jb2RlIik7CiAgZnVuY3Rpb24gb25yZXN1bWVkcm9wKCkgewogICAgcmVzdW1lKCk7CiAgfQogIF9fbmFtZShvbnJlc3VtZWRyb3AsICJvbnJlc3VtZWRyb3AiKTsKICBmdW5jdGlvbiBvbmVudGVybGlzdG9yZGVyZWQodG9rZW4pIHsKICAgIHRpZ2h0U3RhY2sucHVzaCghdG9rZW4uX2xvb3NlKTsKICAgIGxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgdGFnKCI8b2wiKTsKICAgIHNldERhdGEoImV4cGVjdEZpcnN0SXRlbSIsIHRydWUpOwogIH0KICBfX25hbWUob25lbnRlcmxpc3RvcmRlcmVkLCAib25lbnRlcmxpc3RvcmRlcmVkIik7CiAgZnVuY3Rpb24gb25lbnRlcmxpc3R1bm9yZGVyZWQodG9rZW4pIHsKICAgIHRpZ2h0U3RhY2sucHVzaCghdG9rZW4uX2xvb3NlKTsKICAgIGxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgdGFnKCI8dWwiKTsKICAgIHNldERhdGEoImV4cGVjdEZpcnN0SXRlbSIsIHRydWUpOwogIH0KICBfX25hbWUob25lbnRlcmxpc3R1bm9yZGVyZWQsICJvbmVudGVybGlzdHVub3JkZXJlZCIpOwogIGZ1bmN0aW9uIG9uZW50ZXJsaXN0aXRlbXZhbHVlKHRva2VuKSB7CiAgICBpZiAoZ2V0RGF0YSgiZXhwZWN0Rmlyc3RJdGVtIikpIHsKICAgICAgY29uc3QgdmFsdWUyID0gTnVtYmVyLnBhcnNlSW50KHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pLCAxMCk7CiAgICAgIGlmICh2YWx1ZTIgIT09IDEpIHsKICAgICAgICB0YWcoJyBzdGFydD0iJyArIGVuY29kZTIoU3RyaW5nKHZhbHVlMikpICsgJyInKTsKICAgICAgfQogICAgfQogIH0KICBfX25hbWUob25lbnRlcmxpc3RpdGVtdmFsdWUsICJvbmVudGVybGlzdGl0ZW12YWx1ZSIpOwogIGZ1bmN0aW9uIG9uZW50ZXJsaXN0aXRlbW1hcmtlcigpIHsKICAgIGlmIChnZXREYXRhKCJleHBlY3RGaXJzdEl0ZW0iKSkgewogICAgICB0YWcoIj4iKTsKICAgIH0gZWxzZSB7CiAgICAgIG9uZXhpdGxpc3RpdGVtKCk7CiAgICB9CiAgICBsaW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgIHRhZygiPGxpPiIpOwogICAgc2V0RGF0YSgiZXhwZWN0Rmlyc3RJdGVtIik7CiAgICBzZXREYXRhKCJsYXN0V2FzVGFnIik7CiAgfQogIF9fbmFtZShvbmVudGVybGlzdGl0ZW1tYXJrZXIsICJvbmVudGVybGlzdGl0ZW1tYXJrZXIiKTsKICBmdW5jdGlvbiBvbmV4aXRsaXN0b3JkZXJlZCgpIHsKICAgIG9uZXhpdGxpc3RpdGVtKCk7CiAgICB0aWdodFN0YWNrLnBvcCgpOwogICAgbGluZUVuZGluZzIoKTsKICAgIHRhZygiPC9vbD4iKTsKICB9CiAgX19uYW1lKG9uZXhpdGxpc3RvcmRlcmVkLCAib25leGl0bGlzdG9yZGVyZWQiKTsKICBmdW5jdGlvbiBvbmV4aXRsaXN0dW5vcmRlcmVkKCkgewogICAgb25leGl0bGlzdGl0ZW0oKTsKICAgIHRpZ2h0U3RhY2sucG9wKCk7CiAgICBsaW5lRW5kaW5nMigpOwogICAgdGFnKCI8L3VsPiIpOwogIH0KICBfX25hbWUob25leGl0bGlzdHVub3JkZXJlZCwgIm9uZXhpdGxpc3R1bm9yZGVyZWQiKTsKICBmdW5jdGlvbiBvbmV4aXRsaXN0aXRlbSgpIHsKICAgIGlmIChnZXREYXRhKCJsYXN0V2FzVGFnIikgJiYgIWdldERhdGEoInNsdXJwQWxsTGluZUVuZGluZ3MiKSkgewogICAgICBsaW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgIH0KICAgIHRhZygiPC9saT4iKTsKICAgIHNldERhdGEoInNsdXJwQWxsTGluZUVuZGluZ3MiKTsKICB9CiAgX19uYW1lKG9uZXhpdGxpc3RpdGVtLCAib25leGl0bGlzdGl0ZW0iKTsKICBmdW5jdGlvbiBvbmVudGVyYmxvY2txdW90ZSgpIHsKICAgIHRpZ2h0U3RhY2sucHVzaChmYWxzZSk7CiAgICBsaW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgIHRhZygiPGJsb2NrcXVvdGU+Iik7CiAgfQogIF9fbmFtZShvbmVudGVyYmxvY2txdW90ZSwgIm9uZW50ZXJibG9ja3F1b3RlIik7CiAgZnVuY3Rpb24gb25leGl0YmxvY2txdW90ZSgpIHsKICAgIHRpZ2h0U3RhY2sucG9wKCk7CiAgICBsaW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgIHRhZygiPC9ibG9ja3F1b3RlPiIpOwogICAgc2V0RGF0YSgic2x1cnBBbGxMaW5lRW5kaW5ncyIpOwogIH0KICBfX25hbWUob25leGl0YmxvY2txdW90ZSwgIm9uZXhpdGJsb2NrcXVvdGUiKTsKICBmdW5jdGlvbiBvbmVudGVycGFyYWdyYXBoKCkgewogICAgaWYgKCF0aWdodFN0YWNrW3RpZ2h0U3RhY2subGVuZ3RoIC0gMV0pIHsKICAgICAgbGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICAgIHRhZygiPHA+Iik7CiAgICB9CiAgICBzZXREYXRhKCJzbHVycEFsbExpbmVFbmRpbmdzIik7CiAgfQogIF9fbmFtZShvbmVudGVycGFyYWdyYXBoLCAib25lbnRlcnBhcmFncmFwaCIpOwogIGZ1bmN0aW9uIG9uZXhpdHBhcmFncmFwaCgpIHsKICAgIGlmICh0aWdodFN0YWNrW3RpZ2h0U3RhY2subGVuZ3RoIC0gMV0pIHsKICAgICAgc2V0RGF0YSgic2x1cnBBbGxMaW5lRW5kaW5ncyIsIHRydWUpOwogICAgfSBlbHNlIHsKICAgICAgdGFnKCI8L3A+Iik7CiAgICB9CiAgfQogIF9fbmFtZShvbmV4aXRwYXJhZ3JhcGgsICJvbmV4aXRwYXJhZ3JhcGgiKTsKICBmdW5jdGlvbiBvbmVudGVyY29kZWZlbmNlZCgpIHsKICAgIGxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgdGFnKCI8cHJlPjxjb2RlIik7CiAgICBzZXREYXRhKCJmZW5jZXNDb3VudCIsIDApOwogIH0KICBfX25hbWUob25lbnRlcmNvZGVmZW5jZWQsICJvbmVudGVyY29kZWZlbmNlZCIpOwogIGZ1bmN0aW9uIG9uZXhpdGNvZGVmZW5jZWRmZW5jZWluZm8oKSB7CiAgICBjb25zdCB2YWx1ZTIgPSByZXN1bWUoKTsKICAgIHRhZygnIGNsYXNzPSJsYW5ndWFnZS0nICsgdmFsdWUyICsgJyInKTsKICB9CiAgX19uYW1lKG9uZXhpdGNvZGVmZW5jZWRmZW5jZWluZm8sICJvbmV4aXRjb2RlZmVuY2VkZmVuY2VpbmZvIik7CiAgZnVuY3Rpb24gb25leGl0Y29kZWZlbmNlZGZlbmNlKCkgewogICAgY29uc3QgY291bnQyID0gZ2V0RGF0YSgiZmVuY2VzQ291bnQiKSB8fCAwOwogICAgaWYgKCFjb3VudDIpIHsKICAgICAgdGFnKCI+Iik7CiAgICAgIHNldERhdGEoInNsdXJwT25lTGluZUVuZGluZyIsIHRydWUpOwogICAgfQogICAgc2V0RGF0YSgiZmVuY2VzQ291bnQiLCBjb3VudDIgKyAxKTsKICB9CiAgX19uYW1lKG9uZXhpdGNvZGVmZW5jZWRmZW5jZSwgIm9uZXhpdGNvZGVmZW5jZWRmZW5jZSIpOwogIGZ1bmN0aW9uIG9uZW50ZXJjb2RlaW5kZW50ZWQoKSB7CiAgICBsaW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgIHRhZygiPHByZT48Y29kZT4iKTsKICB9CiAgX19uYW1lKG9uZW50ZXJjb2RlaW5kZW50ZWQsICJvbmVudGVyY29kZWluZGVudGVkIik7CiAgZnVuY3Rpb24gb25leGl0Zmxvd2NvZGUoKSB7CiAgICBjb25zdCBjb3VudDIgPSBnZXREYXRhKCJmZW5jZXNDb3VudCIpOwogICAgaWYgKGNvdW50MiAhPT0gdm9pZCAwICYmIGNvdW50MiA8IDIgJiYgZGF0YS50aWdodFN0YWNrLmxlbmd0aCA+IDAgJiYgIWdldERhdGEoImxhc3RXYXNUYWciKSkgewogICAgICBsaW5lRW5kaW5nMigpOwogICAgfQogICAgaWYgKGdldERhdGEoImZsb3dDb2RlU2VlbkRhdGEiKSkgewogICAgICBsaW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgIH0KICAgIHRhZygiPC9jb2RlPjwvcHJlPiIpOwogICAgaWYgKGNvdW50MiAhPT0gdm9pZCAwICYmIGNvdW50MiA8IDIpIGxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgc2V0RGF0YSgiZmxvd0NvZGVTZWVuRGF0YSIpOwogICAgc2V0RGF0YSgiZmVuY2VzQ291bnQiKTsKICAgIHNldERhdGEoInNsdXJwT25lTGluZUVuZGluZyIpOwogIH0KICBfX25hbWUob25leGl0Zmxvd2NvZGUsICJvbmV4aXRmbG93Y29kZSIpOwogIGZ1bmN0aW9uIG9uZW50ZXJpbWFnZSgpIHsKICAgIG1lZGlhU3RhY2sucHVzaCh7CiAgICAgIGltYWdlOiB0cnVlCiAgICB9KTsKICAgIHRhZ3MgPSB2b2lkIDA7CiAgfQogIF9fbmFtZShvbmVudGVyaW1hZ2UsICJvbmVudGVyaW1hZ2UiKTsKICBmdW5jdGlvbiBvbmVudGVybGluaygpIHsKICAgIG1lZGlhU3RhY2sucHVzaCh7fSk7CiAgfQogIF9fbmFtZShvbmVudGVybGluaywgIm9uZW50ZXJsaW5rIik7CiAgZnVuY3Rpb24gb25leGl0bGFiZWx0ZXh0KHRva2VuKSB7CiAgICBtZWRpYVN0YWNrW21lZGlhU3RhY2subGVuZ3RoIC0gMV0ubGFiZWxJZCA9IHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pOwogIH0KICBfX25hbWUob25leGl0bGFiZWx0ZXh0LCAib25leGl0bGFiZWx0ZXh0Iik7CiAgZnVuY3Rpb24gb25leGl0bGFiZWwoKSB7CiAgICBtZWRpYVN0YWNrW21lZGlhU3RhY2subGVuZ3RoIC0gMV0ubGFiZWwgPSByZXN1bWUoKTsKICB9CiAgX19uYW1lKG9uZXhpdGxhYmVsLCAib25leGl0bGFiZWwiKTsKICBmdW5jdGlvbiBvbmV4aXRyZWZlcmVuY2VzdHJpbmcodG9rZW4pIHsKICAgIG1lZGlhU3RhY2tbbWVkaWFTdGFjay5sZW5ndGggLSAxXS5yZWZlcmVuY2VJZCA9IHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pOwogIH0KICBfX25hbWUob25leGl0cmVmZXJlbmNlc3RyaW5nLCAib25leGl0cmVmZXJlbmNlc3RyaW5nIik7CiAgZnVuY3Rpb24gb25lbnRlcnJlc291cmNlKCkgewogICAgYnVmZmVyMigpOwogICAgbWVkaWFTdGFja1ttZWRpYVN0YWNrLmxlbmd0aCAtIDFdLmRlc3RpbmF0aW9uID0gIiI7CiAgfQogIF9fbmFtZShvbmVudGVycmVzb3VyY2UsICJvbmVudGVycmVzb3VyY2UiKTsKICBmdW5jdGlvbiBvbmVudGVycmVzb3VyY2VkZXN0aW5hdGlvbnN0cmluZygpIHsKICAgIGJ1ZmZlcjIoKTsKICAgIHNldERhdGEoImlnbm9yZUVuY29kZSIsIHRydWUpOwogIH0KICBfX25hbWUob25lbnRlcnJlc291cmNlZGVzdGluYXRpb25zdHJpbmcsICJvbmVudGVycmVzb3VyY2VkZXN0aW5hdGlvbnN0cmluZyIpOwogIGZ1bmN0aW9uIG9uZXhpdHJlc291cmNlZGVzdGluYXRpb25zdHJpbmcoKSB7CiAgICBtZWRpYVN0YWNrW21lZGlhU3RhY2subGVuZ3RoIC0gMV0uZGVzdGluYXRpb24gPSByZXN1bWUoKTsKICAgIHNldERhdGEoImlnbm9yZUVuY29kZSIpOwogIH0KICBfX25hbWUob25leGl0cmVzb3VyY2VkZXN0aW5hdGlvbnN0cmluZywgIm9uZXhpdHJlc291cmNlZGVzdGluYXRpb25zdHJpbmciKTsKICBmdW5jdGlvbiBvbmV4aXRyZXNvdXJjZXRpdGxlc3RyaW5nKCkgewogICAgbWVkaWFTdGFja1ttZWRpYVN0YWNrLmxlbmd0aCAtIDFdLnRpdGxlID0gcmVzdW1lKCk7CiAgfQogIF9fbmFtZShvbmV4aXRyZXNvdXJjZXRpdGxlc3RyaW5nLCAib25leGl0cmVzb3VyY2V0aXRsZXN0cmluZyIpOwogIGZ1bmN0aW9uIG9uZXhpdG1lZGlhKCkgewogICAgbGV0IGluZGV4MiA9IG1lZGlhU3RhY2subGVuZ3RoIC0gMTsKICAgIGNvbnN0IG1lZGlhID0gbWVkaWFTdGFja1tpbmRleDJdOwogICAgY29uc3QgaWQgPSBtZWRpYS5yZWZlcmVuY2VJZCB8fCBtZWRpYS5sYWJlbElkOwogICAgY29uc3QgY29udGV4dDMgPSBtZWRpYS5kZXN0aW5hdGlvbiA9PT0gdm9pZCAwID8gZGVmaW5pdGlvbnNbbm9ybWFsaXplSWRlbnRpZmllcihpZCldIDogbWVkaWE7CiAgICB0YWdzID0gdHJ1ZTsKICAgIHdoaWxlIChpbmRleDItLSkgewogICAgICBpZiAobWVkaWFTdGFja1tpbmRleDJdLmltYWdlKSB7CiAgICAgICAgdGFncyA9IHZvaWQgMDsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaWYgKG1lZGlhLmltYWdlKSB7CiAgICAgIHRhZygnPGltZyBzcmM9IicgKyBzYW5pdGl6ZVVyaShjb250ZXh0My5kZXN0aW5hdGlvbiwgc2V0dGluZ3MuYWxsb3dEYW5nZXJvdXNQcm90b2NvbCA/IHZvaWQgMCA6IHByb3RvY29sU291cmNlKSArICciIGFsdD0iJyk7CiAgICAgIHJhdzIobWVkaWEubGFiZWwpOwogICAgICB0YWcoJyInKTsKICAgIH0gZWxzZSB7CiAgICAgIHRhZygnPGEgaHJlZj0iJyArIHNhbml0aXplVXJpKGNvbnRleHQzLmRlc3RpbmF0aW9uLCBzZXR0aW5ncy5hbGxvd0Rhbmdlcm91c1Byb3RvY29sID8gdm9pZCAwIDogcHJvdG9jb2xIcmVmKSArICciJyk7CiAgICB9CiAgICB0YWcoY29udGV4dDMudGl0bGUgPyAnIHRpdGxlPSInICsgY29udGV4dDMudGl0bGUgKyAnIicgOiAiIik7CiAgICBpZiAobWVkaWEuaW1hZ2UpIHsKICAgICAgdGFnKCIgLz4iKTsKICAgIH0gZWxzZSB7CiAgICAgIHRhZygiPiIpOwogICAgICByYXcyKG1lZGlhLmxhYmVsKTsKICAgICAgdGFnKCI8L2E+Iik7CiAgICB9CiAgICBtZWRpYVN0YWNrLnBvcCgpOwogIH0KICBfX25hbWUob25leGl0bWVkaWEsICJvbmV4aXRtZWRpYSIpOwogIGZ1bmN0aW9uIG9uZW50ZXJkZWZpbml0aW9uKCkgewogICAgYnVmZmVyMigpOwogICAgbWVkaWFTdGFjay5wdXNoKHt9KTsKICB9CiAgX19uYW1lKG9uZW50ZXJkZWZpbml0aW9uLCAib25lbnRlcmRlZmluaXRpb24iKTsKICBmdW5jdGlvbiBvbmV4aXRkZWZpbml0aW9ubGFiZWxzdHJpbmcodG9rZW4pIHsKICAgIHJlc3VtZSgpOwogICAgbWVkaWFTdGFja1ttZWRpYVN0YWNrLmxlbmd0aCAtIDFdLmxhYmVsSWQgPSB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKTsKICB9CiAgX19uYW1lKG9uZXhpdGRlZmluaXRpb25sYWJlbHN0cmluZywgIm9uZXhpdGRlZmluaXRpb25sYWJlbHN0cmluZyIpOwogIGZ1bmN0aW9uIG9uZW50ZXJkZWZpbml0aW9uZGVzdGluYXRpb25zdHJpbmcoKSB7CiAgICBidWZmZXIyKCk7CiAgICBzZXREYXRhKCJpZ25vcmVFbmNvZGUiLCB0cnVlKTsKICB9CiAgX19uYW1lKG9uZW50ZXJkZWZpbml0aW9uZGVzdGluYXRpb25zdHJpbmcsICJvbmVudGVyZGVmaW5pdGlvbmRlc3RpbmF0aW9uc3RyaW5nIik7CiAgZnVuY3Rpb24gb25leGl0ZGVmaW5pdGlvbmRlc3RpbmF0aW9uc3RyaW5nKCkgewogICAgbWVkaWFTdGFja1ttZWRpYVN0YWNrLmxlbmd0aCAtIDFdLmRlc3RpbmF0aW9uID0gcmVzdW1lKCk7CiAgICBzZXREYXRhKCJpZ25vcmVFbmNvZGUiKTsKICB9CiAgX19uYW1lKG9uZXhpdGRlZmluaXRpb25kZXN0aW5hdGlvbnN0cmluZywgIm9uZXhpdGRlZmluaXRpb25kZXN0aW5hdGlvbnN0cmluZyIpOwogIGZ1bmN0aW9uIG9uZXhpdGRlZmluaXRpb250aXRsZXN0cmluZygpIHsKICAgIG1lZGlhU3RhY2tbbWVkaWFTdGFjay5sZW5ndGggLSAxXS50aXRsZSA9IHJlc3VtZSgpOwogIH0KICBfX25hbWUob25leGl0ZGVmaW5pdGlvbnRpdGxlc3RyaW5nLCAib25leGl0ZGVmaW5pdGlvbnRpdGxlc3RyaW5nIik7CiAgZnVuY3Rpb24gb25leGl0ZGVmaW5pdGlvbigpIHsKICAgIGNvbnN0IG1lZGlhID0gbWVkaWFTdGFja1ttZWRpYVN0YWNrLmxlbmd0aCAtIDFdOwogICAgY29uc3QgaWQgPSBub3JtYWxpemVJZGVudGlmaWVyKG1lZGlhLmxhYmVsSWQpOwogICAgcmVzdW1lKCk7CiAgICBpZiAoIWhhc093blByb3BlcnR5Mi5jYWxsKGRlZmluaXRpb25zLCBpZCkpIHsKICAgICAgZGVmaW5pdGlvbnNbaWRdID0gbWVkaWFTdGFja1ttZWRpYVN0YWNrLmxlbmd0aCAtIDFdOwogICAgfQogICAgbWVkaWFTdGFjay5wb3AoKTsKICB9CiAgX19uYW1lKG9uZXhpdGRlZmluaXRpb24sICJvbmV4aXRkZWZpbml0aW9uIik7CiAgZnVuY3Rpb24gb25lbnRlcmNvbnRlbnQoKSB7CiAgICBzZXREYXRhKCJzbHVycEFsbExpbmVFbmRpbmdzIiwgdHJ1ZSk7CiAgfQogIF9fbmFtZShvbmVudGVyY29udGVudCwgIm9uZW50ZXJjb250ZW50Iik7CiAgZnVuY3Rpb24gb25leGl0YXR4aGVhZGluZ3NlcXVlbmNlKHRva2VuKSB7CiAgICBpZiAoZ2V0RGF0YSgiaGVhZGluZ1JhbmsiKSkgcmV0dXJuOwogICAgc2V0RGF0YSgiaGVhZGluZ1JhbmsiLCB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKS5sZW5ndGgpOwogICAgbGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICB0YWcoIjxoIiArIGdldERhdGEoImhlYWRpbmdSYW5rIikgKyAiPiIpOwogIH0KICBfX25hbWUob25leGl0YXR4aGVhZGluZ3NlcXVlbmNlLCAib25leGl0YXR4aGVhZGluZ3NlcXVlbmNlIik7CiAgZnVuY3Rpb24gb25lbnRlcnNldGV4dGhlYWRpbmcoKSB7CiAgICBidWZmZXIyKCk7CiAgICBzZXREYXRhKCJzbHVycEFsbExpbmVFbmRpbmdzIik7CiAgfQogIF9fbmFtZShvbmVudGVyc2V0ZXh0aGVhZGluZywgIm9uZW50ZXJzZXRleHRoZWFkaW5nIik7CiAgZnVuY3Rpb24gb25leGl0c2V0ZXh0aGVhZGluZ3RleHQoKSB7CiAgICBzZXREYXRhKCJzbHVycEFsbExpbmVFbmRpbmdzIiwgdHJ1ZSk7CiAgfQogIF9fbmFtZShvbmV4aXRzZXRleHRoZWFkaW5ndGV4dCwgIm9uZXhpdHNldGV4dGhlYWRpbmd0ZXh0Iik7CiAgZnVuY3Rpb24gb25leGl0YXR4aGVhZGluZygpIHsKICAgIHRhZygiPC9oIiArIGdldERhdGEoImhlYWRpbmdSYW5rIikgKyAiPiIpOwogICAgc2V0RGF0YSgiaGVhZGluZ1JhbmsiKTsKICB9CiAgX19uYW1lKG9uZXhpdGF0eGhlYWRpbmcsICJvbmV4aXRhdHhoZWFkaW5nIik7CiAgZnVuY3Rpb24gb25leGl0c2V0ZXh0aGVhZGluZ2xpbmVzZXF1ZW5jZSh0b2tlbikgewogICAgc2V0RGF0YSgiaGVhZGluZ1JhbmsiLCB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKS5jaGFyQ29kZUF0KDApID09PSA2MSA/IDEgOiAyKTsKICB9CiAgX19uYW1lKG9uZXhpdHNldGV4dGhlYWRpbmdsaW5lc2VxdWVuY2UsICJvbmV4aXRzZXRleHRoZWFkaW5nbGluZXNlcXVlbmNlIik7CiAgZnVuY3Rpb24gb25leGl0c2V0ZXh0aGVhZGluZygpIHsKICAgIGNvbnN0IHZhbHVlMiA9IHJlc3VtZSgpOwogICAgbGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICB0YWcoIjxoIiArIGdldERhdGEoImhlYWRpbmdSYW5rIikgKyAiPiIpOwogICAgcmF3Mih2YWx1ZTIpOwogICAgdGFnKCI8L2giICsgZ2V0RGF0YSgiaGVhZGluZ1JhbmsiKSArICI+Iik7CiAgICBzZXREYXRhKCJzbHVycEFsbExpbmVFbmRpbmdzIik7CiAgICBzZXREYXRhKCJoZWFkaW5nUmFuayIpOwogIH0KICBfX25hbWUob25leGl0c2V0ZXh0aGVhZGluZywgIm9uZXhpdHNldGV4dGhlYWRpbmciKTsKICBmdW5jdGlvbiBvbmV4aXRkYXRhKHRva2VuKSB7CiAgICByYXcyKGVuY29kZTIodGhpcy5zbGljZVNlcmlhbGl6ZSh0b2tlbikpKTsKICB9CiAgX19uYW1lKG9uZXhpdGRhdGEsICJvbmV4aXRkYXRhIik7CiAgZnVuY3Rpb24gb25leGl0bGluZWVuZGluZyh0b2tlbikgewogICAgaWYgKGdldERhdGEoInNsdXJwQWxsTGluZUVuZGluZ3MiKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoZ2V0RGF0YSgic2x1cnBPbmVMaW5lRW5kaW5nIikpIHsKICAgICAgc2V0RGF0YSgic2x1cnBPbmVMaW5lRW5kaW5nIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChnZXREYXRhKCJpbkNvZGVUZXh0IikpIHsKICAgICAgcmF3MigiICIpOwogICAgICByZXR1cm47CiAgICB9CiAgICByYXcyKGVuY29kZTIodGhpcy5zbGljZVNlcmlhbGl6ZSh0b2tlbikpKTsKICB9CiAgX19uYW1lKG9uZXhpdGxpbmVlbmRpbmcsICJvbmV4aXRsaW5lZW5kaW5nIik7CiAgZnVuY3Rpb24gb25leGl0Y29kZWZsb3d2YWx1ZSh0b2tlbikgewogICAgcmF3MihlbmNvZGUyKHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pKSk7CiAgICBzZXREYXRhKCJmbG93Q29kZVNlZW5EYXRhIiwgdHJ1ZSk7CiAgfQogIF9fbmFtZShvbmV4aXRjb2RlZmxvd3ZhbHVlLCAib25leGl0Y29kZWZsb3d2YWx1ZSIpOwogIGZ1bmN0aW9uIG9uZXhpdGhhcmRicmVhaygpIHsKICAgIHRhZygiPGJyIC8+Iik7CiAgfQogIF9fbmFtZShvbmV4aXRoYXJkYnJlYWssICJvbmV4aXRoYXJkYnJlYWsiKTsKICBmdW5jdGlvbiBvbmVudGVyaHRtbGZsb3coKSB7CiAgICBsaW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgIG9uZW50ZXJodG1sKCk7CiAgfQogIF9fbmFtZShvbmVudGVyaHRtbGZsb3csICJvbmVudGVyaHRtbGZsb3ciKTsKICBmdW5jdGlvbiBvbmV4aXRodG1sKCkgewogICAgc2V0RGF0YSgiaWdub3JlRW5jb2RlIik7CiAgfQogIF9fbmFtZShvbmV4aXRodG1sLCAib25leGl0aHRtbCIpOwogIGZ1bmN0aW9uIG9uZW50ZXJodG1sKCkgewogICAgaWYgKHNldHRpbmdzLmFsbG93RGFuZ2Vyb3VzSHRtbCkgewogICAgICBzZXREYXRhKCJpZ25vcmVFbmNvZGUiLCB0cnVlKTsKICAgIH0KICB9CiAgX19uYW1lKG9uZW50ZXJodG1sLCAib25lbnRlcmh0bWwiKTsKICBmdW5jdGlvbiBvbmVudGVyZW1waGFzaXMoKSB7CiAgICB0YWcoIjxlbT4iKTsKICB9CiAgX19uYW1lKG9uZW50ZXJlbXBoYXNpcywgIm9uZW50ZXJlbXBoYXNpcyIpOwogIGZ1bmN0aW9uIG9uZW50ZXJzdHJvbmcoKSB7CiAgICB0YWcoIjxzdHJvbmc+Iik7CiAgfQogIF9fbmFtZShvbmVudGVyc3Ryb25nLCAib25lbnRlcnN0cm9uZyIpOwogIGZ1bmN0aW9uIG9uZW50ZXJjb2RldGV4dCgpIHsKICAgIHNldERhdGEoImluQ29kZVRleHQiLCB0cnVlKTsKICAgIHRhZygiPGNvZGU+Iik7CiAgfQogIF9fbmFtZShvbmVudGVyY29kZXRleHQsICJvbmVudGVyY29kZXRleHQiKTsKICBmdW5jdGlvbiBvbmV4aXRjb2RldGV4dCgpIHsKICAgIHNldERhdGEoImluQ29kZVRleHQiKTsKICAgIHRhZygiPC9jb2RlPiIpOwogIH0KICBfX25hbWUob25leGl0Y29kZXRleHQsICJvbmV4aXRjb2RldGV4dCIpOwogIGZ1bmN0aW9uIG9uZXhpdGVtcGhhc2lzKCkgewogICAgdGFnKCI8L2VtPiIpOwogIH0KICBfX25hbWUob25leGl0ZW1waGFzaXMsICJvbmV4aXRlbXBoYXNpcyIpOwogIGZ1bmN0aW9uIG9uZXhpdHN0cm9uZygpIHsKICAgIHRhZygiPC9zdHJvbmc+Iik7CiAgfQogIF9fbmFtZShvbmV4aXRzdHJvbmcsICJvbmV4aXRzdHJvbmciKTsKICBmdW5jdGlvbiBvbmV4aXR0aGVtYXRpY2JyZWFrKCkgewogICAgbGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICB0YWcoIjxociAvPiIpOwogIH0KICBfX25hbWUob25leGl0dGhlbWF0aWNicmVhaywgIm9uZXhpdHRoZW1hdGljYnJlYWsiKTsKICBmdW5jdGlvbiBvbmV4aXRjaGFyYWN0ZXJyZWZlcmVuY2VtYXJrZXIodG9rZW4pIHsKICAgIHNldERhdGEoImNoYXJhY3RlclJlZmVyZW5jZVR5cGUiLCB0b2tlbi50eXBlKTsKICB9CiAgX19uYW1lKG9uZXhpdGNoYXJhY3RlcnJlZmVyZW5jZW1hcmtlciwgIm9uZXhpdGNoYXJhY3RlcnJlZmVyZW5jZW1hcmtlciIpOwogIGZ1bmN0aW9uIG9uZXhpdGNoYXJhY3RlcnJlZmVyZW5jZXZhbHVlKHRva2VuKSB7CiAgICBjb25zdCB2YWx1ZTIgPSB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKTsKICAgIGNvbnN0IGRlY29kZWQgPSBnZXREYXRhKCJjaGFyYWN0ZXJSZWZlcmVuY2VUeXBlIikgPyBkZWNvZGVOdW1lcmljQ2hhcmFjdGVyUmVmZXJlbmNlKHZhbHVlMiwgZ2V0RGF0YSgiY2hhcmFjdGVyUmVmZXJlbmNlVHlwZSIpID09PSAiY2hhcmFjdGVyUmVmZXJlbmNlTWFya2VyTnVtZXJpYyIgPyAxMCA6IDE2KSA6IGRlY29kZU5hbWVkQ2hhcmFjdGVyUmVmZXJlbmNlKHZhbHVlMik7CiAgICByYXcyKGVuY29kZTIoCiAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqLwogICAgICBkZWNvZGVkCiAgICApKTsKICAgIHNldERhdGEoImNoYXJhY3RlclJlZmVyZW5jZVR5cGUiKTsKICB9CiAgX19uYW1lKG9uZXhpdGNoYXJhY3RlcnJlZmVyZW5jZXZhbHVlLCAib25leGl0Y2hhcmFjdGVycmVmZXJlbmNldmFsdWUiKTsKICBmdW5jdGlvbiBvbmV4aXRhdXRvbGlua3Byb3RvY29sKHRva2VuKSB7CiAgICBjb25zdCB1cmkgPSB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKTsKICAgIHRhZygnPGEgaHJlZj0iJyArIHNhbml0aXplVXJpKHVyaSwgc2V0dGluZ3MuYWxsb3dEYW5nZXJvdXNQcm90b2NvbCA/IHZvaWQgMCA6IHByb3RvY29sSHJlZikgKyAnIj4nKTsKICAgIHJhdzIoZW5jb2RlMih1cmkpKTsKICAgIHRhZygiPC9hPiIpOwogIH0KICBfX25hbWUob25leGl0YXV0b2xpbmtwcm90b2NvbCwgIm9uZXhpdGF1dG9saW5rcHJvdG9jb2wiKTsKICBmdW5jdGlvbiBvbmV4aXRhdXRvbGlua2VtYWlsKHRva2VuKSB7CiAgICBjb25zdCB1cmkgPSB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKTsKICAgIHRhZygnPGEgaHJlZj0iJyArIHNhbml0aXplVXJpKCJtYWlsdG86IiArIHVyaSkgKyAnIj4nKTsKICAgIHJhdzIoZW5jb2RlMih1cmkpKTsKICAgIHRhZygiPC9hPiIpOwogIH0KICBfX25hbWUob25leGl0YXV0b2xpbmtlbWFpbCwgIm9uZXhpdGF1dG9saW5rZW1haWwiKTsKfQpfX25hbWUoY29tcGlsZSwgImNvbXBpbGUiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmtANC4wLjIvbm9kZV9tb2R1bGVzL21pY3JvbWFyay9saWIvaW5pdGlhbGl6ZS9jb250ZW50LmpzCnZhciBjb250ZW50MiA9IHsKICB0b2tlbml6ZTogaW5pdGlhbGl6ZUNvbnRlbnQKfTsKZnVuY3Rpb24gaW5pdGlhbGl6ZUNvbnRlbnQoZWZmZWN0cykgewogIGNvbnN0IGNvbnRlbnRTdGFydCA9IGVmZmVjdHMuYXR0ZW1wdCh0aGlzLnBhcnNlci5jb25zdHJ1Y3RzLmNvbnRlbnRJbml0aWFsLCBhZnRlckNvbnRlbnRTdGFydENvbnN0cnVjdCwgcGFyYWdyYXBoSW5pdGlhbCk7CiAgbGV0IHByZXZpb3VzMzsKICByZXR1cm4gY29udGVudFN0YXJ0OwogIGZ1bmN0aW9uIGFmdGVyQ29udGVudFN0YXJ0Q29uc3RydWN0KGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgZWZmZWN0cy5lbnRlcigibGluZUVuZGluZyIpOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIGVmZmVjdHMuZXhpdCgibGluZUVuZGluZyIpOwogICAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBjb250ZW50U3RhcnQsICJsaW5lUHJlZml4Iik7CiAgfQogIF9fbmFtZShhZnRlckNvbnRlbnRTdGFydENvbnN0cnVjdCwgImFmdGVyQ29udGVudFN0YXJ0Q29uc3RydWN0Iik7CiAgZnVuY3Rpb24gcGFyYWdyYXBoSW5pdGlhbChjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigicGFyYWdyYXBoIik7CiAgICByZXR1cm4gbGluZVN0YXJ0KGNvZGU0KTsKICB9CiAgX19uYW1lKHBhcmFncmFwaEluaXRpYWwsICJwYXJhZ3JhcGhJbml0aWFsIik7CiAgZnVuY3Rpb24gbGluZVN0YXJ0KGNvZGU0KSB7CiAgICBjb25zdCB0b2tlbiA9IGVmZmVjdHMuZW50ZXIoImNodW5rVGV4dCIsIHsKICAgICAgY29udGVudFR5cGU6ICJ0ZXh0IiwKICAgICAgcHJldmlvdXM6IHByZXZpb3VzMwogICAgfSk7CiAgICBpZiAocHJldmlvdXMzKSB7CiAgICAgIHByZXZpb3VzMy5uZXh0ID0gdG9rZW47CiAgICB9CiAgICBwcmV2aW91czMgPSB0b2tlbjsKICAgIHJldHVybiBkYXRhKGNvZGU0KTsKICB9CiAgX19uYW1lKGxpbmVTdGFydCwgImxpbmVTdGFydCIpOwogIGZ1bmN0aW9uIGRhdGEoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCkgewogICAgICBlZmZlY3RzLmV4aXQoImNodW5rVGV4dCIpOwogICAgICBlZmZlY3RzLmV4aXQoInBhcmFncmFwaCIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoImNodW5rVGV4dCIpOwogICAgICByZXR1cm4gbGluZVN0YXJ0OwogICAgfQogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBkYXRhOwogIH0KICBfX25hbWUoZGF0YSwgImRhdGEiKTsKfQpfX25hbWUoaW5pdGlhbGl6ZUNvbnRlbnQsICJpbml0aWFsaXplQ29udGVudCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFya0A0LjAuMi9ub2RlX21vZHVsZXMvbWljcm9tYXJrL2xpYi9pbml0aWFsaXplL2RvY3VtZW50LmpzCnZhciBkb2N1bWVudDIgPSB7CiAgdG9rZW5pemU6IGluaXRpYWxpemVEb2N1bWVudAp9Owp2YXIgY29udGFpbmVyQ29uc3RydWN0ID0gewogIHRva2VuaXplOiB0b2tlbml6ZUNvbnRhaW5lcgp9OwpmdW5jdGlvbiBpbml0aWFsaXplRG9jdW1lbnQoZWZmZWN0cykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICBjb25zdCBzdGFjayA9IFtdOwogIGxldCBjb250aW51ZWQgPSAwOwogIGxldCBjaGlsZEZsb3c7CiAgbGV0IGNoaWxkVG9rZW47CiAgbGV0IGxpbmVTdGFydE9mZnNldDsKICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIGlmIChjb250aW51ZWQgPCBzdGFjay5sZW5ndGgpIHsKICAgICAgY29uc3QgaXRlbSA9IHN0YWNrW2NvbnRpbnVlZF07CiAgICAgIHNlbGYyLmNvbnRhaW5lclN0YXRlID0gaXRlbVsxXTsKICAgICAgcmV0dXJuIGVmZmVjdHMuYXR0ZW1wdChpdGVtWzBdLmNvbnRpbnVhdGlvbiwgZG9jdW1lbnRDb250aW51ZSwgY2hlY2tOZXdDb250YWluZXJzKShjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gY2hlY2tOZXdDb250YWluZXJzKGNvZGU0KTsKICB9CiAgX19uYW1lKHN0YXJ0LCAic3RhcnQiKTsKICBmdW5jdGlvbiBkb2N1bWVudENvbnRpbnVlKGNvZGU0KSB7CiAgICBjb250aW51ZWQrKzsKICAgIGlmIChzZWxmMi5jb250YWluZXJTdGF0ZS5fY2xvc2VGbG93KSB7CiAgICAgIHNlbGYyLmNvbnRhaW5lclN0YXRlLl9jbG9zZUZsb3cgPSB2b2lkIDA7CiAgICAgIGlmIChjaGlsZEZsb3cpIHsKICAgICAgICBjbG9zZUZsb3coKTsKICAgICAgfQogICAgICBjb25zdCBpbmRleEJlZm9yZUV4aXRzID0gc2VsZjIuZXZlbnRzLmxlbmd0aDsKICAgICAgbGV0IGluZGV4QmVmb3JlRmxvdyA9IGluZGV4QmVmb3JlRXhpdHM7CiAgICAgIGxldCBwb2ludDQ7CiAgICAgIHdoaWxlIChpbmRleEJlZm9yZUZsb3ctLSkgewogICAgICAgIGlmIChzZWxmMi5ldmVudHNbaW5kZXhCZWZvcmVGbG93XVswXSA9PT0gImV4aXQiICYmIHNlbGYyLmV2ZW50c1tpbmRleEJlZm9yZUZsb3ddWzFdLnR5cGUgPT09ICJjaHVua0Zsb3ciKSB7CiAgICAgICAgICBwb2ludDQgPSBzZWxmMi5ldmVudHNbaW5kZXhCZWZvcmVGbG93XVsxXS5lbmQ7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgZXhpdENvbnRhaW5lcnMoY29udGludWVkKTsKICAgICAgbGV0IGluZGV4MiA9IGluZGV4QmVmb3JlRXhpdHM7CiAgICAgIHdoaWxlIChpbmRleDIgPCBzZWxmMi5ldmVudHMubGVuZ3RoKSB7CiAgICAgICAgc2VsZjIuZXZlbnRzW2luZGV4Ml1bMV0uZW5kID0gewogICAgICAgICAgLi4ucG9pbnQ0CiAgICAgICAgfTsKICAgICAgICBpbmRleDIrKzsKICAgICAgfQogICAgICBzcGxpY2Uoc2VsZjIuZXZlbnRzLCBpbmRleEJlZm9yZUZsb3cgKyAxLCAwLCBzZWxmMi5ldmVudHMuc2xpY2UoaW5kZXhCZWZvcmVFeGl0cykpOwogICAgICBzZWxmMi5ldmVudHMubGVuZ3RoID0gaW5kZXgyOwogICAgICByZXR1cm4gY2hlY2tOZXdDb250YWluZXJzKGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBzdGFydChjb2RlNCk7CiAgfQogIF9fbmFtZShkb2N1bWVudENvbnRpbnVlLCAiZG9jdW1lbnRDb250aW51ZSIpOwogIGZ1bmN0aW9uIGNoZWNrTmV3Q29udGFpbmVycyhjb2RlNCkgewogICAgaWYgKGNvbnRpbnVlZCA9PT0gc3RhY2subGVuZ3RoKSB7CiAgICAgIGlmICghY2hpbGRGbG93KSB7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50Q29udGludWVkKGNvZGU0KTsKICAgICAgfQogICAgICBpZiAoY2hpbGRGbG93LmN1cnJlbnRDb25zdHJ1Y3QgJiYgY2hpbGRGbG93LmN1cnJlbnRDb25zdHJ1Y3QuY29uY3JldGUpIHsKICAgICAgICByZXR1cm4gZmxvd1N0YXJ0KGNvZGU0KTsKICAgICAgfQogICAgICBzZWxmMi5pbnRlcnJ1cHQgPSBCb29sZWFuKGNoaWxkRmxvdy5jdXJyZW50Q29uc3RydWN0ICYmICFjaGlsZEZsb3cuX2dmbVRhYmxlRHluYW1pY0ludGVycnVwdEhhY2spOwogICAgfQogICAgc2VsZjIuY29udGFpbmVyU3RhdGUgPSB7fTsKICAgIHJldHVybiBlZmZlY3RzLmNoZWNrKGNvbnRhaW5lckNvbnN0cnVjdCwgdGhlcmVJc0FOZXdDb250YWluZXIsIHRoZXJlSXNOb05ld0NvbnRhaW5lcikoY29kZTQpOwogIH0KICBfX25hbWUoY2hlY2tOZXdDb250YWluZXJzLCAiY2hlY2tOZXdDb250YWluZXJzIik7CiAgZnVuY3Rpb24gdGhlcmVJc0FOZXdDb250YWluZXIoY29kZTQpIHsKICAgIGlmIChjaGlsZEZsb3cpIGNsb3NlRmxvdygpOwogICAgZXhpdENvbnRhaW5lcnMoY29udGludWVkKTsKICAgIHJldHVybiBkb2N1bWVudENvbnRpbnVlZChjb2RlNCk7CiAgfQogIF9fbmFtZSh0aGVyZUlzQU5ld0NvbnRhaW5lciwgInRoZXJlSXNBTmV3Q29udGFpbmVyIik7CiAgZnVuY3Rpb24gdGhlcmVJc05vTmV3Q29udGFpbmVyKGNvZGU0KSB7CiAgICBzZWxmMi5wYXJzZXIubGF6eVtzZWxmMi5ub3coKS5saW5lXSA9IGNvbnRpbnVlZCAhPT0gc3RhY2subGVuZ3RoOwogICAgbGluZVN0YXJ0T2Zmc2V0ID0gc2VsZjIubm93KCkub2Zmc2V0OwogICAgcmV0dXJuIGZsb3dTdGFydChjb2RlNCk7CiAgfQogIF9fbmFtZSh0aGVyZUlzTm9OZXdDb250YWluZXIsICJ0aGVyZUlzTm9OZXdDb250YWluZXIiKTsKICBmdW5jdGlvbiBkb2N1bWVudENvbnRpbnVlZChjb2RlNCkgewogICAgc2VsZjIuY29udGFpbmVyU3RhdGUgPSB7fTsKICAgIHJldHVybiBlZmZlY3RzLmF0dGVtcHQoY29udGFpbmVyQ29uc3RydWN0LCBjb250YWluZXJDb250aW51ZSwgZmxvd1N0YXJ0KShjb2RlNCk7CiAgfQogIF9fbmFtZShkb2N1bWVudENvbnRpbnVlZCwgImRvY3VtZW50Q29udGludWVkIik7CiAgZnVuY3Rpb24gY29udGFpbmVyQ29udGludWUoY29kZTQpIHsKICAgIGNvbnRpbnVlZCsrOwogICAgc3RhY2sucHVzaChbc2VsZjIuY3VycmVudENvbnN0cnVjdCwgc2VsZjIuY29udGFpbmVyU3RhdGVdKTsKICAgIHJldHVybiBkb2N1bWVudENvbnRpbnVlZChjb2RlNCk7CiAgfQogIF9fbmFtZShjb250YWluZXJDb250aW51ZSwgImNvbnRhaW5lckNvbnRpbnVlIik7CiAgZnVuY3Rpb24gZmxvd1N0YXJ0KGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwpIHsKICAgICAgaWYgKGNoaWxkRmxvdykgY2xvc2VGbG93KCk7CiAgICAgIGV4aXRDb250YWluZXJzKDApOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm47CiAgICB9CiAgICBjaGlsZEZsb3cgPSBjaGlsZEZsb3cgfHwgc2VsZjIucGFyc2VyLmZsb3coc2VsZjIubm93KCkpOwogICAgZWZmZWN0cy5lbnRlcigiY2h1bmtGbG93IiwgewogICAgICBfdG9rZW5pemVyOiBjaGlsZEZsb3csCiAgICAgIGNvbnRlbnRUeXBlOiAiZmxvdyIsCiAgICAgIHByZXZpb3VzOiBjaGlsZFRva2VuCiAgICB9KTsKICAgIHJldHVybiBmbG93Q29udGludWUoY29kZTQpOwogIH0KICBfX25hbWUoZmxvd1N0YXJ0LCAiZmxvd1N0YXJ0Iik7CiAgZnVuY3Rpb24gZmxvd0NvbnRpbnVlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwpIHsKICAgICAgd3JpdGVUb0NoaWxkKGVmZmVjdHMuZXhpdCgiY2h1bmtGbG93IiksIHRydWUpOwogICAgICBleGl0Q29udGFpbmVycygwKTsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgd3JpdGVUb0NoaWxkKGVmZmVjdHMuZXhpdCgiY2h1bmtGbG93IikpOwogICAgICBjb250aW51ZWQgPSAwOwogICAgICBzZWxmMi5pbnRlcnJ1cHQgPSB2b2lkIDA7CiAgICAgIHJldHVybiBzdGFydDsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gZmxvd0NvbnRpbnVlOwogIH0KICBfX25hbWUoZmxvd0NvbnRpbnVlLCAiZmxvd0NvbnRpbnVlIik7CiAgZnVuY3Rpb24gd3JpdGVUb0NoaWxkKHRva2VuLCBlbmRPZkZpbGUpIHsKICAgIGNvbnN0IHN0cmVhbSA9IHNlbGYyLnNsaWNlU3RyZWFtKHRva2VuKTsKICAgIGlmIChlbmRPZkZpbGUpIHN0cmVhbS5wdXNoKG51bGwpOwogICAgdG9rZW4ucHJldmlvdXMgPSBjaGlsZFRva2VuOwogICAgaWYgKGNoaWxkVG9rZW4pIGNoaWxkVG9rZW4ubmV4dCA9IHRva2VuOwogICAgY2hpbGRUb2tlbiA9IHRva2VuOwogICAgY2hpbGRGbG93LmRlZmluZVNraXAodG9rZW4uc3RhcnQpOwogICAgY2hpbGRGbG93LndyaXRlKHN0cmVhbSk7CiAgICBpZiAoc2VsZjIucGFyc2VyLmxhenlbdG9rZW4uc3RhcnQubGluZV0pIHsKICAgICAgbGV0IGluZGV4MiA9IGNoaWxkRmxvdy5ldmVudHMubGVuZ3RoOwogICAgICB3aGlsZSAoaW5kZXgyLS0pIHsKICAgICAgICBpZiAoCiAgICAgICAgICAvLyBUaGUgdG9rZW4gc3RhcnRzIGJlZm9yZSB0aGUgbGluZSBlbmRpbmfigKYKICAgICAgICAgIGNoaWxkRmxvdy5ldmVudHNbaW5kZXgyXVsxXS5zdGFydC5vZmZzZXQgPCBsaW5lU3RhcnRPZmZzZXQgJiYgLy8g4oCmYW5kIGVpdGhlciBpcyBub3QgZW5kZWQgeWV04oCmCiAgICAgICAgICAoIWNoaWxkRmxvdy5ldmVudHNbaW5kZXgyXVsxXS5lbmQgfHwgLy8g4oCmb3IgZW5kcyBhZnRlciBpdC4KICAgICAgICAgIGNoaWxkRmxvdy5ldmVudHNbaW5kZXgyXVsxXS5lbmQub2Zmc2V0ID4gbGluZVN0YXJ0T2Zmc2V0KQogICAgICAgICkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdCBpbmRleEJlZm9yZUV4aXRzID0gc2VsZjIuZXZlbnRzLmxlbmd0aDsKICAgICAgbGV0IGluZGV4QmVmb3JlRmxvdyA9IGluZGV4QmVmb3JlRXhpdHM7CiAgICAgIGxldCBzZWVuOwogICAgICBsZXQgcG9pbnQ0OwogICAgICB3aGlsZSAoaW5kZXhCZWZvcmVGbG93LS0pIHsKICAgICAgICBpZiAoc2VsZjIuZXZlbnRzW2luZGV4QmVmb3JlRmxvd11bMF0gPT09ICJleGl0IiAmJiBzZWxmMi5ldmVudHNbaW5kZXhCZWZvcmVGbG93XVsxXS50eXBlID09PSAiY2h1bmtGbG93IikgewogICAgICAgICAgaWYgKHNlZW4pIHsKICAgICAgICAgICAgcG9pbnQ0ID0gc2VsZjIuZXZlbnRzW2luZGV4QmVmb3JlRmxvd11bMV0uZW5kOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIHNlZW4gPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICBleGl0Q29udGFpbmVycyhjb250aW51ZWQpOwogICAgICBpbmRleDIgPSBpbmRleEJlZm9yZUV4aXRzOwogICAgICB3aGlsZSAoaW5kZXgyIDwgc2VsZjIuZXZlbnRzLmxlbmd0aCkgewogICAgICAgIHNlbGYyLmV2ZW50c1tpbmRleDJdWzFdLmVuZCA9IHsKICAgICAgICAgIC4uLnBvaW50NAogICAgICAgIH07CiAgICAgICAgaW5kZXgyKys7CiAgICAgIH0KICAgICAgc3BsaWNlKHNlbGYyLmV2ZW50cywgaW5kZXhCZWZvcmVGbG93ICsgMSwgMCwgc2VsZjIuZXZlbnRzLnNsaWNlKGluZGV4QmVmb3JlRXhpdHMpKTsKICAgICAgc2VsZjIuZXZlbnRzLmxlbmd0aCA9IGluZGV4MjsKICAgIH0KICB9CiAgX19uYW1lKHdyaXRlVG9DaGlsZCwgIndyaXRlVG9DaGlsZCIpOwogIGZ1bmN0aW9uIGV4aXRDb250YWluZXJzKHNpemUpIHsKICAgIGxldCBpbmRleDIgPSBzdGFjay5sZW5ndGg7CiAgICB3aGlsZSAoaW5kZXgyLS0gPiBzaXplKSB7CiAgICAgIGNvbnN0IGVudHJ5ID0gc3RhY2tbaW5kZXgyXTsKICAgICAgc2VsZjIuY29udGFpbmVyU3RhdGUgPSBlbnRyeVsxXTsKICAgICAgZW50cnlbMF0uZXhpdC5jYWxsKHNlbGYyLCBlZmZlY3RzKTsKICAgIH0KICAgIHN0YWNrLmxlbmd0aCA9IHNpemU7CiAgfQogIF9fbmFtZShleGl0Q29udGFpbmVycywgImV4aXRDb250YWluZXJzIik7CiAgZnVuY3Rpb24gY2xvc2VGbG93KCkgewogICAgY2hpbGRGbG93LndyaXRlKFtudWxsXSk7CiAgICBjaGlsZFRva2VuID0gdm9pZCAwOwogICAgY2hpbGRGbG93ID0gdm9pZCAwOwogICAgc2VsZjIuY29udGFpbmVyU3RhdGUuX2Nsb3NlRmxvdyA9IHZvaWQgMDsKICB9CiAgX19uYW1lKGNsb3NlRmxvdywgImNsb3NlRmxvdyIpOwp9Cl9fbmFtZShpbml0aWFsaXplRG9jdW1lbnQsICJpbml0aWFsaXplRG9jdW1lbnQiKTsKZnVuY3Rpb24gdG9rZW5pemVDb250YWluZXIoZWZmZWN0cywgb2szLCBub2spIHsKICByZXR1cm4gZmFjdG9yeVNwYWNlKGVmZmVjdHMsIGVmZmVjdHMuYXR0ZW1wdCh0aGlzLnBhcnNlci5jb25zdHJ1Y3RzLmRvY3VtZW50LCBvazMsIG5vayksICJsaW5lUHJlZml4IiwgdGhpcy5wYXJzZXIuY29uc3RydWN0cy5kaXNhYmxlLm51bGwuaW5jbHVkZXMoImNvZGVJbmRlbnRlZCIpID8gdm9pZCAwIDogNCk7Cn0KX19uYW1lKHRva2VuaXplQ29udGFpbmVyLCAidG9rZW5pemVDb250YWluZXIiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmtANC4wLjIvbm9kZV9tb2R1bGVzL21pY3JvbWFyay9saWIvaW5pdGlhbGl6ZS9mbG93LmpzCnZhciBmbG93ID0gewogIHRva2VuaXplOiBpbml0aWFsaXplRmxvdwp9OwpmdW5jdGlvbiBpbml0aWFsaXplRmxvdyhlZmZlY3RzKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIGNvbnN0IGluaXRpYWwgPSBlZmZlY3RzLmF0dGVtcHQoCiAgICAvLyBUcnkgdG8gcGFyc2UgYSBibGFuayBsaW5lLgogICAgYmxhbmtMaW5lLAogICAgYXRCbGFua0VuZGluZywKICAgIC8vIFRyeSB0byBwYXJzZSBpbml0aWFsIGZsb3cgKGVzc2VudGlhbGx5LCBvbmx5IGNvZGUpLgogICAgZWZmZWN0cy5hdHRlbXB0KHRoaXMucGFyc2VyLmNvbnN0cnVjdHMuZmxvd0luaXRpYWwsIGFmdGVyQ29uc3RydWN0LCBmYWN0b3J5U3BhY2UoZWZmZWN0cywgZWZmZWN0cy5hdHRlbXB0KHRoaXMucGFyc2VyLmNvbnN0cnVjdHMuZmxvdywgYWZ0ZXJDb25zdHJ1Y3QsIGVmZmVjdHMuYXR0ZW1wdChjb250ZW50LCBhZnRlckNvbnN0cnVjdCkpLCAibGluZVByZWZpeCIpKQogICk7CiAgcmV0dXJuIGluaXRpYWw7CiAgZnVuY3Rpb24gYXRCbGFua0VuZGluZyhjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGVmZmVjdHMuZW50ZXIoImxpbmVFbmRpbmdCbGFuayIpOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIGVmZmVjdHMuZXhpdCgibGluZUVuZGluZ0JsYW5rIik7CiAgICBzZWxmMi5jdXJyZW50Q29uc3RydWN0ID0gdm9pZCAwOwogICAgcmV0dXJuIGluaXRpYWw7CiAgfQogIF9fbmFtZShhdEJsYW5rRW5kaW5nLCAiYXRCbGFua0VuZGluZyIpOwogIGZ1bmN0aW9uIGFmdGVyQ29uc3RydWN0KGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgZWZmZWN0cy5lbnRlcigibGluZUVuZGluZyIpOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIGVmZmVjdHMuZXhpdCgibGluZUVuZGluZyIpOwogICAgc2VsZjIuY3VycmVudENvbnN0cnVjdCA9IHZvaWQgMDsKICAgIHJldHVybiBpbml0aWFsOwogIH0KICBfX25hbWUoYWZ0ZXJDb25zdHJ1Y3QsICJhZnRlckNvbnN0cnVjdCIpOwp9Cl9fbmFtZShpbml0aWFsaXplRmxvdywgImluaXRpYWxpemVGbG93Iik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrQDQuMC4yL25vZGVfbW9kdWxlcy9taWNyb21hcmsvbGliL2luaXRpYWxpemUvdGV4dC5qcwp2YXIgcmVzb2x2ZXIgPSB7CiAgcmVzb2x2ZUFsbDogY3JlYXRlUmVzb2x2ZXIoKQp9Owp2YXIgc3RyaW5nID0gaW5pdGlhbGl6ZUZhY3RvcnkoInN0cmluZyIpOwp2YXIgdGV4dDMgPSBpbml0aWFsaXplRmFjdG9yeSgidGV4dCIpOwpmdW5jdGlvbiBpbml0aWFsaXplRmFjdG9yeShmaWVsZCkgewogIHJldHVybiB7CiAgICByZXNvbHZlQWxsOiBjcmVhdGVSZXNvbHZlcihmaWVsZCA9PT0gInRleHQiID8gcmVzb2x2ZUFsbExpbmVTdWZmaXhlcyA6IHZvaWQgMCksCiAgICB0b2tlbml6ZTogaW5pdGlhbGl6ZVRleHQKICB9OwogIGZ1bmN0aW9uIGluaXRpYWxpemVUZXh0KGVmZmVjdHMpIHsKICAgIGNvbnN0IHNlbGYyID0gdGhpczsKICAgIGNvbnN0IGNvbnN0cnVjdHMyID0gdGhpcy5wYXJzZXIuY29uc3RydWN0c1tmaWVsZF07CiAgICBjb25zdCB0ZXh0OCA9IGVmZmVjdHMuYXR0ZW1wdChjb25zdHJ1Y3RzMiwgc3RhcnQsIG5vdFRleHQpOwogICAgcmV0dXJuIHN0YXJ0OwogICAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgICAgcmV0dXJuIGF0QnJlYWsoY29kZTQpID8gdGV4dDgoY29kZTQpIDogbm90VGV4dChjb2RlNCk7CiAgICB9CiAgICBfX25hbWUoc3RhcnQsICJzdGFydCIpOwogICAgZnVuY3Rpb24gbm90VGV4dChjb2RlNCkgewogICAgICBpZiAoY29kZTQgPT09IG51bGwpIHsKICAgICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBlZmZlY3RzLmVudGVyKCJkYXRhIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBkYXRhOwogICAgfQogICAgX19uYW1lKG5vdFRleHQsICJub3RUZXh0Iik7CiAgICBmdW5jdGlvbiBkYXRhKGNvZGU0KSB7CiAgICAgIGlmIChhdEJyZWFrKGNvZGU0KSkgewogICAgICAgIGVmZmVjdHMuZXhpdCgiZGF0YSIpOwogICAgICAgIHJldHVybiB0ZXh0OChjb2RlNCk7CiAgICAgIH0KICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGRhdGE7CiAgICB9CiAgICBfX25hbWUoZGF0YSwgImRhdGEiKTsKICAgIGZ1bmN0aW9uIGF0QnJlYWsoY29kZTQpIHsKICAgICAgaWYgKGNvZGU0ID09PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgY29uc3QgbGlzdDUgPSBjb25zdHJ1Y3RzMltjb2RlNF07CiAgICAgIGxldCBpbmRleDIgPSAtMTsKICAgICAgaWYgKGxpc3Q1KSB7CiAgICAgICAgd2hpbGUgKCsraW5kZXgyIDwgbGlzdDUubGVuZ3RoKSB7CiAgICAgICAgICBjb25zdCBpdGVtID0gbGlzdDVbaW5kZXgyXTsKICAgICAgICAgIGlmICghaXRlbS5wcmV2aW91cyB8fCBpdGVtLnByZXZpb3VzLmNhbGwoc2VsZjIsIHNlbGYyLnByZXZpb3VzKSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgX19uYW1lKGF0QnJlYWssICJhdEJyZWFrIik7CiAgfQogIF9fbmFtZShpbml0aWFsaXplVGV4dCwgImluaXRpYWxpemVUZXh0Iik7Cn0KX19uYW1lKGluaXRpYWxpemVGYWN0b3J5LCAiaW5pdGlhbGl6ZUZhY3RvcnkiKTsKZnVuY3Rpb24gY3JlYXRlUmVzb2x2ZXIoZXh0cmFSZXNvbHZlcikgewogIHJldHVybiByZXNvbHZlQWxsVGV4dDsKICBmdW5jdGlvbiByZXNvbHZlQWxsVGV4dChldmVudHMsIGNvbnRleHQyKSB7CiAgICBsZXQgaW5kZXgyID0gLTE7CiAgICBsZXQgZW50ZXI7CiAgICB3aGlsZSAoKytpbmRleDIgPD0gZXZlbnRzLmxlbmd0aCkgewogICAgICBpZiAoZW50ZXIgPT09IHZvaWQgMCkgewogICAgICAgIGlmIChldmVudHNbaW5kZXgyXSAmJiBldmVudHNbaW5kZXgyXVsxXS50eXBlID09PSAiZGF0YSIpIHsKICAgICAgICAgIGVudGVyID0gaW5kZXgyOwogICAgICAgICAgaW5kZXgyKys7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKCFldmVudHNbaW5kZXgyXSB8fCBldmVudHNbaW5kZXgyXVsxXS50eXBlICE9PSAiZGF0YSIpIHsKICAgICAgICBpZiAoaW5kZXgyICE9PSBlbnRlciArIDIpIHsKICAgICAgICAgIGV2ZW50c1tlbnRlcl1bMV0uZW5kID0gZXZlbnRzW2luZGV4MiAtIDFdWzFdLmVuZDsKICAgICAgICAgIGV2ZW50cy5zcGxpY2UoZW50ZXIgKyAyLCBpbmRleDIgLSBlbnRlciAtIDIpOwogICAgICAgICAgaW5kZXgyID0gZW50ZXIgKyAyOwogICAgICAgIH0KICAgICAgICBlbnRlciA9IHZvaWQgMDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGV4dHJhUmVzb2x2ZXIgPyBleHRyYVJlc29sdmVyKGV2ZW50cywgY29udGV4dDIpIDogZXZlbnRzOwogIH0KICBfX25hbWUocmVzb2x2ZUFsbFRleHQsICJyZXNvbHZlQWxsVGV4dCIpOwp9Cl9fbmFtZShjcmVhdGVSZXNvbHZlciwgImNyZWF0ZVJlc29sdmVyIik7CmZ1bmN0aW9uIHJlc29sdmVBbGxMaW5lU3VmZml4ZXMoZXZlbnRzLCBjb250ZXh0MikgewogIGxldCBldmVudEluZGV4ID0gMDsKICB3aGlsZSAoKytldmVudEluZGV4IDw9IGV2ZW50cy5sZW5ndGgpIHsKICAgIGlmICgoZXZlbnRJbmRleCA9PT0gZXZlbnRzLmxlbmd0aCB8fCBldmVudHNbZXZlbnRJbmRleF1bMV0udHlwZSA9PT0gImxpbmVFbmRpbmciKSAmJiBldmVudHNbZXZlbnRJbmRleCAtIDFdWzFdLnR5cGUgPT09ICJkYXRhIikgewogICAgICBjb25zdCBkYXRhID0gZXZlbnRzW2V2ZW50SW5kZXggLSAxXVsxXTsKICAgICAgY29uc3QgY2h1bmtzID0gY29udGV4dDIuc2xpY2VTdHJlYW0oZGF0YSk7CiAgICAgIGxldCBpbmRleDIgPSBjaHVua3MubGVuZ3RoOwogICAgICBsZXQgYnVmZmVySW5kZXggPSAtMTsKICAgICAgbGV0IHNpemUgPSAwOwogICAgICBsZXQgdGFiczsKICAgICAgd2hpbGUgKGluZGV4Mi0tKSB7CiAgICAgICAgY29uc3QgY2h1bmsgPSBjaHVua3NbaW5kZXgyXTsKICAgICAgICBpZiAodHlwZW9mIGNodW5rID09PSAic3RyaW5nIikgewogICAgICAgICAgYnVmZmVySW5kZXggPSBjaHVuay5sZW5ndGg7CiAgICAgICAgICB3aGlsZSAoY2h1bmsuY2hhckNvZGVBdChidWZmZXJJbmRleCAtIDEpID09PSAzMikgewogICAgICAgICAgICBzaXplKys7CiAgICAgICAgICAgIGJ1ZmZlckluZGV4LS07CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoYnVmZmVySW5kZXgpIGJyZWFrOwogICAgICAgICAgYnVmZmVySW5kZXggPSAtMTsKICAgICAgICB9IGVsc2UgaWYgKGNodW5rID09PSAtMikgewogICAgICAgICAgdGFicyA9IHRydWU7CiAgICAgICAgICBzaXplKys7CiAgICAgICAgfSBlbHNlIGlmIChjaHVuayA9PT0gLTEpIHsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaW5kZXgyKys7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGNvbnRleHQyLl9jb250ZW50VHlwZVRleHRUcmFpbGluZyAmJiBldmVudEluZGV4ID09PSBldmVudHMubGVuZ3RoKSB7CiAgICAgICAgc2l6ZSA9IDA7CiAgICAgIH0KICAgICAgaWYgKHNpemUpIHsKICAgICAgICBjb25zdCB0b2tlbiA9IHsKICAgICAgICAgIHR5cGU6IGV2ZW50SW5kZXggPT09IGV2ZW50cy5sZW5ndGggfHwgdGFicyB8fCBzaXplIDwgMiA/ICJsaW5lU3VmZml4IiA6ICJoYXJkQnJlYWtUcmFpbGluZyIsCiAgICAgICAgICBzdGFydDogewogICAgICAgICAgICBfYnVmZmVySW5kZXg6IGluZGV4MiA/IGJ1ZmZlckluZGV4IDogZGF0YS5zdGFydC5fYnVmZmVySW5kZXggKyBidWZmZXJJbmRleCwKICAgICAgICAgICAgX2luZGV4OiBkYXRhLnN0YXJ0Ll9pbmRleCArIGluZGV4MiwKICAgICAgICAgICAgbGluZTogZGF0YS5lbmQubGluZSwKICAgICAgICAgICAgY29sdW1uOiBkYXRhLmVuZC5jb2x1bW4gLSBzaXplLAogICAgICAgICAgICBvZmZzZXQ6IGRhdGEuZW5kLm9mZnNldCAtIHNpemUKICAgICAgICAgIH0sCiAgICAgICAgICBlbmQ6IHsKICAgICAgICAgICAgLi4uZGF0YS5lbmQKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGRhdGEuZW5kID0gewogICAgICAgICAgLi4udG9rZW4uc3RhcnQKICAgICAgICB9OwogICAgICAgIGlmIChkYXRhLnN0YXJ0Lm9mZnNldCA9PT0gZGF0YS5lbmQub2Zmc2V0KSB7CiAgICAgICAgICBPYmplY3QuYXNzaWduKGRhdGEsIHRva2VuKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZXZlbnRzLnNwbGljZShldmVudEluZGV4LCAwLCBbImVudGVyIiwgdG9rZW4sIGNvbnRleHQyXSwgWyJleGl0IiwgdG9rZW4sIGNvbnRleHQyXSk7CiAgICAgICAgICBldmVudEluZGV4ICs9IDI7CiAgICAgICAgfQogICAgICB9CiAgICAgIGV2ZW50SW5kZXgrKzsKICAgIH0KICB9CiAgcmV0dXJuIGV2ZW50czsKfQpfX25hbWUocmVzb2x2ZUFsbExpbmVTdWZmaXhlcywgInJlc29sdmVBbGxMaW5lU3VmZml4ZXMiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmtANC4wLjIvbm9kZV9tb2R1bGVzL21pY3JvbWFyay9saWIvY29uc3RydWN0cy5qcwp2YXIgY29uc3RydWN0c19leHBvcnRzID0ge307Cl9fZXhwb3J0KGNvbnN0cnVjdHNfZXhwb3J0cywgewogIGF0dGVudGlvbk1hcmtlcnM6ICgpID0+IGF0dGVudGlvbk1hcmtlcnMsCiAgY29udGVudEluaXRpYWw6ICgpID0+IGNvbnRlbnRJbml0aWFsLAogIGRpc2FibGU6ICgpID0+IGRpc2FibGUsCiAgZG9jdW1lbnQ6ICgpID0+IGRvY3VtZW50MywKICBmbG93OiAoKSA9PiBmbG93MiwKICBmbG93SW5pdGlhbDogKCkgPT4gZmxvd0luaXRpYWwsCiAgaW5zaWRlU3BhbjogKCkgPT4gaW5zaWRlU3BhbiwKICBzdHJpbmc6ICgpID0+IHN0cmluZzIsCiAgdGV4dDogKCkgPT4gdGV4dDQKfSk7CnZhciBkb2N1bWVudDMgPSB7CiAgWzQyXTogbGlzdDMsCiAgWzQzXTogbGlzdDMsCiAgWzQ1XTogbGlzdDMsCiAgWzQ4XTogbGlzdDMsCiAgWzQ5XTogbGlzdDMsCiAgWzUwXTogbGlzdDMsCiAgWzUxXTogbGlzdDMsCiAgWzUyXTogbGlzdDMsCiAgWzUzXTogbGlzdDMsCiAgWzU0XTogbGlzdDMsCiAgWzU1XTogbGlzdDMsCiAgWzU2XTogbGlzdDMsCiAgWzU3XTogbGlzdDMsCiAgWzYyXTogYmxvY2tRdW90ZQp9Owp2YXIgY29udGVudEluaXRpYWwgPSB7CiAgWzkxXTogZGVmaW5pdGlvbjIKfTsKdmFyIGZsb3dJbml0aWFsID0gewogIFstMl06IGNvZGVJbmRlbnRlZCwKICBbLTFdOiBjb2RlSW5kZW50ZWQsCiAgWzMyXTogY29kZUluZGVudGVkCn07CnZhciBmbG93MiA9IHsKICBbMzVdOiBoZWFkaW5nQXR4LAogIFs0Ml06IHRoZW1hdGljQnJlYWsyLAogIFs0NV06IFtzZXRleHRVbmRlcmxpbmUsIHRoZW1hdGljQnJlYWsyXSwKICBbNjBdOiBodG1sRmxvdywKICBbNjFdOiBzZXRleHRVbmRlcmxpbmUsCiAgWzk1XTogdGhlbWF0aWNCcmVhazIsCiAgWzk2XTogY29kZUZlbmNlZCwKICBbMTI2XTogY29kZUZlbmNlZAp9Owp2YXIgc3RyaW5nMiA9IHsKICBbMzhdOiBjaGFyYWN0ZXJSZWZlcmVuY2UsCiAgWzkyXTogY2hhcmFjdGVyRXNjYXBlCn07CnZhciB0ZXh0NCA9IHsKICBbLTVdOiBsaW5lRW5kaW5nLAogIFstNF06IGxpbmVFbmRpbmcsCiAgWy0zXTogbGluZUVuZGluZywKICBbMzNdOiBsYWJlbFN0YXJ0SW1hZ2UsCiAgWzM4XTogY2hhcmFjdGVyUmVmZXJlbmNlLAogIFs0Ml06IGF0dGVudGlvbiwKICBbNjBdOiBbYXV0b2xpbmssIGh0bWxUZXh0XSwKICBbOTFdOiBsYWJlbFN0YXJ0TGluaywKICBbOTJdOiBbaGFyZEJyZWFrRXNjYXBlLCBjaGFyYWN0ZXJFc2NhcGVdLAogIFs5M106IGxhYmVsRW5kLAogIFs5NV06IGF0dGVudGlvbiwKICBbOTZdOiBjb2RlVGV4dAp9Owp2YXIgaW5zaWRlU3BhbiA9IHsKICBudWxsOiBbYXR0ZW50aW9uLCByZXNvbHZlcl0KfTsKdmFyIGF0dGVudGlvbk1hcmtlcnMgPSB7CiAgbnVsbDogWzQyLCA5NV0KfTsKdmFyIGRpc2FibGUgPSB7CiAgbnVsbDogW10KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmtANC4wLjIvbm9kZV9tb2R1bGVzL21pY3JvbWFyay9saWIvY3JlYXRlLXRva2VuaXplci5qcwpmdW5jdGlvbiBjcmVhdGVUb2tlbml6ZXIocGFyc2VyLCBpbml0aWFsaXplLCBmcm9tMikgewogIGxldCBwb2ludDQgPSB7CiAgICBfYnVmZmVySW5kZXg6IC0xLAogICAgX2luZGV4OiAwLAogICAgbGluZTogZnJvbTIgJiYgZnJvbTIubGluZSB8fCAxLAogICAgY29sdW1uOiBmcm9tMiAmJiBmcm9tMi5jb2x1bW4gfHwgMSwKICAgIG9mZnNldDogZnJvbTIgJiYgZnJvbTIub2Zmc2V0IHx8IDAKICB9OwogIGNvbnN0IGNvbHVtblN0YXJ0ID0ge307CiAgY29uc3QgcmVzb2x2ZUFsbENvbnN0cnVjdHMgPSBbXTsKICBsZXQgY2h1bmtzID0gW107CiAgbGV0IHN0YWNrID0gW107CiAgbGV0IGNvbnN1bWVkID0gdHJ1ZTsKICBjb25zdCBlZmZlY3RzID0gewogICAgYXR0ZW1wdDogY29uc3RydWN0RmFjdG9yeShvbnN1Y2Nlc3NmdWxjb25zdHJ1Y3QpLAogICAgY2hlY2s6IGNvbnN0cnVjdEZhY3Rvcnkob25zdWNjZXNzZnVsY2hlY2spLAogICAgY29uc3VtZSwKICAgIGVudGVyLAogICAgZXhpdDogZXhpdDMsCiAgICBpbnRlcnJ1cHQ6IGNvbnN0cnVjdEZhY3Rvcnkob25zdWNjZXNzZnVsY2hlY2ssIHsKICAgICAgaW50ZXJydXB0OiB0cnVlCiAgICB9KQogIH07CiAgY29uc3QgY29udGV4dDIgPSB7CiAgICBjb2RlOiBudWxsLAogICAgY29udGFpbmVyU3RhdGU6IHt9LAogICAgZGVmaW5lU2tpcCwKICAgIGV2ZW50czogW10sCiAgICBub3c6IG5vdzIsCiAgICBwYXJzZXIsCiAgICBwcmV2aW91czogbnVsbCwKICAgIHNsaWNlU2VyaWFsaXplLAogICAgc2xpY2VTdHJlYW0sCiAgICB3cml0ZQogIH07CiAgbGV0IHN0YXRlID0gaW5pdGlhbGl6ZS50b2tlbml6ZS5jYWxsKGNvbnRleHQyLCBlZmZlY3RzKTsKICBsZXQgZXhwZWN0ZWRDb2RlOwogIGlmIChpbml0aWFsaXplLnJlc29sdmVBbGwpIHsKICAgIHJlc29sdmVBbGxDb25zdHJ1Y3RzLnB1c2goaW5pdGlhbGl6ZSk7CiAgfQogIHJldHVybiBjb250ZXh0MjsKICBmdW5jdGlvbiB3cml0ZShzbGljZSkgewogICAgY2h1bmtzID0gcHVzaChjaHVua3MsIHNsaWNlKTsKICAgIG1haW4oKTsKICAgIGlmIChjaHVua3NbY2h1bmtzLmxlbmd0aCAtIDFdICE9PSBudWxsKSB7CiAgICAgIHJldHVybiBbXTsKICAgIH0KICAgIGFkZFJlc3VsdChpbml0aWFsaXplLCAwKTsKICAgIGNvbnRleHQyLmV2ZW50cyA9IHJlc29sdmVBbGwocmVzb2x2ZUFsbENvbnN0cnVjdHMsIGNvbnRleHQyLmV2ZW50cywgY29udGV4dDIpOwogICAgcmV0dXJuIGNvbnRleHQyLmV2ZW50czsKICB9CiAgX19uYW1lKHdyaXRlLCAid3JpdGUiKTsKICBmdW5jdGlvbiBzbGljZVNlcmlhbGl6ZSh0b2tlbiwgZXhwYW5kVGFicykgewogICAgcmV0dXJuIHNlcmlhbGl6ZUNodW5rcyhzbGljZVN0cmVhbSh0b2tlbiksIGV4cGFuZFRhYnMpOwogIH0KICBfX25hbWUoc2xpY2VTZXJpYWxpemUsICJzbGljZVNlcmlhbGl6ZSIpOwogIGZ1bmN0aW9uIHNsaWNlU3RyZWFtKHRva2VuKSB7CiAgICByZXR1cm4gc2xpY2VDaHVua3MoY2h1bmtzLCB0b2tlbik7CiAgfQogIF9fbmFtZShzbGljZVN0cmVhbSwgInNsaWNlU3RyZWFtIik7CiAgZnVuY3Rpb24gbm93MigpIHsKICAgIGNvbnN0IHsKICAgICAgX2J1ZmZlckluZGV4LAogICAgICBfaW5kZXgsCiAgICAgIGxpbmUsCiAgICAgIGNvbHVtbiwKICAgICAgb2Zmc2V0CiAgICB9ID0gcG9pbnQ0OwogICAgcmV0dXJuIHsKICAgICAgX2J1ZmZlckluZGV4LAogICAgICBfaW5kZXgsCiAgICAgIGxpbmUsCiAgICAgIGNvbHVtbiwKICAgICAgb2Zmc2V0CiAgICB9OwogIH0KICBfX25hbWUobm93MiwgIm5vdyIpOwogIGZ1bmN0aW9uIGRlZmluZVNraXAodmFsdWUyKSB7CiAgICBjb2x1bW5TdGFydFt2YWx1ZTIubGluZV0gPSB2YWx1ZTIuY29sdW1uOwogICAgYWNjb3VudEZvclBvdGVudGlhbFNraXAoKTsKICB9CiAgX19uYW1lKGRlZmluZVNraXAsICJkZWZpbmVTa2lwIik7CiAgZnVuY3Rpb24gbWFpbigpIHsKICAgIGxldCBjaHVua0luZGV4OwogICAgd2hpbGUgKHBvaW50NC5faW5kZXggPCBjaHVua3MubGVuZ3RoKSB7CiAgICAgIGNvbnN0IGNodW5rID0gY2h1bmtzW3BvaW50NC5faW5kZXhdOwogICAgICBpZiAodHlwZW9mIGNodW5rID09PSAic3RyaW5nIikgewogICAgICAgIGNodW5rSW5kZXggPSBwb2ludDQuX2luZGV4OwogICAgICAgIGlmIChwb2ludDQuX2J1ZmZlckluZGV4IDwgMCkgewogICAgICAgICAgcG9pbnQ0Ll9idWZmZXJJbmRleCA9IDA7CiAgICAgICAgfQogICAgICAgIHdoaWxlIChwb2ludDQuX2luZGV4ID09PSBjaHVua0luZGV4ICYmIHBvaW50NC5fYnVmZmVySW5kZXggPCBjaHVuay5sZW5ndGgpIHsKICAgICAgICAgIGdvKGNodW5rLmNoYXJDb2RlQXQocG9pbnQ0Ll9idWZmZXJJbmRleCkpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBnbyhjaHVuayk7CiAgICAgIH0KICAgIH0KICB9CiAgX19uYW1lKG1haW4sICJtYWluIik7CiAgZnVuY3Rpb24gZ28oY29kZTQpIHsKICAgIGNvbnN1bWVkID0gdm9pZCAwOwogICAgZXhwZWN0ZWRDb2RlID0gY29kZTQ7CiAgICBzdGF0ZSA9IHN0YXRlKGNvZGU0KTsKICB9CiAgX19uYW1lKGdvLCAiZ28iKTsKICBmdW5jdGlvbiBjb25zdW1lKGNvZGU0KSB7CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBwb2ludDQubGluZSsrOwogICAgICBwb2ludDQuY29sdW1uID0gMTsKICAgICAgcG9pbnQ0Lm9mZnNldCArPSBjb2RlNCA9PT0gLTMgPyAyIDogMTsKICAgICAgYWNjb3VudEZvclBvdGVudGlhbFNraXAoKTsKICAgIH0gZWxzZSBpZiAoY29kZTQgIT09IC0xKSB7CiAgICAgIHBvaW50NC5jb2x1bW4rKzsKICAgICAgcG9pbnQ0Lm9mZnNldCsrOwogICAgfQogICAgaWYgKHBvaW50NC5fYnVmZmVySW5kZXggPCAwKSB7CiAgICAgIHBvaW50NC5faW5kZXgrKzsKICAgIH0gZWxzZSB7CiAgICAgIHBvaW50NC5fYnVmZmVySW5kZXgrKzsKICAgICAgaWYgKHBvaW50NC5fYnVmZmVySW5kZXggPT09IC8vIFBvaW50cyB3LyBub24tbmVnYXRpdmUgYF9idWZmZXJJbmRleGAgcmVmZXJlbmNlCiAgICAgIC8vIHN0cmluZ3MuCiAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqLwogICAgICBjaHVua3NbcG9pbnQ0Ll9pbmRleF0ubGVuZ3RoKSB7CiAgICAgICAgcG9pbnQ0Ll9idWZmZXJJbmRleCA9IC0xOwogICAgICAgIHBvaW50NC5faW5kZXgrKzsKICAgICAgfQogICAgfQogICAgY29udGV4dDIucHJldmlvdXMgPSBjb2RlNDsKICAgIGNvbnN1bWVkID0gdHJ1ZTsKICB9CiAgX19uYW1lKGNvbnN1bWUsICJjb25zdW1lIik7CiAgZnVuY3Rpb24gZW50ZXIodHlwZTUsIGZpZWxkcykgewogICAgY29uc3QgdG9rZW4gPSBmaWVsZHMgfHwge307CiAgICB0b2tlbi50eXBlID0gdHlwZTU7CiAgICB0b2tlbi5zdGFydCA9IG5vdzIoKTsKICAgIGNvbnRleHQyLmV2ZW50cy5wdXNoKFsiZW50ZXIiLCB0b2tlbiwgY29udGV4dDJdKTsKICAgIHN0YWNrLnB1c2godG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KICBfX25hbWUoZW50ZXIsICJlbnRlciIpOwogIGZ1bmN0aW9uIGV4aXQzKHR5cGU1KSB7CiAgICBjb25zdCB0b2tlbiA9IHN0YWNrLnBvcCgpOwogICAgdG9rZW4uZW5kID0gbm93MigpOwogICAgY29udGV4dDIuZXZlbnRzLnB1c2goWyJleGl0IiwgdG9rZW4sIGNvbnRleHQyXSk7CiAgICByZXR1cm4gdG9rZW47CiAgfQogIF9fbmFtZShleGl0MywgImV4aXQiKTsKICBmdW5jdGlvbiBvbnN1Y2Nlc3NmdWxjb25zdHJ1Y3QoY29uc3RydWN0LCBpbmZvKSB7CiAgICBhZGRSZXN1bHQoY29uc3RydWN0LCBpbmZvLmZyb20pOwogIH0KICBfX25hbWUob25zdWNjZXNzZnVsY29uc3RydWN0LCAib25zdWNjZXNzZnVsY29uc3RydWN0Iik7CiAgZnVuY3Rpb24gb25zdWNjZXNzZnVsY2hlY2soXzMsIGluZm8pIHsKICAgIGluZm8ucmVzdG9yZSgpOwogIH0KICBfX25hbWUob25zdWNjZXNzZnVsY2hlY2ssICJvbnN1Y2Nlc3NmdWxjaGVjayIpOwogIGZ1bmN0aW9uIGNvbnN0cnVjdEZhY3Rvcnkob25yZXR1cm4sIGZpZWxkcykgewogICAgcmV0dXJuIGhvb2s7CiAgICBmdW5jdGlvbiBob29rKGNvbnN0cnVjdHMyLCByZXR1cm5TdGF0ZSwgYm9ndXNTdGF0ZSkgewogICAgICBsZXQgbGlzdE9mQ29uc3RydWN0czsKICAgICAgbGV0IGNvbnN0cnVjdEluZGV4OwogICAgICBsZXQgY3VycmVudENvbnN0cnVjdDsKICAgICAgbGV0IGluZm87CiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGNvbnN0cnVjdHMyKSA/ICgKICAgICAgICAvKiBjOCBpZ25vcmUgbmV4dCAxICovCiAgICAgICAgaGFuZGxlTGlzdE9mQ29uc3RydWN0cyhjb25zdHJ1Y3RzMikKICAgICAgKSA6ICJ0b2tlbml6ZSIgaW4gY29uc3RydWN0czIgPyAoCiAgICAgICAgLy8gTG9va3MgbGlrZSBhIGNvbnN0cnVjdC4KICAgICAgICBoYW5kbGVMaXN0T2ZDb25zdHJ1Y3RzKFsKICAgICAgICAgIC8qKiBAdHlwZSB7Q29uc3RydWN0fSAqLwogICAgICAgICAgY29uc3RydWN0czIKICAgICAgICBdKQogICAgICApIDogaGFuZGxlTWFwT2ZDb25zdHJ1Y3RzKGNvbnN0cnVjdHMyKTsKICAgICAgZnVuY3Rpb24gaGFuZGxlTWFwT2ZDb25zdHJ1Y3RzKG1hcDcpIHsKICAgICAgICByZXR1cm4gc3RhcnQ7CiAgICAgICAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgICAgICAgIGNvbnN0IGxlZnQgPSBjb2RlNCAhPT0gbnVsbCAmJiBtYXA3W2NvZGU0XTsKICAgICAgICAgIGNvbnN0IGFsbDMgPSBjb2RlNCAhPT0gbnVsbCAmJiBtYXA3Lm51bGw7CiAgICAgICAgICBjb25zdCBsaXN0NSA9IFsKICAgICAgICAgICAgLy8gVG8gZG86IGFkZCBtb3JlIGV4dGVuc2lvbiB0ZXN0cy4KICAgICAgICAgICAgLyogYzggaWdub3JlIG5leHQgMiAqLwogICAgICAgICAgICAuLi5BcnJheS5pc0FycmF5KGxlZnQpID8gbGVmdCA6IGxlZnQgPyBbbGVmdF0gOiBbXSwKICAgICAgICAgICAgLi4uQXJyYXkuaXNBcnJheShhbGwzKSA/IGFsbDMgOiBhbGwzID8gW2FsbDNdIDogW10KICAgICAgICAgIF07CiAgICAgICAgICByZXR1cm4gaGFuZGxlTGlzdE9mQ29uc3RydWN0cyhsaXN0NSkoY29kZTQpOwogICAgICAgIH0KICAgICAgICBfX25hbWUoc3RhcnQsICJzdGFydCIpOwogICAgICB9CiAgICAgIF9fbmFtZShoYW5kbGVNYXBPZkNvbnN0cnVjdHMsICJoYW5kbGVNYXBPZkNvbnN0cnVjdHMiKTsKICAgICAgZnVuY3Rpb24gaGFuZGxlTGlzdE9mQ29uc3RydWN0cyhsaXN0NSkgewogICAgICAgIGxpc3RPZkNvbnN0cnVjdHMgPSBsaXN0NTsKICAgICAgICBjb25zdHJ1Y3RJbmRleCA9IDA7CiAgICAgICAgaWYgKGxpc3Q1Lmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgcmV0dXJuIGJvZ3VzU3RhdGU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBoYW5kbGVDb25zdHJ1Y3QobGlzdDVbY29uc3RydWN0SW5kZXhdKTsKICAgICAgfQogICAgICBfX25hbWUoaGFuZGxlTGlzdE9mQ29uc3RydWN0cywgImhhbmRsZUxpc3RPZkNvbnN0cnVjdHMiKTsKICAgICAgZnVuY3Rpb24gaGFuZGxlQ29uc3RydWN0KGNvbnN0cnVjdCkgewogICAgICAgIHJldHVybiBzdGFydDsKICAgICAgICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgICAgICAgaW5mbyA9IHN0b3JlKCk7CiAgICAgICAgICBjdXJyZW50Q29uc3RydWN0ID0gY29uc3RydWN0OwogICAgICAgICAgaWYgKCFjb25zdHJ1Y3QucGFydGlhbCkgewogICAgICAgICAgICBjb250ZXh0Mi5jdXJyZW50Q29uc3RydWN0ID0gY29uc3RydWN0OwogICAgICAgICAgfQogICAgICAgICAgaWYgKGNvbnN0cnVjdC5uYW1lICYmIGNvbnRleHQyLnBhcnNlci5jb25zdHJ1Y3RzLmRpc2FibGUubnVsbC5pbmNsdWRlcyhjb25zdHJ1Y3QubmFtZSkpIHsKICAgICAgICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gY29uc3RydWN0LnRva2VuaXplLmNhbGwoCiAgICAgICAgICAgIC8vIElmIHdlIGRvIGhhdmUgZmllbGRzLCBjcmVhdGUgYW4gb2JqZWN0IHcvIGBjb250ZXh0YCBhcyBpdHMKICAgICAgICAgICAgLy8gcHJvdG90eXBlLgogICAgICAgICAgICAvLyBUaGlzIGFsbG93cyBhIOKAnGxpdmUgYmluZGluZ+KAnSwgd2hpY2ggaXMgbmVlZGVkIGZvciBgaW50ZXJydXB0YC4KICAgICAgICAgICAgZmllbGRzID8gT2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKGNvbnRleHQyKSwgZmllbGRzKSA6IGNvbnRleHQyLAogICAgICAgICAgICBlZmZlY3RzLAogICAgICAgICAgICBvazMsCiAgICAgICAgICAgIG5vawogICAgICAgICAgKShjb2RlNCk7CiAgICAgICAgfQogICAgICAgIF9fbmFtZShzdGFydCwgInN0YXJ0Iik7CiAgICAgIH0KICAgICAgX19uYW1lKGhhbmRsZUNvbnN0cnVjdCwgImhhbmRsZUNvbnN0cnVjdCIpOwogICAgICBmdW5jdGlvbiBvazMoY29kZTQpIHsKICAgICAgICBjb25zdW1lZCA9IHRydWU7CiAgICAgICAgb25yZXR1cm4oY3VycmVudENvbnN0cnVjdCwgaW5mbyk7CiAgICAgICAgcmV0dXJuIHJldHVyblN0YXRlOwogICAgICB9CiAgICAgIF9fbmFtZShvazMsICJvayIpOwogICAgICBmdW5jdGlvbiBub2soY29kZTQpIHsKICAgICAgICBjb25zdW1lZCA9IHRydWU7CiAgICAgICAgaW5mby5yZXN0b3JlKCk7CiAgICAgICAgaWYgKCsrY29uc3RydWN0SW5kZXggPCBsaXN0T2ZDb25zdHJ1Y3RzLmxlbmd0aCkgewogICAgICAgICAgcmV0dXJuIGhhbmRsZUNvbnN0cnVjdChsaXN0T2ZDb25zdHJ1Y3RzW2NvbnN0cnVjdEluZGV4XSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBib2d1c1N0YXRlOwogICAgICB9CiAgICAgIF9fbmFtZShub2ssICJub2siKTsKICAgIH0KICAgIF9fbmFtZShob29rLCAiaG9vayIpOwogIH0KICBfX25hbWUoY29uc3RydWN0RmFjdG9yeSwgImNvbnN0cnVjdEZhY3RvcnkiKTsKICBmdW5jdGlvbiBhZGRSZXN1bHQoY29uc3RydWN0LCBmcm9tMykgewogICAgaWYgKGNvbnN0cnVjdC5yZXNvbHZlQWxsICYmICFyZXNvbHZlQWxsQ29uc3RydWN0cy5pbmNsdWRlcyhjb25zdHJ1Y3QpKSB7CiAgICAgIHJlc29sdmVBbGxDb25zdHJ1Y3RzLnB1c2goY29uc3RydWN0KTsKICAgIH0KICAgIGlmIChjb25zdHJ1Y3QucmVzb2x2ZSkgewogICAgICBzcGxpY2UoY29udGV4dDIuZXZlbnRzLCBmcm9tMywgY29udGV4dDIuZXZlbnRzLmxlbmd0aCAtIGZyb20zLCBjb25zdHJ1Y3QucmVzb2x2ZShjb250ZXh0Mi5ldmVudHMuc2xpY2UoZnJvbTMpLCBjb250ZXh0MikpOwogICAgfQogICAgaWYgKGNvbnN0cnVjdC5yZXNvbHZlVG8pIHsKICAgICAgY29udGV4dDIuZXZlbnRzID0gY29uc3RydWN0LnJlc29sdmVUbyhjb250ZXh0Mi5ldmVudHMsIGNvbnRleHQyKTsKICAgIH0KICB9CiAgX19uYW1lKGFkZFJlc3VsdCwgImFkZFJlc3VsdCIpOwogIGZ1bmN0aW9uIHN0b3JlKCkgewogICAgY29uc3Qgc3RhcnRQb2ludCA9IG5vdzIoKTsKICAgIGNvbnN0IHN0YXJ0UHJldmlvdXMgPSBjb250ZXh0Mi5wcmV2aW91czsKICAgIGNvbnN0IHN0YXJ0Q3VycmVudENvbnN0cnVjdCA9IGNvbnRleHQyLmN1cnJlbnRDb25zdHJ1Y3Q7CiAgICBjb25zdCBzdGFydEV2ZW50c0luZGV4ID0gY29udGV4dDIuZXZlbnRzLmxlbmd0aDsKICAgIGNvbnN0IHN0YXJ0U3RhY2sgPSBBcnJheS5mcm9tKHN0YWNrKTsKICAgIHJldHVybiB7CiAgICAgIGZyb206IHN0YXJ0RXZlbnRzSW5kZXgsCiAgICAgIHJlc3RvcmUKICAgIH07CiAgICBmdW5jdGlvbiByZXN0b3JlKCkgewogICAgICBwb2ludDQgPSBzdGFydFBvaW50OwogICAgICBjb250ZXh0Mi5wcmV2aW91cyA9IHN0YXJ0UHJldmlvdXM7CiAgICAgIGNvbnRleHQyLmN1cnJlbnRDb25zdHJ1Y3QgPSBzdGFydEN1cnJlbnRDb25zdHJ1Y3Q7CiAgICAgIGNvbnRleHQyLmV2ZW50cy5sZW5ndGggPSBzdGFydEV2ZW50c0luZGV4OwogICAgICBzdGFjayA9IHN0YXJ0U3RhY2s7CiAgICAgIGFjY291bnRGb3JQb3RlbnRpYWxTa2lwKCk7CiAgICB9CiAgICBfX25hbWUocmVzdG9yZSwgInJlc3RvcmUiKTsKICB9CiAgX19uYW1lKHN0b3JlLCAic3RvcmUiKTsKICBmdW5jdGlvbiBhY2NvdW50Rm9yUG90ZW50aWFsU2tpcCgpIHsKICAgIGlmIChwb2ludDQubGluZSBpbiBjb2x1bW5TdGFydCAmJiBwb2ludDQuY29sdW1uIDwgMikgewogICAgICBwb2ludDQuY29sdW1uID0gY29sdW1uU3RhcnRbcG9pbnQ0LmxpbmVdOwogICAgICBwb2ludDQub2Zmc2V0ICs9IGNvbHVtblN0YXJ0W3BvaW50NC5saW5lXSAtIDE7CiAgICB9CiAgfQogIF9fbmFtZShhY2NvdW50Rm9yUG90ZW50aWFsU2tpcCwgImFjY291bnRGb3JQb3RlbnRpYWxTa2lwIik7Cn0KX19uYW1lKGNyZWF0ZVRva2VuaXplciwgImNyZWF0ZVRva2VuaXplciIpOwpmdW5jdGlvbiBzbGljZUNodW5rcyhjaHVua3MsIHRva2VuKSB7CiAgY29uc3Qgc3RhcnRJbmRleCA9IHRva2VuLnN0YXJ0Ll9pbmRleDsKICBjb25zdCBzdGFydEJ1ZmZlckluZGV4ID0gdG9rZW4uc3RhcnQuX2J1ZmZlckluZGV4OwogIGNvbnN0IGVuZEluZGV4ID0gdG9rZW4uZW5kLl9pbmRleDsKICBjb25zdCBlbmRCdWZmZXJJbmRleCA9IHRva2VuLmVuZC5fYnVmZmVySW5kZXg7CiAgbGV0IHZpZXc7CiAgaWYgKHN0YXJ0SW5kZXggPT09IGVuZEluZGV4KSB7CiAgICB2aWV3ID0gW2NodW5rc1tzdGFydEluZGV4XS5zbGljZShzdGFydEJ1ZmZlckluZGV4LCBlbmRCdWZmZXJJbmRleCldOwogIH0gZWxzZSB7CiAgICB2aWV3ID0gY2h1bmtzLnNsaWNlKHN0YXJ0SW5kZXgsIGVuZEluZGV4KTsKICAgIGlmIChzdGFydEJ1ZmZlckluZGV4ID4gLTEpIHsKICAgICAgY29uc3QgaGVhZDIgPSB2aWV3WzBdOwogICAgICBpZiAodHlwZW9mIGhlYWQyID09PSAic3RyaW5nIikgewogICAgICAgIHZpZXdbMF0gPSBoZWFkMi5zbGljZShzdGFydEJ1ZmZlckluZGV4KTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2aWV3LnNoaWZ0KCk7CiAgICAgIH0KICAgIH0KICAgIGlmIChlbmRCdWZmZXJJbmRleCA+IDApIHsKICAgICAgdmlldy5wdXNoKGNodW5rc1tlbmRJbmRleF0uc2xpY2UoMCwgZW5kQnVmZmVySW5kZXgpKTsKICAgIH0KICB9CiAgcmV0dXJuIHZpZXc7Cn0KX19uYW1lKHNsaWNlQ2h1bmtzLCAic2xpY2VDaHVua3MiKTsKZnVuY3Rpb24gc2VyaWFsaXplQ2h1bmtzKGNodW5rcywgZXhwYW5kVGFicykgewogIGxldCBpbmRleDIgPSAtMTsKICBjb25zdCByZXN1bHQgPSBbXTsKICBsZXQgYXRUYWI7CiAgd2hpbGUgKCsraW5kZXgyIDwgY2h1bmtzLmxlbmd0aCkgewogICAgY29uc3QgY2h1bmsgPSBjaHVua3NbaW5kZXgyXTsKICAgIGxldCB2YWx1ZTI7CiAgICBpZiAodHlwZW9mIGNodW5rID09PSAic3RyaW5nIikgewogICAgICB2YWx1ZTIgPSBjaHVuazsKICAgIH0gZWxzZSBzd2l0Y2ggKGNodW5rKSB7CiAgICAgIGNhc2UgLTU6IHsKICAgICAgICB2YWx1ZTIgPSAiXHIiOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgLTQ6IHsKICAgICAgICB2YWx1ZTIgPSAiXG4iOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgLTM6IHsKICAgICAgICB2YWx1ZTIgPSAiXHJcbiI7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSAtMjogewogICAgICAgIHZhbHVlMiA9IGV4cGFuZFRhYnMgPyAiICIgOiAiCSI7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSAtMTogewogICAgICAgIGlmICghZXhwYW5kVGFicyAmJiBhdFRhYikgY29udGludWU7CiAgICAgICAgdmFsdWUyID0gIiAiOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGRlZmF1bHQ6IHsKICAgICAgICB2YWx1ZTIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNodW5rKTsKICAgICAgfQogICAgfQogICAgYXRUYWIgPSBjaHVuayA9PT0gLTI7CiAgICByZXN1bHQucHVzaCh2YWx1ZTIpOwogIH0KICByZXR1cm4gcmVzdWx0LmpvaW4oIiIpOwp9Cl9fbmFtZShzZXJpYWxpemVDaHVua3MsICJzZXJpYWxpemVDaHVua3MiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmtANC4wLjIvbm9kZV9tb2R1bGVzL21pY3JvbWFyay9saWIvcGFyc2UuanMKZnVuY3Rpb24gcGFyc2U0KG9wdGlvbnMpIHsKICBjb25zdCBzZXR0aW5ncyA9IG9wdGlvbnMgfHwge307CiAgY29uc3QgY29uc3RydWN0czIgPSAoCiAgICAvKiogQHR5cGUge0Z1bGxOb3JtYWxpemVkRXh0ZW5zaW9ufSAqLwogICAgY29tYmluZUV4dGVuc2lvbnMoW2NvbnN0cnVjdHNfZXhwb3J0cywgLi4uc2V0dGluZ3MuZXh0ZW5zaW9ucyB8fCBbXV0pCiAgKTsKICBjb25zdCBwYXJzZXIgPSB7CiAgICBjb25zdHJ1Y3RzOiBjb25zdHJ1Y3RzMiwKICAgIGNvbnRlbnQ6IGNyZWF0ZTcoY29udGVudDIpLAogICAgZGVmaW5lZDogW10sCiAgICBkb2N1bWVudDogY3JlYXRlNyhkb2N1bWVudDIpLAogICAgZmxvdzogY3JlYXRlNyhmbG93KSwKICAgIGxhenk6IHt9LAogICAgc3RyaW5nOiBjcmVhdGU3KHN0cmluZyksCiAgICB0ZXh0OiBjcmVhdGU3KHRleHQzKQogIH07CiAgcmV0dXJuIHBhcnNlcjsKICBmdW5jdGlvbiBjcmVhdGU3KGluaXRpYWwpIHsKICAgIHJldHVybiBjcmVhdG9yOwogICAgZnVuY3Rpb24gY3JlYXRvcihmcm9tMikgewogICAgICByZXR1cm4gY3JlYXRlVG9rZW5pemVyKHBhcnNlciwgaW5pdGlhbCwgZnJvbTIpOwogICAgfQogICAgX19uYW1lKGNyZWF0b3IsICJjcmVhdG9yIik7CiAgfQogIF9fbmFtZShjcmVhdGU3LCAiY3JlYXRlIik7Cn0KX19uYW1lKHBhcnNlNCwgInBhcnNlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrQDQuMC4yL25vZGVfbW9kdWxlcy9taWNyb21hcmsvbGliL3Bvc3Rwcm9jZXNzLmpzCmZ1bmN0aW9uIHBvc3Rwcm9jZXNzKGV2ZW50cykgewogIHdoaWxlICghc3VidG9rZW5pemUoZXZlbnRzKSkgewogIH0KICByZXR1cm4gZXZlbnRzOwp9Cl9fbmFtZShwb3N0cHJvY2VzcywgInBvc3Rwcm9jZXNzIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrQDQuMC4yL25vZGVfbW9kdWxlcy9taWNyb21hcmsvbGliL3ByZXByb2Nlc3MuanMKdmFyIHNlYXJjaCA9IC9bXDBcdFxuXHJdL2c7CmZ1bmN0aW9uIHByZXByb2Nlc3MoKSB7CiAgbGV0IGNvbHVtbiA9IDE7CiAgbGV0IGJ1ZmZlcjIgPSAiIjsKICBsZXQgc3RhcnQgPSB0cnVlOwogIGxldCBhdENhcnJpYWdlUmV0dXJuOwogIHJldHVybiBwcmVwcm9jZXNzb3I7CiAgZnVuY3Rpb24gcHJlcHJvY2Vzc29yKHZhbHVlMiwgZW5jb2RpbmcsIGVuZCkgewogICAgY29uc3QgY2h1bmtzID0gW107CiAgICBsZXQgbWF0Y2gyOwogICAgbGV0IG5leHQyOwogICAgbGV0IHN0YXJ0UG9zaXRpb247CiAgICBsZXQgZW5kUG9zaXRpb247CiAgICBsZXQgY29kZTQ7CiAgICB2YWx1ZTIgPSBidWZmZXIyICsgKHR5cGVvZiB2YWx1ZTIgPT09ICJzdHJpbmciID8gdmFsdWUyLnRvU3RyaW5nKCkgOiBuZXcgVGV4dERlY29kZXIoZW5jb2RpbmcgfHwgdm9pZCAwKS5kZWNvZGUodmFsdWUyKSk7CiAgICBzdGFydFBvc2l0aW9uID0gMDsKICAgIGJ1ZmZlcjIgPSAiIjsKICAgIGlmIChzdGFydCkgewogICAgICBpZiAodmFsdWUyLmNoYXJDb2RlQXQoMCkgPT09IDY1Mjc5KSB7CiAgICAgICAgc3RhcnRQb3NpdGlvbisrOwogICAgICB9CiAgICAgIHN0YXJ0ID0gdm9pZCAwOwogICAgfQogICAgd2hpbGUgKHN0YXJ0UG9zaXRpb24gPCB2YWx1ZTIubGVuZ3RoKSB7CiAgICAgIHNlYXJjaC5sYXN0SW5kZXggPSBzdGFydFBvc2l0aW9uOwogICAgICBtYXRjaDIgPSBzZWFyY2guZXhlYyh2YWx1ZTIpOwogICAgICBlbmRQb3NpdGlvbiA9IG1hdGNoMiAmJiBtYXRjaDIuaW5kZXggIT09IHZvaWQgMCA/IG1hdGNoMi5pbmRleCA6IHZhbHVlMi5sZW5ndGg7CiAgICAgIGNvZGU0ID0gdmFsdWUyLmNoYXJDb2RlQXQoZW5kUG9zaXRpb24pOwogICAgICBpZiAoIW1hdGNoMikgewogICAgICAgIGJ1ZmZlcjIgPSB2YWx1ZTIuc2xpY2Uoc3RhcnRQb3NpdGlvbik7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKGNvZGU0ID09PSAxMCAmJiBzdGFydFBvc2l0aW9uID09PSBlbmRQb3NpdGlvbiAmJiBhdENhcnJpYWdlUmV0dXJuKSB7CiAgICAgICAgY2h1bmtzLnB1c2goLTMpOwogICAgICAgIGF0Q2FycmlhZ2VSZXR1cm4gPSB2b2lkIDA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGF0Q2FycmlhZ2VSZXR1cm4pIHsKICAgICAgICAgIGNodW5rcy5wdXNoKC01KTsKICAgICAgICAgIGF0Q2FycmlhZ2VSZXR1cm4gPSB2b2lkIDA7CiAgICAgICAgfQogICAgICAgIGlmIChzdGFydFBvc2l0aW9uIDwgZW5kUG9zaXRpb24pIHsKICAgICAgICAgIGNodW5rcy5wdXNoKHZhbHVlMi5zbGljZShzdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlvbikpOwogICAgICAgICAgY29sdW1uICs9IGVuZFBvc2l0aW9uIC0gc3RhcnRQb3NpdGlvbjsKICAgICAgICB9CiAgICAgICAgc3dpdGNoIChjb2RlNCkgewogICAgICAgICAgY2FzZSAwOiB7CiAgICAgICAgICAgIGNodW5rcy5wdXNoKDY1NTMzKTsKICAgICAgICAgICAgY29sdW1uKys7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSA5OiB7CiAgICAgICAgICAgIG5leHQyID0gTWF0aC5jZWlsKGNvbHVtbiAvIDQpICogNDsKICAgICAgICAgICAgY2h1bmtzLnB1c2goLTIpOwogICAgICAgICAgICB3aGlsZSAoY29sdW1uKysgPCBuZXh0MikgY2h1bmtzLnB1c2goLTEpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgMTA6IHsKICAgICAgICAgICAgY2h1bmtzLnB1c2goLTQpOwogICAgICAgICAgICBjb2x1bW4gPSAxOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGRlZmF1bHQ6IHsKICAgICAgICAgICAgYXRDYXJyaWFnZVJldHVybiA9IHRydWU7CiAgICAgICAgICAgIGNvbHVtbiA9IDE7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHN0YXJ0UG9zaXRpb24gPSBlbmRQb3NpdGlvbiArIDE7CiAgICB9CiAgICBpZiAoZW5kKSB7CiAgICAgIGlmIChhdENhcnJpYWdlUmV0dXJuKSBjaHVua3MucHVzaCgtNSk7CiAgICAgIGlmIChidWZmZXIyKSBjaHVua3MucHVzaChidWZmZXIyKTsKICAgICAgY2h1bmtzLnB1c2gobnVsbCk7CiAgICB9CiAgICByZXR1cm4gY2h1bmtzOwogIH0KICBfX25hbWUocHJlcHJvY2Vzc29yLCAicHJlcHJvY2Vzc29yIik7Cn0KX19uYW1lKHByZXByb2Nlc3MsICJwcmVwcm9jZXNzIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrQDQuMC4yL25vZGVfbW9kdWxlcy9taWNyb21hcmsvaW5kZXguanMKZnVuY3Rpb24gbWljcm9tYXJrKHZhbHVlMiwgZW5jb2RpbmcsIG9wdGlvbnMpIHsKICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAic3RyaW5nIikgewogICAgb3B0aW9ucyA9IGVuY29kaW5nOwogICAgZW5jb2RpbmcgPSB2b2lkIDA7CiAgfQogIHJldHVybiBjb21waWxlKG9wdGlvbnMpKHBvc3Rwcm9jZXNzKHBhcnNlNChvcHRpb25zKS5kb2N1bWVudCgpLndyaXRlKHByZXByb2Nlc3MoKSh2YWx1ZTIsIGVuY29kaW5nLCB0cnVlKSkpKTsKfQpfX25hbWUobWljcm9tYXJrLCAibWljcm9tYXJrIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC1mcm9tLW1hcmtkb3duQDIuMC4zL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLWZyb20tbWFya2Rvd24vbGliL2luZGV4LmpzCnZhciBvd241ID0ge30uaGFzT3duUHJvcGVydHk7CmZ1bmN0aW9uIGZyb21NYXJrZG93bih2YWx1ZTIsIGVuY29kaW5nLCBvcHRpb25zKSB7CiAgaWYgKGVuY29kaW5nICYmIHR5cGVvZiBlbmNvZGluZyA9PT0gIm9iamVjdCIpIHsKICAgIG9wdGlvbnMgPSBlbmNvZGluZzsKICAgIGVuY29kaW5nID0gdm9pZCAwOwogIH0KICByZXR1cm4gY29tcGlsZXIob3B0aW9ucykocG9zdHByb2Nlc3MocGFyc2U0KG9wdGlvbnMpLmRvY3VtZW50KCkud3JpdGUocHJlcHJvY2VzcygpKHZhbHVlMiwgZW5jb2RpbmcsIHRydWUpKSkpOwp9Cl9fbmFtZShmcm9tTWFya2Rvd24sICJmcm9tTWFya2Rvd24iKTsKZnVuY3Rpb24gY29tcGlsZXIob3B0aW9ucykgewogIGNvbnN0IGNvbmZpZzIgPSB7CiAgICB0cmFuc2Zvcm1zOiBbXSwKICAgIGNhbkNvbnRhaW5Fb2xzOiBbImVtcGhhc2lzIiwgImZyYWdtZW50IiwgImhlYWRpbmciLCAicGFyYWdyYXBoIiwgInN0cm9uZyJdLAogICAgZW50ZXI6IHsKICAgICAgYXV0b2xpbms6IG9wZW5lcjIobGluazMpLAogICAgICBhdXRvbGlua1Byb3RvY29sOiBvbmVudGVyZGF0YSwKICAgICAgYXV0b2xpbmtFbWFpbDogb25lbnRlcmRhdGEsCiAgICAgIGF0eEhlYWRpbmc6IG9wZW5lcjIoaGVhZGluZzMpLAogICAgICBibG9ja1F1b3RlOiBvcGVuZXIyKGJsb2NrUXVvdGUyKSwKICAgICAgY2hhcmFjdGVyRXNjYXBlOiBvbmVudGVyZGF0YSwKICAgICAgY2hhcmFjdGVyUmVmZXJlbmNlOiBvbmVudGVyZGF0YSwKICAgICAgY29kZUZlbmNlZDogb3BlbmVyMihjb2RlRmxvdyksCiAgICAgIGNvZGVGZW5jZWRGZW5jZUluZm86IGJ1ZmZlcjIsCiAgICAgIGNvZGVGZW5jZWRGZW5jZU1ldGE6IGJ1ZmZlcjIsCiAgICAgIGNvZGVJbmRlbnRlZDogb3BlbmVyMihjb2RlRmxvdywgYnVmZmVyMiksCiAgICAgIGNvZGVUZXh0OiBvcGVuZXIyKGNvZGVUZXh0MiwgYnVmZmVyMiksCiAgICAgIGNvZGVUZXh0RGF0YTogb25lbnRlcmRhdGEsCiAgICAgIGRhdGE6IG9uZW50ZXJkYXRhLAogICAgICBjb2RlRmxvd1ZhbHVlOiBvbmVudGVyZGF0YSwKICAgICAgZGVmaW5pdGlvbjogb3BlbmVyMihkZWZpbml0aW9uMyksCiAgICAgIGRlZmluaXRpb25EZXN0aW5hdGlvblN0cmluZzogYnVmZmVyMiwKICAgICAgZGVmaW5pdGlvbkxhYmVsU3RyaW5nOiBidWZmZXIyLAogICAgICBkZWZpbml0aW9uVGl0bGVTdHJpbmc6IGJ1ZmZlcjIsCiAgICAgIGVtcGhhc2lzOiBvcGVuZXIyKGVtcGhhc2lzMyksCiAgICAgIGhhcmRCcmVha0VzY2FwZTogb3BlbmVyMihoYXJkQnJlYWszKSwKICAgICAgaGFyZEJyZWFrVHJhaWxpbmc6IG9wZW5lcjIoaGFyZEJyZWFrMyksCiAgICAgIGh0bWxGbG93OiBvcGVuZXIyKGh0bWw3LCBidWZmZXIyKSwKICAgICAgaHRtbEZsb3dEYXRhOiBvbmVudGVyZGF0YSwKICAgICAgaHRtbFRleHQ6IG9wZW5lcjIoaHRtbDcsIGJ1ZmZlcjIpLAogICAgICBodG1sVGV4dERhdGE6IG9uZW50ZXJkYXRhLAogICAgICBpbWFnZTogb3BlbmVyMihpbWFnZTMpLAogICAgICBsYWJlbDogYnVmZmVyMiwKICAgICAgbGluazogb3BlbmVyMihsaW5rMyksCiAgICAgIGxpc3RJdGVtOiBvcGVuZXIyKGxpc3RJdGVtMyksCiAgICAgIGxpc3RJdGVtVmFsdWU6IG9uZW50ZXJsaXN0aXRlbXZhbHVlLAogICAgICBsaXN0T3JkZXJlZDogb3BlbmVyMihsaXN0NSwgb25lbnRlcmxpc3RvcmRlcmVkKSwKICAgICAgbGlzdFVub3JkZXJlZDogb3BlbmVyMihsaXN0NSksCiAgICAgIHBhcmFncmFwaDogb3BlbmVyMihwYXJhZ3JhcGgzKSwKICAgICAgcmVmZXJlbmNlOiBvbmVudGVycmVmZXJlbmNlLAogICAgICByZWZlcmVuY2VTdHJpbmc6IGJ1ZmZlcjIsCiAgICAgIHJlc291cmNlRGVzdGluYXRpb25TdHJpbmc6IGJ1ZmZlcjIsCiAgICAgIHJlc291cmNlVGl0bGVTdHJpbmc6IGJ1ZmZlcjIsCiAgICAgIHNldGV4dEhlYWRpbmc6IG9wZW5lcjIoaGVhZGluZzMpLAogICAgICBzdHJvbmc6IG9wZW5lcjIoc3Ryb25nMyksCiAgICAgIHRoZW1hdGljQnJlYWs6IG9wZW5lcjIodGhlbWF0aWNCcmVhazQpCiAgICB9LAogICAgZXhpdDogewogICAgICBhdHhIZWFkaW5nOiBjbG9zZXIoKSwKICAgICAgYXR4SGVhZGluZ1NlcXVlbmNlOiBvbmV4aXRhdHhoZWFkaW5nc2VxdWVuY2UsCiAgICAgIGF1dG9saW5rOiBjbG9zZXIoKSwKICAgICAgYXV0b2xpbmtFbWFpbDogb25leGl0YXV0b2xpbmtlbWFpbCwKICAgICAgYXV0b2xpbmtQcm90b2NvbDogb25leGl0YXV0b2xpbmtwcm90b2NvbCwKICAgICAgYmxvY2tRdW90ZTogY2xvc2VyKCksCiAgICAgIGNoYXJhY3RlckVzY2FwZVZhbHVlOiBvbmV4aXRkYXRhLAogICAgICBjaGFyYWN0ZXJSZWZlcmVuY2VNYXJrZXJIZXhhZGVjaW1hbDogb25leGl0Y2hhcmFjdGVycmVmZXJlbmNlbWFya2VyLAogICAgICBjaGFyYWN0ZXJSZWZlcmVuY2VNYXJrZXJOdW1lcmljOiBvbmV4aXRjaGFyYWN0ZXJyZWZlcmVuY2VtYXJrZXIsCiAgICAgIGNoYXJhY3RlclJlZmVyZW5jZVZhbHVlOiBvbmV4aXRjaGFyYWN0ZXJyZWZlcmVuY2V2YWx1ZSwKICAgICAgY2hhcmFjdGVyUmVmZXJlbmNlOiBvbmV4aXRjaGFyYWN0ZXJyZWZlcmVuY2UsCiAgICAgIGNvZGVGZW5jZWQ6IGNsb3NlcihvbmV4aXRjb2RlZmVuY2VkKSwKICAgICAgY29kZUZlbmNlZEZlbmNlOiBvbmV4aXRjb2RlZmVuY2VkZmVuY2UsCiAgICAgIGNvZGVGZW5jZWRGZW5jZUluZm86IG9uZXhpdGNvZGVmZW5jZWRmZW5jZWluZm8sCiAgICAgIGNvZGVGZW5jZWRGZW5jZU1ldGE6IG9uZXhpdGNvZGVmZW5jZWRmZW5jZW1ldGEsCiAgICAgIGNvZGVGbG93VmFsdWU6IG9uZXhpdGRhdGEsCiAgICAgIGNvZGVJbmRlbnRlZDogY2xvc2VyKG9uZXhpdGNvZGVpbmRlbnRlZCksCiAgICAgIGNvZGVUZXh0OiBjbG9zZXIob25leGl0Y29kZXRleHQpLAogICAgICBjb2RlVGV4dERhdGE6IG9uZXhpdGRhdGEsCiAgICAgIGRhdGE6IG9uZXhpdGRhdGEsCiAgICAgIGRlZmluaXRpb246IGNsb3NlcigpLAogICAgICBkZWZpbml0aW9uRGVzdGluYXRpb25TdHJpbmc6IG9uZXhpdGRlZmluaXRpb25kZXN0aW5hdGlvbnN0cmluZywKICAgICAgZGVmaW5pdGlvbkxhYmVsU3RyaW5nOiBvbmV4aXRkZWZpbml0aW9ubGFiZWxzdHJpbmcsCiAgICAgIGRlZmluaXRpb25UaXRsZVN0cmluZzogb25leGl0ZGVmaW5pdGlvbnRpdGxlc3RyaW5nLAogICAgICBlbXBoYXNpczogY2xvc2VyKCksCiAgICAgIGhhcmRCcmVha0VzY2FwZTogY2xvc2VyKG9uZXhpdGhhcmRicmVhayksCiAgICAgIGhhcmRCcmVha1RyYWlsaW5nOiBjbG9zZXIob25leGl0aGFyZGJyZWFrKSwKICAgICAgaHRtbEZsb3c6IGNsb3NlcihvbmV4aXRodG1sZmxvdyksCiAgICAgIGh0bWxGbG93RGF0YTogb25leGl0ZGF0YSwKICAgICAgaHRtbFRleHQ6IGNsb3NlcihvbmV4aXRodG1sdGV4dCksCiAgICAgIGh0bWxUZXh0RGF0YTogb25leGl0ZGF0YSwKICAgICAgaW1hZ2U6IGNsb3NlcihvbmV4aXRpbWFnZSksCiAgICAgIGxhYmVsOiBvbmV4aXRsYWJlbCwKICAgICAgbGFiZWxUZXh0OiBvbmV4aXRsYWJlbHRleHQsCiAgICAgIGxpbmVFbmRpbmc6IG9uZXhpdGxpbmVlbmRpbmcsCiAgICAgIGxpbms6IGNsb3NlcihvbmV4aXRsaW5rKSwKICAgICAgbGlzdEl0ZW06IGNsb3NlcigpLAogICAgICBsaXN0T3JkZXJlZDogY2xvc2VyKCksCiAgICAgIGxpc3RVbm9yZGVyZWQ6IGNsb3NlcigpLAogICAgICBwYXJhZ3JhcGg6IGNsb3NlcigpLAogICAgICByZWZlcmVuY2VTdHJpbmc6IG9uZXhpdHJlZmVyZW5jZXN0cmluZywKICAgICAgcmVzb3VyY2VEZXN0aW5hdGlvblN0cmluZzogb25leGl0cmVzb3VyY2VkZXN0aW5hdGlvbnN0cmluZywKICAgICAgcmVzb3VyY2VUaXRsZVN0cmluZzogb25leGl0cmVzb3VyY2V0aXRsZXN0cmluZywKICAgICAgcmVzb3VyY2U6IG9uZXhpdHJlc291cmNlLAogICAgICBzZXRleHRIZWFkaW5nOiBjbG9zZXIob25leGl0c2V0ZXh0aGVhZGluZyksCiAgICAgIHNldGV4dEhlYWRpbmdMaW5lU2VxdWVuY2U6IG9uZXhpdHNldGV4dGhlYWRpbmdsaW5lc2VxdWVuY2UsCiAgICAgIHNldGV4dEhlYWRpbmdUZXh0OiBvbmV4aXRzZXRleHRoZWFkaW5ndGV4dCwKICAgICAgc3Ryb25nOiBjbG9zZXIoKSwKICAgICAgdGhlbWF0aWNCcmVhazogY2xvc2VyKCkKICAgIH0KICB9OwogIGNvbmZpZ3VyZTIoY29uZmlnMiwgKG9wdGlvbnMgfHwge30pLm1kYXN0RXh0ZW5zaW9ucyB8fCBbXSk7CiAgY29uc3QgZGF0YSA9IHt9OwogIHJldHVybiBjb21waWxlMjsKICBmdW5jdGlvbiBjb21waWxlMihldmVudHMpIHsKICAgIGxldCB0cmVlID0gewogICAgICB0eXBlOiAicm9vdCIsCiAgICAgIGNoaWxkcmVuOiBbXQogICAgfTsKICAgIGNvbnN0IGNvbnRleHQyID0gewogICAgICBzdGFjazogW3RyZWVdLAogICAgICB0b2tlblN0YWNrOiBbXSwKICAgICAgY29uZmlnOiBjb25maWcyLAogICAgICBlbnRlciwKICAgICAgZXhpdDogZXhpdDMsCiAgICAgIGJ1ZmZlcjogYnVmZmVyMiwKICAgICAgcmVzdW1lLAogICAgICBkYXRhCiAgICB9OwogICAgY29uc3QgbGlzdFN0YWNrID0gW107CiAgICBsZXQgaW5kZXgyID0gLTE7CiAgICB3aGlsZSAoKytpbmRleDIgPCBldmVudHMubGVuZ3RoKSB7CiAgICAgIGlmIChldmVudHNbaW5kZXgyXVsxXS50eXBlID09PSAibGlzdE9yZGVyZWQiIHx8IGV2ZW50c1tpbmRleDJdWzFdLnR5cGUgPT09ICJsaXN0VW5vcmRlcmVkIikgewogICAgICAgIGlmIChldmVudHNbaW5kZXgyXVswXSA9PT0gImVudGVyIikgewogICAgICAgICAgbGlzdFN0YWNrLnB1c2goaW5kZXgyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3QgdGFpbCA9IGxpc3RTdGFjay5wb3AoKTsKICAgICAgICAgIGluZGV4MiA9IHByZXBhcmVMaXN0KGV2ZW50cywgdGFpbCwgaW5kZXgyKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGluZGV4MiA9IC0xOwogICAgd2hpbGUgKCsraW5kZXgyIDwgZXZlbnRzLmxlbmd0aCkgewogICAgICBjb25zdCBoYW5kbGVyMiA9IGNvbmZpZzJbZXZlbnRzW2luZGV4Ml1bMF1dOwogICAgICBpZiAob3duNS5jYWxsKGhhbmRsZXIyLCBldmVudHNbaW5kZXgyXVsxXS50eXBlKSkgewogICAgICAgIGhhbmRsZXIyW2V2ZW50c1tpbmRleDJdWzFdLnR5cGVdLmNhbGwoT2JqZWN0LmFzc2lnbih7CiAgICAgICAgICBzbGljZVNlcmlhbGl6ZTogZXZlbnRzW2luZGV4Ml1bMl0uc2xpY2VTZXJpYWxpemUKICAgICAgICB9LCBjb250ZXh0MiksIGV2ZW50c1tpbmRleDJdWzFdKTsKICAgICAgfQogICAgfQogICAgaWYgKGNvbnRleHQyLnRva2VuU3RhY2subGVuZ3RoID4gMCkgewogICAgICBjb25zdCB0YWlsID0gY29udGV4dDIudG9rZW5TdGFja1tjb250ZXh0Mi50b2tlblN0YWNrLmxlbmd0aCAtIDFdOwogICAgICBjb25zdCBoYW5kbGVyMiA9IHRhaWxbMV0gfHwgZGVmYXVsdE9uRXJyb3I7CiAgICAgIGhhbmRsZXIyLmNhbGwoY29udGV4dDIsIHZvaWQgMCwgdGFpbFswXSk7CiAgICB9CiAgICB0cmVlLnBvc2l0aW9uID0gewogICAgICBzdGFydDogcG9pbnQyKGV2ZW50cy5sZW5ndGggPiAwID8gZXZlbnRzWzBdWzFdLnN0YXJ0IDogewogICAgICAgIGxpbmU6IDEsCiAgICAgICAgY29sdW1uOiAxLAogICAgICAgIG9mZnNldDogMAogICAgICB9KSwKICAgICAgZW5kOiBwb2ludDIoZXZlbnRzLmxlbmd0aCA+IDAgPyBldmVudHNbZXZlbnRzLmxlbmd0aCAtIDJdWzFdLmVuZCA6IHsKICAgICAgICBsaW5lOiAxLAogICAgICAgIGNvbHVtbjogMSwKICAgICAgICBvZmZzZXQ6IDAKICAgICAgfSkKICAgIH07CiAgICBpbmRleDIgPSAtMTsKICAgIHdoaWxlICgrK2luZGV4MiA8IGNvbmZpZzIudHJhbnNmb3Jtcy5sZW5ndGgpIHsKICAgICAgdHJlZSA9IGNvbmZpZzIudHJhbnNmb3Jtc1tpbmRleDJdKHRyZWUpIHx8IHRyZWU7CiAgICB9CiAgICByZXR1cm4gdHJlZTsKICB9CiAgX19uYW1lKGNvbXBpbGUyLCAiY29tcGlsZSIpOwogIGZ1bmN0aW9uIHByZXBhcmVMaXN0KGV2ZW50cywgc3RhcnQsIGxlbmd0aCkgewogICAgbGV0IGluZGV4MiA9IHN0YXJ0IC0gMTsKICAgIGxldCBjb250YWluZXJCYWxhbmNlID0gLTE7CiAgICBsZXQgbGlzdFNwcmVhZCA9IGZhbHNlOwogICAgbGV0IGxpc3RJdGVtNDsKICAgIGxldCBsaW5lSW5kZXg7CiAgICBsZXQgZmlyc3RCbGFua0xpbmVJbmRleDsKICAgIGxldCBhdE1hcmtlcjsKICAgIHdoaWxlICgrK2luZGV4MiA8PSBsZW5ndGgpIHsKICAgICAgY29uc3QgZXZlbnQgPSBldmVudHNbaW5kZXgyXTsKICAgICAgc3dpdGNoIChldmVudFsxXS50eXBlKSB7CiAgICAgICAgY2FzZSAibGlzdFVub3JkZXJlZCI6CiAgICAgICAgY2FzZSAibGlzdE9yZGVyZWQiOgogICAgICAgIGNhc2UgImJsb2NrUXVvdGUiOiB7CiAgICAgICAgICBpZiAoZXZlbnRbMF0gPT09ICJlbnRlciIpIHsKICAgICAgICAgICAgY29udGFpbmVyQmFsYW5jZSsrOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29udGFpbmVyQmFsYW5jZS0tOwogICAgICAgICAgfQogICAgICAgICAgYXRNYXJrZXIgPSB2b2lkIDA7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY2FzZSAibGluZUVuZGluZ0JsYW5rIjogewogICAgICAgICAgaWYgKGV2ZW50WzBdID09PSAiZW50ZXIiKSB7CiAgICAgICAgICAgIGlmIChsaXN0SXRlbTQgJiYgIWF0TWFya2VyICYmICFjb250YWluZXJCYWxhbmNlICYmICFmaXJzdEJsYW5rTGluZUluZGV4KSB7CiAgICAgICAgICAgICAgZmlyc3RCbGFua0xpbmVJbmRleCA9IGluZGV4MjsKICAgICAgICAgICAgfQogICAgICAgICAgICBhdE1hcmtlciA9IHZvaWQgMDsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjYXNlICJsaW5lUHJlZml4IjoKICAgICAgICBjYXNlICJsaXN0SXRlbVZhbHVlIjoKICAgICAgICBjYXNlICJsaXN0SXRlbU1hcmtlciI6CiAgICAgICAgY2FzZSAibGlzdEl0ZW1QcmVmaXgiOgogICAgICAgIGNhc2UgImxpc3RJdGVtUHJlZml4V2hpdGVzcGFjZSI6IHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBkZWZhdWx0OiB7CiAgICAgICAgICBhdE1hcmtlciA9IHZvaWQgMDsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCFjb250YWluZXJCYWxhbmNlICYmIGV2ZW50WzBdID09PSAiZW50ZXIiICYmIGV2ZW50WzFdLnR5cGUgPT09ICJsaXN0SXRlbVByZWZpeCIgfHwgY29udGFpbmVyQmFsYW5jZSA9PT0gLTEgJiYgZXZlbnRbMF0gPT09ICJleGl0IiAmJiAoZXZlbnRbMV0udHlwZSA9PT0gImxpc3RVbm9yZGVyZWQiIHx8IGV2ZW50WzFdLnR5cGUgPT09ICJsaXN0T3JkZXJlZCIpKSB7CiAgICAgICAgaWYgKGxpc3RJdGVtNCkgewogICAgICAgICAgbGV0IHRhaWxJbmRleCA9IGluZGV4MjsKICAgICAgICAgIGxpbmVJbmRleCA9IHZvaWQgMDsKICAgICAgICAgIHdoaWxlICh0YWlsSW5kZXgtLSkgewogICAgICAgICAgICBjb25zdCB0YWlsRXZlbnQgPSBldmVudHNbdGFpbEluZGV4XTsKICAgICAgICAgICAgaWYgKHRhaWxFdmVudFsxXS50eXBlID09PSAibGluZUVuZGluZyIgfHwgdGFpbEV2ZW50WzFdLnR5cGUgPT09ICJsaW5lRW5kaW5nQmxhbmsiKSB7CiAgICAgICAgICAgICAgaWYgKHRhaWxFdmVudFswXSA9PT0gImV4aXQiKSBjb250aW51ZTsKICAgICAgICAgICAgICBpZiAobGluZUluZGV4KSB7CiAgICAgICAgICAgICAgICBldmVudHNbbGluZUluZGV4XVsxXS50eXBlID0gImxpbmVFbmRpbmdCbGFuayI7CiAgICAgICAgICAgICAgICBsaXN0U3ByZWFkID0gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdGFpbEV2ZW50WzFdLnR5cGUgPSAibGluZUVuZGluZyI7CiAgICAgICAgICAgICAgbGluZUluZGV4ID0gdGFpbEluZGV4OwogICAgICAgICAgICB9IGVsc2UgaWYgKHRhaWxFdmVudFsxXS50eXBlID09PSAibGluZVByZWZpeCIgfHwgdGFpbEV2ZW50WzFdLnR5cGUgPT09ICJibG9ja1F1b3RlUHJlZml4IiB8fCB0YWlsRXZlbnRbMV0udHlwZSA9PT0gImJsb2NrUXVvdGVQcmVmaXhXaGl0ZXNwYWNlIiB8fCB0YWlsRXZlbnRbMV0udHlwZSA9PT0gImJsb2NrUXVvdGVNYXJrZXIiIHx8IHRhaWxFdmVudFsxXS50eXBlID09PSAibGlzdEl0ZW1JbmRlbnQiKSB7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChmaXJzdEJsYW5rTGluZUluZGV4ICYmICghbGluZUluZGV4IHx8IGZpcnN0QmxhbmtMaW5lSW5kZXggPCBsaW5lSW5kZXgpKSB7CiAgICAgICAgICAgIGxpc3RJdGVtNC5fc3ByZWFkID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGxpc3RJdGVtNC5lbmQgPSBPYmplY3QuYXNzaWduKHt9LCBsaW5lSW5kZXggPyBldmVudHNbbGluZUluZGV4XVsxXS5zdGFydCA6IGV2ZW50WzFdLmVuZCk7CiAgICAgICAgICBldmVudHMuc3BsaWNlKGxpbmVJbmRleCB8fCBpbmRleDIsIDAsIFsiZXhpdCIsIGxpc3RJdGVtNCwgZXZlbnRbMl1dKTsKICAgICAgICAgIGluZGV4MisrOwogICAgICAgICAgbGVuZ3RoKys7CiAgICAgICAgfQogICAgICAgIGlmIChldmVudFsxXS50eXBlID09PSAibGlzdEl0ZW1QcmVmaXgiKSB7CiAgICAgICAgICBjb25zdCBpdGVtID0gewogICAgICAgICAgICB0eXBlOiAibGlzdEl0ZW0iLAogICAgICAgICAgICBfc3ByZWFkOiBmYWxzZSwKICAgICAgICAgICAgc3RhcnQ6IE9iamVjdC5hc3NpZ24oe30sIGV2ZW50WzFdLnN0YXJ0KSwKICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogd2XigJlsbCBhZGQgYGVuZGAgaW4gYSBzZWNvbmQuCiAgICAgICAgICAgIGVuZDogdm9pZCAwCiAgICAgICAgICB9OwogICAgICAgICAgbGlzdEl0ZW00ID0gaXRlbTsKICAgICAgICAgIGV2ZW50cy5zcGxpY2UoaW5kZXgyLCAwLCBbImVudGVyIiwgaXRlbSwgZXZlbnRbMl1dKTsKICAgICAgICAgIGluZGV4MisrOwogICAgICAgICAgbGVuZ3RoKys7CiAgICAgICAgICBmaXJzdEJsYW5rTGluZUluZGV4ID0gdm9pZCAwOwogICAgICAgICAgYXRNYXJrZXIgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZXZlbnRzW3N0YXJ0XVsxXS5fc3ByZWFkID0gbGlzdFNwcmVhZDsKICAgIHJldHVybiBsZW5ndGg7CiAgfQogIF9fbmFtZShwcmVwYXJlTGlzdCwgInByZXBhcmVMaXN0Iik7CiAgZnVuY3Rpb24gb3BlbmVyMihjcmVhdGU3LCBhbmQpIHsKICAgIHJldHVybiBvcGVuOwogICAgZnVuY3Rpb24gb3Blbih0b2tlbikgewogICAgICBlbnRlci5jYWxsKHRoaXMsIGNyZWF0ZTcodG9rZW4pLCB0b2tlbik7CiAgICAgIGlmIChhbmQpIGFuZC5jYWxsKHRoaXMsIHRva2VuKTsKICAgIH0KICAgIF9fbmFtZShvcGVuLCAib3BlbiIpOwogIH0KICBfX25hbWUob3BlbmVyMiwgIm9wZW5lciIpOwogIGZ1bmN0aW9uIGJ1ZmZlcjIoKSB7CiAgICB0aGlzLnN0YWNrLnB1c2goewogICAgICB0eXBlOiAiZnJhZ21lbnQiLAogICAgICBjaGlsZHJlbjogW10KICAgIH0pOwogIH0KICBfX25hbWUoYnVmZmVyMiwgImJ1ZmZlciIpOwogIGZ1bmN0aW9uIGVudGVyKG5vZGUyLCB0b2tlbiwgZXJyb3JIYW5kbGVyKSB7CiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgICBjb25zdCBzaWJsaW5nczIgPSBwYXJlbnQuY2hpbGRyZW47CiAgICBzaWJsaW5nczIucHVzaChub2RlMik7CiAgICB0aGlzLnN0YWNrLnB1c2gobm9kZTIpOwogICAgdGhpcy50b2tlblN0YWNrLnB1c2goW3Rva2VuLCBlcnJvckhhbmRsZXIgfHwgdm9pZCAwXSk7CiAgICBub2RlMi5wb3NpdGlvbiA9IHsKICAgICAgc3RhcnQ6IHBvaW50Mih0b2tlbi5zdGFydCksCiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IGBlbmRgIHdpbGwgYmUgcGF0Y2hlZCBsYXRlci4KICAgICAgZW5kOiB2b2lkIDAKICAgIH07CiAgfQogIF9fbmFtZShlbnRlciwgImVudGVyIik7CiAgZnVuY3Rpb24gY2xvc2VyKGFuZCkgewogICAgcmV0dXJuIGNsb3NlNzsKICAgIGZ1bmN0aW9uIGNsb3NlNyh0b2tlbikgewogICAgICBpZiAoYW5kKSBhbmQuY2FsbCh0aGlzLCB0b2tlbik7CiAgICAgIGV4aXQzLmNhbGwodGhpcywgdG9rZW4pOwogICAgfQogICAgX19uYW1lKGNsb3NlNywgImNsb3NlIik7CiAgfQogIF9fbmFtZShjbG9zZXIsICJjbG9zZXIiKTsKICBmdW5jdGlvbiBleGl0Myh0b2tlbiwgb25FeGl0RXJyb3IpIHsKICAgIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFjay5wb3AoKTsKICAgIGNvbnN0IG9wZW4gPSB0aGlzLnRva2VuU3RhY2sucG9wKCk7CiAgICBpZiAoIW9wZW4pIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgY2xvc2UgYCIgKyB0b2tlbi50eXBlICsgImAgKCIgKyBzdHJpbmdpZnlQb3NpdGlvbih7CiAgICAgICAgc3RhcnQ6IHRva2VuLnN0YXJ0LAogICAgICAgIGVuZDogdG9rZW4uZW5kCiAgICAgIH0pICsgIik6IGl0XHUyMDE5cyBub3Qgb3BlbiIpOwogICAgfSBlbHNlIGlmIChvcGVuWzBdLnR5cGUgIT09IHRva2VuLnR5cGUpIHsKICAgICAgaWYgKG9uRXhpdEVycm9yKSB7CiAgICAgICAgb25FeGl0RXJyb3IuY2FsbCh0aGlzLCB0b2tlbiwgb3BlblswXSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgaGFuZGxlcjIgPSBvcGVuWzFdIHx8IGRlZmF1bHRPbkVycm9yOwogICAgICAgIGhhbmRsZXIyLmNhbGwodGhpcywgdG9rZW4sIG9wZW5bMF0pOwogICAgICB9CiAgICB9CiAgICBub2RlMi5wb3NpdGlvbi5lbmQgPSBwb2ludDIodG9rZW4uZW5kKTsKICB9CiAgX19uYW1lKGV4aXQzLCAiZXhpdCIpOwogIGZ1bmN0aW9uIHJlc3VtZSgpIHsKICAgIHJldHVybiB0b1N0cmluZyh0aGlzLnN0YWNrLnBvcCgpKTsKICB9CiAgX19uYW1lKHJlc3VtZSwgInJlc3VtZSIpOwogIGZ1bmN0aW9uIG9uZW50ZXJsaXN0b3JkZXJlZCgpIHsKICAgIHRoaXMuZGF0YS5leHBlY3RpbmdGaXJzdExpc3RJdGVtVmFsdWUgPSB0cnVlOwogIH0KICBfX25hbWUob25lbnRlcmxpc3RvcmRlcmVkLCAib25lbnRlcmxpc3RvcmRlcmVkIik7CiAgZnVuY3Rpb24gb25lbnRlcmxpc3RpdGVtdmFsdWUodG9rZW4pIHsKICAgIGlmICh0aGlzLmRhdGEuZXhwZWN0aW5nRmlyc3RMaXN0SXRlbVZhbHVlKSB7CiAgICAgIGNvbnN0IGFuY2VzdG9yID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDJdOwogICAgICBhbmNlc3Rvci5zdGFydCA9IE51bWJlci5wYXJzZUludCh0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKSwgMTApOwogICAgICB0aGlzLmRhdGEuZXhwZWN0aW5nRmlyc3RMaXN0SXRlbVZhbHVlID0gdm9pZCAwOwogICAgfQogIH0KICBfX25hbWUob25lbnRlcmxpc3RpdGVtdmFsdWUsICJvbmVudGVybGlzdGl0ZW12YWx1ZSIpOwogIGZ1bmN0aW9uIG9uZXhpdGNvZGVmZW5jZWRmZW5jZWluZm8oKSB7CiAgICBjb25zdCBkYXRhMiA9IHRoaXMucmVzdW1lKCk7CiAgICBjb25zdCBub2RlMiA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTsKICAgIG5vZGUyLmxhbmcgPSBkYXRhMjsKICB9CiAgX19uYW1lKG9uZXhpdGNvZGVmZW5jZWRmZW5jZWluZm8sICJvbmV4aXRjb2RlZmVuY2VkZmVuY2VpbmZvIik7CiAgZnVuY3Rpb24gb25leGl0Y29kZWZlbmNlZGZlbmNlbWV0YSgpIHsKICAgIGNvbnN0IGRhdGEyID0gdGhpcy5yZXN1bWUoKTsKICAgIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogICAgbm9kZTIubWV0YSA9IGRhdGEyOwogIH0KICBfX25hbWUob25leGl0Y29kZWZlbmNlZGZlbmNlbWV0YSwgIm9uZXhpdGNvZGVmZW5jZWRmZW5jZW1ldGEiKTsKICBmdW5jdGlvbiBvbmV4aXRjb2RlZmVuY2VkZmVuY2UoKSB7CiAgICBpZiAodGhpcy5kYXRhLmZsb3dDb2RlSW5zaWRlKSByZXR1cm47CiAgICB0aGlzLmJ1ZmZlcigpOwogICAgdGhpcy5kYXRhLmZsb3dDb2RlSW5zaWRlID0gdHJ1ZTsKICB9CiAgX19uYW1lKG9uZXhpdGNvZGVmZW5jZWRmZW5jZSwgIm9uZXhpdGNvZGVmZW5jZWRmZW5jZSIpOwogIGZ1bmN0aW9uIG9uZXhpdGNvZGVmZW5jZWQoKSB7CiAgICBjb25zdCBkYXRhMiA9IHRoaXMucmVzdW1lKCk7CiAgICBjb25zdCBub2RlMiA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTsKICAgIG5vZGUyLnZhbHVlID0gZGF0YTIucmVwbGFjZSgvXihccj9cbnxccil8KFxyP1xufFxyKSQvZywgIiIpOwogICAgdGhpcy5kYXRhLmZsb3dDb2RlSW5zaWRlID0gdm9pZCAwOwogIH0KICBfX25hbWUob25leGl0Y29kZWZlbmNlZCwgIm9uZXhpdGNvZGVmZW5jZWQiKTsKICBmdW5jdGlvbiBvbmV4aXRjb2RlaW5kZW50ZWQoKSB7CiAgICBjb25zdCBkYXRhMiA9IHRoaXMucmVzdW1lKCk7CiAgICBjb25zdCBub2RlMiA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTsKICAgIG5vZGUyLnZhbHVlID0gZGF0YTIucmVwbGFjZSgvKFxyP1xufFxyKSQvZywgIiIpOwogIH0KICBfX25hbWUob25leGl0Y29kZWluZGVudGVkLCAib25leGl0Y29kZWluZGVudGVkIik7CiAgZnVuY3Rpb24gb25leGl0ZGVmaW5pdGlvbmxhYmVsc3RyaW5nKHRva2VuKSB7CiAgICBjb25zdCBsYWJlbCA9IHRoaXMucmVzdW1lKCk7CiAgICBjb25zdCBub2RlMiA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTsKICAgIG5vZGUyLmxhYmVsID0gbGFiZWw7CiAgICBub2RlMi5pZGVudGlmaWVyID0gbm9ybWFsaXplSWRlbnRpZmllcih0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKSkudG9Mb3dlckNhc2UoKTsKICB9CiAgX19uYW1lKG9uZXhpdGRlZmluaXRpb25sYWJlbHN0cmluZywgIm9uZXhpdGRlZmluaXRpb25sYWJlbHN0cmluZyIpOwogIGZ1bmN0aW9uIG9uZXhpdGRlZmluaXRpb250aXRsZXN0cmluZygpIHsKICAgIGNvbnN0IGRhdGEyID0gdGhpcy5yZXN1bWUoKTsKICAgIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogICAgbm9kZTIudGl0bGUgPSBkYXRhMjsKICB9CiAgX19uYW1lKG9uZXhpdGRlZmluaXRpb250aXRsZXN0cmluZywgIm9uZXhpdGRlZmluaXRpb250aXRsZXN0cmluZyIpOwogIGZ1bmN0aW9uIG9uZXhpdGRlZmluaXRpb25kZXN0aW5hdGlvbnN0cmluZygpIHsKICAgIGNvbnN0IGRhdGEyID0gdGhpcy5yZXN1bWUoKTsKICAgIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogICAgbm9kZTIudXJsID0gZGF0YTI7CiAgfQogIF9fbmFtZShvbmV4aXRkZWZpbml0aW9uZGVzdGluYXRpb25zdHJpbmcsICJvbmV4aXRkZWZpbml0aW9uZGVzdGluYXRpb25zdHJpbmciKTsKICBmdW5jdGlvbiBvbmV4aXRhdHhoZWFkaW5nc2VxdWVuY2UodG9rZW4pIHsKICAgIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogICAgaWYgKCFub2RlMi5kZXB0aCkgewogICAgICBjb25zdCBkZXB0aCA9IHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pLmxlbmd0aDsKICAgICAgbm9kZTIuZGVwdGggPSBkZXB0aDsKICAgIH0KICB9CiAgX19uYW1lKG9uZXhpdGF0eGhlYWRpbmdzZXF1ZW5jZSwgIm9uZXhpdGF0eGhlYWRpbmdzZXF1ZW5jZSIpOwogIGZ1bmN0aW9uIG9uZXhpdHNldGV4dGhlYWRpbmd0ZXh0KCkgewogICAgdGhpcy5kYXRhLnNldGV4dEhlYWRpbmdTbHVycExpbmVFbmRpbmcgPSB0cnVlOwogIH0KICBfX25hbWUob25leGl0c2V0ZXh0aGVhZGluZ3RleHQsICJvbmV4aXRzZXRleHRoZWFkaW5ndGV4dCIpOwogIGZ1bmN0aW9uIG9uZXhpdHNldGV4dGhlYWRpbmdsaW5lc2VxdWVuY2UodG9rZW4pIHsKICAgIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogICAgbm9kZTIuZGVwdGggPSB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKS5jb2RlUG9pbnRBdCgwKSA9PT0gNjEgPyAxIDogMjsKICB9CiAgX19uYW1lKG9uZXhpdHNldGV4dGhlYWRpbmdsaW5lc2VxdWVuY2UsICJvbmV4aXRzZXRleHRoZWFkaW5nbGluZXNlcXVlbmNlIik7CiAgZnVuY3Rpb24gb25leGl0c2V0ZXh0aGVhZGluZygpIHsKICAgIHRoaXMuZGF0YS5zZXRleHRIZWFkaW5nU2x1cnBMaW5lRW5kaW5nID0gdm9pZCAwOwogIH0KICBfX25hbWUob25leGl0c2V0ZXh0aGVhZGluZywgIm9uZXhpdHNldGV4dGhlYWRpbmciKTsKICBmdW5jdGlvbiBvbmVudGVyZGF0YSh0b2tlbikgewogICAgY29uc3Qgbm9kZTIgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgICBjb25zdCBzaWJsaW5nczIgPSBub2RlMi5jaGlsZHJlbjsKICAgIGxldCB0YWlsID0gc2libGluZ3MyW3NpYmxpbmdzMi5sZW5ndGggLSAxXTsKICAgIGlmICghdGFpbCB8fCB0YWlsLnR5cGUgIT09ICJ0ZXh0IikgewogICAgICB0YWlsID0gdGV4dDgoKTsKICAgICAgdGFpbC5wb3NpdGlvbiA9IHsKICAgICAgICBzdGFydDogcG9pbnQyKHRva2VuLnN0YXJ0KSwKICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiB3ZeKAmWxsIGFkZCBgZW5kYCBsYXRlci4KICAgICAgICBlbmQ6IHZvaWQgMAogICAgICB9OwogICAgICBzaWJsaW5nczIucHVzaCh0YWlsKTsKICAgIH0KICAgIHRoaXMuc3RhY2sucHVzaCh0YWlsKTsKICB9CiAgX19uYW1lKG9uZW50ZXJkYXRhLCAib25lbnRlcmRhdGEiKTsKICBmdW5jdGlvbiBvbmV4aXRkYXRhKHRva2VuKSB7CiAgICBjb25zdCB0YWlsID0gdGhpcy5zdGFjay5wb3AoKTsKICAgIHRhaWwudmFsdWUgKz0gdGhpcy5zbGljZVNlcmlhbGl6ZSh0b2tlbik7CiAgICB0YWlsLnBvc2l0aW9uLmVuZCA9IHBvaW50Mih0b2tlbi5lbmQpOwogIH0KICBfX25hbWUob25leGl0ZGF0YSwgIm9uZXhpdGRhdGEiKTsKICBmdW5jdGlvbiBvbmV4aXRsaW5lZW5kaW5nKHRva2VuKSB7CiAgICBjb25zdCBjb250ZXh0MiA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTsKICAgIGlmICh0aGlzLmRhdGEuYXRIYXJkQnJlYWspIHsKICAgICAgY29uc3QgdGFpbCA9IGNvbnRleHQyLmNoaWxkcmVuW2NvbnRleHQyLmNoaWxkcmVuLmxlbmd0aCAtIDFdOwogICAgICB0YWlsLnBvc2l0aW9uLmVuZCA9IHBvaW50Mih0b2tlbi5lbmQpOwogICAgICB0aGlzLmRhdGEuYXRIYXJkQnJlYWsgPSB2b2lkIDA7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICghdGhpcy5kYXRhLnNldGV4dEhlYWRpbmdTbHVycExpbmVFbmRpbmcgJiYgY29uZmlnMi5jYW5Db250YWluRW9scy5pbmNsdWRlcyhjb250ZXh0Mi50eXBlKSkgewogICAgICBvbmVudGVyZGF0YS5jYWxsKHRoaXMsIHRva2VuKTsKICAgICAgb25leGl0ZGF0YS5jYWxsKHRoaXMsIHRva2VuKTsKICAgIH0KICB9CiAgX19uYW1lKG9uZXhpdGxpbmVlbmRpbmcsICJvbmV4aXRsaW5lZW5kaW5nIik7CiAgZnVuY3Rpb24gb25leGl0aGFyZGJyZWFrKCkgewogICAgdGhpcy5kYXRhLmF0SGFyZEJyZWFrID0gdHJ1ZTsKICB9CiAgX19uYW1lKG9uZXhpdGhhcmRicmVhaywgIm9uZXhpdGhhcmRicmVhayIpOwogIGZ1bmN0aW9uIG9uZXhpdGh0bWxmbG93KCkgewogICAgY29uc3QgZGF0YTIgPSB0aGlzLnJlc3VtZSgpOwogICAgY29uc3Qgbm9kZTIgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgICBub2RlMi52YWx1ZSA9IGRhdGEyOwogIH0KICBfX25hbWUob25leGl0aHRtbGZsb3csICJvbmV4aXRodG1sZmxvdyIpOwogIGZ1bmN0aW9uIG9uZXhpdGh0bWx0ZXh0KCkgewogICAgY29uc3QgZGF0YTIgPSB0aGlzLnJlc3VtZSgpOwogICAgY29uc3Qgbm9kZTIgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgICBub2RlMi52YWx1ZSA9IGRhdGEyOwogIH0KICBfX25hbWUob25leGl0aHRtbHRleHQsICJvbmV4aXRodG1sdGV4dCIpOwogIGZ1bmN0aW9uIG9uZXhpdGNvZGV0ZXh0KCkgewogICAgY29uc3QgZGF0YTIgPSB0aGlzLnJlc3VtZSgpOwogICAgY29uc3Qgbm9kZTIgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgICBub2RlMi52YWx1ZSA9IGRhdGEyOwogIH0KICBfX25hbWUob25leGl0Y29kZXRleHQsICJvbmV4aXRjb2RldGV4dCIpOwogIGZ1bmN0aW9uIG9uZXhpdGxpbmsoKSB7CiAgICBjb25zdCBub2RlMiA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTsKICAgIGlmICh0aGlzLmRhdGEuaW5SZWZlcmVuY2UpIHsKICAgICAgY29uc3QgcmVmZXJlbmNlVHlwZSA9IHRoaXMuZGF0YS5yZWZlcmVuY2VUeXBlIHx8ICJzaG9ydGN1dCI7CiAgICAgIG5vZGUyLnR5cGUgKz0gIlJlZmVyZW5jZSI7CiAgICAgIG5vZGUyLnJlZmVyZW5jZVR5cGUgPSByZWZlcmVuY2VUeXBlOwogICAgICBkZWxldGUgbm9kZTIudXJsOwogICAgICBkZWxldGUgbm9kZTIudGl0bGU7CiAgICB9IGVsc2UgewogICAgICBkZWxldGUgbm9kZTIuaWRlbnRpZmllcjsKICAgICAgZGVsZXRlIG5vZGUyLmxhYmVsOwogICAgfQogICAgdGhpcy5kYXRhLnJlZmVyZW5jZVR5cGUgPSB2b2lkIDA7CiAgfQogIF9fbmFtZShvbmV4aXRsaW5rLCAib25leGl0bGluayIpOwogIGZ1bmN0aW9uIG9uZXhpdGltYWdlKCkgewogICAgY29uc3Qgbm9kZTIgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgICBpZiAodGhpcy5kYXRhLmluUmVmZXJlbmNlKSB7CiAgICAgIGNvbnN0IHJlZmVyZW5jZVR5cGUgPSB0aGlzLmRhdGEucmVmZXJlbmNlVHlwZSB8fCAic2hvcnRjdXQiOwogICAgICBub2RlMi50eXBlICs9ICJSZWZlcmVuY2UiOwogICAgICBub2RlMi5yZWZlcmVuY2VUeXBlID0gcmVmZXJlbmNlVHlwZTsKICAgICAgZGVsZXRlIG5vZGUyLnVybDsKICAgICAgZGVsZXRlIG5vZGUyLnRpdGxlOwogICAgfSBlbHNlIHsKICAgICAgZGVsZXRlIG5vZGUyLmlkZW50aWZpZXI7CiAgICAgIGRlbGV0ZSBub2RlMi5sYWJlbDsKICAgIH0KICAgIHRoaXMuZGF0YS5yZWZlcmVuY2VUeXBlID0gdm9pZCAwOwogIH0KICBfX25hbWUob25leGl0aW1hZ2UsICJvbmV4aXRpbWFnZSIpOwogIGZ1bmN0aW9uIG9uZXhpdGxhYmVsdGV4dCh0b2tlbikgewogICAgY29uc3Qgc3RyaW5nMyA9IHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pOwogICAgY29uc3QgYW5jZXN0b3IgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMl07CiAgICBhbmNlc3Rvci5sYWJlbCA9IGRlY29kZVN0cmluZyhzdHJpbmczKTsKICAgIGFuY2VzdG9yLmlkZW50aWZpZXIgPSBub3JtYWxpemVJZGVudGlmaWVyKHN0cmluZzMpLnRvTG93ZXJDYXNlKCk7CiAgfQogIF9fbmFtZShvbmV4aXRsYWJlbHRleHQsICJvbmV4aXRsYWJlbHRleHQiKTsKICBmdW5jdGlvbiBvbmV4aXRsYWJlbCgpIHsKICAgIGNvbnN0IGZyYWdtZW50ID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogICAgY29uc3QgdmFsdWUyID0gdGhpcy5yZXN1bWUoKTsKICAgIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogICAgdGhpcy5kYXRhLmluUmVmZXJlbmNlID0gdHJ1ZTsKICAgIGlmIChub2RlMi50eXBlID09PSAibGluayIpIHsKICAgICAgY29uc3QgY2hpbGRyZW4yID0gZnJhZ21lbnQuY2hpbGRyZW47CiAgICAgIG5vZGUyLmNoaWxkcmVuID0gY2hpbGRyZW4yOwogICAgfSBlbHNlIHsKICAgICAgbm9kZTIuYWx0ID0gdmFsdWUyOwogICAgfQogIH0KICBfX25hbWUob25leGl0bGFiZWwsICJvbmV4aXRsYWJlbCIpOwogIGZ1bmN0aW9uIG9uZXhpdHJlc291cmNlZGVzdGluYXRpb25zdHJpbmcoKSB7CiAgICBjb25zdCBkYXRhMiA9IHRoaXMucmVzdW1lKCk7CiAgICBjb25zdCBub2RlMiA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTsKICAgIG5vZGUyLnVybCA9IGRhdGEyOwogIH0KICBfX25hbWUob25leGl0cmVzb3VyY2VkZXN0aW5hdGlvbnN0cmluZywgIm9uZXhpdHJlc291cmNlZGVzdGluYXRpb25zdHJpbmciKTsKICBmdW5jdGlvbiBvbmV4aXRyZXNvdXJjZXRpdGxlc3RyaW5nKCkgewogICAgY29uc3QgZGF0YTIgPSB0aGlzLnJlc3VtZSgpOwogICAgY29uc3Qgbm9kZTIgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgICBub2RlMi50aXRsZSA9IGRhdGEyOwogIH0KICBfX25hbWUob25leGl0cmVzb3VyY2V0aXRsZXN0cmluZywgIm9uZXhpdHJlc291cmNldGl0bGVzdHJpbmciKTsKICBmdW5jdGlvbiBvbmV4aXRyZXNvdXJjZSgpIHsKICAgIHRoaXMuZGF0YS5pblJlZmVyZW5jZSA9IHZvaWQgMDsKICB9CiAgX19uYW1lKG9uZXhpdHJlc291cmNlLCAib25leGl0cmVzb3VyY2UiKTsKICBmdW5jdGlvbiBvbmVudGVycmVmZXJlbmNlKCkgewogICAgdGhpcy5kYXRhLnJlZmVyZW5jZVR5cGUgPSAiY29sbGFwc2VkIjsKICB9CiAgX19uYW1lKG9uZW50ZXJyZWZlcmVuY2UsICJvbmVudGVycmVmZXJlbmNlIik7CiAgZnVuY3Rpb24gb25leGl0cmVmZXJlbmNlc3RyaW5nKHRva2VuKSB7CiAgICBjb25zdCBsYWJlbCA9IHRoaXMucmVzdW1lKCk7CiAgICBjb25zdCBub2RlMiA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTsKICAgIG5vZGUyLmxhYmVsID0gbGFiZWw7CiAgICBub2RlMi5pZGVudGlmaWVyID0gbm9ybWFsaXplSWRlbnRpZmllcih0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKSkudG9Mb3dlckNhc2UoKTsKICAgIHRoaXMuZGF0YS5yZWZlcmVuY2VUeXBlID0gImZ1bGwiOwogIH0KICBfX25hbWUob25leGl0cmVmZXJlbmNlc3RyaW5nLCAib25leGl0cmVmZXJlbmNlc3RyaW5nIik7CiAgZnVuY3Rpb24gb25leGl0Y2hhcmFjdGVycmVmZXJlbmNlbWFya2VyKHRva2VuKSB7CiAgICB0aGlzLmRhdGEuY2hhcmFjdGVyUmVmZXJlbmNlVHlwZSA9IHRva2VuLnR5cGU7CiAgfQogIF9fbmFtZShvbmV4aXRjaGFyYWN0ZXJyZWZlcmVuY2VtYXJrZXIsICJvbmV4aXRjaGFyYWN0ZXJyZWZlcmVuY2VtYXJrZXIiKTsKICBmdW5jdGlvbiBvbmV4aXRjaGFyYWN0ZXJyZWZlcmVuY2V2YWx1ZSh0b2tlbikgewogICAgY29uc3QgZGF0YTIgPSB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKTsKICAgIGNvbnN0IHR5cGU1ID0gdGhpcy5kYXRhLmNoYXJhY3RlclJlZmVyZW5jZVR5cGU7CiAgICBsZXQgdmFsdWUyOwogICAgaWYgKHR5cGU1KSB7CiAgICAgIHZhbHVlMiA9IGRlY29kZU51bWVyaWNDaGFyYWN0ZXJSZWZlcmVuY2UoZGF0YTIsIHR5cGU1ID09PSAiY2hhcmFjdGVyUmVmZXJlbmNlTWFya2VyTnVtZXJpYyIgPyAxMCA6IDE2KTsKICAgICAgdGhpcy5kYXRhLmNoYXJhY3RlclJlZmVyZW5jZVR5cGUgPSB2b2lkIDA7CiAgICB9IGVsc2UgewogICAgICBjb25zdCByZXN1bHQgPSBkZWNvZGVOYW1lZENoYXJhY3RlclJlZmVyZW5jZShkYXRhMik7CiAgICAgIHZhbHVlMiA9IHJlc3VsdDsKICAgIH0KICAgIGNvbnN0IHRhaWwgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgICB0YWlsLnZhbHVlICs9IHZhbHVlMjsKICB9CiAgX19uYW1lKG9uZXhpdGNoYXJhY3RlcnJlZmVyZW5jZXZhbHVlLCAib25leGl0Y2hhcmFjdGVycmVmZXJlbmNldmFsdWUiKTsKICBmdW5jdGlvbiBvbmV4aXRjaGFyYWN0ZXJyZWZlcmVuY2UodG9rZW4pIHsKICAgIGNvbnN0IHRhaWwgPSB0aGlzLnN0YWNrLnBvcCgpOwogICAgdGFpbC5wb3NpdGlvbi5lbmQgPSBwb2ludDIodG9rZW4uZW5kKTsKICB9CiAgX19uYW1lKG9uZXhpdGNoYXJhY3RlcnJlZmVyZW5jZSwgIm9uZXhpdGNoYXJhY3RlcnJlZmVyZW5jZSIpOwogIGZ1bmN0aW9uIG9uZXhpdGF1dG9saW5rcHJvdG9jb2wodG9rZW4pIHsKICAgIG9uZXhpdGRhdGEuY2FsbCh0aGlzLCB0b2tlbik7CiAgICBjb25zdCBub2RlMiA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTsKICAgIG5vZGUyLnVybCA9IHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pOwogIH0KICBfX25hbWUob25leGl0YXV0b2xpbmtwcm90b2NvbCwgIm9uZXhpdGF1dG9saW5rcHJvdG9jb2wiKTsKICBmdW5jdGlvbiBvbmV4aXRhdXRvbGlua2VtYWlsKHRva2VuKSB7CiAgICBvbmV4aXRkYXRhLmNhbGwodGhpcywgdG9rZW4pOwogICAgY29uc3Qgbm9kZTIgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgICBub2RlMi51cmwgPSAibWFpbHRvOiIgKyB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKTsKICB9CiAgX19uYW1lKG9uZXhpdGF1dG9saW5rZW1haWwsICJvbmV4aXRhdXRvbGlua2VtYWlsIik7CiAgZnVuY3Rpb24gYmxvY2tRdW90ZTIoKSB7CiAgICByZXR1cm4gewogICAgICB0eXBlOiAiYmxvY2txdW90ZSIsCiAgICAgIGNoaWxkcmVuOiBbXQogICAgfTsKICB9CiAgX19uYW1lKGJsb2NrUXVvdGUyLCAiYmxvY2tRdW90ZSIpOwogIGZ1bmN0aW9uIGNvZGVGbG93KCkgewogICAgcmV0dXJuIHsKICAgICAgdHlwZTogImNvZGUiLAogICAgICBsYW5nOiBudWxsLAogICAgICBtZXRhOiBudWxsLAogICAgICB2YWx1ZTogIiIKICAgIH07CiAgfQogIF9fbmFtZShjb2RlRmxvdywgImNvZGVGbG93Iik7CiAgZnVuY3Rpb24gY29kZVRleHQyKCkgewogICAgcmV0dXJuIHsKICAgICAgdHlwZTogImlubGluZUNvZGUiLAogICAgICB2YWx1ZTogIiIKICAgIH07CiAgfQogIF9fbmFtZShjb2RlVGV4dDIsICJjb2RlVGV4dCIpOwogIGZ1bmN0aW9uIGRlZmluaXRpb24zKCkgewogICAgcmV0dXJuIHsKICAgICAgdHlwZTogImRlZmluaXRpb24iLAogICAgICBpZGVudGlmaWVyOiAiIiwKICAgICAgbGFiZWw6IG51bGwsCiAgICAgIHRpdGxlOiBudWxsLAogICAgICB1cmw6ICIiCiAgICB9OwogIH0KICBfX25hbWUoZGVmaW5pdGlvbjMsICJkZWZpbml0aW9uIik7CiAgZnVuY3Rpb24gZW1waGFzaXMzKCkgewogICAgcmV0dXJuIHsKICAgICAgdHlwZTogImVtcGhhc2lzIiwKICAgICAgY2hpbGRyZW46IFtdCiAgICB9OwogIH0KICBfX25hbWUoZW1waGFzaXMzLCAiZW1waGFzaXMiKTsKICBmdW5jdGlvbiBoZWFkaW5nMygpIHsKICAgIHJldHVybiB7CiAgICAgIHR5cGU6ICJoZWFkaW5nIiwKICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBgZGVwdGhgIHdpbGwgYmUgc2V0IGxhdGVyLgogICAgICBkZXB0aDogMCwKICAgICAgY2hpbGRyZW46IFtdCiAgICB9OwogIH0KICBfX25hbWUoaGVhZGluZzMsICJoZWFkaW5nIik7CiAgZnVuY3Rpb24gaGFyZEJyZWFrMygpIHsKICAgIHJldHVybiB7CiAgICAgIHR5cGU6ICJicmVhayIKICAgIH07CiAgfQogIF9fbmFtZShoYXJkQnJlYWszLCAiaGFyZEJyZWFrIik7CiAgZnVuY3Rpb24gaHRtbDcoKSB7CiAgICByZXR1cm4gewogICAgICB0eXBlOiAiaHRtbCIsCiAgICAgIHZhbHVlOiAiIgogICAgfTsKICB9CiAgX19uYW1lKGh0bWw3LCAiaHRtbCIpOwogIGZ1bmN0aW9uIGltYWdlMygpIHsKICAgIHJldHVybiB7CiAgICAgIHR5cGU6ICJpbWFnZSIsCiAgICAgIHRpdGxlOiBudWxsLAogICAgICB1cmw6ICIiLAogICAgICBhbHQ6IG51bGwKICAgIH07CiAgfQogIF9fbmFtZShpbWFnZTMsICJpbWFnZSIpOwogIGZ1bmN0aW9uIGxpbmszKCkgewogICAgcmV0dXJuIHsKICAgICAgdHlwZTogImxpbmsiLAogICAgICB0aXRsZTogbnVsbCwKICAgICAgdXJsOiAiIiwKICAgICAgY2hpbGRyZW46IFtdCiAgICB9OwogIH0KICBfX25hbWUobGluazMsICJsaW5rIik7CiAgZnVuY3Rpb24gbGlzdDUodG9rZW4pIHsKICAgIHJldHVybiB7CiAgICAgIHR5cGU6ICJsaXN0IiwKICAgICAgb3JkZXJlZDogdG9rZW4udHlwZSA9PT0gImxpc3RPcmRlcmVkIiwKICAgICAgc3RhcnQ6IG51bGwsCiAgICAgIHNwcmVhZDogdG9rZW4uX3NwcmVhZCwKICAgICAgY2hpbGRyZW46IFtdCiAgICB9OwogIH0KICBfX25hbWUobGlzdDUsICJsaXN0Iik7CiAgZnVuY3Rpb24gbGlzdEl0ZW0zKHRva2VuKSB7CiAgICByZXR1cm4gewogICAgICB0eXBlOiAibGlzdEl0ZW0iLAogICAgICBzcHJlYWQ6IHRva2VuLl9zcHJlYWQsCiAgICAgIGNoZWNrZWQ6IG51bGwsCiAgICAgIGNoaWxkcmVuOiBbXQogICAgfTsKICB9CiAgX19uYW1lKGxpc3RJdGVtMywgImxpc3RJdGVtIik7CiAgZnVuY3Rpb24gcGFyYWdyYXBoMygpIHsKICAgIHJldHVybiB7CiAgICAgIHR5cGU6ICJwYXJhZ3JhcGgiLAogICAgICBjaGlsZHJlbjogW10KICAgIH07CiAgfQogIF9fbmFtZShwYXJhZ3JhcGgzLCAicGFyYWdyYXBoIik7CiAgZnVuY3Rpb24gc3Ryb25nMygpIHsKICAgIHJldHVybiB7CiAgICAgIHR5cGU6ICJzdHJvbmciLAogICAgICBjaGlsZHJlbjogW10KICAgIH07CiAgfQogIF9fbmFtZShzdHJvbmczLCAic3Ryb25nIik7CiAgZnVuY3Rpb24gdGV4dDgoKSB7CiAgICByZXR1cm4gewogICAgICB0eXBlOiAidGV4dCIsCiAgICAgIHZhbHVlOiAiIgogICAgfTsKICB9CiAgX19uYW1lKHRleHQ4LCAidGV4dCIpOwogIGZ1bmN0aW9uIHRoZW1hdGljQnJlYWs0KCkgewogICAgcmV0dXJuIHsKICAgICAgdHlwZTogInRoZW1hdGljQnJlYWsiCiAgICB9OwogIH0KICBfX25hbWUodGhlbWF0aWNCcmVhazQsICJ0aGVtYXRpY0JyZWFrIik7Cn0KX19uYW1lKGNvbXBpbGVyLCAiY29tcGlsZXIiKTsKZnVuY3Rpb24gcG9pbnQyKGQ0KSB7CiAgcmV0dXJuIHsKICAgIGxpbmU6IGQ0LmxpbmUsCiAgICBjb2x1bW46IGQ0LmNvbHVtbiwKICAgIG9mZnNldDogZDQub2Zmc2V0CiAgfTsKfQpfX25hbWUocG9pbnQyLCAicG9pbnQiKTsKZnVuY3Rpb24gY29uZmlndXJlMihjb21iaW5lZCwgZXh0ZW5zaW9ucykgewogIGxldCBpbmRleDIgPSAtMTsKICB3aGlsZSAoKytpbmRleDIgPCBleHRlbnNpb25zLmxlbmd0aCkgewogICAgY29uc3QgdmFsdWUyID0gZXh0ZW5zaW9uc1tpbmRleDJdOwogICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUyKSkgewogICAgICBjb25maWd1cmUyKGNvbWJpbmVkLCB2YWx1ZTIpOwogICAgfSBlbHNlIHsKICAgICAgZXh0ZW5zaW9uKGNvbWJpbmVkLCB2YWx1ZTIpOwogICAgfQogIH0KfQpfX25hbWUoY29uZmlndXJlMiwgImNvbmZpZ3VyZSIpOwpmdW5jdGlvbiBleHRlbnNpb24oY29tYmluZWQsIGV4dGVuc2lvbjIpIHsKICBsZXQga2V5MjsKICBmb3IgKGtleTIgaW4gZXh0ZW5zaW9uMikgewogICAgaWYgKG93bjUuY2FsbChleHRlbnNpb24yLCBrZXkyKSkgewogICAgICBzd2l0Y2ggKGtleTIpIHsKICAgICAgICBjYXNlICJjYW5Db250YWluRW9scyI6IHsKICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gZXh0ZW5zaW9uMltrZXkyXTsKICAgICAgICAgIGlmIChyaWdodCkgewogICAgICAgICAgICBjb21iaW5lZFtrZXkyXS5wdXNoKC4uLnJpZ2h0KTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjYXNlICJ0cmFuc2Zvcm1zIjogewogICAgICAgICAgY29uc3QgcmlnaHQgPSBleHRlbnNpb24yW2tleTJdOwogICAgICAgICAgaWYgKHJpZ2h0KSB7CiAgICAgICAgICAgIGNvbWJpbmVkW2tleTJdLnB1c2goLi4ucmlnaHQpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNhc2UgImVudGVyIjoKICAgICAgICBjYXNlICJleGl0IjogewogICAgICAgICAgY29uc3QgcmlnaHQgPSBleHRlbnNpb24yW2tleTJdOwogICAgICAgICAgaWYgKHJpZ2h0KSB7CiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY29tYmluZWRba2V5Ml0sIHJpZ2h0KTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQpfX25hbWUoZXh0ZW5zaW9uLCAiZXh0ZW5zaW9uIik7CmZ1bmN0aW9uIGRlZmF1bHRPbkVycm9yKGxlZnQsIHJpZ2h0KSB7CiAgaWYgKGxlZnQpIHsKICAgIHRocm93IG5ldyBFcnJvcigiQ2Fubm90IGNsb3NlIGAiICsgbGVmdC50eXBlICsgImAgKCIgKyBzdHJpbmdpZnlQb3NpdGlvbih7CiAgICAgIHN0YXJ0OiBsZWZ0LnN0YXJ0LAogICAgICBlbmQ6IGxlZnQuZW5kCiAgICB9KSArICIpOiBhIGRpZmZlcmVudCB0b2tlbiAoYCIgKyByaWdodC50eXBlICsgImAsICIgKyBzdHJpbmdpZnlQb3NpdGlvbih7CiAgICAgIHN0YXJ0OiByaWdodC5zdGFydCwKICAgICAgZW5kOiByaWdodC5lbmQKICAgIH0pICsgIikgaXMgb3BlbiIpOwogIH0gZWxzZSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBjbG9zZSBkb2N1bWVudCwgYSB0b2tlbiAoYCIgKyByaWdodC50eXBlICsgImAsICIgKyBzdHJpbmdpZnlQb3NpdGlvbih7CiAgICAgIHN0YXJ0OiByaWdodC5zdGFydCwKICAgICAgZW5kOiByaWdodC5lbmQKICAgIH0pICsgIikgaXMgc3RpbGwgb3BlbiIpOwogIH0KfQpfX25hbWUoZGVmYXVsdE9uRXJyb3IsICJkZWZhdWx0T25FcnJvciIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3JlbWFyay1wYXJzZUAxMS4wLjAvbm9kZV9tb2R1bGVzL3JlbWFyay1wYXJzZS9saWIvaW5kZXguanMKZnVuY3Rpb24gcmVtYXJrUGFyc2Uob3B0aW9ucykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICBzZWxmMi5wYXJzZXIgPSBwYXJzZXI7CiAgZnVuY3Rpb24gcGFyc2VyKGRvYykgewogICAgcmV0dXJuIGZyb21NYXJrZG93bihkb2MsIHsKICAgICAgLi4uc2VsZjIuZGF0YSgic2V0dGluZ3MiKSwKICAgICAgLi4ub3B0aW9ucywKICAgICAgLy8gTm90ZTogdGhlc2Ugb3B0aW9ucyBhcmUgbm90IGluIHRoZSByZWFkbWUuCiAgICAgIC8vIFRoZSBnb2FsIGlzIGZvciB0aGVtIHRvIGJlIHNldCBieSBwbHVnaW5zIG9uIGBkYXRhYCBpbnN0ZWFkIG9mIGJlaW5nCiAgICAgIC8vIHBhc3NlZCBieSB1c2Vycy4KICAgICAgZXh0ZW5zaW9uczogc2VsZjIuZGF0YSgibWljcm9tYXJrRXh0ZW5zaW9ucyIpIHx8IFtdLAogICAgICBtZGFzdEV4dGVuc2lvbnM6IHNlbGYyLmRhdGEoImZyb21NYXJrZG93bkV4dGVuc2lvbnMiKSB8fCBbXQogICAgfSk7CiAgfQogIF9fbmFtZShwYXJzZXIsICJwYXJzZXIiKTsKfQpfX25hbWUocmVtYXJrUGFyc2UsICJyZW1hcmtQYXJzZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZhdWx0QDIuMC4xL25vZGVfbW9kdWxlcy9mYXVsdC9pbmRleC5qcwp2YXIgaW1wb3J0X2Zvcm1hdDIgPSBfX3RvRVNNKHJlcXVpcmVfZm9ybWF0KCksIDEpOwp2YXIgZmF1bHQgPSBPYmplY3QuYXNzaWduKGNyZWF0ZTUoRXJyb3IpLCB7CiAgZXZhbDogY3JlYXRlNShFdmFsRXJyb3IpLAogIHJhbmdlOiBjcmVhdGU1KFJhbmdlRXJyb3IpLAogIHJlZmVyZW5jZTogY3JlYXRlNShSZWZlcmVuY2VFcnJvciksCiAgc3ludGF4OiBjcmVhdGU1KFN5bnRheEVycm9yKSwKICB0eXBlOiBjcmVhdGU1KFR5cGVFcnJvciksCiAgdXJpOiBjcmVhdGU1KFVSSUVycm9yKQp9KTsKZnVuY3Rpb24gY3JlYXRlNShDb25zdHJ1Y3RvcikgewogIEZvcm1hdHRlZEVycm9yLmRpc3BsYXlOYW1lID0gQ29uc3RydWN0b3IuZGlzcGxheU5hbWUgfHwgQ29uc3RydWN0b3IubmFtZTsKICByZXR1cm4gRm9ybWF0dGVkRXJyb3I7CiAgZnVuY3Rpb24gRm9ybWF0dGVkRXJyb3IoZm9ybWF0MiwgLi4udmFsdWVzKSB7CiAgICBjb25zdCByZWFzb24gPSBmb3JtYXQyID8gKDAsIGltcG9ydF9mb3JtYXQyLmRlZmF1bHQpKGZvcm1hdDIsIC4uLnZhbHVlcykgOiBmb3JtYXQyOwogICAgcmV0dXJuIG5ldyBDb25zdHJ1Y3RvcihyZWFzb24pOwogIH0KICBfX25hbWUoRm9ybWF0dGVkRXJyb3IsICJGb3JtYXR0ZWRFcnJvciIpOwp9Cl9fbmFtZShjcmVhdGU1LCAiY3JlYXRlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1mcm9udG1hdHRlckAyLjAuMC9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1mcm9udG1hdHRlci9saWIvdG8tbWF0dGVycy5qcwp2YXIgb3duNiA9IHt9Lmhhc093blByb3BlcnR5Owp2YXIgbWFya2VycyA9IHsKICB5YW1sOiAiLSIsCiAgdG9tbDogIisiCn07CmZ1bmN0aW9uIHRvTWF0dGVycyhvcHRpb25zKSB7CiAgY29uc3QgcmVzdWx0ID0gW107CiAgbGV0IGluZGV4MiA9IC0xOwogIGNvbnN0IHByZXNldHNPck1hdHRlcnMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMpID8gb3B0aW9ucyA6IG9wdGlvbnMgPyBbb3B0aW9uc10gOiBbInlhbWwiXTsKICB3aGlsZSAoKytpbmRleDIgPCBwcmVzZXRzT3JNYXR0ZXJzLmxlbmd0aCkgewogICAgcmVzdWx0W2luZGV4Ml0gPSBtYXR0ZXIocHJlc2V0c09yTWF0dGVyc1tpbmRleDJdKTsKICB9CiAgcmV0dXJuIHJlc3VsdDsKfQpfX25hbWUodG9NYXR0ZXJzLCAidG9NYXR0ZXJzIik7CmZ1bmN0aW9uIG1hdHRlcihvcHRpb24yKSB7CiAgbGV0IHJlc3VsdCA9IG9wdGlvbjI7CiAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICJzdHJpbmciKSB7CiAgICBpZiAoIW93bjYuY2FsbChtYXJrZXJzLCByZXN1bHQpKSB7CiAgICAgIHRocm93IGZhdWx0KCJNaXNzaW5nIG1hdHRlciBkZWZpbml0aW9uIGZvciBgJXNgIiwgcmVzdWx0KTsKICAgIH0KICAgIHJlc3VsdCA9IHsKICAgICAgdHlwZTogcmVzdWx0LAogICAgICBtYXJrZXI6IG1hcmtlcnNbcmVzdWx0XQogICAgfTsKICB9IGVsc2UgaWYgKHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB7CiAgICB0aHJvdyBmYXVsdCgiRXhwZWN0ZWQgbWF0dGVyIHRvIGJlIGFuIG9iamVjdCwgbm90IGAlamAiLCByZXN1bHQpOwogIH0KICBpZiAoIW93bjYuY2FsbChyZXN1bHQsICJ0eXBlIikpIHsKICAgIHRocm93IGZhdWx0KCJNaXNzaW5nIGB0eXBlYCBpbiBtYXR0ZXIgYCVqYCIsIHJlc3VsdCk7CiAgfQogIGlmICghb3duNi5jYWxsKHJlc3VsdCwgImZlbmNlIikgJiYgIW93bjYuY2FsbChyZXN1bHQsICJtYXJrZXIiKSkgewogICAgdGhyb3cgZmF1bHQoIk1pc3NpbmcgYG1hcmtlcmAgb3IgYGZlbmNlYCBpbiBtYXR0ZXIgYCVqYCIsIHJlc3VsdCk7CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KX19uYW1lKG1hdHRlciwgIm1hdHRlciIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1leHRlbnNpb24tZnJvbnRtYXR0ZXJAMi4wLjAvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZnJvbnRtYXR0ZXIvbGliL3N5bnRheC5qcwpmdW5jdGlvbiBmcm9udG1hdHRlcihvcHRpb25zKSB7CiAgY29uc3QgbWF0dGVycyA9IHRvTWF0dGVycyhvcHRpb25zKTsKICBjb25zdCBmbG93MyA9IHt9OwogIGxldCBpbmRleDIgPSAtMTsKICB3aGlsZSAoKytpbmRleDIgPCBtYXR0ZXJzLmxlbmd0aCkgewogICAgY29uc3QgbWF0dGVyMiA9IG1hdHRlcnNbaW5kZXgyXTsKICAgIGNvbnN0IGNvZGU0ID0gZmVuY2UobWF0dGVyMiwgIm9wZW4iKS5jaGFyQ29kZUF0KDApOwogICAgY29uc3QgY29uc3RydWN0ID0gY3JlYXRlQ29uc3RydWN0KG1hdHRlcjIpOwogICAgY29uc3QgZXhpc3RpbmcgPSBmbG93M1tjb2RlNF07CiAgICBpZiAoQXJyYXkuaXNBcnJheShleGlzdGluZykpIHsKICAgICAgZXhpc3RpbmcucHVzaChjb25zdHJ1Y3QpOwogICAgfSBlbHNlIHsKICAgICAgZmxvdzNbY29kZTRdID0gW2NvbnN0cnVjdF07CiAgICB9CiAgfQogIHJldHVybiB7CiAgICBmbG93OiBmbG93MwogIH07Cn0KX19uYW1lKGZyb250bWF0dGVyLCAiZnJvbnRtYXR0ZXIiKTsKZnVuY3Rpb24gY3JlYXRlQ29uc3RydWN0KG1hdHRlcjIpIHsKICBjb25zdCBhbnl3aGVyZSA9IG1hdHRlcjIuYW55d2hlcmU7CiAgY29uc3QgZnJvbnRtYXR0ZXJUeXBlID0gKAogICAgLyoqIEB0eXBlIHtUb2tlblR5cGV9ICovCiAgICBtYXR0ZXIyLnR5cGUKICApOwogIGNvbnN0IGZlbmNlVHlwZSA9ICgKICAgIC8qKiBAdHlwZSB7VG9rZW5UeXBlfSAqLwogICAgZnJvbnRtYXR0ZXJUeXBlICsgIkZlbmNlIgogICk7CiAgY29uc3Qgc2VxdWVuY2VUeXBlID0gKAogICAgLyoqIEB0eXBlIHtUb2tlblR5cGV9ICovCiAgICBmZW5jZVR5cGUgKyAiU2VxdWVuY2UiCiAgKTsKICBjb25zdCB2YWx1ZVR5cGUgPSAoCiAgICAvKiogQHR5cGUge1Rva2VuVHlwZX0gKi8KICAgIGZyb250bWF0dGVyVHlwZSArICJWYWx1ZSIKICApOwogIGNvbnN0IGNsb3NpbmdGZW5jZUNvbnN0cnVjdCA9IHsKICAgIHRva2VuaXplOiB0b2tlbml6ZUNsb3NpbmdGZW5jZSwKICAgIHBhcnRpYWw6IHRydWUKICB9OwogIGxldCBidWZmZXIyOwogIGxldCBidWZmZXJJbmRleCA9IDA7CiAgcmV0dXJuIHsKICAgIHRva2VuaXplOiB0b2tlbml6ZUZyb250bWF0dGVyLAogICAgY29uY3JldGU6IHRydWUKICB9OwogIGZ1bmN0aW9uIHRva2VuaXplRnJvbnRtYXR0ZXIoZWZmZWN0cywgb2szLCBub2spIHsKICAgIGNvbnN0IHNlbGYyID0gdGhpczsKICAgIHJldHVybiBzdGFydDsKICAgIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICAgIGNvbnN0IHBvc2l0aW9uMyA9IHNlbGYyLm5vdygpOwogICAgICBpZiAoCiAgICAgICAgLy8gSW5kZW50IG5vdCBhbGxvd2VkLgogICAgICAgIHBvc2l0aW9uMy5jb2x1bW4gPT09IDEgJiYgLy8gTm9ybWFsbHksIG9ubHkgYWxsb3dlZCBpbiBmaXJzdCBsaW5lLgogICAgICAgIChwb3NpdGlvbjMubGluZSA9PT0gMSB8fCBhbnl3aGVyZSkKICAgICAgKSB7CiAgICAgICAgYnVmZmVyMiA9IGZlbmNlKG1hdHRlcjIsICJvcGVuIik7CiAgICAgICAgYnVmZmVySW5kZXggPSAwOwogICAgICAgIGlmIChjb2RlNCA9PT0gYnVmZmVyMi5jaGFyQ29kZUF0KGJ1ZmZlckluZGV4KSkgewogICAgICAgICAgZWZmZWN0cy5lbnRlcihmcm9udG1hdHRlclR5cGUpOwogICAgICAgICAgZWZmZWN0cy5lbnRlcihmZW5jZVR5cGUpOwogICAgICAgICAgZWZmZWN0cy5lbnRlcihzZXF1ZW5jZVR5cGUpOwogICAgICAgICAgcmV0dXJuIG9wZW5TZXF1ZW5jZShjb2RlNCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgX19uYW1lKHN0YXJ0LCAic3RhcnQiKTsKICAgIGZ1bmN0aW9uIG9wZW5TZXF1ZW5jZShjb2RlNCkgewogICAgICBpZiAoYnVmZmVySW5kZXggPT09IGJ1ZmZlcjIubGVuZ3RoKSB7CiAgICAgICAgZWZmZWN0cy5leGl0KHNlcXVlbmNlVHlwZSk7CiAgICAgICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZTQpKSB7CiAgICAgICAgICBlZmZlY3RzLmVudGVyKCJ3aGl0ZXNwYWNlIik7CiAgICAgICAgICByZXR1cm4gb3BlblNlcXVlbmNlV2hpdGVzcGFjZShjb2RlNCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBvcGVuQWZ0ZXIoY29kZTQpOwogICAgICB9CiAgICAgIGlmIChjb2RlNCA9PT0gYnVmZmVyMi5jaGFyQ29kZUF0KGJ1ZmZlckluZGV4KyspKSB7CiAgICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgICByZXR1cm4gb3BlblNlcXVlbmNlOwogICAgICB9CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgX19uYW1lKG9wZW5TZXF1ZW5jZSwgIm9wZW5TZXF1ZW5jZSIpOwogICAgZnVuY3Rpb24gb3BlblNlcXVlbmNlV2hpdGVzcGFjZShjb2RlNCkgewogICAgICBpZiAobWFya2Rvd25TcGFjZShjb2RlNCkpIHsKICAgICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICAgIHJldHVybiBvcGVuU2VxdWVuY2VXaGl0ZXNwYWNlOwogICAgICB9CiAgICAgIGVmZmVjdHMuZXhpdCgid2hpdGVzcGFjZSIpOwogICAgICByZXR1cm4gb3BlbkFmdGVyKGNvZGU0KTsKICAgIH0KICAgIF9fbmFtZShvcGVuU2VxdWVuY2VXaGl0ZXNwYWNlLCAib3BlblNlcXVlbmNlV2hpdGVzcGFjZSIpOwogICAgZnVuY3Rpb24gb3BlbkFmdGVyKGNvZGU0KSB7CiAgICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgICAgZWZmZWN0cy5leGl0KGZlbmNlVHlwZSk7CiAgICAgICAgZWZmZWN0cy5lbnRlcigibGluZUVuZGluZyIpOwogICAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgICAgZWZmZWN0cy5leGl0KCJsaW5lRW5kaW5nIik7CiAgICAgICAgYnVmZmVyMiA9IGZlbmNlKG1hdHRlcjIsICJjbG9zZSIpOwogICAgICAgIGJ1ZmZlckluZGV4ID0gMDsKICAgICAgICByZXR1cm4gZWZmZWN0cy5hdHRlbXB0KGNsb3NpbmdGZW5jZUNvbnN0cnVjdCwgYWZ0ZXIsIGNvbnRlbnRTdGFydCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICBfX25hbWUob3BlbkFmdGVyLCAib3BlbkFmdGVyIik7CiAgICBmdW5jdGlvbiBjb250ZW50U3RhcnQoY29kZTQpIHsKICAgICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgICByZXR1cm4gY29udGVudEVuZChjb2RlNCk7CiAgICAgIH0KICAgICAgZWZmZWN0cy5lbnRlcih2YWx1ZVR5cGUpOwogICAgICByZXR1cm4gY29udGVudEluc2lkZShjb2RlNCk7CiAgICB9CiAgICBfX25hbWUoY29udGVudFN0YXJ0LCAiY29udGVudFN0YXJ0Iik7CiAgICBmdW5jdGlvbiBjb250ZW50SW5zaWRlKGNvZGU0KSB7CiAgICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgICAgZWZmZWN0cy5leGl0KHZhbHVlVHlwZSk7CiAgICAgICAgcmV0dXJuIGNvbnRlbnRFbmQoY29kZTQpOwogICAgICB9CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBjb250ZW50SW5zaWRlOwogICAgfQogICAgX19uYW1lKGNvbnRlbnRJbnNpZGUsICJjb250ZW50SW5zaWRlIik7CiAgICBmdW5jdGlvbiBjb250ZW50RW5kKGNvZGU0KSB7CiAgICAgIGlmIChjb2RlNCA9PT0gbnVsbCkgewogICAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgICB9CiAgICAgIGVmZmVjdHMuZW50ZXIoImxpbmVFbmRpbmciKTsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgZWZmZWN0cy5leGl0KCJsaW5lRW5kaW5nIik7CiAgICAgIHJldHVybiBlZmZlY3RzLmF0dGVtcHQoY2xvc2luZ0ZlbmNlQ29uc3RydWN0LCBhZnRlciwgY29udGVudFN0YXJ0KTsKICAgIH0KICAgIF9fbmFtZShjb250ZW50RW5kLCAiY29udGVudEVuZCIpOwogICAgZnVuY3Rpb24gYWZ0ZXIoY29kZTQpIHsKICAgICAgZWZmZWN0cy5leGl0KGZyb250bWF0dGVyVHlwZSk7CiAgICAgIHJldHVybiBvazMoY29kZTQpOwogICAgfQogICAgX19uYW1lKGFmdGVyLCAiYWZ0ZXIiKTsKICB9CiAgX19uYW1lKHRva2VuaXplRnJvbnRtYXR0ZXIsICJ0b2tlbml6ZUZyb250bWF0dGVyIik7CiAgZnVuY3Rpb24gdG9rZW5pemVDbG9zaW5nRmVuY2UoZWZmZWN0cywgb2szLCBub2spIHsKICAgIGxldCBidWZmZXJJbmRleDIgPSAwOwogICAgcmV0dXJuIGNsb3NlU3RhcnQ7CiAgICBmdW5jdGlvbiBjbG9zZVN0YXJ0KGNvZGU0KSB7CiAgICAgIGlmIChjb2RlNCA9PT0gYnVmZmVyMi5jaGFyQ29kZUF0KGJ1ZmZlckluZGV4MikpIHsKICAgICAgICBlZmZlY3RzLmVudGVyKGZlbmNlVHlwZSk7CiAgICAgICAgZWZmZWN0cy5lbnRlcihzZXF1ZW5jZVR5cGUpOwogICAgICAgIHJldHVybiBjbG9zZVNlcXVlbmNlKGNvZGU0KTsKICAgICAgfQogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIF9fbmFtZShjbG9zZVN0YXJ0LCAiY2xvc2VTdGFydCIpOwogICAgZnVuY3Rpb24gY2xvc2VTZXF1ZW5jZShjb2RlNCkgewogICAgICBpZiAoYnVmZmVySW5kZXgyID09PSBidWZmZXIyLmxlbmd0aCkgewogICAgICAgIGVmZmVjdHMuZXhpdChzZXF1ZW5jZVR5cGUpOwogICAgICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICAgICAgZWZmZWN0cy5lbnRlcigid2hpdGVzcGFjZSIpOwogICAgICAgICAgcmV0dXJuIGNsb3NlU2VxdWVuY2VXaGl0ZXNwYWNlKGNvZGU0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNsb3NlQWZ0ZXIoY29kZTQpOwogICAgICB9CiAgICAgIGlmIChjb2RlNCA9PT0gYnVmZmVyMi5jaGFyQ29kZUF0KGJ1ZmZlckluZGV4MisrKSkgewogICAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgICAgcmV0dXJuIGNsb3NlU2VxdWVuY2U7CiAgICAgIH0KICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICBfX25hbWUoY2xvc2VTZXF1ZW5jZSwgImNsb3NlU2VxdWVuY2UiKTsKICAgIGZ1bmN0aW9uIGNsb3NlU2VxdWVuY2VXaGl0ZXNwYWNlKGNvZGU0KSB7CiAgICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgICAgcmV0dXJuIGNsb3NlU2VxdWVuY2VXaGl0ZXNwYWNlOwogICAgICB9CiAgICAgIGVmZmVjdHMuZXhpdCgid2hpdGVzcGFjZSIpOwogICAgICByZXR1cm4gY2xvc2VBZnRlcihjb2RlNCk7CiAgICB9CiAgICBfX25hbWUoY2xvc2VTZXF1ZW5jZVdoaXRlc3BhY2UsICJjbG9zZVNlcXVlbmNlV2hpdGVzcGFjZSIpOwogICAgZnVuY3Rpb24gY2xvc2VBZnRlcihjb2RlNCkgewogICAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICAgIGVmZmVjdHMuZXhpdChmZW5jZVR5cGUpOwogICAgICAgIHJldHVybiBvazMoY29kZTQpOwogICAgICB9CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgX19uYW1lKGNsb3NlQWZ0ZXIsICJjbG9zZUFmdGVyIik7CiAgfQogIF9fbmFtZSh0b2tlbml6ZUNsb3NpbmdGZW5jZSwgInRva2VuaXplQ2xvc2luZ0ZlbmNlIik7Cn0KX19uYW1lKGNyZWF0ZUNvbnN0cnVjdCwgImNyZWF0ZUNvbnN0cnVjdCIpOwpmdW5jdGlvbiBmZW5jZShtYXR0ZXIyLCBwcm9wKSB7CiAgcmV0dXJuIG1hdHRlcjIubWFya2VyID8gcGljayhtYXR0ZXIyLm1hcmtlciwgcHJvcCkucmVwZWF0KDMpIDogKAogICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogVGhleeKAmXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4KICAgIHBpY2sobWF0dGVyMi5mZW5jZSwgcHJvcCkKICApOwp9Cl9fbmFtZShmZW5jZSwgImZlbmNlIik7CmZ1bmN0aW9uIHBpY2soc2NoZW1hLCBwcm9wKSB7CiAgcmV0dXJuIHR5cGVvZiBzY2hlbWEgPT09ICJzdHJpbmciID8gc2NoZW1hIDogc2NoZW1hW3Byb3BdOwp9Cl9fbmFtZShwaWNrLCAicGljayIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtZnJvbnRtYXR0ZXJAMi4wLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtZnJvbnRtYXR0ZXIvbGliL2luZGV4LmpzCmZ1bmN0aW9uIGZyb250bWF0dGVyRnJvbU1hcmtkb3duKG9wdGlvbnMpIHsKICBjb25zdCBtYXR0ZXJzID0gdG9NYXR0ZXJzKG9wdGlvbnMpOwogIGNvbnN0IGVudGVyID0ge307CiAgY29uc3QgZXhpdDMgPSB7fTsKICBsZXQgaW5kZXgyID0gLTE7CiAgd2hpbGUgKCsraW5kZXgyIDwgbWF0dGVycy5sZW5ndGgpIHsKICAgIGNvbnN0IG1hdHRlcjIgPSBtYXR0ZXJzW2luZGV4Ml07CiAgICBlbnRlclttYXR0ZXIyLnR5cGVdID0gb3BlbmVyKG1hdHRlcjIpOwogICAgZXhpdDNbbWF0dGVyMi50eXBlXSA9IGNsb3NlNjsKICAgIGV4aXQzW21hdHRlcjIudHlwZSArICJWYWx1ZSJdID0gdmFsdWU7CiAgfQogIHJldHVybiB7IGVudGVyLCBleGl0OiBleGl0MyB9Owp9Cl9fbmFtZShmcm9udG1hdHRlckZyb21NYXJrZG93biwgImZyb250bWF0dGVyRnJvbU1hcmtkb3duIik7CmZ1bmN0aW9uIG9wZW5lcihtYXR0ZXIyKSB7CiAgcmV0dXJuIG9wZW47CiAgZnVuY3Rpb24gb3Blbih0b2tlbikgewogICAgdGhpcy5lbnRlcih7IHR5cGU6IG1hdHRlcjIudHlwZSwgdmFsdWU6ICIiIH0sIHRva2VuKTsKICAgIHRoaXMuYnVmZmVyKCk7CiAgfQogIF9fbmFtZShvcGVuLCAib3BlbiIpOwp9Cl9fbmFtZShvcGVuZXIsICJvcGVuZXIiKTsKZnVuY3Rpb24gY2xvc2U2KHRva2VuKSB7CiAgY29uc3QgZGF0YSA9IHRoaXMucmVzdW1lKCk7CiAgY29uc3Qgbm9kZTIgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgb2soInZhbHVlIiBpbiBub2RlMik7CiAgdGhpcy5leGl0KHRva2VuKTsKICBub2RlMi52YWx1ZSA9IGRhdGEucmVwbGFjZSgvXihccj9cbnxccil8KFxyP1xufFxyKSQvZywgIiIpOwp9Cl9fbmFtZShjbG9zZTYsICJjbG9zZSIpOwpmdW5jdGlvbiB2YWx1ZSh0b2tlbikgewogIHRoaXMuY29uZmlnLmVudGVyLmRhdGEuY2FsbCh0aGlzLCB0b2tlbik7CiAgdGhpcy5jb25maWcuZXhpdC5kYXRhLmNhbGwodGhpcywgdG9rZW4pOwp9Cl9fbmFtZSh2YWx1ZSwgInZhbHVlIik7CmZ1bmN0aW9uIGZyb250bWF0dGVyVG9NYXJrZG93bihvcHRpb25zKSB7CiAgY29uc3QgdW5zYWZlMiA9IFtdOwogIGNvbnN0IGhhbmRsZXJzMiA9IHt9OwogIGNvbnN0IG1hdHRlcnMgPSB0b01hdHRlcnMob3B0aW9ucyk7CiAgbGV0IGluZGV4MiA9IC0xOwogIHdoaWxlICgrK2luZGV4MiA8IG1hdHRlcnMubGVuZ3RoKSB7CiAgICBjb25zdCBtYXR0ZXIyID0gbWF0dGVyc1tpbmRleDJdOwogICAgaGFuZGxlcnMyW21hdHRlcjIudHlwZV0gPSBoYW5kbGVyKG1hdHRlcjIpOwogICAgY29uc3Qgb3BlbiA9IGZlbmNlMihtYXR0ZXIyLCAib3BlbiIpOwogICAgdW5zYWZlMi5wdXNoKHsKICAgICAgYXRCcmVhazogdHJ1ZSwKICAgICAgY2hhcmFjdGVyOiBvcGVuLmNoYXJBdCgwKSwKICAgICAgYWZ0ZXI6IGVzY2FwZVN0cmluZ1JlZ2V4cChvcGVuLmNoYXJBdCgxKSkKICAgIH0pOwogIH0KICByZXR1cm4geyB1bnNhZmU6IHVuc2FmZTIsIGhhbmRsZXJzOiBoYW5kbGVyczIgfTsKfQpfX25hbWUoZnJvbnRtYXR0ZXJUb01hcmtkb3duLCAiZnJvbnRtYXR0ZXJUb01hcmtkb3duIik7CmZ1bmN0aW9uIGhhbmRsZXIobWF0dGVyMikgewogIGNvbnN0IG9wZW4gPSBmZW5jZTIobWF0dGVyMiwgIm9wZW4iKTsKICBjb25zdCBjbG9zZTcgPSBmZW5jZTIobWF0dGVyMiwgImNsb3NlIik7CiAgcmV0dXJuIGhhbmRsZTM7CiAgZnVuY3Rpb24gaGFuZGxlMyhub2RlMikgewogICAgcmV0dXJuIG9wZW4gKyAobm9kZTIudmFsdWUgPyAiXG4iICsgbm9kZTIudmFsdWUgOiAiIikgKyAiXG4iICsgY2xvc2U3OwogIH0KICBfX25hbWUoaGFuZGxlMywgImhhbmRsZSIpOwp9Cl9fbmFtZShoYW5kbGVyLCAiaGFuZGxlciIpOwpmdW5jdGlvbiBmZW5jZTIobWF0dGVyMiwgcHJvcCkgewogIHJldHVybiBtYXR0ZXIyLm1hcmtlciA/IHBpY2syKG1hdHRlcjIubWFya2VyLCBwcm9wKS5yZXBlYXQoMykgOiAoCiAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBUaGV54oCZcmUgbXV0dWFsbHkgZXhjbHVzaXZlLgogICAgcGljazIobWF0dGVyMi5mZW5jZSwgcHJvcCkKICApOwp9Cl9fbmFtZShmZW5jZTIsICJmZW5jZSIpOwpmdW5jdGlvbiBwaWNrMihzY2hlbWEsIHByb3ApIHsKICByZXR1cm4gdHlwZW9mIHNjaGVtYSA9PT0gInN0cmluZyIgPyBzY2hlbWEgOiBzY2hlbWFbcHJvcF07Cn0KX19uYW1lKHBpY2syLCAicGljayIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3JlbWFyay1mcm9udG1hdHRlckA1LjAuMC9ub2RlX21vZHVsZXMvcmVtYXJrLWZyb250bWF0dGVyL2xpYi9pbmRleC5qcwp2YXIgZW1wdHlPcHRpb25zNCA9ICJ5YW1sIjsKZnVuY3Rpb24gcmVtYXJrRnJvbnRtYXR0ZXIob3B0aW9ucykgewogIGNvbnN0IHNlbGYyID0gKAogICAgLyoqIEB0eXBlIHtQcm9jZXNzb3J9ICovCiAgICB0aGlzCiAgKTsKICBjb25zdCBzZXR0aW5ncyA9IG9wdGlvbnMgfHwgZW1wdHlPcHRpb25zNDsKICBjb25zdCBkYXRhID0gc2VsZjIuZGF0YSgpOwogIGNvbnN0IG1pY3JvbWFya0V4dGVuc2lvbnMgPSBkYXRhLm1pY3JvbWFya0V4dGVuc2lvbnMgfHwgKGRhdGEubWljcm9tYXJrRXh0ZW5zaW9ucyA9IFtdKTsKICBjb25zdCBmcm9tTWFya2Rvd25FeHRlbnNpb25zID0gZGF0YS5mcm9tTWFya2Rvd25FeHRlbnNpb25zIHx8IChkYXRhLmZyb21NYXJrZG93bkV4dGVuc2lvbnMgPSBbXSk7CiAgY29uc3QgdG9NYXJrZG93bkV4dGVuc2lvbnMgPSBkYXRhLnRvTWFya2Rvd25FeHRlbnNpb25zIHx8IChkYXRhLnRvTWFya2Rvd25FeHRlbnNpb25zID0gW10pOwogIG1pY3JvbWFya0V4dGVuc2lvbnMucHVzaChmcm9udG1hdHRlcihzZXR0aW5ncykpOwogIGZyb21NYXJrZG93bkV4dGVuc2lvbnMucHVzaChmcm9udG1hdHRlckZyb21NYXJrZG93bihzZXR0aW5ncykpOwogIHRvTWFya2Rvd25FeHRlbnNpb25zLnB1c2goZnJvbnRtYXR0ZXJUb01hcmtkb3duKHNldHRpbmdzKSk7Cn0KX19uYW1lKHJlbWFya0Zyb250bWF0dGVyLCAicmVtYXJrRnJvbnRtYXR0ZXIiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdW5nYXArc3RydWN0dXJlZC1jbG9uZUAxLjMuMC9ub2RlX21vZHVsZXMvQHVuZ2FwL3N0cnVjdHVyZWQtY2xvbmUvZXNtL3R5cGVzLmpzCnZhciBWT0lEID0gLTE7CnZhciBQUklNSVRJVkUgPSAwOwp2YXIgQVJSQVkgPSAxOwp2YXIgT0JKRUNUID0gMjsKdmFyIERBVEUgPSAzOwp2YXIgUkVHRVhQID0gNDsKdmFyIE1BUCA9IDU7CnZhciBTRVQgPSA2Owp2YXIgRVJST1IgPSA3Owp2YXIgQklHSU5UID0gODsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdW5nYXArc3RydWN0dXJlZC1jbG9uZUAxLjMuMC9ub2RlX21vZHVsZXMvQHVuZ2FwL3N0cnVjdHVyZWQtY2xvbmUvZXNtL2Rlc2VyaWFsaXplLmpzCnZhciBlbnYgPSB0eXBlb2Ygc2VsZiA9PT0gIm9iamVjdCIgPyBzZWxmIDogZ2xvYmFsVGhpczsKdmFyIGRlc2VyaWFsaXplciA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKCQzLCBfMykgPT4gewogIGNvbnN0IGFzID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgob3V0LCBpbmRleDIpID0+IHsKICAgICQzLnNldChpbmRleDIsIG91dCk7CiAgICByZXR1cm4gb3V0OwogIH0sICJhcyIpOwogIGNvbnN0IHVucGFpciA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGluZGV4MikgPT4gewogICAgaWYgKCQzLmhhcyhpbmRleDIpKQogICAgICByZXR1cm4gJDMuZ2V0KGluZGV4Mik7CiAgICBjb25zdCBbdHlwZTUsIHZhbHVlMl0gPSBfM1tpbmRleDJdOwogICAgc3dpdGNoICh0eXBlNSkgewogICAgICBjYXNlIFBSSU1JVElWRToKICAgICAgY2FzZSBWT0lEOgogICAgICAgIHJldHVybiBhcyh2YWx1ZTIsIGluZGV4Mik7CiAgICAgIGNhc2UgQVJSQVk6IHsKICAgICAgICBjb25zdCBhcnIgPSBhcyhbXSwgaW5kZXgyKTsKICAgICAgICBmb3IgKGNvbnN0IGluZGV4MyBvZiB2YWx1ZTIpCiAgICAgICAgICBhcnIucHVzaCh1bnBhaXIoaW5kZXgzKSk7CiAgICAgICAgcmV0dXJuIGFycjsKICAgICAgfQogICAgICBjYXNlIE9CSkVDVDogewogICAgICAgIGNvbnN0IG9iamVjdCA9IGFzKHt9LCBpbmRleDIpOwogICAgICAgIGZvciAoY29uc3QgW2tleTIsIGluZGV4M10gb2YgdmFsdWUyKQogICAgICAgICAgb2JqZWN0W3VucGFpcihrZXkyKV0gPSB1bnBhaXIoaW5kZXgzKTsKICAgICAgICByZXR1cm4gb2JqZWN0OwogICAgICB9CiAgICAgIGNhc2UgREFURToKICAgICAgICByZXR1cm4gYXMobmV3IERhdGUodmFsdWUyKSwgaW5kZXgyKTsKICAgICAgY2FzZSBSRUdFWFA6IHsKICAgICAgICBjb25zdCB7IHNvdXJjZSwgZmxhZ3MgfSA9IHZhbHVlMjsKICAgICAgICByZXR1cm4gYXMobmV3IFJlZ0V4cChzb3VyY2UsIGZsYWdzKSwgaW5kZXgyKTsKICAgICAgfQogICAgICBjYXNlIE1BUDogewogICAgICAgIGNvbnN0IG1hcDcgPSBhcygvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLCBpbmRleDIpOwogICAgICAgIGZvciAoY29uc3QgW2tleTIsIGluZGV4M10gb2YgdmFsdWUyKQogICAgICAgICAgbWFwNy5zZXQodW5wYWlyKGtleTIpLCB1bnBhaXIoaW5kZXgzKSk7CiAgICAgICAgcmV0dXJuIG1hcDc7CiAgICAgIH0KICAgICAgY2FzZSBTRVQ6IHsKICAgICAgICBjb25zdCBzZXQyID0gYXMoLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSwgaW5kZXgyKTsKICAgICAgICBmb3IgKGNvbnN0IGluZGV4MyBvZiB2YWx1ZTIpCiAgICAgICAgICBzZXQyLmFkZCh1bnBhaXIoaW5kZXgzKSk7CiAgICAgICAgcmV0dXJuIHNldDI7CiAgICAgIH0KICAgICAgY2FzZSBFUlJPUjogewogICAgICAgIGNvbnN0IHsgbmFtZSwgbWVzc2FnZTogbWVzc2FnZTIgfSA9IHZhbHVlMjsKICAgICAgICByZXR1cm4gYXMobmV3IGVudltuYW1lXShtZXNzYWdlMiksIGluZGV4Mik7CiAgICAgIH0KICAgICAgY2FzZSBCSUdJTlQ6CiAgICAgICAgcmV0dXJuIGFzKEJpZ0ludCh2YWx1ZTIpLCBpbmRleDIpOwogICAgICBjYXNlICJCaWdJbnQiOgogICAgICAgIHJldHVybiBhcyhPYmplY3QoQmlnSW50KHZhbHVlMikpLCBpbmRleDIpOwogICAgICBjYXNlICJBcnJheUJ1ZmZlciI6CiAgICAgICAgcmV0dXJuIGFzKG5ldyBVaW50OEFycmF5KHZhbHVlMikuYnVmZmVyLCB2YWx1ZTIpOwogICAgICBjYXNlICJEYXRhVmlldyI6IHsKICAgICAgICBjb25zdCB7IGJ1ZmZlcjogYnVmZmVyMiB9ID0gbmV3IFVpbnQ4QXJyYXkodmFsdWUyKTsKICAgICAgICByZXR1cm4gYXMobmV3IERhdGFWaWV3KGJ1ZmZlcjIpLCB2YWx1ZTIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gYXMobmV3IGVudlt0eXBlNV0odmFsdWUyKSwgaW5kZXgyKTsKICB9LCAidW5wYWlyIik7CiAgcmV0dXJuIHVucGFpcjsKfSwgImRlc2VyaWFsaXplciIpOwp2YXIgZGVzZXJpYWxpemUgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChzZXJpYWxpemVkKSA9PiBkZXNlcmlhbGl6ZXIoLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSwgc2VyaWFsaXplZCkoMCksICJkZXNlcmlhbGl6ZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B1bmdhcCtzdHJ1Y3R1cmVkLWNsb25lQDEuMy4wL25vZGVfbW9kdWxlcy9AdW5nYXAvc3RydWN0dXJlZC1jbG9uZS9lc20vc2VyaWFsaXplLmpzCnZhciBFTVBUWTIgPSAiIjsKdmFyIHsgdG9TdHJpbmc6IHRvU3RyaW5nMiB9ID0ge307CnZhciB7IGtleXMgfSA9IE9iamVjdDsKdmFyIHR5cGVPZiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHZhbHVlMikgPT4gewogIGNvbnN0IHR5cGU1ID0gdHlwZW9mIHZhbHVlMjsKICBpZiAodHlwZTUgIT09ICJvYmplY3QiIHx8ICF2YWx1ZTIpCiAgICByZXR1cm4gW1BSSU1JVElWRSwgdHlwZTVdOwogIGNvbnN0IGFzU3RyaW5nID0gdG9TdHJpbmcyLmNhbGwodmFsdWUyKS5zbGljZSg4LCAtMSk7CiAgc3dpdGNoIChhc1N0cmluZykgewogICAgY2FzZSAiQXJyYXkiOgogICAgICByZXR1cm4gW0FSUkFZLCBFTVBUWTJdOwogICAgY2FzZSAiT2JqZWN0IjoKICAgICAgcmV0dXJuIFtPQkpFQ1QsIEVNUFRZMl07CiAgICBjYXNlICJEYXRlIjoKICAgICAgcmV0dXJuIFtEQVRFLCBFTVBUWTJdOwogICAgY2FzZSAiUmVnRXhwIjoKICAgICAgcmV0dXJuIFtSRUdFWFAsIEVNUFRZMl07CiAgICBjYXNlICJNYXAiOgogICAgICByZXR1cm4gW01BUCwgRU1QVFkyXTsKICAgIGNhc2UgIlNldCI6CiAgICAgIHJldHVybiBbU0VULCBFTVBUWTJdOwogICAgY2FzZSAiRGF0YVZpZXciOgogICAgICByZXR1cm4gW0FSUkFZLCBhc1N0cmluZ107CiAgfQogIGlmIChhc1N0cmluZy5pbmNsdWRlcygiQXJyYXkiKSkKICAgIHJldHVybiBbQVJSQVksIGFzU3RyaW5nXTsKICBpZiAoYXNTdHJpbmcuaW5jbHVkZXMoIkVycm9yIikpCiAgICByZXR1cm4gW0VSUk9SLCBhc1N0cmluZ107CiAgcmV0dXJuIFtPQkpFQ1QsIGFzU3RyaW5nXTsKfSwgInR5cGVPZiIpOwp2YXIgc2hvdWxkU2tpcCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKFtUWVBFLCB0eXBlNV0pID0+IFRZUEUgPT09IFBSSU1JVElWRSAmJiAodHlwZTUgPT09ICJmdW5jdGlvbiIgfHwgdHlwZTUgPT09ICJzeW1ib2wiKSwgInNob3VsZFNraXAiKTsKdmFyIHNlcmlhbGl6ZXIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChzdHJpY3QsIGpzb24sICQzLCBfMykgPT4gewogIGNvbnN0IGFzID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgob3V0LCB2YWx1ZTIpID0+IHsKICAgIGNvbnN0IGluZGV4MiA9IF8zLnB1c2gob3V0KSAtIDE7CiAgICAkMy5zZXQodmFsdWUyLCBpbmRleDIpOwogICAgcmV0dXJuIGluZGV4MjsKICB9LCAiYXMiKTsKICBjb25zdCBwYWlyID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgodmFsdWUyKSA9PiB7CiAgICBpZiAoJDMuaGFzKHZhbHVlMikpCiAgICAgIHJldHVybiAkMy5nZXQodmFsdWUyKTsKICAgIGxldCBbVFlQRSwgdHlwZTVdID0gdHlwZU9mKHZhbHVlMik7CiAgICBzd2l0Y2ggKFRZUEUpIHsKICAgICAgY2FzZSBQUklNSVRJVkU6IHsKICAgICAgICBsZXQgZW50cnkgPSB2YWx1ZTI7CiAgICAgICAgc3dpdGNoICh0eXBlNSkgewogICAgICAgICAgY2FzZSAiYmlnaW50IjoKICAgICAgICAgICAgVFlQRSA9IEJJR0lOVDsKICAgICAgICAgICAgZW50cnkgPSB2YWx1ZTIudG9TdHJpbmcoKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJmdW5jdGlvbiI6CiAgICAgICAgICBjYXNlICJzeW1ib2wiOgogICAgICAgICAgICBpZiAoc3RyaWN0KQogICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoInVuYWJsZSB0byBzZXJpYWxpemUgIiArIHR5cGU1KTsKICAgICAgICAgICAgZW50cnkgPSBudWxsOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgInVuZGVmaW5lZCI6CiAgICAgICAgICAgIHJldHVybiBhcyhbVk9JRF0sIHZhbHVlMik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhcyhbVFlQRSwgZW50cnldLCB2YWx1ZTIpOwogICAgICB9CiAgICAgIGNhc2UgQVJSQVk6IHsKICAgICAgICBpZiAodHlwZTUpIHsKICAgICAgICAgIGxldCBzcHJlYWQgPSB2YWx1ZTI7CiAgICAgICAgICBpZiAodHlwZTUgPT09ICJEYXRhVmlldyIpIHsKICAgICAgICAgICAgc3ByZWFkID0gbmV3IFVpbnQ4QXJyYXkodmFsdWUyLmJ1ZmZlcik7CiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGU1ID09PSAiQXJyYXlCdWZmZXIiKSB7CiAgICAgICAgICAgIHNwcmVhZCA9IG5ldyBVaW50OEFycmF5KHZhbHVlMik7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gYXMoW3R5cGU1LCBbLi4uc3ByZWFkXV0sIHZhbHVlMik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGFyciA9IFtdOwogICAgICAgIGNvbnN0IGluZGV4MiA9IGFzKFtUWVBFLCBhcnJdLCB2YWx1ZTIpOwogICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgdmFsdWUyKQogICAgICAgICAgYXJyLnB1c2gocGFpcihlbnRyeSkpOwogICAgICAgIHJldHVybiBpbmRleDI7CiAgICAgIH0KICAgICAgY2FzZSBPQkpFQ1Q6IHsKICAgICAgICBpZiAodHlwZTUpIHsKICAgICAgICAgIHN3aXRjaCAodHlwZTUpIHsKICAgICAgICAgICAgY2FzZSAiQmlnSW50IjoKICAgICAgICAgICAgICByZXR1cm4gYXMoW3R5cGU1LCB2YWx1ZTIudG9TdHJpbmcoKV0sIHZhbHVlMik7CiAgICAgICAgICAgIGNhc2UgIkJvb2xlYW4iOgogICAgICAgICAgICBjYXNlICJOdW1iZXIiOgogICAgICAgICAgICBjYXNlICJTdHJpbmciOgogICAgICAgICAgICAgIHJldHVybiBhcyhbdHlwZTUsIHZhbHVlMi52YWx1ZU9mKCldLCB2YWx1ZTIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoanNvbiAmJiAidG9KU09OIiBpbiB2YWx1ZTIpCiAgICAgICAgICByZXR1cm4gcGFpcih2YWx1ZTIudG9KU09OKCkpOwogICAgICAgIGNvbnN0IGVudHJpZXMgPSBbXTsKICAgICAgICBjb25zdCBpbmRleDIgPSBhcyhbVFlQRSwgZW50cmllc10sIHZhbHVlMik7CiAgICAgICAgZm9yIChjb25zdCBrZXkyIG9mIGtleXModmFsdWUyKSkgewogICAgICAgICAgaWYgKHN0cmljdCB8fCAhc2hvdWxkU2tpcCh0eXBlT2YodmFsdWUyW2tleTJdKSkpCiAgICAgICAgICAgIGVudHJpZXMucHVzaChbcGFpcihrZXkyKSwgcGFpcih2YWx1ZTJba2V5Ml0pXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpbmRleDI7CiAgICAgIH0KICAgICAgY2FzZSBEQVRFOgogICAgICAgIHJldHVybiBhcyhbVFlQRSwgdmFsdWUyLnRvSVNPU3RyaW5nKCldLCB2YWx1ZTIpOwogICAgICBjYXNlIFJFR0VYUDogewogICAgICAgIGNvbnN0IHsgc291cmNlLCBmbGFncyB9ID0gdmFsdWUyOwogICAgICAgIHJldHVybiBhcyhbVFlQRSwgeyBzb3VyY2UsIGZsYWdzIH1dLCB2YWx1ZTIpOwogICAgICB9CiAgICAgIGNhc2UgTUFQOiB7CiAgICAgICAgY29uc3QgZW50cmllcyA9IFtdOwogICAgICAgIGNvbnN0IGluZGV4MiA9IGFzKFtUWVBFLCBlbnRyaWVzXSwgdmFsdWUyKTsKICAgICAgICBmb3IgKGNvbnN0IFtrZXkyLCBlbnRyeV0gb2YgdmFsdWUyKSB7CiAgICAgICAgICBpZiAoc3RyaWN0IHx8ICEoc2hvdWxkU2tpcCh0eXBlT2Yoa2V5MikpIHx8IHNob3VsZFNraXAodHlwZU9mKGVudHJ5KSkpKQogICAgICAgICAgICBlbnRyaWVzLnB1c2goW3BhaXIoa2V5MiksIHBhaXIoZW50cnkpXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpbmRleDI7CiAgICAgIH0KICAgICAgY2FzZSBTRVQ6IHsKICAgICAgICBjb25zdCBlbnRyaWVzID0gW107CiAgICAgICAgY29uc3QgaW5kZXgyID0gYXMoW1RZUEUsIGVudHJpZXNdLCB2YWx1ZTIpOwogICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgdmFsdWUyKSB7CiAgICAgICAgICBpZiAoc3RyaWN0IHx8ICFzaG91bGRTa2lwKHR5cGVPZihlbnRyeSkpKQogICAgICAgICAgICBlbnRyaWVzLnB1c2gocGFpcihlbnRyeSkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaW5kZXgyOwogICAgICB9CiAgICB9CiAgICBjb25zdCB7IG1lc3NhZ2U6IG1lc3NhZ2UyIH0gPSB2YWx1ZTI7CiAgICByZXR1cm4gYXMoW1RZUEUsIHsgbmFtZTogdHlwZTUsIG1lc3NhZ2U6IG1lc3NhZ2UyIH1dLCB2YWx1ZTIpOwogIH0sICJwYWlyIik7CiAgcmV0dXJuIHBhaXI7Cn0sICJzZXJpYWxpemVyIik7CnZhciBzZXJpYWxpemUyID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgodmFsdWUyLCB7IGpzb24sIGxvc3N5IH0gPSB7fSkgPT4gewogIGNvbnN0IF8zID0gW107CiAgcmV0dXJuIHNlcmlhbGl6ZXIoIShqc29uIHx8IGxvc3N5KSwgISFqc29uLCAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLCBfMykodmFsdWUyKSwgXzM7Cn0sICJzZXJpYWxpemUiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdW5nYXArc3RydWN0dXJlZC1jbG9uZUAxLjMuMC9ub2RlX21vZHVsZXMvQHVuZ2FwL3N0cnVjdHVyZWQtY2xvbmUvZXNtL2luZGV4LmpzCnZhciBlc21fZGVmYXVsdCA9IHR5cGVvZiBzdHJ1Y3R1cmVkQ2xvbmUgPT09ICJmdW5jdGlvbiIgPyAoCiAgLyogYzggaWdub3JlIHN0YXJ0ICovCiAgKGFueSwgb3B0aW9ucykgPT4gb3B0aW9ucyAmJiAoImpzb24iIGluIG9wdGlvbnMgfHwgImxvc3N5IiBpbiBvcHRpb25zKSA/IGRlc2VyaWFsaXplKHNlcmlhbGl6ZTIoYW55LCBvcHRpb25zKSkgOiBzdHJ1Y3R1cmVkQ2xvbmUoYW55KQopIDogKGFueSwgb3B0aW9ucykgPT4gZGVzZXJpYWxpemUoc2VyaWFsaXplMihhbnksIG9wdGlvbnMpKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS91bmlzdC11dGlsLXBvc2l0aW9uQDUuMC4wL25vZGVfbW9kdWxlcy91bmlzdC11dGlsLXBvc2l0aW9uL2xpYi9pbmRleC5qcwp2YXIgcG9pbnRFbmQgPSBwb2ludDMoImVuZCIpOwp2YXIgcG9pbnRTdGFydCA9IHBvaW50Mygic3RhcnQiKTsKZnVuY3Rpb24gcG9pbnQzKHR5cGU1KSB7CiAgcmV0dXJuIHBvaW50NDsKICBmdW5jdGlvbiBwb2ludDQobm9kZTIpIHsKICAgIGNvbnN0IHBvaW50NSA9IG5vZGUyICYmIG5vZGUyLnBvc2l0aW9uICYmIG5vZGUyLnBvc2l0aW9uW3R5cGU1XSB8fCB7fTsKICAgIGlmICh0eXBlb2YgcG9pbnQ1LmxpbmUgPT09ICJudW1iZXIiICYmIHBvaW50NS5saW5lID4gMCAmJiB0eXBlb2YgcG9pbnQ1LmNvbHVtbiA9PT0gIm51bWJlciIgJiYgcG9pbnQ1LmNvbHVtbiA+IDApIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBsaW5lOiBwb2ludDUubGluZSwKICAgICAgICBjb2x1bW46IHBvaW50NS5jb2x1bW4sCiAgICAgICAgb2Zmc2V0OiB0eXBlb2YgcG9pbnQ1Lm9mZnNldCA9PT0gIm51bWJlciIgJiYgcG9pbnQ1Lm9mZnNldCA+IC0xID8gcG9pbnQ1Lm9mZnNldCA6IHZvaWQgMAogICAgICB9OwogICAgfQogIH0KICBfX25hbWUocG9pbnQ0LCAicG9pbnQiKTsKfQpfX25hbWUocG9pbnQzLCAicG9pbnQiKTsKZnVuY3Rpb24gcG9zaXRpb24yKG5vZGUyKSB7CiAgY29uc3Qgc3RhcnQgPSBwb2ludFN0YXJ0KG5vZGUyKTsKICBjb25zdCBlbmQgPSBwb2ludEVuZChub2RlMik7CiAgaWYgKHN0YXJ0ICYmIGVuZCkgewogICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9OwogIH0KfQpfX25hbWUocG9zaXRpb24yLCAicG9zaXRpb24iKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9oYXN0LXV0aWwtc2FuaXRpemVANS4wLjIvbm9kZV9tb2R1bGVzL2hhc3QtdXRpbC1zYW5pdGl6ZS9saWIvc2NoZW1hLmpzCnZhciBhcmlhID0gWyJhcmlhRGVzY3JpYmVkQnkiLCAiYXJpYUxhYmVsIiwgImFyaWFMYWJlbGxlZEJ5Il07CnZhciBkZWZhdWx0U2NoZW1hID0gewogIGFuY2VzdG9yczogewogICAgdGJvZHk6IFsidGFibGUiXSwKICAgIHRkOiBbInRhYmxlIl0sCiAgICB0aDogWyJ0YWJsZSJdLAogICAgdGhlYWQ6IFsidGFibGUiXSwKICAgIHRmb290OiBbInRhYmxlIl0sCiAgICB0cjogWyJ0YWJsZSJdCiAgfSwKICBhdHRyaWJ1dGVzOiB7CiAgICBhOiBbCiAgICAgIC4uLmFyaWEsCiAgICAgIC8vIE5vdGU6IHRoZXNlIDMgYXJlIHVzZWQgYnkgR0ZNIGZvb3Rub3RlcywgdGhleSBkbyB3b3JrIG9uIGFsbCBsaW5rcy4KICAgICAgImRhdGFGb290bm90ZUJhY2tyZWYiLAogICAgICAiZGF0YUZvb3Rub3RlUmVmIiwKICAgICAgWyJjbGFzc05hbWUiLCAiZGF0YS1mb290bm90ZS1iYWNrcmVmIl0sCiAgICAgICJocmVmIgogICAgXSwKICAgIGJsb2NrcXVvdGU6IFsiY2l0ZSJdLAogICAgLy8gTm90ZTogdGhpcyBjbGFzcyBpcyBub3Qgbm9ybWFsbHkgYWxsb3dlZCBieSBHSCwgd2hlbiBtYW51YWxseSB3cml0aW5nCiAgICAvLyBgY29kZWAgYXMgSFRNTCBpbiBtYXJrZG93biwgdGhleSBhZGRzIGl0IHNvbWUgb3RoZXIgd2F5LgogICAgLy8gV2UgY2Fu4oCZdCBkbyB0aGF0LCBzbyB3ZSBoYXZlIHRvIGFsbG93IGl0LgogICAgY29kZTogW1siY2xhc3NOYW1lIiwgL15sYW5ndWFnZS0uL11dLAogICAgZGVsOiBbImNpdGUiXSwKICAgIGRpdjogWyJpdGVtU2NvcGUiLCAiaXRlbVR5cGUiXSwKICAgIGRsOiBbLi4uYXJpYV0sCiAgICAvLyBOb3RlOiB0aGlzIGlzIHVzZWQgYnkgR0ZNIGZvb3Rub3Rlcy4KICAgIGgyOiBbWyJjbGFzc05hbWUiLCAic3Itb25seSJdXSwKICAgIGltZzogWy4uLmFyaWEsICJsb25nRGVzYyIsICJzcmMiXSwKICAgIC8vIE5vdGU6IGBpbnB1dGAgaXMgbm90IG5vcm1hbGx5IGFsbG93ZWQgYnkgR0gsIHdoZW4gbWFudWFsbHkgd3JpdGluZwogICAgLy8gaXQgaW4gbWFya2Rvd24sIHRoZXkgYWRkIGl0IGZyb20gdGFza2xpc3RzIHNvbWUgb3RoZXIgd2F5LgogICAgLy8gV2UgY2Fu4oCZdCBkbyB0aGF0LCBzbyB3ZSBoYXZlIHRvIGFsbG93IGl0LgogICAgaW5wdXQ6IFsKICAgICAgWyJkaXNhYmxlZCIsIHRydWVdLAogICAgICBbInR5cGUiLCAiY2hlY2tib3giXQogICAgXSwKICAgIGluczogWyJjaXRlIl0sCiAgICAvLyBOb3RlOiB0aGlzIGNsYXNzIGlzIG5vdCBub3JtYWxseSBhbGxvd2VkIGJ5IEdILCB3aGVuIG1hbnVhbGx5IHdyaXRpbmcKICAgIC8vIGBsaWAgYXMgSFRNTCBpbiBtYXJrZG93biwgdGhleSBhZGRzIGl0IHNvbWUgb3RoZXIgd2F5LgogICAgLy8gV2UgY2Fu4oCZdCBkbyB0aGF0LCBzbyB3ZSBoYXZlIHRvIGFsbG93IGl0LgogICAgbGk6IFtbImNsYXNzTmFtZSIsICJ0YXNrLWxpc3QtaXRlbSJdXSwKICAgIC8vIE5vdGU6IHRoaXMgY2xhc3MgaXMgbm90IG5vcm1hbGx5IGFsbG93ZWQgYnkgR0gsIHdoZW4gbWFudWFsbHkgd3JpdGluZwogICAgLy8gYG9sYCBhcyBIVE1MIGluIG1hcmtkb3duLCB0aGV5IGFkZHMgaXQgc29tZSBvdGhlciB3YXkuCiAgICAvLyBXZSBjYW7igJl0IGRvIHRoYXQsIHNvIHdlIGhhdmUgdG8gYWxsb3cgaXQuCiAgICBvbDogWy4uLmFyaWEsIFsiY2xhc3NOYW1lIiwgImNvbnRhaW5zLXRhc2stbGlzdCJdXSwKICAgIHE6IFsiY2l0ZSJdLAogICAgc2VjdGlvbjogWyJkYXRhRm9vdG5vdGVzIiwgWyJjbGFzc05hbWUiLCAiZm9vdG5vdGVzIl1dLAogICAgc291cmNlOiBbInNyY1NldCJdLAogICAgc3VtbWFyeTogWy4uLmFyaWFdLAogICAgdGFibGU6IFsuLi5hcmlhXSwKICAgIC8vIE5vdGU6IHRoaXMgY2xhc3MgaXMgbm90IG5vcm1hbGx5IGFsbG93ZWQgYnkgR0gsIHdoZW4gbWFudWFsbHkgd3JpdGluZwogICAgLy8gYG9sYCBhcyBIVE1MIGluIG1hcmtkb3duLCB0aGV5IGFkZHMgaXQgc29tZSBvdGhlciB3YXkuCiAgICAvLyBXZSBjYW7igJl0IGRvIHRoYXQsIHNvIHdlIGhhdmUgdG8gYWxsb3cgaXQuCiAgICB1bDogWy4uLmFyaWEsIFsiY2xhc3NOYW1lIiwgImNvbnRhaW5zLXRhc2stbGlzdCJdXSwKICAgICIqIjogWwogICAgICAiYWJiciIsCiAgICAgICJhY2NlcHQiLAogICAgICAiYWNjZXB0Q2hhcnNldCIsCiAgICAgICJhY2Nlc3NLZXkiLAogICAgICAiYWN0aW9uIiwKICAgICAgImFsaWduIiwKICAgICAgImFsdCIsCiAgICAgICJheGlzIiwKICAgICAgImJvcmRlciIsCiAgICAgICJjZWxsUGFkZGluZyIsCiAgICAgICJjZWxsU3BhY2luZyIsCiAgICAgICJjaGFyIiwKICAgICAgImNoYXJPZmYiLAogICAgICAiY2hhclNldCIsCiAgICAgICJjaGVja2VkIiwKICAgICAgImNsZWFyIiwKICAgICAgImNvbFNwYW4iLAogICAgICAiY29sb3IiLAogICAgICAiY29scyIsCiAgICAgICJjb21wYWN0IiwKICAgICAgImNvb3JkcyIsCiAgICAgICJkYXRlVGltZSIsCiAgICAgICJkaXIiLAogICAgICAvLyBOb3RlOiBgZGlzYWJsZWRgIGlzIHRlY2huaWNhbGx5IGFsbG93ZWQgb24gYWxsIGVsZW1lbnRzIGJ5IEdILgogICAgICAvLyBCdXQgaXQgaXMgdXNlbGVzcyBvbiBldmVyeXRoaW5nIGV4Y2VwdCBgaW5wdXRgLgogICAgICAvLyBCZWNhdXNlIGBpbnB1dGBzIGFyZSBub3JtYWxseSBub3QgYWxsb3dlZCwgYnV0IHdlIGFsbG93IHRoZW0gZm9yCiAgICAgIC8vIGNoZWNrYm94ZXMgZHVlIHRvIHRhc2tsaXN0cywgd2UgYWxsb3cgYGRpc2FibGVkYCBvbmx5IHRoZXJlLgogICAgICAiZW5jVHlwZSIsCiAgICAgICJmcmFtZSIsCiAgICAgICJoU3BhY2UiLAogICAgICAiaGVhZGVycyIsCiAgICAgICJoZWlnaHQiLAogICAgICAiaHJlZkxhbmciLAogICAgICAiaHRtbEZvciIsCiAgICAgICJpZCIsCiAgICAgICJpc01hcCIsCiAgICAgICJpdGVtUHJvcCIsCiAgICAgICJsYWJlbCIsCiAgICAgICJsYW5nIiwKICAgICAgIm1heExlbmd0aCIsCiAgICAgICJtZWRpYSIsCiAgICAgICJtZXRob2QiLAogICAgICAibXVsdGlwbGUiLAogICAgICAibmFtZSIsCiAgICAgICJub0hyZWYiLAogICAgICAibm9TaGFkZSIsCiAgICAgICJub1dyYXAiLAogICAgICAib3BlbiIsCiAgICAgICJwcm9tcHQiLAogICAgICAicmVhZE9ubHkiLAogICAgICAicmV2IiwKICAgICAgInJvd1NwYW4iLAogICAgICAicm93cyIsCiAgICAgICJydWxlcyIsCiAgICAgICJzY29wZSIsCiAgICAgICJzZWxlY3RlZCIsCiAgICAgICJzaGFwZSIsCiAgICAgICJzaXplIiwKICAgICAgInNwYW4iLAogICAgICAic3RhcnQiLAogICAgICAic3VtbWFyeSIsCiAgICAgICJ0YWJJbmRleCIsCiAgICAgICJ0aXRsZSIsCiAgICAgICJ1c2VNYXAiLAogICAgICAidkFsaWduIiwKICAgICAgInZhbHVlIiwKICAgICAgIndpZHRoIgogICAgXQogIH0sCiAgY2xvYmJlcjogWyJhcmlhRGVzY3JpYmVkQnkiLCAiYXJpYUxhYmVsbGVkQnkiLCAiaWQiLCAibmFtZSJdLAogIGNsb2JiZXJQcmVmaXg6ICJ1c2VyLWNvbnRlbnQtIiwKICBwcm90b2NvbHM6IHsKICAgIGNpdGU6IFsiaHR0cCIsICJodHRwcyJdLAogICAgaHJlZjogWyJodHRwIiwgImh0dHBzIiwgImlyYyIsICJpcmNzIiwgIm1haWx0byIsICJ4bXBwIl0sCiAgICBsb25nRGVzYzogWyJodHRwIiwgImh0dHBzIl0sCiAgICBzcmM6IFsiaHR0cCIsICJodHRwcyJdCiAgfSwKICByZXF1aXJlZDogewogICAgaW5wdXQ6IHsgZGlzYWJsZWQ6IHRydWUsIHR5cGU6ICJjaGVja2JveCIgfQogIH0sCiAgc3RyaXA6IFsic2NyaXB0Il0sCiAgdGFnTmFtZXM6IFsKICAgICJhIiwKICAgICJiIiwKICAgICJibG9ja3F1b3RlIiwKICAgICJiciIsCiAgICAiY29kZSIsCiAgICAiZGQiLAogICAgImRlbCIsCiAgICAiZGV0YWlscyIsCiAgICAiZGl2IiwKICAgICJkbCIsCiAgICAiZHQiLAogICAgImVtIiwKICAgICJoMSIsCiAgICAiaDIiLAogICAgImgzIiwKICAgICJoNCIsCiAgICAiaDUiLAogICAgImg2IiwKICAgICJociIsCiAgICAiaSIsCiAgICAiaW1nIiwKICAgIC8vIE5vdGU6IGBpbnB1dGAgaXMgbm90IG5vcm1hbGx5IGFsbG93ZWQgYnkgR0gsIHdoZW4gbWFudWFsbHkgd3JpdGluZwogICAgLy8gaXQgaW4gbWFya2Rvd24sIHRoZXkgYWRkIGl0IGZyb20gdGFza2xpc3RzIHNvbWUgb3RoZXIgd2F5LgogICAgLy8gV2UgY2Fu4oCZdCBkbyB0aGF0LCBzbyB3ZSBoYXZlIHRvIGFsbG93IGl0LgogICAgImlucHV0IiwKICAgICJpbnMiLAogICAgImtiZCIsCiAgICAibGkiLAogICAgIm9sIiwKICAgICJwIiwKICAgICJwaWN0dXJlIiwKICAgICJwcmUiLAogICAgInEiLAogICAgInJwIiwKICAgICJydCIsCiAgICAicnVieSIsCiAgICAicyIsCiAgICAic2FtcCIsCiAgICAic2VjdGlvbiIsCiAgICAic291cmNlIiwKICAgICJzcGFuIiwKICAgICJzdHJpa2UiLAogICAgInN0cm9uZyIsCiAgICAic3ViIiwKICAgICJzdW1tYXJ5IiwKICAgICJzdXAiLAogICAgInRhYmxlIiwKICAgICJ0Ym9keSIsCiAgICAidGQiLAogICAgInRmb290IiwKICAgICJ0aCIsCiAgICAidGhlYWQiLAogICAgInRyIiwKICAgICJ0dCIsCiAgICAidWwiLAogICAgInZhciIKICBdCn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vaGFzdC11dGlsLXNhbml0aXplQDUuMC4yL25vZGVfbW9kdWxlcy9oYXN0LXV0aWwtc2FuaXRpemUvbGliL2luZGV4LmpzCnZhciBvd243ID0ge30uaGFzT3duUHJvcGVydHk7CmZ1bmN0aW9uIHNhbml0aXplKG5vZGUyLCBvcHRpb25zKSB7CiAgbGV0IHJlc3VsdCA9IHsgdHlwZTogInJvb3QiLCBjaGlsZHJlbjogW10gfTsKICBjb25zdCBzdGF0ZSA9IHsKICAgIHNjaGVtYTogb3B0aW9ucyA/IHsgLi4uZGVmYXVsdFNjaGVtYSwgLi4ub3B0aW9ucyB9IDogZGVmYXVsdFNjaGVtYSwKICAgIHN0YWNrOiBbXQogIH07CiAgY29uc3QgcmVwbGFjZTMgPSB0cmFuc2Zvcm0oc3RhdGUsIG5vZGUyKTsKICBpZiAocmVwbGFjZTMpIHsKICAgIGlmIChBcnJheS5pc0FycmF5KHJlcGxhY2UzKSkgewogICAgICBpZiAocmVwbGFjZTMubGVuZ3RoID09PSAxKSB7CiAgICAgICAgcmVzdWx0ID0gcmVwbGFjZTNbMF07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzdWx0LmNoaWxkcmVuID0gcmVwbGFjZTM7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdCA9IHJlcGxhY2UzOwogICAgfQogIH0KICByZXR1cm4gcmVzdWx0Owp9Cl9fbmFtZShzYW5pdGl6ZSwgInNhbml0aXplIik7CmZ1bmN0aW9uIHRyYW5zZm9ybShzdGF0ZSwgbm9kZTIpIHsKICBpZiAobm9kZTIgJiYgdHlwZW9mIG5vZGUyID09PSAib2JqZWN0IikgewogICAgY29uc3QgdW5zYWZlMiA9ICgKICAgICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZWFkb25seTx1bmtub3duPj59ICovCiAgICAgIG5vZGUyCiAgICApOwogICAgY29uc3QgdHlwZTUgPSB0eXBlb2YgdW5zYWZlMi50eXBlID09PSAic3RyaW5nIiA/IHVuc2FmZTIudHlwZSA6ICIiOwogICAgc3dpdGNoICh0eXBlNSkgewogICAgICBjYXNlICJjb21tZW50IjogewogICAgICAgIHJldHVybiBjb21tZW50KHN0YXRlLCB1bnNhZmUyKTsKICAgICAgfQogICAgICBjYXNlICJkb2N0eXBlIjogewogICAgICAgIHJldHVybiBkb2N0eXBlKHN0YXRlLCB1bnNhZmUyKTsKICAgICAgfQogICAgICBjYXNlICJlbGVtZW50IjogewogICAgICAgIHJldHVybiBlbGVtZW50MihzdGF0ZSwgdW5zYWZlMik7CiAgICAgIH0KICAgICAgY2FzZSAicm9vdCI6IHsKICAgICAgICByZXR1cm4gcm9vdDIoc3RhdGUsIHVuc2FmZTIpOwogICAgICB9CiAgICAgIGNhc2UgInRleHQiOiB7CiAgICAgICAgcmV0dXJuIHRleHQ1KHN0YXRlLCB1bnNhZmUyKTsKICAgICAgfQogICAgICBkZWZhdWx0OgogICAgfQogIH0KfQpfX25hbWUodHJhbnNmb3JtLCAidHJhbnNmb3JtIik7CmZ1bmN0aW9uIGNvbW1lbnQoc3RhdGUsIHVuc2FmZTIpIHsKICBpZiAoc3RhdGUuc2NoZW1hLmFsbG93Q29tbWVudHMpIHsKICAgIGNvbnN0IHJlc3VsdCA9IHR5cGVvZiB1bnNhZmUyLnZhbHVlID09PSAic3RyaW5nIiA/IHVuc2FmZTIudmFsdWUgOiAiIjsKICAgIGNvbnN0IGluZGV4MiA9IHJlc3VsdC5pbmRleE9mKCItLT4iKTsKICAgIGNvbnN0IHZhbHVlMiA9IGluZGV4MiA8IDAgPyByZXN1bHQgOiByZXN1bHQuc2xpY2UoMCwgaW5kZXgyKTsKICAgIGNvbnN0IG5vZGUyID0geyB0eXBlOiAiY29tbWVudCIsIHZhbHVlOiB2YWx1ZTIgfTsKICAgIHBhdGNoKG5vZGUyLCB1bnNhZmUyKTsKICAgIHJldHVybiBub2RlMjsKICB9Cn0KX19uYW1lKGNvbW1lbnQsICJjb21tZW50Iik7CmZ1bmN0aW9uIGRvY3R5cGUoc3RhdGUsIHVuc2FmZTIpIHsKICBpZiAoc3RhdGUuc2NoZW1hLmFsbG93RG9jdHlwZXMpIHsKICAgIGNvbnN0IG5vZGUyID0geyB0eXBlOiAiZG9jdHlwZSIgfTsKICAgIHBhdGNoKG5vZGUyLCB1bnNhZmUyKTsKICAgIHJldHVybiBub2RlMjsKICB9Cn0KX19uYW1lKGRvY3R5cGUsICJkb2N0eXBlIik7CmZ1bmN0aW9uIGVsZW1lbnQyKHN0YXRlLCB1bnNhZmUyKSB7CiAgY29uc3QgbmFtZSA9IHR5cGVvZiB1bnNhZmUyLnRhZ05hbWUgPT09ICJzdHJpbmciID8gdW5zYWZlMi50YWdOYW1lIDogIiI7CiAgc3RhdGUuc3RhY2sucHVzaChuYW1lKTsKICBjb25zdCBjb250ZW50MyA9ICgKICAgIC8qKiBAdHlwZSB7QXJyYXk8RWxlbWVudENvbnRlbnQ+fSAqLwogICAgY2hpbGRyZW4oc3RhdGUsIHVuc2FmZTIuY2hpbGRyZW4pCiAgKTsKICBjb25zdCBwcm9wZXJ0aWVzXyA9IHByb3BlcnRpZXMoc3RhdGUsIHVuc2FmZTIucHJvcGVydGllcyk7CiAgc3RhdGUuc3RhY2sucG9wKCk7CiAgbGV0IHNhZmVFbGVtZW50ID0gZmFsc2U7CiAgaWYgKG5hbWUgJiYgbmFtZSAhPT0gIioiICYmICghc3RhdGUuc2NoZW1hLnRhZ05hbWVzIHx8IHN0YXRlLnNjaGVtYS50YWdOYW1lcy5pbmNsdWRlcyhuYW1lKSkpIHsKICAgIHNhZmVFbGVtZW50ID0gdHJ1ZTsKICAgIGlmIChzdGF0ZS5zY2hlbWEuYW5jZXN0b3JzICYmIG93bjcuY2FsbChzdGF0ZS5zY2hlbWEuYW5jZXN0b3JzLCBuYW1lKSkgewogICAgICBjb25zdCBhbmNlc3RvcnMgPSBzdGF0ZS5zY2hlbWEuYW5jZXN0b3JzW25hbWVdOwogICAgICBsZXQgaW5kZXgyID0gLTE7CiAgICAgIHNhZmVFbGVtZW50ID0gZmFsc2U7CiAgICAgIHdoaWxlICgrK2luZGV4MiA8IGFuY2VzdG9ycy5sZW5ndGgpIHsKICAgICAgICBpZiAoc3RhdGUuc3RhY2suaW5jbHVkZXMoYW5jZXN0b3JzW2luZGV4Ml0pKSB7CiAgICAgICAgICBzYWZlRWxlbWVudCA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIGlmICghc2FmZUVsZW1lbnQpIHsKICAgIHJldHVybiBzdGF0ZS5zY2hlbWEuc3RyaXAgJiYgIXN0YXRlLnNjaGVtYS5zdHJpcC5pbmNsdWRlcyhuYW1lKSA/IGNvbnRlbnQzIDogdm9pZCAwOwogIH0KICBjb25zdCBub2RlMiA9IHsKICAgIHR5cGU6ICJlbGVtZW50IiwKICAgIHRhZ05hbWU6IG5hbWUsCiAgICBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzXywKICAgIGNoaWxkcmVuOiBjb250ZW50MwogIH07CiAgcGF0Y2gobm9kZTIsIHVuc2FmZTIpOwogIHJldHVybiBub2RlMjsKfQpfX25hbWUoZWxlbWVudDIsICJlbGVtZW50Iik7CmZ1bmN0aW9uIHJvb3QyKHN0YXRlLCB1bnNhZmUyKSB7CiAgY29uc3QgY29udGVudDMgPSAoCiAgICAvKiogQHR5cGUge0FycmF5PFJvb3RDb250ZW50Pn0gKi8KICAgIGNoaWxkcmVuKHN0YXRlLCB1bnNhZmUyLmNoaWxkcmVuKQogICk7CiAgY29uc3Qgbm9kZTIgPSB7IHR5cGU6ICJyb290IiwgY2hpbGRyZW46IGNvbnRlbnQzIH07CiAgcGF0Y2gobm9kZTIsIHVuc2FmZTIpOwogIHJldHVybiBub2RlMjsKfQpfX25hbWUocm9vdDIsICJyb290Iik7CmZ1bmN0aW9uIHRleHQ1KF8zLCB1bnNhZmUyKSB7CiAgY29uc3QgdmFsdWUyID0gdHlwZW9mIHVuc2FmZTIudmFsdWUgPT09ICJzdHJpbmciID8gdW5zYWZlMi52YWx1ZSA6ICIiOwogIGNvbnN0IG5vZGUyID0geyB0eXBlOiAidGV4dCIsIHZhbHVlOiB2YWx1ZTIgfTsKICBwYXRjaChub2RlMiwgdW5zYWZlMik7CiAgcmV0dXJuIG5vZGUyOwp9Cl9fbmFtZSh0ZXh0NSwgInRleHQiKTsKZnVuY3Rpb24gY2hpbGRyZW4oc3RhdGUsIGNoaWxkcmVuMikgewogIGNvbnN0IHJlc3VsdHMgPSBbXTsKICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbjIpKSB7CiAgICBjb25zdCBjaGlsZHJlblVua25vd24gPSAoCiAgICAgIC8qKiBAdHlwZSB7QXJyYXk8UmVhZG9ubHk8dW5rbm93bj4+fSAqLwogICAgICBjaGlsZHJlbjIKICAgICk7CiAgICBsZXQgaW5kZXgyID0gLTE7CiAgICB3aGlsZSAoKytpbmRleDIgPCBjaGlsZHJlblVua25vd24ubGVuZ3RoKSB7CiAgICAgIGNvbnN0IHZhbHVlMiA9IHRyYW5zZm9ybShzdGF0ZSwgY2hpbGRyZW5Vbmtub3duW2luZGV4Ml0pOwogICAgICBpZiAodmFsdWUyKSB7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUyKSkgewogICAgICAgICAgcmVzdWx0cy5wdXNoKC4uLnZhbHVlMik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlc3VsdHMucHVzaCh2YWx1ZTIpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICByZXR1cm4gcmVzdWx0czsKfQpfX25hbWUoY2hpbGRyZW4sICJjaGlsZHJlbiIpOwpmdW5jdGlvbiBwcm9wZXJ0aWVzKHN0YXRlLCBwcm9wZXJ0aWVzMikgewogIGNvbnN0IHRhZ05hbWUgPSBzdGF0ZS5zdGFja1tzdGF0ZS5zdGFjay5sZW5ndGggLSAxXTsKICBjb25zdCBhdHRyaWJ1dGVzID0gc3RhdGUuc2NoZW1hLmF0dHJpYnV0ZXM7CiAgY29uc3QgcmVxdWlyZWQgPSBzdGF0ZS5zY2hlbWEucmVxdWlyZWQ7CiAgY29uc3Qgc3BlY2lmaWMgPSBhdHRyaWJ1dGVzICYmIG93bjcuY2FsbChhdHRyaWJ1dGVzLCB0YWdOYW1lKSA/IGF0dHJpYnV0ZXNbdGFnTmFtZV0gOiB2b2lkIDA7CiAgY29uc3QgZGVmYXVsdHMgPSBhdHRyaWJ1dGVzICYmIG93bjcuY2FsbChhdHRyaWJ1dGVzLCAiKiIpID8gYXR0cmlidXRlc1siKiJdIDogdm9pZCAwOwogIGNvbnN0IHByb3BlcnRpZXNfID0gKAogICAgLyoqIEB0eXBlIHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBSZWFkb25seTx1bmtub3duPj4+fSAqLwogICAgcHJvcGVydGllczIgJiYgdHlwZW9mIHByb3BlcnRpZXMyID09PSAib2JqZWN0IiA/IHByb3BlcnRpZXMyIDoge30KICApOwogIGNvbnN0IHJlc3VsdCA9IHt9OwogIGxldCBrZXkyOwogIGZvciAoa2V5MiBpbiBwcm9wZXJ0aWVzXykgewogICAgaWYgKG93bjcuY2FsbChwcm9wZXJ0aWVzXywga2V5MikpIHsKICAgICAgY29uc3QgdW5zYWZlMiA9IHByb3BlcnRpZXNfW2tleTJdOwogICAgICBsZXQgc2FmZTIgPSBwcm9wZXJ0eVZhbHVlKAogICAgICAgIHN0YXRlLAogICAgICAgIGZpbmREZWZpbml0aW9uKHNwZWNpZmljLCBrZXkyKSwKICAgICAgICBrZXkyLAogICAgICAgIHVuc2FmZTIKICAgICAgKTsKICAgICAgaWYgKHNhZmUyID09PSBudWxsIHx8IHNhZmUyID09PSB2b2lkIDApIHsKICAgICAgICBzYWZlMiA9IHByb3BlcnR5VmFsdWUoc3RhdGUsIGZpbmREZWZpbml0aW9uKGRlZmF1bHRzLCBrZXkyKSwga2V5MiwgdW5zYWZlMik7CiAgICAgIH0KICAgICAgaWYgKHNhZmUyICE9PSBudWxsICYmIHNhZmUyICE9PSB2b2lkIDApIHsKICAgICAgICByZXN1bHRba2V5Ml0gPSBzYWZlMjsKICAgICAgfQogICAgfQogIH0KICBpZiAocmVxdWlyZWQgJiYgb3duNy5jYWxsKHJlcXVpcmVkLCB0YWdOYW1lKSkgewogICAgY29uc3QgcHJvcGVydGllczMgPSByZXF1aXJlZFt0YWdOYW1lXTsKICAgIGZvciAoa2V5MiBpbiBwcm9wZXJ0aWVzMykgewogICAgICBpZiAob3duNy5jYWxsKHByb3BlcnRpZXMzLCBrZXkyKSAmJiAhb3duNy5jYWxsKHJlc3VsdCwga2V5MikpIHsKICAgICAgICByZXN1bHRba2V5Ml0gPSBwcm9wZXJ0aWVzM1trZXkyXTsKICAgICAgfQogICAgfQogIH0KICByZXR1cm4gcmVzdWx0Owp9Cl9fbmFtZShwcm9wZXJ0aWVzLCAicHJvcGVydGllcyIpOwpmdW5jdGlvbiBwcm9wZXJ0eVZhbHVlKHN0YXRlLCBkZWZpbml0aW9uMywga2V5MiwgdmFsdWUyKSB7CiAgcmV0dXJuIGRlZmluaXRpb24zID8gQXJyYXkuaXNBcnJheSh2YWx1ZTIpID8gcHJvcGVydHlWYWx1ZU1hbnkoc3RhdGUsIGRlZmluaXRpb24zLCBrZXkyLCB2YWx1ZTIpIDogcHJvcGVydHlWYWx1ZVByaW1pdGl2ZShzdGF0ZSwgZGVmaW5pdGlvbjMsIGtleTIsIHZhbHVlMikgOiB2b2lkIDA7Cn0KX19uYW1lKHByb3BlcnR5VmFsdWUsICJwcm9wZXJ0eVZhbHVlIik7CmZ1bmN0aW9uIHByb3BlcnR5VmFsdWVNYW55KHN0YXRlLCBkZWZpbml0aW9uMywga2V5MiwgdmFsdWVzKSB7CiAgbGV0IGluZGV4MiA9IC0xOwogIGNvbnN0IHJlc3VsdCA9IFtdOwogIHdoaWxlICgrK2luZGV4MiA8IHZhbHVlcy5sZW5ndGgpIHsKICAgIGNvbnN0IHZhbHVlMiA9IHByb3BlcnR5VmFsdWVQcmltaXRpdmUoc3RhdGUsIGRlZmluaXRpb24zLCBrZXkyLCB2YWx1ZXNbaW5kZXgyXSk7CiAgICBpZiAodHlwZW9mIHZhbHVlMiA9PT0gIm51bWJlciIgfHwgdHlwZW9mIHZhbHVlMiA9PT0gInN0cmluZyIpIHsKICAgICAgcmVzdWx0LnB1c2godmFsdWUyKTsKICAgIH0KICB9CiAgcmV0dXJuIHJlc3VsdDsKfQpfX25hbWUocHJvcGVydHlWYWx1ZU1hbnksICJwcm9wZXJ0eVZhbHVlTWFueSIpOwpmdW5jdGlvbiBwcm9wZXJ0eVZhbHVlUHJpbWl0aXZlKHN0YXRlLCBkZWZpbml0aW9uMywga2V5MiwgdmFsdWUyKSB7CiAgaWYgKHR5cGVvZiB2YWx1ZTIgIT09ICJib29sZWFuIiAmJiB0eXBlb2YgdmFsdWUyICE9PSAibnVtYmVyIiAmJiB0eXBlb2YgdmFsdWUyICE9PSAic3RyaW5nIikgewogICAgcmV0dXJuOwogIH0KICBpZiAoIXNhZmVQcm90b2NvbChzdGF0ZSwga2V5MiwgdmFsdWUyKSkgewogICAgcmV0dXJuOwogIH0KICBpZiAodHlwZW9mIGRlZmluaXRpb24zID09PSAib2JqZWN0IiAmJiBkZWZpbml0aW9uMy5sZW5ndGggPiAxKSB7CiAgICBsZXQgb2szID0gZmFsc2U7CiAgICBsZXQgaW5kZXgyID0gMDsKICAgIHdoaWxlICgrK2luZGV4MiA8IGRlZmluaXRpb24zLmxlbmd0aCkgewogICAgICBjb25zdCBhbGxvd2VkID0gZGVmaW5pdGlvbjNbaW5kZXgyXTsKICAgICAgaWYgKGFsbG93ZWQgJiYgdHlwZW9mIGFsbG93ZWQgPT09ICJvYmplY3QiICYmICJmbGFncyIgaW4gYWxsb3dlZCkgewogICAgICAgIGlmIChhbGxvd2VkLnRlc3QoU3RyaW5nKHZhbHVlMikpKSB7CiAgICAgICAgICBvazMgPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGFsbG93ZWQgPT09IHZhbHVlMikgewogICAgICAgIG9rMyA9IHRydWU7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGlmICghb2szKSByZXR1cm47CiAgfQogIHJldHVybiBzdGF0ZS5zY2hlbWEuY2xvYmJlciAmJiBzdGF0ZS5zY2hlbWEuY2xvYmJlclByZWZpeCAmJiBzdGF0ZS5zY2hlbWEuY2xvYmJlci5pbmNsdWRlcyhrZXkyKSA/IHN0YXRlLnNjaGVtYS5jbG9iYmVyUHJlZml4ICsgdmFsdWUyIDogdmFsdWUyOwp9Cl9fbmFtZShwcm9wZXJ0eVZhbHVlUHJpbWl0aXZlLCAicHJvcGVydHlWYWx1ZVByaW1pdGl2ZSIpOwpmdW5jdGlvbiBzYWZlUHJvdG9jb2woc3RhdGUsIGtleTIsIHZhbHVlMikgewogIGNvbnN0IHByb3RvY29scyA9IHN0YXRlLnNjaGVtYS5wcm90b2NvbHMgJiYgb3duNy5jYWxsKHN0YXRlLnNjaGVtYS5wcm90b2NvbHMsIGtleTIpID8gc3RhdGUuc2NoZW1hLnByb3RvY29sc1trZXkyXSA6IHZvaWQgMDsKICBpZiAoIXByb3RvY29scyB8fCBwcm90b2NvbHMubGVuZ3RoID09PSAwKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgY29uc3QgdXJsID0gU3RyaW5nKHZhbHVlMik7CiAgY29uc3QgY29sb24gPSB1cmwuaW5kZXhPZigiOiIpOwogIGNvbnN0IHF1ZXN0aW9uTWFyayA9IHVybC5pbmRleE9mKCI/Iik7CiAgY29uc3QgbnVtYmVyU2lnbiA9IHVybC5pbmRleE9mKCIjIik7CiAgY29uc3Qgc2xhc2ggPSB1cmwuaW5kZXhPZigiLyIpOwogIGlmIChjb2xvbiA8IDAgfHwgLy8gSWYgdGhlIGZpcnN0IGNvbG9uIGlzIGFmdGVyIGEgYD9gLCBgI2AsIG9yIGAvYCwgaXTigJlzIG5vdCBhIHByb3RvY29sLgogIHNsYXNoID4gLTEgJiYgY29sb24gPiBzbGFzaCB8fCBxdWVzdGlvbk1hcmsgPiAtMSAmJiBjb2xvbiA+IHF1ZXN0aW9uTWFyayB8fCBudW1iZXJTaWduID4gLTEgJiYgY29sb24gPiBudW1iZXJTaWduKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgbGV0IGluZGV4MiA9IC0xOwogIHdoaWxlICgrK2luZGV4MiA8IHByb3RvY29scy5sZW5ndGgpIHsKICAgIGNvbnN0IHByb3RvY29sID0gcHJvdG9jb2xzW2luZGV4Ml07CiAgICBpZiAoY29sb24gPT09IHByb3RvY29sLmxlbmd0aCAmJiB1cmwuc2xpY2UoMCwgcHJvdG9jb2wubGVuZ3RoKSA9PT0gcHJvdG9jb2wpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgfQogIHJldHVybiBmYWxzZTsKfQpfX25hbWUoc2FmZVByb3RvY29sLCAic2FmZVByb3RvY29sIik7CmZ1bmN0aW9uIHBhdGNoKG5vZGUyLCB1bnNhZmUyKSB7CiAgY29uc3QgY2xlYW5Qb3NpdGlvbiA9IHBvc2l0aW9uMigKICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IGxvb2tzIGxpa2UgYSBub2RlLgogICAgdW5zYWZlMgogICk7CiAgaWYgKHVuc2FmZTIuZGF0YSkgewogICAgbm9kZTIuZGF0YSA9IGVzbV9kZWZhdWx0KHVuc2FmZTIuZGF0YSk7CiAgfQogIGlmIChjbGVhblBvc2l0aW9uKSBub2RlMi5wb3NpdGlvbiA9IGNsZWFuUG9zaXRpb247Cn0KX19uYW1lKHBhdGNoLCAicGF0Y2giKTsKZnVuY3Rpb24gZmluZERlZmluaXRpb24oZGVmaW5pdGlvbnMsIGtleTIpIHsKICBsZXQgZGF0YURlZmF1bHQ7CiAgbGV0IGluZGV4MiA9IC0xOwogIGlmIChkZWZpbml0aW9ucykgewogICAgd2hpbGUgKCsraW5kZXgyIDwgZGVmaW5pdGlvbnMubGVuZ3RoKSB7CiAgICAgIGNvbnN0IGVudHJ5ID0gZGVmaW5pdGlvbnNbaW5kZXgyXTsKICAgICAgY29uc3QgbmFtZSA9IHR5cGVvZiBlbnRyeSA9PT0gInN0cmluZyIgPyBlbnRyeSA6IGVudHJ5WzBdOwogICAgICBpZiAobmFtZSA9PT0ga2V5MikgewogICAgICAgIHJldHVybiBlbnRyeTsKICAgICAgfQogICAgICBpZiAobmFtZSA9PT0gImRhdGEqIikgZGF0YURlZmF1bHQgPSBlbnRyeTsKICAgIH0KICB9CiAgaWYgKGtleTIubGVuZ3RoID4gNCAmJiBrZXkyLnNsaWNlKDAsIDQpLnRvTG93ZXJDYXNlKCkgPT09ICJkYXRhIikgewogICAgcmV0dXJuIGRhdGFEZWZhdWx0OwogIH0KfQpfX25hbWUoZmluZERlZmluaXRpb24sICJmaW5kRGVmaW5pdGlvbiIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvYmxvY2txdW90ZS5qcwpmdW5jdGlvbiBibG9ja3F1b3RlMihzdGF0ZSwgbm9kZTIpIHsKICBjb25zdCByZXN1bHQgPSB7CiAgICB0eXBlOiAiZWxlbWVudCIsCiAgICB0YWdOYW1lOiAiYmxvY2txdW90ZSIsCiAgICBwcm9wZXJ0aWVzOiB7fSwKICAgIGNoaWxkcmVuOiBzdGF0ZS53cmFwKHN0YXRlLmFsbChub2RlMiksIHRydWUpCiAgfTsKICBzdGF0ZS5wYXRjaChub2RlMiwgcmVzdWx0KTsKICByZXR1cm4gc3RhdGUuYXBwbHlEYXRhKG5vZGUyLCByZXN1bHQpOwp9Cl9fbmFtZShibG9ja3F1b3RlMiwgImJsb2NrcXVvdGUiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2JyZWFrLmpzCmZ1bmN0aW9uIGhhcmRCcmVhazIoc3RhdGUsIG5vZGUyKSB7CiAgY29uc3QgcmVzdWx0ID0geyB0eXBlOiAiZWxlbWVudCIsIHRhZ05hbWU6ICJiciIsIHByb3BlcnRpZXM6IHt9LCBjaGlsZHJlbjogW10gfTsKICBzdGF0ZS5wYXRjaChub2RlMiwgcmVzdWx0KTsKICByZXR1cm4gW3N0YXRlLmFwcGx5RGF0YShub2RlMiwgcmVzdWx0KSwgeyB0eXBlOiAidGV4dCIsIHZhbHVlOiAiXG4iIH1dOwp9Cl9fbmFtZShoYXJkQnJlYWsyLCAiaGFyZEJyZWFrIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9jb2RlLmpzCmZ1bmN0aW9uIGNvZGUzKHN0YXRlLCBub2RlMikgewogIGNvbnN0IHZhbHVlMiA9IG5vZGUyLnZhbHVlID8gbm9kZTIudmFsdWUgKyAiXG4iIDogIiI7CiAgY29uc3QgcHJvcGVydGllczIgPSB7fTsKICBjb25zdCBsYW5ndWFnZSA9IG5vZGUyLmxhbmcgPyBub2RlMi5sYW5nLnNwbGl0KC9ccysvKSA6IFtdOwogIGlmIChsYW5ndWFnZS5sZW5ndGggPiAwKSB7CiAgICBwcm9wZXJ0aWVzMi5jbGFzc05hbWUgPSBbImxhbmd1YWdlLSIgKyBsYW5ndWFnZVswXV07CiAgfQogIGxldCByZXN1bHQgPSB7CiAgICB0eXBlOiAiZWxlbWVudCIsCiAgICB0YWdOYW1lOiAiY29kZSIsCiAgICBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzMiwKICAgIGNoaWxkcmVuOiBbeyB0eXBlOiAidGV4dCIsIHZhbHVlOiB2YWx1ZTIgfV0KICB9OwogIGlmIChub2RlMi5tZXRhKSB7CiAgICByZXN1bHQuZGF0YSA9IHsgbWV0YTogbm9kZTIubWV0YSB9OwogIH0KICBzdGF0ZS5wYXRjaChub2RlMiwgcmVzdWx0KTsKICByZXN1bHQgPSBzdGF0ZS5hcHBseURhdGEobm9kZTIsIHJlc3VsdCk7CiAgcmVzdWx0ID0geyB0eXBlOiAiZWxlbWVudCIsIHRhZ05hbWU6ICJwcmUiLCBwcm9wZXJ0aWVzOiB7fSwgY2hpbGRyZW46IFtyZXN1bHRdIH07CiAgc3RhdGUucGF0Y2gobm9kZTIsIHJlc3VsdCk7CiAgcmV0dXJuIHJlc3VsdDsKfQpfX25hbWUoY29kZTMsICJjb2RlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9kZWxldGUuanMKZnVuY3Rpb24gc3RyaWtldGhyb3VnaChzdGF0ZSwgbm9kZTIpIHsKICBjb25zdCByZXN1bHQgPSB7CiAgICB0eXBlOiAiZWxlbWVudCIsCiAgICB0YWdOYW1lOiAiZGVsIiwKICAgIHByb3BlcnRpZXM6IHt9LAogICAgY2hpbGRyZW46IHN0YXRlLmFsbChub2RlMikKICB9OwogIHN0YXRlLnBhdGNoKG5vZGUyLCByZXN1bHQpOwogIHJldHVybiBzdGF0ZS5hcHBseURhdGEobm9kZTIsIHJlc3VsdCk7Cn0KX19uYW1lKHN0cmlrZXRocm91Z2gsICJzdHJpa2V0aHJvdWdoIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9lbXBoYXNpcy5qcwpmdW5jdGlvbiBlbXBoYXNpczIoc3RhdGUsIG5vZGUyKSB7CiAgY29uc3QgcmVzdWx0ID0gewogICAgdHlwZTogImVsZW1lbnQiLAogICAgdGFnTmFtZTogImVtIiwKICAgIHByb3BlcnRpZXM6IHt9LAogICAgY2hpbGRyZW46IHN0YXRlLmFsbChub2RlMikKICB9OwogIHN0YXRlLnBhdGNoKG5vZGUyLCByZXN1bHQpOwogIHJldHVybiBzdGF0ZS5hcHBseURhdGEobm9kZTIsIHJlc3VsdCk7Cn0KX19uYW1lKGVtcGhhc2lzMiwgImVtcGhhc2lzIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9mb290bm90ZS1yZWZlcmVuY2UuanMKZnVuY3Rpb24gZm9vdG5vdGVSZWZlcmVuY2UyKHN0YXRlLCBub2RlMikgewogIGNvbnN0IGNsb2JiZXJQcmVmaXggPSB0eXBlb2Ygc3RhdGUub3B0aW9ucy5jbG9iYmVyUHJlZml4ID09PSAic3RyaW5nIiA/IHN0YXRlLm9wdGlvbnMuY2xvYmJlclByZWZpeCA6ICJ1c2VyLWNvbnRlbnQtIjsKICBjb25zdCBpZCA9IFN0cmluZyhub2RlMi5pZGVudGlmaWVyKS50b1VwcGVyQ2FzZSgpOwogIGNvbnN0IHNhZmVJZCA9IG5vcm1hbGl6ZVVyaShpZC50b0xvd2VyQ2FzZSgpKTsKICBjb25zdCBpbmRleDIgPSBzdGF0ZS5mb290bm90ZU9yZGVyLmluZGV4T2YoaWQpOwogIGxldCBjb3VudGVyOwogIGxldCByZXVzZUNvdW50ZXIgPSBzdGF0ZS5mb290bm90ZUNvdW50cy5nZXQoaWQpOwogIGlmIChyZXVzZUNvdW50ZXIgPT09IHZvaWQgMCkgewogICAgcmV1c2VDb3VudGVyID0gMDsKICAgIHN0YXRlLmZvb3Rub3RlT3JkZXIucHVzaChpZCk7CiAgICBjb3VudGVyID0gc3RhdGUuZm9vdG5vdGVPcmRlci5sZW5ndGg7CiAgfSBlbHNlIHsKICAgIGNvdW50ZXIgPSBpbmRleDIgKyAxOwogIH0KICByZXVzZUNvdW50ZXIgKz0gMTsKICBzdGF0ZS5mb290bm90ZUNvdW50cy5zZXQoaWQsIHJldXNlQ291bnRlcik7CiAgY29uc3QgbGluazMgPSB7CiAgICB0eXBlOiAiZWxlbWVudCIsCiAgICB0YWdOYW1lOiAiYSIsCiAgICBwcm9wZXJ0aWVzOiB7CiAgICAgIGhyZWY6ICIjIiArIGNsb2JiZXJQcmVmaXggKyAiZm4tIiArIHNhZmVJZCwKICAgICAgaWQ6IGNsb2JiZXJQcmVmaXggKyAiZm5yZWYtIiArIHNhZmVJZCArIChyZXVzZUNvdW50ZXIgPiAxID8gIi0iICsgcmV1c2VDb3VudGVyIDogIiIpLAogICAgICBkYXRhRm9vdG5vdGVSZWY6IHRydWUsCiAgICAgIGFyaWFEZXNjcmliZWRCeTogWyJmb290bm90ZS1sYWJlbCJdCiAgICB9LAogICAgY2hpbGRyZW46IFt7IHR5cGU6ICJ0ZXh0IiwgdmFsdWU6IFN0cmluZyhjb3VudGVyKSB9XQogIH07CiAgc3RhdGUucGF0Y2gobm9kZTIsIGxpbmszKTsKICBjb25zdCBzdXAgPSB7CiAgICB0eXBlOiAiZWxlbWVudCIsCiAgICB0YWdOYW1lOiAic3VwIiwKICAgIHByb3BlcnRpZXM6IHt9LAogICAgY2hpbGRyZW46IFtsaW5rM10KICB9OwogIHN0YXRlLnBhdGNoKG5vZGUyLCBzdXApOwogIHJldHVybiBzdGF0ZS5hcHBseURhdGEobm9kZTIsIHN1cCk7Cn0KX19uYW1lKGZvb3Rub3RlUmVmZXJlbmNlMiwgImZvb3Rub3RlUmVmZXJlbmNlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9oZWFkaW5nLmpzCmZ1bmN0aW9uIGhlYWRpbmcyKHN0YXRlLCBub2RlMikgewogIGNvbnN0IHJlc3VsdCA9IHsKICAgIHR5cGU6ICJlbGVtZW50IiwKICAgIHRhZ05hbWU6ICJoIiArIG5vZGUyLmRlcHRoLAogICAgcHJvcGVydGllczoge30sCiAgICBjaGlsZHJlbjogc3RhdGUuYWxsKG5vZGUyKQogIH07CiAgc3RhdGUucGF0Y2gobm9kZTIsIHJlc3VsdCk7CiAgcmV0dXJuIHN0YXRlLmFwcGx5RGF0YShub2RlMiwgcmVzdWx0KTsKfQpfX25hbWUoaGVhZGluZzIsICJoZWFkaW5nIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9odG1sLmpzCmZ1bmN0aW9uIGh0bWwyKHN0YXRlLCBub2RlMikgewogIGlmIChzdGF0ZS5vcHRpb25zLmFsbG93RGFuZ2Vyb3VzSHRtbCkgewogICAgY29uc3QgcmVzdWx0ID0geyB0eXBlOiAicmF3IiwgdmFsdWU6IG5vZGUyLnZhbHVlIH07CiAgICBzdGF0ZS5wYXRjaChub2RlMiwgcmVzdWx0KTsKICAgIHJldHVybiBzdGF0ZS5hcHBseURhdGEobm9kZTIsIHJlc3VsdCk7CiAgfQogIHJldHVybiB2b2lkIDA7Cn0KX19uYW1lKGh0bWwyLCAiaHRtbCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvcmV2ZXJ0LmpzCmZ1bmN0aW9uIHJldmVydChzdGF0ZSwgbm9kZTIpIHsKICBjb25zdCBzdWJ0eXBlID0gbm9kZTIucmVmZXJlbmNlVHlwZTsKICBsZXQgc3VmZml4ID0gIl0iOwogIGlmIChzdWJ0eXBlID09PSAiY29sbGFwc2VkIikgewogICAgc3VmZml4ICs9ICJbXSI7CiAgfSBlbHNlIGlmIChzdWJ0eXBlID09PSAiZnVsbCIpIHsKICAgIHN1ZmZpeCArPSAiWyIgKyAobm9kZTIubGFiZWwgfHwgbm9kZTIuaWRlbnRpZmllcikgKyAiXSI7CiAgfQogIGlmIChub2RlMi50eXBlID09PSAiaW1hZ2VSZWZlcmVuY2UiKSB7CiAgICByZXR1cm4gW3sgdHlwZTogInRleHQiLCB2YWx1ZTogIiFbIiArIG5vZGUyLmFsdCArIHN1ZmZpeCB9XTsKICB9CiAgY29uc3QgY29udGVudHMgPSBzdGF0ZS5hbGwobm9kZTIpOwogIGNvbnN0IGhlYWQyID0gY29udGVudHNbMF07CiAgaWYgKGhlYWQyICYmIGhlYWQyLnR5cGUgPT09ICJ0ZXh0IikgewogICAgaGVhZDIudmFsdWUgPSAiWyIgKyBoZWFkMi52YWx1ZTsKICB9IGVsc2UgewogICAgY29udGVudHMudW5zaGlmdCh7IHR5cGU6ICJ0ZXh0IiwgdmFsdWU6ICJbIiB9KTsKICB9CiAgY29uc3QgdGFpbCA9IGNvbnRlbnRzW2NvbnRlbnRzLmxlbmd0aCAtIDFdOwogIGlmICh0YWlsICYmIHRhaWwudHlwZSA9PT0gInRleHQiKSB7CiAgICB0YWlsLnZhbHVlICs9IHN1ZmZpeDsKICB9IGVsc2UgewogICAgY29udGVudHMucHVzaCh7IHR5cGU6ICJ0ZXh0IiwgdmFsdWU6IHN1ZmZpeCB9KTsKICB9CiAgcmV0dXJuIGNvbnRlbnRzOwp9Cl9fbmFtZShyZXZlcnQsICJyZXZlcnQiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2ltYWdlLXJlZmVyZW5jZS5qcwpmdW5jdGlvbiBpbWFnZVJlZmVyZW5jZTIoc3RhdGUsIG5vZGUyKSB7CiAgY29uc3QgaWQgPSBTdHJpbmcobm9kZTIuaWRlbnRpZmllcikudG9VcHBlckNhc2UoKTsKICBjb25zdCBkZWZpbml0aW9uMyA9IHN0YXRlLmRlZmluaXRpb25CeUlkLmdldChpZCk7CiAgaWYgKCFkZWZpbml0aW9uMykgewogICAgcmV0dXJuIHJldmVydChzdGF0ZSwgbm9kZTIpOwogIH0KICBjb25zdCBwcm9wZXJ0aWVzMiA9IHsgc3JjOiBub3JtYWxpemVVcmkoZGVmaW5pdGlvbjMudXJsIHx8ICIiKSwgYWx0OiBub2RlMi5hbHQgfTsKICBpZiAoZGVmaW5pdGlvbjMudGl0bGUgIT09IG51bGwgJiYgZGVmaW5pdGlvbjMudGl0bGUgIT09IHZvaWQgMCkgewogICAgcHJvcGVydGllczIudGl0bGUgPSBkZWZpbml0aW9uMy50aXRsZTsKICB9CiAgY29uc3QgcmVzdWx0ID0geyB0eXBlOiAiZWxlbWVudCIsIHRhZ05hbWU6ICJpbWciLCBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzMiwgY2hpbGRyZW46IFtdIH07CiAgc3RhdGUucGF0Y2gobm9kZTIsIHJlc3VsdCk7CiAgcmV0dXJuIHN0YXRlLmFwcGx5RGF0YShub2RlMiwgcmVzdWx0KTsKfQpfX25hbWUoaW1hZ2VSZWZlcmVuY2UyLCAiaW1hZ2VSZWZlcmVuY2UiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2ltYWdlLmpzCmZ1bmN0aW9uIGltYWdlMihzdGF0ZSwgbm9kZTIpIHsKICBjb25zdCBwcm9wZXJ0aWVzMiA9IHsgc3JjOiBub3JtYWxpemVVcmkobm9kZTIudXJsKSB9OwogIGlmIChub2RlMi5hbHQgIT09IG51bGwgJiYgbm9kZTIuYWx0ICE9PSB2b2lkIDApIHsKICAgIHByb3BlcnRpZXMyLmFsdCA9IG5vZGUyLmFsdDsKICB9CiAgaWYgKG5vZGUyLnRpdGxlICE9PSBudWxsICYmIG5vZGUyLnRpdGxlICE9PSB2b2lkIDApIHsKICAgIHByb3BlcnRpZXMyLnRpdGxlID0gbm9kZTIudGl0bGU7CiAgfQogIGNvbnN0IHJlc3VsdCA9IHsgdHlwZTogImVsZW1lbnQiLCB0YWdOYW1lOiAiaW1nIiwgcHJvcGVydGllczogcHJvcGVydGllczIsIGNoaWxkcmVuOiBbXSB9OwogIHN0YXRlLnBhdGNoKG5vZGUyLCByZXN1bHQpOwogIHJldHVybiBzdGF0ZS5hcHBseURhdGEobm9kZTIsIHJlc3VsdCk7Cn0KX19uYW1lKGltYWdlMiwgImltYWdlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9pbmxpbmUtY29kZS5qcwpmdW5jdGlvbiBpbmxpbmVDb2RlMihzdGF0ZSwgbm9kZTIpIHsKICBjb25zdCB0ZXh0OCA9IHsgdHlwZTogInRleHQiLCB2YWx1ZTogbm9kZTIudmFsdWUucmVwbGFjZSgvXHI/XG58XHIvZywgIiAiKSB9OwogIHN0YXRlLnBhdGNoKG5vZGUyLCB0ZXh0OCk7CiAgY29uc3QgcmVzdWx0ID0gewogICAgdHlwZTogImVsZW1lbnQiLAogICAgdGFnTmFtZTogImNvZGUiLAogICAgcHJvcGVydGllczoge30sCiAgICBjaGlsZHJlbjogW3RleHQ4XQogIH07CiAgc3RhdGUucGF0Y2gobm9kZTIsIHJlc3VsdCk7CiAgcmV0dXJuIHN0YXRlLmFwcGx5RGF0YShub2RlMiwgcmVzdWx0KTsKfQpfX25hbWUoaW5saW5lQ29kZTIsICJpbmxpbmVDb2RlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9saW5rLXJlZmVyZW5jZS5qcwpmdW5jdGlvbiBsaW5rUmVmZXJlbmNlMihzdGF0ZSwgbm9kZTIpIHsKICBjb25zdCBpZCA9IFN0cmluZyhub2RlMi5pZGVudGlmaWVyKS50b1VwcGVyQ2FzZSgpOwogIGNvbnN0IGRlZmluaXRpb24zID0gc3RhdGUuZGVmaW5pdGlvbkJ5SWQuZ2V0KGlkKTsKICBpZiAoIWRlZmluaXRpb24zKSB7CiAgICByZXR1cm4gcmV2ZXJ0KHN0YXRlLCBub2RlMik7CiAgfQogIGNvbnN0IHByb3BlcnRpZXMyID0geyBocmVmOiBub3JtYWxpemVVcmkoZGVmaW5pdGlvbjMudXJsIHx8ICIiKSB9OwogIGlmIChkZWZpbml0aW9uMy50aXRsZSAhPT0gbnVsbCAmJiBkZWZpbml0aW9uMy50aXRsZSAhPT0gdm9pZCAwKSB7CiAgICBwcm9wZXJ0aWVzMi50aXRsZSA9IGRlZmluaXRpb24zLnRpdGxlOwogIH0KICBjb25zdCByZXN1bHQgPSB7CiAgICB0eXBlOiAiZWxlbWVudCIsCiAgICB0YWdOYW1lOiAiYSIsCiAgICBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzMiwKICAgIGNoaWxkcmVuOiBzdGF0ZS5hbGwobm9kZTIpCiAgfTsKICBzdGF0ZS5wYXRjaChub2RlMiwgcmVzdWx0KTsKICByZXR1cm4gc3RhdGUuYXBwbHlEYXRhKG5vZGUyLCByZXN1bHQpOwp9Cl9fbmFtZShsaW5rUmVmZXJlbmNlMiwgImxpbmtSZWZlcmVuY2UiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2xpbmsuanMKZnVuY3Rpb24gbGluazIoc3RhdGUsIG5vZGUyKSB7CiAgY29uc3QgcHJvcGVydGllczIgPSB7IGhyZWY6IG5vcm1hbGl6ZVVyaShub2RlMi51cmwpIH07CiAgaWYgKG5vZGUyLnRpdGxlICE9PSBudWxsICYmIG5vZGUyLnRpdGxlICE9PSB2b2lkIDApIHsKICAgIHByb3BlcnRpZXMyLnRpdGxlID0gbm9kZTIudGl0bGU7CiAgfQogIGNvbnN0IHJlc3VsdCA9IHsKICAgIHR5cGU6ICJlbGVtZW50IiwKICAgIHRhZ05hbWU6ICJhIiwKICAgIHByb3BlcnRpZXM6IHByb3BlcnRpZXMyLAogICAgY2hpbGRyZW46IHN0YXRlLmFsbChub2RlMikKICB9OwogIHN0YXRlLnBhdGNoKG5vZGUyLCByZXN1bHQpOwogIHJldHVybiBzdGF0ZS5hcHBseURhdGEobm9kZTIsIHJlc3VsdCk7Cn0KX19uYW1lKGxpbmsyLCAibGluayIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvbGlzdC1pdGVtLmpzCmZ1bmN0aW9uIGxpc3RJdGVtMihzdGF0ZSwgbm9kZTIsIHBhcmVudCkgewogIGNvbnN0IHJlc3VsdHMgPSBzdGF0ZS5hbGwobm9kZTIpOwogIGNvbnN0IGxvb3NlID0gcGFyZW50ID8gbGlzdExvb3NlKHBhcmVudCkgOiBsaXN0SXRlbUxvb3NlKG5vZGUyKTsKICBjb25zdCBwcm9wZXJ0aWVzMiA9IHt9OwogIGNvbnN0IGNoaWxkcmVuMiA9IFtdOwogIGlmICh0eXBlb2Ygbm9kZTIuY2hlY2tlZCA9PT0gImJvb2xlYW4iKSB7CiAgICBjb25zdCBoZWFkMiA9IHJlc3VsdHNbMF07CiAgICBsZXQgcGFyYWdyYXBoMzsKICAgIGlmIChoZWFkMiAmJiBoZWFkMi50eXBlID09PSAiZWxlbWVudCIgJiYgaGVhZDIudGFnTmFtZSA9PT0gInAiKSB7CiAgICAgIHBhcmFncmFwaDMgPSBoZWFkMjsKICAgIH0gZWxzZSB7CiAgICAgIHBhcmFncmFwaDMgPSB7IHR5cGU6ICJlbGVtZW50IiwgdGFnTmFtZTogInAiLCBwcm9wZXJ0aWVzOiB7fSwgY2hpbGRyZW46IFtdIH07CiAgICAgIHJlc3VsdHMudW5zaGlmdChwYXJhZ3JhcGgzKTsKICAgIH0KICAgIGlmIChwYXJhZ3JhcGgzLmNoaWxkcmVuLmxlbmd0aCA+IDApIHsKICAgICAgcGFyYWdyYXBoMy5jaGlsZHJlbi51bnNoaWZ0KHsgdHlwZTogInRleHQiLCB2YWx1ZTogIiAiIH0pOwogICAgfQogICAgcGFyYWdyYXBoMy5jaGlsZHJlbi51bnNoaWZ0KHsKICAgICAgdHlwZTogImVsZW1lbnQiLAogICAgICB0YWdOYW1lOiAiaW5wdXQiLAogICAgICBwcm9wZXJ0aWVzOiB7IHR5cGU6ICJjaGVja2JveCIsIGNoZWNrZWQ6IG5vZGUyLmNoZWNrZWQsIGRpc2FibGVkOiB0cnVlIH0sCiAgICAgIGNoaWxkcmVuOiBbXQogICAgfSk7CiAgICBwcm9wZXJ0aWVzMi5jbGFzc05hbWUgPSBbInRhc2stbGlzdC1pdGVtIl07CiAgfQogIGxldCBpbmRleDIgPSAtMTsKICB3aGlsZSAoKytpbmRleDIgPCByZXN1bHRzLmxlbmd0aCkgewogICAgY29uc3QgY2hpbGQgPSByZXN1bHRzW2luZGV4Ml07CiAgICBpZiAobG9vc2UgfHwgaW5kZXgyICE9PSAwIHx8IGNoaWxkLnR5cGUgIT09ICJlbGVtZW50IiB8fCBjaGlsZC50YWdOYW1lICE9PSAicCIpIHsKICAgICAgY2hpbGRyZW4yLnB1c2goeyB0eXBlOiAidGV4dCIsIHZhbHVlOiAiXG4iIH0pOwogICAgfQogICAgaWYgKGNoaWxkLnR5cGUgPT09ICJlbGVtZW50IiAmJiBjaGlsZC50YWdOYW1lID09PSAicCIgJiYgIWxvb3NlKSB7CiAgICAgIGNoaWxkcmVuMi5wdXNoKC4uLmNoaWxkLmNoaWxkcmVuKTsKICAgIH0gZWxzZSB7CiAgICAgIGNoaWxkcmVuMi5wdXNoKGNoaWxkKTsKICAgIH0KICB9CiAgY29uc3QgdGFpbCA9IHJlc3VsdHNbcmVzdWx0cy5sZW5ndGggLSAxXTsKICBpZiAodGFpbCAmJiAobG9vc2UgfHwgdGFpbC50eXBlICE9PSAiZWxlbWVudCIgfHwgdGFpbC50YWdOYW1lICE9PSAicCIpKSB7CiAgICBjaGlsZHJlbjIucHVzaCh7IHR5cGU6ICJ0ZXh0IiwgdmFsdWU6ICJcbiIgfSk7CiAgfQogIGNvbnN0IHJlc3VsdCA9IHsgdHlwZTogImVsZW1lbnQiLCB0YWdOYW1lOiAibGkiLCBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzMiwgY2hpbGRyZW46IGNoaWxkcmVuMiB9OwogIHN0YXRlLnBhdGNoKG5vZGUyLCByZXN1bHQpOwogIHJldHVybiBzdGF0ZS5hcHBseURhdGEobm9kZTIsIHJlc3VsdCk7Cn0KX19uYW1lKGxpc3RJdGVtMiwgImxpc3RJdGVtIik7CmZ1bmN0aW9uIGxpc3RMb29zZShub2RlMikgewogIGxldCBsb29zZSA9IGZhbHNlOwogIGlmIChub2RlMi50eXBlID09PSAibGlzdCIpIHsKICAgIGxvb3NlID0gbm9kZTIuc3ByZWFkIHx8IGZhbHNlOwogICAgY29uc3QgY2hpbGRyZW4yID0gbm9kZTIuY2hpbGRyZW47CiAgICBsZXQgaW5kZXgyID0gLTE7CiAgICB3aGlsZSAoIWxvb3NlICYmICsraW5kZXgyIDwgY2hpbGRyZW4yLmxlbmd0aCkgewogICAgICBsb29zZSA9IGxpc3RJdGVtTG9vc2UoY2hpbGRyZW4yW2luZGV4Ml0pOwogICAgfQogIH0KICByZXR1cm4gbG9vc2U7Cn0KX19uYW1lKGxpc3RMb29zZSwgImxpc3RMb29zZSIpOwpmdW5jdGlvbiBsaXN0SXRlbUxvb3NlKG5vZGUyKSB7CiAgY29uc3Qgc3ByZWFkID0gbm9kZTIuc3ByZWFkOwogIHJldHVybiBzcHJlYWQgPT09IG51bGwgfHwgc3ByZWFkID09PSB2b2lkIDAgPyBub2RlMi5jaGlsZHJlbi5sZW5ndGggPiAxIDogc3ByZWFkOwp9Cl9fbmFtZShsaXN0SXRlbUxvb3NlLCAibGlzdEl0ZW1Mb29zZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvbGlzdC5qcwpmdW5jdGlvbiBsaXN0NChzdGF0ZSwgbm9kZTIpIHsKICBjb25zdCBwcm9wZXJ0aWVzMiA9IHt9OwogIGNvbnN0IHJlc3VsdHMgPSBzdGF0ZS5hbGwobm9kZTIpOwogIGxldCBpbmRleDIgPSAtMTsKICBpZiAodHlwZW9mIG5vZGUyLnN0YXJ0ID09PSAibnVtYmVyIiAmJiBub2RlMi5zdGFydCAhPT0gMSkgewogICAgcHJvcGVydGllczIuc3RhcnQgPSBub2RlMi5zdGFydDsKICB9CiAgd2hpbGUgKCsraW5kZXgyIDwgcmVzdWx0cy5sZW5ndGgpIHsKICAgIGNvbnN0IGNoaWxkID0gcmVzdWx0c1tpbmRleDJdOwogICAgaWYgKGNoaWxkLnR5cGUgPT09ICJlbGVtZW50IiAmJiBjaGlsZC50YWdOYW1lID09PSAibGkiICYmIGNoaWxkLnByb3BlcnRpZXMgJiYgQXJyYXkuaXNBcnJheShjaGlsZC5wcm9wZXJ0aWVzLmNsYXNzTmFtZSkgJiYgY2hpbGQucHJvcGVydGllcy5jbGFzc05hbWUuaW5jbHVkZXMoInRhc2stbGlzdC1pdGVtIikpIHsKICAgICAgcHJvcGVydGllczIuY2xhc3NOYW1lID0gWyJjb250YWlucy10YXNrLWxpc3QiXTsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIGNvbnN0IHJlc3VsdCA9IHsKICAgIHR5cGU6ICJlbGVtZW50IiwKICAgIHRhZ05hbWU6IG5vZGUyLm9yZGVyZWQgPyAib2wiIDogInVsIiwKICAgIHByb3BlcnRpZXM6IHByb3BlcnRpZXMyLAogICAgY2hpbGRyZW46IHN0YXRlLndyYXAocmVzdWx0cywgdHJ1ZSkKICB9OwogIHN0YXRlLnBhdGNoKG5vZGUyLCByZXN1bHQpOwogIHJldHVybiBzdGF0ZS5hcHBseURhdGEobm9kZTIsIHJlc3VsdCk7Cn0KX19uYW1lKGxpc3Q0LCAibGlzdCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvcGFyYWdyYXBoLmpzCmZ1bmN0aW9uIHBhcmFncmFwaDIoc3RhdGUsIG5vZGUyKSB7CiAgY29uc3QgcmVzdWx0ID0gewogICAgdHlwZTogImVsZW1lbnQiLAogICAgdGFnTmFtZTogInAiLAogICAgcHJvcGVydGllczoge30sCiAgICBjaGlsZHJlbjogc3RhdGUuYWxsKG5vZGUyKQogIH07CiAgc3RhdGUucGF0Y2gobm9kZTIsIHJlc3VsdCk7CiAgcmV0dXJuIHN0YXRlLmFwcGx5RGF0YShub2RlMiwgcmVzdWx0KTsKfQpfX25hbWUocGFyYWdyYXBoMiwgInBhcmFncmFwaCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvcm9vdC5qcwpmdW5jdGlvbiByb290MyhzdGF0ZSwgbm9kZTIpIHsKICBjb25zdCByZXN1bHQgPSB7IHR5cGU6ICJyb290IiwgY2hpbGRyZW46IHN0YXRlLndyYXAoc3RhdGUuYWxsKG5vZGUyKSkgfTsKICBzdGF0ZS5wYXRjaChub2RlMiwgcmVzdWx0KTsKICByZXR1cm4gc3RhdGUuYXBwbHlEYXRhKG5vZGUyLCByZXN1bHQpOwp9Cl9fbmFtZShyb290MywgInJvb3QiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL3N0cm9uZy5qcwpmdW5jdGlvbiBzdHJvbmcyKHN0YXRlLCBub2RlMikgewogIGNvbnN0IHJlc3VsdCA9IHsKICAgIHR5cGU6ICJlbGVtZW50IiwKICAgIHRhZ05hbWU6ICJzdHJvbmciLAogICAgcHJvcGVydGllczoge30sCiAgICBjaGlsZHJlbjogc3RhdGUuYWxsKG5vZGUyKQogIH07CiAgc3RhdGUucGF0Y2gobm9kZTIsIHJlc3VsdCk7CiAgcmV0dXJuIHN0YXRlLmFwcGx5RGF0YShub2RlMiwgcmVzdWx0KTsKfQpfX25hbWUoc3Ryb25nMiwgInN0cm9uZyIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvdGFibGUuanMKZnVuY3Rpb24gdGFibGUoc3RhdGUsIG5vZGUyKSB7CiAgY29uc3Qgcm93cyA9IHN0YXRlLmFsbChub2RlMik7CiAgY29uc3QgZmlyc3RSb3cgPSByb3dzLnNoaWZ0KCk7CiAgY29uc3QgdGFibGVDb250ZW50ID0gW107CiAgaWYgKGZpcnN0Um93KSB7CiAgICBjb25zdCBoZWFkMiA9IHsKICAgICAgdHlwZTogImVsZW1lbnQiLAogICAgICB0YWdOYW1lOiAidGhlYWQiLAogICAgICBwcm9wZXJ0aWVzOiB7fSwKICAgICAgY2hpbGRyZW46IHN0YXRlLndyYXAoW2ZpcnN0Um93XSwgdHJ1ZSkKICAgIH07CiAgICBzdGF0ZS5wYXRjaChub2RlMi5jaGlsZHJlblswXSwgaGVhZDIpOwogICAgdGFibGVDb250ZW50LnB1c2goaGVhZDIpOwogIH0KICBpZiAocm93cy5sZW5ndGggPiAwKSB7CiAgICBjb25zdCBib2R5MyA9IHsKICAgICAgdHlwZTogImVsZW1lbnQiLAogICAgICB0YWdOYW1lOiAidGJvZHkiLAogICAgICBwcm9wZXJ0aWVzOiB7fSwKICAgICAgY2hpbGRyZW46IHN0YXRlLndyYXAocm93cywgdHJ1ZSkKICAgIH07CiAgICBjb25zdCBzdGFydCA9IHBvaW50U3RhcnQobm9kZTIuY2hpbGRyZW5bMV0pOwogICAgY29uc3QgZW5kID0gcG9pbnRFbmQobm9kZTIuY2hpbGRyZW5bbm9kZTIuY2hpbGRyZW4ubGVuZ3RoIC0gMV0pOwogICAgaWYgKHN0YXJ0ICYmIGVuZCkgYm9keTMucG9zaXRpb24gPSB7IHN0YXJ0LCBlbmQgfTsKICAgIHRhYmxlQ29udGVudC5wdXNoKGJvZHkzKTsKICB9CiAgY29uc3QgcmVzdWx0ID0gewogICAgdHlwZTogImVsZW1lbnQiLAogICAgdGFnTmFtZTogInRhYmxlIiwKICAgIHByb3BlcnRpZXM6IHt9LAogICAgY2hpbGRyZW46IHN0YXRlLndyYXAodGFibGVDb250ZW50LCB0cnVlKQogIH07CiAgc3RhdGUucGF0Y2gobm9kZTIsIHJlc3VsdCk7CiAgcmV0dXJuIHN0YXRlLmFwcGx5RGF0YShub2RlMiwgcmVzdWx0KTsKfQpfX25hbWUodGFibGUsICJ0YWJsZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvdGFibGUtcm93LmpzCmZ1bmN0aW9uIHRhYmxlUm93KHN0YXRlLCBub2RlMiwgcGFyZW50KSB7CiAgY29uc3Qgc2libGluZ3MyID0gcGFyZW50ID8gcGFyZW50LmNoaWxkcmVuIDogdm9pZCAwOwogIGNvbnN0IHJvd0luZGV4ID0gc2libGluZ3MyID8gc2libGluZ3MyLmluZGV4T2Yobm9kZTIpIDogMTsKICBjb25zdCB0YWdOYW1lID0gcm93SW5kZXggPT09IDAgPyAidGgiIDogInRkIjsKICBjb25zdCBhbGlnbiA9IHBhcmVudCAmJiBwYXJlbnQudHlwZSA9PT0gInRhYmxlIiA/IHBhcmVudC5hbGlnbiA6IHZvaWQgMDsKICBjb25zdCBsZW5ndGggPSBhbGlnbiA/IGFsaWduLmxlbmd0aCA6IG5vZGUyLmNoaWxkcmVuLmxlbmd0aDsKICBsZXQgY2VsbEluZGV4ID0gLTE7CiAgY29uc3QgY2VsbHMyID0gW107CiAgd2hpbGUgKCsrY2VsbEluZGV4IDwgbGVuZ3RoKSB7CiAgICBjb25zdCBjZWxsMiA9IG5vZGUyLmNoaWxkcmVuW2NlbGxJbmRleF07CiAgICBjb25zdCBwcm9wZXJ0aWVzMiA9IHt9OwogICAgY29uc3QgYWxpZ25WYWx1ZSA9IGFsaWduID8gYWxpZ25bY2VsbEluZGV4XSA6IHZvaWQgMDsKICAgIGlmIChhbGlnblZhbHVlKSB7CiAgICAgIHByb3BlcnRpZXMyLmFsaWduID0gYWxpZ25WYWx1ZTsKICAgIH0KICAgIGxldCByZXN1bHQyID0geyB0eXBlOiAiZWxlbWVudCIsIHRhZ05hbWUsIHByb3BlcnRpZXM6IHByb3BlcnRpZXMyLCBjaGlsZHJlbjogW10gfTsKICAgIGlmIChjZWxsMikgewogICAgICByZXN1bHQyLmNoaWxkcmVuID0gc3RhdGUuYWxsKGNlbGwyKTsKICAgICAgc3RhdGUucGF0Y2goY2VsbDIsIHJlc3VsdDIpOwogICAgICByZXN1bHQyID0gc3RhdGUuYXBwbHlEYXRhKGNlbGwyLCByZXN1bHQyKTsKICAgIH0KICAgIGNlbGxzMi5wdXNoKHJlc3VsdDIpOwogIH0KICBjb25zdCByZXN1bHQgPSB7CiAgICB0eXBlOiAiZWxlbWVudCIsCiAgICB0YWdOYW1lOiAidHIiLAogICAgcHJvcGVydGllczoge30sCiAgICBjaGlsZHJlbjogc3RhdGUud3JhcChjZWxsczIsIHRydWUpCiAgfTsKICBzdGF0ZS5wYXRjaChub2RlMiwgcmVzdWx0KTsKICByZXR1cm4gc3RhdGUuYXBwbHlEYXRhKG5vZGUyLCByZXN1bHQpOwp9Cl9fbmFtZSh0YWJsZVJvdywgInRhYmxlUm93Iik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy90YWJsZS1jZWxsLmpzCmZ1bmN0aW9uIHRhYmxlQ2VsbChzdGF0ZSwgbm9kZTIpIHsKICBjb25zdCByZXN1bHQgPSB7CiAgICB0eXBlOiAiZWxlbWVudCIsCiAgICB0YWdOYW1lOiAidGQiLAogICAgLy8gQXNzdW1lIGJvZHkgY2VsbC4KICAgIHByb3BlcnRpZXM6IHt9LAogICAgY2hpbGRyZW46IHN0YXRlLmFsbChub2RlMikKICB9OwogIHN0YXRlLnBhdGNoKG5vZGUyLCByZXN1bHQpOwogIHJldHVybiBzdGF0ZS5hcHBseURhdGEobm9kZTIsIHJlc3VsdCk7Cn0KX19uYW1lKHRhYmxlQ2VsbCwgInRhYmxlQ2VsbCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3RyaW0tbGluZXNAMy4wLjEvbm9kZV9tb2R1bGVzL3RyaW0tbGluZXMvaW5kZXguanMKdmFyIHRhYiA9IDk7CnZhciBzcGFjZSA9IDMyOwpmdW5jdGlvbiB0cmltTGluZXModmFsdWUyKSB7CiAgY29uc3Qgc291cmNlID0gU3RyaW5nKHZhbHVlMik7CiAgY29uc3Qgc2VhcmNoMiA9IC9ccj9cbnxcci9nOwogIGxldCBtYXRjaDIgPSBzZWFyY2gyLmV4ZWMoc291cmNlKTsKICBsZXQgbGFzdDMgPSAwOwogIGNvbnN0IGxpbmVzID0gW107CiAgd2hpbGUgKG1hdGNoMikgewogICAgbGluZXMucHVzaCgKICAgICAgdHJpbUxpbmUoc291cmNlLnNsaWNlKGxhc3QzLCBtYXRjaDIuaW5kZXgpLCBsYXN0MyA+IDAsIHRydWUpLAogICAgICBtYXRjaDJbMF0KICAgICk7CiAgICBsYXN0MyA9IG1hdGNoMi5pbmRleCArIG1hdGNoMlswXS5sZW5ndGg7CiAgICBtYXRjaDIgPSBzZWFyY2gyLmV4ZWMoc291cmNlKTsKICB9CiAgbGluZXMucHVzaCh0cmltTGluZShzb3VyY2Uuc2xpY2UobGFzdDMpLCBsYXN0MyA+IDAsIGZhbHNlKSk7CiAgcmV0dXJuIGxpbmVzLmpvaW4oIiIpOwp9Cl9fbmFtZSh0cmltTGluZXMsICJ0cmltTGluZXMiKTsKZnVuY3Rpb24gdHJpbUxpbmUodmFsdWUyLCBzdGFydCwgZW5kKSB7CiAgbGV0IHN0YXJ0SW5kZXggPSAwOwogIGxldCBlbmRJbmRleCA9IHZhbHVlMi5sZW5ndGg7CiAgaWYgKHN0YXJ0KSB7CiAgICBsZXQgY29kZTQgPSB2YWx1ZTIuY29kZVBvaW50QXQoc3RhcnRJbmRleCk7CiAgICB3aGlsZSAoY29kZTQgPT09IHRhYiB8fCBjb2RlNCA9PT0gc3BhY2UpIHsKICAgICAgc3RhcnRJbmRleCsrOwogICAgICBjb2RlNCA9IHZhbHVlMi5jb2RlUG9pbnRBdChzdGFydEluZGV4KTsKICAgIH0KICB9CiAgaWYgKGVuZCkgewogICAgbGV0IGNvZGU0ID0gdmFsdWUyLmNvZGVQb2ludEF0KGVuZEluZGV4IC0gMSk7CiAgICB3aGlsZSAoY29kZTQgPT09IHRhYiB8fCBjb2RlNCA9PT0gc3BhY2UpIHsKICAgICAgZW5kSW5kZXgtLTsKICAgICAgY29kZTQgPSB2YWx1ZTIuY29kZVBvaW50QXQoZW5kSW5kZXggLSAxKTsKICAgIH0KICB9CiAgcmV0dXJuIGVuZEluZGV4ID4gc3RhcnRJbmRleCA/IHZhbHVlMi5zbGljZShzdGFydEluZGV4LCBlbmRJbmRleCkgOiAiIjsKfQpfX25hbWUodHJpbUxpbmUsICJ0cmltTGluZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvdGV4dC5qcwpmdW5jdGlvbiB0ZXh0NihzdGF0ZSwgbm9kZTIpIHsKICBjb25zdCByZXN1bHQgPSB7IHR5cGU6ICJ0ZXh0IiwgdmFsdWU6IHRyaW1MaW5lcyhTdHJpbmcobm9kZTIudmFsdWUpKSB9OwogIHN0YXRlLnBhdGNoKG5vZGUyLCByZXN1bHQpOwogIHJldHVybiBzdGF0ZS5hcHBseURhdGEobm9kZTIsIHJlc3VsdCk7Cn0KX19uYW1lKHRleHQ2LCAidGV4dCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvdGhlbWF0aWMtYnJlYWsuanMKZnVuY3Rpb24gdGhlbWF0aWNCcmVhazMoc3RhdGUsIG5vZGUyKSB7CiAgY29uc3QgcmVzdWx0ID0gewogICAgdHlwZTogImVsZW1lbnQiLAogICAgdGFnTmFtZTogImhyIiwKICAgIHByb3BlcnRpZXM6IHt9LAogICAgY2hpbGRyZW46IFtdCiAgfTsKICBzdGF0ZS5wYXRjaChub2RlMiwgcmVzdWx0KTsKICByZXR1cm4gc3RhdGUuYXBwbHlEYXRhKG5vZGUyLCByZXN1bHQpOwp9Cl9fbmFtZSh0aGVtYXRpY0JyZWFrMywgInRoZW1hdGljQnJlYWsiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2luZGV4LmpzCnZhciBoYW5kbGVycyA9IHsKICBibG9ja3F1b3RlOiBibG9ja3F1b3RlMiwKICBicmVhazogaGFyZEJyZWFrMiwKICBjb2RlOiBjb2RlMywKICBkZWxldGU6IHN0cmlrZXRocm91Z2gsCiAgZW1waGFzaXM6IGVtcGhhc2lzMiwKICBmb290bm90ZVJlZmVyZW5jZTogZm9vdG5vdGVSZWZlcmVuY2UyLAogIGhlYWRpbmc6IGhlYWRpbmcyLAogIGh0bWw6IGh0bWwyLAogIGltYWdlUmVmZXJlbmNlOiBpbWFnZVJlZmVyZW5jZTIsCiAgaW1hZ2U6IGltYWdlMiwKICBpbmxpbmVDb2RlOiBpbmxpbmVDb2RlMiwKICBsaW5rUmVmZXJlbmNlOiBsaW5rUmVmZXJlbmNlMiwKICBsaW5rOiBsaW5rMiwKICBsaXN0SXRlbTogbGlzdEl0ZW0yLAogIGxpc3Q6IGxpc3Q0LAogIHBhcmFncmFwaDogcGFyYWdyYXBoMiwKICAvLyBAdHMtZXhwZWN0LWVycm9yOiByb290IGlzIGRpZmZlcmVudCwgYnV0IGhhcmQgdG8gdHlwZS4KICByb290OiByb290MywKICBzdHJvbmc6IHN0cm9uZzIsCiAgdGFibGUsCiAgdGFibGVDZWxsLAogIHRhYmxlUm93LAogIHRleHQ6IHRleHQ2LAogIHRoZW1hdGljQnJlYWs6IHRoZW1hdGljQnJlYWszLAogIHRvbWw6IGlnbm9yZSwKICB5YW1sOiBpZ25vcmUsCiAgZGVmaW5pdGlvbjogaWdub3JlLAogIGZvb3Rub3RlRGVmaW5pdGlvbjogaWdub3JlCn07CmZ1bmN0aW9uIGlnbm9yZSgpIHsKICByZXR1cm4gdm9pZCAwOwp9Cl9fbmFtZShpZ25vcmUsICJpZ25vcmUiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2Zvb3Rlci5qcwpmdW5jdGlvbiBkZWZhdWx0Rm9vdG5vdGVCYWNrQ29udGVudChfMywgcmVyZWZlcmVuY2VJbmRleCkgewogIGNvbnN0IHJlc3VsdCA9IFt7IHR5cGU6ICJ0ZXh0IiwgdmFsdWU6ICJcdTIxQTkiIH1dOwogIGlmIChyZXJlZmVyZW5jZUluZGV4ID4gMSkgewogICAgcmVzdWx0LnB1c2goewogICAgICB0eXBlOiAiZWxlbWVudCIsCiAgICAgIHRhZ05hbWU6ICJzdXAiLAogICAgICBwcm9wZXJ0aWVzOiB7fSwKICAgICAgY2hpbGRyZW46IFt7IHR5cGU6ICJ0ZXh0IiwgdmFsdWU6IFN0cmluZyhyZXJlZmVyZW5jZUluZGV4KSB9XQogICAgfSk7CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KX19uYW1lKGRlZmF1bHRGb290bm90ZUJhY2tDb250ZW50LCAiZGVmYXVsdEZvb3Rub3RlQmFja0NvbnRlbnQiKTsKZnVuY3Rpb24gZGVmYXVsdEZvb3Rub3RlQmFja0xhYmVsKHJlZmVyZW5jZUluZGV4LCByZXJlZmVyZW5jZUluZGV4KSB7CiAgcmV0dXJuICJCYWNrIHRvIHJlZmVyZW5jZSAiICsgKHJlZmVyZW5jZUluZGV4ICsgMSkgKyAocmVyZWZlcmVuY2VJbmRleCA+IDEgPyAiLSIgKyByZXJlZmVyZW5jZUluZGV4IDogIiIpOwp9Cl9fbmFtZShkZWZhdWx0Rm9vdG5vdGVCYWNrTGFiZWwsICJkZWZhdWx0Rm9vdG5vdGVCYWNrTGFiZWwiKTsKZnVuY3Rpb24gZm9vdGVyKHN0YXRlKSB7CiAgY29uc3QgY2xvYmJlclByZWZpeCA9IHR5cGVvZiBzdGF0ZS5vcHRpb25zLmNsb2JiZXJQcmVmaXggPT09ICJzdHJpbmciID8gc3RhdGUub3B0aW9ucy5jbG9iYmVyUHJlZml4IDogInVzZXItY29udGVudC0iOwogIGNvbnN0IGZvb3Rub3RlQmFja0NvbnRlbnQgPSBzdGF0ZS5vcHRpb25zLmZvb3Rub3RlQmFja0NvbnRlbnQgfHwgZGVmYXVsdEZvb3Rub3RlQmFja0NvbnRlbnQ7CiAgY29uc3QgZm9vdG5vdGVCYWNrTGFiZWwgPSBzdGF0ZS5vcHRpb25zLmZvb3Rub3RlQmFja0xhYmVsIHx8IGRlZmF1bHRGb290bm90ZUJhY2tMYWJlbDsKICBjb25zdCBmb290bm90ZUxhYmVsID0gc3RhdGUub3B0aW9ucy5mb290bm90ZUxhYmVsIHx8ICJGb290bm90ZXMiOwogIGNvbnN0IGZvb3Rub3RlTGFiZWxUYWdOYW1lID0gc3RhdGUub3B0aW9ucy5mb290bm90ZUxhYmVsVGFnTmFtZSB8fCAiaDIiOwogIGNvbnN0IGZvb3Rub3RlTGFiZWxQcm9wZXJ0aWVzID0gc3RhdGUub3B0aW9ucy5mb290bm90ZUxhYmVsUHJvcGVydGllcyB8fCB7CiAgICBjbGFzc05hbWU6IFsic3Itb25seSJdCiAgfTsKICBjb25zdCBsaXN0SXRlbXMgPSBbXTsKICBsZXQgcmVmZXJlbmNlSW5kZXggPSAtMTsKICB3aGlsZSAoKytyZWZlcmVuY2VJbmRleCA8IHN0YXRlLmZvb3Rub3RlT3JkZXIubGVuZ3RoKSB7CiAgICBjb25zdCBkZWZpbml0aW9uMyA9IHN0YXRlLmZvb3Rub3RlQnlJZC5nZXQoCiAgICAgIHN0YXRlLmZvb3Rub3RlT3JkZXJbcmVmZXJlbmNlSW5kZXhdCiAgICApOwogICAgaWYgKCFkZWZpbml0aW9uMykgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGNvbnN0IGNvbnRlbnQzID0gc3RhdGUuYWxsKGRlZmluaXRpb24zKTsKICAgIGNvbnN0IGlkID0gU3RyaW5nKGRlZmluaXRpb24zLmlkZW50aWZpZXIpLnRvVXBwZXJDYXNlKCk7CiAgICBjb25zdCBzYWZlSWQgPSBub3JtYWxpemVVcmkoaWQudG9Mb3dlckNhc2UoKSk7CiAgICBsZXQgcmVyZWZlcmVuY2VJbmRleCA9IDA7CiAgICBjb25zdCBiYWNrUmVmZXJlbmNlcyA9IFtdOwogICAgY29uc3QgY291bnRzID0gc3RhdGUuZm9vdG5vdGVDb3VudHMuZ2V0KGlkKTsKICAgIHdoaWxlIChjb3VudHMgIT09IHZvaWQgMCAmJiArK3JlcmVmZXJlbmNlSW5kZXggPD0gY291bnRzKSB7CiAgICAgIGlmIChiYWNrUmVmZXJlbmNlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgYmFja1JlZmVyZW5jZXMucHVzaCh7IHR5cGU6ICJ0ZXh0IiwgdmFsdWU6ICIgIiB9KTsKICAgICAgfQogICAgICBsZXQgY2hpbGRyZW4yID0gdHlwZW9mIGZvb3Rub3RlQmFja0NvbnRlbnQgPT09ICJzdHJpbmciID8gZm9vdG5vdGVCYWNrQ29udGVudCA6IGZvb3Rub3RlQmFja0NvbnRlbnQocmVmZXJlbmNlSW5kZXgsIHJlcmVmZXJlbmNlSW5kZXgpOwogICAgICBpZiAodHlwZW9mIGNoaWxkcmVuMiA9PT0gInN0cmluZyIpIHsKICAgICAgICBjaGlsZHJlbjIgPSB7IHR5cGU6ICJ0ZXh0IiwgdmFsdWU6IGNoaWxkcmVuMiB9OwogICAgICB9CiAgICAgIGJhY2tSZWZlcmVuY2VzLnB1c2goewogICAgICAgIHR5cGU6ICJlbGVtZW50IiwKICAgICAgICB0YWdOYW1lOiAiYSIsCiAgICAgICAgcHJvcGVydGllczogewogICAgICAgICAgaHJlZjogIiMiICsgY2xvYmJlclByZWZpeCArICJmbnJlZi0iICsgc2FmZUlkICsgKHJlcmVmZXJlbmNlSW5kZXggPiAxID8gIi0iICsgcmVyZWZlcmVuY2VJbmRleCA6ICIiKSwKICAgICAgICAgIGRhdGFGb290bm90ZUJhY2tyZWY6ICIiLAogICAgICAgICAgYXJpYUxhYmVsOiB0eXBlb2YgZm9vdG5vdGVCYWNrTGFiZWwgPT09ICJzdHJpbmciID8gZm9vdG5vdGVCYWNrTGFiZWwgOiBmb290bm90ZUJhY2tMYWJlbChyZWZlcmVuY2VJbmRleCwgcmVyZWZlcmVuY2VJbmRleCksCiAgICAgICAgICBjbGFzc05hbWU6IFsiZGF0YS1mb290bm90ZS1iYWNrcmVmIl0KICAgICAgICB9LAogICAgICAgIGNoaWxkcmVuOiBBcnJheS5pc0FycmF5KGNoaWxkcmVuMikgPyBjaGlsZHJlbjIgOiBbY2hpbGRyZW4yXQogICAgICB9KTsKICAgIH0KICAgIGNvbnN0IHRhaWwgPSBjb250ZW50M1tjb250ZW50My5sZW5ndGggLSAxXTsKICAgIGlmICh0YWlsICYmIHRhaWwudHlwZSA9PT0gImVsZW1lbnQiICYmIHRhaWwudGFnTmFtZSA9PT0gInAiKSB7CiAgICAgIGNvbnN0IHRhaWxUYWlsID0gdGFpbC5jaGlsZHJlblt0YWlsLmNoaWxkcmVuLmxlbmd0aCAtIDFdOwogICAgICBpZiAodGFpbFRhaWwgJiYgdGFpbFRhaWwudHlwZSA9PT0gInRleHQiKSB7CiAgICAgICAgdGFpbFRhaWwudmFsdWUgKz0gIiAiOwogICAgICB9IGVsc2UgewogICAgICAgIHRhaWwuY2hpbGRyZW4ucHVzaCh7IHR5cGU6ICJ0ZXh0IiwgdmFsdWU6ICIgIiB9KTsKICAgICAgfQogICAgICB0YWlsLmNoaWxkcmVuLnB1c2goLi4uYmFja1JlZmVyZW5jZXMpOwogICAgfSBlbHNlIHsKICAgICAgY29udGVudDMucHVzaCguLi5iYWNrUmVmZXJlbmNlcyk7CiAgICB9CiAgICBjb25zdCBsaXN0SXRlbTMgPSB7CiAgICAgIHR5cGU6ICJlbGVtZW50IiwKICAgICAgdGFnTmFtZTogImxpIiwKICAgICAgcHJvcGVydGllczogeyBpZDogY2xvYmJlclByZWZpeCArICJmbi0iICsgc2FmZUlkIH0sCiAgICAgIGNoaWxkcmVuOiBzdGF0ZS53cmFwKGNvbnRlbnQzLCB0cnVlKQogICAgfTsKICAgIHN0YXRlLnBhdGNoKGRlZmluaXRpb24zLCBsaXN0SXRlbTMpOwogICAgbGlzdEl0ZW1zLnB1c2gobGlzdEl0ZW0zKTsKICB9CiAgaWYgKGxpc3RJdGVtcy5sZW5ndGggPT09IDApIHsKICAgIHJldHVybjsKICB9CiAgcmV0dXJuIHsKICAgIHR5cGU6ICJlbGVtZW50IiwKICAgIHRhZ05hbWU6ICJzZWN0aW9uIiwKICAgIHByb3BlcnRpZXM6IHsgZGF0YUZvb3Rub3RlczogdHJ1ZSwgY2xhc3NOYW1lOiBbImZvb3Rub3RlcyJdIH0sCiAgICBjaGlsZHJlbjogWwogICAgICB7CiAgICAgICAgdHlwZTogImVsZW1lbnQiLAogICAgICAgIHRhZ05hbWU6IGZvb3Rub3RlTGFiZWxUYWdOYW1lLAogICAgICAgIHByb3BlcnRpZXM6IHsKICAgICAgICAgIC4uLmVzbV9kZWZhdWx0KGZvb3Rub3RlTGFiZWxQcm9wZXJ0aWVzKSwKICAgICAgICAgIGlkOiAiZm9vdG5vdGUtbGFiZWwiCiAgICAgICAgfSwKICAgICAgICBjaGlsZHJlbjogW3sgdHlwZTogInRleHQiLCB2YWx1ZTogZm9vdG5vdGVMYWJlbCB9XQogICAgICB9LAogICAgICB7IHR5cGU6ICJ0ZXh0IiwgdmFsdWU6ICJcbiIgfSwKICAgICAgewogICAgICAgIHR5cGU6ICJlbGVtZW50IiwKICAgICAgICB0YWdOYW1lOiAib2wiLAogICAgICAgIHByb3BlcnRpZXM6IHt9LAogICAgICAgIGNoaWxkcmVuOiBzdGF0ZS53cmFwKGxpc3RJdGVtcywgdHJ1ZSkKICAgICAgfSwKICAgICAgeyB0eXBlOiAidGV4dCIsIHZhbHVlOiAiXG4iIH0KICAgIF0KICB9Owp9Cl9fbmFtZShmb290ZXIsICJmb290ZXIiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL3N0YXRlLmpzCnZhciBvd244ID0ge30uaGFzT3duUHJvcGVydHk7CnZhciBlbXB0eU9wdGlvbnM1ID0ge307CmZ1bmN0aW9uIGNyZWF0ZVN0YXRlKHRyZWUsIG9wdGlvbnMpIHsKICBjb25zdCBzZXR0aW5ncyA9IG9wdGlvbnMgfHwgZW1wdHlPcHRpb25zNTsKICBjb25zdCBkZWZpbml0aW9uQnlJZCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgY29uc3QgZm9vdG5vdGVCeUlkID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICBjb25zdCBmb290bm90ZUNvdW50cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgY29uc3QgaGFuZGxlcnMyID0geyAuLi5oYW5kbGVycywgLi4uc2V0dGluZ3MuaGFuZGxlcnMgfTsKICBjb25zdCBzdGF0ZSA9IHsKICAgIGFsbDogYWxsMywKICAgIGFwcGx5RGF0YSwKICAgIGRlZmluaXRpb25CeUlkLAogICAgZm9vdG5vdGVCeUlkLAogICAgZm9vdG5vdGVDb3VudHMsCiAgICBmb290bm90ZU9yZGVyOiBbXSwKICAgIGhhbmRsZXJzOiBoYW5kbGVyczIsCiAgICBvbmU6IG9uZTMsCiAgICBvcHRpb25zOiBzZXR0aW5ncywKICAgIHBhdGNoOiBwYXRjaDIsCiAgICB3cmFwOiB3cmFwMwogIH07CiAgdmlzaXQodHJlZSwgZnVuY3Rpb24obm9kZTIpIHsKICAgIGlmIChub2RlMi50eXBlID09PSAiZGVmaW5pdGlvbiIgfHwgbm9kZTIudHlwZSA9PT0gImZvb3Rub3RlRGVmaW5pdGlvbiIpIHsKICAgICAgY29uc3QgbWFwNyA9IG5vZGUyLnR5cGUgPT09ICJkZWZpbml0aW9uIiA/IGRlZmluaXRpb25CeUlkIDogZm9vdG5vdGVCeUlkOwogICAgICBjb25zdCBpZCA9IFN0cmluZyhub2RlMi5pZGVudGlmaWVyKS50b1VwcGVyQ2FzZSgpOwogICAgICBpZiAoIW1hcDcuaGFzKGlkKSkgewogICAgICAgIG1hcDcuc2V0KGlkLCBub2RlMik7CiAgICAgIH0KICAgIH0KICB9KTsKICByZXR1cm4gc3RhdGU7CiAgZnVuY3Rpb24gb25lMyhub2RlMiwgcGFyZW50KSB7CiAgICBjb25zdCB0eXBlNSA9IG5vZGUyLnR5cGU7CiAgICBjb25zdCBoYW5kbGUzID0gc3RhdGUuaGFuZGxlcnNbdHlwZTVdOwogICAgaWYgKG93bjguY2FsbChzdGF0ZS5oYW5kbGVycywgdHlwZTUpICYmIGhhbmRsZTMpIHsKICAgICAgcmV0dXJuIGhhbmRsZTMoc3RhdGUsIG5vZGUyLCBwYXJlbnQpOwogICAgfQogICAgaWYgKHN0YXRlLm9wdGlvbnMucGFzc1Rocm91Z2ggJiYgc3RhdGUub3B0aW9ucy5wYXNzVGhyb3VnaC5pbmNsdWRlcyh0eXBlNSkpIHsKICAgICAgaWYgKCJjaGlsZHJlbiIgaW4gbm9kZTIpIHsKICAgICAgICBjb25zdCB7IGNoaWxkcmVuOiBjaGlsZHJlbjIsIC4uLnNoYWxsb3cgfSA9IG5vZGUyOwogICAgICAgIGNvbnN0IHJlc3VsdCA9IGVzbV9kZWZhdWx0KHNoYWxsb3cpOwogICAgICAgIHJlc3VsdC5jaGlsZHJlbiA9IHN0YXRlLmFsbChub2RlMik7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgICByZXR1cm4gZXNtX2RlZmF1bHQobm9kZTIpOwogICAgfQogICAgY29uc3QgdW5rbm93bjMgPSBzdGF0ZS5vcHRpb25zLnVua25vd25IYW5kbGVyIHx8IGRlZmF1bHRVbmtub3duSGFuZGxlcjsKICAgIHJldHVybiB1bmtub3duMyhzdGF0ZSwgbm9kZTIsIHBhcmVudCk7CiAgfQogIF9fbmFtZShvbmUzLCAib25lIik7CiAgZnVuY3Rpb24gYWxsMyhwYXJlbnQpIHsKICAgIGNvbnN0IHZhbHVlcyA9IFtdOwogICAgaWYgKCJjaGlsZHJlbiIgaW4gcGFyZW50KSB7CiAgICAgIGNvbnN0IG5vZGVzID0gcGFyZW50LmNoaWxkcmVuOwogICAgICBsZXQgaW5kZXgyID0gLTE7CiAgICAgIHdoaWxlICgrK2luZGV4MiA8IG5vZGVzLmxlbmd0aCkgewogICAgICAgIGNvbnN0IHJlc3VsdCA9IHN0YXRlLm9uZShub2Rlc1tpbmRleDJdLCBwYXJlbnQpOwogICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgIGlmIChpbmRleDIgJiYgbm9kZXNbaW5kZXgyIC0gMV0udHlwZSA9PT0gImJyZWFrIikgewogICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocmVzdWx0KSAmJiByZXN1bHQudHlwZSA9PT0gInRleHQiKSB7CiAgICAgICAgICAgICAgcmVzdWx0LnZhbHVlID0gdHJpbU1hcmtkb3duU3BhY2VTdGFydChyZXN1bHQudmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShyZXN1bHQpICYmIHJlc3VsdC50eXBlID09PSAiZWxlbWVudCIpIHsKICAgICAgICAgICAgICBjb25zdCBoZWFkMiA9IHJlc3VsdC5jaGlsZHJlblswXTsKICAgICAgICAgICAgICBpZiAoaGVhZDIgJiYgaGVhZDIudHlwZSA9PT0gInRleHQiKSB7CiAgICAgICAgICAgICAgICBoZWFkMi52YWx1ZSA9IHRyaW1NYXJrZG93blNwYWNlU3RhcnQoaGVhZDIudmFsdWUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkgewogICAgICAgICAgICB2YWx1ZXMucHVzaCguLi5yZXN1bHQpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFsdWVzLnB1c2gocmVzdWx0KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB2YWx1ZXM7CiAgfQogIF9fbmFtZShhbGwzLCAiYWxsIik7Cn0KX19uYW1lKGNyZWF0ZVN0YXRlLCAiY3JlYXRlU3RhdGUiKTsKZnVuY3Rpb24gcGF0Y2gyKGZyb20yLCB0bykgewogIGlmIChmcm9tMi5wb3NpdGlvbikgdG8ucG9zaXRpb24gPSBwb3NpdGlvbjIoZnJvbTIpOwp9Cl9fbmFtZShwYXRjaDIsICJwYXRjaCIpOwpmdW5jdGlvbiBhcHBseURhdGEoZnJvbTIsIHRvKSB7CiAgbGV0IHJlc3VsdCA9IHRvOwogIGlmIChmcm9tMiAmJiBmcm9tMi5kYXRhKSB7CiAgICBjb25zdCBoTmFtZSA9IGZyb20yLmRhdGEuaE5hbWU7CiAgICBjb25zdCBoQ2hpbGRyZW4gPSBmcm9tMi5kYXRhLmhDaGlsZHJlbjsKICAgIGNvbnN0IGhQcm9wZXJ0aWVzID0gZnJvbTIuZGF0YS5oUHJvcGVydGllczsKICAgIGlmICh0eXBlb2YgaE5hbWUgPT09ICJzdHJpbmciKSB7CiAgICAgIGlmIChyZXN1bHQudHlwZSA9PT0gImVsZW1lbnQiKSB7CiAgICAgICAgcmVzdWx0LnRhZ05hbWUgPSBoTmFtZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBjaGlsZHJlbjIgPSAiY2hpbGRyZW4iIGluIHJlc3VsdCA/IHJlc3VsdC5jaGlsZHJlbiA6IFtyZXN1bHRdOwogICAgICAgIHJlc3VsdCA9IHsgdHlwZTogImVsZW1lbnQiLCB0YWdOYW1lOiBoTmFtZSwgcHJvcGVydGllczoge30sIGNoaWxkcmVuOiBjaGlsZHJlbjIgfTsKICAgICAgfQogICAgfQogICAgaWYgKHJlc3VsdC50eXBlID09PSAiZWxlbWVudCIgJiYgaFByb3BlcnRpZXMpIHsKICAgICAgT2JqZWN0LmFzc2lnbihyZXN1bHQucHJvcGVydGllcywgZXNtX2RlZmF1bHQoaFByb3BlcnRpZXMpKTsKICAgIH0KICAgIGlmICgiY2hpbGRyZW4iIGluIHJlc3VsdCAmJiByZXN1bHQuY2hpbGRyZW4gJiYgaENoaWxkcmVuICE9PSBudWxsICYmIGhDaGlsZHJlbiAhPT0gdm9pZCAwKSB7CiAgICAgIHJlc3VsdC5jaGlsZHJlbiA9IGhDaGlsZHJlbjsKICAgIH0KICB9CiAgcmV0dXJuIHJlc3VsdDsKfQpfX25hbWUoYXBwbHlEYXRhLCAiYXBwbHlEYXRhIik7CmZ1bmN0aW9uIGRlZmF1bHRVbmtub3duSGFuZGxlcihzdGF0ZSwgbm9kZTIpIHsKICBjb25zdCBkYXRhID0gbm9kZTIuZGF0YSB8fCB7fTsKICBjb25zdCByZXN1bHQgPSAidmFsdWUiIGluIG5vZGUyICYmICEob3duOC5jYWxsKGRhdGEsICJoUHJvcGVydGllcyIpIHx8IG93bjguY2FsbChkYXRhLCAiaENoaWxkcmVuIikpID8geyB0eXBlOiAidGV4dCIsIHZhbHVlOiBub2RlMi52YWx1ZSB9IDogewogICAgdHlwZTogImVsZW1lbnQiLAogICAgdGFnTmFtZTogImRpdiIsCiAgICBwcm9wZXJ0aWVzOiB7fSwKICAgIGNoaWxkcmVuOiBzdGF0ZS5hbGwobm9kZTIpCiAgfTsKICBzdGF0ZS5wYXRjaChub2RlMiwgcmVzdWx0KTsKICByZXR1cm4gc3RhdGUuYXBwbHlEYXRhKG5vZGUyLCByZXN1bHQpOwp9Cl9fbmFtZShkZWZhdWx0VW5rbm93bkhhbmRsZXIsICJkZWZhdWx0VW5rbm93bkhhbmRsZXIiKTsKZnVuY3Rpb24gd3JhcDMobm9kZXMsIGxvb3NlKSB7CiAgY29uc3QgcmVzdWx0ID0gW107CiAgbGV0IGluZGV4MiA9IC0xOwogIGlmIChsb29zZSkgewogICAgcmVzdWx0LnB1c2goeyB0eXBlOiAidGV4dCIsIHZhbHVlOiAiXG4iIH0pOwogIH0KICB3aGlsZSAoKytpbmRleDIgPCBub2Rlcy5sZW5ndGgpIHsKICAgIGlmIChpbmRleDIpIHJlc3VsdC5wdXNoKHsgdHlwZTogInRleHQiLCB2YWx1ZTogIlxuIiB9KTsKICAgIHJlc3VsdC5wdXNoKG5vZGVzW2luZGV4Ml0pOwogIH0KICBpZiAobG9vc2UgJiYgbm9kZXMubGVuZ3RoID4gMCkgewogICAgcmVzdWx0LnB1c2goeyB0eXBlOiAidGV4dCIsIHZhbHVlOiAiXG4iIH0pOwogIH0KICByZXR1cm4gcmVzdWx0Owp9Cl9fbmFtZSh3cmFwMywgIndyYXAiKTsKZnVuY3Rpb24gdHJpbU1hcmtkb3duU3BhY2VTdGFydCh2YWx1ZTIpIHsKICBsZXQgaW5kZXgyID0gMDsKICBsZXQgY29kZTQgPSB2YWx1ZTIuY2hhckNvZGVBdChpbmRleDIpOwogIHdoaWxlIChjb2RlNCA9PT0gOSB8fCBjb2RlNCA9PT0gMzIpIHsKICAgIGluZGV4MisrOwogICAgY29kZTQgPSB2YWx1ZTIuY2hhckNvZGVBdChpbmRleDIpOwogIH0KICByZXR1cm4gdmFsdWUyLnNsaWNlKGluZGV4Mik7Cn0KX19uYW1lKHRyaW1NYXJrZG93blNwYWNlU3RhcnQsICJ0cmltTWFya2Rvd25TcGFjZVN0YXJ0Iik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9pbmRleC5qcwpmdW5jdGlvbiB0b0hhc3QodHJlZSwgb3B0aW9ucykgewogIGNvbnN0IHN0YXRlID0gY3JlYXRlU3RhdGUodHJlZSwgb3B0aW9ucyk7CiAgY29uc3Qgbm9kZTIgPSBzdGF0ZS5vbmUodHJlZSwgdm9pZCAwKTsKICBjb25zdCBmb290ID0gZm9vdGVyKHN0YXRlKTsKICBjb25zdCByZXN1bHQgPSBBcnJheS5pc0FycmF5KG5vZGUyKSA/IHsgdHlwZTogInJvb3QiLCBjaGlsZHJlbjogbm9kZTIgfSA6IG5vZGUyIHx8IHsgdHlwZTogInJvb3QiLCBjaGlsZHJlbjogW10gfTsKICBpZiAoZm9vdCkgewogICAgb2soImNoaWxkcmVuIiBpbiByZXN1bHQpOwogICAgcmVzdWx0LmNoaWxkcmVuLnB1c2goeyB0eXBlOiAidGV4dCIsIHZhbHVlOiAiXG4iIH0sIGZvb3QpOwogIH0KICByZXR1cm4gcmVzdWx0Owp9Cl9fbmFtZSh0b0hhc3QsICJ0b0hhc3QiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9odG1sLXZvaWQtZWxlbWVudHNAMy4wLjAvbm9kZV9tb2R1bGVzL2h0bWwtdm9pZC1lbGVtZW50cy9pbmRleC5qcwp2YXIgaHRtbFZvaWRFbGVtZW50cyA9IFsKICAiYXJlYSIsCiAgImJhc2UiLAogICJiYXNlZm9udCIsCiAgImJnc291bmQiLAogICJiciIsCiAgImNvbCIsCiAgImNvbW1hbmQiLAogICJlbWJlZCIsCiAgImZyYW1lIiwKICAiaHIiLAogICJpbWFnZSIsCiAgImltZyIsCiAgImlucHV0IiwKICAia2V5Z2VuIiwKICAibGluayIsCiAgIm1ldGEiLAogICJwYXJhbSIsCiAgInNvdXJjZSIsCiAgInRyYWNrIiwKICAid2JyIgpdOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3Byb3BlcnR5LWluZm9ybWF0aW9uQDcuMS4wL25vZGVfbW9kdWxlcy9wcm9wZXJ0eS1pbmZvcm1hdGlvbi9saWIvdXRpbC9zY2hlbWEuanMKdmFyIFNjaGVtYSA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJTY2hlbWEiKTsKICB9CiAgLyoqCiAgICogQHBhcmFtIHtTY2hlbWFUeXBlWydwcm9wZXJ0eSddfSBwcm9wZXJ0eQogICAqICAgUHJvcGVydHkuCiAgICogQHBhcmFtIHtTY2hlbWFUeXBlWydub3JtYWwnXX0gbm9ybWFsCiAgICogICBOb3JtYWwuCiAgICogQHBhcmFtIHtTcGFjZSB8IHVuZGVmaW5lZH0gW3NwYWNlXQogICAqICAgU3BhY2UuCiAgICogQHJldHVybnMKICAgKiAgIFNjaGVtYS4KICAgKi8KICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eSwgbm9ybWFsLCBzcGFjZTIpIHsKICAgIHRoaXMubm9ybWFsID0gbm9ybWFsOwogICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5OwogICAgaWYgKHNwYWNlMikgewogICAgICB0aGlzLnNwYWNlID0gc3BhY2UyOwogICAgfQogIH0KfTsKU2NoZW1hLnByb3RvdHlwZS5ub3JtYWwgPSB7fTsKU2NoZW1hLnByb3RvdHlwZS5wcm9wZXJ0eSA9IHt9OwpTY2hlbWEucHJvdG90eXBlLnNwYWNlID0gdm9pZCAwOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3Byb3BlcnR5LWluZm9ybWF0aW9uQDcuMS4wL25vZGVfbW9kdWxlcy9wcm9wZXJ0eS1pbmZvcm1hdGlvbi9saWIvdXRpbC9tZXJnZS5qcwpmdW5jdGlvbiBtZXJnZTMoZGVmaW5pdGlvbnMsIHNwYWNlMikgewogIGNvbnN0IHByb3BlcnR5ID0ge307CiAgY29uc3Qgbm9ybWFsID0ge307CiAgZm9yIChjb25zdCBkZWZpbml0aW9uMyBvZiBkZWZpbml0aW9ucykgewogICAgT2JqZWN0LmFzc2lnbihwcm9wZXJ0eSwgZGVmaW5pdGlvbjMucHJvcGVydHkpOwogICAgT2JqZWN0LmFzc2lnbihub3JtYWwsIGRlZmluaXRpb24zLm5vcm1hbCk7CiAgfQogIHJldHVybiBuZXcgU2NoZW1hKHByb3BlcnR5LCBub3JtYWwsIHNwYWNlMik7Cn0KX19uYW1lKG1lcmdlMywgIm1lcmdlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcHJvcGVydHktaW5mb3JtYXRpb25ANy4xLjAvbm9kZV9tb2R1bGVzL3Byb3BlcnR5LWluZm9ybWF0aW9uL2xpYi9ub3JtYWxpemUuanMKZnVuY3Rpb24gbm9ybWFsaXplMyh2YWx1ZTIpIHsKICByZXR1cm4gdmFsdWUyLnRvTG93ZXJDYXNlKCk7Cn0KX19uYW1lKG5vcm1hbGl6ZTMsICJub3JtYWxpemUiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL3V0aWwvaW5mby5qcwp2YXIgSW5mbyA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJJbmZvIik7CiAgfQogIC8qKgogICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eQogICAqICAgUHJvcGVydHkuCiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZQogICAqICAgQXR0cmlidXRlLgogICAqIEByZXR1cm5zCiAgICogICBJbmZvLgogICAqLwogIGNvbnN0cnVjdG9yKHByb3BlcnR5LCBhdHRyaWJ1dGUpIHsKICAgIHRoaXMuYXR0cmlidXRlID0gYXR0cmlidXRlOwogICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5OwogIH0KfTsKSW5mby5wcm90b3R5cGUuYXR0cmlidXRlID0gIiI7CkluZm8ucHJvdG90eXBlLmJvb2xlYW5pc2ggPSBmYWxzZTsKSW5mby5wcm90b3R5cGUuYm9vbGVhbiA9IGZhbHNlOwpJbmZvLnByb3RvdHlwZS5jb21tYU9yU3BhY2VTZXBhcmF0ZWQgPSBmYWxzZTsKSW5mby5wcm90b3R5cGUuY29tbWFTZXBhcmF0ZWQgPSBmYWxzZTsKSW5mby5wcm90b3R5cGUuZGVmaW5lZCA9IGZhbHNlOwpJbmZvLnByb3RvdHlwZS5tdXN0VXNlUHJvcGVydHkgPSBmYWxzZTsKSW5mby5wcm90b3R5cGUubnVtYmVyID0gZmFsc2U7CkluZm8ucHJvdG90eXBlLm92ZXJsb2FkZWRCb29sZWFuID0gZmFsc2U7CkluZm8ucHJvdG90eXBlLnByb3BlcnR5ID0gIiI7CkluZm8ucHJvdG90eXBlLnNwYWNlU2VwYXJhdGVkID0gZmFsc2U7CkluZm8ucHJvdG90eXBlLnNwYWNlID0gdm9pZCAwOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3Byb3BlcnR5LWluZm9ybWF0aW9uQDcuMS4wL25vZGVfbW9kdWxlcy9wcm9wZXJ0eS1pbmZvcm1hdGlvbi9saWIvdXRpbC90eXBlcy5qcwp2YXIgdHlwZXNfZXhwb3J0cyA9IHt9OwpfX2V4cG9ydCh0eXBlc19leHBvcnRzLCB7CiAgYm9vbGVhbjogKCkgPT4gYm9vbGVhbiwKICBib29sZWFuaXNoOiAoKSA9PiBib29sZWFuaXNoLAogIGNvbW1hT3JTcGFjZVNlcGFyYXRlZDogKCkgPT4gY29tbWFPclNwYWNlU2VwYXJhdGVkLAogIGNvbW1hU2VwYXJhdGVkOiAoKSA9PiBjb21tYVNlcGFyYXRlZCwKICBudW1iZXI6ICgpID0+IG51bWJlciwKICBvdmVybG9hZGVkQm9vbGVhbjogKCkgPT4gb3ZlcmxvYWRlZEJvb2xlYW4sCiAgc3BhY2VTZXBhcmF0ZWQ6ICgpID0+IHNwYWNlU2VwYXJhdGVkCn0pOwp2YXIgcG93ZXJzID0gMDsKdmFyIGJvb2xlYW4gPSBpbmNyZW1lbnQoKTsKdmFyIGJvb2xlYW5pc2ggPSBpbmNyZW1lbnQoKTsKdmFyIG92ZXJsb2FkZWRCb29sZWFuID0gaW5jcmVtZW50KCk7CnZhciBudW1iZXIgPSBpbmNyZW1lbnQoKTsKdmFyIHNwYWNlU2VwYXJhdGVkID0gaW5jcmVtZW50KCk7CnZhciBjb21tYVNlcGFyYXRlZCA9IGluY3JlbWVudCgpOwp2YXIgY29tbWFPclNwYWNlU2VwYXJhdGVkID0gaW5jcmVtZW50KCk7CmZ1bmN0aW9uIGluY3JlbWVudCgpIHsKICByZXR1cm4gMiAqKiArK3Bvd2VyczsKfQpfX25hbWUoaW5jcmVtZW50LCAiaW5jcmVtZW50Iik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcHJvcGVydHktaW5mb3JtYXRpb25ANy4xLjAvbm9kZV9tb2R1bGVzL3Byb3BlcnR5LWluZm9ybWF0aW9uL2xpYi91dGlsL2RlZmluZWQtaW5mby5qcwp2YXIgY2hlY2tzID0gKAogIC8qKiBAdHlwZSB7UmVhZG9ubHlBcnJheTxrZXlvZiB0eXBlb2YgdHlwZXM+fSAqLwogIE9iamVjdC5rZXlzKHR5cGVzX2V4cG9ydHMpCik7CnZhciBEZWZpbmVkSW5mbyA9IGNsYXNzIGV4dGVuZHMgSW5mbyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiRGVmaW5lZEluZm8iKTsKICB9CiAgLyoqCiAgICogQGNvbnN0cnVjdG9yCiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5CiAgICogICBQcm9wZXJ0eS4KICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlCiAgICogICBBdHRyaWJ1dGUuCiAgICogQHBhcmFtIHtudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkfSBbbWFza10KICAgKiAgIE1hc2suCiAgICogQHBhcmFtIHtTcGFjZSB8IHVuZGVmaW5lZH0gW3NwYWNlXQogICAqICAgU3BhY2UuCiAgICogQHJldHVybnMKICAgKiAgIEluZm8uCiAgICovCiAgY29uc3RydWN0b3IocHJvcGVydHksIGF0dHJpYnV0ZSwgbWFzaywgc3BhY2UyKSB7CiAgICBsZXQgaW5kZXgyID0gLTE7CiAgICBzdXBlcihwcm9wZXJ0eSwgYXR0cmlidXRlKTsKICAgIG1hcmsodGhpcywgInNwYWNlIiwgc3BhY2UyKTsKICAgIGlmICh0eXBlb2YgbWFzayA9PT0gIm51bWJlciIpIHsKICAgICAgd2hpbGUgKCsraW5kZXgyIDwgY2hlY2tzLmxlbmd0aCkgewogICAgICAgIGNvbnN0IGNoZWNrID0gY2hlY2tzW2luZGV4Ml07CiAgICAgICAgbWFyayh0aGlzLCBjaGVja3NbaW5kZXgyXSwgKG1hc2sgJiB0eXBlc19leHBvcnRzW2NoZWNrXSkgPT09IHR5cGVzX2V4cG9ydHNbY2hlY2tdKTsKICAgICAgfQogICAgfQogIH0KfTsKRGVmaW5lZEluZm8ucHJvdG90eXBlLmRlZmluZWQgPSB0cnVlOwpmdW5jdGlvbiBtYXJrKHZhbHVlcywga2V5MiwgdmFsdWUyKSB7CiAgaWYgKHZhbHVlMikgewogICAgdmFsdWVzW2tleTJdID0gdmFsdWUyOwogIH0KfQpfX25hbWUobWFyaywgIm1hcmsiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL3V0aWwvY3JlYXRlLmpzCmZ1bmN0aW9uIGNyZWF0ZTYoZGVmaW5pdGlvbjMpIHsKICBjb25zdCBwcm9wZXJ0aWVzMiA9IHt9OwogIGNvbnN0IG5vcm1hbHMgPSB7fTsKICBmb3IgKGNvbnN0IFtwcm9wZXJ0eSwgdmFsdWUyXSBvZiBPYmplY3QuZW50cmllcyhkZWZpbml0aW9uMy5wcm9wZXJ0aWVzKSkgewogICAgY29uc3QgaW5mbyA9IG5ldyBEZWZpbmVkSW5mbygKICAgICAgcHJvcGVydHksCiAgICAgIGRlZmluaXRpb24zLnRyYW5zZm9ybShkZWZpbml0aW9uMy5hdHRyaWJ1dGVzIHx8IHt9LCBwcm9wZXJ0eSksCiAgICAgIHZhbHVlMiwKICAgICAgZGVmaW5pdGlvbjMuc3BhY2UKICAgICk7CiAgICBpZiAoZGVmaW5pdGlvbjMubXVzdFVzZVByb3BlcnR5ICYmIGRlZmluaXRpb24zLm11c3RVc2VQcm9wZXJ0eS5pbmNsdWRlcyhwcm9wZXJ0eSkpIHsKICAgICAgaW5mby5tdXN0VXNlUHJvcGVydHkgPSB0cnVlOwogICAgfQogICAgcHJvcGVydGllczJbcHJvcGVydHldID0gaW5mbzsKICAgIG5vcm1hbHNbbm9ybWFsaXplMyhwcm9wZXJ0eSldID0gcHJvcGVydHk7CiAgICBub3JtYWxzW25vcm1hbGl6ZTMoaW5mby5hdHRyaWJ1dGUpXSA9IHByb3BlcnR5OwogIH0KICByZXR1cm4gbmV3IFNjaGVtYShwcm9wZXJ0aWVzMiwgbm9ybWFscywgZGVmaW5pdGlvbjMuc3BhY2UpOwp9Cl9fbmFtZShjcmVhdGU2LCAiY3JlYXRlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcHJvcGVydHktaW5mb3JtYXRpb25ANy4xLjAvbm9kZV9tb2R1bGVzL3Byb3BlcnR5LWluZm9ybWF0aW9uL2xpYi9hcmlhLmpzCnZhciBhcmlhMiA9IGNyZWF0ZTYoewogIHByb3BlcnRpZXM6IHsKICAgIGFyaWFBY3RpdmVEZXNjZW5kYW50OiBudWxsLAogICAgYXJpYUF0b21pYzogYm9vbGVhbmlzaCwKICAgIGFyaWFBdXRvQ29tcGxldGU6IG51bGwsCiAgICBhcmlhQnVzeTogYm9vbGVhbmlzaCwKICAgIGFyaWFDaGVja2VkOiBib29sZWFuaXNoLAogICAgYXJpYUNvbENvdW50OiBudW1iZXIsCiAgICBhcmlhQ29sSW5kZXg6IG51bWJlciwKICAgIGFyaWFDb2xTcGFuOiBudW1iZXIsCiAgICBhcmlhQ29udHJvbHM6IHNwYWNlU2VwYXJhdGVkLAogICAgYXJpYUN1cnJlbnQ6IG51bGwsCiAgICBhcmlhRGVzY3JpYmVkQnk6IHNwYWNlU2VwYXJhdGVkLAogICAgYXJpYURldGFpbHM6IG51bGwsCiAgICBhcmlhRGlzYWJsZWQ6IGJvb2xlYW5pc2gsCiAgICBhcmlhRHJvcEVmZmVjdDogc3BhY2VTZXBhcmF0ZWQsCiAgICBhcmlhRXJyb3JNZXNzYWdlOiBudWxsLAogICAgYXJpYUV4cGFuZGVkOiBib29sZWFuaXNoLAogICAgYXJpYUZsb3dUbzogc3BhY2VTZXBhcmF0ZWQsCiAgICBhcmlhR3JhYmJlZDogYm9vbGVhbmlzaCwKICAgIGFyaWFIYXNQb3B1cDogbnVsbCwKICAgIGFyaWFIaWRkZW46IGJvb2xlYW5pc2gsCiAgICBhcmlhSW52YWxpZDogbnVsbCwKICAgIGFyaWFLZXlTaG9ydGN1dHM6IG51bGwsCiAgICBhcmlhTGFiZWw6IG51bGwsCiAgICBhcmlhTGFiZWxsZWRCeTogc3BhY2VTZXBhcmF0ZWQsCiAgICBhcmlhTGV2ZWw6IG51bWJlciwKICAgIGFyaWFMaXZlOiBudWxsLAogICAgYXJpYU1vZGFsOiBib29sZWFuaXNoLAogICAgYXJpYU11bHRpTGluZTogYm9vbGVhbmlzaCwKICAgIGFyaWFNdWx0aVNlbGVjdGFibGU6IGJvb2xlYW5pc2gsCiAgICBhcmlhT3JpZW50YXRpb246IG51bGwsCiAgICBhcmlhT3duczogc3BhY2VTZXBhcmF0ZWQsCiAgICBhcmlhUGxhY2Vob2xkZXI6IG51bGwsCiAgICBhcmlhUG9zSW5TZXQ6IG51bWJlciwKICAgIGFyaWFQcmVzc2VkOiBib29sZWFuaXNoLAogICAgYXJpYVJlYWRPbmx5OiBib29sZWFuaXNoLAogICAgYXJpYVJlbGV2YW50OiBudWxsLAogICAgYXJpYVJlcXVpcmVkOiBib29sZWFuaXNoLAogICAgYXJpYVJvbGVEZXNjcmlwdGlvbjogc3BhY2VTZXBhcmF0ZWQsCiAgICBhcmlhUm93Q291bnQ6IG51bWJlciwKICAgIGFyaWFSb3dJbmRleDogbnVtYmVyLAogICAgYXJpYVJvd1NwYW46IG51bWJlciwKICAgIGFyaWFTZWxlY3RlZDogYm9vbGVhbmlzaCwKICAgIGFyaWFTZXRTaXplOiBudW1iZXIsCiAgICBhcmlhU29ydDogbnVsbCwKICAgIGFyaWFWYWx1ZU1heDogbnVtYmVyLAogICAgYXJpYVZhbHVlTWluOiBudW1iZXIsCiAgICBhcmlhVmFsdWVOb3c6IG51bWJlciwKICAgIGFyaWFWYWx1ZVRleHQ6IG51bGwsCiAgICByb2xlOiBudWxsCiAgfSwKICB0cmFuc2Zvcm0oXzMsIHByb3BlcnR5KSB7CiAgICByZXR1cm4gcHJvcGVydHkgPT09ICJyb2xlIiA/IHByb3BlcnR5IDogImFyaWEtIiArIHByb3BlcnR5LnNsaWNlKDQpLnRvTG93ZXJDYXNlKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL3V0aWwvY2FzZS1zZW5zaXRpdmUtdHJhbnNmb3JtLmpzCmZ1bmN0aW9uIGNhc2VTZW5zaXRpdmVUcmFuc2Zvcm0oYXR0cmlidXRlcywgYXR0cmlidXRlKSB7CiAgcmV0dXJuIGF0dHJpYnV0ZSBpbiBhdHRyaWJ1dGVzID8gYXR0cmlidXRlc1thdHRyaWJ1dGVdIDogYXR0cmlidXRlOwp9Cl9fbmFtZShjYXNlU2Vuc2l0aXZlVHJhbnNmb3JtLCAiY2FzZVNlbnNpdGl2ZVRyYW5zZm9ybSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3Byb3BlcnR5LWluZm9ybWF0aW9uQDcuMS4wL25vZGVfbW9kdWxlcy9wcm9wZXJ0eS1pbmZvcm1hdGlvbi9saWIvdXRpbC9jYXNlLWluc2Vuc2l0aXZlLXRyYW5zZm9ybS5qcwpmdW5jdGlvbiBjYXNlSW5zZW5zaXRpdmVUcmFuc2Zvcm0oYXR0cmlidXRlcywgcHJvcGVydHkpIHsKICByZXR1cm4gY2FzZVNlbnNpdGl2ZVRyYW5zZm9ybShhdHRyaWJ1dGVzLCBwcm9wZXJ0eS50b0xvd2VyQ2FzZSgpKTsKfQpfX25hbWUoY2FzZUluc2Vuc2l0aXZlVHJhbnNmb3JtLCAiY2FzZUluc2Vuc2l0aXZlVHJhbnNmb3JtIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcHJvcGVydHktaW5mb3JtYXRpb25ANy4xLjAvbm9kZV9tb2R1bGVzL3Byb3BlcnR5LWluZm9ybWF0aW9uL2xpYi9odG1sLmpzCnZhciBodG1sMyA9IGNyZWF0ZTYoewogIGF0dHJpYnV0ZXM6IHsKICAgIGFjY2VwdGNoYXJzZXQ6ICJhY2NlcHQtY2hhcnNldCIsCiAgICBjbGFzc25hbWU6ICJjbGFzcyIsCiAgICBodG1sZm9yOiAiZm9yIiwKICAgIGh0dHBlcXVpdjogImh0dHAtZXF1aXYiCiAgfSwKICBtdXN0VXNlUHJvcGVydHk6IFsiY2hlY2tlZCIsICJtdWx0aXBsZSIsICJtdXRlZCIsICJzZWxlY3RlZCJdLAogIHByb3BlcnRpZXM6IHsKICAgIC8vIFN0YW5kYXJkIFByb3BlcnRpZXMuCiAgICBhYmJyOiBudWxsLAogICAgYWNjZXB0OiBjb21tYVNlcGFyYXRlZCwKICAgIGFjY2VwdENoYXJzZXQ6IHNwYWNlU2VwYXJhdGVkLAogICAgYWNjZXNzS2V5OiBzcGFjZVNlcGFyYXRlZCwKICAgIGFjdGlvbjogbnVsbCwKICAgIGFsbG93OiBudWxsLAogICAgYWxsb3dGdWxsU2NyZWVuOiBib29sZWFuLAogICAgYWxsb3dQYXltZW50UmVxdWVzdDogYm9vbGVhbiwKICAgIGFsbG93VXNlck1lZGlhOiBib29sZWFuLAogICAgYWx0OiBudWxsLAogICAgYXM6IG51bGwsCiAgICBhc3luYzogYm9vbGVhbiwKICAgIGF1dG9DYXBpdGFsaXplOiBudWxsLAogICAgYXV0b0NvbXBsZXRlOiBzcGFjZVNlcGFyYXRlZCwKICAgIGF1dG9Gb2N1czogYm9vbGVhbiwKICAgIGF1dG9QbGF5OiBib29sZWFuLAogICAgYmxvY2tpbmc6IHNwYWNlU2VwYXJhdGVkLAogICAgY2FwdHVyZTogbnVsbCwKICAgIGNoYXJTZXQ6IG51bGwsCiAgICBjaGVja2VkOiBib29sZWFuLAogICAgY2l0ZTogbnVsbCwKICAgIGNsYXNzTmFtZTogc3BhY2VTZXBhcmF0ZWQsCiAgICBjb2xzOiBudW1iZXIsCiAgICBjb2xTcGFuOiBudWxsLAogICAgY29udGVudDogbnVsbCwKICAgIGNvbnRlbnRFZGl0YWJsZTogYm9vbGVhbmlzaCwKICAgIGNvbnRyb2xzOiBib29sZWFuLAogICAgY29udHJvbHNMaXN0OiBzcGFjZVNlcGFyYXRlZCwKICAgIGNvb3JkczogbnVtYmVyIHwgY29tbWFTZXBhcmF0ZWQsCiAgICBjcm9zc09yaWdpbjogbnVsbCwKICAgIGRhdGE6IG51bGwsCiAgICBkYXRlVGltZTogbnVsbCwKICAgIGRlY29kaW5nOiBudWxsLAogICAgZGVmYXVsdDogYm9vbGVhbiwKICAgIGRlZmVyOiBib29sZWFuLAogICAgZGlyOiBudWxsLAogICAgZGlyTmFtZTogbnVsbCwKICAgIGRpc2FibGVkOiBib29sZWFuLAogICAgZG93bmxvYWQ6IG92ZXJsb2FkZWRCb29sZWFuLAogICAgZHJhZ2dhYmxlOiBib29sZWFuaXNoLAogICAgZW5jVHlwZTogbnVsbCwKICAgIGVudGVyS2V5SGludDogbnVsbCwKICAgIGZldGNoUHJpb3JpdHk6IG51bGwsCiAgICBmb3JtOiBudWxsLAogICAgZm9ybUFjdGlvbjogbnVsbCwKICAgIGZvcm1FbmNUeXBlOiBudWxsLAogICAgZm9ybU1ldGhvZDogbnVsbCwKICAgIGZvcm1Ob1ZhbGlkYXRlOiBib29sZWFuLAogICAgZm9ybVRhcmdldDogbnVsbCwKICAgIGhlYWRlcnM6IHNwYWNlU2VwYXJhdGVkLAogICAgaGVpZ2h0OiBudW1iZXIsCiAgICBoaWRkZW46IG92ZXJsb2FkZWRCb29sZWFuLAogICAgaGlnaDogbnVtYmVyLAogICAgaHJlZjogbnVsbCwKICAgIGhyZWZMYW5nOiBudWxsLAogICAgaHRtbEZvcjogc3BhY2VTZXBhcmF0ZWQsCiAgICBodHRwRXF1aXY6IHNwYWNlU2VwYXJhdGVkLAogICAgaWQ6IG51bGwsCiAgICBpbWFnZVNpemVzOiBudWxsLAogICAgaW1hZ2VTcmNTZXQ6IG51bGwsCiAgICBpbmVydDogYm9vbGVhbiwKICAgIGlucHV0TW9kZTogbnVsbCwKICAgIGludGVncml0eTogbnVsbCwKICAgIGlzOiBudWxsLAogICAgaXNNYXA6IGJvb2xlYW4sCiAgICBpdGVtSWQ6IG51bGwsCiAgICBpdGVtUHJvcDogc3BhY2VTZXBhcmF0ZWQsCiAgICBpdGVtUmVmOiBzcGFjZVNlcGFyYXRlZCwKICAgIGl0ZW1TY29wZTogYm9vbGVhbiwKICAgIGl0ZW1UeXBlOiBzcGFjZVNlcGFyYXRlZCwKICAgIGtpbmQ6IG51bGwsCiAgICBsYWJlbDogbnVsbCwKICAgIGxhbmc6IG51bGwsCiAgICBsYW5ndWFnZTogbnVsbCwKICAgIGxpc3Q6IG51bGwsCiAgICBsb2FkaW5nOiBudWxsLAogICAgbG9vcDogYm9vbGVhbiwKICAgIGxvdzogbnVtYmVyLAogICAgbWFuaWZlc3Q6IG51bGwsCiAgICBtYXg6IG51bGwsCiAgICBtYXhMZW5ndGg6IG51bWJlciwKICAgIG1lZGlhOiBudWxsLAogICAgbWV0aG9kOiBudWxsLAogICAgbWluOiBudWxsLAogICAgbWluTGVuZ3RoOiBudW1iZXIsCiAgICBtdWx0aXBsZTogYm9vbGVhbiwKICAgIG11dGVkOiBib29sZWFuLAogICAgbmFtZTogbnVsbCwKICAgIG5vbmNlOiBudWxsLAogICAgbm9Nb2R1bGU6IGJvb2xlYW4sCiAgICBub1ZhbGlkYXRlOiBib29sZWFuLAogICAgb25BYm9ydDogbnVsbCwKICAgIG9uQWZ0ZXJQcmludDogbnVsbCwKICAgIG9uQXV4Q2xpY2s6IG51bGwsCiAgICBvbkJlZm9yZU1hdGNoOiBudWxsLAogICAgb25CZWZvcmVQcmludDogbnVsbCwKICAgIG9uQmVmb3JlVG9nZ2xlOiBudWxsLAogICAgb25CZWZvcmVVbmxvYWQ6IG51bGwsCiAgICBvbkJsdXI6IG51bGwsCiAgICBvbkNhbmNlbDogbnVsbCwKICAgIG9uQ2FuUGxheTogbnVsbCwKICAgIG9uQ2FuUGxheVRocm91Z2g6IG51bGwsCiAgICBvbkNoYW5nZTogbnVsbCwKICAgIG9uQ2xpY2s6IG51bGwsCiAgICBvbkNsb3NlOiBudWxsLAogICAgb25Db250ZXh0TG9zdDogbnVsbCwKICAgIG9uQ29udGV4dE1lbnU6IG51bGwsCiAgICBvbkNvbnRleHRSZXN0b3JlZDogbnVsbCwKICAgIG9uQ29weTogbnVsbCwKICAgIG9uQ3VlQ2hhbmdlOiBudWxsLAogICAgb25DdXQ6IG51bGwsCiAgICBvbkRibENsaWNrOiBudWxsLAogICAgb25EcmFnOiBudWxsLAogICAgb25EcmFnRW5kOiBudWxsLAogICAgb25EcmFnRW50ZXI6IG51bGwsCiAgICBvbkRyYWdFeGl0OiBudWxsLAogICAgb25EcmFnTGVhdmU6IG51bGwsCiAgICBvbkRyYWdPdmVyOiBudWxsLAogICAgb25EcmFnU3RhcnQ6IG51bGwsCiAgICBvbkRyb3A6IG51bGwsCiAgICBvbkR1cmF0aW9uQ2hhbmdlOiBudWxsLAogICAgb25FbXB0aWVkOiBudWxsLAogICAgb25FbmRlZDogbnVsbCwKICAgIG9uRXJyb3I6IG51bGwsCiAgICBvbkZvY3VzOiBudWxsLAogICAgb25Gb3JtRGF0YTogbnVsbCwKICAgIG9uSGFzaENoYW5nZTogbnVsbCwKICAgIG9uSW5wdXQ6IG51bGwsCiAgICBvbkludmFsaWQ6IG51bGwsCiAgICBvbktleURvd246IG51bGwsCiAgICBvbktleVByZXNzOiBudWxsLAogICAgb25LZXlVcDogbnVsbCwKICAgIG9uTGFuZ3VhZ2VDaGFuZ2U6IG51bGwsCiAgICBvbkxvYWQ6IG51bGwsCiAgICBvbkxvYWRlZERhdGE6IG51bGwsCiAgICBvbkxvYWRlZE1ldGFkYXRhOiBudWxsLAogICAgb25Mb2FkRW5kOiBudWxsLAogICAgb25Mb2FkU3RhcnQ6IG51bGwsCiAgICBvbk1lc3NhZ2U6IG51bGwsCiAgICBvbk1lc3NhZ2VFcnJvcjogbnVsbCwKICAgIG9uTW91c2VEb3duOiBudWxsLAogICAgb25Nb3VzZUVudGVyOiBudWxsLAogICAgb25Nb3VzZUxlYXZlOiBudWxsLAogICAgb25Nb3VzZU1vdmU6IG51bGwsCiAgICBvbk1vdXNlT3V0OiBudWxsLAogICAgb25Nb3VzZU92ZXI6IG51bGwsCiAgICBvbk1vdXNlVXA6IG51bGwsCiAgICBvbk9mZmxpbmU6IG51bGwsCiAgICBvbk9ubGluZTogbnVsbCwKICAgIG9uUGFnZUhpZGU6IG51bGwsCiAgICBvblBhZ2VTaG93OiBudWxsLAogICAgb25QYXN0ZTogbnVsbCwKICAgIG9uUGF1c2U6IG51bGwsCiAgICBvblBsYXk6IG51bGwsCiAgICBvblBsYXlpbmc6IG51bGwsCiAgICBvblBvcFN0YXRlOiBudWxsLAogICAgb25Qcm9ncmVzczogbnVsbCwKICAgIG9uUmF0ZUNoYW5nZTogbnVsbCwKICAgIG9uUmVqZWN0aW9uSGFuZGxlZDogbnVsbCwKICAgIG9uUmVzZXQ6IG51bGwsCiAgICBvblJlc2l6ZTogbnVsbCwKICAgIG9uU2Nyb2xsOiBudWxsLAogICAgb25TY3JvbGxFbmQ6IG51bGwsCiAgICBvblNlY3VyaXR5UG9saWN5VmlvbGF0aW9uOiBudWxsLAogICAgb25TZWVrZWQ6IG51bGwsCiAgICBvblNlZWtpbmc6IG51bGwsCiAgICBvblNlbGVjdDogbnVsbCwKICAgIG9uU2xvdENoYW5nZTogbnVsbCwKICAgIG9uU3RhbGxlZDogbnVsbCwKICAgIG9uU3RvcmFnZTogbnVsbCwKICAgIG9uU3VibWl0OiBudWxsLAogICAgb25TdXNwZW5kOiBudWxsLAogICAgb25UaW1lVXBkYXRlOiBudWxsLAogICAgb25Ub2dnbGU6IG51bGwsCiAgICBvblVuaGFuZGxlZFJlamVjdGlvbjogbnVsbCwKICAgIG9uVW5sb2FkOiBudWxsLAogICAgb25Wb2x1bWVDaGFuZ2U6IG51bGwsCiAgICBvbldhaXRpbmc6IG51bGwsCiAgICBvbldoZWVsOiBudWxsLAogICAgb3BlbjogYm9vbGVhbiwKICAgIG9wdGltdW06IG51bWJlciwKICAgIHBhdHRlcm46IG51bGwsCiAgICBwaW5nOiBzcGFjZVNlcGFyYXRlZCwKICAgIHBsYWNlaG9sZGVyOiBudWxsLAogICAgcGxheXNJbmxpbmU6IGJvb2xlYW4sCiAgICBwb3BvdmVyOiBudWxsLAogICAgcG9wb3ZlclRhcmdldDogbnVsbCwKICAgIHBvcG92ZXJUYXJnZXRBY3Rpb246IG51bGwsCiAgICBwb3N0ZXI6IG51bGwsCiAgICBwcmVsb2FkOiBudWxsLAogICAgcmVhZE9ubHk6IGJvb2xlYW4sCiAgICByZWZlcnJlclBvbGljeTogbnVsbCwKICAgIHJlbDogc3BhY2VTZXBhcmF0ZWQsCiAgICByZXF1aXJlZDogYm9vbGVhbiwKICAgIHJldmVyc2VkOiBib29sZWFuLAogICAgcm93czogbnVtYmVyLAogICAgcm93U3BhbjogbnVtYmVyLAogICAgc2FuZGJveDogc3BhY2VTZXBhcmF0ZWQsCiAgICBzY29wZTogbnVsbCwKICAgIHNjb3BlZDogYm9vbGVhbiwKICAgIHNlYW1sZXNzOiBib29sZWFuLAogICAgc2VsZWN0ZWQ6IGJvb2xlYW4sCiAgICBzaGFkb3dSb290Q2xvbmFibGU6IGJvb2xlYW4sCiAgICBzaGFkb3dSb290RGVsZWdhdGVzRm9jdXM6IGJvb2xlYW4sCiAgICBzaGFkb3dSb290TW9kZTogbnVsbCwKICAgIHNoYXBlOiBudWxsLAogICAgc2l6ZTogbnVtYmVyLAogICAgc2l6ZXM6IG51bGwsCiAgICBzbG90OiBudWxsLAogICAgc3BhbjogbnVtYmVyLAogICAgc3BlbGxDaGVjazogYm9vbGVhbmlzaCwKICAgIHNyYzogbnVsbCwKICAgIHNyY0RvYzogbnVsbCwKICAgIHNyY0xhbmc6IG51bGwsCiAgICBzcmNTZXQ6IG51bGwsCiAgICBzdGFydDogbnVtYmVyLAogICAgc3RlcDogbnVsbCwKICAgIHN0eWxlOiBudWxsLAogICAgdGFiSW5kZXg6IG51bWJlciwKICAgIHRhcmdldDogbnVsbCwKICAgIHRpdGxlOiBudWxsLAogICAgdHJhbnNsYXRlOiBudWxsLAogICAgdHlwZTogbnVsbCwKICAgIHR5cGVNdXN0TWF0Y2g6IGJvb2xlYW4sCiAgICB1c2VNYXA6IG51bGwsCiAgICB2YWx1ZTogYm9vbGVhbmlzaCwKICAgIHdpZHRoOiBudW1iZXIsCiAgICB3cmFwOiBudWxsLAogICAgd3JpdGluZ1N1Z2dlc3Rpb25zOiBudWxsLAogICAgLy8gTGVnYWN5LgogICAgLy8gU2VlOiBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNvdGhlci1lbGVtZW50cywtYXR0cmlidXRlcy1hbmQtYXBpcwogICAgYWxpZ246IG51bGwsCiAgICAvLyBTZXZlcmFsLiBVc2UgQ1NTIGB0ZXh0LWFsaWduYCBpbnN0ZWFkLAogICAgYUxpbms6IG51bGwsCiAgICAvLyBgPGJvZHk+YC4gVXNlIENTUyBgYTphY3RpdmUge2NvbG9yfWAgaW5zdGVhZAogICAgYXJjaGl2ZTogc3BhY2VTZXBhcmF0ZWQsCiAgICAvLyBgPG9iamVjdD5gLiBMaXN0IG9mIFVSSXMgdG8gYXJjaGl2ZXMKICAgIGF4aXM6IG51bGwsCiAgICAvLyBgPHRkPmAgYW5kIGA8dGg+YC4gVXNlIGBzY29wZWAgb24gYDx0aD5gCiAgICBiYWNrZ3JvdW5kOiBudWxsLAogICAgLy8gYDxib2R5PmAuIFVzZSBDU1MgYGJhY2tncm91bmQtaW1hZ2VgIGluc3RlYWQKICAgIGJnQ29sb3I6IG51bGwsCiAgICAvLyBgPGJvZHk+YCBhbmQgdGFibGUgZWxlbWVudHMuIFVzZSBDU1MgYGJhY2tncm91bmQtY29sb3JgIGluc3RlYWQKICAgIGJvcmRlcjogbnVtYmVyLAogICAgLy8gYDx0YWJsZT5gLiBVc2UgQ1NTIGBib3JkZXItd2lkdGhgIGluc3RlYWQsCiAgICBib3JkZXJDb2xvcjogbnVsbCwKICAgIC8vIGA8dGFibGU+YC4gVXNlIENTUyBgYm9yZGVyLWNvbG9yYCBpbnN0ZWFkLAogICAgYm90dG9tTWFyZ2luOiBudW1iZXIsCiAgICAvLyBgPGJvZHk+YAogICAgY2VsbFBhZGRpbmc6IG51bGwsCiAgICAvLyBgPHRhYmxlPmAKICAgIGNlbGxTcGFjaW5nOiBudWxsLAogICAgLy8gYDx0YWJsZT5gCiAgICBjaGFyOiBudWxsLAogICAgLy8gU2V2ZXJhbCB0YWJsZSBlbGVtZW50cy4gV2hlbiBgYWxpZ249Y2hhcmAsIHNldHMgdGhlIGNoYXJhY3RlciB0byBhbGlnbiBvbgogICAgY2hhck9mZjogbnVsbCwKICAgIC8vIFNldmVyYWwgdGFibGUgZWxlbWVudHMuIFdoZW4gYGNoYXJgLCBvZmZzZXRzIHRoZSBhbGlnbm1lbnQKICAgIGNsYXNzSWQ6IG51bGwsCiAgICAvLyBgPG9iamVjdD5gCiAgICBjbGVhcjogbnVsbCwKICAgIC8vIGA8YnI+YC4gVXNlIENTUyBgY2xlYXJgIGluc3RlYWQKICAgIGNvZGU6IG51bGwsCiAgICAvLyBgPG9iamVjdD5gCiAgICBjb2RlQmFzZTogbnVsbCwKICAgIC8vIGA8b2JqZWN0PmAKICAgIGNvZGVUeXBlOiBudWxsLAogICAgLy8gYDxvYmplY3Q+YAogICAgY29sb3I6IG51bGwsCiAgICAvLyBgPGZvbnQ+YCBhbmQgYDxocj5gLiBVc2UgQ1NTIGluc3RlYWQKICAgIGNvbXBhY3Q6IGJvb2xlYW4sCiAgICAvLyBMaXN0cy4gVXNlIENTUyB0byByZWR1Y2Ugc3BhY2UgYmV0d2VlbiBpdGVtcyBpbnN0ZWFkCiAgICBkZWNsYXJlOiBib29sZWFuLAogICAgLy8gYDxvYmplY3Q+YAogICAgZXZlbnQ6IG51bGwsCiAgICAvLyBgPHNjcmlwdD5gCiAgICBmYWNlOiBudWxsLAogICAgLy8gYDxmb250PmAuIFVzZSBDU1MgaW5zdGVhZAogICAgZnJhbWU6IG51bGwsCiAgICAvLyBgPHRhYmxlPmAKICAgIGZyYW1lQm9yZGVyOiBudWxsLAogICAgLy8gYDxpZnJhbWU+YC4gVXNlIENTUyBgYm9yZGVyYCBpbnN0ZWFkCiAgICBoU3BhY2U6IG51bWJlciwKICAgIC8vIGA8aW1nPmAgYW5kIGA8b2JqZWN0PmAKICAgIGxlZnRNYXJnaW46IG51bWJlciwKICAgIC8vIGA8Ym9keT5gCiAgICBsaW5rOiBudWxsLAogICAgLy8gYDxib2R5PmAuIFVzZSBDU1MgYGE6bGluayB7Y29sb3I6ICp9YCBpbnN0ZWFkCiAgICBsb25nRGVzYzogbnVsbCwKICAgIC8vIGA8ZnJhbWU+YCwgYDxpZnJhbWU+YCwgYW5kIGA8aW1nPmAuIFVzZSBhbiBgPGE+YAogICAgbG93U3JjOiBudWxsLAogICAgLy8gYDxpbWc+YC4gVXNlIGEgYDxwaWN0dXJlPmAKICAgIG1hcmdpbkhlaWdodDogbnVtYmVyLAogICAgLy8gYDxib2R5PmAKICAgIG1hcmdpbldpZHRoOiBudW1iZXIsCiAgICAvLyBgPGJvZHk+YAogICAgbm9SZXNpemU6IGJvb2xlYW4sCiAgICAvLyBgPGZyYW1lPmAKICAgIG5vSHJlZjogYm9vbGVhbiwKICAgIC8vIGA8YXJlYT5gLiBVc2Ugbm8gaHJlZiBpbnN0ZWFkIG9mIGFuIGV4cGxpY2l0IGBub2hyZWZgCiAgICBub1NoYWRlOiBib29sZWFuLAogICAgLy8gYDxocj5gLiBVc2UgYmFja2dyb3VuZC1jb2xvciBhbmQgaGVpZ2h0IGluc3RlYWQgb2YgYm9yZGVycwogICAgbm9XcmFwOiBib29sZWFuLAogICAgLy8gYDx0ZD5gIGFuZCBgPHRoPmAKICAgIG9iamVjdDogbnVsbCwKICAgIC8vIGA8YXBwbGV0PmAKICAgIHByb2ZpbGU6IG51bGwsCiAgICAvLyBgPGhlYWQ+YAogICAgcHJvbXB0OiBudWxsLAogICAgLy8gYDxpc2luZGV4PmAKICAgIHJldjogbnVsbCwKICAgIC8vIGA8bGluaz5gCiAgICByaWdodE1hcmdpbjogbnVtYmVyLAogICAgLy8gYDxib2R5PmAKICAgIHJ1bGVzOiBudWxsLAogICAgLy8gYDx0YWJsZT5gCiAgICBzY2hlbWU6IG51bGwsCiAgICAvLyBgPG1ldGE+YAogICAgc2Nyb2xsaW5nOiBib29sZWFuaXNoLAogICAgLy8gYDxmcmFtZT5gLiBVc2Ugb3ZlcmZsb3cgaW4gdGhlIGNoaWxkIGNvbnRleHQKICAgIHN0YW5kYnk6IG51bGwsCiAgICAvLyBgPG9iamVjdD5gCiAgICBzdW1tYXJ5OiBudWxsLAogICAgLy8gYDx0YWJsZT5gCiAgICB0ZXh0OiBudWxsLAogICAgLy8gYDxib2R5PmAuIFVzZSBDU1MgYGNvbG9yYCBpbnN0ZWFkCiAgICB0b3BNYXJnaW46IG51bWJlciwKICAgIC8vIGA8Ym9keT5gCiAgICB2YWx1ZVR5cGU6IG51bGwsCiAgICAvLyBgPHBhcmFtPmAKICAgIHZlcnNpb246IG51bGwsCiAgICAvLyBgPGh0bWw+YC4gVXNlIGEgZG9jdHlwZS4KICAgIHZBbGlnbjogbnVsbCwKICAgIC8vIFNldmVyYWwuIFVzZSBDU1MgYHZlcnRpY2FsLWFsaWduYCBpbnN0ZWFkCiAgICB2TGluazogbnVsbCwKICAgIC8vIGA8Ym9keT5gLiBVc2UgQ1NTIGBhOnZpc2l0ZWQge2NvbG9yfWAgaW5zdGVhZAogICAgdlNwYWNlOiBudW1iZXIsCiAgICAvLyBgPGltZz5gIGFuZCBgPG9iamVjdD5gCiAgICAvLyBOb24tc3RhbmRhcmQgUHJvcGVydGllcy4KICAgIGFsbG93VHJhbnNwYXJlbmN5OiBudWxsLAogICAgYXV0b0NvcnJlY3Q6IG51bGwsCiAgICBhdXRvU2F2ZTogbnVsbCwKICAgIGRpc2FibGVQaWN0dXJlSW5QaWN0dXJlOiBib29sZWFuLAogICAgZGlzYWJsZVJlbW90ZVBsYXliYWNrOiBib29sZWFuLAogICAgcHJlZml4OiBudWxsLAogICAgcHJvcGVydHk6IG51bGwsCiAgICByZXN1bHRzOiBudW1iZXIsCiAgICBzZWN1cml0eTogbnVsbCwKICAgIHVuc2VsZWN0YWJsZTogbnVsbAogIH0sCiAgc3BhY2U6ICJodG1sIiwKICB0cmFuc2Zvcm06IGNhc2VJbnNlbnNpdGl2ZVRyYW5zZm9ybQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL3N2Zy5qcwp2YXIgc3ZnID0gY3JlYXRlNih7CiAgYXR0cmlidXRlczogewogICAgYWNjZW50SGVpZ2h0OiAiYWNjZW50LWhlaWdodCIsCiAgICBhbGlnbm1lbnRCYXNlbGluZTogImFsaWdubWVudC1iYXNlbGluZSIsCiAgICBhcmFiaWNGb3JtOiAiYXJhYmljLWZvcm0iLAogICAgYmFzZWxpbmVTaGlmdDogImJhc2VsaW5lLXNoaWZ0IiwKICAgIGNhcEhlaWdodDogImNhcC1oZWlnaHQiLAogICAgY2xhc3NOYW1lOiAiY2xhc3MiLAogICAgY2xpcFBhdGg6ICJjbGlwLXBhdGgiLAogICAgY2xpcFJ1bGU6ICJjbGlwLXJ1bGUiLAogICAgY29sb3JJbnRlcnBvbGF0aW9uOiAiY29sb3ItaW50ZXJwb2xhdGlvbiIsCiAgICBjb2xvckludGVycG9sYXRpb25GaWx0ZXJzOiAiY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzIiwKICAgIGNvbG9yUHJvZmlsZTogImNvbG9yLXByb2ZpbGUiLAogICAgY29sb3JSZW5kZXJpbmc6ICJjb2xvci1yZW5kZXJpbmciLAogICAgY3Jvc3NPcmlnaW46ICJjcm9zc29yaWdpbiIsCiAgICBkYXRhVHlwZTogImRhdGF0eXBlIiwKICAgIGRvbWluYW50QmFzZWxpbmU6ICJkb21pbmFudC1iYXNlbGluZSIsCiAgICBlbmFibGVCYWNrZ3JvdW5kOiAiZW5hYmxlLWJhY2tncm91bmQiLAogICAgZmlsbE9wYWNpdHk6ICJmaWxsLW9wYWNpdHkiLAogICAgZmlsbFJ1bGU6ICJmaWxsLXJ1bGUiLAogICAgZmxvb2RDb2xvcjogImZsb29kLWNvbG9yIiwKICAgIGZsb29kT3BhY2l0eTogImZsb29kLW9wYWNpdHkiLAogICAgZm9udEZhbWlseTogImZvbnQtZmFtaWx5IiwKICAgIGZvbnRTaXplOiAiZm9udC1zaXplIiwKICAgIGZvbnRTaXplQWRqdXN0OiAiZm9udC1zaXplLWFkanVzdCIsCiAgICBmb250U3RyZXRjaDogImZvbnQtc3RyZXRjaCIsCiAgICBmb250U3R5bGU6ICJmb250LXN0eWxlIiwKICAgIGZvbnRWYXJpYW50OiAiZm9udC12YXJpYW50IiwKICAgIGZvbnRXZWlnaHQ6ICJmb250LXdlaWdodCIsCiAgICBnbHlwaE5hbWU6ICJnbHlwaC1uYW1lIiwKICAgIGdseXBoT3JpZW50YXRpb25Ib3Jpem9udGFsOiAiZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbCIsCiAgICBnbHlwaE9yaWVudGF0aW9uVmVydGljYWw6ICJnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbCIsCiAgICBocmVmTGFuZzogImhyZWZsYW5nIiwKICAgIGhvcml6QWR2WDogImhvcml6LWFkdi14IiwKICAgIGhvcml6T3JpZ2luWDogImhvcml6LW9yaWdpbi14IiwKICAgIGhvcml6T3JpZ2luWTogImhvcml6LW9yaWdpbi15IiwKICAgIGltYWdlUmVuZGVyaW5nOiAiaW1hZ2UtcmVuZGVyaW5nIiwKICAgIGxldHRlclNwYWNpbmc6ICJsZXR0ZXItc3BhY2luZyIsCiAgICBsaWdodGluZ0NvbG9yOiAibGlnaHRpbmctY29sb3IiLAogICAgbWFya2VyRW5kOiAibWFya2VyLWVuZCIsCiAgICBtYXJrZXJNaWQ6ICJtYXJrZXItbWlkIiwKICAgIG1hcmtlclN0YXJ0OiAibWFya2VyLXN0YXJ0IiwKICAgIG5hdkRvd246ICJuYXYtZG93biIsCiAgICBuYXZEb3duTGVmdDogIm5hdi1kb3duLWxlZnQiLAogICAgbmF2RG93blJpZ2h0OiAibmF2LWRvd24tcmlnaHQiLAogICAgbmF2TGVmdDogIm5hdi1sZWZ0IiwKICAgIG5hdk5leHQ6ICJuYXYtbmV4dCIsCiAgICBuYXZQcmV2OiAibmF2LXByZXYiLAogICAgbmF2UmlnaHQ6ICJuYXYtcmlnaHQiLAogICAgbmF2VXA6ICJuYXYtdXAiLAogICAgbmF2VXBMZWZ0OiAibmF2LXVwLWxlZnQiLAogICAgbmF2VXBSaWdodDogIm5hdi11cC1yaWdodCIsCiAgICBvbkFib3J0OiAib25hYm9ydCIsCiAgICBvbkFjdGl2YXRlOiAib25hY3RpdmF0ZSIsCiAgICBvbkFmdGVyUHJpbnQ6ICJvbmFmdGVycHJpbnQiLAogICAgb25CZWZvcmVQcmludDogIm9uYmVmb3JlcHJpbnQiLAogICAgb25CZWdpbjogIm9uYmVnaW4iLAogICAgb25DYW5jZWw6ICJvbmNhbmNlbCIsCiAgICBvbkNhblBsYXk6ICJvbmNhbnBsYXkiLAogICAgb25DYW5QbGF5VGhyb3VnaDogIm9uY2FucGxheXRocm91Z2giLAogICAgb25DaGFuZ2U6ICJvbmNoYW5nZSIsCiAgICBvbkNsaWNrOiAib25jbGljayIsCiAgICBvbkNsb3NlOiAib25jbG9zZSIsCiAgICBvbkNvcHk6ICJvbmNvcHkiLAogICAgb25DdWVDaGFuZ2U6ICJvbmN1ZWNoYW5nZSIsCiAgICBvbkN1dDogIm9uY3V0IiwKICAgIG9uRGJsQ2xpY2s6ICJvbmRibGNsaWNrIiwKICAgIG9uRHJhZzogIm9uZHJhZyIsCiAgICBvbkRyYWdFbmQ6ICJvbmRyYWdlbmQiLAogICAgb25EcmFnRW50ZXI6ICJvbmRyYWdlbnRlciIsCiAgICBvbkRyYWdFeGl0OiAib25kcmFnZXhpdCIsCiAgICBvbkRyYWdMZWF2ZTogIm9uZHJhZ2xlYXZlIiwKICAgIG9uRHJhZ092ZXI6ICJvbmRyYWdvdmVyIiwKICAgIG9uRHJhZ1N0YXJ0OiAib25kcmFnc3RhcnQiLAogICAgb25Ecm9wOiAib25kcm9wIiwKICAgIG9uRHVyYXRpb25DaGFuZ2U6ICJvbmR1cmF0aW9uY2hhbmdlIiwKICAgIG9uRW1wdGllZDogIm9uZW1wdGllZCIsCiAgICBvbkVuZDogIm9uZW5kIiwKICAgIG9uRW5kZWQ6ICJvbmVuZGVkIiwKICAgIG9uRXJyb3I6ICJvbmVycm9yIiwKICAgIG9uRm9jdXM6ICJvbmZvY3VzIiwKICAgIG9uRm9jdXNJbjogIm9uZm9jdXNpbiIsCiAgICBvbkZvY3VzT3V0OiAib25mb2N1c291dCIsCiAgICBvbkhhc2hDaGFuZ2U6ICJvbmhhc2hjaGFuZ2UiLAogICAgb25JbnB1dDogIm9uaW5wdXQiLAogICAgb25JbnZhbGlkOiAib25pbnZhbGlkIiwKICAgIG9uS2V5RG93bjogIm9ua2V5ZG93biIsCiAgICBvbktleVByZXNzOiAib25rZXlwcmVzcyIsCiAgICBvbktleVVwOiAib25rZXl1cCIsCiAgICBvbkxvYWQ6ICJvbmxvYWQiLAogICAgb25Mb2FkZWREYXRhOiAib25sb2FkZWRkYXRhIiwKICAgIG9uTG9hZGVkTWV0YWRhdGE6ICJvbmxvYWRlZG1ldGFkYXRhIiwKICAgIG9uTG9hZFN0YXJ0OiAib25sb2Fkc3RhcnQiLAogICAgb25NZXNzYWdlOiAib25tZXNzYWdlIiwKICAgIG9uTW91c2VEb3duOiAib25tb3VzZWRvd24iLAogICAgb25Nb3VzZUVudGVyOiAib25tb3VzZWVudGVyIiwKICAgIG9uTW91c2VMZWF2ZTogIm9ubW91c2VsZWF2ZSIsCiAgICBvbk1vdXNlTW92ZTogIm9ubW91c2Vtb3ZlIiwKICAgIG9uTW91c2VPdXQ6ICJvbm1vdXNlb3V0IiwKICAgIG9uTW91c2VPdmVyOiAib25tb3VzZW92ZXIiLAogICAgb25Nb3VzZVVwOiAib25tb3VzZXVwIiwKICAgIG9uTW91c2VXaGVlbDogIm9ubW91c2V3aGVlbCIsCiAgICBvbk9mZmxpbmU6ICJvbm9mZmxpbmUiLAogICAgb25PbmxpbmU6ICJvbm9ubGluZSIsCiAgICBvblBhZ2VIaWRlOiAib25wYWdlaGlkZSIsCiAgICBvblBhZ2VTaG93OiAib25wYWdlc2hvdyIsCiAgICBvblBhc3RlOiAib25wYXN0ZSIsCiAgICBvblBhdXNlOiAib25wYXVzZSIsCiAgICBvblBsYXk6ICJvbnBsYXkiLAogICAgb25QbGF5aW5nOiAib25wbGF5aW5nIiwKICAgIG9uUG9wU3RhdGU6ICJvbnBvcHN0YXRlIiwKICAgIG9uUHJvZ3Jlc3M6ICJvbnByb2dyZXNzIiwKICAgIG9uUmF0ZUNoYW5nZTogIm9ucmF0ZWNoYW5nZSIsCiAgICBvblJlcGVhdDogIm9ucmVwZWF0IiwKICAgIG9uUmVzZXQ6ICJvbnJlc2V0IiwKICAgIG9uUmVzaXplOiAib25yZXNpemUiLAogICAgb25TY3JvbGw6ICJvbnNjcm9sbCIsCiAgICBvblNlZWtlZDogIm9uc2Vla2VkIiwKICAgIG9uU2Vla2luZzogIm9uc2Vla2luZyIsCiAgICBvblNlbGVjdDogIm9uc2VsZWN0IiwKICAgIG9uU2hvdzogIm9uc2hvdyIsCiAgICBvblN0YWxsZWQ6ICJvbnN0YWxsZWQiLAogICAgb25TdG9yYWdlOiAib25zdG9yYWdlIiwKICAgIG9uU3VibWl0OiAib25zdWJtaXQiLAogICAgb25TdXNwZW5kOiAib25zdXNwZW5kIiwKICAgIG9uVGltZVVwZGF0ZTogIm9udGltZXVwZGF0ZSIsCiAgICBvblRvZ2dsZTogIm9udG9nZ2xlIiwKICAgIG9uVW5sb2FkOiAib251bmxvYWQiLAogICAgb25Wb2x1bWVDaGFuZ2U6ICJvbnZvbHVtZWNoYW5nZSIsCiAgICBvbldhaXRpbmc6ICJvbndhaXRpbmciLAogICAgb25ab29tOiAib256b29tIiwKICAgIG92ZXJsaW5lUG9zaXRpb246ICJvdmVybGluZS1wb3NpdGlvbiIsCiAgICBvdmVybGluZVRoaWNrbmVzczogIm92ZXJsaW5lLXRoaWNrbmVzcyIsCiAgICBwYWludE9yZGVyOiAicGFpbnQtb3JkZXIiLAogICAgcGFub3NlMTogInBhbm9zZS0xIiwKICAgIHBvaW50ZXJFdmVudHM6ICJwb2ludGVyLWV2ZW50cyIsCiAgICByZWZlcnJlclBvbGljeTogInJlZmVycmVycG9saWN5IiwKICAgIHJlbmRlcmluZ0ludGVudDogInJlbmRlcmluZy1pbnRlbnQiLAogICAgc2hhcGVSZW5kZXJpbmc6ICJzaGFwZS1yZW5kZXJpbmciLAogICAgc3RvcENvbG9yOiAic3RvcC1jb2xvciIsCiAgICBzdG9wT3BhY2l0eTogInN0b3Atb3BhY2l0eSIsCiAgICBzdHJpa2V0aHJvdWdoUG9zaXRpb246ICJzdHJpa2V0aHJvdWdoLXBvc2l0aW9uIiwKICAgIHN0cmlrZXRocm91Z2hUaGlja25lc3M6ICJzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcyIsCiAgICBzdHJva2VEYXNoQXJyYXk6ICJzdHJva2UtZGFzaGFycmF5IiwKICAgIHN0cm9rZURhc2hPZmZzZXQ6ICJzdHJva2UtZGFzaG9mZnNldCIsCiAgICBzdHJva2VMaW5lQ2FwOiAic3Ryb2tlLWxpbmVjYXAiLAogICAgc3Ryb2tlTGluZUpvaW46ICJzdHJva2UtbGluZWpvaW4iLAogICAgc3Ryb2tlTWl0ZXJMaW1pdDogInN0cm9rZS1taXRlcmxpbWl0IiwKICAgIHN0cm9rZU9wYWNpdHk6ICJzdHJva2Utb3BhY2l0eSIsCiAgICBzdHJva2VXaWR0aDogInN0cm9rZS13aWR0aCIsCiAgICB0YWJJbmRleDogInRhYmluZGV4IiwKICAgIHRleHRBbmNob3I6ICJ0ZXh0LWFuY2hvciIsCiAgICB0ZXh0RGVjb3JhdGlvbjogInRleHQtZGVjb3JhdGlvbiIsCiAgICB0ZXh0UmVuZGVyaW5nOiAidGV4dC1yZW5kZXJpbmciLAogICAgdHJhbnNmb3JtT3JpZ2luOiAidHJhbnNmb3JtLW9yaWdpbiIsCiAgICB0eXBlT2Y6ICJ0eXBlb2YiLAogICAgdW5kZXJsaW5lUG9zaXRpb246ICJ1bmRlcmxpbmUtcG9zaXRpb24iLAogICAgdW5kZXJsaW5lVGhpY2tuZXNzOiAidW5kZXJsaW5lLXRoaWNrbmVzcyIsCiAgICB1bmljb2RlQmlkaTogInVuaWNvZGUtYmlkaSIsCiAgICB1bmljb2RlUmFuZ2U6ICJ1bmljb2RlLXJhbmdlIiwKICAgIHVuaXRzUGVyRW06ICJ1bml0cy1wZXItZW0iLAogICAgdkFscGhhYmV0aWM6ICJ2LWFscGhhYmV0aWMiLAogICAgdkhhbmdpbmc6ICJ2LWhhbmdpbmciLAogICAgdklkZW9ncmFwaGljOiAidi1pZGVvZ3JhcGhpYyIsCiAgICB2TWF0aGVtYXRpY2FsOiAidi1tYXRoZW1hdGljYWwiLAogICAgdmVjdG9yRWZmZWN0OiAidmVjdG9yLWVmZmVjdCIsCiAgICB2ZXJ0QWR2WTogInZlcnQtYWR2LXkiLAogICAgdmVydE9yaWdpblg6ICJ2ZXJ0LW9yaWdpbi14IiwKICAgIHZlcnRPcmlnaW5ZOiAidmVydC1vcmlnaW4teSIsCiAgICB3b3JkU3BhY2luZzogIndvcmQtc3BhY2luZyIsCiAgICB3cml0aW5nTW9kZTogIndyaXRpbmctbW9kZSIsCiAgICB4SGVpZ2h0OiAieC1oZWlnaHQiLAogICAgLy8gVGhlc2Ugd2VyZSBjYW1lbGNhc2VkIGluIFRpbnkuIE5vdyBsb3dlcmNhc2VkIGluIFNWRyAyCiAgICBwbGF5YmFja09yZGVyOiAicGxheWJhY2tvcmRlciIsCiAgICB0aW1lbGluZUJlZ2luOiAidGltZWxpbmViZWdpbiIKICB9LAogIHByb3BlcnRpZXM6IHsKICAgIGFib3V0OiBjb21tYU9yU3BhY2VTZXBhcmF0ZWQsCiAgICBhY2NlbnRIZWlnaHQ6IG51bWJlciwKICAgIGFjY3VtdWxhdGU6IG51bGwsCiAgICBhZGRpdGl2ZTogbnVsbCwKICAgIGFsaWdubWVudEJhc2VsaW5lOiBudWxsLAogICAgYWxwaGFiZXRpYzogbnVtYmVyLAogICAgYW1wbGl0dWRlOiBudW1iZXIsCiAgICBhcmFiaWNGb3JtOiBudWxsLAogICAgYXNjZW50OiBudW1iZXIsCiAgICBhdHRyaWJ1dGVOYW1lOiBudWxsLAogICAgYXR0cmlidXRlVHlwZTogbnVsbCwKICAgIGF6aW11dGg6IG51bWJlciwKICAgIGJhbmR3aWR0aDogbnVsbCwKICAgIGJhc2VsaW5lU2hpZnQ6IG51bGwsCiAgICBiYXNlRnJlcXVlbmN5OiBudWxsLAogICAgYmFzZVByb2ZpbGU6IG51bGwsCiAgICBiYm94OiBudWxsLAogICAgYmVnaW46IG51bGwsCiAgICBiaWFzOiBudW1iZXIsCiAgICBieTogbnVsbCwKICAgIGNhbGNNb2RlOiBudWxsLAogICAgY2FwSGVpZ2h0OiBudW1iZXIsCiAgICBjbGFzc05hbWU6IHNwYWNlU2VwYXJhdGVkLAogICAgY2xpcDogbnVsbCwKICAgIGNsaXBQYXRoOiBudWxsLAogICAgY2xpcFBhdGhVbml0czogbnVsbCwKICAgIGNsaXBSdWxlOiBudWxsLAogICAgY29sb3I6IG51bGwsCiAgICBjb2xvckludGVycG9sYXRpb246IG51bGwsCiAgICBjb2xvckludGVycG9sYXRpb25GaWx0ZXJzOiBudWxsLAogICAgY29sb3JQcm9maWxlOiBudWxsLAogICAgY29sb3JSZW5kZXJpbmc6IG51bGwsCiAgICBjb250ZW50OiBudWxsLAogICAgY29udGVudFNjcmlwdFR5cGU6IG51bGwsCiAgICBjb250ZW50U3R5bGVUeXBlOiBudWxsLAogICAgY3Jvc3NPcmlnaW46IG51bGwsCiAgICBjdXJzb3I6IG51bGwsCiAgICBjeDogbnVsbCwKICAgIGN5OiBudWxsLAogICAgZDogbnVsbCwKICAgIGRhdGFUeXBlOiBudWxsLAogICAgZGVmYXVsdEFjdGlvbjogbnVsbCwKICAgIGRlc2NlbnQ6IG51bWJlciwKICAgIGRpZmZ1c2VDb25zdGFudDogbnVtYmVyLAogICAgZGlyZWN0aW9uOiBudWxsLAogICAgZGlzcGxheTogbnVsbCwKICAgIGR1cjogbnVsbCwKICAgIGRpdmlzb3I6IG51bWJlciwKICAgIGRvbWluYW50QmFzZWxpbmU6IG51bGwsCiAgICBkb3dubG9hZDogYm9vbGVhbiwKICAgIGR4OiBudWxsLAogICAgZHk6IG51bGwsCiAgICBlZGdlTW9kZTogbnVsbCwKICAgIGVkaXRhYmxlOiBudWxsLAogICAgZWxldmF0aW9uOiBudW1iZXIsCiAgICBlbmFibGVCYWNrZ3JvdW5kOiBudWxsLAogICAgZW5kOiBudWxsLAogICAgZXZlbnQ6IG51bGwsCiAgICBleHBvbmVudDogbnVtYmVyLAogICAgZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZDogbnVsbCwKICAgIGZpbGw6IG51bGwsCiAgICBmaWxsT3BhY2l0eTogbnVtYmVyLAogICAgZmlsbFJ1bGU6IG51bGwsCiAgICBmaWx0ZXI6IG51bGwsCiAgICBmaWx0ZXJSZXM6IG51bGwsCiAgICBmaWx0ZXJVbml0czogbnVsbCwKICAgIGZsb29kQ29sb3I6IG51bGwsCiAgICBmbG9vZE9wYWNpdHk6IG51bGwsCiAgICBmb2N1c2FibGU6IG51bGwsCiAgICBmb2N1c0hpZ2hsaWdodDogbnVsbCwKICAgIGZvbnRGYW1pbHk6IG51bGwsCiAgICBmb250U2l6ZTogbnVsbCwKICAgIGZvbnRTaXplQWRqdXN0OiBudWxsLAogICAgZm9udFN0cmV0Y2g6IG51bGwsCiAgICBmb250U3R5bGU6IG51bGwsCiAgICBmb250VmFyaWFudDogbnVsbCwKICAgIGZvbnRXZWlnaHQ6IG51bGwsCiAgICBmb3JtYXQ6IG51bGwsCiAgICBmcjogbnVsbCwKICAgIGZyb206IG51bGwsCiAgICBmeDogbnVsbCwKICAgIGZ5OiBudWxsLAogICAgZzE6IGNvbW1hU2VwYXJhdGVkLAogICAgZzI6IGNvbW1hU2VwYXJhdGVkLAogICAgZ2x5cGhOYW1lOiBjb21tYVNlcGFyYXRlZCwKICAgIGdseXBoT3JpZW50YXRpb25Ib3Jpem9udGFsOiBudWxsLAogICAgZ2x5cGhPcmllbnRhdGlvblZlcnRpY2FsOiBudWxsLAogICAgZ2x5cGhSZWY6IG51bGwsCiAgICBncmFkaWVudFRyYW5zZm9ybTogbnVsbCwKICAgIGdyYWRpZW50VW5pdHM6IG51bGwsCiAgICBoYW5kbGVyOiBudWxsLAogICAgaGFuZ2luZzogbnVtYmVyLAogICAgaGF0Y2hDb250ZW50VW5pdHM6IG51bGwsCiAgICBoYXRjaFVuaXRzOiBudWxsLAogICAgaGVpZ2h0OiBudWxsLAogICAgaHJlZjogbnVsbCwKICAgIGhyZWZMYW5nOiBudWxsLAogICAgaG9yaXpBZHZYOiBudW1iZXIsCiAgICBob3Jpek9yaWdpblg6IG51bWJlciwKICAgIGhvcml6T3JpZ2luWTogbnVtYmVyLAogICAgaWQ6IG51bGwsCiAgICBpZGVvZ3JhcGhpYzogbnVtYmVyLAogICAgaW1hZ2VSZW5kZXJpbmc6IG51bGwsCiAgICBpbml0aWFsVmlzaWJpbGl0eTogbnVsbCwKICAgIGluOiBudWxsLAogICAgaW4yOiBudWxsLAogICAgaW50ZXJjZXB0OiBudW1iZXIsCiAgICBrOiBudW1iZXIsCiAgICBrMTogbnVtYmVyLAogICAgazI6IG51bWJlciwKICAgIGszOiBudW1iZXIsCiAgICBrNDogbnVtYmVyLAogICAga2VybmVsTWF0cml4OiBjb21tYU9yU3BhY2VTZXBhcmF0ZWQsCiAgICBrZXJuZWxVbml0TGVuZ3RoOiBudWxsLAogICAga2V5UG9pbnRzOiBudWxsLAogICAgLy8gU0VNSV9DT0xPTl9TRVBBUkFURUQKICAgIGtleVNwbGluZXM6IG51bGwsCiAgICAvLyBTRU1JX0NPTE9OX1NFUEFSQVRFRAogICAga2V5VGltZXM6IG51bGwsCiAgICAvLyBTRU1JX0NPTE9OX1NFUEFSQVRFRAogICAga2VybmluZzogbnVsbCwKICAgIGxhbmc6IG51bGwsCiAgICBsZW5ndGhBZGp1c3Q6IG51bGwsCiAgICBsZXR0ZXJTcGFjaW5nOiBudWxsLAogICAgbGlnaHRpbmdDb2xvcjogbnVsbCwKICAgIGxpbWl0aW5nQ29uZUFuZ2xlOiBudW1iZXIsCiAgICBsb2NhbDogbnVsbCwKICAgIG1hcmtlckVuZDogbnVsbCwKICAgIG1hcmtlck1pZDogbnVsbCwKICAgIG1hcmtlclN0YXJ0OiBudWxsLAogICAgbWFya2VySGVpZ2h0OiBudWxsLAogICAgbWFya2VyVW5pdHM6IG51bGwsCiAgICBtYXJrZXJXaWR0aDogbnVsbCwKICAgIG1hc2s6IG51bGwsCiAgICBtYXNrQ29udGVudFVuaXRzOiBudWxsLAogICAgbWFza1VuaXRzOiBudWxsLAogICAgbWF0aGVtYXRpY2FsOiBudWxsLAogICAgbWF4OiBudWxsLAogICAgbWVkaWE6IG51bGwsCiAgICBtZWRpYUNoYXJhY3RlckVuY29kaW5nOiBudWxsLAogICAgbWVkaWFDb250ZW50RW5jb2RpbmdzOiBudWxsLAogICAgbWVkaWFTaXplOiBudW1iZXIsCiAgICBtZWRpYVRpbWU6IG51bGwsCiAgICBtZXRob2Q6IG51bGwsCiAgICBtaW46IG51bGwsCiAgICBtb2RlOiBudWxsLAogICAgbmFtZTogbnVsbCwKICAgIG5hdkRvd246IG51bGwsCiAgICBuYXZEb3duTGVmdDogbnVsbCwKICAgIG5hdkRvd25SaWdodDogbnVsbCwKICAgIG5hdkxlZnQ6IG51bGwsCiAgICBuYXZOZXh0OiBudWxsLAogICAgbmF2UHJldjogbnVsbCwKICAgIG5hdlJpZ2h0OiBudWxsLAogICAgbmF2VXA6IG51bGwsCiAgICBuYXZVcExlZnQ6IG51bGwsCiAgICBuYXZVcFJpZ2h0OiBudWxsLAogICAgbnVtT2N0YXZlczogbnVsbCwKICAgIG9ic2VydmVyOiBudWxsLAogICAgb2Zmc2V0OiBudWxsLAogICAgb25BYm9ydDogbnVsbCwKICAgIG9uQWN0aXZhdGU6IG51bGwsCiAgICBvbkFmdGVyUHJpbnQ6IG51bGwsCiAgICBvbkJlZm9yZVByaW50OiBudWxsLAogICAgb25CZWdpbjogbnVsbCwKICAgIG9uQ2FuY2VsOiBudWxsLAogICAgb25DYW5QbGF5OiBudWxsLAogICAgb25DYW5QbGF5VGhyb3VnaDogbnVsbCwKICAgIG9uQ2hhbmdlOiBudWxsLAogICAgb25DbGljazogbnVsbCwKICAgIG9uQ2xvc2U6IG51bGwsCiAgICBvbkNvcHk6IG51bGwsCiAgICBvbkN1ZUNoYW5nZTogbnVsbCwKICAgIG9uQ3V0OiBudWxsLAogICAgb25EYmxDbGljazogbnVsbCwKICAgIG9uRHJhZzogbnVsbCwKICAgIG9uRHJhZ0VuZDogbnVsbCwKICAgIG9uRHJhZ0VudGVyOiBudWxsLAogICAgb25EcmFnRXhpdDogbnVsbCwKICAgIG9uRHJhZ0xlYXZlOiBudWxsLAogICAgb25EcmFnT3ZlcjogbnVsbCwKICAgIG9uRHJhZ1N0YXJ0OiBudWxsLAogICAgb25Ecm9wOiBudWxsLAogICAgb25EdXJhdGlvbkNoYW5nZTogbnVsbCwKICAgIG9uRW1wdGllZDogbnVsbCwKICAgIG9uRW5kOiBudWxsLAogICAgb25FbmRlZDogbnVsbCwKICAgIG9uRXJyb3I6IG51bGwsCiAgICBvbkZvY3VzOiBudWxsLAogICAgb25Gb2N1c0luOiBudWxsLAogICAgb25Gb2N1c091dDogbnVsbCwKICAgIG9uSGFzaENoYW5nZTogbnVsbCwKICAgIG9uSW5wdXQ6IG51bGwsCiAgICBvbkludmFsaWQ6IG51bGwsCiAgICBvbktleURvd246IG51bGwsCiAgICBvbktleVByZXNzOiBudWxsLAogICAgb25LZXlVcDogbnVsbCwKICAgIG9uTG9hZDogbnVsbCwKICAgIG9uTG9hZGVkRGF0YTogbnVsbCwKICAgIG9uTG9hZGVkTWV0YWRhdGE6IG51bGwsCiAgICBvbkxvYWRTdGFydDogbnVsbCwKICAgIG9uTWVzc2FnZTogbnVsbCwKICAgIG9uTW91c2VEb3duOiBudWxsLAogICAgb25Nb3VzZUVudGVyOiBudWxsLAogICAgb25Nb3VzZUxlYXZlOiBudWxsLAogICAgb25Nb3VzZU1vdmU6IG51bGwsCiAgICBvbk1vdXNlT3V0OiBudWxsLAogICAgb25Nb3VzZU92ZXI6IG51bGwsCiAgICBvbk1vdXNlVXA6IG51bGwsCiAgICBvbk1vdXNlV2hlZWw6IG51bGwsCiAgICBvbk9mZmxpbmU6IG51bGwsCiAgICBvbk9ubGluZTogbnVsbCwKICAgIG9uUGFnZUhpZGU6IG51bGwsCiAgICBvblBhZ2VTaG93OiBudWxsLAogICAgb25QYXN0ZTogbnVsbCwKICAgIG9uUGF1c2U6IG51bGwsCiAgICBvblBsYXk6IG51bGwsCiAgICBvblBsYXlpbmc6IG51bGwsCiAgICBvblBvcFN0YXRlOiBudWxsLAogICAgb25Qcm9ncmVzczogbnVsbCwKICAgIG9uUmF0ZUNoYW5nZTogbnVsbCwKICAgIG9uUmVwZWF0OiBudWxsLAogICAgb25SZXNldDogbnVsbCwKICAgIG9uUmVzaXplOiBudWxsLAogICAgb25TY3JvbGw6IG51bGwsCiAgICBvblNlZWtlZDogbnVsbCwKICAgIG9uU2Vla2luZzogbnVsbCwKICAgIG9uU2VsZWN0OiBudWxsLAogICAgb25TaG93OiBudWxsLAogICAgb25TdGFsbGVkOiBudWxsLAogICAgb25TdG9yYWdlOiBudWxsLAogICAgb25TdWJtaXQ6IG51bGwsCiAgICBvblN1c3BlbmQ6IG51bGwsCiAgICBvblRpbWVVcGRhdGU6IG51bGwsCiAgICBvblRvZ2dsZTogbnVsbCwKICAgIG9uVW5sb2FkOiBudWxsLAogICAgb25Wb2x1bWVDaGFuZ2U6IG51bGwsCiAgICBvbldhaXRpbmc6IG51bGwsCiAgICBvblpvb206IG51bGwsCiAgICBvcGFjaXR5OiBudWxsLAogICAgb3BlcmF0b3I6IG51bGwsCiAgICBvcmRlcjogbnVsbCwKICAgIG9yaWVudDogbnVsbCwKICAgIG9yaWVudGF0aW9uOiBudWxsLAogICAgb3JpZ2luOiBudWxsLAogICAgb3ZlcmZsb3c6IG51bGwsCiAgICBvdmVybGF5OiBudWxsLAogICAgb3ZlcmxpbmVQb3NpdGlvbjogbnVtYmVyLAogICAgb3ZlcmxpbmVUaGlja25lc3M6IG51bWJlciwKICAgIHBhaW50T3JkZXI6IG51bGwsCiAgICBwYW5vc2UxOiBudWxsLAogICAgcGF0aDogbnVsbCwKICAgIHBhdGhMZW5ndGg6IG51bWJlciwKICAgIHBhdHRlcm5Db250ZW50VW5pdHM6IG51bGwsCiAgICBwYXR0ZXJuVHJhbnNmb3JtOiBudWxsLAogICAgcGF0dGVyblVuaXRzOiBudWxsLAogICAgcGhhc2U6IG51bGwsCiAgICBwaW5nOiBzcGFjZVNlcGFyYXRlZCwKICAgIHBpdGNoOiBudWxsLAogICAgcGxheWJhY2tPcmRlcjogbnVsbCwKICAgIHBvaW50ZXJFdmVudHM6IG51bGwsCiAgICBwb2ludHM6IG51bGwsCiAgICBwb2ludHNBdFg6IG51bWJlciwKICAgIHBvaW50c0F0WTogbnVtYmVyLAogICAgcG9pbnRzQXRaOiBudW1iZXIsCiAgICBwcmVzZXJ2ZUFscGhhOiBudWxsLAogICAgcHJlc2VydmVBc3BlY3RSYXRpbzogbnVsbCwKICAgIHByaW1pdGl2ZVVuaXRzOiBudWxsLAogICAgcHJvcGFnYXRlOiBudWxsLAogICAgcHJvcGVydHk6IGNvbW1hT3JTcGFjZVNlcGFyYXRlZCwKICAgIHI6IG51bGwsCiAgICByYWRpdXM6IG51bGwsCiAgICByZWZlcnJlclBvbGljeTogbnVsbCwKICAgIHJlZlg6IG51bGwsCiAgICByZWZZOiBudWxsLAogICAgcmVsOiBjb21tYU9yU3BhY2VTZXBhcmF0ZWQsCiAgICByZXY6IGNvbW1hT3JTcGFjZVNlcGFyYXRlZCwKICAgIHJlbmRlcmluZ0ludGVudDogbnVsbCwKICAgIHJlcGVhdENvdW50OiBudWxsLAogICAgcmVwZWF0RHVyOiBudWxsLAogICAgcmVxdWlyZWRFeHRlbnNpb25zOiBjb21tYU9yU3BhY2VTZXBhcmF0ZWQsCiAgICByZXF1aXJlZEZlYXR1cmVzOiBjb21tYU9yU3BhY2VTZXBhcmF0ZWQsCiAgICByZXF1aXJlZEZvbnRzOiBjb21tYU9yU3BhY2VTZXBhcmF0ZWQsCiAgICByZXF1aXJlZEZvcm1hdHM6IGNvbW1hT3JTcGFjZVNlcGFyYXRlZCwKICAgIHJlc291cmNlOiBudWxsLAogICAgcmVzdGFydDogbnVsbCwKICAgIHJlc3VsdDogbnVsbCwKICAgIHJvdGF0ZTogbnVsbCwKICAgIHJ4OiBudWxsLAogICAgcnk6IG51bGwsCiAgICBzY2FsZTogbnVsbCwKICAgIHNlZWQ6IG51bGwsCiAgICBzaGFwZVJlbmRlcmluZzogbnVsbCwKICAgIHNpZGU6IG51bGwsCiAgICBzbG9wZTogbnVsbCwKICAgIHNuYXBzaG90VGltZTogbnVsbCwKICAgIHNwZWN1bGFyQ29uc3RhbnQ6IG51bWJlciwKICAgIHNwZWN1bGFyRXhwb25lbnQ6IG51bWJlciwKICAgIHNwcmVhZE1ldGhvZDogbnVsbCwKICAgIHNwYWNpbmc6IG51bGwsCiAgICBzdGFydE9mZnNldDogbnVsbCwKICAgIHN0ZERldmlhdGlvbjogbnVsbCwKICAgIHN0ZW1oOiBudWxsLAogICAgc3RlbXY6IG51bGwsCiAgICBzdGl0Y2hUaWxlczogbnVsbCwKICAgIHN0b3BDb2xvcjogbnVsbCwKICAgIHN0b3BPcGFjaXR5OiBudWxsLAogICAgc3RyaWtldGhyb3VnaFBvc2l0aW9uOiBudW1iZXIsCiAgICBzdHJpa2V0aHJvdWdoVGhpY2tuZXNzOiBudW1iZXIsCiAgICBzdHJpbmc6IG51bGwsCiAgICBzdHJva2U6IG51bGwsCiAgICBzdHJva2VEYXNoQXJyYXk6IGNvbW1hT3JTcGFjZVNlcGFyYXRlZCwKICAgIHN0cm9rZURhc2hPZmZzZXQ6IG51bGwsCiAgICBzdHJva2VMaW5lQ2FwOiBudWxsLAogICAgc3Ryb2tlTGluZUpvaW46IG51bGwsCiAgICBzdHJva2VNaXRlckxpbWl0OiBudW1iZXIsCiAgICBzdHJva2VPcGFjaXR5OiBudW1iZXIsCiAgICBzdHJva2VXaWR0aDogbnVsbCwKICAgIHN0eWxlOiBudWxsLAogICAgc3VyZmFjZVNjYWxlOiBudW1iZXIsCiAgICBzeW5jQmVoYXZpb3I6IG51bGwsCiAgICBzeW5jQmVoYXZpb3JEZWZhdWx0OiBudWxsLAogICAgc3luY01hc3RlcjogbnVsbCwKICAgIHN5bmNUb2xlcmFuY2U6IG51bGwsCiAgICBzeW5jVG9sZXJhbmNlRGVmYXVsdDogbnVsbCwKICAgIHN5c3RlbUxhbmd1YWdlOiBjb21tYU9yU3BhY2VTZXBhcmF0ZWQsCiAgICB0YWJJbmRleDogbnVtYmVyLAogICAgdGFibGVWYWx1ZXM6IG51bGwsCiAgICB0YXJnZXQ6IG51bGwsCiAgICB0YXJnZXRYOiBudW1iZXIsCiAgICB0YXJnZXRZOiBudW1iZXIsCiAgICB0ZXh0QW5jaG9yOiBudWxsLAogICAgdGV4dERlY29yYXRpb246IG51bGwsCiAgICB0ZXh0UmVuZGVyaW5nOiBudWxsLAogICAgdGV4dExlbmd0aDogbnVsbCwKICAgIHRpbWVsaW5lQmVnaW46IG51bGwsCiAgICB0aXRsZTogbnVsbCwKICAgIHRyYW5zZm9ybUJlaGF2aW9yOiBudWxsLAogICAgdHlwZTogbnVsbCwKICAgIHR5cGVPZjogY29tbWFPclNwYWNlU2VwYXJhdGVkLAogICAgdG86IG51bGwsCiAgICB0cmFuc2Zvcm06IG51bGwsCiAgICB0cmFuc2Zvcm1PcmlnaW46IG51bGwsCiAgICB1MTogbnVsbCwKICAgIHUyOiBudWxsLAogICAgdW5kZXJsaW5lUG9zaXRpb246IG51bWJlciwKICAgIHVuZGVybGluZVRoaWNrbmVzczogbnVtYmVyLAogICAgdW5pY29kZTogbnVsbCwKICAgIHVuaWNvZGVCaWRpOiBudWxsLAogICAgdW5pY29kZVJhbmdlOiBudWxsLAogICAgdW5pdHNQZXJFbTogbnVtYmVyLAogICAgdmFsdWVzOiBudWxsLAogICAgdkFscGhhYmV0aWM6IG51bWJlciwKICAgIHZNYXRoZW1hdGljYWw6IG51bWJlciwKICAgIHZlY3RvckVmZmVjdDogbnVsbCwKICAgIHZIYW5naW5nOiBudW1iZXIsCiAgICB2SWRlb2dyYXBoaWM6IG51bWJlciwKICAgIHZlcnNpb246IG51bGwsCiAgICB2ZXJ0QWR2WTogbnVtYmVyLAogICAgdmVydE9yaWdpblg6IG51bWJlciwKICAgIHZlcnRPcmlnaW5ZOiBudW1iZXIsCiAgICB2aWV3Qm94OiBudWxsLAogICAgdmlld1RhcmdldDogbnVsbCwKICAgIHZpc2liaWxpdHk6IG51bGwsCiAgICB3aWR0aDogbnVsbCwKICAgIHdpZHRoczogbnVsbCwKICAgIHdvcmRTcGFjaW5nOiBudWxsLAogICAgd3JpdGluZ01vZGU6IG51bGwsCiAgICB4OiBudWxsLAogICAgeDE6IG51bGwsCiAgICB4MjogbnVsbCwKICAgIHhDaGFubmVsU2VsZWN0b3I6IG51bGwsCiAgICB4SGVpZ2h0OiBudW1iZXIsCiAgICB5OiBudWxsLAogICAgeTE6IG51bGwsCiAgICB5MjogbnVsbCwKICAgIHlDaGFubmVsU2VsZWN0b3I6IG51bGwsCiAgICB6OiBudWxsLAogICAgem9vbUFuZFBhbjogbnVsbAogIH0sCiAgc3BhY2U6ICJzdmciLAogIHRyYW5zZm9ybTogY2FzZVNlbnNpdGl2ZVRyYW5zZm9ybQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL3hsaW5rLmpzCnZhciB4bGluayA9IGNyZWF0ZTYoewogIHByb3BlcnRpZXM6IHsKICAgIHhMaW5rQWN0dWF0ZTogbnVsbCwKICAgIHhMaW5rQXJjUm9sZTogbnVsbCwKICAgIHhMaW5rSHJlZjogbnVsbCwKICAgIHhMaW5rUm9sZTogbnVsbCwKICAgIHhMaW5rU2hvdzogbnVsbCwKICAgIHhMaW5rVGl0bGU6IG51bGwsCiAgICB4TGlua1R5cGU6IG51bGwKICB9LAogIHNwYWNlOiAieGxpbmsiLAogIHRyYW5zZm9ybShfMywgcHJvcGVydHkpIHsKICAgIHJldHVybiAieGxpbms6IiArIHByb3BlcnR5LnNsaWNlKDUpLnRvTG93ZXJDYXNlKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL3htbG5zLmpzCnZhciB4bWxucyA9IGNyZWF0ZTYoewogIGF0dHJpYnV0ZXM6IHsgeG1sbnN4bGluazogInhtbG5zOnhsaW5rIiB9LAogIHByb3BlcnRpZXM6IHsgeG1sbnNYTGluazogbnVsbCwgeG1sbnM6IG51bGwgfSwKICBzcGFjZTogInhtbG5zIiwKICB0cmFuc2Zvcm06IGNhc2VJbnNlbnNpdGl2ZVRyYW5zZm9ybQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL3htbC5qcwp2YXIgeG1sID0gY3JlYXRlNih7CiAgcHJvcGVydGllczogeyB4bWxCYXNlOiBudWxsLCB4bWxMYW5nOiBudWxsLCB4bWxTcGFjZTogbnVsbCB9LAogIHNwYWNlOiAieG1sIiwKICB0cmFuc2Zvcm0oXzMsIHByb3BlcnR5KSB7CiAgICByZXR1cm4gInhtbDoiICsgcHJvcGVydHkuc2xpY2UoMykudG9Mb3dlckNhc2UoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3Byb3BlcnR5LWluZm9ybWF0aW9uQDcuMS4wL25vZGVfbW9kdWxlcy9wcm9wZXJ0eS1pbmZvcm1hdGlvbi9saWIvZmluZC5qcwp2YXIgY2FwID0gL1tBLVpdL2c7CnZhciBkYXNoID0gLy1bYS16XS9nOwp2YXIgdmFsaWQgPSAvXmRhdGFbLVx3LjpdKyQvaTsKZnVuY3Rpb24gZmluZDIoc2NoZW1hLCB2YWx1ZTIpIHsKICBjb25zdCBub3JtYWwgPSBub3JtYWxpemUzKHZhbHVlMik7CiAgbGV0IHByb3BlcnR5ID0gdmFsdWUyOwogIGxldCBUeXBlID0gSW5mbzsKICBpZiAobm9ybWFsIGluIHNjaGVtYS5ub3JtYWwpIHsKICAgIHJldHVybiBzY2hlbWEucHJvcGVydHlbc2NoZW1hLm5vcm1hbFtub3JtYWxdXTsKICB9CiAgaWYgKG5vcm1hbC5sZW5ndGggPiA0ICYmIG5vcm1hbC5zbGljZSgwLCA0KSA9PT0gImRhdGEiICYmIHZhbGlkLnRlc3QodmFsdWUyKSkgewogICAgaWYgKHZhbHVlMi5jaGFyQXQoNCkgPT09ICItIikgewogICAgICBjb25zdCByZXN0ID0gdmFsdWUyLnNsaWNlKDUpLnJlcGxhY2UoZGFzaCwgY2FtZWxjYXNlKTsKICAgICAgcHJvcGVydHkgPSAiZGF0YSIgKyByZXN0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcmVzdC5zbGljZSgxKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IHJlc3QgPSB2YWx1ZTIuc2xpY2UoNCk7CiAgICAgIGlmICghZGFzaC50ZXN0KHJlc3QpKSB7CiAgICAgICAgbGV0IGRhc2hlcyA9IHJlc3QucmVwbGFjZShjYXAsIGtlYmFiKTsKICAgICAgICBpZiAoZGFzaGVzLmNoYXJBdCgwKSAhPT0gIi0iKSB7CiAgICAgICAgICBkYXNoZXMgPSAiLSIgKyBkYXNoZXM7CiAgICAgICAgfQogICAgICAgIHZhbHVlMiA9ICJkYXRhIiArIGRhc2hlczsKICAgICAgfQogICAgfQogICAgVHlwZSA9IERlZmluZWRJbmZvOwogIH0KICByZXR1cm4gbmV3IFR5cGUocHJvcGVydHksIHZhbHVlMik7Cn0KX19uYW1lKGZpbmQyLCAiZmluZCIpOwpmdW5jdGlvbiBrZWJhYigkMCkgewogIHJldHVybiAiLSIgKyAkMC50b0xvd2VyQ2FzZSgpOwp9Cl9fbmFtZShrZWJhYiwgImtlYmFiIik7CmZ1bmN0aW9uIGNhbWVsY2FzZSgkMCkgewogIHJldHVybiAkMC5jaGFyQXQoMSkudG9VcHBlckNhc2UoKTsKfQpfX25hbWUoY2FtZWxjYXNlLCAiY2FtZWxjYXNlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcHJvcGVydHktaW5mb3JtYXRpb25ANy4xLjAvbm9kZV9tb2R1bGVzL3Byb3BlcnR5LWluZm9ybWF0aW9uL2luZGV4LmpzCnZhciBodG1sNCA9IG1lcmdlMyhbYXJpYTIsIGh0bWwzLCB4bGluaywgeG1sbnMsIHhtbF0sICJodG1sIik7CnZhciBzdmcyID0gbWVyZ2UzKFthcmlhMiwgc3ZnLCB4bGluaywgeG1sbnMsIHhtbF0sICJzdmciKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9zdHJpbmdpZnktZW50aXRpZXNANC4wLjQvbm9kZV9tb2R1bGVzL3N0cmluZ2lmeS1lbnRpdGllcy9saWIvY29yZS5qcwp2YXIgZGVmYXVsdFN1YnNldFJlZ2V4ID0gL1siJic8PmBdL2c7CnZhciBzdXJyb2dhdGVQYWlyc1JlZ2V4ID0gL1tcdUQ4MDAtXHVEQkZGXVtcdURDMDAtXHVERkZGXS9nOwp2YXIgY29udHJvbENoYXJhY3RlcnNSZWdleCA9ICgKICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleCwgdW5pY29ybi9uby1oZXgtZXNjYXBlCiAgL1tceDAxLVx0XHZcZlx4MEUtXHgxRlx4N0ZceDgxXHg4RFx4OEZceDkwXHg5RFx4QTAtXHVGRkZGXS9nCik7CnZhciByZWdleEVzY2FwZVJlZ2V4ID0gL1t8XFx7fSgpW1xdXiQrKj8uXS9nOwp2YXIgc3Vic2V0VG9SZWdleENhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7CmZ1bmN0aW9uIGNvcmUodmFsdWUyLCBvcHRpb25zKSB7CiAgdmFsdWUyID0gdmFsdWUyLnJlcGxhY2UoCiAgICBvcHRpb25zLnN1YnNldCA/IGNoYXJhY3RlcnNUb0V4cHJlc3Npb25DYWNoZWQob3B0aW9ucy5zdWJzZXQpIDogZGVmYXVsdFN1YnNldFJlZ2V4LAogICAgYmFzaWMKICApOwogIGlmIChvcHRpb25zLnN1YnNldCB8fCBvcHRpb25zLmVzY2FwZU9ubHkpIHsKICAgIHJldHVybiB2YWx1ZTI7CiAgfQogIHJldHVybiB2YWx1ZTIucmVwbGFjZShzdXJyb2dhdGVQYWlyc1JlZ2V4LCBzdXJyb2dhdGUpLnJlcGxhY2UoY29udHJvbENoYXJhY3RlcnNSZWdleCwgYmFzaWMpOwogIGZ1bmN0aW9uIHN1cnJvZ2F0ZShwYWlyLCBpbmRleDIsIGFsbDMpIHsKICAgIHJldHVybiBvcHRpb25zLmZvcm1hdCgKICAgICAgKHBhaXIuY2hhckNvZGVBdCgwKSAtIDU1Mjk2KSAqIDEwMjQgKyBwYWlyLmNoYXJDb2RlQXQoMSkgLSA1NjMyMCArIDY1NTM2LAogICAgICBhbGwzLmNoYXJDb2RlQXQoaW5kZXgyICsgMiksCiAgICAgIG9wdGlvbnMKICAgICk7CiAgfQogIF9fbmFtZShzdXJyb2dhdGUsICJzdXJyb2dhdGUiKTsKICBmdW5jdGlvbiBiYXNpYyhjaGFyYWN0ZXIsIGluZGV4MiwgYWxsMykgewogICAgcmV0dXJuIG9wdGlvbnMuZm9ybWF0KAogICAgICBjaGFyYWN0ZXIuY2hhckNvZGVBdCgwKSwKICAgICAgYWxsMy5jaGFyQ29kZUF0KGluZGV4MiArIDEpLAogICAgICBvcHRpb25zCiAgICApOwogIH0KICBfX25hbWUoYmFzaWMsICJiYXNpYyIpOwp9Cl9fbmFtZShjb3JlLCAiY29yZSIpOwpmdW5jdGlvbiBjaGFyYWN0ZXJzVG9FeHByZXNzaW9uQ2FjaGVkKHN1YnNldCkgewogIGxldCBjYWNoZWQgPSBzdWJzZXRUb1JlZ2V4Q2FjaGUuZ2V0KHN1YnNldCk7CiAgaWYgKCFjYWNoZWQpIHsKICAgIGNhY2hlZCA9IGNoYXJhY3RlcnNUb0V4cHJlc3Npb24oc3Vic2V0KTsKICAgIHN1YnNldFRvUmVnZXhDYWNoZS5zZXQoc3Vic2V0LCBjYWNoZWQpOwogIH0KICByZXR1cm4gY2FjaGVkOwp9Cl9fbmFtZShjaGFyYWN0ZXJzVG9FeHByZXNzaW9uQ2FjaGVkLCAiY2hhcmFjdGVyc1RvRXhwcmVzc2lvbkNhY2hlZCIpOwpmdW5jdGlvbiBjaGFyYWN0ZXJzVG9FeHByZXNzaW9uKHN1YnNldCkgewogIGNvbnN0IGdyb3VwcyA9IFtdOwogIGxldCBpbmRleDIgPSAtMTsKICB3aGlsZSAoKytpbmRleDIgPCBzdWJzZXQubGVuZ3RoKSB7CiAgICBncm91cHMucHVzaChzdWJzZXRbaW5kZXgyXS5yZXBsYWNlKHJlZ2V4RXNjYXBlUmVnZXgsICJcXCQmIikpOwogIH0KICByZXR1cm4gbmV3IFJlZ0V4cCgiKD86IiArIGdyb3Vwcy5qb2luKCJ8IikgKyAiKSIsICJnIik7Cn0KX19uYW1lKGNoYXJhY3RlcnNUb0V4cHJlc3Npb24sICJjaGFyYWN0ZXJzVG9FeHByZXNzaW9uIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vc3RyaW5naWZ5LWVudGl0aWVzQDQuMC40L25vZGVfbW9kdWxlcy9zdHJpbmdpZnktZW50aXRpZXMvbGliL3V0aWwvdG8taGV4YWRlY2ltYWwuanMKdmFyIGhleGFkZWNpbWFsUmVnZXggPSAvW1xkQS1GYS1mXS87CmZ1bmN0aW9uIHRvSGV4YWRlY2ltYWwoY29kZTQsIG5leHQyLCBvbWl0KSB7CiAgY29uc3QgdmFsdWUyID0gIiYjeCIgKyBjb2RlNC50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTsKICByZXR1cm4gb21pdCAmJiBuZXh0MiAmJiAhaGV4YWRlY2ltYWxSZWdleC50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUobmV4dDIpKSA/IHZhbHVlMiA6IHZhbHVlMiArICI7IjsKfQpfX25hbWUodG9IZXhhZGVjaW1hbCwgInRvSGV4YWRlY2ltYWwiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9zdHJpbmdpZnktZW50aXRpZXNANC4wLjQvbm9kZV9tb2R1bGVzL3N0cmluZ2lmeS1lbnRpdGllcy9saWIvdXRpbC90by1kZWNpbWFsLmpzCnZhciBkZWNpbWFsUmVnZXggPSAvXGQvOwpmdW5jdGlvbiB0b0RlY2ltYWwoY29kZTQsIG5leHQyLCBvbWl0KSB7CiAgY29uc3QgdmFsdWUyID0gIiYjIiArIFN0cmluZyhjb2RlNCk7CiAgcmV0dXJuIG9taXQgJiYgbmV4dDIgJiYgIWRlY2ltYWxSZWdleC50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUobmV4dDIpKSA/IHZhbHVlMiA6IHZhbHVlMiArICI7IjsKfQpfX25hbWUodG9EZWNpbWFsLCAidG9EZWNpbWFsIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vY2hhcmFjdGVyLWVudGl0aWVzLWxlZ2FjeUAzLjAuMC9ub2RlX21vZHVsZXMvY2hhcmFjdGVyLWVudGl0aWVzLWxlZ2FjeS9pbmRleC5qcwp2YXIgY2hhcmFjdGVyRW50aXRpZXNMZWdhY3kgPSBbCiAgIkFFbGlnIiwKICAiQU1QIiwKICAiQWFjdXRlIiwKICAiQWNpcmMiLAogICJBZ3JhdmUiLAogICJBcmluZyIsCiAgIkF0aWxkZSIsCiAgIkF1bWwiLAogICJDT1BZIiwKICAiQ2NlZGlsIiwKICAiRVRIIiwKICAiRWFjdXRlIiwKICAiRWNpcmMiLAogICJFZ3JhdmUiLAogICJFdW1sIiwKICAiR1QiLAogICJJYWN1dGUiLAogICJJY2lyYyIsCiAgIklncmF2ZSIsCiAgIkl1bWwiLAogICJMVCIsCiAgIk50aWxkZSIsCiAgIk9hY3V0ZSIsCiAgIk9jaXJjIiwKICAiT2dyYXZlIiwKICAiT3NsYXNoIiwKICAiT3RpbGRlIiwKICAiT3VtbCIsCiAgIlFVT1QiLAogICJSRUciLAogICJUSE9STiIsCiAgIlVhY3V0ZSIsCiAgIlVjaXJjIiwKICAiVWdyYXZlIiwKICAiVXVtbCIsCiAgIllhY3V0ZSIsCiAgImFhY3V0ZSIsCiAgImFjaXJjIiwKICAiYWN1dGUiLAogICJhZWxpZyIsCiAgImFncmF2ZSIsCiAgImFtcCIsCiAgImFyaW5nIiwKICAiYXRpbGRlIiwKICAiYXVtbCIsCiAgImJydmJhciIsCiAgImNjZWRpbCIsCiAgImNlZGlsIiwKICAiY2VudCIsCiAgImNvcHkiLAogICJjdXJyZW4iLAogICJkZWciLAogICJkaXZpZGUiLAogICJlYWN1dGUiLAogICJlY2lyYyIsCiAgImVncmF2ZSIsCiAgImV0aCIsCiAgImV1bWwiLAogICJmcmFjMTIiLAogICJmcmFjMTQiLAogICJmcmFjMzQiLAogICJndCIsCiAgImlhY3V0ZSIsCiAgImljaXJjIiwKICAiaWV4Y2wiLAogICJpZ3JhdmUiLAogICJpcXVlc3QiLAogICJpdW1sIiwKICAibGFxdW8iLAogICJsdCIsCiAgIm1hY3IiLAogICJtaWNybyIsCiAgIm1pZGRvdCIsCiAgIm5ic3AiLAogICJub3QiLAogICJudGlsZGUiLAogICJvYWN1dGUiLAogICJvY2lyYyIsCiAgIm9ncmF2ZSIsCiAgIm9yZGYiLAogICJvcmRtIiwKICAib3NsYXNoIiwKICAib3RpbGRlIiwKICAib3VtbCIsCiAgInBhcmEiLAogICJwbHVzbW4iLAogICJwb3VuZCIsCiAgInF1b3QiLAogICJyYXF1byIsCiAgInJlZyIsCiAgInNlY3QiLAogICJzaHkiLAogICJzdXAxIiwKICAic3VwMiIsCiAgInN1cDMiLAogICJzemxpZyIsCiAgInRob3JuIiwKICAidGltZXMiLAogICJ1YWN1dGUiLAogICJ1Y2lyYyIsCiAgInVncmF2ZSIsCiAgInVtbCIsCiAgInV1bWwiLAogICJ5YWN1dGUiLAogICJ5ZW4iLAogICJ5dW1sIgpdOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2NoYXJhY3Rlci1lbnRpdGllcy1odG1sNEAyLjEuMC9ub2RlX21vZHVsZXMvY2hhcmFjdGVyLWVudGl0aWVzLWh0bWw0L2luZGV4LmpzCnZhciBjaGFyYWN0ZXJFbnRpdGllc0h0bWw0ID0gewogIG5ic3A6ICJceEEwIiwKICBpZXhjbDogIlx4QTEiLAogIGNlbnQ6ICJceEEyIiwKICBwb3VuZDogIlx4QTMiLAogIGN1cnJlbjogIlx4QTQiLAogIHllbjogIlx4QTUiLAogIGJydmJhcjogIlx4QTYiLAogIHNlY3Q6ICJceEE3IiwKICB1bWw6ICJceEE4IiwKICBjb3B5OiAiXHhBOSIsCiAgb3JkZjogIlx4QUEiLAogIGxhcXVvOiAiXHhBQiIsCiAgbm90OiAiXHhBQyIsCiAgc2h5OiAiXHhBRCIsCiAgcmVnOiAiXHhBRSIsCiAgbWFjcjogIlx4QUYiLAogIGRlZzogIlx4QjAiLAogIHBsdXNtbjogIlx4QjEiLAogIHN1cDI6ICJceEIyIiwKICBzdXAzOiAiXHhCMyIsCiAgYWN1dGU6ICJceEI0IiwKICBtaWNybzogIlx4QjUiLAogIHBhcmE6ICJceEI2IiwKICBtaWRkb3Q6ICJceEI3IiwKICBjZWRpbDogIlx4QjgiLAogIHN1cDE6ICJceEI5IiwKICBvcmRtOiAiXHhCQSIsCiAgcmFxdW86ICJceEJCIiwKICBmcmFjMTQ6ICJceEJDIiwKICBmcmFjMTI6ICJceEJEIiwKICBmcmFjMzQ6ICJceEJFIiwKICBpcXVlc3Q6ICJceEJGIiwKICBBZ3JhdmU6ICJceEMwIiwKICBBYWN1dGU6ICJceEMxIiwKICBBY2lyYzogIlx4QzIiLAogIEF0aWxkZTogIlx4QzMiLAogIEF1bWw6ICJceEM0IiwKICBBcmluZzogIlx4QzUiLAogIEFFbGlnOiAiXHhDNiIsCiAgQ2NlZGlsOiAiXHhDNyIsCiAgRWdyYXZlOiAiXHhDOCIsCiAgRWFjdXRlOiAiXHhDOSIsCiAgRWNpcmM6ICJceENBIiwKICBFdW1sOiAiXHhDQiIsCiAgSWdyYXZlOiAiXHhDQyIsCiAgSWFjdXRlOiAiXHhDRCIsCiAgSWNpcmM6ICJceENFIiwKICBJdW1sOiAiXHhDRiIsCiAgRVRIOiAiXHhEMCIsCiAgTnRpbGRlOiAiXHhEMSIsCiAgT2dyYXZlOiAiXHhEMiIsCiAgT2FjdXRlOiAiXHhEMyIsCiAgT2NpcmM6ICJceEQ0IiwKICBPdGlsZGU6ICJceEQ1IiwKICBPdW1sOiAiXHhENiIsCiAgdGltZXM6ICJceEQ3IiwKICBPc2xhc2g6ICJceEQ4IiwKICBVZ3JhdmU6ICJceEQ5IiwKICBVYWN1dGU6ICJceERBIiwKICBVY2lyYzogIlx4REIiLAogIFV1bWw6ICJceERDIiwKICBZYWN1dGU6ICJceEREIiwKICBUSE9STjogIlx4REUiLAogIHN6bGlnOiAiXHhERiIsCiAgYWdyYXZlOiAiXHhFMCIsCiAgYWFjdXRlOiAiXHhFMSIsCiAgYWNpcmM6ICJceEUyIiwKICBhdGlsZGU6ICJceEUzIiwKICBhdW1sOiAiXHhFNCIsCiAgYXJpbmc6ICJceEU1IiwKICBhZWxpZzogIlx4RTYiLAogIGNjZWRpbDogIlx4RTciLAogIGVncmF2ZTogIlx4RTgiLAogIGVhY3V0ZTogIlx4RTkiLAogIGVjaXJjOiAiXHhFQSIsCiAgZXVtbDogIlx4RUIiLAogIGlncmF2ZTogIlx4RUMiLAogIGlhY3V0ZTogIlx4RUQiLAogIGljaXJjOiAiXHhFRSIsCiAgaXVtbDogIlx4RUYiLAogIGV0aDogIlx4RjAiLAogIG50aWxkZTogIlx4RjEiLAogIG9ncmF2ZTogIlx4RjIiLAogIG9hY3V0ZTogIlx4RjMiLAogIG9jaXJjOiAiXHhGNCIsCiAgb3RpbGRlOiAiXHhGNSIsCiAgb3VtbDogIlx4RjYiLAogIGRpdmlkZTogIlx4RjciLAogIG9zbGFzaDogIlx4RjgiLAogIHVncmF2ZTogIlx4RjkiLAogIHVhY3V0ZTogIlx4RkEiLAogIHVjaXJjOiAiXHhGQiIsCiAgdXVtbDogIlx4RkMiLAogIHlhY3V0ZTogIlx4RkQiLAogIHRob3JuOiAiXHhGRSIsCiAgeXVtbDogIlx4RkYiLAogIGZub2Y6ICJcdTAxOTIiLAogIEFscGhhOiAiXHUwMzkxIiwKICBCZXRhOiAiXHUwMzkyIiwKICBHYW1tYTogIlx1MDM5MyIsCiAgRGVsdGE6ICJcdTAzOTQiLAogIEVwc2lsb246ICJcdTAzOTUiLAogIFpldGE6ICJcdTAzOTYiLAogIEV0YTogIlx1MDM5NyIsCiAgVGhldGE6ICJcdTAzOTgiLAogIElvdGE6ICJcdTAzOTkiLAogIEthcHBhOiAiXHUwMzlBIiwKICBMYW1iZGE6ICJcdTAzOUIiLAogIE11OiAiXHUwMzlDIiwKICBOdTogIlx1MDM5RCIsCiAgWGk6ICJcdTAzOUUiLAogIE9taWNyb246ICJcdTAzOUYiLAogIFBpOiAiXHUwM0EwIiwKICBSaG86ICJcdTAzQTEiLAogIFNpZ21hOiAiXHUwM0EzIiwKICBUYXU6ICJcdTAzQTQiLAogIFVwc2lsb246ICJcdTAzQTUiLAogIFBoaTogIlx1MDNBNiIsCiAgQ2hpOiAiXHUwM0E3IiwKICBQc2k6ICJcdTAzQTgiLAogIE9tZWdhOiAiXHUwM0E5IiwKICBhbHBoYTogIlx1MDNCMSIsCiAgYmV0YTogIlx1MDNCMiIsCiAgZ2FtbWE6ICJcdTAzQjMiLAogIGRlbHRhOiAiXHUwM0I0IiwKICBlcHNpbG9uOiAiXHUwM0I1IiwKICB6ZXRhOiAiXHUwM0I2IiwKICBldGE6ICJcdTAzQjciLAogIHRoZXRhOiAiXHUwM0I4IiwKICBpb3RhOiAiXHUwM0I5IiwKICBrYXBwYTogIlx1MDNCQSIsCiAgbGFtYmRhOiAiXHUwM0JCIiwKICBtdTogIlx1MDNCQyIsCiAgbnU6ICJcdTAzQkQiLAogIHhpOiAiXHUwM0JFIiwKICBvbWljcm9uOiAiXHUwM0JGIiwKICBwaTogIlx1MDNDMCIsCiAgcmhvOiAiXHUwM0MxIiwKICBzaWdtYWY6ICJcdTAzQzIiLAogIHNpZ21hOiAiXHUwM0MzIiwKICB0YXU6ICJcdTAzQzQiLAogIHVwc2lsb246ICJcdTAzQzUiLAogIHBoaTogIlx1MDNDNiIsCiAgY2hpOiAiXHUwM0M3IiwKICBwc2k6ICJcdTAzQzgiLAogIG9tZWdhOiAiXHUwM0M5IiwKICB0aGV0YXN5bTogIlx1MDNEMSIsCiAgdXBzaWg6ICJcdTAzRDIiLAogIHBpdjogIlx1MDNENiIsCiAgYnVsbDogIlx1MjAyMiIsCiAgaGVsbGlwOiAiXHUyMDI2IiwKICBwcmltZTogIlx1MjAzMiIsCiAgUHJpbWU6ICJcdTIwMzMiLAogIG9saW5lOiAiXHUyMDNFIiwKICBmcmFzbDogIlx1MjA0NCIsCiAgd2VpZXJwOiAiXHUyMTE4IiwKICBpbWFnZTogIlx1MjExMSIsCiAgcmVhbDogIlx1MjExQyIsCiAgdHJhZGU6ICJcdTIxMjIiLAogIGFsZWZzeW06ICJcdTIxMzUiLAogIGxhcnI6ICJcdTIxOTAiLAogIHVhcnI6ICJcdTIxOTEiLAogIHJhcnI6ICJcdTIxOTIiLAogIGRhcnI6ICJcdTIxOTMiLAogIGhhcnI6ICJcdTIxOTQiLAogIGNyYXJyOiAiXHUyMUI1IiwKICBsQXJyOiAiXHUyMUQwIiwKICB1QXJyOiAiXHUyMUQxIiwKICByQXJyOiAiXHUyMUQyIiwKICBkQXJyOiAiXHUyMUQzIiwKICBoQXJyOiAiXHUyMUQ0IiwKICBmb3JhbGw6ICJcdTIyMDAiLAogIHBhcnQ6ICJcdTIyMDIiLAogIGV4aXN0OiAiXHUyMjAzIiwKICBlbXB0eTogIlx1MjIwNSIsCiAgbmFibGE6ICJcdTIyMDciLAogIGlzaW46ICJcdTIyMDgiLAogIG5vdGluOiAiXHUyMjA5IiwKICBuaTogIlx1MjIwQiIsCiAgcHJvZDogIlx1MjIwRiIsCiAgc3VtOiAiXHUyMjExIiwKICBtaW51czogIlx1MjIxMiIsCiAgbG93YXN0OiAiXHUyMjE3IiwKICByYWRpYzogIlx1MjIxQSIsCiAgcHJvcDogIlx1MjIxRCIsCiAgaW5maW46ICJcdTIyMUUiLAogIGFuZzogIlx1MjIyMCIsCiAgYW5kOiAiXHUyMjI3IiwKICBvcjogIlx1MjIyOCIsCiAgY2FwOiAiXHUyMjI5IiwKICBjdXA6ICJcdTIyMkEiLAogIGludDogIlx1MjIyQiIsCiAgdGhlcmU0OiAiXHUyMjM0IiwKICBzaW06ICJcdTIyM0MiLAogIGNvbmc6ICJcdTIyNDUiLAogIGFzeW1wOiAiXHUyMjQ4IiwKICBuZTogIlx1MjI2MCIsCiAgZXF1aXY6ICJcdTIyNjEiLAogIGxlOiAiXHUyMjY0IiwKICBnZTogIlx1MjI2NSIsCiAgc3ViOiAiXHUyMjgyIiwKICBzdXA6ICJcdTIyODMiLAogIG5zdWI6ICJcdTIyODQiLAogIHN1YmU6ICJcdTIyODYiLAogIHN1cGU6ICJcdTIyODciLAogIG9wbHVzOiAiXHUyMjk1IiwKICBvdGltZXM6ICJcdTIyOTciLAogIHBlcnA6ICJcdTIyQTUiLAogIHNkb3Q6ICJcdTIyQzUiLAogIGxjZWlsOiAiXHUyMzA4IiwKICByY2VpbDogIlx1MjMwOSIsCiAgbGZsb29yOiAiXHUyMzBBIiwKICByZmxvb3I6ICJcdTIzMEIiLAogIGxhbmc6ICJcdTIzMjkiLAogIHJhbmc6ICJcdTIzMkEiLAogIGxvejogIlx1MjVDQSIsCiAgc3BhZGVzOiAiXHUyNjYwIiwKICBjbHViczogIlx1MjY2MyIsCiAgaGVhcnRzOiAiXHUyNjY1IiwKICBkaWFtczogIlx1MjY2NiIsCiAgcXVvdDogJyInLAogIGFtcDogIiYiLAogIGx0OiAiPCIsCiAgZ3Q6ICI+IiwKICBPRWxpZzogIlx1MDE1MiIsCiAgb2VsaWc6ICJcdTAxNTMiLAogIFNjYXJvbjogIlx1MDE2MCIsCiAgc2Nhcm9uOiAiXHUwMTYxIiwKICBZdW1sOiAiXHUwMTc4IiwKICBjaXJjOiAiXHUwMkM2IiwKICB0aWxkZTogIlx1MDJEQyIsCiAgZW5zcDogIlx1MjAwMiIsCiAgZW1zcDogIlx1MjAwMyIsCiAgdGhpbnNwOiAiXHUyMDA5IiwKICB6d25qOiAiXHUyMDBDIiwKICB6d2o6ICJcdTIwMEQiLAogIGxybTogIlx1MjAwRSIsCiAgcmxtOiAiXHUyMDBGIiwKICBuZGFzaDogIlx1MjAxMyIsCiAgbWRhc2g6ICJcdTIwMTQiLAogIGxzcXVvOiAiXHUyMDE4IiwKICByc3F1bzogIlx1MjAxOSIsCiAgc2JxdW86ICJcdTIwMUEiLAogIGxkcXVvOiAiXHUyMDFDIiwKICByZHF1bzogIlx1MjAxRCIsCiAgYmRxdW86ICJcdTIwMUUiLAogIGRhZ2dlcjogIlx1MjAyMCIsCiAgRGFnZ2VyOiAiXHUyMDIxIiwKICBwZXJtaWw6ICJcdTIwMzAiLAogIGxzYXF1bzogIlx1MjAzOSIsCiAgcnNhcXVvOiAiXHUyMDNBIiwKICBldXJvOiAiXHUyMEFDIgp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3N0cmluZ2lmeS1lbnRpdGllc0A0LjAuNC9ub2RlX21vZHVsZXMvc3RyaW5naWZ5LWVudGl0aWVzL2xpYi9jb25zdGFudC9kYW5nZXJvdXMuanMKdmFyIGRhbmdlcm91cyA9IFsKICAiY2VudCIsCiAgImNvcHkiLAogICJkaXZpZGUiLAogICJndCIsCiAgImx0IiwKICAibm90IiwKICAicGFyYSIsCiAgInRpbWVzIgpdOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3N0cmluZ2lmeS1lbnRpdGllc0A0LjAuNC9ub2RlX21vZHVsZXMvc3RyaW5naWZ5LWVudGl0aWVzL2xpYi91dGlsL3RvLW5hbWVkLmpzCnZhciBvd245ID0ge30uaGFzT3duUHJvcGVydHk7CnZhciBjaGFyYWN0ZXJzID0ge307CnZhciBrZXk7CmZvciAoa2V5IGluIGNoYXJhY3RlckVudGl0aWVzSHRtbDQpIHsKICBpZiAob3duOS5jYWxsKGNoYXJhY3RlckVudGl0aWVzSHRtbDQsIGtleSkpIHsKICAgIGNoYXJhY3RlcnNbY2hhcmFjdGVyRW50aXRpZXNIdG1sNFtrZXldXSA9IGtleTsKICB9Cn0KdmFyIG5vdEFscGhhbnVtZXJpY1JlZ2V4ID0gL1teXGRBLVphLXpdLzsKZnVuY3Rpb24gdG9OYW1lZChjb2RlNCwgbmV4dDIsIG9taXQsIGF0dHJpYnV0ZSkgewogIGNvbnN0IGNoYXJhY3RlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZTQpOwogIGlmIChvd245LmNhbGwoY2hhcmFjdGVycywgY2hhcmFjdGVyKSkgewogICAgY29uc3QgbmFtZSA9IGNoYXJhY3RlcnNbY2hhcmFjdGVyXTsKICAgIGNvbnN0IHZhbHVlMiA9ICImIiArIG5hbWU7CiAgICBpZiAob21pdCAmJiBjaGFyYWN0ZXJFbnRpdGllc0xlZ2FjeS5pbmNsdWRlcyhuYW1lKSAmJiAhZGFuZ2Vyb3VzLmluY2x1ZGVzKG5hbWUpICYmICghYXR0cmlidXRlIHx8IG5leHQyICYmIG5leHQyICE9PSA2MSAmJiBub3RBbHBoYW51bWVyaWNSZWdleC50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUobmV4dDIpKSkpIHsKICAgICAgcmV0dXJuIHZhbHVlMjsKICAgIH0KICAgIHJldHVybiB2YWx1ZTIgKyAiOyI7CiAgfQogIHJldHVybiAiIjsKfQpfX25hbWUodG9OYW1lZCwgInRvTmFtZWQiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9zdHJpbmdpZnktZW50aXRpZXNANC4wLjQvbm9kZV9tb2R1bGVzL3N0cmluZ2lmeS1lbnRpdGllcy9saWIvdXRpbC9mb3JtYXQtc21hcnQuanMKZnVuY3Rpb24gZm9ybWF0U21hcnQoY29kZTQsIG5leHQyLCBvcHRpb25zKSB7CiAgbGV0IG51bWVyaWMgPSB0b0hleGFkZWNpbWFsKGNvZGU0LCBuZXh0Miwgb3B0aW9ucy5vbWl0T3B0aW9uYWxTZW1pY29sb25zKTsKICBsZXQgbmFtZWQ7CiAgaWYgKG9wdGlvbnMudXNlTmFtZWRSZWZlcmVuY2VzIHx8IG9wdGlvbnMudXNlU2hvcnRlc3RSZWZlcmVuY2VzKSB7CiAgICBuYW1lZCA9IHRvTmFtZWQoCiAgICAgIGNvZGU0LAogICAgICBuZXh0MiwKICAgICAgb3B0aW9ucy5vbWl0T3B0aW9uYWxTZW1pY29sb25zLAogICAgICBvcHRpb25zLmF0dHJpYnV0ZQogICAgKTsKICB9CiAgaWYgKChvcHRpb25zLnVzZVNob3J0ZXN0UmVmZXJlbmNlcyB8fCAhbmFtZWQpICYmIG9wdGlvbnMudXNlU2hvcnRlc3RSZWZlcmVuY2VzKSB7CiAgICBjb25zdCBkZWNpbWFsID0gdG9EZWNpbWFsKGNvZGU0LCBuZXh0Miwgb3B0aW9ucy5vbWl0T3B0aW9uYWxTZW1pY29sb25zKTsKICAgIGlmIChkZWNpbWFsLmxlbmd0aCA8IG51bWVyaWMubGVuZ3RoKSB7CiAgICAgIG51bWVyaWMgPSBkZWNpbWFsOwogICAgfQogIH0KICByZXR1cm4gbmFtZWQgJiYgKCFvcHRpb25zLnVzZVNob3J0ZXN0UmVmZXJlbmNlcyB8fCBuYW1lZC5sZW5ndGggPCBudW1lcmljLmxlbmd0aCkgPyBuYW1lZCA6IG51bWVyaWM7Cn0KX19uYW1lKGZvcm1hdFNtYXJ0LCAiZm9ybWF0U21hcnQiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9zdHJpbmdpZnktZW50aXRpZXNANC4wLjQvbm9kZV9tb2R1bGVzL3N0cmluZ2lmeS1lbnRpdGllcy9saWIvdXRpbC9mb3JtYXQtYmFzaWMuanMKZnVuY3Rpb24gZm9ybWF0QmFzaWMoY29kZTQpIHsKICByZXR1cm4gIiYjeCIgKyBjb2RlNC50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSArICI7IjsKfQpfX25hbWUoZm9ybWF0QmFzaWMsICJmb3JtYXRCYXNpYyIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3N0cmluZ2lmeS1lbnRpdGllc0A0LjAuNC9ub2RlX21vZHVsZXMvc3RyaW5naWZ5LWVudGl0aWVzL2xpYi9pbmRleC5qcwpmdW5jdGlvbiBzdHJpbmdpZnlFbnRpdGllcyh2YWx1ZTIsIG9wdGlvbnMpIHsKICByZXR1cm4gY29yZSh2YWx1ZTIsIE9iamVjdC5hc3NpZ24oeyBmb3JtYXQ6IGZvcm1hdFNtYXJ0IH0sIG9wdGlvbnMpKTsKfQpfX25hbWUoc3RyaW5naWZ5RW50aXRpZXMsICJzdHJpbmdpZnlFbnRpdGllcyIpOwpmdW5jdGlvbiBzdHJpbmdpZnlFbnRpdGllc0xpZ2h0KHZhbHVlMiwgb3B0aW9ucykgewogIHJldHVybiBjb3JlKHZhbHVlMiwgT2JqZWN0LmFzc2lnbih7IGZvcm1hdDogZm9ybWF0QmFzaWMgfSwgb3B0aW9ucykpOwp9Cl9fbmFtZShzdHJpbmdpZnlFbnRpdGllc0xpZ2h0LCAic3RyaW5naWZ5RW50aXRpZXNMaWdodCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2hhc3QtdXRpbC10by1odG1sQDkuMC41L25vZGVfbW9kdWxlcy9oYXN0LXV0aWwtdG8taHRtbC9saWIvaGFuZGxlL2NvbW1lbnQuanMKdmFyIGh0bWxDb21tZW50UmVnZXggPSAvXj58Xi0+fDwhLS18LS0+fC0tIT58PCEtJC9nOwp2YXIgYm9ndXNDb21tZW50RW50aXR5U3Vic2V0ID0gWyI+Il07CnZhciBjb21tZW50RW50aXR5U3Vic2V0ID0gWyI8IiwgIj4iXTsKZnVuY3Rpb24gY29tbWVudDIobm9kZTIsIF8xLCBfMjIsIHN0YXRlKSB7CiAgcmV0dXJuIHN0YXRlLnNldHRpbmdzLmJvZ3VzQ29tbWVudHMgPyAiPD8iICsgc3RyaW5naWZ5RW50aXRpZXMoCiAgICBub2RlMi52YWx1ZSwKICAgIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnNldHRpbmdzLmNoYXJhY3RlclJlZmVyZW5jZXMsIHsKICAgICAgc3Vic2V0OiBib2d1c0NvbW1lbnRFbnRpdHlTdWJzZXQKICAgIH0pCiAgKSArICI+IiA6ICI8IS0tIiArIG5vZGUyLnZhbHVlLnJlcGxhY2UoaHRtbENvbW1lbnRSZWdleCwgZW5jb2RlMikgKyAiLS0+IjsKICBmdW5jdGlvbiBlbmNvZGUyKCQwKSB7CiAgICByZXR1cm4gc3RyaW5naWZ5RW50aXRpZXMoCiAgICAgICQwLAogICAgICBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5zZXR0aW5ncy5jaGFyYWN0ZXJSZWZlcmVuY2VzLCB7CiAgICAgICAgc3Vic2V0OiBjb21tZW50RW50aXR5U3Vic2V0CiAgICAgIH0pCiAgICApOwogIH0KICBfX25hbWUoZW5jb2RlMiwgImVuY29kZSIpOwp9Cl9fbmFtZShjb21tZW50MiwgImNvbW1lbnQiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9oYXN0LXV0aWwtdG8taHRtbEA5LjAuNS9ub2RlX21vZHVsZXMvaGFzdC11dGlsLXRvLWh0bWwvbGliL2hhbmRsZS9kb2N0eXBlLmpzCmZ1bmN0aW9uIGRvY3R5cGUyKF8xLCBfMjIsIF8zLCBzdGF0ZSkgewogIHJldHVybiAiPCEiICsgKHN0YXRlLnNldHRpbmdzLnVwcGVyRG9jdHlwZSA/ICJET0NUWVBFIiA6ICJkb2N0eXBlIikgKyAoc3RhdGUuc2V0dGluZ3MudGlnaHREb2N0eXBlID8gIiIgOiAiICIpICsgImh0bWw+IjsKfQpfX25hbWUoZG9jdHlwZTIsICJkb2N0eXBlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vY29tbWEtc2VwYXJhdGVkLXRva2Vuc0AyLjAuMy9ub2RlX21vZHVsZXMvY29tbWEtc2VwYXJhdGVkLXRva2Vucy9pbmRleC5qcwpmdW5jdGlvbiBwYXJzZTUodmFsdWUyKSB7CiAgY29uc3QgdG9rZW5zID0gW107CiAgY29uc3QgaW5wdXQgPSBTdHJpbmcodmFsdWUyIHx8ICIiKTsKICBsZXQgaW5kZXgyID0gaW5wdXQuaW5kZXhPZigiLCIpOwogIGxldCBzdGFydCA9IDA7CiAgbGV0IGVuZCA9IGZhbHNlOwogIHdoaWxlICghZW5kKSB7CiAgICBpZiAoaW5kZXgyID09PSAtMSkgewogICAgICBpbmRleDIgPSBpbnB1dC5sZW5ndGg7CiAgICAgIGVuZCA9IHRydWU7CiAgICB9CiAgICBjb25zdCB0b2tlbiA9IGlucHV0LnNsaWNlKHN0YXJ0LCBpbmRleDIpLnRyaW0oKTsKICAgIGlmICh0b2tlbiB8fCAhZW5kKSB7CiAgICAgIHRva2Vucy5wdXNoKHRva2VuKTsKICAgIH0KICAgIHN0YXJ0ID0gaW5kZXgyICsgMTsKICAgIGluZGV4MiA9IGlucHV0LmluZGV4T2YoIiwiLCBzdGFydCk7CiAgfQogIHJldHVybiB0b2tlbnM7Cn0KX19uYW1lKHBhcnNlNSwgInBhcnNlIik7CmZ1bmN0aW9uIHN0cmluZ2lmeTModmFsdWVzLCBvcHRpb25zKSB7CiAgY29uc3Qgc2V0dGluZ3MgPSBvcHRpb25zIHx8IHt9OwogIGNvbnN0IGlucHV0ID0gdmFsdWVzW3ZhbHVlcy5sZW5ndGggLSAxXSA9PT0gIiIgPyBbLi4udmFsdWVzLCAiIl0gOiB2YWx1ZXM7CiAgcmV0dXJuIGlucHV0LmpvaW4oCiAgICAoc2V0dGluZ3MucGFkUmlnaHQgPyAiICIgOiAiIikgKyAiLCIgKyAoc2V0dGluZ3MucGFkTGVmdCA9PT0gZmFsc2UgPyAiIiA6ICIgIikKICApLnRyaW0oKTsKfQpfX25hbWUoc3RyaW5naWZ5MywgInN0cmluZ2lmeSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3NwYWNlLXNlcGFyYXRlZC10b2tlbnNAMi4wLjIvbm9kZV9tb2R1bGVzL3NwYWNlLXNlcGFyYXRlZC10b2tlbnMvaW5kZXguanMKZnVuY3Rpb24gcGFyc2U2KHZhbHVlMikgewogIGNvbnN0IGlucHV0ID0gU3RyaW5nKHZhbHVlMiB8fCAiIikudHJpbSgpOwogIHJldHVybiBpbnB1dCA/IGlucHV0LnNwbGl0KC9bIFx0XG5cclxmXSsvZykgOiBbXTsKfQpfX25hbWUocGFyc2U2LCAicGFyc2UiKTsKZnVuY3Rpb24gc3RyaW5naWZ5NCh2YWx1ZXMpIHsKICByZXR1cm4gdmFsdWVzLmpvaW4oIiAiKS50cmltKCk7Cn0KX19uYW1lKHN0cmluZ2lmeTQsICJzdHJpbmdpZnkiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9oYXN0LXV0aWwtd2hpdGVzcGFjZUAzLjAuMC9ub2RlX21vZHVsZXMvaGFzdC11dGlsLXdoaXRlc3BhY2UvbGliL2luZGV4LmpzCnZhciByZSA9IC9bIFx0XG5cZlxyXS9nOwpmdW5jdGlvbiB3aGl0ZXNwYWNlKHRoaW5nKSB7CiAgcmV0dXJuIHR5cGVvZiB0aGluZyA9PT0gIm9iamVjdCIgPyB0aGluZy50eXBlID09PSAidGV4dCIgPyBlbXB0eTModGhpbmcudmFsdWUpIDogZmFsc2UgOiBlbXB0eTModGhpbmcpOwp9Cl9fbmFtZSh3aGl0ZXNwYWNlLCAid2hpdGVzcGFjZSIpOwpmdW5jdGlvbiBlbXB0eTModmFsdWUyKSB7CiAgcmV0dXJuIHZhbHVlMi5yZXBsYWNlKHJlLCAiIikgPT09ICIiOwp9Cl9fbmFtZShlbXB0eTMsICJlbXB0eSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2hhc3QtdXRpbC10by1odG1sQDkuMC41L25vZGVfbW9kdWxlcy9oYXN0LXV0aWwtdG8taHRtbC9saWIvb21pc3Npb24vdXRpbC9zaWJsaW5ncy5qcwp2YXIgc2libGluZ0FmdGVyID0gc2libGluZ3MoMSk7CnZhciBzaWJsaW5nQmVmb3JlID0gc2libGluZ3MoLTEpOwp2YXIgZW1wdHlDaGlsZHJlbiA9IFtdOwpmdW5jdGlvbiBzaWJsaW5ncyhpbmNyZW1lbnQyKSB7CiAgcmV0dXJuIHNpYmxpbmc7CiAgZnVuY3Rpb24gc2libGluZyhwYXJlbnQsIGluZGV4MiwgaW5jbHVkZVdoaXRlc3BhY2UpIHsKICAgIGNvbnN0IHNpYmxpbmdzMiA9IHBhcmVudCA/IHBhcmVudC5jaGlsZHJlbiA6IGVtcHR5Q2hpbGRyZW47CiAgICBsZXQgb2Zmc2V0ID0gKGluZGV4MiB8fCAwKSArIGluY3JlbWVudDI7CiAgICBsZXQgbmV4dDIgPSBzaWJsaW5nczJbb2Zmc2V0XTsKICAgIGlmICghaW5jbHVkZVdoaXRlc3BhY2UpIHsKICAgICAgd2hpbGUgKG5leHQyICYmIHdoaXRlc3BhY2UobmV4dDIpKSB7CiAgICAgICAgb2Zmc2V0ICs9IGluY3JlbWVudDI7CiAgICAgICAgbmV4dDIgPSBzaWJsaW5nczJbb2Zmc2V0XTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5leHQyOwogIH0KICBfX25hbWUoc2libGluZywgInNpYmxpbmciKTsKfQpfX25hbWUoc2libGluZ3MsICJzaWJsaW5ncyIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2hhc3QtdXRpbC10by1odG1sQDkuMC41L25vZGVfbW9kdWxlcy9oYXN0LXV0aWwtdG8taHRtbC9saWIvb21pc3Npb24vb21pc3Npb24uanMKdmFyIG93bjEwID0ge30uaGFzT3duUHJvcGVydHk7CmZ1bmN0aW9uIG9taXNzaW9uKGhhbmRsZXJzMikgewogIHJldHVybiBvbWl0OwogIGZ1bmN0aW9uIG9taXQobm9kZTIsIGluZGV4MiwgcGFyZW50KSB7CiAgICByZXR1cm4gb3duMTAuY2FsbChoYW5kbGVyczIsIG5vZGUyLnRhZ05hbWUpICYmIGhhbmRsZXJzMltub2RlMi50YWdOYW1lXShub2RlMiwgaW5kZXgyLCBwYXJlbnQpOwogIH0KICBfX25hbWUob21pdCwgIm9taXQiKTsKfQpfX25hbWUob21pc3Npb24sICJvbWlzc2lvbiIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2hhc3QtdXRpbC10by1odG1sQDkuMC41L25vZGVfbW9kdWxlcy9oYXN0LXV0aWwtdG8taHRtbC9saWIvb21pc3Npb24vY2xvc2luZy5qcwp2YXIgY2xvc2luZyA9IG9taXNzaW9uKHsKICBib2R5LAogIGNhcHRpb246IGhlYWRPckNvbGdyb3VwT3JDYXB0aW9uLAogIGNvbGdyb3VwOiBoZWFkT3JDb2xncm91cE9yQ2FwdGlvbiwKICBkZCwKICBkdCwKICBoZWFkOiBoZWFkT3JDb2xncm91cE9yQ2FwdGlvbiwKICBodG1sOiBodG1sNSwKICBsaSwKICBvcHRncm91cCwKICBvcHRpb24sCiAgcDogcDQsCiAgcnA6IHJ1YnlFbGVtZW50LAogIHJ0OiBydWJ5RWxlbWVudCwKICB0Ym9keSwKICB0ZDogY2VsbHMsCiAgdGZvb3QsCiAgdGg6IGNlbGxzLAogIHRoZWFkLAogIHRyCn0pOwpmdW5jdGlvbiBoZWFkT3JDb2xncm91cE9yQ2FwdGlvbihfMywgaW5kZXgyLCBwYXJlbnQpIHsKICBjb25zdCBuZXh0MiA9IHNpYmxpbmdBZnRlcihwYXJlbnQsIGluZGV4MiwgdHJ1ZSk7CiAgcmV0dXJuICFuZXh0MiB8fCBuZXh0Mi50eXBlICE9PSAiY29tbWVudCIgJiYgIShuZXh0Mi50eXBlID09PSAidGV4dCIgJiYgd2hpdGVzcGFjZShuZXh0Mi52YWx1ZS5jaGFyQXQoMCkpKTsKfQpfX25hbWUoaGVhZE9yQ29sZ3JvdXBPckNhcHRpb24sICJoZWFkT3JDb2xncm91cE9yQ2FwdGlvbiIpOwpmdW5jdGlvbiBodG1sNShfMywgaW5kZXgyLCBwYXJlbnQpIHsKICBjb25zdCBuZXh0MiA9IHNpYmxpbmdBZnRlcihwYXJlbnQsIGluZGV4Mik7CiAgcmV0dXJuICFuZXh0MiB8fCBuZXh0Mi50eXBlICE9PSAiY29tbWVudCI7Cn0KX19uYW1lKGh0bWw1LCAiaHRtbCIpOwpmdW5jdGlvbiBib2R5KF8zLCBpbmRleDIsIHBhcmVudCkgewogIGNvbnN0IG5leHQyID0gc2libGluZ0FmdGVyKHBhcmVudCwgaW5kZXgyKTsKICByZXR1cm4gIW5leHQyIHx8IG5leHQyLnR5cGUgIT09ICJjb21tZW50IjsKfQpfX25hbWUoYm9keSwgImJvZHkiKTsKZnVuY3Rpb24gcDQoXzMsIGluZGV4MiwgcGFyZW50KSB7CiAgY29uc3QgbmV4dDIgPSBzaWJsaW5nQWZ0ZXIocGFyZW50LCBpbmRleDIpOwogIHJldHVybiBuZXh0MiA/IG5leHQyLnR5cGUgPT09ICJlbGVtZW50IiAmJiAobmV4dDIudGFnTmFtZSA9PT0gImFkZHJlc3MiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJhcnRpY2xlIiB8fCBuZXh0Mi50YWdOYW1lID09PSAiYXNpZGUiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJibG9ja3F1b3RlIiB8fCBuZXh0Mi50YWdOYW1lID09PSAiZGV0YWlscyIgfHwgbmV4dDIudGFnTmFtZSA9PT0gImRpdiIgfHwgbmV4dDIudGFnTmFtZSA9PT0gImRsIiB8fCBuZXh0Mi50YWdOYW1lID09PSAiZmllbGRzZXQiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJmaWdjYXB0aW9uIiB8fCBuZXh0Mi50YWdOYW1lID09PSAiZmlndXJlIiB8fCBuZXh0Mi50YWdOYW1lID09PSAiZm9vdGVyIiB8fCBuZXh0Mi50YWdOYW1lID09PSAiZm9ybSIgfHwgbmV4dDIudGFnTmFtZSA9PT0gImgxIiB8fCBuZXh0Mi50YWdOYW1lID09PSAiaDIiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJoMyIgfHwgbmV4dDIudGFnTmFtZSA9PT0gImg0IiB8fCBuZXh0Mi50YWdOYW1lID09PSAiaDUiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJoNiIgfHwgbmV4dDIudGFnTmFtZSA9PT0gImhlYWRlciIgfHwgbmV4dDIudGFnTmFtZSA9PT0gImhncm91cCIgfHwgbmV4dDIudGFnTmFtZSA9PT0gImhyIiB8fCBuZXh0Mi50YWdOYW1lID09PSAibWFpbiIgfHwgbmV4dDIudGFnTmFtZSA9PT0gIm1lbnUiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJuYXYiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJvbCIgfHwgbmV4dDIudGFnTmFtZSA9PT0gInAiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJwcmUiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJzZWN0aW9uIiB8fCBuZXh0Mi50YWdOYW1lID09PSAidGFibGUiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJ1bCIpIDogIXBhcmVudCB8fCAvLyBDb25mdXNpbmcgcGFyZW50LgogICEocGFyZW50LnR5cGUgPT09ICJlbGVtZW50IiAmJiAocGFyZW50LnRhZ05hbWUgPT09ICJhIiB8fCBwYXJlbnQudGFnTmFtZSA9PT0gImF1ZGlvIiB8fCBwYXJlbnQudGFnTmFtZSA9PT0gImRlbCIgfHwgcGFyZW50LnRhZ05hbWUgPT09ICJpbnMiIHx8IHBhcmVudC50YWdOYW1lID09PSAibWFwIiB8fCBwYXJlbnQudGFnTmFtZSA9PT0gIm5vc2NyaXB0IiB8fCBwYXJlbnQudGFnTmFtZSA9PT0gInZpZGVvIikpOwp9Cl9fbmFtZShwNCwgInAiKTsKZnVuY3Rpb24gbGkoXzMsIGluZGV4MiwgcGFyZW50KSB7CiAgY29uc3QgbmV4dDIgPSBzaWJsaW5nQWZ0ZXIocGFyZW50LCBpbmRleDIpOwogIHJldHVybiAhbmV4dDIgfHwgbmV4dDIudHlwZSA9PT0gImVsZW1lbnQiICYmIG5leHQyLnRhZ05hbWUgPT09ICJsaSI7Cn0KX19uYW1lKGxpLCAibGkiKTsKZnVuY3Rpb24gZHQoXzMsIGluZGV4MiwgcGFyZW50KSB7CiAgY29uc3QgbmV4dDIgPSBzaWJsaW5nQWZ0ZXIocGFyZW50LCBpbmRleDIpOwogIHJldHVybiBCb29sZWFuKAogICAgbmV4dDIgJiYgbmV4dDIudHlwZSA9PT0gImVsZW1lbnQiICYmIChuZXh0Mi50YWdOYW1lID09PSAiZHQiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJkZCIpCiAgKTsKfQpfX25hbWUoZHQsICJkdCIpOwpmdW5jdGlvbiBkZChfMywgaW5kZXgyLCBwYXJlbnQpIHsKICBjb25zdCBuZXh0MiA9IHNpYmxpbmdBZnRlcihwYXJlbnQsIGluZGV4Mik7CiAgcmV0dXJuICFuZXh0MiB8fCBuZXh0Mi50eXBlID09PSAiZWxlbWVudCIgJiYgKG5leHQyLnRhZ05hbWUgPT09ICJkdCIgfHwgbmV4dDIudGFnTmFtZSA9PT0gImRkIik7Cn0KX19uYW1lKGRkLCAiZGQiKTsKZnVuY3Rpb24gcnVieUVsZW1lbnQoXzMsIGluZGV4MiwgcGFyZW50KSB7CiAgY29uc3QgbmV4dDIgPSBzaWJsaW5nQWZ0ZXIocGFyZW50LCBpbmRleDIpOwogIHJldHVybiAhbmV4dDIgfHwgbmV4dDIudHlwZSA9PT0gImVsZW1lbnQiICYmIChuZXh0Mi50YWdOYW1lID09PSAicnAiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJydCIpOwp9Cl9fbmFtZShydWJ5RWxlbWVudCwgInJ1YnlFbGVtZW50Iik7CmZ1bmN0aW9uIG9wdGdyb3VwKF8zLCBpbmRleDIsIHBhcmVudCkgewogIGNvbnN0IG5leHQyID0gc2libGluZ0FmdGVyKHBhcmVudCwgaW5kZXgyKTsKICByZXR1cm4gIW5leHQyIHx8IG5leHQyLnR5cGUgPT09ICJlbGVtZW50IiAmJiBuZXh0Mi50YWdOYW1lID09PSAib3B0Z3JvdXAiOwp9Cl9fbmFtZShvcHRncm91cCwgIm9wdGdyb3VwIik7CmZ1bmN0aW9uIG9wdGlvbihfMywgaW5kZXgyLCBwYXJlbnQpIHsKICBjb25zdCBuZXh0MiA9IHNpYmxpbmdBZnRlcihwYXJlbnQsIGluZGV4Mik7CiAgcmV0dXJuICFuZXh0MiB8fCBuZXh0Mi50eXBlID09PSAiZWxlbWVudCIgJiYgKG5leHQyLnRhZ05hbWUgPT09ICJvcHRpb24iIHx8IG5leHQyLnRhZ05hbWUgPT09ICJvcHRncm91cCIpOwp9Cl9fbmFtZShvcHRpb24sICJvcHRpb24iKTsKZnVuY3Rpb24gdGhlYWQoXzMsIGluZGV4MiwgcGFyZW50KSB7CiAgY29uc3QgbmV4dDIgPSBzaWJsaW5nQWZ0ZXIocGFyZW50LCBpbmRleDIpOwogIHJldHVybiBCb29sZWFuKAogICAgbmV4dDIgJiYgbmV4dDIudHlwZSA9PT0gImVsZW1lbnQiICYmIChuZXh0Mi50YWdOYW1lID09PSAidGJvZHkiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJ0Zm9vdCIpCiAgKTsKfQpfX25hbWUodGhlYWQsICJ0aGVhZCIpOwpmdW5jdGlvbiB0Ym9keShfMywgaW5kZXgyLCBwYXJlbnQpIHsKICBjb25zdCBuZXh0MiA9IHNpYmxpbmdBZnRlcihwYXJlbnQsIGluZGV4Mik7CiAgcmV0dXJuICFuZXh0MiB8fCBuZXh0Mi50eXBlID09PSAiZWxlbWVudCIgJiYgKG5leHQyLnRhZ05hbWUgPT09ICJ0Ym9keSIgfHwgbmV4dDIudGFnTmFtZSA9PT0gInRmb290Iik7Cn0KX19uYW1lKHRib2R5LCAidGJvZHkiKTsKZnVuY3Rpb24gdGZvb3QoXzMsIGluZGV4MiwgcGFyZW50KSB7CiAgcmV0dXJuICFzaWJsaW5nQWZ0ZXIocGFyZW50LCBpbmRleDIpOwp9Cl9fbmFtZSh0Zm9vdCwgInRmb290Iik7CmZ1bmN0aW9uIHRyKF8zLCBpbmRleDIsIHBhcmVudCkgewogIGNvbnN0IG5leHQyID0gc2libGluZ0FmdGVyKHBhcmVudCwgaW5kZXgyKTsKICByZXR1cm4gIW5leHQyIHx8IG5leHQyLnR5cGUgPT09ICJlbGVtZW50IiAmJiBuZXh0Mi50YWdOYW1lID09PSAidHIiOwp9Cl9fbmFtZSh0ciwgInRyIik7CmZ1bmN0aW9uIGNlbGxzKF8zLCBpbmRleDIsIHBhcmVudCkgewogIGNvbnN0IG5leHQyID0gc2libGluZ0FmdGVyKHBhcmVudCwgaW5kZXgyKTsKICByZXR1cm4gIW5leHQyIHx8IG5leHQyLnR5cGUgPT09ICJlbGVtZW50IiAmJiAobmV4dDIudGFnTmFtZSA9PT0gInRkIiB8fCBuZXh0Mi50YWdOYW1lID09PSAidGgiKTsKfQpfX25hbWUoY2VsbHMsICJjZWxscyIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2hhc3QtdXRpbC10by1odG1sQDkuMC41L25vZGVfbW9kdWxlcy9oYXN0LXV0aWwtdG8taHRtbC9saWIvb21pc3Npb24vb3BlbmluZy5qcwp2YXIgb3BlbmluZyA9IG9taXNzaW9uKHsKICBib2R5OiBib2R5MiwKICBjb2xncm91cCwKICBoZWFkLAogIGh0bWw6IGh0bWw2LAogIHRib2R5OiB0Ym9keTIKfSk7CmZ1bmN0aW9uIGh0bWw2KG5vZGUyKSB7CiAgY29uc3QgaGVhZDIgPSBzaWJsaW5nQWZ0ZXIobm9kZTIsIC0xKTsKICByZXR1cm4gIWhlYWQyIHx8IGhlYWQyLnR5cGUgIT09ICJjb21tZW50IjsKfQpfX25hbWUoaHRtbDYsICJodG1sIik7CmZ1bmN0aW9uIGhlYWQobm9kZTIpIHsKICBjb25zdCBzZWVuID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTsKICBmb3IgKGNvbnN0IGNoaWxkMiBvZiBub2RlMi5jaGlsZHJlbikgewogICAgaWYgKGNoaWxkMi50eXBlID09PSAiZWxlbWVudCIgJiYgKGNoaWxkMi50YWdOYW1lID09PSAiYmFzZSIgfHwgY2hpbGQyLnRhZ05hbWUgPT09ICJ0aXRsZSIpKSB7CiAgICAgIGlmIChzZWVuLmhhcyhjaGlsZDIudGFnTmFtZSkpIHJldHVybiBmYWxzZTsKICAgICAgc2Vlbi5hZGQoY2hpbGQyLnRhZ05hbWUpOwogICAgfQogIH0KICBjb25zdCBjaGlsZCA9IG5vZGUyLmNoaWxkcmVuWzBdOwogIHJldHVybiAhY2hpbGQgfHwgY2hpbGQudHlwZSA9PT0gImVsZW1lbnQiOwp9Cl9fbmFtZShoZWFkLCAiaGVhZCIpOwpmdW5jdGlvbiBib2R5Mihub2RlMikgewogIGNvbnN0IGhlYWQyID0gc2libGluZ0FmdGVyKG5vZGUyLCAtMSwgdHJ1ZSk7CiAgcmV0dXJuICFoZWFkMiB8fCBoZWFkMi50eXBlICE9PSAiY29tbWVudCIgJiYgIShoZWFkMi50eXBlID09PSAidGV4dCIgJiYgd2hpdGVzcGFjZShoZWFkMi52YWx1ZS5jaGFyQXQoMCkpKSAmJiAhKGhlYWQyLnR5cGUgPT09ICJlbGVtZW50IiAmJiAoaGVhZDIudGFnTmFtZSA9PT0gIm1ldGEiIHx8IGhlYWQyLnRhZ05hbWUgPT09ICJsaW5rIiB8fCBoZWFkMi50YWdOYW1lID09PSAic2NyaXB0IiB8fCBoZWFkMi50YWdOYW1lID09PSAic3R5bGUiIHx8IGhlYWQyLnRhZ05hbWUgPT09ICJ0ZW1wbGF0ZSIpKTsKfQpfX25hbWUoYm9keTIsICJib2R5Iik7CmZ1bmN0aW9uIGNvbGdyb3VwKG5vZGUyLCBpbmRleDIsIHBhcmVudCkgewogIGNvbnN0IHByZXZpb3VzMyA9IHNpYmxpbmdCZWZvcmUocGFyZW50LCBpbmRleDIpOwogIGNvbnN0IGhlYWQyID0gc2libGluZ0FmdGVyKG5vZGUyLCAtMSwgdHJ1ZSk7CiAgaWYgKHBhcmVudCAmJiBwcmV2aW91czMgJiYgcHJldmlvdXMzLnR5cGUgPT09ICJlbGVtZW50IiAmJiBwcmV2aW91czMudGFnTmFtZSA9PT0gImNvbGdyb3VwIiAmJiBjbG9zaW5nKHByZXZpb3VzMywgcGFyZW50LmNoaWxkcmVuLmluZGV4T2YocHJldmlvdXMzKSwgcGFyZW50KSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICByZXR1cm4gQm9vbGVhbihoZWFkMiAmJiBoZWFkMi50eXBlID09PSAiZWxlbWVudCIgJiYgaGVhZDIudGFnTmFtZSA9PT0gImNvbCIpOwp9Cl9fbmFtZShjb2xncm91cCwgImNvbGdyb3VwIik7CmZ1bmN0aW9uIHRib2R5Mihub2RlMiwgaW5kZXgyLCBwYXJlbnQpIHsKICBjb25zdCBwcmV2aW91czMgPSBzaWJsaW5nQmVmb3JlKHBhcmVudCwgaW5kZXgyKTsKICBjb25zdCBoZWFkMiA9IHNpYmxpbmdBZnRlcihub2RlMiwgLTEpOwogIGlmIChwYXJlbnQgJiYgcHJldmlvdXMzICYmIHByZXZpb3VzMy50eXBlID09PSAiZWxlbWVudCIgJiYgKHByZXZpb3VzMy50YWdOYW1lID09PSAidGhlYWQiIHx8IHByZXZpb3VzMy50YWdOYW1lID09PSAidGJvZHkiKSAmJiBjbG9zaW5nKHByZXZpb3VzMywgcGFyZW50LmNoaWxkcmVuLmluZGV4T2YocHJldmlvdXMzKSwgcGFyZW50KSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICByZXR1cm4gQm9vbGVhbihoZWFkMiAmJiBoZWFkMi50eXBlID09PSAiZWxlbWVudCIgJiYgaGVhZDIudGFnTmFtZSA9PT0gInRyIik7Cn0KX19uYW1lKHRib2R5MiwgInRib2R5Iik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vaGFzdC11dGlsLXRvLWh0bWxAOS4wLjUvbm9kZV9tb2R1bGVzL2hhc3QtdXRpbC10by1odG1sL2xpYi9oYW5kbGUvZWxlbWVudC5qcwp2YXIgY29uc3RhbnRzID0gewogIC8vIFNlZTogPGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI2F0dHJpYnV0ZS1uYW1lLXN0YXRlPi4KICBuYW1lOiBbCiAgICBbIglcblxmXHIgJi89PiIuc3BsaXQoIiIpLCAiCVxuXGZcciBcIiYnLz0+YCIuc3BsaXQoIiIpXSwKICAgIFtgXDAJClxmXHIgIiYnLzw9PmAuc3BsaXQoIiIpLCAiXDAJXG5cZlxyIFwiJicvPD0+YCIuc3BsaXQoIiIpXQogIF0sCiAgLy8gU2VlOiA8aHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jYXR0cmlidXRlLXZhbHVlLSh1bnF1b3RlZCktc3RhdGU+LgogIHVucXVvdGVkOiBbCiAgICBbIglcblxmXHIgJj4iLnNwbGl0KCIiKSwgIlwwCVxuXGZcciBcIiYnPD0+YCIuc3BsaXQoIiIpXSwKICAgIFsiXDAJXG5cZlxyIFwiJic8PT5gIi5zcGxpdCgiIiksICJcMAlcblxmXHIgXCImJzw9PmAiLnNwbGl0KCIiKV0KICBdLAogIC8vIFNlZTogPGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI2F0dHJpYnV0ZS12YWx1ZS0oc2luZ2xlLXF1b3RlZCktc3RhdGU+LgogIHNpbmdsZTogWwogICAgWyImJyIuc3BsaXQoIiIpLCAiXCImJ2AiLnNwbGl0KCIiKV0sCiAgICBbIlwwJiciLnNwbGl0KCIiKSwgIlwwXCImJ2AiLnNwbGl0KCIiKV0KICBdLAogIC8vIFNlZTogPGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI2F0dHJpYnV0ZS12YWx1ZS0oZG91YmxlLXF1b3RlZCktc3RhdGU+LgogIGRvdWJsZTogWwogICAgWyciJicuc3BsaXQoIiIpLCAiXCImJ2AiLnNwbGl0KCIiKV0sCiAgICBbJ1wwIiYnLnNwbGl0KCIiKSwgIlwwXCImJ2AiLnNwbGl0KCIiKV0KICBdCn07CmZ1bmN0aW9uIGVsZW1lbnQzKG5vZGUyLCBpbmRleDIsIHBhcmVudCwgc3RhdGUpIHsKICBjb25zdCBzY2hlbWEgPSBzdGF0ZS5zY2hlbWE7CiAgY29uc3Qgb21pdCA9IHNjaGVtYS5zcGFjZSA9PT0gInN2ZyIgPyBmYWxzZSA6IHN0YXRlLnNldHRpbmdzLm9taXRPcHRpb25hbFRhZ3M7CiAgbGV0IHNlbGZDbG9zaW5nID0gc2NoZW1hLnNwYWNlID09PSAic3ZnIiA/IHN0YXRlLnNldHRpbmdzLmNsb3NlRW1wdHlFbGVtZW50cyA6IHN0YXRlLnNldHRpbmdzLnZvaWRzLmluY2x1ZGVzKG5vZGUyLnRhZ05hbWUudG9Mb3dlckNhc2UoKSk7CiAgY29uc3QgcGFydHMgPSBbXTsKICBsZXQgbGFzdDM7CiAgaWYgKHNjaGVtYS5zcGFjZSA9PT0gImh0bWwiICYmIG5vZGUyLnRhZ05hbWUgPT09ICJzdmciKSB7CiAgICBzdGF0ZS5zY2hlbWEgPSBzdmcyOwogIH0KICBjb25zdCBhdHRyaWJ1dGVzID0gc2VyaWFsaXplQXR0cmlidXRlcyhzdGF0ZSwgbm9kZTIucHJvcGVydGllcyk7CiAgY29uc3QgY29udGVudDMgPSBzdGF0ZS5hbGwoCiAgICBzY2hlbWEuc3BhY2UgPT09ICJodG1sIiAmJiBub2RlMi50YWdOYW1lID09PSAidGVtcGxhdGUiID8gbm9kZTIuY29udGVudCA6IG5vZGUyCiAgKTsKICBzdGF0ZS5zY2hlbWEgPSBzY2hlbWE7CiAgaWYgKGNvbnRlbnQzKSBzZWxmQ2xvc2luZyA9IGZhbHNlOwogIGlmIChhdHRyaWJ1dGVzIHx8ICFvbWl0IHx8ICFvcGVuaW5nKG5vZGUyLCBpbmRleDIsIHBhcmVudCkpIHsKICAgIHBhcnRzLnB1c2goIjwiLCBub2RlMi50YWdOYW1lLCBhdHRyaWJ1dGVzID8gIiAiICsgYXR0cmlidXRlcyA6ICIiKTsKICAgIGlmIChzZWxmQ2xvc2luZyAmJiAoc2NoZW1hLnNwYWNlID09PSAic3ZnIiB8fCBzdGF0ZS5zZXR0aW5ncy5jbG9zZVNlbGZDbG9zaW5nKSkgewogICAgICBsYXN0MyA9IGF0dHJpYnV0ZXMuY2hhckF0KGF0dHJpYnV0ZXMubGVuZ3RoIC0gMSk7CiAgICAgIGlmICghc3RhdGUuc2V0dGluZ3MudGlnaHRTZWxmQ2xvc2luZyB8fCBsYXN0MyA9PT0gIi8iIHx8IGxhc3QzICYmIGxhc3QzICE9PSAnIicgJiYgbGFzdDMgIT09ICInIikgewogICAgICAgIHBhcnRzLnB1c2goIiAiKTsKICAgICAgfQogICAgICBwYXJ0cy5wdXNoKCIvIik7CiAgICB9CiAgICBwYXJ0cy5wdXNoKCI+Iik7CiAgfQogIHBhcnRzLnB1c2goY29udGVudDMpOwogIGlmICghc2VsZkNsb3NpbmcgJiYgKCFvbWl0IHx8ICFjbG9zaW5nKG5vZGUyLCBpbmRleDIsIHBhcmVudCkpKSB7CiAgICBwYXJ0cy5wdXNoKCI8LyIgKyBub2RlMi50YWdOYW1lICsgIj4iKTsKICB9CiAgcmV0dXJuIHBhcnRzLmpvaW4oIiIpOwp9Cl9fbmFtZShlbGVtZW50MywgImVsZW1lbnQiKTsKZnVuY3Rpb24gc2VyaWFsaXplQXR0cmlidXRlcyhzdGF0ZSwgcHJvcGVydGllczIpIHsKICBjb25zdCB2YWx1ZXMgPSBbXTsKICBsZXQgaW5kZXgyID0gLTE7CiAgbGV0IGtleTI7CiAgaWYgKHByb3BlcnRpZXMyKSB7CiAgICBmb3IgKGtleTIgaW4gcHJvcGVydGllczIpIHsKICAgICAgaWYgKHByb3BlcnRpZXMyW2tleTJdICE9PSBudWxsICYmIHByb3BlcnRpZXMyW2tleTJdICE9PSB2b2lkIDApIHsKICAgICAgICBjb25zdCB2YWx1ZTIgPSBzZXJpYWxpemVBdHRyaWJ1dGUoc3RhdGUsIGtleTIsIHByb3BlcnRpZXMyW2tleTJdKTsKICAgICAgICBpZiAodmFsdWUyKSB2YWx1ZXMucHVzaCh2YWx1ZTIpOwogICAgICB9CiAgICB9CiAgfQogIHdoaWxlICgrK2luZGV4MiA8IHZhbHVlcy5sZW5ndGgpIHsKICAgIGNvbnN0IGxhc3QzID0gc3RhdGUuc2V0dGluZ3MudGlnaHRBdHRyaWJ1dGVzID8gdmFsdWVzW2luZGV4Ml0uY2hhckF0KHZhbHVlc1tpbmRleDJdLmxlbmd0aCAtIDEpIDogdm9pZCAwOwogICAgaWYgKGluZGV4MiAhPT0gdmFsdWVzLmxlbmd0aCAtIDEgJiYgbGFzdDMgIT09ICciJyAmJiBsYXN0MyAhPT0gIiciKSB7CiAgICAgIHZhbHVlc1tpbmRleDJdICs9ICIgIjsKICAgIH0KICB9CiAgcmV0dXJuIHZhbHVlcy5qb2luKCIiKTsKfQpfX25hbWUoc2VyaWFsaXplQXR0cmlidXRlcywgInNlcmlhbGl6ZUF0dHJpYnV0ZXMiKTsKZnVuY3Rpb24gc2VyaWFsaXplQXR0cmlidXRlKHN0YXRlLCBrZXkyLCB2YWx1ZTIpIHsKICBjb25zdCBpbmZvID0gZmluZDIoc3RhdGUuc2NoZW1hLCBrZXkyKTsKICBjb25zdCB4MyA9IHN0YXRlLnNldHRpbmdzLmFsbG93UGFyc2VFcnJvcnMgJiYgc3RhdGUuc2NoZW1hLnNwYWNlID09PSAiaHRtbCIgPyAwIDogMTsKICBjb25zdCB5MyA9IHN0YXRlLnNldHRpbmdzLmFsbG93RGFuZ2Vyb3VzQ2hhcmFjdGVycyA/IDAgOiAxOwogIGxldCBxdW90ZSA9IHN0YXRlLnF1b3RlOwogIGxldCByZXN1bHQ7CiAgaWYgKGluZm8ub3ZlcmxvYWRlZEJvb2xlYW4gJiYgKHZhbHVlMiA9PT0gaW5mby5hdHRyaWJ1dGUgfHwgdmFsdWUyID09PSAiIikpIHsKICAgIHZhbHVlMiA9IHRydWU7CiAgfSBlbHNlIGlmICgoaW5mby5ib29sZWFuIHx8IGluZm8ub3ZlcmxvYWRlZEJvb2xlYW4pICYmICh0eXBlb2YgdmFsdWUyICE9PSAic3RyaW5nIiB8fCB2YWx1ZTIgPT09IGluZm8uYXR0cmlidXRlIHx8IHZhbHVlMiA9PT0gIiIpKSB7CiAgICB2YWx1ZTIgPSBCb29sZWFuKHZhbHVlMik7CiAgfQogIGlmICh2YWx1ZTIgPT09IG51bGwgfHwgdmFsdWUyID09PSB2b2lkIDAgfHwgdmFsdWUyID09PSBmYWxzZSB8fCB0eXBlb2YgdmFsdWUyID09PSAibnVtYmVyIiAmJiBOdW1iZXIuaXNOYU4odmFsdWUyKSkgewogICAgcmV0dXJuICIiOwogIH0KICBjb25zdCBuYW1lID0gc3RyaW5naWZ5RW50aXRpZXMoCiAgICBpbmZvLmF0dHJpYnV0ZSwKICAgIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnNldHRpbmdzLmNoYXJhY3RlclJlZmVyZW5jZXMsIHsKICAgICAgLy8gQWx3YXlzIGVuY29kZSB3aXRob3V0IHBhcnNlIGVycm9ycyBpbiBub24tSFRNTC4KICAgICAgc3Vic2V0OiBjb25zdGFudHMubmFtZVt4M11beTNdCiAgICB9KQogICk7CiAgaWYgKHZhbHVlMiA9PT0gdHJ1ZSkgcmV0dXJuIG5hbWU7CiAgdmFsdWUyID0gQXJyYXkuaXNBcnJheSh2YWx1ZTIpID8gKGluZm8uY29tbWFTZXBhcmF0ZWQgPyBzdHJpbmdpZnkzIDogc3RyaW5naWZ5NCkodmFsdWUyLCB7CiAgICBwYWRMZWZ0OiAhc3RhdGUuc2V0dGluZ3MudGlnaHRDb21tYVNlcGFyYXRlZExpc3RzCiAgfSkgOiBTdHJpbmcodmFsdWUyKTsKICBpZiAoc3RhdGUuc2V0dGluZ3MuY29sbGFwc2VFbXB0eUF0dHJpYnV0ZXMgJiYgIXZhbHVlMikgcmV0dXJuIG5hbWU7CiAgaWYgKHN0YXRlLnNldHRpbmdzLnByZWZlclVucXVvdGVkKSB7CiAgICByZXN1bHQgPSBzdHJpbmdpZnlFbnRpdGllcygKICAgICAgdmFsdWUyLAogICAgICBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5zZXR0aW5ncy5jaGFyYWN0ZXJSZWZlcmVuY2VzLCB7CiAgICAgICAgYXR0cmlidXRlOiB0cnVlLAogICAgICAgIHN1YnNldDogY29uc3RhbnRzLnVucXVvdGVkW3gzXVt5M10KICAgICAgfSkKICAgICk7CiAgfQogIGlmIChyZXN1bHQgIT09IHZhbHVlMikgewogICAgaWYgKHN0YXRlLnNldHRpbmdzLnF1b3RlU21hcnQgJiYgY2NvdW50KHZhbHVlMiwgcXVvdGUpID4gY2NvdW50KHZhbHVlMiwgc3RhdGUuYWx0ZXJuYXRpdmUpKSB7CiAgICAgIHF1b3RlID0gc3RhdGUuYWx0ZXJuYXRpdmU7CiAgICB9CiAgICByZXN1bHQgPSBxdW90ZSArIHN0cmluZ2lmeUVudGl0aWVzKAogICAgICB2YWx1ZTIsCiAgICAgIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnNldHRpbmdzLmNoYXJhY3RlclJlZmVyZW5jZXMsIHsKICAgICAgICAvLyBBbHdheXMgZW5jb2RlIHdpdGhvdXQgcGFyc2UgZXJyb3JzIGluIG5vbi1IVE1MLgogICAgICAgIHN1YnNldDogKHF1b3RlID09PSAiJyIgPyBjb25zdGFudHMuc2luZ2xlIDogY29uc3RhbnRzLmRvdWJsZSlbeDNdW3kzXSwKICAgICAgICBhdHRyaWJ1dGU6IHRydWUKICAgICAgfSkKICAgICkgKyBxdW90ZTsKICB9CiAgcmV0dXJuIG5hbWUgKyAocmVzdWx0ID8gIj0iICsgcmVzdWx0IDogcmVzdWx0KTsKfQpfX25hbWUoc2VyaWFsaXplQXR0cmlidXRlLCAic2VyaWFsaXplQXR0cmlidXRlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vaGFzdC11dGlsLXRvLWh0bWxAOS4wLjUvbm9kZV9tb2R1bGVzL2hhc3QtdXRpbC10by1odG1sL2xpYi9oYW5kbGUvdGV4dC5qcwp2YXIgdGV4dEVudGl0eVN1YnNldCA9IFsiPCIsICImIl07CmZ1bmN0aW9uIHRleHQ3KG5vZGUyLCBfMywgcGFyZW50LCBzdGF0ZSkgewogIHJldHVybiBwYXJlbnQgJiYgcGFyZW50LnR5cGUgPT09ICJlbGVtZW50IiAmJiAocGFyZW50LnRhZ05hbWUgPT09ICJzY3JpcHQiIHx8IHBhcmVudC50YWdOYW1lID09PSAic3R5bGUiKSA/IG5vZGUyLnZhbHVlIDogc3RyaW5naWZ5RW50aXRpZXMoCiAgICBub2RlMi52YWx1ZSwKICAgIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnNldHRpbmdzLmNoYXJhY3RlclJlZmVyZW5jZXMsIHsKICAgICAgc3Vic2V0OiB0ZXh0RW50aXR5U3Vic2V0CiAgICB9KQogICk7Cn0KX19uYW1lKHRleHQ3LCAidGV4dCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2hhc3QtdXRpbC10by1odG1sQDkuMC41L25vZGVfbW9kdWxlcy9oYXN0LXV0aWwtdG8taHRtbC9saWIvaGFuZGxlL3Jhdy5qcwpmdW5jdGlvbiByYXcobm9kZTIsIGluZGV4MiwgcGFyZW50LCBzdGF0ZSkgewogIHJldHVybiBzdGF0ZS5zZXR0aW5ncy5hbGxvd0Rhbmdlcm91c0h0bWwgPyBub2RlMi52YWx1ZSA6IHRleHQ3KG5vZGUyLCBpbmRleDIsIHBhcmVudCwgc3RhdGUpOwp9Cl9fbmFtZShyYXcsICJyYXciKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9oYXN0LXV0aWwtdG8taHRtbEA5LjAuNS9ub2RlX21vZHVsZXMvaGFzdC11dGlsLXRvLWh0bWwvbGliL2hhbmRsZS9yb290LmpzCmZ1bmN0aW9uIHJvb3Q0KG5vZGUyLCBfMSwgXzIyLCBzdGF0ZSkgewogIHJldHVybiBzdGF0ZS5hbGwobm9kZTIpOwp9Cl9fbmFtZShyb290NCwgInJvb3QiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9oYXN0LXV0aWwtdG8taHRtbEA5LjAuNS9ub2RlX21vZHVsZXMvaGFzdC11dGlsLXRvLWh0bWwvbGliL2hhbmRsZS9pbmRleC5qcwp2YXIgaGFuZGxlMiA9IHp3aXRjaCgidHlwZSIsIHsKICBpbnZhbGlkOiBpbnZhbGlkMiwKICB1bmtub3duOiB1bmtub3duMiwKICBoYW5kbGVyczogeyBjb21tZW50OiBjb21tZW50MiwgZG9jdHlwZTogZG9jdHlwZTIsIGVsZW1lbnQ6IGVsZW1lbnQzLCByYXcsIHJvb3Q6IHJvb3Q0LCB0ZXh0OiB0ZXh0NyB9Cn0pOwpmdW5jdGlvbiBpbnZhbGlkMihub2RlMikgewogIHRocm93IG5ldyBFcnJvcigiRXhwZWN0ZWQgbm9kZSwgbm90IGAiICsgbm9kZTIgKyAiYCIpOwp9Cl9fbmFtZShpbnZhbGlkMiwgImludmFsaWQiKTsKZnVuY3Rpb24gdW5rbm93bjIobm9kZV8pIHsKICBjb25zdCBub2RlMiA9ICgKICAgIC8qKiBAdHlwZSB7Tm9kZXN9ICovCiAgICBub2RlXwogICk7CiAgdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgY29tcGlsZSB1bmtub3duIG5vZGUgYCIgKyBub2RlMi50eXBlICsgImAiKTsKfQpfX25hbWUodW5rbm93bjIsICJ1bmtub3duIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vaGFzdC11dGlsLXRvLWh0bWxAOS4wLjUvbm9kZV9tb2R1bGVzL2hhc3QtdXRpbC10by1odG1sL2xpYi9pbmRleC5qcwp2YXIgZW1wdHlPcHRpb25zNiA9IHt9Owp2YXIgZW1wdHlDaGFyYWN0ZXJSZWZlcmVuY2VzID0ge307CnZhciBlbXB0eUNoaWxkcmVuMiA9IFtdOwpmdW5jdGlvbiB0b0h0bWwodHJlZSwgb3B0aW9ucykgewogIGNvbnN0IG9wdGlvbnNfID0gb3B0aW9ucyB8fCBlbXB0eU9wdGlvbnM2OwogIGNvbnN0IHF1b3RlID0gb3B0aW9uc18ucXVvdGUgfHwgJyInOwogIGNvbnN0IGFsdGVybmF0aXZlID0gcXVvdGUgPT09ICciJyA/ICInIiA6ICciJzsKICBpZiAocXVvdGUgIT09ICciJyAmJiBxdW90ZSAhPT0gIiciKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgcXVvdGUgYCIgKyBxdW90ZSArICJgLCBleHBlY3RlZCBgJ2Agb3IgYFwiYCIpOwogIH0KICBjb25zdCBzdGF0ZSA9IHsKICAgIG9uZTogb25lMiwKICAgIGFsbDogYWxsMiwKICAgIHNldHRpbmdzOiB7CiAgICAgIG9taXRPcHRpb25hbFRhZ3M6IG9wdGlvbnNfLm9taXRPcHRpb25hbFRhZ3MgfHwgZmFsc2UsCiAgICAgIGFsbG93UGFyc2VFcnJvcnM6IG9wdGlvbnNfLmFsbG93UGFyc2VFcnJvcnMgfHwgZmFsc2UsCiAgICAgIGFsbG93RGFuZ2Vyb3VzQ2hhcmFjdGVyczogb3B0aW9uc18uYWxsb3dEYW5nZXJvdXNDaGFyYWN0ZXJzIHx8IGZhbHNlLAogICAgICBxdW90ZVNtYXJ0OiBvcHRpb25zXy5xdW90ZVNtYXJ0IHx8IGZhbHNlLAogICAgICBwcmVmZXJVbnF1b3RlZDogb3B0aW9uc18ucHJlZmVyVW5xdW90ZWQgfHwgZmFsc2UsCiAgICAgIHRpZ2h0QXR0cmlidXRlczogb3B0aW9uc18udGlnaHRBdHRyaWJ1dGVzIHx8IGZhbHNlLAogICAgICB1cHBlckRvY3R5cGU6IG9wdGlvbnNfLnVwcGVyRG9jdHlwZSB8fCBmYWxzZSwKICAgICAgdGlnaHREb2N0eXBlOiBvcHRpb25zXy50aWdodERvY3R5cGUgfHwgZmFsc2UsCiAgICAgIGJvZ3VzQ29tbWVudHM6IG9wdGlvbnNfLmJvZ3VzQ29tbWVudHMgfHwgZmFsc2UsCiAgICAgIHRpZ2h0Q29tbWFTZXBhcmF0ZWRMaXN0czogb3B0aW9uc18udGlnaHRDb21tYVNlcGFyYXRlZExpc3RzIHx8IGZhbHNlLAogICAgICB0aWdodFNlbGZDbG9zaW5nOiBvcHRpb25zXy50aWdodFNlbGZDbG9zaW5nIHx8IGZhbHNlLAogICAgICBjb2xsYXBzZUVtcHR5QXR0cmlidXRlczogb3B0aW9uc18uY29sbGFwc2VFbXB0eUF0dHJpYnV0ZXMgfHwgZmFsc2UsCiAgICAgIGFsbG93RGFuZ2Vyb3VzSHRtbDogb3B0aW9uc18uYWxsb3dEYW5nZXJvdXNIdG1sIHx8IGZhbHNlLAogICAgICB2b2lkczogb3B0aW9uc18udm9pZHMgfHwgaHRtbFZvaWRFbGVtZW50cywKICAgICAgY2hhcmFjdGVyUmVmZXJlbmNlczogb3B0aW9uc18uY2hhcmFjdGVyUmVmZXJlbmNlcyB8fCBlbXB0eUNoYXJhY3RlclJlZmVyZW5jZXMsCiAgICAgIGNsb3NlU2VsZkNsb3Npbmc6IG9wdGlvbnNfLmNsb3NlU2VsZkNsb3NpbmcgfHwgZmFsc2UsCiAgICAgIGNsb3NlRW1wdHlFbGVtZW50czogb3B0aW9uc18uY2xvc2VFbXB0eUVsZW1lbnRzIHx8IGZhbHNlCiAgICB9LAogICAgc2NoZW1hOiBvcHRpb25zXy5zcGFjZSA9PT0gInN2ZyIgPyBzdmcyIDogaHRtbDQsCiAgICBxdW90ZSwKICAgIGFsdGVybmF0aXZlCiAgfTsKICByZXR1cm4gc3RhdGUub25lKAogICAgQXJyYXkuaXNBcnJheSh0cmVlKSA/IHsgdHlwZTogInJvb3QiLCBjaGlsZHJlbjogdHJlZSB9IDogdHJlZSwKICAgIHZvaWQgMCwKICAgIHZvaWQgMAogICk7Cn0KX19uYW1lKHRvSHRtbCwgInRvSHRtbCIpOwpmdW5jdGlvbiBvbmUyKG5vZGUyLCBpbmRleDIsIHBhcmVudCkgewogIHJldHVybiBoYW5kbGUyKG5vZGUyLCBpbmRleDIsIHBhcmVudCwgdGhpcyk7Cn0KX19uYW1lKG9uZTIsICJvbmUiKTsKZnVuY3Rpb24gYWxsMihwYXJlbnQpIHsKICBjb25zdCByZXN1bHRzID0gW107CiAgY29uc3QgY2hpbGRyZW4yID0gcGFyZW50ICYmIHBhcmVudC5jaGlsZHJlbiB8fCBlbXB0eUNoaWxkcmVuMjsKICBsZXQgaW5kZXgyID0gLTE7CiAgd2hpbGUgKCsraW5kZXgyIDwgY2hpbGRyZW4yLmxlbmd0aCkgewogICAgcmVzdWx0c1tpbmRleDJdID0gdGhpcy5vbmUoY2hpbGRyZW4yW2luZGV4Ml0sIGluZGV4MiwgcGFyZW50KTsKICB9CiAgcmV0dXJuIHJlc3VsdHMuam9pbigiIik7Cn0KX19uYW1lKGFsbDIsICJhbGwiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yZW1hcmstaHRtbEAxNi4wLjEvbm9kZV9tb2R1bGVzL3JlbWFyay1odG1sL2xpYi9pbmRleC5qcwp2YXIgZW1wdHlPcHRpb25zNyA9IHt9OwpmdW5jdGlvbiByZW1hcmtIdG1sKG9wdGlvbnMpIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgY29uc3QgeyBoYW5kbGVyczogaGFuZGxlcnMyLCBzYW5pdGl6ZTogY2xlYW4sIC4uLnRvSHRtbE9wdGlvbnMgfSA9IG9wdGlvbnMgfHwgZW1wdHlPcHRpb25zNzsKICBsZXQgYWxsb3dEYW5nZXJvdXNIdG1sID0gZmFsc2U7CiAgbGV0IHNjaGVtYTsKICBpZiAodHlwZW9mIGNsZWFuID09PSAiYm9vbGVhbiIpIHsKICAgIGFsbG93RGFuZ2Vyb3VzSHRtbCA9ICFjbGVhbjsKICB9IGVsc2UgaWYgKGNsZWFuKSB7CiAgICBzY2hlbWEgPSBjbGVhbjsKICB9CiAgc2VsZjIuY29tcGlsZXIgPSBjb21waWxlcjI7CiAgZnVuY3Rpb24gY29tcGlsZXIyKHRyZWUsIGZpbGUpIHsKICAgIGNvbnN0IGhhc3QgPSB0b0hhc3QodHJlZSwgeyBoYW5kbGVyczogaGFuZGxlcnMyLCBhbGxvd0Rhbmdlcm91c0h0bWwgfSk7CiAgICBjb25zdCBzYWZlSGFzdCA9IGFsbG93RGFuZ2Vyb3VzSHRtbCA/IGhhc3QgOiBzYW5pdGl6ZShoYXN0LCBzY2hlbWEpOwogICAgY29uc3QgcmVzdWx0ID0gdG9IdG1sKHNhZmVIYXN0LCB7IC4uLnRvSHRtbE9wdGlvbnMsIGFsbG93RGFuZ2Vyb3VzSHRtbCB9KTsKICAgIGlmIChmaWxlLmV4dG5hbWUpIHsKICAgICAgZmlsZS5leHRuYW1lID0gIi5odG1sIjsKICAgIH0KICAgIHJldHVybiB0cmVlICYmIHRyZWUudHlwZSA9PT0gInJvb3QiICYmIHJlc3VsdCAmJiAvW15cclxuXS8udGVzdChyZXN1bHQuY2hhckF0KHJlc3VsdC5sZW5ndGggLSAxKSkgPyByZXN1bHQgKyAiXG4iIDogcmVzdWx0OwogIH0KICBfX25hbWUoY29tcGlsZXIyLCAiY29tcGlsZXIiKTsKfQpfX25hbWUocmVtYXJrSHRtbCwgInJlbWFya0h0bWwiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yZW1hcmstc3RyaW5naWZ5QDExLjAuMC9ub2RlX21vZHVsZXMvcmVtYXJrLXN0cmluZ2lmeS9saWIvaW5kZXguanMKZnVuY3Rpb24gcmVtYXJrU3RyaW5naWZ5KG9wdGlvbnMpIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgc2VsZjIuY29tcGlsZXIgPSBjb21waWxlcjI7CiAgZnVuY3Rpb24gY29tcGlsZXIyKHRyZWUpIHsKICAgIHJldHVybiB0b01hcmtkb3duKHRyZWUsIHsKICAgICAgLi4uc2VsZjIuZGF0YSgic2V0dGluZ3MiKSwKICAgICAgLi4ub3B0aW9ucywKICAgICAgLy8gTm90ZTogdGhpcyBvcHRpb24gaXMgbm90IGluIHRoZSByZWFkbWUuCiAgICAgIC8vIFRoZSBnb2FsIGlzIGZvciBpdCB0byBiZSBzZXQgYnkgcGx1Z2lucyBvbiBgZGF0YWAgaW5zdGVhZCBvZiBiZWluZwogICAgICAvLyBwYXNzZWQgYnkgdXNlcnMuCiAgICAgIGV4dGVuc2lvbnM6IHNlbGYyLmRhdGEoInRvTWFya2Rvd25FeHRlbnNpb25zIikgfHwgW10KICAgIH0pOwogIH0KICBfX25hbWUoY29tcGlsZXIyLCAiY29tcGlsZXIiKTsKfQpfX25hbWUocmVtYXJrU3RyaW5naWZ5LCAicmVtYXJrU3RyaW5naWZ5Iik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vdHVybmRvd25ANy4yLjIvbm9kZV9tb2R1bGVzL3R1cm5kb3duL2xpYi90dXJuZG93bi5icm93c2VyLmVzLmpzCmZ1bmN0aW9uIGV4dGVuZDIoZGVzdGluYXRpb24pIHsKICBmb3IgKHZhciBpMTAgPSAxOyBpMTAgPCBhcmd1bWVudHMubGVuZ3RoOyBpMTArKykgewogICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpMTBdOwogICAgZm9yICh2YXIga2V5MiBpbiBzb3VyY2UpIHsKICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShrZXkyKSkgZGVzdGluYXRpb25ba2V5Ml0gPSBzb3VyY2Vba2V5Ml07CiAgICB9CiAgfQogIHJldHVybiBkZXN0aW5hdGlvbjsKfQpfX25hbWUoZXh0ZW5kMiwgImV4dGVuZCIpOwpmdW5jdGlvbiByZXBlYXQyKGNoYXJhY3RlciwgY291bnQyKSB7CiAgcmV0dXJuIEFycmF5KGNvdW50MiArIDEpLmpvaW4oY2hhcmFjdGVyKTsKfQpfX25hbWUocmVwZWF0MiwgInJlcGVhdCIpOwpmdW5jdGlvbiB0cmltTGVhZGluZ05ld2xpbmVzKHN0cmluZzMpIHsKICByZXR1cm4gc3RyaW5nMy5yZXBsYWNlKC9eXG4qLywgIiIpOwp9Cl9fbmFtZSh0cmltTGVhZGluZ05ld2xpbmVzLCAidHJpbUxlYWRpbmdOZXdsaW5lcyIpOwpmdW5jdGlvbiB0cmltVHJhaWxpbmdOZXdsaW5lcyhzdHJpbmczKSB7CiAgdmFyIGluZGV4RW5kID0gc3RyaW5nMy5sZW5ndGg7CiAgd2hpbGUgKGluZGV4RW5kID4gMCAmJiBzdHJpbmczW2luZGV4RW5kIC0gMV0gPT09ICJcbiIpIGluZGV4RW5kLS07CiAgcmV0dXJuIHN0cmluZzMuc3Vic3RyaW5nKDAsIGluZGV4RW5kKTsKfQpfX25hbWUodHJpbVRyYWlsaW5nTmV3bGluZXMsICJ0cmltVHJhaWxpbmdOZXdsaW5lcyIpOwpmdW5jdGlvbiB0cmltTmV3bGluZXMoc3RyaW5nMykgewogIHJldHVybiB0cmltVHJhaWxpbmdOZXdsaW5lcyh0cmltTGVhZGluZ05ld2xpbmVzKHN0cmluZzMpKTsKfQpfX25hbWUodHJpbU5ld2xpbmVzLCAidHJpbU5ld2xpbmVzIik7CnZhciBibG9ja0VsZW1lbnRzID0gWwogICJBRERSRVNTIiwKICAiQVJUSUNMRSIsCiAgIkFTSURFIiwKICAiQVVESU8iLAogICJCTE9DS1FVT1RFIiwKICAiQk9EWSIsCiAgIkNBTlZBUyIsCiAgIkNFTlRFUiIsCiAgIkREIiwKICAiRElSIiwKICAiRElWIiwKICAiREwiLAogICJEVCIsCiAgIkZJRUxEU0VUIiwKICAiRklHQ0FQVElPTiIsCiAgIkZJR1VSRSIsCiAgIkZPT1RFUiIsCiAgIkZPUk0iLAogICJGUkFNRVNFVCIsCiAgIkgxIiwKICAiSDIiLAogICJIMyIsCiAgIkg0IiwKICAiSDUiLAogICJINiIsCiAgIkhFQURFUiIsCiAgIkhHUk9VUCIsCiAgIkhSIiwKICAiSFRNTCIsCiAgIklTSU5ERVgiLAogICJMSSIsCiAgIk1BSU4iLAogICJNRU5VIiwKICAiTkFWIiwKICAiTk9GUkFNRVMiLAogICJOT1NDUklQVCIsCiAgIk9MIiwKICAiT1VUUFVUIiwKICAiUCIsCiAgIlBSRSIsCiAgIlNFQ1RJT04iLAogICJUQUJMRSIsCiAgIlRCT0RZIiwKICAiVEQiLAogICJURk9PVCIsCiAgIlRIIiwKICAiVEhFQUQiLAogICJUUiIsCiAgIlVMIgpdOwpmdW5jdGlvbiBpc0Jsb2NrKG5vZGUyKSB7CiAgcmV0dXJuIGlzMihub2RlMiwgYmxvY2tFbGVtZW50cyk7Cn0KX19uYW1lKGlzQmxvY2ssICJpc0Jsb2NrIik7CnZhciB2b2lkRWxlbWVudHMgPSBbCiAgIkFSRUEiLAogICJCQVNFIiwKICAiQlIiLAogICJDT0wiLAogICJDT01NQU5EIiwKICAiRU1CRUQiLAogICJIUiIsCiAgIklNRyIsCiAgIklOUFVUIiwKICAiS0VZR0VOIiwKICAiTElOSyIsCiAgIk1FVEEiLAogICJQQVJBTSIsCiAgIlNPVVJDRSIsCiAgIlRSQUNLIiwKICAiV0JSIgpdOwpmdW5jdGlvbiBpc1ZvaWQobm9kZTIpIHsKICByZXR1cm4gaXMyKG5vZGUyLCB2b2lkRWxlbWVudHMpOwp9Cl9fbmFtZShpc1ZvaWQsICJpc1ZvaWQiKTsKZnVuY3Rpb24gaGFzVm9pZChub2RlMikgewogIHJldHVybiBoYXMobm9kZTIsIHZvaWRFbGVtZW50cyk7Cn0KX19uYW1lKGhhc1ZvaWQsICJoYXNWb2lkIik7CnZhciBtZWFuaW5nZnVsV2hlbkJsYW5rRWxlbWVudHMgPSBbCiAgIkEiLAogICJUQUJMRSIsCiAgIlRIRUFEIiwKICAiVEJPRFkiLAogICJURk9PVCIsCiAgIlRIIiwKICAiVEQiLAogICJJRlJBTUUiLAogICJTQ1JJUFQiLAogICJBVURJTyIsCiAgIlZJREVPIgpdOwpmdW5jdGlvbiBpc01lYW5pbmdmdWxXaGVuQmxhbmsobm9kZTIpIHsKICByZXR1cm4gaXMyKG5vZGUyLCBtZWFuaW5nZnVsV2hlbkJsYW5rRWxlbWVudHMpOwp9Cl9fbmFtZShpc01lYW5pbmdmdWxXaGVuQmxhbmssICJpc01lYW5pbmdmdWxXaGVuQmxhbmsiKTsKZnVuY3Rpb24gaGFzTWVhbmluZ2Z1bFdoZW5CbGFuayhub2RlMikgewogIHJldHVybiBoYXMobm9kZTIsIG1lYW5pbmdmdWxXaGVuQmxhbmtFbGVtZW50cyk7Cn0KX19uYW1lKGhhc01lYW5pbmdmdWxXaGVuQmxhbmssICJoYXNNZWFuaW5nZnVsV2hlbkJsYW5rIik7CmZ1bmN0aW9uIGlzMihub2RlMiwgdGFnTmFtZXMpIHsKICByZXR1cm4gdGFnTmFtZXMuaW5kZXhPZihub2RlMi5ub2RlTmFtZSkgPj0gMDsKfQpfX25hbWUoaXMyLCAiaXMiKTsKZnVuY3Rpb24gaGFzKG5vZGUyLCB0YWdOYW1lcykgewogIHJldHVybiBub2RlMi5nZXRFbGVtZW50c0J5VGFnTmFtZSAmJiB0YWdOYW1lcy5zb21lKGZ1bmN0aW9uKHRhZ05hbWUpIHsKICAgIHJldHVybiBub2RlMi5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lKS5sZW5ndGg7CiAgfSk7Cn0KX19uYW1lKGhhcywgImhhcyIpOwp2YXIgcnVsZXMgPSB7fTsKcnVsZXMucGFyYWdyYXBoID0gewogIGZpbHRlcjogInAiLAogIHJlcGxhY2VtZW50OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGNvbnRlbnQzKSB7CiAgICByZXR1cm4gIlxuXG4iICsgY29udGVudDMgKyAiXG5cbiI7CiAgfSwgInJlcGxhY2VtZW50IikKfTsKcnVsZXMubGluZUJyZWFrID0gewogIGZpbHRlcjogImJyIiwKICByZXBsYWNlbWVudDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihjb250ZW50Mywgbm9kZTIsIG9wdGlvbnMpIHsKICAgIHJldHVybiBvcHRpb25zLmJyICsgIlxuIjsKICB9LCAicmVwbGFjZW1lbnQiKQp9OwpydWxlcy5oZWFkaW5nID0gewogIGZpbHRlcjogWyJoMSIsICJoMiIsICJoMyIsICJoNCIsICJoNSIsICJoNiJdLAogIHJlcGxhY2VtZW50OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGNvbnRlbnQzLCBub2RlMiwgb3B0aW9ucykgewogICAgdmFyIGhMZXZlbCA9IE51bWJlcihub2RlMi5ub2RlTmFtZS5jaGFyQXQoMSkpOwogICAgaWYgKG9wdGlvbnMuaGVhZGluZ1N0eWxlID09PSAic2V0ZXh0IiAmJiBoTGV2ZWwgPCAzKSB7CiAgICAgIHZhciB1bmRlcmxpbmUgPSByZXBlYXQyKGhMZXZlbCA9PT0gMSA/ICI9IiA6ICItIiwgY29udGVudDMubGVuZ3RoKTsKICAgICAgcmV0dXJuICJcblxuIiArIGNvbnRlbnQzICsgIlxuIiArIHVuZGVybGluZSArICJcblxuIjsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAiXG5cbiIgKyByZXBlYXQyKCIjIiwgaExldmVsKSArICIgIiArIGNvbnRlbnQzICsgIlxuXG4iOwogICAgfQogIH0sICJyZXBsYWNlbWVudCIpCn07CnJ1bGVzLmJsb2NrcXVvdGUgPSB7CiAgZmlsdGVyOiAiYmxvY2txdW90ZSIsCiAgcmVwbGFjZW1lbnQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oY29udGVudDMpIHsKICAgIGNvbnRlbnQzID0gdHJpbU5ld2xpbmVzKGNvbnRlbnQzKS5yZXBsYWNlKC9eL2dtLCAiPiAiKTsKICAgIHJldHVybiAiXG5cbiIgKyBjb250ZW50MyArICJcblxuIjsKICB9LCAicmVwbGFjZW1lbnQiKQp9OwpydWxlcy5saXN0ID0gewogIGZpbHRlcjogWyJ1bCIsICJvbCJdLAogIHJlcGxhY2VtZW50OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGNvbnRlbnQzLCBub2RlMikgewogICAgdmFyIHBhcmVudCA9IG5vZGUyLnBhcmVudE5vZGU7CiAgICBpZiAocGFyZW50Lm5vZGVOYW1lID09PSAiTEkiICYmIHBhcmVudC5sYXN0RWxlbWVudENoaWxkID09PSBub2RlMikgewogICAgICByZXR1cm4gIlxuIiArIGNvbnRlbnQzOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICJcblxuIiArIGNvbnRlbnQzICsgIlxuXG4iOwogICAgfQogIH0sICJyZXBsYWNlbWVudCIpCn07CnJ1bGVzLmxpc3RJdGVtID0gewogIGZpbHRlcjogImxpIiwKICByZXBsYWNlbWVudDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihjb250ZW50Mywgbm9kZTIsIG9wdGlvbnMpIHsKICAgIHZhciBwcmVmaXggPSBvcHRpb25zLmJ1bGxldExpc3RNYXJrZXIgKyAiICAgIjsKICAgIHZhciBwYXJlbnQgPSBub2RlMi5wYXJlbnROb2RlOwogICAgaWYgKHBhcmVudC5ub2RlTmFtZSA9PT0gIk9MIikgewogICAgICB2YXIgc3RhcnQgPSBwYXJlbnQuZ2V0QXR0cmlidXRlKCJzdGFydCIpOwogICAgICB2YXIgaW5kZXgyID0gQXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChwYXJlbnQuY2hpbGRyZW4sIG5vZGUyKTsKICAgICAgcHJlZml4ID0gKHN0YXJ0ID8gTnVtYmVyKHN0YXJ0KSArIGluZGV4MiA6IGluZGV4MiArIDEpICsgIi4gICI7CiAgICB9CiAgICB2YXIgaXNQYXJhZ3JhcGggPSAvXG4kLy50ZXN0KGNvbnRlbnQzKTsKICAgIGNvbnRlbnQzID0gdHJpbU5ld2xpbmVzKGNvbnRlbnQzKSArIChpc1BhcmFncmFwaCA/ICJcbiIgOiAiIik7CiAgICBjb250ZW50MyA9IGNvbnRlbnQzLnJlcGxhY2UoL1xuL2dtLCAiXG4iICsgIiAiLnJlcGVhdChwcmVmaXgubGVuZ3RoKSk7CiAgICByZXR1cm4gcHJlZml4ICsgY29udGVudDMgKyAobm9kZTIubmV4dFNpYmxpbmcgPyAiXG4iIDogIiIpOwogIH0sICJyZXBsYWNlbWVudCIpCn07CnJ1bGVzLmluZGVudGVkQ29kZUJsb2NrID0gewogIGZpbHRlcjogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihub2RlMiwgb3B0aW9ucykgewogICAgcmV0dXJuIG9wdGlvbnMuY29kZUJsb2NrU3R5bGUgPT09ICJpbmRlbnRlZCIgJiYgbm9kZTIubm9kZU5hbWUgPT09ICJQUkUiICYmIG5vZGUyLmZpcnN0Q2hpbGQgJiYgbm9kZTIuZmlyc3RDaGlsZC5ub2RlTmFtZSA9PT0gIkNPREUiOwogIH0sICJmaWx0ZXIiKSwKICByZXBsYWNlbWVudDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihjb250ZW50Mywgbm9kZTIsIG9wdGlvbnMpIHsKICAgIHJldHVybiAiXG5cbiAgICAiICsgbm9kZTIuZmlyc3RDaGlsZC50ZXh0Q29udGVudC5yZXBsYWNlKC9cbi9nLCAiXG4gICAgIikgKyAiXG5cbiI7CiAgfSwgInJlcGxhY2VtZW50IikKfTsKcnVsZXMuZmVuY2VkQ29kZUJsb2NrID0gewogIGZpbHRlcjogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihub2RlMiwgb3B0aW9ucykgewogICAgcmV0dXJuIG9wdGlvbnMuY29kZUJsb2NrU3R5bGUgPT09ICJmZW5jZWQiICYmIG5vZGUyLm5vZGVOYW1lID09PSAiUFJFIiAmJiBub2RlMi5maXJzdENoaWxkICYmIG5vZGUyLmZpcnN0Q2hpbGQubm9kZU5hbWUgPT09ICJDT0RFIjsKICB9LCAiZmlsdGVyIiksCiAgcmVwbGFjZW1lbnQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oY29udGVudDMsIG5vZGUyLCBvcHRpb25zKSB7CiAgICB2YXIgY2xhc3NOYW1lID0gbm9kZTIuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImNsYXNzIikgfHwgIiI7CiAgICB2YXIgbGFuZ3VhZ2UgPSAoY2xhc3NOYW1lLm1hdGNoKC9sYW5ndWFnZS0oXFMrKS8pIHx8IFtudWxsLCAiIl0pWzFdOwogICAgdmFyIGNvZGU0ID0gbm9kZTIuZmlyc3RDaGlsZC50ZXh0Q29udGVudDsKICAgIHZhciBmZW5jZUNoYXIgPSBvcHRpb25zLmZlbmNlLmNoYXJBdCgwKTsKICAgIHZhciBmZW5jZVNpemUgPSAzOwogICAgdmFyIGZlbmNlSW5Db2RlUmVnZXggPSBuZXcgUmVnRXhwKCJeIiArIGZlbmNlQ2hhciArICJ7Myx9IiwgImdtIik7CiAgICB2YXIgbWF0Y2gyOwogICAgd2hpbGUgKG1hdGNoMiA9IGZlbmNlSW5Db2RlUmVnZXguZXhlYyhjb2RlNCkpIHsKICAgICAgaWYgKG1hdGNoMlswXS5sZW5ndGggPj0gZmVuY2VTaXplKSB7CiAgICAgICAgZmVuY2VTaXplID0gbWF0Y2gyWzBdLmxlbmd0aCArIDE7CiAgICAgIH0KICAgIH0KICAgIHZhciBmZW5jZTMgPSByZXBlYXQyKGZlbmNlQ2hhciwgZmVuY2VTaXplKTsKICAgIHJldHVybiAiXG5cbiIgKyBmZW5jZTMgKyBsYW5ndWFnZSArICJcbiIgKyBjb2RlNC5yZXBsYWNlKC9cbiQvLCAiIikgKyAiXG4iICsgZmVuY2UzICsgIlxuXG4iOwogIH0sICJyZXBsYWNlbWVudCIpCn07CnJ1bGVzLmhvcml6b250YWxSdWxlID0gewogIGZpbHRlcjogImhyIiwKICByZXBsYWNlbWVudDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihjb250ZW50Mywgbm9kZTIsIG9wdGlvbnMpIHsKICAgIHJldHVybiAiXG5cbiIgKyBvcHRpb25zLmhyICsgIlxuXG4iOwogIH0sICJyZXBsYWNlbWVudCIpCn07CnJ1bGVzLmlubGluZUxpbmsgPSB7CiAgZmlsdGVyOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKG5vZGUyLCBvcHRpb25zKSB7CiAgICByZXR1cm4gb3B0aW9ucy5saW5rU3R5bGUgPT09ICJpbmxpbmVkIiAmJiBub2RlMi5ub2RlTmFtZSA9PT0gIkEiICYmIG5vZGUyLmdldEF0dHJpYnV0ZSgiaHJlZiIpOwogIH0sICJmaWx0ZXIiKSwKICByZXBsYWNlbWVudDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihjb250ZW50Mywgbm9kZTIpIHsKICAgIHZhciBocmVmID0gbm9kZTIuZ2V0QXR0cmlidXRlKCJocmVmIik7CiAgICBpZiAoaHJlZikgaHJlZiA9IGhyZWYucmVwbGFjZSgvKFsoKV0pL2csICJcXCQxIik7CiAgICB2YXIgdGl0bGUgPSBjbGVhbkF0dHJpYnV0ZShub2RlMi5nZXRBdHRyaWJ1dGUoInRpdGxlIikpOwogICAgaWYgKHRpdGxlKSB0aXRsZSA9ICcgIicgKyB0aXRsZS5yZXBsYWNlKC8iL2csICdcXCInKSArICciJzsKICAgIHJldHVybiAiWyIgKyBjb250ZW50MyArICJdKCIgKyBocmVmICsgdGl0bGUgKyAiKSI7CiAgfSwgInJlcGxhY2VtZW50IikKfTsKcnVsZXMucmVmZXJlbmNlTGluayA9IHsKICBmaWx0ZXI6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24obm9kZTIsIG9wdGlvbnMpIHsKICAgIHJldHVybiBvcHRpb25zLmxpbmtTdHlsZSA9PT0gInJlZmVyZW5jZWQiICYmIG5vZGUyLm5vZGVOYW1lID09PSAiQSIgJiYgbm9kZTIuZ2V0QXR0cmlidXRlKCJocmVmIik7CiAgfSwgImZpbHRlciIpLAogIHJlcGxhY2VtZW50OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGNvbnRlbnQzLCBub2RlMiwgb3B0aW9ucykgewogICAgdmFyIGhyZWYgPSBub2RlMi5nZXRBdHRyaWJ1dGUoImhyZWYiKTsKICAgIHZhciB0aXRsZSA9IGNsZWFuQXR0cmlidXRlKG5vZGUyLmdldEF0dHJpYnV0ZSgidGl0bGUiKSk7CiAgICBpZiAodGl0bGUpIHRpdGxlID0gJyAiJyArIHRpdGxlICsgJyInOwogICAgdmFyIHJlcGxhY2VtZW50OwogICAgdmFyIHJlZmVyZW5jZTsKICAgIHN3aXRjaCAob3B0aW9ucy5saW5rUmVmZXJlbmNlU3R5bGUpIHsKICAgICAgY2FzZSAiY29sbGFwc2VkIjoKICAgICAgICByZXBsYWNlbWVudCA9ICJbIiArIGNvbnRlbnQzICsgIl1bXSI7CiAgICAgICAgcmVmZXJlbmNlID0gIlsiICsgY29udGVudDMgKyAiXTogIiArIGhyZWYgKyB0aXRsZTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAic2hvcnRjdXQiOgogICAgICAgIHJlcGxhY2VtZW50ID0gIlsiICsgY29udGVudDMgKyAiXSI7CiAgICAgICAgcmVmZXJlbmNlID0gIlsiICsgY29udGVudDMgKyAiXTogIiArIGhyZWYgKyB0aXRsZTsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICB2YXIgaWQgPSB0aGlzLnJlZmVyZW5jZXMubGVuZ3RoICsgMTsKICAgICAgICByZXBsYWNlbWVudCA9ICJbIiArIGNvbnRlbnQzICsgIl1bIiArIGlkICsgIl0iOwogICAgICAgIHJlZmVyZW5jZSA9ICJbIiArIGlkICsgIl06ICIgKyBocmVmICsgdGl0bGU7CiAgICB9CiAgICB0aGlzLnJlZmVyZW5jZXMucHVzaChyZWZlcmVuY2UpOwogICAgcmV0dXJuIHJlcGxhY2VtZW50OwogIH0sICJyZXBsYWNlbWVudCIpLAogIHJlZmVyZW5jZXM6IFtdLAogIGFwcGVuZDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihvcHRpb25zKSB7CiAgICB2YXIgcmVmZXJlbmNlcyA9ICIiOwogICAgaWYgKHRoaXMucmVmZXJlbmNlcy5sZW5ndGgpIHsKICAgICAgcmVmZXJlbmNlcyA9ICJcblxuIiArIHRoaXMucmVmZXJlbmNlcy5qb2luKCJcbiIpICsgIlxuXG4iOwogICAgICB0aGlzLnJlZmVyZW5jZXMgPSBbXTsKICAgIH0KICAgIHJldHVybiByZWZlcmVuY2VzOwogIH0sICJhcHBlbmQiKQp9OwpydWxlcy5lbXBoYXNpcyA9IHsKICBmaWx0ZXI6IFsiZW0iLCAiaSJdLAogIHJlcGxhY2VtZW50OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGNvbnRlbnQzLCBub2RlMiwgb3B0aW9ucykgewogICAgaWYgKCFjb250ZW50My50cmltKCkpIHJldHVybiAiIjsKICAgIHJldHVybiBvcHRpb25zLmVtRGVsaW1pdGVyICsgY29udGVudDMgKyBvcHRpb25zLmVtRGVsaW1pdGVyOwogIH0sICJyZXBsYWNlbWVudCIpCn07CnJ1bGVzLnN0cm9uZyA9IHsKICBmaWx0ZXI6IFsic3Ryb25nIiwgImIiXSwKICByZXBsYWNlbWVudDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihjb250ZW50Mywgbm9kZTIsIG9wdGlvbnMpIHsKICAgIGlmICghY29udGVudDMudHJpbSgpKSByZXR1cm4gIiI7CiAgICByZXR1cm4gb3B0aW9ucy5zdHJvbmdEZWxpbWl0ZXIgKyBjb250ZW50MyArIG9wdGlvbnMuc3Ryb25nRGVsaW1pdGVyOwogIH0sICJyZXBsYWNlbWVudCIpCn07CnJ1bGVzLmNvZGUgPSB7CiAgZmlsdGVyOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKG5vZGUyKSB7CiAgICB2YXIgaGFzU2libGluZ3MgPSBub2RlMi5wcmV2aW91c1NpYmxpbmcgfHwgbm9kZTIubmV4dFNpYmxpbmc7CiAgICB2YXIgaXNDb2RlQmxvY2sgPSBub2RlMi5wYXJlbnROb2RlLm5vZGVOYW1lID09PSAiUFJFIiAmJiAhaGFzU2libGluZ3M7CiAgICByZXR1cm4gbm9kZTIubm9kZU5hbWUgPT09ICJDT0RFIiAmJiAhaXNDb2RlQmxvY2s7CiAgfSwgImZpbHRlciIpLAogIHJlcGxhY2VtZW50OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGNvbnRlbnQzKSB7CiAgICBpZiAoIWNvbnRlbnQzKSByZXR1cm4gIiI7CiAgICBjb250ZW50MyA9IGNvbnRlbnQzLnJlcGxhY2UoL1xyP1xufFxyL2csICIgIik7CiAgICB2YXIgZXh0cmFTcGFjZSA9IC9eYHxeIC4qP1teIF0uKiAkfGAkLy50ZXN0KGNvbnRlbnQzKSA/ICIgIiA6ICIiOwogICAgdmFyIGRlbGltaXRlciA9ICJgIjsKICAgIHZhciBtYXRjaGVzID0gY29udGVudDMubWF0Y2goL2ArL2dtKSB8fCBbXTsKICAgIHdoaWxlIChtYXRjaGVzLmluZGV4T2YoZGVsaW1pdGVyKSAhPT0gLTEpIGRlbGltaXRlciA9IGRlbGltaXRlciArICJgIjsKICAgIHJldHVybiBkZWxpbWl0ZXIgKyBleHRyYVNwYWNlICsgY29udGVudDMgKyBleHRyYVNwYWNlICsgZGVsaW1pdGVyOwogIH0sICJyZXBsYWNlbWVudCIpCn07CnJ1bGVzLmltYWdlID0gewogIGZpbHRlcjogImltZyIsCiAgcmVwbGFjZW1lbnQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oY29udGVudDMsIG5vZGUyKSB7CiAgICB2YXIgYWx0ID0gY2xlYW5BdHRyaWJ1dGUobm9kZTIuZ2V0QXR0cmlidXRlKCJhbHQiKSk7CiAgICB2YXIgc3JjID0gbm9kZTIuZ2V0QXR0cmlidXRlKCJzcmMiKSB8fCAiIjsKICAgIHZhciB0aXRsZSA9IGNsZWFuQXR0cmlidXRlKG5vZGUyLmdldEF0dHJpYnV0ZSgidGl0bGUiKSk7CiAgICB2YXIgdGl0bGVQYXJ0ID0gdGl0bGUgPyAnICInICsgdGl0bGUgKyAnIicgOiAiIjsKICAgIHJldHVybiBzcmMgPyAiIVsiICsgYWx0ICsgIl0oIiArIHNyYyArIHRpdGxlUGFydCArICIpIiA6ICIiOwogIH0sICJyZXBsYWNlbWVudCIpCn07CmZ1bmN0aW9uIGNsZWFuQXR0cmlidXRlKGF0dHJpYnV0ZSkgewogIHJldHVybiBhdHRyaWJ1dGUgPyBhdHRyaWJ1dGUucmVwbGFjZSgvKFxuK1xzKikrL2csICJcbiIpIDogIiI7Cn0KX19uYW1lKGNsZWFuQXR0cmlidXRlLCAiY2xlYW5BdHRyaWJ1dGUiKTsKZnVuY3Rpb24gUnVsZXMob3B0aW9ucykgewogIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CiAgdGhpcy5fa2VlcCA9IFtdOwogIHRoaXMuX3JlbW92ZSA9IFtdOwogIHRoaXMuYmxhbmtSdWxlID0gewogICAgcmVwbGFjZW1lbnQ6IG9wdGlvbnMuYmxhbmtSZXBsYWNlbWVudAogIH07CiAgdGhpcy5rZWVwUmVwbGFjZW1lbnQgPSBvcHRpb25zLmtlZXBSZXBsYWNlbWVudDsKICB0aGlzLmRlZmF1bHRSdWxlID0gewogICAgcmVwbGFjZW1lbnQ6IG9wdGlvbnMuZGVmYXVsdFJlcGxhY2VtZW50CiAgfTsKICB0aGlzLmFycmF5ID0gW107CiAgZm9yICh2YXIga2V5MiBpbiBvcHRpb25zLnJ1bGVzKSB0aGlzLmFycmF5LnB1c2gob3B0aW9ucy5ydWxlc1trZXkyXSk7Cn0KX19uYW1lKFJ1bGVzLCAiUnVsZXMiKTsKUnVsZXMucHJvdG90eXBlID0gewogIGFkZDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihrZXkyLCBydWxlKSB7CiAgICB0aGlzLmFycmF5LnVuc2hpZnQocnVsZSk7CiAgfSwgImFkZCIpLAogIGtlZXA6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oZmlsdGVyMikgewogICAgdGhpcy5fa2VlcC51bnNoaWZ0KHsKICAgICAgZmlsdGVyOiBmaWx0ZXIyLAogICAgICByZXBsYWNlbWVudDogdGhpcy5rZWVwUmVwbGFjZW1lbnQKICAgIH0pOwogIH0sICJrZWVwIiksCiAgcmVtb3ZlOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGZpbHRlcjIpIHsKICAgIHRoaXMuX3JlbW92ZS51bnNoaWZ0KHsKICAgICAgZmlsdGVyOiBmaWx0ZXIyLAogICAgICByZXBsYWNlbWVudDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gIiI7CiAgICAgIH0sICJyZXBsYWNlbWVudCIpCiAgICB9KTsKICB9LCAicmVtb3ZlIiksCiAgZm9yTm9kZTogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihub2RlMikgewogICAgaWYgKG5vZGUyLmlzQmxhbmspIHJldHVybiB0aGlzLmJsYW5rUnVsZTsKICAgIHZhciBydWxlOwogICAgaWYgKHJ1bGUgPSBmaW5kUnVsZSh0aGlzLmFycmF5LCBub2RlMiwgdGhpcy5vcHRpb25zKSkgcmV0dXJuIHJ1bGU7CiAgICBpZiAocnVsZSA9IGZpbmRSdWxlKHRoaXMuX2tlZXAsIG5vZGUyLCB0aGlzLm9wdGlvbnMpKSByZXR1cm4gcnVsZTsKICAgIGlmIChydWxlID0gZmluZFJ1bGUodGhpcy5fcmVtb3ZlLCBub2RlMiwgdGhpcy5vcHRpb25zKSkgcmV0dXJuIHJ1bGU7CiAgICByZXR1cm4gdGhpcy5kZWZhdWx0UnVsZTsKICB9LCAiZm9yTm9kZSIpLAogIGZvckVhY2g6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oZm4pIHsKICAgIGZvciAodmFyIGkxMCA9IDA7IGkxMCA8IHRoaXMuYXJyYXkubGVuZ3RoOyBpMTArKykgZm4odGhpcy5hcnJheVtpMTBdLCBpMTApOwogIH0sICJmb3JFYWNoIikKfTsKZnVuY3Rpb24gZmluZFJ1bGUocnVsZXMzLCBub2RlMiwgb3B0aW9ucykgewogIGZvciAodmFyIGkxMCA9IDA7IGkxMCA8IHJ1bGVzMy5sZW5ndGg7IGkxMCsrKSB7CiAgICB2YXIgcnVsZSA9IHJ1bGVzM1tpMTBdOwogICAgaWYgKGZpbHRlclZhbHVlKHJ1bGUsIG5vZGUyLCBvcHRpb25zKSkgcmV0dXJuIHJ1bGU7CiAgfQogIHJldHVybiB2b2lkIDA7Cn0KX19uYW1lKGZpbmRSdWxlLCAiZmluZFJ1bGUiKTsKZnVuY3Rpb24gZmlsdGVyVmFsdWUocnVsZSwgbm9kZTIsIG9wdGlvbnMpIHsKICB2YXIgZmlsdGVyMiA9IHJ1bGUuZmlsdGVyOwogIGlmICh0eXBlb2YgZmlsdGVyMiA9PT0gInN0cmluZyIpIHsKICAgIGlmIChmaWx0ZXIyID09PSBub2RlMi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSByZXR1cm4gdHJ1ZTsKICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyMikpIHsKICAgIGlmIChmaWx0ZXIyLmluZGV4T2Yobm9kZTIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkgPiAtMSkgcmV0dXJuIHRydWU7CiAgfSBlbHNlIGlmICh0eXBlb2YgZmlsdGVyMiA9PT0gImZ1bmN0aW9uIikgewogICAgaWYgKGZpbHRlcjIuY2FsbChydWxlLCBub2RlMiwgb3B0aW9ucykpIHJldHVybiB0cnVlOwogIH0gZWxzZSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJgZmlsdGVyYCBuZWVkcyB0byBiZSBhIHN0cmluZywgYXJyYXksIG9yIGZ1bmN0aW9uIik7CiAgfQp9Cl9fbmFtZShmaWx0ZXJWYWx1ZSwgImZpbHRlclZhbHVlIik7CmZ1bmN0aW9uIGNvbGxhcHNlV2hpdGVzcGFjZShvcHRpb25zKSB7CiAgdmFyIGVsZW1lbnQ0ID0gb3B0aW9ucy5lbGVtZW50OwogIHZhciBpc0Jsb2NrMiA9IG9wdGlvbnMuaXNCbG9jazsKICB2YXIgaXNWb2lkMiA9IG9wdGlvbnMuaXNWb2lkOwogIHZhciBpc1ByZSA9IG9wdGlvbnMuaXNQcmUgfHwgZnVuY3Rpb24obm9kZTMpIHsKICAgIHJldHVybiBub2RlMy5ub2RlTmFtZSA9PT0gIlBSRSI7CiAgfTsKICBpZiAoIWVsZW1lbnQ0LmZpcnN0Q2hpbGQgfHwgaXNQcmUoZWxlbWVudDQpKSByZXR1cm47CiAgdmFyIHByZXZUZXh0ID0gbnVsbDsKICB2YXIga2VlcExlYWRpbmdXcyA9IGZhbHNlOwogIHZhciBwcmV2ID0gbnVsbDsKICB2YXIgbm9kZTIgPSBuZXh0KHByZXYsIGVsZW1lbnQ0LCBpc1ByZSk7CiAgd2hpbGUgKG5vZGUyICE9PSBlbGVtZW50NCkgewogICAgaWYgKG5vZGUyLm5vZGVUeXBlID09PSAzIHx8IG5vZGUyLm5vZGVUeXBlID09PSA0KSB7CiAgICAgIHZhciB0ZXh0OCA9IG5vZGUyLmRhdGEucmVwbGFjZSgvWyBcclxuXHRdKy9nLCAiICIpOwogICAgICBpZiAoKCFwcmV2VGV4dCB8fCAvICQvLnRlc3QocHJldlRleHQuZGF0YSkpICYmICFrZWVwTGVhZGluZ1dzICYmIHRleHQ4WzBdID09PSAiICIpIHsKICAgICAgICB0ZXh0OCA9IHRleHQ4LnN1YnN0cigxKTsKICAgICAgfQogICAgICBpZiAoIXRleHQ4KSB7CiAgICAgICAgbm9kZTIgPSByZW1vdmUobm9kZTIpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIG5vZGUyLmRhdGEgPSB0ZXh0ODsKICAgICAgcHJldlRleHQgPSBub2RlMjsKICAgIH0gZWxzZSBpZiAobm9kZTIubm9kZVR5cGUgPT09IDEpIHsKICAgICAgaWYgKGlzQmxvY2syKG5vZGUyKSB8fCBub2RlMi5ub2RlTmFtZSA9PT0gIkJSIikgewogICAgICAgIGlmIChwcmV2VGV4dCkgewogICAgICAgICAgcHJldlRleHQuZGF0YSA9IHByZXZUZXh0LmRhdGEucmVwbGFjZSgvICQvLCAiIik7CiAgICAgICAgfQogICAgICAgIHByZXZUZXh0ID0gbnVsbDsKICAgICAgICBrZWVwTGVhZGluZ1dzID0gZmFsc2U7CiAgICAgIH0gZWxzZSBpZiAoaXNWb2lkMihub2RlMikgfHwgaXNQcmUobm9kZTIpKSB7CiAgICAgICAgcHJldlRleHQgPSBudWxsOwogICAgICAgIGtlZXBMZWFkaW5nV3MgPSB0cnVlOwogICAgICB9IGVsc2UgaWYgKHByZXZUZXh0KSB7CiAgICAgICAga2VlcExlYWRpbmdXcyA9IGZhbHNlOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBub2RlMiA9IHJlbW92ZShub2RlMik7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgdmFyIG5leHROb2RlID0gbmV4dChwcmV2LCBub2RlMiwgaXNQcmUpOwogICAgcHJldiA9IG5vZGUyOwogICAgbm9kZTIgPSBuZXh0Tm9kZTsKICB9CiAgaWYgKHByZXZUZXh0KSB7CiAgICBwcmV2VGV4dC5kYXRhID0gcHJldlRleHQuZGF0YS5yZXBsYWNlKC8gJC8sICIiKTsKICAgIGlmICghcHJldlRleHQuZGF0YSkgewogICAgICByZW1vdmUocHJldlRleHQpOwogICAgfQogIH0KfQpfX25hbWUoY29sbGFwc2VXaGl0ZXNwYWNlLCAiY29sbGFwc2VXaGl0ZXNwYWNlIik7CmZ1bmN0aW9uIHJlbW92ZShub2RlMikgewogIHZhciBuZXh0MiA9IG5vZGUyLm5leHRTaWJsaW5nIHx8IG5vZGUyLnBhcmVudE5vZGU7CiAgbm9kZTIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlMik7CiAgcmV0dXJuIG5leHQyOwp9Cl9fbmFtZShyZW1vdmUsICJyZW1vdmUiKTsKZnVuY3Rpb24gbmV4dChwcmV2LCBjdXJyZW50LCBpc1ByZSkgewogIGlmIChwcmV2ICYmIHByZXYucGFyZW50Tm9kZSA9PT0gY3VycmVudCB8fCBpc1ByZShjdXJyZW50KSkgewogICAgcmV0dXJuIGN1cnJlbnQubmV4dFNpYmxpbmcgfHwgY3VycmVudC5wYXJlbnROb2RlOwogIH0KICByZXR1cm4gY3VycmVudC5maXJzdENoaWxkIHx8IGN1cnJlbnQubmV4dFNpYmxpbmcgfHwgY3VycmVudC5wYXJlbnROb2RlOwp9Cl9fbmFtZShuZXh0LCAibmV4dCIpOwp2YXIgcm9vdDUgPSB0eXBlb2Ygd2luZG93ICE9PSAidW5kZWZpbmVkIiA/IHdpbmRvdyA6IHt9OwpmdW5jdGlvbiBjYW5QYXJzZUhUTUxOYXRpdmVseSgpIHsKICB2YXIgUGFyc2VyMiA9IHJvb3Q1LkRPTVBhcnNlcjsKICB2YXIgY2FuUGFyc2UgPSBmYWxzZTsKICB0cnkgewogICAgaWYgKG5ldyBQYXJzZXIyKCkucGFyc2VGcm9tU3RyaW5nKCIiLCAidGV4dC9odG1sIikpIHsKICAgICAgY2FuUGFyc2UgPSB0cnVlOwogICAgfQogIH0gY2F0Y2ggKGUxMCkgewogIH0KICByZXR1cm4gY2FuUGFyc2U7Cn0KX19uYW1lKGNhblBhcnNlSFRNTE5hdGl2ZWx5LCAiY2FuUGFyc2VIVE1MTmF0aXZlbHkiKTsKZnVuY3Rpb24gY3JlYXRlSFRNTFBhcnNlcigpIHsKICB2YXIgUGFyc2VyMiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oKSB7CiAgfSwgIlBhcnNlciIpOwogIHsKICAgIGlmIChzaG91bGRVc2VBY3RpdmVYKCkpIHsKICAgICAgUGFyc2VyMi5wcm90b3R5cGUucGFyc2VGcm9tU3RyaW5nID0gZnVuY3Rpb24oc3RyaW5nMykgewogICAgICAgIHZhciBkb2MgPSBuZXcgd2luZG93LkFjdGl2ZVhPYmplY3QoImh0bWxmaWxlIik7CiAgICAgICAgZG9jLmRlc2lnbk1vZGUgPSAib24iOwogICAgICAgIGRvYy5vcGVuKCk7CiAgICAgICAgZG9jLndyaXRlKHN0cmluZzMpOwogICAgICAgIGRvYy5jbG9zZSgpOwogICAgICAgIHJldHVybiBkb2M7CiAgICAgIH07CiAgICB9IGVsc2UgewogICAgICBQYXJzZXIyLnByb3RvdHlwZS5wYXJzZUZyb21TdHJpbmcgPSBmdW5jdGlvbihzdHJpbmczKSB7CiAgICAgICAgdmFyIGRvYyA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIik7CiAgICAgICAgZG9jLm9wZW4oKTsKICAgICAgICBkb2Mud3JpdGUoc3RyaW5nMyk7CiAgICAgICAgZG9jLmNsb3NlKCk7CiAgICAgICAgcmV0dXJuIGRvYzsKICAgICAgfTsKICAgIH0KICB9CiAgcmV0dXJuIFBhcnNlcjI7Cn0KX19uYW1lKGNyZWF0ZUhUTUxQYXJzZXIsICJjcmVhdGVIVE1MUGFyc2VyIik7CmZ1bmN0aW9uIHNob3VsZFVzZUFjdGl2ZVgoKSB7CiAgdmFyIHVzZUFjdGl2ZVggPSBmYWxzZTsKICB0cnkgewogICAgZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCIiKS5vcGVuKCk7CiAgfSBjYXRjaCAoZTEwKSB7CiAgICBpZiAocm9vdDUuQWN0aXZlWE9iamVjdCkgdXNlQWN0aXZlWCA9IHRydWU7CiAgfQogIHJldHVybiB1c2VBY3RpdmVYOwp9Cl9fbmFtZShzaG91bGRVc2VBY3RpdmVYLCAic2hvdWxkVXNlQWN0aXZlWCIpOwp2YXIgSFRNTFBhcnNlciA9IGNhblBhcnNlSFRNTE5hdGl2ZWx5KCkgPyByb290NS5ET01QYXJzZXIgOiBjcmVhdGVIVE1MUGFyc2VyKCk7CmZ1bmN0aW9uIFJvb3ROb2RlKGlucHV0LCBvcHRpb25zKSB7CiAgdmFyIHJvb3Q2OwogIGlmICh0eXBlb2YgaW5wdXQgPT09ICJzdHJpbmciKSB7CiAgICB2YXIgZG9jID0gaHRtbFBhcnNlcigpLnBhcnNlRnJvbVN0cmluZygKICAgICAgLy8gRE9NIHBhcnNlcnMgYXJyYW5nZSBlbGVtZW50cyBpbiB0aGUgPGhlYWQ+IGFuZCA8Ym9keT4uCiAgICAgIC8vIFdyYXBwaW5nIGluIGEgY3VzdG9tIGVsZW1lbnQgZW5zdXJlcyBlbGVtZW50cyBhcmUgcmVsaWFibHkgYXJyYW5nZWQgaW4KICAgICAgLy8gYSBzaW5nbGUgZWxlbWVudC4KICAgICAgJzx4LXR1cm5kb3duIGlkPSJ0dXJuZG93bi1yb290Ij4nICsgaW5wdXQgKyAiPC94LXR1cm5kb3duPiIsCiAgICAgICJ0ZXh0L2h0bWwiCiAgICApOwogICAgcm9vdDYgPSBkb2MuZ2V0RWxlbWVudEJ5SWQoInR1cm5kb3duLXJvb3QiKTsKICB9IGVsc2UgewogICAgcm9vdDYgPSBpbnB1dC5jbG9uZU5vZGUodHJ1ZSk7CiAgfQogIGNvbGxhcHNlV2hpdGVzcGFjZSh7CiAgICBlbGVtZW50OiByb290NiwKICAgIGlzQmxvY2ssCiAgICBpc1ZvaWQsCiAgICBpc1ByZTogb3B0aW9ucy5wcmVmb3JtYXR0ZWRDb2RlID8gaXNQcmVPckNvZGUgOiBudWxsCiAgfSk7CiAgcmV0dXJuIHJvb3Q2Owp9Cl9fbmFtZShSb290Tm9kZSwgIlJvb3ROb2RlIik7CnZhciBfaHRtbFBhcnNlcjsKZnVuY3Rpb24gaHRtbFBhcnNlcigpIHsKICBfaHRtbFBhcnNlciA9IF9odG1sUGFyc2VyIHx8IG5ldyBIVE1MUGFyc2VyKCk7CiAgcmV0dXJuIF9odG1sUGFyc2VyOwp9Cl9fbmFtZShodG1sUGFyc2VyLCAiaHRtbFBhcnNlciIpOwpmdW5jdGlvbiBpc1ByZU9yQ29kZShub2RlMikgewogIHJldHVybiBub2RlMi5ub2RlTmFtZSA9PT0gIlBSRSIgfHwgbm9kZTIubm9kZU5hbWUgPT09ICJDT0RFIjsKfQpfX25hbWUoaXNQcmVPckNvZGUsICJpc1ByZU9yQ29kZSIpOwpmdW5jdGlvbiBOb2RlKG5vZGUyLCBvcHRpb25zKSB7CiAgbm9kZTIuaXNCbG9jayA9IGlzQmxvY2sobm9kZTIpOwogIG5vZGUyLmlzQ29kZSA9IG5vZGUyLm5vZGVOYW1lID09PSAiQ09ERSIgfHwgbm9kZTIucGFyZW50Tm9kZS5pc0NvZGU7CiAgbm9kZTIuaXNCbGFuayA9IGlzQmxhbmsobm9kZTIpOwogIG5vZGUyLmZsYW5raW5nV2hpdGVzcGFjZSA9IGZsYW5raW5nV2hpdGVzcGFjZShub2RlMiwgb3B0aW9ucyk7CiAgcmV0dXJuIG5vZGUyOwp9Cl9fbmFtZShOb2RlLCAiTm9kZSIpOwpmdW5jdGlvbiBpc0JsYW5rKG5vZGUyKSB7CiAgcmV0dXJuICFpc1ZvaWQobm9kZTIpICYmICFpc01lYW5pbmdmdWxXaGVuQmxhbmsobm9kZTIpICYmIC9eXHMqJC9pLnRlc3Qobm9kZTIudGV4dENvbnRlbnQpICYmICFoYXNWb2lkKG5vZGUyKSAmJiAhaGFzTWVhbmluZ2Z1bFdoZW5CbGFuayhub2RlMik7Cn0KX19uYW1lKGlzQmxhbmssICJpc0JsYW5rIik7CmZ1bmN0aW9uIGZsYW5raW5nV2hpdGVzcGFjZShub2RlMiwgb3B0aW9ucykgewogIGlmIChub2RlMi5pc0Jsb2NrIHx8IG9wdGlvbnMucHJlZm9ybWF0dGVkQ29kZSAmJiBub2RlMi5pc0NvZGUpIHsKICAgIHJldHVybiB7IGxlYWRpbmc6ICIiLCB0cmFpbGluZzogIiIgfTsKICB9CiAgdmFyIGVkZ2VzID0gZWRnZVdoaXRlc3BhY2Uobm9kZTIudGV4dENvbnRlbnQpOwogIGlmIChlZGdlcy5sZWFkaW5nQXNjaWkgJiYgaXNGbGFua2VkQnlXaGl0ZXNwYWNlKCJsZWZ0Iiwgbm9kZTIsIG9wdGlvbnMpKSB7CiAgICBlZGdlcy5sZWFkaW5nID0gZWRnZXMubGVhZGluZ05vbkFzY2lpOwogIH0KICBpZiAoZWRnZXMudHJhaWxpbmdBc2NpaSAmJiBpc0ZsYW5rZWRCeVdoaXRlc3BhY2UoInJpZ2h0Iiwgbm9kZTIsIG9wdGlvbnMpKSB7CiAgICBlZGdlcy50cmFpbGluZyA9IGVkZ2VzLnRyYWlsaW5nTm9uQXNjaWk7CiAgfQogIHJldHVybiB7IGxlYWRpbmc6IGVkZ2VzLmxlYWRpbmcsIHRyYWlsaW5nOiBlZGdlcy50cmFpbGluZyB9Owp9Cl9fbmFtZShmbGFua2luZ1doaXRlc3BhY2UsICJmbGFua2luZ1doaXRlc3BhY2UiKTsKZnVuY3Rpb24gZWRnZVdoaXRlc3BhY2Uoc3RyaW5nMykgewogIHZhciBtNSA9IHN0cmluZzMubWF0Y2goL14oKFsgXHRcclxuXSopKFxzKikpKD86KD89XFMpW1xzXFNdKlxTKT8oKFxzKj8pKFsgXHRcclxuXSopKSQvKTsKICByZXR1cm4gewogICAgbGVhZGluZzogbTVbMV0sCiAgICAvLyB3aG9sZSBzdHJpbmcgZm9yIHdoaXRlc3BhY2Utb25seSBzdHJpbmdzCiAgICBsZWFkaW5nQXNjaWk6IG01WzJdLAogICAgbGVhZGluZ05vbkFzY2lpOiBtNVszXSwKICAgIHRyYWlsaW5nOiBtNVs0XSwKICAgIC8vIGVtcHR5IGZvciB3aGl0ZXNwYWNlLW9ubHkgc3RyaW5ncwogICAgdHJhaWxpbmdOb25Bc2NpaTogbTVbNV0sCiAgICB0cmFpbGluZ0FzY2lpOiBtNVs2XQogIH07Cn0KX19uYW1lKGVkZ2VXaGl0ZXNwYWNlLCAiZWRnZVdoaXRlc3BhY2UiKTsKZnVuY3Rpb24gaXNGbGFua2VkQnlXaGl0ZXNwYWNlKHNpZGUsIG5vZGUyLCBvcHRpb25zKSB7CiAgdmFyIHNpYmxpbmc7CiAgdmFyIHJlZ0V4cDsKICB2YXIgaXNGbGFua2VkOwogIGlmIChzaWRlID09PSAibGVmdCIpIHsKICAgIHNpYmxpbmcgPSBub2RlMi5wcmV2aW91c1NpYmxpbmc7CiAgICByZWdFeHAgPSAvICQvOwogIH0gZWxzZSB7CiAgICBzaWJsaW5nID0gbm9kZTIubmV4dFNpYmxpbmc7CiAgICByZWdFeHAgPSAvXiAvOwogIH0KICBpZiAoc2libGluZykgewogICAgaWYgKHNpYmxpbmcubm9kZVR5cGUgPT09IDMpIHsKICAgICAgaXNGbGFua2VkID0gcmVnRXhwLnRlc3Qoc2libGluZy5ub2RlVmFsdWUpOwogICAgfSBlbHNlIGlmIChvcHRpb25zLnByZWZvcm1hdHRlZENvZGUgJiYgc2libGluZy5ub2RlTmFtZSA9PT0gIkNPREUiKSB7CiAgICAgIGlzRmxhbmtlZCA9IGZhbHNlOwogICAgfSBlbHNlIGlmIChzaWJsaW5nLm5vZGVUeXBlID09PSAxICYmICFpc0Jsb2NrKHNpYmxpbmcpKSB7CiAgICAgIGlzRmxhbmtlZCA9IHJlZ0V4cC50ZXN0KHNpYmxpbmcudGV4dENvbnRlbnQpOwogICAgfQogIH0KICByZXR1cm4gaXNGbGFua2VkOwp9Cl9fbmFtZShpc0ZsYW5rZWRCeVdoaXRlc3BhY2UsICJpc0ZsYW5rZWRCeVdoaXRlc3BhY2UiKTsKdmFyIHJlZHVjZTIgPSBBcnJheS5wcm90b3R5cGUucmVkdWNlOwp2YXIgZXNjYXBlcyA9IFsKICBbL1xcL2csICJcXFxcIl0sCiAgWy9cKi9nLCAiXFwqIl0sCiAgWy9eLS9nLCAiXFwtIl0sCiAgWy9eXCsgL2csICJcXCsgIl0sCiAgWy9eKD0rKS9nLCAiXFwkMSJdLAogIFsvXigjezEsNn0pIC9nLCAiXFwkMSAiXSwKICBbL2AvZywgIlxcYCJdLAogIFsvXn5+fi9nLCAiXFx+fn4iXSwKICBbL1xbL2csICJcXFsiXSwKICBbL1xdL2csICJcXF0iXSwKICBbL14+L2csICJcXD4iXSwKICBbL18vZywgIlxcXyJdLAogIFsvXihcZCspXC4gL2csICIkMVxcLiAiXQpdOwpmdW5jdGlvbiBUdXJuZG93blNlcnZpY2Uob3B0aW9ucykgewogIGlmICghKHRoaXMgaW5zdGFuY2VvZiBUdXJuZG93blNlcnZpY2UpKSByZXR1cm4gbmV3IFR1cm5kb3duU2VydmljZShvcHRpb25zKTsKICB2YXIgZGVmYXVsdHMgPSB7CiAgICBydWxlcywKICAgIGhlYWRpbmdTdHlsZTogInNldGV4dCIsCiAgICBocjogIiogKiAqIiwKICAgIGJ1bGxldExpc3RNYXJrZXI6ICIqIiwKICAgIGNvZGVCbG9ja1N0eWxlOiAiaW5kZW50ZWQiLAogICAgZmVuY2U6ICJgYGAiLAogICAgZW1EZWxpbWl0ZXI6ICJfIiwKICAgIHN0cm9uZ0RlbGltaXRlcjogIioqIiwKICAgIGxpbmtTdHlsZTogImlubGluZWQiLAogICAgbGlua1JlZmVyZW5jZVN0eWxlOiAiZnVsbCIsCiAgICBicjogIiAgIiwKICAgIHByZWZvcm1hdHRlZENvZGU6IGZhbHNlLAogICAgYmxhbmtSZXBsYWNlbWVudDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihjb250ZW50Mywgbm9kZTIpIHsKICAgICAgcmV0dXJuIG5vZGUyLmlzQmxvY2sgPyAiXG5cbiIgOiAiIjsKICAgIH0sICJibGFua1JlcGxhY2VtZW50IiksCiAgICBrZWVwUmVwbGFjZW1lbnQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oY29udGVudDMsIG5vZGUyKSB7CiAgICAgIHJldHVybiBub2RlMi5pc0Jsb2NrID8gIlxuXG4iICsgbm9kZTIub3V0ZXJIVE1MICsgIlxuXG4iIDogbm9kZTIub3V0ZXJIVE1MOwogICAgfSwgImtlZXBSZXBsYWNlbWVudCIpLAogICAgZGVmYXVsdFJlcGxhY2VtZW50OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGNvbnRlbnQzLCBub2RlMikgewogICAgICByZXR1cm4gbm9kZTIuaXNCbG9jayA/ICJcblxuIiArIGNvbnRlbnQzICsgIlxuXG4iIDogY29udGVudDM7CiAgICB9LCAiZGVmYXVsdFJlcGxhY2VtZW50IikKICB9OwogIHRoaXMub3B0aW9ucyA9IGV4dGVuZDIoe30sIGRlZmF1bHRzLCBvcHRpb25zKTsKICB0aGlzLnJ1bGVzID0gbmV3IFJ1bGVzKHRoaXMub3B0aW9ucyk7Cn0KX19uYW1lKFR1cm5kb3duU2VydmljZSwgIlR1cm5kb3duU2VydmljZSIpOwpUdXJuZG93blNlcnZpY2UucHJvdG90eXBlID0gewogIC8qKgogICAqIFRoZSBlbnRyeSBwb2ludCBmb3IgY29udmVydGluZyBhIHN0cmluZyBvciBET00gbm9kZSB0byBNYXJrZG93bgogICAqIEBwdWJsaWMKICAgKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudH0gaW5wdXQgVGhlIHN0cmluZyBvciBET00gbm9kZSB0byBjb252ZXJ0CiAgICogQHJldHVybnMgQSBNYXJrZG93biByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5wdXQKICAgKiBAdHlwZSBTdHJpbmcKICAgKi8KICB0dXJuZG93bjogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihpbnB1dCkgewogICAgaWYgKCFjYW5Db252ZXJ0KGlucHV0KSkgewogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKAogICAgICAgIGlucHV0ICsgIiBpcyBub3QgYSBzdHJpbmcsIG9yIGFuIGVsZW1lbnQvZG9jdW1lbnQvZnJhZ21lbnQgbm9kZS4iCiAgICAgICk7CiAgICB9CiAgICBpZiAoaW5wdXQgPT09ICIiKSByZXR1cm4gIiI7CiAgICB2YXIgb3V0cHV0ID0gcHJvY2VzczMuY2FsbCh0aGlzLCBuZXcgUm9vdE5vZGUoaW5wdXQsIHRoaXMub3B0aW9ucykpOwogICAgcmV0dXJuIHBvc3RQcm9jZXNzLmNhbGwodGhpcywgb3V0cHV0KTsKICB9LCAidHVybmRvd24iKSwKICAvKioKICAgKiBBZGQgb25lIG9yIG1vcmUgcGx1Z2lucwogICAqIEBwdWJsaWMKICAgKiBAcGFyYW0ge0Z1bmN0aW9ufEFycmF5fSBwbHVnaW4gVGhlIHBsdWdpbiBvciBhcnJheSBvZiBwbHVnaW5zIHRvIGFkZAogICAqIEByZXR1cm5zIFRoZSBUdXJuZG93biBpbnN0YW5jZSBmb3IgY2hhaW5pbmcKICAgKiBAdHlwZSBPYmplY3QKICAgKi8KICB1c2U6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24ocGx1Z2luKSB7CiAgICBpZiAoQXJyYXkuaXNBcnJheShwbHVnaW4pKSB7CiAgICAgIGZvciAodmFyIGkxMCA9IDA7IGkxMCA8IHBsdWdpbi5sZW5ndGg7IGkxMCsrKSB0aGlzLnVzZShwbHVnaW5baTEwXSk7CiAgICB9IGVsc2UgaWYgKHR5cGVvZiBwbHVnaW4gPT09ICJmdW5jdGlvbiIpIHsKICAgICAgcGx1Z2luKHRoaXMpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigicGx1Z2luIG11c3QgYmUgYSBGdW5jdGlvbiBvciBhbiBBcnJheSBvZiBGdW5jdGlvbnMiKTsKICAgIH0KICAgIHJldHVybiB0aGlzOwogIH0sICJ1c2UiKSwKICAvKioKICAgKiBBZGRzIGEgcnVsZQogICAqIEBwdWJsaWMKICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IFRoZSB1bmlxdWUga2V5IG9mIHRoZSBydWxlCiAgICogQHBhcmFtIHtPYmplY3R9IHJ1bGUgVGhlIHJ1bGUKICAgKiBAcmV0dXJucyBUaGUgVHVybmRvd24gaW5zdGFuY2UgZm9yIGNoYWluaW5nCiAgICogQHR5cGUgT2JqZWN0CiAgICovCiAgYWRkUnVsZTogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihrZXkyLCBydWxlKSB7CiAgICB0aGlzLnJ1bGVzLmFkZChrZXkyLCBydWxlKTsKICAgIHJldHVybiB0aGlzOwogIH0sICJhZGRSdWxlIiksCiAgLyoqCiAgICogS2VlcCBhIG5vZGUgKGFzIEhUTUwpIHRoYXQgbWF0Y2hlcyB0aGUgZmlsdGVyCiAgICogQHB1YmxpYwogICAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fEZ1bmN0aW9ufSBmaWx0ZXIgVGhlIHVuaXF1ZSBrZXkgb2YgdGhlIHJ1bGUKICAgKiBAcmV0dXJucyBUaGUgVHVybmRvd24gaW5zdGFuY2UgZm9yIGNoYWluaW5nCiAgICogQHR5cGUgT2JqZWN0CiAgICovCiAga2VlcDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihmaWx0ZXIyKSB7CiAgICB0aGlzLnJ1bGVzLmtlZXAoZmlsdGVyMik7CiAgICByZXR1cm4gdGhpczsKICB9LCAia2VlcCIpLAogIC8qKgogICAqIFJlbW92ZSBhIG5vZGUgdGhhdCBtYXRjaGVzIHRoZSBmaWx0ZXIKICAgKiBAcHVibGljCiAgICogQHBhcmFtIHtTdHJpbmd8QXJyYXl8RnVuY3Rpb259IGZpbHRlciBUaGUgdW5pcXVlIGtleSBvZiB0aGUgcnVsZQogICAqIEByZXR1cm5zIFRoZSBUdXJuZG93biBpbnN0YW5jZSBmb3IgY2hhaW5pbmcKICAgKiBAdHlwZSBPYmplY3QKICAgKi8KICByZW1vdmU6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oZmlsdGVyMikgewogICAgdGhpcy5ydWxlcy5yZW1vdmUoZmlsdGVyMik7CiAgICByZXR1cm4gdGhpczsKICB9LCAicmVtb3ZlIiksCiAgLyoqCiAgICogRXNjYXBlcyBNYXJrZG93biBzeW50YXgKICAgKiBAcHVibGljCiAgICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGVzY2FwZQogICAqIEByZXR1cm5zIEEgc3RyaW5nIHdpdGggTWFya2Rvd24gc3ludGF4IGVzY2FwZWQKICAgKiBAdHlwZSBTdHJpbmcKICAgKi8KICBlc2NhcGU6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oc3RyaW5nMykgewogICAgcmV0dXJuIGVzY2FwZXMucmVkdWNlKGZ1bmN0aW9uKGFjY3VtdWxhdG9yLCBlc2NhcGUpIHsKICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yLnJlcGxhY2UoZXNjYXBlWzBdLCBlc2NhcGVbMV0pOwogICAgfSwgc3RyaW5nMyk7CiAgfSwgImVzY2FwZSIpCn07CmZ1bmN0aW9uIHByb2Nlc3MzKHBhcmVudE5vZGUpIHsKICB2YXIgc2VsZjIgPSB0aGlzOwogIHJldHVybiByZWR1Y2UyLmNhbGwocGFyZW50Tm9kZS5jaGlsZE5vZGVzLCBmdW5jdGlvbihvdXRwdXQsIG5vZGUyKSB7CiAgICBub2RlMiA9IG5ldyBOb2RlKG5vZGUyLCBzZWxmMi5vcHRpb25zKTsKICAgIHZhciByZXBsYWNlbWVudCA9ICIiOwogICAgaWYgKG5vZGUyLm5vZGVUeXBlID09PSAzKSB7CiAgICAgIHJlcGxhY2VtZW50ID0gbm9kZTIuaXNDb2RlID8gbm9kZTIubm9kZVZhbHVlIDogc2VsZjIuZXNjYXBlKG5vZGUyLm5vZGVWYWx1ZSk7CiAgICB9IGVsc2UgaWYgKG5vZGUyLm5vZGVUeXBlID09PSAxKSB7CiAgICAgIHJlcGxhY2VtZW50ID0gcmVwbGFjZW1lbnRGb3JOb2RlLmNhbGwoc2VsZjIsIG5vZGUyKTsKICAgIH0KICAgIHJldHVybiBqb2luMyhvdXRwdXQsIHJlcGxhY2VtZW50KTsKICB9LCAiIik7Cn0KX19uYW1lKHByb2Nlc3MzLCAicHJvY2VzcyIpOwpmdW5jdGlvbiBwb3N0UHJvY2VzcyhvdXRwdXQpIHsKICB2YXIgc2VsZjIgPSB0aGlzOwogIHRoaXMucnVsZXMuZm9yRWFjaChmdW5jdGlvbihydWxlKSB7CiAgICBpZiAodHlwZW9mIHJ1bGUuYXBwZW5kID09PSAiZnVuY3Rpb24iKSB7CiAgICAgIG91dHB1dCA9IGpvaW4zKG91dHB1dCwgcnVsZS5hcHBlbmQoc2VsZjIub3B0aW9ucykpOwogICAgfQogIH0pOwogIHJldHVybiBvdXRwdXQucmVwbGFjZSgvXltcdFxyXG5dKy8sICIiKS5yZXBsYWNlKC9bXHRcclxuXHNdKyQvLCAiIik7Cn0KX19uYW1lKHBvc3RQcm9jZXNzLCAicG9zdFByb2Nlc3MiKTsKZnVuY3Rpb24gcmVwbGFjZW1lbnRGb3JOb2RlKG5vZGUyKSB7CiAgdmFyIHJ1bGUgPSB0aGlzLnJ1bGVzLmZvck5vZGUobm9kZTIpOwogIHZhciBjb250ZW50MyA9IHByb2Nlc3MzLmNhbGwodGhpcywgbm9kZTIpOwogIHZhciB3aGl0ZXNwYWNlMiA9IG5vZGUyLmZsYW5raW5nV2hpdGVzcGFjZTsKICBpZiAod2hpdGVzcGFjZTIubGVhZGluZyB8fCB3aGl0ZXNwYWNlMi50cmFpbGluZykgY29udGVudDMgPSBjb250ZW50My50cmltKCk7CiAgcmV0dXJuIHdoaXRlc3BhY2UyLmxlYWRpbmcgKyBydWxlLnJlcGxhY2VtZW50KGNvbnRlbnQzLCBub2RlMiwgdGhpcy5vcHRpb25zKSArIHdoaXRlc3BhY2UyLnRyYWlsaW5nOwp9Cl9fbmFtZShyZXBsYWNlbWVudEZvck5vZGUsICJyZXBsYWNlbWVudEZvck5vZGUiKTsKZnVuY3Rpb24gam9pbjMob3V0cHV0LCByZXBsYWNlbWVudCkgewogIHZhciBzMSA9IHRyaW1UcmFpbGluZ05ld2xpbmVzKG91dHB1dCk7CiAgdmFyIHMyMiA9IHRyaW1MZWFkaW5nTmV3bGluZXMocmVwbGFjZW1lbnQpOwogIHZhciBubHMgPSBNYXRoLm1heChvdXRwdXQubGVuZ3RoIC0gczEubGVuZ3RoLCByZXBsYWNlbWVudC5sZW5ndGggLSBzMjIubGVuZ3RoKTsKICB2YXIgc2VwYXJhdG9yID0gIlxuXG4iLnN1YnN0cmluZygwLCBubHMpOwogIHJldHVybiBzMSArIHNlcGFyYXRvciArIHMyMjsKfQpfX25hbWUoam9pbjMsICJqb2luIik7CmZ1bmN0aW9uIGNhbkNvbnZlcnQoaW5wdXQpIHsKICByZXR1cm4gaW5wdXQgIT0gbnVsbCAmJiAodHlwZW9mIGlucHV0ID09PSAic3RyaW5nIiB8fCBpbnB1dC5ub2RlVHlwZSAmJiAoaW5wdXQubm9kZVR5cGUgPT09IDEgfHwgaW5wdXQubm9kZVR5cGUgPT09IDkgfHwgaW5wdXQubm9kZVR5cGUgPT09IDExKSk7Cn0KX19uYW1lKGNhbkNvbnZlcnQsICJjYW5Db252ZXJ0Iik7CnZhciB0dXJuZG93bl9icm93c2VyX2VzX2RlZmF1bHQgPSBUdXJuZG93blNlcnZpY2U7CgovLyBub2RlX21vZHVsZXMvLnBucG0vdHVybmRvd24tcGx1Z2luLWdmbUAxLjAuMi9ub2RlX21vZHVsZXMvdHVybmRvd24tcGx1Z2luLWdmbS9saWIvdHVybmRvd24tcGx1Z2luLWdmbS5lcy5qcwp2YXIgdHVybmRvd25fcGx1Z2luX2dmbV9lc19leHBvcnRzID0ge307Cl9fZXhwb3J0KHR1cm5kb3duX3BsdWdpbl9nZm1fZXNfZXhwb3J0cywgewogIGdmbTogKCkgPT4gZ2ZtMiwKICBoaWdobGlnaHRlZENvZGVCbG9jazogKCkgPT4gaGlnaGxpZ2h0ZWRDb2RlQmxvY2ssCiAgc3RyaWtldGhyb3VnaDogKCkgPT4gc3RyaWtldGhyb3VnaDIsCiAgdGFibGVzOiAoKSA9PiB0YWJsZXMsCiAgdGFza0xpc3RJdGVtczogKCkgPT4gdGFza0xpc3RJdGVtcwp9KTsKdmFyIGhpZ2hsaWdodFJlZ0V4cCA9IC9oaWdobGlnaHQtKD86dGV4dHxzb3VyY2UpLShbYS16MC05XSspLzsKZnVuY3Rpb24gaGlnaGxpZ2h0ZWRDb2RlQmxvY2sodHVybmRvd25TZXJ2aWNlKSB7CiAgdHVybmRvd25TZXJ2aWNlLmFkZFJ1bGUoImhpZ2hsaWdodGVkQ29kZUJsb2NrIiwgewogICAgZmlsdGVyOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKG5vZGUyKSB7CiAgICAgIHZhciBmaXJzdENoaWxkID0gbm9kZTIuZmlyc3RDaGlsZDsKICAgICAgcmV0dXJuIG5vZGUyLm5vZGVOYW1lID09PSAiRElWIiAmJiBoaWdobGlnaHRSZWdFeHAudGVzdChub2RlMi5jbGFzc05hbWUpICYmIGZpcnN0Q2hpbGQgJiYgZmlyc3RDaGlsZC5ub2RlTmFtZSA9PT0gIlBSRSI7CiAgICB9LCAiZmlsdGVyIiksCiAgICByZXBsYWNlbWVudDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihjb250ZW50Mywgbm9kZTIsIG9wdGlvbnMpIHsKICAgICAgdmFyIGNsYXNzTmFtZSA9IG5vZGUyLmNsYXNzTmFtZSB8fCAiIjsKICAgICAgdmFyIGxhbmd1YWdlID0gKGNsYXNzTmFtZS5tYXRjaChoaWdobGlnaHRSZWdFeHApIHx8IFtudWxsLCAiIl0pWzFdOwogICAgICByZXR1cm4gIlxuXG4iICsgb3B0aW9ucy5mZW5jZSArIGxhbmd1YWdlICsgIlxuIiArIG5vZGUyLmZpcnN0Q2hpbGQudGV4dENvbnRlbnQgKyAiXG4iICsgb3B0aW9ucy5mZW5jZSArICJcblxuIjsKICAgIH0sICJyZXBsYWNlbWVudCIpCiAgfSk7Cn0KX19uYW1lKGhpZ2hsaWdodGVkQ29kZUJsb2NrLCAiaGlnaGxpZ2h0ZWRDb2RlQmxvY2siKTsKZnVuY3Rpb24gc3RyaWtldGhyb3VnaDIodHVybmRvd25TZXJ2aWNlKSB7CiAgdHVybmRvd25TZXJ2aWNlLmFkZFJ1bGUoInN0cmlrZXRocm91Z2giLCB7CiAgICBmaWx0ZXI6IFsiZGVsIiwgInMiLCAic3RyaWtlIl0sCiAgICByZXBsYWNlbWVudDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihjb250ZW50MykgewogICAgICByZXR1cm4gIn4iICsgY29udGVudDMgKyAifiI7CiAgICB9LCAicmVwbGFjZW1lbnQiKQogIH0pOwp9Cl9fbmFtZShzdHJpa2V0aHJvdWdoMiwgInN0cmlrZXRocm91Z2giKTsKdmFyIGluZGV4T2YyID0gQXJyYXkucHJvdG90eXBlLmluZGV4T2Y7CnZhciBldmVyeTIgPSBBcnJheS5wcm90b3R5cGUuZXZlcnk7CnZhciBydWxlczIgPSB7fTsKcnVsZXMyLnRhYmxlQ2VsbCA9IHsKICBmaWx0ZXI6IFsidGgiLCAidGQiXSwKICByZXBsYWNlbWVudDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihjb250ZW50Mywgbm9kZTIpIHsKICAgIHJldHVybiBjZWxsKGNvbnRlbnQzLCBub2RlMik7CiAgfSwgInJlcGxhY2VtZW50IikKfTsKcnVsZXMyLnRhYmxlUm93ID0gewogIGZpbHRlcjogInRyIiwKICByZXBsYWNlbWVudDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihjb250ZW50Mywgbm9kZTIpIHsKICAgIHZhciBib3JkZXJDZWxscyA9ICIiOwogICAgdmFyIGFsaWduTWFwID0geyBsZWZ0OiAiOi0tIiwgcmlnaHQ6ICItLToiLCBjZW50ZXI6ICI6LToiIH07CiAgICBpZiAoaXNIZWFkaW5nUm93KG5vZGUyKSkgewogICAgICBmb3IgKHZhciBpMTAgPSAwOyBpMTAgPCBub2RlMi5jaGlsZE5vZGVzLmxlbmd0aDsgaTEwKyspIHsKICAgICAgICB2YXIgYm9yZGVyID0gIi0tLSI7CiAgICAgICAgdmFyIGFsaWduID0gKG5vZGUyLmNoaWxkTm9kZXNbaTEwXS5nZXRBdHRyaWJ1dGUoImFsaWduIikgfHwgIiIpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgaWYgKGFsaWduKSBib3JkZXIgPSBhbGlnbk1hcFthbGlnbl0gfHwgYm9yZGVyOwogICAgICAgIGJvcmRlckNlbGxzICs9IGNlbGwoYm9yZGVyLCBub2RlMi5jaGlsZE5vZGVzW2kxMF0pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gIlxuIiArIGNvbnRlbnQzICsgKGJvcmRlckNlbGxzID8gIlxuIiArIGJvcmRlckNlbGxzIDogIiIpOwogIH0sICJyZXBsYWNlbWVudCIpCn07CnJ1bGVzMi50YWJsZSA9IHsKICAvLyBPbmx5IGNvbnZlcnQgdGFibGVzIHdpdGggYSBoZWFkaW5nIHJvdy4KICAvLyBUYWJsZXMgd2l0aCBubyBoZWFkaW5nIHJvdyBhcmUga2VwdCB1c2luZyBga2VlcGAgKHNlZSBiZWxvdykuCiAgZmlsdGVyOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKG5vZGUyKSB7CiAgICByZXR1cm4gbm9kZTIubm9kZU5hbWUgPT09ICJUQUJMRSIgJiYgaXNIZWFkaW5nUm93KG5vZGUyLnJvd3NbMF0pOwogIH0sICJmaWx0ZXIiKSwKICByZXBsYWNlbWVudDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihjb250ZW50MykgewogICAgY29udGVudDMgPSBjb250ZW50My5yZXBsYWNlKCJcblxuIiwgIlxuIik7CiAgICByZXR1cm4gIlxuXG4iICsgY29udGVudDMgKyAiXG5cbiI7CiAgfSwgInJlcGxhY2VtZW50IikKfTsKcnVsZXMyLnRhYmxlU2VjdGlvbiA9IHsKICBmaWx0ZXI6IFsidGhlYWQiLCAidGJvZHkiLCAidGZvb3QiXSwKICByZXBsYWNlbWVudDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihjb250ZW50MykgewogICAgcmV0dXJuIGNvbnRlbnQzOwogIH0sICJyZXBsYWNlbWVudCIpCn07CmZ1bmN0aW9uIGlzSGVhZGluZ1Jvdyh0cjIpIHsKICB2YXIgcGFyZW50Tm9kZSA9IHRyMi5wYXJlbnROb2RlOwogIHJldHVybiBwYXJlbnROb2RlLm5vZGVOYW1lID09PSAiVEhFQUQiIHx8IHBhcmVudE5vZGUuZmlyc3RDaGlsZCA9PT0gdHIyICYmIChwYXJlbnROb2RlLm5vZGVOYW1lID09PSAiVEFCTEUiIHx8IGlzRmlyc3RUYm9keShwYXJlbnROb2RlKSkgJiYgZXZlcnkyLmNhbGwodHIyLmNoaWxkTm9kZXMsIGZ1bmN0aW9uKG4xMSkgewogICAgcmV0dXJuIG4xMS5ub2RlTmFtZSA9PT0gIlRIIjsKICB9KTsKfQpfX25hbWUoaXNIZWFkaW5nUm93LCAiaXNIZWFkaW5nUm93Iik7CmZ1bmN0aW9uIGlzRmlyc3RUYm9keShlbGVtZW50NCkgewogIHZhciBwcmV2aW91c1NpYmxpbmcgPSBlbGVtZW50NC5wcmV2aW91c1NpYmxpbmc7CiAgcmV0dXJuIGVsZW1lbnQ0Lm5vZGVOYW1lID09PSAiVEJPRFkiICYmICghcHJldmlvdXNTaWJsaW5nIHx8IHByZXZpb3VzU2libGluZy5ub2RlTmFtZSA9PT0gIlRIRUFEIiAmJiAvXlxzKiQvaS50ZXN0KHByZXZpb3VzU2libGluZy50ZXh0Q29udGVudCkpOwp9Cl9fbmFtZShpc0ZpcnN0VGJvZHksICJpc0ZpcnN0VGJvZHkiKTsKZnVuY3Rpb24gY2VsbChjb250ZW50Mywgbm9kZTIpIHsKICB2YXIgaW5kZXgyID0gaW5kZXhPZjIuY2FsbChub2RlMi5wYXJlbnROb2RlLmNoaWxkTm9kZXMsIG5vZGUyKTsKICB2YXIgcHJlZml4ID0gIiAiOwogIGlmIChpbmRleDIgPT09IDApIHByZWZpeCA9ICJ8ICI7CiAgcmV0dXJuIHByZWZpeCArIGNvbnRlbnQzICsgIiB8IjsKfQpfX25hbWUoY2VsbCwgImNlbGwiKTsKZnVuY3Rpb24gdGFibGVzKHR1cm5kb3duU2VydmljZSkgewogIHR1cm5kb3duU2VydmljZS5rZWVwKGZ1bmN0aW9uKG5vZGUyKSB7CiAgICByZXR1cm4gbm9kZTIubm9kZU5hbWUgPT09ICJUQUJMRSIgJiYgIWlzSGVhZGluZ1Jvdyhub2RlMi5yb3dzWzBdKTsKICB9KTsKICBmb3IgKHZhciBrZXkyIGluIHJ1bGVzMikgdHVybmRvd25TZXJ2aWNlLmFkZFJ1bGUoa2V5MiwgcnVsZXMyW2tleTJdKTsKfQpfX25hbWUodGFibGVzLCAidGFibGVzIik7CmZ1bmN0aW9uIHRhc2tMaXN0SXRlbXModHVybmRvd25TZXJ2aWNlKSB7CiAgdHVybmRvd25TZXJ2aWNlLmFkZFJ1bGUoInRhc2tMaXN0SXRlbXMiLCB7CiAgICBmaWx0ZXI6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24obm9kZTIpIHsKICAgICAgcmV0dXJuIG5vZGUyLnR5cGUgPT09ICJjaGVja2JveCIgJiYgbm9kZTIucGFyZW50Tm9kZS5ub2RlTmFtZSA9PT0gIkxJIjsKICAgIH0sICJmaWx0ZXIiKSwKICAgIHJlcGxhY2VtZW50OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGNvbnRlbnQzLCBub2RlMikgewogICAgICByZXR1cm4gKG5vZGUyLmNoZWNrZWQgPyAiW3hdIiA6ICJbIF0iKSArICIgIjsKICAgIH0sICJyZXBsYWNlbWVudCIpCiAgfSk7Cn0KX19uYW1lKHRhc2tMaXN0SXRlbXMsICJ0YXNrTGlzdEl0ZW1zIik7CmZ1bmN0aW9uIGdmbTIodHVybmRvd25TZXJ2aWNlKSB7CiAgdHVybmRvd25TZXJ2aWNlLnVzZShbCiAgICBoaWdobGlnaHRlZENvZGVCbG9jaywKICAgIHN0cmlrZXRocm91Z2gyLAogICAgdGFibGVzLAogICAgdGFza0xpc3RJdGVtcwogIF0pOwp9Cl9fbmFtZShnZm0yLCAiZ2ZtIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRtYXJrZG93bkAzLjAuMy9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRtYXJrZG93bi9kaXN0X3RzL3NtYXJ0bWFya2Rvd24ucGx1Z2lucy5qcwp2YXIgc21hcnR5YW1sID0gX190b0VTTShyZXF1aXJlX2Rpc3RfdHMyKCksIDEpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0bWFya2Rvd25AMy4wLjMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0bWFya2Rvd24vZGlzdF90cy9zbWFydG1hcmtkb3duLmNsYXNzZXMubWRwYXJzZWRyZXN1bHQuanMKdmFyIE1kUGFyc2VkUmVzdWx0ID0gY2xhc3MgX01kUGFyc2VkUmVzdWx0IHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJNZFBhcnNlZFJlc3VsdCIpOwogIH0KICBzdGF0aWMgYXN5bmMgY3JlYXRlRnJvbU1hcmtkb3duU3RyaW5nKG1kU3RyaW5nQXJnKSB7CiAgICBjb25zdCBtZFBhcnNlZFJlc3VsdCA9IG5ldyBfTWRQYXJzZWRSZXN1bHQoKTsKICAgIGF3YWl0IG1kUGFyc2VkUmVzdWx0LnVwZGF0ZUZyb21NYXJrZG93blN0cmluZyhtZFN0cmluZ0FyZyk7CiAgICByZXR1cm4gbWRQYXJzZWRSZXN1bHQ7CiAgfQogIGFzeW5jIHVwZGF0ZUZyb21NYXJrZG93blN0cmluZyhtZFN0cmluZ0FyZykgewogICAgbGV0IHlhbWxTdHJpbmc7CiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB1bmlmaWVkKCkudXNlKHJlbWFya1BhcnNlKS51c2UocmVtYXJrR2ZtKS51c2UocmVtYXJrRnJvbnRtYXR0ZXIsIFsieWFtbCIsICJ0b21sIl0pLnVzZShyZW1hcmtTdHJpbmdpZnkpLnVzZShyZW1hcmtIdG1sKS51c2UoKCkgPT4gKHRyZWUpID0+IHsKICAgICAgY29uc29sZS5kaXIodHJlZSk7CiAgICAgIGNvbnN0IHlhbWxDaGlsZCA9IHRyZWUuY2hpbGRyZW4uZmluZCgob2JqZWN0QXJnKSA9PiBvYmplY3RBcmcudHlwZSA9PT0gInlhbWwiKTsKICAgICAgaWYgKHlhbWxDaGlsZCkgewogICAgICAgIHlhbWxTdHJpbmcgPSB5YW1sQ2hpbGQudmFsdWU7CiAgICAgIH0KICAgIH0pLnByb2Nlc3MobWRTdHJpbmdBcmcpOwogICAgdGhpcy5odG1sID0gcmVzdWx0LnRvU3RyaW5nKCk7CiAgICBpZiAoeWFtbFN0cmluZykgewogICAgICB0aGlzLmZyb250bWF0dGVyRGF0YSA9IGF3YWl0IHNtYXJ0eWFtbC55YW1sU3RyaW5nVG9PYmplY3QoeWFtbFN0cmluZyk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmZyb250bWF0dGVyRGF0YSA9IHt9OwogICAgfQogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydG1hcmtkb3duQDMuMC4zL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydG1hcmtkb3duL2Rpc3RfdHMvaW5kZXguanMKdmFyIFNtYXJ0TWFya2Rvd24gPSBjbGFzcyBfU21hcnRNYXJrZG93biB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiU21hcnRNYXJrZG93biIpOwogIH0KICBzdGF0aWMgYXN5bmMgZWFzeU1hcmtkb3duVG9IdG1sKG1kU3RyaW5nQXJnKSB7CiAgICBjb25zdCBzbWFydG1hcmtkb3duSW5zdGFuY2UgPSBuZXcgX1NtYXJ0TWFya2Rvd24oKTsKICAgIGNvbnN0IG1kUGFyc2VkUmVzdWx0ID0gYXdhaXQgc21hcnRtYXJrZG93bkluc3RhbmNlLmdldE1kUGFyc2VkUmVzdWx0RnJvbU1hcmtkb3duKG1kU3RyaW5nQXJnKTsKICAgIHJldHVybiBtZFBhcnNlZFJlc3VsdC5odG1sOwogIH0KICBjb25zdHJ1Y3RvcigpIHsKICB9CiAgLyoqCiAgICogY3JlYXRlIGEgTWRQYXJzZWRSZXN1bHQgZnJvbSBtYXJrZG93bgogICAqIEBwYXJhbSBtZFN0cmluZ0FyZwogICAqLwogIGFzeW5jIGdldE1kUGFyc2VkUmVzdWx0RnJvbU1hcmtkb3duKG1kU3RyaW5nQXJnKSB7CiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBNZFBhcnNlZFJlc3VsdC5jcmVhdGVGcm9tTWFya2Rvd25TdHJpbmcobWRTdHJpbmdBcmcpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CiAgaHRtbFRvTWFya2Rvd24oaHRtbFN0cmluZykgewogICAgY29uc3QgdHVybmRvd25JbnN0YW5jZSA9IG5ldyB0dXJuZG93bl9icm93c2VyX2VzX2RlZmF1bHQoewogICAgICBoZWFkaW5nU3R5bGU6ICJhdHgiLAogICAgICBjb2RlQmxvY2tTdHlsZTogImZlbmNlZCIKICAgIH0pOwogICAgdHVybmRvd25JbnN0YW5jZS51c2UodHVybmRvd25fcGx1Z2luX2dmbV9lc19leHBvcnRzLmdmbSk7CiAgICByZXR1cm4gdHVybmRvd25JbnN0YW5jZS50dXJuZG93bihodG1sU3RyaW5nKTsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRyb3V0ZXJAMS4zLjMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0cm91dGVyL2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czE4ID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czE4LCB7CiAgU21hcnRSb3V0ZXI6ICgpID0+IFNtYXJ0Um91dGVyCn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0cm91dGVyQDEuMy4zL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHJvdXRlci9kaXN0X3RzL3NtYXJ0cm91dGVyLnBsdWdpbnMuanMKdmFyIHBhdGhUb1JlZ0V4cCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0cm91dGVyQDEuMy4zL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHJvdXRlci9kaXN0X3RzL3NtYXJ0cm91dGVyLmNsYXNzZXMucXVlcnlwYXJhbXMuanMKdmFyIFF1ZXJ5UGFyYW1zID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlF1ZXJ5UGFyYW1zIik7CiAgfQogIGNvbnN0cnVjdG9yKCkgewogIH0KICBnZXRBbGxBc09iamVjdCgpIHsKICAgIGNvbnN0IHVybFNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7CiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKHVybFNlYXJjaFBhcmFtcy5lbnRyaWVzKCkpOwogIH0KICBzZXRRdWVyeVBhcmFtKHF1ZXJ5S2V5QXJnLCBxdWVyeUNvbnRlbnRBcmcsIHB1c2hPclJlcGxhY2VBcmcgPSAicmVwbGFjZSIpIHsKICAgIHZhciBxdWVyeVBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7CiAgICBxdWVyeVBhcmFtcy5zZXQocXVlcnlLZXlBcmcsIHF1ZXJ5Q29udGVudEFyZyk7CiAgICBwdXNoT3JSZXBsYWNlQXJnID09PSAicHVzaCIgPyBoaXN0b3J5LnB1c2hTdGF0ZShudWxsLCBudWxsLCAiPyIgKyBxdWVyeVBhcmFtcy50b1N0cmluZygpKSA6IGhpc3RvcnkucmVwbGFjZVN0YXRlKG51bGwsIG51bGwsICI/IiArIHF1ZXJ5UGFyYW1zLnRvU3RyaW5nKCkpOwogIH0KICBkZWxldGVRdWVyeVBhcmFtKHF1ZXJ5S2V5QXJnLCBwdXNoT3JSZXBsYWNlQXJnID0gInJlcGxhY2UiKSB7CiAgICB2YXIgcXVlcnlQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpOwogICAgcXVlcnlQYXJhbXMuZGVsZXRlKHF1ZXJ5S2V5QXJnKTsKICAgIHB1c2hPclJlcGxhY2VBcmcgPT09ICJwdXNoIiA/IGhpc3RvcnkucHVzaFN0YXRlKG51bGwsIG51bGwsICI/IiArIHF1ZXJ5UGFyYW1zLnRvU3RyaW5nKCkpIDogaGlzdG9yeS5yZXBsYWNlU3RhdGUobnVsbCwgbnVsbCwgIj8iICsgcXVlcnlQYXJhbXMudG9TdHJpbmcoKSk7CiAgfQogIGdldFF1ZXJ5UGFyYW0ocXVlcnlQYXJhbU5hbWUpIHsKICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gdGhpcy5nZXRBbGxBc09iamVjdCgpOwogICAgcmV0dXJuIHF1ZXJ5UGFyYW1zW3F1ZXJ5UGFyYW1OYW1lXTsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRyb3V0ZXJAMS4zLjMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0cm91dGVyL2Rpc3RfdHMvc21hcnRyb3V0ZXIuY2xhc3Nlcy5zbWFydHJvdXRlci5qcwp2YXIgcm91dGVMb2cgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChtZXNzYWdlMikgPT4gewogIGNvbnNvbGUubG9nKGAlY1tSb3V0ZXJdJWMgJHttZXNzYWdlMn1gLCAiY29sb3I6IHJnYigyNTUsIDEwNSwgMTAwKTsiLCAiY29sb3I6IGluaGVyaXQiKTsKfSwgInJvdXRlTG9nIik7CnZhciBTbWFydFJvdXRlciA9IGNsYXNzIF9TbWFydFJvdXRlciB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiU21hcnRSb3V0ZXIiKTsKICB9CiAgLyoqCiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBSb3V0ZXIuCiAgICovCiAgY29uc3RydWN0b3Iob3B0aW9uc0FyZywgYmFzZVBhdGggPSAiIikgewogICAgdGhpcy5vcHRpb25zID0gewogICAgICBkZWJ1ZzogZmFsc2UKICAgIH07CiAgICB0aGlzLnF1ZXJ5UGFyYW1zID0gbmV3IFF1ZXJ5UGFyYW1zKCk7CiAgICB0aGlzLnJvdXRlcyA9IFtdOwogICAgdGhpcy5vcHRpb25zID0gewogICAgICAuLi50aGlzLm9wdGlvbnMsCiAgICAgIC4uLm9wdGlvbnNBcmcKICAgIH07CiAgICB0aGlzLmJhc2VQYXRoID0gYmFzZVBhdGg7CiAgICB0aGlzLnBvcHN0YXRlTGlzdGVuZXIgPSAocG9wU3RhdGVFdmVudEFyZykgPT4gewogICAgICBwb3BTdGF0ZUV2ZW50QXJnLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHRoaXMuX2hhbmRsZVJvdXRlU3RhdGUoKTsKICAgIH07CiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicG9wc3RhdGUiLCB0aGlzLnBvcHN0YXRlTGlzdGVuZXIpOwogIH0KICAvKioKICAgKiBDcmVhdGUgYSBzdWItcm91dGVyIHdpdGggYSBzcGVjaWZpYyBwcmVmaXgKICAgKiBAcGFyYW0ge3N0cmluZ30gc3ViUGF0aAogICAqIEBwYXJhbSB7SVJvdXRlck9wdGlvbnN9IFtvcHRpb25zXQogICAqLwogIGNyZWF0ZVN1YlJvdXRlcihzdWJQYXRoLCBvcHRpb25zKSB7CiAgICBjb25zdCBuZXdCYXNlUGF0aCA9IGAke3RoaXMuYmFzZVBhdGh9JHtzdWJQYXRofWA7CiAgICByZXR1cm4gbmV3IF9TbWFydFJvdXRlcih7IC4uLnRoaXMub3B0aW9ucywgLi4ub3B0aW9ucyB9LCBuZXdCYXNlUGF0aCk7CiAgfQogIC8qKgogICAqIFB1c2ggcm91dGUgc3RhdGUgdG8gaGlzdG9yeSBzdGFjawogICAqLwogIGFzeW5jIHB1c2hVcmwodXJsID0gIi8iLCBzdGF0ZSA9IHt9KSB7CiAgICBjb25zdCBmdWxsVXJsID0gYCR7dGhpcy5iYXNlUGF0aH0ke3VybH1gOwogICAgaWYgKGZ1bGxVcmwgIT09IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSkgewogICAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUoc3RhdGUsIHdpbmRvdy5kb2N1bWVudC50aXRsZSwgZnVsbFVybCk7CiAgICB9IGVsc2UgewogICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoc3RhdGUsIHdpbmRvdy5kb2N1bWVudC50aXRsZSwgZnVsbFVybCk7CiAgICB9CiAgICBhd2FpdCB0aGlzLl9oYW5kbGVSb3V0ZVN0YXRlKCk7CiAgfQogIC8qKgogICAqIEF0dGFjaCByb3V0ZSB3aXRoIGhhbmRsZXIKICAgKiBAcGFyYW0ge3N0cmluZ3xSZWdFeHB9IHJvdXRlQXJnCiAgICogQHBhcmFtIHtmdW5jdGlvbn0gaGFuZGxlckFyZwogICAqLwogIG9uKHJvdXRlQXJnLCBoYW5kbGVyQXJnKSB7CiAgICBjb25zdCBmdWxsUm91dGUgPSBgJHt0aGlzLmJhc2VQYXRofSR7cm91dGVBcmd9YDsKICAgIGNvbnN0IHJvdXRlT2JqZWN0ID0gewogICAgICBtYXRjaEZ1bmN0aW9uOiBwYXRoVG9SZWdFeHAubWF0Y2goZnVsbFJvdXRlKSwKICAgICAgaGFuZGxlcjogaGFuZGxlckFyZwogICAgfTsKICAgIHRoaXMucm91dGVzLnB1c2gocm91dGVPYmplY3QpOwogICAgY29uc3QgcmVtb3ZlRnVuY3Rpb24gPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCgpID0+IHsKICAgICAgdGhpcy5yb3V0ZXMuc3BsaWNlKHRoaXMucm91dGVzLmluZGV4T2Yocm91dGVPYmplY3QpLCAxKTsKICAgIH0sICJyZW1vdmVGdW5jdGlvbiIpOwogICAgcmV0dXJuIHJlbW92ZUZ1bmN0aW9uOwogIH0KICAvKioKICAgKiBBcHBseSByb3V0ZXMgaGFuZGxlciB0byBjdXJyZW50IHJvdXRlCiAgICovCiAgYXN5bmMgX2hhbmRsZVJvdXRlU3RhdGUoKSB7CiAgICBjb25zdCBjdXJyZW50TG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWU7CiAgICBjb25zdCB3YW50ZWRSb3V0ZXMgPSB0aGlzLnJvdXRlcy5maWx0ZXIoKHJvdXRlQXJnKSA9PiB7CiAgICAgIHJldHVybiAhIXJvdXRlQXJnLm1hdGNoRnVuY3Rpb24oY3VycmVudExvY2F0aW9uKTsKICAgIH0pOwogICAgZm9yIChjb25zdCB3YW50ZWRSb3V0ZSBvZiB3YW50ZWRSb3V0ZXMpIHsKICAgICAgY29uc3Qgcm91dGVSZXN1bHQgPSB3YW50ZWRSb3V0ZS5tYXRjaEZ1bmN0aW9uKGN1cnJlbnRMb2NhdGlvbik7CiAgICAgIHdhbnRlZFJvdXRlLmhhbmRsZXIoewogICAgICAgIC4uLnJvdXRlUmVzdWx0LnZhbHVlT2YoKSwKICAgICAgICBxdWVyeVBhcmFtczogdGhpcy5xdWVyeVBhcmFtcy5nZXRBbGxBc09iamVjdCgpCiAgICAgICAgLy8gVE9ETyBjaGVjayB3ZXRoZXIgZW50cmllcyBpcyBzdXBwb3J0ZWQgaW4gdHlwaW5ncwogICAgICB9KTsKICAgIH0KICB9CiAgLyoqCiAgICogRGVzdHJveSB0aGUgcm91dGVyIGluc3RhbmNlLCByZW1vdmluZyBhbGwgZXh0ZXJuYWwgcmVmZXJlbmNlcwogICAqLwogIGRlc3Ryb3koKSB7CiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9wc3RhdGUiLCB0aGlzLnBvcHN0YXRlTGlzdGVuZXIpOwogICAgdGhpcy5yb3V0ZXMgPSBbXTsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRzdGF0ZUAyLjIuMS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRzdGF0ZS9kaXN0X3RzL2luZGV4LmpzCnZhciBkaXN0X3RzX2V4cG9ydHMyMSA9IHt9OwpfX2V4cG9ydChkaXN0X3RzX2V4cG9ydHMyMSwgewogIFNtYXJ0c3RhdGU6ICgpID0+IFNtYXJ0c3RhdGUsCiAgU3RhdGVBY3Rpb246ICgpID0+IFN0YXRlQWN0aW9uLAogIFN0YXRlUGFydDogKCkgPT4gU3RhdGVQYXJ0LAogIGF0dGFjaENvbnRleHRQcm92aWRlcjogKCkgPT4gYXR0YWNoQ29udGV4dFByb3ZpZGVyLAogIGNvbXB1dGVkOiAoKSA9PiBjb21wdXRlZAp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydGhhc2hAMy4yLjYvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0aGFzaC9kaXN0X3RzX3dlYi9pbmRleC5qcwp2YXIgZGlzdF90c193ZWJfZXhwb3J0cyA9IHt9OwpfX2V4cG9ydChkaXN0X3RzX3dlYl9leHBvcnRzLCB7CiAgbWQ1RnJvbVN0cmluZzogKCkgPT4gbWQ1RnJvbVN0cmluZywKICBzaGEyNTZGcm9tQnVmZmVyOiAoKSA9PiBzaGEyNTZGcm9tQnVmZmVyLAogIHNoYTI1NkZyb21GaWxlOiAoKSA9PiBzaGEyNTZGcm9tRmlsZSwKICBzaGEyNTZGcm9tU3RyZWFtOiAoKSA9PiBzaGEyNTZGcm9tU3RyZWFtLAogIHNoYTI1NkZyb21TdHJpbmc6ICgpID0+IHNoYTI1NkZyb21TdHJpbmcsCiAgc2hhMjU2RnJvbVN0cmluZ1N5bmM6ICgpID0+IHNoYTI1NkZyb21TdHJpbmdTeW5jLAogIHNoYTI2NUZyb21PYmplY3Q6ICgpID0+IHNoYTI2NUZyb21PYmplY3QKfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRlbnZANS4wLjEzL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGVudi9kaXN0X3RzL2luZGV4LmpzCnZhciBkaXN0X3RzX2V4cG9ydHMxOSA9IHt9OwpfX2V4cG9ydChkaXN0X3RzX2V4cG9ydHMxOSwgewogIFNtYXJ0ZW52OiAoKSA9PiBTbWFydGVudjIKfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRlbnZANS4wLjEzL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGVudi9kaXN0X3RzL3NtYXJ0ZW52LmNsYXNzZXMuc21hcnRlbnYuanMKdmFyIFNtYXJ0ZW52MiA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJTbWFydGVudiIpOwogIH0KICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMubG9hZGVkU2NyaXB0cyA9IFtdOwogIH0KICBhc3luYyBnZXRFbnZBd2FyZU1vZHVsZShvcHRpb25zQXJnKSB7CiAgICBpZiAodGhpcy5pc05vZGUpIHsKICAgICAgY29uc3QgbW9kdWxlUmVzdWx0ID0gYXdhaXQgdGhpcy5nZXRTYWZlTm9kZU1vZHVsZShvcHRpb25zQXJnLm5vZGVNb2R1bGVOYW1lKTsKICAgICAgcmV0dXJuIG1vZHVsZVJlc3VsdDsKICAgIH0gZWxzZSBpZiAodGhpcy5pc0Jyb3dzZXIpIHsKICAgICAgY29uc3QgbW9kdWxlUmVzdWx0ID0gYXdhaXQgdGhpcy5nZXRTYWZlV2ViTW9kdWxlKG9wdGlvbnNBcmcud2ViVXJsQXJnLCBvcHRpb25zQXJnLmdldEZ1bmN0aW9uKTsKICAgICAgcmV0dXJuIG1vZHVsZVJlc3VsdDsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoInBsYXRmb3JtIGZvciBsb2FkaW5nIG5vdCBzdXBwb3J0ZWQgYnkgc21hcnRlbnYiKTsKICAgIH0KICB9CiAgYXN5bmMgZ2V0U2FmZU5vZGVNb2R1bGUobW9kdWxlTmFtZUFyZywgcnVuQWZ0ZXJGdW5jKSB7CiAgICBpZiAoIXRoaXMuaXNOb2RlKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoYFlvdSB0cmllZCB0byBsb2FkIGEgbm9kZSBtb2R1bGUgaW4gYSB3cm9uZyBjb250ZXh0OiAke21vZHVsZU5hbWVBcmd9LiBUaGlzIGRvZXMgbm90IHRocm93LmApOwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCByZXR1cm5WYWx1ZSA9IGF3YWl0IG5ldyBGdW5jdGlvbihgcmV0dXJuIGltcG9ydCgnJHttb2R1bGVOYW1lQXJnfScpYCkoKTsKICAgIGlmIChydW5BZnRlckZ1bmMpIHsKICAgICAgYXdhaXQgcnVuQWZ0ZXJGdW5jKHJldHVyblZhbHVlKTsKICAgIH0KICAgIHJldHVybiByZXR1cm5WYWx1ZTsKICB9CiAgYXN5bmMgZ2V0U2FmZVdlYk1vZHVsZSh1cmxBcmcsIGdldEZ1bmN0aW9uQXJnKSB7CiAgICBpZiAoIXRoaXMuaXNCcm93c2VyKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoIllvdSB0cmllZCB0byBsb2FkIGEgd2ViIG1vZHVsZSBpbiBhIHdyb25nIGNvbnRleHQiKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHRoaXMubG9hZGVkU2NyaXB0cy5pbmNsdWRlcyh1cmxBcmcpKSB7CiAgICAgIHJldHVybiBnZXRGdW5jdGlvbkFyZygpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5sb2FkZWRTY3JpcHRzLnB1c2godXJsQXJnKTsKICAgIH0KICAgIGNvbnN0IGRvbmUgPSBkaXN0X3RzX2V4cG9ydHMuZGVmZXIoKTsKICAgIGlmIChnbG9iYWxUaGlzLmltcG9ydFNjcmlwdHMpIHsKICAgICAgZ2xvYmFsVGhpcy5pbXBvcnRTY3JpcHRzKHVybEFyZyk7CiAgICAgIGRvbmUucmVzb2x2ZSgpOwogICAgfSBlbHNlIHsKICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CiAgICAgIHNjcmlwdC5vbmxvYWQgPSAoKSA9PiB7CiAgICAgICAgZG9uZS5yZXNvbHZlKCk7CiAgICAgIH07CiAgICAgIHNjcmlwdC5zcmMgPSB1cmxBcmc7CiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTsKICAgIH0KICAgIGF3YWl0IGRvbmUucHJvbWlzZTsKICAgIHJldHVybiBnZXRGdW5jdGlvbkFyZygpOwogIH0KICBnZXQgcnVudGltZUVudigpIHsKICAgIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgcmV0dXJuICJub2RlIjsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAiYnJvd3NlciI7CiAgICB9CiAgfQogIGdldCBpc0Jyb3dzZXIoKSB7CiAgICByZXR1cm4gIXRoaXMuaXNOb2RlOwogIH0KICBnZXQgdXNlckFnZW50KCkgewogICAgaWYgKHRoaXMuaXNCcm93c2VyKSB7CiAgICAgIHJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICJ1bmRlZmluZWQiOwogICAgfQogIH0KICBnZXQgaXNOb2RlKCkgewogICAgcmV0dXJuIHRoaXMucnVudGltZUVudiA9PT0gIm5vZGUiOwogIH0KICBnZXQgbm9kZVZlcnNpb24oKSB7CiAgICByZXR1cm4gcHJvY2Vzcy52ZXJzaW9uOwogIH0KICBnZXQgaXNDSSgpIHsKICAgIGlmICh0aGlzLmlzTm9kZSkgewogICAgICBpZiAocHJvY2Vzcy5lbnYuQ0kpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgYXN5bmMgaXNNYWNBc3luYygpIHsKICAgIGlmICh0aGlzLmlzTm9kZSkgewogICAgICBjb25zdCBvcyA9IGF3YWl0IHRoaXMuZ2V0U2FmZU5vZGVNb2R1bGUoIm9zIik7CiAgICAgIHJldHVybiBvcy5wbGF0Zm9ybSgpID09PSAiZGFyd2luIjsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgYXN5bmMgaXNXaW5kb3dzQXN5bmMoKSB7CiAgICBpZiAodGhpcy5pc05vZGUpIHsKICAgICAgY29uc3Qgb3MgPSBhd2FpdCB0aGlzLmdldFNhZmVOb2RlTW9kdWxlKCJvcyIpOwogICAgICByZXR1cm4gb3MucGxhdGZvcm0oKSA9PT0gIndpbjMyIjsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgYXN5bmMgaXNMaW51eEFzeW5jKCkgewogICAgaWYgKHRoaXMuaXNOb2RlKSB7CiAgICAgIGNvbnN0IG9zID0gYXdhaXQgdGhpcy5nZXRTYWZlTm9kZU1vZHVsZSgib3MiKTsKICAgICAgcmV0dXJuIG9zLnBsYXRmb3JtKCkgPT09ICJsaW51eCI7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQogIC8qKgogICAqIHByaW50cyB0aGUgZW52aXJvbm1lbnQgdG8gY29uc29sZQogICAqLwogIGFzeW5jIHByaW50RW52KCkgewogICAgaWYgKHRoaXMuaXNOb2RlKSB7CiAgICAgIGNvbnNvbGUubG9nKCJydW5uaW5nIG9uIE5PREUiKTsKICAgICAgY29uc29sZS5sb2coIm5vZGUgdmVyc2lvbiBpcyAiICsgdGhpcy5ub2RlVmVyc2lvbik7CiAgICB9IGVsc2UgewogICAgICBjb25zb2xlLmxvZygicnVubmluZyBvbiBCUk9XU0VSIik7CiAgICAgIGNvbnNvbGUubG9nKCJicm93c2VyIGlzICIgKyB0aGlzLnVzZXJBZ2VudCk7CiAgICB9CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0anNvbkA1LjIuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRqc29uL2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czIwID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czIwLCB7CiAgU21hcnRqc29uOiAoKSA9PiBTbWFydGpzb24yLAogIGRlZXBFcXVhbEpzb25MU3RyaW5nczogKCkgPT4gZGVlcEVxdWFsSnNvbkxTdHJpbmdzMiwKICBkZWVwRXF1YWxPYmplY3RzOiAoKSA9PiBkZWVwRXF1YWxPYmplY3RzMiwKICBmb2xkRGVjOiAoKSA9PiBmb2xkRGVjMiwKICBwYXJzZTogKCkgPT4gcGFyc2U4LAogIHBhcnNlQmFzZTY0OiAoKSA9PiBwYXJzZUJhc2U2NDIsCiAgcGFyc2VKc29uTDogKCkgPT4gcGFyc2VKc29uTDIsCiAgc3RhYmxlT25lV2F5U3RyaW5naWZ5OiAoKSA9PiBzdGFibGVPbmVXYXlTdHJpbmdpZnkyLAogIHN0cmluZ2lmeTogKCkgPT4gc3RyaW5naWZ5NiwKICBzdHJpbmdpZnlCYXNlNjQ6ICgpID0+IHN0cmluZ2lmeUJhc2U2NDIsCiAgc3RyaW5naWZ5SnNvbkw6ICgpID0+IHN0cmluZ2lmeUpzb25MMiwKICBzdHJpbmdpZnlQcmV0dHk6ICgpID0+IHN0cmluZ2lmeVByZXR0eTIKfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRqc29uQDUuMi4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGpzb24vZGlzdF90cy9zbWFydGpzb24ucGx1Z2lucy5qcwp2YXIgaW1wb3J0X2xvZGFzaDIgPSBfX3RvRVNNKHJlcXVpcmVfbG9kYXNoKCksIDEpOwp2YXIgaW1wb3J0X2Zhc3RfanNvbl9zdGFibGVfc3RyaW5naWZ5MiA9IF9fdG9FU00ocmVxdWlyZV9mYXN0X2pzb25fc3RhYmxlX3N0cmluZ2lmeSgpLCAxKTsKdmFyIHN0YWJsZUpzb24zID0gaW1wb3J0X2Zhc3RfanNvbl9zdGFibGVfc3RyaW5naWZ5Mi5kZWZhdWx0OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0anNvbkA1LjIuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRqc29uL2Rpc3RfdHMvYnVmZmVyaGFuZGxpbmcuanMKZnVuY3Rpb24gYmFzZTY0RW5jb2RlMihkYXRhKSB7CiAgaWYgKHR5cGVvZiBCdWZmZXIgIT09ICJ1bmRlZmluZWQiKSB7CiAgICByZXR1cm4gQnVmZmVyLmZyb20oZGF0YSkudG9TdHJpbmcoImJhc2U2NCIpOwogIH0KICByZXR1cm4gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLmRhdGEpKTsKfQpfX25hbWUoYmFzZTY0RW5jb2RlMiwgImJhc2U2NEVuY29kZSIpOwpmdW5jdGlvbiBiYXNlNjREZWNvZGUyKHN0cikgewogIGlmICh0eXBlb2YgQnVmZmVyICE9PSAidW5kZWZpbmVkIikgewogICAgY29uc3QgYnVmID0gQnVmZmVyLmZyb20oc3RyLCAiYmFzZTY0Iik7CiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYnVmLmJ1ZmZlciwgYnVmLmJ5dGVPZmZzZXQsIGJ1Zi5ieXRlTGVuZ3RoKTsKICB9CiAgcmV0dXJuIG5ldyBVaW50OEFycmF5KEFycmF5LmZyb20oYXRvYihzdHIpKS5tYXAoKGNoYXIpID0+IGNoYXIuY2hhckNvZGVBdCgwKSkpOwp9Cl9fbmFtZShiYXNlNjREZWNvZGUyLCAiYmFzZTY0RGVjb2RlIik7CmZ1bmN0aW9uIHN0cmluZ2lmeTUodmFsdWUyLCBzcGFjZTIpIHsKICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUyLCByZXBsYWNlcjIsIHNwYWNlMik7Cn0KX19uYW1lKHN0cmluZ2lmeTUsICJzdHJpbmdpZnkiKTsKZnVuY3Rpb24gcGFyc2U3KHRleHQ4KSB7CiAgcmV0dXJuIEpTT04ucGFyc2UodGV4dDgsIHJldml2ZXIyKTsKfQpfX25hbWUocGFyc2U3LCAicGFyc2UiKTsKdmFyIHJlcGxhY2VyMiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGtleTIsIHZhbHVlMikgPT4gewogIGlmIChpc0J1ZmZlckxpa2UzKHZhbHVlMikpIHsKICAgIGxldCBidWZmZXJEYXRhOwogICAgaWYgKCJkYXRhIiBpbiB2YWx1ZTIgJiYgaXNBcnJheTQodmFsdWUyLmRhdGEpKSB7CiAgICAgIGJ1ZmZlckRhdGEgPSBuZXcgVWludDhBcnJheSh2YWx1ZTIuZGF0YSk7CiAgICB9IGVsc2UgaWYgKHZhbHVlMiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHsKICAgICAgYnVmZmVyRGF0YSA9IHZhbHVlMjsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB2YWx1ZTI7CiAgICB9CiAgICBjb25zdCBiYXNlNjREYXRhID0gImJhc2U2NDoiICsgYmFzZTY0RW5jb2RlMihidWZmZXJEYXRhKTsKICAgIHJldHVybiB7CiAgICAgIHR5cGU6ICJFbmNvZGVkQnVmZmVyIiwKICAgICAgZGF0YTogYmFzZTY0RGF0YQogICAgfTsKICB9CiAgcmV0dXJuIHZhbHVlMjsKfSwgInJlcGxhY2VyIik7CnZhciByZXZpdmVyMiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGtleTIsIHZhbHVlMikgPT4gewogIGlmIChpc0VuY29kZWRCdWZmZXIyKHZhbHVlMikpIHsKICAgIGlmIChpc1N0cmluZzIodmFsdWUyLmRhdGEpICYmIHZhbHVlMi5kYXRhLnN0YXJ0c1dpdGgoImJhc2U2NDoiKSkgewogICAgICBjb25zdCBiYXNlNjREYXRhID0gdmFsdWUyLmRhdGEuc2xpY2UoNyk7CiAgICAgIGNvbnN0IGJ1ZmZlcjIgPSBiYXNlNjREZWNvZGUyKGJhc2U2NERhdGEpOwogICAgICByZXR1cm4gYnVmZmVyMjsKICAgIH0KICB9CiAgcmV0dXJuIHZhbHVlMjsKfSwgInJldml2ZXIiKTsKZnVuY3Rpb24gaXNFbmNvZGVkQnVmZmVyMih4MykgewogIHJldHVybiBpc09iamVjdDIoeDMpICYmIHgzLnR5cGUgPT09ICJFbmNvZGVkQnVmZmVyIiAmJiBpc1N0cmluZzIoeDMuZGF0YSk7Cn0KX19uYW1lKGlzRW5jb2RlZEJ1ZmZlcjIsICJpc0VuY29kZWRCdWZmZXIiKTsKZnVuY3Rpb24gaXNCdWZmZXJMaWtlMyh4MykgewogIHJldHVybiBpc09iamVjdDIoeDMpICYmICh4My50eXBlID09PSAiQnVmZmVyIiAmJiAoaXNBcnJheTQoeDMuZGF0YSkgfHwgaXNTdHJpbmcyKHgzLmRhdGEpKSkgfHwgeDMgaW5zdGFuY2VvZiBVaW50OEFycmF5Owp9Cl9fbmFtZShpc0J1ZmZlckxpa2UzLCAiaXNCdWZmZXJMaWtlIik7CmZ1bmN0aW9uIGlzQXJyYXk0KHgzKSB7CiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoeDMpOwp9Cl9fbmFtZShpc0FycmF5NCwgImlzQXJyYXkiKTsKZnVuY3Rpb24gaXNTdHJpbmcyKHgzKSB7CiAgcmV0dXJuIHR5cGVvZiB4MyA9PT0gInN0cmluZyI7Cn0KX19uYW1lKGlzU3RyaW5nMiwgImlzU3RyaW5nIik7CmZ1bmN0aW9uIGlzT2JqZWN0Mih4MykgewogIHJldHVybiB0eXBlb2YgeDMgPT09ICJvYmplY3QiICYmIHgzICE9PSBudWxsOwp9Cl9fbmFtZShpc09iamVjdDIsICJpc09iamVjdCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0anNvbkA1LjIuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRqc29uL2Rpc3RfdHMvaW5kZXguanMKdmFyIHBhcnNlOCA9IHBhcnNlNzsKdmFyIHBhcnNlSnNvbkwyID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoanNvbmxEYXRhKSA9PiB7CiAgY29uc3QgbGluZXMgPSBqc29ubERhdGEuc3BsaXQoIlxuIik7CiAgY29uc3QgcGFyc2VkRGF0YSA9IGxpbmVzLnJlZHVjZSgoYWNjLCBsaW5lKSA9PiB7CiAgICBjb25zdCB0cmltbWVkID0gbGluZS50cmltKCk7CiAgICBpZiAodHJpbW1lZC5sZW5ndGggPiAwKSB7CiAgICAgIGFjYy5wdXNoKHBhcnNlOCh0cmltbWVkKSk7CiAgICB9CiAgICByZXR1cm4gYWNjOwogIH0sIFtdKTsKICByZXR1cm4gcGFyc2VkRGF0YTsKfSwgInBhcnNlSnNvbkwiKTsKdmFyIHN0cmluZ2lmeUpzb25MMiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGl0ZW1zKSA9PiB7CiAgcmV0dXJuIGl0ZW1zLm1hcCgoaXRlbSkgPT4gc3RyaW5naWZ5NihpdGVtKSkuam9pbigiXG4iKTsKfSwgInN0cmluZ2lmeUpzb25MIik7CnZhciBzdGFibGVPbmVXYXlTdHJpbmdpZnkyID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgob2JqQXJnLCBzaW1wbGVPcmRlckFycmF5LCBvcHRpb25zQXJnID0ge30pID0+IHsKICBjb25zdCB2aXNpdGVkID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrU2V0KCk7CiAgY29uc3Qgc2FuaXRpemUyID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgodmFsKSA9PiB7CiAgICBpZiAodmFsID09PSBudWxsIHx8IHR5cGVvZiB2YWwgIT09ICJvYmplY3QiKSB7CiAgICAgIHJldHVybiB2YWw7CiAgICB9CiAgICBjb25zdCByZXBsYWNlZCA9IHJlcGxhY2VyMigiIiwgdmFsKTsKICAgIGlmIChyZXBsYWNlZCAmJiByZXBsYWNlZC50eXBlID09PSAiRW5jb2RlZEJ1ZmZlciIgJiYgdHlwZW9mIHJlcGxhY2VkLmRhdGEgPT09ICJzdHJpbmciKSB7CiAgICAgIHJldHVybiByZXBsYWNlZDsKICAgIH0KICAgIGlmICh2aXNpdGVkLmhhcyh2YWwpKSB7CiAgICAgIHJldHVybiAiX19jeWNsZV9fIjsKICAgIH0KICAgIHZpc2l0ZWQuYWRkKHZhbCk7CiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7CiAgICAgIHJldHVybiB2YWwubWFwKChpdGVtKSA9PiBzYW5pdGl6ZTIoaXRlbSkpOwogICAgfQogICAgY29uc3Qgb3V0ID0ge307CiAgICBmb3IgKGNvbnN0IGtleTIgb2YgT2JqZWN0LmtleXModmFsKSkgewogICAgICB0cnkgewogICAgICAgIG91dFtrZXkyXSA9IHNhbml0aXplMih2YWxba2V5Ml0pOwogICAgICB9IGNhdGNoIChlMTApIHsKICAgICAgICBvdXRba2V5Ml0gPSAiX191bnNlcmlhbGl6YWJsZV9fIjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG91dDsKICB9LCAic2FuaXRpemUiKTsKICBjb25zdCBvYmogPSBzYW5pdGl6ZTIob2JqQXJnKTsKICBjb25zdCBvcHRpb25zID0gewogICAgLi4ub3B0aW9uc0FyZywKICAgIGN5Y2xlczogdHJ1ZQogIH07CiAgaWYgKHNpbXBsZU9yZGVyQXJyYXkgJiYgIW9wdGlvbnMuY21wKSB7CiAgICBjb25zdCBvcmRlcjIgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgc2ltcGxlT3JkZXJBcnJheS5mb3JFYWNoKChrZXkyLCBpZHgpID0+IG9yZGVyMi5zZXQoa2V5MiwgaWR4KSk7CiAgICBvcHRpb25zLmNtcCA9IChhNCwgYjQpID0+IHsKICAgICAgY29uc3QgYUlkeCA9IG9yZGVyMi5oYXMoYTQua2V5KSA/IG9yZGVyMi5nZXQoYTQua2V5KSA6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTsKICAgICAgY29uc3QgYklkeCA9IG9yZGVyMi5oYXMoYjQua2V5KSA/IG9yZGVyMi5nZXQoYjQua2V5KSA6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTsKICAgICAgaWYgKGFJZHggIT09IGJJZHgpCiAgICAgICAgcmV0dXJuIGFJZHggLSBiSWR4OwogICAgICByZXR1cm4gYTQua2V5IDwgYjQua2V5ID8gLTEgOiBhNC5rZXkgPiBiNC5rZXkgPyAxIDogMDsKICAgIH07CiAgfQogIHJldHVybiBzdGFibGVKc29uMyhvYmosIG9wdGlvbnMpOwp9LCAic3RhYmxlT25lV2F5U3RyaW5naWZ5Iik7CnZhciBzdHJpbmdpZnk2ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgob2JqQXJnLCBzaW1wbGVPcmRlckFycmF5LCBvcHRpb25zQXJnID0ge30pID0+IHsKICBjb25zdCBidWZmZXJlZEpzb24gPSBzdHJpbmdpZnk1KG9iakFyZyk7CiAgb2JqQXJnID0gSlNPTi5wYXJzZShidWZmZXJlZEpzb24pOwogIGxldCBvcHRpb25zID0geyAuLi5vcHRpb25zQXJnIH07CiAgaWYgKHNpbXBsZU9yZGVyQXJyYXkgJiYgIW9wdGlvbnMuY21wKSB7CiAgICBjb25zdCBvcmRlcjIgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgc2ltcGxlT3JkZXJBcnJheS5mb3JFYWNoKChrZXkyLCBpZHgpID0+IG9yZGVyMi5zZXQoa2V5MiwgaWR4KSk7CiAgICBvcHRpb25zLmNtcCA9IChhNCwgYjQpID0+IHsKICAgICAgY29uc3QgYUlkeCA9IG9yZGVyMi5oYXMoYTQua2V5KSA/IG9yZGVyMi5nZXQoYTQua2V5KSA6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTsKICAgICAgY29uc3QgYklkeCA9IG9yZGVyMi5oYXMoYjQua2V5KSA/IG9yZGVyMi5nZXQoYjQua2V5KSA6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTsKICAgICAgaWYgKGFJZHggIT09IGJJZHgpCiAgICAgICAgcmV0dXJuIGFJZHggLSBiSWR4OwogICAgICByZXR1cm4gYTQua2V5IDwgYjQua2V5ID8gLTEgOiBhNC5rZXkgPiBiNC5rZXkgPyAxIDogMDsKICAgIH07CiAgfQogIGxldCByZXR1cm5Kc29uID0gc3RhYmxlSnNvbjMob2JqQXJnLCBvcHRpb25zKTsKICByZXR1cm4gcmV0dXJuSnNvbjsKfSwgInN0cmluZ2lmeSIpOwp2YXIgc3RyaW5naWZ5UHJldHR5MiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKG9iamVjdEFyZykgPT4gewogIGNvbnN0IHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5NihvYmplY3RBcmcpOwogIGNvbnN0IG9iamVjdCA9IEpTT04ucGFyc2Uoc3RyaW5naWZpZWQpOwogIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmplY3QsIG51bGwsIDIpOwp9LCAic3RyaW5naWZ5UHJldHR5Iik7CnZhciBzdHJpbmdpZnlCYXNlNjQyID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoLi4uYXJncykgPT4gewogIGNvbnN0IHN0cmluZ2lmaWVkUmVzdWx0ID0gc3RyaW5naWZ5NiguLi5hcmdzKTsKICByZXR1cm4gZGlzdF90c19leHBvcnRzMTEuYmFzZTY0LmVuY29kZVVyaShzdHJpbmdpZmllZFJlc3VsdCk7Cn0sICJzdHJpbmdpZnlCYXNlNjQiKTsKdmFyIHBhcnNlQmFzZTY0MiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGJhc2U2NEpzb25TdHJpbmdBcmcpID0+IHsKICBjb25zdCBiYXNlNjQyID0gZGlzdF90c19leHBvcnRzMTEuYmFzZTY0OwogIGNvbnN0IGRlY29kZUZuID0gYmFzZTY0Mi5kZWNvZGVVcmkgfHwgYmFzZTY0Mi5kZWNvZGU7CiAgY29uc3Qgc2ltcGxlU3RyaW5naWZpZWQgPSBkZWNvZGVGbihiYXNlNjRKc29uU3RyaW5nQXJnKTsKICByZXR1cm4gcGFyc2U4KHNpbXBsZVN0cmluZ2lmaWVkKTsKfSwgInBhcnNlQmFzZTY0Iik7CnZhciBTbWFydGpzb24yID0gY2xhc3MgX1NtYXJ0anNvbiB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiU21hcnRqc29uIik7CiAgfQogIC8qKgogICAqIGVuZm9sZHMgZGF0YSBmcm9tIGFuIG9iamVjdAogICAqLwogIHN0YXRpYyBlbmZvbGRGcm9tT2JqZWN0KG9iamVjdEFyZykgewogICAgY29uc3QgbmV3SW5zdGFuY2UgPSBuZXcgdGhpcygpOwogICAgY29uc3Qgc2F2ZWFibGVzID0gbmV3SW5zdGFuY2Uuc2F2ZWFibGVQcm9wZXJ0aWVzIHx8IFtdOwogICAgZm9yIChjb25zdCBrZXlOYW1lIGluIG9iamVjdEFyZykgewogICAgICBpZiAoc2F2ZWFibGVzLmluZGV4T2Yoa2V5TmFtZSkgIT09IC0xKSB7CiAgICAgICAgbmV3SW5zdGFuY2Vba2V5TmFtZV0gPSBvYmplY3RBcmdba2V5TmFtZV07CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXdJbnN0YW5jZTsKICB9CiAgLyoqCiAgICogZW5mb2xkIGZyb20ganNvbgogICAqLwogIHN0YXRpYyBlbmZvbGRGcm9tSnNvbihqc29uQXJnKSB7CiAgICBjb25zdCBvYmplY3RGcm9tSnNvbiA9IHBhcnNlOChqc29uQXJnKTsKICAgIHJldHVybiB0aGlzLmVuZm9sZEZyb21PYmplY3Qob2JqZWN0RnJvbUpzb24pOwogIH0KICAvKioKICAgKiBmb2xkcyBhIGNsYXNzIGludG8gYW4gb2JqZWN0CiAgICovCiAgZm9sZFRvT2JqZWN0KCkgewogICAgY29uc3QgdHJhY2tTZXQgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpOwogICAgdHJhY2tTZXQuYWRkKHRoaXMpOwogICAgcmV0dXJuIHRoaXMuZm9sZFRvT2JqZWN0SW50ZXJuYWwodHJhY2tTZXQpOwogIH0KICBmb2xkVG9PYmplY3RJbnRlcm5hbCh0cmFja1NldCkgewogICAgY29uc3QgcmVzdWx0ID0ge307CiAgICBjb25zdCBmb2xkVmFsdWUgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh2YWwpID0+IHsKICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIF9TbWFydGpzb24pIHsKICAgICAgICBpZiAodHJhY2tTZXQuaGFzKHZhbCkpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiY3ljbGUgZGV0ZWN0ZWQiKTsKICAgICAgICB9CiAgICAgICAgdHJhY2tTZXQuYWRkKHZhbCk7CiAgICAgICAgcmV0dXJuIHZhbC5mb2xkVG9PYmplY3RJbnRlcm5hbCh0cmFja1NldCk7CiAgICAgIH0KICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkgewogICAgICAgIHJldHVybiB2YWwubWFwKChpdGVtKSA9PiBmb2xkVmFsdWUoaXRlbSkpOwogICAgICB9CiAgICAgIHJldHVybiBpbXBvcnRfbG9kYXNoMi5kZWZhdWx0KHZhbCk7CiAgICB9LCAiZm9sZFZhbHVlIik7CiAgICBjb25zdCBwcm9wcyA9IHRoaXMuc2F2ZWFibGVQcm9wZXJ0aWVzIHx8IFtdOwogICAgZm9yIChjb25zdCBrZXlOYW1lIG9mIHByb3BzKSB7CiAgICAgIGNvbnN0IHZhbHVlMiA9IHRoaXNba2V5TmFtZV07CiAgICAgIHJlc3VsdFtrZXlOYW1lXSA9IGZvbGRWYWx1ZSh2YWx1ZTIpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CiAgLyoqCiAgICogZm9sZHMgYSBjbGFzcyBpbnRvIGFuIG9iamVjdAogICAqLwogIGZvbGRUb0pzb24oKSB7CiAgICBjb25zdCBmb2xkZWRPYmplY3QgPSB0aGlzLmZvbGRUb09iamVjdCgpOwogICAgcmV0dXJuIHN0cmluZ2lmeTYoZm9sZGVkT2JqZWN0KTsKICB9Cn07CnZhciBmb2xkRGVjMiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKCkgPT4gewogIHJldHVybiAodGFyZ2V0LCBrZXkyKSA9PiB7CiAgICBpZiAoIXRhcmdldC5zYXZlYWJsZVByb3BlcnRpZXMpIHsKICAgICAgdGFyZ2V0LnNhdmVhYmxlUHJvcGVydGllcyA9IFtdOwogICAgfQogICAgdGFyZ2V0LnNhdmVhYmxlUHJvcGVydGllcy5wdXNoKGtleTIpOwogIH07Cn0sICJmb2xkRGVjIik7CnZhciBkZWVwRXF1YWxPYmplY3RzMiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKG9iamVjdDEsIG9iamVjdDIpID0+IHsKICBjb25zdCBvYmplY3QxU3RyaW5nID0gc3RyaW5naWZ5NihvYmplY3QxKTsKICBjb25zdCBvYmplY3QyU3RyaW5nID0gc3RyaW5naWZ5NihvYmplY3QyKTsKICByZXR1cm4gb2JqZWN0MVN0cmluZyA9PT0gb2JqZWN0MlN0cmluZzsKfSwgImRlZXBFcXVhbE9iamVjdHMiKTsKdmFyIGRlZXBFcXVhbEpzb25MU3RyaW5nczIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChqc29uTFN0cmluZzEsIGpzb25MU3RyaW5nMikgPT4gewogIGNvbnN0IGZpcnN0QXJyYXkgPSBwYXJzZUpzb25MMihqc29uTFN0cmluZzEpOwogIGNvbnN0IHNlY29uZEFycmF5ID0gcGFyc2VKc29uTDIoanNvbkxTdHJpbmcyKTsKICByZXR1cm4gZGVlcEVxdWFsT2JqZWN0czIoZmlyc3RBcnJheSwgc2Vjb25kQXJyYXkpOwp9LCAiZGVlcEVxdWFsSnNvbkxTdHJpbmdzIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRoYXNoQDMuMi42L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGhhc2gvZGlzdF90c193ZWIvc2hhMjU2LmZhbGxiYWNrLmpzCnZhciBLID0gWwogIDExMTYzNTI0MDgsCiAgMTg5OTQ0NzQ0MSwKICAzMDQ5MzIzNDcxLAogIDM5MjEwMDk1NzMsCiAgOTYxOTg3MTYzLAogIDE1MDg5NzA5OTMsCiAgMjQ1MzYzNTc0OCwKICAyODcwNzYzMjIxLAogIDM2MjQzODEwODAsCiAgMzEwNTk4NDAxLAogIDYwNzIyNTI3OCwKICAxNDI2ODgxOTg3LAogIDE5MjUwNzgzODgsCiAgMjE2MjA3ODIwNiwKICAyNjE0ODg4MTAzLAogIDMyNDgyMjI1ODAsCiAgMzgzNTM5MDQwMSwKICA0MDIyMjI0Nzc0LAogIDI2NDM0NzA3OCwKICA2MDQ4MDc2MjgsCiAgNzcwMjU1OTgzLAogIDEyNDkxNTAxMjIsCiAgMTU1NTA4MTY5MiwKICAxOTk2MDY0OTg2LAogIDI1NTQyMjA4ODIsCiAgMjgyMTgzNDM0OSwKICAyOTUyOTk2ODA4LAogIDMyMTAzMTM2NzEsCiAgMzMzNjU3MTg5MSwKICAzNTg0NTI4NzExLAogIDExMzkyNjk5MywKICAzMzgyNDE4OTUsCiAgNjY2MzA3MjA1LAogIDc3MzUyOTkxMiwKICAxMjk0NzU3MzcyLAogIDEzOTYxODIyOTEsCiAgMTY5NTE4MzcwMCwKICAxOTg2NjYxMDUxLAogIDIxNzcwMjYzNTAsCiAgMjQ1Njk1NjAzNywKICAyNzMwNDg1OTIxLAogIDI4MjAzMDI0MTEsCiAgMzI1OTczMDgwMCwKICAzMzQ1NzY0NzcxLAogIDM1MTYwNjU4MTcsCiAgMzYwMDM1MjgwNCwKICA0MDk0NTcxOTA5LAogIDI3NTQyMzM0NCwKICA0MzAyMjc3MzQsCiAgNTA2OTQ4NjE2LAogIDY1OTA2MDU1NiwKICA4ODM5OTc4NzcsCiAgOTU4MTM5NTcxLAogIDEzMjI4MjIyMTgsCiAgMTUzNzAwMjA2MywKICAxNzQ3ODczNzc5LAogIDE5NTU1NjIyMjIsCiAgMjAyNDEwNDgxNSwKICAyMjI3NzMwNDUyLAogIDIzNjE4NTI0MjQsCiAgMjQyODQzNjQ3NCwKICAyNzU2NzM0MTg3LAogIDMyMDQwMzE0NzksCiAgMzMyOTMyNTI5OApdOwp2YXIgSDIgPSBbCiAgMTc3OTAzMzcwMywKICAzMTQ0MTM0Mjc3LAogIDEwMTM5MDQyNDIsCiAgMjc3MzQ4MDc2MiwKICAxMzU5ODkzMTE5LAogIDI2MDA4MjI5MjQsCiAgNTI4NzM0NjM1LAogIDE1NDE0NTkyMjUKXTsKZnVuY3Rpb24gcm90cihuMTEsIGI0KSB7CiAgcmV0dXJuIG4xMSA+Pj4gYjQgfCBuMTEgPDwgMzIgLSBiNDsKfQpfX25hbWUocm90ciwgInJvdHIiKTsKZnVuY3Rpb24gc2hhMjU2VHJhbnNmb3JtKFcyLCBIMykgewogIGxldCBhNCA9IEgzWzBdOwogIGxldCBiNCA9IEgzWzFdOwogIGxldCBjMTAgPSBIM1syXTsKICBsZXQgZDQgPSBIM1szXTsKICBsZXQgZTEwID0gSDNbNF07CiAgbGV0IGY2ID0gSDNbNV07CiAgbGV0IGczID0gSDNbNl07CiAgbGV0IGg3ID0gSDNbN107CiAgZm9yIChsZXQgajMgPSAwOyBqMyA8IDY0OyBqMysrKSB7CiAgICBpZiAoajMgPj0gMTYpIHsKICAgICAgY29uc3QgczAgPSByb3RyKFcyW2ozIC0gMTVdLCA3KSBeIHJvdHIoVzJbajMgLSAxNV0sIDE4KSBeIFcyW2ozIC0gMTVdID4+PiAzOwogICAgICBjb25zdCBzMSA9IHJvdHIoVzJbajMgLSAyXSwgMTcpIF4gcm90cihXMltqMyAtIDJdLCAxOSkgXiBXMltqMyAtIDJdID4+PiAxMDsKICAgICAgVzJbajNdID0gVzJbajMgLSAxNl0gKyBzMCArIFcyW2ozIC0gN10gKyBzMSA+Pj4gMDsKICAgIH0KICAgIGNvbnN0IFMxID0gcm90cihlMTAsIDYpIF4gcm90cihlMTAsIDExKSBeIHJvdHIoZTEwLCAyNSk7CiAgICBjb25zdCBjaCA9IGUxMCAmIGY2IF4gfmUxMCAmIGczOwogICAgY29uc3QgdGVtcDEgPSBoNyArIFMxICsgY2ggKyBLW2ozXSArIFcyW2ozXSA+Pj4gMDsKICAgIGNvbnN0IFMwID0gcm90cihhNCwgMikgXiByb3RyKGE0LCAxMykgXiByb3RyKGE0LCAyMik7CiAgICBjb25zdCBtYWogPSBhNCAmIGI0IF4gYTQgJiBjMTAgXiBiNCAmIGMxMDsKICAgIGNvbnN0IHRlbXAyID0gUzAgKyBtYWogPj4+IDA7CiAgICBoNyA9IGczOwogICAgZzMgPSBmNjsKICAgIGY2ID0gZTEwOwogICAgZTEwID0gZDQgKyB0ZW1wMSA+Pj4gMDsKICAgIGQ0ID0gYzEwOwogICAgYzEwID0gYjQ7CiAgICBiNCA9IGE0OwogICAgYTQgPSB0ZW1wMSArIHRlbXAyID4+PiAwOwogIH0KICBIM1swXSA9IEgzWzBdICsgYTQgPj4+IDA7CiAgSDNbMV0gPSBIM1sxXSArIGI0ID4+PiAwOwogIEgzWzJdID0gSDNbMl0gKyBjMTAgPj4+IDA7CiAgSDNbM10gPSBIM1szXSArIGQ0ID4+PiAwOwogIEgzWzRdID0gSDNbNF0gKyBlMTAgPj4+IDA7CiAgSDNbNV0gPSBIM1s1XSArIGY2ID4+PiAwOwogIEgzWzZdID0gSDNbNl0gKyBnMyA+Pj4gMDsKICBIM1s3XSA9IEgzWzddICsgaDcgPj4+IDA7Cn0KX19uYW1lKHNoYTI1NlRyYW5zZm9ybSwgInNoYTI1NlRyYW5zZm9ybSIpOwpmdW5jdGlvbiBzaGEyNTZGYWxsYmFjayhieXRlcykgewogIGNvbnN0IEhfY29weSA9IFsuLi5IMl07CiAgY29uc3QgbXNnTGVuID0gYnl0ZXMubGVuZ3RoOwogIGNvbnN0IG1zZ0JpdExlbiA9IG1zZ0xlbiAqIDg7CiAgY29uc3QgcGFkTGVuID0gbXNnTGVuICUgNjQgPCA1NiA/IDU2IC0gbXNnTGVuICUgNjQgOiAxMjAgLSBtc2dMZW4gJSA2NDsKICBjb25zdCBwYWRkZWQgPSBuZXcgVWludDhBcnJheShtc2dMZW4gKyBwYWRMZW4gKyA4KTsKICBwYWRkZWQuc2V0KGJ5dGVzKTsKICBwYWRkZWRbbXNnTGVuXSA9IDEyODsKICBjb25zdCBkYXRhVmlldyA9IG5ldyBEYXRhVmlldyhwYWRkZWQuYnVmZmVyKTsKICBkYXRhVmlldy5zZXRVaW50MzIocGFkZGVkLmxlbmd0aCAtIDgsIDAsIGZhbHNlKTsKICBkYXRhVmlldy5zZXRVaW50MzIocGFkZGVkLmxlbmd0aCAtIDQsIG1zZ0JpdExlbiA+Pj4gMCwgZmFsc2UpOwogIGZvciAobGV0IG9mZnNldCA9IDA7IG9mZnNldCA8IHBhZGRlZC5sZW5ndGg7IG9mZnNldCArPSA2NCkgewogICAgY29uc3QgVzIgPSBuZXcgQXJyYXkoNjQpOwogICAgZm9yIChsZXQgaTEwID0gMDsgaTEwIDwgMTY7IGkxMCsrKSB7CiAgICAgIFcyW2kxMF0gPSBkYXRhVmlldy5nZXRVaW50MzIob2Zmc2V0ICsgaTEwICogNCwgZmFsc2UpOwogICAgfQogICAgc2hhMjU2VHJhbnNmb3JtKFcyLCBIX2NvcHkpOwogIH0KICBsZXQgaGV4MiA9ICIiOwogIGZvciAobGV0IGkxMCA9IDA7IGkxMCA8IDg7IGkxMCsrKSB7CiAgICBoZXgyICs9IEhfY29weVtpMTBdLnRvU3RyaW5nKDE2KS5wYWRTdGFydCg4LCAiMCIpOwogIH0KICByZXR1cm4gaGV4MjsKfQpfX25hbWUoc2hhMjU2RmFsbGJhY2ssICJzaGEyNTZGYWxsYmFjayIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0aGFzaEAzLjIuNi9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRoYXNoL2Rpc3RfdHNfd2ViL2luZGV4LmpzCnZhciBoZXggPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChidWZmZXIyKSA9PiB7CiAgY29uc3QgaGV4Q29kZXMgPSBbXTsKICBjb25zdCB2aWV3ID0gbmV3IERhdGFWaWV3KGJ1ZmZlcjIpOwogIGZvciAobGV0IGkxMCA9IDA7IGkxMCA8IHZpZXcuYnl0ZUxlbmd0aDsgaTEwICs9IDQpIHsKICAgIGNvbnN0IHZhbHVlMiA9IHZpZXcuZ2V0VWludDMyKGkxMCk7CiAgICBjb25zdCBzdHJpbmdWYWx1ZSA9IHZhbHVlMi50b1N0cmluZygxNik7CiAgICBjb25zdCBwYWRkaW5nID0gIjAwMDAwMDAwIjsKICAgIGNvbnN0IHBhZGRlZFZhbHVlID0gKHBhZGRpbmcgKyBzdHJpbmdWYWx1ZSkuc2xpY2UoLXBhZGRpbmcubGVuZ3RoKTsKICAgIGhleENvZGVzLnB1c2gocGFkZGVkVmFsdWUpOwogIH0KICByZXR1cm4gaGV4Q29kZXMuam9pbigiIik7Cn0sICJoZXgiKTsKdmFyIGlzQ3J5cHRvU3VidGxlQXZhaWxhYmxlID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoKSA9PiB7CiAgcmV0dXJuIHR5cGVvZiBjcnlwdG8gIT09ICJ1bmRlZmluZWQiICYmIGNyeXB0by5zdWJ0bGUgIT09IHZvaWQgMDsKfSwgImlzQ3J5cHRvU3VidGxlQXZhaWxhYmxlIik7CnZhciBzaGEyNTZGcm9tU3RyaW5nID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShhc3luYyAoc3RyaW5nQXJnKSA9PiB7CiAgY29uc3QgYnVmZmVyMiA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShzdHJpbmdBcmcpOwogIGlmIChpc0NyeXB0b1N1YnRsZUF2YWlsYWJsZSgpKSB7CiAgICBjb25zdCBoYXNoID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5kaWdlc3QoIlNIQS0yNTYiLCBidWZmZXIyKTsKICAgIGNvbnN0IHJlc3VsdCA9IGhleChoYXNoKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfSBlbHNlIHsKICAgIHJldHVybiBzaGEyNTZGYWxsYmFjayhidWZmZXIyKTsKICB9Cn0sICJzaGEyNTZGcm9tU3RyaW5nIik7CnZhciBzaGEyNTZGcm9tU3RyaW5nU3luYyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHN0cmluZ0FyZykgPT4gewogIGNvbnNvbGUud2Fybigic2hhMjU2RnJvbVN0cmluZ1N5bmMgaXMgbm90IHRydWx5IHN5bmNocm9ub3VzIGluIGJyb3dzZXIgZW52aXJvbm1lbnQiKTsKICB0aHJvdyBuZXcgRXJyb3IoInNoYTI1NkZyb21TdHJpbmdTeW5jIGlzIG5vdCBzdXBwb3J0ZWQgaW4gYnJvd3NlciBlbnZpcm9ubWVudC4gVXNlIHNoYTI1NkZyb21TdHJpbmcgaW5zdGVhZC4iKTsKfSwgInNoYTI1NkZyb21TdHJpbmdTeW5jIik7CnZhciBzaGEyNTZGcm9tQnVmZmVyID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShhc3luYyAoYnVmZmVyQXJnKSA9PiB7CiAgaWYgKGlzQ3J5cHRvU3VidGxlQXZhaWxhYmxlKCkpIHsKICAgIGxldCBpbnB1dEJ1ZmZlcjsKICAgIGlmIChidWZmZXJBcmcgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7CiAgICAgIGNvbnN0IHZpZXcgPSBidWZmZXJBcmc7CiAgICAgIGlucHV0QnVmZmVyID0gdmlldy5idWZmZXIuc2xpY2Uodmlldy5ieXRlT2Zmc2V0LCB2aWV3LmJ5dGVPZmZzZXQgKyB2aWV3LmJ5dGVMZW5ndGgpOwogICAgfSBlbHNlIHsKICAgICAgaW5wdXRCdWZmZXIgPSBidWZmZXJBcmc7CiAgICB9CiAgICBjb25zdCBoYXNoID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5kaWdlc3QoIlNIQS0yNTYiLCBpbnB1dEJ1ZmZlcik7CiAgICBjb25zdCByZXN1bHQgPSBoZXgoaGFzaCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0gZWxzZSB7CiAgICBjb25zdCB1aW50OEFycmF5ID0gYnVmZmVyQXJnIGluc3RhbmNlb2YgVWludDhBcnJheSA/IGJ1ZmZlckFyZyA6IG5ldyBVaW50OEFycmF5KGJ1ZmZlckFyZyk7CiAgICByZXR1cm4gc2hhMjU2RmFsbGJhY2sodWludDhBcnJheSk7CiAgfQp9LCAic2hhMjU2RnJvbUJ1ZmZlciIpOwp2YXIgc2hhMjY1RnJvbU9iamVjdCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoYXN5bmMgKG9iamVjdEFyZykgPT4gewogIGNvbnN0IHN0cmluZ2lmaWVkT2JqZWN0ID0gZGlzdF90c19leHBvcnRzMjAuc3RyaW5naWZ5KG9iamVjdEFyZyk7CiAgY29uc3QgaGFzaFJlc3VsdCA9IGF3YWl0IHNoYTI1NkZyb21TdHJpbmcoc3RyaW5naWZpZWRPYmplY3QpOwogIHJldHVybiBoYXNoUmVzdWx0Owp9LCAic2hhMjY1RnJvbU9iamVjdCIpOwp2YXIgc2hhMjU2RnJvbVN0cmVhbSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGlucHV0KSA9PiB7CiAgdGhyb3cgbmV3IEVycm9yKCJzaGEyNTZGcm9tU3RyZWFtIGlzIG5vdCBzdXBwb3J0ZWQgaW4gYnJvd3NlciBlbnZpcm9ubWVudCIpOwp9LCAic2hhMjU2RnJvbVN0cmVhbSIpOwp2YXIgc2hhMjU2RnJvbUZpbGUgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGFzeW5jIChmaWxlUGF0aCkgPT4gewogIHRocm93IG5ldyBFcnJvcigic2hhMjU2RnJvbUZpbGUgaXMgbm90IHN1cHBvcnRlZCBpbiBicm93c2VyIGVudmlyb25tZW50Iik7Cn0sICJzaGEyNTZGcm9tRmlsZSIpOwp2YXIgbWQ1RnJvbVN0cmluZyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoYXN5bmMgKHN0cmluZ1RvSGFzaCkgPT4gewogIHRocm93IG5ldyBFcnJvcigibWQ1RnJvbVN0cmluZyBpcyBub3Qgc3VwcG9ydGVkIGluIGJyb3dzZXIgZW52aXJvbm1lbnQuIFdlYiBDcnlwdG8gQVBJIGRvZXMgbm90IHN1cHBvcnQgTUQ1LiIpOwp9LCAibWQ1RnJvbVN0cmluZyIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0c3RhdGVAMi4yLjEvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0c3RhdGUvZGlzdF90cy9zbWFydHN0YXRlLmNsYXNzZXMuc3RhdGVhY3Rpb24uanMKdmFyIFN0YXRlQWN0aW9uID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlN0YXRlQWN0aW9uIik7CiAgfQogIGNvbnN0cnVjdG9yKHN0YXRlUGFydFJlZiwgYWN0aW9uRGVmKSB7CiAgICB0aGlzLnN0YXRlUGFydFJlZiA9IHN0YXRlUGFydFJlZjsKICAgIHRoaXMuYWN0aW9uRGVmID0gYWN0aW9uRGVmOwogIH0KICB0cmlnZ2VyKHBheWxvYWQpIHsKICAgIHJldHVybiB0aGlzLnN0YXRlUGFydFJlZi5kaXNwYXRjaEFjdGlvbih0aGlzLCBwYXlsb2FkKTsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRzdGF0ZUAyLjIuMS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRzdGF0ZS9kaXN0X3RzL3NtYXJ0c3RhdGUuY2xhc3Nlcy5zdGF0ZXBhcnQuanMKZnVuY3Rpb24gZnJvbUFib3J0U2lnbmFsKHNpZ25hbCkgewogIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgoc3Vic2NyaWJlcikgPT4gewogICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7CiAgICAgIHN1YnNjcmliZXIubmV4dCgpOwogICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGhhbmRsZXIyID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoKSA9PiB7CiAgICAgIHN1YnNjcmliZXIubmV4dCgpOwogICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICB9LCAiaGFuZGxlciIpOwogICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IiwgaGFuZGxlcjIpOwogICAgcmV0dXJuICgpID0+IHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsIGhhbmRsZXIyKTsKICB9KTsKfQpfX25hbWUoZnJvbUFib3J0U2lnbmFsLCAiZnJvbUFib3J0U2lnbmFsIik7CnZhciBTdGF0ZVBhcnQgPSBjbGFzcyBfU3RhdGVQYXJ0IHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJTdGF0ZVBhcnQiKTsKICB9CiAgc3RhdGljIHsKICAgIHRoaXMuTUFYX05FU1RFRF9ESVNQQVRDSF9ERVBUSCA9IDEwOwogIH0KICBjb25zdHJ1Y3RvcihuYW1lQXJnLCB3ZWJTdG9yZU9wdGlvbnNBcmcpIHsKICAgIHRoaXMuc3RhdGUgPSBuZXcgZGlzdF90c19leHBvcnRzMi5yeGpzLlN1YmplY3QoKTsKICAgIHRoaXMuY3VtdWxhdGl2ZURlZmVycmVkID0gZGlzdF90c19leHBvcnRzLmN1bXVsYXRpdmVEZWZlcigpOwogICAgdGhpcy5tdXRhdGlvblF1ZXVlID0gUHJvbWlzZS5yZXNvbHZlKCk7CiAgICB0aGlzLnBlbmRpbmdDdW11bGF0aXZlTm90aWZpY2F0aW9uID0gbnVsbDsKICAgIHRoaXMud2ViU3RvcmUgPSBudWxsOwogICAgdGhpcy5taWRkbGV3YXJlcyA9IFtdOwogICAgdGhpcy5zZWxlY3RvckNhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7CiAgICB0aGlzLmRlZmF1bHRTZWxlY3RPYnNlcnZhYmxlID0gbnVsbDsKICAgIHRoaXMubmFtZSA9IG5hbWVBcmc7CiAgICBpZiAod2ViU3RvcmVPcHRpb25zQXJnKSB7CiAgICAgIHRoaXMud2ViU3RvcmVPcHRpb25zID0gd2ViU3RvcmVPcHRpb25zQXJnOwogICAgfQogIH0KICAvKioKICAgKiBpbml0aWFsaXplcyB0aGUgd2Vic3RvcmUKICAgKi8KICBhc3luYyBpbml0KCkgewogICAgaWYgKHRoaXMud2ViU3RvcmVPcHRpb25zKSB7CiAgICAgIHRoaXMud2ViU3RvcmUgPSBuZXcgZGlzdF90c19leHBvcnRzMTMuV2ViU3RvcmUodGhpcy53ZWJTdG9yZU9wdGlvbnMpOwogICAgICBhd2FpdCB0aGlzLndlYlN0b3JlLmluaXQoKTsKICAgICAgY29uc3Qgc3RvcmVkU3RhdGUgPSBhd2FpdCB0aGlzLndlYlN0b3JlLmdldChTdHJpbmcodGhpcy5uYW1lKSk7CiAgICAgIGlmIChzdG9yZWRTdGF0ZSAmJiB0aGlzLnZhbGlkYXRlU3RhdGUoc3RvcmVkU3RhdGUpKSB7CiAgICAgICAgdGhpcy5zdGF0ZVN0b3JlID0gc3RvcmVkU3RhdGU7CiAgICAgICAgYXdhaXQgdGhpcy5ub3RpZnlDaGFuZ2UoKTsKICAgICAgfQogICAgfQogIH0KICAvKioKICAgKiBnZXRzIHRoZSBzdGF0ZSBmcm9tIHRoZSBzdGF0ZSBzdG9yZQogICAqLwogIGdldFN0YXRlKCkgewogICAgcmV0dXJuIHRoaXMuc3RhdGVTdG9yZTsKICB9CiAgLyoqCiAgICogYWRkcyBhIG1pZGRsZXdhcmUgdGhhdCBpbnRlcmNlcHRzIHNldFN0YXRlIGNhbGxzLgogICAqIG1pZGRsZXdhcmUgY2FuIHRyYW5zZm9ybSB0aGUgc3RhdGUgb3IgdGhyb3cgdG8gcmVqZWN0IGl0LgogICAqIHJldHVybnMgYSByZW1vdmFsIGZ1bmN0aW9uLgogICAqLwogIGFkZE1pZGRsZXdhcmUobWlkZGxld2FyZSkgewogICAgdGhpcy5taWRkbGV3YXJlcy5wdXNoKG1pZGRsZXdhcmUpOwogICAgcmV0dXJuICgpID0+IHsKICAgICAgY29uc3QgaWR4ID0gdGhpcy5taWRkbGV3YXJlcy5pbmRleE9mKG1pZGRsZXdhcmUpOwogICAgICBpZiAoaWR4ICE9PSAtMSkgewogICAgICAgIHRoaXMubWlkZGxld2FyZXMuc3BsaWNlKGlkeCwgMSk7CiAgICAgIH0KICAgIH07CiAgfQogIC8qKgogICAqIHNldHMgdGhlIHN0YXRlU3RvcmUgdG8gdGhlIG5ldyBzdGF0ZSAoc2VyaWFsaXplZCB2aWEgbXV0YXRpb24gcXVldWUpCiAgICovCiAgYXN5bmMgc2V0U3RhdGUobmV3U3RhdGVBcmcpIHsKICAgIHJldHVybiB0aGlzLm11dGF0aW9uUXVldWUgPSB0aGlzLm11dGF0aW9uUXVldWUudGhlbigoKSA9PiB0aGlzLmFwcGx5U3RhdGUobmV3U3RhdGVBcmcpLCAoKSA9PiB0aGlzLmFwcGx5U3RhdGUobmV3U3RhdGVBcmcpKTsKICB9CiAgLyoqCiAgICogYXBwbGllcyB0aGUgc3RhdGUgY2hhbmdlIChtaWRkbGV3YXJlIOKGkiB2YWxpZGF0ZSDihpIgcGVyc2lzdCDihpIgbm90aWZ5KQogICAqLwogIGFzeW5jIGFwcGx5U3RhdGUobmV3U3RhdGVBcmcpIHsKICAgIGxldCBwcm9jZXNzZWRTdGF0ZSA9IG5ld1N0YXRlQXJnOwogICAgZm9yIChjb25zdCBtdyBvZiB0aGlzLm1pZGRsZXdhcmVzKSB7CiAgICAgIHByb2Nlc3NlZFN0YXRlID0gYXdhaXQgbXcocHJvY2Vzc2VkU3RhdGUsIHRoaXMuc3RhdGVTdG9yZSk7CiAgICB9CiAgICBpZiAoIXRoaXMudmFsaWRhdGVTdGF0ZShwcm9jZXNzZWRTdGF0ZSkpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHN0YXRlIHN0cnVjdHVyZSBmb3Igc3RhdGUgcGFydCAnJHt0aGlzLm5hbWV9J2ApOwogICAgfQogICAgaWYgKHRoaXMud2ViU3RvcmUpIHsKICAgICAgYXdhaXQgdGhpcy53ZWJTdG9yZS5zZXQoU3RyaW5nKHRoaXMubmFtZSksIHByb2Nlc3NlZFN0YXRlKTsKICAgIH0KICAgIHRoaXMuc3RhdGVTdG9yZSA9IHByb2Nlc3NlZFN0YXRlOwogICAgYXdhaXQgdGhpcy5ub3RpZnlDaGFuZ2UoKTsKICAgIHJldHVybiB0aGlzLnN0YXRlU3RvcmU7CiAgfQogIC8qKgogICAqIFZhbGlkYXRlcyBzdGF0ZSBzdHJ1Y3R1cmUgLSBjYW4gYmUgb3ZlcnJpZGRlbiBmb3IgY3VzdG9tIHZhbGlkYXRpb24KICAgKi8KICB2YWxpZGF0ZVN0YXRlKHN0YXRlQXJnKSB7CiAgICByZXR1cm4gc3RhdGVBcmcgIT09IG51bGwgJiYgc3RhdGVBcmcgIT09IHZvaWQgMDsKICB9CiAgLyoqCiAgICogbm90aWZpZXMgb2YgYSBjaGFuZ2Ugb24gdGhlIHN0YXRlCiAgICovCiAgYXN5bmMgbm90aWZ5Q2hhbmdlKCkgewogICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLnN0YXRlU3RvcmU7CiAgICBpZiAoc25hcHNob3QgPT09IHZvaWQgMCkgewogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodGhpcy5zbWFydHN0YXRlUmVmPy5pc0JhdGNoaW5nKSB7CiAgICAgIHRoaXMuc21hcnRzdGF0ZVJlZi5yZWdpc3RlclBlbmRpbmdOb3RpZmljYXRpb24odGhpcyk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGNyZWF0ZVN0YXRlSGFzaCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoYXN5bmMgKHN0YXRlQXJnKSA9PiB7CiAgICAgIHJldHVybiBhd2FpdCBkaXN0X3RzX3dlYl9leHBvcnRzLnNoYTI1NkZyb21TdHJpbmcoZGlzdF90c19leHBvcnRzMTIuc3RhYmxlT25lV2F5U3RyaW5naWZ5KHN0YXRlQXJnKSk7CiAgICB9LCAiY3JlYXRlU3RhdGVIYXNoIik7CiAgICB0cnkgewogICAgICBjb25zdCBjdXJyZW50SGFzaCA9IGF3YWl0IGNyZWF0ZVN0YXRlSGFzaChzbmFwc2hvdCk7CiAgICAgIGlmICh0aGlzLmxhc3RTdGF0ZU5vdGlmaWNhdGlvblBheWxvYWRIYXNoICYmIGN1cnJlbnRIYXNoID09PSB0aGlzLmxhc3RTdGF0ZU5vdGlmaWNhdGlvblBheWxvYWRIYXNoKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMubGFzdFN0YXRlTm90aWZpY2F0aW9uUGF5bG9hZEhhc2ggPSBjdXJyZW50SGFzaDsKICAgIH0gY2F0Y2ggKGVycikgewogICAgICBjb25zb2xlLmVycm9yKGBTdGF0ZSBoYXNoIGNvbXB1dGF0aW9uIGZhaWxlZCBmb3IgJyR7dGhpcy5uYW1lfSc6YCwgZXJyKTsKICAgIH0KICAgIHRoaXMuc3RhdGUubmV4dChzbmFwc2hvdCk7CiAgfQogIC8qKgogICAqIGNyZWF0ZXMgYSBjdW11bGF0aXZlIG5vdGlmaWNhdGlvbiBieSBhZGRpbmcgYSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGNhbGwgc3RhY2sKICAgKi8KICBub3RpZnlDaGFuZ2VDdW11bGF0aXZlKCkgewogICAgaWYgKHRoaXMucGVuZGluZ0N1bXVsYXRpdmVOb3RpZmljYXRpb24pIHsKICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucGVuZGluZ0N1bXVsYXRpdmVOb3RpZmljYXRpb24pOwogICAgfQogICAgdGhpcy5wZW5kaW5nQ3VtdWxhdGl2ZU5vdGlmaWNhdGlvbiA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICB0aGlzLnBlbmRpbmdDdW11bGF0aXZlTm90aWZpY2F0aW9uID0gbnVsbDsKICAgICAgaWYgKHRoaXMuc3RhdGVTdG9yZSAhPT0gdm9pZCAwKSB7CiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2UoKS5jYXRjaCgoZXJyKSA9PiB7CiAgICAgICAgICBjb25zb2xlLmVycm9yKGBub3RpZnlDaGFuZ2VDdW11bGF0aXZlIGZhaWxlZCBmb3IgJyR7dGhpcy5uYW1lfSc6YCwgZXJyKTsKICAgICAgICB9KTsKICAgICAgfQogICAgfSwgMCk7CiAgfQogIC8qKgogICAqIHNlbGVjdHMgYSBzdGF0ZSBvciBhIHN1YnN0YXRlLgogICAqIHN1cHBvcnRzIGFuIG9wdGlvbmFsIEFib3J0U2lnbmFsIGZvciBhdXRvbWF0aWMgdW5zdWJzY3JpcHRpb24uCiAgICogbWVtb2l6ZXMgb2JzZXJ2YWJsZXMgYnkgc2VsZWN0b3IgZnVuY3Rpb24gcmVmZXJlbmNlLgogICAqLwogIHNlbGVjdChzZWxlY3RvckZuLCBvcHRpb25zKSB7CiAgICBjb25zdCBoYXNTaWduYWwgPSBvcHRpb25zPy5zaWduYWwgIT0gbnVsbDsKICAgIGlmICghaGFzU2lnbmFsKSB7CiAgICAgIGlmICghc2VsZWN0b3JGbikgewogICAgICAgIGlmICh0aGlzLmRlZmF1bHRTZWxlY3RPYnNlcnZhYmxlKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0U2VsZWN0T2JzZXJ2YWJsZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RvckNhY2hlLmhhcyhzZWxlY3RvckZuKSkgewogICAgICAgIHJldHVybiB0aGlzLnNlbGVjdG9yQ2FjaGUuZ2V0KHNlbGVjdG9yRm4pOwogICAgICB9CiAgICB9CiAgICBjb25zdCBlZmZlY3RpdmVTZWxlY3RvckZuID0gc2VsZWN0b3JGbiB8fCAoKHN0YXRlKSA9PiBzdGF0ZSk7CiAgICBsZXQgbWFwcGVkID0gdGhpcy5zdGF0ZS5waXBlKGRpc3RfdHNfZXhwb3J0czIucnhqcy5vcHMuc3RhcnRXaXRoKHRoaXMuZ2V0U3RhdGUoKSksIGRpc3RfdHNfZXhwb3J0czIucnhqcy5vcHMuZmlsdGVyKChzdGF0ZUFyZykgPT4gc3RhdGVBcmcgIT09IHZvaWQgMCksIGRpc3RfdHNfZXhwb3J0czIucnhqcy5vcHMubWFwKChzdGF0ZUFyZykgPT4gewogICAgICB0cnkgewogICAgICAgIHJldHVybiBlZmZlY3RpdmVTZWxlY3RvckZuKHN0YXRlQXJnKTsKICAgICAgfSBjYXRjaCAoZTEwKSB7CiAgICAgICAgY29uc29sZS5lcnJvcihgU2VsZWN0b3IgZXJyb3IgaW4gc3RhdGUgcGFydCAnJHt0aGlzLm5hbWV9JzpgLCBlMTApOwogICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgIH0KICAgIH0pKTsKICAgIGlmIChoYXNTaWduYWwpIHsKICAgICAgbWFwcGVkID0gbWFwcGVkLnBpcGUodGFrZVVudGlsKGZyb21BYm9ydFNpZ25hbChvcHRpb25zLnNpZ25hbCkpKTsKICAgICAgcmV0dXJuIG1hcHBlZDsKICAgIH0KICAgIGNvbnN0IHNoYXJlZCA9IG1hcHBlZC5waXBlKHNoYXJlUmVwbGF5KHsgYnVmZmVyU2l6ZTogMSwgcmVmQ291bnQ6IHRydWUgfSkpOwogICAgaWYgKCFzZWxlY3RvckZuKSB7CiAgICAgIHRoaXMuZGVmYXVsdFNlbGVjdE9ic2VydmFibGUgPSBzaGFyZWQ7CiAgICB9IGVsc2UgewogICAgICB0aGlzLnNlbGVjdG9yQ2FjaGUuc2V0KHNlbGVjdG9yRm4sIHNoYXJlZCk7CiAgICB9CiAgICByZXR1cm4gc2hhcmVkOwogIH0KICAvKioKICAgKiBjcmVhdGVzIGFuIGFjdGlvbiBjYXBhYmxlIG9mIG1vZGlmeWluZyB0aGUgc3RhdGUKICAgKi8KICBjcmVhdGVBY3Rpb24oYWN0aW9uRGVmKSB7CiAgICByZXR1cm4gbmV3IFN0YXRlQWN0aW9uKHRoaXMsIGFjdGlvbkRlZik7CiAgfQogIC8qKgogICAqIGNyZWF0ZXMgYSBkZXB0aC10cmFja2VkIGFjdGlvbiBjb250ZXh0IGZvciBzYWZlIG5lc3RlZCBkaXNwYXRjaC4KICAgKiBVc2luZyBjb250ZXh0LmRpc3BhdGNoKCkgd2l0aGluIGFuIGFjdGlvbkRlZiBieXBhc3NlcyB0aGUgbXV0YXRpb24gcXVldWUKICAgKiBhbmQgZXhlY3V0ZXMgdGhlIHN1Yi1hY3Rpb24gaW5saW5lLCBwcmV2ZW50aW5nIGRlYWRsb2Nrcy4KICAgKi8KICBjcmVhdGVBY3Rpb25Db250ZXh0KGRlcHRoKSB7CiAgICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgICByZXR1cm4gewogICAgICBkaXNwYXRjaDogLyogQF9fUFVSRV9fICovIF9fbmFtZShhc3luYyAoYWN0aW9uLCBwYXlsb2FkKSA9PiB7CiAgICAgICAgaWYgKGRlcHRoID49IF9TdGF0ZVBhcnQuTUFYX05FU1RFRF9ESVNQQVRDSF9ERVBUSCkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNYXhpbXVtIG5lc3RlZCBhY3Rpb24gZGlzcGF0Y2ggZGVwdGggKCR7X1N0YXRlUGFydC5NQVhfTkVTVEVEX0RJU1BBVENIX0RFUFRIfSkgZXhjZWVkZWQuIENoZWNrIGZvciBjaXJjdWxhciBhY3Rpb24gZGlzcGF0Y2hlcy5gKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgaW5uZXJDb250ZXh0ID0gc2VsZjIuY3JlYXRlQWN0aW9uQ29udGV4dChkZXB0aCArIDEpOwogICAgICAgIGNvbnN0IG5ld1N0YXRlID0gYXdhaXQgYWN0aW9uLmFjdGlvbkRlZihzZWxmMiwgcGF5bG9hZCwgaW5uZXJDb250ZXh0KTsKICAgICAgICByZXR1cm4gc2VsZjIuYXBwbHlTdGF0ZShuZXdTdGF0ZSk7CiAgICAgIH0sICJkaXNwYXRjaCIpCiAgICB9OwogIH0KICAvKioKICAgKiBkaXNwYXRjaGVzIGFuIGFjdGlvbiBvbiB0aGUgc3RhdGVwYXJ0IGxldmVsCiAgICovCiAgYXN5bmMgZGlzcGF0Y2hBY3Rpb24oc3RhdGVBY3Rpb24sIGFjdGlvblBheWxvYWQpIHsKICAgIGF3YWl0IHRoaXMuY3VtdWxhdGl2ZURlZmVycmVkLnByb21pc2U7CiAgICByZXR1cm4gdGhpcy5tdXRhdGlvblF1ZXVlID0gdGhpcy5tdXRhdGlvblF1ZXVlLnRoZW4oYXN5bmMgKCkgPT4gewogICAgICBjb25zdCBjb250ZXh0MiA9IHRoaXMuY3JlYXRlQWN0aW9uQ29udGV4dCgwKTsKICAgICAgY29uc3QgbmV3U3RhdGUgPSBhd2FpdCBzdGF0ZUFjdGlvbi5hY3Rpb25EZWYodGhpcywgYWN0aW9uUGF5bG9hZCwgY29udGV4dDIpOwogICAgICByZXR1cm4gdGhpcy5hcHBseVN0YXRlKG5ld1N0YXRlKTsKICAgIH0sIGFzeW5jICgpID0+IHsKICAgICAgY29uc3QgY29udGV4dDIgPSB0aGlzLmNyZWF0ZUFjdGlvbkNvbnRleHQoMCk7CiAgICAgIGNvbnN0IG5ld1N0YXRlID0gYXdhaXQgc3RhdGVBY3Rpb24uYWN0aW9uRGVmKHRoaXMsIGFjdGlvblBheWxvYWQsIGNvbnRleHQyKTsKICAgICAgcmV0dXJuIHRoaXMuYXBwbHlTdGF0ZShuZXdTdGF0ZSk7CiAgICB9KTsKICB9CiAgLyoqCiAgICogd2FpdHMgdW50aWwgYSBjZXJ0YWluIHBhcnQgb2YgdGhlIHN0YXRlIGJlY29tZXMgYXZhaWxhYmxlLgogICAqIHN1cHBvcnRzIG9wdGlvbmFsIHRpbWVvdXQgYW5kIEFib3J0U2lnbmFsLgogICAqLwogIGFzeW5jIHdhaXRVbnRpbFByZXNlbnQoc2VsZWN0b3JGbiwgb3B0aW9uc09yVGltZW91dCkgewogICAgbGV0IHRpbWVvdXRNczsKICAgIGxldCBzaWduYWw7CiAgICBpZiAodHlwZW9mIG9wdGlvbnNPclRpbWVvdXQgPT09ICJudW1iZXIiKSB7CiAgICAgIHRpbWVvdXRNcyA9IG9wdGlvbnNPclRpbWVvdXQ7CiAgICB9IGVsc2UgaWYgKG9wdGlvbnNPclRpbWVvdXQpIHsKICAgICAgdGltZW91dE1zID0gb3B0aW9uc09yVGltZW91dC50aW1lb3V0TXM7CiAgICAgIHNpZ25hbCA9IG9wdGlvbnNPclRpbWVvdXQuc2lnbmFsOwogICAgfQogICAgY29uc3QgZG9uZSA9IGRpc3RfdHNfZXhwb3J0cy5kZWZlcigpOwogICAgY29uc3Qgc2VsZWN0ZWRPYnNlcnZhYmxlID0gdGhpcy5zZWxlY3Qoc2VsZWN0b3JGbik7CiAgICBsZXQgcmVzb2x2ZWQgPSBmYWxzZTsKICAgIGlmIChzaWduYWw/LmFib3J0ZWQpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJBYm9ydGVkIik7CiAgICB9CiAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBzZWxlY3RlZE9ic2VydmFibGUuc3Vic2NyaWJlKCh2YWx1ZTIpID0+IHsKICAgICAgaWYgKHZhbHVlMiAhPT0gdm9pZCAwICYmIHZhbHVlMiAhPT0gbnVsbCAmJiAhcmVzb2x2ZWQpIHsKICAgICAgICByZXNvbHZlZCA9IHRydWU7CiAgICAgICAgZG9uZS5yZXNvbHZlKHZhbHVlMik7CiAgICAgIH0KICAgIH0pOwogICAgbGV0IHRpbWVvdXRJZDsKICAgIGlmICh0aW1lb3V0TXMpIHsKICAgICAgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgaWYgKCFyZXNvbHZlZCkgewogICAgICAgICAgcmVzb2x2ZWQgPSB0cnVlOwogICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICBkb25lLnJlamVjdChuZXcgRXJyb3IoYHdhaXRVbnRpbFByZXNlbnQgdGltZWQgb3V0IGFmdGVyICR7dGltZW91dE1zfW1zYCkpOwogICAgICAgIH0KICAgICAgfSwgdGltZW91dE1zKTsKICAgIH0KICAgIGNvbnN0IGFib3J0SGFuZGxlciA9IHNpZ25hbCA/ICgpID0+IHsKICAgICAgaWYgKCFyZXNvbHZlZCkgewogICAgICAgIHJlc29sdmVkID0gdHJ1ZTsKICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICBpZiAodGltZW91dElkKQogICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7CiAgICAgICAgZG9uZS5yZWplY3QobmV3IEVycm9yKCJBYm9ydGVkIikpOwogICAgICB9CiAgICB9IDogdm9pZCAwOwogICAgaWYgKHNpZ25hbCAmJiBhYm9ydEhhbmRsZXIpIHsKICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IiwgYWJvcnRIYW5kbGVyKTsKICAgIH0KICAgIHRyeSB7CiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRvbmUucHJvbWlzZTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0gZmluYWxseSB7CiAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOwogICAgICBpZiAodGltZW91dElkKQogICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpOwogICAgICBpZiAoc2lnbmFsICYmIGFib3J0SGFuZGxlcikgewogICAgICAgIHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsIGFib3J0SGFuZGxlcik7CiAgICAgIH0KICAgIH0KICB9CiAgLyoqCiAgICogaXMgZXhlY3V0ZWQKICAgKi8KICBhc3luYyBzdGF0ZVNldHVwKGZ1bmNBcmcpIHsKICAgIGNvbnN0IHJlc3VsdFByb21pc2UgPSBmdW5jQXJnKHRoaXMpOwogICAgdGhpcy5jdW11bGF0aXZlRGVmZXJyZWQuYWRkUHJvbWlzZShyZXN1bHRQcm9taXNlKTsKICAgIGF3YWl0IHRoaXMuc2V0U3RhdGUoYXdhaXQgcmVzdWx0UHJvbWlzZSk7CiAgfQogIC8qKgogICAqIGRpc3Bvc2VzIHRoZSBzdGF0ZSBwYXJ0LCBjb21wbGV0aW5nIHRoZSBTdWJqZWN0IGFuZCBjbGVhbmluZyB1cCByZXNvdXJjZXMKICAgKi8KICBkaXNwb3NlKCkgewogICAgdGhpcy5zdGF0ZS5jb21wbGV0ZSgpOwogICAgaWYgKHRoaXMucGVuZGluZ0N1bXVsYXRpdmVOb3RpZmljYXRpb24pIHsKICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucGVuZGluZ0N1bXVsYXRpdmVOb3RpZmljYXRpb24pOwogICAgICB0aGlzLnBlbmRpbmdDdW11bGF0aXZlTm90aWZpY2F0aW9uID0gbnVsbDsKICAgIH0KICAgIHRoaXMubWlkZGxld2FyZXMubGVuZ3RoID0gMDsKICAgIHRoaXMuc2VsZWN0b3JDYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpOwogICAgdGhpcy5kZWZhdWx0U2VsZWN0T2JzZXJ2YWJsZSA9IG51bGw7CiAgICB0aGlzLndlYlN0b3JlID0gbnVsbDsKICAgIHRoaXMuc21hcnRzdGF0ZVJlZiA9IHZvaWQgMDsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRzdGF0ZUAyLjIuMS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRzdGF0ZS9kaXN0X3RzL3NtYXJ0c3RhdGUuY2xhc3Nlcy5jb21wdXRlZC5qcwpmdW5jdGlvbiBjb21wdXRlZChzb3VyY2VzLCBjb21wdXRlRm4pIHsKICByZXR1cm4gY29tYmluZUxhdGVzdChzb3VyY2VzLm1hcCgoc3ApID0+IHNwLnNlbGVjdCgpKSkucGlwZShtYXAyKChzdGF0ZXMpID0+IGNvbXB1dGVGbiguLi5zdGF0ZXMpKSk7Cn0KX19uYW1lKGNvbXB1dGVkLCAiY29tcHV0ZWQiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHN0YXRlQDIuMi4xL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHN0YXRlL2Rpc3RfdHMvc21hcnRzdGF0ZS5jbGFzc2VzLnNtYXJ0c3RhdGUuanMKdmFyIFNtYXJ0c3RhdGUgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiU21hcnRzdGF0ZSIpOwogIH0KICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMuc3RhdGVQYXJ0TWFwID0ge307CiAgICB0aGlzLnBlbmRpbmdTdGF0ZVBhcnRDcmVhdGlvbiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICB0aGlzLmJhdGNoRGVwdGggPSAwOwogICAgdGhpcy5pc0ZsdXNoaW5nID0gZmFsc2U7CiAgICB0aGlzLnBlbmRpbmdOb3RpZmljYXRpb25zID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTsKICB9CiAgLyoqCiAgICogd2hldGhlciBzdGF0ZSBjaGFuZ2VzIGFyZSBjdXJyZW50bHkgYmVpbmcgYmF0Y2hlZAogICAqLwogIGdldCBpc0JhdGNoaW5nKCkgewogICAgcmV0dXJuIHRoaXMuYmF0Y2hEZXB0aCA+IDA7CiAgfQogIC8qKgogICAqIHJlZ2lzdGVycyBhIHN0YXRlIHBhcnQgZm9yIGRlZmVycmVkIG5vdGlmaWNhdGlvbiBkdXJpbmcgYSBiYXRjaAogICAqLwogIHJlZ2lzdGVyUGVuZGluZ05vdGlmaWNhdGlvbihzdGF0ZVBhcnQpIHsKICAgIHRoaXMucGVuZGluZ05vdGlmaWNhdGlvbnMuYWRkKHN0YXRlUGFydCk7CiAgfQogIC8qKgogICAqIGJhdGNoZXMgbXVsdGlwbGUgc3RhdGUgdXBkYXRlcyBzbyBzdWJzY3JpYmVycyBhcmUgb25seSBub3RpZmllZCBvbmNlIGFsbCB1cGRhdGVzIGNvbXBsZXRlCiAgICovCiAgYXN5bmMgYmF0Y2godXBkYXRlRm4pIHsKICAgIHRoaXMuYmF0Y2hEZXB0aCsrOwogICAgdHJ5IHsKICAgICAgYXdhaXQgdXBkYXRlRm4oKTsKICAgIH0gZmluYWxseSB7CiAgICAgIHRoaXMuYmF0Y2hEZXB0aC0tOwogICAgICBpZiAodGhpcy5iYXRjaERlcHRoID09PSAwICYmICF0aGlzLmlzRmx1c2hpbmcpIHsKICAgICAgICB0aGlzLmlzRmx1c2hpbmcgPSB0cnVlOwogICAgICAgIHRyeSB7CiAgICAgICAgICB3aGlsZSAodGhpcy5wZW5kaW5nTm90aWZpY2F0aW9ucy5zaXplID4gMCkgewogICAgICAgICAgICBjb25zdCBwZW5kaW5nID0gWy4uLnRoaXMucGVuZGluZ05vdGlmaWNhdGlvbnNdOwogICAgICAgICAgICB0aGlzLnBlbmRpbmdOb3RpZmljYXRpb25zLmNsZWFyKCk7CiAgICAgICAgICAgIGZvciAoY29uc3Qgc3Agb2YgcGVuZGluZykgewogICAgICAgICAgICAgIGF3YWl0IHNwLm5vdGlmeUNoYW5nZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIHRoaXMuaXNGbHVzaGluZyA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICAvKioKICAgKiBjcmVhdGVzIGEgY29tcHV0ZWQgb2JzZXJ2YWJsZSBkZXJpdmVkIGZyb20gbXVsdGlwbGUgc3RhdGUgcGFydHMKICAgKi8KICBjb21wdXRlZChzb3VyY2VzLCBjb21wdXRlRm4pIHsKICAgIHJldHVybiBjb21wdXRlZChzb3VyY2VzLCBjb21wdXRlRm4pOwogIH0KICAvKioKICAgKiBBbGxvd3MgZ2V0dGluZyBhbmQgaW5pdGlhbGl6aW5nIGEgbmV3IHN0YXRlcGFydAogICAqLwogIGFzeW5jIGdldFN0YXRlUGFydChzdGF0ZVBhcnROYW1lQXJnLCBpbml0aWFsQXJnLCBpbml0TW9kZSA9ICJzb2Z0IikgewogICAgY29uc3QgcGVuZGluZyA9IHRoaXMucGVuZGluZ1N0YXRlUGFydENyZWF0aW9uLmdldChzdGF0ZVBhcnROYW1lQXJnKTsKICAgIGlmIChwZW5kaW5nKSB7CiAgICAgIHJldHVybiBwZW5kaW5nOwogICAgfQogICAgY29uc3QgZXhpc3RpbmdTdGF0ZVBhcnQgPSB0aGlzLnN0YXRlUGFydE1hcFtzdGF0ZVBhcnROYW1lQXJnXTsKICAgIGlmIChleGlzdGluZ1N0YXRlUGFydCkgewogICAgICBzd2l0Y2ggKGluaXRNb2RlKSB7CiAgICAgICAgY2FzZSAibWFuZGF0b3J5IjoKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RhdGUgcGFydCAnJHtzdGF0ZVBhcnROYW1lQXJnfScgYWxyZWFkeSBleGlzdHMsIGJ1dCBpbml0TW9kZSBpcyAnbWFuZGF0b3J5J2ApOwogICAgICAgIGNhc2UgImZvcmNlIjoKICAgICAgICAgIGV4aXN0aW5nU3RhdGVQYXJ0LmRpc3Bvc2UoKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgInNvZnQiOgogICAgICAgIGNhc2UgInBlcnNpc3RlbnQiOgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICByZXR1cm4gZXhpc3RpbmdTdGF0ZVBhcnQ7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmIChpbml0aWFsQXJnID09PSB2b2lkIDApIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFN0YXRlIHBhcnQgJyR7c3RhdGVQYXJ0TmFtZUFyZ30nIGRvZXMgbm90IGV4aXN0IGFuZCBubyBpbml0aWFsIHN0YXRlIHByb3ZpZGVkYCk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGNyZWF0aW9uUHJvbWlzZSA9IHRoaXMuY3JlYXRlU3RhdGVQYXJ0KHN0YXRlUGFydE5hbWVBcmcsIGluaXRpYWxBcmcsIGluaXRNb2RlKTsKICAgIHRoaXMucGVuZGluZ1N0YXRlUGFydENyZWF0aW9uLnNldChzdGF0ZVBhcnROYW1lQXJnLCBjcmVhdGlvblByb21pc2UpOwogICAgdHJ5IHsKICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRpb25Qcm9taXNlOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfSBmaW5hbGx5IHsKICAgICAgdGhpcy5wZW5kaW5nU3RhdGVQYXJ0Q3JlYXRpb24uZGVsZXRlKHN0YXRlUGFydE5hbWVBcmcpOwogICAgfQogIH0KICAvKioKICAgKiBDcmVhdGVzIGEgc3RhdGVwYXJ0CiAgICovCiAgYXN5bmMgY3JlYXRlU3RhdGVQYXJ0KHN0YXRlUGFydE5hbWUsIGluaXRpYWxQYXlsb2FkQXJnLCBpbml0TW9kZSA9ICJzb2Z0IikgewogICAgY29uc3QgbmV3U3RhdGUgPSBuZXcgU3RhdGVQYXJ0KHN0YXRlUGFydE5hbWUsIGluaXRNb2RlID09PSAicGVyc2lzdGVudCIgPyB7CiAgICAgIGRiTmFtZTogInNtYXJ0c3RhdGUiLAogICAgICBzdG9yZU5hbWU6IHN0YXRlUGFydE5hbWUKICAgIH0gOiBudWxsKTsKICAgIG5ld1N0YXRlLnNtYXJ0c3RhdGVSZWYgPSB0aGlzOwogICAgYXdhaXQgbmV3U3RhdGUuaW5pdCgpOwogICAgY29uc3QgY3VycmVudFN0YXRlID0gbmV3U3RhdGUuZ2V0U3RhdGUoKTsKICAgIGlmIChpbml0TW9kZSA9PT0gInBlcnNpc3RlbnQiICYmIGN1cnJlbnRTdGF0ZSAhPT0gdm9pZCAwKSB7CiAgICAgIGF3YWl0IG5ld1N0YXRlLnNldFN0YXRlKHsKICAgICAgICAuLi5pbml0aWFsUGF5bG9hZEFyZywKICAgICAgICAuLi5jdXJyZW50U3RhdGUKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBhd2FpdCBuZXdTdGF0ZS5zZXRTdGF0ZShpbml0aWFsUGF5bG9hZEFyZyk7CiAgICB9CiAgICB0aGlzLnN0YXRlUGFydE1hcFtzdGF0ZVBhcnROYW1lXSA9IG5ld1N0YXRlOwogICAgcmV0dXJuIG5ld1N0YXRlOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHN0YXRlQDIuMi4xL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHN0YXRlL2Rpc3RfdHMvc21hcnRzdGF0ZS5jb250ZXh0cHJvdmlkZXIuanMKZnVuY3Rpb24gYXR0YWNoQ29udGV4dFByb3ZpZGVyKGVsZW1lbnQ0LCBvcHRpb25zKSB7CiAgY29uc3QgeyBjb250ZXh0OiBjb250ZXh0Miwgc3RhdGVQYXJ0LCBzZWxlY3RvckZuIH0gPSBvcHRpb25zOwogIGNvbnN0IHN1YnNjcmliZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTsKICBjb25zdCBzdWJzY3JpcHRpb24gPSBzdGF0ZVBhcnQuc2VsZWN0KHNlbGVjdG9yRm4pLnN1YnNjcmliZSgodmFsdWUyKSA9PiB7CiAgICBmb3IgKGNvbnN0IGNiIG9mIHN1YnNjcmliZXJzKSB7CiAgICAgIGNiKHZhbHVlMik7CiAgICB9CiAgfSk7CiAgY29uc3QgZ2V0VmFsdWUgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCgpID0+IHsKICAgIGNvbnN0IHN0YXRlID0gc3RhdGVQYXJ0LmdldFN0YXRlKCk7CiAgICBpZiAoc3RhdGUgPT09IHZvaWQgMCkKICAgICAgcmV0dXJuIHZvaWQgMDsKICAgIHJldHVybiBzZWxlY3RvckZuID8gc2VsZWN0b3JGbihzdGF0ZSkgOiBzdGF0ZTsKICB9LCAiZ2V0VmFsdWUiKTsKICBjb25zdCBoYW5kbGVyMiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGV2ZW50KSA9PiB7CiAgICBjb25zdCBlMTAgPSBldmVudDsKICAgIGNvbnN0IGRldGFpbCA9IGUxMC5kZXRhaWw7CiAgICBpZiAoIWRldGFpbCB8fCBkZXRhaWwuY29udGV4dCAhPT0gY29udGV4dDIpCiAgICAgIHJldHVybjsKICAgIGUxMC5zdG9wUHJvcGFnYXRpb24oKTsKICAgIGlmIChkZXRhaWwuc3Vic2NyaWJlKSB7CiAgICAgIGNvbnN0IGNiID0gZGV0YWlsLmNhbGxiYWNrOwogICAgICBzdWJzY3JpYmVycy5hZGQoY2IpOwogICAgICBjb25zdCB1bnN1YnNjcmliZSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKCkgPT4gc3Vic2NyaWJlcnMuZGVsZXRlKGNiKSwgInVuc3Vic2NyaWJlIik7CiAgICAgIGNiKGdldFZhbHVlKCksIHVuc3Vic2NyaWJlKTsKICAgIH0gZWxzZSB7CiAgICAgIGRldGFpbC5jYWxsYmFjayhnZXRWYWx1ZSgpKTsKICAgIH0KICB9LCAiaGFuZGxlciIpOwogIGVsZW1lbnQ0LmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHQtcmVxdWVzdCIsIGhhbmRsZXIyKTsKICByZXR1cm4gKCkgPT4gewogICAgZWxlbWVudDQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY29udGV4dC1yZXF1ZXN0IiwgaGFuZGxlcjIpOwogICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICBzdWJzY3JpYmVycy5jbGVhcigpOwogIH07Cn0KX19uYW1lKGF0dGFjaENvbnRleHRQcm92aWRlciwgImF0dGFjaENvbnRleHRQcm92aWRlciIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0dXJsQDMuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHVybC9kaXN0X3RzL2luZGV4LmpzCnZhciBkaXN0X3RzX2V4cG9ydHMyMiA9IHt9OwpfX2V4cG9ydChkaXN0X3RzX2V4cG9ydHMyMiwgewogIFNtYXJ0dXJsOiAoKSA9PiBTbWFydHVybAp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHVybEAzLjEuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnR1cmwvZGlzdF90cy9zbWFydHVybC5jbGFzc2VzLnNtYXJ0dXJsLmpzCnZhciBTbWFydHVybCA9IGNsYXNzIF9TbWFydHVybCB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiU21hcnR1cmwiKTsKICB9CiAgLy8gU3RhdGljIG1ldGhvZCB0byBjcmVhdGUgYSBTbWFydHVybCBpbnN0YW5jZSBmcm9tIGEgVVJMIHN0cmluZwogIHN0YXRpYyBjcmVhdGVGcm9tVXJsKHVybEFyZywgb3B0aW9uc0FyZykgewogICAgY29uc3QgcGFyc2VkVXJsSW5zdGFuY2UgPSBuZXcgVVJMKHVybEFyZyk7CiAgICBjb25zdCBzZWFyY2hQYXJhbXMgPSB7fTsKICAgIGNvbnN0IHNlYXJjaFBhcmFtUGFpcnMgPSBbXTsKICAgIGlmIChwYXJzZWRVcmxJbnN0YW5jZS5zZWFyY2gpIHsKICAgICAgcGFyc2VkVXJsSW5zdGFuY2Uuc2VhcmNoLnJlcGxhY2UoIj8iLCAiIikuc3BsaXQoIiYiKS5tYXAoKHNlYXJjaFBhcmFtUGFpcikgPT4gewogICAgICAgIHNlYXJjaFBhcmFtUGFpcnMucHVzaCh7CiAgICAgICAgICBrZXk6IHNlYXJjaFBhcmFtUGFpci5zcGxpdCgiPSIpWzBdLAogICAgICAgICAgdmFsdWU6IHNlYXJjaFBhcmFtUGFpci5zcGxpdCgiPSIpWzFdCiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfQogICAgZm9yIChjb25zdCBzZWFyY2hQYXJhbVBhaXIgb2Ygc2VhcmNoUGFyYW1QYWlycykgewogICAgICBzZWFyY2hQYXJhbXNbc2VhcmNoUGFyYW1QYWlyLmtleV0gPSBzZWFyY2hQYXJhbVBhaXIudmFsdWU7CiAgICB9CiAgICBpZiAob3B0aW9uc0FyZz8uc2VhcmNoUGFyYW1zKSB7CiAgICAgIGZvciAoY29uc3Qga2V5MiBvZiBPYmplY3Qua2V5cyhvcHRpb25zQXJnLnNlYXJjaFBhcmFtcykpIHsKICAgICAgICBzZWFyY2hQYXJhbXNba2V5Ml0gPSBvcHRpb25zQXJnLnNlYXJjaFBhcmFtc1trZXkyXTsKICAgICAgfQogICAgfQogICAgbGV0IHBhdGgyID0gcGFyc2VkVXJsSW5zdGFuY2UucGF0aG5hbWUgfHwgIiI7CiAgICBpZiAoT2JqZWN0LmtleXMoc2VhcmNoUGFyYW1zKS5sZW5ndGggPiAwKSB7CiAgICAgIHBhdGgyICs9ICI/IjsKICAgICAgbGV0IGZpcnN0MiA9IHRydWU7CiAgICAgIGZvciAoY29uc3Qga2V5MiBvZiBPYmplY3Qua2V5cyhzZWFyY2hQYXJhbXMpKSB7CiAgICAgICAgaWYgKGZpcnN0MikgewogICAgICAgICAgZmlyc3QyID0gZmFsc2U7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHBhdGgyICs9ICImIjsKICAgICAgICB9CiAgICAgICAgcGF0aDIgKz0gYCR7a2V5Mn09JHtzZWFyY2hQYXJhbXNba2V5Ml19YDsKICAgICAgfQogICAgfQogICAgY29uc3QgcGFyc2VkVXJsID0gewogICAgICAuLi5wYXJzZWRVcmxJbnN0YW5jZSwKICAgICAgaHJlZjogcGFyc2VkVXJsSW5zdGFuY2UuaHJlZiwKICAgICAgb3JpZ2luOiBwYXJzZWRVcmxJbnN0YW5jZS5vcmlnaW4sCiAgICAgIHByb3RvY29sOiBwYXJzZWRVcmxJbnN0YW5jZS5wcm90b2NvbCwKICAgICAgdXNlcm5hbWU6IHBhcnNlZFVybEluc3RhbmNlLnVzZXJuYW1lLAogICAgICBwYXNzd29yZDogcGFyc2VkVXJsSW5zdGFuY2UucGFzc3dvcmQsCiAgICAgIGhvc3Q6IHBhcnNlZFVybEluc3RhbmNlLmhvc3QsCiAgICAgIGhvc3RuYW1lOiBwYXJzZWRVcmxJbnN0YW5jZS5ob3N0bmFtZSwKICAgICAgcG9ydDogcGFyc2VkVXJsSW5zdGFuY2UucG9ydCwKICAgICAgcGF0aDogcGF0aDIsCiAgICAgIHBhdGhuYW1lOiBwYXJzZWRVcmxJbnN0YW5jZS5wYXRobmFtZSwKICAgICAgc2VhcmNoOiBwYXJzZWRVcmxJbnN0YW5jZS5zZWFyY2gsCiAgICAgIHNlYXJjaFBhcmFtcywKICAgICAgaGFzaDogcGFyc2VkVXJsSW5zdGFuY2UuaGFzaAogICAgfTsKICAgIGlmICghcGFyc2VkVXJsLnBvcnQgJiYgcGFyc2VkVXJsLnByb3RvY29sID09PSAiaHR0cHM6IikgewogICAgICBwYXJzZWRVcmwucG9ydCA9ICI0NDMiOwogICAgfQogICAgaWYgKCFwYXJzZWRVcmwucG9ydCAmJiBwYXJzZWRVcmwucHJvdG9jb2wgPT09ICJodHRwOiIpIHsKICAgICAgcGFyc2VkVXJsLnBvcnQgPSAiODAiOwogICAgfQogICAgY29uc3QgcmV0dXJuU21hcnR1cmwgPSBuZXcgX1NtYXJ0dXJsKCk7CiAgICBPYmplY3QuYXNzaWduKHJldHVyblNtYXJ0dXJsLCBwYXJzZWRVcmwpOwogICAgcmV0dXJuIHJldHVyblNtYXJ0dXJsOwogIH0KICAvLyBTdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSBhIFNtYXJ0dXJsIGluc3RhbmNlIGZyb20gYW4gZXhpc3RpbmcgSVVybE9iamVjdAogIHN0YXRpYyBjcmVhdGVGcm9tUGFyc2VkVXJsKHBhcnNlZFVybEFyZykgewogICAgY29uc3QgcmV0dXJuU21hcnR1cmwgPSBuZXcgX1NtYXJ0dXJsKCk7CiAgICBPYmplY3QuYXNzaWduKHJldHVyblNtYXJ0dXJsLCBwYXJzZWRVcmxBcmcpOwogICAgcmV0dXJuIHJldHVyblNtYXJ0dXJsOwogIH0KICAvLyBDb25zdHJ1Y3RvciBpbml0aWFsaXplcyBzZWFyY2hQYXJhbXMgYXMgYW4gZW1wdHkgb2JqZWN0CiAgY29uc3RydWN0b3IoKSB7CiAgICB0aGlzLnNlYXJjaFBhcmFtcyA9IHt9OwogIH0KICAvLyBNZXRob2QgdG8gY3JlYXRlIGFuIGluZGVwZW5kZW50IGNsb25lIG9mIHRoZSBjdXJyZW50IFNtYXJ0dXJsIGluc3RhbmNlCiAgY2xvbmUoKSB7CiAgICBjb25zdCBjbG9uZWRJbnN0YW5jZSA9IG5ldyBfU21hcnR1cmwoKTsKICAgIE9iamVjdC5hc3NpZ24oY2xvbmVkSW5zdGFuY2UsIHRoaXMpOwogICAgY2xvbmVkSW5zdGFuY2Uuc2VhcmNoUGFyYW1zID0geyAuLi50aGlzLnNlYXJjaFBhcmFtcyB9OwogICAgcmV0dXJuIGNsb25lZEluc3RhbmNlOwogIH0KICAvKioKICAgKiBUeXBlZCBtZXRob2QgdG8gc2V0IGEgcHJvcGVydHkgYW5kIHJldHVybiB0aGUgaW5zdGFuY2UgZm9yIGNoYWluaW5nLgogICAqIEBwYXJhbSBwcm9wIC0gVGhlIHByb3BlcnR5IG5hbWUgdG8gc2V0IChtdXN0IGJlIGEga2V5IG9mIFNtYXJ0dXJsKQogICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBhc3NpZ24gdG8gdGhlIHByb3BlcnR5CiAgICogQHJldHVybnMgVGhlIFNtYXJ0dXJsIGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcKICAgKi8KICBzZXQocHJvcCwgdmFsdWUyKSB7CiAgICB0aGlzW3Byb3BdID0gdmFsdWUyOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIC8vIE1ldGhvZCB0byBjb252ZXJ0IHRoZSBTbWFydHVybCBpbnN0YW5jZSBiYWNrIGludG8gYSBVUkwgc3RyaW5nCiAgdG9TdHJpbmcoKSB7CiAgICBsZXQgdXNlcnBhcnQgPSBgYDsKICAgIGlmICh0aGlzLnVzZXJuYW1lICYmICF0aGlzLnBhc3N3b3JkKSB7CiAgICAgIHVzZXJwYXJ0ID0gYCR7dGhpcy51c2VybmFtZX1AYDsKICAgIH0KICAgIGlmICh0aGlzLnVzZXJuYW1lICYmIHRoaXMucGFzc3dvcmQpIHsKICAgICAgdXNlcnBhcnQgPSBgJHt0aGlzLnVzZXJuYW1lfToke3RoaXMucGFzc3dvcmR9QGA7CiAgICB9CiAgICByZXR1cm4gYCR7dGhpcy5wcm90b2NvbH0vLyR7dXNlcnBhcnR9JHt0aGlzLmhvc3RuYW1lfToke3RoaXMucG9ydH0ke3RoaXMucGF0aH1gOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJzZXR1cEAzLjAuMTkvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnNldHVwL2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czI2ID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czI2LCB7CiAgSnNvbkxkVGFnOiAoKSA9PiBKc29uTGRUYWcsCiAgTWV0YVRhZzogKCkgPT4gTWV0YVRhZywKICBPcGVuZ3JhcGhUYWc6ICgpID0+IE9wZW5ncmFwaFRhZywKICBUaXRsZTogKCkgPT4gVGl0bGUsCiAgV2ViU2V0dXA6ICgpID0+IFdlYlNldHVwCn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNocm9ja3Mrc21hcnRkZWxheUAzLjAuMS9ub2RlX21vZHVsZXMvQHB1c2hyb2Nrcy9zbWFydGRlbGF5L2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czI0ID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czI0LCB7CiAgVGltZW91dDogKCkgPT4gVGltZW91dDIsCiAgZGVsYXlGb3I6ICgpID0+IGRlbGF5Rm9yMiwKICBkZWxheUZvclJhbmRvbTogKCkgPT4gZGVsYXlGb3JSYW5kb20yCn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNocm9ja3Mrc21hcnRwcm9taXNlQDQuMC4yL25vZGVfbW9kdWxlcy9AcHVzaHJvY2tzL3NtYXJ0cHJvbWlzZS9kaXN0X3RzL2luZGV4LmpzCnZhciBkaXN0X3RzX2V4cG9ydHMyMyA9IHt9OwpfX2V4cG9ydChkaXN0X3RzX2V4cG9ydHMyMywgewogIEN1bXVsYXRpdmVEZWZlcnJlZDogKCkgPT4gQ3VtdWxhdGl2ZURlZmVycmVkMiwKICBEZWZlcnJlZDogKCkgPT4gRGVmZXJyZWQyLAogIGN1bXVsYXRpdmVEZWZlcjogKCkgPT4gY3VtdWxhdGl2ZURlZmVyMiwKICBkZWZlcjogKCkgPT4gZGVmZXIzLAogIGdldEZpcnN0VHJ1ZU9yRmFsc2U6ICgpID0+IGdldEZpcnN0VHJ1ZU9yRmFsc2UyLAogIG1hcDogKCkgPT4gbWFwNiwKICByZWplY3RlZFByb21pc2U6ICgpID0+IHJlamVjdGVkUHJvbWlzZTIsCiAgcmVzb2x2ZWRQcm9taXNlOiAoKSA9PiByZXNvbHZlZFByb21pc2UyLAogIHRpbWVvdXRBbmRDb250aW51ZTogKCkgPT4gdGltZW91dEFuZENvbnRpbnVlMiwKICB0aW1lb3V0V3JhcDogKCkgPT4gdGltZW91dFdyYXAyCn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNocm9ja3Mrc21hcnRwcm9taXNlQDQuMC4yL25vZGVfbW9kdWxlcy9AcHVzaHJvY2tzL3NtYXJ0cHJvbWlzZS9kaXN0X3RzL3NtYXJ0cHJvbWlzZS5jbGFzc2VzLmRlZmVycmVkLmpzCnZhciBEZWZlcnJlZDIgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiRGVmZXJyZWQiKTsKICB9CiAgY2xhaW0oKSB7CiAgICBpZiAodGhpcy5jbGFpbWVkKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiRGVmZXJyZWQgYWxyZWFkeSBjbGFpbWVkIik7CiAgICB9CiAgICB0aGlzLmNsYWltZWQgPSB0cnVlOwogIH0KICBnZXQgZHVyYXRpb24oKSB7CiAgICBpZiAodGhpcy5zdG9wcGVkQXQpIHsKICAgICAgcmV0dXJuIHRoaXMuc3RvcHBlZEF0IC0gdGhpcy5zdGFydGVkQXQ7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gRGF0ZS5ub3coKSAtIHRoaXMuc3RhcnRlZEF0OwogICAgfQogIH0KICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMuY2xhaW1lZCA9IGZhbHNlOwogICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUyLCByZWplY3QpID0+IHsKICAgICAgdGhpcy5yZXNvbHZlID0gKHZhbHVlQXJnKSA9PiB7CiAgICAgICAgdGhpcy5zdGF0dXMgPSAiZnVsZmlsbGVkIjsKICAgICAgICB0aGlzLnN0b3BwZWRBdCA9IERhdGUubm93KCk7CiAgICAgICAgcmVzb2x2ZTIodmFsdWVBcmcpOwogICAgICB9OwogICAgICB0aGlzLnJlamVjdCA9IChyZWFzb24pID0+IHsKICAgICAgICB0aGlzLnN0YXR1cyA9ICJyZWplY3RlZCI7CiAgICAgICAgdGhpcy5zdG9wcGVkQXQgPSBEYXRlLm5vdygpOwogICAgICAgIHJlamVjdChyZWFzb24pOwogICAgICB9OwogICAgICB0aGlzLnN0YXJ0ZWRBdCA9IERhdGUubm93KCk7CiAgICAgIHRoaXMuc3RhdHVzID0gInBlbmRpbmciOwogICAgfSk7CiAgfQp9Owp2YXIgZGVmZXIzID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoKSA9PiB7CiAgcmV0dXJuIG5ldyBEZWZlcnJlZDIoKTsKfSwgImRlZmVyIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2hyb2NrcytzbWFydHByb21pc2VANC4wLjIvbm9kZV9tb2R1bGVzL0BwdXNocm9ja3Mvc21hcnRwcm9taXNlL2Rpc3RfdHMvc21hcnRwcm9taXNlLmNsYXNzZXMuY3VtdWxhdGl2ZWRlZmVycmVkLmpzCnZhciBDdW11bGF0aXZlRGVmZXJyZWQyID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkN1bXVsYXRpdmVEZWZlcnJlZCIpOwogIH0KICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMuYWNjdW11bGF0ZWRQcm9taXNlcyA9IFtdOwogICAgdGhpcy5kZWZlcnJlZCA9IGRlZmVyMygpOwogICAgdGhpcy5wcm9taXNlID0gdGhpcy5kZWZlcnJlZC5wcm9taXNlOwogICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7CiAgICAgIHdoaWxlICh0aGlzLmFjY3VtdWxhdGVkUHJvbWlzZXMubGVuZ3RoID4gMCkgewogICAgICAgIGNvbnN0IHBvcHBlZFByb21pc2UgPSB0aGlzLmFjY3VtdWxhdGVkUHJvbWlzZXMuc2hpZnQoKTsKICAgICAgICBhd2FpdCBwb3BwZWRQcm9taXNlOwogICAgICB9CiAgICAgIHRoaXMuZGVmZXJyZWQucmVzb2x2ZSgpOwogICAgfSwgMCk7CiAgfQogIGFkZFByb21pc2UocHJvbWlzZUFyZykgewogICAgdGhpcy5hY2N1bXVsYXRlZFByb21pc2VzLnB1c2gocHJvbWlzZUFyZyk7CiAgfQp9Owp2YXIgY3VtdWxhdGl2ZURlZmVyMiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKCkgPT4gewogIHJldHVybiBuZXcgQ3VtdWxhdGl2ZURlZmVycmVkMigpOwp9LCAiY3VtdWxhdGl2ZURlZmVyIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2hyb2NrcytzbWFydHByb21pc2VANC4wLjIvbm9kZV9tb2R1bGVzL0BwdXNocm9ja3Mvc21hcnRwcm9taXNlL2Rpc3RfdHMvaW5kZXguanMKdmFyIHJlc29sdmVkUHJvbWlzZTIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh2YWx1ZTIpID0+IHsKICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlMik7Cn0sICJyZXNvbHZlZFByb21pc2UiKTsKdmFyIHJlamVjdGVkUHJvbWlzZTIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChlcnIpID0+IHsKICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTsKfSwgInJlamVjdGVkUHJvbWlzZSIpOwp2YXIgbWFwNiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoYXN5bmMgKGlucHV0QXJnLCBmdW5jdGlvbkFyZykgPT4gewogIGNvbnN0IHByb21pc2VBcnJheSA9IFtdOwogIGNvbnN0IHJlc3VsdEFycmF5ID0gW107CiAgZm9yIChjb25zdCBpdGVtIG9mIGlucHV0QXJnKSB7CiAgICBjb25zdCBwcm9taXNlID0gZnVuY3Rpb25BcmcoaXRlbSk7CiAgICBwcm9taXNlQXJyYXkucHVzaChwcm9taXNlKTsKICAgIHByb21pc2UudGhlbigoeDMpID0+IHsKICAgICAgcmVzdWx0QXJyYXkucHVzaCh4Myk7CiAgICB9KTsKICB9CiAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZUFycmF5KTsKICByZXR1cm4gcmVzdWx0QXJyYXk7Cn0sICJtYXAiKTsKdmFyIHRpbWVvdXRXcmFwMiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoYXN5bmMgKHByb21pc2VBcmcsIHRpbWVvdXRJbk1zQXJnLCByZWplY3RBcmcgPSB0cnVlKSA9PiB7CiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlMiwgcmVqZWN0KSA9PiB7CiAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgaWYgKHJlamVjdEFyZykgewogICAgICAgIHJlamVjdChuZXcgRXJyb3IoInRpbWVvdXQiKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzb2x2ZTIobnVsbCk7CiAgICAgIH0KICAgIH0sIHRpbWVvdXRJbk1zQXJnKTsKICAgIHByb21pc2VBcmcudGhlbihyZXNvbHZlMiwgcmVqZWN0KTsKICB9KTsKfSwgInRpbWVvdXRXcmFwIik7CnZhciB0aW1lb3V0QW5kQ29udGludWUyID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShhc3luYyAocHJvbWlzZUFyZywgdGltZW91dEluTXNBcmcgPSA2ZTQpID0+IHsKICByZXR1cm4gdGltZW91dFdyYXAyKHByb21pc2VBcmcsIHRpbWVvdXRJbk1zQXJnLCBmYWxzZSk7Cn0sICJ0aW1lb3V0QW5kQ29udGludWUiKTsKdmFyIGdldEZpcnN0VHJ1ZU9yRmFsc2UyID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShhc3luYyAocHJvbWlzZXNBcmcpID0+IHsKICBjb25zdCBkb25lID0gZGVmZXIzKCk7CiAgZm9yIChjb25zdCBwcm9taXNlQXJnIG9mIHByb21pc2VzQXJnKSB7CiAgICBwcm9taXNlQXJnLnRoZW4oKHJlc3VsdEFyZykgPT4gewogICAgICBpZiAocmVzdWx0QXJnID09PSB0cnVlKSB7CiAgICAgICAgZG9uZS5yZXNvbHZlKHRydWUpOwogICAgICB9CiAgICB9KTsKICB9CiAgUHJvbWlzZS5hbGwocHJvbWlzZXNBcmcpLnRoZW4oKCkgPT4gewogICAgZG9uZS5yZXNvbHZlKGZhbHNlKTsKICB9KTsKICByZXR1cm4gZG9uZS5wcm9taXNlOwp9LCAiZ2V0Rmlyc3RUcnVlT3JGYWxzZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNocm9ja3Mrc21hcnRkZWxheUAzLjAuMS9ub2RlX21vZHVsZXMvQHB1c2hyb2Nrcy9zbWFydGRlbGF5L2Rpc3RfdHMvaW5kZXguanMKdmFyIGRlbGF5Rm9yMiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoYXN5bmMgKHRpbWVJbk1pbGxpc2Vjb25kQXJnLCBwYXNzT25BcmcsIHVucmVmZWRBcmcgPSBmYWxzZSkgPT4gewogIGNvbnN0IHRpbWVvdXQyID0gbmV3IFRpbWVvdXQyKHRpbWVJbk1pbGxpc2Vjb25kQXJnLCBudWxsLCB1bnJlZmVkQXJnKTsKICBhd2FpdCB0aW1lb3V0Mi5wcm9taXNlOwogIHJldHVybiBwYXNzT25Bcmc7Cn0sICJkZWxheUZvciIpOwp2YXIgZGVsYXlGb3JSYW5kb20yID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShhc3luYyAodGltZU1pbkluTWlsbGlzZWNvbmRBcmcsIHRpbWVNYXhJbk1pbGxpc2Vjb25kQXJnLCBwYXNzT25BcmcsIHVucmVmZWRBcmcgPSBmYWxzZSkgPT4gewogIGF3YWl0IGRlbGF5Rm9yMihNYXRoLnJhbmRvbSgpICogKHRpbWVNYXhJbk1pbGxpc2Vjb25kQXJnIC0gdGltZU1pbkluTWlsbGlzZWNvbmRBcmcpICsgdGltZU1pbkluTWlsbGlzZWNvbmRBcmcsIG51bGwsIHVucmVmZWRBcmcpOwogIHJldHVybiBwYXNzT25Bcmc7Cn0sICJkZWxheUZvclJhbmRvbSIpOwp2YXIgVGltZW91dDIgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiVGltZW91dCIpOwogIH0KICBjb25zdHJ1Y3Rvcih0aW1lSW5NaWxsaXNlY29uZEFyZywgcGFzc09uLCB1bnJlZmVkQXJnID0gZmFsc2UpIHsKICAgIHRoaXMuX2NhbmNlbGxlZCA9IGZhbHNlOwogICAgdGhpcy50aW1lb3V0SW5NaWxsaXMgPSB0aW1lSW5NaWxsaXNlY29uZEFyZzsKICAgIHRoaXMuX2RlZmVycmVkID0gZGVmZXIzKCk7CiAgICB0aGlzLnByb21pc2UgPSB0aGlzLl9kZWZlcnJlZC5wcm9taXNlOwogICAgdGhpcy5fdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICBpZiAoIXRoaXMuX2NhbmNlbGxlZCkgewogICAgICAgIHRoaXMuX2RlZmVycmVkLnJlc29sdmUocGFzc09uKTsKICAgICAgfQogICAgfSwgdGltZUluTWlsbGlzZWNvbmRBcmcpOwogICAgdGhpcy5zdGFydGVkID0gRGF0ZS5ub3coKTsKICAgIGlmICh1bnJlZmVkQXJnKSB7CiAgICAgIHRoaXMubWFrZVVucmVmZWQoKTsKICAgIH0KICB9CiAgLyoqCiAgICogdW5yZWZmaW5nIGEgdGltZW91dCBjYXVzZXMgdGhlIG5vZGUgcHJvY2VzcyB0byBub3Qgd2FpdCBmb3IgY29tcGxldGlvbiBiZWZvcmUgZXhpdAogICAqLwogIG1ha2VVbnJlZmVkKCkgewogICAgdGhpcy5fdGltZW91dC51bnJlZigpOwogIH0KICAvKioKICAgKiBjYW5jZWxzIHRoZSB0aW1lcgogICAqLwogIGNhbmNlbCgpIHsKICAgIHRoaXMuX2NhbmNlbGxlZCA9IHRydWU7CiAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCk7CiAgfQogIGdldFRpbWVMZWZ0KCkgewogICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zdGFydGVkICsgdGhpcy50aW1lb3V0SW5NaWxsaXMgLSBEYXRlLm5vdygpOwogICAgcmV0dXJuIHJlc3VsdCA+IDAgPyByZXN1bHQgOiAwOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czI1ID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czI1LCB7CiAgYnVzaW5lc3M6ICgpID0+IGJ1c2luZXNzX2V4cG9ydHMsCiAgY29kZTogKCkgPT4gY29kZV9leHBvcnRzLAogIGNvbnRhaW5lcjogKCkgPT4gY29udGFpbmVyX2V4cG9ydHMsCiAgY29udGVudDogKCkgPT4gY29udGVudF9leHBvcnRzLAogIGRhdGFiYXNlOiAoKSA9PiBkYXRhYmFzZV9leHBvcnRzLAogIGZpbmFuY2U6ICgpID0+IGZpbmFuY2VfZXhwb3J0cywKICBnZW5lcmFsOiAoKSA9PiBnZW5lcmFsX2V4cG9ydHMsCiAgbmV0d29yazogKCkgPT4gbmV0d29ya19leHBvcnRzLAogIHNhYXM6ICgpID0+IHNhYXNfZXhwb3J0cywKICBzdG9yYWdlOiAoKSA9PiBzdG9yYWdlX2V4cG9ydHMsCiAgd2Vic2l0ZTogKCkgPT4gd2Vic2l0ZV9leHBvcnRzCn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9idXNpbmVzcy9pbmRleC5qcwp2YXIgYnVzaW5lc3NfZXhwb3J0cyA9IHt9OwpfX2V4cG9ydChidXNpbmVzc19leHBvcnRzLCB7CiAgSUpvYjogKCkgPT4gSUpvYgp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvZmluYW5jZS9pbmRleC5qcwp2YXIgZmluYW5jZV9leHBvcnRzID0ge307CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2J1c2luZXNzL2pvYi5qcwp2YXIgSUpvYiA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJJSm9iIik7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9kYXRhYmFzZS9pbmRleC5qcwp2YXIgZGF0YWJhc2VfZXhwb3J0cyA9IHt9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9jb2RlL2luZGV4LmpzCnZhciBjb2RlX2V4cG9ydHMgPSB7fTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvY29udGFpbmVyL2luZGV4LmpzCnZhciBjb250YWluZXJfZXhwb3J0cyA9IHt9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9jb250ZW50L2luZGV4LmpzCnZhciBjb250ZW50X2V4cG9ydHMgPSB7fTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvZ2VuZXJhbC9pbmRleC5qcwp2YXIgZ2VuZXJhbF9leHBvcnRzID0ge307CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL25ldHdvcmsvaW5kZXguanMKdmFyIG5ldHdvcmtfZXhwb3J0cyA9IHt9OwpfX2V4cG9ydChuZXR3b3JrX2V4cG9ydHMsIHsKICBJQ25hbWVEZXNjcmlwdG9yOiAoKSA9PiBJQ25hbWVEZXNjcmlwdG9yCn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9uZXR3b3JrL2NuYW1lLmpzCnZhciBJQ25hbWVEZXNjcmlwdG9yID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIklDbmFtZURlc2NyaXB0b3IiKTsKICB9Cn07CjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvc2Fhcy9pbmRleC5qcwp2YXIgc2Fhc19leHBvcnRzID0ge307CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL3N0b3JhZ2UvaW5kZXguanMKdmFyIHN0b3JhZ2VfZXhwb3J0cyA9IHt9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy93ZWJzaXRlL2luZGV4LmpzCnZhciB3ZWJzaXRlX2V4cG9ydHMgPSB7fTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJzZXR1cEAzLjAuMTkvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnNldHVwL2Rpc3RfdHMvd2Vic2V0dXAuY2xhc3Nlcy50YWcuanMKdmFyIFRhZyA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJUYWciKTsKICB9CiAgYXBwZW5kVG9Eb20oKSB7CiAgICBpZiAoIXRoaXMuZWxlbWVudFJlZi5wYXJlbnRFbGVtZW50ICYmICF0aGlzLmVsZW1lbnRSZWYucGFyZW50Tm9kZSkgewogICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdLmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudFJlZik7CiAgICB9CiAgfQogIHJlbW92ZUZyb21Eb20oKSB7CiAgICBpZiAodGhpcy5lbGVtZW50UmVmLnBhcmVudEVsZW1lbnQpIHsKICAgICAgdGhpcy5lbGVtZW50UmVmLnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcy5lbGVtZW50UmVmKTsKICAgIH0gZWxzZSBpZiAodGhpcy5lbGVtZW50UmVmLnBhcmVudE5vZGUpIHsKICAgICAgdGhpcy5lbGVtZW50UmVmLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5lbGVtZW50UmVmKTsKICAgIH0KICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrd2Vic2V0dXBAMy4wLjE5L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJzZXR1cC9kaXN0X3RzL3dlYnNldHVwLmNsYXNzZXMudGFnLmpzb25sZHRhZy5qcwp2YXIgSnNvbkxkVGFnID0gY2xhc3MgX0pzb25MZFRhZyBleHRlbmRzIFRhZyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiSnNvbkxkVGFnIik7CiAgfQogIHN0YXRpYyBjcmVhdGVDb21wYW55SnNvbkxkKGNvbXBhbnlEYXRhQXJnKSB7CiAgICBjb25zdCBjb21wYW55TGQgPSB7CiAgICAgICJAY29udGV4dCI6ICJodHRwczovL3NjaGVtYS5vcmciLAogICAgICAiQHR5cGUiOiAiQ29ycG9yYXRpb24iLAogICAgICBuYW1lOiBjb21wYW55RGF0YUFyZy5uYW1lLAogICAgICBhbHRlcm5hdGVOYW1lOiBjb21wYW55RGF0YUFyZy5uYW1lLnJlcGxhY2UoIiBHbWJIIiwgIiIpLAogICAgICB1cmw6IGNvbXBhbnlEYXRhQXJnLmNvbnRhY3Qud2Vic2l0ZSwKICAgICAgbG9nbzogY29tcGFueURhdGFBcmcuY29udGFjdC5sb2dvVXJsLAogICAgICBjb250YWN0UG9pbnQ6IHsKICAgICAgICAiQHR5cGUiOiAiQ29udGFjdFBvaW50IiwKICAgICAgICB0ZWxlcGhvbmU6IGNvbXBhbnlEYXRhQXJnLmNvbnRhY3QucGhvbmUsCiAgICAgICAgY29udGFjdFR5cGU6ICJjdXN0b21lciBzZXJ2aWNlIiwKICAgICAgICBhcmVhU2VydmVkOiAiREUiLAogICAgICAgIGF2YWlsYWJsZUxhbmd1YWdlOiBbImVuIiwgIkdlcm1hbiJdCiAgICAgIH0sCiAgICAgIHNhbWVBczogW10KICAgIH07CiAgICBpZiAoY29tcGFueURhdGFBcmcuY29udGFjdC5mYWNlYm9va1VybCkgewogICAgICBjb21wYW55TGQuc2FtZUFzLnB1c2goY29tcGFueURhdGFBcmcuY29udGFjdC5mYWNlYm9va1VybCk7CiAgICB9CiAgICBpZiAoY29tcGFueURhdGFBcmcuY29udGFjdC50d2l0dGVyVXJsKSB7CiAgICAgIGNvbXBhbnlMZC5zYW1lQXMucHVzaChjb21wYW55RGF0YUFyZy5jb250YWN0LnR3aXR0ZXJVcmwpOwogICAgfQogICAgY29uc3QgbGRUYWcgPSBuZXcgX0pzb25MZFRhZyhjb21wYW55TGQpOwogICAgcmV0dXJuIGxkVGFnOwogIH0KICBzdGF0aWMgY3JlYXRlTmV3c0FydGljbGVKc29uTGQobmV3c0FydGljbGVBcmcpIHsKICAgIGNvbnN0IG5ld3NBcnRpY2xlTGQgPSB7CiAgICAgICJAY29udGV4dCI6ICJodHRwczovL3NjaGVtYS5vcmciLAogICAgICAiQHR5cGUiOiAiTmV3c0FydGljbGUiLAogICAgICBtYWluRW50aXR5T2ZQYWdlOiB7CiAgICAgICAgIkB0eXBlIjogIldlYlBhZ2UiLAogICAgICAgICJAaWQiOiB3aW5kb3cubG9jYXRpb24uaHJlZgogICAgICB9LAogICAgICBoZWFkbGluZTogIkFydGljbGUgaGVhZGxpbmUiLAogICAgICBpbWFnZTogW25ld3NBcnRpY2xlQXJnLmZlYXR1cmVkSW1hZ2VVcmxdLAogICAgICBkYXRlUHVibGlzaGVkOiBuZXcgRGF0ZShuZXdzQXJ0aWNsZUFyZy50aW1lc3RhbXApLnRvSVNPU3RyaW5nKCksCiAgICAgIGRhdGVNb2RpZmllZDogbmV3IERhdGUobmV3c0FydGljbGVBcmcudGltZXN0YW1wKS50b0lTT1N0cmluZygpLAogICAgICBhdXRob3I6IHsKICAgICAgICAiQHR5cGUiOiAiUGVyc29uIiwKICAgICAgICBuYW1lOiBgJHtuZXdzQXJ0aWNsZUFyZy5hdXRob3IuZmlyc3ROYW1lfSAke25ld3NBcnRpY2xlQXJnLmF1dGhvci5zdXJOYW1lfWAKICAgICAgfSwKICAgICAgcHVibGlzaGVyOiB7CiAgICAgICAgIkB0eXBlIjogIk9yZ2FuaXphdGlvbiIsCiAgICAgICAgbmFtZTogbmV3c0FydGljbGVBcmcuYXV0aG9yLnN1ck5hbWUsCiAgICAgICAgbG9nbzogewogICAgICAgICAgIkB0eXBlIjogIkltYWdlT2JqZWN0IiwKICAgICAgICAgIHVybDogbmV3c0FydGljbGVBcmcuYXV0aG9yLnN1ck5hbWUKICAgICAgICAgIC8vIFRPRE8KICAgICAgICB9CiAgICAgIH0sCiAgICAgIGRlc2NyaXB0aW9uOiBuZXdzQXJ0aWNsZUFyZy5hdXRob3IuZmlyc3ROYW1lCiAgICB9OwogICAgY29uc3QgbGRUYWcgPSBuZXcgX0pzb25MZFRhZyhuZXdzQXJ0aWNsZUxkKTsKICAgIHJldHVybiBsZFRhZzsKICB9CiAgc3RhdGljIGNyZWF0ZVByb2R1Y3RKc29uTGQocHJvZHVjdEFyZywgcHVibGlzaGVyQXJnKSB7CiAgICBjb25zdCBwcm9kdWN0TGQgPSB7CiAgICAgICJAY29udGV4dCI6ICJodHRwczovL3NjaGVtYS5vcmciLAogICAgICAiQHR5cGUiOiAiU29mdHdhcmVBcHBsaWNhdGlvbiIsCiAgICAgIG5hbWU6IHByb2R1Y3RBcmcubmFtZSwKICAgICAgZGVzY3JpcHRpb246IHByb2R1Y3RBcmcuZGVzY3JpcHRpb24sCiAgICAgIG9wZXJhdGluZ1N5c3RlbTogcHJvZHVjdEFyZy5vcywKICAgICAgYXBwbGljYXRpb25DYXRlZ29yeTogcHJvZHVjdEFyZy5jYXRlZ29yeSwKICAgICAgb2ZmZXJzOiB7CiAgICAgICAgIkB0eXBlIjogIk9mZmVyIiwKICAgICAgICBuYW1lOiAiVXNlci1iYXNlZCBQbGFuIiwKICAgICAgICBwcmljZVNwZWNpZmljYXRpb246IHsKICAgICAgICAgICJAdHlwZSI6ICJQcm9wZXJ0eVZhbHVlU3BlY2lmaWNhdGlvbiIsCiAgICAgICAgICB2YWx1ZU5hbWU6ICJOdW1iZXIgb2YgVXNlcnMiLAogICAgICAgICAgdmFsdWVSZXF1aXJlZDogdHJ1ZSwKICAgICAgICAgIHByaWNlOiAiNC45OSIsCiAgICAgICAgICBwcmljZUN1cnJlbmN5OiAiRVVSIgogICAgICAgIH0KICAgICAgfSwKICAgICAgcHVibGlzaGVyOiB0aGlzLmNyZWF0ZUNvbXBhbnlKc29uTGQocHVibGlzaGVyQXJnKS5lbGVtZW50UmVmLnRleHRDb250ZW50LAogICAgICBzY3JlZW5zaG90OiAiaHR0cHM6Ly93d3cuc29jaWFsLmlvL3NjcmVlbnNob3QucG5nIiwKICAgICAgdXJsOiAiaHR0cHM6Ly93d3cuc29jaWFsLmlvLyIKICAgIH07CiAgICBjb25zdCBsZFRhZyA9IG5ldyBfSnNvbkxkVGFnKHByb2R1Y3RMZCk7CiAgICByZXR1cm4gbGRUYWc7CiAgfQogIC8vIElOU1RBTkNFCiAgY29uc3RydWN0b3IobGRPYmplY3RBcmcpIHsKICAgIHN1cGVyKCk7CiAgICBjb25zdCBqc29uTGRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CiAgICBqc29uTGRFbGVtZW50LnR5cGUgPSAiYXBwbGljYXRpb24vbGQranNvbiI7CiAgICBqc29uTGRFbGVtZW50LnRleHQgPSBKU09OLnN0cmluZ2lmeShsZE9iamVjdEFyZyk7CiAgICB0aGlzLmVsZW1lbnRSZWYgPSBqc29uTGRFbGVtZW50OwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJzZXR1cEAzLjAuMTkvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnNldHVwL2Rpc3RfdHMvd2Vic2V0dXAuY2xhc3Nlcy50YWcub3BlbmdyYXBodGFnLmpzCnZhciBPcGVuZ3JhcGhUYWcgPSBjbGFzcyBfT3BlbmdyYXBoVGFnIGV4dGVuZHMgVGFnIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJPcGVuZ3JhcGhUYWciKTsKICB9CiAgc3RhdGljIGNyZWF0ZU5ld3NBcnRpY2xlT2dUYWdzKG5ld3NBcnRpY2xlQXJnKSB7CiAgICBjb25zdCB0YWdBcnJheSA9IFtdOwogICAgdGFnQXJyYXkucHVzaChuZXcgX09wZW5ncmFwaFRhZygib2c6dXJsIiwgbmV3c0FydGljbGVBcmcudXJsKSk7CiAgICB0YWdBcnJheS5wdXNoKG5ldyBfT3BlbmdyYXBoVGFnKCJvZzp0aXRsZSIsIG5ld3NBcnRpY2xlQXJnLnRpdGxlKSk7CiAgICB0YWdBcnJheS5wdXNoKG5ldyBfT3BlbmdyYXBoVGFnKCJvZzpkZXNjcmlwdGlvbiIsIG5ld3NBcnRpY2xlQXJnLmNvbnRlbnQpKTsKICAgIHRhZ0FycmF5LnB1c2gobmV3IF9PcGVuZ3JhcGhUYWcoIm9nOmltYWdlIiwgbmV3c0FydGljbGVBcmcuZmVhdHVyZWRJbWFnZVVybCkpOwogICAgcmV0dXJuIHRhZ0FycmF5OwogIH0KICBzdGF0aWMgY3JlYXRlUHJvZHVjdE9nVGFncyhwcm9kdWN0QXJnKSB7CiAgICBjb25zdCB0YWdBcnJheSA9IFtdOwogICAgdGFnQXJyYXkucHVzaChuZXcgX09wZW5ncmFwaFRhZygib2c6dXJsIiwgZ2xvYmFsVGhpcy5sb2NhdGlvbi5ocmVmKSk7CiAgICB0YWdBcnJheS5wdXNoKG5ldyBfT3BlbmdyYXBoVGFnKCJvZzp0aXRsZSIsIGAke3Byb2R1Y3RBcmcubmFtZX0gLSAke3Byb2R1Y3RBcmcuc2xvZ2FufWApKTsKICAgIHRhZ0FycmF5LnB1c2gobmV3IF9PcGVuZ3JhcGhUYWcoIm9nOnNpdGVfbmFtZSIsIHByb2R1Y3RBcmcubmFtZSkpOwogICAgdGFnQXJyYXkucHVzaChuZXcgX09wZW5ncmFwaFRhZygib2c6ZGVzY3JpcHRpb24iLCBwcm9kdWN0QXJnLmRlc2NyaXB0aW9uKSk7CiAgICB0YWdBcnJheS5wdXNoKG5ldyBfT3BlbmdyYXBoVGFnKCJvZzppbWFnZSIsIHByb2R1Y3RBcmcubG9nb0xpbmspKTsKICAgIHJldHVybiB0YWdBcnJheTsKICB9CiAgY29uc3RydWN0b3IocHJvcGVydHlOYW1lQXJnLCBjb250ZW50QXJnKSB7CiAgICBzdXBlcigpOwogICAgY29uc3Qgb3BlbkdyYXBoRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm1ldGEiKTsKICAgIG9wZW5HcmFwaEVsZW1lbnQuc2V0QXR0cmlidXRlKCJwcm9wZXJ0eSIsIHByb3BlcnR5TmFtZUFyZyk7CiAgICBvcGVuR3JhcGhFbGVtZW50LmNvbnRlbnQgPSBjb250ZW50QXJnOwogICAgdGhpcy5lbGVtZW50UmVmID0gb3BlbkdyYXBoRWxlbWVudDsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrd2Vic2V0dXBAMy4wLjE5L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJzZXR1cC9kaXN0X3RzL3dlYnNldHVwLmNsYXNzZXMudGFnbGV2ZWwuanMKdmFyIFRhZ0xldmVsID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlRhZ0xldmVsIik7CiAgfQogIHNldCB0aXRsZSh0aXRsZUFyZykgewogICAgdGhpcy50aXRsZVN0b3JlID0gdGl0bGVBcmc7CiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gImVuYWJsZWQiKSB7CiAgICAgIGRvY3VtZW50LnRpdGxlID0gdGhpcy50aXRsZVN0b3JlOwogICAgfQogIH0KICBnZXQgdGl0bGUoKSB7CiAgICByZXR1cm4gdGhpcy50aXRsZVN0b3JlOwogIH0KICBjb25zdHJ1Y3Rvcih0YWdNYW5hZ2VyUmVmQXJnLCBsZXZlbFR5cGUpIHsKICAgIHRoaXMudGFncyA9IFtdOwogICAgdGhpcy5zdGF0ZSA9ICJkaXNhYmxlZCI7CiAgICB0aGlzLnRhZ01hbmFnZXJSZWYgPSB0YWdNYW5hZ2VyUmVmQXJnOwogIH0KICBhZGRUYWcodGFnQXJnKSB7CiAgICBpZiAodGFnQXJnIGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgZm9yIChjb25zdCB0YWdBcmcyIG9mIHRhZ0FyZykgewogICAgICAgIHRoaXMuYWRkVGFnKHRhZ0FyZzIpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB0aGlzLnRhZ3MucHVzaCh0YWdBcmcpOwogICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gImVuYWJsZWQiKSB7CiAgICAgICAgdGFnQXJnLmFwcGVuZFRvRG9tKCk7CiAgICAgIH0KICAgIH0KICB9CiAgYXN5bmMgYWRkQ29tcGFueUluZm8oY29tcGFueURhdGFBcmcpIHsKICAgIHRoaXMuYWRkVGFnKEpzb25MZFRhZy5jcmVhdGVDb21wYW55SnNvbkxkKGNvbXBhbnlEYXRhQXJnKSk7CiAgICB0aGlzLmFkZFRhZyhuZXcgT3BlbmdyYXBoVGFnKCJvZzp0eXBlIiwgImJ1c2luZXNzLmJ1c2luZXNzIikpOwogICAgdGhpcy5hZGRUYWcobmV3IE9wZW5ncmFwaFRhZygib2c6dGl0bGUiLCBjb21wYW55RGF0YUFyZy5uYW1lKSk7CiAgICB0aGlzLmFkZFRhZyhuZXcgT3BlbmdyYXBoVGFnKCJvZzp1cmwiLCBjb21wYW55RGF0YUFyZy5jb250YWN0LndlYnNpdGUpKTsKICAgIHRoaXMuYWRkVGFnKG5ldyBPcGVuZ3JhcGhUYWcoIm9nOmltYWdlIiwgY29tcGFueURhdGFBcmcuY29udGFjdC5sb2dvVXJsKSk7CiAgICB0aGlzLmFkZFRhZyhuZXcgT3BlbmdyYXBoVGFnKCJidXNpbmVzczpjb250YWN0X2RhdGE6c3RyZWV0X2FkZHJlc3MiLCBgJHtjb21wYW55RGF0YUFyZy5jb250YWN0LmFkZHJlc3Muc3RyZWV0TmFtZX0gJHtjb21wYW55RGF0YUFyZy5jb250YWN0LmFkZHJlc3MuaG91c2VOdW1iZXJ9YCkpOwogICAgdGhpcy5hZGRUYWcobmV3IE9wZW5ncmFwaFRhZygiYnVzaW5lc3M6Y29udGFjdF9kYXRhOmxvY2FsaXR5IiwgY29tcGFueURhdGFBcmcuY29udGFjdC5hZGRyZXNzLnBvc3RhbENvZGUpKTsKICAgIHRoaXMuYWRkVGFnKG5ldyBPcGVuZ3JhcGhUYWcoImJ1c2luZXNzOmNvbnRhY3RfZGF0YTpyZWdpb24iLCBjb21wYW55RGF0YUFyZy5jb250YWN0LmFkZHJlc3MuY2l0eSkpOwogICAgdGhpcy5hZGRUYWcobmV3IE9wZW5ncmFwaFRhZygiYnVzaW5lc3M6Y29udGFjdF9kYXRhOnBvc3RhbF9jb2RlIiwgY29tcGFueURhdGFBcmcuY29udGFjdC5hZGRyZXNzLnBvc3RhbENvZGUpKTsKICAgIHRoaXMuYWRkVGFnKG5ldyBPcGVuZ3JhcGhUYWcoImJ1c2luZXNzOmNvbnRhY3RfZGF0YTpjb3VudHJ5X25hbWUiLCBjb21wYW55RGF0YUFyZy5jb250YWN0LmFkZHJlc3MuY291bnRyeSkpOwogIH0KICBhZGROZXdzQXJ0aWNsZUluZm8oYXJ0aWNsZUFyZykgewogICAgdGhpcy5hZGRUYWcoSnNvbkxkVGFnLmNyZWF0ZU5ld3NBcnRpY2xlSnNvbkxkKGFydGljbGVBcmcpKTsKICAgIHRoaXMuYWRkVGFnKE9wZW5ncmFwaFRhZy5jcmVhdGVOZXdzQXJ0aWNsZU9nVGFncyhhcnRpY2xlQXJnKSk7CiAgfQogIGFkZFByb2R1Y3RJbmZvKHByb2R1Y3RBcmcsIGNvbXBhbnlBcmcpIHsKICAgIHRoaXMuYWRkVGFnKEpzb25MZFRhZy5jcmVhdGVQcm9kdWN0SnNvbkxkKHByb2R1Y3RBcmcsIGNvbXBhbnlBcmcpKTsKICAgIHRoaXMuYWRkVGFnKE9wZW5ncmFwaFRhZy5jcmVhdGVQcm9kdWN0T2dUYWdzKHByb2R1Y3RBcmcpKTsKICB9CiAgYXN5bmMgZW5hYmxlKCkgewogICAgaWYgKHRoaXMudGl0bGUpIHsKICAgICAgZG9jdW1lbnQudGl0bGUgPSB0aGlzLnRpdGxlOwogICAgfQogICAgZm9yIChjb25zdCB0YWdBcmcgb2YgdGhpcy50YWdzKSB7CiAgICAgIHRhZ0FyZy5hcHBlbmRUb0RvbSgpOwogICAgfQogICAgdGhpcy5zdGF0ZSA9ICJlbmFibGVkIjsKICB9CiAgYXN5bmMgZGlzYWJsZSgpIHsKICAgIGZvciAoY29uc3QgdGFnQXJnIG9mIHRoaXMudGFncykgewogICAgICB0YWdBcmcucmVtb3ZlRnJvbURvbSgpOwogICAgfQogICAgdGhpcy5zdGF0ZSA9ICJkaXNhYmxlZCI7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnNldHVwQDMuMC4xOS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2Vic2V0dXAvZGlzdF90cy93ZWJzZXR1cC5jbGFzc2VzLnRhZy5tZXRhdGFnLmpzCnZhciBNZXRhVGFnID0gY2xhc3MgZXh0ZW5kcyBUYWcgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIk1ldGFUYWciKTsKICB9CiAgY29uc3RydWN0b3IobWV0YU5hbWVBcmcsIGNvbnRlbnRBcmcpIHsKICAgIHN1cGVyKCk7CiAgICBjb25zdCBtZXRhRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm1ldGEiKTsKICAgIG1ldGFFbGVtZW50Lm5hbWUgPSBtZXRhTmFtZUFyZzsKICAgIG1ldGFFbGVtZW50LmNvbnRlbnQgPSBjb250ZW50QXJnOwogICAgdGhpcy5lbGVtZW50UmVmID0gbWV0YUVsZW1lbnQ7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnNldHVwQDMuMC4xOS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2Vic2V0dXAvZGlzdF90cy93ZWJzZXR1cC5jbGFzc2VzLnRhZ21hbmFnZXIuanMKdmFyIFRhZ01hbmFnZXIgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiVGFnTWFuYWdlciIpOwogIH0KICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMuZ2xvYmFsTGV2ZWwgPSBuZXcgVGFnTGV2ZWwodGhpcywgImdsb2JhbCIpOwogICAgdGhpcy5iYXNlTGV2ZWwgPSBuZXcgVGFnTGV2ZWwodGhpcywgImJhc2UiKTsKICB9CiAgYXN5bmMgc2V0dXAobWV0YU9iamVjdEFyZykgewogICAgdGhpcy5nbG9iYWxMZXZlbC5hZGRUYWcobmV3IE1ldGFUYWcoImdvb2dsZSIsICJub3RyYW5zbGF0ZSIpKTsKICAgIHRoaXMuZ2xvYmFsTGV2ZWwuYWRkVGFnKG5ldyBNZXRhVGFnKCJyZXZpc2l0LWFmdGVyIiwgIjEgZGF5cyIpKTsKICAgIGlmIChtZXRhT2JqZWN0QXJnLnR3aXR0ZXJIYW5kbGUpIHsKICAgICAgdGhpcy5nbG9iYWxMZXZlbC5hZGRUYWcobmV3IE1ldGFUYWcoInR3aXR0ZXI6Y2FyZCIsICJzdW1tYXJ5X2xhcmdlX2ltYWdlIikpOwogICAgICB0aGlzLmdsb2JhbExldmVsLmFkZFRhZyhuZXcgTWV0YVRhZygidHdpdHRlcjpzaXRlIiwgbWV0YU9iamVjdEFyZy50d2l0dGVySGFuZGxlKSk7CiAgICAgIHRoaXMuZ2xvYmFsTGV2ZWwuYWRkVGFnKG5ldyBNZXRhVGFnKCJ0d2l0dGVyOmNyZWF0b3IiLCBtZXRhT2JqZWN0QXJnLnR3aXR0ZXJIYW5kbGUpKTsKICAgIH0KICAgIHRoaXMuYmFzZUxldmVsLnRpdGxlID0gbWV0YU9iamVjdEFyZy50aXRsZTsKICAgIGlmIChtZXRhT2JqZWN0QXJnLmRlc2NyaXB0aW9uKSB7CiAgICAgIHRoaXMuYmFzZUxldmVsLmFkZFRhZyhuZXcgTWV0YVRhZygiZGVzY3JpcHRpb24iLCBtZXRhT2JqZWN0QXJnLmRlc2NyaXB0aW9uKSk7CiAgICB9CiAgICBpZiAobWV0YU9iamVjdEFyZy5jYW5vbmljYWxEb21haW4pIHsKICAgICAgdGhpcy5iYXNlTGV2ZWwuYWRkVGFnKG5ldyBNZXRhVGFnKCJjYW5vbmljYWwiLCBtZXRhT2JqZWN0QXJnLmNhbm9uaWNhbERvbWFpbikpOwogICAgfQogICAgc3dpdGNoICh0cnVlKSB7CiAgICAgIGNhc2UgKG1ldGFPYmplY3RBcmcubGRDb21wYW55ICYmICFtZXRhT2JqZWN0QXJnLmxkUHJvZHVjdCk6CiAgICAgICAgdGhpcy5iYXNlTGV2ZWwuYWRkQ29tcGFueUluZm8obWV0YU9iamVjdEFyZy5sZENvbXBhbnkpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICEhbWV0YU9iamVjdEFyZy5sZFByb2R1Y3Q6CiAgICAgICAgdGhpcy5iYXNlTGV2ZWwuYWRkUHJvZHVjdEluZm8obWV0YU9iamVjdEFyZy5sZFByb2R1Y3QsIG1ldGFPYmplY3RBcmcubGRDb21wYW55KTsKICAgICAgICBicmVhazsKICAgIH0KICAgIGF3YWl0IHRoaXMuZ2xvYmFsTGV2ZWwuZW5hYmxlKCk7CiAgICB0aGlzLmFjdGl2ZUxldmVsID0gdGhpcy5iYXNlTGV2ZWw7CiAgICBhd2FpdCB0aGlzLmFjdGl2ZUxldmVsLmVuYWJsZSgpOwogIH0KICBhc3luYyBzZXRTdWJQYWdlTGV2ZWwobWV0YU9iamVjdEFyZykgewogICAgY29uc3Qgc3ViUGFnZUxldmVsID0gbmV3IFRhZ0xldmVsKHRoaXMsICJzdWJwYWdlIik7CiAgICBzdWJQYWdlTGV2ZWwudGl0bGUgPSBtZXRhT2JqZWN0QXJnLnRpdGxlOwogICAgaWYgKG1ldGFPYmplY3RBcmcuZGVzY3JpcHRpb24pIHsKICAgICAgc3ViUGFnZUxldmVsLmFkZFRhZyhuZXcgTWV0YVRhZygiZGVzY3JpcHRpb24iLCBtZXRhT2JqZWN0QXJnLmRlc2NyaXB0aW9uKSk7CiAgICB9CiAgICBhd2FpdCB0aGlzLmFjdGl2ZUxldmVsLmRpc2FibGUoKTsKICAgIHRoaXMuYWN0aXZlTGV2ZWwgPSBzdWJQYWdlTGV2ZWw7CiAgICBhd2FpdCB0aGlzLmFjdGl2ZUxldmVsLmVuYWJsZSgpOwogICAgcmV0dXJuIHN1YlBhZ2VMZXZlbDsKICB9CiAgYXN5bmMgcmV2ZXJ0VG9CYXNlTGV2ZWwoKSB7CiAgICBpZiAodGhpcy5hY3RpdmVMZXZlbCAhPT0gdGhpcy5iYXNlTGV2ZWwpIHsKICAgICAgYXdhaXQgdGhpcy5hY3RpdmVMZXZlbC5kaXNhYmxlKCk7CiAgICAgIHRoaXMuYWN0aXZlTGV2ZWwgPSB0aGlzLmJhc2VMZXZlbDsKICAgICAgYXdhaXQgdGhpcy5hY3RpdmVMZXZlbC5lbmFibGUoKTsKICAgIH0KICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrd2Vic2V0dXBAMy4wLjE5L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJzZXR1cC9kaXN0X3RzL3dlYnNldHVwLmNsYXNzZXMud2Vic2V0dXAuanMKdmFyIFdlYlNldHVwID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIldlYlNldHVwIik7CiAgfQogIGNvbnN0cnVjdG9yKG9wdGlvbnNBcmcpIHsKICAgIHRoaXMudGFnTWFuYWdlciA9IG5ldyBUYWdNYW5hZ2VyKCk7CiAgICB0aGlzLnJlYWR5RGVmZXJyZWQgPSBkaXN0X3RzX2V4cG9ydHMyMy5kZWZlcigpOwogICAgdGhpcy5yZWFkeUZvclNtYXJ0c3NyRGVmZXJyZWQgPSBkaXN0X3RzX2V4cG9ydHMyMy5kZWZlcigpOwogICAgdGhpcy5yZWFkeVByb21pc2UgPSB0aGlzLnJlYWR5RGVmZXJyZWQucHJvbWlzZTsKICAgIHRoaXMucmVhZHlGb3JTbWFydHNzclByb21pc2UgPSB0aGlzLnJlYWR5Rm9yU21hcnRzc3JEZWZlcnJlZC5wcm9taXNlOwogICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc0FyZzsKICAgIHRoaXMuc2V0dXAoKS50aGVuKCgpID0+IHsKICAgICAgdGhpcy5yZWFkeURlZmVycmVkLnJlc29sdmUoKTsKICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuc21hcnRzc3JXYWl0Rm9yUmVhZHlTaWduYWwpIHsKICAgICAgICB0aGlzLnJlYWR5Rm9yU21hcnRzc3JEZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgIH0KICAgIH0pOwogIH0KICAvKioKICAgKiBhbiBhc3luYyBzZXR1cCBjYWxsZWQgYnkgdGhlIGNvbnN0cnVjdG9yCiAgICovCiAgYXN5bmMgc2V0dXAob3B0aW9uc0FyZykgewogICAgaWYgKG9wdGlvbnNBcmcpIHsKICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc0FyZzsKICAgIH0KICAgIGF3YWl0IHRoaXMudGFnTWFuYWdlci5zZXR1cCh0aGlzLm9wdGlvbnMubWV0YU9iamVjdCk7CiAgfQogIC8qKgogICAqIHJldmVydHMgdGhlIGFjdGl2ZSBsZXZlbCBhbmQgcmV0dXJucyB0byB0aGUgYmFzZSBsZXZlbAogICAqLwogIHJldmVydFRvQmFzZUxldmVsKCkgewogICAgdGhpcy50YWdNYW5hZ2VyLnJldmVydFRvQmFzZUxldmVsKCk7CiAgfQogIC8qKgogICAqIHNldHMgYSBzdWJwYWdlCiAgICogQHBhcmFtIG1ldGFPYmplY3RBcmcKICAgKi8KICBhc3luYyBzZXRTdWJMZXZlbChtZXRhT2JqZWN0QXJnKSB7CiAgICBjb25zdCBzdWJMZXZlbCA9IGF3YWl0IHRoaXMudGFnTWFuYWdlci5zZXRTdWJQYWdlTGV2ZWwobWV0YU9iamVjdEFyZyk7CiAgICByZXR1cm4gc3ViTGV2ZWw7CiAgfQogIC8qKgogICAqIGZsYXNoZXMgdGhlIHRpdGxlIHdpdGggdGhlIGdpdmVuIHRleHQKICAgKiBAcGFyYW0gZmxhc2hUZXh0QXJnCiAgICovCiAgZmxhc2hUaXRsZShmbGFzaFRleHRBcmcpIHsKICB9CiAgLyoqCiAgICogaW5mb3JtcyBzbWFydHNzciB0aGF0IHRoZSBwYWdlIGlzIHJlYWR5IHRvIGJlIHJlbmRlcmVkCiAgICovCiAgaW5mb3JtUmVhZHlGb3JTbWFydHNzcigpIHsKICAgIGlmICghdGhpcy5vcHRpb25zLnNtYXJ0c3NyV2FpdEZvclJlYWR5U2lnbmFsKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoYFlvdSBoYXZlIG5vdCBpbmRpY2F0ZWQgdGhhdCB5b3UgaW5mb3JtIHNtYXJ0c3NyIGJ5IGEgZGVkaWNhdGVkIHNpZ25hbCEgUGxlYXNlIGNvbnNpZGVyIGRvaW5nIHNvIWApOwogICAgfQogICAgdGhpcy5yZWFkeUZvclNtYXJ0c3NyRGVmZXJyZWQucmVzb2x2ZSgpOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJzZXR1cEAzLjAuMTkvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnNldHVwL2Rpc3RfdHMvd2Vic2V0dXAuY2xhc3Nlcy50aXRsZS5qcwp2YXIgVGl0bGUgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiVGl0bGUiKTsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRlbXBmaXgrbGVuaXNAMS4zLjIwL25vZGVfbW9kdWxlcy9AdGVtcGZpeC9sZW5pcy9kaXN0L2xlbmlzLm1qcwp2YXIgdmVyc2lvbiA9ICIxLjMuMTciOwpmdW5jdGlvbiBjbGFtcDIobWluMywgaW5wdXQsIG1heDMpIHsKICByZXR1cm4gTWF0aC5tYXgobWluMywgTWF0aC5taW4oaW5wdXQsIG1heDMpKTsKfQpfX25hbWUoY2xhbXAyLCAiY2xhbXAiKTsKZnVuY3Rpb24gbGVycCh4MywgeTMsIHQ4KSB7CiAgcmV0dXJuICgxIC0gdDgpICogeDMgKyB0OCAqIHkzOwp9Cl9fbmFtZShsZXJwLCAibGVycCIpOwpmdW5jdGlvbiBkYW1wKHgzLCB5MywgbGFtYmRhLCBkZWx0YVRpbWUpIHsKICByZXR1cm4gbGVycCh4MywgeTMsIDEgLSBNYXRoLmV4cCgtbGFtYmRhICogZGVsdGFUaW1lKSk7Cn0KX19uYW1lKGRhbXAsICJkYW1wIik7CmZ1bmN0aW9uIG1vZHVsbyhuMTEsIGQ0KSB7CiAgcmV0dXJuIChuMTEgJSBkNCArIGQ0KSAlIGQ0Owp9Cl9fbmFtZShtb2R1bG8sICJtb2R1bG8iKTsKdmFyIEFuaW1hdGUgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiQW5pbWF0ZSIpOwogIH0KICBpc1J1bm5pbmcgPSBmYWxzZTsKICB2YWx1ZSA9IDA7CiAgZnJvbSA9IDA7CiAgdG8gPSAwOwogIGN1cnJlbnRUaW1lID0gMDsKICAvLyBUaGVzZSBhcmUgaW5zdGFuY2lhdGVkIGluIHRoZSBmcm9tVG8gbWV0aG9kCiAgbGVycDsKICBkdXJhdGlvbjsKICBlYXNpbmc7CiAgb25VcGRhdGU7CiAgLyoqCiAgICogQWR2YW5jZSB0aGUgYW5pbWF0aW9uIGJ5IHRoZSBnaXZlbiBkZWx0YSB0aW1lCiAgICoKICAgKiBAcGFyYW0gZGVsdGFUaW1lIC0gVGhlIHRpbWUgaW4gc2Vjb25kcyB0byBhZHZhbmNlIHRoZSBhbmltYXRpb24KICAgKi8KICBhZHZhbmNlKGRlbHRhVGltZSkgewogICAgaWYgKCF0aGlzLmlzUnVubmluZykgcmV0dXJuOwogICAgbGV0IGNvbXBsZXRlZCA9IGZhbHNlOwogICAgaWYgKHRoaXMuZHVyYXRpb24gJiYgdGhpcy5lYXNpbmcpIHsKICAgICAgdGhpcy5jdXJyZW50VGltZSArPSBkZWx0YVRpbWU7CiAgICAgIGNvbnN0IGxpbmVhclByb2dyZXNzID0gY2xhbXAyKDAsIHRoaXMuY3VycmVudFRpbWUgLyB0aGlzLmR1cmF0aW9uLCAxKTsKICAgICAgY29tcGxldGVkID0gbGluZWFyUHJvZ3Jlc3MgPj0gMTsKICAgICAgY29uc3QgZWFzZWRQcm9ncmVzcyA9IGNvbXBsZXRlZCA/IDEgOiB0aGlzLmVhc2luZyhsaW5lYXJQcm9ncmVzcyk7CiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLmZyb20gKyAodGhpcy50byAtIHRoaXMuZnJvbSkgKiBlYXNlZFByb2dyZXNzOwogICAgfSBlbHNlIGlmICh0aGlzLmxlcnApIHsKICAgICAgdGhpcy52YWx1ZSA9IGRhbXAodGhpcy52YWx1ZSwgdGhpcy50bywgdGhpcy5sZXJwICogNjAsIGRlbHRhVGltZSk7CiAgICAgIGlmIChNYXRoLnJvdW5kKHRoaXMudmFsdWUpID09PSB0aGlzLnRvKSB7CiAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMudG87CiAgICAgICAgY29tcGxldGVkID0gdHJ1ZTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGhpcy52YWx1ZSA9IHRoaXMudG87CiAgICAgIGNvbXBsZXRlZCA9IHRydWU7CiAgICB9CiAgICBpZiAoY29tcGxldGVkKSB7CiAgICAgIHRoaXMuc3RvcCgpOwogICAgfQogICAgdGhpcy5vblVwZGF0ZT8uKHRoaXMudmFsdWUsIGNvbXBsZXRlZCk7CiAgfQogIC8qKiBTdG9wIHRoZSBhbmltYXRpb24gKi8KICBzdG9wKCkgewogICAgdGhpcy5pc1J1bm5pbmcgPSBmYWxzZTsKICB9CiAgLyoqCiAgICogU2V0IHVwIHRoZSBhbmltYXRpb24gZnJvbSBhIHN0YXJ0aW5nIHZhbHVlIHRvIGFuIGVuZGluZyB2YWx1ZQogICAqIHdpdGggb3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgbGVycGluZywgZHVyYXRpb24sIGVhc2luZywgYW5kIG9uVXBkYXRlIGNhbGxiYWNrCiAgICoKICAgKiBAcGFyYW0gZnJvbSAtIFRoZSBzdGFydGluZyB2YWx1ZQogICAqIEBwYXJhbSB0byAtIFRoZSBlbmRpbmcgdmFsdWUKICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSBhbmltYXRpb24KICAgKi8KICBmcm9tVG8oZnJvbTIsIHRvLCB7IGxlcnA6IGxlcnAyLCBkdXJhdGlvbiwgZWFzaW5nLCBvblN0YXJ0LCBvblVwZGF0ZSB9KSB7CiAgICB0aGlzLmZyb20gPSB0aGlzLnZhbHVlID0gZnJvbTI7CiAgICB0aGlzLnRvID0gdG87CiAgICB0aGlzLmxlcnAgPSBsZXJwMjsKICAgIHRoaXMuZHVyYXRpb24gPSBkdXJhdGlvbjsKICAgIHRoaXMuZWFzaW5nID0gZWFzaW5nOwogICAgdGhpcy5jdXJyZW50VGltZSA9IDA7CiAgICB0aGlzLmlzUnVubmluZyA9IHRydWU7CiAgICBvblN0YXJ0Py4oKTsKICAgIHRoaXMub25VcGRhdGUgPSBvblVwZGF0ZTsKICB9Cn07CmZ1bmN0aW9uIGRlYm91bmNlMihjYWxsYmFjaywgZGVsYXkyKSB7CiAgbGV0IHRpbWVyMjsKICByZXR1cm4gZnVuY3Rpb24oLi4uYXJncykgewogICAgbGV0IGNvbnRleHQyID0gdGhpczsKICAgIGNsZWFyVGltZW91dCh0aW1lcjIpOwogICAgdGltZXIyID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgIHRpbWVyMiA9IHZvaWQgMDsKICAgICAgY2FsbGJhY2suYXBwbHkoY29udGV4dDIsIGFyZ3MpOwogICAgfSwgZGVsYXkyKTsKICB9Owp9Cl9fbmFtZShkZWJvdW5jZTIsICJkZWJvdW5jZSIpOwp2YXIgRGltZW5zaW9ucyA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJEaW1lbnNpb25zIik7CiAgfQogIGNvbnN0cnVjdG9yKHdyYXBwZXIsIGNvbnRlbnQzLCB7IGF1dG9SZXNpemUgPSB0cnVlLCBkZWJvdW5jZTogZGVib3VuY2VWYWx1ZSA9IDI1MCB9ID0ge30pIHsKICAgIHRoaXMud3JhcHBlciA9IHdyYXBwZXI7CiAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50MzsKICAgIGlmIChhdXRvUmVzaXplKSB7CiAgICAgIHRoaXMuZGVib3VuY2VkUmVzaXplID0gZGVib3VuY2UyKHRoaXMucmVzaXplLCBkZWJvdW5jZVZhbHVlKTsKICAgICAgaWYgKHRoaXMud3JhcHBlciBpbnN0YW5jZW9mIFdpbmRvdykgewogICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLCB0aGlzLmRlYm91bmNlZFJlc2l6ZSwgZmFsc2UpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMud3JhcHBlclJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKHRoaXMuZGVib3VuY2VkUmVzaXplKTsKICAgICAgICB0aGlzLndyYXBwZXJSZXNpemVPYnNlcnZlci5vYnNlcnZlKHRoaXMud3JhcHBlcik7CiAgICAgIH0KICAgICAgdGhpcy5jb250ZW50UmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIodGhpcy5kZWJvdW5jZWRSZXNpemUpOwogICAgICB0aGlzLmNvbnRlbnRSZXNpemVPYnNlcnZlci5vYnNlcnZlKHRoaXMuY29udGVudCk7CiAgICB9CiAgICB0aGlzLnJlc2l6ZSgpOwogIH0KICB3aWR0aCA9IDA7CiAgaGVpZ2h0ID0gMDsKICBzY3JvbGxIZWlnaHQgPSAwOwogIHNjcm9sbFdpZHRoID0gMDsKICAvLyBUaGVzZSBhcmUgaW5zdGFuY2lhdGVkIGluIHRoZSBjb25zdHJ1Y3RvciBhcyB0aGV5IG5lZWQgaW5mb3JtYXRpb24gZnJvbSB0aGUgb3B0aW9ucwogIGRlYm91bmNlZFJlc2l6ZTsKICB3cmFwcGVyUmVzaXplT2JzZXJ2ZXI7CiAgY29udGVudFJlc2l6ZU9ic2VydmVyOwogIGRlc3Ryb3koKSB7CiAgICB0aGlzLndyYXBwZXJSZXNpemVPYnNlcnZlcj8uZGlzY29ubmVjdCgpOwogICAgdGhpcy5jb250ZW50UmVzaXplT2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTsKICAgIGlmICh0aGlzLndyYXBwZXIgPT09IHdpbmRvdyAmJiB0aGlzLmRlYm91bmNlZFJlc2l6ZSkgewogICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIiwgdGhpcy5kZWJvdW5jZWRSZXNpemUsIGZhbHNlKTsKICAgIH0KICB9CiAgcmVzaXplID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoKSA9PiB7CiAgICB0aGlzLm9uV3JhcHBlclJlc2l6ZSgpOwogICAgdGhpcy5vbkNvbnRlbnRSZXNpemUoKTsKICB9LCAicmVzaXplIik7CiAgb25XcmFwcGVyUmVzaXplID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoKSA9PiB7CiAgICBpZiAodGhpcy53cmFwcGVyIGluc3RhbmNlb2YgV2luZG93KSB7CiAgICAgIHRoaXMud2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDsKICAgICAgdGhpcy5oZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7CiAgICB9IGVsc2UgewogICAgICB0aGlzLndpZHRoID0gdGhpcy53cmFwcGVyLmNsaWVudFdpZHRoOwogICAgICB0aGlzLmhlaWdodCA9IHRoaXMud3JhcHBlci5jbGllbnRIZWlnaHQ7CiAgICB9CiAgfSwgIm9uV3JhcHBlclJlc2l6ZSIpOwogIG9uQ29udGVudFJlc2l6ZSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKCkgPT4gewogICAgaWYgKHRoaXMud3JhcHBlciBpbnN0YW5jZW9mIFdpbmRvdykgewogICAgICB0aGlzLnNjcm9sbEhlaWdodCA9IHRoaXMuY29udGVudC5zY3JvbGxIZWlnaHQ7CiAgICAgIHRoaXMuc2Nyb2xsV2lkdGggPSB0aGlzLmNvbnRlbnQuc2Nyb2xsV2lkdGg7CiAgICB9IGVsc2UgewogICAgICB0aGlzLnNjcm9sbEhlaWdodCA9IHRoaXMud3JhcHBlci5zY3JvbGxIZWlnaHQ7CiAgICAgIHRoaXMuc2Nyb2xsV2lkdGggPSB0aGlzLndyYXBwZXIuc2Nyb2xsV2lkdGg7CiAgICB9CiAgfSwgIm9uQ29udGVudFJlc2l6ZSIpOwogIGdldCBsaW1pdCgpIHsKICAgIHJldHVybiB7CiAgICAgIHg6IHRoaXMuc2Nyb2xsV2lkdGggLSB0aGlzLndpZHRoLAogICAgICB5OiB0aGlzLnNjcm9sbEhlaWdodCAtIHRoaXMuaGVpZ2h0CiAgICB9OwogIH0KfTsKdmFyIEVtaXR0ZXIgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiRW1pdHRlciIpOwogIH0KICBldmVudHMgPSB7fTsKICAvKioKICAgKiBFbWl0IGFuIGV2ZW50IHdpdGggdGhlIGdpdmVuIGRhdGEKICAgKiBAcGFyYW0gZXZlbnQgRXZlbnQgbmFtZQogICAqIEBwYXJhbSBhcmdzIERhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgaGFuZGxlcnMKICAgKi8KICBlbWl0KGV2ZW50LCAuLi5hcmdzKSB7CiAgICBsZXQgY2FsbGJhY2tzID0gdGhpcy5ldmVudHNbZXZlbnRdIHx8IFtdOwogICAgZm9yIChsZXQgaTEwID0gMCwgbGVuZ3RoID0gY2FsbGJhY2tzLmxlbmd0aDsgaTEwIDwgbGVuZ3RoOyBpMTArKykgewogICAgICBjYWxsYmFja3NbaTEwXT8uKC4uLmFyZ3MpOwogICAgfQogIH0KICAvKioKICAgKiBBZGQgYSBjYWxsYmFjayB0byB0aGUgZXZlbnQKICAgKiBAcGFyYW0gZXZlbnQgRXZlbnQgbmFtZQogICAqIEBwYXJhbSBjYiBDYWxsYmFjayBmdW5jdGlvbgogICAqIEByZXR1cm5zIFVuc3Vic2NyaWJlIGZ1bmN0aW9uCiAgICovCiAgb24oZXZlbnQsIGNiKSB7CiAgICB0aGlzLmV2ZW50c1tldmVudF0/LnB1c2goY2IpIHx8ICh0aGlzLmV2ZW50c1tldmVudF0gPSBbY2JdKTsKICAgIHJldHVybiAoKSA9PiB7CiAgICAgIHRoaXMuZXZlbnRzW2V2ZW50XSA9IHRoaXMuZXZlbnRzW2V2ZW50XT8uZmlsdGVyKChpMTApID0+IGNiICE9PSBpMTApOwogICAgfTsKICB9CiAgLyoqCiAgICogUmVtb3ZlIGEgY2FsbGJhY2sgZnJvbSB0aGUgZXZlbnQKICAgKiBAcGFyYW0gZXZlbnQgRXZlbnQgbmFtZQogICAqIEBwYXJhbSBjYWxsYmFjayBDYWxsYmFjayBmdW5jdGlvbgogICAqLwogIG9mZihldmVudCwgY2FsbGJhY2spIHsKICAgIHRoaXMuZXZlbnRzW2V2ZW50XSA9IHRoaXMuZXZlbnRzW2V2ZW50XT8uZmlsdGVyKChpMTApID0+IGNhbGxiYWNrICE9PSBpMTApOwogIH0KICAvKioKICAgKiBSZW1vdmUgYWxsIGV2ZW50IGxpc3RlbmVycyBhbmQgY2xlYW4gdXAKICAgKi8KICBkZXN0cm95KCkgewogICAgdGhpcy5ldmVudHMgPSB7fTsKICB9Cn07CnZhciBMSU5FX0hFSUdIVCA9IDEwMCAvIDY7CnZhciBsaXN0ZW5lck9wdGlvbnMgPSB7IHBhc3NpdmU6IGZhbHNlIH07CnZhciBWaXJ0dWFsU2Nyb2xsID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlZpcnR1YWxTY3JvbGwiKTsKICB9CiAgY29uc3RydWN0b3IoZWxlbWVudDQsIG9wdGlvbnMgPSB7IHdoZWVsTXVsdGlwbGllcjogMSwgdG91Y2hNdWx0aXBsaWVyOiAxIH0pIHsKICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ0OwogICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLCB0aGlzLm9uV2luZG93UmVzaXplLCBmYWxzZSk7CiAgICB0aGlzLm9uV2luZG93UmVzaXplKCk7CiAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigid2hlZWwiLCB0aGlzLm9uV2hlZWwsIGxpc3RlbmVyT3B0aW9ucyk7CiAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICAgInRvdWNoc3RhcnQiLAogICAgICB0aGlzLm9uVG91Y2hTdGFydCwKICAgICAgbGlzdGVuZXJPcHRpb25zCiAgICApOwogICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoCiAgICAgICJ0b3VjaG1vdmUiLAogICAgICB0aGlzLm9uVG91Y2hNb3ZlLAogICAgICBsaXN0ZW5lck9wdGlvbnMKICAgICk7CiAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLCB0aGlzLm9uVG91Y2hFbmQsIGxpc3RlbmVyT3B0aW9ucyk7CiAgfQogIHRvdWNoU3RhcnQgPSB7CiAgICB4OiAwLAogICAgeTogMAogIH07CiAgbGFzdERlbHRhID0gewogICAgeDogMCwKICAgIHk6IDAKICB9OwogIHdpbmRvdyA9IHsKICAgIHdpZHRoOiAwLAogICAgaGVpZ2h0OiAwCiAgfTsKICBlbWl0dGVyID0gbmV3IEVtaXR0ZXIoKTsKICAvKioKICAgKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXIgZm9yIHRoZSBnaXZlbiBldmVudCBhbmQgY2FsbGJhY2sKICAgKgogICAqIEBwYXJhbSBldmVudCBFdmVudCBuYW1lCiAgICogQHBhcmFtIGNhbGxiYWNrIENhbGxiYWNrIGZ1bmN0aW9uCiAgICovCiAgb24oZXZlbnQsIGNhbGxiYWNrKSB7CiAgICByZXR1cm4gdGhpcy5lbWl0dGVyLm9uKGV2ZW50LCBjYWxsYmFjayk7CiAgfQogIC8qKiBSZW1vdmUgYWxsIGV2ZW50IGxpc3RlbmVycyBhbmQgY2xlYW4gdXAgKi8KICBkZXN0cm95KCkgewogICAgdGhpcy5lbWl0dGVyLmRlc3Ryb3koKTsKICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJyZXNpemUiLCB0aGlzLm9uV2luZG93UmVzaXplLCBmYWxzZSk7CiAgICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigid2hlZWwiLCB0aGlzLm9uV2hlZWwsIGxpc3RlbmVyT3B0aW9ucyk7CiAgICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigKICAgICAgInRvdWNoc3RhcnQiLAogICAgICB0aGlzLm9uVG91Y2hTdGFydCwKICAgICAgbGlzdGVuZXJPcHRpb25zCiAgICApOwogICAgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoCiAgICAgICJ0b3VjaG1vdmUiLAogICAgICB0aGlzLm9uVG91Y2hNb3ZlLAogICAgICBsaXN0ZW5lck9wdGlvbnMKICAgICk7CiAgICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigKICAgICAgInRvdWNoZW5kIiwKICAgICAgdGhpcy5vblRvdWNoRW5kLAogICAgICBsaXN0ZW5lck9wdGlvbnMKICAgICk7CiAgfQogIC8qKgogICAqIEV2ZW50IGhhbmRsZXIgZm9yICd0b3VjaHN0YXJ0JyBldmVudAogICAqCiAgICogQHBhcmFtIGV2ZW50IFRvdWNoIGV2ZW50CiAgICovCiAgb25Ub3VjaFN0YXJ0ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoZXZlbnQpID0+IHsKICAgIGNvbnN0IHsgY2xpZW50WCwgY2xpZW50WSB9ID0gZXZlbnQudGFyZ2V0VG91Y2hlcyA/IGV2ZW50LnRhcmdldFRvdWNoZXNbMF0gOiBldmVudDsKICAgIHRoaXMudG91Y2hTdGFydC54ID0gY2xpZW50WDsKICAgIHRoaXMudG91Y2hTdGFydC55ID0gY2xpZW50WTsKICAgIHRoaXMubGFzdERlbHRhID0gewogICAgICB4OiAwLAogICAgICB5OiAwCiAgICB9OwogICAgdGhpcy5lbWl0dGVyLmVtaXQoInNjcm9sbCIsIHsKICAgICAgZGVsdGFYOiAwLAogICAgICBkZWx0YVk6IDAsCiAgICAgIGV2ZW50CiAgICB9KTsKICB9LCAib25Ub3VjaFN0YXJ0Iik7CiAgLyoqIEV2ZW50IGhhbmRsZXIgZm9yICd0b3VjaG1vdmUnIGV2ZW50ICovCiAgb25Ub3VjaE1vdmUgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChldmVudCkgPT4gewogICAgY29uc3QgeyBjbGllbnRYLCBjbGllbnRZIH0gPSBldmVudC50YXJnZXRUb3VjaGVzID8gZXZlbnQudGFyZ2V0VG91Y2hlc1swXSA6IGV2ZW50OwogICAgY29uc3QgZGVsdGFYID0gLShjbGllbnRYIC0gdGhpcy50b3VjaFN0YXJ0LngpICogdGhpcy5vcHRpb25zLnRvdWNoTXVsdGlwbGllcjsKICAgIGNvbnN0IGRlbHRhWSA9IC0oY2xpZW50WSAtIHRoaXMudG91Y2hTdGFydC55KSAqIHRoaXMub3B0aW9ucy50b3VjaE11bHRpcGxpZXI7CiAgICB0aGlzLnRvdWNoU3RhcnQueCA9IGNsaWVudFg7CiAgICB0aGlzLnRvdWNoU3RhcnQueSA9IGNsaWVudFk7CiAgICB0aGlzLmxhc3REZWx0YSA9IHsKICAgICAgeDogZGVsdGFYLAogICAgICB5OiBkZWx0YVkKICAgIH07CiAgICB0aGlzLmVtaXR0ZXIuZW1pdCgic2Nyb2xsIiwgewogICAgICBkZWx0YVgsCiAgICAgIGRlbHRhWSwKICAgICAgZXZlbnQKICAgIH0pOwogIH0sICJvblRvdWNoTW92ZSIpOwogIG9uVG91Y2hFbmQgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChldmVudCkgPT4gewogICAgdGhpcy5lbWl0dGVyLmVtaXQoInNjcm9sbCIsIHsKICAgICAgZGVsdGFYOiB0aGlzLmxhc3REZWx0YS54LAogICAgICBkZWx0YVk6IHRoaXMubGFzdERlbHRhLnksCiAgICAgIGV2ZW50CiAgICB9KTsKICB9LCAib25Ub3VjaEVuZCIpOwogIC8qKiBFdmVudCBoYW5kbGVyIGZvciAnd2hlZWwnIGV2ZW50ICovCiAgb25XaGVlbCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGV2ZW50KSA9PiB7CiAgICBsZXQgeyBkZWx0YVgsIGRlbHRhWSwgZGVsdGFNb2RlIH0gPSBldmVudDsKICAgIGNvbnN0IG11bHRpcGxpZXJYID0gZGVsdGFNb2RlID09PSAxID8gTElORV9IRUlHSFQgOiBkZWx0YU1vZGUgPT09IDIgPyB0aGlzLndpbmRvdy53aWR0aCA6IDE7CiAgICBjb25zdCBtdWx0aXBsaWVyWSA9IGRlbHRhTW9kZSA9PT0gMSA/IExJTkVfSEVJR0hUIDogZGVsdGFNb2RlID09PSAyID8gdGhpcy53aW5kb3cuaGVpZ2h0IDogMTsKICAgIGRlbHRhWCAqPSBtdWx0aXBsaWVyWDsKICAgIGRlbHRhWSAqPSBtdWx0aXBsaWVyWTsKICAgIGRlbHRhWCAqPSB0aGlzLm9wdGlvbnMud2hlZWxNdWx0aXBsaWVyOwogICAgZGVsdGFZICo9IHRoaXMub3B0aW9ucy53aGVlbE11bHRpcGxpZXI7CiAgICB0aGlzLmVtaXR0ZXIuZW1pdCgic2Nyb2xsIiwgeyBkZWx0YVgsIGRlbHRhWSwgZXZlbnQgfSk7CiAgfSwgIm9uV2hlZWwiKTsKICBvbldpbmRvd1Jlc2l6ZSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKCkgPT4gewogICAgdGhpcy53aW5kb3cgPSB7CiAgICAgIHdpZHRoOiB3aW5kb3cuaW5uZXJXaWR0aCwKICAgICAgaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQKICAgIH07CiAgfSwgIm9uV2luZG93UmVzaXplIik7Cn07CnZhciBkZWZhdWx0RWFzaW5nID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgodDgpID0+IE1hdGgubWluKDEsIDEuMDAxIC0gTWF0aC5wb3coMiwgLTEwICogdDgpKSwgImRlZmF1bHRFYXNpbmciKTsKdmFyIExlbmlzID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkxlbmlzIik7CiAgfQogIF9pc1Njcm9sbGluZyA9IGZhbHNlOwogIC8vIHRydWUgd2hlbiBzY3JvbGwgaXMgYW5pbWF0aW5nCiAgX2lzU3RvcHBlZCA9IGZhbHNlOwogIC8vIHRydWUgaWYgdXNlciBzaG91bGQgbm90IGJlIGFibGUgdG8gc2Nyb2xsIC0gZW5hYmxlL2Rpc2FibGUgcHJvZ3JhbW1hdGljYWxseQogIF9pc0xvY2tlZCA9IGZhbHNlOwogIC8vIHNhbWUgYXMgaXNTdG9wcGVkIGJ1dCBlbmFibGVkL2Rpc2FibGVkIHdoZW4gc2Nyb2xsIHJlYWNoZXMgdGFyZ2V0CiAgX3ByZXZlbnROZXh0TmF0aXZlU2Nyb2xsRXZlbnQgPSBmYWxzZTsKICBfcmVzZXRWZWxvY2l0eVRpbWVvdXQgPSBudWxsOwogIF9yYWZJZCA9IG51bGw7CiAgLyoqCiAgICogV2hldGhlciBvciBub3QgdGhlIHVzZXIgaXMgdG91Y2hpbmcgdGhlIHNjcmVlbgogICAqLwogIGlzVG91Y2hpbmc7CiAgLyoqCiAgICogVGhlIHRpbWUgaW4gbXMgc2luY2UgdGhlIGxlbmlzIGluc3RhbmNlIHdhcyBjcmVhdGVkCiAgICovCiAgdGltZSA9IDA7CiAgLyoqCiAgICogVXNlciBkYXRhIHRoYXQgd2lsbCBiZSBmb3J3YXJkZWQgdGhyb3VnaCB0aGUgc2Nyb2xsIGV2ZW50CiAgICoKICAgKiBAZXhhbXBsZQogICAqIGxlbmlzLnNjcm9sbFRvKDEwMCwgewogICAqICAgdXNlckRhdGE6IHsKICAgKiAgICAgZm9vOiAnYmFyJwogICAqICAgfQogICAqIH0pCiAgICovCiAgdXNlckRhdGEgPSB7fTsKICAvKioKICAgKiBUaGUgbGFzdCB2ZWxvY2l0eSBvZiB0aGUgc2Nyb2xsCiAgICovCiAgbGFzdFZlbG9jaXR5ID0gMDsKICAvKioKICAgKiBUaGUgY3VycmVudCB2ZWxvY2l0eSBvZiB0aGUgc2Nyb2xsCiAgICovCiAgdmVsb2NpdHkgPSAwOwogIC8qKgogICAqIFRoZSBkaXJlY3Rpb24gb2YgdGhlIHNjcm9sbAogICAqLwogIGRpcmVjdGlvbiA9IDA7CiAgLyoqCiAgICogVGhlIG9wdGlvbnMgcGFzc2VkIHRvIHRoZSBsZW5pcyBpbnN0YW5jZQogICAqLwogIG9wdGlvbnM7CiAgLyoqCiAgICogVGhlIHRhcmdldCBzY3JvbGwgdmFsdWUKICAgKi8KICB0YXJnZXRTY3JvbGw7CiAgLyoqCiAgICogVGhlIGFuaW1hdGVkIHNjcm9sbCB2YWx1ZQogICAqLwogIGFuaW1hdGVkU2Nyb2xsOwogIC8vIFRoZXNlIGFyZSBpbnN0YW5jaWF0ZWQgaGVyZSBhcyB0aGV5IGRvbid0IG5lZWQgaW5mb3JtYXRpb24gZnJvbSB0aGUgb3B0aW9ucwogIGFuaW1hdGUgPSBuZXcgQW5pbWF0ZSgpOwogIGVtaXR0ZXIgPSBuZXcgRW1pdHRlcigpOwogIC8vIFRoZXNlIGFyZSBpbnN0YW5jaWF0ZWQgaW4gdGhlIGNvbnN0cnVjdG9yIGFzIHRoZXkgbmVlZCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvcHRpb25zCiAgZGltZW5zaW9uczsKICAvLyBUaGlzIGlzIG5vdCBwcml2YXRlIGJlY2F1c2UgaXQncyB1c2VkIGluIHRoZSBTbmFwIGNsYXNzCiAgdmlydHVhbFNjcm9sbDsKICBjb25zdHJ1Y3Rvcih7CiAgICB3cmFwcGVyID0gd2luZG93LAogICAgY29udGVudDogY29udGVudDMgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsCiAgICBldmVudHNUYXJnZXQgPSB3cmFwcGVyLAogICAgc21vb3RoV2hlZWwgPSB0cnVlLAogICAgc3luY1RvdWNoID0gZmFsc2UsCiAgICBzeW5jVG91Y2hMZXJwID0gMC4wNzUsCiAgICB0b3VjaEluZXJ0aWFFeHBvbmVudCA9IDEuNywKICAgIGR1cmF0aW9uLAogICAgLy8gaW4gc2Vjb25kcwogICAgZWFzaW5nLAogICAgbGVycDogbGVycDIgPSAwLjEsCiAgICBpbmZpbml0ZSA9IGZhbHNlLAogICAgb3JpZW50YXRpb24gPSAidmVydGljYWwiLAogICAgLy8gdmVydGljYWwsIGhvcml6b250YWwKICAgIGdlc3R1cmVPcmllbnRhdGlvbiA9IG9yaWVudGF0aW9uID09PSAiaG9yaXpvbnRhbCIgPyAiYm90aCIgOiAidmVydGljYWwiLAogICAgLy8gdmVydGljYWwsIGhvcml6b250YWwsIGJvdGgKICAgIHRvdWNoTXVsdGlwbGllciA9IDEsCiAgICB3aGVlbE11bHRpcGxpZXIgPSAxLAogICAgYXV0b1Jlc2l6ZSA9IHRydWUsCiAgICBwcmV2ZW50LAogICAgdmlydHVhbFNjcm9sbCwKICAgIG92ZXJzY3JvbGwgPSB0cnVlLAogICAgYXV0b1JhZiA9IGZhbHNlLAogICAgYW5jaG9ycyA9IGZhbHNlLAogICAgYXV0b1RvZ2dsZSA9IGZhbHNlLAogICAgLy8gaHR0cHM6Ly9jYW5pdXNlLmNvbS8/c2VhcmNoPXRyYW5zaXRpb24tYmVoYXZpb3IKICAgIGFsbG93TmVzdGVkU2Nyb2xsID0gZmFsc2UsCiAgICAvLyBAdHMtaWdub3JlOiB0aGlzIHdpbGwgYmUgZGVwcmVjYXRlZCBpbiB0aGUgZnV0dXJlCiAgICBfX2V4cGVyaW1lbnRhbF9fbmFpdmVEaW1lbnNpb25zID0gZmFsc2UsCiAgICBuYWl2ZURpbWVuc2lvbnMgPSBfX2V4cGVyaW1lbnRhbF9fbmFpdmVEaW1lbnNpb25zLAogICAgc3RvcEluZXJ0aWFPbk5hdmlnYXRlID0gZmFsc2UKICB9ID0ge30pIHsKICAgIHdpbmRvdy5sZW5pc1ZlcnNpb24gPSB2ZXJzaW9uOwogICAgaWYgKCF3cmFwcGVyIHx8IHdyYXBwZXIgPT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgewogICAgICB3cmFwcGVyID0gd2luZG93OwogICAgfQogICAgaWYgKHR5cGVvZiBkdXJhdGlvbiA9PT0gIm51bWJlciIgJiYgdHlwZW9mIGVhc2luZyAhPT0gImZ1bmN0aW9uIikgewogICAgICBlYXNpbmcgPSBkZWZhdWx0RWFzaW5nOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZWFzaW5nID09PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBkdXJhdGlvbiAhPT0gIm51bWJlciIpIHsKICAgICAgZHVyYXRpb24gPSAxOwogICAgfQogICAgdGhpcy5vcHRpb25zID0gewogICAgICB3cmFwcGVyLAogICAgICBjb250ZW50OiBjb250ZW50MywKICAgICAgZXZlbnRzVGFyZ2V0LAogICAgICBzbW9vdGhXaGVlbCwKICAgICAgc3luY1RvdWNoLAogICAgICBzeW5jVG91Y2hMZXJwLAogICAgICB0b3VjaEluZXJ0aWFFeHBvbmVudCwKICAgICAgZHVyYXRpb24sCiAgICAgIGVhc2luZywKICAgICAgbGVycDogbGVycDIsCiAgICAgIGluZmluaXRlLAogICAgICBnZXN0dXJlT3JpZW50YXRpb24sCiAgICAgIG9yaWVudGF0aW9uLAogICAgICB0b3VjaE11bHRpcGxpZXIsCiAgICAgIHdoZWVsTXVsdGlwbGllciwKICAgICAgYXV0b1Jlc2l6ZSwKICAgICAgcHJldmVudCwKICAgICAgdmlydHVhbFNjcm9sbCwKICAgICAgb3ZlcnNjcm9sbCwKICAgICAgYXV0b1JhZiwKICAgICAgYW5jaG9ycywKICAgICAgYXV0b1RvZ2dsZSwKICAgICAgYWxsb3dOZXN0ZWRTY3JvbGwsCiAgICAgIG5haXZlRGltZW5zaW9ucywKICAgICAgc3RvcEluZXJ0aWFPbk5hdmlnYXRlCiAgICB9OwogICAgdGhpcy5kaW1lbnNpb25zID0gbmV3IERpbWVuc2lvbnMod3JhcHBlciwgY29udGVudDMsIHsgYXV0b1Jlc2l6ZSB9KTsKICAgIHRoaXMudXBkYXRlQ2xhc3NOYW1lKCk7CiAgICB0aGlzLnRhcmdldFNjcm9sbCA9IHRoaXMuYW5pbWF0ZWRTY3JvbGwgPSB0aGlzLmFjdHVhbFNjcm9sbDsKICAgIHRoaXMub3B0aW9ucy53cmFwcGVyLmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsIHRoaXMub25OYXRpdmVTY3JvbGwsIGZhbHNlKTsKICAgIHRoaXMub3B0aW9ucy53cmFwcGVyLmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbGVuZCIsIHRoaXMub25TY3JvbGxFbmQsIHsKICAgICAgY2FwdHVyZTogdHJ1ZQogICAgfSk7CiAgICBpZiAodGhpcy5vcHRpb25zLmFuY2hvcnMgfHwgdGhpcy5vcHRpb25zLnN0b3BJbmVydGlhT25OYXZpZ2F0ZSkgewogICAgICB0aGlzLm9wdGlvbnMud3JhcHBlci5hZGRFdmVudExpc3RlbmVyKAogICAgICAgICJjbGljayIsCiAgICAgICAgdGhpcy5vbkNsaWNrLAogICAgICAgIGZhbHNlCiAgICAgICk7CiAgICB9CiAgICB0aGlzLm9wdGlvbnMud3JhcHBlci5hZGRFdmVudExpc3RlbmVyKAogICAgICAicG9pbnRlcmRvd24iLAogICAgICB0aGlzLm9uUG9pbnRlckRvd24sCiAgICAgIGZhbHNlCiAgICApOwogICAgdGhpcy52aXJ0dWFsU2Nyb2xsID0gbmV3IFZpcnR1YWxTY3JvbGwoZXZlbnRzVGFyZ2V0LCB7CiAgICAgIHRvdWNoTXVsdGlwbGllciwKICAgICAgd2hlZWxNdWx0aXBsaWVyCiAgICB9KTsKICAgIHRoaXMudmlydHVhbFNjcm9sbC5vbigic2Nyb2xsIiwgdGhpcy5vblZpcnR1YWxTY3JvbGwpOwogICAgaWYgKHRoaXMub3B0aW9ucy5hdXRvVG9nZ2xlKSB7CiAgICAgIHRoaXMuY2hlY2tPdmVyZmxvdygpOwogICAgICB0aGlzLnJvb3RFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoInRyYW5zaXRpb25lbmQiLCB0aGlzLm9uVHJhbnNpdGlvbkVuZCwgewogICAgICAgIHBhc3NpdmU6IHRydWUKICAgICAgfSk7CiAgICB9CiAgICBpZiAodGhpcy5vcHRpb25zLmF1dG9SYWYpIHsKICAgICAgdGhpcy5fcmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5yYWYpOwogICAgfQogIH0KICAvKioKICAgKiBEZXN0cm95IHRoZSBsZW5pcyBpbnN0YW5jZSwgcmVtb3ZlIGFsbCBldmVudCBsaXN0ZW5lcnMgYW5kIGNsZWFuIHVwIHRoZSBjbGFzcyBuYW1lCiAgICovCiAgZGVzdHJveSgpIHsKICAgIHRoaXMuZW1pdHRlci5kZXN0cm95KCk7CiAgICB0aGlzLm9wdGlvbnMud3JhcHBlci5yZW1vdmVFdmVudExpc3RlbmVyKAogICAgICAic2Nyb2xsIiwKICAgICAgdGhpcy5vbk5hdGl2ZVNjcm9sbCwKICAgICAgZmFsc2UKICAgICk7CiAgICB0aGlzLm9wdGlvbnMud3JhcHBlci5yZW1vdmVFdmVudExpc3RlbmVyKCJzY3JvbGxlbmQiLCB0aGlzLm9uU2Nyb2xsRW5kLCB7CiAgICAgIGNhcHR1cmU6IHRydWUKICAgIH0pOwogICAgdGhpcy5vcHRpb25zLndyYXBwZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcigKICAgICAgInBvaW50ZXJkb3duIiwKICAgICAgdGhpcy5vblBvaW50ZXJEb3duLAogICAgICBmYWxzZQogICAgKTsKICAgIGlmICh0aGlzLm9wdGlvbnMuYW5jaG9ycyB8fCB0aGlzLm9wdGlvbnMuc3RvcEluZXJ0aWFPbk5hdmlnYXRlKSB7CiAgICAgIHRoaXMub3B0aW9ucy53cmFwcGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoCiAgICAgICAgImNsaWNrIiwKICAgICAgICB0aGlzLm9uQ2xpY2ssCiAgICAgICAgZmFsc2UKICAgICAgKTsKICAgIH0KICAgIHRoaXMudmlydHVhbFNjcm9sbC5kZXN0cm95KCk7CiAgICB0aGlzLmRpbWVuc2lvbnMuZGVzdHJveSgpOwogICAgdGhpcy5jbGVhblVwQ2xhc3NOYW1lKCk7CiAgICBpZiAodGhpcy5fcmFmSWQpIHsKICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fcmFmSWQpOwogICAgfQogIH0KICBvbihldmVudCwgY2FsbGJhY2spIHsKICAgIHJldHVybiB0aGlzLmVtaXR0ZXIub24oZXZlbnQsIGNhbGxiYWNrKTsKICB9CiAgb2ZmKGV2ZW50LCBjYWxsYmFjaykgewogICAgcmV0dXJuIHRoaXMuZW1pdHRlci5vZmYoZXZlbnQsIGNhbGxiYWNrKTsKICB9CiAgb25TY3JvbGxFbmQgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChlMTApID0+IHsKICAgIGlmICghKGUxMCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkgewogICAgICBpZiAodGhpcy5pc1Njcm9sbGluZyA9PT0gInNtb290aCIgfHwgdGhpcy5pc1Njcm9sbGluZyA9PT0gZmFsc2UpIHsKICAgICAgICBlMTAuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIH0KICAgIH0KICB9LCAib25TY3JvbGxFbmQiKTsKICBkaXNwYXRjaFNjcm9sbGVuZEV2ZW50ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoKSA9PiB7CiAgICB0aGlzLm9wdGlvbnMud3JhcHBlci5kaXNwYXRjaEV2ZW50KAogICAgICBuZXcgQ3VzdG9tRXZlbnQoInNjcm9sbGVuZCIsIHsKICAgICAgICBidWJibGVzOiB0aGlzLm9wdGlvbnMud3JhcHBlciA9PT0gd2luZG93LAogICAgICAgIC8vIGNhbmNlbGFibGU6IGZhbHNlLAogICAgICAgIGRldGFpbDogewogICAgICAgICAgbGVuaXNTY3JvbGxFbmQ6IHRydWUKICAgICAgICB9CiAgICAgIH0pCiAgICApOwogIH0sICJkaXNwYXRjaFNjcm9sbGVuZEV2ZW50Iik7CiAgZ2V0IG92ZXJmbG93KCkgewogICAgY29uc3QgcHJvcGVydHkgPSB0aGlzLmlzSG9yaXpvbnRhbCA/ICJvdmVyZmxvdy14IiA6ICJvdmVyZmxvdy15IjsKICAgIHJldHVybiBnZXRDb21wdXRlZFN0eWxlKHRoaXMucm9vdEVsZW1lbnQpW3Byb3BlcnR5XTsKICB9CiAgY2hlY2tPdmVyZmxvdygpIHsKICAgIGlmIChbImhpZGRlbiIsICJjbGlwIl0uaW5jbHVkZXModGhpcy5vdmVyZmxvdykpIHsKICAgICAgdGhpcy5pbnRlcm5hbFN0b3AoKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuaW50ZXJuYWxTdGFydCgpOwogICAgfQogIH0KICBvblRyYW5zaXRpb25FbmQgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChldmVudCkgPT4gewogICAgaWYgKGV2ZW50LnByb3BlcnR5TmFtZS5pbmNsdWRlcygib3ZlcmZsb3ciKSkgewogICAgICB0aGlzLmNoZWNrT3ZlcmZsb3coKTsKICAgIH0KICB9LCAib25UcmFuc2l0aW9uRW5kIik7CiAgc2V0U2Nyb2xsKHNjcm9sbCkgewogICAgaWYgKHRoaXMuaXNIb3Jpem9udGFsKSB7CiAgICAgIHRoaXMub3B0aW9ucy53cmFwcGVyLnNjcm9sbFRvKHsgbGVmdDogc2Nyb2xsLCBiZWhhdmlvcjogImluc3RhbnQiIH0pOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5vcHRpb25zLndyYXBwZXIuc2Nyb2xsVG8oeyB0b3A6IHNjcm9sbCwgYmVoYXZpb3I6ICJpbnN0YW50IiB9KTsKICAgIH0KICB9CiAgb25DbGljayA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGV2ZW50KSA9PiB7CiAgICBjb25zdCBwYXRoMiA9IGV2ZW50LmNvbXBvc2VkUGF0aCgpOwogICAgY29uc3QgYW5jaG9yRWxlbWVudHMgPSBwYXRoMi5maWx0ZXIoCiAgICAgIChub2RlMikgPT4gbm9kZTIgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBub2RlMi5nZXRBdHRyaWJ1dGUoImhyZWYiKQogICAgKTsKICAgIGlmICh0aGlzLm9wdGlvbnMuYW5jaG9ycykgewogICAgICBjb25zdCBhbmNob3IgPSBhbmNob3JFbGVtZW50cy5maW5kKAogICAgICAgIChub2RlMikgPT4gbm9kZTIuZ2V0QXR0cmlidXRlKCJocmVmIik/LmluY2x1ZGVzKCIjIikKICAgICAgKTsKICAgICAgaWYgKGFuY2hvcikgewogICAgICAgIGNvbnN0IGhyZWYgPSBhbmNob3IuZ2V0QXR0cmlidXRlKCJocmVmIik7CiAgICAgICAgaWYgKGhyZWYpIHsKICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0eXBlb2YgdGhpcy5vcHRpb25zLmFuY2hvcnMgPT09ICJvYmplY3QiICYmIHRoaXMub3B0aW9ucy5hbmNob3JzID8gdGhpcy5vcHRpb25zLmFuY2hvcnMgOiB2b2lkIDA7CiAgICAgICAgICBjb25zdCB0YXJnZXQgPSBgIyR7aHJlZi5zcGxpdCgiIyIpWzFdfWA7CiAgICAgICAgICB0aGlzLnNjcm9sbFRvKHRhcmdldCwgb3B0aW9ucyk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAodGhpcy5vcHRpb25zLnN0b3BJbmVydGlhT25OYXZpZ2F0ZSkgewogICAgICBjb25zdCBpbnRlcm5hbExpbmsgPSBhbmNob3JFbGVtZW50cy5maW5kKAogICAgICAgIChub2RlMikgPT4gbm9kZTIuaG9zdCA9PT0gd2luZG93LmxvY2F0aW9uLmhvc3QKICAgICAgKTsKICAgICAgaWYgKGludGVybmFsTGluaykgewogICAgICAgIHRoaXMucmVzZXQoKTsKICAgICAgfQogICAgfQogIH0sICJvbkNsaWNrIik7CiAgb25Qb2ludGVyRG93biA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGV2ZW50KSA9PiB7CiAgICBpZiAoZXZlbnQuYnV0dG9uID09PSAxKSB7CiAgICAgIHRoaXMucmVzZXQoKTsKICAgIH0KICB9LCAib25Qb2ludGVyRG93biIpOwogIG9uVmlydHVhbFNjcm9sbCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGRhdGEpID0+IHsKICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLnZpcnR1YWxTY3JvbGwgPT09ICJmdW5jdGlvbiIgJiYgdGhpcy5vcHRpb25zLnZpcnR1YWxTY3JvbGwoZGF0YSkgPT09IGZhbHNlKQogICAgICByZXR1cm47CiAgICBjb25zdCB7IGRlbHRhWCwgZGVsdGFZLCBldmVudCB9ID0gZGF0YTsKICAgIHRoaXMuZW1pdHRlci5lbWl0KCJ2aXJ0dWFsLXNjcm9sbCIsIHsgZGVsdGFYLCBkZWx0YVksIGV2ZW50IH0pOwogICAgaWYgKGV2ZW50LmN0cmxLZXkpIHJldHVybjsKICAgIGlmIChldmVudC5sZW5pc1N0b3BQcm9wYWdhdGlvbikgcmV0dXJuOwogICAgY29uc3QgaXNUb3VjaCA9IGV2ZW50LnR5cGUuaW5jbHVkZXMoInRvdWNoIik7CiAgICBjb25zdCBpc1doZWVsID0gZXZlbnQudHlwZS5pbmNsdWRlcygid2hlZWwiKTsKICAgIHRoaXMuaXNUb3VjaGluZyA9IGV2ZW50LnR5cGUgPT09ICJ0b3VjaHN0YXJ0IiB8fCBldmVudC50eXBlID09PSAidG91Y2htb3ZlIjsKICAgIGNvbnN0IGlzQ2xpY2tPclRhcCA9IGRlbHRhWCA9PT0gMCAmJiBkZWx0YVkgPT09IDA7CiAgICBjb25zdCBpc1RhcFRvU3RvcCA9IHRoaXMub3B0aW9ucy5zeW5jVG91Y2ggJiYgaXNUb3VjaCAmJiBldmVudC50eXBlID09PSAidG91Y2hzdGFydCIgJiYgaXNDbGlja09yVGFwICYmICF0aGlzLmlzU3RvcHBlZCAmJiAhdGhpcy5pc0xvY2tlZDsKICAgIGlmIChpc1RhcFRvU3RvcCkgewogICAgICB0aGlzLnJlc2V0KCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGlzVW5rbm93bkdlc3R1cmUgPSB0aGlzLm9wdGlvbnMuZ2VzdHVyZU9yaWVudGF0aW9uID09PSAidmVydGljYWwiICYmIGRlbHRhWSA9PT0gMCB8fCB0aGlzLm9wdGlvbnMuZ2VzdHVyZU9yaWVudGF0aW9uID09PSAiaG9yaXpvbnRhbCIgJiYgZGVsdGFYID09PSAwOwogICAgaWYgKGlzQ2xpY2tPclRhcCB8fCBpc1Vua25vd25HZXN0dXJlKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGxldCBjb21wb3NlZFBhdGggPSBldmVudC5jb21wb3NlZFBhdGgoKTsKICAgIGNvbXBvc2VkUGF0aCA9IGNvbXBvc2VkUGF0aC5zbGljZSgwLCBjb21wb3NlZFBhdGguaW5kZXhPZih0aGlzLnJvb3RFbGVtZW50KSk7CiAgICBjb25zdCBwcmV2ZW50ID0gdGhpcy5vcHRpb25zLnByZXZlbnQ7CiAgICBpZiAoISFjb21wb3NlZFBhdGguZmluZCgKICAgICAgKG5vZGUyKSA9PiBub2RlMiBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmICh0eXBlb2YgcHJldmVudCA9PT0gImZ1bmN0aW9uIiAmJiBwcmV2ZW50Py4obm9kZTIpIHx8IG5vZGUyLmhhc0F0dHJpYnV0ZT8uKCJkYXRhLWxlbmlzLXByZXZlbnQiKSB8fCBpc1RvdWNoICYmIG5vZGUyLmhhc0F0dHJpYnV0ZT8uKCJkYXRhLWxlbmlzLXByZXZlbnQtdG91Y2giKSB8fCBpc1doZWVsICYmIG5vZGUyLmhhc0F0dHJpYnV0ZT8uKCJkYXRhLWxlbmlzLXByZXZlbnQtd2hlZWwiKSB8fCB0aGlzLm9wdGlvbnMuYWxsb3dOZXN0ZWRTY3JvbGwgJiYgdGhpcy5jaGVja05lc3RlZFNjcm9sbChub2RlMiwgeyBkZWx0YVgsIGRlbHRhWSB9KSkKICAgICkpCiAgICAgIHJldHVybjsKICAgIGlmICh0aGlzLmlzU3RvcHBlZCB8fCB0aGlzLmlzTG9ja2VkKSB7CiAgICAgIGlmIChldmVudC5jYW5jZWxhYmxlKSB7CiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBpc1Ntb290aCA9IHRoaXMub3B0aW9ucy5zeW5jVG91Y2ggJiYgaXNUb3VjaCB8fCB0aGlzLm9wdGlvbnMuc21vb3RoV2hlZWwgJiYgaXNXaGVlbDsKICAgIGlmICghaXNTbW9vdGgpIHsKICAgICAgdGhpcy5pc1Njcm9sbGluZyA9ICJuYXRpdmUiOwogICAgICB0aGlzLmFuaW1hdGUuc3RvcCgpOwogICAgICBldmVudC5sZW5pc1N0b3BQcm9wYWdhdGlvbiA9IHRydWU7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGxldCBkZWx0YSA9IGRlbHRhWTsKICAgIGlmICh0aGlzLm9wdGlvbnMuZ2VzdHVyZU9yaWVudGF0aW9uID09PSAiYm90aCIpIHsKICAgICAgZGVsdGEgPSBNYXRoLmFicyhkZWx0YVkpID4gTWF0aC5hYnMoZGVsdGFYKSA/IGRlbHRhWSA6IGRlbHRhWDsKICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLmdlc3R1cmVPcmllbnRhdGlvbiA9PT0gImhvcml6b250YWwiKSB7CiAgICAgIGRlbHRhID0gZGVsdGFYOwogICAgfQogICAgaWYgKCF0aGlzLm9wdGlvbnMub3ZlcnNjcm9sbCB8fCB0aGlzLm9wdGlvbnMuaW5maW5pdGUgfHwgdGhpcy5vcHRpb25zLndyYXBwZXIgIT09IHdpbmRvdyAmJiB0aGlzLmxpbWl0ID4gMCAmJiAodGhpcy5hbmltYXRlZFNjcm9sbCA+IDAgJiYgdGhpcy5hbmltYXRlZFNjcm9sbCA8IHRoaXMubGltaXQgfHwgdGhpcy5hbmltYXRlZFNjcm9sbCA9PT0gMCAmJiBkZWx0YVkgPiAwIHx8IHRoaXMuYW5pbWF0ZWRTY3JvbGwgPT09IHRoaXMubGltaXQgJiYgZGVsdGFZIDwgMCkpIHsKICAgICAgZXZlbnQubGVuaXNTdG9wUHJvcGFnYXRpb24gPSB0cnVlOwogICAgfQogICAgaWYgKGV2ZW50LmNhbmNlbGFibGUpIHsKICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgIH0KICAgIGNvbnN0IGlzU3luY1RvdWNoID0gaXNUb3VjaCAmJiB0aGlzLm9wdGlvbnMuc3luY1RvdWNoOwogICAgY29uc3QgaXNUb3VjaEVuZCA9IGlzVG91Y2ggJiYgZXZlbnQudHlwZSA9PT0gInRvdWNoZW5kIjsKICAgIGNvbnN0IGhhc1RvdWNoSW5lcnRpYSA9IGlzVG91Y2hFbmQ7CiAgICBpZiAoaGFzVG91Y2hJbmVydGlhKSB7CiAgICAgIGRlbHRhID0gTWF0aC5zaWduKHRoaXMudmVsb2NpdHkpICogTWF0aC5wb3coTWF0aC5hYnModGhpcy52ZWxvY2l0eSksIHRoaXMub3B0aW9ucy50b3VjaEluZXJ0aWFFeHBvbmVudCk7CiAgICB9CiAgICB0aGlzLnNjcm9sbFRvKHRoaXMudGFyZ2V0U2Nyb2xsICsgZGVsdGEsIHsKICAgICAgcHJvZ3JhbW1hdGljOiBmYWxzZSwKICAgICAgLi4uaXNTeW5jVG91Y2ggPyB7CiAgICAgICAgbGVycDogaGFzVG91Y2hJbmVydGlhID8gdGhpcy5vcHRpb25zLnN5bmNUb3VjaExlcnAgOiAxCiAgICAgIH0gOiB7CiAgICAgICAgbGVycDogdGhpcy5vcHRpb25zLmxlcnAsCiAgICAgICAgZHVyYXRpb246IHRoaXMub3B0aW9ucy5kdXJhdGlvbiwKICAgICAgICBlYXNpbmc6IHRoaXMub3B0aW9ucy5lYXNpbmcKICAgICAgfQogICAgfSk7CiAgfSwgIm9uVmlydHVhbFNjcm9sbCIpOwogIC8qKgogICAqIEZvcmNlIGxlbmlzIHRvIHJlY2FsY3VsYXRlIHRoZSBkaW1lbnNpb25zCiAgICovCiAgcmVzaXplKCkgewogICAgdGhpcy5kaW1lbnNpb25zLnJlc2l6ZSgpOwogICAgdGhpcy5hbmltYXRlZFNjcm9sbCA9IHRoaXMudGFyZ2V0U2Nyb2xsID0gdGhpcy5hY3R1YWxTY3JvbGw7CiAgICB0aGlzLmVtaXQoKTsKICB9CiAgZW1pdCgpIHsKICAgIHRoaXMuZW1pdHRlci5lbWl0KCJzY3JvbGwiLCB0aGlzKTsKICB9CiAgb25OYXRpdmVTY3JvbGwgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCgpID0+IHsKICAgIGlmICh0aGlzLl9yZXNldFZlbG9jaXR5VGltZW91dCAhPT0gbnVsbCkgewogICAgICBjbGVhclRpbWVvdXQodGhpcy5fcmVzZXRWZWxvY2l0eVRpbWVvdXQpOwogICAgICB0aGlzLl9yZXNldFZlbG9jaXR5VGltZW91dCA9IG51bGw7CiAgICB9CiAgICBpZiAodGhpcy5fcHJldmVudE5leHROYXRpdmVTY3JvbGxFdmVudCkgewogICAgICB0aGlzLl9wcmV2ZW50TmV4dE5hdGl2ZVNjcm9sbEV2ZW50ID0gZmFsc2U7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0aGlzLmlzU2Nyb2xsaW5nID09PSBmYWxzZSB8fCB0aGlzLmlzU2Nyb2xsaW5nID09PSAibmF0aXZlIikgewogICAgICBjb25zdCBsYXN0U2Nyb2xsID0gdGhpcy5hbmltYXRlZFNjcm9sbDsKICAgICAgdGhpcy5hbmltYXRlZFNjcm9sbCA9IHRoaXMudGFyZ2V0U2Nyb2xsID0gdGhpcy5hY3R1YWxTY3JvbGw7CiAgICAgIHRoaXMubGFzdFZlbG9jaXR5ID0gdGhpcy52ZWxvY2l0eTsKICAgICAgdGhpcy52ZWxvY2l0eSA9IHRoaXMuYW5pbWF0ZWRTY3JvbGwgLSBsYXN0U2Nyb2xsOwogICAgICB0aGlzLmRpcmVjdGlvbiA9IE1hdGguc2lnbigKICAgICAgICB0aGlzLmFuaW1hdGVkU2Nyb2xsIC0gbGFzdFNjcm9sbAogICAgICApOwogICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7CiAgICAgICAgdGhpcy5pc1Njcm9sbGluZyA9ICJuYXRpdmUiOwogICAgICB9CiAgICAgIHRoaXMuZW1pdCgpOwogICAgICBpZiAodGhpcy52ZWxvY2l0eSAhPT0gMCkgewogICAgICAgIHRoaXMuX3Jlc2V0VmVsb2NpdHlUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICB0aGlzLmxhc3RWZWxvY2l0eSA9IHRoaXMudmVsb2NpdHk7CiAgICAgICAgICB0aGlzLnZlbG9jaXR5ID0gMDsKICAgICAgICAgIHRoaXMuaXNTY3JvbGxpbmcgPSBmYWxzZTsKICAgICAgICAgIHRoaXMuZW1pdCgpOwogICAgICAgIH0sIDQwMCk7CiAgICAgIH0KICAgIH0KICB9LCAib25OYXRpdmVTY3JvbGwiKTsKICByZXNldCgpIHsKICAgIHRoaXMuaXNMb2NrZWQgPSBmYWxzZTsKICAgIHRoaXMuaXNTY3JvbGxpbmcgPSBmYWxzZTsKICAgIHRoaXMuYW5pbWF0ZWRTY3JvbGwgPSB0aGlzLnRhcmdldFNjcm9sbCA9IHRoaXMuYWN0dWFsU2Nyb2xsOwogICAgdGhpcy5sYXN0VmVsb2NpdHkgPSB0aGlzLnZlbG9jaXR5ID0gMDsKICAgIHRoaXMuYW5pbWF0ZS5zdG9wKCk7CiAgfQogIC8qKgogICAqIFN0YXJ0IGxlbmlzIHNjcm9sbCBhZnRlciBpdCBoYXMgYmVlbiBzdG9wcGVkCiAgICovCiAgc3RhcnQoKSB7CiAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSByZXR1cm47CiAgICBpZiAodGhpcy5vcHRpb25zLmF1dG9Ub2dnbGUpIHsKICAgICAgdGhpcy5yb290RWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgib3ZlcmZsb3ciKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5pbnRlcm5hbFN0YXJ0KCk7CiAgfQogIGludGVybmFsU3RhcnQoKSB7CiAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSByZXR1cm47CiAgICB0aGlzLnJlc2V0KCk7CiAgICB0aGlzLmlzU3RvcHBlZCA9IGZhbHNlOwogICAgdGhpcy5lbWl0KCk7CiAgfQogIC8qKgogICAqIFN0b3AgbGVuaXMgc2Nyb2xsCiAgICovCiAgc3RvcCgpIHsKICAgIGlmICh0aGlzLmlzU3RvcHBlZCkgcmV0dXJuOwogICAgaWYgKHRoaXMub3B0aW9ucy5hdXRvVG9nZ2xlKSB7CiAgICAgIHRoaXMucm9vdEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoIm92ZXJmbG93IiwgImNsaXAiKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5pbnRlcm5hbFN0b3AoKTsKICB9CiAgaW50ZXJuYWxTdG9wKCkgewogICAgaWYgKHRoaXMuaXNTdG9wcGVkKSByZXR1cm47CiAgICB0aGlzLnJlc2V0KCk7CiAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7CiAgICB0aGlzLmVtaXQoKTsKICB9CiAgLyoqCiAgICogUmVxdWVzdEFuaW1hdGlvbkZyYW1lIGZvciBsZW5pcwogICAqCiAgICogQHBhcmFtIHRpbWUgVGhlIHRpbWUgaW4gbXMgZnJvbSBhbiBleHRlcm5hbCBjbG9jayBsaWtlIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgIG9yIFRlbXB1cwogICAqLwogIHJhZiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHRpbWUpID0+IHsKICAgIGNvbnN0IGRlbHRhVGltZSA9IHRpbWUgLSAodGhpcy50aW1lIHx8IHRpbWUpOwogICAgdGhpcy50aW1lID0gdGltZTsKICAgIHRoaXMuYW5pbWF0ZS5hZHZhbmNlKGRlbHRhVGltZSAqIDFlLTMpOwogICAgaWYgKHRoaXMub3B0aW9ucy5hdXRvUmFmKSB7CiAgICAgIHRoaXMuX3JhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMucmFmKTsKICAgIH0KICB9LCAicmFmIik7CiAgLyoqCiAgICogU2Nyb2xsIHRvIGEgdGFyZ2V0IHZhbHVlCiAgICoKICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgdmFsdWUgdG8gc2Nyb2xsIHRvCiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgZm9yIHRoZSBzY3JvbGwKICAgKgogICAqIEBleGFtcGxlCiAgICogbGVuaXMuc2Nyb2xsVG8oMTAwLCB7CiAgICogICBvZmZzZXQ6IDEwMCwKICAgKiAgIGR1cmF0aW9uOiAxLAogICAqICAgZWFzaW5nOiAodCkgPT4gMSAtIE1hdGguY29zKCh0ICogTWF0aC5QSSkgLyAyKSwKICAgKiAgIGxlcnA6IDAuMSwKICAgKiAgIG9uU3RhcnQ6ICgpID0+IHsKICAgKiAgICAgY29uc29sZS5sb2coJ29uU3RhcnQnKQogICAqICAgfSwKICAgKiAgIG9uQ29tcGxldGU6ICgpID0+IHsKICAgKiAgICAgY29uc29sZS5sb2coJ29uQ29tcGxldGUnKQogICAqICAgfSwKICAgKiB9KQogICAqLwogIHNjcm9sbFRvKHRhcmdldCwgewogICAgb2Zmc2V0ID0gMCwKICAgIGltbWVkaWF0ZSA9IGZhbHNlLAogICAgbG9jayA9IGZhbHNlLAogICAgcHJvZ3JhbW1hdGljID0gdHJ1ZSwKICAgIC8vIGNhbGxlZCBmcm9tIG91dHNpZGUgb2YgdGhlIGNsYXNzCiAgICBsZXJwOiBsZXJwMiA9IHByb2dyYW1tYXRpYyA/IHRoaXMub3B0aW9ucy5sZXJwIDogdm9pZCAwLAogICAgZHVyYXRpb24gPSBwcm9ncmFtbWF0aWMgPyB0aGlzLm9wdGlvbnMuZHVyYXRpb24gOiB2b2lkIDAsCiAgICBlYXNpbmcgPSBwcm9ncmFtbWF0aWMgPyB0aGlzLm9wdGlvbnMuZWFzaW5nIDogdm9pZCAwLAogICAgb25TdGFydCwKICAgIG9uQ29tcGxldGUsCiAgICBmb3JjZSA9IGZhbHNlLAogICAgLy8gc2Nyb2xsIGV2ZW4gaWYgc3RvcHBlZAogICAgdXNlckRhdGEKICB9ID0ge30pIHsKICAgIGlmICgodGhpcy5pc1N0b3BwZWQgfHwgdGhpcy5pc0xvY2tlZCkgJiYgIWZvcmNlKSByZXR1cm47CiAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gInN0cmluZyIgJiYgWyJ0b3AiLCAibGVmdCIsICJzdGFydCIsICIjIl0uaW5jbHVkZXModGFyZ2V0KSkgewogICAgICB0YXJnZXQgPSAwOwogICAgfSBlbHNlIGlmICh0eXBlb2YgdGFyZ2V0ID09PSAic3RyaW5nIiAmJiBbImJvdHRvbSIsICJyaWdodCIsICJlbmQiXS5pbmNsdWRlcyh0YXJnZXQpKSB7CiAgICAgIHRhcmdldCA9IHRoaXMubGltaXQ7CiAgICB9IGVsc2UgewogICAgICBsZXQgbm9kZTI7CiAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSAic3RyaW5nIikgewogICAgICAgIG5vZGUyID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0YXJnZXQpOwogICAgICAgIGlmICghbm9kZTIpIHsKICAgICAgICAgIGlmICh0YXJnZXQgPT09ICIjdG9wIikgewogICAgICAgICAgICB0YXJnZXQgPSAwOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS53YXJuKCJMZW5pczogVGFyZ2V0IG5vdCBmb3VuZCIsIHRhcmdldCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRhcmdldD8ubm9kZVR5cGUpIHsKICAgICAgICBub2RlMiA9IHRhcmdldDsKICAgICAgfQogICAgICBpZiAobm9kZTIpIHsKICAgICAgICBpZiAodGhpcy5vcHRpb25zLndyYXBwZXIgIT09IHdpbmRvdykgewogICAgICAgICAgY29uc3Qgd3JhcHBlclJlY3QgPSB0aGlzLnJvb3RFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgICAgb2Zmc2V0IC09IHRoaXMuaXNIb3Jpem9udGFsID8gd3JhcHBlclJlY3QubGVmdCA6IHdyYXBwZXJSZWN0LnRvcDsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVjdCA9IG5vZGUyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIHRhcmdldCA9ICh0aGlzLmlzSG9yaXpvbnRhbCA/IHJlY3QubGVmdCA6IHJlY3QudG9wKSArIHRoaXMuYW5pbWF0ZWRTY3JvbGw7CiAgICAgIH0KICAgIH0KICAgIGlmICh0eXBlb2YgdGFyZ2V0ICE9PSAibnVtYmVyIikgcmV0dXJuOwogICAgdGFyZ2V0ICs9IG9mZnNldDsKICAgIHRhcmdldCA9IE1hdGgucm91bmQodGFyZ2V0KTsKICAgIGlmICh0aGlzLm9wdGlvbnMuaW5maW5pdGUpIHsKICAgICAgaWYgKHByb2dyYW1tYXRpYykgewogICAgICAgIHRoaXMudGFyZ2V0U2Nyb2xsID0gdGhpcy5hbmltYXRlZFNjcm9sbCA9IHRoaXMuc2Nyb2xsOwogICAgICAgIGNvbnN0IGRpc3RhbmNlID0gdGFyZ2V0IC0gdGhpcy5hbmltYXRlZFNjcm9sbDsKICAgICAgICBpZiAoZGlzdGFuY2UgPiB0aGlzLmxpbWl0IC8gMikgewogICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IC0gdGhpcy5saW1pdDsKICAgICAgICB9IGVsc2UgaWYgKGRpc3RhbmNlIDwgLXRoaXMubGltaXQgLyAyKSB7CiAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQgKyB0aGlzLmxpbWl0OwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGFyZ2V0ID0gY2xhbXAyKDAsIHRhcmdldCwgdGhpcy5saW1pdCk7CiAgICB9CiAgICBpZiAodGFyZ2V0ID09PSB0aGlzLnRhcmdldFNjcm9sbCkgewogICAgICBvblN0YXJ0Py4odGhpcyk7CiAgICAgIG9uQ29tcGxldGU/Lih0aGlzKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy51c2VyRGF0YSA9IHVzZXJEYXRhID8/IHt9OwogICAgaWYgKGltbWVkaWF0ZSkgewogICAgICB0aGlzLmFuaW1hdGVkU2Nyb2xsID0gdGhpcy50YXJnZXRTY3JvbGwgPSB0YXJnZXQ7CiAgICAgIHRoaXMuc2V0U2Nyb2xsKHRoaXMuc2Nyb2xsKTsKICAgICAgdGhpcy5yZXNldCgpOwogICAgICB0aGlzLnByZXZlbnROZXh0TmF0aXZlU2Nyb2xsRXZlbnQoKTsKICAgICAgdGhpcy5lbWl0KCk7CiAgICAgIG9uQ29tcGxldGU/Lih0aGlzKTsKICAgICAgdGhpcy51c2VyRGF0YSA9IHt9OwogICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gewogICAgICAgIHRoaXMuZGlzcGF0Y2hTY3JvbGxlbmRFdmVudCgpOwogICAgICB9KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKCFwcm9ncmFtbWF0aWMpIHsKICAgICAgdGhpcy50YXJnZXRTY3JvbGwgPSB0YXJnZXQ7CiAgICB9CiAgICBpZiAodHlwZW9mIGR1cmF0aW9uID09PSAibnVtYmVyIiAmJiB0eXBlb2YgZWFzaW5nICE9PSAiZnVuY3Rpb24iKSB7CiAgICAgIGVhc2luZyA9IGRlZmF1bHRFYXNpbmc7CiAgICB9IGVsc2UgaWYgKHR5cGVvZiBlYXNpbmcgPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIGR1cmF0aW9uICE9PSAibnVtYmVyIikgewogICAgICBkdXJhdGlvbiA9IDE7CiAgICB9CiAgICB0aGlzLmFuaW1hdGUuZnJvbVRvKHRoaXMuYW5pbWF0ZWRTY3JvbGwsIHRhcmdldCwgewogICAgICBkdXJhdGlvbiwKICAgICAgZWFzaW5nLAogICAgICBsZXJwOiBsZXJwMiwKICAgICAgb25TdGFydDogLyogQF9fUFVSRV9fICovIF9fbmFtZSgoKSA9PiB7CiAgICAgICAgaWYgKGxvY2spIHRoaXMuaXNMb2NrZWQgPSB0cnVlOwogICAgICAgIHRoaXMuaXNTY3JvbGxpbmcgPSAic21vb3RoIjsKICAgICAgICBvblN0YXJ0Py4odGhpcyk7CiAgICAgIH0sICJvblN0YXJ0IiksCiAgICAgIG9uVXBkYXRlOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh2YWx1ZTIsIGNvbXBsZXRlZCkgPT4gewogICAgICAgIHRoaXMuaXNTY3JvbGxpbmcgPSAic21vb3RoIjsKICAgICAgICB0aGlzLmxhc3RWZWxvY2l0eSA9IHRoaXMudmVsb2NpdHk7CiAgICAgICAgdGhpcy52ZWxvY2l0eSA9IHZhbHVlMiAtIHRoaXMuYW5pbWF0ZWRTY3JvbGw7CiAgICAgICAgdGhpcy5kaXJlY3Rpb24gPSBNYXRoLnNpZ24odGhpcy52ZWxvY2l0eSk7CiAgICAgICAgdGhpcy5hbmltYXRlZFNjcm9sbCA9IHZhbHVlMjsKICAgICAgICB0aGlzLnNldFNjcm9sbCh0aGlzLnNjcm9sbCk7CiAgICAgICAgaWYgKHByb2dyYW1tYXRpYykgewogICAgICAgICAgdGhpcy50YXJnZXRTY3JvbGwgPSB2YWx1ZTI7CiAgICAgICAgfQogICAgICAgIGlmICghY29tcGxldGVkKSB0aGlzLmVtaXQoKTsKICAgICAgICBpZiAoY29tcGxldGVkKSB7CiAgICAgICAgICB0aGlzLnJlc2V0KCk7CiAgICAgICAgICB0aGlzLmVtaXQoKTsKICAgICAgICAgIG9uQ29tcGxldGU/Lih0aGlzKTsKICAgICAgICAgIHRoaXMudXNlckRhdGEgPSB7fTsKICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7CiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hTY3JvbGxlbmRFdmVudCgpOwogICAgICAgICAgfSk7CiAgICAgICAgICB0aGlzLnByZXZlbnROZXh0TmF0aXZlU2Nyb2xsRXZlbnQoKTsKICAgICAgICB9CiAgICAgIH0sICJvblVwZGF0ZSIpCiAgICB9KTsKICB9CiAgcHJldmVudE5leHROYXRpdmVTY3JvbGxFdmVudCgpIHsKICAgIHRoaXMuX3ByZXZlbnROZXh0TmF0aXZlU2Nyb2xsRXZlbnQgPSB0cnVlOwogICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsKICAgICAgdGhpcy5fcHJldmVudE5leHROYXRpdmVTY3JvbGxFdmVudCA9IGZhbHNlOwogICAgfSk7CiAgfQogIGNoZWNrTmVzdGVkU2Nyb2xsKG5vZGUyLCB7IGRlbHRhWCwgZGVsdGFZIH0pIHsKICAgIGNvbnN0IHRpbWUgPSBEYXRlLm5vdygpOwogICAgY29uc3QgY2FjaGUgPSBub2RlMi5fbGVuaXMgPz89IHt9OwogICAgbGV0IGhhc092ZXJmbG93WCwgaGFzT3ZlcmZsb3dZLCBpc1Njcm9sbGFibGVYLCBpc1Njcm9sbGFibGVZLCBzY3JvbGxXaWR0aCwgc2Nyb2xsSGVpZ2h0LCBjbGllbnRXaWR0aCwgY2xpZW50SGVpZ2h0OwogICAgY29uc3QgZ2VzdHVyZU9yaWVudGF0aW9uID0gdGhpcy5vcHRpb25zLmdlc3R1cmVPcmllbnRhdGlvbjsKICAgIGlmICh0aW1lIC0gKGNhY2hlLnRpbWUgPz8gMCkgPiAyZTMpIHsKICAgICAgY2FjaGUudGltZSA9IERhdGUubm93KCk7CiAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShub2RlMik7CiAgICAgIGNhY2hlLmNvbXB1dGVkU3R5bGUgPSBjb21wdXRlZFN0eWxlOwogICAgICBjb25zdCBvdmVyZmxvd1hTdHJpbmcgPSBjb21wdXRlZFN0eWxlLm92ZXJmbG93WDsKICAgICAgY29uc3Qgb3ZlcmZsb3dZU3RyaW5nID0gY29tcHV0ZWRTdHlsZS5vdmVyZmxvd1k7CiAgICAgIGhhc092ZXJmbG93WCA9IFsiYXV0byIsICJvdmVybGF5IiwgInNjcm9sbCJdLmluY2x1ZGVzKG92ZXJmbG93WFN0cmluZyk7CiAgICAgIGhhc092ZXJmbG93WSA9IFsiYXV0byIsICJvdmVybGF5IiwgInNjcm9sbCJdLmluY2x1ZGVzKG92ZXJmbG93WVN0cmluZyk7CiAgICAgIGNhY2hlLmhhc092ZXJmbG93WCA9IGhhc092ZXJmbG93WDsKICAgICAgY2FjaGUuaGFzT3ZlcmZsb3dZID0gaGFzT3ZlcmZsb3dZOwogICAgICBpZiAoIWhhc092ZXJmbG93WCAmJiAhaGFzT3ZlcmZsb3dZKSByZXR1cm4gZmFsc2U7CiAgICAgIGlmIChnZXN0dXJlT3JpZW50YXRpb24gPT09ICJ2ZXJ0aWNhbCIgJiYgIWhhc092ZXJmbG93WSkgcmV0dXJuIGZhbHNlOwogICAgICBpZiAoZ2VzdHVyZU9yaWVudGF0aW9uID09PSAiaG9yaXpvbnRhbCIgJiYgIWhhc092ZXJmbG93WCkgcmV0dXJuIGZhbHNlOwogICAgICBzY3JvbGxXaWR0aCA9IG5vZGUyLnNjcm9sbFdpZHRoOwogICAgICBzY3JvbGxIZWlnaHQgPSBub2RlMi5zY3JvbGxIZWlnaHQ7CiAgICAgIGNsaWVudFdpZHRoID0gbm9kZTIuY2xpZW50V2lkdGg7CiAgICAgIGNsaWVudEhlaWdodCA9IG5vZGUyLmNsaWVudEhlaWdodDsKICAgICAgaXNTY3JvbGxhYmxlWCA9IHNjcm9sbFdpZHRoID4gY2xpZW50V2lkdGg7CiAgICAgIGlzU2Nyb2xsYWJsZVkgPSBzY3JvbGxIZWlnaHQgPiBjbGllbnRIZWlnaHQ7CiAgICAgIGNhY2hlLmlzU2Nyb2xsYWJsZVggPSBpc1Njcm9sbGFibGVYOwogICAgICBjYWNoZS5pc1Njcm9sbGFibGVZID0gaXNTY3JvbGxhYmxlWTsKICAgICAgY2FjaGUuc2Nyb2xsV2lkdGggPSBzY3JvbGxXaWR0aDsKICAgICAgY2FjaGUuc2Nyb2xsSGVpZ2h0ID0gc2Nyb2xsSGVpZ2h0OwogICAgICBjYWNoZS5jbGllbnRXaWR0aCA9IGNsaWVudFdpZHRoOwogICAgICBjYWNoZS5jbGllbnRIZWlnaHQgPSBjbGllbnRIZWlnaHQ7CiAgICB9IGVsc2UgewogICAgICBpc1Njcm9sbGFibGVYID0gY2FjaGUuaXNTY3JvbGxhYmxlWDsKICAgICAgaXNTY3JvbGxhYmxlWSA9IGNhY2hlLmlzU2Nyb2xsYWJsZVk7CiAgICAgIGhhc092ZXJmbG93WCA9IGNhY2hlLmhhc092ZXJmbG93WDsKICAgICAgaGFzT3ZlcmZsb3dZID0gY2FjaGUuaGFzT3ZlcmZsb3dZOwogICAgICBzY3JvbGxXaWR0aCA9IGNhY2hlLnNjcm9sbFdpZHRoOwogICAgICBzY3JvbGxIZWlnaHQgPSBjYWNoZS5zY3JvbGxIZWlnaHQ7CiAgICAgIGNsaWVudFdpZHRoID0gY2FjaGUuY2xpZW50V2lkdGg7CiAgICAgIGNsaWVudEhlaWdodCA9IGNhY2hlLmNsaWVudEhlaWdodDsKICAgIH0KICAgIGlmICghaGFzT3ZlcmZsb3dYICYmICFoYXNPdmVyZmxvd1kgfHwgIWlzU2Nyb2xsYWJsZVggJiYgIWlzU2Nyb2xsYWJsZVkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKGdlc3R1cmVPcmllbnRhdGlvbiA9PT0gInZlcnRpY2FsIiAmJiAoIWhhc092ZXJmbG93WSB8fCAhaXNTY3JvbGxhYmxlWSkpCiAgICAgIHJldHVybiBmYWxzZTsKICAgIGlmIChnZXN0dXJlT3JpZW50YXRpb24gPT09ICJob3Jpem9udGFsIiAmJiAoIWhhc092ZXJmbG93WCB8fCAhaXNTY3JvbGxhYmxlWCkpCiAgICAgIHJldHVybiBmYWxzZTsKICAgIGxldCBvcmllbnRhdGlvbjsKICAgIGlmIChnZXN0dXJlT3JpZW50YXRpb24gPT09ICJob3Jpem9udGFsIikgewogICAgICBvcmllbnRhdGlvbiA9ICJ4IjsKICAgIH0gZWxzZSBpZiAoZ2VzdHVyZU9yaWVudGF0aW9uID09PSAidmVydGljYWwiKSB7CiAgICAgIG9yaWVudGF0aW9uID0gInkiOwogICAgfSBlbHNlIHsKICAgICAgY29uc3QgaXNTY3JvbGxpbmdYID0gZGVsdGFYICE9PSAwOwogICAgICBjb25zdCBpc1Njcm9sbGluZ1kgPSBkZWx0YVkgIT09IDA7CiAgICAgIGlmIChpc1Njcm9sbGluZ1ggJiYgaGFzT3ZlcmZsb3dYICYmIGlzU2Nyb2xsYWJsZVgpIHsKICAgICAgICBvcmllbnRhdGlvbiA9ICJ4IjsKICAgICAgfQogICAgICBpZiAoaXNTY3JvbGxpbmdZICYmIGhhc092ZXJmbG93WSAmJiBpc1Njcm9sbGFibGVZKSB7CiAgICAgICAgb3JpZW50YXRpb24gPSAieSI7CiAgICAgIH0KICAgIH0KICAgIGlmICghb3JpZW50YXRpb24pIHJldHVybiBmYWxzZTsKICAgIGxldCBzY3JvbGwsIG1heFNjcm9sbCwgZGVsdGEsIGhhc092ZXJmbG93LCBpc1Njcm9sbGFibGU7CiAgICBpZiAob3JpZW50YXRpb24gPT09ICJ4IikgewogICAgICBzY3JvbGwgPSBub2RlMi5zY3JvbGxMZWZ0OwogICAgICBtYXhTY3JvbGwgPSBzY3JvbGxXaWR0aCAtIGNsaWVudFdpZHRoOwogICAgICBkZWx0YSA9IGRlbHRhWDsKICAgICAgaGFzT3ZlcmZsb3cgPSBoYXNPdmVyZmxvd1g7CiAgICAgIGlzU2Nyb2xsYWJsZSA9IGlzU2Nyb2xsYWJsZVg7CiAgICB9IGVsc2UgaWYgKG9yaWVudGF0aW9uID09PSAieSIpIHsKICAgICAgc2Nyb2xsID0gbm9kZTIuc2Nyb2xsVG9wOwogICAgICBtYXhTY3JvbGwgPSBzY3JvbGxIZWlnaHQgLSBjbGllbnRIZWlnaHQ7CiAgICAgIGRlbHRhID0gZGVsdGFZOwogICAgICBoYXNPdmVyZmxvdyA9IGhhc092ZXJmbG93WTsKICAgICAgaXNTY3JvbGxhYmxlID0gaXNTY3JvbGxhYmxlWTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGNvbnN0IHdpbGxTY3JvbGwgPSBkZWx0YSA+IDAgPyBzY3JvbGwgPCBtYXhTY3JvbGwgOiBzY3JvbGwgPiAwOwogICAgcmV0dXJuIHdpbGxTY3JvbGwgJiYgaGFzT3ZlcmZsb3cgJiYgaXNTY3JvbGxhYmxlOwogIH0KICAvKioKICAgKiBUaGUgcm9vdCBlbGVtZW50IG9uIHdoaWNoIGxlbmlzIGlzIGluc3RhbmNlZAogICAqLwogIGdldCByb290RWxlbWVudCgpIHsKICAgIHJldHVybiB0aGlzLm9wdGlvbnMud3JhcHBlciA9PT0gd2luZG93ID8gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IDogdGhpcy5vcHRpb25zLndyYXBwZXI7CiAgfQogIC8qKgogICAqIFRoZSBsaW1pdCB3aGljaCBpcyB0aGUgbWF4aW11bSBzY3JvbGwgdmFsdWUKICAgKi8KICBnZXQgbGltaXQoKSB7CiAgICBpZiAodGhpcy5vcHRpb25zLm5haXZlRGltZW5zaW9ucykgewogICAgICBpZiAodGhpcy5pc0hvcml6b250YWwpIHsKICAgICAgICByZXR1cm4gdGhpcy5yb290RWxlbWVudC5zY3JvbGxXaWR0aCAtIHRoaXMucm9vdEVsZW1lbnQuY2xpZW50V2lkdGg7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHRoaXMucm9vdEVsZW1lbnQuc2Nyb2xsSGVpZ2h0IC0gdGhpcy5yb290RWxlbWVudC5jbGllbnRIZWlnaHQ7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0aGlzLmRpbWVuc2lvbnMubGltaXRbdGhpcy5pc0hvcml6b250YWwgPyAieCIgOiAieSJdOwogICAgfQogIH0KICAvKioKICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgc2Nyb2xsIGlzIGhvcml6b250YWwKICAgKi8KICBnZXQgaXNIb3Jpem9udGFsKCkgewogICAgcmV0dXJuIHRoaXMub3B0aW9ucy5vcmllbnRhdGlvbiA9PT0gImhvcml6b250YWwiOwogIH0KICAvKioKICAgKiBUaGUgYWN0dWFsIHNjcm9sbCB2YWx1ZQogICAqLwogIGdldCBhY3R1YWxTY3JvbGwoKSB7CiAgICBjb25zdCB3cmFwcGVyID0gdGhpcy5vcHRpb25zLndyYXBwZXI7CiAgICByZXR1cm4gdGhpcy5pc0hvcml6b250YWwgPyB3cmFwcGVyLnNjcm9sbFggPz8gd3JhcHBlci5zY3JvbGxMZWZ0IDogd3JhcHBlci5zY3JvbGxZID8/IHdyYXBwZXIuc2Nyb2xsVG9wOwogIH0KICAvKioKICAgKiBUaGUgY3VycmVudCBzY3JvbGwgdmFsdWUKICAgKi8KICBnZXQgc2Nyb2xsKCkgewogICAgcmV0dXJuIHRoaXMub3B0aW9ucy5pbmZpbml0ZSA/IG1vZHVsbyh0aGlzLmFuaW1hdGVkU2Nyb2xsLCB0aGlzLmxpbWl0KSA6IHRoaXMuYW5pbWF0ZWRTY3JvbGw7CiAgfQogIC8qKgogICAqIFRoZSBwcm9ncmVzcyBvZiB0aGUgc2Nyb2xsIHJlbGF0aXZlIHRvIHRoZSBsaW1pdAogICAqLwogIGdldCBwcm9ncmVzcygpIHsKICAgIHJldHVybiB0aGlzLmxpbWl0ID09PSAwID8gMSA6IHRoaXMuc2Nyb2xsIC8gdGhpcy5saW1pdDsKICB9CiAgLyoqCiAgICogQ3VycmVudCBzY3JvbGwgc3RhdGUKICAgKi8KICBnZXQgaXNTY3JvbGxpbmcoKSB7CiAgICByZXR1cm4gdGhpcy5faXNTY3JvbGxpbmc7CiAgfQogIHNldCBpc1Njcm9sbGluZyh2YWx1ZTIpIHsKICAgIGlmICh0aGlzLl9pc1Njcm9sbGluZyAhPT0gdmFsdWUyKSB7CiAgICAgIHRoaXMuX2lzU2Nyb2xsaW5nID0gdmFsdWUyOwogICAgICB0aGlzLnVwZGF0ZUNsYXNzTmFtZSgpOwogICAgfQogIH0KICAvKioKICAgKiBDaGVjayBpZiBsZW5pcyBpcyBzdG9wcGVkCiAgICovCiAgZ2V0IGlzU3RvcHBlZCgpIHsKICAgIHJldHVybiB0aGlzLl9pc1N0b3BwZWQ7CiAgfQogIHNldCBpc1N0b3BwZWQodmFsdWUyKSB7CiAgICBpZiAodGhpcy5faXNTdG9wcGVkICE9PSB2YWx1ZTIpIHsKICAgICAgdGhpcy5faXNTdG9wcGVkID0gdmFsdWUyOwogICAgICB0aGlzLnVwZGF0ZUNsYXNzTmFtZSgpOwogICAgfQogIH0KICAvKioKICAgKiBDaGVjayBpZiBsZW5pcyBpcyBsb2NrZWQKICAgKi8KICBnZXQgaXNMb2NrZWQoKSB7CiAgICByZXR1cm4gdGhpcy5faXNMb2NrZWQ7CiAgfQogIHNldCBpc0xvY2tlZCh2YWx1ZTIpIHsKICAgIGlmICh0aGlzLl9pc0xvY2tlZCAhPT0gdmFsdWUyKSB7CiAgICAgIHRoaXMuX2lzTG9ja2VkID0gdmFsdWUyOwogICAgICB0aGlzLnVwZGF0ZUNsYXNzTmFtZSgpOwogICAgfQogIH0KICAvKioKICAgKiBDaGVjayBpZiBsZW5pcyBpcyBzbW9vdGggc2Nyb2xsaW5nCiAgICovCiAgZ2V0IGlzU21vb3RoKCkgewogICAgcmV0dXJuIHRoaXMuaXNTY3JvbGxpbmcgPT09ICJzbW9vdGgiOwogIH0KICAvKioKICAgKiBUaGUgY2xhc3MgbmFtZSBhcHBsaWVkIHRvIHRoZSB3cmFwcGVyIGVsZW1lbnQKICAgKi8KICBnZXQgY2xhc3NOYW1lKCkgewogICAgbGV0IGNsYXNzTmFtZSA9ICJsZW5pcyI7CiAgICBpZiAodGhpcy5vcHRpb25zLmF1dG9Ub2dnbGUpIGNsYXNzTmFtZSArPSAiIGxlbmlzLWF1dG9Ub2dnbGUiOwogICAgaWYgKHRoaXMuaXNTdG9wcGVkKSBjbGFzc05hbWUgKz0gIiBsZW5pcy1zdG9wcGVkIjsKICAgIGlmICh0aGlzLmlzTG9ja2VkKSBjbGFzc05hbWUgKz0gIiBsZW5pcy1sb2NrZWQiOwogICAgaWYgKHRoaXMuaXNTY3JvbGxpbmcpIGNsYXNzTmFtZSArPSAiIGxlbmlzLXNjcm9sbGluZyI7CiAgICBpZiAodGhpcy5pc1Njcm9sbGluZyA9PT0gInNtb290aCIpIGNsYXNzTmFtZSArPSAiIGxlbmlzLXNtb290aCI7CiAgICByZXR1cm4gY2xhc3NOYW1lOwogIH0KICB1cGRhdGVDbGFzc05hbWUoKSB7CiAgICB0aGlzLmNsZWFuVXBDbGFzc05hbWUoKTsKICAgIHRoaXMucm9vdEVsZW1lbnQuY2xhc3NOYW1lID0gYCR7dGhpcy5yb290RWxlbWVudC5jbGFzc05hbWV9ICR7dGhpcy5jbGFzc05hbWV9YC50cmltKCk7CiAgfQogIGNsZWFuVXBDbGFzc05hbWUoKSB7CiAgICB0aGlzLnJvb3RFbGVtZW50LmNsYXNzTmFtZSA9IHRoaXMucm9vdEVsZW1lbnQuY2xhc3NOYW1lLnJlcGxhY2UoL2xlbmlzKC1cdyspPy9nLCAiIikudHJpbSgpOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWRvbXRvb2xzQDIuNS4xL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWRvbXRvb2xzL2Rpc3RfdHMvZG9tdG9vbHMucGx1Z2lucy5qcwp2YXIgaW1wb3J0X3N3ZWV0X3Njcm9sbCA9IF9fdG9FU00ocmVxdWlyZV9zd2VldF9zY3JvbGwoKSwgMSk7CnZhciBsaWsgPSB7CiAgT2JqZWN0TWFwLAogIFN0cmluZ21hcCwKICBGYXN0TWFwCn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1kb210b29sc0AyLjUuMS9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1kb210b29scy9kaXN0X3RzL2RvbXRvb2xzLmNzcy5icmVha3BvaW50cy5qcwp2YXIgZG9tdG9vbHNfY3NzX2JyZWFrcG9pbnRzX2V4cG9ydHMgPSB7fTsKX19leHBvcnQoZG9tdG9vbHNfY3NzX2JyZWFrcG9pbnRzX2V4cG9ydHMsIHsKICBjb250YWluZXJDb250ZXh0U3R5bGVzOiAoKSA9PiBjb250YWluZXJDb250ZXh0U3R5bGVzLAogIGNzc0ZvckNvbnN0cmFpbnQ6ICgpID0+IGNzc0ZvckNvbnN0cmFpbnQsCiAgY3NzRm9yQ29uc3RyYWludENvbnRhaW5lcjogKCkgPT4gY3NzRm9yQ29uc3RyYWludENvbnRhaW5lciwKICBjc3NGb3JDb250YWluZXI6ICgpID0+IGNzc0ZvckNvbnRhaW5lciwKICBjc3NGb3JEZXNrdG9wOiAoKSA9PiBjc3NGb3JEZXNrdG9wLAogIGNzc0Zvck5vdGVib29rOiAoKSA9PiBjc3NGb3JOb3RlYm9vaywKICBjc3NGb3JQaGFibGV0OiAoKSA9PiBjc3NGb3JQaGFibGV0LAogIGNzc0ZvclBob25lOiAoKSA9PiBjc3NGb3JQaG9uZSwKICBjc3NGb3JUYWJsZXQ6ICgpID0+IGNzc0ZvclRhYmxldCwKICBjc3NGb3JWaWV3cG9ydDogKCkgPT4gY3NzRm9yVmlld3BvcnQsCiAgZGVza3RvcDogKCkgPT4gZGVza3RvcCwKICBub3RlYm9vazogKCkgPT4gbm90ZWJvb2ssCiAgcGhhYmxldDogKCkgPT4gcGhhYmxldCwKICBwaG9uZTogKCkgPT4gcGhvbmUsCiAgdGFibGV0OiAoKSA9PiB0YWJsZXQKfSk7CnZhciBkZXNrdG9wID0gMTYwMDsKdmFyIG5vdGVib29rID0gMTI0MDsKdmFyIHRhYmxldCA9IDEwMjQ7CnZhciBwaGFibGV0ID0gNjAwOwp2YXIgcGhvbmUgPSA0MDA7CnZhciBidWlsZENvbmRpdGlvbiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGNvbnN0cmFpbnRzKSA9PiB7CiAgY29uc3QgcGFydHMgPSBbXTsKICBpZiAoY29uc3RyYWludHMubWluV2lkdGgpCiAgICBwYXJ0cy5wdXNoKGAobWluLXdpZHRoOiAke2NvbnN0cmFpbnRzLm1pbldpZHRofXB4KWApOwogIGlmIChjb25zdHJhaW50cy5tYXhXaWR0aCkKICAgIHBhcnRzLnB1c2goYChtYXgtd2lkdGg6ICR7Y29uc3RyYWludHMubWF4V2lkdGh9cHgpYCk7CiAgcmV0dXJuIHBhcnRzLmpvaW4oIiBhbmQgIik7Cn0sICJidWlsZENvbmRpdGlvbiIpOwp2YXIgY3NzRm9yVmlld3BvcnQgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChjc3NBcmcsIGNvbmRpdGlvbikgPT4gewogIHJldHVybiByKGAKICAgIEBjb250YWluZXIgd2NjVG9vbHNWaWV3cG9ydCAke2NvbmRpdGlvbn0gewogICAgICAke2Nzc0FyZy5jc3NUZXh0fQogICAgfQogICAgQG1lZGlhICR7Y29uZGl0aW9ufSB7CiAgICAgICR7Y3NzQXJnLmNzc1RleHR9CiAgICB9CiAgYCk7Cn0sICJjc3NGb3JWaWV3cG9ydCIpOwp2YXIgY3NzRm9yQ29udGFpbmVyID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoY3NzQXJnLCBjb25kaXRpb24sIGNvbnRhaW5lck5hbWUpID0+IHsKICByZXR1cm4gcihgCiAgICBAY29udGFpbmVyICR7Y29udGFpbmVyTmFtZX0gJHtjb25kaXRpb259IHsKICAgICAgJHtjc3NBcmcuY3NzVGV4dH0KICAgIH0KICBgKTsKfSwgImNzc0ZvckNvbnRhaW5lciIpOwp2YXIgY3NzRm9yQ29uc3RyYWludCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGNvbnN0cmFpbnRzKSA9PiAoY3NzQXJnKSA9PiBjc3NGb3JWaWV3cG9ydChjc3NBcmcsIGJ1aWxkQ29uZGl0aW9uKGNvbnN0cmFpbnRzKSksICJjc3NGb3JDb25zdHJhaW50Iik7CnZhciBjc3NGb3JDb25zdHJhaW50Q29udGFpbmVyID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoY29uc3RyYWludHMsIGNvbnRhaW5lck5hbWUpID0+IChjc3NBcmcpID0+IGNzc0ZvckNvbnRhaW5lcihjc3NBcmcsIGJ1aWxkQ29uZGl0aW9uKGNvbnN0cmFpbnRzKSwgY29udGFpbmVyTmFtZSksICJjc3NGb3JDb25zdHJhaW50Q29udGFpbmVyIik7CnZhciBjb250YWluZXJDb250ZXh0U3R5bGVzID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoY29udGFpbmVyTmFtZSkgPT4gaWAKICA6aG9zdCB7CiAgICBjb250YWluZXItdHlwZTogaW5saW5lLXNpemU7CiAgICBjb250YWluZXItbmFtZTogJHtyKGNvbnRhaW5lck5hbWUpfTsKICB9CmAsICJjb250YWluZXJDb250ZXh0U3R5bGVzIik7CnZhciBjc3NGb3JEZXNrdG9wID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoY3NzQXJnKSA9PiB7CiAgcmV0dXJuIGNzc0ZvclZpZXdwb3J0KGNzc0FyZywgYChtaW4td2lkdGg6ICR7ZGVza3RvcH1weClgKTsKfSwgImNzc0ZvckRlc2t0b3AiKTsKdmFyIGNzc0Zvck5vdGVib29rID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoY3NzQXJnKSA9PiB7CiAgcmV0dXJuIGNzc0ZvclZpZXdwb3J0KGNzc0FyZywgYChtYXgtd2lkdGg6ICR7bm90ZWJvb2t9cHgpYCk7Cn0sICJjc3NGb3JOb3RlYm9vayIpOwp2YXIgY3NzRm9yVGFibGV0ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoY3NzQXJnKSA9PiB7CiAgcmV0dXJuIGNzc0ZvclZpZXdwb3J0KGNzc0FyZywgYChtYXgtd2lkdGg6ICR7dGFibGV0fXB4KWApOwp9LCAiY3NzRm9yVGFibGV0Iik7CnZhciBjc3NGb3JQaGFibGV0ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoY3NzQXJnKSA9PiB7CiAgcmV0dXJuIGNzc0ZvclZpZXdwb3J0KGNzc0FyZywgYChtYXgtd2lkdGg6ICR7cGhhYmxldH1weClgKTsKfSwgImNzc0ZvclBoYWJsZXQiKTsKdmFyIGNzc0ZvclBob25lID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoY3NzQXJnKSA9PiB7CiAgcmV0dXJuIGNzc0ZvclZpZXdwb3J0KGNzc0FyZywgYChtYXgtd2lkdGg6ICR7cGhvbmV9cHgpYCk7Cn0sICJjc3NGb3JQaG9uZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZG9tdG9vbHNAMi41LjEvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZG9tdG9vbHMvZGlzdF90cy9kb210b29scy5jbGFzc2VzLnNjcm9sbGVyLmpzCnZhciBTY3JvbGxlciA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJTY3JvbGxlciIpOwogIH0KICBkb210b29sc0luc3RhbmNlOwogIC8vIEFycmF5IHRvIHN0b3JlIHNjcm9sbCBjYWxsYmFjayBmdW5jdGlvbnMuCiAgc2Nyb2xsQ2FsbGJhY2tzID0gW107CiAgLy8gTGVuaXMgaW5zdGFuY2UgKGlmIGFjdGl2YXRlZCkgb3IgbnVsbC4KICBsZW5pc0luc3RhbmNlID0gbnVsbDsKICAvLyBCb3VuZCBoYW5kbGVycyB0byBhbGxvdyByZW1vdmFsIGZyb20gZXZlbnQgbGlzdGVuZXJzLgogIGhhbmRsZU5hdGl2ZVNjcm9sbCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGV2ZW50KSA9PiB7CiAgICB0aGlzLmV4ZWN1dGVTY3JvbGxDYWxsYmFja3MoKTsKICB9LCAiaGFuZGxlTmF0aXZlU2Nyb2xsIik7CiAgaGFuZGxlTGVuaXNTY3JvbGwgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChpbmZvKSA9PiB7CiAgICB0aGlzLmV4ZWN1dGVTY3JvbGxDYWxsYmFja3MoKTsKICB9LCAiaGFuZGxlTGVuaXNTY3JvbGwiKTsKICBjb25zdHJ1Y3Rvcihkb210b29sc0luc3RhbmNlQXJnKSB7CiAgICB0aGlzLmRvbXRvb2xzSW5zdGFuY2UgPSBkb210b29sc0luc3RhbmNlQXJnOwogICAgdGhpcy5hdHRhY2hOYXRpdmVTY3JvbGxMaXN0ZW5lcigpOwogIH0KICBzd2VldFNjcm9sbGVyID0gbmV3IGltcG9ydF9zd2VldF9zY3JvbGwuZGVmYXVsdCh7fSk7CiAgLyoqCiAgICogU2Nyb2xscyB0byBhIGdpdmVuIGVsZW1lbnQgd2l0aCBvcHRpb25zLgogICAqLwogIGFzeW5jIHRvRWxlbWVudChlbGVtZW50QXJnLCBvcHRpb25zQXJnKSB7CiAgICB0aGlzLnN3ZWV0U2Nyb2xsZXIudG9FbGVtZW50KGVsZW1lbnRBcmcsIG9wdGlvbnNBcmcpOwogICAgYXdhaXQgZGlzdF90c19leHBvcnRzMy5kZWxheUZvcihvcHRpb25zQXJnLmR1cmF0aW9uKTsKICB9CiAgLyoqCiAgICogRGV0ZWN0cyB3aGV0aGVyIG5hdGl2ZSBzbW9vdGggc2Nyb2xsaW5nIGlzIGVuYWJsZWQuCiAgICovCiAgYXN5bmMgZGV0ZWN0TmF0aXZlU21vb3RoU2Nyb2xsKCkgewogICAgY29uc3QgZG9uZSA9IGRpc3RfdHNfZXhwb3J0cy5kZWZlcigpOwogICAgY29uc3Qgc2FtcGxlU2l6ZSA9IDEwMDsKICAgIGNvbnN0IGFjY2VwdGFibGVEZWx0YURpZmZlcmVuY2UgPSAzOwogICAgY29uc3QgbWluaW11bVNtb290aFJhdGlvID0gMC43NTsKICAgIGNvbnN0IGV2ZW50RGVsdGFzID0gW107CiAgICBmdW5jdGlvbiBvbldoZWVsKGV2ZW50KSB7CiAgICAgIGV2ZW50RGVsdGFzLnB1c2goZXZlbnQuZGVsdGFZKTsKICAgICAgaWYgKGV2ZW50RGVsdGFzLmxlbmd0aCA+PSBzYW1wbGVTaXplKSB7CiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIndoZWVsIiwgb25XaGVlbCk7CiAgICAgICAgYW5hbHl6ZUV2ZW50cygpOwogICAgICB9CiAgICB9CiAgICBfX25hbWUob25XaGVlbCwgIm9uV2hlZWwiKTsKICAgIGZ1bmN0aW9uIGFuYWx5emVFdmVudHMoKSB7CiAgICAgIGNvbnN0IHRvdGFsRGlmZnMgPSBldmVudERlbHRhcy5sZW5ndGggLSAxOwogICAgICBsZXQgc21hbGxEaWZmQ291bnQgPSAwOwogICAgICBmb3IgKGxldCBpMTAgPSAwOyBpMTAgPCB0b3RhbERpZmZzOyBpMTArKykgewogICAgICAgIGNvbnN0IGRpZmYgPSBNYXRoLmFicyhldmVudERlbHRhc1tpMTAgKyAxXSAtIGV2ZW50RGVsdGFzW2kxMF0pOwogICAgICAgIGlmIChkaWZmIDw9IGFjY2VwdGFibGVEZWx0YURpZmZlcmVuY2UpIHsKICAgICAgICAgIHNtYWxsRGlmZkNvdW50Kys7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IHNtb290aFJhdGlvID0gc21hbGxEaWZmQ291bnQgLyB0b3RhbERpZmZzOwogICAgICBpZiAoc21vb3RoUmF0aW8gPj0gbWluaW11bVNtb290aFJhdGlvKSB7CiAgICAgICAgY29uc29sZS5sb2coIlNtb290aCBzY3JvbGxpbmcgZGV0ZWN0ZWQuIik7CiAgICAgICAgZG9uZS5yZXNvbHZlKHRydWUpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnNvbGUubG9nKCJTbW9vdGggc2Nyb2xsaW5nIE5PVCBkZXRlY3RlZC4iKTsKICAgICAgICBkb25lLnJlc29sdmUoZmFsc2UpOwogICAgICB9CiAgICB9CiAgICBfX25hbWUoYW5hbHl6ZUV2ZW50cywgImFuYWx5emVFdmVudHMiKTsKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ3aGVlbCIsIG9uV2hlZWwpOwogICAgcmV0dXJuIGRvbmUucHJvbWlzZTsKICB9CiAgLyoqCiAgICogRW5hYmxlcyBMZW5pcyBzY3JvbGxpbmcuCiAgICogSWYgb3B0aW9uc0FyZy5kaXNhYmxlT25OYXRpdmVTbW9vdGhTY3JvbGwgaXMgdHJ1ZSBhbmQgbmF0aXZlIHNtb290aCBzY3JvbGxpbmcgaXMgZGV0ZWN0ZWQsCiAgICogTGVuaXMgd2lsbCBiZSBkZXN0cm95ZWQgaW1tZWRpYXRlbHkuCiAgICovCiAgYXN5bmMgZW5hYmxlTGVuaXNTY3JvbGwob3B0aW9uc0FyZykgewogICAgY29uc3QgbGVuaXMgPSBuZXcgTGVuaXMoewogICAgICBhdXRvUmFmOiB0cnVlCiAgICB9KTsKICAgIGlmIChvcHRpb25zQXJnPy5kaXNhYmxlT25OYXRpdmVTbW9vdGhTY3JvbGwpIHsKICAgICAgaWYgKGF3YWl0IHRoaXMuZGV0ZWN0TmF0aXZlU21vb3RoU2Nyb2xsKCkpIHsKICAgICAgICBsZW5pcy5kZXN0cm95KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgICB0aGlzLmxlbmlzSW5zdGFuY2UgPSBsZW5pczsKICAgIHRoaXMuZGV0YWNoTmF0aXZlU2Nyb2xsTGlzdGVuZXIoKTsKICAgIHRoaXMuYXR0YWNoTGVuaXNTY3JvbGxMaXN0ZW5lcigpOwogICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gbGVuaXMuZGVzdHJveS5iaW5kKGxlbmlzKTsKICAgIGxlbmlzLmRlc3Ryb3kgPSAoKSA9PiB7CiAgICAgIG9yaWdpbmFsRGVzdHJveSgpOwogICAgICB0aGlzLmRldGFjaExlbmlzU2Nyb2xsTGlzdGVuZXIoKTsKICAgICAgdGhpcy5hdHRhY2hOYXRpdmVTY3JvbGxMaXN0ZW5lcigpOwogICAgICB0aGlzLmxlbmlzSW5zdGFuY2UgPSBudWxsOwogICAgfTsKICB9CiAgLyoqCiAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdG8gYmUgZXhlY3V0ZWQgb24gc2Nyb2xsLgogICAqIEBwYXJhbSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgb24gZWFjaCBzY3JvbGwgZXZlbnQuCiAgICovCiAgb25TY3JvbGwoY2FsbGJhY2spIHsKICAgIHRoaXMuc2Nyb2xsQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spOwogIH0KICAvKioKICAgKiBFeGVjdXRlcyBhbGwgcmVnaXN0ZXJlZCBzY3JvbGwgY2FsbGJhY2tzIGNvbmN1cnJlbnRseS4KICAgKi8KICBleGVjdXRlU2Nyb2xsQ2FsbGJhY2tzKCkgewogICAgdGhpcy5zY3JvbGxDYWxsYmFja3MuZm9yRWFjaCgoY2FsbGJhY2spID0+IHsKICAgICAgdHJ5IHsKICAgICAgICBjYWxsYmFjaygpOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIkVycm9yIGluIHNjcm9sbCBjYWxsYmFjazoiLCBlcnJvcik7CiAgICAgIH0KICAgIH0pOwogIH0KICAvKioKICAgKiBBdHRhY2hlcyB0aGUgbmF0aXZlIHNjcm9sbCBldmVudCBsaXN0ZW5lci4KICAgKi8KICBhdHRhY2hOYXRpdmVTY3JvbGxMaXN0ZW5lcigpIHsKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLCB0aGlzLmhhbmRsZU5hdGl2ZVNjcm9sbCk7CiAgfQogIC8qKgogICAqIERldGFjaGVzIHRoZSBuYXRpdmUgc2Nyb2xsIGV2ZW50IGxpc3RlbmVyLgogICAqLwogIGRldGFjaE5hdGl2ZVNjcm9sbExpc3RlbmVyKCkgewogICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInNjcm9sbCIsIHRoaXMuaGFuZGxlTmF0aXZlU2Nyb2xsKTsKICB9CiAgLyoqCiAgICogQXR0YWNoZXMgdGhlIExlbmlzIHNjcm9sbCBldmVudCBsaXN0ZW5lci4KICAgKi8KICBhdHRhY2hMZW5pc1Njcm9sbExpc3RlbmVyKCkgewogICAgaWYgKHRoaXMubGVuaXNJbnN0YW5jZSkgewogICAgICB0aGlzLmxlbmlzSW5zdGFuY2Uub24oInNjcm9sbCIsIHRoaXMuaGFuZGxlTGVuaXNTY3JvbGwpOwogICAgfQogIH0KICAvKioKICAgKiBEZXRhY2hlcyB0aGUgTGVuaXMgc2Nyb2xsIGV2ZW50IGxpc3RlbmVyLgogICAqLwogIGRldGFjaExlbmlzU2Nyb2xsTGlzdGVuZXIoKSB7CiAgICBpZiAodGhpcy5sZW5pc0luc3RhbmNlKSB7CiAgICAgIHRoaXMubGVuaXNJbnN0YW5jZS5vZmYoInNjcm9sbCIsIHRoaXMuaGFuZGxlTGVuaXNTY3JvbGwpOwogICAgfQogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWRvbXRvb2xzQDIuNS4xL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWRvbXRvb2xzL2Rpc3RfdHMvZG9tdG9vbHMuY2xhc3Nlcy50aGVtZW1hbmFnZXIuanMKdmFyIFRoZW1lTWFuYWdlciA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJUaGVtZU1hbmFnZXIiKTsKICB9CiAgZG9tdG9vbHNSZWY7CiAgZ29CcmlnaHRCb29sZWFuID0gZmFsc2U7CiAgcHJlZmVycmVkQ29sb3JTY2hlbWVNZWRpYU1hdGNoID0gd2luZG93Lm1hdGNoTWVkaWEoIihwcmVmZXJzLWNvbG9yLXNjaGVtZTogbGlnaHQpIik7CiAgdGhlbWVPYnNlcnZhYmxlID0gbmV3IGRpc3RfdHNfZXhwb3J0czIucnhqcy5SZXBsYXlTdWJqZWN0KDEpOwogIGNvbnN0cnVjdG9yKGRvbXRvb2xzUmVmQXJnKSB7CiAgICB0aGlzLmRvbXRvb2xzUmVmID0gZG9tdG9vbHNSZWZBcmc7CiAgICB0aGlzLmdvQnJpZ2h0Qm9vbGVhbiA9IHRoaXMucHJlZmVycmVkQ29sb3JTY2hlbWVNZWRpYU1hdGNoLm1hdGNoZXM7CiAgICB0aGlzLnByZWZlcnJlZENvbG9yU2NoZW1lTWVkaWFNYXRjaC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCAoZXZlbnRBcmcpID0+IHsKICAgICAgdGhpcy5nb0JyaWdodEJvb2xlYW4gPSBldmVudEFyZy5tYXRjaGVzOwogICAgICB0aGlzLnVwZGF0ZUFsbENvbm5lY3RlZEVsZW1lbnRzKCk7CiAgICB9KTsKICAgIHRoaXMudXBkYXRlQWxsQ29ubmVjdGVkRWxlbWVudHMoKTsKICB9CiAgYXN5bmMgZW5hYmxlQXV0b21hdGljR2xvYmFsVGhlbWVDaGFuZ2UoKSB7CiAgICBpZiAoZG9jdW1lbnQuYm9keSAmJiBkb2N1bWVudC5ib2R5LnN0eWxlKSB7CiAgICAgIHRoaXMudGhlbWVPYnNlcnZhYmxlLnN1YnNjcmliZSh7CiAgICAgICAgbmV4dDogLyogQF9fUFVSRV9fICovIF9fbmFtZSgoZ29CcmlnaHQpID0+IHsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuYmFja2dyb3VuZCA9IGdvQnJpZ2h0ID8gIiNmZmYiIDogIiMwMDAiOwogICAgICAgIH0sICJuZXh0IikKICAgICAgfSk7CiAgICB9CiAgfQogIGFzeW5jIHVwZGF0ZUFsbENvbm5lY3RlZEVsZW1lbnRzKCkgewogICAgdGhpcy50aGVtZU9ic2VydmFibGUubmV4dCh0aGlzLmdvQnJpZ2h0Qm9vbGVhbik7CiAgfQogIC8qKgogICAqIHNldCB0aGUgdGhlbWUgb2YgdGhlIHdlYnNpdGUgdG8gYnJpZ2h0CiAgICovCiAgZ29CcmlnaHQoKSB7CiAgICB0aGlzLmdvQnJpZ2h0Qm9vbGVhbiA9IHRydWU7CiAgICB0aGlzLnVwZGF0ZUFsbENvbm5lY3RlZEVsZW1lbnRzKCk7CiAgfQogIC8qKgogICAqIHNldCB0aGUgdGhlbWUgb2YgdGhlIHdlYnNpdGUgdG8gZGFyawogICAqLwogIGdvRGFyaygpIHsKICAgIHRoaXMuZ29CcmlnaHRCb29sZWFuID0gZmFsc2U7CiAgICB0aGlzLnVwZGF0ZUFsbENvbm5lY3RlZEVsZW1lbnRzKCk7CiAgfQogIC8qKgogICAqIHNpbXBseSB0b2dnbGUgYmV0d2VlbiBicmlnaHQgYW5kIGRhcmsKICAgKi8KICB0b2dnbGVEYXJrQnJpZ2h0KCkgewogICAgdGhpcy5nb0JyaWdodEJvb2xlYW4gPSAhdGhpcy5nb0JyaWdodEJvb2xlYW47CiAgICB0aGlzLnVwZGF0ZUFsbENvbm5lY3RlZEVsZW1lbnRzKCk7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZG9tdG9vbHNAMi41LjEvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZG9tdG9vbHMvZGlzdF90cy9kb210b29scy5jbGFzc2VzLmtleWJvYXJkLmpzCnZhciBLZXk7CihmdW5jdGlvbihLZXkyKSB7CiAgS2V5MltLZXkyWyJCYWNrc3BhY2UiXSA9IDhdID0gIkJhY2tzcGFjZSI7CiAgS2V5MltLZXkyWyJUYWIiXSA9IDldID0gIlRhYiI7CiAgS2V5MltLZXkyWyJFbnRlciJdID0gMTNdID0gIkVudGVyIjsKICBLZXkyW0tleTJbIlNoaWZ0Il0gPSAxNl0gPSAiU2hpZnQiOwogIEtleTJbS2V5MlsiQ3RybCJdID0gMTddID0gIkN0cmwiOwogIEtleTJbS2V5MlsiQWx0Il0gPSAxOF0gPSAiQWx0IjsKICBLZXkyW0tleTJbIlBhdXNlQnJlYWsiXSA9IDE5XSA9ICJQYXVzZUJyZWFrIjsKICBLZXkyW0tleTJbIkNhcHNMb2NrIl0gPSAyMF0gPSAiQ2Fwc0xvY2siOwogIEtleTJbS2V5MlsiRXNjYXBlIl0gPSAyN10gPSAiRXNjYXBlIjsKICBLZXkyW0tleTJbIlNwYWNlIl0gPSAzMl0gPSAiU3BhY2UiOwogIEtleTJbS2V5MlsiUGFnZVVwIl0gPSAzM10gPSAiUGFnZVVwIjsKICBLZXkyW0tleTJbIlBhZ2VEb3duIl0gPSAzNF0gPSAiUGFnZURvd24iOwogIEtleTJbS2V5MlsiRW5kIl0gPSAzNV0gPSAiRW5kIjsKICBLZXkyW0tleTJbIkhvbWUiXSA9IDM2XSA9ICJIb21lIjsKICBLZXkyW0tleTJbIkxlZnRBcnJvdyJdID0gMzddID0gIkxlZnRBcnJvdyI7CiAgS2V5MltLZXkyWyJVcEFycm93Il0gPSAzOF0gPSAiVXBBcnJvdyI7CiAgS2V5MltLZXkyWyJSaWdodEFycm93Il0gPSAzOV0gPSAiUmlnaHRBcnJvdyI7CiAgS2V5MltLZXkyWyJEb3duQXJyb3ciXSA9IDQwXSA9ICJEb3duQXJyb3ciOwogIEtleTJbS2V5MlsiSW5zZXJ0Il0gPSA0NV0gPSAiSW5zZXJ0IjsKICBLZXkyW0tleTJbIkRlbGV0ZSJdID0gNDZdID0gIkRlbGV0ZSI7CiAgS2V5MltLZXkyWyJaZXJvIl0gPSA0OF0gPSAiWmVybyI7CiAgS2V5MltLZXkyWyJDbG9zZWRQYXJlbiJdID0gNDhdID0gIkNsb3NlZFBhcmVuIjsKICBLZXkyW0tleTJbIk9uZSJdID0gNDldID0gIk9uZSI7CiAgS2V5MltLZXkyWyJFeGNsYW1hdGlvbk1hcmsiXSA9IDQ5XSA9ICJFeGNsYW1hdGlvbk1hcmsiOwogIEtleTJbS2V5MlsiVHdvIl0gPSA1MF0gPSAiVHdvIjsKICBLZXkyW0tleTJbIkF0U2lnbiJdID0gNTBdID0gIkF0U2lnbiI7CiAgS2V5MltLZXkyWyJUaHJlZSJdID0gNTFdID0gIlRocmVlIjsKICBLZXkyW0tleTJbIlBvdW5kU2lnbiJdID0gNTFdID0gIlBvdW5kU2lnbiI7CiAgS2V5MltLZXkyWyJIYXNoIl0gPSA1MV0gPSAiSGFzaCI7CiAgS2V5MltLZXkyWyJGb3VyIl0gPSA1Ml0gPSAiRm91ciI7CiAgS2V5MltLZXkyWyJEb2xsYXJTaWduIl0gPSA1Ml0gPSAiRG9sbGFyU2lnbiI7CiAgS2V5MltLZXkyWyJGaXZlIl0gPSA1M10gPSAiRml2ZSI7CiAgS2V5MltLZXkyWyJQZXJjZW50U2lnbiJdID0gNTNdID0gIlBlcmNlbnRTaWduIjsKICBLZXkyW0tleTJbIlNpeCJdID0gNTRdID0gIlNpeCI7CiAgS2V5MltLZXkyWyJDYXJldCJdID0gNTRdID0gIkNhcmV0IjsKICBLZXkyW0tleTJbIkhhdCJdID0gNTRdID0gIkhhdCI7CiAgS2V5MltLZXkyWyJTZXZlbiJdID0gNTVdID0gIlNldmVuIjsKICBLZXkyW0tleTJbIkFtcGVyc2FuZCJdID0gNTVdID0gIkFtcGVyc2FuZCI7CiAgS2V5MltLZXkyWyJFaWdodCJdID0gNTZdID0gIkVpZ2h0IjsKICBLZXkyW0tleTJbIlN0YXIiXSA9IDU2XSA9ICJTdGFyIjsKICBLZXkyW0tleTJbIkFzdGVyaWsiXSA9IDU2XSA9ICJBc3RlcmlrIjsKICBLZXkyW0tleTJbIk5pbmUiXSA9IDU3XSA9ICJOaW5lIjsKICBLZXkyW0tleTJbIk9wZW5QYXJlbiJdID0gNTddID0gIk9wZW5QYXJlbiI7CiAgS2V5MltLZXkyWyJBIl0gPSA2NV0gPSAiQSI7CiAgS2V5MltLZXkyWyJCIl0gPSA2Nl0gPSAiQiI7CiAgS2V5MltLZXkyWyJDIl0gPSA2N10gPSAiQyI7CiAgS2V5MltLZXkyWyJEIl0gPSA2OF0gPSAiRCI7CiAgS2V5MltLZXkyWyJFIl0gPSA2OV0gPSAiRSI7CiAgS2V5MltLZXkyWyJGIl0gPSA3MF0gPSAiRiI7CiAgS2V5MltLZXkyWyJHIl0gPSA3MV0gPSAiRyI7CiAgS2V5MltLZXkyWyJIIl0gPSA3Ml0gPSAiSCI7CiAgS2V5MltLZXkyWyJJIl0gPSA3M10gPSAiSSI7CiAgS2V5MltLZXkyWyJKIl0gPSA3NF0gPSAiSiI7CiAgS2V5MltLZXkyWyJLIl0gPSA3NV0gPSAiSyI7CiAgS2V5MltLZXkyWyJMIl0gPSA3Nl0gPSAiTCI7CiAgS2V5MltLZXkyWyJNIl0gPSA3N10gPSAiTSI7CiAgS2V5MltLZXkyWyJOIl0gPSA3OF0gPSAiTiI7CiAgS2V5MltLZXkyWyJPIl0gPSA3OV0gPSAiTyI7CiAgS2V5MltLZXkyWyJQIl0gPSA4MF0gPSAiUCI7CiAgS2V5MltLZXkyWyJRIl0gPSA4MV0gPSAiUSI7CiAgS2V5MltLZXkyWyJSIl0gPSA4Ml0gPSAiUiI7CiAgS2V5MltLZXkyWyJTIl0gPSA4M10gPSAiUyI7CiAgS2V5MltLZXkyWyJUIl0gPSA4NF0gPSAiVCI7CiAgS2V5MltLZXkyWyJVIl0gPSA4NV0gPSAiVSI7CiAgS2V5MltLZXkyWyJWIl0gPSA4Nl0gPSAiViI7CiAgS2V5MltLZXkyWyJXIl0gPSA4N10gPSAiVyI7CiAgS2V5MltLZXkyWyJYIl0gPSA4OF0gPSAiWCI7CiAgS2V5MltLZXkyWyJZIl0gPSA4OV0gPSAiWSI7CiAgS2V5MltLZXkyWyJaIl0gPSA5MF0gPSAiWiI7CiAgS2V5MltLZXkyWyJMZWZ0V2luZG93S2V5Il0gPSA5MV0gPSAiTGVmdFdpbmRvd0tleSI7CiAgS2V5MltLZXkyWyJSaWdodFdpbmRvd0tleSJdID0gOTJdID0gIlJpZ2h0V2luZG93S2V5IjsKICBLZXkyW0tleTJbIlNlbGVjdEtleSJdID0gOTNdID0gIlNlbGVjdEtleSI7CiAgS2V5MltLZXkyWyJOdW1wYWQwIl0gPSA5Nl0gPSAiTnVtcGFkMCI7CiAgS2V5MltLZXkyWyJOdW1wYWQxIl0gPSA5N10gPSAiTnVtcGFkMSI7CiAgS2V5MltLZXkyWyJOdW1wYWQyIl0gPSA5OF0gPSAiTnVtcGFkMiI7CiAgS2V5MltLZXkyWyJOdW1wYWQzIl0gPSA5OV0gPSAiTnVtcGFkMyI7CiAgS2V5MltLZXkyWyJOdW1wYWQ0Il0gPSAxMDBdID0gIk51bXBhZDQiOwogIEtleTJbS2V5MlsiTnVtcGFkNSJdID0gMTAxXSA9ICJOdW1wYWQ1IjsKICBLZXkyW0tleTJbIk51bXBhZDYiXSA9IDEwMl0gPSAiTnVtcGFkNiI7CiAgS2V5MltLZXkyWyJOdW1wYWQ3Il0gPSAxMDNdID0gIk51bXBhZDciOwogIEtleTJbS2V5MlsiTnVtcGFkOCJdID0gMTA0XSA9ICJOdW1wYWQ4IjsKICBLZXkyW0tleTJbIk51bXBhZDkiXSA9IDEwNV0gPSAiTnVtcGFkOSI7CiAgS2V5MltLZXkyWyJNdWx0aXBseSJdID0gMTA2XSA9ICJNdWx0aXBseSI7CiAgS2V5MltLZXkyWyJBZGQiXSA9IDEwN10gPSAiQWRkIjsKICBLZXkyW0tleTJbIlN1YnRyYWN0Il0gPSAxMDldID0gIlN1YnRyYWN0IjsKICBLZXkyW0tleTJbIkRlY2ltYWxQb2ludCJdID0gMTEwXSA9ICJEZWNpbWFsUG9pbnQiOwogIEtleTJbS2V5MlsiRGl2aWRlIl0gPSAxMTFdID0gIkRpdmlkZSI7CiAgS2V5MltLZXkyWyJGMSJdID0gMTEyXSA9ICJGMSI7CiAgS2V5MltLZXkyWyJGMiJdID0gMTEzXSA9ICJGMiI7CiAgS2V5MltLZXkyWyJGMyJdID0gMTE0XSA9ICJGMyI7CiAgS2V5MltLZXkyWyJGNCJdID0gMTE1XSA9ICJGNCI7CiAgS2V5MltLZXkyWyJGNSJdID0gMTE2XSA9ICJGNSI7CiAgS2V5MltLZXkyWyJGNiJdID0gMTE3XSA9ICJGNiI7CiAgS2V5MltLZXkyWyJGNyJdID0gMTE4XSA9ICJGNyI7CiAgS2V5MltLZXkyWyJGOCJdID0gMTE5XSA9ICJGOCI7CiAgS2V5MltLZXkyWyJGOSJdID0gMTIwXSA9ICJGOSI7CiAgS2V5MltLZXkyWyJGMTAiXSA9IDEyMV0gPSAiRjEwIjsKICBLZXkyW0tleTJbIkYxMSJdID0gMTIyXSA9ICJGMTEiOwogIEtleTJbS2V5MlsiRjEyIl0gPSAxMjNdID0gIkYxMiI7CiAgS2V5MltLZXkyWyJOdW1Mb2NrIl0gPSAxNDRdID0gIk51bUxvY2siOwogIEtleTJbS2V5MlsiU2Nyb2xsTG9jayJdID0gMTQ1XSA9ICJTY3JvbGxMb2NrIjsKICBLZXkyW0tleTJbIlNlbWlDb2xvbiJdID0gMTg2XSA9ICJTZW1pQ29sb24iOwogIEtleTJbS2V5MlsiRXF1YWxzIl0gPSAxODddID0gIkVxdWFscyI7CiAgS2V5MltLZXkyWyJDb21tYSJdID0gMTg4XSA9ICJDb21tYSI7CiAgS2V5MltLZXkyWyJEYXNoIl0gPSAxODldID0gIkRhc2giOwogIEtleTJbS2V5MlsiUGVyaW9kIl0gPSAxOTBdID0gIlBlcmlvZCI7CiAgS2V5MltLZXkyWyJVbmRlclNjb3JlIl0gPSAxODldID0gIlVuZGVyU2NvcmUiOwogIEtleTJbS2V5MlsiUGx1c1NpZ24iXSA9IDE4N10gPSAiUGx1c1NpZ24iOwogIEtleTJbS2V5MlsiRm9yd2FyZFNsYXNoIl0gPSAxOTFdID0gIkZvcndhcmRTbGFzaCI7CiAgS2V5MltLZXkyWyJUaWxkZSJdID0gMTkyXSA9ICJUaWxkZSI7CiAgS2V5MltLZXkyWyJHcmF2ZUFjY2VudCJdID0gMTkyXSA9ICJHcmF2ZUFjY2VudCI7CiAgS2V5MltLZXkyWyJPcGVuQnJhY2tldCJdID0gMjE5XSA9ICJPcGVuQnJhY2tldCI7CiAgS2V5MltLZXkyWyJDbG9zZWRCcmFja2V0Il0gPSAyMjFdID0gIkNsb3NlZEJyYWNrZXQiOwogIEtleTJbS2V5MlsiUXVvdGUiXSA9IDIyMl0gPSAiUXVvdGUiOwp9KShLZXkgfHwgKEtleSA9IHt9KSk7CnZhciBLZXlib2FyZCA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJLZXlib2FyZCIpOwogIH0KICBkb21Ob2RlOwogIG1hcENvbWJvc1RvSGFuZGxlcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogIHByZXNzZWRLZXlzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTsKICBjb25zdHJ1Y3Rvcihkb21Ob2RlKSB7CiAgICB0aGlzLmRvbU5vZGUgPSBkb21Ob2RlOwogICAgdGhpcy5zdGFydExpc3RlbmluZygpOwogIH0KICBrZXlFbnVtID0gS2V5OwogIG9uKGtleXMyKSB7CiAgICBjb25zdCBzdWJqZWN0ID0gbmV3IGRpc3RfdHNfZXhwb3J0czIucnhqcy5TdWJqZWN0KCk7CiAgICB0aGlzLnJlZ2lzdGVyS2V5cyhrZXlzMiwgc3ViamVjdCk7CiAgICByZXR1cm4gc3ViamVjdDsKICB9CiAgdHJpZ2dlcktleVByZXNzKGtleXNBcmcpIHsKICAgIGZvciAoY29uc3Qga2V5MiBvZiBrZXlzQXJnKSB7CiAgICAgIHRoaXMucHJlc3NlZEtleXMuYWRkKGtleTIpOwogICAgfQogICAgdGhpcy5jaGVja01hdGNoaW5nS2V5Ym9hcmRTdWJqZWN0cygpOwogICAgZm9yIChjb25zdCBrZXkyIG9mIGtleXNBcmcpIHsKICAgICAgdGhpcy5wcmVzc2VkS2V5cy5kZWxldGUoa2V5Mik7CiAgICB9CiAgfQogIHN0YXJ0TGlzdGVuaW5nKCkgewogICAgdGhpcy5kb21Ob2RlLmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCB0aGlzLmhhbmRsZUtleURvd24pOwogICAgdGhpcy5kb21Ob2RlLmFkZEV2ZW50TGlzdGVuZXIoImtleXVwIiwgdGhpcy5oYW5kbGVLZXlVcCk7CiAgfQogIHN0b3BMaXN0ZW5pbmcoKSB7CiAgICB0aGlzLmRvbU5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIHRoaXMuaGFuZGxlS2V5RG93bik7CiAgICB0aGlzLmRvbU5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5dXAiLCB0aGlzLmhhbmRsZUtleVVwKTsKICB9CiAgY2xlYXIoKSB7CiAgICB0aGlzLnN0b3BMaXN0ZW5pbmcoKTsKICAgIHRoaXMubWFwQ29tYm9zVG9IYW5kbGVycy5jbGVhcigpOwogICAgdGhpcy5wcmVzc2VkS2V5cy5jbGVhcigpOwogIH0KICBoYW5kbGVLZXlEb3duID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoZXZlbnQpID0+IHsKICAgIHRoaXMucHJlc3NlZEtleXMuYWRkKGV2ZW50LmtleUNvZGUpOwogICAgdGhpcy5jaGVja01hdGNoaW5nS2V5Ym9hcmRTdWJqZWN0cyhldmVudCk7CiAgfSwgImhhbmRsZUtleURvd24iKTsKICBjaGVja01hdGNoaW5nS2V5Ym9hcmRTdWJqZWN0cyhwYXlsb2FkQXJnKSB7CiAgICB0aGlzLm1hcENvbWJvc1RvSGFuZGxlcnMuZm9yRWFjaCgoc3ViamVjdEFyZywga2V5c0FyZykgPT4gewogICAgICBpZiAodGhpcy5hcmVBbGxLZXlzUHJlc3NlZChrZXlzQXJnKSkgewogICAgICAgIHN1YmplY3RBcmcubmV4dChwYXlsb2FkQXJnKTsKICAgICAgfQogICAgfSk7CiAgfQogIGhhbmRsZUtleVVwID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoZXZlbnQpID0+IHsKICAgIHRoaXMucHJlc3NlZEtleXMuZGVsZXRlKGV2ZW50LmtleUNvZGUpOwogIH0sICJoYW5kbGVLZXlVcCIpOwogIGFyZUFsbEtleXNQcmVzc2VkKGtleXNBcmcpIHsKICAgIGxldCByZXN1bHQgPSB0cnVlOwogICAga2V5c0FyZy5mb3JFYWNoKChrZXkyKSA9PiB7CiAgICAgIGlmICghdGhpcy5wcmVzc2VkS2V5cy5oYXMoa2V5MikpIHsKICAgICAgICByZXN1bHQgPSBmYWxzZTsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KICByZWdpc3RlcktleXMoa2V5c0FyZywgc3ViamVjdEFyZykgewogICAgaWYgKCF0aGlzLm1hcENvbWJvc1RvSGFuZGxlcnMuaGFzKGtleXNBcmcpKSB7CiAgICAgIHRoaXMubWFwQ29tYm9zVG9IYW5kbGVycy5zZXQoa2V5c0FyZywgc3ViamVjdEFyZyk7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBzdWJqZWN0ID0gdGhpcy5tYXBDb21ib3NUb0hhbmRsZXJzLmdldChrZXlzQXJnKTsKICAgICAgcmV0dXJuIHN1YmplY3Q7CiAgICB9CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZG9tdG9vbHNAMi41LjEvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZG9tdG9vbHMvZGlzdF90cy9kb210b29scy5jbGFzc2VzLmRvbXRvb2xzLmpzCnZhciBEb21Ub29scyA9IGNsYXNzIF9Eb21Ub29scyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiRG9tVG9vbHMiKTsKICB9CiAgLy8gPT09PT09CiAgLy8gU1RBVElDCiAgLy8gPT09PT09CiAgc3RhdGljIGluaXRpYWxpemF0aW9uUHJvbWlzZSA9IG51bGw7CiAgLyoqCiAgICogc2V0dXBzIGRvbXRvb2xzCiAgICovCiAgc3RhdGljIGFzeW5jIHNldHVwRG9tVG9vbHMob3B0aW9uc0FyZyA9IHt9KSB7CiAgICBpZiAoIW9wdGlvbnNBcmcuaWdub3JlR2xvYmFsICYmIF9Eb21Ub29scy5pbml0aWFsaXphdGlvblByb21pc2UpIHsKICAgICAgcmV0dXJuIGF3YWl0IF9Eb21Ub29scy5pbml0aWFsaXphdGlvblByb21pc2U7CiAgICB9CiAgICBpZiAoIW9wdGlvbnNBcmcuaWdub3JlR2xvYmFsKSB7CiAgICAgIF9Eb21Ub29scy5pbml0aWFsaXphdGlvblByb21pc2UgPSAoYXN5bmMgKCkgPT4gewogICAgICAgIGxldCBkb21Ub29sc0luc3RhbmNlOwogICAgICAgIGlmICghZ2xvYmFsVGhpcy5kZWVzRG9tVG9vbHMpIHsKICAgICAgICAgIGdsb2JhbFRoaXMuZGVlc0RvbVRvb2xzID0gbmV3IF9Eb21Ub29scyhvcHRpb25zQXJnKTsKICAgICAgICAgIGRvbVRvb2xzSW5zdGFuY2UgPSBnbG9iYWxUaGlzLmRlZXNEb21Ub29sczsKICAgICAgICAgIGNvbnN0IHJlYWR5U3RhdGVDaGFuZ2VkRnVuYyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKCkgPT4gewogICAgICAgICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImludGVyYWN0aXZlIiB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiKSB7CiAgICAgICAgICAgICAgZG9tVG9vbHNJbnN0YW5jZS5lbGVtZW50cy5oZWFkRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImhlYWQiKTsKICAgICAgICAgICAgICBkb21Ub29sc0luc3RhbmNlLmVsZW1lbnRzLmJvZHlFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiYm9keSIpOwogICAgICAgICAgICAgIGRvbVRvb2xzSW5zdGFuY2Uua2V5Ym9hcmQgPSBuZXcgS2V5Ym9hcmQoZG9jdW1lbnQuYm9keSk7CiAgICAgICAgICAgICAgZG9tVG9vbHNJbnN0YW5jZS5kb21SZWFkeS5yZXNvbHZlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sICJyZWFkeVN0YXRlQ2hhbmdlZEZ1bmMiKTsKICAgICAgICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiaW50ZXJhY3RpdmUiIHx8IGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJjb21wbGV0ZSIpIHsKICAgICAgICAgICAgcmVhZHlTdGF0ZUNoYW5nZWRGdW5jKCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJyZWFkeXN0YXRlY2hhbmdlIiwgcmVhZHlTdGF0ZUNoYW5nZWRGdW5jKTsKICAgICAgICAgIH0KICAgICAgICAgIGRvbVRvb2xzSW5zdGFuY2UuZG9tVG9vbHNSZWFkeS5yZXNvbHZlKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGRvbVRvb2xzSW5zdGFuY2UgPSBnbG9iYWxUaGlzLmRlZXNEb21Ub29sczsKICAgICAgICB9CiAgICAgICAgYXdhaXQgZG9tVG9vbHNJbnN0YW5jZS5kb21Ub29sc1JlYWR5LnByb21pc2U7CiAgICAgICAgcmV0dXJuIGRvbVRvb2xzSW5zdGFuY2U7CiAgICAgIH0pKCk7CiAgICAgIHJldHVybiBhd2FpdCBfRG9tVG9vbHMuaW5pdGlhbGl6YXRpb25Qcm9taXNlOwogICAgfSBlbHNlIHsKICAgICAgY29uc3QgZG9tVG9vbHNJbnN0YW5jZSA9IG5ldyBfRG9tVG9vbHMob3B0aW9uc0FyZyk7CiAgICAgIHJldHVybiBkb21Ub29sc0luc3RhbmNlOwogICAgfQogIH0KICAvKioKICAgKiBpZiB5b3UgY2FuLCB1c2UgdGhlIHN0YXRpYyBhc3lzbmMgLnNldHVwRG9tVG9vbHMoKSBmdW5jdGlvbiBpbnN0ZWFkIHNpbmNlIGl0IGlzIHNhZmVyIHRvIHVzZS4KICAgKi8KICBzdGF0aWMgZ2V0R2xvYmFsRG9tVG9vbHNTeW5jKCkgewogICAgY29uc3QgZ2xvYmFsRG9tVG9vbHMgPSBnbG9iYWxUaGlzLmRlZXNEb21Ub29sczsKICAgIGlmICghZ2xvYmFsRG9tVG9vbHMpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJZb3UgdHJpZWQgdG8gYWNjZXNzIGRvbXRvb2xzIHN5bmNocm9ub3VzbHkgdG9vIGVhcmx5Iik7CiAgICB9CiAgICByZXR1cm4gZ2xvYmFsVGhpcy5kZWVzRG9tVG9vbHM7CiAgfQogIC8vID09PT09PT09CiAgLy8gSU5TVEFOQ0UKICAvLyA9PT09PT09PQogIC8vIGVsZW1lbnRzCiAgZWxlbWVudHMgPSB7CiAgICBoZWFkRWxlbWVudDogbnVsbCwKICAgIGJvZHlFbGVtZW50OiBudWxsCiAgfTsKICB3ZWJzZXR1cCA9IG5ldyBXZWJTZXR1cCh7CiAgICBtZXRhT2JqZWN0OiB7CiAgICAgIHRpdGxlOiAiIgogICAgfQogIH0pOwogIHNtYXJ0c3RhdGUgPSBuZXcgZGlzdF90c19leHBvcnRzMjEuU21hcnRzdGF0ZSgpOwogIGRvbVRvb2xzU3RhdGVQYXJ0ID0gdGhpcy5zbWFydHN0YXRlLmdldFN0YXRlUGFydCgiZG9tdG9vbHMiLCB7CiAgICB2aXJ0dWFsVmlld3BvcnQ6ICJuYXRpdmUiLAogICAgand0OiBudWxsCiAgfSk7CiAgcm91dGVyID0gbmV3IGRpc3RfdHNfZXhwb3J0czE4LlNtYXJ0Um91dGVyKHsKICAgIGRlYnVnOiBmYWxzZQogIH0pOwogIGNvbnZlbmllbmNlID0gewogICAgdHlwZWRyZXF1ZXN0OiBkaXN0X3RzX2V4cG9ydHMxNSwKICAgIHNtYXJ0ZGVsYXk6IGRpc3RfdHNfZXhwb3J0czMsCiAgICBzbWFydGpzb246IGRpc3RfdHNfZXhwb3J0czEyLAogICAgc21hcnR1cmw6IGRpc3RfdHNfZXhwb3J0czIyCiAgfTsKICBkZWVzQ29tbXMgPSBuZXcgZGlzdF90c19leHBvcnRzMTYuRGVlc0NvbW1zKCk7CiAgc2Nyb2xsZXIgPSBuZXcgU2Nyb2xsZXIodGhpcyk7CiAgdGhlbWVNYW5hZ2VyID0gbmV3IFRoZW1lTWFuYWdlcih0aGlzKTsKICBrZXlib2FyZCA9IG51bGw7CiAgLy8gSW5pdGlhbGl6ZWQgYWZ0ZXIgRE9NIHJlYWR5IHRvIGF2b2lkIGFjY2Vzc2luZyBkb2N1bWVudC5ib2R5IGJlZm9yZSBpdCBleGlzdHMKICBkb21Ub29sc1JlYWR5ID0gZGlzdF90c19leHBvcnRzLmRlZmVyKCk7CiAgZG9tUmVhZHkgPSBkaXN0X3RzX2V4cG9ydHMuZGVmZXIoKTsKICBnbG9iYWxTdHlsZXNSZWFkeSA9IGRpc3RfdHNfZXhwb3J0cy5kZWZlcigpOwogIGNvbnN0cnVjdG9yKG9wdGlvbnNBcmcpIHsKICB9CiAgcnVuT25jZVRyYWNrZXJTdHJpbmdNYXAgPSBuZXcgbGlrLlN0cmluZ21hcCgpOwogIHJ1bk9uY2VSZXN1bHRNYXAgPSBuZXcgbGlrLkZhc3RNYXAoKTsKICBydW5PbmNlRXJyb3JNYXAgPSBuZXcgbGlrLkZhc3RNYXAoKTsKICAvKioKICAgKiBydW4gYSBmdW5jdGlvbiBvbmNlIGFuZCBhbHdheXMgZ2V0IHRoZSBQcm9taXNlIG9mIHRoZSBmaXJzdCBleGVjdXRpb24KICAgKiBAcGFyYW0gaWRlbnRpZmllckFyZyB0aGUgaW5kZW50aWZpZXIgYXJnIGlkZW50aWZpZXMgZnVuY3Rpb25zLiBmdW5jdGlvbnMgd2l0aCB0aGUgc2FtZSBpZGVudGlmaWVyIGFyZSBjb25zaWRlcmVkIGVxdWFsCiAgICogQHBhcmFtIGZ1bmNBcmcgdGhlIGFjdHVhbCBmdW5jIGFyZyB0byBydW4KICAgKi8KICBhc3luYyBydW5PbmNlKGlkZW50aWZpZXJBcmcsIGZ1bmNBcmcpIHsKICAgIGNvbnN0IHJ1bm5pbmdJZCA9IGAke2lkZW50aWZpZXJBcmd9K3J1bm5pbmdDaGVja2A7CiAgICBpZiAoIXRoaXMucnVuT25jZVRyYWNrZXJTdHJpbmdNYXAuY2hlY2tTdHJpbmcoaWRlbnRpZmllckFyZykpIHsKICAgICAgdGhpcy5ydW5PbmNlVHJhY2tlclN0cmluZ01hcC5hZGRTdHJpbmcoaWRlbnRpZmllckFyZyk7CiAgICAgIHRoaXMucnVuT25jZVRyYWNrZXJTdHJpbmdNYXAuYWRkU3RyaW5nKHJ1bm5pbmdJZCk7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZnVuY0FyZygpOwogICAgICAgIHRoaXMucnVuT25jZVJlc3VsdE1hcC5hZGRUb01hcChpZGVudGlmaWVyQXJnLCByZXN1bHQpOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIHRoaXMucnVuT25jZUVycm9yTWFwLmFkZFRvTWFwKGlkZW50aWZpZXJBcmcsIGVycm9yKTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICB0aGlzLnJ1bk9uY2VUcmFja2VyU3RyaW5nTWFwLnJlbW92ZVN0cmluZyhydW5uaW5nSWQpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gYXdhaXQgdGhpcy5ydW5PbmNlVHJhY2tlclN0cmluZ01hcC5yZWdpc3RlclVudGlsVHJ1ZSgoc3RyaW5nTWFwKSA9PiB7CiAgICAgIHJldHVybiAhc3RyaW5nTWFwLmluY2x1ZGVzKHJ1bm5pbmdJZCk7CiAgICB9LCAoKSA9PiB7CiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5ydW5PbmNlRXJyb3JNYXAuZ2V0QnlLZXkoaWRlbnRpZmllckFyZyk7CiAgICAgIGlmIChlcnJvcikgewogICAgICAgIHRocm93IGVycm9yOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLnJ1bk9uY2VSZXN1bHRNYXAuZ2V0QnlLZXkoaWRlbnRpZmllckFyZyk7CiAgICB9KTsKICB9CiAgLy8gc2V0U3R1ZmYKICAvKioKICAgKiBhbGxvd3MgdG8gc2V0IGdsb2JhbCBzdHlsZXMKICAgKiBAcGFyYW0gc3R5bGVzVGV4dCB0aGUgY3NzIHRleHQgeW91IHdhbnQgdG8gc2V0CiAgICovCiAgYXN5bmMgc2V0R2xvYmFsU3R5bGVzKHN0eWxlc1RleHQpIHsKICAgIGF3YWl0IHRoaXMuZG9tUmVhZHkucHJvbWlzZTsKICAgIGNvbnN0IHN0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7CiAgICBzdHlsZUVsZW1lbnQudHlwZSA9ICJ0ZXh0L2NzcyI7CiAgICBzdHlsZUVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoc3R5bGVzVGV4dCkpOwogICAgdGhpcy5lbGVtZW50cy5oZWFkRWxlbWVudC5hcHBlbmRDaGlsZChzdHlsZUVsZW1lbnQpOwogIH0KICAvKioKICAgKiBhbGxvd3MgdG8gc2V0IGdsb2JhbCBzdHlsZXMKICAgKiBAcGFyYW0gc3R5bGVzVGV4dCB0aGUgY3NzIHRleHQgeW91IHdhbnQgdG8gc2V0CiAgICovCiAgYXN5bmMgc2V0RXh0ZXJuYWxTY3JpcHQoc2NyaXB0TGlua0FyZykgewogICAgYXdhaXQgdGhpcy5kb21SZWFkeS5wcm9taXNlOwogICAgY29uc3QgZG9uZSA9IGRpc3RfdHNfZXhwb3J0cy5kZWZlcigpOwogICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CiAgICBzY3JpcHQuc3JjID0gc2NyaXB0TGlua0FyZzsKICAgIHNjcmlwdC5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgZnVuY3Rpb24oKSB7CiAgICAgIGRvbmUucmVzb2x2ZSgpOwogICAgfSk7CiAgICBjb25zdCBwYXJlbnROb2RlID0gZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5ib2R5OwogICAgcGFyZW50Tm9kZS5hcHBlbmQoc2NyaXB0KTsKICAgIGF3YWl0IGRvbmUucHJvbWlzZTsKICB9CiAgLyoqCiAgICogYWxsb3dzIHNldHRpbmcgZXh0ZXJuYWwgY3NzIGZpbGVzCiAgICogQHBhcmFtIGNzc0xpbmtBcmcgYSB1cmwgdG8gYW4gZXh0ZXJuYWwgc3R5bGVzaGVldAogICAqLwogIGFzeW5jIHNldEV4dGVybmFsQ3NzKGNzc0xpbmtBcmcpIHsKICAgIGNvbnN0IGNzc1RhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpbmsiKTsKICAgIGNzc1RhZy5yZWwgPSAic3R5bGVzaGVldCI7CiAgICBjc3NUYWcuY3Jvc3NPcmlnaW4gPSAiYW5vbnltb3VzIjsKICAgIGNzc1RhZy5ocmVmID0gY3NzTGlua0FyZzsKICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kKGNzc1RhZyk7CiAgfQogIC8qKgogICAqIGFsbG93cyBzZXR0aW5nIG9mIHdlYnNpdGUgaW5mb3MKICAgKiBAcGFyYW0gb3B0aW9uc0FyZyB0aGUgd2Vic2l0ZSBpbmZvCiAgICovCiAgYXN5bmMgc2V0V2Vic2l0ZUluZm8ob3B0aW9uc0FyZykgewogICAgYXdhaXQgdGhpcy53ZWJzZXR1cC5zZXR1cChvcHRpb25zQXJnKTsKICAgIGF3YWl0IHRoaXMud2Vic2V0dXAucmVhZHlQcm9taXNlOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWRvbXRvb2xzQDIuNS4xL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWRvbXRvb2xzL2Rpc3RfdHMvZG9tdG9vbHMuY3NzLmJhc2VzdHlsZXMuanMKdmFyIHNjcm9sbEJhclN0eWxlcyA9ICgoKSA9PiB7CiAgY29uc3QgcmV0dXJuU3R5bGVzT2xkID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNYWMgT1MgWCIpID09PSAtMSA/IGlgYC5jc3NUZXh0IDogYGA7CiAgY29uc3QgcmV0dXJuU3R5bGVzID0gaWAKICAgIC8qIHdpZHRoICovCiAgICA6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgICAgd2lkdGg6IDBweDsKICAgIH0KICAgIGJvZHkgewogICAgICBzY3JvbGxiYXItd2lkdGg6IG5vbmU7CiAgICB9CiAgYC5jc3NUZXh0OwogIHJldHVybiByZXR1cm5TdHlsZXM7Cn0pKCk7CnZhciBnbG9iYWxCYXNlU3R5bGVzID0gaWAKICAvKgogIEBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6ICdNYXRlcmlhbCBJY29ucyc7CiAgICBmb250LXN0eWxlOiBub3JtYWw7CiAgICBmb250LXdlaWdodDogNDAwOwogICAgc3JjOiB1cmwoaHR0cHM6Ly9mb250cy5nc3RhdGljLmNvbS9zL21hdGVyaWFsaWNvbnMvdjQyL2ZsVWhScTZ0elpjbFFFSi1WZGctSXVpYURzTmNJaFE4dFEud29mZjIpCiAgICAgIGZvcm1hdCgnd29mZjInKTsKICB9ICovCgogIC8qIGdsb2JhbCBib2R5IHN0eWxlcyAqLwogIGJvZHkgewogICAgbWFyZ2luOiAwcHg7CiAgICBmb250LWZhbWlseTogJ0dlaXN0IFNhbnMnLCAnSW50ZXInLCBzYW5zLXNlcmlmOwogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICB9CgogIC8qIHNjcm9sbCBiYXIgc3R5bGVzICovCiAgJHtyKHNjcm9sbEJhclN0eWxlcyl9CmAuY3NzVGV4dDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWRvbXRvb2xzQDIuNS4xL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWRvbXRvb2xzL2Rpc3RfdHMvZG9tdG9vbHMuZWxlbWVudGJhc2ljLmpzCnZhciBzdGF0aWNTdHlsZXMgPSBpYAogICogewogICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjFzLCBjb2xvciAwLjFzOwogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICB9CgogIDpob3N0IHsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICBmb250LWZhbWlseTogJ0dlaXN0IFNhbnMnLCAnSW50ZXInLCBzYW5zLXNlcmlmOwogIH0KCiAgJHtyKHNjcm9sbEJhclN0eWxlcyl9CmA7CnZhciBzdHlsZXMgPSBiMmAKICA8c3R5bGU+CiAgICAqIHsKICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjFzLCBjb2xvciAwLjFzOwogICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgfQoKICAgIDpob3N0IHsKICAgICAgZm9udC1mYW1pbHk6ICdHZWlzdCBTYW5zJywgJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgIH0KCiAgICAke3Njcm9sbEJhclN0eWxlc30KICA8L3N0eWxlPgpgOwp2YXIgc2V0dXAgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGFzeW5jIChlbGVtZW50QXJnLCBvcHRpb25zQXJnID0ge30pID0+IHsKICBjb25zdCBkb21Ub29scyA9IGF3YWl0IERvbVRvb2xzLnNldHVwRG9tVG9vbHMob3B0aW9uc0FyZyk7CiAgaWYgKGVsZW1lbnRBcmcpIHsKICB9CiAgZG9tVG9vbHMucnVuT25jZSgiZWxlbWVudEJhc2ljU2V0dXAiLCBhc3luYyAoKSA9PiB7CiAgICBkb21Ub29scy5zZXRHbG9iYWxTdHlsZXMoZ2xvYmFsQmFzZVN0eWxlcyk7CiAgfSk7CiAgcmV0dXJuIGRvbVRvb2xzOwp9LCAic2V0dXAiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWRvbXRvb2xzQDIuNS4xL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWRvbXRvb2xzL2Rpc3RfdHMvZG9tdG9vbHMuY3NzLmpzCnZhciBkb210b29sc19jc3NfZXhwb3J0cyA9IHt9OwpfX2V4cG9ydChkb210b29sc19jc3NfZXhwb3J0cywgewogIGNzc0dyaWRDb2x1bW5zOiAoKSA9PiBjc3NHcmlkQ29sdW1ucwp9KTsKdmFyIGNzc0dyaWRDb2x1bW5zID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoYW1vdW50T2ZDb2x1bW5zQXJnLCBnYXBTaXplQXJnKSA9PiB7CiAgbGV0IHJldHVyblN0cmluZyA9IGBgOwogIGZvciAobGV0IGkxMCA9IDA7IGkxMCA8IGFtb3VudE9mQ29sdW1uc0FyZzsgaTEwKyspIHsKICAgIHJldHVyblN0cmluZyArPSBgIGNhbGMoKDEwMCUvJHthbW91bnRPZkNvbHVtbnNBcmd9KSAtICgke2dhcFNpemVBcmcgKiAoYW1vdW50T2ZDb2x1bW5zQXJnIC0gMSl9cHgvJHthbW91bnRPZkNvbHVtbnNBcmd9KSlgOwogIH0KICByZXR1cm4gcmV0dXJuU3RyaW5nOwp9LCAiY3NzR3JpZENvbHVtbnMiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWRvbXRvb2xzQDIuNS4xL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWRvbXRvb2xzL2Rpc3RfdHMvZG9tdG9vbHMucGx1Z2luZXhwb3J0cy5qcwp2YXIgZG9tdG9vbHNfcGx1Z2luZXhwb3J0c19leHBvcnRzID0ge307Cl9fZXhwb3J0KGRvbXRvb2xzX3BsdWdpbmV4cG9ydHNfZXhwb3J0cywgewogIFN3ZWV0U2Nyb2xsOiAoKSA9PiBpbXBvcnRfc3dlZXRfc2Nyb2xsMi5kZWZhdWx0LAogIHNtYXJ0ZGVsYXk6ICgpID0+IGRpc3RfdHNfZXhwb3J0czMsCiAgc21hcnRtYXJrZG93bjogKCkgPT4gZGlzdF90c19leHBvcnRzMTcsCiAgc21hcnRwcm9taXNlOiAoKSA9PiBkaXN0X3RzX2V4cG9ydHMsCiAgc21hcnRyb3V0ZXI6ICgpID0+IGRpc3RfdHNfZXhwb3J0czE4LAogIHNtYXJ0cng6ICgpID0+IGRpc3RfdHNfZXhwb3J0czIsCiAgc21hcnRzdGF0ZTogKCkgPT4gZGlzdF90c19leHBvcnRzMjEsCiAgc21hcnRzdHJpbmc6ICgpID0+IGRpc3RfdHNfZXhwb3J0czExLAogIHNtYXJ0dXJsOiAoKSA9PiBkaXN0X3RzX2V4cG9ydHMyMiwKICB0eXBlZHJlcXVlc3Q6ICgpID0+IGRpc3RfdHNfZXhwb3J0czE1Cn0pOwp2YXIgaW1wb3J0X3N3ZWV0X3Njcm9sbDIgPSBfX3RvRVNNKHJlcXVpcmVfc3dlZXRfc2Nyb2xsKCksIDEpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZWxlbWVudEAyLjIuMy9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1lbGVtZW50L2Rpc3RfdHMvcGx1Z2lucy5qcwp2YXIgaXNvdW5pcXVlMyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0X3RzKCksIDEpOwp2YXIgbGl0ID0gewogIGNzczogaSwKICB1bnNhZmVDU1M6IHIsCiAgTGl0RWxlbWVudDogaTQsCiAgcHJvcGVydHk6IG41Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1lbGVtZW50QDIuMi4zL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWVsZW1lbnQvZGlzdF90cy9jbGFzc2VzLmNzc21hbmFnZXIuanMKdmFyIENzc01hbmFnZXIgPSBjbGFzcyBfQ3NzTWFuYWdlciB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiQ3NzTWFuYWdlciIpOwogIH0KICAvLyBTVEFUSUMKICBzdGF0aWMgaW5zdGFuY2UgPSBudWxsOwogIC8qKgogICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiBDc3NNYW5hZ2VyCiAgICovCiAgc3RhdGljIGdldFNpbmdsZXRvbigpIHsKICAgIGlmICghX0Nzc01hbmFnZXIuaW5zdGFuY2UpIHsKICAgICAgX0Nzc01hbmFnZXIuaW5zdGFuY2UgPSBuZXcgX0Nzc01hbmFnZXIoKTsKICAgIH0KICAgIHJldHVybiBfQ3NzTWFuYWdlci5pbnN0YW5jZTsKICB9CiAgLy8gSU5TVEFOQ0UKICBkb210b29sc1Byb21pc2UgPSBEb21Ub29scy5zZXR1cERvbVRvb2xzKCk7CiAgZ29CcmlnaHQgPSBmYWxzZTsKICBiZFZhclRyaXBsZXRTdG9yZSA9IFtdOwogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5kb210b29sc1Byb21pc2UudGhlbihhc3luYyAoZG9tdG9vbHNBcmcpID0+IHsKICAgICAgZG9tdG9vbHNBcmcudGhlbWVNYW5hZ2VyLnRoZW1lT2JzZXJ2YWJsZS5zdWJzY3JpYmUoYXN5bmMgKGdvQnJpZ2h0QXJnKSA9PiB7CiAgICAgICAgdGhpcy5nb0JyaWdodCA9IGdvQnJpZ2h0QXJnOwogICAgICAgIGF3YWl0IGRvbXRvb2xzQXJnLmRvbVJlYWR5LnByb21pc2U7CiAgICAgICAgZm9yIChjb25zdCBiZFRyaXBsZXRBcmcgb2YgdGhpcy5iZFZhclRyaXBsZXRTdG9yZSkgewogICAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5zZXRQcm9wZXJ0eShiZFRyaXBsZXRBcmcuY3NzVmFyTmFtZSwgdGhpcy5nb0JyaWdodCA/IGJkVHJpcGxldEFyZy5icmlnaHRWYWx1ZSA6IGJkVHJpcGxldEFyZy5kYXJrVmFsdWUpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9KTsKICB9CiAgZ2V0IGRlZmF1bHRTdHlsZXMoKSB7CiAgICByZXR1cm4gZG9tdG9vbHNfZWxlbWVudGJhc2ljX2V4cG9ydHMuc3RhdGljU3R5bGVzOwogIH0KICBnZXRDb250YWluZXJOYW1lRnJvbUNsYXNzKGVsZW1lbnRDbGFzcykgewogICAgcmV0dXJuIGVsZW1lbnRDbGFzcy5pcyB8fCBlbGVtZW50Q2xhc3MubmFtZS5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAiJDEtJDIiKS50b0xvd2VyQ2FzZSgpOwogIH0KICBjc3NGb3JEZXNrdG9wKGNvbnRlbnRBcmcsIGVsZW1lbnRDbGFzcykgewogICAgaWYgKGVsZW1lbnRDbGFzcykgewogICAgICByZXR1cm4gcihkb210b29sc19jc3NfYnJlYWtwb2ludHNfZXhwb3J0cy5jc3NGb3JDb250YWluZXIoY29udGVudEFyZywgYChtaW4td2lkdGg6ICR7ZG9tdG9vbHNfY3NzX2JyZWFrcG9pbnRzX2V4cG9ydHMuZGVza3RvcH1weClgLCB0aGlzLmdldENvbnRhaW5lck5hbWVGcm9tQ2xhc3MoZWxlbWVudENsYXNzKSkpOwogICAgfQogICAgcmV0dXJuIHIoZG9tdG9vbHNfY3NzX2JyZWFrcG9pbnRzX2V4cG9ydHMuY3NzRm9yRGVza3RvcChjb250ZW50QXJnKSk7CiAgfQogIGNzc0Zvck5vdGVib29rKGNvbnRlbnRBcmcsIGVsZW1lbnRDbGFzcykgewogICAgaWYgKGVsZW1lbnRDbGFzcykgewogICAgICByZXR1cm4gcihkb210b29sc19jc3NfYnJlYWtwb2ludHNfZXhwb3J0cy5jc3NGb3JDb250YWluZXIoY29udGVudEFyZywgYChtYXgtd2lkdGg6ICR7ZG9tdG9vbHNfY3NzX2JyZWFrcG9pbnRzX2V4cG9ydHMubm90ZWJvb2t9cHgpYCwgdGhpcy5nZXRDb250YWluZXJOYW1lRnJvbUNsYXNzKGVsZW1lbnRDbGFzcykpKTsKICAgIH0KICAgIHJldHVybiByKGRvbXRvb2xzX2Nzc19icmVha3BvaW50c19leHBvcnRzLmNzc0Zvck5vdGVib29rKGNvbnRlbnRBcmcpKTsKICB9CiAgY3NzRm9yVGFibGV0KGNvbnRlbnRBcmcsIGVsZW1lbnRDbGFzcykgewogICAgaWYgKGVsZW1lbnRDbGFzcykgewogICAgICByZXR1cm4gcihkb210b29sc19jc3NfYnJlYWtwb2ludHNfZXhwb3J0cy5jc3NGb3JDb250YWluZXIoY29udGVudEFyZywgYChtYXgtd2lkdGg6ICR7ZG9tdG9vbHNfY3NzX2JyZWFrcG9pbnRzX2V4cG9ydHMudGFibGV0fXB4KWAsIHRoaXMuZ2V0Q29udGFpbmVyTmFtZUZyb21DbGFzcyhlbGVtZW50Q2xhc3MpKSk7CiAgICB9CiAgICByZXR1cm4gcihkb210b29sc19jc3NfYnJlYWtwb2ludHNfZXhwb3J0cy5jc3NGb3JUYWJsZXQoY29udGVudEFyZykpOwogIH0KICBjc3NGb3JQaGFibGV0KGNvbnRlbnRBcmcsIGVsZW1lbnRDbGFzcykgewogICAgaWYgKGVsZW1lbnRDbGFzcykgewogICAgICByZXR1cm4gcihkb210b29sc19jc3NfYnJlYWtwb2ludHNfZXhwb3J0cy5jc3NGb3JDb250YWluZXIoY29udGVudEFyZywgYChtYXgtd2lkdGg6ICR7ZG9tdG9vbHNfY3NzX2JyZWFrcG9pbnRzX2V4cG9ydHMucGhhYmxldH1weClgLCB0aGlzLmdldENvbnRhaW5lck5hbWVGcm9tQ2xhc3MoZWxlbWVudENsYXNzKSkpOwogICAgfQogICAgcmV0dXJuIHIoZG9tdG9vbHNfY3NzX2JyZWFrcG9pbnRzX2V4cG9ydHMuY3NzRm9yUGhhYmxldChjb250ZW50QXJnKSk7CiAgfQogIGNzc0ZvclBob25lKGNvbnRlbnRBcmcsIGVsZW1lbnRDbGFzcykgewogICAgaWYgKGVsZW1lbnRDbGFzcykgewogICAgICByZXR1cm4gcihkb210b29sc19jc3NfYnJlYWtwb2ludHNfZXhwb3J0cy5jc3NGb3JDb250YWluZXIoY29udGVudEFyZywgYChtYXgtd2lkdGg6ICR7ZG9tdG9vbHNfY3NzX2JyZWFrcG9pbnRzX2V4cG9ydHMucGhvbmV9cHgpYCwgdGhpcy5nZXRDb250YWluZXJOYW1lRnJvbUNsYXNzKGVsZW1lbnRDbGFzcykpKTsKICAgIH0KICAgIHJldHVybiByKGRvbXRvb2xzX2Nzc19icmVha3BvaW50c19leHBvcnRzLmNzc0ZvclBob25lKGNvbnRlbnRBcmcpKTsKICB9CiAgY3NzRm9yQ29uc3RyYWludChjb25zdHJhaW50cykgewogICAgcmV0dXJuIChjb250ZW50QXJnKSA9PiByKGRvbXRvb2xzX2Nzc19icmVha3BvaW50c19leHBvcnRzLmNzc0ZvckNvbnN0cmFpbnQoY29uc3RyYWludHMpKGNvbnRlbnRBcmcpKTsKICB9CiAgYmRUaGVtZShicmlnaHRWYWx1ZUFyZywgZGFya1ZhbHVlQXJnKSB7CiAgICBsZXQgcmV0dXJuQ3NzVmFyOwogICAgbGV0IGRlZmF1bHRWYWx1ZTsKICAgIGlmIChEb21Ub29scy5nZXRHbG9iYWxEb21Ub29sc1N5bmMoKSkgewogICAgICBkZWZhdWx0VmFsdWUgPSBEb21Ub29scy5nZXRHbG9iYWxEb21Ub29sc1N5bmMoKS50aGVtZU1hbmFnZXIuZ29CcmlnaHRCb29sZWFuID8gYnJpZ2h0VmFsdWVBcmcgOiBkYXJrVmFsdWVBcmc7CiAgICB9IGVsc2UgewogICAgICBkZWZhdWx0VmFsdWUgPSBkYXJrVmFsdWVBcmc7CiAgICB9CiAgICBjb25zdCBleGlzdGluZ1RyaXBsZXQgPSB0aGlzLmJkVmFyVHJpcGxldFN0b3JlLmZpbmQoKHRyaXBsZXRBcmcpID0+IHRyaXBsZXRBcmcuZGFya1ZhbHVlID09PSBkYXJrVmFsdWVBcmcgJiYgdHJpcGxldEFyZy5icmlnaHRWYWx1ZSA9PT0gYnJpZ2h0VmFsdWVBcmcpOwogICAgaWYgKGV4aXN0aW5nVHJpcGxldCkgewogICAgICByZXR1cm5Dc3NWYXIgPSBleGlzdGluZ1RyaXBsZXQuY3NzVmFyTmFtZTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IG5ld1RyaXBsZXQgPSB7CiAgICAgICAgY3NzVmFyTmFtZTogYC0tJHtpc291bmlxdWUzLnVuaSgpfWAsCiAgICAgICAgYnJpZ2h0VmFsdWU6IGJyaWdodFZhbHVlQXJnLAogICAgICAgIGRhcmtWYWx1ZTogZGFya1ZhbHVlQXJnCiAgICAgIH07CiAgICAgIHRoaXMuYmRWYXJUcmlwbGV0U3RvcmUucHVzaChuZXdUcmlwbGV0KTsKICAgICAgdGhpcy5kb210b29sc1Byb21pc2UudGhlbihhc3luYyAoZG9tdG9vbHNBcmcpID0+IHsKICAgICAgICBhd2FpdCBkb210b29sc0FyZy5kb21SZWFkeS5wcm9taXNlOwogICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuc2V0UHJvcGVydHkobmV3VHJpcGxldC5jc3NWYXJOYW1lLCBkZWZhdWx0VmFsdWUpOwogICAgICB9KTsKICAgICAgcmV0dXJuQ3NzVmFyID0gbmV3VHJpcGxldC5jc3NWYXJOYW1lOwogICAgfQogICAgcmV0dXJuIGxpdC51bnNhZmVDU1MoYHZhcigke3JldHVybkNzc1Zhcn0sICR7ZGVmYXVsdFZhbHVlfSlgKTsKICB9CiAgY3NzR3JpZENvbHVtbnMgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChhbW91bnRPZkNvbHVtbnNBcmcsIGdhcFNpemVBcmcpID0+IHsKICAgIGxldCByZXR1cm5TdHJpbmcgPSBgYDsKICAgIGZvciAobGV0IGkxMCA9IDA7IGkxMCA8IGFtb3VudE9mQ29sdW1uc0FyZzsgaTEwKyspIHsKICAgICAgcmV0dXJuU3RyaW5nICs9IGAgY2FsYygoMTAwJS8ke2Ftb3VudE9mQ29sdW1uc0FyZ30pIC0gKCR7Z2FwU2l6ZUFyZyAqIChhbW91bnRPZkNvbHVtbnNBcmcgLSAxKX1weC8ke2Ftb3VudE9mQ29sdW1uc0FyZ30pKWA7CiAgICB9CiAgICByZXR1cm4gbGl0LnVuc2FmZUNTUyhyZXR1cm5TdHJpbmcpOwogIH0sICJjc3NHcmlkQ29sdW1ucyIpOwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2xpdC1odG1sQDMuMy4yL25vZGVfbW9kdWxlcy9saXQtaHRtbC9zdGF0aWMuanMKdmFyIGEzID0gLyogQF9fUFVSRV9fICovIFN5bWJvbC5mb3IoIiIpLCBvNyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHQ4KSA9PiB7CiAgaWYgKHQ4Py5yID09PSBhMykgcmV0dXJuIHQ4Py5fJGxpdFN0YXRpYyQ7Cn0sICJvIiksIHM1ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgodDgpID0+ICh7IF8kbGl0U3RhdGljJDogdDgsIHI6IGEzIH0pLCAicyIpLCBpNSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHQ4LCAuLi5yMTApID0+ICh7IF8kbGl0U3RhdGljJDogcjEwLnJlZHVjZSgocjExLCBlMTAsIGE0KSA9PiByMTEgKyAoKHQ5KSA9PiB7CiAgaWYgKHZvaWQgMCAhPT0gdDkuXyRsaXRTdGF0aWMkKSByZXR1cm4gdDkuXyRsaXRTdGF0aWMkOwogIHRocm93IEVycm9yKGBWYWx1ZSBwYXNzZWQgdG8gJ2xpdGVyYWwnIGZ1bmN0aW9uIG11c3QgYmUgYSAnbGl0ZXJhbCcgcmVzdWx0OiAke3Q5fS4gVXNlICd1bnNhZmVTdGF0aWMnIHRvIHBhc3Mgbm9uLWxpdGVyYWwgdmFsdWVzLCBidXQKICAgICAgICAgICAgdGFrZSBjYXJlIHRvIGVuc3VyZSBwYWdlIHNlY3VyaXR5LmApOwp9KShlMTApICsgdDhbYTQgKyAxXSwgdDhbMF0pLCByOiBhMyB9KSwgImkiKSwgbDMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLCBuNiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHQ4KSA9PiAocjEwLCAuLi5lMTApID0+IHsKICBjb25zdCBhNCA9IGUxMC5sZW5ndGg7CiAgbGV0IHM5LCBpMTA7CiAgY29uc3QgbjExID0gW10sIHU2ID0gW107CiAgbGV0IGMxMCwgJDMgPSAwLCBmNiA9IGZhbHNlOwogIGZvciAoOyAkMyA8IGE0OyApIHsKICAgIGZvciAoYzEwID0gcjEwWyQzXTsgJDMgPCBhNCAmJiB2b2lkIDAgIT09IChpMTAgPSBlMTBbJDNdLCBzOSA9IG83KGkxMCkpOyApIGMxMCArPSBzOSArIHIxMFsrKyQzXSwgZjYgPSB0cnVlOwogICAgJDMgIT09IGE0ICYmIHU2LnB1c2goaTEwKSwgbjExLnB1c2goYzEwKSwgJDMrKzsKICB9CiAgaWYgKCQzID09PSBhNCAmJiBuMTEucHVzaChyMTBbYTRdKSwgZjYpIHsKICAgIGNvbnN0IHQ5ID0gbjExLmpvaW4oIiQkbGl0JCQiKTsKICAgIHZvaWQgMCA9PT0gKHIxMCA9IGwzLmdldCh0OSkpICYmIChuMTEucmF3ID0gbjExLCBsMy5zZXQodDksIHIxMCA9IG4xMSkpLCBlMTAgPSB1NjsKICB9CiAgcmV0dXJuIHQ4KHIxMCwgLi4uZTEwKTsKfSwgIm4iKSwgdTMgPSBuNihiMiksIGM0ID0gbjYodyksICQyID0gbjYoVCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbGl0LWh0bWxAMy4zLjIvbm9kZV9tb2R1bGVzL2xpdC1odG1sL2RpcmVjdGl2ZS5qcwp2YXIgdDMgPSB7IEFUVFJJQlVURTogMSwgQ0hJTEQ6IDIsIFBST1BFUlRZOiAzLCBCT09MRUFOX0FUVFJJQlVURTogNCwgRVZFTlQ6IDUsIEVMRU1FTlQ6IDYgfSwgZTQgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh0OCkgPT4gKC4uLmUxMCkgPT4gKHsgXyRsaXREaXJlY3RpdmUkOiB0OCwgdmFsdWVzOiBlMTAgfSksICJlIik7CnZhciBpNiA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJpIik7CiAgfQogIGNvbnN0cnVjdG9yKHQ4KSB7CiAgfQogIGdldCBfJEFVKCkgewogICAgcmV0dXJuIHRoaXMuXyRBTS5fJEFVOwogIH0KICBfJEFUKHQ4LCBlMTAsIGkxMCkgewogICAgdGhpcy5fJEN0ID0gdDgsIHRoaXMuXyRBTSA9IGUxMCwgdGhpcy5fJENpID0gaTEwOwogIH0KICBfJEFTKHQ4LCBlMTApIHsKICAgIHJldHVybiB0aGlzLnVwZGF0ZSh0OCwgZTEwKTsKICB9CiAgdXBkYXRlKHQ4LCBlMTApIHsKICAgIHJldHVybiB0aGlzLnJlbmRlciguLi5lMTApOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9saXQtaHRtbEAzLjMuMi9ub2RlX21vZHVsZXMvbGl0LWh0bWwvZGlyZWN0aXZlcy91bnNhZmUtaHRtbC5qcwp2YXIgZTUgPSBjbGFzcyBleHRlbmRzIGk2IHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJlIik7CiAgfQogIGNvbnN0cnVjdG9yKGkxMCkgewogICAgaWYgKHN1cGVyKGkxMCksIHRoaXMuaXQgPSBBLCBpMTAudHlwZSAhPT0gdDMuQ0hJTEQpIHRocm93IEVycm9yKHRoaXMuY29uc3RydWN0b3IuZGlyZWN0aXZlTmFtZSArICIoKSBjYW4gb25seSBiZSB1c2VkIGluIGNoaWxkIGJpbmRpbmdzIik7CiAgfQogIHJlbmRlcihyMTApIHsKICAgIGlmIChyMTAgPT09IEEgfHwgbnVsbCA9PSByMTApIHJldHVybiB0aGlzLl90ID0gdm9pZCAwLCB0aGlzLml0ID0gcjEwOwogICAgaWYgKHIxMCA9PT0gRSkgcmV0dXJuIHIxMDsKICAgIGlmICgic3RyaW5nIiAhPSB0eXBlb2YgcjEwKSB0aHJvdyBFcnJvcih0aGlzLmNvbnN0cnVjdG9yLmRpcmVjdGl2ZU5hbWUgKyAiKCkgY2FsbGVkIHdpdGggYSBub24tc3RyaW5nIHZhbHVlIik7CiAgICBpZiAocjEwID09PSB0aGlzLml0KSByZXR1cm4gdGhpcy5fdDsKICAgIHRoaXMuaXQgPSByMTA7CiAgICBjb25zdCBzOSA9IFtyMTBdOwogICAgcmV0dXJuIHM5LnJhdyA9IHM5LCB0aGlzLl90ID0geyBfJGxpdFR5cGUkOiB0aGlzLmNvbnN0cnVjdG9yLnJlc3VsdFR5cGUsIHN0cmluZ3M6IHM5LCB2YWx1ZXM6IFtdIH07CiAgfQp9OwplNS5kaXJlY3RpdmVOYW1lID0gInVuc2FmZUhUTUwiLCBlNS5yZXN1bHRUeXBlID0gMTsKdmFyIG84ID0gZTQoZTUpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BsaXQrcmVhY3RpdmUtZWxlbWVudEAyLjEuMi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L2RlY29yYXRvcnMvY3VzdG9tLWVsZW1lbnQuanMKdmFyIHQ0ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgodDgpID0+IChlMTAsIG8xMikgPT4gewogIHZvaWQgMCAhPT0gbzEyID8gbzEyLmFkZEluaXRpYWxpemVyKCgpID0+IHsKICAgIGN1c3RvbUVsZW1lbnRzLmRlZmluZSh0OCwgZTEwKTsKICB9KSA6IGN1c3RvbUVsZW1lbnRzLmRlZmluZSh0OCwgZTEwKTsKfSwgInQiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWVsZW1lbnRAMi4yLjMvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZWxlbWVudC9kaXN0X3RzL2RlY29yYXRvcnMuY3VzdG9tZWxlbWVudC5qcwp2YXIgY2FtZWxUb0tlYmFiID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgobmFtZSkgPT4gbmFtZS5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAiJDEtJDIiKS50b0xvd2VyQ2FzZSgpLCAiY2FtZWxUb0tlYmFiIik7CmZ1bmN0aW9uIGN1c3RvbUVsZW1lbnQodGFnTmFtZSkgewogIHJldHVybiAoY2xhc3NPclRhcmdldCwgY29udGV4dDIpID0+IHsKICAgIGNsYXNzT3JUYXJnZXQuaXMgPSB0YWdOYW1lOwogICAgaWYgKGNsYXNzT3JUYXJnZXQubmFtZSkgewogICAgICBjb25zdCBkZXJpdmVkID0gY2FtZWxUb0tlYmFiKGNsYXNzT3JUYXJnZXQubmFtZSk7CiAgICAgIGlmIChkZXJpdmVkICE9PSB0YWdOYW1lKSB7CiAgICAgICAgY29uc29sZS53YXJuKGBbZGVlcy1lbGVtZW50XSBDbGFzcyAiJHtjbGFzc09yVGFyZ2V0Lm5hbWV9IiBrZWJhYi1jYXNlcyB0byAiJHtkZXJpdmVkfSIgYnV0IHRhZyBpcyAiJHt0YWdOYW1lfSIuIENvbnRhaW5lciBxdWVyaWVzIHVzZSAuaXMgKCIke3RhZ05hbWV9IikuYCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0NCh0YWdOYW1lKShjbGFzc09yVGFyZ2V0LCBjb250ZXh0Mik7CiAgfTsKfQpfX25hbWUoY3VzdG9tRWxlbWVudCwgImN1c3RvbUVsZW1lbnQiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AbGl0K3JlYWN0aXZlLWVsZW1lbnRAMi4xLjIvbm9kZV9tb2R1bGVzL0BsaXQvcmVhY3RpdmUtZWxlbWVudC9kZWNvcmF0b3JzL3N0YXRlLmpzCmZ1bmN0aW9uIHI1KHIxMCkgewogIHJldHVybiBuNSh7IC4uLnIxMCwgc3RhdGU6IHRydWUsIGF0dHJpYnV0ZTogZmFsc2UgfSk7Cn0KX19uYW1lKHI1LCAiciIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BsaXQrcmVhY3RpdmUtZWxlbWVudEAyLjEuMi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L2RlY29yYXRvcnMvZXZlbnQtb3B0aW9ucy5qcwpmdW5jdGlvbiB0NSh0OCkgewogIHJldHVybiAobjExLCBvMTIpID0+IHsKICAgIGNvbnN0IGMxMCA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIG4xMSA/IG4xMSA6IG4xMVtvMTJdOwogICAgT2JqZWN0LmFzc2lnbihjMTAsIHQ4KTsKICB9Owp9Cl9fbmFtZSh0NSwgInQiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AbGl0K3JlYWN0aXZlLWVsZW1lbnRAMi4xLjIvbm9kZV9tb2R1bGVzL0BsaXQvcmVhY3RpdmUtZWxlbWVudC9kZWNvcmF0b3JzL2Jhc2UuanMKdmFyIGU2ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoZTEwLCB0OCwgYzEwKSA9PiAoYzEwLmNvbmZpZ3VyYWJsZSA9IHRydWUsIGMxMC5lbnVtZXJhYmxlID0gdHJ1ZSwgUmVmbGVjdC5kZWNvcmF0ZSAmJiAib2JqZWN0IiAhPSB0eXBlb2YgdDggJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUxMCwgdDgsIGMxMCksIGMxMCksICJlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGxpdCtyZWFjdGl2ZS1lbGVtZW50QDIuMS4yL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGVjb3JhdG9ycy9xdWVyeS5qcwpmdW5jdGlvbiBlNyhlMTAsIHIxMCkgewogIHJldHVybiAobjExLCBzOSwgaTEwKSA9PiB7CiAgICBjb25zdCBvMTIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh0OCkgPT4gdDgucmVuZGVyUm9vdD8ucXVlcnlTZWxlY3RvcihlMTApID8/IG51bGwsICJvIik7CiAgICBpZiAocjEwKSB7CiAgICAgIGNvbnN0IHsgZ2V0OiBlMTEsIHNldDogcjExIH0gPSAib2JqZWN0IiA9PSB0eXBlb2YgczkgPyBuMTEgOiBpMTAgPz8gLyogQF9fUFVSRV9fICovICgoKSA9PiB7CiAgICAgICAgY29uc3QgdDggPSAvKiBAX19QVVJFX18gKi8gU3ltYm9sKCk7CiAgICAgICAgcmV0dXJuIHsgZ2V0KCkgewogICAgICAgICAgcmV0dXJuIHRoaXNbdDhdOwogICAgICAgIH0sIHNldChlMTIpIHsKICAgICAgICAgIHRoaXNbdDhdID0gZTEyOwogICAgICAgIH0gfTsKICAgICAgfSkoKTsKICAgICAgcmV0dXJuIGU2KG4xMSwgczksIHsgZ2V0KCkgewogICAgICAgIGxldCB0OCA9IGUxMS5jYWxsKHRoaXMpOwogICAgICAgIHJldHVybiB2b2lkIDAgPT09IHQ4ICYmICh0OCA9IG8xMih0aGlzKSwgKG51bGwgIT09IHQ4IHx8IHRoaXMuaGFzVXBkYXRlZCkgJiYgcjExLmNhbGwodGhpcywgdDgpKSwgdDg7CiAgICAgIH0gfSk7CiAgICB9CiAgICByZXR1cm4gZTYobjExLCBzOSwgeyBnZXQoKSB7CiAgICAgIHJldHVybiBvMTIodGhpcyk7CiAgICB9IH0pOwogIH07Cn0KX19uYW1lKGU3LCAiZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BsaXQrcmVhY3RpdmUtZWxlbWVudEAyLjEuMi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L2RlY29yYXRvcnMvcXVlcnktYWxsLmpzCnZhciBlODsKZnVuY3Rpb24gcjYocjEwKSB7CiAgcmV0dXJuIChuMTEsIG8xMikgPT4gZTYobjExLCBvMTIsIHsgZ2V0KCkgewogICAgcmV0dXJuICh0aGlzLnJlbmRlclJvb3QgPz8gKGU4ID8/PSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkpKS5xdWVyeVNlbGVjdG9yQWxsKHIxMCk7CiAgfSB9KTsKfQpfX25hbWUocjYsICJyIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGxpdCtyZWFjdGl2ZS1lbGVtZW50QDIuMS4yL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGVjb3JhdG9ycy9xdWVyeS1hc3luYy5qcwpmdW5jdGlvbiByNyhyMTApIHsKICByZXR1cm4gKG4xMSwgZTEwKSA9PiBlNihuMTEsIGUxMCwgeyBhc3luYyBnZXQoKSB7CiAgICByZXR1cm4gYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZSwgdGhpcy5yZW5kZXJSb290Py5xdWVyeVNlbGVjdG9yKHIxMCkgPz8gbnVsbDsKICB9IH0pOwp9Cl9fbmFtZShyNywgInIiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AbGl0K3JlYWN0aXZlLWVsZW1lbnRAMi4xLjIvbm9kZV9tb2R1bGVzL0BsaXQvcmVhY3RpdmUtZWxlbWVudC9kZWNvcmF0b3JzL3F1ZXJ5LWFzc2lnbmVkLWVsZW1lbnRzLmpzCmZ1bmN0aW9uIG85KG8xMikgewogIHJldHVybiAoZTEwLCBuMTEpID0+IHsKICAgIGNvbnN0IHsgc2xvdDogcjEwLCBzZWxlY3RvcjogczkgfSA9IG8xMiA/PyB7fSwgYzEwID0gInNsb3QiICsgKHIxMCA/IGBbbmFtZT0ke3IxMH1dYCA6ICI6bm90KFtuYW1lXSkiKTsKICAgIHJldHVybiBlNihlMTAsIG4xMSwgeyBnZXQoKSB7CiAgICAgIGNvbnN0IHQ4ID0gdGhpcy5yZW5kZXJSb290Py5xdWVyeVNlbGVjdG9yKGMxMCksIGUxMSA9IHQ4Py5hc3NpZ25lZEVsZW1lbnRzKG8xMikgPz8gW107CiAgICAgIHJldHVybiB2b2lkIDAgPT09IHM5ID8gZTExIDogZTExLmZpbHRlcigodDkpID0+IHQ5Lm1hdGNoZXMoczkpKTsKICAgIH0gfSk7CiAgfTsKfQpfX25hbWUobzksICJvIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGxpdCtyZWFjdGl2ZS1lbGVtZW50QDIuMS4yL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGVjb3JhdG9ycy9xdWVyeS1hc3NpZ25lZC1ub2Rlcy5qcwpmdW5jdGlvbiBuNyhuMTEpIHsKICByZXR1cm4gKG8xMiwgcjEwKSA9PiB7CiAgICBjb25zdCB7IHNsb3Q6IGUxMCB9ID0gbjExID8/IHt9LCBzOSA9ICJzbG90IiArIChlMTAgPyBgW25hbWU9JHtlMTB9XWAgOiAiOm5vdChbbmFtZV0pIik7CiAgICByZXR1cm4gZTYobzEyLCByMTAsIHsgZ2V0KCkgewogICAgICBjb25zdCB0OCA9IHRoaXMucmVuZGVyUm9vdD8ucXVlcnlTZWxlY3RvcihzOSk7CiAgICAgIHJldHVybiB0OD8uYXNzaWduZWROb2RlcyhuMTEpID8/IFtdOwogICAgfSB9KTsKICB9Owp9Cl9fbmFtZShuNywgIm4iKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWVsZW1lbnRAMi4yLjMvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZWxlbWVudC9kaXN0X3RzL2NsYXNzZXMuZGVlcy1lbGVtZW50LmpzCnZhciBfX2VzRGVjb3JhdGUyID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjYpIHsKICAgIGlmIChmNiAhPT0gdm9pZCAwICYmIHR5cGVvZiBmNiAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmNjsKICB9CiAgX19uYW1lKGFjY2VwdCwgImFjY2VwdCIpOwogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfMywgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMCA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTEwID49IDA7IGkxMC0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA2IGluIGNvbnRleHRJbikgY29udGV4dDJbcDZdID0gcDYgPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDZdOwogICAgZm9yICh2YXIgcDYgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A2XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDZdOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmNikgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY2IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTEwXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfMyA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfMzsKICAgICAgaWYgKF8zID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF8zOwogICAgICBpZiAoXzMgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfMyk7CiAgICB9IGVsc2UgaWYgKF8zID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8zKTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzM7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzMyA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTEwID0gMDsgaTEwIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTEwKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMF0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMF0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc0VsZW1lbnQgPSAoKCkgPT4gewogIGxldCBfY2xhc3NTdXBlciA9IGxpdC5MaXRFbGVtZW50OwogIGxldCBfZ29CcmlnaHRfZGVjb3JhdG9yczsKICBsZXQgX2dvQnJpZ2h0X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZ29CcmlnaHRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2RvbXRvb2xzX2RlY29yYXRvcnM7CiAgbGV0IF9kb210b29sc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2RvbXRvb2xzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgcmV0dXJuIGNsYXNzIERlZXNFbGVtZW50IGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX19uYW1lKHRoaXMsICJEZWVzRWxlbWVudCIpOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9nb0JyaWdodF9kZWNvcmF0b3JzID0gW2xpdC5wcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfZG9tdG9vbHNfZGVjb3JhdG9ycyA9IFtsaXQucHJvcGVydHkoKV07CiAgICAgIF9fZXNEZWNvcmF0ZTIodGhpcywgbnVsbCwgX2dvQnJpZ2h0X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImdvQnJpZ2h0Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKG9iaikgPT4gImdvQnJpZ2h0IiBpbiBvYmosICJoYXMiKSwgZ2V0OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKChvYmopID0+IG9iai5nb0JyaWdodCwgImdldCIpLCBzZXQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmdvQnJpZ2h0ID0gdmFsdWUyOwogICAgICB9LCAic2V0IikgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZ29CcmlnaHRfaW5pdGlhbGl6ZXJzLCBfZ29CcmlnaHRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUyKHRoaXMsIG51bGwsIF9kb210b29sc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJkb210b29scyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKChvYmopID0+ICJkb210b29scyIgaW4gb2JqLCAiaGFzIiksIGdldDogLyogQF9fUFVSRV9fICovIF9fbmFtZSgob2JqKSA9PiBvYmouZG9tdG9vbHMsICJnZXQiKSwgc2V0OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5kb210b29scyA9IHZhbHVlMjsKICAgICAgfSwgInNldCIpIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2RvbXRvb2xzX2luaXRpYWxpemVycywgX2RvbXRvb2xzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgLy8gU1RBVElDIOKAlCBjb21wb25lbnQtbGV2ZWwgY29uc3RyYWludCBoZWxwZXIgKHVzZSBpbiBgc3RhdGljIHN0eWxlcyA9IFsuLi5dYCkKICAgIHN0YXRpYyBnZXRDb250YWluZXJOYW1lKCkgewogICAgICByZXR1cm4gdGhpcy5pcyB8fCB0aGlzLm5hbWUucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgIiQxLSQyIikudG9Mb3dlckNhc2UoKTsKICAgIH0KICAgIHN0YXRpYyBjc3NGb3JDb25zdHJhaW50KGNvbnN0cmFpbnRzKSB7CiAgICAgIHJldHVybiAoY3NzQXJnKSA9PiBkaXN0X3RzX2V4cG9ydHMyNy5icmVha3BvaW50cy5jc3NGb3JDb25zdHJhaW50Q29udGFpbmVyKGNvbnN0cmFpbnRzLCB0aGlzLmdldENvbnRhaW5lck5hbWUoKSkoY3NzQXJnKTsKICAgIH0KICAgICNnb0JyaWdodF9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnMzKHRoaXMsIF9nb0JyaWdodF9pbml0aWFsaXplcnMsIGZhbHNlKTsKICAgIC8vIElOU1RBTkNFCiAgICBnZXQgZ29CcmlnaHQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNnb0JyaWdodF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGdvQnJpZ2h0KHZhbHVlMikgewogICAgICB0aGlzLiNnb0JyaWdodF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgLy8gZG9tdG9vbHMKICAgIGRvbXRvb2xzUHJvbWlzZSA9IF9fcnVuSW5pdGlhbGl6ZXJzMyh0aGlzLCBfZ29CcmlnaHRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgI2RvbXRvb2xzX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczModGhpcywgX2RvbXRvb2xzX2luaXRpYWxpemVycywgdm9pZCAwKTsKICAgIGdldCBkb210b29scygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2RvbXRvb2xzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZG9tdG9vbHModmFsdWUyKSB7CiAgICAgIHRoaXMuI2RvbXRvb2xzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICByeFN1YnNjcmlwdGlvbnMgPSAoX19ydW5Jbml0aWFsaXplcnMzKHRoaXMsIF9kb210b29sc19leHRyYUluaXRpYWxpemVycyksIFtdKTsKICAgIHRoZW1lU3Vic2NyaXB0aW9uOwogICAgZWxlbWVudERvbVJlYWR5RGVmZXJyZWQgPSBkaXN0X3RzX2V4cG9ydHMyNy5wbHVnaW5zLnNtYXJ0cHJvbWlzZS5kZWZlcigpOwogICAgZWxlbWVudERvbVJlYWR5ID0gdGhpcy5lbGVtZW50RG9tUmVhZHlEZWZlcnJlZC5wcm9taXNlOwogICAgY29uc3RydWN0b3Iob3B0aW9uc0FyZyA9IHt9KSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMuZG9tdG9vbHNQcm9taXNlID0gZGlzdF90c19leHBvcnRzMjcuZWxlbWVudEJhc2ljLnNldHVwKHRoaXMsIG9wdGlvbnNBcmcpOwogICAgICB0aGlzLmRvbXRvb2xzUHJvbWlzZS50aGVuKChkb210b29sc0FyZykgPT4gewogICAgICAgIHRoaXMuZG9tdG9vbHMgPSBkb210b29sc0FyZzsKICAgICAgfSk7CiAgICB9CiAgICBhc3luYyBjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgY29uc3QgZG9tdG9vbHMgPSBhd2FpdCB0aGlzLmRvbXRvb2xzUHJvbWlzZTsKICAgICAgdGhpcy50aGVtZVN1YnNjcmlwdGlvbiA9IGRvbXRvb2xzLnRoZW1lTWFuYWdlci50aGVtZU9ic2VydmFibGUuc3Vic2NyaWJlKChnb0JyaWdodEFyZykgPT4gewogICAgICAgIHRoaXMuZ29CcmlnaHQgPSBnb0JyaWdodEFyZzsKICAgICAgICBpZiAodGhpcy50aGVtZUNoYW5nZWQpIHsKICAgICAgICAgIHRoaXMudGhlbWVDaGFuZ2VkKGdvQnJpZ2h0QXJnKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICB0aGlzLnJ4U3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMudGhlbWVTdWJzY3JpcHRpb24pOwogICAgICBmb3IgKGNvbnN0IHN0YXJ0dXBGdW5jdGlvbiBvZiB0aGlzLnN0YXJ0dXBGdW5jdGlvbnMpIHsKICAgICAgICBhd2FpdCBzdGFydHVwRnVuY3Rpb24oKTsKICAgICAgfQogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJkZWVzRWxlbWVudENvbm5lY3RlZCIpKTsKICAgIH0KICAgIGZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXMpIHsKICAgICAgc3VwZXIuZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllcyk7CiAgICAgIHRoaXMuZWxlbWVudERvbVJlYWR5RGVmZXJyZWQucmVzb2x2ZSgpOwogICAgfQogICAgc3RhcnR1cEZ1bmN0aW9ucyA9IFtdOwogICAgcmVnaXN0ZXJTdGFydHVwRnVuY3Rpb24oc3RhcnR1cEZ1bmN0aW9uQXJnKSB7CiAgICAgIHRoaXMuc3RhcnR1cEZ1bmN0aW9ucy5wdXNoKHN0YXJ0dXBGdW5jdGlvbkFyZyk7CiAgICB9CiAgICBnYXJiYWdlRnVuY3Rpb25zID0gW107CiAgICByZWdpc3RlckdhcmJhZ2VGdW5jdGlvbihnYXJiYWdlRnVuY3Rpb25BcmcpIHsKICAgICAgdGhpcy5nYXJiYWdlRnVuY3Rpb25zLnB1c2goZ2FyYmFnZUZ1bmN0aW9uQXJnKTsKICAgIH0KICAgIGFzeW5jIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBhd2FpdCB0aGlzLmRvbXRvb2xzUHJvbWlzZTsKICAgICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgZm9yIChjb25zdCBzdWJzY3JpcHRpb24gb2YgdGhpcy5yeFN1YnNjcmlwdGlvbnMpIHsKICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgfQogICAgICBmb3IgKGNvbnN0IGdhcmJhZ2VGdW5jdGlvbiBvZiB0aGlzLmdhcmJhZ2VGdW5jdGlvbnMpIHsKICAgICAgICBhd2FpdCBnYXJiYWdlRnVuY3Rpb24oKTsKICAgICAgfQogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJkZWVzRWxlbWVudERpc2Nvbm5lY3RlZCIpKTsKICAgIH0KICB9Owp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZWxlbWVudEAyLjIuMy9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1lbGVtZW50L2Rpc3RfdHMvZGVjb3JhdG9ycy5jb250YWluZXJyZXNwb25zaXZlLmpzCnZhciBjYW1lbFRvS2ViYWIyID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgobmFtZSkgPT4gbmFtZS5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAiJDEtJDIiKS50b0xvd2VyQ2FzZSgpLCAiY2FtZWxUb0tlYmFiIik7CmZ1bmN0aW9uIGNvbnRhaW5lclJlc3BvbnNpdmUoKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKHRhcmdldCkgewogICAgY29uc3QgdGFnTmFtZSA9IHRhcmdldC5pcyB8fCB0YXJnZXQubmFtZS5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAiJDEtJDIiKS50b0xvd2VyQ2FzZSgpOwogICAgY29uc3QgZGVyaXZlZE5hbWUgPSB0YXJnZXQubmFtZSA/IGNhbWVsVG9LZWJhYjIodGFyZ2V0Lm5hbWUpIDogbnVsbDsKICAgIGlmIChkZXJpdmVkTmFtZSAmJiBkZXJpdmVkTmFtZSAhPT0gdGFnTmFtZSkgewogICAgICBjb25zdCBmaXhTdHlsZSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHN0eWxlKSA9PiB7CiAgICAgICAgaWYgKHN0eWxlICYmIHN0eWxlLmNzc1RleHQgJiYgc3R5bGUuY3NzVGV4dC5pbmNsdWRlcyhgQGNvbnRhaW5lciAke2Rlcml2ZWROYW1lfWApKSB7CiAgICAgICAgICByZXR1cm4gcihzdHlsZS5jc3NUZXh0LnJlcGxhY2VBbGwoYEBjb250YWluZXIgJHtkZXJpdmVkTmFtZX1gLCBgQGNvbnRhaW5lciAke3RhZ05hbWV9YCkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3R5bGU7CiAgICAgIH0sICJmaXhTdHlsZSIpOwogICAgICBjb25zdCBvcmlnaW5hbCA9IHRhcmdldC5zdHlsZXM7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KG9yaWdpbmFsKSkgewogICAgICAgIHRhcmdldC5zdHlsZXMgPSBvcmlnaW5hbC5tYXAoZml4U3R5bGUpOwogICAgICB9IGVsc2UgaWYgKG9yaWdpbmFsKSB7CiAgICAgICAgdGFyZ2V0LnN0eWxlcyA9IGZpeFN0eWxlKG9yaWdpbmFsKTsKICAgICAgfQogICAgfQogICAgY29uc3QgY29udGFpbmVyU3R5bGVzID0gZG9tdG9vbHNfY3NzX2JyZWFrcG9pbnRzX2V4cG9ydHMuY29udGFpbmVyQ29udGV4dFN0eWxlcyh0YWdOYW1lKTsKICAgIGNvbnN0IGN1cnJlbnQgPSB0YXJnZXQuc3R5bGVzOwogICAgaWYgKEFycmF5LmlzQXJyYXkoY3VycmVudCkpIHsKICAgICAgdGFyZ2V0LnN0eWxlcyA9IFsuLi5jdXJyZW50LCBjb250YWluZXJTdHlsZXNdOwogICAgfSBlbHNlIGlmIChjdXJyZW50KSB7CiAgICAgIHRhcmdldC5zdHlsZXMgPSBbY3VycmVudCwgY29udGFpbmVyU3R5bGVzXTsKICAgIH0gZWxzZSB7CiAgICAgIHRhcmdldC5zdHlsZXMgPSBbY29udGFpbmVyU3R5bGVzXTsKICAgIH0KICAgIHJldHVybiB0YXJnZXQ7CiAgfTsKfQpfX25hbWUoY29udGFpbmVyUmVzcG9uc2l2ZSwgImNvbnRhaW5lclJlc3BvbnNpdmUiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWVsZW1lbnRAMi4yLjMvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZWxlbWVudC9kaXN0X3RzL2RpcmVjdGl2ZXMvaW5kZXguanMKdmFyIGRpcmVjdGl2ZXNfZXhwb3J0cyA9IHt9OwpfX2V4cG9ydChkaXJlY3RpdmVzX2V4cG9ydHMsIHsKICBhc3luY0FwcGVuZDogKCkgPT4gYzgsCiAga2V5ZWQ6ICgpID0+IGk5LAogIHJlcGVhdDogKCkgPT4gYzksCiAgcmVzb2x2ZTogKCkgPT4gcmVzb2x2ZSwKICByZXNvbHZlRXhlYzogKCkgPT4gcmVzb2x2ZUV4ZWMsCiAgc3Vic2NyaWJlOiAoKSA9PiBzdWJzY3JpYmUsCiAgc3Vic2NyaWJlV2l0aFRlbXBsYXRlOiAoKSA9PiBzdWJzY3JpYmVXaXRoVGVtcGxhdGUsCiAgdW50aWw6ICgpID0+IG00Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2xpdC1odG1sQDMuMy4yL25vZGVfbW9kdWxlcy9saXQtaHRtbC9kaXJlY3RpdmUtaGVscGVycy5qcwp2YXIgeyBJOiB0NiB9ID0gaiwgaTcgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChvMTIpID0+IG8xMiwgImkiKSwgbjggPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChvMTIpID0+IG51bGwgPT09IG8xMiB8fCAib2JqZWN0IiAhPSB0eXBlb2YgbzEyICYmICJmdW5jdGlvbiIgIT0gdHlwZW9mIG8xMiwgIm4iKSwgZTkgPSB7IEhUTUw6IDEsIFNWRzogMiwgTUFUSE1MOiAzIH0sIGw0ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgobzEyLCB0OCkgPT4gdm9pZCAwID09PSB0OCA/IHZvaWQgMCAhPT0gbzEyPy5fJGxpdFR5cGUkIDogbzEyPy5fJGxpdFR5cGUkID09PSB0OCwgImwiKSwgZDMgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChvMTIpID0+IG51bGwgIT0gbzEyPy5fJGxpdFR5cGUkPy5oLCAiZCIpLCBjNSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKG8xMikgPT4gdm9pZCAwICE9PSBvMTI/Ll8kbGl0RGlyZWN0aXZlJCwgImMiKSwgZjQgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChvMTIpID0+IG8xMj8uXyRsaXREaXJlY3RpdmUkLCAiZiIpLCByOCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKG8xMikgPT4gdm9pZCAwID09PSBvMTIuc3RyaW5ncywgInIiKSwgczYgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCgpID0+IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoIiIpLCAicyIpLCB2MyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKG8xMiwgbjExLCBlMTApID0+IHsKICBjb25zdCBsNSA9IG8xMi5fJEFBLnBhcmVudE5vZGUsIGQ0ID0gdm9pZCAwID09PSBuMTEgPyBvMTIuXyRBQiA6IG4xMS5fJEFBOwogIGlmICh2b2lkIDAgPT09IGUxMCkgewogICAgY29uc3QgaTEwID0gbDUuaW5zZXJ0QmVmb3JlKHM2KCksIGQ0KSwgbjEyID0gbDUuaW5zZXJ0QmVmb3JlKHM2KCksIGQ0KTsKICAgIGUxMCA9IG5ldyB0NihpMTAsIG4xMiwgbzEyLCBvMTIub3B0aW9ucyk7CiAgfSBlbHNlIHsKICAgIGNvbnN0IHQ4ID0gZTEwLl8kQUIubmV4dFNpYmxpbmcsIG4xMiA9IGUxMC5fJEFNLCBjMTAgPSBuMTIgIT09IG8xMjsKICAgIGlmIChjMTApIHsKICAgICAgbGV0IHQ5OwogICAgICBlMTAuXyRBUT8uKG8xMiksIGUxMC5fJEFNID0gbzEyLCB2b2lkIDAgIT09IGUxMC5fJEFQICYmICh0OSA9IG8xMi5fJEFVKSAhPT0gbjEyLl8kQVUgJiYgZTEwLl8kQVAodDkpOwogICAgfQogICAgaWYgKHQ4ICE9PSBkNCB8fCBjMTApIHsKICAgICAgbGV0IG8xMyA9IGUxMC5fJEFBOwogICAgICBmb3IgKDsgbzEzICE9PSB0ODsgKSB7CiAgICAgICAgY29uc3QgdDkgPSBpNyhvMTMpLm5leHRTaWJsaW5nOwogICAgICAgIGk3KGw1KS5pbnNlcnRCZWZvcmUobzEzLCBkNCksIG8xMyA9IHQ5OwogICAgICB9CiAgICB9CiAgfQogIHJldHVybiBlMTA7Cn0sICJ2IiksIHU0ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgobzEyLCB0OCwgaTEwID0gbzEyKSA9PiAobzEyLl8kQUkodDgsIGkxMCksIG8xMiksICJ1IiksIG0zID0ge30sIHA1ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgobzEyLCB0OCA9IG0zKSA9PiBvMTIuXyRBSCA9IHQ4LCAicCIpLCBNMiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKG8xMikgPT4gbzEyLl8kQUgsICJNIiksIGgzID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgobzEyKSA9PiB7CiAgbzEyLl8kQVIoKSwgbzEyLl8kQUEucmVtb3ZlKCk7Cn0sICJoIiksIGoyID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgobzEyKSA9PiB7CiAgbzEyLl8kQVIoKTsKfSwgImoiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9saXQtaHRtbEAzLjMuMi9ub2RlX21vZHVsZXMvbGl0LWh0bWwvYXN5bmMtZGlyZWN0aXZlLmpzCnZhciBzNyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGkxMCwgdDgpID0+IHsKICBjb25zdCBlMTAgPSBpMTAuXyRBTjsKICBpZiAodm9pZCAwID09PSBlMTApIHJldHVybiBmYWxzZTsKICBmb3IgKGNvbnN0IGkxMSBvZiBlMTApIGkxMS5fJEFPPy4odDgsIGZhbHNlKSwgczcoaTExLCB0OCk7CiAgcmV0dXJuIHRydWU7Cn0sICJzIiksIG8xMCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGkxMCkgPT4gewogIGxldCB0OCwgZTEwOwogIGRvIHsKICAgIGlmICh2b2lkIDAgPT09ICh0OCA9IGkxMC5fJEFNKSkgYnJlYWs7CiAgICBlMTAgPSB0OC5fJEFOLCBlMTAuZGVsZXRlKGkxMCksIGkxMCA9IHQ4OwogIH0gd2hpbGUgKDAgPT09IGUxMD8uc2l6ZSk7Cn0sICJvIiksIHI5ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoaTEwKSA9PiB7CiAgZm9yIChsZXQgdDg7IHQ4ID0gaTEwLl8kQU07IGkxMCA9IHQ4KSB7CiAgICBsZXQgZTEwID0gdDguXyRBTjsKICAgIGlmICh2b2lkIDAgPT09IGUxMCkgdDguXyRBTiA9IGUxMCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7CiAgICBlbHNlIGlmIChlMTAuaGFzKGkxMCkpIGJyZWFrOwogICAgZTEwLmFkZChpMTApLCBjNih0OCk7CiAgfQp9LCAiciIpOwpmdW5jdGlvbiBoNChpMTApIHsKICB2b2lkIDAgIT09IHRoaXMuXyRBTiA/IChvMTAodGhpcyksIHRoaXMuXyRBTSA9IGkxMCwgcjkodGhpcykpIDogdGhpcy5fJEFNID0gaTEwOwp9Cl9fbmFtZShoNCwgImgiKTsKZnVuY3Rpb24gbjkoaTEwLCB0OCA9IGZhbHNlLCBlMTAgPSAwKSB7CiAgY29uc3QgcjEwID0gdGhpcy5fJEFILCBoNyA9IHRoaXMuXyRBTjsKICBpZiAodm9pZCAwICE9PSBoNyAmJiAwICE9PSBoNy5zaXplKSBpZiAodDgpIGlmIChBcnJheS5pc0FycmF5KHIxMCkpIGZvciAobGV0IGkxMSA9IGUxMDsgaTExIDwgcjEwLmxlbmd0aDsgaTExKyspIHM3KHIxMFtpMTFdLCBmYWxzZSksIG8xMChyMTBbaTExXSk7CiAgZWxzZSBudWxsICE9IHIxMCAmJiAoczcocjEwLCBmYWxzZSksIG8xMChyMTApKTsKICBlbHNlIHM3KHRoaXMsIGkxMCk7Cn0KX19uYW1lKG45LCAibiIpOwp2YXIgYzYgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChpMTApID0+IHsKICBpMTAudHlwZSA9PSB0My5DSElMRCAmJiAoaTEwLl8kQVAgPz89IG45LCBpMTAuXyRBUSA/Pz0gaDQpOwp9LCAiYyIpOwp2YXIgZjUgPSBjbGFzcyBleHRlbmRzIGk2IHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJmIik7CiAgfQogIGNvbnN0cnVjdG9yKCkgewogICAgc3VwZXIoLi4uYXJndW1lbnRzKSwgdGhpcy5fJEFOID0gdm9pZCAwOwogIH0KICBfJEFUKGkxMCwgdDgsIGUxMCkgewogICAgc3VwZXIuXyRBVChpMTAsIHQ4LCBlMTApLCByOSh0aGlzKSwgdGhpcy5pc0Nvbm5lY3RlZCA9IGkxMC5fJEFVOwogIH0KICBfJEFPKGkxMCwgdDggPSB0cnVlKSB7CiAgICBpMTAgIT09IHRoaXMuaXNDb25uZWN0ZWQgJiYgKHRoaXMuaXNDb25uZWN0ZWQgPSBpMTAsIGkxMCA/IHRoaXMucmVjb25uZWN0ZWQ/LigpIDogdGhpcy5kaXNjb25uZWN0ZWQ/LigpKSwgdDggJiYgKHM3KHRoaXMsIGkxMCksIG8xMCh0aGlzKSk7CiAgfQogIHNldFZhbHVlKHQ4KSB7CiAgICBpZiAocjgodGhpcy5fJEN0KSkgdGhpcy5fJEN0Ll8kQUkodDgsIHRoaXMpOwogICAgZWxzZSB7CiAgICAgIGNvbnN0IGkxMCA9IFsuLi50aGlzLl8kQ3QuXyRBSF07CiAgICAgIGkxMFt0aGlzLl8kQ2ldID0gdDgsIHRoaXMuXyRDdC5fJEFJKGkxMCwgdGhpcywgMCk7CiAgICB9CiAgfQogIGRpc2Nvbm5lY3RlZCgpIHsKICB9CiAgcmVjb25uZWN0ZWQoKSB7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZWxlbWVudEAyLjIuMy9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1lbGVtZW50L2Rpc3RfdHMvZGlyZWN0aXZlcy9jbGFzc2VzLnJlc29sdmVkaXJlY3RpdmUuanMKdmFyIFJlc29sdmVEaXJlY3RpdmUgPSBjbGFzcyBleHRlbmRzIGY1IHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJSZXNvbHZlRGlyZWN0aXZlIik7CiAgfQogIHByb21pc2U7CiAgaGFzUHJvbWlzZVNldHRsZWQgPSBmYWxzZTsKICByZW5kZXIocHJvbWlzZSkgewogICAgaWYgKHRoaXMucHJvbWlzZSAhPT0gcHJvbWlzZSkgewogICAgICB0aGlzLnByb21pc2UgPSBwcm9taXNlOwogICAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCkgewogICAgICAgIHRoaXMuaGFuZGxlUHJvbWlzZShwcm9taXNlKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIEU7CiAgfQogIGhhbmRsZVByb21pc2UocHJvbWlzZSkgewogICAgdGhpcy5oYXNQcm9taXNlU2V0dGxlZCA9IGZhbHNlOwogICAgcHJvbWlzZS50aGVuKCh2YWx1ZTIpID0+IHsKICAgICAgaWYgKHRoaXMucHJvbWlzZSA9PT0gcHJvbWlzZSAmJiAhdGhpcy5oYXNQcm9taXNlU2V0dGxlZCkgewogICAgICAgIHRoaXMuc2V0VmFsdWUodmFsdWUyKTsKICAgICAgICB0aGlzLmhhc1Byb21pc2VTZXR0bGVkID0gdHJ1ZTsKICAgICAgfQogICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7CiAgICAgIGlmICh0aGlzLnByb21pc2UgPT09IHByb21pc2UgJiYgIXRoaXMuaGFzUHJvbWlzZVNldHRsZWQpIHsKICAgICAgICB0aGlzLnNldFZhbHVlKGVycm9yKTsKICAgICAgICB0aGlzLmhhc1Byb21pc2VTZXR0bGVkID0gdHJ1ZTsKICAgICAgfQogICAgfSk7CiAgfQogIGRpc2Nvbm5lY3RlZCgpIHsKICAgIHRoaXMuaGFzUHJvbWlzZVNldHRsZWQgPSB0cnVlOwogIH0KICByZWNvbm5lY3RlZCgpIHsKICAgIGlmICghdGhpcy5oYXNQcm9taXNlU2V0dGxlZCkgewogICAgICB0aGlzLmhhbmRsZVByb21pc2UodGhpcy5wcm9taXNlKTsKICAgIH0KICB9Cn07CnZhciByZXNvbHZlID0gZTQoUmVzb2x2ZURpcmVjdGl2ZSk7CnZhciByZXNvbHZlRXhlYyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGZ1bmNBcmcpID0+IHsKICByZXR1cm4gcmVzb2x2ZShmdW5jQXJnKCkpOwp9LCAicmVzb2x2ZUV4ZWMiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWVsZW1lbnRAMi4yLjMvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZWxlbWVudC9kaXN0X3RzL2RpcmVjdGl2ZXMvY2xhc3Nlcy5zdWJzY3JpYmVkaXJlY3RpdmUuanMKdmFyIFN1YnNjcmliZURpcmVjdGl2ZSA9IGNsYXNzIGV4dGVuZHMgZjUgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlN1YnNjcmliZURpcmVjdGl2ZSIpOwogIH0KICBvYnNlcnZhYmxlOwogIHN1YiA9IG51bGw7CiAgcmVuZGVyKG9ic2VydmFibGUyKSB7CiAgICBpZiAodGhpcy5vYnNlcnZhYmxlICE9PSBvYnNlcnZhYmxlMikgewogICAgICB0aGlzLnN1Yj8udW5zdWJzY3JpYmUoKTsKICAgICAgdGhpcy5vYnNlcnZhYmxlID0gb2JzZXJ2YWJsZTI7CiAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKSB7CiAgICAgICAgdGhpcy5zdWJzY3JpYmUob2JzZXJ2YWJsZTIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gRTsKICB9CiAgc3Vic2NyaWJlKG9ic2VydmFibGUyKSB7CiAgICB0aGlzLnN1YiA9IG9ic2VydmFibGUyLnN1YnNjcmliZSgodjQpID0+IHsKICAgICAgdGhpcy5zZXRWYWx1ZSh2NCk7CiAgICB9KTsKICB9CiAgZGlzY29ubmVjdGVkKCkgewogICAgdGhpcy5zdWI/LnVuc3Vic2NyaWJlKCk7CiAgfQogIHJlY29ubmVjdGVkKCkgewogICAgdGhpcy5zdWJzY3JpYmUodGhpcy5vYnNlcnZhYmxlKTsKICB9Cn07CnZhciBzdWJzY3JpYmUgPSBlNChTdWJzY3JpYmVEaXJlY3RpdmUpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZWxlbWVudEAyLjIuMy9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1lbGVtZW50L2Rpc3RfdHMvZGlyZWN0aXZlcy9jbGFzc2VzLnN1YnNjcmliZXdpdGh0ZW1wbGF0ZS5qcwp2YXIgU3Vic2NyaWJlV2l0aFRlbXBsYXRlRGlyZWN0aXZlID0gY2xhc3MgZXh0ZW5kcyBmNSB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiU3Vic2NyaWJlV2l0aFRlbXBsYXRlRGlyZWN0aXZlIik7CiAgfQogIG9ic2VydmFibGU7CiAgdGVtcGxhdGVGbjsKICBzdWIgPSBudWxsOwogIHJlbmRlcihvYnNlcnZhYmxlMiwgdGVtcGxhdGVGbikgewogICAgY29uc3QgY2hhbmdlZCA9IHRoaXMub2JzZXJ2YWJsZSAhPT0gb2JzZXJ2YWJsZTIgfHwgdGhpcy50ZW1wbGF0ZUZuICE9PSB0ZW1wbGF0ZUZuOwogICAgaWYgKGNoYW5nZWQpIHsKICAgICAgdGhpcy5zdWI/LnVuc3Vic2NyaWJlKCk7CiAgICAgIHRoaXMub2JzZXJ2YWJsZSA9IG9ic2VydmFibGUyOwogICAgICB0aGlzLnRlbXBsYXRlRm4gPSB0ZW1wbGF0ZUZuOwogICAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCkgewogICAgICAgIHRoaXMuc3RhcnRTdWJzY3JpcHRpb24oKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIEU7CiAgfQogIHN0YXJ0U3Vic2NyaXB0aW9uKCkgewogICAgdGhpcy5zdWIgPSB0aGlzLm9ic2VydmFibGUuc3Vic2NyaWJlKCh2NCkgPT4gewogICAgICBjb25zdCBvdXQgPSB0aGlzLnRlbXBsYXRlRm4odjQpOwogICAgICB0aGlzLnNldFZhbHVlKG91dCk7CiAgICB9KTsKICB9CiAgZGlzY29ubmVjdGVkKCkgewogICAgdGhpcy5zdWI/LnVuc3Vic2NyaWJlKCk7CiAgfQogIHJlY29ubmVjdGVkKCkgewogICAgdGhpcy5zdGFydFN1YnNjcmlwdGlvbigpOwogIH0KfTsKdmFyIHN1YnNjcmliZVdpdGhUZW1wbGF0ZSA9IGU0KFN1YnNjcmliZVdpdGhUZW1wbGF0ZURpcmVjdGl2ZSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbGl0LWh0bWxAMy4zLjIvbm9kZV9tb2R1bGVzL2xpdC1odG1sL2RpcmVjdGl2ZXMvcHJpdmF0ZS1hc3luYy1oZWxwZXJzLmpzCnZhciB0NyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoYXN5bmMgKHQ4LCBzOSkgPT4gewogIGZvciBhd2FpdCAoY29uc3QgaTEwIG9mIHQ4KSBpZiAoZmFsc2UgPT09IGF3YWl0IHM5KGkxMCkpIHJldHVybjsKfSwgInQiKTsKdmFyIHM4ID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgInMiKTsKICB9CiAgY29uc3RydWN0b3IodDgpIHsKICAgIHRoaXMuRyA9IHQ4OwogIH0KICBkaXNjb25uZWN0KCkgewogICAgdGhpcy5HID0gdm9pZCAwOwogIH0KICByZWNvbm5lY3QodDgpIHsKICAgIHRoaXMuRyA9IHQ4OwogIH0KICBkZXJlZigpIHsKICAgIHJldHVybiB0aGlzLkc7CiAgfQp9Owp2YXIgaTggPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiaSIpOwogIH0KICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMuWSA9IHZvaWQgMCwgdGhpcy5aID0gdm9pZCAwOwogIH0KICBnZXQoKSB7CiAgICByZXR1cm4gdGhpcy5ZOwogIH0KICBwYXVzZSgpIHsKICAgIHRoaXMuWSA/Pz0gbmV3IFByb21pc2UoKHQ4KSA9PiB0aGlzLlogPSB0OCk7CiAgfQogIHJlc3VtZSgpIHsKICAgIHRoaXMuWj8uKCksIHRoaXMuWSA9IHRoaXMuWiA9IHZvaWQgMDsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vbGl0LWh0bWxAMy4zLjIvbm9kZV9tb2R1bGVzL2xpdC1odG1sL2RpcmVjdGl2ZXMvdW50aWwuanMKdmFyIG4xMCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHQ4KSA9PiAhbjgodDgpICYmICJmdW5jdGlvbiIgPT0gdHlwZW9mIHQ4LnRoZW4sICJuIiksIGg1ID0gMTA3Mzc0MTgyMzsKdmFyIGM3ID0gY2xhc3MgZXh0ZW5kcyBmNSB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiYyIpOwogIH0KICBjb25zdHJ1Y3RvcigpIHsKICAgIHN1cGVyKC4uLmFyZ3VtZW50cyksIHRoaXMuXyRDd3QgPSBoNSwgdGhpcy5fJENidCA9IFtdLCB0aGlzLl8kQ0sgPSBuZXcgczgodGhpcyksIHRoaXMuXyRDWCA9IG5ldyBpOCgpOwogIH0KICByZW5kZXIoLi4uczkpIHsKICAgIHJldHVybiBzOS5maW5kKCh0OCkgPT4gIW4xMCh0OCkpID8/IEU7CiAgfQogIHVwZGF0ZShzOSwgaTEwKSB7CiAgICBjb25zdCBlMTAgPSB0aGlzLl8kQ2J0OwogICAgbGV0IHIxMCA9IGUxMC5sZW5ndGg7CiAgICB0aGlzLl8kQ2J0ID0gaTEwOwogICAgY29uc3QgbzEyID0gdGhpcy5fJENLLCBjMTAgPSB0aGlzLl8kQ1g7CiAgICB0aGlzLmlzQ29ubmVjdGVkIHx8IHRoaXMuZGlzY29ubmVjdGVkKCk7CiAgICBmb3IgKGxldCB0OCA9IDA7IHQ4IDwgaTEwLmxlbmd0aCAmJiAhKHQ4ID4gdGhpcy5fJEN3dCk7IHQ4KyspIHsKICAgICAgY29uc3QgczEwID0gaTEwW3Q4XTsKICAgICAgaWYgKCFuMTAoczEwKSkgcmV0dXJuIHRoaXMuXyRDd3QgPSB0OCwgczEwOwogICAgICB0OCA8IHIxMCAmJiBzMTAgPT09IGUxMFt0OF0gfHwgKHRoaXMuXyRDd3QgPSBoNSwgcjEwID0gMCwgUHJvbWlzZS5yZXNvbHZlKHMxMCkudGhlbihhc3luYyAodDkpID0+IHsKICAgICAgICBmb3IgKDsgYzEwLmdldCgpOyApIGF3YWl0IGMxMC5nZXQoKTsKICAgICAgICBjb25zdCBpMTEgPSBvMTIuZGVyZWYoKTsKICAgICAgICBpZiAodm9pZCAwICE9PSBpMTEpIHsKICAgICAgICAgIGNvbnN0IGUxMSA9IGkxMS5fJENidC5pbmRleE9mKHMxMCk7CiAgICAgICAgICBlMTEgPiAtMSAmJiBlMTEgPCBpMTEuXyRDd3QgJiYgKGkxMS5fJEN3dCA9IGUxMSwgaTExLnNldFZhbHVlKHQ5KSk7CiAgICAgICAgfQogICAgICB9KSk7CiAgICB9CiAgICByZXR1cm4gRTsKICB9CiAgZGlzY29ubmVjdGVkKCkgewogICAgdGhpcy5fJENLLmRpc2Nvbm5lY3QoKSwgdGhpcy5fJENYLnBhdXNlKCk7CiAgfQogIHJlY29ubmVjdGVkKCkgewogICAgdGhpcy5fJENLLnJlY29ubmVjdCh0aGlzKSwgdGhpcy5fJENYLnJlc3VtZSgpOwogIH0KfTsKdmFyIG00ID0gZTQoYzcpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2xpdC1odG1sQDMuMy4yL25vZGVfbW9kdWxlcy9saXQtaHRtbC9kaXJlY3RpdmVzL2FzeW5jLXJlcGxhY2UuanMKdmFyIG8xMSA9IGNsYXNzIGV4dGVuZHMgZjUgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIm8iKTsKICB9CiAgY29uc3RydWN0b3IoKSB7CiAgICBzdXBlciguLi5hcmd1bWVudHMpLCB0aGlzLl8kQ0sgPSBuZXcgczgodGhpcyksIHRoaXMuXyRDWCA9IG5ldyBpOCgpOwogIH0KICByZW5kZXIoaTEwLCBzOSkgewogICAgcmV0dXJuIEU7CiAgfQogIHVwZGF0ZShpMTAsIFtzOSwgcjEwXSkgewogICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQgfHwgdGhpcy5kaXNjb25uZWN0ZWQoKSwgczkgPT09IHRoaXMuXyRDSikgcmV0dXJuIEU7CiAgICB0aGlzLl8kQ0ogPSBzOTsKICAgIGxldCBuMTEgPSAwOwogICAgY29uc3QgeyBfJENLOiBvMTIsIF8kQ1g6IGg3IH0gPSB0aGlzOwogICAgcmV0dXJuIHQ3KHM5LCBhc3luYyAodDgpID0+IHsKICAgICAgZm9yICg7IGg3LmdldCgpOyApIGF3YWl0IGg3LmdldCgpOwogICAgICBjb25zdCBpMTEgPSBvMTIuZGVyZWYoKTsKICAgICAgaWYgKHZvaWQgMCAhPT0gaTExKSB7CiAgICAgICAgaWYgKGkxMS5fJENKICE9PSBzOSkgcmV0dXJuIGZhbHNlOwogICAgICAgIHZvaWQgMCAhPT0gcjEwICYmICh0OCA9IHIxMCh0OCwgbjExKSksIGkxMS5jb21taXRWYWx1ZSh0OCwgbjExKSwgbjExKys7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9KSwgRTsKICB9CiAgY29tbWl0VmFsdWUodDgsIGkxMCkgewogICAgdGhpcy5zZXRWYWx1ZSh0OCk7CiAgfQogIGRpc2Nvbm5lY3RlZCgpIHsKICAgIHRoaXMuXyRDSy5kaXNjb25uZWN0KCksIHRoaXMuXyRDWC5wYXVzZSgpOwogIH0KICByZWNvbm5lY3RlZCgpIHsKICAgIHRoaXMuXyRDSy5yZWNvbm5lY3QodGhpcyksIHRoaXMuXyRDWC5yZXN1bWUoKTsKICB9Cn07CnZhciBoNiA9IGU0KG8xMSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbGl0LWh0bWxAMy4zLjIvbm9kZV9tb2R1bGVzL2xpdC1odG1sL2RpcmVjdGl2ZXMvYXN5bmMtYXBwZW5kLmpzCnZhciBjOCA9IGU0KGNsYXNzIGV4dGVuZHMgbzExIHsKICBjb25zdHJ1Y3RvcihyMTApIHsKICAgIGlmIChzdXBlcihyMTApLCByMTAudHlwZSAhPT0gdDMuQ0hJTEQpIHRocm93IEVycm9yKCJhc3luY0FwcGVuZCBjYW4gb25seSBiZSB1c2VkIGluIGNoaWxkIGV4cHJlc3Npb25zIik7CiAgfQogIHVwZGF0ZShyMTAsIGUxMCkgewogICAgcmV0dXJuIHRoaXMuXyRDdHQgPSByMTAsIHN1cGVyLnVwZGF0ZShyMTAsIGUxMCk7CiAgfQogIGNvbW1pdFZhbHVlKHIxMCwgZTEwKSB7CiAgICAwID09PSBlMTAgJiYgajIodGhpcy5fJEN0dCk7CiAgICBjb25zdCBzOSA9IHYzKHRoaXMuXyRDdHQpOwogICAgdTQoczksIHIxMCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9saXQtaHRtbEAzLjMuMi9ub2RlX21vZHVsZXMvbGl0LWh0bWwvZGlyZWN0aXZlcy9rZXllZC5qcwp2YXIgaTkgPSBlNChjbGFzcyBleHRlbmRzIGk2IHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHN1cGVyKC4uLmFyZ3VtZW50cyksIHRoaXMua2V5ID0gQTsKICB9CiAgcmVuZGVyKHIxMCwgdDgpIHsKICAgIHJldHVybiB0aGlzLmtleSA9IHIxMCwgdDg7CiAgfQogIHVwZGF0ZShyMTAsIFt0OCwgZTEwXSkgewogICAgcmV0dXJuIHQ4ICE9PSB0aGlzLmtleSAmJiAocDUocjEwKSwgdGhpcy5rZXkgPSB0OCksIGUxMDsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2xpdC1odG1sQDMuMy4yL25vZGVfbW9kdWxlcy9saXQtaHRtbC9kaXJlY3RpdmVzL3JlcGVhdC5qcwp2YXIgdTUgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChlMTAsIHM5LCB0OCkgPT4gewogIGNvbnN0IHIxMCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgZm9yIChsZXQgbDUgPSBzOTsgbDUgPD0gdDg7IGw1KyspIHIxMC5zZXQoZTEwW2w1XSwgbDUpOwogIHJldHVybiByMTA7Cn0sICJ1IiksIGM5ID0gZTQoY2xhc3MgZXh0ZW5kcyBpNiB7CiAgY29uc3RydWN0b3IoZTEwKSB7CiAgICBpZiAoc3VwZXIoZTEwKSwgZTEwLnR5cGUgIT09IHQzLkNISUxEKSB0aHJvdyBFcnJvcigicmVwZWF0KCkgY2FuIG9ubHkgYmUgdXNlZCBpbiB0ZXh0IGV4cHJlc3Npb25zIik7CiAgfQogIGR0KGUxMCwgczksIHQ4KSB7CiAgICBsZXQgcjEwOwogICAgdm9pZCAwID09PSB0OCA/IHQ4ID0gczkgOiB2b2lkIDAgIT09IHM5ICYmIChyMTAgPSBzOSk7CiAgICBjb25zdCBsNSA9IFtdLCBvMTIgPSBbXTsKICAgIGxldCBpMTAgPSAwOwogICAgZm9yIChjb25zdCBzMTAgb2YgZTEwKSBsNVtpMTBdID0gcjEwID8gcjEwKHMxMCwgaTEwKSA6IGkxMCwgbzEyW2kxMF0gPSB0OChzMTAsIGkxMCksIGkxMCsrOwogICAgcmV0dXJuIHsgdmFsdWVzOiBvMTIsIGtleXM6IGw1IH07CiAgfQogIHJlbmRlcihlMTAsIHM5LCB0OCkgewogICAgcmV0dXJuIHRoaXMuZHQoZTEwLCBzOSwgdDgpLnZhbHVlczsKICB9CiAgdXBkYXRlKHM5LCBbdDgsIHIxMCwgYzEwXSkgewogICAgY29uc3QgZDQgPSBNMihzOSksIHsgdmFsdWVzOiBwNiwga2V5czogYTQgfSA9IHRoaXMuZHQodDgsIHIxMCwgYzEwKTsKICAgIGlmICghQXJyYXkuaXNBcnJheShkNCkpIHJldHVybiB0aGlzLnV0ID0gYTQsIHA2OwogICAgY29uc3QgaDcgPSB0aGlzLnV0ID8/PSBbXSwgdjQgPSBbXTsKICAgIGxldCBtNSwgeTMsIHgzID0gMCwgajMgPSBkNC5sZW5ndGggLSAxLCBrMyA9IDAsIHczID0gcDYubGVuZ3RoIC0gMTsKICAgIGZvciAoOyB4MyA8PSBqMyAmJiBrMyA8PSB3MzsgKSBpZiAobnVsbCA9PT0gZDRbeDNdKSB4MysrOwogICAgZWxzZSBpZiAobnVsbCA9PT0gZDRbajNdKSBqMy0tOwogICAgZWxzZSBpZiAoaDdbeDNdID09PSBhNFtrM10pIHY0W2szXSA9IHU0KGQ0W3gzXSwgcDZbazNdKSwgeDMrKywgazMrKzsKICAgIGVsc2UgaWYgKGg3W2ozXSA9PT0gYTRbdzNdKSB2NFt3M10gPSB1NChkNFtqM10sIHA2W3czXSksIGozLS0sIHczLS07CiAgICBlbHNlIGlmIChoN1t4M10gPT09IGE0W3czXSkgdjRbdzNdID0gdTQoZDRbeDNdLCBwNlt3M10pLCB2MyhzOSwgdjRbdzMgKyAxXSwgZDRbeDNdKSwgeDMrKywgdzMtLTsKICAgIGVsc2UgaWYgKGg3W2ozXSA9PT0gYTRbazNdKSB2NFtrM10gPSB1NChkNFtqM10sIHA2W2szXSksIHYzKHM5LCBkNFt4M10sIGQ0W2ozXSksIGozLS0sIGszKys7CiAgICBlbHNlIGlmICh2b2lkIDAgPT09IG01ICYmIChtNSA9IHU1KGE0LCBrMywgdzMpLCB5MyA9IHU1KGg3LCB4MywgajMpKSwgbTUuaGFzKGg3W3gzXSkpIGlmIChtNS5oYXMoaDdbajNdKSkgewogICAgICBjb25zdCBlMTAgPSB5My5nZXQoYTRbazNdKSwgdDkgPSB2b2lkIDAgIT09IGUxMCA/IGQ0W2UxMF0gOiBudWxsOwogICAgICBpZiAobnVsbCA9PT0gdDkpIHsKICAgICAgICBjb25zdCBlMTEgPSB2MyhzOSwgZDRbeDNdKTsKICAgICAgICB1NChlMTEsIHA2W2szXSksIHY0W2szXSA9IGUxMTsKICAgICAgfSBlbHNlIHY0W2szXSA9IHU0KHQ5LCBwNltrM10pLCB2MyhzOSwgZDRbeDNdLCB0OSksIGQ0W2UxMF0gPSBudWxsOwogICAgICBrMysrOwogICAgfSBlbHNlIGgzKGQ0W2ozXSksIGozLS07CiAgICBlbHNlIGgzKGQ0W3gzXSksIHgzKys7CiAgICBmb3IgKDsgazMgPD0gdzM7ICkgewogICAgICBjb25zdCBlMTAgPSB2MyhzOSwgdjRbdzMgKyAxXSk7CiAgICAgIHU0KGUxMCwgcDZbazNdKSwgdjRbazMrK10gPSBlMTA7CiAgICB9CiAgICBmb3IgKDsgeDMgPD0gajM7ICkgewogICAgICBjb25zdCBlMTAgPSBkNFt4MysrXTsKICAgICAgbnVsbCAhPT0gZTEwICYmIGgzKGUxMCk7CiAgICB9CiAgICByZXR1cm4gdGhpcy51dCA9IGE0LCBwNShzOSwgdjQpLCBFOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1lbGVtZW50QDIuMi4zL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWVsZW1lbnQvZGlzdF90cy9pbmRleC5qcwp2YXIgY3NzTWFuYWdlciA9IENzc01hbmFnZXIuZ2V0U2luZ2xldG9uKCk7CgovLyB0c19kZWJ1Z3VpL3NtYXJ0ZGItZGVidWd1aS50cwp2YXIgX29wbG9nRmlsdGVyX2RlYywgX3JldmVydEluUHJvZ3Jlc3NfZGVjLCBfcmV2ZXJ0UHJldmlld19kZWMsIF9yZXZlcnRUYXJnZXRTZXFfZGVjLCBfZXhwYW5kZWRPcGxvZ1NlcXNfZGVjLCBfZG9jdW1lbnRzVG90YWxfZGVjLCBfZG9jdW1lbnRzX2RlYywgX3NlbGVjdGVkQ29sbGVjdGlvbl9kZWMsIF9jb2xsZWN0aW9uc19kZWMsIF9vcGxvZ0VudHJpZXNfZGVjLCBfb3Bsb2dTdGF0c19kZWMsIF9tZXRyaWNzX2RlYywgX2FjdGl2ZVRhYl9kZWMsIF9yZWZyZXNoSW50ZXJ2YWxfZGVjLCBfYXBpQmFzZVVybF9kZWMsIF9zZXJ2ZXJfZGVjLCBfYSwgX1NtYXJ0ZGJEZWJ1Z1VpX2RlY29yYXRvcnMsIF9pbml0LCBfc2VydmVyLCBfYXBpQmFzZVVybCwgX3JlZnJlc2hJbnRlcnZhbCwgX2FjdGl2ZVRhYiwgX21ldHJpY3MsIF9vcGxvZ1N0YXRzLCBfb3Bsb2dFbnRyaWVzLCBfY29sbGVjdGlvbnMsIF9zZWxlY3RlZENvbGxlY3Rpb24sIF9kb2N1bWVudHMsIF9kb2N1bWVudHNUb3RhbCwgX2V4cGFuZGVkT3Bsb2dTZXFzLCBfcmV2ZXJ0VGFyZ2V0U2VxLCBfcmV2ZXJ0UHJldmlldywgX3JldmVydEluUHJvZ3Jlc3MsIF9vcGxvZ0ZpbHRlcjsKX1NtYXJ0ZGJEZWJ1Z1VpX2RlY29yYXRvcnMgPSBbY3VzdG9tRWxlbWVudCgic21hcnRkYi1kZWJ1Z3VpIildOwp2YXIgX1NtYXJ0ZGJEZWJ1Z1VpID0gY2xhc3MgX1NtYXJ0ZGJEZWJ1Z1VpIGV4dGVuZHMgKF9hID0gRGVlc0VsZW1lbnQsIF9zZXJ2ZXJfZGVjID0gW241KHsgdHlwZTogT2JqZWN0IH0pXSwgX2FwaUJhc2VVcmxfZGVjID0gW241KHsgdHlwZTogU3RyaW5nIH0pXSwgX3JlZnJlc2hJbnRlcnZhbF9kZWMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldLCBfYWN0aXZlVGFiX2RlYyA9IFtyNSgpXSwgX21ldHJpY3NfZGVjID0gW3I1KCldLCBfb3Bsb2dTdGF0c19kZWMgPSBbcjUoKV0sIF9vcGxvZ0VudHJpZXNfZGVjID0gW3I1KCldLCBfY29sbGVjdGlvbnNfZGVjID0gW3I1KCldLCBfc2VsZWN0ZWRDb2xsZWN0aW9uX2RlYyA9IFtyNSgpXSwgX2RvY3VtZW50c19kZWMgPSBbcjUoKV0sIF9kb2N1bWVudHNUb3RhbF9kZWMgPSBbcjUoKV0sIF9leHBhbmRlZE9wbG9nU2Vxc19kZWMgPSBbcjUoKV0sIF9yZXZlcnRUYXJnZXRTZXFfZGVjID0gW3I1KCldLCBfcmV2ZXJ0UHJldmlld19kZWMgPSBbcjUoKV0sIF9yZXZlcnRJblByb2dyZXNzX2RlYyA9IFtyNSgpXSwgX29wbG9nRmlsdGVyX2RlYyA9IFtyNSgpXSwgX2EpIHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX3NlcnZlciwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDgsIHRoaXMsIG51bGwpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDExLCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfYXBpQmFzZVVybCwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDEyLCB0aGlzLCBudWxsKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCAxNSwgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX3JlZnJlc2hJbnRlcnZhbCwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDE2LCB0aGlzLCAyZTMpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDE5LCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfYWN0aXZlVGFiLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgMjAsIHRoaXMsICJkYXNoYm9hcmQiKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCAyMywgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX21ldHJpY3MsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCAyNCwgdGhpcywgbnVsbCkpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgMjcsIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9vcGxvZ1N0YXRzLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgMjgsIHRoaXMsIG51bGwpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDMxLCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfb3Bsb2dFbnRyaWVzLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgMzIsIHRoaXMsIFtdKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCAzNSwgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX2NvbGxlY3Rpb25zLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgMzYsIHRoaXMsIFtdKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCAzOSwgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX3NlbGVjdGVkQ29sbGVjdGlvbiwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDQwLCB0aGlzLCBudWxsKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCA0MywgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX2RvY3VtZW50cywgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDQ0LCB0aGlzLCBbXSkpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgNDcsIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9kb2N1bWVudHNUb3RhbCwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDQ4LCB0aGlzLCAwKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCA1MSwgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX2V4cGFuZGVkT3Bsb2dTZXFzLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgNTIsIHRoaXMsIC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCkpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDU1LCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfcmV2ZXJ0VGFyZ2V0U2VxLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgNTYsIHRoaXMsIDApKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDU5LCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfcmV2ZXJ0UHJldmlldywgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDYwLCB0aGlzLCBudWxsKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCA2MywgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX3JldmVydEluUHJvZ3Jlc3MsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCA2NCwgdGhpcywgZmFsc2UpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDY3LCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfb3Bsb2dGaWx0ZXIsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCA2OCwgdGhpcywge30pKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDcxLCB0aGlzKTsKICAgIF9fcHVibGljRmllbGQodGhpcywgInJlZnJlc2hUaW1lciIpOwogIH0KICBhc3luYyBjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgIGF3YWl0IHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7CiAgICBpZiAoIXRoaXMuc2VydmVyICYmIHRoaXMuYXBpQmFzZVVybCA9PT0gbnVsbCkgewogICAgICB0aGlzLmFwaUJhc2VVcmwgPSAiIjsKICAgIH0KICAgIHRoaXMuc3RhcnRSZWZyZXNoaW5nKCk7CiAgfQogIGFzeW5jIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgYXdhaXQgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgIHRoaXMuc3RvcFJlZnJlc2hpbmcoKTsKICB9CiAgc3RhcnRSZWZyZXNoaW5nKCkgewogICAgaWYgKHRoaXMucmVmcmVzaFRpbWVyKSBjbGVhckludGVydmFsKHRoaXMucmVmcmVzaFRpbWVyKTsKICAgIHRoaXMucmVmcmVzaCgpOwogICAgdGhpcy5yZWZyZXNoVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLnJlZnJlc2goKSwgdGhpcy5yZWZyZXNoSW50ZXJ2YWwpOwogIH0KICBzdG9wUmVmcmVzaGluZygpIHsKICAgIGlmICh0aGlzLnJlZnJlc2hUaW1lcikgewogICAgICBjbGVhckludGVydmFsKHRoaXMucmVmcmVzaFRpbWVyKTsKICAgICAgdGhpcy5yZWZyZXNoVGltZXIgPSBudWxsOwogICAgfQogIH0KICAvLyAtLS0gRGF0YSBhY2Nlc3MgbGF5ZXIgKHN1cHBvcnRzIGJvdGggZGlyZWN0IHNlcnZlciBjYWxscyBhbmQgSFRUUCBmZXRjaCkgLS0tCiAgZ2V0IHVzZUh0dHAoKSB7CiAgICByZXR1cm4gdGhpcy5hcGlCYXNlVXJsICE9PSBudWxsOwogIH0KICBhc3luYyBhcGlGZXRjaChwYXRoMiwgcGFyYW1zID0ge30pIHsKICAgIGNvbnN0IGJhc2UgPSB0aGlzLmFwaUJhc2VVcmwgPz8gIiI7CiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKGAke2Jhc2V9L2FwaS9zbWFydGRiJHtwYXRoMn1gLCB3aW5kb3cubG9jYXRpb24ub3JpZ2luKTsKICAgIGZvciAoY29uc3QgW2szLCB2NF0gb2YgT2JqZWN0LmVudHJpZXMocGFyYW1zKSkgewogICAgICBpZiAodjQgIT09IHZvaWQgMCAmJiB2NCAhPT0gbnVsbCkgdXJsLnNlYXJjaFBhcmFtcy5zZXQoazMsIFN0cmluZyh2NCkpOwogICAgfQogICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsLnRvU3RyaW5nKCkpOwogICAgaWYgKCFyZXMub2spIHRocm93IG5ldyBFcnJvcihgSFRUUCAke3Jlcy5zdGF0dXN9YCk7CiAgICByZXR1cm4gcmVzLmpzb24oKTsKICB9CiAgYXN5bmMgcmVmcmVzaCgpIHsKICAgIGlmICghdGhpcy51c2VIdHRwICYmICF0aGlzLnNlcnZlcj8ucnVubmluZykgewogICAgICB0aGlzLm1ldHJpY3MgPSBudWxsOwogICAgICB0aGlzLm9wbG9nU3RhdHMgPSBudWxsOwogICAgICByZXR1cm47CiAgICB9CiAgICB0cnkgewogICAgICBpZiAodGhpcy51c2VIdHRwKSB7CiAgICAgICAgY29uc3QgW21ldHJpY3MsIG9wbG9nU3RhdHNdID0gYXdhaXQgUHJvbWlzZS5hbGwoWwogICAgICAgICAgdGhpcy5hcGlGZXRjaCgiL21ldHJpY3MiKSwKICAgICAgICAgIHRoaXMuYXBpRmV0Y2goIi9vcGxvZy9zdGF0cyIpCiAgICAgICAgXSk7CiAgICAgICAgdGhpcy5tZXRyaWNzID0gbWV0cmljczsKICAgICAgICB0aGlzLm9wbG9nU3RhdHMgPSBvcGxvZ1N0YXRzOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IFttZXRyaWNzLCBvcGxvZ1N0YXRzXSA9IGF3YWl0IFByb21pc2UuYWxsKFsKICAgICAgICAgIHRoaXMuc2VydmVyLmdldE1ldHJpY3MoKSwKICAgICAgICAgIHRoaXMuc2VydmVyLmdldE9wTG9nU3RhdHMoKQogICAgICAgIF0pOwogICAgICAgIHRoaXMubWV0cmljcyA9IG1ldHJpY3M7CiAgICAgICAgdGhpcy5vcGxvZ1N0YXRzID0gb3Bsb2dTdGF0czsKICAgICAgfQogICAgICBpZiAodGhpcy5hY3RpdmVUYWIgPT09ICJjb2xsZWN0aW9ucyIgJiYgdGhpcy5jb2xsZWN0aW9ucy5sZW5ndGggPT09IDApIHsKICAgICAgICBhd2FpdCB0aGlzLmxvYWRDb2xsZWN0aW9ucygpOwogICAgICB9CiAgICAgIGlmICh0aGlzLmFjdGl2ZVRhYiA9PT0gIm9wbG9nIiB8fCB0aGlzLmFjdGl2ZVRhYiA9PT0gInJldmVydCIpIHsKICAgICAgICBhd2FpdCB0aGlzLmxvYWRPcGxvZygpOwogICAgICB9CiAgICB9IGNhdGNoIHsKICAgIH0KICB9CiAgYXN5bmMgbG9hZE9wbG9nKCkgewogICAgaWYgKCF0aGlzLnVzZUh0dHAgJiYgIXRoaXMuc2VydmVyPy5ydW5uaW5nKSByZXR1cm47CiAgICBpZiAodGhpcy51c2VIdHRwKSB7CiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXBpRmV0Y2goIi9vcGxvZyIsIHsgbGltaXQ6IDIwMCB9KTsKICAgICAgdGhpcy5vcGxvZ0VudHJpZXMgPSByZXN1bHQuZW50cmllczsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2VydmVyLmdldE9wTG9nKHsgbGltaXQ6IDIwMCB9KTsKICAgICAgdGhpcy5vcGxvZ0VudHJpZXMgPSByZXN1bHQuZW50cmllczsKICAgIH0KICB9CiAgYXN5bmMgbG9hZENvbGxlY3Rpb25zKCkgewogICAgaWYgKCF0aGlzLnVzZUh0dHAgJiYgIXRoaXMuc2VydmVyPy5ydW5uaW5nKSByZXR1cm47CiAgICBpZiAodGhpcy51c2VIdHRwKSB7CiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXBpRmV0Y2goIi9jb2xsZWN0aW9ucyIpOwogICAgICB0aGlzLmNvbGxlY3Rpb25zID0gcmVzdWx0LmNvbGxlY3Rpb25zOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5jb2xsZWN0aW9ucyA9IGF3YWl0IHRoaXMuc2VydmVyLmdldENvbGxlY3Rpb25zKCk7CiAgICB9CiAgfQogIGFzeW5jIHNlbGVjdENvbGxlY3Rpb24oZGIsIG5hbWUpIHsKICAgIHRoaXMuc2VsZWN0ZWRDb2xsZWN0aW9uID0geyBkYiwgbmFtZSB9OwogICAgaWYgKHRoaXMudXNlSHR0cCkgewogICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFwaUZldGNoKAogICAgICAgICIvZG9jdW1lbnRzIiwKICAgICAgICB7IGRiLCBjb2xsZWN0aW9uOiBuYW1lLCBsaW1pdDogNTAsIHNraXA6IDAgfQogICAgICApOwogICAgICB0aGlzLmRvY3VtZW50cyA9IHJlc3VsdC5kb2N1bWVudHM7CiAgICAgIHRoaXMuZG9jdW1lbnRzVG90YWwgPSByZXN1bHQudG90YWw7CiAgICB9IGVsc2UgewogICAgICBpZiAoIXRoaXMuc2VydmVyPy5ydW5uaW5nKSByZXR1cm47CiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2VydmVyLmdldERvY3VtZW50cyhkYiwgbmFtZSwgNTAsIDApOwogICAgICB0aGlzLmRvY3VtZW50cyA9IHJlc3VsdC5kb2N1bWVudHM7CiAgICAgIHRoaXMuZG9jdW1lbnRzVG90YWwgPSByZXN1bHQudG90YWw7CiAgICB9CiAgfQogIHRvZ2dsZU9wbG9nRW50cnkoc2VxKSB7CiAgICBjb25zdCBuZXh0MiA9IG5ldyBTZXQodGhpcy5leHBhbmRlZE9wbG9nU2Vxcyk7CiAgICBpZiAobmV4dDIuaGFzKHNlcSkpIHsKICAgICAgbmV4dDIuZGVsZXRlKHNlcSk7CiAgICB9IGVsc2UgewogICAgICBuZXh0Mi5hZGQoc2VxKTsKICAgIH0KICAgIHRoaXMuZXhwYW5kZWRPcGxvZ1NlcXMgPSBuZXh0MjsKICB9CiAgYXN5bmMgaGFuZGxlUHJldmlld1JldmVydCgpIHsKICAgIGlmICh0aGlzLnJldmVydFRhcmdldFNlcSA8PSAwKSByZXR1cm47CiAgICBpZiAodGhpcy51c2VIdHRwKSB7CiAgICAgIHRoaXMucmV2ZXJ0UHJldmlldyA9IGF3YWl0IHRoaXMuYXBpRmV0Y2goCiAgICAgICAgIi9yZXZlcnQiLAogICAgICAgIHsgc2VxOiB0aGlzLnJldmVydFRhcmdldFNlcSwgZHJ5UnVuOiB0cnVlIH0KICAgICAgKTsKICAgIH0gZWxzZSB7CiAgICAgIGlmICghdGhpcy5zZXJ2ZXI/LnJ1bm5pbmcpIHJldHVybjsKICAgICAgdGhpcy5yZXZlcnRQcmV2aWV3ID0gYXdhaXQgdGhpcy5zZXJ2ZXIucmV2ZXJ0VG9TZXEodGhpcy5yZXZlcnRUYXJnZXRTZXEsIHRydWUpOwogICAgfQogIH0KICBhc3luYyBoYW5kbGVFeGVjdXRlUmV2ZXJ0KCkgewogICAgaWYgKHRoaXMucmV2ZXJ0VGFyZ2V0U2VxIDw9IDApIHJldHVybjsKICAgIHRoaXMucmV2ZXJ0SW5Qcm9ncmVzcyA9IHRydWU7CiAgICB0cnkgewogICAgICBpZiAodGhpcy51c2VIdHRwKSB7CiAgICAgICAgYXdhaXQgdGhpcy5hcGlGZXRjaCgiL3JldmVydCIsIHsgc2VxOiB0aGlzLnJldmVydFRhcmdldFNlcSwgZHJ5UnVuOiBmYWxzZSB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoIXRoaXMuc2VydmVyPy5ydW5uaW5nKSByZXR1cm47CiAgICAgICAgYXdhaXQgdGhpcy5zZXJ2ZXIucmV2ZXJ0VG9TZXEodGhpcy5yZXZlcnRUYXJnZXRTZXEsIGZhbHNlKTsKICAgICAgfQogICAgICB0aGlzLnJldmVydFByZXZpZXcgPSBudWxsOwogICAgICB0aGlzLnJldmVydFRhcmdldFNlcSA9IDA7CiAgICAgIGF3YWl0IHRoaXMucmVmcmVzaCgpOwogICAgfSBmaW5hbGx5IHsKICAgICAgdGhpcy5yZXZlcnRJblByb2dyZXNzID0gZmFsc2U7CiAgICB9CiAgfQogIGFzeW5jIHN3aXRjaFRhYih0YWIyKSB7CiAgICB0aGlzLmFjdGl2ZVRhYiA9IHRhYjI7CiAgICBpZiAodGFiMiA9PT0gImNvbGxlY3Rpb25zIikgewogICAgICBhd2FpdCB0aGlzLmxvYWRDb2xsZWN0aW9ucygpOwogICAgfQogICAgaWYgKHRhYjIgPT09ICJvcGxvZyIgfHwgdGFiMiA9PT0gInJldmVydCIpIHsKICAgICAgYXdhaXQgdGhpcy5sb2FkT3Bsb2coKTsKICAgIH0KICB9CiAgLy8gLS0tIERpZmYgY29tcHV0YXRpb24gLS0tCiAgY29tcHV0ZURpZmYocHJldiwgbmV4dDIpIHsKICAgIGNvbnN0IGRpZmZzID0gW107CiAgICB0aGlzLmRpZmZSZWN1cnNpdmUocHJldiB8fCB7fSwgbmV4dDIgfHwge30sICIiLCBkaWZmcyk7CiAgICByZXR1cm4gZGlmZnM7CiAgfQogIGRpZmZSZWN1cnNpdmUoYTQsIGI0LCBwYXRoMiwgZGlmZnMpIHsKICAgIGNvbnN0IGFLZXlzID0gbmV3IFNldChhNCAmJiB0eXBlb2YgYTQgPT09ICJvYmplY3QiID8gT2JqZWN0LmtleXMoYTQpIDogW10pOwogICAgY29uc3QgYktleXMgPSBuZXcgU2V0KGI0ICYmIHR5cGVvZiBiNCA9PT0gIm9iamVjdCIgPyBPYmplY3Qua2V5cyhiNCkgOiBbXSk7CiAgICBjb25zdCBhbGxLZXlzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoWy4uLmFLZXlzLCAuLi5iS2V5c10pOwogICAgZm9yIChjb25zdCBrZXkyIG9mIGFsbEtleXMpIHsKICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoMiA/IGAke3BhdGgyfS4ke2tleTJ9YCA6IGtleTI7CiAgICAgIGNvbnN0IGluQSA9IGFLZXlzLmhhcyhrZXkyKTsKICAgICAgY29uc3QgaW5CID0gYktleXMuaGFzKGtleTIpOwogICAgICBpZiAoIWluQSAmJiBpbkIpIHsKICAgICAgICBkaWZmcy5wdXNoKHsgcGF0aDogZnVsbFBhdGgsIHR5cGU6ICJhZGRlZCIsIG5ld1ZhbHVlOiBiNFtrZXkyXSB9KTsKICAgICAgfSBlbHNlIGlmIChpbkEgJiYgIWluQikgewogICAgICAgIGRpZmZzLnB1c2goeyBwYXRoOiBmdWxsUGF0aCwgdHlwZTogInJlbW92ZWQiLCBvbGRWYWx1ZTogYTRba2V5Ml0gfSk7CiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGE0W2tleTJdID09PSAib2JqZWN0IiAmJiBhNFtrZXkyXSAhPT0gbnVsbCAmJiB0eXBlb2YgYjRba2V5Ml0gPT09ICJvYmplY3QiICYmIGI0W2tleTJdICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KGE0W2tleTJdKSAmJiAhQXJyYXkuaXNBcnJheShiNFtrZXkyXSkpIHsKICAgICAgICB0aGlzLmRpZmZSZWN1cnNpdmUoYTRba2V5Ml0sIGI0W2tleTJdLCBmdWxsUGF0aCwgZGlmZnMpOwogICAgICB9IGVsc2UgaWYgKEpTT04uc3RyaW5naWZ5KGE0W2tleTJdKSAhPT0gSlNPTi5zdHJpbmdpZnkoYjRba2V5Ml0pKSB7CiAgICAgICAgZGlmZnMucHVzaCh7CiAgICAgICAgICBwYXRoOiBmdWxsUGF0aCwKICAgICAgICAgIHR5cGU6ICJjaGFuZ2VkIiwKICAgICAgICAgIG9sZFZhbHVlOiBhNFtrZXkyXSwKICAgICAgICAgIG5ld1ZhbHVlOiBiNFtrZXkyXQogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgfQogIGZvcm1hdFZhbHVlKHZhbCkgewogICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHZvaWQgMCkgcmV0dXJuICJudWxsIjsKICAgIGlmICh0eXBlb2YgdmFsID09PSAic3RyaW5nIikgcmV0dXJuIGAiJHt2YWx9ImA7CiAgICBpZiAodHlwZW9mIHZhbCA9PT0gIm9iamVjdCIpIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWwpOwogICAgcmV0dXJuIFN0cmluZyh2YWwpOwogIH0KICBmb3JtYXRUaW1lKHRpbWVzdGFtcE1zKSB7CiAgICByZXR1cm4gbmV3IERhdGUodGltZXN0YW1wTXMpLnRvTG9jYWxlVGltZVN0cmluZyh2b2lkIDAsIHsKICAgICAgaG91cjogIjItZGlnaXQiLAogICAgICBtaW51dGU6ICIyLWRpZ2l0IiwKICAgICAgc2Vjb25kOiAiMi1kaWdpdCIsCiAgICAgIGZyYWN0aW9uYWxTZWNvbmREaWdpdHM6IDMKICAgIH0pOwogIH0KICAvLyAtLS0gUmVuZGVyIC0tLQogIHJlbmRlcigpIHsKICAgIGNvbnN0IGlzT25saW5lID0gdGhpcy51c2VIdHRwID8gdGhpcy5tZXRyaWNzICE9PSBudWxsIDogdGhpcy5zZXJ2ZXI/LnJ1bm5pbmcgPz8gZmFsc2U7CiAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9ImRlYnVndWkiPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkZXItbGVmdCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj5TbWFydERCIERlYnVnPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN0YXR1cy1kb3QgJHtpc09ubGluZSA/ICIiIDogIm9mZmxpbmUifSI+PC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0idGFicyI+CiAgICAgICAgICAke1siZGFzaGJvYXJkIiwgImNvbGxlY3Rpb25zIiwgIm9wbG9nIiwgInJldmVydCJdLm1hcCgKICAgICAgKHRhYjIpID0+IGIyYAogICAgICAgICAgICAgIDxidXR0b24KICAgICAgICAgICAgICAgIGNsYXNzPSJ0YWIgJHt0aGlzLmFjdGl2ZVRhYiA9PT0gdGFiMiA/ICJhY3RpdmUiIDogIiJ9IgogICAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5zd2l0Y2hUYWIodGFiMil9CiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgJHt0YWIyID09PSAiZGFzaGJvYXJkIiA/ICJEYXNoYm9hcmQiIDogdGFiMiA9PT0gImNvbGxlY3Rpb25zIiA/ICJDb2xsZWN0aW9ucyIgOiB0YWIyID09PSAib3Bsb2ciID8gIk9wTG9nIiA6ICJSZXZlcnQifQogICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICBgCiAgICApfQogICAgICAgIDwvZGl2PgoKICAgICAgICAke3RoaXMuYWN0aXZlVGFiID09PSAiZGFzaGJvYXJkIiA/IHRoaXMucmVuZGVyRGFzaGJvYXJkKCkgOiAiIn0KICAgICAgICAke3RoaXMuYWN0aXZlVGFiID09PSAiY29sbGVjdGlvbnMiID8gdGhpcy5yZW5kZXJDb2xsZWN0aW9ucygpIDogIiJ9CiAgICAgICAgJHt0aGlzLmFjdGl2ZVRhYiA9PT0gIm9wbG9nIiA/IHRoaXMucmVuZGVyT3Bsb2coKSA6ICIifQogICAgICAgICR7dGhpcy5hY3RpdmVUYWIgPT09ICJyZXZlcnQiID8gdGhpcy5yZW5kZXJSZXZlcnQoKSA6ICIifQogICAgICA8L2Rpdj4KICAgIGA7CiAgfQogIHJlbmRlckRhc2hib2FyZCgpIHsKICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0ic3RhdHMtZ3JpZCI+CiAgICAgICAgPGRpdiBjbGFzcz0ic3RhdC1jYXJkIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InN0YXQtbGFiZWwiPkRhdGFiYXNlczwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ic3RhdC12YWx1ZSI+JHt0aGlzLm1ldHJpY3M/LmRhdGFiYXNlcyA/PyAiLSJ9PC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic3RhdC1jYXJkIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InN0YXQtbGFiZWwiPkNvbGxlY3Rpb25zPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGF0LXZhbHVlIj4ke3RoaXMubWV0cmljcz8uY29sbGVjdGlvbnMgPz8gIi0ifTwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InN0YXQtY2FyZCI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGF0LWxhYmVsIj5PcExvZyBFbnRyaWVzPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGF0LXZhbHVlIj4ke3RoaXMub3Bsb2dTdGF0cz8udG90YWxFbnRyaWVzID8/ICItIn08L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzdGF0LWNhcmQiPgogICAgICAgICAgPGRpdiBjbGFzcz0ic3RhdC1sYWJlbCI+Q3VycmVudCBTZXE8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InN0YXQtdmFsdWUiPiR7dGhpcy5vcGxvZ1N0YXRzPy5jdXJyZW50U2VxID8/ICItIn08L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzdGF0LWNhcmQiPgogICAgICAgICAgPGRpdiBjbGFzcz0ic3RhdC1sYWJlbCI+VXB0aW1lPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGF0LXZhbHVlIj4KICAgICAgICAgICAgJHt0aGlzLm1ldHJpY3MgPyB0aGlzLmZvcm1hdFVwdGltZSh0aGlzLm1ldHJpY3MudXB0aW1lU2Vjb25kcykgOiAiLSJ9CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CgogICAgICAke3RoaXMub3Bsb2dTdGF0cyA/IGIyYAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkLXRpdGxlIj5PcGVyYXRpb25zIEJyZWFrZG93bjwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN0YXRzLWdyaWQiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3RhdC1jYXJkIj4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3RhdC1sYWJlbCI+SW5zZXJ0czwvZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGF0LXZhbHVlIiBzdHlsZT0iY29sb3I6ICMyMmM1NWUiPgogICAgICAgICAgICAgICAgICAgICR7dGhpcy5vcGxvZ1N0YXRzLmVudHJpZXNCeU9wLmluc2VydH0KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN0YXQtY2FyZCI+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN0YXQtbGFiZWwiPlVwZGF0ZXM8L2Rpdj4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3RhdC12YWx1ZSIgc3R5bGU9ImNvbG9yOiAjM2I4MmY2Ij4KICAgICAgICAgICAgICAgICAgICAke3RoaXMub3Bsb2dTdGF0cy5lbnRyaWVzQnlPcC51cGRhdGV9CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGF0LWNhcmQiPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGF0LWxhYmVsIj5EZWxldGVzPC9kaXY+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN0YXQtdmFsdWUiIHN0eWxlPSJjb2xvcjogI2VmNDQ0NCI+CiAgICAgICAgICAgICAgICAgICAgJHt0aGlzLm9wbG9nU3RhdHMuZW50cmllc0J5T3AuZGVsZXRlfQogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIGAgOiAiIn0KICAgIGA7CiAgfQogIGZvcm1hdFVwdGltZShzZWNzKSB7CiAgICBpZiAoc2VjcyA8IDYwKSByZXR1cm4gYCR7c2Vjc31zYDsKICAgIGlmIChzZWNzIDwgMzYwMCkgcmV0dXJuIGAke01hdGguZmxvb3Ioc2VjcyAvIDYwKX1tYDsKICAgIHJldHVybiBgJHtNYXRoLmZsb29yKHNlY3MgLyAzNjAwKX1oICR7TWF0aC5mbG9vcihzZWNzICUgMzYwMCAvIDYwKX1tYDsKICB9CiAgcmVuZGVyQ29sbGVjdGlvbnMoKSB7CiAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9ImNvbGxlY3Rpb25zLWxheW91dCI+CiAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1zaWRlYmFyIj4KICAgICAgICAgICR7dGhpcy5jb2xsZWN0aW9ucy5sZW5ndGggPT09IDAgPyBiMmA8ZGl2IGNsYXNzPSJlbXB0eS1zdGF0ZSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJlbXB0eS1zdGF0ZS10ZXh0Ij5ObyBjb2xsZWN0aW9uczwvZGl2PgogICAgICAgICAgICAgIDwvZGl2PmAgOiB0aGlzLmNvbGxlY3Rpb25zLm1hcCgKICAgICAgKGMxMCkgPT4gYjJgCiAgICAgICAgICAgICAgICAgIDxkaXYKICAgICAgICAgICAgICAgICAgICBjbGFzcz0iY29sbC1pdGVtICR7dGhpcy5zZWxlY3RlZENvbGxlY3Rpb24/LmRiID09PSBjMTAuZGIgJiYgdGhpcy5zZWxlY3RlZENvbGxlY3Rpb24/Lm5hbWUgPT09IGMxMC5uYW1lID8gInNlbGVjdGVkIiA6ICIifSIKICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLnNlbGVjdENvbGxlY3Rpb24oYzEwLmRiLCBjMTAubmFtZSl9CiAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLW5hbWUiPiR7YzEwLmRifS4ke2MxMC5uYW1lfTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtY291bnQiPiR7YzEwLmNvdW50fSBkb2N1bWVudHM8L2Rpdj4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICBgCiAgICApfQogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJkb2Mtdmlld2VyIj4KICAgICAgICAgICR7dGhpcy5zZWxlY3RlZENvbGxlY3Rpb24gPyBiMmAKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQtdGl0bGUiPgogICAgICAgICAgICAgICAgICAke3RoaXMuc2VsZWN0ZWRDb2xsZWN0aW9uLmRifS4ke3RoaXMuc2VsZWN0ZWRDb2xsZWN0aW9uLm5hbWV9CiAgICAgICAgICAgICAgICAgICgke3RoaXMuZG9jdW1lbnRzVG90YWx9IHRvdGFsKQogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAke3RoaXMuZG9jdW1lbnRzLmxlbmd0aCA9PT0gMCA/IGIyYDxkaXYgY2xhc3M9ImVtcHR5LXN0YXRlIj4KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImVtcHR5LXN0YXRlLXRleHQiPk5vIGRvY3VtZW50czwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PmAgOiB0aGlzLmRvY3VtZW50cy5tYXAoCiAgICAgIChkb2MpID0+IGIyYAogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkb2MtaXRlbSI+JHtKU09OLnN0cmluZ2lmeShkb2MsIG51bGwsIDIpfTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgYAogICAgKX0KICAgICAgICAgICAgICBgIDogYjJgPGRpdiBjbGFzcz0iZW1wdHktc3RhdGUiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZW1wdHktc3RhdGUtdGV4dCI+U2VsZWN0IGEgY29sbGVjdGlvbjwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZW1wdHktc3RhdGUtc3ViIj4KICAgICAgICAgICAgICAgICAgQ2hvb3NlIGEgY29sbGVjdGlvbiBmcm9tIHRoZSBzaWRlYmFyIHRvIGJyb3dzZSBpdHMgZG9jdW1lbnRzCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L2Rpdj5gfQogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgfQogIHJlbmRlck9wbG9nKCkgewogICAgY29uc3QgZmlsdGVyZWQgPSB0aGlzLmdldEZpbHRlcmVkT3Bsb2coKTsKICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0ib3Bsb2ctZmlsdGVycyI+CiAgICAgICAgPGJ1dHRvbgogICAgICAgICAgY2xhc3M9ImZpbHRlci1jaGlwICR7IXRoaXMub3Bsb2dGaWx0ZXIub3AgPyAiYWN0aXZlIiA6ICIifSIKICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMub3Bsb2dGaWx0ZXIgPSB7IC4uLnRoaXMub3Bsb2dGaWx0ZXIsIG9wOiB2b2lkIDAgfX0KICAgICAgICA+CiAgICAgICAgICBBbGwKICAgICAgICA8L2J1dHRvbj4KICAgICAgICA8YnV0dG9uCiAgICAgICAgICBjbGFzcz0iZmlsdGVyLWNoaXAgJHt0aGlzLm9wbG9nRmlsdGVyLm9wID09PSAiaW5zZXJ0IiA/ICJhY3RpdmUiIDogIiJ9IgogICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5vcGxvZ0ZpbHRlciA9IHsgLi4udGhpcy5vcGxvZ0ZpbHRlciwgb3A6ICJpbnNlcnQiIH19CiAgICAgICAgPgogICAgICAgICAgSW5zZXJ0cwogICAgICAgIDwvYnV0dG9uPgogICAgICAgIDxidXR0b24KICAgICAgICAgIGNsYXNzPSJmaWx0ZXItY2hpcCAke3RoaXMub3Bsb2dGaWx0ZXIub3AgPT09ICJ1cGRhdGUiID8gImFjdGl2ZSIgOiAiIn0iCiAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLm9wbG9nRmlsdGVyID0geyAuLi50aGlzLm9wbG9nRmlsdGVyLCBvcDogInVwZGF0ZSIgfX0KICAgICAgICA+CiAgICAgICAgICBVcGRhdGVzCiAgICAgICAgPC9idXR0b24+CiAgICAgICAgPGJ1dHRvbgogICAgICAgICAgY2xhc3M9ImZpbHRlci1jaGlwICR7dGhpcy5vcGxvZ0ZpbHRlci5vcCA9PT0gImRlbGV0ZSIgPyAiYWN0aXZlIiA6ICIifSIKICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMub3Bsb2dGaWx0ZXIgPSB7IC4uLnRoaXMub3Bsb2dGaWx0ZXIsIG9wOiAiZGVsZXRlIiB9fQogICAgICAgID4KICAgICAgICAgIERlbGV0ZXMKICAgICAgICA8L2J1dHRvbj4KICAgICAgPC9kaXY+CgogICAgICAke2ZpbHRlcmVkLmxlbmd0aCA9PT0gMCA/IGIyYDxkaXYgY2xhc3M9ImVtcHR5LXN0YXRlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZW1wdHktc3RhdGUtdGV4dCI+Tm8gb3Bsb2cgZW50cmllczwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJlbXB0eS1zdGF0ZS1zdWIiPldyaXRlIG9wZXJhdGlvbnMgd2lsbCBhcHBlYXIgaGVyZSBhcyB0aGV5IG9jY3VyPC9kaXY+CiAgICAgICAgICA8L2Rpdj5gIDogWy4uLmZpbHRlcmVkXS5yZXZlcnNlKCkubWFwKChlbnRyeSkgPT4gdGhpcy5yZW5kZXJPcGxvZ0VudHJ5KGVudHJ5KSl9CiAgICBgOwogIH0KICBnZXRGaWx0ZXJlZE9wbG9nKCkgewogICAgbGV0IGVudHJpZXMgPSB0aGlzLm9wbG9nRW50cmllczsKICAgIGlmICh0aGlzLm9wbG9nRmlsdGVyLm9wKSB7CiAgICAgIGVudHJpZXMgPSBlbnRyaWVzLmZpbHRlcigoZTEwKSA9PiBlMTAub3AgPT09IHRoaXMub3Bsb2dGaWx0ZXIub3ApOwogICAgfQogICAgaWYgKHRoaXMub3Bsb2dGaWx0ZXIuY29sbGVjdGlvbikgewogICAgICBlbnRyaWVzID0gZW50cmllcy5maWx0ZXIoCiAgICAgICAgKGUxMCkgPT4gYCR7ZTEwLmRifS4ke2UxMC5jb2xsZWN0aW9ufWAgPT09IHRoaXMub3Bsb2dGaWx0ZXIuY29sbGVjdGlvbgogICAgICApOwogICAgfQogICAgcmV0dXJuIGVudHJpZXM7CiAgfQogIHJlbmRlck9wbG9nRW50cnkoZW50cnkpIHsKICAgIGNvbnN0IGlzRXhwYW5kZWQgPSB0aGlzLmV4cGFuZGVkT3Bsb2dTZXFzLmhhcyhlbnRyeS5zZXEpOwogICAgY29uc3QgZGlmZnMgPSBpc0V4cGFuZGVkID8gdGhpcy5jb21wdXRlRGlmZihlbnRyeS5wcmV2aW91c0RvY3VtZW50LCBlbnRyeS5kb2N1bWVudCkgOiBbXTsKICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0ib3Bsb2ctZW50cnkiPgogICAgICAgIDxkaXYgY2xhc3M9Im9wbG9nLWhlYWRlciIgQGNsaWNrPSR7KCkgPT4gdGhpcy50b2dnbGVPcGxvZ0VudHJ5KGVudHJ5LnNlcSl9PgogICAgICAgICAgPHNwYW4gY2xhc3M9Im9wbG9nLXNlcSI+IyR7ZW50cnkuc2VxfTwvc3Bhbj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJvcC1iYWRnZSAke2VudHJ5Lm9wfSI+JHtlbnRyeS5vcH08L3NwYW4+CiAgICAgICAgICA8c3BhbiBjbGFzcz0ib3Bsb2ctbnMiPiR7ZW50cnkuZGJ9LiR7ZW50cnkuY29sbGVjdGlvbn08L3NwYW4+CiAgICAgICAgICA8c3BhbiBjbGFzcz0ib3Bsb2ctZG9jaWQiPiR7ZW50cnkuZG9jdW1lbnRJZC5zdWJzdHJpbmcoMCwgMTIpfS4uLjwvc3Bhbj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJvcGxvZy10aW1lIj4ke3RoaXMuZm9ybWF0VGltZShlbnRyeS50aW1lc3RhbXBNcyl9PC9zcGFuPgogICAgICAgICAgPHNwYW4gY2xhc3M9Im9wbG9nLWV4cGFuZCAke2lzRXhwYW5kZWQgPyAiZXhwYW5kZWQiIDogIiJ9Ij4mIzk2NTQ7PC9zcGFuPgogICAgICAgIDwvZGl2PgoKICAgICAgICAke2lzRXhwYW5kZWQgPyBiMmAKICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJvcGxvZy1kaWZmIj4KICAgICAgICAgICAgICAgICR7ZW50cnkub3AgPT09ICJpbnNlcnQiID8gYjJgCiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWZmLWxhYmVsIj5JbnNlcnRlZCBEb2N1bWVudDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZG9jLWpzb24tYmxvY2siPgogICAgICAgICAgICAgICAgICAgICAgICAke0pTT04uc3RyaW5naWZ5KGVudHJ5LmRvY3VtZW50LCBudWxsLCAyKX0KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIGAgOiBlbnRyeS5vcCA9PT0gImRlbGV0ZSIgPyBiMmAKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGlmZi1sYWJlbCI+RGVsZXRlZCBEb2N1bWVudDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkb2MtanNvbi1ibG9jayI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgJHtKU09OLnN0cmluZ2lmeShlbnRyeS5wcmV2aW91c0RvY3VtZW50LCBudWxsLCAyKX0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICBgIDogYjJgCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpZmYtbGFiZWwiPkNoYW5nZXM8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgJHtkaWZmcy5sZW5ndGggPiAwID8gZGlmZnMubWFwKChkNCkgPT4gdGhpcy5yZW5kZXJEaWZmUm93KGQ0KSkgOiBiMmA8ZGl2IHN0eWxlPSJmb250LXNpemU6IDEycHg7IGNvbG9yOiAjOTRhM2I4OyBwYWRkaW5nOiA0cHggMCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vIGZpZWxkLWxldmVsIGNoYW5nZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PmB9CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpZmYtbGFiZWwiPkJlZm9yZTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkb2MtanNvbi1ibG9jayI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgJHtKU09OLnN0cmluZ2lmeShlbnRyeS5wcmV2aW91c0RvY3VtZW50LCBudWxsLCAyKX0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpZmYtbGFiZWwiPkFmdGVyPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRvYy1qc29uLWJsb2NrIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAke0pTT04uc3RyaW5naWZ5KGVudHJ5LmRvY3VtZW50LCBudWxsLCAyKX0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICBgfQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICBgIDogIiJ9CiAgICAgIDwvZGl2PgogICAgYDsKICB9CiAgcmVuZGVyRGlmZlJvdyhkaWZmKSB7CiAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9ImRpZmYtcm93Ij4KICAgICAgICA8c3BhbiBjbGFzcz0iZGlmZi1wYXRoIj4ke2RpZmYucGF0aH08L3NwYW4+CiAgICAgICAgJHtkaWZmLnR5cGUgPT09ICJhZGRlZCIgPyBiMmA8c3BhbiBjbGFzcz0iZGlmZi1hZGRlZCI+KyAke3RoaXMuZm9ybWF0VmFsdWUoZGlmZi5uZXdWYWx1ZSl9PC9zcGFuPmAgOiBkaWZmLnR5cGUgPT09ICJyZW1vdmVkIiA/IGIyYDxzcGFuIGNsYXNzPSJkaWZmLXJlbW92ZWQiPi0gJHt0aGlzLmZvcm1hdFZhbHVlKGRpZmYub2xkVmFsdWUpfTwvc3Bhbj5gIDogYjJgCiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGlmZi1jaGFuZ2VkLW9sZCI+JHt0aGlzLmZvcm1hdFZhbHVlKGRpZmYub2xkVmFsdWUpfTwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogIzk0YTNiOCI+LT48L3NwYW4+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGlmZi1jaGFuZ2VkLW5ldyI+JHt0aGlzLmZvcm1hdFZhbHVlKGRpZmYubmV3VmFsdWUpfTwvc3Bhbj4KICAgICAgICAgICAgICBgfQogICAgICA8L2Rpdj4KICAgIGA7CiAgfQogIHJlbmRlclJldmVydCgpIHsKICAgIGNvbnN0IGN1cnJlbnRTZXEgPSB0aGlzLm9wbG9nU3RhdHM/LmN1cnJlbnRTZXEgPz8gMDsKICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0iY2FyZCI+CiAgICAgICAgPGRpdiBjbGFzcz0iY2FyZC10aXRsZSI+UG9pbnQtaW4tVGltZSBSZXZlcnQ8L2Rpdj4KICAgICAgICA8cCBzdHlsZT0iZm9udC1zaXplOiAxM3B4OyBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM2NDc0OGIiLCAiIzk0YTNiOCIpfTsgbWFyZ2luLWJvdHRvbTogMTZweCI+CiAgICAgICAgICBSZXZlcnQgdGhlIGRhdGFiYXNlIHRvIGEgc3BlY2lmaWMgb3Bsb2cgc2VxdWVuY2UgbnVtYmVyLiBBbGwgb3BlcmF0aW9ucyBhZnRlciB0aGF0CiAgICAgICAgICBwb2ludCB3aWxsIGJlIHVuZG9uZSBpbiByZXZlcnNlIG9yZGVyLgogICAgICAgICAgQ3VycmVudCBzZXF1ZW5jZTogPHN0cm9uZz4ke2N1cnJlbnRTZXF9PC9zdHJvbmc+CiAgICAgICAgPC9wPgoKICAgICAgICA8ZGl2IGNsYXNzPSJyZXZlcnQtY29udHJvbHMiPgogICAgICAgICAgPGxhYmVsIHN0eWxlPSJmb250LXNpemU6IDEzcHg7IGZvbnQtd2VpZ2h0OiA1MDAiPlRhcmdldCBzZXE6PC9sYWJlbD4KICAgICAgICAgIDxpbnB1dAogICAgICAgICAgICBjbGFzcz0icmV2ZXJ0LWlucHV0IgogICAgICAgICAgICB0eXBlPSJudW1iZXIiCiAgICAgICAgICAgIG1pbj0iMCIKICAgICAgICAgICAgbWF4PSIke2N1cnJlbnRTZXF9IgogICAgICAgICAgICAudmFsdWU9JHtTdHJpbmcodGhpcy5yZXZlcnRUYXJnZXRTZXEpfQogICAgICAgICAgICBAaW5wdXQ9JHsoZTEwKSA9PiB7CiAgICAgIHRoaXMucmV2ZXJ0VGFyZ2V0U2VxID0gcGFyc2VJbnQoZTEwLnRhcmdldC52YWx1ZSkgfHwgMDsKICAgICAgdGhpcy5yZXZlcnRQcmV2aWV3ID0gbnVsbDsKICAgIH19CiAgICAgICAgICAvPgogICAgICAgICAgPGJ1dHRvbgogICAgICAgICAgICBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IgogICAgICAgICAgICA/ZGlzYWJsZWQ9JHt0aGlzLnJldmVydFRhcmdldFNlcSA8PSAwIHx8IHRoaXMucmV2ZXJ0VGFyZ2V0U2VxID4gY3VycmVudFNlcX0KICAgICAgICAgICAgQGNsaWNrPSR7dGhpcy5oYW5kbGVQcmV2aWV3UmV2ZXJ0fQogICAgICAgICAgPgogICAgICAgICAgICBQcmV2aWV3CiAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgJHt0aGlzLnJldmVydFByZXZpZXcgPyBiMmAKICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyZXZlcnQtcHJldmlldyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyZXZlcnQtcHJldmlldy10aXRsZSI+CiAgICAgICAgICAgICAgICAgIFJldmVydCBQcmV2aWV3OiAke3RoaXMucmV2ZXJ0UHJldmlldy5yZXZlcnRlZH0gb3BlcmF0aW9ucyB0byB1bmRvCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICR7dGhpcy5yZXZlcnRQcmV2aWV3LmVudHJpZXM/Lm1hcCgKICAgICAgKGUxMCkgPT4gYjJgCiAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iZm9udC1zaXplOiAxMnB4OyBwYWRkaW5nOiAycHggMDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZSI+CiAgICAgICAgICAgICAgICAgICAgICAjJHtlMTAuc2VxfSAke2UxMC5vcH0gJHtlMTAuZGJ9LiR7ZTEwLmNvbGxlY3Rpb259ICgke2UxMC5kb2N1bWVudElkfSkKICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgYAogICAgKX0KICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9Im1hcmdpbi10b3A6IDEycHgiPgogICAgICAgICAgICAgICAgICA8YnV0dG9uCiAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImJ0biBidG4tZGFuZ2VyIgogICAgICAgICAgICAgICAgICAgID9kaXNhYmxlZD0ke3RoaXMucmV2ZXJ0SW5Qcm9ncmVzc30KICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHt0aGlzLmhhbmRsZUV4ZWN1dGVSZXZlcnR9CiAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICAke3RoaXMucmV2ZXJ0SW5Qcm9ncmVzcyA/ICJSZXZlcnRpbmcuLi4iIDogIkV4ZWN1dGUgUmV2ZXJ0In0KICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgYCA6ICIifQogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9ImNhcmQiPgogICAgICAgIDxkaXYgY2xhc3M9ImNhcmQtdGl0bGUiPlJlY2VudCBPcGVyYXRpb25zIChuZXdlc3QgZmlyc3QpPC9kaXY+CiAgICAgICAgJHt0aGlzLm9wbG9nRW50cmllcy5sZW5ndGggPT09IDAgPyBiMmA8ZGl2IGNsYXNzPSJlbXB0eS1zdGF0ZSI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZW1wdHktc3RhdGUtdGV4dCI+Tm8gb3BlcmF0aW9ucyByZWNvcmRlZCB5ZXQ8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+YCA6IFsuLi50aGlzLm9wbG9nRW50cmllc10ucmV2ZXJzZSgpLnNsaWNlKDAsIDIwKS5tYXAoCiAgICAgIChlbnRyeSkgPT4gYjJgCiAgICAgICAgICAgICAgICAgIDxkaXYKICAgICAgICAgICAgICAgICAgICBzdHlsZT0iZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IHBhZGRpbmc6IDZweCAwOyBmb250LXNpemU6IDEycHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2YxZjVmOSIsICIjMjcyNzJhIil9IgogICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im9wbG9nLXNlcSI+IyR7ZW50cnkuc2VxfTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ib3AtYmFkZ2UgJHtlbnRyeS5vcH0iPiR7ZW50cnkub3B9PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJmbGV4OiAxIj4ke2VudHJ5LmRifS4ke2VudHJ5LmNvbGxlY3Rpb259PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM5NGEzYjgiLCAiIzY0NzQ4YiIpfSIKICAgICAgICAgICAgICAgICAgICAgID4ke2VudHJ5LmRvY3VtZW50SWQuc3Vic3RyaW5nKDAsIDEyKX08L3NwYW4KICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgYAogICAgKX0KICAgICAgPC9kaXY+CiAgICBgOwogIH0KfTsKX2luaXQgPSBfX2RlY29yYXRvclN0YXJ0KF9hKTsKX3NlcnZlciA9IG5ldyBXZWFrTWFwKCk7Cl9hcGlCYXNlVXJsID0gbmV3IFdlYWtNYXAoKTsKX3JlZnJlc2hJbnRlcnZhbCA9IG5ldyBXZWFrTWFwKCk7Cl9hY3RpdmVUYWIgPSBuZXcgV2Vha01hcCgpOwpfbWV0cmljcyA9IG5ldyBXZWFrTWFwKCk7Cl9vcGxvZ1N0YXRzID0gbmV3IFdlYWtNYXAoKTsKX29wbG9nRW50cmllcyA9IG5ldyBXZWFrTWFwKCk7Cl9jb2xsZWN0aW9ucyA9IG5ldyBXZWFrTWFwKCk7Cl9zZWxlY3RlZENvbGxlY3Rpb24gPSBuZXcgV2Vha01hcCgpOwpfZG9jdW1lbnRzID0gbmV3IFdlYWtNYXAoKTsKX2RvY3VtZW50c1RvdGFsID0gbmV3IFdlYWtNYXAoKTsKX2V4cGFuZGVkT3Bsb2dTZXFzID0gbmV3IFdlYWtNYXAoKTsKX3JldmVydFRhcmdldFNlcSA9IG5ldyBXZWFrTWFwKCk7Cl9yZXZlcnRQcmV2aWV3ID0gbmV3IFdlYWtNYXAoKTsKX3JldmVydEluUHJvZ3Jlc3MgPSBuZXcgV2Vha01hcCgpOwpfb3Bsb2dGaWx0ZXIgPSBuZXcgV2Vha01hcCgpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgInNlcnZlciIsIF9zZXJ2ZXJfZGVjLCBfU21hcnRkYkRlYnVnVWksIF9zZXJ2ZXIpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgImFwaUJhc2VVcmwiLCBfYXBpQmFzZVVybF9kZWMsIF9TbWFydGRiRGVidWdVaSwgX2FwaUJhc2VVcmwpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgInJlZnJlc2hJbnRlcnZhbCIsIF9yZWZyZXNoSW50ZXJ2YWxfZGVjLCBfU21hcnRkYkRlYnVnVWksIF9yZWZyZXNoSW50ZXJ2YWwpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgImFjdGl2ZVRhYiIsIF9hY3RpdmVUYWJfZGVjLCBfU21hcnRkYkRlYnVnVWksIF9hY3RpdmVUYWIpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgIm1ldHJpY3MiLCBfbWV0cmljc19kZWMsIF9TbWFydGRiRGVidWdVaSwgX21ldHJpY3MpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgIm9wbG9nU3RhdHMiLCBfb3Bsb2dTdGF0c19kZWMsIF9TbWFydGRiRGVidWdVaSwgX29wbG9nU3RhdHMpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgIm9wbG9nRW50cmllcyIsIF9vcGxvZ0VudHJpZXNfZGVjLCBfU21hcnRkYkRlYnVnVWksIF9vcGxvZ0VudHJpZXMpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgImNvbGxlY3Rpb25zIiwgX2NvbGxlY3Rpb25zX2RlYywgX1NtYXJ0ZGJEZWJ1Z1VpLCBfY29sbGVjdGlvbnMpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgInNlbGVjdGVkQ29sbGVjdGlvbiIsIF9zZWxlY3RlZENvbGxlY3Rpb25fZGVjLCBfU21hcnRkYkRlYnVnVWksIF9zZWxlY3RlZENvbGxlY3Rpb24pOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgImRvY3VtZW50cyIsIF9kb2N1bWVudHNfZGVjLCBfU21hcnRkYkRlYnVnVWksIF9kb2N1bWVudHMpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgImRvY3VtZW50c1RvdGFsIiwgX2RvY3VtZW50c1RvdGFsX2RlYywgX1NtYXJ0ZGJEZWJ1Z1VpLCBfZG9jdW1lbnRzVG90YWwpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgImV4cGFuZGVkT3Bsb2dTZXFzIiwgX2V4cGFuZGVkT3Bsb2dTZXFzX2RlYywgX1NtYXJ0ZGJEZWJ1Z1VpLCBfZXhwYW5kZWRPcGxvZ1NlcXMpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgInJldmVydFRhcmdldFNlcSIsIF9yZXZlcnRUYXJnZXRTZXFfZGVjLCBfU21hcnRkYkRlYnVnVWksIF9yZXZlcnRUYXJnZXRTZXEpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgInJldmVydFByZXZpZXciLCBfcmV2ZXJ0UHJldmlld19kZWMsIF9TbWFydGRiRGVidWdVaSwgX3JldmVydFByZXZpZXcpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgInJldmVydEluUHJvZ3Jlc3MiLCBfcmV2ZXJ0SW5Qcm9ncmVzc19kZWMsIF9TbWFydGRiRGVidWdVaSwgX3JldmVydEluUHJvZ3Jlc3MpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgIm9wbG9nRmlsdGVyIiwgX29wbG9nRmlsdGVyX2RlYywgX1NtYXJ0ZGJEZWJ1Z1VpLCBfb3Bsb2dGaWx0ZXIpOwpfU21hcnRkYkRlYnVnVWkgPSBfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgMCwgIlNtYXJ0ZGJEZWJ1Z1VpIiwgX1NtYXJ0ZGJEZWJ1Z1VpX2RlY29yYXRvcnMsIF9TbWFydGRiRGVidWdVaSk7Cl9fbmFtZShfU21hcnRkYkRlYnVnVWksICJTbWFydGRiRGVidWdVaSIpOwpfX3B1YmxpY0ZpZWxkKF9TbWFydGRiRGVidWdVaSwgInN0eWxlcyIsIFsKICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgaWAKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGZvbnQtZmFtaWx5OiAnSW50ZXInLCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIFJvYm90bywgc2Fucy1zZXJpZjsKICAgICAgfQoKICAgICAgLmRlYnVndWkgewogICAgICAgIHBhZGRpbmc6IDI0cHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmOGZhZmMiLCAiIzA5MDkwYiIpfTsKICAgICAgICBtaW4taGVpZ2h0OiAxMDB2aDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwZjE3MmEiLCAiI2YxZjVmOSIpfTsKICAgICAgfQoKICAgICAgLmhlYWRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyNHB4OwogICAgICB9CgogICAgICAuaGVhZGVyLWxlZnQgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDEycHg7CiAgICAgIH0KCiAgICAgIC50aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAyNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICAgIH0KCiAgICAgIC5zdGF0dXMtZG90IHsKICAgICAgICB3aWR0aDogMTBweDsKICAgICAgICBoZWlnaHQ6IDEwcHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMjJjNTVlIiwgIiMyMmM1NWUiKX07CiAgICAgIH0KCiAgICAgIC5zdGF0dXMtZG90Lm9mZmxpbmUgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZWY0NDQ0IiwgIiNlZjQ0NDQiKX07CiAgICAgIH0KCiAgICAgIC8qIFRhYnMgKi8KICAgICAgLnRhYnMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZ2FwOiAycHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlMmU4ZjAiLCAiIzFlMWUxZSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgICAgIHBhZGRpbmc6IDNweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyNHB4OwogICAgICB9CgogICAgICAudGFiIHsKICAgICAgICBwYWRkaW5nOiA4cHggMjBweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzY0NzQ4YiIsICIjOTRhM2I4Iil9OwogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgICB9CgogICAgICAudGFiOmhvdmVyIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwZjE3MmEiLCAiI2UyZThmMCIpfTsKICAgICAgfQoKICAgICAgLnRhYi5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmZmZmIiwgIiMyNzI3MmEiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMGYxNzJhIiwgIiNmMWY1ZjkiKX07CiAgICAgICAgYm94LXNoYWRvdzogMCAxcHggM3B4ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsMCwwLDAuMDgpIiwgInJnYmEoMCwwLDAsMC4zKSIpfTsKICAgICAgfQoKICAgICAgLyogQ2FyZHMgKi8KICAgICAgLmNhcmQgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmZmZmIiwgIiMxODE4MWIiKX07CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlMmU4ZjAiLCAiIzI3MjcyYSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMnB4OwogICAgICAgIHBhZGRpbmc6IDIwcHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICAgICAgfQoKICAgICAgLmNhcmQtdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzY0NzQ4YiIsICIjOTRhM2I4Iil9OwogICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuNXB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDEycHg7CiAgICAgIH0KCiAgICAgIC8qIFN0YXRzIGdyaWQgKi8KICAgICAgLnN0YXRzLWdyaWQgewogICAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maWxsLCBtaW5tYXgoMTgwcHgsIDFmcikpOwogICAgICAgIGdhcDogMTZweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyNHB4OwogICAgICB9CgogICAgICAuc3RhdC1jYXJkIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMTgxODFiIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTJlOGYwIiwgIiMyNzI3MmEiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTJweDsKICAgICAgICBwYWRkaW5nOiAyMHB4OwogICAgICB9CgogICAgICAuc3RhdC1sYWJlbCB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjOTRhM2I4IiwgIiM2NDc0OGIiKX07CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogMC41cHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgICB9CgogICAgICAuc3RhdC12YWx1ZSB7CiAgICAgICAgZm9udC1zaXplOiAyOHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMGYxNzJhIiwgIiNmMWY1ZjkiKX07CiAgICAgIH0KCiAgICAgIC8qIENvbGxlY3Rpb25zICovCiAgICAgIC5jb2xsZWN0aW9ucy1sYXlvdXQgewogICAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAyODBweCAxZnI7CiAgICAgICAgZ2FwOiAxNnB4OwogICAgICAgIG1pbi1oZWlnaHQ6IDUwMHB4OwogICAgICB9CgogICAgICAuY29sbC1zaWRlYmFyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMTgxODFiIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTJlOGYwIiwgIiMyNzI3MmEiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTJweDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAuY29sbC1pdGVtIHsKICAgICAgICBwYWRkaW5nOiAxMnB4IDE2cHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2YxZjVmOSIsICIjMjcyNzJhIil9OwogICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xcyBlYXNlOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgfQoKICAgICAgLmNvbGwtaXRlbTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmOGZhZmMiLCAiIzFmMWYyMyIpfTsKICAgICAgfQoKICAgICAgLmNvbGwtaXRlbS5zZWxlY3RlZCB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlZmY2ZmYiLCAiIzFlM2E1ZiIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMxZDRlZDgiLCAiIzkzYzVmZCIpfTsKICAgICAgfQoKICAgICAgLmNvbGwtbmFtZSB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgfQoKICAgICAgLmNvbGwtY291bnQgewogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM5NGEzYjgiLCAiIzY0NzQ4YiIpfTsKICAgICAgICBtYXJnaW4tdG9wOiAycHg7CiAgICAgIH0KCiAgICAgIC5kb2Mtdmlld2VyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMTgxODFiIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTJlOGYwIiwgIiMyNzI3MmEiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTJweDsKICAgICAgICBwYWRkaW5nOiAyMHB4OwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICAuZG9jLWl0ZW0gewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjhmYWZjIiwgIiMwZjBmMTIiKX07CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlMmU4ZjAiLCAiIzI3MjcyYSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgcGFkZGluZzogMTJweCAxNnB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgICAgICBmb250LWZhbWlseTogJ0pldEJyYWlucyBNb25vJywgJ0ZpcmEgQ29kZScsIG1vbm9zcGFjZTsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNTsKICAgICAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICAgICAgd29yZC1icmVhazogYnJlYWstYWxsOwogICAgICB9CgogICAgICAvKiBPcExvZyAqLwogICAgICAub3Bsb2ctZmlsdGVycyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBnYXA6IDhweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4OwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgfQoKICAgICAgLmZpbHRlci1jaGlwIHsKICAgICAgICBwYWRkaW5nOiA2cHggMTJweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTJlOGYwIiwgIiMyNzI3MmEiKX07CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiIzE4MTgxYiIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM2NDc0OGIiLCAiIzk0YTNiOCIpfTsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgfQoKICAgICAgLmZpbHRlci1jaGlwOmhvdmVyLAogICAgICAuZmlsdGVyLWNoaXAuYWN0aXZlIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2VmZjZmZiIsICIjMWUzYTVmIil9OwogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM5M2M1ZmQiLCAiIzNiODJmNiIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMxZDRlZDgiLCAiIzkzYzVmZCIpfTsKICAgICAgfQoKICAgICAgLm9wbG9nLWVudHJ5IHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMTgxODFiIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTJlOGYwIiwgIiMyNzI3MmEiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0cmFuc2l0aW9uOiBib3gtc2hhZG93IDAuMTVzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5vcGxvZy1lbnRyeTpob3ZlciB7CiAgICAgICAgYm94LXNoYWRvdzogMCAycHggOHB4ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsMCwwLDAuMDYpIiwgInJnYmEoMCwwLDAsMC4yKSIpfTsKICAgICAgfQoKICAgICAgLm9wbG9nLWhlYWRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogMTJweDsKICAgICAgICBwYWRkaW5nOiAxMnB4IDE2cHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CgogICAgICAub3Bsb2ctc2VxIHsKICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM5NGEzYjgiLCAiIzY0NzQ4YiIpfTsKICAgICAgICBtaW4td2lkdGg6IDQwcHg7CiAgICAgIH0KCiAgICAgIC5vcC1iYWRnZSB7CiAgICAgICAgcGFkZGluZzogM3B4IDhweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogMC4zcHg7CiAgICAgIH0KCiAgICAgIC5vcC1iYWRnZS5pbnNlcnQgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZGNmY2U3IiwgIiMxNDUzMmQiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMTU4MDNkIiwgIiM4NmVmYWMiKX07CiAgICAgIH0KCiAgICAgIC5vcC1iYWRnZS51cGRhdGUgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZGJlYWZlIiwgIiMxZTNhOGEiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMWU0MGFmIiwgIiM5M2M1ZmQiKX07CiAgICAgIH0KCiAgICAgIC5vcC1iYWRnZS5kZWxldGUgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmVlMmUyIiwgIiM3ZjFkMWQiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZGMyNjI2IiwgIiNmY2E1YTUiKX07CiAgICAgIH0KCiAgICAgIC5vcGxvZy1ucyB7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgZmxleDogMTsKICAgICAgfQoKICAgICAgLm9wbG9nLXRpbWUgewogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM5NGEzYjgiLCAiIzY0NzQ4YiIpfTsKICAgICAgfQoKICAgICAgLm9wbG9nLWRvY2lkIHsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM5NGEzYjgiLCAiIzY0NzQ4YiIpfTsKICAgICAgfQoKICAgICAgLm9wbG9nLWV4cGFuZCB7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzk0YTNiOCIsICIjNjQ3NDhiIil9OwogICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjJzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5vcGxvZy1leHBhbmQuZXhwYW5kZWQgewogICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsKICAgICAgfQoKICAgICAgLm9wbG9nLWRpZmYgewogICAgICAgIHBhZGRpbmc6IDAgMTZweCAxNnB4OwogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2YxZjVmOSIsICIjMjcyNzJhIil9OwogICAgICB9CgogICAgICAuZGlmZi1yb3cgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGJhc2VsaW5lOwogICAgICAgIGdhcDogOHB4OwogICAgICAgIHBhZGRpbmc6IDRweCAwOwogICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjY7CiAgICAgIH0KCiAgICAgIC5kaWZmLXBhdGggewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzY0NzQ4YiIsICIjOTRhM2I4Iil9OwogICAgICAgIG1pbi13aWR0aDogMTIwcHg7CiAgICAgIH0KCiAgICAgIC5kaWZmLWFkZGVkIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMxNTgwM2QiLCAiIzg2ZWZhYyIpfTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2YwZmRmNCIsICIjMDUyZTE2Iil9OwogICAgICAgIHBhZGRpbmc6IDFweCA0cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICB9CgogICAgICAuZGlmZi1yZW1vdmVkIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNkYzI2MjYiLCAiI2ZjYTVhNSIpfTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZlZjJmMiIsICIjNDUwYTBhIil9OwogICAgICAgIHBhZGRpbmc6IDFweCA0cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICB9CgogICAgICAuZGlmZi1jaGFuZ2VkLW9sZCB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZGMyNjI2IiwgIiNmY2E1YTUiKX07CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZWYyZjIiLCAiIzQ1MGEwYSIpfTsKICAgICAgICBwYWRkaW5nOiAxcHggNHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDsKICAgICAgfQoKICAgICAgLmRpZmYtY2hhbmdlZC1uZXcgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzE1ODAzZCIsICIjODZlZmFjIil9OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjBmZGY0IiwgIiMwNTJlMTYiKX07CiAgICAgICAgcGFkZGluZzogMXB4IDRweDsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgIH0KCiAgICAgIC8qIFJldmVydCAqLwogICAgICAucmV2ZXJ0LWNvbnRyb2xzIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGdhcDogMTJweDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7CiAgICAgIH0KCiAgICAgIC5yZXZlcnQtaW5wdXQgewogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2UyZThmMCIsICIjMjcyNzJhIil9OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmZmZmIiwgIiMwZjBmMTIiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMGYxNzJhIiwgIiNmMWY1ZjkiKX07CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgICAgICAgd2lkdGg6IDEyMHB4OwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5yZXZlcnQtaW5wdXQ6Zm9jdXMgewogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzYjgyZjYiLCAiIzNiODJmNiIpfTsKICAgICAgfQoKICAgICAgLmJ0biB7CiAgICAgICAgcGFkZGluZzogOHB4IDE2cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5idG4tcHJpbWFyeSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzYjgyZjYiLCAiIzI1NjNlYiIpfTsKICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgIH0KCiAgICAgIC5idG4tcHJpbWFyeTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMyNTYzZWIiLCAiIzFkNGVkOCIpfTsKICAgICAgfQoKICAgICAgLmJ0bi1kYW5nZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZWY0NDQ0IiwgIiNkYzI2MjYiKX07CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICAuYnRuLWRhbmdlcjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNkYzI2MjYiLCAiI2I5MWMxYyIpfTsKICAgICAgfQoKICAgICAgLmJ0bjpkaXNhYmxlZCB7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7CiAgICAgIH0KCiAgICAgIC5yZXZlcnQtcHJldmlldyB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZiZWIiLCAiIzFjMTMwNSIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZjZDM0ZCIsICIjODU0ZDBlIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICAgICAgcGFkZGluZzogMTZweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4OwogICAgICB9CgogICAgICAucmV2ZXJ0LXByZXZpZXctdGl0bGUgewogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzkyNDAwZSIsICIjZmJiZjI0Iil9OwogICAgICB9CgogICAgICAuZW1wdHktc3RhdGUgewogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBwYWRkaW5nOiA0OHB4IDI0cHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjOTRhM2I4IiwgIiM2NDc0OGIiKX07CiAgICAgIH0KCiAgICAgIC5lbXB0eS1zdGF0ZS10ZXh0IHsKICAgICAgICBmb250LXNpemU6IDE1cHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogNHB4OwogICAgICB9CgogICAgICAuZW1wdHktc3RhdGUtc3ViIHsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgIH0KCiAgICAgIC5kb2MtanNvbi1ibG9jayB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmOGZhZmMiLCAiIzBmMGYxMiIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2UyZThmMCIsICIjMjcyNzJhIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBwYWRkaW5nOiAxMnB4OwogICAgICAgIG1hcmdpbi10b3A6IDhweDsKICAgICAgICBmb250LWZhbWlseTogJ0pldEJyYWlucyBNb25vJywgJ0ZpcmEgQ29kZScsIG1vbm9zcGFjZTsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNTsKICAgICAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICAgICAgd29yZC1icmVhazogYnJlYWstYWxsOwogICAgICAgIG1heC1oZWlnaHQ6IDMwMHB4OwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICAuZGlmZi1sYWJlbCB7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogMC41cHg7CiAgICAgICAgbWFyZ2luLXRvcDogMTJweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiA0cHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNjQ3NDhiIiwgIiM5NGEzYjgiKX07CiAgICAgIH0KICAgIGAKXSk7Cl9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCAxLCBfU21hcnRkYkRlYnVnVWkpOwp2YXIgU21hcnRkYkRlYnVnVWkgPSBfU21hcnRkYkRlYnVnVWk7CmV4cG9ydCB7CiAgU21hcnRkYkRlYnVnVWkKfTsKLyohIEJ1bmRsZWQgbGljZW5zZSBpbmZvcm1hdGlvbjoKCnN3ZWV0LXNjcm9sbC9zd2VldC1zY3JvbGwuanM6CiAgKCohIEBwcmVzZXJ2ZSBzd2VldC1zY3JvbGwgdjQuMC4wIC0gdHN1eW9zaGl3YWRhIHwgTUlUIExpY2Vuc2UgKikKICAoKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UKICAgICAgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUKICAgICAgTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAKICAgICAgVEhJUyBDT0RFIElTIFBST1ZJREVEIE9OIEFOICpBUyBJUyogQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQogICAgICBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIEFOWSBJTVBMSUVECiAgICAgIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsCiAgICAgIE1FUkNIQU5UQUJMSVRZIE9SIE5PTi1JTkZSSU5HRU1FTlQuCiAgCiAgICAgIFNlZSB0aGUgQXBhY2hlIFZlcnNpb24gMi4wIExpY2Vuc2UgZm9yIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucwogICAgICBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICopCgpAbGl0L3JlYWN0aXZlLWVsZW1lbnQvY3NzLXRhZy5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMKICAgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCiAgICopCgpAbGl0L3JlYWN0aXZlLWVsZW1lbnQvcmVhY3RpdmUtZWxlbWVudC5qczoKbGl0LWh0bWwvbGl0LWh0bWwuanM6CmxpdC1lbGVtZW50L2xpdC1lbGVtZW50LmpzOgpAbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGVjb3JhdG9ycy9wcm9wZXJ0eS5qczoKbGl0LWh0bWwvZGlyZWN0aXZlLmpzOgpsaXQtaHRtbC9kaXJlY3RpdmVzL3Vuc2FmZS1odG1sLmpzOgpAbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGVjb3JhdG9ycy9jdXN0b20tZWxlbWVudC5qczoKQGxpdC9yZWFjdGl2ZS1lbGVtZW50L2RlY29yYXRvcnMvc3RhdGUuanM6CkBsaXQvcmVhY3RpdmUtZWxlbWVudC9kZWNvcmF0b3JzL2V2ZW50LW9wdGlvbnMuanM6CkBsaXQvcmVhY3RpdmUtZWxlbWVudC9kZWNvcmF0b3JzL2Jhc2UuanM6CkBsaXQvcmVhY3RpdmUtZWxlbWVudC9kZWNvcmF0b3JzL3F1ZXJ5LmpzOgpAbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGVjb3JhdG9ycy9xdWVyeS1hbGwuanM6CkBsaXQvcmVhY3RpdmUtZWxlbWVudC9kZWNvcmF0b3JzL3F1ZXJ5LWFzeW5jLmpzOgpAbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGVjb3JhdG9ycy9xdWVyeS1hc3NpZ25lZC1ub2Rlcy5qczoKbGl0LWh0bWwvYXN5bmMtZGlyZWN0aXZlLmpzOgpsaXQtaHRtbC9kaXJlY3RpdmVzL3VudGlsLmpzOgpsaXQtaHRtbC9kaXJlY3RpdmVzL2FzeW5jLXJlcGxhY2UuanM6CmxpdC1odG1sL2RpcmVjdGl2ZXMvYXN5bmMtYXBwZW5kLmpzOgpsaXQtaHRtbC9kaXJlY3RpdmVzL3JlcGVhdC5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMKICAgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCiAgICopCgpsaXQtaHRtbC9pcy1zZXJ2ZXIuanM6CiAgKCoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDCiAgICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQogICAqKQoKbGl0LWh0bWwvc3RhdGljLmpzOgpsaXQtaHRtbC9kaXJlY3RpdmUtaGVscGVycy5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMKICAgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCiAgICopCgpAbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGVjb3JhdG9ycy9xdWVyeS1hc3NpZ25lZC1lbGVtZW50cy5qczoKbGl0LWh0bWwvZGlyZWN0aXZlcy9wcml2YXRlLWFzeW5jLWhlbHBlcnMuanM6CmxpdC1odG1sL2RpcmVjdGl2ZXMva2V5ZWQuanM6CiAgKCoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDCiAgICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQogICAqKQoqLwovLyMgc291cmNlTWFwcGluZ1VSTD1idW5kbGUtMTc3NTM2MTExOTU4Ny5qcy5tYXAK" + "contentBase64": "dmFyIF9fY3JlYXRlID0gT2JqZWN0LmNyZWF0ZTsKdmFyIF9fZGVmUHJvcCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsKdmFyIF9fZ2V0T3duUHJvcERlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOwp2YXIgX19nZXRPd25Qcm9wTmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lczsKdmFyIF9fZ2V0UHJvdG9PZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjsKdmFyIF9faGFzT3duUHJvcCA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7CnZhciBfX2tub3duU3ltYm9sID0gKG5hbWUsIHN5bWJvbCkgPT4gKHN5bWJvbCA9IFN5bWJvbFtuYW1lXSkgPyBzeW1ib2wgOiAvKiBAX19QVVJFX18gKi8gU3ltYm9sLmZvcigiU3ltYm9sLiIgKyBuYW1lKTsKdmFyIF9fdHlwZUVycm9yID0gKG1zZykgPT4gewogIHRocm93IFR5cGVFcnJvcihtc2cpOwp9Owp2YXIgX19kZWZOb3JtYWxQcm9wID0gKG9iaiwga2V5MiwgdmFsdWUyKSA9PiBrZXkyIGluIG9iaiA/IF9fZGVmUHJvcChvYmosIGtleTIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlMiB9KSA6IG9ialtrZXkyXSA9IHZhbHVlMjsKdmFyIF9fbmFtZSA9ICh0YXJnZXQsIHZhbHVlMikgPT4gX19kZWZQcm9wKHRhcmdldCwgIm5hbWUiLCB7IHZhbHVlOiB2YWx1ZTIsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTsKdmFyIF9fcmVxdWlyZSA9IC8qIEBfX1BVUkVfXyAqLyAoKHgzKSA9PiB0eXBlb2YgcmVxdWlyZSAhPT0gInVuZGVmaW5lZCIgPyByZXF1aXJlIDogdHlwZW9mIFByb3h5ICE9PSAidW5kZWZpbmVkIiA/IG5ldyBQcm94eSh4MywgewogIGdldDogKGE0LCBiNCkgPT4gKHR5cGVvZiByZXF1aXJlICE9PSAidW5kZWZpbmVkIiA/IHJlcXVpcmUgOiBhNClbYjRdCn0pIDogeDMpKGZ1bmN0aW9uKHgzKSB7CiAgaWYgKHR5cGVvZiByZXF1aXJlICE9PSAidW5kZWZpbmVkIikgcmV0dXJuIHJlcXVpcmUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB0aHJvdyBFcnJvcignRHluYW1pYyByZXF1aXJlIG9mICInICsgeDMgKyAnIiBpcyBub3Qgc3VwcG9ydGVkJyk7Cn0pOwp2YXIgX19jb21tb25KUyA9IChjYiwgbW9kKSA9PiBmdW5jdGlvbiBfX3JlcXVpcmUyKCkgewogIHJldHVybiBtb2QgfHwgKDAsIGNiW19fZ2V0T3duUHJvcE5hbWVzKGNiKVswXV0pKChtb2QgPSB7IGV4cG9ydHM6IHt9IH0pLmV4cG9ydHMsIG1vZCksIG1vZC5leHBvcnRzOwp9Owp2YXIgX19leHBvcnQgPSAodGFyZ2V0LCBhbGwzKSA9PiB7CiAgZm9yICh2YXIgbmFtZSBpbiBhbGwzKQogICAgX19kZWZQcm9wKHRhcmdldCwgbmFtZSwgeyBnZXQ6IGFsbDNbbmFtZV0sIGVudW1lcmFibGU6IHRydWUgfSk7Cn07CnZhciBfX2NvcHlQcm9wcyA9ICh0bywgZnJvbTIsIGV4Y2VwdCwgZGVzYykgPT4gewogIGlmIChmcm9tMiAmJiB0eXBlb2YgZnJvbTIgPT09ICJvYmplY3QiIHx8IHR5cGVvZiBmcm9tMiA9PT0gImZ1bmN0aW9uIikgewogICAgZm9yIChsZXQga2V5MiBvZiBfX2dldE93blByb3BOYW1lcyhmcm9tMikpCiAgICAgIGlmICghX19oYXNPd25Qcm9wLmNhbGwodG8sIGtleTIpICYmIGtleTIgIT09IGV4Y2VwdCkKICAgICAgICBfX2RlZlByb3AodG8sIGtleTIsIHsgZ2V0OiAoKSA9PiBmcm9tMltrZXkyXSwgZW51bWVyYWJsZTogIShkZXNjID0gX19nZXRPd25Qcm9wRGVzYyhmcm9tMiwga2V5MikpIHx8IGRlc2MuZW51bWVyYWJsZSB9KTsKICB9CiAgcmV0dXJuIHRvOwp9Owp2YXIgX190b0VTTSA9IChtb2QsIGlzTm9kZU1vZGUsIHRhcmdldCkgPT4gKHRhcmdldCA9IG1vZCAhPSBudWxsID8gX19jcmVhdGUoX19nZXRQcm90b09mKG1vZCkpIDoge30sIF9fY29weVByb3BzKAogIC8vIElmIHRoZSBpbXBvcnRlciBpcyBpbiBub2RlIGNvbXBhdGliaWxpdHkgbW9kZSBvciB0aGlzIGlzIG5vdCBhbiBFU00KICAvLyBmaWxlIHRoYXQgaGFzIGJlZW4gY29udmVydGVkIHRvIGEgQ29tbW9uSlMgZmlsZSB1c2luZyBhIEJhYmVsLQogIC8vIGNvbXBhdGlibGUgdHJhbnNmb3JtIChpLmUuICJfX2VzTW9kdWxlIiBoYXMgbm90IGJlZW4gc2V0KSwgdGhlbiBzZXQKICAvLyAiZGVmYXVsdCIgdG8gdGhlIENvbW1vbkpTICJtb2R1bGUuZXhwb3J0cyIgZm9yIG5vZGUgY29tcGF0aWJpbGl0eS4KICBpc05vZGVNb2RlIHx8ICFtb2QgfHwgIW1vZC5fX2VzTW9kdWxlID8gX19kZWZQcm9wKHRhcmdldCwgImRlZmF1bHQiLCB7IHZhbHVlOiBtb2QsIGVudW1lcmFibGU6IHRydWUgfSkgOiB0YXJnZXQsCiAgbW9kCikpOwp2YXIgX19kZWNvcmF0b3JTdGFydCA9IChiYXNlKSA9PiBbLCAsICwgX19jcmVhdGUoYmFzZT8uW19fa25vd25TeW1ib2woIm1ldGFkYXRhIildID8/IG51bGwpXTsKdmFyIF9fZGVjb3JhdG9yU3RyaW5ncyA9IFsiY2xhc3MiLCAibWV0aG9kIiwgImdldHRlciIsICJzZXR0ZXIiLCAiYWNjZXNzb3IiLCAiZmllbGQiLCAidmFsdWUiLCAiZ2V0IiwgInNldCJdOwp2YXIgX19leHBlY3RGbiA9IChmbikgPT4gZm4gIT09IHZvaWQgMCAmJiB0eXBlb2YgZm4gIT09ICJmdW5jdGlvbiIgPyBfX3R5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKSA6IGZuOwp2YXIgX19kZWNvcmF0b3JDb250ZXh0ID0gKGtpbmQsIG5hbWUsIGRvbmUsIG1ldGFkYXRhLCBmbnMpID0+ICh7IGtpbmQ6IF9fZGVjb3JhdG9yU3RyaW5nc1traW5kXSwgbmFtZSwgbWV0YWRhdGEsIGFkZEluaXRpYWxpemVyOiAoZm4pID0+IGRvbmUuXyA/IF9fdHlwZUVycm9yKCJBbHJlYWR5IGluaXRpYWxpemVkIikgOiBmbnMucHVzaChfX2V4cGVjdEZuKGZuIHx8IG51bGwpKSB9KTsKdmFyIF9fZGVjb3JhdG9yTWV0YWRhdGEgPSAoYXJyYXksIHRhcmdldCkgPT4gX19kZWZOb3JtYWxQcm9wKHRhcmdldCwgX19rbm93blN5bWJvbCgibWV0YWRhdGEiKSwgYXJyYXlbM10pOwp2YXIgX19ydW5Jbml0aWFsaXplcnMgPSAoYXJyYXksIGZsYWdzLCBzZWxmMiwgdmFsdWUyKSA9PiB7CiAgZm9yICh2YXIgaTEwID0gMCwgZm5zID0gYXJyYXlbZmxhZ3MgPj4gMV0sIG4xMSA9IGZucyAmJiBmbnMubGVuZ3RoOyBpMTAgPCBuMTE7IGkxMCsrKSBmbGFncyAmIDEgPyBmbnNbaTEwXS5jYWxsKHNlbGYyKSA6IHZhbHVlMiA9IGZuc1tpMTBdLmNhbGwoc2VsZjIsIHZhbHVlMik7CiAgcmV0dXJuIHZhbHVlMjsKfTsKdmFyIF9fZGVjb3JhdGVFbGVtZW50ID0gKGFycmF5LCBmbGFncywgbmFtZSwgZGVjb3JhdG9ycywgdGFyZ2V0LCBleHRyYSkgPT4gewogIHZhciBmbiwgaXQsIGRvbmUsIGN0eCwgYWNjZXNzLCBrMyA9IGZsYWdzICYgNywgczkgPSAhIShmbGFncyAmIDgpLCBwNiA9ICEhKGZsYWdzICYgMTYpOwogIHZhciBqMyA9IGszID4gMyA/IGFycmF5Lmxlbmd0aCArIDEgOiBrMyA/IHM5ID8gMSA6IDIgOiAwLCBrZXkyID0gX19kZWNvcmF0b3JTdHJpbmdzW2szICsgNV07CiAgdmFyIGluaXRpYWxpemVycyA9IGszID4gMyAmJiAoYXJyYXlbajMgLSAxXSA9IFtdKSwgZXh0cmFJbml0aWFsaXplcnMgPSBhcnJheVtqM10gfHwgKGFycmF5W2ozXSA9IFtdKTsKICB2YXIgZGVzYyA9IGszICYmICghcDYgJiYgIXM5ICYmICh0YXJnZXQgPSB0YXJnZXQucHJvdG90eXBlKSwgazMgPCA1ICYmIChrMyA+IDMgfHwgIXA2KSAmJiBfX2dldE93blByb3BEZXNjKGszIDwgNCA/IHRhcmdldCA6IHsgZ2V0IFtuYW1lXSgpIHsKICAgIHJldHVybiBfX3ByaXZhdGVHZXQodGhpcywgZXh0cmEpOwogIH0sIHNldCBbbmFtZV0oeDMpIHsKICAgIHJldHVybiBfX3ByaXZhdGVTZXQodGhpcywgZXh0cmEsIHgzKTsKICB9IH0sIG5hbWUpKTsKICBrMyA/IHA2ICYmIGszIDwgNCAmJiBfX25hbWUoZXh0cmEsIChrMyA+IDIgPyAic2V0ICIgOiBrMyA+IDEgPyAiZ2V0ICIgOiAiIikgKyBuYW1lKSA6IF9fbmFtZSh0YXJnZXQsIG5hbWUpOwogIGZvciAodmFyIGkxMCA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTEwID49IDA7IGkxMC0tKSB7CiAgICBjdHggPSBfX2RlY29yYXRvckNvbnRleHQoazMsIG5hbWUsIGRvbmUgPSB7fSwgYXJyYXlbM10sIGV4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIGlmIChrMykgewogICAgICBjdHguc3RhdGljID0gczksIGN0eC5wcml2YXRlID0gcDYsIGFjY2VzcyA9IGN0eC5hY2Nlc3MgPSB7IGhhczogcDYgPyAoeDMpID0+IF9fcHJpdmF0ZUluKHRhcmdldCwgeDMpIDogKHgzKSA9PiBuYW1lIGluIHgzIH07CiAgICAgIGlmIChrMyBeIDMpIGFjY2Vzcy5nZXQgPSBwNiA/ICh4MykgPT4gKGszIF4gMSA/IF9fcHJpdmF0ZUdldCA6IF9fcHJpdmF0ZU1ldGhvZCkoeDMsIHRhcmdldCwgazMgXiA0ID8gZXh0cmEgOiBkZXNjLmdldCkgOiAoeDMpID0+IHgzW25hbWVdOwogICAgICBpZiAoazMgPiAyKSBhY2Nlc3Muc2V0ID0gcDYgPyAoeDMsIHkzKSA9PiBfX3ByaXZhdGVTZXQoeDMsIHRhcmdldCwgeTMsIGszIF4gNCA/IGV4dHJhIDogZGVzYy5zZXQpIDogKHgzLCB5MykgPT4geDNbbmFtZV0gPSB5MzsKICAgIH0KICAgIGl0ID0gKDAsIGRlY29yYXRvcnNbaTEwXSkoazMgPyBrMyA8IDQgPyBwNiA/IGV4dHJhIDogZGVzY1trZXkyXSA6IGszID4gNCA/IHZvaWQgMCA6IHsgZ2V0OiBkZXNjLmdldCwgc2V0OiBkZXNjLnNldCB9IDogdGFyZ2V0LCBjdHgpLCBkb25lLl8gPSAxOwogICAgaWYgKGszIF4gNCB8fCBpdCA9PT0gdm9pZCAwKSBfX2V4cGVjdEZuKGl0KSAmJiAoazMgPiA0ID8gaW5pdGlhbGl6ZXJzLnVuc2hpZnQoaXQpIDogazMgPyBwNiA/IGV4dHJhID0gaXQgOiBkZXNjW2tleTJdID0gaXQgOiB0YXJnZXQgPSBpdCk7CiAgICBlbHNlIGlmICh0eXBlb2YgaXQgIT09ICJvYmplY3QiIHx8IGl0ID09PSBudWxsKSBfX3R5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICBlbHNlIF9fZXhwZWN0Rm4oZm4gPSBpdC5nZXQpICYmIChkZXNjLmdldCA9IGZuKSwgX19leHBlY3RGbihmbiA9IGl0LnNldCkgJiYgKGRlc2Muc2V0ID0gZm4pLCBfX2V4cGVjdEZuKGZuID0gaXQuaW5pdCkgJiYgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoZm4pOwogIH0KICByZXR1cm4gazMgfHwgX19kZWNvcmF0b3JNZXRhZGF0YShhcnJheSwgdGFyZ2V0KSwgZGVzYyAmJiBfX2RlZlByb3AodGFyZ2V0LCBuYW1lLCBkZXNjKSwgcDYgPyBrMyBeIDQgPyBleHRyYSA6IGRlc2MgOiB0YXJnZXQ7Cn07CnZhciBfX3B1YmxpY0ZpZWxkID0gKG9iaiwga2V5MiwgdmFsdWUyKSA9PiBfX2RlZk5vcm1hbFByb3Aob2JqLCB0eXBlb2Yga2V5MiAhPT0gInN5bWJvbCIgPyBrZXkyICsgIiIgOiBrZXkyLCB2YWx1ZTIpOwp2YXIgX19hY2Nlc3NDaGVjayA9IChvYmosIG1lbWJlciwgbXNnKSA9PiBtZW1iZXIuaGFzKG9iaikgfHwgX190eXBlRXJyb3IoIkNhbm5vdCAiICsgbXNnKTsKdmFyIF9fcHJpdmF0ZUluID0gKG1lbWJlciwgb2JqKSA9PiBPYmplY3Qob2JqKSAhPT0gb2JqID8gX190eXBlRXJyb3IoJ0Nhbm5vdCB1c2UgdGhlICJpbiIgb3BlcmF0b3Igb24gdGhpcyB2YWx1ZScpIDogbWVtYmVyLmhhcyhvYmopOwp2YXIgX19wcml2YXRlR2V0ID0gKG9iaiwgbWVtYmVyLCBnZXR0ZXIpID0+IChfX2FjY2Vzc0NoZWNrKG9iaiwgbWVtYmVyLCAicmVhZCBmcm9tIHByaXZhdGUgZmllbGQiKSwgZ2V0dGVyID8gZ2V0dGVyLmNhbGwob2JqKSA6IG1lbWJlci5nZXQob2JqKSk7CnZhciBfX3ByaXZhdGVBZGQgPSAob2JqLCBtZW1iZXIsIHZhbHVlMikgPT4gbWVtYmVyLmhhcyhvYmopID8gX190eXBlRXJyb3IoIkNhbm5vdCBhZGQgdGhlIHNhbWUgcHJpdmF0ZSBtZW1iZXIgbW9yZSB0aGFuIG9uY2UiKSA6IG1lbWJlciBpbnN0YW5jZW9mIFdlYWtTZXQgPyBtZW1iZXIuYWRkKG9iaikgOiBtZW1iZXIuc2V0KG9iaiwgdmFsdWUyKTsKdmFyIF9fcHJpdmF0ZVNldCA9IChvYmosIG1lbWJlciwgdmFsdWUyLCBzZXR0ZXIpID0+IChfX2FjY2Vzc0NoZWNrKG9iaiwgbWVtYmVyLCAid3JpdGUgdG8gcHJpdmF0ZSBmaWVsZCIpLCBzZXR0ZXIgPyBzZXR0ZXIuY2FsbChvYmosIHZhbHVlMikgOiBtZW1iZXIuc2V0KG9iaiwgdmFsdWUyKSwgdmFsdWUyKTsKdmFyIF9fcHJpdmF0ZU1ldGhvZCA9IChvYmosIG1lbWJlciwgbWV0aG9kKSA9PiAoX19hY2Nlc3NDaGVjayhvYmosIG1lbWJlciwgImFjY2VzcyBwcml2YXRlIG1ldGhvZCIpLCBtZXRob2QpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2lzb3VuaXF1ZUAxLjAuNS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvaXNvdW5pcXVlL2Rpc3RfdHMvaW5kZXguanMKdmFyIHJlcXVpcmVfZGlzdF90cyA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3MraXNvdW5pcXVlQDEuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9pc291bmlxdWUvZGlzdF90cy9pbmRleC5qcyIoZXhwb3J0cykgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMudW5pID0gdm9pZCAwOwogICAgdmFyIHVuaTIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChwcmVmaXggPSAidW5pIikgPT4gewogICAgICByZXR1cm4gYCR7cHJlZml4fV8ke2B4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhgLnJlcGxhY2UoL1t4eV0vZywgKGMxMCkgPT4gewogICAgICAgIGNvbnN0IHIxMCA9IE1hdGgucmFuZG9tKCkgKiAxNiB8IDA7CiAgICAgICAgY29uc3QgdjQgPSBjMTAgPT09ICJ4IiA/IHIxMCA6IHIxMCAmIDMgfCA4OwogICAgICAgIHJldHVybiB2NC50b1N0cmluZygxNik7CiAgICAgIH0pfWA7CiAgICB9LCAidW5pIik7CiAgICBleHBvcnRzLnVuaSA9IHVuaTI7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXlqc0AxLjExLjIwL25vZGVfbW9kdWxlcy9kYXlqcy9kYXlqcy5taW4uanMKdmFyIHJlcXVpcmVfZGF5anNfbWluID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXlqc0AxLjExLjIwL25vZGVfbW9kdWxlcy9kYXlqcy9kYXlqcy5taW4uanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgIShmdW5jdGlvbih0OCwgZTEwKSB7CiAgICAgICJvYmplY3QiID09IHR5cGVvZiBleHBvcnRzICYmICJ1bmRlZmluZWQiICE9IHR5cGVvZiBtb2R1bGUgPyBtb2R1bGUuZXhwb3J0cyA9IGUxMCgpIDogImZ1bmN0aW9uIiA9PSB0eXBlb2YgZGVmaW5lICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZTEwKSA6ICh0OCA9ICJ1bmRlZmluZWQiICE9IHR5cGVvZiBnbG9iYWxUaGlzID8gZ2xvYmFsVGhpcyA6IHQ4IHx8IHNlbGYpLmRheWpzID0gZTEwKCk7CiAgICB9KShleHBvcnRzLCAoZnVuY3Rpb24oKSB7CiAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgdmFyIHQ4ID0gMWUzLCBlMTAgPSA2ZTQsIG4xMSA9IDM2ZTUsIHIxMCA9ICJtaWxsaXNlY29uZCIsIGkxMCA9ICJzZWNvbmQiLCBzOSA9ICJtaW51dGUiLCB1NiA9ICJob3VyIiwgYTQgPSAiZGF5IiwgbzEyID0gIndlZWsiLCBjMTAgPSAibW9udGgiLCBmNiA9ICJxdWFydGVyIiwgaDcgPSAieWVhciIsIGQ0ID0gImRhdGUiLCBsNSA9ICJJbnZhbGlkIERhdGUiLCAkMyA9IC9eKFxkezR9KVstL10/KFxkezEsMn0pP1stL10/KFxkezAsMn0pW1R0XHNdKihcZHsxLDJ9KT86PyhcZHsxLDJ9KT86PyhcZHsxLDJ9KT9bLjpdPyhcZCspPyQvLCB5MyA9IC9cWyhbXlxdXSspXXxZezEsNH18TXsxLDR9fER7MSwyfXxkezEsNH18SHsxLDJ9fGh7MSwyfXxhfEF8bXsxLDJ9fHN7MSwyfXxaezEsMn18U1NTL2csIE0zID0geyBuYW1lOiAiZW4iLCB3ZWVrZGF5czogIlN1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5Ii5zcGxpdCgiXyIpLCBtb250aHM6ICJKYW51YXJ5X0ZlYnJ1YXJ5X01hcmNoX0FwcmlsX01heV9KdW5lX0p1bHlfQXVndXN0X1NlcHRlbWJlcl9PY3RvYmVyX05vdmVtYmVyX0RlY2VtYmVyIi5zcGxpdCgiXyIpLCBvcmRpbmFsOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKHQ5KSB7CiAgICAgICAgdmFyIGUxMSA9IFsidGgiLCAic3QiLCAibmQiLCAicmQiXSwgbjEyID0gdDkgJSAxMDA7CiAgICAgICAgcmV0dXJuICJbIiArIHQ5ICsgKGUxMVsobjEyIC0gMjApICUgMTBdIHx8IGUxMVtuMTJdIHx8IGUxMVswXSkgKyAiXSI7CiAgICAgIH0sICJvcmRpbmFsIikgfSwgbTUgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKHQ5LCBlMTEsIG4xMikgewogICAgICAgIHZhciByMTEgPSBTdHJpbmcodDkpOwogICAgICAgIHJldHVybiAhcjExIHx8IHIxMS5sZW5ndGggPj0gZTExID8gdDkgOiAiIiArIEFycmF5KGUxMSArIDEgLSByMTEubGVuZ3RoKS5qb2luKG4xMikgKyB0OTsKICAgICAgfSwgIm0iKSwgdjQgPSB7IHM6IG01LCB6OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKHQ5KSB7CiAgICAgICAgdmFyIGUxMSA9IC10OS51dGNPZmZzZXQoKSwgbjEyID0gTWF0aC5hYnMoZTExKSwgcjExID0gTWF0aC5mbG9vcihuMTIgLyA2MCksIGkxMSA9IG4xMiAlIDYwOwogICAgICAgIHJldHVybiAoZTExIDw9IDAgPyAiKyIgOiAiLSIpICsgbTUocjExLCAyLCAiMCIpICsgIjoiICsgbTUoaTExLCAyLCAiMCIpOwogICAgICB9LCAieiIpLCBtOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uIHQ5KGUxMSwgbjEyKSB7CiAgICAgICAgaWYgKGUxMS5kYXRlKCkgPCBuMTIuZGF0ZSgpKSByZXR1cm4gLXQ5KG4xMiwgZTExKTsKICAgICAgICB2YXIgcjExID0gMTIgKiAobjEyLnllYXIoKSAtIGUxMS55ZWFyKCkpICsgKG4xMi5tb250aCgpIC0gZTExLm1vbnRoKCkpLCBpMTEgPSBlMTEuY2xvbmUoKS5hZGQocjExLCBjMTApLCBzMTAgPSBuMTIgLSBpMTEgPCAwLCB1NyA9IGUxMS5jbG9uZSgpLmFkZChyMTEgKyAoczEwID8gLTEgOiAxKSwgYzEwKTsKICAgICAgICByZXR1cm4gKygtKHIxMSArIChuMTIgLSBpMTEpIC8gKHMxMCA/IGkxMSAtIHU3IDogdTcgLSBpMTEpKSB8fCAwKTsKICAgICAgfSwgInQiKSwgYTogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbih0OSkgewogICAgICAgIHJldHVybiB0OSA8IDAgPyBNYXRoLmNlaWwodDkpIHx8IDAgOiBNYXRoLmZsb29yKHQ5KTsKICAgICAgfSwgImEiKSwgcDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbih0OSkgewogICAgICAgIHJldHVybiB7IE06IGMxMCwgeTogaDcsIHc6IG8xMiwgZDogYTQsIEQ6IGQ0LCBoOiB1NiwgbTogczksIHM6IGkxMCwgbXM6IHIxMCwgUTogZjYgfVt0OV0gfHwgU3RyaW5nKHQ5IHx8ICIiKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL3MkLywgIiIpOwogICAgICB9LCAicCIpLCB1OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKHQ5KSB7CiAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gdDk7CiAgICAgIH0sICJ1IikgfSwgZzMgPSAiZW4iLCBEMyA9IHt9OwogICAgICBEM1tnM10gPSBNMzsKICAgICAgdmFyIHA2ID0gIiRpc0RheWpzT2JqZWN0IiwgUzMgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKHQ5KSB7CiAgICAgICAgcmV0dXJuIHQ5IGluc3RhbmNlb2YgXzMgfHwgISghdDkgfHwgIXQ5W3A2XSk7CiAgICAgIH0sICJTIiksIHczID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbiB0OShlMTEsIG4xMiwgcjExKSB7CiAgICAgICAgdmFyIGkxMTsKICAgICAgICBpZiAoIWUxMSkgcmV0dXJuIGczOwogICAgICAgIGlmICgic3RyaW5nIiA9PSB0eXBlb2YgZTExKSB7CiAgICAgICAgICB2YXIgczEwID0gZTExLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICBEM1tzMTBdICYmIChpMTEgPSBzMTApLCBuMTIgJiYgKEQzW3MxMF0gPSBuMTIsIGkxMSA9IHMxMCk7CiAgICAgICAgICB2YXIgdTcgPSBlMTEuc3BsaXQoIi0iKTsKICAgICAgICAgIGlmICghaTExICYmIHU3Lmxlbmd0aCA+IDEpIHJldHVybiB0OSh1N1swXSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciBhNSA9IGUxMS5uYW1lOwogICAgICAgICAgRDNbYTVdID0gZTExLCBpMTEgPSBhNTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICFyMTEgJiYgaTExICYmIChnMyA9IGkxMSksIGkxMSB8fCAhcjExICYmIGczOwogICAgICB9LCAidCIpLCBPMiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24odDksIGUxMSkgewogICAgICAgIGlmIChTMyh0OSkpIHJldHVybiB0OS5jbG9uZSgpOwogICAgICAgIHZhciBuMTIgPSAib2JqZWN0IiA9PSB0eXBlb2YgZTExID8gZTExIDoge307CiAgICAgICAgcmV0dXJuIG4xMi5kYXRlID0gdDksIG4xMi5hcmdzID0gYXJndW1lbnRzLCBuZXcgXzMobjEyKTsKICAgICAgfSwgIk8iKSwgYjQgPSB2NDsKICAgICAgYjQubCA9IHczLCBiNC5pID0gUzMsIGI0LncgPSBmdW5jdGlvbih0OSwgZTExKSB7CiAgICAgICAgcmV0dXJuIE8yKHQ5LCB7IGxvY2FsZTogZTExLiRMLCB1dGM6IGUxMS4kdSwgeDogZTExLiR4LCAkb2Zmc2V0OiBlMTEuJG9mZnNldCB9KTsKICAgICAgfTsKICAgICAgdmFyIF8zID0gKGZ1bmN0aW9uKCkgewogICAgICAgIGZ1bmN0aW9uIE00KHQ5KSB7CiAgICAgICAgICB0aGlzLiRMID0gdzModDkubG9jYWxlLCBudWxsLCB0cnVlKSwgdGhpcy5wYXJzZSh0OSksIHRoaXMuJHggPSB0aGlzLiR4IHx8IHQ5LnggfHwge30sIHRoaXNbcDZdID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgX19uYW1lKE00LCAiTSIpOwogICAgICAgIHZhciBtNiA9IE00LnByb3RvdHlwZTsKICAgICAgICByZXR1cm4gbTYucGFyc2UgPSBmdW5jdGlvbih0OSkgewogICAgICAgICAgdGhpcy4kZCA9IChmdW5jdGlvbih0MTApIHsKICAgICAgICAgICAgdmFyIGUxMSA9IHQxMC5kYXRlLCBuMTIgPSB0MTAudXRjOwogICAgICAgICAgICBpZiAobnVsbCA9PT0gZTExKSByZXR1cm4gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKE5hTik7CiAgICAgICAgICAgIGlmIChiNC51KGUxMSkpIHJldHVybiAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKTsKICAgICAgICAgICAgaWYgKGUxMSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiBuZXcgRGF0ZShlMTEpOwogICAgICAgICAgICBpZiAoInN0cmluZyIgPT0gdHlwZW9mIGUxMSAmJiAhL1okL2kudGVzdChlMTEpKSB7CiAgICAgICAgICAgICAgdmFyIHIxMSA9IGUxMS5tYXRjaCgkMyk7CiAgICAgICAgICAgICAgaWYgKHIxMSkgewogICAgICAgICAgICAgICAgdmFyIGkxMSA9IHIxMVsyXSAtIDEgfHwgMCwgczEwID0gKHIxMVs3XSB8fCAiMCIpLnN1YnN0cmluZygwLCAzKTsKICAgICAgICAgICAgICAgIHJldHVybiBuMTIgPyBuZXcgRGF0ZShEYXRlLlVUQyhyMTFbMV0sIGkxMSwgcjExWzNdIHx8IDEsIHIxMVs0XSB8fCAwLCByMTFbNV0gfHwgMCwgcjExWzZdIHx8IDAsIHMxMCkpIDogbmV3IERhdGUocjExWzFdLCBpMTEsIHIxMVszXSB8fCAxLCByMTFbNF0gfHwgMCwgcjExWzVdIHx8IDAsIHIxMVs2XSB8fCAwLCBzMTApOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoZTExKTsKICAgICAgICAgIH0pKHQ5KSwgdGhpcy5pbml0KCk7CiAgICAgICAgfSwgbTYuaW5pdCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgdmFyIHQ5ID0gdGhpcy4kZDsKICAgICAgICAgIHRoaXMuJHkgPSB0OS5nZXRGdWxsWWVhcigpLCB0aGlzLiRNID0gdDkuZ2V0TW9udGgoKSwgdGhpcy4kRCA9IHQ5LmdldERhdGUoKSwgdGhpcy4kVyA9IHQ5LmdldERheSgpLCB0aGlzLiRIID0gdDkuZ2V0SG91cnMoKSwgdGhpcy4kbSA9IHQ5LmdldE1pbnV0ZXMoKSwgdGhpcy4kcyA9IHQ5LmdldFNlY29uZHMoKSwgdGhpcy4kbXMgPSB0OS5nZXRNaWxsaXNlY29uZHMoKTsKICAgICAgICB9LCBtNi4kdXRpbHMgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBiNDsKICAgICAgICB9LCBtNi5pc1ZhbGlkID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gISh0aGlzLiRkLnRvU3RyaW5nKCkgPT09IGw1KTsKICAgICAgICB9LCBtNi5pc1NhbWUgPSBmdW5jdGlvbih0OSwgZTExKSB7CiAgICAgICAgICB2YXIgbjEyID0gTzIodDkpOwogICAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRPZihlMTEpIDw9IG4xMiAmJiBuMTIgPD0gdGhpcy5lbmRPZihlMTEpOwogICAgICAgIH0sIG02LmlzQWZ0ZXIgPSBmdW5jdGlvbih0OSwgZTExKSB7CiAgICAgICAgICByZXR1cm4gTzIodDkpIDwgdGhpcy5zdGFydE9mKGUxMSk7CiAgICAgICAgfSwgbTYuaXNCZWZvcmUgPSBmdW5jdGlvbih0OSwgZTExKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5lbmRPZihlMTEpIDwgTzIodDkpOwogICAgICAgIH0sIG02LiRnID0gZnVuY3Rpb24odDksIGUxMSwgbjEyKSB7CiAgICAgICAgICByZXR1cm4gYjQudSh0OSkgPyB0aGlzW2UxMV0gOiB0aGlzLnNldChuMTIsIHQ5KTsKICAgICAgICB9LCBtNi51bml4ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcih0aGlzLnZhbHVlT2YoKSAvIDFlMyk7CiAgICAgICAgfSwgbTYudmFsdWVPZiA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuJGQuZ2V0VGltZSgpOwogICAgICAgIH0sIG02LnN0YXJ0T2YgPSBmdW5jdGlvbih0OSwgZTExKSB7CiAgICAgICAgICB2YXIgbjEyID0gdGhpcywgcjExID0gISFiNC51KGUxMSkgfHwgZTExLCBmNyA9IGI0LnAodDkpLCBsNiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24odDEwLCBlMTIpIHsKICAgICAgICAgICAgdmFyIGkxMSA9IGI0LncobjEyLiR1ID8gRGF0ZS5VVEMobjEyLiR5LCBlMTIsIHQxMCkgOiBuZXcgRGF0ZShuMTIuJHksIGUxMiwgdDEwKSwgbjEyKTsKICAgICAgICAgICAgcmV0dXJuIHIxMSA/IGkxMSA6IGkxMS5lbmRPZihhNCk7CiAgICAgICAgICB9LCAibCIpLCAkNCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24odDEwLCBlMTIpIHsKICAgICAgICAgICAgcmV0dXJuIGI0LncobjEyLnRvRGF0ZSgpW3QxMF0uYXBwbHkobjEyLnRvRGF0ZSgicyIpLCAocjExID8gWzAsIDAsIDAsIDBdIDogWzIzLCA1OSwgNTksIDk5OV0pLnNsaWNlKGUxMikpLCBuMTIpOwogICAgICAgICAgfSwgIiQiKSwgeTQgPSB0aGlzLiRXLCBNNSA9IHRoaXMuJE0sIG03ID0gdGhpcy4kRCwgdjUgPSAic2V0IiArICh0aGlzLiR1ID8gIlVUQyIgOiAiIik7CiAgICAgICAgICBzd2l0Y2ggKGY3KSB7CiAgICAgICAgICAgIGNhc2UgaDc6CiAgICAgICAgICAgICAgcmV0dXJuIHIxMSA/IGw2KDEsIDApIDogbDYoMzEsIDExKTsKICAgICAgICAgICAgY2FzZSBjMTA6CiAgICAgICAgICAgICAgcmV0dXJuIHIxMSA/IGw2KDEsIE01KSA6IGw2KDAsIE01ICsgMSk7CiAgICAgICAgICAgIGNhc2UgbzEyOgogICAgICAgICAgICAgIHZhciBnNCA9IHRoaXMuJGxvY2FsZSgpLndlZWtTdGFydCB8fCAwLCBENCA9ICh5NCA8IGc0ID8geTQgKyA3IDogeTQpIC0gZzQ7CiAgICAgICAgICAgICAgcmV0dXJuIGw2KHIxMSA/IG03IC0gRDQgOiBtNyArICg2IC0gRDQpLCBNNSk7CiAgICAgICAgICAgIGNhc2UgYTQ6CiAgICAgICAgICAgIGNhc2UgZDQ6CiAgICAgICAgICAgICAgcmV0dXJuICQ0KHY1ICsgIkhvdXJzIiwgMCk7CiAgICAgICAgICAgIGNhc2UgdTY6CiAgICAgICAgICAgICAgcmV0dXJuICQ0KHY1ICsgIk1pbnV0ZXMiLCAxKTsKICAgICAgICAgICAgY2FzZSBzOToKICAgICAgICAgICAgICByZXR1cm4gJDQodjUgKyAiU2Vjb25kcyIsIDIpOwogICAgICAgICAgICBjYXNlIGkxMDoKICAgICAgICAgICAgICByZXR1cm4gJDQodjUgKyAiTWlsbGlzZWNvbmRzIiwgMyk7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKTsKICAgICAgICAgIH0KICAgICAgICB9LCBtNi5lbmRPZiA9IGZ1bmN0aW9uKHQ5KSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5zdGFydE9mKHQ5LCBmYWxzZSk7CiAgICAgICAgfSwgbTYuJHNldCA9IGZ1bmN0aW9uKHQ5LCBlMTEpIHsKICAgICAgICAgIHZhciBuMTIsIG8xMyA9IGI0LnAodDkpLCBmNyA9ICJzZXQiICsgKHRoaXMuJHUgPyAiVVRDIiA6ICIiKSwgbDYgPSAobjEyID0ge30sIG4xMlthNF0gPSBmNyArICJEYXRlIiwgbjEyW2Q0XSA9IGY3ICsgIkRhdGUiLCBuMTJbYzEwXSA9IGY3ICsgIk1vbnRoIiwgbjEyW2g3XSA9IGY3ICsgIkZ1bGxZZWFyIiwgbjEyW3U2XSA9IGY3ICsgIkhvdXJzIiwgbjEyW3M5XSA9IGY3ICsgIk1pbnV0ZXMiLCBuMTJbaTEwXSA9IGY3ICsgIlNlY29uZHMiLCBuMTJbcjEwXSA9IGY3ICsgIk1pbGxpc2Vjb25kcyIsIG4xMilbbzEzXSwgJDQgPSBvMTMgPT09IGE0ID8gdGhpcy4kRCArIChlMTEgLSB0aGlzLiRXKSA6IGUxMTsKICAgICAgICAgIGlmIChvMTMgPT09IGMxMCB8fCBvMTMgPT09IGg3KSB7CiAgICAgICAgICAgIHZhciB5NCA9IHRoaXMuY2xvbmUoKS5zZXQoZDQsIDEpOwogICAgICAgICAgICB5NC4kZFtsNl0oJDQpLCB5NC5pbml0KCksIHRoaXMuJGQgPSB5NC5zZXQoZDQsIE1hdGgubWluKHRoaXMuJEQsIHk0LmRheXNJbk1vbnRoKCkpKS4kZDsKICAgICAgICAgIH0gZWxzZSBsNiAmJiB0aGlzLiRkW2w2XSgkNCk7CiAgICAgICAgICByZXR1cm4gdGhpcy5pbml0KCksIHRoaXM7CiAgICAgICAgfSwgbTYuc2V0ID0gZnVuY3Rpb24odDksIGUxMSkgewogICAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS4kc2V0KHQ5LCBlMTEpOwogICAgICAgIH0sIG02LmdldCA9IGZ1bmN0aW9uKHQ5KSB7CiAgICAgICAgICByZXR1cm4gdGhpc1tiNC5wKHQ5KV0oKTsKICAgICAgICB9LCBtNi5hZGQgPSBmdW5jdGlvbihyMTEsIGY3KSB7CiAgICAgICAgICB2YXIgZDUsIGw2ID0gdGhpczsKICAgICAgICAgIHIxMSA9IE51bWJlcihyMTEpOwogICAgICAgICAgdmFyICQ0ID0gYjQucChmNyksIHk0ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbih0OSkgewogICAgICAgICAgICB2YXIgZTExID0gTzIobDYpOwogICAgICAgICAgICByZXR1cm4gYjQudyhlMTEuZGF0ZShlMTEuZGF0ZSgpICsgTWF0aC5yb3VuZCh0OSAqIHIxMSkpLCBsNik7CiAgICAgICAgICB9LCAieSIpOwogICAgICAgICAgaWYgKCQ0ID09PSBjMTApIHJldHVybiB0aGlzLnNldChjMTAsIHRoaXMuJE0gKyByMTEpOwogICAgICAgICAgaWYgKCQ0ID09PSBoNykgcmV0dXJuIHRoaXMuc2V0KGg3LCB0aGlzLiR5ICsgcjExKTsKICAgICAgICAgIGlmICgkNCA9PT0gYTQpIHJldHVybiB5NCgxKTsKICAgICAgICAgIGlmICgkNCA9PT0gbzEyKSByZXR1cm4geTQoNyk7CiAgICAgICAgICB2YXIgTTUgPSAoZDUgPSB7fSwgZDVbczldID0gZTEwLCBkNVt1Nl0gPSBuMTEsIGQ1W2kxMF0gPSB0OCwgZDUpWyQ0XSB8fCAxLCBtNyA9IHRoaXMuJGQuZ2V0VGltZSgpICsgcjExICogTTU7CiAgICAgICAgICByZXR1cm4gYjQudyhtNywgdGhpcyk7CiAgICAgICAgfSwgbTYuc3VidHJhY3QgPSBmdW5jdGlvbih0OSwgZTExKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5hZGQoLTEgKiB0OSwgZTExKTsKICAgICAgICB9LCBtNi5mb3JtYXQgPSBmdW5jdGlvbih0OSkgewogICAgICAgICAgdmFyIGUxMSA9IHRoaXMsIG4xMiA9IHRoaXMuJGxvY2FsZSgpOwogICAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkgcmV0dXJuIG4xMi5pbnZhbGlkRGF0ZSB8fCBsNTsKICAgICAgICAgIHZhciByMTEgPSB0OSB8fCAiWVlZWS1NTS1ERFRISDptbTpzc1oiLCBpMTEgPSBiNC56KHRoaXMpLCBzMTAgPSB0aGlzLiRILCB1NyA9IHRoaXMuJG0sIGE1ID0gdGhpcy4kTSwgbzEzID0gbjEyLndlZWtkYXlzLCBjMTEgPSBuMTIubW9udGhzLCBmNyA9IG4xMi5tZXJpZGllbSwgaDggPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKHQxMCwgbjEzLCBpMTIsIHMxMSkgewogICAgICAgICAgICByZXR1cm4gdDEwICYmICh0MTBbbjEzXSB8fCB0MTAoZTExLCByMTEpKSB8fCBpMTJbbjEzXS5zbGljZSgwLCBzMTEpOwogICAgICAgICAgfSwgImgiKSwgZDUgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKHQxMCkgewogICAgICAgICAgICByZXR1cm4gYjQucyhzMTAgJSAxMiB8fCAxMiwgdDEwLCAiMCIpOwogICAgICAgICAgfSwgImQiKSwgJDQgPSBmNyB8fCBmdW5jdGlvbih0MTAsIGUxMiwgbjEzKSB7CiAgICAgICAgICAgIHZhciByMTIgPSB0MTAgPCAxMiA/ICJBTSIgOiAiUE0iOwogICAgICAgICAgICByZXR1cm4gbjEzID8gcjEyLnRvTG93ZXJDYXNlKCkgOiByMTI7CiAgICAgICAgICB9OwogICAgICAgICAgcmV0dXJuIHIxMS5yZXBsYWNlKHkzLCAoZnVuY3Rpb24odDEwLCByMTIpIHsKICAgICAgICAgICAgcmV0dXJuIHIxMiB8fCAoZnVuY3Rpb24odDExKSB7CiAgICAgICAgICAgICAgc3dpdGNoICh0MTEpIHsKICAgICAgICAgICAgICAgIGNhc2UgIllZIjoKICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhlMTEuJHkpLnNsaWNlKC0yKTsKICAgICAgICAgICAgICAgIGNhc2UgIllZWVkiOgogICAgICAgICAgICAgICAgICByZXR1cm4gYjQucyhlMTEuJHksIDQsICIwIik7CiAgICAgICAgICAgICAgICBjYXNlICJNIjoKICAgICAgICAgICAgICAgICAgcmV0dXJuIGE1ICsgMTsKICAgICAgICAgICAgICAgIGNhc2UgIk1NIjoKICAgICAgICAgICAgICAgICAgcmV0dXJuIGI0LnMoYTUgKyAxLCAyLCAiMCIpOwogICAgICAgICAgICAgICAgY2FzZSAiTU1NIjoKICAgICAgICAgICAgICAgICAgcmV0dXJuIGg4KG4xMi5tb250aHNTaG9ydCwgYTUsIGMxMSwgMyk7CiAgICAgICAgICAgICAgICBjYXNlICJNTU1NIjoKICAgICAgICAgICAgICAgICAgcmV0dXJuIGg4KGMxMSwgYTUpOwogICAgICAgICAgICAgICAgY2FzZSAiRCI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBlMTEuJEQ7CiAgICAgICAgICAgICAgICBjYXNlICJERCI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBiNC5zKGUxMS4kRCwgMiwgIjAiKTsKICAgICAgICAgICAgICAgIGNhc2UgImQiOgogICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKGUxMS4kVyk7CiAgICAgICAgICAgICAgICBjYXNlICJkZCI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBoOChuMTIud2Vla2RheXNNaW4sIGUxMS4kVywgbzEzLCAyKTsKICAgICAgICAgICAgICAgIGNhc2UgImRkZCI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBoOChuMTIud2Vla2RheXNTaG9ydCwgZTExLiRXLCBvMTMsIDMpOwogICAgICAgICAgICAgICAgY2FzZSAiZGRkZCI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBvMTNbZTExLiRXXTsKICAgICAgICAgICAgICAgIGNhc2UgIkgiOgogICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKHMxMCk7CiAgICAgICAgICAgICAgICBjYXNlICJISCI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBiNC5zKHMxMCwgMiwgIjAiKTsKICAgICAgICAgICAgICAgIGNhc2UgImgiOgogICAgICAgICAgICAgICAgICByZXR1cm4gZDUoMSk7CiAgICAgICAgICAgICAgICBjYXNlICJoaCI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBkNSgyKTsKICAgICAgICAgICAgICAgIGNhc2UgImEiOgogICAgICAgICAgICAgICAgICByZXR1cm4gJDQoczEwLCB1NywgdHJ1ZSk7CiAgICAgICAgICAgICAgICBjYXNlICJBIjoKICAgICAgICAgICAgICAgICAgcmV0dXJuICQ0KHMxMCwgdTcsIGZhbHNlKTsKICAgICAgICAgICAgICAgIGNhc2UgIm0iOgogICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKHU3KTsKICAgICAgICAgICAgICAgIGNhc2UgIm1tIjoKICAgICAgICAgICAgICAgICAgcmV0dXJuIGI0LnModTcsIDIsICIwIik7CiAgICAgICAgICAgICAgICBjYXNlICJzIjoKICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhlMTEuJHMpOwogICAgICAgICAgICAgICAgY2FzZSAic3MiOgogICAgICAgICAgICAgICAgICByZXR1cm4gYjQucyhlMTEuJHMsIDIsICIwIik7CiAgICAgICAgICAgICAgICBjYXNlICJTU1MiOgogICAgICAgICAgICAgICAgICByZXR1cm4gYjQucyhlMTEuJG1zLCAzLCAiMCIpOwogICAgICAgICAgICAgICAgY2FzZSAiWiI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBpMTE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9KSh0MTApIHx8IGkxMS5yZXBsYWNlKCI6IiwgIiIpOwogICAgICAgICAgfSkpOwogICAgICAgIH0sIG02LnV0Y09mZnNldCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIDE1ICogLU1hdGgucm91bmQodGhpcy4kZC5nZXRUaW1lem9uZU9mZnNldCgpIC8gMTUpOwogICAgICAgIH0sIG02LmRpZmYgPSBmdW5jdGlvbihyMTEsIGQ1LCBsNikgewogICAgICAgICAgdmFyICQ0LCB5NCA9IHRoaXMsIE01ID0gYjQucChkNSksIG03ID0gTzIocjExKSwgdjUgPSAobTcudXRjT2Zmc2V0KCkgLSB0aGlzLnV0Y09mZnNldCgpKSAqIGUxMCwgZzQgPSB0aGlzIC0gbTcsIEQ0ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIGI0Lm0oeTQsIG03KTsKICAgICAgICAgIH0sICJEIik7CiAgICAgICAgICBzd2l0Y2ggKE01KSB7CiAgICAgICAgICAgIGNhc2UgaDc6CiAgICAgICAgICAgICAgJDQgPSBENCgpIC8gMTI7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgYzEwOgogICAgICAgICAgICAgICQ0ID0gRDQoKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBmNjoKICAgICAgICAgICAgICAkNCA9IEQ0KCkgLyAzOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIG8xMjoKICAgICAgICAgICAgICAkNCA9IChnNCAtIHY1KSAvIDYwNDhlNTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBhNDoKICAgICAgICAgICAgICAkNCA9IChnNCAtIHY1KSAvIDg2NGU1OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIHU2OgogICAgICAgICAgICAgICQ0ID0gZzQgLyBuMTE7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2Ugczk6CiAgICAgICAgICAgICAgJDQgPSBnNCAvIGUxMDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBpMTA6CiAgICAgICAgICAgICAgJDQgPSBnNCAvIHQ4OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICQ0ID0gZzQ7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbDYgPyAkNCA6IGI0LmEoJDQpOwogICAgICAgIH0sIG02LmRheXNJbk1vbnRoID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5lbmRPZihjMTApLiREOwogICAgICAgIH0sIG02LiRsb2NhbGUgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBEM1t0aGlzLiRMXTsKICAgICAgICB9LCBtNi5sb2NhbGUgPSBmdW5jdGlvbih0OSwgZTExKSB7CiAgICAgICAgICBpZiAoIXQ5KSByZXR1cm4gdGhpcy4kTDsKICAgICAgICAgIHZhciBuMTIgPSB0aGlzLmNsb25lKCksIHIxMSA9IHczKHQ5LCBlMTEsIHRydWUpOwogICAgICAgICAgcmV0dXJuIHIxMSAmJiAobjEyLiRMID0gcjExKSwgbjEyOwogICAgICAgIH0sIG02LmNsb25lID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gYjQudyh0aGlzLiRkLCB0aGlzKTsKICAgICAgICB9LCBtNi50b0RhdGUgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSh0aGlzLnZhbHVlT2YoKSk7CiAgICAgICAgfSwgbTYudG9KU09OID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyB0aGlzLnRvSVNPU3RyaW5nKCkgOiBudWxsOwogICAgICAgIH0sIG02LnRvSVNPU3RyaW5nID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy4kZC50b0lTT1N0cmluZygpOwogICAgICAgIH0sIG02LnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy4kZC50b1VUQ1N0cmluZygpOwogICAgICAgIH0sIE00OwogICAgICB9KSgpLCBrMyA9IF8zLnByb3RvdHlwZTsKICAgICAgcmV0dXJuIE8yLnByb3RvdHlwZSA9IGszLCBbWyIkbXMiLCByMTBdLCBbIiRzIiwgaTEwXSwgWyIkbSIsIHM5XSwgWyIkSCIsIHU2XSwgWyIkVyIsIGE0XSwgWyIkTSIsIGMxMF0sIFsiJHkiLCBoN10sIFsiJEQiLCBkNF1dLmZvckVhY2goKGZ1bmN0aW9uKHQ5KSB7CiAgICAgICAgazNbdDlbMV1dID0gZnVuY3Rpb24oZTExKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy4kZyhlMTEsIHQ5WzBdLCB0OVsxXSk7CiAgICAgICAgfTsKICAgICAgfSkpLCBPMi5leHRlbmQgPSBmdW5jdGlvbih0OSwgZTExKSB7CiAgICAgICAgcmV0dXJuIHQ5LiRpIHx8ICh0OShlMTEsIF8zLCBPMiksIHQ5LiRpID0gdHJ1ZSksIE8yOwogICAgICB9LCBPMi5sb2NhbGUgPSB3MywgTzIuaXNEYXlqcyA9IFMzLCBPMi51bml4ID0gZnVuY3Rpb24odDkpIHsKICAgICAgICByZXR1cm4gTzIoMWUzICogdDkpOwogICAgICB9LCBPMi5lbiA9IEQzW2czXSwgTzIuTHMgPSBEMywgTzIucCA9IHt9LCBPMjsKICAgIH0pKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RheWpzQDEuMTEuMjAvbm9kZV9tb2R1bGVzL2RheWpzL3BsdWdpbi9pc1RvZGF5LmpzCnZhciByZXF1aXJlX2lzVG9kYXkgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RheWpzQDEuMTEuMjAvbm9kZV9tb2R1bGVzL2RheWpzL3BsdWdpbi9pc1RvZGF5LmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICEoZnVuY3Rpb24oZTEwLCBvMTIpIHsKICAgICAgIm9iamVjdCIgPT0gdHlwZW9mIGV4cG9ydHMgJiYgInVuZGVmaW5lZCIgIT0gdHlwZW9mIG1vZHVsZSA/IG1vZHVsZS5leHBvcnRzID0gbzEyKCkgOiAiZnVuY3Rpb24iID09IHR5cGVvZiBkZWZpbmUgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShvMTIpIDogKGUxMCA9ICJ1bmRlZmluZWQiICE9IHR5cGVvZiBnbG9iYWxUaGlzID8gZ2xvYmFsVGhpcyA6IGUxMCB8fCBzZWxmKS5kYXlqc19wbHVnaW5faXNUb2RheSA9IG8xMigpOwogICAgfSkoZXhwb3J0cywgKGZ1bmN0aW9uKCkgewogICAgICAidXNlIHN0cmljdCI7CiAgICAgIHJldHVybiBmdW5jdGlvbihlMTAsIG8xMiwgdDgpIHsKICAgICAgICBvMTIucHJvdG90eXBlLmlzVG9kYXkgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIHZhciBlMTEgPSAiWVlZWS1NTS1ERCIsIG8xMyA9IHQ4KCk7CiAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXQoZTExKSA9PT0gbzEzLmZvcm1hdChlMTEpOwogICAgICAgIH07CiAgICAgIH07CiAgICB9KSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9zeW1ib2wtdHJlZUAzLjIuNC9ub2RlX21vZHVsZXMvc3ltYm9sLXRyZWUvbGliL1N5bWJvbFRyZWVOb2RlLmpzCnZhciByZXF1aXJlX1N5bWJvbFRyZWVOb2RlID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9zeW1ib2wtdHJlZUAzLjIuNC9ub2RlX21vZHVsZXMvc3ltYm9sLXRyZWUvbGliL1N5bWJvbFRyZWVOb2RlLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIG1vZHVsZS5leHBvcnRzID0gY2xhc3MgU3ltYm9sVHJlZU5vZGUgewogICAgICBzdGF0aWMgewogICAgICAgIF9fbmFtZSh0aGlzLCAiU3ltYm9sVHJlZU5vZGUiKTsKICAgICAgfQogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLnBhcmVudCA9IG51bGw7CiAgICAgICAgdGhpcy5wcmV2aW91c1NpYmxpbmcgPSBudWxsOwogICAgICAgIHRoaXMubmV4dFNpYmxpbmcgPSBudWxsOwogICAgICAgIHRoaXMuZmlyc3RDaGlsZCA9IG51bGw7CiAgICAgICAgdGhpcy5sYXN0Q2hpbGQgPSBudWxsOwogICAgICAgIHRoaXMuY2hpbGRyZW5WZXJzaW9uID0gMDsKICAgICAgICB0aGlzLmNoaWxkSW5kZXhDYWNoZWRVcFRvID0gbnVsbDsKICAgICAgICB0aGlzLmNhY2hlZEluZGV4ID0gLTE7CiAgICAgICAgdGhpcy5jYWNoZWRJbmRleFZlcnNpb24gPSBOYU47CiAgICAgIH0KICAgICAgZ2V0IGlzQXR0YWNoZWQoKSB7CiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5wYXJlbnQgfHwgdGhpcy5wcmV2aW91c1NpYmxpbmcgfHwgdGhpcy5uZXh0U2libGluZyk7CiAgICAgIH0KICAgICAgZ2V0IGhhc0NoaWxkcmVuKCkgewogICAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuZmlyc3RDaGlsZCk7CiAgICAgIH0KICAgICAgY2hpbGRyZW5DaGFuZ2VkKCkgewogICAgICAgIHRoaXMuY2hpbGRyZW5WZXJzaW9uID0gdGhpcy5jaGlsZHJlblZlcnNpb24gKyAxICYgNDI5NDk2NzI5NTsKICAgICAgICB0aGlzLmNoaWxkSW5kZXhDYWNoZWRVcFRvID0gbnVsbDsKICAgICAgfQogICAgICBnZXRDYWNoZWRJbmRleChwYXJlbnROb2RlKSB7CiAgICAgICAgaWYgKHRoaXMuY2FjaGVkSW5kZXhWZXJzaW9uICE9PSBwYXJlbnROb2RlLmNoaWxkcmVuVmVyc2lvbikgewogICAgICAgICAgdGhpcy5jYWNoZWRJbmRleFZlcnNpb24gPSBOYU47CiAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLmNhY2hlZEluZGV4OwogICAgICB9CiAgICAgIHNldENhY2hlZEluZGV4KHBhcmVudE5vZGUsIGluZGV4MikgewogICAgICAgIHRoaXMuY2FjaGVkSW5kZXhWZXJzaW9uID0gcGFyZW50Tm9kZS5jaGlsZHJlblZlcnNpb247CiAgICAgICAgdGhpcy5jYWNoZWRJbmRleCA9IGluZGV4MjsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3N5bWJvbC10cmVlQDMuMi40L25vZGVfbW9kdWxlcy9zeW1ib2wtdHJlZS9saWIvVHJlZVBvc2l0aW9uLmpzCnZhciByZXF1aXJlX1RyZWVQb3NpdGlvbiA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vc3ltYm9sLXRyZWVAMy4yLjQvbm9kZV9tb2R1bGVzL3N5bWJvbC10cmVlL2xpYi9UcmVlUG9zaXRpb24uanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgbW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuZnJlZXplKHsKICAgICAgLy8gc2FtZSBhcyBET00gRE9DVU1FTlRfUE9TSVRJT05fCiAgICAgIERJU0NPTk5FQ1RFRDogMSwKICAgICAgUFJFQ0VESU5HOiAyLAogICAgICBGT0xMT1dJTkc6IDQsCiAgICAgIENPTlRBSU5TOiA4LAogICAgICBDT05UQUlORURfQlk6IDE2CiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3N5bWJvbC10cmVlQDMuMi40L25vZGVfbW9kdWxlcy9zeW1ib2wtdHJlZS9saWIvVHJlZUl0ZXJhdG9yLmpzCnZhciByZXF1aXJlX1RyZWVJdGVyYXRvciA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vc3ltYm9sLXRyZWVAMy4yLjQvbm9kZV9tb2R1bGVzL3N5bWJvbC10cmVlL2xpYi9UcmVlSXRlcmF0b3IuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIFRSRUUgPSAvKiBAX19QVVJFX18gKi8gU3ltYm9sKCk7CiAgICB2YXIgUk9PVCA9IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2woKTsKICAgIHZhciBORVhUID0gLyogQF9fUFVSRV9fICovIFN5bWJvbCgpOwogICAgdmFyIElURVJBVEVfRlVOQyA9IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2woKTsKICAgIHZhciBUcmVlSXRlcmF0b3IgPSBjbGFzcyB7CiAgICAgIHN0YXRpYyB7CiAgICAgICAgX19uYW1lKHRoaXMsICJUcmVlSXRlcmF0b3IiKTsKICAgICAgfQogICAgICBjb25zdHJ1Y3Rvcih0cmVlLCByb290NiwgZmlyc3RSZXN1bHQsIGl0ZXJhdGVGdW5jdGlvbikgewogICAgICAgIHRoaXNbVFJFRV0gPSB0cmVlOwogICAgICAgIHRoaXNbUk9PVF0gPSByb290NjsKICAgICAgICB0aGlzW05FWFRdID0gZmlyc3RSZXN1bHQ7CiAgICAgICAgdGhpc1tJVEVSQVRFX0ZVTkNdID0gaXRlcmF0ZUZ1bmN0aW9uOwogICAgICB9CiAgICAgIG5leHQoKSB7CiAgICAgICAgY29uc3QgdHJlZSA9IHRoaXNbVFJFRV07CiAgICAgICAgY29uc3QgaXRlcmF0ZUZ1bmMgPSB0aGlzW0lURVJBVEVfRlVOQ107CiAgICAgICAgY29uc3Qgcm9vdDYgPSB0aGlzW1JPT1RdOwogICAgICAgIGlmICghdGhpc1tORVhUXSkgewogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgZG9uZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IHJvb3Q2CiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBjb25zdCB2YWx1ZTIgPSB0aGlzW05FWFRdOwogICAgICAgIGlmIChpdGVyYXRlRnVuYyA9PT0gMSkgewogICAgICAgICAgdGhpc1tORVhUXSA9IHRyZWUuX25vZGUodmFsdWUyKS5wcmV2aW91c1NpYmxpbmc7CiAgICAgICAgfSBlbHNlIGlmIChpdGVyYXRlRnVuYyA9PT0gMikgewogICAgICAgICAgdGhpc1tORVhUXSA9IHRyZWUuX25vZGUodmFsdWUyKS5uZXh0U2libGluZzsKICAgICAgICB9IGVsc2UgaWYgKGl0ZXJhdGVGdW5jID09PSAzKSB7CiAgICAgICAgICB0aGlzW05FWFRdID0gdHJlZS5fbm9kZSh2YWx1ZTIpLnBhcmVudDsKICAgICAgICB9IGVsc2UgaWYgKGl0ZXJhdGVGdW5jID09PSA0KSB7CiAgICAgICAgICB0aGlzW05FWFRdID0gdHJlZS5wcmVjZWRpbmcodmFsdWUyLCB7IHJvb3Q6IHJvb3Q2IH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzW05FWFRdID0gdHJlZS5mb2xsb3dpbmcodmFsdWUyLCB7IHJvb3Q6IHJvb3Q2IH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gewogICAgICAgICAgZG9uZTogZmFsc2UsCiAgICAgICAgICB2YWx1ZTogdmFsdWUyCiAgICAgICAgfTsKICAgICAgfQogICAgfTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUcmVlSXRlcmF0b3IucHJvdG90eXBlLCBTeW1ib2wuaXRlcmF0b3IsIHsKICAgICAgdmFsdWU6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0sICJ2YWx1ZSIpLAogICAgICB3cml0YWJsZTogZmFsc2UKICAgIH0pOwogICAgVHJlZUl0ZXJhdG9yLlBSRVYgPSAxOwogICAgVHJlZUl0ZXJhdG9yLk5FWFQgPSAyOwogICAgVHJlZUl0ZXJhdG9yLlBBUkVOVCA9IDM7CiAgICBUcmVlSXRlcmF0b3IuUFJFQ0VESU5HID0gNDsKICAgIFRyZWVJdGVyYXRvci5GT0xMT1dJTkcgPSA1OwogICAgT2JqZWN0LmZyZWV6ZShUcmVlSXRlcmF0b3IpOwogICAgT2JqZWN0LmZyZWV6ZShUcmVlSXRlcmF0b3IucHJvdG90eXBlKTsKICAgIG1vZHVsZS5leHBvcnRzID0gVHJlZUl0ZXJhdG9yOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vc3ltYm9sLXRyZWVAMy4yLjQvbm9kZV9tb2R1bGVzL3N5bWJvbC10cmVlL2xpYi9TeW1ib2xUcmVlLmpzCnZhciByZXF1aXJlX1N5bWJvbFRyZWUgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3N5bWJvbC10cmVlQDMuMi40L25vZGVfbW9kdWxlcy9zeW1ib2wtdHJlZS9saWIvU3ltYm9sVHJlZS5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgU3ltYm9sVHJlZU5vZGUgPSByZXF1aXJlX1N5bWJvbFRyZWVOb2RlKCk7CiAgICB2YXIgVHJlZVBvc2l0aW9uID0gcmVxdWlyZV9UcmVlUG9zaXRpb24oKTsKICAgIHZhciBUcmVlSXRlcmF0b3IgPSByZXF1aXJlX1RyZWVJdGVyYXRvcigpOwogICAgZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBfX25hbWUocmV0dXJuVHJ1ZSwgInJldHVyblRydWUiKTsKICAgIGZ1bmN0aW9uIHJldmVyc2VBcnJheUluZGV4KGFycmF5LCByZXZlcnNlSW5kZXgpIHsKICAgICAgcmV0dXJuIGFycmF5W2FycmF5Lmxlbmd0aCAtIDEgLSByZXZlcnNlSW5kZXhdOwogICAgfQogICAgX19uYW1lKHJldmVyc2VBcnJheUluZGV4LCAicmV2ZXJzZUFycmF5SW5kZXgiKTsKICAgIHZhciBTeW1ib2xUcmVlID0gY2xhc3MgewogICAgICBzdGF0aWMgewogICAgICAgIF9fbmFtZSh0aGlzLCAiU3ltYm9sVHJlZSIpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBAY29uc3RydWN0b3IKICAgICAgICogQGFsaWFzIG1vZHVsZTpzeW1ib2wtdHJlZQogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2Rlc2NyaXB0aW9uPSdTeW1ib2xUcmVlIGRhdGEnXSBEZXNjcmlwdGlvbiB1c2VkIGZvciB0aGUgU3ltYm9sCiAgICAgICAqLwogICAgICBjb25zdHJ1Y3RvcihkZXNjcmlwdGlvbikgewogICAgICAgIHRoaXMuc3ltYm9sID0gU3ltYm9sKGRlc2NyaXB0aW9uIHx8ICJTeW1ib2xUcmVlIGRhdGEiKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogWW91IGNhbiB1c2UgdGhpcyBmdW5jdGlvbiB0byAob3B0aW9uYWxseSkgaW5pdGlhbGl6ZSBhbiBvYmplY3QgcmlnaHQgYWZ0ZXIgaXRzIGNyZWF0aW9uLAogICAgICAgKiB0byB0YWtlIGFkdmFudGFnZSBvZiBWOCdzIGZhc3QgcHJvcGVydGllcy4gQWxzbyB1c2VmdWwgaWYgeW91IHdvdWxkIGxpa2UgdG8KICAgICAgICogZnJlZXplIHlvdXIgb2JqZWN0LgogICAgICAgKgogICAgICAgKiBgTygxKWAKICAgICAgICoKICAgICAgICogQG1ldGhvZAogICAgICAgKiBAYWxpYXMgbW9kdWxlOnN5bWJvbC10cmVlI2luaXRpYWxpemUKICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdAogICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IG9iamVjdAogICAgICAgKi8KICAgICAgaW5pdGlhbGl6ZShvYmplY3QpIHsKICAgICAgICB0aGlzLl9ub2RlKG9iamVjdCk7CiAgICAgICAgcmV0dXJuIG9iamVjdDsKICAgICAgfQogICAgICBfbm9kZShvYmplY3QpIHsKICAgICAgICBpZiAoIW9iamVjdCkgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG5vZGUyID0gb2JqZWN0W3RoaXMuc3ltYm9sXTsKICAgICAgICBpZiAobm9kZTIpIHsKICAgICAgICAgIHJldHVybiBub2RlMjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG9iamVjdFt0aGlzLnN5bWJvbF0gPSBuZXcgU3ltYm9sVHJlZU5vZGUoKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdCBoYXMgYW55IGNoaWxkcmVuLiBPdGhlcndpc2UgaXQgcmV0dXJucyBgZmFsc2VgLgogICAgICAgKgogICAgICAgKiAqIGBPKDEpYAogICAgICAgKgogICAgICAgKiBAbWV0aG9kIGhhc0NoaWxkcmVuCiAgICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6c3ltYm9sLXRyZWUjCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QKICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0KICAgICAgICovCiAgICAgIGhhc0NoaWxkcmVuKG9iamVjdCkgewogICAgICAgIHJldHVybiB0aGlzLl9ub2RlKG9iamVjdCkuaGFzQ2hpbGRyZW47CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIGZpcnN0IGNoaWxkIG9mIHRoZSBnaXZlbiBvYmplY3QuCiAgICAgICAqCiAgICAgICAqICogYE8oMSlgCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgZmlyc3RDaGlsZAogICAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOnN5bWJvbC10cmVlIwogICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0CiAgICAgICAqIEByZXR1cm4ge09iamVjdH0KICAgICAgICovCiAgICAgIGZpcnN0Q2hpbGQob2JqZWN0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX25vZGUob2JqZWN0KS5maXJzdENoaWxkOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSBsYXN0IGNoaWxkIG9mIHRoZSBnaXZlbiBvYmplY3QuCiAgICAgICAqCiAgICAgICAqICogYE8oMSlgCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgbGFzdENoaWxkCiAgICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6c3ltYm9sLXRyZWUjCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QKICAgICAgICogQHJldHVybiB7T2JqZWN0fQogICAgICAgKi8KICAgICAgbGFzdENoaWxkKG9iamVjdCkgewogICAgICAgIHJldHVybiB0aGlzLl9ub2RlKG9iamVjdCkubGFzdENoaWxkOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSBwcmV2aW91cyBzaWJsaW5nIG9mIHRoZSBnaXZlbiBvYmplY3QuCiAgICAgICAqCiAgICAgICAqICogYE8oMSlgCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgcHJldmlvdXNTaWJsaW5nCiAgICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6c3ltYm9sLXRyZWUjCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QKICAgICAgICogQHJldHVybiB7T2JqZWN0fQogICAgICAgKi8KICAgICAgcHJldmlvdXNTaWJsaW5nKG9iamVjdCkgewogICAgICAgIHJldHVybiB0aGlzLl9ub2RlKG9iamVjdCkucHJldmlvdXNTaWJsaW5nOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IHNpYmxpbmcgb2YgdGhlIGdpdmVuIG9iamVjdC4KICAgICAgICoKICAgICAgICogKiBgTygxKWAKICAgICAgICoKICAgICAgICogQG1ldGhvZCBuZXh0U2libGluZwogICAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOnN5bWJvbC10cmVlIwogICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0CiAgICAgICAqIEByZXR1cm4ge09iamVjdH0KICAgICAgICovCiAgICAgIG5leHRTaWJsaW5nKG9iamVjdCkgewogICAgICAgIHJldHVybiB0aGlzLl9ub2RlKG9iamVjdCkubmV4dFNpYmxpbmc7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFJldHVybiB0aGUgcGFyZW50IG9mIHRoZSBnaXZlbiBvYmplY3QuCiAgICAgICAqCiAgICAgICAqICogYE8oMSlgCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgcGFyZW50CiAgICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6c3ltYm9sLXRyZWUjCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QKICAgICAgICogQHJldHVybiB7T2JqZWN0fQogICAgICAgKi8KICAgICAgcGFyZW50KG9iamVjdCkgewogICAgICAgIHJldHVybiB0aGlzLl9ub2RlKG9iamVjdCkucGFyZW50OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBGaW5kIHRoZSBpbmNsdXNpdmUgZGVzY2VuZGFudCB0aGF0IGlzIGxhc3QgaW4gdHJlZSBvcmRlciBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgogICAgICAgKgogICAgICAgKiAqIGBPKG4pYCAod29yc3QgY2FzZSkgd2hlcmUgYG5gIGlzIHRoZSBkZXB0aCBvZiB0aGUgc3VidHJlZSBvZiBgb2JqZWN0YAogICAgICAgKgogICAgICAgKiBAbWV0aG9kIGxhc3RJbmNsdXNpdmVEZXNjZW5kYW50CiAgICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6c3ltYm9sLXRyZWUjCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QKICAgICAgICogQHJldHVybiB7T2JqZWN0fQogICAgICAgKi8KICAgICAgbGFzdEluY2x1c2l2ZURlc2NlbmRhbnQob2JqZWN0KSB7CiAgICAgICAgbGV0IGxhc3RDaGlsZDsKICAgICAgICBsZXQgY3VycmVudCA9IG9iamVjdDsKICAgICAgICB3aGlsZSAobGFzdENoaWxkID0gdGhpcy5fbm9kZShjdXJyZW50KS5sYXN0Q2hpbGQpIHsKICAgICAgICAgIGN1cnJlbnQgPSBsYXN0Q2hpbGQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjdXJyZW50OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBGaW5kIHRoZSBwcmVjZWRpbmcgb2JqZWN0IChBKSBvZiB0aGUgZ2l2ZW4gb2JqZWN0IChCKS4KICAgICAgICogQW4gb2JqZWN0IEEgaXMgcHJlY2VkaW5nIGFuIG9iamVjdCBCIGlmIEEgYW5kIEIgYXJlIGluIHRoZSBzYW1lIHRyZWUKICAgICAgICogYW5kIEEgY29tZXMgYmVmb3JlIEIgaW4gdHJlZSBvcmRlci4KICAgICAgICoKICAgICAgICogKiBgTyhuKWAgKHdvcnN0IGNhc2UpCiAgICAgICAqICogYE8oMSlgIChhbW9ydGl6ZWQgd2hlbiB3YWxraW5nIHRoZSBlbnRpcmUgdHJlZSkKICAgICAgICoKICAgICAgICogQG1ldGhvZCBwcmVjZWRpbmcKICAgICAgICogQG1lbWJlck9mIG1vZHVsZTpzeW1ib2wtdHJlZSMKICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdAogICAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5yb290XSBJZiBzZXQsIGByb290YCBtdXN0IGJlIGFuIGluY2x1c2l2ZSBhbmNlc3RvcgogICAgICAgKiAgICAgICAgb2YgdGhlIHJldHVybiB2YWx1ZSAob3IgZWxzZSBudWxsIGlzIHJldHVybmVkKS4gVGhpcyBjaGVjayBfYXNzdW1lc18KICAgICAgICogICAgICAgIHRoYXQgYHJvb3RgIGlzIGFsc28gYW4gaW5jbHVzaXZlIGFuY2VzdG9yIG9mIHRoZSBnaXZlbiBgb2JqZWN0YAogICAgICAgKiBAcmV0dXJuIHs/T2JqZWN0fQogICAgICAgKi8KICAgICAgcHJlY2VkaW5nKG9iamVjdCwgb3B0aW9ucykgewogICAgICAgIGNvbnN0IHRyZWVSb290ID0gb3B0aW9ucyAmJiBvcHRpb25zLnJvb3Q7CiAgICAgICAgaWYgKG9iamVjdCA9PT0gdHJlZVJvb3QpIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBjb25zdCBwcmV2aW91c1NpYmxpbmcgPSB0aGlzLl9ub2RlKG9iamVjdCkucHJldmlvdXNTaWJsaW5nOwogICAgICAgIGlmIChwcmV2aW91c1NpYmxpbmcpIHsKICAgICAgICAgIHJldHVybiB0aGlzLmxhc3RJbmNsdXNpdmVEZXNjZW5kYW50KHByZXZpb3VzU2libGluZyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9ub2RlKG9iamVjdCkucGFyZW50OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBGaW5kIHRoZSBmb2xsb3dpbmcgb2JqZWN0IChBKSBvZiB0aGUgZ2l2ZW4gb2JqZWN0IChCKS4KICAgICAgICogQW4gb2JqZWN0IEEgaXMgZm9sbG93aW5nIGFuIG9iamVjdCBCIGlmIEEgYW5kIEIgYXJlIGluIHRoZSBzYW1lIHRyZWUKICAgICAgICogYW5kIEEgY29tZXMgYWZ0ZXIgQiBpbiB0cmVlIG9yZGVyLgogICAgICAgKgogICAgICAgKiAqIGBPKG4pYCAod29yc3QgY2FzZSkgd2hlcmUgYG5gIGlzIHRoZSBhbW91bnQgb2Ygb2JqZWN0cyBpbiB0aGUgZW50aXJlIHRyZWUKICAgICAgICogKiBgTygxKWAgKGFtb3J0aXplZCB3aGVuIHdhbGtpbmcgdGhlIGVudGlyZSB0cmVlKQogICAgICAgKgogICAgICAgKiBAbWV0aG9kIGZvbGxvd2luZwogICAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOnN5bWJvbC10cmVlIwogICAgICAgKiBAcGFyYW0geyFPYmplY3R9IG9iamVjdAogICAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5yb290XSBJZiBzZXQsIGByb290YCBtdXN0IGJlIGFuIGluY2x1c2l2ZSBhbmNlc3RvcgogICAgICAgKiAgICAgICAgb2YgdGhlIHJldHVybiB2YWx1ZSAob3IgZWxzZSBudWxsIGlzIHJldHVybmVkKS4gVGhpcyBjaGVjayBfYXNzdW1lc18KICAgICAgICogICAgICAgIHRoYXQgYHJvb3RgIGlzIGFsc28gYW4gaW5jbHVzaXZlIGFuY2VzdG9yIG9mIHRoZSBnaXZlbiBgb2JqZWN0YAogICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNraXBDaGlsZHJlbj1mYWxzZV0gSWYgc2V0LCBpZ25vcmUgdGhlIGNoaWxkcmVuIG9mIGBvYmplY3RgCiAgICAgICAqIEByZXR1cm4gez9PYmplY3R9CiAgICAgICAqLwogICAgICBmb2xsb3dpbmcob2JqZWN0LCBvcHRpb25zKSB7CiAgICAgICAgY29uc3QgdHJlZVJvb3QgPSBvcHRpb25zICYmIG9wdGlvbnMucm9vdDsKICAgICAgICBjb25zdCBza2lwQ2hpbGRyZW4gPSBvcHRpb25zICYmIG9wdGlvbnMuc2tpcENoaWxkcmVuOwogICAgICAgIGNvbnN0IGZpcnN0Q2hpbGQgPSAhc2tpcENoaWxkcmVuICYmIHRoaXMuX25vZGUob2JqZWN0KS5maXJzdENoaWxkOwogICAgICAgIGlmIChmaXJzdENoaWxkKSB7CiAgICAgICAgICByZXR1cm4gZmlyc3RDaGlsZDsKICAgICAgICB9CiAgICAgICAgbGV0IGN1cnJlbnQgPSBvYmplY3Q7CiAgICAgICAgZG8gewogICAgICAgICAgaWYgKGN1cnJlbnQgPT09IHRyZWVSb290KSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgbmV4dFNpYmxpbmcgPSB0aGlzLl9ub2RlKGN1cnJlbnQpLm5leHRTaWJsaW5nOwogICAgICAgICAgaWYgKG5leHRTaWJsaW5nKSB7CiAgICAgICAgICAgIHJldHVybiBuZXh0U2libGluZzsKICAgICAgICAgIH0KICAgICAgICAgIGN1cnJlbnQgPSB0aGlzLl9ub2RlKGN1cnJlbnQpLnBhcmVudDsKICAgICAgICB9IHdoaWxlIChjdXJyZW50KTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICAvKioKICAgICAgICogQXBwZW5kIGFsbCBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gb2JqZWN0IHRvIGFuIGFycmF5LgogICAgICAgKgogICAgICAgKiAqIGBPKG4pYCB3aGVyZSBgbmAgaXMgdGhlIGFtb3VudCBvZiBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gYHBhcmVudGAKICAgICAgICoKICAgICAgICogQG1ldGhvZCBjaGlsZHJlblRvQXJyYXkKICAgICAgICogQG1lbWJlck9mIG1vZHVsZTpzeW1ib2wtdHJlZSMKICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmVudAogICAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0W119IFtvcHRpb25zLmFycmF5PVtdXQogICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5maWx0ZXJdIEZ1bmN0aW9uIHRvIHRlc3QgZWFjaCBvYmplY3QgYmVmb3JlIGl0IGlzIGFkZGVkIHRvIHRoZSBhcnJheS4KICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52b2tlZCB3aXRoIGFyZ3VtZW50cyAob2JqZWN0KS4gU2hvdWxkIHJldHVybiBgdHJ1ZWAgaWYgYW4gb2JqZWN0CiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHRvIGJlIGluY2x1ZGVkLgogICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zLnRoaXNBcmddIFZhbHVlIHRvIHVzZSBhcyBgdGhpc2Agd2hlbiBleGVjdXRpbmcgYGZpbHRlcmAuCiAgICAgICAqIEByZXR1cm4ge09iamVjdFtdfQogICAgICAgKi8KICAgICAgY2hpbGRyZW5Ub0FycmF5KHBhcmVudCwgb3B0aW9ucykgewogICAgICAgIGNvbnN0IGFycmF5ID0gb3B0aW9ucyAmJiBvcHRpb25zLmFycmF5IHx8IFtdOwogICAgICAgIGNvbnN0IGZpbHRlcjIgPSBvcHRpb25zICYmIG9wdGlvbnMuZmlsdGVyIHx8IHJldHVyblRydWU7CiAgICAgICAgY29uc3QgdGhpc0FyZyA9IG9wdGlvbnMgJiYgb3B0aW9ucy50aGlzQXJnIHx8IHZvaWQgMDsKICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gdGhpcy5fbm9kZShwYXJlbnQpOwogICAgICAgIGxldCBvYmplY3QgPSBwYXJlbnROb2RlLmZpcnN0Q2hpbGQ7CiAgICAgICAgbGV0IGluZGV4MiA9IDA7CiAgICAgICAgd2hpbGUgKG9iamVjdCkgewogICAgICAgICAgY29uc3Qgbm9kZTIgPSB0aGlzLl9ub2RlKG9iamVjdCk7CiAgICAgICAgICBub2RlMi5zZXRDYWNoZWRJbmRleChwYXJlbnROb2RlLCBpbmRleDIpOwogICAgICAgICAgaWYgKGZpbHRlcjIuY2FsbCh0aGlzQXJnLCBvYmplY3QpKSB7CiAgICAgICAgICAgIGFycmF5LnB1c2gob2JqZWN0KTsKICAgICAgICAgIH0KICAgICAgICAgIG9iamVjdCA9IG5vZGUyLm5leHRTaWJsaW5nOwogICAgICAgICAgKytpbmRleDI7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhcnJheTsKICAgICAgfQogICAgICAvKioKICAgICAgICogQXBwZW5kIGFsbCBpbmNsdXNpdmUgYW5jZXN0b3JzIG9mIHRoZSBnaXZlbiBvYmplY3QgdG8gYW4gYXJyYXkuCiAgICAgICAqCiAgICAgICAqICogYE8obilgIHdoZXJlIGBuYCBpcyB0aGUgYW1vdW50IG9mIGFuY2VzdG9ycyBvZiB0aGUgZ2l2ZW4gYG9iamVjdGAKICAgICAgICoKICAgICAgICogQG1ldGhvZCBhbmNlc3RvcnNUb0FycmF5CiAgICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6c3ltYm9sLXRyZWUjCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QKICAgICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXQogICAgICAgKiBAcGFyYW0ge09iamVjdFtdfSBbb3B0aW9ucy5hcnJheT1bXV0KICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuZmlsdGVyXSBGdW5jdGlvbiB0byB0ZXN0IGVhY2ggb2JqZWN0IGJlZm9yZSBpdCBpcyBhZGRlZCB0byB0aGUgYXJyYXkuCiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludm9rZWQgd2l0aCBhcmd1bWVudHMgKG9iamVjdCkuIFNob3VsZCByZXR1cm4gYHRydWVgIGlmIGFuIG9iamVjdAogICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB0byBiZSBpbmNsdWRlZC4KICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9ucy50aGlzQXJnXSBWYWx1ZSB0byB1c2UgYXMgYHRoaXNgIHdoZW4gZXhlY3V0aW5nIGBmaWx0ZXJgLgogICAgICAgKiBAcmV0dXJuIHtPYmplY3RbXX0KICAgICAgICovCiAgICAgIGFuY2VzdG9yc1RvQXJyYXkob2JqZWN0LCBvcHRpb25zKSB7CiAgICAgICAgY29uc3QgYXJyYXkgPSBvcHRpb25zICYmIG9wdGlvbnMuYXJyYXkgfHwgW107CiAgICAgICAgY29uc3QgZmlsdGVyMiA9IG9wdGlvbnMgJiYgb3B0aW9ucy5maWx0ZXIgfHwgcmV0dXJuVHJ1ZTsKICAgICAgICBjb25zdCB0aGlzQXJnID0gb3B0aW9ucyAmJiBvcHRpb25zLnRoaXNBcmcgfHwgdm9pZCAwOwogICAgICAgIGxldCBhbmNlc3RvciA9IG9iamVjdDsKICAgICAgICB3aGlsZSAoYW5jZXN0b3IpIHsKICAgICAgICAgIGlmIChmaWx0ZXIyLmNhbGwodGhpc0FyZywgYW5jZXN0b3IpKSB7CiAgICAgICAgICAgIGFycmF5LnB1c2goYW5jZXN0b3IpOwogICAgICAgICAgfQogICAgICAgICAgYW5jZXN0b3IgPSB0aGlzLl9ub2RlKGFuY2VzdG9yKS5wYXJlbnQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhcnJheTsKICAgICAgfQogICAgICAvKioKICAgICAgICogQXBwZW5kIGFsbCBkZXNjZW5kYW50cyBvZiB0aGUgZ2l2ZW4gb2JqZWN0IHRvIGFuIGFycmF5IChpbiB0cmVlIG9yZGVyKS4KICAgICAgICoKICAgICAgICogKiBgTyhuKWAgd2hlcmUgYG5gIGlzIHRoZSBhbW91bnQgb2Ygb2JqZWN0cyBpbiB0aGUgc3ViLXRyZWUgb2YgdGhlIGdpdmVuIGBvYmplY3RgCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgdHJlZVRvQXJyYXkKICAgICAgICogQG1lbWJlck9mIG1vZHVsZTpzeW1ib2wtdHJlZSMKICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJvb3QKICAgICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXQogICAgICAgKiBAcGFyYW0ge09iamVjdFtdfSBbb3B0aW9ucy5hcnJheT1bXV0KICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuZmlsdGVyXSBGdW5jdGlvbiB0byB0ZXN0IGVhY2ggb2JqZWN0IGJlZm9yZSBpdCBpcyBhZGRlZCB0byB0aGUgYXJyYXkuCiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludm9rZWQgd2l0aCBhcmd1bWVudHMgKG9iamVjdCkuIFNob3VsZCByZXR1cm4gYHRydWVgIGlmIGFuIG9iamVjdAogICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB0byBiZSBpbmNsdWRlZC4KICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9ucy50aGlzQXJnXSBWYWx1ZSB0byB1c2UgYXMgYHRoaXNgIHdoZW4gZXhlY3V0aW5nIGBmaWx0ZXJgLgogICAgICAgKiBAcmV0dXJuIHtPYmplY3RbXX0KICAgICAgICovCiAgICAgIHRyZWVUb0FycmF5KHJvb3Q2LCBvcHRpb25zKSB7CiAgICAgICAgY29uc3QgYXJyYXkgPSBvcHRpb25zICYmIG9wdGlvbnMuYXJyYXkgfHwgW107CiAgICAgICAgY29uc3QgZmlsdGVyMiA9IG9wdGlvbnMgJiYgb3B0aW9ucy5maWx0ZXIgfHwgcmV0dXJuVHJ1ZTsKICAgICAgICBjb25zdCB0aGlzQXJnID0gb3B0aW9ucyAmJiBvcHRpb25zLnRoaXNBcmcgfHwgdm9pZCAwOwogICAgICAgIGxldCBvYmplY3QgPSByb290NjsKICAgICAgICB3aGlsZSAob2JqZWN0KSB7CiAgICAgICAgICBpZiAoZmlsdGVyMi5jYWxsKHRoaXNBcmcsIG9iamVjdCkpIHsKICAgICAgICAgICAgYXJyYXkucHVzaChvYmplY3QpOwogICAgICAgICAgfQogICAgICAgICAgb2JqZWN0ID0gdGhpcy5mb2xsb3dpbmcob2JqZWN0LCB7IHJvb3Q6IHJvb3Q2IH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEl0ZXJhdGUgb3ZlciBhbGwgY2hpbGRyZW4gb2YgdGhlIGdpdmVuIG9iamVjdAogICAgICAgKgogICAgICAgKiAqIGBPKDEpYCBmb3IgYSBzaW5nbGUgaXRlcmF0aW9uCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgY2hpbGRyZW5JdGVyYXRvcgogICAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOnN5bWJvbC10cmVlIwogICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyZW50CiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10KICAgICAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5yZXZlcnNlPWZhbHNlXQogICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEFuIGl0ZXJhYmxlIGl0ZXJhdG9yIChFUzYpCiAgICAgICAqLwogICAgICBjaGlsZHJlbkl0ZXJhdG9yKHBhcmVudCwgb3B0aW9ucykgewogICAgICAgIGNvbnN0IHJldmVyc2UgPSBvcHRpb25zICYmIG9wdGlvbnMucmV2ZXJzZTsKICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gdGhpcy5fbm9kZShwYXJlbnQpOwogICAgICAgIHJldHVybiBuZXcgVHJlZUl0ZXJhdG9yKAogICAgICAgICAgdGhpcywKICAgICAgICAgIHBhcmVudCwKICAgICAgICAgIHJldmVyc2UgPyBwYXJlbnROb2RlLmxhc3RDaGlsZCA6IHBhcmVudE5vZGUuZmlyc3RDaGlsZCwKICAgICAgICAgIHJldmVyc2UgPyBUcmVlSXRlcmF0b3IuUFJFViA6IFRyZWVJdGVyYXRvci5ORVhUCiAgICAgICAgKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogSXRlcmF0ZSBvdmVyIGFsbCB0aGUgcHJldmlvdXMgc2libGluZ3Mgb2YgdGhlIGdpdmVuIG9iamVjdC4gKGluIHJldmVyc2UgdHJlZSBvcmRlcikKICAgICAgICoKICAgICAgICogKiBgTygxKWAgZm9yIGEgc2luZ2xlIGl0ZXJhdGlvbgogICAgICAgKgogICAgICAgKiBAbWV0aG9kIHByZXZpb3VzU2libGluZ3NJdGVyYXRvcgogICAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOnN5bWJvbC10cmVlIwogICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0CiAgICAgICAqIEByZXR1cm4ge09iamVjdH0gQW4gaXRlcmFibGUgaXRlcmF0b3IgKEVTNikKICAgICAgICovCiAgICAgIHByZXZpb3VzU2libGluZ3NJdGVyYXRvcihvYmplY3QpIHsKICAgICAgICByZXR1cm4gbmV3IFRyZWVJdGVyYXRvcigKICAgICAgICAgIHRoaXMsCiAgICAgICAgICBvYmplY3QsCiAgICAgICAgICB0aGlzLl9ub2RlKG9iamVjdCkucHJldmlvdXNTaWJsaW5nLAogICAgICAgICAgVHJlZUl0ZXJhdG9yLlBSRVYKICAgICAgICApOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBJdGVyYXRlIG92ZXIgYWxsIHRoZSBuZXh0IHNpYmxpbmdzIG9mIHRoZSBnaXZlbiBvYmplY3QuIChpbiB0cmVlIG9yZGVyKQogICAgICAgKgogICAgICAgKiAqIGBPKDEpYCBmb3IgYSBzaW5nbGUgaXRlcmF0aW9uCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgbmV4dFNpYmxpbmdzSXRlcmF0b3IKICAgICAgICogQG1lbWJlck9mIG1vZHVsZTpzeW1ib2wtdHJlZSMKICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdAogICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEFuIGl0ZXJhYmxlIGl0ZXJhdG9yIChFUzYpCiAgICAgICAqLwogICAgICBuZXh0U2libGluZ3NJdGVyYXRvcihvYmplY3QpIHsKICAgICAgICByZXR1cm4gbmV3IFRyZWVJdGVyYXRvcigKICAgICAgICAgIHRoaXMsCiAgICAgICAgICBvYmplY3QsCiAgICAgICAgICB0aGlzLl9ub2RlKG9iamVjdCkubmV4dFNpYmxpbmcsCiAgICAgICAgICBUcmVlSXRlcmF0b3IuTkVYVAogICAgICAgICk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEl0ZXJhdGUgb3ZlciBhbGwgaW5jbHVzaXZlIGFuY2VzdG9ycyBvZiB0aGUgZ2l2ZW4gb2JqZWN0CiAgICAgICAqCiAgICAgICAqICogYE8oMSlgIGZvciBhIHNpbmdsZSBpdGVyYXRpb24KICAgICAgICoKICAgICAgICogQG1ldGhvZCBhbmNlc3RvcnNJdGVyYXRvcgogICAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOnN5bWJvbC10cmVlIwogICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0CiAgICAgICAqIEByZXR1cm4ge09iamVjdH0gQW4gaXRlcmFibGUgaXRlcmF0b3IgKEVTNikKICAgICAgICovCiAgICAgIGFuY2VzdG9yc0l0ZXJhdG9yKG9iamVjdCkgewogICAgICAgIHJldHVybiBuZXcgVHJlZUl0ZXJhdG9yKAogICAgICAgICAgdGhpcywKICAgICAgICAgIG9iamVjdCwKICAgICAgICAgIG9iamVjdCwKICAgICAgICAgIFRyZWVJdGVyYXRvci5QQVJFTlQKICAgICAgICApOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBJdGVyYXRlIG92ZXIgYWxsIGRlc2NlbmRhbnRzIG9mIHRoZSBnaXZlbiBvYmplY3QgKGluIHRyZWUgb3JkZXIpLgogICAgICAgKgogICAgICAgKiBXaGVyZSBgbmAgaXMgdGhlIGFtb3VudCBvZiBvYmplY3RzIGluIHRoZSBzdWItdHJlZSBvZiB0aGUgZ2l2ZW4gYHJvb3RgOgogICAgICAgKgogICAgICAgKiAqIGBPKG4pYCAod29yc3QgY2FzZSBmb3IgYSBzaW5nbGUgaXRlcmF0aW9uKQogICAgICAgKiAqIGBPKG4pYCAoYW1vcnRpemVkLCB3aGVuIGNvbXBsZXRpbmcgdGhlIGl0ZXJhdG9yKQogICAgICAgKgogICAgICAgKiBAbWV0aG9kIHRyZWVJdGVyYXRvcgogICAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOnN5bWJvbC10cmVlIwogICAgICAgKiBAcGFyYW0ge09iamVjdH0gcm9vdAogICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucwogICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnJldmVyc2U9ZmFsc2VdCiAgICAgICAqIEByZXR1cm4ge09iamVjdH0gQW4gaXRlcmFibGUgaXRlcmF0b3IgKEVTNikKICAgICAgICovCiAgICAgIHRyZWVJdGVyYXRvcihyb290Niwgb3B0aW9ucykgewogICAgICAgIGNvbnN0IHJldmVyc2UgPSBvcHRpb25zICYmIG9wdGlvbnMucmV2ZXJzZTsKICAgICAgICByZXR1cm4gbmV3IFRyZWVJdGVyYXRvcigKICAgICAgICAgIHRoaXMsCiAgICAgICAgICByb290NiwKICAgICAgICAgIHJldmVyc2UgPyB0aGlzLmxhc3RJbmNsdXNpdmVEZXNjZW5kYW50KHJvb3Q2KSA6IHJvb3Q2LAogICAgICAgICAgcmV2ZXJzZSA/IFRyZWVJdGVyYXRvci5QUkVDRURJTkcgOiBUcmVlSXRlcmF0b3IuRk9MTE9XSU5HCiAgICAgICAgKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogRmluZCB0aGUgaW5kZXggb2YgdGhlIGdpdmVuIG9iamVjdCAodGhlIG51bWJlciBvZiBwcmVjZWRpbmcgc2libGluZ3MpLgogICAgICAgKgogICAgICAgKiAqIGBPKG4pYCB3aGVyZSBgbmAgaXMgdGhlIGFtb3VudCBvZiBwcmVjZWRpbmcgc2libGluZ3MKICAgICAgICogKiBgTygxKWAgKGFtb3J0aXplZCwgaWYgdGhlIHRyZWUgaXMgbm90IG1vZGlmaWVkKQogICAgICAgKgogICAgICAgKiBAbWV0aG9kIGluZGV4CiAgICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6c3ltYm9sLXRyZWUjCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjaGlsZAogICAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IFRoZSBudW1iZXIgb2YgcHJlY2VkaW5nIHNpYmxpbmdzLCBvciAtMSBpZiB0aGUgb2JqZWN0IGhhcyBubyBwYXJlbnQKICAgICAgICovCiAgICAgIGluZGV4KGNoaWxkKSB7CiAgICAgICAgY29uc3QgY2hpbGROb2RlID0gdGhpcy5fbm9kZShjaGlsZCk7CiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuX25vZGUoY2hpbGROb2RlLnBhcmVudCk7CiAgICAgICAgaWYgKCFwYXJlbnROb2RlKSB7CiAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgICAgIGxldCBjdXJyZW50SW5kZXggPSBjaGlsZE5vZGUuZ2V0Q2FjaGVkSW5kZXgocGFyZW50Tm9kZSk7CiAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA+PSAwKSB7CiAgICAgICAgICByZXR1cm4gY3VycmVudEluZGV4OwogICAgICAgIH0KICAgICAgICBjdXJyZW50SW5kZXggPSAwOwogICAgICAgIGxldCBvYmplY3QgPSBwYXJlbnROb2RlLmZpcnN0Q2hpbGQ7CiAgICAgICAgaWYgKHBhcmVudE5vZGUuY2hpbGRJbmRleENhY2hlZFVwVG8pIHsKICAgICAgICAgIGNvbnN0IGNhY2hlZFVwVG9Ob2RlID0gdGhpcy5fbm9kZShwYXJlbnROb2RlLmNoaWxkSW5kZXhDYWNoZWRVcFRvKTsKICAgICAgICAgIG9iamVjdCA9IGNhY2hlZFVwVG9Ob2RlLm5leHRTaWJsaW5nOwogICAgICAgICAgY3VycmVudEluZGV4ID0gY2FjaGVkVXBUb05vZGUuZ2V0Q2FjaGVkSW5kZXgocGFyZW50Tm9kZSkgKyAxOwogICAgICAgIH0KICAgICAgICB3aGlsZSAob2JqZWN0KSB7CiAgICAgICAgICBjb25zdCBub2RlMiA9IHRoaXMuX25vZGUob2JqZWN0KTsKICAgICAgICAgIG5vZGUyLnNldENhY2hlZEluZGV4KHBhcmVudE5vZGUsIGN1cnJlbnRJbmRleCk7CiAgICAgICAgICBpZiAob2JqZWN0ID09PSBjaGlsZCkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgICsrY3VycmVudEluZGV4OwogICAgICAgICAgb2JqZWN0ID0gbm9kZTIubmV4dFNpYmxpbmc7CiAgICAgICAgfQogICAgICAgIHBhcmVudE5vZGUuY2hpbGRJbmRleENhY2hlZFVwVG8gPSBjaGlsZDsKICAgICAgICByZXR1cm4gY3VycmVudEluZGV4OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBjaGlsZHJlbi4KICAgICAgICoKICAgICAgICogKiBgTyhuKWAgd2hlcmUgYG5gIGlzIHRoZSBhbW91bnQgb2YgY2hpbGRyZW4KICAgICAgICogKiBgTygxKWAgKGFtb3J0aXplZCwgaWYgdGhlIHRyZWUgaXMgbm90IG1vZGlmaWVkKQogICAgICAgKgogICAgICAgKiBAbWV0aG9kIGNoaWxkcmVuQ291bnQKICAgICAgICogQG1lbWJlck9mIG1vZHVsZTpzeW1ib2wtdHJlZSMKICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmVudAogICAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9CiAgICAgICAqLwogICAgICBjaGlsZHJlbkNvdW50KHBhcmVudCkgewogICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLl9ub2RlKHBhcmVudCk7CiAgICAgICAgaWYgKCFwYXJlbnROb2RlLmxhc3RDaGlsZCkgewogICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLmluZGV4KHBhcmVudE5vZGUubGFzdENoaWxkKSArIDE7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIENvbXBhcmUgdGhlIHBvc2l0aW9uIG9mIGFuIG9iamVjdCByZWxhdGl2ZSB0byBhbm90aGVyIG9iamVjdC4gQSBiaXQgc2V0IGlzIHJldHVybmVkOgogICAgICAgKgogICAgICAgKiA8dWw+CiAgICAgICAqICAgICA8bGk+RElTQ09OTkVDVEVEIDogMTwvbGk+CiAgICAgICAqICAgICA8bGk+UFJFQ0VESU5HIDogMjwvbGk+CiAgICAgICAqICAgICA8bGk+Rk9MTE9XSU5HIDogNDwvbGk+CiAgICAgICAqICAgICA8bGk+Q09OVEFJTlMgOiA4PC9saT4KICAgICAgICogICAgIDxsaT5DT05UQUlORURfQlkgOiAxNjwvbGk+CiAgICAgICAqIDwvdWw+CiAgICAgICAqCiAgICAgICAqIFRoZSBzZW1hbnRpY3MgYXJlIHRoZSBzYW1lIGFzIGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIGluIERPTSwgd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQKICAgICAgICogRElTQ09OTkVDVEVEIG5ldmVyIG9jY3VycyB3aXRoIGFueSBvdGhlciBiaXQuCiAgICAgICAqCiAgICAgICAqIHdoZXJlIGBuYCBhbmQgYG1gIGFyZSB0aGUgYW1vdW50IG9mIGFuY2VzdG9ycyBvZiBgbGVmdGAgYW5kIGByaWdodGA7CiAgICAgICAqIHdoZXJlIGBvYCBpcyB0aGUgYW1vdW50IG9mIGNoaWxkcmVuIG9mIHRoZSBsb3dlc3QgY29tbW9uIGFuY2VzdG9yIG9mIGBsZWZ0YCBhbmQgYHJpZ2h0YDoKICAgICAgICoKICAgICAgICogKiBgTyhuICsgbSArIG8pYCAod29yc3QgY2FzZSkKICAgICAgICogKiBgTyhuICsgbSlgIChhbW9ydGl6ZWQsIGlmIHRoZSB0cmVlIGlzIG5vdCBtb2RpZmllZCkKICAgICAgICoKICAgICAgICogQG1ldGhvZCBjb21wYXJlVHJlZVBvc2l0aW9uCiAgICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6c3ltYm9sLXRyZWUjCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBsZWZ0CiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByaWdodAogICAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9CiAgICAgICAqLwogICAgICBjb21wYXJlVHJlZVBvc2l0aW9uKGxlZnQsIHJpZ2h0KSB7CiAgICAgICAgaWYgKGxlZnQgPT09IHJpZ2h0KSB7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgY29uc3QgbGVmdEFuY2VzdG9ycyA9IFtdOwogICAgICAgIHsKICAgICAgICAgIGxldCBsZWZ0QW5jZXN0b3IgPSBsZWZ0OwogICAgICAgICAgd2hpbGUgKGxlZnRBbmNlc3RvcikgewogICAgICAgICAgICBpZiAobGVmdEFuY2VzdG9yID09PSByaWdodCkgewogICAgICAgICAgICAgIHJldHVybiBUcmVlUG9zaXRpb24uQ09OVEFJTlMgfCBUcmVlUG9zaXRpb24uUFJFQ0VESU5HOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxlZnRBbmNlc3RvcnMucHVzaChsZWZ0QW5jZXN0b3IpOwogICAgICAgICAgICBsZWZ0QW5jZXN0b3IgPSB0aGlzLnBhcmVudChsZWZ0QW5jZXN0b3IpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCByaWdodEFuY2VzdG9ycyA9IFtdOwogICAgICAgIHsKICAgICAgICAgIGxldCByaWdodEFuY2VzdG9yID0gcmlnaHQ7CiAgICAgICAgICB3aGlsZSAocmlnaHRBbmNlc3RvcikgewogICAgICAgICAgICBpZiAocmlnaHRBbmNlc3RvciA9PT0gbGVmdCkgewogICAgICAgICAgICAgIHJldHVybiBUcmVlUG9zaXRpb24uQ09OVEFJTkVEX0JZIHwgVHJlZVBvc2l0aW9uLkZPTExPV0lORzsKICAgICAgICAgICAgfQogICAgICAgICAgICByaWdodEFuY2VzdG9ycy5wdXNoKHJpZ2h0QW5jZXN0b3IpOwogICAgICAgICAgICByaWdodEFuY2VzdG9yID0gdGhpcy5wYXJlbnQocmlnaHRBbmNlc3Rvcik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJvb3Q2ID0gcmV2ZXJzZUFycmF5SW5kZXgobGVmdEFuY2VzdG9ycywgMCk7CiAgICAgICAgaWYgKCFyb290NiB8fCByb290NiAhPT0gcmV2ZXJzZUFycmF5SW5kZXgocmlnaHRBbmNlc3RvcnMsIDApKSB7CiAgICAgICAgICByZXR1cm4gVHJlZVBvc2l0aW9uLkRJU0NPTk5FQ1RFRDsKICAgICAgICB9CiAgICAgICAgbGV0IGNvbW1vbkFuY2VzdG9ySW5kZXggPSAwOwogICAgICAgIGNvbnN0IGFuY2VzdG9yc01pbkxlbmd0aCA9IE1hdGgubWluKGxlZnRBbmNlc3RvcnMubGVuZ3RoLCByaWdodEFuY2VzdG9ycy5sZW5ndGgpOwogICAgICAgIGZvciAobGV0IGkxMCA9IDA7IGkxMCA8IGFuY2VzdG9yc01pbkxlbmd0aDsgKytpMTApIHsKICAgICAgICAgIGNvbnN0IGxlZnRBbmNlc3RvciA9IHJldmVyc2VBcnJheUluZGV4KGxlZnRBbmNlc3RvcnMsIGkxMCk7CiAgICAgICAgICBjb25zdCByaWdodEFuY2VzdG9yID0gcmV2ZXJzZUFycmF5SW5kZXgocmlnaHRBbmNlc3RvcnMsIGkxMCk7CiAgICAgICAgICBpZiAobGVmdEFuY2VzdG9yICE9PSByaWdodEFuY2VzdG9yKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY29tbW9uQW5jZXN0b3JJbmRleCA9IGkxMDsKICAgICAgICB9CiAgICAgICAgY29uc3QgbGVmdEluZGV4ID0gdGhpcy5pbmRleChyZXZlcnNlQXJyYXlJbmRleChsZWZ0QW5jZXN0b3JzLCBjb21tb25BbmNlc3RvckluZGV4ICsgMSkpOwogICAgICAgIGNvbnN0IHJpZ2h0SW5kZXggPSB0aGlzLmluZGV4KHJldmVyc2VBcnJheUluZGV4KHJpZ2h0QW5jZXN0b3JzLCBjb21tb25BbmNlc3RvckluZGV4ICsgMSkpOwogICAgICAgIHJldHVybiByaWdodEluZGV4IDwgbGVmdEluZGV4ID8gVHJlZVBvc2l0aW9uLlBSRUNFRElORyA6IFRyZWVQb3NpdGlvbi5GT0xMT1dJTkc7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFJlbW92ZSB0aGUgb2JqZWN0IGZyb20gdGhpcyB0cmVlLgogICAgICAgKiBIYXMgbm8gZWZmZWN0IGlmIGFscmVhZHkgcmVtb3ZlZC4KICAgICAgICoKICAgICAgICogKiBgTygxKWAKICAgICAgICoKICAgICAgICogQG1ldGhvZCByZW1vdmUKICAgICAgICogQG1lbWJlck9mIG1vZHVsZTpzeW1ib2wtdHJlZSMKICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlbW92ZU9iamVjdAogICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHJlbW92ZU9iamVjdAogICAgICAgKi8KICAgICAgcmVtb3ZlKHJlbW92ZU9iamVjdCkgewogICAgICAgIGNvbnN0IHJlbW92ZU5vZGUgPSB0aGlzLl9ub2RlKHJlbW92ZU9iamVjdCk7CiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuX25vZGUocmVtb3ZlTm9kZS5wYXJlbnQpOwogICAgICAgIGNvbnN0IHByZXZOb2RlID0gdGhpcy5fbm9kZShyZW1vdmVOb2RlLnByZXZpb3VzU2libGluZyk7CiAgICAgICAgY29uc3QgbmV4dE5vZGUgPSB0aGlzLl9ub2RlKHJlbW92ZU5vZGUubmV4dFNpYmxpbmcpOwogICAgICAgIGlmIChwYXJlbnROb2RlKSB7CiAgICAgICAgICBpZiAocGFyZW50Tm9kZS5maXJzdENoaWxkID09PSByZW1vdmVPYmplY3QpIHsKICAgICAgICAgICAgcGFyZW50Tm9kZS5maXJzdENoaWxkID0gcmVtb3ZlTm9kZS5uZXh0U2libGluZzsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChwYXJlbnROb2RlLmxhc3RDaGlsZCA9PT0gcmVtb3ZlT2JqZWN0KSB7CiAgICAgICAgICAgIHBhcmVudE5vZGUubGFzdENoaWxkID0gcmVtb3ZlTm9kZS5wcmV2aW91c1NpYmxpbmc7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChwcmV2Tm9kZSkgewogICAgICAgICAgcHJldk5vZGUubmV4dFNpYmxpbmcgPSByZW1vdmVOb2RlLm5leHRTaWJsaW5nOwogICAgICAgIH0KICAgICAgICBpZiAobmV4dE5vZGUpIHsKICAgICAgICAgIG5leHROb2RlLnByZXZpb3VzU2libGluZyA9IHJlbW92ZU5vZGUucHJldmlvdXNTaWJsaW5nOwogICAgICAgIH0KICAgICAgICByZW1vdmVOb2RlLnBhcmVudCA9IG51bGw7CiAgICAgICAgcmVtb3ZlTm9kZS5wcmV2aW91c1NpYmxpbmcgPSBudWxsOwogICAgICAgIHJlbW92ZU5vZGUubmV4dFNpYmxpbmcgPSBudWxsOwogICAgICAgIHJlbW92ZU5vZGUuY2FjaGVkSW5kZXggPSAtMTsKICAgICAgICByZW1vdmVOb2RlLmNhY2hlZEluZGV4VmVyc2lvbiA9IE5hTjsKICAgICAgICBpZiAocGFyZW50Tm9kZSkgewogICAgICAgICAgcGFyZW50Tm9kZS5jaGlsZHJlbkNoYW5nZWQoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlbW92ZU9iamVjdDsKICAgICAgfQogICAgICAvKioKICAgICAgICogSW5zZXJ0IHRoZSBnaXZlbiBvYmplY3QgYmVmb3JlIHRoZSByZWZlcmVuY2Ugb2JqZWN0LgogICAgICAgKiBgbmV3T2JqZWN0YCBpcyBub3cgdGhlIHByZXZpb3VzIHNpYmxpbmcgb2YgYHJlZmVyZW5jZU9iamVjdGAuCiAgICAgICAqCiAgICAgICAqICogYE8oMSlgCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgaW5zZXJ0QmVmb3JlCiAgICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6c3ltYm9sLXRyZWUjCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZWZlcmVuY2VPYmplY3QKICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5ld09iamVjdAogICAgICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIG5ld09iamVjdCBpcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhpcyBTeW1ib2xUcmVlCiAgICAgICAqIEByZXR1cm4ge09iamVjdH0gbmV3T2JqZWN0CiAgICAgICAqLwogICAgICBpbnNlcnRCZWZvcmUocmVmZXJlbmNlT2JqZWN0LCBuZXdPYmplY3QpIHsKICAgICAgICBjb25zdCByZWZlcmVuY2VOb2RlID0gdGhpcy5fbm9kZShyZWZlcmVuY2VPYmplY3QpOwogICAgICAgIGNvbnN0IHByZXZOb2RlID0gdGhpcy5fbm9kZShyZWZlcmVuY2VOb2RlLnByZXZpb3VzU2libGluZyk7CiAgICAgICAgY29uc3QgbmV3Tm9kZSA9IHRoaXMuX25vZGUobmV3T2JqZWN0KTsKICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gdGhpcy5fbm9kZShyZWZlcmVuY2VOb2RlLnBhcmVudCk7CiAgICAgICAgaWYgKG5ld05vZGUuaXNBdHRhY2hlZCkgewogICAgICAgICAgdGhyb3cgRXJyb3IoIkdpdmVuIG9iamVjdCBpcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhpcyBTeW1ib2xUcmVlLCByZW1vdmUgaXQgZmlyc3QiKTsKICAgICAgICB9CiAgICAgICAgbmV3Tm9kZS5wYXJlbnQgPSByZWZlcmVuY2VOb2RlLnBhcmVudDsKICAgICAgICBuZXdOb2RlLnByZXZpb3VzU2libGluZyA9IHJlZmVyZW5jZU5vZGUucHJldmlvdXNTaWJsaW5nOwogICAgICAgIG5ld05vZGUubmV4dFNpYmxpbmcgPSByZWZlcmVuY2VPYmplY3Q7CiAgICAgICAgcmVmZXJlbmNlTm9kZS5wcmV2aW91c1NpYmxpbmcgPSBuZXdPYmplY3Q7CiAgICAgICAgaWYgKHByZXZOb2RlKSB7CiAgICAgICAgICBwcmV2Tm9kZS5uZXh0U2libGluZyA9IG5ld09iamVjdDsKICAgICAgICB9CiAgICAgICAgaWYgKHBhcmVudE5vZGUgJiYgcGFyZW50Tm9kZS5maXJzdENoaWxkID09PSByZWZlcmVuY2VPYmplY3QpIHsKICAgICAgICAgIHBhcmVudE5vZGUuZmlyc3RDaGlsZCA9IG5ld09iamVjdDsKICAgICAgICB9CiAgICAgICAgaWYgKHBhcmVudE5vZGUpIHsKICAgICAgICAgIHBhcmVudE5vZGUuY2hpbGRyZW5DaGFuZ2VkKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXdPYmplY3Q7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEluc2VydCB0aGUgZ2l2ZW4gb2JqZWN0IGFmdGVyIHRoZSByZWZlcmVuY2Ugb2JqZWN0LgogICAgICAgKiBgbmV3T2JqZWN0YCBpcyBub3cgdGhlIG5leHQgc2libGluZyBvZiBgcmVmZXJlbmNlT2JqZWN0YC4KICAgICAgICoKICAgICAgICogKiBgTygxKWAKICAgICAgICoKICAgICAgICogQG1ldGhvZCBpbnNlcnRBZnRlcgogICAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOnN5bWJvbC10cmVlIwogICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVmZXJlbmNlT2JqZWN0CiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuZXdPYmplY3QKICAgICAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBuZXdPYmplY3QgaXMgYWxyZWFkeSBwcmVzZW50IGluIHRoaXMgU3ltYm9sVHJlZQogICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IG5ld09iamVjdAogICAgICAgKi8KICAgICAgaW5zZXJ0QWZ0ZXIocmVmZXJlbmNlT2JqZWN0LCBuZXdPYmplY3QpIHsKICAgICAgICBjb25zdCByZWZlcmVuY2VOb2RlID0gdGhpcy5fbm9kZShyZWZlcmVuY2VPYmplY3QpOwogICAgICAgIGNvbnN0IG5leHROb2RlID0gdGhpcy5fbm9kZShyZWZlcmVuY2VOb2RlLm5leHRTaWJsaW5nKTsKICAgICAgICBjb25zdCBuZXdOb2RlID0gdGhpcy5fbm9kZShuZXdPYmplY3QpOwogICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLl9ub2RlKHJlZmVyZW5jZU5vZGUucGFyZW50KTsKICAgICAgICBpZiAobmV3Tm9kZS5pc0F0dGFjaGVkKSB7CiAgICAgICAgICB0aHJvdyBFcnJvcigiR2l2ZW4gb2JqZWN0IGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGlzIFN5bWJvbFRyZWUsIHJlbW92ZSBpdCBmaXJzdCIpOwogICAgICAgIH0KICAgICAgICBuZXdOb2RlLnBhcmVudCA9IHJlZmVyZW5jZU5vZGUucGFyZW50OwogICAgICAgIG5ld05vZGUucHJldmlvdXNTaWJsaW5nID0gcmVmZXJlbmNlT2JqZWN0OwogICAgICAgIG5ld05vZGUubmV4dFNpYmxpbmcgPSByZWZlcmVuY2VOb2RlLm5leHRTaWJsaW5nOwogICAgICAgIHJlZmVyZW5jZU5vZGUubmV4dFNpYmxpbmcgPSBuZXdPYmplY3Q7CiAgICAgICAgaWYgKG5leHROb2RlKSB7CiAgICAgICAgICBuZXh0Tm9kZS5wcmV2aW91c1NpYmxpbmcgPSBuZXdPYmplY3Q7CiAgICAgICAgfQogICAgICAgIGlmIChwYXJlbnROb2RlICYmIHBhcmVudE5vZGUubGFzdENoaWxkID09PSByZWZlcmVuY2VPYmplY3QpIHsKICAgICAgICAgIHBhcmVudE5vZGUubGFzdENoaWxkID0gbmV3T2JqZWN0OwogICAgICAgIH0KICAgICAgICBpZiAocGFyZW50Tm9kZSkgewogICAgICAgICAgcGFyZW50Tm9kZS5jaGlsZHJlbkNoYW5nZWQoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ld09iamVjdDsKICAgICAgfQogICAgICAvKioKICAgICAgICogSW5zZXJ0IHRoZSBnaXZlbiBvYmplY3QgYXMgdGhlIGZpcnN0IGNoaWxkIG9mIHRoZSBnaXZlbiByZWZlcmVuY2Ugb2JqZWN0LgogICAgICAgKiBgbmV3T2JqZWN0YCBpcyBub3cgdGhlIGZpcnN0IGNoaWxkIG9mIGByZWZlcmVuY2VPYmplY3RgLgogICAgICAgKgogICAgICAgKiAqIGBPKDEpYAogICAgICAgKgogICAgICAgKiBAbWV0aG9kIHByZXBlbmRDaGlsZAogICAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOnN5bWJvbC10cmVlIwogICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVmZXJlbmNlT2JqZWN0CiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuZXdPYmplY3QKICAgICAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBuZXdPYmplY3QgaXMgYWxyZWFkeSBwcmVzZW50IGluIHRoaXMgU3ltYm9sVHJlZQogICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IG5ld09iamVjdAogICAgICAgKi8KICAgICAgcHJlcGVuZENoaWxkKHJlZmVyZW5jZU9iamVjdCwgbmV3T2JqZWN0KSB7CiAgICAgICAgY29uc3QgcmVmZXJlbmNlTm9kZSA9IHRoaXMuX25vZGUocmVmZXJlbmNlT2JqZWN0KTsKICAgICAgICBjb25zdCBuZXdOb2RlID0gdGhpcy5fbm9kZShuZXdPYmplY3QpOwogICAgICAgIGlmIChuZXdOb2RlLmlzQXR0YWNoZWQpIHsKICAgICAgICAgIHRocm93IEVycm9yKCJHaXZlbiBvYmplY3QgaXMgYWxyZWFkeSBwcmVzZW50IGluIHRoaXMgU3ltYm9sVHJlZSwgcmVtb3ZlIGl0IGZpcnN0Iik7CiAgICAgICAgfQogICAgICAgIGlmIChyZWZlcmVuY2VOb2RlLmhhc0NoaWxkcmVuKSB7CiAgICAgICAgICB0aGlzLmluc2VydEJlZm9yZShyZWZlcmVuY2VOb2RlLmZpcnN0Q2hpbGQsIG5ld09iamVjdCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG5ld05vZGUucGFyZW50ID0gcmVmZXJlbmNlT2JqZWN0OwogICAgICAgICAgcmVmZXJlbmNlTm9kZS5maXJzdENoaWxkID0gbmV3T2JqZWN0OwogICAgICAgICAgcmVmZXJlbmNlTm9kZS5sYXN0Q2hpbGQgPSBuZXdPYmplY3Q7CiAgICAgICAgICByZWZlcmVuY2VOb2RlLmNoaWxkcmVuQ2hhbmdlZCgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3T2JqZWN0OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBJbnNlcnQgdGhlIGdpdmVuIG9iamVjdCBhcyB0aGUgbGFzdCBjaGlsZCBvZiB0aGUgZ2l2ZW4gcmVmZXJlbmNlIG9iamVjdC4KICAgICAgICogYG5ld09iamVjdGAgaXMgbm93IHRoZSBsYXN0IGNoaWxkIG9mIGByZWZlcmVuY2VPYmplY3RgLgogICAgICAgKgogICAgICAgKiAqIGBPKDEpYAogICAgICAgKgogICAgICAgKiBAbWV0aG9kIGFwcGVuZENoaWxkCiAgICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6c3ltYm9sLXRyZWUjCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZWZlcmVuY2VPYmplY3QKICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5ld09iamVjdAogICAgICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIG5ld09iamVjdCBpcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhpcyBTeW1ib2xUcmVlCiAgICAgICAqIEByZXR1cm4ge09iamVjdH0gbmV3T2JqZWN0CiAgICAgICAqLwogICAgICBhcHBlbmRDaGlsZChyZWZlcmVuY2VPYmplY3QsIG5ld09iamVjdCkgewogICAgICAgIGNvbnN0IHJlZmVyZW5jZU5vZGUgPSB0aGlzLl9ub2RlKHJlZmVyZW5jZU9iamVjdCk7CiAgICAgICAgY29uc3QgbmV3Tm9kZSA9IHRoaXMuX25vZGUobmV3T2JqZWN0KTsKICAgICAgICBpZiAobmV3Tm9kZS5pc0F0dGFjaGVkKSB7CiAgICAgICAgICB0aHJvdyBFcnJvcigiR2l2ZW4gb2JqZWN0IGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGlzIFN5bWJvbFRyZWUsIHJlbW92ZSBpdCBmaXJzdCIpOwogICAgICAgIH0KICAgICAgICBpZiAocmVmZXJlbmNlTm9kZS5oYXNDaGlsZHJlbikgewogICAgICAgICAgdGhpcy5pbnNlcnRBZnRlcihyZWZlcmVuY2VOb2RlLmxhc3RDaGlsZCwgbmV3T2JqZWN0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbmV3Tm9kZS5wYXJlbnQgPSByZWZlcmVuY2VPYmplY3Q7CiAgICAgICAgICByZWZlcmVuY2VOb2RlLmZpcnN0Q2hpbGQgPSBuZXdPYmplY3Q7CiAgICAgICAgICByZWZlcmVuY2VOb2RlLmxhc3RDaGlsZCA9IG5ld09iamVjdDsKICAgICAgICAgIHJlZmVyZW5jZU5vZGUuY2hpbGRyZW5DaGFuZ2VkKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXdPYmplY3Q7CiAgICAgIH0KICAgIH07CiAgICBtb2R1bGUuZXhwb3J0cyA9IFN5bWJvbFRyZWU7CiAgICBTeW1ib2xUcmVlLlRyZWVQb3NpdGlvbiA9IFRyZWVQb3NpdGlvbjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2xvZGFzaC5jbG9uZWRlZXBANC41LjAvbm9kZV9tb2R1bGVzL2xvZGFzaC5jbG9uZWRlZXAvaW5kZXguanMKdmFyIHJlcXVpcmVfbG9kYXNoID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sb2Rhc2guY2xvbmVkZWVwQDQuNS4wL25vZGVfbW9kdWxlcy9sb2Rhc2guY2xvbmVkZWVwL2luZGV4LmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgIHZhciBMQVJHRV9BUlJBWV9TSVpFID0gMjAwOwogICAgdmFyIEhBU0hfVU5ERUZJTkVEID0gIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iOwogICAgdmFyIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxOwogICAgdmFyIGFyZ3NUYWcgPSAiW29iamVjdCBBcmd1bWVudHNdIiwgYXJyYXlUYWcgPSAiW29iamVjdCBBcnJheV0iLCBib29sVGFnID0gIltvYmplY3QgQm9vbGVhbl0iLCBkYXRlVGFnID0gIltvYmplY3QgRGF0ZV0iLCBlcnJvclRhZyA9ICJbb2JqZWN0IEVycm9yXSIsIGZ1bmNUYWcgPSAiW29iamVjdCBGdW5jdGlvbl0iLCBnZW5UYWcgPSAiW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLCBtYXBUYWcgPSAiW29iamVjdCBNYXBdIiwgbnVtYmVyVGFnID0gIltvYmplY3QgTnVtYmVyXSIsIG9iamVjdFRhZyA9ICJbb2JqZWN0IE9iamVjdF0iLCBwcm9taXNlVGFnID0gIltvYmplY3QgUHJvbWlzZV0iLCByZWdleHBUYWcgPSAiW29iamVjdCBSZWdFeHBdIiwgc2V0VGFnID0gIltvYmplY3QgU2V0XSIsIHN0cmluZ1RhZyA9ICJbb2JqZWN0IFN0cmluZ10iLCBzeW1ib2xUYWcgPSAiW29iamVjdCBTeW1ib2xdIiwgd2Vha01hcFRhZyA9ICJbb2JqZWN0IFdlYWtNYXBdIjsKICAgIHZhciBhcnJheUJ1ZmZlclRhZyA9ICJbb2JqZWN0IEFycmF5QnVmZmVyXSIsIGRhdGFWaWV3VGFnID0gIltvYmplY3QgRGF0YVZpZXddIiwgZmxvYXQzMlRhZyA9ICJbb2JqZWN0IEZsb2F0MzJBcnJheV0iLCBmbG9hdDY0VGFnID0gIltvYmplY3QgRmxvYXQ2NEFycmF5XSIsIGludDhUYWcgPSAiW29iamVjdCBJbnQ4QXJyYXldIiwgaW50MTZUYWcgPSAiW29iamVjdCBJbnQxNkFycmF5XSIsIGludDMyVGFnID0gIltvYmplY3QgSW50MzJBcnJheV0iLCB1aW50OFRhZyA9ICJbb2JqZWN0IFVpbnQ4QXJyYXldIiwgdWludDhDbGFtcGVkVGFnID0gIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIiwgdWludDE2VGFnID0gIltvYmplY3QgVWludDE2QXJyYXldIiwgdWludDMyVGFnID0gIltvYmplY3QgVWludDMyQXJyYXldIjsKICAgIHZhciByZVJlZ0V4cENoYXIgPSAvW1xcXiQuKis/KClbXF17fXxdL2c7CiAgICB2YXIgcmVGbGFncyA9IC9cdyokLzsKICAgIHZhciByZUlzSG9zdEN0b3IgPSAvXlxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXF0kLzsKICAgIHZhciByZUlzVWludCA9IC9eKD86MHxbMS05XVxkKikkLzsKICAgIHZhciBjbG9uZWFibGVUYWdzID0ge307CiAgICBjbG9uZWFibGVUYWdzW2FyZ3NUYWddID0gY2xvbmVhYmxlVGFnc1thcnJheVRhZ10gPSBjbG9uZWFibGVUYWdzW2FycmF5QnVmZmVyVGFnXSA9IGNsb25lYWJsZVRhZ3NbZGF0YVZpZXdUYWddID0gY2xvbmVhYmxlVGFnc1tib29sVGFnXSA9IGNsb25lYWJsZVRhZ3NbZGF0ZVRhZ10gPSBjbG9uZWFibGVUYWdzW2Zsb2F0MzJUYWddID0gY2xvbmVhYmxlVGFnc1tmbG9hdDY0VGFnXSA9IGNsb25lYWJsZVRhZ3NbaW50OFRhZ10gPSBjbG9uZWFibGVUYWdzW2ludDE2VGFnXSA9IGNsb25lYWJsZVRhZ3NbaW50MzJUYWddID0gY2xvbmVhYmxlVGFnc1ttYXBUYWddID0gY2xvbmVhYmxlVGFnc1tudW1iZXJUYWddID0gY2xvbmVhYmxlVGFnc1tvYmplY3RUYWddID0gY2xvbmVhYmxlVGFnc1tyZWdleHBUYWddID0gY2xvbmVhYmxlVGFnc1tzZXRUYWddID0gY2xvbmVhYmxlVGFnc1tzdHJpbmdUYWddID0gY2xvbmVhYmxlVGFnc1tzeW1ib2xUYWddID0gY2xvbmVhYmxlVGFnc1t1aW50OFRhZ10gPSBjbG9uZWFibGVUYWdzW3VpbnQ4Q2xhbXBlZFRhZ10gPSBjbG9uZWFibGVUYWdzW3VpbnQxNlRhZ10gPSBjbG9uZWFibGVUYWdzW3VpbnQzMlRhZ10gPSB0cnVlOwogICAgY2xvbmVhYmxlVGFnc1tlcnJvclRhZ10gPSBjbG9uZWFibGVUYWdzW2Z1bmNUYWddID0gY2xvbmVhYmxlVGFnc1t3ZWFrTWFwVGFnXSA9IGZhbHNlOwogICAgdmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICJvYmplY3QiICYmIGdsb2JhbCAmJiBnbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgZ2xvYmFsOwogICAgdmFyIGZyZWVTZWxmID0gdHlwZW9mIHNlbGYgPT0gIm9iamVjdCIgJiYgc2VsZiAmJiBzZWxmLk9iamVjdCA9PT0gT2JqZWN0ICYmIHNlbGY7CiAgICB2YXIgcm9vdDYgPSBmcmVlR2xvYmFsIHx8IGZyZWVTZWxmIHx8IEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCk7CiAgICB2YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAib2JqZWN0IiAmJiBleHBvcnRzICYmICFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7CiAgICB2YXIgZnJlZU1vZHVsZSA9IGZyZWVFeHBvcnRzICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIgJiYgbW9kdWxlICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlOwogICAgdmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7CiAgICBmdW5jdGlvbiBhZGRNYXBFbnRyeShtYXA3LCBwYWlyKSB7CiAgICAgIG1hcDcuc2V0KHBhaXJbMF0sIHBhaXJbMV0pOwogICAgICByZXR1cm4gbWFwNzsKICAgIH0KICAgIF9fbmFtZShhZGRNYXBFbnRyeSwgImFkZE1hcEVudHJ5Iik7CiAgICBmdW5jdGlvbiBhZGRTZXRFbnRyeShzZXQyLCB2YWx1ZTIpIHsKICAgICAgc2V0Mi5hZGQodmFsdWUyKTsKICAgICAgcmV0dXJuIHNldDI7CiAgICB9CiAgICBfX25hbWUoYWRkU2V0RW50cnksICJhZGRTZXRFbnRyeSIpOwogICAgZnVuY3Rpb24gYXJyYXlFYWNoKGFycmF5LCBpdGVyYXRlZSkgewogICAgICB2YXIgaW5kZXgyID0gLTEsIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMDsKICAgICAgd2hpbGUgKCsraW5kZXgyIDwgbGVuZ3RoKSB7CiAgICAgICAgaWYgKGl0ZXJhdGVlKGFycmF5W2luZGV4Ml0sIGluZGV4MiwgYXJyYXkpID09PSBmYWxzZSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBhcnJheTsKICAgIH0KICAgIF9fbmFtZShhcnJheUVhY2gsICJhcnJheUVhY2giKTsKICAgIGZ1bmN0aW9uIGFycmF5UHVzaChhcnJheSwgdmFsdWVzKSB7CiAgICAgIHZhciBpbmRleDIgPSAtMSwgbGVuZ3RoID0gdmFsdWVzLmxlbmd0aCwgb2Zmc2V0ID0gYXJyYXkubGVuZ3RoOwogICAgICB3aGlsZSAoKytpbmRleDIgPCBsZW5ndGgpIHsKICAgICAgICBhcnJheVtvZmZzZXQgKyBpbmRleDJdID0gdmFsdWVzW2luZGV4Ml07CiAgICAgIH0KICAgICAgcmV0dXJuIGFycmF5OwogICAgfQogICAgX19uYW1lKGFycmF5UHVzaCwgImFycmF5UHVzaCIpOwogICAgZnVuY3Rpb24gYXJyYXlSZWR1Y2UoYXJyYXksIGl0ZXJhdGVlLCBhY2N1bXVsYXRvciwgaW5pdEFjY3VtKSB7CiAgICAgIHZhciBpbmRleDIgPSAtMSwgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwOwogICAgICBpZiAoaW5pdEFjY3VtICYmIGxlbmd0aCkgewogICAgICAgIGFjY3VtdWxhdG9yID0gYXJyYXlbKytpbmRleDJdOwogICAgICB9CiAgICAgIHdoaWxlICgrK2luZGV4MiA8IGxlbmd0aCkgewogICAgICAgIGFjY3VtdWxhdG9yID0gaXRlcmF0ZWUoYWNjdW11bGF0b3IsIGFycmF5W2luZGV4Ml0sIGluZGV4MiwgYXJyYXkpOwogICAgICB9CiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjsKICAgIH0KICAgIF9fbmFtZShhcnJheVJlZHVjZSwgImFycmF5UmVkdWNlIik7CiAgICBmdW5jdGlvbiBiYXNlVGltZXMobjExLCBpdGVyYXRlZSkgewogICAgICB2YXIgaW5kZXgyID0gLTEsIHJlc3VsdCA9IEFycmF5KG4xMSk7CiAgICAgIHdoaWxlICgrK2luZGV4MiA8IG4xMSkgewogICAgICAgIHJlc3VsdFtpbmRleDJdID0gaXRlcmF0ZWUoaW5kZXgyKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgX19uYW1lKGJhc2VUaW1lcywgImJhc2VUaW1lcyIpOwogICAgZnVuY3Rpb24gZ2V0VmFsdWUob2JqZWN0LCBrZXkyKSB7CiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHZvaWQgMCA6IG9iamVjdFtrZXkyXTsKICAgIH0KICAgIF9fbmFtZShnZXRWYWx1ZSwgImdldFZhbHVlIik7CiAgICBmdW5jdGlvbiBpc0hvc3RPYmplY3QodmFsdWUyKSB7CiAgICAgIHZhciByZXN1bHQgPSBmYWxzZTsKICAgICAgaWYgKHZhbHVlMiAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZTIudG9TdHJpbmcgIT0gImZ1bmN0aW9uIikgewogICAgICAgIHRyeSB7CiAgICAgICAgICByZXN1bHQgPSAhISh2YWx1ZTIgKyAiIik7CiAgICAgICAgfSBjYXRjaCAoZTEwKSB7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBfX25hbWUoaXNIb3N0T2JqZWN0LCAiaXNIb3N0T2JqZWN0Iik7CiAgICBmdW5jdGlvbiBtYXBUb0FycmF5KG1hcDcpIHsKICAgICAgdmFyIGluZGV4MiA9IC0xLCByZXN1bHQgPSBBcnJheShtYXA3LnNpemUpOwogICAgICBtYXA3LmZvckVhY2goZnVuY3Rpb24odmFsdWUyLCBrZXkyKSB7CiAgICAgICAgcmVzdWx0WysraW5kZXgyXSA9IFtrZXkyLCB2YWx1ZTJdOwogICAgICB9KTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIF9fbmFtZShtYXBUb0FycmF5LCAibWFwVG9BcnJheSIpOwogICAgZnVuY3Rpb24gb3ZlckFyZyhmdW5jLCB0cmFuc2Zvcm0yKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihhcmcpIHsKICAgICAgICByZXR1cm4gZnVuYyh0cmFuc2Zvcm0yKGFyZykpOwogICAgICB9OwogICAgfQogICAgX19uYW1lKG92ZXJBcmcsICJvdmVyQXJnIik7CiAgICBmdW5jdGlvbiBzZXRUb0FycmF5KHNldDIpIHsKICAgICAgdmFyIGluZGV4MiA9IC0xLCByZXN1bHQgPSBBcnJheShzZXQyLnNpemUpOwogICAgICBzZXQyLmZvckVhY2goZnVuY3Rpb24odmFsdWUyKSB7CiAgICAgICAgcmVzdWx0WysraW5kZXgyXSA9IHZhbHVlMjsKICAgICAgfSk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBfX25hbWUoc2V0VG9BcnJheSwgInNldFRvQXJyYXkiKTsKICAgIHZhciBhcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlLCBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsIG9iamVjdFByb3RvMiA9IE9iamVjdC5wcm90b3R5cGU7CiAgICB2YXIgY29yZUpzRGF0YSA9IHJvb3Q2WyJfX2NvcmUtanNfc2hhcmVkX18iXTsKICAgIHZhciBtYXNrU3JjS2V5ID0gKGZ1bmN0aW9uKCkgewogICAgICB2YXIgdWlkID0gL1teLl0rJC8uZXhlYyhjb3JlSnNEYXRhICYmIGNvcmVKc0RhdGEua2V5cyAmJiBjb3JlSnNEYXRhLmtleXMuSUVfUFJPVE8gfHwgIiIpOwogICAgICByZXR1cm4gdWlkID8gIlN5bWJvbChzcmMpXzEuIiArIHVpZCA6ICIiOwogICAgfSkoKTsKICAgIHZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7CiAgICB2YXIgaGFzT3duUHJvcGVydHkzID0gb2JqZWN0UHJvdG8yLmhhc093blByb3BlcnR5OwogICAgdmFyIG9iamVjdFRvU3RyaW5nMiA9IG9iamVjdFByb3RvMi50b1N0cmluZzsKICAgIHZhciByZUlzTmF0aXZlID0gUmVnRXhwKAogICAgICAiXiIgKyBmdW5jVG9TdHJpbmcuY2FsbChoYXNPd25Qcm9wZXJ0eTMpLnJlcGxhY2UocmVSZWdFeHBDaGFyLCAiXFwkJiIpLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFwoKXwgZm9yIC4rPyg/PVxcXF0pL2csICIkMS4qPyIpICsgIiQiCiAgICApOwogICAgdmFyIEJ1ZmZlcjIgPSBtb2R1bGVFeHBvcnRzID8gcm9vdDYuQnVmZmVyIDogdm9pZCAwLCBTeW1ib2wyID0gcm9vdDYuU3ltYm9sLCBVaW50OEFycmF5MiA9IHJvb3Q2LlVpbnQ4QXJyYXksIGdldFByb3RvdHlwZSA9IG92ZXJBcmcoT2JqZWN0LmdldFByb3RvdHlwZU9mLCBPYmplY3QpLCBvYmplY3RDcmVhdGUgPSBPYmplY3QuY3JlYXRlLCBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IG9iamVjdFByb3RvMi5wcm9wZXJ0eUlzRW51bWVyYWJsZSwgc3BsaWNlMiA9IGFycmF5UHJvdG8uc3BsaWNlOwogICAgdmFyIG5hdGl2ZUdldFN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLCBuYXRpdmVJc0J1ZmZlciA9IEJ1ZmZlcjIgPyBCdWZmZXIyLmlzQnVmZmVyIDogdm9pZCAwLCBuYXRpdmVLZXlzID0gb3ZlckFyZyhPYmplY3Qua2V5cywgT2JqZWN0KTsKICAgIHZhciBEYXRhVmlldzIgPSBnZXROYXRpdmUocm9vdDYsICJEYXRhVmlldyIpLCBNYXAyID0gZ2V0TmF0aXZlKHJvb3Q2LCAiTWFwIiksIFByb21pc2UyID0gZ2V0TmF0aXZlKHJvb3Q2LCAiUHJvbWlzZSIpLCBTZXQyID0gZ2V0TmF0aXZlKHJvb3Q2LCAiU2V0IiksIFdlYWtNYXAyID0gZ2V0TmF0aXZlKHJvb3Q2LCAiV2Vha01hcCIpLCBuYXRpdmVDcmVhdGUgPSBnZXROYXRpdmUoT2JqZWN0LCAiY3JlYXRlIik7CiAgICB2YXIgZGF0YVZpZXdDdG9yU3RyaW5nID0gdG9Tb3VyY2UoRGF0YVZpZXcyKSwgbWFwQ3RvclN0cmluZyA9IHRvU291cmNlKE1hcDIpLCBwcm9taXNlQ3RvclN0cmluZyA9IHRvU291cmNlKFByb21pc2UyKSwgc2V0Q3RvclN0cmluZyA9IHRvU291cmNlKFNldDIpLCB3ZWFrTWFwQ3RvclN0cmluZyA9IHRvU291cmNlKFdlYWtNYXAyKTsKICAgIHZhciBzeW1ib2xQcm90byA9IFN5bWJvbDIgPyBTeW1ib2wyLnByb3RvdHlwZSA6IHZvaWQgMCwgc3ltYm9sVmFsdWVPZiA9IHN5bWJvbFByb3RvID8gc3ltYm9sUHJvdG8udmFsdWVPZiA6IHZvaWQgMDsKICAgIGZ1bmN0aW9uIEhhc2goZW50cmllcykgewogICAgICB2YXIgaW5kZXgyID0gLTEsIGxlbmd0aCA9IGVudHJpZXMgPyBlbnRyaWVzLmxlbmd0aCA6IDA7CiAgICAgIHRoaXMuY2xlYXIoKTsKICAgICAgd2hpbGUgKCsraW5kZXgyIDwgbGVuZ3RoKSB7CiAgICAgICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleDJdOwogICAgICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7CiAgICAgIH0KICAgIH0KICAgIF9fbmFtZShIYXNoLCAiSGFzaCIpOwogICAgZnVuY3Rpb24gaGFzaENsZWFyKCkgewogICAgICB0aGlzLl9fZGF0YV9fID0gbmF0aXZlQ3JlYXRlID8gbmF0aXZlQ3JlYXRlKG51bGwpIDoge307CiAgICB9CiAgICBfX25hbWUoaGFzaENsZWFyLCAiaGFzaENsZWFyIik7CiAgICBmdW5jdGlvbiBoYXNoRGVsZXRlKGtleTIpIHsKICAgICAgcmV0dXJuIHRoaXMuaGFzKGtleTIpICYmIGRlbGV0ZSB0aGlzLl9fZGF0YV9fW2tleTJdOwogICAgfQogICAgX19uYW1lKGhhc2hEZWxldGUsICJoYXNoRGVsZXRlIik7CiAgICBmdW5jdGlvbiBoYXNoR2V0KGtleTIpIHsKICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fOwogICAgICBpZiAobmF0aXZlQ3JlYXRlKSB7CiAgICAgICAgdmFyIHJlc3VsdCA9IGRhdGFba2V5Ml07CiAgICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gSEFTSF9VTkRFRklORUQgPyB2b2lkIDAgOiByZXN1bHQ7CiAgICAgIH0KICAgICAgcmV0dXJuIGhhc093blByb3BlcnR5My5jYWxsKGRhdGEsIGtleTIpID8gZGF0YVtrZXkyXSA6IHZvaWQgMDsKICAgIH0KICAgIF9fbmFtZShoYXNoR2V0LCAiaGFzaEdldCIpOwogICAgZnVuY3Rpb24gaGFzaEhhcyhrZXkyKSB7CiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXzsKICAgICAgcmV0dXJuIG5hdGl2ZUNyZWF0ZSA/IGRhdGFba2V5Ml0gIT09IHZvaWQgMCA6IGhhc093blByb3BlcnR5My5jYWxsKGRhdGEsIGtleTIpOwogICAgfQogICAgX19uYW1lKGhhc2hIYXMsICJoYXNoSGFzIik7CiAgICBmdW5jdGlvbiBoYXNoU2V0KGtleTIsIHZhbHVlMikgewogICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187CiAgICAgIGRhdGFba2V5Ml0gPSBuYXRpdmVDcmVhdGUgJiYgdmFsdWUyID09PSB2b2lkIDAgPyBIQVNIX1VOREVGSU5FRCA6IHZhbHVlMjsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBfX25hbWUoaGFzaFNldCwgImhhc2hTZXQiKTsKICAgIEhhc2gucHJvdG90eXBlLmNsZWFyID0gaGFzaENsZWFyOwogICAgSGFzaC5wcm90b3R5cGVbImRlbGV0ZSJdID0gaGFzaERlbGV0ZTsKICAgIEhhc2gucHJvdG90eXBlLmdldCA9IGhhc2hHZXQ7CiAgICBIYXNoLnByb3RvdHlwZS5oYXMgPSBoYXNoSGFzOwogICAgSGFzaC5wcm90b3R5cGUuc2V0ID0gaGFzaFNldDsKICAgIGZ1bmN0aW9uIExpc3RDYWNoZShlbnRyaWVzKSB7CiAgICAgIHZhciBpbmRleDIgPSAtMSwgbGVuZ3RoID0gZW50cmllcyA/IGVudHJpZXMubGVuZ3RoIDogMDsKICAgICAgdGhpcy5jbGVhcigpOwogICAgICB3aGlsZSAoKytpbmRleDIgPCBsZW5ndGgpIHsKICAgICAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4Ml07CiAgICAgICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTsKICAgICAgfQogICAgfQogICAgX19uYW1lKExpc3RDYWNoZSwgIkxpc3RDYWNoZSIpOwogICAgZnVuY3Rpb24gbGlzdENhY2hlQ2xlYXIoKSB7CiAgICAgIHRoaXMuX19kYXRhX18gPSBbXTsKICAgIH0KICAgIF9fbmFtZShsaXN0Q2FjaGVDbGVhciwgImxpc3RDYWNoZUNsZWFyIik7CiAgICBmdW5jdGlvbiBsaXN0Q2FjaGVEZWxldGUoa2V5MikgewogICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sIGluZGV4MiA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkyKTsKICAgICAgaWYgKGluZGV4MiA8IDApIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgdmFyIGxhc3RJbmRleCA9IGRhdGEubGVuZ3RoIC0gMTsKICAgICAgaWYgKGluZGV4MiA9PSBsYXN0SW5kZXgpIHsKICAgICAgICBkYXRhLnBvcCgpOwogICAgICB9IGVsc2UgewogICAgICAgIHNwbGljZTIuY2FsbChkYXRhLCBpbmRleDIsIDEpOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgX19uYW1lKGxpc3RDYWNoZURlbGV0ZSwgImxpc3RDYWNoZURlbGV0ZSIpOwogICAgZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleTIpIHsKICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLCBpbmRleDIgPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5Mik7CiAgICAgIHJldHVybiBpbmRleDIgPCAwID8gdm9pZCAwIDogZGF0YVtpbmRleDJdWzFdOwogICAgfQogICAgX19uYW1lKGxpc3RDYWNoZUdldCwgImxpc3RDYWNoZUdldCIpOwogICAgZnVuY3Rpb24gbGlzdENhY2hlSGFzKGtleTIpIHsKICAgICAgcmV0dXJuIGFzc29jSW5kZXhPZih0aGlzLl9fZGF0YV9fLCBrZXkyKSA+IC0xOwogICAgfQogICAgX19uYW1lKGxpc3RDYWNoZUhhcywgImxpc3RDYWNoZUhhcyIpOwogICAgZnVuY3Rpb24gbGlzdENhY2hlU2V0KGtleTIsIHZhbHVlMikgewogICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sIGluZGV4MiA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkyKTsKICAgICAgaWYgKGluZGV4MiA8IDApIHsKICAgICAgICBkYXRhLnB1c2goW2tleTIsIHZhbHVlMl0pOwogICAgICB9IGVsc2UgewogICAgICAgIGRhdGFbaW5kZXgyXVsxXSA9IHZhbHVlMjsKICAgICAgfQogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIF9fbmFtZShsaXN0Q2FjaGVTZXQsICJsaXN0Q2FjaGVTZXQiKTsKICAgIExpc3RDYWNoZS5wcm90b3R5cGUuY2xlYXIgPSBsaXN0Q2FjaGVDbGVhcjsKICAgIExpc3RDYWNoZS5wcm90b3R5cGVbImRlbGV0ZSJdID0gbGlzdENhY2hlRGVsZXRlOwogICAgTGlzdENhY2hlLnByb3RvdHlwZS5nZXQgPSBsaXN0Q2FjaGVHZXQ7CiAgICBMaXN0Q2FjaGUucHJvdG90eXBlLmhhcyA9IGxpc3RDYWNoZUhhczsKICAgIExpc3RDYWNoZS5wcm90b3R5cGUuc2V0ID0gbGlzdENhY2hlU2V0OwogICAgZnVuY3Rpb24gTWFwQ2FjaGUoZW50cmllcykgewogICAgICB2YXIgaW5kZXgyID0gLTEsIGxlbmd0aCA9IGVudHJpZXMgPyBlbnRyaWVzLmxlbmd0aCA6IDA7CiAgICAgIHRoaXMuY2xlYXIoKTsKICAgICAgd2hpbGUgKCsraW5kZXgyIDwgbGVuZ3RoKSB7CiAgICAgICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleDJdOwogICAgICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7CiAgICAgIH0KICAgIH0KICAgIF9fbmFtZShNYXBDYWNoZSwgIk1hcENhY2hlIik7CiAgICBmdW5jdGlvbiBtYXBDYWNoZUNsZWFyKCkgewogICAgICB0aGlzLl9fZGF0YV9fID0gewogICAgICAgICJoYXNoIjogbmV3IEhhc2goKSwKICAgICAgICAibWFwIjogbmV3IChNYXAyIHx8IExpc3RDYWNoZSkoKSwKICAgICAgICAic3RyaW5nIjogbmV3IEhhc2goKQogICAgICB9OwogICAgfQogICAgX19uYW1lKG1hcENhY2hlQ2xlYXIsICJtYXBDYWNoZUNsZWFyIik7CiAgICBmdW5jdGlvbiBtYXBDYWNoZURlbGV0ZShrZXkyKSB7CiAgICAgIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleTIpWyJkZWxldGUiXShrZXkyKTsKICAgIH0KICAgIF9fbmFtZShtYXBDYWNoZURlbGV0ZSwgIm1hcENhY2hlRGVsZXRlIik7CiAgICBmdW5jdGlvbiBtYXBDYWNoZUdldChrZXkyKSB7CiAgICAgIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleTIpLmdldChrZXkyKTsKICAgIH0KICAgIF9fbmFtZShtYXBDYWNoZUdldCwgIm1hcENhY2hlR2V0Iik7CiAgICBmdW5jdGlvbiBtYXBDYWNoZUhhcyhrZXkyKSB7CiAgICAgIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleTIpLmhhcyhrZXkyKTsKICAgIH0KICAgIF9fbmFtZShtYXBDYWNoZUhhcywgIm1hcENhY2hlSGFzIik7CiAgICBmdW5jdGlvbiBtYXBDYWNoZVNldChrZXkyLCB2YWx1ZTIpIHsKICAgICAgZ2V0TWFwRGF0YSh0aGlzLCBrZXkyKS5zZXQoa2V5MiwgdmFsdWUyKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBfX25hbWUobWFwQ2FjaGVTZXQsICJtYXBDYWNoZVNldCIpOwogICAgTWFwQ2FjaGUucHJvdG90eXBlLmNsZWFyID0gbWFwQ2FjaGVDbGVhcjsKICAgIE1hcENhY2hlLnByb3RvdHlwZVsiZGVsZXRlIl0gPSBtYXBDYWNoZURlbGV0ZTsKICAgIE1hcENhY2hlLnByb3RvdHlwZS5nZXQgPSBtYXBDYWNoZUdldDsKICAgIE1hcENhY2hlLnByb3RvdHlwZS5oYXMgPSBtYXBDYWNoZUhhczsKICAgIE1hcENhY2hlLnByb3RvdHlwZS5zZXQgPSBtYXBDYWNoZVNldDsKICAgIGZ1bmN0aW9uIFN0YWNrKGVudHJpZXMpIHsKICAgICAgdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGUoZW50cmllcyk7CiAgICB9CiAgICBfX25hbWUoU3RhY2ssICJTdGFjayIpOwogICAgZnVuY3Rpb24gc3RhY2tDbGVhcigpIHsKICAgICAgdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGUoKTsKICAgIH0KICAgIF9fbmFtZShzdGFja0NsZWFyLCAic3RhY2tDbGVhciIpOwogICAgZnVuY3Rpb24gc3RhY2tEZWxldGUoa2V5MikgewogICAgICByZXR1cm4gdGhpcy5fX2RhdGFfX1siZGVsZXRlIl0oa2V5Mik7CiAgICB9CiAgICBfX25hbWUoc3RhY2tEZWxldGUsICJzdGFja0RlbGV0ZSIpOwogICAgZnVuY3Rpb24gc3RhY2tHZXQoa2V5MikgewogICAgICByZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQoa2V5Mik7CiAgICB9CiAgICBfX25hbWUoc3RhY2tHZXQsICJzdGFja0dldCIpOwogICAgZnVuY3Rpb24gc3RhY2tIYXMoa2V5MikgewogICAgICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXMoa2V5Mik7CiAgICB9CiAgICBfX25hbWUoc3RhY2tIYXMsICJzdGFja0hhcyIpOwogICAgZnVuY3Rpb24gc3RhY2tTZXQoa2V5MiwgdmFsdWUyKSB7CiAgICAgIHZhciBjYWNoZSA9IHRoaXMuX19kYXRhX187CiAgICAgIGlmIChjYWNoZSBpbnN0YW5jZW9mIExpc3RDYWNoZSkgewogICAgICAgIHZhciBwYWlyczIgPSBjYWNoZS5fX2RhdGFfXzsKICAgICAgICBpZiAoIU1hcDIgfHwgcGFpcnMyLmxlbmd0aCA8IExBUkdFX0FSUkFZX1NJWkUgLSAxKSB7CiAgICAgICAgICBwYWlyczIucHVzaChba2V5MiwgdmFsdWUyXSk7CiAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9CiAgICAgICAgY2FjaGUgPSB0aGlzLl9fZGF0YV9fID0gbmV3IE1hcENhY2hlKHBhaXJzMik7CiAgICAgIH0KICAgICAgY2FjaGUuc2V0KGtleTIsIHZhbHVlMik7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgX19uYW1lKHN0YWNrU2V0LCAic3RhY2tTZXQiKTsKICAgIFN0YWNrLnByb3RvdHlwZS5jbGVhciA9IHN0YWNrQ2xlYXI7CiAgICBTdGFjay5wcm90b3R5cGVbImRlbGV0ZSJdID0gc3RhY2tEZWxldGU7CiAgICBTdGFjay5wcm90b3R5cGUuZ2V0ID0gc3RhY2tHZXQ7CiAgICBTdGFjay5wcm90b3R5cGUuaGFzID0gc3RhY2tIYXM7CiAgICBTdGFjay5wcm90b3R5cGUuc2V0ID0gc3RhY2tTZXQ7CiAgICBmdW5jdGlvbiBhcnJheUxpa2VLZXlzKHZhbHVlMiwgaW5oZXJpdGVkKSB7CiAgICAgIHZhciByZXN1bHQgPSBpc0FycmF5NSh2YWx1ZTIpIHx8IGlzQXJndW1lbnRzKHZhbHVlMikgPyBiYXNlVGltZXModmFsdWUyLmxlbmd0aCwgU3RyaW5nKSA6IFtdOwogICAgICB2YXIgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aCwgc2tpcEluZGV4ZXMgPSAhIWxlbmd0aDsKICAgICAgZm9yICh2YXIga2V5MiBpbiB2YWx1ZTIpIHsKICAgICAgICBpZiAoKGluaGVyaXRlZCB8fCBoYXNPd25Qcm9wZXJ0eTMuY2FsbCh2YWx1ZTIsIGtleTIpKSAmJiAhKHNraXBJbmRleGVzICYmIChrZXkyID09ICJsZW5ndGgiIHx8IGlzSW5kZXgoa2V5MiwgbGVuZ3RoKSkpKSB7CiAgICAgICAgICByZXN1bHQucHVzaChrZXkyKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIF9fbmFtZShhcnJheUxpa2VLZXlzLCAiYXJyYXlMaWtlS2V5cyIpOwogICAgZnVuY3Rpb24gYXNzaWduVmFsdWUob2JqZWN0LCBrZXkyLCB2YWx1ZTIpIHsKICAgICAgdmFyIG9ialZhbHVlID0gb2JqZWN0W2tleTJdOwogICAgICBpZiAoIShoYXNPd25Qcm9wZXJ0eTMuY2FsbChvYmplY3QsIGtleTIpICYmIGVxKG9ialZhbHVlLCB2YWx1ZTIpKSB8fCB2YWx1ZTIgPT09IHZvaWQgMCAmJiAhKGtleTIgaW4gb2JqZWN0KSkgewogICAgICAgIG9iamVjdFtrZXkyXSA9IHZhbHVlMjsKICAgICAgfQogICAgfQogICAgX19uYW1lKGFzc2lnblZhbHVlLCAiYXNzaWduVmFsdWUiKTsKICAgIGZ1bmN0aW9uIGFzc29jSW5kZXhPZihhcnJheSwga2V5MikgewogICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOwogICAgICB3aGlsZSAobGVuZ3RoLS0pIHsKICAgICAgICBpZiAoZXEoYXJyYXlbbGVuZ3RoXVswXSwga2V5MikpIHsKICAgICAgICAgIHJldHVybiBsZW5ndGg7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIF9fbmFtZShhc3NvY0luZGV4T2YsICJhc3NvY0luZGV4T2YiKTsKICAgIGZ1bmN0aW9uIGJhc2VBc3NpZ24ob2JqZWN0LCBzb3VyY2UpIHsKICAgICAgcmV0dXJuIG9iamVjdCAmJiBjb3B5T2JqZWN0KHNvdXJjZSwga2V5czIoc291cmNlKSwgb2JqZWN0KTsKICAgIH0KICAgIF9fbmFtZShiYXNlQXNzaWduLCAiYmFzZUFzc2lnbiIpOwogICAgZnVuY3Rpb24gYmFzZUNsb25lKHZhbHVlMiwgaXNEZWVwLCBpc0Z1bGwsIGN1c3RvbWl6ZXIsIGtleTIsIG9iamVjdCwgc3RhY2spIHsKICAgICAgdmFyIHJlc3VsdDsKICAgICAgaWYgKGN1c3RvbWl6ZXIpIHsKICAgICAgICByZXN1bHQgPSBvYmplY3QgPyBjdXN0b21pemVyKHZhbHVlMiwga2V5Miwgb2JqZWN0LCBzdGFjaykgOiBjdXN0b21pemVyKHZhbHVlMik7CiAgICAgIH0KICAgICAgaWYgKHJlc3VsdCAhPT0gdm9pZCAwKSB7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgICBpZiAoIWlzT2JqZWN0Myh2YWx1ZTIpKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlMjsKICAgICAgfQogICAgICB2YXIgaXNBcnIgPSBpc0FycmF5NSh2YWx1ZTIpOwogICAgICBpZiAoaXNBcnIpIHsKICAgICAgICByZXN1bHQgPSBpbml0Q2xvbmVBcnJheSh2YWx1ZTIpOwogICAgICAgIGlmICghaXNEZWVwKSB7CiAgICAgICAgICByZXR1cm4gY29weUFycmF5KHZhbHVlMiwgcmVzdWx0KTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIHRhZyA9IGdldFRhZyh2YWx1ZTIpLCBpc0Z1bmMgPSB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnOwogICAgICAgIGlmIChpc0J1ZmZlcih2YWx1ZTIpKSB7CiAgICAgICAgICByZXR1cm4gY2xvbmVCdWZmZXIodmFsdWUyLCBpc0RlZXApOwogICAgICAgIH0KICAgICAgICBpZiAodGFnID09IG9iamVjdFRhZyB8fCB0YWcgPT0gYXJnc1RhZyB8fCBpc0Z1bmMgJiYgIW9iamVjdCkgewogICAgICAgICAgaWYgKGlzSG9zdE9iamVjdCh2YWx1ZTIpKSB7CiAgICAgICAgICAgIHJldHVybiBvYmplY3QgPyB2YWx1ZTIgOiB7fTsKICAgICAgICAgIH0KICAgICAgICAgIHJlc3VsdCA9IGluaXRDbG9uZU9iamVjdChpc0Z1bmMgPyB7fSA6IHZhbHVlMik7CiAgICAgICAgICBpZiAoIWlzRGVlcCkgewogICAgICAgICAgICByZXR1cm4gY29weVN5bWJvbHModmFsdWUyLCBiYXNlQXNzaWduKHJlc3VsdCwgdmFsdWUyKSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICghY2xvbmVhYmxlVGFnc1t0YWddKSB7CiAgICAgICAgICAgIHJldHVybiBvYmplY3QgPyB2YWx1ZTIgOiB7fTsKICAgICAgICAgIH0KICAgICAgICAgIHJlc3VsdCA9IGluaXRDbG9uZUJ5VGFnKHZhbHVlMiwgdGFnLCBiYXNlQ2xvbmUsIGlzRGVlcCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjaygpKTsKICAgICAgdmFyIHN0YWNrZWQgPSBzdGFjay5nZXQodmFsdWUyKTsKICAgICAgaWYgKHN0YWNrZWQpIHsKICAgICAgICByZXR1cm4gc3RhY2tlZDsKICAgICAgfQogICAgICBzdGFjay5zZXQodmFsdWUyLCByZXN1bHQpOwogICAgICBpZiAoIWlzQXJyKSB7CiAgICAgICAgdmFyIHByb3BzID0gaXNGdWxsID8gZ2V0QWxsS2V5cyh2YWx1ZTIpIDoga2V5czIodmFsdWUyKTsKICAgICAgfQogICAgICBhcnJheUVhY2gocHJvcHMgfHwgdmFsdWUyLCBmdW5jdGlvbihzdWJWYWx1ZSwga2V5MykgewogICAgICAgIGlmIChwcm9wcykgewogICAgICAgICAga2V5MyA9IHN1YlZhbHVlOwogICAgICAgICAgc3ViVmFsdWUgPSB2YWx1ZTJba2V5M107CiAgICAgICAgfQogICAgICAgIGFzc2lnblZhbHVlKHJlc3VsdCwga2V5MywgYmFzZUNsb25lKHN1YlZhbHVlLCBpc0RlZXAsIGlzRnVsbCwgY3VzdG9taXplciwga2V5MywgdmFsdWUyLCBzdGFjaykpOwogICAgICB9KTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIF9fbmFtZShiYXNlQ2xvbmUsICJiYXNlQ2xvbmUiKTsKICAgIGZ1bmN0aW9uIGJhc2VDcmVhdGUocHJvdG8pIHsKICAgICAgcmV0dXJuIGlzT2JqZWN0Myhwcm90bykgPyBvYmplY3RDcmVhdGUocHJvdG8pIDoge307CiAgICB9CiAgICBfX25hbWUoYmFzZUNyZWF0ZSwgImJhc2VDcmVhdGUiKTsKICAgIGZ1bmN0aW9uIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5c0Z1bmMsIHN5bWJvbHNGdW5jKSB7CiAgICAgIHZhciByZXN1bHQgPSBrZXlzRnVuYyhvYmplY3QpOwogICAgICByZXR1cm4gaXNBcnJheTUob2JqZWN0KSA/IHJlc3VsdCA6IGFycmF5UHVzaChyZXN1bHQsIHN5bWJvbHNGdW5jKG9iamVjdCkpOwogICAgfQogICAgX19uYW1lKGJhc2VHZXRBbGxLZXlzLCAiYmFzZUdldEFsbEtleXMiKTsKICAgIGZ1bmN0aW9uIGJhc2VHZXRUYWcodmFsdWUyKSB7CiAgICAgIHJldHVybiBvYmplY3RUb1N0cmluZzIuY2FsbCh2YWx1ZTIpOwogICAgfQogICAgX19uYW1lKGJhc2VHZXRUYWcsICJiYXNlR2V0VGFnIik7CiAgICBmdW5jdGlvbiBiYXNlSXNOYXRpdmUodmFsdWUyKSB7CiAgICAgIGlmICghaXNPYmplY3QzKHZhbHVlMikgfHwgaXNNYXNrZWQodmFsdWUyKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICB2YXIgcGF0dGVybiA9IGlzRnVuY3Rpb24yKHZhbHVlMikgfHwgaXNIb3N0T2JqZWN0KHZhbHVlMikgPyByZUlzTmF0aXZlIDogcmVJc0hvc3RDdG9yOwogICAgICByZXR1cm4gcGF0dGVybi50ZXN0KHRvU291cmNlKHZhbHVlMikpOwogICAgfQogICAgX19uYW1lKGJhc2VJc05hdGl2ZSwgImJhc2VJc05hdGl2ZSIpOwogICAgZnVuY3Rpb24gYmFzZUtleXMob2JqZWN0KSB7CiAgICAgIGlmICghaXNQcm90b3R5cGUob2JqZWN0KSkgewogICAgICAgIHJldHVybiBuYXRpdmVLZXlzKG9iamVjdCk7CiAgICAgIH0KICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICBmb3IgKHZhciBrZXkyIGluIE9iamVjdChvYmplY3QpKSB7CiAgICAgICAgaWYgKGhhc093blByb3BlcnR5My5jYWxsKG9iamVjdCwga2V5MikgJiYga2V5MiAhPSAiY29uc3RydWN0b3IiKSB7CiAgICAgICAgICByZXN1bHQucHVzaChrZXkyKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIF9fbmFtZShiYXNlS2V5cywgImJhc2VLZXlzIik7CiAgICBmdW5jdGlvbiBjbG9uZUJ1ZmZlcihidWZmZXIyLCBpc0RlZXApIHsKICAgICAgaWYgKGlzRGVlcCkgewogICAgICAgIHJldHVybiBidWZmZXIyLnNsaWNlKCk7CiAgICAgIH0KICAgICAgdmFyIHJlc3VsdCA9IG5ldyBidWZmZXIyLmNvbnN0cnVjdG9yKGJ1ZmZlcjIubGVuZ3RoKTsKICAgICAgYnVmZmVyMi5jb3B5KHJlc3VsdCk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBfX25hbWUoY2xvbmVCdWZmZXIsICJjbG9uZUJ1ZmZlciIpOwogICAgZnVuY3Rpb24gY2xvbmVBcnJheUJ1ZmZlcihhcnJheUJ1ZmZlcikgewogICAgICB2YXIgcmVzdWx0ID0gbmV3IGFycmF5QnVmZmVyLmNvbnN0cnVjdG9yKGFycmF5QnVmZmVyLmJ5dGVMZW5ndGgpOwogICAgICBuZXcgVWludDhBcnJheTIocmVzdWx0KS5zZXQobmV3IFVpbnQ4QXJyYXkyKGFycmF5QnVmZmVyKSk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBfX25hbWUoY2xvbmVBcnJheUJ1ZmZlciwgImNsb25lQXJyYXlCdWZmZXIiKTsKICAgIGZ1bmN0aW9uIGNsb25lRGF0YVZpZXcoZGF0YVZpZXcsIGlzRGVlcCkgewogICAgICB2YXIgYnVmZmVyMiA9IGlzRGVlcCA/IGNsb25lQXJyYXlCdWZmZXIoZGF0YVZpZXcuYnVmZmVyKSA6IGRhdGFWaWV3LmJ1ZmZlcjsKICAgICAgcmV0dXJuIG5ldyBkYXRhVmlldy5jb25zdHJ1Y3RvcihidWZmZXIyLCBkYXRhVmlldy5ieXRlT2Zmc2V0LCBkYXRhVmlldy5ieXRlTGVuZ3RoKTsKICAgIH0KICAgIF9fbmFtZShjbG9uZURhdGFWaWV3LCAiY2xvbmVEYXRhVmlldyIpOwogICAgZnVuY3Rpb24gY2xvbmVNYXAobWFwNywgaXNEZWVwLCBjbG9uZUZ1bmMpIHsKICAgICAgdmFyIGFycmF5ID0gaXNEZWVwID8gY2xvbmVGdW5jKG1hcFRvQXJyYXkobWFwNyksIHRydWUpIDogbWFwVG9BcnJheShtYXA3KTsKICAgICAgcmV0dXJuIGFycmF5UmVkdWNlKGFycmF5LCBhZGRNYXBFbnRyeSwgbmV3IG1hcDcuY29uc3RydWN0b3IoKSk7CiAgICB9CiAgICBfX25hbWUoY2xvbmVNYXAsICJjbG9uZU1hcCIpOwogICAgZnVuY3Rpb24gY2xvbmVSZWdFeHAocmVnZXhwKSB7CiAgICAgIHZhciByZXN1bHQgPSBuZXcgcmVnZXhwLmNvbnN0cnVjdG9yKHJlZ2V4cC5zb3VyY2UsIHJlRmxhZ3MuZXhlYyhyZWdleHApKTsKICAgICAgcmVzdWx0Lmxhc3RJbmRleCA9IHJlZ2V4cC5sYXN0SW5kZXg7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBfX25hbWUoY2xvbmVSZWdFeHAsICJjbG9uZVJlZ0V4cCIpOwogICAgZnVuY3Rpb24gY2xvbmVTZXQoc2V0MiwgaXNEZWVwLCBjbG9uZUZ1bmMpIHsKICAgICAgdmFyIGFycmF5ID0gaXNEZWVwID8gY2xvbmVGdW5jKHNldFRvQXJyYXkoc2V0MiksIHRydWUpIDogc2V0VG9BcnJheShzZXQyKTsKICAgICAgcmV0dXJuIGFycmF5UmVkdWNlKGFycmF5LCBhZGRTZXRFbnRyeSwgbmV3IHNldDIuY29uc3RydWN0b3IoKSk7CiAgICB9CiAgICBfX25hbWUoY2xvbmVTZXQsICJjbG9uZVNldCIpOwogICAgZnVuY3Rpb24gY2xvbmVTeW1ib2woc3ltYm9sKSB7CiAgICAgIHJldHVybiBzeW1ib2xWYWx1ZU9mID8gT2JqZWN0KHN5bWJvbFZhbHVlT2YuY2FsbChzeW1ib2wpKSA6IHt9OwogICAgfQogICAgX19uYW1lKGNsb25lU3ltYm9sLCAiY2xvbmVTeW1ib2wiKTsKICAgIGZ1bmN0aW9uIGNsb25lVHlwZWRBcnJheSh0eXBlZEFycmF5LCBpc0RlZXApIHsKICAgICAgdmFyIGJ1ZmZlcjIgPSBpc0RlZXAgPyBjbG9uZUFycmF5QnVmZmVyKHR5cGVkQXJyYXkuYnVmZmVyKSA6IHR5cGVkQXJyYXkuYnVmZmVyOwogICAgICByZXR1cm4gbmV3IHR5cGVkQXJyYXkuY29uc3RydWN0b3IoYnVmZmVyMiwgdHlwZWRBcnJheS5ieXRlT2Zmc2V0LCB0eXBlZEFycmF5Lmxlbmd0aCk7CiAgICB9CiAgICBfX25hbWUoY2xvbmVUeXBlZEFycmF5LCAiY2xvbmVUeXBlZEFycmF5Iik7CiAgICBmdW5jdGlvbiBjb3B5QXJyYXkoc291cmNlLCBhcnJheSkgewogICAgICB2YXIgaW5kZXgyID0gLTEsIGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7CiAgICAgIGFycmF5IHx8IChhcnJheSA9IEFycmF5KGxlbmd0aCkpOwogICAgICB3aGlsZSAoKytpbmRleDIgPCBsZW5ndGgpIHsKICAgICAgICBhcnJheVtpbmRleDJdID0gc291cmNlW2luZGV4Ml07CiAgICAgIH0KICAgICAgcmV0dXJuIGFycmF5OwogICAgfQogICAgX19uYW1lKGNvcHlBcnJheSwgImNvcHlBcnJheSIpOwogICAgZnVuY3Rpb24gY29weU9iamVjdChzb3VyY2UsIHByb3BzLCBvYmplY3QsIGN1c3RvbWl6ZXIpIHsKICAgICAgb2JqZWN0IHx8IChvYmplY3QgPSB7fSk7CiAgICAgIHZhciBpbmRleDIgPSAtMSwgbGVuZ3RoID0gcHJvcHMubGVuZ3RoOwogICAgICB3aGlsZSAoKytpbmRleDIgPCBsZW5ndGgpIHsKICAgICAgICB2YXIga2V5MiA9IHByb3BzW2luZGV4Ml07CiAgICAgICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplciA/IGN1c3RvbWl6ZXIob2JqZWN0W2tleTJdLCBzb3VyY2Vba2V5Ml0sIGtleTIsIG9iamVjdCwgc291cmNlKSA6IHZvaWQgMDsKICAgICAgICBhc3NpZ25WYWx1ZShvYmplY3QsIGtleTIsIG5ld1ZhbHVlID09PSB2b2lkIDAgPyBzb3VyY2Vba2V5Ml0gOiBuZXdWYWx1ZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIG9iamVjdDsKICAgIH0KICAgIF9fbmFtZShjb3B5T2JqZWN0LCAiY29weU9iamVjdCIpOwogICAgZnVuY3Rpb24gY29weVN5bWJvbHMoc291cmNlLCBvYmplY3QpIHsKICAgICAgcmV0dXJuIGNvcHlPYmplY3Qoc291cmNlLCBnZXRTeW1ib2xzKHNvdXJjZSksIG9iamVjdCk7CiAgICB9CiAgICBfX25hbWUoY29weVN5bWJvbHMsICJjb3B5U3ltYm9scyIpOwogICAgZnVuY3Rpb24gZ2V0QWxsS2V5cyhvYmplY3QpIHsKICAgICAgcmV0dXJuIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5czIsIGdldFN5bWJvbHMpOwogICAgfQogICAgX19uYW1lKGdldEFsbEtleXMsICJnZXRBbGxLZXlzIik7CiAgICBmdW5jdGlvbiBnZXRNYXBEYXRhKG1hcDcsIGtleTIpIHsKICAgICAgdmFyIGRhdGEgPSBtYXA3Ll9fZGF0YV9fOwogICAgICByZXR1cm4gaXNLZXlhYmxlKGtleTIpID8gZGF0YVt0eXBlb2Yga2V5MiA9PSAic3RyaW5nIiA/ICJzdHJpbmciIDogImhhc2giXSA6IGRhdGEubWFwOwogICAgfQogICAgX19uYW1lKGdldE1hcERhdGEsICJnZXRNYXBEYXRhIik7CiAgICBmdW5jdGlvbiBnZXROYXRpdmUob2JqZWN0LCBrZXkyKSB7CiAgICAgIHZhciB2YWx1ZTIgPSBnZXRWYWx1ZShvYmplY3QsIGtleTIpOwogICAgICByZXR1cm4gYmFzZUlzTmF0aXZlKHZhbHVlMikgPyB2YWx1ZTIgOiB2b2lkIDA7CiAgICB9CiAgICBfX25hbWUoZ2V0TmF0aXZlLCAiZ2V0TmF0aXZlIik7CiAgICB2YXIgZ2V0U3ltYm9scyA9IG5hdGl2ZUdldFN5bWJvbHMgPyBvdmVyQXJnKG5hdGl2ZUdldFN5bWJvbHMsIE9iamVjdCkgOiBzdHViQXJyYXk7CiAgICB2YXIgZ2V0VGFnID0gYmFzZUdldFRhZzsKICAgIGlmIChEYXRhVmlldzIgJiYgZ2V0VGFnKG5ldyBEYXRhVmlldzIobmV3IEFycmF5QnVmZmVyKDEpKSkgIT0gZGF0YVZpZXdUYWcgfHwgTWFwMiAmJiBnZXRUYWcobmV3IE1hcDIoKSkgIT0gbWFwVGFnIHx8IFByb21pc2UyICYmIGdldFRhZyhQcm9taXNlMi5yZXNvbHZlKCkpICE9IHByb21pc2VUYWcgfHwgU2V0MiAmJiBnZXRUYWcobmV3IFNldDIoKSkgIT0gc2V0VGFnIHx8IFdlYWtNYXAyICYmIGdldFRhZyhuZXcgV2Vha01hcDIoKSkgIT0gd2Vha01hcFRhZykgewogICAgICBnZXRUYWcgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKHZhbHVlMikgewogICAgICAgIHZhciByZXN1bHQgPSBvYmplY3RUb1N0cmluZzIuY2FsbCh2YWx1ZTIpLCBDdG9yID0gcmVzdWx0ID09IG9iamVjdFRhZyA/IHZhbHVlMi5jb25zdHJ1Y3RvciA6IHZvaWQgMCwgY3RvclN0cmluZyA9IEN0b3IgPyB0b1NvdXJjZShDdG9yKSA6IHZvaWQgMDsKICAgICAgICBpZiAoY3RvclN0cmluZykgewogICAgICAgICAgc3dpdGNoIChjdG9yU3RyaW5nKSB7CiAgICAgICAgICAgIGNhc2UgZGF0YVZpZXdDdG9yU3RyaW5nOgogICAgICAgICAgICAgIHJldHVybiBkYXRhVmlld1RhZzsKICAgICAgICAgICAgY2FzZSBtYXBDdG9yU3RyaW5nOgogICAgICAgICAgICAgIHJldHVybiBtYXBUYWc7CiAgICAgICAgICAgIGNhc2UgcHJvbWlzZUN0b3JTdHJpbmc6CiAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2VUYWc7CiAgICAgICAgICAgIGNhc2Ugc2V0Q3RvclN0cmluZzoKICAgICAgICAgICAgICByZXR1cm4gc2V0VGFnOwogICAgICAgICAgICBjYXNlIHdlYWtNYXBDdG9yU3RyaW5nOgogICAgICAgICAgICAgIHJldHVybiB3ZWFrTWFwVGFnOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9LCAiZ2V0VGFnIik7CiAgICB9CiAgICBmdW5jdGlvbiBpbml0Q2xvbmVBcnJheShhcnJheSkgewogICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLCByZXN1bHQgPSBhcnJheS5jb25zdHJ1Y3RvcihsZW5ndGgpOwogICAgICBpZiAobGVuZ3RoICYmIHR5cGVvZiBhcnJheVswXSA9PSAic3RyaW5nIiAmJiBoYXNPd25Qcm9wZXJ0eTMuY2FsbChhcnJheSwgImluZGV4IikpIHsKICAgICAgICByZXN1bHQuaW5kZXggPSBhcnJheS5pbmRleDsKICAgICAgICByZXN1bHQuaW5wdXQgPSBhcnJheS5pbnB1dDsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgX19uYW1lKGluaXRDbG9uZUFycmF5LCAiaW5pdENsb25lQXJyYXkiKTsKICAgIGZ1bmN0aW9uIGluaXRDbG9uZU9iamVjdChvYmplY3QpIHsKICAgICAgcmV0dXJuIHR5cGVvZiBvYmplY3QuY29uc3RydWN0b3IgPT0gImZ1bmN0aW9uIiAmJiAhaXNQcm90b3R5cGUob2JqZWN0KSA/IGJhc2VDcmVhdGUoZ2V0UHJvdG90eXBlKG9iamVjdCkpIDoge307CiAgICB9CiAgICBfX25hbWUoaW5pdENsb25lT2JqZWN0LCAiaW5pdENsb25lT2JqZWN0Iik7CiAgICBmdW5jdGlvbiBpbml0Q2xvbmVCeVRhZyhvYmplY3QsIHRhZywgY2xvbmVGdW5jLCBpc0RlZXApIHsKICAgICAgdmFyIEN0b3IgPSBvYmplY3QuY29uc3RydWN0b3I7CiAgICAgIHN3aXRjaCAodGFnKSB7CiAgICAgICAgY2FzZSBhcnJheUJ1ZmZlclRhZzoKICAgICAgICAgIHJldHVybiBjbG9uZUFycmF5QnVmZmVyKG9iamVjdCk7CiAgICAgICAgY2FzZSBib29sVGFnOgogICAgICAgIGNhc2UgZGF0ZVRhZzoKICAgICAgICAgIHJldHVybiBuZXcgQ3Rvcigrb2JqZWN0KTsKICAgICAgICBjYXNlIGRhdGFWaWV3VGFnOgogICAgICAgICAgcmV0dXJuIGNsb25lRGF0YVZpZXcob2JqZWN0LCBpc0RlZXApOwogICAgICAgIGNhc2UgZmxvYXQzMlRhZzoKICAgICAgICBjYXNlIGZsb2F0NjRUYWc6CiAgICAgICAgY2FzZSBpbnQ4VGFnOgogICAgICAgIGNhc2UgaW50MTZUYWc6CiAgICAgICAgY2FzZSBpbnQzMlRhZzoKICAgICAgICBjYXNlIHVpbnQ4VGFnOgogICAgICAgIGNhc2UgdWludDhDbGFtcGVkVGFnOgogICAgICAgIGNhc2UgdWludDE2VGFnOgogICAgICAgIGNhc2UgdWludDMyVGFnOgogICAgICAgICAgcmV0dXJuIGNsb25lVHlwZWRBcnJheShvYmplY3QsIGlzRGVlcCk7CiAgICAgICAgY2FzZSBtYXBUYWc6CiAgICAgICAgICByZXR1cm4gY2xvbmVNYXAob2JqZWN0LCBpc0RlZXAsIGNsb25lRnVuYyk7CiAgICAgICAgY2FzZSBudW1iZXJUYWc6CiAgICAgICAgY2FzZSBzdHJpbmdUYWc6CiAgICAgICAgICByZXR1cm4gbmV3IEN0b3Iob2JqZWN0KTsKICAgICAgICBjYXNlIHJlZ2V4cFRhZzoKICAgICAgICAgIHJldHVybiBjbG9uZVJlZ0V4cChvYmplY3QpOwogICAgICAgIGNhc2Ugc2V0VGFnOgogICAgICAgICAgcmV0dXJuIGNsb25lU2V0KG9iamVjdCwgaXNEZWVwLCBjbG9uZUZ1bmMpOwogICAgICAgIGNhc2Ugc3ltYm9sVGFnOgogICAgICAgICAgcmV0dXJuIGNsb25lU3ltYm9sKG9iamVjdCk7CiAgICAgIH0KICAgIH0KICAgIF9fbmFtZShpbml0Q2xvbmVCeVRhZywgImluaXRDbG9uZUJ5VGFnIik7CiAgICBmdW5jdGlvbiBpc0luZGV4KHZhbHVlMiwgbGVuZ3RoKSB7CiAgICAgIGxlbmd0aCA9IGxlbmd0aCA9PSBudWxsID8gTUFYX1NBRkVfSU5URUdFUiA6IGxlbmd0aDsKICAgICAgcmV0dXJuICEhbGVuZ3RoICYmICh0eXBlb2YgdmFsdWUyID09ICJudW1iZXIiIHx8IHJlSXNVaW50LnRlc3QodmFsdWUyKSkgJiYgKHZhbHVlMiA+IC0xICYmIHZhbHVlMiAlIDEgPT0gMCAmJiB2YWx1ZTIgPCBsZW5ndGgpOwogICAgfQogICAgX19uYW1lKGlzSW5kZXgsICJpc0luZGV4Iik7CiAgICBmdW5jdGlvbiBpc0tleWFibGUodmFsdWUyKSB7CiAgICAgIHZhciB0eXBlNSA9IHR5cGVvZiB2YWx1ZTI7CiAgICAgIHJldHVybiB0eXBlNSA9PSAic3RyaW5nIiB8fCB0eXBlNSA9PSAibnVtYmVyIiB8fCB0eXBlNSA9PSAic3ltYm9sIiB8fCB0eXBlNSA9PSAiYm9vbGVhbiIgPyB2YWx1ZTIgIT09ICJfX3Byb3RvX18iIDogdmFsdWUyID09PSBudWxsOwogICAgfQogICAgX19uYW1lKGlzS2V5YWJsZSwgImlzS2V5YWJsZSIpOwogICAgZnVuY3Rpb24gaXNNYXNrZWQoZnVuYykgewogICAgICByZXR1cm4gISFtYXNrU3JjS2V5ICYmIG1hc2tTcmNLZXkgaW4gZnVuYzsKICAgIH0KICAgIF9fbmFtZShpc01hc2tlZCwgImlzTWFza2VkIik7CiAgICBmdW5jdGlvbiBpc1Byb3RvdHlwZSh2YWx1ZTIpIHsKICAgICAgdmFyIEN0b3IgPSB2YWx1ZTIgJiYgdmFsdWUyLmNvbnN0cnVjdG9yLCBwcm90byA9IHR5cGVvZiBDdG9yID09ICJmdW5jdGlvbiIgJiYgQ3Rvci5wcm90b3R5cGUgfHwgb2JqZWN0UHJvdG8yOwogICAgICByZXR1cm4gdmFsdWUyID09PSBwcm90bzsKICAgIH0KICAgIF9fbmFtZShpc1Byb3RvdHlwZSwgImlzUHJvdG90eXBlIik7CiAgICBmdW5jdGlvbiB0b1NvdXJjZShmdW5jKSB7CiAgICAgIGlmIChmdW5jICE9IG51bGwpIHsKICAgICAgICB0cnkgewogICAgICAgICAgcmV0dXJuIGZ1bmNUb1N0cmluZy5jYWxsKGZ1bmMpOwogICAgICAgIH0gY2F0Y2ggKGUxMCkgewogICAgICAgIH0KICAgICAgICB0cnkgewogICAgICAgICAgcmV0dXJuIGZ1bmMgKyAiIjsKICAgICAgICB9IGNhdGNoIChlMTApIHsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuICIiOwogICAgfQogICAgX19uYW1lKHRvU291cmNlLCAidG9Tb3VyY2UiKTsKICAgIGZ1bmN0aW9uIGNsb25lRGVlcCh2YWx1ZTIpIHsKICAgICAgcmV0dXJuIGJhc2VDbG9uZSh2YWx1ZTIsIHRydWUsIHRydWUpOwogICAgfQogICAgX19uYW1lKGNsb25lRGVlcCwgImNsb25lRGVlcCIpOwogICAgZnVuY3Rpb24gZXEodmFsdWUyLCBvdGhlcikgewogICAgICByZXR1cm4gdmFsdWUyID09PSBvdGhlciB8fCB2YWx1ZTIgIT09IHZhbHVlMiAmJiBvdGhlciAhPT0gb3RoZXI7CiAgICB9CiAgICBfX25hbWUoZXEsICJlcSIpOwogICAgZnVuY3Rpb24gaXNBcmd1bWVudHModmFsdWUyKSB7CiAgICAgIHJldHVybiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZTIpICYmIGhhc093blByb3BlcnR5My5jYWxsKHZhbHVlMiwgImNhbGxlZSIpICYmICghcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh2YWx1ZTIsICJjYWxsZWUiKSB8fCBvYmplY3RUb1N0cmluZzIuY2FsbCh2YWx1ZTIpID09IGFyZ3NUYWcpOwogICAgfQogICAgX19uYW1lKGlzQXJndW1lbnRzLCAiaXNBcmd1bWVudHMiKTsKICAgIHZhciBpc0FycmF5NSA9IEFycmF5LmlzQXJyYXk7CiAgICBmdW5jdGlvbiBpc0FycmF5TGlrZTIodmFsdWUyKSB7CiAgICAgIHJldHVybiB2YWx1ZTIgIT0gbnVsbCAmJiBpc0xlbmd0aCh2YWx1ZTIubGVuZ3RoKSAmJiAhaXNGdW5jdGlvbjIodmFsdWUyKTsKICAgIH0KICAgIF9fbmFtZShpc0FycmF5TGlrZTIsICJpc0FycmF5TGlrZSIpOwogICAgZnVuY3Rpb24gaXNBcnJheUxpa2VPYmplY3QodmFsdWUyKSB7CiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUyKSAmJiBpc0FycmF5TGlrZTIodmFsdWUyKTsKICAgIH0KICAgIF9fbmFtZShpc0FycmF5TGlrZU9iamVjdCwgImlzQXJyYXlMaWtlT2JqZWN0Iik7CiAgICB2YXIgaXNCdWZmZXIgPSBuYXRpdmVJc0J1ZmZlciB8fCBzdHViRmFsc2U7CiAgICBmdW5jdGlvbiBpc0Z1bmN0aW9uMih2YWx1ZTIpIHsKICAgICAgdmFyIHRhZyA9IGlzT2JqZWN0Myh2YWx1ZTIpID8gb2JqZWN0VG9TdHJpbmcyLmNhbGwodmFsdWUyKSA6ICIiOwogICAgICByZXR1cm4gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZzsKICAgIH0KICAgIF9fbmFtZShpc0Z1bmN0aW9uMiwgImlzRnVuY3Rpb24iKTsKICAgIGZ1bmN0aW9uIGlzTGVuZ3RoKHZhbHVlMikgewogICAgICByZXR1cm4gdHlwZW9mIHZhbHVlMiA9PSAibnVtYmVyIiAmJiB2YWx1ZTIgPiAtMSAmJiB2YWx1ZTIgJSAxID09IDAgJiYgdmFsdWUyIDw9IE1BWF9TQUZFX0lOVEVHRVI7CiAgICB9CiAgICBfX25hbWUoaXNMZW5ndGgsICJpc0xlbmd0aCIpOwogICAgZnVuY3Rpb24gaXNPYmplY3QzKHZhbHVlMikgewogICAgICB2YXIgdHlwZTUgPSB0eXBlb2YgdmFsdWUyOwogICAgICByZXR1cm4gISF2YWx1ZTIgJiYgKHR5cGU1ID09ICJvYmplY3QiIHx8IHR5cGU1ID09ICJmdW5jdGlvbiIpOwogICAgfQogICAgX19uYW1lKGlzT2JqZWN0MywgImlzT2JqZWN0Iik7CiAgICBmdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUyKSB7CiAgICAgIHJldHVybiAhIXZhbHVlMiAmJiB0eXBlb2YgdmFsdWUyID09ICJvYmplY3QiOwogICAgfQogICAgX19uYW1lKGlzT2JqZWN0TGlrZSwgImlzT2JqZWN0TGlrZSIpOwogICAgZnVuY3Rpb24ga2V5czIob2JqZWN0KSB7CiAgICAgIHJldHVybiBpc0FycmF5TGlrZTIob2JqZWN0KSA/IGFycmF5TGlrZUtleXMob2JqZWN0KSA6IGJhc2VLZXlzKG9iamVjdCk7CiAgICB9CiAgICBfX25hbWUoa2V5czIsICJrZXlzIik7CiAgICBmdW5jdGlvbiBzdHViQXJyYXkoKSB7CiAgICAgIHJldHVybiBbXTsKICAgIH0KICAgIF9fbmFtZShzdHViQXJyYXksICJzdHViQXJyYXkiKTsKICAgIGZ1bmN0aW9uIHN0dWJGYWxzZSgpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgX19uYW1lKHN0dWJGYWxzZSwgInN0dWJGYWxzZSIpOwogICAgbW9kdWxlLmV4cG9ydHMgPSBjbG9uZURlZXA7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeUAyLjEuMC9ub2RlX21vZHVsZXMvZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnkvaW5kZXguanMKdmFyIHJlcXVpcmVfZmFzdF9qc29uX3N0YWJsZV9zdHJpbmdpZnkgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2Zhc3QtanNvbi1zdGFibGUtc3RyaW5naWZ5QDIuMS4wL25vZGVfbW9kdWxlcy9mYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeS9pbmRleC5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGRhdGEsIG9wdHMpIHsKICAgICAgaWYgKCFvcHRzKSBvcHRzID0ge307CiAgICAgIGlmICh0eXBlb2Ygb3B0cyA9PT0gImZ1bmN0aW9uIikgb3B0cyA9IHsgY21wOiBvcHRzIH07CiAgICAgIHZhciBjeWNsZXMgPSB0eXBlb2Ygb3B0cy5jeWNsZXMgPT09ICJib29sZWFuIiA/IG9wdHMuY3ljbGVzIDogZmFsc2U7CiAgICAgIHZhciBjbXAgPSBvcHRzLmNtcCAmJiAvKiBAX19QVVJFX18gKi8gKGZ1bmN0aW9uKGY2KSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUyKSB7CiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oYTQsIGI0KSB7CiAgICAgICAgICAgIHZhciBhb2JqID0geyBrZXk6IGE0LCB2YWx1ZTogbm9kZTJbYTRdIH07CiAgICAgICAgICAgIHZhciBib2JqID0geyBrZXk6IGI0LCB2YWx1ZTogbm9kZTJbYjRdIH07CiAgICAgICAgICAgIHJldHVybiBmNihhb2JqLCBib2JqKTsKICAgICAgICAgIH07CiAgICAgICAgfTsKICAgICAgfSkob3B0cy5jbXApOwogICAgICB2YXIgc2VlbiA9IFtdOwogICAgICByZXR1cm4gKC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGZ1bmN0aW9uIHN0cmluZ2lmeTcobm9kZTIpIHsKICAgICAgICBpZiAobm9kZTIgJiYgbm9kZTIudG9KU09OICYmIHR5cGVvZiBub2RlMi50b0pTT04gPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgIG5vZGUyID0gbm9kZTIudG9KU09OKCk7CiAgICAgICAgfQogICAgICAgIGlmIChub2RlMiA9PT0gdm9pZCAwKSByZXR1cm47CiAgICAgICAgaWYgKHR5cGVvZiBub2RlMiA9PSAibnVtYmVyIikgcmV0dXJuIGlzRmluaXRlKG5vZGUyKSA/ICIiICsgbm9kZTIgOiAibnVsbCI7CiAgICAgICAgaWYgKHR5cGVvZiBub2RlMiAhPT0gIm9iamVjdCIpIHJldHVybiBKU09OLnN0cmluZ2lmeShub2RlMik7CiAgICAgICAgdmFyIGkxMCwgb3V0OwogICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5vZGUyKSkgewogICAgICAgICAgb3V0ID0gIlsiOwogICAgICAgICAgZm9yIChpMTAgPSAwOyBpMTAgPCBub2RlMi5sZW5ndGg7IGkxMCsrKSB7CiAgICAgICAgICAgIGlmIChpMTApIG91dCArPSAiLCI7CiAgICAgICAgICAgIG91dCArPSBzdHJpbmdpZnk3KG5vZGUyW2kxMF0pIHx8ICJudWxsIjsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBvdXQgKyAiXSI7CiAgICAgICAgfQogICAgICAgIGlmIChub2RlMiA9PT0gbnVsbCkgcmV0dXJuICJudWxsIjsKICAgICAgICBpZiAoc2Vlbi5pbmRleE9mKG5vZGUyKSAhPT0gLTEpIHsKICAgICAgICAgIGlmIChjeWNsZXMpIHJldHVybiBKU09OLnN0cmluZ2lmeSgiX19jeWNsZV9fIik7CiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJDb252ZXJ0aW5nIGNpcmN1bGFyIHN0cnVjdHVyZSB0byBKU09OIik7CiAgICAgICAgfQogICAgICAgIHZhciBzZWVuSW5kZXggPSBzZWVuLnB1c2gobm9kZTIpIC0gMTsKICAgICAgICB2YXIga2V5czIgPSBPYmplY3Qua2V5cyhub2RlMikuc29ydChjbXAgJiYgY21wKG5vZGUyKSk7CiAgICAgICAgb3V0ID0gIiI7CiAgICAgICAgZm9yIChpMTAgPSAwOyBpMTAgPCBrZXlzMi5sZW5ndGg7IGkxMCsrKSB7CiAgICAgICAgICB2YXIga2V5MiA9IGtleXMyW2kxMF07CiAgICAgICAgICB2YXIgdmFsdWUyID0gc3RyaW5naWZ5Nyhub2RlMltrZXkyXSk7CiAgICAgICAgICBpZiAoIXZhbHVlMikgY29udGludWU7CiAgICAgICAgICBpZiAob3V0KSBvdXQgKz0gIiwiOwogICAgICAgICAgb3V0ICs9IEpTT04uc3RyaW5naWZ5KGtleTIpICsgIjoiICsgdmFsdWUyOwogICAgICAgIH0KICAgICAgICBzZWVuLnNwbGljZShzZWVuSW5kZXgsIDEpOwogICAgICAgIHJldHVybiAieyIgKyBvdXQgKyAifSI7CiAgICAgIH0pLCAic3RyaW5naWZ5IikpKGRhdGEpOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL2NvbW1vbi5qcwp2YXIgcmVxdWlyZV9jb21tb24gPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL2NvbW1vbi5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBmdW5jdGlvbiBpc05vdGhpbmcoc3ViamVjdCkgewogICAgICByZXR1cm4gdHlwZW9mIHN1YmplY3QgPT09ICJ1bmRlZmluZWQiIHx8IHN1YmplY3QgPT09IG51bGw7CiAgICB9CiAgICBfX25hbWUoaXNOb3RoaW5nLCAiaXNOb3RoaW5nIik7CiAgICBmdW5jdGlvbiBpc09iamVjdDMoc3ViamVjdCkgewogICAgICByZXR1cm4gdHlwZW9mIHN1YmplY3QgPT09ICJvYmplY3QiICYmIHN1YmplY3QgIT09IG51bGw7CiAgICB9CiAgICBfX25hbWUoaXNPYmplY3QzLCAiaXNPYmplY3QiKTsKICAgIGZ1bmN0aW9uIHRvQXJyYXkyKHNlcXVlbmNlKSB7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KHNlcXVlbmNlKSkgcmV0dXJuIHNlcXVlbmNlOwogICAgICBlbHNlIGlmIChpc05vdGhpbmcoc2VxdWVuY2UpKSByZXR1cm4gW107CiAgICAgIHJldHVybiBbc2VxdWVuY2VdOwogICAgfQogICAgX19uYW1lKHRvQXJyYXkyLCAidG9BcnJheSIpOwogICAgZnVuY3Rpb24gZXh0ZW5kMyh0YXJnZXQsIHNvdXJjZSkgewogICAgICB2YXIgaW5kZXgyLCBsZW5ndGgsIGtleTIsIHNvdXJjZUtleXM7CiAgICAgIGlmIChzb3VyY2UpIHsKICAgICAgICBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsKICAgICAgICBmb3IgKGluZGV4MiA9IDAsIGxlbmd0aCA9IHNvdXJjZUtleXMubGVuZ3RoOyBpbmRleDIgPCBsZW5ndGg7IGluZGV4MiArPSAxKSB7CiAgICAgICAgICBrZXkyID0gc291cmNlS2V5c1tpbmRleDJdOwogICAgICAgICAgdGFyZ2V0W2tleTJdID0gc291cmNlW2tleTJdOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdGFyZ2V0OwogICAgfQogICAgX19uYW1lKGV4dGVuZDMsICJleHRlbmQiKTsKICAgIGZ1bmN0aW9uIHJlcGVhdDMoc3RyaW5nMywgY291bnQyKSB7CiAgICAgIHZhciByZXN1bHQgPSAiIiwgY3ljbGU7CiAgICAgIGZvciAoY3ljbGUgPSAwOyBjeWNsZSA8IGNvdW50MjsgY3ljbGUgKz0gMSkgewogICAgICAgIHJlc3VsdCArPSBzdHJpbmczOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBfX25hbWUocmVwZWF0MywgInJlcGVhdCIpOwogICAgZnVuY3Rpb24gaXNOZWdhdGl2ZVplcm8obnVtYmVyMikgewogICAgICByZXR1cm4gbnVtYmVyMiA9PT0gMCAmJiBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgPT09IDEgLyBudW1iZXIyOwogICAgfQogICAgX19uYW1lKGlzTmVnYXRpdmVaZXJvLCAiaXNOZWdhdGl2ZVplcm8iKTsKICAgIG1vZHVsZS5leHBvcnRzLmlzTm90aGluZyA9IGlzTm90aGluZzsKICAgIG1vZHVsZS5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3QzOwogICAgbW9kdWxlLmV4cG9ydHMudG9BcnJheSA9IHRvQXJyYXkyOwogICAgbW9kdWxlLmV4cG9ydHMucmVwZWF0ID0gcmVwZWF0MzsKICAgIG1vZHVsZS5leHBvcnRzLmlzTmVnYXRpdmVaZXJvID0gaXNOZWdhdGl2ZVplcm87CiAgICBtb2R1bGUuZXhwb3J0cy5leHRlbmQgPSBleHRlbmQzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvZXhjZXB0aW9uLmpzCnZhciByZXF1aXJlX2V4Y2VwdGlvbiA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvZXhjZXB0aW9uLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIGZ1bmN0aW9uIFlBTUxFeGNlcHRpb24ocmVhc29uLCBtYXJrMikgewogICAgICBFcnJvci5jYWxsKHRoaXMpOwogICAgICB0aGlzLm5hbWUgPSAiWUFNTEV4Y2VwdGlvbiI7CiAgICAgIHRoaXMucmVhc29uID0gcmVhc29uOwogICAgICB0aGlzLm1hcmsgPSBtYXJrMjsKICAgICAgdGhpcy5tZXNzYWdlID0gKHRoaXMucmVhc29uIHx8ICIodW5rbm93biByZWFzb24pIikgKyAodGhpcy5tYXJrID8gIiAiICsgdGhpcy5tYXJrLnRvU3RyaW5nKCkgOiAiIik7CiAgICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkgewogICAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuc3RhY2sgPSBuZXcgRXJyb3IoKS5zdGFjayB8fCAiIjsKICAgICAgfQogICAgfQogICAgX19uYW1lKFlBTUxFeGNlcHRpb24sICJZQU1MRXhjZXB0aW9uIik7CiAgICBZQU1MRXhjZXB0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTsKICAgIFlBTUxFeGNlcHRpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gWUFNTEV4Y2VwdGlvbjsKICAgIFlBTUxFeGNlcHRpb24ucHJvdG90eXBlLnRvU3RyaW5nID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbiB0b1N0cmluZzMoY29tcGFjdCkgewogICAgICB2YXIgcmVzdWx0ID0gdGhpcy5uYW1lICsgIjogIjsKICAgICAgcmVzdWx0ICs9IHRoaXMucmVhc29uIHx8ICIodW5rbm93biByZWFzb24pIjsKICAgICAgaWYgKCFjb21wYWN0ICYmIHRoaXMubWFyaykgewogICAgICAgIHJlc3VsdCArPSAiICIgKyB0aGlzLm1hcmsudG9TdHJpbmcoKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfSwgInRvU3RyaW5nIik7CiAgICBtb2R1bGUuZXhwb3J0cyA9IFlBTUxFeGNlcHRpb247CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9tYXJrLmpzCnZhciByZXF1aXJlX21hcmsgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL21hcmsuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIGNvbW1vbiA9IHJlcXVpcmVfY29tbW9uKCk7CiAgICBmdW5jdGlvbiBNYXJrKG5hbWUsIGJ1ZmZlcjIsIHBvc2l0aW9uMywgbGluZSwgY29sdW1uKSB7CiAgICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyMjsKICAgICAgdGhpcy5wb3NpdGlvbiA9IHBvc2l0aW9uMzsKICAgICAgdGhpcy5saW5lID0gbGluZTsKICAgICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47CiAgICB9CiAgICBfX25hbWUoTWFyaywgIk1hcmsiKTsKICAgIE1hcmsucHJvdG90eXBlLmdldFNuaXBwZXQgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uIGdldFNuaXBwZXQoaW5kZW50MywgbWF4TGVuZ3RoKSB7CiAgICAgIHZhciBoZWFkMiwgc3RhcnQsIHRhaWwsIGVuZCwgc25pcHBldDsKICAgICAgaWYgKCF0aGlzLmJ1ZmZlcikgcmV0dXJuIG51bGw7CiAgICAgIGluZGVudDMgPSBpbmRlbnQzIHx8IDQ7CiAgICAgIG1heExlbmd0aCA9IG1heExlbmd0aCB8fCA3NTsKICAgICAgaGVhZDIgPSAiIjsKICAgICAgc3RhcnQgPSB0aGlzLnBvc2l0aW9uOwogICAgICB3aGlsZSAoc3RhcnQgPiAwICYmICJcMFxyXG5ceDg1XHUyMDI4XHUyMDI5Ii5pbmRleE9mKHRoaXMuYnVmZmVyLmNoYXJBdChzdGFydCAtIDEpKSA9PT0gLTEpIHsKICAgICAgICBzdGFydCAtPSAxOwogICAgICAgIGlmICh0aGlzLnBvc2l0aW9uIC0gc3RhcnQgPiBtYXhMZW5ndGggLyAyIC0gMSkgewogICAgICAgICAgaGVhZDIgPSAiIC4uLiAiOwogICAgICAgICAgc3RhcnQgKz0gNTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICB0YWlsID0gIiI7CiAgICAgIGVuZCA9IHRoaXMucG9zaXRpb247CiAgICAgIHdoaWxlIChlbmQgPCB0aGlzLmJ1ZmZlci5sZW5ndGggJiYgIlwwXHJcblx4ODVcdTIwMjhcdTIwMjkiLmluZGV4T2YodGhpcy5idWZmZXIuY2hhckF0KGVuZCkpID09PSAtMSkgewogICAgICAgIGVuZCArPSAxOwogICAgICAgIGlmIChlbmQgLSB0aGlzLnBvc2l0aW9uID4gbWF4TGVuZ3RoIC8gMiAtIDEpIHsKICAgICAgICAgIHRhaWwgPSAiIC4uLiAiOwogICAgICAgICAgZW5kIC09IDU7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgc25pcHBldCA9IHRoaXMuYnVmZmVyLnNsaWNlKHN0YXJ0LCBlbmQpOwogICAgICByZXR1cm4gY29tbW9uLnJlcGVhdCgiICIsIGluZGVudDMpICsgaGVhZDIgKyBzbmlwcGV0ICsgdGFpbCArICJcbiIgKyBjb21tb24ucmVwZWF0KCIgIiwgaW5kZW50MyArIHRoaXMucG9zaXRpb24gLSBzdGFydCArIGhlYWQyLmxlbmd0aCkgKyAiXiI7CiAgICB9LCAiZ2V0U25pcHBldCIpOwogICAgTWFyay5wcm90b3R5cGUudG9TdHJpbmcgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uIHRvU3RyaW5nMyhjb21wYWN0KSB7CiAgICAgIHZhciBzbmlwcGV0LCB3aGVyZSA9ICIiOwogICAgICBpZiAodGhpcy5uYW1lKSB7CiAgICAgICAgd2hlcmUgKz0gJ2luICInICsgdGhpcy5uYW1lICsgJyIgJzsKICAgICAgfQogICAgICB3aGVyZSArPSAiYXQgbGluZSAiICsgKHRoaXMubGluZSArIDEpICsgIiwgY29sdW1uICIgKyAodGhpcy5jb2x1bW4gKyAxKTsKICAgICAgaWYgKCFjb21wYWN0KSB7CiAgICAgICAgc25pcHBldCA9IHRoaXMuZ2V0U25pcHBldCgpOwogICAgICAgIGlmIChzbmlwcGV0KSB7CiAgICAgICAgICB3aGVyZSArPSAiOlxuIiArIHNuaXBwZXQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB3aGVyZTsKICAgIH0sICJ0b1N0cmluZyIpOwogICAgbW9kdWxlLmV4cG9ydHMgPSBNYXJrOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS5qcwp2YXIgcmVxdWlyZV90eXBlID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBZQU1MRXhjZXB0aW9uID0gcmVxdWlyZV9leGNlcHRpb24oKTsKICAgIHZhciBUWVBFX0NPTlNUUlVDVE9SX09QVElPTlMgPSBbCiAgICAgICJraW5kIiwKICAgICAgInJlc29sdmUiLAogICAgICAiY29uc3RydWN0IiwKICAgICAgImluc3RhbmNlT2YiLAogICAgICAicHJlZGljYXRlIiwKICAgICAgInJlcHJlc2VudCIsCiAgICAgICJkZWZhdWx0U3R5bGUiLAogICAgICAic3R5bGVBbGlhc2VzIgogICAgXTsKICAgIHZhciBZQU1MX05PREVfS0lORFMgPSBbCiAgICAgICJzY2FsYXIiLAogICAgICAic2VxdWVuY2UiLAogICAgICAibWFwcGluZyIKICAgIF07CiAgICBmdW5jdGlvbiBjb21waWxlU3R5bGVBbGlhc2VzKG1hcDcpIHsKICAgICAgdmFyIHJlc3VsdCA9IHt9OwogICAgICBpZiAobWFwNyAhPT0gbnVsbCkgewogICAgICAgIE9iamVjdC5rZXlzKG1hcDcpLmZvckVhY2goZnVuY3Rpb24oc3R5bGUpIHsKICAgICAgICAgIG1hcDdbc3R5bGVdLmZvckVhY2goZnVuY3Rpb24oYWxpYXMpIHsKICAgICAgICAgICAgcmVzdWx0W1N0cmluZyhhbGlhcyldID0gc3R5bGU7CiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgX19uYW1lKGNvbXBpbGVTdHlsZUFsaWFzZXMsICJjb21waWxlU3R5bGVBbGlhc2VzIik7CiAgICBmdW5jdGlvbiBUeXBlKHRhZywgb3B0aW9ucykgewogICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKICAgICAgT2JqZWN0LmtleXMob3B0aW9ucykuZm9yRWFjaChmdW5jdGlvbihuYW1lKSB7CiAgICAgICAgaWYgKFRZUEVfQ09OU1RSVUNUT1JfT1BUSU9OUy5pbmRleE9mKG5hbWUpID09PSAtMSkgewogICAgICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ1Vua25vd24gb3B0aW9uICInICsgbmFtZSArICciIGlzIG1ldCBpbiBkZWZpbml0aW9uIG9mICInICsgdGFnICsgJyIgWUFNTCB0eXBlLicpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHRoaXMudGFnID0gdGFnOwogICAgICB0aGlzLmtpbmQgPSBvcHRpb25zWyJraW5kIl0gfHwgbnVsbDsKICAgICAgdGhpcy5yZXNvbHZlID0gb3B0aW9uc1sicmVzb2x2ZSJdIHx8IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9OwogICAgICB0aGlzLmNvbnN0cnVjdCA9IG9wdGlvbnNbImNvbnN0cnVjdCJdIHx8IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICByZXR1cm4gZGF0YTsKICAgICAgfTsKICAgICAgdGhpcy5pbnN0YW5jZU9mID0gb3B0aW9uc1siaW5zdGFuY2VPZiJdIHx8IG51bGw7CiAgICAgIHRoaXMucHJlZGljYXRlID0gb3B0aW9uc1sicHJlZGljYXRlIl0gfHwgbnVsbDsKICAgICAgdGhpcy5yZXByZXNlbnQgPSBvcHRpb25zWyJyZXByZXNlbnQiXSB8fCBudWxsOwogICAgICB0aGlzLmRlZmF1bHRTdHlsZSA9IG9wdGlvbnNbImRlZmF1bHRTdHlsZSJdIHx8IG51bGw7CiAgICAgIHRoaXMuc3R5bGVBbGlhc2VzID0gY29tcGlsZVN0eWxlQWxpYXNlcyhvcHRpb25zWyJzdHlsZUFsaWFzZXMiXSB8fCBudWxsKTsKICAgICAgaWYgKFlBTUxfTk9ERV9LSU5EUy5pbmRleE9mKHRoaXMua2luZCkgPT09IC0xKSB7CiAgICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ1Vua25vd24ga2luZCAiJyArIHRoaXMua2luZCArICciIGlzIHNwZWNpZmllZCBmb3IgIicgKyB0YWcgKyAnIiBZQU1MIHR5cGUuJyk7CiAgICAgIH0KICAgIH0KICAgIF9fbmFtZShUeXBlLCAiVHlwZSIpOwogICAgbW9kdWxlLmV4cG9ydHMgPSBUeXBlOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hLmpzCnZhciByZXF1aXJlX3NjaGVtYSA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBjb21tb24gPSByZXF1aXJlX2NvbW1vbigpOwogICAgdmFyIFlBTUxFeGNlcHRpb24gPSByZXF1aXJlX2V4Y2VwdGlvbigpOwogICAgdmFyIFR5cGUgPSByZXF1aXJlX3R5cGUoKTsKICAgIGZ1bmN0aW9uIGNvbXBpbGVMaXN0KHNjaGVtYSwgbmFtZSwgcmVzdWx0KSB7CiAgICAgIHZhciBleGNsdWRlID0gW107CiAgICAgIHNjaGVtYS5pbmNsdWRlLmZvckVhY2goZnVuY3Rpb24oaW5jbHVkZWRTY2hlbWEpIHsKICAgICAgICByZXN1bHQgPSBjb21waWxlTGlzdChpbmNsdWRlZFNjaGVtYSwgbmFtZSwgcmVzdWx0KTsKICAgICAgfSk7CiAgICAgIHNjaGVtYVtuYW1lXS5mb3JFYWNoKGZ1bmN0aW9uKGN1cnJlbnRUeXBlKSB7CiAgICAgICAgcmVzdWx0LmZvckVhY2goZnVuY3Rpb24ocHJldmlvdXNUeXBlLCBwcmV2aW91c0luZGV4KSB7CiAgICAgICAgICBpZiAocHJldmlvdXNUeXBlLnRhZyA9PT0gY3VycmVudFR5cGUudGFnICYmIHByZXZpb3VzVHlwZS5raW5kID09PSBjdXJyZW50VHlwZS5raW5kKSB7CiAgICAgICAgICAgIGV4Y2x1ZGUucHVzaChwcmV2aW91c0luZGV4KTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICByZXN1bHQucHVzaChjdXJyZW50VHlwZSk7CiAgICAgIH0pOwogICAgICByZXR1cm4gcmVzdWx0LmZpbHRlcihmdW5jdGlvbih0eXBlNSwgaW5kZXgyKSB7CiAgICAgICAgcmV0dXJuIGV4Y2x1ZGUuaW5kZXhPZihpbmRleDIpID09PSAtMTsKICAgICAgfSk7CiAgICB9CiAgICBfX25hbWUoY29tcGlsZUxpc3QsICJjb21waWxlTGlzdCIpOwogICAgZnVuY3Rpb24gY29tcGlsZU1hcCgpIHsKICAgICAgdmFyIHJlc3VsdCA9IHsKICAgICAgICBzY2FsYXI6IHt9LAogICAgICAgIHNlcXVlbmNlOiB7fSwKICAgICAgICBtYXBwaW5nOiB7fSwKICAgICAgICBmYWxsYmFjazoge30KICAgICAgfSwgaW5kZXgyLCBsZW5ndGg7CiAgICAgIGZ1bmN0aW9uIGNvbGxlY3RUeXBlKHR5cGU1KSB7CiAgICAgICAgcmVzdWx0W3R5cGU1LmtpbmRdW3R5cGU1LnRhZ10gPSByZXN1bHRbImZhbGxiYWNrIl1bdHlwZTUudGFnXSA9IHR5cGU1OwogICAgICB9CiAgICAgIF9fbmFtZShjb2xsZWN0VHlwZSwgImNvbGxlY3RUeXBlIik7CiAgICAgIGZvciAoaW5kZXgyID0gMCwgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsgaW5kZXgyIDwgbGVuZ3RoOyBpbmRleDIgKz0gMSkgewogICAgICAgIGFyZ3VtZW50c1tpbmRleDJdLmZvckVhY2goY29sbGVjdFR5cGUpOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBfX25hbWUoY29tcGlsZU1hcCwgImNvbXBpbGVNYXAiKTsKICAgIGZ1bmN0aW9uIFNjaGVtYTIoZGVmaW5pdGlvbjMpIHsKICAgICAgdGhpcy5pbmNsdWRlID0gZGVmaW5pdGlvbjMuaW5jbHVkZSB8fCBbXTsKICAgICAgdGhpcy5pbXBsaWNpdCA9IGRlZmluaXRpb24zLmltcGxpY2l0IHx8IFtdOwogICAgICB0aGlzLmV4cGxpY2l0ID0gZGVmaW5pdGlvbjMuZXhwbGljaXQgfHwgW107CiAgICAgIHRoaXMuaW1wbGljaXQuZm9yRWFjaChmdW5jdGlvbih0eXBlNSkgewogICAgICAgIGlmICh0eXBlNS5sb2FkS2luZCAmJiB0eXBlNS5sb2FkS2luZCAhPT0gInNjYWxhciIpIHsKICAgICAgICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCJUaGVyZSBpcyBhIG5vbi1zY2FsYXIgdHlwZSBpbiB0aGUgaW1wbGljaXQgbGlzdCBvZiBhIHNjaGVtYS4gSW1wbGljaXQgcmVzb2x2aW5nIG9mIHN1Y2ggdHlwZXMgaXMgbm90IHN1cHBvcnRlZC4iKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICB0aGlzLmNvbXBpbGVkSW1wbGljaXQgPSBjb21waWxlTGlzdCh0aGlzLCAiaW1wbGljaXQiLCBbXSk7CiAgICAgIHRoaXMuY29tcGlsZWRFeHBsaWNpdCA9IGNvbXBpbGVMaXN0KHRoaXMsICJleHBsaWNpdCIsIFtdKTsKICAgICAgdGhpcy5jb21waWxlZFR5cGVNYXAgPSBjb21waWxlTWFwKHRoaXMuY29tcGlsZWRJbXBsaWNpdCwgdGhpcy5jb21waWxlZEV4cGxpY2l0KTsKICAgIH0KICAgIF9fbmFtZShTY2hlbWEyLCAiU2NoZW1hIik7CiAgICBTY2hlbWEyLkRFRkFVTFQgPSBudWxsOwogICAgU2NoZW1hMi5jcmVhdGUgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uIGNyZWF0ZVNjaGVtYSgpIHsKICAgICAgdmFyIHNjaGVtYXMsIHR5cGVzOwogICAgICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICBjYXNlIDE6CiAgICAgICAgICBzY2hlbWFzID0gU2NoZW1hMi5ERUZBVUxUOwogICAgICAgICAgdHlwZXMgPSBhcmd1bWVudHNbMF07CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI6CiAgICAgICAgICBzY2hlbWFzID0gYXJndW1lbnRzWzBdOwogICAgICAgICAgdHlwZXMgPSBhcmd1bWVudHNbMV07CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIFNjaGVtYS5jcmVhdGUgZnVuY3Rpb24iKTsKICAgICAgfQogICAgICBzY2hlbWFzID0gY29tbW9uLnRvQXJyYXkoc2NoZW1hcyk7CiAgICAgIHR5cGVzID0gY29tbW9uLnRvQXJyYXkodHlwZXMpOwogICAgICBpZiAoIXNjaGVtYXMuZXZlcnkoZnVuY3Rpb24oc2NoZW1hKSB7CiAgICAgICAgcmV0dXJuIHNjaGVtYSBpbnN0YW5jZW9mIFNjaGVtYTI7CiAgICAgIH0pKSB7CiAgICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oIlNwZWNpZmllZCBsaXN0IG9mIHN1cGVyIHNjaGVtYXMgKG9yIGEgc2luZ2xlIFNjaGVtYSBvYmplY3QpIGNvbnRhaW5zIGEgbm9uLVNjaGVtYSBvYmplY3QuIik7CiAgICAgIH0KICAgICAgaWYgKCF0eXBlcy5ldmVyeShmdW5jdGlvbih0eXBlNSkgewogICAgICAgIHJldHVybiB0eXBlNSBpbnN0YW5jZW9mIFR5cGU7CiAgICAgIH0pKSB7CiAgICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oIlNwZWNpZmllZCBsaXN0IG9mIFlBTUwgdHlwZXMgKG9yIGEgc2luZ2xlIFR5cGUgb2JqZWN0KSBjb250YWlucyBhIG5vbi1UeXBlIG9iamVjdC4iKTsKICAgICAgfQogICAgICByZXR1cm4gbmV3IFNjaGVtYTIoewogICAgICAgIGluY2x1ZGU6IHNjaGVtYXMsCiAgICAgICAgZXhwbGljaXQ6IHR5cGVzCiAgICAgIH0pOwogICAgfSwgImNyZWF0ZVNjaGVtYSIpOwogICAgbW9kdWxlLmV4cG9ydHMgPSBTY2hlbWEyOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9zdHIuanMKdmFyIHJlcXVpcmVfc3RyID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL3N0ci5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgVHlwZSA9IHJlcXVpcmVfdHlwZSgpOwogICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgidGFnOnlhbWwub3JnLDIwMDI6c3RyIiwgewogICAgICBraW5kOiAic2NhbGFyIiwKICAgICAgY29uc3RydWN0OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICByZXR1cm4gZGF0YSAhPT0gbnVsbCA/IGRhdGEgOiAiIjsKICAgICAgfSwgImNvbnN0cnVjdCIpCiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvc2VxLmpzCnZhciByZXF1aXJlX3NlcSA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9zZXEuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIFR5cGUgPSByZXF1aXJlX3R5cGUoKTsKICAgIG1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoInRhZzp5YW1sLm9yZywyMDAyOnNlcSIsIHsKICAgICAga2luZDogInNlcXVlbmNlIiwKICAgICAgY29uc3RydWN0OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICByZXR1cm4gZGF0YSAhPT0gbnVsbCA/IGRhdGEgOiBbXTsKICAgICAgfSwgImNvbnN0cnVjdCIpCiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvbWFwLmpzCnZhciByZXF1aXJlX21hcCA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9tYXAuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIFR5cGUgPSByZXF1aXJlX3R5cGUoKTsKICAgIG1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoInRhZzp5YW1sLm9yZywyMDAyOm1hcCIsIHsKICAgICAga2luZDogIm1hcHBpbmciLAogICAgICBjb25zdHJ1Y3Q6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oZGF0YSkgewogICAgICAgIHJldHVybiBkYXRhICE9PSBudWxsID8gZGF0YSA6IHt9OwogICAgICB9LCAiY29uc3RydWN0IikKICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hL2ZhaWxzYWZlLmpzCnZhciByZXF1aXJlX2ZhaWxzYWZlID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvZmFpbHNhZmUuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIFNjaGVtYTIgPSByZXF1aXJlX3NjaGVtYSgpOwogICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgU2NoZW1hMih7CiAgICAgIGV4cGxpY2l0OiBbCiAgICAgICAgcmVxdWlyZV9zdHIoKSwKICAgICAgICByZXF1aXJlX3NlcSgpLAogICAgICAgIHJlcXVpcmVfbWFwKCkKICAgICAgXQogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL251bGwuanMKdmFyIHJlcXVpcmVfbnVsbCA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9udWxsLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBUeXBlID0gcmVxdWlyZV90eXBlKCk7CiAgICBmdW5jdGlvbiByZXNvbHZlWWFtbE51bGwoZGF0YSkgewogICAgICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIHRydWU7CiAgICAgIHZhciBtYXgzID0gZGF0YS5sZW5ndGg7CiAgICAgIHJldHVybiBtYXgzID09PSAxICYmIGRhdGEgPT09ICJ+IiB8fCBtYXgzID09PSA0ICYmIChkYXRhID09PSAibnVsbCIgfHwgZGF0YSA9PT0gIk51bGwiIHx8IGRhdGEgPT09ICJOVUxMIik7CiAgICB9CiAgICBfX25hbWUocmVzb2x2ZVlhbWxOdWxsLCAicmVzb2x2ZVlhbWxOdWxsIik7CiAgICBmdW5jdGlvbiBjb25zdHJ1Y3RZYW1sTnVsbCgpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBfX25hbWUoY29uc3RydWN0WWFtbE51bGwsICJjb25zdHJ1Y3RZYW1sTnVsbCIpOwogICAgZnVuY3Rpb24gaXNOdWxsKG9iamVjdCkgewogICAgICByZXR1cm4gb2JqZWN0ID09PSBudWxsOwogICAgfQogICAgX19uYW1lKGlzTnVsbCwgImlzTnVsbCIpOwogICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgidGFnOnlhbWwub3JnLDIwMDI6bnVsbCIsIHsKICAgICAga2luZDogInNjYWxhciIsCiAgICAgIHJlc29sdmU6IHJlc29sdmVZYW1sTnVsbCwKICAgICAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sTnVsbCwKICAgICAgcHJlZGljYXRlOiBpc051bGwsCiAgICAgIHJlcHJlc2VudDogewogICAgICAgIGNhbm9uaWNhbDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiAifiI7CiAgICAgICAgfSwgImNhbm9uaWNhbCIpLAogICAgICAgIGxvd2VyY2FzZTogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiAibnVsbCI7CiAgICAgICAgfSwgImxvd2VyY2FzZSIpLAogICAgICAgIHVwcGVyY2FzZTogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiAiTlVMTCI7CiAgICAgICAgfSwgInVwcGVyY2FzZSIpLAogICAgICAgIGNhbWVsY2FzZTogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiAiTnVsbCI7CiAgICAgICAgfSwgImNhbWVsY2FzZSIpCiAgICAgIH0sCiAgICAgIGRlZmF1bHRTdHlsZTogImxvd2VyY2FzZSIKICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9ib29sLmpzCnZhciByZXF1aXJlX2Jvb2wgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvYm9vbC5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgVHlwZSA9IHJlcXVpcmVfdHlwZSgpOwogICAgZnVuY3Rpb24gcmVzb2x2ZVlhbWxCb29sZWFuKGRhdGEpIHsKICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTsKICAgICAgdmFyIG1heDMgPSBkYXRhLmxlbmd0aDsKICAgICAgcmV0dXJuIG1heDMgPT09IDQgJiYgKGRhdGEgPT09ICJ0cnVlIiB8fCBkYXRhID09PSAiVHJ1ZSIgfHwgZGF0YSA9PT0gIlRSVUUiKSB8fCBtYXgzID09PSA1ICYmIChkYXRhID09PSAiZmFsc2UiIHx8IGRhdGEgPT09ICJGYWxzZSIgfHwgZGF0YSA9PT0gIkZBTFNFIik7CiAgICB9CiAgICBfX25hbWUocmVzb2x2ZVlhbWxCb29sZWFuLCAicmVzb2x2ZVlhbWxCb29sZWFuIik7CiAgICBmdW5jdGlvbiBjb25zdHJ1Y3RZYW1sQm9vbGVhbihkYXRhKSB7CiAgICAgIHJldHVybiBkYXRhID09PSAidHJ1ZSIgfHwgZGF0YSA9PT0gIlRydWUiIHx8IGRhdGEgPT09ICJUUlVFIjsKICAgIH0KICAgIF9fbmFtZShjb25zdHJ1Y3RZYW1sQm9vbGVhbiwgImNvbnN0cnVjdFlhbWxCb29sZWFuIik7CiAgICBmdW5jdGlvbiBpc0Jvb2xlYW4ob2JqZWN0KSB7CiAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PT0gIltvYmplY3QgQm9vbGVhbl0iOwogICAgfQogICAgX19uYW1lKGlzQm9vbGVhbiwgImlzQm9vbGVhbiIpOwogICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgidGFnOnlhbWwub3JnLDIwMDI6Ym9vbCIsIHsKICAgICAga2luZDogInNjYWxhciIsCiAgICAgIHJlc29sdmU6IHJlc29sdmVZYW1sQm9vbGVhbiwKICAgICAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sQm9vbGVhbiwKICAgICAgcHJlZGljYXRlOiBpc0Jvb2xlYW4sCiAgICAgIHJlcHJlc2VudDogewogICAgICAgIGxvd2VyY2FzZTogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihvYmplY3QpIHsKICAgICAgICAgIHJldHVybiBvYmplY3QgPyAidHJ1ZSIgOiAiZmFsc2UiOwogICAgICAgIH0sICJsb3dlcmNhc2UiKSwKICAgICAgICB1cHBlcmNhc2U6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24ob2JqZWN0KSB7CiAgICAgICAgICByZXR1cm4gb2JqZWN0ID8gIlRSVUUiIDogIkZBTFNFIjsKICAgICAgICB9LCAidXBwZXJjYXNlIiksCiAgICAgICAgY2FtZWxjYXNlOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKG9iamVjdCkgewogICAgICAgICAgcmV0dXJuIG9iamVjdCA/ICJUcnVlIiA6ICJGYWxzZSI7CiAgICAgICAgfSwgImNhbWVsY2FzZSIpCiAgICAgIH0sCiAgICAgIGRlZmF1bHRTdHlsZTogImxvd2VyY2FzZSIKICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9pbnQuanMKdmFyIHJlcXVpcmVfaW50ID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2ludC5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgY29tbW9uID0gcmVxdWlyZV9jb21tb24oKTsKICAgIHZhciBUeXBlID0gcmVxdWlyZV90eXBlKCk7CiAgICBmdW5jdGlvbiBpc0hleENvZGUoYzEwKSB7CiAgICAgIHJldHVybiA0OCA8PSBjMTAgJiYgYzEwIDw9IDU3IHx8IDY1IDw9IGMxMCAmJiBjMTAgPD0gNzAgfHwgOTcgPD0gYzEwICYmIGMxMCA8PSAxMDI7CiAgICB9CiAgICBfX25hbWUoaXNIZXhDb2RlLCAiaXNIZXhDb2RlIik7CiAgICBmdW5jdGlvbiBpc09jdENvZGUoYzEwKSB7CiAgICAgIHJldHVybiA0OCA8PSBjMTAgJiYgYzEwIDw9IDU1OwogICAgfQogICAgX19uYW1lKGlzT2N0Q29kZSwgImlzT2N0Q29kZSIpOwogICAgZnVuY3Rpb24gaXNEZWNDb2RlKGMxMCkgewogICAgICByZXR1cm4gNDggPD0gYzEwICYmIGMxMCA8PSA1NzsKICAgIH0KICAgIF9fbmFtZShpc0RlY0NvZGUsICJpc0RlY0NvZGUiKTsKICAgIGZ1bmN0aW9uIHJlc29sdmVZYW1sSW50ZWdlcihkYXRhKSB7CiAgICAgIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICAgIHZhciBtYXgzID0gZGF0YS5sZW5ndGgsIGluZGV4MiA9IDAsIGhhc0RpZ2l0cyA9IGZhbHNlLCBjaDsKICAgICAgaWYgKCFtYXgzKSByZXR1cm4gZmFsc2U7CiAgICAgIGNoID0gZGF0YVtpbmRleDJdOwogICAgICBpZiAoY2ggPT09ICItIiB8fCBjaCA9PT0gIisiKSB7CiAgICAgICAgY2ggPSBkYXRhWysraW5kZXgyXTsKICAgICAgfQogICAgICBpZiAoY2ggPT09ICIwIikgewogICAgICAgIGlmIChpbmRleDIgKyAxID09PSBtYXgzKSByZXR1cm4gdHJ1ZTsKICAgICAgICBjaCA9IGRhdGFbKytpbmRleDJdOwogICAgICAgIGlmIChjaCA9PT0gImIiKSB7CiAgICAgICAgICBpbmRleDIrKzsKICAgICAgICAgIGZvciAoOyBpbmRleDIgPCBtYXgzOyBpbmRleDIrKykgewogICAgICAgICAgICBjaCA9IGRhdGFbaW5kZXgyXTsKICAgICAgICAgICAgaWYgKGNoID09PSAiXyIpIGNvbnRpbnVlOwogICAgICAgICAgICBpZiAoY2ggIT09ICIwIiAmJiBjaCAhPT0gIjEiKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIGhhc0RpZ2l0cyA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gaGFzRGlnaXRzICYmIGNoICE9PSAiXyI7CiAgICAgICAgfQogICAgICAgIGlmIChjaCA9PT0gIngiKSB7CiAgICAgICAgICBpbmRleDIrKzsKICAgICAgICAgIGZvciAoOyBpbmRleDIgPCBtYXgzOyBpbmRleDIrKykgewogICAgICAgICAgICBjaCA9IGRhdGFbaW5kZXgyXTsKICAgICAgICAgICAgaWYgKGNoID09PSAiXyIpIGNvbnRpbnVlOwogICAgICAgICAgICBpZiAoIWlzSGV4Q29kZShkYXRhLmNoYXJDb2RlQXQoaW5kZXgyKSkpIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgaGFzRGlnaXRzID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBoYXNEaWdpdHMgJiYgY2ggIT09ICJfIjsKICAgICAgICB9CiAgICAgICAgZm9yICg7IGluZGV4MiA8IG1heDM7IGluZGV4MisrKSB7CiAgICAgICAgICBjaCA9IGRhdGFbaW5kZXgyXTsKICAgICAgICAgIGlmIChjaCA9PT0gIl8iKSBjb250aW51ZTsKICAgICAgICAgIGlmICghaXNPY3RDb2RlKGRhdGEuY2hhckNvZGVBdChpbmRleDIpKSkgcmV0dXJuIGZhbHNlOwogICAgICAgICAgaGFzRGlnaXRzID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGhhc0RpZ2l0cyAmJiBjaCAhPT0gIl8iOwogICAgICB9CiAgICAgIGlmIChjaCA9PT0gIl8iKSByZXR1cm4gZmFsc2U7CiAgICAgIGZvciAoOyBpbmRleDIgPCBtYXgzOyBpbmRleDIrKykgewogICAgICAgIGNoID0gZGF0YVtpbmRleDJdOwogICAgICAgIGlmIChjaCA9PT0gIl8iKSBjb250aW51ZTsKICAgICAgICBpZiAoY2ggPT09ICI6IikgYnJlYWs7CiAgICAgICAgaWYgKCFpc0RlY0NvZGUoZGF0YS5jaGFyQ29kZUF0KGluZGV4MikpKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGhhc0RpZ2l0cyA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKCFoYXNEaWdpdHMgfHwgY2ggPT09ICJfIikgcmV0dXJuIGZhbHNlOwogICAgICBpZiAoY2ggIT09ICI6IikgcmV0dXJuIHRydWU7CiAgICAgIHJldHVybiAvXig6WzAtNV0/WzAtOV0pKyQvLnRlc3QoZGF0YS5zbGljZShpbmRleDIpKTsKICAgIH0KICAgIF9fbmFtZShyZXNvbHZlWWFtbEludGVnZXIsICJyZXNvbHZlWWFtbEludGVnZXIiKTsKICAgIGZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxJbnRlZ2VyKGRhdGEpIHsKICAgICAgdmFyIHZhbHVlMiA9IGRhdGEsIHNpZ24gPSAxLCBjaCwgYmFzZSwgZGlnaXRzID0gW107CiAgICAgIGlmICh2YWx1ZTIuaW5kZXhPZigiXyIpICE9PSAtMSkgewogICAgICAgIHZhbHVlMiA9IHZhbHVlMi5yZXBsYWNlKC9fL2csICIiKTsKICAgICAgfQogICAgICBjaCA9IHZhbHVlMlswXTsKICAgICAgaWYgKGNoID09PSAiLSIgfHwgY2ggPT09ICIrIikgewogICAgICAgIGlmIChjaCA9PT0gIi0iKSBzaWduID0gLTE7CiAgICAgICAgdmFsdWUyID0gdmFsdWUyLnNsaWNlKDEpOwogICAgICAgIGNoID0gdmFsdWUyWzBdOwogICAgICB9CiAgICAgIGlmICh2YWx1ZTIgPT09ICIwIikgcmV0dXJuIDA7CiAgICAgIGlmIChjaCA9PT0gIjAiKSB7CiAgICAgICAgaWYgKHZhbHVlMlsxXSA9PT0gImIiKSByZXR1cm4gc2lnbiAqIHBhcnNlSW50KHZhbHVlMi5zbGljZSgyKSwgMik7CiAgICAgICAgaWYgKHZhbHVlMlsxXSA9PT0gIngiKSByZXR1cm4gc2lnbiAqIHBhcnNlSW50KHZhbHVlMiwgMTYpOwogICAgICAgIHJldHVybiBzaWduICogcGFyc2VJbnQodmFsdWUyLCA4KTsKICAgICAgfQogICAgICBpZiAodmFsdWUyLmluZGV4T2YoIjoiKSAhPT0gLTEpIHsKICAgICAgICB2YWx1ZTIuc3BsaXQoIjoiKS5mb3JFYWNoKGZ1bmN0aW9uKHY0KSB7CiAgICAgICAgICBkaWdpdHMudW5zaGlmdChwYXJzZUludCh2NCwgMTApKTsKICAgICAgICB9KTsKICAgICAgICB2YWx1ZTIgPSAwOwogICAgICAgIGJhc2UgPSAxOwogICAgICAgIGRpZ2l0cy5mb3JFYWNoKGZ1bmN0aW9uKGQ0KSB7CiAgICAgICAgICB2YWx1ZTIgKz0gZDQgKiBiYXNlOwogICAgICAgICAgYmFzZSAqPSA2MDsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gc2lnbiAqIHZhbHVlMjsKICAgICAgfQogICAgICByZXR1cm4gc2lnbiAqIHBhcnNlSW50KHZhbHVlMiwgMTApOwogICAgfQogICAgX19uYW1lKGNvbnN0cnVjdFlhbWxJbnRlZ2VyLCAiY29uc3RydWN0WWFtbEludGVnZXIiKTsKICAgIGZ1bmN0aW9uIGlzSW50ZWdlcihvYmplY3QpIHsKICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09PSAiW29iamVjdCBOdW1iZXJdIiAmJiAob2JqZWN0ICUgMSA9PT0gMCAmJiAhY29tbW9uLmlzTmVnYXRpdmVaZXJvKG9iamVjdCkpOwogICAgfQogICAgX19uYW1lKGlzSW50ZWdlciwgImlzSW50ZWdlciIpOwogICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgidGFnOnlhbWwub3JnLDIwMDI6aW50IiwgewogICAgICBraW5kOiAic2NhbGFyIiwKICAgICAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxJbnRlZ2VyLAogICAgICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxJbnRlZ2VyLAogICAgICBwcmVkaWNhdGU6IGlzSW50ZWdlciwKICAgICAgcmVwcmVzZW50OiB7CiAgICAgICAgYmluYXJ5OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKG9iaikgewogICAgICAgICAgcmV0dXJuIG9iaiA+PSAwID8gIjBiIiArIG9iai50b1N0cmluZygyKSA6ICItMGIiICsgb2JqLnRvU3RyaW5nKDIpLnNsaWNlKDEpOwogICAgICAgIH0sICJiaW5hcnkiKSwKICAgICAgICBvY3RhbDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihvYmopIHsKICAgICAgICAgIHJldHVybiBvYmogPj0gMCA/ICIwIiArIG9iai50b1N0cmluZyg4KSA6ICItMCIgKyBvYmoudG9TdHJpbmcoOCkuc2xpY2UoMSk7CiAgICAgICAgfSwgIm9jdGFsIiksCiAgICAgICAgZGVjaW1hbDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihvYmopIHsKICAgICAgICAgIHJldHVybiBvYmoudG9TdHJpbmcoMTApOwogICAgICAgIH0sICJkZWNpbWFsIiksCiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqLwogICAgICAgIGhleGFkZWNpbWFsOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKG9iaikgewogICAgICAgICAgcmV0dXJuIG9iaiA+PSAwID8gIjB4IiArIG9iai50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSA6ICItMHgiICsgb2JqLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpLnNsaWNlKDEpOwogICAgICAgIH0sICJoZXhhZGVjaW1hbCIpCiAgICAgIH0sCiAgICAgIGRlZmF1bHRTdHlsZTogImRlY2ltYWwiLAogICAgICBzdHlsZUFsaWFzZXM6IHsKICAgICAgICBiaW5hcnk6IFsyLCAiYmluIl0sCiAgICAgICAgb2N0YWw6IFs4LCAib2N0Il0sCiAgICAgICAgZGVjaW1hbDogWzEwLCAiZGVjIl0sCiAgICAgICAgaGV4YWRlY2ltYWw6IFsxNiwgImhleCJdCiAgICAgIH0KICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9mbG9hdC5qcwp2YXIgcmVxdWlyZV9mbG9hdCA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9mbG9hdC5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgY29tbW9uID0gcmVxdWlyZV9jb21tb24oKTsKICAgIHZhciBUeXBlID0gcmVxdWlyZV90eXBlKCk7CiAgICB2YXIgWUFNTF9GTE9BVF9QQVRURVJOID0gbmV3IFJlZ0V4cCgKICAgICAgLy8gMi41ZTQsIDIuNSBhbmQgaW50ZWdlcnMKICAgICAgIl4oPzpbLStdPyg/OjB8WzEtOV1bMC05X10qKSg/OlxcLlswLTlfXSopPyg/OltlRV1bLStdP1swLTldKyk/fFxcLlswLTlfXSsoPzpbZUVdWy0rXT9bMC05XSspP3xbLStdP1swLTldWzAtOV9dKig/OjpbMC01XT9bMC05XSkrXFwuWzAtOV9dKnxbLStdP1xcLig/OmluZnxJbmZ8SU5GKXxcXC4oPzpuYW58TmFOfE5BTikpJCIKICAgICk7CiAgICBmdW5jdGlvbiByZXNvbHZlWWFtbEZsb2F0KGRhdGEpIHsKICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTsKICAgICAgaWYgKCFZQU1MX0ZMT0FUX1BBVFRFUk4udGVzdChkYXRhKSB8fCAvLyBRdWljayBoYWNrIHRvIG5vdCBhbGxvdyBpbnRlZ2VycyBlbmQgd2l0aCBgX2AKICAgICAgLy8gUHJvYmFibHkgc2hvdWxkIHVwZGF0ZSByZWdleHAgJiBjaGVjayBzcGVlZAogICAgICBkYXRhW2RhdGEubGVuZ3RoIC0gMV0gPT09ICJfIikgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIF9fbmFtZShyZXNvbHZlWWFtbEZsb2F0LCAicmVzb2x2ZVlhbWxGbG9hdCIpOwogICAgZnVuY3Rpb24gY29uc3RydWN0WWFtbEZsb2F0KGRhdGEpIHsKICAgICAgdmFyIHZhbHVlMiwgc2lnbiwgYmFzZSwgZGlnaXRzOwogICAgICB2YWx1ZTIgPSBkYXRhLnJlcGxhY2UoL18vZywgIiIpLnRvTG93ZXJDYXNlKCk7CiAgICAgIHNpZ24gPSB2YWx1ZTJbMF0gPT09ICItIiA/IC0xIDogMTsKICAgICAgZGlnaXRzID0gW107CiAgICAgIGlmICgiKy0iLmluZGV4T2YodmFsdWUyWzBdKSA+PSAwKSB7CiAgICAgICAgdmFsdWUyID0gdmFsdWUyLnNsaWNlKDEpOwogICAgICB9CiAgICAgIGlmICh2YWx1ZTIgPT09ICIuaW5mIikgewogICAgICAgIHJldHVybiBzaWduID09PSAxID8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIDogTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZOwogICAgICB9IGVsc2UgaWYgKHZhbHVlMiA9PT0gIi5uYW4iKSB7CiAgICAgICAgcmV0dXJuIE5hTjsKICAgICAgfSBlbHNlIGlmICh2YWx1ZTIuaW5kZXhPZigiOiIpID49IDApIHsKICAgICAgICB2YWx1ZTIuc3BsaXQoIjoiKS5mb3JFYWNoKGZ1bmN0aW9uKHY0KSB7CiAgICAgICAgICBkaWdpdHMudW5zaGlmdChwYXJzZUZsb2F0KHY0LCAxMCkpOwogICAgICAgIH0pOwogICAgICAgIHZhbHVlMiA9IDA7CiAgICAgICAgYmFzZSA9IDE7CiAgICAgICAgZGlnaXRzLmZvckVhY2goZnVuY3Rpb24oZDQpIHsKICAgICAgICAgIHZhbHVlMiArPSBkNCAqIGJhc2U7CiAgICAgICAgICBiYXNlICo9IDYwOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBzaWduICogdmFsdWUyOwogICAgICB9CiAgICAgIHJldHVybiBzaWduICogcGFyc2VGbG9hdCh2YWx1ZTIsIDEwKTsKICAgIH0KICAgIF9fbmFtZShjb25zdHJ1Y3RZYW1sRmxvYXQsICJjb25zdHJ1Y3RZYW1sRmxvYXQiKTsKICAgIHZhciBTQ0lFTlRJRklDX1dJVEhPVVRfRE9UID0gL15bLStdP1swLTldK2UvOwogICAgZnVuY3Rpb24gcmVwcmVzZW50WWFtbEZsb2F0KG9iamVjdCwgc3R5bGUpIHsKICAgICAgdmFyIHJlczsKICAgICAgaWYgKGlzTmFOKG9iamVjdCkpIHsKICAgICAgICBzd2l0Y2ggKHN0eWxlKSB7CiAgICAgICAgICBjYXNlICJsb3dlcmNhc2UiOgogICAgICAgICAgICByZXR1cm4gIi5uYW4iOwogICAgICAgICAgY2FzZSAidXBwZXJjYXNlIjoKICAgICAgICAgICAgcmV0dXJuICIuTkFOIjsKICAgICAgICAgIGNhc2UgImNhbWVsY2FzZSI6CiAgICAgICAgICAgIHJldHVybiAiLk5hTiI7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKE51bWJlci5QT1NJVElWRV9JTkZJTklUWSA9PT0gb2JqZWN0KSB7CiAgICAgICAgc3dpdGNoIChzdHlsZSkgewogICAgICAgICAgY2FzZSAibG93ZXJjYXNlIjoKICAgICAgICAgICAgcmV0dXJuICIuaW5mIjsKICAgICAgICAgIGNhc2UgInVwcGVyY2FzZSI6CiAgICAgICAgICAgIHJldHVybiAiLklORiI7CiAgICAgICAgICBjYXNlICJjYW1lbGNhc2UiOgogICAgICAgICAgICByZXR1cm4gIi5JbmYiOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgPT09IG9iamVjdCkgewogICAgICAgIHN3aXRjaCAoc3R5bGUpIHsKICAgICAgICAgIGNhc2UgImxvd2VyY2FzZSI6CiAgICAgICAgICAgIHJldHVybiAiLS5pbmYiOwogICAgICAgICAgY2FzZSAidXBwZXJjYXNlIjoKICAgICAgICAgICAgcmV0dXJuICItLklORiI7CiAgICAgICAgICBjYXNlICJjYW1lbGNhc2UiOgogICAgICAgICAgICByZXR1cm4gIi0uSW5mIjsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoY29tbW9uLmlzTmVnYXRpdmVaZXJvKG9iamVjdCkpIHsKICAgICAgICByZXR1cm4gIi0wLjAiOwogICAgICB9CiAgICAgIHJlcyA9IG9iamVjdC50b1N0cmluZygxMCk7CiAgICAgIHJldHVybiBTQ0lFTlRJRklDX1dJVEhPVVRfRE9ULnRlc3QocmVzKSA/IHJlcy5yZXBsYWNlKCJlIiwgIi5lIikgOiByZXM7CiAgICB9CiAgICBfX25hbWUocmVwcmVzZW50WWFtbEZsb2F0LCAicmVwcmVzZW50WWFtbEZsb2F0Iik7CiAgICBmdW5jdGlvbiBpc0Zsb2F0KG9iamVjdCkgewogICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkgPT09ICJbb2JqZWN0IE51bWJlcl0iICYmIChvYmplY3QgJSAxICE9PSAwIHx8IGNvbW1vbi5pc05lZ2F0aXZlWmVybyhvYmplY3QpKTsKICAgIH0KICAgIF9fbmFtZShpc0Zsb2F0LCAiaXNGbG9hdCIpOwogICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgidGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQiLCB7CiAgICAgIGtpbmQ6ICJzY2FsYXIiLAogICAgICByZXNvbHZlOiByZXNvbHZlWWFtbEZsb2F0LAogICAgICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxGbG9hdCwKICAgICAgcHJlZGljYXRlOiBpc0Zsb2F0LAogICAgICByZXByZXNlbnQ6IHJlcHJlc2VudFlhbWxGbG9hdCwKICAgICAgZGVmYXVsdFN0eWxlOiAibG93ZXJjYXNlIgogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvanNvbi5qcwp2YXIgcmVxdWlyZV9qc29uID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvanNvbi5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgU2NoZW1hMiA9IHJlcXVpcmVfc2NoZW1hKCk7CiAgICBtb2R1bGUuZXhwb3J0cyA9IG5ldyBTY2hlbWEyKHsKICAgICAgaW5jbHVkZTogWwogICAgICAgIHJlcXVpcmVfZmFpbHNhZmUoKQogICAgICBdLAogICAgICBpbXBsaWNpdDogWwogICAgICAgIHJlcXVpcmVfbnVsbCgpLAogICAgICAgIHJlcXVpcmVfYm9vbCgpLAogICAgICAgIHJlcXVpcmVfaW50KCksCiAgICAgICAgcmVxdWlyZV9mbG9hdCgpCiAgICAgIF0KICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hL2NvcmUuanMKdmFyIHJlcXVpcmVfY29yZSA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hL2NvcmUuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIFNjaGVtYTIgPSByZXF1aXJlX3NjaGVtYSgpOwogICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgU2NoZW1hMih7CiAgICAgIGluY2x1ZGU6IFsKICAgICAgICByZXF1aXJlX2pzb24oKQogICAgICBdCiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvdGltZXN0YW1wLmpzCnZhciByZXF1aXJlX3RpbWVzdGFtcCA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS90aW1lc3RhbXAuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIFR5cGUgPSByZXF1aXJlX3R5cGUoKTsKICAgIHZhciBZQU1MX0RBVEVfUkVHRVhQID0gbmV3IFJlZ0V4cCgKICAgICAgIl4oWzAtOV1bMC05XVswLTldWzAtOV0pLShbMC05XVswLTldKS0oWzAtOV1bMC05XSkkIgogICAgKTsKICAgIHZhciBZQU1MX1RJTUVTVEFNUF9SRUdFWFAgPSBuZXcgUmVnRXhwKAogICAgICAiXihbMC05XVswLTldWzAtOV1bMC05XSktKFswLTldWzAtOV0/KS0oWzAtOV1bMC05XT8pKD86W1R0XXxbIFxcdF0rKShbMC05XVswLTldPyk6KFswLTldWzAtOV0pOihbMC05XVswLTldKSg/OlxcLihbMC05XSopKT8oPzpbIFxcdF0qKFp8KFstK10pKFswLTldWzAtOV0/KSg/OjooWzAtOV1bMC05XSkpPykpPyQiCiAgICApOwogICAgZnVuY3Rpb24gcmVzb2x2ZVlhbWxUaW1lc3RhbXAoZGF0YSkgewogICAgICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgICBpZiAoWUFNTF9EQVRFX1JFR0VYUC5leGVjKGRhdGEpICE9PSBudWxsKSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKFlBTUxfVElNRVNUQU1QX1JFR0VYUC5leGVjKGRhdGEpICE9PSBudWxsKSByZXR1cm4gdHJ1ZTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgX19uYW1lKHJlc29sdmVZYW1sVGltZXN0YW1wLCAicmVzb2x2ZVlhbWxUaW1lc3RhbXAiKTsKICAgIGZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxUaW1lc3RhbXAoZGF0YSkgewogICAgICB2YXIgbWF0Y2gyLCB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgZnJhY3Rpb24gPSAwLCBkZWx0YSA9IG51bGwsIHR6X2hvdXIsIHR6X21pbnV0ZSwgZGF0ZTsKICAgICAgbWF0Y2gyID0gWUFNTF9EQVRFX1JFR0VYUC5leGVjKGRhdGEpOwogICAgICBpZiAobWF0Y2gyID09PSBudWxsKSBtYXRjaDIgPSBZQU1MX1RJTUVTVEFNUF9SRUdFWFAuZXhlYyhkYXRhKTsKICAgICAgaWYgKG1hdGNoMiA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCJEYXRlIHJlc29sdmUgZXJyb3IiKTsKICAgICAgeWVhciA9ICttYXRjaDJbMV07CiAgICAgIG1vbnRoID0gK21hdGNoMlsyXSAtIDE7CiAgICAgIGRheSA9ICttYXRjaDJbM107CiAgICAgIGlmICghbWF0Y2gyWzRdKSB7CiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKHllYXIsIG1vbnRoLCBkYXkpKTsKICAgICAgfQogICAgICBob3VyID0gK21hdGNoMls0XTsKICAgICAgbWludXRlID0gK21hdGNoMls1XTsKICAgICAgc2Vjb25kID0gK21hdGNoMls2XTsKICAgICAgaWYgKG1hdGNoMls3XSkgewogICAgICAgIGZyYWN0aW9uID0gbWF0Y2gyWzddLnNsaWNlKDAsIDMpOwogICAgICAgIHdoaWxlIChmcmFjdGlvbi5sZW5ndGggPCAzKSB7CiAgICAgICAgICBmcmFjdGlvbiArPSAiMCI7CiAgICAgICAgfQogICAgICAgIGZyYWN0aW9uID0gK2ZyYWN0aW9uOwogICAgICB9CiAgICAgIGlmIChtYXRjaDJbOV0pIHsKICAgICAgICB0el9ob3VyID0gK21hdGNoMlsxMF07CiAgICAgICAgdHpfbWludXRlID0gKyhtYXRjaDJbMTFdIHx8IDApOwogICAgICAgIGRlbHRhID0gKHR6X2hvdXIgKiA2MCArIHR6X21pbnV0ZSkgKiA2ZTQ7CiAgICAgICAgaWYgKG1hdGNoMls5XSA9PT0gIi0iKSBkZWx0YSA9IC1kZWx0YTsKICAgICAgfQogICAgICBkYXRlID0gbmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIGZyYWN0aW9uKSk7CiAgICAgIGlmIChkZWx0YSkgZGF0ZS5zZXRUaW1lKGRhdGUuZ2V0VGltZSgpIC0gZGVsdGEpOwogICAgICByZXR1cm4gZGF0ZTsKICAgIH0KICAgIF9fbmFtZShjb25zdHJ1Y3RZYW1sVGltZXN0YW1wLCAiY29uc3RydWN0WWFtbFRpbWVzdGFtcCIpOwogICAgZnVuY3Rpb24gcmVwcmVzZW50WWFtbFRpbWVzdGFtcChvYmplY3QpIHsKICAgICAgcmV0dXJuIG9iamVjdC50b0lTT1N0cmluZygpOwogICAgfQogICAgX19uYW1lKHJlcHJlc2VudFlhbWxUaW1lc3RhbXAsICJyZXByZXNlbnRZYW1sVGltZXN0YW1wIik7CiAgICBtb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCJ0YWc6eWFtbC5vcmcsMjAwMjp0aW1lc3RhbXAiLCB7CiAgICAgIGtpbmQ6ICJzY2FsYXIiLAogICAgICByZXNvbHZlOiByZXNvbHZlWWFtbFRpbWVzdGFtcCwKICAgICAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sVGltZXN0YW1wLAogICAgICBpbnN0YW5jZU9mOiBEYXRlLAogICAgICByZXByZXNlbnQ6IHJlcHJlc2VudFlhbWxUaW1lc3RhbXAKICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9tZXJnZS5qcwp2YXIgcmVxdWlyZV9tZXJnZSA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9tZXJnZS5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgVHlwZSA9IHJlcXVpcmVfdHlwZSgpOwogICAgZnVuY3Rpb24gcmVzb2x2ZVlhbWxNZXJnZShkYXRhKSB7CiAgICAgIHJldHVybiBkYXRhID09PSAiPDwiIHx8IGRhdGEgPT09IG51bGw7CiAgICB9CiAgICBfX25hbWUocmVzb2x2ZVlhbWxNZXJnZSwgInJlc29sdmVZYW1sTWVyZ2UiKTsKICAgIG1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoInRhZzp5YW1sLm9yZywyMDAyOm1lcmdlIiwgewogICAgICBraW5kOiAic2NhbGFyIiwKICAgICAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxNZXJnZQogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2JpbmFyeS5qcwp2YXIgcmVxdWlyZV9iaW5hcnkgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvYmluYXJ5LmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBOb2RlQnVmZmVyOwogICAgdHJ5IHsKICAgICAgX3JlcXVpcmUgPSBfX3JlcXVpcmU7CiAgICAgIE5vZGVCdWZmZXIgPSBfcmVxdWlyZSgiYnVmZmVyIikuQnVmZmVyOwogICAgfSBjYXRjaCAoX18pIHsKICAgIH0KICAgIHZhciBUeXBlID0gcmVxdWlyZV90eXBlKCk7CiAgICB2YXIgQkFTRTY0X01BUCA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPVxuXHIiOwogICAgZnVuY3Rpb24gcmVzb2x2ZVlhbWxCaW5hcnkoZGF0YSkgewogICAgICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgICB2YXIgY29kZTQsIGlkeCwgYml0bGVuID0gMCwgbWF4MyA9IGRhdGEubGVuZ3RoLCBtYXA3ID0gQkFTRTY0X01BUDsKICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBtYXgzOyBpZHgrKykgewogICAgICAgIGNvZGU0ID0gbWFwNy5pbmRleE9mKGRhdGEuY2hhckF0KGlkeCkpOwogICAgICAgIGlmIChjb2RlNCA+IDY0KSBjb250aW51ZTsKICAgICAgICBpZiAoY29kZTQgPCAwKSByZXR1cm4gZmFsc2U7CiAgICAgICAgYml0bGVuICs9IDY7CiAgICAgIH0KICAgICAgcmV0dXJuIGJpdGxlbiAlIDggPT09IDA7CiAgICB9CiAgICBfX25hbWUocmVzb2x2ZVlhbWxCaW5hcnksICJyZXNvbHZlWWFtbEJpbmFyeSIpOwogICAgZnVuY3Rpb24gY29uc3RydWN0WWFtbEJpbmFyeShkYXRhKSB7CiAgICAgIHZhciBpZHgsIHRhaWxiaXRzLCBpbnB1dCA9IGRhdGEucmVwbGFjZSgvW1xyXG49XS9nLCAiIiksIG1heDMgPSBpbnB1dC5sZW5ndGgsIG1hcDcgPSBCQVNFNjRfTUFQLCBiaXRzID0gMCwgcmVzdWx0ID0gW107CiAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgbWF4MzsgaWR4KyspIHsKICAgICAgICBpZiAoaWR4ICUgNCA9PT0gMCAmJiBpZHgpIHsKICAgICAgICAgIHJlc3VsdC5wdXNoKGJpdHMgPj4gMTYgJiAyNTUpOwogICAgICAgICAgcmVzdWx0LnB1c2goYml0cyA+PiA4ICYgMjU1KTsKICAgICAgICAgIHJlc3VsdC5wdXNoKGJpdHMgJiAyNTUpOwogICAgICAgIH0KICAgICAgICBiaXRzID0gYml0cyA8PCA2IHwgbWFwNy5pbmRleE9mKGlucHV0LmNoYXJBdChpZHgpKTsKICAgICAgfQogICAgICB0YWlsYml0cyA9IG1heDMgJSA0ICogNjsKICAgICAgaWYgKHRhaWxiaXRzID09PSAwKSB7CiAgICAgICAgcmVzdWx0LnB1c2goYml0cyA+PiAxNiAmIDI1NSk7CiAgICAgICAgcmVzdWx0LnB1c2goYml0cyA+PiA4ICYgMjU1KTsKICAgICAgICByZXN1bHQucHVzaChiaXRzICYgMjU1KTsKICAgICAgfSBlbHNlIGlmICh0YWlsYml0cyA9PT0gMTgpIHsKICAgICAgICByZXN1bHQucHVzaChiaXRzID4+IDEwICYgMjU1KTsKICAgICAgICByZXN1bHQucHVzaChiaXRzID4+IDIgJiAyNTUpOwogICAgICB9IGVsc2UgaWYgKHRhaWxiaXRzID09PSAxMikgewogICAgICAgIHJlc3VsdC5wdXNoKGJpdHMgPj4gNCAmIDI1NSk7CiAgICAgIH0KICAgICAgaWYgKE5vZGVCdWZmZXIpIHsKICAgICAgICByZXR1cm4gTm9kZUJ1ZmZlci5mcm9tID8gTm9kZUJ1ZmZlci5mcm9tKHJlc3VsdCkgOiBuZXcgTm9kZUJ1ZmZlcihyZXN1bHQpOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBfX25hbWUoY29uc3RydWN0WWFtbEJpbmFyeSwgImNvbnN0cnVjdFlhbWxCaW5hcnkiKTsKICAgIGZ1bmN0aW9uIHJlcHJlc2VudFlhbWxCaW5hcnkob2JqZWN0KSB7CiAgICAgIHZhciByZXN1bHQgPSAiIiwgYml0cyA9IDAsIGlkeCwgdGFpbCwgbWF4MyA9IG9iamVjdC5sZW5ndGgsIG1hcDcgPSBCQVNFNjRfTUFQOwogICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IG1heDM7IGlkeCsrKSB7CiAgICAgICAgaWYgKGlkeCAlIDMgPT09IDAgJiYgaWR4KSB7CiAgICAgICAgICByZXN1bHQgKz0gbWFwN1tiaXRzID4+IDE4ICYgNjNdOwogICAgICAgICAgcmVzdWx0ICs9IG1hcDdbYml0cyA+PiAxMiAmIDYzXTsKICAgICAgICAgIHJlc3VsdCArPSBtYXA3W2JpdHMgPj4gNiAmIDYzXTsKICAgICAgICAgIHJlc3VsdCArPSBtYXA3W2JpdHMgJiA2M107CiAgICAgICAgfQogICAgICAgIGJpdHMgPSAoYml0cyA8PCA4KSArIG9iamVjdFtpZHhdOwogICAgICB9CiAgICAgIHRhaWwgPSBtYXgzICUgMzsKICAgICAgaWYgKHRhaWwgPT09IDApIHsKICAgICAgICByZXN1bHQgKz0gbWFwN1tiaXRzID4+IDE4ICYgNjNdOwogICAgICAgIHJlc3VsdCArPSBtYXA3W2JpdHMgPj4gMTIgJiA2M107CiAgICAgICAgcmVzdWx0ICs9IG1hcDdbYml0cyA+PiA2ICYgNjNdOwogICAgICAgIHJlc3VsdCArPSBtYXA3W2JpdHMgJiA2M107CiAgICAgIH0gZWxzZSBpZiAodGFpbCA9PT0gMikgewogICAgICAgIHJlc3VsdCArPSBtYXA3W2JpdHMgPj4gMTAgJiA2M107CiAgICAgICAgcmVzdWx0ICs9IG1hcDdbYml0cyA+PiA0ICYgNjNdOwogICAgICAgIHJlc3VsdCArPSBtYXA3W2JpdHMgPDwgMiAmIDYzXTsKICAgICAgICByZXN1bHQgKz0gbWFwN1s2NF07CiAgICAgIH0gZWxzZSBpZiAodGFpbCA9PT0gMSkgewogICAgICAgIHJlc3VsdCArPSBtYXA3W2JpdHMgPj4gMiAmIDYzXTsKICAgICAgICByZXN1bHQgKz0gbWFwN1tiaXRzIDw8IDQgJiA2M107CiAgICAgICAgcmVzdWx0ICs9IG1hcDdbNjRdOwogICAgICAgIHJlc3VsdCArPSBtYXA3WzY0XTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgX19uYW1lKHJlcHJlc2VudFlhbWxCaW5hcnksICJyZXByZXNlbnRZYW1sQmluYXJ5Iik7CiAgICBmdW5jdGlvbiBpc0JpbmFyeShvYmplY3QpIHsKICAgICAgcmV0dXJuIE5vZGVCdWZmZXIgJiYgTm9kZUJ1ZmZlci5pc0J1ZmZlcihvYmplY3QpOwogICAgfQogICAgX19uYW1lKGlzQmluYXJ5LCAiaXNCaW5hcnkiKTsKICAgIG1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoInRhZzp5YW1sLm9yZywyMDAyOmJpbmFyeSIsIHsKICAgICAga2luZDogInNjYWxhciIsCiAgICAgIHJlc29sdmU6IHJlc29sdmVZYW1sQmluYXJ5LAogICAgICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxCaW5hcnksCiAgICAgIHByZWRpY2F0ZTogaXNCaW5hcnksCiAgICAgIHJlcHJlc2VudDogcmVwcmVzZW50WWFtbEJpbmFyeQogICAgfSk7CiAgICB2YXIgX3JlcXVpcmU7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL29tYXAuanMKdmFyIHJlcXVpcmVfb21hcCA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9vbWFwLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBUeXBlID0gcmVxdWlyZV90eXBlKCk7CiAgICB2YXIgX2hhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTsKICAgIHZhciBfdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nOwogICAgZnVuY3Rpb24gcmVzb2x2ZVlhbWxPbWFwKGRhdGEpIHsKICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiB0cnVlOwogICAgICB2YXIgb2JqZWN0S2V5cyA9IFtdLCBpbmRleDIsIGxlbmd0aCwgcGFpciwgcGFpcktleSwgcGFpckhhc0tleSwgb2JqZWN0ID0gZGF0YTsKICAgICAgZm9yIChpbmRleDIgPSAwLCBsZW5ndGggPSBvYmplY3QubGVuZ3RoOyBpbmRleDIgPCBsZW5ndGg7IGluZGV4MiArPSAxKSB7CiAgICAgICAgcGFpciA9IG9iamVjdFtpbmRleDJdOwogICAgICAgIHBhaXJIYXNLZXkgPSBmYWxzZTsKICAgICAgICBpZiAoX3RvU3RyaW5nLmNhbGwocGFpcikgIT09ICJbb2JqZWN0IE9iamVjdF0iKSByZXR1cm4gZmFsc2U7CiAgICAgICAgZm9yIChwYWlyS2V5IGluIHBhaXIpIHsKICAgICAgICAgIGlmIChfaGFzT3duUHJvcGVydHkuY2FsbChwYWlyLCBwYWlyS2V5KSkgewogICAgICAgICAgICBpZiAoIXBhaXJIYXNLZXkpIHBhaXJIYXNLZXkgPSB0cnVlOwogICAgICAgICAgICBlbHNlIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFwYWlySGFzS2V5KSByZXR1cm4gZmFsc2U7CiAgICAgICAgaWYgKG9iamVjdEtleXMuaW5kZXhPZihwYWlyS2V5KSA9PT0gLTEpIG9iamVjdEtleXMucHVzaChwYWlyS2V5KTsKICAgICAgICBlbHNlIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIF9fbmFtZShyZXNvbHZlWWFtbE9tYXAsICJyZXNvbHZlWWFtbE9tYXAiKTsKICAgIGZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxPbWFwKGRhdGEpIHsKICAgICAgcmV0dXJuIGRhdGEgIT09IG51bGwgPyBkYXRhIDogW107CiAgICB9CiAgICBfX25hbWUoY29uc3RydWN0WWFtbE9tYXAsICJjb25zdHJ1Y3RZYW1sT21hcCIpOwogICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgidGFnOnlhbWwub3JnLDIwMDI6b21hcCIsIHsKICAgICAga2luZDogInNlcXVlbmNlIiwKICAgICAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxPbWFwLAogICAgICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxPbWFwCiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvcGFpcnMuanMKdmFyIHJlcXVpcmVfcGFpcnMgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvcGFpcnMuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIFR5cGUgPSByZXF1aXJlX3R5cGUoKTsKICAgIHZhciBfdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nOwogICAgZnVuY3Rpb24gcmVzb2x2ZVlhbWxQYWlycyhkYXRhKSB7CiAgICAgIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gdHJ1ZTsKICAgICAgdmFyIGluZGV4MiwgbGVuZ3RoLCBwYWlyLCBrZXlzMiwgcmVzdWx0LCBvYmplY3QgPSBkYXRhOwogICAgICByZXN1bHQgPSBuZXcgQXJyYXkob2JqZWN0Lmxlbmd0aCk7CiAgICAgIGZvciAoaW5kZXgyID0gMCwgbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aDsgaW5kZXgyIDwgbGVuZ3RoOyBpbmRleDIgKz0gMSkgewogICAgICAgIHBhaXIgPSBvYmplY3RbaW5kZXgyXTsKICAgICAgICBpZiAoX3RvU3RyaW5nLmNhbGwocGFpcikgIT09ICJbb2JqZWN0IE9iamVjdF0iKSByZXR1cm4gZmFsc2U7CiAgICAgICAga2V5czIgPSBPYmplY3Qua2V5cyhwYWlyKTsKICAgICAgICBpZiAoa2V5czIubGVuZ3RoICE9PSAxKSByZXR1cm4gZmFsc2U7CiAgICAgICAgcmVzdWx0W2luZGV4Ml0gPSBba2V5czJbMF0sIHBhaXJba2V5czJbMF1dXTsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIF9fbmFtZShyZXNvbHZlWWFtbFBhaXJzLCAicmVzb2x2ZVlhbWxQYWlycyIpOwogICAgZnVuY3Rpb24gY29uc3RydWN0WWFtbFBhaXJzKGRhdGEpIHsKICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBbXTsKICAgICAgdmFyIGluZGV4MiwgbGVuZ3RoLCBwYWlyLCBrZXlzMiwgcmVzdWx0LCBvYmplY3QgPSBkYXRhOwogICAgICByZXN1bHQgPSBuZXcgQXJyYXkob2JqZWN0Lmxlbmd0aCk7CiAgICAgIGZvciAoaW5kZXgyID0gMCwgbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aDsgaW5kZXgyIDwgbGVuZ3RoOyBpbmRleDIgKz0gMSkgewogICAgICAgIHBhaXIgPSBvYmplY3RbaW5kZXgyXTsKICAgICAgICBrZXlzMiA9IE9iamVjdC5rZXlzKHBhaXIpOwogICAgICAgIHJlc3VsdFtpbmRleDJdID0gW2tleXMyWzBdLCBwYWlyW2tleXMyWzBdXV07CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIF9fbmFtZShjb25zdHJ1Y3RZYW1sUGFpcnMsICJjb25zdHJ1Y3RZYW1sUGFpcnMiKTsKICAgIG1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoInRhZzp5YW1sLm9yZywyMDAyOnBhaXJzIiwgewogICAgICBraW5kOiAic2VxdWVuY2UiLAogICAgICByZXNvbHZlOiByZXNvbHZlWWFtbFBhaXJzLAogICAgICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxQYWlycwogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL3NldC5qcwp2YXIgcmVxdWlyZV9zZXQgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvc2V0LmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBUeXBlID0gcmVxdWlyZV90eXBlKCk7CiAgICB2YXIgX2hhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTsKICAgIGZ1bmN0aW9uIHJlc29sdmVZYW1sU2V0KGRhdGEpIHsKICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiB0cnVlOwogICAgICB2YXIga2V5Miwgb2JqZWN0ID0gZGF0YTsKICAgICAgZm9yIChrZXkyIGluIG9iamVjdCkgewogICAgICAgIGlmIChfaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleTIpKSB7CiAgICAgICAgICBpZiAob2JqZWN0W2tleTJdICE9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgX19uYW1lKHJlc29sdmVZYW1sU2V0LCAicmVzb2x2ZVlhbWxTZXQiKTsKICAgIGZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxTZXQoZGF0YSkgewogICAgICByZXR1cm4gZGF0YSAhPT0gbnVsbCA/IGRhdGEgOiB7fTsKICAgIH0KICAgIF9fbmFtZShjb25zdHJ1Y3RZYW1sU2V0LCAiY29uc3RydWN0WWFtbFNldCIpOwogICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgidGFnOnlhbWwub3JnLDIwMDI6c2V0IiwgewogICAgICBraW5kOiAibWFwcGluZyIsCiAgICAgIHJlc29sdmU6IHJlc29sdmVZYW1sU2V0LAogICAgICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxTZXQKICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hL2RlZmF1bHRfc2FmZS5qcwp2YXIgcmVxdWlyZV9kZWZhdWx0X3NhZmUgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3NjaGVtYS9kZWZhdWx0X3NhZmUuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIFNjaGVtYTIgPSByZXF1aXJlX3NjaGVtYSgpOwogICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgU2NoZW1hMih7CiAgICAgIGluY2x1ZGU6IFsKICAgICAgICByZXF1aXJlX2NvcmUoKQogICAgICBdLAogICAgICBpbXBsaWNpdDogWwogICAgICAgIHJlcXVpcmVfdGltZXN0YW1wKCksCiAgICAgICAgcmVxdWlyZV9tZXJnZSgpCiAgICAgIF0sCiAgICAgIGV4cGxpY2l0OiBbCiAgICAgICAgcmVxdWlyZV9iaW5hcnkoKSwKICAgICAgICByZXF1aXJlX29tYXAoKSwKICAgICAgICByZXF1aXJlX3BhaXJzKCksCiAgICAgICAgcmVxdWlyZV9zZXQoKQogICAgICBdCiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvanMvdW5kZWZpbmVkLmpzCnZhciByZXF1aXJlX3VuZGVmaW5lZCA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9qcy91bmRlZmluZWQuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIFR5cGUgPSByZXF1aXJlX3R5cGUoKTsKICAgIGZ1bmN0aW9uIHJlc29sdmVKYXZhc2NyaXB0VW5kZWZpbmVkKCkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIF9fbmFtZShyZXNvbHZlSmF2YXNjcmlwdFVuZGVmaW5lZCwgInJlc29sdmVKYXZhc2NyaXB0VW5kZWZpbmVkIik7CiAgICBmdW5jdGlvbiBjb25zdHJ1Y3RKYXZhc2NyaXB0VW5kZWZpbmVkKCkgewogICAgICByZXR1cm4gdm9pZCAwOwogICAgfQogICAgX19uYW1lKGNvbnN0cnVjdEphdmFzY3JpcHRVbmRlZmluZWQsICJjb25zdHJ1Y3RKYXZhc2NyaXB0VW5kZWZpbmVkIik7CiAgICBmdW5jdGlvbiByZXByZXNlbnRKYXZhc2NyaXB0VW5kZWZpbmVkKCkgewogICAgICByZXR1cm4gIiI7CiAgICB9CiAgICBfX25hbWUocmVwcmVzZW50SmF2YXNjcmlwdFVuZGVmaW5lZCwgInJlcHJlc2VudEphdmFzY3JpcHRVbmRlZmluZWQiKTsKICAgIGZ1bmN0aW9uIGlzVW5kZWZpbmVkKG9iamVjdCkgewogICAgICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gInVuZGVmaW5lZCI7CiAgICB9CiAgICBfX25hbWUoaXNVbmRlZmluZWQsICJpc1VuZGVmaW5lZCIpOwogICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgidGFnOnlhbWwub3JnLDIwMDI6anMvdW5kZWZpbmVkIiwgewogICAgICBraW5kOiAic2NhbGFyIiwKICAgICAgcmVzb2x2ZTogcmVzb2x2ZUphdmFzY3JpcHRVbmRlZmluZWQsCiAgICAgIGNvbnN0cnVjdDogY29uc3RydWN0SmF2YXNjcmlwdFVuZGVmaW5lZCwKICAgICAgcHJlZGljYXRlOiBpc1VuZGVmaW5lZCwKICAgICAgcmVwcmVzZW50OiByZXByZXNlbnRKYXZhc2NyaXB0VW5kZWZpbmVkCiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvanMvcmVnZXhwLmpzCnZhciByZXF1aXJlX3JlZ2V4cCA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9qcy9yZWdleHAuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIFR5cGUgPSByZXF1aXJlX3R5cGUoKTsKICAgIGZ1bmN0aW9uIHJlc29sdmVKYXZhc2NyaXB0UmVnRXhwKGRhdGEpIHsKICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTsKICAgICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7CiAgICAgIHZhciByZWdleHAgPSBkYXRhLCB0YWlsID0gL1wvKFtnaW1dKikkLy5leGVjKGRhdGEpLCBtb2RpZmllcnMgPSAiIjsKICAgICAgaWYgKHJlZ2V4cFswXSA9PT0gIi8iKSB7CiAgICAgICAgaWYgKHRhaWwpIG1vZGlmaWVycyA9IHRhaWxbMV07CiAgICAgICAgaWYgKG1vZGlmaWVycy5sZW5ndGggPiAzKSByZXR1cm4gZmFsc2U7CiAgICAgICAgaWYgKHJlZ2V4cFtyZWdleHAubGVuZ3RoIC0gbW9kaWZpZXJzLmxlbmd0aCAtIDFdICE9PSAiLyIpIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIF9fbmFtZShyZXNvbHZlSmF2YXNjcmlwdFJlZ0V4cCwgInJlc29sdmVKYXZhc2NyaXB0UmVnRXhwIik7CiAgICBmdW5jdGlvbiBjb25zdHJ1Y3RKYXZhc2NyaXB0UmVnRXhwKGRhdGEpIHsKICAgICAgdmFyIHJlZ2V4cCA9IGRhdGEsIHRhaWwgPSAvXC8oW2dpbV0qKSQvLmV4ZWMoZGF0YSksIG1vZGlmaWVycyA9ICIiOwogICAgICBpZiAocmVnZXhwWzBdID09PSAiLyIpIHsKICAgICAgICBpZiAodGFpbCkgbW9kaWZpZXJzID0gdGFpbFsxXTsKICAgICAgICByZWdleHAgPSByZWdleHAuc2xpY2UoMSwgcmVnZXhwLmxlbmd0aCAtIG1vZGlmaWVycy5sZW5ndGggLSAxKTsKICAgICAgfQogICAgICByZXR1cm4gbmV3IFJlZ0V4cChyZWdleHAsIG1vZGlmaWVycyk7CiAgICB9CiAgICBfX25hbWUoY29uc3RydWN0SmF2YXNjcmlwdFJlZ0V4cCwgImNvbnN0cnVjdEphdmFzY3JpcHRSZWdFeHAiKTsKICAgIGZ1bmN0aW9uIHJlcHJlc2VudEphdmFzY3JpcHRSZWdFeHAob2JqZWN0KSB7CiAgICAgIHZhciByZXN1bHQgPSAiLyIgKyBvYmplY3Quc291cmNlICsgIi8iOwogICAgICBpZiAob2JqZWN0Lmdsb2JhbCkgcmVzdWx0ICs9ICJnIjsKICAgICAgaWYgKG9iamVjdC5tdWx0aWxpbmUpIHJlc3VsdCArPSAibSI7CiAgICAgIGlmIChvYmplY3QuaWdub3JlQ2FzZSkgcmVzdWx0ICs9ICJpIjsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIF9fbmFtZShyZXByZXNlbnRKYXZhc2NyaXB0UmVnRXhwLCAicmVwcmVzZW50SmF2YXNjcmlwdFJlZ0V4cCIpOwogICAgZnVuY3Rpb24gaXNSZWdFeHAob2JqZWN0KSB7CiAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PT0gIltvYmplY3QgUmVnRXhwXSI7CiAgICB9CiAgICBfX25hbWUoaXNSZWdFeHAsICJpc1JlZ0V4cCIpOwogICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgidGFnOnlhbWwub3JnLDIwMDI6anMvcmVnZXhwIiwgewogICAgICBraW5kOiAic2NhbGFyIiwKICAgICAgcmVzb2x2ZTogcmVzb2x2ZUphdmFzY3JpcHRSZWdFeHAsCiAgICAgIGNvbnN0cnVjdDogY29uc3RydWN0SmF2YXNjcmlwdFJlZ0V4cCwKICAgICAgcHJlZGljYXRlOiBpc1JlZ0V4cCwKICAgICAgcmVwcmVzZW50OiByZXByZXNlbnRKYXZhc2NyaXB0UmVnRXhwCiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvanMvZnVuY3Rpb24uanMKdmFyIHJlcXVpcmVfZnVuY3Rpb24gPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvanMvZnVuY3Rpb24uanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIGVzcHJpbWE7CiAgICB0cnkgewogICAgICBfcmVxdWlyZSA9IF9fcmVxdWlyZTsKICAgICAgZXNwcmltYSA9IF9yZXF1aXJlKCJlc3ByaW1hIik7CiAgICB9IGNhdGNoIChfMykgewogICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gInVuZGVmaW5lZCIpIGVzcHJpbWEgPSB3aW5kb3cuZXNwcmltYTsKICAgIH0KICAgIHZhciBUeXBlID0gcmVxdWlyZV90eXBlKCk7CiAgICBmdW5jdGlvbiByZXNvbHZlSmF2YXNjcmlwdEZ1bmN0aW9uKGRhdGEpIHsKICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgc291cmNlID0gIigiICsgZGF0YSArICIpIiwgYXN0ID0gZXNwcmltYS5wYXJzZShzb3VyY2UsIHsgcmFuZ2U6IHRydWUgfSk7CiAgICAgICAgaWYgKGFzdC50eXBlICE9PSAiUHJvZ3JhbSIgfHwgYXN0LmJvZHkubGVuZ3RoICE9PSAxIHx8IGFzdC5ib2R5WzBdLnR5cGUgIT09ICJFeHByZXNzaW9uU3RhdGVtZW50IiB8fCBhc3QuYm9keVswXS5leHByZXNzaW9uLnR5cGUgIT09ICJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbiIgJiYgYXN0LmJvZHlbMF0uZXhwcmVzc2lvbi50eXBlICE9PSAiRnVuY3Rpb25FeHByZXNzaW9uIikgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICBfX25hbWUocmVzb2x2ZUphdmFzY3JpcHRGdW5jdGlvbiwgInJlc29sdmVKYXZhc2NyaXB0RnVuY3Rpb24iKTsKICAgIGZ1bmN0aW9uIGNvbnN0cnVjdEphdmFzY3JpcHRGdW5jdGlvbihkYXRhKSB7CiAgICAgIHZhciBzb3VyY2UgPSAiKCIgKyBkYXRhICsgIikiLCBhc3QgPSBlc3ByaW1hLnBhcnNlKHNvdXJjZSwgeyByYW5nZTogdHJ1ZSB9KSwgcGFyYW1zID0gW10sIGJvZHkzOwogICAgICBpZiAoYXN0LnR5cGUgIT09ICJQcm9ncmFtIiB8fCBhc3QuYm9keS5sZW5ndGggIT09IDEgfHwgYXN0LmJvZHlbMF0udHlwZSAhPT0gIkV4cHJlc3Npb25TdGF0ZW1lbnQiIHx8IGFzdC5ib2R5WzBdLmV4cHJlc3Npb24udHlwZSAhPT0gIkFycm93RnVuY3Rpb25FeHByZXNzaW9uIiAmJiBhc3QuYm9keVswXS5leHByZXNzaW9uLnR5cGUgIT09ICJGdW5jdGlvbkV4cHJlc3Npb24iKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJGYWlsZWQgdG8gcmVzb2x2ZSBmdW5jdGlvbiIpOwogICAgICB9CiAgICAgIGFzdC5ib2R5WzBdLmV4cHJlc3Npb24ucGFyYW1zLmZvckVhY2goZnVuY3Rpb24ocGFyYW0pIHsKICAgICAgICBwYXJhbXMucHVzaChwYXJhbS5uYW1lKTsKICAgICAgfSk7CiAgICAgIGJvZHkzID0gYXN0LmJvZHlbMF0uZXhwcmVzc2lvbi5ib2R5LnJhbmdlOwogICAgICBpZiAoYXN0LmJvZHlbMF0uZXhwcmVzc2lvbi5ib2R5LnR5cGUgPT09ICJCbG9ja1N0YXRlbWVudCIpIHsKICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKHBhcmFtcywgc291cmNlLnNsaWNlKGJvZHkzWzBdICsgMSwgYm9keTNbMV0gLSAxKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbihwYXJhbXMsICJyZXR1cm4gIiArIHNvdXJjZS5zbGljZShib2R5M1swXSwgYm9keTNbMV0pKTsKICAgIH0KICAgIF9fbmFtZShjb25zdHJ1Y3RKYXZhc2NyaXB0RnVuY3Rpb24sICJjb25zdHJ1Y3RKYXZhc2NyaXB0RnVuY3Rpb24iKTsKICAgIGZ1bmN0aW9uIHJlcHJlc2VudEphdmFzY3JpcHRGdW5jdGlvbihvYmplY3QpIHsKICAgICAgcmV0dXJuIG9iamVjdC50b1N0cmluZygpOwogICAgfQogICAgX19uYW1lKHJlcHJlc2VudEphdmFzY3JpcHRGdW5jdGlvbiwgInJlcHJlc2VudEphdmFzY3JpcHRGdW5jdGlvbiIpOwogICAgZnVuY3Rpb24gaXNGdW5jdGlvbjIob2JqZWN0KSB7CiAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PT0gIltvYmplY3QgRnVuY3Rpb25dIjsKICAgIH0KICAgIF9fbmFtZShpc0Z1bmN0aW9uMiwgImlzRnVuY3Rpb24iKTsKICAgIG1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoInRhZzp5YW1sLm9yZywyMDAyOmpzL2Z1bmN0aW9uIiwgewogICAgICBraW5kOiAic2NhbGFyIiwKICAgICAgcmVzb2x2ZTogcmVzb2x2ZUphdmFzY3JpcHRGdW5jdGlvbiwKICAgICAgY29uc3RydWN0OiBjb25zdHJ1Y3RKYXZhc2NyaXB0RnVuY3Rpb24sCiAgICAgIHByZWRpY2F0ZTogaXNGdW5jdGlvbjIsCiAgICAgIHJlcHJlc2VudDogcmVwcmVzZW50SmF2YXNjcmlwdEZ1bmN0aW9uCiAgICB9KTsKICAgIHZhciBfcmVxdWlyZTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3NjaGVtYS9kZWZhdWx0X2Z1bGwuanMKdmFyIHJlcXVpcmVfZGVmYXVsdF9mdWxsID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvZGVmYXVsdF9mdWxsLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBTY2hlbWEyID0gcmVxdWlyZV9zY2hlbWEoKTsKICAgIG1vZHVsZS5leHBvcnRzID0gU2NoZW1hMi5ERUZBVUxUID0gbmV3IFNjaGVtYTIoewogICAgICBpbmNsdWRlOiBbCiAgICAgICAgcmVxdWlyZV9kZWZhdWx0X3NhZmUoKQogICAgICBdLAogICAgICBleHBsaWNpdDogWwogICAgICAgIHJlcXVpcmVfdW5kZWZpbmVkKCksCiAgICAgICAgcmVxdWlyZV9yZWdleHAoKSwKICAgICAgICByZXF1aXJlX2Z1bmN0aW9uKCkKICAgICAgXQogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9sb2FkZXIuanMKdmFyIHJlcXVpcmVfbG9hZGVyID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9sb2FkZXIuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIGNvbW1vbiA9IHJlcXVpcmVfY29tbW9uKCk7CiAgICB2YXIgWUFNTEV4Y2VwdGlvbiA9IHJlcXVpcmVfZXhjZXB0aW9uKCk7CiAgICB2YXIgTWFyayA9IHJlcXVpcmVfbWFyaygpOwogICAgdmFyIERFRkFVTFRfU0FGRV9TQ0hFTUEgPSByZXF1aXJlX2RlZmF1bHRfc2FmZSgpOwogICAgdmFyIERFRkFVTFRfRlVMTF9TQ0hFTUEgPSByZXF1aXJlX2RlZmF1bHRfZnVsbCgpOwogICAgdmFyIF9oYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7CiAgICB2YXIgQ09OVEVYVF9GTE9XX0lOID0gMTsKICAgIHZhciBDT05URVhUX0ZMT1dfT1VUID0gMjsKICAgIHZhciBDT05URVhUX0JMT0NLX0lOID0gMzsKICAgIHZhciBDT05URVhUX0JMT0NLX09VVCA9IDQ7CiAgICB2YXIgQ0hPTVBJTkdfQ0xJUCA9IDE7CiAgICB2YXIgQ0hPTVBJTkdfU1RSSVAgPSAyOwogICAgdmFyIENIT01QSU5HX0tFRVAgPSAzOwogICAgdmFyIFBBVFRFUk5fTk9OX1BSSU5UQUJMRSA9IC9bXHgwMC1ceDA4XHgwQlx4MENceDBFLVx4MUZceDdGLVx4ODRceDg2LVx4OUZcdUZGRkVcdUZGRkZdfFtcdUQ4MDAtXHVEQkZGXSg/IVtcdURDMDAtXHVERkZGXSl8KD86W15cdUQ4MDAtXHVEQkZGXXxeKVtcdURDMDAtXHVERkZGXS87CiAgICB2YXIgUEFUVEVSTl9OT05fQVNDSUlfTElORV9CUkVBS1MgPSAvW1x4ODVcdTIwMjhcdTIwMjldLzsKICAgIHZhciBQQVRURVJOX0ZMT1dfSU5ESUNBVE9SUyA9IC9bLFxbXF1ce1x9XS87CiAgICB2YXIgUEFUVEVSTl9UQUdfSEFORExFID0gL14oPzohfCEhfCFbYS16XC1dKyEpJC9pOwogICAgdmFyIFBBVFRFUk5fVEFHX1VSSSA9IC9eKD86IXxbXixcW1xdXHtcfV0pKD86JVswLTlhLWZdezJ9fFswLTlhLXpcLSM7XC9cPzpAJj1cK1wkLF9cLiF+XConXChcKVxbXF1dKSokL2k7CiAgICBmdW5jdGlvbiBfY2xhc3Mob2JqKSB7CiAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKTsKICAgIH0KICAgIF9fbmFtZShfY2xhc3MsICJfY2xhc3MiKTsKICAgIGZ1bmN0aW9uIGlzX0VPTChjMTApIHsKICAgICAgcmV0dXJuIGMxMCA9PT0gMTAgfHwgYzEwID09PSAxMzsKICAgIH0KICAgIF9fbmFtZShpc19FT0wsICJpc19FT0wiKTsKICAgIGZ1bmN0aW9uIGlzX1dISVRFX1NQQUNFKGMxMCkgewogICAgICByZXR1cm4gYzEwID09PSA5IHx8IGMxMCA9PT0gMzI7CiAgICB9CiAgICBfX25hbWUoaXNfV0hJVEVfU1BBQ0UsICJpc19XSElURV9TUEFDRSIpOwogICAgZnVuY3Rpb24gaXNfV1NfT1JfRU9MKGMxMCkgewogICAgICByZXR1cm4gYzEwID09PSA5IHx8IGMxMCA9PT0gMzIgfHwgYzEwID09PSAxMCB8fCBjMTAgPT09IDEzOwogICAgfQogICAgX19uYW1lKGlzX1dTX09SX0VPTCwgImlzX1dTX09SX0VPTCIpOwogICAgZnVuY3Rpb24gaXNfRkxPV19JTkRJQ0FUT1IoYzEwKSB7CiAgICAgIHJldHVybiBjMTAgPT09IDQ0IHx8IGMxMCA9PT0gOTEgfHwgYzEwID09PSA5MyB8fCBjMTAgPT09IDEyMyB8fCBjMTAgPT09IDEyNTsKICAgIH0KICAgIF9fbmFtZShpc19GTE9XX0lORElDQVRPUiwgImlzX0ZMT1dfSU5ESUNBVE9SIik7CiAgICBmdW5jdGlvbiBmcm9tSGV4Q29kZShjMTApIHsKICAgICAgdmFyIGxjOwogICAgICBpZiAoNDggPD0gYzEwICYmIGMxMCA8PSA1NykgewogICAgICAgIHJldHVybiBjMTAgLSA0ODsKICAgICAgfQogICAgICBsYyA9IGMxMCB8IDMyOwogICAgICBpZiAoOTcgPD0gbGMgJiYgbGMgPD0gMTAyKSB7CiAgICAgICAgcmV0dXJuIGxjIC0gOTcgKyAxMDsKICAgICAgfQogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBfX25hbWUoZnJvbUhleENvZGUsICJmcm9tSGV4Q29kZSIpOwogICAgZnVuY3Rpb24gZXNjYXBlZEhleExlbihjMTApIHsKICAgICAgaWYgKGMxMCA9PT0gMTIwKSB7CiAgICAgICAgcmV0dXJuIDI7CiAgICAgIH0KICAgICAgaWYgKGMxMCA9PT0gMTE3KSB7CiAgICAgICAgcmV0dXJuIDQ7CiAgICAgIH0KICAgICAgaWYgKGMxMCA9PT0gODUpIHsKICAgICAgICByZXR1cm4gODsKICAgICAgfQogICAgICByZXR1cm4gMDsKICAgIH0KICAgIF9fbmFtZShlc2NhcGVkSGV4TGVuLCAiZXNjYXBlZEhleExlbiIpOwogICAgZnVuY3Rpb24gZnJvbURlY2ltYWxDb2RlKGMxMCkgewogICAgICBpZiAoNDggPD0gYzEwICYmIGMxMCA8PSA1NykgewogICAgICAgIHJldHVybiBjMTAgLSA0ODsKICAgICAgfQogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBfX25hbWUoZnJvbURlY2ltYWxDb2RlLCAiZnJvbURlY2ltYWxDb2RlIik7CiAgICBmdW5jdGlvbiBzaW1wbGVFc2NhcGVTZXF1ZW5jZShjMTApIHsKICAgICAgcmV0dXJuIGMxMCA9PT0gNDggPyAiXDAiIDogYzEwID09PSA5NyA/ICJceDA3IiA6IGMxMCA9PT0gOTggPyAiXGIiIDogYzEwID09PSAxMTYgPyAiCSIgOiBjMTAgPT09IDkgPyAiCSIgOiBjMTAgPT09IDExMCA/ICJcbiIgOiBjMTAgPT09IDExOCA/ICJcdiIgOiBjMTAgPT09IDEwMiA/ICJcZiIgOiBjMTAgPT09IDExNCA/ICJcciIgOiBjMTAgPT09IDEwMSA/ICJceDFCIiA6IGMxMCA9PT0gMzIgPyAiICIgOiBjMTAgPT09IDM0ID8gJyInIDogYzEwID09PSA0NyA/ICIvIiA6IGMxMCA9PT0gOTIgPyAiXFwiIDogYzEwID09PSA3OCA/ICJceDg1IiA6IGMxMCA9PT0gOTUgPyAiXHhBMCIgOiBjMTAgPT09IDc2ID8gIlx1MjAyOCIgOiBjMTAgPT09IDgwID8gIlx1MjAyOSIgOiAiIjsKICAgIH0KICAgIF9fbmFtZShzaW1wbGVFc2NhcGVTZXF1ZW5jZSwgInNpbXBsZUVzY2FwZVNlcXVlbmNlIik7CiAgICBmdW5jdGlvbiBjaGFyRnJvbUNvZGVwb2ludChjMTApIHsKICAgICAgaWYgKGMxMCA8PSA2NTUzNSkgewogICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGMxMCk7CiAgICAgIH0KICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoCiAgICAgICAgKGMxMCAtIDY1NTM2ID4+IDEwKSArIDU1Mjk2LAogICAgICAgIChjMTAgLSA2NTUzNiAmIDEwMjMpICsgNTYzMjAKICAgICAgKTsKICAgIH0KICAgIF9fbmFtZShjaGFyRnJvbUNvZGVwb2ludCwgImNoYXJGcm9tQ29kZXBvaW50Iik7CiAgICBmdW5jdGlvbiBzZXRQcm9wZXJ0eShvYmplY3QsIGtleTIsIHZhbHVlMikgewogICAgICBpZiAoa2V5MiA9PT0gIl9fcHJvdG9fXyIpIHsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBrZXkyLCB7CiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgd3JpdGFibGU6IHRydWUsCiAgICAgICAgICB2YWx1ZTogdmFsdWUyCiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgb2JqZWN0W2tleTJdID0gdmFsdWUyOwogICAgICB9CiAgICB9CiAgICBfX25hbWUoc2V0UHJvcGVydHksICJzZXRQcm9wZXJ0eSIpOwogICAgdmFyIHNpbXBsZUVzY2FwZUNoZWNrID0gbmV3IEFycmF5KDI1Nik7CiAgICB2YXIgc2ltcGxlRXNjYXBlTWFwID0gbmV3IEFycmF5KDI1Nik7CiAgICBmb3IgKGkxMCA9IDA7IGkxMCA8IDI1NjsgaTEwKyspIHsKICAgICAgc2ltcGxlRXNjYXBlQ2hlY2tbaTEwXSA9IHNpbXBsZUVzY2FwZVNlcXVlbmNlKGkxMCkgPyAxIDogMDsKICAgICAgc2ltcGxlRXNjYXBlTWFwW2kxMF0gPSBzaW1wbGVFc2NhcGVTZXF1ZW5jZShpMTApOwogICAgfQogICAgZnVuY3Rpb24gU3RhdGUoaW5wdXQsIG9wdGlvbnMpIHsKICAgICAgdGhpcy5pbnB1dCA9IGlucHV0OwogICAgICB0aGlzLmZpbGVuYW1lID0gb3B0aW9uc1siZmlsZW5hbWUiXSB8fCBudWxsOwogICAgICB0aGlzLnNjaGVtYSA9IG9wdGlvbnNbInNjaGVtYSJdIHx8IERFRkFVTFRfRlVMTF9TQ0hFTUE7CiAgICAgIHRoaXMub25XYXJuaW5nID0gb3B0aW9uc1sib25XYXJuaW5nIl0gfHwgbnVsbDsKICAgICAgdGhpcy5sZWdhY3kgPSBvcHRpb25zWyJsZWdhY3kiXSB8fCBmYWxzZTsKICAgICAgdGhpcy5qc29uID0gb3B0aW9uc1sianNvbiJdIHx8IGZhbHNlOwogICAgICB0aGlzLmxpc3RlbmVyID0gb3B0aW9uc1sibGlzdGVuZXIiXSB8fCBudWxsOwogICAgICB0aGlzLmltcGxpY2l0VHlwZXMgPSB0aGlzLnNjaGVtYS5jb21waWxlZEltcGxpY2l0OwogICAgICB0aGlzLnR5cGVNYXAgPSB0aGlzLnNjaGVtYS5jb21waWxlZFR5cGVNYXA7CiAgICAgIHRoaXMubGVuZ3RoID0gaW5wdXQubGVuZ3RoOwogICAgICB0aGlzLnBvc2l0aW9uID0gMDsKICAgICAgdGhpcy5saW5lID0gMDsKICAgICAgdGhpcy5saW5lU3RhcnQgPSAwOwogICAgICB0aGlzLmxpbmVJbmRlbnQgPSAwOwogICAgICB0aGlzLmRvY3VtZW50cyA9IFtdOwogICAgfQogICAgX19uYW1lKFN0YXRlLCAiU3RhdGUiKTsKICAgIGZ1bmN0aW9uIGdlbmVyYXRlRXJyb3Ioc3RhdGUsIG1lc3NhZ2UyKSB7CiAgICAgIHJldHVybiBuZXcgWUFNTEV4Y2VwdGlvbigKICAgICAgICBtZXNzYWdlMiwKICAgICAgICBuZXcgTWFyayhzdGF0ZS5maWxlbmFtZSwgc3RhdGUuaW5wdXQsIHN0YXRlLnBvc2l0aW9uLCBzdGF0ZS5saW5lLCBzdGF0ZS5wb3NpdGlvbiAtIHN0YXRlLmxpbmVTdGFydCkKICAgICAgKTsKICAgIH0KICAgIF9fbmFtZShnZW5lcmF0ZUVycm9yLCAiZ2VuZXJhdGVFcnJvciIpOwogICAgZnVuY3Rpb24gdGhyb3dFcnJvcjIoc3RhdGUsIG1lc3NhZ2UyKSB7CiAgICAgIHRocm93IGdlbmVyYXRlRXJyb3Ioc3RhdGUsIG1lc3NhZ2UyKTsKICAgIH0KICAgIF9fbmFtZSh0aHJvd0Vycm9yMiwgInRocm93RXJyb3IiKTsKICAgIGZ1bmN0aW9uIHRocm93V2FybmluZyhzdGF0ZSwgbWVzc2FnZTIpIHsKICAgICAgaWYgKHN0YXRlLm9uV2FybmluZykgewogICAgICAgIHN0YXRlLm9uV2FybmluZy5jYWxsKG51bGwsIGdlbmVyYXRlRXJyb3Ioc3RhdGUsIG1lc3NhZ2UyKSk7CiAgICAgIH0KICAgIH0KICAgIF9fbmFtZSh0aHJvd1dhcm5pbmcsICJ0aHJvd1dhcm5pbmciKTsKICAgIHZhciBkaXJlY3RpdmVIYW5kbGVycyA9IHsKICAgICAgWUFNTDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbiBoYW5kbGVZYW1sRGlyZWN0aXZlKHN0YXRlLCBuYW1lLCBhcmdzKSB7CiAgICAgICAgdmFyIG1hdGNoMiwgbWFqb3IsIG1pbm9yOwogICAgICAgIGlmIChzdGF0ZS52ZXJzaW9uICE9PSBudWxsKSB7CiAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZSwgImR1cGxpY2F0aW9uIG9mICVZQU1MIGRpcmVjdGl2ZSIpOwogICAgICAgIH0KICAgICAgICBpZiAoYXJncy5sZW5ndGggIT09IDEpIHsKICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlLCAiWUFNTCBkaXJlY3RpdmUgYWNjZXB0cyBleGFjdGx5IG9uZSBhcmd1bWVudCIpOwogICAgICAgIH0KICAgICAgICBtYXRjaDIgPSAvXihbMC05XSspXC4oWzAtOV0rKSQvLmV4ZWMoYXJnc1swXSk7CiAgICAgICAgaWYgKG1hdGNoMiA9PT0gbnVsbCkgewogICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJpbGwtZm9ybWVkIGFyZ3VtZW50IG9mIHRoZSBZQU1MIGRpcmVjdGl2ZSIpOwogICAgICAgIH0KICAgICAgICBtYWpvciA9IHBhcnNlSW50KG1hdGNoMlsxXSwgMTApOwogICAgICAgIG1pbm9yID0gcGFyc2VJbnQobWF0Y2gyWzJdLCAxMCk7CiAgICAgICAgaWYgKG1ham9yICE9PSAxKSB7CiAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZSwgInVuYWNjZXB0YWJsZSBZQU1MIHZlcnNpb24gb2YgdGhlIGRvY3VtZW50Iik7CiAgICAgICAgfQogICAgICAgIHN0YXRlLnZlcnNpb24gPSBhcmdzWzBdOwogICAgICAgIHN0YXRlLmNoZWNrTGluZUJyZWFrcyA9IG1pbm9yIDwgMjsKICAgICAgICBpZiAobWlub3IgIT09IDEgJiYgbWlub3IgIT09IDIpIHsKICAgICAgICAgIHRocm93V2FybmluZyhzdGF0ZSwgInVuc3VwcG9ydGVkIFlBTUwgdmVyc2lvbiBvZiB0aGUgZG9jdW1lbnQiKTsKICAgICAgICB9CiAgICAgIH0sICJoYW5kbGVZYW1sRGlyZWN0aXZlIiksCiAgICAgIFRBRzogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbiBoYW5kbGVUYWdEaXJlY3RpdmUoc3RhdGUsIG5hbWUsIGFyZ3MpIHsKICAgICAgICB2YXIgaGFuZGxlMywgcHJlZml4OwogICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPT0gMikgewogICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJUQUcgZGlyZWN0aXZlIGFjY2VwdHMgZXhhY3RseSB0d28gYXJndW1lbnRzIik7CiAgICAgICAgfQogICAgICAgIGhhbmRsZTMgPSBhcmdzWzBdOwogICAgICAgIHByZWZpeCA9IGFyZ3NbMV07CiAgICAgICAgaWYgKCFQQVRURVJOX1RBR19IQU5ETEUudGVzdChoYW5kbGUzKSkgewogICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJpbGwtZm9ybWVkIHRhZyBoYW5kbGUgKGZpcnN0IGFyZ3VtZW50KSBvZiB0aGUgVEFHIGRpcmVjdGl2ZSIpOwogICAgICAgIH0KICAgICAgICBpZiAoX2hhc093blByb3BlcnR5LmNhbGwoc3RhdGUudGFnTWFwLCBoYW5kbGUzKSkgewogICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICd0aGVyZSBpcyBhIHByZXZpb3VzbHkgZGVjbGFyZWQgc3VmZml4IGZvciAiJyArIGhhbmRsZTMgKyAnIiB0YWcgaGFuZGxlJyk7CiAgICAgICAgfQogICAgICAgIGlmICghUEFUVEVSTl9UQUdfVVJJLnRlc3QocHJlZml4KSkgewogICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJpbGwtZm9ybWVkIHRhZyBwcmVmaXggKHNlY29uZCBhcmd1bWVudCkgb2YgdGhlIFRBRyBkaXJlY3RpdmUiKTsKICAgICAgICB9CiAgICAgICAgc3RhdGUudGFnTWFwW2hhbmRsZTNdID0gcHJlZml4OwogICAgICB9LCAiaGFuZGxlVGFnRGlyZWN0aXZlIikKICAgIH07CiAgICBmdW5jdGlvbiBjYXB0dXJlU2VnbWVudChzdGF0ZSwgc3RhcnQsIGVuZCwgY2hlY2tKc29uKSB7CiAgICAgIHZhciBfcG9zaXRpb24sIF9sZW5ndGgsIF9jaGFyYWN0ZXIsIF9yZXN1bHQ7CiAgICAgIGlmIChzdGFydCA8IGVuZCkgewogICAgICAgIF9yZXN1bHQgPSBzdGF0ZS5pbnB1dC5zbGljZShzdGFydCwgZW5kKTsKICAgICAgICBpZiAoY2hlY2tKc29uKSB7CiAgICAgICAgICBmb3IgKF9wb3NpdGlvbiA9IDAsIF9sZW5ndGggPSBfcmVzdWx0Lmxlbmd0aDsgX3Bvc2l0aW9uIDwgX2xlbmd0aDsgX3Bvc2l0aW9uICs9IDEpIHsKICAgICAgICAgICAgX2NoYXJhY3RlciA9IF9yZXN1bHQuY2hhckNvZGVBdChfcG9zaXRpb24pOwogICAgICAgICAgICBpZiAoIShfY2hhcmFjdGVyID09PSA5IHx8IDMyIDw9IF9jaGFyYWN0ZXIgJiYgX2NoYXJhY3RlciA8PSAxMTE0MTExKSkgewogICAgICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlLCAiZXhwZWN0ZWQgdmFsaWQgSlNPTiBjaGFyYWN0ZXIiKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoUEFUVEVSTl9OT05fUFJJTlRBQkxFLnRlc3QoX3Jlc3VsdCkpIHsKICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlLCAidGhlIHN0cmVhbSBjb250YWlucyBub24tcHJpbnRhYmxlIGNoYXJhY3RlcnMiKTsKICAgICAgICB9CiAgICAgICAgc3RhdGUucmVzdWx0ICs9IF9yZXN1bHQ7CiAgICAgIH0KICAgIH0KICAgIF9fbmFtZShjYXB0dXJlU2VnbWVudCwgImNhcHR1cmVTZWdtZW50Iik7CiAgICBmdW5jdGlvbiBtZXJnZU1hcHBpbmdzKHN0YXRlLCBkZXN0aW5hdGlvbiwgc291cmNlLCBvdmVycmlkYWJsZUtleXMpIHsKICAgICAgdmFyIHNvdXJjZUtleXMsIGtleTIsIGluZGV4MiwgcXVhbnRpdHk7CiAgICAgIGlmICghY29tbW9uLmlzT2JqZWN0KHNvdXJjZSkpIHsKICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZSwgImNhbm5vdCBtZXJnZSBtYXBwaW5nczsgdGhlIHByb3ZpZGVkIHNvdXJjZSBvYmplY3QgaXMgdW5hY2NlcHRhYmxlIik7CiAgICAgIH0KICAgICAgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7CiAgICAgIGZvciAoaW5kZXgyID0gMCwgcXVhbnRpdHkgPSBzb3VyY2VLZXlzLmxlbmd0aDsgaW5kZXgyIDwgcXVhbnRpdHk7IGluZGV4MiArPSAxKSB7CiAgICAgICAga2V5MiA9IHNvdXJjZUtleXNbaW5kZXgyXTsKICAgICAgICBpZiAoIV9oYXNPd25Qcm9wZXJ0eS5jYWxsKGRlc3RpbmF0aW9uLCBrZXkyKSkgewogICAgICAgICAgc2V0UHJvcGVydHkoZGVzdGluYXRpb24sIGtleTIsIHNvdXJjZVtrZXkyXSk7CiAgICAgICAgICBvdmVycmlkYWJsZUtleXNba2V5Ml0gPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgX19uYW1lKG1lcmdlTWFwcGluZ3MsICJtZXJnZU1hcHBpbmdzIik7CiAgICBmdW5jdGlvbiBzdG9yZU1hcHBpbmdQYWlyKHN0YXRlLCBfcmVzdWx0LCBvdmVycmlkYWJsZUtleXMsIGtleVRhZywga2V5Tm9kZSwgdmFsdWVOb2RlLCBzdGFydExpbmUsIHN0YXJ0UG9zKSB7CiAgICAgIHZhciBpbmRleDIsIHF1YW50aXR5OwogICAgICBpZiAoQXJyYXkuaXNBcnJheShrZXlOb2RlKSkgewogICAgICAgIGtleU5vZGUgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChrZXlOb2RlKTsKICAgICAgICBmb3IgKGluZGV4MiA9IDAsIHF1YW50aXR5ID0ga2V5Tm9kZS5sZW5ndGg7IGluZGV4MiA8IHF1YW50aXR5OyBpbmRleDIgKz0gMSkgewogICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoa2V5Tm9kZVtpbmRleDJdKSkgewogICAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZSwgIm5lc3RlZCBhcnJheXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW5zaWRlIGtleXMiKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0eXBlb2Yga2V5Tm9kZSA9PT0gIm9iamVjdCIgJiYgX2NsYXNzKGtleU5vZGVbaW5kZXgyXSkgPT09ICJbb2JqZWN0IE9iamVjdF0iKSB7CiAgICAgICAgICAgIGtleU5vZGVbaW5kZXgyXSA9ICJbb2JqZWN0IE9iamVjdF0iOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAodHlwZW9mIGtleU5vZGUgPT09ICJvYmplY3QiICYmIF9jbGFzcyhrZXlOb2RlKSA9PT0gIltvYmplY3QgT2JqZWN0XSIpIHsKICAgICAgICBrZXlOb2RlID0gIltvYmplY3QgT2JqZWN0XSI7CiAgICAgIH0KICAgICAga2V5Tm9kZSA9IFN0cmluZyhrZXlOb2RlKTsKICAgICAgaWYgKF9yZXN1bHQgPT09IG51bGwpIHsKICAgICAgICBfcmVzdWx0ID0ge307CiAgICAgIH0KICAgICAgaWYgKGtleVRhZyA9PT0gInRhZzp5YW1sLm9yZywyMDAyOm1lcmdlIikgewogICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlTm9kZSkpIHsKICAgICAgICAgIGZvciAoaW5kZXgyID0gMCwgcXVhbnRpdHkgPSB2YWx1ZU5vZGUubGVuZ3RoOyBpbmRleDIgPCBxdWFudGl0eTsgaW5kZXgyICs9IDEpIHsKICAgICAgICAgICAgbWVyZ2VNYXBwaW5ncyhzdGF0ZSwgX3Jlc3VsdCwgdmFsdWVOb2RlW2luZGV4Ml0sIG92ZXJyaWRhYmxlS2V5cyk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG1lcmdlTWFwcGluZ3Moc3RhdGUsIF9yZXN1bHQsIHZhbHVlTm9kZSwgb3ZlcnJpZGFibGVLZXlzKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKCFzdGF0ZS5qc29uICYmICFfaGFzT3duUHJvcGVydHkuY2FsbChvdmVycmlkYWJsZUtleXMsIGtleU5vZGUpICYmIF9oYXNPd25Qcm9wZXJ0eS5jYWxsKF9yZXN1bHQsIGtleU5vZGUpKSB7CiAgICAgICAgICBzdGF0ZS5saW5lID0gc3RhcnRMaW5lIHx8IHN0YXRlLmxpbmU7CiAgICAgICAgICBzdGF0ZS5wb3NpdGlvbiA9IHN0YXJ0UG9zIHx8IHN0YXRlLnBvc2l0aW9uOwogICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJkdXBsaWNhdGVkIG1hcHBpbmcga2V5Iik7CiAgICAgICAgfQogICAgICAgIHNldFByb3BlcnR5KF9yZXN1bHQsIGtleU5vZGUsIHZhbHVlTm9kZSk7CiAgICAgICAgZGVsZXRlIG92ZXJyaWRhYmxlS2V5c1trZXlOb2RlXTsKICAgICAgfQogICAgICByZXR1cm4gX3Jlc3VsdDsKICAgIH0KICAgIF9fbmFtZShzdG9yZU1hcHBpbmdQYWlyLCAic3RvcmVNYXBwaW5nUGFpciIpOwogICAgZnVuY3Rpb24gcmVhZExpbmVCcmVhayhzdGF0ZSkgewogICAgICB2YXIgY2g7CiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7CiAgICAgIGlmIChjaCA9PT0gMTApIHsKICAgICAgICBzdGF0ZS5wb3NpdGlvbisrOwogICAgICB9IGVsc2UgaWYgKGNoID09PSAxMykgewogICAgICAgIHN0YXRlLnBvc2l0aW9uKys7CiAgICAgICAgaWYgKHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pID09PSAxMCkgewogICAgICAgICAgc3RhdGUucG9zaXRpb24rKzsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJhIGxpbmUgYnJlYWsgaXMgZXhwZWN0ZWQiKTsKICAgICAgfQogICAgICBzdGF0ZS5saW5lICs9IDE7CiAgICAgIHN0YXRlLmxpbmVTdGFydCA9IHN0YXRlLnBvc2l0aW9uOwogICAgfQogICAgX19uYW1lKHJlYWRMaW5lQnJlYWssICJyZWFkTGluZUJyZWFrIik7CiAgICBmdW5jdGlvbiBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCBhbGxvd0NvbW1lbnRzLCBjaGVja0luZGVudCkgewogICAgICB2YXIgbGluZUJyZWFrcyA9IDAsIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7CiAgICAgIHdoaWxlIChjaCAhPT0gMCkgewogICAgICAgIHdoaWxlIChpc19XSElURV9TUEFDRShjaCkpIHsKICAgICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTsKICAgICAgICB9CiAgICAgICAgaWYgKGFsbG93Q29tbWVudHMgJiYgY2ggPT09IDM1KSB7CiAgICAgICAgICBkbyB7CiAgICAgICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTsKICAgICAgICAgIH0gd2hpbGUgKGNoICE9PSAxMCAmJiBjaCAhPT0gMTMgJiYgY2ggIT09IDApOwogICAgICAgIH0KICAgICAgICBpZiAoaXNfRU9MKGNoKSkgewogICAgICAgICAgcmVhZExpbmVCcmVhayhzdGF0ZSk7CiAgICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pOwogICAgICAgICAgbGluZUJyZWFrcysrOwogICAgICAgICAgc3RhdGUubGluZUluZGVudCA9IDA7CiAgICAgICAgICB3aGlsZSAoY2ggPT09IDMyKSB7CiAgICAgICAgICAgIHN0YXRlLmxpbmVJbmRlbnQrKzsKICAgICAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGNoZWNrSW5kZW50ICE9PSAtMSAmJiBsaW5lQnJlYWtzICE9PSAwICYmIHN0YXRlLmxpbmVJbmRlbnQgPCBjaGVja0luZGVudCkgewogICAgICAgIHRocm93V2FybmluZyhzdGF0ZSwgImRlZmljaWVudCBpbmRlbnRhdGlvbiIpOwogICAgICB9CiAgICAgIHJldHVybiBsaW5lQnJlYWtzOwogICAgfQogICAgX19uYW1lKHNraXBTZXBhcmF0aW9uU3BhY2UsICJza2lwU2VwYXJhdGlvblNwYWNlIik7CiAgICBmdW5jdGlvbiB0ZXN0RG9jdW1lbnRTZXBhcmF0b3Ioc3RhdGUpIHsKICAgICAgdmFyIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uLCBjaDsKICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KF9wb3NpdGlvbik7CiAgICAgIGlmICgoY2ggPT09IDQ1IHx8IGNoID09PSA0NikgJiYgY2ggPT09IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoX3Bvc2l0aW9uICsgMSkgJiYgY2ggPT09IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoX3Bvc2l0aW9uICsgMikpIHsKICAgICAgICBfcG9zaXRpb24gKz0gMzsKICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoX3Bvc2l0aW9uKTsKICAgICAgICBpZiAoY2ggPT09IDAgfHwgaXNfV1NfT1JfRU9MKGNoKSkgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIF9fbmFtZSh0ZXN0RG9jdW1lbnRTZXBhcmF0b3IsICJ0ZXN0RG9jdW1lbnRTZXBhcmF0b3IiKTsKICAgIGZ1bmN0aW9uIHdyaXRlRm9sZGVkTGluZXMoc3RhdGUsIGNvdW50MikgewogICAgICBpZiAoY291bnQyID09PSAxKSB7CiAgICAgICAgc3RhdGUucmVzdWx0ICs9ICIgIjsKICAgICAgfSBlbHNlIGlmIChjb3VudDIgPiAxKSB7CiAgICAgICAgc3RhdGUucmVzdWx0ICs9IGNvbW1vbi5yZXBlYXQoIlxuIiwgY291bnQyIC0gMSk7CiAgICAgIH0KICAgIH0KICAgIF9fbmFtZSh3cml0ZUZvbGRlZExpbmVzLCAid3JpdGVGb2xkZWRMaW5lcyIpOwogICAgZnVuY3Rpb24gcmVhZFBsYWluU2NhbGFyKHN0YXRlLCBub2RlSW5kZW50LCB3aXRoaW5GbG93Q29sbGVjdGlvbikgewogICAgICB2YXIgcHJlY2VkaW5nLCBmb2xsb3dpbmcsIGNhcHR1cmVTdGFydCwgY2FwdHVyZUVuZCwgaGFzUGVuZGluZ0NvbnRlbnQsIF9saW5lLCBfbGluZVN0YXJ0LCBfbGluZUluZGVudCwgX2tpbmQgPSBzdGF0ZS5raW5kLCBfcmVzdWx0ID0gc3RhdGUucmVzdWx0LCBjaDsKICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTsKICAgICAgaWYgKGlzX1dTX09SX0VPTChjaCkgfHwgaXNfRkxPV19JTkRJQ0FUT1IoY2gpIHx8IGNoID09PSAzNSB8fCBjaCA9PT0gMzggfHwgY2ggPT09IDQyIHx8IGNoID09PSAzMyB8fCBjaCA9PT0gMTI0IHx8IGNoID09PSA2MiB8fCBjaCA9PT0gMzkgfHwgY2ggPT09IDM0IHx8IGNoID09PSAzNyB8fCBjaCA9PT0gNjQgfHwgY2ggPT09IDk2KSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGlmIChjaCA9PT0gNjMgfHwgY2ggPT09IDQ1KSB7CiAgICAgICAgZm9sbG93aW5nID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbiArIDEpOwogICAgICAgIGlmIChpc19XU19PUl9FT0woZm9sbG93aW5nKSB8fCB3aXRoaW5GbG93Q29sbGVjdGlvbiAmJiBpc19GTE9XX0lORElDQVRPUihmb2xsb3dpbmcpKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIHN0YXRlLmtpbmQgPSAic2NhbGFyIjsKICAgICAgc3RhdGUucmVzdWx0ID0gIiI7CiAgICAgIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjsKICAgICAgaGFzUGVuZGluZ0NvbnRlbnQgPSBmYWxzZTsKICAgICAgd2hpbGUgKGNoICE9PSAwKSB7CiAgICAgICAgaWYgKGNoID09PSA1OCkgewogICAgICAgICAgZm9sbG93aW5nID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbiArIDEpOwogICAgICAgICAgaWYgKGlzX1dTX09SX0VPTChmb2xsb3dpbmcpIHx8IHdpdGhpbkZsb3dDb2xsZWN0aW9uICYmIGlzX0ZMT1dfSU5ESUNBVE9SKGZvbGxvd2luZykpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMzUpIHsKICAgICAgICAgIHByZWNlZGluZyA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gLSAxKTsKICAgICAgICAgIGlmIChpc19XU19PUl9FT0wocHJlY2VkaW5nKSkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLnBvc2l0aW9uID09PSBzdGF0ZS5saW5lU3RhcnQgJiYgdGVzdERvY3VtZW50U2VwYXJhdG9yKHN0YXRlKSB8fCB3aXRoaW5GbG93Q29sbGVjdGlvbiAmJiBpc19GTE9XX0lORElDQVRPUihjaCkpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0gZWxzZSBpZiAoaXNfRU9MKGNoKSkgewogICAgICAgICAgX2xpbmUgPSBzdGF0ZS5saW5lOwogICAgICAgICAgX2xpbmVTdGFydCA9IHN0YXRlLmxpbmVTdGFydDsKICAgICAgICAgIF9saW5lSW5kZW50ID0gc3RhdGUubGluZUluZGVudDsKICAgICAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIGZhbHNlLCAtMSk7CiAgICAgICAgICBpZiAoc3RhdGUubGluZUluZGVudCA+PSBub2RlSW5kZW50KSB7CiAgICAgICAgICAgIGhhc1BlbmRpbmdDb250ZW50ID0gdHJ1ZTsKICAgICAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdGF0ZS5wb3NpdGlvbiA9IGNhcHR1cmVFbmQ7CiAgICAgICAgICAgIHN0YXRlLmxpbmUgPSBfbGluZTsKICAgICAgICAgICAgc3RhdGUubGluZVN0YXJ0ID0gX2xpbmVTdGFydDsKICAgICAgICAgICAgc3RhdGUubGluZUluZGVudCA9IF9saW5lSW5kZW50OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGhhc1BlbmRpbmdDb250ZW50KSB7CiAgICAgICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBjYXB0dXJlRW5kLCBmYWxzZSk7CiAgICAgICAgICB3cml0ZUZvbGRlZExpbmVzKHN0YXRlLCBzdGF0ZS5saW5lIC0gX2xpbmUpOwogICAgICAgICAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uOwogICAgICAgICAgaGFzUGVuZGluZ0NvbnRlbnQgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKCFpc19XSElURV9TUEFDRShjaCkpIHsKICAgICAgICAgIGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbiArIDE7CiAgICAgICAgfQogICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTsKICAgICAgfQogICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBjYXB0dXJlRW5kLCBmYWxzZSk7CiAgICAgIGlmIChzdGF0ZS5yZXN1bHQpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBzdGF0ZS5raW5kID0gX2tpbmQ7CiAgICAgIHN0YXRlLnJlc3VsdCA9IF9yZXN1bHQ7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIF9fbmFtZShyZWFkUGxhaW5TY2FsYXIsICJyZWFkUGxhaW5TY2FsYXIiKTsKICAgIGZ1bmN0aW9uIHJlYWRTaW5nbGVRdW90ZWRTY2FsYXIoc3RhdGUsIG5vZGVJbmRlbnQpIHsKICAgICAgdmFyIGNoLCBjYXB0dXJlU3RhcnQsIGNhcHR1cmVFbmQ7CiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7CiAgICAgIGlmIChjaCAhPT0gMzkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgc3RhdGUua2luZCA9ICJzY2FsYXIiOwogICAgICBzdGF0ZS5yZXN1bHQgPSAiIjsKICAgICAgc3RhdGUucG9zaXRpb24rKzsKICAgICAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uOwogICAgICB3aGlsZSAoKGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbikpICE9PSAwKSB7CiAgICAgICAgaWYgKGNoID09PSAzOSkgewogICAgICAgICAgY2FwdHVyZVNlZ21lbnQoc3RhdGUsIGNhcHR1cmVTdGFydCwgc3RhdGUucG9zaXRpb24sIHRydWUpOwogICAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOwogICAgICAgICAgaWYgKGNoID09PSAzOSkgewogICAgICAgICAgICBjYXB0dXJlU3RhcnQgPSBzdGF0ZS5wb3NpdGlvbjsKICAgICAgICAgICAgc3RhdGUucG9zaXRpb24rKzsKICAgICAgICAgICAgY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChpc19FT0woY2gpKSB7CiAgICAgICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBjYXB0dXJlRW5kLCB0cnVlKTsKICAgICAgICAgIHdyaXRlRm9sZGVkTGluZXMoc3RhdGUsIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIGZhbHNlLCBub2RlSW5kZW50KSk7CiAgICAgICAgICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247CiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5wb3NpdGlvbiA9PT0gc3RhdGUubGluZVN0YXJ0ICYmIHRlc3REb2N1bWVudFNlcGFyYXRvcihzdGF0ZSkpIHsKICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlLCAidW5leHBlY3RlZCBlbmQgb2YgdGhlIGRvY3VtZW50IHdpdGhpbiBhIHNpbmdsZSBxdW90ZWQgc2NhbGFyIik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN0YXRlLnBvc2l0aW9uKys7CiAgICAgICAgICBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247CiAgICAgICAgfQogICAgICB9CiAgICAgIHRocm93RXJyb3IyKHN0YXRlLCAidW5leHBlY3RlZCBlbmQgb2YgdGhlIHN0cmVhbSB3aXRoaW4gYSBzaW5nbGUgcXVvdGVkIHNjYWxhciIpOwogICAgfQogICAgX19uYW1lKHJlYWRTaW5nbGVRdW90ZWRTY2FsYXIsICJyZWFkU2luZ2xlUXVvdGVkU2NhbGFyIik7CiAgICBmdW5jdGlvbiByZWFkRG91YmxlUXVvdGVkU2NhbGFyKHN0YXRlLCBub2RlSW5kZW50KSB7CiAgICAgIHZhciBjYXB0dXJlU3RhcnQsIGNhcHR1cmVFbmQsIGhleExlbmd0aCwgaGV4UmVzdWx0LCB0bXAsIGNoOwogICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pOwogICAgICBpZiAoY2ggIT09IDM0KSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHN0YXRlLmtpbmQgPSAic2NhbGFyIjsKICAgICAgc3RhdGUucmVzdWx0ID0gIiI7CiAgICAgIHN0YXRlLnBvc2l0aW9uKys7CiAgICAgIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjsKICAgICAgd2hpbGUgKChjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pKSAhPT0gMCkgewogICAgICAgIGlmIChjaCA9PT0gMzQpIHsKICAgICAgICAgIGNhcHR1cmVTZWdtZW50KHN0YXRlLCBjYXB0dXJlU3RhcnQsIHN0YXRlLnBvc2l0aW9uLCB0cnVlKTsKICAgICAgICAgIHN0YXRlLnBvc2l0aW9uKys7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGVsc2UgaWYgKGNoID09PSA5MikgewogICAgICAgICAgY2FwdHVyZVNlZ21lbnQoc3RhdGUsIGNhcHR1cmVTdGFydCwgc3RhdGUucG9zaXRpb24sIHRydWUpOwogICAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOwogICAgICAgICAgaWYgKGlzX0VPTChjaCkpIHsKICAgICAgICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgZmFsc2UsIG5vZGVJbmRlbnQpOwogICAgICAgICAgfSBlbHNlIGlmIChjaCA8IDI1NiAmJiBzaW1wbGVFc2NhcGVDaGVja1tjaF0pIHsKICAgICAgICAgICAgc3RhdGUucmVzdWx0ICs9IHNpbXBsZUVzY2FwZU1hcFtjaF07CiAgICAgICAgICAgIHN0YXRlLnBvc2l0aW9uKys7CiAgICAgICAgICB9IGVsc2UgaWYgKCh0bXAgPSBlc2NhcGVkSGV4TGVuKGNoKSkgPiAwKSB7CiAgICAgICAgICAgIGhleExlbmd0aCA9IHRtcDsKICAgICAgICAgICAgaGV4UmVzdWx0ID0gMDsKICAgICAgICAgICAgZm9yICg7IGhleExlbmd0aCA+IDA7IGhleExlbmd0aC0tKSB7CiAgICAgICAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOwogICAgICAgICAgICAgIGlmICgodG1wID0gZnJvbUhleENvZGUoY2gpKSA+PSAwKSB7CiAgICAgICAgICAgICAgICBoZXhSZXN1bHQgPSAoaGV4UmVzdWx0IDw8IDQpICsgdG1wOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZSwgImV4cGVjdGVkIGhleGFkZWNpbWFsIGNoYXJhY3RlciIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gY2hhckZyb21Db2RlcG9pbnQoaGV4UmVzdWx0KTsKICAgICAgICAgICAgc3RhdGUucG9zaXRpb24rKzsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlLCAidW5rbm93biBlc2NhcGUgc2VxdWVuY2UiKTsKICAgICAgICAgIH0KICAgICAgICAgIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjsKICAgICAgICB9IGVsc2UgaWYgKGlzX0VPTChjaCkpIHsKICAgICAgICAgIGNhcHR1cmVTZWdtZW50KHN0YXRlLCBjYXB0dXJlU3RhcnQsIGNhcHR1cmVFbmQsIHRydWUpOwogICAgICAgICAgd3JpdGVGb2xkZWRMaW5lcyhzdGF0ZSwgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgZmFsc2UsIG5vZGVJbmRlbnQpKTsKICAgICAgICAgIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjsKICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLnBvc2l0aW9uID09PSBzdGF0ZS5saW5lU3RhcnQgJiYgdGVzdERvY3VtZW50U2VwYXJhdG9yKHN0YXRlKSkgewogICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJ1bmV4cGVjdGVkIGVuZCBvZiB0aGUgZG9jdW1lbnQgd2l0aGluIGEgZG91YmxlIHF1b3RlZCBzY2FsYXIiKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RhdGUucG9zaXRpb24rKzsKICAgICAgICAgIGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJ1bmV4cGVjdGVkIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGhpbiBhIGRvdWJsZSBxdW90ZWQgc2NhbGFyIik7CiAgICB9CiAgICBfX25hbWUocmVhZERvdWJsZVF1b3RlZFNjYWxhciwgInJlYWREb3VibGVRdW90ZWRTY2FsYXIiKTsKICAgIGZ1bmN0aW9uIHJlYWRGbG93Q29sbGVjdGlvbihzdGF0ZSwgbm9kZUluZGVudCkgewogICAgICB2YXIgcmVhZE5leHQgPSB0cnVlLCBfbGluZSwgX3RhZyA9IHN0YXRlLnRhZywgX3Jlc3VsdCwgX2FuY2hvciA9IHN0YXRlLmFuY2hvciwgZm9sbG93aW5nLCB0ZXJtaW5hdG9yLCBpc1BhaXIsIGlzRXhwbGljaXRQYWlyLCBpc01hcHBpbmcsIG92ZXJyaWRhYmxlS2V5cyA9IHt9LCBrZXlOb2RlLCBrZXlUYWcsIHZhbHVlTm9kZSwgY2g7CiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7CiAgICAgIGlmIChjaCA9PT0gOTEpIHsKICAgICAgICB0ZXJtaW5hdG9yID0gOTM7CiAgICAgICAgaXNNYXBwaW5nID0gZmFsc2U7CiAgICAgICAgX3Jlc3VsdCA9IFtdOwogICAgICB9IGVsc2UgaWYgKGNoID09PSAxMjMpIHsKICAgICAgICB0ZXJtaW5hdG9yID0gMTI1OwogICAgICAgIGlzTWFwcGluZyA9IHRydWU7CiAgICAgICAgX3Jlc3VsdCA9IHt9OwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBpZiAoc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7CiAgICAgICAgc3RhdGUuYW5jaG9yTWFwW3N0YXRlLmFuY2hvcl0gPSBfcmVzdWx0OwogICAgICB9CiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTsKICAgICAgd2hpbGUgKGNoICE9PSAwKSB7CiAgICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgbm9kZUluZGVudCk7CiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTsKICAgICAgICBpZiAoY2ggPT09IHRlcm1pbmF0b3IpIHsKICAgICAgICAgIHN0YXRlLnBvc2l0aW9uKys7CiAgICAgICAgICBzdGF0ZS50YWcgPSBfdGFnOwogICAgICAgICAgc3RhdGUuYW5jaG9yID0gX2FuY2hvcjsKICAgICAgICAgIHN0YXRlLmtpbmQgPSBpc01hcHBpbmcgPyAibWFwcGluZyIgOiAic2VxdWVuY2UiOwogICAgICAgICAgc3RhdGUucmVzdWx0ID0gX3Jlc3VsdDsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAoIXJlYWROZXh0KSB7CiAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZSwgIm1pc3NlZCBjb21tYSBiZXR3ZWVuIGZsb3cgY29sbGVjdGlvbiBlbnRyaWVzIik7CiAgICAgICAgfQogICAgICAgIGtleVRhZyA9IGtleU5vZGUgPSB2YWx1ZU5vZGUgPSBudWxsOwogICAgICAgIGlzUGFpciA9IGlzRXhwbGljaXRQYWlyID0gZmFsc2U7CiAgICAgICAgaWYgKGNoID09PSA2MykgewogICAgICAgICAgZm9sbG93aW5nID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbiArIDEpOwogICAgICAgICAgaWYgKGlzX1dTX09SX0VPTChmb2xsb3dpbmcpKSB7CiAgICAgICAgICAgIGlzUGFpciA9IGlzRXhwbGljaXRQYWlyID0gdHJ1ZTsKICAgICAgICAgICAgc3RhdGUucG9zaXRpb24rKzsKICAgICAgICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgbm9kZUluZGVudCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIF9saW5lID0gc3RhdGUubGluZTsKICAgICAgICBjb21wb3NlTm9kZShzdGF0ZSwgbm9kZUluZGVudCwgQ09OVEVYVF9GTE9XX0lOLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAga2V5VGFnID0gc3RhdGUudGFnOwogICAgICAgIGtleU5vZGUgPSBzdGF0ZS5yZXN1bHQ7CiAgICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgbm9kZUluZGVudCk7CiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTsKICAgICAgICBpZiAoKGlzRXhwbGljaXRQYWlyIHx8IHN0YXRlLmxpbmUgPT09IF9saW5lKSAmJiBjaCA9PT0gNTgpIHsKICAgICAgICAgIGlzUGFpciA9IHRydWU7CiAgICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7CiAgICAgICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCBub2RlSW5kZW50KTsKICAgICAgICAgIGNvbXBvc2VOb2RlKHN0YXRlLCBub2RlSW5kZW50LCBDT05URVhUX0ZMT1dfSU4sIGZhbHNlLCB0cnVlKTsKICAgICAgICAgIHZhbHVlTm9kZSA9IHN0YXRlLnJlc3VsdDsKICAgICAgICB9CiAgICAgICAgaWYgKGlzTWFwcGluZykgewogICAgICAgICAgc3RvcmVNYXBwaW5nUGFpcihzdGF0ZSwgX3Jlc3VsdCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIHZhbHVlTm9kZSk7CiAgICAgICAgfSBlbHNlIGlmIChpc1BhaXIpIHsKICAgICAgICAgIF9yZXN1bHQucHVzaChzdG9yZU1hcHBpbmdQYWlyKHN0YXRlLCBudWxsLCBvdmVycmlkYWJsZUtleXMsIGtleVRhZywga2V5Tm9kZSwgdmFsdWVOb2RlKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIF9yZXN1bHQucHVzaChrZXlOb2RlKTsKICAgICAgICB9CiAgICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgbm9kZUluZGVudCk7CiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTsKICAgICAgICBpZiAoY2ggPT09IDQ0KSB7CiAgICAgICAgICByZWFkTmV4dCA9IHRydWU7CiAgICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlYWROZXh0ID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRocm93RXJyb3IyKHN0YXRlLCAidW5leHBlY3RlZCBlbmQgb2YgdGhlIHN0cmVhbSB3aXRoaW4gYSBmbG93IGNvbGxlY3Rpb24iKTsKICAgIH0KICAgIF9fbmFtZShyZWFkRmxvd0NvbGxlY3Rpb24sICJyZWFkRmxvd0NvbGxlY3Rpb24iKTsKICAgIGZ1bmN0aW9uIHJlYWRCbG9ja1NjYWxhcihzdGF0ZSwgbm9kZUluZGVudCkgewogICAgICB2YXIgY2FwdHVyZVN0YXJ0LCBmb2xkaW5nLCBjaG9tcGluZyA9IENIT01QSU5HX0NMSVAsIGRpZFJlYWRDb250ZW50ID0gZmFsc2UsIGRldGVjdGVkSW5kZW50ID0gZmFsc2UsIHRleHRJbmRlbnQgPSBub2RlSW5kZW50LCBlbXB0eUxpbmVzID0gMCwgYXRNb3JlSW5kZW50ZWQgPSBmYWxzZSwgdG1wLCBjaDsKICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTsKICAgICAgaWYgKGNoID09PSAxMjQpIHsKICAgICAgICBmb2xkaW5nID0gZmFsc2U7CiAgICAgIH0gZWxzZSBpZiAoY2ggPT09IDYyKSB7CiAgICAgICAgZm9sZGluZyA9IHRydWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHN0YXRlLmtpbmQgPSAic2NhbGFyIjsKICAgICAgc3RhdGUucmVzdWx0ID0gIiI7CiAgICAgIHdoaWxlIChjaCAhPT0gMCkgewogICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTsKICAgICAgICBpZiAoY2ggPT09IDQzIHx8IGNoID09PSA0NSkgewogICAgICAgICAgaWYgKENIT01QSU5HX0NMSVAgPT09IGNob21waW5nKSB7CiAgICAgICAgICAgIGNob21waW5nID0gY2ggPT09IDQzID8gQ0hPTVBJTkdfS0VFUCA6IENIT01QSU5HX1NUUklQOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJyZXBlYXQgb2YgYSBjaG9tcGluZyBtb2RlIGlkZW50aWZpZXIiKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKCh0bXAgPSBmcm9tRGVjaW1hbENvZGUoY2gpKSA+PSAwKSB7CiAgICAgICAgICBpZiAodG1wID09PSAwKSB7CiAgICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlLCAiYmFkIGV4cGxpY2l0IGluZGVudGF0aW9uIHdpZHRoIG9mIGEgYmxvY2sgc2NhbGFyOyBpdCBjYW5ub3QgYmUgbGVzcyB0aGFuIG9uZSIpOwogICAgICAgICAgfSBlbHNlIGlmICghZGV0ZWN0ZWRJbmRlbnQpIHsKICAgICAgICAgICAgdGV4dEluZGVudCA9IG5vZGVJbmRlbnQgKyB0bXAgLSAxOwogICAgICAgICAgICBkZXRlY3RlZEluZGVudCA9IHRydWU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZSwgInJlcGVhdCBvZiBhbiBpbmRlbnRhdGlvbiB3aWR0aCBpZGVudGlmaWVyIik7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoaXNfV0hJVEVfU1BBQ0UoY2gpKSB7CiAgICAgICAgZG8gewogICAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOwogICAgICAgIH0gd2hpbGUgKGlzX1dISVRFX1NQQUNFKGNoKSk7CiAgICAgICAgaWYgKGNoID09PSAzNSkgewogICAgICAgICAgZG8gewogICAgICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7CiAgICAgICAgICB9IHdoaWxlICghaXNfRU9MKGNoKSAmJiBjaCAhPT0gMCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHdoaWxlIChjaCAhPT0gMCkgewogICAgICAgIHJlYWRMaW5lQnJlYWsoc3RhdGUpOwogICAgICAgIHN0YXRlLmxpbmVJbmRlbnQgPSAwOwogICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7CiAgICAgICAgd2hpbGUgKCghZGV0ZWN0ZWRJbmRlbnQgfHwgc3RhdGUubGluZUluZGVudCA8IHRleHRJbmRlbnQpICYmIGNoID09PSAzMikgewogICAgICAgICAgc3RhdGUubGluZUluZGVudCsrOwogICAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOwogICAgICAgIH0KICAgICAgICBpZiAoIWRldGVjdGVkSW5kZW50ICYmIHN0YXRlLmxpbmVJbmRlbnQgPiB0ZXh0SW5kZW50KSB7CiAgICAgICAgICB0ZXh0SW5kZW50ID0gc3RhdGUubGluZUluZGVudDsKICAgICAgICB9CiAgICAgICAgaWYgKGlzX0VPTChjaCkpIHsKICAgICAgICAgIGVtcHR5TGluZXMrKzsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAoc3RhdGUubGluZUluZGVudCA8IHRleHRJbmRlbnQpIHsKICAgICAgICAgIGlmIChjaG9tcGluZyA9PT0gQ0hPTVBJTkdfS0VFUCkgewogICAgICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gY29tbW9uLnJlcGVhdCgiXG4iLCBkaWRSZWFkQ29udGVudCA/IDEgKyBlbXB0eUxpbmVzIDogZW1wdHlMaW5lcyk7CiAgICAgICAgICB9IGVsc2UgaWYgKGNob21waW5nID09PSBDSE9NUElOR19DTElQKSB7CiAgICAgICAgICAgIGlmIChkaWRSZWFkQ29udGVudCkgewogICAgICAgICAgICAgIHN0YXRlLnJlc3VsdCArPSAiXG4iOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKGZvbGRpbmcpIHsKICAgICAgICAgIGlmIChpc19XSElURV9TUEFDRShjaCkpIHsKICAgICAgICAgICAgYXRNb3JlSW5kZW50ZWQgPSB0cnVlOwogICAgICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gY29tbW9uLnJlcGVhdCgiXG4iLCBkaWRSZWFkQ29udGVudCA/IDEgKyBlbXB0eUxpbmVzIDogZW1wdHlMaW5lcyk7CiAgICAgICAgICB9IGVsc2UgaWYgKGF0TW9yZUluZGVudGVkKSB7CiAgICAgICAgICAgIGF0TW9yZUluZGVudGVkID0gZmFsc2U7CiAgICAgICAgICAgIHN0YXRlLnJlc3VsdCArPSBjb21tb24ucmVwZWF0KCJcbiIsIGVtcHR5TGluZXMgKyAxKTsKICAgICAgICAgIH0gZWxzZSBpZiAoZW1wdHlMaW5lcyA9PT0gMCkgewogICAgICAgICAgICBpZiAoZGlkUmVhZENvbnRlbnQpIHsKICAgICAgICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gIiAiOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gY29tbW9uLnJlcGVhdCgiXG4iLCBlbXB0eUxpbmVzKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RhdGUucmVzdWx0ICs9IGNvbW1vbi5yZXBlYXQoIlxuIiwgZGlkUmVhZENvbnRlbnQgPyAxICsgZW1wdHlMaW5lcyA6IGVtcHR5TGluZXMpOwogICAgICAgIH0KICAgICAgICBkaWRSZWFkQ29udGVudCA9IHRydWU7CiAgICAgICAgZGV0ZWN0ZWRJbmRlbnQgPSB0cnVlOwogICAgICAgIGVtcHR5TGluZXMgPSAwOwogICAgICAgIGNhcHR1cmVTdGFydCA9IHN0YXRlLnBvc2l0aW9uOwogICAgICAgIHdoaWxlICghaXNfRU9MKGNoKSAmJiBjaCAhPT0gMCkgewogICAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOwogICAgICAgIH0KICAgICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBzdGF0ZS5wb3NpdGlvbiwgZmFsc2UpOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgX19uYW1lKHJlYWRCbG9ja1NjYWxhciwgInJlYWRCbG9ja1NjYWxhciIpOwogICAgZnVuY3Rpb24gcmVhZEJsb2NrU2VxdWVuY2Uoc3RhdGUsIG5vZGVJbmRlbnQpIHsKICAgICAgdmFyIF9saW5lLCBfdGFnID0gc3RhdGUudGFnLCBfYW5jaG9yID0gc3RhdGUuYW5jaG9yLCBfcmVzdWx0ID0gW10sIGZvbGxvd2luZywgZGV0ZWN0ZWQgPSBmYWxzZSwgY2g7CiAgICAgIGlmIChzdGF0ZS5hbmNob3IgIT09IG51bGwpIHsKICAgICAgICBzdGF0ZS5hbmNob3JNYXBbc3RhdGUuYW5jaG9yXSA9IF9yZXN1bHQ7CiAgICAgIH0KICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTsKICAgICAgd2hpbGUgKGNoICE9PSAwKSB7CiAgICAgICAgaWYgKGNoICE9PSA0NSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGZvbGxvd2luZyA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gKyAxKTsKICAgICAgICBpZiAoIWlzX1dTX09SX0VPTChmb2xsb3dpbmcpKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgZGV0ZWN0ZWQgPSB0cnVlOwogICAgICAgIHN0YXRlLnBvc2l0aW9uKys7CiAgICAgICAgaWYgKHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKSkgewogICAgICAgICAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPD0gbm9kZUluZGVudCkgewogICAgICAgICAgICBfcmVzdWx0LnB1c2gobnVsbCk7CiAgICAgICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBfbGluZSA9IHN0YXRlLmxpbmU7CiAgICAgICAgY29tcG9zZU5vZGUoc3RhdGUsIG5vZGVJbmRlbnQsIENPTlRFWFRfQkxPQ0tfSU4sIGZhbHNlLCB0cnVlKTsKICAgICAgICBfcmVzdWx0LnB1c2goc3RhdGUucmVzdWx0KTsKICAgICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7CiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTsKICAgICAgICBpZiAoKHN0YXRlLmxpbmUgPT09IF9saW5lIHx8IHN0YXRlLmxpbmVJbmRlbnQgPiBub2RlSW5kZW50KSAmJiBjaCAhPT0gMCkgewogICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJiYWQgaW5kZW50YXRpb24gb2YgYSBzZXF1ZW5jZSBlbnRyeSIpOwogICAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGluZUluZGVudCA8IG5vZGVJbmRlbnQpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZGV0ZWN0ZWQpIHsKICAgICAgICBzdGF0ZS50YWcgPSBfdGFnOwogICAgICAgIHN0YXRlLmFuY2hvciA9IF9hbmNob3I7CiAgICAgICAgc3RhdGUua2luZCA9ICJzZXF1ZW5jZSI7CiAgICAgICAgc3RhdGUucmVzdWx0ID0gX3Jlc3VsdDsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBfX25hbWUocmVhZEJsb2NrU2VxdWVuY2UsICJyZWFkQmxvY2tTZXF1ZW5jZSIpOwogICAgZnVuY3Rpb24gcmVhZEJsb2NrTWFwcGluZyhzdGF0ZSwgbm9kZUluZGVudCwgZmxvd0luZGVudCkgewogICAgICB2YXIgZm9sbG93aW5nLCBhbGxvd0NvbXBhY3QsIF9saW5lLCBfcG9zLCBfdGFnID0gc3RhdGUudGFnLCBfYW5jaG9yID0gc3RhdGUuYW5jaG9yLCBfcmVzdWx0ID0ge30sIG92ZXJyaWRhYmxlS2V5cyA9IHt9LCBrZXlUYWcgPSBudWxsLCBrZXlOb2RlID0gbnVsbCwgdmFsdWVOb2RlID0gbnVsbCwgYXRFeHBsaWNpdEtleSA9IGZhbHNlLCBkZXRlY3RlZCA9IGZhbHNlLCBjaDsKICAgICAgaWYgKHN0YXRlLmFuY2hvciAhPT0gbnVsbCkgewogICAgICAgIHN0YXRlLmFuY2hvck1hcFtzdGF0ZS5hbmNob3JdID0gX3Jlc3VsdDsKICAgICAgfQogICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pOwogICAgICB3aGlsZSAoY2ggIT09IDApIHsKICAgICAgICBmb2xsb3dpbmcgPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uICsgMSk7CiAgICAgICAgX2xpbmUgPSBzdGF0ZS5saW5lOwogICAgICAgIF9wb3MgPSBzdGF0ZS5wb3NpdGlvbjsKICAgICAgICBpZiAoKGNoID09PSA2MyB8fCBjaCA9PT0gNTgpICYmIGlzX1dTX09SX0VPTChmb2xsb3dpbmcpKSB7CiAgICAgICAgICBpZiAoY2ggPT09IDYzKSB7CiAgICAgICAgICAgIGlmIChhdEV4cGxpY2l0S2V5KSB7CiAgICAgICAgICAgICAgc3RvcmVNYXBwaW5nUGFpcihzdGF0ZSwgX3Jlc3VsdCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIG51bGwpOwogICAgICAgICAgICAgIGtleVRhZyA9IGtleU5vZGUgPSB2YWx1ZU5vZGUgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRldGVjdGVkID0gdHJ1ZTsKICAgICAgICAgICAgYXRFeHBsaWNpdEtleSA9IHRydWU7CiAgICAgICAgICAgIGFsbG93Q29tcGFjdCA9IHRydWU7CiAgICAgICAgICB9IGVsc2UgaWYgKGF0RXhwbGljaXRLZXkpIHsKICAgICAgICAgICAgYXRFeHBsaWNpdEtleSA9IGZhbHNlOwogICAgICAgICAgICBhbGxvd0NvbXBhY3QgPSB0cnVlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJpbmNvbXBsZXRlIGV4cGxpY2l0IG1hcHBpbmcgcGFpcjsgYSBrZXkgbm9kZSBpcyBtaXNzZWQ7IG9yIGZvbGxvd2VkIGJ5IGEgbm9uLXRhYnVsYXRlZCBlbXB0eSBsaW5lIik7CiAgICAgICAgICB9CiAgICAgICAgICBzdGF0ZS5wb3NpdGlvbiArPSAxOwogICAgICAgICAgY2ggPSBmb2xsb3dpbmc7CiAgICAgICAgfSBlbHNlIGlmIChjb21wb3NlTm9kZShzdGF0ZSwgZmxvd0luZGVudCwgQ09OVEVYVF9GTE9XX09VVCwgZmFsc2UsIHRydWUpKSB7CiAgICAgICAgICBpZiAoc3RhdGUubGluZSA9PT0gX2xpbmUpIHsKICAgICAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTsKICAgICAgICAgICAgd2hpbGUgKGlzX1dISVRFX1NQQUNFKGNoKSkgewogICAgICAgICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2ggPT09IDU4KSB7CiAgICAgICAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOwogICAgICAgICAgICAgIGlmICghaXNfV1NfT1JfRU9MKGNoKSkgewogICAgICAgICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJhIHdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIGV4cGVjdGVkIGFmdGVyIHRoZSBrZXktdmFsdWUgc2VwYXJhdG9yIHdpdGhpbiBhIGJsb2NrIG1hcHBpbmciKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGF0RXhwbGljaXRLZXkpIHsKICAgICAgICAgICAgICAgIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCBudWxsKTsKICAgICAgICAgICAgICAgIGtleVRhZyA9IGtleU5vZGUgPSB2YWx1ZU5vZGUgPSBudWxsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBkZXRlY3RlZCA9IHRydWU7CiAgICAgICAgICAgICAgYXRFeHBsaWNpdEtleSA9IGZhbHNlOwogICAgICAgICAgICAgIGFsbG93Q29tcGFjdCA9IGZhbHNlOwogICAgICAgICAgICAgIGtleVRhZyA9IHN0YXRlLnRhZzsKICAgICAgICAgICAgICBrZXlOb2RlID0gc3RhdGUucmVzdWx0OwogICAgICAgICAgICB9IGVsc2UgaWYgKGRldGVjdGVkKSB7CiAgICAgICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJjYW4gbm90IHJlYWQgYW4gaW1wbGljaXQgbWFwcGluZyBwYWlyOyBhIGNvbG9uIGlzIG1pc3NlZCIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHN0YXRlLnRhZyA9IF90YWc7CiAgICAgICAgICAgICAgc3RhdGUuYW5jaG9yID0gX2FuY2hvcjsKICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIGlmIChkZXRlY3RlZCkgewogICAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZSwgImNhbiBub3QgcmVhZCBhIGJsb2NrIG1hcHBpbmcgZW50cnk7IGEgbXVsdGlsaW5lIGtleSBtYXkgbm90IGJlIGFuIGltcGxpY2l0IGtleSIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RhdGUudGFnID0gX3RhZzsKICAgICAgICAgICAgc3RhdGUuYW5jaG9yID0gX2FuY2hvcjsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoc3RhdGUubGluZSA9PT0gX2xpbmUgfHwgc3RhdGUubGluZUluZGVudCA+IG5vZGVJbmRlbnQpIHsKICAgICAgICAgIGlmIChjb21wb3NlTm9kZShzdGF0ZSwgbm9kZUluZGVudCwgQ09OVEVYVF9CTE9DS19PVVQsIHRydWUsIGFsbG93Q29tcGFjdCkpIHsKICAgICAgICAgICAgaWYgKGF0RXhwbGljaXRLZXkpIHsKICAgICAgICAgICAgICBrZXlOb2RlID0gc3RhdGUucmVzdWx0OwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHZhbHVlTm9kZSA9IHN0YXRlLnJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKCFhdEV4cGxpY2l0S2V5KSB7CiAgICAgICAgICAgIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCB2YWx1ZU5vZGUsIF9saW5lLCBfcG9zKTsKICAgICAgICAgICAga2V5VGFnID0ga2V5Tm9kZSA9IHZhbHVlTm9kZSA9IG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7CiAgICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pOwogICAgICAgIH0KICAgICAgICBpZiAoc3RhdGUubGluZUluZGVudCA+IG5vZGVJbmRlbnQgJiYgY2ggIT09IDApIHsKICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlLCAiYmFkIGluZGVudGF0aW9uIG9mIGEgbWFwcGluZyBlbnRyeSIpOwogICAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGluZUluZGVudCA8IG5vZGVJbmRlbnQpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoYXRFeHBsaWNpdEtleSkgewogICAgICAgIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCBudWxsKTsKICAgICAgfQogICAgICBpZiAoZGV0ZWN0ZWQpIHsKICAgICAgICBzdGF0ZS50YWcgPSBfdGFnOwogICAgICAgIHN0YXRlLmFuY2hvciA9IF9hbmNob3I7CiAgICAgICAgc3RhdGUua2luZCA9ICJtYXBwaW5nIjsKICAgICAgICBzdGF0ZS5yZXN1bHQgPSBfcmVzdWx0OwogICAgICB9CiAgICAgIHJldHVybiBkZXRlY3RlZDsKICAgIH0KICAgIF9fbmFtZShyZWFkQmxvY2tNYXBwaW5nLCAicmVhZEJsb2NrTWFwcGluZyIpOwogICAgZnVuY3Rpb24gcmVhZFRhZ1Byb3BlcnR5KHN0YXRlKSB7CiAgICAgIHZhciBfcG9zaXRpb24sIGlzVmVyYmF0aW0gPSBmYWxzZSwgaXNOYW1lZCA9IGZhbHNlLCB0YWdIYW5kbGUsIHRhZ05hbWUsIGNoOwogICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pOwogICAgICBpZiAoY2ggIT09IDMzKSByZXR1cm4gZmFsc2U7CiAgICAgIGlmIChzdGF0ZS50YWcgIT09IG51bGwpIHsKICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZSwgImR1cGxpY2F0aW9uIG9mIGEgdGFnIHByb3BlcnR5Iik7CiAgICAgIH0KICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOwogICAgICBpZiAoY2ggPT09IDYwKSB7CiAgICAgICAgaXNWZXJiYXRpbSA9IHRydWU7CiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOwogICAgICB9IGVsc2UgaWYgKGNoID09PSAzMykgewogICAgICAgIGlzTmFtZWQgPSB0cnVlOwogICAgICAgIHRhZ0hhbmRsZSA9ICIhISI7CiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOwogICAgICB9IGVsc2UgewogICAgICAgIHRhZ0hhbmRsZSA9ICIhIjsKICAgICAgfQogICAgICBfcG9zaXRpb24gPSBzdGF0ZS5wb3NpdGlvbjsKICAgICAgaWYgKGlzVmVyYmF0aW0pIHsKICAgICAgICBkbyB7CiAgICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7CiAgICAgICAgfSB3aGlsZSAoY2ggIT09IDAgJiYgY2ggIT09IDYyKTsKICAgICAgICBpZiAoc3RhdGUucG9zaXRpb24gPCBzdGF0ZS5sZW5ndGgpIHsKICAgICAgICAgIHRhZ05hbWUgPSBzdGF0ZS5pbnB1dC5zbGljZShfcG9zaXRpb24sIHN0YXRlLnBvc2l0aW9uKTsKICAgICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJ1bmV4cGVjdGVkIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGhpbiBhIHZlcmJhdGltIHRhZyIpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB3aGlsZSAoY2ggIT09IDAgJiYgIWlzX1dTX09SX0VPTChjaCkpIHsKICAgICAgICAgIGlmIChjaCA9PT0gMzMpIHsKICAgICAgICAgICAgaWYgKCFpc05hbWVkKSB7CiAgICAgICAgICAgICAgdGFnSGFuZGxlID0gc3RhdGUuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uIC0gMSwgc3RhdGUucG9zaXRpb24gKyAxKTsKICAgICAgICAgICAgICBpZiAoIVBBVFRFUk5fVEFHX0hBTkRMRS50ZXN0KHRhZ0hhbmRsZSkpIHsKICAgICAgICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlLCAibmFtZWQgdGFnIGhhbmRsZSBjYW5ub3QgY29udGFpbiBzdWNoIGNoYXJhY3RlcnMiKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaXNOYW1lZCA9IHRydWU7CiAgICAgICAgICAgICAgX3Bvc2l0aW9uID0gc3RhdGUucG9zaXRpb24gKyAxOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlLCAidGFnIHN1ZmZpeCBjYW5ub3QgY29udGFpbiBleGNsYW1hdGlvbiBtYXJrcyIpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7CiAgICAgICAgfQogICAgICAgIHRhZ05hbWUgPSBzdGF0ZS5pbnB1dC5zbGljZShfcG9zaXRpb24sIHN0YXRlLnBvc2l0aW9uKTsKICAgICAgICBpZiAoUEFUVEVSTl9GTE9XX0lORElDQVRPUlMudGVzdCh0YWdOYW1lKSkgewogICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJ0YWcgc3VmZml4IGNhbm5vdCBjb250YWluIGZsb3cgaW5kaWNhdG9yIGNoYXJhY3RlcnMiKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHRhZ05hbWUgJiYgIVBBVFRFUk5fVEFHX1VSSS50ZXN0KHRhZ05hbWUpKSB7CiAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJ0YWcgbmFtZSBjYW5ub3QgY29udGFpbiBzdWNoIGNoYXJhY3RlcnM6ICIgKyB0YWdOYW1lKTsKICAgICAgfQogICAgICBpZiAoaXNWZXJiYXRpbSkgewogICAgICAgIHN0YXRlLnRhZyA9IHRhZ05hbWU7CiAgICAgIH0gZWxzZSBpZiAoX2hhc093blByb3BlcnR5LmNhbGwoc3RhdGUudGFnTWFwLCB0YWdIYW5kbGUpKSB7CiAgICAgICAgc3RhdGUudGFnID0gc3RhdGUudGFnTWFwW3RhZ0hhbmRsZV0gKyB0YWdOYW1lOwogICAgICB9IGVsc2UgaWYgKHRhZ0hhbmRsZSA9PT0gIiEiKSB7CiAgICAgICAgc3RhdGUudGFnID0gIiEiICsgdGFnTmFtZTsKICAgICAgfSBlbHNlIGlmICh0YWdIYW5kbGUgPT09ICIhISIpIHsKICAgICAgICBzdGF0ZS50YWcgPSAidGFnOnlhbWwub3JnLDIwMDI6IiArIHRhZ05hbWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICd1bmRlY2xhcmVkIHRhZyBoYW5kbGUgIicgKyB0YWdIYW5kbGUgKyAnIicpOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgX19uYW1lKHJlYWRUYWdQcm9wZXJ0eSwgInJlYWRUYWdQcm9wZXJ0eSIpOwogICAgZnVuY3Rpb24gcmVhZEFuY2hvclByb3BlcnR5KHN0YXRlKSB7CiAgICAgIHZhciBfcG9zaXRpb24sIGNoOwogICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pOwogICAgICBpZiAoY2ggIT09IDM4KSByZXR1cm4gZmFsc2U7CiAgICAgIGlmIChzdGF0ZS5hbmNob3IgIT09IG51bGwpIHsKICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZSwgImR1cGxpY2F0aW9uIG9mIGFuIGFuY2hvciBwcm9wZXJ0eSIpOwogICAgICB9CiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTsKICAgICAgX3Bvc2l0aW9uID0gc3RhdGUucG9zaXRpb247CiAgICAgIHdoaWxlIChjaCAhPT0gMCAmJiAhaXNfV1NfT1JfRU9MKGNoKSAmJiAhaXNfRkxPV19JTkRJQ0FUT1IoY2gpKSB7CiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOwogICAgICB9CiAgICAgIGlmIChzdGF0ZS5wb3NpdGlvbiA9PT0gX3Bvc2l0aW9uKSB7CiAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJuYW1lIG9mIGFuIGFuY2hvciBub2RlIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIik7CiAgICAgIH0KICAgICAgc3RhdGUuYW5jaG9yID0gc3RhdGUuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uLCBzdGF0ZS5wb3NpdGlvbik7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgX19uYW1lKHJlYWRBbmNob3JQcm9wZXJ0eSwgInJlYWRBbmNob3JQcm9wZXJ0eSIpOwogICAgZnVuY3Rpb24gcmVhZEFsaWFzKHN0YXRlKSB7CiAgICAgIHZhciBfcG9zaXRpb24sIGFsaWFzLCBjaDsKICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTsKICAgICAgaWYgKGNoICE9PSA0MikgcmV0dXJuIGZhbHNlOwogICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7CiAgICAgIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uOwogICAgICB3aGlsZSAoY2ggIT09IDAgJiYgIWlzX1dTX09SX0VPTChjaCkgJiYgIWlzX0ZMT1dfSU5ESUNBVE9SKGNoKSkgewogICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTsKICAgICAgfQogICAgICBpZiAoc3RhdGUucG9zaXRpb24gPT09IF9wb3NpdGlvbikgewogICAgICAgIHRocm93RXJyb3IyKHN0YXRlLCAibmFtZSBvZiBhbiBhbGlhcyBub2RlIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIik7CiAgICAgIH0KICAgICAgYWxpYXMgPSBzdGF0ZS5pbnB1dC5zbGljZShfcG9zaXRpb24sIHN0YXRlLnBvc2l0aW9uKTsKICAgICAgaWYgKCFfaGFzT3duUHJvcGVydHkuY2FsbChzdGF0ZS5hbmNob3JNYXAsIGFsaWFzKSkgewogICAgICAgIHRocm93RXJyb3IyKHN0YXRlLCAndW5pZGVudGlmaWVkIGFsaWFzICInICsgYWxpYXMgKyAnIicpOwogICAgICB9CiAgICAgIHN0YXRlLnJlc3VsdCA9IHN0YXRlLmFuY2hvck1hcFthbGlhc107CiAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBfX25hbWUocmVhZEFsaWFzLCAicmVhZEFsaWFzIik7CiAgICBmdW5jdGlvbiBjb21wb3NlTm9kZShzdGF0ZSwgcGFyZW50SW5kZW50LCBub2RlQ29udGV4dCwgYWxsb3dUb1NlZWssIGFsbG93Q29tcGFjdCkgewogICAgICB2YXIgYWxsb3dCbG9ja1N0eWxlcywgYWxsb3dCbG9ja1NjYWxhcnMsIGFsbG93QmxvY2tDb2xsZWN0aW9ucywgaW5kZW50U3RhdHVzID0gMSwgYXROZXdMaW5lID0gZmFsc2UsIGhhc0NvbnRlbnQgPSBmYWxzZSwgdHlwZUluZGV4LCB0eXBlUXVhbnRpdHksIHR5cGU1LCBmbG93SW5kZW50LCBibG9ja0luZGVudDsKICAgICAgaWYgKHN0YXRlLmxpc3RlbmVyICE9PSBudWxsKSB7CiAgICAgICAgc3RhdGUubGlzdGVuZXIoIm9wZW4iLCBzdGF0ZSk7CiAgICAgIH0KICAgICAgc3RhdGUudGFnID0gbnVsbDsKICAgICAgc3RhdGUuYW5jaG9yID0gbnVsbDsKICAgICAgc3RhdGUua2luZCA9IG51bGw7CiAgICAgIHN0YXRlLnJlc3VsdCA9IG51bGw7CiAgICAgIGFsbG93QmxvY2tTdHlsZXMgPSBhbGxvd0Jsb2NrU2NhbGFycyA9IGFsbG93QmxvY2tDb2xsZWN0aW9ucyA9IENPTlRFWFRfQkxPQ0tfT1VUID09PSBub2RlQ29udGV4dCB8fCBDT05URVhUX0JMT0NLX0lOID09PSBub2RlQ29udGV4dDsKICAgICAgaWYgKGFsbG93VG9TZWVrKSB7CiAgICAgICAgaWYgKHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKSkgewogICAgICAgICAgYXROZXdMaW5lID0gdHJ1ZTsKICAgICAgICAgIGlmIChzdGF0ZS5saW5lSW5kZW50ID4gcGFyZW50SW5kZW50KSB7CiAgICAgICAgICAgIGluZGVudFN0YXR1cyA9IDE7CiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPT09IHBhcmVudEluZGVudCkgewogICAgICAgICAgICBpbmRlbnRTdGF0dXMgPSAwOwogICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5saW5lSW5kZW50IDwgcGFyZW50SW5kZW50KSB7CiAgICAgICAgICAgIGluZGVudFN0YXR1cyA9IC0xOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoaW5kZW50U3RhdHVzID09PSAxKSB7CiAgICAgICAgd2hpbGUgKHJlYWRUYWdQcm9wZXJ0eShzdGF0ZSkgfHwgcmVhZEFuY2hvclByb3BlcnR5KHN0YXRlKSkgewogICAgICAgICAgaWYgKHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKSkgewogICAgICAgICAgICBhdE5ld0xpbmUgPSB0cnVlOwogICAgICAgICAgICBhbGxvd0Jsb2NrQ29sbGVjdGlvbnMgPSBhbGxvd0Jsb2NrU3R5bGVzOwogICAgICAgICAgICBpZiAoc3RhdGUubGluZUluZGVudCA+IHBhcmVudEluZGVudCkgewogICAgICAgICAgICAgIGluZGVudFN0YXR1cyA9IDE7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGluZUluZGVudCA9PT0gcGFyZW50SW5kZW50KSB7CiAgICAgICAgICAgICAgaW5kZW50U3RhdHVzID0gMDsKICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5saW5lSW5kZW50IDwgcGFyZW50SW5kZW50KSB7CiAgICAgICAgICAgICAgaW5kZW50U3RhdHVzID0gLTE7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGFsbG93QmxvY2tDb2xsZWN0aW9ucyA9IGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoYWxsb3dCbG9ja0NvbGxlY3Rpb25zKSB7CiAgICAgICAgYWxsb3dCbG9ja0NvbGxlY3Rpb25zID0gYXROZXdMaW5lIHx8IGFsbG93Q29tcGFjdDsKICAgICAgfQogICAgICBpZiAoaW5kZW50U3RhdHVzID09PSAxIHx8IENPTlRFWFRfQkxPQ0tfT1VUID09PSBub2RlQ29udGV4dCkgewogICAgICAgIGlmIChDT05URVhUX0ZMT1dfSU4gPT09IG5vZGVDb250ZXh0IHx8IENPTlRFWFRfRkxPV19PVVQgPT09IG5vZGVDb250ZXh0KSB7CiAgICAgICAgICBmbG93SW5kZW50ID0gcGFyZW50SW5kZW50OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBmbG93SW5kZW50ID0gcGFyZW50SW5kZW50ICsgMTsKICAgICAgICB9CiAgICAgICAgYmxvY2tJbmRlbnQgPSBzdGF0ZS5wb3NpdGlvbiAtIHN0YXRlLmxpbmVTdGFydDsKICAgICAgICBpZiAoaW5kZW50U3RhdHVzID09PSAxKSB7CiAgICAgICAgICBpZiAoYWxsb3dCbG9ja0NvbGxlY3Rpb25zICYmIChyZWFkQmxvY2tTZXF1ZW5jZShzdGF0ZSwgYmxvY2tJbmRlbnQpIHx8IHJlYWRCbG9ja01hcHBpbmcoc3RhdGUsIGJsb2NrSW5kZW50LCBmbG93SW5kZW50KSkgfHwgcmVhZEZsb3dDb2xsZWN0aW9uKHN0YXRlLCBmbG93SW5kZW50KSkgewogICAgICAgICAgICBoYXNDb250ZW50ID0gdHJ1ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChhbGxvd0Jsb2NrU2NhbGFycyAmJiByZWFkQmxvY2tTY2FsYXIoc3RhdGUsIGZsb3dJbmRlbnQpIHx8IHJlYWRTaW5nbGVRdW90ZWRTY2FsYXIoc3RhdGUsIGZsb3dJbmRlbnQpIHx8IHJlYWREb3VibGVRdW90ZWRTY2FsYXIoc3RhdGUsIGZsb3dJbmRlbnQpKSB7CiAgICAgICAgICAgICAgaGFzQ29udGVudCA9IHRydWU7CiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVhZEFsaWFzKHN0YXRlKSkgewogICAgICAgICAgICAgIGhhc0NvbnRlbnQgPSB0cnVlOwogICAgICAgICAgICAgIGlmIChzdGF0ZS50YWcgIT09IG51bGwgfHwgc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZSwgImFsaWFzIG5vZGUgc2hvdWxkIG5vdCBoYXZlIGFueSBwcm9wZXJ0aWVzIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKHJlYWRQbGFpblNjYWxhcihzdGF0ZSwgZmxvd0luZGVudCwgQ09OVEVYVF9GTE9XX0lOID09PSBub2RlQ29udGV4dCkpIHsKICAgICAgICAgICAgICBoYXNDb250ZW50ID0gdHJ1ZTsKICAgICAgICAgICAgICBpZiAoc3RhdGUudGFnID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICBzdGF0ZS50YWcgPSAiPyI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdGF0ZS5hbmNob3IgIT09IG51bGwpIHsKICAgICAgICAgICAgICBzdGF0ZS5hbmNob3JNYXBbc3RhdGUuYW5jaG9yXSA9IHN0YXRlLnJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoaW5kZW50U3RhdHVzID09PSAwKSB7CiAgICAgICAgICBoYXNDb250ZW50ID0gYWxsb3dCbG9ja0NvbGxlY3Rpb25zICYmIHJlYWRCbG9ja1NlcXVlbmNlKHN0YXRlLCBibG9ja0luZGVudCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChzdGF0ZS50YWcgIT09IG51bGwgJiYgc3RhdGUudGFnICE9PSAiISIpIHsKICAgICAgICBpZiAoc3RhdGUudGFnID09PSAiPyIpIHsKICAgICAgICAgIGlmIChzdGF0ZS5yZXN1bHQgIT09IG51bGwgJiYgc3RhdGUua2luZCAhPT0gInNjYWxhciIpIHsKICAgICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICd1bmFjY2VwdGFibGUgbm9kZSBraW5kIGZvciAhPD8+IHRhZzsgaXQgc2hvdWxkIGJlICJzY2FsYXIiLCBub3QgIicgKyBzdGF0ZS5raW5kICsgJyInKTsKICAgICAgICAgIH0KICAgICAgICAgIGZvciAodHlwZUluZGV4ID0gMCwgdHlwZVF1YW50aXR5ID0gc3RhdGUuaW1wbGljaXRUeXBlcy5sZW5ndGg7IHR5cGVJbmRleCA8IHR5cGVRdWFudGl0eTsgdHlwZUluZGV4ICs9IDEpIHsKICAgICAgICAgICAgdHlwZTUgPSBzdGF0ZS5pbXBsaWNpdFR5cGVzW3R5cGVJbmRleF07CiAgICAgICAgICAgIGlmICh0eXBlNS5yZXNvbHZlKHN0YXRlLnJlc3VsdCkpIHsKICAgICAgICAgICAgICBzdGF0ZS5yZXN1bHQgPSB0eXBlNS5jb25zdHJ1Y3Qoc3RhdGUucmVzdWx0KTsKICAgICAgICAgICAgICBzdGF0ZS50YWcgPSB0eXBlNS50YWc7CiAgICAgICAgICAgICAgaWYgKHN0YXRlLmFuY2hvciAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgc3RhdGUuYW5jaG9yTWFwW3N0YXRlLmFuY2hvcl0gPSBzdGF0ZS5yZXN1bHQ7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChfaGFzT3duUHJvcGVydHkuY2FsbChzdGF0ZS50eXBlTWFwW3N0YXRlLmtpbmQgfHwgImZhbGxiYWNrIl0sIHN0YXRlLnRhZykpIHsKICAgICAgICAgIHR5cGU1ID0gc3RhdGUudHlwZU1hcFtzdGF0ZS5raW5kIHx8ICJmYWxsYmFjayJdW3N0YXRlLnRhZ107CiAgICAgICAgICBpZiAoc3RhdGUucmVzdWx0ICE9PSBudWxsICYmIHR5cGU1LmtpbmQgIT09IHN0YXRlLmtpbmQpIHsKICAgICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJ1bmFjY2VwdGFibGUgbm9kZSBraW5kIGZvciAhPCIgKyBzdGF0ZS50YWcgKyAnPiB0YWc7IGl0IHNob3VsZCBiZSAiJyArIHR5cGU1LmtpbmQgKyAnIiwgbm90ICInICsgc3RhdGUua2luZCArICciJyk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIXR5cGU1LnJlc29sdmUoc3RhdGUucmVzdWx0KSkgewogICAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZSwgImNhbm5vdCByZXNvbHZlIGEgbm9kZSB3aXRoICE8IiArIHN0YXRlLnRhZyArICI+IGV4cGxpY2l0IHRhZyIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RhdGUucmVzdWx0ID0gdHlwZTUuY29uc3RydWN0KHN0YXRlLnJlc3VsdCk7CiAgICAgICAgICAgIGlmIChzdGF0ZS5hbmNob3IgIT09IG51bGwpIHsKICAgICAgICAgICAgICBzdGF0ZS5hbmNob3JNYXBbc3RhdGUuYW5jaG9yXSA9IHN0YXRlLnJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZSwgInVua25vd24gdGFnICE8IiArIHN0YXRlLnRhZyArICI+Iik7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChzdGF0ZS5saXN0ZW5lciAhPT0gbnVsbCkgewogICAgICAgIHN0YXRlLmxpc3RlbmVyKCJjbG9zZSIsIHN0YXRlKTsKICAgICAgfQogICAgICByZXR1cm4gc3RhdGUudGFnICE9PSBudWxsIHx8IHN0YXRlLmFuY2hvciAhPT0gbnVsbCB8fCBoYXNDb250ZW50OwogICAgfQogICAgX19uYW1lKGNvbXBvc2VOb2RlLCAiY29tcG9zZU5vZGUiKTsKICAgIGZ1bmN0aW9uIHJlYWREb2N1bWVudChzdGF0ZSkgewogICAgICB2YXIgZG9jdW1lbnRTdGFydCA9IHN0YXRlLnBvc2l0aW9uLCBfcG9zaXRpb24sIGRpcmVjdGl2ZU5hbWUsIGRpcmVjdGl2ZUFyZ3MsIGhhc0RpcmVjdGl2ZXMgPSBmYWxzZSwgY2g7CiAgICAgIHN0YXRlLnZlcnNpb24gPSBudWxsOwogICAgICBzdGF0ZS5jaGVja0xpbmVCcmVha3MgPSBzdGF0ZS5sZWdhY3k7CiAgICAgIHN0YXRlLnRhZ01hcCA9IHt9OwogICAgICBzdGF0ZS5hbmNob3JNYXAgPSB7fTsKICAgICAgd2hpbGUgKChjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pKSAhPT0gMCkgewogICAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTsKICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pOwogICAgICAgIGlmIChzdGF0ZS5saW5lSW5kZW50ID4gMCB8fCBjaCAhPT0gMzcpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBoYXNEaXJlY3RpdmVzID0gdHJ1ZTsKICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7CiAgICAgICAgX3Bvc2l0aW9uID0gc3RhdGUucG9zaXRpb247CiAgICAgICAgd2hpbGUgKGNoICE9PSAwICYmICFpc19XU19PUl9FT0woY2gpKSB7CiAgICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7CiAgICAgICAgfQogICAgICAgIGRpcmVjdGl2ZU5hbWUgPSBzdGF0ZS5pbnB1dC5zbGljZShfcG9zaXRpb24sIHN0YXRlLnBvc2l0aW9uKTsKICAgICAgICBkaXJlY3RpdmVBcmdzID0gW107CiAgICAgICAgaWYgKGRpcmVjdGl2ZU5hbWUubGVuZ3RoIDwgMSkgewogICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJkaXJlY3RpdmUgbmFtZSBtdXN0IG5vdCBiZSBsZXNzIHRoYW4gb25lIGNoYXJhY3RlciBpbiBsZW5ndGgiKTsKICAgICAgICB9CiAgICAgICAgd2hpbGUgKGNoICE9PSAwKSB7CiAgICAgICAgICB3aGlsZSAoaXNfV0hJVEVfU1BBQ0UoY2gpKSB7CiAgICAgICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChjaCA9PT0gMzUpIHsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTsKICAgICAgICAgICAgfSB3aGlsZSAoY2ggIT09IDAgJiYgIWlzX0VPTChjaCkpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChpc19FT0woY2gpKSBicmVhazsKICAgICAgICAgIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uOwogICAgICAgICAgd2hpbGUgKGNoICE9PSAwICYmICFpc19XU19PUl9FT0woY2gpKSB7CiAgICAgICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTsKICAgICAgICAgIH0KICAgICAgICAgIGRpcmVjdGl2ZUFyZ3MucHVzaChzdGF0ZS5pbnB1dC5zbGljZShfcG9zaXRpb24sIHN0YXRlLnBvc2l0aW9uKSk7CiAgICAgICAgfQogICAgICAgIGlmIChjaCAhPT0gMCkgcmVhZExpbmVCcmVhayhzdGF0ZSk7CiAgICAgICAgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKGRpcmVjdGl2ZUhhbmRsZXJzLCBkaXJlY3RpdmVOYW1lKSkgewogICAgICAgICAgZGlyZWN0aXZlSGFuZGxlcnNbZGlyZWN0aXZlTmFtZV0oc3RhdGUsIGRpcmVjdGl2ZU5hbWUsIGRpcmVjdGl2ZUFyZ3MpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvd1dhcm5pbmcoc3RhdGUsICd1bmtub3duIGRvY3VtZW50IGRpcmVjdGl2ZSAiJyArIGRpcmVjdGl2ZU5hbWUgKyAnIicpOwogICAgICAgIH0KICAgICAgfQogICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7CiAgICAgIGlmIChzdGF0ZS5saW5lSW5kZW50ID09PSAwICYmIHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pID09PSA0NSAmJiBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uICsgMSkgPT09IDQ1ICYmIHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gKyAyKSA9PT0gNDUpIHsKICAgICAgICBzdGF0ZS5wb3NpdGlvbiArPSAzOwogICAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTsKICAgICAgfSBlbHNlIGlmIChoYXNEaXJlY3RpdmVzKSB7CiAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJkaXJlY3RpdmVzIGVuZCBtYXJrIGlzIGV4cGVjdGVkIik7CiAgICAgIH0KICAgICAgY29tcG9zZU5vZGUoc3RhdGUsIHN0YXRlLmxpbmVJbmRlbnQgLSAxLCBDT05URVhUX0JMT0NLX09VVCwgZmFsc2UsIHRydWUpOwogICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7CiAgICAgIGlmIChzdGF0ZS5jaGVja0xpbmVCcmVha3MgJiYgUEFUVEVSTl9OT05fQVNDSUlfTElORV9CUkVBS1MudGVzdChzdGF0ZS5pbnB1dC5zbGljZShkb2N1bWVudFN0YXJ0LCBzdGF0ZS5wb3NpdGlvbikpKSB7CiAgICAgICAgdGhyb3dXYXJuaW5nKHN0YXRlLCAibm9uLUFTQ0lJIGxpbmUgYnJlYWtzIGFyZSBpbnRlcnByZXRlZCBhcyBjb250ZW50Iik7CiAgICAgIH0KICAgICAgc3RhdGUuZG9jdW1lbnRzLnB1c2goc3RhdGUucmVzdWx0KTsKICAgICAgaWYgKHN0YXRlLnBvc2l0aW9uID09PSBzdGF0ZS5saW5lU3RhcnQgJiYgdGVzdERvY3VtZW50U2VwYXJhdG9yKHN0YXRlKSkgewogICAgICAgIGlmIChzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKSA9PT0gNDYpIHsKICAgICAgICAgIHN0YXRlLnBvc2l0aW9uICs9IDM7CiAgICAgICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoc3RhdGUucG9zaXRpb24gPCBzdGF0ZS5sZW5ndGggLSAxKSB7CiAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUsICJlbmQgb2YgdGhlIHN0cmVhbSBvciBhIGRvY3VtZW50IHNlcGFyYXRvciBpcyBleHBlY3RlZCIpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQogICAgX19uYW1lKHJlYWREb2N1bWVudCwgInJlYWREb2N1bWVudCIpOwogICAgZnVuY3Rpb24gbG9hZERvY3VtZW50cyhpbnB1dCwgb3B0aW9ucykgewogICAgICBpbnB1dCA9IFN0cmluZyhpbnB1dCk7CiAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgICBpZiAoaW5wdXQubGVuZ3RoICE9PSAwKSB7CiAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQoaW5wdXQubGVuZ3RoIC0gMSkgIT09IDEwICYmIGlucHV0LmNoYXJDb2RlQXQoaW5wdXQubGVuZ3RoIC0gMSkgIT09IDEzKSB7CiAgICAgICAgICBpbnB1dCArPSAiXG4iOwogICAgICAgIH0KICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdCgwKSA9PT0gNjUyNzkpIHsKICAgICAgICAgIGlucHV0ID0gaW5wdXQuc2xpY2UoMSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhciBzdGF0ZSA9IG5ldyBTdGF0ZShpbnB1dCwgb3B0aW9ucyk7CiAgICAgIHZhciBudWxscG9zID0gaW5wdXQuaW5kZXhPZigiXDAiKTsKICAgICAgaWYgKG51bGxwb3MgIT09IC0xKSB7CiAgICAgICAgc3RhdGUucG9zaXRpb24gPSBudWxscG9zOwogICAgICAgIHRocm93RXJyb3IyKHN0YXRlLCAibnVsbCBieXRlIGlzIG5vdCBhbGxvd2VkIGluIGlucHV0Iik7CiAgICAgIH0KICAgICAgc3RhdGUuaW5wdXQgKz0gIlwwIjsKICAgICAgd2hpbGUgKHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pID09PSAzMikgewogICAgICAgIHN0YXRlLmxpbmVJbmRlbnQgKz0gMTsKICAgICAgICBzdGF0ZS5wb3NpdGlvbiArPSAxOwogICAgICB9CiAgICAgIHdoaWxlIChzdGF0ZS5wb3NpdGlvbiA8IHN0YXRlLmxlbmd0aCAtIDEpIHsKICAgICAgICByZWFkRG9jdW1lbnQoc3RhdGUpOwogICAgICB9CiAgICAgIHJldHVybiBzdGF0ZS5kb2N1bWVudHM7CiAgICB9CiAgICBfX25hbWUobG9hZERvY3VtZW50cywgImxvYWREb2N1bWVudHMiKTsKICAgIGZ1bmN0aW9uIGxvYWRBbGwoaW5wdXQsIGl0ZXJhdG9yMiwgb3B0aW9ucykgewogICAgICBpZiAoaXRlcmF0b3IyICE9PSBudWxsICYmIHR5cGVvZiBpdGVyYXRvcjIgPT09ICJvYmplY3QiICYmIHR5cGVvZiBvcHRpb25zID09PSAidW5kZWZpbmVkIikgewogICAgICAgIG9wdGlvbnMgPSBpdGVyYXRvcjI7CiAgICAgICAgaXRlcmF0b3IyID0gbnVsbDsKICAgICAgfQogICAgICB2YXIgZG9jdW1lbnRzID0gbG9hZERvY3VtZW50cyhpbnB1dCwgb3B0aW9ucyk7CiAgICAgIGlmICh0eXBlb2YgaXRlcmF0b3IyICE9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50czsKICAgICAgfQogICAgICBmb3IgKHZhciBpbmRleDIgPSAwLCBsZW5ndGggPSBkb2N1bWVudHMubGVuZ3RoOyBpbmRleDIgPCBsZW5ndGg7IGluZGV4MiArPSAxKSB7CiAgICAgICAgaXRlcmF0b3IyKGRvY3VtZW50c1tpbmRleDJdKTsKICAgICAgfQogICAgfQogICAgX19uYW1lKGxvYWRBbGwsICJsb2FkQWxsIik7CiAgICBmdW5jdGlvbiBsb2FkKGlucHV0LCBvcHRpb25zKSB7CiAgICAgIHZhciBkb2N1bWVudHMgPSBsb2FkRG9jdW1lbnRzKGlucHV0LCBvcHRpb25zKTsKICAgICAgaWYgKGRvY3VtZW50cy5sZW5ndGggPT09IDApIHsKICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICB9IGVsc2UgaWYgKGRvY3VtZW50cy5sZW5ndGggPT09IDEpIHsKICAgICAgICByZXR1cm4gZG9jdW1lbnRzWzBdOwogICAgICB9CiAgICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCJleHBlY3RlZCBhIHNpbmdsZSBkb2N1bWVudCBpbiB0aGUgc3RyZWFtLCBidXQgZm91bmQgbW9yZSIpOwogICAgfQogICAgX19uYW1lKGxvYWQsICJsb2FkIik7CiAgICBmdW5jdGlvbiBzYWZlTG9hZEFsbChpbnB1dCwgaXRlcmF0b3IyLCBvcHRpb25zKSB7CiAgICAgIGlmICh0eXBlb2YgaXRlcmF0b3IyID09PSAib2JqZWN0IiAmJiBpdGVyYXRvcjIgIT09IG51bGwgJiYgdHlwZW9mIG9wdGlvbnMgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgb3B0aW9ucyA9IGl0ZXJhdG9yMjsKICAgICAgICBpdGVyYXRvcjIgPSBudWxsOwogICAgICB9CiAgICAgIHJldHVybiBsb2FkQWxsKGlucHV0LCBpdGVyYXRvcjIsIGNvbW1vbi5leHRlbmQoeyBzY2hlbWE6IERFRkFVTFRfU0FGRV9TQ0hFTUEgfSwgb3B0aW9ucykpOwogICAgfQogICAgX19uYW1lKHNhZmVMb2FkQWxsLCAic2FmZUxvYWRBbGwiKTsKICAgIGZ1bmN0aW9uIHNhZmVMb2FkKGlucHV0LCBvcHRpb25zKSB7CiAgICAgIHJldHVybiBsb2FkKGlucHV0LCBjb21tb24uZXh0ZW5kKHsgc2NoZW1hOiBERUZBVUxUX1NBRkVfU0NIRU1BIH0sIG9wdGlvbnMpKTsKICAgIH0KICAgIF9fbmFtZShzYWZlTG9hZCwgInNhZmVMb2FkIik7CiAgICBtb2R1bGUuZXhwb3J0cy5sb2FkQWxsID0gbG9hZEFsbDsKICAgIG1vZHVsZS5leHBvcnRzLmxvYWQgPSBsb2FkOwogICAgbW9kdWxlLmV4cG9ydHMuc2FmZUxvYWRBbGwgPSBzYWZlTG9hZEFsbDsKICAgIG1vZHVsZS5leHBvcnRzLnNhZmVMb2FkID0gc2FmZUxvYWQ7CiAgICB2YXIgaTEwOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvZHVtcGVyLmpzCnZhciByZXF1aXJlX2R1bXBlciA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvZHVtcGVyLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBjb21tb24gPSByZXF1aXJlX2NvbW1vbigpOwogICAgdmFyIFlBTUxFeGNlcHRpb24gPSByZXF1aXJlX2V4Y2VwdGlvbigpOwogICAgdmFyIERFRkFVTFRfRlVMTF9TQ0hFTUEgPSByZXF1aXJlX2RlZmF1bHRfZnVsbCgpOwogICAgdmFyIERFRkFVTFRfU0FGRV9TQ0hFTUEgPSByZXF1aXJlX2RlZmF1bHRfc2FmZSgpOwogICAgdmFyIF90b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7CiAgICB2YXIgX2hhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTsKICAgIHZhciBDSEFSX1RBQiA9IDk7CiAgICB2YXIgQ0hBUl9MSU5FX0ZFRUQgPSAxMDsKICAgIHZhciBDSEFSX0NBUlJJQUdFX1JFVFVSTiA9IDEzOwogICAgdmFyIENIQVJfU1BBQ0UgPSAzMjsKICAgIHZhciBDSEFSX0VYQ0xBTUFUSU9OID0gMzM7CiAgICB2YXIgQ0hBUl9ET1VCTEVfUVVPVEUgPSAzNDsKICAgIHZhciBDSEFSX1NIQVJQID0gMzU7CiAgICB2YXIgQ0hBUl9QRVJDRU5UID0gMzc7CiAgICB2YXIgQ0hBUl9BTVBFUlNBTkQgPSAzODsKICAgIHZhciBDSEFSX1NJTkdMRV9RVU9URSA9IDM5OwogICAgdmFyIENIQVJfQVNURVJJU0sgPSA0MjsKICAgIHZhciBDSEFSX0NPTU1BID0gNDQ7CiAgICB2YXIgQ0hBUl9NSU5VUyA9IDQ1OwogICAgdmFyIENIQVJfQ09MT04gPSA1ODsKICAgIHZhciBDSEFSX0VRVUFMUyA9IDYxOwogICAgdmFyIENIQVJfR1JFQVRFUl9USEFOID0gNjI7CiAgICB2YXIgQ0hBUl9RVUVTVElPTiA9IDYzOwogICAgdmFyIENIQVJfQ09NTUVSQ0lBTF9BVCA9IDY0OwogICAgdmFyIENIQVJfTEVGVF9TUVVBUkVfQlJBQ0tFVCA9IDkxOwogICAgdmFyIENIQVJfUklHSFRfU1FVQVJFX0JSQUNLRVQgPSA5MzsKICAgIHZhciBDSEFSX0dSQVZFX0FDQ0VOVCA9IDk2OwogICAgdmFyIENIQVJfTEVGVF9DVVJMWV9CUkFDS0VUID0gMTIzOwogICAgdmFyIENIQVJfVkVSVElDQUxfTElORSA9IDEyNDsKICAgIHZhciBDSEFSX1JJR0hUX0NVUkxZX0JSQUNLRVQgPSAxMjU7CiAgICB2YXIgRVNDQVBFX1NFUVVFTkNFUyA9IHt9OwogICAgRVNDQVBFX1NFUVVFTkNFU1swXSA9ICJcXDAiOwogICAgRVNDQVBFX1NFUVVFTkNFU1s3XSA9ICJcXGEiOwogICAgRVNDQVBFX1NFUVVFTkNFU1s4XSA9ICJcXGIiOwogICAgRVNDQVBFX1NFUVVFTkNFU1s5XSA9ICJcXHQiOwogICAgRVNDQVBFX1NFUVVFTkNFU1sxMF0gPSAiXFxuIjsKICAgIEVTQ0FQRV9TRVFVRU5DRVNbMTFdID0gIlxcdiI7CiAgICBFU0NBUEVfU0VRVUVOQ0VTWzEyXSA9ICJcXGYiOwogICAgRVNDQVBFX1NFUVVFTkNFU1sxM10gPSAiXFxyIjsKICAgIEVTQ0FQRV9TRVFVRU5DRVNbMjddID0gIlxcZSI7CiAgICBFU0NBUEVfU0VRVUVOQ0VTWzM0XSA9ICdcXCInOwogICAgRVNDQVBFX1NFUVVFTkNFU1s5Ml0gPSAiXFxcXCI7CiAgICBFU0NBUEVfU0VRVUVOQ0VTWzEzM10gPSAiXFxOIjsKICAgIEVTQ0FQRV9TRVFVRU5DRVNbMTYwXSA9ICJcXF8iOwogICAgRVNDQVBFX1NFUVVFTkNFU1s4MjMyXSA9ICJcXEwiOwogICAgRVNDQVBFX1NFUVVFTkNFU1s4MjMzXSA9ICJcXFAiOwogICAgdmFyIERFUFJFQ0FURURfQk9PTEVBTlNfU1lOVEFYID0gWwogICAgICAieSIsCiAgICAgICJZIiwKICAgICAgInllcyIsCiAgICAgICJZZXMiLAogICAgICAiWUVTIiwKICAgICAgIm9uIiwKICAgICAgIk9uIiwKICAgICAgIk9OIiwKICAgICAgIm4iLAogICAgICAiTiIsCiAgICAgICJubyIsCiAgICAgICJObyIsCiAgICAgICJOTyIsCiAgICAgICJvZmYiLAogICAgICAiT2ZmIiwKICAgICAgIk9GRiIKICAgIF07CiAgICBmdW5jdGlvbiBjb21waWxlU3R5bGVNYXAoc2NoZW1hLCBtYXA3KSB7CiAgICAgIHZhciByZXN1bHQsIGtleXMyLCBpbmRleDIsIGxlbmd0aCwgdGFnLCBzdHlsZSwgdHlwZTU7CiAgICAgIGlmIChtYXA3ID09PSBudWxsKSByZXR1cm4ge307CiAgICAgIHJlc3VsdCA9IHt9OwogICAgICBrZXlzMiA9IE9iamVjdC5rZXlzKG1hcDcpOwogICAgICBmb3IgKGluZGV4MiA9IDAsIGxlbmd0aCA9IGtleXMyLmxlbmd0aDsgaW5kZXgyIDwgbGVuZ3RoOyBpbmRleDIgKz0gMSkgewogICAgICAgIHRhZyA9IGtleXMyW2luZGV4Ml07CiAgICAgICAgc3R5bGUgPSBTdHJpbmcobWFwN1t0YWddKTsKICAgICAgICBpZiAodGFnLnNsaWNlKDAsIDIpID09PSAiISEiKSB7CiAgICAgICAgICB0YWcgPSAidGFnOnlhbWwub3JnLDIwMDI6IiArIHRhZy5zbGljZSgyKTsKICAgICAgICB9CiAgICAgICAgdHlwZTUgPSBzY2hlbWEuY29tcGlsZWRUeXBlTWFwWyJmYWxsYmFjayJdW3RhZ107CiAgICAgICAgaWYgKHR5cGU1ICYmIF9oYXNPd25Qcm9wZXJ0eS5jYWxsKHR5cGU1LnN0eWxlQWxpYXNlcywgc3R5bGUpKSB7CiAgICAgICAgICBzdHlsZSA9IHR5cGU1LnN0eWxlQWxpYXNlc1tzdHlsZV07CiAgICAgICAgfQogICAgICAgIHJlc3VsdFt0YWddID0gc3R5bGU7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIF9fbmFtZShjb21waWxlU3R5bGVNYXAsICJjb21waWxlU3R5bGVNYXAiKTsKICAgIGZ1bmN0aW9uIGVuY29kZUhleChjaGFyYWN0ZXIpIHsKICAgICAgdmFyIHN0cmluZzMsIGhhbmRsZTMsIGxlbmd0aDsKICAgICAgc3RyaW5nMyA9IGNoYXJhY3Rlci50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTsKICAgICAgaWYgKGNoYXJhY3RlciA8PSAyNTUpIHsKICAgICAgICBoYW5kbGUzID0gIngiOwogICAgICAgIGxlbmd0aCA9IDI7CiAgICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyIDw9IDY1NTM1KSB7CiAgICAgICAgaGFuZGxlMyA9ICJ1IjsKICAgICAgICBsZW5ndGggPSA0OwogICAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciA8PSA0Mjk0OTY3Mjk1KSB7CiAgICAgICAgaGFuZGxlMyA9ICJVIjsKICAgICAgICBsZW5ndGggPSA4OwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCJjb2RlIHBvaW50IHdpdGhpbiBhIHN0cmluZyBtYXkgbm90IGJlIGdyZWF0ZXIgdGhhbiAweEZGRkZGRkZGIik7CiAgICAgIH0KICAgICAgcmV0dXJuICJcXCIgKyBoYW5kbGUzICsgY29tbW9uLnJlcGVhdCgiMCIsIGxlbmd0aCAtIHN0cmluZzMubGVuZ3RoKSArIHN0cmluZzM7CiAgICB9CiAgICBfX25hbWUoZW5jb2RlSGV4LCAiZW5jb2RlSGV4Iik7CiAgICBmdW5jdGlvbiBTdGF0ZShvcHRpb25zKSB7CiAgICAgIHRoaXMuc2NoZW1hID0gb3B0aW9uc1sic2NoZW1hIl0gfHwgREVGQVVMVF9GVUxMX1NDSEVNQTsKICAgICAgdGhpcy5pbmRlbnQgPSBNYXRoLm1heCgxLCBvcHRpb25zWyJpbmRlbnQiXSB8fCAyKTsKICAgICAgdGhpcy5ub0FycmF5SW5kZW50ID0gb3B0aW9uc1sibm9BcnJheUluZGVudCJdIHx8IGZhbHNlOwogICAgICB0aGlzLnNraXBJbnZhbGlkID0gb3B0aW9uc1sic2tpcEludmFsaWQiXSB8fCBmYWxzZTsKICAgICAgdGhpcy5mbG93TGV2ZWwgPSBjb21tb24uaXNOb3RoaW5nKG9wdGlvbnNbImZsb3dMZXZlbCJdKSA/IC0xIDogb3B0aW9uc1siZmxvd0xldmVsIl07CiAgICAgIHRoaXMuc3R5bGVNYXAgPSBjb21waWxlU3R5bGVNYXAodGhpcy5zY2hlbWEsIG9wdGlvbnNbInN0eWxlcyJdIHx8IG51bGwpOwogICAgICB0aGlzLnNvcnRLZXlzID0gb3B0aW9uc1sic29ydEtleXMiXSB8fCBmYWxzZTsKICAgICAgdGhpcy5saW5lV2lkdGggPSBvcHRpb25zWyJsaW5lV2lkdGgiXSB8fCA4MDsKICAgICAgdGhpcy5ub1JlZnMgPSBvcHRpb25zWyJub1JlZnMiXSB8fCBmYWxzZTsKICAgICAgdGhpcy5ub0NvbXBhdE1vZGUgPSBvcHRpb25zWyJub0NvbXBhdE1vZGUiXSB8fCBmYWxzZTsKICAgICAgdGhpcy5jb25kZW5zZUZsb3cgPSBvcHRpb25zWyJjb25kZW5zZUZsb3ciXSB8fCBmYWxzZTsKICAgICAgdGhpcy5pbXBsaWNpdFR5cGVzID0gdGhpcy5zY2hlbWEuY29tcGlsZWRJbXBsaWNpdDsKICAgICAgdGhpcy5leHBsaWNpdFR5cGVzID0gdGhpcy5zY2hlbWEuY29tcGlsZWRFeHBsaWNpdDsKICAgICAgdGhpcy50YWcgPSBudWxsOwogICAgICB0aGlzLnJlc3VsdCA9ICIiOwogICAgICB0aGlzLmR1cGxpY2F0ZXMgPSBbXTsKICAgICAgdGhpcy51c2VkRHVwbGljYXRlcyA9IG51bGw7CiAgICB9CiAgICBfX25hbWUoU3RhdGUsICJTdGF0ZSIpOwogICAgZnVuY3Rpb24gaW5kZW50U3RyaW5nKHN0cmluZzMsIHNwYWNlcykgewogICAgICB2YXIgaW5kID0gY29tbW9uLnJlcGVhdCgiICIsIHNwYWNlcyksIHBvc2l0aW9uMyA9IDAsIG5leHQyID0gLTEsIHJlc3VsdCA9ICIiLCBsaW5lLCBsZW5ndGggPSBzdHJpbmczLmxlbmd0aDsKICAgICAgd2hpbGUgKHBvc2l0aW9uMyA8IGxlbmd0aCkgewogICAgICAgIG5leHQyID0gc3RyaW5nMy5pbmRleE9mKCJcbiIsIHBvc2l0aW9uMyk7CiAgICAgICAgaWYgKG5leHQyID09PSAtMSkgewogICAgICAgICAgbGluZSA9IHN0cmluZzMuc2xpY2UocG9zaXRpb24zKTsKICAgICAgICAgIHBvc2l0aW9uMyA9IGxlbmd0aDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbGluZSA9IHN0cmluZzMuc2xpY2UocG9zaXRpb24zLCBuZXh0MiArIDEpOwogICAgICAgICAgcG9zaXRpb24zID0gbmV4dDIgKyAxOwogICAgICAgIH0KICAgICAgICBpZiAobGluZS5sZW5ndGggJiYgbGluZSAhPT0gIlxuIikgcmVzdWx0ICs9IGluZDsKICAgICAgICByZXN1bHQgKz0gbGluZTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgX19uYW1lKGluZGVudFN0cmluZywgImluZGVudFN0cmluZyIpOwogICAgZnVuY3Rpb24gZ2VuZXJhdGVOZXh0TGluZShzdGF0ZSwgbGV2ZWwpIHsKICAgICAgcmV0dXJuICJcbiIgKyBjb21tb24ucmVwZWF0KCIgIiwgc3RhdGUuaW5kZW50ICogbGV2ZWwpOwogICAgfQogICAgX19uYW1lKGdlbmVyYXRlTmV4dExpbmUsICJnZW5lcmF0ZU5leHRMaW5lIik7CiAgICBmdW5jdGlvbiB0ZXN0SW1wbGljaXRSZXNvbHZpbmcoc3RhdGUsIHN0cikgewogICAgICB2YXIgaW5kZXgyLCBsZW5ndGgsIHR5cGU1OwogICAgICBmb3IgKGluZGV4MiA9IDAsIGxlbmd0aCA9IHN0YXRlLmltcGxpY2l0VHlwZXMubGVuZ3RoOyBpbmRleDIgPCBsZW5ndGg7IGluZGV4MiArPSAxKSB7CiAgICAgICAgdHlwZTUgPSBzdGF0ZS5pbXBsaWNpdFR5cGVzW2luZGV4Ml07CiAgICAgICAgaWYgKHR5cGU1LnJlc29sdmUoc3RyKSkgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIF9fbmFtZSh0ZXN0SW1wbGljaXRSZXNvbHZpbmcsICJ0ZXN0SW1wbGljaXRSZXNvbHZpbmciKTsKICAgIGZ1bmN0aW9uIGlzV2hpdGVzcGFjZShjMTApIHsKICAgICAgcmV0dXJuIGMxMCA9PT0gQ0hBUl9TUEFDRSB8fCBjMTAgPT09IENIQVJfVEFCOwogICAgfQogICAgX19uYW1lKGlzV2hpdGVzcGFjZSwgImlzV2hpdGVzcGFjZSIpOwogICAgZnVuY3Rpb24gaXNQcmludGFibGUoYzEwKSB7CiAgICAgIHJldHVybiAzMiA8PSBjMTAgJiYgYzEwIDw9IDEyNiB8fCAxNjEgPD0gYzEwICYmIGMxMCA8PSA1NTI5NSAmJiBjMTAgIT09IDgyMzIgJiYgYzEwICE9PSA4MjMzIHx8IDU3MzQ0IDw9IGMxMCAmJiBjMTAgPD0gNjU1MzMgJiYgYzEwICE9PSA2NTI3OSB8fCA2NTUzNiA8PSBjMTAgJiYgYzEwIDw9IDExMTQxMTE7CiAgICB9CiAgICBfX25hbWUoaXNQcmludGFibGUsICJpc1ByaW50YWJsZSIpOwogICAgZnVuY3Rpb24gaXNOc0NoYXIoYzEwKSB7CiAgICAgIHJldHVybiBpc1ByaW50YWJsZShjMTApICYmICFpc1doaXRlc3BhY2UoYzEwKSAmJiBjMTAgIT09IDY1Mjc5ICYmIGMxMCAhPT0gQ0hBUl9DQVJSSUFHRV9SRVRVUk4gJiYgYzEwICE9PSBDSEFSX0xJTkVfRkVFRDsKICAgIH0KICAgIF9fbmFtZShpc05zQ2hhciwgImlzTnNDaGFyIik7CiAgICBmdW5jdGlvbiBpc1BsYWluU2FmZShjMTAsIHByZXYpIHsKICAgICAgcmV0dXJuIGlzUHJpbnRhYmxlKGMxMCkgJiYgYzEwICE9PSA2NTI3OSAmJiBjMTAgIT09IENIQVJfQ09NTUEgJiYgYzEwICE9PSBDSEFSX0xFRlRfU1FVQVJFX0JSQUNLRVQgJiYgYzEwICE9PSBDSEFSX1JJR0hUX1NRVUFSRV9CUkFDS0VUICYmIGMxMCAhPT0gQ0hBUl9MRUZUX0NVUkxZX0JSQUNLRVQgJiYgYzEwICE9PSBDSEFSX1JJR0hUX0NVUkxZX0JSQUNLRVQgJiYgYzEwICE9PSBDSEFSX0NPTE9OICYmIChjMTAgIT09IENIQVJfU0hBUlAgfHwgcHJldiAmJiBpc05zQ2hhcihwcmV2KSk7CiAgICB9CiAgICBfX25hbWUoaXNQbGFpblNhZmUsICJpc1BsYWluU2FmZSIpOwogICAgZnVuY3Rpb24gaXNQbGFpblNhZmVGaXJzdChjMTApIHsKICAgICAgcmV0dXJuIGlzUHJpbnRhYmxlKGMxMCkgJiYgYzEwICE9PSA2NTI3OSAmJiAhaXNXaGl0ZXNwYWNlKGMxMCkgJiYgYzEwICE9PSBDSEFSX01JTlVTICYmIGMxMCAhPT0gQ0hBUl9RVUVTVElPTiAmJiBjMTAgIT09IENIQVJfQ09MT04gJiYgYzEwICE9PSBDSEFSX0NPTU1BICYmIGMxMCAhPT0gQ0hBUl9MRUZUX1NRVUFSRV9CUkFDS0VUICYmIGMxMCAhPT0gQ0hBUl9SSUdIVF9TUVVBUkVfQlJBQ0tFVCAmJiBjMTAgIT09IENIQVJfTEVGVF9DVVJMWV9CUkFDS0VUICYmIGMxMCAhPT0gQ0hBUl9SSUdIVF9DVVJMWV9CUkFDS0VUICYmIGMxMCAhPT0gQ0hBUl9TSEFSUCAmJiBjMTAgIT09IENIQVJfQU1QRVJTQU5EICYmIGMxMCAhPT0gQ0hBUl9BU1RFUklTSyAmJiBjMTAgIT09IENIQVJfRVhDTEFNQVRJT04gJiYgYzEwICE9PSBDSEFSX1ZFUlRJQ0FMX0xJTkUgJiYgYzEwICE9PSBDSEFSX0VRVUFMUyAmJiBjMTAgIT09IENIQVJfR1JFQVRFUl9USEFOICYmIGMxMCAhPT0gQ0hBUl9TSU5HTEVfUVVPVEUgJiYgYzEwICE9PSBDSEFSX0RPVUJMRV9RVU9URSAmJiBjMTAgIT09IENIQVJfUEVSQ0VOVCAmJiBjMTAgIT09IENIQVJfQ09NTUVSQ0lBTF9BVCAmJiBjMTAgIT09IENIQVJfR1JBVkVfQUNDRU5UOwogICAgfQogICAgX19uYW1lKGlzUGxhaW5TYWZlRmlyc3QsICJpc1BsYWluU2FmZUZpcnN0Iik7CiAgICBmdW5jdGlvbiBuZWVkSW5kZW50SW5kaWNhdG9yKHN0cmluZzMpIHsKICAgICAgdmFyIGxlYWRpbmdTcGFjZVJlID0gL15cbiogLzsKICAgICAgcmV0dXJuIGxlYWRpbmdTcGFjZVJlLnRlc3Qoc3RyaW5nMyk7CiAgICB9CiAgICBfX25hbWUobmVlZEluZGVudEluZGljYXRvciwgIm5lZWRJbmRlbnRJbmRpY2F0b3IiKTsKICAgIHZhciBTVFlMRV9QTEFJTiA9IDEsIFNUWUxFX1NJTkdMRSA9IDIsIFNUWUxFX0xJVEVSQUwgPSAzLCBTVFlMRV9GT0xERUQgPSA0LCBTVFlMRV9ET1VCTEUgPSA1OwogICAgZnVuY3Rpb24gY2hvb3NlU2NhbGFyU3R5bGUoc3RyaW5nMywgc2luZ2xlTGluZU9ubHksIGluZGVudFBlckxldmVsLCBsaW5lV2lkdGgsIHRlc3RBbWJpZ3VvdXNUeXBlKSB7CiAgICAgIHZhciBpMTA7CiAgICAgIHZhciBjaGFyLCBwcmV2X2NoYXI7CiAgICAgIHZhciBoYXNMaW5lQnJlYWsgPSBmYWxzZTsKICAgICAgdmFyIGhhc0ZvbGRhYmxlTGluZSA9IGZhbHNlOwogICAgICB2YXIgc2hvdWxkVHJhY2tXaWR0aCA9IGxpbmVXaWR0aCAhPT0gLTE7CiAgICAgIHZhciBwcmV2aW91c0xpbmVCcmVhayA9IC0xOwogICAgICB2YXIgcGxhaW4gPSBpc1BsYWluU2FmZUZpcnN0KHN0cmluZzMuY2hhckNvZGVBdCgwKSkgJiYgIWlzV2hpdGVzcGFjZShzdHJpbmczLmNoYXJDb2RlQXQoc3RyaW5nMy5sZW5ndGggLSAxKSk7CiAgICAgIGlmIChzaW5nbGVMaW5lT25seSkgewogICAgICAgIGZvciAoaTEwID0gMDsgaTEwIDwgc3RyaW5nMy5sZW5ndGg7IGkxMCsrKSB7CiAgICAgICAgICBjaGFyID0gc3RyaW5nMy5jaGFyQ29kZUF0KGkxMCk7CiAgICAgICAgICBpZiAoIWlzUHJpbnRhYmxlKGNoYXIpKSB7CiAgICAgICAgICAgIHJldHVybiBTVFlMRV9ET1VCTEU7CiAgICAgICAgICB9CiAgICAgICAgICBwcmV2X2NoYXIgPSBpMTAgPiAwID8gc3RyaW5nMy5jaGFyQ29kZUF0KGkxMCAtIDEpIDogbnVsbDsKICAgICAgICAgIHBsYWluID0gcGxhaW4gJiYgaXNQbGFpblNhZmUoY2hhciwgcHJldl9jaGFyKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yIChpMTAgPSAwOyBpMTAgPCBzdHJpbmczLmxlbmd0aDsgaTEwKyspIHsKICAgICAgICAgIGNoYXIgPSBzdHJpbmczLmNoYXJDb2RlQXQoaTEwKTsKICAgICAgICAgIGlmIChjaGFyID09PSBDSEFSX0xJTkVfRkVFRCkgewogICAgICAgICAgICBoYXNMaW5lQnJlYWsgPSB0cnVlOwogICAgICAgICAgICBpZiAoc2hvdWxkVHJhY2tXaWR0aCkgewogICAgICAgICAgICAgIGhhc0ZvbGRhYmxlTGluZSA9IGhhc0ZvbGRhYmxlTGluZSB8fCAvLyBGb2xkYWJsZSBsaW5lID0gdG9vIGxvbmcsIGFuZCBub3QgbW9yZS1pbmRlbnRlZC4KICAgICAgICAgICAgICBpMTAgLSBwcmV2aW91c0xpbmVCcmVhayAtIDEgPiBsaW5lV2lkdGggJiYgc3RyaW5nM1twcmV2aW91c0xpbmVCcmVhayArIDFdICE9PSAiICI7CiAgICAgICAgICAgICAgcHJldmlvdXNMaW5lQnJlYWsgPSBpMTA7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAoIWlzUHJpbnRhYmxlKGNoYXIpKSB7CiAgICAgICAgICAgIHJldHVybiBTVFlMRV9ET1VCTEU7CiAgICAgICAgICB9CiAgICAgICAgICBwcmV2X2NoYXIgPSBpMTAgPiAwID8gc3RyaW5nMy5jaGFyQ29kZUF0KGkxMCAtIDEpIDogbnVsbDsKICAgICAgICAgIHBsYWluID0gcGxhaW4gJiYgaXNQbGFpblNhZmUoY2hhciwgcHJldl9jaGFyKTsKICAgICAgICB9CiAgICAgICAgaGFzRm9sZGFibGVMaW5lID0gaGFzRm9sZGFibGVMaW5lIHx8IHNob3VsZFRyYWNrV2lkdGggJiYgKGkxMCAtIHByZXZpb3VzTGluZUJyZWFrIC0gMSA+IGxpbmVXaWR0aCAmJiBzdHJpbmczW3ByZXZpb3VzTGluZUJyZWFrICsgMV0gIT09ICIgIik7CiAgICAgIH0KICAgICAgaWYgKCFoYXNMaW5lQnJlYWsgJiYgIWhhc0ZvbGRhYmxlTGluZSkgewogICAgICAgIHJldHVybiBwbGFpbiAmJiAhdGVzdEFtYmlndW91c1R5cGUoc3RyaW5nMykgPyBTVFlMRV9QTEFJTiA6IFNUWUxFX1NJTkdMRTsKICAgICAgfQogICAgICBpZiAoaW5kZW50UGVyTGV2ZWwgPiA5ICYmIG5lZWRJbmRlbnRJbmRpY2F0b3Ioc3RyaW5nMykpIHsKICAgICAgICByZXR1cm4gU1RZTEVfRE9VQkxFOwogICAgICB9CiAgICAgIHJldHVybiBoYXNGb2xkYWJsZUxpbmUgPyBTVFlMRV9GT0xERUQgOiBTVFlMRV9MSVRFUkFMOwogICAgfQogICAgX19uYW1lKGNob29zZVNjYWxhclN0eWxlLCAiY2hvb3NlU2NhbGFyU3R5bGUiKTsKICAgIGZ1bmN0aW9uIHdyaXRlU2NhbGFyKHN0YXRlLCBzdHJpbmczLCBsZXZlbCwgaXNrZXkpIHsKICAgICAgc3RhdGUuZHVtcCA9IChmdW5jdGlvbigpIHsKICAgICAgICBpZiAoc3RyaW5nMy5sZW5ndGggPT09IDApIHsKICAgICAgICAgIHJldHVybiAiJyciOwogICAgICAgIH0KICAgICAgICBpZiAoIXN0YXRlLm5vQ29tcGF0TW9kZSAmJiBERVBSRUNBVEVEX0JPT0xFQU5TX1NZTlRBWC5pbmRleE9mKHN0cmluZzMpICE9PSAtMSkgewogICAgICAgICAgcmV0dXJuICInIiArIHN0cmluZzMgKyAiJyI7CiAgICAgICAgfQogICAgICAgIHZhciBpbmRlbnQzID0gc3RhdGUuaW5kZW50ICogTWF0aC5tYXgoMSwgbGV2ZWwpOwogICAgICAgIHZhciBsaW5lV2lkdGggPSBzdGF0ZS5saW5lV2lkdGggPT09IC0xID8gLTEgOiBNYXRoLm1heChNYXRoLm1pbihzdGF0ZS5saW5lV2lkdGgsIDQwKSwgc3RhdGUubGluZVdpZHRoIC0gaW5kZW50Myk7CiAgICAgICAgdmFyIHNpbmdsZUxpbmVPbmx5ID0gaXNrZXkgfHwgc3RhdGUuZmxvd0xldmVsID4gLTEgJiYgbGV2ZWwgPj0gc3RhdGUuZmxvd0xldmVsOwogICAgICAgIGZ1bmN0aW9uIHRlc3RBbWJpZ3VpdHkoc3RyaW5nNCkgewogICAgICAgICAgcmV0dXJuIHRlc3RJbXBsaWNpdFJlc29sdmluZyhzdGF0ZSwgc3RyaW5nNCk7CiAgICAgICAgfQogICAgICAgIF9fbmFtZSh0ZXN0QW1iaWd1aXR5LCAidGVzdEFtYmlndWl0eSIpOwogICAgICAgIHN3aXRjaCAoY2hvb3NlU2NhbGFyU3R5bGUoc3RyaW5nMywgc2luZ2xlTGluZU9ubHksIHN0YXRlLmluZGVudCwgbGluZVdpZHRoLCB0ZXN0QW1iaWd1aXR5KSkgewogICAgICAgICAgY2FzZSBTVFlMRV9QTEFJTjoKICAgICAgICAgICAgcmV0dXJuIHN0cmluZzM7CiAgICAgICAgICBjYXNlIFNUWUxFX1NJTkdMRToKICAgICAgICAgICAgcmV0dXJuICInIiArIHN0cmluZzMucmVwbGFjZSgvJy9nLCAiJyciKSArICInIjsKICAgICAgICAgIGNhc2UgU1RZTEVfTElURVJBTDoKICAgICAgICAgICAgcmV0dXJuICJ8IiArIGJsb2NrSGVhZGVyKHN0cmluZzMsIHN0YXRlLmluZGVudCkgKyBkcm9wRW5kaW5nTmV3bGluZShpbmRlbnRTdHJpbmcoc3RyaW5nMywgaW5kZW50MykpOwogICAgICAgICAgY2FzZSBTVFlMRV9GT0xERUQ6CiAgICAgICAgICAgIHJldHVybiAiPiIgKyBibG9ja0hlYWRlcihzdHJpbmczLCBzdGF0ZS5pbmRlbnQpICsgZHJvcEVuZGluZ05ld2xpbmUoaW5kZW50U3RyaW5nKGZvbGRTdHJpbmcoc3RyaW5nMywgbGluZVdpZHRoKSwgaW5kZW50MykpOwogICAgICAgICAgY2FzZSBTVFlMRV9ET1VCTEU6CiAgICAgICAgICAgIHJldHVybiAnIicgKyBlc2NhcGVTdHJpbmcoc3RyaW5nMywgbGluZVdpZHRoKSArICciJzsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCJpbXBvc3NpYmxlIGVycm9yOiBpbnZhbGlkIHNjYWxhciBzdHlsZSIpOwogICAgICAgIH0KICAgICAgfSkoKTsKICAgIH0KICAgIF9fbmFtZSh3cml0ZVNjYWxhciwgIndyaXRlU2NhbGFyIik7CiAgICBmdW5jdGlvbiBibG9ja0hlYWRlcihzdHJpbmczLCBpbmRlbnRQZXJMZXZlbCkgewogICAgICB2YXIgaW5kZW50SW5kaWNhdG9yID0gbmVlZEluZGVudEluZGljYXRvcihzdHJpbmczKSA/IFN0cmluZyhpbmRlbnRQZXJMZXZlbCkgOiAiIjsKICAgICAgdmFyIGNsaXAgPSBzdHJpbmczW3N0cmluZzMubGVuZ3RoIC0gMV0gPT09ICJcbiI7CiAgICAgIHZhciBrZWVwID0gY2xpcCAmJiAoc3RyaW5nM1tzdHJpbmczLmxlbmd0aCAtIDJdID09PSAiXG4iIHx8IHN0cmluZzMgPT09ICJcbiIpOwogICAgICB2YXIgY2hvbXAgPSBrZWVwID8gIisiIDogY2xpcCA/ICIiIDogIi0iOwogICAgICByZXR1cm4gaW5kZW50SW5kaWNhdG9yICsgY2hvbXAgKyAiXG4iOwogICAgfQogICAgX19uYW1lKGJsb2NrSGVhZGVyLCAiYmxvY2tIZWFkZXIiKTsKICAgIGZ1bmN0aW9uIGRyb3BFbmRpbmdOZXdsaW5lKHN0cmluZzMpIHsKICAgICAgcmV0dXJuIHN0cmluZzNbc3RyaW5nMy5sZW5ndGggLSAxXSA9PT0gIlxuIiA/IHN0cmluZzMuc2xpY2UoMCwgLTEpIDogc3RyaW5nMzsKICAgIH0KICAgIF9fbmFtZShkcm9wRW5kaW5nTmV3bGluZSwgImRyb3BFbmRpbmdOZXdsaW5lIik7CiAgICBmdW5jdGlvbiBmb2xkU3RyaW5nKHN0cmluZzMsIHdpZHRoKSB7CiAgICAgIHZhciBsaW5lUmUgPSAvKFxuKykoW15cbl0qKS9nOwogICAgICB2YXIgcmVzdWx0ID0gKGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBuZXh0TEYgPSBzdHJpbmczLmluZGV4T2YoIlxuIik7CiAgICAgICAgbmV4dExGID0gbmV4dExGICE9PSAtMSA/IG5leHRMRiA6IHN0cmluZzMubGVuZ3RoOwogICAgICAgIGxpbmVSZS5sYXN0SW5kZXggPSBuZXh0TEY7CiAgICAgICAgcmV0dXJuIGZvbGRMaW5lKHN0cmluZzMuc2xpY2UoMCwgbmV4dExGKSwgd2lkdGgpOwogICAgICB9KSgpOwogICAgICB2YXIgcHJldk1vcmVJbmRlbnRlZCA9IHN0cmluZzNbMF0gPT09ICJcbiIgfHwgc3RyaW5nM1swXSA9PT0gIiAiOwogICAgICB2YXIgbW9yZUluZGVudGVkOwogICAgICB2YXIgbWF0Y2gyOwogICAgICB3aGlsZSAobWF0Y2gyID0gbGluZVJlLmV4ZWMoc3RyaW5nMykpIHsKICAgICAgICB2YXIgcHJlZml4ID0gbWF0Y2gyWzFdLCBsaW5lID0gbWF0Y2gyWzJdOwogICAgICAgIG1vcmVJbmRlbnRlZCA9IGxpbmVbMF0gPT09ICIgIjsKICAgICAgICByZXN1bHQgKz0gcHJlZml4ICsgKCFwcmV2TW9yZUluZGVudGVkICYmICFtb3JlSW5kZW50ZWQgJiYgbGluZSAhPT0gIiIgPyAiXG4iIDogIiIpICsgZm9sZExpbmUobGluZSwgd2lkdGgpOwogICAgICAgIHByZXZNb3JlSW5kZW50ZWQgPSBtb3JlSW5kZW50ZWQ7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIF9fbmFtZShmb2xkU3RyaW5nLCAiZm9sZFN0cmluZyIpOwogICAgZnVuY3Rpb24gZm9sZExpbmUobGluZSwgd2lkdGgpIHsKICAgICAgaWYgKGxpbmUgPT09ICIiIHx8IGxpbmVbMF0gPT09ICIgIikgcmV0dXJuIGxpbmU7CiAgICAgIHZhciBicmVha1JlID0gLyBbXiBdL2c7CiAgICAgIHZhciBtYXRjaDI7CiAgICAgIHZhciBzdGFydCA9IDAsIGVuZCwgY3VyciA9IDAsIG5leHQyID0gMDsKICAgICAgdmFyIHJlc3VsdCA9ICIiOwogICAgICB3aGlsZSAobWF0Y2gyID0gYnJlYWtSZS5leGVjKGxpbmUpKSB7CiAgICAgICAgbmV4dDIgPSBtYXRjaDIuaW5kZXg7CiAgICAgICAgaWYgKG5leHQyIC0gc3RhcnQgPiB3aWR0aCkgewogICAgICAgICAgZW5kID0gY3VyciA+IHN0YXJ0ID8gY3VyciA6IG5leHQyOwogICAgICAgICAgcmVzdWx0ICs9ICJcbiIgKyBsaW5lLnNsaWNlKHN0YXJ0LCBlbmQpOwogICAgICAgICAgc3RhcnQgPSBlbmQgKyAxOwogICAgICAgIH0KICAgICAgICBjdXJyID0gbmV4dDI7CiAgICAgIH0KICAgICAgcmVzdWx0ICs9ICJcbiI7CiAgICAgIGlmIChsaW5lLmxlbmd0aCAtIHN0YXJ0ID4gd2lkdGggJiYgY3VyciA+IHN0YXJ0KSB7CiAgICAgICAgcmVzdWx0ICs9IGxpbmUuc2xpY2Uoc3RhcnQsIGN1cnIpICsgIlxuIiArIGxpbmUuc2xpY2UoY3VyciArIDEpOwogICAgICB9IGVsc2UgewogICAgICAgIHJlc3VsdCArPSBsaW5lLnNsaWNlKHN0YXJ0KTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0LnNsaWNlKDEpOwogICAgfQogICAgX19uYW1lKGZvbGRMaW5lLCAiZm9sZExpbmUiKTsKICAgIGZ1bmN0aW9uIGVzY2FwZVN0cmluZyhzdHJpbmczKSB7CiAgICAgIHZhciByZXN1bHQgPSAiIjsKICAgICAgdmFyIGNoYXIsIG5leHRDaGFyOwogICAgICB2YXIgZXNjYXBlU2VxOwogICAgICBmb3IgKHZhciBpMTAgPSAwOyBpMTAgPCBzdHJpbmczLmxlbmd0aDsgaTEwKyspIHsKICAgICAgICBjaGFyID0gc3RyaW5nMy5jaGFyQ29kZUF0KGkxMCk7CiAgICAgICAgaWYgKGNoYXIgPj0gNTUyOTYgJiYgY2hhciA8PSA1NjMxOSkgewogICAgICAgICAgbmV4dENoYXIgPSBzdHJpbmczLmNoYXJDb2RlQXQoaTEwICsgMSk7CiAgICAgICAgICBpZiAobmV4dENoYXIgPj0gNTYzMjAgJiYgbmV4dENoYXIgPD0gNTczNDMpIHsKICAgICAgICAgICAgcmVzdWx0ICs9IGVuY29kZUhleCgoY2hhciAtIDU1Mjk2KSAqIDEwMjQgKyBuZXh0Q2hhciAtIDU2MzIwICsgNjU1MzYpOwogICAgICAgICAgICBpMTArKzsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVzY2FwZVNlcSA9IEVTQ0FQRV9TRVFVRU5DRVNbY2hhcl07CiAgICAgICAgcmVzdWx0ICs9ICFlc2NhcGVTZXEgJiYgaXNQcmludGFibGUoY2hhcikgPyBzdHJpbmczW2kxMF0gOiBlc2NhcGVTZXEgfHwgZW5jb2RlSGV4KGNoYXIpOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBfX25hbWUoZXNjYXBlU3RyaW5nLCAiZXNjYXBlU3RyaW5nIik7CiAgICBmdW5jdGlvbiB3cml0ZUZsb3dTZXF1ZW5jZShzdGF0ZSwgbGV2ZWwsIG9iamVjdCkgewogICAgICB2YXIgX3Jlc3VsdCA9ICIiLCBfdGFnID0gc3RhdGUudGFnLCBpbmRleDIsIGxlbmd0aDsKICAgICAgZm9yIChpbmRleDIgPSAwLCBsZW5ndGggPSBvYmplY3QubGVuZ3RoOyBpbmRleDIgPCBsZW5ndGg7IGluZGV4MiArPSAxKSB7CiAgICAgICAgaWYgKHdyaXRlTm9kZShzdGF0ZSwgbGV2ZWwsIG9iamVjdFtpbmRleDJdLCBmYWxzZSwgZmFsc2UpKSB7CiAgICAgICAgICBpZiAoaW5kZXgyICE9PSAwKSBfcmVzdWx0ICs9ICIsIiArICghc3RhdGUuY29uZGVuc2VGbG93ID8gIiAiIDogIiIpOwogICAgICAgICAgX3Jlc3VsdCArPSBzdGF0ZS5kdW1wOwogICAgICAgIH0KICAgICAgfQogICAgICBzdGF0ZS50YWcgPSBfdGFnOwogICAgICBzdGF0ZS5kdW1wID0gIlsiICsgX3Jlc3VsdCArICJdIjsKICAgIH0KICAgIF9fbmFtZSh3cml0ZUZsb3dTZXF1ZW5jZSwgIndyaXRlRmxvd1NlcXVlbmNlIik7CiAgICBmdW5jdGlvbiB3cml0ZUJsb2NrU2VxdWVuY2Uoc3RhdGUsIGxldmVsLCBvYmplY3QsIGNvbXBhY3QpIHsKICAgICAgdmFyIF9yZXN1bHQgPSAiIiwgX3RhZyA9IHN0YXRlLnRhZywgaW5kZXgyLCBsZW5ndGg7CiAgICAgIGZvciAoaW5kZXgyID0gMCwgbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aDsgaW5kZXgyIDwgbGVuZ3RoOyBpbmRleDIgKz0gMSkgewogICAgICAgIGlmICh3cml0ZU5vZGUoc3RhdGUsIGxldmVsICsgMSwgb2JqZWN0W2luZGV4Ml0sIHRydWUsIHRydWUpKSB7CiAgICAgICAgICBpZiAoIWNvbXBhY3QgfHwgaW5kZXgyICE9PSAwKSB7CiAgICAgICAgICAgIF9yZXN1bHQgKz0gZ2VuZXJhdGVOZXh0TGluZShzdGF0ZSwgbGV2ZWwpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHN0YXRlLmR1bXAgJiYgQ0hBUl9MSU5FX0ZFRUQgPT09IHN0YXRlLmR1bXAuY2hhckNvZGVBdCgwKSkgewogICAgICAgICAgICBfcmVzdWx0ICs9ICItIjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIF9yZXN1bHQgKz0gIi0gIjsKICAgICAgICAgIH0KICAgICAgICAgIF9yZXN1bHQgKz0gc3RhdGUuZHVtcDsKICAgICAgICB9CiAgICAgIH0KICAgICAgc3RhdGUudGFnID0gX3RhZzsKICAgICAgc3RhdGUuZHVtcCA9IF9yZXN1bHQgfHwgIltdIjsKICAgIH0KICAgIF9fbmFtZSh3cml0ZUJsb2NrU2VxdWVuY2UsICJ3cml0ZUJsb2NrU2VxdWVuY2UiKTsKICAgIGZ1bmN0aW9uIHdyaXRlRmxvd01hcHBpbmcoc3RhdGUsIGxldmVsLCBvYmplY3QpIHsKICAgICAgdmFyIF9yZXN1bHQgPSAiIiwgX3RhZyA9IHN0YXRlLnRhZywgb2JqZWN0S2V5TGlzdCA9IE9iamVjdC5rZXlzKG9iamVjdCksIGluZGV4MiwgbGVuZ3RoLCBvYmplY3RLZXksIG9iamVjdFZhbHVlLCBwYWlyQnVmZmVyOwogICAgICBmb3IgKGluZGV4MiA9IDAsIGxlbmd0aCA9IG9iamVjdEtleUxpc3QubGVuZ3RoOyBpbmRleDIgPCBsZW5ndGg7IGluZGV4MiArPSAxKSB7CiAgICAgICAgcGFpckJ1ZmZlciA9ICIiOwogICAgICAgIGlmIChpbmRleDIgIT09IDApIHBhaXJCdWZmZXIgKz0gIiwgIjsKICAgICAgICBpZiAoc3RhdGUuY29uZGVuc2VGbG93KSBwYWlyQnVmZmVyICs9ICciJzsKICAgICAgICBvYmplY3RLZXkgPSBvYmplY3RLZXlMaXN0W2luZGV4Ml07CiAgICAgICAgb2JqZWN0VmFsdWUgPSBvYmplY3Rbb2JqZWN0S2V5XTsKICAgICAgICBpZiAoIXdyaXRlTm9kZShzdGF0ZSwgbGV2ZWwsIG9iamVjdEtleSwgZmFsc2UsIGZhbHNlKSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmIChzdGF0ZS5kdW1wLmxlbmd0aCA+IDEwMjQpIHBhaXJCdWZmZXIgKz0gIj8gIjsKICAgICAgICBwYWlyQnVmZmVyICs9IHN0YXRlLmR1bXAgKyAoc3RhdGUuY29uZGVuc2VGbG93ID8gJyInIDogIiIpICsgIjoiICsgKHN0YXRlLmNvbmRlbnNlRmxvdyA/ICIiIDogIiAiKTsKICAgICAgICBpZiAoIXdyaXRlTm9kZShzdGF0ZSwgbGV2ZWwsIG9iamVjdFZhbHVlLCBmYWxzZSwgZmFsc2UpKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgcGFpckJ1ZmZlciArPSBzdGF0ZS5kdW1wOwogICAgICAgIF9yZXN1bHQgKz0gcGFpckJ1ZmZlcjsKICAgICAgfQogICAgICBzdGF0ZS50YWcgPSBfdGFnOwogICAgICBzdGF0ZS5kdW1wID0gInsiICsgX3Jlc3VsdCArICJ9IjsKICAgIH0KICAgIF9fbmFtZSh3cml0ZUZsb3dNYXBwaW5nLCAid3JpdGVGbG93TWFwcGluZyIpOwogICAgZnVuY3Rpb24gd3JpdGVCbG9ja01hcHBpbmcoc3RhdGUsIGxldmVsLCBvYmplY3QsIGNvbXBhY3QpIHsKICAgICAgdmFyIF9yZXN1bHQgPSAiIiwgX3RhZyA9IHN0YXRlLnRhZywgb2JqZWN0S2V5TGlzdCA9IE9iamVjdC5rZXlzKG9iamVjdCksIGluZGV4MiwgbGVuZ3RoLCBvYmplY3RLZXksIG9iamVjdFZhbHVlLCBleHBsaWNpdFBhaXIsIHBhaXJCdWZmZXI7CiAgICAgIGlmIChzdGF0ZS5zb3J0S2V5cyA9PT0gdHJ1ZSkgewogICAgICAgIG9iamVjdEtleUxpc3Quc29ydCgpOwogICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzdGF0ZS5zb3J0S2V5cyA9PT0gImZ1bmN0aW9uIikgewogICAgICAgIG9iamVjdEtleUxpc3Quc29ydChzdGF0ZS5zb3J0S2V5cyk7CiAgICAgIH0gZWxzZSBpZiAoc3RhdGUuc29ydEtleXMpIHsKICAgICAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbigic29ydEtleXMgbXVzdCBiZSBhIGJvb2xlYW4gb3IgYSBmdW5jdGlvbiIpOwogICAgICB9CiAgICAgIGZvciAoaW5kZXgyID0gMCwgbGVuZ3RoID0gb2JqZWN0S2V5TGlzdC5sZW5ndGg7IGluZGV4MiA8IGxlbmd0aDsgaW5kZXgyICs9IDEpIHsKICAgICAgICBwYWlyQnVmZmVyID0gIiI7CiAgICAgICAgaWYgKCFjb21wYWN0IHx8IGluZGV4MiAhPT0gMCkgewogICAgICAgICAgcGFpckJ1ZmZlciArPSBnZW5lcmF0ZU5leHRMaW5lKHN0YXRlLCBsZXZlbCk7CiAgICAgICAgfQogICAgICAgIG9iamVjdEtleSA9IG9iamVjdEtleUxpc3RbaW5kZXgyXTsKICAgICAgICBvYmplY3RWYWx1ZSA9IG9iamVjdFtvYmplY3RLZXldOwogICAgICAgIGlmICghd3JpdGVOb2RlKHN0YXRlLCBsZXZlbCArIDEsIG9iamVjdEtleSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSkpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBleHBsaWNpdFBhaXIgPSBzdGF0ZS50YWcgIT09IG51bGwgJiYgc3RhdGUudGFnICE9PSAiPyIgfHwgc3RhdGUuZHVtcCAmJiBzdGF0ZS5kdW1wLmxlbmd0aCA+IDEwMjQ7CiAgICAgICAgaWYgKGV4cGxpY2l0UGFpcikgewogICAgICAgICAgaWYgKHN0YXRlLmR1bXAgJiYgQ0hBUl9MSU5FX0ZFRUQgPT09IHN0YXRlLmR1bXAuY2hhckNvZGVBdCgwKSkgewogICAgICAgICAgICBwYWlyQnVmZmVyICs9ICI/IjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHBhaXJCdWZmZXIgKz0gIj8gIjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcGFpckJ1ZmZlciArPSBzdGF0ZS5kdW1wOwogICAgICAgIGlmIChleHBsaWNpdFBhaXIpIHsKICAgICAgICAgIHBhaXJCdWZmZXIgKz0gZ2VuZXJhdGVOZXh0TGluZShzdGF0ZSwgbGV2ZWwpOwogICAgICAgIH0KICAgICAgICBpZiAoIXdyaXRlTm9kZShzdGF0ZSwgbGV2ZWwgKyAxLCBvYmplY3RWYWx1ZSwgdHJ1ZSwgZXhwbGljaXRQYWlyKSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmIChzdGF0ZS5kdW1wICYmIENIQVJfTElORV9GRUVEID09PSBzdGF0ZS5kdW1wLmNoYXJDb2RlQXQoMCkpIHsKICAgICAgICAgIHBhaXJCdWZmZXIgKz0gIjoiOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwYWlyQnVmZmVyICs9ICI6ICI7CiAgICAgICAgfQogICAgICAgIHBhaXJCdWZmZXIgKz0gc3RhdGUuZHVtcDsKICAgICAgICBfcmVzdWx0ICs9IHBhaXJCdWZmZXI7CiAgICAgIH0KICAgICAgc3RhdGUudGFnID0gX3RhZzsKICAgICAgc3RhdGUuZHVtcCA9IF9yZXN1bHQgfHwgInt9IjsKICAgIH0KICAgIF9fbmFtZSh3cml0ZUJsb2NrTWFwcGluZywgIndyaXRlQmxvY2tNYXBwaW5nIik7CiAgICBmdW5jdGlvbiBkZXRlY3RUeXBlKHN0YXRlLCBvYmplY3QsIGV4cGxpY2l0KSB7CiAgICAgIHZhciBfcmVzdWx0LCB0eXBlTGlzdCwgaW5kZXgyLCBsZW5ndGgsIHR5cGU1LCBzdHlsZTsKICAgICAgdHlwZUxpc3QgPSBleHBsaWNpdCA/IHN0YXRlLmV4cGxpY2l0VHlwZXMgOiBzdGF0ZS5pbXBsaWNpdFR5cGVzOwogICAgICBmb3IgKGluZGV4MiA9IDAsIGxlbmd0aCA9IHR5cGVMaXN0Lmxlbmd0aDsgaW5kZXgyIDwgbGVuZ3RoOyBpbmRleDIgKz0gMSkgewogICAgICAgIHR5cGU1ID0gdHlwZUxpc3RbaW5kZXgyXTsKICAgICAgICBpZiAoKHR5cGU1Lmluc3RhbmNlT2YgfHwgdHlwZTUucHJlZGljYXRlKSAmJiAoIXR5cGU1Lmluc3RhbmNlT2YgfHwgdHlwZW9mIG9iamVjdCA9PT0gIm9iamVjdCIgJiYgb2JqZWN0IGluc3RhbmNlb2YgdHlwZTUuaW5zdGFuY2VPZikgJiYgKCF0eXBlNS5wcmVkaWNhdGUgfHwgdHlwZTUucHJlZGljYXRlKG9iamVjdCkpKSB7CiAgICAgICAgICBzdGF0ZS50YWcgPSBleHBsaWNpdCA/IHR5cGU1LnRhZyA6ICI/IjsKICAgICAgICAgIGlmICh0eXBlNS5yZXByZXNlbnQpIHsKICAgICAgICAgICAgc3R5bGUgPSBzdGF0ZS5zdHlsZU1hcFt0eXBlNS50YWddIHx8IHR5cGU1LmRlZmF1bHRTdHlsZTsKICAgICAgICAgICAgaWYgKF90b1N0cmluZy5jYWxsKHR5cGU1LnJlcHJlc2VudCkgPT09ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsKICAgICAgICAgICAgICBfcmVzdWx0ID0gdHlwZTUucmVwcmVzZW50KG9iamVjdCwgc3R5bGUpOwogICAgICAgICAgICB9IGVsc2UgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKHR5cGU1LnJlcHJlc2VudCwgc3R5bGUpKSB7CiAgICAgICAgICAgICAgX3Jlc3VsdCA9IHR5cGU1LnJlcHJlc2VudFtzdHlsZV0ob2JqZWN0LCBzdHlsZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oIiE8IiArIHR5cGU1LnRhZyArICc+IHRhZyByZXNvbHZlciBhY2NlcHRzIG5vdCAiJyArIHN0eWxlICsgJyIgc3R5bGUnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdGF0ZS5kdW1wID0gX3Jlc3VsdDsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBfX25hbWUoZGV0ZWN0VHlwZSwgImRldGVjdFR5cGUiKTsKICAgIGZ1bmN0aW9uIHdyaXRlTm9kZShzdGF0ZSwgbGV2ZWwsIG9iamVjdCwgYmxvY2ssIGNvbXBhY3QsIGlza2V5KSB7CiAgICAgIHN0YXRlLnRhZyA9IG51bGw7CiAgICAgIHN0YXRlLmR1bXAgPSBvYmplY3Q7CiAgICAgIGlmICghZGV0ZWN0VHlwZShzdGF0ZSwgb2JqZWN0LCBmYWxzZSkpIHsKICAgICAgICBkZXRlY3RUeXBlKHN0YXRlLCBvYmplY3QsIHRydWUpOwogICAgICB9CiAgICAgIHZhciB0eXBlNSA9IF90b1N0cmluZy5jYWxsKHN0YXRlLmR1bXApOwogICAgICBpZiAoYmxvY2spIHsKICAgICAgICBibG9jayA9IHN0YXRlLmZsb3dMZXZlbCA8IDAgfHwgc3RhdGUuZmxvd0xldmVsID4gbGV2ZWw7CiAgICAgIH0KICAgICAgdmFyIG9iamVjdE9yQXJyYXkgPSB0eXBlNSA9PT0gIltvYmplY3QgT2JqZWN0XSIgfHwgdHlwZTUgPT09ICJbb2JqZWN0IEFycmF5XSIsIGR1cGxpY2F0ZUluZGV4LCBkdXBsaWNhdGU7CiAgICAgIGlmIChvYmplY3RPckFycmF5KSB7CiAgICAgICAgZHVwbGljYXRlSW5kZXggPSBzdGF0ZS5kdXBsaWNhdGVzLmluZGV4T2Yob2JqZWN0KTsKICAgICAgICBkdXBsaWNhdGUgPSBkdXBsaWNhdGVJbmRleCAhPT0gLTE7CiAgICAgIH0KICAgICAgaWYgKHN0YXRlLnRhZyAhPT0gbnVsbCAmJiBzdGF0ZS50YWcgIT09ICI/IiB8fCBkdXBsaWNhdGUgfHwgc3RhdGUuaW5kZW50ICE9PSAyICYmIGxldmVsID4gMCkgewogICAgICAgIGNvbXBhY3QgPSBmYWxzZTsKICAgICAgfQogICAgICBpZiAoZHVwbGljYXRlICYmIHN0YXRlLnVzZWREdXBsaWNhdGVzW2R1cGxpY2F0ZUluZGV4XSkgewogICAgICAgIHN0YXRlLmR1bXAgPSAiKnJlZl8iICsgZHVwbGljYXRlSW5kZXg7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKG9iamVjdE9yQXJyYXkgJiYgZHVwbGljYXRlICYmICFzdGF0ZS51c2VkRHVwbGljYXRlc1tkdXBsaWNhdGVJbmRleF0pIHsKICAgICAgICAgIHN0YXRlLnVzZWREdXBsaWNhdGVzW2R1cGxpY2F0ZUluZGV4XSA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlNSA9PT0gIltvYmplY3QgT2JqZWN0XSIpIHsKICAgICAgICAgIGlmIChibG9jayAmJiBPYmplY3Qua2V5cyhzdGF0ZS5kdW1wKS5sZW5ndGggIT09IDApIHsKICAgICAgICAgICAgd3JpdGVCbG9ja01hcHBpbmcoc3RhdGUsIGxldmVsLCBzdGF0ZS5kdW1wLCBjb21wYWN0KTsKICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZSkgewogICAgICAgICAgICAgIHN0YXRlLmR1bXAgPSAiJnJlZl8iICsgZHVwbGljYXRlSW5kZXggKyBzdGF0ZS5kdW1wOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3cml0ZUZsb3dNYXBwaW5nKHN0YXRlLCBsZXZlbCwgc3RhdGUuZHVtcCk7CiAgICAgICAgICAgIGlmIChkdXBsaWNhdGUpIHsKICAgICAgICAgICAgICBzdGF0ZS5kdW1wID0gIiZyZWZfIiArIGR1cGxpY2F0ZUluZGV4ICsgIiAiICsgc3RhdGUuZHVtcDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodHlwZTUgPT09ICJbb2JqZWN0IEFycmF5XSIpIHsKICAgICAgICAgIHZhciBhcnJheUxldmVsID0gc3RhdGUubm9BcnJheUluZGVudCAmJiBsZXZlbCA+IDAgPyBsZXZlbCAtIDEgOiBsZXZlbDsKICAgICAgICAgIGlmIChibG9jayAmJiBzdGF0ZS5kdW1wLmxlbmd0aCAhPT0gMCkgewogICAgICAgICAgICB3cml0ZUJsb2NrU2VxdWVuY2Uoc3RhdGUsIGFycmF5TGV2ZWwsIHN0YXRlLmR1bXAsIGNvbXBhY3QpOwogICAgICAgICAgICBpZiAoZHVwbGljYXRlKSB7CiAgICAgICAgICAgICAgc3RhdGUuZHVtcCA9ICImcmVmXyIgKyBkdXBsaWNhdGVJbmRleCArIHN0YXRlLmR1bXA7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHdyaXRlRmxvd1NlcXVlbmNlKHN0YXRlLCBhcnJheUxldmVsLCBzdGF0ZS5kdW1wKTsKICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZSkgewogICAgICAgICAgICAgIHN0YXRlLmR1bXAgPSAiJnJlZl8iICsgZHVwbGljYXRlSW5kZXggKyAiICIgKyBzdGF0ZS5kdW1wOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0eXBlNSA9PT0gIltvYmplY3QgU3RyaW5nXSIpIHsKICAgICAgICAgIGlmIChzdGF0ZS50YWcgIT09ICI/IikgewogICAgICAgICAgICB3cml0ZVNjYWxhcihzdGF0ZSwgc3RhdGUuZHVtcCwgbGV2ZWwsIGlza2V5KTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKHN0YXRlLnNraXBJbnZhbGlkKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbigidW5hY2NlcHRhYmxlIGtpbmQgb2YgYW4gb2JqZWN0IHRvIGR1bXAgIiArIHR5cGU1KTsKICAgICAgICB9CiAgICAgICAgaWYgKHN0YXRlLnRhZyAhPT0gbnVsbCAmJiBzdGF0ZS50YWcgIT09ICI/IikgewogICAgICAgICAgc3RhdGUuZHVtcCA9ICIhPCIgKyBzdGF0ZS50YWcgKyAiPiAiICsgc3RhdGUuZHVtcDsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBfX25hbWUod3JpdGVOb2RlLCAid3JpdGVOb2RlIik7CiAgICBmdW5jdGlvbiBnZXREdXBsaWNhdGVSZWZlcmVuY2VzKG9iamVjdCwgc3RhdGUpIHsKICAgICAgdmFyIG9iamVjdHMgPSBbXSwgZHVwbGljYXRlc0luZGV4ZXMgPSBbXSwgaW5kZXgyLCBsZW5ndGg7CiAgICAgIGluc3BlY3ROb2RlKG9iamVjdCwgb2JqZWN0cywgZHVwbGljYXRlc0luZGV4ZXMpOwogICAgICBmb3IgKGluZGV4MiA9IDAsIGxlbmd0aCA9IGR1cGxpY2F0ZXNJbmRleGVzLmxlbmd0aDsgaW5kZXgyIDwgbGVuZ3RoOyBpbmRleDIgKz0gMSkgewogICAgICAgIHN0YXRlLmR1cGxpY2F0ZXMucHVzaChvYmplY3RzW2R1cGxpY2F0ZXNJbmRleGVzW2luZGV4Ml1dKTsKICAgICAgfQogICAgICBzdGF0ZS51c2VkRHVwbGljYXRlcyA9IG5ldyBBcnJheShsZW5ndGgpOwogICAgfQogICAgX19uYW1lKGdldER1cGxpY2F0ZVJlZmVyZW5jZXMsICJnZXREdXBsaWNhdGVSZWZlcmVuY2VzIik7CiAgICBmdW5jdGlvbiBpbnNwZWN0Tm9kZShvYmplY3QsIG9iamVjdHMsIGR1cGxpY2F0ZXNJbmRleGVzKSB7CiAgICAgIHZhciBvYmplY3RLZXlMaXN0LCBpbmRleDIsIGxlbmd0aDsKICAgICAgaWYgKG9iamVjdCAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqZWN0ID09PSAib2JqZWN0IikgewogICAgICAgIGluZGV4MiA9IG9iamVjdHMuaW5kZXhPZihvYmplY3QpOwogICAgICAgIGlmIChpbmRleDIgIT09IC0xKSB7CiAgICAgICAgICBpZiAoZHVwbGljYXRlc0luZGV4ZXMuaW5kZXhPZihpbmRleDIpID09PSAtMSkgewogICAgICAgICAgICBkdXBsaWNhdGVzSW5kZXhlcy5wdXNoKGluZGV4Mik7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG9iamVjdHMucHVzaChvYmplY3QpOwogICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0KSkgewogICAgICAgICAgICBmb3IgKGluZGV4MiA9IDAsIGxlbmd0aCA9IG9iamVjdC5sZW5ndGg7IGluZGV4MiA8IGxlbmd0aDsgaW5kZXgyICs9IDEpIHsKICAgICAgICAgICAgICBpbnNwZWN0Tm9kZShvYmplY3RbaW5kZXgyXSwgb2JqZWN0cywgZHVwbGljYXRlc0luZGV4ZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBvYmplY3RLZXlMaXN0ID0gT2JqZWN0LmtleXMob2JqZWN0KTsKICAgICAgICAgICAgZm9yIChpbmRleDIgPSAwLCBsZW5ndGggPSBvYmplY3RLZXlMaXN0Lmxlbmd0aDsgaW5kZXgyIDwgbGVuZ3RoOyBpbmRleDIgKz0gMSkgewogICAgICAgICAgICAgIGluc3BlY3ROb2RlKG9iamVjdFtvYmplY3RLZXlMaXN0W2luZGV4Ml1dLCBvYmplY3RzLCBkdXBsaWNhdGVzSW5kZXhlcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIF9fbmFtZShpbnNwZWN0Tm9kZSwgImluc3BlY3ROb2RlIik7CiAgICBmdW5jdGlvbiBkdW1wKGlucHV0LCBvcHRpb25zKSB7CiAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgICB2YXIgc3RhdGUgPSBuZXcgU3RhdGUob3B0aW9ucyk7CiAgICAgIGlmICghc3RhdGUubm9SZWZzKSBnZXREdXBsaWNhdGVSZWZlcmVuY2VzKGlucHV0LCBzdGF0ZSk7CiAgICAgIGlmICh3cml0ZU5vZGUoc3RhdGUsIDAsIGlucHV0LCB0cnVlLCB0cnVlKSkgcmV0dXJuIHN0YXRlLmR1bXAgKyAiXG4iOwogICAgICByZXR1cm4gIiI7CiAgICB9CiAgICBfX25hbWUoZHVtcCwgImR1bXAiKTsKICAgIGZ1bmN0aW9uIHNhZmVEdW1wKGlucHV0LCBvcHRpb25zKSB7CiAgICAgIHJldHVybiBkdW1wKGlucHV0LCBjb21tb24uZXh0ZW5kKHsgc2NoZW1hOiBERUZBVUxUX1NBRkVfU0NIRU1BIH0sIG9wdGlvbnMpKTsKICAgIH0KICAgIF9fbmFtZShzYWZlRHVtcCwgInNhZmVEdW1wIik7CiAgICBtb2R1bGUuZXhwb3J0cy5kdW1wID0gZHVtcDsKICAgIG1vZHVsZS5leHBvcnRzLnNhZmVEdW1wID0gc2FmZUR1bXA7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC5qcwp2YXIgcmVxdWlyZV9qc195YW1sID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgbG9hZGVyID0gcmVxdWlyZV9sb2FkZXIoKTsKICAgIHZhciBkdW1wZXIgPSByZXF1aXJlX2R1bXBlcigpOwogICAgZnVuY3Rpb24gZGVwcmVjYXRlZChuYW1lKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkZ1bmN0aW9uICIgKyBuYW1lICsgIiBpcyBkZXByZWNhdGVkIGFuZCBjYW5ub3QgYmUgdXNlZC4iKTsKICAgICAgfTsKICAgIH0KICAgIF9fbmFtZShkZXByZWNhdGVkLCAiZGVwcmVjYXRlZCIpOwogICAgbW9kdWxlLmV4cG9ydHMuVHlwZSA9IHJlcXVpcmVfdHlwZSgpOwogICAgbW9kdWxlLmV4cG9ydHMuU2NoZW1hID0gcmVxdWlyZV9zY2hlbWEoKTsKICAgIG1vZHVsZS5leHBvcnRzLkZBSUxTQUZFX1NDSEVNQSA9IHJlcXVpcmVfZmFpbHNhZmUoKTsKICAgIG1vZHVsZS5leHBvcnRzLkpTT05fU0NIRU1BID0gcmVxdWlyZV9qc29uKCk7CiAgICBtb2R1bGUuZXhwb3J0cy5DT1JFX1NDSEVNQSA9IHJlcXVpcmVfY29yZSgpOwogICAgbW9kdWxlLmV4cG9ydHMuREVGQVVMVF9TQUZFX1NDSEVNQSA9IHJlcXVpcmVfZGVmYXVsdF9zYWZlKCk7CiAgICBtb2R1bGUuZXhwb3J0cy5ERUZBVUxUX0ZVTExfU0NIRU1BID0gcmVxdWlyZV9kZWZhdWx0X2Z1bGwoKTsKICAgIG1vZHVsZS5leHBvcnRzLmxvYWQgPSBsb2FkZXIubG9hZDsKICAgIG1vZHVsZS5leHBvcnRzLmxvYWRBbGwgPSBsb2FkZXIubG9hZEFsbDsKICAgIG1vZHVsZS5leHBvcnRzLnNhZmVMb2FkID0gbG9hZGVyLnNhZmVMb2FkOwogICAgbW9kdWxlLmV4cG9ydHMuc2FmZUxvYWRBbGwgPSBsb2FkZXIuc2FmZUxvYWRBbGw7CiAgICBtb2R1bGUuZXhwb3J0cy5kdW1wID0gZHVtcGVyLmR1bXA7CiAgICBtb2R1bGUuZXhwb3J0cy5zYWZlRHVtcCA9IGR1bXBlci5zYWZlRHVtcDsKICAgIG1vZHVsZS5leHBvcnRzLllBTUxFeGNlcHRpb24gPSByZXF1aXJlX2V4Y2VwdGlvbigpOwogICAgbW9kdWxlLmV4cG9ydHMuTUlOSU1BTF9TQ0hFTUEgPSByZXF1aXJlX2ZhaWxzYWZlKCk7CiAgICBtb2R1bGUuZXhwb3J0cy5TQUZFX1NDSEVNQSA9IHJlcXVpcmVfZGVmYXVsdF9zYWZlKCk7CiAgICBtb2R1bGUuZXhwb3J0cy5ERUZBVUxUX1NDSEVNQSA9IHJlcXVpcmVfZGVmYXVsdF9mdWxsKCk7CiAgICBtb2R1bGUuZXhwb3J0cy5zY2FuID0gZGVwcmVjYXRlZCgic2NhbiIpOwogICAgbW9kdWxlLmV4cG9ydHMucGFyc2UgPSBkZXByZWNhdGVkKCJwYXJzZSIpOwogICAgbW9kdWxlLmV4cG9ydHMuY29tcG9zZSA9IGRlcHJlY2F0ZWQoImNvbXBvc2UiKTsKICAgIG1vZHVsZS5leHBvcnRzLmFkZENvbnN0cnVjdG9yID0gZGVwcmVjYXRlZCgiYWRkQ29uc3RydWN0b3IiKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2luZGV4LmpzCnZhciByZXF1aXJlX2pzX3lhbWwyID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9pbmRleC5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgeWFtbCA9IHJlcXVpcmVfanNfeWFtbCgpOwogICAgbW9kdWxlLmV4cG9ydHMgPSB5YW1sOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR5YW1sQDIuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHlhbWwvZGlzdF90cy9zbWFydHlhbWwucGx1Z2lucy5qcwp2YXIgcmVxdWlyZV9zbWFydHlhbWxfcGx1Z2lucyA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR5YW1sQDIuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHlhbWwvZGlzdF90cy9zbWFydHlhbWwucGx1Z2lucy5qcyIoZXhwb3J0cykgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIF9fY3JlYXRlQmluZGluZzIgPSBleHBvcnRzICYmIGV4cG9ydHMuX19jcmVhdGVCaW5kaW5nIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8xMiwgbTUsIGszLCBrMjIpIHsKICAgICAgaWYgKGsyMiA9PT0gdm9pZCAwKSBrMjIgPSBrMzsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8xMiwgazIyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gbTVbazNdOwogICAgICB9LCAiZ2V0IikgfSk7CiAgICB9KSA6IChmdW5jdGlvbihvMTIsIG01LCBrMywgazIyKSB7CiAgICAgIGlmIChrMjIgPT09IHZvaWQgMCkgazIyID0gazM7CiAgICAgIG8xMltrMjJdID0gbTVbazNdOwogICAgfSkpOwogICAgdmFyIF9fc2V0TW9kdWxlRGVmYXVsdDIgPSBleHBvcnRzICYmIGV4cG9ydHMuX19zZXRNb2R1bGVEZWZhdWx0IHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8xMiwgdjQpIHsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8xMiwgImRlZmF1bHQiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2NCB9KTsKICAgIH0pIDogZnVuY3Rpb24obzEyLCB2NCkgewogICAgICBvMTJbImRlZmF1bHQiXSA9IHY0OwogICAgfSk7CiAgICB2YXIgX19pbXBvcnRTdGFyMiA9IGV4cG9ydHMgJiYgZXhwb3J0cy5fX2ltcG9ydFN0YXIgfHwgZnVuY3Rpb24obW9kKSB7CiAgICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7CiAgICAgIHZhciByZXN1bHQgPSB7fTsKICAgICAgaWYgKG1vZCAhPSBudWxsKSB7CiAgICAgICAgZm9yICh2YXIgazMgaW4gbW9kKSBpZiAoazMgIT09ICJkZWZhdWx0IiAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGszKSkgX19jcmVhdGVCaW5kaW5nMihyZXN1bHQsIG1vZCwgazMpOwogICAgICB9CiAgICAgIF9fc2V0TW9kdWxlRGVmYXVsdDIocmVzdWx0LCBtb2QpOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzLmpzWWFtbCA9IHZvaWQgMDsKICAgIHZhciBqc1lhbWwgPSBfX2ltcG9ydFN0YXIyKHJlcXVpcmVfanNfeWFtbDIoKSk7CiAgICBleHBvcnRzLmpzWWFtbCA9IGpzWWFtbDsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0eWFtbEAyLjAuNS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnR5YW1sL2Rpc3RfdHMvaW5kZXguanMKdmFyIHJlcXVpcmVfZGlzdF90czIgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0eWFtbEAyLjAuNS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnR5YW1sL2Rpc3RfdHMvaW5kZXguanMiKGV4cG9ydHMpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBfX2NyZWF0ZUJpbmRpbmcyID0gZXhwb3J0cyAmJiBleHBvcnRzLl9fY3JlYXRlQmluZGluZyB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvMTIsIG01LCBrMywgazIyKSB7CiAgICAgIGlmIChrMjIgPT09IHZvaWQgMCkgazIyID0gazM7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvMTIsIGsyMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIG01W2szXTsKICAgICAgfSwgImdldCIpIH0pOwogICAgfSkgOiAoZnVuY3Rpb24obzEyLCBtNSwgazMsIGsyMikgewogICAgICBpZiAoazIyID09PSB2b2lkIDApIGsyMiA9IGszOwogICAgICBvMTJbazIyXSA9IG01W2szXTsKICAgIH0pKTsKICAgIHZhciBfX3NldE1vZHVsZURlZmF1bHQyID0gZXhwb3J0cyAmJiBleHBvcnRzLl9fc2V0TW9kdWxlRGVmYXVsdCB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvMTIsIHY0KSB7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvMTIsICJkZWZhdWx0IiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdjQgfSk7CiAgICB9KSA6IGZ1bmN0aW9uKG8xMiwgdjQpIHsKICAgICAgbzEyWyJkZWZhdWx0Il0gPSB2NDsKICAgIH0pOwogICAgdmFyIF9faW1wb3J0U3RhcjIgPSBleHBvcnRzICYmIGV4cG9ydHMuX19pbXBvcnRTdGFyIHx8IGZ1bmN0aW9uKG1vZCkgewogICAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kOwogICAgICB2YXIgcmVzdWx0ID0ge307CiAgICAgIGlmIChtb2QgIT0gbnVsbCkgewogICAgICAgIGZvciAodmFyIGszIGluIG1vZCkgaWYgKGszICE9PSAiZGVmYXVsdCIgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrMykpIF9fY3JlYXRlQmluZGluZzIocmVzdWx0LCBtb2QsIGszKTsKICAgICAgfQogICAgICBfX3NldE1vZHVsZURlZmF1bHQyKHJlc3VsdCwgbW9kKTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH07CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0cy5vYmplY3RUb1lhbWxTdHJpbmcgPSBleHBvcnRzLnlhbWxTdHJpbmdUb09iamVjdCA9IHZvaWQgMDsKICAgIHZhciBwbHVnaW5zID0gX19pbXBvcnRTdGFyMihyZXF1aXJlX3NtYXJ0eWFtbF9wbHVnaW5zKCkpOwogICAgZXhwb3J0cy55YW1sU3RyaW5nVG9PYmplY3QgPSBhc3luYyAoeWFtbFN0cmluZ0FyZywgb3B0aW9uc0FyZyA9IHt9KSA9PiB7CiAgICAgIHJldHVybiBwbHVnaW5zLmpzWWFtbC5zYWZlTG9hZCh5YW1sU3RyaW5nQXJnKTsKICAgIH07CiAgICBleHBvcnRzLm9iamVjdFRvWWFtbFN0cmluZyA9IGFzeW5jIChvYmplY3RBcmcsIG9wdGlvbnNBcmcgPSB7fSkgPT4gewogICAgICByZXR1cm4gcGx1Z2lucy5qc1lhbWwuc2FmZUR1bXAob2JqZWN0QXJnKTsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9leHRlbmRAMy4wLjIvbm9kZV9tb2R1bGVzL2V4dGVuZC9pbmRleC5qcwp2YXIgcmVxdWlyZV9leHRlbmQgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2V4dGVuZEAzLjAuMi9ub2RlX21vZHVsZXMvZXh0ZW5kL2luZGV4LmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5OwogICAgdmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsKICAgIHZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsKICAgIHZhciBnT1BEID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsKICAgIHZhciBpc0FycmF5NSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gaXNBcnJheTYoYXJyKSB7CiAgICAgIGlmICh0eXBlb2YgQXJyYXkuaXNBcnJheSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGFycik7CiAgICAgIH0KICAgICAgcmV0dXJuIHRvU3RyLmNhbGwoYXJyKSA9PT0gIltvYmplY3QgQXJyYXldIjsKICAgIH0sICJpc0FycmF5Iik7CiAgICB2YXIgaXNQbGFpbk9iamVjdDIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uIGlzUGxhaW5PYmplY3QzKG9iaikgewogICAgICBpZiAoIW9iaiB8fCB0b1N0ci5jYWxsKG9iaikgIT09ICJbb2JqZWN0IE9iamVjdF0iKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHZhciBoYXNPd25Db25zdHJ1Y3RvciA9IGhhc093bi5jYWxsKG9iaiwgImNvbnN0cnVjdG9yIik7CiAgICAgIHZhciBoYXNJc1Byb3RvdHlwZU9mID0gb2JqLmNvbnN0cnVjdG9yICYmIG9iai5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgJiYgaGFzT3duLmNhbGwob2JqLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwgImlzUHJvdG90eXBlT2YiKTsKICAgICAgaWYgKG9iai5jb25zdHJ1Y3RvciAmJiAhaGFzT3duQ29uc3RydWN0b3IgJiYgIWhhc0lzUHJvdG90eXBlT2YpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgdmFyIGtleTI7CiAgICAgIGZvciAoa2V5MiBpbiBvYmopIHsKICAgICAgfQogICAgICByZXR1cm4gdHlwZW9mIGtleTIgPT09ICJ1bmRlZmluZWQiIHx8IGhhc093bi5jYWxsKG9iaiwga2V5Mik7CiAgICB9LCAiaXNQbGFpbk9iamVjdCIpOwogICAgdmFyIHNldFByb3BlcnR5ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbiBzZXRQcm9wZXJ0eTIodGFyZ2V0LCBvcHRpb25zKSB7CiAgICAgIGlmIChkZWZpbmVQcm9wZXJ0eSAmJiBvcHRpb25zLm5hbWUgPT09ICJfX3Byb3RvX18iKSB7CiAgICAgICAgZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBvcHRpb25zLm5hbWUsIHsKICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICB2YWx1ZTogb3B0aW9ucy5uZXdWYWx1ZSwKICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGFyZ2V0W29wdGlvbnMubmFtZV0gPSBvcHRpb25zLm5ld1ZhbHVlOwogICAgICB9CiAgICB9LCAic2V0UHJvcGVydHkiKTsKICAgIHZhciBnZXRQcm9wZXJ0eSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gZ2V0UHJvcGVydHkyKG9iaiwgbmFtZSkgewogICAgICBpZiAobmFtZSA9PT0gIl9fcHJvdG9fXyIpIHsKICAgICAgICBpZiAoIWhhc093bi5jYWxsKG9iaiwgbmFtZSkpIHsKICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgfSBlbHNlIGlmIChnT1BEKSB7CiAgICAgICAgICByZXR1cm4gZ09QRChvYmosIG5hbWUpLnZhbHVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gb2JqW25hbWVdOwogICAgfSwgImdldFByb3BlcnR5Iik7CiAgICBtb2R1bGUuZXhwb3J0cyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gZXh0ZW5kMygpIHsKICAgICAgdmFyIG9wdGlvbnMsIG5hbWUsIHNyYywgY29weSwgY29weUlzQXJyYXksIGNsb25lOwogICAgICB2YXIgdGFyZ2V0ID0gYXJndW1lbnRzWzBdOwogICAgICB2YXIgaTEwID0gMTsKICAgICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7CiAgICAgIHZhciBkZWVwID0gZmFsc2U7CiAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSAiYm9vbGVhbiIpIHsKICAgICAgICBkZWVwID0gdGFyZ2V0OwogICAgICAgIHRhcmdldCA9IGFyZ3VtZW50c1sxXSB8fCB7fTsKICAgICAgICBpMTAgPSAyOwogICAgICB9CiAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCB8fCB0eXBlb2YgdGFyZ2V0ICE9PSAib2JqZWN0IiAmJiB0eXBlb2YgdGFyZ2V0ICE9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgdGFyZ2V0ID0ge307CiAgICAgIH0KICAgICAgZm9yICg7IGkxMCA8IGxlbmd0aDsgKytpMTApIHsKICAgICAgICBvcHRpb25zID0gYXJndW1lbnRzW2kxMF07CiAgICAgICAgaWYgKG9wdGlvbnMgIT0gbnVsbCkgewogICAgICAgICAgZm9yIChuYW1lIGluIG9wdGlvbnMpIHsKICAgICAgICAgICAgc3JjID0gZ2V0UHJvcGVydHkodGFyZ2V0LCBuYW1lKTsKICAgICAgICAgICAgY29weSA9IGdldFByb3BlcnR5KG9wdGlvbnMsIG5hbWUpOwogICAgICAgICAgICBpZiAodGFyZ2V0ICE9PSBjb3B5KSB7CiAgICAgICAgICAgICAgaWYgKGRlZXAgJiYgY29weSAmJiAoaXNQbGFpbk9iamVjdDIoY29weSkgfHwgKGNvcHlJc0FycmF5ID0gaXNBcnJheTUoY29weSkpKSkgewogICAgICAgICAgICAgICAgaWYgKGNvcHlJc0FycmF5KSB7CiAgICAgICAgICAgICAgICAgIGNvcHlJc0FycmF5ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgIGNsb25lID0gc3JjICYmIGlzQXJyYXk1KHNyYykgPyBzcmMgOiBbXTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGNsb25lID0gc3JjICYmIGlzUGxhaW5PYmplY3QyKHNyYykgPyBzcmMgOiB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNldFByb3BlcnR5KHRhcmdldCwgeyBuYW1lLCBuZXdWYWx1ZTogZXh0ZW5kMyhkZWVwLCBjbG9uZSwgY29weSkgfSk7CiAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgY29weSAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgIHNldFByb3BlcnR5KHRhcmdldCwgeyBuYW1lLCBuZXdWYWx1ZTogY29weSB9KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0sICJleHRlbmQiKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2Zvcm1hdEAwLjIuMi9ub2RlX21vZHVsZXMvZm9ybWF0L2Zvcm1hdC5qcwp2YXIgcmVxdWlyZV9mb3JtYXQgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2Zvcm1hdEAwLjIuMi9ub2RlX21vZHVsZXMvZm9ybWF0L2Zvcm1hdC5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICA7CiAgICAoZnVuY3Rpb24oKSB7CiAgICAgIHZhciBuYW1lc3BhY2U7CiAgICAgIGlmICh0eXBlb2YgbW9kdWxlICE9PSAidW5kZWZpbmVkIikgewogICAgICAgIG5hbWVzcGFjZSA9IG1vZHVsZS5leHBvcnRzID0gZm9ybWF0MjsKICAgICAgfSBlbHNlIHsKICAgICAgICBuYW1lc3BhY2UgPSAoZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gdGhpcyB8fCAoMSwgZXZhbCkoInRoaXMiKTsKICAgICAgICB9KSgpOwogICAgICB9CiAgICAgIG5hbWVzcGFjZS5mb3JtYXQgPSBmb3JtYXQyOwogICAgICBuYW1lc3BhY2UudnNwcmludGYgPSB2c3ByaW50ZjsKICAgICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAidW5kZWZpbmVkIiAmJiB0eXBlb2YgY29uc29sZS5sb2cgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICBuYW1lc3BhY2UucHJpbnRmID0gcHJpbnRmOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIHByaW50ZigpIHsKICAgICAgICBjb25zb2xlLmxvZyhmb3JtYXQyLmFwcGx5KG51bGwsIGFyZ3VtZW50cykpOwogICAgICB9CiAgICAgIF9fbmFtZShwcmludGYsICJwcmludGYiKTsKICAgICAgZnVuY3Rpb24gdnNwcmludGYoZm10LCByZXBsYWNlbWVudHMpIHsKICAgICAgICByZXR1cm4gZm9ybWF0Mi5hcHBseShudWxsLCBbZm10XS5jb25jYXQocmVwbGFjZW1lbnRzKSk7CiAgICAgIH0KICAgICAgX19uYW1lKHZzcHJpbnRmLCAidnNwcmludGYiKTsKICAgICAgZnVuY3Rpb24gZm9ybWF0MihmbXQpIHsKICAgICAgICB2YXIgYXJnSW5kZXggPSAxLCBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMpLCBpMTAgPSAwLCBuMTEgPSBmbXQubGVuZ3RoLCByZXN1bHQgPSAiIiwgYzEwLCBlc2NhcGVkID0gZmFsc2UsIGFyZywgdG1wLCBsZWFkaW5nWmVybyA9IGZhbHNlLCBwcmVjaXNpb24sIG5leHRBcmcgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIGFyZ3NbYXJnSW5kZXgrK107CiAgICAgICAgfSwgIm5leHRBcmciKSwgc2x1cnBOdW1iZXIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCkgewogICAgICAgICAgdmFyIGRpZ2l0cyA9ICIiOwogICAgICAgICAgd2hpbGUgKC9cZC8udGVzdChmbXRbaTEwXSkpIHsKICAgICAgICAgICAgZGlnaXRzICs9IGZtdFtpMTArK107CiAgICAgICAgICAgIGMxMCA9IGZtdFtpMTBdOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGRpZ2l0cy5sZW5ndGggPiAwID8gcGFyc2VJbnQoZGlnaXRzKSA6IG51bGw7CiAgICAgICAgfSwgInNsdXJwTnVtYmVyIik7CiAgICAgICAgZm9yICg7IGkxMCA8IG4xMTsgKytpMTApIHsKICAgICAgICAgIGMxMCA9IGZtdFtpMTBdOwogICAgICAgICAgaWYgKGVzY2FwZWQpIHsKICAgICAgICAgICAgZXNjYXBlZCA9IGZhbHNlOwogICAgICAgICAgICBpZiAoYzEwID09ICIuIikgewogICAgICAgICAgICAgIGxlYWRpbmdaZXJvID0gZmFsc2U7CiAgICAgICAgICAgICAgYzEwID0gZm10WysraTEwXTsKICAgICAgICAgICAgfSBlbHNlIGlmIChjMTAgPT0gIjAiICYmIGZtdFtpMTAgKyAxXSA9PSAiLiIpIHsKICAgICAgICAgICAgICBsZWFkaW5nWmVybyA9IHRydWU7CiAgICAgICAgICAgICAgaTEwICs9IDI7CiAgICAgICAgICAgICAgYzEwID0gZm10W2kxMF07CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgbGVhZGluZ1plcm8gPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHByZWNpc2lvbiA9IHNsdXJwTnVtYmVyKCk7CiAgICAgICAgICAgIHN3aXRjaCAoYzEwKSB7CiAgICAgICAgICAgICAgY2FzZSAiYiI6CiAgICAgICAgICAgICAgICByZXN1bHQgKz0gcGFyc2VJbnQobmV4dEFyZygpLCAxMCkudG9TdHJpbmcoMik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlICJjIjoKICAgICAgICAgICAgICAgIGFyZyA9IG5leHRBcmcoKTsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYXJnID09PSAic3RyaW5nIiB8fCBhcmcgaW5zdGFuY2VvZiBTdHJpbmcpCiAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBhcmc7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGFyZywgMTApKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgImQiOgogICAgICAgICAgICAgICAgcmVzdWx0ICs9IHBhcnNlSW50KG5leHRBcmcoKSwgMTApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSAiZiI6CiAgICAgICAgICAgICAgICB0bXAgPSBTdHJpbmcocGFyc2VGbG9hdChuZXh0QXJnKCkpLnRvRml4ZWQocHJlY2lzaW9uIHx8IDYpKTsKICAgICAgICAgICAgICAgIHJlc3VsdCArPSBsZWFkaW5nWmVybyA/IHRtcCA6IHRtcC5yZXBsYWNlKC9eMC8sICIiKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgImoiOgogICAgICAgICAgICAgICAgcmVzdWx0ICs9IEpTT04uc3RyaW5naWZ5KG5leHRBcmcoKSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlICJvIjoKICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiMCIgKyBwYXJzZUludChuZXh0QXJnKCksIDEwKS50b1N0cmluZyg4KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgInMiOgogICAgICAgICAgICAgICAgcmVzdWx0ICs9IG5leHRBcmcoKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgIngiOgogICAgICAgICAgICAgICAgcmVzdWx0ICs9ICIweCIgKyBwYXJzZUludChuZXh0QXJnKCksIDEwKS50b1N0cmluZygxNik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlICJYIjoKICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiMHgiICsgcGFyc2VJbnQobmV4dEFyZygpLCAxMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgcmVzdWx0ICs9IGMxMDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKGMxMCA9PT0gIiUiKSB7CiAgICAgICAgICAgIGVzY2FwZWQgPSB0cnVlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVzdWx0ICs9IGMxMDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgICBfX25hbWUoZm9ybWF0MiwgImZvcm1hdCIpOwogICAgfSkoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3BhdGgtdG8tcmVnZXhwQDguMy4wL25vZGVfbW9kdWxlcy9wYXRoLXRvLXJlZ2V4cC9kaXN0L2luZGV4LmpzCnZhciByZXF1aXJlX2Rpc3QgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3BhdGgtdG8tcmVnZXhwQDguMy4wL25vZGVfbW9kdWxlcy9wYXRoLXRvLXJlZ2V4cC9kaXN0L2luZGV4LmpzIihleHBvcnRzKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0cy5QYXRoRXJyb3IgPSBleHBvcnRzLlRva2VuRGF0YSA9IHZvaWQgMDsKICAgIGV4cG9ydHMucGFyc2UgPSBwYXJzZTk7CiAgICBleHBvcnRzLmNvbXBpbGUgPSBjb21waWxlMjsKICAgIGV4cG9ydHMubWF0Y2ggPSBtYXRjaDI7CiAgICBleHBvcnRzLnBhdGhUb1JlZ2V4cCA9IHBhdGhUb1JlZ2V4cDsKICAgIGV4cG9ydHMuc3RyaW5naWZ5ID0gc3RyaW5naWZ5NzsKICAgIHZhciBERUZBVUxUX0RFTElNSVRFUiA9ICIvIjsKICAgIHZhciBOT09QX1ZBTFVFID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgodmFsdWUyKSA9PiB2YWx1ZTIsICJOT09QX1ZBTFVFIik7CiAgICB2YXIgSURfU1RBUlQgPSAvXlskX1xwe0lEX1N0YXJ0fV0kL3U7CiAgICB2YXIgSURfQ09OVElOVUUgPSAvXlskXHUyMDBjXHUyMDBkXHB7SURfQ29udGludWV9XSQvdTsKICAgIHZhciBTSU1QTEVfVE9LRU5TID0gewogICAgICAvLyBHcm91cHMuCiAgICAgICJ7IjogInsiLAogICAgICAifSI6ICJ9IiwKICAgICAgLy8gUmVzZXJ2ZWQuCiAgICAgICIoIjogIigiLAogICAgICAiKSI6ICIpIiwKICAgICAgIlsiOiAiWyIsCiAgICAgICJdIjogIl0iLAogICAgICAiKyI6ICIrIiwKICAgICAgIj8iOiAiPyIsCiAgICAgICIhIjogIiEiCiAgICB9OwogICAgZnVuY3Rpb24gZXNjYXBlVGV4dChzdHIpIHsKICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9be30oKVxbXF0rPyE6KlxcXS9nLCAiXFwkJiIpOwogICAgfQogICAgX19uYW1lKGVzY2FwZVRleHQsICJlc2NhcGVUZXh0Iik7CiAgICBmdW5jdGlvbiBlc2NhcGUoc3RyKSB7CiAgICAgIHJldHVybiBzdHIucmVwbGFjZSgvWy4rKj9eJHt9KClbXF18L1xcXS9nLCAiXFwkJiIpOwogICAgfQogICAgX19uYW1lKGVzY2FwZSwgImVzY2FwZSIpOwogICAgdmFyIFRva2VuRGF0YSA9IGNsYXNzIHsKICAgICAgc3RhdGljIHsKICAgICAgICBfX25hbWUodGhpcywgIlRva2VuRGF0YSIpOwogICAgICB9CiAgICAgIGNvbnN0cnVjdG9yKHRva2Vucywgb3JpZ2luYWxQYXRoKSB7CiAgICAgICAgdGhpcy50b2tlbnMgPSB0b2tlbnM7CiAgICAgICAgdGhpcy5vcmlnaW5hbFBhdGggPSBvcmlnaW5hbFBhdGg7CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzLlRva2VuRGF0YSA9IFRva2VuRGF0YTsKICAgIHZhciBQYXRoRXJyb3IgPSBjbGFzcyBleHRlbmRzIFR5cGVFcnJvciB7CiAgICAgIHN0YXRpYyB7CiAgICAgICAgX19uYW1lKHRoaXMsICJQYXRoRXJyb3IiKTsKICAgICAgfQogICAgICBjb25zdHJ1Y3RvcihtZXNzYWdlMiwgb3JpZ2luYWxQYXRoKSB7CiAgICAgICAgbGV0IHRleHQ4ID0gbWVzc2FnZTI7CiAgICAgICAgaWYgKG9yaWdpbmFsUGF0aCkKICAgICAgICAgIHRleHQ4ICs9IGA6ICR7b3JpZ2luYWxQYXRofWA7CiAgICAgICAgdGV4dDggKz0gYDsgdmlzaXQgaHR0cHM6Ly9naXQubmV3L3BhdGhUb1JlZ2V4cEVycm9yIGZvciBpbmZvYDsKICAgICAgICBzdXBlcih0ZXh0OCk7CiAgICAgICAgdGhpcy5vcmlnaW5hbFBhdGggPSBvcmlnaW5hbFBhdGg7CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzLlBhdGhFcnJvciA9IFBhdGhFcnJvcjsKICAgIGZ1bmN0aW9uIHBhcnNlOShzdHIsIG9wdGlvbnMgPSB7fSkgewogICAgICBjb25zdCB7IGVuY29kZVBhdGggPSBOT09QX1ZBTFVFIH0gPSBvcHRpb25zOwogICAgICBjb25zdCBjaGFycyA9IFsuLi5zdHJdOwogICAgICBjb25zdCB0b2tlbnMgPSBbXTsKICAgICAgbGV0IGluZGV4MiA9IDA7CiAgICAgIGxldCBwb3MgPSAwOwogICAgICBmdW5jdGlvbiBuYW1lKCkgewogICAgICAgIGxldCB2YWx1ZTIgPSAiIjsKICAgICAgICBpZiAoSURfU1RBUlQudGVzdChjaGFyc1tpbmRleDJdKSkgewogICAgICAgICAgZG8gewogICAgICAgICAgICB2YWx1ZTIgKz0gY2hhcnNbaW5kZXgyKytdOwogICAgICAgICAgfSB3aGlsZSAoSURfQ09OVElOVUUudGVzdChjaGFyc1tpbmRleDJdKSk7CiAgICAgICAgfSBlbHNlIGlmIChjaGFyc1tpbmRleDJdID09PSAnIicpIHsKICAgICAgICAgIGxldCBxdW90ZVN0YXJ0ID0gaW5kZXgyOwogICAgICAgICAgd2hpbGUgKGluZGV4MisrIDwgY2hhcnMubGVuZ3RoKSB7CiAgICAgICAgICAgIGlmIChjaGFyc1tpbmRleDJdID09PSAnIicpIHsKICAgICAgICAgICAgICBpbmRleDIrKzsKICAgICAgICAgICAgICBxdW90ZVN0YXJ0ID0gMDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2hhcnNbaW5kZXgyXSA9PT0gIlxcIikKICAgICAgICAgICAgICBpbmRleDIrKzsKICAgICAgICAgICAgdmFsdWUyICs9IGNoYXJzW2luZGV4Ml07CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocXVvdGVTdGFydCkgewogICAgICAgICAgICB0aHJvdyBuZXcgUGF0aEVycm9yKGBVbnRlcm1pbmF0ZWQgcXVvdGUgYXQgaW5kZXggJHtxdW90ZVN0YXJ0fWAsIHN0cik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghdmFsdWUyKSB7CiAgICAgICAgICB0aHJvdyBuZXcgUGF0aEVycm9yKGBNaXNzaW5nIHBhcmFtZXRlciBuYW1lIGF0IGluZGV4ICR7aW5kZXgyfWAsIHN0cik7CiAgICAgICAgfQogICAgICAgIHJldHVybiB2YWx1ZTI7CiAgICAgIH0KICAgICAgX19uYW1lKG5hbWUsICJuYW1lIik7CiAgICAgIHdoaWxlIChpbmRleDIgPCBjaGFycy5sZW5ndGgpIHsKICAgICAgICBjb25zdCB2YWx1ZTIgPSBjaGFyc1tpbmRleDJdOwogICAgICAgIGNvbnN0IHR5cGU1ID0gU0lNUExFX1RPS0VOU1t2YWx1ZTJdOwogICAgICAgIGlmICh0eXBlNSkgewogICAgICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiB0eXBlNSwgaW5kZXg6IGluZGV4MisrLCB2YWx1ZTogdmFsdWUyIH0pOwogICAgICAgIH0gZWxzZSBpZiAodmFsdWUyID09PSAiXFwiKSB7CiAgICAgICAgICB0b2tlbnMucHVzaCh7IHR5cGU6ICJlc2NhcGUiLCBpbmRleDogaW5kZXgyKyssIHZhbHVlOiBjaGFyc1tpbmRleDIrK10gfSk7CiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZTIgPT09ICI6IikgewogICAgICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiAicGFyYW0iLCBpbmRleDogaW5kZXgyKyssIHZhbHVlOiBuYW1lKCkgfSk7CiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZTIgPT09ICIqIikgewogICAgICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiAid2lsZGNhcmQiLCBpbmRleDogaW5kZXgyKyssIHZhbHVlOiBuYW1lKCkgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogImNoYXIiLCBpbmRleDogaW5kZXgyKyssIHZhbHVlOiB2YWx1ZTIgfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogImVuZCIsIGluZGV4OiBpbmRleDIsIHZhbHVlOiAiIiB9KTsKICAgICAgZnVuY3Rpb24gY29uc3VtZVVudGlsKGVuZFR5cGUpIHsKICAgICAgICBjb25zdCBvdXRwdXQgPSBbXTsKICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbcG9zKytdOwogICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09IGVuZFR5cGUpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICJjaGFyIiB8fCB0b2tlbi50eXBlID09PSAiZXNjYXBlIikgewogICAgICAgICAgICBsZXQgcGF0aDIgPSB0b2tlbi52YWx1ZTsKICAgICAgICAgICAgbGV0IGN1ciA9IHRva2Vuc1twb3NdOwogICAgICAgICAgICB3aGlsZSAoY3VyLnR5cGUgPT09ICJjaGFyIiB8fCBjdXIudHlwZSA9PT0gImVzY2FwZSIpIHsKICAgICAgICAgICAgICBwYXRoMiArPSBjdXIudmFsdWU7CiAgICAgICAgICAgICAgY3VyID0gdG9rZW5zWysrcG9zXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvdXRwdXQucHVzaCh7CiAgICAgICAgICAgICAgdHlwZTogInRleHQiLAogICAgICAgICAgICAgIHZhbHVlOiBlbmNvZGVQYXRoKHBhdGgyKQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gInBhcmFtIiB8fCB0b2tlbi50eXBlID09PSAid2lsZGNhcmQiKSB7CiAgICAgICAgICAgIG91dHB1dC5wdXNoKHsKICAgICAgICAgICAgICB0eXBlOiB0b2tlbi50eXBlLAogICAgICAgICAgICAgIG5hbWU6IHRva2VuLnZhbHVlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0b2tlbi50eXBlID09PSAieyIpIHsKICAgICAgICAgICAgb3V0cHV0LnB1c2goewogICAgICAgICAgICAgIHR5cGU6ICJncm91cCIsCiAgICAgICAgICAgICAgdG9rZW5zOiBjb25zdW1lVW50aWwoIn0iKQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICB0aHJvdyBuZXcgUGF0aEVycm9yKGBVbmV4cGVjdGVkICR7dG9rZW4udHlwZX0gYXQgaW5kZXggJHt0b2tlbi5pbmRleH0sIGV4cGVjdGVkICR7ZW5kVHlwZX1gLCBzdHIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gb3V0cHV0OwogICAgICB9CiAgICAgIF9fbmFtZShjb25zdW1lVW50aWwsICJjb25zdW1lVW50aWwiKTsKICAgICAgcmV0dXJuIG5ldyBUb2tlbkRhdGEoY29uc3VtZVVudGlsKCJlbmQiKSwgc3RyKTsKICAgIH0KICAgIF9fbmFtZShwYXJzZTksICJwYXJzZSIpOwogICAgZnVuY3Rpb24gY29tcGlsZTIocGF0aDIsIG9wdGlvbnMgPSB7fSkgewogICAgICBjb25zdCB7IGVuY29kZTogZW5jb2RlMiA9IGVuY29kZVVSSUNvbXBvbmVudCwgZGVsaW1pdGVyID0gREVGQVVMVF9ERUxJTUlURVIgfSA9IG9wdGlvbnM7CiAgICAgIGNvbnN0IGRhdGEgPSB0eXBlb2YgcGF0aDIgPT09ICJvYmplY3QiID8gcGF0aDIgOiBwYXJzZTkocGF0aDIsIG9wdGlvbnMpOwogICAgICBjb25zdCBmbiA9IHRva2Vuc1RvRnVuY3Rpb24oZGF0YS50b2tlbnMsIGRlbGltaXRlciwgZW5jb2RlMik7CiAgICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uIHBhdGgzKHBhcmFtcyA9IHt9KSB7CiAgICAgICAgY29uc3QgW3BhdGg0LCAuLi5taXNzaW5nXSA9IGZuKHBhcmFtcyk7CiAgICAgICAgaWYgKG1pc3NpbmcubGVuZ3RoKSB7CiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBNaXNzaW5nIHBhcmFtZXRlcnM6ICR7bWlzc2luZy5qb2luKCIsICIpfWApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcGF0aDQ7CiAgICAgIH0sICJwYXRoIik7CiAgICB9CiAgICBfX25hbWUoY29tcGlsZTIsICJjb21waWxlIik7CiAgICBmdW5jdGlvbiB0b2tlbnNUb0Z1bmN0aW9uKHRva2VucywgZGVsaW1pdGVyLCBlbmNvZGUyKSB7CiAgICAgIGNvbnN0IGVuY29kZXJzID0gdG9rZW5zLm1hcCgodG9rZW4pID0+IHRva2VuVG9GdW5jdGlvbih0b2tlbiwgZGVsaW1pdGVyLCBlbmNvZGUyKSk7CiAgICAgIHJldHVybiAoZGF0YSkgPT4gewogICAgICAgIGNvbnN0IHJlc3VsdCA9IFsiIl07CiAgICAgICAgZm9yIChjb25zdCBlbmNvZGVyIG9mIGVuY29kZXJzKSB7CiAgICAgICAgICBjb25zdCBbdmFsdWUyLCAuLi5leHRyYXNdID0gZW5jb2RlcihkYXRhKTsKICAgICAgICAgIHJlc3VsdFswXSArPSB2YWx1ZTI7CiAgICAgICAgICByZXN1bHQucHVzaCguLi5leHRyYXMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgfQogICAgX19uYW1lKHRva2Vuc1RvRnVuY3Rpb24sICJ0b2tlbnNUb0Z1bmN0aW9uIik7CiAgICBmdW5jdGlvbiB0b2tlblRvRnVuY3Rpb24odG9rZW4sIGRlbGltaXRlciwgZW5jb2RlMikgewogICAgICBpZiAodG9rZW4udHlwZSA9PT0gInRleHQiKQogICAgICAgIHJldHVybiAoKSA9PiBbdG9rZW4udmFsdWVdOwogICAgICBpZiAodG9rZW4udHlwZSA9PT0gImdyb3VwIikgewogICAgICAgIGNvbnN0IGZuID0gdG9rZW5zVG9GdW5jdGlvbih0b2tlbi50b2tlbnMsIGRlbGltaXRlciwgZW5jb2RlMik7CiAgICAgICAgcmV0dXJuIChkYXRhKSA9PiB7CiAgICAgICAgICBjb25zdCBbdmFsdWUyLCAuLi5taXNzaW5nXSA9IGZuKGRhdGEpOwogICAgICAgICAgaWYgKCFtaXNzaW5nLmxlbmd0aCkKICAgICAgICAgICAgcmV0dXJuIFt2YWx1ZTJdOwogICAgICAgICAgcmV0dXJuIFsiIl07CiAgICAgICAgfTsKICAgICAgfQogICAgICBjb25zdCBlbmNvZGVWYWx1ZSA9IGVuY29kZTIgfHwgTk9PUF9WQUxVRTsKICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICJ3aWxkY2FyZCIgJiYgZW5jb2RlMiAhPT0gZmFsc2UpIHsKICAgICAgICByZXR1cm4gKGRhdGEpID0+IHsKICAgICAgICAgIGNvbnN0IHZhbHVlMiA9IGRhdGFbdG9rZW4ubmFtZV07CiAgICAgICAgICBpZiAodmFsdWUyID09IG51bGwpCiAgICAgICAgICAgIHJldHVybiBbIiIsIHRva2VuLm5hbWVdOwogICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlMikgfHwgdmFsdWUyLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCAiJHt0b2tlbi5uYW1lfSIgdG8gYmUgYSBub24tZW1wdHkgYXJyYXlgKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgIHZhbHVlMi5tYXAoKHZhbHVlMywgaW5kZXgyKSA9PiB7CiAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZTMgIT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCAiJHt0b2tlbi5uYW1lfS8ke2luZGV4Mn0iIHRvIGJlIGEgc3RyaW5nYCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiBlbmNvZGVWYWx1ZSh2YWx1ZTMpOwogICAgICAgICAgICB9KS5qb2luKGRlbGltaXRlcikKICAgICAgICAgIF07CiAgICAgICAgfTsKICAgICAgfQogICAgICByZXR1cm4gKGRhdGEpID0+IHsKICAgICAgICBjb25zdCB2YWx1ZTIgPSBkYXRhW3Rva2VuLm5hbWVdOwogICAgICAgIGlmICh2YWx1ZTIgPT0gbnVsbCkKICAgICAgICAgIHJldHVybiBbIiIsIHRva2VuLm5hbWVdOwogICAgICAgIGlmICh0eXBlb2YgdmFsdWUyICE9PSAic3RyaW5nIikgewogICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgIiR7dG9rZW4ubmFtZX0iIHRvIGJlIGEgc3RyaW5nYCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBbZW5jb2RlVmFsdWUodmFsdWUyKV07CiAgICAgIH07CiAgICB9CiAgICBfX25hbWUodG9rZW5Ub0Z1bmN0aW9uLCAidG9rZW5Ub0Z1bmN0aW9uIik7CiAgICBmdW5jdGlvbiBtYXRjaDIocGF0aDIsIG9wdGlvbnMgPSB7fSkgewogICAgICBjb25zdCB7IGRlY29kZTogZGVjb2RlMiA9IGRlY29kZVVSSUNvbXBvbmVudCwgZGVsaW1pdGVyID0gREVGQVVMVF9ERUxJTUlURVIgfSA9IG9wdGlvbnM7CiAgICAgIGNvbnN0IHsgcmVnZXhwLCBrZXlzOiBrZXlzMiB9ID0gcGF0aFRvUmVnZXhwKHBhdGgyLCBvcHRpb25zKTsKICAgICAgY29uc3QgZGVjb2RlcnMgPSBrZXlzMi5tYXAoKGtleTIpID0+IHsKICAgICAgICBpZiAoZGVjb2RlMiA9PT0gZmFsc2UpCiAgICAgICAgICByZXR1cm4gTk9PUF9WQUxVRTsKICAgICAgICBpZiAoa2V5Mi50eXBlID09PSAicGFyYW0iKQogICAgICAgICAgcmV0dXJuIGRlY29kZTI7CiAgICAgICAgcmV0dXJuICh2YWx1ZTIpID0+IHZhbHVlMi5zcGxpdChkZWxpbWl0ZXIpLm1hcChkZWNvZGUyKTsKICAgICAgfSk7CiAgICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uIG1hdGNoMyhpbnB1dCkgewogICAgICAgIGNvbnN0IG01ID0gcmVnZXhwLmV4ZWMoaW5wdXQpOwogICAgICAgIGlmICghbTUpCiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgY29uc3QgcGF0aDMgPSBtNVswXTsKICAgICAgICBjb25zdCBwYXJhbXMgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICBmb3IgKGxldCBpMTAgPSAxOyBpMTAgPCBtNS5sZW5ndGg7IGkxMCsrKSB7CiAgICAgICAgICBpZiAobTVbaTEwXSA9PT0gdm9pZCAwKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIGNvbnN0IGtleTIgPSBrZXlzMltpMTAgLSAxXTsKICAgICAgICAgIGNvbnN0IGRlY29kZXIgPSBkZWNvZGVyc1tpMTAgLSAxXTsKICAgICAgICAgIHBhcmFtc1trZXkyLm5hbWVdID0gZGVjb2RlcihtNVtpMTBdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgcGF0aDogcGF0aDMsIHBhcmFtcyB9OwogICAgICB9LCAibWF0Y2giKTsKICAgIH0KICAgIF9fbmFtZShtYXRjaDIsICJtYXRjaCIpOwogICAgZnVuY3Rpb24gcGF0aFRvUmVnZXhwKHBhdGgyLCBvcHRpb25zID0ge30pIHsKICAgICAgY29uc3QgeyBkZWxpbWl0ZXIgPSBERUZBVUxUX0RFTElNSVRFUiwgZW5kID0gdHJ1ZSwgc2Vuc2l0aXZlID0gZmFsc2UsIHRyYWlsaW5nID0gdHJ1ZSB9ID0gb3B0aW9uczsKICAgICAgY29uc3Qga2V5czIgPSBbXTsKICAgICAgY29uc3QgZmxhZ3MgPSBzZW5zaXRpdmUgPyAiIiA6ICJpIjsKICAgICAgY29uc3Qgc291cmNlcyA9IFtdOwogICAgICBmb3IgKGNvbnN0IGlucHV0IG9mIHBhdGhzVG9BcnJheShwYXRoMiwgW10pKSB7CiAgICAgICAgY29uc3QgZGF0YSA9IHR5cGVvZiBpbnB1dCA9PT0gIm9iamVjdCIgPyBpbnB1dCA6IHBhcnNlOShpbnB1dCwgb3B0aW9ucyk7CiAgICAgICAgZm9yIChjb25zdCB0b2tlbnMgb2YgZmxhdHRlbihkYXRhLnRva2VucywgMCwgW10pKSB7CiAgICAgICAgICBzb3VyY2VzLnB1c2godG9SZWdFeHBTb3VyY2UodG9rZW5zLCBkZWxpbWl0ZXIsIGtleXMyLCBkYXRhLm9yaWdpbmFsUGF0aCkpOwogICAgICAgIH0KICAgICAgfQogICAgICBsZXQgcGF0dGVybiA9IGBeKD86JHtzb3VyY2VzLmpvaW4oInwiKX0pYDsKICAgICAgaWYgKHRyYWlsaW5nKQogICAgICAgIHBhdHRlcm4gKz0gYCg/OiR7ZXNjYXBlKGRlbGltaXRlcil9JCk/YDsKICAgICAgcGF0dGVybiArPSBlbmQgPyAiJCIgOiBgKD89JHtlc2NhcGUoZGVsaW1pdGVyKX18JClgOwogICAgICBjb25zdCByZWdleHAgPSBuZXcgUmVnRXhwKHBhdHRlcm4sIGZsYWdzKTsKICAgICAgcmV0dXJuIHsgcmVnZXhwLCBrZXlzOiBrZXlzMiB9OwogICAgfQogICAgX19uYW1lKHBhdGhUb1JlZ2V4cCwgInBhdGhUb1JlZ2V4cCIpOwogICAgZnVuY3Rpb24gcGF0aHNUb0FycmF5KHBhdGhzLCBpbml0KSB7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhdGhzKSkgewogICAgICAgIGZvciAoY29uc3QgcDYgb2YgcGF0aHMpCiAgICAgICAgICBwYXRoc1RvQXJyYXkocDYsIGluaXQpOwogICAgICB9IGVsc2UgewogICAgICAgIGluaXQucHVzaChwYXRocyk7CiAgICAgIH0KICAgICAgcmV0dXJuIGluaXQ7CiAgICB9CiAgICBfX25hbWUocGF0aHNUb0FycmF5LCAicGF0aHNUb0FycmF5Iik7CiAgICBmdW5jdGlvbiogZmxhdHRlbih0b2tlbnMsIGluZGV4MiwgaW5pdCkgewogICAgICBpZiAoaW5kZXgyID09PSB0b2tlbnMubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuIHlpZWxkIGluaXQ7CiAgICAgIH0KICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbaW5kZXgyXTsKICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICJncm91cCIpIHsKICAgICAgICBmb3IgKGNvbnN0IHNlcSBvZiBmbGF0dGVuKHRva2VuLnRva2VucywgMCwgaW5pdC5zbGljZSgpKSkgewogICAgICAgICAgeWllbGQqIGZsYXR0ZW4odG9rZW5zLCBpbmRleDIgKyAxLCBzZXEpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBpbml0LnB1c2godG9rZW4pOwogICAgICB9CiAgICAgIHlpZWxkKiBmbGF0dGVuKHRva2VucywgaW5kZXgyICsgMSwgaW5pdCk7CiAgICB9CiAgICBfX25hbWUoZmxhdHRlbiwgImZsYXR0ZW4iKTsKICAgIGZ1bmN0aW9uIHRvUmVnRXhwU291cmNlKHRva2VucywgZGVsaW1pdGVyLCBrZXlzMiwgb3JpZ2luYWxQYXRoKSB7CiAgICAgIGxldCByZXN1bHQgPSAiIjsKICAgICAgbGV0IGJhY2t0cmFjayA9ICIiOwogICAgICBsZXQgaXNTYWZlU2VnbWVudFBhcmFtID0gdHJ1ZTsKICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiB0b2tlbnMpIHsKICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gInRleHQiKSB7CiAgICAgICAgICByZXN1bHQgKz0gZXNjYXBlKHRva2VuLnZhbHVlKTsKICAgICAgICAgIGJhY2t0cmFjayArPSB0b2tlbi52YWx1ZTsKICAgICAgICAgIGlzU2FmZVNlZ21lbnRQYXJhbSB8fCAoaXNTYWZlU2VnbWVudFBhcmFtID0gdG9rZW4udmFsdWUuaW5jbHVkZXMoZGVsaW1pdGVyKSk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICJwYXJhbSIgfHwgdG9rZW4udHlwZSA9PT0gIndpbGRjYXJkIikgewogICAgICAgICAgaWYgKCFpc1NhZmVTZWdtZW50UGFyYW0gJiYgIWJhY2t0cmFjaykgewogICAgICAgICAgICB0aHJvdyBuZXcgUGF0aEVycm9yKGBNaXNzaW5nIHRleHQgYmVmb3JlICIke3Rva2VuLm5hbWV9IiAke3Rva2VuLnR5cGV9YCwgb3JpZ2luYWxQYXRoKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0b2tlbi50eXBlID09PSAicGFyYW0iKSB7CiAgICAgICAgICAgIHJlc3VsdCArPSBgKCR7bmVnYXRlKGRlbGltaXRlciwgaXNTYWZlU2VnbWVudFBhcmFtID8gIiIgOiBiYWNrdHJhY2spfSspYDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJlc3VsdCArPSBgKFtcXHNcXFNdKylgOwogICAgICAgICAgfQogICAgICAgICAga2V5czIucHVzaCh0b2tlbik7CiAgICAgICAgICBiYWNrdHJhY2sgPSAiIjsKICAgICAgICAgIGlzU2FmZVNlZ21lbnRQYXJhbSA9IGZhbHNlOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBfX25hbWUodG9SZWdFeHBTb3VyY2UsICJ0b1JlZ0V4cFNvdXJjZSIpOwogICAgZnVuY3Rpb24gbmVnYXRlKGRlbGltaXRlciwgYmFja3RyYWNrKSB7CiAgICAgIGlmIChiYWNrdHJhY2subGVuZ3RoIDwgMikgewogICAgICAgIGlmIChkZWxpbWl0ZXIubGVuZ3RoIDwgMikKICAgICAgICAgIHJldHVybiBgW14ke2VzY2FwZShkZWxpbWl0ZXIgKyBiYWNrdHJhY2spfV1gOwogICAgICAgIHJldHVybiBgKD86KD8hJHtlc2NhcGUoZGVsaW1pdGVyKX0pW14ke2VzY2FwZShiYWNrdHJhY2spfV0pYDsKICAgICAgfQogICAgICBpZiAoZGVsaW1pdGVyLmxlbmd0aCA8IDIpIHsKICAgICAgICByZXR1cm4gYCg/Oig/ISR7ZXNjYXBlKGJhY2t0cmFjayl9KVteJHtlc2NhcGUoZGVsaW1pdGVyKX1dKWA7CiAgICAgIH0KICAgICAgcmV0dXJuIGAoPzooPyEke2VzY2FwZShiYWNrdHJhY2spfXwke2VzY2FwZShkZWxpbWl0ZXIpfSlbXFxzXFxTXSlgOwogICAgfQogICAgX19uYW1lKG5lZ2F0ZSwgIm5lZ2F0ZSIpOwogICAgZnVuY3Rpb24gc3RyaW5naWZ5VG9rZW5zKHRva2VucykgewogICAgICBsZXQgdmFsdWUyID0gIiI7CiAgICAgIGxldCBpMTAgPSAwOwogICAgICBmdW5jdGlvbiBuYW1lKHZhbHVlMykgewogICAgICAgIGNvbnN0IGlzU2FmZSA9IGlzTmFtZVNhZmUodmFsdWUzKSAmJiBpc05leHROYW1lU2FmZSh0b2tlbnNbaTEwXSk7CiAgICAgICAgcmV0dXJuIGlzU2FmZSA/IHZhbHVlMyA6IEpTT04uc3RyaW5naWZ5KHZhbHVlMyk7CiAgICAgIH0KICAgICAgX19uYW1lKG5hbWUsICJuYW1lIik7CiAgICAgIHdoaWxlIChpMTAgPCB0b2tlbnMubGVuZ3RoKSB7CiAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbaTEwKytdOwogICAgICAgIGlmICh0b2tlbi50eXBlID09PSAidGV4dCIpIHsKICAgICAgICAgIHZhbHVlMiArPSBlc2NhcGVUZXh0KHRva2VuLnZhbHVlKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gImdyb3VwIikgewogICAgICAgICAgdmFsdWUyICs9IGB7JHtzdHJpbmdpZnlUb2tlbnModG9rZW4udG9rZW5zKX19YDsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gInBhcmFtIikgewogICAgICAgICAgdmFsdWUyICs9IGA6JHtuYW1lKHRva2VuLm5hbWUpfWA7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICJ3aWxkY2FyZCIpIHsKICAgICAgICAgIHZhbHVlMiArPSBgKiR7bmFtZSh0b2tlbi5uYW1lKX1gOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFVua25vd24gdG9rZW4gdHlwZTogJHt0b2tlbi50eXBlfWApOwogICAgICB9CiAgICAgIHJldHVybiB2YWx1ZTI7CiAgICB9CiAgICBfX25hbWUoc3RyaW5naWZ5VG9rZW5zLCAic3RyaW5naWZ5VG9rZW5zIik7CiAgICBmdW5jdGlvbiBzdHJpbmdpZnk3KGRhdGEpIHsKICAgICAgcmV0dXJuIHN0cmluZ2lmeVRva2VucyhkYXRhLnRva2Vucyk7CiAgICB9CiAgICBfX25hbWUoc3RyaW5naWZ5NywgInN0cmluZ2lmeSIpOwogICAgZnVuY3Rpb24gaXNOYW1lU2FmZShuYW1lKSB7CiAgICAgIGNvbnN0IFtmaXJzdDIsIC4uLnJlc3RdID0gbmFtZTsKICAgICAgcmV0dXJuIElEX1NUQVJULnRlc3QoZmlyc3QyKSAmJiByZXN0LmV2ZXJ5KChjaGFyKSA9PiBJRF9DT05USU5VRS50ZXN0KGNoYXIpKTsKICAgIH0KICAgIF9fbmFtZShpc05hbWVTYWZlLCAiaXNOYW1lU2FmZSIpOwogICAgZnVuY3Rpb24gaXNOZXh0TmFtZVNhZmUodG9rZW4pIHsKICAgICAgaWYgKHRva2VuICYmIHRva2VuLnR5cGUgPT09ICJ0ZXh0IikKICAgICAgICByZXR1cm4gIUlEX0NPTlRJTlVFLnRlc3QodG9rZW4udmFsdWVbMF0pOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIF9fbmFtZShpc05leHROYW1lU2FmZSwgImlzTmV4dE5hbWVTYWZlIik7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9zd2VldC1zY3JvbGxANC4wLjAvbm9kZV9tb2R1bGVzL3N3ZWV0LXNjcm9sbC9zd2VldC1zY3JvbGwuanMKdmFyIHJlcXVpcmVfc3dlZXRfc2Nyb2xsID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9zd2VldC1zY3JvbGxANC4wLjAvbm9kZV9tb2R1bGVzL3N3ZWV0LXNjcm9sbC9zd2VldC1zY3JvbGwuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgKGZ1bmN0aW9uKGdsb2JhbDIsIGZhY3RvcnkpIHsKICAgICAgdHlwZW9mIGV4cG9ydHMgPT09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgIT09ICJ1bmRlZmluZWQiID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOiB0eXBlb2YgZGVmaW5lID09PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOiAoZ2xvYmFsMiA9IGdsb2JhbDIgfHwgc2VsZiwgZ2xvYmFsMi5Td2VldFNjcm9sbCA9IGZhY3RvcnkoKSk7CiAgICB9KShleHBvcnRzLCBmdW5jdGlvbigpIHsKICAgICAgInVzZSBzdHJpY3QiOwogICAgICB2YXIgX19hc3NpZ24yID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHsKICAgICAgICBfX2Fzc2lnbjIgPSBPYmplY3QuYXNzaWduIHx8IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gX19hc3NpZ24zKHQ4KSB7CiAgICAgICAgICBmb3IgKHZhciBzOSwgaTEwID0gMSwgbjExID0gYXJndW1lbnRzLmxlbmd0aDsgaTEwIDwgbjExOyBpMTArKykgewogICAgICAgICAgICBzOSA9IGFyZ3VtZW50c1tpMTBdOwogICAgICAgICAgICBmb3IgKHZhciBwNiBpbiBzOSkgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzOSwgcDYpKSB0OFtwNl0gPSBzOVtwNl07CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdDg7CiAgICAgICAgfSwgIl9fYXNzaWduIik7CiAgICAgICAgcmV0dXJuIF9fYXNzaWduMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICB9LCAiX19hc3NpZ24iKTsKICAgICAgdmFyIGNhblVzZURPTSA9ICEhKHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiICYmIHdpbmRvdy5kb2N1bWVudCAmJiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7CiAgICAgIHZhciBjYW5Vc2VIaXN0b3J5ID0gIWNhblVzZURPTSA/IGZhbHNlIDogd2luZG93Lmhpc3RvcnkgJiYgInB1c2hTdGF0ZSIgaW4gd2luZG93Lmhpc3RvcnkgJiYgd2luZG93LmxvY2F0aW9uLnByb3RvY29sICE9PSAiZmlsZToiOwogICAgICB2YXIgY2FuVXNlUGFzc2l2ZU9wdGlvbiA9IChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc3VwcG9ydCA9IGZhbHNlOwogICAgICAgIGlmICghY2FuVXNlRE9NKSB7CiAgICAgICAgICByZXR1cm4gc3VwcG9ydDsKICAgICAgICB9CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHZhciB3aW4gPSB3aW5kb3c7CiAgICAgICAgICB2YXIgb3B0cyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgInBhc3NpdmUiLCB7CiAgICAgICAgICAgIGdldDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHsKICAgICAgICAgICAgICBzdXBwb3J0ID0gdHJ1ZTsKICAgICAgICAgICAgfSwgImdldCIpCiAgICAgICAgICB9KTsKICAgICAgICAgIHdpbi5hZGRFdmVudExpc3RlbmVyKCJ0ZXN0IiwgbnVsbCwgb3B0cyk7CiAgICAgICAgICB3aW4ucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGVzdCIsIG51bGwsIG9wdHMpOwogICAgICAgIH0gY2F0Y2ggKGUxMCkgewogICAgICAgIH0KICAgICAgICByZXR1cm4gc3VwcG9ydDsKICAgICAgfSkoKTsKICAgICAgdmFyIGlzU3RyaW5nMyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICJzdHJpbmciOwogICAgICB9LCAiaXNTdHJpbmciKTsKICAgICAgdmFyIGlzRnVuY3Rpb24yID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihvYmopIHsKICAgICAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gImZ1bmN0aW9uIjsKICAgICAgfSwgImlzRnVuY3Rpb24iKTsKICAgICAgdmFyIGlzQXJyYXk1ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihvYmopIHsKICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShvYmopOwogICAgICB9LCAiaXNBcnJheSIpOwogICAgICB2YXIgaXNOdW1lcmljID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihvYmopIHsKICAgICAgICByZXR1cm4gIWlzQXJyYXk1KG9iaikgJiYgb2JqIC0gcGFyc2VGbG9hdChvYmopICsgMSA+PSAwOwogICAgICB9LCAiaXNOdW1lcmljIik7CiAgICAgIHZhciBoYXNQcm9wID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihvYmosIGtleTIpIHsKICAgICAgICByZXR1cm4gb2JqICYmIG9iai5oYXNPd25Qcm9wZXJ0eShrZXkyKTsKICAgICAgfSwgImhhc1Byb3AiKTsKICAgICAgdmFyIHJhZiA9IGNhblVzZURPTSA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpIDogbnVsbDsKICAgICAgdmFyIGNhZiA9IGNhblVzZURPTSA/IHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdykgOiBudWxsOwogICAgICB2YXIgY29zID0gTWF0aC5jb3MsIHNpbiA9IE1hdGguc2luLCBwb3cgPSBNYXRoLnBvdywgc3FydCA9IE1hdGguc3FydCwgUEkgPSBNYXRoLlBJOwogICAgICB2YXIgZWFzaW5ncyA9IHsKICAgICAgICBsaW5lYXI6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24ocDYpIHsKICAgICAgICAgIHJldHVybiBwNjsKICAgICAgICB9LCAibGluZWFyIiksCiAgICAgICAgZWFzZUluUXVhZDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihfMywgdDgsIGI0LCBjMTAsIGQ0KSB7CiAgICAgICAgICByZXR1cm4gYzEwICogKHQ4IC89IGQ0KSAqIHQ4ICsgYjQ7CiAgICAgICAgfSwgImVhc2VJblF1YWQiKSwKICAgICAgICBlYXNlT3V0UXVhZDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihfMywgdDgsIGI0LCBjMTAsIGQ0KSB7CiAgICAgICAgICByZXR1cm4gLWMxMCAqICh0OCAvPSBkNCkgKiAodDggLSAyKSArIGI0OwogICAgICAgIH0sICJlYXNlT3V0UXVhZCIpLAogICAgICAgIGVhc2VJbk91dFF1YWQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oXzMsIHQ4LCBiNCwgYzEwLCBkNCkgewogICAgICAgICAgcmV0dXJuICh0OCAvPSBkNCAvIDIpIDwgMSA/IGMxMCAvIDIgKiB0OCAqIHQ4ICsgYjQgOiAtYzEwIC8gMiAqICgtLXQ4ICogKHQ4IC0gMikgLSAxKSArIGI0OwogICAgICAgIH0sICJlYXNlSW5PdXRRdWFkIiksCiAgICAgICAgZWFzZUluQ3ViaWM6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oXzMsIHQ4LCBiNCwgYzEwLCBkNCkgewogICAgICAgICAgcmV0dXJuIGMxMCAqICh0OCAvPSBkNCkgKiB0OCAqIHQ4ICsgYjQ7CiAgICAgICAgfSwgImVhc2VJbkN1YmljIiksCiAgICAgICAgZWFzZU91dEN1YmljOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKF8zLCB0OCwgYjQsIGMxMCwgZDQpIHsKICAgICAgICAgIHJldHVybiBjMTAgKiAoKHQ4ID0gdDggLyBkNCAtIDEpICogdDggKiB0OCArIDEpICsgYjQ7CiAgICAgICAgfSwgImVhc2VPdXRDdWJpYyIpLAogICAgICAgIGVhc2VJbk91dEN1YmljOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKF8zLCB0OCwgYjQsIGMxMCwgZDQpIHsKICAgICAgICAgIHJldHVybiAodDggLz0gZDQgLyAyKSA8IDEgPyBjMTAgLyAyICogdDggKiB0OCAqIHQ4ICsgYjQgOiBjMTAgLyAyICogKCh0OCAtPSAyKSAqIHQ4ICogdDggKyAyKSArIGI0OwogICAgICAgIH0sICJlYXNlSW5PdXRDdWJpYyIpLAogICAgICAgIGVhc2VJblF1YXJ0OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKF8zLCB0OCwgYjQsIGMxMCwgZDQpIHsKICAgICAgICAgIHJldHVybiBjMTAgKiAodDggLz0gZDQpICogdDggKiB0OCAqIHQ4ICsgYjQ7CiAgICAgICAgfSwgImVhc2VJblF1YXJ0IiksCiAgICAgICAgZWFzZU91dFF1YXJ0OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKF8zLCB0OCwgYjQsIGMxMCwgZDQpIHsKICAgICAgICAgIHJldHVybiAtYzEwICogKCh0OCA9IHQ4IC8gZDQgLSAxKSAqIHQ4ICogdDggKiB0OCAtIDEpICsgYjQ7CiAgICAgICAgfSwgImVhc2VPdXRRdWFydCIpLAogICAgICAgIGVhc2VJbk91dFF1YXJ0OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKF8zLCB0OCwgYjQsIGMxMCwgZDQpIHsKICAgICAgICAgIHJldHVybiAodDggLz0gZDQgLyAyKSA8IDEgPyBjMTAgLyAyICogdDggKiB0OCAqIHQ4ICogdDggKyBiNCA6IC1jMTAgLyAyICogKCh0OCAtPSAyKSAqIHQ4ICogdDggKiB0OCAtIDIpICsgYjQ7CiAgICAgICAgfSwgImVhc2VJbk91dFF1YXJ0IiksCiAgICAgICAgZWFzZUluUXVpbnQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oXzMsIHQ4LCBiNCwgYzEwLCBkNCkgewogICAgICAgICAgcmV0dXJuIGMxMCAqICh0OCAvPSBkNCkgKiB0OCAqIHQ4ICogdDggKiB0OCArIGI0OwogICAgICAgIH0sICJlYXNlSW5RdWludCIpLAogICAgICAgIGVhc2VPdXRRdWludDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihfMywgdDgsIGI0LCBjMTAsIGQ0KSB7CiAgICAgICAgICByZXR1cm4gYzEwICogKCh0OCA9IHQ4IC8gZDQgLSAxKSAqIHQ4ICogdDggKiB0OCAqIHQ4ICsgMSkgKyBiNDsKICAgICAgICB9LCAiZWFzZU91dFF1aW50IiksCiAgICAgICAgZWFzZUluT3V0UXVpbnQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oXzMsIHQ4LCBiNCwgYzEwLCBkNCkgewogICAgICAgICAgcmV0dXJuICh0OCAvPSBkNCAvIDIpIDwgMSA/IGMxMCAvIDIgKiB0OCAqIHQ4ICogdDggKiB0OCAqIHQ4ICsgYjQgOiBjMTAgLyAyICogKCh0OCAtPSAyKSAqIHQ4ICogdDggKiB0OCAqIHQ4ICsgMikgKyBiNDsKICAgICAgICB9LCAiZWFzZUluT3V0UXVpbnQiKSwKICAgICAgICBlYXNlSW5TaW5lOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKF8zLCB0OCwgYjQsIGMxMCwgZDQpIHsKICAgICAgICAgIHJldHVybiAtYzEwICogY29zKHQ4IC8gZDQgKiAoUEkgLyAyKSkgKyBjMTAgKyBiNDsKICAgICAgICB9LCAiZWFzZUluU2luZSIpLAogICAgICAgIGVhc2VPdXRTaW5lOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKF8zLCB0OCwgYjQsIGMxMCwgZDQpIHsKICAgICAgICAgIHJldHVybiBjMTAgKiBzaW4odDggLyBkNCAqIChQSSAvIDIpKSArIGI0OwogICAgICAgIH0sICJlYXNlT3V0U2luZSIpLAogICAgICAgIGVhc2VJbk91dFNpbmU6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oXzMsIHQ4LCBiNCwgYzEwLCBkNCkgewogICAgICAgICAgcmV0dXJuIC1jMTAgLyAyICogKGNvcyhQSSAqIHQ4IC8gZDQpIC0gMSkgKyBiNDsKICAgICAgICB9LCAiZWFzZUluT3V0U2luZSIpLAogICAgICAgIGVhc2VJbkV4cG86IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oXzMsIHQ4LCBiNCwgYzEwLCBkNCkgewogICAgICAgICAgcmV0dXJuIHQ4ID09PSAwID8gYjQgOiBjMTAgKiBwb3coMiwgMTAgKiAodDggLyBkNCAtIDEpKSArIGI0OwogICAgICAgIH0sICJlYXNlSW5FeHBvIiksCiAgICAgICAgZWFzZU91dEV4cG86IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oXzMsIHQ4LCBiNCwgYzEwLCBkNCkgewogICAgICAgICAgcmV0dXJuIHQ4ID09PSBkNCA/IGI0ICsgYzEwIDogYzEwICogKC1wb3coMiwgLTEwICogdDggLyBkNCkgKyAxKSArIGI0OwogICAgICAgIH0sICJlYXNlT3V0RXhwbyIpLAogICAgICAgIGVhc2VJbk91dEV4cG86IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oXzMsIHQ4LCBiNCwgYzEwLCBkNCkgewogICAgICAgICAgaWYgKHQ4ID09PSAwKQogICAgICAgICAgICByZXR1cm4gYjQ7CiAgICAgICAgICBpZiAodDggPT09IGQ0KQogICAgICAgICAgICByZXR1cm4gYjQgKyBjMTA7CiAgICAgICAgICBpZiAoKHQ4IC89IGQ0IC8gMikgPCAxKQogICAgICAgICAgICByZXR1cm4gYzEwIC8gMiAqIHBvdygyLCAxMCAqICh0OCAtIDEpKSArIGI0OwogICAgICAgICAgcmV0dXJuIGMxMCAvIDIgKiAoLXBvdygyLCAtMTAgKiAtLXQ4KSArIDIpICsgYjQ7CiAgICAgICAgfSwgImVhc2VJbk91dEV4cG8iKSwKICAgICAgICBlYXNlSW5DaXJjOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKF8zLCB0OCwgYjQsIGMxMCwgZDQpIHsKICAgICAgICAgIHJldHVybiAtYzEwICogKHNxcnQoMSAtICh0OCAvPSBkNCkgKiB0OCkgLSAxKSArIGI0OwogICAgICAgIH0sICJlYXNlSW5DaXJjIiksCiAgICAgICAgZWFzZU91dENpcmM6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oXzMsIHQ4LCBiNCwgYzEwLCBkNCkgewogICAgICAgICAgcmV0dXJuIGMxMCAqIHNxcnQoMSAtICh0OCA9IHQ4IC8gZDQgLSAxKSAqIHQ4KSArIGI0OwogICAgICAgIH0sICJlYXNlT3V0Q2lyYyIpLAogICAgICAgIGVhc2VJbk91dENpcmM6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oXzMsIHQ4LCBiNCwgYzEwLCBkNCkgewogICAgICAgICAgcmV0dXJuICh0OCAvPSBkNCAvIDIpIDwgMSA/IC1jMTAgLyAyICogKHNxcnQoMSAtIHQ4ICogdDgpIC0gMSkgKyBiNCA6IGMxMCAvIDIgKiAoc3FydCgxIC0gKHQ4IC09IDIpICogdDgpICsgMSkgKyBiNDsKICAgICAgICB9LCAiZWFzZUluT3V0Q2lyYyIpCiAgICAgIH07CiAgICAgIHZhciAkJCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oc2VsZWN0b3IpIHsKICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIXNlbGVjdG9yID8gW10gOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSk7CiAgICAgIH0sICIkJCIpOwogICAgICB2YXIgJDMgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKHNlbGVjdG9yKSB7CiAgICAgICAgcmV0dXJuICQkKHNlbGVjdG9yKS5zaGlmdCgpIHx8IG51bGw7CiAgICAgIH0sICIkIik7CiAgICAgIHZhciBpc0VsZW1lbnQgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKG9iaikgewogICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBFbGVtZW50OwogICAgICB9LCAiaXNFbGVtZW50Iik7CiAgICAgIHZhciBpc1dpbmRvdyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oJGVsKSB7CiAgICAgICAgcmV0dXJuICRlbCA9PT0gd2luZG93OwogICAgICB9LCAiaXNXaW5kb3ciKTsKICAgICAgdmFyIGlzUm9vdENvbnRhaW5lciA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oJGVsKSB7CiAgICAgICAgcmV0dXJuICRlbCA9PT0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8ICRlbCA9PT0gZG9jdW1lbnQuYm9keTsKICAgICAgfSwgImlzUm9vdENvbnRhaW5lciIpOwogICAgICB2YXIgbWF0Y2hlcyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oJGVsLCBzZWxlY3RvcikgewogICAgICAgIGlmIChpc0VsZW1lbnQoc2VsZWN0b3IpKSB7CiAgICAgICAgICByZXR1cm4gJGVsID09PSBzZWxlY3RvcjsKICAgICAgICB9CiAgICAgICAgdmFyIHJlc3VsdHMgPSAkJChzZWxlY3Rvcik7CiAgICAgICAgdmFyIGkxMCA9IHJlc3VsdHMubGVuZ3RoOwogICAgICAgIHdoaWxlICgtLWkxMCA+PSAwICYmIHJlc3VsdHNbaTEwXSAhPT0gJGVsKSB7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpMTAgPiAtMTsKICAgICAgfSwgIm1hdGNoZXMiKTsKICAgICAgdmFyIGdldEhlaWdodCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oJGVsKSB7CiAgICAgICAgcmV0dXJuIE1hdGgubWF4KCRlbC5zY3JvbGxIZWlnaHQsICRlbC5jbGllbnRIZWlnaHQsICRlbC5vZmZzZXRIZWlnaHQpOwogICAgICB9LCAiZ2V0SGVpZ2h0Iik7CiAgICAgIHZhciBnZXRXaWR0aCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oJGVsKSB7CiAgICAgICAgcmV0dXJuIE1hdGgubWF4KCRlbC5zY3JvbGxXaWR0aCwgJGVsLmNsaWVudFdpZHRoLCAkZWwub2Zmc2V0V2lkdGgpOwogICAgICB9LCAiZ2V0V2lkdGgiKTsKICAgICAgdmFyIGdldFNpemUgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCRlbCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICB3aWR0aDogZ2V0V2lkdGgoJGVsKSwKICAgICAgICAgIGhlaWdodDogZ2V0SGVpZ2h0KCRlbCkKICAgICAgICB9OwogICAgICB9LCAiZ2V0U2l6ZSIpOwogICAgICB2YXIgZ2V0Vmlld3BvcnRBbmRFbGVtZW50U2l6ZXMgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCRlbCkgewogICAgICAgIHZhciBpc1Jvb3QgPSBpc1dpbmRvdygkZWwpIHx8IGlzUm9vdENvbnRhaW5lcigkZWwpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICB2aWV3cG9ydDogewogICAgICAgICAgICB3aWR0aDogaXNSb290ID8gTWF0aC5taW4od2luZG93LmlubmVyV2lkdGgsIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkgOiAkZWwuY2xpZW50V2lkdGgsCiAgICAgICAgICAgIGhlaWdodDogaXNSb290ID8gd2luZG93LmlubmVySGVpZ2h0IDogJGVsLmNsaWVudEhlaWdodAogICAgICAgICAgfSwKICAgICAgICAgIHNpemU6IGlzUm9vdCA/IHsKICAgICAgICAgICAgd2lkdGg6IE1hdGgubWF4KGdldFdpZHRoKGRvY3VtZW50LmJvZHkpLCBnZXRXaWR0aChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpKSwKICAgICAgICAgICAgaGVpZ2h0OiBNYXRoLm1heChnZXRIZWlnaHQoZG9jdW1lbnQuYm9keSksIGdldEhlaWdodChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpKQogICAgICAgICAgfSA6IGdldFNpemUoJGVsKQogICAgICAgIH07CiAgICAgIH0sICJnZXRWaWV3cG9ydEFuZEVsZW1lbnRTaXplcyIpOwogICAgICB2YXIgZGlyZWN0aW9uTWV0aG9kTWFwID0gewogICAgICAgIHk6ICJzY3JvbGxUb3AiLAogICAgICAgIHg6ICJzY3JvbGxMZWZ0IgogICAgICB9OwogICAgICB2YXIgZGlyZWN0aW9uUHJvcE1hcCA9IHsKICAgICAgICB5OiAicGFnZVlPZmZzZXQiLAogICAgICAgIHg6ICJwYWdlWE9mZnNldCIKICAgICAgfTsKICAgICAgdmFyIGdldFNjcm9sbCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oJGVsLCBkaXJlY3Rpb24pIHsKICAgICAgICByZXR1cm4gaXNXaW5kb3coJGVsKSA/ICRlbFtkaXJlY3Rpb25Qcm9wTWFwW2RpcmVjdGlvbl1dIDogJGVsW2RpcmVjdGlvbk1ldGhvZE1hcFtkaXJlY3Rpb25dXTsKICAgICAgfSwgImdldFNjcm9sbCIpOwogICAgICB2YXIgc2V0U2Nyb2xsID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigkZWwsIG9mZnNldCwgZGlyZWN0aW9uKSB7CiAgICAgICAgaWYgKGlzV2luZG93KCRlbCkpIHsKICAgICAgICAgIHZhciB0b3BfMSA9IGRpcmVjdGlvbiA9PT0gInkiOwogICAgICAgICAgJGVsLnNjcm9sbFRvKCF0b3BfMSA/IG9mZnNldCA6ICRlbC5wYWdlWE9mZnNldCwgdG9wXzEgPyBvZmZzZXQgOiAkZWwucGFnZVlPZmZzZXQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAkZWxbZGlyZWN0aW9uTWV0aG9kTWFwW2RpcmVjdGlvbl1dID0gb2Zmc2V0OwogICAgICAgIH0KICAgICAgfSwgInNldFNjcm9sbCIpOwogICAgICB2YXIgZ2V0T2Zmc2V0ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigkZWwsICRjb250ZXh0KSB7CiAgICAgICAgdmFyIHJlY3QgPSAkZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgaWYgKHJlY3Qud2lkdGggfHwgcmVjdC5oZWlnaHQpIHsKICAgICAgICAgIHZhciBzY3JvbGxfMSA9IHsgdG9wOiAwLCBsZWZ0OiAwIH07CiAgICAgICAgICB2YXIgJGN0eCA9IHZvaWQgMDsKICAgICAgICAgIGlmIChpc1dpbmRvdygkY29udGV4dCkgfHwgaXNSb290Q29udGFpbmVyKCRjb250ZXh0KSkgewogICAgICAgICAgICAkY3R4ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwogICAgICAgICAgICBzY3JvbGxfMS50b3AgPSB3aW5kb3dbZGlyZWN0aW9uUHJvcE1hcC55XTsKICAgICAgICAgICAgc2Nyb2xsXzEubGVmdCA9IHdpbmRvd1tkaXJlY3Rpb25Qcm9wTWFwLnhdOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGN0eCA9ICRjb250ZXh0OwogICAgICAgICAgICB2YXIgY1JlY3QgPSAkY3R4LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgICAgICBzY3JvbGxfMS50b3AgPSBjUmVjdC50b3AgKiAtMSArICRjdHhbZGlyZWN0aW9uTWV0aG9kTWFwLnldOwogICAgICAgICAgICBzY3JvbGxfMS5sZWZ0ID0gY1JlY3QubGVmdCAqIC0xICsgJGN0eFtkaXJlY3Rpb25NZXRob2RNYXAueF07CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0b3A6IHJlY3QudG9wICsgc2Nyb2xsXzEudG9wIC0gJGN0eC5jbGllbnRUb3AsCiAgICAgICAgICAgIGxlZnQ6IHJlY3QubGVmdCArIHNjcm9sbF8xLmxlZnQgLSAkY3R4LmNsaWVudExlZnQKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiByZWN0OwogICAgICB9LCAiZ2V0T2Zmc2V0Iik7CiAgICAgIHZhciB3aGVlbEV2ZW50TmFtZSA9IChmdW5jdGlvbigpIHsKICAgICAgICBpZiAoIWNhblVzZURPTSkgewogICAgICAgICAgcmV0dXJuICJ3aGVlbCI7CiAgICAgICAgfQogICAgICAgIHJldHVybiAib253aGVlbCIgaW4gZG9jdW1lbnQgPyAid2hlZWwiIDogIm1vdXNld2hlZWwiOwogICAgICB9KSgpOwogICAgICB2YXIgZXZlbnROYW1lID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihuYW1lKSB7CiAgICAgICAgcmV0dXJuIG5hbWUgPT09ICJ3aGVlbCIgPyB3aGVlbEV2ZW50TmFtZSA6IG5hbWU7CiAgICAgIH0sICJldmVudE5hbWUiKTsKICAgICAgdmFyIGFwcGx5ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigkZWwsIG1ldGhvZCwgZXZlbnQsIGxpc3RlbmVyLCBwYXNzaXZlKSB7CiAgICAgICAgZXZlbnQuc3BsaXQoIiAiKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpIHsKICAgICAgICAgICRlbFttZXRob2RdKGV2ZW50TmFtZShuYW1lKSwgbGlzdGVuZXIsIGNhblVzZVBhc3NpdmVPcHRpb24gPyB7IHBhc3NpdmUgfSA6IGZhbHNlKTsKICAgICAgICB9KTsKICAgICAgfSwgImFwcGx5Iik7CiAgICAgIHZhciBhZGRFdmVudCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oJGVsLCBldmVudCwgbGlzdGVuZXIsIHBhc3NpdmUpIHsKICAgICAgICByZXR1cm4gYXBwbHkoJGVsLCAiYWRkRXZlbnRMaXN0ZW5lciIsIGV2ZW50LCBsaXN0ZW5lciwgcGFzc2l2ZSk7CiAgICAgIH0sICJhZGRFdmVudCIpOwogICAgICB2YXIgcmVtb3ZlRXZlbnQgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCRlbCwgZXZlbnQsIGxpc3RlbmVyLCBwYXNzaXZlKSB7CiAgICAgICAgcmV0dXJuIGFwcGx5KCRlbCwgInJlbW92ZUV2ZW50TGlzdGVuZXIiLCBldmVudCwgbGlzdGVuZXIsIHBhc3NpdmUpOwogICAgICB9LCAicmVtb3ZlRXZlbnQiKTsKICAgICAgdmFyIHJlUmVsYXRpdmVUb2tlbiA9IC9eKFwrfC0pPShcZCsoPzpcLlxkKyk/KSQvOwogICAgICB2YXIgcGFyc2VDb29yZGluYXRlID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihjb29yZGluYXRlLCBlbmFibGVWZXJ0aWNhbCkgewogICAgICAgIHZhciByZXMgPSB7IHRvcDogMCwgbGVmdDogMCwgcmVsYXRpdmU6IGZhbHNlIH07CiAgICAgICAgaWYgKGhhc1Byb3AoY29vcmRpbmF0ZSwgInRvcCIpIHx8IGhhc1Byb3AoY29vcmRpbmF0ZSwgImxlZnQiKSkgewogICAgICAgICAgcmVzID0gX19hc3NpZ24yKHt9LCByZXMsIGNvb3JkaW5hdGUpOwogICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheTUoY29vcmRpbmF0ZSkpIHsKICAgICAgICAgIGlmIChjb29yZGluYXRlLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgcmVzLnRvcCA9IGNvb3JkaW5hdGVbMF07CiAgICAgICAgICAgIHJlcy5sZWZ0ID0gY29vcmRpbmF0ZVsxXTsKICAgICAgICAgIH0gZWxzZSBpZiAoY29vcmRpbmF0ZS5sZW5ndGggPT09IDEpIHsKICAgICAgICAgICAgcmVzLnRvcCA9IGVuYWJsZVZlcnRpY2FsID8gY29vcmRpbmF0ZVswXSA6IDA7CiAgICAgICAgICAgIHJlcy5sZWZ0ID0gIWVuYWJsZVZlcnRpY2FsID8gY29vcmRpbmF0ZVswXSA6IDA7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGlzTnVtZXJpYyhjb29yZGluYXRlKSkgewogICAgICAgICAgaWYgKGVuYWJsZVZlcnRpY2FsKSB7CiAgICAgICAgICAgIHJlcy50b3AgPSBjb29yZGluYXRlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVzLmxlZnQgPSBjb29yZGluYXRlOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoaXNTdHJpbmczKGNvb3JkaW5hdGUpKSB7CiAgICAgICAgICB2YXIgbTUgPSBjb29yZGluYXRlLnRyaW0oKS5tYXRjaChyZVJlbGF0aXZlVG9rZW4pOwogICAgICAgICAgaWYgKCFtNSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBvcCA9IG01WzFdOwogICAgICAgICAgdmFyIHZhbCA9IHBhcnNlSW50KG01WzJdLCAxMCk7CiAgICAgICAgICBpZiAob3AgPT09ICIrIikgewogICAgICAgICAgICByZXMudG9wID0gZW5hYmxlVmVydGljYWwgPyB2YWwgOiAwOwogICAgICAgICAgICByZXMubGVmdCA9ICFlbmFibGVWZXJ0aWNhbCA/IHZhbCA6IDA7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXMudG9wID0gZW5hYmxlVmVydGljYWwgPyAtdmFsIDogMDsKICAgICAgICAgICAgcmVzLmxlZnQgPSAhZW5hYmxlVmVydGljYWwgPyAtdmFsIDogMDsKICAgICAgICAgIH0KICAgICAgICAgIHJlcy5yZWxhdGl2ZSA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzOwogICAgICB9LCAicGFyc2VDb29yZGluYXRlIik7CiAgICAgIHZhciBkZWZhdWx0T3B0aW9uczIgPSB7CiAgICAgICAgdHJpZ2dlcjogIltkYXRhLXNjcm9sbF0iLAogICAgICAgIGhlYWRlcjogIltkYXRhLXNjcm9sbC1oZWFkZXJdIiwKICAgICAgICBkdXJhdGlvbjogMWUzLAogICAgICAgIGVhc2luZzogImVhc2VPdXRRdWludCIsCiAgICAgICAgb2Zmc2V0OiAwLAogICAgICAgIHZlcnRpY2FsOiB0cnVlLAogICAgICAgIGhvcml6b250YWw6IGZhbHNlLAogICAgICAgIGNhbmNlbGxhYmxlOiB0cnVlLAogICAgICAgIHVwZGF0ZVVSTDogZmFsc2UsCiAgICAgICAgcHJldmVudERlZmF1bHQ6IHRydWUsCiAgICAgICAgc3RvcFByb3BhZ2F0aW9uOiB0cnVlLAogICAgICAgIC8vIENhbGxiYWNrcwogICAgICAgIGJlZm9yZTogbnVsbCwKICAgICAgICBhZnRlcjogbnVsbCwKICAgICAgICBjYW5jZWw6IG51bGwsCiAgICAgICAgY29tcGxldGU6IG51bGwsCiAgICAgICAgc3RlcDogbnVsbAogICAgICB9OwogICAgICB2YXIgQ09OVEFJTkVSX0NMSUNLX0VWRU5UID0gImNsaWNrIjsKICAgICAgdmFyIENPTlRBSU5FUl9TVE9QX0VWRU5UID0gIndoZWVsIHRvdWNoc3RhcnQgdG91Y2htb3ZlIjsKICAgICAgdmFyIFN3ZWV0U2Nyb2xsMyA9ICgKICAgICAgICAvKiogQGNsYXNzICovCiAgICAgICAgKGZ1bmN0aW9uKCkgewogICAgICAgICAgZnVuY3Rpb24gU3dlZXRTY3JvbGw0KG9wdGlvbnMsIGNvbnRhaW5lcikgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICB0aGlzLiRlbCA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuY3R4ID0gewogICAgICAgICAgICAgICR0cmlnZ2VyOiBudWxsLAogICAgICAgICAgICAgIG9wdHM6IG51bGwsCiAgICAgICAgICAgICAgcHJvZ3Jlc3M6IGZhbHNlLAogICAgICAgICAgICAgIHBvczogbnVsbCwKICAgICAgICAgICAgICBzdGFydFBvczogbnVsbCwKICAgICAgICAgICAgICBlYXNpbmc6IG51bGwsCiAgICAgICAgICAgICAgc3RhcnQ6IDAsCiAgICAgICAgICAgICAgaWQ6IDAsCiAgICAgICAgICAgICAgY2FuY2VsOiBmYWxzZSwKICAgICAgICAgICAgICBoYXNoOiBudWxsCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMubG9vcCA9IGZ1bmN0aW9uKHRpbWUpIHsKICAgICAgICAgICAgICB2YXIgX2EyID0gX3RoaXMsICRlbCA9IF9hMi4kZWwsIGN0eCA9IF9hMi5jdHg7CiAgICAgICAgICAgICAgaWYgKCFjdHguc3RhcnQpIHsKICAgICAgICAgICAgICAgIGN0eC5zdGFydCA9IHRpbWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmICghY3R4LnByb2dyZXNzIHx8ICEkZWwpIHsKICAgICAgICAgICAgICAgIF90aGlzLnN0b3AoKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdmFyIG9wdGlvbnMyID0gY3R4Lm9wdHM7CiAgICAgICAgICAgICAgdmFyIG9mZnNldCA9IGN0eC5wb3M7CiAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gY3R4LnN0YXJ0OwogICAgICAgICAgICAgIHZhciBzdGFydE9mZnNldCA9IGN0eC5zdGFydFBvczsKICAgICAgICAgICAgICB2YXIgZWFzaW5nID0gY3R4LmVhc2luZzsKICAgICAgICAgICAgICB2YXIgZHVyYXRpb24gPSBvcHRpb25zMi5kdXJhdGlvbjsKICAgICAgICAgICAgICB2YXIgZGlyZWN0aW9uTWFwID0geyB0b3A6ICJ5IiwgbGVmdDogIngiIH07CiAgICAgICAgICAgICAgdmFyIHRpbWVFbGFwc2VkID0gdGltZSAtIHN0YXJ0OwogICAgICAgICAgICAgIHZhciB0OCA9IE1hdGgubWluKDEsIE1hdGgubWF4KHRpbWVFbGFwc2VkIC8gZHVyYXRpb24sIDApKTsKICAgICAgICAgICAgICBPYmplY3Qua2V5cyhvZmZzZXQpLmZvckVhY2goZnVuY3Rpb24oa2V5MikgewogICAgICAgICAgICAgICAgdmFyIHZhbHVlMiA9IG9mZnNldFtrZXkyXTsKICAgICAgICAgICAgICAgIHZhciBpbml0aWFsID0gc3RhcnRPZmZzZXRba2V5Ml07CiAgICAgICAgICAgICAgICB2YXIgZGVsdGEgPSB2YWx1ZTIgLSBpbml0aWFsOwogICAgICAgICAgICAgICAgaWYgKGRlbHRhICE9PSAwKSB7CiAgICAgICAgICAgICAgICAgIHZhciB2YWwgPSBlYXNpbmcodDgsIGR1cmF0aW9uICogdDgsIDAsIDEsIGR1cmF0aW9uKTsKICAgICAgICAgICAgICAgICAgc2V0U2Nyb2xsKCRlbCwgTWF0aC5yb3VuZChpbml0aWFsICsgZGVsdGEgKiB2YWwpLCBkaXJlY3Rpb25NYXBba2V5Ml0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIGlmICh0aW1lRWxhcHNlZCA8PSBkdXJhdGlvbikgewogICAgICAgICAgICAgICAgX3RoaXMuaG9vayhvcHRpb25zMiwgInN0ZXAiLCB0OCk7CiAgICAgICAgICAgICAgICBjdHguaWQgPSBTd2VldFNjcm9sbDQucmFmKF90aGlzLmxvb3ApOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBfdGhpcy5zdG9wKHRydWUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGhpcy5oYW5kbGVDbGljayA9IGZ1bmN0aW9uKGUxMCkgewogICAgICAgICAgICAgIHZhciBvcHRzID0gX3RoaXMub3B0czsKICAgICAgICAgICAgICB2YXIgJGVsID0gZTEwLnRhcmdldDsKICAgICAgICAgICAgICBmb3IgKDsgJGVsICYmICRlbCAhPT0gZG9jdW1lbnQ7ICRlbCA9ICRlbC5wYXJlbnROb2RlKSB7CiAgICAgICAgICAgICAgICBpZiAoIW1hdGNoZXMoJGVsLCBvcHRzLnRyaWdnZXIpKSB7CiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGRhdGFPcHRpb25zID0gSlNPTi5wYXJzZSgkZWwuZ2V0QXR0cmlidXRlKCJkYXRhLXNjcm9sbC1vcHRpb25zIikgfHwgInt9Iik7CiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9ICRlbC5nZXRBdHRyaWJ1dGUoImRhdGEtc2Nyb2xsIik7CiAgICAgICAgICAgICAgICB2YXIgdG8gPSBkYXRhIHx8ICRlbC5nZXRBdHRyaWJ1dGUoImhyZWYiKTsKICAgICAgICAgICAgICAgIHZhciBvcHRpb25zMiA9IF9fYXNzaWduMih7fSwgb3B0cywgZGF0YU9wdGlvbnMpOwogICAgICAgICAgICAgICAgdmFyIHByZXZlbnREZWZhdWx0ID0gb3B0aW9uczIucHJldmVudERlZmF1bHQsIHN0b3BQcm9wYWdhdGlvbiA9IG9wdGlvbnMyLnN0b3BQcm9wYWdhdGlvbiwgdmVydGljYWwgPSBvcHRpb25zMi52ZXJ0aWNhbCwgaG9yaXpvbnRhbCA9IG9wdGlvbnMyLmhvcml6b250YWw7CiAgICAgICAgICAgICAgICBpZiAocHJldmVudERlZmF1bHQpIHsKICAgICAgICAgICAgICAgICAgZTEwLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc3RvcFByb3BhZ2F0aW9uKSB7CiAgICAgICAgICAgICAgICAgIGUxMC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF90aGlzLmN0eC4kdHJpZ2dlciA9ICRlbDsKICAgICAgICAgICAgICAgIGlmIChob3Jpem9udGFsICYmIHZlcnRpY2FsKSB7CiAgICAgICAgICAgICAgICAgIF90aGlzLnRvKHRvLCBvcHRpb25zMik7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZlcnRpY2FsKSB7CiAgICAgICAgICAgICAgICAgIF90aGlzLnRvVG9wKHRvLCBvcHRpb25zMik7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhvcml6b250YWwpIHsKICAgICAgICAgICAgICAgICAgX3RoaXMudG9MZWZ0KHRvLCBvcHRpb25zMik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuaGFuZGxlU3RvcCA9IGZ1bmN0aW9uKGUxMCkgewogICAgICAgICAgICAgIHZhciBjdHggPSBfdGhpcy5jdHg7CiAgICAgICAgICAgICAgdmFyIG9wdHMgPSBjdHgub3B0czsKICAgICAgICAgICAgICBpZiAob3B0cyAmJiBvcHRzLmNhbmNlbGxhYmxlKSB7CiAgICAgICAgICAgICAgICBjdHguY2FuY2VsID0gdHJ1ZTsKICAgICAgICAgICAgICAgIF90aGlzLnN0b3AoKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZTEwLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLm9wdHMgPSBfX2Fzc2lnbjIoe30sIGRlZmF1bHRPcHRpb25zMiwgb3B0aW9ucyB8fCB7fSk7CiAgICAgICAgICAgIHZhciAkY29udGFpbmVyID0gbnVsbDsKICAgICAgICAgICAgaWYgKGNhblVzZURPTSkgewogICAgICAgICAgICAgIGlmICh0eXBlb2YgY29udGFpbmVyID09PSAic3RyaW5nIikgewogICAgICAgICAgICAgICAgJGNvbnRhaW5lciA9ICQzKGNvbnRhaW5lcik7CiAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb250YWluZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgJGNvbnRhaW5lciA9IGNvbnRhaW5lcjsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGNvbnRhaW5lciA9IHdpbmRvdzsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy4kZWwgPSAkY29udGFpbmVyOwogICAgICAgICAgICBpZiAoJGNvbnRhaW5lcikgewogICAgICAgICAgICAgIHRoaXMuYmluZCh0cnVlLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIF9fbmFtZShTd2VldFNjcm9sbDQsICJTd2VldFNjcm9sbCIpOwogICAgICAgICAgU3dlZXRTY3JvbGw0LmNyZWF0ZSA9IGZ1bmN0aW9uKG9wdGlvbnMsIGNvbnRhaW5lcikgewogICAgICAgICAgICByZXR1cm4gbmV3IFN3ZWV0U2Nyb2xsNChvcHRpb25zLCBjb250YWluZXIpOwogICAgICAgICAgfTsKICAgICAgICAgIFN3ZWV0U2Nyb2xsNC5wcm90b3R5cGUudG8gPSBmdW5jdGlvbihkaXN0YW5jZSwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIWNhblVzZURPTSkgewogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgX2EyID0gdGhpcywgJGVsID0gX2EyLiRlbCwgY3R4ID0gX2EyLmN0eCwgY3VycmVudE9wdGlvbnMgPSBfYTIub3B0czsKICAgICAgICAgICAgdmFyICR0cmlnZ2VyID0gY3R4LiR0cmlnZ2VyOwogICAgICAgICAgICB2YXIgb3B0cyA9IF9fYXNzaWduMih7fSwgY3VycmVudE9wdGlvbnMsIG9wdGlvbnMgfHwge30pOwogICAgICAgICAgICB2YXIgb3B0T2Zmc2V0ID0gb3B0cy5vZmZzZXQsIHZlcnRpY2FsID0gb3B0cy52ZXJ0aWNhbCwgaG9yaXpvbnRhbCA9IG9wdHMuaG9yaXpvbnRhbDsKICAgICAgICAgICAgdmFyICRoZWFkZXIgPSBpc0VsZW1lbnQob3B0cy5oZWFkZXIpID8gb3B0cy5oZWFkZXIgOiAkMyhvcHRzLmhlYWRlcik7CiAgICAgICAgICAgIHZhciByZWcgPSAvXiMvOwogICAgICAgICAgICB2YXIgaGFzaCA9IGlzU3RyaW5nMyhkaXN0YW5jZSkgJiYgcmVnLnRlc3QoZGlzdGFuY2UpID8gZGlzdGFuY2UgOiBudWxsOwogICAgICAgICAgICBjdHgub3B0cyA9IG9wdHM7CiAgICAgICAgICAgIGN0eC5jYW5jZWwgPSBmYWxzZTsKICAgICAgICAgICAgY3R4Lmhhc2ggPSBoYXNoOwogICAgICAgICAgICB0aGlzLnN0b3AoKTsKICAgICAgICAgICAgaWYgKCEkZWwpIHsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIG9mZnNldCA9IHBhcnNlQ29vcmRpbmF0ZShvcHRPZmZzZXQsIHZlcnRpY2FsKTsKICAgICAgICAgICAgdmFyIGNvb3JkaW5hdGUgPSBwYXJzZUNvb3JkaW5hdGUoZGlzdGFuY2UsIHZlcnRpY2FsKTsKICAgICAgICAgICAgdmFyIHNjcm9sbCA9IHsgdG9wOiAwLCBsZWZ0OiAwIH07CiAgICAgICAgICAgIGlmIChjb29yZGluYXRlKSB7CiAgICAgICAgICAgICAgaWYgKGNvb3JkaW5hdGUucmVsYXRpdmUpIHsKICAgICAgICAgICAgICAgIHZhciBjdXJyZW50ID0gZ2V0U2Nyb2xsKCRlbCwgdmVydGljYWwgPyAieSIgOiAieCIpOwogICAgICAgICAgICAgICAgc2Nyb2xsLnRvcCA9IHZlcnRpY2FsID8gY3VycmVudCArIGNvb3JkaW5hdGUudG9wIDogY29vcmRpbmF0ZS50b3A7CiAgICAgICAgICAgICAgICBzY3JvbGwubGVmdCA9ICF2ZXJ0aWNhbCA/IGN1cnJlbnQgKyBjb29yZGluYXRlLmxlZnQgOiBjb29yZGluYXRlLmxlZnQ7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHNjcm9sbCA9IGNvb3JkaW5hdGU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKGlzU3RyaW5nMyhkaXN0YW5jZSkgJiYgZGlzdGFuY2UgIT09ICIjIikgewogICAgICAgICAgICAgIHZhciAkdGFyZ2V0ID0gJDMoZGlzdGFuY2UpOwogICAgICAgICAgICAgIGlmICghJHRhcmdldCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBzY3JvbGwgPSBnZXRPZmZzZXQoJHRhcmdldCwgJGVsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAob2Zmc2V0KSB7CiAgICAgICAgICAgICAgc2Nyb2xsLnRvcCArPSBvZmZzZXQudG9wOwogICAgICAgICAgICAgIHNjcm9sbC5sZWZ0ICs9IG9mZnNldC5sZWZ0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkaGVhZGVyKSB7CiAgICAgICAgICAgICAgc2Nyb2xsLnRvcCA9IE1hdGgubWF4KDAsIHNjcm9sbC50b3AgLSBnZXRTaXplKCRoZWFkZXIpLmhlaWdodCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIF9iID0gZ2V0Vmlld3BvcnRBbmRFbGVtZW50U2l6ZXMoJGVsKSwgdmlld3BvcnQgPSBfYi52aWV3cG9ydCwgc2l6ZSA9IF9iLnNpemU7CiAgICAgICAgICAgIHNjcm9sbC50b3AgPSB2ZXJ0aWNhbCA/IE1hdGgubWF4KDAsIE1hdGgubWluKHNpemUuaGVpZ2h0IC0gdmlld3BvcnQuaGVpZ2h0LCBzY3JvbGwudG9wKSkgOiBnZXRTY3JvbGwoJGVsLCAieSIpOwogICAgICAgICAgICBzY3JvbGwubGVmdCA9IGhvcml6b250YWwgPyBNYXRoLm1heCgwLCBNYXRoLm1pbihzaXplLndpZHRoIC0gdmlld3BvcnQud2lkdGgsIHNjcm9sbC5sZWZ0KSkgOiBnZXRTY3JvbGwoJGVsLCAieCIpOwogICAgICAgICAgICBpZiAodGhpcy5ob29rKG9wdHMsICJiZWZvcmUiLCBzY3JvbGwsICR0cmlnZ2VyKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICBjdHgub3B0cyA9IG51bGw7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGN0eC5wb3MgPSBzY3JvbGw7CiAgICAgICAgICAgIHRoaXMuc3RhcnQob3B0cyk7CiAgICAgICAgICAgIHRoaXMuYmluZChmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICB9OwogICAgICAgICAgU3dlZXRTY3JvbGw0LnByb3RvdHlwZS50b1RvcCA9IGZ1bmN0aW9uKGRpc3RhbmNlLCBvcHRpb25zKSB7CiAgICAgICAgICAgIHRoaXMudG8oZGlzdGFuY2UsIF9fYXNzaWduMih7fSwgb3B0aW9ucyB8fCB7fSwgeyB2ZXJ0aWNhbDogdHJ1ZSwgaG9yaXpvbnRhbDogZmFsc2UgfSkpOwogICAgICAgICAgfTsKICAgICAgICAgIFN3ZWV0U2Nyb2xsNC5wcm90b3R5cGUudG9MZWZ0ID0gZnVuY3Rpb24oZGlzdGFuY2UsIG9wdGlvbnMpIHsKICAgICAgICAgICAgdGhpcy50byhkaXN0YW5jZSwgX19hc3NpZ24yKHt9LCBvcHRpb25zIHx8IHt9LCB7IHZlcnRpY2FsOiBmYWxzZSwgaG9yaXpvbnRhbDogdHJ1ZSB9KSk7CiAgICAgICAgICB9OwogICAgICAgICAgU3dlZXRTY3JvbGw0LnByb3RvdHlwZS50b0VsZW1lbnQgPSBmdW5jdGlvbigkZWxlbWVudCwgb3B0aW9ucykgewogICAgICAgICAgICB2YXIgJGVsID0gdGhpcy4kZWw7CiAgICAgICAgICAgIGlmICghY2FuVXNlRE9NIHx8ICEkZWwpIHsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy50byhnZXRPZmZzZXQoJGVsZW1lbnQsICRlbCksIG9wdGlvbnMgfHwge30pOwogICAgICAgICAgfTsKICAgICAgICAgIFN3ZWV0U2Nyb2xsNC5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uKGdvdG9FbmQpIHsKICAgICAgICAgICAgaWYgKGdvdG9FbmQgPT09IHZvaWQgMCkgewogICAgICAgICAgICAgIGdvdG9FbmQgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgX2EyID0gdGhpcywgJGVsID0gX2EyLiRlbCwgY3R4ID0gX2EyLmN0eDsKICAgICAgICAgICAgdmFyIHBvcyA9IGN0eC5wb3M7CiAgICAgICAgICAgIGlmICghJGVsIHx8ICFjdHgucHJvZ3Jlc3MpIHsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgU3dlZXRTY3JvbGw0LmNhZihjdHguaWQpOwogICAgICAgICAgICBjdHgucHJvZ3Jlc3MgPSBmYWxzZTsKICAgICAgICAgICAgY3R4LnN0YXJ0ID0gMDsKICAgICAgICAgICAgY3R4LmlkID0gMDsKICAgICAgICAgICAgaWYgKGdvdG9FbmQgJiYgcG9zKSB7CiAgICAgICAgICAgICAgc2V0U2Nyb2xsKCRlbCwgcG9zLmxlZnQsICJ4Iik7CiAgICAgICAgICAgICAgc2V0U2Nyb2xsKCRlbCwgcG9zLnRvcCwgInkiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmNvbXBsZXRlKCk7CiAgICAgICAgICB9OwogICAgICAgICAgU3dlZXRTY3JvbGw0LnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgICAgICAgICAgIGlmICh0aGlzLiRlbCkgewogICAgICAgICAgICAgIHZhciBvcHRzID0gX19hc3NpZ24yKHt9LCB0aGlzLm9wdHMsIG9wdGlvbnMpOwogICAgICAgICAgICAgIHRoaXMuc3RvcCgpOwogICAgICAgICAgICAgIHRoaXMudW5iaW5kKHRydWUsIHRydWUpOwogICAgICAgICAgICAgIHRoaXMub3B0cyA9IG9wdHM7CiAgICAgICAgICAgICAgdGhpcy5iaW5kKHRydWUsIGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfTsKICAgICAgICAgIFN3ZWV0U2Nyb2xsNC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAodGhpcy4kZWwpIHsKICAgICAgICAgICAgICB0aGlzLnN0b3AoKTsKICAgICAgICAgICAgICB0aGlzLnVuYmluZCh0cnVlLCB0cnVlKTsKICAgICAgICAgICAgICB0aGlzLiRlbCA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgIH07CiAgICAgICAgICBTd2VldFNjcm9sbDQucHJvdG90eXBlLm9uQmVmb3JlID0gZnVuY3Rpb24oXzMsIF9fKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfTsKICAgICAgICAgIFN3ZWV0U2Nyb2xsNC5wcm90b3R5cGUub25TdGVwID0gZnVuY3Rpb24oXzMpIHsKICAgICAgICAgIH07CiAgICAgICAgICBTd2VldFNjcm9sbDQucHJvdG90eXBlLm9uQWZ0ZXIgPSBmdW5jdGlvbihfMywgX18pIHsKICAgICAgICAgIH07CiAgICAgICAgICBTd2VldFNjcm9sbDQucHJvdG90eXBlLm9uQ2FuY2VsID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICB9OwogICAgICAgICAgU3dlZXRTY3JvbGw0LnByb3RvdHlwZS5vbkNvbXBsZXRlID0gZnVuY3Rpb24oXzMpIHsKICAgICAgICAgIH07CiAgICAgICAgICBTd2VldFNjcm9sbDQucHJvdG90eXBlLnN0YXJ0ID0gZnVuY3Rpb24ob3B0cykgewogICAgICAgICAgICB2YXIgY3R4ID0gdGhpcy5jdHg7CiAgICAgICAgICAgIGN0eC5vcHRzID0gb3B0czsKICAgICAgICAgICAgY3R4LnByb2dyZXNzID0gdHJ1ZTsKICAgICAgICAgICAgY3R4LmVhc2luZyA9IGlzRnVuY3Rpb24yKG9wdHMuZWFzaW5nKSA/IG9wdHMuZWFzaW5nIDogZWFzaW5nc1tvcHRzLmVhc2luZ107CiAgICAgICAgICAgIHZhciAkY29udGFpbmVyID0gdGhpcy4kZWw7CiAgICAgICAgICAgIHZhciBzdGFydCA9IHsKICAgICAgICAgICAgICB0b3A6IGdldFNjcm9sbCgkY29udGFpbmVyLCAieSIpLAogICAgICAgICAgICAgIGxlZnQ6IGdldFNjcm9sbCgkY29udGFpbmVyLCAieCIpCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGN0eC5zdGFydFBvcyA9IHN0YXJ0OwogICAgICAgICAgICBjdHguaWQgPSBTd2VldFNjcm9sbDQucmFmKHRoaXMubG9vcCk7CiAgICAgICAgICB9OwogICAgICAgICAgU3dlZXRTY3JvbGw0LnByb3RvdHlwZS5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgX2EyID0gdGhpcywgJGVsID0gX2EyLiRlbCwgY3R4ID0gX2EyLmN0eDsKICAgICAgICAgICAgdmFyIGhhc2ggPSBjdHguaGFzaCwgY2FuY2VsID0gY3R4LmNhbmNlbCwgb3B0cyA9IGN0eC5vcHRzLCBwb3MgPSBjdHgucG9zLCAkdHJpZ2dlciA9IGN0eC4kdHJpZ2dlcjsKICAgICAgICAgICAgaWYgKCEkZWwgfHwgIW9wdHMpIHsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGhhc2ggIT0gbnVsbCAmJiBoYXNoICE9PSB3aW5kb3cubG9jYXRpb24uaGFzaCkgewogICAgICAgICAgICAgIHZhciB1cGRhdGVVUkwgPSBvcHRzLnVwZGF0ZVVSTDsKICAgICAgICAgICAgICBpZiAoY2FuVXNlRE9NICYmIGNhblVzZUhpc3RvcnkgJiYgdXBkYXRlVVJMICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgd2luZG93Lmhpc3RvcnlbdXBkYXRlVVJMID09PSAicmVwbGFjZSIgPyAicmVwbGFjZVN0YXRlIiA6ICJwdXNoU3RhdGUiXShudWxsLCAiIiwgaGFzaCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMudW5iaW5kKGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgY3R4Lm9wdHMgPSBudWxsOwogICAgICAgICAgICBjdHguJHRyaWdnZXIgPSBudWxsOwogICAgICAgICAgICBpZiAoY2FuY2VsKSB7CiAgICAgICAgICAgICAgdGhpcy5ob29rKG9wdHMsICJjYW5jZWwiKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aGlzLmhvb2sob3B0cywgImFmdGVyIiwgcG9zLCAkdHJpZ2dlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5ob29rKG9wdHMsICJjb21wbGV0ZSIsIGNhbmNlbCk7CiAgICAgICAgICB9OwogICAgICAgICAgU3dlZXRTY3JvbGw0LnByb3RvdHlwZS5ob29rID0gZnVuY3Rpb24ob3B0aW9ucywgdHlwZTUpIHsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAyOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKICAgICAgICAgICAgICBhcmdzW19pIC0gMl0gPSBhcmd1bWVudHNbX2ldOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBfYTI7CiAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IG9wdGlvbnNbdHlwZTVdOwogICAgICAgICAgICB2YXIgY2FsbGJhY2tSZXN1bHQ7CiAgICAgICAgICAgIHZhciBtZXRob2RSZXN1bHQ7CiAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uMihjYWxsYmFjaykpIHsKICAgICAgICAgICAgICBjYWxsYmFja1Jlc3VsdCA9IGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3MuY29uY2F0KFt0aGlzXSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG1ldGhvZFJlc3VsdCA9IChfYTIgPSB0aGlzKVsib24iICsgKHR5cGU1WzBdLnRvVXBwZXJDYXNlKCkgKyB0eXBlNS5zbGljZSgxKSldLmFwcGx5KF9hMiwgYXJncyk7CiAgICAgICAgICAgIHJldHVybiBjYWxsYmFja1Jlc3VsdCAhPT0gdm9pZCAwID8gY2FsbGJhY2tSZXN1bHQgOiBtZXRob2RSZXN1bHQ7CiAgICAgICAgICB9OwogICAgICAgICAgU3dlZXRTY3JvbGw0LnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24oY2xpY2ssIHN0b3ApIHsKICAgICAgICAgICAgdmFyIF9hMiA9IHRoaXMsICRlbCA9IF9hMi4kZWwsIG9wdHMgPSBfYTIuY3R4Lm9wdHM7CiAgICAgICAgICAgIGlmICgkZWwpIHsKICAgICAgICAgICAgICBpZiAoY2xpY2spIHsKICAgICAgICAgICAgICAgIGFkZEV2ZW50KCRlbCwgQ09OVEFJTkVSX0NMSUNLX0VWRU5ULCB0aGlzLmhhbmRsZUNsaWNrLCBmYWxzZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChzdG9wKSB7CiAgICAgICAgICAgICAgICBhZGRFdmVudCgkZWwsIENPTlRBSU5FUl9TVE9QX0VWRU5ULCB0aGlzLmhhbmRsZVN0b3AsIG9wdHMgPyBvcHRzLmNhbmNlbGxhYmxlIDogdHJ1ZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9OwogICAgICAgICAgU3dlZXRTY3JvbGw0LnByb3RvdHlwZS51bmJpbmQgPSBmdW5jdGlvbihjbGljaywgc3RvcCkgewogICAgICAgICAgICB2YXIgX2EyID0gdGhpcywgJGVsID0gX2EyLiRlbCwgb3B0cyA9IF9hMi5jdHgub3B0czsKICAgICAgICAgICAgaWYgKCRlbCkgewogICAgICAgICAgICAgIGlmIChjbGljaykgewogICAgICAgICAgICAgICAgcmVtb3ZlRXZlbnQoJGVsLCBDT05UQUlORVJfQ0xJQ0tfRVZFTlQsIHRoaXMuaGFuZGxlQ2xpY2ssIGZhbHNlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHN0b3ApIHsKICAgICAgICAgICAgICAgIHJlbW92ZUV2ZW50KCRlbCwgQ09OVEFJTkVSX1NUT1BfRVZFTlQsIHRoaXMuaGFuZGxlU3RvcCwgb3B0cyA/IG9wdHMuY2FuY2VsbGFibGUgOiB0cnVlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH07CiAgICAgICAgICBTd2VldFNjcm9sbDQucmFmID0gcmFmOwogICAgICAgICAgU3dlZXRTY3JvbGw0LmNhZiA9IGNhZjsKICAgICAgICAgIHJldHVybiBTd2VldFNjcm9sbDQ7CiAgICAgICAgfSkoKQogICAgICApOwogICAgICByZXR1cm4gU3dlZXRTY3JvbGwzOwogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AbGl0K3JlYWN0aXZlLWVsZW1lbnRAMi4xLjIvbm9kZV9tb2R1bGVzL0BsaXQvcmVhY3RpdmUtZWxlbWVudC9jc3MtdGFnLmpzCnZhciB0ID0gZ2xvYmFsVGhpcywgZSA9IHQuU2hhZG93Um9vdCAmJiAodm9pZCAwID09PSB0LlNoYWR5Q1NTIHx8IHQuU2hhZHlDU1MubmF0aXZlU2hhZG93KSAmJiAiYWRvcHRlZFN0eWxlU2hlZXRzIiBpbiBEb2N1bWVudC5wcm90b3R5cGUgJiYgInJlcGxhY2UiIGluIENTU1N0eWxlU2hlZXQucHJvdG90eXBlLCBzID0gLyogQF9fUFVSRV9fICovIFN5bWJvbCgpLCBvID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7CnZhciBuID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIm4iKTsKICB9CiAgY29uc3RydWN0b3IodDgsIGUxMCwgbzEyKSB7CiAgICBpZiAodGhpcy5fJGNzc1Jlc3VsdCQgPSB0cnVlLCBvMTIgIT09IHMpIHRocm93IEVycm9yKCJDU1NSZXN1bHQgaXMgbm90IGNvbnN0cnVjdGFibGUuIFVzZSBgdW5zYWZlQ1NTYCBvciBgY3NzYCBpbnN0ZWFkLiIpOwogICAgdGhpcy5jc3NUZXh0ID0gdDgsIHRoaXMudCA9IGUxMDsKICB9CiAgZ2V0IHN0eWxlU2hlZXQoKSB7CiAgICBsZXQgdDggPSB0aGlzLm87CiAgICBjb25zdCBzOSA9IHRoaXMudDsKICAgIGlmIChlICYmIHZvaWQgMCA9PT0gdDgpIHsKICAgICAgY29uc3QgZTEwID0gdm9pZCAwICE9PSBzOSAmJiAxID09PSBzOS5sZW5ndGg7CiAgICAgIGUxMCAmJiAodDggPSBvLmdldChzOSkpLCB2b2lkIDAgPT09IHQ4ICYmICgodGhpcy5vID0gdDggPSBuZXcgQ1NTU3R5bGVTaGVldCgpKS5yZXBsYWNlU3luYyh0aGlzLmNzc1RleHQpLCBlMTAgJiYgby5zZXQoczksIHQ4KSk7CiAgICB9CiAgICByZXR1cm4gdDg7CiAgfQogIHRvU3RyaW5nKCkgewogICAgcmV0dXJuIHRoaXMuY3NzVGV4dDsKICB9Cn07CnZhciByID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgodDgpID0+IG5ldyBuKCJzdHJpbmciID09IHR5cGVvZiB0OCA/IHQ4IDogdDggKyAiIiwgdm9pZCAwLCBzKSwgInIiKSwgaSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHQ4LCAuLi5lMTApID0+IHsKICBjb25zdCBvMTIgPSAxID09PSB0OC5sZW5ndGggPyB0OFswXSA6IGUxMC5yZWR1Y2UoKGUxMSwgczksIG8xMykgPT4gZTExICsgKCh0OSkgPT4gewogICAgaWYgKHRydWUgPT09IHQ5Ll8kY3NzUmVzdWx0JCkgcmV0dXJuIHQ5LmNzc1RleHQ7CiAgICBpZiAoIm51bWJlciIgPT0gdHlwZW9mIHQ5KSByZXR1cm4gdDk7CiAgICB0aHJvdyBFcnJvcigiVmFsdWUgcGFzc2VkIHRvICdjc3MnIGZ1bmN0aW9uIG11c3QgYmUgYSAnY3NzJyBmdW5jdGlvbiByZXN1bHQ6ICIgKyB0OSArICIuIFVzZSAndW5zYWZlQ1NTJyB0byBwYXNzIG5vbi1saXRlcmFsIHZhbHVlcywgYnV0IHRha2UgY2FyZSB0byBlbnN1cmUgcGFnZSBzZWN1cml0eS4iKTsKICB9KShzOSkgKyB0OFtvMTMgKyAxXSwgdDhbMF0pOwogIHJldHVybiBuZXcgbihvMTIsIHQ4LCBzKTsKfSwgImkiKSwgUyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHM5LCBvMTIpID0+IHsKICBpZiAoZSkgczkuYWRvcHRlZFN0eWxlU2hlZXRzID0gbzEyLm1hcCgodDgpID0+IHQ4IGluc3RhbmNlb2YgQ1NTU3R5bGVTaGVldCA/IHQ4IDogdDguc3R5bGVTaGVldCk7CiAgZWxzZSBmb3IgKGNvbnN0IGUxMCBvZiBvMTIpIHsKICAgIGNvbnN0IG8xMyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIiksIG4xMSA9IHQubGl0Tm9uY2U7CiAgICB2b2lkIDAgIT09IG4xMSAmJiBvMTMuc2V0QXR0cmlidXRlKCJub25jZSIsIG4xMSksIG8xMy50ZXh0Q29udGVudCA9IGUxMC5jc3NUZXh0LCBzOS5hcHBlbmRDaGlsZChvMTMpOwogIH0KfSwgIlMiKSwgYyA9IGUgPyAodDgpID0+IHQ4IDogKHQ4KSA9PiB0OCBpbnN0YW5jZW9mIENTU1N0eWxlU2hlZXQgPyAoKHQ5KSA9PiB7CiAgbGV0IGUxMCA9ICIiOwogIGZvciAoY29uc3Qgczkgb2YgdDkuY3NzUnVsZXMpIGUxMCArPSBzOS5jc3NUZXh0OwogIHJldHVybiByKGUxMCk7Cn0pKHQ4KSA6IHQ4OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BsaXQrcmVhY3RpdmUtZWxlbWVudEAyLjEuMi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L3JlYWN0aXZlLWVsZW1lbnQuanMKdmFyIHsgaXM6IGkyLCBkZWZpbmVQcm9wZXJ0eTogZTIsIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogaCwgZ2V0T3duUHJvcGVydHlOYW1lczogcjIsIGdldE93blByb3BlcnR5U3ltYm9sczogbzIsIGdldFByb3RvdHlwZU9mOiBuMiB9ID0gT2JqZWN0LCBhID0gZ2xvYmFsVGhpcywgYzIgPSBhLnRydXN0ZWRUeXBlcywgbCA9IGMyID8gYzIuZW1wdHlTY3JpcHQgOiAiIiwgcCA9IGEucmVhY3RpdmVFbGVtZW50UG9seWZpbGxTdXBwb3J0LCBkID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgodDgsIHM5KSA9PiB0OCwgImQiKSwgdSA9IHsgdG9BdHRyaWJ1dGUodDgsIHM5KSB7CiAgc3dpdGNoIChzOSkgewogICAgY2FzZSBCb29sZWFuOgogICAgICB0OCA9IHQ4ID8gbCA6IG51bGw7CiAgICAgIGJyZWFrOwogICAgY2FzZSBPYmplY3Q6CiAgICBjYXNlIEFycmF5OgogICAgICB0OCA9IG51bGwgPT0gdDggPyB0OCA6IEpTT04uc3RyaW5naWZ5KHQ4KTsKICB9CiAgcmV0dXJuIHQ4Owp9LCBmcm9tQXR0cmlidXRlKHQ4LCBzOSkgewogIGxldCBpMTAgPSB0ODsKICBzd2l0Y2ggKHM5KSB7CiAgICBjYXNlIEJvb2xlYW46CiAgICAgIGkxMCA9IG51bGwgIT09IHQ4OwogICAgICBicmVhazsKICAgIGNhc2UgTnVtYmVyOgogICAgICBpMTAgPSBudWxsID09PSB0OCA/IG51bGwgOiBOdW1iZXIodDgpOwogICAgICBicmVhazsKICAgIGNhc2UgT2JqZWN0OgogICAgY2FzZSBBcnJheToKICAgICAgdHJ5IHsKICAgICAgICBpMTAgPSBKU09OLnBhcnNlKHQ4KTsKICAgICAgfSBjYXRjaCAodDkpIHsKICAgICAgICBpMTAgPSBudWxsOwogICAgICB9CiAgfQogIHJldHVybiBpMTA7Cn0gfSwgZiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHQ4LCBzOSkgPT4gIWkyKHQ4LCBzOSksICJmIiksIGIgPSB7IGF0dHJpYnV0ZTogdHJ1ZSwgdHlwZTogU3RyaW5nLCBjb252ZXJ0ZXI6IHUsIHJlZmxlY3Q6IGZhbHNlLCB1c2VEZWZhdWx0OiBmYWxzZSwgaGFzQ2hhbmdlZDogZiB9OwpTeW1ib2wubWV0YWRhdGEgPz89IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2woIm1ldGFkYXRhIiksIGEubGl0UHJvcGVydHlNZXRhZGF0YSA/Pz0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7CnZhciB5ID0gY2xhc3MgZXh0ZW5kcyBIVE1MRWxlbWVudCB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAieSIpOwogIH0KICBzdGF0aWMgYWRkSW5pdGlhbGl6ZXIodDgpIHsKICAgIHRoaXMuXyRFaSgpLCAodGhpcy5sID8/PSBbXSkucHVzaCh0OCk7CiAgfQogIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkgewogICAgcmV0dXJuIHRoaXMuZmluYWxpemUoKSwgdGhpcy5fJEVoICYmIFsuLi50aGlzLl8kRWgua2V5cygpXTsKICB9CiAgc3RhdGljIGNyZWF0ZVByb3BlcnR5KHQ4LCBzOSA9IGIpIHsKICAgIGlmIChzOS5zdGF0ZSAmJiAoczkuYXR0cmlidXRlID0gZmFsc2UpLCB0aGlzLl8kRWkoKSwgdGhpcy5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkodDgpICYmICgoczkgPSBPYmplY3QuY3JlYXRlKHM5KSkud3JhcHBlZCA9IHRydWUpLCB0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzLnNldCh0OCwgczkpLCAhczkubm9BY2Nlc3NvcikgewogICAgICBjb25zdCBpMTAgPSAvKiBAX19QVVJFX18gKi8gU3ltYm9sKCksIGg3ID0gdGhpcy5nZXRQcm9wZXJ0eURlc2NyaXB0b3IodDgsIGkxMCwgczkpOwogICAgICB2b2lkIDAgIT09IGg3ICYmIGUyKHRoaXMucHJvdG90eXBlLCB0OCwgaDcpOwogICAgfQogIH0KICBzdGF0aWMgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKHQ4LCBzOSwgaTEwKSB7CiAgICBjb25zdCB7IGdldDogZTEwLCBzZXQ6IHIxMCB9ID0gaCh0aGlzLnByb3RvdHlwZSwgdDgpID8/IHsgZ2V0KCkgewogICAgICByZXR1cm4gdGhpc1tzOV07CiAgICB9LCBzZXQodDkpIHsKICAgICAgdGhpc1tzOV0gPSB0OTsKICAgIH0gfTsKICAgIHJldHVybiB7IGdldDogZTEwLCBzZXQoczEwKSB7CiAgICAgIGNvbnN0IGg3ID0gZTEwPy5jYWxsKHRoaXMpOwogICAgICByMTA/LmNhbGwodGhpcywgczEwKSwgdGhpcy5yZXF1ZXN0VXBkYXRlKHQ4LCBoNywgaTEwKTsKICAgIH0sIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgZW51bWVyYWJsZTogdHJ1ZSB9OwogIH0KICBzdGF0aWMgZ2V0UHJvcGVydHlPcHRpb25zKHQ4KSB7CiAgICByZXR1cm4gdGhpcy5lbGVtZW50UHJvcGVydGllcy5nZXQodDgpID8/IGI7CiAgfQogIHN0YXRpYyBfJEVpKCkgewogICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZCgiZWxlbWVudFByb3BlcnRpZXMiKSkpIHJldHVybjsKICAgIGNvbnN0IHQ4ID0gbjIodGhpcyk7CiAgICB0OC5maW5hbGl6ZSgpLCB2b2lkIDAgIT09IHQ4LmwgJiYgKHRoaXMubCA9IFsuLi50OC5sXSksIHRoaXMuZWxlbWVudFByb3BlcnRpZXMgPSBuZXcgTWFwKHQ4LmVsZW1lbnRQcm9wZXJ0aWVzKTsKICB9CiAgc3RhdGljIGZpbmFsaXplKCkgewogICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZCgiZmluYWxpemVkIikpKSByZXR1cm47CiAgICBpZiAodGhpcy5maW5hbGl6ZWQgPSB0cnVlLCB0aGlzLl8kRWkoKSwgdGhpcy5oYXNPd25Qcm9wZXJ0eShkKCJwcm9wZXJ0aWVzIikpKSB7CiAgICAgIGNvbnN0IHQ5ID0gdGhpcy5wcm9wZXJ0aWVzLCBzOSA9IFsuLi5yMih0OSksIC4uLm8yKHQ5KV07CiAgICAgIGZvciAoY29uc3QgaTEwIG9mIHM5KSB0aGlzLmNyZWF0ZVByb3BlcnR5KGkxMCwgdDlbaTEwXSk7CiAgICB9CiAgICBjb25zdCB0OCA9IHRoaXNbU3ltYm9sLm1ldGFkYXRhXTsKICAgIGlmIChudWxsICE9PSB0OCkgewogICAgICBjb25zdCBzOSA9IGxpdFByb3BlcnR5TWV0YWRhdGEuZ2V0KHQ4KTsKICAgICAgaWYgKHZvaWQgMCAhPT0gczkpIGZvciAoY29uc3QgW3Q5LCBpMTBdIG9mIHM5KSB0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzLnNldCh0OSwgaTEwKTsKICAgIH0KICAgIHRoaXMuXyRFaCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICBmb3IgKGNvbnN0IFt0OSwgczldIG9mIHRoaXMuZWxlbWVudFByb3BlcnRpZXMpIHsKICAgICAgY29uc3QgaTEwID0gdGhpcy5fJEV1KHQ5LCBzOSk7CiAgICAgIHZvaWQgMCAhPT0gaTEwICYmIHRoaXMuXyRFaC5zZXQoaTEwLCB0OSk7CiAgICB9CiAgICB0aGlzLmVsZW1lbnRTdHlsZXMgPSB0aGlzLmZpbmFsaXplU3R5bGVzKHRoaXMuc3R5bGVzKTsKICB9CiAgc3RhdGljIGZpbmFsaXplU3R5bGVzKHM5KSB7CiAgICBjb25zdCBpMTAgPSBbXTsKICAgIGlmIChBcnJheS5pc0FycmF5KHM5KSkgewogICAgICBjb25zdCBlMTAgPSBuZXcgU2V0KHM5LmZsYXQoMSAvIDApLnJldmVyc2UoKSk7CiAgICAgIGZvciAoY29uc3QgczEwIG9mIGUxMCkgaTEwLnVuc2hpZnQoYyhzMTApKTsKICAgIH0gZWxzZSB2b2lkIDAgIT09IHM5ICYmIGkxMC5wdXNoKGMoczkpKTsKICAgIHJldHVybiBpMTA7CiAgfQogIHN0YXRpYyBfJEV1KHQ4LCBzOSkgewogICAgY29uc3QgaTEwID0gczkuYXR0cmlidXRlOwogICAgcmV0dXJuIGZhbHNlID09PSBpMTAgPyB2b2lkIDAgOiAic3RyaW5nIiA9PSB0eXBlb2YgaTEwID8gaTEwIDogInN0cmluZyIgPT0gdHlwZW9mIHQ4ID8gdDgudG9Mb3dlckNhc2UoKSA6IHZvaWQgMDsKICB9CiAgY29uc3RydWN0b3IoKSB7CiAgICBzdXBlcigpLCB0aGlzLl8kRXAgPSB2b2lkIDAsIHRoaXMuaXNVcGRhdGVQZW5kaW5nID0gZmFsc2UsIHRoaXMuaGFzVXBkYXRlZCA9IGZhbHNlLCB0aGlzLl8kRW0gPSBudWxsLCB0aGlzLl8kRXYoKTsKICB9CiAgXyRFdigpIHsKICAgIHRoaXMuXyRFUyA9IG5ldyBQcm9taXNlKCh0OCkgPT4gdGhpcy5lbmFibGVVcGRhdGluZyA9IHQ4KSwgdGhpcy5fJEFMID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSwgdGhpcy5fJEVfKCksIHRoaXMucmVxdWVzdFVwZGF0ZSgpLCB0aGlzLmNvbnN0cnVjdG9yLmw/LmZvckVhY2goKHQ4KSA9PiB0OCh0aGlzKSk7CiAgfQogIGFkZENvbnRyb2xsZXIodDgpIHsKICAgICh0aGlzLl8kRU8gPz89IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCkpLmFkZCh0OCksIHZvaWQgMCAhPT0gdGhpcy5yZW5kZXJSb290ICYmIHRoaXMuaXNDb25uZWN0ZWQgJiYgdDguaG9zdENvbm5lY3RlZD8uKCk7CiAgfQogIHJlbW92ZUNvbnRyb2xsZXIodDgpIHsKICAgIHRoaXMuXyRFTz8uZGVsZXRlKHQ4KTsKICB9CiAgXyRFXygpIHsKICAgIGNvbnN0IHQ4ID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSwgczkgPSB0aGlzLmNvbnN0cnVjdG9yLmVsZW1lbnRQcm9wZXJ0aWVzOwogICAgZm9yIChjb25zdCBpMTAgb2Ygczkua2V5cygpKSB0aGlzLmhhc093blByb3BlcnR5KGkxMCkgJiYgKHQ4LnNldChpMTAsIHRoaXNbaTEwXSksIGRlbGV0ZSB0aGlzW2kxMF0pOwogICAgdDguc2l6ZSA+IDAgJiYgKHRoaXMuXyRFcCA9IHQ4KTsKICB9CiAgY3JlYXRlUmVuZGVyUm9vdCgpIHsKICAgIGNvbnN0IHQ4ID0gdGhpcy5zaGFkb3dSb290ID8/IHRoaXMuYXR0YWNoU2hhZG93KHRoaXMuY29uc3RydWN0b3Iuc2hhZG93Um9vdE9wdGlvbnMpOwogICAgcmV0dXJuIFModDgsIHRoaXMuY29uc3RydWN0b3IuZWxlbWVudFN0eWxlcyksIHQ4OwogIH0KICBjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgIHRoaXMucmVuZGVyUm9vdCA/Pz0gdGhpcy5jcmVhdGVSZW5kZXJSb290KCksIHRoaXMuZW5hYmxlVXBkYXRpbmcodHJ1ZSksIHRoaXMuXyRFTz8uZm9yRWFjaCgodDgpID0+IHQ4Lmhvc3RDb25uZWN0ZWQ/LigpKTsKICB9CiAgZW5hYmxlVXBkYXRpbmcodDgpIHsKICB9CiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICB0aGlzLl8kRU8/LmZvckVhY2goKHQ4KSA9PiB0OC5ob3N0RGlzY29ubmVjdGVkPy4oKSk7CiAgfQogIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayh0OCwgczksIGkxMCkgewogICAgdGhpcy5fJEFLKHQ4LCBpMTApOwogIH0KICBfJEVUKHQ4LCBzOSkgewogICAgY29uc3QgaTEwID0gdGhpcy5jb25zdHJ1Y3Rvci5lbGVtZW50UHJvcGVydGllcy5nZXQodDgpLCBlMTAgPSB0aGlzLmNvbnN0cnVjdG9yLl8kRXUodDgsIGkxMCk7CiAgICBpZiAodm9pZCAwICE9PSBlMTAgJiYgdHJ1ZSA9PT0gaTEwLnJlZmxlY3QpIHsKICAgICAgY29uc3QgaDcgPSAodm9pZCAwICE9PSBpMTAuY29udmVydGVyPy50b0F0dHJpYnV0ZSA/IGkxMC5jb252ZXJ0ZXIgOiB1KS50b0F0dHJpYnV0ZShzOSwgaTEwLnR5cGUpOwogICAgICB0aGlzLl8kRW0gPSB0OCwgbnVsbCA9PSBoNyA/IHRoaXMucmVtb3ZlQXR0cmlidXRlKGUxMCkgOiB0aGlzLnNldEF0dHJpYnV0ZShlMTAsIGg3KSwgdGhpcy5fJEVtID0gbnVsbDsKICAgIH0KICB9CiAgXyRBSyh0OCwgczkpIHsKICAgIGNvbnN0IGkxMCA9IHRoaXMuY29uc3RydWN0b3IsIGUxMCA9IGkxMC5fJEVoLmdldCh0OCk7CiAgICBpZiAodm9pZCAwICE9PSBlMTAgJiYgdGhpcy5fJEVtICE9PSBlMTApIHsKICAgICAgY29uc3QgdDkgPSBpMTAuZ2V0UHJvcGVydHlPcHRpb25zKGUxMCksIGg3ID0gImZ1bmN0aW9uIiA9PSB0eXBlb2YgdDkuY29udmVydGVyID8geyBmcm9tQXR0cmlidXRlOiB0OS5jb252ZXJ0ZXIgfSA6IHZvaWQgMCAhPT0gdDkuY29udmVydGVyPy5mcm9tQXR0cmlidXRlID8gdDkuY29udmVydGVyIDogdTsKICAgICAgdGhpcy5fJEVtID0gZTEwOwogICAgICBjb25zdCByMTAgPSBoNy5mcm9tQXR0cmlidXRlKHM5LCB0OS50eXBlKTsKICAgICAgdGhpc1tlMTBdID0gcjEwID8/IHRoaXMuXyRFaj8uZ2V0KGUxMCkgPz8gcjEwLCB0aGlzLl8kRW0gPSBudWxsOwogICAgfQogIH0KICByZXF1ZXN0VXBkYXRlKHQ4LCBzOSwgaTEwLCBlMTAgPSBmYWxzZSwgaDcpIHsKICAgIGlmICh2b2lkIDAgIT09IHQ4KSB7CiAgICAgIGNvbnN0IHIxMCA9IHRoaXMuY29uc3RydWN0b3I7CiAgICAgIGlmIChmYWxzZSA9PT0gZTEwICYmIChoNyA9IHRoaXNbdDhdKSwgaTEwID8/PSByMTAuZ2V0UHJvcGVydHlPcHRpb25zKHQ4KSwgISgoaTEwLmhhc0NoYW5nZWQgPz8gZikoaDcsIHM5KSB8fCBpMTAudXNlRGVmYXVsdCAmJiBpMTAucmVmbGVjdCAmJiBoNyA9PT0gdGhpcy5fJEVqPy5nZXQodDgpICYmICF0aGlzLmhhc0F0dHJpYnV0ZShyMTAuXyRFdSh0OCwgaTEwKSkpKSByZXR1cm47CiAgICAgIHRoaXMuQyh0OCwgczksIGkxMCk7CiAgICB9CiAgICBmYWxzZSA9PT0gdGhpcy5pc1VwZGF0ZVBlbmRpbmcgJiYgKHRoaXMuXyRFUyA9IHRoaXMuXyRFUCgpKTsKICB9CiAgQyh0OCwgczksIHsgdXNlRGVmYXVsdDogaTEwLCByZWZsZWN0OiBlMTAsIHdyYXBwZWQ6IGg3IH0sIHIxMCkgewogICAgaTEwICYmICEodGhpcy5fJEVqID8/PSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpKS5oYXModDgpICYmICh0aGlzLl8kRWouc2V0KHQ4LCByMTAgPz8gczkgPz8gdGhpc1t0OF0pLCB0cnVlICE9PSBoNyB8fCB2b2lkIDAgIT09IHIxMCkgfHwgKHRoaXMuXyRBTC5oYXModDgpIHx8ICh0aGlzLmhhc1VwZGF0ZWQgfHwgaTEwIHx8IChzOSA9IHZvaWQgMCksIHRoaXMuXyRBTC5zZXQodDgsIHM5KSksIHRydWUgPT09IGUxMCAmJiB0aGlzLl8kRW0gIT09IHQ4ICYmICh0aGlzLl8kRXEgPz89IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCkpLmFkZCh0OCkpOwogIH0KICBhc3luYyBfJEVQKCkgewogICAgdGhpcy5pc1VwZGF0ZVBlbmRpbmcgPSB0cnVlOwogICAgdHJ5IHsKICAgICAgYXdhaXQgdGhpcy5fJEVTOwogICAgfSBjYXRjaCAodDkpIHsKICAgICAgUHJvbWlzZS5yZWplY3QodDkpOwogICAgfQogICAgY29uc3QgdDggPSB0aGlzLnNjaGVkdWxlVXBkYXRlKCk7CiAgICByZXR1cm4gbnVsbCAhPSB0OCAmJiBhd2FpdCB0OCwgIXRoaXMuaXNVcGRhdGVQZW5kaW5nOwogIH0KICBzY2hlZHVsZVVwZGF0ZSgpIHsKICAgIHJldHVybiB0aGlzLnBlcmZvcm1VcGRhdGUoKTsKICB9CiAgcGVyZm9ybVVwZGF0ZSgpIHsKICAgIGlmICghdGhpcy5pc1VwZGF0ZVBlbmRpbmcpIHJldHVybjsKICAgIGlmICghdGhpcy5oYXNVcGRhdGVkKSB7CiAgICAgIGlmICh0aGlzLnJlbmRlclJvb3QgPz89IHRoaXMuY3JlYXRlUmVuZGVyUm9vdCgpLCB0aGlzLl8kRXApIHsKICAgICAgICBmb3IgKGNvbnN0IFt0MTAsIHMxMF0gb2YgdGhpcy5fJEVwKSB0aGlzW3QxMF0gPSBzMTA7CiAgICAgICAgdGhpcy5fJEVwID0gdm9pZCAwOwogICAgICB9CiAgICAgIGNvbnN0IHQ5ID0gdGhpcy5jb25zdHJ1Y3Rvci5lbGVtZW50UHJvcGVydGllczsKICAgICAgaWYgKHQ5LnNpemUgPiAwKSBmb3IgKGNvbnN0IFtzMTAsIGkxMF0gb2YgdDkpIHsKICAgICAgICBjb25zdCB7IHdyYXBwZWQ6IHQxMCB9ID0gaTEwLCBlMTAgPSB0aGlzW3MxMF07CiAgICAgICAgdHJ1ZSAhPT0gdDEwIHx8IHRoaXMuXyRBTC5oYXMoczEwKSB8fCB2b2lkIDAgPT09IGUxMCB8fCB0aGlzLkMoczEwLCB2b2lkIDAsIGkxMCwgZTEwKTsKICAgICAgfQogICAgfQogICAgbGV0IHQ4ID0gZmFsc2U7CiAgICBjb25zdCBzOSA9IHRoaXMuXyRBTDsKICAgIHRyeSB7CiAgICAgIHQ4ID0gdGhpcy5zaG91bGRVcGRhdGUoczkpLCB0OCA/ICh0aGlzLndpbGxVcGRhdGUoczkpLCB0aGlzLl8kRU8/LmZvckVhY2goKHQ5KSA9PiB0OS5ob3N0VXBkYXRlPy4oKSksIHRoaXMudXBkYXRlKHM5KSkgOiB0aGlzLl8kRU0oKTsKICAgIH0gY2F0Y2ggKHMxMCkgewogICAgICB0aHJvdyB0OCA9IGZhbHNlLCB0aGlzLl8kRU0oKSwgczEwOwogICAgfQogICAgdDggJiYgdGhpcy5fJEFFKHM5KTsKICB9CiAgd2lsbFVwZGF0ZSh0OCkgewogIH0KICBfJEFFKHQ4KSB7CiAgICB0aGlzLl8kRU8/LmZvckVhY2goKHQ5KSA9PiB0OS5ob3N0VXBkYXRlZD8uKCkpLCB0aGlzLmhhc1VwZGF0ZWQgfHwgKHRoaXMuaGFzVXBkYXRlZCA9IHRydWUsIHRoaXMuZmlyc3RVcGRhdGVkKHQ4KSksIHRoaXMudXBkYXRlZCh0OCk7CiAgfQogIF8kRU0oKSB7CiAgICB0aGlzLl8kQUwgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLCB0aGlzLmlzVXBkYXRlUGVuZGluZyA9IGZhbHNlOwogIH0KICBnZXQgdXBkYXRlQ29tcGxldGUoKSB7CiAgICByZXR1cm4gdGhpcy5nZXRVcGRhdGVDb21wbGV0ZSgpOwogIH0KICBnZXRVcGRhdGVDb21wbGV0ZSgpIHsKICAgIHJldHVybiB0aGlzLl8kRVM7CiAgfQogIHNob3VsZFVwZGF0ZSh0OCkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIHVwZGF0ZSh0OCkgewogICAgdGhpcy5fJEVxICYmPSB0aGlzLl8kRXEuZm9yRWFjaCgodDkpID0+IHRoaXMuXyRFVCh0OSwgdGhpc1t0OV0pKSwgdGhpcy5fJEVNKCk7CiAgfQogIHVwZGF0ZWQodDgpIHsKICB9CiAgZmlyc3RVcGRhdGVkKHQ4KSB7CiAgfQp9Owp5LmVsZW1lbnRTdHlsZXMgPSBbXSwgeS5zaGFkb3dSb290T3B0aW9ucyA9IHsgbW9kZTogIm9wZW4iIH0sIHlbZCgiZWxlbWVudFByb3BlcnRpZXMiKV0gPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLCB5W2QoImZpbmFsaXplZCIpXSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCksIHA/Lih7IFJlYWN0aXZlRWxlbWVudDogeSB9KSwgKGEucmVhY3RpdmVFbGVtZW50VmVyc2lvbnMgPz89IFtdKS5wdXNoKCIyLjEuMiIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2xpdC1odG1sQDMuMy4yL25vZGVfbW9kdWxlcy9saXQtaHRtbC9saXQtaHRtbC5qcwp2YXIgdDIgPSBnbG9iYWxUaGlzLCBpMyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHQ4KSA9PiB0OCwgImkiKSwgczIgPSB0Mi50cnVzdGVkVHlwZXMsIGUzID0gczIgPyBzMi5jcmVhdGVQb2xpY3koImxpdC1odG1sIiwgeyBjcmVhdGVIVE1MOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh0OCkgPT4gdDgsICJjcmVhdGVIVE1MIikgfSkgOiB2b2lkIDAsIGgyID0gIiRsaXQkIiwgbzMgPSBgbGl0JCR7TWF0aC5yYW5kb20oKS50b0ZpeGVkKDkpLnNsaWNlKDIpfSRgLCBuMyA9ICI/IiArIG8zLCByMyA9IGA8JHtuM30+YCwgbDIgPSBkb2N1bWVudCwgYzMgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCgpID0+IGwyLmNyZWF0ZUNvbW1lbnQoIiIpLCAiYyIpLCBhMiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHQ4KSA9PiBudWxsID09PSB0OCB8fCAib2JqZWN0IiAhPSB0eXBlb2YgdDggJiYgImZ1bmN0aW9uIiAhPSB0eXBlb2YgdDgsICJhIiksIHUyID0gQXJyYXkuaXNBcnJheSwgZDIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh0OCkgPT4gdTIodDgpIHx8ICJmdW5jdGlvbiIgPT0gdHlwZW9mIHQ4Py5bU3ltYm9sLml0ZXJhdG9yXSwgImQiKSwgZjIgPSAiWyAJXG5cZlxyXSIsIHYgPSAvPCg/OighLS18XC9bXmEtekEtWl0pfChcLz9bYS16QS1aXVtePlxzXSopfChcLz8kKSkvZywgXyA9IC8tLT4vZywgbSA9IC8+L2csIHAyID0gUmVnRXhwKGA+fCR7ZjJ9KD86KFteXFxzIic+PS9dKykoJHtmMn0qPSR7ZjJ9Kig/OlteIAkKXGZcciInXGA8Pj1dfCgifCcpfCkpfCQpYCwgImciKSwgZyA9IC8nL2csICQgPSAvIi9nLCB5MiA9IC9eKD86c2NyaXB0fHN0eWxlfHRleHRhcmVhfHRpdGxlKSQvaSwgeCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHQ4KSA9PiAoaTEwLCAuLi5zOSkgPT4gKHsgXyRsaXRUeXBlJDogdDgsIHN0cmluZ3M6IGkxMCwgdmFsdWVzOiBzOSB9KSwgIngiKSwgYjIgPSB4KDEpLCB3ID0geCgyKSwgVCA9IHgoMyksIEUgPSAvKiBAX19QVVJFX18gKi8gU3ltYm9sLmZvcigibGl0LW5vQ2hhbmdlIiksIEEgPSAvKiBAX19QVVJFX18gKi8gU3ltYm9sLmZvcigibGl0LW5vdGhpbmciKSwgQyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpLCBQID0gbDIuY3JlYXRlVHJlZVdhbGtlcihsMiwgMTI5KTsKZnVuY3Rpb24gVih0OCwgaTEwKSB7CiAgaWYgKCF1Mih0OCkgfHwgIXQ4Lmhhc093blByb3BlcnR5KCJyYXciKSkgdGhyb3cgRXJyb3IoImludmFsaWQgdGVtcGxhdGUgc3RyaW5ncyBhcnJheSIpOwogIHJldHVybiB2b2lkIDAgIT09IGUzID8gZTMuY3JlYXRlSFRNTChpMTApIDogaTEwOwp9Cl9fbmFtZShWLCAiViIpOwp2YXIgTiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHQ4LCBpMTApID0+IHsKICBjb25zdCBzOSA9IHQ4Lmxlbmd0aCAtIDEsIGUxMCA9IFtdOwogIGxldCBuMTEsIGw1ID0gMiA9PT0gaTEwID8gIjxzdmc+IiA6IDMgPT09IGkxMCA/ICI8bWF0aD4iIDogIiIsIGMxMCA9IHY7CiAgZm9yIChsZXQgaTExID0gMDsgaTExIDwgczk7IGkxMSsrKSB7CiAgICBjb25zdCBzMTAgPSB0OFtpMTFdOwogICAgbGV0IGE0LCB1NiwgZDQgPSAtMSwgZjYgPSAwOwogICAgZm9yICg7IGY2IDwgczEwLmxlbmd0aCAmJiAoYzEwLmxhc3RJbmRleCA9IGY2LCB1NiA9IGMxMC5leGVjKHMxMCksIG51bGwgIT09IHU2KTsgKSBmNiA9IGMxMC5sYXN0SW5kZXgsIGMxMCA9PT0gdiA/ICIhLS0iID09PSB1NlsxXSA/IGMxMCA9IF8gOiB2b2lkIDAgIT09IHU2WzFdID8gYzEwID0gbSA6IHZvaWQgMCAhPT0gdTZbMl0gPyAoeTIudGVzdCh1NlsyXSkgJiYgKG4xMSA9IFJlZ0V4cCgiPC8iICsgdTZbMl0sICJnIikpLCBjMTAgPSBwMikgOiB2b2lkIDAgIT09IHU2WzNdICYmIChjMTAgPSBwMikgOiBjMTAgPT09IHAyID8gIj4iID09PSB1NlswXSA/IChjMTAgPSBuMTEgPz8gdiwgZDQgPSAtMSkgOiB2b2lkIDAgPT09IHU2WzFdID8gZDQgPSAtMiA6IChkNCA9IGMxMC5sYXN0SW5kZXggLSB1NlsyXS5sZW5ndGgsIGE0ID0gdTZbMV0sIGMxMCA9IHZvaWQgMCA9PT0gdTZbM10gPyBwMiA6ICciJyA9PT0gdTZbM10gPyAkIDogZykgOiBjMTAgPT09ICQgfHwgYzEwID09PSBnID8gYzEwID0gcDIgOiBjMTAgPT09IF8gfHwgYzEwID09PSBtID8gYzEwID0gdiA6IChjMTAgPSBwMiwgbjExID0gdm9pZCAwKTsKICAgIGNvbnN0IHgzID0gYzEwID09PSBwMiAmJiB0OFtpMTEgKyAxXS5zdGFydHNXaXRoKCIvPiIpID8gIiAiIDogIiI7CiAgICBsNSArPSBjMTAgPT09IHYgPyBzMTAgKyByMyA6IGQ0ID49IDAgPyAoZTEwLnB1c2goYTQpLCBzMTAuc2xpY2UoMCwgZDQpICsgaDIgKyBzMTAuc2xpY2UoZDQpICsgbzMgKyB4MykgOiBzMTAgKyBvMyArICgtMiA9PT0gZDQgPyBpMTEgOiB4Myk7CiAgfQogIHJldHVybiBbVih0OCwgbDUgKyAodDhbczldIHx8ICI8Pz4iKSArICgyID09PSBpMTAgPyAiPC9zdmc+IiA6IDMgPT09IGkxMCA/ICI8L21hdGg+IiA6ICIiKSksIGUxMF07Cn0sICJOIik7CnZhciBTMiA9IGNsYXNzIF9TIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJTIik7CiAgfQogIGNvbnN0cnVjdG9yKHsgc3RyaW5nczogdDgsIF8kbGl0VHlwZSQ6IGkxMCB9LCBlMTApIHsKICAgIGxldCByMTA7CiAgICB0aGlzLnBhcnRzID0gW107CiAgICBsZXQgbDUgPSAwLCBhNCA9IDA7CiAgICBjb25zdCB1NiA9IHQ4Lmxlbmd0aCAtIDEsIGQ0ID0gdGhpcy5wYXJ0cywgW2Y2LCB2NF0gPSBOKHQ4LCBpMTApOwogICAgaWYgKHRoaXMuZWwgPSBfUy5jcmVhdGVFbGVtZW50KGY2LCBlMTApLCBQLmN1cnJlbnROb2RlID0gdGhpcy5lbC5jb250ZW50LCAyID09PSBpMTAgfHwgMyA9PT0gaTEwKSB7CiAgICAgIGNvbnN0IHQ5ID0gdGhpcy5lbC5jb250ZW50LmZpcnN0Q2hpbGQ7CiAgICAgIHQ5LnJlcGxhY2VXaXRoKC4uLnQ5LmNoaWxkTm9kZXMpOwogICAgfQogICAgZm9yICg7IG51bGwgIT09IChyMTAgPSBQLm5leHROb2RlKCkpICYmIGQ0Lmxlbmd0aCA8IHU2OyApIHsKICAgICAgaWYgKDEgPT09IHIxMC5ub2RlVHlwZSkgewogICAgICAgIGlmIChyMTAuaGFzQXR0cmlidXRlcygpKSBmb3IgKGNvbnN0IHQ5IG9mIHIxMC5nZXRBdHRyaWJ1dGVOYW1lcygpKSBpZiAodDkuZW5kc1dpdGgoaDIpKSB7CiAgICAgICAgICBjb25zdCBpMTEgPSB2NFthNCsrXSwgczkgPSByMTAuZ2V0QXR0cmlidXRlKHQ5KS5zcGxpdChvMyksIGUxMSA9IC8oWy4/QF0pPyguKikvLmV4ZWMoaTExKTsKICAgICAgICAgIGQ0LnB1c2goeyB0eXBlOiAxLCBpbmRleDogbDUsIG5hbWU6IGUxMVsyXSwgc3RyaW5nczogczksIGN0b3I6ICIuIiA9PT0gZTExWzFdID8gSSA6ICI/IiA9PT0gZTExWzFdID8gTCA6ICJAIiA9PT0gZTExWzFdID8geiA6IEggfSksIHIxMC5yZW1vdmVBdHRyaWJ1dGUodDkpOwogICAgICAgIH0gZWxzZSB0OS5zdGFydHNXaXRoKG8zKSAmJiAoZDQucHVzaCh7IHR5cGU6IDYsIGluZGV4OiBsNSB9KSwgcjEwLnJlbW92ZUF0dHJpYnV0ZSh0OSkpOwogICAgICAgIGlmICh5Mi50ZXN0KHIxMC50YWdOYW1lKSkgewogICAgICAgICAgY29uc3QgdDkgPSByMTAudGV4dENvbnRlbnQuc3BsaXQobzMpLCBpMTEgPSB0OS5sZW5ndGggLSAxOwogICAgICAgICAgaWYgKGkxMSA+IDApIHsKICAgICAgICAgICAgcjEwLnRleHRDb250ZW50ID0gczIgPyBzMi5lbXB0eVNjcmlwdCA6ICIiOwogICAgICAgICAgICBmb3IgKGxldCBzOSA9IDA7IHM5IDwgaTExOyBzOSsrKSByMTAuYXBwZW5kKHQ5W3M5XSwgYzMoKSksIFAubmV4dE5vZGUoKSwgZDQucHVzaCh7IHR5cGU6IDIsIGluZGV4OiArK2w1IH0pOwogICAgICAgICAgICByMTAuYXBwZW5kKHQ5W2kxMV0sIGMzKCkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICg4ID09PSByMTAubm9kZVR5cGUpIGlmIChyMTAuZGF0YSA9PT0gbjMpIGQ0LnB1c2goeyB0eXBlOiAyLCBpbmRleDogbDUgfSk7CiAgICAgIGVsc2UgewogICAgICAgIGxldCB0OSA9IC0xOwogICAgICAgIGZvciAoOyAtMSAhPT0gKHQ5ID0gcjEwLmRhdGEuaW5kZXhPZihvMywgdDkgKyAxKSk7ICkgZDQucHVzaCh7IHR5cGU6IDcsIGluZGV4OiBsNSB9KSwgdDkgKz0gbzMubGVuZ3RoIC0gMTsKICAgICAgfQogICAgICBsNSsrOwogICAgfQogIH0KICBzdGF0aWMgY3JlYXRlRWxlbWVudCh0OCwgaTEwKSB7CiAgICBjb25zdCBzOSA9IGwyLmNyZWF0ZUVsZW1lbnQoInRlbXBsYXRlIik7CiAgICByZXR1cm4gczkuaW5uZXJIVE1MID0gdDgsIHM5OwogIH0KfTsKZnVuY3Rpb24gTSh0OCwgaTEwLCBzOSA9IHQ4LCBlMTApIHsKICBpZiAoaTEwID09PSBFKSByZXR1cm4gaTEwOwogIGxldCBoNyA9IHZvaWQgMCAhPT0gZTEwID8gczkuXyRDbz8uW2UxMF0gOiBzOS5fJENsOwogIGNvbnN0IG8xMiA9IGEyKGkxMCkgPyB2b2lkIDAgOiBpMTAuXyRsaXREaXJlY3RpdmUkOwogIHJldHVybiBoNz8uY29uc3RydWN0b3IgIT09IG8xMiAmJiAoaDc/Ll8kQU8/LihmYWxzZSksIHZvaWQgMCA9PT0gbzEyID8gaDcgPSB2b2lkIDAgOiAoaDcgPSBuZXcgbzEyKHQ4KSwgaDcuXyRBVCh0OCwgczksIGUxMCkpLCB2b2lkIDAgIT09IGUxMCA/IChzOS5fJENvID8/PSBbXSlbZTEwXSA9IGg3IDogczkuXyRDbCA9IGg3KSwgdm9pZCAwICE9PSBoNyAmJiAoaTEwID0gTSh0OCwgaDcuXyRBUyh0OCwgaTEwLnZhbHVlcyksIGg3LCBlMTApKSwgaTEwOwp9Cl9fbmFtZShNLCAiTSIpOwp2YXIgUiA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJSIik7CiAgfQogIGNvbnN0cnVjdG9yKHQ4LCBpMTApIHsKICAgIHRoaXMuXyRBViA9IFtdLCB0aGlzLl8kQU4gPSB2b2lkIDAsIHRoaXMuXyRBRCA9IHQ4LCB0aGlzLl8kQU0gPSBpMTA7CiAgfQogIGdldCBwYXJlbnROb2RlKCkgewogICAgcmV0dXJuIHRoaXMuXyRBTS5wYXJlbnROb2RlOwogIH0KICBnZXQgXyRBVSgpIHsKICAgIHJldHVybiB0aGlzLl8kQU0uXyRBVTsKICB9CiAgdSh0OCkgewogICAgY29uc3QgeyBlbDogeyBjb250ZW50OiBpMTAgfSwgcGFydHM6IHM5IH0gPSB0aGlzLl8kQUQsIGUxMCA9ICh0OD8uY3JlYXRpb25TY29wZSA/PyBsMikuaW1wb3J0Tm9kZShpMTAsIHRydWUpOwogICAgUC5jdXJyZW50Tm9kZSA9IGUxMDsKICAgIGxldCBoNyA9IFAubmV4dE5vZGUoKSwgbzEyID0gMCwgbjExID0gMCwgcjEwID0gczlbMF07CiAgICBmb3IgKDsgdm9pZCAwICE9PSByMTA7ICkgewogICAgICBpZiAobzEyID09PSByMTAuaW5kZXgpIHsKICAgICAgICBsZXQgaTExOwogICAgICAgIDIgPT09IHIxMC50eXBlID8gaTExID0gbmV3IGsoaDcsIGg3Lm5leHRTaWJsaW5nLCB0aGlzLCB0OCkgOiAxID09PSByMTAudHlwZSA/IGkxMSA9IG5ldyByMTAuY3RvcihoNywgcjEwLm5hbWUsIHIxMC5zdHJpbmdzLCB0aGlzLCB0OCkgOiA2ID09PSByMTAudHlwZSAmJiAoaTExID0gbmV3IFooaDcsIHRoaXMsIHQ4KSksIHRoaXMuXyRBVi5wdXNoKGkxMSksIHIxMCA9IHM5WysrbjExXTsKICAgICAgfQogICAgICBvMTIgIT09IHIxMD8uaW5kZXggJiYgKGg3ID0gUC5uZXh0Tm9kZSgpLCBvMTIrKyk7CiAgICB9CiAgICByZXR1cm4gUC5jdXJyZW50Tm9kZSA9IGwyLCBlMTA7CiAgfQogIHAodDgpIHsKICAgIGxldCBpMTAgPSAwOwogICAgZm9yIChjb25zdCBzOSBvZiB0aGlzLl8kQVYpIHZvaWQgMCAhPT0gczkgJiYgKHZvaWQgMCAhPT0gczkuc3RyaW5ncyA/IChzOS5fJEFJKHQ4LCBzOSwgaTEwKSwgaTEwICs9IHM5LnN0cmluZ3MubGVuZ3RoIC0gMikgOiBzOS5fJEFJKHQ4W2kxMF0pKSwgaTEwKys7CiAgfQp9Owp2YXIgayA9IGNsYXNzIF9rIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJrIik7CiAgfQogIGdldCBfJEFVKCkgewogICAgcmV0dXJuIHRoaXMuXyRBTT8uXyRBVSA/PyB0aGlzLl8kQ3Y7CiAgfQogIGNvbnN0cnVjdG9yKHQ4LCBpMTAsIHM5LCBlMTApIHsKICAgIHRoaXMudHlwZSA9IDIsIHRoaXMuXyRBSCA9IEEsIHRoaXMuXyRBTiA9IHZvaWQgMCwgdGhpcy5fJEFBID0gdDgsIHRoaXMuXyRBQiA9IGkxMCwgdGhpcy5fJEFNID0gczksIHRoaXMub3B0aW9ucyA9IGUxMCwgdGhpcy5fJEN2ID0gZTEwPy5pc0Nvbm5lY3RlZCA/PyB0cnVlOwogIH0KICBnZXQgcGFyZW50Tm9kZSgpIHsKICAgIGxldCB0OCA9IHRoaXMuXyRBQS5wYXJlbnROb2RlOwogICAgY29uc3QgaTEwID0gdGhpcy5fJEFNOwogICAgcmV0dXJuIHZvaWQgMCAhPT0gaTEwICYmIDExID09PSB0OD8ubm9kZVR5cGUgJiYgKHQ4ID0gaTEwLnBhcmVudE5vZGUpLCB0ODsKICB9CiAgZ2V0IHN0YXJ0Tm9kZSgpIHsKICAgIHJldHVybiB0aGlzLl8kQUE7CiAgfQogIGdldCBlbmROb2RlKCkgewogICAgcmV0dXJuIHRoaXMuXyRBQjsKICB9CiAgXyRBSSh0OCwgaTEwID0gdGhpcykgewogICAgdDggPSBNKHRoaXMsIHQ4LCBpMTApLCBhMih0OCkgPyB0OCA9PT0gQSB8fCBudWxsID09IHQ4IHx8ICIiID09PSB0OCA/ICh0aGlzLl8kQUggIT09IEEgJiYgdGhpcy5fJEFSKCksIHRoaXMuXyRBSCA9IEEpIDogdDggIT09IHRoaXMuXyRBSCAmJiB0OCAhPT0gRSAmJiB0aGlzLl8odDgpIDogdm9pZCAwICE9PSB0OC5fJGxpdFR5cGUkID8gdGhpcy4kKHQ4KSA6IHZvaWQgMCAhPT0gdDgubm9kZVR5cGUgPyB0aGlzLlQodDgpIDogZDIodDgpID8gdGhpcy5rKHQ4KSA6IHRoaXMuXyh0OCk7CiAgfQogIE8odDgpIHsKICAgIHJldHVybiB0aGlzLl8kQUEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodDgsIHRoaXMuXyRBQik7CiAgfQogIFQodDgpIHsKICAgIHRoaXMuXyRBSCAhPT0gdDggJiYgKHRoaXMuXyRBUigpLCB0aGlzLl8kQUggPSB0aGlzLk8odDgpKTsKICB9CiAgXyh0OCkgewogICAgdGhpcy5fJEFIICE9PSBBICYmIGEyKHRoaXMuXyRBSCkgPyB0aGlzLl8kQUEubmV4dFNpYmxpbmcuZGF0YSA9IHQ4IDogdGhpcy5UKGwyLmNyZWF0ZVRleHROb2RlKHQ4KSksIHRoaXMuXyRBSCA9IHQ4OwogIH0KICAkKHQ4KSB7CiAgICBjb25zdCB7IHZhbHVlczogaTEwLCBfJGxpdFR5cGUkOiBzOSB9ID0gdDgsIGUxMCA9ICJudW1iZXIiID09IHR5cGVvZiBzOSA/IHRoaXMuXyRBQyh0OCkgOiAodm9pZCAwID09PSBzOS5lbCAmJiAoczkuZWwgPSBTMi5jcmVhdGVFbGVtZW50KFYoczkuaCwgczkuaFswXSksIHRoaXMub3B0aW9ucykpLCBzOSk7CiAgICBpZiAodGhpcy5fJEFIPy5fJEFEID09PSBlMTApIHRoaXMuXyRBSC5wKGkxMCk7CiAgICBlbHNlIHsKICAgICAgY29uc3QgdDkgPSBuZXcgUihlMTAsIHRoaXMpLCBzMTAgPSB0OS51KHRoaXMub3B0aW9ucyk7CiAgICAgIHQ5LnAoaTEwKSwgdGhpcy5UKHMxMCksIHRoaXMuXyRBSCA9IHQ5OwogICAgfQogIH0KICBfJEFDKHQ4KSB7CiAgICBsZXQgaTEwID0gQy5nZXQodDguc3RyaW5ncyk7CiAgICByZXR1cm4gdm9pZCAwID09PSBpMTAgJiYgQy5zZXQodDguc3RyaW5ncywgaTEwID0gbmV3IFMyKHQ4KSksIGkxMDsKICB9CiAgayh0OCkgewogICAgdTIodGhpcy5fJEFIKSB8fCAodGhpcy5fJEFIID0gW10sIHRoaXMuXyRBUigpKTsKICAgIGNvbnN0IGkxMCA9IHRoaXMuXyRBSDsKICAgIGxldCBzOSwgZTEwID0gMDsKICAgIGZvciAoY29uc3QgaDcgb2YgdDgpIGUxMCA9PT0gaTEwLmxlbmd0aCA/IGkxMC5wdXNoKHM5ID0gbmV3IF9rKHRoaXMuTyhjMygpKSwgdGhpcy5PKGMzKCkpLCB0aGlzLCB0aGlzLm9wdGlvbnMpKSA6IHM5ID0gaTEwW2UxMF0sIHM5Ll8kQUkoaDcpLCBlMTArKzsKICAgIGUxMCA8IGkxMC5sZW5ndGggJiYgKHRoaXMuXyRBUihzOSAmJiBzOS5fJEFCLm5leHRTaWJsaW5nLCBlMTApLCBpMTAubGVuZ3RoID0gZTEwKTsKICB9CiAgXyRBUih0OCA9IHRoaXMuXyRBQS5uZXh0U2libGluZywgczkpIHsKICAgIGZvciAodGhpcy5fJEFQPy4oZmFsc2UsIHRydWUsIHM5KTsgdDggIT09IHRoaXMuXyRBQjsgKSB7CiAgICAgIGNvbnN0IHMxMCA9IGkzKHQ4KS5uZXh0U2libGluZzsKICAgICAgaTModDgpLnJlbW92ZSgpLCB0OCA9IHMxMDsKICAgIH0KICB9CiAgc2V0Q29ubmVjdGVkKHQ4KSB7CiAgICB2b2lkIDAgPT09IHRoaXMuXyRBTSAmJiAodGhpcy5fJEN2ID0gdDgsIHRoaXMuXyRBUD8uKHQ4KSk7CiAgfQp9Owp2YXIgSCA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJIIik7CiAgfQogIGdldCB0YWdOYW1lKCkgewogICAgcmV0dXJuIHRoaXMuZWxlbWVudC50YWdOYW1lOwogIH0KICBnZXQgXyRBVSgpIHsKICAgIHJldHVybiB0aGlzLl8kQU0uXyRBVTsKICB9CiAgY29uc3RydWN0b3IodDgsIGkxMCwgczksIGUxMCwgaDcpIHsKICAgIHRoaXMudHlwZSA9IDEsIHRoaXMuXyRBSCA9IEEsIHRoaXMuXyRBTiA9IHZvaWQgMCwgdGhpcy5lbGVtZW50ID0gdDgsIHRoaXMubmFtZSA9IGkxMCwgdGhpcy5fJEFNID0gZTEwLCB0aGlzLm9wdGlvbnMgPSBoNywgczkubGVuZ3RoID4gMiB8fCAiIiAhPT0gczlbMF0gfHwgIiIgIT09IHM5WzFdID8gKHRoaXMuXyRBSCA9IEFycmF5KHM5Lmxlbmd0aCAtIDEpLmZpbGwobmV3IFN0cmluZygpKSwgdGhpcy5zdHJpbmdzID0gczkpIDogdGhpcy5fJEFIID0gQTsKICB9CiAgXyRBSSh0OCwgaTEwID0gdGhpcywgczksIGUxMCkgewogICAgY29uc3QgaDcgPSB0aGlzLnN0cmluZ3M7CiAgICBsZXQgbzEyID0gZmFsc2U7CiAgICBpZiAodm9pZCAwID09PSBoNykgdDggPSBNKHRoaXMsIHQ4LCBpMTAsIDApLCBvMTIgPSAhYTIodDgpIHx8IHQ4ICE9PSB0aGlzLl8kQUggJiYgdDggIT09IEUsIG8xMiAmJiAodGhpcy5fJEFIID0gdDgpOwogICAgZWxzZSB7CiAgICAgIGNvbnN0IGUxMSA9IHQ4OwogICAgICBsZXQgbjExLCByMTA7CiAgICAgIGZvciAodDggPSBoN1swXSwgbjExID0gMDsgbjExIDwgaDcubGVuZ3RoIC0gMTsgbjExKyspIHIxMCA9IE0odGhpcywgZTExW3M5ICsgbjExXSwgaTEwLCBuMTEpLCByMTAgPT09IEUgJiYgKHIxMCA9IHRoaXMuXyRBSFtuMTFdKSwgbzEyIHx8PSAhYTIocjEwKSB8fCByMTAgIT09IHRoaXMuXyRBSFtuMTFdLCByMTAgPT09IEEgPyB0OCA9IEEgOiB0OCAhPT0gQSAmJiAodDggKz0gKHIxMCA/PyAiIikgKyBoN1tuMTEgKyAxXSksIHRoaXMuXyRBSFtuMTFdID0gcjEwOwogICAgfQogICAgbzEyICYmICFlMTAgJiYgdGhpcy5qKHQ4KTsKICB9CiAgaih0OCkgewogICAgdDggPT09IEEgPyB0aGlzLmVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKHRoaXMubmFtZSkgOiB0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKHRoaXMubmFtZSwgdDggPz8gIiIpOwogIH0KfTsKdmFyIEkgPSBjbGFzcyBleHRlbmRzIEggewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkkiKTsKICB9CiAgY29uc3RydWN0b3IoKSB7CiAgICBzdXBlciguLi5hcmd1bWVudHMpLCB0aGlzLnR5cGUgPSAzOwogIH0KICBqKHQ4KSB7CiAgICB0aGlzLmVsZW1lbnRbdGhpcy5uYW1lXSA9IHQ4ID09PSBBID8gdm9pZCAwIDogdDg7CiAgfQp9Owp2YXIgTCA9IGNsYXNzIGV4dGVuZHMgSCB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiTCIpOwogIH0KICBjb25zdHJ1Y3RvcigpIHsKICAgIHN1cGVyKC4uLmFyZ3VtZW50cyksIHRoaXMudHlwZSA9IDQ7CiAgfQogIGoodDgpIHsKICAgIHRoaXMuZWxlbWVudC50b2dnbGVBdHRyaWJ1dGUodGhpcy5uYW1lLCAhIXQ4ICYmIHQ4ICE9PSBBKTsKICB9Cn07CnZhciB6ID0gY2xhc3MgZXh0ZW5kcyBIIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJ6Iik7CiAgfQogIGNvbnN0cnVjdG9yKHQ4LCBpMTAsIHM5LCBlMTAsIGg3KSB7CiAgICBzdXBlcih0OCwgaTEwLCBzOSwgZTEwLCBoNyksIHRoaXMudHlwZSA9IDU7CiAgfQogIF8kQUkodDgsIGkxMCA9IHRoaXMpIHsKICAgIGlmICgodDggPSBNKHRoaXMsIHQ4LCBpMTAsIDApID8/IEEpID09PSBFKSByZXR1cm47CiAgICBjb25zdCBzOSA9IHRoaXMuXyRBSCwgZTEwID0gdDggPT09IEEgJiYgczkgIT09IEEgfHwgdDguY2FwdHVyZSAhPT0gczkuY2FwdHVyZSB8fCB0OC5vbmNlICE9PSBzOS5vbmNlIHx8IHQ4LnBhc3NpdmUgIT09IHM5LnBhc3NpdmUsIGg3ID0gdDggIT09IEEgJiYgKHM5ID09PSBBIHx8IGUxMCk7CiAgICBlMTAgJiYgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcy5uYW1lLCB0aGlzLCBzOSksIGg3ICYmIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHRoaXMubmFtZSwgdGhpcywgdDgpLCB0aGlzLl8kQUggPSB0ODsKICB9CiAgaGFuZGxlRXZlbnQodDgpIHsKICAgICJmdW5jdGlvbiIgPT0gdHlwZW9mIHRoaXMuXyRBSCA/IHRoaXMuXyRBSC5jYWxsKHRoaXMub3B0aW9ucz8uaG9zdCA/PyB0aGlzLmVsZW1lbnQsIHQ4KSA6IHRoaXMuXyRBSC5oYW5kbGVFdmVudCh0OCk7CiAgfQp9Owp2YXIgWiA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJaIik7CiAgfQogIGNvbnN0cnVjdG9yKHQ4LCBpMTAsIHM5KSB7CiAgICB0aGlzLmVsZW1lbnQgPSB0OCwgdGhpcy50eXBlID0gNiwgdGhpcy5fJEFOID0gdm9pZCAwLCB0aGlzLl8kQU0gPSBpMTAsIHRoaXMub3B0aW9ucyA9IHM5OwogIH0KICBnZXQgXyRBVSgpIHsKICAgIHJldHVybiB0aGlzLl8kQU0uXyRBVTsKICB9CiAgXyRBSSh0OCkgewogICAgTSh0aGlzLCB0OCk7CiAgfQp9Owp2YXIgaiA9IHsgTTogaDIsIFA6IG8zLCBBOiBuMywgQzogMSwgTDogTiwgUiwgRDogZDIsIFY6IE0sIEk6IGssIEgsIE46IEwsIFU6IHosIEI6IEksIEY6IFogfSwgQiA9IHQyLmxpdEh0bWxQb2x5ZmlsbFN1cHBvcnQ7CkI/LihTMiwgayksICh0Mi5saXRIdG1sVmVyc2lvbnMgPz89IFtdKS5wdXNoKCIzLjMuMiIpOwp2YXIgRCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHQ4LCBpMTAsIHM5KSA9PiB7CiAgY29uc3QgZTEwID0gczk/LnJlbmRlckJlZm9yZSA/PyBpMTA7CiAgbGV0IGg3ID0gZTEwLl8kbGl0UGFydCQ7CiAgaWYgKHZvaWQgMCA9PT0gaDcpIHsKICAgIGNvbnN0IHQ5ID0gczk/LnJlbmRlckJlZm9yZSA/PyBudWxsOwogICAgZTEwLl8kbGl0UGFydCQgPSBoNyA9IG5ldyBrKGkxMC5pbnNlcnRCZWZvcmUoYzMoKSwgdDkpLCB0OSwgdm9pZCAwLCBzOSA/PyB7fSk7CiAgfQogIHJldHVybiBoNy5fJEFJKHQ4KSwgaDc7Cn0sICJEIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbGl0LWVsZW1lbnRANC4yLjIvbm9kZV9tb2R1bGVzL2xpdC1lbGVtZW50L2xpdC1lbGVtZW50LmpzCnZhciBzMyA9IGdsb2JhbFRoaXM7CnZhciBpNCA9IGNsYXNzIGV4dGVuZHMgeSB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiaSIpOwogIH0KICBjb25zdHJ1Y3RvcigpIHsKICAgIHN1cGVyKC4uLmFyZ3VtZW50cyksIHRoaXMucmVuZGVyT3B0aW9ucyA9IHsgaG9zdDogdGhpcyB9LCB0aGlzLl8kRG8gPSB2b2lkIDA7CiAgfQogIGNyZWF0ZVJlbmRlclJvb3QoKSB7CiAgICBjb25zdCB0OCA9IHN1cGVyLmNyZWF0ZVJlbmRlclJvb3QoKTsKICAgIHJldHVybiB0aGlzLnJlbmRlck9wdGlvbnMucmVuZGVyQmVmb3JlID8/PSB0OC5maXJzdENoaWxkLCB0ODsKICB9CiAgdXBkYXRlKHQ4KSB7CiAgICBjb25zdCByMTAgPSB0aGlzLnJlbmRlcigpOwogICAgdGhpcy5oYXNVcGRhdGVkIHx8ICh0aGlzLnJlbmRlck9wdGlvbnMuaXNDb25uZWN0ZWQgPSB0aGlzLmlzQ29ubmVjdGVkKSwgc3VwZXIudXBkYXRlKHQ4KSwgdGhpcy5fJERvID0gRChyMTAsIHRoaXMucmVuZGVyUm9vdCwgdGhpcy5yZW5kZXJPcHRpb25zKTsKICB9CiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpLCB0aGlzLl8kRG8/LnNldENvbm5lY3RlZCh0cnVlKTsKICB9CiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpLCB0aGlzLl8kRG8/LnNldENvbm5lY3RlZChmYWxzZSk7CiAgfQogIHJlbmRlcigpIHsKICAgIHJldHVybiBFOwogIH0KfTsKaTQuXyRsaXRFbGVtZW50JCA9IHRydWUsIGk0WyJmaW5hbGl6ZWQiXSA9IHRydWUsIHMzLmxpdEVsZW1lbnRIeWRyYXRlU3VwcG9ydD8uKHsgTGl0RWxlbWVudDogaTQgfSk7CnZhciBvNCA9IHMzLmxpdEVsZW1lbnRQb2x5ZmlsbFN1cHBvcnQ7Cm80Py4oeyBMaXRFbGVtZW50OiBpNCB9KTsKdmFyIG40ID0geyBfJEFLOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh0OCwgZTEwLCByMTApID0+IHsKICB0OC5fJEFLKGUxMCwgcjEwKTsKfSwgIl8kQUsiKSwgXyRBTDogLyogQF9fUFVSRV9fICovIF9fbmFtZSgodDgpID0+IHQ4Ll8kQUwsICJfJEFMIikgfTsKKHMzLmxpdEVsZW1lbnRWZXJzaW9ucyA/Pz0gW10pLnB1c2goIjQuMi4yIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbGl0LWh0bWxAMy4zLjIvbm9kZV9tb2R1bGVzL2xpdC1odG1sL2lzLXNlcnZlci5qcwp2YXIgbzUgPSBmYWxzZTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHJ4QDMuMC4xMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRyeC9kaXN0X3RzL2luZGV4LmpzCnZhciBkaXN0X3RzX2V4cG9ydHMyID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czIsIHsKICBPYnNlcnZhYmxlSW50YWtlOiAoKSA9PiBPYnNlcnZhYmxlSW50YWtlLAogIE9ic2VydmFibGVtYXA6ICgpID0+IE9ic2VydmFibGVtYXAsCiAgZnJvbVN0cmVhbVdpdGhCYWNrcHJlc3N1cmU6ICgpID0+IGZyb21TdHJlYW1XaXRoQmFja3ByZXNzdXJlLAogIHJ4anM6ICgpID0+IHNtYXJ0cnhfcGx1Z2luc19yeGpzX2V4cG9ydHMKfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRwcm9taXNlQDQuMi4zL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHByb21pc2UvZGlzdF90cy9pbmRleC5qcwp2YXIgZGlzdF90c19leHBvcnRzID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0cywgewogIEN1bXVsYXRpdmVEZWZlcnJlZDogKCkgPT4gQ3VtdWxhdGl2ZURlZmVycmVkLAogIERlZmVycmVkOiAoKSA9PiBEZWZlcnJlZCwKICBjdW11bGF0aXZlRGVmZXI6ICgpID0+IGN1bXVsYXRpdmVEZWZlciwKICBkZWZlcjogKCkgPT4gZGVmZXIsCiAgZnJvbUNhbGxiYWNrOiAoKSA9PiBmcm9tQ2FsbGJhY2ssCiAgZ2V0Rmlyc3RUcnVlT3JGYWxzZTogKCkgPT4gZ2V0Rmlyc3RUcnVlT3JGYWxzZSwKICBtYXA6ICgpID0+IG1hcCwKICByZWplY3RlZFByb21pc2U6ICgpID0+IHJlamVjdGVkUHJvbWlzZSwKICByZXNvbHZlZFByb21pc2U6ICgpID0+IHJlc29sdmVkUHJvbWlzZSwKICB0aW1lb3V0QW5kQ29udGludWU6ICgpID0+IHRpbWVvdXRBbmRDb250aW51ZSwKICB0aW1lb3V0V3JhcDogKCkgPT4gdGltZW91dFdyYXAKfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRwcm9taXNlQDQuMi4zL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHByb21pc2UvZGlzdF90cy9zbWFydHByb21pc2UuY2xhc3Nlcy5kZWZlcnJlZC5qcwp2YXIgRGVmZXJyZWQgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiRGVmZXJyZWQiKTsKICB9CiAgY2xhaW0oKSB7CiAgICBpZiAodGhpcy5jbGFpbWVkKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiRGVmZXJyZWQgYWxyZWFkeSBjbGFpbWVkIik7CiAgICB9CiAgICB0aGlzLmNsYWltZWQgPSB0cnVlOwogIH0KICBnZXQgZHVyYXRpb24oKSB7CiAgICBpZiAodGhpcy5zdG9wcGVkQXQpIHsKICAgICAgcmV0dXJuIHRoaXMuc3RvcHBlZEF0IC0gdGhpcy5zdGFydGVkQXQ7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gRGF0ZS5ub3coKSAtIHRoaXMuc3RhcnRlZEF0OwogICAgfQogIH0KICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMuY2xhaW1lZCA9IGZhbHNlOwogICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUyLCByZWplY3QpID0+IHsKICAgICAgdGhpcy5yZXNvbHZlID0gKHZhbHVlQXJnKSA9PiB7CiAgICAgICAgdGhpcy5zdGF0dXMgPSAiZnVsZmlsbGVkIjsKICAgICAgICB0aGlzLnN0b3BwZWRBdCA9IERhdGUubm93KCk7CiAgICAgICAgcmVzb2x2ZTIodmFsdWVBcmcpOwogICAgICB9OwogICAgICB0aGlzLnJlamVjdCA9IChyZWFzb24pID0+IHsKICAgICAgICB0aGlzLnN0YXR1cyA9ICJyZWplY3RlZCI7CiAgICAgICAgdGhpcy5zdG9wcGVkQXQgPSBEYXRlLm5vdygpOwogICAgICAgIHJlamVjdChyZWFzb24pOwogICAgICB9OwogICAgICB0aGlzLnN0YXJ0ZWRBdCA9IERhdGUubm93KCk7CiAgICAgIHRoaXMuc3RhdHVzID0gInBlbmRpbmciOwogICAgfSk7CiAgfQp9Owp2YXIgZGVmZXIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCgpID0+IHsKICByZXR1cm4gbmV3IERlZmVycmVkKCk7Cn0sICJkZWZlciIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0cHJvbWlzZUA0LjIuMy9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRwcm9taXNlL2Rpc3RfdHMvc21hcnRwcm9taXNlLmNsYXNzZXMuY3VtdWxhdGl2ZWRlZmVycmVkLmpzCnZhciBDdW11bGF0aXZlRGVmZXJyZWQgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiQ3VtdWxhdGl2ZURlZmVycmVkIik7CiAgfQogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5hY2N1bXVsYXRlZFByb21pc2VzID0gW107CiAgICB0aGlzLmRlZmVycmVkID0gZGVmZXIoKTsKICAgIHRoaXMucHJvbWlzZSA9IHRoaXMuZGVmZXJyZWQucHJvbWlzZTsKICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4gewogICAgICB3aGlsZSAodGhpcy5hY2N1bXVsYXRlZFByb21pc2VzLmxlbmd0aCA+IDApIHsKICAgICAgICBjb25zdCBwb3BwZWRQcm9taXNlID0gdGhpcy5hY2N1bXVsYXRlZFByb21pc2VzLnNoaWZ0KCk7CiAgICAgICAgYXdhaXQgcG9wcGVkUHJvbWlzZTsKICAgICAgfQogICAgICB0aGlzLmRlZmVycmVkLnJlc29sdmUoKTsKICAgIH0sIDApOwogIH0KICBzdWJEZWZlcigpIHsKICAgIGNvbnN0IGRvbmUgPSBkZWZlcigpOwogICAgdGhpcy5hZGRQcm9taXNlKGRvbmUucHJvbWlzZSk7CiAgICByZXR1cm4gZG9uZTsKICB9CiAgYWRkUHJvbWlzZShwcm9taXNlQXJnKSB7CiAgICB0aGlzLmFjY3VtdWxhdGVkUHJvbWlzZXMucHVzaChwcm9taXNlQXJnKTsKICB9Cn07CnZhciBjdW11bGF0aXZlRGVmZXIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCgpID0+IHsKICByZXR1cm4gbmV3IEN1bXVsYXRpdmVEZWZlcnJlZCgpOwp9LCAiY3VtdWxhdGl2ZURlZmVyIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRwcm9taXNlQDQuMi4zL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHByb21pc2UvZGlzdF90cy9pbmRleC5qcwp2YXIgcmVzb2x2ZWRQcm9taXNlID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgodmFsdWUyKSA9PiB7CiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWx1ZTIpOwp9LCAicmVzb2x2ZWRQcm9taXNlIik7CnZhciByZWplY3RlZFByb21pc2UgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChlcnIpID0+IHsKICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTsKfSwgInJlamVjdGVkUHJvbWlzZSIpOwp2YXIgbWFwID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShhc3luYyAoaW5wdXRBcmcsIGZ1bmN0aW9uQXJnKSA9PiB7CiAgY29uc3QgcHJvbWlzZUFycmF5ID0gW107CiAgY29uc3QgcmVzdWx0QXJyYXkgPSBbXTsKICBmb3IgKGNvbnN0IGl0ZW0gb2YgaW5wdXRBcmcpIHsKICAgIGNvbnN0IHByb21pc2UgPSBmdW5jdGlvbkFyZyhpdGVtKTsKICAgIHByb21pc2VBcnJheS5wdXNoKHByb21pc2UpOwogICAgcHJvbWlzZS50aGVuKCh4MykgPT4gewogICAgICByZXN1bHRBcnJheS5wdXNoKHgzKTsKICAgIH0pOwogIH0KICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlQXJyYXkpOwogIHJldHVybiByZXN1bHRBcnJheTsKfSwgIm1hcCIpOwp2YXIgdGltZW91dFdyYXAgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGFzeW5jIChwcm9taXNlQXJnLCB0aW1lb3V0SW5Nc0FyZywgcmVqZWN0QXJnID0gdHJ1ZSkgPT4gewogIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTIsIHJlamVjdCkgPT4gewogICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgIGlmIChyZWplY3RBcmcpIHsKICAgICAgICByZWplY3QobmV3IEVycm9yKCJ0aW1lb3V0IikpOwogICAgICB9IGVsc2UgewogICAgICAgIHJlc29sdmUyKG51bGwpOwogICAgICB9CiAgICB9LCB0aW1lb3V0SW5Nc0FyZyk7CiAgICBwcm9taXNlQXJnLnRoZW4ocmVzb2x2ZTIsIHJlamVjdCk7CiAgfSk7Cn0sICJ0aW1lb3V0V3JhcCIpOwp2YXIgdGltZW91dEFuZENvbnRpbnVlID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShhc3luYyAocHJvbWlzZUFyZywgdGltZW91dEluTXNBcmcgPSA2ZTQpID0+IHsKICByZXR1cm4gdGltZW91dFdyYXAocHJvbWlzZUFyZywgdGltZW91dEluTXNBcmcsIGZhbHNlKTsKfSwgInRpbWVvdXRBbmRDb250aW51ZSIpOwp2YXIgZ2V0Rmlyc3RUcnVlT3JGYWxzZSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoYXN5bmMgKHByb21pc2VzQXJnKSA9PiB7CiAgY29uc3QgZG9uZSA9IGRlZmVyKCk7CiAgZm9yIChjb25zdCBwcm9taXNlQXJnIG9mIHByb21pc2VzQXJnKSB7CiAgICBwcm9taXNlQXJnLnRoZW4oKHJlc3VsdEFyZykgPT4gewogICAgICBpZiAocmVzdWx0QXJnID09PSB0cnVlKSB7CiAgICAgICAgZG9uZS5yZXNvbHZlKHRydWUpOwogICAgICB9CiAgICB9KTsKICB9CiAgUHJvbWlzZS5hbGwocHJvbWlzZXNBcmcpLnRoZW4oKCkgPT4gewogICAgZG9uZS5yZXNvbHZlKGZhbHNlKTsKICB9KTsKICByZXR1cm4gZG9uZS5wcm9taXNlOwp9LCAiZ2V0Rmlyc3RUcnVlT3JGYWxzZSIpOwp2YXIgZnJvbUNhbGxiYWNrID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoZm4pID0+IHsKICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUyLCByZWplY3QpID0+IHsKICAgIGZuKChlcnIsIHJlc3VsdCkgPT4gewogICAgICBpZiAoZXJyKSB7CiAgICAgICAgcmVqZWN0KGVycik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzb2x2ZTIocmVzdWx0KTsKICAgICAgfQogICAgfSk7CiAgfSk7Cn0sICJmcm9tQ2FsbGJhY2siKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHJ4QDMuMC4xMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRyeC9kaXN0X3RzL3NtYXJ0cngucGx1Z2lucy5yeGpzLmpzCnZhciBzbWFydHJ4X3BsdWdpbnNfcnhqc19leHBvcnRzID0ge307Cl9fZXhwb3J0KHNtYXJ0cnhfcGx1Z2luc19yeGpzX2V4cG9ydHMsIHsKICBPYnNlcnZhYmxlOiAoKSA9PiBPYnNlcnZhYmxlLAogIFJlcGxheVN1YmplY3Q6ICgpID0+IFJlcGxheVN1YmplY3QsCiAgU3ViamVjdDogKCkgPT4gU3ViamVjdCwKICBTdWJzY3JpcHRpb246ICgpID0+IFN1YnNjcmlwdGlvbiwKICBmcm9tOiAoKSA9PiBmcm9tLAogIGZyb21FdmVudDogKCkgPT4gZnJvbUV2ZW50LAogIG9mOiAoKSA9PiBvZiwKICBvcHM6ICgpID0+IG9wcwp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS90c2xpYkAyLjguMS9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2Lm1qcwp2YXIgZXh0ZW5kU3RhdGljcyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oZDQsIGI0KSB7CiAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uKGQ1LCBiNSkgewogICAgZDUuX19wcm90b19fID0gYjU7CiAgfSB8fCBmdW5jdGlvbihkNSwgYjUpIHsKICAgIGZvciAodmFyIHA2IGluIGI1KSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGI1LCBwNikpIGQ1W3A2XSA9IGI1W3A2XTsKICB9OwogIHJldHVybiBleHRlbmRTdGF0aWNzKGQ0LCBiNCk7Cn0sICJleHRlbmRTdGF0aWNzIik7CmZ1bmN0aW9uIF9fZXh0ZW5kcyhkNCwgYjQpIHsKICBpZiAodHlwZW9mIGI0ICE9PSAiZnVuY3Rpb24iICYmIGI0ICE9PSBudWxsKQogICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSAiICsgU3RyaW5nKGI0KSArICIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbCIpOwogIGV4dGVuZFN0YXRpY3MoZDQsIGI0KTsKICBmdW5jdGlvbiBfXygpIHsKICAgIHRoaXMuY29uc3RydWN0b3IgPSBkNDsKICB9CiAgX19uYW1lKF9fLCAiX18iKTsKICBkNC5wcm90b3R5cGUgPSBiNCA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYjQpIDogKF9fLnByb3RvdHlwZSA9IGI0LnByb3RvdHlwZSwgbmV3IF9fKCkpOwp9Cl9fbmFtZShfX2V4dGVuZHMsICJfX2V4dGVuZHMiKTsKdmFyIF9fYXNzaWduID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHsKICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbiBfX2Fzc2lnbjIodDgpIHsKICAgIGZvciAodmFyIHM5LCBpMTAgPSAxLCBuMTEgPSBhcmd1bWVudHMubGVuZ3RoOyBpMTAgPCBuMTE7IGkxMCsrKSB7CiAgICAgIHM5ID0gYXJndW1lbnRzW2kxMF07CiAgICAgIGZvciAodmFyIHA2IGluIHM5KSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHM5LCBwNikpIHQ4W3A2XSA9IHM5W3A2XTsKICAgIH0KICAgIHJldHVybiB0ODsKICB9LCAiX19hc3NpZ24iKTsKICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKfSwgIl9fYXNzaWduIik7CmZ1bmN0aW9uIF9fcmVzdChzOSwgZTEwKSB7CiAgdmFyIHQ4ID0ge307CiAgZm9yICh2YXIgcDYgaW4gczkpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoczksIHA2KSAmJiBlMTAuaW5kZXhPZihwNikgPCAwKQogICAgdDhbcDZdID0gczlbcDZdOwogIGlmIChzOSAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSAiZnVuY3Rpb24iKQogICAgZm9yICh2YXIgaTEwID0gMCwgcDYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHM5KTsgaTEwIDwgcDYubGVuZ3RoOyBpMTArKykgewogICAgICBpZiAoZTEwLmluZGV4T2YocDZbaTEwXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzOSwgcDZbaTEwXSkpCiAgICAgICAgdDhbcDZbaTEwXV0gPSBzOVtwNltpMTBdXTsKICAgIH0KICByZXR1cm4gdDg7Cn0KX19uYW1lKF9fcmVzdCwgIl9fcmVzdCIpOwpmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5MiwgZGVzYykgewogIHZhciBjMTAgPSBhcmd1bWVudHMubGVuZ3RoLCByMTAgPSBjMTAgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5MikgOiBkZXNjLCBkNDsKICBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICJvYmplY3QiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSAiZnVuY3Rpb24iKSByMTAgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5MiwgZGVzYyk7CiAgZWxzZSBmb3IgKHZhciBpMTAgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMCA+PSAwOyBpMTAtLSkgaWYgKGQ0ID0gZGVjb3JhdG9yc1tpMTBdKSByMTAgPSAoYzEwIDwgMyA/IGQ0KHIxMCkgOiBjMTAgPiAzID8gZDQodGFyZ2V0LCBrZXkyLCByMTApIDogZDQodGFyZ2V0LCBrZXkyKSkgfHwgcjEwOwogIHJldHVybiBjMTAgPiAzICYmIHIxMCAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXkyLCByMTApLCByMTA7Cn0KX19uYW1lKF9fZGVjb3JhdGUsICJfX2RlY29yYXRlIik7CmZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKHRhcmdldCwga2V5MikgewogICAgZGVjb3JhdG9yKHRhcmdldCwga2V5MiwgcGFyYW1JbmRleCk7CiAgfTsKfQpfX25hbWUoX19wYXJhbSwgIl9fcGFyYW0iKTsKZnVuY3Rpb24gX19lc0RlY29yYXRlKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY2KSB7CiAgICBpZiAoZjYgIT09IHZvaWQgMCAmJiB0eXBlb2YgZjYgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjY7CiAgfQogIF9fbmFtZShhY2NlcHQsICJhY2NlcHQiKTsKICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzMsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTAgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMCA+PSAwOyBpMTAtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwNiBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A2XSA9IHA2ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A2XTsKICAgIGZvciAodmFyIHA2IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twNl0gPSBjb250ZXh0SW4uYWNjZXNzW3A2XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjYpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmNiB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMF0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzMgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzM7CiAgICAgIGlmIChfMyA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfMzsKICAgICAgaWYgKF8zID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzMpOwogICAgfSBlbHNlIGlmIChfMyA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfMyk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF8zOwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn0KX19uYW1lKF9fZXNEZWNvcmF0ZSwgIl9fZXNEZWNvcmF0ZSIpOwo7CmZ1bmN0aW9uIF9fcnVuSW5pdGlhbGl6ZXJzMih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMCA9IDA7IGkxMCA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMCsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTBdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTBdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfQpfX25hbWUoX19ydW5Jbml0aWFsaXplcnMyLCAiX19ydW5Jbml0aWFsaXplcnMiKTsKOwpmdW5jdGlvbiBfX3Byb3BLZXkoeDMpIHsKICByZXR1cm4gdHlwZW9mIHgzID09PSAic3ltYm9sIiA/IHgzIDogIiIuY29uY2F0KHgzKTsKfQpfX25hbWUoX19wcm9wS2V5LCAiX19wcm9wS2V5Iik7CjsKZnVuY3Rpb24gX19zZXRGdW5jdGlvbk5hbWUoZjYsIG5hbWUsIHByZWZpeCkgewogIGlmICh0eXBlb2YgbmFtZSA9PT0gInN5bWJvbCIpIG5hbWUgPSBuYW1lLmRlc2NyaXB0aW9uID8gIlsiLmNvbmNhdChuYW1lLmRlc2NyaXB0aW9uLCAiXSIpIDogIiI7CiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmNiwgIm5hbWUiLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHByZWZpeCA/ICIiLmNvbmNhdChwcmVmaXgsICIgIiwgbmFtZSkgOiBuYW1lIH0pOwp9Cl9fbmFtZShfX3NldEZ1bmN0aW9uTmFtZSwgIl9fc2V0RnVuY3Rpb25OYW1lIik7CjsKZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkgewogIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gIm9iamVjdCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09ICJmdW5jdGlvbiIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTsKfQpfX25hbWUoX19tZXRhZGF0YSwgIl9fbWV0YWRhdGEiKTsKZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAzLCBnZW5lcmF0b3IpIHsKICBmdW5jdGlvbiBhZG9wdCh2YWx1ZTIpIHsKICAgIHJldHVybiB2YWx1ZTIgaW5zdGFuY2VvZiBQMyA/IHZhbHVlMiA6IG5ldyBQMyhmdW5jdGlvbihyZXNvbHZlMikgewogICAgICByZXNvbHZlMih2YWx1ZTIpOwogICAgfSk7CiAgfQogIF9fbmFtZShhZG9wdCwgImFkb3B0Iik7CiAgcmV0dXJuIG5ldyAoUDMgfHwgKFAzID0gUHJvbWlzZSkpKGZ1bmN0aW9uKHJlc29sdmUyLCByZWplY3QpIHsKICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZTIpIHsKICAgICAgdHJ5IHsKICAgICAgICBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlMikpOwogICAgICB9IGNhdGNoIChlMTApIHsKICAgICAgICByZWplY3QoZTEwKTsKICAgICAgfQogICAgfQogICAgX19uYW1lKGZ1bGZpbGxlZCwgImZ1bGZpbGxlZCIpOwogICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUyKSB7CiAgICAgIHRyeSB7CiAgICAgICAgc3RlcChnZW5lcmF0b3JbInRocm93Il0odmFsdWUyKSk7CiAgICAgIH0gY2F0Y2ggKGUxMCkgewogICAgICAgIHJlamVjdChlMTApOwogICAgICB9CiAgICB9CiAgICBfX25hbWUocmVqZWN0ZWQsICJyZWplY3RlZCIpOwogICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsKICAgICAgcmVzdWx0LmRvbmUgPyByZXNvbHZlMihyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOwogICAgfQogICAgX19uYW1lKHN0ZXAsICJzdGVwIik7CiAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7CiAgfSk7Cn0KX19uYW1lKF9fYXdhaXRlciwgIl9fYXdhaXRlciIpOwpmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5MykgewogIHZhciBfMyA9IHsgbGFiZWw6IDAsIHNlbnQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oKSB7CiAgICBpZiAodDhbMF0gJiAxKSB0aHJvdyB0OFsxXTsKICAgIHJldHVybiB0OFsxXTsKICB9LCAic2VudCIpLCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmNiwgeTMsIHQ4LCBnMyA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBJdGVyYXRvciA9PT0gImZ1bmN0aW9uIiA/IEl0ZXJhdG9yIDogT2JqZWN0KS5wcm90b3R5cGUpOwogIHJldHVybiBnMy5uZXh0ID0gdmVyYigwKSwgZzNbInRocm93Il0gPSB2ZXJiKDEpLCBnM1sicmV0dXJuIl0gPSB2ZXJiKDIpLCB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIChnM1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpczsKICB9KSwgZzM7CiAgZnVuY3Rpb24gdmVyYihuMTEpIHsKICAgIHJldHVybiBmdW5jdGlvbih2NCkgewogICAgICByZXR1cm4gc3RlcChbbjExLCB2NF0pOwogICAgfTsKICB9CiAgX19uYW1lKHZlcmIsICJ2ZXJiIik7CiAgZnVuY3Rpb24gc3RlcChvcCkgewogICAgaWYgKGY2KSB0aHJvdyBuZXcgVHlwZUVycm9yKCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuIik7CiAgICB3aGlsZSAoZzMgJiYgKGczID0gMCwgb3BbMF0gJiYgKF8zID0gMCkpLCBfMykgdHJ5IHsKICAgICAgaWYgKGY2ID0gMSwgeTMgJiYgKHQ4ID0gb3BbMF0gJiAyID8geTNbInJldHVybiJdIDogb3BbMF0gPyB5M1sidGhyb3ciXSB8fCAoKHQ4ID0geTNbInJldHVybiJdKSAmJiB0OC5jYWxsKHkzKSwgMCkgOiB5My5uZXh0KSAmJiAhKHQ4ID0gdDguY2FsbCh5Mywgb3BbMV0pKS5kb25lKSByZXR1cm4gdDg7CiAgICAgIGlmICh5MyA9IDAsIHQ4KSBvcCA9IFtvcFswXSAmIDIsIHQ4LnZhbHVlXTsKICAgICAgc3dpdGNoIChvcFswXSkgewogICAgICAgIGNhc2UgMDoKICAgICAgICBjYXNlIDE6CiAgICAgICAgICB0OCA9IG9wOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA0OgogICAgICAgICAgXzMubGFiZWwrKzsKICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTsKICAgICAgICBjYXNlIDU6CiAgICAgICAgICBfMy5sYWJlbCsrOwogICAgICAgICAgeTMgPSBvcFsxXTsKICAgICAgICAgIG9wID0gWzBdOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgY2FzZSA3OgogICAgICAgICAgb3AgPSBfMy5vcHMucG9wKCk7CiAgICAgICAgICBfMy50cnlzLnBvcCgpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIGlmICghKHQ4ID0gXzMudHJ5cywgdDggPSB0OC5sZW5ndGggPiAwICYmIHQ4W3Q4Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7CiAgICAgICAgICAgIF8zID0gMDsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0OCB8fCBvcFsxXSA+IHQ4WzBdICYmIG9wWzFdIDwgdDhbM10pKSB7CiAgICAgICAgICAgIF8zLmxhYmVsID0gb3BbMV07CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8zLmxhYmVsIDwgdDhbMV0pIHsKICAgICAgICAgICAgXzMubGFiZWwgPSB0OFsxXTsKICAgICAgICAgICAgdDggPSBvcDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodDggJiYgXzMubGFiZWwgPCB0OFsyXSkgewogICAgICAgICAgICBfMy5sYWJlbCA9IHQ4WzJdOwogICAgICAgICAgICBfMy5vcHMucHVzaChvcCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHQ4WzJdKSBfMy5vcHMucG9wKCk7CiAgICAgICAgICBfMy50cnlzLnBvcCgpOwogICAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgb3AgPSBib2R5My5jYWxsKHRoaXNBcmcsIF8zKTsKICAgIH0gY2F0Y2ggKGUxMCkgewogICAgICBvcCA9IFs2LCBlMTBdOwogICAgICB5MyA9IDA7CiAgICB9IGZpbmFsbHkgewogICAgICBmNiA9IHQ4ID0gMDsKICAgIH0KICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOwogICAgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTsKICB9CiAgX19uYW1lKHN0ZXAsICJzdGVwIik7Cn0KX19uYW1lKF9fZ2VuZXJhdG9yLCAiX19nZW5lcmF0b3IiKTsKdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obzEyLCBtNSwgazMsIGsyMikgewogIGlmIChrMjIgPT09IHZvaWQgMCkgazIyID0gazM7CiAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG01LCBrMyk7CiAgaWYgKCFkZXNjIHx8ICgiZ2V0IiBpbiBkZXNjID8gIW01Ll9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkgewogICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gbTVbazNdOwogICAgfSwgImdldCIpIH07CiAgfQogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvMTIsIGsyMiwgZGVzYyk7Cn0pIDogKGZ1bmN0aW9uKG8xMiwgbTUsIGszLCBrMjIpIHsKICBpZiAoazIyID09PSB2b2lkIDApIGsyMiA9IGszOwogIG8xMltrMjJdID0gbTVbazNdOwp9KTsKZnVuY3Rpb24gX19leHBvcnRTdGFyKG01LCBvMTIpIHsKICBmb3IgKHZhciBwNiBpbiBtNSkgaWYgKHA2ICE9PSAiZGVmYXVsdCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvMTIsIHA2KSkgX19jcmVhdGVCaW5kaW5nKG8xMiwgbTUsIHA2KTsKfQpfX25hbWUoX19leHBvcnRTdGFyLCAiX19leHBvcnRTdGFyIik7CmZ1bmN0aW9uIF9fdmFsdWVzKG8xMikgewogIHZhciBzOSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtNSA9IHM5ICYmIG8xMltzOV0sIGkxMCA9IDA7CiAgaWYgKG01KSByZXR1cm4gbTUuY2FsbChvMTIpOwogIGlmIChvMTIgJiYgdHlwZW9mIG8xMi5sZW5ndGggPT09ICJudW1iZXIiKSByZXR1cm4gewogICAgbmV4dDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHsKICAgICAgaWYgKG8xMiAmJiBpMTAgPj0gbzEyLmxlbmd0aCkgbzEyID0gdm9pZCAwOwogICAgICByZXR1cm4geyB2YWx1ZTogbzEyICYmIG8xMltpMTArK10sIGRvbmU6ICFvMTIgfTsKICAgIH0sICJuZXh0IikKICB9OwogIHRocm93IG5ldyBUeXBlRXJyb3IoczkgPyAiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS4iIDogIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC4iKTsKfQpfX25hbWUoX192YWx1ZXMsICJfX3ZhbHVlcyIpOwpmdW5jdGlvbiBfX3JlYWQobzEyLCBuMTEpIHsKICB2YXIgbTUgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIG8xMltTeW1ib2wuaXRlcmF0b3JdOwogIGlmICghbTUpIHJldHVybiBvMTI7CiAgdmFyIGkxMCA9IG01LmNhbGwobzEyKSwgcjEwLCBhciA9IFtdLCBlMTA7CiAgdHJ5IHsKICAgIHdoaWxlICgobjExID09PSB2b2lkIDAgfHwgbjExLS0gPiAwKSAmJiAhKHIxMCA9IGkxMC5uZXh0KCkpLmRvbmUpIGFyLnB1c2gocjEwLnZhbHVlKTsKICB9IGNhdGNoIChlcnJvcikgewogICAgZTEwID0geyBlcnJvciB9OwogIH0gZmluYWxseSB7CiAgICB0cnkgewogICAgICBpZiAocjEwICYmICFyMTAuZG9uZSAmJiAobTUgPSBpMTBbInJldHVybiJdKSkgbTUuY2FsbChpMTApOwogICAgfSBmaW5hbGx5IHsKICAgICAgaWYgKGUxMCkgdGhyb3cgZTEwLmVycm9yOwogICAgfQogIH0KICByZXR1cm4gYXI7Cn0KX19uYW1lKF9fcmVhZCwgIl9fcmVhZCIpOwpmdW5jdGlvbiBfX3NwcmVhZCgpIHsKICBmb3IgKHZhciBhciA9IFtdLCBpMTAgPSAwOyBpMTAgPCBhcmd1bWVudHMubGVuZ3RoOyBpMTArKykKICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaTEwXSkpOwogIHJldHVybiBhcjsKfQpfX25hbWUoX19zcHJlYWQsICJfX3NwcmVhZCIpOwpmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHsKICBmb3IgKHZhciBzOSA9IDAsIGkxMCA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaTEwIDwgaWw7IGkxMCsrKSBzOSArPSBhcmd1bWVudHNbaTEwXS5sZW5ndGg7CiAgZm9yICh2YXIgcjEwID0gQXJyYXkoczkpLCBrMyA9IDAsIGkxMCA9IDA7IGkxMCA8IGlsOyBpMTArKykKICAgIGZvciAodmFyIGE0ID0gYXJndW1lbnRzW2kxMF0sIGozID0gMCwgamwgPSBhNC5sZW5ndGg7IGozIDwgamw7IGozKyssIGszKyspCiAgICAgIHIxMFtrM10gPSBhNFtqM107CiAgcmV0dXJuIHIxMDsKfQpfX25hbWUoX19zcHJlYWRBcnJheXMsICJfX3NwcmVhZEFycmF5cyIpOwpmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tMiwgcGFjaykgewogIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkxMCA9IDAsIGw1ID0gZnJvbTIubGVuZ3RoLCBhcjsgaTEwIDwgbDU7IGkxMCsrKSB7CiAgICBpZiAoYXIgfHwgIShpMTAgaW4gZnJvbTIpKSB7CiAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbTIsIDAsIGkxMCk7CiAgICAgIGFyW2kxMF0gPSBmcm9tMltpMTBdOwogICAgfQogIH0KICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20yKSk7Cn0KX19uYW1lKF9fc3ByZWFkQXJyYXksICJfX3NwcmVhZEFycmF5Iik7CmZ1bmN0aW9uIF9fYXdhaXQodjQpIHsKICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdjQsIHRoaXMpIDogbmV3IF9fYXdhaXQodjQpOwp9Cl9fbmFtZShfX2F3YWl0LCAiX19hd2FpdCIpOwpmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikgewogIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLiIpOwogIHZhciBnMyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaTEwLCBxID0gW107CiAgcmV0dXJuIGkxMCA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBBc3luY0l0ZXJhdG9yID09PSAiZnVuY3Rpb24iID8gQXN5bmNJdGVyYXRvciA6IE9iamVjdCkucHJvdG90eXBlKSwgdmVyYigibmV4dCIpLCB2ZXJiKCJ0aHJvdyIpLCB2ZXJiKCJyZXR1cm4iLCBhd2FpdFJldHVybiksIGkxMFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzOwogIH0sIGkxMDsKICBmdW5jdGlvbiBhd2FpdFJldHVybihmNikgewogICAgcmV0dXJuIGZ1bmN0aW9uKHY0KSB7CiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodjQpLnRoZW4oZjYsIHJlamVjdCk7CiAgICB9OwogIH0KICBfX25hbWUoYXdhaXRSZXR1cm4sICJhd2FpdFJldHVybiIpOwogIGZ1bmN0aW9uIHZlcmIobjExLCBmNikgewogICAgaWYgKGczW24xMV0pIHsKICAgICAgaTEwW24xMV0gPSBmdW5jdGlvbih2NCkgewogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihhNCwgYjQpIHsKICAgICAgICAgIHEucHVzaChbbjExLCB2NCwgYTQsIGI0XSkgPiAxIHx8IHJlc3VtZShuMTEsIHY0KTsKICAgICAgICB9KTsKICAgICAgfTsKICAgICAgaWYgKGY2KSBpMTBbbjExXSA9IGY2KGkxMFtuMTFdKTsKICAgIH0KICB9CiAgX19uYW1lKHZlcmIsICJ2ZXJiIik7CiAgZnVuY3Rpb24gcmVzdW1lKG4xMSwgdjQpIHsKICAgIHRyeSB7CiAgICAgIHN0ZXAoZzNbbjExXSh2NCkpOwogICAgfSBjYXRjaCAoZTEwKSB7CiAgICAgIHNldHRsZShxWzBdWzNdLCBlMTApOwogICAgfQogIH0KICBfX25hbWUocmVzdW1lLCAicmVzdW1lIik7CiAgZnVuY3Rpb24gc3RlcChyMTApIHsKICAgIHIxMC52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUocjEwLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByMTApOwogIH0KICBfX25hbWUoc3RlcCwgInN0ZXAiKTsKICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlMikgewogICAgcmVzdW1lKCJuZXh0IiwgdmFsdWUyKTsKICB9CiAgX19uYW1lKGZ1bGZpbGwsICJmdWxmaWxsIik7CiAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlMikgewogICAgcmVzdW1lKCJ0aHJvdyIsIHZhbHVlMik7CiAgfQogIF9fbmFtZShyZWplY3QsICJyZWplY3QiKTsKICBmdW5jdGlvbiBzZXR0bGUoZjYsIHY0KSB7CiAgICBpZiAoZjYodjQpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7CiAgfQogIF9fbmFtZShzZXR0bGUsICJzZXR0bGUiKTsKfQpfX25hbWUoX19hc3luY0dlbmVyYXRvciwgIl9fYXN5bmNHZW5lcmF0b3IiKTsKZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvMTIpIHsKICB2YXIgaTEwLCBwNjsKICByZXR1cm4gaTEwID0ge30sIHZlcmIoIm5leHQiKSwgdmVyYigidGhyb3ciLCBmdW5jdGlvbihlMTApIHsKICAgIHRocm93IGUxMDsKICB9KSwgdmVyYigicmV0dXJuIiksIGkxMFtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpczsKICB9LCBpMTA7CiAgZnVuY3Rpb24gdmVyYihuMTEsIGY2KSB7CiAgICBpMTBbbjExXSA9IG8xMltuMTFdID8gZnVuY3Rpb24odjQpIHsKICAgICAgcmV0dXJuIChwNiA9ICFwNikgPyB7IHZhbHVlOiBfX2F3YWl0KG8xMltuMTFdKHY0KSksIGRvbmU6IGZhbHNlIH0gOiBmNiA/IGY2KHY0KSA6IHY0OwogICAgfSA6IGY2OwogIH0KICBfX25hbWUodmVyYiwgInZlcmIiKTsKfQpfX25hbWUoX19hc3luY0RlbGVnYXRvciwgIl9fYXN5bmNEZWxlZ2F0b3IiKTsKZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvMTIpIHsKICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC4iKTsKICB2YXIgbTUgPSBvMTJbU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpMTA7CiAgcmV0dXJuIG01ID8gbTUuY2FsbChvMTIpIDogKG8xMiA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gImZ1bmN0aW9uIiA/IF9fdmFsdWVzKG8xMikgOiBvMTJbU3ltYm9sLml0ZXJhdG9yXSgpLCBpMTAgPSB7fSwgdmVyYigibmV4dCIpLCB2ZXJiKCJ0aHJvdyIpLCB2ZXJiKCJyZXR1cm4iKSwgaTEwW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXM7CiAgfSwgaTEwKTsKICBmdW5jdGlvbiB2ZXJiKG4xMSkgewogICAgaTEwW24xMV0gPSBvMTJbbjExXSAmJiBmdW5jdGlvbih2NCkgewogICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZTIsIHJlamVjdCkgewogICAgICAgIHY0ID0gbzEyW24xMV0odjQpLCBzZXR0bGUocmVzb2x2ZTIsIHJlamVjdCwgdjQuZG9uZSwgdjQudmFsdWUpOwogICAgICB9KTsKICAgIH07CiAgfQogIF9fbmFtZSh2ZXJiLCAidmVyYiIpOwogIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlMiwgcmVqZWN0LCBkNCwgdjQpIHsKICAgIFByb21pc2UucmVzb2x2ZSh2NCkudGhlbihmdW5jdGlvbih2NSkgewogICAgICByZXNvbHZlMih7IHZhbHVlOiB2NSwgZG9uZTogZDQgfSk7CiAgICB9LCByZWplY3QpOwogIH0KICBfX25hbWUoc2V0dGxlLCAic2V0dGxlIik7Cn0KX19uYW1lKF9fYXN5bmNWYWx1ZXMsICJfX2FzeW5jVmFsdWVzIik7CmZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3MikgewogIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsICJyYXciLCB7IHZhbHVlOiByYXcyIH0pOwogIH0gZWxzZSB7CiAgICBjb29rZWQucmF3ID0gcmF3MjsKICB9CiAgcmV0dXJuIGNvb2tlZDsKfQpfX25hbWUoX19tYWtlVGVtcGxhdGVPYmplY3QsICJfX21ha2VUZW1wbGF0ZU9iamVjdCIpOwo7CnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8xMiwgdjQpIHsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkobzEyLCAiZGVmYXVsdCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHY0IH0pOwp9KSA6IGZ1bmN0aW9uKG8xMiwgdjQpIHsKICBvMTJbImRlZmF1bHQiXSA9IHY0Owp9Owp2YXIgb3duS2V5cyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24obzEyKSB7CiAgb3duS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uKG8xMykgewogICAgdmFyIGFyID0gW107CiAgICBmb3IgKHZhciBrMyBpbiBvMTMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobzEzLCBrMykpIGFyW2FyLmxlbmd0aF0gPSBrMzsKICAgIHJldHVybiBhcjsKICB9OwogIHJldHVybiBvd25LZXlzKG8xMik7Cn0sICJvd25LZXlzIik7CmZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHsKICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kOwogIHZhciByZXN1bHQgPSB7fTsKICBpZiAobW9kICE9IG51bGwpIHsKICAgIGZvciAodmFyIGszID0gb3duS2V5cyhtb2QpLCBpMTAgPSAwOyBpMTAgPCBrMy5sZW5ndGg7IGkxMCsrKSBpZiAoazNbaTEwXSAhPT0gImRlZmF1bHQiKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGszW2kxMF0pOwogIH0KICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpOwogIHJldHVybiByZXN1bHQ7Cn0KX19uYW1lKF9faW1wb3J0U3RhciwgIl9faW1wb3J0U3RhciIpOwpmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7CiAgcmV0dXJuIG1vZCAmJiBtb2QuX19lc01vZHVsZSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07Cn0KX19uYW1lKF9faW1wb3J0RGVmYXVsdCwgIl9faW1wb3J0RGVmYXVsdCIpOwpmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZjYpIHsKICBpZiAoa2luZCA9PT0gImEiICYmICFmNikgdGhyb3cgbmV3IFR5cGVFcnJvcigiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyIik7CiAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gImZ1bmN0aW9uIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZjYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0Iik7CiAgcmV0dXJuIGtpbmQgPT09ICJtIiA/IGY2IDoga2luZCA9PT0gImEiID8gZjYuY2FsbChyZWNlaXZlcikgOiBmNiA/IGY2LnZhbHVlIDogc3RhdGUuZ2V0KHJlY2VpdmVyKTsKfQpfX25hbWUoX19jbGFzc1ByaXZhdGVGaWVsZEdldCwgIl9fY2xhc3NQcml2YXRlRmllbGRHZXQiKTsKZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlMiwga2luZCwgZjYpIHsKICBpZiAoa2luZCA9PT0gIm0iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGUiKTsKICBpZiAoa2luZCA9PT0gImEiICYmICFmNikgdGhyb3cgbmV3IFR5cGVFcnJvcigiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyIik7CiAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gImZ1bmN0aW9uIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZjYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXQiKTsKICByZXR1cm4ga2luZCA9PT0gImEiID8gZjYuY2FsbChyZWNlaXZlciwgdmFsdWUyKSA6IGY2ID8gZjYudmFsdWUgPSB2YWx1ZTIgOiBzdGF0ZS5zZXQocmVjZWl2ZXIsIHZhbHVlMiksIHZhbHVlMjsKfQpfX25hbWUoX19jbGFzc1ByaXZhdGVGaWVsZFNldCwgIl9fY2xhc3NQcml2YXRlRmllbGRTZXQiKTsKZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEluKHN0YXRlLCByZWNlaXZlcikgewogIGlmIChyZWNlaXZlciA9PT0gbnVsbCB8fCB0eXBlb2YgcmVjZWl2ZXIgIT09ICJvYmplY3QiICYmIHR5cGVvZiByZWNlaXZlciAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IHVzZSAnaW4nIG9wZXJhdG9yIG9uIG5vbi1vYmplY3QiKTsKICByZXR1cm4gdHlwZW9mIHN0YXRlID09PSAiZnVuY3Rpb24iID8gcmVjZWl2ZXIgPT09IHN0YXRlIDogc3RhdGUuaGFzKHJlY2VpdmVyKTsKfQpfX25hbWUoX19jbGFzc1ByaXZhdGVGaWVsZEluLCAiX19jbGFzc1ByaXZhdGVGaWVsZEluIik7CmZ1bmN0aW9uIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudjIsIHZhbHVlMiwgYXN5bmMyKSB7CiAgaWYgKHZhbHVlMiAhPT0gbnVsbCAmJiB2YWx1ZTIgIT09IHZvaWQgMCkgewogICAgaWYgKHR5cGVvZiB2YWx1ZTIgIT09ICJvYmplY3QiICYmIHR5cGVvZiB2YWx1ZTIgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZC4iKTsKICAgIHZhciBkaXNwb3NlLCBpbm5lcjsKICAgIGlmIChhc3luYzIpIHsKICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJTeW1ib2wuYXN5bmNEaXNwb3NlIGlzIG5vdCBkZWZpbmVkLiIpOwogICAgICBkaXNwb3NlID0gdmFsdWUyW1N5bWJvbC5hc3luY0Rpc3Bvc2VdOwogICAgfQogICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkgewogICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJTeW1ib2wuZGlzcG9zZSBpcyBub3QgZGVmaW5lZC4iKTsKICAgICAgZGlzcG9zZSA9IHZhbHVlMltTeW1ib2wuZGlzcG9zZV07CiAgICAgIGlmIChhc3luYzIpIGlubmVyID0gZGlzcG9zZTsKICAgIH0KICAgIGlmICh0eXBlb2YgZGlzcG9zZSAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IG5vdCBkaXNwb3NhYmxlLiIpOwogICAgaWYgKGlubmVyKSBkaXNwb3NlID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHsKICAgICAgdHJ5IHsKICAgICAgICBpbm5lci5jYWxsKHRoaXMpOwogICAgICB9IGNhdGNoIChlMTApIHsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZTEwKTsKICAgICAgfQogICAgfSwgImRpc3Bvc2UiKTsKICAgIGVudjIuc3RhY2sucHVzaCh7IHZhbHVlOiB2YWx1ZTIsIGRpc3Bvc2UsIGFzeW5jOiBhc3luYzIgfSk7CiAgfSBlbHNlIGlmIChhc3luYzIpIHsKICAgIGVudjIuc3RhY2sucHVzaCh7IGFzeW5jOiB0cnVlIH0pOwogIH0KICByZXR1cm4gdmFsdWUyOwp9Cl9fbmFtZShfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSwgIl9fYWRkRGlzcG9zYWJsZVJlc291cmNlIik7CnZhciBfU3VwcHJlc3NlZEVycm9yID0gdHlwZW9mIFN1cHByZXNzZWRFcnJvciA9PT0gImZ1bmN0aW9uIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uKGVycm9yLCBzdXBwcmVzc2VkLCBtZXNzYWdlMikgewogIHZhciBlMTAgPSBuZXcgRXJyb3IobWVzc2FnZTIpOwogIHJldHVybiBlMTAubmFtZSA9ICJTdXBwcmVzc2VkRXJyb3IiLCBlMTAuZXJyb3IgPSBlcnJvciwgZTEwLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlMTA7Cn07CmZ1bmN0aW9uIF9fZGlzcG9zZVJlc291cmNlcyhlbnYyKSB7CiAgZnVuY3Rpb24gZmFpbChlMTApIHsKICAgIGVudjIuZXJyb3IgPSBlbnYyLmhhc0Vycm9yID8gbmV3IF9TdXBwcmVzc2VkRXJyb3IoZTEwLCBlbnYyLmVycm9yLCAiQW4gZXJyb3Igd2FzIHN1cHByZXNzZWQgZHVyaW5nIGRpc3Bvc2FsLiIpIDogZTEwOwogICAgZW52Mi5oYXNFcnJvciA9IHRydWU7CiAgfQogIF9fbmFtZShmYWlsLCAiZmFpbCIpOwogIHZhciByMTAsIHM5ID0gMDsKICBmdW5jdGlvbiBuZXh0MigpIHsKICAgIHdoaWxlIChyMTAgPSBlbnYyLnN0YWNrLnBvcCgpKSB7CiAgICAgIHRyeSB7CiAgICAgICAgaWYgKCFyMTAuYXN5bmMgJiYgczkgPT09IDEpIHJldHVybiBzOSA9IDAsIGVudjIuc3RhY2sucHVzaChyMTApLCBQcm9taXNlLnJlc29sdmUoKS50aGVuKG5leHQyKTsKICAgICAgICBpZiAocjEwLmRpc3Bvc2UpIHsKICAgICAgICAgIHZhciByZXN1bHQgPSByMTAuZGlzcG9zZS5jYWxsKHIxMC52YWx1ZSk7CiAgICAgICAgICBpZiAocjEwLmFzeW5jKSByZXR1cm4gczkgfD0gMiwgUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihuZXh0MiwgZnVuY3Rpb24oZTEwKSB7CiAgICAgICAgICAgIGZhaWwoZTEwKTsKICAgICAgICAgICAgcmV0dXJuIG5leHQyKCk7CiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgczkgfD0gMTsKICAgICAgfSBjYXRjaCAoZTEwKSB7CiAgICAgICAgZmFpbChlMTApOwogICAgICB9CiAgICB9CiAgICBpZiAoczkgPT09IDEpIHJldHVybiBlbnYyLmhhc0Vycm9yID8gUHJvbWlzZS5yZWplY3QoZW52Mi5lcnJvcikgOiBQcm9taXNlLnJlc29sdmUoKTsKICAgIGlmIChlbnYyLmhhc0Vycm9yKSB0aHJvdyBlbnYyLmVycm9yOwogIH0KICBfX25hbWUobmV4dDIsICJuZXh0Iik7CiAgcmV0dXJuIG5leHQyKCk7Cn0KX19uYW1lKF9fZGlzcG9zZVJlc291cmNlcywgIl9fZGlzcG9zZVJlc291cmNlcyIpOwpmdW5jdGlvbiBfX3Jld3JpdGVSZWxhdGl2ZUltcG9ydEV4dGVuc2lvbihwYXRoMiwgcHJlc2VydmVKc3gpIHsKICBpZiAodHlwZW9mIHBhdGgyID09PSAic3RyaW5nIiAmJiAvXlwuXC4/XC8vLnRlc3QocGF0aDIpKSB7CiAgICByZXR1cm4gcGF0aDIucmVwbGFjZSgvXC4odHN4KSR8KCg/OlwuZCk/KSgoPzpcLlteLi9dKz8pPylcLihbY21dPyl0cyQvaSwgZnVuY3Rpb24obTUsIHRzeCwgZDQsIGV4dCwgY20pIHsKICAgICAgcmV0dXJuIHRzeCA/IHByZXNlcnZlSnN4ID8gIi5qc3giIDogIi5qcyIgOiBkNCAmJiAoIWV4dCB8fCAhY20pID8gbTUgOiBkNCArIGV4dCArICIuIiArIGNtLnRvTG93ZXJDYXNlKCkgKyAianMiOwogICAgfSk7CiAgfQogIHJldHVybiBwYXRoMjsKfQpfX25hbWUoX19yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb24sICJfX3Jld3JpdGVSZWxhdGl2ZUltcG9ydEV4dGVuc2lvbiIpOwp2YXIgdHNsaWJfZXM2X2RlZmF1bHQgPSB7CiAgX19leHRlbmRzLAogIF9fYXNzaWduLAogIF9fcmVzdCwKICBfX2RlY29yYXRlLAogIF9fcGFyYW0sCiAgX19lc0RlY29yYXRlLAogIF9fcnVuSW5pdGlhbGl6ZXJzOiBfX3J1bkluaXRpYWxpemVyczIsCiAgX19wcm9wS2V5LAogIF9fc2V0RnVuY3Rpb25OYW1lLAogIF9fbWV0YWRhdGEsCiAgX19hd2FpdGVyLAogIF9fZ2VuZXJhdG9yLAogIF9fY3JlYXRlQmluZGluZywKICBfX2V4cG9ydFN0YXIsCiAgX192YWx1ZXMsCiAgX19yZWFkLAogIF9fc3ByZWFkLAogIF9fc3ByZWFkQXJyYXlzLAogIF9fc3ByZWFkQXJyYXksCiAgX19hd2FpdCwKICBfX2FzeW5jR2VuZXJhdG9yLAogIF9fYXN5bmNEZWxlZ2F0b3IsCiAgX19hc3luY1ZhbHVlcywKICBfX21ha2VUZW1wbGF0ZU9iamVjdCwKICBfX2ltcG9ydFN0YXIsCiAgX19pbXBvcnREZWZhdWx0LAogIF9fY2xhc3NQcml2YXRlRmllbGRHZXQsCiAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCwKICBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4sCiAgX19hZGREaXNwb3NhYmxlUmVzb3VyY2UsCiAgX19kaXNwb3NlUmVzb3VyY2VzLAogIF9fcmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9uCn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9pc0Z1bmN0aW9uLmpzCmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUyKSB7CiAgcmV0dXJuIHR5cGVvZiB2YWx1ZTIgPT09ICJmdW5jdGlvbiI7Cn0KX19uYW1lKGlzRnVuY3Rpb24sICJpc0Z1bmN0aW9uIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9jcmVhdGVFcnJvckNsYXNzLmpzCmZ1bmN0aW9uIGNyZWF0ZUVycm9yQ2xhc3MoY3JlYXRlSW1wbCkgewogIHZhciBfc3VwZXIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGluc3RhbmNlKSB7CiAgICBFcnJvci5jYWxsKGluc3RhbmNlKTsKICAgIGluc3RhbmNlLnN0YWNrID0gbmV3IEVycm9yKCkuc3RhY2s7CiAgfSwgIl9zdXBlciIpOwogIHZhciBjdG9yRnVuYyA9IGNyZWF0ZUltcGwoX3N1cGVyKTsKICBjdG9yRnVuYy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7CiAgY3RvckZ1bmMucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvckZ1bmM7CiAgcmV0dXJuIGN0b3JGdW5jOwp9Cl9fbmFtZShjcmVhdGVFcnJvckNsYXNzLCAiY3JlYXRlRXJyb3JDbGFzcyIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvVW5zdWJzY3JpcHRpb25FcnJvci5qcwp2YXIgVW5zdWJzY3JpcHRpb25FcnJvciA9IGNyZWF0ZUVycm9yQ2xhc3MoZnVuY3Rpb24oX3N1cGVyKSB7CiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gVW5zdWJzY3JpcHRpb25FcnJvckltcGwoZXJyb3JzKSB7CiAgICBfc3VwZXIodGhpcyk7CiAgICB0aGlzLm1lc3NhZ2UgPSBlcnJvcnMgPyBlcnJvcnMubGVuZ3RoICsgIiBlcnJvcnMgb2NjdXJyZWQgZHVyaW5nIHVuc3Vic2NyaXB0aW9uOlxuIiArIGVycm9ycy5tYXAoZnVuY3Rpb24oZXJyLCBpMTApIHsKICAgICAgcmV0dXJuIGkxMCArIDEgKyAiKSAiICsgZXJyLnRvU3RyaW5nKCk7CiAgICB9KS5qb2luKCJcbiAgIikgOiAiIjsKICAgIHRoaXMubmFtZSA9ICJVbnN1YnNjcmlwdGlvbkVycm9yIjsKICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzOwogIH0sICJVbnN1YnNjcmlwdGlvbkVycm9ySW1wbCIpOwp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2FyclJlbW92ZS5qcwpmdW5jdGlvbiBhcnJSZW1vdmUoYXJyLCBpdGVtKSB7CiAgaWYgKGFycikgewogICAgdmFyIGluZGV4MiA9IGFyci5pbmRleE9mKGl0ZW0pOwogICAgMCA8PSBpbmRleDIgJiYgYXJyLnNwbGljZShpbmRleDIsIDEpOwogIH0KfQpfX25hbWUoYXJyUmVtb3ZlLCAiYXJyUmVtb3ZlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvU3Vic2NyaXB0aW9uLmpzCnZhciBTdWJzY3JpcHRpb24gPSAoZnVuY3Rpb24oKSB7CiAgZnVuY3Rpb24gU3Vic2NyaXB0aW9uMihpbml0aWFsVGVhcmRvd24pIHsKICAgIHRoaXMuaW5pdGlhbFRlYXJkb3duID0gaW5pdGlhbFRlYXJkb3duOwogICAgdGhpcy5jbG9zZWQgPSBmYWxzZTsKICAgIHRoaXMuX3BhcmVudGFnZSA9IG51bGw7CiAgICB0aGlzLl9maW5hbGl6ZXJzID0gbnVsbDsKICB9CiAgX19uYW1lKFN1YnNjcmlwdGlvbjIsICJTdWJzY3JpcHRpb24iKTsKICBTdWJzY3JpcHRpb24yLnByb3RvdHlwZS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGVfMSwgX2EyLCBlXzIsIF9iOwogICAgdmFyIGVycm9yczsKICAgIGlmICghdGhpcy5jbG9zZWQpIHsKICAgICAgdGhpcy5jbG9zZWQgPSB0cnVlOwogICAgICB2YXIgX3BhcmVudGFnZSA9IHRoaXMuX3BhcmVudGFnZTsKICAgICAgaWYgKF9wYXJlbnRhZ2UpIHsKICAgICAgICB0aGlzLl9wYXJlbnRhZ2UgPSBudWxsOwogICAgICAgIGlmIChBcnJheS5pc0FycmF5KF9wYXJlbnRhZ2UpKSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBmb3IgKHZhciBfcGFyZW50YWdlXzEgPSBfX3ZhbHVlcyhfcGFyZW50YWdlKSwgX3BhcmVudGFnZV8xXzEgPSBfcGFyZW50YWdlXzEubmV4dCgpOyAhX3BhcmVudGFnZV8xXzEuZG9uZTsgX3BhcmVudGFnZV8xXzEgPSBfcGFyZW50YWdlXzEubmV4dCgpKSB7CiAgICAgICAgICAgICAgdmFyIHBhcmVudF8xID0gX3BhcmVudGFnZV8xXzEudmFsdWU7CiAgICAgICAgICAgICAgcGFyZW50XzEucmVtb3ZlKHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGNhdGNoIChlXzFfMSkgewogICAgICAgICAgICBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OwogICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBpZiAoX3BhcmVudGFnZV8xXzEgJiYgIV9wYXJlbnRhZ2VfMV8xLmRvbmUgJiYgKF9hMiA9IF9wYXJlbnRhZ2VfMS5yZXR1cm4pKSBfYTIuY2FsbChfcGFyZW50YWdlXzEpOwogICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgIGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBfcGFyZW50YWdlLnJlbW92ZSh0aGlzKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFyIGluaXRpYWxGaW5hbGl6ZXIgPSB0aGlzLmluaXRpYWxUZWFyZG93bjsKICAgICAgaWYgKGlzRnVuY3Rpb24oaW5pdGlhbEZpbmFsaXplcikpIHsKICAgICAgICB0cnkgewogICAgICAgICAgaW5pdGlhbEZpbmFsaXplcigpOwogICAgICAgIH0gY2F0Y2ggKGUxMCkgewogICAgICAgICAgZXJyb3JzID0gZTEwIGluc3RhbmNlb2YgVW5zdWJzY3JpcHRpb25FcnJvciA/IGUxMC5lcnJvcnMgOiBbZTEwXTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFyIF9maW5hbGl6ZXJzID0gdGhpcy5fZmluYWxpemVyczsKICAgICAgaWYgKF9maW5hbGl6ZXJzKSB7CiAgICAgICAgdGhpcy5fZmluYWxpemVycyA9IG51bGw7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGZvciAodmFyIF9maW5hbGl6ZXJzXzEgPSBfX3ZhbHVlcyhfZmluYWxpemVycyksIF9maW5hbGl6ZXJzXzFfMSA9IF9maW5hbGl6ZXJzXzEubmV4dCgpOyAhX2ZpbmFsaXplcnNfMV8xLmRvbmU7IF9maW5hbGl6ZXJzXzFfMSA9IF9maW5hbGl6ZXJzXzEubmV4dCgpKSB7CiAgICAgICAgICAgIHZhciBmaW5hbGl6ZXIgPSBfZmluYWxpemVyc18xXzEudmFsdWU7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgZXhlY0ZpbmFsaXplcihmaW5hbGl6ZXIpOwogICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMgIT09IG51bGwgJiYgZXJyb3JzICE9PSB2b2lkIDAgPyBlcnJvcnMgOiBbXTsKICAgICAgICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgVW5zdWJzY3JpcHRpb25FcnJvcikgewogICAgICAgICAgICAgICAgZXJyb3JzID0gX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoZXJyb3JzKSksIF9fcmVhZChlcnIuZXJyb3JzKSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGVycik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoZV8yXzEpIHsKICAgICAgICAgIGVfMiA9IHsgZXJyb3I6IGVfMl8xIH07CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmIChfZmluYWxpemVyc18xXzEgJiYgIV9maW5hbGl6ZXJzXzFfMS5kb25lICYmIChfYiA9IF9maW5hbGl6ZXJzXzEucmV0dXJuKSkgX2IuY2FsbChfZmluYWxpemVyc18xKTsKICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgIGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGVycm9ycykgewogICAgICAgIHRocm93IG5ldyBVbnN1YnNjcmlwdGlvbkVycm9yKGVycm9ycyk7CiAgICAgIH0KICAgIH0KICB9OwogIFN1YnNjcmlwdGlvbjIucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKHRlYXJkb3duKSB7CiAgICB2YXIgX2EyOwogICAgaWYgKHRlYXJkb3duICYmIHRlYXJkb3duICE9PSB0aGlzKSB7CiAgICAgIGlmICh0aGlzLmNsb3NlZCkgewogICAgICAgIGV4ZWNGaW5hbGl6ZXIodGVhcmRvd24pOwogICAgICB9IGVsc2UgewogICAgICAgIGlmICh0ZWFyZG93biBpbnN0YW5jZW9mIFN1YnNjcmlwdGlvbjIpIHsKICAgICAgICAgIGlmICh0ZWFyZG93bi5jbG9zZWQgfHwgdGVhcmRvd24uX2hhc1BhcmVudCh0aGlzKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICB0ZWFyZG93bi5fYWRkUGFyZW50KHRoaXMpOwogICAgICAgIH0KICAgICAgICAodGhpcy5fZmluYWxpemVycyA9IChfYTIgPSB0aGlzLl9maW5hbGl6ZXJzKSAhPT0gbnVsbCAmJiBfYTIgIT09IHZvaWQgMCA/IF9hMiA6IFtdKS5wdXNoKHRlYXJkb3duKTsKICAgICAgfQogICAgfQogIH07CiAgU3Vic2NyaXB0aW9uMi5wcm90b3R5cGUuX2hhc1BhcmVudCA9IGZ1bmN0aW9uKHBhcmVudCkgewogICAgdmFyIF9wYXJlbnRhZ2UgPSB0aGlzLl9wYXJlbnRhZ2U7CiAgICByZXR1cm4gX3BhcmVudGFnZSA9PT0gcGFyZW50IHx8IEFycmF5LmlzQXJyYXkoX3BhcmVudGFnZSkgJiYgX3BhcmVudGFnZS5pbmNsdWRlcyhwYXJlbnQpOwogIH07CiAgU3Vic2NyaXB0aW9uMi5wcm90b3R5cGUuX2FkZFBhcmVudCA9IGZ1bmN0aW9uKHBhcmVudCkgewogICAgdmFyIF9wYXJlbnRhZ2UgPSB0aGlzLl9wYXJlbnRhZ2U7CiAgICB0aGlzLl9wYXJlbnRhZ2UgPSBBcnJheS5pc0FycmF5KF9wYXJlbnRhZ2UpID8gKF9wYXJlbnRhZ2UucHVzaChwYXJlbnQpLCBfcGFyZW50YWdlKSA6IF9wYXJlbnRhZ2UgPyBbX3BhcmVudGFnZSwgcGFyZW50XSA6IHBhcmVudDsKICB9OwogIFN1YnNjcmlwdGlvbjIucHJvdG90eXBlLl9yZW1vdmVQYXJlbnQgPSBmdW5jdGlvbihwYXJlbnQpIHsKICAgIHZhciBfcGFyZW50YWdlID0gdGhpcy5fcGFyZW50YWdlOwogICAgaWYgKF9wYXJlbnRhZ2UgPT09IHBhcmVudCkgewogICAgICB0aGlzLl9wYXJlbnRhZ2UgPSBudWxsOwogICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KF9wYXJlbnRhZ2UpKSB7CiAgICAgIGFyclJlbW92ZShfcGFyZW50YWdlLCBwYXJlbnQpOwogICAgfQogIH07CiAgU3Vic2NyaXB0aW9uMi5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24odGVhcmRvd24pIHsKICAgIHZhciBfZmluYWxpemVycyA9IHRoaXMuX2ZpbmFsaXplcnM7CiAgICBfZmluYWxpemVycyAmJiBhcnJSZW1vdmUoX2ZpbmFsaXplcnMsIHRlYXJkb3duKTsKICAgIGlmICh0ZWFyZG93biBpbnN0YW5jZW9mIFN1YnNjcmlwdGlvbjIpIHsKICAgICAgdGVhcmRvd24uX3JlbW92ZVBhcmVudCh0aGlzKTsKICAgIH0KICB9OwogIFN1YnNjcmlwdGlvbjIuRU1QVFkgPSAoZnVuY3Rpb24oKSB7CiAgICB2YXIgZW1wdHk0ID0gbmV3IFN1YnNjcmlwdGlvbjIoKTsKICAgIGVtcHR5NC5jbG9zZWQgPSB0cnVlOwogICAgcmV0dXJuIGVtcHR5NDsKICB9KSgpOwogIHJldHVybiBTdWJzY3JpcHRpb24yOwp9KSgpOwp2YXIgRU1QVFlfU1VCU0NSSVBUSU9OID0gU3Vic2NyaXB0aW9uLkVNUFRZOwpmdW5jdGlvbiBpc1N1YnNjcmlwdGlvbih2YWx1ZTIpIHsKICByZXR1cm4gdmFsdWUyIGluc3RhbmNlb2YgU3Vic2NyaXB0aW9uIHx8IHZhbHVlMiAmJiAiY2xvc2VkIiBpbiB2YWx1ZTIgJiYgaXNGdW5jdGlvbih2YWx1ZTIucmVtb3ZlKSAmJiBpc0Z1bmN0aW9uKHZhbHVlMi5hZGQpICYmIGlzRnVuY3Rpb24odmFsdWUyLnVuc3Vic2NyaWJlKTsKfQpfX25hbWUoaXNTdWJzY3JpcHRpb24sICJpc1N1YnNjcmlwdGlvbiIpOwpmdW5jdGlvbiBleGVjRmluYWxpemVyKGZpbmFsaXplcikgewogIGlmIChpc0Z1bmN0aW9uKGZpbmFsaXplcikpIHsKICAgIGZpbmFsaXplcigpOwogIH0gZWxzZSB7CiAgICBmaW5hbGl6ZXIudW5zdWJzY3JpYmUoKTsKICB9Cn0KX19uYW1lKGV4ZWNGaW5hbGl6ZXIsICJleGVjRmluYWxpemVyIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvY29uZmlnLmpzCnZhciBjb25maWcgPSB7CiAgb25VbmhhbmRsZWRFcnJvcjogbnVsbCwKICBvblN0b3BwZWROb3RpZmljYXRpb246IG51bGwsCiAgUHJvbWlzZTogdm9pZCAwLAogIHVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmc6IGZhbHNlLAogIHVzZURlcHJlY2F0ZWROZXh0Q29udGV4dDogZmFsc2UKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvdGltZW91dFByb3ZpZGVyLmpzCnZhciB0aW1lb3V0UHJvdmlkZXIgPSB7CiAgc2V0VGltZW91dDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihoYW5kbGVyMiwgdGltZW91dDIpIHsKICAgIHZhciBhcmdzID0gW107CiAgICBmb3IgKHZhciBfaSA9IDI7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykgewogICAgICBhcmdzW19pIC0gMl0gPSBhcmd1bWVudHNbX2ldOwogICAgfQogICAgdmFyIGRlbGVnYXRlID0gdGltZW91dFByb3ZpZGVyLmRlbGVnYXRlOwogICAgaWYgKGRlbGVnYXRlID09PSBudWxsIHx8IGRlbGVnYXRlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkZWxlZ2F0ZS5zZXRUaW1lb3V0KSB7CiAgICAgIHJldHVybiBkZWxlZ2F0ZS5zZXRUaW1lb3V0LmFwcGx5KGRlbGVnYXRlLCBfX3NwcmVhZEFycmF5KFtoYW5kbGVyMiwgdGltZW91dDJdLCBfX3JlYWQoYXJncykpKTsKICAgIH0KICAgIHJldHVybiBzZXRUaW1lb3V0LmFwcGx5KHZvaWQgMCwgX19zcHJlYWRBcnJheShbaGFuZGxlcjIsIHRpbWVvdXQyXSwgX19yZWFkKGFyZ3MpKSk7CiAgfSwgInNldFRpbWVvdXQiKSwKICBjbGVhclRpbWVvdXQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oaGFuZGxlMykgewogICAgdmFyIGRlbGVnYXRlID0gdGltZW91dFByb3ZpZGVyLmRlbGVnYXRlOwogICAgcmV0dXJuICgoZGVsZWdhdGUgPT09IG51bGwgfHwgZGVsZWdhdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRlbGVnYXRlLmNsZWFyVGltZW91dCkgfHwgY2xlYXJUaW1lb3V0KShoYW5kbGUzKTsKICB9LCAiY2xlYXJUaW1lb3V0IiksCiAgZGVsZWdhdGU6IHZvaWQgMAp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvcmVwb3J0VW5oYW5kbGVkRXJyb3IuanMKZnVuY3Rpb24gcmVwb3J0VW5oYW5kbGVkRXJyb3IoZXJyKSB7CiAgdGltZW91dFByb3ZpZGVyLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICB2YXIgb25VbmhhbmRsZWRFcnJvciA9IGNvbmZpZy5vblVuaGFuZGxlZEVycm9yOwogICAgaWYgKG9uVW5oYW5kbGVkRXJyb3IpIHsKICAgICAgb25VbmhhbmRsZWRFcnJvcihlcnIpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgZXJyOwogICAgfQogIH0pOwp9Cl9fbmFtZShyZXBvcnRVbmhhbmRsZWRFcnJvciwgInJlcG9ydFVuaGFuZGxlZEVycm9yIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9ub29wLmpzCmZ1bmN0aW9uIG5vb3AoKSB7Cn0KX19uYW1lKG5vb3AsICJub29wIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvTm90aWZpY2F0aW9uRmFjdG9yaWVzLmpzCnZhciBDT01QTEVURV9OT1RJRklDQVRJT04gPSAoZnVuY3Rpb24oKSB7CiAgcmV0dXJuIGNyZWF0ZU5vdGlmaWNhdGlvbigiQyIsIHZvaWQgMCwgdm9pZCAwKTsKfSkoKTsKZnVuY3Rpb24gZXJyb3JOb3RpZmljYXRpb24oZXJyb3IpIHsKICByZXR1cm4gY3JlYXRlTm90aWZpY2F0aW9uKCJFIiwgdm9pZCAwLCBlcnJvcik7Cn0KX19uYW1lKGVycm9yTm90aWZpY2F0aW9uLCAiZXJyb3JOb3RpZmljYXRpb24iKTsKZnVuY3Rpb24gbmV4dE5vdGlmaWNhdGlvbih2YWx1ZTIpIHsKICByZXR1cm4gY3JlYXRlTm90aWZpY2F0aW9uKCJOIiwgdmFsdWUyLCB2b2lkIDApOwp9Cl9fbmFtZShuZXh0Tm90aWZpY2F0aW9uLCAibmV4dE5vdGlmaWNhdGlvbiIpOwpmdW5jdGlvbiBjcmVhdGVOb3RpZmljYXRpb24oa2luZCwgdmFsdWUyLCBlcnJvcikgewogIHJldHVybiB7CiAgICBraW5kLAogICAgdmFsdWU6IHZhbHVlMiwKICAgIGVycm9yCiAgfTsKfQpfX25hbWUoY3JlYXRlTm90aWZpY2F0aW9uLCAiY3JlYXRlTm90aWZpY2F0aW9uIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9lcnJvckNvbnRleHQuanMKdmFyIGNvbnRleHQgPSBudWxsOwpmdW5jdGlvbiBlcnJvckNvbnRleHQoY2IpIHsKICBpZiAoY29uZmlnLnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcpIHsKICAgIHZhciBpc1Jvb3QgPSAhY29udGV4dDsKICAgIGlmIChpc1Jvb3QpIHsKICAgICAgY29udGV4dCA9IHsgZXJyb3JUaHJvd246IGZhbHNlLCBlcnJvcjogbnVsbCB9OwogICAgfQogICAgY2IoKTsKICAgIGlmIChpc1Jvb3QpIHsKICAgICAgdmFyIF9hMiA9IGNvbnRleHQsIGVycm9yVGhyb3duID0gX2EyLmVycm9yVGhyb3duLCBlcnJvciA9IF9hMi5lcnJvcjsKICAgICAgY29udGV4dCA9IG51bGw7CiAgICAgIGlmIChlcnJvclRocm93bikgewogICAgICAgIHRocm93IGVycm9yOwogICAgICB9CiAgICB9CiAgfSBlbHNlIHsKICAgIGNiKCk7CiAgfQp9Cl9fbmFtZShlcnJvckNvbnRleHQsICJlcnJvckNvbnRleHQiKTsKZnVuY3Rpb24gY2FwdHVyZUVycm9yKGVycikgewogIGlmIChjb25maWcudXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZyAmJiBjb250ZXh0KSB7CiAgICBjb250ZXh0LmVycm9yVGhyb3duID0gdHJ1ZTsKICAgIGNvbnRleHQuZXJyb3IgPSBlcnI7CiAgfQp9Cl9fbmFtZShjYXB0dXJlRXJyb3IsICJjYXB0dXJlRXJyb3IiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9TdWJzY3JpYmVyLmpzCnZhciBTdWJzY3JpYmVyID0gKGZ1bmN0aW9uKF9zdXBlcikgewogIF9fZXh0ZW5kcyhTdWJzY3JpYmVyMiwgX3N1cGVyKTsKICBmdW5jdGlvbiBTdWJzY3JpYmVyMihkZXN0aW5hdGlvbikgewogICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpczsKICAgIF90aGlzLmlzU3RvcHBlZCA9IGZhbHNlOwogICAgaWYgKGRlc3RpbmF0aW9uKSB7CiAgICAgIF90aGlzLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb247CiAgICAgIGlmIChpc1N1YnNjcmlwdGlvbihkZXN0aW5hdGlvbikpIHsKICAgICAgICBkZXN0aW5hdGlvbi5hZGQoX3RoaXMpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBfdGhpcy5kZXN0aW5hdGlvbiA9IEVNUFRZX09CU0VSVkVSOwogICAgfQogICAgcmV0dXJuIF90aGlzOwogIH0KICBfX25hbWUoU3Vic2NyaWJlcjIsICJTdWJzY3JpYmVyIik7CiAgU3Vic2NyaWJlcjIuY3JlYXRlID0gZnVuY3Rpb24obmV4dDIsIGVycm9yLCBjb21wbGV0ZSkgewogICAgcmV0dXJuIG5ldyBTYWZlU3Vic2NyaWJlcihuZXh0MiwgZXJyb3IsIGNvbXBsZXRlKTsKICB9OwogIFN1YnNjcmliZXIyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24odmFsdWUyKSB7CiAgICBpZiAodGhpcy5pc1N0b3BwZWQpIHsKICAgICAgaGFuZGxlU3RvcHBlZE5vdGlmaWNhdGlvbihuZXh0Tm90aWZpY2F0aW9uKHZhbHVlMiksIHRoaXMpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5fbmV4dCh2YWx1ZTIpOwogICAgfQogIH07CiAgU3Vic2NyaWJlcjIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24oZXJyKSB7CiAgICBpZiAodGhpcy5pc1N0b3BwZWQpIHsKICAgICAgaGFuZGxlU3RvcHBlZE5vdGlmaWNhdGlvbihlcnJvck5vdGlmaWNhdGlvbihlcnIpLCB0aGlzKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTsKICAgICAgdGhpcy5fZXJyb3IoZXJyKTsKICAgIH0KICB9OwogIFN1YnNjcmliZXIyLnByb3RvdHlwZS5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMuaXNTdG9wcGVkKSB7CiAgICAgIGhhbmRsZVN0b3BwZWROb3RpZmljYXRpb24oQ09NUExFVEVfTk9USUZJQ0FUSU9OLCB0aGlzKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTsKICAgICAgdGhpcy5fY29tcGxldGUoKTsKICAgIH0KICB9OwogIFN1YnNjcmliZXIyLnByb3RvdHlwZS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKCkgewogICAgaWYgKCF0aGlzLmNsb3NlZCkgewogICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7CiAgICAgIF9zdXBlci5wcm90b3R5cGUudW5zdWJzY3JpYmUuY2FsbCh0aGlzKTsKICAgICAgdGhpcy5kZXN0aW5hdGlvbiA9IG51bGw7CiAgICB9CiAgfTsKICBTdWJzY3JpYmVyMi5wcm90b3R5cGUuX25leHQgPSBmdW5jdGlvbih2YWx1ZTIpIHsKICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dCh2YWx1ZTIpOwogIH07CiAgU3Vic2NyaWJlcjIucHJvdG90eXBlLl9lcnJvciA9IGZ1bmN0aW9uKGVycikgewogICAgdHJ5IHsKICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpOwogICAgfSBmaW5hbGx5IHsKICAgICAgdGhpcy51bnN1YnNjcmliZSgpOwogICAgfQogIH07CiAgU3Vic2NyaWJlcjIucHJvdG90eXBlLl9jb21wbGV0ZSA9IGZ1bmN0aW9uKCkgewogICAgdHJ5IHsKICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgfSBmaW5hbGx5IHsKICAgICAgdGhpcy51bnN1YnNjcmliZSgpOwogICAgfQogIH07CiAgcmV0dXJuIFN1YnNjcmliZXIyOwp9KShTdWJzY3JpcHRpb24pOwp2YXIgX2JpbmQgPSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZDsKZnVuY3Rpb24gYmluZChmbiwgdGhpc0FyZykgewogIHJldHVybiBfYmluZC5jYWxsKGZuLCB0aGlzQXJnKTsKfQpfX25hbWUoYmluZCwgImJpbmQiKTsKdmFyIENvbnN1bWVyT2JzZXJ2ZXIgPSAoZnVuY3Rpb24oKSB7CiAgZnVuY3Rpb24gQ29uc3VtZXJPYnNlcnZlcjIocGFydGlhbE9ic2VydmVyKSB7CiAgICB0aGlzLnBhcnRpYWxPYnNlcnZlciA9IHBhcnRpYWxPYnNlcnZlcjsKICB9CiAgX19uYW1lKENvbnN1bWVyT2JzZXJ2ZXIyLCAiQ29uc3VtZXJPYnNlcnZlciIpOwogIENvbnN1bWVyT2JzZXJ2ZXIyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24odmFsdWUyKSB7CiAgICB2YXIgcGFydGlhbE9ic2VydmVyID0gdGhpcy5wYXJ0aWFsT2JzZXJ2ZXI7CiAgICBpZiAocGFydGlhbE9ic2VydmVyLm5leHQpIHsKICAgICAgdHJ5IHsKICAgICAgICBwYXJ0aWFsT2JzZXJ2ZXIubmV4dCh2YWx1ZTIpOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGhhbmRsZVVuaGFuZGxlZEVycm9yKGVycm9yKTsKICAgICAgfQogICAgfQogIH07CiAgQ29uc3VtZXJPYnNlcnZlcjIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24oZXJyKSB7CiAgICB2YXIgcGFydGlhbE9ic2VydmVyID0gdGhpcy5wYXJ0aWFsT2JzZXJ2ZXI7CiAgICBpZiAocGFydGlhbE9ic2VydmVyLmVycm9yKSB7CiAgICAgIHRyeSB7CiAgICAgICAgcGFydGlhbE9ic2VydmVyLmVycm9yKGVycik7CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgaGFuZGxlVW5oYW5kbGVkRXJyb3IoZXJyb3IpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBoYW5kbGVVbmhhbmRsZWRFcnJvcihlcnIpOwogICAgfQogIH07CiAgQ29uc3VtZXJPYnNlcnZlcjIucHJvdG90eXBlLmNvbXBsZXRlID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgcGFydGlhbE9ic2VydmVyID0gdGhpcy5wYXJ0aWFsT2JzZXJ2ZXI7CiAgICBpZiAocGFydGlhbE9ic2VydmVyLmNvbXBsZXRlKSB7CiAgICAgIHRyeSB7CiAgICAgICAgcGFydGlhbE9ic2VydmVyLmNvbXBsZXRlKCk7CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgaGFuZGxlVW5oYW5kbGVkRXJyb3IoZXJyb3IpOwogICAgICB9CiAgICB9CiAgfTsKICByZXR1cm4gQ29uc3VtZXJPYnNlcnZlcjI7Cn0pKCk7CnZhciBTYWZlU3Vic2NyaWJlciA9IChmdW5jdGlvbihfc3VwZXIpIHsKICBfX2V4dGVuZHMoU2FmZVN1YnNjcmliZXIyLCBfc3VwZXIpOwogIGZ1bmN0aW9uIFNhZmVTdWJzY3JpYmVyMihvYnNlcnZlck9yTmV4dCwgZXJyb3IsIGNvbXBsZXRlKSB7CiAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgdmFyIHBhcnRpYWxPYnNlcnZlcjsKICAgIGlmIChpc0Z1bmN0aW9uKG9ic2VydmVyT3JOZXh0KSB8fCAhb2JzZXJ2ZXJPck5leHQpIHsKICAgICAgcGFydGlhbE9ic2VydmVyID0gewogICAgICAgIG5leHQ6IG9ic2VydmVyT3JOZXh0ICE9PSBudWxsICYmIG9ic2VydmVyT3JOZXh0ICE9PSB2b2lkIDAgPyBvYnNlcnZlck9yTmV4dCA6IHZvaWQgMCwKICAgICAgICBlcnJvcjogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogdm9pZCAwLAogICAgICAgIGNvbXBsZXRlOiBjb21wbGV0ZSAhPT0gbnVsbCAmJiBjb21wbGV0ZSAhPT0gdm9pZCAwID8gY29tcGxldGUgOiB2b2lkIDAKICAgICAgfTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBjb250ZXh0XzE7CiAgICAgIGlmIChfdGhpcyAmJiBjb25maWcudXNlRGVwcmVjYXRlZE5leHRDb250ZXh0KSB7CiAgICAgICAgY29udGV4dF8xID0gT2JqZWN0LmNyZWF0ZShvYnNlcnZlck9yTmV4dCk7CiAgICAgICAgY29udGV4dF8xLnVuc3Vic2NyaWJlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gX3RoaXMudW5zdWJzY3JpYmUoKTsKICAgICAgICB9OwogICAgICAgIHBhcnRpYWxPYnNlcnZlciA9IHsKICAgICAgICAgIG5leHQ6IG9ic2VydmVyT3JOZXh0Lm5leHQgJiYgYmluZChvYnNlcnZlck9yTmV4dC5uZXh0LCBjb250ZXh0XzEpLAogICAgICAgICAgZXJyb3I6IG9ic2VydmVyT3JOZXh0LmVycm9yICYmIGJpbmQob2JzZXJ2ZXJPck5leHQuZXJyb3IsIGNvbnRleHRfMSksCiAgICAgICAgICBjb21wbGV0ZTogb2JzZXJ2ZXJPck5leHQuY29tcGxldGUgJiYgYmluZChvYnNlcnZlck9yTmV4dC5jb21wbGV0ZSwgY29udGV4dF8xKQogICAgICAgIH07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGFydGlhbE9ic2VydmVyID0gb2JzZXJ2ZXJPck5leHQ7CiAgICAgIH0KICAgIH0KICAgIF90aGlzLmRlc3RpbmF0aW9uID0gbmV3IENvbnN1bWVyT2JzZXJ2ZXIocGFydGlhbE9ic2VydmVyKTsKICAgIHJldHVybiBfdGhpczsKICB9CiAgX19uYW1lKFNhZmVTdWJzY3JpYmVyMiwgIlNhZmVTdWJzY3JpYmVyIik7CiAgcmV0dXJuIFNhZmVTdWJzY3JpYmVyMjsKfSkoU3Vic2NyaWJlcik7CmZ1bmN0aW9uIGhhbmRsZVVuaGFuZGxlZEVycm9yKGVycm9yKSB7CiAgaWYgKGNvbmZpZy51c2VEZXByZWNhdGVkU3luY2hyb25vdXNFcnJvckhhbmRsaW5nKSB7CiAgICBjYXB0dXJlRXJyb3IoZXJyb3IpOwogIH0gZWxzZSB7CiAgICByZXBvcnRVbmhhbmRsZWRFcnJvcihlcnJvcik7CiAgfQp9Cl9fbmFtZShoYW5kbGVVbmhhbmRsZWRFcnJvciwgImhhbmRsZVVuaGFuZGxlZEVycm9yIik7CmZ1bmN0aW9uIGRlZmF1bHRFcnJvckhhbmRsZXIoZXJyKSB7CiAgdGhyb3cgZXJyOwp9Cl9fbmFtZShkZWZhdWx0RXJyb3JIYW5kbGVyLCAiZGVmYXVsdEVycm9ySGFuZGxlciIpOwpmdW5jdGlvbiBoYW5kbGVTdG9wcGVkTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgc3Vic2NyaWJlcikgewogIHZhciBvblN0b3BwZWROb3RpZmljYXRpb24gPSBjb25maWcub25TdG9wcGVkTm90aWZpY2F0aW9uOwogIG9uU3RvcHBlZE5vdGlmaWNhdGlvbiAmJiB0aW1lb3V0UHJvdmlkZXIuc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgIHJldHVybiBvblN0b3BwZWROb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBzdWJzY3JpYmVyKTsKICB9KTsKfQpfX25hbWUoaGFuZGxlU3RvcHBlZE5vdGlmaWNhdGlvbiwgImhhbmRsZVN0b3BwZWROb3RpZmljYXRpb24iKTsKdmFyIEVNUFRZX09CU0VSVkVSID0gewogIGNsb3NlZDogdHJ1ZSwKICBuZXh0OiBub29wLAogIGVycm9yOiBkZWZhdWx0RXJyb3JIYW5kbGVyLAogIGNvbXBsZXRlOiBub29wCn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc3ltYm9sL29ic2VydmFibGUuanMKdmFyIG9ic2VydmFibGUgPSAoZnVuY3Rpb24oKSB7CiAgcmV0dXJuIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm9ic2VydmFibGUgfHwgIkBAb2JzZXJ2YWJsZSI7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9pZGVudGl0eS5qcwpmdW5jdGlvbiBpZGVudGl0eSh4MykgewogIHJldHVybiB4MzsKfQpfX25hbWUoaWRlbnRpdHksICJpZGVudGl0eSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvcGlwZS5qcwpmdW5jdGlvbiBwaXBlKCkgewogIHZhciBmbnMgPSBbXTsKICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykgewogICAgZm5zW19pXSA9IGFyZ3VtZW50c1tfaV07CiAgfQogIHJldHVybiBwaXBlRnJvbUFycmF5KGZucyk7Cn0KX19uYW1lKHBpcGUsICJwaXBlIik7CmZ1bmN0aW9uIHBpcGVGcm9tQXJyYXkoZm5zKSB7CiAgaWYgKGZucy5sZW5ndGggPT09IDApIHsKICAgIHJldHVybiBpZGVudGl0eTsKICB9CiAgaWYgKGZucy5sZW5ndGggPT09IDEpIHsKICAgIHJldHVybiBmbnNbMF07CiAgfQogIHJldHVybiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uIHBpcGVkKGlucHV0KSB7CiAgICByZXR1cm4gZm5zLnJlZHVjZShmdW5jdGlvbihwcmV2LCBmbikgewogICAgICByZXR1cm4gZm4ocHJldik7CiAgICB9LCBpbnB1dCk7CiAgfSwgInBpcGVkIik7Cn0KX19uYW1lKHBpcGVGcm9tQXJyYXksICJwaXBlRnJvbUFycmF5Iik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvT2JzZXJ2YWJsZS5qcwp2YXIgT2JzZXJ2YWJsZSA9IChmdW5jdGlvbigpIHsKICBmdW5jdGlvbiBPYnNlcnZhYmxlMihzdWJzY3JpYmUyKSB7CiAgICBpZiAoc3Vic2NyaWJlMikgewogICAgICB0aGlzLl9zdWJzY3JpYmUgPSBzdWJzY3JpYmUyOwogICAgfQogIH0KICBfX25hbWUoT2JzZXJ2YWJsZTIsICJPYnNlcnZhYmxlIik7CiAgT2JzZXJ2YWJsZTIucHJvdG90eXBlLmxpZnQgPSBmdW5jdGlvbihvcGVyYXRvcikgewogICAgdmFyIG9ic2VydmFibGUyID0gbmV3IE9ic2VydmFibGUyKCk7CiAgICBvYnNlcnZhYmxlMi5zb3VyY2UgPSB0aGlzOwogICAgb2JzZXJ2YWJsZTIub3BlcmF0b3IgPSBvcGVyYXRvcjsKICAgIHJldHVybiBvYnNlcnZhYmxlMjsKICB9OwogIE9ic2VydmFibGUyLnByb3RvdHlwZS5zdWJzY3JpYmUgPSBmdW5jdGlvbihvYnNlcnZlck9yTmV4dCwgZXJyb3IsIGNvbXBsZXRlKSB7CiAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgdmFyIHN1YnNjcmliZXIgPSBpc1N1YnNjcmliZXIob2JzZXJ2ZXJPck5leHQpID8gb2JzZXJ2ZXJPck5leHQgOiBuZXcgU2FmZVN1YnNjcmliZXIob2JzZXJ2ZXJPck5leHQsIGVycm9yLCBjb21wbGV0ZSk7CiAgICBlcnJvckNvbnRleHQoZnVuY3Rpb24oKSB7CiAgICAgIHZhciBfYTIgPSBfdGhpcywgb3BlcmF0b3IgPSBfYTIub3BlcmF0b3IsIHNvdXJjZSA9IF9hMi5zb3VyY2U7CiAgICAgIHN1YnNjcmliZXIuYWRkKG9wZXJhdG9yID8gb3BlcmF0b3IuY2FsbChzdWJzY3JpYmVyLCBzb3VyY2UpIDogc291cmNlID8gX3RoaXMuX3N1YnNjcmliZShzdWJzY3JpYmVyKSA6IF90aGlzLl90cnlTdWJzY3JpYmUoc3Vic2NyaWJlcikpOwogICAgfSk7CiAgICByZXR1cm4gc3Vic2NyaWJlcjsKICB9OwogIE9ic2VydmFibGUyLnByb3RvdHlwZS5fdHJ5U3Vic2NyaWJlID0gZnVuY3Rpb24oc2luaykgewogICAgdHJ5IHsKICAgICAgcmV0dXJuIHRoaXMuX3N1YnNjcmliZShzaW5rKTsKICAgIH0gY2F0Y2ggKGVycikgewogICAgICBzaW5rLmVycm9yKGVycik7CiAgICB9CiAgfTsKICBPYnNlcnZhYmxlMi5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uKG5leHQyLCBwcm9taXNlQ3RvcikgewogICAgdmFyIF90aGlzID0gdGhpczsKICAgIHByb21pc2VDdG9yID0gZ2V0UHJvbWlzZUN0b3IocHJvbWlzZUN0b3IpOwogICAgcmV0dXJuIG5ldyBwcm9taXNlQ3RvcihmdW5jdGlvbihyZXNvbHZlMiwgcmVqZWN0KSB7CiAgICAgIHZhciBzdWJzY3JpYmVyID0gbmV3IFNhZmVTdWJzY3JpYmVyKHsKICAgICAgICBuZXh0OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKHZhbHVlMikgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgbmV4dDIodmFsdWUyKTsKICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICByZWplY3QoZXJyKTsKICAgICAgICAgICAgc3Vic2NyaWJlci51bnN1YnNjcmliZSgpOwogICAgICAgICAgfQogICAgICAgIH0sICJuZXh0IiksCiAgICAgICAgZXJyb3I6IHJlamVjdCwKICAgICAgICBjb21wbGV0ZTogcmVzb2x2ZTIKICAgICAgfSk7CiAgICAgIF90aGlzLnN1YnNjcmliZShzdWJzY3JpYmVyKTsKICAgIH0pOwogIH07CiAgT2JzZXJ2YWJsZTIucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICB2YXIgX2EyOwogICAgcmV0dXJuIChfYTIgPSB0aGlzLnNvdXJjZSkgPT09IG51bGwgfHwgX2EyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYTIuc3Vic2NyaWJlKHN1YnNjcmliZXIpOwogIH07CiAgT2JzZXJ2YWJsZTIucHJvdG90eXBlW29ic2VydmFibGVdID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpczsKICB9OwogIE9ic2VydmFibGUyLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgb3BlcmF0aW9ucyA9IFtdOwogICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKICAgICAgb3BlcmF0aW9uc1tfaV0gPSBhcmd1bWVudHNbX2ldOwogICAgfQogICAgcmV0dXJuIHBpcGVGcm9tQXJyYXkob3BlcmF0aW9ucykodGhpcyk7CiAgfTsKICBPYnNlcnZhYmxlMi5wcm90b3R5cGUudG9Qcm9taXNlID0gZnVuY3Rpb24ocHJvbWlzZUN0b3IpIHsKICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICBwcm9taXNlQ3RvciA9IGdldFByb21pc2VDdG9yKHByb21pc2VDdG9yKTsKICAgIHJldHVybiBuZXcgcHJvbWlzZUN0b3IoZnVuY3Rpb24ocmVzb2x2ZTIsIHJlamVjdCkgewogICAgICB2YXIgdmFsdWUyOwogICAgICBfdGhpcy5zdWJzY3JpYmUoZnVuY3Rpb24oeDMpIHsKICAgICAgICByZXR1cm4gdmFsdWUyID0geDM7CiAgICAgIH0sIGZ1bmN0aW9uKGVycikgewogICAgICAgIHJldHVybiByZWplY3QoZXJyKTsKICAgICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHJlc29sdmUyKHZhbHVlMik7CiAgICAgIH0pOwogICAgfSk7CiAgfTsKICBPYnNlcnZhYmxlMi5jcmVhdGUgPSBmdW5jdGlvbihzdWJzY3JpYmUyKSB7CiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUyKHN1YnNjcmliZTIpOwogIH07CiAgcmV0dXJuIE9ic2VydmFibGUyOwp9KSgpOwpmdW5jdGlvbiBnZXRQcm9taXNlQ3Rvcihwcm9taXNlQ3RvcikgewogIHZhciBfYTI7CiAgcmV0dXJuIChfYTIgPSBwcm9taXNlQ3RvciAhPT0gbnVsbCAmJiBwcm9taXNlQ3RvciAhPT0gdm9pZCAwID8gcHJvbWlzZUN0b3IgOiBjb25maWcuUHJvbWlzZSkgIT09IG51bGwgJiYgX2EyICE9PSB2b2lkIDAgPyBfYTIgOiBQcm9taXNlOwp9Cl9fbmFtZShnZXRQcm9taXNlQ3RvciwgImdldFByb21pc2VDdG9yIik7CmZ1bmN0aW9uIGlzT2JzZXJ2ZXIodmFsdWUyKSB7CiAgcmV0dXJuIHZhbHVlMiAmJiBpc0Z1bmN0aW9uKHZhbHVlMi5uZXh0KSAmJiBpc0Z1bmN0aW9uKHZhbHVlMi5lcnJvcikgJiYgaXNGdW5jdGlvbih2YWx1ZTIuY29tcGxldGUpOwp9Cl9fbmFtZShpc09ic2VydmVyLCAiaXNPYnNlcnZlciIpOwpmdW5jdGlvbiBpc1N1YnNjcmliZXIodmFsdWUyKSB7CiAgcmV0dXJuIHZhbHVlMiAmJiB2YWx1ZTIgaW5zdGFuY2VvZiBTdWJzY3JpYmVyIHx8IGlzT2JzZXJ2ZXIodmFsdWUyKSAmJiBpc1N1YnNjcmlwdGlvbih2YWx1ZTIpOwp9Cl9fbmFtZShpc1N1YnNjcmliZXIsICJpc1N1YnNjcmliZXIiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2xpZnQuanMKZnVuY3Rpb24gaGFzTGlmdChzb3VyY2UpIHsKICByZXR1cm4gaXNGdW5jdGlvbihzb3VyY2UgPT09IG51bGwgfHwgc291cmNlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzb3VyY2UubGlmdCk7Cn0KX19uYW1lKGhhc0xpZnQsICJoYXNMaWZ0Iik7CmZ1bmN0aW9uIG9wZXJhdGUoaW5pdCkgewogIHJldHVybiBmdW5jdGlvbihzb3VyY2UpIHsKICAgIGlmIChoYXNMaWZ0KHNvdXJjZSkpIHsKICAgICAgcmV0dXJuIHNvdXJjZS5saWZ0KGZ1bmN0aW9uKGxpZnRlZFNvdXJjZSkgewogICAgICAgIHRyeSB7CiAgICAgICAgICByZXR1cm4gaW5pdChsaWZ0ZWRTb3VyY2UsIHRoaXMpOwogICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgdGhpcy5lcnJvcihlcnIpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmFibGUgdG8gbGlmdCB1bmtub3duIE9ic2VydmFibGUgdHlwZSIpOwogIH07Cn0KX19uYW1lKG9wZXJhdGUsICJvcGVyYXRlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL09wZXJhdG9yU3Vic2NyaWJlci5qcwpmdW5jdGlvbiBjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoZGVzdGluYXRpb24sIG9uTmV4dCwgb25Db21wbGV0ZSwgb25FcnJvciwgb25GaW5hbGl6ZSkgewogIHJldHVybiBuZXcgT3BlcmF0b3JTdWJzY3JpYmVyKGRlc3RpbmF0aW9uLCBvbk5leHQsIG9uQ29tcGxldGUsIG9uRXJyb3IsIG9uRmluYWxpemUpOwp9Cl9fbmFtZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIsICJjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIiKTsKdmFyIE9wZXJhdG9yU3Vic2NyaWJlciA9IChmdW5jdGlvbihfc3VwZXIpIHsKICBfX2V4dGVuZHMoT3BlcmF0b3JTdWJzY3JpYmVyMiwgX3N1cGVyKTsKICBmdW5jdGlvbiBPcGVyYXRvclN1YnNjcmliZXIyKGRlc3RpbmF0aW9uLCBvbk5leHQsIG9uQ29tcGxldGUsIG9uRXJyb3IsIG9uRmluYWxpemUsIHNob3VsZFVuc3Vic2NyaWJlKSB7CiAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbikgfHwgdGhpczsKICAgIF90aGlzLm9uRmluYWxpemUgPSBvbkZpbmFsaXplOwogICAgX3RoaXMuc2hvdWxkVW5zdWJzY3JpYmUgPSBzaG91bGRVbnN1YnNjcmliZTsKICAgIF90aGlzLl9uZXh0ID0gb25OZXh0ID8gZnVuY3Rpb24odmFsdWUyKSB7CiAgICAgIHRyeSB7CiAgICAgICAgb25OZXh0KHZhbHVlMik7CiAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgIGRlc3RpbmF0aW9uLmVycm9yKGVycik7CiAgICAgIH0KICAgIH0gOiBfc3VwZXIucHJvdG90eXBlLl9uZXh0OwogICAgX3RoaXMuX2Vycm9yID0gb25FcnJvciA/IGZ1bmN0aW9uKGVycikgewogICAgICB0cnkgewogICAgICAgIG9uRXJyb3IoZXJyKTsKICAgICAgfSBjYXRjaCAoZXJyMikgewogICAgICAgIGRlc3RpbmF0aW9uLmVycm9yKGVycjIpOwogICAgICB9IGZpbmFsbHkgewogICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTsKICAgICAgfQogICAgfSA6IF9zdXBlci5wcm90b3R5cGUuX2Vycm9yOwogICAgX3RoaXMuX2NvbXBsZXRlID0gb25Db21wbGV0ZSA/IGZ1bmN0aW9uKCkgewogICAgICB0cnkgewogICAgICAgIG9uQ29tcGxldGUoKTsKICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgZGVzdGluYXRpb24uZXJyb3IoZXJyKTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICAgIH0KICAgIH0gOiBfc3VwZXIucHJvdG90eXBlLl9jb21wbGV0ZTsKICAgIHJldHVybiBfdGhpczsKICB9CiAgX19uYW1lKE9wZXJhdG9yU3Vic2NyaWJlcjIsICJPcGVyYXRvclN1YnNjcmliZXIiKTsKICBPcGVyYXRvclN1YnNjcmliZXIyLnByb3RvdHlwZS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKCkgewogICAgdmFyIF9hMjsKICAgIGlmICghdGhpcy5zaG91bGRVbnN1YnNjcmliZSB8fCB0aGlzLnNob3VsZFVuc3Vic2NyaWJlKCkpIHsKICAgICAgdmFyIGNsb3NlZF8xID0gdGhpcy5jbG9zZWQ7CiAgICAgIF9zdXBlci5wcm90b3R5cGUudW5zdWJzY3JpYmUuY2FsbCh0aGlzKTsKICAgICAgIWNsb3NlZF8xICYmICgoX2EyID0gdGhpcy5vbkZpbmFsaXplKSA9PT0gbnVsbCB8fCBfYTIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hMi5jYWxsKHRoaXMpKTsKICAgIH0KICB9OwogIHJldHVybiBPcGVyYXRvclN1YnNjcmliZXIyOwp9KShTdWJzY3JpYmVyKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL09iamVjdFVuc3Vic2NyaWJlZEVycm9yLmpzCnZhciBPYmplY3RVbnN1YnNjcmliZWRFcnJvciA9IGNyZWF0ZUVycm9yQ2xhc3MoZnVuY3Rpb24oX3N1cGVyKSB7CiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3JJbXBsKCkgewogICAgX3N1cGVyKHRoaXMpOwogICAgdGhpcy5uYW1lID0gIk9iamVjdFVuc3Vic2NyaWJlZEVycm9yIjsKICAgIHRoaXMubWVzc2FnZSA9ICJvYmplY3QgdW5zdWJzY3JpYmVkIjsKICB9LCAiT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3JJbXBsIik7Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL1N1YmplY3QuanMKdmFyIFN1YmplY3QgPSAoZnVuY3Rpb24oX3N1cGVyKSB7CiAgX19leHRlbmRzKFN1YmplY3QyLCBfc3VwZXIpOwogIGZ1bmN0aW9uIFN1YmplY3QyKCkgewogICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpczsKICAgIF90aGlzLmNsb3NlZCA9IGZhbHNlOwogICAgX3RoaXMuY3VycmVudE9ic2VydmVycyA9IG51bGw7CiAgICBfdGhpcy5vYnNlcnZlcnMgPSBbXTsKICAgIF90aGlzLmlzU3RvcHBlZCA9IGZhbHNlOwogICAgX3RoaXMuaGFzRXJyb3IgPSBmYWxzZTsKICAgIF90aGlzLnRocm93bkVycm9yID0gbnVsbDsKICAgIHJldHVybiBfdGhpczsKICB9CiAgX19uYW1lKFN1YmplY3QyLCAiU3ViamVjdCIpOwogIFN1YmplY3QyLnByb3RvdHlwZS5saWZ0ID0gZnVuY3Rpb24ob3BlcmF0b3IpIHsKICAgIHZhciBzdWJqZWN0ID0gbmV3IEFub255bW91c1N1YmplY3QodGhpcywgdGhpcyk7CiAgICBzdWJqZWN0Lm9wZXJhdG9yID0gb3BlcmF0b3I7CiAgICByZXR1cm4gc3ViamVjdDsKICB9OwogIFN1YmplY3QyLnByb3RvdHlwZS5fdGhyb3dJZkNsb3NlZCA9IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMuY2xvc2VkKSB7CiAgICAgIHRocm93IG5ldyBPYmplY3RVbnN1YnNjcmliZWRFcnJvcigpOwogICAgfQogIH07CiAgU3ViamVjdDIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbih2YWx1ZTIpIHsKICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICBlcnJvckNvbnRleHQoZnVuY3Rpb24oKSB7CiAgICAgIHZhciBlXzEsIF9hMjsKICAgICAgX3RoaXMuX3Rocm93SWZDbG9zZWQoKTsKICAgICAgaWYgKCFfdGhpcy5pc1N0b3BwZWQpIHsKICAgICAgICBpZiAoIV90aGlzLmN1cnJlbnRPYnNlcnZlcnMpIHsKICAgICAgICAgIF90aGlzLmN1cnJlbnRPYnNlcnZlcnMgPSBBcnJheS5mcm9tKF90aGlzLm9ic2VydmVycyk7CiAgICAgICAgfQogICAgICAgIHRyeSB7CiAgICAgICAgICBmb3IgKHZhciBfYiA9IF9fdmFsdWVzKF90aGlzLmN1cnJlbnRPYnNlcnZlcnMpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7CiAgICAgICAgICAgIHZhciBvYnNlcnZlciA9IF9jLnZhbHVlOwogICAgICAgICAgICBvYnNlcnZlci5uZXh0KHZhbHVlMik7CiAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoZV8xXzEpIHsKICAgICAgICAgIGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EyID0gX2IucmV0dXJuKSkgX2EyLmNhbGwoX2IpOwogICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgfTsKICBTdWJqZWN0Mi5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbihlcnIpIHsKICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICBlcnJvckNvbnRleHQoZnVuY3Rpb24oKSB7CiAgICAgIF90aGlzLl90aHJvd0lmQ2xvc2VkKCk7CiAgICAgIGlmICghX3RoaXMuaXNTdG9wcGVkKSB7CiAgICAgICAgX3RoaXMuaGFzRXJyb3IgPSBfdGhpcy5pc1N0b3BwZWQgPSB0cnVlOwogICAgICAgIF90aGlzLnRocm93bkVycm9yID0gZXJyOwogICAgICAgIHZhciBvYnNlcnZlcnMgPSBfdGhpcy5vYnNlcnZlcnM7CiAgICAgICAgd2hpbGUgKG9ic2VydmVycy5sZW5ndGgpIHsKICAgICAgICAgIG9ic2VydmVycy5zaGlmdCgpLmVycm9yKGVycik7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICB9OwogIFN1YmplY3QyLnByb3RvdHlwZS5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkgewogICAgdmFyIF90aGlzID0gdGhpczsKICAgIGVycm9yQ29udGV4dChmdW5jdGlvbigpIHsKICAgICAgX3RoaXMuX3Rocm93SWZDbG9zZWQoKTsKICAgICAgaWYgKCFfdGhpcy5pc1N0b3BwZWQpIHsKICAgICAgICBfdGhpcy5pc1N0b3BwZWQgPSB0cnVlOwogICAgICAgIHZhciBvYnNlcnZlcnMgPSBfdGhpcy5vYnNlcnZlcnM7CiAgICAgICAgd2hpbGUgKG9ic2VydmVycy5sZW5ndGgpIHsKICAgICAgICAgIG9ic2VydmVycy5zaGlmdCgpLmNvbXBsZXRlKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICB9OwogIFN1YmplY3QyLnByb3RvdHlwZS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5pc1N0b3BwZWQgPSB0aGlzLmNsb3NlZCA9IHRydWU7CiAgICB0aGlzLm9ic2VydmVycyA9IHRoaXMuY3VycmVudE9ic2VydmVycyA9IG51bGw7CiAgfTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU3ViamVjdDIucHJvdG90eXBlLCAib2JzZXJ2ZWQiLCB7CiAgICBnZXQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oKSB7CiAgICAgIHZhciBfYTI7CiAgICAgIHJldHVybiAoKF9hMiA9IHRoaXMub2JzZXJ2ZXJzKSA9PT0gbnVsbCB8fCBfYTIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hMi5sZW5ndGgpID4gMDsKICAgIH0sICJnZXQiKSwKICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgY29uZmlndXJhYmxlOiB0cnVlCiAgfSk7CiAgU3ViamVjdDIucHJvdG90eXBlLl90cnlTdWJzY3JpYmUgPSBmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICB0aGlzLl90aHJvd0lmQ2xvc2VkKCk7CiAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5fdHJ5U3Vic2NyaWJlLmNhbGwodGhpcywgc3Vic2NyaWJlcik7CiAgfTsKICBTdWJqZWN0Mi5wcm90b3R5cGUuX3N1YnNjcmliZSA9IGZ1bmN0aW9uKHN1YnNjcmliZXIpIHsKICAgIHRoaXMuX3Rocm93SWZDbG9zZWQoKTsKICAgIHRoaXMuX2NoZWNrRmluYWxpemVkU3RhdHVzZXMoc3Vic2NyaWJlcik7CiAgICByZXR1cm4gdGhpcy5faW5uZXJTdWJzY3JpYmUoc3Vic2NyaWJlcik7CiAgfTsKICBTdWJqZWN0Mi5wcm90b3R5cGUuX2lubmVyU3Vic2NyaWJlID0gZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgdmFyIF90aGlzID0gdGhpczsKICAgIHZhciBfYTIgPSB0aGlzLCBoYXNFcnJvciA9IF9hMi5oYXNFcnJvciwgaXNTdG9wcGVkID0gX2EyLmlzU3RvcHBlZCwgb2JzZXJ2ZXJzID0gX2EyLm9ic2VydmVyczsKICAgIGlmIChoYXNFcnJvciB8fCBpc1N0b3BwZWQpIHsKICAgICAgcmV0dXJuIEVNUFRZX1NVQlNDUklQVElPTjsKICAgIH0KICAgIHRoaXMuY3VycmVudE9ic2VydmVycyA9IG51bGw7CiAgICBvYnNlcnZlcnMucHVzaChzdWJzY3JpYmVyKTsKICAgIHJldHVybiBuZXcgU3Vic2NyaXB0aW9uKGZ1bmN0aW9uKCkgewogICAgICBfdGhpcy5jdXJyZW50T2JzZXJ2ZXJzID0gbnVsbDsKICAgICAgYXJyUmVtb3ZlKG9ic2VydmVycywgc3Vic2NyaWJlcik7CiAgICB9KTsKICB9OwogIFN1YmplY3QyLnByb3RvdHlwZS5fY2hlY2tGaW5hbGl6ZWRTdGF0dXNlcyA9IGZ1bmN0aW9uKHN1YnNjcmliZXIpIHsKICAgIHZhciBfYTIgPSB0aGlzLCBoYXNFcnJvciA9IF9hMi5oYXNFcnJvciwgdGhyb3duRXJyb3IgPSBfYTIudGhyb3duRXJyb3IsIGlzU3RvcHBlZCA9IF9hMi5pc1N0b3BwZWQ7CiAgICBpZiAoaGFzRXJyb3IpIHsKICAgICAgc3Vic2NyaWJlci5lcnJvcih0aHJvd25FcnJvcik7CiAgICB9IGVsc2UgaWYgKGlzU3RvcHBlZCkgewogICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICB9CiAgfTsKICBTdWJqZWN0Mi5wcm90b3R5cGUuYXNPYnNlcnZhYmxlID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgb2JzZXJ2YWJsZTIgPSBuZXcgT2JzZXJ2YWJsZSgpOwogICAgb2JzZXJ2YWJsZTIuc291cmNlID0gdGhpczsKICAgIHJldHVybiBvYnNlcnZhYmxlMjsKICB9OwogIFN1YmplY3QyLmNyZWF0ZSA9IGZ1bmN0aW9uKGRlc3RpbmF0aW9uLCBzb3VyY2UpIHsKICAgIHJldHVybiBuZXcgQW5vbnltb3VzU3ViamVjdChkZXN0aW5hdGlvbiwgc291cmNlKTsKICB9OwogIHJldHVybiBTdWJqZWN0MjsKfSkoT2JzZXJ2YWJsZSk7CnZhciBBbm9ueW1vdXNTdWJqZWN0ID0gKGZ1bmN0aW9uKF9zdXBlcikgewogIF9fZXh0ZW5kcyhBbm9ueW1vdXNTdWJqZWN0MiwgX3N1cGVyKTsKICBmdW5jdGlvbiBBbm9ueW1vdXNTdWJqZWN0MihkZXN0aW5hdGlvbiwgc291cmNlKSB7CiAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgX3RoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjsKICAgIF90aGlzLnNvdXJjZSA9IHNvdXJjZTsKICAgIHJldHVybiBfdGhpczsKICB9CiAgX19uYW1lKEFub255bW91c1N1YmplY3QyLCAiQW5vbnltb3VzU3ViamVjdCIpOwogIEFub255bW91c1N1YmplY3QyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24odmFsdWUyKSB7CiAgICB2YXIgX2EyLCBfYjsKICAgIChfYiA9IChfYTIgPSB0aGlzLmRlc3RpbmF0aW9uKSA9PT0gbnVsbCB8fCBfYTIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hMi5uZXh0KSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChfYTIsIHZhbHVlMik7CiAgfTsKICBBbm9ueW1vdXNTdWJqZWN0Mi5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbihlcnIpIHsKICAgIHZhciBfYTIsIF9iOwogICAgKF9iID0gKF9hMiA9IHRoaXMuZGVzdGluYXRpb24pID09PSBudWxsIHx8IF9hMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EyLmVycm9yKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChfYTIsIGVycik7CiAgfTsKICBBbm9ueW1vdXNTdWJqZWN0Mi5wcm90b3R5cGUuY29tcGxldGUgPSBmdW5jdGlvbigpIHsKICAgIHZhciBfYTIsIF9iOwogICAgKF9iID0gKF9hMiA9IHRoaXMuZGVzdGluYXRpb24pID09PSBudWxsIHx8IF9hMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EyLmNvbXBsZXRlKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChfYTIpOwogIH07CiAgQW5vbnltb3VzU3ViamVjdDIucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICB2YXIgX2EyLCBfYjsKICAgIHJldHVybiAoX2IgPSAoX2EyID0gdGhpcy5zb3VyY2UpID09PSBudWxsIHx8IF9hMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EyLnN1YnNjcmliZShzdWJzY3JpYmVyKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogRU1QVFlfU1VCU0NSSVBUSU9OOwogIH07CiAgcmV0dXJuIEFub255bW91c1N1YmplY3QyOwp9KShTdWJqZWN0KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvZGF0ZVRpbWVzdGFtcFByb3ZpZGVyLmpzCnZhciBkYXRlVGltZXN0YW1wUHJvdmlkZXIgPSB7CiAgbm93OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIChkYXRlVGltZXN0YW1wUHJvdmlkZXIuZGVsZWdhdGUgfHwgRGF0ZSkubm93KCk7CiAgfSwgIm5vdyIpLAogIGRlbGVnYXRlOiB2b2lkIDAKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9SZXBsYXlTdWJqZWN0LmpzCnZhciBSZXBsYXlTdWJqZWN0ID0gKGZ1bmN0aW9uKF9zdXBlcikgewogIF9fZXh0ZW5kcyhSZXBsYXlTdWJqZWN0MiwgX3N1cGVyKTsKICBmdW5jdGlvbiBSZXBsYXlTdWJqZWN0MihfYnVmZmVyU2l6ZSwgX3dpbmRvd1RpbWUsIF90aW1lc3RhbXBQcm92aWRlcikgewogICAgaWYgKF9idWZmZXJTaXplID09PSB2b2lkIDApIHsKICAgICAgX2J1ZmZlclNpemUgPSBJbmZpbml0eTsKICAgIH0KICAgIGlmIChfd2luZG93VGltZSA9PT0gdm9pZCAwKSB7CiAgICAgIF93aW5kb3dUaW1lID0gSW5maW5pdHk7CiAgICB9CiAgICBpZiAoX3RpbWVzdGFtcFByb3ZpZGVyID09PSB2b2lkIDApIHsKICAgICAgX3RpbWVzdGFtcFByb3ZpZGVyID0gZGF0ZVRpbWVzdGFtcFByb3ZpZGVyOwogICAgfQogICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpczsKICAgIF90aGlzLl9idWZmZXJTaXplID0gX2J1ZmZlclNpemU7CiAgICBfdGhpcy5fd2luZG93VGltZSA9IF93aW5kb3dUaW1lOwogICAgX3RoaXMuX3RpbWVzdGFtcFByb3ZpZGVyID0gX3RpbWVzdGFtcFByb3ZpZGVyOwogICAgX3RoaXMuX2J1ZmZlciA9IFtdOwogICAgX3RoaXMuX2luZmluaXRlVGltZVdpbmRvdyA9IHRydWU7CiAgICBfdGhpcy5faW5maW5pdGVUaW1lV2luZG93ID0gX3dpbmRvd1RpbWUgPT09IEluZmluaXR5OwogICAgX3RoaXMuX2J1ZmZlclNpemUgPSBNYXRoLm1heCgxLCBfYnVmZmVyU2l6ZSk7CiAgICBfdGhpcy5fd2luZG93VGltZSA9IE1hdGgubWF4KDEsIF93aW5kb3dUaW1lKTsKICAgIHJldHVybiBfdGhpczsKICB9CiAgX19uYW1lKFJlcGxheVN1YmplY3QyLCAiUmVwbGF5U3ViamVjdCIpOwogIFJlcGxheVN1YmplY3QyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24odmFsdWUyKSB7CiAgICB2YXIgX2EyID0gdGhpcywgaXNTdG9wcGVkID0gX2EyLmlzU3RvcHBlZCwgX2J1ZmZlciA9IF9hMi5fYnVmZmVyLCBfaW5maW5pdGVUaW1lV2luZG93ID0gX2EyLl9pbmZpbml0ZVRpbWVXaW5kb3csIF90aW1lc3RhbXBQcm92aWRlciA9IF9hMi5fdGltZXN0YW1wUHJvdmlkZXIsIF93aW5kb3dUaW1lID0gX2EyLl93aW5kb3dUaW1lOwogICAgaWYgKCFpc1N0b3BwZWQpIHsKICAgICAgX2J1ZmZlci5wdXNoKHZhbHVlMik7CiAgICAgICFfaW5maW5pdGVUaW1lV2luZG93ICYmIF9idWZmZXIucHVzaChfdGltZXN0YW1wUHJvdmlkZXIubm93KCkgKyBfd2luZG93VGltZSk7CiAgICB9CiAgICB0aGlzLl90cmltQnVmZmVyKCk7CiAgICBfc3VwZXIucHJvdG90eXBlLm5leHQuY2FsbCh0aGlzLCB2YWx1ZTIpOwogIH07CiAgUmVwbGF5U3ViamVjdDIucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICB0aGlzLl90aHJvd0lmQ2xvc2VkKCk7CiAgICB0aGlzLl90cmltQnVmZmVyKCk7CiAgICB2YXIgc3Vic2NyaXB0aW9uID0gdGhpcy5faW5uZXJTdWJzY3JpYmUoc3Vic2NyaWJlcik7CiAgICB2YXIgX2EyID0gdGhpcywgX2luZmluaXRlVGltZVdpbmRvdyA9IF9hMi5faW5maW5pdGVUaW1lV2luZG93LCBfYnVmZmVyID0gX2EyLl9idWZmZXI7CiAgICB2YXIgY29weSA9IF9idWZmZXIuc2xpY2UoKTsKICAgIGZvciAodmFyIGkxMCA9IDA7IGkxMCA8IGNvcHkubGVuZ3RoICYmICFzdWJzY3JpYmVyLmNsb3NlZDsgaTEwICs9IF9pbmZpbml0ZVRpbWVXaW5kb3cgPyAxIDogMikgewogICAgICBzdWJzY3JpYmVyLm5leHQoY29weVtpMTBdKTsKICAgIH0KICAgIHRoaXMuX2NoZWNrRmluYWxpemVkU3RhdHVzZXMoc3Vic2NyaWJlcik7CiAgICByZXR1cm4gc3Vic2NyaXB0aW9uOwogIH07CiAgUmVwbGF5U3ViamVjdDIucHJvdG90eXBlLl90cmltQnVmZmVyID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgX2EyID0gdGhpcywgX2J1ZmZlclNpemUgPSBfYTIuX2J1ZmZlclNpemUsIF90aW1lc3RhbXBQcm92aWRlciA9IF9hMi5fdGltZXN0YW1wUHJvdmlkZXIsIF9idWZmZXIgPSBfYTIuX2J1ZmZlciwgX2luZmluaXRlVGltZVdpbmRvdyA9IF9hMi5faW5maW5pdGVUaW1lV2luZG93OwogICAgdmFyIGFkanVzdGVkQnVmZmVyU2l6ZSA9IChfaW5maW5pdGVUaW1lV2luZG93ID8gMSA6IDIpICogX2J1ZmZlclNpemU7CiAgICBfYnVmZmVyU2l6ZSA8IEluZmluaXR5ICYmIGFkanVzdGVkQnVmZmVyU2l6ZSA8IF9idWZmZXIubGVuZ3RoICYmIF9idWZmZXIuc3BsaWNlKDAsIF9idWZmZXIubGVuZ3RoIC0gYWRqdXN0ZWRCdWZmZXJTaXplKTsKICAgIGlmICghX2luZmluaXRlVGltZVdpbmRvdykgewogICAgICB2YXIgbm93MiA9IF90aW1lc3RhbXBQcm92aWRlci5ub3coKTsKICAgICAgdmFyIGxhc3QzID0gMDsKICAgICAgZm9yICh2YXIgaTEwID0gMTsgaTEwIDwgX2J1ZmZlci5sZW5ndGggJiYgX2J1ZmZlcltpMTBdIDw9IG5vdzI7IGkxMCArPSAyKSB7CiAgICAgICAgbGFzdDMgPSBpMTA7CiAgICAgIH0KICAgICAgbGFzdDMgJiYgX2J1ZmZlci5zcGxpY2UoMCwgbGFzdDMgKyAxKTsKICAgIH0KICB9OwogIHJldHVybiBSZXBsYXlTdWJqZWN0MjsKfSkoU3ViamVjdCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVyL0FjdGlvbi5qcwp2YXIgQWN0aW9uID0gKGZ1bmN0aW9uKF9zdXBlcikgewogIF9fZXh0ZW5kcyhBY3Rpb24yLCBfc3VwZXIpOwogIGZ1bmN0aW9uIEFjdGlvbjIoc2NoZWR1bGVyLCB3b3JrKSB7CiAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpczsKICB9CiAgX19uYW1lKEFjdGlvbjIsICJBY3Rpb24iKTsKICBBY3Rpb24yLnByb3RvdHlwZS5zY2hlZHVsZSA9IGZ1bmN0aW9uKHN0YXRlLCBkZWxheTIpIHsKICAgIGlmIChkZWxheTIgPT09IHZvaWQgMCkgewogICAgICBkZWxheTIgPSAwOwogICAgfQogICAgcmV0dXJuIHRoaXM7CiAgfTsKICByZXR1cm4gQWN0aW9uMjsKfSkoU3Vic2NyaXB0aW9uKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvaW50ZXJ2YWxQcm92aWRlci5qcwp2YXIgaW50ZXJ2YWxQcm92aWRlciA9IHsKICBzZXRJbnRlcnZhbDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihoYW5kbGVyMiwgdGltZW91dDIpIHsKICAgIHZhciBhcmdzID0gW107CiAgICBmb3IgKHZhciBfaSA9IDI7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykgewogICAgICBhcmdzW19pIC0gMl0gPSBhcmd1bWVudHNbX2ldOwogICAgfQogICAgdmFyIGRlbGVnYXRlID0gaW50ZXJ2YWxQcm92aWRlci5kZWxlZ2F0ZTsKICAgIGlmIChkZWxlZ2F0ZSA9PT0gbnVsbCB8fCBkZWxlZ2F0ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGVsZWdhdGUuc2V0SW50ZXJ2YWwpIHsKICAgICAgcmV0dXJuIGRlbGVnYXRlLnNldEludGVydmFsLmFwcGx5KGRlbGVnYXRlLCBfX3NwcmVhZEFycmF5KFtoYW5kbGVyMiwgdGltZW91dDJdLCBfX3JlYWQoYXJncykpKTsKICAgIH0KICAgIHJldHVybiBzZXRJbnRlcnZhbC5hcHBseSh2b2lkIDAsIF9fc3ByZWFkQXJyYXkoW2hhbmRsZXIyLCB0aW1lb3V0Ml0sIF9fcmVhZChhcmdzKSkpOwogIH0sICJzZXRJbnRlcnZhbCIpLAogIGNsZWFySW50ZXJ2YWw6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oaGFuZGxlMykgewogICAgdmFyIGRlbGVnYXRlID0gaW50ZXJ2YWxQcm92aWRlci5kZWxlZ2F0ZTsKICAgIHJldHVybiAoKGRlbGVnYXRlID09PSBudWxsIHx8IGRlbGVnYXRlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkZWxlZ2F0ZS5jbGVhckludGVydmFsKSB8fCBjbGVhckludGVydmFsKShoYW5kbGUzKTsKICB9LCAiY2xlYXJJbnRlcnZhbCIpLAogIGRlbGVnYXRlOiB2b2lkIDAKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvQXN5bmNBY3Rpb24uanMKdmFyIEFzeW5jQWN0aW9uID0gKGZ1bmN0aW9uKF9zdXBlcikgewogIF9fZXh0ZW5kcyhBc3luY0FjdGlvbjIsIF9zdXBlcik7CiAgZnVuY3Rpb24gQXN5bmNBY3Rpb24yKHNjaGVkdWxlciwgd29yaykgewogICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgc2NoZWR1bGVyLCB3b3JrKSB8fCB0aGlzOwogICAgX3RoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyOwogICAgX3RoaXMud29yayA9IHdvcms7CiAgICBfdGhpcy5wZW5kaW5nID0gZmFsc2U7CiAgICByZXR1cm4gX3RoaXM7CiAgfQogIF9fbmFtZShBc3luY0FjdGlvbjIsICJBc3luY0FjdGlvbiIpOwogIEFzeW5jQWN0aW9uMi5wcm90b3R5cGUuc2NoZWR1bGUgPSBmdW5jdGlvbihzdGF0ZSwgZGVsYXkyKSB7CiAgICB2YXIgX2EyOwogICAgaWYgKGRlbGF5MiA9PT0gdm9pZCAwKSB7CiAgICAgIGRlbGF5MiA9IDA7CiAgICB9CiAgICBpZiAodGhpcy5jbG9zZWQpIHsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICB0aGlzLnN0YXRlID0gc3RhdGU7CiAgICB2YXIgaWQgPSB0aGlzLmlkOwogICAgdmFyIHNjaGVkdWxlciA9IHRoaXMuc2NoZWR1bGVyOwogICAgaWYgKGlkICE9IG51bGwpIHsKICAgICAgdGhpcy5pZCA9IHRoaXMucmVjeWNsZUFzeW5jSWQoc2NoZWR1bGVyLCBpZCwgZGVsYXkyKTsKICAgIH0KICAgIHRoaXMucGVuZGluZyA9IHRydWU7CiAgICB0aGlzLmRlbGF5ID0gZGVsYXkyOwogICAgdGhpcy5pZCA9IChfYTIgPSB0aGlzLmlkKSAhPT0gbnVsbCAmJiBfYTIgIT09IHZvaWQgMCA/IF9hMiA6IHRoaXMucmVxdWVzdEFzeW5jSWQoc2NoZWR1bGVyLCB0aGlzLmlkLCBkZWxheTIpOwogICAgcmV0dXJuIHRoaXM7CiAgfTsKICBBc3luY0FjdGlvbjIucHJvdG90eXBlLnJlcXVlc3RBc3luY0lkID0gZnVuY3Rpb24oc2NoZWR1bGVyLCBfaWQsIGRlbGF5MikgewogICAgaWYgKGRlbGF5MiA9PT0gdm9pZCAwKSB7CiAgICAgIGRlbGF5MiA9IDA7CiAgICB9CiAgICByZXR1cm4gaW50ZXJ2YWxQcm92aWRlci5zZXRJbnRlcnZhbChzY2hlZHVsZXIuZmx1c2guYmluZChzY2hlZHVsZXIsIHRoaXMpLCBkZWxheTIpOwogIH07CiAgQXN5bmNBY3Rpb24yLnByb3RvdHlwZS5yZWN5Y2xlQXN5bmNJZCA9IGZ1bmN0aW9uKF9zY2hlZHVsZXIsIGlkLCBkZWxheTIpIHsKICAgIGlmIChkZWxheTIgPT09IHZvaWQgMCkgewogICAgICBkZWxheTIgPSAwOwogICAgfQogICAgaWYgKGRlbGF5MiAhPSBudWxsICYmIHRoaXMuZGVsYXkgPT09IGRlbGF5MiAmJiB0aGlzLnBlbmRpbmcgPT09IGZhbHNlKSB7CiAgICAgIHJldHVybiBpZDsKICAgIH0KICAgIGlmIChpZCAhPSBudWxsKSB7CiAgICAgIGludGVydmFsUHJvdmlkZXIuY2xlYXJJbnRlcnZhbChpZCk7CiAgICB9CiAgICByZXR1cm4gdm9pZCAwOwogIH07CiAgQXN5bmNBY3Rpb24yLnByb3RvdHlwZS5leGVjdXRlID0gZnVuY3Rpb24oc3RhdGUsIGRlbGF5MikgewogICAgaWYgKHRoaXMuY2xvc2VkKSB7CiAgICAgIHJldHVybiBuZXcgRXJyb3IoImV4ZWN1dGluZyBhIGNhbmNlbGxlZCBhY3Rpb24iKTsKICAgIH0KICAgIHRoaXMucGVuZGluZyA9IGZhbHNlOwogICAgdmFyIGVycm9yID0gdGhpcy5fZXhlY3V0ZShzdGF0ZSwgZGVsYXkyKTsKICAgIGlmIChlcnJvcikgewogICAgICByZXR1cm4gZXJyb3I7CiAgICB9IGVsc2UgaWYgKHRoaXMucGVuZGluZyA9PT0gZmFsc2UgJiYgdGhpcy5pZCAhPSBudWxsKSB7CiAgICAgIHRoaXMuaWQgPSB0aGlzLnJlY3ljbGVBc3luY0lkKHRoaXMuc2NoZWR1bGVyLCB0aGlzLmlkLCBudWxsKTsKICAgIH0KICB9OwogIEFzeW5jQWN0aW9uMi5wcm90b3R5cGUuX2V4ZWN1dGUgPSBmdW5jdGlvbihzdGF0ZSwgX2RlbGF5KSB7CiAgICB2YXIgZXJyb3JlZCA9IGZhbHNlOwogICAgdmFyIGVycm9yVmFsdWU7CiAgICB0cnkgewogICAgICB0aGlzLndvcmsoc3RhdGUpOwogICAgfSBjYXRjaCAoZTEwKSB7CiAgICAgIGVycm9yZWQgPSB0cnVlOwogICAgICBlcnJvclZhbHVlID0gZTEwID8gZTEwIDogbmV3IEVycm9yKCJTY2hlZHVsZWQgYWN0aW9uIHRocmV3IGZhbHN5IGVycm9yIik7CiAgICB9CiAgICBpZiAoZXJyb3JlZCkgewogICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICAgIHJldHVybiBlcnJvclZhbHVlOwogICAgfQogIH07CiAgQXN5bmNBY3Rpb24yLnByb3RvdHlwZS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKCkgewogICAgaWYgKCF0aGlzLmNsb3NlZCkgewogICAgICB2YXIgX2EyID0gdGhpcywgaWQgPSBfYTIuaWQsIHNjaGVkdWxlciA9IF9hMi5zY2hlZHVsZXI7CiAgICAgIHZhciBhY3Rpb25zID0gc2NoZWR1bGVyLmFjdGlvbnM7CiAgICAgIHRoaXMud29yayA9IHRoaXMuc3RhdGUgPSB0aGlzLnNjaGVkdWxlciA9IG51bGw7CiAgICAgIHRoaXMucGVuZGluZyA9IGZhbHNlOwogICAgICBhcnJSZW1vdmUoYWN0aW9ucywgdGhpcyk7CiAgICAgIGlmIChpZCAhPSBudWxsKSB7CiAgICAgICAgdGhpcy5pZCA9IHRoaXMucmVjeWNsZUFzeW5jSWQoc2NoZWR1bGVyLCBpZCwgbnVsbCk7CiAgICAgIH0KICAgICAgdGhpcy5kZWxheSA9IG51bGw7CiAgICAgIF9zdXBlci5wcm90b3R5cGUudW5zdWJzY3JpYmUuY2FsbCh0aGlzKTsKICAgIH0KICB9OwogIHJldHVybiBBc3luY0FjdGlvbjI7Cn0pKEFjdGlvbik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvU2NoZWR1bGVyLmpzCnZhciBTY2hlZHVsZXIgPSAoZnVuY3Rpb24oKSB7CiAgZnVuY3Rpb24gU2NoZWR1bGVyMihzY2hlZHVsZXJBY3Rpb25DdG9yLCBub3cyKSB7CiAgICBpZiAobm93MiA9PT0gdm9pZCAwKSB7CiAgICAgIG5vdzIgPSBTY2hlZHVsZXIyLm5vdzsKICAgIH0KICAgIHRoaXMuc2NoZWR1bGVyQWN0aW9uQ3RvciA9IHNjaGVkdWxlckFjdGlvbkN0b3I7CiAgICB0aGlzLm5vdyA9IG5vdzI7CiAgfQogIF9fbmFtZShTY2hlZHVsZXIyLCAiU2NoZWR1bGVyIik7CiAgU2NoZWR1bGVyMi5wcm90b3R5cGUuc2NoZWR1bGUgPSBmdW5jdGlvbih3b3JrLCBkZWxheTIsIHN0YXRlKSB7CiAgICBpZiAoZGVsYXkyID09PSB2b2lkIDApIHsKICAgICAgZGVsYXkyID0gMDsKICAgIH0KICAgIHJldHVybiBuZXcgdGhpcy5zY2hlZHVsZXJBY3Rpb25DdG9yKHRoaXMsIHdvcmspLnNjaGVkdWxlKHN0YXRlLCBkZWxheTIpOwogIH07CiAgU2NoZWR1bGVyMi5ub3cgPSBkYXRlVGltZXN0YW1wUHJvdmlkZXIubm93OwogIHJldHVybiBTY2hlZHVsZXIyOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlci9Bc3luY1NjaGVkdWxlci5qcwp2YXIgQXN5bmNTY2hlZHVsZXIgPSAoZnVuY3Rpb24oX3N1cGVyKSB7CiAgX19leHRlbmRzKEFzeW5jU2NoZWR1bGVyMiwgX3N1cGVyKTsKICBmdW5jdGlvbiBBc3luY1NjaGVkdWxlcjIoU2NoZWR1bGVyQWN0aW9uLCBub3cyKSB7CiAgICBpZiAobm93MiA9PT0gdm9pZCAwKSB7CiAgICAgIG5vdzIgPSBTY2hlZHVsZXIubm93OwogICAgfQogICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgU2NoZWR1bGVyQWN0aW9uLCBub3cyKSB8fCB0aGlzOwogICAgX3RoaXMuYWN0aW9ucyA9IFtdOwogICAgX3RoaXMuX2FjdGl2ZSA9IGZhbHNlOwogICAgcmV0dXJuIF90aGlzOwogIH0KICBfX25hbWUoQXN5bmNTY2hlZHVsZXIyLCAiQXN5bmNTY2hlZHVsZXIiKTsKICBBc3luY1NjaGVkdWxlcjIucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24oYWN0aW9uKSB7CiAgICB2YXIgYWN0aW9ucyA9IHRoaXMuYWN0aW9uczsKICAgIGlmICh0aGlzLl9hY3RpdmUpIHsKICAgICAgYWN0aW9ucy5wdXNoKGFjdGlvbik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHZhciBlcnJvcjsKICAgIHRoaXMuX2FjdGl2ZSA9IHRydWU7CiAgICBkbyB7CiAgICAgIGlmIChlcnJvciA9IGFjdGlvbi5leGVjdXRlKGFjdGlvbi5zdGF0ZSwgYWN0aW9uLmRlbGF5KSkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9IHdoaWxlIChhY3Rpb24gPSBhY3Rpb25zLnNoaWZ0KCkpOwogICAgdGhpcy5fYWN0aXZlID0gZmFsc2U7CiAgICBpZiAoZXJyb3IpIHsKICAgICAgd2hpbGUgKGFjdGlvbiA9IGFjdGlvbnMuc2hpZnQoKSkgewogICAgICAgIGFjdGlvbi51bnN1YnNjcmliZSgpOwogICAgICB9CiAgICAgIHRocm93IGVycm9yOwogICAgfQogIH07CiAgcmV0dXJuIEFzeW5jU2NoZWR1bGVyMjsKfSkoU2NoZWR1bGVyKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvYXN5bmMuanMKdmFyIGFzeW5jU2NoZWR1bGVyID0gbmV3IEFzeW5jU2NoZWR1bGVyKEFzeW5jQWN0aW9uKTsKdmFyIGFzeW5jID0gYXN5bmNTY2hlZHVsZXI7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9pc1NjaGVkdWxlci5qcwpmdW5jdGlvbiBpc1NjaGVkdWxlcih2YWx1ZTIpIHsKICByZXR1cm4gdmFsdWUyICYmIGlzRnVuY3Rpb24odmFsdWUyLnNjaGVkdWxlKTsKfQpfX25hbWUoaXNTY2hlZHVsZXIsICJpc1NjaGVkdWxlciIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvYXJncy5qcwpmdW5jdGlvbiBsYXN0KGFycikgewogIHJldHVybiBhcnJbYXJyLmxlbmd0aCAtIDFdOwp9Cl9fbmFtZShsYXN0LCAibGFzdCIpOwpmdW5jdGlvbiBwb3BSZXN1bHRTZWxlY3RvcihhcmdzKSB7CiAgcmV0dXJuIGlzRnVuY3Rpb24obGFzdChhcmdzKSkgPyBhcmdzLnBvcCgpIDogdm9pZCAwOwp9Cl9fbmFtZShwb3BSZXN1bHRTZWxlY3RvciwgInBvcFJlc3VsdFNlbGVjdG9yIik7CmZ1bmN0aW9uIHBvcFNjaGVkdWxlcihhcmdzKSB7CiAgcmV0dXJuIGlzU2NoZWR1bGVyKGxhc3QoYXJncykpID8gYXJncy5wb3AoKSA6IHZvaWQgMDsKfQpfX25hbWUocG9wU2NoZWR1bGVyLCAicG9wU2NoZWR1bGVyIik7CmZ1bmN0aW9uIHBvcE51bWJlcihhcmdzLCBkZWZhdWx0VmFsdWUpIHsKICByZXR1cm4gdHlwZW9mIGxhc3QoYXJncykgPT09ICJudW1iZXIiID8gYXJncy5wb3AoKSA6IGRlZmF1bHRWYWx1ZTsKfQpfX25hbWUocG9wTnVtYmVyLCAicG9wTnVtYmVyIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9pc0FycmF5TGlrZS5qcwp2YXIgaXNBcnJheUxpa2UgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChmdW5jdGlvbih4MykgewogIHJldHVybiB4MyAmJiB0eXBlb2YgeDMubGVuZ3RoID09PSAibnVtYmVyIiAmJiB0eXBlb2YgeDMgIT09ICJmdW5jdGlvbiI7Cn0pLCAiaXNBcnJheUxpa2UiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2lzUHJvbWlzZS5qcwpmdW5jdGlvbiBpc1Byb21pc2UodmFsdWUyKSB7CiAgcmV0dXJuIGlzRnVuY3Rpb24odmFsdWUyID09PSBudWxsIHx8IHZhbHVlMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdmFsdWUyLnRoZW4pOwp9Cl9fbmFtZShpc1Byb21pc2UsICJpc1Byb21pc2UiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2lzSW50ZXJvcE9ic2VydmFibGUuanMKZnVuY3Rpb24gaXNJbnRlcm9wT2JzZXJ2YWJsZShpbnB1dCkgewogIHJldHVybiBpc0Z1bmN0aW9uKGlucHV0W29ic2VydmFibGVdKTsKfQpfX25hbWUoaXNJbnRlcm9wT2JzZXJ2YWJsZSwgImlzSW50ZXJvcE9ic2VydmFibGUiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2lzQXN5bmNJdGVyYWJsZS5qcwpmdW5jdGlvbiBpc0FzeW5jSXRlcmFibGUob2JqKSB7CiAgcmV0dXJuIFN5bWJvbC5hc3luY0l0ZXJhdG9yICYmIGlzRnVuY3Rpb24ob2JqID09PSBudWxsIHx8IG9iaiA9PT0gdm9pZCAwID8gdm9pZCAwIDogb2JqW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSk7Cn0KX19uYW1lKGlzQXN5bmNJdGVyYWJsZSwgImlzQXN5bmNJdGVyYWJsZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvdGhyb3dVbm9ic2VydmFibGVFcnJvci5qcwpmdW5jdGlvbiBjcmVhdGVJbnZhbGlkT2JzZXJ2YWJsZVR5cGVFcnJvcihpbnB1dCkgewogIHJldHVybiBuZXcgVHlwZUVycm9yKCJZb3UgcHJvdmlkZWQgIiArIChpbnB1dCAhPT0gbnVsbCAmJiB0eXBlb2YgaW5wdXQgPT09ICJvYmplY3QiID8gImFuIGludmFsaWQgb2JqZWN0IiA6ICInIiArIGlucHV0ICsgIiciKSArICIgd2hlcmUgYSBzdHJlYW0gd2FzIGV4cGVjdGVkLiBZb3UgY2FuIHByb3ZpZGUgYW4gT2JzZXJ2YWJsZSwgUHJvbWlzZSwgUmVhZGFibGVTdHJlYW0sIEFycmF5LCBBc3luY0l0ZXJhYmxlLCBvciBJdGVyYWJsZS4iKTsKfQpfX25hbWUoY3JlYXRlSW52YWxpZE9ic2VydmFibGVUeXBlRXJyb3IsICJjcmVhdGVJbnZhbGlkT2JzZXJ2YWJsZVR5cGVFcnJvciIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3N5bWJvbC9pdGVyYXRvci5qcwpmdW5jdGlvbiBnZXRTeW1ib2xJdGVyYXRvcigpIHsKICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gImZ1bmN0aW9uIiB8fCAhU3ltYm9sLml0ZXJhdG9yKSB7CiAgICByZXR1cm4gIkBAaXRlcmF0b3IiOwogIH0KICByZXR1cm4gU3ltYm9sLml0ZXJhdG9yOwp9Cl9fbmFtZShnZXRTeW1ib2xJdGVyYXRvciwgImdldFN5bWJvbEl0ZXJhdG9yIik7CnZhciBpdGVyYXRvciA9IGdldFN5bWJvbEl0ZXJhdG9yKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9pc0l0ZXJhYmxlLmpzCmZ1bmN0aW9uIGlzSXRlcmFibGUoaW5wdXQpIHsKICByZXR1cm4gaXNGdW5jdGlvbihpbnB1dCA9PT0gbnVsbCB8fCBpbnB1dCA9PT0gdm9pZCAwID8gdm9pZCAwIDogaW5wdXRbaXRlcmF0b3JdKTsKfQpfX25hbWUoaXNJdGVyYWJsZSwgImlzSXRlcmFibGUiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2lzUmVhZGFibGVTdHJlYW1MaWtlLmpzCmZ1bmN0aW9uIHJlYWRhYmxlU3RyZWFtTGlrZVRvQXN5bmNHZW5lcmF0b3IocmVhZGFibGVTdHJlYW0pIHsKICByZXR1cm4gX19hc3luY0dlbmVyYXRvcih0aGlzLCBhcmd1bWVudHMsIC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gcmVhZGFibGVTdHJlYW1MaWtlVG9Bc3luY0dlbmVyYXRvcl8xKCkgewogICAgdmFyIHJlYWRlciwgX2EyLCB2YWx1ZTIsIGRvbmU7CiAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24oX2IpIHsKICAgICAgc3dpdGNoIChfYi5sYWJlbCkgewogICAgICAgIGNhc2UgMDoKICAgICAgICAgIHJlYWRlciA9IHJlYWRhYmxlU3RyZWFtLmdldFJlYWRlcigpOwogICAgICAgICAgX2IubGFiZWwgPSAxOwogICAgICAgIGNhc2UgMToKICAgICAgICAgIF9iLnRyeXMucHVzaChbMSwgLCA5LCAxMF0pOwogICAgICAgICAgX2IubGFiZWwgPSAyOwogICAgICAgIGNhc2UgMjoKICAgICAgICAgIGlmIChmYWxzZSkgcmV0dXJuIFszLCA4XTsKICAgICAgICAgIHJldHVybiBbNCwgX19hd2FpdChyZWFkZXIucmVhZCgpKV07CiAgICAgICAgY2FzZSAzOgogICAgICAgICAgX2EyID0gX2Iuc2VudCgpLCB2YWx1ZTIgPSBfYTIudmFsdWUsIGRvbmUgPSBfYTIuZG9uZTsKICAgICAgICAgIGlmICghZG9uZSkgcmV0dXJuIFszLCA1XTsKICAgICAgICAgIHJldHVybiBbNCwgX19hd2FpdCh2b2lkIDApXTsKICAgICAgICBjYXNlIDQ6CiAgICAgICAgICByZXR1cm4gWzIsIF9iLnNlbnQoKV07CiAgICAgICAgY2FzZSA1OgogICAgICAgICAgcmV0dXJuIFs0LCBfX2F3YWl0KHZhbHVlMildOwogICAgICAgIGNhc2UgNjoKICAgICAgICAgIHJldHVybiBbNCwgX2Iuc2VudCgpXTsKICAgICAgICBjYXNlIDc6CiAgICAgICAgICBfYi5zZW50KCk7CiAgICAgICAgICByZXR1cm4gWzMsIDJdOwogICAgICAgIGNhc2UgODoKICAgICAgICAgIHJldHVybiBbMywgMTBdOwogICAgICAgIGNhc2UgOToKICAgICAgICAgIHJlYWRlci5yZWxlYXNlTG9jaygpOwogICAgICAgICAgcmV0dXJuIFs3XTsKICAgICAgICBjYXNlIDEwOgogICAgICAgICAgcmV0dXJuIFsyXTsKICAgICAgfQogICAgfSk7CiAgfSwgInJlYWRhYmxlU3RyZWFtTGlrZVRvQXN5bmNHZW5lcmF0b3JfMSIpKTsKfQpfX25hbWUocmVhZGFibGVTdHJlYW1MaWtlVG9Bc3luY0dlbmVyYXRvciwgInJlYWRhYmxlU3RyZWFtTGlrZVRvQXN5bmNHZW5lcmF0b3IiKTsKZnVuY3Rpb24gaXNSZWFkYWJsZVN0cmVhbUxpa2Uob2JqKSB7CiAgcmV0dXJuIGlzRnVuY3Rpb24ob2JqID09PSBudWxsIHx8IG9iaiA9PT0gdm9pZCAwID8gdm9pZCAwIDogb2JqLmdldFJlYWRlcik7Cn0KX19uYW1lKGlzUmVhZGFibGVTdHJlYW1MaWtlLCAiaXNSZWFkYWJsZVN0cmVhbUxpa2UiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL2lubmVyRnJvbS5qcwpmdW5jdGlvbiBpbm5lckZyb20oaW5wdXQpIHsKICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB7CiAgICByZXR1cm4gaW5wdXQ7CiAgfQogIGlmIChpbnB1dCAhPSBudWxsKSB7CiAgICBpZiAoaXNJbnRlcm9wT2JzZXJ2YWJsZShpbnB1dCkpIHsKICAgICAgcmV0dXJuIGZyb21JbnRlcm9wT2JzZXJ2YWJsZShpbnB1dCk7CiAgICB9CiAgICBpZiAoaXNBcnJheUxpa2UoaW5wdXQpKSB7CiAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKGlucHV0KTsKICAgIH0KICAgIGlmIChpc1Byb21pc2UoaW5wdXQpKSB7CiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShpbnB1dCk7CiAgICB9CiAgICBpZiAoaXNBc3luY0l0ZXJhYmxlKGlucHV0KSkgewogICAgICByZXR1cm4gZnJvbUFzeW5jSXRlcmFibGUoaW5wdXQpOwogICAgfQogICAgaWYgKGlzSXRlcmFibGUoaW5wdXQpKSB7CiAgICAgIHJldHVybiBmcm9tSXRlcmFibGUoaW5wdXQpOwogICAgfQogICAgaWYgKGlzUmVhZGFibGVTdHJlYW1MaWtlKGlucHV0KSkgewogICAgICByZXR1cm4gZnJvbVJlYWRhYmxlU3RyZWFtTGlrZShpbnB1dCk7CiAgICB9CiAgfQogIHRocm93IGNyZWF0ZUludmFsaWRPYnNlcnZhYmxlVHlwZUVycm9yKGlucHV0KTsKfQpfX25hbWUoaW5uZXJGcm9tLCAiaW5uZXJGcm9tIik7CmZ1bmN0aW9uIGZyb21JbnRlcm9wT2JzZXJ2YWJsZShvYmopIHsKICByZXR1cm4gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgdmFyIG9icyA9IG9ialtvYnNlcnZhYmxlXSgpOwogICAgaWYgKGlzRnVuY3Rpb24ob2JzLnN1YnNjcmliZSkpIHsKICAgICAgcmV0dXJuIG9icy5zdWJzY3JpYmUoc3Vic2NyaWJlcik7CiAgICB9CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJQcm92aWRlZCBvYmplY3QgZG9lcyBub3QgY29ycmVjdGx5IGltcGxlbWVudCBTeW1ib2wub2JzZXJ2YWJsZSIpOwogIH0pOwp9Cl9fbmFtZShmcm9tSW50ZXJvcE9ic2VydmFibGUsICJmcm9tSW50ZXJvcE9ic2VydmFibGUiKTsKZnVuY3Rpb24gZnJvbUFycmF5TGlrZShhcnJheSkgewogIHJldHVybiBuZXcgT2JzZXJ2YWJsZShmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICBmb3IgKHZhciBpMTAgPSAwOyBpMTAgPCBhcnJheS5sZW5ndGggJiYgIXN1YnNjcmliZXIuY2xvc2VkOyBpMTArKykgewogICAgICBzdWJzY3JpYmVyLm5leHQoYXJyYXlbaTEwXSk7CiAgICB9CiAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgfSk7Cn0KX19uYW1lKGZyb21BcnJheUxpa2UsICJmcm9tQXJyYXlMaWtlIik7CmZ1bmN0aW9uIGZyb21Qcm9taXNlKHByb21pc2UpIHsKICByZXR1cm4gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKHZhbHVlMikgewogICAgICBpZiAoIXN1YnNjcmliZXIuY2xvc2VkKSB7CiAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlMik7CiAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgICB9CiAgICB9LCBmdW5jdGlvbihlcnIpIHsKICAgICAgcmV0dXJuIHN1YnNjcmliZXIuZXJyb3IoZXJyKTsKICAgIH0pLnRoZW4obnVsbCwgcmVwb3J0VW5oYW5kbGVkRXJyb3IpOwogIH0pOwp9Cl9fbmFtZShmcm9tUHJvbWlzZSwgImZyb21Qcm9taXNlIik7CmZ1bmN0aW9uIGZyb21JdGVyYWJsZShpdGVyYWJsZSkgewogIHJldHVybiBuZXcgT2JzZXJ2YWJsZShmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICB2YXIgZV8xLCBfYTI7CiAgICB0cnkgewogICAgICBmb3IgKHZhciBpdGVyYWJsZV8xID0gX192YWx1ZXMoaXRlcmFibGUpLCBpdGVyYWJsZV8xXzEgPSBpdGVyYWJsZV8xLm5leHQoKTsgIWl0ZXJhYmxlXzFfMS5kb25lOyBpdGVyYWJsZV8xXzEgPSBpdGVyYWJsZV8xLm5leHQoKSkgewogICAgICAgIHZhciB2YWx1ZTIgPSBpdGVyYWJsZV8xXzEudmFsdWU7CiAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlMik7CiAgICAgICAgaWYgKHN1YnNjcmliZXIuY2xvc2VkKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICB9CiAgICB9IGNhdGNoIChlXzFfMSkgewogICAgICBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OwogICAgfSBmaW5hbGx5IHsKICAgICAgdHJ5IHsKICAgICAgICBpZiAoaXRlcmFibGVfMV8xICYmICFpdGVyYWJsZV8xXzEuZG9uZSAmJiAoX2EyID0gaXRlcmFibGVfMS5yZXR1cm4pKSBfYTIuY2FsbChpdGVyYWJsZV8xKTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7CiAgICAgIH0KICAgIH0KICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICB9KTsKfQpfX25hbWUoZnJvbUl0ZXJhYmxlLCAiZnJvbUl0ZXJhYmxlIik7CmZ1bmN0aW9uIGZyb21Bc3luY0l0ZXJhYmxlKGFzeW5jSXRlcmFibGUpIHsKICByZXR1cm4gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgcHJvY2VzczIoYXN5bmNJdGVyYWJsZSwgc3Vic2NyaWJlcikuY2F0Y2goZnVuY3Rpb24oZXJyKSB7CiAgICAgIHJldHVybiBzdWJzY3JpYmVyLmVycm9yKGVycik7CiAgICB9KTsKICB9KTsKfQpfX25hbWUoZnJvbUFzeW5jSXRlcmFibGUsICJmcm9tQXN5bmNJdGVyYWJsZSIpOwpmdW5jdGlvbiBmcm9tUmVhZGFibGVTdHJlYW1MaWtlKHJlYWRhYmxlU3RyZWFtKSB7CiAgcmV0dXJuIGZyb21Bc3luY0l0ZXJhYmxlKHJlYWRhYmxlU3RyZWFtTGlrZVRvQXN5bmNHZW5lcmF0b3IocmVhZGFibGVTdHJlYW0pKTsKfQpfX25hbWUoZnJvbVJlYWRhYmxlU3RyZWFtTGlrZSwgImZyb21SZWFkYWJsZVN0cmVhbUxpa2UiKTsKZnVuY3Rpb24gcHJvY2VzczIoYXN5bmNJdGVyYWJsZSwgc3Vic2NyaWJlcikgewogIHZhciBhc3luY0l0ZXJhYmxlXzEsIGFzeW5jSXRlcmFibGVfMV8xOwogIHZhciBlXzIsIF9hMjsKICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbigpIHsKICAgIHZhciB2YWx1ZTIsIGVfMl8xOwogICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uKF9iKSB7CiAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHsKICAgICAgICBjYXNlIDA6CiAgICAgICAgICBfYi50cnlzLnB1c2goWzAsIDUsIDYsIDExXSk7CiAgICAgICAgICBhc3luY0l0ZXJhYmxlXzEgPSBfX2FzeW5jVmFsdWVzKGFzeW5jSXRlcmFibGUpOwogICAgICAgICAgX2IubGFiZWwgPSAxOwogICAgICAgIGNhc2UgMToKICAgICAgICAgIHJldHVybiBbNCwgYXN5bmNJdGVyYWJsZV8xLm5leHQoKV07CiAgICAgICAgY2FzZSAyOgogICAgICAgICAgaWYgKCEoYXN5bmNJdGVyYWJsZV8xXzEgPSBfYi5zZW50KCksICFhc3luY0l0ZXJhYmxlXzFfMS5kb25lKSkgcmV0dXJuIFszLCA0XTsKICAgICAgICAgIHZhbHVlMiA9IGFzeW5jSXRlcmFibGVfMV8xLnZhbHVlOwogICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlMik7CiAgICAgICAgICBpZiAoc3Vic2NyaWJlci5jbG9zZWQpIHsKICAgICAgICAgICAgcmV0dXJuIFsyXTsKICAgICAgICAgIH0KICAgICAgICAgIF9iLmxhYmVsID0gMzsKICAgICAgICBjYXNlIDM6CiAgICAgICAgICByZXR1cm4gWzMsIDFdOwogICAgICAgIGNhc2UgNDoKICAgICAgICAgIHJldHVybiBbMywgMTFdOwogICAgICAgIGNhc2UgNToKICAgICAgICAgIGVfMl8xID0gX2Iuc2VudCgpOwogICAgICAgICAgZV8yID0geyBlcnJvcjogZV8yXzEgfTsKICAgICAgICAgIHJldHVybiBbMywgMTFdOwogICAgICAgIGNhc2UgNjoKICAgICAgICAgIF9iLnRyeXMucHVzaChbNiwgLCA5LCAxMF0pOwogICAgICAgICAgaWYgKCEoYXN5bmNJdGVyYWJsZV8xXzEgJiYgIWFzeW5jSXRlcmFibGVfMV8xLmRvbmUgJiYgKF9hMiA9IGFzeW5jSXRlcmFibGVfMS5yZXR1cm4pKSkgcmV0dXJuIFszLCA4XTsKICAgICAgICAgIHJldHVybiBbNCwgX2EyLmNhbGwoYXN5bmNJdGVyYWJsZV8xKV07CiAgICAgICAgY2FzZSA3OgogICAgICAgICAgX2Iuc2VudCgpOwogICAgICAgICAgX2IubGFiZWwgPSA4OwogICAgICAgIGNhc2UgODoKICAgICAgICAgIHJldHVybiBbMywgMTBdOwogICAgICAgIGNhc2UgOToKICAgICAgICAgIGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjsKICAgICAgICAgIHJldHVybiBbN107CiAgICAgICAgY2FzZSAxMDoKICAgICAgICAgIHJldHVybiBbN107CiAgICAgICAgY2FzZSAxMToKICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICAgIHJldHVybiBbMl07CiAgICAgIH0KICAgIH0pOwogIH0pOwp9Cl9fbmFtZShwcm9jZXNzMiwgInByb2Nlc3MiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2V4ZWN1dGVTY2hlZHVsZS5qcwpmdW5jdGlvbiBleGVjdXRlU2NoZWR1bGUocGFyZW50U3Vic2NyaXB0aW9uLCBzY2hlZHVsZXIsIHdvcmssIGRlbGF5MiwgcmVwZWF0MykgewogIGlmIChkZWxheTIgPT09IHZvaWQgMCkgewogICAgZGVsYXkyID0gMDsKICB9CiAgaWYgKHJlcGVhdDMgPT09IHZvaWQgMCkgewogICAgcmVwZWF0MyA9IGZhbHNlOwogIH0KICB2YXIgc2NoZWR1bGVTdWJzY3JpcHRpb24gPSBzY2hlZHVsZXIuc2NoZWR1bGUoZnVuY3Rpb24oKSB7CiAgICB3b3JrKCk7CiAgICBpZiAocmVwZWF0MykgewogICAgICBwYXJlbnRTdWJzY3JpcHRpb24uYWRkKHRoaXMuc2NoZWR1bGUobnVsbCwgZGVsYXkyKSk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICB9CiAgfSwgZGVsYXkyKTsKICBwYXJlbnRTdWJzY3JpcHRpb24uYWRkKHNjaGVkdWxlU3Vic2NyaXB0aW9uKTsKICBpZiAoIXJlcGVhdDMpIHsKICAgIHJldHVybiBzY2hlZHVsZVN1YnNjcmlwdGlvbjsKICB9Cn0KX19uYW1lKGV4ZWN1dGVTY2hlZHVsZSwgImV4ZWN1dGVTY2hlZHVsZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9vYnNlcnZlT24uanMKZnVuY3Rpb24gb2JzZXJ2ZU9uKHNjaGVkdWxlciwgZGVsYXkyKSB7CiAgaWYgKGRlbGF5MiA9PT0gdm9pZCAwKSB7CiAgICBkZWxheTIgPSAwOwogIH0KICByZXR1cm4gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHsKICAgIHNvdXJjZS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlMikgewogICAgICByZXR1cm4gZXhlY3V0ZVNjaGVkdWxlKHN1YnNjcmliZXIsIHNjaGVkdWxlciwgZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHN1YnNjcmliZXIubmV4dCh2YWx1ZTIpOwogICAgICB9LCBkZWxheTIpOwogICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBleGVjdXRlU2NoZWR1bGUoc3Vic2NyaWJlciwgc2NoZWR1bGVyLCBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgICB9LCBkZWxheTIpOwogICAgfSwgZnVuY3Rpb24oZXJyKSB7CiAgICAgIHJldHVybiBleGVjdXRlU2NoZWR1bGUoc3Vic2NyaWJlciwgc2NoZWR1bGVyLCBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gc3Vic2NyaWJlci5lcnJvcihlcnIpOwogICAgICB9LCBkZWxheTIpOwogICAgfSkpOwogIH0pOwp9Cl9fbmFtZShvYnNlcnZlT24sICJvYnNlcnZlT24iKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvc3Vic2NyaWJlT24uanMKZnVuY3Rpb24gc3Vic2NyaWJlT24oc2NoZWR1bGVyLCBkZWxheTIpIHsKICBpZiAoZGVsYXkyID09PSB2b2lkIDApIHsKICAgIGRlbGF5MiA9IDA7CiAgfQogIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgc3Vic2NyaWJlci5hZGQoc2NoZWR1bGVyLnNjaGVkdWxlKGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShzdWJzY3JpYmVyKTsKICAgIH0sIGRlbGF5MikpOwogIH0pOwp9Cl9fbmFtZShzdWJzY3JpYmVPbiwgInN1YnNjcmliZU9uIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVkL3NjaGVkdWxlT2JzZXJ2YWJsZS5qcwpmdW5jdGlvbiBzY2hlZHVsZU9ic2VydmFibGUoaW5wdXQsIHNjaGVkdWxlcikgewogIHJldHVybiBpbm5lckZyb20oaW5wdXQpLnBpcGUoc3Vic2NyaWJlT24oc2NoZWR1bGVyKSwgb2JzZXJ2ZU9uKHNjaGVkdWxlcikpOwp9Cl9fbmFtZShzY2hlZHVsZU9ic2VydmFibGUsICJzY2hlZHVsZU9ic2VydmFibGUiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZWQvc2NoZWR1bGVQcm9taXNlLmpzCmZ1bmN0aW9uIHNjaGVkdWxlUHJvbWlzZShpbnB1dCwgc2NoZWR1bGVyKSB7CiAgcmV0dXJuIGlubmVyRnJvbShpbnB1dCkucGlwZShzdWJzY3JpYmVPbihzY2hlZHVsZXIpLCBvYnNlcnZlT24oc2NoZWR1bGVyKSk7Cn0KX19uYW1lKHNjaGVkdWxlUHJvbWlzZSwgInNjaGVkdWxlUHJvbWlzZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlZC9zY2hlZHVsZUFycmF5LmpzCmZ1bmN0aW9uIHNjaGVkdWxlQXJyYXkoaW5wdXQsIHNjaGVkdWxlcikgewogIHJldHVybiBuZXcgT2JzZXJ2YWJsZShmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICB2YXIgaTEwID0gMDsKICAgIHJldHVybiBzY2hlZHVsZXIuc2NoZWR1bGUoZnVuY3Rpb24oKSB7CiAgICAgIGlmIChpMTAgPT09IGlucHV0Lmxlbmd0aCkgewogICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdWJzY3JpYmVyLm5leHQoaW5wdXRbaTEwKytdKTsKICAgICAgICBpZiAoIXN1YnNjcmliZXIuY2xvc2VkKSB7CiAgICAgICAgICB0aGlzLnNjaGVkdWxlKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICB9KTsKfQpfX25hbWUoc2NoZWR1bGVBcnJheSwgInNjaGVkdWxlQXJyYXkiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZWQvc2NoZWR1bGVJdGVyYWJsZS5qcwpmdW5jdGlvbiBzY2hlZHVsZUl0ZXJhYmxlKGlucHV0LCBzY2hlZHVsZXIpIHsKICByZXR1cm4gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgdmFyIGl0ZXJhdG9yMjsKICAgIGV4ZWN1dGVTY2hlZHVsZShzdWJzY3JpYmVyLCBzY2hlZHVsZXIsIGZ1bmN0aW9uKCkgewogICAgICBpdGVyYXRvcjIgPSBpbnB1dFtpdGVyYXRvcl0oKTsKICAgICAgZXhlY3V0ZVNjaGVkdWxlKHN1YnNjcmliZXIsIHNjaGVkdWxlciwgZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIF9hMjsKICAgICAgICB2YXIgdmFsdWUyOwogICAgICAgIHZhciBkb25lOwogICAgICAgIHRyeSB7CiAgICAgICAgICBfYTIgPSBpdGVyYXRvcjIubmV4dCgpLCB2YWx1ZTIgPSBfYTIudmFsdWUsIGRvbmUgPSBfYTIuZG9uZTsKICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IoZXJyKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKGRvbmUpIHsKICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlMik7CiAgICAgICAgfQogICAgICB9LCAwLCB0cnVlKTsKICAgIH0pOwogICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gaXNGdW5jdGlvbihpdGVyYXRvcjIgPT09IG51bGwgfHwgaXRlcmF0b3IyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBpdGVyYXRvcjIucmV0dXJuKSAmJiBpdGVyYXRvcjIucmV0dXJuKCk7CiAgICB9OwogIH0pOwp9Cl9fbmFtZShzY2hlZHVsZUl0ZXJhYmxlLCAic2NoZWR1bGVJdGVyYWJsZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlZC9zY2hlZHVsZUFzeW5jSXRlcmFibGUuanMKZnVuY3Rpb24gc2NoZWR1bGVBc3luY0l0ZXJhYmxlKGlucHV0LCBzY2hlZHVsZXIpIHsKICBpZiAoIWlucHV0KSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoIkl0ZXJhYmxlIGNhbm5vdCBiZSBudWxsIik7CiAgfQogIHJldHVybiBuZXcgT2JzZXJ2YWJsZShmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICBleGVjdXRlU2NoZWR1bGUoc3Vic2NyaWJlciwgc2NoZWR1bGVyLCBmdW5jdGlvbigpIHsKICAgICAgdmFyIGl0ZXJhdG9yMiA9IGlucHV0W1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpOwogICAgICBleGVjdXRlU2NoZWR1bGUoc3Vic2NyaWJlciwgc2NoZWR1bGVyLCBmdW5jdGlvbigpIHsKICAgICAgICBpdGVyYXRvcjIubmV4dCgpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHsKICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHJlc3VsdC52YWx1ZSk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0sIDAsIHRydWUpOwogICAgfSk7CiAgfSk7Cn0KX19uYW1lKHNjaGVkdWxlQXN5bmNJdGVyYWJsZSwgInNjaGVkdWxlQXN5bmNJdGVyYWJsZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlZC9zY2hlZHVsZVJlYWRhYmxlU3RyZWFtTGlrZS5qcwpmdW5jdGlvbiBzY2hlZHVsZVJlYWRhYmxlU3RyZWFtTGlrZShpbnB1dCwgc2NoZWR1bGVyKSB7CiAgcmV0dXJuIHNjaGVkdWxlQXN5bmNJdGVyYWJsZShyZWFkYWJsZVN0cmVhbUxpa2VUb0FzeW5jR2VuZXJhdG9yKGlucHV0KSwgc2NoZWR1bGVyKTsKfQpfX25hbWUoc2NoZWR1bGVSZWFkYWJsZVN0cmVhbUxpa2UsICJzY2hlZHVsZVJlYWRhYmxlU3RyZWFtTGlrZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlZC9zY2hlZHVsZWQuanMKZnVuY3Rpb24gc2NoZWR1bGVkKGlucHV0LCBzY2hlZHVsZXIpIHsKICBpZiAoaW5wdXQgIT0gbnVsbCkgewogICAgaWYgKGlzSW50ZXJvcE9ic2VydmFibGUoaW5wdXQpKSB7CiAgICAgIHJldHVybiBzY2hlZHVsZU9ic2VydmFibGUoaW5wdXQsIHNjaGVkdWxlcik7CiAgICB9CiAgICBpZiAoaXNBcnJheUxpa2UoaW5wdXQpKSB7CiAgICAgIHJldHVybiBzY2hlZHVsZUFycmF5KGlucHV0LCBzY2hlZHVsZXIpOwogICAgfQogICAgaWYgKGlzUHJvbWlzZShpbnB1dCkpIHsKICAgICAgcmV0dXJuIHNjaGVkdWxlUHJvbWlzZShpbnB1dCwgc2NoZWR1bGVyKTsKICAgIH0KICAgIGlmIChpc0FzeW5jSXRlcmFibGUoaW5wdXQpKSB7CiAgICAgIHJldHVybiBzY2hlZHVsZUFzeW5jSXRlcmFibGUoaW5wdXQsIHNjaGVkdWxlcik7CiAgICB9CiAgICBpZiAoaXNJdGVyYWJsZShpbnB1dCkpIHsKICAgICAgcmV0dXJuIHNjaGVkdWxlSXRlcmFibGUoaW5wdXQsIHNjaGVkdWxlcik7CiAgICB9CiAgICBpZiAoaXNSZWFkYWJsZVN0cmVhbUxpa2UoaW5wdXQpKSB7CiAgICAgIHJldHVybiBzY2hlZHVsZVJlYWRhYmxlU3RyZWFtTGlrZShpbnB1dCwgc2NoZWR1bGVyKTsKICAgIH0KICB9CiAgdGhyb3cgY3JlYXRlSW52YWxpZE9ic2VydmFibGVUeXBlRXJyb3IoaW5wdXQpOwp9Cl9fbmFtZShzY2hlZHVsZWQsICJzY2hlZHVsZWQiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL2Zyb20uanMKZnVuY3Rpb24gZnJvbShpbnB1dCwgc2NoZWR1bGVyKSB7CiAgcmV0dXJuIHNjaGVkdWxlciA/IHNjaGVkdWxlZChpbnB1dCwgc2NoZWR1bGVyKSA6IGlubmVyRnJvbShpbnB1dCk7Cn0KX19uYW1lKGZyb20sICJmcm9tIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9vZi5qcwpmdW5jdGlvbiBvZigpIHsKICB2YXIgYXJncyA9IFtdOwogIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07CiAgfQogIHZhciBzY2hlZHVsZXIgPSBwb3BTY2hlZHVsZXIoYXJncyk7CiAgcmV0dXJuIGZyb20oYXJncywgc2NoZWR1bGVyKTsKfQpfX25hbWUob2YsICJvZiIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvaXNEYXRlLmpzCmZ1bmN0aW9uIGlzVmFsaWREYXRlKHZhbHVlMikgewogIHJldHVybiB2YWx1ZTIgaW5zdGFuY2VvZiBEYXRlICYmICFpc05hTih2YWx1ZTIpOwp9Cl9fbmFtZShpc1ZhbGlkRGF0ZSwgImlzVmFsaWREYXRlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL21hcC5qcwpmdW5jdGlvbiBtYXAyKHByb2plY3QsIHRoaXNBcmcpIHsKICByZXR1cm4gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHsKICAgIHZhciBpbmRleDIgPSAwOwogICAgc291cmNlLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUyKSB7CiAgICAgIHN1YnNjcmliZXIubmV4dChwcm9qZWN0LmNhbGwodGhpc0FyZywgdmFsdWUyLCBpbmRleDIrKykpOwogICAgfSkpOwogIH0pOwp9Cl9fbmFtZShtYXAyLCAibWFwIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9tYXBPbmVPck1hbnlBcmdzLmpzCnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTsKZnVuY3Rpb24gY2FsbE9yQXBwbHkoZm4sIGFyZ3MpIHsKICByZXR1cm4gaXNBcnJheShhcmdzKSA/IGZuLmFwcGx5KHZvaWQgMCwgX19zcHJlYWRBcnJheShbXSwgX19yZWFkKGFyZ3MpKSkgOiBmbihhcmdzKTsKfQpfX25hbWUoY2FsbE9yQXBwbHksICJjYWxsT3JBcHBseSIpOwpmdW5jdGlvbiBtYXBPbmVPck1hbnlBcmdzKGZuKSB7CiAgcmV0dXJuIG1hcDIoZnVuY3Rpb24oYXJncykgewogICAgcmV0dXJuIGNhbGxPckFwcGx5KGZuLCBhcmdzKTsKICB9KTsKfQpfX25hbWUobWFwT25lT3JNYW55QXJncywgIm1hcE9uZU9yTWFueUFyZ3MiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2FyZ3NBcmdBcnJheU9yT2JqZWN0LmpzCnZhciBpc0FycmF5MiA9IEFycmF5LmlzQXJyYXk7CnZhciBnZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiwgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlLCBnZXRLZXlzID0gT2JqZWN0LmtleXM7CmZ1bmN0aW9uIGFyZ3NBcmdBcnJheU9yT2JqZWN0KGFyZ3MpIHsKICBpZiAoYXJncy5sZW5ndGggPT09IDEpIHsKICAgIHZhciBmaXJzdF8xID0gYXJnc1swXTsKICAgIGlmIChpc0FycmF5MihmaXJzdF8xKSkgewogICAgICByZXR1cm4geyBhcmdzOiBmaXJzdF8xLCBrZXlzOiBudWxsIH07CiAgICB9CiAgICBpZiAoaXNQT0pPKGZpcnN0XzEpKSB7CiAgICAgIHZhciBrZXlzMiA9IGdldEtleXMoZmlyc3RfMSk7CiAgICAgIHJldHVybiB7CiAgICAgICAgYXJnczoga2V5czIubWFwKGZ1bmN0aW9uKGtleTIpIHsKICAgICAgICAgIHJldHVybiBmaXJzdF8xW2tleTJdOwogICAgICAgIH0pLAogICAgICAgIGtleXM6IGtleXMyCiAgICAgIH07CiAgICB9CiAgfQogIHJldHVybiB7IGFyZ3MsIGtleXM6IG51bGwgfTsKfQpfX25hbWUoYXJnc0FyZ0FycmF5T3JPYmplY3QsICJhcmdzQXJnQXJyYXlPck9iamVjdCIpOwpmdW5jdGlvbiBpc1BPSk8ob2JqKSB7CiAgcmV0dXJuIG9iaiAmJiB0eXBlb2Ygb2JqID09PSAib2JqZWN0IiAmJiBnZXRQcm90b3R5cGVPZihvYmopID09PSBvYmplY3RQcm90bzsKfQpfX25hbWUoaXNQT0pPLCAiaXNQT0pPIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9jcmVhdGVPYmplY3QuanMKZnVuY3Rpb24gY3JlYXRlT2JqZWN0KGtleXMyLCB2YWx1ZXMpIHsKICByZXR1cm4ga2V5czIucmVkdWNlKGZ1bmN0aW9uKHJlc3VsdCwga2V5MiwgaTEwKSB7CiAgICByZXR1cm4gcmVzdWx0W2tleTJdID0gdmFsdWVzW2kxMF0sIHJlc3VsdDsKICB9LCB7fSk7Cn0KX19uYW1lKGNyZWF0ZU9iamVjdCwgImNyZWF0ZU9iamVjdCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvY29tYmluZUxhdGVzdC5qcwpmdW5jdGlvbiBjb21iaW5lTGF0ZXN0KCkgewogIHZhciBhcmdzID0gW107CiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTsKICB9CiAgdmFyIHNjaGVkdWxlciA9IHBvcFNjaGVkdWxlcihhcmdzKTsKICB2YXIgcmVzdWx0U2VsZWN0b3IgPSBwb3BSZXN1bHRTZWxlY3RvcihhcmdzKTsKICB2YXIgX2EyID0gYXJnc0FyZ0FycmF5T3JPYmplY3QoYXJncyksIG9ic2VydmFibGVzID0gX2EyLmFyZ3MsIGtleXMyID0gX2EyLmtleXM7CiAgaWYgKG9ic2VydmFibGVzLmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuIGZyb20oW10sIHNjaGVkdWxlcik7CiAgfQogIHZhciByZXN1bHQgPSBuZXcgT2JzZXJ2YWJsZShjb21iaW5lTGF0ZXN0SW5pdChvYnNlcnZhYmxlcywgc2NoZWR1bGVyLCBrZXlzMiA/IGZ1bmN0aW9uKHZhbHVlcykgewogICAgcmV0dXJuIGNyZWF0ZU9iamVjdChrZXlzMiwgdmFsdWVzKTsKICB9IDogaWRlbnRpdHkpKTsKICByZXR1cm4gcmVzdWx0U2VsZWN0b3IgPyByZXN1bHQucGlwZShtYXBPbmVPck1hbnlBcmdzKHJlc3VsdFNlbGVjdG9yKSkgOiByZXN1bHQ7Cn0KX19uYW1lKGNvbWJpbmVMYXRlc3QsICJjb21iaW5lTGF0ZXN0Iik7CmZ1bmN0aW9uIGNvbWJpbmVMYXRlc3RJbml0KG9ic2VydmFibGVzLCBzY2hlZHVsZXIsIHZhbHVlVHJhbnNmb3JtKSB7CiAgaWYgKHZhbHVlVHJhbnNmb3JtID09PSB2b2lkIDApIHsKICAgIHZhbHVlVHJhbnNmb3JtID0gaWRlbnRpdHk7CiAgfQogIHJldHVybiBmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICBtYXliZVNjaGVkdWxlKHNjaGVkdWxlciwgZnVuY3Rpb24oKSB7CiAgICAgIHZhciBsZW5ndGggPSBvYnNlcnZhYmxlcy5sZW5ndGg7CiAgICAgIHZhciB2YWx1ZXMgPSBuZXcgQXJyYXkobGVuZ3RoKTsKICAgICAgdmFyIGFjdGl2ZSA9IGxlbmd0aDsKICAgICAgdmFyIHJlbWFpbmluZ0ZpcnN0VmFsdWVzID0gbGVuZ3RoOwogICAgICB2YXIgX2xvb3BfMSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oaTExKSB7CiAgICAgICAgbWF5YmVTY2hlZHVsZShzY2hlZHVsZXIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgdmFyIHNvdXJjZSA9IGZyb20ob2JzZXJ2YWJsZXNbaTExXSwgc2NoZWR1bGVyKTsKICAgICAgICAgIHZhciBoYXNGaXJzdFZhbHVlID0gZmFsc2U7CiAgICAgICAgICBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZTIpIHsKICAgICAgICAgICAgdmFsdWVzW2kxMV0gPSB2YWx1ZTI7CiAgICAgICAgICAgIGlmICghaGFzRmlyc3RWYWx1ZSkgewogICAgICAgICAgICAgIGhhc0ZpcnN0VmFsdWUgPSB0cnVlOwogICAgICAgICAgICAgIHJlbWFpbmluZ0ZpcnN0VmFsdWVzLS07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFyZW1haW5pbmdGaXJzdFZhbHVlcykgewogICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dCh2YWx1ZVRyYW5zZm9ybSh2YWx1ZXMuc2xpY2UoKSkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgaWYgKCEtLWFjdGl2ZSkgewogICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSkpOwogICAgICAgIH0sIHN1YnNjcmliZXIpOwogICAgICB9LCAiX2xvb3BfMSIpOwogICAgICBmb3IgKHZhciBpMTAgPSAwOyBpMTAgPCBsZW5ndGg7IGkxMCsrKSB7CiAgICAgICAgX2xvb3BfMShpMTApOwogICAgICB9CiAgICB9LCBzdWJzY3JpYmVyKTsKICB9Owp9Cl9fbmFtZShjb21iaW5lTGF0ZXN0SW5pdCwgImNvbWJpbmVMYXRlc3RJbml0Iik7CmZ1bmN0aW9uIG1heWJlU2NoZWR1bGUoc2NoZWR1bGVyLCBleGVjdXRlLCBzdWJzY3JpcHRpb24pIHsKICBpZiAoc2NoZWR1bGVyKSB7CiAgICBleGVjdXRlU2NoZWR1bGUoc3Vic2NyaXB0aW9uLCBzY2hlZHVsZXIsIGV4ZWN1dGUpOwogIH0gZWxzZSB7CiAgICBleGVjdXRlKCk7CiAgfQp9Cl9fbmFtZShtYXliZVNjaGVkdWxlLCAibWF5YmVTY2hlZHVsZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9tZXJnZUludGVybmFscy5qcwpmdW5jdGlvbiBtZXJnZUludGVybmFscyhzb3VyY2UsIHN1YnNjcmliZXIsIHByb2plY3QsIGNvbmN1cnJlbnQsIG9uQmVmb3JlTmV4dCwgZXhwYW5kMiwgaW5uZXJTdWJTY2hlZHVsZXIsIGFkZGl0aW9uYWxGaW5hbGl6ZXIpIHsKICB2YXIgYnVmZmVyMiA9IFtdOwogIHZhciBhY3RpdmUgPSAwOwogIHZhciBpbmRleDIgPSAwOwogIHZhciBpc0NvbXBsZXRlID0gZmFsc2U7CiAgdmFyIGNoZWNrQ29tcGxldGUgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCkgewogICAgaWYgKGlzQ29tcGxldGUgJiYgIWJ1ZmZlcjIubGVuZ3RoICYmICFhY3RpdmUpIHsKICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgfQogIH0sICJjaGVja0NvbXBsZXRlIik7CiAgdmFyIG91dGVyTmV4dCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24odmFsdWUyKSB7CiAgICByZXR1cm4gYWN0aXZlIDwgY29uY3VycmVudCA/IGRvSW5uZXJTdWIodmFsdWUyKSA6IGJ1ZmZlcjIucHVzaCh2YWx1ZTIpOwogIH0sICJvdXRlck5leHQiKTsKICB2YXIgZG9Jbm5lclN1YiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24odmFsdWUyKSB7CiAgICBleHBhbmQyICYmIHN1YnNjcmliZXIubmV4dCh2YWx1ZTIpOwogICAgYWN0aXZlKys7CiAgICB2YXIgaW5uZXJDb21wbGV0ZSA9IGZhbHNlOwogICAgaW5uZXJGcm9tKHByb2plY3QodmFsdWUyLCBpbmRleDIrKykpLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24oaW5uZXJWYWx1ZSkgewogICAgICBvbkJlZm9yZU5leHQgPT09IG51bGwgfHwgb25CZWZvcmVOZXh0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJlZm9yZU5leHQoaW5uZXJWYWx1ZSk7CiAgICAgIGlmIChleHBhbmQyKSB7CiAgICAgICAgb3V0ZXJOZXh0KGlubmVyVmFsdWUpOwogICAgICB9IGVsc2UgewogICAgICAgIHN1YnNjcmliZXIubmV4dChpbm5lclZhbHVlKTsKICAgICAgfQogICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgIGlubmVyQ29tcGxldGUgPSB0cnVlOwogICAgfSwgdm9pZCAwLCBmdW5jdGlvbigpIHsKICAgICAgaWYgKGlubmVyQ29tcGxldGUpIHsKICAgICAgICB0cnkgewogICAgICAgICAgYWN0aXZlLS07CiAgICAgICAgICB2YXIgX2xvb3BfMSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBidWZmZXJlZFZhbHVlID0gYnVmZmVyMi5zaGlmdCgpOwogICAgICAgICAgICBpZiAoaW5uZXJTdWJTY2hlZHVsZXIpIHsKICAgICAgICAgICAgICBleGVjdXRlU2NoZWR1bGUoc3Vic2NyaWJlciwgaW5uZXJTdWJTY2hlZHVsZXIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGRvSW5uZXJTdWIoYnVmZmVyZWRWYWx1ZSk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgZG9Jbm5lclN1YihidWZmZXJlZFZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgIl9sb29wXzEiKTsKICAgICAgICAgIHdoaWxlIChidWZmZXIyLmxlbmd0aCAmJiBhY3RpdmUgPCBjb25jdXJyZW50KSB7CiAgICAgICAgICAgIF9sb29wXzEoKTsKICAgICAgICAgIH0KICAgICAgICAgIGNoZWNrQ29tcGxldGUoKTsKICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IoZXJyKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pKTsKICB9LCAiZG9Jbm5lclN1YiIpOwogIHNvdXJjZS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIG91dGVyTmV4dCwgZnVuY3Rpb24oKSB7CiAgICBpc0NvbXBsZXRlID0gdHJ1ZTsKICAgIGNoZWNrQ29tcGxldGUoKTsKICB9KSk7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgYWRkaXRpb25hbEZpbmFsaXplciA9PT0gbnVsbCB8fCBhZGRpdGlvbmFsRmluYWxpemVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhZGRpdGlvbmFsRmluYWxpemVyKCk7CiAgfTsKfQpfX25hbWUobWVyZ2VJbnRlcm5hbHMsICJtZXJnZUludGVybmFscyIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9tZXJnZU1hcC5qcwpmdW5jdGlvbiBtZXJnZU1hcChwcm9qZWN0LCByZXN1bHRTZWxlY3RvciwgY29uY3VycmVudCkgewogIGlmIChjb25jdXJyZW50ID09PSB2b2lkIDApIHsKICAgIGNvbmN1cnJlbnQgPSBJbmZpbml0eTsKICB9CiAgaWYgKGlzRnVuY3Rpb24ocmVzdWx0U2VsZWN0b3IpKSB7CiAgICByZXR1cm4gbWVyZ2VNYXAoZnVuY3Rpb24oYTQsIGkxMCkgewogICAgICByZXR1cm4gbWFwMihmdW5jdGlvbihiNCwgaWkpIHsKICAgICAgICByZXR1cm4gcmVzdWx0U2VsZWN0b3IoYTQsIGI0LCBpMTAsIGlpKTsKICAgICAgfSkoaW5uZXJGcm9tKHByb2plY3QoYTQsIGkxMCkpKTsKICAgIH0sIGNvbmN1cnJlbnQpOwogIH0gZWxzZSBpZiAodHlwZW9mIHJlc3VsdFNlbGVjdG9yID09PSAibnVtYmVyIikgewogICAgY29uY3VycmVudCA9IHJlc3VsdFNlbGVjdG9yOwogIH0KICByZXR1cm4gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHsKICAgIHJldHVybiBtZXJnZUludGVybmFscyhzb3VyY2UsIHN1YnNjcmliZXIsIHByb2plY3QsIGNvbmN1cnJlbnQpOwogIH0pOwp9Cl9fbmFtZShtZXJnZU1hcCwgIm1lcmdlTWFwIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL21lcmdlQWxsLmpzCmZ1bmN0aW9uIG1lcmdlQWxsKGNvbmN1cnJlbnQpIHsKICBpZiAoY29uY3VycmVudCA9PT0gdm9pZCAwKSB7CiAgICBjb25jdXJyZW50ID0gSW5maW5pdHk7CiAgfQogIHJldHVybiBtZXJnZU1hcChpZGVudGl0eSwgY29uY3VycmVudCk7Cn0KX19uYW1lKG1lcmdlQWxsLCAibWVyZ2VBbGwiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvY29uY2F0QWxsLmpzCmZ1bmN0aW9uIGNvbmNhdEFsbCgpIHsKICByZXR1cm4gbWVyZ2VBbGwoMSk7Cn0KX19uYW1lKGNvbmNhdEFsbCwgImNvbmNhdEFsbCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvY29uY2F0LmpzCmZ1bmN0aW9uIGNvbmNhdCgpIHsKICB2YXIgYXJncyA9IFtdOwogIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07CiAgfQogIHJldHVybiBjb25jYXRBbGwoKShmcm9tKGFyZ3MsIHBvcFNjaGVkdWxlcihhcmdzKSkpOwp9Cl9fbmFtZShjb25jYXQsICJjb25jYXQiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL2Zyb21FdmVudC5qcwp2YXIgbm9kZUV2ZW50RW1pdHRlck1ldGhvZHMgPSBbImFkZExpc3RlbmVyIiwgInJlbW92ZUxpc3RlbmVyIl07CnZhciBldmVudFRhcmdldE1ldGhvZHMgPSBbImFkZEV2ZW50TGlzdGVuZXIiLCAicmVtb3ZlRXZlbnRMaXN0ZW5lciJdOwp2YXIganF1ZXJ5TWV0aG9kcyA9IFsib24iLCAib2ZmIl07CmZ1bmN0aW9uIGZyb21FdmVudCh0YXJnZXQsIGV2ZW50TmFtZSwgb3B0aW9ucywgcmVzdWx0U2VsZWN0b3IpIHsKICBpZiAoaXNGdW5jdGlvbihvcHRpb25zKSkgewogICAgcmVzdWx0U2VsZWN0b3IgPSBvcHRpb25zOwogICAgb3B0aW9ucyA9IHZvaWQgMDsKICB9CiAgaWYgKHJlc3VsdFNlbGVjdG9yKSB7CiAgICByZXR1cm4gZnJvbUV2ZW50KHRhcmdldCwgZXZlbnROYW1lLCBvcHRpb25zKS5waXBlKG1hcE9uZU9yTWFueUFyZ3MocmVzdWx0U2VsZWN0b3IpKTsKICB9CiAgdmFyIF9hMiA9IF9fcmVhZChpc0V2ZW50VGFyZ2V0KHRhcmdldCkgPyBldmVudFRhcmdldE1ldGhvZHMubWFwKGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHsKICAgIHJldHVybiBmdW5jdGlvbihoYW5kbGVyMikgewogICAgICByZXR1cm4gdGFyZ2V0W21ldGhvZE5hbWVdKGV2ZW50TmFtZSwgaGFuZGxlcjIsIG9wdGlvbnMpOwogICAgfTsKICB9KSA6IGlzTm9kZVN0eWxlRXZlbnRFbWl0dGVyKHRhcmdldCkgPyBub2RlRXZlbnRFbWl0dGVyTWV0aG9kcy5tYXAodG9Db21tb25IYW5kbGVyUmVnaXN0cnkodGFyZ2V0LCBldmVudE5hbWUpKSA6IGlzSlF1ZXJ5U3R5bGVFdmVudEVtaXR0ZXIodGFyZ2V0KSA/IGpxdWVyeU1ldGhvZHMubWFwKHRvQ29tbW9uSGFuZGxlclJlZ2lzdHJ5KHRhcmdldCwgZXZlbnROYW1lKSkgOiBbXSwgMiksIGFkZDIgPSBfYTJbMF0sIHJlbW92ZTIgPSBfYTJbMV07CiAgaWYgKCFhZGQyKSB7CiAgICBpZiAoaXNBcnJheUxpa2UodGFyZ2V0KSkgewogICAgICByZXR1cm4gbWVyZ2VNYXAoZnVuY3Rpb24oc3ViVGFyZ2V0KSB7CiAgICAgICAgcmV0dXJuIGZyb21FdmVudChzdWJUYXJnZXQsIGV2ZW50TmFtZSwgb3B0aW9ucyk7CiAgICAgIH0pKGlubmVyRnJvbSh0YXJnZXQpKTsKICAgIH0KICB9CiAgaWYgKCFhZGQyKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGV2ZW50IHRhcmdldCIpOwogIH0KICByZXR1cm4gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgdmFyIGhhbmRsZXIyID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHsKICAgICAgdmFyIGFyZ3MgPSBbXTsKICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07CiAgICAgIH0KICAgICAgcmV0dXJuIHN1YnNjcmliZXIubmV4dCgxIDwgYXJncy5sZW5ndGggPyBhcmdzIDogYXJnc1swXSk7CiAgICB9LCAiaGFuZGxlciIpOwogICAgYWRkMihoYW5kbGVyMik7CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiByZW1vdmUyKGhhbmRsZXIyKTsKICAgIH07CiAgfSk7Cn0KX19uYW1lKGZyb21FdmVudCwgImZyb21FdmVudCIpOwpmdW5jdGlvbiB0b0NvbW1vbkhhbmRsZXJSZWdpc3RyeSh0YXJnZXQsIGV2ZW50TmFtZSkgewogIHJldHVybiBmdW5jdGlvbihtZXRob2ROYW1lKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oaGFuZGxlcjIpIHsKICAgICAgcmV0dXJuIHRhcmdldFttZXRob2ROYW1lXShldmVudE5hbWUsIGhhbmRsZXIyKTsKICAgIH07CiAgfTsKfQpfX25hbWUodG9Db21tb25IYW5kbGVyUmVnaXN0cnksICJ0b0NvbW1vbkhhbmRsZXJSZWdpc3RyeSIpOwpmdW5jdGlvbiBpc05vZGVTdHlsZUV2ZW50RW1pdHRlcih0YXJnZXQpIHsKICByZXR1cm4gaXNGdW5jdGlvbih0YXJnZXQuYWRkTGlzdGVuZXIpICYmIGlzRnVuY3Rpb24odGFyZ2V0LnJlbW92ZUxpc3RlbmVyKTsKfQpfX25hbWUoaXNOb2RlU3R5bGVFdmVudEVtaXR0ZXIsICJpc05vZGVTdHlsZUV2ZW50RW1pdHRlciIpOwpmdW5jdGlvbiBpc0pRdWVyeVN0eWxlRXZlbnRFbWl0dGVyKHRhcmdldCkgewogIHJldHVybiBpc0Z1bmN0aW9uKHRhcmdldC5vbikgJiYgaXNGdW5jdGlvbih0YXJnZXQub2ZmKTsKfQpfX25hbWUoaXNKUXVlcnlTdHlsZUV2ZW50RW1pdHRlciwgImlzSlF1ZXJ5U3R5bGVFdmVudEVtaXR0ZXIiKTsKZnVuY3Rpb24gaXNFdmVudFRhcmdldCh0YXJnZXQpIHsKICByZXR1cm4gaXNGdW5jdGlvbih0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcikgJiYgaXNGdW5jdGlvbih0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcik7Cn0KX19uYW1lKGlzRXZlbnRUYXJnZXQsICJpc0V2ZW50VGFyZ2V0Iik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS90aW1lci5qcwpmdW5jdGlvbiB0aW1lcihkdWVUaW1lLCBpbnRlcnZhbE9yU2NoZWR1bGVyLCBzY2hlZHVsZXIpIHsKICBpZiAoZHVlVGltZSA9PT0gdm9pZCAwKSB7CiAgICBkdWVUaW1lID0gMDsKICB9CiAgaWYgKHNjaGVkdWxlciA9PT0gdm9pZCAwKSB7CiAgICBzY2hlZHVsZXIgPSBhc3luYzsKICB9CiAgdmFyIGludGVydmFsRHVyYXRpb24gPSAtMTsKICBpZiAoaW50ZXJ2YWxPclNjaGVkdWxlciAhPSBudWxsKSB7CiAgICBpZiAoaXNTY2hlZHVsZXIoaW50ZXJ2YWxPclNjaGVkdWxlcikpIHsKICAgICAgc2NoZWR1bGVyID0gaW50ZXJ2YWxPclNjaGVkdWxlcjsKICAgIH0gZWxzZSB7CiAgICAgIGludGVydmFsRHVyYXRpb24gPSBpbnRlcnZhbE9yU2NoZWR1bGVyOwogICAgfQogIH0KICByZXR1cm4gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgdmFyIGR1ZSA9IGlzVmFsaWREYXRlKGR1ZVRpbWUpID8gK2R1ZVRpbWUgLSBzY2hlZHVsZXIubm93KCkgOiBkdWVUaW1lOwogICAgaWYgKGR1ZSA8IDApIHsKICAgICAgZHVlID0gMDsKICAgIH0KICAgIHZhciBuMTEgPSAwOwogICAgcmV0dXJuIHNjaGVkdWxlci5zY2hlZHVsZShmdW5jdGlvbigpIHsKICAgICAgaWYgKCFzdWJzY3JpYmVyLmNsb3NlZCkgewogICAgICAgIHN1YnNjcmliZXIubmV4dChuMTErKyk7CiAgICAgICAgaWYgKDAgPD0gaW50ZXJ2YWxEdXJhdGlvbikgewogICAgICAgICAgdGhpcy5zY2hlZHVsZSh2b2lkIDAsIGludGVydmFsRHVyYXRpb24pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9LCBkdWUpOwogIH0pOwp9Cl9fbmFtZSh0aW1lciwgInRpbWVyIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2ZpbHRlci5qcwpmdW5jdGlvbiBmaWx0ZXIocHJlZGljYXRlLCB0aGlzQXJnKSB7CiAgcmV0dXJuIG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICB2YXIgaW5kZXgyID0gMDsKICAgIHNvdXJjZS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlMikgewogICAgICByZXR1cm4gcHJlZGljYXRlLmNhbGwodGhpc0FyZywgdmFsdWUyLCBpbmRleDIrKykgJiYgc3Vic2NyaWJlci5uZXh0KHZhbHVlMik7CiAgICB9KSk7CiAgfSk7Cn0KX19uYW1lKGZpbHRlciwgImZpbHRlciIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9idWZmZXIuanMKZnVuY3Rpb24gYnVmZmVyKGNsb3NpbmdOb3RpZmllcikgewogIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgdmFyIGN1cnJlbnRCdWZmZXIgPSBbXTsKICAgIHNvdXJjZS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlMikgewogICAgICByZXR1cm4gY3VycmVudEJ1ZmZlci5wdXNoKHZhbHVlMik7CiAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgc3Vic2NyaWJlci5uZXh0KGN1cnJlbnRCdWZmZXIpOwogICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICB9KSk7CiAgICBpbm5lckZyb20oY2xvc2luZ05vdGlmaWVyKS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKCkgewogICAgICB2YXIgYjQgPSBjdXJyZW50QnVmZmVyOwogICAgICBjdXJyZW50QnVmZmVyID0gW107CiAgICAgIHN1YnNjcmliZXIubmV4dChiNCk7CiAgICB9LCBub29wKSk7CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgIGN1cnJlbnRCdWZmZXIgPSBudWxsOwogICAgfTsKICB9KTsKfQpfX25hbWUoYnVmZmVyLCAiYnVmZmVyIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2J1ZmZlckNvdW50LmpzCmZ1bmN0aW9uIGJ1ZmZlckNvdW50KGJ1ZmZlclNpemUsIHN0YXJ0QnVmZmVyRXZlcnkpIHsKICBpZiAoc3RhcnRCdWZmZXJFdmVyeSA9PT0gdm9pZCAwKSB7CiAgICBzdGFydEJ1ZmZlckV2ZXJ5ID0gbnVsbDsKICB9CiAgc3RhcnRCdWZmZXJFdmVyeSA9IHN0YXJ0QnVmZmVyRXZlcnkgIT09IG51bGwgJiYgc3RhcnRCdWZmZXJFdmVyeSAhPT0gdm9pZCAwID8gc3RhcnRCdWZmZXJFdmVyeSA6IGJ1ZmZlclNpemU7CiAgcmV0dXJuIG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICB2YXIgYnVmZmVycyA9IFtdOwogICAgdmFyIGNvdW50MiA9IDA7CiAgICBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZTIpIHsKICAgICAgdmFyIGVfMSwgX2EyLCBlXzIsIF9iOwogICAgICB2YXIgdG9FbWl0ID0gbnVsbDsKICAgICAgaWYgKGNvdW50MisrICUgc3RhcnRCdWZmZXJFdmVyeSA9PT0gMCkgewogICAgICAgIGJ1ZmZlcnMucHVzaChbXSk7CiAgICAgIH0KICAgICAgdHJ5IHsKICAgICAgICBmb3IgKHZhciBidWZmZXJzXzEgPSBfX3ZhbHVlcyhidWZmZXJzKSwgYnVmZmVyc18xXzEgPSBidWZmZXJzXzEubmV4dCgpOyAhYnVmZmVyc18xXzEuZG9uZTsgYnVmZmVyc18xXzEgPSBidWZmZXJzXzEubmV4dCgpKSB7CiAgICAgICAgICB2YXIgYnVmZmVyMiA9IGJ1ZmZlcnNfMV8xLnZhbHVlOwogICAgICAgICAgYnVmZmVyMi5wdXNoKHZhbHVlMik7CiAgICAgICAgICBpZiAoYnVmZmVyU2l6ZSA8PSBidWZmZXIyLmxlbmd0aCkgewogICAgICAgICAgICB0b0VtaXQgPSB0b0VtaXQgIT09IG51bGwgJiYgdG9FbWl0ICE9PSB2b2lkIDAgPyB0b0VtaXQgOiBbXTsKICAgICAgICAgICAgdG9FbWl0LnB1c2goYnVmZmVyMik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlXzFfMSkgewogICAgICAgIGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGlmIChidWZmZXJzXzFfMSAmJiAhYnVmZmVyc18xXzEuZG9uZSAmJiAoX2EyID0gYnVmZmVyc18xLnJldHVybikpIF9hMi5jYWxsKGJ1ZmZlcnNfMSk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHRvRW1pdCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBmb3IgKHZhciB0b0VtaXRfMSA9IF9fdmFsdWVzKHRvRW1pdCksIHRvRW1pdF8xXzEgPSB0b0VtaXRfMS5uZXh0KCk7ICF0b0VtaXRfMV8xLmRvbmU7IHRvRW1pdF8xXzEgPSB0b0VtaXRfMS5uZXh0KCkpIHsKICAgICAgICAgICAgdmFyIGJ1ZmZlcjIgPSB0b0VtaXRfMV8xLnZhbHVlOwogICAgICAgICAgICBhcnJSZW1vdmUoYnVmZmVycywgYnVmZmVyMik7CiAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChidWZmZXIyKTsKICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlXzJfMSkgewogICAgICAgICAgZV8yID0geyBlcnJvcjogZV8yXzEgfTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKHRvRW1pdF8xXzEgJiYgIXRvRW1pdF8xXzEuZG9uZSAmJiAoX2IgPSB0b0VtaXRfMS5yZXR1cm4pKSBfYi5jYWxsKHRvRW1pdF8xKTsKICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgIGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0sIGZ1bmN0aW9uKCkgewogICAgICB2YXIgZV8zLCBfYTI7CiAgICAgIHRyeSB7CiAgICAgICAgZm9yICh2YXIgYnVmZmVyc18yID0gX192YWx1ZXMoYnVmZmVycyksIGJ1ZmZlcnNfMl8xID0gYnVmZmVyc18yLm5leHQoKTsgIWJ1ZmZlcnNfMl8xLmRvbmU7IGJ1ZmZlcnNfMl8xID0gYnVmZmVyc18yLm5leHQoKSkgewogICAgICAgICAgdmFyIGJ1ZmZlcjIgPSBidWZmZXJzXzJfMS52YWx1ZTsKICAgICAgICAgIHN1YnNjcmliZXIubmV4dChidWZmZXIyKTsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGVfM18xKSB7CiAgICAgICAgZV8zID0geyBlcnJvcjogZV8zXzEgfTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICB0cnkgewogICAgICAgICAgaWYgKGJ1ZmZlcnNfMl8xICYmICFidWZmZXJzXzJfMS5kb25lICYmIChfYTIgPSBidWZmZXJzXzIucmV0dXJuKSkgX2EyLmNhbGwoYnVmZmVyc18yKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgaWYgKGVfMykgdGhyb3cgZV8zLmVycm9yOwogICAgICAgIH0KICAgICAgfQogICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICB9LCB2b2lkIDAsIGZ1bmN0aW9uKCkgewogICAgICBidWZmZXJzID0gbnVsbDsKICAgIH0pKTsKICB9KTsKfQpfX25hbWUoYnVmZmVyQ291bnQsICJidWZmZXJDb3VudCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9idWZmZXJUaW1lLmpzCmZ1bmN0aW9uIGJ1ZmZlclRpbWUoYnVmZmVyVGltZVNwYW4pIHsKICB2YXIgX2EyLCBfYjsKICB2YXIgb3RoZXJBcmdzID0gW107CiAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKICAgIG90aGVyQXJnc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTsKICB9CiAgdmFyIHNjaGVkdWxlciA9IChfYTIgPSBwb3BTY2hlZHVsZXIob3RoZXJBcmdzKSkgIT09IG51bGwgJiYgX2EyICE9PSB2b2lkIDAgPyBfYTIgOiBhc3luY1NjaGVkdWxlcjsKICB2YXIgYnVmZmVyQ3JlYXRpb25JbnRlcnZhbCA9IChfYiA9IG90aGVyQXJnc1swXSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogbnVsbDsKICB2YXIgbWF4QnVmZmVyU2l6ZSA9IG90aGVyQXJnc1sxXSB8fCBJbmZpbml0eTsKICByZXR1cm4gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHsKICAgIHZhciBidWZmZXJSZWNvcmRzID0gW107CiAgICB2YXIgcmVzdGFydE9uRW1pdCA9IGZhbHNlOwogICAgdmFyIGVtaXQgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKHJlY29yZCkgewogICAgICB2YXIgYnVmZmVyMiA9IHJlY29yZC5idWZmZXIsIHN1YnMgPSByZWNvcmQuc3ViczsKICAgICAgc3Vicy51bnN1YnNjcmliZSgpOwogICAgICBhcnJSZW1vdmUoYnVmZmVyUmVjb3JkcywgcmVjb3JkKTsKICAgICAgc3Vic2NyaWJlci5uZXh0KGJ1ZmZlcjIpOwogICAgICByZXN0YXJ0T25FbWl0ICYmIHN0YXJ0QnVmZmVyKCk7CiAgICB9LCAiZW1pdCIpOwogICAgdmFyIHN0YXJ0QnVmZmVyID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHsKICAgICAgaWYgKGJ1ZmZlclJlY29yZHMpIHsKICAgICAgICB2YXIgc3VicyA9IG5ldyBTdWJzY3JpcHRpb24oKTsKICAgICAgICBzdWJzY3JpYmVyLmFkZChzdWJzKTsKICAgICAgICB2YXIgYnVmZmVyMiA9IFtdOwogICAgICAgIHZhciByZWNvcmRfMSA9IHsKICAgICAgICAgIGJ1ZmZlcjogYnVmZmVyMiwKICAgICAgICAgIHN1YnMKICAgICAgICB9OwogICAgICAgIGJ1ZmZlclJlY29yZHMucHVzaChyZWNvcmRfMSk7CiAgICAgICAgZXhlY3V0ZVNjaGVkdWxlKHN1YnMsIHNjaGVkdWxlciwgZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gZW1pdChyZWNvcmRfMSk7CiAgICAgICAgfSwgYnVmZmVyVGltZVNwYW4pOwogICAgICB9CiAgICB9LCAic3RhcnRCdWZmZXIiKTsKICAgIGlmIChidWZmZXJDcmVhdGlvbkludGVydmFsICE9PSBudWxsICYmIGJ1ZmZlckNyZWF0aW9uSW50ZXJ2YWwgPj0gMCkgewogICAgICBleGVjdXRlU2NoZWR1bGUoc3Vic2NyaWJlciwgc2NoZWR1bGVyLCBzdGFydEJ1ZmZlciwgYnVmZmVyQ3JlYXRpb25JbnRlcnZhbCwgdHJ1ZSk7CiAgICB9IGVsc2UgewogICAgICByZXN0YXJ0T25FbWl0ID0gdHJ1ZTsKICAgIH0KICAgIHN0YXJ0QnVmZmVyKCk7CiAgICB2YXIgYnVmZmVyVGltZVN1YnNjcmliZXIgPSBjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUyKSB7CiAgICAgIHZhciBlXzEsIF9hMzsKICAgICAgdmFyIHJlY29yZHNDb3B5ID0gYnVmZmVyUmVjb3Jkcy5zbGljZSgpOwogICAgICB0cnkgewogICAgICAgIGZvciAodmFyIHJlY29yZHNDb3B5XzEgPSBfX3ZhbHVlcyhyZWNvcmRzQ29weSksIHJlY29yZHNDb3B5XzFfMSA9IHJlY29yZHNDb3B5XzEubmV4dCgpOyAhcmVjb3Jkc0NvcHlfMV8xLmRvbmU7IHJlY29yZHNDb3B5XzFfMSA9IHJlY29yZHNDb3B5XzEubmV4dCgpKSB7CiAgICAgICAgICB2YXIgcmVjb3JkID0gcmVjb3Jkc0NvcHlfMV8xLnZhbHVlOwogICAgICAgICAgdmFyIGJ1ZmZlcjIgPSByZWNvcmQuYnVmZmVyOwogICAgICAgICAgYnVmZmVyMi5wdXNoKHZhbHVlMik7CiAgICAgICAgICBtYXhCdWZmZXJTaXplIDw9IGJ1ZmZlcjIubGVuZ3RoICYmIGVtaXQocmVjb3JkKTsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGVfMV8xKSB7CiAgICAgICAgZV8xID0geyBlcnJvcjogZV8xXzEgfTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICB0cnkgewogICAgICAgICAgaWYgKHJlY29yZHNDb3B5XzFfMSAmJiAhcmVjb3Jkc0NvcHlfMV8xLmRvbmUgJiYgKF9hMyA9IHJlY29yZHNDb3B5XzEucmV0dXJuKSkgX2EzLmNhbGwocmVjb3Jkc0NvcHlfMSk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsKICAgICAgICB9CiAgICAgIH0KICAgIH0sIGZ1bmN0aW9uKCkgewogICAgICB3aGlsZSAoYnVmZmVyUmVjb3JkcyA9PT0gbnVsbCB8fCBidWZmZXJSZWNvcmRzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBidWZmZXJSZWNvcmRzLmxlbmd0aCkgewogICAgICAgIHN1YnNjcmliZXIubmV4dChidWZmZXJSZWNvcmRzLnNoaWZ0KCkuYnVmZmVyKTsKICAgICAgfQogICAgICBidWZmZXJUaW1lU3Vic2NyaWJlciA9PT0gbnVsbCB8fCBidWZmZXJUaW1lU3Vic2NyaWJlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogYnVmZmVyVGltZVN1YnNjcmliZXIudW5zdWJzY3JpYmUoKTsKICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgICBzdWJzY3JpYmVyLnVuc3Vic2NyaWJlKCk7CiAgICB9LCB2b2lkIDAsIGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gYnVmZmVyUmVjb3JkcyA9IG51bGw7CiAgICB9KTsKICAgIHNvdXJjZS5zdWJzY3JpYmUoYnVmZmVyVGltZVN1YnNjcmliZXIpOwogIH0pOwp9Cl9fbmFtZShidWZmZXJUaW1lLCAiYnVmZmVyVGltZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9kZWJvdW5jZS5qcwpmdW5jdGlvbiBkZWJvdW5jZShkdXJhdGlvblNlbGVjdG9yKSB7CiAgcmV0dXJuIG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICB2YXIgaGFzVmFsdWUgPSBmYWxzZTsKICAgIHZhciBsYXN0VmFsdWUgPSBudWxsOwogICAgdmFyIGR1cmF0aW9uU3Vic2NyaWJlciA9IG51bGw7CiAgICB2YXIgZW1pdCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oKSB7CiAgICAgIGR1cmF0aW9uU3Vic2NyaWJlciA9PT0gbnVsbCB8fCBkdXJhdGlvblN1YnNjcmliZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGR1cmF0aW9uU3Vic2NyaWJlci51bnN1YnNjcmliZSgpOwogICAgICBkdXJhdGlvblN1YnNjcmliZXIgPSBudWxsOwogICAgICBpZiAoaGFzVmFsdWUpIHsKICAgICAgICBoYXNWYWx1ZSA9IGZhbHNlOwogICAgICAgIHZhciB2YWx1ZTIgPSBsYXN0VmFsdWU7CiAgICAgICAgbGFzdFZhbHVlID0gbnVsbDsKICAgICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWUyKTsKICAgICAgfQogICAgfSwgImVtaXQiKTsKICAgIHNvdXJjZS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlMikgewogICAgICBkdXJhdGlvblN1YnNjcmliZXIgPT09IG51bGwgfHwgZHVyYXRpb25TdWJzY3JpYmVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkdXJhdGlvblN1YnNjcmliZXIudW5zdWJzY3JpYmUoKTsKICAgICAgaGFzVmFsdWUgPSB0cnVlOwogICAgICBsYXN0VmFsdWUgPSB2YWx1ZTI7CiAgICAgIGR1cmF0aW9uU3Vic2NyaWJlciA9IGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBlbWl0LCBub29wKTsKICAgICAgaW5uZXJGcm9tKGR1cmF0aW9uU2VsZWN0b3IodmFsdWUyKSkuc3Vic2NyaWJlKGR1cmF0aW9uU3Vic2NyaWJlcik7CiAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgZW1pdCgpOwogICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICB9LCB2b2lkIDAsIGZ1bmN0aW9uKCkgewogICAgICBsYXN0VmFsdWUgPSBkdXJhdGlvblN1YnNjcmliZXIgPSBudWxsOwogICAgfSkpOwogIH0pOwp9Cl9fbmFtZShkZWJvdW5jZSwgImRlYm91bmNlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2RlYm91bmNlVGltZS5qcwpmdW5jdGlvbiBkZWJvdW5jZVRpbWUoZHVlVGltZSwgc2NoZWR1bGVyKSB7CiAgaWYgKHNjaGVkdWxlciA9PT0gdm9pZCAwKSB7CiAgICBzY2hlZHVsZXIgPSBhc3luY1NjaGVkdWxlcjsKICB9CiAgcmV0dXJuIG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICB2YXIgYWN0aXZlVGFzayA9IG51bGw7CiAgICB2YXIgbGFzdFZhbHVlID0gbnVsbDsKICAgIHZhciBsYXN0VGltZSA9IG51bGw7CiAgICB2YXIgZW1pdCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oKSB7CiAgICAgIGlmIChhY3RpdmVUYXNrKSB7CiAgICAgICAgYWN0aXZlVGFzay51bnN1YnNjcmliZSgpOwogICAgICAgIGFjdGl2ZVRhc2sgPSBudWxsOwogICAgICAgIHZhciB2YWx1ZTIgPSBsYXN0VmFsdWU7CiAgICAgICAgbGFzdFZhbHVlID0gbnVsbDsKICAgICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWUyKTsKICAgICAgfQogICAgfSwgImVtaXQiKTsKICAgIGZ1bmN0aW9uIGVtaXRXaGVuSWRsZSgpIHsKICAgICAgdmFyIHRhcmdldFRpbWUgPSBsYXN0VGltZSArIGR1ZVRpbWU7CiAgICAgIHZhciBub3cyID0gc2NoZWR1bGVyLm5vdygpOwogICAgICBpZiAobm93MiA8IHRhcmdldFRpbWUpIHsKICAgICAgICBhY3RpdmVUYXNrID0gdGhpcy5zY2hlZHVsZSh2b2lkIDAsIHRhcmdldFRpbWUgLSBub3cyKTsKICAgICAgICBzdWJzY3JpYmVyLmFkZChhY3RpdmVUYXNrKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgZW1pdCgpOwogICAgfQogICAgX19uYW1lKGVtaXRXaGVuSWRsZSwgImVtaXRXaGVuSWRsZSIpOwogICAgc291cmNlLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUyKSB7CiAgICAgIGxhc3RWYWx1ZSA9IHZhbHVlMjsKICAgICAgbGFzdFRpbWUgPSBzY2hlZHVsZXIubm93KCk7CiAgICAgIGlmICghYWN0aXZlVGFzaykgewogICAgICAgIGFjdGl2ZVRhc2sgPSBzY2hlZHVsZXIuc2NoZWR1bGUoZW1pdFdoZW5JZGxlLCBkdWVUaW1lKTsKICAgICAgICBzdWJzY3JpYmVyLmFkZChhY3RpdmVUYXNrKTsKICAgICAgfQogICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgIGVtaXQoKTsKICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgfSwgdm9pZCAwLCBmdW5jdGlvbigpIHsKICAgICAgbGFzdFZhbHVlID0gYWN0aXZlVGFzayA9IG51bGw7CiAgICB9KSk7CiAgfSk7Cn0KX19uYW1lKGRlYm91bmNlVGltZSwgImRlYm91bmNlVGltZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9zaGFyZS5qcwpmdW5jdGlvbiBzaGFyZShvcHRpb25zKSB7CiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgewogICAgb3B0aW9ucyA9IHt9OwogIH0KICB2YXIgX2EyID0gb3B0aW9ucy5jb25uZWN0b3IsIGNvbm5lY3RvciA9IF9hMiA9PT0gdm9pZCAwID8gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gbmV3IFN1YmplY3QoKTsKICB9IDogX2EyLCBfYiA9IG9wdGlvbnMucmVzZXRPbkVycm9yLCByZXNldE9uRXJyb3IgPSBfYiA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9iLCBfYyA9IG9wdGlvbnMucmVzZXRPbkNvbXBsZXRlLCByZXNldE9uQ29tcGxldGUgPSBfYyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9jLCBfZCA9IG9wdGlvbnMucmVzZXRPblJlZkNvdW50WmVybywgcmVzZXRPblJlZkNvdW50WmVybyA9IF9kID09PSB2b2lkIDAgPyB0cnVlIDogX2Q7CiAgcmV0dXJuIGZ1bmN0aW9uKHdyYXBwZXJTb3VyY2UpIHsKICAgIHZhciBjb25uZWN0aW9uOwogICAgdmFyIHJlc2V0Q29ubmVjdGlvbjsKICAgIHZhciBzdWJqZWN0OwogICAgdmFyIHJlZkNvdW50MiA9IDA7CiAgICB2YXIgaGFzQ29tcGxldGVkID0gZmFsc2U7CiAgICB2YXIgaGFzRXJyb3JlZCA9IGZhbHNlOwogICAgdmFyIGNhbmNlbFJlc2V0ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHsKICAgICAgcmVzZXRDb25uZWN0aW9uID09PSBudWxsIHx8IHJlc2V0Q29ubmVjdGlvbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVzZXRDb25uZWN0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgIHJlc2V0Q29ubmVjdGlvbiA9IHZvaWQgMDsKICAgIH0sICJjYW5jZWxSZXNldCIpOwogICAgdmFyIHJlc2V0ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHsKICAgICAgY2FuY2VsUmVzZXQoKTsKICAgICAgY29ubmVjdGlvbiA9IHN1YmplY3QgPSB2b2lkIDA7CiAgICAgIGhhc0NvbXBsZXRlZCA9IGhhc0Vycm9yZWQgPSBmYWxzZTsKICAgIH0sICJyZXNldCIpOwogICAgdmFyIHJlc2V0QW5kVW5zdWJzY3JpYmUgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCkgewogICAgICB2YXIgY29ubiA9IGNvbm5lY3Rpb247CiAgICAgIHJlc2V0KCk7CiAgICAgIGNvbm4gPT09IG51bGwgfHwgY29ubiA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29ubi51bnN1YnNjcmliZSgpOwogICAgfSwgInJlc2V0QW5kVW5zdWJzY3JpYmUiKTsKICAgIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgICByZWZDb3VudDIrKzsKICAgICAgaWYgKCFoYXNFcnJvcmVkICYmICFoYXNDb21wbGV0ZWQpIHsKICAgICAgICBjYW5jZWxSZXNldCgpOwogICAgICB9CiAgICAgIHZhciBkZXN0ID0gc3ViamVjdCA9IHN1YmplY3QgIT09IG51bGwgJiYgc3ViamVjdCAhPT0gdm9pZCAwID8gc3ViamVjdCA6IGNvbm5lY3RvcigpOwogICAgICBzdWJzY3JpYmVyLmFkZChmdW5jdGlvbigpIHsKICAgICAgICByZWZDb3VudDItLTsKICAgICAgICBpZiAocmVmQ291bnQyID09PSAwICYmICFoYXNFcnJvcmVkICYmICFoYXNDb21wbGV0ZWQpIHsKICAgICAgICAgIHJlc2V0Q29ubmVjdGlvbiA9IGhhbmRsZVJlc2V0KHJlc2V0QW5kVW5zdWJzY3JpYmUsIHJlc2V0T25SZWZDb3VudFplcm8pOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIGRlc3Quc3Vic2NyaWJlKHN1YnNjcmliZXIpOwogICAgICBpZiAoIWNvbm5lY3Rpb24gJiYgcmVmQ291bnQyID4gMCkgewogICAgICAgIGNvbm5lY3Rpb24gPSBuZXcgU2FmZVN1YnNjcmliZXIoewogICAgICAgICAgbmV4dDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbih2YWx1ZTIpIHsKICAgICAgICAgICAgcmV0dXJuIGRlc3QubmV4dCh2YWx1ZTIpOwogICAgICAgICAgfSwgIm5leHQiKSwKICAgICAgICAgIGVycm9yOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICBoYXNFcnJvcmVkID0gdHJ1ZTsKICAgICAgICAgICAgY2FuY2VsUmVzZXQoKTsKICAgICAgICAgICAgcmVzZXRDb25uZWN0aW9uID0gaGFuZGxlUmVzZXQocmVzZXQsIHJlc2V0T25FcnJvciwgZXJyKTsKICAgICAgICAgICAgZGVzdC5lcnJvcihlcnIpOwogICAgICAgICAgfSwgImVycm9yIiksCiAgICAgICAgICBjb21wbGV0ZTogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHsKICAgICAgICAgICAgaGFzQ29tcGxldGVkID0gdHJ1ZTsKICAgICAgICAgICAgY2FuY2VsUmVzZXQoKTsKICAgICAgICAgICAgcmVzZXRDb25uZWN0aW9uID0gaGFuZGxlUmVzZXQocmVzZXQsIHJlc2V0T25Db21wbGV0ZSk7CiAgICAgICAgICAgIGRlc3QuY29tcGxldGUoKTsKICAgICAgICAgIH0sICJjb21wbGV0ZSIpCiAgICAgICAgfSk7CiAgICAgICAgaW5uZXJGcm9tKHNvdXJjZSkuc3Vic2NyaWJlKGNvbm5lY3Rpb24pOwogICAgICB9CiAgICB9KSh3cmFwcGVyU291cmNlKTsKICB9Owp9Cl9fbmFtZShzaGFyZSwgInNoYXJlIik7CmZ1bmN0aW9uIGhhbmRsZVJlc2V0KHJlc2V0LCBvbikgewogIHZhciBhcmdzID0gW107CiAgZm9yICh2YXIgX2kgPSAyOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKICAgIGFyZ3NbX2kgLSAyXSA9IGFyZ3VtZW50c1tfaV07CiAgfQogIGlmIChvbiA9PT0gdHJ1ZSkgewogICAgcmVzZXQoKTsKICAgIHJldHVybjsKICB9CiAgaWYgKG9uID09PSBmYWxzZSkgewogICAgcmV0dXJuOwogIH0KICB2YXIgb25TdWJzY3JpYmVyID0gbmV3IFNhZmVTdWJzY3JpYmVyKHsKICAgIG5leHQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oKSB7CiAgICAgIG9uU3Vic2NyaWJlci51bnN1YnNjcmliZSgpOwogICAgICByZXNldCgpOwogICAgfSwgIm5leHQiKQogIH0pOwogIHJldHVybiBpbm5lckZyb20ob24uYXBwbHkodm9pZCAwLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoYXJncykpKSkuc3Vic2NyaWJlKG9uU3Vic2NyaWJlcik7Cn0KX19uYW1lKGhhbmRsZVJlc2V0LCAiaGFuZGxlUmVzZXQiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvc2hhcmVSZXBsYXkuanMKZnVuY3Rpb24gc2hhcmVSZXBsYXkoY29uZmlnT3JCdWZmZXJTaXplLCB3aW5kb3dUaW1lMiwgc2NoZWR1bGVyKSB7CiAgdmFyIF9hMiwgX2IsIF9jOwogIHZhciBidWZmZXJTaXplOwogIHZhciByZWZDb3VudDIgPSBmYWxzZTsKICBpZiAoY29uZmlnT3JCdWZmZXJTaXplICYmIHR5cGVvZiBjb25maWdPckJ1ZmZlclNpemUgPT09ICJvYmplY3QiKSB7CiAgICBfYTIgPSBjb25maWdPckJ1ZmZlclNpemUuYnVmZmVyU2l6ZSwgYnVmZmVyU2l6ZSA9IF9hMiA9PT0gdm9pZCAwID8gSW5maW5pdHkgOiBfYTIsIF9iID0gY29uZmlnT3JCdWZmZXJTaXplLndpbmRvd1RpbWUsIHdpbmRvd1RpbWUyID0gX2IgPT09IHZvaWQgMCA/IEluZmluaXR5IDogX2IsIF9jID0gY29uZmlnT3JCdWZmZXJTaXplLnJlZkNvdW50LCByZWZDb3VudDIgPSBfYyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfYywgc2NoZWR1bGVyID0gY29uZmlnT3JCdWZmZXJTaXplLnNjaGVkdWxlcjsKICB9IGVsc2UgewogICAgYnVmZmVyU2l6ZSA9IGNvbmZpZ09yQnVmZmVyU2l6ZSAhPT0gbnVsbCAmJiBjb25maWdPckJ1ZmZlclNpemUgIT09IHZvaWQgMCA/IGNvbmZpZ09yQnVmZmVyU2l6ZSA6IEluZmluaXR5OwogIH0KICByZXR1cm4gc2hhcmUoewogICAgY29ubmVjdG9yOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gbmV3IFJlcGxheVN1YmplY3QoYnVmZmVyU2l6ZSwgd2luZG93VGltZTIsIHNjaGVkdWxlcik7CiAgICB9LCAiY29ubmVjdG9yIiksCiAgICByZXNldE9uRXJyb3I6IHRydWUsCiAgICByZXNldE9uQ29tcGxldGU6IGZhbHNlLAogICAgcmVzZXRPblJlZkNvdW50WmVybzogcmVmQ291bnQyCiAgfSk7Cn0KX19uYW1lKHNoYXJlUmVwbGF5LCAic2hhcmVSZXBsYXkiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvc3RhcnRXaXRoLmpzCmZ1bmN0aW9uIHN0YXJ0V2l0aCgpIHsKICB2YXIgdmFsdWVzID0gW107CiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKICAgIHZhbHVlc1tfaV0gPSBhcmd1bWVudHNbX2ldOwogIH0KICB2YXIgc2NoZWR1bGVyID0gcG9wU2NoZWR1bGVyKHZhbHVlcyk7CiAgcmV0dXJuIG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICAoc2NoZWR1bGVyID8gY29uY2F0KHZhbHVlcywgc291cmNlLCBzY2hlZHVsZXIpIDogY29uY2F0KHZhbHVlcywgc291cmNlKSkuc3Vic2NyaWJlKHN1YnNjcmliZXIpOwogIH0pOwp9Cl9fbmFtZShzdGFydFdpdGgsICJzdGFydFdpdGgiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvdGFrZVVudGlsLmpzCmZ1bmN0aW9uIHRha2VVbnRpbChub3RpZmllcikgewogIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgaW5uZXJGcm9tKG5vdGlmaWVyKS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgfSwgbm9vcCkpOwogICAgIXN1YnNjcmliZXIuY2xvc2VkICYmIHNvdXJjZS5zdWJzY3JpYmUoc3Vic2NyaWJlcik7CiAgfSk7Cn0KX19uYW1lKHRha2VVbnRpbCwgInRha2VVbnRpbCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy90aHJvdHRsZS5qcwpmdW5jdGlvbiB0aHJvdHRsZShkdXJhdGlvblNlbGVjdG9yLCBjb25maWcyKSB7CiAgcmV0dXJuIG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICB2YXIgX2EyID0gY29uZmlnMiAhPT0gbnVsbCAmJiBjb25maWcyICE9PSB2b2lkIDAgPyBjb25maWcyIDoge30sIF9iID0gX2EyLmxlYWRpbmcsIGxlYWRpbmcgPSBfYiA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9iLCBfYyA9IF9hMi50cmFpbGluZywgdHJhaWxpbmcgPSBfYyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfYzsKICAgIHZhciBoYXNWYWx1ZSA9IGZhbHNlOwogICAgdmFyIHNlbmRWYWx1ZSA9IG51bGw7CiAgICB2YXIgdGhyb3R0bGVkID0gbnVsbDsKICAgIHZhciBpc0NvbXBsZXRlID0gZmFsc2U7CiAgICB2YXIgZW5kVGhyb3R0bGluZyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oKSB7CiAgICAgIHRocm90dGxlZCA9PT0gbnVsbCB8fCB0aHJvdHRsZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRocm90dGxlZC51bnN1YnNjcmliZSgpOwogICAgICB0aHJvdHRsZWQgPSBudWxsOwogICAgICBpZiAodHJhaWxpbmcpIHsKICAgICAgICBzZW5kKCk7CiAgICAgICAgaXNDb21wbGV0ZSAmJiBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgIH0KICAgIH0sICJlbmRUaHJvdHRsaW5nIik7CiAgICB2YXIgY2xlYW51cFRocm90dGxpbmcgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCkgewogICAgICB0aHJvdHRsZWQgPSBudWxsOwogICAgICBpc0NvbXBsZXRlICYmIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgIH0sICJjbGVhbnVwVGhyb3R0bGluZyIpOwogICAgdmFyIHN0YXJ0VGhyb3R0bGUgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKHZhbHVlMikgewogICAgICByZXR1cm4gdGhyb3R0bGVkID0gaW5uZXJGcm9tKGR1cmF0aW9uU2VsZWN0b3IodmFsdWUyKSkuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBlbmRUaHJvdHRsaW5nLCBjbGVhbnVwVGhyb3R0bGluZykpOwogICAgfSwgInN0YXJ0VGhyb3R0bGUiKTsKICAgIHZhciBzZW5kID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHsKICAgICAgaWYgKGhhc1ZhbHVlKSB7CiAgICAgICAgaGFzVmFsdWUgPSBmYWxzZTsKICAgICAgICB2YXIgdmFsdWUyID0gc2VuZFZhbHVlOwogICAgICAgIHNlbmRWYWx1ZSA9IG51bGw7CiAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlMik7CiAgICAgICAgIWlzQ29tcGxldGUgJiYgc3RhcnRUaHJvdHRsZSh2YWx1ZTIpOwogICAgICB9CiAgICB9LCAic2VuZCIpOwogICAgc291cmNlLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUyKSB7CiAgICAgIGhhc1ZhbHVlID0gdHJ1ZTsKICAgICAgc2VuZFZhbHVlID0gdmFsdWUyOwogICAgICAhKHRocm90dGxlZCAmJiAhdGhyb3R0bGVkLmNsb3NlZCkgJiYgKGxlYWRpbmcgPyBzZW5kKCkgOiBzdGFydFRocm90dGxlKHZhbHVlMikpOwogICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgIGlzQ29tcGxldGUgPSB0cnVlOwogICAgICAhKHRyYWlsaW5nICYmIGhhc1ZhbHVlICYmIHRocm90dGxlZCAmJiAhdGhyb3R0bGVkLmNsb3NlZCkgJiYgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgfSkpOwogIH0pOwp9Cl9fbmFtZSh0aHJvdHRsZSwgInRocm90dGxlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3Rocm90dGxlVGltZS5qcwpmdW5jdGlvbiB0aHJvdHRsZVRpbWUoZHVyYXRpb24sIHNjaGVkdWxlciwgY29uZmlnMikgewogIGlmIChzY2hlZHVsZXIgPT09IHZvaWQgMCkgewogICAgc2NoZWR1bGVyID0gYXN5bmNTY2hlZHVsZXI7CiAgfQogIHZhciBkdXJhdGlvbiQgPSB0aW1lcihkdXJhdGlvbiwgc2NoZWR1bGVyKTsKICByZXR1cm4gdGhyb3R0bGUoZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZHVyYXRpb24kOwogIH0sIGNvbmZpZzIpOwp9Cl9fbmFtZSh0aHJvdHRsZVRpbWUsICJ0aHJvdHRsZVRpbWUiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHJ4QDMuMC4xMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRyeC9kaXN0X3RzL3NtYXJ0cngucGx1Z2lucy5yeGpzLmpzCnZhciBvcHMgPSB7CiAgYnVmZmVyLAogIGJ1ZmZlckNvdW50LAogIGJ1ZmZlclRpbWUsCiAgZGVib3VuY2UsCiAgZGVib3VuY2VUaW1lLAogIGZpbHRlciwKICBtYXA6IG1hcDIsCiAgc3RhcnRXaXRoLAogIHRha2VVbnRpbCwKICB0aHJvdHRsZVRpbWUKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHJ4QDMuMC4xMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRyeC9kaXN0X3RzL3NtYXJ0cnguY2xhc3Nlcy5vYnNlcnZhYmxlbWFwLmpzCnZhciBPYnNlcnZhYmxlbWFwID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIk9ic2VydmFibGVtYXAiKTsKICB9CiAgY29uc3RydWN0b3IoKSB7CiAgICB0aGlzLm9ic2VydmFibGVFdmVudEVtaXR0ZXJCdW5kbGVBcnJheSA9IG5ldyBBcnJheSgpOwogICAgdGhpcy5vYnNlcnZhYmxlRXZlbnRUYXJnZXRCdW5kbGVBcnJheSA9IG5ldyBBcnJheSgpOwogIH0KICAvKioKICAgKiBjcmVhdGVzIGEgaG90IHN1YmplY3QgaWYgbm90IHlldCByZWdpc3RlcmVkIGZvciB0aGUgZXZlbnQuCiAgICogSW4gY2FzZSBldmVudCBoYXMgYmVlbiByZWdpc3RlcmVkIGJlZm9yZSB0aGUgc2FtZSBvYnNlcnZhYmxlIGlzIHJldHVybmVkLgogICAqLwogIGdldFN1YmplY3RGb3JFbWl0dGVyRXZlbnQoZW1pdHRlckFyZywgZXZlbnRBcmcpIHsKICAgIGNvbnN0IGV4aXN0aW5nQnVuZGxlID0gdGhpcy5vYnNlcnZhYmxlRXZlbnRFbWl0dGVyQnVuZGxlQXJyYXkuZmluZCgoYnVuZGxlQXJnKSA9PiB7CiAgICAgIHJldHVybiBidW5kbGVBcmcuZXZlbnRSZWYgPT09IGVtaXR0ZXJBcmcgJiYgYnVuZGxlQXJnLmV2ZW50ID09PSBldmVudEFyZzsKICAgIH0pOwogICAgaWYgKGV4aXN0aW5nQnVuZGxlKSB7CiAgICAgIHJldHVybiBleGlzdGluZ0J1bmRsZS5zdWJqZWN0OwogICAgfSBlbHNlIHsKICAgICAgY29uc3QgZW1pdHRlck9ic2VydmFibGUgPSBmcm9tRXZlbnQoZW1pdHRlckFyZywgZXZlbnRBcmcpOwogICAgICBjb25zdCBlbWl0dGVyU3ViamVjdCA9IG5ldyBTdWJqZWN0KCk7CiAgICAgIGVtaXR0ZXJPYnNlcnZhYmxlLnN1YnNjcmliZShlbWl0dGVyU3ViamVjdCk7CiAgICAgIGNvbnN0IG5ld0J1bmRsZSA9IHsKICAgICAgICBzdWJqZWN0OiBlbWl0dGVyU3ViamVjdCwKICAgICAgICBldmVudFJlZjogZW1pdHRlckFyZywKICAgICAgICBldmVudDogZXZlbnRBcmcKICAgICAgfTsKICAgICAgdGhpcy5vYnNlcnZhYmxlRXZlbnRFbWl0dGVyQnVuZGxlQXJyYXkucHVzaChuZXdCdW5kbGUpOwogICAgICByZXR1cm4gbmV3QnVuZGxlLnN1YmplY3Q7CiAgICB9CiAgfQogIGdldFN1YmplY3RGb3JFdmVudFRhcmdldChldmVudFRhcmdldEFyZywgZXZlbnROYW1lQXJnKSB7CiAgICBjb25zdCBleGlzdGluZ0J1bmRsZSA9IHRoaXMub2JzZXJ2YWJsZUV2ZW50VGFyZ2V0QnVuZGxlQXJyYXkuZmluZCgoYnVuZGxlQXJnKSA9PiB7CiAgICAgIHJldHVybiBidW5kbGVBcmcuZXZlbnRSZWYgPT09IGV2ZW50VGFyZ2V0QXJnICYmIGJ1bmRsZUFyZy5ldmVudCA9PT0gZXZlbnROYW1lQXJnOwogICAgfSk7CiAgICBpZiAoZXhpc3RpbmdCdW5kbGUpIHsKICAgICAgcmV0dXJuIGV4aXN0aW5nQnVuZGxlLnN1YmplY3Q7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBlbWl0dGVyU3ViamVjdCA9IG5ldyBTdWJqZWN0KCk7CiAgICAgIGNvbnN0IG5ld0J1bmRsZSA9IHsKICAgICAgICBzdWJqZWN0OiBlbWl0dGVyU3ViamVjdCwKICAgICAgICBldmVudFJlZjogZXZlbnRUYXJnZXRBcmcsCiAgICAgICAgZXZlbnQ6IGV2ZW50TmFtZUFyZwogICAgICB9OwogICAgICB0aGlzLm9ic2VydmFibGVFdmVudFRhcmdldEJ1bmRsZUFycmF5LnB1c2gobmV3QnVuZGxlKTsKICAgICAgcmV0dXJuIG5ld0J1bmRsZS5zdWJqZWN0OwogICAgfQogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHJ4QDMuMC4xMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRyeC9kaXN0X3RzL3NtYXJ0cnguY2xhc3Nlcy5vYnNlcnZhYmxlaW50YWtlLmpzCnZhciBPYnNlcnZhYmxlSW50YWtlID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIk9ic2VydmFibGVJbnRha2UiKTsKICB9CiAgY29uc3RydWN0b3IoKSB7CiAgICB0aGlzLm9ic2VydmFibGVGdW5jdGlvbnMgPSB7CiAgICAgIG5leHQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHBheWxvYWRBcmcpID0+IHsKICAgICAgfSwgIm5leHQiKSwKICAgICAgY29tcGxldGU6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHBheWxvYWRBcmcpID0+IHsKICAgICAgfSwgImNvbXBsZXRlIikKICAgIH07CiAgICB0aGlzLmdlbmVyYXRvciA9IG51bGw7CiAgICB0aGlzLmJ1ZmZlcmVkID0gZmFsc2U7CiAgICB0aGlzLnBheWxvYWRCdWZmZXIgPSBbXTsKICAgIHRoaXMub2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlckFyZykgPT4gewogICAgICB0aGlzLm9ic2VydmFibGVGdW5jdGlvbnMubmV4dCA9ICguLi5hcmdzKSA9PiB7CiAgICAgICAgcmV0dXJuIG9ic2VydmVyQXJnLm5leHQoYXJncyk7CiAgICAgIH07CiAgICAgIHRoaXMub2JzZXJ2YWJsZUZ1bmN0aW9ucy5jb21wbGV0ZSA9ICgpID0+IHsKICAgICAgICB0aGlzLmNvbXBsZXRlZERlZmZlcmVkLnJlc29sdmUoKTsKICAgICAgICByZXR1cm4gb2JzZXJ2ZXJBcmcuY29tcGxldGUoKTsKICAgICAgfTsKICAgIH0pOwogICAgdGhpcy5jb21wbGV0ZWREZWZmZXJlZCA9IGRpc3RfdHNfZXhwb3J0cy5kZWZlcigpOwogICAgdGhpcy5jb21wbGV0ZWQgPSB0aGlzLmNvbXBsZXRlZERlZmZlcmVkLnByb21pc2U7CiAgfQogIHNldE9ic2VydmFibGUob2JzZXJ2YWJsZUZ1bmMpIHsKICAgIHRoaXMub2JzZXJ2YWJsZSA9IG9ic2VydmFibGVGdW5jOwogIH0KICBwdXNoKHBheWxvYWRBcmcpIHsKICAgIGlmICh0aGlzLmJ1ZmZlcmVkKSB7CiAgICAgIHRoaXMucGF5bG9hZEJ1ZmZlci5wdXNoKHBheWxvYWRBcmcpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5pbnRlcm5hbFB1c2gocGF5bG9hZEFyZyk7CiAgICB9CiAgfQogIC8qKgogICAqIHB1c2hlcyBtYW55IHBheWxvYWRzIGFzIGFycmF5CiAgICogQHBhcmFtIHBheWxvYWRBcmdBcnJheQogICAqLwogIHB1c2hNYW55KHBheWxvYWRBcmdBcnJheSkgewogICAgZm9yIChjb25zdCBpdGVtIG9mIHBheWxvYWRBcmdBcnJheSkgewogICAgICB0aGlzLnB1c2goaXRlbSk7CiAgICB9CiAgfQogIC8qKgogICAqIHNldHMgYSBnZW5lcmF0b3IgdG8gcXVlcnkgdGhlIG5leHQgcHVzaGVkIHZhbHVlCiAgICogQHBhcmFtIGdlbmVyYXRvckFyZwogICAqLwogIHNldEdlbmVyYXRvcihnZW5lcmF0b3JBcmcpIHsKICAgIHRoaXMuZ2VuZXJhdG9yID0gZ2VuZXJhdG9yQXJnOwogIH0KICBtYWtlQnVmZmVyZWQoKSB7CiAgICB0aGlzLmJ1ZmZlcmVkID0gdHJ1ZTsKICB9CiAgc3Vic2NyaWJlKC4uLmFyZ3MpIHsKICAgIHJldHVybiB0aGlzLm9ic2VydmFibGUuc3Vic2NyaWJlKC4uLmFyZ3MpOwogIH0KICAvKioKICAgKiByZXF1ZXN0IHRoZSBuZXh0IHZhbHVlcyBpbiB0aGUgcXVhbnRpdHkgc3BlY2lmaWVkCiAgICogQHBhcmFtIGhvd01hbnlBcmcgaWYgYSBnZW5lcmF0b3IgaXMgc2V0LCBvZiBhIGJ1ZmZlciBleGlzdHMsIHRoaXMgYWxsb3dzIHJldHJpZXZpbmcgdmFsdWVzCiAgICovCiAgcmVxdWVzdChob3dNYW55QXJnKSB7CiAgICBpZiAoaG93TWFueUFyZyA9PT0gMCkgewogICAgICByZXR1cm47CiAgICB9IGVsc2UgewogICAgICBmb3IgKGxldCBpMTAgPSAwOyBpMTAgIT09IGhvd01hbnlBcmc7IGkxMCsrKSB7CiAgICAgICAgaWYgKHRoaXMucGF5bG9hZEJ1ZmZlci5sZW5ndGggPiAwKSB7CiAgICAgICAgICB0aGlzLmludGVybmFsUHVzaCh0aGlzLnBheWxvYWRCdWZmZXIuc2hpZnQoKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IG5leHRQYXlsb2FkID0gdGhpcy5nZW5lcmF0b3IubmV4dCgpOwogICAgICAgICAgdGhpcy5pbnRlcm5hbFB1c2gobmV4dFBheWxvYWQudmFsdWUpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICAvKioKICAgKiBzaWduYWxzIHRoZSBjb21wbGV0aW9uIG9mIHRoaXMgb2JzZXJ2YWJsZQogICAqLwogIHNpZ25hbENvbXBsZXRlKCkgewogICAgdGhpcy5vYnNlcnZhYmxlRnVuY3Rpb25zLmNvbXBsZXRlKCk7CiAgfQogIGludGVybmFsUHVzaChwYXlsb2FkQXJnKSB7CiAgICB0aGlzLm9ic2VydmFibGVGdW5jdGlvbnMubmV4dChwYXlsb2FkQXJnKTsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRyeEAzLjAuMTAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0cngvZGlzdF90cy9zbWFydHJ4LmZ1bmN0aW9ucy5qcwpmdW5jdGlvbiBmcm9tU3RyZWFtV2l0aEJhY2twcmVzc3VyZShzdHJlYW0pIHsKICByZXR1cm4gbmV3IE9ic2VydmFibGUoKHN1YnNjcmliZXIpID0+IHsKICAgIGNvbnN0IHBhdXNlU3RyZWFtID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoKSA9PiBzdHJlYW0ucGF1c2UoKSwgInBhdXNlU3RyZWFtIik7CiAgICBjb25zdCByZXN1bWVTdHJlYW0gPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCgpID0+IHByb2Nlc3MubmV4dFRpY2soKCkgPT4gc3RyZWFtLnJlc3VtZSgpKSwgInJlc3VtZVN0cmVhbSIpOwogICAgY29uc3Qgb25EYXRhID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoZGF0YSkgPT4gewogICAgICBwYXVzZVN0cmVhbSgpOwogICAgICBzdWJzY3JpYmVyLm5leHQoZGF0YSk7CiAgICAgIHJlc3VtZVN0cmVhbSgpOwogICAgfSwgIm9uRGF0YSIpOwogICAgc3RyZWFtLm9uKCJkYXRhIiwgb25EYXRhKTsKICAgIHN0cmVhbS5vbigiZXJyb3IiLCAoZXJyb3IpID0+IHN1YnNjcmliZXIuZXJyb3IoZXJyb3IpKTsKICAgIHN0cmVhbS5vbigiZW5kIiwgKCkgPT4gc3Vic2NyaWJlci5jb21wbGV0ZSgpKTsKICAgIHN0cmVhbS5vbigiY2xvc2UiLCAoKSA9PiBzdWJzY3JpYmVyLmNvbXBsZXRlKCkpOwogICAgcmV0dXJuICgpID0+IHsKICAgICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCJkYXRhIiwgb25EYXRhKTsKICAgICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsIHN1YnNjcmliZXIuZXJyb3IpOwogICAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoImVuZCIsIHN1YnNjcmliZXIuY29tcGxldGUpOwogICAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoImNsb3NlIiwgc3Vic2NyaWJlci5jb21wbGV0ZSk7CiAgICB9OwogIH0pOwp9Cl9fbmFtZShmcm9tU3RyZWFtV2l0aEJhY2twcmVzc3VyZSwgImZyb21TdHJlYW1XaXRoQmFja3ByZXNzdXJlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGxpdCtyZWFjdGl2ZS1lbGVtZW50QDIuMS4yL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGVjb3JhdG9ycy9wcm9wZXJ0eS5qcwp2YXIgbzYgPSB7IGF0dHJpYnV0ZTogdHJ1ZSwgdHlwZTogU3RyaW5nLCBjb252ZXJ0ZXI6IHUsIHJlZmxlY3Q6IGZhbHNlLCBoYXNDaGFuZ2VkOiBmIH0sIHI0ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgodDggPSBvNiwgZTEwLCByMTApID0+IHsKICBjb25zdCB7IGtpbmQ6IG4xMSwgbWV0YWRhdGE6IGkxMCB9ID0gcjEwOwogIGxldCBzOSA9IGdsb2JhbFRoaXMubGl0UHJvcGVydHlNZXRhZGF0YS5nZXQoaTEwKTsKICBpZiAodm9pZCAwID09PSBzOSAmJiBnbG9iYWxUaGlzLmxpdFByb3BlcnR5TWV0YWRhdGEuc2V0KGkxMCwgczkgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpKSwgInNldHRlciIgPT09IG4xMSAmJiAoKHQ4ID0gT2JqZWN0LmNyZWF0ZSh0OCkpLndyYXBwZWQgPSB0cnVlKSwgczkuc2V0KHIxMC5uYW1lLCB0OCksICJhY2Nlc3NvciIgPT09IG4xMSkgewogICAgY29uc3QgeyBuYW1lOiBvMTIgfSA9IHIxMDsKICAgIHJldHVybiB7IHNldChyMTEpIHsKICAgICAgY29uc3QgbjEyID0gZTEwLmdldC5jYWxsKHRoaXMpOwogICAgICBlMTAuc2V0LmNhbGwodGhpcywgcjExKSwgdGhpcy5yZXF1ZXN0VXBkYXRlKG8xMiwgbjEyLCB0OCwgdHJ1ZSwgcjExKTsKICAgIH0sIGluaXQoZTExKSB7CiAgICAgIHJldHVybiB2b2lkIDAgIT09IGUxMSAmJiB0aGlzLkMobzEyLCB2b2lkIDAsIHQ4LCBlMTEpLCBlMTE7CiAgICB9IH07CiAgfQogIGlmICgic2V0dGVyIiA9PT0gbjExKSB7CiAgICBjb25zdCB7IG5hbWU6IG8xMiB9ID0gcjEwOwogICAgcmV0dXJuIGZ1bmN0aW9uKHIxMSkgewogICAgICBjb25zdCBuMTIgPSB0aGlzW28xMl07CiAgICAgIGUxMC5jYWxsKHRoaXMsIHIxMSksIHRoaXMucmVxdWVzdFVwZGF0ZShvMTIsIG4xMiwgdDgsIHRydWUsIHIxMSk7CiAgICB9OwogIH0KICB0aHJvdyBFcnJvcigiVW5zdXBwb3J0ZWQgZGVjb3JhdG9yIGxvY2F0aW9uOiAiICsgbjExKTsKfSwgInIiKTsKZnVuY3Rpb24gbjUodDgpIHsKICByZXR1cm4gKGUxMCwgbzEyKSA9PiAib2JqZWN0IiA9PSB0eXBlb2YgbzEyID8gcjQodDgsIGUxMCwgbzEyKSA6ICgodDksIGUxMSwgbzEzKSA9PiB7CiAgICBjb25zdCByMTAgPSBlMTEuaGFzT3duUHJvcGVydHkobzEzKTsKICAgIHJldHVybiBlMTEuY29uc3RydWN0b3IuY3JlYXRlUHJvcGVydHkobzEzLCB0OSksIHIxMCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZTExLCBvMTMpIDogdm9pZCAwOwogIH0pKHQ4LCBlMTAsIG8xMik7Cn0KX19uYW1lKG41LCAibiIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZG9tdG9vbHNAMi41LjEvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZG9tdG9vbHMvZGlzdF90cy9pbmRleC5qcwp2YXIgZGlzdF90c19leHBvcnRzMjcgPSB7fTsKX19leHBvcnQoZGlzdF90c19leHBvcnRzMjcsIHsKICBEb21Ub29sczogKCkgPT4gRG9tVG9vbHMsCiAgVHlwZWRSZXF1ZXN0OiAoKSA9PiBUeXBlZFJlcXVlc3QsCiAgYnJlYWtwb2ludHM6ICgpID0+IGRvbXRvb2xzX2Nzc19icmVha3BvaW50c19leHBvcnRzLAogIGNzczogKCkgPT4gZG9tdG9vbHNfY3NzX2V4cG9ydHMsCiAgZWxlbWVudEJhc2ljOiAoKSA9PiBkb210b29sc19lbGVtZW50YmFzaWNfZXhwb3J0cywKICBwbHVnaW5zOiAoKSA9PiBkb210b29sc19wbHVnaW5leHBvcnRzX2V4cG9ydHMKfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1kb210b29sc0AyLjUuMS9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1kb210b29scy9kaXN0X3RzL2RvbXRvb2xzLmVsZW1lbnRiYXNpYy5qcwp2YXIgZG9tdG9vbHNfZWxlbWVudGJhc2ljX2V4cG9ydHMgPSB7fTsKX19leHBvcnQoZG9tdG9vbHNfZWxlbWVudGJhc2ljX2V4cG9ydHMsIHsKICBzZXR1cDogKCkgPT4gc2V0dXAsCiAgc3RhdGljU3R5bGVzOiAoKSA9PiBzdGF0aWNTdHlsZXMsCiAgc3R5bGVzOiAoKSA9PiBzdHlsZXMKfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jb21tc0AxLjAuMzAvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY29tbXMvZGlzdF90cy9pbmRleC5qcwp2YXIgZGlzdF90c19leHBvcnRzMTYgPSB7fTsKX19leHBvcnQoZGlzdF90c19leHBvcnRzMTYsIHsKICBEZWVzQ29tbXM6ICgpID0+IERlZXNDb21tcwp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydGRlbGF5QDMuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGRlbGF5L2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czMgPSB7fTsKX19leHBvcnQoZGlzdF90c19leHBvcnRzMywgewogIFRpbWVvdXQ6ICgpID0+IFRpbWVvdXQsCiAgZGVsYXlGb3I6ICgpID0+IGRlbGF5Rm9yLAogIGRlbGF5Rm9yUmFuZG9tOiAoKSA9PiBkZWxheUZvclJhbmRvbQp9KTsKdmFyIGRlbGF5Rm9yID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShhc3luYyAodGltZUluTWlsbGlzZWNvbmRBcmcsIHBhc3NPbkFyZywgdW5yZWZlZEFyZyA9IGZhbHNlKSA9PiB7CiAgY29uc3QgdGltZW91dDIgPSBuZXcgVGltZW91dCh0aW1lSW5NaWxsaXNlY29uZEFyZywgbnVsbCwgdW5yZWZlZEFyZyk7CiAgYXdhaXQgdGltZW91dDIucHJvbWlzZTsKICByZXR1cm4gcGFzc09uQXJnOwp9LCAiZGVsYXlGb3IiKTsKdmFyIGRlbGF5Rm9yUmFuZG9tID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShhc3luYyAodGltZU1pbkluTWlsbGlzZWNvbmRBcmcsIHRpbWVNYXhJbk1pbGxpc2Vjb25kQXJnLCBwYXNzT25BcmcsIHVucmVmZWRBcmcgPSBmYWxzZSkgPT4gewogIGF3YWl0IGRlbGF5Rm9yKE1hdGgucmFuZG9tKCkgKiAodGltZU1heEluTWlsbGlzZWNvbmRBcmcgLSB0aW1lTWluSW5NaWxsaXNlY29uZEFyZykgKyB0aW1lTWluSW5NaWxsaXNlY29uZEFyZywgbnVsbCwgdW5yZWZlZEFyZyk7CiAgcmV0dXJuIHBhc3NPbkFyZzsKfSwgImRlbGF5Rm9yUmFuZG9tIik7CnZhciBUaW1lb3V0ID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlRpbWVvdXQiKTsKICB9CiAgY29uc3RydWN0b3IodGltZUluTWlsbGlzZWNvbmRBcmcsIHBhc3NPbiwgdW5yZWZlZEFyZyA9IGZhbHNlKSB7CiAgICB0aGlzLl9jYW5jZWxsZWQgPSBmYWxzZTsKICAgIHRoaXMudGltZW91dEluTWlsbGlzID0gdGltZUluTWlsbGlzZWNvbmRBcmc7CiAgICB0aGlzLl9kZWZlcnJlZCA9IGRlZmVyKCk7CiAgICB0aGlzLnByb21pc2UgPSB0aGlzLl9kZWZlcnJlZC5wcm9taXNlOwogICAgdGhpcy5fdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICBpZiAoIXRoaXMuX2NhbmNlbGxlZCkgewogICAgICAgIHRoaXMuX2RlZmVycmVkLnJlc29sdmUocGFzc09uKTsKICAgICAgfQogICAgfSwgdGltZUluTWlsbGlzZWNvbmRBcmcpOwogICAgdGhpcy5zdGFydGVkID0gRGF0ZS5ub3coKTsKICAgIGlmICh1bnJlZmVkQXJnKSB7CiAgICAgIHRoaXMubWFrZVVucmVmZWQoKTsKICAgIH0KICB9CiAgLyoqCiAgICogdW5yZWZmaW5nIGEgdGltZW91dCBjYXVzZXMgdGhlIG5vZGUgcHJvY2VzcyB0byBub3Qgd2FpdCBmb3IgY29tcGxldGlvbiBiZWZvcmUgZXhpdAogICAqLwogIG1ha2VVbnJlZmVkKCkgewogICAgdGhpcy5fdGltZW91dC51bnJlZigpOwogIH0KICAvKioKICAgKiBjYW5jZWxzIHRoZSB0aW1lcgogICAqLwogIGNhbmNlbCgpIHsKICAgIHRoaXMuX2NhbmNlbGxlZCA9IHRydWU7CiAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCk7CiAgfQogIGdldFRpbWVMZWZ0KCkgewogICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zdGFydGVkICsgdGhpcy50aW1lb3V0SW5NaWxsaXMgLSBEYXRlLm5vdygpOwogICAgcmV0dXJuIHJlc3VsdCA+IDAgPyByZXN1bHQgOiAwOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AYXBpLmdsb2JhbCt0eXBlZHJlcXVlc3QtaW50ZXJmYWNlc0AzLjAuMTkvbm9kZV9tb2R1bGVzL0BhcGkuZ2xvYmFsL3R5cGVkcmVxdWVzdC1pbnRlcmZhY2VzL2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czQgPSB7fTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AYXBpLmdsb2JhbCt0eXBlZHJlcXVlc3RAMy4zLjAvbm9kZV9tb2R1bGVzL0BhcGkuZ2xvYmFsL3R5cGVkcmVxdWVzdC9kaXN0X3RzL2luZGV4LmpzCnZhciBkaXN0X3RzX2V4cG9ydHMxNSA9IHt9OwpfX2V4cG9ydChkaXN0X3RzX2V4cG9ydHMxNSwgewogIFR5cGVkSGFuZGxlcjogKCkgPT4gVHlwZWRIYW5kbGVyLAogIFR5cGVkUmVxdWVzdDogKCkgPT4gVHlwZWRSZXF1ZXN0LAogIFR5cGVkUmVzcG9uc2VFcnJvcjogKCkgPT4gVHlwZWRSZXNwb25zZUVycm9yLAogIFR5cGVkUm91dGVyOiAoKSA9PiBUeXBlZFJvdXRlciwKICBUeXBlZFRhcmdldDogKCkgPT4gVHlwZWRUYXJnZXQsCiAgVmlydHVhbFN0cmVhbTogKCkgPT4gVmlydHVhbFN0cmVhbQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytsaWtANi40LjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2xpay9kaXN0X3RzL2luZGV4LmpzCnZhciBkaXN0X3RzX2V4cG9ydHM2ID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czYsIHsKICBBc3luY0V4ZWN1dGlvblN0YWNrOiAoKSA9PiBBc3luY0V4ZWN1dGlvblN0YWNrLAogIEJhY2twcmVzc3VyZWRBcnJheTogKCkgPT4gQmFja3ByZXNzdXJlZEFycmF5LAogIEZhc3RNYXA6ICgpID0+IEZhc3RNYXAsCiAgSW50ZXJlc3Q6ICgpID0+IEludGVyZXN0LAogIEludGVyZXN0TWFwOiAoKSA9PiBJbnRlcmVzdE1hcCwKICBMaW1pdGVkQXJyYXk6ICgpID0+IExpbWl0ZWRBcnJheSwKICBMb29wVHJhY2tlcjogKCkgPT4gTG9vcFRyYWNrZXIsCiAgT2JqZWN0TWFwOiAoKSA9PiBPYmplY3RNYXAsCiAgU3RyaW5nbWFwOiAoKSA9PiBTdHJpbmdtYXAsCiAgVGltZWRBZ2dyZWdhdG9yOiAoKSA9PiBUaW1lZEFnZ3JlZ3RvciwKICBUaW1lZEFnZ3JlZ3RvcjogKCkgPT4gVGltZWRBZ2dyZWd0b3IsCiAgVHJlZTogKCkgPT4gVHJlZSwKICB1bmk6ICgpID0+IHVuaQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydG1hdGNoQDIuMC4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydG1hdGNoL2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czUgPSB7fTsKX19leHBvcnQoZGlzdF90c19leHBvcnRzNSwgewogIFNtYXJ0TWF0Y2g6ICgpID0+IFNtYXJ0TWF0Y2gKfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWF0Y2hlckA1LjAuMC9ub2RlX21vZHVsZXMvbWF0Y2hlci9pbmRleC5qcwp2YXIgbWF0Y2hlcl9leHBvcnRzID0ge307Cl9fZXhwb3J0KG1hdGNoZXJfZXhwb3J0cywgewogIGlzTWF0Y2g6ICgpID0+IGlzTWF0Y2gsCiAgbWF0Y2hlcjogKCkgPT4gbWF0Y2hlcgp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9lc2NhcGUtc3RyaW5nLXJlZ2V4cEA1LjAuMC9ub2RlX21vZHVsZXMvZXNjYXBlLXN0cmluZy1yZWdleHAvaW5kZXguanMKZnVuY3Rpb24gZXNjYXBlU3RyaW5nUmVnZXhwKHN0cmluZzMpIHsKICBpZiAodHlwZW9mIHN0cmluZzMgIT09ICJzdHJpbmciKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJFeHBlY3RlZCBhIHN0cmluZyIpOwogIH0KICByZXR1cm4gc3RyaW5nMy5yZXBsYWNlKC9bfFxce30oKVtcXV4kKyo/Ll0vZywgIlxcJCYiKS5yZXBsYWNlKC8tL2csICJcXHgyZCIpOwp9Cl9fbmFtZShlc2NhcGVTdHJpbmdSZWdleHAsICJlc2NhcGVTdHJpbmdSZWdleHAiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tYXRjaGVyQDUuMC4wL25vZGVfbW9kdWxlcy9tYXRjaGVyL2luZGV4LmpzCnZhciByZWdleHBDYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CnZhciBzYW5pdGl6ZUFycmF5ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoaW5wdXQsIGlucHV0TmFtZSkgPT4gewogIGlmICghQXJyYXkuaXNBcnJheShpbnB1dCkpIHsKICAgIHN3aXRjaCAodHlwZW9mIGlucHV0KSB7CiAgICAgIGNhc2UgInN0cmluZyI6CiAgICAgICAgaW5wdXQgPSBbaW5wdXRdOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJ1bmRlZmluZWQiOgogICAgICAgIGlucHV0ID0gW107CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgJyR7aW5wdXROYW1lfScgdG8gYmUgYSBzdHJpbmcgb3IgYW4gYXJyYXksIGJ1dCBnb3QgYSB0eXBlIG9mICcke3R5cGVvZiBpbnB1dH0nYCk7CiAgICB9CiAgfQogIHJldHVybiBpbnB1dC5maWx0ZXIoKHN0cmluZzMpID0+IHsKICAgIGlmICh0eXBlb2Ygc3RyaW5nMyAhPT0gInN0cmluZyIpIHsKICAgICAgaWYgKHR5cGVvZiBzdHJpbmczID09PSAidW5kZWZpbmVkIikgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCAnJHtpbnB1dE5hbWV9JyB0byBiZSBhbiBhcnJheSBvZiBzdHJpbmdzLCBidXQgZm91bmQgYSB0eXBlIG9mICcke3R5cGVvZiBzdHJpbmczfScgaW4gdGhlIGFycmF5YCk7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9KTsKfSwgInNhbml0aXplQXJyYXkiKTsKdmFyIG1ha2VSZWdleHAgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChwYXR0ZXJuLCBvcHRpb25zKSA9PiB7CiAgb3B0aW9ucyA9IHsKICAgIGNhc2VTZW5zaXRpdmU6IGZhbHNlLAogICAgLi4ub3B0aW9ucwogIH07CiAgY29uc3QgY2FjaGVLZXkgPSBwYXR0ZXJuICsgSlNPTi5zdHJpbmdpZnkob3B0aW9ucyk7CiAgaWYgKHJlZ2V4cENhY2hlLmhhcyhjYWNoZUtleSkpIHsKICAgIHJldHVybiByZWdleHBDYWNoZS5nZXQoY2FjaGVLZXkpOwogIH0KICBjb25zdCBuZWdhdGVkID0gcGF0dGVyblswXSA9PT0gIiEiOwogIGlmIChuZWdhdGVkKSB7CiAgICBwYXR0ZXJuID0gcGF0dGVybi5zbGljZSgxKTsKICB9CiAgcGF0dGVybiA9IGVzY2FwZVN0cmluZ1JlZ2V4cChwYXR0ZXJuKS5yZXBsYWNlKC9cXFwqL2csICJbXFxzXFxTXSoiKTsKICBjb25zdCByZWdleHAgPSBuZXcgUmVnRXhwKGBeJHtwYXR0ZXJufSRgLCBvcHRpb25zLmNhc2VTZW5zaXRpdmUgPyAiIiA6ICJpIik7CiAgcmVnZXhwLm5lZ2F0ZWQgPSBuZWdhdGVkOwogIHJlZ2V4cENhY2hlLnNldChjYWNoZUtleSwgcmVnZXhwKTsKICByZXR1cm4gcmVnZXhwOwp9LCAibWFrZVJlZ2V4cCIpOwp2YXIgYmFzZU1hdGNoZXIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChpbnB1dHMsIHBhdHRlcm5zMiwgb3B0aW9ucywgZmlyc3RNYXRjaE9ubHkpID0+IHsKICBpbnB1dHMgPSBzYW5pdGl6ZUFycmF5KGlucHV0cywgImlucHV0cyIpOwogIHBhdHRlcm5zMiA9IHNhbml0aXplQXJyYXkocGF0dGVybnMyLCAicGF0dGVybnMiKTsKICBpZiAocGF0dGVybnMyLmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuIFtdOwogIH0KICBwYXR0ZXJuczIgPSBwYXR0ZXJuczIubWFwKChwYXR0ZXJuKSA9PiBtYWtlUmVnZXhwKHBhdHRlcm4sIG9wdGlvbnMpKTsKICBjb25zdCB7IGFsbFBhdHRlcm5zIH0gPSBvcHRpb25zIHx8IHt9OwogIGNvbnN0IHJlc3VsdCA9IFtdOwogIGZvciAoY29uc3QgaW5wdXQgb2YgaW5wdXRzKSB7CiAgICBsZXQgbWF0Y2hlczsKICAgIGNvbnN0IGRpZEZpdCA9IFsuLi5wYXR0ZXJuczJdLmZpbGwoZmFsc2UpOwogICAgZm9yIChjb25zdCBbaW5kZXgyLCBwYXR0ZXJuXSBvZiBwYXR0ZXJuczIuZW50cmllcygpKSB7CiAgICAgIGlmIChwYXR0ZXJuLnRlc3QoaW5wdXQpKSB7CiAgICAgICAgZGlkRml0W2luZGV4Ml0gPSB0cnVlOwogICAgICAgIG1hdGNoZXMgPSAhcGF0dGVybi5uZWdhdGVkOwogICAgICAgIGlmICghbWF0Y2hlcykgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoIShtYXRjaGVzID09PSBmYWxzZSB8fCBtYXRjaGVzID09PSB2b2lkIDAgJiYgcGF0dGVybnMyLnNvbWUoKHBhdHRlcm4pID0+ICFwYXR0ZXJuLm5lZ2F0ZWQpIHx8IGFsbFBhdHRlcm5zICYmIGRpZEZpdC5zb21lKCh5ZXMsIGluZGV4MikgPT4gIXllcyAmJiAhcGF0dGVybnMyW2luZGV4Ml0ubmVnYXRlZCkpKSB7CiAgICAgIHJlc3VsdC5wdXNoKGlucHV0KTsKICAgICAgaWYgKGZpcnN0TWF0Y2hPbmx5KSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIHJlc3VsdDsKfSwgImJhc2VNYXRjaGVyIik7CmZ1bmN0aW9uIG1hdGNoZXIoaW5wdXRzLCBwYXR0ZXJuczIsIG9wdGlvbnMpIHsKICByZXR1cm4gYmFzZU1hdGNoZXIoaW5wdXRzLCBwYXR0ZXJuczIsIG9wdGlvbnMsIGZhbHNlKTsKfQpfX25hbWUobWF0Y2hlciwgIm1hdGNoZXIiKTsKZnVuY3Rpb24gaXNNYXRjaChpbnB1dHMsIHBhdHRlcm5zMiwgb3B0aW9ucykgewogIHJldHVybiBiYXNlTWF0Y2hlcihpbnB1dHMsIHBhdHRlcm5zMiwgb3B0aW9ucywgdHJ1ZSkubGVuZ3RoID4gMDsKfQpfX25hbWUoaXNNYXRjaCwgImlzTWF0Y2giKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydG1hdGNoQDIuMC4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydG1hdGNoL2Rpc3RfdHMvaW5kZXguanMKdmFyIFNtYXJ0TWF0Y2ggPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiU21hcnRNYXRjaCIpOwogIH0KICBjb25zdHJ1Y3Rvcih3aWxkY2FyZEFyZykgewogICAgdGhpcy53aWxkY2FyZCA9IHdpbGRjYXJkQXJnOwogIH0KICBtYXRjaChtYXRjaFN0cmluZ0FyZykgewogICAgcmV0dXJuIG1hdGNoZXJfZXhwb3J0cy5pc01hdGNoKG1hdGNoU3RyaW5nQXJnLCB0aGlzLndpbGRjYXJkKTsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR0aW1lQDQuMi4zL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHRpbWUvZGlzdF90cy9pbmRleC5qcwp2YXIgZGlzdF90c19leHBvcnRzNyA9IHt9OwpfX2V4cG9ydChkaXN0X3RzX2V4cG9ydHM3LCB7CiAgQ3JvbkpvYjogKCkgPT4gQ3JvbkpvYiwKICBDcm9uTWFuYWdlcjogKCkgPT4gQ3Jvbk1hbmFnZXIsCiAgRXh0ZW5kZWREYXRlOiAoKSA9PiBFeHRlbmRlZERhdGUsCiAgSHJ0TWVhc3VyZW1lbnQ6ICgpID0+IEhydE1lYXN1cmVtZW50LAogIEludGVydmFsOiAoKSA9PiBJbnRlcnZhbCwKICBUaW1lU3RhbXA6ICgpID0+IFRpbWVTdGFtcCwKICBUaW1lcjogKCkgPT4gVGltZXIsCiAgZ2V0TWlsbGlTZWNvbmRzQXNIdW1hblJlYWRhYmxlQWdvVGltZTogKCkgPT4gZ2V0TWlsbGlTZWNvbmRzQXNIdW1hblJlYWRhYmxlQWdvVGltZSwKICBnZXRNaWxsaVNlY29uZHNBc0h1bWFuUmVhZGFibGVTdHJpbmc6ICgpID0+IGdldE1pbGxpU2Vjb25kc0FzSHVtYW5SZWFkYWJsZVN0cmluZywKICBnZXRNaWxsaVNlY29uZHNGcm9tVW5pdHM6ICgpID0+IGdldE1pbGxpU2Vjb25kc0Zyb21Vbml0cywKICB1bml0czogKCkgPT4gdW5pdHMKfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vY3JvbmVyQDEwLjAuMS9ub2RlX21vZHVsZXMvY3JvbmVyL2Rpc3QvY3JvbmVyLmpzCnZhciBjcm9uZXJfZXhwb3J0cyA9IHt9OwpfX2V4cG9ydChjcm9uZXJfZXhwb3J0cywgewogIENyb246ICgpID0+IEUyLAogIENyb25EYXRlOiAoKSA9PiBtMiwKICBDcm9uUGF0dGVybjogKCkgPT4gQzIsCiAgc2NoZWR1bGVkSm9iczogKCkgPT4gdzIKfSk7CmZ1bmN0aW9uIFQyKHM5KSB7CiAgcmV0dXJuIERhdGUuVVRDKHM5LnksIHM5Lm0gLSAxLCBzOS5kLCBzOS5oLCBzOS5pLCBzOS5zKTsKfQpfX25hbWUoVDIsICJUIik7CmZ1bmN0aW9uIEQyKHM5LCBlMTApIHsKICByZXR1cm4gczkueSA9PT0gZTEwLnkgJiYgczkubSA9PT0gZTEwLm0gJiYgczkuZCA9PT0gZTEwLmQgJiYgczkuaCA9PT0gZTEwLmggJiYgczkuaSA9PT0gZTEwLmkgJiYgczkucyA9PT0gZTEwLnM7Cn0KX19uYW1lKEQyLCAiRCIpOwpmdW5jdGlvbiBBMihzOSwgZTEwKSB7CiAgbGV0IHQ4ID0gbmV3IERhdGUoRGF0ZS5wYXJzZShzOSkpOwogIGlmIChpc05hTih0OCkpIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBJU084NjAxIHBhc3NlZCB0byB0aW1lem9uZSBwYXJzZXIuIik7CiAgbGV0IHIxMCA9IHM5LnN1YnN0cmluZyg5KTsKICByZXR1cm4gcjEwLmluY2x1ZGVzKCJaIikgfHwgcjEwLmluY2x1ZGVzKCIrIikgfHwgcjEwLmluY2x1ZGVzKCItIikgPyBiMyh0OC5nZXRVVENGdWxsWWVhcigpLCB0OC5nZXRVVENNb250aCgpICsgMSwgdDguZ2V0VVRDRGF0ZSgpLCB0OC5nZXRVVENIb3VycygpLCB0OC5nZXRVVENNaW51dGVzKCksIHQ4LmdldFVUQ1NlY29uZHMoKSwgIkV0Yy9VVEMiKSA6IGIzKHQ4LmdldEZ1bGxZZWFyKCksIHQ4LmdldE1vbnRoKCkgKyAxLCB0OC5nZXREYXRlKCksIHQ4LmdldEhvdXJzKCksIHQ4LmdldE1pbnV0ZXMoKSwgdDguZ2V0U2Vjb25kcygpLCBlMTApOwp9Cl9fbmFtZShBMiwgIkEiKTsKZnVuY3Rpb24gdjIoczksIGUxMCwgdDgpIHsKICByZXR1cm4gazIoQTIoczksIGUxMCksIHQ4KTsKfQpfX25hbWUodjIsICJ2Iik7CmZ1bmN0aW9uIGsyKHM5LCBlMTApIHsKICBsZXQgdDggPSBuZXcgRGF0ZShUMihzOSkpLCByMTAgPSBnMih0OCwgczkudHopLCBuMTEgPSBUMihzOSksIGkxMCA9IFQyKHIxMCksIGE0ID0gbjExIC0gaTEwLCBvMTIgPSBuZXcgRGF0ZSh0OC5nZXRUaW1lKCkgKyBhNCksIGg3ID0gZzIobzEyLCBzOS50eik7CiAgaWYgKEQyKGg3LCBzOSkpIHsKICAgIGxldCB1NiA9IG5ldyBEYXRlKG8xMi5nZXRUaW1lKCkgLSAzNmU1KSwgZDQgPSBnMih1NiwgczkudHopOwogICAgcmV0dXJuIEQyKGQ0LCBzOSkgPyB1NiA6IG8xMjsKICB9CiAgbGV0IGw1ID0gbmV3IERhdGUobzEyLmdldFRpbWUoKSArIFQyKHM5KSAtIFQyKGg3KSksIHkzID0gZzIobDUsIHM5LnR6KTsKICBpZiAoRDIoeTMsIHM5KSkgcmV0dXJuIGw1OwogIGlmIChlMTApIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBkYXRlIHBhc3NlZCB0byBmcm9tVFooKSIpOwogIHJldHVybiBvMTIuZ2V0VGltZSgpID4gbDUuZ2V0VGltZSgpID8gbzEyIDogbDU7Cn0KX19uYW1lKGsyLCAiayIpOwpmdW5jdGlvbiBnMihzOSwgZTEwKSB7CiAgbGV0IHQ4LCByMTA7CiAgdHJ5IHsKICAgIHQ4ID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoImVuLVVTIiwgeyB0aW1lWm9uZTogZTEwLCB5ZWFyOiAibnVtZXJpYyIsIG1vbnRoOiAibnVtZXJpYyIsIGRheTogIm51bWVyaWMiLCBob3VyOiAibnVtZXJpYyIsIG1pbnV0ZTogIm51bWVyaWMiLCBzZWNvbmQ6ICJudW1lcmljIiwgaG91cjEyOiBmYWxzZSB9KSwgcjEwID0gdDguZm9ybWF0VG9QYXJ0cyhzOSk7CiAgfSBjYXRjaCAoaTEwKSB7CiAgICBsZXQgYTQgPSBpMTAgaW5zdGFuY2VvZiBFcnJvciA/IGkxMC5tZXNzYWdlIDogU3RyaW5nKGkxMCk7CiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgdG9UWjogSW52YWxpZCB0aW1lem9uZSAnJHtlMTB9JyBvciBkYXRlLiBQbGVhc2UgcHJvdmlkZSBhIHZhbGlkIElBTkEgdGltZXpvbmUgKGUuZy4sICdBbWVyaWNhL05ld19Zb3JrJywgJ0V1cm9wZS9TdG9ja2hvbG0nKS4gT3JpZ2luYWwgZXJyb3I6ICR7YTR9YCk7CiAgfQogIGxldCBuMTEgPSB7IHllYXI6IDAsIG1vbnRoOiAwLCBkYXk6IDAsIGhvdXI6IDAsIG1pbnV0ZTogMCwgc2Vjb25kOiAwIH07CiAgZm9yIChsZXQgaTEwIG9mIHIxMCkgKGkxMC50eXBlID09PSAieWVhciIgfHwgaTEwLnR5cGUgPT09ICJtb250aCIgfHwgaTEwLnR5cGUgPT09ICJkYXkiIHx8IGkxMC50eXBlID09PSAiaG91ciIgfHwgaTEwLnR5cGUgPT09ICJtaW51dGUiIHx8IGkxMC50eXBlID09PSAic2Vjb25kIikgJiYgKG4xMVtpMTAudHlwZV0gPSBwYXJzZUludChpMTAudmFsdWUsIDEwKSk7CiAgaWYgKGlzTmFOKG4xMS55ZWFyKSB8fCBpc05hTihuMTEubW9udGgpIHx8IGlzTmFOKG4xMS5kYXkpIHx8IGlzTmFOKG4xMS5ob3VyKSB8fCBpc05hTihuMTEubWludXRlKSB8fCBpc05hTihuMTEuc2Vjb25kKSkgdGhyb3cgbmV3IEVycm9yKGB0b1RaOiBGYWlsZWQgdG8gcGFyc2UgYWxsIGRhdGUgY29tcG9uZW50cyBmcm9tIHRpbWV6b25lICcke2UxMH0nLiBUaGlzIG1heSBpbmRpY2F0ZSBhbiBpbnZhbGlkIGRhdGUgb3IgdGltZXpvbmUgY29uZmlndXJhdGlvbi4gUGFyc2VkIGNvbXBvbmVudHM6ICR7SlNPTi5zdHJpbmdpZnkobjExKX1gKTsKICByZXR1cm4gbjExLmhvdXIgPT09IDI0ICYmIChuMTEuaG91ciA9IDApLCB7IHk6IG4xMS55ZWFyLCBtOiBuMTEubW9udGgsIGQ6IG4xMS5kYXksIGg6IG4xMS5ob3VyLCBpOiBuMTEubWludXRlLCBzOiBuMTEuc2Vjb25kLCB0ejogZTEwIH07Cn0KX19uYW1lKGcyLCAiZyIpOwpmdW5jdGlvbiBiMyhzOSwgZTEwLCB0OCwgcjEwLCBuMTEsIGkxMCwgYTQpIHsKICByZXR1cm4geyB5OiBzOSwgbTogZTEwLCBkOiB0OCwgaDogcjEwLCBpOiBuMTEsIHM6IGkxMCwgdHo6IGE0IH07Cn0KX19uYW1lKGIzLCAiYiIpOwp2YXIgTyA9IFsxLCAyLCA0LCA4LCAxNl0sIEMyID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkMiKTsKICB9CiAgcGF0dGVybjsKICB0aW1lem9uZTsKICBtb2RlOwogIGFsdGVybmF0aXZlV2Vla2RheXM7CiAgc2xvcHB5UmFuZ2VzOwogIHNlY29uZDsKICBtaW51dGU7CiAgaG91cjsKICBkYXk7CiAgbW9udGg7CiAgZGF5T2ZXZWVrOwogIHllYXI7CiAgbGFzdERheU9mTW9udGg7CiAgbGFzdFdlZWtkYXk7CiAgbmVhcmVzdFdlZWtkYXlzOwogIHN0YXJET007CiAgc3RhckRPVzsKICBzdGFyWWVhcjsKICB1c2VBbmRMb2dpYzsKICBjb25zdHJ1Y3RvcihlMTAsIHQ4LCByMTApIHsKICAgIHRoaXMucGF0dGVybiA9IGUxMCwgdGhpcy50aW1lem9uZSA9IHQ4LCB0aGlzLm1vZGUgPSByMTA/Lm1vZGUgPz8gImF1dG8iLCB0aGlzLmFsdGVybmF0aXZlV2Vla2RheXMgPSByMTA/LmFsdGVybmF0aXZlV2Vla2RheXMgPz8gZmFsc2UsIHRoaXMuc2xvcHB5UmFuZ2VzID0gcjEwPy5zbG9wcHlSYW5nZXMgPz8gZmFsc2UsIHRoaXMuc2Vjb25kID0gQXJyYXkoNjApLmZpbGwoMCksIHRoaXMubWludXRlID0gQXJyYXkoNjApLmZpbGwoMCksIHRoaXMuaG91ciA9IEFycmF5KDI0KS5maWxsKDApLCB0aGlzLmRheSA9IEFycmF5KDMxKS5maWxsKDApLCB0aGlzLm1vbnRoID0gQXJyYXkoMTIpLmZpbGwoMCksIHRoaXMuZGF5T2ZXZWVrID0gQXJyYXkoNykuZmlsbCgwKSwgdGhpcy55ZWFyID0gQXJyYXkoMWU0KS5maWxsKDApLCB0aGlzLmxhc3REYXlPZk1vbnRoID0gZmFsc2UsIHRoaXMubGFzdFdlZWtkYXkgPSBmYWxzZSwgdGhpcy5uZWFyZXN0V2Vla2RheXMgPSBBcnJheSgzMSkuZmlsbCgwKSwgdGhpcy5zdGFyRE9NID0gZmFsc2UsIHRoaXMuc3RhckRPVyA9IGZhbHNlLCB0aGlzLnN0YXJZZWFyID0gZmFsc2UsIHRoaXMudXNlQW5kTG9naWMgPSBmYWxzZSwgdGhpcy5wYXJzZSgpOwogIH0KICBwYXJzZSgpIHsKICAgIGlmICghKHR5cGVvZiB0aGlzLnBhdHRlcm4gPT0gInN0cmluZyIgfHwgdGhpcy5wYXR0ZXJuIGluc3RhbmNlb2YgU3RyaW5nKSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3JvblBhdHRlcm46IFBhdHRlcm4gaGFzIHRvIGJlIG9mIHR5cGUgc3RyaW5nLiIpOwogICAgdGhpcy5wYXR0ZXJuLmluZGV4T2YoIkAiKSA+PSAwICYmICh0aGlzLnBhdHRlcm4gPSB0aGlzLmhhbmRsZU5pY2tuYW1lcyh0aGlzLnBhdHRlcm4pLnRyaW0oKSk7CiAgICBsZXQgZTEwID0gdGhpcy5wYXR0ZXJuLm1hdGNoKC9cUysvZykgfHwgWyIiXSwgdDggPSBlMTAubGVuZ3RoOwogICAgaWYgKGUxMC5sZW5ndGggPCA1IHx8IGUxMC5sZW5ndGggPiA3KSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDcm9uUGF0dGVybjogaW52YWxpZCBjb25maWd1cmF0aW9uIGZvcm1hdCAoJyIgKyB0aGlzLnBhdHRlcm4gKyAiJyksIGV4YWN0bHkgZml2ZSwgc2l4LCBvciBzZXZlbiBzcGFjZSBzZXBhcmF0ZWQgcGFydHMgYXJlIHJlcXVpcmVkLiIpOwogICAgaWYgKHRoaXMubW9kZSAhPT0gImF1dG8iKSB7CiAgICAgIGxldCBuMTE7CiAgICAgIHN3aXRjaCAodGhpcy5tb2RlKSB7CiAgICAgICAgY2FzZSAiNS1wYXJ0IjoKICAgICAgICAgIG4xMSA9IDU7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICI2LXBhcnQiOgogICAgICAgICAgbjExID0gNjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIjctcGFydCI6CiAgICAgICAgICBuMTEgPSA3OwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiNS1vci02LXBhcnRzIjoKICAgICAgICAgIG4xMSA9IFs1LCA2XTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIjYtb3ItNy1wYXJ0cyI6CiAgICAgICAgICBuMTEgPSBbNiwgN107CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgbjExID0gMDsKICAgICAgfQogICAgICBpZiAoIShBcnJheS5pc0FycmF5KG4xMSkgPyBuMTEuaW5jbHVkZXModDgpIDogdDggPT09IG4xMSkpIHsKICAgICAgICBsZXQgYTQgPSBBcnJheS5pc0FycmF5KG4xMSkgPyBuMTEuam9pbigiIG9yICIpIDogbjExLnRvU3RyaW5nKCk7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgQ3JvblBhdHRlcm46IG1vZGUgJyR7dGhpcy5tb2RlfScgcmVxdWlyZXMgZXhhY3RseSAke2E0fSBwYXJ0cywgYnV0IHBhdHRlcm4gJyR7dGhpcy5wYXR0ZXJufScgaGFzICR7dDh9IHBhcnRzLmApOwogICAgICB9CiAgICB9CiAgICBpZiAoZTEwLmxlbmd0aCA9PT0gNSAmJiBlMTAudW5zaGlmdCgiMCIpLCBlMTAubGVuZ3RoID09PSA2ICYmIGUxMC5wdXNoKCIqIiksIGUxMFszXS50b1VwcGVyQ2FzZSgpID09PSAiTFciID8gKHRoaXMubGFzdFdlZWtkYXkgPSB0cnVlLCBlMTBbM10gPSAiIikgOiBlMTBbM10udG9VcHBlckNhc2UoKS5pbmRleE9mKCJMIikgPj0gMCAmJiAoZTEwWzNdID0gZTEwWzNdLnJlcGxhY2UoL0wvZ2ksICIiKSwgdGhpcy5sYXN0RGF5T2ZNb250aCA9IHRydWUpLCBlMTBbM10gPT0gIioiICYmICh0aGlzLnN0YXJET00gPSB0cnVlKSwgZTEwWzZdID09ICIqIiAmJiAodGhpcy5zdGFyWWVhciA9IHRydWUpLCBlMTBbNF0ubGVuZ3RoID49IDMgJiYgKGUxMFs0XSA9IHRoaXMucmVwbGFjZUFscGhhTW9udGhzKGUxMFs0XSkpLCBlMTBbNV0ubGVuZ3RoID49IDMgJiYgKGUxMFs1XSA9IHRoaXMuYWx0ZXJuYXRpdmVXZWVrZGF5cyA/IHRoaXMucmVwbGFjZUFscGhhRGF5c1F1YXJ0eihlMTBbNV0pIDogdGhpcy5yZXBsYWNlQWxwaGFEYXlzKGUxMFs1XSkpLCBlMTBbNV0uc3RhcnRzV2l0aCgiKyIpICYmICh0aGlzLnVzZUFuZExvZ2ljID0gdHJ1ZSwgZTEwWzVdID0gZTEwWzVdLnN1YnN0cmluZygxKSwgZTEwWzVdID09PSAiIikpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNyb25QYXR0ZXJuOiBEYXktb2Ytd2VlayBmaWVsZCBjYW5ub3QgYmUgZW1wdHkgYWZ0ZXIgJysnIG1vZGlmaWVyLiIpOwogICAgc3dpdGNoIChlMTBbNV0gPT0gIioiICYmICh0aGlzLnN0YXJET1cgPSB0cnVlKSwgdGhpcy5wYXR0ZXJuLmluZGV4T2YoIj8iKSA+PSAwICYmIChlMTBbMF0gPSBlMTBbMF0ucmVwbGFjZSgvXD8vZywgIioiKSwgZTEwWzFdID0gZTEwWzFdLnJlcGxhY2UoL1w/L2csICIqIiksIGUxMFsyXSA9IGUxMFsyXS5yZXBsYWNlKC9cPy9nLCAiKiIpLCBlMTBbM10gPSBlMTBbM10ucmVwbGFjZSgvXD8vZywgIioiKSwgZTEwWzRdID0gZTEwWzRdLnJlcGxhY2UoL1w/L2csICIqIiksIGUxMFs1XSA9IGUxMFs1XS5yZXBsYWNlKC9cPy9nLCAiKiIpLCBlMTBbNl0gJiYgKGUxMFs2XSA9IGUxMFs2XS5yZXBsYWNlKC9cPy9nLCAiKiIpKSksIHRoaXMubW9kZSkgewogICAgICBjYXNlICI1LXBhcnQiOgogICAgICAgIGUxMFswXSA9ICIwIiwgZTEwWzZdID0gIioiOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICI2LXBhcnQiOgogICAgICAgIGUxMFs2XSA9ICIqIjsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiNS1vci02LXBhcnRzIjoKICAgICAgICBlMTBbNl0gPSAiKiI7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIjYtb3ItNy1wYXJ0cyI6CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIjctcGFydCI6CiAgICAgIGNhc2UgImF1dG8iOgogICAgICAgIGJyZWFrOwogICAgfQogICAgdGhpcy50aHJvd0F0SWxsZWdhbENoYXJhY3RlcnMoZTEwKSwgdGhpcy5wYXJ0VG9BcnJheSgic2Vjb25kIiwgZTEwWzBdLCAwLCAxKSwgdGhpcy5wYXJ0VG9BcnJheSgibWludXRlIiwgZTEwWzFdLCAwLCAxKSwgdGhpcy5wYXJ0VG9BcnJheSgiaG91ciIsIGUxMFsyXSwgMCwgMSksIHRoaXMucGFydFRvQXJyYXkoImRheSIsIGUxMFszXSwgLTEsIDEpLCB0aGlzLnBhcnRUb0FycmF5KCJtb250aCIsIGUxMFs0XSwgLTEsIDEpOwogICAgbGV0IHIxMCA9IHRoaXMuYWx0ZXJuYXRpdmVXZWVrZGF5cyA/IC0xIDogMDsKICAgIHRoaXMucGFydFRvQXJyYXkoImRheU9mV2VlayIsIGUxMFs1XSwgcjEwLCA2MyksIHRoaXMucGFydFRvQXJyYXkoInllYXIiLCBlMTBbNl0sIDAsIDEpLCAhdGhpcy5hbHRlcm5hdGl2ZVdlZWtkYXlzICYmIHRoaXMuZGF5T2ZXZWVrWzddICYmICh0aGlzLmRheU9mV2Vla1swXSA9IHRoaXMuZGF5T2ZXZWVrWzddKTsKICB9CiAgcGFydFRvQXJyYXkoZTEwLCB0OCwgcjEwLCBuMTEpIHsKICAgIGxldCBpMTAgPSB0aGlzW2UxMF0sIGE0ID0gZTEwID09PSAiZGF5IiAmJiB0aGlzLmxhc3REYXlPZk1vbnRoLCBvMTIgPSBlMTAgPT09ICJkYXkiICYmIHRoaXMubGFzdFdlZWtkYXk7CiAgICBpZiAodDggPT09ICIiICYmICFhNCAmJiAhbzEyKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDcm9uUGF0dGVybjogY29uZmlndXJhdGlvbiBlbnRyeSAiICsgZTEwICsgIiAoIiArIHQ4ICsgIikgaXMgZW1wdHksIGNoZWNrIGZvciB0cmFpbGluZyBzcGFjZXMuIik7CiAgICBpZiAodDggPT09ICIqIikgcmV0dXJuIGkxMC5maWxsKG4xMSk7CiAgICBsZXQgaDcgPSB0OC5zcGxpdCgiLCIpOwogICAgaWYgKGg3Lmxlbmd0aCA+IDEpIGZvciAobGV0IGw1ID0gMDsgbDUgPCBoNy5sZW5ndGg7IGw1KyspIHRoaXMucGFydFRvQXJyYXkoZTEwLCBoN1tsNV0sIHIxMCwgbjExKTsKICAgIGVsc2UgdDguaW5kZXhPZigiLSIpICE9PSAtMSAmJiB0OC5pbmRleE9mKCIvIikgIT09IC0xID8gdGhpcy5oYW5kbGVSYW5nZVdpdGhTdGVwcGluZyh0OCwgZTEwLCByMTAsIG4xMSkgOiB0OC5pbmRleE9mKCItIikgIT09IC0xID8gdGhpcy5oYW5kbGVSYW5nZSh0OCwgZTEwLCByMTAsIG4xMSkgOiB0OC5pbmRleE9mKCIvIikgIT09IC0xID8gdGhpcy5oYW5kbGVTdGVwcGluZyh0OCwgZTEwLCByMTAsIG4xMSkgOiB0OCAhPT0gIiIgJiYgdGhpcy5oYW5kbGVOdW1iZXIodDgsIGUxMCwgcjEwLCBuMTEpOwogIH0KICB0aHJvd0F0SWxsZWdhbENoYXJhY3RlcnMoZTEwKSB7CiAgICBmb3IgKGxldCB0OCA9IDA7IHQ4IDwgZTEwLmxlbmd0aDsgdDgrKykgaWYgKCh0OCA9PT0gMyA/IC9bXi8qMC05LFwtV3dMbF0rLyA6IHQ4ID09PSA1ID8gL1teLyowLTksXC0jTGxdKy8gOiAvW14vKjAtOSxcLV0rLykudGVzdChlMTBbdDhdKSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3JvblBhdHRlcm46IGNvbmZpZ3VyYXRpb24gZW50cnkgIiArIHQ4ICsgIiAoIiArIGUxMFt0OF0gKyAiKSBjb250YWlucyBpbGxlZ2FsIGNoYXJhY3RlcnMuIik7CiAgfQogIGhhbmRsZU51bWJlcihlMTAsIHQ4LCByMTAsIG4xMSkgewogICAgbGV0IGkxMCA9IHRoaXMuZXh0cmFjdE50aChlMTAsIHQ4KSwgYTQgPSBlMTAudG9VcHBlckNhc2UoKS5pbmNsdWRlcygiVyIpOwogICAgaWYgKHQ4ICE9PSAiZGF5IiAmJiBhNCkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3JvblBhdHRlcm46IE5lYXJlc3Qgd2Vla2RheSBtb2RpZmllciAoVykgb25seSBhbGxvd2VkIGluIGRheS1vZi1tb250aC4iKTsKICAgIGE0ICYmICh0OCA9ICJuZWFyZXN0V2Vla2RheXMiKTsKICAgIGxldCBvMTIgPSBwYXJzZUludChpMTBbMF0sIDEwKSArIHIxMDsKICAgIGlmIChpc05hTihvMTIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDcm9uUGF0dGVybjogIiArIHQ4ICsgIiBpcyBub3QgYSBudW1iZXI6ICciICsgZTEwICsgIiciKTsKICAgIHRoaXMuc2V0UGFydCh0OCwgbzEyLCBpMTBbMV0gfHwgbjExKTsKICB9CiAgc2V0UGFydChlMTAsIHQ4LCByMTApIHsKICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMsIGUxMCkpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNyb25QYXR0ZXJuOiBJbnZhbGlkIHBhcnQgc3BlY2lmaWVkOiAiICsgZTEwKTsKICAgIGlmIChlMTAgPT09ICJkYXlPZldlZWsiKSB7CiAgICAgIGlmICh0OCA9PT0gNyAmJiAodDggPSAwKSwgdDggPCAwIHx8IHQ4ID4gNikgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkNyb25QYXR0ZXJuOiBJbnZhbGlkIHZhbHVlIGZvciBkYXlPZldlZWs6ICIgKyB0OCk7CiAgICAgIHRoaXMuc2V0TnRoV2Vla2RheU9mTW9udGgodDgsIHIxMCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChlMTAgPT09ICJzZWNvbmQiIHx8IGUxMCA9PT0gIm1pbnV0ZSIpIHsKICAgICAgaWYgKHQ4IDwgMCB8fCB0OCA+PSA2MCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkNyb25QYXR0ZXJuOiBJbnZhbGlkIHZhbHVlIGZvciAiICsgZTEwICsgIjogIiArIHQ4KTsKICAgIH0gZWxzZSBpZiAoZTEwID09PSAiaG91ciIpIHsKICAgICAgaWYgKHQ4IDwgMCB8fCB0OCA+PSAyNCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkNyb25QYXR0ZXJuOiBJbnZhbGlkIHZhbHVlIGZvciAiICsgZTEwICsgIjogIiArIHQ4KTsKICAgIH0gZWxzZSBpZiAoZTEwID09PSAiZGF5IiB8fCBlMTAgPT09ICJuZWFyZXN0V2Vla2RheXMiKSB7CiAgICAgIGlmICh0OCA8IDAgfHwgdDggPj0gMzEpIHRocm93IG5ldyBSYW5nZUVycm9yKCJDcm9uUGF0dGVybjogSW52YWxpZCB2YWx1ZSBmb3IgIiArIGUxMCArICI6ICIgKyB0OCk7CiAgICB9IGVsc2UgaWYgKGUxMCA9PT0gIm1vbnRoIikgewogICAgICBpZiAodDggPCAwIHx8IHQ4ID49IDEyKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQ3JvblBhdHRlcm46IEludmFsaWQgdmFsdWUgZm9yICIgKyBlMTAgKyAiOiAiICsgdDgpOwogICAgfSBlbHNlIGlmIChlMTAgPT09ICJ5ZWFyIiAmJiAodDggPCAxIHx8IHQ4ID49IDFlNCkpIHRocm93IG5ldyBSYW5nZUVycm9yKCJDcm9uUGF0dGVybjogSW52YWxpZCB2YWx1ZSBmb3IgIiArIGUxMCArICI6ICIgKyB0OCArICIgKHN1cHBvcnRlZCByYW5nZTogMS05OTk5KSIpOwogICAgdGhpc1tlMTBdW3Q4XSA9IHIxMDsKICB9CiAgdmFsaWRhdGVOb3ROYU4oZTEwLCB0OCkgewogICAgaWYgKGlzTmFOKGUxMCkpIHRocm93IG5ldyBUeXBlRXJyb3IodDgpOwogIH0KICB2YWxpZGF0ZVJhbmdlKGUxMCwgdDgsIHIxMCwgbjExLCBpMTApIHsKICAgIGlmIChlMTAgPiB0OCkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3JvblBhdHRlcm46IEZyb20gdmFsdWUgaXMgbGFyZ2VyIHRoYW4gdG8gdmFsdWU6ICciICsgaTEwICsgIiciKTsKICAgIGlmIChyMTAgIT09IHZvaWQgMCkgewogICAgICBpZiAocjEwID09PSAwKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDcm9uUGF0dGVybjogU3ludGF4IGVycm9yLCBpbGxlZ2FsIHN0ZXBwaW5nOiAwIik7CiAgICAgIGlmIChyMTAgPiB0aGlzW24xMV0ubGVuZ3RoKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDcm9uUGF0dGVybjogU3ludGF4IGVycm9yLCBzdGVwcyBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIG1heGltdW0gdmFsdWUgb2YgcGFydCAoIiArIHRoaXNbbjExXS5sZW5ndGggKyAiKSIpOwogICAgfQogIH0KICBoYW5kbGVSYW5nZVdpdGhTdGVwcGluZyhlMTAsIHQ4LCByMTAsIG4xMSkgewogICAgaWYgKGUxMC50b1VwcGVyQ2FzZSgpLmluY2x1ZGVzKCJXIikpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNyb25QYXR0ZXJuOiBTeW50YXggZXJyb3IsIFcgaXMgbm90IGFsbG93ZWQgaW4gcmFuZ2VzIHdpdGggc3RlcHBpbmcuIik7CiAgICBsZXQgaTEwID0gdGhpcy5leHRyYWN0TnRoKGUxMCwgdDgpLCBhNCA9IGkxMFswXS5tYXRjaCgvXihcZCspLShcZCspXC8oXGQrKSQvKTsKICAgIGlmIChhNCA9PT0gbnVsbCkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3JvblBhdHRlcm46IFN5bnRheCBlcnJvciwgaWxsZWdhbCByYW5nZSB3aXRoIHN0ZXBwaW5nOiAnIiArIGUxMCArICInIik7CiAgICBsZXQgWywgbzEyLCBoNywgbDVdID0gYTQsIHkzID0gcGFyc2VJbnQobzEyLCAxMCkgKyByMTAsIHU2ID0gcGFyc2VJbnQoaDcsIDEwKSArIHIxMCwgZDQgPSBwYXJzZUludChsNSwgMTApOwogICAgdGhpcy52YWxpZGF0ZU5vdE5hTih5MywgIkNyb25QYXR0ZXJuOiBTeW50YXggZXJyb3IsIGlsbGVnYWwgbG93ZXIgcmFuZ2UgKE5hTikiKSwgdGhpcy52YWxpZGF0ZU5vdE5hTih1NiwgIkNyb25QYXR0ZXJuOiBTeW50YXggZXJyb3IsIGlsbGVnYWwgdXBwZXIgcmFuZ2UgKE5hTikiKSwgdGhpcy52YWxpZGF0ZU5vdE5hTihkNCwgIkNyb25QYXR0ZXJuOiBTeW50YXggZXJyb3IsIGlsbGVnYWwgc3RlcHBpbmc6IChOYU4pIiksIHRoaXMudmFsaWRhdGVSYW5nZSh5MywgdTYsIGQ0LCB0OCwgZTEwKTsKICAgIGZvciAobGV0IGMxMCA9IHkzOyBjMTAgPD0gdTY7IGMxMCArPSBkNCkgdGhpcy5zZXRQYXJ0KHQ4LCBjMTAsIGkxMFsxXSB8fCBuMTEpOwogIH0KICBleHRyYWN0TnRoKGUxMCwgdDgpIHsKICAgIGxldCByMTAgPSBlMTAsIG4xMTsKICAgIGlmIChyMTAuaW5jbHVkZXMoIiMiKSkgewogICAgICBpZiAodDggIT09ICJkYXlPZldlZWsiKSB0aHJvdyBuZXcgRXJyb3IoIkNyb25QYXR0ZXJuOiBudGggKCMpIG9ubHkgYWxsb3dlZCBpbiBkYXktb2Ytd2VlayBmaWVsZCIpOwogICAgICBuMTEgPSByMTAuc3BsaXQoIiMiKVsxXSwgcjEwID0gcjEwLnNwbGl0KCIjIilbMF07CiAgICB9IGVsc2UgaWYgKHIxMC50b1VwcGVyQ2FzZSgpLmVuZHNXaXRoKCJMIikpIHsKICAgICAgaWYgKHQ4ICE9PSAiZGF5T2ZXZWVrIikgdGhyb3cgbmV3IEVycm9yKCJDcm9uUGF0dGVybjogTCBtb2RpZmllciBvbmx5IGFsbG93ZWQgaW4gZGF5LW9mLXdlZWsgZmllbGQgKHVzZSBMIGFsb25lIGZvciBkYXktb2YtbW9udGgpIik7CiAgICAgIG4xMSA9ICJMIiwgcjEwID0gcjEwLnNsaWNlKDAsIC0xKTsKICAgIH0KICAgIHJldHVybiBbcjEwLCBuMTFdOwogIH0KICBoYW5kbGVSYW5nZShlMTAsIHQ4LCByMTAsIG4xMSkgewogICAgaWYgKGUxMC50b1VwcGVyQ2FzZSgpLmluY2x1ZGVzKCJXIikpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNyb25QYXR0ZXJuOiBTeW50YXggZXJyb3IsIFcgaXMgbm90IGFsbG93ZWQgaW4gYSByYW5nZS4iKTsKICAgIGxldCBpMTAgPSB0aGlzLmV4dHJhY3ROdGgoZTEwLCB0OCksIGE0ID0gaTEwWzBdLnNwbGl0KCItIik7CiAgICBpZiAoYTQubGVuZ3RoICE9PSAyKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDcm9uUGF0dGVybjogU3ludGF4IGVycm9yLCBpbGxlZ2FsIHJhbmdlOiAnIiArIGUxMCArICInIik7CiAgICBsZXQgbzEyID0gcGFyc2VJbnQoYTRbMF0sIDEwKSArIHIxMCwgaDcgPSBwYXJzZUludChhNFsxXSwgMTApICsgcjEwOwogICAgdGhpcy52YWxpZGF0ZU5vdE5hTihvMTIsICJDcm9uUGF0dGVybjogU3ludGF4IGVycm9yLCBpbGxlZ2FsIGxvd2VyIHJhbmdlIChOYU4pIiksIHRoaXMudmFsaWRhdGVOb3ROYU4oaDcsICJDcm9uUGF0dGVybjogU3ludGF4IGVycm9yLCBpbGxlZ2FsIHVwcGVyIHJhbmdlIChOYU4pIiksIHRoaXMudmFsaWRhdGVSYW5nZShvMTIsIGg3LCB2b2lkIDAsIHQ4LCBlMTApOwogICAgZm9yIChsZXQgbDUgPSBvMTI7IGw1IDw9IGg3OyBsNSsrKSB0aGlzLnNldFBhcnQodDgsIGw1LCBpMTBbMV0gfHwgbjExKTsKICB9CiAgaGFuZGxlU3RlcHBpbmcoZTEwLCB0OCwgcjEwLCBuMTEpIHsKICAgIGlmIChlMTAudG9VcHBlckNhc2UoKS5pbmNsdWRlcygiVyIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDcm9uUGF0dGVybjogU3ludGF4IGVycm9yLCBXIGlzIG5vdCBhbGxvd2VkIGluIHBhcnRzIHdpdGggc3RlcHBpbmcuIik7CiAgICBsZXQgaTEwID0gdGhpcy5leHRyYWN0TnRoKGUxMCwgdDgpLCBhNCA9IGkxMFswXS5zcGxpdCgiLyIpOwogICAgaWYgKGE0Lmxlbmd0aCAhPT0gMikgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3JvblBhdHRlcm46IFN5bnRheCBlcnJvciwgaWxsZWdhbCBzdGVwcGluZzogJyIgKyBlMTAgKyAiJyIpOwogICAgaWYgKHRoaXMuc2xvcHB5UmFuZ2VzKSBhNFswXSA9PT0gIiIgJiYgKGE0WzBdID0gIioiKTsKICAgIGVsc2UgewogICAgICBpZiAoYTRbMF0gPT09ICIiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDcm9uUGF0dGVybjogU3ludGF4IGVycm9yLCBzdGVwcGluZyB3aXRoIG1pc3NpbmcgcHJlZml4ICgnIiArIGUxMCArICInKSBpcyBub3QgYWxsb3dlZC4gVXNlIHdpbGRjYXJkICgqL3N0ZXApIG9yIHJhbmdlIChtaW4tbWF4L3N0ZXApIGluc3RlYWQuIik7CiAgICAgIGlmIChhNFswXSAhPT0gIioiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDcm9uUGF0dGVybjogU3ludGF4IGVycm9yLCBzdGVwcGluZyB3aXRoIG51bWVyaWMgcHJlZml4ICgnIiArIGUxMCArICInKSBpcyBub3QgYWxsb3dlZC4gVXNlIHdpbGRjYXJkICgqL3N0ZXApIG9yIHJhbmdlIChtaW4tbWF4L3N0ZXApIGluc3RlYWQuIik7CiAgICB9CiAgICBsZXQgbzEyID0gMDsKICAgIGE0WzBdICE9PSAiKiIgJiYgKG8xMiA9IHBhcnNlSW50KGE0WzBdLCAxMCkgKyByMTApOwogICAgbGV0IGg3ID0gcGFyc2VJbnQoYTRbMV0sIDEwKTsKICAgIHRoaXMudmFsaWRhdGVOb3ROYU4oaDcsICJDcm9uUGF0dGVybjogU3ludGF4IGVycm9yLCBpbGxlZ2FsIHN0ZXBwaW5nOiAoTmFOKSIpLCB0aGlzLnZhbGlkYXRlUmFuZ2UoMCwgdGhpc1t0OF0ubGVuZ3RoIC0gMSwgaDcsIHQ4LCBlMTApOwogICAgZm9yIChsZXQgbDUgPSBvMTI7IGw1IDwgdGhpc1t0OF0ubGVuZ3RoOyBsNSArPSBoNykgdGhpcy5zZXRQYXJ0KHQ4LCBsNSwgaTEwWzFdIHx8IG4xMSk7CiAgfQogIHJlcGxhY2VBbHBoYURheXMoZTEwKSB7CiAgICByZXR1cm4gZTEwLnJlcGxhY2UoLy1zdW4vZ2ksICItNyIpLnJlcGxhY2UoL3N1bi9naSwgIjAiKS5yZXBsYWNlKC9tb24vZ2ksICIxIikucmVwbGFjZSgvdHVlL2dpLCAiMiIpLnJlcGxhY2UoL3dlZC9naSwgIjMiKS5yZXBsYWNlKC90aHUvZ2ksICI0IikucmVwbGFjZSgvZnJpL2dpLCAiNSIpLnJlcGxhY2UoL3NhdC9naSwgIjYiKTsKICB9CiAgcmVwbGFjZUFscGhhRGF5c1F1YXJ0eihlMTApIHsKICAgIHJldHVybiBlMTAucmVwbGFjZSgvc3VuL2dpLCAiMSIpLnJlcGxhY2UoL21vbi9naSwgIjIiKS5yZXBsYWNlKC90dWUvZ2ksICIzIikucmVwbGFjZSgvd2VkL2dpLCAiNCIpLnJlcGxhY2UoL3RodS9naSwgIjUiKS5yZXBsYWNlKC9mcmkvZ2ksICI2IikucmVwbGFjZSgvc2F0L2dpLCAiNyIpOwogIH0KICByZXBsYWNlQWxwaGFNb250aHMoZTEwKSB7CiAgICByZXR1cm4gZTEwLnJlcGxhY2UoL2phbi9naSwgIjEiKS5yZXBsYWNlKC9mZWIvZ2ksICIyIikucmVwbGFjZSgvbWFyL2dpLCAiMyIpLnJlcGxhY2UoL2Fwci9naSwgIjQiKS5yZXBsYWNlKC9tYXkvZ2ksICI1IikucmVwbGFjZSgvanVuL2dpLCAiNiIpLnJlcGxhY2UoL2p1bC9naSwgIjciKS5yZXBsYWNlKC9hdWcvZ2ksICI4IikucmVwbGFjZSgvc2VwL2dpLCAiOSIpLnJlcGxhY2UoL29jdC9naSwgIjEwIikucmVwbGFjZSgvbm92L2dpLCAiMTEiKS5yZXBsYWNlKC9kZWMvZ2ksICIxMiIpOwogIH0KICBoYW5kbGVOaWNrbmFtZXMoZTEwKSB7CiAgICBsZXQgdDggPSBlMTAudHJpbSgpLnRvTG93ZXJDYXNlKCk7CiAgICBpZiAodDggPT09ICJAeWVhcmx5IiB8fCB0OCA9PT0gIkBhbm51YWxseSIpIHJldHVybiAiMCAwIDEgMSAqIjsKICAgIGlmICh0OCA9PT0gIkBtb250aGx5IikgcmV0dXJuICIwIDAgMSAqICoiOwogICAgaWYgKHQ4ID09PSAiQHdlZWtseSIpIHJldHVybiAiMCAwICogKiAwIjsKICAgIGlmICh0OCA9PT0gIkBkYWlseSIgfHwgdDggPT09ICJAbWlkbmlnaHQiKSByZXR1cm4gIjAgMCAqICogKiI7CiAgICBpZiAodDggPT09ICJAaG91cmx5IikgcmV0dXJuICIwICogKiAqICoiOwogICAgaWYgKHQ4ID09PSAiQHJlYm9vdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNyb25QYXR0ZXJuOiBAcmVib290IGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudC4gVGhpcyBpcyBhbiBldmVudC1iYXNlZCB0cmlnZ2VyIHRoYXQgcmVxdWlyZXMgc3lzdGVtIHN0YXJ0dXAgZGV0ZWN0aW9uLiIpOwogICAgcmV0dXJuIGUxMDsKICB9CiAgc2V0TnRoV2Vla2RheU9mTW9udGgoZTEwLCB0OCkgewogICAgaWYgKHR5cGVvZiB0OCAhPSAibnVtYmVyIiAmJiB0OC50b1VwcGVyQ2FzZSgpID09PSAiTCIpIHRoaXMuZGF5T2ZXZWVrW2UxMF0gPSB0aGlzLmRheU9mV2Vla1tlMTBdIHwgMzI7CiAgICBlbHNlIGlmICh0OCA9PT0gNjMpIHRoaXMuZGF5T2ZXZWVrW2UxMF0gPSA2MzsKICAgIGVsc2UgaWYgKHQ4IDwgNiAmJiB0OCA+IDApIHRoaXMuZGF5T2ZXZWVrW2UxMF0gPSB0aGlzLmRheU9mV2Vla1tlMTBdIHwgT1t0OCAtIDFdOwogICAgZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKGBDcm9uUGF0dGVybjogbnRoIHdlZWtkYXkgb3V0IG9mIHJhbmdlLCBzaG91bGQgYmUgMS01IG9yIEwuIFZhbHVlOiAke3Q4fSwgVHlwZTogJHt0eXBlb2YgdDh9YCk7CiAgfQp9Owp2YXIgUDIgPSBbMzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMV0sIGYzID0gW1sibW9udGgiLCAieWVhciIsIDBdLCBbImRheSIsICJtb250aCIsIC0xXSwgWyJob3VyIiwgImRheSIsIDBdLCBbIm1pbnV0ZSIsICJob3VyIiwgMF0sIFsic2Vjb25kIiwgIm1pbnV0ZSIsIDBdXSwgbTIgPSBjbGFzcyBzNCB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAicyIpOwogIH0KICB0ejsKICBtczsKICBzZWNvbmQ7CiAgbWludXRlOwogIGhvdXI7CiAgZGF5OwogIG1vbnRoOwogIHllYXI7CiAgY29uc3RydWN0b3IoZTEwLCB0OCkgewogICAgaWYgKHRoaXMudHogPSB0OCwgZTEwICYmIGUxMCBpbnN0YW5jZW9mIERhdGUpIGlmICghaXNOYU4oZTEwKSkgdGhpcy5mcm9tRGF0ZShlMTApOwogICAgZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDcm9uRGF0ZTogSW52YWxpZCBkYXRlIHBhc3NlZCB0byBDcm9uRGF0ZSBjb25zdHJ1Y3RvciIpOwogICAgZWxzZSBpZiAoZTEwID09IG51bGwpIHRoaXMuZnJvbURhdGUoLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCkpOwogICAgZWxzZSBpZiAoZTEwICYmIHR5cGVvZiBlMTAgPT0gInN0cmluZyIpIHRoaXMuZnJvbVN0cmluZyhlMTApOwogICAgZWxzZSBpZiAoZTEwIGluc3RhbmNlb2YgczQpIHRoaXMuZnJvbUNyb25EYXRlKGUxMCk7CiAgICBlbHNlIHRocm93IG5ldyBUeXBlRXJyb3IoIkNyb25EYXRlOiBJbnZhbGlkIHR5cGUgKCIgKyB0eXBlb2YgZTEwICsgIikgcGFzc2VkIHRvIENyb25EYXRlIGNvbnN0cnVjdG9yIik7CiAgfQogIGdldExhc3REYXlPZk1vbnRoKGUxMCwgdDgpIHsKICAgIHJldHVybiB0OCAhPT0gMSA/IFAyW3Q4XSA6IG5ldyBEYXRlKERhdGUuVVRDKGUxMCwgdDggKyAxLCAwKSkuZ2V0VVRDRGF0ZSgpOwogIH0KICBnZXRMYXN0V2Vla2RheShlMTAsIHQ4KSB7CiAgICBsZXQgcjEwID0gdGhpcy5nZXRMYXN0RGF5T2ZNb250aChlMTAsIHQ4KSwgaTEwID0gbmV3IERhdGUoRGF0ZS5VVEMoZTEwLCB0OCwgcjEwKSkuZ2V0VVRDRGF5KCk7CiAgICByZXR1cm4gaTEwID09PSAwID8gcjEwIC0gMiA6IGkxMCA9PT0gNiA/IHIxMCAtIDEgOiByMTA7CiAgfQogIGdldE5lYXJlc3RXZWVrZGF5KGUxMCwgdDgsIHIxMCkgewogICAgbGV0IG4xMSA9IHRoaXMuZ2V0TGFzdERheU9mTW9udGgoZTEwLCB0OCk7CiAgICBpZiAocjEwID4gbjExKSByZXR1cm4gLTE7CiAgICBsZXQgYTQgPSBuZXcgRGF0ZShEYXRlLlVUQyhlMTAsIHQ4LCByMTApKS5nZXRVVENEYXkoKTsKICAgIHJldHVybiBhNCA9PT0gMCA/IHIxMCA9PT0gbjExID8gcjEwIC0gMiA6IHIxMCArIDEgOiBhNCA9PT0gNiA/IHIxMCA9PT0gMSA/IHIxMCArIDIgOiByMTAgLSAxIDogcjEwOwogIH0KICBpc050aFdlZWtkYXlPZk1vbnRoKGUxMCwgdDgsIHIxMCwgbjExKSB7CiAgICBsZXQgYTQgPSBuZXcgRGF0ZShEYXRlLlVUQyhlMTAsIHQ4LCByMTApKS5nZXRVVENEYXkoKSwgbzEyID0gMDsKICAgIGZvciAobGV0IGg3ID0gMTsgaDcgPD0gcjEwOyBoNysrKSBuZXcgRGF0ZShEYXRlLlVUQyhlMTAsIHQ4LCBoNykpLmdldFVUQ0RheSgpID09PSBhNCAmJiBvMTIrKzsKICAgIGlmIChuMTEgJiA2MyAmJiBPW28xMiAtIDFdICYgbjExKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChuMTEgJiAzMikgewogICAgICBsZXQgaDcgPSB0aGlzLmdldExhc3REYXlPZk1vbnRoKGUxMCwgdDgpOwogICAgICBmb3IgKGxldCBsNSA9IHIxMCArIDE7IGw1IDw9IGg3OyBsNSsrKSBpZiAobmV3IERhdGUoRGF0ZS5VVEMoZTEwLCB0OCwgbDUpKS5nZXRVVENEYXkoKSA9PT0gYTQpIHJldHVybiBmYWxzZTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGZyb21EYXRlKGUxMCkgewogICAgaWYgKHRoaXMudHogIT09IHZvaWQgMCkgaWYgKHR5cGVvZiB0aGlzLnR6ID09ICJudW1iZXIiKSB0aGlzLm1zID0gZTEwLmdldFVUQ01pbGxpc2Vjb25kcygpLCB0aGlzLnNlY29uZCA9IGUxMC5nZXRVVENTZWNvbmRzKCksIHRoaXMubWludXRlID0gZTEwLmdldFVUQ01pbnV0ZXMoKSArIHRoaXMudHosIHRoaXMuaG91ciA9IGUxMC5nZXRVVENIb3VycygpLCB0aGlzLmRheSA9IGUxMC5nZXRVVENEYXRlKCksIHRoaXMubW9udGggPSBlMTAuZ2V0VVRDTW9udGgoKSwgdGhpcy55ZWFyID0gZTEwLmdldFVUQ0Z1bGxZZWFyKCksIHRoaXMuYXBwbHkoKTsKICAgIGVsc2UgdHJ5IHsKICAgICAgbGV0IHQ4ID0gZzIoZTEwLCB0aGlzLnR6KTsKICAgICAgdGhpcy5tcyA9IGUxMC5nZXRNaWxsaXNlY29uZHMoKSwgdGhpcy5zZWNvbmQgPSB0OC5zLCB0aGlzLm1pbnV0ZSA9IHQ4LmksIHRoaXMuaG91ciA9IHQ4LmgsIHRoaXMuZGF5ID0gdDguZCwgdGhpcy5tb250aCA9IHQ4Lm0gLSAxLCB0aGlzLnllYXIgPSB0OC55OwogICAgfSBjYXRjaCAodDgpIHsKICAgICAgbGV0IHIxMCA9IHQ4IGluc3RhbmNlb2YgRXJyb3IgPyB0OC5tZXNzYWdlIDogU3RyaW5nKHQ4KTsKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgQ3JvbkRhdGU6IEZhaWxlZCB0byBjb252ZXJ0IGRhdGUgdG8gdGltZXpvbmUgJyR7dGhpcy50en0nLiBUaGlzIG1heSBoYXBwZW4gd2l0aCBpbnZhbGlkIHRpbWV6b25lIG5hbWVzIG9yIGRhdGVzLiBPcmlnaW5hbCBlcnJvcjogJHtyMTB9YCk7CiAgICB9CiAgICBlbHNlIHRoaXMubXMgPSBlMTAuZ2V0TWlsbGlzZWNvbmRzKCksIHRoaXMuc2Vjb25kID0gZTEwLmdldFNlY29uZHMoKSwgdGhpcy5taW51dGUgPSBlMTAuZ2V0TWludXRlcygpLCB0aGlzLmhvdXIgPSBlMTAuZ2V0SG91cnMoKSwgdGhpcy5kYXkgPSBlMTAuZ2V0RGF0ZSgpLCB0aGlzLm1vbnRoID0gZTEwLmdldE1vbnRoKCksIHRoaXMueWVhciA9IGUxMC5nZXRGdWxsWWVhcigpOwogIH0KICBmcm9tQ3JvbkRhdGUoZTEwKSB7CiAgICB0aGlzLnR6ID0gZTEwLnR6LCB0aGlzLnllYXIgPSBlMTAueWVhciwgdGhpcy5tb250aCA9IGUxMC5tb250aCwgdGhpcy5kYXkgPSBlMTAuZGF5LCB0aGlzLmhvdXIgPSBlMTAuaG91ciwgdGhpcy5taW51dGUgPSBlMTAubWludXRlLCB0aGlzLnNlY29uZCA9IGUxMC5zZWNvbmQsIHRoaXMubXMgPSBlMTAubXM7CiAgfQogIGFwcGx5KCkgewogICAgaWYgKHRoaXMubW9udGggPiAxMSB8fCB0aGlzLm1vbnRoIDwgMCB8fCB0aGlzLmRheSA+IFAyW3RoaXMubW9udGhdIHx8IHRoaXMuZGF5IDwgMSB8fCB0aGlzLmhvdXIgPiA1OSB8fCB0aGlzLm1pbnV0ZSA+IDU5IHx8IHRoaXMuc2Vjb25kID4gNTkgfHwgdGhpcy5ob3VyIDwgMCB8fCB0aGlzLm1pbnV0ZSA8IDAgfHwgdGhpcy5zZWNvbmQgPCAwKSB7CiAgICAgIGxldCBlMTAgPSBuZXcgRGF0ZShEYXRlLlVUQyh0aGlzLnllYXIsIHRoaXMubW9udGgsIHRoaXMuZGF5LCB0aGlzLmhvdXIsIHRoaXMubWludXRlLCB0aGlzLnNlY29uZCwgdGhpcy5tcykpOwogICAgICByZXR1cm4gdGhpcy5tcyA9IGUxMC5nZXRVVENNaWxsaXNlY29uZHMoKSwgdGhpcy5zZWNvbmQgPSBlMTAuZ2V0VVRDU2Vjb25kcygpLCB0aGlzLm1pbnV0ZSA9IGUxMC5nZXRVVENNaW51dGVzKCksIHRoaXMuaG91ciA9IGUxMC5nZXRVVENIb3VycygpLCB0aGlzLmRheSA9IGUxMC5nZXRVVENEYXRlKCksIHRoaXMubW9udGggPSBlMTAuZ2V0VVRDTW9udGgoKSwgdGhpcy55ZWFyID0gZTEwLmdldFVUQ0Z1bGxZZWFyKCksIHRydWU7CiAgICB9IGVsc2UgcmV0dXJuIGZhbHNlOwogIH0KICBmcm9tU3RyaW5nKGUxMCkgewogICAgaWYgKHR5cGVvZiB0aGlzLnR6ID09ICJudW1iZXIiKSB7CiAgICAgIGxldCB0OCA9IHYyKGUxMCk7CiAgICAgIHRoaXMubXMgPSB0OC5nZXRVVENNaWxsaXNlY29uZHMoKSwgdGhpcy5zZWNvbmQgPSB0OC5nZXRVVENTZWNvbmRzKCksIHRoaXMubWludXRlID0gdDguZ2V0VVRDTWludXRlcygpLCB0aGlzLmhvdXIgPSB0OC5nZXRVVENIb3VycygpLCB0aGlzLmRheSA9IHQ4LmdldFVUQ0RhdGUoKSwgdGhpcy5tb250aCA9IHQ4LmdldFVUQ01vbnRoKCksIHRoaXMueWVhciA9IHQ4LmdldFVUQ0Z1bGxZZWFyKCksIHRoaXMuYXBwbHkoKTsKICAgIH0gZWxzZSByZXR1cm4gdGhpcy5mcm9tRGF0ZSh2MihlMTAsIHRoaXMudHopKTsKICB9CiAgZmluZE5leHQoZTEwLCB0OCwgcjEwLCBuMTEpIHsKICAgIHJldHVybiB0aGlzLl9maW5kTWF0Y2goZTEwLCB0OCwgcjEwLCBuMTEsIDEpOwogIH0KICBfZmluZE1hdGNoKGUxMCwgdDgsIHIxMCwgbjExLCBpMTApIHsKICAgIGxldCBhNCA9IHRoaXNbdDhdLCBvMTI7CiAgICByMTAubGFzdERheU9mTW9udGggJiYgKG8xMiA9IHRoaXMuZ2V0TGFzdERheU9mTW9udGgodGhpcy55ZWFyLCB0aGlzLm1vbnRoKSk7CiAgICBsZXQgaDcgPSAhcjEwLnN0YXJET1cgJiYgdDggPT0gImRheSIgPyBuZXcgRGF0ZShEYXRlLlVUQyh0aGlzLnllYXIsIHRoaXMubW9udGgsIDEsIDAsIDAsIDAsIDApKS5nZXRVVENEYXkoKSA6IHZvaWQgMCwgbDUgPSB0aGlzW3Q4XSArIG4xMSwgeTMgPSBpMTAgPT09IDEgPyAodTYpID0+IHU2IDwgcjEwW3Q4XS5sZW5ndGggOiAodTYpID0+IHU2ID49IDA7CiAgICBmb3IgKGxldCB1NiA9IGw1OyB5Myh1Nik7IHU2ICs9IGkxMCkgewogICAgICBsZXQgZDQgPSByMTBbdDhdW3U2XTsKICAgICAgaWYgKHQ4ID09PSAiZGF5IiAmJiAhZDQpIHsKICAgICAgICBmb3IgKGxldCBjMTAgPSAwOyBjMTAgPCByMTAubmVhcmVzdFdlZWtkYXlzLmxlbmd0aDsgYzEwKyspIGlmIChyMTAubmVhcmVzdFdlZWtkYXlzW2MxMF0pIHsKICAgICAgICAgIGxldCBNMyA9IHRoaXMuZ2V0TmVhcmVzdFdlZWtkYXkodGhpcy55ZWFyLCB0aGlzLm1vbnRoLCBjMTAgLSBuMTEpOwogICAgICAgICAgaWYgKE0zID09PSAtMSkgY29udGludWU7CiAgICAgICAgICBpZiAoTTMgPT09IHU2IC0gbjExKSB7CiAgICAgICAgICAgIGQ0ID0gMTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICh0OCA9PT0gImRheSIgJiYgcjEwLmxhc3RXZWVrZGF5KSB7CiAgICAgICAgbGV0IGMxMCA9IHRoaXMuZ2V0TGFzdFdlZWtkYXkodGhpcy55ZWFyLCB0aGlzLm1vbnRoKTsKICAgICAgICB1NiAtIG4xMSA9PT0gYzEwICYmIChkNCA9IDEpOwogICAgICB9CiAgICAgIGlmICh0OCA9PT0gImRheSIgJiYgcjEwLmxhc3REYXlPZk1vbnRoICYmIHU2IC0gbjExID09IG8xMiAmJiAoZDQgPSAxKSwgdDggPT09ICJkYXkiICYmICFyMTAuc3RhckRPVykgewogICAgICAgIGxldCBjMTAgPSByMTAuZGF5T2ZXZWVrWyhoNyArICh1NiAtIG4xMSAtIDEpKSAlIDddOwogICAgICAgIGlmIChjMTAgJiYgYzEwICYgNjMpIGMxMCA9IHRoaXMuaXNOdGhXZWVrZGF5T2ZNb250aCh0aGlzLnllYXIsIHRoaXMubW9udGgsIHU2IC0gbjExLCBjMTApID8gMSA6IDA7CiAgICAgICAgZWxzZSBpZiAoYzEwKSB0aHJvdyBuZXcgRXJyb3IoYENyb25EYXRlOiBJbnZhbGlkIHZhbHVlIGZvciBkYXlPZldlZWsgZW5jb3VudGVyZWQuICR7YzEwfWApOwogICAgICAgIHIxMC51c2VBbmRMb2dpYyA/IGQ0ID0gZDQgJiYgYzEwIDogIWUxMC5kb21BbmREb3cgJiYgIXIxMC5zdGFyRE9NID8gZDQgPSBkNCB8fCBjMTAgOiBkNCA9IGQ0ICYmIGMxMDsKICAgICAgfQogICAgICBpZiAoZDQpIHJldHVybiB0aGlzW3Q4XSA9IHU2IC0gbjExLCBhNCAhPT0gdGhpc1t0OF0gPyAyIDogMTsKICAgIH0KICAgIHJldHVybiAzOwogIH0KICByZWN1cnNlKGUxMCwgdDgsIHIxMCkgewogICAgaWYgKHIxMCA9PT0gMCAmJiAhZTEwLnN0YXJZZWFyKSB7CiAgICAgIGlmICh0aGlzLnllYXIgPj0gMCAmJiB0aGlzLnllYXIgPCBlMTAueWVhci5sZW5ndGggJiYgZTEwLnllYXJbdGhpcy55ZWFyXSA9PT0gMCkgewogICAgICAgIGxldCBpMTAgPSAtMTsKICAgICAgICBmb3IgKGxldCBhNCA9IHRoaXMueWVhciArIDE7IGE0IDwgZTEwLnllYXIubGVuZ3RoICYmIGE0IDwgMWU0OyBhNCsrKSBpZiAoZTEwLnllYXJbYTRdID09PSAxKSB7CiAgICAgICAgICBpMTAgPSBhNDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoaTEwID09PSAtMSkgcmV0dXJuIG51bGw7CiAgICAgICAgdGhpcy55ZWFyID0gaTEwLCB0aGlzLm1vbnRoID0gMCwgdGhpcy5kYXkgPSAxLCB0aGlzLmhvdXIgPSAwLCB0aGlzLm1pbnV0ZSA9IDAsIHRoaXMuc2Vjb25kID0gMCwgdGhpcy5tcyA9IDA7CiAgICAgIH0KICAgICAgaWYgKHRoaXMueWVhciA+PSAxZTQpIHJldHVybiBudWxsOwogICAgfQogICAgbGV0IG4xMSA9IHRoaXMuZmluZE5leHQodDgsIGYzW3IxMF1bMF0sIGUxMCwgZjNbcjEwXVsyXSk7CiAgICBpZiAobjExID4gMSkgewogICAgICBsZXQgaTEwID0gcjEwICsgMTsKICAgICAgZm9yICg7IGkxMCA8IGYzLmxlbmd0aDsgKSB0aGlzW2YzW2kxMF1bMF1dID0gLWYzW2kxMF1bMl0sIGkxMCsrOwogICAgICBpZiAobjExID09PSAzKSB7CiAgICAgICAgaWYgKHRoaXNbZjNbcjEwXVsxXV0rKywgdGhpc1tmM1tyMTBdWzBdXSA9IC1mM1tyMTBdWzJdLCB0aGlzLmFwcGx5KCksIHIxMCA9PT0gMCAmJiAhZTEwLnN0YXJZZWFyKSB7CiAgICAgICAgICBmb3IgKDsgdGhpcy55ZWFyID49IDAgJiYgdGhpcy55ZWFyIDwgZTEwLnllYXIubGVuZ3RoICYmIGUxMC55ZWFyW3RoaXMueWVhcl0gPT09IDAgJiYgdGhpcy55ZWFyIDwgMWU0OyApIHRoaXMueWVhcisrOwogICAgICAgICAgaWYgKHRoaXMueWVhciA+PSAxZTQgfHwgdGhpcy55ZWFyID49IGUxMC55ZWFyLmxlbmd0aCkgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLnJlY3Vyc2UoZTEwLCB0OCwgMCk7CiAgICAgIH0gZWxzZSBpZiAodGhpcy5hcHBseSgpKSByZXR1cm4gdGhpcy5yZWN1cnNlKGUxMCwgdDgsIHIxMCAtIDEpOwogICAgfQogICAgcmV0dXJuIHIxMCArPSAxLCByMTAgPj0gZjMubGVuZ3RoID8gdGhpcyA6IChlMTAuc3RhclllYXIgPyB0aGlzLnllYXIgPj0gM2UzIDogdGhpcy55ZWFyID49IDFlNCkgPyBudWxsIDogdGhpcy5yZWN1cnNlKGUxMCwgdDgsIHIxMCk7CiAgfQogIGluY3JlbWVudChlMTAsIHQ4LCByMTApIHsKICAgIHJldHVybiB0aGlzLnNlY29uZCArPSB0OC5pbnRlcnZhbCAhPT0gdm9pZCAwICYmIHQ4LmludGVydmFsID4gMSAmJiByMTAgPyB0OC5pbnRlcnZhbCA6IDEsIHRoaXMubXMgPSAwLCB0aGlzLmFwcGx5KCksIHRoaXMucmVjdXJzZShlMTAsIHQ4LCAwKTsKICB9CiAgZGVjcmVtZW50KGUxMCwgdDgpIHsKICAgIHJldHVybiB0aGlzLnNlY29uZCAtPSB0OC5pbnRlcnZhbCAhPT0gdm9pZCAwICYmIHQ4LmludGVydmFsID4gMSA/IHQ4LmludGVydmFsIDogMSwgdGhpcy5tcyA9IDAsIHRoaXMuYXBwbHkoKSwgdGhpcy5yZWN1cnNlQmFja3dhcmQoZTEwLCB0OCwgMCwgMCk7CiAgfQogIHJlY3Vyc2VCYWNrd2FyZChlMTAsIHQ4LCByMTAsIG4xMSA9IDApIHsKICAgIGlmIChuMTEgPiAxZTQpIHJldHVybiBudWxsOwogICAgaWYgKHIxMCA9PT0gMCAmJiAhZTEwLnN0YXJZZWFyKSB7CiAgICAgIGlmICh0aGlzLnllYXIgPj0gMCAmJiB0aGlzLnllYXIgPCBlMTAueWVhci5sZW5ndGggJiYgZTEwLnllYXJbdGhpcy55ZWFyXSA9PT0gMCkgewogICAgICAgIGxldCBhNCA9IC0xOwogICAgICAgIGZvciAobGV0IG8xMiA9IHRoaXMueWVhciAtIDE7IG8xMiA+PSAwOyBvMTItLSkgaWYgKGUxMC55ZWFyW28xMl0gPT09IDEpIHsKICAgICAgICAgIGE0ID0gbzEyOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChhNCA9PT0gLTEpIHJldHVybiBudWxsOwogICAgICAgIHRoaXMueWVhciA9IGE0LCB0aGlzLm1vbnRoID0gMTEsIHRoaXMuZGF5ID0gMzEsIHRoaXMuaG91ciA9IDIzLCB0aGlzLm1pbnV0ZSA9IDU5LCB0aGlzLnNlY29uZCA9IDU5LCB0aGlzLm1zID0gMDsKICAgICAgfQogICAgICBpZiAodGhpcy55ZWFyIDwgMCkgcmV0dXJuIG51bGw7CiAgICB9CiAgICBsZXQgaTEwID0gdGhpcy5maW5kUHJldmlvdXModDgsIGYzW3IxMF1bMF0sIGUxMCwgZjNbcjEwXVsyXSk7CiAgICBpZiAoaTEwID4gMSkgewogICAgICBsZXQgYTQgPSByMTAgKyAxOwogICAgICBmb3IgKDsgYTQgPCBmMy5sZW5ndGg7ICkgewogICAgICAgIGxldCBvMTIgPSBmM1thNF1bMF0sIGg3ID0gZjNbYTRdWzJdLCBsNSA9IHRoaXMuZ2V0TWF4UGF0dGVyblZhbHVlKG8xMiwgZTEwLCBoNyk7CiAgICAgICAgdGhpc1tvMTJdID0gbDUsIGE0Kys7CiAgICAgIH0KICAgICAgaWYgKGkxMCA9PT0gMykgewogICAgICAgIGlmICh0aGlzW2YzW3IxMF1bMV1dLS0sIHIxMCA9PT0gMCkgewogICAgICAgICAgbGV0IHkzID0gdGhpcy5nZXRMYXN0RGF5T2ZNb250aCh0aGlzLnllYXIsIHRoaXMubW9udGgpOwogICAgICAgICAgdGhpcy5kYXkgPiB5MyAmJiAodGhpcy5kYXkgPSB5Myk7CiAgICAgICAgfQogICAgICAgIGlmIChyMTAgPT09IDEpIGlmICh0aGlzLmRheSA8PSAwKSB0aGlzLmRheSA9IDE7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBsZXQgeTMgPSB0aGlzLnllYXIsIHU2ID0gdGhpcy5tb250aDsKICAgICAgICAgIGZvciAoOyB1NiA8IDA7ICkgdTYgKz0gMTIsIHkzLS07CiAgICAgICAgICBmb3IgKDsgdTYgPiAxMTsgKSB1NiAtPSAxMiwgeTMrKzsKICAgICAgICAgIGxldCBkNCA9IHU2ICE9PSAxID8gUDJbdTZdIDogbmV3IERhdGUoRGF0ZS5VVEMoeTMsIHU2ICsgMSwgMCkpLmdldFVUQ0RhdGUoKTsKICAgICAgICAgIHRoaXMuZGF5ID4gZDQgJiYgKHRoaXMuZGF5ID0gZDQpOwogICAgICAgIH0KICAgICAgICB0aGlzLmFwcGx5KCk7CiAgICAgICAgbGV0IG8xMiA9IGYzW3IxMF1bMF0sIGg3ID0gZjNbcjEwXVsyXSwgbDUgPSB0aGlzLmdldE1heFBhdHRlcm5WYWx1ZShvMTIsIGUxMCwgaDcpOwogICAgICAgIGlmIChvMTIgPT09ICJkYXkiKSB7CiAgICAgICAgICBsZXQgeTMgPSB0aGlzLmdldExhc3REYXlPZk1vbnRoKHRoaXMueWVhciwgdGhpcy5tb250aCk7CiAgICAgICAgICB0aGlzW28xMl0gPSBNYXRoLm1pbihsNSwgeTMpOwogICAgICAgIH0gZWxzZSB0aGlzW28xMl0gPSBsNTsKICAgICAgICBpZiAodGhpcy5hcHBseSgpLCByMTAgPT09IDApIHsKICAgICAgICAgIGxldCB5MyA9IGYzWzFdWzJdLCB1NiA9IHRoaXMuZ2V0TWF4UGF0dGVyblZhbHVlKCJkYXkiLCBlMTAsIHkzKSwgZDQgPSB0aGlzLmdldExhc3REYXlPZk1vbnRoKHRoaXMueWVhciwgdGhpcy5tb250aCksIGMxMCA9IE1hdGgubWluKHU2LCBkNCk7CiAgICAgICAgICBjMTAgIT09IHRoaXMuZGF5ICYmICh0aGlzLmRheSA9IGMxMCwgdGhpcy5ob3VyID0gdGhpcy5nZXRNYXhQYXR0ZXJuVmFsdWUoImhvdXIiLCBlMTAsIGYzWzJdWzJdKSwgdGhpcy5taW51dGUgPSB0aGlzLmdldE1heFBhdHRlcm5WYWx1ZSgibWludXRlIiwgZTEwLCBmM1szXVsyXSksIHRoaXMuc2Vjb25kID0gdGhpcy5nZXRNYXhQYXR0ZXJuVmFsdWUoInNlY29uZCIsIGUxMCwgZjNbNF1bMl0pKTsKICAgICAgICB9CiAgICAgICAgaWYgKHIxMCA9PT0gMCAmJiAhZTEwLnN0YXJZZWFyKSB7CiAgICAgICAgICBmb3IgKDsgdGhpcy55ZWFyID49IDAgJiYgdGhpcy55ZWFyIDwgZTEwLnllYXIubGVuZ3RoICYmIGUxMC55ZWFyW3RoaXMueWVhcl0gPT09IDA7ICkgdGhpcy55ZWFyLS07CiAgICAgICAgICBpZiAodGhpcy55ZWFyIDwgMCkgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLnJlY3Vyc2VCYWNrd2FyZChlMTAsIHQ4LCAwLCBuMTEgKyAxKTsKICAgICAgfSBlbHNlIGlmICh0aGlzLmFwcGx5KCkpIHJldHVybiB0aGlzLnJlY3Vyc2VCYWNrd2FyZChlMTAsIHQ4LCByMTAgLSAxLCBuMTEgKyAxKTsKICAgIH0KICAgIHJldHVybiByMTAgKz0gMSwgcjEwID49IGYzLmxlbmd0aCA/IHRoaXMgOiB0aGlzLnllYXIgPCAwID8gbnVsbCA6IHRoaXMucmVjdXJzZUJhY2t3YXJkKGUxMCwgdDgsIHIxMCwgbjExICsgMSk7CiAgfQogIGdldE1heFBhdHRlcm5WYWx1ZShlMTAsIHQ4LCByMTApIHsKICAgIGlmIChlMTAgPT09ICJkYXkiICYmIHQ4Lmxhc3REYXlPZk1vbnRoKSByZXR1cm4gdGhpcy5nZXRMYXN0RGF5T2ZNb250aCh0aGlzLnllYXIsIHRoaXMubW9udGgpOwogICAgaWYgKGUxMCA9PT0gImRheSIgJiYgIXQ4LnN0YXJET1cpIHJldHVybiB0aGlzLmdldExhc3REYXlPZk1vbnRoKHRoaXMueWVhciwgdGhpcy5tb250aCk7CiAgICBmb3IgKGxldCBuMTEgPSB0OFtlMTBdLmxlbmd0aCAtIDE7IG4xMSA+PSAwOyBuMTEtLSkgaWYgKHQ4W2UxMF1bbjExXSkgcmV0dXJuIG4xMSAtIHIxMDsKICAgIHJldHVybiB0OFtlMTBdLmxlbmd0aCAtIDEgLSByMTA7CiAgfQogIGZpbmRQcmV2aW91cyhlMTAsIHQ4LCByMTAsIG4xMSkgewogICAgcmV0dXJuIHRoaXMuX2ZpbmRNYXRjaChlMTAsIHQ4LCByMTAsIG4xMSwgLTEpOwogIH0KICBnZXREYXRlKGUxMCkgewogICAgcmV0dXJuIGUxMCB8fCB0aGlzLnR6ID09PSB2b2lkIDAgPyBuZXcgRGF0ZSh0aGlzLnllYXIsIHRoaXMubW9udGgsIHRoaXMuZGF5LCB0aGlzLmhvdXIsIHRoaXMubWludXRlLCB0aGlzLnNlY29uZCwgdGhpcy5tcykgOiB0eXBlb2YgdGhpcy50eiA9PSAibnVtYmVyIiA/IG5ldyBEYXRlKERhdGUuVVRDKHRoaXMueWVhciwgdGhpcy5tb250aCwgdGhpcy5kYXksIHRoaXMuaG91ciwgdGhpcy5taW51dGUgLSB0aGlzLnR6LCB0aGlzLnNlY29uZCwgdGhpcy5tcykpIDogazIoYjModGhpcy55ZWFyLCB0aGlzLm1vbnRoICsgMSwgdGhpcy5kYXksIHRoaXMuaG91ciwgdGhpcy5taW51dGUsIHRoaXMuc2Vjb25kLCB0aGlzLnR6KSwgZmFsc2UpOwogIH0KICBnZXRUaW1lKCkgewogICAgcmV0dXJuIHRoaXMuZ2V0RGF0ZShmYWxzZSkuZ2V0VGltZSgpOwogIH0KICBtYXRjaChlMTAsIHQ4KSB7CiAgICBpZiAoIWUxMC5zdGFyWWVhciAmJiAodGhpcy55ZWFyIDwgMCB8fCB0aGlzLnllYXIgPj0gZTEwLnllYXIubGVuZ3RoIHx8IGUxMC55ZWFyW3RoaXMueWVhcl0gPT09IDApKSByZXR1cm4gZmFsc2U7CiAgICBmb3IgKGxldCByMTAgPSAwOyByMTAgPCBmMy5sZW5ndGg7IHIxMCsrKSB7CiAgICAgIGxldCBuMTEgPSBmM1tyMTBdWzBdLCBpMTAgPSBmM1tyMTBdWzJdLCBhNCA9IHRoaXNbbjExXTsKICAgICAgaWYgKGE0ICsgaTEwIDwgMCB8fCBhNCArIGkxMCA+PSBlMTBbbjExXS5sZW5ndGgpIHJldHVybiBmYWxzZTsKICAgICAgbGV0IG8xMiA9IGUxMFtuMTFdW2E0ICsgaTEwXTsKICAgICAgaWYgKG4xMSA9PT0gImRheSIpIHsKICAgICAgICBpZiAoIW8xMikgewogICAgICAgICAgZm9yIChsZXQgaDcgPSAwOyBoNyA8IGUxMC5uZWFyZXN0V2Vla2RheXMubGVuZ3RoOyBoNysrKSBpZiAoZTEwLm5lYXJlc3RXZWVrZGF5c1toN10pIHsKICAgICAgICAgICAgbGV0IGw1ID0gdGhpcy5nZXROZWFyZXN0V2Vla2RheSh0aGlzLnllYXIsIHRoaXMubW9udGgsIGg3IC0gaTEwKTsKICAgICAgICAgICAgaWYgKGw1ICE9PSAtMSAmJiBsNSA9PT0gYTQpIHsKICAgICAgICAgICAgICBvMTIgPSAxOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChlMTAubGFzdFdlZWtkYXkpIHsKICAgICAgICAgIGxldCBoNyA9IHRoaXMuZ2V0TGFzdFdlZWtkYXkodGhpcy55ZWFyLCB0aGlzLm1vbnRoKTsKICAgICAgICAgIGE0ID09PSBoNyAmJiAobzEyID0gMSk7CiAgICAgICAgfQogICAgICAgIGlmIChlMTAubGFzdERheU9mTW9udGgpIHsKICAgICAgICAgIGxldCBoNyA9IHRoaXMuZ2V0TGFzdERheU9mTW9udGgodGhpcy55ZWFyLCB0aGlzLm1vbnRoKTsKICAgICAgICAgIGE0ID09PSBoNyAmJiAobzEyID0gMSk7CiAgICAgICAgfQogICAgICAgIGlmICghZTEwLnN0YXJET1cpIHsKICAgICAgICAgIGxldCBoNyA9IG5ldyBEYXRlKERhdGUuVVRDKHRoaXMueWVhciwgdGhpcy5tb250aCwgMSwgMCwgMCwgMCwgMCkpLmdldFVUQ0RheSgpLCBsNSA9IGUxMC5kYXlPZldlZWtbKGg3ICsgKGE0IC0gMSkpICUgN107CiAgICAgICAgICBsNSAmJiBsNSAmIDYzICYmIChsNSA9IHRoaXMuaXNOdGhXZWVrZGF5T2ZNb250aCh0aGlzLnllYXIsIHRoaXMubW9udGgsIGE0LCBsNSkgPyAxIDogMCksIGUxMC51c2VBbmRMb2dpYyA/IG8xMiA9IG8xMiAmJiBsNSA6ICF0OC5kb21BbmREb3cgJiYgIWUxMC5zdGFyRE9NID8gbzEyID0gbzEyIHx8IGw1IDogbzEyID0gbzEyICYmIGw1OwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoIW8xMikgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQp9OwpmdW5jdGlvbiBSMihzOSkgewogIGlmIChzOSA9PT0gdm9pZCAwICYmIChzOSA9IHt9KSwgZGVsZXRlIHM5Lm5hbWUsIHM5LmxlZ2FjeU1vZGUgIT09IHZvaWQgMCAmJiBzOS5kb21BbmREb3cgPT09IHZvaWQgMCA/IHM5LmRvbUFuZERvdyA9ICFzOS5sZWdhY3lNb2RlIDogczkuZG9tQW5kRG93ID09PSB2b2lkIDAgJiYgKHM5LmRvbUFuZERvdyA9IGZhbHNlKSwgczkubGVnYWN5TW9kZSA9ICFzOS5kb21BbmREb3csIHM5LnBhdXNlZCA9IHM5LnBhdXNlZCA9PT0gdm9pZCAwID8gZmFsc2UgOiBzOS5wYXVzZWQsIHM5Lm1heFJ1bnMgPSBzOS5tYXhSdW5zID09PSB2b2lkIDAgPyAxIC8gMCA6IHM5Lm1heFJ1bnMsIHM5LmNhdGNoID0gczkuY2F0Y2ggPT09IHZvaWQgMCA/IGZhbHNlIDogczkuY2F0Y2gsIHM5LmludGVydmFsID0gczkuaW50ZXJ2YWwgPT09IHZvaWQgMCA/IDAgOiBwYXJzZUludChzOS5pbnRlcnZhbC50b1N0cmluZygpLCAxMCksIHM5LnV0Y09mZnNldCA9IHM5LnV0Y09mZnNldCA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyc2VJbnQoczkudXRjT2Zmc2V0LnRvU3RyaW5nKCksIDEwKSwgczkuZGF5T2Zmc2V0ID0gczkuZGF5T2Zmc2V0ID09PSB2b2lkIDAgPyAwIDogcGFyc2VJbnQoczkuZGF5T2Zmc2V0LnRvU3RyaW5nKCksIDEwKSwgczkudW5yZWYgPSBzOS51bnJlZiA9PT0gdm9pZCAwID8gZmFsc2UgOiBzOS51bnJlZiwgczkubW9kZSA9IHM5Lm1vZGUgPT09IHZvaWQgMCA/ICJhdXRvIiA6IHM5Lm1vZGUsIHM5LmFsdGVybmF0aXZlV2Vla2RheXMgPSBzOS5hbHRlcm5hdGl2ZVdlZWtkYXlzID09PSB2b2lkIDAgPyBmYWxzZSA6IHM5LmFsdGVybmF0aXZlV2Vla2RheXMsIHM5LnNsb3BweVJhbmdlcyA9IHM5LnNsb3BweVJhbmdlcyA9PT0gdm9pZCAwID8gZmFsc2UgOiBzOS5zbG9wcHlSYW5nZXMsICFbImF1dG8iLCAiNS1wYXJ0IiwgIjYtcGFydCIsICI3LXBhcnQiLCAiNS1vci02LXBhcnRzIiwgIjYtb3ItNy1wYXJ0cyJdLmluY2x1ZGVzKHM5Lm1vZGUpKSB0aHJvdyBuZXcgRXJyb3IoIkNyb25PcHRpb25zOiBtb2RlIG11c3QgYmUgb25lIG9mICdhdXRvJywgJzUtcGFydCcsICc2LXBhcnQnLCAnNy1wYXJ0JywgJzUtb3ItNi1wYXJ0cycsIG9yICc2LW9yLTctcGFydHMnLiIpOwogIGlmIChzOS5zdGFydEF0ICYmIChzOS5zdGFydEF0ID0gbmV3IG0yKHM5LnN0YXJ0QXQsIHM5LnRpbWV6b25lKSksIHM5LnN0b3BBdCAmJiAoczkuc3RvcEF0ID0gbmV3IG0yKHM5LnN0b3BBdCwgczkudGltZXpvbmUpKSwgczkuaW50ZXJ2YWwgIT09IG51bGwpIHsKICAgIGlmIChpc05hTihzOS5pbnRlcnZhbCkpIHRocm93IG5ldyBFcnJvcigiQ3Jvbk9wdGlvbnM6IFN1cHBsaWVkIHZhbHVlIGZvciBpbnRlcnZhbCBpcyBub3QgYSBudW1iZXIiKTsKICAgIGlmIChzOS5pbnRlcnZhbCA8IDApIHRocm93IG5ldyBFcnJvcigiQ3Jvbk9wdGlvbnM6IFN1cHBsaWVkIHZhbHVlIGZvciBpbnRlcnZhbCBjYW4gbm90IGJlIG5lZ2F0aXZlIik7CiAgfQogIGlmIChzOS51dGNPZmZzZXQgIT09IHZvaWQgMCkgewogICAgaWYgKGlzTmFOKHM5LnV0Y09mZnNldCkpIHRocm93IG5ldyBFcnJvcigiQ3Jvbk9wdGlvbnM6IEludmFsaWQgdmFsdWUgcGFzc2VkIGZvciB1dGNPZmZzZXQsIHNob3VsZCBiZSBudW1iZXIgcmVwcmVzZW50aW5nIG1pbnV0ZXMgb2Zmc2V0IGZyb20gVVRDLiIpOwogICAgaWYgKHM5LnV0Y09mZnNldCA8IC04NzAgfHwgczkudXRjT2Zmc2V0ID4gODcwKSB0aHJvdyBuZXcgRXJyb3IoIkNyb25PcHRpb25zOiB1dGNPZmZzZXQgb3V0IG9mIGJvdW5kcy4iKTsKICAgIGlmIChzOS51dGNPZmZzZXQgIT09IHZvaWQgMCAmJiBzOS50aW1lem9uZSkgdGhyb3cgbmV3IEVycm9yKCJDcm9uT3B0aW9uczogQ29tYmluaW5nICd1dGNPZmZzZXQnIHdpdGggJ3RpbWV6b25lJyBpcyBub3QgYWxsb3dlZC4iKTsKICB9CiAgaWYgKHM5LnVucmVmICE9PSB0cnVlICYmIHM5LnVucmVmICE9PSBmYWxzZSkgdGhyb3cgbmV3IEVycm9yKCJDcm9uT3B0aW9uczogVW5yZWYgc2hvdWxkIGJlIGVpdGhlciB0cnVlLCBmYWxzZSBvciB1bmRlZmluZWQoZmFsc2UpLiIpOwogIGlmIChzOS5kYXlPZmZzZXQgIT09IHZvaWQgMCAmJiBzOS5kYXlPZmZzZXQgIT09IDAgJiYgaXNOYU4oczkuZGF5T2Zmc2V0KSkgdGhyb3cgbmV3IEVycm9yKCJDcm9uT3B0aW9uczogSW52YWxpZCB2YWx1ZSBwYXNzZWQgZm9yIGRheU9mZnNldCwgc2hvdWxkIGJlIGEgbnVtYmVyIHJlcHJlc2VudGluZyBkYXlzIHRvIG9mZnNldC4iKTsKICByZXR1cm4gczk7Cn0KX19uYW1lKFIyLCAiUiIpOwpmdW5jdGlvbiBwMyhzOSkgewogIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoczkpID09PSAiW29iamVjdCBGdW5jdGlvbl0iIHx8IHR5cGVvZiBzOSA9PSAiZnVuY3Rpb24iIHx8IHM5IGluc3RhbmNlb2YgRnVuY3Rpb247Cn0KX19uYW1lKHAzLCAicCIpOwpmdW5jdGlvbiBfMihzOSkgewogIHJldHVybiBwMyhzOSk7Cn0KX19uYW1lKF8yLCAiXyIpOwpmdW5jdGlvbiB4MihzOSkgewogIHR5cGVvZiBEZW5vIDwgInUiICYmIHR5cGVvZiBEZW5vLnVucmVmVGltZXIgPCAidSIgPyBEZW5vLnVucmVmVGltZXIoczkpIDogczkgJiYgdHlwZW9mIHM5LnVucmVmIDwgInUiICYmIHM5LnVucmVmKCk7Cn0KX19uYW1lKHgyLCAieCIpOwp2YXIgVyA9IDMwICogMWUzLCB3MiA9IFtdLCBFMiA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJFIik7CiAgfQogIG5hbWU7CiAgb3B0aW9uczsKICBfc3RhdGVzOwogIGZuOwogIGdldFR6KCkgewogICAgcmV0dXJuIHRoaXMub3B0aW9ucy50aW1lem9uZSB8fCB0aGlzLm9wdGlvbnMudXRjT2Zmc2V0OwogIH0KICBhcHBseURheU9mZnNldChlMTApIHsKICAgIGlmICh0aGlzLm9wdGlvbnMuZGF5T2Zmc2V0ICE9PSB2b2lkIDAgJiYgdGhpcy5vcHRpb25zLmRheU9mZnNldCAhPT0gMCkgewogICAgICBsZXQgdDggPSB0aGlzLm9wdGlvbnMuZGF5T2Zmc2V0ICogMjQgKiA2MCAqIDYwICogMWUzOwogICAgICByZXR1cm4gbmV3IERhdGUoZTEwLmdldFRpbWUoKSArIHQ4KTsKICAgIH0KICAgIHJldHVybiBlMTA7CiAgfQogIGNvbnN0cnVjdG9yKGUxMCwgdDgsIHIxMCkgewogICAgbGV0IG4xMSwgaTEwOwogICAgaWYgKHAzKHQ4KSkgaTEwID0gdDg7CiAgICBlbHNlIGlmICh0eXBlb2YgdDggPT0gIm9iamVjdCIpIG4xMSA9IHQ4OwogICAgZWxzZSBpZiAodDggIT09IHZvaWQgMCkgdGhyb3cgbmV3IEVycm9yKCJDcm9uOiBJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCBmb3Igb3B0aW9uc0luLiBTaG91bGQgYmUgb25lIG9mIGZ1bmN0aW9uLCBvciBvYmplY3QgKG9wdGlvbnMpLiIpOwogICAgaWYgKHAzKHIxMCkpIGkxMCA9IHIxMDsKICAgIGVsc2UgaWYgKHR5cGVvZiByMTAgPT0gIm9iamVjdCIpIG4xMSA9IHIxMDsKICAgIGVsc2UgaWYgKHIxMCAhPT0gdm9pZCAwKSB0aHJvdyBuZXcgRXJyb3IoIkNyb246IEludmFsaWQgYXJndW1lbnQgcGFzc2VkIGZvciBmdW5jSW4uIFNob3VsZCBiZSBvbmUgb2YgZnVuY3Rpb24sIG9yIG9iamVjdCAob3B0aW9ucykuIik7CiAgICBpZiAodGhpcy5uYW1lID0gbjExPy5uYW1lLCB0aGlzLm9wdGlvbnMgPSBSMihuMTEpLCB0aGlzLl9zdGF0ZXMgPSB7IGtpbGw6IGZhbHNlLCBibG9ja2luZzogZmFsc2UsIHByZXZpb3VzUnVuOiB2b2lkIDAsIGN1cnJlbnRSdW46IHZvaWQgMCwgb25jZTogdm9pZCAwLCBjdXJyZW50VGltZW91dDogdm9pZCAwLCBtYXhSdW5zOiBuMTEgPyBuMTEubWF4UnVucyA6IHZvaWQgMCwgcGF1c2VkOiBuMTEgPyBuMTEucGF1c2VkIDogZmFsc2UsIHBhdHRlcm46IG5ldyBDMigiKiAqICogKiAqIiwgdm9pZCAwLCB7IG1vZGU6ICJhdXRvIiB9KSB9LCBlMTAgJiYgKGUxMCBpbnN0YW5jZW9mIERhdGUgfHwgdHlwZW9mIGUxMCA9PSAic3RyaW5nIiAmJiBlMTAuaW5kZXhPZigiOiIpID4gMCkgPyB0aGlzLl9zdGF0ZXMub25jZSA9IG5ldyBtMihlMTAsIHRoaXMuZ2V0VHooKSkgOiB0aGlzLl9zdGF0ZXMucGF0dGVybiA9IG5ldyBDMihlMTAsIHRoaXMub3B0aW9ucy50aW1lem9uZSwgeyBtb2RlOiB0aGlzLm9wdGlvbnMubW9kZSwgYWx0ZXJuYXRpdmVXZWVrZGF5czogdGhpcy5vcHRpb25zLmFsdGVybmF0aXZlV2Vla2RheXMsIHNsb3BweVJhbmdlczogdGhpcy5vcHRpb25zLnNsb3BweVJhbmdlcyB9KSwgdGhpcy5uYW1lKSB7CiAgICAgIGlmICh3Mi5maW5kKChvMTIpID0+IG8xMi5uYW1lID09PSB0aGlzLm5hbWUpKSB0aHJvdyBuZXcgRXJyb3IoIkNyb246IFRyaWVkIHRvIGluaXRpYWxpemUgbmV3IG5hbWVkIGpvYiAnIiArIHRoaXMubmFtZSArICInLCBidXQgbmFtZSBhbHJlYWR5IHRha2VuLiIpOwogICAgICB3Mi5wdXNoKHRoaXMpOwogICAgfQogICAgcmV0dXJuIGkxMCAhPT0gdm9pZCAwICYmIF8yKGkxMCkgJiYgKHRoaXMuZm4gPSBpMTAsIHRoaXMuc2NoZWR1bGUoKSksIHRoaXM7CiAgfQogIG5leHRSdW4oZTEwKSB7CiAgICBsZXQgdDggPSB0aGlzLl9uZXh0KGUxMCk7CiAgICByZXR1cm4gdDggPyB0aGlzLmFwcGx5RGF5T2Zmc2V0KHQ4LmdldERhdGUoZmFsc2UpKSA6IG51bGw7CiAgfQogIG5leHRSdW5zKGUxMCwgdDgpIHsKICAgIHRoaXMuX3N0YXRlcy5tYXhSdW5zICE9PSB2b2lkIDAgJiYgZTEwID4gdGhpcy5fc3RhdGVzLm1heFJ1bnMgJiYgKGUxMCA9IHRoaXMuX3N0YXRlcy5tYXhSdW5zKTsKICAgIGxldCByMTAgPSB0OCB8fCB0aGlzLl9zdGF0ZXMuY3VycmVudFJ1biB8fCB2b2lkIDA7CiAgICByZXR1cm4gdGhpcy5fZW51bWVyYXRlUnVucyhlMTAsIHIxMCwgIm5leHQiKTsKICB9CiAgcHJldmlvdXNSdW5zKGUxMCwgdDgpIHsKICAgIHJldHVybiB0aGlzLl9lbnVtZXJhdGVSdW5zKGUxMCwgdDggfHwgdm9pZCAwLCAicHJldmlvdXMiKTsKICB9CiAgX2VudW1lcmF0ZVJ1bnMoZTEwLCB0OCwgcjEwKSB7CiAgICBsZXQgbjExID0gW10sIGkxMCA9IHQ4ID8gbmV3IG0yKHQ4LCB0aGlzLmdldFR6KCkpIDogbnVsbCwgYTQgPSByMTAgPT09ICJuZXh0IiA/IHRoaXMuX25leHQgOiB0aGlzLl9wcmV2aW91czsKICAgIGZvciAoOyBlMTAtLTsgKSB7CiAgICAgIGxldCBvMTIgPSBhNC5jYWxsKHRoaXMsIGkxMCk7CiAgICAgIGlmICghbzEyKSBicmVhazsKICAgICAgbGV0IGg3ID0gbzEyLmdldERhdGUoZmFsc2UpOwogICAgICBuMTEucHVzaCh0aGlzLmFwcGx5RGF5T2Zmc2V0KGg3KSksIGkxMCA9IG8xMjsKICAgIH0KICAgIHJldHVybiBuMTE7CiAgfQogIG1hdGNoKGUxMCkgewogICAgaWYgKHRoaXMuX3N0YXRlcy5vbmNlKSB7CiAgICAgIGxldCByMTAgPSBuZXcgbTIoZTEwLCB0aGlzLmdldFR6KCkpOwogICAgICByMTAubXMgPSAwOwogICAgICBsZXQgbjExID0gbmV3IG0yKHRoaXMuX3N0YXRlcy5vbmNlLCB0aGlzLmdldFR6KCkpOwogICAgICByZXR1cm4gbjExLm1zID0gMCwgcjEwLmdldFRpbWUoKSA9PT0gbjExLmdldFRpbWUoKTsKICAgIH0KICAgIGxldCB0OCA9IG5ldyBtMihlMTAsIHRoaXMuZ2V0VHooKSk7CiAgICByZXR1cm4gdDgubXMgPSAwLCB0OC5tYXRjaCh0aGlzLl9zdGF0ZXMucGF0dGVybiwgdGhpcy5vcHRpb25zKTsKICB9CiAgZ2V0UGF0dGVybigpIHsKICAgIGlmICghdGhpcy5fc3RhdGVzLm9uY2UpIHJldHVybiB0aGlzLl9zdGF0ZXMucGF0dGVybiA/IHRoaXMuX3N0YXRlcy5wYXR0ZXJuLnBhdHRlcm4gOiB2b2lkIDA7CiAgfQogIGdldE9uY2UoKSB7CiAgICByZXR1cm4gdGhpcy5fc3RhdGVzLm9uY2UgPyB0aGlzLl9zdGF0ZXMub25jZS5nZXREYXRlKCkgOiBudWxsOwogIH0KICBpc1J1bm5pbmcoKSB7CiAgICBsZXQgZTEwID0gdGhpcy5uZXh0UnVuKHRoaXMuX3N0YXRlcy5jdXJyZW50UnVuKSwgdDggPSAhdGhpcy5fc3RhdGVzLnBhdXNlZCwgcjEwID0gdGhpcy5mbiAhPT0gdm9pZCAwLCBuMTEgPSAhdGhpcy5fc3RhdGVzLmtpbGw7CiAgICByZXR1cm4gdDggJiYgcjEwICYmIG4xMSAmJiBlMTAgIT09IG51bGw7CiAgfQogIGlzU3RvcHBlZCgpIHsKICAgIHJldHVybiB0aGlzLl9zdGF0ZXMua2lsbDsKICB9CiAgaXNCdXN5KCkgewogICAgcmV0dXJuIHRoaXMuX3N0YXRlcy5ibG9ja2luZzsKICB9CiAgY3VycmVudFJ1bigpIHsKICAgIHJldHVybiB0aGlzLl9zdGF0ZXMuY3VycmVudFJ1biA/IHRoaXMuX3N0YXRlcy5jdXJyZW50UnVuLmdldERhdGUoKSA6IG51bGw7CiAgfQogIHByZXZpb3VzUnVuKCkgewogICAgcmV0dXJuIHRoaXMuX3N0YXRlcy5wcmV2aW91c1J1biA/IHRoaXMuX3N0YXRlcy5wcmV2aW91c1J1bi5nZXREYXRlKCkgOiBudWxsOwogIH0KICBtc1RvTmV4dChlMTApIHsKICAgIGxldCB0OCA9IHRoaXMuX25leHQoZTEwKTsKICAgIHJldHVybiB0OCA/IGUxMCBpbnN0YW5jZW9mIG0yIHx8IGUxMCBpbnN0YW5jZW9mIERhdGUgPyB0OC5nZXRUaW1lKCkgLSBlMTAuZ2V0VGltZSgpIDogdDguZ2V0VGltZSgpIC0gbmV3IG0yKGUxMCkuZ2V0VGltZSgpIDogbnVsbDsKICB9CiAgc3RvcCgpIHsKICAgIHRoaXMuX3N0YXRlcy5raWxsID0gdHJ1ZSwgdGhpcy5fc3RhdGVzLmN1cnJlbnRUaW1lb3V0ICYmIGNsZWFyVGltZW91dCh0aGlzLl9zdGF0ZXMuY3VycmVudFRpbWVvdXQpOwogICAgbGV0IGUxMCA9IHcyLmluZGV4T2YodGhpcyk7CiAgICBlMTAgPj0gMCAmJiB3Mi5zcGxpY2UoZTEwLCAxKTsKICB9CiAgcGF1c2UoKSB7CiAgICByZXR1cm4gdGhpcy5fc3RhdGVzLnBhdXNlZCA9IHRydWUsICF0aGlzLl9zdGF0ZXMua2lsbDsKICB9CiAgcmVzdW1lKCkgewogICAgcmV0dXJuIHRoaXMuX3N0YXRlcy5wYXVzZWQgPSBmYWxzZSwgIXRoaXMuX3N0YXRlcy5raWxsOwogIH0KICBzY2hlZHVsZShlMTApIHsKICAgIGlmIChlMTAgJiYgdGhpcy5mbikgdGhyb3cgbmV3IEVycm9yKCJDcm9uOiBJdCBpcyBub3QgYWxsb3dlZCB0byBzY2hlZHVsZSB0d28gZnVuY3Rpb25zIHVzaW5nIHRoZSBzYW1lIENyb25lciBpbnN0YW5jZS4iKTsKICAgIGUxMCAmJiAodGhpcy5mbiA9IGUxMCk7CiAgICBsZXQgdDggPSB0aGlzLm1zVG9OZXh0KCksIHIxMCA9IHRoaXMubmV4dFJ1bih0aGlzLl9zdGF0ZXMuY3VycmVudFJ1bik7CiAgICByZXR1cm4gdDggPT0gbnVsbCB8fCBpc05hTih0OCkgfHwgcjEwID09PSBudWxsID8gdGhpcyA6ICh0OCA+IFcgJiYgKHQ4ID0gVyksIHRoaXMuX3N0YXRlcy5jdXJyZW50VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5fY2hlY2tUcmlnZ2VyKHIxMCksIHQ4KSwgdGhpcy5fc3RhdGVzLmN1cnJlbnRUaW1lb3V0ICYmIHRoaXMub3B0aW9ucy51bnJlZiAmJiB4Mih0aGlzLl9zdGF0ZXMuY3VycmVudFRpbWVvdXQpLCB0aGlzKTsKICB9CiAgYXN5bmMgX3RyaWdnZXIoZTEwKSB7CiAgICB0aGlzLl9zdGF0ZXMuYmxvY2tpbmcgPSB0cnVlLCB0aGlzLl9zdGF0ZXMuY3VycmVudFJ1biA9IG5ldyBtMih2b2lkIDAsIHRoaXMuZ2V0VHooKSk7CiAgICB0cnkgewogICAgICBpZiAodGhpcy5vcHRpb25zLmNhdGNoKSB0cnkgewogICAgICAgIHRoaXMuZm4gIT09IHZvaWQgMCAmJiBhd2FpdCB0aGlzLmZuKHRoaXMsIHRoaXMub3B0aW9ucy5jb250ZXh0KTsKICAgICAgfSBjYXRjaCAodDgpIHsKICAgICAgICBpZiAocDModGhpcy5vcHRpb25zLmNhdGNoKSkgdHJ5IHsKICAgICAgICAgIHRoaXMub3B0aW9ucy5jYXRjaCh0OCwgdGhpcyk7CiAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgfQogICAgICB9CiAgICAgIGVsc2UgdGhpcy5mbiAhPT0gdm9pZCAwICYmIGF3YWl0IHRoaXMuZm4odGhpcywgdGhpcy5vcHRpb25zLmNvbnRleHQpOwogICAgfSBmaW5hbGx5IHsKICAgICAgdGhpcy5fc3RhdGVzLnByZXZpb3VzUnVuID0gbmV3IG0yKGUxMCwgdGhpcy5nZXRUeigpKSwgdGhpcy5fc3RhdGVzLmJsb2NraW5nID0gZmFsc2U7CiAgICB9CiAgfQogIGFzeW5jIHRyaWdnZXIoKSB7CiAgICBhd2FpdCB0aGlzLl90cmlnZ2VyKCk7CiAgfQogIHJ1bnNMZWZ0KCkgewogICAgcmV0dXJuIHRoaXMuX3N0YXRlcy5tYXhSdW5zOwogIH0KICBfY2hlY2tUcmlnZ2VyKGUxMCkgewogICAgbGV0IHQ4ID0gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCksIHIxMCA9ICF0aGlzLl9zdGF0ZXMucGF1c2VkICYmIHQ4LmdldFRpbWUoKSA+PSBlMTAuZ2V0VGltZSgpLCBuMTEgPSB0aGlzLl9zdGF0ZXMuYmxvY2tpbmcgJiYgdGhpcy5vcHRpb25zLnByb3RlY3Q7CiAgICByMTAgJiYgIW4xMSA/ICh0aGlzLl9zdGF0ZXMubWF4UnVucyAhPT0gdm9pZCAwICYmIHRoaXMuX3N0YXRlcy5tYXhSdW5zLS0sIHRoaXMuX3RyaWdnZXIoKSkgOiByMTAgJiYgbjExICYmIHAzKHRoaXMub3B0aW9ucy5wcm90ZWN0KSAmJiBzZXRUaW1lb3V0KCgpID0+IHRoaXMub3B0aW9ucy5wcm90ZWN0KHRoaXMpLCAwKSwgdGhpcy5zY2hlZHVsZSgpOwogIH0KICBfbmV4dChlMTApIHsKICAgIGxldCB0OCA9ICEhKGUxMCB8fCB0aGlzLl9zdGF0ZXMuY3VycmVudFJ1biksIHIxMCA9IGZhbHNlOwogICAgIWUxMCAmJiB0aGlzLm9wdGlvbnMuc3RhcnRBdCAmJiB0aGlzLm9wdGlvbnMuaW50ZXJ2YWwgJiYgKFtlMTAsIHQ4XSA9IHRoaXMuX2NhbGN1bGF0ZVByZXZpb3VzUnVuKGUxMCwgdDgpLCByMTAgPSAhZTEwKSwgZTEwID0gbmV3IG0yKGUxMCwgdGhpcy5nZXRUeigpKSwgdGhpcy5vcHRpb25zLnN0YXJ0QXQgJiYgZTEwICYmIGUxMC5nZXRUaW1lKCkgPCB0aGlzLm9wdGlvbnMuc3RhcnRBdC5nZXRUaW1lKCkgJiYgKGUxMCA9IHRoaXMub3B0aW9ucy5zdGFydEF0KTsKICAgIGxldCBuMTEgPSB0aGlzLl9zdGF0ZXMub25jZSB8fCBuZXcgbTIoZTEwLCB0aGlzLmdldFR6KCkpOwogICAgcmV0dXJuICFyMTAgJiYgbjExICE9PSB0aGlzLl9zdGF0ZXMub25jZSAmJiAobjExID0gbjExLmluY3JlbWVudCh0aGlzLl9zdGF0ZXMucGF0dGVybiwgdGhpcy5vcHRpb25zLCB0OCkpLCB0aGlzLl9zdGF0ZXMub25jZSAmJiB0aGlzLl9zdGF0ZXMub25jZS5nZXRUaW1lKCkgPD0gZTEwLmdldFRpbWUoKSB8fCBuMTEgPT09IG51bGwgfHwgdGhpcy5fc3RhdGVzLm1heFJ1bnMgIT09IHZvaWQgMCAmJiB0aGlzLl9zdGF0ZXMubWF4UnVucyA8PSAwIHx8IHRoaXMuX3N0YXRlcy5raWxsIHx8IHRoaXMub3B0aW9ucy5zdG9wQXQgJiYgbjExLmdldFRpbWUoKSA+PSB0aGlzLm9wdGlvbnMuc3RvcEF0LmdldFRpbWUoKSA/IG51bGwgOiBuMTE7CiAgfQogIF9wcmV2aW91cyhlMTApIHsKICAgIGxldCB0OCA9IG5ldyBtMihlMTAsIHRoaXMuZ2V0VHooKSk7CiAgICB0aGlzLm9wdGlvbnMuc3RvcEF0ICYmIHQ4LmdldFRpbWUoKSA+IHRoaXMub3B0aW9ucy5zdG9wQXQuZ2V0VGltZSgpICYmICh0OCA9IHRoaXMub3B0aW9ucy5zdG9wQXQpOwogICAgbGV0IHIxMCA9IG5ldyBtMih0OCwgdGhpcy5nZXRUeigpKTsKICAgIHJldHVybiB0aGlzLl9zdGF0ZXMub25jZSA/IHRoaXMuX3N0YXRlcy5vbmNlLmdldFRpbWUoKSA8IHQ4LmdldFRpbWUoKSA/IHRoaXMuX3N0YXRlcy5vbmNlIDogbnVsbCA6IChyMTAgPSByMTAuZGVjcmVtZW50KHRoaXMuX3N0YXRlcy5wYXR0ZXJuLCB0aGlzLm9wdGlvbnMpLCByMTAgPT09IG51bGwgfHwgdGhpcy5vcHRpb25zLnN0YXJ0QXQgJiYgcjEwLmdldFRpbWUoKSA8IHRoaXMub3B0aW9ucy5zdGFydEF0LmdldFRpbWUoKSA/IG51bGwgOiByMTApOwogIH0KICBfY2FsY3VsYXRlUHJldmlvdXNSdW4oZTEwLCB0OCkgewogICAgbGV0IHIxMCA9IG5ldyBtMih2b2lkIDAsIHRoaXMuZ2V0VHooKSksIG4xMSA9IGUxMDsKICAgIGlmICh0aGlzLm9wdGlvbnMuc3RhcnRBdC5nZXRUaW1lKCkgPD0gcjEwLmdldFRpbWUoKSkgewogICAgICBuMTEgPSB0aGlzLm9wdGlvbnMuc3RhcnRBdDsKICAgICAgbGV0IGkxMCA9IG4xMS5nZXRUaW1lKCkgKyB0aGlzLm9wdGlvbnMuaW50ZXJ2YWwgKiAxZTM7CiAgICAgIGZvciAoOyBpMTAgPD0gcjEwLmdldFRpbWUoKTsgKSBuMTEgPSBuZXcgbTIobjExLCB0aGlzLmdldFR6KCkpLmluY3JlbWVudCh0aGlzLl9zdGF0ZXMucGF0dGVybiwgdGhpcy5vcHRpb25zLCB0cnVlKSwgaTEwID0gbjExLmdldFRpbWUoKSArIHRoaXMub3B0aW9ucy5pbnRlcnZhbCAqIDFlMzsKICAgICAgdDggPSB0cnVlOwogICAgfQogICAgcmV0dXJuIG4xMSA9PT0gbnVsbCAmJiAobjExID0gdm9pZCAwKSwgW24xMSwgdDhdOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaW5kZXguanMKdmFyIGRhdGVfZm5zX2V4cG9ydHMgPSB7fTsKX19leHBvcnQoZGF0ZV9mbnNfZXhwb3J0cywgewogIGFkZDogKCkgPT4gYWRkLAogIGFkZEJ1c2luZXNzRGF5czogKCkgPT4gYWRkQnVzaW5lc3NEYXlzLAogIGFkZERheXM6ICgpID0+IGFkZERheXMsCiAgYWRkSG91cnM6ICgpID0+IGFkZEhvdXJzLAogIGFkZElTT1dlZWtZZWFyczogKCkgPT4gYWRkSVNPV2Vla1llYXJzLAogIGFkZE1pbGxpc2Vjb25kczogKCkgPT4gYWRkTWlsbGlzZWNvbmRzLAogIGFkZE1pbnV0ZXM6ICgpID0+IGFkZE1pbnV0ZXMsCiAgYWRkTW9udGhzOiAoKSA9PiBhZGRNb250aHMsCiAgYWRkUXVhcnRlcnM6ICgpID0+IGFkZFF1YXJ0ZXJzLAogIGFkZFNlY29uZHM6ICgpID0+IGFkZFNlY29uZHMsCiAgYWRkV2Vla3M6ICgpID0+IGFkZFdlZWtzLAogIGFkZFllYXJzOiAoKSA9PiBhZGRZZWFycywKICBhcmVJbnRlcnZhbHNPdmVybGFwcGluZzogKCkgPT4gYXJlSW50ZXJ2YWxzT3ZlcmxhcHBpbmcsCiAgY2xhbXA6ICgpID0+IGNsYW1wLAogIGNsb3Nlc3RJbmRleFRvOiAoKSA9PiBjbG9zZXN0SW5kZXhUbywKICBjbG9zZXN0VG86ICgpID0+IGNsb3Nlc3RUbywKICBjb21wYXJlQXNjOiAoKSA9PiBjb21wYXJlQXNjLAogIGNvbXBhcmVEZXNjOiAoKSA9PiBjb21wYXJlRGVzYywKICBjb25zdHJ1Y3RGcm9tOiAoKSA9PiBjb25zdHJ1Y3RGcm9tLAogIGNvbnN0cnVjdE5vdzogKCkgPT4gY29uc3RydWN0Tm93LAogIGRheXNUb1dlZWtzOiAoKSA9PiBkYXlzVG9XZWVrcywKICBkaWZmZXJlbmNlSW5CdXNpbmVzc0RheXM6ICgpID0+IGRpZmZlcmVuY2VJbkJ1c2luZXNzRGF5cywKICBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXM6ICgpID0+IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cywKICBkaWZmZXJlbmNlSW5DYWxlbmRhcklTT1dlZWtZZWFyczogKCkgPT4gZGlmZmVyZW5jZUluQ2FsZW5kYXJJU09XZWVrWWVhcnMsCiAgZGlmZmVyZW5jZUluQ2FsZW5kYXJJU09XZWVrczogKCkgPT4gZGlmZmVyZW5jZUluQ2FsZW5kYXJJU09XZWVrcywKICBkaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRoczogKCkgPT4gZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMsCiAgZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVyczogKCkgPT4gZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVycywKICBkaWZmZXJlbmNlSW5DYWxlbmRhcldlZWtzOiAoKSA9PiBkaWZmZXJlbmNlSW5DYWxlbmRhcldlZWtzLAogIGRpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnM6ICgpID0+IGRpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnMsCiAgZGlmZmVyZW5jZUluRGF5czogKCkgPT4gZGlmZmVyZW5jZUluRGF5cywKICBkaWZmZXJlbmNlSW5Ib3VyczogKCkgPT4gZGlmZmVyZW5jZUluSG91cnMsCiAgZGlmZmVyZW5jZUluSVNPV2Vla1llYXJzOiAoKSA9PiBkaWZmZXJlbmNlSW5JU09XZWVrWWVhcnMsCiAgZGlmZmVyZW5jZUluTWlsbGlzZWNvbmRzOiAoKSA9PiBkaWZmZXJlbmNlSW5NaWxsaXNlY29uZHMsCiAgZGlmZmVyZW5jZUluTWludXRlczogKCkgPT4gZGlmZmVyZW5jZUluTWludXRlcywKICBkaWZmZXJlbmNlSW5Nb250aHM6ICgpID0+IGRpZmZlcmVuY2VJbk1vbnRocywKICBkaWZmZXJlbmNlSW5RdWFydGVyczogKCkgPT4gZGlmZmVyZW5jZUluUXVhcnRlcnMsCiAgZGlmZmVyZW5jZUluU2Vjb25kczogKCkgPT4gZGlmZmVyZW5jZUluU2Vjb25kcywKICBkaWZmZXJlbmNlSW5XZWVrczogKCkgPT4gZGlmZmVyZW5jZUluV2Vla3MsCiAgZGlmZmVyZW5jZUluWWVhcnM6ICgpID0+IGRpZmZlcmVuY2VJblllYXJzLAogIGVhY2hEYXlPZkludGVydmFsOiAoKSA9PiBlYWNoRGF5T2ZJbnRlcnZhbCwKICBlYWNoSG91ck9mSW50ZXJ2YWw6ICgpID0+IGVhY2hIb3VyT2ZJbnRlcnZhbCwKICBlYWNoTWludXRlT2ZJbnRlcnZhbDogKCkgPT4gZWFjaE1pbnV0ZU9mSW50ZXJ2YWwsCiAgZWFjaE1vbnRoT2ZJbnRlcnZhbDogKCkgPT4gZWFjaE1vbnRoT2ZJbnRlcnZhbCwKICBlYWNoUXVhcnRlck9mSW50ZXJ2YWw6ICgpID0+IGVhY2hRdWFydGVyT2ZJbnRlcnZhbCwKICBlYWNoV2Vla09mSW50ZXJ2YWw6ICgpID0+IGVhY2hXZWVrT2ZJbnRlcnZhbCwKICBlYWNoV2Vla2VuZE9mSW50ZXJ2YWw6ICgpID0+IGVhY2hXZWVrZW5kT2ZJbnRlcnZhbCwKICBlYWNoV2Vla2VuZE9mTW9udGg6ICgpID0+IGVhY2hXZWVrZW5kT2ZNb250aCwKICBlYWNoV2Vla2VuZE9mWWVhcjogKCkgPT4gZWFjaFdlZWtlbmRPZlllYXIsCiAgZWFjaFllYXJPZkludGVydmFsOiAoKSA9PiBlYWNoWWVhck9mSW50ZXJ2YWwsCiAgZW5kT2ZEYXk6ICgpID0+IGVuZE9mRGF5LAogIGVuZE9mRGVjYWRlOiAoKSA9PiBlbmRPZkRlY2FkZSwKICBlbmRPZkhvdXI6ICgpID0+IGVuZE9mSG91ciwKICBlbmRPZklTT1dlZWs6ICgpID0+IGVuZE9mSVNPV2VlaywKICBlbmRPZklTT1dlZWtZZWFyOiAoKSA9PiBlbmRPZklTT1dlZWtZZWFyLAogIGVuZE9mTWludXRlOiAoKSA9PiBlbmRPZk1pbnV0ZSwKICBlbmRPZk1vbnRoOiAoKSA9PiBlbmRPZk1vbnRoLAogIGVuZE9mUXVhcnRlcjogKCkgPT4gZW5kT2ZRdWFydGVyLAogIGVuZE9mU2Vjb25kOiAoKSA9PiBlbmRPZlNlY29uZCwKICBlbmRPZlRvZGF5OiAoKSA9PiBlbmRPZlRvZGF5LAogIGVuZE9mVG9tb3Jyb3c6ICgpID0+IGVuZE9mVG9tb3Jyb3csCiAgZW5kT2ZXZWVrOiAoKSA9PiBlbmRPZldlZWssCiAgZW5kT2ZZZWFyOiAoKSA9PiBlbmRPZlllYXIsCiAgZW5kT2ZZZXN0ZXJkYXk6ICgpID0+IGVuZE9mWWVzdGVyZGF5LAogIGZvcm1hdDogKCkgPT4gZm9ybWF0LAogIGZvcm1hdERhdGU6ICgpID0+IGZvcm1hdCwKICBmb3JtYXREaXN0YW5jZTogKCkgPT4gZm9ybWF0RGlzdGFuY2UyLAogIGZvcm1hdERpc3RhbmNlU3RyaWN0OiAoKSA9PiBmb3JtYXREaXN0YW5jZVN0cmljdCwKICBmb3JtYXREaXN0YW5jZVRvTm93OiAoKSA9PiBmb3JtYXREaXN0YW5jZVRvTm93LAogIGZvcm1hdERpc3RhbmNlVG9Ob3dTdHJpY3Q6ICgpID0+IGZvcm1hdERpc3RhbmNlVG9Ob3dTdHJpY3QsCiAgZm9ybWF0RHVyYXRpb246ICgpID0+IGZvcm1hdER1cmF0aW9uLAogIGZvcm1hdElTTzogKCkgPT4gZm9ybWF0SVNPLAogIGZvcm1hdElTTzkwNzU6ICgpID0+IGZvcm1hdElTTzkwNzUsCiAgZm9ybWF0SVNPRHVyYXRpb246ICgpID0+IGZvcm1hdElTT0R1cmF0aW9uLAogIGZvcm1hdFJGQzMzMzk6ICgpID0+IGZvcm1hdFJGQzMzMzksCiAgZm9ybWF0UkZDNzIzMTogKCkgPT4gZm9ybWF0UkZDNzIzMSwKICBmb3JtYXRSZWxhdGl2ZTogKCkgPT4gZm9ybWF0UmVsYXRpdmUyLAogIGZvcm1hdHRlcnM6ICgpID0+IGZvcm1hdHRlcnMsCiAgZnJvbVVuaXhUaW1lOiAoKSA9PiBmcm9tVW5peFRpbWUsCiAgZ2V0RGF0ZTogKCkgPT4gZ2V0RGF0ZSwKICBnZXREYXk6ICgpID0+IGdldERheSwKICBnZXREYXlPZlllYXI6ICgpID0+IGdldERheU9mWWVhciwKICBnZXREYXlzSW5Nb250aDogKCkgPT4gZ2V0RGF5c0luTW9udGgsCiAgZ2V0RGF5c0luWWVhcjogKCkgPT4gZ2V0RGF5c0luWWVhciwKICBnZXREZWNhZGU6ICgpID0+IGdldERlY2FkZSwKICBnZXREZWZhdWx0T3B0aW9uczogKCkgPT4gZ2V0RGVmYXVsdE9wdGlvbnMyLAogIGdldEhvdXJzOiAoKSA9PiBnZXRIb3VycywKICBnZXRJU09EYXk6ICgpID0+IGdldElTT0RheSwKICBnZXRJU09XZWVrOiAoKSA9PiBnZXRJU09XZWVrLAogIGdldElTT1dlZWtZZWFyOiAoKSA9PiBnZXRJU09XZWVrWWVhciwKICBnZXRJU09XZWVrc0luWWVhcjogKCkgPT4gZ2V0SVNPV2Vla3NJblllYXIsCiAgZ2V0TWlsbGlzZWNvbmRzOiAoKSA9PiBnZXRNaWxsaXNlY29uZHMsCiAgZ2V0TWludXRlczogKCkgPT4gZ2V0TWludXRlcywKICBnZXRNb250aDogKCkgPT4gZ2V0TW9udGgsCiAgZ2V0T3ZlcmxhcHBpbmdEYXlzSW5JbnRlcnZhbHM6ICgpID0+IGdldE92ZXJsYXBwaW5nRGF5c0luSW50ZXJ2YWxzLAogIGdldFF1YXJ0ZXI6ICgpID0+IGdldFF1YXJ0ZXIsCiAgZ2V0U2Vjb25kczogKCkgPT4gZ2V0U2Vjb25kcywKICBnZXRUaW1lOiAoKSA9PiBnZXRUaW1lLAogIGdldFVuaXhUaW1lOiAoKSA9PiBnZXRVbml4VGltZSwKICBnZXRXZWVrOiAoKSA9PiBnZXRXZWVrLAogIGdldFdlZWtPZk1vbnRoOiAoKSA9PiBnZXRXZWVrT2ZNb250aCwKICBnZXRXZWVrWWVhcjogKCkgPT4gZ2V0V2Vla1llYXIsCiAgZ2V0V2Vla3NJbk1vbnRoOiAoKSA9PiBnZXRXZWVrc0luTW9udGgsCiAgZ2V0WWVhcjogKCkgPT4gZ2V0WWVhciwKICBob3Vyc1RvTWlsbGlzZWNvbmRzOiAoKSA9PiBob3Vyc1RvTWlsbGlzZWNvbmRzLAogIGhvdXJzVG9NaW51dGVzOiAoKSA9PiBob3Vyc1RvTWludXRlcywKICBob3Vyc1RvU2Vjb25kczogKCkgPT4gaG91cnNUb1NlY29uZHMsCiAgaW50ZXJ2YWw6ICgpID0+IGludGVydmFsMiwKICBpbnRlcnZhbFRvRHVyYXRpb246ICgpID0+IGludGVydmFsVG9EdXJhdGlvbiwKICBpbnRsRm9ybWF0OiAoKSA9PiBpbnRsRm9ybWF0LAogIGludGxGb3JtYXREaXN0YW5jZTogKCkgPT4gaW50bEZvcm1hdERpc3RhbmNlLAogIGlzQWZ0ZXI6ICgpID0+IGlzQWZ0ZXIsCiAgaXNCZWZvcmU6ICgpID0+IGlzQmVmb3JlLAogIGlzRGF0ZTogKCkgPT4gaXNEYXRlLAogIGlzRXF1YWw6ICgpID0+IGlzRXF1YWwsCiAgaXNFeGlzdHM6ICgpID0+IGlzRXhpc3RzLAogIGlzRmlyc3REYXlPZk1vbnRoOiAoKSA9PiBpc0ZpcnN0RGF5T2ZNb250aCwKICBpc0ZyaWRheTogKCkgPT4gaXNGcmlkYXksCiAgaXNGdXR1cmU6ICgpID0+IGlzRnV0dXJlLAogIGlzTGFzdERheU9mTW9udGg6ICgpID0+IGlzTGFzdERheU9mTW9udGgsCiAgaXNMZWFwWWVhcjogKCkgPT4gaXNMZWFwWWVhciwKICBpc01hdGNoOiAoKSA9PiBpc01hdGNoMiwKICBpc01vbmRheTogKCkgPT4gaXNNb25kYXksCiAgaXNQYXN0OiAoKSA9PiBpc1Bhc3QsCiAgaXNTYW1lRGF5OiAoKSA9PiBpc1NhbWVEYXksCiAgaXNTYW1lSG91cjogKCkgPT4gaXNTYW1lSG91ciwKICBpc1NhbWVJU09XZWVrOiAoKSA9PiBpc1NhbWVJU09XZWVrLAogIGlzU2FtZUlTT1dlZWtZZWFyOiAoKSA9PiBpc1NhbWVJU09XZWVrWWVhciwKICBpc1NhbWVNaW51dGU6ICgpID0+IGlzU2FtZU1pbnV0ZSwKICBpc1NhbWVNb250aDogKCkgPT4gaXNTYW1lTW9udGgsCiAgaXNTYW1lUXVhcnRlcjogKCkgPT4gaXNTYW1lUXVhcnRlciwKICBpc1NhbWVTZWNvbmQ6ICgpID0+IGlzU2FtZVNlY29uZCwKICBpc1NhbWVXZWVrOiAoKSA9PiBpc1NhbWVXZWVrLAogIGlzU2FtZVllYXI6ICgpID0+IGlzU2FtZVllYXIsCiAgaXNTYXR1cmRheTogKCkgPT4gaXNTYXR1cmRheSwKICBpc1N1bmRheTogKCkgPT4gaXNTdW5kYXksCiAgaXNUaGlzSG91cjogKCkgPT4gaXNUaGlzSG91ciwKICBpc1RoaXNJU09XZWVrOiAoKSA9PiBpc1RoaXNJU09XZWVrLAogIGlzVGhpc01pbnV0ZTogKCkgPT4gaXNUaGlzTWludXRlLAogIGlzVGhpc01vbnRoOiAoKSA9PiBpc1RoaXNNb250aCwKICBpc1RoaXNRdWFydGVyOiAoKSA9PiBpc1RoaXNRdWFydGVyLAogIGlzVGhpc1NlY29uZDogKCkgPT4gaXNUaGlzU2Vjb25kLAogIGlzVGhpc1dlZWs6ICgpID0+IGlzVGhpc1dlZWssCiAgaXNUaGlzWWVhcjogKCkgPT4gaXNUaGlzWWVhciwKICBpc1RodXJzZGF5OiAoKSA9PiBpc1RodXJzZGF5LAogIGlzVG9kYXk6ICgpID0+IGlzVG9kYXksCiAgaXNUb21vcnJvdzogKCkgPT4gaXNUb21vcnJvdywKICBpc1R1ZXNkYXk6ICgpID0+IGlzVHVlc2RheSwKICBpc1ZhbGlkOiAoKSA9PiBpc1ZhbGlkLAogIGlzV2VkbmVzZGF5OiAoKSA9PiBpc1dlZG5lc2RheSwKICBpc1dlZWtlbmQ6ICgpID0+IGlzV2Vla2VuZCwKICBpc1dpdGhpbkludGVydmFsOiAoKSA9PiBpc1dpdGhpbkludGVydmFsLAogIGlzWWVzdGVyZGF5OiAoKSA9PiBpc1llc3RlcmRheSwKICBsYXN0RGF5T2ZEZWNhZGU6ICgpID0+IGxhc3REYXlPZkRlY2FkZSwKICBsYXN0RGF5T2ZJU09XZWVrOiAoKSA9PiBsYXN0RGF5T2ZJU09XZWVrLAogIGxhc3REYXlPZklTT1dlZWtZZWFyOiAoKSA9PiBsYXN0RGF5T2ZJU09XZWVrWWVhciwKICBsYXN0RGF5T2ZNb250aDogKCkgPT4gbGFzdERheU9mTW9udGgsCiAgbGFzdERheU9mUXVhcnRlcjogKCkgPT4gbGFzdERheU9mUXVhcnRlciwKICBsYXN0RGF5T2ZXZWVrOiAoKSA9PiBsYXN0RGF5T2ZXZWVrLAogIGxhc3REYXlPZlllYXI6ICgpID0+IGxhc3REYXlPZlllYXIsCiAgbGlnaHRGb3JtYXQ6ICgpID0+IGxpZ2h0Rm9ybWF0LAogIGxpZ2h0Rm9ybWF0dGVyczogKCkgPT4gbGlnaHRGb3JtYXR0ZXJzLAogIGxvbmdGb3JtYXR0ZXJzOiAoKSA9PiBsb25nRm9ybWF0dGVycywKICBtYXg6ICgpID0+IG1heDIsCiAgbWlsbGlzZWNvbmRzOiAoKSA9PiBtaWxsaXNlY29uZHMsCiAgbWlsbGlzZWNvbmRzVG9Ib3VyczogKCkgPT4gbWlsbGlzZWNvbmRzVG9Ib3VycywKICBtaWxsaXNlY29uZHNUb01pbnV0ZXM6ICgpID0+IG1pbGxpc2Vjb25kc1RvTWludXRlcywKICBtaWxsaXNlY29uZHNUb1NlY29uZHM6ICgpID0+IG1pbGxpc2Vjb25kc1RvU2Vjb25kcywKICBtaW46ICgpID0+IG1pbjIsCiAgbWludXRlc1RvSG91cnM6ICgpID0+IG1pbnV0ZXNUb0hvdXJzLAogIG1pbnV0ZXNUb01pbGxpc2Vjb25kczogKCkgPT4gbWludXRlc1RvTWlsbGlzZWNvbmRzLAogIG1pbnV0ZXNUb1NlY29uZHM6ICgpID0+IG1pbnV0ZXNUb1NlY29uZHMsCiAgbW9udGhzVG9RdWFydGVyczogKCkgPT4gbW9udGhzVG9RdWFydGVycywKICBtb250aHNUb1llYXJzOiAoKSA9PiBtb250aHNUb1llYXJzLAogIG5leHREYXk6ICgpID0+IG5leHREYXksCiAgbmV4dEZyaWRheTogKCkgPT4gbmV4dEZyaWRheSwKICBuZXh0TW9uZGF5OiAoKSA9PiBuZXh0TW9uZGF5LAogIG5leHRTYXR1cmRheTogKCkgPT4gbmV4dFNhdHVyZGF5LAogIG5leHRTdW5kYXk6ICgpID0+IG5leHRTdW5kYXksCiAgbmV4dFRodXJzZGF5OiAoKSA9PiBuZXh0VGh1cnNkYXksCiAgbmV4dFR1ZXNkYXk6ICgpID0+IG5leHRUdWVzZGF5LAogIG5leHRXZWRuZXNkYXk6ICgpID0+IG5leHRXZWRuZXNkYXksCiAgcGFyc2U6ICgpID0+IHBhcnNlLAogIHBhcnNlSVNPOiAoKSA9PiBwYXJzZUlTTywKICBwYXJzZUpTT046ICgpID0+IHBhcnNlSlNPTiwKICBwYXJzZXJzOiAoKSA9PiBwYXJzZXJzLAogIHByZXZpb3VzRGF5OiAoKSA9PiBwcmV2aW91c0RheSwKICBwcmV2aW91c0ZyaWRheTogKCkgPT4gcHJldmlvdXNGcmlkYXksCiAgcHJldmlvdXNNb25kYXk6ICgpID0+IHByZXZpb3VzTW9uZGF5LAogIHByZXZpb3VzU2F0dXJkYXk6ICgpID0+IHByZXZpb3VzU2F0dXJkYXksCiAgcHJldmlvdXNTdW5kYXk6ICgpID0+IHByZXZpb3VzU3VuZGF5LAogIHByZXZpb3VzVGh1cnNkYXk6ICgpID0+IHByZXZpb3VzVGh1cnNkYXksCiAgcHJldmlvdXNUdWVzZGF5OiAoKSA9PiBwcmV2aW91c1R1ZXNkYXksCiAgcHJldmlvdXNXZWRuZXNkYXk6ICgpID0+IHByZXZpb3VzV2VkbmVzZGF5LAogIHF1YXJ0ZXJzVG9Nb250aHM6ICgpID0+IHF1YXJ0ZXJzVG9Nb250aHMsCiAgcXVhcnRlcnNUb1llYXJzOiAoKSA9PiBxdWFydGVyc1RvWWVhcnMsCiAgcm91bmRUb05lYXJlc3RIb3VyczogKCkgPT4gcm91bmRUb05lYXJlc3RIb3VycywKICByb3VuZFRvTmVhcmVzdE1pbnV0ZXM6ICgpID0+IHJvdW5kVG9OZWFyZXN0TWludXRlcywKICBzZWNvbmRzVG9Ib3VyczogKCkgPT4gc2Vjb25kc1RvSG91cnMsCiAgc2Vjb25kc1RvTWlsbGlzZWNvbmRzOiAoKSA9PiBzZWNvbmRzVG9NaWxsaXNlY29uZHMsCiAgc2Vjb25kc1RvTWludXRlczogKCkgPT4gc2Vjb25kc1RvTWludXRlcywKICBzZXQ6ICgpID0+IHNldCwKICBzZXREYXRlOiAoKSA9PiBzZXREYXRlLAogIHNldERheTogKCkgPT4gc2V0RGF5LAogIHNldERheU9mWWVhcjogKCkgPT4gc2V0RGF5T2ZZZWFyLAogIHNldERlZmF1bHRPcHRpb25zOiAoKSA9PiBzZXREZWZhdWx0T3B0aW9uczIsCiAgc2V0SG91cnM6ICgpID0+IHNldEhvdXJzLAogIHNldElTT0RheTogKCkgPT4gc2V0SVNPRGF5LAogIHNldElTT1dlZWs6ICgpID0+IHNldElTT1dlZWssCiAgc2V0SVNPV2Vla1llYXI6ICgpID0+IHNldElTT1dlZWtZZWFyLAogIHNldE1pbGxpc2Vjb25kczogKCkgPT4gc2V0TWlsbGlzZWNvbmRzLAogIHNldE1pbnV0ZXM6ICgpID0+IHNldE1pbnV0ZXMsCiAgc2V0TW9udGg6ICgpID0+IHNldE1vbnRoLAogIHNldFF1YXJ0ZXI6ICgpID0+IHNldFF1YXJ0ZXIsCiAgc2V0U2Vjb25kczogKCkgPT4gc2V0U2Vjb25kcywKICBzZXRXZWVrOiAoKSA9PiBzZXRXZWVrLAogIHNldFdlZWtZZWFyOiAoKSA9PiBzZXRXZWVrWWVhciwKICBzZXRZZWFyOiAoKSA9PiBzZXRZZWFyLAogIHN0YXJ0T2ZEYXk6ICgpID0+IHN0YXJ0T2ZEYXksCiAgc3RhcnRPZkRlY2FkZTogKCkgPT4gc3RhcnRPZkRlY2FkZSwKICBzdGFydE9mSG91cjogKCkgPT4gc3RhcnRPZkhvdXIsCiAgc3RhcnRPZklTT1dlZWs6ICgpID0+IHN0YXJ0T2ZJU09XZWVrLAogIHN0YXJ0T2ZJU09XZWVrWWVhcjogKCkgPT4gc3RhcnRPZklTT1dlZWtZZWFyLAogIHN0YXJ0T2ZNaW51dGU6ICgpID0+IHN0YXJ0T2ZNaW51dGUsCiAgc3RhcnRPZk1vbnRoOiAoKSA9PiBzdGFydE9mTW9udGgsCiAgc3RhcnRPZlF1YXJ0ZXI6ICgpID0+IHN0YXJ0T2ZRdWFydGVyLAogIHN0YXJ0T2ZTZWNvbmQ6ICgpID0+IHN0YXJ0T2ZTZWNvbmQsCiAgc3RhcnRPZlRvZGF5OiAoKSA9PiBzdGFydE9mVG9kYXksCiAgc3RhcnRPZlRvbW9ycm93OiAoKSA9PiBzdGFydE9mVG9tb3Jyb3csCiAgc3RhcnRPZldlZWs6ICgpID0+IHN0YXJ0T2ZXZWVrLAogIHN0YXJ0T2ZXZWVrWWVhcjogKCkgPT4gc3RhcnRPZldlZWtZZWFyLAogIHN0YXJ0T2ZZZWFyOiAoKSA9PiBzdGFydE9mWWVhciwKICBzdGFydE9mWWVzdGVyZGF5OiAoKSA9PiBzdGFydE9mWWVzdGVyZGF5LAogIHN1YjogKCkgPT4gc3ViLAogIHN1YkJ1c2luZXNzRGF5czogKCkgPT4gc3ViQnVzaW5lc3NEYXlzLAogIHN1YkRheXM6ICgpID0+IHN1YkRheXMsCiAgc3ViSG91cnM6ICgpID0+IHN1YkhvdXJzLAogIHN1YklTT1dlZWtZZWFyczogKCkgPT4gc3ViSVNPV2Vla1llYXJzLAogIHN1Yk1pbGxpc2Vjb25kczogKCkgPT4gc3ViTWlsbGlzZWNvbmRzLAogIHN1Yk1pbnV0ZXM6ICgpID0+IHN1Yk1pbnV0ZXMsCiAgc3ViTW9udGhzOiAoKSA9PiBzdWJNb250aHMsCiAgc3ViUXVhcnRlcnM6ICgpID0+IHN1YlF1YXJ0ZXJzLAogIHN1YlNlY29uZHM6ICgpID0+IHN1YlNlY29uZHMsCiAgc3ViV2Vla3M6ICgpID0+IHN1YldlZWtzLAogIHN1YlllYXJzOiAoKSA9PiBzdWJZZWFycywKICB0b0RhdGU6ICgpID0+IHRvRGF0ZSwKICB0cmFuc3Bvc2U6ICgpID0+IHRyYW5zcG9zZSwKICB3ZWVrc1RvRGF5czogKCkgPT4gd2Vla3NUb0RheXMsCiAgeWVhcnNUb0RheXM6ICgpID0+IHllYXJzVG9EYXlzLAogIHllYXJzVG9Nb250aHM6ICgpID0+IHllYXJzVG9Nb250aHMsCiAgeWVhcnNUb1F1YXJ0ZXJzOiAoKSA9PiB5ZWFyc1RvUXVhcnRlcnMKfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2NvbnN0YW50cy5qcwp2YXIgZGF5c0luV2VlayA9IDc7CnZhciBkYXlzSW5ZZWFyID0gMzY1LjI0MjU7CnZhciBtYXhUaW1lID0gTWF0aC5wb3coMTAsIDgpICogMjQgKiA2MCAqIDYwICogMWUzOwp2YXIgbWluVGltZSA9IC1tYXhUaW1lOwp2YXIgbWlsbGlzZWNvbmRzSW5XZWVrID0gNjA0OGU1Owp2YXIgbWlsbGlzZWNvbmRzSW5EYXkgPSA4NjRlNTsKdmFyIG1pbGxpc2Vjb25kc0luTWludXRlID0gNmU0Owp2YXIgbWlsbGlzZWNvbmRzSW5Ib3VyID0gMzZlNTsKdmFyIG1pbGxpc2Vjb25kc0luU2Vjb25kID0gMWUzOwp2YXIgbWludXRlc0luWWVhciA9IDUyNTYwMDsKdmFyIG1pbnV0ZXNJbk1vbnRoID0gNDMyMDA7CnZhciBtaW51dGVzSW5EYXkgPSAxNDQwOwp2YXIgbWludXRlc0luSG91ciA9IDYwOwp2YXIgbW9udGhzSW5RdWFydGVyID0gMzsKdmFyIG1vbnRoc0luWWVhciA9IDEyOwp2YXIgcXVhcnRlcnNJblllYXIgPSA0Owp2YXIgc2Vjb25kc0luSG91ciA9IDM2MDA7CnZhciBzZWNvbmRzSW5NaW51dGUgPSA2MDsKdmFyIHNlY29uZHNJbkRheSA9IHNlY29uZHNJbkhvdXIgKiAyNDsKdmFyIHNlY29uZHNJbldlZWsgPSBzZWNvbmRzSW5EYXkgKiA3Owp2YXIgc2Vjb25kc0luWWVhciA9IHNlY29uZHNJbkRheSAqIGRheXNJblllYXI7CnZhciBzZWNvbmRzSW5Nb250aCA9IHNlY29uZHNJblllYXIgLyAxMjsKdmFyIHNlY29uZHNJblF1YXJ0ZXIgPSBzZWNvbmRzSW5Nb250aCAqIDM7CnZhciBjb25zdHJ1Y3RGcm9tU3ltYm9sID0gLyogQF9fUFVSRV9fICovIFN5bWJvbC5mb3IoImNvbnN0cnVjdERhdGVGcm9tIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2NvbnN0cnVjdEZyb20uanMKZnVuY3Rpb24gY29uc3RydWN0RnJvbShkYXRlLCB2YWx1ZTIpIHsKICBpZiAodHlwZW9mIGRhdGUgPT09ICJmdW5jdGlvbiIpIHJldHVybiBkYXRlKHZhbHVlMik7CiAgaWYgKGRhdGUgJiYgdHlwZW9mIGRhdGUgPT09ICJvYmplY3QiICYmIGNvbnN0cnVjdEZyb21TeW1ib2wgaW4gZGF0ZSkKICAgIHJldHVybiBkYXRlW2NvbnN0cnVjdEZyb21TeW1ib2xdKHZhbHVlMik7CiAgaWYgKGRhdGUgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gbmV3IGRhdGUuY29uc3RydWN0b3IodmFsdWUyKTsKICByZXR1cm4gbmV3IERhdGUodmFsdWUyKTsKfQpfX25hbWUoY29uc3RydWN0RnJvbSwgImNvbnN0cnVjdEZyb20iKTsKdmFyIGNvbnN0cnVjdEZyb21fZGVmYXVsdCA9IGNvbnN0cnVjdEZyb207CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3RvRGF0ZS5qcwpmdW5jdGlvbiB0b0RhdGUoYXJndW1lbnQsIGNvbnRleHQyKSB7CiAgcmV0dXJuIGNvbnN0cnVjdEZyb20oY29udGV4dDIgfHwgYXJndW1lbnQsIGFyZ3VtZW50KTsKfQpfX25hbWUodG9EYXRlLCAidG9EYXRlIik7CnZhciB0b0RhdGVfZGVmYXVsdCA9IHRvRGF0ZTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkRGF5cy5qcwpmdW5jdGlvbiBhZGREYXlzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBpZiAoaXNOYU4oYW1vdW50KSkgcmV0dXJuIGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4gfHwgZGF0ZSwgTmFOKTsKICBpZiAoIWFtb3VudCkgcmV0dXJuIF9kYXRlOwogIF9kYXRlLnNldERhdGUoX2RhdGUuZ2V0RGF0ZSgpICsgYW1vdW50KTsKICByZXR1cm4gX2RhdGU7Cn0KX19uYW1lKGFkZERheXMsICJhZGREYXlzIik7CnZhciBhZGREYXlzX2RlZmF1bHQgPSBhZGREYXlzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGRNb250aHMuanMKZnVuY3Rpb24gYWRkTW9udGhzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBpZiAoaXNOYU4oYW1vdW50KSkgcmV0dXJuIGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4gfHwgZGF0ZSwgTmFOKTsKICBpZiAoIWFtb3VudCkgewogICAgcmV0dXJuIF9kYXRlOwogIH0KICBjb25zdCBkYXlPZk1vbnRoID0gX2RhdGUuZ2V0RGF0ZSgpOwogIGNvbnN0IGVuZE9mRGVzaXJlZE1vbnRoID0gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCBfZGF0ZS5nZXRUaW1lKCkpOwogIGVuZE9mRGVzaXJlZE1vbnRoLnNldE1vbnRoKF9kYXRlLmdldE1vbnRoKCkgKyBhbW91bnQgKyAxLCAwKTsKICBjb25zdCBkYXlzSW5Nb250aCA9IGVuZE9mRGVzaXJlZE1vbnRoLmdldERhdGUoKTsKICBpZiAoZGF5T2ZNb250aCA+PSBkYXlzSW5Nb250aCkgewogICAgcmV0dXJuIGVuZE9mRGVzaXJlZE1vbnRoOwogIH0gZWxzZSB7CiAgICBfZGF0ZS5zZXRGdWxsWWVhcigKICAgICAgZW5kT2ZEZXNpcmVkTW9udGguZ2V0RnVsbFllYXIoKSwKICAgICAgZW5kT2ZEZXNpcmVkTW9udGguZ2V0TW9udGgoKSwKICAgICAgZGF5T2ZNb250aAogICAgKTsKICAgIHJldHVybiBfZGF0ZTsKICB9Cn0KX19uYW1lKGFkZE1vbnRocywgImFkZE1vbnRocyIpOwp2YXIgYWRkTW9udGhzX2RlZmF1bHQgPSBhZGRNb250aHM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZC5qcwpmdW5jdGlvbiBhZGQoZGF0ZSwgZHVyYXRpb24sIG9wdGlvbnMpIHsKICBjb25zdCB7CiAgICB5ZWFycyA9IDAsCiAgICBtb250aHM6IG1vbnRoczIgPSAwLAogICAgd2Vla3MgPSAwLAogICAgZGF5czogZGF5czIgPSAwLAogICAgaG91cnMgPSAwLAogICAgbWludXRlcyA9IDAsCiAgICBzZWNvbmRzID0gMAogIH0gPSBkdXJhdGlvbjsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgZGF0ZVdpdGhNb250aHMgPSBtb250aHMyIHx8IHllYXJzID8gYWRkTW9udGhzKF9kYXRlLCBtb250aHMyICsgeWVhcnMgKiAxMikgOiBfZGF0ZTsKICBjb25zdCBkYXRlV2l0aERheXMgPSBkYXlzMiB8fCB3ZWVrcyA/IGFkZERheXMoZGF0ZVdpdGhNb250aHMsIGRheXMyICsgd2Vla3MgKiA3KSA6IGRhdGVXaXRoTW9udGhzOwogIGNvbnN0IG1pbnV0ZXNUb0FkZCA9IG1pbnV0ZXMgKyBob3VycyAqIDYwOwogIGNvbnN0IHNlY29uZHNUb0FkZCA9IHNlY29uZHMgKyBtaW51dGVzVG9BZGQgKiA2MDsKICBjb25zdCBtc1RvQWRkID0gc2Vjb25kc1RvQWRkICogMWUzOwogIHJldHVybiBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsICtkYXRlV2l0aERheXMgKyBtc1RvQWRkKTsKfQpfX25hbWUoYWRkLCAiYWRkIik7CnZhciBhZGRfZGVmYXVsdCA9IGFkZDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNTYXR1cmRheS5qcwpmdW5jdGlvbiBpc1NhdHVyZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKS5nZXREYXkoKSA9PT0gNjsKfQpfX25hbWUoaXNTYXR1cmRheSwgImlzU2F0dXJkYXkiKTsKdmFyIGlzU2F0dXJkYXlfZGVmYXVsdCA9IGlzU2F0dXJkYXk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzU3VuZGF5LmpzCmZ1bmN0aW9uIGlzU3VuZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKS5nZXREYXkoKSA9PT0gMDsKfQpfX25hbWUoaXNTdW5kYXksICJpc1N1bmRheSIpOwp2YXIgaXNTdW5kYXlfZGVmYXVsdCA9IGlzU3VuZGF5OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1dlZWtlbmQuanMKZnVuY3Rpb24gaXNXZWVrZW5kKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBkYXkgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pLmdldERheSgpOwogIHJldHVybiBkYXkgPT09IDAgfHwgZGF5ID09PSA2Owp9Cl9fbmFtZShpc1dlZWtlbmQsICJpc1dlZWtlbmQiKTsKdmFyIGlzV2Vla2VuZF9kZWZhdWx0ID0gaXNXZWVrZW5kOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGRCdXNpbmVzc0RheXMuanMKZnVuY3Rpb24gYWRkQnVzaW5lc3NEYXlzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCBzdGFydGVkT25XZWVrZW5kID0gaXNXZWVrZW5kKF9kYXRlLCBvcHRpb25zKTsKICBpZiAoaXNOYU4oYW1vdW50KSkgcmV0dXJuIGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4sIE5hTik7CiAgY29uc3QgaG91cnMgPSBfZGF0ZS5nZXRIb3VycygpOwogIGNvbnN0IHNpZ24gPSBhbW91bnQgPCAwID8gLTEgOiAxOwogIGNvbnN0IGZ1bGxXZWVrcyA9IE1hdGgudHJ1bmMoYW1vdW50IC8gNSk7CiAgX2RhdGUuc2V0RGF0ZShfZGF0ZS5nZXREYXRlKCkgKyBmdWxsV2Vla3MgKiA3KTsKICBsZXQgcmVzdERheXMgPSBNYXRoLmFicyhhbW91bnQgJSA1KTsKICB3aGlsZSAocmVzdERheXMgPiAwKSB7CiAgICBfZGF0ZS5zZXREYXRlKF9kYXRlLmdldERhdGUoKSArIHNpZ24pOwogICAgaWYgKCFpc1dlZWtlbmQoX2RhdGUsIG9wdGlvbnMpKSByZXN0RGF5cyAtPSAxOwogIH0KICBpZiAoc3RhcnRlZE9uV2Vla2VuZCAmJiBpc1dlZWtlbmQoX2RhdGUsIG9wdGlvbnMpICYmIGFtb3VudCAhPT0gMCkgewogICAgaWYgKGlzU2F0dXJkYXkoX2RhdGUsIG9wdGlvbnMpKQogICAgICBfZGF0ZS5zZXREYXRlKF9kYXRlLmdldERhdGUoKSArIChzaWduIDwgMCA/IDIgOiAtMSkpOwogICAgaWYgKGlzU3VuZGF5KF9kYXRlLCBvcHRpb25zKSkKICAgICAgX2RhdGUuc2V0RGF0ZShfZGF0ZS5nZXREYXRlKCkgKyAoc2lnbiA8IDAgPyAxIDogLTIpKTsKICB9CiAgX2RhdGUuc2V0SG91cnMoaG91cnMpOwogIHJldHVybiBfZGF0ZTsKfQpfX25hbWUoYWRkQnVzaW5lc3NEYXlzLCAiYWRkQnVzaW5lc3NEYXlzIik7CnZhciBhZGRCdXNpbmVzc0RheXNfZGVmYXVsdCA9IGFkZEJ1c2luZXNzRGF5czsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkTWlsbGlzZWNvbmRzLmpzCmZ1bmN0aW9uIGFkZE1pbGxpc2Vjb25kcyhkYXRlLCBhbW91bnQsIG9wdGlvbnMpIHsKICByZXR1cm4gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCArdG9EYXRlKGRhdGUpICsgYW1vdW50KTsKfQpfX25hbWUoYWRkTWlsbGlzZWNvbmRzLCAiYWRkTWlsbGlzZWNvbmRzIik7CnZhciBhZGRNaWxsaXNlY29uZHNfZGVmYXVsdCA9IGFkZE1pbGxpc2Vjb25kczsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkSG91cnMuanMKZnVuY3Rpb24gYWRkSG91cnMoZGF0ZSwgYW1vdW50LCBvcHRpb25zKSB7CiAgcmV0dXJuIGFkZE1pbGxpc2Vjb25kcyhkYXRlLCBhbW91bnQgKiBtaWxsaXNlY29uZHNJbkhvdXIsIG9wdGlvbnMpOwp9Cl9fbmFtZShhZGRIb3VycywgImFkZEhvdXJzIik7CnZhciBhZGRIb3Vyc19kZWZhdWx0ID0gYWRkSG91cnM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvZGVmYXVsdE9wdGlvbnMuanMKdmFyIGRlZmF1bHRPcHRpb25zID0ge307CmZ1bmN0aW9uIGdldERlZmF1bHRPcHRpb25zKCkgewogIHJldHVybiBkZWZhdWx0T3B0aW9uczsKfQpfX25hbWUoZ2V0RGVmYXVsdE9wdGlvbnMsICJnZXREZWZhdWx0T3B0aW9ucyIpOwpmdW5jdGlvbiBzZXREZWZhdWx0T3B0aW9ucyhuZXdPcHRpb25zKSB7CiAgZGVmYXVsdE9wdGlvbnMgPSBuZXdPcHRpb25zOwp9Cl9fbmFtZShzZXREZWZhdWx0T3B0aW9ucywgInNldERlZmF1bHRPcHRpb25zIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZXZWVrLmpzCmZ1bmN0aW9uIHN0YXJ0T2ZXZWVrKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBkZWZhdWx0T3B0aW9uczIgPSBnZXREZWZhdWx0T3B0aW9ucygpOwogIGNvbnN0IHdlZWtTdGFydHNPbiA9IG9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyBkZWZhdWx0T3B0aW9uczIud2Vla1N0YXJ0c09uID8/IGRlZmF1bHRPcHRpb25zMi5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyAwOwogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCBkYXkgPSBfZGF0ZS5nZXREYXkoKTsKICBjb25zdCBkaWZmID0gKGRheSA8IHdlZWtTdGFydHNPbiA/IDcgOiAwKSArIGRheSAtIHdlZWtTdGFydHNPbjsKICBfZGF0ZS5zZXREYXRlKF9kYXRlLmdldERhdGUoKSAtIGRpZmYpOwogIF9kYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogIHJldHVybiBfZGF0ZTsKfQpfX25hbWUoc3RhcnRPZldlZWssICJzdGFydE9mV2VlayIpOwp2YXIgc3RhcnRPZldlZWtfZGVmYXVsdCA9IHN0YXJ0T2ZXZWVrOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mSVNPV2Vlay5qcwpmdW5jdGlvbiBzdGFydE9mSVNPV2VlayhkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIHN0YXJ0T2ZXZWVrKGRhdGUsIHsgLi4ub3B0aW9ucywgd2Vla1N0YXJ0c09uOiAxIH0pOwp9Cl9fbmFtZShzdGFydE9mSVNPV2VlaywgInN0YXJ0T2ZJU09XZWVrIik7CnZhciBzdGFydE9mSVNPV2Vla19kZWZhdWx0ID0gc3RhcnRPZklTT1dlZWs7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldElTT1dlZWtZZWFyLmpzCmZ1bmN0aW9uIGdldElTT1dlZWtZZWFyKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgeWVhciA9IF9kYXRlLmdldEZ1bGxZZWFyKCk7CiAgY29uc3QgZm91cnRoT2ZKYW51YXJ5T2ZOZXh0WWVhciA9IGNvbnN0cnVjdEZyb20oX2RhdGUsIDApOwogIGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIuc2V0RnVsbFllYXIoeWVhciArIDEsIDAsIDQpOwogIGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgY29uc3Qgc3RhcnRPZk5leHRZZWFyID0gc3RhcnRPZklTT1dlZWsoZm91cnRoT2ZKYW51YXJ5T2ZOZXh0WWVhcik7CiAgY29uc3QgZm91cnRoT2ZKYW51YXJ5T2ZUaGlzWWVhciA9IGNvbnN0cnVjdEZyb20oX2RhdGUsIDApOwogIGZvdXJ0aE9mSmFudWFyeU9mVGhpc1llYXIuc2V0RnVsbFllYXIoeWVhciwgMCwgNCk7CiAgZm91cnRoT2ZKYW51YXJ5T2ZUaGlzWWVhci5zZXRIb3VycygwLCAwLCAwLCAwKTsKICBjb25zdCBzdGFydE9mVGhpc1llYXIgPSBzdGFydE9mSVNPV2Vlayhmb3VydGhPZkphbnVhcnlPZlRoaXNZZWFyKTsKICBpZiAoX2RhdGUuZ2V0VGltZSgpID49IHN0YXJ0T2ZOZXh0WWVhci5nZXRUaW1lKCkpIHsKICAgIHJldHVybiB5ZWFyICsgMTsKICB9IGVsc2UgaWYgKF9kYXRlLmdldFRpbWUoKSA+PSBzdGFydE9mVGhpc1llYXIuZ2V0VGltZSgpKSB7CiAgICByZXR1cm4geWVhcjsKICB9IGVsc2UgewogICAgcmV0dXJuIHllYXIgLSAxOwogIH0KfQpfX25hbWUoZ2V0SVNPV2Vla1llYXIsICJnZXRJU09XZWVrWWVhciIpOwp2YXIgZ2V0SVNPV2Vla1llYXJfZGVmYXVsdCA9IGdldElTT1dlZWtZZWFyOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9fbGliL2dldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMuanMKZnVuY3Rpb24gZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyhkYXRlKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSk7CiAgY29uc3QgdXRjRGF0ZSA9IG5ldyBEYXRlKAogICAgRGF0ZS5VVEMoCiAgICAgIF9kYXRlLmdldEZ1bGxZZWFyKCksCiAgICAgIF9kYXRlLmdldE1vbnRoKCksCiAgICAgIF9kYXRlLmdldERhdGUoKSwKICAgICAgX2RhdGUuZ2V0SG91cnMoKSwKICAgICAgX2RhdGUuZ2V0TWludXRlcygpLAogICAgICBfZGF0ZS5nZXRTZWNvbmRzKCksCiAgICAgIF9kYXRlLmdldE1pbGxpc2Vjb25kcygpCiAgICApCiAgKTsKICB1dGNEYXRlLnNldFVUQ0Z1bGxZZWFyKF9kYXRlLmdldEZ1bGxZZWFyKCkpOwogIHJldHVybiArZGF0ZSAtICt1dGNEYXRlOwp9Cl9fbmFtZShnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzLCAiZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9fbGliL25vcm1hbGl6ZURhdGVzLmpzCmZ1bmN0aW9uIG5vcm1hbGl6ZURhdGVzKGNvbnRleHQyLCAuLi5kYXRlcykgewogIGNvbnN0IG5vcm1hbGl6ZTQgPSBjb25zdHJ1Y3RGcm9tLmJpbmQoCiAgICBudWxsLAogICAgY29udGV4dDIgfHwgZGF0ZXMuZmluZCgoZGF0ZSkgPT4gdHlwZW9mIGRhdGUgPT09ICJvYmplY3QiKQogICk7CiAgcmV0dXJuIGRhdGVzLm1hcChub3JtYWxpemU0KTsKfQpfX25hbWUobm9ybWFsaXplRGF0ZXMsICJub3JtYWxpemVEYXRlcyIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mRGF5LmpzCmZ1bmN0aW9uIHN0YXJ0T2ZEYXkoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBfZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICByZXR1cm4gX2RhdGU7Cn0KX19uYW1lKHN0YXJ0T2ZEYXksICJzdGFydE9mRGF5Iik7CnZhciBzdGFydE9mRGF5X2RlZmF1bHQgPSBzdGFydE9mRGF5OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5DYWxlbmRhckRheXMuanMKZnVuY3Rpb24gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBbbGF0ZXJEYXRlXywgZWFybGllckRhdGVfXSA9IG5vcm1hbGl6ZURhdGVzKAogICAgb3B0aW9ucz8uaW4sCiAgICBsYXRlckRhdGUsCiAgICBlYXJsaWVyRGF0ZQogICk7CiAgY29uc3QgbGF0ZXJTdGFydE9mRGF5ID0gc3RhcnRPZkRheShsYXRlckRhdGVfKTsKICBjb25zdCBlYXJsaWVyU3RhcnRPZkRheSA9IHN0YXJ0T2ZEYXkoZWFybGllckRhdGVfKTsKICBjb25zdCBsYXRlclRpbWVzdGFtcCA9ICtsYXRlclN0YXJ0T2ZEYXkgLSBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKGxhdGVyU3RhcnRPZkRheSk7CiAgY29uc3QgZWFybGllclRpbWVzdGFtcCA9ICtlYXJsaWVyU3RhcnRPZkRheSAtIGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMoZWFybGllclN0YXJ0T2ZEYXkpOwogIHJldHVybiBNYXRoLnJvdW5kKChsYXRlclRpbWVzdGFtcCAtIGVhcmxpZXJUaW1lc3RhbXApIC8gbWlsbGlzZWNvbmRzSW5EYXkpOwp9Cl9fbmFtZShkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMsICJkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMiKTsKdmFyIGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5c19kZWZhdWx0ID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mSVNPV2Vla1llYXIuanMKZnVuY3Rpb24gc3RhcnRPZklTT1dlZWtZZWFyKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCB5ZWFyID0gZ2V0SVNPV2Vla1llYXIoZGF0ZSwgb3B0aW9ucyk7CiAgY29uc3QgZm91cnRoT2ZKYW51YXJ5ID0gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCAwKTsKICBmb3VydGhPZkphbnVhcnkuc2V0RnVsbFllYXIoeWVhciwgMCwgNCk7CiAgZm91cnRoT2ZKYW51YXJ5LnNldEhvdXJzKDAsIDAsIDAsIDApOwogIHJldHVybiBzdGFydE9mSVNPV2Vlayhmb3VydGhPZkphbnVhcnkpOwp9Cl9fbmFtZShzdGFydE9mSVNPV2Vla1llYXIsICJzdGFydE9mSVNPV2Vla1llYXIiKTsKdmFyIHN0YXJ0T2ZJU09XZWVrWWVhcl9kZWZhdWx0ID0gc3RhcnRPZklTT1dlZWtZZWFyOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRJU09XZWVrWWVhci5qcwpmdW5jdGlvbiBzZXRJU09XZWVrWWVhcihkYXRlLCB3ZWVrWWVhciwgb3B0aW9ucykgewogIGxldCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgZGlmZiA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cygKICAgIF9kYXRlLAogICAgc3RhcnRPZklTT1dlZWtZZWFyKF9kYXRlLCBvcHRpb25zKQogICk7CiAgY29uc3QgZm91cnRoT2ZKYW51YXJ5ID0gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCAwKTsKICBmb3VydGhPZkphbnVhcnkuc2V0RnVsbFllYXIod2Vla1llYXIsIDAsIDQpOwogIGZvdXJ0aE9mSmFudWFyeS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICBfZGF0ZSA9IHN0YXJ0T2ZJU09XZWVrWWVhcihmb3VydGhPZkphbnVhcnkpOwogIF9kYXRlLnNldERhdGUoX2RhdGUuZ2V0RGF0ZSgpICsgZGlmZik7CiAgcmV0dXJuIF9kYXRlOwp9Cl9fbmFtZShzZXRJU09XZWVrWWVhciwgInNldElTT1dlZWtZZWFyIik7CnZhciBzZXRJU09XZWVrWWVhcl9kZWZhdWx0ID0gc2V0SVNPV2Vla1llYXI7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZElTT1dlZWtZZWFycy5qcwpmdW5jdGlvbiBhZGRJU09XZWVrWWVhcnMoZGF0ZSwgYW1vdW50LCBvcHRpb25zKSB7CiAgcmV0dXJuIHNldElTT1dlZWtZZWFyKGRhdGUsIGdldElTT1dlZWtZZWFyKGRhdGUsIG9wdGlvbnMpICsgYW1vdW50LCBvcHRpb25zKTsKfQpfX25hbWUoYWRkSVNPV2Vla1llYXJzLCAiYWRkSVNPV2Vla1llYXJzIik7CnZhciBhZGRJU09XZWVrWWVhcnNfZGVmYXVsdCA9IGFkZElTT1dlZWtZZWFyczsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkTWludXRlcy5qcwpmdW5jdGlvbiBhZGRNaW51dGVzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBfZGF0ZS5zZXRUaW1lKF9kYXRlLmdldFRpbWUoKSArIGFtb3VudCAqIG1pbGxpc2Vjb25kc0luTWludXRlKTsKICByZXR1cm4gX2RhdGU7Cn0KX19uYW1lKGFkZE1pbnV0ZXMsICJhZGRNaW51dGVzIik7CnZhciBhZGRNaW51dGVzX2RlZmF1bHQgPSBhZGRNaW51dGVzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGRRdWFydGVycy5qcwpmdW5jdGlvbiBhZGRRdWFydGVycyhkYXRlLCBhbW91bnQsIG9wdGlvbnMpIHsKICByZXR1cm4gYWRkTW9udGhzKGRhdGUsIGFtb3VudCAqIDMsIG9wdGlvbnMpOwp9Cl9fbmFtZShhZGRRdWFydGVycywgImFkZFF1YXJ0ZXJzIik7CnZhciBhZGRRdWFydGVyc19kZWZhdWx0ID0gYWRkUXVhcnRlcnM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZFNlY29uZHMuanMKZnVuY3Rpb24gYWRkU2Vjb25kcyhkYXRlLCBhbW91bnQsIG9wdGlvbnMpIHsKICByZXR1cm4gYWRkTWlsbGlzZWNvbmRzKGRhdGUsIGFtb3VudCAqIDFlMywgb3B0aW9ucyk7Cn0KX19uYW1lKGFkZFNlY29uZHMsICJhZGRTZWNvbmRzIik7CnZhciBhZGRTZWNvbmRzX2RlZmF1bHQgPSBhZGRTZWNvbmRzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGRXZWVrcy5qcwpmdW5jdGlvbiBhZGRXZWVrcyhkYXRlLCBhbW91bnQsIG9wdGlvbnMpIHsKICByZXR1cm4gYWRkRGF5cyhkYXRlLCBhbW91bnQgKiA3LCBvcHRpb25zKTsKfQpfX25hbWUoYWRkV2Vla3MsICJhZGRXZWVrcyIpOwp2YXIgYWRkV2Vla3NfZGVmYXVsdCA9IGFkZFdlZWtzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGRZZWFycy5qcwpmdW5jdGlvbiBhZGRZZWFycyhkYXRlLCBhbW91bnQsIG9wdGlvbnMpIHsKICByZXR1cm4gYWRkTW9udGhzKGRhdGUsIGFtb3VudCAqIDEyLCBvcHRpb25zKTsKfQpfX25hbWUoYWRkWWVhcnMsICJhZGRZZWFycyIpOwp2YXIgYWRkWWVhcnNfZGVmYXVsdCA9IGFkZFllYXJzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hcmVJbnRlcnZhbHNPdmVybGFwcGluZy5qcwpmdW5jdGlvbiBhcmVJbnRlcnZhbHNPdmVybGFwcGluZyhpbnRlcnZhbExlZnQsIGludGVydmFsUmlnaHQsIG9wdGlvbnMpIHsKICBjb25zdCBbbGVmdFN0YXJ0VGltZSwgbGVmdEVuZFRpbWVdID0gWwogICAgK3RvRGF0ZShpbnRlcnZhbExlZnQuc3RhcnQsIG9wdGlvbnM/LmluKSwKICAgICt0b0RhdGUoaW50ZXJ2YWxMZWZ0LmVuZCwgb3B0aW9ucz8uaW4pCiAgXS5zb3J0KChhNCwgYjQpID0+IGE0IC0gYjQpOwogIGNvbnN0IFtyaWdodFN0YXJ0VGltZSwgcmlnaHRFbmRUaW1lXSA9IFsKICAgICt0b0RhdGUoaW50ZXJ2YWxSaWdodC5zdGFydCwgb3B0aW9ucz8uaW4pLAogICAgK3RvRGF0ZShpbnRlcnZhbFJpZ2h0LmVuZCwgb3B0aW9ucz8uaW4pCiAgXS5zb3J0KChhNCwgYjQpID0+IGE0IC0gYjQpOwogIGlmIChvcHRpb25zPy5pbmNsdXNpdmUpCiAgICByZXR1cm4gbGVmdFN0YXJ0VGltZSA8PSByaWdodEVuZFRpbWUgJiYgcmlnaHRTdGFydFRpbWUgPD0gbGVmdEVuZFRpbWU7CiAgcmV0dXJuIGxlZnRTdGFydFRpbWUgPCByaWdodEVuZFRpbWUgJiYgcmlnaHRTdGFydFRpbWUgPCBsZWZ0RW5kVGltZTsKfQpfX25hbWUoYXJlSW50ZXJ2YWxzT3ZlcmxhcHBpbmcsICJhcmVJbnRlcnZhbHNPdmVybGFwcGluZyIpOwp2YXIgYXJlSW50ZXJ2YWxzT3ZlcmxhcHBpbmdfZGVmYXVsdCA9IGFyZUludGVydmFsc092ZXJsYXBwaW5nOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9tYXguanMKZnVuY3Rpb24gbWF4MihkYXRlcywgb3B0aW9ucykgewogIGxldCByZXN1bHQ7CiAgbGV0IGNvbnRleHQyID0gb3B0aW9ucz8uaW47CiAgZGF0ZXMuZm9yRWFjaCgoZGF0ZSkgPT4gewogICAgaWYgKCFjb250ZXh0MiAmJiB0eXBlb2YgZGF0ZSA9PT0gIm9iamVjdCIpCiAgICAgIGNvbnRleHQyID0gY29uc3RydWN0RnJvbS5iaW5kKG51bGwsIGRhdGUpOwogICAgY29uc3QgZGF0ZV8gPSB0b0RhdGUoZGF0ZSwgY29udGV4dDIpOwogICAgaWYgKCFyZXN1bHQgfHwgcmVzdWx0IDwgZGF0ZV8gfHwgaXNOYU4oK2RhdGVfKSkgcmVzdWx0ID0gZGF0ZV87CiAgfSk7CiAgcmV0dXJuIGNvbnN0cnVjdEZyb20oY29udGV4dDIsIHJlc3VsdCB8fCBOYU4pOwp9Cl9fbmFtZShtYXgyLCAibWF4Iik7CnZhciBtYXhfZGVmYXVsdCA9IG1heDI7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL21pbi5qcwpmdW5jdGlvbiBtaW4yKGRhdGVzLCBvcHRpb25zKSB7CiAgbGV0IHJlc3VsdDsKICBsZXQgY29udGV4dDIgPSBvcHRpb25zPy5pbjsKICBkYXRlcy5mb3JFYWNoKChkYXRlKSA9PiB7CiAgICBpZiAoIWNvbnRleHQyICYmIHR5cGVvZiBkYXRlID09PSAib2JqZWN0IikKICAgICAgY29udGV4dDIgPSBjb25zdHJ1Y3RGcm9tLmJpbmQobnVsbCwgZGF0ZSk7CiAgICBjb25zdCBkYXRlXyA9IHRvRGF0ZShkYXRlLCBjb250ZXh0Mik7CiAgICBpZiAoIXJlc3VsdCB8fCByZXN1bHQgPiBkYXRlXyB8fCBpc05hTigrZGF0ZV8pKSByZXN1bHQgPSBkYXRlXzsKICB9KTsKICByZXR1cm4gY29uc3RydWN0RnJvbShjb250ZXh0MiwgcmVzdWx0IHx8IE5hTik7Cn0KX19uYW1lKG1pbjIsICJtaW4iKTsKdmFyIG1pbl9kZWZhdWx0ID0gbWluMjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvY2xhbXAuanMKZnVuY3Rpb24gY2xhbXAoZGF0ZSwgaW50ZXJ2YWwzLCBvcHRpb25zKSB7CiAgY29uc3QgW2RhdGVfLCBzdGFydCwgZW5kXSA9IG5vcm1hbGl6ZURhdGVzKAogICAgb3B0aW9ucz8uaW4sCiAgICBkYXRlLAogICAgaW50ZXJ2YWwzLnN0YXJ0LAogICAgaW50ZXJ2YWwzLmVuZAogICk7CiAgcmV0dXJuIG1pbjIoW21heDIoW2RhdGVfLCBzdGFydF0sIG9wdGlvbnMpLCBlbmRdLCBvcHRpb25zKTsKfQpfX25hbWUoY2xhbXAsICJjbGFtcCIpOwp2YXIgY2xhbXBfZGVmYXVsdCA9IGNsYW1wOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9jbG9zZXN0SW5kZXhUby5qcwpmdW5jdGlvbiBjbG9zZXN0SW5kZXhUbyhkYXRlVG9Db21wYXJlLCBkYXRlcykgewogIGNvbnN0IHRpbWVUb0NvbXBhcmUgPSArdG9EYXRlKGRhdGVUb0NvbXBhcmUpOwogIGlmIChpc05hTih0aW1lVG9Db21wYXJlKSkgcmV0dXJuIE5hTjsKICBsZXQgcmVzdWx0OwogIGxldCBtaW5EaXN0YW5jZTsKICBkYXRlcy5mb3JFYWNoKChkYXRlLCBpbmRleDIpID0+IHsKICAgIGNvbnN0IGRhdGVfID0gdG9EYXRlKGRhdGUpOwogICAgaWYgKGlzTmFOKCtkYXRlXykpIHsKICAgICAgcmVzdWx0ID0gTmFOOwogICAgICBtaW5EaXN0YW5jZSA9IE5hTjsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLmFicyh0aW1lVG9Db21wYXJlIC0gK2RhdGVfKTsKICAgIGlmIChyZXN1bHQgPT0gbnVsbCB8fCBkaXN0YW5jZSA8IG1pbkRpc3RhbmNlKSB7CiAgICAgIHJlc3VsdCA9IGluZGV4MjsKICAgICAgbWluRGlzdGFuY2UgPSBkaXN0YW5jZTsKICAgIH0KICB9KTsKICByZXR1cm4gcmVzdWx0Owp9Cl9fbmFtZShjbG9zZXN0SW5kZXhUbywgImNsb3Nlc3RJbmRleFRvIik7CnZhciBjbG9zZXN0SW5kZXhUb19kZWZhdWx0ID0gY2xvc2VzdEluZGV4VG87CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2Nsb3Nlc3RUby5qcwpmdW5jdGlvbiBjbG9zZXN0VG8oZGF0ZVRvQ29tcGFyZSwgZGF0ZXMsIG9wdGlvbnMpIHsKICBjb25zdCBbZGF0ZVRvQ29tcGFyZV8sIC4uLmRhdGVzX10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgZGF0ZVRvQ29tcGFyZSwKICAgIC4uLmRhdGVzCiAgKTsKICBjb25zdCBpbmRleDIgPSBjbG9zZXN0SW5kZXhUbyhkYXRlVG9Db21wYXJlXywgZGF0ZXNfKTsKICBpZiAodHlwZW9mIGluZGV4MiA9PT0gIm51bWJlciIgJiYgaXNOYU4oaW5kZXgyKSkKICAgIHJldHVybiBjb25zdHJ1Y3RGcm9tKGRhdGVUb0NvbXBhcmVfLCBOYU4pOwogIGlmIChpbmRleDIgIT09IHZvaWQgMCkgcmV0dXJuIGRhdGVzX1tpbmRleDJdOwp9Cl9fbmFtZShjbG9zZXN0VG8sICJjbG9zZXN0VG8iKTsKdmFyIGNsb3Nlc3RUb19kZWZhdWx0ID0gY2xvc2VzdFRvOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9jb21wYXJlQXNjLmpzCmZ1bmN0aW9uIGNvbXBhcmVBc2MoZGF0ZUxlZnQsIGRhdGVSaWdodCkgewogIGNvbnN0IGRpZmYgPSArdG9EYXRlKGRhdGVMZWZ0KSAtICt0b0RhdGUoZGF0ZVJpZ2h0KTsKICBpZiAoZGlmZiA8IDApIHJldHVybiAtMTsKICBlbHNlIGlmIChkaWZmID4gMCkgcmV0dXJuIDE7CiAgcmV0dXJuIGRpZmY7Cn0KX19uYW1lKGNvbXBhcmVBc2MsICJjb21wYXJlQXNjIik7CnZhciBjb21wYXJlQXNjX2RlZmF1bHQgPSBjb21wYXJlQXNjOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9jb21wYXJlRGVzYy5qcwpmdW5jdGlvbiBjb21wYXJlRGVzYyhkYXRlTGVmdCwgZGF0ZVJpZ2h0KSB7CiAgY29uc3QgZGlmZiA9ICt0b0RhdGUoZGF0ZUxlZnQpIC0gK3RvRGF0ZShkYXRlUmlnaHQpOwogIGlmIChkaWZmID4gMCkgcmV0dXJuIC0xOwogIGVsc2UgaWYgKGRpZmYgPCAwKSByZXR1cm4gMTsKICByZXR1cm4gZGlmZjsKfQpfX25hbWUoY29tcGFyZURlc2MsICJjb21wYXJlRGVzYyIpOwp2YXIgY29tcGFyZURlc2NfZGVmYXVsdCA9IGNvbXBhcmVEZXNjOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9jb25zdHJ1Y3ROb3cuanMKZnVuY3Rpb24gY29uc3RydWN0Tm93KGRhdGUpIHsKICByZXR1cm4gY29uc3RydWN0RnJvbShkYXRlLCBEYXRlLm5vdygpKTsKfQpfX25hbWUoY29uc3RydWN0Tm93LCAiY29uc3RydWN0Tm93Iik7CnZhciBjb25zdHJ1Y3ROb3dfZGVmYXVsdCA9IGNvbnN0cnVjdE5vdzsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGF5c1RvV2Vla3MuanMKZnVuY3Rpb24gZGF5c1RvV2Vla3MoZGF5czIpIHsKICBjb25zdCByZXN1bHQgPSBNYXRoLnRydW5jKGRheXMyIC8gZGF5c0luV2Vlayk7CiAgcmV0dXJuIHJlc3VsdCA9PT0gMCA/IDAgOiByZXN1bHQ7Cn0KX19uYW1lKGRheXNUb1dlZWtzLCAiZGF5c1RvV2Vla3MiKTsKdmFyIGRheXNUb1dlZWtzX2RlZmF1bHQgPSBkYXlzVG9XZWVrczsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNTYW1lRGF5LmpzCmZ1bmN0aW9uIGlzU2FtZURheShsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgW2RhdGVMZWZ0XywgZGF0ZVJpZ2h0X10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgbGF0ZXJEYXRlLAogICAgZWFybGllckRhdGUKICApOwogIHJldHVybiArc3RhcnRPZkRheShkYXRlTGVmdF8pID09PSArc3RhcnRPZkRheShkYXRlUmlnaHRfKTsKfQpfX25hbWUoaXNTYW1lRGF5LCAiaXNTYW1lRGF5Iik7CnZhciBpc1NhbWVEYXlfZGVmYXVsdCA9IGlzU2FtZURheTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNEYXRlLmpzCmZ1bmN0aW9uIGlzRGF0ZSh2YWx1ZTIpIHsKICByZXR1cm4gdmFsdWUyIGluc3RhbmNlb2YgRGF0ZSB8fCB0eXBlb2YgdmFsdWUyID09PSAib2JqZWN0IiAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUyKSA9PT0gIltvYmplY3QgRGF0ZV0iOwp9Cl9fbmFtZShpc0RhdGUsICJpc0RhdGUiKTsKdmFyIGlzRGF0ZV9kZWZhdWx0ID0gaXNEYXRlOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1ZhbGlkLmpzCmZ1bmN0aW9uIGlzVmFsaWQoZGF0ZSkgewogIHJldHVybiAhKCFpc0RhdGUoZGF0ZSkgJiYgdHlwZW9mIGRhdGUgIT09ICJudW1iZXIiIHx8IGlzTmFOKCt0b0RhdGUoZGF0ZSkpKTsKfQpfX25hbWUoaXNWYWxpZCwgImlzVmFsaWQiKTsKdmFyIGlzVmFsaWRfZGVmYXVsdCA9IGlzVmFsaWQ7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2RpZmZlcmVuY2VJbkJ1c2luZXNzRGF5cy5qcwpmdW5jdGlvbiBkaWZmZXJlbmNlSW5CdXNpbmVzc0RheXMobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IFtsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV9dID0gbm9ybWFsaXplRGF0ZXMoCiAgICBvcHRpb25zPy5pbiwKICAgIGxhdGVyRGF0ZSwKICAgIGVhcmxpZXJEYXRlCiAgKTsKICBpZiAoIWlzVmFsaWQobGF0ZXJEYXRlXykgfHwgIWlzVmFsaWQoZWFybGllckRhdGVfKSkgcmV0dXJuIE5hTjsKICBjb25zdCBkaWZmID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGxhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlXyk7CiAgY29uc3Qgc2lnbiA9IGRpZmYgPCAwID8gLTEgOiAxOwogIGNvbnN0IHdlZWtzID0gTWF0aC50cnVuYyhkaWZmIC8gNyk7CiAgbGV0IHJlc3VsdCA9IHdlZWtzICogNTsKICBsZXQgbW92aW5nRGF0ZSA9IGFkZERheXMoZWFybGllckRhdGVfLCB3ZWVrcyAqIDcpOwogIHdoaWxlICghaXNTYW1lRGF5KGxhdGVyRGF0ZV8sIG1vdmluZ0RhdGUpKSB7CiAgICByZXN1bHQgKz0gaXNXZWVrZW5kKG1vdmluZ0RhdGUsIG9wdGlvbnMpID8gMCA6IHNpZ247CiAgICBtb3ZpbmdEYXRlID0gYWRkRGF5cyhtb3ZpbmdEYXRlLCBzaWduKTsKICB9CiAgcmV0dXJuIHJlc3VsdCA9PT0gMCA/IDAgOiByZXN1bHQ7Cn0KX19uYW1lKGRpZmZlcmVuY2VJbkJ1c2luZXNzRGF5cywgImRpZmZlcmVuY2VJbkJ1c2luZXNzRGF5cyIpOwp2YXIgZGlmZmVyZW5jZUluQnVzaW5lc3NEYXlzX2RlZmF1bHQgPSBkaWZmZXJlbmNlSW5CdXNpbmVzc0RheXM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2RpZmZlcmVuY2VJbkNhbGVuZGFySVNPV2Vla1llYXJzLmpzCmZ1bmN0aW9uIGRpZmZlcmVuY2VJbkNhbGVuZGFySVNPV2Vla1llYXJzKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBbbGF0ZXJEYXRlXywgZWFybGllckRhdGVfXSA9IG5vcm1hbGl6ZURhdGVzKAogICAgb3B0aW9ucz8uaW4sCiAgICBsYXRlckRhdGUsCiAgICBlYXJsaWVyRGF0ZQogICk7CiAgcmV0dXJuIGdldElTT1dlZWtZZWFyKGxhdGVyRGF0ZV8sIG9wdGlvbnMpIC0gZ2V0SVNPV2Vla1llYXIoZWFybGllckRhdGVfLCBvcHRpb25zKTsKfQpfX25hbWUoZGlmZmVyZW5jZUluQ2FsZW5kYXJJU09XZWVrWWVhcnMsICJkaWZmZXJlbmNlSW5DYWxlbmRhcklTT1dlZWtZZWFycyIpOwp2YXIgZGlmZmVyZW5jZUluQ2FsZW5kYXJJU09XZWVrWWVhcnNfZGVmYXVsdCA9IGRpZmZlcmVuY2VJbkNhbGVuZGFySVNPV2Vla1llYXJzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5DYWxlbmRhcklTT1dlZWtzLmpzCmZ1bmN0aW9uIGRpZmZlcmVuY2VJbkNhbGVuZGFySVNPV2Vla3MobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IFtsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV9dID0gbm9ybWFsaXplRGF0ZXMoCiAgICBvcHRpb25zPy5pbiwKICAgIGxhdGVyRGF0ZSwKICAgIGVhcmxpZXJEYXRlCiAgKTsKICBjb25zdCBzdGFydE9mSVNPV2Vla0xlZnQgPSBzdGFydE9mSVNPV2VlayhsYXRlckRhdGVfKTsKICBjb25zdCBzdGFydE9mSVNPV2Vla1JpZ2h0ID0gc3RhcnRPZklTT1dlZWsoZWFybGllckRhdGVfKTsKICBjb25zdCB0aW1lc3RhbXBMZWZ0ID0gK3N0YXJ0T2ZJU09XZWVrTGVmdCAtIGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMoc3RhcnRPZklTT1dlZWtMZWZ0KTsKICBjb25zdCB0aW1lc3RhbXBSaWdodCA9ICtzdGFydE9mSVNPV2Vla1JpZ2h0IC0gZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyhzdGFydE9mSVNPV2Vla1JpZ2h0KTsKICByZXR1cm4gTWF0aC5yb3VuZCgodGltZXN0YW1wTGVmdCAtIHRpbWVzdGFtcFJpZ2h0KSAvIG1pbGxpc2Vjb25kc0luV2Vlayk7Cn0KX19uYW1lKGRpZmZlcmVuY2VJbkNhbGVuZGFySVNPV2Vla3MsICJkaWZmZXJlbmNlSW5DYWxlbmRhcklTT1dlZWtzIik7CnZhciBkaWZmZXJlbmNlSW5DYWxlbmRhcklTT1dlZWtzX2RlZmF1bHQgPSBkaWZmZXJlbmNlSW5DYWxlbmRhcklTT1dlZWtzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocy5qcwpmdW5jdGlvbiBkaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgW2xhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgbGF0ZXJEYXRlLAogICAgZWFybGllckRhdGUKICApOwogIGNvbnN0IHllYXJzRGlmZiA9IGxhdGVyRGF0ZV8uZ2V0RnVsbFllYXIoKSAtIGVhcmxpZXJEYXRlXy5nZXRGdWxsWWVhcigpOwogIGNvbnN0IG1vbnRoc0RpZmYgPSBsYXRlckRhdGVfLmdldE1vbnRoKCkgLSBlYXJsaWVyRGF0ZV8uZ2V0TW9udGgoKTsKICByZXR1cm4geWVhcnNEaWZmICogMTIgKyBtb250aHNEaWZmOwp9Cl9fbmFtZShkaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocywgImRpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzIik7CnZhciBkaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRoc19kZWZhdWx0ID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldFF1YXJ0ZXIuanMKZnVuY3Rpb24gZ2V0UXVhcnRlcihkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGNvbnN0IHF1YXJ0ZXIgPSBNYXRoLnRydW5jKF9kYXRlLmdldE1vbnRoKCkgLyAzKSArIDE7CiAgcmV0dXJuIHF1YXJ0ZXI7Cn0KX19uYW1lKGdldFF1YXJ0ZXIsICJnZXRRdWFydGVyIik7CnZhciBnZXRRdWFydGVyX2RlZmF1bHQgPSBnZXRRdWFydGVyOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5DYWxlbmRhclF1YXJ0ZXJzLmpzCmZ1bmN0aW9uIGRpZmZlcmVuY2VJbkNhbGVuZGFyUXVhcnRlcnMobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IFtsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV9dID0gbm9ybWFsaXplRGF0ZXMoCiAgICBvcHRpb25zPy5pbiwKICAgIGxhdGVyRGF0ZSwKICAgIGVhcmxpZXJEYXRlCiAgKTsKICBjb25zdCB5ZWFyc0RpZmYgPSBsYXRlckRhdGVfLmdldEZ1bGxZZWFyKCkgLSBlYXJsaWVyRGF0ZV8uZ2V0RnVsbFllYXIoKTsKICBjb25zdCBxdWFydGVyc0RpZmYgPSBnZXRRdWFydGVyKGxhdGVyRGF0ZV8pIC0gZ2V0UXVhcnRlcihlYXJsaWVyRGF0ZV8pOwogIHJldHVybiB5ZWFyc0RpZmYgKiA0ICsgcXVhcnRlcnNEaWZmOwp9Cl9fbmFtZShkaWZmZXJlbmNlSW5DYWxlbmRhclF1YXJ0ZXJzLCAiZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVycyIpOwp2YXIgZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVyc19kZWZhdWx0ID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVyczsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluQ2FsZW5kYXJXZWVrcy5qcwpmdW5jdGlvbiBkaWZmZXJlbmNlSW5DYWxlbmRhcldlZWtzKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBbbGF0ZXJEYXRlXywgZWFybGllckRhdGVfXSA9IG5vcm1hbGl6ZURhdGVzKAogICAgb3B0aW9ucz8uaW4sCiAgICBsYXRlckRhdGUsCiAgICBlYXJsaWVyRGF0ZQogICk7CiAgY29uc3QgbGF0ZXJTdGFydE9mV2VlayA9IHN0YXJ0T2ZXZWVrKGxhdGVyRGF0ZV8sIG9wdGlvbnMpOwogIGNvbnN0IGVhcmxpZXJTdGFydE9mV2VlayA9IHN0YXJ0T2ZXZWVrKGVhcmxpZXJEYXRlXywgb3B0aW9ucyk7CiAgY29uc3QgbGF0ZXJUaW1lc3RhbXAgPSArbGF0ZXJTdGFydE9mV2VlayAtIGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMobGF0ZXJTdGFydE9mV2Vlayk7CiAgY29uc3QgZWFybGllclRpbWVzdGFtcCA9ICtlYXJsaWVyU3RhcnRPZldlZWsgLSBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKGVhcmxpZXJTdGFydE9mV2Vlayk7CiAgcmV0dXJuIE1hdGgucm91bmQoKGxhdGVyVGltZXN0YW1wIC0gZWFybGllclRpbWVzdGFtcCkgLyBtaWxsaXNlY29uZHNJbldlZWspOwp9Cl9fbmFtZShkaWZmZXJlbmNlSW5DYWxlbmRhcldlZWtzLCAiZGlmZmVyZW5jZUluQ2FsZW5kYXJXZWVrcyIpOwp2YXIgZGlmZmVyZW5jZUluQ2FsZW5kYXJXZWVrc19kZWZhdWx0ID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJXZWVrczsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFycy5qcwpmdW5jdGlvbiBkaWZmZXJlbmNlSW5DYWxlbmRhclllYXJzKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBbbGF0ZXJEYXRlXywgZWFybGllckRhdGVfXSA9IG5vcm1hbGl6ZURhdGVzKAogICAgb3B0aW9ucz8uaW4sCiAgICBsYXRlckRhdGUsCiAgICBlYXJsaWVyRGF0ZQogICk7CiAgcmV0dXJuIGxhdGVyRGF0ZV8uZ2V0RnVsbFllYXIoKSAtIGVhcmxpZXJEYXRlXy5nZXRGdWxsWWVhcigpOwp9Cl9fbmFtZShkaWZmZXJlbmNlSW5DYWxlbmRhclllYXJzLCAiZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFycyIpOwp2YXIgZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFyc19kZWZhdWx0ID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFyczsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluRGF5cy5qcwpmdW5jdGlvbiBkaWZmZXJlbmNlSW5EYXlzKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBbbGF0ZXJEYXRlXywgZWFybGllckRhdGVfXSA9IG5vcm1hbGl6ZURhdGVzKAogICAgb3B0aW9ucz8uaW4sCiAgICBsYXRlckRhdGUsCiAgICBlYXJsaWVyRGF0ZQogICk7CiAgY29uc3Qgc2lnbiA9IGNvbXBhcmVMb2NhbEFzYyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pOwogIGNvbnN0IGRpZmZlcmVuY2UgPSBNYXRoLmFicygKICAgIGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pCiAgKTsKICBsYXRlckRhdGVfLnNldERhdGUobGF0ZXJEYXRlXy5nZXREYXRlKCkgLSBzaWduICogZGlmZmVyZW5jZSk7CiAgY29uc3QgaXNMYXN0RGF5Tm90RnVsbCA9IE51bWJlcigKICAgIGNvbXBhcmVMb2NhbEFzYyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pID09PSAtc2lnbgogICk7CiAgY29uc3QgcmVzdWx0ID0gc2lnbiAqIChkaWZmZXJlbmNlIC0gaXNMYXN0RGF5Tm90RnVsbCk7CiAgcmV0dXJuIHJlc3VsdCA9PT0gMCA/IDAgOiByZXN1bHQ7Cn0KX19uYW1lKGRpZmZlcmVuY2VJbkRheXMsICJkaWZmZXJlbmNlSW5EYXlzIik7CmZ1bmN0aW9uIGNvbXBhcmVMb2NhbEFzYyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlKSB7CiAgY29uc3QgZGlmZiA9IGxhdGVyRGF0ZS5nZXRGdWxsWWVhcigpIC0gZWFybGllckRhdGUuZ2V0RnVsbFllYXIoKSB8fCBsYXRlckRhdGUuZ2V0TW9udGgoKSAtIGVhcmxpZXJEYXRlLmdldE1vbnRoKCkgfHwgbGF0ZXJEYXRlLmdldERhdGUoKSAtIGVhcmxpZXJEYXRlLmdldERhdGUoKSB8fCBsYXRlckRhdGUuZ2V0SG91cnMoKSAtIGVhcmxpZXJEYXRlLmdldEhvdXJzKCkgfHwgbGF0ZXJEYXRlLmdldE1pbnV0ZXMoKSAtIGVhcmxpZXJEYXRlLmdldE1pbnV0ZXMoKSB8fCBsYXRlckRhdGUuZ2V0U2Vjb25kcygpIC0gZWFybGllckRhdGUuZ2V0U2Vjb25kcygpIHx8IGxhdGVyRGF0ZS5nZXRNaWxsaXNlY29uZHMoKSAtIGVhcmxpZXJEYXRlLmdldE1pbGxpc2Vjb25kcygpOwogIGlmIChkaWZmIDwgMCkgcmV0dXJuIC0xOwogIGlmIChkaWZmID4gMCkgcmV0dXJuIDE7CiAgcmV0dXJuIGRpZmY7Cn0KX19uYW1lKGNvbXBhcmVMb2NhbEFzYywgImNvbXBhcmVMb2NhbEFzYyIpOwp2YXIgZGlmZmVyZW5jZUluRGF5c19kZWZhdWx0ID0gZGlmZmVyZW5jZUluRGF5czsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9nZXRSb3VuZGluZ01ldGhvZC5qcwpmdW5jdGlvbiBnZXRSb3VuZGluZ01ldGhvZChtZXRob2QpIHsKICByZXR1cm4gKG51bWJlcjIpID0+IHsKICAgIGNvbnN0IHJvdW5kID0gbWV0aG9kID8gTWF0aFttZXRob2RdIDogTWF0aC50cnVuYzsKICAgIGNvbnN0IHJlc3VsdCA9IHJvdW5kKG51bWJlcjIpOwogICAgcmV0dXJuIHJlc3VsdCA9PT0gMCA/IDAgOiByZXN1bHQ7CiAgfTsKfQpfX25hbWUoZ2V0Um91bmRpbmdNZXRob2QsICJnZXRSb3VuZGluZ01ldGhvZCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5Ib3Vycy5qcwpmdW5jdGlvbiBkaWZmZXJlbmNlSW5Ib3VycyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgW2xhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgbGF0ZXJEYXRlLAogICAgZWFybGllckRhdGUKICApOwogIGNvbnN0IGRpZmYgPSAoK2xhdGVyRGF0ZV8gLSArZWFybGllckRhdGVfKSAvIG1pbGxpc2Vjb25kc0luSG91cjsKICByZXR1cm4gZ2V0Um91bmRpbmdNZXRob2Qob3B0aW9ucz8ucm91bmRpbmdNZXRob2QpKGRpZmYpOwp9Cl9fbmFtZShkaWZmZXJlbmNlSW5Ib3VycywgImRpZmZlcmVuY2VJbkhvdXJzIik7CnZhciBkaWZmZXJlbmNlSW5Ib3Vyc19kZWZhdWx0ID0gZGlmZmVyZW5jZUluSG91cnM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N1YklTT1dlZWtZZWFycy5qcwpmdW5jdGlvbiBzdWJJU09XZWVrWWVhcnMoZGF0ZSwgYW1vdW50LCBvcHRpb25zKSB7CiAgcmV0dXJuIGFkZElTT1dlZWtZZWFycyhkYXRlLCAtYW1vdW50LCBvcHRpb25zKTsKfQpfX25hbWUoc3ViSVNPV2Vla1llYXJzLCAic3ViSVNPV2Vla1llYXJzIik7CnZhciBzdWJJU09XZWVrWWVhcnNfZGVmYXVsdCA9IHN1YklTT1dlZWtZZWFyczsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluSVNPV2Vla1llYXJzLmpzCmZ1bmN0aW9uIGRpZmZlcmVuY2VJbklTT1dlZWtZZWFycyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgW2xhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgbGF0ZXJEYXRlLAogICAgZWFybGllckRhdGUKICApOwogIGNvbnN0IHNpZ24gPSBjb21wYXJlQXNjKGxhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlXyk7CiAgY29uc3QgZGlmZiA9IE1hdGguYWJzKAogICAgZGlmZmVyZW5jZUluQ2FsZW5kYXJJU09XZWVrWWVhcnMobGF0ZXJEYXRlXywgZWFybGllckRhdGVfLCBvcHRpb25zKQogICk7CiAgY29uc3QgYWRqdXN0ZWREYXRlID0gc3ViSVNPV2Vla1llYXJzKGxhdGVyRGF0ZV8sIHNpZ24gKiBkaWZmLCBvcHRpb25zKTsKICBjb25zdCBpc0xhc3RJU09XZWVrWWVhck5vdEZ1bGwgPSBOdW1iZXIoCiAgICBjb21wYXJlQXNjKGFkanVzdGVkRGF0ZSwgZWFybGllckRhdGVfKSA9PT0gLXNpZ24KICApOwogIGNvbnN0IHJlc3VsdCA9IHNpZ24gKiAoZGlmZiAtIGlzTGFzdElTT1dlZWtZZWFyTm90RnVsbCk7CiAgcmV0dXJuIHJlc3VsdCA9PT0gMCA/IDAgOiByZXN1bHQ7Cn0KX19uYW1lKGRpZmZlcmVuY2VJbklTT1dlZWtZZWFycywgImRpZmZlcmVuY2VJbklTT1dlZWtZZWFycyIpOwp2YXIgZGlmZmVyZW5jZUluSVNPV2Vla1llYXJzX2RlZmF1bHQgPSBkaWZmZXJlbmNlSW5JU09XZWVrWWVhcnM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2RpZmZlcmVuY2VJbk1pbGxpc2Vjb25kcy5qcwpmdW5jdGlvbiBkaWZmZXJlbmNlSW5NaWxsaXNlY29uZHMobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSkgewogIHJldHVybiArdG9EYXRlKGxhdGVyRGF0ZSkgLSArdG9EYXRlKGVhcmxpZXJEYXRlKTsKfQpfX25hbWUoZGlmZmVyZW5jZUluTWlsbGlzZWNvbmRzLCAiZGlmZmVyZW5jZUluTWlsbGlzZWNvbmRzIik7CnZhciBkaWZmZXJlbmNlSW5NaWxsaXNlY29uZHNfZGVmYXVsdCA9IGRpZmZlcmVuY2VJbk1pbGxpc2Vjb25kczsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluTWludXRlcy5qcwpmdW5jdGlvbiBkaWZmZXJlbmNlSW5NaW51dGVzKGRhdGVMZWZ0LCBkYXRlUmlnaHQsIG9wdGlvbnMpIHsKICBjb25zdCBkaWZmID0gZGlmZmVyZW5jZUluTWlsbGlzZWNvbmRzKGRhdGVMZWZ0LCBkYXRlUmlnaHQpIC8gbWlsbGlzZWNvbmRzSW5NaW51dGU7CiAgcmV0dXJuIGdldFJvdW5kaW5nTWV0aG9kKG9wdGlvbnM/LnJvdW5kaW5nTWV0aG9kKShkaWZmKTsKfQpfX25hbWUoZGlmZmVyZW5jZUluTWludXRlcywgImRpZmZlcmVuY2VJbk1pbnV0ZXMiKTsKdmFyIGRpZmZlcmVuY2VJbk1pbnV0ZXNfZGVmYXVsdCA9IGRpZmZlcmVuY2VJbk1pbnV0ZXM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VuZE9mRGF5LmpzCmZ1bmN0aW9uIGVuZE9mRGF5KGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgX2RhdGUuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KTsKICByZXR1cm4gX2RhdGU7Cn0KX19uYW1lKGVuZE9mRGF5LCAiZW5kT2ZEYXkiKTsKdmFyIGVuZE9mRGF5X2RlZmF1bHQgPSBlbmRPZkRheTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZW5kT2ZNb250aC5qcwpmdW5jdGlvbiBlbmRPZk1vbnRoKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgbW9udGggPSBfZGF0ZS5nZXRNb250aCgpOwogIF9kYXRlLnNldEZ1bGxZZWFyKF9kYXRlLmdldEZ1bGxZZWFyKCksIG1vbnRoICsgMSwgMCk7CiAgX2RhdGUuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KTsKICByZXR1cm4gX2RhdGU7Cn0KX19uYW1lKGVuZE9mTW9udGgsICJlbmRPZk1vbnRoIik7CnZhciBlbmRPZk1vbnRoX2RlZmF1bHQgPSBlbmRPZk1vbnRoOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc0xhc3REYXlPZk1vbnRoLmpzCmZ1bmN0aW9uIGlzTGFzdERheU9mTW9udGgoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICByZXR1cm4gK2VuZE9mRGF5KF9kYXRlLCBvcHRpb25zKSA9PT0gK2VuZE9mTW9udGgoX2RhdGUsIG9wdGlvbnMpOwp9Cl9fbmFtZShpc0xhc3REYXlPZk1vbnRoLCAiaXNMYXN0RGF5T2ZNb250aCIpOwp2YXIgaXNMYXN0RGF5T2ZNb250aF9kZWZhdWx0ID0gaXNMYXN0RGF5T2ZNb250aDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluTW9udGhzLmpzCmZ1bmN0aW9uIGRpZmZlcmVuY2VJbk1vbnRocyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgW2xhdGVyRGF0ZV8sIHdvcmtpbmdMYXRlckRhdGUsIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgbGF0ZXJEYXRlLAogICAgbGF0ZXJEYXRlLAogICAgZWFybGllckRhdGUKICApOwogIGNvbnN0IHNpZ24gPSBjb21wYXJlQXNjKHdvcmtpbmdMYXRlckRhdGUsIGVhcmxpZXJEYXRlXyk7CiAgY29uc3QgZGlmZmVyZW5jZSA9IE1hdGguYWJzKAogICAgZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMod29ya2luZ0xhdGVyRGF0ZSwgZWFybGllckRhdGVfKQogICk7CiAgaWYgKGRpZmZlcmVuY2UgPCAxKSByZXR1cm4gMDsKICBpZiAod29ya2luZ0xhdGVyRGF0ZS5nZXRNb250aCgpID09PSAxICYmIHdvcmtpbmdMYXRlckRhdGUuZ2V0RGF0ZSgpID4gMjcpCiAgICB3b3JraW5nTGF0ZXJEYXRlLnNldERhdGUoMzApOwogIHdvcmtpbmdMYXRlckRhdGUuc2V0TW9udGgod29ya2luZ0xhdGVyRGF0ZS5nZXRNb250aCgpIC0gc2lnbiAqIGRpZmZlcmVuY2UpOwogIGxldCBpc0xhc3RNb250aE5vdEZ1bGwgPSBjb21wYXJlQXNjKHdvcmtpbmdMYXRlckRhdGUsIGVhcmxpZXJEYXRlXykgPT09IC1zaWduOwogIGlmIChpc0xhc3REYXlPZk1vbnRoKGxhdGVyRGF0ZV8pICYmIGRpZmZlcmVuY2UgPT09IDEgJiYgY29tcGFyZUFzYyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pID09PSAxKSB7CiAgICBpc0xhc3RNb250aE5vdEZ1bGwgPSBmYWxzZTsKICB9CiAgY29uc3QgcmVzdWx0ID0gc2lnbiAqIChkaWZmZXJlbmNlIC0gK2lzTGFzdE1vbnRoTm90RnVsbCk7CiAgcmV0dXJuIHJlc3VsdCA9PT0gMCA/IDAgOiByZXN1bHQ7Cn0KX19uYW1lKGRpZmZlcmVuY2VJbk1vbnRocywgImRpZmZlcmVuY2VJbk1vbnRocyIpOwp2YXIgZGlmZmVyZW5jZUluTW9udGhzX2RlZmF1bHQgPSBkaWZmZXJlbmNlSW5Nb250aHM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2RpZmZlcmVuY2VJblF1YXJ0ZXJzLmpzCmZ1bmN0aW9uIGRpZmZlcmVuY2VJblF1YXJ0ZXJzKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBkaWZmID0gZGlmZmVyZW5jZUluTW9udGhzKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIC8gMzsKICByZXR1cm4gZ2V0Um91bmRpbmdNZXRob2Qob3B0aW9ucz8ucm91bmRpbmdNZXRob2QpKGRpZmYpOwp9Cl9fbmFtZShkaWZmZXJlbmNlSW5RdWFydGVycywgImRpZmZlcmVuY2VJblF1YXJ0ZXJzIik7CnZhciBkaWZmZXJlbmNlSW5RdWFydGVyc19kZWZhdWx0ID0gZGlmZmVyZW5jZUluUXVhcnRlcnM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2RpZmZlcmVuY2VJblNlY29uZHMuanMKZnVuY3Rpb24gZGlmZmVyZW5jZUluU2Vjb25kcyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgZGlmZiA9IGRpZmZlcmVuY2VJbk1pbGxpc2Vjb25kcyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlKSAvIDFlMzsKICByZXR1cm4gZ2V0Um91bmRpbmdNZXRob2Qob3B0aW9ucz8ucm91bmRpbmdNZXRob2QpKGRpZmYpOwp9Cl9fbmFtZShkaWZmZXJlbmNlSW5TZWNvbmRzLCAiZGlmZmVyZW5jZUluU2Vjb25kcyIpOwp2YXIgZGlmZmVyZW5jZUluU2Vjb25kc19kZWZhdWx0ID0gZGlmZmVyZW5jZUluU2Vjb25kczsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluV2Vla3MuanMKZnVuY3Rpb24gZGlmZmVyZW5jZUluV2Vla3MobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IGRpZmYgPSBkaWZmZXJlbmNlSW5EYXlzKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIC8gNzsKICByZXR1cm4gZ2V0Um91bmRpbmdNZXRob2Qob3B0aW9ucz8ucm91bmRpbmdNZXRob2QpKGRpZmYpOwp9Cl9fbmFtZShkaWZmZXJlbmNlSW5XZWVrcywgImRpZmZlcmVuY2VJbldlZWtzIik7CnZhciBkaWZmZXJlbmNlSW5XZWVrc19kZWZhdWx0ID0gZGlmZmVyZW5jZUluV2Vla3M7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2RpZmZlcmVuY2VJblllYXJzLmpzCmZ1bmN0aW9uIGRpZmZlcmVuY2VJblllYXJzKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBbbGF0ZXJEYXRlXywgZWFybGllckRhdGVfXSA9IG5vcm1hbGl6ZURhdGVzKAogICAgb3B0aW9ucz8uaW4sCiAgICBsYXRlckRhdGUsCiAgICBlYXJsaWVyRGF0ZQogICk7CiAgY29uc3Qgc2lnbiA9IGNvbXBhcmVBc2MobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKTsKICBjb25zdCBkaWZmID0gTWF0aC5hYnMoZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFycyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pKTsKICBsYXRlckRhdGVfLnNldEZ1bGxZZWFyKDE1ODQpOwogIGVhcmxpZXJEYXRlXy5zZXRGdWxsWWVhcigxNTg0KTsKICBjb25zdCBwYXJ0aWFsID0gY29tcGFyZUFzYyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pID09PSAtc2lnbjsKICBjb25zdCByZXN1bHQgPSBzaWduICogKGRpZmYgLSArcGFydGlhbCk7CiAgcmV0dXJuIHJlc3VsdCA9PT0gMCA/IDAgOiByZXN1bHQ7Cn0KX19uYW1lKGRpZmZlcmVuY2VJblllYXJzLCAiZGlmZmVyZW5jZUluWWVhcnMiKTsKdmFyIGRpZmZlcmVuY2VJblllYXJzX2RlZmF1bHQgPSBkaWZmZXJlbmNlSW5ZZWFyczsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9ub3JtYWxpemVJbnRlcnZhbC5qcwpmdW5jdGlvbiBub3JtYWxpemVJbnRlcnZhbChjb250ZXh0MiwgaW50ZXJ2YWwzKSB7CiAgY29uc3QgW3N0YXJ0LCBlbmRdID0gbm9ybWFsaXplRGF0ZXMoY29udGV4dDIsIGludGVydmFsMy5zdGFydCwgaW50ZXJ2YWwzLmVuZCk7CiAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9Owp9Cl9fbmFtZShub3JtYWxpemVJbnRlcnZhbCwgIm5vcm1hbGl6ZUludGVydmFsIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VhY2hEYXlPZkludGVydmFsLmpzCmZ1bmN0aW9uIGVhY2hEYXlPZkludGVydmFsKGludGVydmFsMywgb3B0aW9ucykgewogIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gbm9ybWFsaXplSW50ZXJ2YWwob3B0aW9ucz8uaW4sIGludGVydmFsMyk7CiAgbGV0IHJldmVyc2VkID0gK3N0YXJ0ID4gK2VuZDsKICBjb25zdCBlbmRUaW1lID0gcmV2ZXJzZWQgPyArc3RhcnQgOiArZW5kOwogIGNvbnN0IGRhdGUgPSByZXZlcnNlZCA/IGVuZCA6IHN0YXJ0OwogIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgbGV0IHN0ZXAgPSBvcHRpb25zPy5zdGVwID8/IDE7CiAgaWYgKCFzdGVwKSByZXR1cm4gW107CiAgaWYgKHN0ZXAgPCAwKSB7CiAgICBzdGVwID0gLXN0ZXA7CiAgICByZXZlcnNlZCA9ICFyZXZlcnNlZDsKICB9CiAgY29uc3QgZGF0ZXMgPSBbXTsKICB3aGlsZSAoK2RhdGUgPD0gZW5kVGltZSkgewogICAgZGF0ZXMucHVzaChjb25zdHJ1Y3RGcm9tKHN0YXJ0LCBkYXRlKSk7CiAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyBzdGVwKTsKICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgfQogIHJldHVybiByZXZlcnNlZCA/IGRhdGVzLnJldmVyc2UoKSA6IGRhdGVzOwp9Cl9fbmFtZShlYWNoRGF5T2ZJbnRlcnZhbCwgImVhY2hEYXlPZkludGVydmFsIik7CnZhciBlYWNoRGF5T2ZJbnRlcnZhbF9kZWZhdWx0ID0gZWFjaERheU9mSW50ZXJ2YWw7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VhY2hIb3VyT2ZJbnRlcnZhbC5qcwpmdW5jdGlvbiBlYWNoSG91ck9mSW50ZXJ2YWwoaW50ZXJ2YWwzLCBvcHRpb25zKSB7CiAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSBub3JtYWxpemVJbnRlcnZhbChvcHRpb25zPy5pbiwgaW50ZXJ2YWwzKTsKICBsZXQgcmV2ZXJzZWQgPSArc3RhcnQgPiArZW5kOwogIGNvbnN0IGVuZFRpbWUgPSByZXZlcnNlZCA/ICtzdGFydCA6ICtlbmQ7CiAgY29uc3QgZGF0ZSA9IHJldmVyc2VkID8gZW5kIDogc3RhcnQ7CiAgZGF0ZS5zZXRNaW51dGVzKDAsIDAsIDApOwogIGxldCBzdGVwID0gb3B0aW9ucz8uc3RlcCA/PyAxOwogIGlmICghc3RlcCkgcmV0dXJuIFtdOwogIGlmIChzdGVwIDwgMCkgewogICAgc3RlcCA9IC1zdGVwOwogICAgcmV2ZXJzZWQgPSAhcmV2ZXJzZWQ7CiAgfQogIGNvbnN0IGRhdGVzID0gW107CiAgd2hpbGUgKCtkYXRlIDw9IGVuZFRpbWUpIHsKICAgIGRhdGVzLnB1c2goY29uc3RydWN0RnJvbShzdGFydCwgZGF0ZSkpOwogICAgZGF0ZS5zZXRIb3VycyhkYXRlLmdldEhvdXJzKCkgKyBzdGVwKTsKICB9CiAgcmV0dXJuIHJldmVyc2VkID8gZGF0ZXMucmV2ZXJzZSgpIDogZGF0ZXM7Cn0KX19uYW1lKGVhY2hIb3VyT2ZJbnRlcnZhbCwgImVhY2hIb3VyT2ZJbnRlcnZhbCIpOwp2YXIgZWFjaEhvdXJPZkludGVydmFsX2RlZmF1bHQgPSBlYWNoSG91ck9mSW50ZXJ2YWw7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VhY2hNaW51dGVPZkludGVydmFsLmpzCmZ1bmN0aW9uIGVhY2hNaW51dGVPZkludGVydmFsKGludGVydmFsMywgb3B0aW9ucykgewogIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gbm9ybWFsaXplSW50ZXJ2YWwob3B0aW9ucz8uaW4sIGludGVydmFsMyk7CiAgc3RhcnQuc2V0U2Vjb25kcygwLCAwKTsKICBsZXQgcmV2ZXJzZWQgPSArc3RhcnQgPiArZW5kOwogIGNvbnN0IGVuZFRpbWUgPSByZXZlcnNlZCA/ICtzdGFydCA6ICtlbmQ7CiAgbGV0IGRhdGUgPSByZXZlcnNlZCA/IGVuZCA6IHN0YXJ0OwogIGxldCBzdGVwID0gb3B0aW9ucz8uc3RlcCA/PyAxOwogIGlmICghc3RlcCkgcmV0dXJuIFtdOwogIGlmIChzdGVwIDwgMCkgewogICAgc3RlcCA9IC1zdGVwOwogICAgcmV2ZXJzZWQgPSAhcmV2ZXJzZWQ7CiAgfQogIGNvbnN0IGRhdGVzID0gW107CiAgd2hpbGUgKCtkYXRlIDw9IGVuZFRpbWUpIHsKICAgIGRhdGVzLnB1c2goY29uc3RydWN0RnJvbShzdGFydCwgZGF0ZSkpOwogICAgZGF0ZSA9IGFkZE1pbnV0ZXMoZGF0ZSwgc3RlcCk7CiAgfQogIHJldHVybiByZXZlcnNlZCA/IGRhdGVzLnJldmVyc2UoKSA6IGRhdGVzOwp9Cl9fbmFtZShlYWNoTWludXRlT2ZJbnRlcnZhbCwgImVhY2hNaW51dGVPZkludGVydmFsIik7CnZhciBlYWNoTWludXRlT2ZJbnRlcnZhbF9kZWZhdWx0ID0gZWFjaE1pbnV0ZU9mSW50ZXJ2YWw7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VhY2hNb250aE9mSW50ZXJ2YWwuanMKZnVuY3Rpb24gZWFjaE1vbnRoT2ZJbnRlcnZhbChpbnRlcnZhbDMsIG9wdGlvbnMpIHsKICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IG5vcm1hbGl6ZUludGVydmFsKG9wdGlvbnM/LmluLCBpbnRlcnZhbDMpOwogIGxldCByZXZlcnNlZCA9ICtzdGFydCA+ICtlbmQ7CiAgY29uc3QgZW5kVGltZSA9IHJldmVyc2VkID8gK3N0YXJ0IDogK2VuZDsKICBjb25zdCBkYXRlID0gcmV2ZXJzZWQgPyBlbmQgOiBzdGFydDsKICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogIGRhdGUuc2V0RGF0ZSgxKTsKICBsZXQgc3RlcCA9IG9wdGlvbnM/LnN0ZXAgPz8gMTsKICBpZiAoIXN0ZXApIHJldHVybiBbXTsKICBpZiAoc3RlcCA8IDApIHsKICAgIHN0ZXAgPSAtc3RlcDsKICAgIHJldmVyc2VkID0gIXJldmVyc2VkOwogIH0KICBjb25zdCBkYXRlcyA9IFtdOwogIHdoaWxlICgrZGF0ZSA8PSBlbmRUaW1lKSB7CiAgICBkYXRlcy5wdXNoKGNvbnN0cnVjdEZyb20oc3RhcnQsIGRhdGUpKTsKICAgIGRhdGUuc2V0TW9udGgoZGF0ZS5nZXRNb250aCgpICsgc3RlcCk7CiAgfQogIHJldHVybiByZXZlcnNlZCA/IGRhdGVzLnJldmVyc2UoKSA6IGRhdGVzOwp9Cl9fbmFtZShlYWNoTW9udGhPZkludGVydmFsLCAiZWFjaE1vbnRoT2ZJbnRlcnZhbCIpOwp2YXIgZWFjaE1vbnRoT2ZJbnRlcnZhbF9kZWZhdWx0ID0gZWFjaE1vbnRoT2ZJbnRlcnZhbDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZlF1YXJ0ZXIuanMKZnVuY3Rpb24gc3RhcnRPZlF1YXJ0ZXIoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCBjdXJyZW50TW9udGggPSBfZGF0ZS5nZXRNb250aCgpOwogIGNvbnN0IG1vbnRoID0gY3VycmVudE1vbnRoIC0gY3VycmVudE1vbnRoICUgMzsKICBfZGF0ZS5zZXRNb250aChtb250aCwgMSk7CiAgX2RhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgcmV0dXJuIF9kYXRlOwp9Cl9fbmFtZShzdGFydE9mUXVhcnRlciwgInN0YXJ0T2ZRdWFydGVyIik7CnZhciBzdGFydE9mUXVhcnRlcl9kZWZhdWx0ID0gc3RhcnRPZlF1YXJ0ZXI7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VhY2hRdWFydGVyT2ZJbnRlcnZhbC5qcwpmdW5jdGlvbiBlYWNoUXVhcnRlck9mSW50ZXJ2YWwoaW50ZXJ2YWwzLCBvcHRpb25zKSB7CiAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSBub3JtYWxpemVJbnRlcnZhbChvcHRpb25zPy5pbiwgaW50ZXJ2YWwzKTsKICBsZXQgcmV2ZXJzZWQgPSArc3RhcnQgPiArZW5kOwogIGNvbnN0IGVuZFRpbWUgPSByZXZlcnNlZCA/ICtzdGFydE9mUXVhcnRlcihzdGFydCkgOiArc3RhcnRPZlF1YXJ0ZXIoZW5kKTsKICBsZXQgZGF0ZSA9IHJldmVyc2VkID8gc3RhcnRPZlF1YXJ0ZXIoZW5kKSA6IHN0YXJ0T2ZRdWFydGVyKHN0YXJ0KTsKICBsZXQgc3RlcCA9IG9wdGlvbnM/LnN0ZXAgPz8gMTsKICBpZiAoIXN0ZXApIHJldHVybiBbXTsKICBpZiAoc3RlcCA8IDApIHsKICAgIHN0ZXAgPSAtc3RlcDsKICAgIHJldmVyc2VkID0gIXJldmVyc2VkOwogIH0KICBjb25zdCBkYXRlcyA9IFtdOwogIHdoaWxlICgrZGF0ZSA8PSBlbmRUaW1lKSB7CiAgICBkYXRlcy5wdXNoKGNvbnN0cnVjdEZyb20oc3RhcnQsIGRhdGUpKTsKICAgIGRhdGUgPSBhZGRRdWFydGVycyhkYXRlLCBzdGVwKTsKICB9CiAgcmV0dXJuIHJldmVyc2VkID8gZGF0ZXMucmV2ZXJzZSgpIDogZGF0ZXM7Cn0KX19uYW1lKGVhY2hRdWFydGVyT2ZJbnRlcnZhbCwgImVhY2hRdWFydGVyT2ZJbnRlcnZhbCIpOwp2YXIgZWFjaFF1YXJ0ZXJPZkludGVydmFsX2RlZmF1bHQgPSBlYWNoUXVhcnRlck9mSW50ZXJ2YWw7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VhY2hXZWVrT2ZJbnRlcnZhbC5qcwpmdW5jdGlvbiBlYWNoV2Vla09mSW50ZXJ2YWwoaW50ZXJ2YWwzLCBvcHRpb25zKSB7CiAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSBub3JtYWxpemVJbnRlcnZhbChvcHRpb25zPy5pbiwgaW50ZXJ2YWwzKTsKICBsZXQgcmV2ZXJzZWQgPSArc3RhcnQgPiArZW5kOwogIGNvbnN0IHN0YXJ0RGF0ZVdlZWsgPSByZXZlcnNlZCA/IHN0YXJ0T2ZXZWVrKGVuZCwgb3B0aW9ucykgOiBzdGFydE9mV2VlayhzdGFydCwgb3B0aW9ucyk7CiAgY29uc3QgZW5kRGF0ZVdlZWsgPSByZXZlcnNlZCA/IHN0YXJ0T2ZXZWVrKHN0YXJ0LCBvcHRpb25zKSA6IHN0YXJ0T2ZXZWVrKGVuZCwgb3B0aW9ucyk7CiAgc3RhcnREYXRlV2Vlay5zZXRIb3VycygxNSk7CiAgZW5kRGF0ZVdlZWsuc2V0SG91cnMoMTUpOwogIGNvbnN0IGVuZFRpbWUgPSArZW5kRGF0ZVdlZWsuZ2V0VGltZSgpOwogIGxldCBjdXJyZW50RGF0ZSA9IHN0YXJ0RGF0ZVdlZWs7CiAgbGV0IHN0ZXAgPSBvcHRpb25zPy5zdGVwID8/IDE7CiAgaWYgKCFzdGVwKSByZXR1cm4gW107CiAgaWYgKHN0ZXAgPCAwKSB7CiAgICBzdGVwID0gLXN0ZXA7CiAgICByZXZlcnNlZCA9ICFyZXZlcnNlZDsKICB9CiAgY29uc3QgZGF0ZXMgPSBbXTsKICB3aGlsZSAoK2N1cnJlbnREYXRlIDw9IGVuZFRpbWUpIHsKICAgIGN1cnJlbnREYXRlLnNldEhvdXJzKDApOwogICAgZGF0ZXMucHVzaChjb25zdHJ1Y3RGcm9tKHN0YXJ0LCBjdXJyZW50RGF0ZSkpOwogICAgY3VycmVudERhdGUgPSBhZGRXZWVrcyhjdXJyZW50RGF0ZSwgc3RlcCk7CiAgICBjdXJyZW50RGF0ZS5zZXRIb3VycygxNSk7CiAgfQogIHJldHVybiByZXZlcnNlZCA/IGRhdGVzLnJldmVyc2UoKSA6IGRhdGVzOwp9Cl9fbmFtZShlYWNoV2Vla09mSW50ZXJ2YWwsICJlYWNoV2Vla09mSW50ZXJ2YWwiKTsKdmFyIGVhY2hXZWVrT2ZJbnRlcnZhbF9kZWZhdWx0ID0gZWFjaFdlZWtPZkludGVydmFsOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lYWNoV2Vla2VuZE9mSW50ZXJ2YWwuanMKZnVuY3Rpb24gZWFjaFdlZWtlbmRPZkludGVydmFsKGludGVydmFsMywgb3B0aW9ucykgewogIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gbm9ybWFsaXplSW50ZXJ2YWwob3B0aW9ucz8uaW4sIGludGVydmFsMyk7CiAgY29uc3QgZGF0ZUludGVydmFsID0gZWFjaERheU9mSW50ZXJ2YWwoeyBzdGFydCwgZW5kIH0sIG9wdGlvbnMpOwogIGNvbnN0IHdlZWtlbmRzID0gW107CiAgbGV0IGluZGV4MiA9IDA7CiAgd2hpbGUgKGluZGV4MiA8IGRhdGVJbnRlcnZhbC5sZW5ndGgpIHsKICAgIGNvbnN0IGRhdGUgPSBkYXRlSW50ZXJ2YWxbaW5kZXgyKytdOwogICAgaWYgKGlzV2Vla2VuZChkYXRlKSkgd2Vla2VuZHMucHVzaChjb25zdHJ1Y3RGcm9tKHN0YXJ0LCBkYXRlKSk7CiAgfQogIHJldHVybiB3ZWVrZW5kczsKfQpfX25hbWUoZWFjaFdlZWtlbmRPZkludGVydmFsLCAiZWFjaFdlZWtlbmRPZkludGVydmFsIik7CnZhciBlYWNoV2Vla2VuZE9mSW50ZXJ2YWxfZGVmYXVsdCA9IGVhY2hXZWVrZW5kT2ZJbnRlcnZhbDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZk1vbnRoLmpzCmZ1bmN0aW9uIHN0YXJ0T2ZNb250aChkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIF9kYXRlLnNldERhdGUoMSk7CiAgX2RhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgcmV0dXJuIF9kYXRlOwp9Cl9fbmFtZShzdGFydE9mTW9udGgsICJzdGFydE9mTW9udGgiKTsKdmFyIHN0YXJ0T2ZNb250aF9kZWZhdWx0ID0gc3RhcnRPZk1vbnRoOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lYWNoV2Vla2VuZE9mTW9udGguanMKZnVuY3Rpb24gZWFjaFdlZWtlbmRPZk1vbnRoKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBzdGFydCA9IHN0YXJ0T2ZNb250aChkYXRlLCBvcHRpb25zKTsKICBjb25zdCBlbmQgPSBlbmRPZk1vbnRoKGRhdGUsIG9wdGlvbnMpOwogIHJldHVybiBlYWNoV2Vla2VuZE9mSW50ZXJ2YWwoeyBzdGFydCwgZW5kIH0sIG9wdGlvbnMpOwp9Cl9fbmFtZShlYWNoV2Vla2VuZE9mTW9udGgsICJlYWNoV2Vla2VuZE9mTW9udGgiKTsKdmFyIGVhY2hXZWVrZW5kT2ZNb250aF9kZWZhdWx0ID0gZWFjaFdlZWtlbmRPZk1vbnRoOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lbmRPZlllYXIuanMKZnVuY3Rpb24gZW5kT2ZZZWFyKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgeWVhciA9IF9kYXRlLmdldEZ1bGxZZWFyKCk7CiAgX2RhdGUuc2V0RnVsbFllYXIoeWVhciArIDEsIDAsIDApOwogIF9kYXRlLnNldEhvdXJzKDIzLCA1OSwgNTksIDk5OSk7CiAgcmV0dXJuIF9kYXRlOwp9Cl9fbmFtZShlbmRPZlllYXIsICJlbmRPZlllYXIiKTsKdmFyIGVuZE9mWWVhcl9kZWZhdWx0ID0gZW5kT2ZZZWFyOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mWWVhci5qcwpmdW5jdGlvbiBzdGFydE9mWWVhcihkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgZGF0ZV8gPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGRhdGVfLnNldEZ1bGxZZWFyKGRhdGVfLmdldEZ1bGxZZWFyKCksIDAsIDEpOwogIGRhdGVfLnNldEhvdXJzKDAsIDAsIDAsIDApOwogIHJldHVybiBkYXRlXzsKfQpfX25hbWUoc3RhcnRPZlllYXIsICJzdGFydE9mWWVhciIpOwp2YXIgc3RhcnRPZlllYXJfZGVmYXVsdCA9IHN0YXJ0T2ZZZWFyOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lYWNoV2Vla2VuZE9mWWVhci5qcwpmdW5jdGlvbiBlYWNoV2Vla2VuZE9mWWVhcihkYXRlLCBvcHRpb25zKSB7CiAgY29uc3Qgc3RhcnQgPSBzdGFydE9mWWVhcihkYXRlLCBvcHRpb25zKTsKICBjb25zdCBlbmQgPSBlbmRPZlllYXIoZGF0ZSwgb3B0aW9ucyk7CiAgcmV0dXJuIGVhY2hXZWVrZW5kT2ZJbnRlcnZhbCh7IHN0YXJ0LCBlbmQgfSwgb3B0aW9ucyk7Cn0KX19uYW1lKGVhY2hXZWVrZW5kT2ZZZWFyLCAiZWFjaFdlZWtlbmRPZlllYXIiKTsKdmFyIGVhY2hXZWVrZW5kT2ZZZWFyX2RlZmF1bHQgPSBlYWNoV2Vla2VuZE9mWWVhcjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZWFjaFllYXJPZkludGVydmFsLmpzCmZ1bmN0aW9uIGVhY2hZZWFyT2ZJbnRlcnZhbChpbnRlcnZhbDMsIG9wdGlvbnMpIHsKICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IG5vcm1hbGl6ZUludGVydmFsKG9wdGlvbnM/LmluLCBpbnRlcnZhbDMpOwogIGxldCByZXZlcnNlZCA9ICtzdGFydCA+ICtlbmQ7CiAgY29uc3QgZW5kVGltZSA9IHJldmVyc2VkID8gK3N0YXJ0IDogK2VuZDsKICBjb25zdCBkYXRlID0gcmV2ZXJzZWQgPyBlbmQgOiBzdGFydDsKICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogIGRhdGUuc2V0TW9udGgoMCwgMSk7CiAgbGV0IHN0ZXAgPSBvcHRpb25zPy5zdGVwID8/IDE7CiAgaWYgKCFzdGVwKSByZXR1cm4gW107CiAgaWYgKHN0ZXAgPCAwKSB7CiAgICBzdGVwID0gLXN0ZXA7CiAgICByZXZlcnNlZCA9ICFyZXZlcnNlZDsKICB9CiAgY29uc3QgZGF0ZXMgPSBbXTsKICB3aGlsZSAoK2RhdGUgPD0gZW5kVGltZSkgewogICAgZGF0ZXMucHVzaChjb25zdHJ1Y3RGcm9tKHN0YXJ0LCBkYXRlKSk7CiAgICBkYXRlLnNldEZ1bGxZZWFyKGRhdGUuZ2V0RnVsbFllYXIoKSArIHN0ZXApOwogIH0KICByZXR1cm4gcmV2ZXJzZWQgPyBkYXRlcy5yZXZlcnNlKCkgOiBkYXRlczsKfQpfX25hbWUoZWFjaFllYXJPZkludGVydmFsLCAiZWFjaFllYXJPZkludGVydmFsIik7CnZhciBlYWNoWWVhck9mSW50ZXJ2YWxfZGVmYXVsdCA9IGVhY2hZZWFyT2ZJbnRlcnZhbDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZW5kT2ZEZWNhZGUuanMKZnVuY3Rpb24gZW5kT2ZEZWNhZGUoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCB5ZWFyID0gX2RhdGUuZ2V0RnVsbFllYXIoKTsKICBjb25zdCBkZWNhZGUgPSA5ICsgTWF0aC5mbG9vcih5ZWFyIC8gMTApICogMTA7CiAgX2RhdGUuc2V0RnVsbFllYXIoZGVjYWRlLCAxMSwgMzEpOwogIF9kYXRlLnNldEhvdXJzKDIzLCA1OSwgNTksIDk5OSk7CiAgcmV0dXJuIF9kYXRlOwp9Cl9fbmFtZShlbmRPZkRlY2FkZSwgImVuZE9mRGVjYWRlIik7CnZhciBlbmRPZkRlY2FkZV9kZWZhdWx0ID0gZW5kT2ZEZWNhZGU7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VuZE9mSG91ci5qcwpmdW5jdGlvbiBlbmRPZkhvdXIoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBfZGF0ZS5zZXRNaW51dGVzKDU5LCA1OSwgOTk5KTsKICByZXR1cm4gX2RhdGU7Cn0KX19uYW1lKGVuZE9mSG91ciwgImVuZE9mSG91ciIpOwp2YXIgZW5kT2ZIb3VyX2RlZmF1bHQgPSBlbmRPZkhvdXI7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VuZE9mV2Vlay5qcwpmdW5jdGlvbiBlbmRPZldlZWsoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IGRlZmF1bHRPcHRpb25zMiA9IGdldERlZmF1bHRPcHRpb25zKCk7CiAgY29uc3Qgd2Vla1N0YXJ0c09uID0gb3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/IG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/IGRlZmF1bHRPcHRpb25zMi53ZWVrU3RhcnRzT24gPz8gZGVmYXVsdE9wdGlvbnMyLmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/IDA7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGNvbnN0IGRheSA9IF9kYXRlLmdldERheSgpOwogIGNvbnN0IGRpZmYgPSAoZGF5IDwgd2Vla1N0YXJ0c09uID8gLTcgOiAwKSArIDYgLSAoZGF5IC0gd2Vla1N0YXJ0c09uKTsKICBfZGF0ZS5zZXREYXRlKF9kYXRlLmdldERhdGUoKSArIGRpZmYpOwogIF9kYXRlLnNldEhvdXJzKDIzLCA1OSwgNTksIDk5OSk7CiAgcmV0dXJuIF9kYXRlOwp9Cl9fbmFtZShlbmRPZldlZWssICJlbmRPZldlZWsiKTsKdmFyIGVuZE9mV2Vla19kZWZhdWx0ID0gZW5kT2ZXZWVrOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lbmRPZklTT1dlZWsuanMKZnVuY3Rpb24gZW5kT2ZJU09XZWVrKGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gZW5kT2ZXZWVrKGRhdGUsIHsgLi4ub3B0aW9ucywgd2Vla1N0YXJ0c09uOiAxIH0pOwp9Cl9fbmFtZShlbmRPZklTT1dlZWssICJlbmRPZklTT1dlZWsiKTsKdmFyIGVuZE9mSVNPV2Vla19kZWZhdWx0ID0gZW5kT2ZJU09XZWVrOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lbmRPZklTT1dlZWtZZWFyLmpzCmZ1bmN0aW9uIGVuZE9mSVNPV2Vla1llYXIoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IHllYXIgPSBnZXRJU09XZWVrWWVhcihkYXRlLCBvcHRpb25zKTsKICBjb25zdCBmb3VydGhPZkphbnVhcnlPZk5leHRZZWFyID0gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCAwKTsKICBmb3VydGhPZkphbnVhcnlPZk5leHRZZWFyLnNldEZ1bGxZZWFyKHllYXIgKyAxLCAwLCA0KTsKICBmb3VydGhPZkphbnVhcnlPZk5leHRZZWFyLnNldEhvdXJzKDAsIDAsIDAsIDApOwogIGNvbnN0IF9kYXRlID0gc3RhcnRPZklTT1dlZWsoZm91cnRoT2ZKYW51YXJ5T2ZOZXh0WWVhciwgb3B0aW9ucyk7CiAgX2RhdGUuc2V0TWlsbGlzZWNvbmRzKF9kYXRlLmdldE1pbGxpc2Vjb25kcygpIC0gMSk7CiAgcmV0dXJuIF9kYXRlOwp9Cl9fbmFtZShlbmRPZklTT1dlZWtZZWFyLCAiZW5kT2ZJU09XZWVrWWVhciIpOwp2YXIgZW5kT2ZJU09XZWVrWWVhcl9kZWZhdWx0ID0gZW5kT2ZJU09XZWVrWWVhcjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZW5kT2ZNaW51dGUuanMKZnVuY3Rpb24gZW5kT2ZNaW51dGUoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBfZGF0ZS5zZXRTZWNvbmRzKDU5LCA5OTkpOwogIHJldHVybiBfZGF0ZTsKfQpfX25hbWUoZW5kT2ZNaW51dGUsICJlbmRPZk1pbnV0ZSIpOwp2YXIgZW5kT2ZNaW51dGVfZGVmYXVsdCA9IGVuZE9mTWludXRlOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lbmRPZlF1YXJ0ZXIuanMKZnVuY3Rpb24gZW5kT2ZRdWFydGVyKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgY3VycmVudE1vbnRoID0gX2RhdGUuZ2V0TW9udGgoKTsKICBjb25zdCBtb250aCA9IGN1cnJlbnRNb250aCAtIGN1cnJlbnRNb250aCAlIDMgKyAzOwogIF9kYXRlLnNldE1vbnRoKG1vbnRoLCAwKTsKICBfZGF0ZS5zZXRIb3VycygyMywgNTksIDU5LCA5OTkpOwogIHJldHVybiBfZGF0ZTsKfQpfX25hbWUoZW5kT2ZRdWFydGVyLCAiZW5kT2ZRdWFydGVyIik7CnZhciBlbmRPZlF1YXJ0ZXJfZGVmYXVsdCA9IGVuZE9mUXVhcnRlcjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZW5kT2ZTZWNvbmQuanMKZnVuY3Rpb24gZW5kT2ZTZWNvbmQoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBfZGF0ZS5zZXRNaWxsaXNlY29uZHMoOTk5KTsKICByZXR1cm4gX2RhdGU7Cn0KX19uYW1lKGVuZE9mU2Vjb25kLCAiZW5kT2ZTZWNvbmQiKTsKdmFyIGVuZE9mU2Vjb25kX2RlZmF1bHQgPSBlbmRPZlNlY29uZDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZW5kT2ZUb2RheS5qcwpmdW5jdGlvbiBlbmRPZlRvZGF5KG9wdGlvbnMpIHsKICByZXR1cm4gZW5kT2ZEYXkoRGF0ZS5ub3coKSwgb3B0aW9ucyk7Cn0KX19uYW1lKGVuZE9mVG9kYXksICJlbmRPZlRvZGF5Iik7CnZhciBlbmRPZlRvZGF5X2RlZmF1bHQgPSBlbmRPZlRvZGF5OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lbmRPZlRvbW9ycm93LmpzCmZ1bmN0aW9uIGVuZE9mVG9tb3Jyb3cob3B0aW9ucykgewogIGNvbnN0IG5vdzIgPSBjb25zdHJ1Y3ROb3cob3B0aW9ucz8uaW4pOwogIGNvbnN0IHllYXIgPSBub3cyLmdldEZ1bGxZZWFyKCk7CiAgY29uc3QgbW9udGggPSBub3cyLmdldE1vbnRoKCk7CiAgY29uc3QgZGF5ID0gbm93Mi5nZXREYXRlKCk7CiAgY29uc3QgZGF0ZSA9IGNvbnN0cnVjdE5vdyhvcHRpb25zPy5pbik7CiAgZGF0ZS5zZXRGdWxsWWVhcih5ZWFyLCBtb250aCwgZGF5ICsgMSk7CiAgZGF0ZS5zZXRIb3VycygyMywgNTksIDU5LCA5OTkpOwogIHJldHVybiBvcHRpb25zPy5pbiA/IG9wdGlvbnMuaW4oZGF0ZSkgOiBkYXRlOwp9Cl9fbmFtZShlbmRPZlRvbW9ycm93LCAiZW5kT2ZUb21vcnJvdyIpOwp2YXIgZW5kT2ZUb21vcnJvd19kZWZhdWx0ID0gZW5kT2ZUb21vcnJvdzsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZW5kT2ZZZXN0ZXJkYXkuanMKZnVuY3Rpb24gZW5kT2ZZZXN0ZXJkYXkob3B0aW9ucykgewogIGNvbnN0IG5vdzIgPSBjb25zdHJ1Y3ROb3cob3B0aW9ucz8uaW4pOwogIGNvbnN0IGRhdGUgPSBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluLCAwKTsKICBkYXRlLnNldEZ1bGxZZWFyKG5vdzIuZ2V0RnVsbFllYXIoKSwgbm93Mi5nZXRNb250aCgpLCBub3cyLmdldERhdGUoKSAtIDEpOwogIGRhdGUuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KTsKICByZXR1cm4gZGF0ZTsKfQpfX25hbWUoZW5kT2ZZZXN0ZXJkYXksICJlbmRPZlllc3RlcmRheSIpOwp2YXIgZW5kT2ZZZXN0ZXJkYXlfZGVmYXVsdCA9IGVuZE9mWWVzdGVyZGF5OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZW4tVVMvX2xpYi9mb3JtYXREaXN0YW5jZS5qcwp2YXIgZm9ybWF0RGlzdGFuY2VMb2NhbGUgPSB7CiAgbGVzc1RoYW5YU2Vjb25kczogewogICAgb25lOiAibGVzcyB0aGFuIGEgc2Vjb25kIiwKICAgIG90aGVyOiAibGVzcyB0aGFuIHt7Y291bnR9fSBzZWNvbmRzIgogIH0sCiAgeFNlY29uZHM6IHsKICAgIG9uZTogIjEgc2Vjb25kIiwKICAgIG90aGVyOiAie3tjb3VudH19IHNlY29uZHMiCiAgfSwKICBoYWxmQU1pbnV0ZTogImhhbGYgYSBtaW51dGUiLAogIGxlc3NUaGFuWE1pbnV0ZXM6IHsKICAgIG9uZTogImxlc3MgdGhhbiBhIG1pbnV0ZSIsCiAgICBvdGhlcjogImxlc3MgdGhhbiB7e2NvdW50fX0gbWludXRlcyIKICB9LAogIHhNaW51dGVzOiB7CiAgICBvbmU6ICIxIG1pbnV0ZSIsCiAgICBvdGhlcjogInt7Y291bnR9fSBtaW51dGVzIgogIH0sCiAgYWJvdXRYSG91cnM6IHsKICAgIG9uZTogImFib3V0IDEgaG91ciIsCiAgICBvdGhlcjogImFib3V0IHt7Y291bnR9fSBob3VycyIKICB9LAogIHhIb3VyczogewogICAgb25lOiAiMSBob3VyIiwKICAgIG90aGVyOiAie3tjb3VudH19IGhvdXJzIgogIH0sCiAgeERheXM6IHsKICAgIG9uZTogIjEgZGF5IiwKICAgIG90aGVyOiAie3tjb3VudH19IGRheXMiCiAgfSwKICBhYm91dFhXZWVrczogewogICAgb25lOiAiYWJvdXQgMSB3ZWVrIiwKICAgIG90aGVyOiAiYWJvdXQge3tjb3VudH19IHdlZWtzIgogIH0sCiAgeFdlZWtzOiB7CiAgICBvbmU6ICIxIHdlZWsiLAogICAgb3RoZXI6ICJ7e2NvdW50fX0gd2Vla3MiCiAgfSwKICBhYm91dFhNb250aHM6IHsKICAgIG9uZTogImFib3V0IDEgbW9udGgiLAogICAgb3RoZXI6ICJhYm91dCB7e2NvdW50fX0gbW9udGhzIgogIH0sCiAgeE1vbnRoczogewogICAgb25lOiAiMSBtb250aCIsCiAgICBvdGhlcjogInt7Y291bnR9fSBtb250aHMiCiAgfSwKICBhYm91dFhZZWFyczogewogICAgb25lOiAiYWJvdXQgMSB5ZWFyIiwKICAgIG90aGVyOiAiYWJvdXQge3tjb3VudH19IHllYXJzIgogIH0sCiAgeFllYXJzOiB7CiAgICBvbmU6ICIxIHllYXIiLAogICAgb3RoZXI6ICJ7e2NvdW50fX0geWVhcnMiCiAgfSwKICBvdmVyWFllYXJzOiB7CiAgICBvbmU6ICJvdmVyIDEgeWVhciIsCiAgICBvdGhlcjogIm92ZXIge3tjb3VudH19IHllYXJzIgogIH0sCiAgYWxtb3N0WFllYXJzOiB7CiAgICBvbmU6ICJhbG1vc3QgMSB5ZWFyIiwKICAgIG90aGVyOiAiYWxtb3N0IHt7Y291bnR9fSB5ZWFycyIKICB9Cn07CnZhciBmb3JtYXREaXN0YW5jZSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHRva2VuLCBjb3VudDIsIG9wdGlvbnMpID0+IHsKICBsZXQgcmVzdWx0OwogIGNvbnN0IHRva2VuVmFsdWUgPSBmb3JtYXREaXN0YW5jZUxvY2FsZVt0b2tlbl07CiAgaWYgKHR5cGVvZiB0b2tlblZhbHVlID09PSAic3RyaW5nIikgewogICAgcmVzdWx0ID0gdG9rZW5WYWx1ZTsKICB9IGVsc2UgaWYgKGNvdW50MiA9PT0gMSkgewogICAgcmVzdWx0ID0gdG9rZW5WYWx1ZS5vbmU7CiAgfSBlbHNlIHsKICAgIHJlc3VsdCA9IHRva2VuVmFsdWUub3RoZXIucmVwbGFjZSgie3tjb3VudH19IiwgY291bnQyLnRvU3RyaW5nKCkpOwogIH0KICBpZiAob3B0aW9ucz8uYWRkU3VmZml4KSB7CiAgICBpZiAob3B0aW9ucy5jb21wYXJpc29uICYmIG9wdGlvbnMuY29tcGFyaXNvbiA+IDApIHsKICAgICAgcmV0dXJuICJpbiAiICsgcmVzdWx0OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHJlc3VsdCArICIgYWdvIjsKICAgIH0KICB9CiAgcmV0dXJuIHJlc3VsdDsKfSwgImZvcm1hdERpc3RhbmNlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9fbGliL2J1aWxkRm9ybWF0TG9uZ0ZuLmpzCmZ1bmN0aW9uIGJ1aWxkRm9ybWF0TG9uZ0ZuKGFyZ3MpIHsKICByZXR1cm4gKG9wdGlvbnMgPSB7fSkgPT4gewogICAgY29uc3Qgd2lkdGggPSBvcHRpb25zLndpZHRoID8gU3RyaW5nKG9wdGlvbnMud2lkdGgpIDogYXJncy5kZWZhdWx0V2lkdGg7CiAgICBjb25zdCBmb3JtYXQyID0gYXJncy5mb3JtYXRzW3dpZHRoXSB8fCBhcmdzLmZvcm1hdHNbYXJncy5kZWZhdWx0V2lkdGhdOwogICAgcmV0dXJuIGZvcm1hdDI7CiAgfTsKfQpfX25hbWUoYnVpbGRGb3JtYXRMb25nRm4sICJidWlsZEZvcm1hdExvbmdGbiIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZW4tVVMvX2xpYi9mb3JtYXRMb25nLmpzCnZhciBkYXRlRm9ybWF0cyA9IHsKICBmdWxsOiAiRUVFRSwgTU1NTSBkbywgeSIsCiAgbG9uZzogIk1NTU0gZG8sIHkiLAogIG1lZGl1bTogIk1NTSBkLCB5IiwKICBzaG9ydDogIk1NL2RkL3l5eXkiCn07CnZhciB0aW1lRm9ybWF0cyA9IHsKICBmdWxsOiAiaDptbTpzcyBhIHp6enoiLAogIGxvbmc6ICJoOm1tOnNzIGEgeiIsCiAgbWVkaXVtOiAiaDptbTpzcyBhIiwKICBzaG9ydDogImg6bW0gYSIKfTsKdmFyIGRhdGVUaW1lRm9ybWF0cyA9IHsKICBmdWxsOiAie3tkYXRlfX0gJ2F0JyB7e3RpbWV9fSIsCiAgbG9uZzogInt7ZGF0ZX19ICdhdCcge3t0aW1lfX0iLAogIG1lZGl1bTogInt7ZGF0ZX19LCB7e3RpbWV9fSIsCiAgc2hvcnQ6ICJ7e2RhdGV9fSwge3t0aW1lfX0iCn07CnZhciBmb3JtYXRMb25nID0gewogIGRhdGU6IGJ1aWxkRm9ybWF0TG9uZ0ZuKHsKICAgIGZvcm1hdHM6IGRhdGVGb3JtYXRzLAogICAgZGVmYXVsdFdpZHRoOiAiZnVsbCIKICB9KSwKICB0aW1lOiBidWlsZEZvcm1hdExvbmdGbih7CiAgICBmb3JtYXRzOiB0aW1lRm9ybWF0cywKICAgIGRlZmF1bHRXaWR0aDogImZ1bGwiCiAgfSksCiAgZGF0ZVRpbWU6IGJ1aWxkRm9ybWF0TG9uZ0ZuKHsKICAgIGZvcm1hdHM6IGRhdGVUaW1lRm9ybWF0cywKICAgIGRlZmF1bHRXaWR0aDogImZ1bGwiCiAgfSkKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL2VuLVVTL19saWIvZm9ybWF0UmVsYXRpdmUuanMKdmFyIGZvcm1hdFJlbGF0aXZlTG9jYWxlID0gewogIGxhc3RXZWVrOiAiJ2xhc3QnIGVlZWUgJ2F0JyBwIiwKICB5ZXN0ZXJkYXk6ICIneWVzdGVyZGF5IGF0JyBwIiwKICB0b2RheTogIid0b2RheSBhdCcgcCIsCiAgdG9tb3Jyb3c6ICIndG9tb3Jyb3cgYXQnIHAiLAogIG5leHRXZWVrOiAiZWVlZSAnYXQnIHAiLAogIG90aGVyOiAiUCIKfTsKdmFyIGZvcm1hdFJlbGF0aXZlID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgodG9rZW4sIF9kYXRlLCBfYmFzZURhdGUsIF9vcHRpb25zKSA9PiBmb3JtYXRSZWxhdGl2ZUxvY2FsZVt0b2tlbl0sICJmb3JtYXRSZWxhdGl2ZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvX2xpYi9idWlsZExvY2FsaXplRm4uanMKZnVuY3Rpb24gYnVpbGRMb2NhbGl6ZUZuKGFyZ3MpIHsKICByZXR1cm4gKHZhbHVlMiwgb3B0aW9ucykgPT4gewogICAgY29uc3QgY29udGV4dDIgPSBvcHRpb25zPy5jb250ZXh0ID8gU3RyaW5nKG9wdGlvbnMuY29udGV4dCkgOiAic3RhbmRhbG9uZSI7CiAgICBsZXQgdmFsdWVzQXJyYXk7CiAgICBpZiAoY29udGV4dDIgPT09ICJmb3JtYXR0aW5nIiAmJiBhcmdzLmZvcm1hdHRpbmdWYWx1ZXMpIHsKICAgICAgY29uc3QgZGVmYXVsdFdpZHRoID0gYXJncy5kZWZhdWx0Rm9ybWF0dGluZ1dpZHRoIHx8IGFyZ3MuZGVmYXVsdFdpZHRoOwogICAgICBjb25zdCB3aWR0aCA9IG9wdGlvbnM/LndpZHRoID8gU3RyaW5nKG9wdGlvbnMud2lkdGgpIDogZGVmYXVsdFdpZHRoOwogICAgICB2YWx1ZXNBcnJheSA9IGFyZ3MuZm9ybWF0dGluZ1ZhbHVlc1t3aWR0aF0gfHwgYXJncy5mb3JtYXR0aW5nVmFsdWVzW2RlZmF1bHRXaWR0aF07CiAgICB9IGVsc2UgewogICAgICBjb25zdCBkZWZhdWx0V2lkdGggPSBhcmdzLmRlZmF1bHRXaWR0aDsKICAgICAgY29uc3Qgd2lkdGggPSBvcHRpb25zPy53aWR0aCA/IFN0cmluZyhvcHRpb25zLndpZHRoKSA6IGFyZ3MuZGVmYXVsdFdpZHRoOwogICAgICB2YWx1ZXNBcnJheSA9IGFyZ3MudmFsdWVzW3dpZHRoXSB8fCBhcmdzLnZhbHVlc1tkZWZhdWx0V2lkdGhdOwogICAgfQogICAgY29uc3QgaW5kZXgyID0gYXJncy5hcmd1bWVudENhbGxiYWNrID8gYXJncy5hcmd1bWVudENhbGxiYWNrKHZhbHVlMikgOiB2YWx1ZTI7CiAgICByZXR1cm4gdmFsdWVzQXJyYXlbaW5kZXgyXTsKICB9Owp9Cl9fbmFtZShidWlsZExvY2FsaXplRm4sICJidWlsZExvY2FsaXplRm4iKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL2VuLVVTL19saWIvbG9jYWxpemUuanMKdmFyIGVyYVZhbHVlcyA9IHsKICBuYXJyb3c6IFsiQiIsICJBIl0sCiAgYWJicmV2aWF0ZWQ6IFsiQkMiLCAiQUQiXSwKICB3aWRlOiBbIkJlZm9yZSBDaHJpc3QiLCAiQW5ubyBEb21pbmkiXQp9Owp2YXIgcXVhcnRlclZhbHVlcyA9IHsKICBuYXJyb3c6IFsiMSIsICIyIiwgIjMiLCAiNCJdLAogIGFiYnJldmlhdGVkOiBbIlExIiwgIlEyIiwgIlEzIiwgIlE0Il0sCiAgd2lkZTogWyIxc3QgcXVhcnRlciIsICIybmQgcXVhcnRlciIsICIzcmQgcXVhcnRlciIsICI0dGggcXVhcnRlciJdCn07CnZhciBtb250aFZhbHVlcyA9IHsKICBuYXJyb3c6IFsiSiIsICJGIiwgIk0iLCAiQSIsICJNIiwgIkoiLCAiSiIsICJBIiwgIlMiLCAiTyIsICJOIiwgIkQiXSwKICBhYmJyZXZpYXRlZDogWwogICAgIkphbiIsCiAgICAiRmViIiwKICAgICJNYXIiLAogICAgIkFwciIsCiAgICAiTWF5IiwKICAgICJKdW4iLAogICAgIkp1bCIsCiAgICAiQXVnIiwKICAgICJTZXAiLAogICAgIk9jdCIsCiAgICAiTm92IiwKICAgICJEZWMiCiAgXSwKICB3aWRlOiBbCiAgICAiSmFudWFyeSIsCiAgICAiRmVicnVhcnkiLAogICAgIk1hcmNoIiwKICAgICJBcHJpbCIsCiAgICAiTWF5IiwKICAgICJKdW5lIiwKICAgICJKdWx5IiwKICAgICJBdWd1c3QiLAogICAgIlNlcHRlbWJlciIsCiAgICAiT2N0b2JlciIsCiAgICAiTm92ZW1iZXIiLAogICAgIkRlY2VtYmVyIgogIF0KfTsKdmFyIGRheVZhbHVlcyA9IHsKICBuYXJyb3c6IFsiUyIsICJNIiwgIlQiLCAiVyIsICJUIiwgIkYiLCAiUyJdLAogIHNob3J0OiBbIlN1IiwgIk1vIiwgIlR1IiwgIldlIiwgIlRoIiwgIkZyIiwgIlNhIl0sCiAgYWJicmV2aWF0ZWQ6IFsiU3VuIiwgIk1vbiIsICJUdWUiLCAiV2VkIiwgIlRodSIsICJGcmkiLCAiU2F0Il0sCiAgd2lkZTogWwogICAgIlN1bmRheSIsCiAgICAiTW9uZGF5IiwKICAgICJUdWVzZGF5IiwKICAgICJXZWRuZXNkYXkiLAogICAgIlRodXJzZGF5IiwKICAgICJGcmlkYXkiLAogICAgIlNhdHVyZGF5IgogIF0KfTsKdmFyIGRheVBlcmlvZFZhbHVlcyA9IHsKICBuYXJyb3c6IHsKICAgIGFtOiAiYSIsCiAgICBwbTogInAiLAogICAgbWlkbmlnaHQ6ICJtaSIsCiAgICBub29uOiAibiIsCiAgICBtb3JuaW5nOiAibW9ybmluZyIsCiAgICBhZnRlcm5vb246ICJhZnRlcm5vb24iLAogICAgZXZlbmluZzogImV2ZW5pbmciLAogICAgbmlnaHQ6ICJuaWdodCIKICB9LAogIGFiYnJldmlhdGVkOiB7CiAgICBhbTogIkFNIiwKICAgIHBtOiAiUE0iLAogICAgbWlkbmlnaHQ6ICJtaWRuaWdodCIsCiAgICBub29uOiAibm9vbiIsCiAgICBtb3JuaW5nOiAibW9ybmluZyIsCiAgICBhZnRlcm5vb246ICJhZnRlcm5vb24iLAogICAgZXZlbmluZzogImV2ZW5pbmciLAogICAgbmlnaHQ6ICJuaWdodCIKICB9LAogIHdpZGU6IHsKICAgIGFtOiAiYS5tLiIsCiAgICBwbTogInAubS4iLAogICAgbWlkbmlnaHQ6ICJtaWRuaWdodCIsCiAgICBub29uOiAibm9vbiIsCiAgICBtb3JuaW5nOiAibW9ybmluZyIsCiAgICBhZnRlcm5vb246ICJhZnRlcm5vb24iLAogICAgZXZlbmluZzogImV2ZW5pbmciLAogICAgbmlnaHQ6ICJuaWdodCIKICB9Cn07CnZhciBmb3JtYXR0aW5nRGF5UGVyaW9kVmFsdWVzID0gewogIG5hcnJvdzogewogICAgYW06ICJhIiwKICAgIHBtOiAicCIsCiAgICBtaWRuaWdodDogIm1pIiwKICAgIG5vb246ICJuIiwKICAgIG1vcm5pbmc6ICJpbiB0aGUgbW9ybmluZyIsCiAgICBhZnRlcm5vb246ICJpbiB0aGUgYWZ0ZXJub29uIiwKICAgIGV2ZW5pbmc6ICJpbiB0aGUgZXZlbmluZyIsCiAgICBuaWdodDogImF0IG5pZ2h0IgogIH0sCiAgYWJicmV2aWF0ZWQ6IHsKICAgIGFtOiAiQU0iLAogICAgcG06ICJQTSIsCiAgICBtaWRuaWdodDogIm1pZG5pZ2h0IiwKICAgIG5vb246ICJub29uIiwKICAgIG1vcm5pbmc6ICJpbiB0aGUgbW9ybmluZyIsCiAgICBhZnRlcm5vb246ICJpbiB0aGUgYWZ0ZXJub29uIiwKICAgIGV2ZW5pbmc6ICJpbiB0aGUgZXZlbmluZyIsCiAgICBuaWdodDogImF0IG5pZ2h0IgogIH0sCiAgd2lkZTogewogICAgYW06ICJhLm0uIiwKICAgIHBtOiAicC5tLiIsCiAgICBtaWRuaWdodDogIm1pZG5pZ2h0IiwKICAgIG5vb246ICJub29uIiwKICAgIG1vcm5pbmc6ICJpbiB0aGUgbW9ybmluZyIsCiAgICBhZnRlcm5vb246ICJpbiB0aGUgYWZ0ZXJub29uIiwKICAgIGV2ZW5pbmc6ICJpbiB0aGUgZXZlbmluZyIsCiAgICBuaWdodDogImF0IG5pZ2h0IgogIH0KfTsKdmFyIG9yZGluYWxOdW1iZXIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChkaXJ0eU51bWJlciwgX29wdGlvbnMpID0+IHsKICBjb25zdCBudW1iZXIyID0gTnVtYmVyKGRpcnR5TnVtYmVyKTsKICBjb25zdCByZW0xMDAgPSBudW1iZXIyICUgMTAwOwogIGlmIChyZW0xMDAgPiAyMCB8fCByZW0xMDAgPCAxMCkgewogICAgc3dpdGNoIChyZW0xMDAgJSAxMCkgewogICAgICBjYXNlIDE6CiAgICAgICAgcmV0dXJuIG51bWJlcjIgKyAic3QiOwogICAgICBjYXNlIDI6CiAgICAgICAgcmV0dXJuIG51bWJlcjIgKyAibmQiOwogICAgICBjYXNlIDM6CiAgICAgICAgcmV0dXJuIG51bWJlcjIgKyAicmQiOwogICAgfQogIH0KICByZXR1cm4gbnVtYmVyMiArICJ0aCI7Cn0sICJvcmRpbmFsTnVtYmVyIik7CnZhciBsb2NhbGl6ZSA9IHsKICBvcmRpbmFsTnVtYmVyLAogIGVyYTogYnVpbGRMb2NhbGl6ZUZuKHsKICAgIHZhbHVlczogZXJhVmFsdWVzLAogICAgZGVmYXVsdFdpZHRoOiAid2lkZSIKICB9KSwKICBxdWFydGVyOiBidWlsZExvY2FsaXplRm4oewogICAgdmFsdWVzOiBxdWFydGVyVmFsdWVzLAogICAgZGVmYXVsdFdpZHRoOiAid2lkZSIsCiAgICBhcmd1bWVudENhbGxiYWNrOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKChxdWFydGVyKSA9PiBxdWFydGVyIC0gMSwgImFyZ3VtZW50Q2FsbGJhY2siKQogIH0pLAogIG1vbnRoOiBidWlsZExvY2FsaXplRm4oewogICAgdmFsdWVzOiBtb250aFZhbHVlcywKICAgIGRlZmF1bHRXaWR0aDogIndpZGUiCiAgfSksCiAgZGF5OiBidWlsZExvY2FsaXplRm4oewogICAgdmFsdWVzOiBkYXlWYWx1ZXMsCiAgICBkZWZhdWx0V2lkdGg6ICJ3aWRlIgogIH0pLAogIGRheVBlcmlvZDogYnVpbGRMb2NhbGl6ZUZuKHsKICAgIHZhbHVlczogZGF5UGVyaW9kVmFsdWVzLAogICAgZGVmYXVsdFdpZHRoOiAid2lkZSIsCiAgICBmb3JtYXR0aW5nVmFsdWVzOiBmb3JtYXR0aW5nRGF5UGVyaW9kVmFsdWVzLAogICAgZGVmYXVsdEZvcm1hdHRpbmdXaWR0aDogIndpZGUiCiAgfSkKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL19saWIvYnVpbGRNYXRjaEZuLmpzCmZ1bmN0aW9uIGJ1aWxkTWF0Y2hGbihhcmdzKSB7CiAgcmV0dXJuIChzdHJpbmczLCBvcHRpb25zID0ge30pID0+IHsKICAgIGNvbnN0IHdpZHRoID0gb3B0aW9ucy53aWR0aDsKICAgIGNvbnN0IG1hdGNoUGF0dGVybiA9IHdpZHRoICYmIGFyZ3MubWF0Y2hQYXR0ZXJuc1t3aWR0aF0gfHwgYXJncy5tYXRjaFBhdHRlcm5zW2FyZ3MuZGVmYXVsdE1hdGNoV2lkdGhdOwogICAgY29uc3QgbWF0Y2hSZXN1bHQgPSBzdHJpbmczLm1hdGNoKG1hdGNoUGF0dGVybik7CiAgICBpZiAoIW1hdGNoUmVzdWx0KSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgbWF0Y2hlZFN0cmluZyA9IG1hdGNoUmVzdWx0WzBdOwogICAgY29uc3QgcGFyc2VQYXR0ZXJucyA9IHdpZHRoICYmIGFyZ3MucGFyc2VQYXR0ZXJuc1t3aWR0aF0gfHwgYXJncy5wYXJzZVBhdHRlcm5zW2FyZ3MuZGVmYXVsdFBhcnNlV2lkdGhdOwogICAgY29uc3Qga2V5MiA9IEFycmF5LmlzQXJyYXkocGFyc2VQYXR0ZXJucykgPyBmaW5kSW5kZXgyKHBhcnNlUGF0dGVybnMsIChwYXR0ZXJuKSA9PiBwYXR0ZXJuLnRlc3QobWF0Y2hlZFN0cmluZykpIDogKAogICAgICAvLyBbVE9ET10gLS0gSSBjaGFsbGVuZ2UgeW91IHRvIGZpeCB0aGUgdHlwZQogICAgICBmaW5kS2V5KHBhcnNlUGF0dGVybnMsIChwYXR0ZXJuKSA9PiBwYXR0ZXJuLnRlc3QobWF0Y2hlZFN0cmluZykpCiAgICApOwogICAgbGV0IHZhbHVlMjsKICAgIHZhbHVlMiA9IGFyZ3MudmFsdWVDYWxsYmFjayA/IGFyZ3MudmFsdWVDYWxsYmFjayhrZXkyKSA6IGtleTI7CiAgICB2YWx1ZTIgPSBvcHRpb25zLnZhbHVlQ2FsbGJhY2sgPyAoCiAgICAgIC8vIFtUT0RPXSAtLSBJIGNoYWxsZW5nZSB5b3UgdG8gZml4IHRoZSB0eXBlCiAgICAgIG9wdGlvbnMudmFsdWVDYWxsYmFjayh2YWx1ZTIpCiAgICApIDogdmFsdWUyOwogICAgY29uc3QgcmVzdCA9IHN0cmluZzMuc2xpY2UobWF0Y2hlZFN0cmluZy5sZW5ndGgpOwogICAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlMiwgcmVzdCB9OwogIH07Cn0KX19uYW1lKGJ1aWxkTWF0Y2hGbiwgImJ1aWxkTWF0Y2hGbiIpOwpmdW5jdGlvbiBmaW5kS2V5KG9iamVjdCwgcHJlZGljYXRlKSB7CiAgZm9yIChjb25zdCBrZXkyIGluIG9iamVjdCkgewogICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleTIpICYmIHByZWRpY2F0ZShvYmplY3Rba2V5Ml0pKSB7CiAgICAgIHJldHVybiBrZXkyOwogICAgfQogIH0KICByZXR1cm4gdm9pZCAwOwp9Cl9fbmFtZShmaW5kS2V5LCAiZmluZEtleSIpOwpmdW5jdGlvbiBmaW5kSW5kZXgyKGFycmF5LCBwcmVkaWNhdGUpIHsKICBmb3IgKGxldCBrZXkyID0gMDsga2V5MiA8IGFycmF5Lmxlbmd0aDsga2V5MisrKSB7CiAgICBpZiAocHJlZGljYXRlKGFycmF5W2tleTJdKSkgewogICAgICByZXR1cm4ga2V5MjsKICAgIH0KICB9CiAgcmV0dXJuIHZvaWQgMDsKfQpfX25hbWUoZmluZEluZGV4MiwgImZpbmRJbmRleCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvX2xpYi9idWlsZE1hdGNoUGF0dGVybkZuLmpzCmZ1bmN0aW9uIGJ1aWxkTWF0Y2hQYXR0ZXJuRm4oYXJncykgewogIHJldHVybiAoc3RyaW5nMywgb3B0aW9ucyA9IHt9KSA9PiB7CiAgICBjb25zdCBtYXRjaFJlc3VsdCA9IHN0cmluZzMubWF0Y2goYXJncy5tYXRjaFBhdHRlcm4pOwogICAgaWYgKCFtYXRjaFJlc3VsdCkgcmV0dXJuIG51bGw7CiAgICBjb25zdCBtYXRjaGVkU3RyaW5nID0gbWF0Y2hSZXN1bHRbMF07CiAgICBjb25zdCBwYXJzZVJlc3VsdCA9IHN0cmluZzMubWF0Y2goYXJncy5wYXJzZVBhdHRlcm4pOwogICAgaWYgKCFwYXJzZVJlc3VsdCkgcmV0dXJuIG51bGw7CiAgICBsZXQgdmFsdWUyID0gYXJncy52YWx1ZUNhbGxiYWNrID8gYXJncy52YWx1ZUNhbGxiYWNrKHBhcnNlUmVzdWx0WzBdKSA6IHBhcnNlUmVzdWx0WzBdOwogICAgdmFsdWUyID0gb3B0aW9ucy52YWx1ZUNhbGxiYWNrID8gb3B0aW9ucy52YWx1ZUNhbGxiYWNrKHZhbHVlMikgOiB2YWx1ZTI7CiAgICBjb25zdCByZXN0ID0gc3RyaW5nMy5zbGljZShtYXRjaGVkU3RyaW5nLmxlbmd0aCk7CiAgICByZXR1cm4geyB2YWx1ZTogdmFsdWUyLCByZXN0IH07CiAgfTsKfQpfX25hbWUoYnVpbGRNYXRjaFBhdHRlcm5GbiwgImJ1aWxkTWF0Y2hQYXR0ZXJuRm4iKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL2VuLVVTL19saWIvbWF0Y2guanMKdmFyIG1hdGNoT3JkaW5hbE51bWJlclBhdHRlcm4gPSAvXihcZCspKHRofHN0fG5kfHJkKT8vaTsKdmFyIHBhcnNlT3JkaW5hbE51bWJlclBhdHRlcm4gPSAvXGQrL2k7CnZhciBtYXRjaEVyYVBhdHRlcm5zID0gewogIG5hcnJvdzogL14oYnxhKS9pLAogIGFiYnJldmlhdGVkOiAvXihiXC4/XHM/Y1wuP3xiXC4/XHM/Y1wuP1xzP2VcLj98YVwuP1xzP2RcLj98Y1wuP1xzP2VcLj8pL2ksCiAgd2lkZTogL14oYmVmb3JlIGNocmlzdHxiZWZvcmUgY29tbW9uIGVyYXxhbm5vIGRvbWluaXxjb21tb24gZXJhKS9pCn07CnZhciBwYXJzZUVyYVBhdHRlcm5zID0gewogIGFueTogWy9eYi9pLCAvXihhfGMpL2ldCn07CnZhciBtYXRjaFF1YXJ0ZXJQYXR0ZXJucyA9IHsKICBuYXJyb3c6IC9eWzEyMzRdL2ksCiAgYWJicmV2aWF0ZWQ6IC9ecVsxMjM0XS9pLAogIHdpZGU6IC9eWzEyMzRdKHRofHN0fG5kfHJkKT8gcXVhcnRlci9pCn07CnZhciBwYXJzZVF1YXJ0ZXJQYXR0ZXJucyA9IHsKICBhbnk6IFsvMS9pLCAvMi9pLCAvMy9pLCAvNC9pXQp9Owp2YXIgbWF0Y2hNb250aFBhdHRlcm5zID0gewogIG5hcnJvdzogL15bamZtYXNvbmRdL2ksCiAgYWJicmV2aWF0ZWQ6IC9eKGphbnxmZWJ8bWFyfGFwcnxtYXl8anVufGp1bHxhdWd8c2VwfG9jdHxub3Z8ZGVjKS9pLAogIHdpZGU6IC9eKGphbnVhcnl8ZmVicnVhcnl8bWFyY2h8YXByaWx8bWF5fGp1bmV8anVseXxhdWd1c3R8c2VwdGVtYmVyfG9jdG9iZXJ8bm92ZW1iZXJ8ZGVjZW1iZXIpL2kKfTsKdmFyIHBhcnNlTW9udGhQYXR0ZXJucyA9IHsKICBuYXJyb3c6IFsKICAgIC9eai9pLAogICAgL15mL2ksCiAgICAvXm0vaSwKICAgIC9eYS9pLAogICAgL15tL2ksCiAgICAvXmovaSwKICAgIC9eai9pLAogICAgL15hL2ksCiAgICAvXnMvaSwKICAgIC9eby9pLAogICAgL15uL2ksCiAgICAvXmQvaQogIF0sCiAgYW55OiBbCiAgICAvXmphL2ksCiAgICAvXmYvaSwKICAgIC9ebWFyL2ksCiAgICAvXmFwL2ksCiAgICAvXm1heS9pLAogICAgL15qdW4vaSwKICAgIC9eanVsL2ksCiAgICAvXmF1L2ksCiAgICAvXnMvaSwKICAgIC9eby9pLAogICAgL15uL2ksCiAgICAvXmQvaQogIF0KfTsKdmFyIG1hdGNoRGF5UGF0dGVybnMgPSB7CiAgbmFycm93OiAvXltzbXR3Zl0vaSwKICBzaG9ydDogL14oc3V8bW98dHV8d2V8dGh8ZnJ8c2EpL2ksCiAgYWJicmV2aWF0ZWQ6IC9eKHN1bnxtb258dHVlfHdlZHx0aHV8ZnJpfHNhdCkvaSwKICB3aWRlOiAvXihzdW5kYXl8bW9uZGF5fHR1ZXNkYXl8d2VkbmVzZGF5fHRodXJzZGF5fGZyaWRheXxzYXR1cmRheSkvaQp9Owp2YXIgcGFyc2VEYXlQYXR0ZXJucyA9IHsKICBuYXJyb3c6IFsvXnMvaSwgL15tL2ksIC9edC9pLCAvXncvaSwgL150L2ksIC9eZi9pLCAvXnMvaV0sCiAgYW55OiBbL15zdS9pLCAvXm0vaSwgL150dS9pLCAvXncvaSwgL150aC9pLCAvXmYvaSwgL15zYS9pXQp9Owp2YXIgbWF0Y2hEYXlQZXJpb2RQYXR0ZXJucyA9IHsKICBuYXJyb3c6IC9eKGF8cHxtaXxufChpbiB0aGV8YXQpIChtb3JuaW5nfGFmdGVybm9vbnxldmVuaW5nfG5pZ2h0KSkvaSwKICBhbnk6IC9eKFthcF1cLj9ccz9tXC4/fG1pZG5pZ2h0fG5vb258KGluIHRoZXxhdCkgKG1vcm5pbmd8YWZ0ZXJub29ufGV2ZW5pbmd8bmlnaHQpKS9pCn07CnZhciBwYXJzZURheVBlcmlvZFBhdHRlcm5zID0gewogIGFueTogewogICAgYW06IC9eYS9pLAogICAgcG06IC9ecC9pLAogICAgbWlkbmlnaHQ6IC9ebWkvaSwKICAgIG5vb246IC9ebm8vaSwKICAgIG1vcm5pbmc6IC9tb3JuaW5nL2ksCiAgICBhZnRlcm5vb246IC9hZnRlcm5vb24vaSwKICAgIGV2ZW5pbmc6IC9ldmVuaW5nL2ksCiAgICBuaWdodDogL25pZ2h0L2kKICB9Cn07CnZhciBtYXRjaCA9IHsKICBvcmRpbmFsTnVtYmVyOiBidWlsZE1hdGNoUGF0dGVybkZuKHsKICAgIG1hdGNoUGF0dGVybjogbWF0Y2hPcmRpbmFsTnVtYmVyUGF0dGVybiwKICAgIHBhcnNlUGF0dGVybjogcGFyc2VPcmRpbmFsTnVtYmVyUGF0dGVybiwKICAgIHZhbHVlQ2FsbGJhY2s6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHZhbHVlMikgPT4gcGFyc2VJbnQodmFsdWUyLCAxMCksICJ2YWx1ZUNhbGxiYWNrIikKICB9KSwKICBlcmE6IGJ1aWxkTWF0Y2hGbih7CiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaEVyYVBhdHRlcm5zLAogICAgZGVmYXVsdE1hdGNoV2lkdGg6ICJ3aWRlIiwKICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlRXJhUGF0dGVybnMsCiAgICBkZWZhdWx0UGFyc2VXaWR0aDogImFueSIKICB9KSwKICBxdWFydGVyOiBidWlsZE1hdGNoRm4oewogICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hRdWFydGVyUGF0dGVybnMsCiAgICBkZWZhdWx0TWF0Y2hXaWR0aDogIndpZGUiLAogICAgcGFyc2VQYXR0ZXJuczogcGFyc2VRdWFydGVyUGF0dGVybnMsCiAgICBkZWZhdWx0UGFyc2VXaWR0aDogImFueSIsCiAgICB2YWx1ZUNhbGxiYWNrOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKChpbmRleDIpID0+IGluZGV4MiArIDEsICJ2YWx1ZUNhbGxiYWNrIikKICB9KSwKICBtb250aDogYnVpbGRNYXRjaEZuKHsKICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoTW9udGhQYXR0ZXJucywKICAgIGRlZmF1bHRNYXRjaFdpZHRoOiAid2lkZSIsCiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZU1vbnRoUGF0dGVybnMsCiAgICBkZWZhdWx0UGFyc2VXaWR0aDogImFueSIKICB9KSwKICBkYXk6IGJ1aWxkTWF0Y2hGbih7CiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaERheVBhdHRlcm5zLAogICAgZGVmYXVsdE1hdGNoV2lkdGg6ICJ3aWRlIiwKICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlRGF5UGF0dGVybnMsCiAgICBkZWZhdWx0UGFyc2VXaWR0aDogImFueSIKICB9KSwKICBkYXlQZXJpb2Q6IGJ1aWxkTWF0Y2hGbih7CiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaERheVBlcmlvZFBhdHRlcm5zLAogICAgZGVmYXVsdE1hdGNoV2lkdGg6ICJhbnkiLAogICAgcGFyc2VQYXR0ZXJuczogcGFyc2VEYXlQZXJpb2RQYXR0ZXJucywKICAgIGRlZmF1bHRQYXJzZVdpZHRoOiAiYW55IgogIH0pCn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9lbi1VUy5qcwp2YXIgZW5VUyA9IHsKICBjb2RlOiAiZW4tVVMiLAogIGZvcm1hdERpc3RhbmNlLAogIGZvcm1hdExvbmcsCiAgZm9ybWF0UmVsYXRpdmUsCiAgbG9jYWxpemUsCiAgbWF0Y2gsCiAgb3B0aW9uczogewogICAgd2Vla1N0YXJ0c09uOiAwLAogICAgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiAxCiAgfQp9Owp2YXIgZW5fVVNfZGVmYXVsdCA9IGVuVVM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldERheU9mWWVhci5qcwpmdW5jdGlvbiBnZXREYXlPZlllYXIoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCBkaWZmID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKF9kYXRlLCBzdGFydE9mWWVhcihfZGF0ZSkpOwogIGNvbnN0IGRheU9mWWVhciA9IGRpZmYgKyAxOwogIHJldHVybiBkYXlPZlllYXI7Cn0KX19uYW1lKGdldERheU9mWWVhciwgImdldERheU9mWWVhciIpOwp2YXIgZ2V0RGF5T2ZZZWFyX2RlZmF1bHQgPSBnZXREYXlPZlllYXI7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldElTT1dlZWsuanMKZnVuY3Rpb24gZ2V0SVNPV2VlayhkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGNvbnN0IGRpZmYgPSArc3RhcnRPZklTT1dlZWsoX2RhdGUpIC0gK3N0YXJ0T2ZJU09XZWVrWWVhcihfZGF0ZSk7CiAgcmV0dXJuIE1hdGgucm91bmQoZGlmZiAvIG1pbGxpc2Vjb25kc0luV2VlaykgKyAxOwp9Cl9fbmFtZShnZXRJU09XZWVrLCAiZ2V0SVNPV2VlayIpOwp2YXIgZ2V0SVNPV2Vla19kZWZhdWx0ID0gZ2V0SVNPV2VlazsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0V2Vla1llYXIuanMKZnVuY3Rpb24gZ2V0V2Vla1llYXIoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCB5ZWFyID0gX2RhdGUuZ2V0RnVsbFllYXIoKTsKICBjb25zdCBkZWZhdWx0T3B0aW9uczIgPSBnZXREZWZhdWx0T3B0aW9ucygpOwogIGNvbnN0IGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9IG9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyBkZWZhdWx0T3B0aW9uczIuZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/IGRlZmF1bHRPcHRpb25zMi5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyAxOwogIGNvbnN0IGZpcnN0V2Vla09mTmV4dFllYXIgPSBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIDApOwogIGZpcnN0V2Vla09mTmV4dFllYXIuc2V0RnVsbFllYXIoeWVhciArIDEsIDAsIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSk7CiAgZmlyc3RXZWVrT2ZOZXh0WWVhci5zZXRIb3VycygwLCAwLCAwLCAwKTsKICBjb25zdCBzdGFydE9mTmV4dFllYXIgPSBzdGFydE9mV2VlayhmaXJzdFdlZWtPZk5leHRZZWFyLCBvcHRpb25zKTsKICBjb25zdCBmaXJzdFdlZWtPZlRoaXNZZWFyID0gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCAwKTsKICBmaXJzdFdlZWtPZlRoaXNZZWFyLnNldEZ1bGxZZWFyKHllYXIsIDAsIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSk7CiAgZmlyc3RXZWVrT2ZUaGlzWWVhci5zZXRIb3VycygwLCAwLCAwLCAwKTsKICBjb25zdCBzdGFydE9mVGhpc1llYXIgPSBzdGFydE9mV2VlayhmaXJzdFdlZWtPZlRoaXNZZWFyLCBvcHRpb25zKTsKICBpZiAoK19kYXRlID49ICtzdGFydE9mTmV4dFllYXIpIHsKICAgIHJldHVybiB5ZWFyICsgMTsKICB9IGVsc2UgaWYgKCtfZGF0ZSA+PSArc3RhcnRPZlRoaXNZZWFyKSB7CiAgICByZXR1cm4geWVhcjsKICB9IGVsc2UgewogICAgcmV0dXJuIHllYXIgLSAxOwogIH0KfQpfX25hbWUoZ2V0V2Vla1llYXIsICJnZXRXZWVrWWVhciIpOwp2YXIgZ2V0V2Vla1llYXJfZGVmYXVsdCA9IGdldFdlZWtZZWFyOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mV2Vla1llYXIuanMKZnVuY3Rpb24gc3RhcnRPZldlZWtZZWFyKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBkZWZhdWx0T3B0aW9uczIgPSBnZXREZWZhdWx0T3B0aW9ucygpOwogIGNvbnN0IGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9IG9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyBkZWZhdWx0T3B0aW9uczIuZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/IGRlZmF1bHRPcHRpb25zMi5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyAxOwogIGNvbnN0IHllYXIgPSBnZXRXZWVrWWVhcihkYXRlLCBvcHRpb25zKTsKICBjb25zdCBmaXJzdFdlZWsgPSBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIDApOwogIGZpcnN0V2Vlay5zZXRGdWxsWWVhcih5ZWFyLCAwLCBmaXJzdFdlZWtDb250YWluc0RhdGUpOwogIGZpcnN0V2Vlay5zZXRIb3VycygwLCAwLCAwLCAwKTsKICBjb25zdCBfZGF0ZSA9IHN0YXJ0T2ZXZWVrKGZpcnN0V2Vlaywgb3B0aW9ucyk7CiAgcmV0dXJuIF9kYXRlOwp9Cl9fbmFtZShzdGFydE9mV2Vla1llYXIsICJzdGFydE9mV2Vla1llYXIiKTsKdmFyIHN0YXJ0T2ZXZWVrWWVhcl9kZWZhdWx0ID0gc3RhcnRPZldlZWtZZWFyOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRXZWVrLmpzCmZ1bmN0aW9uIGdldFdlZWsoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCBkaWZmID0gK3N0YXJ0T2ZXZWVrKF9kYXRlLCBvcHRpb25zKSAtICtzdGFydE9mV2Vla1llYXIoX2RhdGUsIG9wdGlvbnMpOwogIHJldHVybiBNYXRoLnJvdW5kKGRpZmYgLyBtaWxsaXNlY29uZHNJbldlZWspICsgMTsKfQpfX25hbWUoZ2V0V2VlaywgImdldFdlZWsiKTsKdmFyIGdldFdlZWtfZGVmYXVsdCA9IGdldFdlZWs7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvYWRkTGVhZGluZ1plcm9zLmpzCmZ1bmN0aW9uIGFkZExlYWRpbmdaZXJvcyhudW1iZXIyLCB0YXJnZXRMZW5ndGgpIHsKICBjb25zdCBzaWduID0gbnVtYmVyMiA8IDAgPyAiLSIgOiAiIjsKICBjb25zdCBvdXRwdXQgPSBNYXRoLmFicyhudW1iZXIyKS50b1N0cmluZygpLnBhZFN0YXJ0KHRhcmdldExlbmd0aCwgIjAiKTsKICByZXR1cm4gc2lnbiArIG91dHB1dDsKfQpfX25hbWUoYWRkTGVhZGluZ1plcm9zLCAiYWRkTGVhZGluZ1plcm9zIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvZm9ybWF0L2xpZ2h0Rm9ybWF0dGVycy5qcwp2YXIgbGlnaHRGb3JtYXR0ZXJzID0gewogIC8vIFllYXIKICB5KGRhdGUsIHRva2VuKSB7CiAgICBjb25zdCBzaWduZWRZZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpOwogICAgY29uc3QgeWVhciA9IHNpZ25lZFllYXIgPiAwID8gc2lnbmVkWWVhciA6IDEgLSBzaWduZWRZZWFyOwogICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyh0b2tlbiA9PT0gInl5IiA/IHllYXIgJSAxMDAgOiB5ZWFyLCB0b2tlbi5sZW5ndGgpOwogIH0sCiAgLy8gTW9udGgKICBNKGRhdGUsIHRva2VuKSB7CiAgICBjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKTsKICAgIHJldHVybiB0b2tlbiA9PT0gIk0iID8gU3RyaW5nKG1vbnRoICsgMSkgOiBhZGRMZWFkaW5nWmVyb3MobW9udGggKyAxLCAyKTsKICB9LAogIC8vIERheSBvZiB0aGUgbW9udGgKICBkKGRhdGUsIHRva2VuKSB7CiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRhdGUuZ2V0RGF0ZSgpLCB0b2tlbi5sZW5ndGgpOwogIH0sCiAgLy8gQU0gb3IgUE0KICBhKGRhdGUsIHRva2VuKSB7CiAgICBjb25zdCBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXRlLmdldEhvdXJzKCkgLyAxMiA+PSAxID8gInBtIiA6ICJhbSI7CiAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgIGNhc2UgImEiOgogICAgICBjYXNlICJhYSI6CiAgICAgICAgcmV0dXJuIGRheVBlcmlvZEVudW1WYWx1ZS50b1VwcGVyQ2FzZSgpOwogICAgICBjYXNlICJhYWEiOgogICAgICAgIHJldHVybiBkYXlQZXJpb2RFbnVtVmFsdWU7CiAgICAgIGNhc2UgImFhYWFhIjoKICAgICAgICByZXR1cm4gZGF5UGVyaW9kRW51bVZhbHVlWzBdOwogICAgICBjYXNlICJhYWFhIjoKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gZGF5UGVyaW9kRW51bVZhbHVlID09PSAiYW0iID8gImEubS4iIDogInAubS4iOwogICAgfQogIH0sCiAgLy8gSG91ciBbMS0xMl0KICBoKGRhdGUsIHRva2VuKSB7CiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRhdGUuZ2V0SG91cnMoKSAlIDEyIHx8IDEyLCB0b2tlbi5sZW5ndGgpOwogIH0sCiAgLy8gSG91ciBbMC0yM10KICBIKGRhdGUsIHRva2VuKSB7CiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRhdGUuZ2V0SG91cnMoKSwgdG9rZW4ubGVuZ3RoKTsKICB9LAogIC8vIE1pbnV0ZQogIG0oZGF0ZSwgdG9rZW4pIHsKICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoZGF0ZS5nZXRNaW51dGVzKCksIHRva2VuLmxlbmd0aCk7CiAgfSwKICAvLyBTZWNvbmQKICBzKGRhdGUsIHRva2VuKSB7CiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRhdGUuZ2V0U2Vjb25kcygpLCB0b2tlbi5sZW5ndGgpOwogIH0sCiAgLy8gRnJhY3Rpb24gb2Ygc2Vjb25kCiAgUyhkYXRlLCB0b2tlbikgewogICAgY29uc3QgbnVtYmVyT2ZEaWdpdHMgPSB0b2tlbi5sZW5ndGg7CiAgICBjb25zdCBtaWxsaXNlY29uZHMyID0gZGF0ZS5nZXRNaWxsaXNlY29uZHMoKTsKICAgIGNvbnN0IGZyYWN0aW9uYWxTZWNvbmRzID0gTWF0aC50cnVuYygKICAgICAgbWlsbGlzZWNvbmRzMiAqIE1hdGgucG93KDEwLCBudW1iZXJPZkRpZ2l0cyAtIDMpCiAgICApOwogICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhmcmFjdGlvbmFsU2Vjb25kcywgdG9rZW4ubGVuZ3RoKTsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvZm9ybWF0L2Zvcm1hdHRlcnMuanMKdmFyIGRheVBlcmlvZEVudW0gPSB7CiAgYW06ICJhbSIsCiAgcG06ICJwbSIsCiAgbWlkbmlnaHQ6ICJtaWRuaWdodCIsCiAgbm9vbjogIm5vb24iLAogIG1vcm5pbmc6ICJtb3JuaW5nIiwKICBhZnRlcm5vb246ICJhZnRlcm5vb24iLAogIGV2ZW5pbmc6ICJldmVuaW5nIiwKICBuaWdodDogIm5pZ2h0Igp9Owp2YXIgZm9ybWF0dGVycyA9IHsKICAvLyBFcmEKICBHOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGRhdGUsIHRva2VuLCBsb2NhbGl6ZTIpIHsKICAgIGNvbnN0IGVyYSA9IGRhdGUuZ2V0RnVsbFllYXIoKSA+IDAgPyAxIDogMDsKICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgLy8gQUQsIEJDCiAgICAgIGNhc2UgIkciOgogICAgICBjYXNlICJHRyI6CiAgICAgIGNhc2UgIkdHRyI6CiAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5lcmEoZXJhLCB7IHdpZHRoOiAiYWJicmV2aWF0ZWQiIH0pOwogICAgICAvLyBBLCBCCiAgICAgIGNhc2UgIkdHR0dHIjoKICAgICAgICByZXR1cm4gbG9jYWxpemUyLmVyYShlcmEsIHsgd2lkdGg6ICJuYXJyb3ciIH0pOwogICAgICAvLyBBbm5vIERvbWluaSwgQmVmb3JlIENocmlzdAogICAgICBjYXNlICJHR0dHIjoKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gbG9jYWxpemUyLmVyYShlcmEsIHsgd2lkdGg6ICJ3aWRlIiB9KTsKICAgIH0KICB9LCAiRyIpLAogIC8vIFllYXIKICB5OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGRhdGUsIHRva2VuLCBsb2NhbGl6ZTIpIHsKICAgIGlmICh0b2tlbiA9PT0gInlvIikgewogICAgICBjb25zdCBzaWduZWRZZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpOwogICAgICBjb25zdCB5ZWFyID0gc2lnbmVkWWVhciA+IDAgPyBzaWduZWRZZWFyIDogMSAtIHNpZ25lZFllYXI7CiAgICAgIHJldHVybiBsb2NhbGl6ZTIub3JkaW5hbE51bWJlcih5ZWFyLCB7IHVuaXQ6ICJ5ZWFyIiB9KTsKICAgIH0KICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMueShkYXRlLCB0b2tlbik7CiAgfSwgInkiKSwKICAvLyBMb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyCiAgWTogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihkYXRlLCB0b2tlbiwgbG9jYWxpemUyLCBvcHRpb25zKSB7CiAgICBjb25zdCBzaWduZWRXZWVrWWVhciA9IGdldFdlZWtZZWFyKGRhdGUsIG9wdGlvbnMpOwogICAgY29uc3Qgd2Vla1llYXIgPSBzaWduZWRXZWVrWWVhciA+IDAgPyBzaWduZWRXZWVrWWVhciA6IDEgLSBzaWduZWRXZWVrWWVhcjsKICAgIGlmICh0b2tlbiA9PT0gIllZIikgewogICAgICBjb25zdCB0d29EaWdpdFllYXIgPSB3ZWVrWWVhciAlIDEwMDsKICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyh0d29EaWdpdFllYXIsIDIpOwogICAgfQogICAgaWYgKHRva2VuID09PSAiWW8iKSB7CiAgICAgIHJldHVybiBsb2NhbGl6ZTIub3JkaW5hbE51bWJlcih3ZWVrWWVhciwgeyB1bml0OiAieWVhciIgfSk7CiAgICB9CiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHdlZWtZZWFyLCB0b2tlbi5sZW5ndGgpOwogIH0sICJZIiksCiAgLy8gSVNPIHdlZWstbnVtYmVyaW5nIHllYXIKICBSOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGRhdGUsIHRva2VuKSB7CiAgICBjb25zdCBpc29XZWVrWWVhciA9IGdldElTT1dlZWtZZWFyKGRhdGUpOwogICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhpc29XZWVrWWVhciwgdG9rZW4ubGVuZ3RoKTsKICB9LCAiUiIpLAogIC8vIEV4dGVuZGVkIHllYXIuIFRoaXMgaXMgYSBzaW5nbGUgbnVtYmVyIGRlc2lnbmF0aW5nIHRoZSB5ZWFyIG9mIHRoaXMgY2FsZW5kYXIgc3lzdGVtLgogIC8vIFRoZSBtYWluIGRpZmZlcmVuY2UgYmV0d2VlbiBgeWAgYW5kIGB1YCBsb2NhbGl6ZXJzIGFyZSBCLkMuIHllYXJzOgogIC8vIHwgWWVhciB8IGB5YCB8IGB1YCB8CiAgLy8gfC0tLS0tLXwtLS0tLXwtLS0tLXwKICAvLyB8IEFDIDEgfCAgIDEgfCAgIDEgfAogIC8vIHwgQkMgMSB8ICAgMSB8ICAgMCB8CiAgLy8gfCBCQyAyIHwgICAyIHwgIC0xIHwKICAvLyBBbHNvIGB5eWAgYWx3YXlzIHJldHVybnMgdGhlIGxhc3QgdHdvIGRpZ2l0cyBvZiBhIHllYXIsCiAgLy8gd2hpbGUgYHV1YCBwYWRzIHNpbmdsZSBkaWdpdCB5ZWFycyB0byAyIGNoYXJhY3RlcnMgYW5kIHJldHVybnMgb3RoZXIgeWVhcnMgdW5jaGFuZ2VkLgogIHU6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oZGF0ZSwgdG9rZW4pIHsKICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7CiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHllYXIsIHRva2VuLmxlbmd0aCk7CiAgfSwgInUiKSwKICAvLyBRdWFydGVyCiAgUTogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihkYXRlLCB0b2tlbiwgbG9jYWxpemUyKSB7CiAgICBjb25zdCBxdWFydGVyID0gTWF0aC5jZWlsKChkYXRlLmdldE1vbnRoKCkgKyAxKSAvIDMpOwogICAgc3dpdGNoICh0b2tlbikgewogICAgICAvLyAxLCAyLCAzLCA0CiAgICAgIGNhc2UgIlEiOgogICAgICAgIHJldHVybiBTdHJpbmcocXVhcnRlcik7CiAgICAgIC8vIDAxLCAwMiwgMDMsIDA0CiAgICAgIGNhc2UgIlFRIjoKICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHF1YXJ0ZXIsIDIpOwogICAgICAvLyAxc3QsIDJuZCwgM3JkLCA0dGgKICAgICAgY2FzZSAiUW8iOgogICAgICAgIHJldHVybiBsb2NhbGl6ZTIub3JkaW5hbE51bWJlcihxdWFydGVyLCB7IHVuaXQ6ICJxdWFydGVyIiB9KTsKICAgICAgLy8gUTEsIFEyLCBRMywgUTQKICAgICAgY2FzZSAiUVFRIjoKICAgICAgICByZXR1cm4gbG9jYWxpemUyLnF1YXJ0ZXIocXVhcnRlciwgewogICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICB9KTsKICAgICAgLy8gMSwgMiwgMywgNCAobmFycm93IHF1YXJ0ZXI7IGNvdWxkIGJlIG5vdCBudW1lcmljYWwpCiAgICAgIGNhc2UgIlFRUVFRIjoKICAgICAgICByZXR1cm4gbG9jYWxpemUyLnF1YXJ0ZXIocXVhcnRlciwgewogICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSk7CiAgICAgIC8vIDFzdCBxdWFydGVyLCAybmQgcXVhcnRlciwgLi4uCiAgICAgIGNhc2UgIlFRUVEiOgogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBsb2NhbGl6ZTIucXVhcnRlcihxdWFydGVyLCB7CiAgICAgICAgICB3aWR0aDogIndpZGUiLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSk7CiAgICB9CiAgfSwgIlEiKSwKICAvLyBTdGFuZC1hbG9uZSBxdWFydGVyCiAgcTogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihkYXRlLCB0b2tlbiwgbG9jYWxpemUyKSB7CiAgICBjb25zdCBxdWFydGVyID0gTWF0aC5jZWlsKChkYXRlLmdldE1vbnRoKCkgKyAxKSAvIDMpOwogICAgc3dpdGNoICh0b2tlbikgewogICAgICAvLyAxLCAyLCAzLCA0CiAgICAgIGNhc2UgInEiOgogICAgICAgIHJldHVybiBTdHJpbmcocXVhcnRlcik7CiAgICAgIC8vIDAxLCAwMiwgMDMsIDA0CiAgICAgIGNhc2UgInFxIjoKICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHF1YXJ0ZXIsIDIpOwogICAgICAvLyAxc3QsIDJuZCwgM3JkLCA0dGgKICAgICAgY2FzZSAicW8iOgogICAgICAgIHJldHVybiBsb2NhbGl6ZTIub3JkaW5hbE51bWJlcihxdWFydGVyLCB7IHVuaXQ6ICJxdWFydGVyIiB9KTsKICAgICAgLy8gUTEsIFEyLCBRMywgUTQKICAgICAgY2FzZSAicXFxIjoKICAgICAgICByZXR1cm4gbG9jYWxpemUyLnF1YXJ0ZXIocXVhcnRlciwgewogICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICBjb250ZXh0OiAic3RhbmRhbG9uZSIKICAgICAgICB9KTsKICAgICAgLy8gMSwgMiwgMywgNCAobmFycm93IHF1YXJ0ZXI7IGNvdWxkIGJlIG5vdCBudW1lcmljYWwpCiAgICAgIGNhc2UgInFxcXFxIjoKICAgICAgICByZXR1cm4gbG9jYWxpemUyLnF1YXJ0ZXIocXVhcnRlciwgewogICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgY29udGV4dDogInN0YW5kYWxvbmUiCiAgICAgICAgfSk7CiAgICAgIC8vIDFzdCBxdWFydGVyLCAybmQgcXVhcnRlciwgLi4uCiAgICAgIGNhc2UgInFxcXEiOgogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBsb2NhbGl6ZTIucXVhcnRlcihxdWFydGVyLCB7CiAgICAgICAgICB3aWR0aDogIndpZGUiLAogICAgICAgICAgY29udGV4dDogInN0YW5kYWxvbmUiCiAgICAgICAgfSk7CiAgICB9CiAgfSwgInEiKSwKICAvLyBNb250aAogIE06IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oZGF0ZSwgdG9rZW4sIGxvY2FsaXplMikgewogICAgY29uc3QgbW9udGggPSBkYXRlLmdldE1vbnRoKCk7CiAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgIGNhc2UgIk0iOgogICAgICBjYXNlICJNTSI6CiAgICAgICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy5NKGRhdGUsIHRva2VuKTsKICAgICAgLy8gMXN0LCAybmQsIC4uLiwgMTJ0aAogICAgICBjYXNlICJNbyI6CiAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5vcmRpbmFsTnVtYmVyKG1vbnRoICsgMSwgeyB1bml0OiAibW9udGgiIH0pOwogICAgICAvLyBKYW4sIEZlYiwgLi4uLCBEZWMKICAgICAgY2FzZSAiTU1NIjoKICAgICAgICByZXR1cm4gbG9jYWxpemUyLm1vbnRoKG1vbnRoLCB7CiAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pOwogICAgICAvLyBKLCBGLCAuLi4sIEQKICAgICAgY2FzZSAiTU1NTU0iOgogICAgICAgIHJldHVybiBsb2NhbGl6ZTIubW9udGgobW9udGgsIHsKICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pOwogICAgICAvLyBKYW51YXJ5LCBGZWJydWFyeSwgLi4uLCBEZWNlbWJlcgogICAgICBjYXNlICJNTU1NIjoKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gbG9jYWxpemUyLm1vbnRoKG1vbnRoLCB7IHdpZHRoOiAid2lkZSIsIGNvbnRleHQ6ICJmb3JtYXR0aW5nIiB9KTsKICAgIH0KICB9LCAiTSIpLAogIC8vIFN0YW5kLWFsb25lIG1vbnRoCiAgTDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihkYXRlLCB0b2tlbiwgbG9jYWxpemUyKSB7CiAgICBjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKTsKICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgLy8gMSwgMiwgLi4uLCAxMgogICAgICBjYXNlICJMIjoKICAgICAgICByZXR1cm4gU3RyaW5nKG1vbnRoICsgMSk7CiAgICAgIC8vIDAxLCAwMiwgLi4uLCAxMgogICAgICBjYXNlICJMTCI6CiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhtb250aCArIDEsIDIpOwogICAgICAvLyAxc3QsIDJuZCwgLi4uLCAxMnRoCiAgICAgIGNhc2UgIkxvIjoKICAgICAgICByZXR1cm4gbG9jYWxpemUyLm9yZGluYWxOdW1iZXIobW9udGggKyAxLCB7IHVuaXQ6ICJtb250aCIgfSk7CiAgICAgIC8vIEphbiwgRmViLCAuLi4sIERlYwogICAgICBjYXNlICJMTEwiOgogICAgICAgIHJldHVybiBsb2NhbGl6ZTIubW9udGgobW9udGgsIHsKICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgY29udGV4dDogInN0YW5kYWxvbmUiCiAgICAgICAgfSk7CiAgICAgIC8vIEosIEYsIC4uLiwgRAogICAgICBjYXNlICJMTExMTCI6CiAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5tb250aChtb250aCwgewogICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgY29udGV4dDogInN0YW5kYWxvbmUiCiAgICAgICAgfSk7CiAgICAgIC8vIEphbnVhcnksIEZlYnJ1YXJ5LCAuLi4sIERlY2VtYmVyCiAgICAgIGNhc2UgIkxMTEwiOgogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBsb2NhbGl6ZTIubW9udGgobW9udGgsIHsgd2lkdGg6ICJ3aWRlIiwgY29udGV4dDogInN0YW5kYWxvbmUiIH0pOwogICAgfQogIH0sICJMIiksCiAgLy8gTG9jYWwgd2VlayBvZiB5ZWFyCiAgdzogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihkYXRlLCB0b2tlbiwgbG9jYWxpemUyLCBvcHRpb25zKSB7CiAgICBjb25zdCB3ZWVrID0gZ2V0V2VlayhkYXRlLCBvcHRpb25zKTsKICAgIGlmICh0b2tlbiA9PT0gIndvIikgewogICAgICByZXR1cm4gbG9jYWxpemUyLm9yZGluYWxOdW1iZXIod2VlaywgeyB1bml0OiAid2VlayIgfSk7CiAgICB9CiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHdlZWssIHRva2VuLmxlbmd0aCk7CiAgfSwgInciKSwKICAvLyBJU08gd2VlayBvZiB5ZWFyCiAgSTogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihkYXRlLCB0b2tlbiwgbG9jYWxpemUyKSB7CiAgICBjb25zdCBpc29XZWVrID0gZ2V0SVNPV2VlayhkYXRlKTsKICAgIGlmICh0b2tlbiA9PT0gIklvIikgewogICAgICByZXR1cm4gbG9jYWxpemUyLm9yZGluYWxOdW1iZXIoaXNvV2VlaywgeyB1bml0OiAid2VlayIgfSk7CiAgICB9CiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGlzb1dlZWssIHRva2VuLmxlbmd0aCk7CiAgfSwgIkkiKSwKICAvLyBEYXkgb2YgdGhlIG1vbnRoCiAgZDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihkYXRlLCB0b2tlbiwgbG9jYWxpemUyKSB7CiAgICBpZiAodG9rZW4gPT09ICJkbyIpIHsKICAgICAgcmV0dXJuIGxvY2FsaXplMi5vcmRpbmFsTnVtYmVyKGRhdGUuZ2V0RGF0ZSgpLCB7IHVuaXQ6ICJkYXRlIiB9KTsKICAgIH0KICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMuZChkYXRlLCB0b2tlbik7CiAgfSwgImQiKSwKICAvLyBEYXkgb2YgeWVhcgogIEQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oZGF0ZSwgdG9rZW4sIGxvY2FsaXplMikgewogICAgY29uc3QgZGF5T2ZZZWFyID0gZ2V0RGF5T2ZZZWFyKGRhdGUpOwogICAgaWYgKHRva2VuID09PSAiRG8iKSB7CiAgICAgIHJldHVybiBsb2NhbGl6ZTIub3JkaW5hbE51bWJlcihkYXlPZlllYXIsIHsgdW5pdDogImRheU9mWWVhciIgfSk7CiAgICB9CiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRheU9mWWVhciwgdG9rZW4ubGVuZ3RoKTsKICB9LCAiRCIpLAogIC8vIERheSBvZiB3ZWVrCiAgRTogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihkYXRlLCB0b2tlbiwgbG9jYWxpemUyKSB7CiAgICBjb25zdCBkYXlPZldlZWsgPSBkYXRlLmdldERheSgpOwogICAgc3dpdGNoICh0b2tlbikgewogICAgICAvLyBUdWUKICAgICAgY2FzZSAiRSI6CiAgICAgIGNhc2UgIkVFIjoKICAgICAgY2FzZSAiRUVFIjoKICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheShkYXlPZldlZWssIHsKICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSk7CiAgICAgIC8vIFQKICAgICAgY2FzZSAiRUVFRUUiOgogICAgICAgIHJldHVybiBsb2NhbGl6ZTIuZGF5KGRheU9mV2VlaywgewogICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSk7CiAgICAgIC8vIFR1CiAgICAgIGNhc2UgIkVFRUVFRSI6CiAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5kYXkoZGF5T2ZXZWVrLCB7CiAgICAgICAgICB3aWR0aDogInNob3J0IiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pOwogICAgICAvLyBUdWVzZGF5CiAgICAgIGNhc2UgIkVFRUUiOgogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBsb2NhbGl6ZTIuZGF5KGRheU9mV2VlaywgewogICAgICAgICAgd2lkdGg6ICJ3aWRlIiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pOwogICAgfQogIH0sICJFIiksCiAgLy8gTG9jYWwgZGF5IG9mIHdlZWsKICBlOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGRhdGUsIHRva2VuLCBsb2NhbGl6ZTIsIG9wdGlvbnMpIHsKICAgIGNvbnN0IGRheU9mV2VlayA9IGRhdGUuZ2V0RGF5KCk7CiAgICBjb25zdCBsb2NhbERheU9mV2VlayA9IChkYXlPZldlZWsgLSBvcHRpb25zLndlZWtTdGFydHNPbiArIDgpICUgNyB8fCA3OwogICAgc3dpdGNoICh0b2tlbikgewogICAgICAvLyBOdW1lcmljYWwgdmFsdWUgKE50aCBkYXkgb2Ygd2VlayB3aXRoIGN1cnJlbnQgbG9jYWxlIG9yIHdlZWtTdGFydHNPbikKICAgICAgY2FzZSAiZSI6CiAgICAgICAgcmV0dXJuIFN0cmluZyhsb2NhbERheU9mV2Vlayk7CiAgICAgIC8vIFBhZGRlZCBudW1lcmljYWwgdmFsdWUKICAgICAgY2FzZSAiZWUiOgogICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MobG9jYWxEYXlPZldlZWssIDIpOwogICAgICAvLyAxc3QsIDJuZCwgLi4uLCA3dGgKICAgICAgY2FzZSAiZW8iOgogICAgICAgIHJldHVybiBsb2NhbGl6ZTIub3JkaW5hbE51bWJlcihsb2NhbERheU9mV2VlaywgeyB1bml0OiAiZGF5IiB9KTsKICAgICAgY2FzZSAiZWVlIjoKICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheShkYXlPZldlZWssIHsKICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSk7CiAgICAgIC8vIFQKICAgICAgY2FzZSAiZWVlZWUiOgogICAgICAgIHJldHVybiBsb2NhbGl6ZTIuZGF5KGRheU9mV2VlaywgewogICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSk7CiAgICAgIC8vIFR1CiAgICAgIGNhc2UgImVlZWVlZSI6CiAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5kYXkoZGF5T2ZXZWVrLCB7CiAgICAgICAgICB3aWR0aDogInNob3J0IiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pOwogICAgICAvLyBUdWVzZGF5CiAgICAgIGNhc2UgImVlZWUiOgogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBsb2NhbGl6ZTIuZGF5KGRheU9mV2VlaywgewogICAgICAgICAgd2lkdGg6ICJ3aWRlIiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pOwogICAgfQogIH0sICJlIiksCiAgLy8gU3RhbmQtYWxvbmUgbG9jYWwgZGF5IG9mIHdlZWsKICBjOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGRhdGUsIHRva2VuLCBsb2NhbGl6ZTIsIG9wdGlvbnMpIHsKICAgIGNvbnN0IGRheU9mV2VlayA9IGRhdGUuZ2V0RGF5KCk7CiAgICBjb25zdCBsb2NhbERheU9mV2VlayA9IChkYXlPZldlZWsgLSBvcHRpb25zLndlZWtTdGFydHNPbiArIDgpICUgNyB8fCA3OwogICAgc3dpdGNoICh0b2tlbikgewogICAgICAvLyBOdW1lcmljYWwgdmFsdWUgKHNhbWUgYXMgaW4gYGVgKQogICAgICBjYXNlICJjIjoKICAgICAgICByZXR1cm4gU3RyaW5nKGxvY2FsRGF5T2ZXZWVrKTsKICAgICAgLy8gUGFkZGVkIG51bWVyaWNhbCB2YWx1ZQogICAgICBjYXNlICJjYyI6CiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhsb2NhbERheU9mV2VlaywgdG9rZW4ubGVuZ3RoKTsKICAgICAgLy8gMXN0LCAybmQsIC4uLiwgN3RoCiAgICAgIGNhc2UgImNvIjoKICAgICAgICByZXR1cm4gbG9jYWxpemUyLm9yZGluYWxOdW1iZXIobG9jYWxEYXlPZldlZWssIHsgdW5pdDogImRheSIgfSk7CiAgICAgIGNhc2UgImNjYyI6CiAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5kYXkoZGF5T2ZXZWVrLCB7CiAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgIGNvbnRleHQ6ICJzdGFuZGFsb25lIgogICAgICAgIH0pOwogICAgICAvLyBUCiAgICAgIGNhc2UgImNjY2NjIjoKICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheShkYXlPZldlZWssIHsKICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgIGNvbnRleHQ6ICJzdGFuZGFsb25lIgogICAgICAgIH0pOwogICAgICAvLyBUdQogICAgICBjYXNlICJjY2NjY2MiOgogICAgICAgIHJldHVybiBsb2NhbGl6ZTIuZGF5KGRheU9mV2VlaywgewogICAgICAgICAgd2lkdGg6ICJzaG9ydCIsCiAgICAgICAgICBjb250ZXh0OiAic3RhbmRhbG9uZSIKICAgICAgICB9KTsKICAgICAgLy8gVHVlc2RheQogICAgICBjYXNlICJjY2NjIjoKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheShkYXlPZldlZWssIHsKICAgICAgICAgIHdpZHRoOiAid2lkZSIsCiAgICAgICAgICBjb250ZXh0OiAic3RhbmRhbG9uZSIKICAgICAgICB9KTsKICAgIH0KICB9LCAiYyIpLAogIC8vIElTTyBkYXkgb2Ygd2VlawogIGk6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oZGF0ZSwgdG9rZW4sIGxvY2FsaXplMikgewogICAgY29uc3QgZGF5T2ZXZWVrID0gZGF0ZS5nZXREYXkoKTsKICAgIGNvbnN0IGlzb0RheU9mV2VlayA9IGRheU9mV2VlayA9PT0gMCA/IDcgOiBkYXlPZldlZWs7CiAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgIC8vIDIKICAgICAgY2FzZSAiaSI6CiAgICAgICAgcmV0dXJuIFN0cmluZyhpc29EYXlPZldlZWspOwogICAgICAvLyAwMgogICAgICBjYXNlICJpaSI6CiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhpc29EYXlPZldlZWssIHRva2VuLmxlbmd0aCk7CiAgICAgIC8vIDJuZAogICAgICBjYXNlICJpbyI6CiAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5vcmRpbmFsTnVtYmVyKGlzb0RheU9mV2VlaywgeyB1bml0OiAiZGF5IiB9KTsKICAgICAgLy8gVHVlCiAgICAgIGNhc2UgImlpaSI6CiAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5kYXkoZGF5T2ZXZWVrLCB7CiAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pOwogICAgICAvLyBUCiAgICAgIGNhc2UgImlpaWlpIjoKICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheShkYXlPZldlZWssIHsKICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pOwogICAgICAvLyBUdQogICAgICBjYXNlICJpaWlpaWkiOgogICAgICAgIHJldHVybiBsb2NhbGl6ZTIuZGF5KGRheU9mV2VlaywgewogICAgICAgICAgd2lkdGg6ICJzaG9ydCIsCiAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICB9KTsKICAgICAgLy8gVHVlc2RheQogICAgICBjYXNlICJpaWlpIjoKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheShkYXlPZldlZWssIHsKICAgICAgICAgIHdpZHRoOiAid2lkZSIsCiAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICB9KTsKICAgIH0KICB9LCAiaSIpLAogIC8vIEFNIG9yIFBNCiAgYTogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihkYXRlLCB0b2tlbiwgbG9jYWxpemUyKSB7CiAgICBjb25zdCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKTsKICAgIGNvbnN0IGRheVBlcmlvZEVudW1WYWx1ZSA9IGhvdXJzIC8gMTIgPj0gMSA/ICJwbSIgOiAiYW0iOwogICAgc3dpdGNoICh0b2tlbikgewogICAgICBjYXNlICJhIjoKICAgICAgY2FzZSAiYWEiOgogICAgICAgIHJldHVybiBsb2NhbGl6ZTIuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwgewogICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICB9KTsKICAgICAgY2FzZSAiYWFhIjoKICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHsKICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSkudG9Mb3dlckNhc2UoKTsKICAgICAgY2FzZSAiYWFhYWEiOgogICAgICAgIHJldHVybiBsb2NhbGl6ZTIuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwgewogICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSk7CiAgICAgIGNhc2UgImFhYWEiOgogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBsb2NhbGl6ZTIuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwgewogICAgICAgICAgd2lkdGg6ICJ3aWRlIiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pOwogICAgfQogIH0sICJhIiksCiAgLy8gQU0sIFBNLCBtaWRuaWdodCwgbm9vbgogIGI6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oZGF0ZSwgdG9rZW4sIGxvY2FsaXplMikgewogICAgY29uc3QgaG91cnMgPSBkYXRlLmdldEhvdXJzKCk7CiAgICBsZXQgZGF5UGVyaW9kRW51bVZhbHVlOwogICAgaWYgKGhvdXJzID09PSAxMikgewogICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLm5vb247CiAgICB9IGVsc2UgaWYgKGhvdXJzID09PSAwKSB7CiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0ubWlkbmlnaHQ7CiAgICB9IGVsc2UgewogICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBob3VycyAvIDEyID49IDEgPyAicG0iIDogImFtIjsKICAgIH0KICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgY2FzZSAiYiI6CiAgICAgIGNhc2UgImJiIjoKICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHsKICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSk7CiAgICAgIGNhc2UgImJiYiI6CiAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7CiAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pLnRvTG93ZXJDYXNlKCk7CiAgICAgIGNhc2UgImJiYmJiIjoKICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHsKICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pOwogICAgICBjYXNlICJiYmJiIjoKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHsKICAgICAgICAgIHdpZHRoOiAid2lkZSIsCiAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICB9KTsKICAgIH0KICB9LCAiYiIpLAogIC8vIGluIHRoZSBtb3JuaW5nLCBpbiB0aGUgYWZ0ZXJub29uLCBpbiB0aGUgZXZlbmluZywgYXQgbmlnaHQKICBCOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGRhdGUsIHRva2VuLCBsb2NhbGl6ZTIpIHsKICAgIGNvbnN0IGhvdXJzID0gZGF0ZS5nZXRIb3VycygpOwogICAgbGV0IGRheVBlcmlvZEVudW1WYWx1ZTsKICAgIGlmIChob3VycyA+PSAxNykgewogICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLmV2ZW5pbmc7CiAgICB9IGVsc2UgaWYgKGhvdXJzID49IDEyKSB7CiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0uYWZ0ZXJub29uOwogICAgfSBlbHNlIGlmIChob3VycyA+PSA0KSB7CiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0ubW9ybmluZzsKICAgIH0gZWxzZSB7CiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0ubmlnaHQ7CiAgICB9CiAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgIGNhc2UgIkIiOgogICAgICBjYXNlICJCQiI6CiAgICAgIGNhc2UgIkJCQiI6CiAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7CiAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pOwogICAgICBjYXNlICJCQkJCQiI6CiAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7CiAgICAgICAgICB3aWR0aDogIm5hcnJvdyIsCiAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICB9KTsKICAgICAgY2FzZSAiQkJCQiI6CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7CiAgICAgICAgICB3aWR0aDogIndpZGUiLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSk7CiAgICB9CiAgfSwgIkIiKSwKICAvLyBIb3VyIFsxLTEyXQogIGg6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oZGF0ZSwgdG9rZW4sIGxvY2FsaXplMikgewogICAgaWYgKHRva2VuID09PSAiaG8iKSB7CiAgICAgIGxldCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKSAlIDEyOwogICAgICBpZiAoaG91cnMgPT09IDApIGhvdXJzID0gMTI7CiAgICAgIHJldHVybiBsb2NhbGl6ZTIub3JkaW5hbE51bWJlcihob3VycywgeyB1bml0OiAiaG91ciIgfSk7CiAgICB9CiAgICByZXR1cm4gbGlnaHRGb3JtYXR0ZXJzLmgoZGF0ZSwgdG9rZW4pOwogIH0sICJoIiksCiAgLy8gSG91ciBbMC0yM10KICBIOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGRhdGUsIHRva2VuLCBsb2NhbGl6ZTIpIHsKICAgIGlmICh0b2tlbiA9PT0gIkhvIikgewogICAgICByZXR1cm4gbG9jYWxpemUyLm9yZGluYWxOdW1iZXIoZGF0ZS5nZXRIb3VycygpLCB7IHVuaXQ6ICJob3VyIiB9KTsKICAgIH0KICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMuSChkYXRlLCB0b2tlbik7CiAgfSwgIkgiKSwKICAvLyBIb3VyIFswLTExXQogIEs6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oZGF0ZSwgdG9rZW4sIGxvY2FsaXplMikgewogICAgY29uc3QgaG91cnMgPSBkYXRlLmdldEhvdXJzKCkgJSAxMjsKICAgIGlmICh0b2tlbiA9PT0gIktvIikgewogICAgICByZXR1cm4gbG9jYWxpemUyLm9yZGluYWxOdW1iZXIoaG91cnMsIHsgdW5pdDogImhvdXIiIH0pOwogICAgfQogICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhob3VycywgdG9rZW4ubGVuZ3RoKTsKICB9LCAiSyIpLAogIC8vIEhvdXIgWzEtMjRdCiAgazogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihkYXRlLCB0b2tlbiwgbG9jYWxpemUyKSB7CiAgICBsZXQgaG91cnMgPSBkYXRlLmdldEhvdXJzKCk7CiAgICBpZiAoaG91cnMgPT09IDApIGhvdXJzID0gMjQ7CiAgICBpZiAodG9rZW4gPT09ICJrbyIpIHsKICAgICAgcmV0dXJuIGxvY2FsaXplMi5vcmRpbmFsTnVtYmVyKGhvdXJzLCB7IHVuaXQ6ICJob3VyIiB9KTsKICAgIH0KICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoaG91cnMsIHRva2VuLmxlbmd0aCk7CiAgfSwgImsiKSwKICAvLyBNaW51dGUKICBtOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGRhdGUsIHRva2VuLCBsb2NhbGl6ZTIpIHsKICAgIGlmICh0b2tlbiA9PT0gIm1vIikgewogICAgICByZXR1cm4gbG9jYWxpemUyLm9yZGluYWxOdW1iZXIoZGF0ZS5nZXRNaW51dGVzKCksIHsgdW5pdDogIm1pbnV0ZSIgfSk7CiAgICB9CiAgICByZXR1cm4gbGlnaHRGb3JtYXR0ZXJzLm0oZGF0ZSwgdG9rZW4pOwogIH0sICJtIiksCiAgLy8gU2Vjb25kCiAgczogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihkYXRlLCB0b2tlbiwgbG9jYWxpemUyKSB7CiAgICBpZiAodG9rZW4gPT09ICJzbyIpIHsKICAgICAgcmV0dXJuIGxvY2FsaXplMi5vcmRpbmFsTnVtYmVyKGRhdGUuZ2V0U2Vjb25kcygpLCB7IHVuaXQ6ICJzZWNvbmQiIH0pOwogICAgfQogICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy5zKGRhdGUsIHRva2VuKTsKICB9LCAicyIpLAogIC8vIEZyYWN0aW9uIG9mIHNlY29uZAogIFM6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oZGF0ZSwgdG9rZW4pIHsKICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMuUyhkYXRlLCB0b2tlbik7CiAgfSwgIlMiKSwKICAvLyBUaW1lem9uZSAoSVNPLTg2MDEuIElmIG9mZnNldCBpcyAwLCBvdXRwdXQgaXMgYWx3YXlzIGAnWidgKQogIFg6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkgewogICAgY29uc3QgdGltZXpvbmVPZmZzZXQgPSBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7CiAgICBpZiAodGltZXpvbmVPZmZzZXQgPT09IDApIHsKICAgICAgcmV0dXJuICJaIjsKICAgIH0KICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgLy8gSG91cnMgYW5kIG9wdGlvbmFsIG1pbnV0ZXMKICAgICAgY2FzZSAiWCI6CiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWV6b25lV2l0aE9wdGlvbmFsTWludXRlcyh0aW1lem9uZU9mZnNldCk7CiAgICAgIC8vIEhvdXJzLCBtaW51dGVzIGFuZCBvcHRpb25hbCBzZWNvbmRzIHdpdGhvdXQgYDpgIGRlbGltaXRlcgogICAgICAvLyBOb3RlOiBuZWl0aGVyIElTTy04NjAxIG5vciBKYXZhU2NyaXB0IHN1cHBvcnRzIHNlY29uZHMgaW4gdGltZXpvbmUgb2Zmc2V0cwogICAgICAvLyBzbyB0aGlzIHRva2VuIGFsd2F5cyBoYXMgdGhlIHNhbWUgb3V0cHV0IGFzIGBYWGAKICAgICAgY2FzZSAiWFhYWCI6CiAgICAgIGNhc2UgIlhYIjoKICAgICAgICByZXR1cm4gZm9ybWF0VGltZXpvbmUodGltZXpvbmVPZmZzZXQpOwogICAgICAvLyBIb3VycywgbWludXRlcyBhbmQgb3B0aW9uYWwgc2Vjb25kcyB3aXRoIGA6YCBkZWxpbWl0ZXIKICAgICAgLy8gTm90ZTogbmVpdGhlciBJU08tODYwMSBub3IgSmF2YVNjcmlwdCBzdXBwb3J0cyBzZWNvbmRzIGluIHRpbWV6b25lIG9mZnNldHMKICAgICAgLy8gc28gdGhpcyB0b2tlbiBhbHdheXMgaGFzIHRoZSBzYW1lIG91dHB1dCBhcyBgWFhYYAogICAgICBjYXNlICJYWFhYWCI6CiAgICAgIGNhc2UgIlhYWCI6CiAgICAgIC8vIEhvdXJzIGFuZCBtaW51dGVzIHdpdGggYDpgIGRlbGltaXRlcgogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgIjoiKTsKICAgIH0KICB9LCAiWCIpLAogIC8vIFRpbWV6b25lIChJU08tODYwMS4gSWYgb2Zmc2V0IGlzIDAsIG91dHB1dCBpcyBgJyswMDowMCdgIG9yIGVxdWl2YWxlbnQpCiAgeDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihkYXRlLCB0b2tlbiwgX2xvY2FsaXplKSB7CiAgICBjb25zdCB0aW1lem9uZU9mZnNldCA9IGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKTsKICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgLy8gSG91cnMgYW5kIG9wdGlvbmFsIG1pbnV0ZXMKICAgICAgY2FzZSAieCI6CiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWV6b25lV2l0aE9wdGlvbmFsTWludXRlcyh0aW1lem9uZU9mZnNldCk7CiAgICAgIC8vIEhvdXJzLCBtaW51dGVzIGFuZCBvcHRpb25hbCBzZWNvbmRzIHdpdGhvdXQgYDpgIGRlbGltaXRlcgogICAgICAvLyBOb3RlOiBuZWl0aGVyIElTTy04NjAxIG5vciBKYXZhU2NyaXB0IHN1cHBvcnRzIHNlY29uZHMgaW4gdGltZXpvbmUgb2Zmc2V0cwogICAgICAvLyBzbyB0aGlzIHRva2VuIGFsd2F5cyBoYXMgdGhlIHNhbWUgb3V0cHV0IGFzIGB4eGAKICAgICAgY2FzZSAieHh4eCI6CiAgICAgIGNhc2UgInh4IjoKICAgICAgICByZXR1cm4gZm9ybWF0VGltZXpvbmUodGltZXpvbmVPZmZzZXQpOwogICAgICAvLyBIb3VycywgbWludXRlcyBhbmQgb3B0aW9uYWwgc2Vjb25kcyB3aXRoIGA6YCBkZWxpbWl0ZXIKICAgICAgLy8gTm90ZTogbmVpdGhlciBJU08tODYwMSBub3IgSmF2YVNjcmlwdCBzdXBwb3J0cyBzZWNvbmRzIGluIHRpbWV6b25lIG9mZnNldHMKICAgICAgLy8gc28gdGhpcyB0b2tlbiBhbHdheXMgaGFzIHRoZSBzYW1lIG91dHB1dCBhcyBgeHh4YAogICAgICBjYXNlICJ4eHh4eCI6CiAgICAgIGNhc2UgInh4eCI6CiAgICAgIC8vIEhvdXJzIGFuZCBtaW51dGVzIHdpdGggYDpgIGRlbGltaXRlcgogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgIjoiKTsKICAgIH0KICB9LCAieCIpLAogIC8vIFRpbWV6b25lIChHTVQpCiAgTzogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihkYXRlLCB0b2tlbiwgX2xvY2FsaXplKSB7CiAgICBjb25zdCB0aW1lem9uZU9mZnNldCA9IGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKTsKICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgLy8gU2hvcnQKICAgICAgY2FzZSAiTyI6CiAgICAgIGNhc2UgIk9PIjoKICAgICAgY2FzZSAiT09PIjoKICAgICAgICByZXR1cm4gIkdNVCIgKyBmb3JtYXRUaW1lem9uZVNob3J0KHRpbWV6b25lT2Zmc2V0LCAiOiIpOwogICAgICAvLyBMb25nCiAgICAgIGNhc2UgIk9PT08iOgogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiAiR01UIiArIGZvcm1hdFRpbWV6b25lKHRpbWV6b25lT2Zmc2V0LCAiOiIpOwogICAgfQogIH0sICJPIiksCiAgLy8gVGltZXpvbmUgKHNwZWNpZmljIG5vbi1sb2NhdGlvbikKICB6OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGRhdGUsIHRva2VuLCBfbG9jYWxpemUpIHsKICAgIGNvbnN0IHRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpOwogICAgc3dpdGNoICh0b2tlbikgewogICAgICAvLyBTaG9ydAogICAgICBjYXNlICJ6IjoKICAgICAgY2FzZSAienoiOgogICAgICBjYXNlICJ6enoiOgogICAgICAgIHJldHVybiAiR01UIiArIGZvcm1hdFRpbWV6b25lU2hvcnQodGltZXpvbmVPZmZzZXQsICI6Iik7CiAgICAgIC8vIExvbmcKICAgICAgY2FzZSAienp6eiI6CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuICJHTVQiICsgZm9ybWF0VGltZXpvbmUodGltZXpvbmVPZmZzZXQsICI6Iik7CiAgICB9CiAgfSwgInoiKSwKICAvLyBTZWNvbmRzIHRpbWVzdGFtcAogIHQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkgewogICAgY29uc3QgdGltZXN0YW1wMiA9IE1hdGgudHJ1bmMoK2RhdGUgLyAxZTMpOwogICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyh0aW1lc3RhbXAyLCB0b2tlbi5sZW5ndGgpOwogIH0sICJ0IiksCiAgLy8gTWlsbGlzZWNvbmRzIHRpbWVzdGFtcAogIFQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkgewogICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcygrZGF0ZSwgdG9rZW4ubGVuZ3RoKTsKICB9LCAiVCIpCn07CmZ1bmN0aW9uIGZvcm1hdFRpbWV6b25lU2hvcnQob2Zmc2V0LCBkZWxpbWl0ZXIgPSAiIikgewogIGNvbnN0IHNpZ24gPSBvZmZzZXQgPiAwID8gIi0iIDogIisiOwogIGNvbnN0IGFic09mZnNldCA9IE1hdGguYWJzKG9mZnNldCk7CiAgY29uc3QgaG91cnMgPSBNYXRoLnRydW5jKGFic09mZnNldCAvIDYwKTsKICBjb25zdCBtaW51dGVzID0gYWJzT2Zmc2V0ICUgNjA7CiAgaWYgKG1pbnV0ZXMgPT09IDApIHsKICAgIHJldHVybiBzaWduICsgU3RyaW5nKGhvdXJzKTsKICB9CiAgcmV0dXJuIHNpZ24gKyBTdHJpbmcoaG91cnMpICsgZGVsaW1pdGVyICsgYWRkTGVhZGluZ1plcm9zKG1pbnV0ZXMsIDIpOwp9Cl9fbmFtZShmb3JtYXRUaW1lem9uZVNob3J0LCAiZm9ybWF0VGltZXpvbmVTaG9ydCIpOwpmdW5jdGlvbiBmb3JtYXRUaW1lem9uZVdpdGhPcHRpb25hbE1pbnV0ZXMob2Zmc2V0LCBkZWxpbWl0ZXIpIHsKICBpZiAob2Zmc2V0ICUgNjAgPT09IDApIHsKICAgIGNvbnN0IHNpZ24gPSBvZmZzZXQgPiAwID8gIi0iIDogIisiOwogICAgcmV0dXJuIHNpZ24gKyBhZGRMZWFkaW5nWmVyb3MoTWF0aC5hYnMob2Zmc2V0KSAvIDYwLCAyKTsKICB9CiAgcmV0dXJuIGZvcm1hdFRpbWV6b25lKG9mZnNldCwgZGVsaW1pdGVyKTsKfQpfX25hbWUoZm9ybWF0VGltZXpvbmVXaXRoT3B0aW9uYWxNaW51dGVzLCAiZm9ybWF0VGltZXpvbmVXaXRoT3B0aW9uYWxNaW51dGVzIik7CmZ1bmN0aW9uIGZvcm1hdFRpbWV6b25lKG9mZnNldCwgZGVsaW1pdGVyID0gIiIpIHsKICBjb25zdCBzaWduID0gb2Zmc2V0ID4gMCA/ICItIiA6ICIrIjsKICBjb25zdCBhYnNPZmZzZXQgPSBNYXRoLmFicyhvZmZzZXQpOwogIGNvbnN0IGhvdXJzID0gYWRkTGVhZGluZ1plcm9zKE1hdGgudHJ1bmMoYWJzT2Zmc2V0IC8gNjApLCAyKTsKICBjb25zdCBtaW51dGVzID0gYWRkTGVhZGluZ1plcm9zKGFic09mZnNldCAlIDYwLCAyKTsKICByZXR1cm4gc2lnbiArIGhvdXJzICsgZGVsaW1pdGVyICsgbWludXRlczsKfQpfX25hbWUoZm9ybWF0VGltZXpvbmUsICJmb3JtYXRUaW1lem9uZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9fbGliL2Zvcm1hdC9sb25nRm9ybWF0dGVycy5qcwp2YXIgZGF0ZUxvbmdGb3JtYXR0ZXIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChwYXR0ZXJuLCBmb3JtYXRMb25nMikgPT4gewogIHN3aXRjaCAocGF0dGVybikgewogICAgY2FzZSAiUCI6CiAgICAgIHJldHVybiBmb3JtYXRMb25nMi5kYXRlKHsgd2lkdGg6ICJzaG9ydCIgfSk7CiAgICBjYXNlICJQUCI6CiAgICAgIHJldHVybiBmb3JtYXRMb25nMi5kYXRlKHsgd2lkdGg6ICJtZWRpdW0iIH0pOwogICAgY2FzZSAiUFBQIjoKICAgICAgcmV0dXJuIGZvcm1hdExvbmcyLmRhdGUoeyB3aWR0aDogImxvbmciIH0pOwogICAgY2FzZSAiUFBQUCI6CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gZm9ybWF0TG9uZzIuZGF0ZSh7IHdpZHRoOiAiZnVsbCIgfSk7CiAgfQp9LCAiZGF0ZUxvbmdGb3JtYXR0ZXIiKTsKdmFyIHRpbWVMb25nRm9ybWF0dGVyID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgocGF0dGVybiwgZm9ybWF0TG9uZzIpID0+IHsKICBzd2l0Y2ggKHBhdHRlcm4pIHsKICAgIGNhc2UgInAiOgogICAgICByZXR1cm4gZm9ybWF0TG9uZzIudGltZSh7IHdpZHRoOiAic2hvcnQiIH0pOwogICAgY2FzZSAicHAiOgogICAgICByZXR1cm4gZm9ybWF0TG9uZzIudGltZSh7IHdpZHRoOiAibWVkaXVtIiB9KTsKICAgIGNhc2UgInBwcCI6CiAgICAgIHJldHVybiBmb3JtYXRMb25nMi50aW1lKHsgd2lkdGg6ICJsb25nIiB9KTsKICAgIGNhc2UgInBwcHAiOgogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIGZvcm1hdExvbmcyLnRpbWUoeyB3aWR0aDogImZ1bGwiIH0pOwogIH0KfSwgInRpbWVMb25nRm9ybWF0dGVyIik7CnZhciBkYXRlVGltZUxvbmdGb3JtYXR0ZXIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChwYXR0ZXJuLCBmb3JtYXRMb25nMikgPT4gewogIGNvbnN0IG1hdGNoUmVzdWx0ID0gcGF0dGVybi5tYXRjaCgvKFArKShwKyk/LykgfHwgW107CiAgY29uc3QgZGF0ZVBhdHRlcm4gPSBtYXRjaFJlc3VsdFsxXTsKICBjb25zdCB0aW1lUGF0dGVybiA9IG1hdGNoUmVzdWx0WzJdOwogIGlmICghdGltZVBhdHRlcm4pIHsKICAgIHJldHVybiBkYXRlTG9uZ0Zvcm1hdHRlcihwYXR0ZXJuLCBmb3JtYXRMb25nMik7CiAgfQogIGxldCBkYXRlVGltZUZvcm1hdDsKICBzd2l0Y2ggKGRhdGVQYXR0ZXJuKSB7CiAgICBjYXNlICJQIjoKICAgICAgZGF0ZVRpbWVGb3JtYXQgPSBmb3JtYXRMb25nMi5kYXRlVGltZSh7IHdpZHRoOiAic2hvcnQiIH0pOwogICAgICBicmVhazsKICAgIGNhc2UgIlBQIjoKICAgICAgZGF0ZVRpbWVGb3JtYXQgPSBmb3JtYXRMb25nMi5kYXRlVGltZSh7IHdpZHRoOiAibWVkaXVtIiB9KTsKICAgICAgYnJlYWs7CiAgICBjYXNlICJQUFAiOgogICAgICBkYXRlVGltZUZvcm1hdCA9IGZvcm1hdExvbmcyLmRhdGVUaW1lKHsgd2lkdGg6ICJsb25nIiB9KTsKICAgICAgYnJlYWs7CiAgICBjYXNlICJQUFBQIjoKICAgIGRlZmF1bHQ6CiAgICAgIGRhdGVUaW1lRm9ybWF0ID0gZm9ybWF0TG9uZzIuZGF0ZVRpbWUoeyB3aWR0aDogImZ1bGwiIH0pOwogICAgICBicmVhazsKICB9CiAgcmV0dXJuIGRhdGVUaW1lRm9ybWF0LnJlcGxhY2UoInt7ZGF0ZX19IiwgZGF0ZUxvbmdGb3JtYXR0ZXIoZGF0ZVBhdHRlcm4sIGZvcm1hdExvbmcyKSkucmVwbGFjZSgie3t0aW1lfX0iLCB0aW1lTG9uZ0Zvcm1hdHRlcih0aW1lUGF0dGVybiwgZm9ybWF0TG9uZzIpKTsKfSwgImRhdGVUaW1lTG9uZ0Zvcm1hdHRlciIpOwp2YXIgbG9uZ0Zvcm1hdHRlcnMgPSB7CiAgcDogdGltZUxvbmdGb3JtYXR0ZXIsCiAgUDogZGF0ZVRpbWVMb25nRm9ybWF0dGVyCn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvcHJvdGVjdGVkVG9rZW5zLmpzCnZhciBkYXlPZlllYXJUb2tlblJFID0gL15EKyQvOwp2YXIgd2Vla1llYXJUb2tlblJFID0gL15ZKyQvOwp2YXIgdGhyb3dUb2tlbnMgPSBbIkQiLCAiREQiLCAiWVkiLCAiWVlZWSJdOwpmdW5jdGlvbiBpc1Byb3RlY3RlZERheU9mWWVhclRva2VuKHRva2VuKSB7CiAgcmV0dXJuIGRheU9mWWVhclRva2VuUkUudGVzdCh0b2tlbik7Cn0KX19uYW1lKGlzUHJvdGVjdGVkRGF5T2ZZZWFyVG9rZW4sICJpc1Byb3RlY3RlZERheU9mWWVhclRva2VuIik7CmZ1bmN0aW9uIGlzUHJvdGVjdGVkV2Vla1llYXJUb2tlbih0b2tlbikgewogIHJldHVybiB3ZWVrWWVhclRva2VuUkUudGVzdCh0b2tlbik7Cn0KX19uYW1lKGlzUHJvdGVjdGVkV2Vla1llYXJUb2tlbiwgImlzUHJvdGVjdGVkV2Vla1llYXJUb2tlbiIpOwpmdW5jdGlvbiB3YXJuT3JUaHJvd1Byb3RlY3RlZEVycm9yKHRva2VuLCBmb3JtYXQyLCBpbnB1dCkgewogIGNvbnN0IF9tZXNzYWdlID0gbWVzc2FnZSh0b2tlbiwgZm9ybWF0MiwgaW5wdXQpOwogIGNvbnNvbGUud2FybihfbWVzc2FnZSk7CiAgaWYgKHRocm93VG9rZW5zLmluY2x1ZGVzKHRva2VuKSkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoX21lc3NhZ2UpOwp9Cl9fbmFtZSh3YXJuT3JUaHJvd1Byb3RlY3RlZEVycm9yLCAid2Fybk9yVGhyb3dQcm90ZWN0ZWRFcnJvciIpOwpmdW5jdGlvbiBtZXNzYWdlKHRva2VuLCBmb3JtYXQyLCBpbnB1dCkgewogIGNvbnN0IHN1YmplY3QgPSB0b2tlblswXSA9PT0gIlkiID8gInllYXJzIiA6ICJkYXlzIG9mIHRoZSBtb250aCI7CiAgcmV0dXJuIGBVc2UgXGAke3Rva2VuLnRvTG93ZXJDYXNlKCl9XGAgaW5zdGVhZCBvZiBcYCR7dG9rZW59XGAgKGluIFxgJHtmb3JtYXQyfVxgKSBmb3IgZm9ybWF0dGluZyAke3N1YmplY3R9IHRvIHRoZSBpbnB1dCBcYCR7aW5wdXR9XGA7IHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZGA7Cn0KX19uYW1lKG1lc3NhZ2UsICJtZXNzYWdlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2Zvcm1hdC5qcwp2YXIgZm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cCA9IC9beVlRcU1Md0lkRGVjaWhIS2ttc11vfChcdylcMSp8Jyd8JygnJ3xbXiddKSsoJ3wkKXwuL2c7CnZhciBsb25nRm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cCA9IC9QK3ArfFArfHArfCcnfCcoJyd8W14nXSkrKCd8JCl8Li9nOwp2YXIgZXNjYXBlZFN0cmluZ1JlZ0V4cCA9IC9eJyhbXl0qPyknPyQvOwp2YXIgZG91YmxlUXVvdGVSZWdFeHAgPSAvJycvZzsKdmFyIHVuZXNjYXBlZExhdGluQ2hhcmFjdGVyUmVnRXhwID0gL1thLXpBLVpdLzsKZnVuY3Rpb24gZm9ybWF0KGRhdGUsIGZvcm1hdFN0ciwgb3B0aW9ucykgewogIGNvbnN0IGRlZmF1bHRPcHRpb25zMiA9IGdldERlZmF1bHRPcHRpb25zKCk7CiAgY29uc3QgbG9jYWxlID0gb3B0aW9ucz8ubG9jYWxlID8/IGRlZmF1bHRPcHRpb25zMi5sb2NhbGUgPz8gZW5VUzsKICBjb25zdCBmaXJzdFdlZWtDb250YWluc0RhdGUgPSBvcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz8gb3B0aW9ucz8ubG9jYWxlPy5vcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz8gZGVmYXVsdE9wdGlvbnMyLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyBkZWZhdWx0T3B0aW9uczIubG9jYWxlPy5vcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz8gMTsKICBjb25zdCB3ZWVrU3RhcnRzT24gPSBvcHRpb25zPy53ZWVrU3RhcnRzT24gPz8gb3B0aW9ucz8ubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz8gZGVmYXVsdE9wdGlvbnMyLndlZWtTdGFydHNPbiA/PyBkZWZhdWx0T3B0aW9uczIubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz8gMDsKICBjb25zdCBvcmlnaW5hbERhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGlmICghaXNWYWxpZChvcmlnaW5hbERhdGUpKSB7CiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0aW1lIHZhbHVlIik7CiAgfQogIGxldCBwYXJ0cyA9IGZvcm1hdFN0ci5tYXRjaChsb25nRm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cCkubWFwKChzdWJzdHJpbmcpID0+IHsKICAgIGNvbnN0IGZpcnN0Q2hhcmFjdGVyID0gc3Vic3RyaW5nWzBdOwogICAgaWYgKGZpcnN0Q2hhcmFjdGVyID09PSAicCIgfHwgZmlyc3RDaGFyYWN0ZXIgPT09ICJQIikgewogICAgICBjb25zdCBsb25nRm9ybWF0dGVyID0gbG9uZ0Zvcm1hdHRlcnNbZmlyc3RDaGFyYWN0ZXJdOwogICAgICByZXR1cm4gbG9uZ0Zvcm1hdHRlcihzdWJzdHJpbmcsIGxvY2FsZS5mb3JtYXRMb25nKTsKICAgIH0KICAgIHJldHVybiBzdWJzdHJpbmc7CiAgfSkuam9pbigiIikubWF0Y2goZm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cCkubWFwKChzdWJzdHJpbmcpID0+IHsKICAgIGlmIChzdWJzdHJpbmcgPT09ICInJyIpIHsKICAgICAgcmV0dXJuIHsgaXNUb2tlbjogZmFsc2UsIHZhbHVlOiAiJyIgfTsKICAgIH0KICAgIGNvbnN0IGZpcnN0Q2hhcmFjdGVyID0gc3Vic3RyaW5nWzBdOwogICAgaWYgKGZpcnN0Q2hhcmFjdGVyID09PSAiJyIpIHsKICAgICAgcmV0dXJuIHsgaXNUb2tlbjogZmFsc2UsIHZhbHVlOiBjbGVhbkVzY2FwZWRTdHJpbmcoc3Vic3RyaW5nKSB9OwogICAgfQogICAgaWYgKGZvcm1hdHRlcnNbZmlyc3RDaGFyYWN0ZXJdKSB7CiAgICAgIHJldHVybiB7IGlzVG9rZW46IHRydWUsIHZhbHVlOiBzdWJzdHJpbmcgfTsKICAgIH0KICAgIGlmIChmaXJzdENoYXJhY3Rlci5tYXRjaCh1bmVzY2FwZWRMYXRpbkNoYXJhY3RlclJlZ0V4cCkpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoCiAgICAgICAgIkZvcm1hdCBzdHJpbmcgY29udGFpbnMgYW4gdW5lc2NhcGVkIGxhdGluIGFscGhhYmV0IGNoYXJhY3RlciBgIiArIGZpcnN0Q2hhcmFjdGVyICsgImAiCiAgICAgICk7CiAgICB9CiAgICByZXR1cm4geyBpc1Rva2VuOiBmYWxzZSwgdmFsdWU6IHN1YnN0cmluZyB9OwogIH0pOwogIGlmIChsb2NhbGUubG9jYWxpemUucHJlcHJvY2Vzc29yKSB7CiAgICBwYXJ0cyA9IGxvY2FsZS5sb2NhbGl6ZS5wcmVwcm9jZXNzb3Iob3JpZ2luYWxEYXRlLCBwYXJ0cyk7CiAgfQogIGNvbnN0IGZvcm1hdHRlck9wdGlvbnMgPSB7CiAgICBmaXJzdFdlZWtDb250YWluc0RhdGUsCiAgICB3ZWVrU3RhcnRzT24sCiAgICBsb2NhbGUKICB9OwogIHJldHVybiBwYXJ0cy5tYXAoKHBhcnQpID0+IHsKICAgIGlmICghcGFydC5pc1Rva2VuKSByZXR1cm4gcGFydC52YWx1ZTsKICAgIGNvbnN0IHRva2VuID0gcGFydC52YWx1ZTsKICAgIGlmICghb3B0aW9ucz8udXNlQWRkaXRpb25hbFdlZWtZZWFyVG9rZW5zICYmIGlzUHJvdGVjdGVkV2Vla1llYXJUb2tlbih0b2tlbikgfHwgIW9wdGlvbnM/LnVzZUFkZGl0aW9uYWxEYXlPZlllYXJUb2tlbnMgJiYgaXNQcm90ZWN0ZWREYXlPZlllYXJUb2tlbih0b2tlbikpIHsKICAgICAgd2Fybk9yVGhyb3dQcm90ZWN0ZWRFcnJvcih0b2tlbiwgZm9ybWF0U3RyLCBTdHJpbmcoZGF0ZSkpOwogICAgfQogICAgY29uc3QgZm9ybWF0dGVyMiA9IGZvcm1hdHRlcnNbdG9rZW5bMF1dOwogICAgcmV0dXJuIGZvcm1hdHRlcjIob3JpZ2luYWxEYXRlLCB0b2tlbiwgbG9jYWxlLmxvY2FsaXplLCBmb3JtYXR0ZXJPcHRpb25zKTsKICB9KS5qb2luKCIiKTsKfQpfX25hbWUoZm9ybWF0LCAiZm9ybWF0Iik7CmZ1bmN0aW9uIGNsZWFuRXNjYXBlZFN0cmluZyhpbnB1dCkgewogIGNvbnN0IG1hdGNoZWQgPSBpbnB1dC5tYXRjaChlc2NhcGVkU3RyaW5nUmVnRXhwKTsKICBpZiAoIW1hdGNoZWQpIHsKICAgIHJldHVybiBpbnB1dDsKICB9CiAgcmV0dXJuIG1hdGNoZWRbMV0ucmVwbGFjZShkb3VibGVRdW90ZVJlZ0V4cCwgIiciKTsKfQpfX25hbWUoY2xlYW5Fc2NhcGVkU3RyaW5nLCAiY2xlYW5Fc2NhcGVkU3RyaW5nIik7CnZhciBmb3JtYXRfZGVmYXVsdCA9IGZvcm1hdDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZm9ybWF0RGlzdGFuY2UuanMKZnVuY3Rpb24gZm9ybWF0RGlzdGFuY2UyKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBkZWZhdWx0T3B0aW9uczIgPSBnZXREZWZhdWx0T3B0aW9ucygpOwogIGNvbnN0IGxvY2FsZSA9IG9wdGlvbnM/LmxvY2FsZSA/PyBkZWZhdWx0T3B0aW9uczIubG9jYWxlID8/IGVuVVM7CiAgY29uc3QgbWludXRlc0luQWxtb3N0VHdvRGF5cyA9IDI1MjA7CiAgY29uc3QgY29tcGFyaXNvbiA9IGNvbXBhcmVBc2MobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSk7CiAgaWYgKGlzTmFOKGNvbXBhcmlzb24pKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0aW1lIHZhbHVlIik7CiAgY29uc3QgbG9jYWxpemVPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucywgewogICAgYWRkU3VmZml4OiBvcHRpb25zPy5hZGRTdWZmaXgsCiAgICBjb21wYXJpc29uCiAgfSk7CiAgY29uc3QgW2xhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgLi4uY29tcGFyaXNvbiA+IDAgPyBbZWFybGllckRhdGUsIGxhdGVyRGF0ZV0gOiBbbGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZV0KICApOwogIGNvbnN0IHNlY29uZHMgPSBkaWZmZXJlbmNlSW5TZWNvbmRzKGVhcmxpZXJEYXRlXywgbGF0ZXJEYXRlXyk7CiAgY29uc3Qgb2Zmc2V0SW5TZWNvbmRzID0gKGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMoZWFybGllckRhdGVfKSAtIGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMobGF0ZXJEYXRlXykpIC8gMWUzOwogIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLnJvdW5kKChzZWNvbmRzIC0gb2Zmc2V0SW5TZWNvbmRzKSAvIDYwKTsKICBsZXQgbW9udGhzMjsKICBpZiAobWludXRlcyA8IDIpIHsKICAgIGlmIChvcHRpb25zPy5pbmNsdWRlU2Vjb25kcykgewogICAgICBpZiAoc2Vjb25kcyA8IDUpIHsKICAgICAgICByZXR1cm4gbG9jYWxlLmZvcm1hdERpc3RhbmNlKCJsZXNzVGhhblhTZWNvbmRzIiwgNSwgbG9jYWxpemVPcHRpb25zKTsKICAgICAgfSBlbHNlIGlmIChzZWNvbmRzIDwgMTApIHsKICAgICAgICByZXR1cm4gbG9jYWxlLmZvcm1hdERpc3RhbmNlKCJsZXNzVGhhblhTZWNvbmRzIiwgMTAsIGxvY2FsaXplT3B0aW9ucyk7CiAgICAgIH0gZWxzZSBpZiAoc2Vjb25kcyA8IDIwKSB7CiAgICAgICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZSgibGVzc1RoYW5YU2Vjb25kcyIsIDIwLCBsb2NhbGl6ZU9wdGlvbnMpOwogICAgICB9IGVsc2UgaWYgKHNlY29uZHMgPCA0MCkgewogICAgICAgIHJldHVybiBsb2NhbGUuZm9ybWF0RGlzdGFuY2UoImhhbGZBTWludXRlIiwgMCwgbG9jYWxpemVPcHRpb25zKTsKICAgICAgfSBlbHNlIGlmIChzZWNvbmRzIDwgNjApIHsKICAgICAgICByZXR1cm4gbG9jYWxlLmZvcm1hdERpc3RhbmNlKCJsZXNzVGhhblhNaW51dGVzIiwgMSwgbG9jYWxpemVPcHRpb25zKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbG9jYWxlLmZvcm1hdERpc3RhbmNlKCJ4TWludXRlcyIsIDEsIGxvY2FsaXplT3B0aW9ucyk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmIChtaW51dGVzID09PSAwKSB7CiAgICAgICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZSgibGVzc1RoYW5YTWludXRlcyIsIDEsIGxvY2FsaXplT3B0aW9ucyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZSgieE1pbnV0ZXMiLCBtaW51dGVzLCBsb2NhbGl6ZU9wdGlvbnMpOwogICAgICB9CiAgICB9CiAgfSBlbHNlIGlmIChtaW51dGVzIDwgNDUpIHsKICAgIHJldHVybiBsb2NhbGUuZm9ybWF0RGlzdGFuY2UoInhNaW51dGVzIiwgbWludXRlcywgbG9jYWxpemVPcHRpb25zKTsKICB9IGVsc2UgaWYgKG1pbnV0ZXMgPCA5MCkgewogICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZSgiYWJvdXRYSG91cnMiLCAxLCBsb2NhbGl6ZU9wdGlvbnMpOwogIH0gZWxzZSBpZiAobWludXRlcyA8IG1pbnV0ZXNJbkRheSkgewogICAgY29uc3QgaG91cnMgPSBNYXRoLnJvdW5kKG1pbnV0ZXMgLyA2MCk7CiAgICByZXR1cm4gbG9jYWxlLmZvcm1hdERpc3RhbmNlKCJhYm91dFhIb3VycyIsIGhvdXJzLCBsb2NhbGl6ZU9wdGlvbnMpOwogIH0gZWxzZSBpZiAobWludXRlcyA8IG1pbnV0ZXNJbkFsbW9zdFR3b0RheXMpIHsKICAgIHJldHVybiBsb2NhbGUuZm9ybWF0RGlzdGFuY2UoInhEYXlzIiwgMSwgbG9jYWxpemVPcHRpb25zKTsKICB9IGVsc2UgaWYgKG1pbnV0ZXMgPCBtaW51dGVzSW5Nb250aCkgewogICAgY29uc3QgZGF5czIgPSBNYXRoLnJvdW5kKG1pbnV0ZXMgLyBtaW51dGVzSW5EYXkpOwogICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZSgieERheXMiLCBkYXlzMiwgbG9jYWxpemVPcHRpb25zKTsKICB9IGVsc2UgaWYgKG1pbnV0ZXMgPCBtaW51dGVzSW5Nb250aCAqIDIpIHsKICAgIG1vbnRoczIgPSBNYXRoLnJvdW5kKG1pbnV0ZXMgLyBtaW51dGVzSW5Nb250aCk7CiAgICByZXR1cm4gbG9jYWxlLmZvcm1hdERpc3RhbmNlKCJhYm91dFhNb250aHMiLCBtb250aHMyLCBsb2NhbGl6ZU9wdGlvbnMpOwogIH0KICBtb250aHMyID0gZGlmZmVyZW5jZUluTW9udGhzKGVhcmxpZXJEYXRlXywgbGF0ZXJEYXRlXyk7CiAgaWYgKG1vbnRoczIgPCAxMikgewogICAgY29uc3QgbmVhcmVzdE1vbnRoID0gTWF0aC5yb3VuZChtaW51dGVzIC8gbWludXRlc0luTW9udGgpOwogICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZSgieE1vbnRocyIsIG5lYXJlc3RNb250aCwgbG9jYWxpemVPcHRpb25zKTsKICB9IGVsc2UgewogICAgY29uc3QgbW9udGhzU2luY2VTdGFydE9mWWVhciA9IG1vbnRoczIgJSAxMjsKICAgIGNvbnN0IHllYXJzID0gTWF0aC50cnVuYyhtb250aHMyIC8gMTIpOwogICAgaWYgKG1vbnRoc1NpbmNlU3RhcnRPZlllYXIgPCAzKSB7CiAgICAgIHJldHVybiBsb2NhbGUuZm9ybWF0RGlzdGFuY2UoImFib3V0WFllYXJzIiwgeWVhcnMsIGxvY2FsaXplT3B0aW9ucyk7CiAgICB9IGVsc2UgaWYgKG1vbnRoc1NpbmNlU3RhcnRPZlllYXIgPCA5KSB7CiAgICAgIHJldHVybiBsb2NhbGUuZm9ybWF0RGlzdGFuY2UoIm92ZXJYWWVhcnMiLCB5ZWFycywgbG9jYWxpemVPcHRpb25zKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBsb2NhbGUuZm9ybWF0RGlzdGFuY2UoImFsbW9zdFhZZWFycyIsIHllYXJzICsgMSwgbG9jYWxpemVPcHRpb25zKTsKICAgIH0KICB9Cn0KX19uYW1lKGZvcm1hdERpc3RhbmNlMiwgImZvcm1hdERpc3RhbmNlIik7CnZhciBmb3JtYXREaXN0YW5jZV9kZWZhdWx0ID0gZm9ybWF0RGlzdGFuY2UyOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9mb3JtYXREaXN0YW5jZVN0cmljdC5qcwpmdW5jdGlvbiBmb3JtYXREaXN0YW5jZVN0cmljdChsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgZGVmYXVsdE9wdGlvbnMyID0gZ2V0RGVmYXVsdE9wdGlvbnMoKTsKICBjb25zdCBsb2NhbGUgPSBvcHRpb25zPy5sb2NhbGUgPz8gZGVmYXVsdE9wdGlvbnMyLmxvY2FsZSA/PyBlblVTOwogIGNvbnN0IGNvbXBhcmlzb24gPSBjb21wYXJlQXNjKGxhdGVyRGF0ZSwgZWFybGllckRhdGUpOwogIGlmIChpc05hTihjb21wYXJpc29uKSkgewogICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgdGltZSB2YWx1ZSIpOwogIH0KICBjb25zdCBsb2NhbGl6ZU9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLCB7CiAgICBhZGRTdWZmaXg6IG9wdGlvbnM/LmFkZFN1ZmZpeCwKICAgIGNvbXBhcmlzb24KICB9KTsKICBjb25zdCBbbGF0ZXJEYXRlXywgZWFybGllckRhdGVfXSA9IG5vcm1hbGl6ZURhdGVzKAogICAgb3B0aW9ucz8uaW4sCiAgICAuLi5jb21wYXJpc29uID4gMCA/IFtlYXJsaWVyRGF0ZSwgbGF0ZXJEYXRlXSA6IFtsYXRlckRhdGUsIGVhcmxpZXJEYXRlXQogICk7CiAgY29uc3Qgcm91bmRpbmdNZXRob2QgPSBnZXRSb3VuZGluZ01ldGhvZChvcHRpb25zPy5yb3VuZGluZ01ldGhvZCA/PyAicm91bmQiKTsKICBjb25zdCBtaWxsaXNlY29uZHMyID0gZWFybGllckRhdGVfLmdldFRpbWUoKSAtIGxhdGVyRGF0ZV8uZ2V0VGltZSgpOwogIGNvbnN0IG1pbnV0ZXMgPSBtaWxsaXNlY29uZHMyIC8gbWlsbGlzZWNvbmRzSW5NaW51dGU7CiAgY29uc3QgdGltZXpvbmVPZmZzZXQgPSBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKGVhcmxpZXJEYXRlXykgLSBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKGxhdGVyRGF0ZV8pOwogIGNvbnN0IGRzdE5vcm1hbGl6ZWRNaW51dGVzID0gKG1pbGxpc2Vjb25kczIgLSB0aW1lem9uZU9mZnNldCkgLyBtaWxsaXNlY29uZHNJbk1pbnV0ZTsKICBjb25zdCBkZWZhdWx0VW5pdCA9IG9wdGlvbnM/LnVuaXQ7CiAgbGV0IHVuaXQ7CiAgaWYgKCFkZWZhdWx0VW5pdCkgewogICAgaWYgKG1pbnV0ZXMgPCAxKSB7CiAgICAgIHVuaXQgPSAic2Vjb25kIjsKICAgIH0gZWxzZSBpZiAobWludXRlcyA8IDYwKSB7CiAgICAgIHVuaXQgPSAibWludXRlIjsKICAgIH0gZWxzZSBpZiAobWludXRlcyA8IG1pbnV0ZXNJbkRheSkgewogICAgICB1bml0ID0gImhvdXIiOwogICAgfSBlbHNlIGlmIChkc3ROb3JtYWxpemVkTWludXRlcyA8IG1pbnV0ZXNJbk1vbnRoKSB7CiAgICAgIHVuaXQgPSAiZGF5IjsKICAgIH0gZWxzZSBpZiAoZHN0Tm9ybWFsaXplZE1pbnV0ZXMgPCBtaW51dGVzSW5ZZWFyKSB7CiAgICAgIHVuaXQgPSAibW9udGgiOwogICAgfSBlbHNlIHsKICAgICAgdW5pdCA9ICJ5ZWFyIjsKICAgIH0KICB9IGVsc2UgewogICAgdW5pdCA9IGRlZmF1bHRVbml0OwogIH0KICBpZiAodW5pdCA9PT0gInNlY29uZCIpIHsKICAgIGNvbnN0IHNlY29uZHMgPSByb3VuZGluZ01ldGhvZChtaWxsaXNlY29uZHMyIC8gMWUzKTsKICAgIHJldHVybiBsb2NhbGUuZm9ybWF0RGlzdGFuY2UoInhTZWNvbmRzIiwgc2Vjb25kcywgbG9jYWxpemVPcHRpb25zKTsKICB9IGVsc2UgaWYgKHVuaXQgPT09ICJtaW51dGUiKSB7CiAgICBjb25zdCByb3VuZGVkTWludXRlcyA9IHJvdW5kaW5nTWV0aG9kKG1pbnV0ZXMpOwogICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZSgieE1pbnV0ZXMiLCByb3VuZGVkTWludXRlcywgbG9jYWxpemVPcHRpb25zKTsKICB9IGVsc2UgaWYgKHVuaXQgPT09ICJob3VyIikgewogICAgY29uc3QgaG91cnMgPSByb3VuZGluZ01ldGhvZChtaW51dGVzIC8gNjApOwogICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZSgieEhvdXJzIiwgaG91cnMsIGxvY2FsaXplT3B0aW9ucyk7CiAgfSBlbHNlIGlmICh1bml0ID09PSAiZGF5IikgewogICAgY29uc3QgZGF5czIgPSByb3VuZGluZ01ldGhvZChkc3ROb3JtYWxpemVkTWludXRlcyAvIG1pbnV0ZXNJbkRheSk7CiAgICByZXR1cm4gbG9jYWxlLmZvcm1hdERpc3RhbmNlKCJ4RGF5cyIsIGRheXMyLCBsb2NhbGl6ZU9wdGlvbnMpOwogIH0gZWxzZSBpZiAodW5pdCA9PT0gIm1vbnRoIikgewogICAgY29uc3QgbW9udGhzMiA9IHJvdW5kaW5nTWV0aG9kKGRzdE5vcm1hbGl6ZWRNaW51dGVzIC8gbWludXRlc0luTW9udGgpOwogICAgcmV0dXJuIG1vbnRoczIgPT09IDEyICYmIGRlZmF1bHRVbml0ICE9PSAibW9udGgiID8gbG9jYWxlLmZvcm1hdERpc3RhbmNlKCJ4WWVhcnMiLCAxLCBsb2NhbGl6ZU9wdGlvbnMpIDogbG9jYWxlLmZvcm1hdERpc3RhbmNlKCJ4TW9udGhzIiwgbW9udGhzMiwgbG9jYWxpemVPcHRpb25zKTsKICB9IGVsc2UgewogICAgY29uc3QgeWVhcnMgPSByb3VuZGluZ01ldGhvZChkc3ROb3JtYWxpemVkTWludXRlcyAvIG1pbnV0ZXNJblllYXIpOwogICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZSgieFllYXJzIiwgeWVhcnMsIGxvY2FsaXplT3B0aW9ucyk7CiAgfQp9Cl9fbmFtZShmb3JtYXREaXN0YW5jZVN0cmljdCwgImZvcm1hdERpc3RhbmNlU3RyaWN0Iik7CnZhciBmb3JtYXREaXN0YW5jZVN0cmljdF9kZWZhdWx0ID0gZm9ybWF0RGlzdGFuY2VTdHJpY3Q7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2Zvcm1hdERpc3RhbmNlVG9Ob3cuanMKZnVuY3Rpb24gZm9ybWF0RGlzdGFuY2VUb05vdyhkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIGZvcm1hdERpc3RhbmNlMihkYXRlLCBjb25zdHJ1Y3ROb3coZGF0ZSksIG9wdGlvbnMpOwp9Cl9fbmFtZShmb3JtYXREaXN0YW5jZVRvTm93LCAiZm9ybWF0RGlzdGFuY2VUb05vdyIpOwp2YXIgZm9ybWF0RGlzdGFuY2VUb05vd19kZWZhdWx0ID0gZm9ybWF0RGlzdGFuY2VUb05vdzsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZm9ybWF0RGlzdGFuY2VUb05vd1N0cmljdC5qcwpmdW5jdGlvbiBmb3JtYXREaXN0YW5jZVRvTm93U3RyaWN0KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gZm9ybWF0RGlzdGFuY2VTdHJpY3QoZGF0ZSwgY29uc3RydWN0Tm93KGRhdGUpLCBvcHRpb25zKTsKfQpfX25hbWUoZm9ybWF0RGlzdGFuY2VUb05vd1N0cmljdCwgImZvcm1hdERpc3RhbmNlVG9Ob3dTdHJpY3QiKTsKdmFyIGZvcm1hdERpc3RhbmNlVG9Ob3dTdHJpY3RfZGVmYXVsdCA9IGZvcm1hdERpc3RhbmNlVG9Ob3dTdHJpY3Q7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2Zvcm1hdER1cmF0aW9uLmpzCnZhciBkZWZhdWx0Rm9ybWF0ID0gWwogICJ5ZWFycyIsCiAgIm1vbnRocyIsCiAgIndlZWtzIiwKICAiZGF5cyIsCiAgImhvdXJzIiwKICAibWludXRlcyIsCiAgInNlY29uZHMiCl07CmZ1bmN0aW9uIGZvcm1hdER1cmF0aW9uKGR1cmF0aW9uLCBvcHRpb25zKSB7CiAgY29uc3QgZGVmYXVsdE9wdGlvbnMyID0gZ2V0RGVmYXVsdE9wdGlvbnMoKTsKICBjb25zdCBsb2NhbGUgPSBvcHRpb25zPy5sb2NhbGUgPz8gZGVmYXVsdE9wdGlvbnMyLmxvY2FsZSA/PyBlblVTOwogIGNvbnN0IGZvcm1hdDIgPSBvcHRpb25zPy5mb3JtYXQgPz8gZGVmYXVsdEZvcm1hdDsKICBjb25zdCB6ZXJvID0gb3B0aW9ucz8uemVybyA/PyBmYWxzZTsKICBjb25zdCBkZWxpbWl0ZXIgPSBvcHRpb25zPy5kZWxpbWl0ZXIgPz8gIiAiOwogIGlmICghbG9jYWxlLmZvcm1hdERpc3RhbmNlKSB7CiAgICByZXR1cm4gIiI7CiAgfQogIGNvbnN0IHJlc3VsdCA9IGZvcm1hdDIucmVkdWNlKChhY2MsIHVuaXQpID0+IHsKICAgIGNvbnN0IHRva2VuID0gYHgke3VuaXQucmVwbGFjZSgvKF4uKS8sIChtNSkgPT4gbTUudG9VcHBlckNhc2UoKSl9YDsKICAgIGNvbnN0IHZhbHVlMiA9IGR1cmF0aW9uW3VuaXRdOwogICAgaWYgKHZhbHVlMiAhPT0gdm9pZCAwICYmICh6ZXJvIHx8IGR1cmF0aW9uW3VuaXRdKSkgewogICAgICByZXR1cm4gYWNjLmNvbmNhdChsb2NhbGUuZm9ybWF0RGlzdGFuY2UodG9rZW4sIHZhbHVlMikpOwogICAgfQogICAgcmV0dXJuIGFjYzsKICB9LCBbXSkuam9pbihkZWxpbWl0ZXIpOwogIHJldHVybiByZXN1bHQ7Cn0KX19uYW1lKGZvcm1hdER1cmF0aW9uLCAiZm9ybWF0RHVyYXRpb24iKTsKdmFyIGZvcm1hdER1cmF0aW9uX2RlZmF1bHQgPSBmb3JtYXREdXJhdGlvbjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZm9ybWF0SVNPLmpzCmZ1bmN0aW9uIGZvcm1hdElTTyhkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgZGF0ZV8gPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGlmIChpc05hTigrZGF0ZV8pKSB7CiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0aW1lIHZhbHVlIik7CiAgfQogIGNvbnN0IGZvcm1hdDIgPSBvcHRpb25zPy5mb3JtYXQgPz8gImV4dGVuZGVkIjsKICBjb25zdCByZXByZXNlbnRhdGlvbiA9IG9wdGlvbnM/LnJlcHJlc2VudGF0aW9uID8/ICJjb21wbGV0ZSI7CiAgbGV0IHJlc3VsdCA9ICIiOwogIGxldCB0ek9mZnNldCA9ICIiOwogIGNvbnN0IGRhdGVEZWxpbWl0ZXIgPSBmb3JtYXQyID09PSAiZXh0ZW5kZWQiID8gIi0iIDogIiI7CiAgY29uc3QgdGltZURlbGltaXRlciA9IGZvcm1hdDIgPT09ICJleHRlbmRlZCIgPyAiOiIgOiAiIjsKICBpZiAocmVwcmVzZW50YXRpb24gIT09ICJ0aW1lIikgewogICAgY29uc3QgZGF5ID0gYWRkTGVhZGluZ1plcm9zKGRhdGVfLmdldERhdGUoKSwgMik7CiAgICBjb25zdCBtb250aCA9IGFkZExlYWRpbmdaZXJvcyhkYXRlXy5nZXRNb250aCgpICsgMSwgMik7CiAgICBjb25zdCB5ZWFyID0gYWRkTGVhZGluZ1plcm9zKGRhdGVfLmdldEZ1bGxZZWFyKCksIDQpOwogICAgcmVzdWx0ID0gYCR7eWVhcn0ke2RhdGVEZWxpbWl0ZXJ9JHttb250aH0ke2RhdGVEZWxpbWl0ZXJ9JHtkYXl9YDsKICB9CiAgaWYgKHJlcHJlc2VudGF0aW9uICE9PSAiZGF0ZSIpIHsKICAgIGNvbnN0IG9mZnNldCA9IGRhdGVfLmdldFRpbWV6b25lT2Zmc2V0KCk7CiAgICBpZiAob2Zmc2V0ICE9PSAwKSB7CiAgICAgIGNvbnN0IGFic29sdXRlT2Zmc2V0ID0gTWF0aC5hYnMob2Zmc2V0KTsKICAgICAgY29uc3QgaG91ck9mZnNldCA9IGFkZExlYWRpbmdaZXJvcyhNYXRoLnRydW5jKGFic29sdXRlT2Zmc2V0IC8gNjApLCAyKTsKICAgICAgY29uc3QgbWludXRlT2Zmc2V0ID0gYWRkTGVhZGluZ1plcm9zKGFic29sdXRlT2Zmc2V0ICUgNjAsIDIpOwogICAgICBjb25zdCBzaWduID0gb2Zmc2V0IDwgMCA/ICIrIiA6ICItIjsKICAgICAgdHpPZmZzZXQgPSBgJHtzaWdufSR7aG91ck9mZnNldH06JHttaW51dGVPZmZzZXR9YDsKICAgIH0gZWxzZSB7CiAgICAgIHR6T2Zmc2V0ID0gIloiOwogICAgfQogICAgY29uc3QgaG91ciA9IGFkZExlYWRpbmdaZXJvcyhkYXRlXy5nZXRIb3VycygpLCAyKTsKICAgIGNvbnN0IG1pbnV0ZSA9IGFkZExlYWRpbmdaZXJvcyhkYXRlXy5nZXRNaW51dGVzKCksIDIpOwogICAgY29uc3Qgc2Vjb25kID0gYWRkTGVhZGluZ1plcm9zKGRhdGVfLmdldFNlY29uZHMoKSwgMik7CiAgICBjb25zdCBzZXBhcmF0b3IgPSByZXN1bHQgPT09ICIiID8gIiIgOiAiVCI7CiAgICBjb25zdCB0aW1lID0gW2hvdXIsIG1pbnV0ZSwgc2Vjb25kXS5qb2luKHRpbWVEZWxpbWl0ZXIpOwogICAgcmVzdWx0ID0gYCR7cmVzdWx0fSR7c2VwYXJhdG9yfSR7dGltZX0ke3R6T2Zmc2V0fWA7CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KX19uYW1lKGZvcm1hdElTTywgImZvcm1hdElTTyIpOwp2YXIgZm9ybWF0SVNPX2RlZmF1bHQgPSBmb3JtYXRJU087CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2Zvcm1hdElTTzkwNzUuanMKZnVuY3Rpb24gZm9ybWF0SVNPOTA3NShkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgZGF0ZV8gPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGlmICghaXNWYWxpZChkYXRlXykpIHsKICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCJJbnZhbGlkIHRpbWUgdmFsdWUiKTsKICB9CiAgY29uc3QgZm9ybWF0MiA9IG9wdGlvbnM/LmZvcm1hdCA/PyAiZXh0ZW5kZWQiOwogIGNvbnN0IHJlcHJlc2VudGF0aW9uID0gb3B0aW9ucz8ucmVwcmVzZW50YXRpb24gPz8gImNvbXBsZXRlIjsKICBsZXQgcmVzdWx0ID0gIiI7CiAgY29uc3QgZGF0ZURlbGltaXRlciA9IGZvcm1hdDIgPT09ICJleHRlbmRlZCIgPyAiLSIgOiAiIjsKICBjb25zdCB0aW1lRGVsaW1pdGVyID0gZm9ybWF0MiA9PT0gImV4dGVuZGVkIiA/ICI6IiA6ICIiOwogIGlmIChyZXByZXNlbnRhdGlvbiAhPT0gInRpbWUiKSB7CiAgICBjb25zdCBkYXkgPSBhZGRMZWFkaW5nWmVyb3MoZGF0ZV8uZ2V0RGF0ZSgpLCAyKTsKICAgIGNvbnN0IG1vbnRoID0gYWRkTGVhZGluZ1plcm9zKGRhdGVfLmdldE1vbnRoKCkgKyAxLCAyKTsKICAgIGNvbnN0IHllYXIgPSBhZGRMZWFkaW5nWmVyb3MoZGF0ZV8uZ2V0RnVsbFllYXIoKSwgNCk7CiAgICByZXN1bHQgPSBgJHt5ZWFyfSR7ZGF0ZURlbGltaXRlcn0ke21vbnRofSR7ZGF0ZURlbGltaXRlcn0ke2RheX1gOwogIH0KICBpZiAocmVwcmVzZW50YXRpb24gIT09ICJkYXRlIikgewogICAgY29uc3QgaG91ciA9IGFkZExlYWRpbmdaZXJvcyhkYXRlXy5nZXRIb3VycygpLCAyKTsKICAgIGNvbnN0IG1pbnV0ZSA9IGFkZExlYWRpbmdaZXJvcyhkYXRlXy5nZXRNaW51dGVzKCksIDIpOwogICAgY29uc3Qgc2Vjb25kID0gYWRkTGVhZGluZ1plcm9zKGRhdGVfLmdldFNlY29uZHMoKSwgMik7CiAgICBjb25zdCBzZXBhcmF0b3IgPSByZXN1bHQgPT09ICIiID8gIiIgOiAiICI7CiAgICByZXN1bHQgPSBgJHtyZXN1bHR9JHtzZXBhcmF0b3J9JHtob3VyfSR7dGltZURlbGltaXRlcn0ke21pbnV0ZX0ke3RpbWVEZWxpbWl0ZXJ9JHtzZWNvbmR9YDsKICB9CiAgcmV0dXJuIHJlc3VsdDsKfQpfX25hbWUoZm9ybWF0SVNPOTA3NSwgImZvcm1hdElTTzkwNzUiKTsKdmFyIGZvcm1hdElTTzkwNzVfZGVmYXVsdCA9IGZvcm1hdElTTzkwNzU7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2Zvcm1hdElTT0R1cmF0aW9uLmpzCmZ1bmN0aW9uIGZvcm1hdElTT0R1cmF0aW9uKGR1cmF0aW9uKSB7CiAgY29uc3QgewogICAgeWVhcnMgPSAwLAogICAgbW9udGhzOiBtb250aHMyID0gMCwKICAgIGRheXM6IGRheXMyID0gMCwKICAgIGhvdXJzID0gMCwKICAgIG1pbnV0ZXMgPSAwLAogICAgc2Vjb25kcyA9IDAKICB9ID0gZHVyYXRpb247CiAgcmV0dXJuIGBQJHt5ZWFyc31ZJHttb250aHMyfU0ke2RheXMyfURUJHtob3Vyc31IJHttaW51dGVzfU0ke3NlY29uZHN9U2A7Cn0KX19uYW1lKGZvcm1hdElTT0R1cmF0aW9uLCAiZm9ybWF0SVNPRHVyYXRpb24iKTsKdmFyIGZvcm1hdElTT0R1cmF0aW9uX2RlZmF1bHQgPSBmb3JtYXRJU09EdXJhdGlvbjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZm9ybWF0UkZDMzMzOS5qcwpmdW5jdGlvbiBmb3JtYXRSRkMzMzM5KGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBkYXRlXyA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgaWYgKCFpc1ZhbGlkKGRhdGVfKSkgewogICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgdGltZSB2YWx1ZSIpOwogIH0KICBjb25zdCBmcmFjdGlvbkRpZ2l0cyA9IG9wdGlvbnM/LmZyYWN0aW9uRGlnaXRzID8/IDA7CiAgY29uc3QgZGF5ID0gYWRkTGVhZGluZ1plcm9zKGRhdGVfLmdldERhdGUoKSwgMik7CiAgY29uc3QgbW9udGggPSBhZGRMZWFkaW5nWmVyb3MoZGF0ZV8uZ2V0TW9udGgoKSArIDEsIDIpOwogIGNvbnN0IHllYXIgPSBkYXRlXy5nZXRGdWxsWWVhcigpOwogIGNvbnN0IGhvdXIgPSBhZGRMZWFkaW5nWmVyb3MoZGF0ZV8uZ2V0SG91cnMoKSwgMik7CiAgY29uc3QgbWludXRlID0gYWRkTGVhZGluZ1plcm9zKGRhdGVfLmdldE1pbnV0ZXMoKSwgMik7CiAgY29uc3Qgc2Vjb25kID0gYWRkTGVhZGluZ1plcm9zKGRhdGVfLmdldFNlY29uZHMoKSwgMik7CiAgbGV0IGZyYWN0aW9uYWxTZWNvbmQgPSAiIjsKICBpZiAoZnJhY3Rpb25EaWdpdHMgPiAwKSB7CiAgICBjb25zdCBtaWxsaXNlY29uZHMyID0gZGF0ZV8uZ2V0TWlsbGlzZWNvbmRzKCk7CiAgICBjb25zdCBmcmFjdGlvbmFsU2Vjb25kcyA9IE1hdGgudHJ1bmMoCiAgICAgIG1pbGxpc2Vjb25kczIgKiBNYXRoLnBvdygxMCwgZnJhY3Rpb25EaWdpdHMgLSAzKQogICAgKTsKICAgIGZyYWN0aW9uYWxTZWNvbmQgPSAiLiIgKyBhZGRMZWFkaW5nWmVyb3MoZnJhY3Rpb25hbFNlY29uZHMsIGZyYWN0aW9uRGlnaXRzKTsKICB9CiAgbGV0IG9mZnNldCA9ICIiOwogIGNvbnN0IHR6T2Zmc2V0ID0gZGF0ZV8uZ2V0VGltZXpvbmVPZmZzZXQoKTsKICBpZiAodHpPZmZzZXQgIT09IDApIHsKICAgIGNvbnN0IGFic29sdXRlT2Zmc2V0ID0gTWF0aC5hYnModHpPZmZzZXQpOwogICAgY29uc3QgaG91ck9mZnNldCA9IGFkZExlYWRpbmdaZXJvcyhNYXRoLnRydW5jKGFic29sdXRlT2Zmc2V0IC8gNjApLCAyKTsKICAgIGNvbnN0IG1pbnV0ZU9mZnNldCA9IGFkZExlYWRpbmdaZXJvcyhhYnNvbHV0ZU9mZnNldCAlIDYwLCAyKTsKICAgIGNvbnN0IHNpZ24gPSB0ek9mZnNldCA8IDAgPyAiKyIgOiAiLSI7CiAgICBvZmZzZXQgPSBgJHtzaWdufSR7aG91ck9mZnNldH06JHttaW51dGVPZmZzZXR9YDsKICB9IGVsc2UgewogICAgb2Zmc2V0ID0gIloiOwogIH0KICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9VCR7aG91cn06JHttaW51dGV9OiR7c2Vjb25kfSR7ZnJhY3Rpb25hbFNlY29uZH0ke29mZnNldH1gOwp9Cl9fbmFtZShmb3JtYXRSRkMzMzM5LCAiZm9ybWF0UkZDMzMzOSIpOwp2YXIgZm9ybWF0UkZDMzMzOV9kZWZhdWx0ID0gZm9ybWF0UkZDMzMzOTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZm9ybWF0UkZDNzIzMS5qcwp2YXIgZGF5cyA9IFsiU3VuIiwgIk1vbiIsICJUdWUiLCAiV2VkIiwgIlRodSIsICJGcmkiLCAiU2F0Il07CnZhciBtb250aHMgPSBbCiAgIkphbiIsCiAgIkZlYiIsCiAgIk1hciIsCiAgIkFwciIsCiAgIk1heSIsCiAgIkp1biIsCiAgIkp1bCIsCiAgIkF1ZyIsCiAgIlNlcCIsCiAgIk9jdCIsCiAgIk5vdiIsCiAgIkRlYyIKXTsKZnVuY3Rpb24gZm9ybWF0UkZDNzIzMShkYXRlKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSk7CiAgaWYgKCFpc1ZhbGlkKF9kYXRlKSkgewogICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgdGltZSB2YWx1ZSIpOwogIH0KICBjb25zdCBkYXlOYW1lID0gZGF5c1tfZGF0ZS5nZXRVVENEYXkoKV07CiAgY29uc3QgZGF5T2ZNb250aCA9IGFkZExlYWRpbmdaZXJvcyhfZGF0ZS5nZXRVVENEYXRlKCksIDIpOwogIGNvbnN0IG1vbnRoTmFtZSA9IG1vbnRoc1tfZGF0ZS5nZXRVVENNb250aCgpXTsKICBjb25zdCB5ZWFyID0gX2RhdGUuZ2V0VVRDRnVsbFllYXIoKTsKICBjb25zdCBob3VyID0gYWRkTGVhZGluZ1plcm9zKF9kYXRlLmdldFVUQ0hvdXJzKCksIDIpOwogIGNvbnN0IG1pbnV0ZSA9IGFkZExlYWRpbmdaZXJvcyhfZGF0ZS5nZXRVVENNaW51dGVzKCksIDIpOwogIGNvbnN0IHNlY29uZCA9IGFkZExlYWRpbmdaZXJvcyhfZGF0ZS5nZXRVVENTZWNvbmRzKCksIDIpOwogIHJldHVybiBgJHtkYXlOYW1lfSwgJHtkYXlPZk1vbnRofSAke21vbnRoTmFtZX0gJHt5ZWFyfSAke2hvdXJ9OiR7bWludXRlfToke3NlY29uZH0gR01UYDsKfQpfX25hbWUoZm9ybWF0UkZDNzIzMSwgImZvcm1hdFJGQzcyMzEiKTsKdmFyIGZvcm1hdFJGQzcyMzFfZGVmYXVsdCA9IGZvcm1hdFJGQzcyMzE7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2Zvcm1hdFJlbGF0aXZlLmpzCmZ1bmN0aW9uIGZvcm1hdFJlbGF0aXZlMihkYXRlLCBiYXNlRGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IFtkYXRlXywgYmFzZURhdGVfXSA9IG5vcm1hbGl6ZURhdGVzKG9wdGlvbnM/LmluLCBkYXRlLCBiYXNlRGF0ZSk7CiAgY29uc3QgZGVmYXVsdE9wdGlvbnMyID0gZ2V0RGVmYXVsdE9wdGlvbnMoKTsKICBjb25zdCBsb2NhbGUgPSBvcHRpb25zPy5sb2NhbGUgPz8gZGVmYXVsdE9wdGlvbnMyLmxvY2FsZSA/PyBlblVTOwogIGNvbnN0IHdlZWtTdGFydHNPbiA9IG9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyBkZWZhdWx0T3B0aW9uczIud2Vla1N0YXJ0c09uID8/IGRlZmF1bHRPcHRpb25zMi5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyAwOwogIGNvbnN0IGRpZmYgPSBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoZGF0ZV8sIGJhc2VEYXRlXyk7CiAgaWYgKGlzTmFOKGRpZmYpKSB7CiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0aW1lIHZhbHVlIik7CiAgfQogIGxldCB0b2tlbjsKICBpZiAoZGlmZiA8IC02KSB7CiAgICB0b2tlbiA9ICJvdGhlciI7CiAgfSBlbHNlIGlmIChkaWZmIDwgLTEpIHsKICAgIHRva2VuID0gImxhc3RXZWVrIjsKICB9IGVsc2UgaWYgKGRpZmYgPCAwKSB7CiAgICB0b2tlbiA9ICJ5ZXN0ZXJkYXkiOwogIH0gZWxzZSBpZiAoZGlmZiA8IDEpIHsKICAgIHRva2VuID0gInRvZGF5IjsKICB9IGVsc2UgaWYgKGRpZmYgPCAyKSB7CiAgICB0b2tlbiA9ICJ0b21vcnJvdyI7CiAgfSBlbHNlIGlmIChkaWZmIDwgNykgewogICAgdG9rZW4gPSAibmV4dFdlZWsiOwogIH0gZWxzZSB7CiAgICB0b2tlbiA9ICJvdGhlciI7CiAgfQogIGNvbnN0IGZvcm1hdFN0ciA9IGxvY2FsZS5mb3JtYXRSZWxhdGl2ZSh0b2tlbiwgZGF0ZV8sIGJhc2VEYXRlXywgewogICAgbG9jYWxlLAogICAgd2Vla1N0YXJ0c09uCiAgfSk7CiAgcmV0dXJuIGZvcm1hdChkYXRlXywgZm9ybWF0U3RyLCB7IGxvY2FsZSwgd2Vla1N0YXJ0c09uIH0pOwp9Cl9fbmFtZShmb3JtYXRSZWxhdGl2ZTIsICJmb3JtYXRSZWxhdGl2ZSIpOwp2YXIgZm9ybWF0UmVsYXRpdmVfZGVmYXVsdCA9IGZvcm1hdFJlbGF0aXZlMjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZnJvbVVuaXhUaW1lLmpzCmZ1bmN0aW9uIGZyb21Vbml4VGltZSh1bml4VGltZSwgb3B0aW9ucykgewogIHJldHVybiB0b0RhdGUodW5peFRpbWUgKiAxZTMsIG9wdGlvbnM/LmluKTsKfQpfX25hbWUoZnJvbVVuaXhUaW1lLCAiZnJvbVVuaXhUaW1lIik7CnZhciBmcm9tVW5peFRpbWVfZGVmYXVsdCA9IGZyb21Vbml4VGltZTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0RGF0ZS5qcwpmdW5jdGlvbiBnZXREYXRlKGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKS5nZXREYXRlKCk7Cn0KX19uYW1lKGdldERhdGUsICJnZXREYXRlIik7CnZhciBnZXREYXRlX2RlZmF1bHQgPSBnZXREYXRlOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXREYXkuanMKZnVuY3Rpb24gZ2V0RGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKS5nZXREYXkoKTsKfQpfX25hbWUoZ2V0RGF5LCAiZ2V0RGF5Iik7CnZhciBnZXREYXlfZGVmYXVsdCA9IGdldERheTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0RGF5c0luTW9udGguanMKZnVuY3Rpb24gZ2V0RGF5c0luTW9udGgoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCB5ZWFyID0gX2RhdGUuZ2V0RnVsbFllYXIoKTsKICBjb25zdCBtb250aEluZGV4ID0gX2RhdGUuZ2V0TW9udGgoKTsKICBjb25zdCBsYXN0RGF5T2ZNb250aDIgPSBjb25zdHJ1Y3RGcm9tKF9kYXRlLCAwKTsKICBsYXN0RGF5T2ZNb250aDIuc2V0RnVsbFllYXIoeWVhciwgbW9udGhJbmRleCArIDEsIDApOwogIGxhc3REYXlPZk1vbnRoMi5zZXRIb3VycygwLCAwLCAwLCAwKTsKICByZXR1cm4gbGFzdERheU9mTW9udGgyLmdldERhdGUoKTsKfQpfX25hbWUoZ2V0RGF5c0luTW9udGgsICJnZXREYXlzSW5Nb250aCIpOwp2YXIgZ2V0RGF5c0luTW9udGhfZGVmYXVsdCA9IGdldERheXNJbk1vbnRoOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc0xlYXBZZWFyLmpzCmZ1bmN0aW9uIGlzTGVhcFllYXIoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCB5ZWFyID0gX2RhdGUuZ2V0RnVsbFllYXIoKTsKICByZXR1cm4geWVhciAlIDQwMCA9PT0gMCB8fCB5ZWFyICUgNCA9PT0gMCAmJiB5ZWFyICUgMTAwICE9PSAwOwp9Cl9fbmFtZShpc0xlYXBZZWFyLCAiaXNMZWFwWWVhciIpOwp2YXIgaXNMZWFwWWVhcl9kZWZhdWx0ID0gaXNMZWFwWWVhcjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0RGF5c0luWWVhci5qcwpmdW5jdGlvbiBnZXREYXlzSW5ZZWFyKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgaWYgKE51bWJlci5pc05hTigrX2RhdGUpKSByZXR1cm4gTmFOOwogIHJldHVybiBpc0xlYXBZZWFyKF9kYXRlKSA/IDM2NiA6IDM2NTsKfQpfX25hbWUoZ2V0RGF5c0luWWVhciwgImdldERheXNJblllYXIiKTsKdmFyIGdldERheXNJblllYXJfZGVmYXVsdCA9IGdldERheXNJblllYXI7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldERlY2FkZS5qcwpmdW5jdGlvbiBnZXREZWNhZGUoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCB5ZWFyID0gX2RhdGUuZ2V0RnVsbFllYXIoKTsKICBjb25zdCBkZWNhZGUgPSBNYXRoLmZsb29yKHllYXIgLyAxMCkgKiAxMDsKICByZXR1cm4gZGVjYWRlOwp9Cl9fbmFtZShnZXREZWNhZGUsICJnZXREZWNhZGUiKTsKdmFyIGdldERlY2FkZV9kZWZhdWx0ID0gZ2V0RGVjYWRlOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXREZWZhdWx0T3B0aW9ucy5qcwpmdW5jdGlvbiBnZXREZWZhdWx0T3B0aW9uczIoKSB7CiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGdldERlZmF1bHRPcHRpb25zKCkpOwp9Cl9fbmFtZShnZXREZWZhdWx0T3B0aW9uczIsICJnZXREZWZhdWx0T3B0aW9ucyIpOwp2YXIgZ2V0RGVmYXVsdE9wdGlvbnNfZGVmYXVsdCA9IGdldERlZmF1bHRPcHRpb25zMjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0SG91cnMuanMKZnVuY3Rpb24gZ2V0SG91cnMoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pLmdldEhvdXJzKCk7Cn0KX19uYW1lKGdldEhvdXJzLCAiZ2V0SG91cnMiKTsKdmFyIGdldEhvdXJzX2RlZmF1bHQgPSBnZXRIb3VyczsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0SVNPRGF5LmpzCmZ1bmN0aW9uIGdldElTT0RheShkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgZGF5ID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKS5nZXREYXkoKTsKICByZXR1cm4gZGF5ID09PSAwID8gNyA6IGRheTsKfQpfX25hbWUoZ2V0SVNPRGF5LCAiZ2V0SVNPRGF5Iik7CnZhciBnZXRJU09EYXlfZGVmYXVsdCA9IGdldElTT0RheTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0SVNPV2Vla3NJblllYXIuanMKZnVuY3Rpb24gZ2V0SVNPV2Vla3NJblllYXIoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IHRoaXNZZWFyID0gc3RhcnRPZklTT1dlZWtZZWFyKGRhdGUsIG9wdGlvbnMpOwogIGNvbnN0IG5leHRZZWFyID0gc3RhcnRPZklTT1dlZWtZZWFyKGFkZFdlZWtzKHRoaXNZZWFyLCA2MCkpOwogIGNvbnN0IGRpZmYgPSArbmV4dFllYXIgLSArdGhpc1llYXI7CiAgcmV0dXJuIE1hdGgucm91bmQoZGlmZiAvIG1pbGxpc2Vjb25kc0luV2Vlayk7Cn0KX19uYW1lKGdldElTT1dlZWtzSW5ZZWFyLCAiZ2V0SVNPV2Vla3NJblllYXIiKTsKdmFyIGdldElTT1dlZWtzSW5ZZWFyX2RlZmF1bHQgPSBnZXRJU09XZWVrc0luWWVhcjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0TWlsbGlzZWNvbmRzLmpzCmZ1bmN0aW9uIGdldE1pbGxpc2Vjb25kcyhkYXRlKSB7CiAgcmV0dXJuIHRvRGF0ZShkYXRlKS5nZXRNaWxsaXNlY29uZHMoKTsKfQpfX25hbWUoZ2V0TWlsbGlzZWNvbmRzLCAiZ2V0TWlsbGlzZWNvbmRzIik7CnZhciBnZXRNaWxsaXNlY29uZHNfZGVmYXVsdCA9IGdldE1pbGxpc2Vjb25kczsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0TWludXRlcy5qcwpmdW5jdGlvbiBnZXRNaW51dGVzKGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKS5nZXRNaW51dGVzKCk7Cn0KX19uYW1lKGdldE1pbnV0ZXMsICJnZXRNaW51dGVzIik7CnZhciBnZXRNaW51dGVzX2RlZmF1bHQgPSBnZXRNaW51dGVzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRNb250aC5qcwpmdW5jdGlvbiBnZXRNb250aChkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbikuZ2V0TW9udGgoKTsKfQpfX25hbWUoZ2V0TW9udGgsICJnZXRNb250aCIpOwp2YXIgZ2V0TW9udGhfZGVmYXVsdCA9IGdldE1vbnRoOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRPdmVybGFwcGluZ0RheXNJbkludGVydmFscy5qcwpmdW5jdGlvbiBnZXRPdmVybGFwcGluZ0RheXNJbkludGVydmFscyhpbnRlcnZhbExlZnQsIGludGVydmFsUmlnaHQpIHsKICBjb25zdCBbbGVmdFN0YXJ0LCBsZWZ0RW5kXSA9IFsKICAgICt0b0RhdGUoaW50ZXJ2YWxMZWZ0LnN0YXJ0KSwKICAgICt0b0RhdGUoaW50ZXJ2YWxMZWZ0LmVuZCkKICBdLnNvcnQoKGE0LCBiNCkgPT4gYTQgLSBiNCk7CiAgY29uc3QgW3JpZ2h0U3RhcnQsIHJpZ2h0RW5kXSA9IFsKICAgICt0b0RhdGUoaW50ZXJ2YWxSaWdodC5zdGFydCksCiAgICArdG9EYXRlKGludGVydmFsUmlnaHQuZW5kKQogIF0uc29ydCgoYTQsIGI0KSA9PiBhNCAtIGI0KTsKICBjb25zdCBpc092ZXJsYXBwaW5nID0gbGVmdFN0YXJ0IDwgcmlnaHRFbmQgJiYgcmlnaHRTdGFydCA8IGxlZnRFbmQ7CiAgaWYgKCFpc092ZXJsYXBwaW5nKSByZXR1cm4gMDsKICBjb25zdCBvdmVybGFwTGVmdCA9IHJpZ2h0U3RhcnQgPCBsZWZ0U3RhcnQgPyBsZWZ0U3RhcnQgOiByaWdodFN0YXJ0OwogIGNvbnN0IGxlZnQgPSBvdmVybGFwTGVmdCAtIGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMob3ZlcmxhcExlZnQpOwogIGNvbnN0IG92ZXJsYXBSaWdodCA9IHJpZ2h0RW5kID4gbGVmdEVuZCA/IGxlZnRFbmQgOiByaWdodEVuZDsKICBjb25zdCByaWdodCA9IG92ZXJsYXBSaWdodCAtIGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMob3ZlcmxhcFJpZ2h0KTsKICByZXR1cm4gTWF0aC5jZWlsKChyaWdodCAtIGxlZnQpIC8gbWlsbGlzZWNvbmRzSW5EYXkpOwp9Cl9fbmFtZShnZXRPdmVybGFwcGluZ0RheXNJbkludGVydmFscywgImdldE92ZXJsYXBwaW5nRGF5c0luSW50ZXJ2YWxzIik7CnZhciBnZXRPdmVybGFwcGluZ0RheXNJbkludGVydmFsc19kZWZhdWx0ID0gZ2V0T3ZlcmxhcHBpbmdEYXlzSW5JbnRlcnZhbHM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldFNlY29uZHMuanMKZnVuY3Rpb24gZ2V0U2Vjb25kcyhkYXRlKSB7CiAgcmV0dXJuIHRvRGF0ZShkYXRlKS5nZXRTZWNvbmRzKCk7Cn0KX19uYW1lKGdldFNlY29uZHMsICJnZXRTZWNvbmRzIik7CnZhciBnZXRTZWNvbmRzX2RlZmF1bHQgPSBnZXRTZWNvbmRzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRUaW1lLmpzCmZ1bmN0aW9uIGdldFRpbWUoZGF0ZSkgewogIHJldHVybiArdG9EYXRlKGRhdGUpOwp9Cl9fbmFtZShnZXRUaW1lLCAiZ2V0VGltZSIpOwp2YXIgZ2V0VGltZV9kZWZhdWx0ID0gZ2V0VGltZTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0VW5peFRpbWUuanMKZnVuY3Rpb24gZ2V0VW5peFRpbWUoZGF0ZSkgewogIHJldHVybiBNYXRoLnRydW5jKCt0b0RhdGUoZGF0ZSkgLyAxZTMpOwp9Cl9fbmFtZShnZXRVbml4VGltZSwgImdldFVuaXhUaW1lIik7CnZhciBnZXRVbml4VGltZV9kZWZhdWx0ID0gZ2V0VW5peFRpbWU7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldFdlZWtPZk1vbnRoLmpzCmZ1bmN0aW9uIGdldFdlZWtPZk1vbnRoKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBkZWZhdWx0T3B0aW9uczIgPSBnZXREZWZhdWx0T3B0aW9ucygpOwogIGNvbnN0IHdlZWtTdGFydHNPbiA9IG9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyBkZWZhdWx0T3B0aW9uczIud2Vla1N0YXJ0c09uID8/IGRlZmF1bHRPcHRpb25zMi5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyAwOwogIGNvbnN0IGN1cnJlbnREYXlPZk1vbnRoID0gZ2V0RGF0ZSh0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pKTsKICBpZiAoaXNOYU4oY3VycmVudERheU9mTW9udGgpKSByZXR1cm4gTmFOOwogIGNvbnN0IHN0YXJ0V2Vla0RheSA9IGdldERheShzdGFydE9mTW9udGgoZGF0ZSwgb3B0aW9ucykpOwogIGxldCBsYXN0RGF5T2ZGaXJzdFdlZWsgPSB3ZWVrU3RhcnRzT24gLSBzdGFydFdlZWtEYXk7CiAgaWYgKGxhc3REYXlPZkZpcnN0V2VlayA8PSAwKSBsYXN0RGF5T2ZGaXJzdFdlZWsgKz0gNzsKICBjb25zdCByZW1haW5pbmdEYXlzQWZ0ZXJGaXJzdFdlZWsgPSBjdXJyZW50RGF5T2ZNb250aCAtIGxhc3REYXlPZkZpcnN0V2VlazsKICByZXR1cm4gTWF0aC5jZWlsKHJlbWFpbmluZ0RheXNBZnRlckZpcnN0V2VlayAvIDcpICsgMTsKfQpfX25hbWUoZ2V0V2Vla09mTW9udGgsICJnZXRXZWVrT2ZNb250aCIpOwp2YXIgZ2V0V2Vla09mTW9udGhfZGVmYXVsdCA9IGdldFdlZWtPZk1vbnRoOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sYXN0RGF5T2ZNb250aC5qcwpmdW5jdGlvbiBsYXN0RGF5T2ZNb250aChkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGNvbnN0IG1vbnRoID0gX2RhdGUuZ2V0TW9udGgoKTsKICBfZGF0ZS5zZXRGdWxsWWVhcihfZGF0ZS5nZXRGdWxsWWVhcigpLCBtb250aCArIDEsIDApOwogIF9kYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogIHJldHVybiB0b0RhdGUoX2RhdGUsIG9wdGlvbnM/LmluKTsKfQpfX25hbWUobGFzdERheU9mTW9udGgsICJsYXN0RGF5T2ZNb250aCIpOwp2YXIgbGFzdERheU9mTW9udGhfZGVmYXVsdCA9IGxhc3REYXlPZk1vbnRoOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRXZWVrc0luTW9udGguanMKZnVuY3Rpb24gZ2V0V2Vla3NJbk1vbnRoKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBjb250ZXh0RGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgcmV0dXJuIGRpZmZlcmVuY2VJbkNhbGVuZGFyV2Vla3MoCiAgICBsYXN0RGF5T2ZNb250aChjb250ZXh0RGF0ZSwgb3B0aW9ucyksCiAgICBzdGFydE9mTW9udGgoY29udGV4dERhdGUsIG9wdGlvbnMpLAogICAgb3B0aW9ucwogICkgKyAxOwp9Cl9fbmFtZShnZXRXZWVrc0luTW9udGgsICJnZXRXZWVrc0luTW9udGgiKTsKdmFyIGdldFdlZWtzSW5Nb250aF9kZWZhdWx0ID0gZ2V0V2Vla3NJbk1vbnRoOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRZZWFyLmpzCmZ1bmN0aW9uIGdldFllYXIoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pLmdldEZ1bGxZZWFyKCk7Cn0KX19uYW1lKGdldFllYXIsICJnZXRZZWFyIik7CnZhciBnZXRZZWFyX2RlZmF1bHQgPSBnZXRZZWFyOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9ob3Vyc1RvTWlsbGlzZWNvbmRzLmpzCmZ1bmN0aW9uIGhvdXJzVG9NaWxsaXNlY29uZHMoaG91cnMpIHsKICByZXR1cm4gTWF0aC50cnVuYyhob3VycyAqIG1pbGxpc2Vjb25kc0luSG91cik7Cn0KX19uYW1lKGhvdXJzVG9NaWxsaXNlY29uZHMsICJob3Vyc1RvTWlsbGlzZWNvbmRzIik7CnZhciBob3Vyc1RvTWlsbGlzZWNvbmRzX2RlZmF1bHQgPSBob3Vyc1RvTWlsbGlzZWNvbmRzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9ob3Vyc1RvTWludXRlcy5qcwpmdW5jdGlvbiBob3Vyc1RvTWludXRlcyhob3VycykgewogIHJldHVybiBNYXRoLnRydW5jKGhvdXJzICogbWludXRlc0luSG91cik7Cn0KX19uYW1lKGhvdXJzVG9NaW51dGVzLCAiaG91cnNUb01pbnV0ZXMiKTsKdmFyIGhvdXJzVG9NaW51dGVzX2RlZmF1bHQgPSBob3Vyc1RvTWludXRlczsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaG91cnNUb1NlY29uZHMuanMKZnVuY3Rpb24gaG91cnNUb1NlY29uZHMoaG91cnMpIHsKICByZXR1cm4gTWF0aC50cnVuYyhob3VycyAqIHNlY29uZHNJbkhvdXIpOwp9Cl9fbmFtZShob3Vyc1RvU2Vjb25kcywgImhvdXJzVG9TZWNvbmRzIik7CnZhciBob3Vyc1RvU2Vjb25kc19kZWZhdWx0ID0gaG91cnNUb1NlY29uZHM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2ludGVydmFsLmpzCmZ1bmN0aW9uIGludGVydmFsMihzdGFydCwgZW5kLCBvcHRpb25zKSB7CiAgY29uc3QgW19zdGFydCwgX2VuZF0gPSBub3JtYWxpemVEYXRlcyhvcHRpb25zPy5pbiwgc3RhcnQsIGVuZCk7CiAgaWYgKGlzTmFOKCtfc3RhcnQpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJTdGFydCBkYXRlIGlzIGludmFsaWQiKTsKICBpZiAoaXNOYU4oK19lbmQpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJFbmQgZGF0ZSBpcyBpbnZhbGlkIik7CiAgaWYgKG9wdGlvbnM/LmFzc2VydFBvc2l0aXZlICYmICtfc3RhcnQgPiArX2VuZCkKICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkVuZCBkYXRlIG11c3QgYmUgYWZ0ZXIgc3RhcnQgZGF0ZSIpOwogIHJldHVybiB7IHN0YXJ0OiBfc3RhcnQsIGVuZDogX2VuZCB9Owp9Cl9fbmFtZShpbnRlcnZhbDIsICJpbnRlcnZhbCIpOwp2YXIgaW50ZXJ2YWxfZGVmYXVsdCA9IGludGVydmFsMjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaW50ZXJ2YWxUb0R1cmF0aW9uLmpzCmZ1bmN0aW9uIGludGVydmFsVG9EdXJhdGlvbihpbnRlcnZhbDMsIG9wdGlvbnMpIHsKICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IG5vcm1hbGl6ZUludGVydmFsKG9wdGlvbnM/LmluLCBpbnRlcnZhbDMpOwogIGNvbnN0IGR1cmF0aW9uID0ge307CiAgY29uc3QgeWVhcnMgPSBkaWZmZXJlbmNlSW5ZZWFycyhlbmQsIHN0YXJ0KTsKICBpZiAoeWVhcnMpIGR1cmF0aW9uLnllYXJzID0geWVhcnM7CiAgY29uc3QgcmVtYWluaW5nTW9udGhzID0gYWRkKHN0YXJ0LCB7IHllYXJzOiBkdXJhdGlvbi55ZWFycyB9KTsKICBjb25zdCBtb250aHMyID0gZGlmZmVyZW5jZUluTW9udGhzKGVuZCwgcmVtYWluaW5nTW9udGhzKTsKICBpZiAobW9udGhzMikgZHVyYXRpb24ubW9udGhzID0gbW9udGhzMjsKICBjb25zdCByZW1haW5pbmdEYXlzID0gYWRkKHJlbWFpbmluZ01vbnRocywgeyBtb250aHM6IGR1cmF0aW9uLm1vbnRocyB9KTsKICBjb25zdCBkYXlzMiA9IGRpZmZlcmVuY2VJbkRheXMoZW5kLCByZW1haW5pbmdEYXlzKTsKICBpZiAoZGF5czIpIGR1cmF0aW9uLmRheXMgPSBkYXlzMjsKICBjb25zdCByZW1haW5pbmdIb3VycyA9IGFkZChyZW1haW5pbmdEYXlzLCB7IGRheXM6IGR1cmF0aW9uLmRheXMgfSk7CiAgY29uc3QgaG91cnMgPSBkaWZmZXJlbmNlSW5Ib3VycyhlbmQsIHJlbWFpbmluZ0hvdXJzKTsKICBpZiAoaG91cnMpIGR1cmF0aW9uLmhvdXJzID0gaG91cnM7CiAgY29uc3QgcmVtYWluaW5nTWludXRlcyA9IGFkZChyZW1haW5pbmdIb3VycywgeyBob3VyczogZHVyYXRpb24uaG91cnMgfSk7CiAgY29uc3QgbWludXRlcyA9IGRpZmZlcmVuY2VJbk1pbnV0ZXMoZW5kLCByZW1haW5pbmdNaW51dGVzKTsKICBpZiAobWludXRlcykgZHVyYXRpb24ubWludXRlcyA9IG1pbnV0ZXM7CiAgY29uc3QgcmVtYWluaW5nU2Vjb25kcyA9IGFkZChyZW1haW5pbmdNaW51dGVzLCB7IG1pbnV0ZXM6IGR1cmF0aW9uLm1pbnV0ZXMgfSk7CiAgY29uc3Qgc2Vjb25kcyA9IGRpZmZlcmVuY2VJblNlY29uZHMoZW5kLCByZW1haW5pbmdTZWNvbmRzKTsKICBpZiAoc2Vjb25kcykgZHVyYXRpb24uc2Vjb25kcyA9IHNlY29uZHM7CiAgcmV0dXJuIGR1cmF0aW9uOwp9Cl9fbmFtZShpbnRlcnZhbFRvRHVyYXRpb24sICJpbnRlcnZhbFRvRHVyYXRpb24iKTsKdmFyIGludGVydmFsVG9EdXJhdGlvbl9kZWZhdWx0ID0gaW50ZXJ2YWxUb0R1cmF0aW9uOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pbnRsRm9ybWF0LmpzCmZ1bmN0aW9uIGludGxGb3JtYXQoZGF0ZSwgZm9ybWF0T3JMb2NhbGUsIGxvY2FsZU9wdGlvbnMpIHsKICBsZXQgZm9ybWF0T3B0aW9uczsKICBpZiAoaXNGb3JtYXRPcHRpb25zKGZvcm1hdE9yTG9jYWxlKSkgewogICAgZm9ybWF0T3B0aW9ucyA9IGZvcm1hdE9yTG9jYWxlOwogIH0gZWxzZSB7CiAgICBsb2NhbGVPcHRpb25zID0gZm9ybWF0T3JMb2NhbGU7CiAgfQogIHJldHVybiBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChsb2NhbGVPcHRpb25zPy5sb2NhbGUsIGZvcm1hdE9wdGlvbnMpLmZvcm1hdCgKICAgIHRvRGF0ZShkYXRlKQogICk7Cn0KX19uYW1lKGludGxGb3JtYXQsICJpbnRsRm9ybWF0Iik7CmZ1bmN0aW9uIGlzRm9ybWF0T3B0aW9ucyhvcHRzKSB7CiAgcmV0dXJuIG9wdHMgIT09IHZvaWQgMCAmJiAhKCJsb2NhbGUiIGluIG9wdHMpOwp9Cl9fbmFtZShpc0Zvcm1hdE9wdGlvbnMsICJpc0Zvcm1hdE9wdGlvbnMiKTsKdmFyIGludGxGb3JtYXRfZGVmYXVsdCA9IGludGxGb3JtYXQ7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2ludGxGb3JtYXREaXN0YW5jZS5qcwpmdW5jdGlvbiBpbnRsRm9ybWF0RGlzdGFuY2UobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgb3B0aW9ucykgewogIGxldCB2YWx1ZTIgPSAwOwogIGxldCB1bml0OwogIGNvbnN0IFtsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV9dID0gbm9ybWFsaXplRGF0ZXMoCiAgICBvcHRpb25zPy5pbiwKICAgIGxhdGVyRGF0ZSwKICAgIGVhcmxpZXJEYXRlCiAgKTsKICBpZiAoIW9wdGlvbnM/LnVuaXQpIHsKICAgIGNvbnN0IGRpZmZJblNlY29uZHMgPSBkaWZmZXJlbmNlSW5TZWNvbmRzKGxhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlXyk7CiAgICBpZiAoTWF0aC5hYnMoZGlmZkluU2Vjb25kcykgPCBzZWNvbmRzSW5NaW51dGUpIHsKICAgICAgdmFsdWUyID0gZGlmZmVyZW5jZUluU2Vjb25kcyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pOwogICAgICB1bml0ID0gInNlY29uZCI7CiAgICB9IGVsc2UgaWYgKE1hdGguYWJzKGRpZmZJblNlY29uZHMpIDwgc2Vjb25kc0luSG91cikgewogICAgICB2YWx1ZTIgPSBkaWZmZXJlbmNlSW5NaW51dGVzKGxhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlXyk7CiAgICAgIHVuaXQgPSAibWludXRlIjsKICAgIH0gZWxzZSBpZiAoTWF0aC5hYnMoZGlmZkluU2Vjb25kcykgPCBzZWNvbmRzSW5EYXkgJiYgTWF0aC5hYnMoZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGxhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlXykpIDwgMSkgewogICAgICB2YWx1ZTIgPSBkaWZmZXJlbmNlSW5Ib3VycyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pOwogICAgICB1bml0ID0gImhvdXIiOwogICAgfSBlbHNlIGlmIChNYXRoLmFicyhkaWZmSW5TZWNvbmRzKSA8IHNlY29uZHNJbldlZWsgJiYgKHZhbHVlMiA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pKSAmJiBNYXRoLmFicyh2YWx1ZTIpIDwgNykgewogICAgICB1bml0ID0gImRheSI7CiAgICB9IGVsc2UgaWYgKE1hdGguYWJzKGRpZmZJblNlY29uZHMpIDwgc2Vjb25kc0luTW9udGgpIHsKICAgICAgdmFsdWUyID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJXZWVrcyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pOwogICAgICB1bml0ID0gIndlZWsiOwogICAgfSBlbHNlIGlmIChNYXRoLmFicyhkaWZmSW5TZWNvbmRzKSA8IHNlY29uZHNJblF1YXJ0ZXIpIHsKICAgICAgdmFsdWUyID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKTsKICAgICAgdW5pdCA9ICJtb250aCI7CiAgICB9IGVsc2UgaWYgKE1hdGguYWJzKGRpZmZJblNlY29uZHMpIDwgc2Vjb25kc0luWWVhcikgewogICAgICBpZiAoZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVycyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pIDwgNCkgewogICAgICAgIHZhbHVlMiA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyUXVhcnRlcnMobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKTsKICAgICAgICB1bml0ID0gInF1YXJ0ZXIiOwogICAgICB9IGVsc2UgewogICAgICAgIHZhbHVlMiA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnMobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKTsKICAgICAgICB1bml0ID0gInllYXIiOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB2YWx1ZTIgPSBkaWZmZXJlbmNlSW5DYWxlbmRhclllYXJzKGxhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlXyk7CiAgICAgIHVuaXQgPSAieWVhciI7CiAgICB9CiAgfSBlbHNlIHsKICAgIHVuaXQgPSBvcHRpb25zPy51bml0OwogICAgaWYgKHVuaXQgPT09ICJzZWNvbmQiKSB7CiAgICAgIHZhbHVlMiA9IGRpZmZlcmVuY2VJblNlY29uZHMobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKTsKICAgIH0gZWxzZSBpZiAodW5pdCA9PT0gIm1pbnV0ZSIpIHsKICAgICAgdmFsdWUyID0gZGlmZmVyZW5jZUluTWludXRlcyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pOwogICAgfSBlbHNlIGlmICh1bml0ID09PSAiaG91ciIpIHsKICAgICAgdmFsdWUyID0gZGlmZmVyZW5jZUluSG91cnMobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKTsKICAgIH0gZWxzZSBpZiAodW5pdCA9PT0gImRheSIpIHsKICAgICAgdmFsdWUyID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGxhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlXyk7CiAgICB9IGVsc2UgaWYgKHVuaXQgPT09ICJ3ZWVrIikgewogICAgICB2YWx1ZTIgPSBkaWZmZXJlbmNlSW5DYWxlbmRhcldlZWtzKGxhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlXyk7CiAgICB9IGVsc2UgaWYgKHVuaXQgPT09ICJtb250aCIpIHsKICAgICAgdmFsdWUyID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKTsKICAgIH0gZWxzZSBpZiAodW5pdCA9PT0gInF1YXJ0ZXIiKSB7CiAgICAgIHZhbHVlMiA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyUXVhcnRlcnMobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKTsKICAgIH0gZWxzZSBpZiAodW5pdCA9PT0gInllYXIiKSB7CiAgICAgIHZhbHVlMiA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnMobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKTsKICAgIH0KICB9CiAgY29uc3QgcnRmID0gbmV3IEludGwuUmVsYXRpdmVUaW1lRm9ybWF0KG9wdGlvbnM/LmxvY2FsZSwgewogICAgbnVtZXJpYzogImF1dG8iLAogICAgLi4ub3B0aW9ucwogIH0pOwogIHJldHVybiBydGYuZm9ybWF0KHZhbHVlMiwgdW5pdCk7Cn0KX19uYW1lKGludGxGb3JtYXREaXN0YW5jZSwgImludGxGb3JtYXREaXN0YW5jZSIpOwp2YXIgaW50bEZvcm1hdERpc3RhbmNlX2RlZmF1bHQgPSBpbnRsRm9ybWF0RGlzdGFuY2U7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzQWZ0ZXIuanMKZnVuY3Rpb24gaXNBZnRlcihkYXRlLCBkYXRlVG9Db21wYXJlKSB7CiAgcmV0dXJuICt0b0RhdGUoZGF0ZSkgPiArdG9EYXRlKGRhdGVUb0NvbXBhcmUpOwp9Cl9fbmFtZShpc0FmdGVyLCAiaXNBZnRlciIpOwp2YXIgaXNBZnRlcl9kZWZhdWx0ID0gaXNBZnRlcjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNCZWZvcmUuanMKZnVuY3Rpb24gaXNCZWZvcmUoZGF0ZSwgZGF0ZVRvQ29tcGFyZSkgewogIHJldHVybiArdG9EYXRlKGRhdGUpIDwgK3RvRGF0ZShkYXRlVG9Db21wYXJlKTsKfQpfX25hbWUoaXNCZWZvcmUsICJpc0JlZm9yZSIpOwp2YXIgaXNCZWZvcmVfZGVmYXVsdCA9IGlzQmVmb3JlOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc0VxdWFsLmpzCmZ1bmN0aW9uIGlzRXF1YWwobGVmdERhdGUsIHJpZ2h0RGF0ZSkgewogIHJldHVybiArdG9EYXRlKGxlZnREYXRlKSA9PT0gK3RvRGF0ZShyaWdodERhdGUpOwp9Cl9fbmFtZShpc0VxdWFsLCAiaXNFcXVhbCIpOwp2YXIgaXNFcXVhbF9kZWZhdWx0ID0gaXNFcXVhbDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNFeGlzdHMuanMKZnVuY3Rpb24gaXNFeGlzdHMoeWVhciwgbW9udGgsIGRheSkgewogIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgZGF5KTsKICByZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpID09PSB5ZWFyICYmIGRhdGUuZ2V0TW9udGgoKSA9PT0gbW9udGggJiYgZGF0ZS5nZXREYXRlKCkgPT09IGRheTsKfQpfX25hbWUoaXNFeGlzdHMsICJpc0V4aXN0cyIpOwp2YXIgaXNFeGlzdHNfZGVmYXVsdCA9IGlzRXhpc3RzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc0ZpcnN0RGF5T2ZNb250aC5qcwpmdW5jdGlvbiBpc0ZpcnN0RGF5T2ZNb250aChkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbikuZ2V0RGF0ZSgpID09PSAxOwp9Cl9fbmFtZShpc0ZpcnN0RGF5T2ZNb250aCwgImlzRmlyc3REYXlPZk1vbnRoIik7CnZhciBpc0ZpcnN0RGF5T2ZNb250aF9kZWZhdWx0ID0gaXNGaXJzdERheU9mTW9udGg7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzRnJpZGF5LmpzCmZ1bmN0aW9uIGlzRnJpZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKS5nZXREYXkoKSA9PT0gNTsKfQpfX25hbWUoaXNGcmlkYXksICJpc0ZyaWRheSIpOwp2YXIgaXNGcmlkYXlfZGVmYXVsdCA9IGlzRnJpZGF5OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc0Z1dHVyZS5qcwpmdW5jdGlvbiBpc0Z1dHVyZShkYXRlKSB7CiAgcmV0dXJuICt0b0RhdGUoZGF0ZSkgPiBEYXRlLm5vdygpOwp9Cl9fbmFtZShpc0Z1dHVyZSwgImlzRnV0dXJlIik7CnZhciBpc0Z1dHVyZV9kZWZhdWx0ID0gaXNGdXR1cmU7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3RyYW5zcG9zZS5qcwpmdW5jdGlvbiB0cmFuc3Bvc2UoZGF0ZSwgY29uc3RydWN0b3IpIHsKICBjb25zdCBkYXRlXyA9IGlzQ29uc3RydWN0b3IoY29uc3RydWN0b3IpID8gbmV3IGNvbnN0cnVjdG9yKDApIDogY29uc3RydWN0RnJvbShjb25zdHJ1Y3RvciwgMCk7CiAgZGF0ZV8uc2V0RnVsbFllYXIoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIGRhdGUuZ2V0RGF0ZSgpKTsKICBkYXRlXy5zZXRIb3VycygKICAgIGRhdGUuZ2V0SG91cnMoKSwKICAgIGRhdGUuZ2V0TWludXRlcygpLAogICAgZGF0ZS5nZXRTZWNvbmRzKCksCiAgICBkYXRlLmdldE1pbGxpc2Vjb25kcygpCiAgKTsKICByZXR1cm4gZGF0ZV87Cn0KX19uYW1lKHRyYW5zcG9zZSwgInRyYW5zcG9zZSIpOwpmdW5jdGlvbiBpc0NvbnN0cnVjdG9yKGNvbnN0cnVjdG9yKSB7CiAgcmV0dXJuIHR5cGVvZiBjb25zdHJ1Y3RvciA9PT0gImZ1bmN0aW9uIiAmJiBjb25zdHJ1Y3Rvci5wcm90b3R5cGU/LmNvbnN0cnVjdG9yID09PSBjb25zdHJ1Y3RvcjsKfQpfX25hbWUoaXNDb25zdHJ1Y3RvciwgImlzQ29uc3RydWN0b3IiKTsKdmFyIHRyYW5zcG9zZV9kZWZhdWx0ID0gdHJhbnNwb3NlOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL1NldHRlci5qcwp2YXIgVElNRVpPTkVfVU5JVF9QUklPUklUWSA9IDEwOwp2YXIgU2V0dGVyID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlNldHRlciIpOwogIH0KICBzdWJQcmlvcml0eSA9IDA7CiAgdmFsaWRhdGUoX3V0Y0RhdGUsIF9vcHRpb25zKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9Cn07CnZhciBWYWx1ZVNldHRlciA9IGNsYXNzIGV4dGVuZHMgU2V0dGVyIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJWYWx1ZVNldHRlciIpOwogIH0KICBjb25zdHJ1Y3Rvcih2YWx1ZTIsIHZhbGlkYXRlVmFsdWUsIHNldFZhbHVlLCBwcmlvcml0eSwgc3ViUHJpb3JpdHkpIHsKICAgIHN1cGVyKCk7CiAgICB0aGlzLnZhbHVlID0gdmFsdWUyOwogICAgdGhpcy52YWxpZGF0ZVZhbHVlID0gdmFsaWRhdGVWYWx1ZTsKICAgIHRoaXMuc2V0VmFsdWUgPSBzZXRWYWx1ZTsKICAgIHRoaXMucHJpb3JpdHkgPSBwcmlvcml0eTsKICAgIGlmIChzdWJQcmlvcml0eSkgewogICAgICB0aGlzLnN1YlByaW9yaXR5ID0gc3ViUHJpb3JpdHk7CiAgICB9CiAgfQogIHZhbGlkYXRlKGRhdGUsIG9wdGlvbnMpIHsKICAgIHJldHVybiB0aGlzLnZhbGlkYXRlVmFsdWUoZGF0ZSwgdGhpcy52YWx1ZSwgb3B0aW9ucyk7CiAgfQogIHNldChkYXRlLCBmbGFncywgb3B0aW9ucykgewogICAgcmV0dXJuIHRoaXMuc2V0VmFsdWUoZGF0ZSwgZmxhZ3MsIHRoaXMudmFsdWUsIG9wdGlvbnMpOwogIH0KfTsKdmFyIERhdGVUaW1lem9uZVNldHRlciA9IGNsYXNzIGV4dGVuZHMgU2V0dGVyIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJEYXRlVGltZXpvbmVTZXR0ZXIiKTsKICB9CiAgcHJpb3JpdHkgPSBUSU1FWk9ORV9VTklUX1BSSU9SSVRZOwogIHN1YlByaW9yaXR5ID0gLTE7CiAgY29uc3RydWN0b3IoY29udGV4dDIsIHJlZmVyZW5jZSkgewogICAgc3VwZXIoKTsKICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQyIHx8ICgoZGF0ZSkgPT4gY29uc3RydWN0RnJvbShyZWZlcmVuY2UsIGRhdGUpKTsKICB9CiAgc2V0KGRhdGUsIGZsYWdzKSB7CiAgICBpZiAoZmxhZ3MudGltZXN0YW1wSXNTZXQpIHJldHVybiBkYXRlOwogICAgcmV0dXJuIGNvbnN0cnVjdEZyb20oZGF0ZSwgdHJhbnNwb3NlKGRhdGUsIHRoaXMuY29udGV4dCkpOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9QYXJzZXIuanMKdmFyIFBhcnNlciA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJQYXJzZXIiKTsKICB9CiAgcnVuKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaDIsIG9wdGlvbnMpIHsKICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoMiwgb3B0aW9ucyk7CiAgICBpZiAoIXJlc3VsdCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIHNldHRlcjogbmV3IFZhbHVlU2V0dGVyKAogICAgICAgIHJlc3VsdC52YWx1ZSwKICAgICAgICB0aGlzLnZhbGlkYXRlLAogICAgICAgIHRoaXMuc2V0LAogICAgICAgIHRoaXMucHJpb3JpdHksCiAgICAgICAgdGhpcy5zdWJQcmlvcml0eQogICAgICApLAogICAgICByZXN0OiByZXN1bHQucmVzdAogICAgfTsKICB9CiAgdmFsaWRhdGUoX3V0Y0RhdGUsIF92YWx1ZSwgX29wdGlvbnMpIHsKICAgIHJldHVybiB0cnVlOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0VyYVBhcnNlci5qcwp2YXIgRXJhUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkVyYVBhcnNlciIpOwogIH0KICBwcmlvcml0eSA9IDE0MDsKICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gyKSB7CiAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgIC8vIEFELCBCQwogICAgICBjYXNlICJHIjoKICAgICAgY2FzZSAiR0ciOgogICAgICBjYXNlICJHR0ciOgogICAgICAgIHJldHVybiBtYXRjaDIuZXJhKGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJhYmJyZXZpYXRlZCIgfSkgfHwgbWF0Y2gyLmVyYShkYXRlU3RyaW5nLCB7IHdpZHRoOiAibmFycm93IiB9KTsKICAgICAgLy8gQSwgQgogICAgICBjYXNlICJHR0dHRyI6CiAgICAgICAgcmV0dXJuIG1hdGNoMi5lcmEoZGF0ZVN0cmluZywgeyB3aWR0aDogIm5hcnJvdyIgfSk7CiAgICAgIC8vIEFubm8gRG9taW5pLCBCZWZvcmUgQ2hyaXN0CiAgICAgIGNhc2UgIkdHR0ciOgogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBtYXRjaDIuZXJhKGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJ3aWRlIiB9KSB8fCBtYXRjaDIuZXJhKGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJhYmJyZXZpYXRlZCIgfSkgfHwgbWF0Y2gyLmVyYShkYXRlU3RyaW5nLCB7IHdpZHRoOiAibmFycm93IiB9KTsKICAgIH0KICB9CiAgc2V0KGRhdGUsIGZsYWdzLCB2YWx1ZTIpIHsKICAgIGZsYWdzLmVyYSA9IHZhbHVlMjsKICAgIGRhdGUuc2V0RnVsbFllYXIodmFsdWUyLCAwLCAxKTsKICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgICByZXR1cm4gZGF0ZTsKICB9CiAgaW5jb21wYXRpYmxlVG9rZW5zID0gWyJSIiwgInUiLCAidCIsICJUIl07Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvY29uc3RhbnRzLmpzCnZhciBudW1lcmljUGF0dGVybnMgPSB7CiAgbW9udGg6IC9eKDFbMC0yXXwwP1xkKS8sCiAgLy8gMCB0byAxMgogIGRhdGU6IC9eKDNbMC0xXXxbMC0yXT9cZCkvLAogIC8vIDAgdG8gMzEKICBkYXlPZlllYXI6IC9eKDM2WzAtNl18M1swLTVdXGR8WzAtMl0/XGQ/XGQpLywKICAvLyAwIHRvIDM2NgogIHdlZWs6IC9eKDVbMC0zXXxbMC00XT9cZCkvLAogIC8vIDAgdG8gNTMKICBob3VyMjNoOiAvXigyWzAtM118WzAtMV0/XGQpLywKICAvLyAwIHRvIDIzCiAgaG91cjI0aDogL14oMlswLTRdfFswLTFdP1xkKS8sCiAgLy8gMCB0byAyNAogIGhvdXIxMWg6IC9eKDFbMC0xXXwwP1xkKS8sCiAgLy8gMCB0byAxMQogIGhvdXIxMmg6IC9eKDFbMC0yXXwwP1xkKS8sCiAgLy8gMCB0byAxMgogIG1pbnV0ZTogL15bMC01XT9cZC8sCiAgLy8gMCB0byA1OQogIHNlY29uZDogL15bMC01XT9cZC8sCiAgLy8gMCB0byA1OQogIHNpbmdsZURpZ2l0OiAvXlxkLywKICAvLyAwIHRvIDkKICB0d29EaWdpdHM6IC9eXGR7MSwyfS8sCiAgLy8gMCB0byA5OQogIHRocmVlRGlnaXRzOiAvXlxkezEsM30vLAogIC8vIDAgdG8gOTk5CiAgZm91ckRpZ2l0czogL15cZHsxLDR9LywKICAvLyAwIHRvIDk5OTkKICBhbnlEaWdpdHNTaWduZWQ6IC9eLT9cZCsvLAogIHNpbmdsZURpZ2l0U2lnbmVkOiAvXi0/XGQvLAogIC8vIDAgdG8gOSwgLTAgdG8gLTkKICB0d29EaWdpdHNTaWduZWQ6IC9eLT9cZHsxLDJ9LywKICAvLyAwIHRvIDk5LCAtMCB0byAtOTkKICB0aHJlZURpZ2l0c1NpZ25lZDogL14tP1xkezEsM30vLAogIC8vIDAgdG8gOTk5LCAtMCB0byAtOTk5CiAgZm91ckRpZ2l0c1NpZ25lZDogL14tP1xkezEsNH0vCiAgLy8gMCB0byA5OTk5LCAtMCB0byAtOTk5OQp9Owp2YXIgdGltZXpvbmVQYXR0ZXJucyA9IHsKICBiYXNpY09wdGlvbmFsTWludXRlczogL14oWystXSkoXGR7Mn0pKFxkezJ9KT98Wi8sCiAgYmFzaWM6IC9eKFsrLV0pKFxkezJ9KShcZHsyfSl8Wi8sCiAgYmFzaWNPcHRpb25hbFNlY29uZHM6IC9eKFsrLV0pKFxkezJ9KShcZHsyfSkoKFxkezJ9KSk/fFovLAogIGV4dGVuZGVkOiAvXihbKy1dKShcZHsyfSk6KFxkezJ9KXxaLywKICBleHRlbmRlZE9wdGlvbmFsU2Vjb25kczogL14oWystXSkoXGR7Mn0pOihcZHsyfSkoOihcZHsyfSkpP3xaLwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3V0aWxzLmpzCmZ1bmN0aW9uIG1hcFZhbHVlKHBhcnNlRm5SZXN1bHQsIG1hcEZuKSB7CiAgaWYgKCFwYXJzZUZuUmVzdWx0KSB7CiAgICByZXR1cm4gcGFyc2VGblJlc3VsdDsKICB9CiAgcmV0dXJuIHsKICAgIHZhbHVlOiBtYXBGbihwYXJzZUZuUmVzdWx0LnZhbHVlKSwKICAgIHJlc3Q6IHBhcnNlRm5SZXN1bHQucmVzdAogIH07Cn0KX19uYW1lKG1hcFZhbHVlLCAibWFwVmFsdWUiKTsKZnVuY3Rpb24gcGFyc2VOdW1lcmljUGF0dGVybihwYXR0ZXJuLCBkYXRlU3RyaW5nKSB7CiAgY29uc3QgbWF0Y2hSZXN1bHQgPSBkYXRlU3RyaW5nLm1hdGNoKHBhdHRlcm4pOwogIGlmICghbWF0Y2hSZXN1bHQpIHsKICAgIHJldHVybiBudWxsOwogIH0KICByZXR1cm4gewogICAgdmFsdWU6IHBhcnNlSW50KG1hdGNoUmVzdWx0WzBdLCAxMCksCiAgICByZXN0OiBkYXRlU3RyaW5nLnNsaWNlKG1hdGNoUmVzdWx0WzBdLmxlbmd0aCkKICB9Owp9Cl9fbmFtZShwYXJzZU51bWVyaWNQYXR0ZXJuLCAicGFyc2VOdW1lcmljUGF0dGVybiIpOwpmdW5jdGlvbiBwYXJzZVRpbWV6b25lUGF0dGVybihwYXR0ZXJuLCBkYXRlU3RyaW5nKSB7CiAgY29uc3QgbWF0Y2hSZXN1bHQgPSBkYXRlU3RyaW5nLm1hdGNoKHBhdHRlcm4pOwogIGlmICghbWF0Y2hSZXN1bHQpIHsKICAgIHJldHVybiBudWxsOwogIH0KICBpZiAobWF0Y2hSZXN1bHRbMF0gPT09ICJaIikgewogICAgcmV0dXJuIHsKICAgICAgdmFsdWU6IDAsCiAgICAgIHJlc3Q6IGRhdGVTdHJpbmcuc2xpY2UoMSkKICAgIH07CiAgfQogIGNvbnN0IHNpZ24gPSBtYXRjaFJlc3VsdFsxXSA9PT0gIisiID8gMSA6IC0xOwogIGNvbnN0IGhvdXJzID0gbWF0Y2hSZXN1bHRbMl0gPyBwYXJzZUludChtYXRjaFJlc3VsdFsyXSwgMTApIDogMDsKICBjb25zdCBtaW51dGVzID0gbWF0Y2hSZXN1bHRbM10gPyBwYXJzZUludChtYXRjaFJlc3VsdFszXSwgMTApIDogMDsKICBjb25zdCBzZWNvbmRzID0gbWF0Y2hSZXN1bHRbNV0gPyBwYXJzZUludChtYXRjaFJlc3VsdFs1XSwgMTApIDogMDsKICByZXR1cm4gewogICAgdmFsdWU6IHNpZ24gKiAoaG91cnMgKiBtaWxsaXNlY29uZHNJbkhvdXIgKyBtaW51dGVzICogbWlsbGlzZWNvbmRzSW5NaW51dGUgKyBzZWNvbmRzICogbWlsbGlzZWNvbmRzSW5TZWNvbmQpLAogICAgcmVzdDogZGF0ZVN0cmluZy5zbGljZShtYXRjaFJlc3VsdFswXS5sZW5ndGgpCiAgfTsKfQpfX25hbWUocGFyc2VUaW1lem9uZVBhdHRlcm4sICJwYXJzZVRpbWV6b25lUGF0dGVybiIpOwpmdW5jdGlvbiBwYXJzZUFueURpZ2l0c1NpZ25lZChkYXRlU3RyaW5nKSB7CiAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4obnVtZXJpY1BhdHRlcm5zLmFueURpZ2l0c1NpZ25lZCwgZGF0ZVN0cmluZyk7Cn0KX19uYW1lKHBhcnNlQW55RGlnaXRzU2lnbmVkLCAicGFyc2VBbnlEaWdpdHNTaWduZWQiKTsKZnVuY3Rpb24gcGFyc2VORGlnaXRzKG4xMSwgZGF0ZVN0cmluZykgewogIHN3aXRjaCAobjExKSB7CiAgICBjYXNlIDE6CiAgICAgIHJldHVybiBwYXJzZU51bWVyaWNQYXR0ZXJuKG51bWVyaWNQYXR0ZXJucy5zaW5nbGVEaWdpdCwgZGF0ZVN0cmluZyk7CiAgICBjYXNlIDI6CiAgICAgIHJldHVybiBwYXJzZU51bWVyaWNQYXR0ZXJuKG51bWVyaWNQYXR0ZXJucy50d29EaWdpdHMsIGRhdGVTdHJpbmcpOwogICAgY2FzZSAzOgogICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihudW1lcmljUGF0dGVybnMudGhyZWVEaWdpdHMsIGRhdGVTdHJpbmcpOwogICAgY2FzZSA0OgogICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihudW1lcmljUGF0dGVybnMuZm91ckRpZ2l0cywgZGF0ZVN0cmluZyk7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihuZXcgUmVnRXhwKCJeXFxkezEsIiArIG4xMSArICJ9IiksIGRhdGVTdHJpbmcpOwogIH0KfQpfX25hbWUocGFyc2VORGlnaXRzLCAicGFyc2VORGlnaXRzIik7CmZ1bmN0aW9uIHBhcnNlTkRpZ2l0c1NpZ25lZChuMTEsIGRhdGVTdHJpbmcpIHsKICBzd2l0Y2ggKG4xMSkgewogICAgY2FzZSAxOgogICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihudW1lcmljUGF0dGVybnMuc2luZ2xlRGlnaXRTaWduZWQsIGRhdGVTdHJpbmcpOwogICAgY2FzZSAyOgogICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihudW1lcmljUGF0dGVybnMudHdvRGlnaXRzU2lnbmVkLCBkYXRlU3RyaW5nKTsKICAgIGNhc2UgMzoKICAgICAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4obnVtZXJpY1BhdHRlcm5zLnRocmVlRGlnaXRzU2lnbmVkLCBkYXRlU3RyaW5nKTsKICAgIGNhc2UgNDoKICAgICAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4obnVtZXJpY1BhdHRlcm5zLmZvdXJEaWdpdHNTaWduZWQsIGRhdGVTdHJpbmcpOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4obmV3IFJlZ0V4cCgiXi0/XFxkezEsIiArIG4xMSArICJ9IiksIGRhdGVTdHJpbmcpOwogIH0KfQpfX25hbWUocGFyc2VORGlnaXRzU2lnbmVkLCAicGFyc2VORGlnaXRzU2lnbmVkIik7CmZ1bmN0aW9uIGRheVBlcmlvZEVudW1Ub0hvdXJzKGRheVBlcmlvZCkgewogIHN3aXRjaCAoZGF5UGVyaW9kKSB7CiAgICBjYXNlICJtb3JuaW5nIjoKICAgICAgcmV0dXJuIDQ7CiAgICBjYXNlICJldmVuaW5nIjoKICAgICAgcmV0dXJuIDE3OwogICAgY2FzZSAicG0iOgogICAgY2FzZSAibm9vbiI6CiAgICBjYXNlICJhZnRlcm5vb24iOgogICAgICByZXR1cm4gMTI7CiAgICBjYXNlICJhbSI6CiAgICBjYXNlICJtaWRuaWdodCI6CiAgICBjYXNlICJuaWdodCI6CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gMDsKICB9Cn0KX19uYW1lKGRheVBlcmlvZEVudW1Ub0hvdXJzLCAiZGF5UGVyaW9kRW51bVRvSG91cnMiKTsKZnVuY3Rpb24gbm9ybWFsaXplVHdvRGlnaXRZZWFyKHR3b0RpZ2l0WWVhciwgY3VycmVudFllYXIpIHsKICBjb25zdCBpc0NvbW1vbkVyYSA9IGN1cnJlbnRZZWFyID4gMDsKICBjb25zdCBhYnNDdXJyZW50WWVhciA9IGlzQ29tbW9uRXJhID8gY3VycmVudFllYXIgOiAxIC0gY3VycmVudFllYXI7CiAgbGV0IHJlc3VsdDsKICBpZiAoYWJzQ3VycmVudFllYXIgPD0gNTApIHsKICAgIHJlc3VsdCA9IHR3b0RpZ2l0WWVhciB8fCAxMDA7CiAgfSBlbHNlIHsKICAgIGNvbnN0IHJhbmdlRW5kID0gYWJzQ3VycmVudFllYXIgKyA1MDsKICAgIGNvbnN0IHJhbmdlRW5kQ2VudHVyeSA9IE1hdGgudHJ1bmMocmFuZ2VFbmQgLyAxMDApICogMTAwOwogICAgY29uc3QgaXNQcmV2aW91c0NlbnR1cnkgPSB0d29EaWdpdFllYXIgPj0gcmFuZ2VFbmQgJSAxMDA7CiAgICByZXN1bHQgPSB0d29EaWdpdFllYXIgKyByYW5nZUVuZENlbnR1cnkgLSAoaXNQcmV2aW91c0NlbnR1cnkgPyAxMDAgOiAwKTsKICB9CiAgcmV0dXJuIGlzQ29tbW9uRXJhID8gcmVzdWx0IDogMSAtIHJlc3VsdDsKfQpfX25hbWUobm9ybWFsaXplVHdvRGlnaXRZZWFyLCAibm9ybWFsaXplVHdvRGlnaXRZZWFyIik7CmZ1bmN0aW9uIGlzTGVhcFllYXJJbmRleCh5ZWFyKSB7CiAgcmV0dXJuIHllYXIgJSA0MDAgPT09IDAgfHwgeWVhciAlIDQgPT09IDAgJiYgeWVhciAlIDEwMCAhPT0gMDsKfQpfX25hbWUoaXNMZWFwWWVhckluZGV4LCAiaXNMZWFwWWVhckluZGV4Iik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9ZZWFyUGFyc2VyLmpzCnZhciBZZWFyUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlllYXJQYXJzZXIiKTsKICB9CiAgcHJpb3JpdHkgPSAxMzA7CiAgaW5jb21wYXRpYmxlVG9rZW5zID0gWyJZIiwgIlIiLCAidSIsICJ3IiwgIkkiLCAiaSIsICJlIiwgImMiLCAidCIsICJUIl07CiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoMikgewogICAgY29uc3QgdmFsdWVDYWxsYmFjayA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHllYXIpID0+ICh7CiAgICAgIHllYXIsCiAgICAgIGlzVHdvRGlnaXRZZWFyOiB0b2tlbiA9PT0gInl5IgogICAgfSksICJ2YWx1ZUNhbGxiYWNrIik7CiAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgIGNhc2UgInkiOgogICAgICAgIHJldHVybiBtYXBWYWx1ZShwYXJzZU5EaWdpdHMoNCwgZGF0ZVN0cmluZyksIHZhbHVlQ2FsbGJhY2spOwogICAgICBjYXNlICJ5byI6CiAgICAgICAgcmV0dXJuIG1hcFZhbHVlKAogICAgICAgICAgbWF0Y2gyLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgewogICAgICAgICAgICB1bml0OiAieWVhciIKICAgICAgICAgIH0pLAogICAgICAgICAgdmFsdWVDYWxsYmFjawogICAgICAgICk7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIG1hcFZhbHVlKHBhcnNlTkRpZ2l0cyh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpLCB2YWx1ZUNhbGxiYWNrKTsKICAgIH0KICB9CiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlMikgewogICAgcmV0dXJuIHZhbHVlMi5pc1R3b0RpZ2l0WWVhciB8fCB2YWx1ZTIueWVhciA+IDA7CiAgfQogIHNldChkYXRlLCBmbGFncywgdmFsdWUyKSB7CiAgICBjb25zdCBjdXJyZW50WWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTsKICAgIGlmICh2YWx1ZTIuaXNUd29EaWdpdFllYXIpIHsKICAgICAgY29uc3Qgbm9ybWFsaXplZFR3b0RpZ2l0WWVhciA9IG5vcm1hbGl6ZVR3b0RpZ2l0WWVhcigKICAgICAgICB2YWx1ZTIueWVhciwKICAgICAgICBjdXJyZW50WWVhcgogICAgICApOwogICAgICBkYXRlLnNldEZ1bGxZZWFyKG5vcm1hbGl6ZWRUd29EaWdpdFllYXIsIDAsIDEpOwogICAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgICByZXR1cm4gZGF0ZTsKICAgIH0KICAgIGNvbnN0IHllYXIgPSAhKCJlcmEiIGluIGZsYWdzKSB8fCBmbGFncy5lcmEgPT09IDEgPyB2YWx1ZTIueWVhciA6IDEgLSB2YWx1ZTIueWVhcjsKICAgIGRhdGUuc2V0RnVsbFllYXIoeWVhciwgMCwgMSk7CiAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgcmV0dXJuIGRhdGU7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvTG9jYWxXZWVrWWVhclBhcnNlci5qcwp2YXIgTG9jYWxXZWVrWWVhclBhcnNlciA9IGNsYXNzIGV4dGVuZHMgUGFyc2VyIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJMb2NhbFdlZWtZZWFyUGFyc2VyIik7CiAgfQogIHByaW9yaXR5ID0gMTMwOwogIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaDIpIHsKICAgIGNvbnN0IHZhbHVlQ2FsbGJhY2sgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh5ZWFyKSA9PiAoewogICAgICB5ZWFyLAogICAgICBpc1R3b0RpZ2l0WWVhcjogdG9rZW4gPT09ICJZWSIKICAgIH0pLCAidmFsdWVDYWxsYmFjayIpOwogICAgc3dpdGNoICh0b2tlbikgewogICAgICBjYXNlICJZIjoKICAgICAgICByZXR1cm4gbWFwVmFsdWUocGFyc2VORGlnaXRzKDQsIGRhdGVTdHJpbmcpLCB2YWx1ZUNhbGxiYWNrKTsKICAgICAgY2FzZSAiWW8iOgogICAgICAgIHJldHVybiBtYXBWYWx1ZSgKICAgICAgICAgIG1hdGNoMi5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgdW5pdDogInllYXIiCiAgICAgICAgICB9KSwKICAgICAgICAgIHZhbHVlQ2FsbGJhY2sKICAgICAgICApOwogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBtYXBWYWx1ZShwYXJzZU5EaWdpdHModG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKSwgdmFsdWVDYWxsYmFjayk7CiAgICB9CiAgfQogIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZTIpIHsKICAgIHJldHVybiB2YWx1ZTIuaXNUd29EaWdpdFllYXIgfHwgdmFsdWUyLnllYXIgPiAwOwogIH0KICBzZXQoZGF0ZSwgZmxhZ3MsIHZhbHVlMiwgb3B0aW9ucykgewogICAgY29uc3QgY3VycmVudFllYXIgPSBnZXRXZWVrWWVhcihkYXRlLCBvcHRpb25zKTsKICAgIGlmICh2YWx1ZTIuaXNUd29EaWdpdFllYXIpIHsKICAgICAgY29uc3Qgbm9ybWFsaXplZFR3b0RpZ2l0WWVhciA9IG5vcm1hbGl6ZVR3b0RpZ2l0WWVhcigKICAgICAgICB2YWx1ZTIueWVhciwKICAgICAgICBjdXJyZW50WWVhcgogICAgICApOwogICAgICBkYXRlLnNldEZ1bGxZZWFyKAogICAgICAgIG5vcm1hbGl6ZWRUd29EaWdpdFllYXIsCiAgICAgICAgMCwKICAgICAgICBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZQogICAgICApOwogICAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgICByZXR1cm4gc3RhcnRPZldlZWsoZGF0ZSwgb3B0aW9ucyk7CiAgICB9CiAgICBjb25zdCB5ZWFyID0gISgiZXJhIiBpbiBmbGFncykgfHwgZmxhZ3MuZXJhID09PSAxID8gdmFsdWUyLnllYXIgOiAxIC0gdmFsdWUyLnllYXI7CiAgICBkYXRlLnNldEZ1bGxZZWFyKHllYXIsIDAsIG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlKTsKICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgICByZXR1cm4gc3RhcnRPZldlZWsoZGF0ZSwgb3B0aW9ucyk7CiAgfQogIGluY29tcGF0aWJsZVRva2VucyA9IFsKICAgICJ5IiwKICAgICJSIiwKICAgICJ1IiwKICAgICJRIiwKICAgICJxIiwKICAgICJNIiwKICAgICJMIiwKICAgICJJIiwKICAgICJkIiwKICAgICJEIiwKICAgICJpIiwKICAgICJ0IiwKICAgICJUIgogIF07Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9JU09XZWVrWWVhclBhcnNlci5qcwp2YXIgSVNPV2Vla1llYXJQYXJzZXIgPSBjbGFzcyBleHRlbmRzIFBhcnNlciB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiSVNPV2Vla1llYXJQYXJzZXIiKTsKICB9CiAgcHJpb3JpdHkgPSAxMzA7CiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4pIHsKICAgIGlmICh0b2tlbiA9PT0gIlIiKSB7CiAgICAgIHJldHVybiBwYXJzZU5EaWdpdHNTaWduZWQoNCwgZGF0ZVN0cmluZyk7CiAgICB9CiAgICByZXR1cm4gcGFyc2VORGlnaXRzU2lnbmVkKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyk7CiAgfQogIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlMikgewogICAgY29uc3QgZmlyc3RXZWVrT2ZZZWFyID0gY29uc3RydWN0RnJvbShkYXRlLCAwKTsKICAgIGZpcnN0V2Vla09mWWVhci5zZXRGdWxsWWVhcih2YWx1ZTIsIDAsIDQpOwogICAgZmlyc3RXZWVrT2ZZZWFyLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgcmV0dXJuIHN0YXJ0T2ZJU09XZWVrKGZpcnN0V2Vla09mWWVhcik7CiAgfQogIGluY29tcGF0aWJsZVRva2VucyA9IFsKICAgICJHIiwKICAgICJ5IiwKICAgICJZIiwKICAgICJ1IiwKICAgICJRIiwKICAgICJxIiwKICAgICJNIiwKICAgICJMIiwKICAgICJ3IiwKICAgICJkIiwKICAgICJEIiwKICAgICJlIiwKICAgICJjIiwKICAgICJ0IiwKICAgICJUIgogIF07Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9FeHRlbmRlZFllYXJQYXJzZXIuanMKdmFyIEV4dGVuZGVkWWVhclBhcnNlciA9IGNsYXNzIGV4dGVuZHMgUGFyc2VyIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJFeHRlbmRlZFllYXJQYXJzZXIiKTsKICB9CiAgcHJpb3JpdHkgPSAxMzA7CiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4pIHsKICAgIGlmICh0b2tlbiA9PT0gInUiKSB7CiAgICAgIHJldHVybiBwYXJzZU5EaWdpdHNTaWduZWQoNCwgZGF0ZVN0cmluZyk7CiAgICB9CiAgICByZXR1cm4gcGFyc2VORGlnaXRzU2lnbmVkKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyk7CiAgfQogIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlMikgewogICAgZGF0ZS5zZXRGdWxsWWVhcih2YWx1ZTIsIDAsIDEpOwogICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICAgIHJldHVybiBkYXRlOwogIH0KICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbIkciLCAieSIsICJZIiwgIlIiLCAidyIsICJJIiwgImkiLCAiZSIsICJjIiwgInQiLCAiVCJdOwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvUXVhcnRlclBhcnNlci5qcwp2YXIgUXVhcnRlclBhcnNlciA9IGNsYXNzIGV4dGVuZHMgUGFyc2VyIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJRdWFydGVyUGFyc2VyIik7CiAgfQogIHByaW9yaXR5ID0gMTIwOwogIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaDIpIHsKICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgLy8gMSwgMiwgMywgNAogICAgICBjYXNlICJRIjoKICAgICAgY2FzZSAiUVEiOgogICAgICAgIHJldHVybiBwYXJzZU5EaWdpdHModG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTsKICAgICAgLy8gMXN0LCAybmQsIDNyZCwgNHRoCiAgICAgIGNhc2UgIlFvIjoKICAgICAgICByZXR1cm4gbWF0Y2gyLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiAicXVhcnRlciIgfSk7CiAgICAgIC8vIFExLCBRMiwgUTMsIFE0CiAgICAgIGNhc2UgIlFRUSI6CiAgICAgICAgcmV0dXJuIG1hdGNoMi5xdWFydGVyKGRhdGVTdHJpbmcsIHsKICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSkgfHwgbWF0Y2gyLnF1YXJ0ZXIoZGF0ZVN0cmluZywgewogICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSk7CiAgICAgIC8vIDEsIDIsIDMsIDQgKG5hcnJvdyBxdWFydGVyOyBjb3VsZCBiZSBub3QgbnVtZXJpY2FsKQogICAgICBjYXNlICJRUVFRUSI6CiAgICAgICAgcmV0dXJuIG1hdGNoMi5xdWFydGVyKGRhdGVTdHJpbmcsIHsKICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pOwogICAgICAvLyAxc3QgcXVhcnRlciwgMm5kIHF1YXJ0ZXIsIC4uLgogICAgICBjYXNlICJRUVFRIjoKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gbWF0Y2gyLnF1YXJ0ZXIoZGF0ZVN0cmluZywgewogICAgICAgICAgd2lkdGg6ICJ3aWRlIiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pIHx8IG1hdGNoMi5xdWFydGVyKGRhdGVTdHJpbmcsIHsKICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSkgfHwgbWF0Y2gyLnF1YXJ0ZXIoZGF0ZVN0cmluZywgewogICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSk7CiAgICB9CiAgfQogIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZTIpIHsKICAgIHJldHVybiB2YWx1ZTIgPj0gMSAmJiB2YWx1ZTIgPD0gNDsKICB9CiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUyKSB7CiAgICBkYXRlLnNldE1vbnRoKCh2YWx1ZTIgLSAxKSAqIDMsIDEpOwogICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICAgIHJldHVybiBkYXRlOwogIH0KICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbCiAgICAiWSIsCiAgICAiUiIsCiAgICAicSIsCiAgICAiTSIsCiAgICAiTCIsCiAgICAidyIsCiAgICAiSSIsCiAgICAiZCIsCiAgICAiRCIsCiAgICAiaSIsCiAgICAiZSIsCiAgICAiYyIsCiAgICAidCIsCiAgICAiVCIKICBdOwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvU3RhbmRBbG9uZVF1YXJ0ZXJQYXJzZXIuanMKdmFyIFN0YW5kQWxvbmVRdWFydGVyUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlN0YW5kQWxvbmVRdWFydGVyUGFyc2VyIik7CiAgfQogIHByaW9yaXR5ID0gMTIwOwogIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaDIpIHsKICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgLy8gMSwgMiwgMywgNAogICAgICBjYXNlICJxIjoKICAgICAgY2FzZSAicXEiOgogICAgICAgIHJldHVybiBwYXJzZU5EaWdpdHModG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTsKICAgICAgLy8gMXN0LCAybmQsIDNyZCwgNHRoCiAgICAgIGNhc2UgInFvIjoKICAgICAgICByZXR1cm4gbWF0Y2gyLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiAicXVhcnRlciIgfSk7CiAgICAgIC8vIFExLCBRMiwgUTMsIFE0CiAgICAgIGNhc2UgInFxcSI6CiAgICAgICAgcmV0dXJuIG1hdGNoMi5xdWFydGVyKGRhdGVTdHJpbmcsIHsKICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgY29udGV4dDogInN0YW5kYWxvbmUiCiAgICAgICAgfSkgfHwgbWF0Y2gyLnF1YXJ0ZXIoZGF0ZVN0cmluZywgewogICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgY29udGV4dDogInN0YW5kYWxvbmUiCiAgICAgICAgfSk7CiAgICAgIC8vIDEsIDIsIDMsIDQgKG5hcnJvdyBxdWFydGVyOyBjb3VsZCBiZSBub3QgbnVtZXJpY2FsKQogICAgICBjYXNlICJxcXFxcSI6CiAgICAgICAgcmV0dXJuIG1hdGNoMi5xdWFydGVyKGRhdGVTdHJpbmcsIHsKICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgIGNvbnRleHQ6ICJzdGFuZGFsb25lIgogICAgICAgIH0pOwogICAgICAvLyAxc3QgcXVhcnRlciwgMm5kIHF1YXJ0ZXIsIC4uLgogICAgICBjYXNlICJxcXFxIjoKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gbWF0Y2gyLnF1YXJ0ZXIoZGF0ZVN0cmluZywgewogICAgICAgICAgd2lkdGg6ICJ3aWRlIiwKICAgICAgICAgIGNvbnRleHQ6ICJzdGFuZGFsb25lIgogICAgICAgIH0pIHx8IG1hdGNoMi5xdWFydGVyKGRhdGVTdHJpbmcsIHsKICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgY29udGV4dDogInN0YW5kYWxvbmUiCiAgICAgICAgfSkgfHwgbWF0Y2gyLnF1YXJ0ZXIoZGF0ZVN0cmluZywgewogICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgY29udGV4dDogInN0YW5kYWxvbmUiCiAgICAgICAgfSk7CiAgICB9CiAgfQogIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZTIpIHsKICAgIHJldHVybiB2YWx1ZTIgPj0gMSAmJiB2YWx1ZTIgPD0gNDsKICB9CiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUyKSB7CiAgICBkYXRlLnNldE1vbnRoKCh2YWx1ZTIgLSAxKSAqIDMsIDEpOwogICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICAgIHJldHVybiBkYXRlOwogIH0KICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbCiAgICAiWSIsCiAgICAiUiIsCiAgICAiUSIsCiAgICAiTSIsCiAgICAiTCIsCiAgICAidyIsCiAgICAiSSIsCiAgICAiZCIsCiAgICAiRCIsCiAgICAiaSIsCiAgICAiZSIsCiAgICAiYyIsCiAgICAidCIsCiAgICAiVCIKICBdOwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvTW9udGhQYXJzZXIuanMKdmFyIE1vbnRoUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIk1vbnRoUGFyc2VyIik7CiAgfQogIGluY29tcGF0aWJsZVRva2VucyA9IFsKICAgICJZIiwKICAgICJSIiwKICAgICJxIiwKICAgICJRIiwKICAgICJMIiwKICAgICJ3IiwKICAgICJJIiwKICAgICJEIiwKICAgICJpIiwKICAgICJlIiwKICAgICJjIiwKICAgICJ0IiwKICAgICJUIgogIF07CiAgcHJpb3JpdHkgPSAxMTA7CiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoMikgewogICAgY29uc3QgdmFsdWVDYWxsYmFjayA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHZhbHVlMikgPT4gdmFsdWUyIC0gMSwgInZhbHVlQ2FsbGJhY2siKTsKICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgLy8gMSwgMiwgLi4uLCAxMgogICAgICBjYXNlICJNIjoKICAgICAgICByZXR1cm4gbWFwVmFsdWUoCiAgICAgICAgICBwYXJzZU51bWVyaWNQYXR0ZXJuKG51bWVyaWNQYXR0ZXJucy5tb250aCwgZGF0ZVN0cmluZyksCiAgICAgICAgICB2YWx1ZUNhbGxiYWNrCiAgICAgICAgKTsKICAgICAgLy8gMDEsIDAyLCAuLi4sIDEyCiAgICAgIGNhc2UgIk1NIjoKICAgICAgICByZXR1cm4gbWFwVmFsdWUocGFyc2VORGlnaXRzKDIsIGRhdGVTdHJpbmcpLCB2YWx1ZUNhbGxiYWNrKTsKICAgICAgLy8gMXN0LCAybmQsIC4uLiwgMTJ0aAogICAgICBjYXNlICJNbyI6CiAgICAgICAgcmV0dXJuIG1hcFZhbHVlKAogICAgICAgICAgbWF0Y2gyLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgewogICAgICAgICAgICB1bml0OiAibW9udGgiCiAgICAgICAgICB9KSwKICAgICAgICAgIHZhbHVlQ2FsbGJhY2sKICAgICAgICApOwogICAgICAvLyBKYW4sIEZlYiwgLi4uLCBEZWMKICAgICAgY2FzZSAiTU1NIjoKICAgICAgICByZXR1cm4gbWF0Y2gyLm1vbnRoKGRhdGVTdHJpbmcsIHsKICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSkgfHwgbWF0Y2gyLm1vbnRoKGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJuYXJyb3ciLCBjb250ZXh0OiAiZm9ybWF0dGluZyIgfSk7CiAgICAgIC8vIEosIEYsIC4uLiwgRAogICAgICBjYXNlICJNTU1NTSI6CiAgICAgICAgcmV0dXJuIG1hdGNoMi5tb250aChkYXRlU3RyaW5nLCB7CiAgICAgICAgICB3aWR0aDogIm5hcnJvdyIsCiAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICB9KTsKICAgICAgLy8gSmFudWFyeSwgRmVicnVhcnksIC4uLiwgRGVjZW1iZXIKICAgICAgY2FzZSAiTU1NTSI6CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIG1hdGNoMi5tb250aChkYXRlU3RyaW5nLCB7IHdpZHRoOiAid2lkZSIsIGNvbnRleHQ6ICJmb3JtYXR0aW5nIiB9KSB8fCBtYXRjaDIubW9udGgoZGF0ZVN0cmluZywgewogICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICB9KSB8fCBtYXRjaDIubW9udGgoZGF0ZVN0cmluZywgeyB3aWR0aDogIm5hcnJvdyIsIGNvbnRleHQ6ICJmb3JtYXR0aW5nIiB9KTsKICAgIH0KICB9CiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlMikgewogICAgcmV0dXJuIHZhbHVlMiA+PSAwICYmIHZhbHVlMiA8PSAxMTsKICB9CiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUyKSB7CiAgICBkYXRlLnNldE1vbnRoKHZhbHVlMiwgMSk7CiAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgcmV0dXJuIGRhdGU7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvU3RhbmRBbG9uZU1vbnRoUGFyc2VyLmpzCnZhciBTdGFuZEFsb25lTW9udGhQYXJzZXIgPSBjbGFzcyBleHRlbmRzIFBhcnNlciB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiU3RhbmRBbG9uZU1vbnRoUGFyc2VyIik7CiAgfQogIHByaW9yaXR5ID0gMTEwOwogIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaDIpIHsKICAgIGNvbnN0IHZhbHVlQ2FsbGJhY2sgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh2YWx1ZTIpID0+IHZhbHVlMiAtIDEsICJ2YWx1ZUNhbGxiYWNrIik7CiAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgIC8vIDEsIDIsIC4uLiwgMTIKICAgICAgY2FzZSAiTCI6CiAgICAgICAgcmV0dXJuIG1hcFZhbHVlKAogICAgICAgICAgcGFyc2VOdW1lcmljUGF0dGVybihudW1lcmljUGF0dGVybnMubW9udGgsIGRhdGVTdHJpbmcpLAogICAgICAgICAgdmFsdWVDYWxsYmFjawogICAgICAgICk7CiAgICAgIC8vIDAxLCAwMiwgLi4uLCAxMgogICAgICBjYXNlICJMTCI6CiAgICAgICAgcmV0dXJuIG1hcFZhbHVlKHBhcnNlTkRpZ2l0cygyLCBkYXRlU3RyaW5nKSwgdmFsdWVDYWxsYmFjayk7CiAgICAgIC8vIDFzdCwgMm5kLCAuLi4sIDEydGgKICAgICAgY2FzZSAiTG8iOgogICAgICAgIHJldHVybiBtYXBWYWx1ZSgKICAgICAgICAgIG1hdGNoMi5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgdW5pdDogIm1vbnRoIgogICAgICAgICAgfSksCiAgICAgICAgICB2YWx1ZUNhbGxiYWNrCiAgICAgICAgKTsKICAgICAgLy8gSmFuLCBGZWIsIC4uLiwgRGVjCiAgICAgIGNhc2UgIkxMTCI6CiAgICAgICAgcmV0dXJuIG1hdGNoMi5tb250aChkYXRlU3RyaW5nLCB7CiAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgIGNvbnRleHQ6ICJzdGFuZGFsb25lIgogICAgICAgIH0pIHx8IG1hdGNoMi5tb250aChkYXRlU3RyaW5nLCB7IHdpZHRoOiAibmFycm93IiwgY29udGV4dDogInN0YW5kYWxvbmUiIH0pOwogICAgICAvLyBKLCBGLCAuLi4sIEQKICAgICAgY2FzZSAiTExMTEwiOgogICAgICAgIHJldHVybiBtYXRjaDIubW9udGgoZGF0ZVN0cmluZywgewogICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgY29udGV4dDogInN0YW5kYWxvbmUiCiAgICAgICAgfSk7CiAgICAgIC8vIEphbnVhcnksIEZlYnJ1YXJ5LCAuLi4sIERlY2VtYmVyCiAgICAgIGNhc2UgIkxMTEwiOgogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBtYXRjaDIubW9udGgoZGF0ZVN0cmluZywgeyB3aWR0aDogIndpZGUiLCBjb250ZXh0OiAic3RhbmRhbG9uZSIgfSkgfHwgbWF0Y2gyLm1vbnRoKGRhdGVTdHJpbmcsIHsKICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgY29udGV4dDogInN0YW5kYWxvbmUiCiAgICAgICAgfSkgfHwgbWF0Y2gyLm1vbnRoKGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJuYXJyb3ciLCBjb250ZXh0OiAic3RhbmRhbG9uZSIgfSk7CiAgICB9CiAgfQogIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZTIpIHsKICAgIHJldHVybiB2YWx1ZTIgPj0gMCAmJiB2YWx1ZTIgPD0gMTE7CiAgfQogIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlMikgewogICAgZGF0ZS5zZXRNb250aCh2YWx1ZTIsIDEpOwogICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICAgIHJldHVybiBkYXRlOwogIH0KICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbCiAgICAiWSIsCiAgICAiUiIsCiAgICAicSIsCiAgICAiUSIsCiAgICAiTSIsCiAgICAidyIsCiAgICAiSSIsCiAgICAiRCIsCiAgICAiaSIsCiAgICAiZSIsCiAgICAiYyIsCiAgICAidCIsCiAgICAiVCIKICBdOwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRXZWVrLmpzCmZ1bmN0aW9uIHNldFdlZWsoZGF0ZSwgd2Vlaywgb3B0aW9ucykgewogIGNvbnN0IGRhdGVfID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCBkaWZmID0gZ2V0V2VlayhkYXRlXywgb3B0aW9ucykgLSB3ZWVrOwogIGRhdGVfLnNldERhdGUoZGF0ZV8uZ2V0RGF0ZSgpIC0gZGlmZiAqIDcpOwogIHJldHVybiB0b0RhdGUoZGF0ZV8sIG9wdGlvbnM/LmluKTsKfQpfX25hbWUoc2V0V2VlaywgInNldFdlZWsiKTsKdmFyIHNldFdlZWtfZGVmYXVsdCA9IHNldFdlZWs7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9Mb2NhbFdlZWtQYXJzZXIuanMKdmFyIExvY2FsV2Vla1BhcnNlciA9IGNsYXNzIGV4dGVuZHMgUGFyc2VyIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJMb2NhbFdlZWtQYXJzZXIiKTsKICB9CiAgcHJpb3JpdHkgPSAxMDA7CiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoMikgewogICAgc3dpdGNoICh0b2tlbikgewogICAgICBjYXNlICJ3IjoKICAgICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihudW1lcmljUGF0dGVybnMud2VlaywgZGF0ZVN0cmluZyk7CiAgICAgIGNhc2UgIndvIjoKICAgICAgICByZXR1cm4gbWF0Y2gyLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiAid2VlayIgfSk7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIHBhcnNlTkRpZ2l0cyh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpOwogICAgfQogIH0KICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUyKSB7CiAgICByZXR1cm4gdmFsdWUyID49IDEgJiYgdmFsdWUyIDw9IDUzOwogIH0KICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZTIsIG9wdGlvbnMpIHsKICAgIHJldHVybiBzdGFydE9mV2VlayhzZXRXZWVrKGRhdGUsIHZhbHVlMiwgb3B0aW9ucyksIG9wdGlvbnMpOwogIH0KICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbCiAgICAieSIsCiAgICAiUiIsCiAgICAidSIsCiAgICAicSIsCiAgICAiUSIsCiAgICAiTSIsCiAgICAiTCIsCiAgICAiSSIsCiAgICAiZCIsCiAgICAiRCIsCiAgICAiaSIsCiAgICAidCIsCiAgICAiVCIKICBdOwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRJU09XZWVrLmpzCmZ1bmN0aW9uIHNldElTT1dlZWsoZGF0ZSwgd2Vlaywgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCBkaWZmID0gZ2V0SVNPV2VlayhfZGF0ZSwgb3B0aW9ucykgLSB3ZWVrOwogIF9kYXRlLnNldERhdGUoX2RhdGUuZ2V0RGF0ZSgpIC0gZGlmZiAqIDcpOwogIHJldHVybiBfZGF0ZTsKfQpfX25hbWUoc2V0SVNPV2VlaywgInNldElTT1dlZWsiKTsKdmFyIHNldElTT1dlZWtfZGVmYXVsdCA9IHNldElTT1dlZWs7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9JU09XZWVrUGFyc2VyLmpzCnZhciBJU09XZWVrUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIklTT1dlZWtQYXJzZXIiKTsKICB9CiAgcHJpb3JpdHkgPSAxMDA7CiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoMikgewogICAgc3dpdGNoICh0b2tlbikgewogICAgICBjYXNlICJJIjoKICAgICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihudW1lcmljUGF0dGVybnMud2VlaywgZGF0ZVN0cmluZyk7CiAgICAgIGNhc2UgIklvIjoKICAgICAgICByZXR1cm4gbWF0Y2gyLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiAid2VlayIgfSk7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIHBhcnNlTkRpZ2l0cyh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpOwogICAgfQogIH0KICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUyKSB7CiAgICByZXR1cm4gdmFsdWUyID49IDEgJiYgdmFsdWUyIDw9IDUzOwogIH0KICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZTIpIHsKICAgIHJldHVybiBzdGFydE9mSVNPV2VlayhzZXRJU09XZWVrKGRhdGUsIHZhbHVlMikpOwogIH0KICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbCiAgICAieSIsCiAgICAiWSIsCiAgICAidSIsCiAgICAicSIsCiAgICAiUSIsCiAgICAiTSIsCiAgICAiTCIsCiAgICAidyIsCiAgICAiZCIsCiAgICAiRCIsCiAgICAiZSIsCiAgICAiYyIsCiAgICAidCIsCiAgICAiVCIKICBdOwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvRGF0ZVBhcnNlci5qcwp2YXIgREFZU19JTl9NT05USCA9IFszMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXTsKdmFyIERBWVNfSU5fTU9OVEhfTEVBUF9ZRUFSID0gWwogIDMxLAogIDI5LAogIDMxLAogIDMwLAogIDMxLAogIDMwLAogIDMxLAogIDMxLAogIDMwLAogIDMxLAogIDMwLAogIDMxCl07CnZhciBEYXRlUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkRhdGVQYXJzZXIiKTsKICB9CiAgcHJpb3JpdHkgPSA5MDsKICBzdWJQcmlvcml0eSA9IDE7CiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoMikgewogICAgc3dpdGNoICh0b2tlbikgewogICAgICBjYXNlICJkIjoKICAgICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihudW1lcmljUGF0dGVybnMuZGF0ZSwgZGF0ZVN0cmluZyk7CiAgICAgIGNhc2UgImRvIjoKICAgICAgICByZXR1cm4gbWF0Y2gyLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiAiZGF0ZSIgfSk7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIHBhcnNlTkRpZ2l0cyh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpOwogICAgfQogIH0KICB2YWxpZGF0ZShkYXRlLCB2YWx1ZTIpIHsKICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7CiAgICBjb25zdCBpc0xlYXBZZWFyMiA9IGlzTGVhcFllYXJJbmRleCh5ZWFyKTsKICAgIGNvbnN0IG1vbnRoID0gZGF0ZS5nZXRNb250aCgpOwogICAgaWYgKGlzTGVhcFllYXIyKSB7CiAgICAgIHJldHVybiB2YWx1ZTIgPj0gMSAmJiB2YWx1ZTIgPD0gREFZU19JTl9NT05USF9MRUFQX1lFQVJbbW9udGhdOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHZhbHVlMiA+PSAxICYmIHZhbHVlMiA8PSBEQVlTX0lOX01PTlRIW21vbnRoXTsKICAgIH0KICB9CiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUyKSB7CiAgICBkYXRlLnNldERhdGUodmFsdWUyKTsKICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgICByZXR1cm4gZGF0ZTsKICB9CiAgaW5jb21wYXRpYmxlVG9rZW5zID0gWwogICAgIlkiLAogICAgIlIiLAogICAgInEiLAogICAgIlEiLAogICAgInciLAogICAgIkkiLAogICAgIkQiLAogICAgImkiLAogICAgImUiLAogICAgImMiLAogICAgInQiLAogICAgIlQiCiAgXTsKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0RheU9mWWVhclBhcnNlci5qcwp2YXIgRGF5T2ZZZWFyUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkRheU9mWWVhclBhcnNlciIpOwogIH0KICBwcmlvcml0eSA9IDkwOwogIHN1YnByaW9yaXR5ID0gMTsKICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gyKSB7CiAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgIGNhc2UgIkQiOgogICAgICBjYXNlICJERCI6CiAgICAgICAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4obnVtZXJpY1BhdHRlcm5zLmRheU9mWWVhciwgZGF0ZVN0cmluZyk7CiAgICAgIGNhc2UgIkRvIjoKICAgICAgICByZXR1cm4gbWF0Y2gyLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiAiZGF0ZSIgfSk7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIHBhcnNlTkRpZ2l0cyh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpOwogICAgfQogIH0KICB2YWxpZGF0ZShkYXRlLCB2YWx1ZTIpIHsKICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7CiAgICBjb25zdCBpc0xlYXBZZWFyMiA9IGlzTGVhcFllYXJJbmRleCh5ZWFyKTsKICAgIGlmIChpc0xlYXBZZWFyMikgewogICAgICByZXR1cm4gdmFsdWUyID49IDEgJiYgdmFsdWUyIDw9IDM2NjsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB2YWx1ZTIgPj0gMSAmJiB2YWx1ZTIgPD0gMzY1OwogICAgfQogIH0KICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZTIpIHsKICAgIGRhdGUuc2V0TW9udGgoMCwgdmFsdWUyKTsKICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgICByZXR1cm4gZGF0ZTsKICB9CiAgaW5jb21wYXRpYmxlVG9rZW5zID0gWwogICAgIlkiLAogICAgIlIiLAogICAgInEiLAogICAgIlEiLAogICAgIk0iLAogICAgIkwiLAogICAgInciLAogICAgIkkiLAogICAgImQiLAogICAgIkUiLAogICAgImkiLAogICAgImUiLAogICAgImMiLAogICAgInQiLAogICAgIlQiCiAgXTsKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0RGF5LmpzCmZ1bmN0aW9uIHNldERheShkYXRlLCBkYXksIG9wdGlvbnMpIHsKICBjb25zdCBkZWZhdWx0T3B0aW9uczIgPSBnZXREZWZhdWx0T3B0aW9ucygpOwogIGNvbnN0IHdlZWtTdGFydHNPbiA9IG9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyBkZWZhdWx0T3B0aW9uczIud2Vla1N0YXJ0c09uID8/IGRlZmF1bHRPcHRpb25zMi5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyAwOwogIGNvbnN0IGRhdGVfID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCBjdXJyZW50RGF5ID0gZGF0ZV8uZ2V0RGF5KCk7CiAgY29uc3QgcmVtYWluZGVyID0gZGF5ICUgNzsKICBjb25zdCBkYXlJbmRleCA9IChyZW1haW5kZXIgKyA3KSAlIDc7CiAgY29uc3QgZGVsdGEgPSA3IC0gd2Vla1N0YXJ0c09uOwogIGNvbnN0IGRpZmYgPSBkYXkgPCAwIHx8IGRheSA+IDYgPyBkYXkgLSAoY3VycmVudERheSArIGRlbHRhKSAlIDcgOiAoZGF5SW5kZXggKyBkZWx0YSkgJSA3IC0gKGN1cnJlbnREYXkgKyBkZWx0YSkgJSA3OwogIHJldHVybiBhZGREYXlzKGRhdGVfLCBkaWZmLCBvcHRpb25zKTsKfQpfX25hbWUoc2V0RGF5LCAic2V0RGF5Iik7CnZhciBzZXREYXlfZGVmYXVsdCA9IHNldERheTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0RheVBhcnNlci5qcwp2YXIgRGF5UGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkRheVBhcnNlciIpOwogIH0KICBwcmlvcml0eSA9IDkwOwogIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaDIpIHsKICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgLy8gVHVlCiAgICAgIGNhc2UgIkUiOgogICAgICBjYXNlICJFRSI6CiAgICAgIGNhc2UgIkVFRSI6CiAgICAgICAgcmV0dXJuIG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgewogICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICB9KSB8fCBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJzaG9ydCIsIGNvbnRleHQ6ICJmb3JtYXR0aW5nIiB9KSB8fCBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJuYXJyb3ciLCBjb250ZXh0OiAiZm9ybWF0dGluZyIgfSk7CiAgICAgIC8vIFQKICAgICAgY2FzZSAiRUVFRUUiOgogICAgICAgIHJldHVybiBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsKICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pOwogICAgICAvLyBUdQogICAgICBjYXNlICJFRUVFRUUiOgogICAgICAgIHJldHVybiBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJzaG9ydCIsIGNvbnRleHQ6ICJmb3JtYXR0aW5nIiB9KSB8fCBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJuYXJyb3ciLCBjb250ZXh0OiAiZm9ybWF0dGluZyIgfSk7CiAgICAgIC8vIFR1ZXNkYXkKICAgICAgY2FzZSAiRUVFRSI6CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogIndpZGUiLCBjb250ZXh0OiAiZm9ybWF0dGluZyIgfSkgfHwgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7CiAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pIHx8IG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogInNob3J0IiwgY29udGV4dDogImZvcm1hdHRpbmciIH0pIHx8IG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogIm5hcnJvdyIsIGNvbnRleHQ6ICJmb3JtYXR0aW5nIiB9KTsKICAgIH0KICB9CiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlMikgewogICAgcmV0dXJuIHZhbHVlMiA+PSAwICYmIHZhbHVlMiA8PSA2OwogIH0KICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZTIsIG9wdGlvbnMpIHsKICAgIGRhdGUgPSBzZXREYXkoZGF0ZSwgdmFsdWUyLCBvcHRpb25zKTsKICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgICByZXR1cm4gZGF0ZTsKICB9CiAgaW5jb21wYXRpYmxlVG9rZW5zID0gWyJEIiwgImkiLCAiZSIsICJjIiwgInQiLCAiVCJdOwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvTG9jYWxEYXlQYXJzZXIuanMKdmFyIExvY2FsRGF5UGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkxvY2FsRGF5UGFyc2VyIik7CiAgfQogIHByaW9yaXR5ID0gOTA7CiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoMiwgb3B0aW9ucykgewogICAgY29uc3QgdmFsdWVDYWxsYmFjayA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHZhbHVlMikgPT4gewogICAgICBjb25zdCB3aG9sZVdlZWtEYXlzID0gTWF0aC5mbG9vcigodmFsdWUyIC0gMSkgLyA3KSAqIDc7CiAgICAgIHJldHVybiAodmFsdWUyICsgb3B0aW9ucy53ZWVrU3RhcnRzT24gKyA2KSAlIDcgKyB3aG9sZVdlZWtEYXlzOwogICAgfSwgInZhbHVlQ2FsbGJhY2siKTsKICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgLy8gMwogICAgICBjYXNlICJlIjoKICAgICAgY2FzZSAiZWUiOgogICAgICAgIHJldHVybiBtYXBWYWx1ZShwYXJzZU5EaWdpdHModG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKSwgdmFsdWVDYWxsYmFjayk7CiAgICAgIC8vIDNyZAogICAgICBjYXNlICJlbyI6CiAgICAgICAgcmV0dXJuIG1hcFZhbHVlKAogICAgICAgICAgbWF0Y2gyLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgewogICAgICAgICAgICB1bml0OiAiZGF5IgogICAgICAgICAgfSksCiAgICAgICAgICB2YWx1ZUNhbGxiYWNrCiAgICAgICAgKTsKICAgICAgLy8gVHVlCiAgICAgIGNhc2UgImVlZSI6CiAgICAgICAgcmV0dXJuIG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgewogICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICB9KSB8fCBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJzaG9ydCIsIGNvbnRleHQ6ICJmb3JtYXR0aW5nIiB9KSB8fCBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJuYXJyb3ciLCBjb250ZXh0OiAiZm9ybWF0dGluZyIgfSk7CiAgICAgIC8vIFQKICAgICAgY2FzZSAiZWVlZWUiOgogICAgICAgIHJldHVybiBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsKICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pOwogICAgICAvLyBUdQogICAgICBjYXNlICJlZWVlZWUiOgogICAgICAgIHJldHVybiBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJzaG9ydCIsIGNvbnRleHQ6ICJmb3JtYXR0aW5nIiB9KSB8fCBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJuYXJyb3ciLCBjb250ZXh0OiAiZm9ybWF0dGluZyIgfSk7CiAgICAgIC8vIFR1ZXNkYXkKICAgICAgY2FzZSAiZWVlZSI6CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogIndpZGUiLCBjb250ZXh0OiAiZm9ybWF0dGluZyIgfSkgfHwgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7CiAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pIHx8IG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogInNob3J0IiwgY29udGV4dDogImZvcm1hdHRpbmciIH0pIHx8IG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogIm5hcnJvdyIsIGNvbnRleHQ6ICJmb3JtYXR0aW5nIiB9KTsKICAgIH0KICB9CiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlMikgewogICAgcmV0dXJuIHZhbHVlMiA+PSAwICYmIHZhbHVlMiA8PSA2OwogIH0KICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZTIsIG9wdGlvbnMpIHsKICAgIGRhdGUgPSBzZXREYXkoZGF0ZSwgdmFsdWUyLCBvcHRpb25zKTsKICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgICByZXR1cm4gZGF0ZTsKICB9CiAgaW5jb21wYXRpYmxlVG9rZW5zID0gWwogICAgInkiLAogICAgIlIiLAogICAgInUiLAogICAgInEiLAogICAgIlEiLAogICAgIk0iLAogICAgIkwiLAogICAgIkkiLAogICAgImQiLAogICAgIkQiLAogICAgIkUiLAogICAgImkiLAogICAgImMiLAogICAgInQiLAogICAgIlQiCiAgXTsKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL1N0YW5kQWxvbmVMb2NhbERheVBhcnNlci5qcwp2YXIgU3RhbmRBbG9uZUxvY2FsRGF5UGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlN0YW5kQWxvbmVMb2NhbERheVBhcnNlciIpOwogIH0KICBwcmlvcml0eSA9IDkwOwogIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaDIsIG9wdGlvbnMpIHsKICAgIGNvbnN0IHZhbHVlQ2FsbGJhY2sgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh2YWx1ZTIpID0+IHsKICAgICAgY29uc3Qgd2hvbGVXZWVrRGF5cyA9IE1hdGguZmxvb3IoKHZhbHVlMiAtIDEpIC8gNykgKiA3OwogICAgICByZXR1cm4gKHZhbHVlMiArIG9wdGlvbnMud2Vla1N0YXJ0c09uICsgNikgJSA3ICsgd2hvbGVXZWVrRGF5czsKICAgIH0sICJ2YWx1ZUNhbGxiYWNrIik7CiAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgIC8vIDMKICAgICAgY2FzZSAiYyI6CiAgICAgIGNhc2UgImNjIjoKICAgICAgICByZXR1cm4gbWFwVmFsdWUocGFyc2VORGlnaXRzKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyksIHZhbHVlQ2FsbGJhY2spOwogICAgICAvLyAzcmQKICAgICAgY2FzZSAiY28iOgogICAgICAgIHJldHVybiBtYXBWYWx1ZSgKICAgICAgICAgIG1hdGNoMi5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgdW5pdDogImRheSIKICAgICAgICAgIH0pLAogICAgICAgICAgdmFsdWVDYWxsYmFjawogICAgICAgICk7CiAgICAgIC8vIFR1ZQogICAgICBjYXNlICJjY2MiOgogICAgICAgIHJldHVybiBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsKICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgY29udGV4dDogInN0YW5kYWxvbmUiCiAgICAgICAgfSkgfHwgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiAic2hvcnQiLCBjb250ZXh0OiAic3RhbmRhbG9uZSIgfSkgfHwgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiAibmFycm93IiwgY29udGV4dDogInN0YW5kYWxvbmUiIH0pOwogICAgICAvLyBUCiAgICAgIGNhc2UgImNjY2NjIjoKICAgICAgICByZXR1cm4gbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7CiAgICAgICAgICB3aWR0aDogIm5hcnJvdyIsCiAgICAgICAgICBjb250ZXh0OiAic3RhbmRhbG9uZSIKICAgICAgICB9KTsKICAgICAgLy8gVHUKICAgICAgY2FzZSAiY2NjY2NjIjoKICAgICAgICByZXR1cm4gbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiAic2hvcnQiLCBjb250ZXh0OiAic3RhbmRhbG9uZSIgfSkgfHwgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiAibmFycm93IiwgY29udGV4dDogInN0YW5kYWxvbmUiIH0pOwogICAgICAvLyBUdWVzZGF5CiAgICAgIGNhc2UgImNjY2MiOgogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJ3aWRlIiwgY29udGV4dDogInN0YW5kYWxvbmUiIH0pIHx8IG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgewogICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICBjb250ZXh0OiAic3RhbmRhbG9uZSIKICAgICAgICB9KSB8fCBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJzaG9ydCIsIGNvbnRleHQ6ICJzdGFuZGFsb25lIiB9KSB8fCBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJuYXJyb3ciLCBjb250ZXh0OiAic3RhbmRhbG9uZSIgfSk7CiAgICB9CiAgfQogIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZTIpIHsKICAgIHJldHVybiB2YWx1ZTIgPj0gMCAmJiB2YWx1ZTIgPD0gNjsKICB9CiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUyLCBvcHRpb25zKSB7CiAgICBkYXRlID0gc2V0RGF5KGRhdGUsIHZhbHVlMiwgb3B0aW9ucyk7CiAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgcmV0dXJuIGRhdGU7CiAgfQogIGluY29tcGF0aWJsZVRva2VucyA9IFsKICAgICJ5IiwKICAgICJSIiwKICAgICJ1IiwKICAgICJxIiwKICAgICJRIiwKICAgICJNIiwKICAgICJMIiwKICAgICJJIiwKICAgICJkIiwKICAgICJEIiwKICAgICJFIiwKICAgICJpIiwKICAgICJlIiwKICAgICJ0IiwKICAgICJUIgogIF07Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldElTT0RheS5qcwpmdW5jdGlvbiBzZXRJU09EYXkoZGF0ZSwgZGF5LCBvcHRpb25zKSB7CiAgY29uc3QgZGF0ZV8gPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGNvbnN0IGN1cnJlbnREYXkgPSBnZXRJU09EYXkoZGF0ZV8sIG9wdGlvbnMpOwogIGNvbnN0IGRpZmYgPSBkYXkgLSBjdXJyZW50RGF5OwogIHJldHVybiBhZGREYXlzKGRhdGVfLCBkaWZmLCBvcHRpb25zKTsKfQpfX25hbWUoc2V0SVNPRGF5LCAic2V0SVNPRGF5Iik7CnZhciBzZXRJU09EYXlfZGVmYXVsdCA9IHNldElTT0RheTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0lTT0RheVBhcnNlci5qcwp2YXIgSVNPRGF5UGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIklTT0RheVBhcnNlciIpOwogIH0KICBwcmlvcml0eSA9IDkwOwogIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaDIpIHsKICAgIGNvbnN0IHZhbHVlQ2FsbGJhY2sgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh2YWx1ZTIpID0+IHsKICAgICAgaWYgKHZhbHVlMiA9PT0gMCkgewogICAgICAgIHJldHVybiA3OwogICAgICB9CiAgICAgIHJldHVybiB2YWx1ZTI7CiAgICB9LCAidmFsdWVDYWxsYmFjayIpOwogICAgc3dpdGNoICh0b2tlbikgewogICAgICAvLyAyCiAgICAgIGNhc2UgImkiOgogICAgICBjYXNlICJpaSI6CiAgICAgICAgcmV0dXJuIHBhcnNlTkRpZ2l0cyh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpOwogICAgICAvLyAybmQKICAgICAgY2FzZSAiaW8iOgogICAgICAgIHJldHVybiBtYXRjaDIub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7IHVuaXQ6ICJkYXkiIH0pOwogICAgICAvLyBUdWUKICAgICAgY2FzZSAiaWlpIjoKICAgICAgICByZXR1cm4gbWFwVmFsdWUoCiAgICAgICAgICBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgfSkgfHwgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgIHdpZHRoOiAic2hvcnQiLAogICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgIH0pIHx8IG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgewogICAgICAgICAgICB3aWR0aDogIm5hcnJvdyIsCiAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgfSksCiAgICAgICAgICB2YWx1ZUNhbGxiYWNrCiAgICAgICAgKTsKICAgICAgLy8gVAogICAgICBjYXNlICJpaWlpaSI6CiAgICAgICAgcmV0dXJuIG1hcFZhbHVlKAogICAgICAgICAgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICB9KSwKICAgICAgICAgIHZhbHVlQ2FsbGJhY2sKICAgICAgICApOwogICAgICAvLyBUdQogICAgICBjYXNlICJpaWlpaWkiOgogICAgICAgIHJldHVybiBtYXBWYWx1ZSgKICAgICAgICAgIG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgewogICAgICAgICAgICB3aWR0aDogInNob3J0IiwKICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICB9KSB8fCBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgIH0pLAogICAgICAgICAgdmFsdWVDYWxsYmFjawogICAgICAgICk7CiAgICAgIC8vIFR1ZXNkYXkKICAgICAgY2FzZSAiaWlpaSI6CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIG1hcFZhbHVlKAogICAgICAgICAgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgIHdpZHRoOiAid2lkZSIsCiAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgfSkgfHwgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgIH0pIHx8IG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgewogICAgICAgICAgICB3aWR0aDogInNob3J0IiwKICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICB9KSB8fCBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgIH0pLAogICAgICAgICAgdmFsdWVDYWxsYmFjawogICAgICAgICk7CiAgICB9CiAgfQogIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZTIpIHsKICAgIHJldHVybiB2YWx1ZTIgPj0gMSAmJiB2YWx1ZTIgPD0gNzsKICB9CiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUyKSB7CiAgICBkYXRlID0gc2V0SVNPRGF5KGRhdGUsIHZhbHVlMik7CiAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgcmV0dXJuIGRhdGU7CiAgfQogIGluY29tcGF0aWJsZVRva2VucyA9IFsKICAgICJ5IiwKICAgICJZIiwKICAgICJ1IiwKICAgICJxIiwKICAgICJRIiwKICAgICJNIiwKICAgICJMIiwKICAgICJ3IiwKICAgICJkIiwKICAgICJEIiwKICAgICJFIiwKICAgICJlIiwKICAgICJjIiwKICAgICJ0IiwKICAgICJUIgogIF07Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9BTVBNUGFyc2VyLmpzCnZhciBBTVBNUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkFNUE1QYXJzZXIiKTsKICB9CiAgcHJpb3JpdHkgPSA4MDsKICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gyKSB7CiAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgIGNhc2UgImEiOgogICAgICBjYXNlICJhYSI6CiAgICAgIGNhc2UgImFhYSI6CiAgICAgICAgcmV0dXJuIG1hdGNoMi5kYXlQZXJpb2QoZGF0ZVN0cmluZywgewogICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICB9KSB8fCBtYXRjaDIuZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHsKICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pOwogICAgICBjYXNlICJhYWFhYSI6CiAgICAgICAgcmV0dXJuIG1hdGNoMi5kYXlQZXJpb2QoZGF0ZVN0cmluZywgewogICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSk7CiAgICAgIGNhc2UgImFhYWEiOgogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBtYXRjaDIuZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHsKICAgICAgICAgIHdpZHRoOiAid2lkZSIsCiAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICB9KSB8fCBtYXRjaDIuZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHsKICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSkgfHwgbWF0Y2gyLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7CiAgICAgICAgICB3aWR0aDogIm5hcnJvdyIsCiAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICB9KTsKICAgIH0KICB9CiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUyKSB7CiAgICBkYXRlLnNldEhvdXJzKGRheVBlcmlvZEVudW1Ub0hvdXJzKHZhbHVlMiksIDAsIDAsIDApOwogICAgcmV0dXJuIGRhdGU7CiAgfQogIGluY29tcGF0aWJsZVRva2VucyA9IFsiYiIsICJCIiwgIkgiLCAiayIsICJ0IiwgIlQiXTsKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0FNUE1NaWRuaWdodFBhcnNlci5qcwp2YXIgQU1QTU1pZG5pZ2h0UGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkFNUE1NaWRuaWdodFBhcnNlciIpOwogIH0KICBwcmlvcml0eSA9IDgwOwogIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaDIpIHsKICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgY2FzZSAiYiI6CiAgICAgIGNhc2UgImJiIjoKICAgICAgY2FzZSAiYmJiIjoKICAgICAgICByZXR1cm4gbWF0Y2gyLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7CiAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pIHx8IG1hdGNoMi5kYXlQZXJpb2QoZGF0ZVN0cmluZywgewogICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSk7CiAgICAgIGNhc2UgImJiYmJiIjoKICAgICAgICByZXR1cm4gbWF0Y2gyLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7CiAgICAgICAgICB3aWR0aDogIm5hcnJvdyIsCiAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICB9KTsKICAgICAgY2FzZSAiYmJiYiI6CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIG1hdGNoMi5kYXlQZXJpb2QoZGF0ZVN0cmluZywgewogICAgICAgICAgd2lkdGg6ICJ3aWRlIiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pIHx8IG1hdGNoMi5kYXlQZXJpb2QoZGF0ZVN0cmluZywgewogICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICB9KSB8fCBtYXRjaDIuZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHsKICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pOwogICAgfQogIH0KICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZTIpIHsKICAgIGRhdGUuc2V0SG91cnMoZGF5UGVyaW9kRW51bVRvSG91cnModmFsdWUyKSwgMCwgMCwgMCk7CiAgICByZXR1cm4gZGF0ZTsKICB9CiAgaW5jb21wYXRpYmxlVG9rZW5zID0gWyJhIiwgIkIiLCAiSCIsICJrIiwgInQiLCAiVCJdOwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvRGF5UGVyaW9kUGFyc2VyLmpzCnZhciBEYXlQZXJpb2RQYXJzZXIgPSBjbGFzcyBleHRlbmRzIFBhcnNlciB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiRGF5UGVyaW9kUGFyc2VyIik7CiAgfQogIHByaW9yaXR5ID0gODA7CiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoMikgewogICAgc3dpdGNoICh0b2tlbikgewogICAgICBjYXNlICJCIjoKICAgICAgY2FzZSAiQkIiOgogICAgICBjYXNlICJCQkIiOgogICAgICAgIHJldHVybiBtYXRjaDIuZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHsKICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSkgfHwgbWF0Y2gyLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7CiAgICAgICAgICB3aWR0aDogIm5hcnJvdyIsCiAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICB9KTsKICAgICAgY2FzZSAiQkJCQkIiOgogICAgICAgIHJldHVybiBtYXRjaDIuZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHsKICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pOwogICAgICBjYXNlICJCQkJCIjoKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gbWF0Y2gyLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7CiAgICAgICAgICB3aWR0aDogIndpZGUiLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSkgfHwgbWF0Y2gyLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7CiAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgIH0pIHx8IG1hdGNoMi5kYXlQZXJpb2QoZGF0ZVN0cmluZywgewogICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgfSk7CiAgICB9CiAgfQogIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlMikgewogICAgZGF0ZS5zZXRIb3VycyhkYXlQZXJpb2RFbnVtVG9Ib3Vycyh2YWx1ZTIpLCAwLCAwLCAwKTsKICAgIHJldHVybiBkYXRlOwogIH0KICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbImEiLCAiYiIsICJ0IiwgIlQiXTsKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0hvdXIxdG8xMlBhcnNlci5qcwp2YXIgSG91cjF0bzEyUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkhvdXIxdG8xMlBhcnNlciIpOwogIH0KICBwcmlvcml0eSA9IDcwOwogIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaDIpIHsKICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgY2FzZSAiaCI6CiAgICAgICAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4obnVtZXJpY1BhdHRlcm5zLmhvdXIxMmgsIGRhdGVTdHJpbmcpOwogICAgICBjYXNlICJobyI6CiAgICAgICAgcmV0dXJuIG1hdGNoMi5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogImhvdXIiIH0pOwogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBwYXJzZU5EaWdpdHModG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTsKICAgIH0KICB9CiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlMikgewogICAgcmV0dXJuIHZhbHVlMiA+PSAxICYmIHZhbHVlMiA8PSAxMjsKICB9CiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUyKSB7CiAgICBjb25zdCBpc1BNID0gZGF0ZS5nZXRIb3VycygpID49IDEyOwogICAgaWYgKGlzUE0gJiYgdmFsdWUyIDwgMTIpIHsKICAgICAgZGF0ZS5zZXRIb3Vycyh2YWx1ZTIgKyAxMiwgMCwgMCwgMCk7CiAgICB9IGVsc2UgaWYgKCFpc1BNICYmIHZhbHVlMiA9PT0gMTIpIHsKICAgICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICAgIH0gZWxzZSB7CiAgICAgIGRhdGUuc2V0SG91cnModmFsdWUyLCAwLCAwLCAwKTsKICAgIH0KICAgIHJldHVybiBkYXRlOwogIH0KICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbIkgiLCAiSyIsICJrIiwgInQiLCAiVCJdOwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvSG91cjB0bzIzUGFyc2VyLmpzCnZhciBIb3VyMHRvMjNQYXJzZXIgPSBjbGFzcyBleHRlbmRzIFBhcnNlciB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiSG91cjB0bzIzUGFyc2VyIik7CiAgfQogIHByaW9yaXR5ID0gNzA7CiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoMikgewogICAgc3dpdGNoICh0b2tlbikgewogICAgICBjYXNlICJIIjoKICAgICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihudW1lcmljUGF0dGVybnMuaG91cjIzaCwgZGF0ZVN0cmluZyk7CiAgICAgIGNhc2UgIkhvIjoKICAgICAgICByZXR1cm4gbWF0Y2gyLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiAiaG91ciIgfSk7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIHBhcnNlTkRpZ2l0cyh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpOwogICAgfQogIH0KICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUyKSB7CiAgICByZXR1cm4gdmFsdWUyID49IDAgJiYgdmFsdWUyIDw9IDIzOwogIH0KICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZTIpIHsKICAgIGRhdGUuc2V0SG91cnModmFsdWUyLCAwLCAwLCAwKTsKICAgIHJldHVybiBkYXRlOwogIH0KICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbImEiLCAiYiIsICJoIiwgIksiLCAiayIsICJ0IiwgIlQiXTsKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0hvdXIwVG8xMVBhcnNlci5qcwp2YXIgSG91cjBUbzExUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkhvdXIwVG8xMVBhcnNlciIpOwogIH0KICBwcmlvcml0eSA9IDcwOwogIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaDIpIHsKICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgY2FzZSAiSyI6CiAgICAgICAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4obnVtZXJpY1BhdHRlcm5zLmhvdXIxMWgsIGRhdGVTdHJpbmcpOwogICAgICBjYXNlICJLbyI6CiAgICAgICAgcmV0dXJuIG1hdGNoMi5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogImhvdXIiIH0pOwogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBwYXJzZU5EaWdpdHModG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTsKICAgIH0KICB9CiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlMikgewogICAgcmV0dXJuIHZhbHVlMiA+PSAwICYmIHZhbHVlMiA8PSAxMTsKICB9CiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUyKSB7CiAgICBjb25zdCBpc1BNID0gZGF0ZS5nZXRIb3VycygpID49IDEyOwogICAgaWYgKGlzUE0gJiYgdmFsdWUyIDwgMTIpIHsKICAgICAgZGF0ZS5zZXRIb3Vycyh2YWx1ZTIgKyAxMiwgMCwgMCwgMCk7CiAgICB9IGVsc2UgewogICAgICBkYXRlLnNldEhvdXJzKHZhbHVlMiwgMCwgMCwgMCk7CiAgICB9CiAgICByZXR1cm4gZGF0ZTsKICB9CiAgaW5jb21wYXRpYmxlVG9rZW5zID0gWyJoIiwgIkgiLCAiayIsICJ0IiwgIlQiXTsKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0hvdXIxVG8yNFBhcnNlci5qcwp2YXIgSG91cjFUbzI0UGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkhvdXIxVG8yNFBhcnNlciIpOwogIH0KICBwcmlvcml0eSA9IDcwOwogIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaDIpIHsKICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgY2FzZSAiayI6CiAgICAgICAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4obnVtZXJpY1BhdHRlcm5zLmhvdXIyNGgsIGRhdGVTdHJpbmcpOwogICAgICBjYXNlICJrbyI6CiAgICAgICAgcmV0dXJuIG1hdGNoMi5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogImhvdXIiIH0pOwogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBwYXJzZU5EaWdpdHModG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTsKICAgIH0KICB9CiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlMikgewogICAgcmV0dXJuIHZhbHVlMiA+PSAxICYmIHZhbHVlMiA8PSAyNDsKICB9CiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUyKSB7CiAgICBjb25zdCBob3VycyA9IHZhbHVlMiA8PSAyNCA/IHZhbHVlMiAlIDI0IDogdmFsdWUyOwogICAgZGF0ZS5zZXRIb3Vycyhob3VycywgMCwgMCwgMCk7CiAgICByZXR1cm4gZGF0ZTsKICB9CiAgaW5jb21wYXRpYmxlVG9rZW5zID0gWyJhIiwgImIiLCAiaCIsICJIIiwgIksiLCAidCIsICJUIl07Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9NaW51dGVQYXJzZXIuanMKdmFyIE1pbnV0ZVBhcnNlciA9IGNsYXNzIGV4dGVuZHMgUGFyc2VyIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJNaW51dGVQYXJzZXIiKTsKICB9CiAgcHJpb3JpdHkgPSA2MDsKICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gyKSB7CiAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgIGNhc2UgIm0iOgogICAgICAgIHJldHVybiBwYXJzZU51bWVyaWNQYXR0ZXJuKG51bWVyaWNQYXR0ZXJucy5taW51dGUsIGRhdGVTdHJpbmcpOwogICAgICBjYXNlICJtbyI6CiAgICAgICAgcmV0dXJuIG1hdGNoMi5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogIm1pbnV0ZSIgfSk7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIHBhcnNlTkRpZ2l0cyh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpOwogICAgfQogIH0KICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUyKSB7CiAgICByZXR1cm4gdmFsdWUyID49IDAgJiYgdmFsdWUyIDw9IDU5OwogIH0KICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZTIpIHsKICAgIGRhdGUuc2V0TWludXRlcyh2YWx1ZTIsIDAsIDApOwogICAgcmV0dXJuIGRhdGU7CiAgfQogIGluY29tcGF0aWJsZVRva2VucyA9IFsidCIsICJUIl07Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9TZWNvbmRQYXJzZXIuanMKdmFyIFNlY29uZFBhcnNlciA9IGNsYXNzIGV4dGVuZHMgUGFyc2VyIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJTZWNvbmRQYXJzZXIiKTsKICB9CiAgcHJpb3JpdHkgPSA1MDsKICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gyKSB7CiAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgIGNhc2UgInMiOgogICAgICAgIHJldHVybiBwYXJzZU51bWVyaWNQYXR0ZXJuKG51bWVyaWNQYXR0ZXJucy5zZWNvbmQsIGRhdGVTdHJpbmcpOwogICAgICBjYXNlICJzbyI6CiAgICAgICAgcmV0dXJuIG1hdGNoMi5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogInNlY29uZCIgfSk7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIHBhcnNlTkRpZ2l0cyh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpOwogICAgfQogIH0KICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUyKSB7CiAgICByZXR1cm4gdmFsdWUyID49IDAgJiYgdmFsdWUyIDw9IDU5OwogIH0KICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZTIpIHsKICAgIGRhdGUuc2V0U2Vjb25kcyh2YWx1ZTIsIDApOwogICAgcmV0dXJuIGRhdGU7CiAgfQogIGluY29tcGF0aWJsZVRva2VucyA9IFsidCIsICJUIl07Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9GcmFjdGlvbk9mU2Vjb25kUGFyc2VyLmpzCnZhciBGcmFjdGlvbk9mU2Vjb25kUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkZyYWN0aW9uT2ZTZWNvbmRQYXJzZXIiKTsKICB9CiAgcHJpb3JpdHkgPSAzMDsKICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbikgewogICAgY29uc3QgdmFsdWVDYWxsYmFjayA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHZhbHVlMikgPT4gTWF0aC50cnVuYyh2YWx1ZTIgKiBNYXRoLnBvdygxMCwgLXRva2VuLmxlbmd0aCArIDMpKSwgInZhbHVlQ2FsbGJhY2siKTsKICAgIHJldHVybiBtYXBWYWx1ZShwYXJzZU5EaWdpdHModG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKSwgdmFsdWVDYWxsYmFjayk7CiAgfQogIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlMikgewogICAgZGF0ZS5zZXRNaWxsaXNlY29uZHModmFsdWUyKTsKICAgIHJldHVybiBkYXRlOwogIH0KICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbInQiLCAiVCJdOwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvSVNPVGltZXpvbmVXaXRoWlBhcnNlci5qcwp2YXIgSVNPVGltZXpvbmVXaXRoWlBhcnNlciA9IGNsYXNzIGV4dGVuZHMgUGFyc2VyIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJJU09UaW1lem9uZVdpdGhaUGFyc2VyIik7CiAgfQogIHByaW9yaXR5ID0gMTA7CiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4pIHsKICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgY2FzZSAiWCI6CiAgICAgICAgcmV0dXJuIHBhcnNlVGltZXpvbmVQYXR0ZXJuKAogICAgICAgICAgdGltZXpvbmVQYXR0ZXJucy5iYXNpY09wdGlvbmFsTWludXRlcywKICAgICAgICAgIGRhdGVTdHJpbmcKICAgICAgICApOwogICAgICBjYXNlICJYWCI6CiAgICAgICAgcmV0dXJuIHBhcnNlVGltZXpvbmVQYXR0ZXJuKHRpbWV6b25lUGF0dGVybnMuYmFzaWMsIGRhdGVTdHJpbmcpOwogICAgICBjYXNlICJYWFhYIjoKICAgICAgICByZXR1cm4gcGFyc2VUaW1lem9uZVBhdHRlcm4oCiAgICAgICAgICB0aW1lem9uZVBhdHRlcm5zLmJhc2ljT3B0aW9uYWxTZWNvbmRzLAogICAgICAgICAgZGF0ZVN0cmluZwogICAgICAgICk7CiAgICAgIGNhc2UgIlhYWFhYIjoKICAgICAgICByZXR1cm4gcGFyc2VUaW1lem9uZVBhdHRlcm4oCiAgICAgICAgICB0aW1lem9uZVBhdHRlcm5zLmV4dGVuZGVkT3B0aW9uYWxTZWNvbmRzLAogICAgICAgICAgZGF0ZVN0cmluZwogICAgICAgICk7CiAgICAgIGNhc2UgIlhYWCI6CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIHBhcnNlVGltZXpvbmVQYXR0ZXJuKHRpbWV6b25lUGF0dGVybnMuZXh0ZW5kZWQsIGRhdGVTdHJpbmcpOwogICAgfQogIH0KICBzZXQoZGF0ZSwgZmxhZ3MsIHZhbHVlMikgewogICAgaWYgKGZsYWdzLnRpbWVzdGFtcElzU2V0KSByZXR1cm4gZGF0ZTsKICAgIHJldHVybiBjb25zdHJ1Y3RGcm9tKAogICAgICBkYXRlLAogICAgICBkYXRlLmdldFRpbWUoKSAtIGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMoZGF0ZSkgLSB2YWx1ZTIKICAgICk7CiAgfQogIGluY29tcGF0aWJsZVRva2VucyA9IFsidCIsICJUIiwgIngiXTsKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0lTT1RpbWV6b25lUGFyc2VyLmpzCnZhciBJU09UaW1lem9uZVBhcnNlciA9IGNsYXNzIGV4dGVuZHMgUGFyc2VyIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJJU09UaW1lem9uZVBhcnNlciIpOwogIH0KICBwcmlvcml0eSA9IDEwOwogIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuKSB7CiAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgIGNhc2UgIngiOgogICAgICAgIHJldHVybiBwYXJzZVRpbWV6b25lUGF0dGVybigKICAgICAgICAgIHRpbWV6b25lUGF0dGVybnMuYmFzaWNPcHRpb25hbE1pbnV0ZXMsCiAgICAgICAgICBkYXRlU3RyaW5nCiAgICAgICAgKTsKICAgICAgY2FzZSAieHgiOgogICAgICAgIHJldHVybiBwYXJzZVRpbWV6b25lUGF0dGVybih0aW1lem9uZVBhdHRlcm5zLmJhc2ljLCBkYXRlU3RyaW5nKTsKICAgICAgY2FzZSAieHh4eCI6CiAgICAgICAgcmV0dXJuIHBhcnNlVGltZXpvbmVQYXR0ZXJuKAogICAgICAgICAgdGltZXpvbmVQYXR0ZXJucy5iYXNpY09wdGlvbmFsU2Vjb25kcywKICAgICAgICAgIGRhdGVTdHJpbmcKICAgICAgICApOwogICAgICBjYXNlICJ4eHh4eCI6CiAgICAgICAgcmV0dXJuIHBhcnNlVGltZXpvbmVQYXR0ZXJuKAogICAgICAgICAgdGltZXpvbmVQYXR0ZXJucy5leHRlbmRlZE9wdGlvbmFsU2Vjb25kcywKICAgICAgICAgIGRhdGVTdHJpbmcKICAgICAgICApOwogICAgICBjYXNlICJ4eHgiOgogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBwYXJzZVRpbWV6b25lUGF0dGVybih0aW1lem9uZVBhdHRlcm5zLmV4dGVuZGVkLCBkYXRlU3RyaW5nKTsKICAgIH0KICB9CiAgc2V0KGRhdGUsIGZsYWdzLCB2YWx1ZTIpIHsKICAgIGlmIChmbGFncy50aW1lc3RhbXBJc1NldCkgcmV0dXJuIGRhdGU7CiAgICByZXR1cm4gY29uc3RydWN0RnJvbSgKICAgICAgZGF0ZSwKICAgICAgZGF0ZS5nZXRUaW1lKCkgLSBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKGRhdGUpIC0gdmFsdWUyCiAgICApOwogIH0KICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbInQiLCAiVCIsICJYIl07Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9UaW1lc3RhbXBTZWNvbmRzUGFyc2VyLmpzCnZhciBUaW1lc3RhbXBTZWNvbmRzUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlRpbWVzdGFtcFNlY29uZHNQYXJzZXIiKTsKICB9CiAgcHJpb3JpdHkgPSA0MDsKICBwYXJzZShkYXRlU3RyaW5nKSB7CiAgICByZXR1cm4gcGFyc2VBbnlEaWdpdHNTaWduZWQoZGF0ZVN0cmluZyk7CiAgfQogIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlMikgewogICAgcmV0dXJuIFtjb25zdHJ1Y3RGcm9tKGRhdGUsIHZhbHVlMiAqIDFlMyksIHsgdGltZXN0YW1wSXNTZXQ6IHRydWUgfV07CiAgfQogIGluY29tcGF0aWJsZVRva2VucyA9ICIqIjsKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL1RpbWVzdGFtcE1pbGxpc2Vjb25kc1BhcnNlci5qcwp2YXIgVGltZXN0YW1wTWlsbGlzZWNvbmRzUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlRpbWVzdGFtcE1pbGxpc2Vjb25kc1BhcnNlciIpOwogIH0KICBwcmlvcml0eSA9IDIwOwogIHBhcnNlKGRhdGVTdHJpbmcpIHsKICAgIHJldHVybiBwYXJzZUFueURpZ2l0c1NpZ25lZChkYXRlU3RyaW5nKTsKICB9CiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUyKSB7CiAgICByZXR1cm4gW2NvbnN0cnVjdEZyb20oZGF0ZSwgdmFsdWUyKSwgeyB0aW1lc3RhbXBJc1NldDogdHJ1ZSB9XTsKICB9CiAgaW5jb21wYXRpYmxlVG9rZW5zID0gIioiOwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMuanMKdmFyIHBhcnNlcnMgPSB7CiAgRzogbmV3IEVyYVBhcnNlcigpLAogIHk6IG5ldyBZZWFyUGFyc2VyKCksCiAgWTogbmV3IExvY2FsV2Vla1llYXJQYXJzZXIoKSwKICBSOiBuZXcgSVNPV2Vla1llYXJQYXJzZXIoKSwKICB1OiBuZXcgRXh0ZW5kZWRZZWFyUGFyc2VyKCksCiAgUTogbmV3IFF1YXJ0ZXJQYXJzZXIoKSwKICBxOiBuZXcgU3RhbmRBbG9uZVF1YXJ0ZXJQYXJzZXIoKSwKICBNOiBuZXcgTW9udGhQYXJzZXIoKSwKICBMOiBuZXcgU3RhbmRBbG9uZU1vbnRoUGFyc2VyKCksCiAgdzogbmV3IExvY2FsV2Vla1BhcnNlcigpLAogIEk6IG5ldyBJU09XZWVrUGFyc2VyKCksCiAgZDogbmV3IERhdGVQYXJzZXIoKSwKICBEOiBuZXcgRGF5T2ZZZWFyUGFyc2VyKCksCiAgRTogbmV3IERheVBhcnNlcigpLAogIGU6IG5ldyBMb2NhbERheVBhcnNlcigpLAogIGM6IG5ldyBTdGFuZEFsb25lTG9jYWxEYXlQYXJzZXIoKSwKICBpOiBuZXcgSVNPRGF5UGFyc2VyKCksCiAgYTogbmV3IEFNUE1QYXJzZXIoKSwKICBiOiBuZXcgQU1QTU1pZG5pZ2h0UGFyc2VyKCksCiAgQjogbmV3IERheVBlcmlvZFBhcnNlcigpLAogIGg6IG5ldyBIb3VyMXRvMTJQYXJzZXIoKSwKICBIOiBuZXcgSG91cjB0bzIzUGFyc2VyKCksCiAgSzogbmV3IEhvdXIwVG8xMVBhcnNlcigpLAogIGs6IG5ldyBIb3VyMVRvMjRQYXJzZXIoKSwKICBtOiBuZXcgTWludXRlUGFyc2VyKCksCiAgczogbmV3IFNlY29uZFBhcnNlcigpLAogIFM6IG5ldyBGcmFjdGlvbk9mU2Vjb25kUGFyc2VyKCksCiAgWDogbmV3IElTT1RpbWV6b25lV2l0aFpQYXJzZXIoKSwKICB4OiBuZXcgSVNPVGltZXpvbmVQYXJzZXIoKSwKICB0OiBuZXcgVGltZXN0YW1wU2Vjb25kc1BhcnNlcigpLAogIFQ6IG5ldyBUaW1lc3RhbXBNaWxsaXNlY29uZHNQYXJzZXIoKQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS5qcwp2YXIgZm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cDIgPSAvW3lZUXFNTHdJZERlY2loSEtrbXNdb3woXHcpXDEqfCcnfCcoJyd8W14nXSkrKCd8JCl8Li9nOwp2YXIgbG9uZ0Zvcm1hdHRpbmdUb2tlbnNSZWdFeHAyID0gL1ArcCt8UCt8cCt8Jyd8JygnJ3xbXiddKSsoJ3wkKXwuL2c7CnZhciBlc2NhcGVkU3RyaW5nUmVnRXhwMiA9IC9eJyhbXl0qPyknPyQvOwp2YXIgZG91YmxlUXVvdGVSZWdFeHAyID0gLycnL2c7CnZhciBub3RXaGl0ZXNwYWNlUmVnRXhwID0gL1xTLzsKdmFyIHVuZXNjYXBlZExhdGluQ2hhcmFjdGVyUmVnRXhwMiA9IC9bYS16QS1aXS87CmZ1bmN0aW9uIHBhcnNlKGRhdGVTdHIsIGZvcm1hdFN0ciwgcmVmZXJlbmNlRGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IGludmFsaWREYXRlID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoKSA9PiBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IHJlZmVyZW5jZURhdGUsIE5hTiksICJpbnZhbGlkRGF0ZSIpOwogIGNvbnN0IGRlZmF1bHRPcHRpb25zMiA9IGdldERlZmF1bHRPcHRpb25zMigpOwogIGNvbnN0IGxvY2FsZSA9IG9wdGlvbnM/LmxvY2FsZSA/PyBkZWZhdWx0T3B0aW9uczIubG9jYWxlID8/IGVuVVM7CiAgY29uc3QgZmlyc3RXZWVrQ29udGFpbnNEYXRlID0gb3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/IG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/IGRlZmF1bHRPcHRpb25zMi5maXJzdFdlZWtDb250YWluc0RhdGUgPz8gZGVmYXVsdE9wdGlvbnMyLmxvY2FsZT8ub3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/IDE7CiAgY29uc3Qgd2Vla1N0YXJ0c09uID0gb3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/IG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/IGRlZmF1bHRPcHRpb25zMi53ZWVrU3RhcnRzT24gPz8gZGVmYXVsdE9wdGlvbnMyLmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/IDA7CiAgaWYgKCFmb3JtYXRTdHIpCiAgICByZXR1cm4gZGF0ZVN0ciA/IGludmFsaWREYXRlKCkgOiB0b0RhdGUocmVmZXJlbmNlRGF0ZSwgb3B0aW9ucz8uaW4pOwogIGNvbnN0IHN1YkZuT3B0aW9ucyA9IHsKICAgIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSwKICAgIHdlZWtTdGFydHNPbiwKICAgIGxvY2FsZQogIH07CiAgY29uc3Qgc2V0dGVycyA9IFtuZXcgRGF0ZVRpbWV6b25lU2V0dGVyKG9wdGlvbnM/LmluLCByZWZlcmVuY2VEYXRlKV07CiAgY29uc3QgdG9rZW5zID0gZm9ybWF0U3RyLm1hdGNoKGxvbmdGb3JtYXR0aW5nVG9rZW5zUmVnRXhwMikubWFwKChzdWJzdHJpbmcpID0+IHsKICAgIGNvbnN0IGZpcnN0Q2hhcmFjdGVyID0gc3Vic3RyaW5nWzBdOwogICAgaWYgKGZpcnN0Q2hhcmFjdGVyIGluIGxvbmdGb3JtYXR0ZXJzKSB7CiAgICAgIGNvbnN0IGxvbmdGb3JtYXR0ZXIgPSBsb25nRm9ybWF0dGVyc1tmaXJzdENoYXJhY3Rlcl07CiAgICAgIHJldHVybiBsb25nRm9ybWF0dGVyKHN1YnN0cmluZywgbG9jYWxlLmZvcm1hdExvbmcpOwogICAgfQogICAgcmV0dXJuIHN1YnN0cmluZzsKICB9KS5qb2luKCIiKS5tYXRjaChmb3JtYXR0aW5nVG9rZW5zUmVnRXhwMik7CiAgY29uc3QgdXNlZFRva2VucyA9IFtdOwogIGZvciAobGV0IHRva2VuIG9mIHRva2VucykgewogICAgaWYgKCFvcHRpb25zPy51c2VBZGRpdGlvbmFsV2Vla1llYXJUb2tlbnMgJiYgaXNQcm90ZWN0ZWRXZWVrWWVhclRva2VuKHRva2VuKSkgewogICAgICB3YXJuT3JUaHJvd1Byb3RlY3RlZEVycm9yKHRva2VuLCBmb3JtYXRTdHIsIGRhdGVTdHIpOwogICAgfQogICAgaWYgKCFvcHRpb25zPy51c2VBZGRpdGlvbmFsRGF5T2ZZZWFyVG9rZW5zICYmIGlzUHJvdGVjdGVkRGF5T2ZZZWFyVG9rZW4odG9rZW4pKSB7CiAgICAgIHdhcm5PclRocm93UHJvdGVjdGVkRXJyb3IodG9rZW4sIGZvcm1hdFN0ciwgZGF0ZVN0cik7CiAgICB9CiAgICBjb25zdCBmaXJzdENoYXJhY3RlciA9IHRva2VuWzBdOwogICAgY29uc3QgcGFyc2VyID0gcGFyc2Vyc1tmaXJzdENoYXJhY3Rlcl07CiAgICBpZiAocGFyc2VyKSB7CiAgICAgIGNvbnN0IHsgaW5jb21wYXRpYmxlVG9rZW5zIH0gPSBwYXJzZXI7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KGluY29tcGF0aWJsZVRva2VucykpIHsKICAgICAgICBjb25zdCBpbmNvbXBhdGlibGVUb2tlbiA9IHVzZWRUb2tlbnMuZmluZCgKICAgICAgICAgICh1c2VkVG9rZW4pID0+IGluY29tcGF0aWJsZVRva2Vucy5pbmNsdWRlcyh1c2VkVG9rZW4udG9rZW4pIHx8IHVzZWRUb2tlbi50b2tlbiA9PT0gZmlyc3RDaGFyYWN0ZXIKICAgICAgICApOwogICAgICAgIGlmIChpbmNvbXBhdGlibGVUb2tlbikgewogICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoCiAgICAgICAgICAgIGBUaGUgZm9ybWF0IHN0cmluZyBtdXN0bid0IGNvbnRhaW4gXGAke2luY29tcGF0aWJsZVRva2VuLmZ1bGxUb2tlbn1cYCBhbmQgXGAke3Rva2VufVxgIGF0IHRoZSBzYW1lIHRpbWVgCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChwYXJzZXIuaW5jb21wYXRpYmxlVG9rZW5zID09PSAiKiIgJiYgdXNlZFRva2Vucy5sZW5ndGggPiAwKSB7CiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoCiAgICAgICAgICBgVGhlIGZvcm1hdCBzdHJpbmcgbXVzdG4ndCBjb250YWluIFxgJHt0b2tlbn1cYCBhbmQgYW55IG90aGVyIHRva2VuIGF0IHRoZSBzYW1lIHRpbWVgCiAgICAgICAgKTsKICAgICAgfQogICAgICB1c2VkVG9rZW5zLnB1c2goeyB0b2tlbjogZmlyc3RDaGFyYWN0ZXIsIGZ1bGxUb2tlbjogdG9rZW4gfSk7CiAgICAgIGNvbnN0IHBhcnNlUmVzdWx0ID0gcGFyc2VyLnJ1bigKICAgICAgICBkYXRlU3RyLAogICAgICAgIHRva2VuLAogICAgICAgIGxvY2FsZS5tYXRjaCwKICAgICAgICBzdWJGbk9wdGlvbnMKICAgICAgKTsKICAgICAgaWYgKCFwYXJzZVJlc3VsdCkgewogICAgICAgIHJldHVybiBpbnZhbGlkRGF0ZSgpOwogICAgICB9CiAgICAgIHNldHRlcnMucHVzaChwYXJzZVJlc3VsdC5zZXR0ZXIpOwogICAgICBkYXRlU3RyID0gcGFyc2VSZXN1bHQucmVzdDsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChmaXJzdENoYXJhY3Rlci5tYXRjaCh1bmVzY2FwZWRMYXRpbkNoYXJhY3RlclJlZ0V4cDIpKSB7CiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoCiAgICAgICAgICAiRm9ybWF0IHN0cmluZyBjb250YWlucyBhbiB1bmVzY2FwZWQgbGF0aW4gYWxwaGFiZXQgY2hhcmFjdGVyIGAiICsgZmlyc3RDaGFyYWN0ZXIgKyAiYCIKICAgICAgICApOwogICAgICB9CiAgICAgIGlmICh0b2tlbiA9PT0gIicnIikgewogICAgICAgIHRva2VuID0gIiciOwogICAgICB9IGVsc2UgaWYgKGZpcnN0Q2hhcmFjdGVyID09PSAiJyIpIHsKICAgICAgICB0b2tlbiA9IGNsZWFuRXNjYXBlZFN0cmluZzIodG9rZW4pOwogICAgICB9CiAgICAgIGlmIChkYXRlU3RyLmluZGV4T2YodG9rZW4pID09PSAwKSB7CiAgICAgICAgZGF0ZVN0ciA9IGRhdGVTdHIuc2xpY2UodG9rZW4ubGVuZ3RoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gaW52YWxpZERhdGUoKTsKICAgICAgfQogICAgfQogIH0KICBpZiAoZGF0ZVN0ci5sZW5ndGggPiAwICYmIG5vdFdoaXRlc3BhY2VSZWdFeHAudGVzdChkYXRlU3RyKSkgewogICAgcmV0dXJuIGludmFsaWREYXRlKCk7CiAgfQogIGNvbnN0IHVuaXF1ZVByaW9yaXR5U2V0dGVycyA9IHNldHRlcnMubWFwKChzZXR0ZXIpID0+IHNldHRlci5wcmlvcml0eSkuc29ydCgoYTQsIGI0KSA9PiBiNCAtIGE0KS5maWx0ZXIoKHByaW9yaXR5LCBpbmRleDIsIGFycmF5KSA9PiBhcnJheS5pbmRleE9mKHByaW9yaXR5KSA9PT0gaW5kZXgyKS5tYXAoCiAgICAocHJpb3JpdHkpID0+IHNldHRlcnMuZmlsdGVyKChzZXR0ZXIpID0+IHNldHRlci5wcmlvcml0eSA9PT0gcHJpb3JpdHkpLnNvcnQoKGE0LCBiNCkgPT4gYjQuc3ViUHJpb3JpdHkgLSBhNC5zdWJQcmlvcml0eSkKICApLm1hcCgoc2V0dGVyQXJyYXkpID0+IHNldHRlckFycmF5WzBdKTsKICBsZXQgZGF0ZSA9IHRvRGF0ZShyZWZlcmVuY2VEYXRlLCBvcHRpb25zPy5pbik7CiAgaWYgKGlzTmFOKCtkYXRlKSkgcmV0dXJuIGludmFsaWREYXRlKCk7CiAgY29uc3QgZmxhZ3MgPSB7fTsKICBmb3IgKGNvbnN0IHNldHRlciBvZiB1bmlxdWVQcmlvcml0eVNldHRlcnMpIHsKICAgIGlmICghc2V0dGVyLnZhbGlkYXRlKGRhdGUsIHN1YkZuT3B0aW9ucykpIHsKICAgICAgcmV0dXJuIGludmFsaWREYXRlKCk7CiAgICB9CiAgICBjb25zdCByZXN1bHQgPSBzZXR0ZXIuc2V0KGRhdGUsIGZsYWdzLCBzdWJGbk9wdGlvbnMpOwogICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkgewogICAgICBkYXRlID0gcmVzdWx0WzBdOwogICAgICBPYmplY3QuYXNzaWduKGZsYWdzLCByZXN1bHRbMV0pOwogICAgfSBlbHNlIHsKICAgICAgZGF0ZSA9IHJlc3VsdDsKICAgIH0KICB9CiAgcmV0dXJuIGRhdGU7Cn0KX19uYW1lKHBhcnNlLCAicGFyc2UiKTsKZnVuY3Rpb24gY2xlYW5Fc2NhcGVkU3RyaW5nMihpbnB1dCkgewogIHJldHVybiBpbnB1dC5tYXRjaChlc2NhcGVkU3RyaW5nUmVnRXhwMilbMV0ucmVwbGFjZShkb3VibGVRdW90ZVJlZ0V4cDIsICInIik7Cn0KX19uYW1lKGNsZWFuRXNjYXBlZFN0cmluZzIsICJjbGVhbkVzY2FwZWRTdHJpbmciKTsKdmFyIHBhcnNlX2RlZmF1bHQgPSBwYXJzZTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNNYXRjaC5qcwpmdW5jdGlvbiBpc01hdGNoMihkYXRlU3RyLCBmb3JtYXRTdHIsIG9wdGlvbnMpIHsKICByZXR1cm4gaXNWYWxpZChwYXJzZShkYXRlU3RyLCBmb3JtYXRTdHIsIC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpLCBvcHRpb25zKSk7Cn0KX19uYW1lKGlzTWF0Y2gyLCAiaXNNYXRjaCIpOwp2YXIgaXNNYXRjaF9kZWZhdWx0ID0gaXNNYXRjaDI7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzTW9uZGF5LmpzCmZ1bmN0aW9uIGlzTW9uZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKS5nZXREYXkoKSA9PT0gMTsKfQpfX25hbWUoaXNNb25kYXksICJpc01vbmRheSIpOwp2YXIgaXNNb25kYXlfZGVmYXVsdCA9IGlzTW9uZGF5OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1Bhc3QuanMKZnVuY3Rpb24gaXNQYXN0KGRhdGUpIHsKICByZXR1cm4gK3RvRGF0ZShkYXRlKSA8IERhdGUubm93KCk7Cn0KX19uYW1lKGlzUGFzdCwgImlzUGFzdCIpOwp2YXIgaXNQYXN0X2RlZmF1bHQgPSBpc1Bhc3Q7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZIb3VyLmpzCmZ1bmN0aW9uIHN0YXJ0T2ZIb3VyKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgX2RhdGUuc2V0TWludXRlcygwLCAwLCAwKTsKICByZXR1cm4gX2RhdGU7Cn0KX19uYW1lKHN0YXJ0T2ZIb3VyLCAic3RhcnRPZkhvdXIiKTsKdmFyIHN0YXJ0T2ZIb3VyX2RlZmF1bHQgPSBzdGFydE9mSG91cjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNTYW1lSG91ci5qcwpmdW5jdGlvbiBpc1NhbWVIb3VyKGRhdGVMZWZ0LCBkYXRlUmlnaHQsIG9wdGlvbnMpIHsKICBjb25zdCBbZGF0ZUxlZnRfLCBkYXRlUmlnaHRfXSA9IG5vcm1hbGl6ZURhdGVzKAogICAgb3B0aW9ucz8uaW4sCiAgICBkYXRlTGVmdCwKICAgIGRhdGVSaWdodAogICk7CiAgcmV0dXJuICtzdGFydE9mSG91cihkYXRlTGVmdF8pID09PSArc3RhcnRPZkhvdXIoZGF0ZVJpZ2h0Xyk7Cn0KX19uYW1lKGlzU2FtZUhvdXIsICJpc1NhbWVIb3VyIik7CnZhciBpc1NhbWVIb3VyX2RlZmF1bHQgPSBpc1NhbWVIb3VyOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1NhbWVXZWVrLmpzCmZ1bmN0aW9uIGlzU2FtZVdlZWsobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IFtsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV9dID0gbm9ybWFsaXplRGF0ZXMoCiAgICBvcHRpb25zPy5pbiwKICAgIGxhdGVyRGF0ZSwKICAgIGVhcmxpZXJEYXRlCiAgKTsKICByZXR1cm4gK3N0YXJ0T2ZXZWVrKGxhdGVyRGF0ZV8sIG9wdGlvbnMpID09PSArc3RhcnRPZldlZWsoZWFybGllckRhdGVfLCBvcHRpb25zKTsKfQpfX25hbWUoaXNTYW1lV2VlaywgImlzU2FtZVdlZWsiKTsKdmFyIGlzU2FtZVdlZWtfZGVmYXVsdCA9IGlzU2FtZVdlZWs7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzU2FtZUlTT1dlZWsuanMKZnVuY3Rpb24gaXNTYW1lSVNPV2VlayhsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIGlzU2FtZVdlZWsobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgeyAuLi5vcHRpb25zLCB3ZWVrU3RhcnRzT246IDEgfSk7Cn0KX19uYW1lKGlzU2FtZUlTT1dlZWssICJpc1NhbWVJU09XZWVrIik7CnZhciBpc1NhbWVJU09XZWVrX2RlZmF1bHQgPSBpc1NhbWVJU09XZWVrOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1NhbWVJU09XZWVrWWVhci5qcwpmdW5jdGlvbiBpc1NhbWVJU09XZWVrWWVhcihsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgW2xhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgbGF0ZXJEYXRlLAogICAgZWFybGllckRhdGUKICApOwogIHJldHVybiArc3RhcnRPZklTT1dlZWtZZWFyKGxhdGVyRGF0ZV8pID09PSArc3RhcnRPZklTT1dlZWtZZWFyKGVhcmxpZXJEYXRlXyk7Cn0KX19uYW1lKGlzU2FtZUlTT1dlZWtZZWFyLCAiaXNTYW1lSVNPV2Vla1llYXIiKTsKdmFyIGlzU2FtZUlTT1dlZWtZZWFyX2RlZmF1bHQgPSBpc1NhbWVJU09XZWVrWWVhcjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZk1pbnV0ZS5qcwpmdW5jdGlvbiBzdGFydE9mTWludXRlKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBkYXRlXyA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgZGF0ZV8uc2V0U2Vjb25kcygwLCAwKTsKICByZXR1cm4gZGF0ZV87Cn0KX19uYW1lKHN0YXJ0T2ZNaW51dGUsICJzdGFydE9mTWludXRlIik7CnZhciBzdGFydE9mTWludXRlX2RlZmF1bHQgPSBzdGFydE9mTWludXRlOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1NhbWVNaW51dGUuanMKZnVuY3Rpb24gaXNTYW1lTWludXRlKGxhdGVyRGF0ZSwgZWFybGllckRhdGUpIHsKICByZXR1cm4gK3N0YXJ0T2ZNaW51dGUobGF0ZXJEYXRlKSA9PT0gK3N0YXJ0T2ZNaW51dGUoZWFybGllckRhdGUpOwp9Cl9fbmFtZShpc1NhbWVNaW51dGUsICJpc1NhbWVNaW51dGUiKTsKdmFyIGlzU2FtZU1pbnV0ZV9kZWZhdWx0ID0gaXNTYW1lTWludXRlOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1NhbWVNb250aC5qcwpmdW5jdGlvbiBpc1NhbWVNb250aChsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgW2xhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgbGF0ZXJEYXRlLAogICAgZWFybGllckRhdGUKICApOwogIHJldHVybiBsYXRlckRhdGVfLmdldEZ1bGxZZWFyKCkgPT09IGVhcmxpZXJEYXRlXy5nZXRGdWxsWWVhcigpICYmIGxhdGVyRGF0ZV8uZ2V0TW9udGgoKSA9PT0gZWFybGllckRhdGVfLmdldE1vbnRoKCk7Cn0KX19uYW1lKGlzU2FtZU1vbnRoLCAiaXNTYW1lTW9udGgiKTsKdmFyIGlzU2FtZU1vbnRoX2RlZmF1bHQgPSBpc1NhbWVNb250aDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNTYW1lUXVhcnRlci5qcwpmdW5jdGlvbiBpc1NhbWVRdWFydGVyKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBbZGF0ZUxlZnRfLCBkYXRlUmlnaHRfXSA9IG5vcm1hbGl6ZURhdGVzKAogICAgb3B0aW9ucz8uaW4sCiAgICBsYXRlckRhdGUsCiAgICBlYXJsaWVyRGF0ZQogICk7CiAgcmV0dXJuICtzdGFydE9mUXVhcnRlcihkYXRlTGVmdF8pID09PSArc3RhcnRPZlF1YXJ0ZXIoZGF0ZVJpZ2h0Xyk7Cn0KX19uYW1lKGlzU2FtZVF1YXJ0ZXIsICJpc1NhbWVRdWFydGVyIik7CnZhciBpc1NhbWVRdWFydGVyX2RlZmF1bHQgPSBpc1NhbWVRdWFydGVyOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mU2Vjb25kLmpzCmZ1bmN0aW9uIHN0YXJ0T2ZTZWNvbmQoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IGRhdGVfID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBkYXRlXy5zZXRNaWxsaXNlY29uZHMoMCk7CiAgcmV0dXJuIGRhdGVfOwp9Cl9fbmFtZShzdGFydE9mU2Vjb25kLCAic3RhcnRPZlNlY29uZCIpOwp2YXIgc3RhcnRPZlNlY29uZF9kZWZhdWx0ID0gc3RhcnRPZlNlY29uZDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNTYW1lU2Vjb25kLmpzCmZ1bmN0aW9uIGlzU2FtZVNlY29uZChsYXRlckRhdGUsIGVhcmxpZXJEYXRlKSB7CiAgcmV0dXJuICtzdGFydE9mU2Vjb25kKGxhdGVyRGF0ZSkgPT09ICtzdGFydE9mU2Vjb25kKGVhcmxpZXJEYXRlKTsKfQpfX25hbWUoaXNTYW1lU2Vjb25kLCAiaXNTYW1lU2Vjb25kIik7CnZhciBpc1NhbWVTZWNvbmRfZGVmYXVsdCA9IGlzU2FtZVNlY29uZDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNTYW1lWWVhci5qcwpmdW5jdGlvbiBpc1NhbWVZZWFyKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBbbGF0ZXJEYXRlXywgZWFybGllckRhdGVfXSA9IG5vcm1hbGl6ZURhdGVzKAogICAgb3B0aW9ucz8uaW4sCiAgICBsYXRlckRhdGUsCiAgICBlYXJsaWVyRGF0ZQogICk7CiAgcmV0dXJuIGxhdGVyRGF0ZV8uZ2V0RnVsbFllYXIoKSA9PT0gZWFybGllckRhdGVfLmdldEZ1bGxZZWFyKCk7Cn0KX19uYW1lKGlzU2FtZVllYXIsICJpc1NhbWVZZWFyIik7CnZhciBpc1NhbWVZZWFyX2RlZmF1bHQgPSBpc1NhbWVZZWFyOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1RoaXNIb3VyLmpzCmZ1bmN0aW9uIGlzVGhpc0hvdXIoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiBpc1NhbWVIb3VyKAogICAgdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKSwKICAgIGNvbnN0cnVjdE5vdyhvcHRpb25zPy5pbiB8fCBkYXRlKQogICk7Cn0KX19uYW1lKGlzVGhpc0hvdXIsICJpc1RoaXNIb3VyIik7CnZhciBpc1RoaXNIb3VyX2RlZmF1bHQgPSBpc1RoaXNIb3VyOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1RoaXNJU09XZWVrLmpzCmZ1bmN0aW9uIGlzVGhpc0lTT1dlZWsoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiBpc1NhbWVJU09XZWVrKAogICAgY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCBkYXRlKSwKICAgIGNvbnN0cnVjdE5vdyhvcHRpb25zPy5pbiB8fCBkYXRlKQogICk7Cn0KX19uYW1lKGlzVGhpc0lTT1dlZWssICJpc1RoaXNJU09XZWVrIik7CnZhciBpc1RoaXNJU09XZWVrX2RlZmF1bHQgPSBpc1RoaXNJU09XZWVrOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1RoaXNNaW51dGUuanMKZnVuY3Rpb24gaXNUaGlzTWludXRlKGRhdGUpIHsKICByZXR1cm4gaXNTYW1lTWludXRlKGRhdGUsIGNvbnN0cnVjdE5vdyhkYXRlKSk7Cn0KX19uYW1lKGlzVGhpc01pbnV0ZSwgImlzVGhpc01pbnV0ZSIpOwp2YXIgaXNUaGlzTWludXRlX2RlZmF1bHQgPSBpc1RoaXNNaW51dGU7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzVGhpc01vbnRoLmpzCmZ1bmN0aW9uIGlzVGhpc01vbnRoKGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gaXNTYW1lTW9udGgoCiAgICBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIGRhdGUpLAogICAgY29uc3RydWN0Tm93KG9wdGlvbnM/LmluIHx8IGRhdGUpCiAgKTsKfQpfX25hbWUoaXNUaGlzTW9udGgsICJpc1RoaXNNb250aCIpOwp2YXIgaXNUaGlzTW9udGhfZGVmYXVsdCA9IGlzVGhpc01vbnRoOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1RoaXNRdWFydGVyLmpzCmZ1bmN0aW9uIGlzVGhpc1F1YXJ0ZXIoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiBpc1NhbWVRdWFydGVyKAogICAgY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCBkYXRlKSwKICAgIGNvbnN0cnVjdE5vdyhvcHRpb25zPy5pbiB8fCBkYXRlKQogICk7Cn0KX19uYW1lKGlzVGhpc1F1YXJ0ZXIsICJpc1RoaXNRdWFydGVyIik7CnZhciBpc1RoaXNRdWFydGVyX2RlZmF1bHQgPSBpc1RoaXNRdWFydGVyOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1RoaXNTZWNvbmQuanMKZnVuY3Rpb24gaXNUaGlzU2Vjb25kKGRhdGUpIHsKICByZXR1cm4gaXNTYW1lU2Vjb25kKGRhdGUsIGNvbnN0cnVjdE5vdyhkYXRlKSk7Cn0KX19uYW1lKGlzVGhpc1NlY29uZCwgImlzVGhpc1NlY29uZCIpOwp2YXIgaXNUaGlzU2Vjb25kX2RlZmF1bHQgPSBpc1RoaXNTZWNvbmQ7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzVGhpc1dlZWsuanMKZnVuY3Rpb24gaXNUaGlzV2VlayhkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIGlzU2FtZVdlZWsoCiAgICBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIGRhdGUpLAogICAgY29uc3RydWN0Tm93KG9wdGlvbnM/LmluIHx8IGRhdGUpLAogICAgb3B0aW9ucwogICk7Cn0KX19uYW1lKGlzVGhpc1dlZWssICJpc1RoaXNXZWVrIik7CnZhciBpc1RoaXNXZWVrX2RlZmF1bHQgPSBpc1RoaXNXZWVrOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1RoaXNZZWFyLmpzCmZ1bmN0aW9uIGlzVGhpc1llYXIoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiBpc1NhbWVZZWFyKAogICAgY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCBkYXRlKSwKICAgIGNvbnN0cnVjdE5vdyhvcHRpb25zPy5pbiB8fCBkYXRlKQogICk7Cn0KX19uYW1lKGlzVGhpc1llYXIsICJpc1RoaXNZZWFyIik7CnZhciBpc1RoaXNZZWFyX2RlZmF1bHQgPSBpc1RoaXNZZWFyOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1RodXJzZGF5LmpzCmZ1bmN0aW9uIGlzVGh1cnNkYXkoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pLmdldERheSgpID09PSA0Owp9Cl9fbmFtZShpc1RodXJzZGF5LCAiaXNUaHVyc2RheSIpOwp2YXIgaXNUaHVyc2RheV9kZWZhdWx0ID0gaXNUaHVyc2RheTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNUb2RheS5qcwpmdW5jdGlvbiBpc1RvZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gaXNTYW1lRGF5KAogICAgY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCBkYXRlKSwKICAgIGNvbnN0cnVjdE5vdyhvcHRpb25zPy5pbiB8fCBkYXRlKQogICk7Cn0KX19uYW1lKGlzVG9kYXksICJpc1RvZGF5Iik7CnZhciBpc1RvZGF5X2RlZmF1bHQgPSBpc1RvZGF5OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1RvbW9ycm93LmpzCmZ1bmN0aW9uIGlzVG9tb3Jyb3coZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiBpc1NhbWVEYXkoCiAgICBkYXRlLAogICAgYWRkRGF5cyhjb25zdHJ1Y3ROb3cob3B0aW9ucz8uaW4gfHwgZGF0ZSksIDEpLAogICAgb3B0aW9ucwogICk7Cn0KX19uYW1lKGlzVG9tb3Jyb3csICJpc1RvbW9ycm93Iik7CnZhciBpc1RvbW9ycm93X2RlZmF1bHQgPSBpc1RvbW9ycm93OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1R1ZXNkYXkuanMKZnVuY3Rpb24gaXNUdWVzZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKS5nZXREYXkoKSA9PT0gMjsKfQpfX25hbWUoaXNUdWVzZGF5LCAiaXNUdWVzZGF5Iik7CnZhciBpc1R1ZXNkYXlfZGVmYXVsdCA9IGlzVHVlc2RheTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNXZWRuZXNkYXkuanMKZnVuY3Rpb24gaXNXZWRuZXNkYXkoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pLmdldERheSgpID09PSAzOwp9Cl9fbmFtZShpc1dlZG5lc2RheSwgImlzV2VkbmVzZGF5Iik7CnZhciBpc1dlZG5lc2RheV9kZWZhdWx0ID0gaXNXZWRuZXNkYXk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzV2l0aGluSW50ZXJ2YWwuanMKZnVuY3Rpb24gaXNXaXRoaW5JbnRlcnZhbChkYXRlLCBpbnRlcnZhbDMsIG9wdGlvbnMpIHsKICBjb25zdCB0aW1lID0gK3RvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgW3N0YXJ0VGltZSwgZW5kVGltZV0gPSBbCiAgICArdG9EYXRlKGludGVydmFsMy5zdGFydCwgb3B0aW9ucz8uaW4pLAogICAgK3RvRGF0ZShpbnRlcnZhbDMuZW5kLCBvcHRpb25zPy5pbikKICBdLnNvcnQoKGE0LCBiNCkgPT4gYTQgLSBiNCk7CiAgcmV0dXJuIHRpbWUgPj0gc3RhcnRUaW1lICYmIHRpbWUgPD0gZW5kVGltZTsKfQpfX25hbWUoaXNXaXRoaW5JbnRlcnZhbCwgImlzV2l0aGluSW50ZXJ2YWwiKTsKdmFyIGlzV2l0aGluSW50ZXJ2YWxfZGVmYXVsdCA9IGlzV2l0aGluSW50ZXJ2YWw7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N1YkRheXMuanMKZnVuY3Rpb24gc3ViRGF5cyhkYXRlLCBhbW91bnQsIG9wdGlvbnMpIHsKICByZXR1cm4gYWRkRGF5cyhkYXRlLCAtYW1vdW50LCBvcHRpb25zKTsKfQpfX25hbWUoc3ViRGF5cywgInN1YkRheXMiKTsKdmFyIHN1YkRheXNfZGVmYXVsdCA9IHN1YkRheXM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzWWVzdGVyZGF5LmpzCmZ1bmN0aW9uIGlzWWVzdGVyZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gaXNTYW1lRGF5KAogICAgY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCBkYXRlKSwKICAgIHN1YkRheXMoY29uc3RydWN0Tm93KG9wdGlvbnM/LmluIHx8IGRhdGUpLCAxKQogICk7Cn0KX19uYW1lKGlzWWVzdGVyZGF5LCAiaXNZZXN0ZXJkYXkiKTsKdmFyIGlzWWVzdGVyZGF5X2RlZmF1bHQgPSBpc1llc3RlcmRheTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbGFzdERheU9mRGVjYWRlLmpzCmZ1bmN0aW9uIGxhc3REYXlPZkRlY2FkZShkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGNvbnN0IHllYXIgPSBfZGF0ZS5nZXRGdWxsWWVhcigpOwogIGNvbnN0IGRlY2FkZSA9IDkgKyBNYXRoLmZsb29yKHllYXIgLyAxMCkgKiAxMDsKICBfZGF0ZS5zZXRGdWxsWWVhcihkZWNhZGUgKyAxLCAwLCAwKTsKICBfZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICByZXR1cm4gdG9EYXRlKF9kYXRlLCBvcHRpb25zPy5pbik7Cn0KX19uYW1lKGxhc3REYXlPZkRlY2FkZSwgImxhc3REYXlPZkRlY2FkZSIpOwp2YXIgbGFzdERheU9mRGVjYWRlX2RlZmF1bHQgPSBsYXN0RGF5T2ZEZWNhZGU7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xhc3REYXlPZldlZWsuanMKZnVuY3Rpb24gbGFzdERheU9mV2VlayhkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgZGVmYXVsdE9wdGlvbnMyID0gZ2V0RGVmYXVsdE9wdGlvbnMoKTsKICBjb25zdCB3ZWVrU3RhcnRzT24gPSBvcHRpb25zPy53ZWVrU3RhcnRzT24gPz8gb3B0aW9ucz8ubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz8gZGVmYXVsdE9wdGlvbnMyLndlZWtTdGFydHNPbiA/PyBkZWZhdWx0T3B0aW9uczIubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz8gMDsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgZGF5ID0gX2RhdGUuZ2V0RGF5KCk7CiAgY29uc3QgZGlmZiA9IChkYXkgPCB3ZWVrU3RhcnRzT24gPyAtNyA6IDApICsgNiAtIChkYXkgLSB3ZWVrU3RhcnRzT24pOwogIF9kYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogIF9kYXRlLnNldERhdGUoX2RhdGUuZ2V0RGF0ZSgpICsgZGlmZik7CiAgcmV0dXJuIF9kYXRlOwp9Cl9fbmFtZShsYXN0RGF5T2ZXZWVrLCAibGFzdERheU9mV2VlayIpOwp2YXIgbGFzdERheU9mV2Vla19kZWZhdWx0ID0gbGFzdERheU9mV2VlazsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbGFzdERheU9mSVNPV2Vlay5qcwpmdW5jdGlvbiBsYXN0RGF5T2ZJU09XZWVrKGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gbGFzdERheU9mV2VlayhkYXRlLCB7IC4uLm9wdGlvbnMsIHdlZWtTdGFydHNPbjogMSB9KTsKfQpfX25hbWUobGFzdERheU9mSVNPV2VlaywgImxhc3REYXlPZklTT1dlZWsiKTsKdmFyIGxhc3REYXlPZklTT1dlZWtfZGVmYXVsdCA9IGxhc3REYXlPZklTT1dlZWs7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xhc3REYXlPZklTT1dlZWtZZWFyLmpzCmZ1bmN0aW9uIGxhc3REYXlPZklTT1dlZWtZZWFyKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCB5ZWFyID0gZ2V0SVNPV2Vla1llYXIoZGF0ZSwgb3B0aW9ucyk7CiAgY29uc3QgZm91cnRoT2ZKYW51YXJ5ID0gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCAwKTsKICBmb3VydGhPZkphbnVhcnkuc2V0RnVsbFllYXIoeWVhciArIDEsIDAsIDQpOwogIGZvdXJ0aE9mSmFudWFyeS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICBjb25zdCBkYXRlXyA9IHN0YXJ0T2ZJU09XZWVrKGZvdXJ0aE9mSmFudWFyeSwgb3B0aW9ucyk7CiAgZGF0ZV8uc2V0RGF0ZShkYXRlXy5nZXREYXRlKCkgLSAxKTsKICByZXR1cm4gZGF0ZV87Cn0KX19uYW1lKGxhc3REYXlPZklTT1dlZWtZZWFyLCAibGFzdERheU9mSVNPV2Vla1llYXIiKTsKdmFyIGxhc3REYXlPZklTT1dlZWtZZWFyX2RlZmF1bHQgPSBsYXN0RGF5T2ZJU09XZWVrWWVhcjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbGFzdERheU9mUXVhcnRlci5qcwpmdW5jdGlvbiBsYXN0RGF5T2ZRdWFydGVyKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBkYXRlXyA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgY3VycmVudE1vbnRoID0gZGF0ZV8uZ2V0TW9udGgoKTsKICBjb25zdCBtb250aCA9IGN1cnJlbnRNb250aCAtIGN1cnJlbnRNb250aCAlIDMgKyAzOwogIGRhdGVfLnNldE1vbnRoKG1vbnRoLCAwKTsKICBkYXRlXy5zZXRIb3VycygwLCAwLCAwLCAwKTsKICByZXR1cm4gZGF0ZV87Cn0KX19uYW1lKGxhc3REYXlPZlF1YXJ0ZXIsICJsYXN0RGF5T2ZRdWFydGVyIik7CnZhciBsYXN0RGF5T2ZRdWFydGVyX2RlZmF1bHQgPSBsYXN0RGF5T2ZRdWFydGVyOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sYXN0RGF5T2ZZZWFyLmpzCmZ1bmN0aW9uIGxhc3REYXlPZlllYXIoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IGRhdGVfID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCB5ZWFyID0gZGF0ZV8uZ2V0RnVsbFllYXIoKTsKICBkYXRlXy5zZXRGdWxsWWVhcih5ZWFyICsgMSwgMCwgMCk7CiAgZGF0ZV8uc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgcmV0dXJuIGRhdGVfOwp9Cl9fbmFtZShsYXN0RGF5T2ZZZWFyLCAibGFzdERheU9mWWVhciIpOwp2YXIgbGFzdERheU9mWWVhcl9kZWZhdWx0ID0gbGFzdERheU9mWWVhcjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbGlnaHRGb3JtYXQuanMKdmFyIGZvcm1hdHRpbmdUb2tlbnNSZWdFeHAzID0gLyhcdylcMSp8Jyd8JygnJ3xbXiddKSsoJ3wkKXwuL2c7CnZhciBlc2NhcGVkU3RyaW5nUmVnRXhwMyA9IC9eJyhbXl0qPyknPyQvOwp2YXIgZG91YmxlUXVvdGVSZWdFeHAzID0gLycnL2c7CnZhciB1bmVzY2FwZWRMYXRpbkNoYXJhY3RlclJlZ0V4cDMgPSAvW2EtekEtWl0vOwpmdW5jdGlvbiBsaWdodEZvcm1hdChkYXRlLCBmb3JtYXRTdHIpIHsKICBjb25zdCBkYXRlXyA9IHRvRGF0ZShkYXRlKTsKICBpZiAoIWlzVmFsaWQoZGF0ZV8pKSB7CiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0aW1lIHZhbHVlIik7CiAgfQogIGNvbnN0IHRva2VucyA9IGZvcm1hdFN0ci5tYXRjaChmb3JtYXR0aW5nVG9rZW5zUmVnRXhwMyk7CiAgaWYgKCF0b2tlbnMpIHJldHVybiAiIjsKICBjb25zdCByZXN1bHQgPSB0b2tlbnMubWFwKChzdWJzdHJpbmcpID0+IHsKICAgIGlmIChzdWJzdHJpbmcgPT09ICInJyIpIHsKICAgICAgcmV0dXJuICInIjsKICAgIH0KICAgIGNvbnN0IGZpcnN0Q2hhcmFjdGVyID0gc3Vic3RyaW5nWzBdOwogICAgaWYgKGZpcnN0Q2hhcmFjdGVyID09PSAiJyIpIHsKICAgICAgcmV0dXJuIGNsZWFuRXNjYXBlZFN0cmluZzMoc3Vic3RyaW5nKTsKICAgIH0KICAgIGNvbnN0IGZvcm1hdHRlcjIgPSBsaWdodEZvcm1hdHRlcnNbZmlyc3RDaGFyYWN0ZXJdOwogICAgaWYgKGZvcm1hdHRlcjIpIHsKICAgICAgcmV0dXJuIGZvcm1hdHRlcjIoZGF0ZV8sIHN1YnN0cmluZyk7CiAgICB9CiAgICBpZiAoZmlyc3RDaGFyYWN0ZXIubWF0Y2godW5lc2NhcGVkTGF0aW5DaGFyYWN0ZXJSZWdFeHAzKSkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigKICAgICAgICAiRm9ybWF0IHN0cmluZyBjb250YWlucyBhbiB1bmVzY2FwZWQgbGF0aW4gYWxwaGFiZXQgY2hhcmFjdGVyIGAiICsgZmlyc3RDaGFyYWN0ZXIgKyAiYCIKICAgICAgKTsKICAgIH0KICAgIHJldHVybiBzdWJzdHJpbmc7CiAgfSkuam9pbigiIik7CiAgcmV0dXJuIHJlc3VsdDsKfQpfX25hbWUobGlnaHRGb3JtYXQsICJsaWdodEZvcm1hdCIpOwpmdW5jdGlvbiBjbGVhbkVzY2FwZWRTdHJpbmczKGlucHV0KSB7CiAgY29uc3QgbWF0Y2hlcyA9IGlucHV0Lm1hdGNoKGVzY2FwZWRTdHJpbmdSZWdFeHAzKTsKICBpZiAoIW1hdGNoZXMpIHJldHVybiBpbnB1dDsKICByZXR1cm4gbWF0Y2hlc1sxXS5yZXBsYWNlKGRvdWJsZVF1b3RlUmVnRXhwMywgIiciKTsKfQpfX25hbWUoY2xlYW5Fc2NhcGVkU3RyaW5nMywgImNsZWFuRXNjYXBlZFN0cmluZyIpOwp2YXIgbGlnaHRGb3JtYXRfZGVmYXVsdCA9IGxpZ2h0Rm9ybWF0OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9taWxsaXNlY29uZHMuanMKZnVuY3Rpb24gbWlsbGlzZWNvbmRzKHsKICB5ZWFycywKICBtb250aHM6IG1vbnRoczIsCiAgd2Vla3MsCiAgZGF5czogZGF5czIsCiAgaG91cnMsCiAgbWludXRlcywKICBzZWNvbmRzCn0pIHsKICBsZXQgdG90YWxEYXlzID0gMDsKICBpZiAoeWVhcnMpIHRvdGFsRGF5cyArPSB5ZWFycyAqIGRheXNJblllYXI7CiAgaWYgKG1vbnRoczIpIHRvdGFsRGF5cyArPSBtb250aHMyICogKGRheXNJblllYXIgLyAxMik7CiAgaWYgKHdlZWtzKSB0b3RhbERheXMgKz0gd2Vla3MgKiA3OwogIGlmIChkYXlzMikgdG90YWxEYXlzICs9IGRheXMyOwogIGxldCB0b3RhbFNlY29uZHMgPSB0b3RhbERheXMgKiAyNCAqIDYwICogNjA7CiAgaWYgKGhvdXJzKSB0b3RhbFNlY29uZHMgKz0gaG91cnMgKiA2MCAqIDYwOwogIGlmIChtaW51dGVzKSB0b3RhbFNlY29uZHMgKz0gbWludXRlcyAqIDYwOwogIGlmIChzZWNvbmRzKSB0b3RhbFNlY29uZHMgKz0gc2Vjb25kczsKICByZXR1cm4gTWF0aC50cnVuYyh0b3RhbFNlY29uZHMgKiAxZTMpOwp9Cl9fbmFtZShtaWxsaXNlY29uZHMsICJtaWxsaXNlY29uZHMiKTsKdmFyIG1pbGxpc2Vjb25kc19kZWZhdWx0ID0gbWlsbGlzZWNvbmRzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9taWxsaXNlY29uZHNUb0hvdXJzLmpzCmZ1bmN0aW9uIG1pbGxpc2Vjb25kc1RvSG91cnMobWlsbGlzZWNvbmRzMikgewogIGNvbnN0IGhvdXJzID0gbWlsbGlzZWNvbmRzMiAvIG1pbGxpc2Vjb25kc0luSG91cjsKICByZXR1cm4gTWF0aC50cnVuYyhob3Vycyk7Cn0KX19uYW1lKG1pbGxpc2Vjb25kc1RvSG91cnMsICJtaWxsaXNlY29uZHNUb0hvdXJzIik7CnZhciBtaWxsaXNlY29uZHNUb0hvdXJzX2RlZmF1bHQgPSBtaWxsaXNlY29uZHNUb0hvdXJzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9taWxsaXNlY29uZHNUb01pbnV0ZXMuanMKZnVuY3Rpb24gbWlsbGlzZWNvbmRzVG9NaW51dGVzKG1pbGxpc2Vjb25kczIpIHsKICBjb25zdCBtaW51dGVzID0gbWlsbGlzZWNvbmRzMiAvIG1pbGxpc2Vjb25kc0luTWludXRlOwogIHJldHVybiBNYXRoLnRydW5jKG1pbnV0ZXMpOwp9Cl9fbmFtZShtaWxsaXNlY29uZHNUb01pbnV0ZXMsICJtaWxsaXNlY29uZHNUb01pbnV0ZXMiKTsKdmFyIG1pbGxpc2Vjb25kc1RvTWludXRlc19kZWZhdWx0ID0gbWlsbGlzZWNvbmRzVG9NaW51dGVzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9taWxsaXNlY29uZHNUb1NlY29uZHMuanMKZnVuY3Rpb24gbWlsbGlzZWNvbmRzVG9TZWNvbmRzKG1pbGxpc2Vjb25kczIpIHsKICBjb25zdCBzZWNvbmRzID0gbWlsbGlzZWNvbmRzMiAvIG1pbGxpc2Vjb25kc0luU2Vjb25kOwogIHJldHVybiBNYXRoLnRydW5jKHNlY29uZHMpOwp9Cl9fbmFtZShtaWxsaXNlY29uZHNUb1NlY29uZHMsICJtaWxsaXNlY29uZHNUb1NlY29uZHMiKTsKdmFyIG1pbGxpc2Vjb25kc1RvU2Vjb25kc19kZWZhdWx0ID0gbWlsbGlzZWNvbmRzVG9TZWNvbmRzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9taW51dGVzVG9Ib3Vycy5qcwpmdW5jdGlvbiBtaW51dGVzVG9Ib3VycyhtaW51dGVzKSB7CiAgY29uc3QgaG91cnMgPSBtaW51dGVzIC8gbWludXRlc0luSG91cjsKICByZXR1cm4gTWF0aC50cnVuYyhob3Vycyk7Cn0KX19uYW1lKG1pbnV0ZXNUb0hvdXJzLCAibWludXRlc1RvSG91cnMiKTsKdmFyIG1pbnV0ZXNUb0hvdXJzX2RlZmF1bHQgPSBtaW51dGVzVG9Ib3VyczsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbWludXRlc1RvTWlsbGlzZWNvbmRzLmpzCmZ1bmN0aW9uIG1pbnV0ZXNUb01pbGxpc2Vjb25kcyhtaW51dGVzKSB7CiAgcmV0dXJuIE1hdGgudHJ1bmMobWludXRlcyAqIG1pbGxpc2Vjb25kc0luTWludXRlKTsKfQpfX25hbWUobWludXRlc1RvTWlsbGlzZWNvbmRzLCAibWludXRlc1RvTWlsbGlzZWNvbmRzIik7CnZhciBtaW51dGVzVG9NaWxsaXNlY29uZHNfZGVmYXVsdCA9IG1pbnV0ZXNUb01pbGxpc2Vjb25kczsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbWludXRlc1RvU2Vjb25kcy5qcwpmdW5jdGlvbiBtaW51dGVzVG9TZWNvbmRzKG1pbnV0ZXMpIHsKICByZXR1cm4gTWF0aC50cnVuYyhtaW51dGVzICogc2Vjb25kc0luTWludXRlKTsKfQpfX25hbWUobWludXRlc1RvU2Vjb25kcywgIm1pbnV0ZXNUb1NlY29uZHMiKTsKdmFyIG1pbnV0ZXNUb1NlY29uZHNfZGVmYXVsdCA9IG1pbnV0ZXNUb1NlY29uZHM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL21vbnRoc1RvUXVhcnRlcnMuanMKZnVuY3Rpb24gbW9udGhzVG9RdWFydGVycyhtb250aHMyKSB7CiAgY29uc3QgcXVhcnRlcnMgPSBtb250aHMyIC8gbW9udGhzSW5RdWFydGVyOwogIHJldHVybiBNYXRoLnRydW5jKHF1YXJ0ZXJzKTsKfQpfX25hbWUobW9udGhzVG9RdWFydGVycywgIm1vbnRoc1RvUXVhcnRlcnMiKTsKdmFyIG1vbnRoc1RvUXVhcnRlcnNfZGVmYXVsdCA9IG1vbnRoc1RvUXVhcnRlcnM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL21vbnRoc1RvWWVhcnMuanMKZnVuY3Rpb24gbW9udGhzVG9ZZWFycyhtb250aHMyKSB7CiAgY29uc3QgeWVhcnMgPSBtb250aHMyIC8gbW9udGhzSW5ZZWFyOwogIHJldHVybiBNYXRoLnRydW5jKHllYXJzKTsKfQpfX25hbWUobW9udGhzVG9ZZWFycywgIm1vbnRoc1RvWWVhcnMiKTsKdmFyIG1vbnRoc1RvWWVhcnNfZGVmYXVsdCA9IG1vbnRoc1RvWWVhcnM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL25leHREYXkuanMKZnVuY3Rpb24gbmV4dERheShkYXRlLCBkYXksIG9wdGlvbnMpIHsKICBsZXQgZGVsdGEgPSBkYXkgLSBnZXREYXkoZGF0ZSwgb3B0aW9ucyk7CiAgaWYgKGRlbHRhIDw9IDApIGRlbHRhICs9IDc7CiAgcmV0dXJuIGFkZERheXMoZGF0ZSwgZGVsdGEsIG9wdGlvbnMpOwp9Cl9fbmFtZShuZXh0RGF5LCAibmV4dERheSIpOwp2YXIgbmV4dERheV9kZWZhdWx0ID0gbmV4dERheTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbmV4dEZyaWRheS5qcwpmdW5jdGlvbiBuZXh0RnJpZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gbmV4dERheShkYXRlLCA1LCBvcHRpb25zKTsKfQpfX25hbWUobmV4dEZyaWRheSwgIm5leHRGcmlkYXkiKTsKdmFyIG5leHRGcmlkYXlfZGVmYXVsdCA9IG5leHRGcmlkYXk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL25leHRNb25kYXkuanMKZnVuY3Rpb24gbmV4dE1vbmRheShkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIG5leHREYXkoZGF0ZSwgMSwgb3B0aW9ucyk7Cn0KX19uYW1lKG5leHRNb25kYXksICJuZXh0TW9uZGF5Iik7CnZhciBuZXh0TW9uZGF5X2RlZmF1bHQgPSBuZXh0TW9uZGF5OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9uZXh0U2F0dXJkYXkuanMKZnVuY3Rpb24gbmV4dFNhdHVyZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gbmV4dERheShkYXRlLCA2LCBvcHRpb25zKTsKfQpfX25hbWUobmV4dFNhdHVyZGF5LCAibmV4dFNhdHVyZGF5Iik7CnZhciBuZXh0U2F0dXJkYXlfZGVmYXVsdCA9IG5leHRTYXR1cmRheTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbmV4dFN1bmRheS5qcwpmdW5jdGlvbiBuZXh0U3VuZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gbmV4dERheShkYXRlLCAwLCBvcHRpb25zKTsKfQpfX25hbWUobmV4dFN1bmRheSwgIm5leHRTdW5kYXkiKTsKdmFyIG5leHRTdW5kYXlfZGVmYXVsdCA9IG5leHRTdW5kYXk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL25leHRUaHVyc2RheS5qcwpmdW5jdGlvbiBuZXh0VGh1cnNkYXkoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiBuZXh0RGF5KGRhdGUsIDQsIG9wdGlvbnMpOwp9Cl9fbmFtZShuZXh0VGh1cnNkYXksICJuZXh0VGh1cnNkYXkiKTsKdmFyIG5leHRUaHVyc2RheV9kZWZhdWx0ID0gbmV4dFRodXJzZGF5OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9uZXh0VHVlc2RheS5qcwpmdW5jdGlvbiBuZXh0VHVlc2RheShkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIG5leHREYXkoZGF0ZSwgMiwgb3B0aW9ucyk7Cn0KX19uYW1lKG5leHRUdWVzZGF5LCAibmV4dFR1ZXNkYXkiKTsKdmFyIG5leHRUdWVzZGF5X2RlZmF1bHQgPSBuZXh0VHVlc2RheTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbmV4dFdlZG5lc2RheS5qcwpmdW5jdGlvbiBuZXh0V2VkbmVzZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gbmV4dERheShkYXRlLCAzLCBvcHRpb25zKTsKfQpfX25hbWUobmV4dFdlZG5lc2RheSwgIm5leHRXZWRuZXNkYXkiKTsKdmFyIG5leHRXZWRuZXNkYXlfZGVmYXVsdCA9IG5leHRXZWRuZXNkYXk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlSVNPLmpzCmZ1bmN0aW9uIHBhcnNlSVNPKGFyZ3VtZW50LCBvcHRpb25zKSB7CiAgY29uc3QgaW52YWxpZERhdGUgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCgpID0+IGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4sIE5hTiksICJpbnZhbGlkRGF0ZSIpOwogIGNvbnN0IGFkZGl0aW9uYWxEaWdpdHMgPSBvcHRpb25zPy5hZGRpdGlvbmFsRGlnaXRzID8/IDI7CiAgY29uc3QgZGF0ZVN0cmluZ3MgPSBzcGxpdERhdGVTdHJpbmcoYXJndW1lbnQpOwogIGxldCBkYXRlOwogIGlmIChkYXRlU3RyaW5ncy5kYXRlKSB7CiAgICBjb25zdCBwYXJzZVllYXJSZXN1bHQgPSBwYXJzZVllYXIoZGF0ZVN0cmluZ3MuZGF0ZSwgYWRkaXRpb25hbERpZ2l0cyk7CiAgICBkYXRlID0gcGFyc2VEYXRlKHBhcnNlWWVhclJlc3VsdC5yZXN0RGF0ZVN0cmluZywgcGFyc2VZZWFyUmVzdWx0LnllYXIpOwogIH0KICBpZiAoIWRhdGUgfHwgaXNOYU4oK2RhdGUpKSByZXR1cm4gaW52YWxpZERhdGUoKTsKICBjb25zdCB0aW1lc3RhbXAyID0gK2RhdGU7CiAgbGV0IHRpbWUgPSAwOwogIGxldCBvZmZzZXQ7CiAgaWYgKGRhdGVTdHJpbmdzLnRpbWUpIHsKICAgIHRpbWUgPSBwYXJzZVRpbWUoZGF0ZVN0cmluZ3MudGltZSk7CiAgICBpZiAoaXNOYU4odGltZSkpIHJldHVybiBpbnZhbGlkRGF0ZSgpOwogIH0KICBpZiAoZGF0ZVN0cmluZ3MudGltZXpvbmUpIHsKICAgIG9mZnNldCA9IHBhcnNlVGltZXpvbmUoZGF0ZVN0cmluZ3MudGltZXpvbmUpOwogICAgaWYgKGlzTmFOKG9mZnNldCkpIHJldHVybiBpbnZhbGlkRGF0ZSgpOwogIH0gZWxzZSB7CiAgICBjb25zdCB0bXBEYXRlID0gbmV3IERhdGUodGltZXN0YW1wMiArIHRpbWUpOwogICAgY29uc3QgcmVzdWx0ID0gdG9EYXRlKDAsIG9wdGlvbnM/LmluKTsKICAgIHJlc3VsdC5zZXRGdWxsWWVhcigKICAgICAgdG1wRGF0ZS5nZXRVVENGdWxsWWVhcigpLAogICAgICB0bXBEYXRlLmdldFVUQ01vbnRoKCksCiAgICAgIHRtcERhdGUuZ2V0VVRDRGF0ZSgpCiAgICApOwogICAgcmVzdWx0LnNldEhvdXJzKAogICAgICB0bXBEYXRlLmdldFVUQ0hvdXJzKCksCiAgICAgIHRtcERhdGUuZ2V0VVRDTWludXRlcygpLAogICAgICB0bXBEYXRlLmdldFVUQ1NlY29uZHMoKSwKICAgICAgdG1wRGF0ZS5nZXRVVENNaWxsaXNlY29uZHMoKQogICAgKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQogIHJldHVybiB0b0RhdGUodGltZXN0YW1wMiArIHRpbWUgKyBvZmZzZXQsIG9wdGlvbnM/LmluKTsKfQpfX25hbWUocGFyc2VJU08sICJwYXJzZUlTTyIpOwp2YXIgcGF0dGVybnMgPSB7CiAgZGF0ZVRpbWVEZWxpbWl0ZXI6IC9bVCBdLywKICB0aW1lWm9uZURlbGltaXRlcjogL1taIF0vaSwKICB0aW1lem9uZTogLyhbWistXS4qKSQvCn07CnZhciBkYXRlUmVnZXggPSAvXi0/KD86KFxkezN9KXwoXGR7Mn0pKD86LT8oXGR7Mn0pKT98VyhcZHsyfSkoPzotPyhcZHsxfSkpP3wpJC87CnZhciB0aW1lUmVnZXggPSAvXihcZHsyfSg/OlsuLF1cZCopPykoPzo6PyhcZHsyfSg/OlsuLF1cZCopPykpPyg/Ojo/KFxkezJ9KD86Wy4sXVxkKik/KSk/JC87CnZhciB0aW1lem9uZVJlZ2V4ID0gL14oWystXSkoXGR7Mn0pKD86Oj8oXGR7Mn0pKT8kLzsKZnVuY3Rpb24gc3BsaXREYXRlU3RyaW5nKGRhdGVTdHJpbmcpIHsKICBjb25zdCBkYXRlU3RyaW5ncyA9IHt9OwogIGNvbnN0IGFycmF5ID0gZGF0ZVN0cmluZy5zcGxpdChwYXR0ZXJucy5kYXRlVGltZURlbGltaXRlcik7CiAgbGV0IHRpbWVTdHJpbmc7CiAgaWYgKGFycmF5Lmxlbmd0aCA+IDIpIHsKICAgIHJldHVybiBkYXRlU3RyaW5nczsKICB9CiAgaWYgKC86Ly50ZXN0KGFycmF5WzBdKSkgewogICAgdGltZVN0cmluZyA9IGFycmF5WzBdOwogIH0gZWxzZSB7CiAgICBkYXRlU3RyaW5ncy5kYXRlID0gYXJyYXlbMF07CiAgICB0aW1lU3RyaW5nID0gYXJyYXlbMV07CiAgICBpZiAocGF0dGVybnMudGltZVpvbmVEZWxpbWl0ZXIudGVzdChkYXRlU3RyaW5ncy5kYXRlKSkgewogICAgICBkYXRlU3RyaW5ncy5kYXRlID0gZGF0ZVN0cmluZy5zcGxpdChwYXR0ZXJucy50aW1lWm9uZURlbGltaXRlcilbMF07CiAgICAgIHRpbWVTdHJpbmcgPSBkYXRlU3RyaW5nLnN1YnN0cigKICAgICAgICBkYXRlU3RyaW5ncy5kYXRlLmxlbmd0aCwKICAgICAgICBkYXRlU3RyaW5nLmxlbmd0aAogICAgICApOwogICAgfQogIH0KICBpZiAodGltZVN0cmluZykgewogICAgY29uc3QgdG9rZW4gPSBwYXR0ZXJucy50aW1lem9uZS5leGVjKHRpbWVTdHJpbmcpOwogICAgaWYgKHRva2VuKSB7CiAgICAgIGRhdGVTdHJpbmdzLnRpbWUgPSB0aW1lU3RyaW5nLnJlcGxhY2UodG9rZW5bMV0sICIiKTsKICAgICAgZGF0ZVN0cmluZ3MudGltZXpvbmUgPSB0b2tlblsxXTsKICAgIH0gZWxzZSB7CiAgICAgIGRhdGVTdHJpbmdzLnRpbWUgPSB0aW1lU3RyaW5nOwogICAgfQogIH0KICByZXR1cm4gZGF0ZVN0cmluZ3M7Cn0KX19uYW1lKHNwbGl0RGF0ZVN0cmluZywgInNwbGl0RGF0ZVN0cmluZyIpOwpmdW5jdGlvbiBwYXJzZVllYXIoZGF0ZVN0cmluZywgYWRkaXRpb25hbERpZ2l0cykgewogIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cCgKICAgICJeKD86KFxcZHs0fXxbKy1dXFxkeyIgKyAoNCArIGFkZGl0aW9uYWxEaWdpdHMpICsgIn0pfChcXGR7Mn18WystXVxcZHsiICsgKDIgKyBhZGRpdGlvbmFsRGlnaXRzKSArICJ9KSQpIgogICk7CiAgY29uc3QgY2FwdHVyZXMgPSBkYXRlU3RyaW5nLm1hdGNoKHJlZ2V4KTsKICBpZiAoIWNhcHR1cmVzKSByZXR1cm4geyB5ZWFyOiBOYU4sIHJlc3REYXRlU3RyaW5nOiAiIiB9OwogIGNvbnN0IHllYXIgPSBjYXB0dXJlc1sxXSA/IHBhcnNlSW50KGNhcHR1cmVzWzFdKSA6IG51bGw7CiAgY29uc3QgY2VudHVyeSA9IGNhcHR1cmVzWzJdID8gcGFyc2VJbnQoY2FwdHVyZXNbMl0pIDogbnVsbDsKICByZXR1cm4gewogICAgeWVhcjogY2VudHVyeSA9PT0gbnVsbCA/IHllYXIgOiBjZW50dXJ5ICogMTAwLAogICAgcmVzdERhdGVTdHJpbmc6IGRhdGVTdHJpbmcuc2xpY2UoKGNhcHR1cmVzWzFdIHx8IGNhcHR1cmVzWzJdKS5sZW5ndGgpCiAgfTsKfQpfX25hbWUocGFyc2VZZWFyLCAicGFyc2VZZWFyIik7CmZ1bmN0aW9uIHBhcnNlRGF0ZShkYXRlU3RyaW5nLCB5ZWFyKSB7CiAgaWYgKHllYXIgPT09IG51bGwpIHJldHVybiAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoTmFOKTsKICBjb25zdCBjYXB0dXJlcyA9IGRhdGVTdHJpbmcubWF0Y2goZGF0ZVJlZ2V4KTsKICBpZiAoIWNhcHR1cmVzKSByZXR1cm4gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKE5hTik7CiAgY29uc3QgaXNXZWVrRGF0ZSA9ICEhY2FwdHVyZXNbNF07CiAgY29uc3QgZGF5T2ZZZWFyID0gcGFyc2VEYXRlVW5pdChjYXB0dXJlc1sxXSk7CiAgY29uc3QgbW9udGggPSBwYXJzZURhdGVVbml0KGNhcHR1cmVzWzJdKSAtIDE7CiAgY29uc3QgZGF5ID0gcGFyc2VEYXRlVW5pdChjYXB0dXJlc1szXSk7CiAgY29uc3Qgd2VlayA9IHBhcnNlRGF0ZVVuaXQoY2FwdHVyZXNbNF0pOwogIGNvbnN0IGRheU9mV2VlayA9IHBhcnNlRGF0ZVVuaXQoY2FwdHVyZXNbNV0pIC0gMTsKICBpZiAoaXNXZWVrRGF0ZSkgewogICAgaWYgKCF2YWxpZGF0ZVdlZWtEYXRlKHllYXIsIHdlZWssIGRheU9mV2VlaykpIHsKICAgICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZShOYU4pOwogICAgfQogICAgcmV0dXJuIGRheU9mSVNPV2Vla1llYXIoeWVhciwgd2VlaywgZGF5T2ZXZWVrKTsKICB9IGVsc2UgewogICAgY29uc3QgZGF0ZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgwKTsKICAgIGlmICghdmFsaWRhdGVEYXRlKHllYXIsIG1vbnRoLCBkYXkpIHx8ICF2YWxpZGF0ZURheU9mWWVhckRhdGUoeWVhciwgZGF5T2ZZZWFyKSkgewogICAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKE5hTik7CiAgICB9CiAgICBkYXRlLnNldFVUQ0Z1bGxZZWFyKHllYXIsIG1vbnRoLCBNYXRoLm1heChkYXlPZlllYXIsIGRheSkpOwogICAgcmV0dXJuIGRhdGU7CiAgfQp9Cl9fbmFtZShwYXJzZURhdGUsICJwYXJzZURhdGUiKTsKZnVuY3Rpb24gcGFyc2VEYXRlVW5pdCh2YWx1ZTIpIHsKICByZXR1cm4gdmFsdWUyID8gcGFyc2VJbnQodmFsdWUyKSA6IDE7Cn0KX19uYW1lKHBhcnNlRGF0ZVVuaXQsICJwYXJzZURhdGVVbml0Iik7CmZ1bmN0aW9uIHBhcnNlVGltZSh0aW1lU3RyaW5nKSB7CiAgY29uc3QgY2FwdHVyZXMgPSB0aW1lU3RyaW5nLm1hdGNoKHRpbWVSZWdleCk7CiAgaWYgKCFjYXB0dXJlcykgcmV0dXJuIE5hTjsKICBjb25zdCBob3VycyA9IHBhcnNlVGltZVVuaXQoY2FwdHVyZXNbMV0pOwogIGNvbnN0IG1pbnV0ZXMgPSBwYXJzZVRpbWVVbml0KGNhcHR1cmVzWzJdKTsKICBjb25zdCBzZWNvbmRzID0gcGFyc2VUaW1lVW5pdChjYXB0dXJlc1szXSk7CiAgaWYgKCF2YWxpZGF0ZVRpbWUoaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMpKSB7CiAgICByZXR1cm4gTmFOOwogIH0KICByZXR1cm4gaG91cnMgKiBtaWxsaXNlY29uZHNJbkhvdXIgKyBtaW51dGVzICogbWlsbGlzZWNvbmRzSW5NaW51dGUgKyBzZWNvbmRzICogMWUzOwp9Cl9fbmFtZShwYXJzZVRpbWUsICJwYXJzZVRpbWUiKTsKZnVuY3Rpb24gcGFyc2VUaW1lVW5pdCh2YWx1ZTIpIHsKICByZXR1cm4gdmFsdWUyICYmIHBhcnNlRmxvYXQodmFsdWUyLnJlcGxhY2UoIiwiLCAiLiIpKSB8fCAwOwp9Cl9fbmFtZShwYXJzZVRpbWVVbml0LCAicGFyc2VUaW1lVW5pdCIpOwpmdW5jdGlvbiBwYXJzZVRpbWV6b25lKHRpbWV6b25lU3RyaW5nKSB7CiAgaWYgKHRpbWV6b25lU3RyaW5nID09PSAiWiIpIHJldHVybiAwOwogIGNvbnN0IGNhcHR1cmVzID0gdGltZXpvbmVTdHJpbmcubWF0Y2godGltZXpvbmVSZWdleCk7CiAgaWYgKCFjYXB0dXJlcykgcmV0dXJuIDA7CiAgY29uc3Qgc2lnbiA9IGNhcHR1cmVzWzFdID09PSAiKyIgPyAtMSA6IDE7CiAgY29uc3QgaG91cnMgPSBwYXJzZUludChjYXB0dXJlc1syXSk7CiAgY29uc3QgbWludXRlcyA9IGNhcHR1cmVzWzNdICYmIHBhcnNlSW50KGNhcHR1cmVzWzNdKSB8fCAwOwogIGlmICghdmFsaWRhdGVUaW1lem9uZShob3VycywgbWludXRlcykpIHsKICAgIHJldHVybiBOYU47CiAgfQogIHJldHVybiBzaWduICogKGhvdXJzICogbWlsbGlzZWNvbmRzSW5Ib3VyICsgbWludXRlcyAqIG1pbGxpc2Vjb25kc0luTWludXRlKTsKfQpfX25hbWUocGFyc2VUaW1lem9uZSwgInBhcnNlVGltZXpvbmUiKTsKZnVuY3Rpb24gZGF5T2ZJU09XZWVrWWVhcihpc29XZWVrWWVhciwgd2VlaywgZGF5KSB7CiAgY29uc3QgZGF0ZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgwKTsKICBkYXRlLnNldFVUQ0Z1bGxZZWFyKGlzb1dlZWtZZWFyLCAwLCA0KTsKICBjb25zdCBmb3VydGhPZkphbnVhcnlEYXkgPSBkYXRlLmdldFVUQ0RheSgpIHx8IDc7CiAgY29uc3QgZGlmZiA9ICh3ZWVrIC0gMSkgKiA3ICsgZGF5ICsgMSAtIGZvdXJ0aE9mSmFudWFyeURheTsKICBkYXRlLnNldFVUQ0RhdGUoZGF0ZS5nZXRVVENEYXRlKCkgKyBkaWZmKTsKICByZXR1cm4gZGF0ZTsKfQpfX25hbWUoZGF5T2ZJU09XZWVrWWVhciwgImRheU9mSVNPV2Vla1llYXIiKTsKdmFyIGRheXNJbk1vbnRocyA9IFszMSwgbnVsbCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdOwpmdW5jdGlvbiBpc0xlYXBZZWFySW5kZXgyKHllYXIpIHsKICByZXR1cm4geWVhciAlIDQwMCA9PT0gMCB8fCB5ZWFyICUgNCA9PT0gMCAmJiB5ZWFyICUgMTAwICE9PSAwOwp9Cl9fbmFtZShpc0xlYXBZZWFySW5kZXgyLCAiaXNMZWFwWWVhckluZGV4Iik7CmZ1bmN0aW9uIHZhbGlkYXRlRGF0ZSh5ZWFyLCBtb250aCwgZGF0ZSkgewogIHJldHVybiBtb250aCA+PSAwICYmIG1vbnRoIDw9IDExICYmIGRhdGUgPj0gMSAmJiBkYXRlIDw9IChkYXlzSW5Nb250aHNbbW9udGhdIHx8IChpc0xlYXBZZWFySW5kZXgyKHllYXIpID8gMjkgOiAyOCkpOwp9Cl9fbmFtZSh2YWxpZGF0ZURhdGUsICJ2YWxpZGF0ZURhdGUiKTsKZnVuY3Rpb24gdmFsaWRhdGVEYXlPZlllYXJEYXRlKHllYXIsIGRheU9mWWVhcikgewogIHJldHVybiBkYXlPZlllYXIgPj0gMSAmJiBkYXlPZlllYXIgPD0gKGlzTGVhcFllYXJJbmRleDIoeWVhcikgPyAzNjYgOiAzNjUpOwp9Cl9fbmFtZSh2YWxpZGF0ZURheU9mWWVhckRhdGUsICJ2YWxpZGF0ZURheU9mWWVhckRhdGUiKTsKZnVuY3Rpb24gdmFsaWRhdGVXZWVrRGF0ZShfeWVhciwgd2VlaywgZGF5KSB7CiAgcmV0dXJuIHdlZWsgPj0gMSAmJiB3ZWVrIDw9IDUzICYmIGRheSA+PSAwICYmIGRheSA8PSA2Owp9Cl9fbmFtZSh2YWxpZGF0ZVdlZWtEYXRlLCAidmFsaWRhdGVXZWVrRGF0ZSIpOwpmdW5jdGlvbiB2YWxpZGF0ZVRpbWUoaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMpIHsKICBpZiAoaG91cnMgPT09IDI0KSB7CiAgICByZXR1cm4gbWludXRlcyA9PT0gMCAmJiBzZWNvbmRzID09PSAwOwogIH0KICByZXR1cm4gc2Vjb25kcyA+PSAwICYmIHNlY29uZHMgPCA2MCAmJiBtaW51dGVzID49IDAgJiYgbWludXRlcyA8IDYwICYmIGhvdXJzID49IDAgJiYgaG91cnMgPCAyNTsKfQpfX25hbWUodmFsaWRhdGVUaW1lLCAidmFsaWRhdGVUaW1lIik7CmZ1bmN0aW9uIHZhbGlkYXRlVGltZXpvbmUoX2hvdXJzLCBtaW51dGVzKSB7CiAgcmV0dXJuIG1pbnV0ZXMgPj0gMCAmJiBtaW51dGVzIDw9IDU5Owp9Cl9fbmFtZSh2YWxpZGF0ZVRpbWV6b25lLCAidmFsaWRhdGVUaW1lem9uZSIpOwp2YXIgcGFyc2VJU09fZGVmYXVsdCA9IHBhcnNlSVNPOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZUpTT04uanMKZnVuY3Rpb24gcGFyc2VKU09OKGRhdGVTdHIsIG9wdGlvbnMpIHsKICBjb25zdCBwYXJ0cyA9IGRhdGVTdHIubWF0Y2goCiAgICAvKFxkezR9KS0oXGR7Mn0pLShcZHsyfSlbVCBdKFxkezJ9KTooXGR7Mn0pOihcZHsyfSkoPzpcLihcZHswLDd9KSk/KD86WnwoLikoXGR7Mn0pOj8oXGR7Mn0pPyk/LwogICk7CiAgaWYgKCFwYXJ0cykgcmV0dXJuIHRvRGF0ZShOYU4sIG9wdGlvbnM/LmluKTsKICByZXR1cm4gdG9EYXRlKAogICAgRGF0ZS5VVEMoCiAgICAgICtwYXJ0c1sxXSwKICAgICAgK3BhcnRzWzJdIC0gMSwKICAgICAgK3BhcnRzWzNdLAogICAgICArcGFydHNbNF0gLSAoK3BhcnRzWzldIHx8IDApICogKHBhcnRzWzhdID09ICItIiA/IC0xIDogMSksCiAgICAgICtwYXJ0c1s1XSAtICgrcGFydHNbMTBdIHx8IDApICogKHBhcnRzWzhdID09ICItIiA/IC0xIDogMSksCiAgICAgICtwYXJ0c1s2XSwKICAgICAgKygocGFydHNbN10gfHwgIjAiKSArICIwMCIpLnN1YnN0cmluZygwLCAzKQogICAgKSwKICAgIG9wdGlvbnM/LmluCiAgKTsKfQpfX25hbWUocGFyc2VKU09OLCAicGFyc2VKU09OIik7CnZhciBwYXJzZUpTT05fZGVmYXVsdCA9IHBhcnNlSlNPTjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcHJldmlvdXNEYXkuanMKZnVuY3Rpb24gcHJldmlvdXNEYXkoZGF0ZSwgZGF5LCBvcHRpb25zKSB7CiAgbGV0IGRlbHRhID0gZ2V0RGF5KGRhdGUsIG9wdGlvbnMpIC0gZGF5OwogIGlmIChkZWx0YSA8PSAwKSBkZWx0YSArPSA3OwogIHJldHVybiBzdWJEYXlzKGRhdGUsIGRlbHRhLCBvcHRpb25zKTsKfQpfX25hbWUocHJldmlvdXNEYXksICJwcmV2aW91c0RheSIpOwp2YXIgcHJldmlvdXNEYXlfZGVmYXVsdCA9IHByZXZpb3VzRGF5OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wcmV2aW91c0ZyaWRheS5qcwpmdW5jdGlvbiBwcmV2aW91c0ZyaWRheShkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIHByZXZpb3VzRGF5KGRhdGUsIDUsIG9wdGlvbnMpOwp9Cl9fbmFtZShwcmV2aW91c0ZyaWRheSwgInByZXZpb3VzRnJpZGF5Iik7CnZhciBwcmV2aW91c0ZyaWRheV9kZWZhdWx0ID0gcHJldmlvdXNGcmlkYXk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3ByZXZpb3VzTW9uZGF5LmpzCmZ1bmN0aW9uIHByZXZpb3VzTW9uZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gcHJldmlvdXNEYXkoZGF0ZSwgMSwgb3B0aW9ucyk7Cn0KX19uYW1lKHByZXZpb3VzTW9uZGF5LCAicHJldmlvdXNNb25kYXkiKTsKdmFyIHByZXZpb3VzTW9uZGF5X2RlZmF1bHQgPSBwcmV2aW91c01vbmRheTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcHJldmlvdXNTYXR1cmRheS5qcwpmdW5jdGlvbiBwcmV2aW91c1NhdHVyZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gcHJldmlvdXNEYXkoZGF0ZSwgNiwgb3B0aW9ucyk7Cn0KX19uYW1lKHByZXZpb3VzU2F0dXJkYXksICJwcmV2aW91c1NhdHVyZGF5Iik7CnZhciBwcmV2aW91c1NhdHVyZGF5X2RlZmF1bHQgPSBwcmV2aW91c1NhdHVyZGF5OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wcmV2aW91c1N1bmRheS5qcwpmdW5jdGlvbiBwcmV2aW91c1N1bmRheShkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIHByZXZpb3VzRGF5KGRhdGUsIDAsIG9wdGlvbnMpOwp9Cl9fbmFtZShwcmV2aW91c1N1bmRheSwgInByZXZpb3VzU3VuZGF5Iik7CnZhciBwcmV2aW91c1N1bmRheV9kZWZhdWx0ID0gcHJldmlvdXNTdW5kYXk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3ByZXZpb3VzVGh1cnNkYXkuanMKZnVuY3Rpb24gcHJldmlvdXNUaHVyc2RheShkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIHByZXZpb3VzRGF5KGRhdGUsIDQsIG9wdGlvbnMpOwp9Cl9fbmFtZShwcmV2aW91c1RodXJzZGF5LCAicHJldmlvdXNUaHVyc2RheSIpOwp2YXIgcHJldmlvdXNUaHVyc2RheV9kZWZhdWx0ID0gcHJldmlvdXNUaHVyc2RheTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcHJldmlvdXNUdWVzZGF5LmpzCmZ1bmN0aW9uIHByZXZpb3VzVHVlc2RheShkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIHByZXZpb3VzRGF5KGRhdGUsIDIsIG9wdGlvbnMpOwp9Cl9fbmFtZShwcmV2aW91c1R1ZXNkYXksICJwcmV2aW91c1R1ZXNkYXkiKTsKdmFyIHByZXZpb3VzVHVlc2RheV9kZWZhdWx0ID0gcHJldmlvdXNUdWVzZGF5OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wcmV2aW91c1dlZG5lc2RheS5qcwpmdW5jdGlvbiBwcmV2aW91c1dlZG5lc2RheShkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIHByZXZpb3VzRGF5KGRhdGUsIDMsIG9wdGlvbnMpOwp9Cl9fbmFtZShwcmV2aW91c1dlZG5lc2RheSwgInByZXZpb3VzV2VkbmVzZGF5Iik7CnZhciBwcmV2aW91c1dlZG5lc2RheV9kZWZhdWx0ID0gcHJldmlvdXNXZWRuZXNkYXk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3F1YXJ0ZXJzVG9Nb250aHMuanMKZnVuY3Rpb24gcXVhcnRlcnNUb01vbnRocyhxdWFydGVycykgewogIHJldHVybiBNYXRoLnRydW5jKHF1YXJ0ZXJzICogbW9udGhzSW5RdWFydGVyKTsKfQpfX25hbWUocXVhcnRlcnNUb01vbnRocywgInF1YXJ0ZXJzVG9Nb250aHMiKTsKdmFyIHF1YXJ0ZXJzVG9Nb250aHNfZGVmYXVsdCA9IHF1YXJ0ZXJzVG9Nb250aHM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3F1YXJ0ZXJzVG9ZZWFycy5qcwpmdW5jdGlvbiBxdWFydGVyc1RvWWVhcnMocXVhcnRlcnMpIHsKICBjb25zdCB5ZWFycyA9IHF1YXJ0ZXJzIC8gcXVhcnRlcnNJblllYXI7CiAgcmV0dXJuIE1hdGgudHJ1bmMoeWVhcnMpOwp9Cl9fbmFtZShxdWFydGVyc1RvWWVhcnMsICJxdWFydGVyc1RvWWVhcnMiKTsKdmFyIHF1YXJ0ZXJzVG9ZZWFyc19kZWZhdWx0ID0gcXVhcnRlcnNUb1llYXJzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9yb3VuZFRvTmVhcmVzdEhvdXJzLmpzCmZ1bmN0aW9uIHJvdW5kVG9OZWFyZXN0SG91cnMoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IG5lYXJlc3RUbyA9IG9wdGlvbnM/Lm5lYXJlc3RUbyA/PyAxOwogIGlmIChuZWFyZXN0VG8gPCAxIHx8IG5lYXJlc3RUbyA+IDEyKQogICAgcmV0dXJuIGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4gfHwgZGF0ZSwgTmFOKTsKICBjb25zdCBkYXRlXyA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgZnJhY3Rpb25hbE1pbnV0ZXMgPSBkYXRlXy5nZXRNaW51dGVzKCkgLyA2MDsKICBjb25zdCBmcmFjdGlvbmFsU2Vjb25kcyA9IGRhdGVfLmdldFNlY29uZHMoKSAvIDYwIC8gNjA7CiAgY29uc3QgZnJhY3Rpb25hbE1pbGxpc2Vjb25kcyA9IGRhdGVfLmdldE1pbGxpc2Vjb25kcygpIC8gMWUzIC8gNjAgLyA2MDsKICBjb25zdCBob3VycyA9IGRhdGVfLmdldEhvdXJzKCkgKyBmcmFjdGlvbmFsTWludXRlcyArIGZyYWN0aW9uYWxTZWNvbmRzICsgZnJhY3Rpb25hbE1pbGxpc2Vjb25kczsKICBjb25zdCBtZXRob2QgPSBvcHRpb25zPy5yb3VuZGluZ01ldGhvZCA/PyAicm91bmQiOwogIGNvbnN0IHJvdW5kaW5nTWV0aG9kID0gZ2V0Um91bmRpbmdNZXRob2QobWV0aG9kKTsKICBjb25zdCByb3VuZGVkSG91cnMgPSByb3VuZGluZ01ldGhvZChob3VycyAvIG5lYXJlc3RUbykgKiBuZWFyZXN0VG87CiAgZGF0ZV8uc2V0SG91cnMocm91bmRlZEhvdXJzLCAwLCAwLCAwKTsKICByZXR1cm4gZGF0ZV87Cn0KX19uYW1lKHJvdW5kVG9OZWFyZXN0SG91cnMsICJyb3VuZFRvTmVhcmVzdEhvdXJzIik7CnZhciByb3VuZFRvTmVhcmVzdEhvdXJzX2RlZmF1bHQgPSByb3VuZFRvTmVhcmVzdEhvdXJzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9yb3VuZFRvTmVhcmVzdE1pbnV0ZXMuanMKZnVuY3Rpb24gcm91bmRUb05lYXJlc3RNaW51dGVzKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBuZWFyZXN0VG8gPSBvcHRpb25zPy5uZWFyZXN0VG8gPz8gMTsKICBpZiAobmVhcmVzdFRvIDwgMSB8fCBuZWFyZXN0VG8gPiAzMCkgcmV0dXJuIGNvbnN0cnVjdEZyb20oZGF0ZSwgTmFOKTsKICBjb25zdCBkYXRlXyA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgZnJhY3Rpb25hbFNlY29uZHMgPSBkYXRlXy5nZXRTZWNvbmRzKCkgLyA2MDsKICBjb25zdCBmcmFjdGlvbmFsTWlsbGlzZWNvbmRzID0gZGF0ZV8uZ2V0TWlsbGlzZWNvbmRzKCkgLyAxZTMgLyA2MDsKICBjb25zdCBtaW51dGVzID0gZGF0ZV8uZ2V0TWludXRlcygpICsgZnJhY3Rpb25hbFNlY29uZHMgKyBmcmFjdGlvbmFsTWlsbGlzZWNvbmRzOwogIGNvbnN0IG1ldGhvZCA9IG9wdGlvbnM/LnJvdW5kaW5nTWV0aG9kID8/ICJyb3VuZCI7CiAgY29uc3Qgcm91bmRpbmdNZXRob2QgPSBnZXRSb3VuZGluZ01ldGhvZChtZXRob2QpOwogIGNvbnN0IHJvdW5kZWRNaW51dGVzID0gcm91bmRpbmdNZXRob2QobWludXRlcyAvIG5lYXJlc3RUbykgKiBuZWFyZXN0VG87CiAgZGF0ZV8uc2V0TWludXRlcyhyb3VuZGVkTWludXRlcywgMCwgMCk7CiAgcmV0dXJuIGRhdGVfOwp9Cl9fbmFtZShyb3VuZFRvTmVhcmVzdE1pbnV0ZXMsICJyb3VuZFRvTmVhcmVzdE1pbnV0ZXMiKTsKdmFyIHJvdW5kVG9OZWFyZXN0TWludXRlc19kZWZhdWx0ID0gcm91bmRUb05lYXJlc3RNaW51dGVzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZWNvbmRzVG9Ib3Vycy5qcwpmdW5jdGlvbiBzZWNvbmRzVG9Ib3VycyhzZWNvbmRzKSB7CiAgY29uc3QgaG91cnMgPSBzZWNvbmRzIC8gc2Vjb25kc0luSG91cjsKICByZXR1cm4gTWF0aC50cnVuYyhob3Vycyk7Cn0KX19uYW1lKHNlY29uZHNUb0hvdXJzLCAic2Vjb25kc1RvSG91cnMiKTsKdmFyIHNlY29uZHNUb0hvdXJzX2RlZmF1bHQgPSBzZWNvbmRzVG9Ib3VyczsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2Vjb25kc1RvTWlsbGlzZWNvbmRzLmpzCmZ1bmN0aW9uIHNlY29uZHNUb01pbGxpc2Vjb25kcyhzZWNvbmRzKSB7CiAgcmV0dXJuIHNlY29uZHMgKiBtaWxsaXNlY29uZHNJblNlY29uZDsKfQpfX25hbWUoc2Vjb25kc1RvTWlsbGlzZWNvbmRzLCAic2Vjb25kc1RvTWlsbGlzZWNvbmRzIik7CnZhciBzZWNvbmRzVG9NaWxsaXNlY29uZHNfZGVmYXVsdCA9IHNlY29uZHNUb01pbGxpc2Vjb25kczsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2Vjb25kc1RvTWludXRlcy5qcwpmdW5jdGlvbiBzZWNvbmRzVG9NaW51dGVzKHNlY29uZHMpIHsKICBjb25zdCBtaW51dGVzID0gc2Vjb25kcyAvIHNlY29uZHNJbk1pbnV0ZTsKICByZXR1cm4gTWF0aC50cnVuYyhtaW51dGVzKTsKfQpfX25hbWUoc2Vjb25kc1RvTWludXRlcywgInNlY29uZHNUb01pbnV0ZXMiKTsKdmFyIHNlY29uZHNUb01pbnV0ZXNfZGVmYXVsdCA9IHNlY29uZHNUb01pbnV0ZXM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldE1vbnRoLmpzCmZ1bmN0aW9uIHNldE1vbnRoKGRhdGUsIG1vbnRoLCBvcHRpb25zKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGNvbnN0IHllYXIgPSBfZGF0ZS5nZXRGdWxsWWVhcigpOwogIGNvbnN0IGRheSA9IF9kYXRlLmdldERhdGUoKTsKICBjb25zdCBtaWRNb250aCA9IGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4gfHwgZGF0ZSwgMCk7CiAgbWlkTW9udGguc2V0RnVsbFllYXIoeWVhciwgbW9udGgsIDE1KTsKICBtaWRNb250aC5zZXRIb3VycygwLCAwLCAwLCAwKTsKICBjb25zdCBkYXlzSW5Nb250aCA9IGdldERheXNJbk1vbnRoKG1pZE1vbnRoKTsKICBfZGF0ZS5zZXRNb250aChtb250aCwgTWF0aC5taW4oZGF5LCBkYXlzSW5Nb250aCkpOwogIHJldHVybiBfZGF0ZTsKfQpfX25hbWUoc2V0TW9udGgsICJzZXRNb250aCIpOwp2YXIgc2V0TW9udGhfZGVmYXVsdCA9IHNldE1vbnRoOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXQuanMKZnVuY3Rpb24gc2V0KGRhdGUsIHZhbHVlcywgb3B0aW9ucykgewogIGxldCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgaWYgKGlzTmFOKCtfZGF0ZSkpIHJldHVybiBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIE5hTik7CiAgaWYgKHZhbHVlcy55ZWFyICE9IG51bGwpIF9kYXRlLnNldEZ1bGxZZWFyKHZhbHVlcy55ZWFyKTsKICBpZiAodmFsdWVzLm1vbnRoICE9IG51bGwpIF9kYXRlID0gc2V0TW9udGgoX2RhdGUsIHZhbHVlcy5tb250aCk7CiAgaWYgKHZhbHVlcy5kYXRlICE9IG51bGwpIF9kYXRlLnNldERhdGUodmFsdWVzLmRhdGUpOwogIGlmICh2YWx1ZXMuaG91cnMgIT0gbnVsbCkgX2RhdGUuc2V0SG91cnModmFsdWVzLmhvdXJzKTsKICBpZiAodmFsdWVzLm1pbnV0ZXMgIT0gbnVsbCkgX2RhdGUuc2V0TWludXRlcyh2YWx1ZXMubWludXRlcyk7CiAgaWYgKHZhbHVlcy5zZWNvbmRzICE9IG51bGwpIF9kYXRlLnNldFNlY29uZHModmFsdWVzLnNlY29uZHMpOwogIGlmICh2YWx1ZXMubWlsbGlzZWNvbmRzICE9IG51bGwpIF9kYXRlLnNldE1pbGxpc2Vjb25kcyh2YWx1ZXMubWlsbGlzZWNvbmRzKTsKICByZXR1cm4gX2RhdGU7Cn0KX19uYW1lKHNldCwgInNldCIpOwp2YXIgc2V0X2RlZmF1bHQgPSBzZXQ7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldERhdGUuanMKZnVuY3Rpb24gc2V0RGF0ZShkYXRlLCBkYXlPZk1vbnRoLCBvcHRpb25zKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIF9kYXRlLnNldERhdGUoZGF5T2ZNb250aCk7CiAgcmV0dXJuIF9kYXRlOwp9Cl9fbmFtZShzZXREYXRlLCAic2V0RGF0ZSIpOwp2YXIgc2V0RGF0ZV9kZWZhdWx0ID0gc2V0RGF0ZTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0RGF5T2ZZZWFyLmpzCmZ1bmN0aW9uIHNldERheU9mWWVhcihkYXRlLCBkYXlPZlllYXIsIG9wdGlvbnMpIHsKICBjb25zdCBkYXRlXyA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgZGF0ZV8uc2V0TW9udGgoMCk7CiAgZGF0ZV8uc2V0RGF0ZShkYXlPZlllYXIpOwogIHJldHVybiBkYXRlXzsKfQpfX25hbWUoc2V0RGF5T2ZZZWFyLCAic2V0RGF5T2ZZZWFyIik7CnZhciBzZXREYXlPZlllYXJfZGVmYXVsdCA9IHNldERheU9mWWVhcjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0RGVmYXVsdE9wdGlvbnMuanMKZnVuY3Rpb24gc2V0RGVmYXVsdE9wdGlvbnMyKG9wdGlvbnMpIHsKICBjb25zdCByZXN1bHQgPSB7fTsKICBjb25zdCBkZWZhdWx0T3B0aW9uczIgPSBnZXREZWZhdWx0T3B0aW9ucygpOwogIGZvciAoY29uc3QgcHJvcGVydHkgaW4gZGVmYXVsdE9wdGlvbnMyKSB7CiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRlZmF1bHRPcHRpb25zMiwgcHJvcGVydHkpKSB7CiAgICAgIHJlc3VsdFtwcm9wZXJ0eV0gPSBkZWZhdWx0T3B0aW9uczJbcHJvcGVydHldOwogICAgfQogIH0KICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIG9wdGlvbnMpIHsKICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucywgcHJvcGVydHkpKSB7CiAgICAgIGlmIChvcHRpb25zW3Byb3BlcnR5XSA9PT0gdm9pZCAwKSB7CiAgICAgICAgZGVsZXRlIHJlc3VsdFtwcm9wZXJ0eV07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzdWx0W3Byb3BlcnR5XSA9IG9wdGlvbnNbcHJvcGVydHldOwogICAgICB9CiAgICB9CiAgfQogIHNldERlZmF1bHRPcHRpb25zKHJlc3VsdCk7Cn0KX19uYW1lKHNldERlZmF1bHRPcHRpb25zMiwgInNldERlZmF1bHRPcHRpb25zIik7CnZhciBzZXREZWZhdWx0T3B0aW9uc19kZWZhdWx0ID0gc2V0RGVmYXVsdE9wdGlvbnMyOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRIb3Vycy5qcwpmdW5jdGlvbiBzZXRIb3VycyhkYXRlLCBob3Vycywgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBfZGF0ZS5zZXRIb3Vycyhob3Vycyk7CiAgcmV0dXJuIF9kYXRlOwp9Cl9fbmFtZShzZXRIb3VycywgInNldEhvdXJzIik7CnZhciBzZXRIb3Vyc19kZWZhdWx0ID0gc2V0SG91cnM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldE1pbGxpc2Vjb25kcy5qcwpmdW5jdGlvbiBzZXRNaWxsaXNlY29uZHMoZGF0ZSwgbWlsbGlzZWNvbmRzMiwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBfZGF0ZS5zZXRNaWxsaXNlY29uZHMobWlsbGlzZWNvbmRzMik7CiAgcmV0dXJuIF9kYXRlOwp9Cl9fbmFtZShzZXRNaWxsaXNlY29uZHMsICJzZXRNaWxsaXNlY29uZHMiKTsKdmFyIHNldE1pbGxpc2Vjb25kc19kZWZhdWx0ID0gc2V0TWlsbGlzZWNvbmRzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRNaW51dGVzLmpzCmZ1bmN0aW9uIHNldE1pbnV0ZXMoZGF0ZSwgbWludXRlcywgb3B0aW9ucykgewogIGNvbnN0IGRhdGVfID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBkYXRlXy5zZXRNaW51dGVzKG1pbnV0ZXMpOwogIHJldHVybiBkYXRlXzsKfQpfX25hbWUoc2V0TWludXRlcywgInNldE1pbnV0ZXMiKTsKdmFyIHNldE1pbnV0ZXNfZGVmYXVsdCA9IHNldE1pbnV0ZXM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldFF1YXJ0ZXIuanMKZnVuY3Rpb24gc2V0UXVhcnRlcihkYXRlLCBxdWFydGVyLCBvcHRpb25zKSB7CiAgY29uc3QgZGF0ZV8gPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGNvbnN0IG9sZFF1YXJ0ZXIgPSBNYXRoLnRydW5jKGRhdGVfLmdldE1vbnRoKCkgLyAzKSArIDE7CiAgY29uc3QgZGlmZiA9IHF1YXJ0ZXIgLSBvbGRRdWFydGVyOwogIHJldHVybiBzZXRNb250aChkYXRlXywgZGF0ZV8uZ2V0TW9udGgoKSArIGRpZmYgKiAzKTsKfQpfX25hbWUoc2V0UXVhcnRlciwgInNldFF1YXJ0ZXIiKTsKdmFyIHNldFF1YXJ0ZXJfZGVmYXVsdCA9IHNldFF1YXJ0ZXI7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldFNlY29uZHMuanMKZnVuY3Rpb24gc2V0U2Vjb25kcyhkYXRlLCBzZWNvbmRzLCBvcHRpb25zKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIF9kYXRlLnNldFNlY29uZHMoc2Vjb25kcyk7CiAgcmV0dXJuIF9kYXRlOwp9Cl9fbmFtZShzZXRTZWNvbmRzLCAic2V0U2Vjb25kcyIpOwp2YXIgc2V0U2Vjb25kc19kZWZhdWx0ID0gc2V0U2Vjb25kczsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0V2Vla1llYXIuanMKZnVuY3Rpb24gc2V0V2Vla1llYXIoZGF0ZSwgd2Vla1llYXIsIG9wdGlvbnMpIHsKICBjb25zdCBkZWZhdWx0T3B0aW9uczIgPSBnZXREZWZhdWx0T3B0aW9ucygpOwogIGNvbnN0IGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9IG9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyBkZWZhdWx0T3B0aW9uczIuZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/IGRlZmF1bHRPcHRpb25zMi5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyAxOwogIGNvbnN0IGRpZmYgPSBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoCiAgICB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pLAogICAgc3RhcnRPZldlZWtZZWFyKGRhdGUsIG9wdGlvbnMpLAogICAgb3B0aW9ucwogICk7CiAgY29uc3QgZmlyc3RXZWVrID0gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCAwKTsKICBmaXJzdFdlZWsuc2V0RnVsbFllYXIod2Vla1llYXIsIDAsIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSk7CiAgZmlyc3RXZWVrLnNldEhvdXJzKDAsIDAsIDAsIDApOwogIGNvbnN0IGRhdGVfID0gc3RhcnRPZldlZWtZZWFyKGZpcnN0V2Vlaywgb3B0aW9ucyk7CiAgZGF0ZV8uc2V0RGF0ZShkYXRlXy5nZXREYXRlKCkgKyBkaWZmKTsKICByZXR1cm4gZGF0ZV87Cn0KX19uYW1lKHNldFdlZWtZZWFyLCAic2V0V2Vla1llYXIiKTsKdmFyIHNldFdlZWtZZWFyX2RlZmF1bHQgPSBzZXRXZWVrWWVhcjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0WWVhci5qcwpmdW5jdGlvbiBzZXRZZWFyKGRhdGUsIHllYXIsIG9wdGlvbnMpIHsKICBjb25zdCBkYXRlXyA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgaWYgKGlzTmFOKCtkYXRlXykpIHJldHVybiBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIE5hTik7CiAgZGF0ZV8uc2V0RnVsbFllYXIoeWVhcik7CiAgcmV0dXJuIGRhdGVfOwp9Cl9fbmFtZShzZXRZZWFyLCAic2V0WWVhciIpOwp2YXIgc2V0WWVhcl9kZWZhdWx0ID0gc2V0WWVhcjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZkRlY2FkZS5qcwpmdW5jdGlvbiBzdGFydE9mRGVjYWRlKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgeWVhciA9IF9kYXRlLmdldEZ1bGxZZWFyKCk7CiAgY29uc3QgZGVjYWRlID0gTWF0aC5mbG9vcih5ZWFyIC8gMTApICogMTA7CiAgX2RhdGUuc2V0RnVsbFllYXIoZGVjYWRlLCAwLCAxKTsKICBfZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICByZXR1cm4gX2RhdGU7Cn0KX19uYW1lKHN0YXJ0T2ZEZWNhZGUsICJzdGFydE9mRGVjYWRlIik7CnZhciBzdGFydE9mRGVjYWRlX2RlZmF1bHQgPSBzdGFydE9mRGVjYWRlOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mVG9kYXkuanMKZnVuY3Rpb24gc3RhcnRPZlRvZGF5KG9wdGlvbnMpIHsKICByZXR1cm4gc3RhcnRPZkRheShEYXRlLm5vdygpLCBvcHRpb25zKTsKfQpfX25hbWUoc3RhcnRPZlRvZGF5LCAic3RhcnRPZlRvZGF5Iik7CnZhciBzdGFydE9mVG9kYXlfZGVmYXVsdCA9IHN0YXJ0T2ZUb2RheTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZlRvbW9ycm93LmpzCmZ1bmN0aW9uIHN0YXJ0T2ZUb21vcnJvdyhvcHRpb25zKSB7CiAgY29uc3Qgbm93MiA9IGNvbnN0cnVjdE5vdyhvcHRpb25zPy5pbik7CiAgY29uc3QgeWVhciA9IG5vdzIuZ2V0RnVsbFllYXIoKTsKICBjb25zdCBtb250aCA9IG5vdzIuZ2V0TW9udGgoKTsKICBjb25zdCBkYXkgPSBub3cyLmdldERhdGUoKTsKICBjb25zdCBkYXRlID0gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiwgMCk7CiAgZGF0ZS5zZXRGdWxsWWVhcih5ZWFyLCBtb250aCwgZGF5ICsgMSk7CiAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICByZXR1cm4gZGF0ZTsKfQpfX25hbWUoc3RhcnRPZlRvbW9ycm93LCAic3RhcnRPZlRvbW9ycm93Iik7CnZhciBzdGFydE9mVG9tb3Jyb3dfZGVmYXVsdCA9IHN0YXJ0T2ZUb21vcnJvdzsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZlllc3RlcmRheS5qcwpmdW5jdGlvbiBzdGFydE9mWWVzdGVyZGF5KG9wdGlvbnMpIHsKICBjb25zdCBub3cyID0gY29uc3RydWN0Tm93KG9wdGlvbnM/LmluKTsKICBjb25zdCB5ZWFyID0gbm93Mi5nZXRGdWxsWWVhcigpOwogIGNvbnN0IG1vbnRoID0gbm93Mi5nZXRNb250aCgpOwogIGNvbnN0IGRheSA9IG5vdzIuZ2V0RGF0ZSgpOwogIGNvbnN0IGRhdGUgPSBjb25zdHJ1Y3ROb3cob3B0aW9ucz8uaW4pOwogIGRhdGUuc2V0RnVsbFllYXIoeWVhciwgbW9udGgsIGRheSAtIDEpOwogIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgcmV0dXJuIGRhdGU7Cn0KX19uYW1lKHN0YXJ0T2ZZZXN0ZXJkYXksICJzdGFydE9mWWVzdGVyZGF5Iik7CnZhciBzdGFydE9mWWVzdGVyZGF5X2RlZmF1bHQgPSBzdGFydE9mWWVzdGVyZGF5OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJNb250aHMuanMKZnVuY3Rpb24gc3ViTW9udGhzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykgewogIHJldHVybiBhZGRNb250aHMoZGF0ZSwgLWFtb3VudCwgb3B0aW9ucyk7Cn0KX19uYW1lKHN1Yk1vbnRocywgInN1Yk1vbnRocyIpOwp2YXIgc3ViTW9udGhzX2RlZmF1bHQgPSBzdWJNb250aHM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N1Yi5qcwpmdW5jdGlvbiBzdWIoZGF0ZSwgZHVyYXRpb24sIG9wdGlvbnMpIHsKICBjb25zdCB7CiAgICB5ZWFycyA9IDAsCiAgICBtb250aHM6IG1vbnRoczIgPSAwLAogICAgd2Vla3MgPSAwLAogICAgZGF5czogZGF5czIgPSAwLAogICAgaG91cnMgPSAwLAogICAgbWludXRlcyA9IDAsCiAgICBzZWNvbmRzID0gMAogIH0gPSBkdXJhdGlvbjsKICBjb25zdCB3aXRob3V0TW9udGhzID0gc3ViTW9udGhzKGRhdGUsIG1vbnRoczIgKyB5ZWFycyAqIDEyLCBvcHRpb25zKTsKICBjb25zdCB3aXRob3V0RGF5cyA9IHN1YkRheXMod2l0aG91dE1vbnRocywgZGF5czIgKyB3ZWVrcyAqIDcsIG9wdGlvbnMpOwogIGNvbnN0IG1pbnV0ZXNUb1N1YiA9IG1pbnV0ZXMgKyBob3VycyAqIDYwOwogIGNvbnN0IHNlY29uZHNUb1N1YiA9IHNlY29uZHMgKyBtaW51dGVzVG9TdWIgKiA2MDsKICBjb25zdCBtc1RvU3ViID0gc2Vjb25kc1RvU3ViICogMWUzOwogIHJldHVybiBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsICt3aXRob3V0RGF5cyAtIG1zVG9TdWIpOwp9Cl9fbmFtZShzdWIsICJzdWIiKTsKdmFyIHN1Yl9kZWZhdWx0ID0gc3ViOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJCdXNpbmVzc0RheXMuanMKZnVuY3Rpb24gc3ViQnVzaW5lc3NEYXlzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykgewogIHJldHVybiBhZGRCdXNpbmVzc0RheXMoZGF0ZSwgLWFtb3VudCwgb3B0aW9ucyk7Cn0KX19uYW1lKHN1YkJ1c2luZXNzRGF5cywgInN1YkJ1c2luZXNzRGF5cyIpOwp2YXIgc3ViQnVzaW5lc3NEYXlzX2RlZmF1bHQgPSBzdWJCdXNpbmVzc0RheXM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N1YkhvdXJzLmpzCmZ1bmN0aW9uIHN1YkhvdXJzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykgewogIHJldHVybiBhZGRIb3VycyhkYXRlLCAtYW1vdW50LCBvcHRpb25zKTsKfQpfX25hbWUoc3ViSG91cnMsICJzdWJIb3VycyIpOwp2YXIgc3ViSG91cnNfZGVmYXVsdCA9IHN1YkhvdXJzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJNaWxsaXNlY29uZHMuanMKZnVuY3Rpb24gc3ViTWlsbGlzZWNvbmRzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykgewogIHJldHVybiBhZGRNaWxsaXNlY29uZHMoZGF0ZSwgLWFtb3VudCwgb3B0aW9ucyk7Cn0KX19uYW1lKHN1Yk1pbGxpc2Vjb25kcywgInN1Yk1pbGxpc2Vjb25kcyIpOwp2YXIgc3ViTWlsbGlzZWNvbmRzX2RlZmF1bHQgPSBzdWJNaWxsaXNlY29uZHM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N1Yk1pbnV0ZXMuanMKZnVuY3Rpb24gc3ViTWludXRlcyhkYXRlLCBhbW91bnQsIG9wdGlvbnMpIHsKICByZXR1cm4gYWRkTWludXRlcyhkYXRlLCAtYW1vdW50LCBvcHRpb25zKTsKfQpfX25hbWUoc3ViTWludXRlcywgInN1Yk1pbnV0ZXMiKTsKdmFyIHN1Yk1pbnV0ZXNfZGVmYXVsdCA9IHN1Yk1pbnV0ZXM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N1YlF1YXJ0ZXJzLmpzCmZ1bmN0aW9uIHN1YlF1YXJ0ZXJzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykgewogIHJldHVybiBhZGRRdWFydGVycyhkYXRlLCAtYW1vdW50LCBvcHRpb25zKTsKfQpfX25hbWUoc3ViUXVhcnRlcnMsICJzdWJRdWFydGVycyIpOwp2YXIgc3ViUXVhcnRlcnNfZGVmYXVsdCA9IHN1YlF1YXJ0ZXJzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJTZWNvbmRzLmpzCmZ1bmN0aW9uIHN1YlNlY29uZHMoZGF0ZSwgYW1vdW50LCBvcHRpb25zKSB7CiAgcmV0dXJuIGFkZFNlY29uZHMoZGF0ZSwgLWFtb3VudCwgb3B0aW9ucyk7Cn0KX19uYW1lKHN1YlNlY29uZHMsICJzdWJTZWNvbmRzIik7CnZhciBzdWJTZWNvbmRzX2RlZmF1bHQgPSBzdWJTZWNvbmRzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJXZWVrcy5qcwpmdW5jdGlvbiBzdWJXZWVrcyhkYXRlLCBhbW91bnQsIG9wdGlvbnMpIHsKICByZXR1cm4gYWRkV2Vla3MoZGF0ZSwgLWFtb3VudCwgb3B0aW9ucyk7Cn0KX19uYW1lKHN1YldlZWtzLCAic3ViV2Vla3MiKTsKdmFyIHN1YldlZWtzX2RlZmF1bHQgPSBzdWJXZWVrczsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3ViWWVhcnMuanMKZnVuY3Rpb24gc3ViWWVhcnMoZGF0ZSwgYW1vdW50LCBvcHRpb25zKSB7CiAgcmV0dXJuIGFkZFllYXJzKGRhdGUsIC1hbW91bnQsIG9wdGlvbnMpOwp9Cl9fbmFtZShzdWJZZWFycywgInN1YlllYXJzIik7CnZhciBzdWJZZWFyc19kZWZhdWx0ID0gc3ViWWVhcnM7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3dlZWtzVG9EYXlzLmpzCmZ1bmN0aW9uIHdlZWtzVG9EYXlzKHdlZWtzKSB7CiAgcmV0dXJuIE1hdGgudHJ1bmMod2Vla3MgKiBkYXlzSW5XZWVrKTsKfQpfX25hbWUod2Vla3NUb0RheXMsICJ3ZWVrc1RvRGF5cyIpOwp2YXIgd2Vla3NUb0RheXNfZGVmYXVsdCA9IHdlZWtzVG9EYXlzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy95ZWFyc1RvRGF5cy5qcwpmdW5jdGlvbiB5ZWFyc1RvRGF5cyh5ZWFycykgewogIHJldHVybiBNYXRoLnRydW5jKHllYXJzICogZGF5c0luWWVhcik7Cn0KX19uYW1lKHllYXJzVG9EYXlzLCAieWVhcnNUb0RheXMiKTsKdmFyIHllYXJzVG9EYXlzX2RlZmF1bHQgPSB5ZWFyc1RvRGF5czsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMveWVhcnNUb01vbnRocy5qcwpmdW5jdGlvbiB5ZWFyc1RvTW9udGhzKHllYXJzKSB7CiAgcmV0dXJuIE1hdGgudHJ1bmMoeWVhcnMgKiBtb250aHNJblllYXIpOwp9Cl9fbmFtZSh5ZWFyc1RvTW9udGhzLCAieWVhcnNUb01vbnRocyIpOwp2YXIgeWVhcnNUb01vbnRoc19kZWZhdWx0ID0geWVhcnNUb01vbnRoczsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMveWVhcnNUb1F1YXJ0ZXJzLmpzCmZ1bmN0aW9uIHllYXJzVG9RdWFydGVycyh5ZWFycykgewogIHJldHVybiBNYXRoLnRydW5jKHllYXJzICogcXVhcnRlcnNJblllYXIpOwp9Cl9fbmFtZSh5ZWFyc1RvUXVhcnRlcnMsICJ5ZWFyc1RvUXVhcnRlcnMiKTsKdmFyIHllYXJzVG9RdWFydGVyc19kZWZhdWx0ID0geWVhcnNUb1F1YXJ0ZXJzOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3BhcnNlLW1zQDQuMC4wL25vZGVfbW9kdWxlcy9wYXJzZS1tcy9pbmRleC5qcwp2YXIgdG9aZXJvSWZJbmZpbml0eSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHZhbHVlMikgPT4gTnVtYmVyLmlzRmluaXRlKHZhbHVlMikgPyB2YWx1ZTIgOiAwLCAidG9aZXJvSWZJbmZpbml0eSIpOwpmdW5jdGlvbiBwYXJzZU51bWJlcihtaWxsaXNlY29uZHMyKSB7CiAgcmV0dXJuIHsKICAgIGRheXM6IE1hdGgudHJ1bmMobWlsbGlzZWNvbmRzMiAvIDg2NGU1KSwKICAgIGhvdXJzOiBNYXRoLnRydW5jKG1pbGxpc2Vjb25kczIgLyAzNmU1ICUgMjQpLAogICAgbWludXRlczogTWF0aC50cnVuYyhtaWxsaXNlY29uZHMyIC8gNmU0ICUgNjApLAogICAgc2Vjb25kczogTWF0aC50cnVuYyhtaWxsaXNlY29uZHMyIC8gMWUzICUgNjApLAogICAgbWlsbGlzZWNvbmRzOiBNYXRoLnRydW5jKG1pbGxpc2Vjb25kczIgJSAxZTMpLAogICAgbWljcm9zZWNvbmRzOiBNYXRoLnRydW5jKHRvWmVyb0lmSW5maW5pdHkobWlsbGlzZWNvbmRzMiAqIDFlMykgJSAxZTMpLAogICAgbmFub3NlY29uZHM6IE1hdGgudHJ1bmModG9aZXJvSWZJbmZpbml0eShtaWxsaXNlY29uZHMyICogMWU2KSAlIDFlMykKICB9Owp9Cl9fbmFtZShwYXJzZU51bWJlciwgInBhcnNlTnVtYmVyIik7CmZ1bmN0aW9uIHBhcnNlQmlnaW50KG1pbGxpc2Vjb25kczIpIHsKICByZXR1cm4gewogICAgZGF5czogbWlsbGlzZWNvbmRzMiAvIDg2NDAwMDAwbiwKICAgIGhvdXJzOiBtaWxsaXNlY29uZHMyIC8gMzYwMDAwMG4gJSAyNG4sCiAgICBtaW51dGVzOiBtaWxsaXNlY29uZHMyIC8gNjAwMDBuICUgNjBuLAogICAgc2Vjb25kczogbWlsbGlzZWNvbmRzMiAvIDEwMDBuICUgNjBuLAogICAgbWlsbGlzZWNvbmRzOiBtaWxsaXNlY29uZHMyICUgMTAwMG4sCiAgICBtaWNyb3NlY29uZHM6IDBuLAogICAgbmFub3NlY29uZHM6IDBuCiAgfTsKfQpfX25hbWUocGFyc2VCaWdpbnQsICJwYXJzZUJpZ2ludCIpOwpmdW5jdGlvbiBwYXJzZU1pbGxpc2Vjb25kcyhtaWxsaXNlY29uZHMyKSB7CiAgc3dpdGNoICh0eXBlb2YgbWlsbGlzZWNvbmRzMikgewogICAgY2FzZSAibnVtYmVyIjogewogICAgICBpZiAoTnVtYmVyLmlzRmluaXRlKG1pbGxpc2Vjb25kczIpKSB7CiAgICAgICAgcmV0dXJuIHBhcnNlTnVtYmVyKG1pbGxpc2Vjb25kczIpOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgfQogICAgY2FzZSAiYmlnaW50IjogewogICAgICByZXR1cm4gcGFyc2VCaWdpbnQobWlsbGlzZWNvbmRzMik7CiAgICB9CiAgfQogIHRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIGEgZmluaXRlIG51bWJlciBvciBiaWdpbnQiKTsKfQpfX25hbWUocGFyc2VNaWxsaXNlY29uZHMsICJwYXJzZU1pbGxpc2Vjb25kcyIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3ByZXR0eS1tc0A5LjMuMC9ub2RlX21vZHVsZXMvcHJldHR5LW1zL2luZGV4LmpzCnZhciBpc1plcm8gPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh2YWx1ZTIpID0+IHZhbHVlMiA9PT0gMCB8fCB2YWx1ZTIgPT09IDBuLCAiaXNaZXJvIik7CnZhciBwbHVyYWxpemUgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh3b3JkLCBjb3VudDIpID0+IGNvdW50MiA9PT0gMSB8fCBjb3VudDIgPT09IDFuID8gd29yZCA6IGAke3dvcmR9c2AsICJwbHVyYWxpemUiKTsKdmFyIFNFQ09ORF9ST1VORElOR19FUFNJTE9OID0gMWUtNzsKdmFyIE9ORV9EQVlfSU5fTUlMTElTRUNPTkRTID0gMjRuICogNjBuICogNjBuICogMTAwMG47CmZ1bmN0aW9uIHByZXR0eU1pbGxpc2Vjb25kcyhtaWxsaXNlY29uZHMyLCBvcHRpb25zKSB7CiAgY29uc3QgaXNCaWdJbnQgPSB0eXBlb2YgbWlsbGlzZWNvbmRzMiA9PT0gImJpZ2ludCI7CiAgaWYgKCFpc0JpZ0ludCAmJiAhTnVtYmVyLmlzRmluaXRlKG1pbGxpc2Vjb25kczIpKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJFeHBlY3RlZCBhIGZpbml0ZSBudW1iZXIgb3IgYmlnaW50Iik7CiAgfQogIG9wdGlvbnMgPSB7IC4uLm9wdGlvbnMgfTsKICBjb25zdCBzaWduID0gbWlsbGlzZWNvbmRzMiA8IDAgPyAiLSIgOiAiIjsKICBtaWxsaXNlY29uZHMyID0gbWlsbGlzZWNvbmRzMiA8IDAgPyAtbWlsbGlzZWNvbmRzMiA6IG1pbGxpc2Vjb25kczI7CiAgaWYgKG9wdGlvbnMuY29sb25Ob3RhdGlvbikgewogICAgb3B0aW9ucy5jb21wYWN0ID0gZmFsc2U7CiAgICBvcHRpb25zLmZvcm1hdFN1Yk1pbGxpc2Vjb25kcyA9IGZhbHNlOwogICAgb3B0aW9ucy5zZXBhcmF0ZU1pbGxpc2Vjb25kcyA9IGZhbHNlOwogICAgb3B0aW9ucy52ZXJib3NlID0gZmFsc2U7CiAgfQogIGlmIChvcHRpb25zLmNvbXBhY3QpIHsKICAgIG9wdGlvbnMudW5pdENvdW50ID0gMTsKICAgIG9wdGlvbnMuc2Vjb25kc0RlY2ltYWxEaWdpdHMgPSAwOwogICAgb3B0aW9ucy5taWxsaXNlY29uZHNEZWNpbWFsRGlnaXRzID0gMDsKICB9CiAgbGV0IHJlc3VsdCA9IFtdOwogIGNvbnN0IGZsb29yRGVjaW1hbHMgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh2YWx1ZTIsIGRlY2ltYWxEaWdpdHMpID0+IHsKICAgIGNvbnN0IGZsb29yZWRJbnRlcmltVmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlMiAqIDEwICoqIGRlY2ltYWxEaWdpdHMgKyBTRUNPTkRfUk9VTkRJTkdfRVBTSUxPTik7CiAgICBjb25zdCBmbG9vcmVkVmFsdWUgPSBNYXRoLnJvdW5kKGZsb29yZWRJbnRlcmltVmFsdWUpIC8gMTAgKiogZGVjaW1hbERpZ2l0czsKICAgIHJldHVybiBmbG9vcmVkVmFsdWUudG9GaXhlZChkZWNpbWFsRGlnaXRzKTsKICB9LCAiZmxvb3JEZWNpbWFscyIpOwogIGNvbnN0IGFkZDIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh2YWx1ZTIsIGxvbmcsIHNob3J0LCB2YWx1ZVN0cmluZykgPT4gewogICAgaWYgKChyZXN1bHQubGVuZ3RoID09PSAwIHx8ICFvcHRpb25zLmNvbG9uTm90YXRpb24pICYmIGlzWmVybyh2YWx1ZTIpICYmICEob3B0aW9ucy5jb2xvbk5vdGF0aW9uICYmIHNob3J0ID09PSAibSIpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHZhbHVlU3RyaW5nID8/PSBTdHJpbmcodmFsdWUyKTsKICAgIGlmIChvcHRpb25zLmNvbG9uTm90YXRpb24pIHsKICAgICAgY29uc3Qgd2hvbGVEaWdpdHMgPSB2YWx1ZVN0cmluZy5pbmNsdWRlcygiLiIpID8gdmFsdWVTdHJpbmcuc3BsaXQoIi4iKVswXS5sZW5ndGggOiB2YWx1ZVN0cmluZy5sZW5ndGg7CiAgICAgIGNvbnN0IG1pbkxlbmd0aCA9IHJlc3VsdC5sZW5ndGggPiAwID8gMiA6IDE7CiAgICAgIHZhbHVlU3RyaW5nID0gIjAiLnJlcGVhdChNYXRoLm1heCgwLCBtaW5MZW5ndGggLSB3aG9sZURpZ2l0cykpICsgdmFsdWVTdHJpbmc7CiAgICB9IGVsc2UgewogICAgICB2YWx1ZVN0cmluZyArPSBvcHRpb25zLnZlcmJvc2UgPyAiICIgKyBwbHVyYWxpemUobG9uZywgdmFsdWUyKSA6IHNob3J0OwogICAgfQogICAgcmVzdWx0LnB1c2godmFsdWVTdHJpbmcpOwogIH0sICJhZGQiKTsKICBjb25zdCBwYXJzZWQgPSBwYXJzZU1pbGxpc2Vjb25kcyhtaWxsaXNlY29uZHMyKTsKICBjb25zdCBkYXlzMiA9IEJpZ0ludChwYXJzZWQuZGF5cyk7CiAgaWYgKG9wdGlvbnMuaGlkZVllYXJBbmREYXlzKSB7CiAgICBhZGQyKEJpZ0ludChkYXlzMikgKiAyNG4gKyBCaWdJbnQocGFyc2VkLmhvdXJzKSwgImhvdXIiLCAiaCIpOwogIH0gZWxzZSB7CiAgICBpZiAob3B0aW9ucy5oaWRlWWVhcikgewogICAgICBhZGQyKGRheXMyLCAiZGF5IiwgImQiKTsKICAgIH0gZWxzZSB7CiAgICAgIGFkZDIoZGF5czIgLyAzNjVuLCAieWVhciIsICJ5Iik7CiAgICAgIGFkZDIoZGF5czIgJSAzNjVuLCAiZGF5IiwgImQiKTsKICAgIH0KICAgIGFkZDIoTnVtYmVyKHBhcnNlZC5ob3VycyksICJob3VyIiwgImgiKTsKICB9CiAgYWRkMihOdW1iZXIocGFyc2VkLm1pbnV0ZXMpLCAibWludXRlIiwgIm0iKTsKICBpZiAoIW9wdGlvbnMuaGlkZVNlY29uZHMpIHsKICAgIGlmIChvcHRpb25zLnNlcGFyYXRlTWlsbGlzZWNvbmRzIHx8IG9wdGlvbnMuZm9ybWF0U3ViTWlsbGlzZWNvbmRzIHx8ICFvcHRpb25zLmNvbG9uTm90YXRpb24gJiYgbWlsbGlzZWNvbmRzMiA8IDFlMyAmJiAhb3B0aW9ucy5zdWJTZWNvbmRzQXNEZWNpbWFscykgewogICAgICBjb25zdCBzZWNvbmRzID0gTnVtYmVyKHBhcnNlZC5zZWNvbmRzKTsKICAgICAgY29uc3QgbWlsbGlzZWNvbmRzMyA9IE51bWJlcihwYXJzZWQubWlsbGlzZWNvbmRzKTsKICAgICAgY29uc3QgbWljcm9zZWNvbmRzID0gTnVtYmVyKHBhcnNlZC5taWNyb3NlY29uZHMpOwogICAgICBjb25zdCBuYW5vc2Vjb25kcyA9IE51bWJlcihwYXJzZWQubmFub3NlY29uZHMpOwogICAgICBhZGQyKHNlY29uZHMsICJzZWNvbmQiLCAicyIpOwogICAgICBpZiAob3B0aW9ucy5mb3JtYXRTdWJNaWxsaXNlY29uZHMpIHsKICAgICAgICBhZGQyKG1pbGxpc2Vjb25kczMsICJtaWxsaXNlY29uZCIsICJtcyIpOwogICAgICAgIGFkZDIobWljcm9zZWNvbmRzLCAibWljcm9zZWNvbmQiLCAiXHhCNXMiKTsKICAgICAgICBhZGQyKG5hbm9zZWNvbmRzLCAibmFub3NlY29uZCIsICJucyIpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IG1pbGxpc2Vjb25kc0FuZEJlbG93ID0gbWlsbGlzZWNvbmRzMyArIG1pY3Jvc2Vjb25kcyAvIDFlMyArIG5hbm9zZWNvbmRzIC8gMWU2OwogICAgICAgIGNvbnN0IG1pbGxpc2Vjb25kc0RlY2ltYWxEaWdpdHMgPSB0eXBlb2Ygb3B0aW9ucy5taWxsaXNlY29uZHNEZWNpbWFsRGlnaXRzID09PSAibnVtYmVyIiA/IG9wdGlvbnMubWlsbGlzZWNvbmRzRGVjaW1hbERpZ2l0cyA6IDA7CiAgICAgICAgY29uc3Qgcm91bmRlZE1pbGxpc2Vjb25kcyA9IG1pbGxpc2Vjb25kc0FuZEJlbG93ID49IDEgPyBNYXRoLnJvdW5kKG1pbGxpc2Vjb25kc0FuZEJlbG93KSA6IE1hdGguY2VpbChtaWxsaXNlY29uZHNBbmRCZWxvdyk7CiAgICAgICAgY29uc3QgbWlsbGlzZWNvbmRzU3RyaW5nID0gbWlsbGlzZWNvbmRzRGVjaW1hbERpZ2l0cyA/IG1pbGxpc2Vjb25kc0FuZEJlbG93LnRvRml4ZWQobWlsbGlzZWNvbmRzRGVjaW1hbERpZ2l0cykgOiByb3VuZGVkTWlsbGlzZWNvbmRzOwogICAgICAgIGFkZDIoCiAgICAgICAgICBOdW1iZXIucGFyc2VGbG9hdChtaWxsaXNlY29uZHNTdHJpbmcpLAogICAgICAgICAgIm1pbGxpc2Vjb25kIiwKICAgICAgICAgICJtcyIsCiAgICAgICAgICBtaWxsaXNlY29uZHNTdHJpbmcKICAgICAgICApOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBjb25zdCBzZWNvbmRzID0gKGlzQmlnSW50ID8gTnVtYmVyKG1pbGxpc2Vjb25kczIgJSBPTkVfREFZX0lOX01JTExJU0VDT05EUykgOiBtaWxsaXNlY29uZHMyKSAvIDFlMyAlIDYwOwogICAgICBjb25zdCBzZWNvbmRzRGVjaW1hbERpZ2l0cyA9IHR5cGVvZiBvcHRpb25zLnNlY29uZHNEZWNpbWFsRGlnaXRzID09PSAibnVtYmVyIiA/IG9wdGlvbnMuc2Vjb25kc0RlY2ltYWxEaWdpdHMgOiAxOwogICAgICBjb25zdCBzZWNvbmRzRml4ZWQgPSBmbG9vckRlY2ltYWxzKHNlY29uZHMsIHNlY29uZHNEZWNpbWFsRGlnaXRzKTsKICAgICAgY29uc3Qgc2Vjb25kc1N0cmluZyA9IG9wdGlvbnMua2VlcERlY2ltYWxzT25XaG9sZVNlY29uZHMgPyBzZWNvbmRzRml4ZWQgOiBzZWNvbmRzRml4ZWQucmVwbGFjZSgvXC4wKyQvLCAiIik7CiAgICAgIGFkZDIoTnVtYmVyLnBhcnNlRmxvYXQoc2Vjb25kc1N0cmluZyksICJzZWNvbmQiLCAicyIsIHNlY29uZHNTdHJpbmcpOwogICAgfQogIH0KICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuIHNpZ24gKyAiMCIgKyAob3B0aW9ucy52ZXJib3NlID8gIiBtaWxsaXNlY29uZHMiIDogIm1zIik7CiAgfQogIGNvbnN0IHNlcGFyYXRvciA9IG9wdGlvbnMuY29sb25Ob3RhdGlvbiA/ICI6IiA6ICIgIjsKICBpZiAodHlwZW9mIG9wdGlvbnMudW5pdENvdW50ID09PSAibnVtYmVyIikgewogICAgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKDAsIE1hdGgubWF4KG9wdGlvbnMudW5pdENvdW50LCAxKSk7CiAgfQogIHJldHVybiBzaWduICsgcmVzdWx0LmpvaW4oc2VwYXJhdG9yKTsKfQpfX25hbWUocHJldHR5TWlsbGlzZWNvbmRzLCAicHJldHR5TWlsbGlzZWNvbmRzIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR0aW1lQDQuMi4zL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHRpbWUvZGlzdF90cy9zbWFydHRpbWUucGx1Z2lucy5qcwp2YXIgaW1wb3J0X2RheWpzID0gX190b0VTTShyZXF1aXJlX2RheWpzX21pbigpLCAxKTsKdmFyIGltcG9ydF9pc1RvZGF5ID0gX190b0VTTShyZXF1aXJlX2lzVG9kYXkoKSwgMSk7CmltcG9ydF9kYXlqcy5kZWZhdWx0LmV4dGVuZChpbXBvcnRfaXNUb2RheS5kZWZhdWx0KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHRpbWVANC4yLjMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0dGltZS9kaXN0X3RzL3NtYXJ0dGltZS5jbGFzc2VzLmNyb25qb2IuanMKdmFyIENyb25Kb2IgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiQ3JvbkpvYiIpOwogIH0KICBjb25zdHJ1Y3Rvcihjcm9uTWFuYWdlciwgY3JvbkV4cHJlc3Npb25BcmcsIGpvYkZ1bmN0aW9uKSB7CiAgICB0aGlzLnN0YXR1cyA9ICJpbml0aWFsIjsKICAgIHRoaXMubmV4dEV4ZWN1dGlvblVuaXggPSAwOwogICAgdGhpcy5jcm9uRXhwcmVzc2lvbiA9IGNyb25FeHByZXNzaW9uQXJnOwogICAgdGhpcy5qb2JGdW5jdGlvbiA9IGpvYkZ1bmN0aW9uOwogICAgdGhpcy5jcm9uUGFyc2VyID0gbmV3IGNyb25lcl9leHBvcnRzLkNyb24oY3JvbkV4cHJlc3Npb25BcmcpOwogIH0KICAvKioKICAgKiBjaGVja3Mgd2V0aGVyIHRoZSBjcm9uam9iIG5lZWRzIHRvIGJlIGV4ZWN1dGVkCiAgICovCiAgY2hlY2tFeGVjdXRpb24oKSB7CiAgICBpZiAodGhpcy5zdGF0dXMgPT09ICJzdG9wcGVkIikgewogICAgICByZXR1cm4gdGhpcy5uZXh0RXhlY3V0aW9uVW5peDsKICAgIH0KICAgIGlmICh0aGlzLm5leHRFeGVjdXRpb25Vbml4ID09PSAwKSB7CiAgICAgIHRoaXMuZ2V0TmV4dEV4ZWN1dGlvblRpbWUoKTsKICAgIH0KICAgIGlmIChEYXRlLm5vdygpID4gdGhpcy5uZXh0RXhlY3V0aW9uVW5peCkgewogICAgICBjb25zdCBtYXliZVByb21pc2UgPSB0aGlzLmpvYkZ1bmN0aW9uKHRoaXMubmV4dEV4ZWN1dGlvblVuaXgpOwogICAgICBpZiAobWF5YmVQcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZSkgewogICAgICAgIG1heWJlUHJvbWlzZS5jYXRjaCgoZTEwKSA9PiBjb25zb2xlLmxvZyhlMTApKTsKICAgICAgfQogICAgICB0aGlzLm5leHRFeGVjdXRpb25Vbml4ID0gdGhpcy5nZXROZXh0RXhlY3V0aW9uVGltZSgpOwogICAgfQogICAgcmV0dXJuIHRoaXMubmV4dEV4ZWN1dGlvblVuaXg7CiAgfQogIGdldE5leHRFeGVjdXRpb25UaW1lKCkgewogICAgcmV0dXJuIHRoaXMubmV4dEV4ZWN1dGlvblVuaXggPSBEYXRlLm5vdygpICsgdGhpcy5nZXRUaW1lVG9OZXh0RXhlY3V0aW9uKCk7CiAgfQogIC8qKgogICAqIGdldHMgdGhlIHRpbWUgdG8gbmV4dCBleGVjdXRpb24KICAgKi8KICBnZXRUaW1lVG9OZXh0RXhlY3V0aW9uKCkgewogICAgcmV0dXJuIHRoaXMuY3JvblBhcnNlci5tc1RvTmV4dCgpOwogIH0KICBzdGFydCgpIHsKICAgIHRoaXMuc3RhdHVzID0gInN0YXJ0ZWQiOwogIH0KICBzdG9wKCkgewogICAgdGhpcy5zdGF0dXMgPSAic3RvcHBlZCI7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0dGltZUA0LjIuMy9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnR0aW1lL2Rpc3RfdHMvc21hcnR0aW1lLmNsYXNzZXMuY3Jvbm1hbmFnZXIuanMKdmFyIENyb25NYW5hZ2VyID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkNyb25NYW5hZ2VyIik7CiAgfQogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5zdGF0dXMgPSAic3RvcHBlZCI7CiAgICB0aGlzLmNyb25qb2JzID0gbmV3IGRpc3RfdHNfZXhwb3J0czYuT2JqZWN0TWFwKCk7CiAgICB0aGlzLmN5Y2xlV2FrZURlZmVycmVkID0gbnVsbDsKICB9CiAgLyoqCiAgICogUmVzb2x2ZXMgdGhlIGN1cnJlbnQgd2FrZSBkZWZlcnJlZCwgY2F1c2luZyB0aGUgc2xlZXBpbmcgY3ljbGUKICAgKiB0byBpbW1lZGlhdGVseSByZWNhbGN1bGF0ZSBpbnN0ZWFkIG9mIHdhaXRpbmcgZm9yIGl0cyB0aW1lb3V0LgogICAqLwogIHdha2VDeWNsZSgpIHsKICAgIGlmICh0aGlzLmN5Y2xlV2FrZURlZmVycmVkICYmIHRoaXMuY3ljbGVXYWtlRGVmZXJyZWQuc3RhdHVzID09PSAicGVuZGluZyIpIHsKICAgICAgdGhpcy5jeWNsZVdha2VEZWZlcnJlZC5yZXNvbHZlKCk7CiAgICB9CiAgfQogIGFkZENyb25qb2IoY3JvbklkZW50aWZpZXJBcmcsIGNyb25GdW5jdGlvbkFyZykgewogICAgY29uc3QgbmV3Q3JvbkpvYiA9IG5ldyBDcm9uSm9iKHRoaXMsIGNyb25JZGVudGlmaWVyQXJnLCBjcm9uRnVuY3Rpb25BcmcpOwogICAgdGhpcy5jcm9uam9icy5hZGQobmV3Q3JvbkpvYik7CiAgICBpZiAodGhpcy5zdGF0dXMgPT09ICJzdGFydGVkIikgewogICAgICBuZXdDcm9uSm9iLnN0YXJ0KCk7CiAgICAgIHRoaXMud2FrZUN5Y2xlKCk7CiAgICB9CiAgICByZXR1cm4gbmV3Q3JvbkpvYjsKICB9CiAgcmVtb3ZlQ3JvbmpvYihjcm9uam9iQXJnKSB7CiAgICBjcm9uam9iQXJnLnN0b3AoKTsKICAgIHRoaXMuY3JvbmpvYnMucmVtb3ZlKGNyb25qb2JBcmcpOwogICAgaWYgKHRoaXMuc3RhdHVzID09PSAic3RhcnRlZCIpIHsKICAgICAgdGhpcy53YWtlQ3ljbGUoKTsKICAgIH0KICB9CiAgLyoqCiAgICogc3RhcnRzIHRoZSBjcm9uam9iCiAgICovCiAgc3RhcnQoKSB7CiAgICBpZiAodGhpcy5zdGF0dXMgIT09ICJzdGFydGVkIikgewogICAgICB0aGlzLnN0YXR1cyA9ICJzdGFydGVkIjsKICAgICAgZm9yIChjb25zdCBjcm9uSm9iIG9mIHRoaXMuY3JvbmpvYnMuZ2V0QXJyYXkoKSkgewogICAgICAgIGNyb25Kb2Iuc3RhcnQoKTsKICAgICAgfQogICAgICB0aGlzLnJ1bkNyb25DeWNsZSgpOwogICAgfQogIH0KICBhc3luYyBydW5Dcm9uQ3ljbGUoKSB7CiAgICB3aGlsZSAodGhpcy5zdGF0dXMgPT09ICJzdGFydGVkIikgewogICAgICB0aGlzLmN5Y2xlV2FrZURlZmVycmVkID0gbmV3IGRpc3RfdHNfZXhwb3J0cy5EZWZlcnJlZCgpOwogICAgICBsZXQgc29vbmVzdE1zID0gSW5maW5pdHk7CiAgICAgIGZvciAoY29uc3QgY3JvbkpvYiBvZiB0aGlzLmNyb25qb2JzLmdldEFycmF5KCkpIHsKICAgICAgICBjcm9uSm9iLmNoZWNrRXhlY3V0aW9uKCk7CiAgICAgICAgY29uc3QgbXNUb05leHQgPSBjcm9uSm9iLmdldFRpbWVUb05leHRFeGVjdXRpb24oKTsKICAgICAgICBpZiAobXNUb05leHQgPCBzb29uZXN0TXMpIHsKICAgICAgICAgIHNvb25lc3RNcyA9IG1zVG9OZXh0OwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoc29vbmVzdE1zIDwgSW5maW5pdHkgJiYgc29vbmVzdE1zID4gMCkgewogICAgICAgIHRoaXMuZXhlY3V0aW9uVGltZW91dCA9IG5ldyBkaXN0X3RzX2V4cG9ydHMzLlRpbWVvdXQoc29vbmVzdE1zKTsKICAgICAgICBhd2FpdCBQcm9taXNlLnJhY2UoWwogICAgICAgICAgdGhpcy5leGVjdXRpb25UaW1lb3V0LnByb21pc2UsCiAgICAgICAgICB0aGlzLmN5Y2xlV2FrZURlZmVycmVkLnByb21pc2UKICAgICAgICBdKTsKICAgICAgICB0aGlzLmV4ZWN1dGlvblRpbWVvdXQuY2FuY2VsKCk7CiAgICAgIH0gZWxzZSBpZiAoc29vbmVzdE1zIDw9IDApIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhd2FpdCB0aGlzLmN5Y2xlV2FrZURlZmVycmVkLnByb21pc2U7CiAgICAgIH0KICAgIH0KICAgIHRoaXMuY3ljbGVXYWtlRGVmZXJyZWQgPSBudWxsOwogIH0KICAvKioKICAgKiBzdG9wcyBhbGwgY3JvbmpvYnMKICAgKi8KICBzdG9wKCkgewogICAgaWYgKHRoaXMuc3RhdHVzID09PSAic3RhcnRlZCIpIHsKICAgICAgdGhpcy5zdGF0dXMgPSAic3RvcHBlZCI7CiAgICAgIGlmICh0aGlzLmV4ZWN1dGlvblRpbWVvdXQpIHsKICAgICAgICB0aGlzLmV4ZWN1dGlvblRpbWVvdXQuY2FuY2VsKCk7CiAgICAgIH0KICAgICAgdGhpcy53YWtlQ3ljbGUoKTsKICAgIH0KICAgIGZvciAoY29uc3QgY3JvbiBvZiB0aGlzLmNyb25qb2JzLmdldEFycmF5KCkpIHsKICAgICAgY3Jvbi5zdG9wKCk7CiAgICB9CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0dGltZUA0LjIuMy9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnR0aW1lL2Rpc3RfdHMvc21hcnR0aW1lLnVuaXRzLmpzCnZhciB1bml0cyA9IHsKICB5ZWFyczogLyogQF9fUFVSRV9fICovIF9fbmFtZSgodGltZXNBcmcgPSAxKSA9PiB7CiAgICByZXR1cm4gdGltZXNBcmcgKiAzMTU0ZTc7CiAgfSwgInllYXJzIiksCiAgbW9udGhzOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh0aW1lc0FyZyA9IDEpID0+IHsKICAgIHJldHVybiB0aW1lc0FyZyAqIDI2MjhlNjsKICB9LCAibW9udGhzIiksCiAgd2Vla3M6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHRpbWVzQXJnID0gMSkgPT4gewogICAgcmV0dXJuIHRpbWVzQXJnICogNjA0OGU1OwogIH0sICJ3ZWVrcyIpLAogIGRheXM6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHRpbWVzQXJnID0gMSkgPT4gewogICAgcmV0dXJuIHRpbWVzQXJnICogODY0ZTU7CiAgfSwgImRheXMiKSwKICBob3VyczogLyogQF9fUFVSRV9fICovIF9fbmFtZSgodGltZXNBcmcgPSAxKSA9PiB7CiAgICByZXR1cm4gdGltZXNBcmcgKiAzNmU1OwogIH0sICJob3VycyIpLAogIG1pbnV0ZXM6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHRpbWVzQXJnID0gMSkgPT4gewogICAgcmV0dXJuIHRpbWVzQXJnICogNmU0OwogIH0sICJtaW51dGVzIiksCiAgc2Vjb25kczogLyogQF9fUFVSRV9fICovIF9fbmFtZSgodGltZXNBcmcgPSAxKSA9PiB7CiAgICByZXR1cm4gdGltZXNBcmcgKiAxZTM7CiAgfSwgInNlY29uZHMiKQp9Owp2YXIgZ2V0TWlsbGlTZWNvbmRzRnJvbVVuaXRzID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoY29tYmluYXRpb25BcmcpID0+IHsKICBsZXQgdGltZUluTWlsbGlzZWNvbmRzID0gMDsKICBsZXQgYWRkTWlsbGlTZWNvbmRzID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgobWlsbGlTZWNvbmRzQXJnKSA9PiB7CiAgICB0aW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lSW5NaWxsaXNlY29uZHMgKyBtaWxsaVNlY29uZHNBcmc7CiAgfSwgImFkZE1pbGxpU2Vjb25kcyIpOwogIGlmIChjb21iaW5hdGlvbkFyZy55ZWFycykgewogICAgYWRkTWlsbGlTZWNvbmRzKHVuaXRzLnllYXJzKGNvbWJpbmF0aW9uQXJnLnllYXJzKSk7CiAgfQogIGlmIChjb21iaW5hdGlvbkFyZy5tb250aHMpIHsKICAgIGFkZE1pbGxpU2Vjb25kcyh1bml0cy5tb250aHMoY29tYmluYXRpb25BcmcubW9udGhzKSk7CiAgfQogIGlmIChjb21iaW5hdGlvbkFyZy53ZWVrcykgewogICAgYWRkTWlsbGlTZWNvbmRzKHVuaXRzLndlZWtzKGNvbWJpbmF0aW9uQXJnLndlZWtzKSk7CiAgfQogIGlmIChjb21iaW5hdGlvbkFyZy5kYXlzKSB7CiAgICBhZGRNaWxsaVNlY29uZHModW5pdHMuZGF5cyhjb21iaW5hdGlvbkFyZy5kYXlzKSk7CiAgfQogIGlmIChjb21iaW5hdGlvbkFyZy5ob3VycykgewogICAgYWRkTWlsbGlTZWNvbmRzKHVuaXRzLmhvdXJzKGNvbWJpbmF0aW9uQXJnLmhvdXJzKSk7CiAgfQogIGlmIChjb21iaW5hdGlvbkFyZy5taW51dGVzKSB7CiAgICBhZGRNaWxsaVNlY29uZHModW5pdHMubWludXRlcyhjb21iaW5hdGlvbkFyZy5taW51dGVzKSk7CiAgfQogIGlmIChjb21iaW5hdGlvbkFyZy5zZWNvbmRzKSB7CiAgICBhZGRNaWxsaVNlY29uZHModW5pdHMuc2Vjb25kcyhjb21iaW5hdGlvbkFyZy5zZWNvbmRzKSk7CiAgfQogIHJldHVybiB0aW1lSW5NaWxsaXNlY29uZHM7Cn0sICJnZXRNaWxsaVNlY29uZHNGcm9tVW5pdHMiKTsKdmFyIGdldE1pbGxpU2Vjb25kc0FzSHVtYW5SZWFkYWJsZVN0cmluZyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKG1pbGxpU2Vjb25kc0FyZykgPT4gewogIHJldHVybiBwcmV0dHlNaWxsaXNlY29uZHMobWlsbGlTZWNvbmRzQXJnKTsKfSwgImdldE1pbGxpU2Vjb25kc0FzSHVtYW5SZWFkYWJsZVN0cmluZyIpOwp2YXIgZ2V0TWlsbGlTZWNvbmRzQXNIdW1hblJlYWRhYmxlQWdvVGltZSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHRpbWVTdGFtcEFyZykgPT4gewogIHJldHVybiBkYXRlX2Zuc19leHBvcnRzLmZvcm1hdERpc3RhbmNlVG9Ob3cobmV3IERhdGUodGltZVN0YW1wQXJnKSk7Cn0sICJnZXRNaWxsaVNlY29uZHNBc0h1bWFuUmVhZGFibGVBZ29UaW1lIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR0aW1lQDQuMi4zL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHRpbWUvZGlzdF90cy9zbWFydHRpbWUuY2xhc3Nlcy5leHRlbmRlZGRhdGUuanMKdmFyIEV4dGVuZGVkRGF0ZSA9IGNsYXNzIF9FeHRlbmRlZERhdGUgZXh0ZW5kcyBEYXRlIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJFeHRlbmRlZERhdGUiKTsKICB9CiAgLy8gU1RBVElDIGZhY3RvcmllcwogIHN0YXRpYyBmcm9tTWlsbGlzKG1pbGxpU2Vjb25kcykgewogICAgcmV0dXJuIG5ldyBfRXh0ZW5kZWREYXRlKG1pbGxpU2Vjb25kcyk7CiAgfQogIHN0YXRpYyBmcm9tRGF0ZShkYXRlQXJnKSB7CiAgICByZXR1cm4gbmV3IF9FeHRlbmRlZERhdGUoZGF0ZUFyZy5nZXRUaW1lKCkpOwogIH0KICBzdGF0aWMgZnJvbUV1cm9wZWFuRGF0ZShldXJvcGVhbkRhdGUpIHsKICAgIGNvbnN0IGRhdGVBcnJheSA9IC8oLiopXC4oLiopXC4oLiopLy5leGVjKGV1cm9wZWFuRGF0ZSk7CiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoCiAgICAgIHBhcnNlRmxvYXQoZGF0ZUFycmF5WzNdKSwKICAgICAgLy8geWVhcgogICAgICBwYXJzZUZsb2F0KGRhdGVBcnJheVsyXSkgLSAxLAogICAgICAvLyBtb250aAogICAgICBwYXJzZUZsb2F0KGRhdGVBcnJheVsxXSkKICAgICAgLy8gZGF5CiAgICApOwogICAgY29uc3QgdW5peE1pbGxpID0gZGF0ZS5nZXRUaW1lKCk7CiAgICByZXR1cm4gbmV3IF9FeHRlbmRlZERhdGUodW5peE1pbGxpKTsKICB9CiAgLyoqCiAgICogY3JlYXRlcyBhbiBFeHRlbmRlZCBkYXRlIGZyb20gYSBoeXBlZERhdGUgbGlrZSAiMjAxOC0wMy0yOCIKICAgKiBAcGFyYW0gZGF0ZVN0cmluZwogICAqLwogIHN0YXRpYyBmcm9tSHlwaGVkRGF0ZShkYXRlU3RyaW5nKSB7CiAgICBjb25zdCBkYXRlTWlsbGlzID0gbmV3IERhdGUoZGF0ZVN0cmluZykuZ2V0VGltZSgpOwogICAgcmV0dXJuIG5ldyBfRXh0ZW5kZWREYXRlKGRhdGVNaWxsaXMpOwogIH0KICAvKioKICAgKiBTYW1lIGFzIC5mcm9tRXVyb3BlYW5EYXRlKCksIGJ1dCBhY2NlcHRzIGFkZGl0aW9uYWwgdGltZUFyZyBhbmQgem9uZUFyZwogICAqLwogIHN0YXRpYyBmcm9tRXVyb3BlYW5EYXRlQW5kVGltZShldXJvcGVhbkRhdGVBcmcsIHRpbWVBcmcgPSAiMTI6MDA6MDAiLCB6b25lQXJnID0gIkV1cm9wZS9CZXJsaW4iKSB7CiAgICBjb25zdCBkYXRlQXJyYXkgPSAvKC4qKVwuKC4qKVwuKC4qKS8uZXhlYyhldXJvcGVhbkRhdGVBcmcpOwogICAgY29uc3Qgc2xpY2VEYXRlID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoZGF0ZVN0cmluZykgPT4gewogICAgICByZXR1cm4gYDAke2RhdGVTdHJpbmd9YC5zbGljZSgtMik7CiAgICB9LCAic2xpY2VEYXRlIik7CiAgICBjb25zdCBkYXRlVGltZVN0cmluZyA9IGAke2RhdGVBcnJheVszXX0tJHtzbGljZURhdGUoZGF0ZUFycmF5WzJdKX0tJHtzbGljZURhdGUoZGF0ZUFycmF5WzFdKX1UJHt0aW1lQXJnfWA7CiAgICBjb25zdCBkYXRlID0gaW1wb3J0X2RheWpzLmRlZmF1bHQoZGF0ZVRpbWVTdHJpbmcpOwogICAgY29uc3QgdW5peE1pbGxpID0gZGF0ZS50b0RhdGUoKS5nZXRUaW1lKCk7CiAgICByZXR1cm4gbmV3IF9FeHRlbmRlZERhdGUodW5peE1pbGxpKTsKICB9CiAgY29uc3RydWN0b3IodW5peE1pbGxpID0gRGF0ZS5ub3coKSkgewogICAgc3VwZXIodW5peE1pbGxpKTsKICB9CiAgLy8KICBleHBvcnRUb0V1cm9wZWFuRGF0ZSgpIHsKICAgIGNvbnN0IHVuaXRzMiA9IHRoaXMuZXhwb3J0VG9Vbml0cygpOwogICAgcmV0dXJuIGAke3VuaXRzMi5kYXlTdHJpbmd9LiR7dW5pdHMyLm1vbnRoU3RyaW5nfS4ke3VuaXRzMi55ZWFyU3RyaW5nfWA7CiAgfQogIGV4cG9ydFRvSHlwaGVkU29ydGFibGVEYXRlKCkgewogICAgY29uc3QgdW5pdHMyID0gdGhpcy5leHBvcnRUb1VuaXRzKCk7CiAgICByZXR1cm4gYCR7dW5pdHMyLnllYXJTdHJpbmd9LSR7dW5pdHMyLm1vbnRoU3RyaW5nfS0ke3VuaXRzMi5kYXlTdHJpbmd9YDsKICB9CiAgLyoqCiAgICogZXhwb3J0cyB1bml0cwogICAqLwogIGV4cG9ydFRvVW5pdHMoKSB7CiAgICBjb25zdCBtb250aHNBcnJheSA9IFsKICAgICAgIkphbnVhcnkiLAogICAgICAiRmVicnVhcnkiLAogICAgICAiTWFyY2giLAogICAgICAiQXByaWwiLAogICAgICAiTWF5IiwKICAgICAgIkp1bmUiLAogICAgICAiSnVseSIsCiAgICAgICJBdWd1c3QiLAogICAgICAiU2VwdGVtYmVyIiwKICAgICAgIk9jdG9iZXIiLAogICAgICAiTm92ZW1iZXIiLAogICAgICAiRGVjZW1iZXIiCiAgICBdOwogICAgY29uc3QgZGF5c0FycmF5ID0gWwogICAgICAiTW9uZGF5IiwKICAgICAgIlR1ZXNkYXkiLAogICAgICAiV2VkbmVzZGF5IiwKICAgICAgIlRodXJzZGF5IiwKICAgICAgIkZyaWRheSIsCiAgICAgICJTYXR1cmRheSIsCiAgICAgICJTdW5kYXkiCiAgICBdOwogICAgcmV0dXJuIHsKICAgICAgeWVhcjogdGhpcy5nZXRGdWxsWWVhcigpLAogICAgICB5ZWFyU3RyaW5nOiBgJHt0aGlzLmdldEZ1bGxZZWFyKCl9YCwKICAgICAgbW9udGg6IHRoaXMuZ2V0TW9udGgoKSArIDEsCiAgICAgIG1vbnRoU3RyaW5nOiAoIjAiICsgKHRoaXMuZ2V0TW9udGgoKSArIDEpKS5zbGljZSgtMiksCiAgICAgIG1vbnRoTmFtZTogbW9udGhzQXJyYXlbdGhpcy5nZXRNb250aCgpXSwKICAgICAgZGF5OiB0aGlzLmdldERhdGUoKSwKICAgICAgZGF5U3RyaW5nOiAoIjAiICsgdGhpcy5nZXREYXRlKCkpLnNsaWNlKC0yKSwKICAgICAgZGF5T2ZUaGVXZWVrOiB0aGlzLmdldERheSgpLAogICAgICBkYXlPZlRoZVdlZWtOYW1lOiBkYXlzQXJyYXlbdGhpcy5nZXREYXkoKV0KICAgIH07CiAgfQogIGZvcm1hdChmb3JtYXRBcmcpIHsKICAgIHJldHVybiBpbXBvcnRfZGF5anMuZGVmYXVsdCh0aGlzLmdldFRpbWUoKSkuZm9ybWF0KGZvcm1hdEFyZyk7CiAgfQogIC8qKgogICAqIGJvb2xlYW4gY2hlY2tzCiAgICovCiAgaXNUb2RheSgpIHsKICAgIHJldHVybiBpbXBvcnRfZGF5anMuZGVmYXVsdCh0aGlzLmdldFRpbWUoKSkuaXNUb2RheSgpOwogIH0KICBsZXNzVGltZVBhc3NlZFRvTm93KHVuaXRBcmdzKSB7CiAgICBjb25zdCBtYXhQYXNzZWRVbml4VGltZSA9IGdldE1pbGxpU2Vjb25kc0Zyb21Vbml0cyh1bml0QXJncyk7CiAgICBjb25zdCBhY3R1YWxQYXNzZWRVbml4VGltZSA9IERhdGUubm93KCkgLSB0aGlzLmdldFRpbWUoKTsKICAgIHJldHVybiBhY3R1YWxQYXNzZWRVbml4VGltZSA8IG1heFBhc3NlZFVuaXhUaW1lOwogIH0KICBtb3JlVGltZVBhc3NlZFRvTm93KHVuaXRBcmdzKSB7CiAgICByZXR1cm4gIXRoaXMubGVzc1RpbWVQYXNzZWRUb05vdyh1bml0QXJncyk7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0dGltZUA0LjIuMy9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnR0aW1lL2Rpc3RfdHMvc21hcnR0aW1lLmNsYXNzZXMuaHJ0bWVhc3VyZW1lbnQuanMKdmFyIEhydE1lYXN1cmVtZW50ID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkhydE1lYXN1cmVtZW50Iik7CiAgfQogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5uYW5vU2Vjb25kcyA9IG51bGw7CiAgICB0aGlzLm1pbGxpU2Vjb25kcyA9IG51bGw7CiAgICB0aGlzLl9taWxsaVN0YXJ0ID0gbnVsbDsKICAgIHRoaXMuX21pbGxpRGlmZiA9IG51bGw7CiAgICB0aGlzLl9zdGFydGVkID0gZmFsc2U7CiAgfQogIC8qKgogICAqIHN0YXJ0IHRoZSBtZWFzdXJlbWVudAogICAqLwogIHN0YXJ0KCkgewogICAgdGhpcy5fc3RhcnRlZCA9IHRydWU7CiAgICB0aGlzLl9taWxsaVN0YXJ0ID0gRGF0ZS5ub3coKTsKICB9CiAgLyoqCiAgICogc3RvcCB0aGUgbWVhc3VyZW1lbnQKICAgKi8KICBzdG9wKCkgewogICAgaWYgKHRoaXMuX3N0YXJ0ZWQgPT09IGZhbHNlKSB7CiAgICAgIGNvbnNvbGUubG9nKCJIYXNuJ3Qgc3RhcnRlZCB5ZXQiKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5fbWlsbGlEaWZmID0gRGF0ZS5ub3coKSAtIHRoaXMuX21pbGxpU3RhcnQ7CiAgICB0aGlzLm5hbm9TZWNvbmRzID0gdGhpcy5fbWlsbGlEaWZmICogMWUzOwogICAgdGhpcy5taWxsaVNlY29uZHMgPSB0aGlzLl9taWxsaURpZmY7CiAgICByZXR1cm4gdGhpczsKICB9CiAgLyoqCiAgICogcmVzZXQgdGhlIG1lYXN1cmVtZW50CiAgICovCiAgcmVzZXQoKSB7CiAgICB0aGlzLm5hbm9TZWNvbmRzID0gbnVsbDsKICAgIHRoaXMubWlsbGlTZWNvbmRzID0gbnVsbDsKICAgIHRoaXMuX21pbGxpU3RhcnQgPSBudWxsOwogICAgdGhpcy5fbWlsbGlEaWZmID0gbnVsbDsKICAgIHRoaXMuX3N0YXJ0ZWQgPSBmYWxzZTsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR0aW1lQDQuMi4zL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHRpbWUvZGlzdF90cy9zbWFydHRpbWUuY2xhc3Nlcy5pbnRlcnZhbC5qcwp2YXIgSW50ZXJ2YWwgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiSW50ZXJ2YWwiKTsKICB9CiAgY29uc3RydWN0b3IoaW50ZXJ2YWxNaWxsaXNlbmNvbmRzQXJnKSB7CiAgICB0aGlzLnN0YXR1cyA9ICJpbml0aWFsIjsKICAgIHRoaXMuc3RhdHVzQXV0aG9yaXphdGlvbiA9IG51bGw7CiAgICB0aGlzLmludGVydmFsSm9icyA9IFtdOwogICAgdGhpcy5pbnRlcnZhbE1pbGxpc2Vjb25kcyA9IGludGVydmFsTWlsbGlzZW5jb25kc0FyZzsKICB9CiAgc3RhcnQoKSB7CiAgICB0aGlzLnN0YXR1cyA9ICJzdGFydGVkIjsKICAgIGNvbnN0IHN0YXR1c0F1dGggPSAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKTsKICAgIHRoaXMuc3RhdHVzQXV0aG9yaXphdGlvbiA9IHN0YXR1c0F1dGg7CiAgICBjb25zdCBydW5JbnRlcnZhbCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoYXN5bmMgKCkgPT4gewogICAgICB3aGlsZSAodGhpcy5zdGF0dXMgPT09ICJzdGFydGVkIiAmJiB0aGlzLnN0YXR1c0F1dGhvcml6YXRpb24gPT09IHN0YXR1c0F1dGgpIHsKICAgICAgICBhd2FpdCBkaXN0X3RzX2V4cG9ydHMzLmRlbGF5Rm9yKHRoaXMuaW50ZXJ2YWxNaWxsaXNlY29uZHMpOwogICAgICAgIHRoaXMuZXhlY3V0ZUludGVydmFsSm9icygpOwogICAgICB9CiAgICB9LCAicnVuSW50ZXJ2YWwiKTsKICAgIHJ1bkludGVydmFsKCk7CiAgfQogIHN0b3AoKSB7CiAgICB0aGlzLnN0YXR1cyA9ICJzdG9wcGVkIjsKICAgIHRoaXMuc3RhdHVzQXV0aG9yaXphdGlvbiA9IG51bGw7CiAgfQogIGFkZEludGVydmFsSm9iKGZ1bmNBcmcpIHsKICAgIHRoaXMuaW50ZXJ2YWxKb2JzLnB1c2goZnVuY0FyZyk7CiAgfQogIGV4ZWN1dGVJbnRlcnZhbEpvYnMoKSB7CiAgICBmb3IgKGNvbnN0IGZ1bmNBcmcgb2YgdGhpcy5pbnRlcnZhbEpvYnMpIHsKICAgICAgZnVuY0FyZygpOwogICAgfQogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHRpbWVANC4yLjMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0dGltZS9kaXN0X3RzL3NtYXJ0dGltZS5jbGFzc2VzLnRpbWVzdGFtcC5qcwp2YXIgVGltZVN0YW1wID0gY2xhc3MgX1RpbWVTdGFtcCB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiVGltZVN0YW1wIik7CiAgfQogIC8qKgogICAqIHJldHVybnMgbmV3IFRpbWVTdGFtcCBmcm9tIG1pbGxpc2Vjb25kcwogICAqLwogIHN0YXRpYyBmcm9tTWlsbGlTZWNvbmRzKG1pbGxpU2Vjb25kc0FyZykgewogICAgcmV0dXJuIG5ldyBfVGltZVN0YW1wKG1pbGxpU2Vjb25kc0FyZyk7CiAgfQogIC8qKgogICAqIHJldHVybnMgbmV3IFRpbWVTdGFtcCBmb3Igbm93IHdpdGggY2hhbmdlIHNldAogICAqIEBwYXJhbSB0aW1lU3RhbXBBcmcKICAgKi8KICBzdGF0aWMgZnJvbVRpbWVTdGFtcCh0aW1lU3RhbXBBcmcpIHsKICAgIGNvbnN0IGxvY2FsVGltZVN0YW1wID0gbmV3IF9UaW1lU3RhbXAoKTsKICAgIGxvY2FsVGltZVN0YW1wLmNoYW5nZSA9IGxvY2FsVGltZVN0YW1wLm1pbGxpU2Vjb25kcyAtIHRpbWVTdGFtcEFyZy5taWxsaVNlY29uZHM7CiAgICByZXR1cm4gbG9jYWxUaW1lU3RhbXA7CiAgfQogIGNvbnN0cnVjdG9yKGNyZWF0b3JBcmcpIHsKICAgIHRoaXMuY2hhbmdlID0gbnVsbDsKICAgIGlmICghY3JlYXRvckFyZykgewogICAgICB0aGlzLmRhdGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKTsKICAgIH0gZWxzZSBpZiAodHlwZW9mIGNyZWF0b3JBcmcgPT09ICJudW1iZXIiKSB7CiAgICAgIHRoaXMuZGF0ZSA9IG5ldyBEYXRlKGNyZWF0b3JBcmcpOwogICAgfQogICAgdGhpcy5taWxsaVNlY29uZHMgPSB0aGlzLmRhdGUuZ2V0VGltZSgpOwogICAgdGhpcy5lcG9jaHRpbWUgPSBNYXRoLmZsb29yKHRoaXMubWlsbGlTZWNvbmRzIC8gMWUzKTsKICB9CiAgLyoqCiAgICogcmV0dXJucyBhIGJvb2xlYW4gZm9yIHdldGhlciB0aGUgdGltZXN0YW1wIGlzIG9sZGVyIHRoYW4gYW5vdGhlciB0aW1lc3RhbXAKICAgKiBAcGFyYW0gVGltZVN0YW1wQXJnCiAgICogQHBhcmFtIHRyZXNob2xkVGltZUFyZwogICAqLwogIGlzT2xkZXJUaGFuT3RoZXJUaW1lU3RhbXAoVGltZVN0YW1wQXJnLCB0cmVzaG9sZFRpbWVBcmcgPSAwKSB7CiAgICBpZiAodGhpcy5taWxsaVNlY29uZHMgPCBUaW1lU3RhbXBBcmcubWlsbGlTZWNvbmRzIC0gdHJlc2hvbGRUaW1lQXJnKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICAvKioKICAgKiBJcyB0aGUgY3VycmVudCBpbnN0YW5jZSBvbGRlciB0aGFuIHRoZSBhcmd1bWVudAogICAqIEBwYXJhbSBUaW1lU3RhbXBBcmcKICAgKi8KICBpc09sZGVyVGhhbihUaW1lU3RhbXBBcmcsIHRyZXNob2xkVGltZUFyZyA9IDApIHsKICAgIGlmICh0aGlzLm1pbGxpU2Vjb25kcyArIHRyZXNob2xkVGltZUFyZyA8IFRpbWVTdGFtcEFyZy5taWxsaVNlY29uZHMpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQogIC8qKgogICAqIHJldHVybnMgYSBib29sZWFuIGZvciB3ZXRoZXIgdGhlIHRpbWVzdGFtcCBpcyB5b3VuZ2VyIHRoYW4gYW5vdGhlciB0aW1lc3RhbXAKICAgKiBAcGFyYW0gVGltZVN0YW1wQXJnCiAgICogQHBhcmFtIHRyZXNob2xkVGltZUFyZwogICAqLwogIGlzWW91bmdlclRoYW5PdGhlclRpbWVTdGFtcChUaW1lU3RhbXBBcmcsIHRyZXNob2xkVGltZUFyZyA9IDApIHsKICAgIGlmICh0aGlzLm1pbGxpU2Vjb25kcyA+IFRpbWVTdGFtcEFyZy5taWxsaVNlY29uZHMgKyB0cmVzaG9sZFRpbWVBcmcpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQogIGlzWW91bmdlclRoYW5NaWxsaVNlY29uZHMobWlsbGlzZWNvbmRBcmcpIHsKICAgIGNvbnN0IG5vd1RpbWVTdGFtcCA9IG5ldyBfVGltZVN0YW1wKCk7CiAgICBjb25zdCBjb21wYXJlRXBvY2hUaW1lID0gbm93VGltZVN0YW1wLmVwb2NodGltZSAtIG1pbGxpc2Vjb25kQXJnOwogICAgY29uc3QgY29tcGFyZVRpbWVTdGFtcCA9IG5ldyBfVGltZVN0YW1wKGNvbXBhcmVFcG9jaFRpbWUpOwogICAgcmV0dXJuIHRoaXMuaXNZb3VuZ2VyVGhhbk90aGVyVGltZVN0YW1wKGNvbXBhcmVUaW1lU3RhbXApOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHRpbWVANC4yLjMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0dGltZS9kaXN0X3RzL3NtYXJ0dGltZS5jbGFzc2VzLnRpbWVyLmpzCnZhciBUaW1lciA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJUaW1lciIpOwogIH0KICBnZXQgdGltZUxlZnQoKSB7CiAgICByZXR1cm4gdGhpcy50aW1lSW5NaWxsaXNlY29uZHMgLSB0aGlzLnBhdXNlZEF0LmNoYW5nZTsKICB9CiAgY29uc3RydWN0b3IodGltZUluTWlsbGlzZWNvbmRzQXJnKSB7CiAgICB0aGlzLnN0YXRlID0gImluaXRpYXRlZCI7CiAgICB0aGlzLmNvbXBsZXRlZERlZmVycmVkID0gZGlzdF90c19leHBvcnRzLmRlZmVyKCk7CiAgICB0aGlzLnRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVJbk1pbGxpc2Vjb25kc0FyZzsKICAgIHRoaXMuY29tcGxldGVkID0gdGhpcy5jb21wbGV0ZWREZWZlcnJlZC5wcm9taXNlOwogIH0KICAvKioKICAgKiBzdGFydHMgdGhlIHRpbWVyCiAgICovCiAgc3RhcnQoKSB7CiAgICBpZiAoIXRoaXMuc3RhcnRlZEF0KSB7CiAgICAgIHRoaXMuY3VycmVudFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICB0aGlzLmNvbXBsZXRlZERlZmVycmVkLnJlc29sdmUoKTsKICAgICAgfSwgdGhpcy50aW1lSW5NaWxsaXNlY29uZHMpOwogICAgICB0aGlzLnN0YXJ0ZWRBdCA9IG5ldyBUaW1lU3RhbXAoKTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigidGltZXIgaGFzIGJlZW4gc3RhcnRlZCBiZWZvcmUuIFBsZWFzZSB1c2UgcmVzdW1lIGluc3RlYWQiKTsKICAgIH0KICB9CiAgcGF1c2UoKSB7CiAgICBpZiAodGhpcy5zdGFydGVkQXQpIHsKICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuY3VycmVudFRpbWVvdXQpOwogICAgICB0aGlzLmN1cnJlbnRUaW1lb3V0ID0gbnVsbDsKICAgICAgdGhpcy5wYXVzZWRBdCA9IFRpbWVTdGFtcC5mcm9tVGltZVN0YW1wKHRoaXMuc3RhcnRlZEF0KTsKICAgIH0KICB9CiAgcmVzdW1lKCkgewogICAgaWYgKHRoaXMuc3RhcnRlZEF0KSB7CiAgICAgIHRoaXMuY3VycmVudFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICB0aGlzLmNvbXBsZXRlZERlZmVycmVkLnJlc29sdmUoKTsKICAgICAgfSwgdGhpcy50aW1lTGVmdCk7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRXJyb3IoInRpbWVyIGhhcyBOT1QgYmVlbiBzdGFydGVkIGJlZm9yZS4gUGxlYXNlIHVzZSAuc3RhcnQoKSBpbnN0ZWFkIik7CiAgICB9CiAgfQogIHJlc2V0KCkgewogICAgdGhpcy5wYXVzZSgpOwogICAgdGhpcy5zdGFydGVkQXQgPSBudWxsOwogICAgdGhpcy5wYXVzZWRBdCA9IG51bGw7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjQuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvY2xhc3Nlcy5wbHVnaW5zLmpzCnZhciBpbXBvcnRfc3ltYm9sX3RyZWUgPSBfX3RvRVNNKHJlcXVpcmVfU3ltYm9sVHJlZSgpLCAxKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytsaWtANi40LjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2xpay9kaXN0X3RzL2NsYXNzZXMuYXN5bmNleGVjdXRpb25zdGFjay5qcwp2YXIgQXN5bmNFeGVjdXRpb25TdGFjayA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJBc3luY0V4ZWN1dGlvblN0YWNrIik7CiAgfQogIGV4ZWN1dGlvblNsb3RzID0gW107CiAgaXNQcm9jZXNzaW5nID0gZmFsc2U7CiAgLyoqIE1heGltdW0gY29uY3VycmVudCBub24tZXhjbHVzaXZlIHRhc2tzIChJbmZpbml0eSA9IHVubGltaXRlZCkgKi8KICBub25FeGNsdXNpdmVNYXhDb25jdXJyZW5jeSA9IEluZmluaXR5OwogIC8qKiBDdXJyZW50bHkgcnVubmluZyBub24tZXhjbHVzaXZlIHRhc2sgY291bnQgKi8KICBub25FeGNsdXNpdmVDdXJyZW50Q291bnQgPSAwOwogIC8qKiBRdWV1ZSBvZiByZXNvbHZlcnMgd2FpdGluZyBmb3IgYSBub24tZXhjbHVzaXZlIHNsb3QgKi8KICBub25FeGNsdXNpdmVQZW5kaW5nUXVldWUgPSBbXTsKICBhc3luYyBnZXRFeGNsdXNpdmVFeGVjdXRpb25TbG90KGZ1bmNBcmcsIHRpbWVvdXRBcmcpIHsKICAgIGNvbnN0IGV4ZWN1dGlvbkRlZmVycmVkID0gZGlzdF90c19leHBvcnRzLmRlZmVyKCk7CiAgICBjb25zdCBleGVjdXRpb25TbG90ID0gewogICAgICBmdW5jVG9FeGVjdXRlOiBmdW5jQXJnLAogICAgICBleGVjdXRpb25EZWZlcnJlZCwKICAgICAgdGltZW91dDogdGltZW91dEFyZywKICAgICAgbW9kZTogImV4Y2x1c2l2ZSIKICAgIH07CiAgICB0aGlzLmV4ZWN1dGlvblNsb3RzLnB1c2goZXhlY3V0aW9uU2xvdCk7CiAgICB0aGlzLnByb2Nlc3NFeGVjdXRpb25TbG90cygpOwogICAgcmV0dXJuIGV4ZWN1dGlvbkRlZmVycmVkLnByb21pc2U7CiAgfQogIGFzeW5jIGdldE5vbkV4Y2x1c2l2ZUV4ZWN1dGlvblNsb3QoZnVuY0FyZywgdGltZW91dEFyZykgewogICAgY29uc3QgZXhlY3V0aW9uRGVmZXJyZWQgPSBkaXN0X3RzX2V4cG9ydHMuZGVmZXIoKTsKICAgIGNvbnN0IGV4ZWN1dGlvblNsb3QgPSB7CiAgICAgIGZ1bmNUb0V4ZWN1dGU6IGZ1bmNBcmcsCiAgICAgIGV4ZWN1dGlvbkRlZmVycmVkLAogICAgICB0aW1lb3V0OiB0aW1lb3V0QXJnLAogICAgICBtb2RlOiAibm9uZXhjbHVzaXZlIgogICAgfTsKICAgIHRoaXMuZXhlY3V0aW9uU2xvdHMucHVzaChleGVjdXRpb25TbG90KTsKICAgIHRoaXMucHJvY2Vzc0V4ZWN1dGlvblNsb3RzKCk7CiAgICByZXR1cm4gZXhlY3V0aW9uRGVmZXJyZWQucHJvbWlzZTsKICB9CiAgLyoqCiAgICogU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25jdXJyZW50IG5vbi1leGNsdXNpdmUgdGFza3MuCiAgICogQHBhcmFtIGNvbmN1cnJlbmN5IG1pbmltdW0gMSAoSW5maW5pdHkgbWVhbnMgdW5saW1pdGVkKQogICAqLwogIHNldE5vbkV4Y2x1c2l2ZU1heENvbmN1cnJlbmN5KGNvbmN1cnJlbmN5KSB7CiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShjb25jdXJyZW5jeSkgfHwgY29uY3VycmVuY3kgPCAxKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigibm9uRXhjbHVzaXZlTWF4Q29uY3VycmVuY3kgbXVzdCBiZSBhIGZpbml0ZSBudW1iZXIgPj0gMSIpOwogICAgfQogICAgdGhpcy5ub25FeGNsdXNpdmVNYXhDb25jdXJyZW5jeSA9IGNvbmN1cnJlbmN5OwogIH0KICAvKiogR2V0IHRoZSBjb25maWd1cmVkIG1heCBjb25jdXJyZW5jeSBmb3Igbm9uLWV4Y2x1c2l2ZSB0YXNrcyAqLwogIGdldE5vbkV4Y2x1c2l2ZU1heENvbmN1cnJlbmN5KCkgewogICAgcmV0dXJuIHRoaXMubm9uRXhjbHVzaXZlTWF4Q29uY3VycmVuY3k7CiAgfQogIC8qKiBOdW1iZXIgb2Ygbm9uLWV4Y2x1c2l2ZSB0YXNrcyBjdXJyZW50bHkgcnVubmluZyAqLwogIGdldEFjdGl2ZU5vbkV4Y2x1c2l2ZUNvdW50KCkgewogICAgcmV0dXJuIHRoaXMubm9uRXhjbHVzaXZlQ3VycmVudENvdW50OwogIH0KICAvKiogTnVtYmVyIG9mIG5vbi1leGNsdXNpdmUgdGFza3Mgd2FpdGluZyBmb3IgYSBmcmVlIHNsb3QgKi8KICBnZXRQZW5kaW5nTm9uRXhjbHVzaXZlQ291bnQoKSB7CiAgICByZXR1cm4gdGhpcy5ub25FeGNsdXNpdmVQZW5kaW5nUXVldWUubGVuZ3RoOwogIH0KICBhc3luYyBwcm9jZXNzRXhlY3V0aW9uU2xvdHMoKSB7CiAgICBpZiAodGhpcy5pc1Byb2Nlc3NpbmcpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5pc1Byb2Nlc3NpbmcgPSB0cnVlOwogICAgd2hpbGUgKHRoaXMuZXhlY3V0aW9uU2xvdHMubGVuZ3RoID4gMCkgewogICAgICBjb25zdCBjdXJyZW50U2xvdCA9IHRoaXMuZXhlY3V0aW9uU2xvdHNbMF07CiAgICAgIGlmIChjdXJyZW50U2xvdC5tb2RlID09PSAiZXhjbHVzaXZlIikgewogICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZUV4Y2x1c2l2ZVNsb3QoY3VycmVudFNsb3QpOwogICAgICAgIHRoaXMuZXhlY3V0aW9uU2xvdHMuc2hpZnQoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBub25FeGNsdXNpdmVTbG90cyA9IFtdOwogICAgICAgIHdoaWxlICh0aGlzLmV4ZWN1dGlvblNsb3RzLmxlbmd0aCA+IDAgJiYgdGhpcy5leGVjdXRpb25TbG90c1swXS5tb2RlID09PSAibm9uZXhjbHVzaXZlIikgewogICAgICAgICAgbm9uRXhjbHVzaXZlU2xvdHMucHVzaCh0aGlzLmV4ZWN1dGlvblNsb3RzLnNoaWZ0KCkpOwogICAgICAgIH0KICAgICAgICBhd2FpdCB0aGlzLmV4ZWN1dGVOb25FeGNsdXNpdmVTbG90cyhub25FeGNsdXNpdmVTbG90cyk7CiAgICAgIH0KICAgIH0KICAgIHRoaXMuaXNQcm9jZXNzaW5nID0gZmFsc2U7CiAgfQogIGFzeW5jIGV4ZWN1dGVFeGNsdXNpdmVTbG90KHNsb3QpIHsKICAgIHRyeSB7CiAgICAgIGlmIChzbG90LnRpbWVvdXQpIHsKICAgICAgICBjb25zdCB0aW1lb3V0SW5zdGFuY2UgPSBuZXcgZGlzdF90c19leHBvcnRzMy5UaW1lb3V0KHNsb3QudGltZW91dCk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UucmFjZShbCiAgICAgICAgICAgIHNsb3QuZnVuY1RvRXhlY3V0ZSgpLAogICAgICAgICAgICB0aW1lb3V0SW5zdGFuY2UucHJvbWlzZS50aGVuKCgpID0+IHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRpbWVvdXQgcmVhY2hlZCIpOwogICAgICAgICAgICB9KQogICAgICAgICAgXSk7CiAgICAgICAgICB0aW1lb3V0SW5zdGFuY2UuY2FuY2VsKCk7CiAgICAgICAgICBzbG90LmV4ZWN1dGlvbkRlZmVycmVkLnJlc29sdmUocmVzdWx0KTsKICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgdGltZW91dEluc3RhbmNlLmNhbmNlbCgpOwogICAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNsb3QuZnVuY1RvRXhlY3V0ZSgpOwogICAgICAgIHNsb3QuZXhlY3V0aW9uRGVmZXJyZWQucmVzb2x2ZShyZXN1bHQpOwogICAgICB9CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBzbG90LmV4ZWN1dGlvbkRlZmVycmVkLnJlamVjdChlcnJvcik7CiAgICB9CiAgfQogIGFzeW5jIGV4ZWN1dGVOb25FeGNsdXNpdmVTbG90cyhzbG90cykgewogICAgY29uc3QgcHJvbWlzZXMgPSBzbG90cy5tYXAoYXN5bmMgKHNsb3QpID0+IHsKICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yTm9uRXhjbHVzaXZlU2xvdCgpOwogICAgICB0cnkgewogICAgICAgIGlmIChzbG90LnRpbWVvdXQpIHsKICAgICAgICAgIGNvbnN0IHRpbWVvdXRJbnN0YW5jZSA9IG5ldyBkaXN0X3RzX2V4cG9ydHMzLlRpbWVvdXQoc2xvdC50aW1lb3V0KTsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UucmFjZShbCiAgICAgICAgICAgICAgc2xvdC5mdW5jVG9FeGVjdXRlKCksCiAgICAgICAgICAgICAgdGltZW91dEluc3RhbmNlLnByb21pc2UudGhlbigoKSA9PiB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRpbWVvdXQgcmVhY2hlZCIpOwogICAgICAgICAgICAgIH0pCiAgICAgICAgICAgIF0pOwogICAgICAgICAgICB0aW1lb3V0SW5zdGFuY2UuY2FuY2VsKCk7CiAgICAgICAgICAgIHNsb3QuZXhlY3V0aW9uRGVmZXJyZWQucmVzb2x2ZShyZXN1bHQpOwogICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgdGltZW91dEluc3RhbmNlLmNhbmNlbCgpOwogICAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2xvdC5mdW5jVG9FeGVjdXRlKCk7CiAgICAgICAgICBzbG90LmV4ZWN1dGlvbkRlZmVycmVkLnJlc29sdmUocmVzdWx0KTsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgc2xvdC5leGVjdXRpb25EZWZlcnJlZC5yZWplY3QoZXJyb3IpOwogICAgICB9IGZpbmFsbHkgewogICAgICAgIHRoaXMucmVsZWFzZU5vbkV4Y2x1c2l2ZVNsb3QoKTsKICAgICAgfQogICAgfSk7CiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7CiAgfQogIC8qKgogICAqIFdhaXQgdW50aWwgYSBub24tZXhjbHVzaXZlIHNsb3QgaXMgYXZhaWxhYmxlIChyZXNwZWN0cyBtYXggY29uY3VycmVuY3kpLgogICAqLwogIHdhaXRGb3JOb25FeGNsdXNpdmVTbG90KCkgewogICAgaWYgKHRoaXMubm9uRXhjbHVzaXZlQ3VycmVudENvdW50IDwgdGhpcy5ub25FeGNsdXNpdmVNYXhDb25jdXJyZW5jeSkgewogICAgICB0aGlzLm5vbkV4Y2x1c2l2ZUN1cnJlbnRDb3VudCsrOwogICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7CiAgICB9CiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUyKSA9PiB7CiAgICAgIHRoaXMubm9uRXhjbHVzaXZlUGVuZGluZ1F1ZXVlLnB1c2goKCkgPT4gewogICAgICAgIHRoaXMubm9uRXhjbHVzaXZlQ3VycmVudENvdW50Kys7CiAgICAgICAgcmVzb2x2ZTIoKTsKICAgICAgfSk7CiAgICB9KTsKICB9CiAgLyoqIFJlbGVhc2UgYSBub24tZXhjbHVzaXZlIHNsb3QgYW5kIHdha2UgdGhlIG5leHQgd2FpdGVyLCBpZiBhbnkuICovCiAgcmVsZWFzZU5vbkV4Y2x1c2l2ZVNsb3QoKSB7CiAgICB0aGlzLm5vbkV4Y2x1c2l2ZUN1cnJlbnRDb3VudC0tOwogICAgY29uc3QgbmV4dDIgPSB0aGlzLm5vbkV4Y2x1c2l2ZVBlbmRpbmdRdWV1ZS5zaGlmdCgpOwogICAgaWYgKG5leHQyKSB7CiAgICAgIG5leHQyKCk7CiAgICB9CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjQuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvY2xhc3Nlcy5iYWNrcHJlc3N1cmVkYXJyYXkuanMKdmFyIEJhY2twcmVzc3VyZWRBcnJheSA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJCYWNrcHJlc3N1cmVkQXJyYXkiKTsKICB9CiAgZGF0YTsKICBoaWdoV2F0ZXJNYXJrOwogIGhhc1NwYWNlID0gbmV3IGRpc3RfdHNfZXhwb3J0czIucnhqcy5TdWJqZWN0KCk7CiAgaXRlbXNBdmFpbGFibGUgPSBuZXcgZGlzdF90c19leHBvcnRzMi5yeGpzLlN1YmplY3QoKTsKICBpc0Rlc3Ryb3llZCA9IGZhbHNlOwogIGNvbnN0cnVjdG9yKGhpZ2hXYXRlck1hcmsgPSAxNikgewogICAgdGhpcy5kYXRhID0gW107CiAgICB0aGlzLmhpZ2hXYXRlck1hcmsgPSBoaWdoV2F0ZXJNYXJrOwogIH0KICBnZXQgbGVuZ3RoKCkgewogICAgcmV0dXJuIHRoaXMuZGF0YS5sZW5ndGg7CiAgfQogIHB1c2goaXRlbSkgewogICAgdGhpcy5kYXRhLnB1c2goaXRlbSk7CiAgICB0aGlzLml0ZW1zQXZhaWxhYmxlLm5leHQoIml0ZW1zQXZhaWxhYmxlIik7CiAgICBjb25zdCBzcGFjZUF2YWlsYWJsZSA9IHRoaXMuY2hlY2tTcGFjZUF2YWlsYWJsZSgpOwogICAgaWYgKHNwYWNlQXZhaWxhYmxlKSB7CiAgICAgIHRoaXMuaGFzU3BhY2UubmV4dCgiaGFzU3BhY2UiKTsKICAgIH0KICAgIHJldHVybiBzcGFjZUF2YWlsYWJsZTsKICB9CiAgcHVzaE1hbnkoaXRlbXMpIHsKICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykgewogICAgICB0aGlzLnB1c2goaXRlbSk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5jaGVja1NwYWNlQXZhaWxhYmxlKCk7CiAgfQogIHNoaWZ0KCkgewogICAgY29uc3QgaXRlbSA9IHRoaXMuZGF0YS5zaGlmdCgpOwogICAgaWYgKHRoaXMuY2hlY2tTcGFjZUF2YWlsYWJsZSgpKSB7CiAgICAgIHRoaXMuaGFzU3BhY2UubmV4dCgiaGFzU3BhY2UiKTsKICAgIH0KICAgIHJldHVybiBpdGVtOwogIH0KICBwZWVrKCkgewogICAgcmV0dXJuIHRoaXMuZGF0YVswXTsKICB9CiAgY2hlY2tTcGFjZUF2YWlsYWJsZSgpIHsKICAgIHJldHVybiB0aGlzLmRhdGEubGVuZ3RoIDwgdGhpcy5oaWdoV2F0ZXJNYXJrOwogIH0KICBjaGVja0hhc0l0ZW1zKCkgewogICAgcmV0dXJuIHRoaXMuZGF0YS5sZW5ndGggPiAwOwogIH0KICB3YWl0Rm9yU3BhY2UoKSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUyKSA9PiB7CiAgICAgIGlmICh0aGlzLmNoZWNrU3BhY2VBdmFpbGFibGUoKSB8fCB0aGlzLmlzRGVzdHJveWVkKSB7CiAgICAgICAgcmVzb2x2ZTIoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSB0aGlzLmhhc1NwYWNlLnN1YnNjcmliZSh7CiAgICAgICAgICBuZXh0OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKCgpID0+IHsKICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgIHJlc29sdmUyKCk7CiAgICAgICAgICB9LCAibmV4dCIpLAogICAgICAgICAgY29tcGxldGU6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKCkgPT4gewogICAgICAgICAgICByZXNvbHZlMigpOwogICAgICAgICAgfSwgImNvbXBsZXRlIikKICAgICAgICB9KTsKICAgICAgfQogICAgfSk7CiAgfQogIHdhaXRGb3JJdGVtcygpIHsKICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTIpID0+IHsKICAgICAgaWYgKHRoaXMuZGF0YS5sZW5ndGggPiAwIHx8IHRoaXMuaXNEZXN0cm95ZWQpIHsKICAgICAgICByZXNvbHZlMigpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHRoaXMuaXRlbXNBdmFpbGFibGUuc3Vic2NyaWJlKHsKICAgICAgICAgIG5leHQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKCkgPT4gewogICAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgcmVzb2x2ZTIoKTsKICAgICAgICAgIH0sICJuZXh0IiksCiAgICAgICAgICBjb21wbGV0ZTogLyogQF9fUFVSRV9fICovIF9fbmFtZSgoKSA9PiB7CiAgICAgICAgICAgIHJlc29sdmUyKCk7CiAgICAgICAgICB9LCAiY29tcGxldGUiKQogICAgICAgIH0pOwogICAgICB9CiAgICB9KTsKICB9CiAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7CiAgICByZXR1cm4gdGhpcy5kYXRhW1N5bWJvbC5pdGVyYXRvcl0oKTsKICB9CiAgLyoqCiAgICogZGVzdHJveXMgdGhlIEJhY2twcmVzc3VyZWRBcnJheSwgY29tcGxldGluZyBhbGwgc3ViamVjdHMKICAgKi8KICBkZXN0cm95KCkgewogICAgdGhpcy5pc0Rlc3Ryb3llZCA9IHRydWU7CiAgICB0aGlzLmhhc1NwYWNlLmNvbXBsZXRlKCk7CiAgICB0aGlzLml0ZW1zQXZhaWxhYmxlLmNvbXBsZXRlKCk7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjQuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvY2xhc3Nlcy5mYXN0bWFwLmpzCnZhciBGYXN0TWFwID0gY2xhc3MgX0Zhc3RNYXAgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkZhc3RNYXAiKTsKICB9CiAgbWFwT2JqZWN0ID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICBpc1VuaXF1ZUtleShrZXlBcmcpIHsKICAgIHJldHVybiAhdGhpcy5tYXBPYmplY3QuaGFzKGtleUFyZyk7CiAgfQogIGhhcyhrZXlBcmcpIHsKICAgIHJldHVybiB0aGlzLm1hcE9iamVjdC5oYXMoa2V5QXJnKTsKICB9CiAgZ2V0IHNpemUoKSB7CiAgICByZXR1cm4gdGhpcy5tYXBPYmplY3Quc2l6ZTsKICB9CiAgYWRkVG9NYXAoa2V5QXJnLCBvYmplY3RBcmcsIG9wdGlvbnNBcmcpIHsKICAgIGlmICh0aGlzLmlzVW5pcXVlS2V5KGtleUFyZykgfHwgb3B0aW9uc0FyZyAmJiBvcHRpb25zQXJnLmZvcmNlKSB7CiAgICAgIHRoaXMubWFwT2JqZWN0LnNldChrZXlBcmcsIG9iamVjdEFyZyk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICBnZXRCeUtleShrZXlBcmcpIHsKICAgIHJldHVybiB0aGlzLm1hcE9iamVjdC5nZXQoa2V5QXJnKTsKICB9CiAgcmVtb3ZlRnJvbU1hcChrZXlBcmcpIHsKICAgIGNvbnN0IHJlbW92ZWRJdGVtID0gdGhpcy5tYXBPYmplY3QuZ2V0KGtleUFyZyk7CiAgICB0aGlzLm1hcE9iamVjdC5kZWxldGUoa2V5QXJnKTsKICAgIHJldHVybiByZW1vdmVkSXRlbTsKICB9CiAgZ2V0S2V5cygpIHsKICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMubWFwT2JqZWN0LmtleXMoKSk7CiAgfQogIHZhbHVlcygpIHsKICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMubWFwT2JqZWN0LnZhbHVlcygpKTsKICB9CiAgZW50cmllcygpIHsKICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMubWFwT2JqZWN0LmVudHJpZXMoKSk7CiAgfQogIGNsZWFuKCkgewogICAgdGhpcy5tYXBPYmplY3QuY2xlYXIoKTsKICB9CiAgLyoqCiAgICogcmV0dXJucyBhIG5ldyBGYXN0bWFwIHRoYXQgaW5jbHVkZXMgYWxsIHZhbHVlcyBmcm9tIHRoaXMgYW5kIGFsbCBmcm9tIHRoZSBmYXN0bWFwIGluIHRoZSBhcmd1bWVudAogICAqLwogIGNvbmNhdChmYXN0TWFwQXJnKSB7CiAgICBjb25zdCBjb25jYXRlZEZhc3RtYXAgPSBuZXcgX0Zhc3RNYXAoKTsKICAgIGZvciAoY29uc3Qga2V5MiBvZiB0aGlzLmdldEtleXMoKSkgewogICAgICBjb25jYXRlZEZhc3RtYXAuYWRkVG9NYXAoa2V5MiwgdGhpcy5nZXRCeUtleShrZXkyKSk7CiAgICB9CiAgICBmb3IgKGNvbnN0IGtleTIgb2YgZmFzdE1hcEFyZy5nZXRLZXlzKCkpIHsKICAgICAgY29uY2F0ZWRGYXN0bWFwLmFkZFRvTWFwKGtleTIsIGZhc3RNYXBBcmcuZ2V0QnlLZXkoa2V5MiksIHsKICAgICAgICBmb3JjZTogdHJ1ZQogICAgICB9KTsKICAgIH0KICAgIHJldHVybiBjb25jYXRlZEZhc3RtYXA7CiAgfQogIC8qKgogICAqIHRyaWVzIHRvIG1lcmdlIGFub3RoZXIgRmFzdG1hcAogICAqIE5vdGU6IHVuaXF1ZUtleUNvbGxpc2lvbnMgd2lsbCBjYXVzZSBvdmVyd3JpdGUKICAgKiBAcGFyYW0gZmFzdE1hcEFyZwogICAqLwogIGFkZEFsbEZyb21PdGhlcihmYXN0TWFwQXJnKSB7CiAgICBmb3IgKGNvbnN0IGtleTIgb2YgZmFzdE1hcEFyZy5nZXRLZXlzKCkpIHsKICAgICAgdGhpcy5hZGRUb01hcChrZXkyLCBmYXN0TWFwQXJnLmdldEJ5S2V5KGtleTIpLCB7CiAgICAgICAgZm9yY2U6IHRydWUKICAgICAgfSk7CiAgICB9CiAgfQogIGFzeW5jIGZpbmQoZmluZEZ1bmN0aW9uQXJnKSB7CiAgICBmb3IgKGNvbnN0IGtleTIgb2YgdGhpcy5nZXRLZXlzKCkpIHsKICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0QnlLZXkoa2V5Mik7CiAgICAgIGNvbnN0IGZpbmRGdW5jdGlvblJlc3VsdCA9IGF3YWl0IGZpbmRGdW5jdGlvbkFyZyhpdGVtKTsKICAgICAgaWYgKGZpbmRGdW5jdGlvblJlc3VsdCkgewogICAgICAgIHJldHVybiBpdGVtOwogICAgICB9CiAgICB9CiAgfQogIFtTeW1ib2wuaXRlcmF0b3JdKCkgewogICAgcmV0dXJuIHRoaXMubWFwT2JqZWN0LmVudHJpZXMoKTsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3MrbGlrQDYuNC4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9saWsvZGlzdF90cy9jbGFzc2VzLm9iamVjdG1hcC5qcwp2YXIgdW5pID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgocHJlZml4ID0gInVuaSIpID0+IHsKICByZXR1cm4gYCR7cHJlZml4fXh4eHh4eHh4eHh4YC5yZXBsYWNlKC9beHldL2csIChjMTApID0+IHsKICAgIGNvbnN0IHIxMCA9IE1hdGgucmFuZG9tKCkgKiAxNiB8IDA7CiAgICBjb25zdCB2NCA9IGMxMCA9PT0gIngiID8gcjEwIDogcjEwICYgMyB8IDg7CiAgICByZXR1cm4gdjQudG9TdHJpbmcoMTYpOwogIH0pOwp9LCAidW5pIik7CnZhciBPYmplY3RNYXAgPSBjbGFzcyBfT2JqZWN0TWFwIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJPYmplY3RNYXAiKTsKICB9CiAgZmFzdE1hcCA9IG5ldyBGYXN0TWFwKCk7CiAgcmV2ZXJzZU1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgLy8gZXZlbnRzCiAgZXZlbnRTdWJqZWN0ID0gbmV3IGRpc3RfdHNfZXhwb3J0czIucnhqcy5TdWJqZWN0KCk7CiAgLyoqCiAgICogcmV0dXJucyBhIG5ldyBpbnN0YW5jZQogICAqLwogIGNvbnN0cnVjdG9yKCkgewogIH0KICAvKioKICAgKiB0aGUgbnVtYmVyIG9mIG9iamVjdHMgaW4gdGhlIG1hcAogICAqLwogIGdldCBsZW5ndGgoKSB7CiAgICByZXR1cm4gdGhpcy5mYXN0TWFwLnNpemU7CiAgfQogIC8qKgogICAqIGFkZHMgYW4gb2JqZWN0IG1hcHBlZCB0byBhIHN0cmluZwogICAqIHRoZSBzdHJpbmcgbXVzdCBiZSB1bmlxdWUKICAgKi8KICBhZGRNYXBwZWRVbmlxdWUodW5pcXVlS2V5QXJnLCBvYmplY3RBcmcpIHsKICAgIHRoaXMuZmFzdE1hcC5hZGRUb01hcCh1bmlxdWVLZXlBcmcsIG9iamVjdEFyZyk7CiAgICB0aGlzLnJldmVyc2VNYXAuc2V0KG9iamVjdEFyZywgdW5pcXVlS2V5QXJnKTsKICB9CiAgLyoqCiAgICogZmFzdGVzdCB3YXkgdG8gZ2V0IGFuIG9iamVjdCBmcm9tIHRoZSBtYXAKICAgKiBAcGFyYW0gdW5pcXVlS2V5CiAgICovCiAgZ2V0TWFwcGVkVW5pcXVlKHVuaXF1ZUtleUFyZykgewogICAgcmV0dXJuIHRoaXMuZmFzdE1hcC5nZXRCeUtleSh1bmlxdWVLZXlBcmcpOwogIH0KICAvKioKICAgKiByZW1vdmUga2V5CiAgICogQHBhcmFtIGZ1bmN0aW9uQXJnCiAgICovCiAgcmVtb3ZlTWFwcGVkVW5pcXVlKHVuaXF1ZUtleSkgewogICAgY29uc3Qgb2JqZWN0ID0gdGhpcy5mYXN0TWFwLnJlbW92ZUZyb21NYXAodW5pcXVlS2V5KTsKICAgIGlmIChvYmplY3QgIT09IHZvaWQgMCkgewogICAgICB0aGlzLnJldmVyc2VNYXAuZGVsZXRlKG9iamVjdCk7CiAgICAgIHRoaXMuZXZlbnRTdWJqZWN0Lm5leHQoewogICAgICAgIG9wZXJhdGlvbjogInJlbW92ZSIsCiAgICAgICAgcGF5bG9hZDogb2JqZWN0CiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIG9iamVjdDsKICB9CiAgLyoqCiAgICogYWRkIG9iamVjdCB0byBPYmplY3RtYXAKICAgKiByZXR1cm5zIHRoZSBrZXkgZm9yIHRoZSBvYmplY3QgKGV4aXN0aW5nIG9yIG5ldykKICAgKi8KICBhZGQob2JqZWN0QXJnKSB7CiAgICBjb25zdCBleGlzdGluZ0tleSA9IHRoaXMucmV2ZXJzZU1hcC5nZXQob2JqZWN0QXJnKTsKICAgIGlmIChleGlzdGluZ0tleSAhPT0gdm9pZCAwKSB7CiAgICAgIHJldHVybiBleGlzdGluZ0tleTsKICAgIH0KICAgIGNvbnN0IHVuaXF1ZUtleSA9IHVuaSgia2V5Iik7CiAgICB0aGlzLmFkZE1hcHBlZFVuaXF1ZSh1bmlxdWVLZXksIG9iamVjdEFyZyk7CiAgICB0aGlzLmV2ZW50U3ViamVjdC5uZXh0KHsKICAgICAgb3BlcmF0aW9uOiAiYWRkIiwKICAgICAgcGF5bG9hZDogb2JqZWN0QXJnCiAgICB9KTsKICAgIHJldHVybiB1bmlxdWVLZXk7CiAgfQogIC8qKgogICAqIGxpa2UgLmFkZCBidXQgYWRkcyBhbiB3aG9sZSBhcnJheSBvZiBvYmplY3RzCiAgICovCiAgYWRkQXJyYXkob2JqZWN0QXJyYXlBcmcpIHsKICAgIGZvciAoY29uc3QgaXRlbSBvZiBvYmplY3RBcnJheUFyZykgewogICAgICB0aGlzLmFkZChpdGVtKTsKICAgIH0KICB9CiAgLyoqCiAgICogY2hlY2sgaWYgb2JqZWN0IGlzIGluIE9iamVjdG1hcAogICAqLwogIGNoZWNrRm9yT2JqZWN0KG9iamVjdEFyZykgewogICAgcmV0dXJuIHRoaXMucmV2ZXJzZU1hcC5oYXMob2JqZWN0QXJnKTsKICB9CiAgLyoqCiAgICogZ2V0IGtleSBmb3Igb2JqZWN0CiAgICovCiAgZ2V0S2V5Rm9yT2JqZWN0KG9iamVjdEFyZykgewogICAgcmV0dXJuIHRoaXMucmV2ZXJzZU1hcC5nZXQob2JqZWN0QXJnKSA/PyBudWxsOwogIH0KICAvKioKICAgKiBmaW5kIG9iamVjdAogICAqLwogIGFzeW5jIGZpbmQoZmluZEZ1bmN0aW9uKSB7CiAgICByZXR1cm4gdGhpcy5mYXN0TWFwLmZpbmQoZmluZEZ1bmN0aW9uKTsKICB9CiAgZmluZFN5bmMoZmluZEZ1bmN0aW9uKSB7CiAgICBmb3IgKGNvbnN0IGtleUFyZyBvZiB0aGlzLmZhc3RNYXAuZ2V0S2V5cygpKSB7CiAgICAgIGlmIChmaW5kRnVuY3Rpb24odGhpcy5mYXN0TWFwLmdldEJ5S2V5KGtleUFyZykpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TWFwcGVkVW5pcXVlKGtleUFyZyk7CiAgICAgIH0KICAgIH0KICB9CiAgLyoqCiAgICogZmluZHMgYSBzcGVjaWZpYyBlbGVtZW50IGFuZCB0aGVuIHJlbW92ZXMgaXQKICAgKi8KICBhc3luYyBmaW5kT25lQW5kUmVtb3ZlKGZpbmRGdW5jdGlvbikgewogICAgY29uc3QgZm91bmRFbGVtZW50ID0gYXdhaXQgdGhpcy5maW5kKGZpbmRGdW5jdGlvbik7CiAgICBpZiAoZm91bmRFbGVtZW50KSB7CiAgICAgIHRoaXMucmVtb3ZlKGZvdW5kRWxlbWVudCk7CiAgICB9CiAgICByZXR1cm4gZm91bmRFbGVtZW50OwogIH0KICBmaW5kT25lQW5kUmVtb3ZlU3luYyhmaW5kRnVuY3Rpb24pIHsKICAgIGNvbnN0IGZvdW5kRWxlbWVudCA9IHRoaXMuZmluZFN5bmMoZmluZEZ1bmN0aW9uKTsKICAgIGlmIChmb3VuZEVsZW1lbnQpIHsKICAgICAgdGhpcy5yZW1vdmUoZm91bmRFbGVtZW50KTsKICAgIH0KICAgIHJldHVybiBmb3VuZEVsZW1lbnQ7CiAgfQogIC8qKgogICAqIHJ1biBmdW5jdGlvbiBmb3IgZWFjaCBpdGVtIGluIE9iamVjdG1hcAogICAqLwogIGFzeW5jIGZvckVhY2goZnVuY3Rpb25BcmcpIHsKICAgIGZvciAoY29uc3Qga2V5QXJnIG9mIHRoaXMuZmFzdE1hcC5nZXRLZXlzKCkpIHsKICAgICAgYXdhaXQgZnVuY3Rpb25BcmcodGhpcy5mYXN0TWFwLmdldEJ5S2V5KGtleUFyZykpOwogICAgfQogIH0KICAvKioKICAgKiBnZXRzIGFuIG9iamVjdCBpbiB0aGUgT2JzZXJ2YWJsZW1hcCBhbmQgcmVtb3ZlcyBpdCwgc28gaXQgY2FuJ3QgYmUgcmV0cmlldmVkIGFnYWluCiAgICovCiAgZ2V0T25lQW5kUmVtb3ZlKCkgewogICAgY29uc3Qga2V5czIgPSB0aGlzLmZhc3RNYXAuZ2V0S2V5cygpOwogICAgaWYgKGtleXMyLmxlbmd0aCA9PT0gMCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGtleVRvVXNlID0ga2V5czJbMF07CiAgICAgIGNvbnN0IHJlbW92ZWRJdGVtID0gdGhpcy5mYXN0TWFwLnJlbW92ZUZyb21NYXAoa2V5VG9Vc2UpOwogICAgICB0aGlzLnJldmVyc2VNYXAuZGVsZXRlKHJlbW92ZWRJdGVtKTsKICAgICAgdGhpcy5ldmVudFN1YmplY3QubmV4dCh7CiAgICAgICAgb3BlcmF0aW9uOiAicmVtb3ZlIiwKICAgICAgICBwYXlsb2FkOiByZW1vdmVkSXRlbQogICAgICB9KTsKICAgICAgcmV0dXJuIHJlbW92ZWRJdGVtOwogICAgfQogIH0KICAvKioKICAgKiByZXR1cm5zIGEgY2xvbmVkIGFycmF5IG9mIGFsbCB0aGUgb2JqZWN0cyBjdXJyZW50bHkgaW4gdGhlIE9iamVjdG1hcAogICAqLwogIGdldEFycmF5KCkgewogICAgcmV0dXJuIHRoaXMuZmFzdE1hcC52YWx1ZXMoKTsKICB9CiAgLyoqCiAgICogY2hlY2sgaWYgT2JqZWN0bWFwIGlzdCBlbXB0eQogICAqLwogIGlzRW1wdHkoKSB7CiAgICByZXR1cm4gdGhpcy5mYXN0TWFwLnNpemUgPT09IDA7CiAgfQogIC8qKgogICAqIHJlbW92ZSBvYmplY3QgZnJvbSBPYmplY3RtYXAKICAgKi8KICByZW1vdmUob2JqZWN0QXJnKSB7CiAgICBjb25zdCBrZXlBcmcgPSB0aGlzLnJldmVyc2VNYXAuZ2V0KG9iamVjdEFyZyk7CiAgICBpZiAoa2V5QXJnICE9PSB2b2lkIDApIHsKICAgICAgY29uc3QgcmVtb3ZlZE9iamVjdCA9IHRoaXMuZmFzdE1hcC5yZW1vdmVGcm9tTWFwKGtleUFyZyk7CiAgICAgIHRoaXMucmV2ZXJzZU1hcC5kZWxldGUocmVtb3ZlZE9iamVjdCk7CiAgICAgIHRoaXMuZXZlbnRTdWJqZWN0Lm5leHQoewogICAgICAgIG9wZXJhdGlvbjogInJlbW92ZSIsCiAgICAgICAgcGF5bG9hZDogcmVtb3ZlZE9iamVjdAogICAgICB9KTsKICAgICAgcmV0dXJuIHJlbW92ZWRPYmplY3Q7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgLyoqCiAgICogd2lwZSBPYmplY3RtYXAKICAgKi8KICB3aXBlKCkgewogICAgY29uc3Qga2V5czIgPSB0aGlzLmZhc3RNYXAuZ2V0S2V5cygpOwogICAgZm9yIChjb25zdCBrZXlBcmcgb2Yga2V5czIpIHsKICAgICAgY29uc3QgcmVtb3ZlZE9iamVjdCA9IHRoaXMuZmFzdE1hcC5yZW1vdmVGcm9tTWFwKGtleUFyZyk7CiAgICAgIHRoaXMucmV2ZXJzZU1hcC5kZWxldGUocmVtb3ZlZE9iamVjdCk7CiAgICAgIHRoaXMuZXZlbnRTdWJqZWN0Lm5leHQoewogICAgICAgIG9wZXJhdGlvbjogInJlbW92ZSIsCiAgICAgICAgcGF5bG9hZDogcmVtb3ZlZE9iamVjdAogICAgICB9KTsKICAgIH0KICB9CiAgLyoqCiAgICogcmV0dXJucyBhIG5ldyBPYmplY3RtYXAgdGhhdCBpbmNsdWRlcwogICAqLwogIGNvbmNhdChvYmplY3RNYXBBcmcpIHsKICAgIGNvbnN0IGNvbmNhdHRlZE9iamVjdE1hcCA9IG5ldyBfT2JqZWN0TWFwKCk7CiAgICBjb25jYXR0ZWRPYmplY3RNYXAuZmFzdE1hcC5hZGRBbGxGcm9tT3RoZXIodGhpcy5mYXN0TWFwKTsKICAgIGNvbmNhdHRlZE9iamVjdE1hcC5mYXN0TWFwLmFkZEFsbEZyb21PdGhlcihvYmplY3RNYXBBcmcuZmFzdE1hcCk7CiAgICBmb3IgKGNvbnN0IGtleTIgb2YgY29uY2F0dGVkT2JqZWN0TWFwLmZhc3RNYXAuZ2V0S2V5cygpKSB7CiAgICAgIGNvbmNhdHRlZE9iamVjdE1hcC5yZXZlcnNlTWFwLnNldChjb25jYXR0ZWRPYmplY3RNYXAuZmFzdE1hcC5nZXRCeUtleShrZXkyKSwga2V5Mik7CiAgICB9CiAgICByZXR1cm4gY29uY2F0dGVkT2JqZWN0TWFwOwogIH0KICAvKioKICAgKiB0cmllcyB0byBtZXJnZSBhbm90aGVyIE9iamVjdG1hcAogICAqIE5vdGU6IHVuaXF1ZUtleUNvbGxpc2lvbnMgd2lsbCBjYXVzZSBvdmVyd3JpdGUKICAgKiBAcGFyYW0gb2JqZWN0TWFwQXJnCiAgICovCiAgYWRkQWxsRnJvbU90aGVyKG9iamVjdE1hcEFyZykgewogICAgdGhpcy5mYXN0TWFwLmFkZEFsbEZyb21PdGhlcihvYmplY3RNYXBBcmcuZmFzdE1hcCk7CiAgICBmb3IgKGNvbnN0IGtleTIgb2Ygb2JqZWN0TWFwQXJnLmZhc3RNYXAuZ2V0S2V5cygpKSB7CiAgICAgIHRoaXMucmV2ZXJzZU1hcC5zZXQob2JqZWN0TWFwQXJnLmZhc3RNYXAuZ2V0QnlLZXkoa2V5MiksIGtleTIpOwogICAgfQogIH0KICBtYXAoZm4pIHsKICAgIHJldHVybiB0aGlzLmdldEFycmF5KCkubWFwKGZuKTsKICB9CiAgZmlsdGVyKGZuKSB7CiAgICByZXR1cm4gdGhpcy5nZXRBcnJheSgpLmZpbHRlcihmbik7CiAgfQogIHJlZHVjZShmbiwgaW5pdGlhbCkgewogICAgcmV0dXJuIHRoaXMuZ2V0QXJyYXkoKS5yZWR1Y2UoZm4sIGluaXRpYWwpOwogIH0KICBbU3ltYm9sLml0ZXJhdG9yXSgpIHsKICAgIHJldHVybiB0aGlzLmdldEFycmF5KClbU3ltYm9sLml0ZXJhdG9yXSgpOwogIH0KICAvKioKICAgKiBkZXN0cm95cyB0aGUgT2JqZWN0TWFwLCBjb21wbGV0aW5nIHRoZSBldmVudFN1YmplY3QgYW5kIGNsZWFyaW5nIGFsbCBlbnRyaWVzCiAgICovCiAgZGVzdHJveSgpIHsKICAgIHRoaXMud2lwZSgpOwogICAgdGhpcy5yZXZlcnNlTWFwLmNsZWFyKCk7CiAgICB0aGlzLmV2ZW50U3ViamVjdC5jb21wbGV0ZSgpOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytsaWtANi40LjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2xpay9kaXN0X3RzL2NsYXNzZXMuaW50ZXJlc3RtYXAuaW50ZXJlc3QuanMKdmFyIEludGVyZXN0ID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkludGVyZXN0Iik7CiAgfQogIG9wdGlvbnM7CiAgaW50ZXJlc3RNYXBSZWY7CiAgb3JpZ2luYWxJbnRlcmVzdDsKICBjb21wYXJpc29uRnVuYzsKICBkZXN0cnVjdGlvblRpbWVyID0gbmV3IGRpc3RfdHNfZXhwb3J0czcuVGltZXIoMWU0KTsKICBpc0Z1bGxmaWxsZWQgPSBmYWxzZTsKICBpc0Rlc3Ryb3llZCA9IGZhbHNlOwogIC8qKgogICAqIGEgZ2VuZXJpYyBzdG9yZSB0byBzdG9yZSBvYmplY3RzIGluIHRoYXQgYXJlIG5lZWRlZCBmb3IgZnVsbGZpbGxtZW50OwogICAqLwogIGZ1bGxmaWxsbWVudFN0b3JlID0gW107CiAgLyoqCiAgICogYSBjYW5jZWxsYWJsZSB0aW1lb3V0IGZvciB0aGUgbWFya0xvc3RBZnRlckRlZmF1bHQgZmVhdHVyZQogICAqLwogIG1hcmtMb3N0VGltZW91dCA9IG51bGw7CiAgLyoqCiAgICogcXVpY2sgYWNjZXNzIHRvIGEgc3RyaW5nIHRoYXQgbWFrZXMgdGhlIGludGVyZXN0IGNvbXBhcmFibGUgZm9yIGNoZWNraW5nIGZvciBzaW1pbGFyIGludGVyZXN0cwogICAqLwogIGdldCBjb21wYXJpc29uU3RyaW5nKCkgewogICAgcmV0dXJuIHRoaXMuY29tcGFyaXNvbkZ1bmModGhpcy5vcmlnaW5hbEludGVyZXN0KTsKICB9CiAgaW50ZXJlc3REZWZlcnJlZCA9IG5ldyBkaXN0X3RzX2V4cG9ydHMuRGVmZXJyZWQoKTsKICBpbnRlcmVzdEZ1bGxmaWxsZWQgPSB0aGlzLmludGVyZXN0RGVmZXJyZWQucHJvbWlzZTsKICAvKioKICAgKiBmdWxsZmlsbCB0aGUgaW50ZXJlc3QKICAgKi8KICBmdWxsZmlsbEludGVyZXN0KG9iamVjdEFyZykgewogICAgdGhpcy5pc0Z1bGxmaWxsZWQgPSB0cnVlOwogICAgdGhpcy5mdWxsZmlsbG1lbnRTdG9yZSA9IFtdOwogICAgdGhpcy5pbnRlcmVzdERlZmVycmVkLnJlc29sdmUob2JqZWN0QXJnKTsKICAgIHRoaXMuZGVzdHJveSgpOwogIH0KICBjb25zdHJ1Y3RvcihpbnRlcmVzdE1hcEFyZywgaW50ZXJlc3RBcmcsIGNvbXBhcmlzb25GdW5jQXJnLCBvcHRpb25zQXJnKSB7CiAgICB0aGlzLmludGVyZXN0TWFwUmVmID0gaW50ZXJlc3RNYXBBcmc7CiAgICB0aGlzLm9yaWdpbmFsSW50ZXJlc3QgPSBpbnRlcmVzdEFyZzsKICAgIHRoaXMuY29tcGFyaXNvbkZ1bmMgPSBjb21wYXJpc29uRnVuY0FyZzsKICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNBcmc7CiAgICB0aGlzLmRlc3RydWN0aW9uVGltZXIuY29tcGxldGVkLnRoZW4oKCkgPT4gewogICAgICBpZiAoIXRoaXMuaXNEZXN0cm95ZWQpIHsKICAgICAgICB0aGlzLmRlc3Ryb3koKTsKICAgICAgfQogICAgfSk7CiAgICBpZiAodGhpcy5vcHRpb25zPy5tYXJrTG9zdEFmdGVyRGVmYXVsdCkgewogICAgICB0aGlzLm1hcmtMb3N0VGltZW91dCA9IG5ldyBkaXN0X3RzX2V4cG9ydHMzLlRpbWVvdXQodGhpcy5vcHRpb25zLm1hcmtMb3N0QWZ0ZXJEZWZhdWx0KTsKICAgICAgdGhpcy5tYXJrTG9zdFRpbWVvdXQucHJvbWlzZS50aGVuKCgpID0+IHsKICAgICAgICBpZiAoIXRoaXMuaXNEZXN0cm95ZWQpIHsKICAgICAgICAgIHRoaXMubWFya0xvc3QoKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogIH0KICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgLy8gTElGRUNZQ0xFIE1BTkFHRU1FTlQKICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgLyoqCiAgICogc2VsZiBkZXN0cnVjdHMgdGhlIGludGVyZXN0CiAgICovCiAgZGVzdHJveSgpIHsKICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXMuaXNEZXN0cm95ZWQgPSB0cnVlOwogICAgdGhpcy5kZXN0cnVjdGlvblRpbWVyLnJlc2V0KCk7CiAgICBpZiAodGhpcy5tYXJrTG9zdFRpbWVvdXQpIHsKICAgICAgdGhpcy5tYXJrTG9zdFRpbWVvdXQuY2FuY2VsKCk7CiAgICAgIHRoaXMubWFya0xvc3RUaW1lb3V0ID0gbnVsbDsKICAgIH0KICAgIHRoaXMuZnVsbGZpbGxtZW50U3RvcmUgPSBbXTsKICAgIHRoaXMuaW50ZXJlc3RNYXBSZWYucmVtb3ZlSW50ZXJlc3QodGhpcyk7CiAgICBpZiAoIXRoaXMuaXNGdWxsZmlsbGVkICYmIHRoaXMub3B0aW9ucz8uZGVmYXVsdEZ1bGxmaWxsbWVudCkgewogICAgICB0aGlzLmlzRnVsbGZpbGxlZCA9IHRydWU7CiAgICAgIHRoaXMuaW50ZXJlc3REZWZlcnJlZC5yZXNvbHZlKHRoaXMub3B0aW9ucy5kZWZhdWx0RnVsbGZpbGxtZW50KTsKICAgIH0KICB9CiAgLyoqCiAgICogbm90aWZpZXMgdGhlIGludGVyZXN0IHRoYXQgdGhlIGludGVyZXN0IGluIGl0IGhhcyBiZWVuIGxvc3QKICAgKi8KICBtYXJrTG9zdCgpIHsKICAgIHRoaXMuZGVzdHJ1Y3Rpb25UaW1lci5zdGFydCgpOwogIH0KICAvKioKICAgKiBub3RpZmllcyB0aGUgaW50ZXJlc3QgdGhhdCB0aGUgaW50ZXJlc3QgaW4gaXQgaGFzIGJlZW4gcmVzdG9yZWQKICAgKi8KICByZW5ldygpIHsKICAgIHRoaXMuZGVzdHJ1Y3Rpb25UaW1lci5yZXNldCgpOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytsaWtANi40LjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2xpay9kaXN0X3RzL2NsYXNzZXMuaW50ZXJlc3RtYXAuanMKdmFyIEludGVyZXN0TWFwID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkludGVyZXN0TWFwIik7CiAgfQogIG9wdGlvbnM7CiAgLyoqCiAgICogc3RvcmVzIGludGVyZXN0cyB0aGF0IGFyZSBjdXJyZW50bHkgZnVsbGZpbGxlZCBieSB0aGUgY2FjaGUKICAgKi8KICBpbnRlcmVzdE9iamVjdE1hcCA9IG5ldyBPYmplY3RNYXAoKTsKICAvKioKICAgKiBPKDEpIGxvb2t1cCBvZiBpbnRlcmVzdHMgYnkgdGhlaXIgY29tcGFyaXNvbiBzdHJpbmcKICAgKi8KICBpbnRlcmVzdHNCeUNvbXBhcmlzb25TdHJpbmcgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogIC8qKgogICAqIGEgZnVuY3Rpb24gdG8gY29tcGFyZSBpbnRlcmVzdHMKICAgKi8KICBjb21wYXJpc29uRnVuYzsKICBjb25zdHJ1Y3Rvcihjb21wYXJpc29uRnVuY0FyZywgb3B0aW9uc0FyZyA9IHt9KSB7CiAgICB0aGlzLmNvbXBhcmlzb25GdW5jID0gY29tcGFyaXNvbkZ1bmNBcmc7CiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zQXJnOwogIH0KICAvKioKICAgKiBhZGRzIGFuIGludGVyZXN0IHRvIHRoZSBJbnRlcmVzdE1hcAogICAqIEBwYXJhbSBpbnRlcmVzdElkCiAgICovCiAgYXN5bmMgYWRkSW50ZXJlc3QoaW50ZXJlc3RJZCwgZGVmYXVsdEZ1bGxmaWxsbWVudEFyZykgewogICAgY29uc3QgY29tcGFyaXNvblN0cmluZyA9IHRoaXMuY29tcGFyaXNvbkZ1bmMoaW50ZXJlc3RJZCk7CiAgICBsZXQgcmV0dXJuSW50ZXJlc3Q7CiAgICBjb25zdCBleGlzdGluZ0ludGVyZXN0ID0gdGhpcy5pbnRlcmVzdHNCeUNvbXBhcmlzb25TdHJpbmcuZ2V0KGNvbXBhcmlzb25TdHJpbmcpOwogICAgaWYgKGV4aXN0aW5nSW50ZXJlc3QpIHsKICAgICAgcmV0dXJuSW50ZXJlc3QgPSBleGlzdGluZ0ludGVyZXN0OwogICAgICByZXR1cm5JbnRlcmVzdC5yZW5ldygpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuSW50ZXJlc3QgPSBuZXcgSW50ZXJlc3QodGhpcywgaW50ZXJlc3RJZCwgdGhpcy5jb21wYXJpc29uRnVuYywgewogICAgICAgIG1hcmtMb3N0QWZ0ZXJEZWZhdWx0OiB0aGlzLm9wdGlvbnMubWFya0xvc3RBZnRlckRlZmF1bHQsCiAgICAgICAgZGVmYXVsdEZ1bGxmaWxsbWVudDogZGVmYXVsdEZ1bGxmaWxsbWVudEFyZwogICAgICB9KTsKICAgICAgdGhpcy5pbnRlcmVzdE9iamVjdE1hcC5hZGQocmV0dXJuSW50ZXJlc3QpOwogICAgICB0aGlzLmludGVyZXN0c0J5Q29tcGFyaXNvblN0cmluZy5zZXQoY29tcGFyaXNvblN0cmluZywgcmV0dXJuSW50ZXJlc3QpOwogICAgfQogICAgdGhpcy5pbnRlcmVzdE9ic2VydmFibGUucHVzaChyZXR1cm5JbnRlcmVzdCk7CiAgICByZXR1cm4gcmV0dXJuSW50ZXJlc3Q7CiAgfQogIGludGVyZXN0T2JzZXJ2YWJsZSA9IG5ldyBkaXN0X3RzX2V4cG9ydHMyLk9ic2VydmFibGVJbnRha2UoKTsKICAvKioKICAgKiByZW1vdmVzIGFuIGludGVyZXN0IGZyb20gdGhlIGludGVyZXN0IG1hcAogICAqLwogIHJlbW92ZUludGVyZXN0KGludGVyZXN0QXJnKSB7CiAgICB0aGlzLmludGVyZXN0T2JqZWN0TWFwLmZpbmRPbmVBbmRSZW1vdmVTeW5jKChpbnRlcmVzdEFyZzIpID0+IHsKICAgICAgcmV0dXJuIGludGVyZXN0QXJnLmNvbXBhcmlzb25TdHJpbmcgPT09IGludGVyZXN0QXJnMi5jb21wYXJpc29uU3RyaW5nOwogICAgfSk7CiAgICB0aGlzLmludGVyZXN0c0J5Q29tcGFyaXNvblN0cmluZy5kZWxldGUoaW50ZXJlc3RBcmcuY29tcGFyaXNvblN0cmluZyk7CiAgfQogIC8qKgogICAqIGNoZWNrIGludGVyZXN0CiAgICovCiAgY2hlY2tJbnRlcmVzdChvYmplY3RBcmcpIHsKICAgIGNvbnN0IGNvbXBhcmlzb25TdHJpbmcgPSB0aGlzLmNvbXBhcmlzb25GdW5jKG9iamVjdEFyZyk7CiAgICByZXR1cm4gdGhpcy5jaGVja0ludGVyZXN0QnlTdHJpbmcoY29tcGFyaXNvblN0cmluZyk7CiAgfQogIC8qKgogICAqIGNoZWNrcyBhbiBpbnRlcmVzdAogICAqIEBwYXJhbSBjb21wYXJpc29uU3RyaW5nQXJnCiAgICovCiAgY2hlY2tJbnRlcmVzdEJ5U3RyaW5nKGNvbXBhcmlzb25TdHJpbmdBcmcpIHsKICAgIHJldHVybiB0aGlzLmludGVyZXN0c0J5Q29tcGFyaXNvblN0cmluZy5oYXMoY29tcGFyaXNvblN0cmluZ0FyZyk7CiAgfQogIC8qKgogICAqIGluZm9ybSBsb3N0IGludGVyZXN0CiAgICogQHBhcmFtIGludGVyZXN0SWQKICAgKi8KICBpbmZvcm1Mb3N0SW50ZXJlc3QoaW50ZXJlc3RJZCkgewogICAgY29uc3Qgd2FudGVkSW50ZXJlc3QgPSB0aGlzLmZpbmRJbnRlcmVzdChpbnRlcmVzdElkKTsKICAgIGlmICh3YW50ZWRJbnRlcmVzdCkgewogICAgICB3YW50ZWRJbnRlcmVzdC5tYXJrTG9zdCgpOwogICAgfQogIH0KICAvKioKICAgKiBmaW5kcyBhbiBpbnRlcmVzdAogICAqIEBwYXJhbSBpbnRlcmVzdElkCiAgICovCiAgZmluZEludGVyZXN0KGludGVyZXN0SWQpIHsKICAgIGNvbnN0IGNvbXBhcmFibGVTdHJpbmcgPSB0aGlzLmNvbXBhcmlzb25GdW5jKGludGVyZXN0SWQpOwogICAgcmV0dXJuIHRoaXMuaW50ZXJlc3RzQnlDb21wYXJpc29uU3RyaW5nLmdldChjb21wYXJhYmxlU3RyaW5nKSA/PyBudWxsOwogIH0KICAvKioKICAgKiBkZXN0cm95cyB0aGUgSW50ZXJlc3RNYXAgYW5kIGNsZWFucyB1cCBhbGwgcmVzb3VyY2VzCiAgICovCiAgZGVzdHJveSgpIHsKICAgIGNvbnN0IGludGVyZXN0cyA9IHRoaXMuaW50ZXJlc3RPYmplY3RNYXAuZ2V0QXJyYXkoKTsKICAgIGZvciAoY29uc3QgaW50ZXJlc3Qgb2YgaW50ZXJlc3RzKSB7CiAgICAgIGludGVyZXN0LmRlc3Ryb3koKTsKICAgIH0KICAgIHRoaXMuaW50ZXJlc3RPYmplY3RNYXAud2lwZSgpOwogICAgdGhpcy5pbnRlcmVzdHNCeUNvbXBhcmlzb25TdHJpbmcuY2xlYXIoKTsKICAgIHRoaXMuaW50ZXJlc3RPYnNlcnZhYmxlLnNpZ25hbENvbXBsZXRlKCk7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjQuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvY2xhc3Nlcy5saW1pdGVkYXJyYXkuanMKdmFyIExpbWl0ZWRBcnJheSA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJMaW1pdGVkQXJyYXkiKTsKICB9CiAgYXJyYXkgPSBbXTsKICBhcnJheUxpbWl0OwogIGNvbnN0cnVjdG9yKGxpbWl0QXJnKSB7CiAgICB0aGlzLmFycmF5TGltaXQgPSBsaW1pdEFyZzsKICB9CiAgZ2V0IGxlbmd0aCgpIHsKICAgIHJldHVybiB0aGlzLmFycmF5Lmxlbmd0aDsKICB9CiAgYWRkT25lKG9iamVjdEFyZykgewogICAgdGhpcy5hcnJheS51bnNoaWZ0KG9iamVjdEFyZyk7CiAgICBpZiAodGhpcy5hcnJheS5sZW5ndGggPiB0aGlzLmFycmF5TGltaXQpIHsKICAgICAgdGhpcy5hcnJheS5sZW5ndGggPSB0aGlzLmFycmF5TGltaXQ7CiAgICB9CiAgfQogIGFkZE1hbnkob2JqZWN0QXJyYXlBcmcpIHsKICAgIGZvciAobGV0IG9iamVjdEFyZyBvZiBvYmplY3RBcnJheUFyZykgewogICAgICB0aGlzLmFkZE9uZShvYmplY3RBcmcpOwogICAgfQogIH0KICBzZXRMaW1pdChsaW1pdEFyZykgewogICAgdGhpcy5hcnJheUxpbWl0ID0gbGltaXRBcmc7CiAgICBpZiAodGhpcy5hcnJheS5sZW5ndGggPiB0aGlzLmFycmF5TGltaXQpIHsKICAgICAgdGhpcy5hcnJheS5sZW5ndGggPSB0aGlzLmFycmF5TGltaXQ7CiAgICB9CiAgfQogIGdldEF2ZXJhZ2UoKSB7CiAgICBpZiAodGhpcy5hcnJheS5sZW5ndGggPT09IDApIHsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBpZiAodHlwZW9mIHRoaXMuYXJyYXlbMF0gPT09ICJudW1iZXIiKSB7CiAgICAgIGxldCBzdW0gPSAwOwogICAgICBmb3IgKGxldCBsb2NhbE51bWJlciBvZiB0aGlzLmFycmF5KSB7CiAgICAgICAgbGV0IGxvY2FsTnVtYmVyQW55ID0gbG9jYWxOdW1iZXI7CiAgICAgICAgc3VtID0gc3VtICsgbG9jYWxOdW1iZXJBbnk7CiAgICAgIH0KICAgICAgcmV0dXJuIHN1bSAvIHRoaXMuYXJyYXkubGVuZ3RoOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQogIHJlbW92ZShpdGVtKSB7CiAgICBjb25zdCBpZHggPSB0aGlzLmFycmF5LmluZGV4T2YoaXRlbSk7CiAgICBpZiAoaWR4ICE9PSAtMSkgewogICAgICB0aGlzLmFycmF5LnNwbGljZShpZHgsIDEpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CiAgY2xlYXIoKSB7CiAgICB0aGlzLmFycmF5Lmxlbmd0aCA9IDA7CiAgfQogIGdldEFycmF5KCkgewogICAgcmV0dXJuIFsuLi50aGlzLmFycmF5XTsKICB9CiAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7CiAgICByZXR1cm4gdGhpcy5hcnJheVtTeW1ib2wuaXRlcmF0b3JdKCk7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjQuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvY2xhc3Nlcy5sb29wdHJhY2tlci5qcwp2YXIgTG9vcFRyYWNrZXIgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiTG9vcFRyYWNrZXIiKTsKICB9CiAgcmVmZXJlbmNlT2JqZWN0TWFwID0gbmV3IE9iamVjdE1hcCgpOwogIGNvbnN0cnVjdG9yKCkgewogIH0KICAvKioKICAgKiBjaGVja3MgYW5kIHRyYWNrcyBhbiBvYmplY3QKICAgKiBAcGFyYW0gb2JqZWN0QXJnCiAgICovCiAgY2hlY2tBbmRUcmFjayhvYmplY3RBcmcpIHsKICAgIGlmICghdGhpcy5yZWZlcmVuY2VPYmplY3RNYXAuY2hlY2tGb3JPYmplY3Qob2JqZWN0QXJnKSkgewogICAgICB0aGlzLnJlZmVyZW5jZU9iamVjdE1hcC5hZGQob2JqZWN0QXJnKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQogIC8qKgogICAqIHJlc2V0cyB0aGUgbG9vcCB0cmFja2VyLCBjbGVhcmluZyBhbGwgdHJhY2tlZCBvYmplY3RzCiAgICovCiAgcmVzZXQoKSB7CiAgICB0aGlzLnJlZmVyZW5jZU9iamVjdE1hcC53aXBlKCk7CiAgfQogIC8qKgogICAqIGRlc3Ryb3lzIHRoZSBsb29wIHRyYWNrZXIgYW5kIGl0cyB1bmRlcmx5aW5nIE9iamVjdE1hcAogICAqLwogIGRlc3Ryb3koKSB7CiAgICB0aGlzLnJlZmVyZW5jZU9iamVjdE1hcC5kZXN0cm95KCk7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjQuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvY2xhc3Nlcy5zdHJpbmdtYXAuanMKdmFyIFN0cmluZ21hcCA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJTdHJpbmdtYXAiKTsKICB9CiAgX3N0cmluZ0FycmF5ID0gW107CiAgX3RyaWdnZXJVbnRpbFRydWVGdW5jdGlvbkFycmF5ID0gW107CiAgY29uc3RydWN0b3IoKSB7CiAgfQogIC8qKgogICAqIGFkZCBhIHN0cmluZyB0byB0aGUgU3RyaW5nbWFwCiAgICovCiAgYWRkU3RyaW5nKHN0cmluZ0FyZykgewogICAgdGhpcy5fc3RyaW5nQXJyYXkucHVzaChzdHJpbmdBcmcpOwogICAgdGhpcy5ub3RpZnlUcmlnZ2VyKCk7CiAgfQogIC8qKgogICAqIGxpa2UgYWRkU3RyaW5nLCBidXQgYWNjZXB0cyBhbiBhcnJheSBvZiBzdHJpbmdzCiAgICovCiAgYWRkU3RyaW5nQXJyYXkoc3RyaW5nQXJyYXlBcmcpIHsKICAgIGZvciAoY29uc3Qgc3RyaW5nSXRlbSBvZiBzdHJpbmdBcnJheUFyZykgewogICAgICB0aGlzLmFkZFN0cmluZyhzdHJpbmdJdGVtKTsKICAgIH0KICB9CiAgLyoqCiAgICogcmVtb3ZlcyBhIHN0cmluZyBmcm9tIFN0cmluZ21hcAogICAqLwogIHJlbW92ZVN0cmluZyhzdHJpbmdBcmcpIHsKICAgIHRoaXMuX3N0cmluZ0FycmF5ID0gdGhpcy5fc3RyaW5nQXJyYXkuZmlsdGVyKChzOSkgPT4gczkgIT09IHN0cmluZ0FyZyk7CiAgICB0aGlzLm5vdGlmeVRyaWdnZXIoKTsKICB9CiAgLyoqCiAgICogd2lwZXMgdGhlIFN0cmluZ21hcAogICAqLwogIHdpcGUoKSB7CiAgICB0aGlzLl9zdHJpbmdBcnJheSA9IFtdOwogICAgdGhpcy5ub3RpZnlUcmlnZ2VyKCk7CiAgfQogIC8qKgogICAqIGNoZWNrIGlmIHN0cmluZyBpcyBpbiBTdHJpbmdtYXAKICAgKi8KICBjaGVja1N0cmluZyhzdHJpbmdBcmcpIHsKICAgIHJldHVybiB0aGlzLl9zdHJpbmdBcnJheS5pbmRleE9mKHN0cmluZ0FyZykgIT09IC0xOwogIH0KICAvKioKICAgKiBjaGVja3Mgc3RyaW5nUHJlc2VuY2Ugd2l0aCBtaW5pbWF0Y2gKICAgKi8KICBjaGVja01pbmltYXRjaChtaW5pTWF0Y2hTdHJpbmdBcmcpIHsKICAgIGNvbnN0IHNtYXJ0TWF0Y2hJbnN0YW5jZSA9IG5ldyBkaXN0X3RzX2V4cG9ydHM1LlNtYXJ0TWF0Y2gobWluaU1hdGNoU3RyaW5nQXJnKTsKICAgIGxldCBmb3VuZE1hdGNoID0gZmFsc2U7CiAgICBmb3IgKGNvbnN0IHN0cmluZ0l0ZW0gb2YgdGhpcy5fc3RyaW5nQXJyYXkpIHsKICAgICAgaWYgKHNtYXJ0TWF0Y2hJbnN0YW5jZS5tYXRjaChzdHJpbmdJdGVtKSkgewogICAgICAgIGZvdW5kTWF0Y2ggPSB0cnVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZm91bmRNYXRjaDsKICB9CiAgLyoqCiAgICogY2hlY2tzIGlmIHRoZSBTdHJpbmdtYXAgaXMgZW1wdHkKICAgKi8KICBjaGVja0lzRW1wdHkoKSB7CiAgICByZXR1cm4gdGhpcy5fc3RyaW5nQXJyYXkubGVuZ3RoID09PSAwOwogIH0KICAvKioKICAgKiBnZXRzIGEgY2xvbmVkIGNvcHkgb2YgdGhlIGN1cnJlbnQgc3RyaW5nIEFycmF5CiAgICovCiAgZ2V0U3RyaW5nQXJyYXkoKSB7CiAgICBjb25zdCByZXR1cm5BcnJheSA9IFtdOwogICAgZm9yIChjb25zdCBzdHJpbmdJdGVtIG9mIHRoaXMuX3N0cmluZ0FycmF5KSB7CiAgICAgIHJldHVybkFycmF5LnB1c2goc3RyaW5nSXRlbSk7CiAgICB9CiAgICByZXR1cm4gcmV0dXJuQXJyYXk7CiAgfQogIC8vIHRyaWdnZXIgcmVnaXN0ZXJpbmcKICAvKioKICAgKiByZWdpc3RlciBhIG5ldyB0cmlnZ2VyCiAgICovCiAgcmVnaXN0ZXJVbnRpbFRydWUoZnVuY3Rpb25BcmcsIGNhbGxiYWNrQXJnKSB7CiAgICBjb25zdCB0cnVlRGVmZXJyZWQgPSBkaXN0X3RzX2V4cG9ydHMuZGVmZXIoKTsKICAgIHRoaXMuX3RyaWdnZXJVbnRpbFRydWVGdW5jdGlvbkFycmF5LnB1c2goKCkgPT4gewogICAgICBjb25zdCByZXN1bHQgPSBmdW5jdGlvbkFyZyh0aGlzLmdldFN0cmluZ0FycmF5KCkpOwogICAgICBpZiAocmVzdWx0ID09PSB0cnVlKSB7CiAgICAgICAgaWYgKGNhbGxiYWNrQXJnKSB7CiAgICAgICAgICBjYWxsYmFja0FyZygpOwogICAgICAgIH0KICAgICAgICB0cnVlRGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9KTsKICAgIHRoaXMubm90aWZ5VHJpZ2dlcigpOwogICAgcmV0dXJuIHRydWVEZWZlcnJlZC5wcm9taXNlOwogIH0KICAvKioKICAgKiBub3RpZmllcyB0cmlnZ2VycwogICAqLwogIG5vdGlmeVRyaWdnZXIoKSB7CiAgICBjb25zdCBmaWx0ZXJlZEFycmF5ID0gdGhpcy5fdHJpZ2dlclVudGlsVHJ1ZUZ1bmN0aW9uQXJyYXkuZmlsdGVyKChmdW5jdGlvbkFyZykgPT4gewogICAgICByZXR1cm4gIWZ1bmN0aW9uQXJnKCk7CiAgICB9KTsKICAgIHRoaXMuX3RyaWdnZXJVbnRpbFRydWVGdW5jdGlvbkFycmF5ID0gZmlsdGVyZWRBcnJheTsKICB9CiAgLyoqCiAgICogZGVzdHJveXMgdGhlIFN0cmluZ21hcCwgY2xlYXJpbmcgYWxsIHN0cmluZ3MgYW5kIHBlbmRpbmcgdHJpZ2dlcnMKICAgKi8KICBkZXN0cm95KCkgewogICAgdGhpcy5fc3RyaW5nQXJyYXkgPSBbXTsKICAgIHRoaXMuX3RyaWdnZXJVbnRpbFRydWVGdW5jdGlvbkFycmF5ID0gW107CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjQuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvY2xhc3Nlcy50aW1lZGFnZ3JlZ2F0b3IuanMKdmFyIFRpbWVkQWdncmVndG9yID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlRpbWVkQWdncmVndG9yIik7CiAgfQogIG9wdGlvbnM7CiAgc3RvcmFnZUFycmF5ID0gW107CiAgaXNTdG9wcGVkID0gZmFsc2U7CiAgY29uc3RydWN0b3Iob3B0aW9uc0FyZykgewogICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc0FyZzsKICB9CiAgYWdncmVnYXRpb25UaW1lcjsKICBjaGVja0FnZ3JlZ2F0aW9uU3RhdHVzKCkgewogICAgaWYgKHRoaXMuaXNTdG9wcGVkKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGFkZEFnZ3JlZ2F0aW9uVGltZXIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCgpID0+IHsKICAgICAgdGhpcy5hZ2dyZWdhdGlvblRpbWVyID0gbmV3IGRpc3RfdHNfZXhwb3J0czcuVGltZXIodGhpcy5vcHRpb25zLmFnZ3JlZ2F0aW9uSW50ZXJ2YWxJbk1pbGxpcyk7CiAgICAgIHRoaXMuYWdncmVnYXRpb25UaW1lci5jb21wbGV0ZWQudGhlbigoKSA9PiB7CiAgICAgICAgaWYgKHRoaXMuaXNTdG9wcGVkKSB7CiAgICAgICAgICB0aGlzLmFnZ3JlZ2F0aW9uVGltZXIgPSBudWxsOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBhZ2dyZWdhdGVGb3JQcm9jZXNzaW5nID0gdGhpcy5zdG9yYWdlQXJyYXk7CiAgICAgICAgaWYgKGFnZ3JlZ2F0ZUZvclByb2Nlc3NpbmcubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICB0aGlzLmFnZ3JlZ2F0aW9uVGltZXIgPSBudWxsOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLnN0b3JhZ2VBcnJheSA9IFtdOwogICAgICAgIGFkZEFnZ3JlZ2F0aW9uVGltZXIoKTsKICAgICAgICB0aGlzLm9wdGlvbnMuZnVuY3Rpb25Gb3JBZ2dyZWdhdGlvbihhZ2dyZWdhdGVGb3JQcm9jZXNzaW5nKTsKICAgICAgfSk7CiAgICAgIHRoaXMuYWdncmVnYXRpb25UaW1lci5zdGFydCgpOwogICAgfSwgImFkZEFnZ3JlZ2F0aW9uVGltZXIiKTsKICAgIGlmICghdGhpcy5hZ2dyZWdhdGlvblRpbWVyKSB7CiAgICAgIGFkZEFnZ3JlZ2F0aW9uVGltZXIoKTsKICAgIH0KICB9CiAgYWRkKGFnZ3JlZ2F0aW9uQXJnKSB7CiAgICBpZiAodGhpcy5pc1N0b3BwZWQpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5zdG9yYWdlQXJyYXkucHVzaChhZ2dyZWdhdGlvbkFyZyk7CiAgICB0aGlzLmNoZWNrQWdncmVnYXRpb25TdGF0dXMoKTsKICB9CiAgLyoqCiAgICogc3RvcHMgdGhlIGFnZ3JlZ2F0aW9uIHRpbWVyIGNoYWluCiAgICogQHBhcmFtIGZsdXNoUmVtYWluaW5nIGlmIHRydWUsIGNhbGxzIGZ1bmN0aW9uRm9yQWdncmVnYXRpb24gd2l0aCBhbnkgcmVtYWluaW5nIGl0ZW1zCiAgICovCiAgc3RvcChmbHVzaFJlbWFpbmluZyA9IGZhbHNlKSB7CiAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7CiAgICBpZiAodGhpcy5hZ2dyZWdhdGlvblRpbWVyKSB7CiAgICAgIHRoaXMuYWdncmVnYXRpb25UaW1lci5yZXNldCgpOwogICAgICB0aGlzLmFnZ3JlZ2F0aW9uVGltZXIgPSBudWxsOwogICAgfQogICAgaWYgKGZsdXNoUmVtYWluaW5nICYmIHRoaXMuc3RvcmFnZUFycmF5Lmxlbmd0aCA+IDApIHsKICAgICAgY29uc3QgcmVtYWluaW5nID0gdGhpcy5zdG9yYWdlQXJyYXk7CiAgICAgIHRoaXMuc3RvcmFnZUFycmF5ID0gW107CiAgICAgIHRoaXMub3B0aW9ucy5mdW5jdGlvbkZvckFnZ3JlZ2F0aW9uKHJlbWFpbmluZyk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLnN0b3JhZ2VBcnJheSA9IFtdOwogICAgfQogIH0KICByZXN0YXJ0KCkgewogICAgdGhpcy5pc1N0b3BwZWQgPSBmYWxzZTsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3MrbGlrQDYuNC4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9saWsvZGlzdF90cy9jbGFzc2VzLnRyZWUuanMKdmFyIFRyZWUgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiVHJlZSIpOwogIH0KICBzeW1ib2xUcmVlOwogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5zeW1ib2xUcmVlID0gbmV3IGltcG9ydF9zeW1ib2xfdHJlZS5kZWZhdWx0KCk7CiAgfQogIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIC8vIEZ1bmN0aW9ucyB0aGF0IG1hcCB0byB0aGUgZnVuY3Rpb25hbGl0eSBvZiBzeW1ib2wtdHJlZQogIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIC8qKgogICAqCiAgICogQHBhcmFtIG9iamVjdEFyZwogICAqLwogIGluaXRpYWxpemUob2JqZWN0QXJnKSB7CiAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLmluaXRpYWxpemUob2JqZWN0QXJnKTsKICB9CiAgaGFzQ2hpbGRyZW4ob2JqZWN0QXJnKSB7CiAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLmhhc0NoaWxkcmVuKG9iamVjdEFyZyk7CiAgfQogIGZpcnN0Q2hpbGQob2JqZWN0QXJnKSB7CiAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLmZpcnN0Q2hpbGQob2JqZWN0QXJnKTsKICB9CiAgbGFzdENoaWxkKG9iamVjdEFyZykgewogICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS5sYXN0Q2hpbGQob2JqZWN0QXJnKTsKICB9CiAgcHJldmlvdXNTaWJsaW5nKG9iamVjdEFyZykgewogICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS5wcmV2aW91c1NpYmxpbmcob2JqZWN0QXJnKTsKICB9CiAgbmV4dFNpYmxpbmcob2JqZWN0QXJnKSB7CiAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLm5leHRTaWJsaW5nKG9iamVjdEFyZyk7CiAgfQogIHBhcmVudChvYmplY3RBcmcpIHsKICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUucGFyZW50KG9iamVjdEFyZyk7CiAgfQogIGxhc3RJbmNsdXNpdmVEZXNjZW5kYW50KG9iamVjdEFyZykgewogICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS5sYXN0SW5jbHVzaXZlRGVzY2VuZGFudChvYmplY3RBcmcpOwogIH0KICBwcmVjZWRpbmcob2JqZWN0QXJnLCBvcHRpb25zQXJnKSB7CiAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLnByZWNlZGluZyhvYmplY3RBcmcsIG9wdGlvbnNBcmcpOwogIH0KICBmb2xsb3dpbmcob2JqZWN0LCBvcHRpb25zQXJnKSB7CiAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLmZvbGxvd2luZyhvYmplY3QsIG9wdGlvbnNBcmcpOwogIH0KICBjaGlsZHJlblRvQXJyYXkocGFyZW50QXJnLCBvcHRpb25zQXJnKSB7CiAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLmNoaWxkcmVuVG9BcnJheShwYXJlbnRBcmcsIG9wdGlvbnNBcmcpOwogIH0KICBhbmNlc3RvcnNUb0FycmF5KG9iamVjdEFyZywgb3B0aW9uc0FyZykgewogICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS5hbmNlc3RvcnNUb0FycmF5KG9iamVjdEFyZywgb3B0aW9uc0FyZyk7CiAgfQogIHRyZWVUb0FycmF5KHJvb3RBcmcsIG9wdGlvbnNBcmcpIHsKICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUudHJlZVRvQXJyYXkocm9vdEFyZywgb3B0aW9uc0FyZyk7CiAgfQogIGNoaWxkcmVuSXRlcmF0b3IocGFyZW50QXJnLCBvcHRpb25zQXJnKSB7CiAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLmNoaWxkcmVuSXRlcmF0b3IocGFyZW50QXJnLCBvcHRpb25zQXJnKTsKICB9CiAgcHJldmlvdXNTaWJsaW5nc0l0ZXJhdG9yKG9iamVjdEFyZykgewogICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS5wcmV2aW91c1NpYmxpbmdzSXRlcmF0b3Iob2JqZWN0QXJnKTsKICB9CiAgbmV4dFNpYmxpbmdzSXRlcmF0b3Iob2JqZWN0QXJnKSB7CiAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLm5leHRTaWJsaW5nc0l0ZXJhdG9yKG9iamVjdEFyZyk7CiAgfQogIGFuY2VzdG9yc0l0ZXJhdG9yKG9iamVjdEFyZykgewogICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS5hbmNlc3RvcnNJdGVyYXRvcihvYmplY3RBcmcpOwogIH0KICB0cmVlSXRlcmF0b3Iocm9vdEFyZywgb3B0aW9uc0FyZykgewogICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS50cmVlSXRlcmF0b3Iocm9vdEFyZywgb3B0aW9uc0FyZyk7CiAgfQogIGluZGV4KGNoaWxkQXJnKSB7CiAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLmluZGV4KGNoaWxkQXJnKTsKICB9CiAgY2hpbGRyZW5Db3VudChwYXJlbnRBcmcpIHsKICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUuY2hpbGRyZW5Db3VudChwYXJlbnRBcmcpOwogIH0KICBjb21wYXJlVHJlZVBvc2l0aW9uKGxlZnRBcmcsIHJpZ2h0QXJnKSB7CiAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLmNvbXBhcmVUcmVlUG9zaXRpb24obGVmdEFyZywgcmlnaHRBcmcpOwogIH0KICByZW1vdmUocmVtb3ZlT2JqZWN0QXJnKSB7CiAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLnJlbW92ZShyZW1vdmVPYmplY3RBcmcpOwogIH0KICBpbnNlcnRCZWZvcmUocmVmZXJlbmNlT2JqZWN0QXJnLCBuZXdPYmplY3RBcmcpIHsKICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUuaW5zZXJ0QmVmb3JlKHJlZmVyZW5jZU9iamVjdEFyZywgbmV3T2JqZWN0QXJnKTsKICB9CiAgaW5zZXJ0QWZ0ZXIocmVmZXJlbmNlT2JqZWN0LCBuZXdPYmplY3RBcmcpIHsKICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUuaW5zZXJ0QWZ0ZXIocmVmZXJlbmNlT2JqZWN0LCBuZXdPYmplY3RBcmcpOwogIH0KICBwcmVwZW5kQ2hpbGQocmVmZXJlbmNlT2JqZWN0QXJnLCBuZXdPYmplY3RBcmcpIHsKICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUucHJlcGVuZENoaWxkKHJlZmVyZW5jZU9iamVjdEFyZywgbmV3T2JqZWN0QXJnKTsKICB9CiAgYXBwZW5kQ2hpbGQocmVmZXJlbmNlT2JqZWN0QXJnLCBuZXdPYmplY3RBcmcpIHsKICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUuYXBwZW5kQ2hpbGQocmVmZXJlbmNlT2JqZWN0QXJnLCBuZXdPYmplY3RBcmcpOwogIH0KICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgLy8gRnVuY3Rpb25hbGl0eSB0aGF0IGV4dGVuZHMgc3ltYm9sLXRyZWUKICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgLyoqCiAgICogcmV0dXJucyBhIGJyYW5jaCBvZiB0aGUgdHJlZSBhcyBhIHJlY3Vyc2l2ZSBKU09OIHN0cnVjdHVyZQogICAqLwogIHRvSnNvbldpdGhIaWVyYWNoeShyb290RWxlbWVudCkgewogICAgY29uc3QgYnVpbGROb2RlID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoZWxlbWVudDQpID0+IHsKICAgICAgY29uc3QgY2hpbGRyZW4yID0gW107CiAgICAgIGlmICh0aGlzLmhhc0NoaWxkcmVuKGVsZW1lbnQ0KSkgewogICAgICAgIGNvbnN0IGNoaWxkcmVuQXJyYXkgPSB0aGlzLmNoaWxkcmVuVG9BcnJheShlbGVtZW50NCwge30pOwogICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW5BcnJheSkgewogICAgICAgICAgY2hpbGRyZW4yLnB1c2goYnVpbGROb2RlKGNoaWxkKSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB7IGRhdGE6IGVsZW1lbnQ0LCBjaGlsZHJlbjogY2hpbGRyZW4yIH07CiAgICB9LCAiYnVpbGROb2RlIik7CiAgICByZXR1cm4gYnVpbGROb2RlKHJvb3RFbGVtZW50KTsKICB9CiAgLyoqCiAgICogYnVpbGRzIGEgdHJlZSBmcm9tIGEgcmVjdXJzaXZlIEpTT04gc3RydWN0dXJlCiAgICogQHBhcmFtIGpzb25Sb290IHRoZSByb290IG5vZGUgaW4gSVRyZWVOb2RlIGZvcm1hdAogICAqIEBwYXJhbSByZXZpdmVyIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIHJlY29uc3RydWN0IFQgZnJvbSBzZXJpYWxpemVkIGRhdGEKICAgKi8KICBmcm9tSnNvbldpdGhIaWVyYWNoeShqc29uUm9vdCwgcmV2aXZlcjMpIHsKICAgIGNvbnN0IGJ1aWxkVHJlZSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKG5vZGUyLCBwYXJlbnRFbGVtZW50KSA9PiB7CiAgICAgIGNvbnN0IGVsZW1lbnQ0ID0gcmV2aXZlcjMgPyByZXZpdmVyMyhub2RlMi5kYXRhKSA6IG5vZGUyLmRhdGE7CiAgICAgIHRoaXMuaW5pdGlhbGl6ZShlbGVtZW50NCk7CiAgICAgIGlmIChwYXJlbnRFbGVtZW50KSB7CiAgICAgICAgdGhpcy5hcHBlbmRDaGlsZChwYXJlbnRFbGVtZW50LCBlbGVtZW50NCk7CiAgICAgIH0KICAgICAgZm9yIChjb25zdCBjaGlsZE5vZGUgb2Ygbm9kZTIuY2hpbGRyZW4pIHsKICAgICAgICBidWlsZFRyZWUoY2hpbGROb2RlLCBlbGVtZW50NCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGVsZW1lbnQ0OwogICAgfSwgImJ1aWxkVHJlZSIpOwogICAgcmV0dXJuIGJ1aWxkVHJlZShqc29uUm9vdCk7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0YnVmZmVyQDMuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGJ1ZmZlci9kaXN0X3RzL2luZGV4LmpzCnZhciBkaXN0X3RzX2V4cG9ydHM4ID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czgsIHsKICBiYXNlNjRUb1VpbnQ4QXJyYXk6ICgpID0+IGJhc2U2NFRvVWludDhBcnJheTIsCiAgZW5zdXJlUHVyZVVpbnQ4QXJyYXk6ICgpID0+IGVuc3VyZVB1cmVVaW50OEFycmF5LAogIGlzQnVmZmVyTGlrZTogKCkgPT4gaXNCdWZmZXJMaWtlLAogIGlzVWludDhBcnJheTogKCkgPT4gaXNVaW50OEFycmF5MiwKICB1SW50OEFycmF5RXh0cmFzOiAoKSA9PiB1SW50OEFycmF5RXh0cmFzLAogIHVJbnQ4QXJyYXlUb0Jhc2U2NDogKCkgPT4gdUludDhBcnJheVRvQmFzZTY0Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3VpbnQ4YXJyYXktZXh0cmFzQDEuNS4wL25vZGVfbW9kdWxlcy91aW50OGFycmF5LWV4dHJhcy9pbmRleC5qcwp2YXIgdWludDhhcnJheV9leHRyYXNfZXhwb3J0cyA9IHt9OwpfX2V4cG9ydCh1aW50OGFycmF5X2V4dHJhc19leHBvcnRzLCB7CiAgYXJlVWludDhBcnJheXNFcXVhbDogKCkgPT4gYXJlVWludDhBcnJheXNFcXVhbCwKICBhc3NlcnRVaW50OEFycmF5OiAoKSA9PiBhc3NlcnRVaW50OEFycmF5LAogIGFzc2VydFVpbnQ4QXJyYXlPckFycmF5QnVmZmVyOiAoKSA9PiBhc3NlcnRVaW50OEFycmF5T3JBcnJheUJ1ZmZlciwKICBiYXNlNjRUb1N0cmluZzogKCkgPT4gYmFzZTY0VG9TdHJpbmcsCiAgYmFzZTY0VG9VaW50OEFycmF5OiAoKSA9PiBiYXNlNjRUb1VpbnQ4QXJyYXksCiAgY29tcGFyZVVpbnQ4QXJyYXlzOiAoKSA9PiBjb21wYXJlVWludDhBcnJheXMsCiAgY29uY2F0VWludDhBcnJheXM6ICgpID0+IGNvbmNhdFVpbnQ4QXJyYXlzLAogIGdldFVpbnRCRTogKCkgPT4gZ2V0VWludEJFLAogIGhleFRvVWludDhBcnJheTogKCkgPT4gaGV4VG9VaW50OEFycmF5LAogIGluY2x1ZGVzOiAoKSA9PiBpbmNsdWRlcywKICBpbmRleE9mOiAoKSA9PiBpbmRleE9mLAogIGlzVWludDhBcnJheTogKCkgPT4gaXNVaW50OEFycmF5LAogIHN0cmluZ1RvQmFzZTY0OiAoKSA9PiBzdHJpbmdUb0Jhc2U2NCwKICBzdHJpbmdUb1VpbnQ4QXJyYXk6ICgpID0+IHN0cmluZ1RvVWludDhBcnJheSwKICB0b1VpbnQ4QXJyYXk6ICgpID0+IHRvVWludDhBcnJheSwKICB1aW50OEFycmF5VG9CYXNlNjQ6ICgpID0+IHVpbnQ4QXJyYXlUb0Jhc2U2NCwKICB1aW50OEFycmF5VG9IZXg6ICgpID0+IHVpbnQ4QXJyYXlUb0hleCwKICB1aW50OEFycmF5VG9TdHJpbmc6ICgpID0+IHVpbnQ4QXJyYXlUb1N0cmluZwp9KTsKdmFyIG9iamVjdFRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsKdmFyIHVpbnQ4QXJyYXlTdHJpbmdpZmllZCA9ICJbb2JqZWN0IFVpbnQ4QXJyYXldIjsKdmFyIGFycmF5QnVmZmVyU3RyaW5naWZpZWQgPSAiW29iamVjdCBBcnJheUJ1ZmZlcl0iOwpmdW5jdGlvbiBpc1R5cGUodmFsdWUyLCB0eXBlQ29uc3RydWN0b3IsIHR5cGVTdHJpbmdpZmllZCkgewogIGlmICghdmFsdWUyKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGlmICh2YWx1ZTIuY29uc3RydWN0b3IgPT09IHR5cGVDb25zdHJ1Y3RvcikgewogICAgcmV0dXJuIHRydWU7CiAgfQogIHJldHVybiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlMikgPT09IHR5cGVTdHJpbmdpZmllZDsKfQpfX25hbWUoaXNUeXBlLCAiaXNUeXBlIik7CmZ1bmN0aW9uIGlzVWludDhBcnJheSh2YWx1ZTIpIHsKICByZXR1cm4gaXNUeXBlKHZhbHVlMiwgVWludDhBcnJheSwgdWludDhBcnJheVN0cmluZ2lmaWVkKTsKfQpfX25hbWUoaXNVaW50OEFycmF5LCAiaXNVaW50OEFycmF5Iik7CmZ1bmN0aW9uIGlzQXJyYXlCdWZmZXIodmFsdWUyKSB7CiAgcmV0dXJuIGlzVHlwZSh2YWx1ZTIsIEFycmF5QnVmZmVyLCBhcnJheUJ1ZmZlclN0cmluZ2lmaWVkKTsKfQpfX25hbWUoaXNBcnJheUJ1ZmZlciwgImlzQXJyYXlCdWZmZXIiKTsKZnVuY3Rpb24gaXNVaW50OEFycmF5T3JBcnJheUJ1ZmZlcih2YWx1ZTIpIHsKICByZXR1cm4gaXNVaW50OEFycmF5KHZhbHVlMikgfHwgaXNBcnJheUJ1ZmZlcih2YWx1ZTIpOwp9Cl9fbmFtZShpc1VpbnQ4QXJyYXlPckFycmF5QnVmZmVyLCAiaXNVaW50OEFycmF5T3JBcnJheUJ1ZmZlciIpOwpmdW5jdGlvbiBhc3NlcnRVaW50OEFycmF5KHZhbHVlMikgewogIGlmICghaXNVaW50OEFycmF5KHZhbHVlMikpIHsKICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIFxgVWludDhBcnJheVxgLCBnb3QgXGAke3R5cGVvZiB2YWx1ZTJ9XGBgKTsKICB9Cn0KX19uYW1lKGFzc2VydFVpbnQ4QXJyYXksICJhc3NlcnRVaW50OEFycmF5Iik7CmZ1bmN0aW9uIGFzc2VydFVpbnQ4QXJyYXlPckFycmF5QnVmZmVyKHZhbHVlMikgewogIGlmICghaXNVaW50OEFycmF5T3JBcnJheUJ1ZmZlcih2YWx1ZTIpKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBcYFVpbnQ4QXJyYXlcYCBvciBcYEFycmF5QnVmZmVyXGAsIGdvdCBcYCR7dHlwZW9mIHZhbHVlMn1cYGApOwogIH0KfQpfX25hbWUoYXNzZXJ0VWludDhBcnJheU9yQXJyYXlCdWZmZXIsICJhc3NlcnRVaW50OEFycmF5T3JBcnJheUJ1ZmZlciIpOwpmdW5jdGlvbiB0b1VpbnQ4QXJyYXkodmFsdWUyKSB7CiAgaWYgKHZhbHVlMiBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7CiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkodmFsdWUyKTsKICB9CiAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyh2YWx1ZTIpKSB7CiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkodmFsdWUyLmJ1ZmZlciwgdmFsdWUyLmJ5dGVPZmZzZXQsIHZhbHVlMi5ieXRlTGVuZ3RoKTsKICB9CiAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVW5zdXBwb3J0ZWQgdmFsdWUsIGdvdCBcYCR7dHlwZW9mIHZhbHVlMn1cYC5gKTsKfQpfX25hbWUodG9VaW50OEFycmF5LCAidG9VaW50OEFycmF5Iik7CmZ1bmN0aW9uIGNvbmNhdFVpbnQ4QXJyYXlzKGFycmF5cywgdG90YWxMZW5ndGgpIHsKICBpZiAoYXJyYXlzLmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KDApOwogIH0KICB0b3RhbExlbmd0aCA/Pz0gYXJyYXlzLnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJlbnRWYWx1ZSkgPT4gYWNjdW11bGF0b3IgKyBjdXJyZW50VmFsdWUubGVuZ3RoLCAwKTsKICBjb25zdCByZXR1cm5WYWx1ZSA9IG5ldyBVaW50OEFycmF5KHRvdGFsTGVuZ3RoKTsKICBsZXQgb2Zmc2V0ID0gMDsKICBmb3IgKGNvbnN0IGFycmF5IG9mIGFycmF5cykgewogICAgYXNzZXJ0VWludDhBcnJheShhcnJheSk7CiAgICByZXR1cm5WYWx1ZS5zZXQoYXJyYXksIG9mZnNldCk7CiAgICBvZmZzZXQgKz0gYXJyYXkubGVuZ3RoOwogIH0KICByZXR1cm4gcmV0dXJuVmFsdWU7Cn0KX19uYW1lKGNvbmNhdFVpbnQ4QXJyYXlzLCAiY29uY2F0VWludDhBcnJheXMiKTsKZnVuY3Rpb24gYXJlVWludDhBcnJheXNFcXVhbChhNCwgYjQpIHsKICBhc3NlcnRVaW50OEFycmF5KGE0KTsKICBhc3NlcnRVaW50OEFycmF5KGI0KTsKICBpZiAoYTQgPT09IGI0KSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgaWYgKGE0Lmxlbmd0aCAhPT0gYjQubGVuZ3RoKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGZvciAobGV0IGluZGV4MiA9IDA7IGluZGV4MiA8IGE0Lmxlbmd0aDsgaW5kZXgyKyspIHsKICAgIGlmIChhNFtpbmRleDJdICE9PSBiNFtpbmRleDJdKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgcmV0dXJuIHRydWU7Cn0KX19uYW1lKGFyZVVpbnQ4QXJyYXlzRXF1YWwsICJhcmVVaW50OEFycmF5c0VxdWFsIik7CmZ1bmN0aW9uIGNvbXBhcmVVaW50OEFycmF5cyhhNCwgYjQpIHsKICBhc3NlcnRVaW50OEFycmF5KGE0KTsKICBhc3NlcnRVaW50OEFycmF5KGI0KTsKICBjb25zdCBsZW5ndGggPSBNYXRoLm1pbihhNC5sZW5ndGgsIGI0Lmxlbmd0aCk7CiAgZm9yIChsZXQgaW5kZXgyID0gMDsgaW5kZXgyIDwgbGVuZ3RoOyBpbmRleDIrKykgewogICAgY29uc3QgZGlmZiA9IGE0W2luZGV4Ml0gLSBiNFtpbmRleDJdOwogICAgaWYgKGRpZmYgIT09IDApIHsKICAgICAgcmV0dXJuIE1hdGguc2lnbihkaWZmKTsKICAgIH0KICB9CiAgcmV0dXJuIE1hdGguc2lnbihhNC5sZW5ndGggLSBiNC5sZW5ndGgpOwp9Cl9fbmFtZShjb21wYXJlVWludDhBcnJheXMsICJjb21wYXJlVWludDhBcnJheXMiKTsKdmFyIGNhY2hlZERlY29kZXJzID0gewogIHV0Zjg6IG5ldyBnbG9iYWxUaGlzLlRleHREZWNvZGVyKCJ1dGY4IikKfTsKZnVuY3Rpb24gdWludDhBcnJheVRvU3RyaW5nKGFycmF5LCBlbmNvZGluZyA9ICJ1dGY4IikgewogIGFzc2VydFVpbnQ4QXJyYXlPckFycmF5QnVmZmVyKGFycmF5KTsKICBjYWNoZWREZWNvZGVyc1tlbmNvZGluZ10gPz89IG5ldyBnbG9iYWxUaGlzLlRleHREZWNvZGVyKGVuY29kaW5nKTsKICByZXR1cm4gY2FjaGVkRGVjb2RlcnNbZW5jb2RpbmddLmRlY29kZShhcnJheSk7Cn0KX19uYW1lKHVpbnQ4QXJyYXlUb1N0cmluZywgInVpbnQ4QXJyYXlUb1N0cmluZyIpOwpmdW5jdGlvbiBhc3NlcnRTdHJpbmcodmFsdWUyKSB7CiAgaWYgKHR5cGVvZiB2YWx1ZTIgIT09ICJzdHJpbmciKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBcYHN0cmluZ1xgLCBnb3QgXGAke3R5cGVvZiB2YWx1ZTJ9XGBgKTsKICB9Cn0KX19uYW1lKGFzc2VydFN0cmluZywgImFzc2VydFN0cmluZyIpOwp2YXIgY2FjaGVkRW5jb2RlciA9IG5ldyBnbG9iYWxUaGlzLlRleHRFbmNvZGVyKCk7CmZ1bmN0aW9uIHN0cmluZ1RvVWludDhBcnJheShzdHJpbmczKSB7CiAgYXNzZXJ0U3RyaW5nKHN0cmluZzMpOwogIHJldHVybiBjYWNoZWRFbmNvZGVyLmVuY29kZShzdHJpbmczKTsKfQpfX25hbWUoc3RyaW5nVG9VaW50OEFycmF5LCAic3RyaW5nVG9VaW50OEFycmF5Iik7CmZ1bmN0aW9uIGJhc2U2NFRvQmFzZTY0VXJsKGJhc2U2NDIpIHsKICByZXR1cm4gYmFzZTY0Mi5yZXBsYWNlQWxsKCIrIiwgIi0iKS5yZXBsYWNlQWxsKCIvIiwgIl8iKS5yZXBsYWNlKC89KyQvLCAiIik7Cn0KX19uYW1lKGJhc2U2NFRvQmFzZTY0VXJsLCAiYmFzZTY0VG9CYXNlNjRVcmwiKTsKZnVuY3Rpb24gYmFzZTY0VXJsVG9CYXNlNjQoYmFzZTY0dXJsKSB7CiAgY29uc3QgYmFzZTY0MiA9IGJhc2U2NHVybC5yZXBsYWNlQWxsKCItIiwgIisiKS5yZXBsYWNlQWxsKCJfIiwgIi8iKTsKICBjb25zdCBwYWRkaW5nID0gKDQgLSBiYXNlNjQyLmxlbmd0aCAlIDQpICUgNDsKICByZXR1cm4gYmFzZTY0MiArICI9Ii5yZXBlYXQocGFkZGluZyk7Cn0KX19uYW1lKGJhc2U2NFVybFRvQmFzZTY0LCAiYmFzZTY0VXJsVG9CYXNlNjQiKTsKdmFyIE1BWF9CTE9DS19TSVpFID0gNjU1MzU7CmZ1bmN0aW9uIHVpbnQ4QXJyYXlUb0Jhc2U2NChhcnJheSwgeyB1cmxTYWZlID0gZmFsc2UgfSA9IHt9KSB7CiAgYXNzZXJ0VWludDhBcnJheShhcnJheSk7CiAgbGV0IGJhc2U2NDIgPSAiIjsKICBmb3IgKGxldCBpbmRleDIgPSAwOyBpbmRleDIgPCBhcnJheS5sZW5ndGg7IGluZGV4MiArPSBNQVhfQkxPQ0tfU0laRSkgewogICAgY29uc3QgY2h1bmsgPSBhcnJheS5zdWJhcnJheShpbmRleDIsIGluZGV4MiArIE1BWF9CTE9DS19TSVpFKTsKICAgIGJhc2U2NDIgKz0gZ2xvYmFsVGhpcy5idG9hKFN0cmluZy5mcm9tQ29kZVBvaW50LmFwcGx5KHZvaWQgMCwgY2h1bmspKTsKICB9CiAgcmV0dXJuIHVybFNhZmUgPyBiYXNlNjRUb0Jhc2U2NFVybChiYXNlNjQyKSA6IGJhc2U2NDI7Cn0KX19uYW1lKHVpbnQ4QXJyYXlUb0Jhc2U2NCwgInVpbnQ4QXJyYXlUb0Jhc2U2NCIpOwpmdW5jdGlvbiBiYXNlNjRUb1VpbnQ4QXJyYXkoYmFzZTY0U3RyaW5nKSB7CiAgYXNzZXJ0U3RyaW5nKGJhc2U2NFN0cmluZyk7CiAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShnbG9iYWxUaGlzLmF0b2IoYmFzZTY0VXJsVG9CYXNlNjQoYmFzZTY0U3RyaW5nKSksICh4MykgPT4geDMuY29kZVBvaW50QXQoMCkpOwp9Cl9fbmFtZShiYXNlNjRUb1VpbnQ4QXJyYXksICJiYXNlNjRUb1VpbnQ4QXJyYXkiKTsKZnVuY3Rpb24gc3RyaW5nVG9CYXNlNjQoc3RyaW5nMywgeyB1cmxTYWZlID0gZmFsc2UgfSA9IHt9KSB7CiAgYXNzZXJ0U3RyaW5nKHN0cmluZzMpOwogIHJldHVybiB1aW50OEFycmF5VG9CYXNlNjQoc3RyaW5nVG9VaW50OEFycmF5KHN0cmluZzMpLCB7IHVybFNhZmUgfSk7Cn0KX19uYW1lKHN0cmluZ1RvQmFzZTY0LCAic3RyaW5nVG9CYXNlNjQiKTsKZnVuY3Rpb24gYmFzZTY0VG9TdHJpbmcoYmFzZTY0U3RyaW5nKSB7CiAgYXNzZXJ0U3RyaW5nKGJhc2U2NFN0cmluZyk7CiAgcmV0dXJuIHVpbnQ4QXJyYXlUb1N0cmluZyhiYXNlNjRUb1VpbnQ4QXJyYXkoYmFzZTY0U3RyaW5nKSk7Cn0KX19uYW1lKGJhc2U2NFRvU3RyaW5nLCAiYmFzZTY0VG9TdHJpbmciKTsKdmFyIGJ5dGVUb0hleExvb2t1cFRhYmxlID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogMjU2IH0sIChfMywgaW5kZXgyKSA9PiBpbmRleDIudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICIwIikpOwpmdW5jdGlvbiB1aW50OEFycmF5VG9IZXgoYXJyYXkpIHsKICBhc3NlcnRVaW50OEFycmF5KGFycmF5KTsKICBsZXQgaGV4U3RyaW5nID0gIiI7CiAgZm9yIChsZXQgaW5kZXgyID0gMDsgaW5kZXgyIDwgYXJyYXkubGVuZ3RoOyBpbmRleDIrKykgewogICAgaGV4U3RyaW5nICs9IGJ5dGVUb0hleExvb2t1cFRhYmxlW2FycmF5W2luZGV4Ml1dOwogIH0KICByZXR1cm4gaGV4U3RyaW5nOwp9Cl9fbmFtZSh1aW50OEFycmF5VG9IZXgsICJ1aW50OEFycmF5VG9IZXgiKTsKdmFyIGhleFRvRGVjaW1hbExvb2t1cFRhYmxlID0gewogIDA6IDAsCiAgMTogMSwKICAyOiAyLAogIDM6IDMsCiAgNDogNCwKICA1OiA1LAogIDY6IDYsCiAgNzogNywKICA4OiA4LAogIDk6IDksCiAgYTogMTAsCiAgYjogMTEsCiAgYzogMTIsCiAgZDogMTMsCiAgZTogMTQsCiAgZjogMTUsCiAgQTogMTAsCiAgQjogMTEsCiAgQzogMTIsCiAgRDogMTMsCiAgRTogMTQsCiAgRjogMTUKfTsKZnVuY3Rpb24gaGV4VG9VaW50OEFycmF5KGhleFN0cmluZykgewogIGFzc2VydFN0cmluZyhoZXhTdHJpbmcpOwogIGlmIChoZXhTdHJpbmcubGVuZ3RoICUgMiAhPT0gMCkgewogICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIEhleCBzdHJpbmcgbGVuZ3RoLiIpOwogIH0KICBjb25zdCByZXN1bHRMZW5ndGggPSBoZXhTdHJpbmcubGVuZ3RoIC8gMjsKICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KHJlc3VsdExlbmd0aCk7CiAgZm9yIChsZXQgaW5kZXgyID0gMDsgaW5kZXgyIDwgcmVzdWx0TGVuZ3RoOyBpbmRleDIrKykgewogICAgY29uc3QgaGlnaE5pYmJsZSA9IGhleFRvRGVjaW1hbExvb2t1cFRhYmxlW2hleFN0cmluZ1tpbmRleDIgKiAyXV07CiAgICBjb25zdCBsb3dOaWJibGUgPSBoZXhUb0RlY2ltYWxMb29rdXBUYWJsZVtoZXhTdHJpbmdbaW5kZXgyICogMiArIDFdXTsKICAgIGlmIChoaWdoTmliYmxlID09PSB2b2lkIDAgfHwgbG93TmliYmxlID09PSB2b2lkIDApIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIEhleCBjaGFyYWN0ZXIgZW5jb3VudGVyZWQgYXQgcG9zaXRpb24gJHtpbmRleDIgKiAyfWApOwogICAgfQogICAgYnl0ZXNbaW5kZXgyXSA9IGhpZ2hOaWJibGUgPDwgNCB8IGxvd05pYmJsZTsKICB9CiAgcmV0dXJuIGJ5dGVzOwp9Cl9fbmFtZShoZXhUb1VpbnQ4QXJyYXksICJoZXhUb1VpbnQ4QXJyYXkiKTsKZnVuY3Rpb24gZ2V0VWludEJFKHZpZXcpIHsKICBjb25zdCB7IGJ5dGVMZW5ndGggfSA9IHZpZXc7CiAgaWYgKGJ5dGVMZW5ndGggPT09IDYpIHsKICAgIHJldHVybiB2aWV3LmdldFVpbnQxNigwKSAqIDIgKiogMzIgKyB2aWV3LmdldFVpbnQzMigyKTsKICB9CiAgaWYgKGJ5dGVMZW5ndGggPT09IDUpIHsKICAgIHJldHVybiB2aWV3LmdldFVpbnQ4KDApICogMiAqKiAzMiArIHZpZXcuZ2V0VWludDMyKDEpOwogIH0KICBpZiAoYnl0ZUxlbmd0aCA9PT0gNCkgewogICAgcmV0dXJuIHZpZXcuZ2V0VWludDMyKDApOwogIH0KICBpZiAoYnl0ZUxlbmd0aCA9PT0gMykgewogICAgcmV0dXJuIHZpZXcuZ2V0VWludDgoMCkgKiAyICoqIDE2ICsgdmlldy5nZXRVaW50MTYoMSk7CiAgfQogIGlmIChieXRlTGVuZ3RoID09PSAyKSB7CiAgICByZXR1cm4gdmlldy5nZXRVaW50MTYoMCk7CiAgfQogIGlmIChieXRlTGVuZ3RoID09PSAxKSB7CiAgICByZXR1cm4gdmlldy5nZXRVaW50OCgwKTsKICB9Cn0KX19uYW1lKGdldFVpbnRCRSwgImdldFVpbnRCRSIpOwpmdW5jdGlvbiBpbmRleE9mKGFycmF5LCB2YWx1ZTIpIHsKICBjb25zdCBhcnJheUxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKICBjb25zdCB2YWx1ZUxlbmd0aCA9IHZhbHVlMi5sZW5ndGg7CiAgaWYgKHZhbHVlTGVuZ3RoID09PSAwKSB7CiAgICByZXR1cm4gLTE7CiAgfQogIGlmICh2YWx1ZUxlbmd0aCA+IGFycmF5TGVuZ3RoKSB7CiAgICByZXR1cm4gLTE7CiAgfQogIGNvbnN0IHZhbGlkT2Zmc2V0TGVuZ3RoID0gYXJyYXlMZW5ndGggLSB2YWx1ZUxlbmd0aDsKICBmb3IgKGxldCBpbmRleDIgPSAwOyBpbmRleDIgPD0gdmFsaWRPZmZzZXRMZW5ndGg7IGluZGV4MisrKSB7CiAgICBsZXQgaXNNYXRjaDMgPSB0cnVlOwogICAgZm9yIChsZXQgaW5kZXgyMiA9IDA7IGluZGV4MjIgPCB2YWx1ZUxlbmd0aDsgaW5kZXgyMisrKSB7CiAgICAgIGlmIChhcnJheVtpbmRleDIgKyBpbmRleDIyXSAhPT0gdmFsdWUyW2luZGV4MjJdKSB7CiAgICAgICAgaXNNYXRjaDMgPSBmYWxzZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaWYgKGlzTWF0Y2gzKSB7CiAgICAgIHJldHVybiBpbmRleDI7CiAgICB9CiAgfQogIHJldHVybiAtMTsKfQpfX25hbWUoaW5kZXhPZiwgImluZGV4T2YiKTsKZnVuY3Rpb24gaW5jbHVkZXMoYXJyYXksIHZhbHVlMikgewogIHJldHVybiBpbmRleE9mKGFycmF5LCB2YWx1ZTIpICE9PSAtMTsKfQpfX25hbWUoaW5jbHVkZXMsICJpbmNsdWRlcyIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0YnVmZmVyQDMuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGJ1ZmZlci9kaXN0X3RzL2luZGV4LmpzCnZhciB1SW50OEFycmF5RXh0cmFzID0gdWludDhhcnJheV9leHRyYXNfZXhwb3J0czsKZnVuY3Rpb24gdUludDhBcnJheVRvQmFzZTY0KHVJbnQ4QXJyYXkpIHsKICByZXR1cm4gdWludDhhcnJheV9leHRyYXNfZXhwb3J0cy51aW50OEFycmF5VG9CYXNlNjQodUludDhBcnJheSk7Cn0KX19uYW1lKHVJbnQ4QXJyYXlUb0Jhc2U2NCwgInVJbnQ4QXJyYXlUb0Jhc2U2NCIpOwpmdW5jdGlvbiBiYXNlNjRUb1VpbnQ4QXJyYXkyKGJhc2U2NDIpIHsKICByZXR1cm4gdWludDhhcnJheV9leHRyYXNfZXhwb3J0cy5iYXNlNjRUb1VpbnQ4QXJyYXkoYmFzZTY0Mik7Cn0KX19uYW1lKGJhc2U2NFRvVWludDhBcnJheTIsICJiYXNlNjRUb1VpbnQ4QXJyYXkiKTsKdmFyIGlzVWludDhBcnJheTIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChvYmopID0+IHsKICByZXR1cm4gdWludDhhcnJheV9leHRyYXNfZXhwb3J0cy5pc1VpbnQ4QXJyYXkob2JqKTsKfSwgImlzVWludDhBcnJheSIpOwpmdW5jdGlvbiBpc0J1ZmZlckxpa2Uob2JqKSB7CiAgaWYgKG9iaiAmJiB0eXBlb2Ygb2JqLmJ5dGVMZW5ndGggPT09ICJudW1iZXIiKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgaWYgKHR5cGVvZiBCdWZmZXIgIT09ICJ1bmRlZmluZWQiICYmIEJ1ZmZlci5pc0J1ZmZlcikgewogICAgcmV0dXJuIEJ1ZmZlci5pc0J1ZmZlcihvYmopOwogIH0KICByZXR1cm4gZmFsc2U7Cn0KX19uYW1lKGlzQnVmZmVyTGlrZSwgImlzQnVmZmVyTGlrZSIpOwpmdW5jdGlvbiBlbnN1cmVQdXJlVWludDhBcnJheShidWZmZXJBcmcpIHsKICBjb25zdCB1aW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyQXJnLmxlbmd0aCk7CiAgdWludDhBcnJheS5zZXQoYnVmZmVyQXJnKTsKICByZXR1cm4gdWludDhBcnJheTsKfQpfX25hbWUoZW5zdXJlUHVyZVVpbnQ4QXJyYXksICJlbnN1cmVQdXJlVWludDhBcnJheSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0Z3VhcmRAMy4xLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0Z3VhcmQvZGlzdF90cy9pbmRleC5qcwp2YXIgZGlzdF90c19leHBvcnRzOSA9IHt9OwpfX2V4cG9ydChkaXN0X3RzX2V4cG9ydHM5LCB7CiAgR3VhcmQ6ICgpID0+IEd1YXJkLAogIEd1YXJkRXJyb3I6ICgpID0+IEd1YXJkRXJyb3IsCiAgR3VhcmRTZXQ6ICgpID0+IEd1YXJkU2V0LAogIHBhc3NHdWFyZHNPclJlamVjdDogKCkgPT4gcGFzc0d1YXJkc09yUmVqZWN0Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0Z3VhcmRAMy4xLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0Z3VhcmQvZGlzdF90cy9jbGFzc2VzLmd1YXJkLmpzCnZhciBHdWFyZCA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJHdWFyZCIpOwogIH0KICBjb25zdHJ1Y3RvcihndWFyZEZ1bmN0aW9uQXJnLCBvcHRpb25zQXJnKSB7CiAgICB0aGlzLmd1YXJkRnVuY3Rpb24gPSBndWFyZEZ1bmN0aW9uQXJnOwogICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc0FyZzsKICB9CiAgLyoqCiAgICogZXhlY3V0ZXMgdGhlIGd1YXJkIGFnYWluc3QgYSBkYXRhIGFyZ3VtZW50OwogICAqIEBwYXJhbSBkYXRhQXJnCiAgICovCiAgYXN5bmMgZXhlYyhkYXRhQXJnKSB7CiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmd1YXJkRnVuY3Rpb24oZGF0YUFyZyk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KICBhc3luYyBnZXRGYWlsZWRIaW50KGRhdGFBcmcpIHsKICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlYyhkYXRhQXJnKTsKICAgIGlmICghcmVzdWx0KSB7CiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZmFpbGVkSGludDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydGd1YXJkQDMuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGd1YXJkL2Rpc3RfdHMvY2xhc3Nlcy5ndWFyZGVycm9yLmpzCnZhciBHdWFyZEVycm9yID0gY2xhc3MgZXh0ZW5kcyBFcnJvciB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiR3VhcmRFcnJvciIpOwogIH0KICBjb25zdHJ1Y3RvcihtZXNzYWdlMikgewogICAgc3VwZXIobWVzc2FnZTIpOwogICAgdGhpcy5uYW1lID0gIkd1YXJkRXJyb3IiOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydGd1YXJkQDMuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGd1YXJkL2Rpc3RfdHMvY2xhc3Nlcy5ndWFyZHNldC5qcwp2YXIgR3VhcmRTZXQgPSBjbGFzcyBleHRlbmRzIEd1YXJkIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJHdWFyZFNldCIpOwogIH0KICBjb25zdHJ1Y3RvcihndWFyZEFycmF5ID0gW10pIHsKICAgIHN1cGVyKGFzeW5jIChkYXRhQXJnKSA9PiB7CiAgICAgIHJldHVybiB0aGlzLmFsbEd1YXJkc1Bhc3MoZGF0YUFyZyk7CiAgICB9KTsKICAgIHRoaXMuZ3VhcmRzID0gZ3VhcmRBcnJheTsKICB9CiAgLyoqCiAgICogZXhlY3V0ZXMgYWxsIGd1YXJkcyBpbiBhbGwgZ3VhcmRTZXRzIGFnYWluc3QgYSBkYXRhIGFyZ3VtZW50CiAgICogQHBhcmFtIGRhdGFBcmcKICAgKi8KICBhc3luYyBleGVjQWxsV2l0aERhdGEoZGF0YUFyZywgb3B0aW9uc0FyZyA9IHsKICAgIG1vZGU6ICJwYXJhbGxlbCIsCiAgICBzdG9wT25GYWlsOiBmYWxzZQogIH0pIHsKICAgIGNvbnN0IHJlc3VsdFByb21pc2VzID0gW107CiAgICBmb3IgKGNvbnN0IGd1YXJkIG9mIHRoaXMuZ3VhcmRzKSB7CiAgICAgIGNvbnN0IGd1YXJkUmVzdWx0UHJvbWlzZSA9IGd1YXJkLmV4ZWMoZGF0YUFyZyk7CiAgICAgIGlmIChvcHRpb25zQXJnLm1vZGUgPT09ICJzZXJpYWwiKSB7CiAgICAgICAgYXdhaXQgZ3VhcmRSZXN1bHRQcm9taXNlOwogICAgICB9CiAgICAgIHJlc3VsdFByb21pc2VzLnB1c2goZ3VhcmRSZXN1bHRQcm9taXNlKTsKICAgICAgaWYgKG9wdGlvbnNBcmcuc3RvcE9uRmFpbCkgewogICAgICAgIGlmICghYXdhaXQgZ3VhcmRSZXN1bHRQcm9taXNlKSB7CiAgICAgICAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwocmVzdWx0UHJvbWlzZXMpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKHJlc3VsdFByb21pc2VzKTsKICAgIHJldHVybiByZXN1bHRzOwogIH0KICAvKioKICAgKiBjaGVja3MgaWYgYWxsIGd1YXJkcyBwYXNzCiAgICogQHBhcmFtIGRhdGFBcmcKICAgKi8KICBhc3luYyBhbGxHdWFyZHNQYXNzKGRhdGFBcmcsIG9wdGlvbnNBcmcgPSB7CiAgICBtb2RlOiAicGFyYWxsZWwiLAogICAgc3RvcE9uRmFpbDogZmFsc2UKICB9KSB7CiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5leGVjQWxsV2l0aERhdGEoZGF0YUFyZywgb3B0aW9uc0FyZyk7CiAgICByZXR1cm4gcmVzdWx0cy5ldmVyeSgocmVzdWx0KSA9PiByZXN1bHQpOwogIH0KICAvKioKICAgKiBjaGVja3MgaWYgYW55IGd1YXJkIHBhc3NlcwogICAqIEBwYXJhbSBkYXRhQXJnCiAgICovCiAgYXN5bmMgYW55R3VhcmRzUGFzcyhkYXRhQXJnKSB7CiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5leGVjQWxsV2l0aERhdGEoZGF0YUFyZywgewogICAgICBtb2RlOiAicGFyYWxsZWwiLAogICAgICBzdG9wT25GYWlsOiBmYWxzZQogICAgfSk7CiAgICByZXR1cm4gcmVzdWx0cy5zb21lKChyZXN1bHQpID0+IHJlc3VsdCk7CiAgfQogIC8qKgogICAqIHJldHVybnMgdGhlIGZpcnN0IHJlYXNvbiBmb3Igd2h5IHNvbWV0aGluZyBmYWlscwogICAqIEBwYXJhbSBkYXRhQXJnCiAgICogQHJldHVybnMKICAgKi8KICBnZXRGYWlsZWRIaW50KGRhdGFBcmcpIHsKICAgIGZvciAoY29uc3QgZ3VhcmQgb2YgdGhpcy5ndWFyZHMpIHsKICAgICAgY29uc3QgZmFpbGVkSGludCA9IGd1YXJkLmdldEZhaWxlZEhpbnQoZGF0YUFyZyk7CiAgICAgIGlmIChmYWlsZWRIaW50KSB7CiAgICAgICAgcmV0dXJuIGZhaWxlZEhpbnQ7CiAgICAgIH0KICAgIH0KICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRndWFyZEAzLjEuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRndWFyZC9kaXN0X3RzL2luZGV4LmpzCnZhciBwYXNzR3VhcmRzT3JSZWplY3QgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGFzeW5jIChkYXRhQXJnLCBndWFyZHMpID0+IHsKICBjb25zdCBndWFyZFNldCA9IG5ldyBHdWFyZFNldChndWFyZHMpOwogIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGd1YXJkU2V0LmFsbEd1YXJkc1Bhc3MoZGF0YUFyZyk7CiAgaWYgKCFyZXN1bHQpIHsKICAgIGNvbnN0IGZhaWxlZEhpbnQgPSBhd2FpdCBndWFyZFNldC5nZXRGYWlsZWRIaW50KGRhdGFBcmcpOwogICAgdGhyb3cgbmV3IEd1YXJkRXJyb3IoYEd1YXJkcyBmYWlsZWQ6CiR7ZmFpbGVkSGludH0KICAgIGApOwogIH0KICByZXR1cm47Cn0sICJwYXNzR3VhcmRzT3JSZWplY3QiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJyZXF1ZXN0QDQuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJyZXF1ZXN0L2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czE0ID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czE0LCB7CiAgQ2FjaGVNYW5hZ2VyOiAoKSA9PiBDYWNoZU1hbmFnZXIsCiAgQ2FjaGVTdG9yZTogKCkgPT4gQ2FjaGVTdG9yZSwKICBJbnRlcmNlcHRvck1hbmFnZXI6ICgpID0+IEludGVyY2VwdG9yTWFuYWdlciwKICBSZXF1ZXN0RGVkdXBsaWNhdG9yOiAoKSA9PiBSZXF1ZXN0RGVkdXBsaWNhdG9yLAogIFJldHJ5TWFuYWdlcjogKCkgPT4gUmV0cnlNYW5hZ2VyLAogIFdlYnJlcXVlc3RDbGllbnQ6ICgpID0+IFdlYnJlcXVlc3RDbGllbnQsCiAgY3JlYXRlQ29uZGl0aW9uYWxIZWFkZXJzOiAoKSA9PiBjcmVhdGVDb25kaXRpb25hbEhlYWRlcnMsCiAgZXh0cmFjdENhY2hlTWV0YWRhdGE6ICgpID0+IGV4dHJhY3RDYWNoZU1ldGFkYXRhLAogIGhlYWRlcnNUb09iamVjdDogKCkgPT4gaGVhZGVyc1RvT2JqZWN0LAogIGlzRnJlc2g6ICgpID0+IGlzRnJlc2gsCiAgb2JqZWN0VG9IZWFkZXJzOiAoKSA9PiBvYmplY3RUb0hlYWRlcnMsCiAgcmVxdWlyZXNSZXZhbGlkYXRpb246ICgpID0+IHJlcXVpcmVzUmV2YWxpZGF0aW9uLAogIHdlYnJlcXVlc3Q6ICgpID0+IHdlYnJlcXVlc3QKfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrd2VicmVxdWVzdEA0LjAuNS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2VicmVxdWVzdC9kaXN0X3RzL2ludGVyY2VwdG9ycy9pbnRlcmNlcHRvci5tYW5hZ2VyLmpzCnZhciBJbnRlcmNlcHRvck1hbmFnZXIgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiSW50ZXJjZXB0b3JNYW5hZ2VyIik7CiAgfQogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5yZXF1ZXN0SW50ZXJjZXB0b3JzID0gW107CiAgICB0aGlzLnJlc3BvbnNlSW50ZXJjZXB0b3JzID0gW107CiAgICB0aGlzLmVycm9ySW50ZXJjZXB0b3JzID0gW107CiAgfQogIC8qKgogICAqIEFkZCBhIHJlcXVlc3QgaW50ZXJjZXB0b3IKICAgKi8KICBhZGRSZXF1ZXN0SW50ZXJjZXB0b3IoaW50ZXJjZXB0b3IpIHsKICAgIHRoaXMucmVxdWVzdEludGVyY2VwdG9ycy5wdXNoKGludGVyY2VwdG9yKTsKICB9CiAgLyoqCiAgICogQWRkIGEgcmVzcG9uc2UgaW50ZXJjZXB0b3IKICAgKi8KICBhZGRSZXNwb25zZUludGVyY2VwdG9yKGludGVyY2VwdG9yKSB7CiAgICB0aGlzLnJlc3BvbnNlSW50ZXJjZXB0b3JzLnB1c2goaW50ZXJjZXB0b3IpOwogIH0KICAvKioKICAgKiBBZGQgYW4gZXJyb3IgaW50ZXJjZXB0b3IKICAgKi8KICBhZGRFcnJvckludGVyY2VwdG9yKGludGVyY2VwdG9yKSB7CiAgICB0aGlzLmVycm9ySW50ZXJjZXB0b3JzLnB1c2goaW50ZXJjZXB0b3IpOwogIH0KICAvKioKICAgKiBSZW1vdmUgYSByZXF1ZXN0IGludGVyY2VwdG9yCiAgICovCiAgcmVtb3ZlUmVxdWVzdEludGVyY2VwdG9yKGludGVyY2VwdG9yKSB7CiAgICBjb25zdCBpbmRleDIgPSB0aGlzLnJlcXVlc3RJbnRlcmNlcHRvcnMuaW5kZXhPZihpbnRlcmNlcHRvcik7CiAgICBpZiAoaW5kZXgyID4gLTEpIHsKICAgICAgdGhpcy5yZXF1ZXN0SW50ZXJjZXB0b3JzLnNwbGljZShpbmRleDIsIDEpOwogICAgfQogIH0KICAvKioKICAgKiBSZW1vdmUgYSByZXNwb25zZSBpbnRlcmNlcHRvcgogICAqLwogIHJlbW92ZVJlc3BvbnNlSW50ZXJjZXB0b3IoaW50ZXJjZXB0b3IpIHsKICAgIGNvbnN0IGluZGV4MiA9IHRoaXMucmVzcG9uc2VJbnRlcmNlcHRvcnMuaW5kZXhPZihpbnRlcmNlcHRvcik7CiAgICBpZiAoaW5kZXgyID4gLTEpIHsKICAgICAgdGhpcy5yZXNwb25zZUludGVyY2VwdG9ycy5zcGxpY2UoaW5kZXgyLCAxKTsKICAgIH0KICB9CiAgLyoqCiAgICogUmVtb3ZlIGFuIGVycm9yIGludGVyY2VwdG9yCiAgICovCiAgcmVtb3ZlRXJyb3JJbnRlcmNlcHRvcihpbnRlcmNlcHRvcikgewogICAgY29uc3QgaW5kZXgyID0gdGhpcy5lcnJvckludGVyY2VwdG9ycy5pbmRleE9mKGludGVyY2VwdG9yKTsKICAgIGlmIChpbmRleDIgPiAtMSkgewogICAgICB0aGlzLmVycm9ySW50ZXJjZXB0b3JzLnNwbGljZShpbmRleDIsIDEpOwogICAgfQogIH0KICAvKioKICAgKiBDbGVhciBhbGwgaW50ZXJjZXB0b3JzCiAgICovCiAgY2xlYXJBbGwoKSB7CiAgICB0aGlzLnJlcXVlc3RJbnRlcmNlcHRvcnMgPSBbXTsKICAgIHRoaXMucmVzcG9uc2VJbnRlcmNlcHRvcnMgPSBbXTsKICAgIHRoaXMuZXJyb3JJbnRlcmNlcHRvcnMgPSBbXTsKICB9CiAgLyoqCiAgICogUHJvY2VzcyByZXF1ZXN0IHRocm91Z2ggYWxsIHJlcXVlc3QgaW50ZXJjZXB0b3JzCiAgICovCiAgYXN5bmMgcHJvY2Vzc1JlcXVlc3QocmVxdWVzdCkgewogICAgbGV0IHByb2Nlc3NlZFJlcXVlc3QgPSByZXF1ZXN0OwogICAgZm9yIChjb25zdCBpbnRlcmNlcHRvciBvZiB0aGlzLnJlcXVlc3RJbnRlcmNlcHRvcnMpIHsKICAgICAgdHJ5IHsKICAgICAgICBwcm9jZXNzZWRSZXF1ZXN0ID0gYXdhaXQgaW50ZXJjZXB0b3IocHJvY2Vzc2VkUmVxdWVzdCk7CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgdGhyb3cgYXdhaXQgdGhpcy5wcm9jZXNzRXJyb3IoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHByb2Nlc3NlZFJlcXVlc3Q7CiAgfQogIC8qKgogICAqIFByb2Nlc3MgcmVzcG9uc2UgdGhyb3VnaCBhbGwgcmVzcG9uc2UgaW50ZXJjZXB0b3JzCiAgICovCiAgYXN5bmMgcHJvY2Vzc1Jlc3BvbnNlKHJlc3BvbnNlKSB7CiAgICBsZXQgcHJvY2Vzc2VkUmVzcG9uc2UgPSByZXNwb25zZTsKICAgIGZvciAoY29uc3QgaW50ZXJjZXB0b3Igb2YgdGhpcy5yZXNwb25zZUludGVyY2VwdG9ycykgewogICAgICB0cnkgewogICAgICAgIHByb2Nlc3NlZFJlc3BvbnNlID0gYXdhaXQgaW50ZXJjZXB0b3IocHJvY2Vzc2VkUmVzcG9uc2UpOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIHRocm93IGF3YWl0IHRoaXMucHJvY2Vzc0Vycm9yKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBwcm9jZXNzZWRSZXNwb25zZTsKICB9CiAgLyoqCiAgICogUHJvY2VzcyBlcnJvciB0aHJvdWdoIGFsbCBlcnJvciBpbnRlcmNlcHRvcnMKICAgKi8KICBhc3luYyBwcm9jZXNzRXJyb3IoZXJyb3IpIHsKICAgIGxldCBwcm9jZXNzZWRFcnJvciA9IGVycm9yOwogICAgZm9yIChjb25zdCBpbnRlcmNlcHRvciBvZiB0aGlzLmVycm9ySW50ZXJjZXB0b3JzKSB7CiAgICAgIHRyeSB7CiAgICAgICAgcHJvY2Vzc2VkRXJyb3IgPSBhd2FpdCBpbnRlcmNlcHRvcihwcm9jZXNzZWRFcnJvcik7CiAgICAgIH0gY2F0Y2ggKG5ld0Vycm9yKSB7CiAgICAgICAgcHJvY2Vzc2VkRXJyb3IgPSBuZXdFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gbmV3RXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKG5ld0Vycm9yKSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBwcm9jZXNzZWRFcnJvcjsKICB9CiAgLyoqCiAgICogR2V0IGNvdW50IG9mIHJlZ2lzdGVyZWQgaW50ZXJjZXB0b3JzCiAgICovCiAgZ2V0SW50ZXJjZXB0b3JDb3VudHMoKSB7CiAgICByZXR1cm4gewogICAgICByZXF1ZXN0OiB0aGlzLnJlcXVlc3RJbnRlcmNlcHRvcnMubGVuZ3RoLAogICAgICByZXNwb25zZTogdGhpcy5yZXNwb25zZUludGVyY2VwdG9ycy5sZW5ndGgsCiAgICAgIGVycm9yOiB0aGlzLmVycm9ySW50ZXJjZXB0b3JzLmxlbmd0aAogICAgfTsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRlbnZANi4wLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0ZW52L2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czEwID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czEwLCB7CiAgU21hcnRlbnY6ICgpID0+IFNtYXJ0ZW52Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0ZW52QDYuMC4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGVudi9kaXN0X3RzL3NtYXJ0ZW52LmNsYXNzZXMuc21hcnRlbnYuanMKdmFyIFNtYXJ0ZW52ID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlNtYXJ0ZW52Iik7CiAgfQogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5sb2FkZWRTY3JpcHRzID0gW107CiAgfQogIGFzeW5jIGdldEVudkF3YXJlTW9kdWxlKG9wdGlvbnNBcmcpIHsKICAgIGlmICh0aGlzLmlzTm9kZSkgewogICAgICBjb25zdCBtb2R1bGVSZXN1bHQgPSBhd2FpdCB0aGlzLmdldFNhZmVOb2RlTW9kdWxlKG9wdGlvbnNBcmcubm9kZU1vZHVsZU5hbWUpOwogICAgICByZXR1cm4gbW9kdWxlUmVzdWx0OwogICAgfSBlbHNlIGlmICh0aGlzLmlzQnJvd3NlcikgewogICAgICBjb25zdCBtb2R1bGVSZXN1bHQgPSBhd2FpdCB0aGlzLmdldFNhZmVXZWJNb2R1bGUob3B0aW9uc0FyZy53ZWJVcmxBcmcsIG9wdGlvbnNBcmcuZ2V0RnVuY3Rpb24pOwogICAgICByZXR1cm4gbW9kdWxlUmVzdWx0OwogICAgfSBlbHNlIHsKICAgICAgY29uc29sZS5lcnJvcigicGxhdGZvcm0gZm9yIGxvYWRpbmcgbm90IHN1cHBvcnRlZCBieSBzbWFydGVudiIpOwogICAgfQogIH0KICBhc3luYyBnZXRTYWZlTm9kZU1vZHVsZShtb2R1bGVOYW1lQXJnLCBydW5BZnRlckZ1bmMpIHsKICAgIGlmICghdGhpcy5pc05vZGUgJiYgIXRoaXMuaXNEZW5vICYmICF0aGlzLmlzQnVuKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoYFlvdSB0cmllZCB0byBsb2FkIGEgc2VydmVyIG1vZHVsZSBpbiBhIHdyb25nIGNvbnRleHQ6ICR7bW9kdWxlTmFtZUFyZ30uIFRoaXMgZG9lcyBub3QgdGhyb3cuYCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHJldHVyblZhbHVlID0gYXdhaXQgbmV3IEZ1bmN0aW9uKGByZXR1cm4gaW1wb3J0KCcke21vZHVsZU5hbWVBcmd9JylgKSgpOwogICAgaWYgKHJ1bkFmdGVyRnVuYykgewogICAgICBhd2FpdCBydW5BZnRlckZ1bmMocmV0dXJuVmFsdWUpOwogICAgfQogICAgcmV0dXJuIHJldHVyblZhbHVlOwogIH0KICBhc3luYyBnZXRTYWZlV2ViTW9kdWxlKHVybEFyZywgZ2V0RnVuY3Rpb25BcmcpIHsKICAgIGlmICghdGhpcy5pc0Jyb3dzZXIpIHsKICAgICAgY29uc29sZS5lcnJvcigiWW91IHRyaWVkIHRvIGxvYWQgYSB3ZWIgbW9kdWxlIGluIGEgd3JvbmcgY29udGV4dCIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodGhpcy5sb2FkZWRTY3JpcHRzLmluY2x1ZGVzKHVybEFyZykpIHsKICAgICAgcmV0dXJuIGdldEZ1bmN0aW9uQXJnKCk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmxvYWRlZFNjcmlwdHMucHVzaCh1cmxBcmcpOwogICAgfQogICAgY29uc3QgZG9uZSA9IGRpc3RfdHNfZXhwb3J0cy5kZWZlcigpOwogICAgaWYgKGdsb2JhbFRoaXMuaW1wb3J0U2NyaXB0cykgewogICAgICBnbG9iYWxUaGlzLmltcG9ydFNjcmlwdHModXJsQXJnKTsKICAgICAgZG9uZS5yZXNvbHZlKCk7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsKICAgICAgc2NyaXB0Lm9ubG9hZCA9ICgpID0+IHsKICAgICAgICBkb25lLnJlc29sdmUoKTsKICAgICAgfTsKICAgICAgc2NyaXB0LnNyYyA9IHVybEFyZzsKICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpOwogICAgfQogICAgYXdhaXQgZG9uZS5wcm9taXNlOwogICAgcmV0dXJuIGdldEZ1bmN0aW9uQXJnKCk7CiAgfQogIGdldCBydW50aW1lRW52KCkgewogICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzLkRlbm8gIT09ICJ1bmRlZmluZWQiICYmIHR5cGVvZiBnbG9iYWxUaGlzLkRlbm8/LnZlcnNpb24gIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgIHJldHVybiAiZGVubyI7CiAgICB9CiAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMuQnVuICE9PSAidW5kZWZpbmVkIiAmJiB0eXBlb2YgZ2xvYmFsVGhpcy5CdW4/LnZlcnNpb24gIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgIHJldHVybiAiYnVuIjsKICAgIH0KICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcy5wcm9jZXNzICE9PSAidW5kZWZpbmVkIiAmJiB0eXBlb2YgZ2xvYmFsVGhpcy5wcm9jZXNzPy52ZXJzaW9ucz8ubm9kZSAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgcmV0dXJuICJub2RlIjsKICAgIH0KICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcy53aW5kb3cgIT09ICJ1bmRlZmluZWQiICYmIHR5cGVvZiBnbG9iYWxUaGlzLmRvY3VtZW50ICE9PSAidW5kZWZpbmVkIikgewogICAgICByZXR1cm4gImJyb3dzZXIiOwogICAgfQogICAgcmV0dXJuICJicm93c2VyIjsKICB9CiAgZ2V0IGlzQnJvd3NlcigpIHsKICAgIHJldHVybiB0aGlzLnJ1bnRpbWVFbnYgPT09ICJicm93c2VyIjsKICB9CiAgZ2V0IGlzTm9kZSgpIHsKICAgIHJldHVybiB0aGlzLnJ1bnRpbWVFbnYgPT09ICJub2RlIjsKICB9CiAgZ2V0IGlzRGVubygpIHsKICAgIHJldHVybiB0aGlzLnJ1bnRpbWVFbnYgPT09ICJkZW5vIjsKICB9CiAgZ2V0IGlzQnVuKCkgewogICAgcmV0dXJuIHRoaXMucnVudGltZUVudiA9PT0gImJ1biI7CiAgfQogIGdldCB1c2VyQWdlbnQoKSB7CiAgICBpZiAodGhpcy5pc0Jyb3dzZXIpIHsKICAgICAgcmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQ7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gInVuZGVmaW5lZCI7CiAgICB9CiAgfQogIGdldCBub2RlVmVyc2lvbigpIHsKICAgIGlmICh0aGlzLmlzTm9kZSkgewogICAgICByZXR1cm4gcHJvY2Vzcy52ZXJzaW9uOwogICAgfQogICAgcmV0dXJuICJ1bmRlZmluZWQiOwogIH0KICBnZXQgZGVub1ZlcnNpb24oKSB7CiAgICBpZiAodGhpcy5pc0Rlbm8pIHsKICAgICAgcmV0dXJuIGdsb2JhbFRoaXMuRGVuby52ZXJzaW9uLmRlbm87CiAgICB9CiAgICByZXR1cm4gInVuZGVmaW5lZCI7CiAgfQogIGdldCBidW5WZXJzaW9uKCkgewogICAgaWYgKHRoaXMuaXNCdW4pIHsKICAgICAgcmV0dXJuIGdsb2JhbFRoaXMuQnVuLnZlcnNpb247CiAgICB9CiAgICByZXR1cm4gInVuZGVmaW5lZCI7CiAgfQogIC8qKgogICAqIExvYWQgYSBtb2R1bGUgb25seSBpZiB0aGUgY3VycmVudCBydW50aW1lIG1hdGNoZXMgdGhlIHRhcmdldCBydW50aW1lKHMpCiAgICogQHBhcmFtIHRhcmdldCAtIFNpbmdsZSBydW50aW1lLCBhcnJheSBvZiBydW50aW1lcywgb3IgJ3NlcnZlcicgZm9yIGFsbCBzZXJ2ZXItc2lkZSBydW50aW1lcwogICAqIEBwYXJhbSBtb2R1bGVOYW1lT3JVcmwgLSBNb2R1bGUgbmFtZSAoZm9yIE5vZGUvRGVuby9CdW4pIG9yIFVSTCAoZm9yIGJyb3dzZXIpCiAgICogQHBhcmFtIGdldEZ1bmN0aW9uIC0gT3B0aW9uYWwgZnVuY3Rpb24gdG8gcmV0cmlldmUgdGhlIG1vZHVsZSBpbiBicm93c2VyIGNvbnRleHQKICAgKiBAcmV0dXJucyBUaGUgbG9hZGVkIG1vZHVsZSBvciB1bmRlZmluZWQgaWYgcnVudGltZSBkb2Vzbid0IG1hdGNoCiAgICovCiAgYXN5bmMgZ2V0U2FmZU1vZHVsZUZvcih0YXJnZXQsIG1vZHVsZU5hbWVPclVybCwgZ2V0RnVuY3Rpb24pIHsKICAgIGxldCB0YXJnZXRSdW50aW1lczsKICAgIGlmIChBcnJheS5pc0FycmF5KHRhcmdldCkpIHsKICAgICAgdGFyZ2V0UnVudGltZXMgPSB0YXJnZXQuZmxhdE1hcCgodDgpID0+IHQ4ID09PSAic2VydmVyIiA/IFsibm9kZSIsICJkZW5vIiwgImJ1biJdIDogW3Q4XSk7CiAgICB9IGVsc2UgaWYgKHRhcmdldCA9PT0gInNlcnZlciIpIHsKICAgICAgdGFyZ2V0UnVudGltZXMgPSBbIm5vZGUiLCAiZGVubyIsICJidW4iXTsKICAgIH0gZWxzZSB7CiAgICAgIHRhcmdldFJ1bnRpbWVzID0gW3RhcmdldF07CiAgICB9CiAgICBpZiAoIXRhcmdldFJ1bnRpbWVzLmluY2x1ZGVzKHRoaXMucnVudGltZUVudikpIHsKICAgICAgY29uc29sZS53YXJuKGBNb2R1bGUgIiR7bW9kdWxlTmFtZU9yVXJsfSIgcmVxdWVzdGVkIGZvciBydW50aW1lKHMpIFske3RhcmdldFJ1bnRpbWVzLmpvaW4oIiwgIil9XSBidXQgY3VycmVudCBydW50aW1lIGlzICIke3RoaXMucnVudGltZUVudn0iLiBTa2lwcGluZyBsb2FkLmApOwogICAgICByZXR1cm4gdm9pZCAwOwogICAgfQogICAgaWYgKHRoaXMuaXNOb2RlIHx8IHRoaXMuaXNEZW5vIHx8IHRoaXMuaXNCdW4pIHsKICAgICAgY29uc3QgbW9kdWxlUmVzdWx0ID0gYXdhaXQgdGhpcy5nZXRTYWZlTm9kZU1vZHVsZShtb2R1bGVOYW1lT3JVcmwpOwogICAgICByZXR1cm4gbW9kdWxlUmVzdWx0OwogICAgfSBlbHNlIGlmICh0aGlzLmlzQnJvd3NlcikgewogICAgICBpZiAoIWdldEZ1bmN0aW9uKSB7CiAgICAgICAgY29uc29sZS5lcnJvcihgQnJvd3NlciBtb2R1bGUgbG9hZCByZXF1aXJlcyBnZXRGdW5jdGlvbiBwYXJhbWV0ZXIgZm9yICIke21vZHVsZU5hbWVPclVybH0iYCk7CiAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgfQogICAgICBjb25zdCBtb2R1bGVSZXN1bHQgPSBhd2FpdCB0aGlzLmdldFNhZmVXZWJNb2R1bGUobW9kdWxlTmFtZU9yVXJsLCBnZXRGdW5jdGlvbik7CiAgICAgIHJldHVybiBtb2R1bGVSZXN1bHQ7CiAgICB9CiAgICByZXR1cm4gdm9pZCAwOwogIH0KICBnZXQgaXNDSSgpIHsKICAgIGlmICh0aGlzLmlzTm9kZSkgewogICAgICBpZiAocHJvY2Vzcy5lbnYuQ0kpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgYXN5bmMgaXNNYWNBc3luYygpIHsKICAgIGlmICh0aGlzLmlzTm9kZSkgewogICAgICBjb25zdCBvcyA9IGF3YWl0IHRoaXMuZ2V0U2FmZU5vZGVNb2R1bGUoIm9zIik7CiAgICAgIHJldHVybiBvcy5wbGF0Zm9ybSgpID09PSAiZGFyd2luIjsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgYXN5bmMgaXNXaW5kb3dzQXN5bmMoKSB7CiAgICBpZiAodGhpcy5pc05vZGUpIHsKICAgICAgY29uc3Qgb3MgPSBhd2FpdCB0aGlzLmdldFNhZmVOb2RlTW9kdWxlKCJvcyIpOwogICAgICByZXR1cm4gb3MucGxhdGZvcm0oKSA9PT0gIndpbjMyIjsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgYXN5bmMgaXNMaW51eEFzeW5jKCkgewogICAgaWYgKHRoaXMuaXNOb2RlKSB7CiAgICAgIGNvbnN0IG9zID0gYXdhaXQgdGhpcy5nZXRTYWZlTm9kZU1vZHVsZSgib3MiKTsKICAgICAgcmV0dXJuIG9zLnBsYXRmb3JtKCkgPT09ICJsaW51eCI7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQogIC8qKgogICAqIHByaW50cyB0aGUgZW52aXJvbm1lbnQgdG8gY29uc29sZQogICAqLwogIGFzeW5jIHByaW50RW52KCkgewogICAgaWYgKHRoaXMuaXNOb2RlKSB7CiAgICAgIGNvbnNvbGUubG9nKCJydW5uaW5nIG9uIE5PREUiKTsKICAgICAgY29uc29sZS5sb2coIm5vZGUgdmVyc2lvbiBpcyAiICsgdGhpcy5ub2RlVmVyc2lvbik7CiAgICB9IGVsc2UgaWYgKHRoaXMuaXNEZW5vKSB7CiAgICAgIGNvbnNvbGUubG9nKCJydW5uaW5nIG9uIERFTk8iKTsKICAgICAgY29uc29sZS5sb2coImRlbm8gdmVyc2lvbiBpcyAiICsgdGhpcy5kZW5vVmVyc2lvbik7CiAgICB9IGVsc2UgaWYgKHRoaXMuaXNCdW4pIHsKICAgICAgY29uc29sZS5sb2coInJ1bm5pbmcgb24gQlVOIik7CiAgICAgIGNvbnNvbGUubG9nKCJidW4gdmVyc2lvbiBpcyAiICsgdGhpcy5idW5WZXJzaW9uKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnNvbGUubG9nKCJydW5uaW5nIG9uIEJST1dTRVIiKTsKICAgICAgY29uc29sZS5sb2coImJyb3dzZXIgaXMgIiArIHRoaXMudXNlckFnZW50KTsKICAgIH0KICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRqc29uQDYuMC4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGpzb24vZGlzdF90cy9pbmRleC5qcwp2YXIgZGlzdF90c19leHBvcnRzMTIgPSB7fTsKX19leHBvcnQoZGlzdF90c19leHBvcnRzMTIsIHsKICBTbWFydGpzb246ICgpID0+IFNtYXJ0anNvbiwKICBkZWVwRXF1YWxKc29uTFN0cmluZ3M6ICgpID0+IGRlZXBFcXVhbEpzb25MU3RyaW5ncywKICBkZWVwRXF1YWxPYmplY3RzOiAoKSA9PiBkZWVwRXF1YWxPYmplY3RzLAogIGZvbGREZWM6ICgpID0+IGZvbGREZWMsCiAgcGFyc2U6ICgpID0+IHBhcnNlMywKICBwYXJzZUJhc2U2NDogKCkgPT4gcGFyc2VCYXNlNjQsCiAgcGFyc2VKc29uTDogKCkgPT4gcGFyc2VKc29uTCwKICBzdGFibGVPbmVXYXlTdHJpbmdpZnk6ICgpID0+IHN0YWJsZU9uZVdheVN0cmluZ2lmeSwKICBzdHJpbmdpZnk6ICgpID0+IHN0cmluZ2lmeTIsCiAgc3RyaW5naWZ5QmFzZTY0OiAoKSA9PiBzdHJpbmdpZnlCYXNlNjQsCiAgc3RyaW5naWZ5SnNvbkw6ICgpID0+IHN0cmluZ2lmeUpzb25MLAogIHN0cmluZ2lmeVByZXR0eTogKCkgPT4gc3RyaW5naWZ5UHJldHR5Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0c3RyaW5nQDQuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHN0cmluZy9kaXN0X3RzL2luZGV4LmpzCnZhciBkaXN0X3RzX2V4cG9ydHMxMSA9IHt9OwpfX2V4cG9ydChkaXN0X3RzX2V4cG9ydHMxMSwgewogIEJhc2U2NDogKCkgPT4gQmFzZTY0LAogIERvbWFpbjogKCkgPT4gRG9tYWluLAogIEdpdFJlcG86ICgpID0+IEdpdFJlcG8sCiAgYmFzZTY0OiAoKSA9PiBiYXNlNjQsCiAgY3JlYXRlOiAoKSA9PiBzbWFydHN0cmluZ19jcmVhdGVfZXhwb3J0cywKICBkb2NrZXI6ICgpID0+IHNtYXJ0c3RyaW5nX2RvY2tlcl9leHBvcnRzLAogIGluZGVudDogKCkgPT4gc21hcnRzdHJpbmdfaW5kZW50X2V4cG9ydHMsCiAgbm9ybWFsaXplOiAoKSA9PiBzbWFydHN0cmluZ19ub3JtYWxpemVfZXhwb3J0cywKICB0eXBlOiAoKSA9PiBzbWFydHN0cmluZ190eXBlX2V4cG9ydHMKfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRzdHJpbmdANC4xLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0c3RyaW5nL2Rpc3RfdHMvc21hcnRzdHJpbmcuY3JlYXRlLmpzCnZhciBzbWFydHN0cmluZ19jcmVhdGVfZXhwb3J0cyA9IHt9OwpfX2V4cG9ydChzbWFydHN0cmluZ19jcmVhdGVfZXhwb3J0cywgewogIGNyZWF0ZUNyeXB0b1JhbmRvbVN0cmluZzogKCkgPT4gY3JlYXRlQ3J5cHRvUmFuZG9tU3RyaW5nLAogIGNyZWF0ZVJhbmRvbVN0cmluZzogKCkgPT4gY3JlYXRlUmFuZG9tU3RyaW5nCn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0c3RyaW5nQDQuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHN0cmluZy9kaXN0X3RzL3NtYXJ0c3RyaW5nLnBsdWdpbnMuanMKdmFyIGlzb3VuaXF1ZSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0X3RzKCksIDEpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0c3RyaW5nQDQuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHN0cmluZy9kaXN0X3RzL3NtYXJ0c3RyaW5nLmNyZWF0ZS5qcwp2YXIgZ2V0UmFuZG9tSW50ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgobWluMywgbWF4MykgPT4gewogIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gInVuZGVmaW5lZCIgJiYgZ2xvYmFsVGhpcy5jcnlwdG8gJiYgZ2xvYmFsVGhpcy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKSB7CiAgICBjb25zdCByYW5nZTIgPSBtYXgzIC0gbWluMzsKICAgIGNvbnN0IGFycmF5ID0gbmV3IFVpbnQzMkFycmF5KDEpOwogICAgZ2xvYmFsVGhpcy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycmF5KTsKICAgIHJldHVybiBtaW4zICsgYXJyYXlbMF0gJSByYW5nZTI7CiAgfSBlbHNlIHsKICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4MyAtIG1pbjMpKSArIG1pbjM7CiAgfQp9LCAiZ2V0UmFuZG9tSW50Iik7CnZhciBjdXN0b21SYW5kb21hdGljID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgocGF0dGVybiwgbGVuZ3RoLCBvcHRpb25zKSA9PiB7CiAgY29uc3QgY2hhclNldHMgPSB7CiAgICAiQSI6ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiIsCiAgICAiYSI6ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIsCiAgICAiMCI6ICIwMTIzNDU2Nzg5IiwKICAgICIhIjogIiFAIyQlXiYqKClfKy09W117fXw7OiwuPD4/IiwKICAgICIqIjogIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5IUAjJCVeJiooKV8rLT1bXXt9fDs6LC48Pj8iCiAgfTsKICBsZXQgYWN0dWFsUGF0dGVybiA9IHBhdHRlcm47CiAgaWYgKGxlbmd0aCAmJiBsZW5ndGggPiBwYXR0ZXJuLmxlbmd0aCkgewogICAgYWN0dWFsUGF0dGVybiA9IHBhdHRlcm4ucmVwZWF0KE1hdGguY2VpbChsZW5ndGggLyBwYXR0ZXJuLmxlbmd0aCkpLnNsaWNlKDAsIGxlbmd0aCk7CiAgfSBlbHNlIGlmIChsZW5ndGgpIHsKICAgIGFjdHVhbFBhdHRlcm4gPSBwYXR0ZXJuLnNsaWNlKDAsIGxlbmd0aCk7CiAgfQogIGxldCByZXN1bHQgPSAiIjsKICBmb3IgKGNvbnN0IGNoYXIgb2YgYWN0dWFsUGF0dGVybikgewogICAgaWYgKGNoYXJTZXRzW2NoYXJdKSB7CiAgICAgIGNvbnN0IGNoYXJTZXQgPSBjaGFyU2V0c1tjaGFyXTsKICAgICAgY29uc3QgcmFuZG9tSW5kZXggPSBnZXRSYW5kb21JbnQoMCwgY2hhclNldC5sZW5ndGgpOwogICAgICByZXN1bHQgKz0gY2hhclNldFtyYW5kb21JbmRleF07CiAgICB9IGVsc2UgewogICAgICByZXN1bHQgKz0gY2hhcjsKICAgIH0KICB9CiAgcmV0dXJuIHJlc3VsdDsKfSwgImN1c3RvbVJhbmRvbWF0aWMiKTsKdmFyIGNyZWF0ZVJhbmRvbVN0cmluZyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHBhdHRlcm5BcmcsIGxlbmd0aEFyZywgb3B0aW9uc0FyZykgPT4gewogIHJldHVybiBjdXN0b21SYW5kb21hdGljKHBhdHRlcm5BcmcsIGxlbmd0aEFyZywgb3B0aW9uc0FyZyk7Cn0sICJjcmVhdGVSYW5kb21TdHJpbmciKTsKdmFyIGNyZWF0ZUNyeXB0b1JhbmRvbVN0cmluZyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKCkgPT4gewogIHJldHVybiBpc291bmlxdWUudW5pKCk7Cn0sICJjcmVhdGVDcnlwdG9SYW5kb21TdHJpbmciKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHN0cmluZ0A0LjEuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRzdHJpbmcvZGlzdF90cy9zbWFydHN0cmluZy5kb2NrZXIuanMKdmFyIHNtYXJ0c3RyaW5nX2RvY2tlcl9leHBvcnRzID0ge307Cl9fZXhwb3J0KHNtYXJ0c3RyaW5nX2RvY2tlcl9leHBvcnRzLCB7CiAgbWFrZUVudk9iamVjdDogKCkgPT4gbWFrZUVudk9iamVjdAp9KTsKdmFyIG1ha2VFbnZPYmplY3QgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGVudkFycmF5QXJnKSB7CiAgbGV0IHJldHVybk9iamVjdCA9IHt9OwogIGxldCByZWdleFN0cmluZyA9IC8oLiopPSguKikvOwogIGlmICh0eXBlb2YgZW52QXJyYXlBcmcgIT09ICJ1bmRlZmluZWQiKSB7CiAgICBmb3IgKGxldCBlbnZLZXkgaW4gZW52QXJyYXlBcmcpIHsKICAgICAgbGV0IHJlZ2V4TWF0Y2hlcyA9IHJlZ2V4U3RyaW5nLmV4ZWMoZW52QXJyYXlBcmdbZW52S2V5XSk7CiAgICAgIHJldHVybk9iamVjdFtyZWdleE1hdGNoZXNbMV1dID0gcmVnZXhNYXRjaGVzWzJdOwogICAgfQogIH0KICByZXR1cm4gcmV0dXJuT2JqZWN0Owp9LCAibWFrZUVudk9iamVjdCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0c3RyaW5nQDQuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHN0cmluZy9kaXN0X3RzL3NtYXJ0c3RyaW5nLmluZGVudC5qcwp2YXIgc21hcnRzdHJpbmdfaW5kZW50X2V4cG9ydHMgPSB7fTsKX19leHBvcnQoc21hcnRzdHJpbmdfaW5kZW50X2V4cG9ydHMsIHsKICBpbmRlbnQ6ICgpID0+IGluZGVudCwKICBpbmRlbnRXaXRoUHJlZml4OiAoKSA9PiBpbmRlbnRXaXRoUHJlZml4LAogIG5vcm1hbGl6ZTogKCkgPT4gbm9ybWFsaXplCn0pOwp2YXIgc3BsaXRTdHJpbmdBdExpbmVCcmVhayA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHN0cmluZ0FyZykgPT4gewogIGxldCByZXN1bHRBcnJheSA9IHN0cmluZ0FyZy5zcGxpdCgiXG4iKTsKICByZXR1cm4gY2xlYW5TdHJpbmdBcnJheShyZXN1bHRBcnJheSk7Cn0sICJzcGxpdFN0cmluZ0F0TGluZUJyZWFrIik7CnZhciBqb2luU3RyaW5nV2l0aExpbmVCcmVha3MgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChzdHJpbmdBcnJheUFyZykgPT4gewogIGxldCByZXN1bHRTdHJpbmcgPSAiIjsKICBmb3IgKGxldCBsaW5lIG9mIHN0cmluZ0FycmF5QXJnKSB7CiAgICByZXN1bHRTdHJpbmcgPSByZXN1bHRTdHJpbmcgKyBsaW5lICsgIlxuIjsKICB9CiAgcmV0dXJuIHJlc3VsdFN0cmluZzsKfSwgImpvaW5TdHJpbmdXaXRoTGluZUJyZWFrcyIpOwp2YXIgY2xlYW5TdHJpbmdBcnJheSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHN0cmluZ0FycmF5QXJnKSA9PiB7CiAgbGV0IHRlc3RSZWdleCA9IC9eW1xzXSokLzsKICBpZiAodGVzdFJlZ2V4LnRlc3Qoc3RyaW5nQXJyYXlBcmdbMF0pKSB7CiAgICBzdHJpbmdBcnJheUFyZy5zaGlmdCgpOwogIH0KICBpZiAodGVzdFJlZ2V4LnRlc3Qoc3RyaW5nQXJyYXlBcmdbc3RyaW5nQXJyYXlBcmcubGVuZ3RoIC0gMV0pKSB7CiAgICBzdHJpbmdBcnJheUFyZy5wb3AoKTsKICB9CiAgcmV0dXJuIHN0cmluZ0FycmF5QXJnOwp9LCAiY2xlYW5TdHJpbmdBcnJheSIpOwp2YXIgaW5kZW50ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoc3RyaW5nQXJnLCBzcGFjZUFtb3VudCkgPT4gewogIGxldCBsb2NhbFN0cmluZ0FycmF5ID0gc3BsaXRTdHJpbmdBdExpbmVCcmVhayhzdHJpbmdBcmcpOwogIGZvciAobGV0IHN0cmluZ0FyZzIgb2YgbG9jYWxTdHJpbmdBcnJheSkgewogICAgc3RyaW5nQXJnMiA9ICIgIi5yZXBlYXQoc3BhY2VBbW91bnQpICsgc3RyaW5nQXJnMjsKICB9CiAgbGV0IHJlc3VsdFN0cmluZyA9IGpvaW5TdHJpbmdXaXRoTGluZUJyZWFrcyhsb2NhbFN0cmluZ0FycmF5KTsKICByZXR1cm4gcmVzdWx0U3RyaW5nOwp9LCAiaW5kZW50Iik7CnZhciBpbmRlbnRXaXRoUHJlZml4ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoc3RyaW5nQXJnLCBwcmVmaXhBcmcpID0+IHsKICBsZXQgcmVzdWx0U3RyaW5nOwogIGxldCBzdHJpbmdBcnJheSA9IHNwbGl0U3RyaW5nQXRMaW5lQnJlYWsoc3RyaW5nQXJnKTsKICBsZXQgcmVzdWx0QXJyYXkgPSBbXTsKICBmb3IgKGxldCBzdHJpbmdJdGVtIG9mIHN0cmluZ0FycmF5KSB7CiAgICByZXN1bHRBcnJheS5wdXNoKHByZWZpeEFyZyArIHN0cmluZ0l0ZW0pOwogIH0KICByZXN1bHRTdHJpbmcgPSBqb2luU3RyaW5nV2l0aExpbmVCcmVha3MocmVzdWx0QXJyYXkpOwogIHJldHVybiByZXN1bHRTdHJpbmc7Cn0sICJpbmRlbnRXaXRoUHJlZml4Iik7CnZhciBub3JtYWxpemUgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChzdHJpbmdBcmcpID0+IHsKICBsZXQgcmVzdWx0U3RyaW5nOwogIGxldCBzcGxpdFN0cmluZ0FycmF5ID0gc3BsaXRTdHJpbmdBdExpbmVCcmVhayhzdHJpbmdBcmcpOwogIGxldCBtaW5Db21tb25MZWZ0T2Zmc2V0OwogIGNvbnN0IGRlSW5kZW50UmVnZXggPSAvXihccyopLzsKICBjb25zdCBlbXB0eUxpbmVSZWdleCA9IC9eKFxzKikkLzsKICBmb3IgKGxldCBzdHJpbmdJdGVtIG9mIHNwbGl0U3RyaW5nQXJyYXkpIHsKICAgIGxldCBvZmZzZXRTdHJpbmcgPSBkZUluZGVudFJlZ2V4LmV4ZWMoc3RyaW5nSXRlbSlbMV07CiAgICBpZiAoKHR5cGVvZiBtaW5Db21tb25MZWZ0T2Zmc2V0ID09PSAidW5kZWZpbmVkIiB8fCBvZmZzZXRTdHJpbmcubGVuZ3RoIDwgbWluQ29tbW9uTGVmdE9mZnNldCkgJiYgIWVtcHR5TGluZVJlZ2V4LnRlc3Qoc3RyaW5nSXRlbSkpIHsKICAgICAgbWluQ29tbW9uTGVmdE9mZnNldCA9IG9mZnNldFN0cmluZy5sZW5ndGg7CiAgICB9CiAgfQogIGxldCByZXN1bHRTcGxpdFN0cmluZ0FycmF5ID0gW107CiAgZm9yIChsZXQgc3RyaW5nSXRlbSBvZiBzcGxpdFN0cmluZ0FycmF5KSB7CiAgICByZXN1bHRTcGxpdFN0cmluZ0FycmF5LnB1c2goc3RyaW5nSXRlbS5zdWJzdHIobWluQ29tbW9uTGVmdE9mZnNldCkpOwogIH0KICByZXN1bHRTdHJpbmcgPSBqb2luU3RyaW5nV2l0aExpbmVCcmVha3MocmVzdWx0U3BsaXRTdHJpbmdBcnJheSk7CiAgcmV0dXJuIHJlc3VsdFN0cmluZzsKfSwgIm5vcm1hbGl6ZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0c3RyaW5nQDQuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHN0cmluZy9kaXN0X3RzL3NtYXJ0c3RyaW5nLm5vcm1hbGl6ZS5qcwp2YXIgc21hcnRzdHJpbmdfbm9ybWFsaXplX2V4cG9ydHMgPSB7fTsKX19leHBvcnQoc21hcnRzdHJpbmdfbm9ybWFsaXplX2V4cG9ydHMsIHsKICByZXBsYWNlQWxsOiAoKSA9PiByZXBsYWNlQWxsLAogIHN0YW5kYXJkOiAoKSA9PiBzdGFuZGFyZAp9KTsKdmFyIHJlcGxhY2VBbGwgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChzdHJpbmdBcmcsIHNlYXJjaFBhdHRlcm4sIHJlcGxhY2VtZW50U3RyaW5nKSA9PiB7CiAgcmV0dXJuIHN0cmluZ0FyZy5yZXBsYWNlKG5ldyBSZWdFeHAoc2VhcmNoUGF0dGVybiwgImciKSwgcmVwbGFjZW1lbnRTdHJpbmcpOwp9LCAicmVwbGFjZUFsbCIpOwp2YXIgc3RyaXBJbmRlbnQgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChzdHIpID0+IHsKICBjb25zdCBsaW5lcyA9IHN0ci5zcGxpdCgiXG4iKTsKICBsZXQgbWluSW5kZW50ID0gSW5maW5pdHk7CiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7CiAgICBpZiAobGluZS50cmltKCkubGVuZ3RoID4gMCkgewogICAgICBjb25zdCBtYXRjaDIgPSBsaW5lLm1hdGNoKC9eKFxzKikvKTsKICAgICAgaWYgKG1hdGNoMikgewogICAgICAgIG1pbkluZGVudCA9IE1hdGgubWluKG1pbkluZGVudCwgbWF0Y2gyWzFdLmxlbmd0aCk7CiAgICAgIH0KICAgIH0KICB9CiAgaWYgKG1pbkluZGVudCA9PT0gSW5maW5pdHkgfHwgbWluSW5kZW50ID09PSAwKSB7CiAgICByZXR1cm4gc3RyOwogIH0KICByZXR1cm4gbGluZXMubWFwKChsaW5lKSA9PiB7CiAgICBpZiAobGluZS5sZW5ndGggPj0gbWluSW5kZW50KSB7CiAgICAgIHJldHVybiBsaW5lLnNsaWNlKG1pbkluZGVudCk7CiAgICB9CiAgICByZXR1cm4gbGluZTsKICB9KS5qb2luKCJcbiIpOwp9LCAic3RyaXBJbmRlbnQiKTsKdmFyIHN0YW5kYXJkID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoc3RyaW5nQXJnLCBvcHRpb25zKSA9PiB7CiAgbGV0IHJlc3VsdCA9IHN0cmluZ0FyZzsKICBpZiAoIW9wdGlvbnMgfHwgb3B0aW9ucy5zdHJpcEluZGVudCkgewogICAgcmVzdWx0ID0gc3RyaXBJbmRlbnQocmVzdWx0KTsKICB9CiAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMubm9ybWFsaXplTmV3bGluZSkgewogICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL1xyXG4vZywgIlxuIik7CiAgfQogIGlmICghb3B0aW9ucyB8fCBvcHRpb25zLnJlcGxhY2VUYWJzKSB7CiAgICByZXN1bHQgPSByZXBsYWNlQWxsKHJlc3VsdCwgIgkvIiwgIiAiKTsKICB9CiAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMuc3RyaXBMZWFkaW5nVHJhaWxpbmdFbXB0eUxpbmVzKSB7CiAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXlxzKltcclxuXS9nbSwgIiIpLnJlcGxhY2UoL1xzKltcclxuXSQvZ20sICIiKTsKICB9CiAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMuc3RyaXBBbGxFbXB0eUxpbmVzKSB7CiAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXlxzKltcclxuXS9nbSwgIiIpOwogIH0KICByZXR1cm4gcmVzdWx0Owp9LCAic3RhbmRhcmQiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHN0cmluZ0A0LjEuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRzdHJpbmcvZGlzdF90cy9zbWFydHN0cmluZy50eXBlLmpzCnZhciBzbWFydHN0cmluZ190eXBlX2V4cG9ydHMgPSB7fTsKX19leHBvcnQoc21hcnRzdHJpbmdfdHlwZV9leHBvcnRzLCB7CiAgaXNCYXNlNjQ6ICgpID0+IGlzQmFzZTY0LAogIGlzVXRmODogKCkgPT4gaXNVdGY4Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0c3RyaW5nQDQuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHN0cmluZy9kaXN0X3RzL3NtYXJ0c3RyaW5nLmJhc2U2NC5qcwp2YXIgdW5pdmVyc2FsQmFzZTY0ID0gewogIGVuY29kZTogLyogQF9fUFVSRV9fICovIF9fbmFtZSgoc3RyKSA9PiB7CiAgICBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHN0ciwgInV0ZjgiKS50b1N0cmluZygiYmFzZTY0Iik7CiAgICB9IGVsc2UgaWYgKHR5cGVvZiBidG9hICE9PSAidW5kZWZpbmVkIikgewogICAgICBjb25zdCB1dGY4Qnl0ZXMgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoc3RyKTsKICAgICAgY29uc3QgYmluYXJ5U3RyaW5nID0gQXJyYXkuZnJvbSh1dGY4Qnl0ZXMsIChieXRlKSA9PiBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGUpKS5qb2luKCIiKTsKICAgICAgcmV0dXJuIGJ0b2EoYmluYXJ5U3RyaW5nKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGNoYXJzID0gIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOwogICAgICBjb25zdCBieXRlcyA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShzdHIpOwogICAgICBsZXQgcmVzdWx0ID0gIiI7CiAgICAgIGxldCBpMTAgPSAwOwogICAgICB3aGlsZSAoaTEwIDwgYnl0ZXMubGVuZ3RoKSB7CiAgICAgICAgY29uc3QgYTQgPSBieXRlc1tpMTArK107CiAgICAgICAgY29uc3QgYjQgPSBpMTAgPCBieXRlcy5sZW5ndGggPyBieXRlc1tpMTArK10gOiAwOwogICAgICAgIGNvbnN0IGMxMCA9IGkxMCA8IGJ5dGVzLmxlbmd0aCA/IGJ5dGVzW2kxMCsrXSA6IDA7CiAgICAgICAgY29uc3QgYml0bWFwID0gYTQgPDwgMTYgfCBiNCA8PCA4IHwgYzEwOwogICAgICAgIHJlc3VsdCArPSBjaGFycy5jaGFyQXQoYml0bWFwID4+IDE4ICYgNjMpOwogICAgICAgIHJlc3VsdCArPSBjaGFycy5jaGFyQXQoYml0bWFwID4+IDEyICYgNjMpOwogICAgICAgIHJlc3VsdCArPSBpMTAgLSAyIDwgYnl0ZXMubGVuZ3RoID8gY2hhcnMuY2hhckF0KGJpdG1hcCA+PiA2ICYgNjMpIDogIj0iOwogICAgICAgIHJlc3VsdCArPSBpMTAgLSAxIDwgYnl0ZXMubGVuZ3RoID8gY2hhcnMuY2hhckF0KGJpdG1hcCAmIDYzKSA6ICI9IjsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogIH0sICJlbmNvZGUiKSwKICBkZWNvZGU6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHN0cikgPT4gewogICAgY29uc3QgYmFzZTY0U3RyaW5nID0gc3RyLnJlcGxhY2UoLy0vZywgIisiKS5yZXBsYWNlKC9fL2csICIvIikucGFkRW5kKHN0ci5sZW5ndGggKyAoNCAtIHN0ci5sZW5ndGggJSA0KSAlIDQsICI9Iik7CiAgICBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGJhc2U2NFN0cmluZywgImJhc2U2NCIpLnRvU3RyaW5nKCJ1dGY4Iik7CiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhdG9iICE9PSAidW5kZWZpbmVkIikgewogICAgICBjb25zdCBiaW5hcnlTdHJpbmcgPSBhdG9iKGJhc2U2NFN0cmluZyk7CiAgICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYmluYXJ5U3RyaW5nLmxlbmd0aCk7CiAgICAgIGZvciAobGV0IGkxMCA9IDA7IGkxMCA8IGJpbmFyeVN0cmluZy5sZW5ndGg7IGkxMCsrKSB7CiAgICAgICAgYnl0ZXNbaTEwXSA9IGJpbmFyeVN0cmluZy5jaGFyQ29kZUF0KGkxMCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShieXRlcyk7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBjaGFycyA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIjsKICAgICAgbGV0IGJ5dGVzID0gW107CiAgICAgIGxldCBpMTAgPSAwOwogICAgICB3aGlsZSAoaTEwIDwgYmFzZTY0U3RyaW5nLmxlbmd0aCkgewogICAgICAgIGNvbnN0IGVuY29kZWQxID0gY2hhcnMuaW5kZXhPZihiYXNlNjRTdHJpbmcuY2hhckF0KGkxMCsrKSk7CiAgICAgICAgY29uc3QgZW5jb2RlZDIgPSBjaGFycy5pbmRleE9mKGJhc2U2NFN0cmluZy5jaGFyQXQoaTEwKyspKTsKICAgICAgICBjb25zdCBlbmNvZGVkMyA9IGNoYXJzLmluZGV4T2YoYmFzZTY0U3RyaW5nLmNoYXJBdChpMTArKykpOwogICAgICAgIGNvbnN0IGVuY29kZWQ0ID0gY2hhcnMuaW5kZXhPZihiYXNlNjRTdHJpbmcuY2hhckF0KGkxMCsrKSk7CiAgICAgICAgY29uc3QgYml0bWFwID0gZW5jb2RlZDEgPDwgMTggfCBlbmNvZGVkMiA8PCAxMiB8IGVuY29kZWQzIDw8IDYgfCBlbmNvZGVkNDsKICAgICAgICBieXRlcy5wdXNoKGJpdG1hcCA+PiAxNiAmIDI1NSk7CiAgICAgICAgaWYgKGVuY29kZWQzICE9PSA2NCkKICAgICAgICAgIGJ5dGVzLnB1c2goYml0bWFwID4+IDggJiAyNTUpOwogICAgICAgIGlmIChlbmNvZGVkNCAhPT0gNjQpCiAgICAgICAgICBieXRlcy5wdXNoKGJpdG1hcCAmIDI1NSk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShuZXcgVWludDhBcnJheShieXRlcykpOwogICAgfQogIH0sICJkZWNvZGUiKQp9Owp2YXIgQmFzZTY0ID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkJhc2U2NCIpOwogIH0KICBjb25zdHJ1Y3RvcihpbnB1dFN0cmluZ0FyZywgdHlwZUFyZykgewogICAgc3dpdGNoICh0eXBlQXJnKSB7CiAgICAgIGNhc2UgInN0cmluZyI6CiAgICAgICAgdGhpcy5yZWZTdHJpbmcgPSBpbnB1dFN0cmluZ0FyZzsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiYmFzZTY0IjoKICAgICAgICB0aGlzLnJlZlN0cmluZyA9IGJhc2U2NC5kZWNvZGUoaW5wdXRTdHJpbmdBcmcpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJiYXNlNjR1cmkiOgogICAgICAgIHRoaXMucmVmU3RyaW5nID0gYmFzZTY0LmRlY29kZShpbnB1dFN0cmluZ0FyZyk7CiAgICB9CiAgfQogIC8qKgogICAqIHRoZSBzaW1wbGUgc3RyaW5nICh1bmVuY29kZWQpCiAgICovCiAgZ2V0IHNpbXBsZVN0cmluZygpIHsKICAgIHJldHVybiB0aGlzLnJlZlN0cmluZzsKICB9CiAgLyoqCiAgICogdGhlIGJhc2U2NCBlbmNvZGVkIHZlcnNpb24gb2YgdGhlIG9yaWdpbmFsIHN0cmluZwogICAqLwogIGdldCBiYXNlNjRTdHJpbmcoKSB7CiAgICByZXR1cm4gYmFzZTY0LmVuY29kZSh0aGlzLnJlZlN0cmluZyk7CiAgfQogIC8qKgogICAqIHRoZSBiYXNlNjR1cmkgZW5jb2RlZCB2ZXJzaW9uIG9mIHRoZSBvcmlnaW5hbCBzdHJpbmcKICAgKi8KICBnZXQgYmFzZTY0VXJpU3RyaW5nKCkgewogICAgcmV0dXJuIGJhc2U2NC5lbmNvZGVVcmkodGhpcy5yZWZTdHJpbmcpOwogIH0KfTsKdmFyIGJhc2U2NCA9IHsKICAvKioKICAgKiBlbmNvZGVzIHRoZSBzdHJpbmcKICAgKi8KICBlbmNvZGU6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHN0cmluZ0FyZykgPT4gewogICAgcmV0dXJuIHVuaXZlcnNhbEJhc2U2NC5lbmNvZGUoc3RyaW5nQXJnKTsKICB9LCAiZW5jb2RlIiksCiAgLyoqCiAgICogZW5jb2RlcyBhIHN0cmluZ0FyZyB0byBiYXNlNjQgdXJpIHN0eWxlCiAgICovCiAgZW5jb2RlVXJpOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKChzdHJpbmdBcmcpID0+IHsKICAgIHJldHVybiB1bml2ZXJzYWxCYXNlNjQuZW5jb2RlKHN0cmluZ0FyZykucmVwbGFjZSgvXCsvZywgIi0iKS5yZXBsYWNlKC9cLy9nLCAiXyIpLnJlcGxhY2UoLz0vZywgIiIpOwogIH0sICJlbmNvZGVVcmkiKSwKICAvKioKICAgKiBkZWNvZGVzIGEgYmFzZTY0IGVuY29kZWQgc3RyaW5nCiAgICovCiAgZGVjb2RlOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKChzdHJpbmdBcmcpID0+IHsKICAgIHJldHVybiB1bml2ZXJzYWxCYXNlNjQuZGVjb2RlKHN0cmluZ0FyZyk7CiAgfSwgImRlY29kZSIpLAogIC8qKgogICAqCiAgICogQHBhcmFtIHN0cmluZ0FyZwogICAqIGNoZWNrcyB3ZXRoZXIgdGhlIHN0cmluZyBpcyBiYXNlNjQgZW5jb2RlZAogICAqLwogIGlzQmFzZTY0OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKChzdHJpbmdBcmcpID0+IHsKICAgIGNvbnN0IHJlZ2V4ID0gL14oW0EtWmEtejAtOSsvXXs0fSkqKFtBLVphLXowLTkrL117M309fFtBLVphLXowLTkrL117Mn09PSk/JC87CiAgICByZXR1cm4gcmVnZXgudGVzdChzdHJpbmdBcmcpOwogIH0sICJpc0Jhc2U2NCIpCn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRzdHJpbmdANC4xLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0c3RyaW5nL2Rpc3RfdHMvc21hcnRzdHJpbmcudHlwZS5qcwp2YXIgaXNVdGY4ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoc3RyaW5nQXJnKSA9PiB7CiAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpOwogIGNvbnN0IGJ5dGVzID0gZW5jb2Rlci5lbmNvZGUoc3RyaW5nQXJnKTsKICBsZXQgaTEwID0gMDsKICB3aGlsZSAoaTEwIDwgYnl0ZXMubGVuZ3RoKSB7CiAgICBpZiAoCiAgICAgIC8vIEFTQ0lJCiAgICAgIGJ5dGVzW2kxMF0gPT09IDkgfHwgYnl0ZXNbaTEwXSA9PT0gMTAgfHwgYnl0ZXNbaTEwXSA9PT0gMTMgfHwgMzIgPD0gYnl0ZXNbaTEwXSAmJiBieXRlc1tpMTBdIDw9IDEyNgogICAgKSB7CiAgICAgIGkxMCArPSAxOwogICAgICBjb250aW51ZTsKICAgIH0KICAgIGlmICgKICAgICAgLy8gbm9uLW92ZXJsb25nIDItYnl0ZQogICAgICAxOTQgPD0gYnl0ZXNbaTEwXSAmJiBieXRlc1tpMTBdIDw9IDIyMyAmJiAxMjggPD0gYnl0ZXNbaTEwICsgMV0gJiYgYnl0ZXNbaTEwICsgMV0gPD0gMTkxCiAgICApIHsKICAgICAgaTEwICs9IDI7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgaWYgKAogICAgICAvLyBleGNsdWRpbmcgb3ZlcmxvbmdzCiAgICAgIGJ5dGVzW2kxMF0gPT09IDIyNCAmJiAxNjAgPD0gYnl0ZXNbaTEwICsgMV0gJiYgYnl0ZXNbaTEwICsgMV0gPD0gMTkxICYmIDEyOCA8PSBieXRlc1tpMTAgKyAyXSAmJiBieXRlc1tpMTAgKyAyXSA8PSAxOTEgfHwgLy8gc3RyYWlnaHQgMy1ieXRlCiAgICAgICgyMjUgPD0gYnl0ZXNbaTEwXSAmJiBieXRlc1tpMTBdIDw9IDIzNiB8fCBieXRlc1tpMTBdID09PSAyMzggfHwgYnl0ZXNbaTEwXSA9PT0gMjM5KSAmJiAxMjggPD0gYnl0ZXNbaTEwICsgMV0gJiYgYnl0ZXNbaTEwICsgMV0gPD0gMTkxICYmIDEyOCA8PSBieXRlc1tpMTAgKyAyXSAmJiBieXRlc1tpMTAgKyAyXSA8PSAxOTEgfHwgLy8gZXhjbHVkaW5nIHN1cnJvZ2F0ZXMKICAgICAgYnl0ZXNbaTEwXSA9PT0gMjM3ICYmIDEyOCA8PSBieXRlc1tpMTAgKyAxXSAmJiBieXRlc1tpMTAgKyAxXSA8PSAxNTkgJiYgMTI4IDw9IGJ5dGVzW2kxMCArIDJdICYmIGJ5dGVzW2kxMCArIDJdIDw9IDE5MQogICAgKSB7CiAgICAgIGkxMCArPSAzOwogICAgICBjb250aW51ZTsKICAgIH0KICAgIGlmICgKICAgICAgLy8gcGxhbmVzIDEtMwogICAgICBieXRlc1tpMTBdID09PSAyNDAgJiYgMTQ0IDw9IGJ5dGVzW2kxMCArIDFdICYmIGJ5dGVzW2kxMCArIDFdIDw9IDE5MSAmJiAxMjggPD0gYnl0ZXNbaTEwICsgMl0gJiYgYnl0ZXNbaTEwICsgMl0gPD0gMTkxICYmIDEyOCA8PSBieXRlc1tpMTAgKyAzXSAmJiBieXRlc1tpMTAgKyAzXSA8PSAxOTEgfHwgLy8gcGxhbmVzIDQtMTUKICAgICAgMjQxIDw9IGJ5dGVzW2kxMF0gJiYgYnl0ZXNbaTEwXSA8PSAyNDMgJiYgMTI4IDw9IGJ5dGVzW2kxMCArIDFdICYmIGJ5dGVzW2kxMCArIDFdIDw9IDE5MSAmJiAxMjggPD0gYnl0ZXNbaTEwICsgMl0gJiYgYnl0ZXNbaTEwICsgMl0gPD0gMTkxICYmIDEyOCA8PSBieXRlc1tpMTAgKyAzXSAmJiBieXRlc1tpMTAgKyAzXSA8PSAxOTEgfHwgLy8gcGxhbmUgMTYKICAgICAgYnl0ZXNbaTEwXSA9PT0gMjQ0ICYmIDEyOCA8PSBieXRlc1tpMTAgKyAxXSAmJiBieXRlc1tpMTAgKyAxXSA8PSAxNDMgJiYgMTI4IDw9IGJ5dGVzW2kxMCArIDJdICYmIGJ5dGVzW2kxMCArIDJdIDw9IDE5MSAmJiAxMjggPD0gYnl0ZXNbaTEwICsgM10gJiYgYnl0ZXNbaTEwICsgM10gPD0gMTkxCiAgICApIHsKICAgICAgaTEwICs9IDQ7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KICByZXR1cm4gdHJ1ZTsKfSwgImlzVXRmOCIpOwp2YXIgaXNCYXNlNjQgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChzdHJpbmdBcmcpID0+IHsKICBjb25zdCBub3RCYXNlNjQgPSAvW15BLVowLTkrXC89XS9pOwogIGNvbnN0IGxlbiA9IHN0cmluZ0FyZy5sZW5ndGg7CiAgaWYgKCFsZW4gfHwgbGVuICUgNCAhPT0gMCB8fCBub3RCYXNlNjQudGVzdChzdHJpbmdBcmcpKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGNvbnN0IGZpcnN0UGFkZGluZ0NoYXIgPSBzdHJpbmdBcmcuaW5kZXhPZigiPSIpOwogIHJldHVybiBmaXJzdFBhZGRpbmdDaGFyID09PSAtMSB8fCBmaXJzdFBhZGRpbmdDaGFyID09PSBsZW4gLSAxIHx8IGZpcnN0UGFkZGluZ0NoYXIgPT09IGxlbiAtIDIgJiYgc3RyaW5nQXJnW2xlbiAtIDFdID09PSAiPSI7Cn0sICJpc0Jhc2U2NCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0c3RyaW5nQDQuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHN0cmluZy9kaXN0X3RzL3NtYXJ0c3RyaW5nLmRvbWFpbi5qcwp2YXIgRG9tYWluID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkRvbWFpbiIpOwogIH0KICBjb25zdHJ1Y3Rvcihkb21haW5TdHJpbmdBcmcpIHsKICAgIHRoaXMucHJvdG9jb2wgPSB0aGlzLl9wcm90b2NvbFJlZ2V4KGRvbWFpblN0cmluZ0FyZyk7CiAgICBpZiAoIXRoaXMucHJvdG9jb2wpIHsKICAgICAgZG9tYWluU3RyaW5nQXJnID0gYGh0dHBzOi8vJHtkb21haW5TdHJpbmdBcmd9YDsKICAgIH0KICAgIHRoaXMubm9kZVBhcnNlZFVybCA9IG5ldyBVUkwoZG9tYWluU3RyaW5nQXJnKTsKICAgIHRoaXMucG9ydCA9IHRoaXMubm9kZVBhcnNlZFVybC5wb3J0OwogICAgY29uc3QgcmVnZXhNYXRjaGVzID0gdGhpcy5fZG9tYWluUmVnZXgoZG9tYWluU3RyaW5nQXJnLnJlcGxhY2UodGhpcy5ub2RlUGFyc2VkVXJsLnBhdGhuYW1lLCAiIikpOwogICAgdGhpcy5mdWxsTmFtZSA9ICIiOwogICAgZm9yIChsZXQgaTEwID0gMTsgaTEwIDw9IDU7IGkxMCsrKSB7CiAgICAgIGlmIChyZWdleE1hdGNoZXNbaTEwIC0gMV0pIHsKICAgICAgICBjb25zdCBsb2NhbE1hdGNoID0gcmVnZXhNYXRjaGVzW2kxMCAtIDFdOwogICAgICAgIHRoaXNbImxldmVsIiArIGkxMC50b1N0cmluZygpXSA9IGxvY2FsTWF0Y2g7CiAgICAgICAgaWYgKHRoaXMuZnVsbE5hbWUgPT09ICIiKSB7CiAgICAgICAgICB0aGlzLmZ1bGxOYW1lID0gbG9jYWxNYXRjaDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5mdWxsTmFtZSA9IGxvY2FsTWF0Y2ggKyAiLiIgKyB0aGlzLmZ1bGxOYW1lOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzWyJsZXZlbCIgKyBpMTAudG9TdHJpbmcoKV0gPSB2b2lkIDA7CiAgICAgIH0KICAgIH0KICAgIHRoaXMuem9uZU5hbWUgPSB0aGlzLmxldmVsMiArICIuIiArIHRoaXMubGV2ZWwxOwogICAgdGhpcy50b3BMZXZlbCA9IHRoaXMubGV2ZWwxOwogICAgdGhpcy5kb21haW5OYW1lID0gdGhpcy5sZXZlbDI7CiAgICB0aGlzLnN1YkRvbWFpbiA9IHRoaXMubGV2ZWwzOwogIH0KICAvLyBoZWxwZXIgZnVuY3Rpb25zCiAgLyoqICovCiAgX2RvbWFpblJlZ2V4KHN0cmluZ0FyZykgewogICAgY29uc3QgcmVnZXhTdHJpbmcgPSAvKFthLXpBLVowLTlcLVxfXSopXC57MCwxfShbYS16QS1aMC05XC1cX10qKVwuezAsMX0oW2EtekEtWjAtOVwtXF9dKilcLnswLDF9KFthLXpBLVowLTlcLVxfXSopXC57MCwxfShbYS16QS1aMC05XC1cX10qKVwuezAsMX0kLzsKICAgIGNvbnN0IHJlZ2V4TWF0Y2hlcyA9IHJlZ2V4U3RyaW5nLmV4ZWMoc3RyaW5nQXJnKTsKICAgIHJlZ2V4TWF0Y2hlcy5yZXZlcnNlKCk7CiAgICByZWdleE1hdGNoZXMucG9wKCk7CiAgICBjb25zdCByZWdleE1hdGNoZXNGaWx0ZXJlZCA9IHJlZ2V4TWF0Y2hlcy5maWx0ZXIoZnVuY3Rpb24oc3RyaW5nQXJnMikgewogICAgICByZXR1cm4gc3RyaW5nQXJnMiAhPT0gIiI7CiAgICB9KTsKICAgIHJldHVybiByZWdleE1hdGNoZXNGaWx0ZXJlZDsKICB9CiAgX3Byb3RvY29sUmVnZXgoc3RyaW5nQXJnKSB7CiAgICBjb25zdCByZWdleFN0cmluZyA9IC9eKFthLXpBLVowLTldKik6XC9cLy87CiAgICBjb25zdCByZWdleE1hdGNoZXMgPSByZWdleFN0cmluZy5leGVjKHN0cmluZ0FyZyk7CiAgICBpZiAocmVnZXhNYXRjaGVzKSB7CiAgICAgIHJldHVybiByZWdleE1hdGNoZXNbMV07CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gdm9pZCAwOwogICAgfQogIH0KICBfcG9ydFJlZ2V4KHN0cmluZ0FyZykgewogICAgY29uc3QgcmVnZXhTdHJpbmcgPSAvXihbYS16QS1aMC05XSopOlwvXC8vOwogICAgY29uc3QgcmVnZXhNYXRjaGVzID0gcmVnZXhTdHJpbmcuZXhlYyhzdHJpbmdBcmcpOwogICAgaWYgKHJlZ2V4TWF0Y2hlcykgewogICAgICByZXR1cm4gcmVnZXhNYXRjaGVzWzFdOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHZvaWQgMDsKICAgIH0KICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRzdHJpbmdANC4xLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0c3RyaW5nL2Rpc3RfdHMvc21hcnRzdHJpbmcuZ2l0LmpzCnZhciBHaXRSZXBvID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkdpdFJlcG8iKTsKICB9CiAgY29uc3RydWN0b3Ioc3RyaW5nQXJnLCB0b2tlbkFyZykgewogICAgbGV0IHJlZ2V4TWF0Y2hlcyA9IGdpdFJlZ2V4KHN0cmluZ0FyZyk7CiAgICB0aGlzLmhvc3QgPSByZWdleE1hdGNoZXNbMV07CiAgICB0aGlzLnVzZXIgPSByZWdleE1hdGNoZXNbMl07CiAgICB0aGlzLnJlcG8gPSByZWdleE1hdGNoZXNbM107CiAgICB0aGlzLmFjY2Vzc1Rva2VuID0gdG9rZW5Bcmc7CiAgICB0aGlzLnNzaFVybCA9IGdpdExpbmsodGhpcy5ob3N0LCB0aGlzLnVzZXIsIHRoaXMucmVwbywgdGhpcy5hY2Nlc3NUb2tlbiwgInNzaCIpOwogICAgdGhpcy5odHRwc1VybCA9IGdpdExpbmsodGhpcy5ob3N0LCB0aGlzLnVzZXIsIHRoaXMucmVwbywgdGhpcy5hY2Nlc3NUb2tlbiwgImh0dHBzIik7CiAgfQp9Owp2YXIgZ2l0UmVnZXggPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKHN0cmluZ0FyZykgewogIGNvbnN0IHJlZ2V4U3RyaW5nID0gLyhbYS16QS1aMC05XC1fXC5dKikoPzpcL3xcOikoW2EtekEtWjAtOVwtX1wuXSopKD86XC8pKFthLXpBLVowLTlcLV9cLl0qKSg/OlwuZ2l0KS87CiAgbGV0IHJlZ2V4TWF0Y2hlcyA9IHJlZ2V4U3RyaW5nLmV4ZWMoc3RyaW5nQXJnKTsKICByZXR1cm4gcmVnZXhNYXRjaGVzOwp9LCAiZ2l0UmVnZXgiKTsKdmFyIGdpdExpbmsgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGhvc3RBcmcsIHVzZXJBcmcsIHJlcG9BcmcsIHRva2VuQXJnID0gIiIsIGxpbmtUeXBlQXJnKSB7CiAgbGV0IHJldHVyblN0cmluZzsKICBpZiAodG9rZW5BcmcgIT09ICIiKSB7CiAgICB0b2tlbkFyZyA9IHRva2VuQXJnICsgIkAiOwogIH0KICBzd2l0Y2ggKGxpbmtUeXBlQXJnKSB7CiAgICBjYXNlICJodHRwcyI6CiAgICAgIHJldHVyblN0cmluZyA9ICJodHRwczovLyIgKyB0b2tlbkFyZyArIGhvc3RBcmcgKyAiLyIgKyB1c2VyQXJnICsgIi8iICsgcmVwb0FyZyArICIuZ2l0IjsKICAgICAgYnJlYWs7CiAgICBjYXNlICJzc2giOgogICAgICByZXR1cm5TdHJpbmcgPSAiZ2l0QCIgKyBob3N0QXJnICsgIjoiICsgdXNlckFyZyArICIvIiArIHJlcG9BcmcgKyAiLmdpdCI7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgY29uc29sZS5lcnJvcigiTGluayBUeXBlICIgKyBsaW5rVHlwZUFyZyArICIgbm90IGtub3duIik7CiAgICAgIGJyZWFrOwogIH0KICByZXR1cm4gcmV0dXJuU3RyaW5nOwp9LCAiZ2l0TGluayIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0anNvbkA2LjAuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRqc29uL2Rpc3RfdHMvc21hcnRqc29uLnBsdWdpbnMuanMKdmFyIGltcG9ydF9sb2Rhc2ggPSBfX3RvRVNNKHJlcXVpcmVfbG9kYXNoKCksIDEpOwp2YXIgaW1wb3J0X2Zhc3RfanNvbl9zdGFibGVfc3RyaW5naWZ5ID0gX190b0VTTShyZXF1aXJlX2Zhc3RfanNvbl9zdGFibGVfc3RyaW5naWZ5KCksIDEpOwp2YXIgc3RhYmxlSnNvbiA9IGltcG9ydF9mYXN0X2pzb25fc3RhYmxlX3N0cmluZ2lmeS5kZWZhdWx0OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0anNvbkA2LjAuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRqc29uL2Rpc3RfdHMvYnVmZmVyaGFuZGxpbmcuanMKZnVuY3Rpb24gYmFzZTY0RW5jb2RlKGRhdGEpIHsKICBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gInVuZGVmaW5lZCIpIHsKICAgIHJldHVybiBCdWZmZXIuZnJvbShkYXRhKS50b1N0cmluZygiYmFzZTY0Iik7CiAgfQogIHJldHVybiBidG9hKFN0cmluZy5mcm9tQ2hhckNvZGUoLi4uZGF0YSkpOwp9Cl9fbmFtZShiYXNlNjRFbmNvZGUsICJiYXNlNjRFbmNvZGUiKTsKZnVuY3Rpb24gYmFzZTY0RGVjb2RlKHN0cikgewogIGlmICh0eXBlb2YgQnVmZmVyICE9PSAidW5kZWZpbmVkIikgewogICAgY29uc3QgYnVmID0gQnVmZmVyLmZyb20oc3RyLCAiYmFzZTY0Iik7CiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYnVmLmJ1ZmZlciwgYnVmLmJ5dGVPZmZzZXQsIGJ1Zi5ieXRlTGVuZ3RoKTsKICB9CiAgcmV0dXJuIG5ldyBVaW50OEFycmF5KEFycmF5LmZyb20oYXRvYihzdHIpKS5tYXAoKGNoYXIpID0+IGNoYXIuY2hhckNvZGVBdCgwKSkpOwp9Cl9fbmFtZShiYXNlNjREZWNvZGUsICJiYXNlNjREZWNvZGUiKTsKZnVuY3Rpb24gc3RyaW5naWZ5KHZhbHVlMiwgc3BhY2UyKSB7CiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlMiwgcmVwbGFjZXIsIHNwYWNlMik7Cn0KX19uYW1lKHN0cmluZ2lmeSwgInN0cmluZ2lmeSIpOwpmdW5jdGlvbiBwYXJzZTIodGV4dDgpIHsKICByZXR1cm4gSlNPTi5wYXJzZSh0ZXh0OCwgcmV2aXZlcik7Cn0KX19uYW1lKHBhcnNlMiwgInBhcnNlIik7CnZhciByZXBsYWNlciA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGtleTIsIHZhbHVlMikgPT4gewogIGlmIChpc0J1ZmZlckxpa2UyKHZhbHVlMikpIHsKICAgIGxldCBidWZmZXJEYXRhOwogICAgaWYgKCJkYXRhIiBpbiB2YWx1ZTIgJiYgaXNBcnJheTModmFsdWUyLmRhdGEpKSB7CiAgICAgIGJ1ZmZlckRhdGEgPSBuZXcgVWludDhBcnJheSh2YWx1ZTIuZGF0YSk7CiAgICB9IGVsc2UgaWYgKHZhbHVlMiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHsKICAgICAgYnVmZmVyRGF0YSA9IHZhbHVlMjsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB2YWx1ZTI7CiAgICB9CiAgICBjb25zdCBiYXNlNjREYXRhID0gImJhc2U2NDoiICsgYmFzZTY0RW5jb2RlKGJ1ZmZlckRhdGEpOwogICAgcmV0dXJuIHsKICAgICAgdHlwZTogIkVuY29kZWRCdWZmZXIiLAogICAgICBkYXRhOiBiYXNlNjREYXRhCiAgICB9OwogIH0KICByZXR1cm4gdmFsdWUyOwp9LCAicmVwbGFjZXIiKTsKdmFyIHJldml2ZXIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChrZXkyLCB2YWx1ZTIpID0+IHsKICBpZiAoaXNFbmNvZGVkQnVmZmVyKHZhbHVlMikpIHsKICAgIGlmIChpc1N0cmluZyh2YWx1ZTIuZGF0YSkgJiYgdmFsdWUyLmRhdGEuc3RhcnRzV2l0aCgiYmFzZTY0OiIpKSB7CiAgICAgIGNvbnN0IGJhc2U2NERhdGEgPSB2YWx1ZTIuZGF0YS5zbGljZSg3KTsKICAgICAgY29uc3QgYnVmZmVyMiA9IGJhc2U2NERlY29kZShiYXNlNjREYXRhKTsKICAgICAgcmV0dXJuIGJ1ZmZlcjI7CiAgICB9CiAgfQogIHJldHVybiB2YWx1ZTI7Cn0sICJyZXZpdmVyIik7CmZ1bmN0aW9uIGlzRW5jb2RlZEJ1ZmZlcih4MykgewogIHJldHVybiBpc09iamVjdCh4MykgJiYgeDMudHlwZSA9PT0gIkVuY29kZWRCdWZmZXIiICYmIGlzU3RyaW5nKHgzLmRhdGEpOwp9Cl9fbmFtZShpc0VuY29kZWRCdWZmZXIsICJpc0VuY29kZWRCdWZmZXIiKTsKZnVuY3Rpb24gaXNCdWZmZXJMaWtlMih4MykgewogIHJldHVybiBpc09iamVjdCh4MykgJiYgKHgzLnR5cGUgPT09ICJCdWZmZXIiICYmIChpc0FycmF5Myh4My5kYXRhKSB8fCBpc1N0cmluZyh4My5kYXRhKSkpIHx8IHgzIGluc3RhbmNlb2YgVWludDhBcnJheTsKfQpfX25hbWUoaXNCdWZmZXJMaWtlMiwgImlzQnVmZmVyTGlrZSIpOwpmdW5jdGlvbiBpc0FycmF5Myh4MykgewogIHJldHVybiBBcnJheS5pc0FycmF5KHgzKTsKfQpfX25hbWUoaXNBcnJheTMsICJpc0FycmF5Iik7CmZ1bmN0aW9uIGlzU3RyaW5nKHgzKSB7CiAgcmV0dXJuIHR5cGVvZiB4MyA9PT0gInN0cmluZyI7Cn0KX19uYW1lKGlzU3RyaW5nLCAiaXNTdHJpbmciKTsKZnVuY3Rpb24gaXNPYmplY3QoeDMpIHsKICByZXR1cm4gdHlwZW9mIHgzID09PSAib2JqZWN0IiAmJiB4MyAhPT0gbnVsbDsKfQpfX25hbWUoaXNPYmplY3QsICJpc09iamVjdCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0anNvbkA2LjAuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRqc29uL2Rpc3RfdHMvaW5kZXguanMKdmFyIHBhcnNlMyA9IHBhcnNlMjsKdmFyIHBhcnNlSnNvbkwgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChqc29ubERhdGEpID0+IHsKICBjb25zdCBsaW5lcyA9IGpzb25sRGF0YS5zcGxpdCgiXG4iKTsKICBjb25zdCBwYXJzZWREYXRhID0gbGluZXMucmVkdWNlKChhY2MsIGxpbmUpID0+IHsKICAgIGNvbnN0IHRyaW1tZWQgPSBsaW5lLnRyaW0oKTsKICAgIGlmICh0cmltbWVkLmxlbmd0aCA+IDApIHsKICAgICAgYWNjLnB1c2gocGFyc2UzKHRyaW1tZWQpKTsKICAgIH0KICAgIHJldHVybiBhY2M7CiAgfSwgW10pOwogIHJldHVybiBwYXJzZWREYXRhOwp9LCAicGFyc2VKc29uTCIpOwp2YXIgc3RyaW5naWZ5SnNvbkwgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChpdGVtcykgPT4gewogIHJldHVybiBpdGVtcy5tYXAoKGl0ZW0pID0+IHN0cmluZ2lmeTIoaXRlbSkpLmpvaW4oIlxuIik7Cn0sICJzdHJpbmdpZnlKc29uTCIpOwp2YXIgc3RhYmxlT25lV2F5U3RyaW5naWZ5ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgob2JqQXJnLCBzaW1wbGVPcmRlckFycmF5LCBvcHRpb25zQXJnID0ge30pID0+IHsKICBjb25zdCB2aXNpdGVkID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrU2V0KCk7CiAgY29uc3Qgc2FuaXRpemUyID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgodmFsKSA9PiB7CiAgICBpZiAodmFsID09PSBudWxsIHx8IHR5cGVvZiB2YWwgIT09ICJvYmplY3QiKSB7CiAgICAgIHJldHVybiB2YWw7CiAgICB9CiAgICBjb25zdCByZXBsYWNlZCA9IHJlcGxhY2VyKCIiLCB2YWwpOwogICAgaWYgKHJlcGxhY2VkICYmIHJlcGxhY2VkLnR5cGUgPT09ICJFbmNvZGVkQnVmZmVyIiAmJiB0eXBlb2YgcmVwbGFjZWQuZGF0YSA9PT0gInN0cmluZyIpIHsKICAgICAgcmV0dXJuIHJlcGxhY2VkOwogICAgfQogICAgaWYgKHZpc2l0ZWQuaGFzKHZhbCkpIHsKICAgICAgcmV0dXJuICJfX2N5Y2xlX18iOwogICAgfQogICAgdmlzaXRlZC5hZGQodmFsKTsKICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHsKICAgICAgcmV0dXJuIHZhbC5tYXAoKGl0ZW0pID0+IHNhbml0aXplMihpdGVtKSk7CiAgICB9CiAgICBjb25zdCBvdXQgPSB7fTsKICAgIGZvciAoY29uc3Qga2V5MiBvZiBPYmplY3Qua2V5cyh2YWwpKSB7CiAgICAgIHRyeSB7CiAgICAgICAgb3V0W2tleTJdID0gc2FuaXRpemUyKHZhbFtrZXkyXSk7CiAgICAgIH0gY2F0Y2ggKGUxMCkgewogICAgICAgIG91dFtrZXkyXSA9ICJfX3Vuc2VyaWFsaXphYmxlX18iOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gb3V0OwogIH0sICJzYW5pdGl6ZSIpOwogIGNvbnN0IG9iaiA9IHNhbml0aXplMihvYmpBcmcpOwogIGNvbnN0IG9wdGlvbnMgPSB7CiAgICAuLi5vcHRpb25zQXJnLAogICAgY3ljbGVzOiB0cnVlCiAgfTsKICBpZiAoc2ltcGxlT3JkZXJBcnJheSAmJiAhb3B0aW9ucy5jbXApIHsKICAgIGNvbnN0IG9yZGVyMiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICBzaW1wbGVPcmRlckFycmF5LmZvckVhY2goKGtleTIsIGlkeCkgPT4gb3JkZXIyLnNldChrZXkyLCBpZHgpKTsKICAgIG9wdGlvbnMuY21wID0gKGE0LCBiNCkgPT4gewogICAgICBjb25zdCBhSWR4ID0gb3JkZXIyLmhhcyhhNC5rZXkpID8gb3JkZXIyLmdldChhNC5rZXkpIDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZOwogICAgICBjb25zdCBiSWR4ID0gb3JkZXIyLmhhcyhiNC5rZXkpID8gb3JkZXIyLmdldChiNC5rZXkpIDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZOwogICAgICBpZiAoYUlkeCAhPT0gYklkeCkKICAgICAgICByZXR1cm4gYUlkeCAtIGJJZHg7CiAgICAgIHJldHVybiBhNC5rZXkgPCBiNC5rZXkgPyAtMSA6IGE0LmtleSA+IGI0LmtleSA/IDEgOiAwOwogICAgfTsKICB9CiAgcmV0dXJuIHN0YWJsZUpzb24ob2JqLCBvcHRpb25zKTsKfSwgInN0YWJsZU9uZVdheVN0cmluZ2lmeSIpOwp2YXIgc3RyaW5naWZ5MiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKG9iakFyZywgc2ltcGxlT3JkZXJBcnJheSwgb3B0aW9uc0FyZyA9IHt9KSA9PiB7CiAgY29uc3QgYnVmZmVyZWRKc29uID0gc3RyaW5naWZ5KG9iakFyZyk7CiAgb2JqQXJnID0gSlNPTi5wYXJzZShidWZmZXJlZEpzb24pOwogIGxldCBvcHRpb25zID0geyAuLi5vcHRpb25zQXJnIH07CiAgaWYgKHNpbXBsZU9yZGVyQXJyYXkgJiYgIW9wdGlvbnMuY21wKSB7CiAgICBjb25zdCBvcmRlcjIgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgc2ltcGxlT3JkZXJBcnJheS5mb3JFYWNoKChrZXkyLCBpZHgpID0+IG9yZGVyMi5zZXQoa2V5MiwgaWR4KSk7CiAgICBvcHRpb25zLmNtcCA9IChhNCwgYjQpID0+IHsKICAgICAgY29uc3QgYUlkeCA9IG9yZGVyMi5oYXMoYTQua2V5KSA/IG9yZGVyMi5nZXQoYTQua2V5KSA6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTsKICAgICAgY29uc3QgYklkeCA9IG9yZGVyMi5oYXMoYjQua2V5KSA/IG9yZGVyMi5nZXQoYjQua2V5KSA6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTsKICAgICAgaWYgKGFJZHggIT09IGJJZHgpCiAgICAgICAgcmV0dXJuIGFJZHggLSBiSWR4OwogICAgICByZXR1cm4gYTQua2V5IDwgYjQua2V5ID8gLTEgOiBhNC5rZXkgPiBiNC5rZXkgPyAxIDogMDsKICAgIH07CiAgfQogIGxldCByZXR1cm5Kc29uID0gc3RhYmxlSnNvbihvYmpBcmcsIG9wdGlvbnMpOwogIHJldHVybiByZXR1cm5Kc29uOwp9LCAic3RyaW5naWZ5Iik7CnZhciBzdHJpbmdpZnlQcmV0dHkgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChvYmplY3RBcmcpID0+IHsKICBjb25zdCBzdHJpbmdpZmllZCA9IHN0cmluZ2lmeTIob2JqZWN0QXJnKTsKICBjb25zdCBvYmplY3QgPSBKU09OLnBhcnNlKHN0cmluZ2lmaWVkKTsKICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqZWN0LCBudWxsLCAyKTsKfSwgInN0cmluZ2lmeVByZXR0eSIpOwp2YXIgc3RyaW5naWZ5QmFzZTY0ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoLi4uYXJncykgPT4gewogIGNvbnN0IHN0cmluZ2lmaWVkUmVzdWx0ID0gc3RyaW5naWZ5MiguLi5hcmdzKTsKICByZXR1cm4gZGlzdF90c19leHBvcnRzMTEuYmFzZTY0LmVuY29kZVVyaShzdHJpbmdpZmllZFJlc3VsdCk7Cn0sICJzdHJpbmdpZnlCYXNlNjQiKTsKdmFyIHBhcnNlQmFzZTY0ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoYmFzZTY0SnNvblN0cmluZ0FyZykgPT4gewogIGNvbnN0IGJhc2U2NDIgPSBkaXN0X3RzX2V4cG9ydHMxMS5iYXNlNjQ7CiAgY29uc3QgZGVjb2RlRm4gPSBiYXNlNjQyLmRlY29kZVVyaSB8fCBiYXNlNjQyLmRlY29kZTsKICBjb25zdCBzaW1wbGVTdHJpbmdpZmllZCA9IGRlY29kZUZuKGJhc2U2NEpzb25TdHJpbmdBcmcpOwogIHJldHVybiBwYXJzZTMoc2ltcGxlU3RyaW5naWZpZWQpOwp9LCAicGFyc2VCYXNlNjQiKTsKdmFyIFNtYXJ0anNvbiA9IGNsYXNzIF9TbWFydGpzb24gewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlNtYXJ0anNvbiIpOwogIH0KICAvKioKICAgKiBlbmZvbGRzIGRhdGEgZnJvbSBhbiBvYmplY3QKICAgKi8KICBzdGF0aWMgZW5mb2xkRnJvbU9iamVjdChvYmplY3RBcmcpIHsKICAgIGNvbnN0IG5ld0luc3RhbmNlID0gbmV3IHRoaXMoKTsKICAgIGNvbnN0IHNhdmVhYmxlcyA9IG5ld0luc3RhbmNlLnNhdmVhYmxlUHJvcGVydGllcyB8fCBbXTsKICAgIGZvciAoY29uc3Qga2V5TmFtZSBpbiBvYmplY3RBcmcpIHsKICAgICAgaWYgKHNhdmVhYmxlcy5pbmRleE9mKGtleU5hbWUpICE9PSAtMSkgewogICAgICAgIG5ld0luc3RhbmNlW2tleU5hbWVdID0gb2JqZWN0QXJnW2tleU5hbWVdOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3SW5zdGFuY2U7CiAgfQogIC8qKgogICAqIGVuZm9sZCBmcm9tIGpzb24KICAgKi8KICBzdGF0aWMgZW5mb2xkRnJvbUpzb24oanNvbkFyZykgewogICAgY29uc3Qgb2JqZWN0RnJvbUpzb24gPSBwYXJzZTMoanNvbkFyZyk7CiAgICByZXR1cm4gdGhpcy5lbmZvbGRGcm9tT2JqZWN0KG9iamVjdEZyb21Kc29uKTsKICB9CiAgLy8gPT09PT09PT0KICAvLyBJTlNUQU5DRQogIC8vID09PT09PT09CiAgc2F2ZWFibGVQcm9wZXJ0aWVzOwogIC8qKgogICAqIGZvbGRzIGEgY2xhc3MgaW50byBhbiBvYmplY3QKICAgKi8KICBmb2xkVG9PYmplY3QoKSB7CiAgICBjb25zdCB0cmFja1NldCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7CiAgICB0cmFja1NldC5hZGQodGhpcyk7CiAgICByZXR1cm4gdGhpcy5mb2xkVG9PYmplY3RJbnRlcm5hbCh0cmFja1NldCk7CiAgfQogIGZvbGRUb09iamVjdEludGVybmFsKHRyYWNrU2V0KSB7CiAgICBjb25zdCByZXN1bHQgPSB7fTsKICAgIGNvbnN0IGZvbGRWYWx1ZSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHZhbCkgPT4gewogICAgICBpZiAodmFsIGluc3RhbmNlb2YgX1NtYXJ0anNvbikgewogICAgICAgIGlmICh0cmFja1NldC5oYXModmFsKSkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJjeWNsZSBkZXRlY3RlZCIpOwogICAgICAgIH0KICAgICAgICB0cmFja1NldC5hZGQodmFsKTsKICAgICAgICByZXR1cm4gdmFsLmZvbGRUb09iamVjdEludGVybmFsKHRyYWNrU2V0KTsKICAgICAgfQogICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7CiAgICAgICAgcmV0dXJuIHZhbC5tYXAoKGl0ZW0pID0+IGZvbGRWYWx1ZShpdGVtKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGltcG9ydF9sb2Rhc2guZGVmYXVsdCh2YWwpOwogICAgfSwgImZvbGRWYWx1ZSIpOwogICAgY29uc3QgcHJvcHMgPSB0aGlzLnNhdmVhYmxlUHJvcGVydGllcyB8fCBbXTsKICAgIGZvciAoY29uc3Qga2V5TmFtZSBvZiBwcm9wcykgewogICAgICBjb25zdCB2YWx1ZTIgPSB0aGlzW2tleU5hbWVdOwogICAgICByZXN1bHRba2V5TmFtZV0gPSBmb2xkVmFsdWUodmFsdWUyKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQogIC8qKgogICAqIGZvbGRzIGEgY2xhc3MgaW50byBhbiBvYmplY3QKICAgKi8KICBmb2xkVG9Kc29uKCkgewogICAgY29uc3QgZm9sZGVkT2JqZWN0ID0gdGhpcy5mb2xkVG9PYmplY3QoKTsKICAgIHJldHVybiBzdHJpbmdpZnkyKGZvbGRlZE9iamVjdCk7CiAgfQp9Owp2YXIgZm9sZERlYyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKCkgPT4gewogIHJldHVybiAoX3ZhbHVlLCBjb250ZXh0MikgPT4gewogICAgY29uc3QgcHJvcGVydHlOYW1lID0gU3RyaW5nKGNvbnRleHQyLm5hbWUpOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIoZnVuY3Rpb24oKSB7CiAgICAgIGlmICghdGhpcy5zYXZlYWJsZVByb3BlcnRpZXMpIHsKICAgICAgICB0aGlzLnNhdmVhYmxlUHJvcGVydGllcyA9IFtdOwogICAgICB9CiAgICAgIGlmICghdGhpcy5zYXZlYWJsZVByb3BlcnRpZXMuaW5jbHVkZXMocHJvcGVydHlOYW1lKSkgewogICAgICAgIHRoaXMuc2F2ZWFibGVQcm9wZXJ0aWVzLnB1c2gocHJvcGVydHlOYW1lKTsKICAgICAgfQogICAgfSk7CiAgfTsKfSwgImZvbGREZWMiKTsKdmFyIGRlZXBFcXVhbE9iamVjdHMgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChvYmplY3QxLCBvYmplY3QyKSA9PiB7CiAgY29uc3Qgb2JqZWN0MVN0cmluZyA9IHN0cmluZ2lmeTIob2JqZWN0MSk7CiAgY29uc3Qgb2JqZWN0MlN0cmluZyA9IHN0cmluZ2lmeTIob2JqZWN0Mik7CiAgcmV0dXJuIG9iamVjdDFTdHJpbmcgPT09IG9iamVjdDJTdHJpbmc7Cn0sICJkZWVwRXF1YWxPYmplY3RzIik7CnZhciBkZWVwRXF1YWxKc29uTFN0cmluZ3MgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChqc29uTFN0cmluZzEsIGpzb25MU3RyaW5nMikgPT4gewogIGNvbnN0IGZpcnN0QXJyYXkgPSBwYXJzZUpzb25MKGpzb25MU3RyaW5nMSk7CiAgY29uc3Qgc2Vjb25kQXJyYXkgPSBwYXJzZUpzb25MKGpzb25MU3RyaW5nMik7CiAgcmV0dXJuIGRlZXBFcXVhbE9iamVjdHMoZmlyc3RBcnJheSwgc2Vjb25kQXJyYXkpOwp9LCAiZGVlcEVxdWFsSnNvbkxTdHJpbmdzIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrd2Vic3RvcmVAMi4wLjIxL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJzdG9yZS9kaXN0X3RzL2luZGV4LmpzCnZhciBkaXN0X3RzX2V4cG9ydHMxMyA9IHt9OwpfX2V4cG9ydChkaXN0X3RzX2V4cG9ydHMxMywgewogIFR5cGVkcmVxdWVzdENhY2hlOiAoKSA9PiBUeXBlZHJlcXVlc3RDYWNoZSwKICBXZWJTdG9yZTogKCkgPT4gV2ViU3RvcmUKfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vaWRiQDguMC4zL25vZGVfbW9kdWxlcy9pZGIvYnVpbGQvaW5kZXguanMKdmFyIGJ1aWxkX2V4cG9ydHMgPSB7fTsKX19leHBvcnQoYnVpbGRfZXhwb3J0cywgewogIGRlbGV0ZURCOiAoKSA9PiBkZWxldGVEQiwKICBvcGVuREI6ICgpID0+IG9wZW5EQiwKICB1bndyYXA6ICgpID0+IHVud3JhcCwKICB3cmFwOiAoKSA9PiB3cmFwCn0pOwp2YXIgaW5zdGFuY2VPZkFueSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKG9iamVjdCwgY29uc3RydWN0b3JzKSA9PiBjb25zdHJ1Y3RvcnMuc29tZSgoYzEwKSA9PiBvYmplY3QgaW5zdGFuY2VvZiBjMTApLCAiaW5zdGFuY2VPZkFueSIpOwp2YXIgaWRiUHJveHlhYmxlVHlwZXM7CnZhciBjdXJzb3JBZHZhbmNlTWV0aG9kczsKZnVuY3Rpb24gZ2V0SWRiUHJveHlhYmxlVHlwZXMoKSB7CiAgcmV0dXJuIGlkYlByb3h5YWJsZVR5cGVzIHx8IChpZGJQcm94eWFibGVUeXBlcyA9IFsKICAgIElEQkRhdGFiYXNlLAogICAgSURCT2JqZWN0U3RvcmUsCiAgICBJREJJbmRleCwKICAgIElEQkN1cnNvciwKICAgIElEQlRyYW5zYWN0aW9uCiAgXSk7Cn0KX19uYW1lKGdldElkYlByb3h5YWJsZVR5cGVzLCAiZ2V0SWRiUHJveHlhYmxlVHlwZXMiKTsKZnVuY3Rpb24gZ2V0Q3Vyc29yQWR2YW5jZU1ldGhvZHMoKSB7CiAgcmV0dXJuIGN1cnNvckFkdmFuY2VNZXRob2RzIHx8IChjdXJzb3JBZHZhbmNlTWV0aG9kcyA9IFsKICAgIElEQkN1cnNvci5wcm90b3R5cGUuYWR2YW5jZSwKICAgIElEQkN1cnNvci5wcm90b3R5cGUuY29udGludWUsCiAgICBJREJDdXJzb3IucHJvdG90eXBlLmNvbnRpbnVlUHJpbWFyeUtleQogIF0pOwp9Cl9fbmFtZShnZXRDdXJzb3JBZHZhbmNlTWV0aG9kcywgImdldEN1cnNvckFkdmFuY2VNZXRob2RzIik7CnZhciB0cmFuc2FjdGlvbkRvbmVNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTsKdmFyIHRyYW5zZm9ybUNhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7CnZhciByZXZlcnNlVHJhbnNmb3JtQ2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTsKZnVuY3Rpb24gcHJvbWlzaWZ5UmVxdWVzdChyZXF1ZXN0KSB7CiAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlMiwgcmVqZWN0KSA9PiB7CiAgICBjb25zdCB1bmxpc3RlbiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKCkgPT4gewogICAgICByZXF1ZXN0LnJlbW92ZUV2ZW50TGlzdGVuZXIoInN1Y2Nlc3MiLCBzdWNjZXNzKTsKICAgICAgcmVxdWVzdC5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsIGVycm9yKTsKICAgIH0sICJ1bmxpc3RlbiIpOwogICAgY29uc3Qgc3VjY2VzcyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKCkgPT4gewogICAgICByZXNvbHZlMih3cmFwKHJlcXVlc3QucmVzdWx0KSk7CiAgICAgIHVubGlzdGVuKCk7CiAgICB9LCAic3VjY2VzcyIpOwogICAgY29uc3QgZXJyb3IgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCgpID0+IHsKICAgICAgcmVqZWN0KHJlcXVlc3QuZXJyb3IpOwogICAgICB1bmxpc3RlbigpOwogICAgfSwgImVycm9yIik7CiAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoInN1Y2Nlc3MiLCBzdWNjZXNzKTsKICAgIHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLCBlcnJvcik7CiAgfSk7CiAgcmV2ZXJzZVRyYW5zZm9ybUNhY2hlLnNldChwcm9taXNlLCByZXF1ZXN0KTsKICByZXR1cm4gcHJvbWlzZTsKfQpfX25hbWUocHJvbWlzaWZ5UmVxdWVzdCwgInByb21pc2lmeVJlcXVlc3QiKTsKZnVuY3Rpb24gY2FjaGVEb25lUHJvbWlzZUZvclRyYW5zYWN0aW9uKHR4KSB7CiAgaWYgKHRyYW5zYWN0aW9uRG9uZU1hcC5oYXModHgpKQogICAgcmV0dXJuOwogIGNvbnN0IGRvbmUgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZTIsIHJlamVjdCkgPT4gewogICAgY29uc3QgdW5saXN0ZW4gPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCgpID0+IHsKICAgICAgdHgucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLCBjb21wbGV0ZSk7CiAgICAgIHR4LnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIiwgZXJyb3IpOwogICAgICB0eC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsIGVycm9yKTsKICAgIH0sICJ1bmxpc3RlbiIpOwogICAgY29uc3QgY29tcGxldGUgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCgpID0+IHsKICAgICAgcmVzb2x2ZTIoKTsKICAgICAgdW5saXN0ZW4oKTsKICAgIH0sICJjb21wbGV0ZSIpOwogICAgY29uc3QgZXJyb3IgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCgpID0+IHsKICAgICAgcmVqZWN0KHR4LmVycm9yIHx8IG5ldyBET01FeGNlcHRpb24oIkFib3J0RXJyb3IiLCAiQWJvcnRFcnJvciIpKTsKICAgICAgdW5saXN0ZW4oKTsKICAgIH0sICJlcnJvciIpOwogICAgdHguYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLCBjb21wbGV0ZSk7CiAgICB0eC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsIGVycm9yKTsKICAgIHR4LmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IiwgZXJyb3IpOwogIH0pOwogIHRyYW5zYWN0aW9uRG9uZU1hcC5zZXQodHgsIGRvbmUpOwp9Cl9fbmFtZShjYWNoZURvbmVQcm9taXNlRm9yVHJhbnNhY3Rpb24sICJjYWNoZURvbmVQcm9taXNlRm9yVHJhbnNhY3Rpb24iKTsKdmFyIGlkYlByb3h5VHJhcHMgPSB7CiAgZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpIHsKICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBJREJUcmFuc2FjdGlvbikgewogICAgICBpZiAocHJvcCA9PT0gImRvbmUiKQogICAgICAgIHJldHVybiB0cmFuc2FjdGlvbkRvbmVNYXAuZ2V0KHRhcmdldCk7CiAgICAgIGlmIChwcm9wID09PSAic3RvcmUiKSB7CiAgICAgICAgcmV0dXJuIHJlY2VpdmVyLm9iamVjdFN0b3JlTmFtZXNbMV0gPyB2b2lkIDAgOiByZWNlaXZlci5vYmplY3RTdG9yZShyZWNlaXZlci5vYmplY3RTdG9yZU5hbWVzWzBdKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHdyYXAodGFyZ2V0W3Byb3BdKTsKICB9LAogIHNldCh0YXJnZXQsIHByb3AsIHZhbHVlMikgewogICAgdGFyZ2V0W3Byb3BdID0gdmFsdWUyOwogICAgcmV0dXJuIHRydWU7CiAgfSwKICBoYXModGFyZ2V0LCBwcm9wKSB7CiAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgSURCVHJhbnNhY3Rpb24gJiYgKHByb3AgPT09ICJkb25lIiB8fCBwcm9wID09PSAic3RvcmUiKSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBwcm9wIGluIHRhcmdldDsKICB9Cn07CmZ1bmN0aW9uIHJlcGxhY2VUcmFwcyhjYWxsYmFjaykgewogIGlkYlByb3h5VHJhcHMgPSBjYWxsYmFjayhpZGJQcm94eVRyYXBzKTsKfQpfX25hbWUocmVwbGFjZVRyYXBzLCAicmVwbGFjZVRyYXBzIik7CmZ1bmN0aW9uIHdyYXBGdW5jdGlvbihmdW5jKSB7CiAgaWYgKGdldEN1cnNvckFkdmFuY2VNZXRob2RzKCkuaW5jbHVkZXMoZnVuYykpIHsKICAgIHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7CiAgICAgIGZ1bmMuYXBwbHkodW53cmFwKHRoaXMpLCBhcmdzKTsKICAgICAgcmV0dXJuIHdyYXAodGhpcy5yZXF1ZXN0KTsKICAgIH07CiAgfQogIHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7CiAgICByZXR1cm4gd3JhcChmdW5jLmFwcGx5KHVud3JhcCh0aGlzKSwgYXJncykpOwogIH07Cn0KX19uYW1lKHdyYXBGdW5jdGlvbiwgIndyYXBGdW5jdGlvbiIpOwpmdW5jdGlvbiB0cmFuc2Zvcm1DYWNoYWJsZVZhbHVlKHZhbHVlMikgewogIGlmICh0eXBlb2YgdmFsdWUyID09PSAiZnVuY3Rpb24iKQogICAgcmV0dXJuIHdyYXBGdW5jdGlvbih2YWx1ZTIpOwogIGlmICh2YWx1ZTIgaW5zdGFuY2VvZiBJREJUcmFuc2FjdGlvbikKICAgIGNhY2hlRG9uZVByb21pc2VGb3JUcmFuc2FjdGlvbih2YWx1ZTIpOwogIGlmIChpbnN0YW5jZU9mQW55KHZhbHVlMiwgZ2V0SWRiUHJveHlhYmxlVHlwZXMoKSkpCiAgICByZXR1cm4gbmV3IFByb3h5KHZhbHVlMiwgaWRiUHJveHlUcmFwcyk7CiAgcmV0dXJuIHZhbHVlMjsKfQpfX25hbWUodHJhbnNmb3JtQ2FjaGFibGVWYWx1ZSwgInRyYW5zZm9ybUNhY2hhYmxlVmFsdWUiKTsKZnVuY3Rpb24gd3JhcCh2YWx1ZTIpIHsKICBpZiAodmFsdWUyIGluc3RhbmNlb2YgSURCUmVxdWVzdCkKICAgIHJldHVybiBwcm9taXNpZnlSZXF1ZXN0KHZhbHVlMik7CiAgaWYgKHRyYW5zZm9ybUNhY2hlLmhhcyh2YWx1ZTIpKQogICAgcmV0dXJuIHRyYW5zZm9ybUNhY2hlLmdldCh2YWx1ZTIpOwogIGNvbnN0IG5ld1ZhbHVlID0gdHJhbnNmb3JtQ2FjaGFibGVWYWx1ZSh2YWx1ZTIpOwogIGlmIChuZXdWYWx1ZSAhPT0gdmFsdWUyKSB7CiAgICB0cmFuc2Zvcm1DYWNoZS5zZXQodmFsdWUyLCBuZXdWYWx1ZSk7CiAgICByZXZlcnNlVHJhbnNmb3JtQ2FjaGUuc2V0KG5ld1ZhbHVlLCB2YWx1ZTIpOwogIH0KICByZXR1cm4gbmV3VmFsdWU7Cn0KX19uYW1lKHdyYXAsICJ3cmFwIik7CnZhciB1bndyYXAgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh2YWx1ZTIpID0+IHJldmVyc2VUcmFuc2Zvcm1DYWNoZS5nZXQodmFsdWUyKSwgInVud3JhcCIpOwpmdW5jdGlvbiBvcGVuREIobmFtZSwgdmVyc2lvbjIsIHsgYmxvY2tlZCwgdXBncmFkZSwgYmxvY2tpbmcsIHRlcm1pbmF0ZWQgfSA9IHt9KSB7CiAgY29uc3QgcmVxdWVzdCA9IGluZGV4ZWREQi5vcGVuKG5hbWUsIHZlcnNpb24yKTsKICBjb25zdCBvcGVuUHJvbWlzZSA9IHdyYXAocmVxdWVzdCk7CiAgaWYgKHVwZ3JhZGUpIHsKICAgIHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcigidXBncmFkZW5lZWRlZCIsIChldmVudCkgPT4gewogICAgICB1cGdyYWRlKHdyYXAocmVxdWVzdC5yZXN1bHQpLCBldmVudC5vbGRWZXJzaW9uLCBldmVudC5uZXdWZXJzaW9uLCB3cmFwKHJlcXVlc3QudHJhbnNhY3Rpb24pLCBldmVudCk7CiAgICB9KTsKICB9CiAgaWYgKGJsb2NrZWQpIHsKICAgIHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcigiYmxvY2tlZCIsIChldmVudCkgPT4gYmxvY2tlZCgKICAgICAgLy8gQ2FzdGluZyBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0LURPTS1saWItZ2VuZXJhdG9yL3B1bGwvMTQwNQogICAgICBldmVudC5vbGRWZXJzaW9uLAogICAgICBldmVudC5uZXdWZXJzaW9uLAogICAgICBldmVudAogICAgKSk7CiAgfQogIG9wZW5Qcm9taXNlLnRoZW4oKGRiKSA9PiB7CiAgICBpZiAodGVybWluYXRlZCkKICAgICAgZGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xvc2UiLCAoKSA9PiB0ZXJtaW5hdGVkKCkpOwogICAgaWYgKGJsb2NraW5nKSB7CiAgICAgIGRiLmFkZEV2ZW50TGlzdGVuZXIoInZlcnNpb25jaGFuZ2UiLCAoZXZlbnQpID0+IGJsb2NraW5nKGV2ZW50Lm9sZFZlcnNpb24sIGV2ZW50Lm5ld1ZlcnNpb24sIGV2ZW50KSk7CiAgICB9CiAgfSkuY2F0Y2goKCkgPT4gewogIH0pOwogIHJldHVybiBvcGVuUHJvbWlzZTsKfQpfX25hbWUob3BlbkRCLCAib3BlbkRCIik7CmZ1bmN0aW9uIGRlbGV0ZURCKG5hbWUsIHsgYmxvY2tlZCB9ID0ge30pIHsKICBjb25zdCByZXF1ZXN0ID0gaW5kZXhlZERCLmRlbGV0ZURhdGFiYXNlKG5hbWUpOwogIGlmIChibG9ja2VkKSB7CiAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoImJsb2NrZWQiLCAoZXZlbnQpID0+IGJsb2NrZWQoCiAgICAgIC8vIENhc3RpbmcgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC1ET00tbGliLWdlbmVyYXRvci9wdWxsLzE0MDUKICAgICAgZXZlbnQub2xkVmVyc2lvbiwKICAgICAgZXZlbnQKICAgICkpOwogIH0KICByZXR1cm4gd3JhcChyZXF1ZXN0KS50aGVuKCgpID0+IHZvaWQgMCk7Cn0KX19uYW1lKGRlbGV0ZURCLCAiZGVsZXRlREIiKTsKdmFyIHJlYWRNZXRob2RzID0gWyJnZXQiLCAiZ2V0S2V5IiwgImdldEFsbCIsICJnZXRBbGxLZXlzIiwgImNvdW50Il07CnZhciB3cml0ZU1ldGhvZHMgPSBbInB1dCIsICJhZGQiLCAiZGVsZXRlIiwgImNsZWFyIl07CnZhciBjYWNoZWRNZXRob2RzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKZnVuY3Rpb24gZ2V0TWV0aG9kKHRhcmdldCwgcHJvcCkgewogIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIElEQkRhdGFiYXNlICYmICEocHJvcCBpbiB0YXJnZXQpICYmIHR5cGVvZiBwcm9wID09PSAic3RyaW5nIikpIHsKICAgIHJldHVybjsKICB9CiAgaWYgKGNhY2hlZE1ldGhvZHMuZ2V0KHByb3ApKQogICAgcmV0dXJuIGNhY2hlZE1ldGhvZHMuZ2V0KHByb3ApOwogIGNvbnN0IHRhcmdldEZ1bmNOYW1lID0gcHJvcC5yZXBsYWNlKC9Gcm9tSW5kZXgkLywgIiIpOwogIGNvbnN0IHVzZUluZGV4ID0gcHJvcCAhPT0gdGFyZ2V0RnVuY05hbWU7CiAgY29uc3QgaXNXcml0ZSA9IHdyaXRlTWV0aG9kcy5pbmNsdWRlcyh0YXJnZXRGdW5jTmFtZSk7CiAgaWYgKAogICAgLy8gQmFpbCBpZiB0aGUgdGFyZ2V0IGRvZXNuJ3QgZXhpc3Qgb24gdGhlIHRhcmdldC4gRWcsIGdldEFsbCBpc24ndCBpbiBFZGdlLgogICAgISh0YXJnZXRGdW5jTmFtZSBpbiAodXNlSW5kZXggPyBJREJJbmRleCA6IElEQk9iamVjdFN0b3JlKS5wcm90b3R5cGUpIHx8ICEoaXNXcml0ZSB8fCByZWFkTWV0aG9kcy5pbmNsdWRlcyh0YXJnZXRGdW5jTmFtZSkpCiAgKSB7CiAgICByZXR1cm47CiAgfQogIGNvbnN0IG1ldGhvZCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoYXN5bmMgZnVuY3Rpb24oc3RvcmVOYW1lLCAuLi5hcmdzKSB7CiAgICBjb25zdCB0eCA9IHRoaXMudHJhbnNhY3Rpb24oc3RvcmVOYW1lLCBpc1dyaXRlID8gInJlYWR3cml0ZSIgOiAicmVhZG9ubHkiKTsKICAgIGxldCB0YXJnZXQyID0gdHguc3RvcmU7CiAgICBpZiAodXNlSW5kZXgpCiAgICAgIHRhcmdldDIgPSB0YXJnZXQyLmluZGV4KGFyZ3Muc2hpZnQoKSk7CiAgICByZXR1cm4gKGF3YWl0IFByb21pc2UuYWxsKFsKICAgICAgdGFyZ2V0Mlt0YXJnZXRGdW5jTmFtZV0oLi4uYXJncyksCiAgICAgIGlzV3JpdGUgJiYgdHguZG9uZQogICAgXSkpWzBdOwogIH0sICJtZXRob2QiKTsKICBjYWNoZWRNZXRob2RzLnNldChwcm9wLCBtZXRob2QpOwogIHJldHVybiBtZXRob2Q7Cn0KX19uYW1lKGdldE1ldGhvZCwgImdldE1ldGhvZCIpOwpyZXBsYWNlVHJhcHMoKG9sZFRyYXBzKSA9PiAoewogIC4uLm9sZFRyYXBzLAogIGdldDogLyogQF9fUFVSRV9fICovIF9fbmFtZSgodGFyZ2V0LCBwcm9wLCByZWNlaXZlcikgPT4gZ2V0TWV0aG9kKHRhcmdldCwgcHJvcCkgfHwgb2xkVHJhcHMuZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpLCAiZ2V0IiksCiAgaGFzOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh0YXJnZXQsIHByb3ApID0+ICEhZ2V0TWV0aG9kKHRhcmdldCwgcHJvcCkgfHwgb2xkVHJhcHMuaGFzKHRhcmdldCwgcHJvcCksICJoYXMiKQp9KSk7CnZhciBhZHZhbmNlTWV0aG9kUHJvcHMgPSBbImNvbnRpbnVlIiwgImNvbnRpbnVlUHJpbWFyeUtleSIsICJhZHZhbmNlIl07CnZhciBtZXRob2RNYXAgPSB7fTsKdmFyIGFkdmFuY2VSZXN1bHRzID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7CnZhciBpdHRyUHJveGllZEN1cnNvclRvT3JpZ2luYWxQcm94eSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpOwp2YXIgY3Vyc29ySXRlcmF0b3JUcmFwcyA9IHsKICBnZXQodGFyZ2V0LCBwcm9wKSB7CiAgICBpZiAoIWFkdmFuY2VNZXRob2RQcm9wcy5pbmNsdWRlcyhwcm9wKSkKICAgICAgcmV0dXJuIHRhcmdldFtwcm9wXTsKICAgIGxldCBjYWNoZWRGdW5jID0gbWV0aG9kTWFwW3Byb3BdOwogICAgaWYgKCFjYWNoZWRGdW5jKSB7CiAgICAgIGNhY2hlZEZ1bmMgPSBtZXRob2RNYXBbcHJvcF0gPSBmdW5jdGlvbiguLi5hcmdzKSB7CiAgICAgICAgYWR2YW5jZVJlc3VsdHMuc2V0KHRoaXMsIGl0dHJQcm94aWVkQ3Vyc29yVG9PcmlnaW5hbFByb3h5LmdldCh0aGlzKVtwcm9wXSguLi5hcmdzKSk7CiAgICAgIH07CiAgICB9CiAgICByZXR1cm4gY2FjaGVkRnVuYzsKICB9Cn07CmFzeW5jIGZ1bmN0aW9uKiBpdGVyYXRlKC4uLmFyZ3MpIHsKICBsZXQgY3Vyc29yID0gdGhpczsKICBpZiAoIShjdXJzb3IgaW5zdGFuY2VvZiBJREJDdXJzb3IpKSB7CiAgICBjdXJzb3IgPSBhd2FpdCBjdXJzb3Iub3BlbkN1cnNvciguLi5hcmdzKTsKICB9CiAgaWYgKCFjdXJzb3IpCiAgICByZXR1cm47CiAgY3Vyc29yID0gY3Vyc29yOwogIGNvbnN0IHByb3hpZWRDdXJzb3IgPSBuZXcgUHJveHkoY3Vyc29yLCBjdXJzb3JJdGVyYXRvclRyYXBzKTsKICBpdHRyUHJveGllZEN1cnNvclRvT3JpZ2luYWxQcm94eS5zZXQocHJveGllZEN1cnNvciwgY3Vyc29yKTsKICByZXZlcnNlVHJhbnNmb3JtQ2FjaGUuc2V0KHByb3hpZWRDdXJzb3IsIHVud3JhcChjdXJzb3IpKTsKICB3aGlsZSAoY3Vyc29yKSB7CiAgICB5aWVsZCBwcm94aWVkQ3Vyc29yOwogICAgY3Vyc29yID0gYXdhaXQgKGFkdmFuY2VSZXN1bHRzLmdldChwcm94aWVkQ3Vyc29yKSB8fCBjdXJzb3IuY29udGludWUoKSk7CiAgICBhZHZhbmNlUmVzdWx0cy5kZWxldGUocHJveGllZEN1cnNvcik7CiAgfQp9Cl9fbmFtZShpdGVyYXRlLCAiaXRlcmF0ZSIpOwpmdW5jdGlvbiBpc0l0ZXJhdG9yUHJvcCh0YXJnZXQsIHByb3ApIHsKICByZXR1cm4gcHJvcCA9PT0gU3ltYm9sLmFzeW5jSXRlcmF0b3IgJiYgaW5zdGFuY2VPZkFueSh0YXJnZXQsIFtJREJJbmRleCwgSURCT2JqZWN0U3RvcmUsIElEQkN1cnNvcl0pIHx8IHByb3AgPT09ICJpdGVyYXRlIiAmJiBpbnN0YW5jZU9mQW55KHRhcmdldCwgW0lEQkluZGV4LCBJREJPYmplY3RTdG9yZV0pOwp9Cl9fbmFtZShpc0l0ZXJhdG9yUHJvcCwgImlzSXRlcmF0b3JQcm9wIik7CnJlcGxhY2VUcmFwcygob2xkVHJhcHMpID0+ICh7CiAgLi4ub2xkVHJhcHMsCiAgZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpIHsKICAgIGlmIChpc0l0ZXJhdG9yUHJvcCh0YXJnZXQsIHByb3ApKQogICAgICByZXR1cm4gaXRlcmF0ZTsKICAgIHJldHVybiBvbGRUcmFwcy5nZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcik7CiAgfSwKICBoYXModGFyZ2V0LCBwcm9wKSB7CiAgICByZXR1cm4gaXNJdGVyYXRvclByb3AodGFyZ2V0LCBwcm9wKSB8fCBvbGRUcmFwcy5oYXModGFyZ2V0LCBwcm9wKTsKICB9Cn0pKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJzdG9yZUAyLjAuMjEvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnN0b3JlL2Rpc3RfdHMvd2Vic3RvcmUuY2xhc3Nlcy53ZWJzdG9yZS5qcwp2YXIgV2ViU3RvcmUgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiV2ViU3RvcmUiKTsKICB9CiAgY29uc3RydWN0b3Iob3B0aW9uc0FyZykgewogICAgdGhpcy5pbml0Q2FsbGVkID0gZmFsc2U7CiAgICB0aGlzLnJlYWR5RGVmZXJyZWQgPSBkaXN0X3RzX2V4cG9ydHMuZGVmZXIoKTsKICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNBcmc7CiAgfQogIGFzeW5jIGluaXQoKSB7CiAgICBpZiAodGhpcy5pbml0Q2FsbGVkKSB7CiAgICAgIGF3YWl0IHRoaXMucmVhZHlEZWZlcnJlZC5wcm9taXNlOwogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLmluaXRDYWxsZWQgPSB0cnVlOwogICAgY29uc3Qgc21hcnRlbnYgPSBuZXcgZGlzdF90c19leHBvcnRzMTAuU21hcnRlbnYoKTsKICAgIGlmICghc21hcnRlbnYuaXNCcm93c2VyICYmICFnbG9iYWxUaGlzLmluZGV4ZWREQikgewogICAgICBjb25zb2xlLmxvZygiaGV5Iik7CiAgICAgIGNvbnNvbGUubG9nKGdsb2JhbFRoaXMuaW5kZXhlZERCKTsKICAgICAgYXdhaXQgc21hcnRlbnYuZ2V0U2FmZU5vZGVNb2R1bGUoImZha2UtaW5kZXhlZGRiL2F1dG8iKTsKICAgICAgaWYgKCFnbG9iYWxUaGlzLmluZGV4ZWREQikgewogICAgICAgIGNvbnN0IG1vZCA9IGF3YWl0IHNtYXJ0ZW52LmdldFNhZmVOb2RlTW9kdWxlKCJmYWtlLWluZGV4ZWRkYiIpOwogICAgICAgIGdsb2JhbFRoaXMuaW5kZXhlZERCID0gbmV3IG1vZC5JREJGYWN0b3J5KCk7CiAgICAgIH0KICAgIH0KICAgIHRoaXMuZGIgPSBhd2FpdCBidWlsZF9leHBvcnRzLm9wZW5EQih0aGlzLm9wdGlvbnMuZGJOYW1lLCAxLCB7CiAgICAgIHVwZ3JhZGU6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGRiKSA9PiB7CiAgICAgICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUodGhpcy5vcHRpb25zLnN0b3JlTmFtZSk7CiAgICAgIH0sICJ1cGdyYWRlIikKICAgIH0pOwogICAgdGhpcy5yZWFkeURlZmVycmVkLnJlc29sdmUoKTsKICAgIHJldHVybjsKICB9CiAgYXN5bmMgZ2V0KGtleTIpIHsKICAgIGF3YWl0IHRoaXMuaW5pdCgpOwogICAgcmV0dXJuIHRoaXMuZGIuZ2V0KHRoaXMub3B0aW9ucy5zdG9yZU5hbWUsIGtleTIpOwogIH0KICBhc3luYyBjaGVjayhrZXlBcmcpIHsKICAgIGF3YWl0IHRoaXMuaW5pdCgpOwogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXQoa2V5QXJnKTsKICAgIHJldHVybiAhIXJlc3VsdDsKICB9CiAgYXN5bmMgc2V0KGtleTIsIHZhbCkgewogICAgYXdhaXQgdGhpcy5pbml0KCk7CiAgICByZXR1cm4gdGhpcy5kYi5wdXQodGhpcy5vcHRpb25zLnN0b3JlTmFtZSwgdmFsLCBrZXkyKTsKICB9CiAgYXN5bmMgZGVsZXRlKGtleTIpIHsKICAgIGF3YWl0IHRoaXMuaW5pdCgpOwogICAgcmV0dXJuIHRoaXMuZGIuZGVsZXRlKHRoaXMub3B0aW9ucy5zdG9yZU5hbWUsIGtleTIpOwogIH0KICBhc3luYyBjbGVhcigpIHsKICAgIGF3YWl0IHRoaXMuaW5pdCgpOwogICAgcmV0dXJuIHRoaXMuZGIuY2xlYXIodGhpcy5vcHRpb25zLnN0b3JlTmFtZSk7CiAgfQogIGFzeW5jIGtleXMoKSB7CiAgICBhd2FpdCB0aGlzLmluaXQoKTsKICAgIHJldHVybiB0aGlzLmRiLmdldEFsbEtleXModGhpcy5vcHRpb25zLnN0b3JlTmFtZSk7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnN0b3JlQDIuMC4yMS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2Vic3RvcmUvZGlzdF90cy93ZWJzdG9yZS5jbGFzc2VzLnR5cGVkcmVxdWVzdGNhY2hlLmpzCnZhciBUeXBlZHJlcXVlc3RDYWNoZSA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJUeXBlZHJlcXVlc3RDYWNoZSIpOwogIH0KICBjb25zdHJ1Y3Rvcihkb21haW5BcmcgPSAiZGVmYXVsdCIpIHsKICAgIHRoaXMud2Vic3RvcmUgPSBuZXcgV2ViU3RvcmUoewogICAgICBkYk5hbWU6ICJ0clN0b3JlIiwKICAgICAgc3RvcmVOYW1lOiBgdHJTdG9yZS0ke2RvbWFpbkFyZ31gCiAgICB9KTsKICB9CiAgYnVpbGRLZXkocmVxdWVzdEFyZykgewogICAgcmV0dXJuIGRpc3RfdHNfZXhwb3J0czEyLnN0cmluZ2lmeSh7CiAgICAgIG1ldGhvZDogcmVxdWVzdEFyZy5tZXRob2QsCiAgICAgIHJlcXVlc3Q6IHJlcXVlc3RBcmcucmVxdWVzdAogICAgfSk7CiAgfQogIC8qKgogICAqIHN0b3JlcyBieSByZXF1ZXN0CiAgICogQHBhcmFtIHR5cGVkcmVxdWVzdGFyZwogICAqLwogIGFzeW5jIHNldEJ5UmVxdWVzdCh0eXBlZHJlcXVlc3RBcmcpIHsKICAgIGlmICghdHlwZWRyZXF1ZXN0QXJnLnJlc3BvbnNlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiWW91IGNhbm5vdCBzdG9yZSByZXF1ZXN0cyB3aXRob3V0IGEgcmVzcG9uc2UgcHJlc2VudCIpOwogICAgfQogICAgYXdhaXQgdGhpcy53ZWJzdG9yZS5zZXQodGhpcy5idWlsZEtleSh0eXBlZHJlcXVlc3RBcmcpLCB0eXBlZHJlcXVlc3RBcmcpOwogIH0KICAvKioKICAgKiBnZXQgYnkgZnVsbCB0eW9lZHJlcXVlc3QgYnkgcGFydGlhbCB0eXBlZHJlcXVlc3QKICAgKiBAcGFyYW0gdHlwZWRyZXF1ZXN0YXJnCiAgICovCiAgYXN5bmMgZ2V0QnlSZXF1ZXN0KHR5cGVkcmVxdWVzdEFyZykgewogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy53ZWJzdG9yZS5nZXQodGhpcy5idWlsZEtleSh0eXBlZHJlcXVlc3RBcmcpKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnJlcXVlc3RANC4wLjUvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnJlcXVlc3QvZGlzdF90cy9jYWNoZS9jYWNoZS5zdG9yZS5qcwp2YXIgQ2FjaGVTdG9yZSA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJDYWNoZVN0b3JlIik7CiAgfQogIGNvbnN0cnVjdG9yKGRiTmFtZSA9ICJ3ZWJyZXF1ZXN0LXY0Iiwgc3RvcmVOYW1lID0gImNhY2hlIikgewogICAgdGhpcy53ZWJzdG9yZSA9IG5ldyBkaXN0X3RzX2V4cG9ydHMxMy5XZWJTdG9yZSh7CiAgICAgIGRiTmFtZSwKICAgICAgc3RvcmVOYW1lCiAgICB9KTsKICAgIHRoaXMuaW5pdFByb21pc2UgPSB0aGlzLmluaXQoKTsKICB9CiAgLyoqCiAgICogSW5pdGlhbGl6ZSB0aGUgc3RvcmUKICAgKi8KICBhc3luYyBpbml0KCkgewogIH0KICAvKioKICAgKiBHZW5lcmF0ZSBhIGNhY2hlIGtleSBmcm9tIGEgcmVxdWVzdAogICAqLwogIGdlbmVyYXRlQ2FjaGVLZXkocmVxdWVzdCkgewogICAgY29uc3QgdXJsID0gcmVxdWVzdC51cmw7CiAgICBjb25zdCBtZXRob2QgPSByZXF1ZXN0Lm1ldGhvZDsKICAgIGlmIChtZXRob2QgPT09ICJHRVQiKSB7CiAgICAgIHJldHVybiB1cmw7CiAgICB9CiAgICByZXR1cm4gYCR7bWV0aG9kfToke3VybH1gOwogIH0KICAvKioKICAgKiBTdG9yZSBhIHJlc3BvbnNlIGluIHRoZSBjYWNoZQogICAqLwogIGFzeW5jIHNldChjYWNoZUtleSwgZW50cnkpIHsKICAgIGF3YWl0IHRoaXMuaW5pdFByb21pc2U7CiAgICBhd2FpdCB0aGlzLndlYnN0b3JlLnNldChjYWNoZUtleSwgZW50cnkpOwogIH0KICAvKioKICAgKiBSZXRyaWV2ZSBhIGNhY2hlZCByZXNwb25zZQogICAqLwogIGFzeW5jIGdldChjYWNoZUtleSkgewogICAgYXdhaXQgdGhpcy5pbml0UHJvbWlzZTsKICAgIHRyeSB7CiAgICAgIGNvbnN0IGVudHJ5ID0gYXdhaXQgdGhpcy53ZWJzdG9yZS5nZXQoY2FjaGVLZXkpOwogICAgICByZXR1cm4gZW50cnkgfHwgbnVsbDsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KICAvKioKICAgKiBDaGVjayBpZiBhIGNhY2hlIGVudHJ5IGV4aXN0cwogICAqLwogIGFzeW5jIGhhcyhjYWNoZUtleSkgewogICAgYXdhaXQgdGhpcy5pbml0UHJvbWlzZTsKICAgIHJldHVybiBhd2FpdCB0aGlzLndlYnN0b3JlLmNoZWNrKGNhY2hlS2V5KTsKICB9CiAgLyoqCiAgICogRGVsZXRlIGEgY2FjaGUgZW50cnkKICAgKi8KICBhc3luYyBkZWxldGUoY2FjaGVLZXkpIHsKICAgIGF3YWl0IHRoaXMuaW5pdFByb21pc2U7CiAgICBhd2FpdCB0aGlzLndlYnN0b3JlLmRlbGV0ZShjYWNoZUtleSk7CiAgfQogIC8qKgogICAqIENsZWFyIGFsbCBjYWNoZSBlbnRyaWVzCiAgICovCiAgYXN5bmMgY2xlYXIoKSB7CiAgICBhd2FpdCB0aGlzLmluaXRQcm9taXNlOwogICAgYXdhaXQgdGhpcy53ZWJzdG9yZS5jbGVhcigpOwogIH0KICAvKioKICAgKiBDcmVhdGUgYSBSZXNwb25zZSBvYmplY3QgZnJvbSBhIGNhY2hlIGVudHJ5CiAgICovCiAgcmVzcG9uc2VGcm9tQ2FjaGVFbnRyeShlbnRyeSkgewogICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKGVudHJ5LmhlYWRlcnMpOwogICAgcmV0dXJuIG5ldyBSZXNwb25zZShlbnRyeS5yZXNwb25zZSwgewogICAgICBzdGF0dXM6IGVudHJ5LnN0YXR1cywKICAgICAgc3RhdHVzVGV4dDogZW50cnkuc3RhdHVzVGV4dCwKICAgICAgaGVhZGVycwogICAgfSk7CiAgfQogIC8qKgogICAqIENyZWF0ZSBhIGNhY2hlIGVudHJ5IGZyb20gYSBSZXNwb25zZSBvYmplY3QKICAgKi8KICBhc3luYyBjYWNoZUVudHJ5RnJvbVJlc3BvbnNlKHVybCwgcmVzcG9uc2UsIG1ldGFkYXRhKSB7CiAgICBjb25zdCBjbG9uZWRSZXNwb25zZSA9IHJlc3BvbnNlLmNsb25lKCk7CiAgICBjb25zdCBidWZmZXIyID0gYXdhaXQgY2xvbmVkUmVzcG9uc2UuYXJyYXlCdWZmZXIoKTsKICAgIGNvbnN0IGhlYWRlcnMgPSB7fTsKICAgIGNsb25lZFJlc3BvbnNlLmhlYWRlcnMuZm9yRWFjaCgodmFsdWUyLCBrZXkyKSA9PiB7CiAgICAgIGhlYWRlcnNba2V5Ml0gPSB2YWx1ZTI7CiAgICB9KTsKICAgIHJldHVybiB7CiAgICAgIHJlc3BvbnNlOiBidWZmZXIyLAogICAgICBoZWFkZXJzLAogICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksCiAgICAgIGV0YWc6IG1ldGFkYXRhPy5ldGFnIHx8IGNsb25lZFJlc3BvbnNlLmhlYWRlcnMuZ2V0KCJldGFnIikgfHwgdm9pZCAwLAogICAgICBsYXN0TW9kaWZpZWQ6IG1ldGFkYXRhPy5sYXN0TW9kaWZpZWQgfHwgY2xvbmVkUmVzcG9uc2UuaGVhZGVycy5nZXQoImxhc3QtbW9kaWZpZWQiKSB8fCB2b2lkIDAsCiAgICAgIG1heEFnZTogbWV0YWRhdGE/Lm1heEFnZSwKICAgICAgdXJsLAogICAgICBzdGF0dXM6IGNsb25lZFJlc3BvbnNlLnN0YXR1cywKICAgICAgc3RhdHVzVGV4dDogY2xvbmVkUmVzcG9uc2Uuc3RhdHVzVGV4dAogICAgfTsKICB9CiAgLyoqCiAgICogUHJ1bmUgZXhwaXJlZCBlbnRyaWVzIChnYXJiYWdlIGNvbGxlY3Rpb24pCiAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgZGVsZXRlZAogICAqLwogIGFzeW5jIHBydW5lRXhwaXJlZCgpIHsKICAgIGF3YWl0IHRoaXMuaW5pdFByb21pc2U7CiAgICByZXR1cm4gMDsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrd2VicmVxdWVzdEA0LjAuNS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2VicmVxdWVzdC9kaXN0X3RzL2NhY2hlL2NhY2hlLmhlYWRlcnMuanMKZnVuY3Rpb24gcGFyc2VDYWNoZUNvbnRyb2woY2FjaGVDb250cm9sSGVhZGVyKSB7CiAgY29uc3QgbWV0YWRhdGEgPSB7CiAgICBtYXhBZ2U6IDAsCiAgICBpbW11dGFibGU6IGZhbHNlLAogICAgbm9DYWNoZTogZmFsc2UsCiAgICBub1N0b3JlOiBmYWxzZSwKICAgIG11c3RSZXZhbGlkYXRlOiBmYWxzZQogIH07CiAgaWYgKCFjYWNoZUNvbnRyb2xIZWFkZXIpIHsKICAgIHJldHVybiBtZXRhZGF0YTsKICB9CiAgY29uc3QgZGlyZWN0aXZlcyA9IGNhY2hlQ29udHJvbEhlYWRlci50b0xvd2VyQ2FzZSgpLnNwbGl0KCIsIikubWFwKChkNCkgPT4gZDQudHJpbSgpKTsKICBmb3IgKGNvbnN0IGRpcmVjdGl2ZSBvZiBkaXJlY3RpdmVzKSB7CiAgICBpZiAoZGlyZWN0aXZlID09PSAibm8tY2FjaGUiKSB7CiAgICAgIG1ldGFkYXRhLm5vQ2FjaGUgPSB0cnVlOwogICAgfSBlbHNlIGlmIChkaXJlY3RpdmUgPT09ICJuby1zdG9yZSIpIHsKICAgICAgbWV0YWRhdGEubm9TdG9yZSA9IHRydWU7CiAgICB9IGVsc2UgaWYgKGRpcmVjdGl2ZSA9PT0gImltbXV0YWJsZSIpIHsKICAgICAgbWV0YWRhdGEuaW1tdXRhYmxlID0gdHJ1ZTsKICAgIH0gZWxzZSBpZiAoZGlyZWN0aXZlID09PSAibXVzdC1yZXZhbGlkYXRlIikgewogICAgICBtZXRhZGF0YS5tdXN0UmV2YWxpZGF0ZSA9IHRydWU7CiAgICB9IGVsc2UgaWYgKGRpcmVjdGl2ZS5zdGFydHNXaXRoKCJtYXgtYWdlPSIpKSB7CiAgICAgIGNvbnN0IG1heEFnZSA9IHBhcnNlSW50KGRpcmVjdGl2ZS5zcGxpdCgiPSIpWzFdLCAxMCk7CiAgICAgIGlmICghaXNOYU4obWF4QWdlKSkgewogICAgICAgIG1ldGFkYXRhLm1heEFnZSA9IG1heEFnZSAqIDFlMzsKICAgICAgfQogICAgfQogIH0KICByZXR1cm4gbWV0YWRhdGE7Cn0KX19uYW1lKHBhcnNlQ2FjaGVDb250cm9sLCAicGFyc2VDYWNoZUNvbnRyb2wiKTsKZnVuY3Rpb24gcGFyc2VFeHBpcmVzKGV4cGlyZXNIZWFkZXIpIHsKICBpZiAoIWV4cGlyZXNIZWFkZXIpIHsKICAgIHJldHVybiB2b2lkIDA7CiAgfQogIHRyeSB7CiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoZXhwaXJlc0hlYWRlcik7CiAgICByZXR1cm4gZGF0ZS5nZXRUaW1lKCk7CiAgfSBjYXRjaCB7CiAgICByZXR1cm4gdm9pZCAwOwogIH0KfQpfX25hbWUocGFyc2VFeHBpcmVzLCAicGFyc2VFeHBpcmVzIik7CmZ1bmN0aW9uIGV4dHJhY3RDYWNoZU1ldGFkYXRhKGhlYWRlcnMpIHsKICBjb25zdCBjYWNoZUNvbnRyb2wgPSBoZWFkZXJzLmdldCgiY2FjaGUtY29udHJvbCIpOwogIGNvbnN0IGV4cGlyZXMgPSBoZWFkZXJzLmdldCgiZXhwaXJlcyIpOwogIGNvbnN0IGV0YWcgPSBoZWFkZXJzLmdldCgiZXRhZyIpOwogIGNvbnN0IGxhc3RNb2RpZmllZCA9IGhlYWRlcnMuZ2V0KCJsYXN0LW1vZGlmaWVkIik7CiAgY29uc3QgbWV0YWRhdGEgPSBwYXJzZUNhY2hlQ29udHJvbChjYWNoZUNvbnRyb2wpOwogIGlmIChtZXRhZGF0YS5tYXhBZ2UgPT09IDAgJiYgZXhwaXJlcykgewogICAgY29uc3QgZXhwaXJlc1RpbWUgPSBwYXJzZUV4cGlyZXMoZXhwaXJlcyk7CiAgICBpZiAoZXhwaXJlc1RpbWUpIHsKICAgICAgbWV0YWRhdGEubWF4QWdlID0gTWF0aC5tYXgoMCwgZXhwaXJlc1RpbWUgLSBEYXRlLm5vdygpKTsKICAgIH0KICB9CiAgcmV0dXJuIHsKICAgIG1heEFnZTogbWV0YWRhdGEubWF4QWdlIHx8IDAsCiAgICBldGFnOiBldGFnIHx8IHZvaWQgMCwKICAgIGxhc3RNb2RpZmllZDogbGFzdE1vZGlmaWVkIHx8IHZvaWQgMCwKICAgIGltbXV0YWJsZTogbWV0YWRhdGEuaW1tdXRhYmxlIHx8IGZhbHNlLAogICAgbm9DYWNoZTogbWV0YWRhdGEubm9DYWNoZSB8fCBmYWxzZSwKICAgIG5vU3RvcmU6IG1ldGFkYXRhLm5vU3RvcmUgfHwgZmFsc2UsCiAgICBtdXN0UmV2YWxpZGF0ZTogbWV0YWRhdGEubXVzdFJldmFsaWRhdGUgfHwgZmFsc2UKICB9Owp9Cl9fbmFtZShleHRyYWN0Q2FjaGVNZXRhZGF0YSwgImV4dHJhY3RDYWNoZU1ldGFkYXRhIik7CmZ1bmN0aW9uIGlzRnJlc2goY2FjaGVFbnRyeSwgbWV0YWRhdGEpIHsKICBpZiAobWV0YWRhdGEubm9TdG9yZSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBpZiAobWV0YWRhdGEuaW1tdXRhYmxlKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgY29uc3QgYWdlID0gRGF0ZS5ub3coKSAtIGNhY2hlRW50cnkudGltZXN0YW1wOwogIGNvbnN0IG1heEFnZSA9IGNhY2hlRW50cnkubWF4QWdlIHx8IG1ldGFkYXRhLm1heEFnZSB8fCAwOwogIGlmIChtYXhBZ2UgPT09IDApIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgcmV0dXJuIGFnZSA8IG1heEFnZTsKfQpfX25hbWUoaXNGcmVzaCwgImlzRnJlc2giKTsKZnVuY3Rpb24gcmVxdWlyZXNSZXZhbGlkYXRpb24obWV0YWRhdGEpIHsKICByZXR1cm4gbWV0YWRhdGEubm9DYWNoZSB8fCBtZXRhZGF0YS5tdXN0UmV2YWxpZGF0ZTsKfQpfX25hbWUocmVxdWlyZXNSZXZhbGlkYXRpb24sICJyZXF1aXJlc1JldmFsaWRhdGlvbiIpOwpmdW5jdGlvbiBjcmVhdGVDb25kaXRpb25hbEhlYWRlcnMoY2FjaGVFbnRyeSkgewogIGNvbnN0IGhlYWRlcnMgPSB7fTsKICBpZiAoY2FjaGVFbnRyeS5ldGFnKSB7CiAgICBoZWFkZXJzWyJpZi1ub25lLW1hdGNoIl0gPSBjYWNoZUVudHJ5LmV0YWc7CiAgfQogIGlmIChjYWNoZUVudHJ5Lmxhc3RNb2RpZmllZCkgewogICAgaGVhZGVyc1siaWYtbW9kaWZpZWQtc2luY2UiXSA9IGNhY2hlRW50cnkubGFzdE1vZGlmaWVkOwogIH0KICByZXR1cm4gaGVhZGVyczsKfQpfX25hbWUoY3JlYXRlQ29uZGl0aW9uYWxIZWFkZXJzLCAiY3JlYXRlQ29uZGl0aW9uYWxIZWFkZXJzIik7CmZ1bmN0aW9uIGhlYWRlcnNUb09iamVjdChoZWFkZXJzKSB7CiAgY29uc3Qgb2JqID0ge307CiAgaGVhZGVycy5mb3JFYWNoKCh2YWx1ZTIsIGtleTIpID0+IHsKICAgIG9ialtrZXkyXSA9IHZhbHVlMjsKICB9KTsKICByZXR1cm4gb2JqOwp9Cl9fbmFtZShoZWFkZXJzVG9PYmplY3QsICJoZWFkZXJzVG9PYmplY3QiKTsKZnVuY3Rpb24gb2JqZWN0VG9IZWFkZXJzKG9iaikgewogIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycygpOwogIE9iamVjdC5lbnRyaWVzKG9iaikuZm9yRWFjaCgoW2tleTIsIHZhbHVlMl0pID0+IHsKICAgIGhlYWRlcnMuc2V0KGtleTIsIHZhbHVlMik7CiAgfSk7CiAgcmV0dXJuIGhlYWRlcnM7Cn0KX19uYW1lKG9iamVjdFRvSGVhZGVycywgIm9iamVjdFRvSGVhZGVycyIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnJlcXVlc3RANC4wLjUvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnJlcXVlc3QvZGlzdF90cy9jYWNoZS9jYWNoZS5zdHJhdGVnaWVzLmpzCnZhciBOZXR3b3JrRmlyc3RTdHJhdGVneSA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJOZXR3b3JrRmlyc3RTdHJhdGVneSIpOwogIH0KICBhc3luYyBleGVjdXRlKGNvbnRleHQyKSB7CiAgICB0cnkgewogICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNvbnRleHQyLmZldGNoRm4oY29udGV4dDIucmVxdWVzdCk7CiAgICAgIGlmIChyZXNwb25zZS5vaykgewogICAgICAgIGF3YWl0IHRoaXMuY2FjaGVSZXNwb25zZShjb250ZXh0MiwgcmVzcG9uc2UpOwogICAgICB9CiAgICAgIHJldHVybiB7CiAgICAgICAgcmVzcG9uc2UsCiAgICAgICAgZnJvbUNhY2hlOiBmYWxzZSwKICAgICAgICByZXZhbGlkYXRlZDogZmFsc2UKICAgICAgfTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGlmIChjb250ZXh0Mi5sb2dnaW5nKSB7CiAgICAgICAgY29uc29sZS5sb2coIlt3ZWJyZXF1ZXN0XSBOZXR3b3JrIGZhaWxlZCwgdHJ5aW5nIGNhY2hlOiIsIGVycm9yKTsKICAgICAgfQogICAgICBjb25zdCBjYWNoZWRFbnRyeSA9IGF3YWl0IGNvbnRleHQyLmNhY2hlU3RvcmUuZ2V0KGNvbnRleHQyLmNhY2hlS2V5KTsKICAgICAgaWYgKGNhY2hlZEVudHJ5KSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHJlc3BvbnNlOiBjb250ZXh0Mi5jYWNoZVN0b3JlLnJlc3BvbnNlRnJvbUNhY2hlRW50cnkoY2FjaGVkRW50cnkpLAogICAgICAgICAgZnJvbUNhY2hlOiB0cnVlLAogICAgICAgICAgcmV2YWxpZGF0ZWQ6IGZhbHNlCiAgICAgICAgfTsKICAgICAgfQogICAgICB0aHJvdyBlcnJvcjsKICAgIH0KICB9CiAgYXN5bmMgY2FjaGVSZXNwb25zZShjb250ZXh0MiwgcmVzcG9uc2UpIHsKICAgIGNvbnN0IG1ldGFkYXRhID0gZXh0cmFjdENhY2hlTWV0YWRhdGEocmVzcG9uc2UuaGVhZGVycyk7CiAgICBpZiAobWV0YWRhdGEubm9TdG9yZSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBlbnRyeSA9IGF3YWl0IGNvbnRleHQyLmNhY2hlU3RvcmUuY2FjaGVFbnRyeUZyb21SZXNwb25zZShjb250ZXh0Mi5yZXF1ZXN0LnVybCwgcmVzcG9uc2UsIG1ldGFkYXRhKTsKICAgIGF3YWl0IGNvbnRleHQyLmNhY2hlU3RvcmUuc2V0KGNvbnRleHQyLmNhY2hlS2V5LCBlbnRyeSk7CiAgfQp9Owp2YXIgQ2FjaGVGaXJzdFN0cmF0ZWd5ID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkNhY2hlRmlyc3RTdHJhdGVneSIpOwogIH0KICBhc3luYyBleGVjdXRlKGNvbnRleHQyKSB7CiAgICBjb25zdCBjYWNoZWRFbnRyeSA9IGF3YWl0IGNvbnRleHQyLmNhY2hlU3RvcmUuZ2V0KGNvbnRleHQyLmNhY2hlS2V5KTsKICAgIGlmIChjYWNoZWRFbnRyeSkgewogICAgICBjb25zdCBtZXRhZGF0YTIgPSBleHRyYWN0Q2FjaGVNZXRhZGF0YShuZXcgSGVhZGVycyhjYWNoZWRFbnRyeS5oZWFkZXJzKSk7CiAgICAgIGlmIChpc0ZyZXNoKGNhY2hlZEVudHJ5LCBtZXRhZGF0YTIpKSB7CiAgICAgICAgaWYgKGNvbnRleHQyLmxvZ2dpbmcpIHsKICAgICAgICAgIGNvbnNvbGUubG9nKCJbd2VicmVxdWVzdF0gQ2FjaGUgaGl0IChmcmVzaCk6IiwgY29udGV4dDIucmVxdWVzdC51cmwpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gewogICAgICAgICAgcmVzcG9uc2U6IGNvbnRleHQyLmNhY2hlU3RvcmUucmVzcG9uc2VGcm9tQ2FjaGVFbnRyeShjYWNoZWRFbnRyeSksCiAgICAgICAgICBmcm9tQ2FjaGU6IHRydWUsCiAgICAgICAgICByZXZhbGlkYXRlZDogZmFsc2UKICAgICAgICB9OwogICAgICB9CiAgICAgIGlmIChyZXF1aXJlc1JldmFsaWRhdGlvbihtZXRhZGF0YTIpICYmIChjYWNoZWRFbnRyeS5ldGFnIHx8IGNhY2hlZEVudHJ5Lmxhc3RNb2RpZmllZCkpIHsKICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXZhbGlkYXRlKGNvbnRleHQyLCBjYWNoZWRFbnRyeSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChjb250ZXh0Mi5sb2dnaW5nKSB7CiAgICAgIGNvbnNvbGUubG9nKCJbd2VicmVxdWVzdF0gQ2FjaGUgbWlzcywgZmV0Y2hpbmc6IiwgY29udGV4dDIucmVxdWVzdC51cmwpOwogICAgfQogICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjb250ZXh0Mi5mZXRjaEZuKGNvbnRleHQyLnJlcXVlc3QpOwogICAgY29uc3QgbWV0YWRhdGEgPSBleHRyYWN0Q2FjaGVNZXRhZGF0YShyZXNwb25zZS5oZWFkZXJzKTsKICAgIGlmICghbWV0YWRhdGEubm9TdG9yZSkgewogICAgICBjb25zdCBlbnRyeSA9IGF3YWl0IGNvbnRleHQyLmNhY2hlU3RvcmUuY2FjaGVFbnRyeUZyb21SZXNwb25zZShjb250ZXh0Mi5yZXF1ZXN0LnVybCwgcmVzcG9uc2UsIG1ldGFkYXRhKTsKICAgICAgYXdhaXQgY29udGV4dDIuY2FjaGVTdG9yZS5zZXQoY29udGV4dDIuY2FjaGVLZXksIGVudHJ5KTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIHJlc3BvbnNlLAogICAgICBmcm9tQ2FjaGU6IGZhbHNlLAogICAgICByZXZhbGlkYXRlZDogZmFsc2UKICAgIH07CiAgfQogIGFzeW5jIHJldmFsaWRhdGUoY29udGV4dDIsIGNhY2hlZEVudHJ5KSB7CiAgICBjb25zdCBjb25kaXRpb25hbEhlYWRlcnMgPSBjcmVhdGVDb25kaXRpb25hbEhlYWRlcnMoY2FjaGVkRW50cnkpOwogICAgY29uc3QgcmV2YWxpZGF0ZVJlcXVlc3QgPSBuZXcgUmVxdWVzdChjb250ZXh0Mi5yZXF1ZXN0LnVybCwgewogICAgICBtZXRob2Q6IGNvbnRleHQyLnJlcXVlc3QubWV0aG9kLAogICAgICBoZWFkZXJzOiB7CiAgICAgICAgLi4uaGVhZGVyc1RvT2JqZWN0KGNvbnRleHQyLnJlcXVlc3QuaGVhZGVycyksCiAgICAgICAgLi4uY29uZGl0aW9uYWxIZWFkZXJzCiAgICAgIH0KICAgIH0pOwogICAgdHJ5IHsKICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjb250ZXh0Mi5mZXRjaEZuKHJldmFsaWRhdGVSZXF1ZXN0KTsKICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMzA0KSB7CiAgICAgICAgaWYgKGNvbnRleHQyLmxvZ2dpbmcpIHsKICAgICAgICAgIGNvbnNvbGUubG9nKCJbd2VicmVxdWVzdF0gQ2FjaGUgcmV2YWxpZGF0ZWQgKDMwNCk6IiwgY29udGV4dDIucmVxdWVzdC51cmwpOwogICAgICAgIH0KICAgICAgICBjYWNoZWRFbnRyeS50aW1lc3RhbXAgPSBEYXRlLm5vdygpOwogICAgICAgIGF3YWl0IGNvbnRleHQyLmNhY2hlU3RvcmUuc2V0KGNvbnRleHQyLmNhY2hlS2V5LCBjYWNoZWRFbnRyeSk7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHJlc3BvbnNlOiBjb250ZXh0Mi5jYWNoZVN0b3JlLnJlc3BvbnNlRnJvbUNhY2hlRW50cnkoY2FjaGVkRW50cnkpLAogICAgICAgICAgZnJvbUNhY2hlOiB0cnVlLAogICAgICAgICAgcmV2YWxpZGF0ZWQ6IHRydWUKICAgICAgICB9OwogICAgICB9CiAgICAgIGlmIChyZXNwb25zZS5vaykgewogICAgICAgIGNvbnN0IG1ldGFkYXRhID0gZXh0cmFjdENhY2hlTWV0YWRhdGEocmVzcG9uc2UuaGVhZGVycyk7CiAgICAgICAgaWYgKCFtZXRhZGF0YS5ub1N0b3JlKSB7CiAgICAgICAgICBjb25zdCBlbnRyeSA9IGF3YWl0IGNvbnRleHQyLmNhY2hlU3RvcmUuY2FjaGVFbnRyeUZyb21SZXNwb25zZShjb250ZXh0Mi5yZXF1ZXN0LnVybCwgcmVzcG9uc2UsIG1ldGFkYXRhKTsKICAgICAgICAgIGF3YWl0IGNvbnRleHQyLmNhY2hlU3RvcmUuc2V0KGNvbnRleHQyLmNhY2hlS2V5LCBlbnRyeSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB7CiAgICAgICAgcmVzcG9uc2UsCiAgICAgICAgZnJvbUNhY2hlOiBmYWxzZSwKICAgICAgICByZXZhbGlkYXRlZDogdHJ1ZQogICAgICB9OwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgaWYgKGNvbnRleHQyLmxvZ2dpbmcpIHsKICAgICAgICBjb25zb2xlLmxvZygiW3dlYnJlcXVlc3RdIFJldmFsaWRhdGlvbiBmYWlsZWQsIHVzaW5nIGNhY2hlOiIsIGVycm9yKTsKICAgICAgfQogICAgICByZXR1cm4gewogICAgICAgIHJlc3BvbnNlOiBjb250ZXh0Mi5jYWNoZVN0b3JlLnJlc3BvbnNlRnJvbUNhY2hlRW50cnkoY2FjaGVkRW50cnkpLAogICAgICAgIGZyb21DYWNoZTogdHJ1ZSwKICAgICAgICByZXZhbGlkYXRlZDogZmFsc2UKICAgICAgfTsKICAgIH0KICB9Cn07CnZhciBTdGFsZVdoaWxlUmV2YWxpZGF0ZVN0cmF0ZWd5ID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlN0YWxlV2hpbGVSZXZhbGlkYXRlU3RyYXRlZ3kiKTsKICB9CiAgYXN5bmMgZXhlY3V0ZShjb250ZXh0MikgewogICAgY29uc3QgY2FjaGVkRW50cnkgPSBhd2FpdCBjb250ZXh0Mi5jYWNoZVN0b3JlLmdldChjb250ZXh0Mi5jYWNoZUtleSk7CiAgICBpZiAoY2FjaGVkRW50cnkpIHsKICAgICAgY29uc3QgY2FjaGVkUmVzcG9uc2UgPSBjb250ZXh0Mi5jYWNoZVN0b3JlLnJlc3BvbnNlRnJvbUNhY2hlRW50cnkoY2FjaGVkRW50cnkpOwogICAgICB0aGlzLnJldmFsaWRhdGVJbkJhY2tncm91bmQoY29udGV4dDIsIGNhY2hlZEVudHJ5KS5jYXRjaCgoZXJyb3IpID0+IHsKICAgICAgICBpZiAoY29udGV4dDIubG9nZ2luZykgewogICAgICAgICAgY29uc29sZS53YXJuKCJbd2VicmVxdWVzdF0gQmFja2dyb3VuZCByZXZhbGlkYXRpb24gZmFpbGVkOiIsIGVycm9yKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICByZXR1cm4gewogICAgICAgIHJlc3BvbnNlOiBjYWNoZWRSZXNwb25zZSwKICAgICAgICBmcm9tQ2FjaGU6IHRydWUsCiAgICAgICAgcmV2YWxpZGF0ZWQ6IGZhbHNlCiAgICAgIH07CiAgICB9CiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNvbnRleHQyLmZldGNoRm4oY29udGV4dDIucmVxdWVzdCk7CiAgICBjb25zdCBtZXRhZGF0YSA9IGV4dHJhY3RDYWNoZU1ldGFkYXRhKHJlc3BvbnNlLmhlYWRlcnMpOwogICAgaWYgKCFtZXRhZGF0YS5ub1N0b3JlICYmIHJlc3BvbnNlLm9rKSB7CiAgICAgIGNvbnN0IGVudHJ5ID0gYXdhaXQgY29udGV4dDIuY2FjaGVTdG9yZS5jYWNoZUVudHJ5RnJvbVJlc3BvbnNlKGNvbnRleHQyLnJlcXVlc3QudXJsLCByZXNwb25zZSwgbWV0YWRhdGEpOwogICAgICBhd2FpdCBjb250ZXh0Mi5jYWNoZVN0b3JlLnNldChjb250ZXh0Mi5jYWNoZUtleSwgZW50cnkpOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgcmVzcG9uc2UsCiAgICAgIGZyb21DYWNoZTogZmFsc2UsCiAgICAgIHJldmFsaWRhdGVkOiBmYWxzZQogICAgfTsKICB9CiAgYXN5bmMgcmV2YWxpZGF0ZUluQmFja2dyb3VuZChjb250ZXh0MiwgY2FjaGVkRW50cnkpIHsKICAgIGNvbnN0IG1ldGFkYXRhID0gZXh0cmFjdENhY2hlTWV0YWRhdGEobmV3IEhlYWRlcnMoY2FjaGVkRW50cnkuaGVhZGVycykpOwogICAgaWYgKGlzRnJlc2goY2FjaGVkRW50cnksIG1ldGFkYXRhKSAmJiAhcmVxdWlyZXNSZXZhbGlkYXRpb24obWV0YWRhdGEpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRyeSB7CiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY29udGV4dDIuZmV0Y2hGbihjb250ZXh0Mi5yZXF1ZXN0KTsKICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7CiAgICAgICAgY29uc3QgbmV3TWV0YWRhdGEgPSBleHRyYWN0Q2FjaGVNZXRhZGF0YShyZXNwb25zZS5oZWFkZXJzKTsKICAgICAgICBpZiAoIW5ld01ldGFkYXRhLm5vU3RvcmUpIHsKICAgICAgICAgIGNvbnN0IGVudHJ5ID0gYXdhaXQgY29udGV4dDIuY2FjaGVTdG9yZS5jYWNoZUVudHJ5RnJvbVJlc3BvbnNlKGNvbnRleHQyLnJlcXVlc3QudXJsLCByZXNwb25zZSwgbmV3TWV0YWRhdGEpOwogICAgICAgICAgYXdhaXQgY29udGV4dDIuY2FjaGVTdG9yZS5zZXQoY29udGV4dDIuY2FjaGVLZXksIGVudHJ5KTsKICAgICAgICAgIGlmIChjb250ZXh0Mi5sb2dnaW5nKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCJbd2VicmVxdWVzdF0gQmFja2dyb3VuZCByZXZhbGlkYXRpb24gY29tcGxldGU6IiwgY29udGV4dDIucmVxdWVzdC51cmwpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgaWYgKGNvbnRleHQyLmxvZ2dpbmcpIHsKICAgICAgICBjb25zb2xlLndhcm4oIlt3ZWJyZXF1ZXN0XSBCYWNrZ3JvdW5kIHJldmFsaWRhdGlvbiBmYWlsZWQ6IiwgZXJyb3IpOwogICAgICB9CiAgICB9CiAgfQp9Owp2YXIgTmV0d29ya09ubHlTdHJhdGVneSA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJOZXR3b3JrT25seVN0cmF0ZWd5Iik7CiAgfQogIGFzeW5jIGV4ZWN1dGUoY29udGV4dDIpIHsKICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY29udGV4dDIuZmV0Y2hGbihjb250ZXh0Mi5yZXF1ZXN0KTsKICAgIHJldHVybiB7CiAgICAgIHJlc3BvbnNlLAogICAgICBmcm9tQ2FjaGU6IGZhbHNlLAogICAgICByZXZhbGlkYXRlZDogZmFsc2UKICAgIH07CiAgfQp9Owp2YXIgQ2FjaGVPbmx5U3RyYXRlZ3kgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiQ2FjaGVPbmx5U3RyYXRlZ3kiKTsKICB9CiAgYXN5bmMgZXhlY3V0ZShjb250ZXh0MikgewogICAgY29uc3QgY2FjaGVkRW50cnkgPSBhd2FpdCBjb250ZXh0Mi5jYWNoZVN0b3JlLmdldChjb250ZXh0Mi5jYWNoZUtleSk7CiAgICBpZiAoIWNhY2hlZEVudHJ5KSB7CiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FjaGUgbWlzcyBmb3IgJHtjb250ZXh0Mi5yZXF1ZXN0LnVybH0gKGNhY2hlLW9ubHkgbW9kZSlgKTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIHJlc3BvbnNlOiBjb250ZXh0Mi5jYWNoZVN0b3JlLnJlc3BvbnNlRnJvbUNhY2hlRW50cnkoY2FjaGVkRW50cnkpLAogICAgICBmcm9tQ2FjaGU6IHRydWUsCiAgICAgIHJldmFsaWRhdGVkOiBmYWxzZQogICAgfTsKICB9Cn07CmZ1bmN0aW9uIGdldFN0cmF0ZWd5SGFuZGxlcihzdHJhdGVneSkgewogIHN3aXRjaCAoc3RyYXRlZ3kpIHsKICAgIGNhc2UgIm5ldHdvcmstZmlyc3QiOgogICAgICByZXR1cm4gbmV3IE5ldHdvcmtGaXJzdFN0cmF0ZWd5KCk7CiAgICBjYXNlICJjYWNoZS1maXJzdCI6CiAgICAgIHJldHVybiBuZXcgQ2FjaGVGaXJzdFN0cmF0ZWd5KCk7CiAgICBjYXNlICJzdGFsZS13aGlsZS1yZXZhbGlkYXRlIjoKICAgICAgcmV0dXJuIG5ldyBTdGFsZVdoaWxlUmV2YWxpZGF0ZVN0cmF0ZWd5KCk7CiAgICBjYXNlICJuZXR3b3JrLW9ubHkiOgogICAgICByZXR1cm4gbmV3IE5ldHdvcmtPbmx5U3RyYXRlZ3koKTsKICAgIGNhc2UgImNhY2hlLW9ubHkiOgogICAgICByZXR1cm4gbmV3IENhY2hlT25seVN0cmF0ZWd5KCk7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gbmV3IE5ldHdvcmtGaXJzdFN0cmF0ZWd5KCk7CiAgfQp9Cl9fbmFtZShnZXRTdHJhdGVneUhhbmRsZXIsICJnZXRTdHJhdGVneUhhbmRsZXIiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJyZXF1ZXN0QDQuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJyZXF1ZXN0L2Rpc3RfdHMvY2FjaGUvY2FjaGUubWFuYWdlci5qcwp2YXIgQ2FjaGVNYW5hZ2VyID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkNhY2hlTWFuYWdlciIpOwogIH0KICBjb25zdHJ1Y3RvcihkYk5hbWUsIHN0b3JlTmFtZSkgewogICAgdGhpcy5jYWNoZVN0b3JlID0gbmV3IENhY2hlU3RvcmUoZGJOYW1lLCBzdG9yZU5hbWUpOwogIH0KICAvKioKICAgKiBFeGVjdXRlIGEgcmVxdWVzdCB3aXRoIGNhY2hpbmcKICAgKi8KICBhc3luYyBleGVjdXRlKHJlcXVlc3QsIG9wdGlvbnMsIGZldGNoRm4pIHsKICAgIGNvbnN0IHN0cmF0ZWd5ID0gdGhpcy5kZXRlcm1pbmVTdHJhdGVneShyZXF1ZXN0LCBvcHRpb25zKTsKICAgIGlmIChzdHJhdGVneSA9PT0gIm5ldHdvcmstb25seSIpIHsKICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaEZuKHJlcXVlc3QpOwogICAgICByZXR1cm4gewogICAgICAgIHJlc3BvbnNlLAogICAgICAgIGZyb21DYWNoZTogZmFsc2UsCiAgICAgICAgcmV2YWxpZGF0ZWQ6IGZhbHNlCiAgICAgIH07CiAgICB9CiAgICBjb25zdCBjYWNoZUtleSA9IHRoaXMuZ2VuZXJhdGVDYWNoZUtleShyZXF1ZXN0LCBvcHRpb25zKTsKICAgIGNvbnN0IGhhbmRsZXIyID0gZ2V0U3RyYXRlZ3lIYW5kbGVyKHN0cmF0ZWd5KTsKICAgIGNvbnN0IGNvbnRleHQyID0gewogICAgICByZXF1ZXN0LAogICAgICBjYWNoZUtleSwKICAgICAgY2FjaGVTdG9yZTogdGhpcy5jYWNoZVN0b3JlLAogICAgICBmZXRjaEZuLAogICAgICBsb2dnaW5nOiBvcHRpb25zLmxvZ2dpbmcKICAgIH07CiAgICByZXR1cm4gYXdhaXQgaGFuZGxlcjIuZXhlY3V0ZShjb250ZXh0Mik7CiAgfQogIC8qKgogICAqIERldGVybWluZSB0aGUgY2FjaGluZyBzdHJhdGVneSBiYXNlZCBvbiBvcHRpb25zIGFuZCByZXF1ZXN0CiAgICovCiAgZGV0ZXJtaW5lU3RyYXRlZ3kocmVxdWVzdCwgb3B0aW9ucykgewogICAgaWYgKG9wdGlvbnMuY2FjaGVTdHJhdGVneSkgewogICAgICByZXR1cm4gb3B0aW9ucy5jYWNoZVN0cmF0ZWd5OwogICAgfQogICAgaWYgKG9wdGlvbnMuY2FjaGUpIHsKICAgICAgcmV0dXJuIHRoaXMubWFwQ2FjaGVNb2RlVG9TdHJhdGVneShvcHRpb25zLmNhY2hlKTsKICAgIH0KICAgIGlmIChyZXF1ZXN0LmNhY2hlKSB7CiAgICAgIHJldHVybiB0aGlzLm1hcENhY2hlTW9kZVRvU3RyYXRlZ3kocmVxdWVzdC5jYWNoZSk7CiAgICB9CiAgICByZXR1cm4gIm5ldHdvcmstZmlyc3QiOwogIH0KICAvKioKICAgKiBNYXAgc3RhbmRhcmQgZmV0Y2ggY2FjaGUgbW9kZXMgdG8gb3VyIHN0cmF0ZWdpZXMKICAgKi8KICBtYXBDYWNoZU1vZGVUb1N0cmF0ZWd5KGNhY2hlTW9kZSkgewogICAgc3dpdGNoIChjYWNoZU1vZGUpIHsKICAgICAgY2FzZSAiZGVmYXVsdCI6CiAgICAgICAgcmV0dXJuICJuZXR3b3JrLWZpcnN0IjsKICAgICAgY2FzZSAibm8tc3RvcmUiOgogICAgICBjYXNlICJyZWxvYWQiOgogICAgICAgIHJldHVybiAibmV0d29yay1vbmx5IjsKICAgICAgY2FzZSAibm8tY2FjaGUiOgogICAgICAgIHJldHVybiAibmV0d29yay1maXJzdCI7CiAgICAgIC8vIFdpbGwgdXNlIHJldmFsaWRhdGlvbgogICAgICBjYXNlICJmb3JjZS1jYWNoZSI6CiAgICAgICAgcmV0dXJuICJjYWNoZS1maXJzdCI7CiAgICAgIGNhc2UgIm9ubHktaWYtY2FjaGVkIjoKICAgICAgICByZXR1cm4gImNhY2hlLW9ubHkiOwogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiAibmV0d29yay1maXJzdCI7CiAgICB9CiAgfQogIC8qKgogICAqIEdlbmVyYXRlIGNhY2hlIGtleQogICAqLwogIGdlbmVyYXRlQ2FjaGVLZXkocmVxdWVzdCwgb3B0aW9ucykgewogICAgaWYgKG9wdGlvbnMuY2FjaGVLZXkpIHsKICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmNhY2hlS2V5ID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgcmV0dXJuIG9wdGlvbnMuY2FjaGVLZXkocmVxdWVzdCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG9wdGlvbnMuY2FjaGVLZXk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5jYWNoZVN0b3JlLmdlbmVyYXRlQ2FjaGVLZXkocmVxdWVzdCk7CiAgfQogIC8qKgogICAqIENsZWFyIHRoZSBjYWNoZQogICAqLwogIGFzeW5jIGNsZWFyKCkgewogICAgYXdhaXQgdGhpcy5jYWNoZVN0b3JlLmNsZWFyKCk7CiAgfQogIC8qKgogICAqIERlbGV0ZSBhIHNwZWNpZmljIGNhY2hlIGVudHJ5CiAgICovCiAgYXN5bmMgZGVsZXRlKGNhY2hlS2V5KSB7CiAgICBhd2FpdCB0aGlzLmNhY2hlU3RvcmUuZGVsZXRlKGNhY2hlS2V5KTsKICB9CiAgLyoqCiAgICogQ2hlY2sgaWYgYSBjYWNoZSBlbnRyeSBleGlzdHMKICAgKi8KICBhc3luYyBoYXMoY2FjaGVLZXkpIHsKICAgIHJldHVybiBhd2FpdCB0aGlzLmNhY2hlU3RvcmUuaGFzKGNhY2hlS2V5KTsKICB9CiAgLyoqCiAgICogR2V0IHRoZSB1bmRlcmx5aW5nIGNhY2hlIHN0b3JlCiAgICovCiAgZ2V0U3RvcmUoKSB7CiAgICByZXR1cm4gdGhpcy5jYWNoZVN0b3JlOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJyZXF1ZXN0QDQuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJyZXF1ZXN0L2Rpc3RfdHMvcmV0cnkvcmV0cnkuc3RyYXRlZ2llcy5qcwp2YXIgRXhwb25lbnRpYWxCYWNrb2ZmID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkV4cG9uZW50aWFsQmFja29mZiIpOwogIH0KICBjYWxjdWxhdGUoYXR0ZW1wdCwgaW5pdGlhbERlbGF5LCBtYXhEZWxheSkgewogICAgY29uc3QgZGVsYXkyID0gaW5pdGlhbERlbGF5ICogTWF0aC5wb3coMiwgYXR0ZW1wdCAtIDEpOwogICAgcmV0dXJuIE1hdGgubWluKGRlbGF5MiwgbWF4RGVsYXkpOwogIH0KfTsKdmFyIExpbmVhckJhY2tvZmYgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiTGluZWFyQmFja29mZiIpOwogIH0KICBjYWxjdWxhdGUoYXR0ZW1wdCwgaW5pdGlhbERlbGF5LCBtYXhEZWxheSkgewogICAgY29uc3QgZGVsYXkyID0gaW5pdGlhbERlbGF5ICogYXR0ZW1wdDsKICAgIHJldHVybiBNYXRoLm1pbihkZWxheTIsIG1heERlbGF5KTsKICB9Cn07CnZhciBDb25zdGFudEJhY2tvZmYgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiQ29uc3RhbnRCYWNrb2ZmIik7CiAgfQogIGNhbGN1bGF0ZShhdHRlbXB0LCBpbml0aWFsRGVsYXksIG1heERlbGF5KSB7CiAgICByZXR1cm4gTWF0aC5taW4oaW5pdGlhbERlbGF5LCBtYXhEZWxheSk7CiAgfQp9OwpmdW5jdGlvbiBnZXRCYWNrb2ZmQ2FsY3VsYXRvcihzdHJhdGVneSkgewogIHN3aXRjaCAoc3RyYXRlZ3kpIHsKICAgIGNhc2UgImV4cG9uZW50aWFsIjoKICAgICAgcmV0dXJuIG5ldyBFeHBvbmVudGlhbEJhY2tvZmYoKTsKICAgIGNhc2UgImxpbmVhciI6CiAgICAgIHJldHVybiBuZXcgTGluZWFyQmFja29mZigpOwogICAgY2FzZSAiY29uc3RhbnQiOgogICAgICByZXR1cm4gbmV3IENvbnN0YW50QmFja29mZigpOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIG5ldyBFeHBvbmVudGlhbEJhY2tvZmYoKTsKICB9Cn0KX19uYW1lKGdldEJhY2tvZmZDYWxjdWxhdG9yLCAiZ2V0QmFja29mZkNhbGN1bGF0b3IiKTsKZnVuY3Rpb24gYWRkSml0dGVyKGRlbGF5Miwgaml0dGVyRmFjdG9yID0gMC4xKSB7CiAgY29uc3Qgaml0dGVyID0gZGVsYXkyICogaml0dGVyRmFjdG9yICogTWF0aC5yYW5kb20oKTsKICByZXR1cm4gZGVsYXkyICsgaml0dGVyOwp9Cl9fbmFtZShhZGRKaXR0ZXIsICJhZGRKaXR0ZXIiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJyZXF1ZXN0QDQuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJyZXF1ZXN0L2Rpc3RfdHMvcmV0cnkvcmV0cnkubWFuYWdlci5qcwp2YXIgUmV0cnlNYW5hZ2VyID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlJldHJ5TWFuYWdlciIpOwogIH0KICBjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHsKICAgIHRoaXMub3B0aW9ucyA9IHsKICAgICAgbWF4QXR0ZW1wdHM6IG9wdGlvbnMubWF4QXR0ZW1wdHMgPz8gMywKICAgICAgYmFja29mZjogb3B0aW9ucy5iYWNrb2ZmID8/ICJleHBvbmVudGlhbCIsCiAgICAgIGluaXRpYWxEZWxheTogb3B0aW9ucy5pbml0aWFsRGVsYXkgPz8gMWUzLAogICAgICBtYXhEZWxheTogb3B0aW9ucy5tYXhEZWxheSA/PyAzZTQsCiAgICAgIHJldHJ5T246IG9wdGlvbnMucmV0cnlPbiA/PyBbNDA4LCA0MjksIDUwMCwgNTAyLCA1MDMsIDUwNF0sCiAgICAgIG9uUmV0cnk6IG9wdGlvbnMub25SZXRyeSA/PyAoKCkgPT4gewogICAgICB9KQogICAgfTsKICB9CiAgLyoqCiAgICogRXhlY3V0ZSBhIHJlcXVlc3Qgd2l0aCByZXRyeSBsb2dpYwogICAqLwogIGFzeW5jIGV4ZWN1dGUoZXhlY3V0ZUZuLCBzaG91bGRSZXRyeUZuKSB7CiAgICBsZXQgbGFzdEVycm9yOwogICAgbGV0IGxhc3RSZXNwb25zZTsKICAgIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IHRoaXMub3B0aW9ucy5tYXhBdHRlbXB0czsgYXR0ZW1wdCsrKSB7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlY3V0ZUZuKCk7CiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFJlc3BvbnNlKSB7CiAgICAgICAgICBpZiAodGhpcy5zaG91bGRSZXRyeVJlc3BvbnNlKHJlc3VsdCkpIHsKICAgICAgICAgICAgbGFzdFJlc3BvbnNlID0gcmVzdWx0OwogICAgICAgICAgICBpZiAoYXR0ZW1wdCA9PT0gdGhpcy5vcHRpb25zLm1heEF0dGVtcHRzKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBkZWxheTIgPSB0aGlzLmNhbGN1bGF0ZURlbGF5KGF0dGVtcHQpOwogICAgICAgICAgICB0aGlzLm9wdGlvbnMub25SZXRyeShhdHRlbXB0LCBuZXcgRXJyb3IoYEhUVFAgJHtyZXN1bHQuc3RhdHVzfWApLCBkZWxheTIpOwogICAgICAgICAgICBhd2FpdCB0aGlzLmRlbGF5KGRlbGF5Mik7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGxhc3RFcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKTsKICAgICAgICBjb25zdCBzaG91bGRSZXRyeSA9IHNob3VsZFJldHJ5Rm4gPyBzaG91bGRSZXRyeUZuKGVycm9yLCBhdHRlbXB0KSA6IHRoaXMuc2hvdWxkUmV0cnlFcnJvcihlcnJvcik7CiAgICAgICAgaWYgKGF0dGVtcHQgPT09IHRoaXMub3B0aW9ucy5tYXhBdHRlbXB0cyB8fCAhc2hvdWxkUmV0cnkpIHsKICAgICAgICAgIHRocm93IGxhc3RFcnJvcjsKICAgICAgICB9CiAgICAgICAgY29uc3QgZGVsYXkyID0gdGhpcy5jYWxjdWxhdGVEZWxheShhdHRlbXB0KTsKICAgICAgICB0aGlzLm9wdGlvbnMub25SZXRyeShhdHRlbXB0LCBsYXN0RXJyb3IsIGRlbGF5Mik7CiAgICAgICAgYXdhaXQgdGhpcy5kZWxheShkZWxheTIpOwogICAgICB9CiAgICB9CiAgICB0aHJvdyBsYXN0RXJyb3IgfHwgbmV3IEVycm9yKCJNYXggcmV0cnkgYXR0ZW1wdHMgcmVhY2hlZCIpOwogIH0KICAvKioKICAgKiBFeGVjdXRlIHdpdGggbXVsdGlwbGUgZmFsbGJhY2sgVVJMcwogICAqLwogIGFzeW5jIGV4ZWN1dGVXaXRoRmFsbGJhY2tzKHVybHMsIHJlcXVlc3RJbml0LCBmZXRjaEZuKSB7CiAgICBpZiAodXJscy5sZW5ndGggPT09IDApIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJObyBVUkxzIHByb3ZpZGVkIGZvciBmYWxsYmFjayBleGVjdXRpb24iKTsKICAgIH0KICAgIGxldCBsYXN0RXJyb3I7CiAgICBjb25zdCBmYWlsZWRVcmxzID0gW107CiAgICBmb3IgKGNvbnN0IHVybCBvZiB1cmxzKSB7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmV4ZWN1dGUoYXN5bmMgKCkgPT4gewogICAgICAgICAgcmV0dXJuIGF3YWl0IGZldGNoRm4odXJsLCByZXF1ZXN0SW5pdCk7CiAgICAgICAgfSk7CiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA8IDQwMCkgewogICAgICAgICAgcmV0dXJuIHJlc3BvbnNlOwogICAgICAgIH0KICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID49IDQwMCAmJiByZXNwb25zZS5zdGF0dXMgPCA1MDAgJiYgcmVzcG9uc2Uuc3RhdHVzICE9PSA0MDgpIHsKICAgICAgICAgIHJldHVybiByZXNwb25zZTsKICAgICAgICB9CiAgICAgICAgZmFpbGVkVXJscy5wdXNoKHVybCk7CiAgICAgICAgbGFzdEVycm9yID0gbmV3IEVycm9yKGBSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyAke3Jlc3BvbnNlLnN0YXR1c31gKTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBmYWlsZWRVcmxzLnB1c2godXJsKTsKICAgICAgICBsYXN0RXJyb3IgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSk7CiAgICAgIH0KICAgIH0KICAgIHRocm93IG5ldyBFcnJvcihgQWxsIFVSTHMgZmFpbGVkOiAke2ZhaWxlZFVybHMuam9pbigiLCAiKX0uIExhc3QgZXJyb3I6ICR7bGFzdEVycm9yPy5tZXNzYWdlIHx8ICJVbmtub3duIGVycm9yIn1gKTsKICB9CiAgLyoqCiAgICogQ2hlY2sgaWYgd2Ugc2hvdWxkIHJldHJ5IGJhc2VkIG9uIHJlc3BvbnNlIHN0YXR1cwogICAqLwogIHNob3VsZFJldHJ5UmVzcG9uc2UocmVzcG9uc2UpIHsKICAgIGNvbnN0IHJldHJ5T24gPSB0aGlzLm9wdGlvbnMucmV0cnlPbjsKICAgIGlmICh0eXBlb2YgcmV0cnlPbiA9PT0gImZ1bmN0aW9uIikgewogICAgICByZXR1cm4gcmV0cnlPbihyZXNwb25zZSk7CiAgICB9CiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXRyeU9uKSkgewogICAgICByZXR1cm4gcmV0cnlPbi5pbmNsdWRlcyhyZXNwb25zZS5zdGF0dXMpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KICAvKioKICAgKiBDaGVjayBpZiB3ZSBzaG91bGQgcmV0cnkgYmFzZWQgb24gZXJyb3IKICAgKi8KICBzaG91bGRSZXRyeUVycm9yKGVycm9yKSB7CiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBUeXBlRXJyb3IgJiYgZXJyb3IubWVzc2FnZS5pbmNsdWRlcygiZmV0Y2giKSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmIChlcnJvci5uYW1lID09PSAiQWJvcnRFcnJvciIgfHwgZXJyb3IubWVzc2FnZS5pbmNsdWRlcygidGltZW91dCIpKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgY29uc3QgcmV0cnlPbiA9IHRoaXMub3B0aW9ucy5yZXRyeU9uOwogICAgaWYgKHR5cGVvZiByZXRyeU9uID09PSAiZnVuY3Rpb24iKSB7CiAgICAgIHJldHVybiByZXRyeU9uKHZvaWQgMCwgZXJyb3IpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KICAvKioKICAgKiBDYWxjdWxhdGUgZGVsYXkgZm9yIG5leHQgcmV0cnkKICAgKi8KICBjYWxjdWxhdGVEZWxheShhdHRlbXB0KSB7CiAgICBjb25zdCBjYWxjdWxhdG9yID0gZ2V0QmFja29mZkNhbGN1bGF0b3IodGhpcy5vcHRpb25zLmJhY2tvZmYpOwogICAgY29uc3QgYmFzZURlbGF5ID0gY2FsY3VsYXRvci5jYWxjdWxhdGUoYXR0ZW1wdCwgdGhpcy5vcHRpb25zLmluaXRpYWxEZWxheSwgdGhpcy5vcHRpb25zLm1heERlbGF5KTsKICAgIHJldHVybiBhZGRKaXR0ZXIoYmFzZURlbGF5KTsKICB9CiAgLyoqCiAgICogRGVsYXkgZXhlY3V0aW9uCiAgICovCiAgYXN5bmMgZGVsYXkobXMpIHsKICAgIGF3YWl0IGRpc3RfdHNfZXhwb3J0czMuZGVsYXlGb3IobXMpOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJyZXF1ZXN0QDQuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJyZXF1ZXN0L2Rpc3RfdHMvdXRpbHMvZGVkdXBsaWNhdG9yLmpzCnZhciBSZXF1ZXN0RGVkdXBsaWNhdG9yID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlJlcXVlc3REZWR1cGxpY2F0b3IiKTsKICB9CiAgY29uc3RydWN0b3IoKSB7CiAgICB0aGlzLmluRmxpZ2h0UmVxdWVzdHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogIH0KICAvKioKICAgKiBHZW5lcmF0ZSBhIGRlZHVwbGljYXRpb24ga2V5IGZyb20gYSByZXF1ZXN0CiAgICovCiAgZ2VuZXJhdGVLZXkocmVxdWVzdCkgewogICAgY29uc3QgdXJsID0gcmVxdWVzdC51cmw7CiAgICBjb25zdCBtZXRob2QgPSByZXF1ZXN0Lm1ldGhvZDsKICAgIGlmIChtZXRob2QgPT09ICJHRVQiIHx8IG1ldGhvZCA9PT0gIkhFQUQiKSB7CiAgICAgIHJldHVybiBgJHttZXRob2R9OiR7dXJsfWA7CiAgICB9CiAgICByZXR1cm4gYCR7bWV0aG9kfToke3VybH06JHtEYXRlLm5vdygpfWA7CiAgfQogIC8qKgogICAqIEV4ZWN1dGUgYSByZXF1ZXN0IHdpdGggZGVkdXBsaWNhdGlvbgogICAqLwogIGFzeW5jIGV4ZWN1dGUoa2V5MiwgZXhlY3V0ZUZuKSB7CiAgICBjb25zdCBleGlzdGluZ0RlZmVycmVkID0gdGhpcy5pbkZsaWdodFJlcXVlc3RzLmdldChrZXkyKTsKICAgIGlmIChleGlzdGluZ0RlZmVycmVkKSB7CiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZXhpc3RpbmdEZWZlcnJlZC5wcm9taXNlOwogICAgICByZXR1cm4gewogICAgICAgIHJlc3BvbnNlOiByZXNwb25zZS5jbG9uZSgpLAogICAgICAgIHdhc0RlZHVwbGljYXRlZDogdHJ1ZQogICAgICB9OwogICAgfQogICAgY29uc3QgZGVmZXJyZWQgPSBkaXN0X3RzX2V4cG9ydHMuZGVmZXIoKTsKICAgIHRoaXMuaW5GbGlnaHRSZXF1ZXN0cy5zZXQoa2V5MiwgZGVmZXJyZWQpOwogICAgdHJ5IHsKICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBleGVjdXRlRm4oKTsKICAgICAgZGVmZXJyZWQucmVzb2x2ZShyZXNwb25zZSk7CiAgICAgIHRoaXMuaW5GbGlnaHRSZXF1ZXN0cy5kZWxldGUoa2V5Mik7CiAgICAgIHJldHVybiB7CiAgICAgICAgcmVzcG9uc2UsCiAgICAgICAgd2FzRGVkdXBsaWNhdGVkOiBmYWxzZQogICAgICB9OwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgZGVmZXJyZWQucmVqZWN0KGVycm9yKTsKICAgICAgdGhpcy5pbkZsaWdodFJlcXVlc3RzLmRlbGV0ZShrZXkyKTsKICAgICAgdGhyb3cgZXJyb3I7CiAgICB9CiAgfQogIC8qKgogICAqIENoZWNrIGlmIGEgcmVxdWVzdCBpcyBjdXJyZW50bHkgaW4gZmxpZ2h0CiAgICovCiAgaXNJbkZsaWdodChrZXkyKSB7CiAgICByZXR1cm4gdGhpcy5pbkZsaWdodFJlcXVlc3RzLmhhcyhrZXkyKTsKICB9CiAgLyoqCiAgICogR2V0IHRoZSBudW1iZXIgb2YgaW4tZmxpZ2h0IHJlcXVlc3RzCiAgICovCiAgZ2V0SW5GbGlnaHRDb3VudCgpIHsKICAgIHJldHVybiB0aGlzLmluRmxpZ2h0UmVxdWVzdHMuc2l6ZTsKICB9CiAgLyoqCiAgICogQ2xlYXIgYWxsIGluLWZsaWdodCByZXF1ZXN0cwogICAqLwogIGNsZWFyKCkgewogICAgdGhpcy5pbkZsaWdodFJlcXVlc3RzLmNsZWFyKCk7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnJlcXVlc3RANC4wLjUvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnJlcXVlc3QvZGlzdF90cy91dGlscy90aW1lb3V0LmpzCmZ1bmN0aW9uIGNyZWF0ZVRpbWVvdXRDb250cm9sbGVyKHRpbWVvdXRNcykgewogIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CiAgY29uc3QgdGltZW91dDIgPSBuZXcgZGlzdF90c19leHBvcnRzMy5UaW1lb3V0KHRpbWVvdXRNcywgbnVsbCk7CiAgdGltZW91dDIucHJvbWlzZS50aGVuKCgpID0+IHsKICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICB9KTsKICBjb25zdCBjbGVhbnVwID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoKSA9PiB7CiAgICB0aW1lb3V0Mi5jYW5jZWwoKTsKICB9LCAiY2xlYW51cCIpOwogIHJldHVybiB7IGNvbnRyb2xsZXIsIGNsZWFudXAgfTsKfQpfX25hbWUoY3JlYXRlVGltZW91dENvbnRyb2xsZXIsICJjcmVhdGVUaW1lb3V0Q29udHJvbGxlciIpOwphc3luYyBmdW5jdGlvbiBmZXRjaFdpdGhUaW1lb3V0KHVybCwgaW5pdCwgdGltZW91dE1zKSB7CiAgY29uc3QgeyBjb250cm9sbGVyLCBjbGVhbnVwIH0gPSBjcmVhdGVUaW1lb3V0Q29udHJvbGxlcih0aW1lb3V0TXMpOwogIHRyeSB7CiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgewogICAgICAuLi5pbml0LAogICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsCiAgICB9KTsKICAgIGNsZWFudXAoKTsKICAgIHJldHVybiByZXNwb25zZTsKICB9IGNhdGNoIChlcnJvcikgewogICAgY2xlYW51cCgpOwogICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubmFtZSA9PT0gIkFib3J0RXJyb3IiKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcihgUmVxdWVzdCB0aW1lb3V0IGFmdGVyICR7dGltZW91dE1zfW1zOiAke3VybH1gKTsKICAgIH0KICAgIHRocm93IGVycm9yOwogIH0KfQpfX25hbWUoZmV0Y2hXaXRoVGltZW91dCwgImZldGNoV2l0aFRpbWVvdXQiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJyZXF1ZXN0QDQuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJyZXF1ZXN0L2Rpc3RfdHMvd2VicmVxdWVzdC5jbGllbnQuanMKdmFyIFdlYnJlcXVlc3RDbGllbnQgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiV2VicmVxdWVzdENsaWVudCIpOwogIH0KICBjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHsKICAgIHRoaXMuZGVmYXVsdE9wdGlvbnMgPSBvcHRpb25zOwogICAgdGhpcy5pbnRlcmNlcHRvck1hbmFnZXIgPSBuZXcgSW50ZXJjZXB0b3JNYW5hZ2VyKCk7CiAgICB0aGlzLmNhY2hlTWFuYWdlciA9IG5ldyBDYWNoZU1hbmFnZXIoKTsKICAgIHRoaXMuZGVkdXBsaWNhdG9yID0gbmV3IFJlcXVlc3REZWR1cGxpY2F0b3IoKTsKICB9CiAgLyoqCiAgICogQWRkIGEgZ2xvYmFsIHJlcXVlc3QgaW50ZXJjZXB0b3IKICAgKi8KICBhZGRSZXF1ZXN0SW50ZXJjZXB0b3IoaW50ZXJjZXB0b3IpIHsKICAgIHRoaXMuaW50ZXJjZXB0b3JNYW5hZ2VyLmFkZFJlcXVlc3RJbnRlcmNlcHRvcihpbnRlcmNlcHRvcik7CiAgfQogIC8qKgogICAqIEFkZCBhIGdsb2JhbCByZXNwb25zZSBpbnRlcmNlcHRvcgogICAqLwogIGFkZFJlc3BvbnNlSW50ZXJjZXB0b3IoaW50ZXJjZXB0b3IpIHsKICAgIHRoaXMuaW50ZXJjZXB0b3JNYW5hZ2VyLmFkZFJlc3BvbnNlSW50ZXJjZXB0b3IoaW50ZXJjZXB0b3IpOwogIH0KICAvKioKICAgKiBBZGQgYSBnbG9iYWwgZXJyb3IgaW50ZXJjZXB0b3IKICAgKi8KICBhZGRFcnJvckludGVyY2VwdG9yKGludGVyY2VwdG9yKSB7CiAgICB0aGlzLmludGVyY2VwdG9yTWFuYWdlci5hZGRFcnJvckludGVyY2VwdG9yKGludGVyY2VwdG9yKTsKICB9CiAgLyoqCiAgICogUmVtb3ZlIGEgcmVxdWVzdCBpbnRlcmNlcHRvcgogICAqLwogIHJlbW92ZVJlcXVlc3RJbnRlcmNlcHRvcihpbnRlcmNlcHRvcikgewogICAgdGhpcy5pbnRlcmNlcHRvck1hbmFnZXIucmVtb3ZlUmVxdWVzdEludGVyY2VwdG9yKGludGVyY2VwdG9yKTsKICB9CiAgLyoqCiAgICogUmVtb3ZlIGEgcmVzcG9uc2UgaW50ZXJjZXB0b3IKICAgKi8KICByZW1vdmVSZXNwb25zZUludGVyY2VwdG9yKGludGVyY2VwdG9yKSB7CiAgICB0aGlzLmludGVyY2VwdG9yTWFuYWdlci5yZW1vdmVSZXNwb25zZUludGVyY2VwdG9yKGludGVyY2VwdG9yKTsKICB9CiAgLyoqCiAgICogUmVtb3ZlIGFuIGVycm9yIGludGVyY2VwdG9yCiAgICovCiAgcmVtb3ZlRXJyb3JJbnRlcmNlcHRvcihpbnRlcmNlcHRvcikgewogICAgdGhpcy5pbnRlcmNlcHRvck1hbmFnZXIucmVtb3ZlRXJyb3JJbnRlcmNlcHRvcihpbnRlcmNlcHRvcik7CiAgfQogIC8qKgogICAqIENsZWFyIGFsbCBpbnRlcmNlcHRvcnMKICAgKi8KICBjbGVhckludGVyY2VwdG9ycygpIHsKICAgIHRoaXMuaW50ZXJjZXB0b3JNYW5hZ2VyLmNsZWFyQWxsKCk7CiAgfQogIC8qKgogICAqIENsZWFyIHRoZSBjYWNoZQogICAqLwogIGFzeW5jIGNsZWFyQ2FjaGUoKSB7CiAgICBhd2FpdCB0aGlzLmNhY2hlTWFuYWdlci5jbGVhcigpOwogIH0KICAvKioKICAgKiBFeGVjdXRlIGEgcmVxdWVzdCB3aXRoIGFsbCBjb25maWd1cmVkIGZlYXR1cmVzCiAgICovCiAgYXN5bmMgcmVxdWVzdCh1cmwsIG9wdGlvbnMgPSB7fSkgewogICAgY29uc3QgbWVyZ2VkT3B0aW9ucyA9IHsKICAgICAgLi4udGhpcy5kZWZhdWx0T3B0aW9ucywKICAgICAgLi4ub3B0aW9ucwogICAgfTsKICAgIGxldCByZXF1ZXN0OwogICAgaWYgKHR5cGVvZiB1cmwgPT09ICJzdHJpbmciKSB7CiAgICAgIHJlcXVlc3QgPSBuZXcgUmVxdWVzdCh1cmwsIG1lcmdlZE9wdGlvbnMpOwogICAgfSBlbHNlIHsKICAgICAgcmVxdWVzdCA9IHVybDsKICAgIH0KICAgIHJlcXVlc3QgPSBhd2FpdCB0aGlzLmludGVyY2VwdG9yTWFuYWdlci5wcm9jZXNzUmVxdWVzdChyZXF1ZXN0KTsKICAgIGlmIChtZXJnZWRPcHRpb25zLmludGVyY2VwdG9ycz8ucmVxdWVzdCkgewogICAgICBmb3IgKGNvbnN0IGludGVyY2VwdG9yIG9mIG1lcmdlZE9wdGlvbnMuaW50ZXJjZXB0b3JzLnJlcXVlc3QpIHsKICAgICAgICByZXF1ZXN0ID0gYXdhaXQgaW50ZXJjZXB0b3IocmVxdWVzdCk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGRlZHVwbGljYXRlID0gbWVyZ2VkT3B0aW9ucy5kZWR1cGxpY2F0ZSA/PyBmYWxzZTsKICAgIGlmIChkZWR1cGxpY2F0ZSkgewogICAgICBjb25zdCBkZWR1cGVLZXkgPSB0aGlzLmRlZHVwbGljYXRvci5nZW5lcmF0ZUtleShyZXF1ZXN0KTsKICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5kZWR1cGxpY2F0b3IuZXhlY3V0ZShkZWR1cGVLZXksIGFzeW5jICgpID0+IHsKICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlUmVxdWVzdChyZXF1ZXN0LCBtZXJnZWRPcHRpb25zKTsKICAgICAgfSk7CiAgICAgIHJldHVybiByZXN1bHQucmVzcG9uc2U7CiAgICB9CiAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlUmVxdWVzdChyZXF1ZXN0LCBtZXJnZWRPcHRpb25zKTsKICB9CiAgLyoqCiAgICogSW50ZXJuYWwgcmVxdWVzdCBleGVjdXRpb24gd2l0aCBjYWNoaW5nIGFuZCByZXRyeQogICAqLwogIGFzeW5jIGV4ZWN1dGVSZXF1ZXN0KHJlcXVlc3QsIG9wdGlvbnMpIHsKICAgIHRyeSB7CiAgICAgIGNvbnN0IHJldHJ5T3B0aW9ucyA9IHR5cGVvZiBvcHRpb25zLnJldHJ5ID09PSAib2JqZWN0IiA/IG9wdGlvbnMucmV0cnkgOiBvcHRpb25zLnJldHJ5ID8ge30gOiB2b2lkIDA7CiAgICAgIGNvbnN0IGZldGNoRm5Gb3JSZXF1ZXN0ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShhc3luYyAocmVxKSA9PiB7CiAgICAgICAgY29uc3QgdGltZW91dDIgPSBvcHRpb25zLnRpbWVvdXQgPz8gNmU0OwogICAgICAgIHJldHVybiBhd2FpdCBmZXRjaFdpdGhUaW1lb3V0KHJlcS51cmwsIHsKICAgICAgICAgIG1ldGhvZDogcmVxLm1ldGhvZCwKICAgICAgICAgIGhlYWRlcnM6IHJlcS5oZWFkZXJzLAogICAgICAgICAgYm9keTogcmVxLmJvZHksCiAgICAgICAgICAuLi5vcHRpb25zCiAgICAgICAgfSwgdGltZW91dDIpOwogICAgICB9LCAiZmV0Y2hGbkZvclJlcXVlc3QiKTsKICAgICAgY29uc3QgZmV0Y2hGbkZvckZhbGxiYWNrcyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoYXN5bmMgKHVybCwgaW5pdCkgPT4gewogICAgICAgIGNvbnN0IHRpbWVvdXQyID0gb3B0aW9ucy50aW1lb3V0ID8/IDZlNDsKICAgICAgICByZXR1cm4gYXdhaXQgZmV0Y2hXaXRoVGltZW91dCh1cmwsIGluaXQsIHRpbWVvdXQyKTsKICAgICAgfSwgImZldGNoRm5Gb3JGYWxsYmFja3MiKTsKICAgICAgbGV0IHJlc3BvbnNlOwogICAgICBpZiAocmV0cnlPcHRpb25zKSB7CiAgICAgICAgY29uc3QgcmV0cnlNYW5hZ2VyID0gbmV3IFJldHJ5TWFuYWdlcihyZXRyeU9wdGlvbnMpOwogICAgICAgIGlmIChvcHRpb25zLmZhbGxiYWNrVXJscyAmJiBvcHRpb25zLmZhbGxiYWNrVXJscy5sZW5ndGggPiAwKSB7CiAgICAgICAgICBjb25zdCBhbGxVcmxzID0gW3JlcXVlc3QudXJsLCAuLi5vcHRpb25zLmZhbGxiYWNrVXJsc107CiAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IHJldHJ5TWFuYWdlci5leGVjdXRlV2l0aEZhbGxiYWNrcyhhbGxVcmxzLCB7CiAgICAgICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsCiAgICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycywKICAgICAgICAgICAgYm9keTogcmVxdWVzdC5ib2R5LAogICAgICAgICAgICAuLi5vcHRpb25zCiAgICAgICAgICB9LCBmZXRjaEZuRm9yRmFsbGJhY2tzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCByZXRyeU1hbmFnZXIuZXhlY3V0ZShhc3luYyAoKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY2FjaGVNYW5hZ2VyLmV4ZWN1dGUocmVxdWVzdCwgb3B0aW9ucywgZmV0Y2hGbkZvclJlcXVlc3QpOwogICAgICAgICAgICByZXR1cm4gcmVzdWx0LnJlc3BvbnNlOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY2FjaGVNYW5hZ2VyLmV4ZWN1dGUocmVxdWVzdCwgb3B0aW9ucywgZmV0Y2hGbkZvclJlcXVlc3QpOwogICAgICAgIHJlc3BvbnNlID0gcmVzdWx0LnJlc3BvbnNlOwogICAgICB9CiAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5pbnRlcmNlcHRvck1hbmFnZXIucHJvY2Vzc1Jlc3BvbnNlKHJlc3BvbnNlKTsKICAgICAgaWYgKG9wdGlvbnMuaW50ZXJjZXB0b3JzPy5yZXNwb25zZSkgewogICAgICAgIGZvciAoY29uc3QgaW50ZXJjZXB0b3Igb2Ygb3B0aW9ucy5pbnRlcmNlcHRvcnMucmVzcG9uc2UpIHsKICAgICAgICAgIHJlc3BvbnNlID0gYXdhaXQgaW50ZXJjZXB0b3IocmVzcG9uc2UpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmVzcG9uc2U7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBjb25zdCBwcm9jZXNzZWRFcnJvciA9IGF3YWl0IHRoaXMuaW50ZXJjZXB0b3JNYW5hZ2VyLnByb2Nlc3NFcnJvcihlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSkpOwogICAgICB0aHJvdyBwcm9jZXNzZWRFcnJvcjsKICAgIH0KICB9CiAgLyoqCiAgICogQ29udmVuaWVuY2UgbWV0aG9kOiBHRVQgcmVxdWVzdCByZXR1cm5pbmcgSlNPTgogICAqLwogIGFzeW5jIGdldEpzb24odXJsLCBvcHRpb25zID0ge30pIHsKICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5yZXF1ZXN0KHVybCwgewogICAgICAuLi5vcHRpb25zLAogICAgICBtZXRob2Q6ICJHRVQiLAogICAgICBoZWFkZXJzOiB7CiAgICAgICAgQWNjZXB0OiAiYXBwbGljYXRpb24vanNvbiIsCiAgICAgICAgLi4ub3B0aW9ucy5oZWFkZXJzIHx8IHt9CiAgICAgIH0KICAgIH0pOwogICAgaWYgKCFyZXNwb25zZS5vaykgewogICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9OiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7CiAgICB9CiAgICByZXR1cm4gYXdhaXQgcmVzcG9uc2UuanNvbigpOwogIH0KICAvKioKICAgKiBDb252ZW5pZW5jZSBtZXRob2Q6IFBPU1QgcmVxdWVzdCB3aXRoIEpTT04gYm9keQogICAqLwogIGFzeW5jIHBvc3RKc29uKHVybCwgZGF0YSwgb3B0aW9ucyA9IHt9KSB7CiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMucmVxdWVzdCh1cmwsIHsKICAgICAgLi4ub3B0aW9ucywKICAgICAgbWV0aG9kOiAiUE9TVCIsCiAgICAgIGhlYWRlcnM6IHsKICAgICAgICAiQ29udGVudC1UeXBlIjogImFwcGxpY2F0aW9uL2pzb24iLAogICAgICAgIEFjY2VwdDogImFwcGxpY2F0aW9uL2pzb24iLAogICAgICAgIC4uLm9wdGlvbnMuaGVhZGVycyB8fCB7fQogICAgICB9LAogICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShkYXRhKQogICAgfSk7CiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c306ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKTsKICAgIH0KICAgIHJldHVybiBhd2FpdCByZXNwb25zZS5qc29uKCk7CiAgfQogIC8qKgogICAqIENvbnZlbmllbmNlIG1ldGhvZDogUFVUIHJlcXVlc3Qgd2l0aCBKU09OIGJvZHkKICAgKi8KICBhc3luYyBwdXRKc29uKHVybCwgZGF0YSwgb3B0aW9ucyA9IHt9KSB7CiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMucmVxdWVzdCh1cmwsIHsKICAgICAgLi4ub3B0aW9ucywKICAgICAgbWV0aG9kOiAiUFVUIiwKICAgICAgaGVhZGVyczogewogICAgICAgICJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24vanNvbiIsCiAgICAgICAgQWNjZXB0OiAiYXBwbGljYXRpb24vanNvbiIsCiAgICAgICAgLi4ub3B0aW9ucy5oZWFkZXJzIHx8IHt9CiAgICAgIH0sCiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpCiAgICB9KTsKICAgIGlmICghcmVzcG9uc2Uub2spIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfTogJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApOwogICAgfQogICAgcmV0dXJuIGF3YWl0IHJlc3BvbnNlLmpzb24oKTsKICB9CiAgLyoqCiAgICogQ29udmVuaWVuY2UgbWV0aG9kOiBERUxFVEUgcmVxdWVzdAogICAqLwogIGFzeW5jIGRlbGV0ZUpzb24odXJsLCBvcHRpb25zID0ge30pIHsKICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5yZXF1ZXN0KHVybCwgewogICAgICAuLi5vcHRpb25zLAogICAgICBtZXRob2Q6ICJERUxFVEUiLAogICAgICBoZWFkZXJzOiB7CiAgICAgICAgQWNjZXB0OiAiYXBwbGljYXRpb24vanNvbiIsCiAgICAgICAgLi4ub3B0aW9ucy5oZWFkZXJzIHx8IHt9CiAgICAgIH0KICAgIH0pOwogICAgaWYgKCFyZXNwb25zZS5vaykgewogICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9OiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7CiAgICB9CiAgICByZXR1cm4gYXdhaXQgcmVzcG9uc2UuanNvbigpOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJyZXF1ZXN0QDQuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJyZXF1ZXN0L2Rpc3RfdHMvd2VicmVxdWVzdC5mdW5jdGlvbi5qcwp2YXIgZGVmYXVsdENsaWVudCA9IG5ldyBXZWJyZXF1ZXN0Q2xpZW50KCk7CmFzeW5jIGZ1bmN0aW9uIHdlYnJlcXVlc3QoaW5wdXQsIGluaXQpIHsKICBjb25zdCB1cmwgPSBpbnB1dCBpbnN0YW5jZW9mIFJlcXVlc3QgPyBpbnB1dC51cmwgOiBTdHJpbmcoaW5wdXQpOwogIGNvbnN0IHJlcXVlc3QgPSBpbnB1dCBpbnN0YW5jZW9mIFJlcXVlc3QgPyBpbnB1dCA6IG5ldyBSZXF1ZXN0KHVybCwgaW5pdCk7CiAgcmV0dXJuIGF3YWl0IGRlZmF1bHRDbGllbnQucmVxdWVzdChyZXF1ZXN0LCBpbml0KTsKfQpfX25hbWUod2VicmVxdWVzdCwgIndlYnJlcXVlc3QiKTsKd2VicmVxdWVzdC5nZXRKc29uID0gYXN5bmMgZnVuY3Rpb24odXJsLCBvcHRpb25zKSB7CiAgcmV0dXJuIGF3YWl0IGRlZmF1bHRDbGllbnQuZ2V0SnNvbih1cmwsIG9wdGlvbnMpOwp9Owp3ZWJyZXF1ZXN0LnBvc3RKc29uID0gYXN5bmMgZnVuY3Rpb24odXJsLCBkYXRhLCBvcHRpb25zKSB7CiAgcmV0dXJuIGF3YWl0IGRlZmF1bHRDbGllbnQucG9zdEpzb24odXJsLCBkYXRhLCBvcHRpb25zKTsKfTsKd2VicmVxdWVzdC5wdXRKc29uID0gYXN5bmMgZnVuY3Rpb24odXJsLCBkYXRhLCBvcHRpb25zKSB7CiAgcmV0dXJuIGF3YWl0IGRlZmF1bHRDbGllbnQucHV0SnNvbih1cmwsIGRhdGEsIG9wdGlvbnMpOwp9Owp3ZWJyZXF1ZXN0LmRlbGV0ZUpzb24gPSBhc3luYyBmdW5jdGlvbih1cmwsIG9wdGlvbnMpIHsKICByZXR1cm4gYXdhaXQgZGVmYXVsdENsaWVudC5kZWxldGVKc29uKHVybCwgb3B0aW9ucyk7Cn07CndlYnJlcXVlc3QuYWRkUmVxdWVzdEludGVyY2VwdG9yID0gZnVuY3Rpb24oaW50ZXJjZXB0b3IpIHsKICBkZWZhdWx0Q2xpZW50LmFkZFJlcXVlc3RJbnRlcmNlcHRvcihpbnRlcmNlcHRvcik7Cn07CndlYnJlcXVlc3QuYWRkUmVzcG9uc2VJbnRlcmNlcHRvciA9IGZ1bmN0aW9uKGludGVyY2VwdG9yKSB7CiAgZGVmYXVsdENsaWVudC5hZGRSZXNwb25zZUludGVyY2VwdG9yKGludGVyY2VwdG9yKTsKfTsKd2VicmVxdWVzdC5hZGRFcnJvckludGVyY2VwdG9yID0gZnVuY3Rpb24oaW50ZXJjZXB0b3IpIHsKICBkZWZhdWx0Q2xpZW50LmFkZEVycm9ySW50ZXJjZXB0b3IoaW50ZXJjZXB0b3IpOwp9Owp3ZWJyZXF1ZXN0LmNsZWFySW50ZXJjZXB0b3JzID0gZnVuY3Rpb24oKSB7CiAgZGVmYXVsdENsaWVudC5jbGVhckludGVyY2VwdG9ycygpOwp9Owp3ZWJyZXF1ZXN0LmNsZWFyQ2FjaGUgPSBhc3luYyBmdW5jdGlvbigpIHsKICBhd2FpdCBkZWZhdWx0Q2xpZW50LmNsZWFyQ2FjaGUoKTsKfTsKd2VicmVxdWVzdC5jcmVhdGVDbGllbnQgPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgcmV0dXJuIG5ldyBXZWJyZXF1ZXN0Q2xpZW50KG9wdGlvbnMpOwp9Owp3ZWJyZXF1ZXN0LmdldERlZmF1bHRDbGllbnQgPSBmdW5jdGlvbigpIHsKICByZXR1cm4gZGVmYXVsdENsaWVudDsKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AYXBpLmdsb2JhbCt0eXBlZHJlcXVlc3RAMy4zLjAvbm9kZV9tb2R1bGVzL0BhcGkuZ2xvYmFsL3R5cGVkcmVxdWVzdC9kaXN0X3RzL3BsdWdpbnMuanMKdmFyIGlzb3VuaXF1ZTIgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdF90cygpLCAxKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AYXBpLmdsb2JhbCt0eXBlZHJlcXVlc3RAMy4zLjAvbm9kZV9tb2R1bGVzL0BhcGkuZ2xvYmFsL3R5cGVkcmVxdWVzdC9kaXN0X3RzL2NsYXNzZXMudHlwZWRyZXNwb25zZWVycm9yLmpzCnZhciBUeXBlZFJlc3BvbnNlRXJyb3IgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiVHlwZWRSZXNwb25zZUVycm9yIik7CiAgfQogIGNvbnN0cnVjdG9yKGVycm9yVGV4dEFyZywgZXJyb3JEYXRhQXJnKSB7CiAgICB0aGlzLmVycm9yVGV4dCA9IGVycm9yVGV4dEFyZzsKICAgIHRoaXMuZXJyb3JEYXRhID0gZXJyb3JEYXRhQXJnOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AYXBpLmdsb2JhbCt0eXBlZHJlcXVlc3RAMy4zLjAvbm9kZV9tb2R1bGVzL0BhcGkuZ2xvYmFsL3R5cGVkcmVxdWVzdC9kaXN0X3RzL2NsYXNzZXMudHlwZWR0b29scy5qcwp2YXIgVHlwZWRUb29scyA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJUeXBlZFRvb2xzIik7CiAgfQogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5sb2NhbERhdGEgPSB7fTsKICB9CiAgYXN5bmMgcGFzc0d1YXJkcyhndWFyZHNBcmcsIGRhdGFBcmcpIHsKICAgIGNvbnN0IGd1YXJkU2V0ID0gbmV3IGRpc3RfdHNfZXhwb3J0czkuR3VhcmRTZXQoZ3VhcmRzQXJnKTsKICAgIGNvbnN0IGd1YXJkUmVzdWx0ID0gYXdhaXQgZ3VhcmRTZXQuYWxsR3VhcmRzUGFzcyhkYXRhQXJnKTsKICAgIGlmICghZ3VhcmRSZXN1bHQpIHsKICAgICAgY29uc3QgZmFpbGVkSGludCA9IGF3YWl0IGd1YXJkU2V0LmdldEZhaWxlZEhpbnQoZGF0YUFyZyk7CiAgICAgIHRocm93IG5ldyBUeXBlZFJlc3BvbnNlRXJyb3IoYGd1YXJkIGZhaWxlZDogJHtmYWlsZWRIaW50fWAsIHsgZmFpbGVkSGludCB9KTsKICAgIH0KICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGFwaS5nbG9iYWwrdHlwZWRyZXF1ZXN0QDMuMy4wL25vZGVfbW9kdWxlcy9AYXBpLmdsb2JhbC90eXBlZHJlcXVlc3QvZGlzdF90cy9jbGFzc2VzLnR5cGVkaGFuZGxlci5qcwp2YXIgVHlwZWRIYW5kbGVyID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlR5cGVkSGFuZGxlciIpOwogIH0KICBjb25zdHJ1Y3RvcihtZXRob2RBcmcsIGhhbmRsZXJGdW5jdGlvbkFyZykgewogICAgdGhpcy5tZXRob2QgPSBtZXRob2RBcmc7CiAgICB0aGlzLmhhbmRsZXJGdW5jdGlvbiA9IGhhbmRsZXJGdW5jdGlvbkFyZzsKICB9CiAgLyoqCiAgICogYWRkcyBhIHJlc3BvbnNlIHRvIHRoZSB0eXBlZFJlcXVlc3QKICAgKiBAcGFyYW0gdHlwZWRSZXF1ZXN0QXJnCiAgICovCiAgYXN5bmMgYWRkUmVzcG9uc2UodHlwZWRSZXF1ZXN0QXJnKSB7CiAgICBpZiAodHlwZWRSZXF1ZXN0QXJnLm1ldGhvZCAhPT0gdGhpcy5tZXRob2QpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJ0aGlzIGhhbmRsZXIgaGFzIGJlZW4gZ2l2ZW4gYSB3cm9uZyBtZXRob2QgdG8gYW5zd2VyIHRvLiBQbGVhc2UgdXNlIGEgVHlwZWRSb3V0ZXIgdG8gZmlsdGVyIHJlcXVlc3RzIik7CiAgICB9CiAgICBsZXQgdHlwZWRSZXNwb25zZUVycm9yOwogICAgY29uc3QgdHlwZWR0b29sc0luc3RhbmNlID0gbmV3IFR5cGVkVG9vbHMoKTsKICAgIGlmICh0eXBlZFJlcXVlc3RBcmcubG9jYWxEYXRhKSB7CiAgICAgIHR5cGVkdG9vbHNJbnN0YW5jZS5sb2NhbERhdGEgPSB0eXBlZFJlcXVlc3RBcmcubG9jYWxEYXRhOwogICAgfQogICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmhhbmRsZXJGdW5jdGlvbih0eXBlZFJlcXVlc3RBcmcucmVxdWVzdCwgdHlwZWR0b29sc0luc3RhbmNlKS5jYXRjaCgoZTEwKSA9PiB7CiAgICAgIGlmIChlMTAgaW5zdGFuY2VvZiBUeXBlZFJlc3BvbnNlRXJyb3IpIHsKICAgICAgICB0eXBlZFJlc3BvbnNlRXJyb3IgPSBlMTA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc29sZS5sb2coZTEwKTsKICAgICAgfQogICAgfSk7CiAgICBpZiAodHlwZWRSZXNwb25zZUVycm9yKSB7CiAgICAgIHR5cGVkUmVxdWVzdEFyZy5lcnJvciA9IHsKICAgICAgICB0ZXh0OiB0eXBlZFJlc3BvbnNlRXJyb3IuZXJyb3JUZXh0LAogICAgICAgIGRhdGE6IHR5cGVkUmVzcG9uc2VFcnJvci5lcnJvckRhdGEKICAgICAgfTsKICAgIH0KICAgIGlmIChyZXNwb25zZSkgewogICAgICB0eXBlZFJlcXVlc3RBcmcucmVzcG9uc2UgPSByZXNwb25zZTsKICAgIH0KICAgIHR5cGVkUmVxdWVzdEFyZz8uY29ycmVsYXRpb24/LnBoYXNlID8gdHlwZWRSZXF1ZXN0QXJnLmNvcnJlbGF0aW9uLnBoYXNlID0gInJlc3BvbnNlIiA6IG51bGw7CiAgICByZXR1cm4gdHlwZWRSZXF1ZXN0QXJnOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AYXBpLmdsb2JhbCt0eXBlZHJlcXVlc3RAMy4zLjAvbm9kZV9tb2R1bGVzL0BhcGkuZ2xvYmFsL3R5cGVkcmVxdWVzdC9kaXN0X3RzL2NsYXNzZXMudHlwZWRyb3V0ZXIuanMKdmFyIFR5cGVkUm91dGVyID0gY2xhc3MgX1R5cGVkUm91dGVyIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJUeXBlZFJvdXRlciIpOwogIH0KICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMuaG9va3MgPSB7fTsKICAgIHRoaXMucm91dGVyTWFwID0gbmV3IGRpc3RfdHNfZXhwb3J0czYuT2JqZWN0TWFwKCk7CiAgICB0aGlzLmhhbmRsZXJNYXAgPSBuZXcgZGlzdF90c19leHBvcnRzNi5PYmplY3RNYXAoKTsKICAgIHRoaXMucmVnaXN0ZXJlZFZpcnR1YWxTdHJlYW1zID0gbmV3IGRpc3RfdHNfZXhwb3J0czYuT2JqZWN0TWFwKCk7CiAgICB0aGlzLm1pZGRsZXdhcmVzID0gW107CiAgICB0aGlzLmZpcmVFdmVudEludGVyZXN0TWFwID0gbmV3IGRpc3RfdHNfZXhwb3J0czYuSW50ZXJlc3RNYXAoKGNvcnJlbGF0aW9uSWQpID0+IGNvcnJlbGF0aW9uSWQpOwogIH0KICAvLyBVc2UgZ2xvYmFsVGhpcyBmb3IgY3Jvc3MtYnVuZGxlIGhvb2sgc2hhcmluZwogIHN0YXRpYyBnZXQgZ2xvYmFsSG9va3MoKSB7CiAgICBpZiAoIWdsb2JhbFRoaXMuX190eXBlZFJvdXRlckdsb2JhbEhvb2tzKSB7CiAgICAgIGdsb2JhbFRoaXMuX190eXBlZFJvdXRlckdsb2JhbEhvb2tzID0ge307CiAgICB9CiAgICByZXR1cm4gZ2xvYmFsVGhpcy5fX3R5cGVkUm91dGVyR2xvYmFsSG9va3M7CiAgfQogIHN0YXRpYyBzZXQgZ2xvYmFsSG9va3ModmFsdWUyKSB7CiAgICBnbG9iYWxUaGlzLl9fdHlwZWRSb3V0ZXJHbG9iYWxIb29rcyA9IHZhbHVlMjsKICB9CiAgLyoqCiAgICogU2V0IGdsb2JhbCBob29rcyBmb3IgbW9uaXRvcmluZyBhbGwgVHlwZWRSZXF1ZXN0IHRyYWZmaWMKICAgKiBIb29rcyBhcmUgc2hhcmVkIGFjcm9zcyBhbGwgYnVuZGxlcyB2aWEgZ2xvYmFsVGhpcwogICAqLwogIHN0YXRpYyBzZXRHbG9iYWxIb29rcyhob29rcykgewogICAgY29uc3QgY3VycmVudCA9IF9UeXBlZFJvdXRlci5nbG9iYWxIb29rczsKICAgIF9UeXBlZFJvdXRlci5nbG9iYWxIb29rcyA9IHsgLi4uY3VycmVudCwgLi4uaG9va3MgfTsKICB9CiAgLyoqCiAgICogQ2xlYXIgYWxsIGdsb2JhbCBob29rcwogICAqLwogIHN0YXRpYyBjbGVhckdsb2JhbEhvb2tzKCkgewogICAgZ2xvYmFsVGhpcy5fX3R5cGVkUm91dGVyR2xvYmFsSG9va3MgPSB7fTsKICB9CiAgLyoqCiAgICogU2V0IGluc3RhbmNlLWxldmVsIGhvb2tzIGZvciBtb25pdG9yaW5nIHRyYWZmaWMgdGhyb3VnaCB0aGlzIHJvdXRlcgogICAqLwogIHNldEhvb2tzKGhvb2tzKSB7CiAgICB0aGlzLmhvb2tzID0geyAuLi50aGlzLmhvb2tzLCAuLi5ob29rcyB9OwogIH0KICAvKioKICAgKiBIZWxwZXIgdG8gY2FsbCBib3RoIGdsb2JhbCBhbmQgaW5zdGFuY2UgaG9va3MKICAgKi8KICBjYWxsSG9vayhob29rTmFtZSwgZW50cnkpIHsKICAgIHRyeSB7CiAgICAgIF9UeXBlZFJvdXRlci5nbG9iYWxIb29rc1tob29rTmFtZV0/LihlbnRyeSk7CiAgICAgIHRoaXMuaG9va3NbaG9va05hbWVdPy4oZW50cnkpOwogICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoYFR5cGVkUm91dGVyIGhvb2sgZXJyb3IgKCR7aG9va05hbWV9KTpgLCBlcnIpOwogICAgfQogIH0KICAvKioKICAgKiBBZGRzIGEgbWlkZGxld2FyZSBmdW5jdGlvbiB0aGF0IHJ1bnMgYmVmb3JlIHRoZSBoYW5kbGVyIG9uIHRoaXMgcm91dGVyLgogICAqIFRocm93IFR5cGVkUmVzcG9uc2VFcnJvciB0byByZWplY3QgdGhlIHJlcXVlc3QuCiAgICovCiAgYWRkTWlkZGxld2FyZShmbikgewogICAgdGhpcy5taWRkbGV3YXJlcy5wdXNoKGZuKTsKICB9CiAgLyoqCiAgICogYWRkcyB0aGUgaGFuZGxlciB0byB0aGUgcm91dGluZyBtYXAKICAgKiBAcGFyYW0gdHlwZWRIYW5kbGVyQXJnCiAgICovCiAgYWRkVHlwZWRIYW5kbGVyKHR5cGVkSGFuZGxlckFyZykgewogICAgY29uc3QgZXhpc3RpbmdUeXBlZEhhbmRsZXIgPSB0aGlzLmdldFR5cGVkSGFuZGxlckZvck1ldGhvZCh0eXBlZEhhbmRsZXJBcmcubWV0aG9kKTsKICAgIGlmIChleGlzdGluZ1R5cGVkSGFuZGxlcikgewogICAgICB0aHJvdyBuZXcgRXJyb3IoYGEgVHlwZWRIYW5kbGVyIGZvciAke3R5cGVkSGFuZGxlckFyZy5tZXRob2R9IGFscmVkeSBleGlzdHMhIENhbid0IGFkZCBhbm90aGVyIG9uZS5gKTsKICAgIH0KICAgIHRoaXMuaGFuZGxlck1hcC5hZGQodHlwZWRIYW5kbGVyQXJnKTsKICB9CiAgLyoqCiAgICogYWRkcyBhbm90aGVyIHN1YiB0eXBlZFJvdXRlcgogICAqIEBwYXJhbSB0eXBlZFJlcXVlc3QKICAgKi8KICBhZGRUeXBlZFJvdXRlcih0eXBlZFJvdXRlckFyZykgewogICAgY29uc3Qgcm91dGVyRXhpc3RzID0gdGhpcy5yb3V0ZXJNYXAuZmluZFN5bmMoKHJvdXRlckFyZykgPT4gcm91dGVyQXJnID09PSB0eXBlZFJvdXRlckFyZyk7CiAgICBpZiAoIXJvdXRlckV4aXN0cykgewogICAgICB0aGlzLnJvdXRlck1hcC5hZGQodHlwZWRSb3V0ZXJBcmcpOwogICAgICB0eXBlZFJvdXRlckFyZy5hZGRUeXBlZFJvdXRlcih0aGlzKTsKICAgIH0KICB9CiAgY2hlY2tGb3JUeXBlZEhhbmRsZXIobWV0aG9kQXJnKSB7CiAgICByZXR1cm4gISF0aGlzLmdldFR5cGVkSGFuZGxlckZvck1ldGhvZChtZXRob2RBcmcpOwogIH0KICAvKioKICAgKiBnZXRzIGEgdHlwZWQgUm91dGVyIGZyb20gdGhlIHJvdXRlciBjaGFpbiwgdXBzdHJlYW0gYW5kIGRvd25zdHJlYW0KICAgKiBAcGFyYW0gbWV0aG9kQXJnCiAgICogQHBhcmFtIGNoZWNrVXBzdHJlYW1Sb3V0ZXIKICAgKi8KICBnZXRUeXBlZEhhbmRsZXJGb3JNZXRob2QobWV0aG9kQXJnLCBjaGVja2VkUm91dGVycyA9IFtdKSB7CiAgICBjaGVja2VkUm91dGVycy5wdXNoKHRoaXMpOwogICAgbGV0IHR5cGVkSGFuZGxlcjsKICAgIHR5cGVkSGFuZGxlciA9IHRoaXMuaGFuZGxlck1hcC5maW5kU3luYygoaGFuZGxlcjIpID0+IHsKICAgICAgcmV0dXJuIGhhbmRsZXIyLm1ldGhvZCA9PT0gbWV0aG9kQXJnOwogICAgfSk7CiAgICBpZiAoIXR5cGVkSGFuZGxlcikgewogICAgICB0aGlzLnJvdXRlck1hcC5nZXRBcnJheSgpLmZvckVhY2goKHR5cGVkUm91dGVyQXJnKSA9PiB7CiAgICAgICAgaWYgKCF0eXBlZEhhbmRsZXIgJiYgIWNoZWNrZWRSb3V0ZXJzLmluY2x1ZGVzKHR5cGVkUm91dGVyQXJnKSkgewogICAgICAgICAgdHlwZWRIYW5kbGVyID0gdHlwZWRSb3V0ZXJBcmcuZ2V0VHlwZWRIYW5kbGVyRm9yTWV0aG9kKG1ldGhvZEFyZywgY2hlY2tlZFJvdXRlcnMpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gdHlwZWRIYW5kbGVyOwogIH0KICAvKioKICAgKiBGaW5kcyB0aGUgaGFuZGxlciBBTkQgaXRzIG93bmluZyByb3V0ZXIgZm9yIGEgZ2l2ZW4gbWV0aG9kLgogICAqIE5lZWRlZCB0byBrbm93IHdoaWNoIHJvdXRlcidzIG1pZGRsZXdhcmUgdG8gcnVuLgogICAqLwogIGdldFR5cGVkSGFuZGxlckFuZFJvdXRlcihtZXRob2RBcmcsIGNoZWNrZWRSb3V0ZXJzID0gW10pIHsKICAgIGNoZWNrZWRSb3V0ZXJzLnB1c2godGhpcyk7CiAgICBjb25zdCBoYW5kbGVyMiA9IHRoaXMuaGFuZGxlck1hcC5maW5kU3luYygoaDcpID0+IGg3Lm1ldGhvZCA9PT0gbWV0aG9kQXJnKTsKICAgIGlmIChoYW5kbGVyMikKICAgICAgcmV0dXJuIHsgaGFuZGxlcjogaGFuZGxlcjIsIHJvdXRlcjogdGhpcyB9OwogICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLnJvdXRlck1hcC5nZXRBcnJheSgpKSB7CiAgICAgIGlmICghY2hlY2tlZFJvdXRlcnMuaW5jbHVkZXMoY2hpbGQpKSB7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gY2hpbGQuZ2V0VHlwZWRIYW5kbGVyQW5kUm91dGVyKG1ldGhvZEFyZywgY2hlY2tlZFJvdXRlcnMpOwogICAgICAgIGlmIChyZXN1bHQpCiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgc3RhdGljIHsKICAgIHRoaXMuZGVmYXVsdFJvdXRlT3B0aW9ucyA9IHsKICAgICAgbG9jYWxSZXF1ZXN0OiBmYWxzZSwKICAgICAgc2tpcEhvb2tzOiBmYWxzZQogICAgfTsKICB9CiAgLyoqCiAgICogaWYgdHlwZWRyZXF1ZXN0IG9iamVjdCBoYXMgY29ycmVsYXRpb24ucGhhc2UgPT09ICdyZXF1ZXN0JyAtPiByb3V0ZXMgYSB0eXBlZCByZXF1ZXN0IG9iamVjdCB0byBhIGhhbmRsZXIKICAgKiBpZiB0eXBlZHJlcXVlc3Qgb2JqZWN0IGhhcyBjb3JyZWxhdGlvbi5waGFzZSA9PT0gJ3Jlc3BvbnNlJyAtPiByb3V0ZXMgYSB0eXBlZCByZXF1ZXN0IG9iamVjdCB0byByZXF1ZXN0IGZpcmUgZXZlbnQKICAgKiBAcGFyYW0gdHlwZWRSZXF1ZXN0QXJnCiAgICogQHBhcmFtIG9wdGlvbnNBcmcgLSBPcHRpb25zIG9iamVjdCB3aXRoOgogICAqICAgLSBsb2NhbFJlcXVlc3Q6IHRyZWF0IGFzIGxvY2FsIHJlcXVlc3QgKGRlZmF1bHQ6IGZhbHNlKQogICAqICAgLSBza2lwSG9va3M6IHNraXAgY2FsbGluZyBob29rcyBmb3IgdGhpcyByb3V0aW5nIChkZWZhdWx0OiBmYWxzZSwgdXNlIGZvciBicm9hZGNhc3QtcmVjZWl2ZWQgbWVzc2FnZXMpCiAgICovCiAgYXN5bmMgcm91dGVBbmRBZGRSZXNwb25zZSh0eXBlZFJlcXVlc3RBcmcsIG9wdGlvbnNBcmcgPSB7fSkgewogICAgY29uc3Qgb3B0aW9ucyA9IHsgLi4uX1R5cGVkUm91dGVyLmRlZmF1bHRSb3V0ZU9wdGlvbnMsIC4uLm9wdGlvbnNBcmcgfTsKICAgIHR5cGVkUmVxdWVzdEFyZyA9IFZpcnR1YWxTdHJlYW0uZGVjb2RlUGF5bG9hZEZyb21OZXR3b3JrKHR5cGVkUmVxdWVzdEFyZywgewogICAgICB0eXBlZHJvdXRlcjogdGhpcwogICAgfSk7CiAgICB0eXBlZFJlcXVlc3RBcmcubG9jYWxEYXRhID0gdHlwZWRSZXF1ZXN0QXJnLmxvY2FsRGF0YSB8fCB7fTsKICAgIHR5cGVkUmVxdWVzdEFyZy5sb2NhbERhdGEuZmlyc3RUeXBlZHJvdXRlciA9IHRoaXM7CiAgICBpZiAodHlwZWRSZXF1ZXN0QXJnLm1ldGhvZCA9PT0gIiMjVmlydHVhbFN0cmVhbSMjIikgewogICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmhhbmRsZVN0cmVhbVR5cGVkUmVxdWVzdCh0eXBlZFJlcXVlc3RBcmcpOwogICAgICByZXN1bHQubG9jYWxEYXRhID0gbnVsbDsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGlmICh0eXBlZFJlcXVlc3RBcmc/LmNvcnJlbGF0aW9uPy5waGFzZSA9PT0gInJlcXVlc3QiIHx8IG9wdGlvbnMubG9jYWxSZXF1ZXN0KSB7CiAgICAgIGNvbnN0IHJlcXVlc3RTdGFydFRpbWUgPSBEYXRlLm5vdygpOwogICAgICBpZiAoIW9wdGlvbnMuc2tpcEhvb2tzKSB7CiAgICAgICAgdGhpcy5jYWxsSG9vaygib25JbmNvbWluZ1JlcXVlc3QiLCB7CiAgICAgICAgICBjb3JyZWxhdGlvbklkOiB0eXBlZFJlcXVlc3RBcmcuY29ycmVsYXRpb24/LmlkIHx8ICJ1bmtub3duIiwKICAgICAgICAgIG1ldGhvZDogdHlwZWRSZXF1ZXN0QXJnLm1ldGhvZCwKICAgICAgICAgIGRpcmVjdGlvbjogImluY29taW5nIiwKICAgICAgICAgIHBoYXNlOiAicmVxdWVzdCIsCiAgICAgICAgICB0aW1lc3RhbXA6IHJlcXVlc3RTdGFydFRpbWUsCiAgICAgICAgICBwYXlsb2FkOiB0eXBlZFJlcXVlc3RBcmcucmVxdWVzdAogICAgICAgIH0pOwogICAgICB9CiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZ2V0VHlwZWRIYW5kbGVyQW5kUm91dGVyKHR5cGVkUmVxdWVzdEFyZy5tZXRob2QpOwogICAgICBpZiAoIXJlc3VsdCkgewogICAgICAgIGNvbnNvbGUubG9nKGBDYW5ub3QgZmluZCBoYW5kbGVyIGZvciBtZXRob2RuYW1lICR7dHlwZWRSZXF1ZXN0QXJnLm1ldGhvZH1gKTsKICAgICAgICB0eXBlZFJlcXVlc3RBcmcuZXJyb3IgPSB7CiAgICAgICAgICB0ZXh0OiAiVGhlcmUgaXMgbm8gYXZhaWxhYmxlIG1ldGhvZCBmb3IgdGhpcyBjYWxsIG9uIHRoZSBzZXJ2ZXIgc2lkZSIsCiAgICAgICAgICBkYXRhOiB7fQogICAgICAgIH07CiAgICAgICAgdHlwZWRSZXF1ZXN0QXJnLmNvcnJlbGF0aW9uLnBoYXNlID0gInJlc3BvbnNlIjsKICAgICAgICB0eXBlZFJlcXVlc3RBcmcubG9jYWxEYXRhID0gbnVsbDsKICAgICAgICB0eXBlZFJlcXVlc3RBcmcgPSBWaXJ0dWFsU3RyZWFtLmVuY29kZVBheWxvYWRGb3JOZXR3b3JrKHR5cGVkUmVxdWVzdEFyZywgewogICAgICAgICAgdHlwZWRyb3V0ZXI6IHRoaXMKICAgICAgICB9KTsKICAgICAgICBpZiAoIW9wdGlvbnMuc2tpcEhvb2tzKSB7CiAgICAgICAgICB0aGlzLmNhbGxIb29rKCJvbk91dGdvaW5nUmVzcG9uc2UiLCB7CiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHR5cGVkUmVxdWVzdEFyZy5jb3JyZWxhdGlvbj8uaWQgfHwgInVua25vd24iLAogICAgICAgICAgICBtZXRob2Q6IHR5cGVkUmVxdWVzdEFyZy5tZXRob2QsCiAgICAgICAgICAgIGRpcmVjdGlvbjogIm91dGdvaW5nIiwKICAgICAgICAgICAgcGhhc2U6ICJyZXNwb25zZSIsCiAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSwKICAgICAgICAgICAgZHVyYXRpb25NczogRGF0ZS5ub3coKSAtIHJlcXVlc3RTdGFydFRpbWUsCiAgICAgICAgICAgIHBheWxvYWQ6IHR5cGVkUmVxdWVzdEFyZy5yZXNwb25zZSwKICAgICAgICAgICAgZXJyb3I6IHR5cGVkUmVxdWVzdEFyZy5lcnJvcj8udGV4dAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0eXBlZFJlcXVlc3RBcmc7CiAgICAgIH0KICAgICAgY29uc3QgeyBoYW5kbGVyOiB0eXBlZEhhbmRsZXIsIHJvdXRlcjogb3duaW5nUm91dGVyIH0gPSByZXN1bHQ7CiAgICAgIGlmIChvd25pbmdSb3V0ZXIubWlkZGxld2FyZXMubGVuZ3RoID4gMCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBmb3IgKGNvbnN0IG13IG9mIG93bmluZ1JvdXRlci5taWRkbGV3YXJlcykgewogICAgICAgICAgICBhd2FpdCBtdyh0eXBlZFJlcXVlc3RBcmcpOwogICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKGUxMCkgewogICAgICAgICAgaWYgKGUxMCBpbnN0YW5jZW9mIFR5cGVkUmVzcG9uc2VFcnJvcikgewogICAgICAgICAgICB0eXBlZFJlcXVlc3RBcmcuZXJyb3IgPSB7IHRleHQ6IGUxMC5lcnJvclRleHQsIGRhdGE6IGUxMC5lcnJvckRhdGEgfHwge30gfTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHR5cGVkUmVxdWVzdEFyZy5lcnJvciA9IHsgdGV4dDogZTEwLm1lc3NhZ2UgfHwgIk1pZGRsZXdhcmUgZXJyb3IiLCBkYXRhOiB7fSB9OwogICAgICAgICAgfQogICAgICAgICAgdHlwZWRSZXF1ZXN0QXJnLmNvcnJlbGF0aW9uLnBoYXNlID0gInJlc3BvbnNlIjsKICAgICAgICAgIHR5cGVkUmVxdWVzdEFyZy5sb2NhbERhdGEgPSBudWxsOwogICAgICAgICAgdHlwZWRSZXF1ZXN0QXJnID0gVmlydHVhbFN0cmVhbS5lbmNvZGVQYXlsb2FkRm9yTmV0d29yayh0eXBlZFJlcXVlc3RBcmcsIHsKICAgICAgICAgICAgdHlwZWRyb3V0ZXI6IHRoaXMKICAgICAgICAgIH0pOwogICAgICAgICAgaWYgKCFvcHRpb25zLnNraXBIb29rcykgewogICAgICAgICAgICB0aGlzLmNhbGxIb29rKCJvbk91dGdvaW5nUmVzcG9uc2UiLCB7CiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogdHlwZWRSZXF1ZXN0QXJnLmNvcnJlbGF0aW9uPy5pZCB8fCAidW5rbm93biIsCiAgICAgICAgICAgICAgbWV0aG9kOiB0eXBlZFJlcXVlc3RBcmcubWV0aG9kLAogICAgICAgICAgICAgIGRpcmVjdGlvbjogIm91dGdvaW5nIiwKICAgICAgICAgICAgICBwaGFzZTogInJlc3BvbnNlIiwKICAgICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksCiAgICAgICAgICAgICAgZHVyYXRpb25NczogRGF0ZS5ub3coKSAtIHJlcXVlc3RTdGFydFRpbWUsCiAgICAgICAgICAgICAgcGF5bG9hZDogdHlwZWRSZXF1ZXN0QXJnLnJlc3BvbnNlLAogICAgICAgICAgICAgIGVycm9yOiB0eXBlZFJlcXVlc3RBcmcuZXJyb3I/LnRleHQKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdHlwZWRSZXF1ZXN0QXJnOwogICAgICAgIH0KICAgICAgfQogICAgICB0eXBlZFJlcXVlc3RBcmcgPSBhd2FpdCB0eXBlZEhhbmRsZXIuYWRkUmVzcG9uc2UodHlwZWRSZXF1ZXN0QXJnKTsKICAgICAgdHlwZWRSZXF1ZXN0QXJnLmxvY2FsRGF0YSA9IG51bGw7CiAgICAgIHR5cGVkUmVxdWVzdEFyZyA9IFZpcnR1YWxTdHJlYW0uZW5jb2RlUGF5bG9hZEZvck5ldHdvcmsodHlwZWRSZXF1ZXN0QXJnLCB7CiAgICAgICAgdHlwZWRyb3V0ZXI6IHRoaXMKICAgICAgfSk7CiAgICAgIGlmICghb3B0aW9ucy5za2lwSG9va3MpIHsKICAgICAgICB0aGlzLmNhbGxIb29rKCJvbk91dGdvaW5nUmVzcG9uc2UiLCB7CiAgICAgICAgICBjb3JyZWxhdGlvbklkOiB0eXBlZFJlcXVlc3RBcmcuY29ycmVsYXRpb24/LmlkIHx8ICJ1bmtub3duIiwKICAgICAgICAgIG1ldGhvZDogdHlwZWRSZXF1ZXN0QXJnLm1ldGhvZCwKICAgICAgICAgIGRpcmVjdGlvbjogIm91dGdvaW5nIiwKICAgICAgICAgIHBoYXNlOiAicmVzcG9uc2UiLAogICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLAogICAgICAgICAgZHVyYXRpb25NczogRGF0ZS5ub3coKSAtIHJlcXVlc3RTdGFydFRpbWUsCiAgICAgICAgICBwYXlsb2FkOiB0eXBlZFJlcXVlc3RBcmcucmVzcG9uc2UsCiAgICAgICAgICBlcnJvcjogdHlwZWRSZXF1ZXN0QXJnLmVycm9yPy50ZXh0CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHR5cGVkUmVxdWVzdEFyZzsKICAgIH0gZWxzZSBpZiAodHlwZWRSZXF1ZXN0QXJnPy5jb3JyZWxhdGlvbj8ucGhhc2UgPT09ICJyZXNwb25zZSIpIHsKICAgICAgaWYgKCFvcHRpb25zLnNraXBIb29rcykgewogICAgICAgIHRoaXMuY2FsbEhvb2soIm9uSW5jb21pbmdSZXNwb25zZSIsIHsKICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHR5cGVkUmVxdWVzdEFyZy5jb3JyZWxhdGlvbj8uaWQgfHwgInVua25vd24iLAogICAgICAgICAgbWV0aG9kOiB0eXBlZFJlcXVlc3RBcmcubWV0aG9kLAogICAgICAgICAgZGlyZWN0aW9uOiAiaW5jb21pbmciLAogICAgICAgICAgcGhhc2U6ICJyZXNwb25zZSIsCiAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksCiAgICAgICAgICBwYXlsb2FkOiB0eXBlZFJlcXVlc3RBcmcucmVzcG9uc2UsCiAgICAgICAgICBlcnJvcjogdHlwZWRSZXF1ZXN0QXJnLmVycm9yPy50ZXh0CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgdGhpcy5maXJlRXZlbnRJbnRlcmVzdE1hcC5maW5kSW50ZXJlc3QodHlwZWRSZXF1ZXN0QXJnLmNvcnJlbGF0aW9uLmlkKT8uZnVsbGZpbGxJbnRlcmVzdCh0eXBlZFJlcXVlc3RBcmcpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnNvbGUubG9nKCJyZWNlaXZlZCB3ZWlyZGx5IHNoYXBlZCByZXF1ZXN0Iik7CiAgICAgIGNvbnNvbGUubG9nKHR5cGVkUmVxdWVzdEFyZyk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KICAvKioKICAgKiBoYW5kbGUgc3RyZWFtaW5nCiAgICogQHBhcmFtIHN0cmVhbVRyQXJnCiAgICovCiAgYXN5bmMgaGFuZGxlU3RyZWFtVHlwZWRSZXF1ZXN0KHN0cmVhbVRyQXJnKSB7CiAgICBjb25zdCByZWxldmFudFZpcnR1YWxTdHJlYW0gPSBhd2FpdCB0aGlzLnJlZ2lzdGVyZWRWaXJ0dWFsU3RyZWFtcy5maW5kKGFzeW5jICh2aXJ0dWFsU3RyZWFtQXJnKSA9PiB7CiAgICAgIHJldHVybiB2aXJ0dWFsU3RyZWFtQXJnLnN0cmVhbUlkID09PSBzdHJlYW1UckFyZy5yZXF1ZXN0LnN0cmVhbUlkOwogICAgfSk7CiAgICBpZiAoIXJlbGV2YW50VmlydHVhbFN0cmVhbSkgewogICAgICBjb25zb2xlLmxvZyhgbm8gcmVsZXZhbnQgdmlydHVhbCBzdHJlYW0gZm91bmQgZm9yIHN0cmVhbSB3aXRoIGlkICR7c3RyZWFtVHJBcmcucmVxdWVzdC5zdHJlYW1JZH1gKTsKICAgICAgY29uc29sZS5sb2codGhpcy5yZWdpc3RlcmVkVmlydHVhbFN0cmVhbXMuZ2V0QXJyYXkoKSk7CiAgICAgIHJldHVybiBzdHJlYW1UckFyZzsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnNvbGUubG9nKGBzdWNjZXNzOiBmb3VuZCByZWxldmFudCB2aXJ0dWFsIHN0cmVhbSB3aXRoIGlkICR7c3RyZWFtVHJBcmcucmVxdWVzdC5zdHJlYW1JZH1gKTsKICAgIH0KICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlbGV2YW50VmlydHVhbFN0cmVhbS5oYW5kbGVTdHJlYW1UcihzdHJlYW1UckFyZyk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AYXBpLmdsb2JhbCt0eXBlZHJlcXVlc3RAMy4zLjAvbm9kZV9tb2R1bGVzL0BhcGkuZ2xvYmFsL3R5cGVkcmVxdWVzdC9kaXN0X3RzL2NsYXNzZXMudmlydHVhbHN0cmVhbS5qcwp2YXIgY2xvc2luZ0JpdCA9ICIjIyMjIyMjIyMjIyMjQ0xPU0lORyBCSVQjIyMjIyMjIyMjIyMjIjsKdmFyIFZpcnR1YWxTdHJlYW0gPSBjbGFzcyBfVmlydHVhbFN0cmVhbSB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiVmlydHVhbFN0cmVhbSIpOwogIH0KICAvLyBTVEFUSUMKICBzdGF0aWMgZW5jb2RlUGF5bG9hZEZvck5ldHdvcmsob2JqZWN0UGF5bG9hZCwgY29tbUZ1bmN0aW9ucywgb3JpZ2luYWxQYXlsb2FkLCBwYXRoMiA9IFtdKSB7CiAgICBpZiAoIW9iamVjdFBheWxvYWQpIHsKICAgICAgcmV0dXJuIG9iamVjdFBheWxvYWQ7CiAgICB9CiAgICBpZiAoZGlzdF90c19leHBvcnRzOC5pc0J1ZmZlckxpa2Uob2JqZWN0UGF5bG9hZCkpIHsKICAgICAgcmV0dXJuIG9iamVjdFBheWxvYWQ7CiAgICB9CiAgICBpZiAob2JqZWN0UGF5bG9hZCBpbnN0YW5jZW9mIF9WaXJ0dWFsU3RyZWFtKSB7CiAgICAgIGlmICghb2JqZWN0UGF5bG9hZC5zaWRlICYmIGNvbW1GdW5jdGlvbnMuc2VuZE1ldGhvZCkgewogICAgICAgIG9iamVjdFBheWxvYWQuc2lkZSA9ICJyZXF1ZXN0aW5nIjsKICAgICAgICBvYmplY3RQYXlsb2FkLnNlbmRNZXRob2QgPSBjb21tRnVuY3Rpb25zLnNlbmRNZXRob2Q7CiAgICAgIH0KICAgICAgaWYgKCFvYmplY3RQYXlsb2FkLnNpZGUgJiYgY29tbUZ1bmN0aW9ucy50eXBlZHJvdXRlcikgewogICAgICAgIG9iamVjdFBheWxvYWQuc2lkZSA9ICJyZXNwb25kaW5nIjsKICAgICAgICBvYmplY3RQYXlsb2FkLnR5cGVkcm91dGVyID0gY29tbUZ1bmN0aW9ucy50eXBlZHJvdXRlcjsKICAgICAgICBjb21tRnVuY3Rpb25zLnR5cGVkcm91dGVyLnJlZ2lzdGVyZWRWaXJ0dWFsU3RyZWFtcy5hZGQob2JqZWN0UGF5bG9hZCk7CiAgICAgIH0KICAgICAgaWYgKCFvcmlnaW5hbFBheWxvYWQucmVzcG9uc2UgfHwgcGF0aDIuaW5jbHVkZXMoInJlc3BvbnNlIikpIHsKICAgICAgICBvYmplY3RQYXlsb2FkLnN0YXJ0S2VlcEFsaXZlTG9vcCgpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICBfaXNWaXJ0dWFsU3RyZWFtOiB0cnVlLAogICAgICAgICAgc3RyZWFtSWQ6IG9iamVjdFBheWxvYWQuc3RyZWFtSWQKICAgICAgICB9OwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICBfT0JNSVRURURfVklSVFVBTF9TVFJFQU06IHRydWUsCiAgICAgICAgICByZWFzb246ICJwYXRoIGlzIHVuZGVyIC5yZXF1ZXN0OiBvYm1pdHRlZCBmb3IgZGVkdXBsaWNhdGlvbiByZWFzb25zIGluIHJlc3BvbnNlIGN5Y2xlLiIKICAgICAgICB9OwogICAgICB9CiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0UGF5bG9hZCkpIHsKICAgICAgcmV0dXJuIG9iamVjdFBheWxvYWQubWFwKChpdGVtLCBpbmRleDIpID0+IF9WaXJ0dWFsU3RyZWFtLmVuY29kZVBheWxvYWRGb3JOZXR3b3JrKAogICAgICAgIGl0ZW0sCiAgICAgICAgY29tbUZ1bmN0aW9ucywKICAgICAgICBvcmlnaW5hbFBheWxvYWQgfHwgb2JqZWN0UGF5bG9hZCwKICAgICAgICBwYXRoMi5jb25jYXQoU3RyaW5nKGluZGV4MikpCiAgICAgICAgLy8gQ29udmVydCBpbmRleCB0byBzdHJpbmcgYW5kIGNvbmNhdGVuYXRlIHRvIHBhdGgKICAgICAgKSk7CiAgICB9IGVsc2UgaWYgKG9iamVjdFBheWxvYWQgIT09IG51bGwgJiYgdHlwZW9mIG9iamVjdFBheWxvYWQgPT09ICJvYmplY3QiKSB7CiAgICAgIHJldHVybiBPYmplY3QuZW50cmllcyhvYmplY3RQYXlsb2FkKS5yZWR1Y2UoKGFjYywgW2tleTIsIHZhbHVlMl0pID0+IHsKICAgICAgICBjb25zdCBuZXdQYXRoID0gcGF0aDIuY29uY2F0KGtleTIpOwogICAgICAgIGFjY1trZXkyXSA9IF9WaXJ0dWFsU3RyZWFtLmVuY29kZVBheWxvYWRGb3JOZXR3b3JrKHZhbHVlMiwgY29tbUZ1bmN0aW9ucywgb3JpZ2luYWxQYXlsb2FkIHx8IG9iamVjdFBheWxvYWQsIG5ld1BhdGgpOwogICAgICAgIHJldHVybiBhY2M7CiAgICAgIH0sIHt9KTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBvYmplY3RQYXlsb2FkOwogICAgfQogIH0KICBzdGF0aWMgZGVjb2RlUGF5bG9hZEZyb21OZXR3b3JrKG9iamVjdFBheWxvYWQsIGNvbW1GdW5jdGlvbnMpIHsKICAgIGlmIChkaXN0X3RzX2V4cG9ydHM4LmlzQnVmZmVyTGlrZShvYmplY3RQYXlsb2FkKSB8fCBvYmplY3RQYXlsb2FkIGluc3RhbmNlb2YgVHlwZWRSb3V0ZXIpIHsKICAgICAgcmV0dXJuIG9iamVjdFBheWxvYWQ7CiAgICB9CiAgICBpZiAob2JqZWN0UGF5bG9hZCAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqZWN0UGF5bG9hZCA9PT0gIm9iamVjdCIpIHsKICAgICAgaWYgKG9iamVjdFBheWxvYWQgaW5zdGFuY2VvZiBTZXQgfHwgb2JqZWN0UGF5bG9hZCBpbnN0YW5jZW9mIE1hcCB8fCBvYmplY3RQYXlsb2FkIGluc3RhbmNlb2YgRGF0ZSB8fCBvYmplY3RQYXlsb2FkIGluc3RhbmNlb2YgUmVnRXhwIHx8IG9iamVjdFBheWxvYWQgaW5zdGFuY2VvZiBFcnJvciB8fCBvYmplY3RQYXlsb2FkIGluc3RhbmNlb2YgUHJvbWlzZSB8fCB0eXBlb2Ygb2JqZWN0UGF5bG9hZC50aGVuID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgcmV0dXJuIG9iamVjdFBheWxvYWQ7CiAgICAgIH0KICAgICAgaWYgKG9iamVjdFBheWxvYWQuX2lzVmlydHVhbFN0cmVhbSkgewogICAgICAgIGNvbnN0IHZpcnR1YWxTdHJlYW0gPSBuZXcgX1ZpcnR1YWxTdHJlYW0oKTsKICAgICAgICB2aXJ0dWFsU3RyZWFtLnN0cmVhbUlkID0gb2JqZWN0UGF5bG9hZC5zdHJlYW1JZDsKICAgICAgICBpZiAoIXZpcnR1YWxTdHJlYW0uc2lkZSAmJiBjb21tRnVuY3Rpb25zLnNlbmRNZXRob2QpIHsKICAgICAgICAgIHZpcnR1YWxTdHJlYW0uc2lkZSA9ICJyZXF1ZXN0aW5nIjsKICAgICAgICAgIHZpcnR1YWxTdHJlYW0uc2VuZE1ldGhvZCA9IGNvbW1GdW5jdGlvbnMuc2VuZE1ldGhvZDsKICAgICAgICB9CiAgICAgICAgaWYgKCF2aXJ0dWFsU3RyZWFtLnNpZGUgJiYgY29tbUZ1bmN0aW9ucy50eXBlZHJvdXRlcikgewogICAgICAgICAgdmlydHVhbFN0cmVhbS5zaWRlID0gInJlc3BvbmRpbmciOwogICAgICAgICAgdmlydHVhbFN0cmVhbS50eXBlZHJvdXRlciA9IGNvbW1GdW5jdGlvbnMudHlwZWRyb3V0ZXI7CiAgICAgICAgICBjb21tRnVuY3Rpb25zLnR5cGVkcm91dGVyLnJlZ2lzdGVyZWRWaXJ0dWFsU3RyZWFtcy5hZGQodmlydHVhbFN0cmVhbSk7CiAgICAgICAgfQogICAgICAgIHZpcnR1YWxTdHJlYW0uc3RhcnRLZWVwQWxpdmVMb29wKCk7CiAgICAgICAgcmV0dXJuIHZpcnR1YWxTdHJlYW07CiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvYmplY3RQYXlsb2FkKSkgewogICAgICAgIGNvbnN0IHJldHVybkFycmF5ID0gW107CiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG9iamVjdFBheWxvYWQpIHsKICAgICAgICAgIHJldHVybkFycmF5LnB1c2goX1ZpcnR1YWxTdHJlYW0uZGVjb2RlUGF5bG9hZEZyb21OZXR3b3JrKGl0ZW0sIGNvbW1GdW5jdGlvbnMpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldHVybkFycmF5OwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmplY3RQYXlsb2FkKS5yZWR1Y2UoKGFjYywga2V5MikgPT4gewogICAgICAgICAgYWNjW2tleTJdID0gX1ZpcnR1YWxTdHJlYW0uZGVjb2RlUGF5bG9hZEZyb21OZXR3b3JrKG9iamVjdFBheWxvYWRba2V5Ml0sIGNvbW1GdW5jdGlvbnMpOwogICAgICAgICAgcmV0dXJuIGFjYzsKICAgICAgICB9LCB7fSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBvYmplY3RQYXlsb2FkOwogICAgfQogIH0KICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMuc3RyZWFtSWQgPSBpc291bmlxdWUyLnVuaSgpOwogICAgdGhpcy5rZWVwQWxpdmUgPSB0cnVlOwogICAgdGhpcy5zZW5kQmFja3ByZXNzdXJlZEFycmF5ID0gbmV3IGRpc3RfdHNfZXhwb3J0czYuQmFja3ByZXNzdXJlZEFycmF5KDE2KTsKICAgIHRoaXMucmVjZWl2ZUJhY2twcmVzc3VyZWRBcnJheSA9IG5ldyBkaXN0X3RzX2V4cG9ydHM2LkJhY2twcmVzc3VyZWRBcnJheSgxNik7CiAgfQogIC8qKgogICAqIFJlY29uc3RpdHV0ZSBiaW5hcnkgZGF0YSB0aGF0IHdhcyBsb3N0IHRocm91Z2ggSlNPTiBzZXJpYWxpemF0aW9uLgogICAqIE5vZGUuanMgQnVmZmVyIGJlY29tZXMge3R5cGU6ICJCdWZmZXIiLCBkYXRhOiBbLi4uXX0sCiAgICogVWludDhBcnJheSBiZWNvbWVzIHsiMCI6IDEwNCwgIjEiOiAxMDEsIC4uLn0uCiAgICovCiAgc3RhdGljIHJlY29uc3RpdHV0ZUJpbmFyeURhdGEoZGF0YSkgewogICAgaWYgKGRhdGEgPT0gbnVsbCB8fCBkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSB8fCB0eXBlb2YgQnVmZmVyICE9PSAidW5kZWZpbmVkIiAmJiBCdWZmZXIuaXNCdWZmZXIoZGF0YSkpIHsKICAgICAgcmV0dXJuIGRhdGE7CiAgICB9CiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICJvYmplY3QiKSB7CiAgICAgIGlmIChkYXRhLnR5cGUgPT09ICJCdWZmZXIiICYmIEFycmF5LmlzQXJyYXkoZGF0YS5kYXRhKSkgewogICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShkYXRhLmRhdGEpOwogICAgICB9CiAgICAgIGNvbnN0IGtleXMyID0gT2JqZWN0LmtleXMoZGF0YSk7CiAgICAgIGlmIChrZXlzMi5sZW5ndGggPiAwICYmIGtleXMyLmV2ZXJ5KChrMykgPT4gL15cZCskLy50ZXN0KGszKSkpIHsKICAgICAgICBjb25zdCBhcnIgPSBuZXcgQXJyYXkoa2V5czIubGVuZ3RoKTsKICAgICAgICBmb3IgKGNvbnN0IGszIG9mIGtleXMyKSB7CiAgICAgICAgICBhcnJbTnVtYmVyKGszKV0gPSBkYXRhW2szXTsKICAgICAgICB9CiAgICAgICAgaWYgKGFyci5ldmVyeSgodjQpID0+IHR5cGVvZiB2NCA9PT0gIm51bWJlciIpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYXJyKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBkYXRhOwogIH0KICAvKioKICAgKiB0YWtlcyBjYXJlIG9mIHNlbmRpbmcKICAgKi8KICBhc3luYyB3b3JrT25RdWV1ZSgpIHsKICAgIGlmICh0aGlzLndvcmtpbmdEZWZlcnJlZCkgewogICAgICByZXR1cm4gdGhpcy53b3JraW5nRGVmZXJyZWQucHJvbWlzZTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMud29ya2luZ0RlZmVycmVkID0gZGlzdF90c19leHBvcnRzLmRlZmVyKCk7CiAgICB9CiAgICBpZiAodGhpcy5zaWRlID09PSAicmVxdWVzdGluZyIpIHsKICAgICAgbGV0IHRoaXNTaWRlSXNCYWNrcHJlc3N1cmVkID0gIXRoaXMucmVjZWl2ZUJhY2twcmVzc3VyZWRBcnJheS5jaGVja1NwYWNlQXZhaWxhYmxlKCk7CiAgICAgIGxldCBvdGhlclNpZGVIYXNOZXh0ID0gZmFsc2U7CiAgICAgIGxldCBvdGhlclNpZGVJc0JhY2twcmVzc3VyZWQgPSBmYWxzZTsKICAgICAgY29uc3QgZ2V0RmVlZGJhY2sgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGFzeW5jICgpID0+IHsKICAgICAgICBjb25zdCBzdHJlYW1UciA9IGF3YWl0IHRoaXMuc2VuZE1ldGhvZCh7CiAgICAgICAgICBtZXRob2Q6ICIjI1ZpcnR1YWxTdHJlYW0jIyIsCiAgICAgICAgICByZXF1ZXN0OiB7CiAgICAgICAgICAgIHN0cmVhbUlkOiB0aGlzLnN0cmVhbUlkLAogICAgICAgICAgICBjeWNsZUlkOiBpc291bmlxdWUyLnVuaSgpLAogICAgICAgICAgICBjeWNsZTogInJlcXVlc3QiLAogICAgICAgICAgICBtYWluUHVycG9zZTogImZlZWRiYWNrIiwKICAgICAgICAgICAgbmV4dDogdGhpcy5zZW5kQmFja3ByZXNzdXJlZEFycmF5LmRhdGEubGVuZ3RoID4gMCwKICAgICAgICAgICAgYmFja3ByZXNzdXJlOiAhdGhpcy5yZWNlaXZlQmFja3ByZXNzdXJlZEFycmF5LmNoZWNrU3BhY2VBdmFpbGFibGUoKQogICAgICAgICAgfSwKICAgICAgICAgIHJlc3BvbnNlOiBudWxsCiAgICAgICAgfSkuY2F0Y2goKCkgPT4gewogICAgICAgICAgY29uc29sZS5sb2coInN0cmVhbSBlbmRlZCBpbW1hdHVyZWx5Iik7CiAgICAgICAgICB0aGlzLmtlZXBBbGl2ZSA9IGZhbHNlOwogICAgICAgIH0pOwogICAgICAgIGlmIChzdHJlYW1UciAmJiBzdHJlYW1Uci5yZXNwb25zZSkgewogICAgICAgICAgb3RoZXJTaWRlSXNCYWNrcHJlc3N1cmVkID0gc3RyZWFtVHIucmVzcG9uc2UuYmFja3ByZXNzdXJlOwogICAgICAgICAgb3RoZXJTaWRlSGFzTmV4dCA9IHN0cmVhbVRyLnJlc3BvbnNlLm5leHQ7CiAgICAgICAgfQogICAgICB9LCAiZ2V0RmVlZGJhY2siKTsKICAgICAgYXdhaXQgZ2V0RmVlZGJhY2soKTsKICAgICAgd2hpbGUgKHRoaXMuc2VuZEJhY2twcmVzc3VyZWRBcnJheS5kYXRhLmxlbmd0aCA+IDAgfHwgb3RoZXJTaWRlSGFzTmV4dCkgewogICAgICAgIGlmIChvdGhlclNpZGVJc0JhY2twcmVzc3VyZWQpIHsKICAgICAgICAgIHdoaWxlIChvdGhlclNpZGVJc0JhY2twcmVzc3VyZWQpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coIndhaXRpbmcgZm9yIGZlZWRiYWNrIGJlY2F1c2Ugb2YgYmFja3ByZXNzdXJlLi4uIik7CiAgICAgICAgICAgIGF3YWl0IGRpc3RfdHNfZXhwb3J0czMuZGVsYXlGb3IoNTApOwogICAgICAgICAgICBhd2FpdCBnZXRGZWVkYmFjaygpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsZXQgZGF0YUFyZzsKICAgICAgICBpZiAodGhpcy5zZW5kQmFja3ByZXNzdXJlZEFycmF5LmRhdGEubGVuZ3RoID4gMCkgewogICAgICAgICAgZGF0YUFyZyA9IHRoaXMuc2VuZEJhY2twcmVzc3VyZWRBcnJheS5zaGlmdCgpOwogICAgICAgIH0KICAgICAgICBsZXQgc3RyZWFtVHI7CiAgICAgICAgc3RyZWFtVHIgPSBhd2FpdCB0aGlzLnNlbmRNZXRob2QoewogICAgICAgICAgbWV0aG9kOiAiIyNWaXJ0dWFsU3RyZWFtIyMiLAogICAgICAgICAgcmVxdWVzdDogewogICAgICAgICAgICBzdHJlYW1JZDogdGhpcy5zdHJlYW1JZCwKICAgICAgICAgICAgY3ljbGVJZDogaXNvdW5pcXVlMi51bmkoKSwKICAgICAgICAgICAgY3ljbGU6ICJyZXF1ZXN0IiwKICAgICAgICAgICAgbWFpblB1cnBvc2U6IGRhdGFBcmcgPyAiY2h1bmsiIDogInJlYWQiLAogICAgICAgICAgICBiYWNrcHJlc3N1cmU6IHRoaXNTaWRlSXNCYWNrcHJlc3N1cmVkLAogICAgICAgICAgICBuZXh0OiB0aGlzLnNlbmRCYWNrcHJlc3N1cmVkQXJyYXkuZGF0YS5sZW5ndGggPiAwLAogICAgICAgICAgICAuLi5kYXRhQXJnID8geyBjaHVua0RhdGE6IGRhdGFBcmcgfSA6IHt9CiAgICAgICAgICB9LAogICAgICAgICAgcmVzcG9uc2U6IG51bGwKICAgICAgICB9KS5jYXRjaCgoKSA9PiB7CiAgICAgICAgICBjb25zb2xlLmxvZygic3RyZWFtIGVuZGVkIGltbWF0dXJlbHkiKTsKICAgICAgICAgIHRoaXMua2VlcEFsaXZlID0gZmFsc2U7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9KTsKICAgICAgICBpZiAoc3RyZWFtVHIgJiYgc3RyZWFtVHIucmVzcG9uc2UgJiYgc3RyZWFtVHIucmVzcG9uc2UuY2h1bmtEYXRhKSB7CiAgICAgICAgICB0aGlzLnJlY2VpdmVCYWNrcHJlc3N1cmVkQXJyYXkucHVzaChfVmlydHVhbFN0cmVhbS5yZWNvbnN0aXR1dGVCaW5hcnlEYXRhKHN0cmVhbVRyLnJlc3BvbnNlLmNodW5rRGF0YSkpOwogICAgICAgIH0KICAgICAgICBvdGhlclNpZGVJc0JhY2twcmVzc3VyZWQgPSBzdHJlYW1UciAmJiBzdHJlYW1Uci5yZXNwb25zZSAmJiBzdHJlYW1Uci5yZXNwb25zZS5iYWNrcHJlc3N1cmU7CiAgICAgICAgdGhpc1NpZGVJc0JhY2twcmVzc3VyZWQgPSAhdGhpcy5yZWNlaXZlQmFja3ByZXNzdXJlZEFycmF5LmNoZWNrU3BhY2VBdmFpbGFibGUoKTsKICAgICAgICBvdGhlclNpZGVIYXNOZXh0ID0gc3RyZWFtVHIgJiYgc3RyZWFtVHIucmVzcG9uc2UgJiYgc3RyZWFtVHIucmVzcG9uc2UubmV4dDsKICAgICAgfQogICAgfQogICAgdGhpcy53b3JraW5nRGVmZXJyZWQucmVzb2x2ZSgpOwogICAgdGhpcy53b3JraW5nRGVmZXJyZWQgPSBudWxsOwogIH0KICAvKioKICAgKiBUaGlzIG1ldGhvZCBoYW5kbGVzIHRoZSBzdHJlYW0gb25seSBvbiB0aGUgcmVzcG9uZGluZyBzaWRlCiAgICogQHBhcmFtIHN0cmVhbVRyQXJnCiAgICogQHJldHVybnMKICAgKi8KICBhc3luYyBoYW5kbGVTdHJlYW1UcihzdHJlYW1UckFyZykgewogICAgaWYgKHN0cmVhbVRyQXJnLnJlcXVlc3Qua2VlcEFsaXZlID09PSB0cnVlICYmIHRoaXMua2VlcEFsaXZlID09PSB0cnVlKSB7CiAgICAgIHRoaXMubGFzdEtlZXBBbGl2ZUV2ZW50ID0gRGF0ZS5ub3coKTsKICAgIH0gZWxzZSBpZiAoc3RyZWFtVHJBcmcucmVxdWVzdC5rZWVwQWxpdmUgPT09IGZhbHNlKSB7CiAgICAgIHRoaXMua2VlcEFsaXZlID0gZmFsc2U7CiAgICB9CiAgICBpZiAoc3RyZWFtVHJBcmcucmVxdWVzdC5tYWluUHVycG9zZSA9PT0gImtlZXBBbGl2ZSIpIHsKICAgICAgc3RyZWFtVHJBcmcucmVzcG9uc2UgPSB7CiAgICAgICAgc3RyZWFtSWQ6IHRoaXMuc3RyZWFtSWQsCiAgICAgICAgY3ljbGVJZDogc3RyZWFtVHJBcmcucmVxdWVzdC5jeWNsZUlkLAogICAgICAgIGN5Y2xlOiAicmVzcG9uc2UiLAogICAgICAgIG1haW5QdXJwb3NlOiAia2VlcEFsaXZlIiwKICAgICAgICBrZWVwQWxpdmU6IHRoaXMua2VlcEFsaXZlLAogICAgICAgIG5leHQ6IHRoaXMuc2VuZEJhY2twcmVzc3VyZWRBcnJheS5kYXRhLmxlbmd0aCA+IDAsCiAgICAgICAgYmFja3ByZXNzdXJlOiAhdGhpcy5yZWNlaXZlQmFja3ByZXNzdXJlZEFycmF5LmNoZWNrU3BhY2VBdmFpbGFibGUoKQogICAgICB9OwogICAgfQogICAgaWYgKHN0cmVhbVRyQXJnLnJlcXVlc3QubWFpblB1cnBvc2UgPT09ICJmZWVkYmFjayIpIHsKICAgICAgc3RyZWFtVHJBcmcucmVzcG9uc2UgPSB7CiAgICAgICAgc3RyZWFtSWQ6IHRoaXMuc3RyZWFtSWQsCiAgICAgICAgY3ljbGVJZDogc3RyZWFtVHJBcmcucmVxdWVzdC5jeWNsZUlkLAogICAgICAgIGN5Y2xlOiAicmVzcG9uc2UiLAogICAgICAgIG1haW5QdXJwb3NlOiAiZmVlZGJhY2siLAogICAgICAgIG5leHQ6IHRoaXMuc2VuZEJhY2twcmVzc3VyZWRBcnJheS5kYXRhLmxlbmd0aCA+IDAsCiAgICAgICAgYmFja3ByZXNzdXJlOiAhdGhpcy5yZWNlaXZlQmFja3ByZXNzdXJlZEFycmF5LmNoZWNrU3BhY2VBdmFpbGFibGUoKQogICAgICB9OwogICAgfQogICAgaWYgKHN0cmVhbVRyQXJnLnJlcXVlc3QubWFpblB1cnBvc2UgPT09ICJjaHVuayIpIHsKICAgICAgdGhpcy5yZWNlaXZlQmFja3ByZXNzdXJlZEFycmF5LnB1c2goX1ZpcnR1YWxTdHJlYW0ucmVjb25zdGl0dXRlQmluYXJ5RGF0YShzdHJlYW1UckFyZy5yZXF1ZXN0LmNodW5rRGF0YSkpOwogICAgICBpZiAodGhpcy5zZW5kQmFja3ByZXNzdXJlZEFycmF5LmRhdGEubGVuZ3RoID4gMCAmJiBzdHJlYW1UckFyZy5yZXNwb25zZS5iYWNrcHJlc3N1cmUgPT09IGZhbHNlKSB7CiAgICAgICAgY29uc3QgZGF0YUFyZyA9IHRoaXMuc2VuZEJhY2twcmVzc3VyZWRBcnJheS5zaGlmdCgpOwogICAgICAgIHN0cmVhbVRyQXJnLnJlc3BvbnNlID0gewogICAgICAgICAgc3RyZWFtSWQ6IHRoaXMuc3RyZWFtSWQsCiAgICAgICAgICBjeWNsZUlkOiBzdHJlYW1UckFyZy5yZXF1ZXN0LmN5Y2xlSWQsCiAgICAgICAgICBjeWNsZTogInJlc3BvbnNlIiwKICAgICAgICAgIG1haW5QdXJwb3NlOiAiY2h1bmsiLAogICAgICAgICAgbmV4dDogdGhpcy5zZW5kQmFja3ByZXNzdXJlZEFycmF5LmRhdGEubGVuZ3RoID4gMSwKICAgICAgICAgIC8vIDEgYW5kIG5vdCAwIGJlY2F1c2Ugd2UgY2FsbCBzaGlmdCBhIGZldyBsaW5lcyBkb3duCiAgICAgICAgICBiYWNrcHJlc3N1cmU6ICF0aGlzLnJlY2VpdmVCYWNrcHJlc3N1cmVkQXJyYXkuY2hlY2tTcGFjZUF2YWlsYWJsZSgpLAogICAgICAgICAgY2h1bmtEYXRhOiB0aGlzLnNlbmRCYWNrcHJlc3N1cmVkQXJyYXkuc2hpZnQoKQogICAgICAgIH07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RyZWFtVHJBcmcucmVzcG9uc2UgPSB7CiAgICAgICAgICBzdHJlYW1JZDogdGhpcy5zdHJlYW1JZCwKICAgICAgICAgIGN5Y2xlSWQ6IHN0cmVhbVRyQXJnLnJlcXVlc3QuY3ljbGVJZCwKICAgICAgICAgIGN5Y2xlOiAicmVzcG9uc2UiLAogICAgICAgICAgbWFpblB1cnBvc2U6ICJmZWVkYmFjayIsCiAgICAgICAgICBuZXh0OiB0aGlzLnNlbmRCYWNrcHJlc3N1cmVkQXJyYXkuZGF0YS5sZW5ndGggPiAwLAogICAgICAgICAgYmFja3ByZXNzdXJlOiAhdGhpcy5yZWNlaXZlQmFja3ByZXNzdXJlZEFycmF5LmNoZWNrU3BhY2VBdmFpbGFibGUoKQogICAgICAgIH07CiAgICAgIH0KICAgICAgc3RyZWFtVHJBcmcucmVxdWVzdCA9IG51bGw7CiAgICB9CiAgICByZXR1cm4gc3RyZWFtVHJBcmc7CiAgfQogIC8vIGxpZmVjeWNsZSBtZXRob2RzCiAgLyoqCiAgICogY2xvc2VzIHRoZSB2aXJ0dWFsIHN0cmVhbQogICAqLwogIGFzeW5jIGNsZWFudXAoKSB7CiAgICBpZiAodGhpcy50eXBlZHJvdXRlcikgewogICAgICB0aGlzLnR5cGVkcm91dGVyLnJlZ2lzdGVyZWRWaXJ0dWFsU3RyZWFtcy5yZW1vdmUodGhpcyk7CiAgICB9CiAgfQogIC8qKgogICAqIGEga2VlcEFsaXZlIGxvb3AgdGhhdCB3b3JrcyBhY3Jvc3MgdGVjaG5vbG9naWVzCiAgICovCiAgYXN5bmMgc3RhcnRLZWVwQWxpdmVMb29wKCkgewogICAgaWYgKHRoaXMuc2lkZSA9PT0gInJlc3BvbmRpbmciKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGF3YWl0IGRpc3RfdHNfZXhwb3J0czMuZGVsYXlGb3IoMCk7CiAgICBjb25zb2xlLmxvZyhgc3RhcnRpbmcga2VlcGFsaXZlIGxvb3Agb24gc2lkZSAke3RoaXMuc2lkZX1gKTsKICAgIGxldCBjb3VudGVyID0gMDsKICAgIGtlZXBBbGl2ZUxvb3A6IHdoaWxlICh0aGlzLmtlZXBBbGl2ZSkgewogICAgICBhd2FpdCB0aGlzLnRyaWdnZXJLZWVwQWxpdmUoKTsKICAgICAgYXdhaXQgZGlzdF90c19leHBvcnRzMy5kZWxheUZvcigxZTMpOwogICAgfQogICAgYXdhaXQgZGlzdF90c19leHBvcnRzMy5kZWxheUZvcigxZTMpOwogICAgYXdhaXQgdGhpcy5jbGVhbnVwKCk7CiAgICBjb25zb2xlLmxvZyhgY2xlYW5lZCB1cCBmb3Igc3RyZWFtICR7dGhpcy5zdHJlYW1JZH1gKTsKICB9CiAgYXN5bmMgdHJpZ2dlcktlZXBBbGl2ZSgpIHsKICAgIGlmICh0aGlzLnNpZGUgPT09ICJyZXF1ZXN0aW5nIikgewogICAgICBjb25zb2xlLmxvZyhga2VlcGFsaXZlIHNlbnQuYCk7CiAgICAgIGNvbnN0IHN0cmVhbVRyID0gYXdhaXQgdGhpcy5zZW5kTWV0aG9kKHsKICAgICAgICBtZXRob2Q6ICIjI1ZpcnR1YWxTdHJlYW0jIyIsCiAgICAgICAgcmVxdWVzdDogewogICAgICAgICAgc3RyZWFtSWQ6IHRoaXMuc3RyZWFtSWQsCiAgICAgICAgICBjeWNsZUlkOiBpc291bmlxdWUyLnVuaSgpLAogICAgICAgICAgY3ljbGU6ICJyZXF1ZXN0IiwKICAgICAgICAgIG1haW5QdXJwb3NlOiAia2VlcEFsaXZlIiwKICAgICAgICAgIGtlZXBBbGl2ZTogdGhpcy5rZWVwQWxpdmUKICAgICAgICB9LAogICAgICAgIHJlc3BvbnNlOiBudWxsCiAgICAgIH0pLmNhdGNoKCgpID0+IHsKICAgICAgICB0aGlzLmtlZXBBbGl2ZSA9IGZhbHNlOwogICAgICB9KTsKICAgICAgaWYgKHN0cmVhbVRyICYmIHN0cmVhbVRyLnJlc3BvbnNlICYmIHN0cmVhbVRyLnJlc3BvbnNlLmtlZXBBbGl2ZSA9PT0gZmFsc2UpIHsKICAgICAgICB0aGlzLmtlZXBBbGl2ZSA9IGZhbHNlOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMubGFzdEtlZXBBbGl2ZUV2ZW50ID0gRGF0ZS5ub3coKTsKICAgICAgfQogICAgICBpZiAoc3RyZWFtVHIgJiYgc3RyZWFtVHIucmVzcG9uc2UgJiYgc3RyZWFtVHIucmVzcG9uc2UubmV4dCkgewogICAgICAgIHRoaXMud29ya09uUXVldWUoKTsKICAgICAgfQogICAgfQogICAgaWYgKERhdGUubm93KCkgLSB0aGlzLmxhc3RLZWVwQWxpdmVFdmVudCA+IDFlNCkgewogICAgICBjb25zb2xlLmxvZyhgY2xvc2luZyBzdHJlYW0gZm9yICR7dGhpcy5zdHJlYW1JZH1gKTsKICAgICAgdGhpcy5rZWVwQWxpdmUgPSBmYWxzZTsKICAgIH0KICB9CiAgLy8gRGF0YSBzZW5kaW5nIGFuZCByZWNlaXZpbmcKICBhc3luYyBzZW5kRGF0YShkYXRhQXJnKSB7CiAgICB0aGlzLnNlbmRCYWNrcHJlc3N1cmVkQXJyYXkucHVzaChkYXRhQXJnKTsKICAgIHRoaXMud29ya09uUXVldWUoKTsKICAgIGF3YWl0IHRoaXMuc2VuZEJhY2twcmVzc3VyZWRBcnJheS53YWl0Rm9yU3BhY2UoKTsKICB9CiAgYXN5bmMgZmV0Y2hEYXRhKCkgewogICAgaWYgKHRoaXMucmVjZWl2ZUJhY2twcmVzc3VyZWRBcnJheS5oYXNTcGFjZSkgewogICAgfQogICAgYXdhaXQgdGhpcy5yZWNlaXZlQmFja3ByZXNzdXJlZEFycmF5LndhaXRGb3JJdGVtcygpOwogICAgY29uc3QgZGF0YVBhY2thZ2UgPSB0aGlzLnJlY2VpdmVCYWNrcHJlc3N1cmVkQXJyYXkuc2hpZnQoKTsKICAgIHJldHVybiBkYXRhUGFja2FnZTsKICB9CiAgLyoqCiAgICogcmVhZHMgZnJvbSBhIFJlYWRhYmxlIGFuZCBzZW5kcyBpdCB0byB0aGUgb3RoZXIgc2lkZQogICAqIEBwYXJhbSByZWFkYWJsZVN0cmVhbUFyZwogICAqLwogIGFzeW5jIHJlYWRGcm9tV2Vic3RyZWFtKHJlYWRhYmxlU3RyZWFtQXJnLCBjbG9zZUFmdGVyUmVhZGluZyA9IHRydWUpIHsKICAgIGNvbnN0IHJlYWRlciA9IHJlYWRhYmxlU3RyZWFtQXJnLmdldFJlYWRlcigpOwogICAgbGV0IHN0cmVhbUlzRG9uZSA9IGZhbHNlOwogICAgd2hpbGUgKCFzdHJlYW1Jc0RvbmUpIHsKICAgICAgY29uc3QgeyB2YWx1ZTogdmFsdWUyLCBkb25lIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpOwogICAgICBpZiAodmFsdWUyKSB7CiAgICAgICAgYXdhaXQgdGhpcy5zZW5kRGF0YSh2YWx1ZTIpOwogICAgICB9CiAgICAgIHN0cmVhbUlzRG9uZSA9IGRvbmU7CiAgICB9CiAgICBpZiAoY2xvc2VBZnRlclJlYWRpbmcpIHsKICAgICAgYXdhaXQgdGhpcy5jbG9zZSh0cnVlKTsKICAgIH0KICB9CiAgYXN5bmMgd3JpdGVUb1dlYnN0cmVhbSh3cml0YWJsZVN0cmVhbUFyZykgewogICAgY29uc3Qgd3JpdGVyID0gd3JpdGFibGVTdHJlYW1BcmcuZ2V0V3JpdGVyKCk7CiAgICB3aGlsZSAodGhpcy5rZWVwQWxpdmUgfHwgdGhpcy5yZWNlaXZlQmFja3ByZXNzdXJlZEFycmF5LmNoZWNrSGFzSXRlbXMoKSkgewogICAgICBjb25zdCB2YWx1ZTIgPSBhd2FpdCB0aGlzLmZldGNoRGF0YSgpOwogICAgICBpZiAodmFsdWUyID09PSBjbG9zaW5nQml0KSB7CiAgICAgICAgd3JpdGVyLnJlbGVhc2VMb2NrKCk7CiAgICAgICAgYXdhaXQgd3JpdGFibGVTdHJlYW1BcmcuY2xvc2UoKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBhd2FpdCB3cml0ZXIud3JpdGUodmFsdWUyKTsKICAgIH0KICB9CiAgLyoqCiAgICogY2xvc2VzIHRoZSBzdHJlYW0KICAgKiBpZiBzZW5kQ2xvc2luZ0JpdEFyZyBpcyB0cnVlLCB0aGUgc3RyZWFtIHdpbGwgc2VuZCBhIGNsb3NpbmcgYml0CiAgICogQHBhcmFtIHNlbmRDbG9zaW5nQml0QXJnCiAgICovCiAgYXN5bmMgY2xvc2Uoc2VuZENsb3NpbmdCaXRBcmcgPSBmYWxzZSkgewogICAgaWYgKHNlbmRDbG9zaW5nQml0QXJnKSB7CiAgICAgIHRoaXMuc2VuZERhdGEoY2xvc2luZ0JpdCk7CiAgICB9CiAgICB0aGlzLmtlZXBBbGl2ZSA9IGZhbHNlOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AYXBpLmdsb2JhbCt0eXBlZHJlcXVlc3RAMy4zLjAvbm9kZV9tb2R1bGVzL0BhcGkuZ2xvYmFsL3R5cGVkcmVxdWVzdC9kaXN0X3RzL2NsYXNzZXMudHlwZWR0YXJnZXQuanMKdmFyIFR5cGVkVGFyZ2V0ID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlR5cGVkVGFyZ2V0Iik7CiAgfQogIGNvbnN0cnVjdG9yKG9wdGlvbnNBcmcpIHsKICAgIGlmIChvcHRpb25zQXJnLnBvc3RNZXRob2RXaXRoVHlwZWRSb3V0ZXIgJiYgIW9wdGlvbnNBcmcudHlwZWRSb3V0ZXJSZWYpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJ5b3UgaGF2ZSB0byBzcGVjaWZ5IGEgdHlwZWRyb3V0ZXIgd2hlbiB1c2luZyBwb3N0bWV0aG9kIHdpdGggdHlwZWRyb3V0ZXIiKTsKICAgIH0KICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNBcmc7CiAgfQogIGFzeW5jIHBvc3QocGF5bG9hZEFyZykgewogICAgbGV0IHJlc3BvbnNlSW50ZXJlc3Q7CiAgICBpZiAodGhpcy5vcHRpb25zLnR5cGVkUm91dGVyUmVmKSB7CiAgICAgIHJlc3BvbnNlSW50ZXJlc3QgPSBhd2FpdCB0aGlzLm9wdGlvbnMudHlwZWRSb3V0ZXJSZWYuZmlyZUV2ZW50SW50ZXJlc3RNYXAuYWRkSW50ZXJlc3QocGF5bG9hZEFyZy5jb3JyZWxhdGlvbi5pZCwgcGF5bG9hZEFyZyk7CiAgICB9CiAgICBjb25zdCBwb3N0TWV0aG9kID0gdGhpcy5vcHRpb25zLnBvc3RNZXRob2QgfHwgdGhpcy5vcHRpb25zLnBvc3RNZXRob2RXaXRoVHlwZWRSb3V0ZXI7CiAgICBjb25zdCBwb3N0TWV0aG9kUmV0dXJuVmFsdWUgPSBhd2FpdCBwb3N0TWV0aG9kKHBheWxvYWRBcmcpOwogICAgbGV0IHJlc3BvbnNlQm9keTsKICAgIGlmIChyZXNwb25zZUludGVyZXN0KSB7CiAgICAgIHJlc3BvbnNlQm9keSA9IGF3YWl0IHJlc3BvbnNlSW50ZXJlc3QuaW50ZXJlc3RGdWxsZmlsbGVkOwogICAgfSBlbHNlIGlmIChwb3N0TWV0aG9kUmV0dXJuVmFsdWUpIHsKICAgICAgcmVzcG9uc2VCb2R5ID0gcG9zdE1ldGhvZFJldHVyblZhbHVlOwogICAgfSBlbHNlIHsKICAgICAgcmVzcG9uc2VCb2R5ID0gcGF5bG9hZEFyZzsKICAgIH0KICAgIHJldHVybiByZXNwb25zZUJvZHk7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BhcGkuZ2xvYmFsK3R5cGVkcmVxdWVzdEAzLjMuMC9ub2RlX21vZHVsZXMvQGFwaS5nbG9iYWwvdHlwZWRyZXF1ZXN0L2Rpc3RfdHMvY2xhc3Nlcy50eXBlZHJlcXVlc3QuanMKdmFyIHdlYnJlcXVlc3RJbnN0YW5jZSA9IG5ldyBkaXN0X3RzX2V4cG9ydHMxNC5XZWJyZXF1ZXN0Q2xpZW50KCk7CmZ1bmN0aW9uIGNhbGxHbG9iYWxIb29rKGhvb2tOYW1lLCBlbnRyeSkgewogIHRyeSB7CiAgICBUeXBlZFJvdXRlci5nbG9iYWxIb29rc1tob29rTmFtZV0/LihlbnRyeSk7CiAgfSBjYXRjaCAoZXJyKSB7CiAgICBjb25zb2xlLmVycm9yKGBUeXBlZFJlcXVlc3QgaG9vayBlcnJvciAoJHtob29rTmFtZX0pOmAsIGVycik7CiAgfQp9Cl9fbmFtZShjYWxsR2xvYmFsSG9vaywgImNhbGxHbG9iYWxIb29rIik7CnZhciBUeXBlZFJlcXVlc3QgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiVHlwZWRSZXF1ZXN0Iik7CiAgfQogIC8qKgogICAqIEBwYXJhbSBwb3N0RW5kUG9pbnRBcmcKICAgKiBAcGFyYW0gbWV0aG9kQXJnCiAgICovCiAgY29uc3RydWN0b3IocG9zdFRhcmdldCwgbWV0aG9kQXJnKSB7CiAgICB0aGlzLnNraXBIb29rcyA9IGZhbHNlOwogICAgaWYgKHR5cGVvZiBwb3N0VGFyZ2V0ID09PSAic3RyaW5nIikgewogICAgICB0aGlzLnVybEVuZFBvaW50ID0gcG9zdFRhcmdldDsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMudHlwZWRUYXJnZXQgPSBwb3N0VGFyZ2V0OwogICAgfQogICAgdGhpcy5tZXRob2QgPSBtZXRob2RBcmc7CiAgfQogIC8qKgogICAqIGZpcmVzIHRoZSByZXF1ZXN0CiAgICovCiAgYXN5bmMgZmlyZShmaXJlQXJnLCB1c2VDYWNoZUFyZyA9IGZhbHNlKSB7CiAgICBjb25zdCByZXF1ZXN0U3RhcnRUaW1lID0gRGF0ZS5ub3coKTsKICAgIGxldCBwYXlsb2FkU2VuZGluZyA9IHsKICAgICAgbWV0aG9kOiB0aGlzLm1ldGhvZCwKICAgICAgcmVxdWVzdDogZmlyZUFyZywKICAgICAgcmVzcG9uc2U6IG51bGwsCiAgICAgIGNvcnJlbGF0aW9uOiB7CiAgICAgICAgaWQ6IGlzb3VuaXF1ZTIudW5pKCksCiAgICAgICAgcGhhc2U6ICJyZXF1ZXN0IgogICAgICB9CiAgICB9OwogICAgcGF5bG9hZFNlbmRpbmcgPSBWaXJ0dWFsU3RyZWFtLmVuY29kZVBheWxvYWRGb3JOZXR3b3JrKHBheWxvYWRTZW5kaW5nLCB7CiAgICAgIHNlbmRNZXRob2Q6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHBheWxvYWRBcmcpID0+IHsKICAgICAgICByZXR1cm4gdGhpcy5wb3N0VHJPYmplY3QocGF5bG9hZEFyZyk7CiAgICAgIH0sICJzZW5kTWV0aG9kIikKICAgIH0pOwogICAgaWYgKCF0aGlzLnNraXBIb29rcykgewogICAgICBjYWxsR2xvYmFsSG9vaygib25PdXRnb2luZ1JlcXVlc3QiLCB7CiAgICAgICAgY29ycmVsYXRpb25JZDogcGF5bG9hZFNlbmRpbmcuY29ycmVsYXRpb24uaWQsCiAgICAgICAgbWV0aG9kOiB0aGlzLm1ldGhvZCwKICAgICAgICBkaXJlY3Rpb246ICJvdXRnb2luZyIsCiAgICAgICAgcGhhc2U6ICJyZXF1ZXN0IiwKICAgICAgICB0aW1lc3RhbXA6IHJlcXVlc3RTdGFydFRpbWUsCiAgICAgICAgcGF5bG9hZDogZmlyZUFyZwogICAgICB9KTsKICAgIH0KICAgIGxldCBwYXlsb2FkUmVjZWl2aW5nOwogICAgcGF5bG9hZFJlY2VpdmluZyA9IGF3YWl0IHRoaXMucG9zdFRyT2JqZWN0KHBheWxvYWRTZW5kaW5nLCB1c2VDYWNoZUFyZyk7CiAgICBwYXlsb2FkUmVjZWl2aW5nID0gVmlydHVhbFN0cmVhbS5kZWNvZGVQYXlsb2FkRnJvbU5ldHdvcmsocGF5bG9hZFJlY2VpdmluZywgewogICAgICBzZW5kTWV0aG9kOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKChwYXlsb2FkQXJnKSA9PiB7CiAgICAgICAgcmV0dXJuIHRoaXMucG9zdFRyT2JqZWN0KHBheWxvYWRBcmcpOwogICAgICB9LCAic2VuZE1ldGhvZCIpCiAgICB9KTsKICAgIGlmICghdGhpcy5za2lwSG9va3MpIHsKICAgICAgY2FsbEdsb2JhbEhvb2soIm9uSW5jb21pbmdSZXNwb25zZSIsIHsKICAgICAgICBjb3JyZWxhdGlvbklkOiBwYXlsb2FkU2VuZGluZy5jb3JyZWxhdGlvbi5pZCwKICAgICAgICBtZXRob2Q6IHRoaXMubWV0aG9kLAogICAgICAgIGRpcmVjdGlvbjogImluY29taW5nIiwKICAgICAgICBwaGFzZTogInJlc3BvbnNlIiwKICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksCiAgICAgICAgZHVyYXRpb25NczogRGF0ZS5ub3coKSAtIHJlcXVlc3RTdGFydFRpbWUsCiAgICAgICAgcGF5bG9hZDogcGF5bG9hZFJlY2VpdmluZz8ucmVzcG9uc2UsCiAgICAgICAgZXJyb3I6IHBheWxvYWRSZWNlaXZpbmc/LmVycm9yPy50ZXh0CiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIHBheWxvYWRSZWNlaXZpbmcucmVzcG9uc2U7CiAgfQogIGFzeW5jIHBvc3RUck9iamVjdChwYXlsb2FkU2VuZGluZ0FyZywgdXNlQ2FjaGVBcmcgPSBmYWxzZSkgewogICAgbGV0IHBheWxvYWRSZWNlaXZpbmc7CiAgICBpZiAodGhpcy51cmxFbmRQb2ludCkgewogICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHdlYnJlcXVlc3RJbnN0YW5jZS5wb3N0SnNvbih0aGlzLnVybEVuZFBvaW50LCBwYXlsb2FkU2VuZGluZ0FyZywgdXNlQ2FjaGVBcmcgPyB7IGNhY2hlU3RyYXRlZ3k6ICJjYWNoZS1maXJzdCIgfSA6IHt9KTsKICAgICAgcGF5bG9hZFJlY2VpdmluZyA9IHJlc3BvbnNlOwogICAgfSBlbHNlIHsKICAgICAgcGF5bG9hZFJlY2VpdmluZyA9IGF3YWl0IHRoaXMudHlwZWRUYXJnZXQucG9zdChwYXlsb2FkU2VuZGluZ0FyZyk7CiAgICB9CiAgICBpZiAocGF5bG9hZFJlY2VpdmluZy5lcnJvcikgewogICAgICBjb25zb2xlLmVycm9yKGBtZXRob2Q6ID4+JHt0aGlzLm1ldGhvZH08PCBnb3QgYW4gRVJST1I6ICIke3BheWxvYWRSZWNlaXZpbmcuZXJyb3IudGV4dH0iIHdpdGggZGF0YSAke0pTT04uc3RyaW5naWZ5KHBheWxvYWRSZWNlaXZpbmcuZXJyb3IuZGF0YSwgbnVsbCwgMil9YCk7CiAgICAgIGlmICghcGF5bG9hZFJlY2VpdmluZy5yZXRyeSkgewogICAgICAgIHRocm93IG5ldyBUeXBlZFJlc3BvbnNlRXJyb3IocGF5bG9hZFJlY2VpdmluZy5lcnJvci50ZXh0LCBwYXlsb2FkUmVjZWl2aW5nLmVycm9yLmRhdGEpOwogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKHBheWxvYWRSZWNlaXZpbmcucmV0cnkpIHsKICAgICAgY29uc29sZS5sb2coYHNlcnZlciByZXF1ZXN0ZWQgcmV0cnkgZm9yIHRoZSBmb2xsb3dpbmcgcmVhc29uOiAke3BheWxvYWRSZWNlaXZpbmcucmV0cnkucmVhc29ufWApOwogICAgICBhd2FpdCBkaXN0X3RzX2V4cG9ydHMzLmRlbGF5Rm9yKHBheWxvYWRSZWNlaXZpbmcucmV0cnkud2FpdEZvck1zKTsKICAgICAgcGF5bG9hZFJlY2VpdmluZyA9IGF3YWl0IHRoaXMucG9zdFRyT2JqZWN0KHBheWxvYWRTZW5kaW5nQXJnLCB1c2VDYWNoZUFyZyk7CiAgICB9CiAgICByZXR1cm4gcGF5bG9hZFJlY2VpdmluZzsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vYnJvYWRjYXN0LWNoYW5uZWxANy4zLjAvbm9kZV9tb2R1bGVzL2Jyb2FkY2FzdC1jaGFubmVsL2Rpc3QvZXNicm93c2VyL3V0aWwuanMKZnVuY3Rpb24gaXNQcm9taXNlMihvYmopIHsKICByZXR1cm4gb2JqICYmIHR5cGVvZiBvYmoudGhlbiA9PT0gImZ1bmN0aW9uIjsKfQpfX25hbWUoaXNQcm9taXNlMiwgImlzUHJvbWlzZSIpOwp2YXIgUFJPTUlTRV9SRVNPTFZFRF9GQUxTRSA9IFByb21pc2UucmVzb2x2ZShmYWxzZSk7CnZhciBQUk9NSVNFX1JFU09MVkVEX1RSVUUgPSBQcm9taXNlLnJlc29sdmUodHJ1ZSk7CnZhciBQUk9NSVNFX1JFU09MVkVEX1ZPSUQgPSBQcm9taXNlLnJlc29sdmUoKTsKZnVuY3Rpb24gc2xlZXAodGltZSwgcmVzb2x2ZVdpdGgpIHsKICBpZiAoIXRpbWUpIHRpbWUgPSAwOwogIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXMpIHsKICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gcmVzKHJlc29sdmVXaXRoKTsKICAgIH0sIHRpbWUpOwogIH0pOwp9Cl9fbmFtZShzbGVlcCwgInNsZWVwIik7CmZ1bmN0aW9uIHJhbmRvbUludChtaW4zLCBtYXgzKSB7CiAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXgzIC0gbWluMyArIDEpICsgbWluMyk7Cn0KX19uYW1lKHJhbmRvbUludCwgInJhbmRvbUludCIpOwpmdW5jdGlvbiByYW5kb21Ub2tlbigpIHsKICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIpOwp9Cl9fbmFtZShyYW5kb21Ub2tlbiwgInJhbmRvbVRva2VuIik7CnZhciBsYXN0TXMgPSAwOwpmdW5jdGlvbiBtaWNyb1NlY29uZHMoKSB7CiAgdmFyIHJldCA9IERhdGUubm93KCkgKiAxZTM7CiAgaWYgKHJldCA8PSBsYXN0TXMpIHsKICAgIHJldCA9IGxhc3RNcyArIDE7CiAgfQogIGxhc3RNcyA9IHJldDsKICByZXR1cm4gcmV0Owp9Cl9fbmFtZShtaWNyb1NlY29uZHMsICJtaWNyb1NlY29uZHMiKTsKZnVuY3Rpb24gc3VwcG9ydHNXZWJMb2NrQVBJKCkgewogIGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSAidW5kZWZpbmVkIiAmJiB0eXBlb2YgbmF2aWdhdG9yLmxvY2tzICE9PSAidW5kZWZpbmVkIiAmJiB0eXBlb2YgbmF2aWdhdG9yLmxvY2tzLnJlcXVlc3QgPT09ICJmdW5jdGlvbiIpIHsKICAgIHJldHVybiB0cnVlOwogIH0gZWxzZSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9Cl9fbmFtZShzdXBwb3J0c1dlYkxvY2tBUEksICJzdXBwb3J0c1dlYkxvY2tBUEkiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9icm9hZGNhc3QtY2hhbm5lbEA3LjMuMC9ub2RlX21vZHVsZXMvYnJvYWRjYXN0LWNoYW5uZWwvZGlzdC9lc2Jyb3dzZXIvbWV0aG9kcy9uYXRpdmUuanMKdmFyIG1pY3JvU2Vjb25kczIgPSBtaWNyb1NlY29uZHM7CnZhciB0eXBlID0gIm5hdGl2ZSI7CmZ1bmN0aW9uIGNyZWF0ZShjaGFubmVsTmFtZSkgewogIHZhciBzdGF0ZSA9IHsKICAgIHRpbWU6IG1pY3JvU2Vjb25kcygpLAogICAgbWVzc2FnZXNDYWxsYmFjazogbnVsbCwKICAgIGJjOiBuZXcgQnJvYWRjYXN0Q2hhbm5lbChjaGFubmVsTmFtZSksCiAgICBzdWJGbnM6IFtdCiAgICAvLyBzdWJzY3JpYmVyRnVuY3Rpb25zCiAgfTsKICBzdGF0ZS5iYy5vbm1lc3NhZ2UgPSBmdW5jdGlvbihtc2dFdmVudCkgewogICAgaWYgKHN0YXRlLm1lc3NhZ2VzQ2FsbGJhY2spIHsKICAgICAgc3RhdGUubWVzc2FnZXNDYWxsYmFjayhtc2dFdmVudC5kYXRhKTsKICAgIH0KICB9OwogIHJldHVybiBzdGF0ZTsKfQpfX25hbWUoY3JlYXRlLCAiY3JlYXRlIik7CmZ1bmN0aW9uIGNsb3NlKGNoYW5uZWxTdGF0ZSkgewogIGNoYW5uZWxTdGF0ZS5iYy5jbG9zZSgpOwogIGNoYW5uZWxTdGF0ZS5zdWJGbnMgPSBbXTsKfQpfX25hbWUoY2xvc2UsICJjbG9zZSIpOwpmdW5jdGlvbiBwb3N0TWVzc2FnZShjaGFubmVsU3RhdGUsIG1lc3NhZ2VKc29uKSB7CiAgdHJ5IHsKICAgIGNoYW5uZWxTdGF0ZS5iYy5wb3N0TWVzc2FnZShtZXNzYWdlSnNvbiwgZmFsc2UpOwogICAgcmV0dXJuIFBST01JU0VfUkVTT0xWRURfVk9JRDsKICB9IGNhdGNoIChlcnIpIHsKICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpOwogIH0KfQpfX25hbWUocG9zdE1lc3NhZ2UsICJwb3N0TWVzc2FnZSIpOwpmdW5jdGlvbiBvbk1lc3NhZ2UoY2hhbm5lbFN0YXRlLCBmbikgewogIGNoYW5uZWxTdGF0ZS5tZXNzYWdlc0NhbGxiYWNrID0gZm47Cn0KX19uYW1lKG9uTWVzc2FnZSwgIm9uTWVzc2FnZSIpOwpmdW5jdGlvbiBjYW5CZVVzZWQoKSB7CiAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAidW5kZWZpbmVkIiAmJiBnbG9iYWxUaGlzLkRlbm8gJiYgZ2xvYmFsVGhpcy5EZW5vLmFyZ3MpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBpZiAoKHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiIHx8IHR5cGVvZiBzZWxmICE9PSAidW5kZWZpbmVkIikgJiYgdHlwZW9mIEJyb2FkY2FzdENoYW5uZWwgPT09ICJmdW5jdGlvbiIpIHsKICAgIGlmIChCcm9hZGNhc3RDaGFubmVsLl9wdWJrZXkpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJCcm9hZGNhc3RDaGFubmVsOiBEbyBub3Qgb3ZlcndyaXRlIHdpbmRvdy5Ccm9hZGNhc3RDaGFubmVsIHdpdGggdGhpcyBtb2R1bGUsIHRoaXMgaXMgbm90IGEgcG9seWZpbGwiKTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0gZWxzZSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9Cl9fbmFtZShjYW5CZVVzZWQsICJjYW5CZVVzZWQiKTsKZnVuY3Rpb24gYXZlcmFnZVJlc3BvbnNlVGltZSgpIHsKICByZXR1cm4gMTUwOwp9Cl9fbmFtZShhdmVyYWdlUmVzcG9uc2VUaW1lLCAiYXZlcmFnZVJlc3BvbnNlVGltZSIpOwp2YXIgTmF0aXZlTWV0aG9kID0gewogIGNyZWF0ZSwKICBjbG9zZSwKICBvbk1lc3NhZ2UsCiAgcG9zdE1lc3NhZ2UsCiAgY2FuQmVVc2VkLAogIHR5cGUsCiAgYXZlcmFnZVJlc3BvbnNlVGltZSwKICBtaWNyb1NlY29uZHM6IG1pY3JvU2Vjb25kczIKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9vYmxpdmlvdXMtc2V0QDIuMC4wL25vZGVfbW9kdWxlcy9vYmxpdmlvdXMtc2V0L2Rpc3QvZXNtL3NyYy9pbmRleC5qcwp2YXIgT2JsaXZpb3VzU2V0ID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIk9ibGl2aW91c1NldCIpOwogIH0KICB0dGw7CiAgbWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAvKioKICAgKiBDcmVhdGluZyBjYWxscyB0byBzZXRUaW1lb3V0KCkgaXMgZXhwZW5zaXZlLAogICAqIHNvIHdlIG9ubHkgZG8gdGhhdCBpZiB0aGVyZSBpcyBub3QgdGltZW91dCBhbHJlYWR5IG9wZW4uCiAgICovCiAgX3RvID0gZmFsc2U7CiAgY29uc3RydWN0b3IodHRsKSB7CiAgICB0aGlzLnR0bCA9IHR0bDsKICB9CiAgaGFzKHZhbHVlMikgewogICAgY29uc3QgdmFsdWVUaW1lID0gdGhpcy5tYXAuZ2V0KHZhbHVlMik7CiAgICBpZiAodHlwZW9mIHZhbHVlVGltZSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKHZhbHVlVGltZSA8IG5vdygpIC0gdGhpcy50dGwpIHsKICAgICAgdGhpcy5tYXAuZGVsZXRlKHZhbHVlMik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KICBhZGQodmFsdWUyKSB7CiAgICB0aGlzLm1hcC5kZWxldGUodmFsdWUyKTsKICAgIHRoaXMubWFwLnNldCh2YWx1ZTIsIG5vdygpKTsKICAgIGlmICghdGhpcy5fdG8pIHsKICAgICAgdGhpcy5fdG8gPSB0cnVlOwogICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICB0aGlzLl90byA9IGZhbHNlOwogICAgICAgIHJlbW92ZVRvb09sZFZhbHVlcyh0aGlzKTsKICAgICAgfSwgMCk7CiAgICB9CiAgfQogIGNsZWFyKCkgewogICAgdGhpcy5tYXAuY2xlYXIoKTsKICB9Cn07CmZ1bmN0aW9uIHJlbW92ZVRvb09sZFZhbHVlcyhvYmxpdmlvdXNTZXQpIHsKICBjb25zdCBvbGRlclRoZW4gPSBub3coKSAtIG9ibGl2aW91c1NldC50dGw7CiAgY29uc3QgaXRlcmF0b3IyID0gb2JsaXZpb3VzU2V0Lm1hcFtTeW1ib2wuaXRlcmF0b3JdKCk7CiAgd2hpbGUgKHRydWUpIHsKICAgIGNvbnN0IG5leHQyID0gaXRlcmF0b3IyLm5leHQoKS52YWx1ZTsKICAgIGlmICghbmV4dDIpIHsKICAgICAgYnJlYWs7CiAgICB9CiAgICBjb25zdCB2YWx1ZTIgPSBuZXh0MlswXTsKICAgIGNvbnN0IHRpbWUgPSBuZXh0MlsxXTsKICAgIGlmICh0aW1lIDwgb2xkZXJUaGVuKSB7CiAgICAgIG9ibGl2aW91c1NldC5tYXAuZGVsZXRlKHZhbHVlMik7CiAgICB9IGVsc2UgewogICAgICBicmVhazsKICAgIH0KICB9Cn0KX19uYW1lKHJlbW92ZVRvb09sZFZhbHVlcywgInJlbW92ZVRvb09sZFZhbHVlcyIpOwpmdW5jdGlvbiBub3coKSB7CiAgcmV0dXJuIERhdGUubm93KCk7Cn0KX19uYW1lKG5vdywgIm5vdyIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2Jyb2FkY2FzdC1jaGFubmVsQDcuMy4wL25vZGVfbW9kdWxlcy9icm9hZGNhc3QtY2hhbm5lbC9kaXN0L2VzYnJvd3Nlci9vcHRpb25zLmpzCmZ1bmN0aW9uIGZpbGxPcHRpb25zV2l0aERlZmF1bHRzKCkgewogIHZhciBvcmlnaW5hbE9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHZvaWQgMCA/IGFyZ3VtZW50c1swXSA6IHt9OwogIHZhciBvcHRpb25zID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvcmlnaW5hbE9wdGlvbnMpKTsKICBpZiAodHlwZW9mIG9wdGlvbnMud2ViV29ya2VyU3VwcG9ydCA9PT0gInVuZGVmaW5lZCIpIG9wdGlvbnMud2ViV29ya2VyU3VwcG9ydCA9IHRydWU7CiAgaWYgKCFvcHRpb25zLmlkYikgb3B0aW9ucy5pZGIgPSB7fTsKICBpZiAoIW9wdGlvbnMuaWRiLnR0bCkgb3B0aW9ucy5pZGIudHRsID0gMWUzICogNDU7CiAgaWYgKCFvcHRpb25zLmlkYi5mYWxsYmFja0ludGVydmFsKSBvcHRpb25zLmlkYi5mYWxsYmFja0ludGVydmFsID0gMTUwOwogIGlmIChvcmlnaW5hbE9wdGlvbnMuaWRiICYmIHR5cGVvZiBvcmlnaW5hbE9wdGlvbnMuaWRiLm9uY2xvc2UgPT09ICJmdW5jdGlvbiIpIG9wdGlvbnMuaWRiLm9uY2xvc2UgPSBvcmlnaW5hbE9wdGlvbnMuaWRiLm9uY2xvc2U7CiAgaWYgKCFvcHRpb25zLmxvY2Fsc3RvcmFnZSkgb3B0aW9ucy5sb2NhbHN0b3JhZ2UgPSB7fTsKICBpZiAoIW9wdGlvbnMubG9jYWxzdG9yYWdlLnJlbW92ZVRpbWVvdXQpIG9wdGlvbnMubG9jYWxzdG9yYWdlLnJlbW92ZVRpbWVvdXQgPSAxZTMgKiA2MDsKICBpZiAob3JpZ2luYWxPcHRpb25zLm1ldGhvZHMpIG9wdGlvbnMubWV0aG9kcyA9IG9yaWdpbmFsT3B0aW9ucy5tZXRob2RzOwogIGlmICghb3B0aW9ucy5ub2RlKSBvcHRpb25zLm5vZGUgPSB7fTsKICBpZiAoIW9wdGlvbnMubm9kZS50dGwpIG9wdGlvbnMubm9kZS50dGwgPSAxZTMgKiA2MCAqIDI7CiAgaWYgKCFvcHRpb25zLm5vZGUubWF4UGFyYWxsZWxXcml0ZXMpIG9wdGlvbnMubm9kZS5tYXhQYXJhbGxlbFdyaXRlcyA9IDIwNDg7CiAgaWYgKHR5cGVvZiBvcHRpb25zLm5vZGUudXNlRmFzdFBhdGggPT09ICJ1bmRlZmluZWQiKSBvcHRpb25zLm5vZGUudXNlRmFzdFBhdGggPSB0cnVlOwogIHJldHVybiBvcHRpb25zOwp9Cl9fbmFtZShmaWxsT3B0aW9uc1dpdGhEZWZhdWx0cywgImZpbGxPcHRpb25zV2l0aERlZmF1bHRzIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vYnJvYWRjYXN0LWNoYW5uZWxANy4zLjAvbm9kZV9tb2R1bGVzL2Jyb2FkY2FzdC1jaGFubmVsL2Rpc3QvZXNicm93c2VyL21ldGhvZHMvaW5kZXhlZC1kYi5qcwp2YXIgbWljcm9TZWNvbmRzMyA9IG1pY3JvU2Vjb25kczsKdmFyIERCX1BSRUZJWCA9ICJwdWJrZXkuYnJvYWRjYXN0LWNoYW5uZWwtMC0iOwp2YXIgT0JKRUNUX1NUT1JFX0lEID0gIm1lc3NhZ2VzIjsKdmFyIFRSQU5TQUNUSU9OX1NFVFRJTkdTID0gewogIGR1cmFiaWxpdHk6ICJyZWxheGVkIgp9Owp2YXIgdHlwZTIgPSAiaWRiIjsKZnVuY3Rpb24gZ2V0SWRiKCkgewogIGlmICh0eXBlb2YgaW5kZXhlZERCICE9PSAidW5kZWZpbmVkIikgcmV0dXJuIGluZGV4ZWREQjsKICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gInVuZGVmaW5lZCIpIHsKICAgIGlmICh0eXBlb2Ygd2luZG93Lm1vekluZGV4ZWREQiAhPT0gInVuZGVmaW5lZCIpIHJldHVybiB3aW5kb3cubW96SW5kZXhlZERCOwogICAgaWYgKHR5cGVvZiB3aW5kb3cud2Via2l0SW5kZXhlZERCICE9PSAidW5kZWZpbmVkIikgcmV0dXJuIHdpbmRvdy53ZWJraXRJbmRleGVkREI7CiAgICBpZiAodHlwZW9mIHdpbmRvdy5tc0luZGV4ZWREQiAhPT0gInVuZGVmaW5lZCIpIHJldHVybiB3aW5kb3cubXNJbmRleGVkREI7CiAgfQogIHJldHVybiBmYWxzZTsKfQpfX25hbWUoZ2V0SWRiLCAiZ2V0SWRiIik7CmZ1bmN0aW9uIGNvbW1pdEluZGV4ZWREQlRyYW5zYWN0aW9uKHR4KSB7CiAgaWYgKHR4LmNvbW1pdCkgewogICAgdHguY29tbWl0KCk7CiAgfQp9Cl9fbmFtZShjb21taXRJbmRleGVkREJUcmFuc2FjdGlvbiwgImNvbW1pdEluZGV4ZWREQlRyYW5zYWN0aW9uIik7CmZ1bmN0aW9uIGNyZWF0ZURhdGFiYXNlKGNoYW5uZWxOYW1lKSB7CiAgdmFyIEluZGV4ZWREQiA9IGdldElkYigpOwogIHZhciBkYk5hbWUgPSBEQl9QUkVGSVggKyBjaGFubmVsTmFtZTsKICB2YXIgb3BlblJlcXVlc3QgPSBJbmRleGVkREIub3BlbihkYk5hbWUpOwogIG9wZW5SZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9IGZ1bmN0aW9uKGV2KSB7CiAgICB2YXIgZGIgPSBldi50YXJnZXQucmVzdWx0OwogICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUoT0JKRUNUX1NUT1JFX0lELCB7CiAgICAgIGtleVBhdGg6ICJpZCIsCiAgICAgIGF1dG9JbmNyZW1lbnQ6IHRydWUKICAgIH0pOwogIH07CiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlcywgcmVqKSB7CiAgICBvcGVuUmVxdWVzdC5vbmVycm9yID0gZnVuY3Rpb24oZXYpIHsKICAgICAgcmV0dXJuIHJlaihldik7CiAgICB9OwogICAgb3BlblJlcXVlc3Qub25zdWNjZXNzID0gZnVuY3Rpb24oKSB7CiAgICAgIHJlcyhvcGVuUmVxdWVzdC5yZXN1bHQpOwogICAgfTsKICB9KTsKfQpfX25hbWUoY3JlYXRlRGF0YWJhc2UsICJjcmVhdGVEYXRhYmFzZSIpOwpmdW5jdGlvbiB3cml0ZU1lc3NhZ2UoZGIsIHJlYWRlclV1aWQsIG1lc3NhZ2VKc29uKSB7CiAgdmFyIHRpbWUgPSBEYXRlLm5vdygpOwogIHZhciB3cml0ZU9iamVjdCA9IHsKICAgIHV1aWQ6IHJlYWRlclV1aWQsCiAgICB0aW1lLAogICAgZGF0YTogbWVzc2FnZUpzb24KICB9OwogIHZhciB0eCA9IGRiLnRyYW5zYWN0aW9uKFtPQkpFQ1RfU1RPUkVfSURdLCAicmVhZHdyaXRlIiwgVFJBTlNBQ1RJT05fU0VUVElOR1MpOwogIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXMsIHJlaikgewogICAgdHgub25jb21wbGV0ZSA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gcmVzKCk7CiAgICB9OwogICAgdHgub25lcnJvciA9IGZ1bmN0aW9uKGV2KSB7CiAgICAgIHJldHVybiByZWooZXYpOwogICAgfTsKICAgIHZhciBvYmplY3RTdG9yZSA9IHR4Lm9iamVjdFN0b3JlKE9CSkVDVF9TVE9SRV9JRCk7CiAgICBvYmplY3RTdG9yZS5hZGQod3JpdGVPYmplY3QpOwogICAgY29tbWl0SW5kZXhlZERCVHJhbnNhY3Rpb24odHgpOwogIH0pOwp9Cl9fbmFtZSh3cml0ZU1lc3NhZ2UsICJ3cml0ZU1lc3NhZ2UiKTsKZnVuY3Rpb24gZ2V0QWxsTWVzc2FnZXMoZGIpIHsKICB2YXIgdHggPSBkYi50cmFuc2FjdGlvbihPQkpFQ1RfU1RPUkVfSUQsICJyZWFkb25seSIsIFRSQU5TQUNUSU9OX1NFVFRJTkdTKTsKICB2YXIgb2JqZWN0U3RvcmUgPSB0eC5vYmplY3RTdG9yZShPQkpFQ1RfU1RPUkVfSUQpOwogIHZhciByZXQgPSBbXTsKICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzKSB7CiAgICBvYmplY3RTdG9yZS5vcGVuQ3Vyc29yKCkub25zdWNjZXNzID0gZnVuY3Rpb24oZXYpIHsKICAgICAgdmFyIGN1cnNvciA9IGV2LnRhcmdldC5yZXN1bHQ7CiAgICAgIGlmIChjdXJzb3IpIHsKICAgICAgICByZXQucHVzaChjdXJzb3IudmFsdWUpOwogICAgICAgIGN1cnNvclsiY29udGludWUiXSgpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbW1pdEluZGV4ZWREQlRyYW5zYWN0aW9uKHR4KTsKICAgICAgICByZXMocmV0KTsKICAgICAgfQogICAgfTsKICB9KTsKfQpfX25hbWUoZ2V0QWxsTWVzc2FnZXMsICJnZXRBbGxNZXNzYWdlcyIpOwpmdW5jdGlvbiBnZXRNZXNzYWdlc0hpZ2hlclRoYW4oZGIsIGxhc3RDdXJzb3JJZCkgewogIHZhciB0eCA9IGRiLnRyYW5zYWN0aW9uKE9CSkVDVF9TVE9SRV9JRCwgInJlYWRvbmx5IiwgVFJBTlNBQ1RJT05fU0VUVElOR1MpOwogIHZhciBvYmplY3RTdG9yZSA9IHR4Lm9iamVjdFN0b3JlKE9CSkVDVF9TVE9SRV9JRCk7CiAgdmFyIHJldCA9IFtdOwogIHZhciBrZXlSYW5nZVZhbHVlID0gSURCS2V5UmFuZ2UuYm91bmQobGFzdEN1cnNvcklkICsgMSwgSW5maW5pdHkpOwogIGlmIChvYmplY3RTdG9yZS5nZXRBbGwpIHsKICAgIHZhciBnZXRBbGxSZXF1ZXN0ID0gb2JqZWN0U3RvcmUuZ2V0QWxsKGtleVJhbmdlVmFsdWUpOwogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlcywgcmVqKSB7CiAgICAgIGdldEFsbFJlcXVlc3Qub25lcnJvciA9IGZ1bmN0aW9uKGVycikgewogICAgICAgIHJldHVybiByZWooZXJyKTsKICAgICAgfTsKICAgICAgZ2V0QWxsUmVxdWVzdC5vbnN1Y2Nlc3MgPSBmdW5jdGlvbihlMTApIHsKICAgICAgICByZXMoZTEwLnRhcmdldC5yZXN1bHQpOwogICAgICB9OwogICAgfSk7CiAgfQogIGZ1bmN0aW9uIG9wZW5DdXJzb3IoKSB7CiAgICB0cnkgewogICAgICBrZXlSYW5nZVZhbHVlID0gSURCS2V5UmFuZ2UuYm91bmQobGFzdEN1cnNvcklkICsgMSwgSW5maW5pdHkpOwogICAgICByZXR1cm4gb2JqZWN0U3RvcmUub3BlbkN1cnNvcihrZXlSYW5nZVZhbHVlKTsKICAgIH0gY2F0Y2ggKGUxMCkgewogICAgICByZXR1cm4gb2JqZWN0U3RvcmUub3BlbkN1cnNvcigpOwogICAgfQogIH0KICBfX25hbWUob3BlbkN1cnNvciwgIm9wZW5DdXJzb3IiKTsKICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzLCByZWopIHsKICAgIHZhciBvcGVuQ3Vyc29yUmVxdWVzdCA9IG9wZW5DdXJzb3IoKTsKICAgIG9wZW5DdXJzb3JSZXF1ZXN0Lm9uZXJyb3IgPSBmdW5jdGlvbihlcnIpIHsKICAgICAgcmV0dXJuIHJlaihlcnIpOwogICAgfTsKICAgIG9wZW5DdXJzb3JSZXF1ZXN0Lm9uc3VjY2VzcyA9IGZ1bmN0aW9uKGV2KSB7CiAgICAgIHZhciBjdXJzb3IgPSBldi50YXJnZXQucmVzdWx0OwogICAgICBpZiAoY3Vyc29yKSB7CiAgICAgICAgaWYgKGN1cnNvci52YWx1ZS5pZCA8IGxhc3RDdXJzb3JJZCArIDEpIHsKICAgICAgICAgIGN1cnNvclsiY29udGludWUiXShsYXN0Q3Vyc29ySWQgKyAxKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0LnB1c2goY3Vyc29yLnZhbHVlKTsKICAgICAgICAgIGN1cnNvclsiY29udGludWUiXSgpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBjb21taXRJbmRleGVkREJUcmFuc2FjdGlvbih0eCk7CiAgICAgICAgcmVzKHJldCk7CiAgICAgIH0KICAgIH07CiAgfSk7Cn0KX19uYW1lKGdldE1lc3NhZ2VzSGlnaGVyVGhhbiwgImdldE1lc3NhZ2VzSGlnaGVyVGhhbiIpOwpmdW5jdGlvbiByZW1vdmVNZXNzYWdlc0J5SWQoY2hhbm5lbFN0YXRlLCBpZHMpIHsKICBpZiAoY2hhbm5lbFN0YXRlLmNsb3NlZCkgewogICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7CiAgfQogIHZhciB0eCA9IGNoYW5uZWxTdGF0ZS5kYi50cmFuc2FjdGlvbihPQkpFQ1RfU1RPUkVfSUQsICJyZWFkd3JpdGUiLCBUUkFOU0FDVElPTl9TRVRUSU5HUyk7CiAgdmFyIG9iamVjdFN0b3JlID0gdHgub2JqZWN0U3RvcmUoT0JKRUNUX1NUT1JFX0lEKTsKICByZXR1cm4gUHJvbWlzZS5hbGwoaWRzLm1hcChmdW5jdGlvbihpZCkgewogICAgdmFyIGRlbGV0ZVJlcXVlc3QgPSBvYmplY3RTdG9yZVsiZGVsZXRlIl0oaWQpOwogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlcykgewogICAgICBkZWxldGVSZXF1ZXN0Lm9uc3VjY2VzcyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiByZXMoKTsKICAgICAgfTsKICAgIH0pOwogIH0pKTsKfQpfX25hbWUocmVtb3ZlTWVzc2FnZXNCeUlkLCAicmVtb3ZlTWVzc2FnZXNCeUlkIik7CmZ1bmN0aW9uIGdldE9sZE1lc3NhZ2VzKGRiLCB0dGwpIHsKICB2YXIgb2xkZXJUaGVuID0gRGF0ZS5ub3coKSAtIHR0bDsKICB2YXIgdHggPSBkYi50cmFuc2FjdGlvbihPQkpFQ1RfU1RPUkVfSUQsICJyZWFkb25seSIsIFRSQU5TQUNUSU9OX1NFVFRJTkdTKTsKICB2YXIgb2JqZWN0U3RvcmUgPSB0eC5vYmplY3RTdG9yZShPQkpFQ1RfU1RPUkVfSUQpOwogIHZhciByZXQgPSBbXTsKICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzKSB7CiAgICBvYmplY3RTdG9yZS5vcGVuQ3Vyc29yKCkub25zdWNjZXNzID0gZnVuY3Rpb24oZXYpIHsKICAgICAgdmFyIGN1cnNvciA9IGV2LnRhcmdldC5yZXN1bHQ7CiAgICAgIGlmIChjdXJzb3IpIHsKICAgICAgICB2YXIgbXNnT2JrID0gY3Vyc29yLnZhbHVlOwogICAgICAgIGlmIChtc2dPYmsudGltZSA8IG9sZGVyVGhlbikgewogICAgICAgICAgcmV0LnB1c2gobXNnT2JrKTsKICAgICAgICAgIGN1cnNvclsiY29udGludWUiXSgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb21taXRJbmRleGVkREJUcmFuc2FjdGlvbih0eCk7CiAgICAgICAgICByZXMocmV0KTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzKHJldCk7CiAgICAgIH0KICAgIH07CiAgfSk7Cn0KX19uYW1lKGdldE9sZE1lc3NhZ2VzLCAiZ2V0T2xkTWVzc2FnZXMiKTsKZnVuY3Rpb24gY2xlYW5PbGRNZXNzYWdlcyhjaGFubmVsU3RhdGUpIHsKICByZXR1cm4gZ2V0T2xkTWVzc2FnZXMoY2hhbm5lbFN0YXRlLmRiLCBjaGFubmVsU3RhdGUub3B0aW9ucy5pZGIudHRsKS50aGVuKGZ1bmN0aW9uKHRvb09sZCkgewogICAgcmV0dXJuIHJlbW92ZU1lc3NhZ2VzQnlJZChjaGFubmVsU3RhdGUsIHRvb09sZC5tYXAoZnVuY3Rpb24obXNnKSB7CiAgICAgIHJldHVybiBtc2cuaWQ7CiAgICB9KSk7CiAgfSk7Cn0KX19uYW1lKGNsZWFuT2xkTWVzc2FnZXMsICJjbGVhbk9sZE1lc3NhZ2VzIik7CmZ1bmN0aW9uIGNyZWF0ZTIoY2hhbm5lbE5hbWUsIG9wdGlvbnMpIHsKICBvcHRpb25zID0gZmlsbE9wdGlvbnNXaXRoRGVmYXVsdHMob3B0aW9ucyk7CiAgcmV0dXJuIGNyZWF0ZURhdGFiYXNlKGNoYW5uZWxOYW1lKS50aGVuKGZ1bmN0aW9uKGRiKSB7CiAgICB2YXIgc3RhdGUgPSB7CiAgICAgIGNsb3NlZDogZmFsc2UsCiAgICAgIGxhc3RDdXJzb3JJZDogMCwKICAgICAgY2hhbm5lbE5hbWUsCiAgICAgIG9wdGlvbnMsCiAgICAgIHV1aWQ6IHJhbmRvbVRva2VuKCksCiAgICAgIC8qKgogICAgICAgKiBlbWl0dGVkTWVzc2FnZXNJZHMKICAgICAgICogY29udGFpbnMgYWxsIG1lc3NhZ2VzIHRoYXQgaGF2ZSBiZWVuIGVtaXR0ZWQgYmVmb3JlCiAgICAgICAqIEB0eXBlIHtPYmxpdmlvdXNTZXR9CiAgICAgICAqLwogICAgICBlTUlzOiBuZXcgT2JsaXZpb3VzU2V0KG9wdGlvbnMuaWRiLnR0bCAqIDIpLAogICAgICAvLyBlbnN1cmVzIHdlIGRvIG5vdCByZWFkIG1lc3NhZ2VzIGluIHBhcmFsbGVsCiAgICAgIHdyaXRlQmxvY2tQcm9taXNlOiBQUk9NSVNFX1JFU09MVkVEX1ZPSUQsCiAgICAgIG1lc3NhZ2VzQ2FsbGJhY2s6IG51bGwsCiAgICAgIHJlYWRRdWV1ZVByb21pc2VzOiBbXSwKICAgICAgZGIKICAgIH07CiAgICBkYi5vbmNsb3NlID0gZnVuY3Rpb24oKSB7CiAgICAgIHN0YXRlLmNsb3NlZCA9IHRydWU7CiAgICAgIGlmIChvcHRpb25zLmlkYi5vbmNsb3NlKSBvcHRpb25zLmlkYi5vbmNsb3NlKCk7CiAgICB9OwogICAgX3JlYWRMb29wKHN0YXRlKTsKICAgIHJldHVybiBzdGF0ZTsKICB9KTsKfQpfX25hbWUoY3JlYXRlMiwgImNyZWF0ZSIpOwpmdW5jdGlvbiBfcmVhZExvb3Aoc3RhdGUpIHsKICBpZiAoc3RhdGUuY2xvc2VkKSByZXR1cm47CiAgcmVhZE5ld01lc3NhZ2VzKHN0YXRlKS50aGVuKGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHNsZWVwKHN0YXRlLm9wdGlvbnMuaWRiLmZhbGxiYWNrSW50ZXJ2YWwpOwogIH0pLnRoZW4oZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gX3JlYWRMb29wKHN0YXRlKTsKICB9KTsKfQpfX25hbWUoX3JlYWRMb29wLCAiX3JlYWRMb29wIik7CmZ1bmN0aW9uIF9maWx0ZXJNZXNzYWdlKG1zZ09iaiwgc3RhdGUpIHsKICBpZiAobXNnT2JqLnV1aWQgPT09IHN0YXRlLnV1aWQpIHJldHVybiBmYWxzZTsKICBpZiAoc3RhdGUuZU1Jcy5oYXMobXNnT2JqLmlkKSkgcmV0dXJuIGZhbHNlOwogIGlmIChtc2dPYmouZGF0YS50aW1lIDwgc3RhdGUubWVzc2FnZXNDYWxsYmFja1RpbWUpIHJldHVybiBmYWxzZTsKICByZXR1cm4gdHJ1ZTsKfQpfX25hbWUoX2ZpbHRlck1lc3NhZ2UsICJfZmlsdGVyTWVzc2FnZSIpOwpmdW5jdGlvbiByZWFkTmV3TWVzc2FnZXMoc3RhdGUpIHsKICBpZiAoc3RhdGUuY2xvc2VkKSByZXR1cm4gUFJPTUlTRV9SRVNPTFZFRF9WT0lEOwogIGlmICghc3RhdGUubWVzc2FnZXNDYWxsYmFjaykgcmV0dXJuIFBST01JU0VfUkVTT0xWRURfVk9JRDsKICByZXR1cm4gZ2V0TWVzc2FnZXNIaWdoZXJUaGFuKHN0YXRlLmRiLCBzdGF0ZS5sYXN0Q3Vyc29ySWQpLnRoZW4oZnVuY3Rpb24obmV3ZXJNZXNzYWdlcykgewogICAgdmFyIHVzZU1lc3NhZ2VzID0gbmV3ZXJNZXNzYWdlcy5maWx0ZXIoZnVuY3Rpb24obXNnT2JqKSB7CiAgICAgIHJldHVybiAhIW1zZ09iajsKICAgIH0pLm1hcChmdW5jdGlvbihtc2dPYmopIHsKICAgICAgaWYgKG1zZ09iai5pZCA+IHN0YXRlLmxhc3RDdXJzb3JJZCkgewogICAgICAgIHN0YXRlLmxhc3RDdXJzb3JJZCA9IG1zZ09iai5pZDsKICAgICAgfQogICAgICByZXR1cm4gbXNnT2JqOwogICAgfSkuZmlsdGVyKGZ1bmN0aW9uKG1zZ09iaikgewogICAgICByZXR1cm4gX2ZpbHRlck1lc3NhZ2UobXNnT2JqLCBzdGF0ZSk7CiAgICB9KS5zb3J0KGZ1bmN0aW9uKG1zZ09iakEsIG1zZ09iakIpIHsKICAgICAgcmV0dXJuIG1zZ09iakEudGltZSAtIG1zZ09iakIudGltZTsKICAgIH0pOwogICAgdXNlTWVzc2FnZXMuZm9yRWFjaChmdW5jdGlvbihtc2dPYmopIHsKICAgICAgaWYgKHN0YXRlLm1lc3NhZ2VzQ2FsbGJhY2spIHsKICAgICAgICBzdGF0ZS5lTUlzLmFkZChtc2dPYmouaWQpOwogICAgICAgIHN0YXRlLm1lc3NhZ2VzQ2FsbGJhY2sobXNnT2JqLmRhdGEpOwogICAgICB9CiAgICB9KTsKICAgIHJldHVybiBQUk9NSVNFX1JFU09MVkVEX1ZPSUQ7CiAgfSk7Cn0KX19uYW1lKHJlYWROZXdNZXNzYWdlcywgInJlYWROZXdNZXNzYWdlcyIpOwpmdW5jdGlvbiBjbG9zZTIoY2hhbm5lbFN0YXRlKSB7CiAgY2hhbm5lbFN0YXRlLmNsb3NlZCA9IHRydWU7CiAgY2hhbm5lbFN0YXRlLmRiLmNsb3NlKCk7Cn0KX19uYW1lKGNsb3NlMiwgImNsb3NlIik7CmZ1bmN0aW9uIHBvc3RNZXNzYWdlMihjaGFubmVsU3RhdGUsIG1lc3NhZ2VKc29uKSB7CiAgY2hhbm5lbFN0YXRlLndyaXRlQmxvY2tQcm9taXNlID0gY2hhbm5lbFN0YXRlLndyaXRlQmxvY2tQcm9taXNlLnRoZW4oZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gd3JpdGVNZXNzYWdlKGNoYW5uZWxTdGF0ZS5kYiwgY2hhbm5lbFN0YXRlLnV1aWQsIG1lc3NhZ2VKc29uKTsKICB9KS50aGVuKGZ1bmN0aW9uKCkgewogICAgaWYgKHJhbmRvbUludCgwLCAxMCkgPT09IDApIHsKICAgICAgY2xlYW5PbGRNZXNzYWdlcyhjaGFubmVsU3RhdGUpOwogICAgfQogIH0pOwogIHJldHVybiBjaGFubmVsU3RhdGUud3JpdGVCbG9ja1Byb21pc2U7Cn0KX19uYW1lKHBvc3RNZXNzYWdlMiwgInBvc3RNZXNzYWdlIik7CmZ1bmN0aW9uIG9uTWVzc2FnZTIoY2hhbm5lbFN0YXRlLCBmbiwgdGltZSkgewogIGNoYW5uZWxTdGF0ZS5tZXNzYWdlc0NhbGxiYWNrVGltZSA9IHRpbWU7CiAgY2hhbm5lbFN0YXRlLm1lc3NhZ2VzQ2FsbGJhY2sgPSBmbjsKICByZWFkTmV3TWVzc2FnZXMoY2hhbm5lbFN0YXRlKTsKfQpfX25hbWUob25NZXNzYWdlMiwgIm9uTWVzc2FnZSIpOwpmdW5jdGlvbiBjYW5CZVVzZWQyKCkgewogIHJldHVybiAhIWdldElkYigpOwp9Cl9fbmFtZShjYW5CZVVzZWQyLCAiY2FuQmVVc2VkIik7CmZ1bmN0aW9uIGF2ZXJhZ2VSZXNwb25zZVRpbWUyKG9wdGlvbnMpIHsKICByZXR1cm4gb3B0aW9ucy5pZGIuZmFsbGJhY2tJbnRlcnZhbCAqIDI7Cn0KX19uYW1lKGF2ZXJhZ2VSZXNwb25zZVRpbWUyLCAiYXZlcmFnZVJlc3BvbnNlVGltZSIpOwp2YXIgSW5kZXhlZERCTWV0aG9kID0gewogIGNyZWF0ZTogY3JlYXRlMiwKICBjbG9zZTogY2xvc2UyLAogIG9uTWVzc2FnZTogb25NZXNzYWdlMiwKICBwb3N0TWVzc2FnZTogcG9zdE1lc3NhZ2UyLAogIGNhbkJlVXNlZDogY2FuQmVVc2VkMiwKICB0eXBlOiB0eXBlMiwKICBhdmVyYWdlUmVzcG9uc2VUaW1lOiBhdmVyYWdlUmVzcG9uc2VUaW1lMiwKICBtaWNyb1NlY29uZHM6IG1pY3JvU2Vjb25kczMKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9icm9hZGNhc3QtY2hhbm5lbEA3LjMuMC9ub2RlX21vZHVsZXMvYnJvYWRjYXN0LWNoYW5uZWwvZGlzdC9lc2Jyb3dzZXIvbWV0aG9kcy9sb2NhbHN0b3JhZ2UuanMKdmFyIG1pY3JvU2Vjb25kczQgPSBtaWNyb1NlY29uZHM7CnZhciBLRVlfUFJFRklYID0gInB1YmtleS5icm9hZGNhc3RDaGFubmVsLSI7CnZhciB0eXBlMyA9ICJsb2NhbHN0b3JhZ2UiOwpmdW5jdGlvbiBnZXRMb2NhbFN0b3JhZ2UoKSB7CiAgdmFyIGxvY2FsU3RvcmFnZTsKICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gInVuZGVmaW5lZCIpIHJldHVybiBudWxsOwogIHRyeSB7CiAgICBsb2NhbFN0b3JhZ2UgPSB3aW5kb3cubG9jYWxTdG9yYWdlOwogICAgbG9jYWxTdG9yYWdlID0gd2luZG93WyJpZTgtZXZlbnRsaXN0ZW5lci9zdG9yYWdlIl0gfHwgd2luZG93LmxvY2FsU3RvcmFnZTsKICB9IGNhdGNoIChlMTApIHsKICB9CiAgcmV0dXJuIGxvY2FsU3RvcmFnZTsKfQpfX25hbWUoZ2V0TG9jYWxTdG9yYWdlLCAiZ2V0TG9jYWxTdG9yYWdlIik7CmZ1bmN0aW9uIHN0b3JhZ2VLZXkoY2hhbm5lbE5hbWUpIHsKICByZXR1cm4gS0VZX1BSRUZJWCArIGNoYW5uZWxOYW1lOwp9Cl9fbmFtZShzdG9yYWdlS2V5LCAic3RvcmFnZUtleSIpOwpmdW5jdGlvbiBwb3N0TWVzc2FnZTMoY2hhbm5lbFN0YXRlLCBtZXNzYWdlSnNvbikgewogIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXMpIHsKICAgIHNsZWVwKCkudGhlbihmdW5jdGlvbigpIHsKICAgICAgdmFyIGtleTIgPSBzdG9yYWdlS2V5KGNoYW5uZWxTdGF0ZS5jaGFubmVsTmFtZSk7CiAgICAgIHZhciB3cml0ZU9iaiA9IHsKICAgICAgICB0b2tlbjogcmFuZG9tVG9rZW4oKSwKICAgICAgICB0aW1lOiBEYXRlLm5vdygpLAogICAgICAgIGRhdGE6IG1lc3NhZ2VKc29uLAogICAgICAgIHV1aWQ6IGNoYW5uZWxTdGF0ZS51dWlkCiAgICAgIH07CiAgICAgIHZhciB2YWx1ZTIgPSBKU09OLnN0cmluZ2lmeSh3cml0ZU9iaik7CiAgICAgIGdldExvY2FsU3RvcmFnZSgpLnNldEl0ZW0oa2V5MiwgdmFsdWUyKTsKICAgICAgdmFyIGV2ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50Iik7CiAgICAgIGV2LmluaXRFdmVudCgic3RvcmFnZSIsIHRydWUsIHRydWUpOwogICAgICBldi5rZXkgPSBrZXkyOwogICAgICBldi5uZXdWYWx1ZSA9IHZhbHVlMjsKICAgICAgd2luZG93LmRpc3BhdGNoRXZlbnQoZXYpOwogICAgICByZXMoKTsKICAgIH0pOwogIH0pOwp9Cl9fbmFtZShwb3N0TWVzc2FnZTMsICJwb3N0TWVzc2FnZSIpOwpmdW5jdGlvbiBhZGRTdG9yYWdlRXZlbnRMaXN0ZW5lcihjaGFubmVsTmFtZSwgZm4pIHsKICB2YXIga2V5MiA9IHN0b3JhZ2VLZXkoY2hhbm5lbE5hbWUpOwogIHZhciBsaXN0ZW5lciA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gbGlzdGVuZXIyKGV2KSB7CiAgICBpZiAoZXYua2V5ID09PSBrZXkyKSB7CiAgICAgIGZuKEpTT04ucGFyc2UoZXYubmV3VmFsdWUpKTsKICAgIH0KICB9LCAibGlzdGVuZXIiKTsKICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigic3RvcmFnZSIsIGxpc3RlbmVyKTsKICByZXR1cm4gbGlzdGVuZXI7Cn0KX19uYW1lKGFkZFN0b3JhZ2VFdmVudExpc3RlbmVyLCAiYWRkU3RvcmFnZUV2ZW50TGlzdGVuZXIiKTsKZnVuY3Rpb24gcmVtb3ZlU3RvcmFnZUV2ZW50TGlzdGVuZXIobGlzdGVuZXIpIHsKICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigic3RvcmFnZSIsIGxpc3RlbmVyKTsKfQpfX25hbWUocmVtb3ZlU3RvcmFnZUV2ZW50TGlzdGVuZXIsICJyZW1vdmVTdG9yYWdlRXZlbnRMaXN0ZW5lciIpOwpmdW5jdGlvbiBjcmVhdGUzKGNoYW5uZWxOYW1lLCBvcHRpb25zKSB7CiAgb3B0aW9ucyA9IGZpbGxPcHRpb25zV2l0aERlZmF1bHRzKG9wdGlvbnMpOwogIGlmICghY2FuQmVVc2VkMygpKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoIkJyb2FkY2FzdENoYW5uZWw6IGxvY2Fsc3RvcmFnZSBjYW5ub3QgYmUgdXNlZCIpOwogIH0KICB2YXIgdXVpZCA9IHJhbmRvbVRva2VuKCk7CiAgdmFyIGVNSXMgPSBuZXcgT2JsaXZpb3VzU2V0KG9wdGlvbnMubG9jYWxzdG9yYWdlLnJlbW92ZVRpbWVvdXQpOwogIHZhciBzdGF0ZSA9IHsKICAgIGNoYW5uZWxOYW1lLAogICAgdXVpZCwKICAgIGVNSXMKICAgIC8vIGVtaXR0ZWRNZXNzYWdlc0lkcwogIH07CiAgc3RhdGUubGlzdGVuZXIgPSBhZGRTdG9yYWdlRXZlbnRMaXN0ZW5lcihjaGFubmVsTmFtZSwgZnVuY3Rpb24obXNnT2JqKSB7CiAgICBpZiAoIXN0YXRlLm1lc3NhZ2VzQ2FsbGJhY2spIHJldHVybjsKICAgIGlmIChtc2dPYmoudXVpZCA9PT0gdXVpZCkgcmV0dXJuOwogICAgaWYgKCFtc2dPYmoudG9rZW4gfHwgZU1Jcy5oYXMobXNnT2JqLnRva2VuKSkgcmV0dXJuOwogICAgaWYgKG1zZ09iai5kYXRhLnRpbWUgJiYgbXNnT2JqLmRhdGEudGltZSA8IHN0YXRlLm1lc3NhZ2VzQ2FsbGJhY2tUaW1lKSByZXR1cm47CiAgICBlTUlzLmFkZChtc2dPYmoudG9rZW4pOwogICAgc3RhdGUubWVzc2FnZXNDYWxsYmFjayhtc2dPYmouZGF0YSk7CiAgfSk7CiAgcmV0dXJuIHN0YXRlOwp9Cl9fbmFtZShjcmVhdGUzLCAiY3JlYXRlIik7CmZ1bmN0aW9uIGNsb3NlMyhjaGFubmVsU3RhdGUpIHsKICByZW1vdmVTdG9yYWdlRXZlbnRMaXN0ZW5lcihjaGFubmVsU3RhdGUubGlzdGVuZXIpOwp9Cl9fbmFtZShjbG9zZTMsICJjbG9zZSIpOwpmdW5jdGlvbiBvbk1lc3NhZ2UzKGNoYW5uZWxTdGF0ZSwgZm4sIHRpbWUpIHsKICBjaGFubmVsU3RhdGUubWVzc2FnZXNDYWxsYmFja1RpbWUgPSB0aW1lOwogIGNoYW5uZWxTdGF0ZS5tZXNzYWdlc0NhbGxiYWNrID0gZm47Cn0KX19uYW1lKG9uTWVzc2FnZTMsICJvbk1lc3NhZ2UiKTsKZnVuY3Rpb24gY2FuQmVVc2VkMygpIHsKICB2YXIgbHMgPSBnZXRMb2NhbFN0b3JhZ2UoKTsKICBpZiAoIWxzKSByZXR1cm4gZmFsc2U7CiAgdHJ5IHsKICAgIHZhciBrZXkyID0gIl9fYnJvYWRjYXN0Y2hhbm5lbF9jaGVjayI7CiAgICBscy5zZXRJdGVtKGtleTIsICJ3b3JrcyIpOwogICAgbHMucmVtb3ZlSXRlbShrZXkyKTsKICB9IGNhdGNoIChlMTApIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgcmV0dXJuIHRydWU7Cn0KX19uYW1lKGNhbkJlVXNlZDMsICJjYW5CZVVzZWQiKTsKZnVuY3Rpb24gYXZlcmFnZVJlc3BvbnNlVGltZTMoKSB7CiAgdmFyIGRlZmF1bHRUaW1lID0gMTIwOwogIHZhciB1c2VyQWdlbnQgPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCk7CiAgaWYgKHVzZXJBZ2VudC5pbmNsdWRlcygic2FmYXJpIikgJiYgIXVzZXJBZ2VudC5pbmNsdWRlcygiY2hyb21lIikpIHsKICAgIHJldHVybiBkZWZhdWx0VGltZSAqIDI7CiAgfQogIHJldHVybiBkZWZhdWx0VGltZTsKfQpfX25hbWUoYXZlcmFnZVJlc3BvbnNlVGltZTMsICJhdmVyYWdlUmVzcG9uc2VUaW1lIik7CnZhciBMb2NhbHN0b3JhZ2VNZXRob2QgPSB7CiAgY3JlYXRlOiBjcmVhdGUzLAogIGNsb3NlOiBjbG9zZTMsCiAgb25NZXNzYWdlOiBvbk1lc3NhZ2UzLAogIHBvc3RNZXNzYWdlOiBwb3N0TWVzc2FnZTMsCiAgY2FuQmVVc2VkOiBjYW5CZVVzZWQzLAogIHR5cGU6IHR5cGUzLAogIGF2ZXJhZ2VSZXNwb25zZVRpbWU6IGF2ZXJhZ2VSZXNwb25zZVRpbWUzLAogIG1pY3JvU2Vjb25kczogbWljcm9TZWNvbmRzNAp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2Jyb2FkY2FzdC1jaGFubmVsQDcuMy4wL25vZGVfbW9kdWxlcy9icm9hZGNhc3QtY2hhbm5lbC9kaXN0L2VzYnJvd3Nlci9tZXRob2RzL3NpbXVsYXRlLmpzCnZhciBtaWNyb1NlY29uZHM1ID0gbWljcm9TZWNvbmRzOwp2YXIgdHlwZTQgPSAic2ltdWxhdGUiOwp2YXIgU0lNVUxBVEVfQ0hBTk5FTFMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpOwpmdW5jdGlvbiBjcmVhdGU0KGNoYW5uZWxOYW1lKSB7CiAgdmFyIHN0YXRlID0gewogICAgdGltZTogbWljcm9TZWNvbmRzNSgpLAogICAgbmFtZTogY2hhbm5lbE5hbWUsCiAgICBtZXNzYWdlc0NhbGxiYWNrOiBudWxsCiAgfTsKICBTSU1VTEFURV9DSEFOTkVMUy5hZGQoc3RhdGUpOwogIHJldHVybiBzdGF0ZTsKfQpfX25hbWUoY3JlYXRlNCwgImNyZWF0ZSIpOwpmdW5jdGlvbiBjbG9zZTQoY2hhbm5lbFN0YXRlKSB7CiAgU0lNVUxBVEVfQ0hBTk5FTFNbImRlbGV0ZSJdKGNoYW5uZWxTdGF0ZSk7Cn0KX19uYW1lKGNsb3NlNCwgImNsb3NlIik7CnZhciBTSU1VTEFURV9ERUxBWV9USU1FID0gNTsKZnVuY3Rpb24gcG9zdE1lc3NhZ2U0KGNoYW5uZWxTdGF0ZSwgbWVzc2FnZUpzb24pIHsKICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzKSB7CiAgICByZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgdmFyIGNoYW5uZWxBcnJheSA9IEFycmF5LmZyb20oU0lNVUxBVEVfQ0hBTk5FTFMpOwogICAgICBjaGFubmVsQXJyYXkuZm9yRWFjaChmdW5jdGlvbihjaGFubmVsKSB7CiAgICAgICAgaWYgKGNoYW5uZWwubmFtZSA9PT0gY2hhbm5lbFN0YXRlLm5hbWUgJiYgLy8gaGFzIHNhbWUgbmFtZQogICAgICAgIGNoYW5uZWwgIT09IGNoYW5uZWxTdGF0ZSAmJiAvLyBub3Qgb3duIGNoYW5uZWwKICAgICAgICAhIWNoYW5uZWwubWVzc2FnZXNDYWxsYmFjayAmJiAvLyBoYXMgc3Vic2NyaWJlcnMKICAgICAgICBjaGFubmVsLnRpbWUgPCBtZXNzYWdlSnNvbi50aW1lKSB7CiAgICAgICAgICBjaGFubmVsLm1lc3NhZ2VzQ2FsbGJhY2sobWVzc2FnZUpzb24pOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHJlcygpOwogICAgfSwgU0lNVUxBVEVfREVMQVlfVElNRSk7CiAgfSk7Cn0KX19uYW1lKHBvc3RNZXNzYWdlNCwgInBvc3RNZXNzYWdlIik7CmZ1bmN0aW9uIG9uTWVzc2FnZTQoY2hhbm5lbFN0YXRlLCBmbikgewogIGNoYW5uZWxTdGF0ZS5tZXNzYWdlc0NhbGxiYWNrID0gZm47Cn0KX19uYW1lKG9uTWVzc2FnZTQsICJvbk1lc3NhZ2UiKTsKZnVuY3Rpb24gY2FuQmVVc2VkNCgpIHsKICByZXR1cm4gdHJ1ZTsKfQpfX25hbWUoY2FuQmVVc2VkNCwgImNhbkJlVXNlZCIpOwpmdW5jdGlvbiBhdmVyYWdlUmVzcG9uc2VUaW1lNCgpIHsKICByZXR1cm4gU0lNVUxBVEVfREVMQVlfVElNRTsKfQpfX25hbWUoYXZlcmFnZVJlc3BvbnNlVGltZTQsICJhdmVyYWdlUmVzcG9uc2VUaW1lIik7CnZhciBTaW11bGF0ZU1ldGhvZCA9IHsKICBjcmVhdGU6IGNyZWF0ZTQsCiAgY2xvc2U6IGNsb3NlNCwKICBvbk1lc3NhZ2U6IG9uTWVzc2FnZTQsCiAgcG9zdE1lc3NhZ2U6IHBvc3RNZXNzYWdlNCwKICBjYW5CZVVzZWQ6IGNhbkJlVXNlZDQsCiAgdHlwZTogdHlwZTQsCiAgYXZlcmFnZVJlc3BvbnNlVGltZTogYXZlcmFnZVJlc3BvbnNlVGltZTQsCiAgbWljcm9TZWNvbmRzOiBtaWNyb1NlY29uZHM1Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vYnJvYWRjYXN0LWNoYW5uZWxANy4zLjAvbm9kZV9tb2R1bGVzL2Jyb2FkY2FzdC1jaGFubmVsL2Rpc3QvZXNicm93c2VyL21ldGhvZC1jaG9vc2VyLmpzCnZhciBNRVRIT0RTID0gWwogIE5hdGl2ZU1ldGhvZCwKICAvLyBmYXN0ZXN0CiAgSW5kZXhlZERCTWV0aG9kLAogIExvY2Fsc3RvcmFnZU1ldGhvZApdOwpmdW5jdGlvbiBjaG9vc2VNZXRob2Qob3B0aW9ucykgewogIHZhciBjaG9vc2VNZXRob2RzID0gW10uY29uY2F0KG9wdGlvbnMubWV0aG9kcywgTUVUSE9EUykuZmlsdGVyKEJvb2xlYW4pOwogIGlmIChvcHRpb25zLnR5cGUpIHsKICAgIGlmIChvcHRpb25zLnR5cGUgPT09ICJzaW11bGF0ZSIpIHsKICAgICAgcmV0dXJuIFNpbXVsYXRlTWV0aG9kOwogICAgfQogICAgdmFyIHJldCA9IGNob29zZU1ldGhvZHMuZmluZChmdW5jdGlvbihtNSkgewogICAgICByZXR1cm4gbTUudHlwZSA9PT0gb3B0aW9ucy50eXBlOwogICAgfSk7CiAgICBpZiAoIXJldCkgdGhyb3cgbmV3IEVycm9yKCJtZXRob2QtdHlwZSAiICsgb3B0aW9ucy50eXBlICsgIiBub3QgZm91bmQiKTsKICAgIGVsc2UgcmV0dXJuIHJldDsKICB9CiAgaWYgKCFvcHRpb25zLndlYldvcmtlclN1cHBvcnQpIHsKICAgIGNob29zZU1ldGhvZHMgPSBjaG9vc2VNZXRob2RzLmZpbHRlcihmdW5jdGlvbihtNSkgewogICAgICByZXR1cm4gbTUudHlwZSAhPT0gImlkYiI7CiAgICB9KTsKICB9CiAgdmFyIHVzZU1ldGhvZCA9IGNob29zZU1ldGhvZHMuZmluZChmdW5jdGlvbihtZXRob2QpIHsKICAgIHJldHVybiBtZXRob2QuY2FuQmVVc2VkKCk7CiAgfSk7CiAgaWYgKCF1c2VNZXRob2QpIHsKICAgIHRocm93IG5ldyBFcnJvcigiTm8gdXNhYmxlIG1ldGhvZCBmb3VuZCBpbiAiICsgSlNPTi5zdHJpbmdpZnkoTUVUSE9EUy5tYXAoZnVuY3Rpb24obTUpIHsKICAgICAgcmV0dXJuIG01LnR5cGU7CiAgICB9KSkpOwogIH0gZWxzZSB7CiAgICByZXR1cm4gdXNlTWV0aG9kOwogIH0KfQpfX25hbWUoY2hvb3NlTWV0aG9kLCAiY2hvb3NlTWV0aG9kIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vYnJvYWRjYXN0LWNoYW5uZWxANy4zLjAvbm9kZV9tb2R1bGVzL2Jyb2FkY2FzdC1jaGFubmVsL2Rpc3QvZXNicm93c2VyL2Jyb2FkY2FzdC1jaGFubmVsLmpzCnZhciBPUEVOX0JST0FEQ0FTVF9DSEFOTkVMUyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7CnZhciBsYXN0SWQgPSAwOwp2YXIgQnJvYWRjYXN0Q2hhbm5lbDIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uIEJyb2FkY2FzdENoYW5uZWwzKG5hbWUsIG9wdGlvbnMpIHsKICB0aGlzLmlkID0gbGFzdElkKys7CiAgT1BFTl9CUk9BRENBU1RfQ0hBTk5FTFMuYWRkKHRoaXMpOwogIHRoaXMubmFtZSA9IG5hbWU7CiAgaWYgKEVORk9SQ0VEX09QVElPTlMpIHsKICAgIG9wdGlvbnMgPSBFTkZPUkNFRF9PUFRJT05TOwogIH0KICB0aGlzLm9wdGlvbnMgPSBmaWxsT3B0aW9uc1dpdGhEZWZhdWx0cyhvcHRpb25zKTsKICB0aGlzLm1ldGhvZCA9IGNob29zZU1ldGhvZCh0aGlzLm9wdGlvbnMpOwogIHRoaXMuX2lMID0gZmFsc2U7CiAgdGhpcy5fb25NTCA9IG51bGw7CiAgdGhpcy5fYWRkRUwgPSB7CiAgICBtZXNzYWdlOiBbXSwKICAgIGludGVybmFsOiBbXQogIH07CiAgdGhpcy5fdU1QID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTsKICB0aGlzLl9iZWZDID0gW107CiAgdGhpcy5fcHJlcFAgPSBudWxsOwogIF9wcmVwYXJlQ2hhbm5lbCh0aGlzKTsKfSwgIkJyb2FkY2FzdENoYW5uZWwiKTsKQnJvYWRjYXN0Q2hhbm5lbDIuX3B1YmtleSA9IHRydWU7CmZ1bmN0aW9uIGNsZWFyTm9kZUZvbGRlcihvcHRpb25zKSB7CiAgb3B0aW9ucyA9IGZpbGxPcHRpb25zV2l0aERlZmF1bHRzKG9wdGlvbnMpOwogIHZhciBtZXRob2QgPSBjaG9vc2VNZXRob2Qob3B0aW9ucyk7CiAgaWYgKG1ldGhvZC50eXBlID09PSAibm9kZSIpIHsKICAgIHJldHVybiBtZXRob2QuY2xlYXJOb2RlRm9sZGVyKCkudGhlbihmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9KTsKICB9IGVsc2UgewogICAgcmV0dXJuIFBST01JU0VfUkVTT0xWRURfRkFMU0U7CiAgfQp9Cl9fbmFtZShjbGVhck5vZGVGb2xkZXIsICJjbGVhck5vZGVGb2xkZXIiKTsKdmFyIEVORk9SQ0VEX09QVElPTlM7CmZ1bmN0aW9uIGVuZm9yY2VPcHRpb25zKG9wdGlvbnMpIHsKICBFTkZPUkNFRF9PUFRJT05TID0gb3B0aW9uczsKfQpfX25hbWUoZW5mb3JjZU9wdGlvbnMsICJlbmZvcmNlT3B0aW9ucyIpOwpCcm9hZGNhc3RDaGFubmVsMi5wcm90b3R5cGUgPSB7CiAgcG9zdE1lc3NhZ2U6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gcG9zdE1lc3NhZ2U1KG1zZykgewogICAgaWYgKHRoaXMuY2xvc2VkKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiQnJvYWRjYXN0Q2hhbm5lbC5wb3N0TWVzc2FnZSgpOiBDYW5ub3QgcG9zdCBtZXNzYWdlIGFmdGVyIGNoYW5uZWwgaGFzIGNsb3NlZCAiICsgLyoqCiAgICAgICAqIEluIHRoZSBwYXN0IHdoZW4gdGhpcyBlcnJvciBhcHBlYXJlZCwgaXQgd2FzIHJlYWxseSBoYXJkIHRvIGRlYnVnLgogICAgICAgKiBTbyBub3cgd2UgbG9nIHRoZSBtc2cgdG9nZXRoZXIgd2l0aCB0aGUgZXJyb3Igc28gaXQgYXQgbGVhc3QKICAgICAgICogZ2l2ZXMgc29tZSBjbHVlIGFib3V0IHdoZXJlIGluIHlvdXIgYXBwbGljYXRpb24gdGhpcyBoYXBwZW5zLgogICAgICAgKi8KICAgICAgSlNPTi5zdHJpbmdpZnkobXNnKSk7CiAgICB9CiAgICByZXR1cm4gX3Bvc3QodGhpcywgIm1lc3NhZ2UiLCBtc2cpOwogIH0sICJwb3N0TWVzc2FnZSIpLAogIHBvc3RJbnRlcm5hbDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbiBwb3N0SW50ZXJuYWwobXNnKSB7CiAgICByZXR1cm4gX3Bvc3QodGhpcywgImludGVybmFsIiwgbXNnKTsKICB9LCAicG9zdEludGVybmFsIiksCiAgc2V0IG9ubWVzc2FnZShmbikgewogICAgdmFyIHRpbWUgPSB0aGlzLm1ldGhvZC5taWNyb1NlY29uZHMoKTsKICAgIHZhciBsaXN0ZW5PYmogPSB7CiAgICAgIHRpbWUsCiAgICAgIGZuCiAgICB9OwogICAgX3JlbW92ZUxpc3RlbmVyT2JqZWN0KHRoaXMsICJtZXNzYWdlIiwgdGhpcy5fb25NTCk7CiAgICBpZiAoZm4gJiYgdHlwZW9mIGZuID09PSAiZnVuY3Rpb24iKSB7CiAgICAgIHRoaXMuX29uTUwgPSBsaXN0ZW5PYmo7CiAgICAgIF9hZGRMaXN0ZW5lck9iamVjdCh0aGlzLCAibWVzc2FnZSIsIGxpc3Rlbk9iaik7CiAgICB9IGVsc2UgewogICAgICB0aGlzLl9vbk1MID0gbnVsbDsKICAgIH0KICB9LAogIGFkZEV2ZW50TGlzdGVuZXI6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcih0eXBlNSwgZm4pIHsKICAgIHZhciB0aW1lID0gdGhpcy5tZXRob2QubWljcm9TZWNvbmRzKCk7CiAgICB2YXIgbGlzdGVuT2JqID0gewogICAgICB0aW1lLAogICAgICBmbgogICAgfTsKICAgIF9hZGRMaXN0ZW5lck9iamVjdCh0aGlzLCB0eXBlNSwgbGlzdGVuT2JqKTsKICB9LCAiYWRkRXZlbnRMaXN0ZW5lciIpLAogIHJlbW92ZUV2ZW50TGlzdGVuZXI6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlNSwgZm4pIHsKICAgIHZhciBvYmogPSB0aGlzLl9hZGRFTFt0eXBlNV0uZmluZChmdW5jdGlvbihvYmoyKSB7CiAgICAgIHJldHVybiBvYmoyLmZuID09PSBmbjsKICAgIH0pOwogICAgX3JlbW92ZUxpc3RlbmVyT2JqZWN0KHRoaXMsIHR5cGU1LCBvYmopOwogIH0sICJyZW1vdmVFdmVudExpc3RlbmVyIiksCiAgY2xvc2U6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gY2xvc2U1KCkgewogICAgdmFyIF90aGlzID0gdGhpczsKICAgIGlmICh0aGlzLmNsb3NlZCkgewogICAgICByZXR1cm47CiAgICB9CiAgICBPUEVOX0JST0FEQ0FTVF9DSEFOTkVMU1siZGVsZXRlIl0odGhpcyk7CiAgICB0aGlzLmNsb3NlZCA9IHRydWU7CiAgICB2YXIgYXdhaXRQcmVwYXJlID0gdGhpcy5fcHJlcFAgPyB0aGlzLl9wcmVwUCA6IFBST01JU0VfUkVTT0xWRURfVk9JRDsKICAgIHRoaXMuX29uTUwgPSBudWxsOwogICAgdGhpcy5fYWRkRUwubWVzc2FnZSA9IFtdOwogICAgcmV0dXJuIGF3YWl0UHJlcGFyZS50aGVuKGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gUHJvbWlzZS5hbGwoQXJyYXkuZnJvbShfdGhpcy5fdU1QKSk7CiAgICB9KS50aGVuKGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gUHJvbWlzZS5hbGwoX3RoaXMuX2JlZkMubWFwKGZ1bmN0aW9uKGZuKSB7CiAgICAgICAgcmV0dXJuIGZuKCk7CiAgICAgIH0pKTsKICAgIH0pLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBfdGhpcy5tZXRob2QuY2xvc2UoX3RoaXMuX3N0YXRlKTsKICAgIH0pOwogIH0sICJjbG9zZSIpLAogIGdldCB0eXBlKCkgewogICAgcmV0dXJuIHRoaXMubWV0aG9kLnR5cGU7CiAgfSwKICBnZXQgaXNDbG9zZWQoKSB7CiAgICByZXR1cm4gdGhpcy5jbG9zZWQ7CiAgfQp9OwpmdW5jdGlvbiBfcG9zdChicm9hZGNhc3RDaGFubmVsLCB0eXBlNSwgbXNnKSB7CiAgdmFyIHRpbWUgPSBicm9hZGNhc3RDaGFubmVsLm1ldGhvZC5taWNyb1NlY29uZHMoKTsKICB2YXIgbXNnT2JqID0gewogICAgdGltZSwKICAgIHR5cGU6IHR5cGU1LAogICAgZGF0YTogbXNnCiAgfTsKICB2YXIgYXdhaXRQcmVwYXJlID0gYnJvYWRjYXN0Q2hhbm5lbC5fcHJlcFAgPyBicm9hZGNhc3RDaGFubmVsLl9wcmVwUCA6IFBST01JU0VfUkVTT0xWRURfVk9JRDsKICByZXR1cm4gYXdhaXRQcmVwYXJlLnRoZW4oZnVuY3Rpb24oKSB7CiAgICB2YXIgc2VuZFByb21pc2UgPSBicm9hZGNhc3RDaGFubmVsLm1ldGhvZC5wb3N0TWVzc2FnZShicm9hZGNhc3RDaGFubmVsLl9zdGF0ZSwgbXNnT2JqKTsKICAgIGJyb2FkY2FzdENoYW5uZWwuX3VNUC5hZGQoc2VuZFByb21pc2UpOwogICAgc2VuZFByb21pc2VbImNhdGNoIl0oKS50aGVuKGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gYnJvYWRjYXN0Q2hhbm5lbC5fdU1QWyJkZWxldGUiXShzZW5kUHJvbWlzZSk7CiAgICB9KTsKICAgIHJldHVybiBzZW5kUHJvbWlzZTsKICB9KTsKfQpfX25hbWUoX3Bvc3QsICJfcG9zdCIpOwpmdW5jdGlvbiBfcHJlcGFyZUNoYW5uZWwoY2hhbm5lbCkgewogIHZhciBtYXliZVByb21pc2UgPSBjaGFubmVsLm1ldGhvZC5jcmVhdGUoY2hhbm5lbC5uYW1lLCBjaGFubmVsLm9wdGlvbnMpOwogIGlmIChpc1Byb21pc2UyKG1heWJlUHJvbWlzZSkpIHsKICAgIGNoYW5uZWwuX3ByZXBQID0gbWF5YmVQcm9taXNlOwogICAgbWF5YmVQcm9taXNlLnRoZW4oZnVuY3Rpb24oczkpIHsKICAgICAgY2hhbm5lbC5fc3RhdGUgPSBzOTsKICAgIH0pOwogIH0gZWxzZSB7CiAgICBjaGFubmVsLl9zdGF0ZSA9IG1heWJlUHJvbWlzZTsKICB9Cn0KX19uYW1lKF9wcmVwYXJlQ2hhbm5lbCwgIl9wcmVwYXJlQ2hhbm5lbCIpOwpmdW5jdGlvbiBfaGFzTWVzc2FnZUxpc3RlbmVycyhjaGFubmVsKSB7CiAgaWYgKGNoYW5uZWwuX2FkZEVMLm1lc3NhZ2UubGVuZ3RoID4gMCkgcmV0dXJuIHRydWU7CiAgaWYgKGNoYW5uZWwuX2FkZEVMLmludGVybmFsLmxlbmd0aCA+IDApIHJldHVybiB0cnVlOwogIHJldHVybiBmYWxzZTsKfQpfX25hbWUoX2hhc01lc3NhZ2VMaXN0ZW5lcnMsICJfaGFzTWVzc2FnZUxpc3RlbmVycyIpOwpmdW5jdGlvbiBfYWRkTGlzdGVuZXJPYmplY3QoY2hhbm5lbCwgdHlwZTUsIG9iaikgewogIGNoYW5uZWwuX2FkZEVMW3R5cGU1XS5wdXNoKG9iaik7CiAgX3N0YXJ0TGlzdGVuaW5nKGNoYW5uZWwpOwp9Cl9fbmFtZShfYWRkTGlzdGVuZXJPYmplY3QsICJfYWRkTGlzdGVuZXJPYmplY3QiKTsKZnVuY3Rpb24gX3JlbW92ZUxpc3RlbmVyT2JqZWN0KGNoYW5uZWwsIHR5cGU1LCBvYmopIHsKICBjaGFubmVsLl9hZGRFTFt0eXBlNV0gPSBjaGFubmVsLl9hZGRFTFt0eXBlNV0uZmlsdGVyKGZ1bmN0aW9uKG8xMikgewogICAgcmV0dXJuIG8xMiAhPT0gb2JqOwogIH0pOwogIF9zdG9wTGlzdGVuaW5nKGNoYW5uZWwpOwp9Cl9fbmFtZShfcmVtb3ZlTGlzdGVuZXJPYmplY3QsICJfcmVtb3ZlTGlzdGVuZXJPYmplY3QiKTsKZnVuY3Rpb24gX3N0YXJ0TGlzdGVuaW5nKGNoYW5uZWwpIHsKICBpZiAoIWNoYW5uZWwuX2lMICYmIF9oYXNNZXNzYWdlTGlzdGVuZXJzKGNoYW5uZWwpKSB7CiAgICB2YXIgbGlzdGVuZXJGbiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gbGlzdGVuZXJGbjIobXNnT2JqKSB7CiAgICAgIGNoYW5uZWwuX2FkZEVMW21zZ09iai50eXBlXS5mb3JFYWNoKGZ1bmN0aW9uKGxpc3RlbmVyT2JqZWN0KSB7CiAgICAgICAgaWYgKG1zZ09iai50aW1lID49IGxpc3RlbmVyT2JqZWN0LnRpbWUpIHsKICAgICAgICAgIGxpc3RlbmVyT2JqZWN0LmZuKG1zZ09iai5kYXRhKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSwgImxpc3RlbmVyRm4iKTsKICAgIHZhciB0aW1lID0gY2hhbm5lbC5tZXRob2QubWljcm9TZWNvbmRzKCk7CiAgICBpZiAoY2hhbm5lbC5fcHJlcFApIHsKICAgICAgY2hhbm5lbC5fcHJlcFAudGhlbihmdW5jdGlvbigpIHsKICAgICAgICBjaGFubmVsLl9pTCA9IHRydWU7CiAgICAgICAgY2hhbm5lbC5tZXRob2Qub25NZXNzYWdlKGNoYW5uZWwuX3N0YXRlLCBsaXN0ZW5lckZuLCB0aW1lKTsKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBjaGFubmVsLl9pTCA9IHRydWU7CiAgICAgIGNoYW5uZWwubWV0aG9kLm9uTWVzc2FnZShjaGFubmVsLl9zdGF0ZSwgbGlzdGVuZXJGbiwgdGltZSk7CiAgICB9CiAgfQp9Cl9fbmFtZShfc3RhcnRMaXN0ZW5pbmcsICJfc3RhcnRMaXN0ZW5pbmciKTsKZnVuY3Rpb24gX3N0b3BMaXN0ZW5pbmcoY2hhbm5lbCkgewogIGlmIChjaGFubmVsLl9pTCAmJiAhX2hhc01lc3NhZ2VMaXN0ZW5lcnMoY2hhbm5lbCkpIHsKICAgIGNoYW5uZWwuX2lMID0gZmFsc2U7CiAgICB2YXIgdGltZSA9IGNoYW5uZWwubWV0aG9kLm1pY3JvU2Vjb25kcygpOwogICAgY2hhbm5lbC5tZXRob2Qub25NZXNzYWdlKGNoYW5uZWwuX3N0YXRlLCBudWxsLCB0aW1lKTsKICB9Cn0KX19uYW1lKF9zdG9wTGlzdGVuaW5nLCAiX3N0b3BMaXN0ZW5pbmciKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNvbW1zQDEuMC4zMC9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jb21tcy9kaXN0X3RzL2RlZXMtY29tbXMuY2xhc3Nlcy5kZWVzY29tbXMuanMKdmFyIEJyb2FkY2FzdENoYW5uZWw0ID0gZ2xvYmFsVGhpcy5Ccm9hZGNhc3RDaGFubmVsOwppZiAoIUJyb2FkY2FzdENoYW5uZWw0KSB7CiAgQnJvYWRjYXN0Q2hhbm5lbDQgPSBCcm9hZGNhc3RDaGFubmVsMjsKfQp2YXIgRGVlc0NvbW1zID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkRlZXNDb21tcyIpOwogIH0KICAvLyByZWNlaXZpbmcgbWVzc2FnZXMKICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMuYnJvYWRjYXN0Q2hhbm5lbCA9IG5ldyBCcm9hZGNhc3RDaGFubmVsNCgiZGVlcy1jb21tcyIpOwogICAgdGhpcy50eXBlZHJvdXRlciA9IG5ldyBkaXN0X3RzX2V4cG9ydHMxNS5UeXBlZFJvdXRlcigpOwogICAgdGhpcy50eXBlZHRhcmdldCA9IG5ldyBkaXN0X3RzX2V4cG9ydHMxNS5UeXBlZFRhcmdldCh7CiAgICAgIHBvc3RNZXRob2RXaXRoVHlwZWRSb3V0ZXI6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoYXN5bmMgKG1lc3NhZ2VBcmcpID0+IHsKICAgICAgICB0aGlzLnBvc3RNZXNzYWdlKG1lc3NhZ2VBcmcpOwogICAgICB9LCAicG9zdE1ldGhvZFdpdGhUeXBlZFJvdXRlciIpLAogICAgICB0eXBlZFJvdXRlclJlZjogdGhpcy50eXBlZHJvdXRlcgogICAgfSk7CiAgICB0aGlzLmJyb2FkY2FzdENoYW5uZWwub25tZXNzYWdlID0gYXN5bmMgKGV2ZW50QXJnKSA9PiB7CiAgICAgIGNvbnN0IG1lc3NhZ2UyID0gZXZlbnRBcmcubWV0aG9kID8gZXZlbnRBcmcgOiBldmVudEFyZy5kYXRhOwogICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShtZXNzYWdlMikpOwogICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMudHlwZWRyb3V0ZXIucm91dGVBbmRBZGRSZXNwb25zZShtZXNzYWdlMiwgeyBza2lwSG9va3M6IHRydWUgfSk7CiAgICAgIGlmIChyZXNwb25zZSAmJiAhcmVzcG9uc2UuZXJyb3IpIHsKICAgICAgICB0aGlzLnBvc3RNZXNzYWdlKHJlc3BvbnNlKTsKICAgICAgfSBlbHNlIHsKICAgICAgfQogICAgfTsKICB9CiAgLyoqCiAgICogY3JlYXRlcyBhIHR5cGVkcmVxdWVzdCB3aXRoIHRoaXMgY2xhc3NlcyBwb3N0TWVzc2FnZSBhcyBwb3N0TWV0aG9kCiAgICovCiAgY3JlYXRlVHlwZWRSZXF1ZXN0KG1ldGhvZE5hbWUpIHsKICAgIGNvbnN0IHR5cGVkcmVxdWVzdCA9IG5ldyBkaXN0X3RzX2V4cG9ydHMxNS5UeXBlZFJlcXVlc3QodGhpcy50eXBlZHRhcmdldCwgbWV0aG9kTmFtZSk7CiAgICByZXR1cm4gdHlwZWRyZXF1ZXN0OwogIH0KICAvKioKICAgKiBwb3N0cyBhIHR5cGVkcmVxdWVzdG1lc3NhZ2UKICAgKi8KICBhc3luYyBwb3N0TWVzc2FnZShtZXNzYWdlQXJnKSB7CiAgICB0aGlzLmJyb2FkY2FzdENoYW5uZWwucG9zdE1lc3NhZ2UobWVzc2FnZUFyZyk7CiAgfQogIC8qKgogICAqIHN1YnNjcmliZSB0byBtZXNzYWdlcwogICAqLwogIGFzeW5jIGNyZWF0ZVR5cGVkSGFuZGxlcihtZXRob2RBcmcsIGhhbmRsZXJGdW5jdGlvbikgewogICAgdGhpcy50eXBlZHJvdXRlci5hZGRUeXBlZEhhbmRsZXIobmV3IGRpc3RfdHNfZXhwb3J0czE1LlR5cGVkSGFuZGxlcihtZXRob2RBcmcsIGhhbmRsZXJGdW5jdGlvbikpOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydG1hcmtkb3duQDMuMC4zL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydG1hcmtkb3duL2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czE3ID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czE3LCB7CiAgU21hcnRNYXJrZG93bjogKCkgPT4gU21hcnRNYXJrZG93bgp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9iYWlsQDIuMC4yL25vZGVfbW9kdWxlcy9iYWlsL2luZGV4LmpzCmZ1bmN0aW9uIGJhaWwoZXJyb3IpIHsKICBpZiAoZXJyb3IpIHsKICAgIHRocm93IGVycm9yOwogIH0KfQpfX25hbWUoYmFpbCwgImJhaWwiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kZXZsb3BAMS4xLjAvbm9kZV9tb2R1bGVzL2RldmxvcC9saWIvZGVmYXVsdC5qcwpmdW5jdGlvbiBkZXByZWNhdGUoZm4pIHsKICByZXR1cm4gZm47Cn0KX19uYW1lKGRlcHJlY2F0ZSwgImRlcHJlY2F0ZSIpOwpmdW5jdGlvbiBlcXVhbCgpIHsKfQpfX25hbWUoZXF1YWwsICJlcXVhbCIpOwpmdW5jdGlvbiBvaygpIHsKfQpfX25hbWUob2ssICJvayIpOwpmdW5jdGlvbiB1bnJlYWNoYWJsZSgpIHsKfQpfX25hbWUodW5yZWFjaGFibGUsICJ1bnJlYWNoYWJsZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2lzLXBsYWluLW9iakA0LjEuMC9ub2RlX21vZHVsZXMvaXMtcGxhaW4tb2JqL2luZGV4LmpzCmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUyKSB7CiAgaWYgKHR5cGVvZiB2YWx1ZTIgIT09ICJvYmplY3QiIHx8IHZhbHVlMiA9PT0gbnVsbCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUyKTsKICByZXR1cm4gKHByb3RvdHlwZSA9PT0gbnVsbCB8fCBwcm90b3R5cGUgPT09IE9iamVjdC5wcm90b3R5cGUgfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSkgPT09IG51bGwpICYmICEoU3ltYm9sLnRvU3RyaW5nVGFnIGluIHZhbHVlMikgJiYgIShTeW1ib2wuaXRlcmF0b3IgaW4gdmFsdWUyKTsKfQpfX25hbWUoaXNQbGFpbk9iamVjdCwgImlzUGxhaW5PYmplY3QiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS90cm91Z2hAMi4yLjAvbm9kZV9tb2R1bGVzL3Ryb3VnaC9saWIvaW5kZXguanMKZnVuY3Rpb24gdHJvdWdoKCkgewogIGNvbnN0IGZucyA9IFtdOwogIGNvbnN0IHBpcGVsaW5lID0geyBydW4sIHVzZSB9OwogIHJldHVybiBwaXBlbGluZTsKICBmdW5jdGlvbiBydW4oLi4udmFsdWVzKSB7CiAgICBsZXQgbWlkZGxld2FyZUluZGV4ID0gLTE7CiAgICBjb25zdCBjYWxsYmFjayA9IHZhbHVlcy5wb3AoKTsKICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICJmdW5jdGlvbiIpIHsKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiRXhwZWN0ZWQgZnVuY3Rpb24gYXMgbGFzdCBhcmd1bWVudCwgbm90ICIgKyBjYWxsYmFjayk7CiAgICB9CiAgICBuZXh0MihudWxsLCAuLi52YWx1ZXMpOwogICAgZnVuY3Rpb24gbmV4dDIoZXJyb3IsIC4uLm91dHB1dCkgewogICAgICBjb25zdCBmbiA9IGZuc1srK21pZGRsZXdhcmVJbmRleF07CiAgICAgIGxldCBpbmRleDIgPSAtMTsKICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgY2FsbGJhY2soZXJyb3IpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB3aGlsZSAoKytpbmRleDIgPCB2YWx1ZXMubGVuZ3RoKSB7CiAgICAgICAgaWYgKG91dHB1dFtpbmRleDJdID09PSBudWxsIHx8IG91dHB1dFtpbmRleDJdID09PSB2b2lkIDApIHsKICAgICAgICAgIG91dHB1dFtpbmRleDJdID0gdmFsdWVzW2luZGV4Ml07CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhbHVlcyA9IG91dHB1dDsKICAgICAgaWYgKGZuKSB7CiAgICAgICAgd3JhcDIoZm4sIG5leHQyKSguLi5vdXRwdXQpOwogICAgICB9IGVsc2UgewogICAgICAgIGNhbGxiYWNrKG51bGwsIC4uLm91dHB1dCk7CiAgICAgIH0KICAgIH0KICAgIF9fbmFtZShuZXh0MiwgIm5leHQiKTsKICB9CiAgX19uYW1lKHJ1biwgInJ1biIpOwogIGZ1bmN0aW9uIHVzZShtaWRkZWx3YXJlKSB7CiAgICBpZiAodHlwZW9mIG1pZGRlbHdhcmUgIT09ICJmdW5jdGlvbiIpIHsKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigKICAgICAgICAiRXhwZWN0ZWQgYG1pZGRlbHdhcmVgIHRvIGJlIGEgZnVuY3Rpb24sIG5vdCAiICsgbWlkZGVsd2FyZQogICAgICApOwogICAgfQogICAgZm5zLnB1c2gobWlkZGVsd2FyZSk7CiAgICByZXR1cm4gcGlwZWxpbmU7CiAgfQogIF9fbmFtZSh1c2UsICJ1c2UiKTsKfQpfX25hbWUodHJvdWdoLCAidHJvdWdoIik7CmZ1bmN0aW9uIHdyYXAyKG1pZGRsZXdhcmUsIGNhbGxiYWNrKSB7CiAgbGV0IGNhbGxlZDsKICByZXR1cm4gd3JhcHBlZDsKICBmdW5jdGlvbiB3cmFwcGVkKC4uLnBhcmFtZXRlcnMpIHsKICAgIGNvbnN0IGZuRXhwZWN0c0NhbGxiYWNrID0gbWlkZGxld2FyZS5sZW5ndGggPiBwYXJhbWV0ZXJzLmxlbmd0aDsKICAgIGxldCByZXN1bHQ7CiAgICBpZiAoZm5FeHBlY3RzQ2FsbGJhY2spIHsKICAgICAgcGFyYW1ldGVycy5wdXNoKGRvbmUpOwogICAgfQogICAgdHJ5IHsKICAgICAgcmVzdWx0ID0gbWlkZGxld2FyZS5hcHBseSh0aGlzLCBwYXJhbWV0ZXJzKTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGNvbnN0IGV4Y2VwdGlvbiA9ICgKICAgICAgICAvKiogQHR5cGUge0Vycm9yfSAqLwogICAgICAgIGVycm9yCiAgICAgICk7CiAgICAgIGlmIChmbkV4cGVjdHNDYWxsYmFjayAmJiBjYWxsZWQpIHsKICAgICAgICB0aHJvdyBleGNlcHRpb247CiAgICAgIH0KICAgICAgcmV0dXJuIGRvbmUoZXhjZXB0aW9uKTsKICAgIH0KICAgIGlmICghZm5FeHBlY3RzQ2FsbGJhY2spIHsKICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQudGhlbiAmJiB0eXBlb2YgcmVzdWx0LnRoZW4gPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICByZXN1bHQudGhlbih0aGVuLCBkb25lKTsKICAgICAgfSBlbHNlIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikgewogICAgICAgIGRvbmUocmVzdWx0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGVuKHJlc3VsdCk7CiAgICAgIH0KICAgIH0KICB9CiAgX19uYW1lKHdyYXBwZWQsICJ3cmFwcGVkIik7CiAgZnVuY3Rpb24gZG9uZShlcnJvciwgLi4ub3V0cHV0KSB7CiAgICBpZiAoIWNhbGxlZCkgewogICAgICBjYWxsZWQgPSB0cnVlOwogICAgICBjYWxsYmFjayhlcnJvciwgLi4ub3V0cHV0KTsKICAgIH0KICB9CiAgX19uYW1lKGRvbmUsICJkb25lIik7CiAgZnVuY3Rpb24gdGhlbih2YWx1ZTIpIHsKICAgIGRvbmUobnVsbCwgdmFsdWUyKTsKICB9CiAgX19uYW1lKHRoZW4sICJ0aGVuIik7Cn0KX19uYW1lKHdyYXAyLCAid3JhcCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3VuaXN0LXV0aWwtc3RyaW5naWZ5LXBvc2l0aW9uQDQuMC4wL25vZGVfbW9kdWxlcy91bmlzdC11dGlsLXN0cmluZ2lmeS1wb3NpdGlvbi9saWIvaW5kZXguanMKZnVuY3Rpb24gc3RyaW5naWZ5UG9zaXRpb24odmFsdWUyKSB7CiAgaWYgKCF2YWx1ZTIgfHwgdHlwZW9mIHZhbHVlMiAhPT0gIm9iamVjdCIpIHsKICAgIHJldHVybiAiIjsKICB9CiAgaWYgKCJwb3NpdGlvbiIgaW4gdmFsdWUyIHx8ICJ0eXBlIiBpbiB2YWx1ZTIpIHsKICAgIHJldHVybiBwb3NpdGlvbih2YWx1ZTIucG9zaXRpb24pOwogIH0KICBpZiAoInN0YXJ0IiBpbiB2YWx1ZTIgfHwgImVuZCIgaW4gdmFsdWUyKSB7CiAgICByZXR1cm4gcG9zaXRpb24odmFsdWUyKTsKICB9CiAgaWYgKCJsaW5lIiBpbiB2YWx1ZTIgfHwgImNvbHVtbiIgaW4gdmFsdWUyKSB7CiAgICByZXR1cm4gcG9pbnQodmFsdWUyKTsKICB9CiAgcmV0dXJuICIiOwp9Cl9fbmFtZShzdHJpbmdpZnlQb3NpdGlvbiwgInN0cmluZ2lmeVBvc2l0aW9uIik7CmZ1bmN0aW9uIHBvaW50KHBvaW50NCkgewogIHJldHVybiBpbmRleChwb2ludDQgJiYgcG9pbnQ0LmxpbmUpICsgIjoiICsgaW5kZXgocG9pbnQ0ICYmIHBvaW50NC5jb2x1bW4pOwp9Cl9fbmFtZShwb2ludCwgInBvaW50Iik7CmZ1bmN0aW9uIHBvc2l0aW9uKHBvcykgewogIHJldHVybiBwb2ludChwb3MgJiYgcG9zLnN0YXJ0KSArICItIiArIHBvaW50KHBvcyAmJiBwb3MuZW5kKTsKfQpfX25hbWUocG9zaXRpb24sICJwb3NpdGlvbiIpOwpmdW5jdGlvbiBpbmRleCh2YWx1ZTIpIHsKICByZXR1cm4gdmFsdWUyICYmIHR5cGVvZiB2YWx1ZTIgPT09ICJudW1iZXIiID8gdmFsdWUyIDogMTsKfQpfX25hbWUoaW5kZXgsICJpbmRleCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3ZmaWxlLW1lc3NhZ2VANC4wLjMvbm9kZV9tb2R1bGVzL3ZmaWxlLW1lc3NhZ2UvbGliL2luZGV4LmpzCnZhciBWRmlsZU1lc3NhZ2UgPSBjbGFzcyBleHRlbmRzIEVycm9yIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJWRmlsZU1lc3NhZ2UiKTsKICB9CiAgLyoqCiAgICogQ3JlYXRlIGEgbWVzc2FnZSBmb3IgYHJlYXNvbmAuCiAgICoKICAgKiA+IPCfqqYgKipOb3RlKio6IGFsc28gaGFzIG9ic29sZXRlIHNpZ25hdHVyZXMuCiAgICoKICAgKiBAb3ZlcmxvYWQKICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uCiAgICogQHBhcmFtIHtPcHRpb25zIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29wdGlvbnNdCiAgICogQHJldHVybnMKICAgKgogICAqIEBvdmVybG9hZAogICAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24KICAgKiBAcGFyYW0ge05vZGUgfCBOb2RlTGlrZSB8IG51bGwgfCB1bmRlZmluZWR9IHBhcmVudAogICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgKiBAcmV0dXJucwogICAqCiAgICogQG92ZXJsb2FkCiAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbgogICAqIEBwYXJhbSB7UG9pbnQgfCBQb3NpdGlvbiB8IG51bGwgfCB1bmRlZmluZWR9IHBsYWNlCiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3JpZ2luXQogICAqIEByZXR1cm5zCiAgICoKICAgKiBAb3ZlcmxvYWQKICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uCiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3JpZ2luXQogICAqIEByZXR1cm5zCiAgICoKICAgKiBAb3ZlcmxvYWQKICAgKiBAcGFyYW0ge0Vycm9yIHwgVkZpbGVNZXNzYWdlfSBjYXVzZQogICAqIEBwYXJhbSB7Tm9kZSB8IE5vZGVMaWtlIHwgbnVsbCB8IHVuZGVmaW5lZH0gcGFyZW50CiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3JpZ2luXQogICAqIEByZXR1cm5zCiAgICoKICAgKiBAb3ZlcmxvYWQKICAgKiBAcGFyYW0ge0Vycm9yIHwgVkZpbGVNZXNzYWdlfSBjYXVzZQogICAqIEBwYXJhbSB7UG9pbnQgfCBQb3NpdGlvbiB8IG51bGwgfCB1bmRlZmluZWR9IHBsYWNlCiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3JpZ2luXQogICAqIEByZXR1cm5zCiAgICoKICAgKiBAb3ZlcmxvYWQKICAgKiBAcGFyYW0ge0Vycm9yIHwgVkZpbGVNZXNzYWdlfSBjYXVzZQogICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgKiBAcmV0dXJucwogICAqCiAgICogQHBhcmFtIHtFcnJvciB8IFZGaWxlTWVzc2FnZSB8IHN0cmluZ30gY2F1c2VPclJlYXNvbgogICAqICAgUmVhc29uIGZvciBtZXNzYWdlLCBzaG91bGQgdXNlIG1hcmtkb3duLgogICAqIEBwYXJhbSB7Tm9kZSB8IE5vZGVMaWtlIHwgT3B0aW9ucyB8IFBvaW50IHwgUG9zaXRpb24gfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3B0aW9uc09yUGFyZW50T3JQbGFjZV0KICAgKiAgIENvbmZpZ3VyYXRpb24gKG9wdGlvbmFsKS4KICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcmlnaW5dCiAgICogICBQbGFjZSBpbiBjb2RlIHdoZXJlIHRoZSBtZXNzYWdlIG9yaWdpbmF0ZXMgKGV4YW1wbGU6CiAgICogICBgJ215LXBhY2thZ2U6bXktcnVsZSdgIG9yIGAnbXktcnVsZSdgKS4KICAgKiBAcmV0dXJucwogICAqICAgSW5zdGFuY2Ugb2YgYFZGaWxlTWVzc2FnZWAuCiAgICovCiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHkKICBjb25zdHJ1Y3RvcihjYXVzZU9yUmVhc29uLCBvcHRpb25zT3JQYXJlbnRPclBsYWNlLCBvcmlnaW4pIHsKICAgIHN1cGVyKCk7CiAgICBpZiAodHlwZW9mIG9wdGlvbnNPclBhcmVudE9yUGxhY2UgPT09ICJzdHJpbmciKSB7CiAgICAgIG9yaWdpbiA9IG9wdGlvbnNPclBhcmVudE9yUGxhY2U7CiAgICAgIG9wdGlvbnNPclBhcmVudE9yUGxhY2UgPSB2b2lkIDA7CiAgICB9CiAgICBsZXQgcmVhc29uID0gIiI7CiAgICBsZXQgb3B0aW9ucyA9IHt9OwogICAgbGV0IGxlZ2FjeUNhdXNlID0gZmFsc2U7CiAgICBpZiAob3B0aW9uc09yUGFyZW50T3JQbGFjZSkgewogICAgICBpZiAoImxpbmUiIGluIG9wdGlvbnNPclBhcmVudE9yUGxhY2UgJiYgImNvbHVtbiIgaW4gb3B0aW9uc09yUGFyZW50T3JQbGFjZSkgewogICAgICAgIG9wdGlvbnMgPSB7IHBsYWNlOiBvcHRpb25zT3JQYXJlbnRPclBsYWNlIH07CiAgICAgIH0gZWxzZSBpZiAoInN0YXJ0IiBpbiBvcHRpb25zT3JQYXJlbnRPclBsYWNlICYmICJlbmQiIGluIG9wdGlvbnNPclBhcmVudE9yUGxhY2UpIHsKICAgICAgICBvcHRpb25zID0geyBwbGFjZTogb3B0aW9uc09yUGFyZW50T3JQbGFjZSB9OwogICAgICB9IGVsc2UgaWYgKCJ0eXBlIiBpbiBvcHRpb25zT3JQYXJlbnRPclBsYWNlKSB7CiAgICAgICAgb3B0aW9ucyA9IHsKICAgICAgICAgIGFuY2VzdG9yczogW29wdGlvbnNPclBhcmVudE9yUGxhY2VdLAogICAgICAgICAgcGxhY2U6IG9wdGlvbnNPclBhcmVudE9yUGxhY2UucG9zaXRpb24KICAgICAgICB9OwogICAgICB9IGVsc2UgewogICAgICAgIG9wdGlvbnMgPSB7IC4uLm9wdGlvbnNPclBhcmVudE9yUGxhY2UgfTsKICAgICAgfQogICAgfQogICAgaWYgKHR5cGVvZiBjYXVzZU9yUmVhc29uID09PSAic3RyaW5nIikgewogICAgICByZWFzb24gPSBjYXVzZU9yUmVhc29uOwogICAgfSBlbHNlIGlmICghb3B0aW9ucy5jYXVzZSAmJiBjYXVzZU9yUmVhc29uKSB7CiAgICAgIGxlZ2FjeUNhdXNlID0gdHJ1ZTsKICAgICAgcmVhc29uID0gY2F1c2VPclJlYXNvbi5tZXNzYWdlOwogICAgICBvcHRpb25zLmNhdXNlID0gY2F1c2VPclJlYXNvbjsKICAgIH0KICAgIGlmICghb3B0aW9ucy5ydWxlSWQgJiYgIW9wdGlvbnMuc291cmNlICYmIHR5cGVvZiBvcmlnaW4gPT09ICJzdHJpbmciKSB7CiAgICAgIGNvbnN0IGluZGV4MiA9IG9yaWdpbi5pbmRleE9mKCI6Iik7CiAgICAgIGlmIChpbmRleDIgPT09IC0xKSB7CiAgICAgICAgb3B0aW9ucy5ydWxlSWQgPSBvcmlnaW47CiAgICAgIH0gZWxzZSB7CiAgICAgICAgb3B0aW9ucy5zb3VyY2UgPSBvcmlnaW4uc2xpY2UoMCwgaW5kZXgyKTsKICAgICAgICBvcHRpb25zLnJ1bGVJZCA9IG9yaWdpbi5zbGljZShpbmRleDIgKyAxKTsKICAgICAgfQogICAgfQogICAgaWYgKCFvcHRpb25zLnBsYWNlICYmIG9wdGlvbnMuYW5jZXN0b3JzICYmIG9wdGlvbnMuYW5jZXN0b3JzKSB7CiAgICAgIGNvbnN0IHBhcmVudCA9IG9wdGlvbnMuYW5jZXN0b3JzW29wdGlvbnMuYW5jZXN0b3JzLmxlbmd0aCAtIDFdOwogICAgICBpZiAocGFyZW50KSB7CiAgICAgICAgb3B0aW9ucy5wbGFjZSA9IHBhcmVudC5wb3NpdGlvbjsKICAgICAgfQogICAgfQogICAgY29uc3Qgc3RhcnQgPSBvcHRpb25zLnBsYWNlICYmICJzdGFydCIgaW4gb3B0aW9ucy5wbGFjZSA/IG9wdGlvbnMucGxhY2Uuc3RhcnQgOiBvcHRpb25zLnBsYWNlOwogICAgdGhpcy5hbmNlc3RvcnMgPSBvcHRpb25zLmFuY2VzdG9ycyB8fCB2b2lkIDA7CiAgICB0aGlzLmNhdXNlID0gb3B0aW9ucy5jYXVzZSB8fCB2b2lkIDA7CiAgICB0aGlzLmNvbHVtbiA9IHN0YXJ0ID8gc3RhcnQuY29sdW1uIDogdm9pZCAwOwogICAgdGhpcy5mYXRhbCA9IHZvaWQgMDsKICAgIHRoaXMuZmlsZSA9ICIiOwogICAgdGhpcy5tZXNzYWdlID0gcmVhc29uOwogICAgdGhpcy5saW5lID0gc3RhcnQgPyBzdGFydC5saW5lIDogdm9pZCAwOwogICAgdGhpcy5uYW1lID0gc3RyaW5naWZ5UG9zaXRpb24ob3B0aW9ucy5wbGFjZSkgfHwgIjE6MSI7CiAgICB0aGlzLnBsYWNlID0gb3B0aW9ucy5wbGFjZSB8fCB2b2lkIDA7CiAgICB0aGlzLnJlYXNvbiA9IHRoaXMubWVzc2FnZTsKICAgIHRoaXMucnVsZUlkID0gb3B0aW9ucy5ydWxlSWQgfHwgdm9pZCAwOwogICAgdGhpcy5zb3VyY2UgPSBvcHRpb25zLnNvdXJjZSB8fCB2b2lkIDA7CiAgICB0aGlzLnN0YWNrID0gbGVnYWN5Q2F1c2UgJiYgb3B0aW9ucy5jYXVzZSAmJiB0eXBlb2Ygb3B0aW9ucy5jYXVzZS5zdGFjayA9PT0gInN0cmluZyIgPyBvcHRpb25zLmNhdXNlLnN0YWNrIDogIiI7CiAgICB0aGlzLmFjdHVhbCA9IHZvaWQgMDsKICAgIHRoaXMuZXhwZWN0ZWQgPSB2b2lkIDA7CiAgICB0aGlzLm5vdGUgPSB2b2lkIDA7CiAgICB0aGlzLnVybCA9IHZvaWQgMDsKICB9Cn07ClZGaWxlTWVzc2FnZS5wcm90b3R5cGUuZmlsZSA9ICIiOwpWRmlsZU1lc3NhZ2UucHJvdG90eXBlLm5hbWUgPSAiIjsKVkZpbGVNZXNzYWdlLnByb3RvdHlwZS5yZWFzb24gPSAiIjsKVkZpbGVNZXNzYWdlLnByb3RvdHlwZS5tZXNzYWdlID0gIiI7ClZGaWxlTWVzc2FnZS5wcm90b3R5cGUuc3RhY2sgPSAiIjsKVkZpbGVNZXNzYWdlLnByb3RvdHlwZS5jb2x1bW4gPSB2b2lkIDA7ClZGaWxlTWVzc2FnZS5wcm90b3R5cGUubGluZSA9IHZvaWQgMDsKVkZpbGVNZXNzYWdlLnByb3RvdHlwZS5hbmNlc3RvcnMgPSB2b2lkIDA7ClZGaWxlTWVzc2FnZS5wcm90b3R5cGUuY2F1c2UgPSB2b2lkIDA7ClZGaWxlTWVzc2FnZS5wcm90b3R5cGUuZmF0YWwgPSB2b2lkIDA7ClZGaWxlTWVzc2FnZS5wcm90b3R5cGUucGxhY2UgPSB2b2lkIDA7ClZGaWxlTWVzc2FnZS5wcm90b3R5cGUucnVsZUlkID0gdm9pZCAwOwpWRmlsZU1lc3NhZ2UucHJvdG90eXBlLnNvdXJjZSA9IHZvaWQgMDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS92ZmlsZUA2LjAuMy9ub2RlX21vZHVsZXMvdmZpbGUvbGliL21pbnBhdGguYnJvd3Nlci5qcwp2YXIgbWlucGF0aCA9IHsgYmFzZW5hbWUsIGRpcm5hbWUsIGV4dG5hbWUsIGpvaW4sIHNlcDogIi8iIH07CmZ1bmN0aW9uIGJhc2VuYW1lKHBhdGgyLCBleHRuYW1lMikgewogIGlmIChleHRuYW1lMiAhPT0gdm9pZCAwICYmIHR5cGVvZiBleHRuYW1lMiAhPT0gInN0cmluZyIpIHsKICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJyJleHQiIGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcnKTsKICB9CiAgYXNzZXJ0UGF0aChwYXRoMik7CiAgbGV0IHN0YXJ0ID0gMDsKICBsZXQgZW5kID0gLTE7CiAgbGV0IGluZGV4MiA9IHBhdGgyLmxlbmd0aDsKICBsZXQgc2Vlbk5vblNsYXNoOwogIGlmIChleHRuYW1lMiA9PT0gdm9pZCAwIHx8IGV4dG5hbWUyLmxlbmd0aCA9PT0gMCB8fCBleHRuYW1lMi5sZW5ndGggPiBwYXRoMi5sZW5ndGgpIHsKICAgIHdoaWxlIChpbmRleDItLSkgewogICAgICBpZiAocGF0aDIuY29kZVBvaW50QXQoaW5kZXgyKSA9PT0gNDcpIHsKICAgICAgICBpZiAoc2Vlbk5vblNsYXNoKSB7CiAgICAgICAgICBzdGFydCA9IGluZGV4MiArIDE7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZW5kIDwgMCkgewogICAgICAgIHNlZW5Ob25TbGFzaCA9IHRydWU7CiAgICAgICAgZW5kID0gaW5kZXgyICsgMTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGVuZCA8IDAgPyAiIiA6IHBhdGgyLnNsaWNlKHN0YXJ0LCBlbmQpOwogIH0KICBpZiAoZXh0bmFtZTIgPT09IHBhdGgyKSB7CiAgICByZXR1cm4gIiI7CiAgfQogIGxldCBmaXJzdE5vblNsYXNoRW5kID0gLTE7CiAgbGV0IGV4dG5hbWVJbmRleCA9IGV4dG5hbWUyLmxlbmd0aCAtIDE7CiAgd2hpbGUgKGluZGV4Mi0tKSB7CiAgICBpZiAocGF0aDIuY29kZVBvaW50QXQoaW5kZXgyKSA9PT0gNDcpIHsKICAgICAgaWYgKHNlZW5Ob25TbGFzaCkgewogICAgICAgIHN0YXJ0ID0gaW5kZXgyICsgMTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaWYgKGZpcnN0Tm9uU2xhc2hFbmQgPCAwKSB7CiAgICAgICAgc2Vlbk5vblNsYXNoID0gdHJ1ZTsKICAgICAgICBmaXJzdE5vblNsYXNoRW5kID0gaW5kZXgyICsgMTsKICAgICAgfQogICAgICBpZiAoZXh0bmFtZUluZGV4ID4gLTEpIHsKICAgICAgICBpZiAocGF0aDIuY29kZVBvaW50QXQoaW5kZXgyKSA9PT0gZXh0bmFtZTIuY29kZVBvaW50QXQoZXh0bmFtZUluZGV4LS0pKSB7CiAgICAgICAgICBpZiAoZXh0bmFtZUluZGV4IDwgMCkgewogICAgICAgICAgICBlbmQgPSBpbmRleDI7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGV4dG5hbWVJbmRleCA9IC0xOwogICAgICAgICAgZW5kID0gZmlyc3ROb25TbGFzaEVuZDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CiAgaWYgKHN0YXJ0ID09PSBlbmQpIHsKICAgIGVuZCA9IGZpcnN0Tm9uU2xhc2hFbmQ7CiAgfSBlbHNlIGlmIChlbmQgPCAwKSB7CiAgICBlbmQgPSBwYXRoMi5sZW5ndGg7CiAgfQogIHJldHVybiBwYXRoMi5zbGljZShzdGFydCwgZW5kKTsKfQpfX25hbWUoYmFzZW5hbWUsICJiYXNlbmFtZSIpOwpmdW5jdGlvbiBkaXJuYW1lKHBhdGgyKSB7CiAgYXNzZXJ0UGF0aChwYXRoMik7CiAgaWYgKHBhdGgyLmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuICIuIjsKICB9CiAgbGV0IGVuZCA9IC0xOwogIGxldCBpbmRleDIgPSBwYXRoMi5sZW5ndGg7CiAgbGV0IHVubWF0Y2hlZFNsYXNoOwogIHdoaWxlICgtLWluZGV4MikgewogICAgaWYgKHBhdGgyLmNvZGVQb2ludEF0KGluZGV4MikgPT09IDQ3KSB7CiAgICAgIGlmICh1bm1hdGNoZWRTbGFzaCkgewogICAgICAgIGVuZCA9IGluZGV4MjsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfSBlbHNlIGlmICghdW5tYXRjaGVkU2xhc2gpIHsKICAgICAgdW5tYXRjaGVkU2xhc2ggPSB0cnVlOwogICAgfQogIH0KICByZXR1cm4gZW5kIDwgMCA/IHBhdGgyLmNvZGVQb2ludEF0KDApID09PSA0NyA/ICIvIiA6ICIuIiA6IGVuZCA9PT0gMSAmJiBwYXRoMi5jb2RlUG9pbnRBdCgwKSA9PT0gNDcgPyAiLy8iIDogcGF0aDIuc2xpY2UoMCwgZW5kKTsKfQpfX25hbWUoZGlybmFtZSwgImRpcm5hbWUiKTsKZnVuY3Rpb24gZXh0bmFtZShwYXRoMikgewogIGFzc2VydFBhdGgocGF0aDIpOwogIGxldCBpbmRleDIgPSBwYXRoMi5sZW5ndGg7CiAgbGV0IGVuZCA9IC0xOwogIGxldCBzdGFydFBhcnQgPSAwOwogIGxldCBzdGFydERvdCA9IC0xOwogIGxldCBwcmVEb3RTdGF0ZSA9IDA7CiAgbGV0IHVubWF0Y2hlZFNsYXNoOwogIHdoaWxlIChpbmRleDItLSkgewogICAgY29uc3QgY29kZTQgPSBwYXRoMi5jb2RlUG9pbnRBdChpbmRleDIpOwogICAgaWYgKGNvZGU0ID09PSA0NykgewogICAgICBpZiAodW5tYXRjaGVkU2xhc2gpIHsKICAgICAgICBzdGFydFBhcnQgPSBpbmRleDIgKyAxOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgaWYgKGVuZCA8IDApIHsKICAgICAgdW5tYXRjaGVkU2xhc2ggPSB0cnVlOwogICAgICBlbmQgPSBpbmRleDIgKyAxOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA0NikgewogICAgICBpZiAoc3RhcnREb3QgPCAwKSB7CiAgICAgICAgc3RhcnREb3QgPSBpbmRleDI7CiAgICAgIH0gZWxzZSBpZiAocHJlRG90U3RhdGUgIT09IDEpIHsKICAgICAgICBwcmVEb3RTdGF0ZSA9IDE7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoc3RhcnREb3QgPiAtMSkgewogICAgICBwcmVEb3RTdGF0ZSA9IC0xOwogICAgfQogIH0KICBpZiAoc3RhcnREb3QgPCAwIHx8IGVuZCA8IDAgfHwgLy8gV2Ugc2F3IGEgbm9uLWRvdCBjaGFyYWN0ZXIgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBkb3QuCiAgcHJlRG90U3RhdGUgPT09IDAgfHwgLy8gVGhlIChyaWdodC1tb3N0KSB0cmltbWVkIHBhdGggY29tcG9uZW50IGlzIGV4YWN0bHkgYC4uYC4KICBwcmVEb3RTdGF0ZSA9PT0gMSAmJiBzdGFydERvdCA9PT0gZW5kIC0gMSAmJiBzdGFydERvdCA9PT0gc3RhcnRQYXJ0ICsgMSkgewogICAgcmV0dXJuICIiOwogIH0KICByZXR1cm4gcGF0aDIuc2xpY2Uoc3RhcnREb3QsIGVuZCk7Cn0KX19uYW1lKGV4dG5hbWUsICJleHRuYW1lIik7CmZ1bmN0aW9uIGpvaW4oLi4uc2VnbWVudHMpIHsKICBsZXQgaW5kZXgyID0gLTE7CiAgbGV0IGpvaW5lZDsKICB3aGlsZSAoKytpbmRleDIgPCBzZWdtZW50cy5sZW5ndGgpIHsKICAgIGFzc2VydFBhdGgoc2VnbWVudHNbaW5kZXgyXSk7CiAgICBpZiAoc2VnbWVudHNbaW5kZXgyXSkgewogICAgICBqb2luZWQgPSBqb2luZWQgPT09IHZvaWQgMCA/IHNlZ21lbnRzW2luZGV4Ml0gOiBqb2luZWQgKyAiLyIgKyBzZWdtZW50c1tpbmRleDJdOwogICAgfQogIH0KICByZXR1cm4gam9pbmVkID09PSB2b2lkIDAgPyAiLiIgOiBub3JtYWxpemUyKGpvaW5lZCk7Cn0KX19uYW1lKGpvaW4sICJqb2luIik7CmZ1bmN0aW9uIG5vcm1hbGl6ZTIocGF0aDIpIHsKICBhc3NlcnRQYXRoKHBhdGgyKTsKICBjb25zdCBhYnNvbHV0ZSA9IHBhdGgyLmNvZGVQb2ludEF0KDApID09PSA0NzsKICBsZXQgdmFsdWUyID0gbm9ybWFsaXplU3RyaW5nKHBhdGgyLCAhYWJzb2x1dGUpOwogIGlmICh2YWx1ZTIubGVuZ3RoID09PSAwICYmICFhYnNvbHV0ZSkgewogICAgdmFsdWUyID0gIi4iOwogIH0KICBpZiAodmFsdWUyLmxlbmd0aCA+IDAgJiYgcGF0aDIuY29kZVBvaW50QXQocGF0aDIubGVuZ3RoIC0gMSkgPT09IDQ3KSB7CiAgICB2YWx1ZTIgKz0gIi8iOwogIH0KICByZXR1cm4gYWJzb2x1dGUgPyAiLyIgKyB2YWx1ZTIgOiB2YWx1ZTI7Cn0KX19uYW1lKG5vcm1hbGl6ZTIsICJub3JtYWxpemUiKTsKZnVuY3Rpb24gbm9ybWFsaXplU3RyaW5nKHBhdGgyLCBhbGxvd0Fib3ZlUm9vdCkgewogIGxldCByZXN1bHQgPSAiIjsKICBsZXQgbGFzdFNlZ21lbnRMZW5ndGggPSAwOwogIGxldCBsYXN0U2xhc2ggPSAtMTsKICBsZXQgZG90cyA9IDA7CiAgbGV0IGluZGV4MiA9IC0xOwogIGxldCBjb2RlNDsKICBsZXQgbGFzdFNsYXNoSW5kZXg7CiAgd2hpbGUgKCsraW5kZXgyIDw9IHBhdGgyLmxlbmd0aCkgewogICAgaWYgKGluZGV4MiA8IHBhdGgyLmxlbmd0aCkgewogICAgICBjb2RlNCA9IHBhdGgyLmNvZGVQb2ludEF0KGluZGV4Mik7CiAgICB9IGVsc2UgaWYgKGNvZGU0ID09PSA0NykgewogICAgICBicmVhazsKICAgIH0gZWxzZSB7CiAgICAgIGNvZGU0ID0gNDc7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDQ3KSB7CiAgICAgIGlmIChsYXN0U2xhc2ggPT09IGluZGV4MiAtIDEgfHwgZG90cyA9PT0gMSkgewogICAgICB9IGVsc2UgaWYgKGxhc3RTbGFzaCAhPT0gaW5kZXgyIC0gMSAmJiBkb3RzID09PSAyKSB7CiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPCAyIHx8IGxhc3RTZWdtZW50TGVuZ3RoICE9PSAyIHx8IHJlc3VsdC5jb2RlUG9pbnRBdChyZXN1bHQubGVuZ3RoIC0gMSkgIT09IDQ2IHx8IHJlc3VsdC5jb2RlUG9pbnRBdChyZXN1bHQubGVuZ3RoIC0gMikgIT09IDQ2KSB7CiAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IDIpIHsKICAgICAgICAgICAgbGFzdFNsYXNoSW5kZXggPSByZXN1bHQubGFzdEluZGV4T2YoIi8iKTsKICAgICAgICAgICAgaWYgKGxhc3RTbGFzaEluZGV4ICE9PSByZXN1bHQubGVuZ3RoIC0gMSkgewogICAgICAgICAgICAgIGlmIChsYXN0U2xhc2hJbmRleCA8IDApIHsKICAgICAgICAgICAgICAgIHJlc3VsdCA9ICIiOwogICAgICAgICAgICAgICAgbGFzdFNlZ21lbnRMZW5ndGggPSAwOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc2xpY2UoMCwgbGFzdFNsYXNoSW5kZXgpOwogICAgICAgICAgICAgICAgbGFzdFNlZ21lbnRMZW5ndGggPSByZXN1bHQubGVuZ3RoIC0gMSAtIHJlc3VsdC5sYXN0SW5kZXhPZigiLyIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBsYXN0U2xhc2ggPSBpbmRleDI7CiAgICAgICAgICAgICAgZG90cyA9IDA7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgcmVzdWx0ID0gIiI7CiAgICAgICAgICAgIGxhc3RTZWdtZW50TGVuZ3RoID0gMDsKICAgICAgICAgICAgbGFzdFNsYXNoID0gaW5kZXgyOwogICAgICAgICAgICBkb3RzID0gMDsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChhbGxvd0Fib3ZlUm9vdCkgewogICAgICAgICAgcmVzdWx0ID0gcmVzdWx0Lmxlbmd0aCA+IDAgPyByZXN1bHQgKyAiLy4uIiA6ICIuLiI7CiAgICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9IDI7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMCkgewogICAgICAgICAgcmVzdWx0ICs9ICIvIiArIHBhdGgyLnNsaWNlKGxhc3RTbGFzaCArIDEsIGluZGV4Mik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlc3VsdCA9IHBhdGgyLnNsaWNlKGxhc3RTbGFzaCArIDEsIGluZGV4Mik7CiAgICAgICAgfQogICAgICAgIGxhc3RTZWdtZW50TGVuZ3RoID0gaW5kZXgyIC0gbGFzdFNsYXNoIC0gMTsKICAgICAgfQogICAgICBsYXN0U2xhc2ggPSBpbmRleDI7CiAgICAgIGRvdHMgPSAwOwogICAgfSBlbHNlIGlmIChjb2RlNCA9PT0gNDYgJiYgZG90cyA+IC0xKSB7CiAgICAgIGRvdHMrKzsKICAgIH0gZWxzZSB7CiAgICAgIGRvdHMgPSAtMTsKICAgIH0KICB9CiAgcmV0dXJuIHJlc3VsdDsKfQpfX25hbWUobm9ybWFsaXplU3RyaW5nLCAibm9ybWFsaXplU3RyaW5nIik7CmZ1bmN0aW9uIGFzc2VydFBhdGgocGF0aDIpIHsKICBpZiAodHlwZW9mIHBhdGgyICE9PSAic3RyaW5nIikgewogICAgdGhyb3cgbmV3IFR5cGVFcnJvcigKICAgICAgIlBhdGggbXVzdCBiZSBhIHN0cmluZy4gUmVjZWl2ZWQgIiArIEpTT04uc3RyaW5naWZ5KHBhdGgyKQogICAgKTsKICB9Cn0KX19uYW1lKGFzc2VydFBhdGgsICJhc3NlcnRQYXRoIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vdmZpbGVANi4wLjMvbm9kZV9tb2R1bGVzL3ZmaWxlL2xpYi9taW5wcm9jLmJyb3dzZXIuanMKdmFyIG1pbnByb2MgPSB7IGN3ZCB9OwpmdW5jdGlvbiBjd2QoKSB7CiAgcmV0dXJuICIvIjsKfQpfX25hbWUoY3dkLCAiY3dkIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vdmZpbGVANi4wLjMvbm9kZV9tb2R1bGVzL3ZmaWxlL2xpYi9taW51cmwuc2hhcmVkLmpzCmZ1bmN0aW9uIGlzVXJsKGZpbGVVcmxPclBhdGgpIHsKICByZXR1cm4gQm9vbGVhbigKICAgIGZpbGVVcmxPclBhdGggIT09IG51bGwgJiYgdHlwZW9mIGZpbGVVcmxPclBhdGggPT09ICJvYmplY3QiICYmICJocmVmIiBpbiBmaWxlVXJsT3JQYXRoICYmIGZpbGVVcmxPclBhdGguaHJlZiAmJiAicHJvdG9jb2wiIGluIGZpbGVVcmxPclBhdGggJiYgZmlsZVVybE9yUGF0aC5wcm90b2NvbCAmJiAvLyBAdHMtZXhwZWN0LWVycm9yOiBpbmRleGluZyBpcyBmaW5lLgogICAgZmlsZVVybE9yUGF0aC5hdXRoID09PSB2b2lkIDAKICApOwp9Cl9fbmFtZShpc1VybCwgImlzVXJsIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vdmZpbGVANi4wLjMvbm9kZV9tb2R1bGVzL3ZmaWxlL2xpYi9taW51cmwuYnJvd3Nlci5qcwpmdW5jdGlvbiB1cmxUb1BhdGgocGF0aDIpIHsKICBpZiAodHlwZW9mIHBhdGgyID09PSAic3RyaW5nIikgewogICAgcGF0aDIgPSBuZXcgVVJMKHBhdGgyKTsKICB9IGVsc2UgaWYgKCFpc1VybChwYXRoMikpIHsKICAgIGNvbnN0IGVycm9yID0gbmV3IFR5cGVFcnJvcigKICAgICAgJ1RoZSAicGF0aCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIHN0cmluZyBvciBhbiBpbnN0YW5jZSBvZiBVUkwuIFJlY2VpdmVkIGAnICsgcGF0aDIgKyAiYCIKICAgICk7CiAgICBlcnJvci5jb2RlID0gIkVSUl9JTlZBTElEX0FSR19UWVBFIjsKICAgIHRocm93IGVycm9yOwogIH0KICBpZiAocGF0aDIucHJvdG9jb2wgIT09ICJmaWxlOiIpIHsKICAgIGNvbnN0IGVycm9yID0gbmV3IFR5cGVFcnJvcigiVGhlIFVSTCBtdXN0IGJlIG9mIHNjaGVtZSBmaWxlIik7CiAgICBlcnJvci5jb2RlID0gIkVSUl9JTlZBTElEX1VSTF9TQ0hFTUUiOwogICAgdGhyb3cgZXJyb3I7CiAgfQogIHJldHVybiBnZXRQYXRoRnJvbVVSTFBvc2l4KHBhdGgyKTsKfQpfX25hbWUodXJsVG9QYXRoLCAidXJsVG9QYXRoIik7CmZ1bmN0aW9uIGdldFBhdGhGcm9tVVJMUG9zaXgodXJsKSB7CiAgaWYgKHVybC5ob3N0bmFtZSAhPT0gIiIpIHsKICAgIGNvbnN0IGVycm9yID0gbmV3IFR5cGVFcnJvcigKICAgICAgJ0ZpbGUgVVJMIGhvc3QgbXVzdCBiZSAibG9jYWxob3N0IiBvciBlbXB0eSBvbiBkYXJ3aW4nCiAgICApOwogICAgZXJyb3IuY29kZSA9ICJFUlJfSU5WQUxJRF9GSUxFX1VSTF9IT1NUIjsKICAgIHRocm93IGVycm9yOwogIH0KICBjb25zdCBwYXRobmFtZSA9IHVybC5wYXRobmFtZTsKICBsZXQgaW5kZXgyID0gLTE7CiAgd2hpbGUgKCsraW5kZXgyIDwgcGF0aG5hbWUubGVuZ3RoKSB7CiAgICBpZiAocGF0aG5hbWUuY29kZVBvaW50QXQoaW5kZXgyKSA9PT0gMzcgJiYgcGF0aG5hbWUuY29kZVBvaW50QXQoaW5kZXgyICsgMSkgPT09IDUwKSB7CiAgICAgIGNvbnN0IHRoaXJkID0gcGF0aG5hbWUuY29kZVBvaW50QXQoaW5kZXgyICsgMik7CiAgICAgIGlmICh0aGlyZCA9PT0gNzAgfHwgdGhpcmQgPT09IDEwMikgewogICAgICAgIGNvbnN0IGVycm9yID0gbmV3IFR5cGVFcnJvcigKICAgICAgICAgICJGaWxlIFVSTCBwYXRoIG11c3Qgbm90IGluY2x1ZGUgZW5jb2RlZCAvIGNoYXJhY3RlcnMiCiAgICAgICAgKTsKICAgICAgICBlcnJvci5jb2RlID0gIkVSUl9JTlZBTElEX0ZJTEVfVVJMX1BBVEgiOwogICAgICAgIHRocm93IGVycm9yOwogICAgICB9CiAgICB9CiAgfQogIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQocGF0aG5hbWUpOwp9Cl9fbmFtZShnZXRQYXRoRnJvbVVSTFBvc2l4LCAiZ2V0UGF0aEZyb21VUkxQb3NpeCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3ZmaWxlQDYuMC4zL25vZGVfbW9kdWxlcy92ZmlsZS9saWIvaW5kZXguanMKdmFyIG9yZGVyID0gKAogIC8qKiBAdHlwZSB7Y29uc3R9ICovCiAgWwogICAgImhpc3RvcnkiLAogICAgInBhdGgiLAogICAgImJhc2VuYW1lIiwKICAgICJzdGVtIiwKICAgICJleHRuYW1lIiwKICAgICJkaXJuYW1lIgogIF0KKTsKdmFyIFZGaWxlID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlZGaWxlIik7CiAgfQogIC8qKgogICAqIENyZWF0ZSBhIG5ldyB2aXJ0dWFsIGZpbGUuCiAgICoKICAgKiBgb3B0aW9uc2AgaXMgdHJlYXRlZCBhczoKICAgKgogICAqICogICBgc3RyaW5nYCBvciBgVWludDhBcnJheWAg4oCUIGB7dmFsdWU6IG9wdGlvbnN9YAogICAqICogICBgVVJMYCDigJQgYHtwYXRoOiBvcHRpb25zfWAKICAgKiAqICAgYFZGaWxlYCDigJQgc2hhbGxvdyBjb3BpZXMgaXRzIGRhdGEgb3ZlciB0byB0aGUgbmV3IGZpbGUKICAgKiAqICAgYG9iamVjdGAg4oCUIGFsbCBmaWVsZHMgYXJlIHNoYWxsb3cgY29waWVkIG92ZXIgdG8gdGhlIG5ldyBmaWxlCiAgICoKICAgKiBQYXRoIHJlbGF0ZWQgZmllbGRzIGFyZSBzZXQgaW4gdGhlIGZvbGxvd2luZyBvcmRlciAobGVhc3Qgc3BlY2lmaWMgdG8KICAgKiBtb3N0IHNwZWNpZmljKTogYGhpc3RvcnlgLCBgcGF0aGAsIGBiYXNlbmFtZWAsIGBzdGVtYCwgYGV4dG5hbWVgLAogICAqIGBkaXJuYW1lYC4KICAgKgogICAqIFlvdSBjYW5ub3Qgc2V0IGBkaXJuYW1lYCBvciBgZXh0bmFtZWAgd2l0aG91dCBzZXR0aW5nIGVpdGhlciBgaGlzdG9yeWAsCiAgICogYHBhdGhgLCBgYmFzZW5hbWVgLCBvciBgc3RlbWAgdG9vLgogICAqCiAgICogQHBhcmFtIHtDb21wYXRpYmxlIHwgbnVsbCB8IHVuZGVmaW5lZH0gW3ZhbHVlXQogICAqICAgRmlsZSB2YWx1ZS4KICAgKiBAcmV0dXJucwogICAqICAgTmV3IGluc3RhbmNlLgogICAqLwogIGNvbnN0cnVjdG9yKHZhbHVlMikgewogICAgbGV0IG9wdGlvbnM7CiAgICBpZiAoIXZhbHVlMikgewogICAgICBvcHRpb25zID0ge307CiAgICB9IGVsc2UgaWYgKGlzVXJsKHZhbHVlMikpIHsKICAgICAgb3B0aW9ucyA9IHsgcGF0aDogdmFsdWUyIH07CiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZTIgPT09ICJzdHJpbmciIHx8IGlzVWludDhBcnJheTModmFsdWUyKSkgewogICAgICBvcHRpb25zID0geyB2YWx1ZTogdmFsdWUyIH07CiAgICB9IGVsc2UgewogICAgICBvcHRpb25zID0gdmFsdWUyOwogICAgfQogICAgdGhpcy5jd2QgPSAiY3dkIiBpbiBvcHRpb25zID8gIiIgOiBtaW5wcm9jLmN3ZCgpOwogICAgdGhpcy5kYXRhID0ge307CiAgICB0aGlzLmhpc3RvcnkgPSBbXTsKICAgIHRoaXMubWVzc2FnZXMgPSBbXTsKICAgIHRoaXMudmFsdWU7CiAgICB0aGlzLm1hcDsKICAgIHRoaXMucmVzdWx0OwogICAgdGhpcy5zdG9yZWQ7CiAgICBsZXQgaW5kZXgyID0gLTE7CiAgICB3aGlsZSAoKytpbmRleDIgPCBvcmRlci5sZW5ndGgpIHsKICAgICAgY29uc3QgZmllbGQyID0gb3JkZXJbaW5kZXgyXTsKICAgICAgaWYgKGZpZWxkMiBpbiBvcHRpb25zICYmIG9wdGlvbnNbZmllbGQyXSAhPT0gdm9pZCAwICYmIG9wdGlvbnNbZmllbGQyXSAhPT0gbnVsbCkgewogICAgICAgIHRoaXNbZmllbGQyXSA9IGZpZWxkMiA9PT0gImhpc3RvcnkiID8gWy4uLm9wdGlvbnNbZmllbGQyXV0gOiBvcHRpb25zW2ZpZWxkMl07CiAgICAgIH0KICAgIH0KICAgIGxldCBmaWVsZDsKICAgIGZvciAoZmllbGQgaW4gb3B0aW9ucykgewogICAgICBpZiAoIW9yZGVyLmluY2x1ZGVzKGZpZWxkKSkgewogICAgICAgIHRoaXNbZmllbGRdID0gb3B0aW9uc1tmaWVsZF07CiAgICAgIH0KICAgIH0KICB9CiAgLyoqCiAgICogR2V0IHRoZSBiYXNlbmFtZSAoaW5jbHVkaW5nIGV4dG5hbWUpIChleGFtcGxlOiBgJ2luZGV4Lm1pbi5qcydgKS4KICAgKgogICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9CiAgICogICBCYXNlbmFtZS4KICAgKi8KICBnZXQgYmFzZW5hbWUoKSB7CiAgICByZXR1cm4gdHlwZW9mIHRoaXMucGF0aCA9PT0gInN0cmluZyIgPyBtaW5wYXRoLmJhc2VuYW1lKHRoaXMucGF0aCkgOiB2b2lkIDA7CiAgfQogIC8qKgogICAqIFNldCBiYXNlbmFtZSAoaW5jbHVkaW5nIGV4dG5hbWUpIChgJ2luZGV4Lm1pbi5qcydgKS4KICAgKgogICAqIENhbm5vdCBjb250YWluIHBhdGggc2VwYXJhdG9ycyAoYCcvJ2Agb24gdW5peCwgbWFjT1MsIGFuZCBicm93c2VycywgYCdcJ2AKICAgKiBvbiB3aW5kb3dzKS4KICAgKiBDYW5ub3QgYmUgbnVsbGlmaWVkICh1c2UgYGZpbGUucGF0aCA9IGZpbGUuZGlybmFtZWAgaW5zdGVhZCkuCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZW5hbWUKICAgKiAgIEJhc2VuYW1lLgogICAqIEByZXR1cm5zIHt1bmRlZmluZWR9CiAgICogICBOb3RoaW5nLgogICAqLwogIHNldCBiYXNlbmFtZShiYXNlbmFtZTIpIHsKICAgIGFzc2VydE5vbkVtcHR5KGJhc2VuYW1lMiwgImJhc2VuYW1lIik7CiAgICBhc3NlcnRQYXJ0KGJhc2VuYW1lMiwgImJhc2VuYW1lIik7CiAgICB0aGlzLnBhdGggPSBtaW5wYXRoLmpvaW4odGhpcy5kaXJuYW1lIHx8ICIiLCBiYXNlbmFtZTIpOwogIH0KICAvKioKICAgKiBHZXQgdGhlIHBhcmVudCBwYXRoIChleGFtcGxlOiBgJ34nYCkuCiAgICoKICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfQogICAqICAgRGlybmFtZS4KICAgKi8KICBnZXQgZGlybmFtZSgpIHsKICAgIHJldHVybiB0eXBlb2YgdGhpcy5wYXRoID09PSAic3RyaW5nIiA/IG1pbnBhdGguZGlybmFtZSh0aGlzLnBhdGgpIDogdm9pZCAwOwogIH0KICAvKioKICAgKiBTZXQgdGhlIHBhcmVudCBwYXRoIChleGFtcGxlOiBgJ34nYCkuCiAgICoKICAgKiBDYW5ub3QgYmUgc2V0IGlmIHRoZXJl4oCZcyBubyBgcGF0aGAgeWV0LgogICAqCiAgICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IGRpcm5hbWUKICAgKiAgIERpcm5hbWUuCiAgICogQHJldHVybnMge3VuZGVmaW5lZH0KICAgKiAgIE5vdGhpbmcuCiAgICovCiAgc2V0IGRpcm5hbWUoZGlybmFtZTIpIHsKICAgIGFzc2VydFBhdGgyKHRoaXMuYmFzZW5hbWUsICJkaXJuYW1lIik7CiAgICB0aGlzLnBhdGggPSBtaW5wYXRoLmpvaW4oZGlybmFtZTIgfHwgIiIsIHRoaXMuYmFzZW5hbWUpOwogIH0KICAvKioKICAgKiBHZXQgdGhlIGV4dG5hbWUgKGluY2x1ZGluZyBkb3QpIChleGFtcGxlOiBgJy5qcydgKS4KICAgKgogICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9CiAgICogICBFeHRuYW1lLgogICAqLwogIGdldCBleHRuYW1lKCkgewogICAgcmV0dXJuIHR5cGVvZiB0aGlzLnBhdGggPT09ICJzdHJpbmciID8gbWlucGF0aC5leHRuYW1lKHRoaXMucGF0aCkgOiB2b2lkIDA7CiAgfQogIC8qKgogICAqIFNldCB0aGUgZXh0bmFtZSAoaW5jbHVkaW5nIGRvdCkgKGV4YW1wbGU6IGAnLmpzJ2ApLgogICAqCiAgICogQ2Fubm90IGNvbnRhaW4gcGF0aCBzZXBhcmF0b3JzIChgJy8nYCBvbiB1bml4LCBtYWNPUywgYW5kIGJyb3dzZXJzLCBgJ1wnYAogICAqIG9uIHdpbmRvd3MpLgogICAqIENhbm5vdCBiZSBzZXQgaWYgdGhlcmXigJlzIG5vIGBwYXRoYCB5ZXQuCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gZXh0bmFtZQogICAqICAgRXh0bmFtZS4KICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfQogICAqICAgTm90aGluZy4KICAgKi8KICBzZXQgZXh0bmFtZShleHRuYW1lMikgewogICAgYXNzZXJ0UGFydChleHRuYW1lMiwgImV4dG5hbWUiKTsKICAgIGFzc2VydFBhdGgyKHRoaXMuZGlybmFtZSwgImV4dG5hbWUiKTsKICAgIGlmIChleHRuYW1lMikgewogICAgICBpZiAoZXh0bmFtZTIuY29kZVBvaW50QXQoMCkgIT09IDQ2KSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJgZXh0bmFtZWAgbXVzdCBzdGFydCB3aXRoIGAuYCIpOwogICAgICB9CiAgICAgIGlmIChleHRuYW1lMi5pbmNsdWRlcygiLiIsIDEpKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJgZXh0bmFtZWAgY2Fubm90IGNvbnRhaW4gbXVsdGlwbGUgZG90cyIpOwogICAgICB9CiAgICB9CiAgICB0aGlzLnBhdGggPSBtaW5wYXRoLmpvaW4odGhpcy5kaXJuYW1lLCB0aGlzLnN0ZW0gKyAoZXh0bmFtZTIgfHwgIiIpKTsKICB9CiAgLyoqCiAgICogR2V0IHRoZSBmdWxsIHBhdGggKGV4YW1wbGU6IGAnfi9pbmRleC5taW4uanMnYCkuCiAgICoKICAgKiBAcmV0dXJucyB7c3RyaW5nfQogICAqICAgUGF0aC4KICAgKi8KICBnZXQgcGF0aCgpIHsKICAgIHJldHVybiB0aGlzLmhpc3RvcnlbdGhpcy5oaXN0b3J5Lmxlbmd0aCAtIDFdOwogIH0KICAvKioKICAgKiBTZXQgdGhlIGZ1bGwgcGF0aCAoZXhhbXBsZTogYCd+L2luZGV4Lm1pbi5qcydgKS4KICAgKgogICAqIENhbm5vdCBiZSBudWxsaWZpZWQuCiAgICogWW91IGNhbiBzZXQgYSBmaWxlIFVSTCAoYSBgVVJMYCBvYmplY3Qgd2l0aCBhIGBmaWxlOmAgcHJvdG9jb2wpIHdoaWNoIHdpbGwKICAgKiBiZSB0dXJuZWQgaW50byBhIHBhdGggd2l0aCBgdXJsLmZpbGVVUkxUb1BhdGhgLgogICAqCiAgICogQHBhcmFtIHtVUkwgfCBzdHJpbmd9IHBhdGgKICAgKiAgIFBhdGguCiAgICogQHJldHVybnMge3VuZGVmaW5lZH0KICAgKiAgIE5vdGhpbmcuCiAgICovCiAgc2V0IHBhdGgocGF0aDIpIHsKICAgIGlmIChpc1VybChwYXRoMikpIHsKICAgICAgcGF0aDIgPSB1cmxUb1BhdGgocGF0aDIpOwogICAgfQogICAgYXNzZXJ0Tm9uRW1wdHkocGF0aDIsICJwYXRoIik7CiAgICBpZiAodGhpcy5wYXRoICE9PSBwYXRoMikgewogICAgICB0aGlzLmhpc3RvcnkucHVzaChwYXRoMik7CiAgICB9CiAgfQogIC8qKgogICAqIEdldCB0aGUgc3RlbSAoYmFzZW5hbWUgdy9vIGV4dG5hbWUpIChleGFtcGxlOiBgJ2luZGV4Lm1pbidgKS4KICAgKgogICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9CiAgICogICBTdGVtLgogICAqLwogIGdldCBzdGVtKCkgewogICAgcmV0dXJuIHR5cGVvZiB0aGlzLnBhdGggPT09ICJzdHJpbmciID8gbWlucGF0aC5iYXNlbmFtZSh0aGlzLnBhdGgsIHRoaXMuZXh0bmFtZSkgOiB2b2lkIDA7CiAgfQogIC8qKgogICAqIFNldCB0aGUgc3RlbSAoYmFzZW5hbWUgdy9vIGV4dG5hbWUpIChleGFtcGxlOiBgJ2luZGV4Lm1pbidgKS4KICAgKgogICAqIENhbm5vdCBjb250YWluIHBhdGggc2VwYXJhdG9ycyAoYCcvJ2Agb24gdW5peCwgbWFjT1MsIGFuZCBicm93c2VycywgYCdcJ2AKICAgKiBvbiB3aW5kb3dzKS4KICAgKiBDYW5ub3QgYmUgbnVsbGlmaWVkICh1c2UgYGZpbGUucGF0aCA9IGZpbGUuZGlybmFtZWAgaW5zdGVhZCkuCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gc3RlbQogICAqICAgU3RlbS4KICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfQogICAqICAgTm90aGluZy4KICAgKi8KICBzZXQgc3RlbShzdGVtKSB7CiAgICBhc3NlcnROb25FbXB0eShzdGVtLCAic3RlbSIpOwogICAgYXNzZXJ0UGFydChzdGVtLCAic3RlbSIpOwogICAgdGhpcy5wYXRoID0gbWlucGF0aC5qb2luKHRoaXMuZGlybmFtZSB8fCAiIiwgc3RlbSArICh0aGlzLmV4dG5hbWUgfHwgIiIpKTsKICB9CiAgLy8gTm9ybWFsIHByb3RvdHlwYWwgbWV0aG9kcy4KICAvKioKICAgKiBDcmVhdGUgYSBmYXRhbCBtZXNzYWdlIGZvciBgcmVhc29uYCBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbGUuCiAgICoKICAgKiBUaGUgYGZhdGFsYCBmaWVsZCBvZiB0aGUgbWVzc2FnZSBpcyBzZXQgdG8gYHRydWVgIChlcnJvcjsgZmlsZSBub3QgdXNhYmxlKQogICAqIGFuZCB0aGUgYGZpbGVgIGZpZWxkIGlzIHNldCB0byB0aGUgY3VycmVudCBmaWxlIHBhdGguCiAgICogVGhlIG1lc3NhZ2UgaXMgYWRkZWQgdG8gdGhlIGBtZXNzYWdlc2AgZmllbGQgb24gYGZpbGVgLgogICAqCiAgICogPiDwn6qmICoqTm90ZSoqOiBhbHNvIGhhcyBvYnNvbGV0ZSBzaWduYXR1cmVzLgogICAqCiAgICogQG92ZXJsb2FkCiAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbgogICAqIEBwYXJhbSB7TWVzc2FnZU9wdGlvbnMgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3B0aW9uc10KICAgKiBAcmV0dXJucyB7bmV2ZXJ9CiAgICoKICAgKiBAb3ZlcmxvYWQKICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uCiAgICogQHBhcmFtIHtOb2RlIHwgTm9kZUxpa2UgfCBudWxsIHwgdW5kZWZpbmVkfSBwYXJlbnQKICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcmlnaW5dCiAgICogQHJldHVybnMge25ldmVyfQogICAqCiAgICogQG92ZXJsb2FkCiAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbgogICAqIEBwYXJhbSB7UG9pbnQgfCBQb3NpdGlvbiB8IG51bGwgfCB1bmRlZmluZWR9IHBsYWNlCiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3JpZ2luXQogICAqIEByZXR1cm5zIHtuZXZlcn0KICAgKgogICAqIEBvdmVybG9hZAogICAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24KICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcmlnaW5dCiAgICogQHJldHVybnMge25ldmVyfQogICAqCiAgICogQG92ZXJsb2FkCiAgICogQHBhcmFtIHtFcnJvciB8IFZGaWxlTWVzc2FnZX0gY2F1c2UKICAgKiBAcGFyYW0ge05vZGUgfCBOb2RlTGlrZSB8IG51bGwgfCB1bmRlZmluZWR9IHBhcmVudAogICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgKiBAcmV0dXJucyB7bmV2ZXJ9CiAgICoKICAgKiBAb3ZlcmxvYWQKICAgKiBAcGFyYW0ge0Vycm9yIHwgVkZpbGVNZXNzYWdlfSBjYXVzZQogICAqIEBwYXJhbSB7UG9pbnQgfCBQb3NpdGlvbiB8IG51bGwgfCB1bmRlZmluZWR9IHBsYWNlCiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3JpZ2luXQogICAqIEByZXR1cm5zIHtuZXZlcn0KICAgKgogICAqIEBvdmVybG9hZAogICAqIEBwYXJhbSB7RXJyb3IgfCBWRmlsZU1lc3NhZ2V9IGNhdXNlCiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3JpZ2luXQogICAqIEByZXR1cm5zIHtuZXZlcn0KICAgKgogICAqIEBwYXJhbSB7RXJyb3IgfCBWRmlsZU1lc3NhZ2UgfCBzdHJpbmd9IGNhdXNlT3JSZWFzb24KICAgKiAgIFJlYXNvbiBmb3IgbWVzc2FnZSwgc2hvdWxkIHVzZSBtYXJrZG93bi4KICAgKiBAcGFyYW0ge05vZGUgfCBOb2RlTGlrZSB8IE1lc3NhZ2VPcHRpb25zIHwgUG9pbnQgfCBQb3NpdGlvbiB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcHRpb25zT3JQYXJlbnRPclBsYWNlXQogICAqICAgQ29uZmlndXJhdGlvbiAob3B0aW9uYWwpLgogICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgKiAgIFBsYWNlIGluIGNvZGUgd2hlcmUgdGhlIG1lc3NhZ2Ugb3JpZ2luYXRlcyAoZXhhbXBsZToKICAgKiAgIGAnbXktcGFja2FnZTpteS1ydWxlJ2Agb3IgYCdteS1ydWxlJ2ApLgogICAqIEByZXR1cm5zIHtuZXZlcn0KICAgKiAgIE5ldmVyLgogICAqIEB0aHJvd3Mge1ZGaWxlTWVzc2FnZX0KICAgKiAgIE1lc3NhZ2UuCiAgICovCiAgZmFpbChjYXVzZU9yUmVhc29uLCBvcHRpb25zT3JQYXJlbnRPclBsYWNlLCBvcmlnaW4pIHsKICAgIGNvbnN0IG1lc3NhZ2UyID0gdGhpcy5tZXNzYWdlKGNhdXNlT3JSZWFzb24sIG9wdGlvbnNPclBhcmVudE9yUGxhY2UsIG9yaWdpbik7CiAgICBtZXNzYWdlMi5mYXRhbCA9IHRydWU7CiAgICB0aHJvdyBtZXNzYWdlMjsKICB9CiAgLyoqCiAgICogQ3JlYXRlIGFuIGluZm8gbWVzc2FnZSBmb3IgYHJlYXNvbmAgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaWxlLgogICAqCiAgICogVGhlIGBmYXRhbGAgZmllbGQgb2YgdGhlIG1lc3NhZ2UgaXMgc2V0IHRvIGB1bmRlZmluZWRgIChpbmZvOyBjaGFuZ2UKICAgKiBsaWtlbHkgbm90IG5lZWRlZCkgYW5kIHRoZSBgZmlsZWAgZmllbGQgaXMgc2V0IHRvIHRoZSBjdXJyZW50IGZpbGUgcGF0aC4KICAgKiBUaGUgbWVzc2FnZSBpcyBhZGRlZCB0byB0aGUgYG1lc3NhZ2VzYCBmaWVsZCBvbiBgZmlsZWAuCiAgICoKICAgKiA+IPCfqqYgKipOb3RlKio6IGFsc28gaGFzIG9ic29sZXRlIHNpZ25hdHVyZXMuCiAgICoKICAgKiBAb3ZlcmxvYWQKICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uCiAgICogQHBhcmFtIHtNZXNzYWdlT3B0aW9ucyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcHRpb25zXQogICAqIEByZXR1cm5zIHtWRmlsZU1lc3NhZ2V9CiAgICoKICAgKiBAb3ZlcmxvYWQKICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uCiAgICogQHBhcmFtIHtOb2RlIHwgTm9kZUxpa2UgfCBudWxsIHwgdW5kZWZpbmVkfSBwYXJlbnQKICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcmlnaW5dCiAgICogQHJldHVybnMge1ZGaWxlTWVzc2FnZX0KICAgKgogICAqIEBvdmVybG9hZAogICAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24KICAgKiBAcGFyYW0ge1BvaW50IHwgUG9zaXRpb24gfCBudWxsIHwgdW5kZWZpbmVkfSBwbGFjZQogICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgKiBAcmV0dXJucyB7VkZpbGVNZXNzYWdlfQogICAqCiAgICogQG92ZXJsb2FkCiAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbgogICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgKiBAcmV0dXJucyB7VkZpbGVNZXNzYWdlfQogICAqCiAgICogQG92ZXJsb2FkCiAgICogQHBhcmFtIHtFcnJvciB8IFZGaWxlTWVzc2FnZX0gY2F1c2UKICAgKiBAcGFyYW0ge05vZGUgfCBOb2RlTGlrZSB8IG51bGwgfCB1bmRlZmluZWR9IHBhcmVudAogICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgKiBAcmV0dXJucyB7VkZpbGVNZXNzYWdlfQogICAqCiAgICogQG92ZXJsb2FkCiAgICogQHBhcmFtIHtFcnJvciB8IFZGaWxlTWVzc2FnZX0gY2F1c2UKICAgKiBAcGFyYW0ge1BvaW50IHwgUG9zaXRpb24gfCBudWxsIHwgdW5kZWZpbmVkfSBwbGFjZQogICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgKiBAcmV0dXJucyB7VkZpbGVNZXNzYWdlfQogICAqCiAgICogQG92ZXJsb2FkCiAgICogQHBhcmFtIHtFcnJvciB8IFZGaWxlTWVzc2FnZX0gY2F1c2UKICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcmlnaW5dCiAgICogQHJldHVybnMge1ZGaWxlTWVzc2FnZX0KICAgKgogICAqIEBwYXJhbSB7RXJyb3IgfCBWRmlsZU1lc3NhZ2UgfCBzdHJpbmd9IGNhdXNlT3JSZWFzb24KICAgKiAgIFJlYXNvbiBmb3IgbWVzc2FnZSwgc2hvdWxkIHVzZSBtYXJrZG93bi4KICAgKiBAcGFyYW0ge05vZGUgfCBOb2RlTGlrZSB8IE1lc3NhZ2VPcHRpb25zIHwgUG9pbnQgfCBQb3NpdGlvbiB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcHRpb25zT3JQYXJlbnRPclBsYWNlXQogICAqICAgQ29uZmlndXJhdGlvbiAob3B0aW9uYWwpLgogICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgKiAgIFBsYWNlIGluIGNvZGUgd2hlcmUgdGhlIG1lc3NhZ2Ugb3JpZ2luYXRlcyAoZXhhbXBsZToKICAgKiAgIGAnbXktcGFja2FnZTpteS1ydWxlJ2Agb3IgYCdteS1ydWxlJ2ApLgogICAqIEByZXR1cm5zIHtWRmlsZU1lc3NhZ2V9CiAgICogICBNZXNzYWdlLgogICAqLwogIGluZm8oY2F1c2VPclJlYXNvbiwgb3B0aW9uc09yUGFyZW50T3JQbGFjZSwgb3JpZ2luKSB7CiAgICBjb25zdCBtZXNzYWdlMiA9IHRoaXMubWVzc2FnZShjYXVzZU9yUmVhc29uLCBvcHRpb25zT3JQYXJlbnRPclBsYWNlLCBvcmlnaW4pOwogICAgbWVzc2FnZTIuZmF0YWwgPSB2b2lkIDA7CiAgICByZXR1cm4gbWVzc2FnZTI7CiAgfQogIC8qKgogICAqIENyZWF0ZSBhIG1lc3NhZ2UgZm9yIGByZWFzb25gIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZS4KICAgKgogICAqIFRoZSBgZmF0YWxgIGZpZWxkIG9mIHRoZSBtZXNzYWdlIGlzIHNldCB0byBgZmFsc2VgICh3YXJuaW5nOyBjaGFuZ2UgbWF5IGJlCiAgICogbmVlZGVkKSBhbmQgdGhlIGBmaWxlYCBmaWVsZCBpcyBzZXQgdG8gdGhlIGN1cnJlbnQgZmlsZSBwYXRoLgogICAqIFRoZSBtZXNzYWdlIGlzIGFkZGVkIHRvIHRoZSBgbWVzc2FnZXNgIGZpZWxkIG9uIGBmaWxlYC4KICAgKgogICAqID4g8J+qpiAqKk5vdGUqKjogYWxzbyBoYXMgb2Jzb2xldGUgc2lnbmF0dXJlcy4KICAgKgogICAqIEBvdmVybG9hZAogICAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24KICAgKiBAcGFyYW0ge01lc3NhZ2VPcHRpb25zIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29wdGlvbnNdCiAgICogQHJldHVybnMge1ZGaWxlTWVzc2FnZX0KICAgKgogICAqIEBvdmVybG9hZAogICAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24KICAgKiBAcGFyYW0ge05vZGUgfCBOb2RlTGlrZSB8IG51bGwgfCB1bmRlZmluZWR9IHBhcmVudAogICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgKiBAcmV0dXJucyB7VkZpbGVNZXNzYWdlfQogICAqCiAgICogQG92ZXJsb2FkCiAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbgogICAqIEBwYXJhbSB7UG9pbnQgfCBQb3NpdGlvbiB8IG51bGwgfCB1bmRlZmluZWR9IHBsYWNlCiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3JpZ2luXQogICAqIEByZXR1cm5zIHtWRmlsZU1lc3NhZ2V9CiAgICoKICAgKiBAb3ZlcmxvYWQKICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uCiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3JpZ2luXQogICAqIEByZXR1cm5zIHtWRmlsZU1lc3NhZ2V9CiAgICoKICAgKiBAb3ZlcmxvYWQKICAgKiBAcGFyYW0ge0Vycm9yIHwgVkZpbGVNZXNzYWdlfSBjYXVzZQogICAqIEBwYXJhbSB7Tm9kZSB8IE5vZGVMaWtlIHwgbnVsbCB8IHVuZGVmaW5lZH0gcGFyZW50CiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3JpZ2luXQogICAqIEByZXR1cm5zIHtWRmlsZU1lc3NhZ2V9CiAgICoKICAgKiBAb3ZlcmxvYWQKICAgKiBAcGFyYW0ge0Vycm9yIHwgVkZpbGVNZXNzYWdlfSBjYXVzZQogICAqIEBwYXJhbSB7UG9pbnQgfCBQb3NpdGlvbiB8IG51bGwgfCB1bmRlZmluZWR9IHBsYWNlCiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3JpZ2luXQogICAqIEByZXR1cm5zIHtWRmlsZU1lc3NhZ2V9CiAgICoKICAgKiBAb3ZlcmxvYWQKICAgKiBAcGFyYW0ge0Vycm9yIHwgVkZpbGVNZXNzYWdlfSBjYXVzZQogICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgKiBAcmV0dXJucyB7VkZpbGVNZXNzYWdlfQogICAqCiAgICogQHBhcmFtIHtFcnJvciB8IFZGaWxlTWVzc2FnZSB8IHN0cmluZ30gY2F1c2VPclJlYXNvbgogICAqICAgUmVhc29uIGZvciBtZXNzYWdlLCBzaG91bGQgdXNlIG1hcmtkb3duLgogICAqIEBwYXJhbSB7Tm9kZSB8IE5vZGVMaWtlIHwgTWVzc2FnZU9wdGlvbnMgfCBQb2ludCB8IFBvc2l0aW9uIHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29wdGlvbnNPclBhcmVudE9yUGxhY2VdCiAgICogICBDb25maWd1cmF0aW9uIChvcHRpb25hbCkuCiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3JpZ2luXQogICAqICAgUGxhY2UgaW4gY29kZSB3aGVyZSB0aGUgbWVzc2FnZSBvcmlnaW5hdGVzIChleGFtcGxlOgogICAqICAgYCdteS1wYWNrYWdlOm15LXJ1bGUnYCBvciBgJ215LXJ1bGUnYCkuCiAgICogQHJldHVybnMge1ZGaWxlTWVzc2FnZX0KICAgKiAgIE1lc3NhZ2UuCiAgICovCiAgbWVzc2FnZShjYXVzZU9yUmVhc29uLCBvcHRpb25zT3JQYXJlbnRPclBsYWNlLCBvcmlnaW4pIHsKICAgIGNvbnN0IG1lc3NhZ2UyID0gbmV3IFZGaWxlTWVzc2FnZSgKICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogdGhlIG92ZXJsb2FkcyBhcmUgZmluZS4KICAgICAgY2F1c2VPclJlYXNvbiwKICAgICAgb3B0aW9uc09yUGFyZW50T3JQbGFjZSwKICAgICAgb3JpZ2luCiAgICApOwogICAgaWYgKHRoaXMucGF0aCkgewogICAgICBtZXNzYWdlMi5uYW1lID0gdGhpcy5wYXRoICsgIjoiICsgbWVzc2FnZTIubmFtZTsKICAgICAgbWVzc2FnZTIuZmlsZSA9IHRoaXMucGF0aDsKICAgIH0KICAgIG1lc3NhZ2UyLmZhdGFsID0gZmFsc2U7CiAgICB0aGlzLm1lc3NhZ2VzLnB1c2gobWVzc2FnZTIpOwogICAgcmV0dXJuIG1lc3NhZ2UyOwogIH0KICAvKioKICAgKiBTZXJpYWxpemUgdGhlIGZpbGUuCiAgICoKICAgKiA+ICoqTm90ZSoqOiB3aGljaCBlbmNvZGluZ3MgYXJlIHN1cHBvcnRlZCBkZXBlbmRzIG9uIHRoZSBlbmdpbmUuCiAgICogPiBGb3IgaW5mbyBvbiBOb2RlLmpzLCBzZWU6CiAgICogPiA8aHR0cHM6Ly9ub2RlanMub3JnL2FwaS91dGlsLmh0bWwjd2hhdHdnLXN1cHBvcnRlZC1lbmNvZGluZ3M+LgogICAqCiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbZW5jb2Rpbmc9J3V0ZjgnXQogICAqICAgQ2hhcmFjdGVyIGVuY29kaW5nIHRvIHVuZGVyc3RhbmQgYHZhbHVlYCBhcyB3aGVuIGl04oCZcyBhIGBVaW50OEFycmF5YAogICAqICAgKGRlZmF1bHQ6IGAndXRmLTgnYCkuCiAgICogQHJldHVybnMge3N0cmluZ30KICAgKiAgIFNlcmlhbGl6ZWQgZmlsZS4KICAgKi8KICB0b1N0cmluZyhlbmNvZGluZykgewogICAgaWYgKHRoaXMudmFsdWUgPT09IHZvaWQgMCkgewogICAgICByZXR1cm4gIiI7CiAgICB9CiAgICBpZiAodHlwZW9mIHRoaXMudmFsdWUgPT09ICJzdHJpbmciKSB7CiAgICAgIHJldHVybiB0aGlzLnZhbHVlOwogICAgfQogICAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcihlbmNvZGluZyB8fCB2b2lkIDApOwogICAgcmV0dXJuIGRlY29kZXIuZGVjb2RlKHRoaXMudmFsdWUpOwogIH0KfTsKZnVuY3Rpb24gYXNzZXJ0UGFydChwYXJ0LCBuYW1lKSB7CiAgaWYgKHBhcnQgJiYgcGFydC5pbmNsdWRlcyhtaW5wYXRoLnNlcCkpIHsKICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgImAiICsgbmFtZSArICJgIGNhbm5vdCBiZSBhIHBhdGg6IGRpZCBub3QgZXhwZWN0IGAiICsgbWlucGF0aC5zZXAgKyAiYCIKICAgICk7CiAgfQp9Cl9fbmFtZShhc3NlcnRQYXJ0LCAiYXNzZXJ0UGFydCIpOwpmdW5jdGlvbiBhc3NlcnROb25FbXB0eShwYXJ0LCBuYW1lKSB7CiAgaWYgKCFwYXJ0KSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoImAiICsgbmFtZSArICJgIGNhbm5vdCBiZSBlbXB0eSIpOwogIH0KfQpfX25hbWUoYXNzZXJ0Tm9uRW1wdHksICJhc3NlcnROb25FbXB0eSIpOwpmdW5jdGlvbiBhc3NlcnRQYXRoMihwYXRoMiwgbmFtZSkgewogIGlmICghcGF0aDIpIHsKICAgIHRocm93IG5ldyBFcnJvcigiU2V0dGluZyBgIiArIG5hbWUgKyAiYCByZXF1aXJlcyBgcGF0aGAgdG8gYmUgc2V0IHRvbyIpOwogIH0KfQpfX25hbWUoYXNzZXJ0UGF0aDIsICJhc3NlcnRQYXRoIik7CmZ1bmN0aW9uIGlzVWludDhBcnJheTModmFsdWUyKSB7CiAgcmV0dXJuIEJvb2xlYW4oCiAgICB2YWx1ZTIgJiYgdHlwZW9mIHZhbHVlMiA9PT0gIm9iamVjdCIgJiYgImJ5dGVMZW5ndGgiIGluIHZhbHVlMiAmJiAiYnl0ZU9mZnNldCIgaW4gdmFsdWUyCiAgKTsKfQpfX25hbWUoaXNVaW50OEFycmF5MywgImlzVWludDhBcnJheSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3VuaWZpZWRAMTEuMC41L25vZGVfbW9kdWxlcy91bmlmaWVkL2xpYi9jYWxsYWJsZS1pbnN0YW5jZS5qcwp2YXIgQ2FsbGFibGVJbnN0YW5jZSA9ICgKICAvKioKICAgKiBAdHlwZSB7bmV3IDxQYXJhbWV0ZXJzIGV4dGVuZHMgQXJyYXk8dW5rbm93bj4sIFJlc3VsdD4ocHJvcGVydHk6IHN0cmluZyB8IHN5bWJvbCkgPT4gKC4uLnBhcmFtZXRlcnM6IFBhcmFtZXRlcnMpID0+IFJlc3VsdH0KICAgKi8KICAvKiogQHR5cGUge3Vua25vd259ICovCiAgLyoqCiAgICogQHRoaXMge0Z1bmN0aW9ufQogICAqIEBwYXJhbSB7c3RyaW5nIHwgc3ltYm9sfSBwcm9wZXJ0eQogICAqIEByZXR1cm5zIHsoLi4ucGFyYW1ldGVyczogQXJyYXk8dW5rbm93bj4pID0+IHVua25vd259CiAgICovCiAgLyogQF9fUFVSRV9fICovIF9fbmFtZSgoZnVuY3Rpb24ocHJvcGVydHkpIHsKICAgIGNvbnN0IHNlbGYyID0gdGhpczsKICAgIGNvbnN0IGNvbnN0ciA9IHNlbGYyLmNvbnN0cnVjdG9yOwogICAgY29uc3QgcHJvdG8gPSAoCiAgICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgRnVuY3Rpb24+fSAqLwogICAgICAvLyBQcm90b3R5cGVzIGRvIGV4aXN0LgogICAgICAvLyB0eXBlLWNvdmVyYWdlOmlnbm9yZS1uZXh0LWxpbmUKICAgICAgY29uc3RyLnByb3RvdHlwZQogICAgKTsKICAgIGNvbnN0IHZhbHVlMiA9IHByb3RvW3Byb3BlcnR5XTsKICAgIGNvbnN0IGFwcGx5ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHZhbHVlMi5hcHBseShhcHBseSwgYXJndW1lbnRzKTsKICAgIH0sICJhcHBseSIpOwogICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGFwcGx5LCBwcm90byk7CiAgICByZXR1cm4gYXBwbHk7CiAgfSksICJDYWxsYWJsZUluc3RhbmNlIikKKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS91bmlmaWVkQDExLjAuNS9ub2RlX21vZHVsZXMvdW5pZmllZC9saWIvaW5kZXguanMKdmFyIGltcG9ydF9leHRlbmQgPSBfX3RvRVNNKHJlcXVpcmVfZXh0ZW5kKCksIDEpOwp2YXIgb3duID0ge30uaGFzT3duUHJvcGVydHk7CnZhciBQcm9jZXNzb3IgPSBjbGFzcyBfUHJvY2Vzc29yIGV4dGVuZHMgQ2FsbGFibGVJbnN0YW5jZSB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiUHJvY2Vzc29yIik7CiAgfQogIC8qKgogICAqIENyZWF0ZSBhIHByb2Nlc3Nvci4KICAgKi8KICBjb25zdHJ1Y3RvcigpIHsKICAgIHN1cGVyKCJjb3B5Iik7CiAgICB0aGlzLkNvbXBpbGVyID0gdm9pZCAwOwogICAgdGhpcy5QYXJzZXIgPSB2b2lkIDA7CiAgICB0aGlzLmF0dGFjaGVycyA9IFtdOwogICAgdGhpcy5jb21waWxlciA9IHZvaWQgMDsKICAgIHRoaXMuZnJlZXplSW5kZXggPSAtMTsKICAgIHRoaXMuZnJvemVuID0gdm9pZCAwOwogICAgdGhpcy5uYW1lc3BhY2UgPSB7fTsKICAgIHRoaXMucGFyc2VyID0gdm9pZCAwOwogICAgdGhpcy50cmFuc2Zvcm1lcnMgPSB0cm91Z2goKTsKICB9CiAgLyoqCiAgICogQ29weSBhIHByb2Nlc3Nvci4KICAgKgogICAqIEBkZXByZWNhdGVkCiAgICogICBUaGlzIGlzIGEgcHJpdmF0ZSBpbnRlcm5hbCBtZXRob2QgYW5kIHNob3VsZCBub3QgYmUgdXNlZC4KICAgKiBAcmV0dXJucyB7UHJvY2Vzc29yPFBhcnNlVHJlZSwgSGVhZFRyZWUsIFRhaWxUcmVlLCBDb21waWxlVHJlZSwgQ29tcGlsZVJlc3VsdD59CiAgICogICBOZXcgKnVuZnJvemVuKiBwcm9jZXNzb3IgKHtAbGlua2NvZGUgUHJvY2Vzc29yfSkgdGhhdCBpcwogICAqICAgY29uZmlndXJlZCB0byB3b3JrIHRoZSBzYW1lIGFzIGl0cyBhbmNlc3Rvci4KICAgKiAgIFdoZW4gdGhlIGRlc2NlbmRhbnQgcHJvY2Vzc29yIGlzIGNvbmZpZ3VyZWQgaW4gdGhlIGZ1dHVyZSBpdCBkb2VzIG5vdAogICAqICAgYWZmZWN0IHRoZSBhbmNlc3RyYWwgcHJvY2Vzc29yLgogICAqLwogIGNvcHkoKSB7CiAgICBjb25zdCBkZXN0aW5hdGlvbiA9ICgKICAgICAgLyoqIEB0eXBlIHtQcm9jZXNzb3I8UGFyc2VUcmVlLCBIZWFkVHJlZSwgVGFpbFRyZWUsIENvbXBpbGVUcmVlLCBDb21waWxlUmVzdWx0Pn0gKi8KICAgICAgbmV3IF9Qcm9jZXNzb3IoKQogICAgKTsKICAgIGxldCBpbmRleDIgPSAtMTsKICAgIHdoaWxlICgrK2luZGV4MiA8IHRoaXMuYXR0YWNoZXJzLmxlbmd0aCkgewogICAgICBjb25zdCBhdHRhY2hlciA9IHRoaXMuYXR0YWNoZXJzW2luZGV4Ml07CiAgICAgIGRlc3RpbmF0aW9uLnVzZSguLi5hdHRhY2hlcik7CiAgICB9CiAgICBkZXN0aW5hdGlvbi5kYXRhKCgwLCBpbXBvcnRfZXh0ZW5kLmRlZmF1bHQpKHRydWUsIHt9LCB0aGlzLm5hbWVzcGFjZSkpOwogICAgcmV0dXJuIGRlc3RpbmF0aW9uOwogIH0KICAvKioKICAgKiBDb25maWd1cmUgdGhlIHByb2Nlc3NvciB3aXRoIGluZm8gYXZhaWxhYmxlIHRvIGFsbCBwbHVnaW5zLgogICAqIEluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbiBhbiBvYmplY3QuCiAgICoKICAgKiBUeXBpY2FsbHksIG9wdGlvbnMgY2FuIGJlIGdpdmVuIHRvIGEgc3BlY2lmaWMgcGx1Z2luLCBidXQgc29tZXRpbWVzIGl0CiAgICogbWFrZXMgc2Vuc2UgdG8gaGF2ZSBpbmZvcm1hdGlvbiBzaGFyZWQgd2l0aCBzZXZlcmFsIHBsdWdpbnMuCiAgICogRm9yIGV4YW1wbGUsIGEgbGlzdCBvZiBIVE1MIGVsZW1lbnRzIHRoYXQgYXJlIHNlbGYtY2xvc2luZywgd2hpY2ggaXMKICAgKiBuZWVkZWQgZHVyaW5nIGFsbCBwaGFzZXMuCiAgICoKICAgKiA+ICoqTm90ZSoqOiBzZXR0aW5nIGluZm9ybWF0aW9uIGNhbm5vdCBvY2N1ciBvbiAqZnJvemVuKiBwcm9jZXNzb3JzLgogICAqID4gQ2FsbCB0aGUgcHJvY2Vzc29yIGZpcnN0IHRvIGNyZWF0ZSBhIG5ldyB1bmZyb3plbiBwcm9jZXNzb3IuCiAgICoKICAgKiA+ICoqTm90ZSoqOiB0byByZWdpc3RlciBjdXN0b20gZGF0YSBpbiBUeXBlU2NyaXB0LCBhdWdtZW50IHRoZQogICAqID4ge0BsaW5rY29kZSBEYXRhfSBpbnRlcmZhY2UuCiAgICoKICAgKiBAZXhhbXBsZQogICAqICAgVGhpcyBleGFtcGxlIHNob3cgaG93IHRvIGdldCBhbmQgc2V0IGluZm86CiAgICoKICAgKiAgIGBgYGpzCiAgICogICBpbXBvcnQge3VuaWZpZWR9IGZyb20gJ3VuaWZpZWQnCiAgICoKICAgKiAgIGNvbnN0IHByb2Nlc3NvciA9IHVuaWZpZWQoKS5kYXRhKCdhbHBoYScsICdicmF2bycpCiAgICoKICAgKiAgIHByb2Nlc3Nvci5kYXRhKCdhbHBoYScpIC8vID0+ICdicmF2bycKICAgKgogICAqICAgcHJvY2Vzc29yLmRhdGEoKSAvLyA9PiB7YWxwaGE6ICdicmF2byd9CiAgICoKICAgKiAgIHByb2Nlc3Nvci5kYXRhKHtjaGFybGllOiAnZGVsdGEnfSkKICAgKgogICAqICAgcHJvY2Vzc29yLmRhdGEoKSAvLyA9PiB7Y2hhcmxpZTogJ2RlbHRhJ30KICAgKiAgIGBgYAogICAqCiAgICogQHRlbXBsYXRlIHtrZXlvZiBEYXRhfSBLZXkKICAgKgogICAqIEBvdmVybG9hZAogICAqIEByZXR1cm5zIHtEYXRhfQogICAqCiAgICogQG92ZXJsb2FkCiAgICogQHBhcmFtIHtEYXRhfSBkYXRhc2V0CiAgICogQHJldHVybnMge1Byb2Nlc3NvcjxQYXJzZVRyZWUsIEhlYWRUcmVlLCBUYWlsVHJlZSwgQ29tcGlsZVRyZWUsIENvbXBpbGVSZXN1bHQ+fQogICAqCiAgICogQG92ZXJsb2FkCiAgICogQHBhcmFtIHtLZXl9IGtleQogICAqIEByZXR1cm5zIHtEYXRhW0tleV19CiAgICoKICAgKiBAb3ZlcmxvYWQKICAgKiBAcGFyYW0ge0tleX0ga2V5CiAgICogQHBhcmFtIHtEYXRhW0tleV19IHZhbHVlCiAgICogQHJldHVybnMge1Byb2Nlc3NvcjxQYXJzZVRyZWUsIEhlYWRUcmVlLCBUYWlsVHJlZSwgQ29tcGlsZVRyZWUsIENvbXBpbGVSZXN1bHQ+fQogICAqCiAgICogQHBhcmFtIHtEYXRhIHwgS2V5fSBba2V5XQogICAqICAgS2V5IHRvIGdldCBvciBzZXQsIG9yIGVudGlyZSBkYXRhc2V0IHRvIHNldCwgb3Igbm90aGluZyB0byBnZXQgdGhlCiAgICogICBlbnRpcmUgZGF0YXNldCAob3B0aW9uYWwpLgogICAqIEBwYXJhbSB7RGF0YVtLZXldfSBbdmFsdWVdCiAgICogICBWYWx1ZSB0byBzZXQgKG9wdGlvbmFsKS4KICAgKiBAcmV0dXJucyB7dW5rbm93bn0KICAgKiAgIFRoZSBjdXJyZW50IHByb2Nlc3NvciB3aGVuIHNldHRpbmcsIHRoZSB2YWx1ZSBhdCBga2V5YCB3aGVuIGdldHRpbmcsIG9yCiAgICogICB0aGUgZW50aXJlIGRhdGFzZXQgd2hlbiBnZXR0aW5nIHdpdGhvdXQga2V5LgogICAqLwogIGRhdGEoa2V5MiwgdmFsdWUyKSB7CiAgICBpZiAodHlwZW9mIGtleTIgPT09ICJzdHJpbmciKSB7CiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7CiAgICAgICAgYXNzZXJ0VW5mcm96ZW4oImRhdGEiLCB0aGlzLmZyb3plbik7CiAgICAgICAgdGhpcy5uYW1lc3BhY2Vba2V5Ml0gPSB2YWx1ZTI7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgICAgcmV0dXJuIG93bi5jYWxsKHRoaXMubmFtZXNwYWNlLCBrZXkyKSAmJiB0aGlzLm5hbWVzcGFjZVtrZXkyXSB8fCB2b2lkIDA7CiAgICB9CiAgICBpZiAoa2V5MikgewogICAgICBhc3NlcnRVbmZyb3plbigiZGF0YSIsIHRoaXMuZnJvemVuKTsKICAgICAgdGhpcy5uYW1lc3BhY2UgPSBrZXkyOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHJldHVybiB0aGlzLm5hbWVzcGFjZTsKICB9CiAgLyoqCiAgICogRnJlZXplIGEgcHJvY2Vzc29yLgogICAqCiAgICogRnJvemVuIHByb2Nlc3NvcnMgYXJlIG1lYW50IHRvIGJlIGV4dGVuZGVkIGFuZCBub3QgdG8gYmUgY29uZmlndXJlZAogICAqIGRpcmVjdGx5LgogICAqCiAgICogV2hlbiBhIHByb2Nlc3NvciBpcyBmcm96ZW4gaXQgY2Fubm90IGJlIHVuZnJvemVuLgogICAqIE5ldyBwcm9jZXNzb3JzIHdvcmtpbmcgdGhlIHNhbWUgd2F5IGNhbiBiZSBjcmVhdGVkIGJ5IGNhbGxpbmcgdGhlCiAgICogcHJvY2Vzc29yLgogICAqCiAgICogSXTigJlzIHBvc3NpYmxlIHRvIGZyZWV6ZSBwcm9jZXNzb3JzIGV4cGxpY2l0bHkgYnkgY2FsbGluZyBgLmZyZWV6ZSgpYC4KICAgKiBQcm9jZXNzb3JzIGZyZWV6ZSBhdXRvbWF0aWNhbGx5IHdoZW4gYC5wYXJzZSgpYCwgYC5ydW4oKWAsIGAucnVuU3luYygpYCwKICAgKiBgLnN0cmluZ2lmeSgpYCwgYC5wcm9jZXNzKClgLCBvciBgLnByb2Nlc3NTeW5jKClgIGFyZSBjYWxsZWQuCiAgICoKICAgKiBAcmV0dXJucyB7UHJvY2Vzc29yPFBhcnNlVHJlZSwgSGVhZFRyZWUsIFRhaWxUcmVlLCBDb21waWxlVHJlZSwgQ29tcGlsZVJlc3VsdD59CiAgICogICBUaGUgY3VycmVudCBwcm9jZXNzb3IuCiAgICovCiAgZnJlZXplKCkgewogICAgaWYgKHRoaXMuZnJvemVuKSB7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgY29uc3Qgc2VsZjIgPSAoCiAgICAgIC8qKiBAdHlwZSB7UHJvY2Vzc29yfSAqLwogICAgICAvKiogQHR5cGUge3Vua25vd259ICovCiAgICAgIHRoaXMKICAgICk7CiAgICB3aGlsZSAoKyt0aGlzLmZyZWV6ZUluZGV4IDwgdGhpcy5hdHRhY2hlcnMubGVuZ3RoKSB7CiAgICAgIGNvbnN0IFthdHRhY2hlciwgLi4ub3B0aW9uc10gPSB0aGlzLmF0dGFjaGVyc1t0aGlzLmZyZWV6ZUluZGV4XTsKICAgICAgaWYgKG9wdGlvbnNbMF0gPT09IGZhbHNlKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKG9wdGlvbnNbMF0gPT09IHRydWUpIHsKICAgICAgICBvcHRpb25zWzBdID0gdm9pZCAwOwogICAgICB9CiAgICAgIGNvbnN0IHRyYW5zZm9ybWVyID0gYXR0YWNoZXIuY2FsbChzZWxmMiwgLi4ub3B0aW9ucyk7CiAgICAgIGlmICh0eXBlb2YgdHJhbnNmb3JtZXIgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICB0aGlzLnRyYW5zZm9ybWVycy51c2UodHJhbnNmb3JtZXIpOwogICAgICB9CiAgICB9CiAgICB0aGlzLmZyb3plbiA9IHRydWU7CiAgICB0aGlzLmZyZWV6ZUluZGV4ID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIC8qKgogICAqIFBhcnNlIHRleHQgdG8gYSBzeW50YXggdHJlZS4KICAgKgogICAqID4gKipOb3RlKio6IGBwYXJzZWAgZnJlZXplcyB0aGUgcHJvY2Vzc29yIGlmIG5vdCBhbHJlYWR5ICpmcm96ZW4qLgogICAqCiAgICogPiAqKk5vdGUqKjogYHBhcnNlYCBwZXJmb3JtcyB0aGUgcGFyc2UgcGhhc2UsIG5vdCB0aGUgcnVuIHBoYXNlIG9yIG90aGVyCiAgICogPiBwaGFzZXMuCiAgICoKICAgKiBAcGFyYW0ge0NvbXBhdGlibGUgfCB1bmRlZmluZWR9IFtmaWxlXQogICAqICAgZmlsZSB0byBwYXJzZSAob3B0aW9uYWwpOyB0eXBpY2FsbHkgYHN0cmluZ2Agb3IgYFZGaWxlYDsgYW55IHZhbHVlCiAgICogICBhY2NlcHRlZCBhcyBgeGAgaW4gYG5ldyBWRmlsZSh4KWAuCiAgICogQHJldHVybnMge1BhcnNlVHJlZSBleHRlbmRzIHVuZGVmaW5lZCA/IE5vZGUgOiBQYXJzZVRyZWV9CiAgICogICBTeW50YXggdHJlZSByZXByZXNlbnRpbmcgYGZpbGVgLgogICAqLwogIHBhcnNlKGZpbGUpIHsKICAgIHRoaXMuZnJlZXplKCk7CiAgICBjb25zdCByZWFsRmlsZSA9IHZmaWxlKGZpbGUpOwogICAgY29uc3QgcGFyc2VyID0gdGhpcy5wYXJzZXIgfHwgdGhpcy5QYXJzZXI7CiAgICBhc3NlcnRQYXJzZXIoInBhcnNlIiwgcGFyc2VyKTsKICAgIHJldHVybiBwYXJzZXIoU3RyaW5nKHJlYWxGaWxlKSwgcmVhbEZpbGUpOwogIH0KICAvKioKICAgKiBQcm9jZXNzIHRoZSBnaXZlbiBmaWxlIGFzIGNvbmZpZ3VyZWQgb24gdGhlIHByb2Nlc3Nvci4KICAgKgogICAqID4gKipOb3RlKio6IGBwcm9jZXNzYCBmcmVlemVzIHRoZSBwcm9jZXNzb3IgaWYgbm90IGFscmVhZHkgKmZyb3plbiouCiAgICoKICAgKiA+ICoqTm90ZSoqOiBgcHJvY2Vzc2AgcGVyZm9ybXMgdGhlIHBhcnNlLCBydW4sIGFuZCBzdHJpbmdpZnkgcGhhc2VzLgogICAqCiAgICogQG92ZXJsb2FkCiAgICogQHBhcmFtIHtDb21wYXRpYmxlIHwgdW5kZWZpbmVkfSBmaWxlCiAgICogQHBhcmFtIHtQcm9jZXNzQ2FsbGJhY2s8VkZpbGVXaXRoT3V0cHV0PENvbXBpbGVSZXN1bHQ+Pn0gZG9uZQogICAqIEByZXR1cm5zIHt1bmRlZmluZWR9CiAgICoKICAgKiBAb3ZlcmxvYWQKICAgKiBAcGFyYW0ge0NvbXBhdGlibGUgfCB1bmRlZmluZWR9IFtmaWxlXQogICAqIEByZXR1cm5zIHtQcm9taXNlPFZGaWxlV2l0aE91dHB1dDxDb21waWxlUmVzdWx0Pj59CiAgICoKICAgKiBAcGFyYW0ge0NvbXBhdGlibGUgfCB1bmRlZmluZWR9IFtmaWxlXQogICAqICAgRmlsZSAob3B0aW9uYWwpOyB0eXBpY2FsbHkgYHN0cmluZ2Agb3IgYFZGaWxlYF07IGFueSB2YWx1ZSBhY2NlcHRlZCBhcwogICAqICAgYHhgIGluIGBuZXcgVkZpbGUoeClgLgogICAqIEBwYXJhbSB7UHJvY2Vzc0NhbGxiYWNrPFZGaWxlV2l0aE91dHB1dDxDb21waWxlUmVzdWx0Pj4gfCB1bmRlZmluZWR9IFtkb25lXQogICAqICAgQ2FsbGJhY2sgKG9wdGlvbmFsKS4KICAgKiBAcmV0dXJucyB7UHJvbWlzZTxWRmlsZT4gfCB1bmRlZmluZWR9CiAgICogICBOb3RoaW5nIGlmIGBkb25lYCBpcyBnaXZlbi4KICAgKiAgIE90aGVyd2lzZSBhIHByb21pc2UsIHJlamVjdGVkIHdpdGggYSBmYXRhbCBlcnJvciBvciByZXNvbHZlZCB3aXRoIHRoZQogICAqICAgcHJvY2Vzc2VkIGZpbGUuCiAgICoKICAgKiAgIFRoZSBwYXJzZWQsIHRyYW5zZm9ybWVkLCBhbmQgY29tcGlsZWQgdmFsdWUgaXMgYXZhaWxhYmxlIGF0CiAgICogICBgZmlsZS52YWx1ZWAgKHNlZSBub3RlKS4KICAgKgogICAqICAgPiAqKk5vdGUqKjogdW5pZmllZCB0eXBpY2FsbHkgY29tcGlsZXMgYnkgc2VyaWFsaXppbmc6IG1vc3QKICAgKiAgID4gY29tcGlsZXJzIHJldHVybiBgc3RyaW5nYCAob3IgYFVpbnQ4QXJyYXlgKS4KICAgKiAgID4gU29tZSBjb21waWxlcnMsIHN1Y2ggYXMgdGhlIG9uZSBjb25maWd1cmVkIHdpdGgKICAgKiAgID4gW2ByZWh5cGUtcmVhY3RgXVtyZWh5cGUtcmVhY3RdLCByZXR1cm4gb3RoZXIgdmFsdWVzIChpbiB0aGlzIGNhc2UsIGEKICAgKiAgID4gUmVhY3QgdHJlZSkuCiAgICogICA+IElmIHlvdeKAmXJlIHVzaW5nIGEgY29tcGlsZXIgdGhhdCBkb2VzbuKAmXQgc2VyaWFsaXplLCBleHBlY3QgZGlmZmVyZW50CiAgICogICA+IHJlc3VsdCB2YWx1ZXMuCiAgICogICA+CiAgICogICA+IFRvIHJlZ2lzdGVyIGN1c3RvbSByZXN1bHRzIGluIFR5cGVTY3JpcHQsIGFkZCB0aGVtIHRvCiAgICogICA+IHtAbGlua2NvZGUgQ29tcGlsZVJlc3VsdE1hcH0uCiAgICoKICAgKiAgIFtyZWh5cGUtcmVhY3RdOiBodHRwczovL2dpdGh1Yi5jb20vcmVoeXBlanMvcmVoeXBlLXJlYWN0CiAgICovCiAgcHJvY2VzcyhmaWxlLCBkb25lKSB7CiAgICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgICB0aGlzLmZyZWV6ZSgpOwogICAgYXNzZXJ0UGFyc2VyKCJwcm9jZXNzIiwgdGhpcy5wYXJzZXIgfHwgdGhpcy5QYXJzZXIpOwogICAgYXNzZXJ0Q29tcGlsZXIoInByb2Nlc3MiLCB0aGlzLmNvbXBpbGVyIHx8IHRoaXMuQ29tcGlsZXIpOwogICAgcmV0dXJuIGRvbmUgPyBleGVjdXRvcih2b2lkIDAsIGRvbmUpIDogbmV3IFByb21pc2UoZXhlY3V0b3IpOwogICAgZnVuY3Rpb24gZXhlY3V0b3IocmVzb2x2ZTIsIHJlamVjdCkgewogICAgICBjb25zdCByZWFsRmlsZSA9IHZmaWxlKGZpbGUpOwogICAgICBjb25zdCBwYXJzZVRyZWUgPSAoCiAgICAgICAgLyoqIEB0eXBlIHtIZWFkVHJlZSBleHRlbmRzIHVuZGVmaW5lZCA/IE5vZGUgOiBIZWFkVHJlZX0gKi8KICAgICAgICAvKiogQHR5cGUge3Vua25vd259ICovCiAgICAgICAgc2VsZjIucGFyc2UocmVhbEZpbGUpCiAgICAgICk7CiAgICAgIHNlbGYyLnJ1bihwYXJzZVRyZWUsIHJlYWxGaWxlLCBmdW5jdGlvbihlcnJvciwgdHJlZSwgZmlsZTIpIHsKICAgICAgICBpZiAoZXJyb3IgfHwgIXRyZWUgfHwgIWZpbGUyKSB7CiAgICAgICAgICByZXR1cm4gcmVhbERvbmUoZXJyb3IpOwogICAgICAgIH0KICAgICAgICBjb25zdCBjb21waWxlVHJlZSA9ICgKICAgICAgICAgIC8qKiBAdHlwZSB7Q29tcGlsZVRyZWUgZXh0ZW5kcyB1bmRlZmluZWQgPyBOb2RlIDogQ29tcGlsZVRyZWV9ICovCiAgICAgICAgICAvKiogQHR5cGUge3Vua25vd259ICovCiAgICAgICAgICB0cmVlCiAgICAgICAgKTsKICAgICAgICBjb25zdCBjb21waWxlUmVzdWx0ID0gc2VsZjIuc3RyaW5naWZ5KGNvbXBpbGVUcmVlLCBmaWxlMik7CiAgICAgICAgaWYgKGxvb2tzTGlrZUFWYWx1ZShjb21waWxlUmVzdWx0KSkgewogICAgICAgICAgZmlsZTIudmFsdWUgPSBjb21waWxlUmVzdWx0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBmaWxlMi5yZXN1bHQgPSBjb21waWxlUmVzdWx0OwogICAgICAgIH0KICAgICAgICByZWFsRG9uZSgKICAgICAgICAgIGVycm9yLAogICAgICAgICAgLyoqIEB0eXBlIHtWRmlsZVdpdGhPdXRwdXQ8Q29tcGlsZVJlc3VsdD59ICovCiAgICAgICAgICBmaWxlMgogICAgICAgICk7CiAgICAgIH0pOwogICAgICBmdW5jdGlvbiByZWFsRG9uZShlcnJvciwgZmlsZTIpIHsKICAgICAgICBpZiAoZXJyb3IgfHwgIWZpbGUyKSB7CiAgICAgICAgICByZWplY3QoZXJyb3IpOwogICAgICAgIH0gZWxzZSBpZiAocmVzb2x2ZTIpIHsKICAgICAgICAgIHJlc29sdmUyKGZpbGUyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgb2soZG9uZSwgImBkb25lYCBpcyBkZWZpbmVkIGlmIGByZXNvbHZlYCBpcyBub3QiKTsKICAgICAgICAgIGRvbmUodm9pZCAwLCBmaWxlMik7CiAgICAgICAgfQogICAgICB9CiAgICAgIF9fbmFtZShyZWFsRG9uZSwgInJlYWxEb25lIik7CiAgICB9CiAgICBfX25hbWUoZXhlY3V0b3IsICJleGVjdXRvciIpOwogIH0KICAvKioKICAgKiBQcm9jZXNzIHRoZSBnaXZlbiBmaWxlIGFzIGNvbmZpZ3VyZWQgb24gdGhlIHByb2Nlc3Nvci4KICAgKgogICAqIEFuIGVycm9yIGlzIHRocm93biBpZiBhc3luY2hyb25vdXMgdHJhbnNmb3JtcyBhcmUgY29uZmlndXJlZC4KICAgKgogICAqID4gKipOb3RlKio6IGBwcm9jZXNzU3luY2AgZnJlZXplcyB0aGUgcHJvY2Vzc29yIGlmIG5vdCBhbHJlYWR5ICpmcm96ZW4qLgogICAqCiAgICogPiAqKk5vdGUqKjogYHByb2Nlc3NTeW5jYCBwZXJmb3JtcyB0aGUgcGFyc2UsIHJ1biwgYW5kIHN0cmluZ2lmeSBwaGFzZXMuCiAgICoKICAgKiBAcGFyYW0ge0NvbXBhdGlibGUgfCB1bmRlZmluZWR9IFtmaWxlXQogICAqICAgRmlsZSAob3B0aW9uYWwpOyB0eXBpY2FsbHkgYHN0cmluZ2Agb3IgYFZGaWxlYDsgYW55IHZhbHVlIGFjY2VwdGVkIGFzCiAgICogICBgeGAgaW4gYG5ldyBWRmlsZSh4KWAuCiAgICogQHJldHVybnMge1ZGaWxlV2l0aE91dHB1dDxDb21waWxlUmVzdWx0Pn0KICAgKiAgIFRoZSBwcm9jZXNzZWQgZmlsZS4KICAgKgogICAqICAgVGhlIHBhcnNlZCwgdHJhbnNmb3JtZWQsIGFuZCBjb21waWxlZCB2YWx1ZSBpcyBhdmFpbGFibGUgYXQKICAgKiAgIGBmaWxlLnZhbHVlYCAoc2VlIG5vdGUpLgogICAqCiAgICogICA+ICoqTm90ZSoqOiB1bmlmaWVkIHR5cGljYWxseSBjb21waWxlcyBieSBzZXJpYWxpemluZzogbW9zdAogICAqICAgPiBjb21waWxlcnMgcmV0dXJuIGBzdHJpbmdgIChvciBgVWludDhBcnJheWApLgogICAqICAgPiBTb21lIGNvbXBpbGVycywgc3VjaCBhcyB0aGUgb25lIGNvbmZpZ3VyZWQgd2l0aAogICAqICAgPiBbYHJlaHlwZS1yZWFjdGBdW3JlaHlwZS1yZWFjdF0sIHJldHVybiBvdGhlciB2YWx1ZXMgKGluIHRoaXMgY2FzZSwgYQogICAqICAgPiBSZWFjdCB0cmVlKS4KICAgKiAgID4gSWYgeW914oCZcmUgdXNpbmcgYSBjb21waWxlciB0aGF0IGRvZXNu4oCZdCBzZXJpYWxpemUsIGV4cGVjdCBkaWZmZXJlbnQKICAgKiAgID4gcmVzdWx0IHZhbHVlcy4KICAgKiAgID4KICAgKiAgID4gVG8gcmVnaXN0ZXIgY3VzdG9tIHJlc3VsdHMgaW4gVHlwZVNjcmlwdCwgYWRkIHRoZW0gdG8KICAgKiAgID4ge0BsaW5rY29kZSBDb21waWxlUmVzdWx0TWFwfS4KICAgKgogICAqICAgW3JlaHlwZS1yZWFjdF06IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWh5cGVqcy9yZWh5cGUtcmVhY3QKICAgKi8KICBwcm9jZXNzU3luYyhmaWxlKSB7CiAgICBsZXQgY29tcGxldGUgPSBmYWxzZTsKICAgIGxldCByZXN1bHQ7CiAgICB0aGlzLmZyZWV6ZSgpOwogICAgYXNzZXJ0UGFyc2VyKCJwcm9jZXNzU3luYyIsIHRoaXMucGFyc2VyIHx8IHRoaXMuUGFyc2VyKTsKICAgIGFzc2VydENvbXBpbGVyKCJwcm9jZXNzU3luYyIsIHRoaXMuY29tcGlsZXIgfHwgdGhpcy5Db21waWxlcik7CiAgICB0aGlzLnByb2Nlc3MoZmlsZSwgcmVhbERvbmUpOwogICAgYXNzZXJ0RG9uZSgicHJvY2Vzc1N5bmMiLCAicHJvY2VzcyIsIGNvbXBsZXRlKTsKICAgIG9rKHJlc3VsdCwgIndlIGVpdGhlciBiYWlsZWQgb24gYW4gZXJyb3Igb3IgaGF2ZSBhIHRyZWUiKTsKICAgIHJldHVybiByZXN1bHQ7CiAgICBmdW5jdGlvbiByZWFsRG9uZShlcnJvciwgZmlsZTIpIHsKICAgICAgY29tcGxldGUgPSB0cnVlOwogICAgICBiYWlsKGVycm9yKTsKICAgICAgcmVzdWx0ID0gZmlsZTI7CiAgICB9CiAgICBfX25hbWUocmVhbERvbmUsICJyZWFsRG9uZSIpOwogIH0KICAvKioKICAgKiBSdW4gKnRyYW5zZm9ybWVycyogb24gYSBzeW50YXggdHJlZS4KICAgKgogICAqID4gKipOb3RlKio6IGBydW5gIGZyZWV6ZXMgdGhlIHByb2Nlc3NvciBpZiBub3QgYWxyZWFkeSAqZnJvemVuKi4KICAgKgogICAqID4gKipOb3RlKio6IGBydW5gIHBlcmZvcm1zIHRoZSBydW4gcGhhc2UsIG5vdCBvdGhlciBwaGFzZXMuCiAgICoKICAgKiBAb3ZlcmxvYWQKICAgKiBAcGFyYW0ge0hlYWRUcmVlIGV4dGVuZHMgdW5kZWZpbmVkID8gTm9kZSA6IEhlYWRUcmVlfSB0cmVlCiAgICogQHBhcmFtIHtSdW5DYWxsYmFjazxUYWlsVHJlZSBleHRlbmRzIHVuZGVmaW5lZCA/IE5vZGUgOiBUYWlsVHJlZT59IGRvbmUKICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfQogICAqCiAgICogQG92ZXJsb2FkCiAgICogQHBhcmFtIHtIZWFkVHJlZSBleHRlbmRzIHVuZGVmaW5lZCA/IE5vZGUgOiBIZWFkVHJlZX0gdHJlZQogICAqIEBwYXJhbSB7Q29tcGF0aWJsZSB8IHVuZGVmaW5lZH0gZmlsZQogICAqIEBwYXJhbSB7UnVuQ2FsbGJhY2s8VGFpbFRyZWUgZXh0ZW5kcyB1bmRlZmluZWQgPyBOb2RlIDogVGFpbFRyZWU+fSBkb25lCiAgICogQHJldHVybnMge3VuZGVmaW5lZH0KICAgKgogICAqIEBvdmVybG9hZAogICAqIEBwYXJhbSB7SGVhZFRyZWUgZXh0ZW5kcyB1bmRlZmluZWQgPyBOb2RlIDogSGVhZFRyZWV9IHRyZWUKICAgKiBAcGFyYW0ge0NvbXBhdGlibGUgfCB1bmRlZmluZWR9IFtmaWxlXQogICAqIEByZXR1cm5zIHtQcm9taXNlPFRhaWxUcmVlIGV4dGVuZHMgdW5kZWZpbmVkID8gTm9kZSA6IFRhaWxUcmVlPn0KICAgKgogICAqIEBwYXJhbSB7SGVhZFRyZWUgZXh0ZW5kcyB1bmRlZmluZWQgPyBOb2RlIDogSGVhZFRyZWV9IHRyZWUKICAgKiAgIFRyZWUgdG8gdHJhbnNmb3JtIGFuZCBpbnNwZWN0LgogICAqIEBwYXJhbSB7KAogICAqICAgUnVuQ2FsbGJhY2s8VGFpbFRyZWUgZXh0ZW5kcyB1bmRlZmluZWQgPyBOb2RlIDogVGFpbFRyZWU+IHwKICAgKiAgIENvbXBhdGlibGUKICAgKiApfSBbZmlsZV0KICAgKiAgIEZpbGUgYXNzb2NpYXRlZCB3aXRoIGBub2RlYCAob3B0aW9uYWwpOyBhbnkgdmFsdWUgYWNjZXB0ZWQgYXMgYHhgIGluCiAgICogICBgbmV3IFZGaWxlKHgpYC4KICAgKiBAcGFyYW0ge1J1bkNhbGxiYWNrPFRhaWxUcmVlIGV4dGVuZHMgdW5kZWZpbmVkID8gTm9kZSA6IFRhaWxUcmVlPn0gW2RvbmVdCiAgICogICBDYWxsYmFjayAob3B0aW9uYWwpLgogICAqIEByZXR1cm5zIHtQcm9taXNlPFRhaWxUcmVlIGV4dGVuZHMgdW5kZWZpbmVkID8gTm9kZSA6IFRhaWxUcmVlPiB8IHVuZGVmaW5lZH0KICAgKiAgIE5vdGhpbmcgaWYgYGRvbmVgIGlzIGdpdmVuLgogICAqICAgT3RoZXJ3aXNlLCBhIHByb21pc2UgcmVqZWN0ZWQgd2l0aCBhIGZhdGFsIGVycm9yIG9yIHJlc29sdmVkIHdpdGggdGhlCiAgICogICB0cmFuc2Zvcm1lZCB0cmVlLgogICAqLwogIHJ1bih0cmVlLCBmaWxlLCBkb25lKSB7CiAgICBhc3NlcnROb2RlKHRyZWUpOwogICAgdGhpcy5mcmVlemUoKTsKICAgIGNvbnN0IHRyYW5zZm9ybWVycyA9IHRoaXMudHJhbnNmb3JtZXJzOwogICAgaWYgKCFkb25lICYmIHR5cGVvZiBmaWxlID09PSAiZnVuY3Rpb24iKSB7CiAgICAgIGRvbmUgPSBmaWxlOwogICAgICBmaWxlID0gdm9pZCAwOwogICAgfQogICAgcmV0dXJuIGRvbmUgPyBleGVjdXRvcih2b2lkIDAsIGRvbmUpIDogbmV3IFByb21pc2UoZXhlY3V0b3IpOwogICAgZnVuY3Rpb24gZXhlY3V0b3IocmVzb2x2ZTIsIHJlamVjdCkgewogICAgICBvaygKICAgICAgICB0eXBlb2YgZmlsZSAhPT0gImZ1bmN0aW9uIiwKICAgICAgICAiYGZpbGVgIGNhblx1MjAxOXQgYmUgYSBgZG9uZWAgYW55bW9yZSwgd2UgY2hlY2tlZCIKICAgICAgKTsKICAgICAgY29uc3QgcmVhbEZpbGUgPSB2ZmlsZShmaWxlKTsKICAgICAgdHJhbnNmb3JtZXJzLnJ1bih0cmVlLCByZWFsRmlsZSwgcmVhbERvbmUpOwogICAgICBmdW5jdGlvbiByZWFsRG9uZShlcnJvciwgb3V0cHV0VHJlZSwgZmlsZTIpIHsKICAgICAgICBjb25zdCByZXN1bHRpbmdUcmVlID0gKAogICAgICAgICAgLyoqIEB0eXBlIHtUYWlsVHJlZSBleHRlbmRzIHVuZGVmaW5lZCA/IE5vZGUgOiBUYWlsVHJlZX0gKi8KICAgICAgICAgIG91dHB1dFRyZWUgfHwgdHJlZQogICAgICAgICk7CiAgICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgICByZWplY3QoZXJyb3IpOwogICAgICAgIH0gZWxzZSBpZiAocmVzb2x2ZTIpIHsKICAgICAgICAgIHJlc29sdmUyKHJlc3VsdGluZ1RyZWUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBvayhkb25lLCAiYGRvbmVgIGlzIGRlZmluZWQgaWYgYHJlc29sdmVgIGlzIG5vdCIpOwogICAgICAgICAgZG9uZSh2b2lkIDAsIHJlc3VsdGluZ1RyZWUsIGZpbGUyKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgX19uYW1lKHJlYWxEb25lLCAicmVhbERvbmUiKTsKICAgIH0KICAgIF9fbmFtZShleGVjdXRvciwgImV4ZWN1dG9yIik7CiAgfQogIC8qKgogICAqIFJ1biAqdHJhbnNmb3JtZXJzKiBvbiBhIHN5bnRheCB0cmVlLgogICAqCiAgICogQW4gZXJyb3IgaXMgdGhyb3duIGlmIGFzeW5jaHJvbm91cyB0cmFuc2Zvcm1zIGFyZSBjb25maWd1cmVkLgogICAqCiAgICogPiAqKk5vdGUqKjogYHJ1blN5bmNgIGZyZWV6ZXMgdGhlIHByb2Nlc3NvciBpZiBub3QgYWxyZWFkeSAqZnJvemVuKi4KICAgKgogICAqID4gKipOb3RlKio6IGBydW5TeW5jYCBwZXJmb3JtcyB0aGUgcnVuIHBoYXNlLCBub3Qgb3RoZXIgcGhhc2VzLgogICAqCiAgICogQHBhcmFtIHtIZWFkVHJlZSBleHRlbmRzIHVuZGVmaW5lZCA/IE5vZGUgOiBIZWFkVHJlZX0gdHJlZQogICAqICAgVHJlZSB0byB0cmFuc2Zvcm0gYW5kIGluc3BlY3QuCiAgICogQHBhcmFtIHtDb21wYXRpYmxlIHwgdW5kZWZpbmVkfSBbZmlsZV0KICAgKiAgIEZpbGUgYXNzb2NpYXRlZCB3aXRoIGBub2RlYCAob3B0aW9uYWwpOyBhbnkgdmFsdWUgYWNjZXB0ZWQgYXMgYHhgIGluCiAgICogICBgbmV3IFZGaWxlKHgpYC4KICAgKiBAcmV0dXJucyB7VGFpbFRyZWUgZXh0ZW5kcyB1bmRlZmluZWQgPyBOb2RlIDogVGFpbFRyZWV9CiAgICogICBUcmFuc2Zvcm1lZCB0cmVlLgogICAqLwogIHJ1blN5bmModHJlZSwgZmlsZSkgewogICAgbGV0IGNvbXBsZXRlID0gZmFsc2U7CiAgICBsZXQgcmVzdWx0OwogICAgdGhpcy5ydW4odHJlZSwgZmlsZSwgcmVhbERvbmUpOwogICAgYXNzZXJ0RG9uZSgicnVuU3luYyIsICJydW4iLCBjb21wbGV0ZSk7CiAgICBvayhyZXN1bHQsICJ3ZSBlaXRoZXIgYmFpbGVkIG9uIGFuIGVycm9yIG9yIGhhdmUgYSB0cmVlIik7CiAgICByZXR1cm4gcmVzdWx0OwogICAgZnVuY3Rpb24gcmVhbERvbmUoZXJyb3IsIHRyZWUyKSB7CiAgICAgIGJhaWwoZXJyb3IpOwogICAgICByZXN1bHQgPSB0cmVlMjsKICAgICAgY29tcGxldGUgPSB0cnVlOwogICAgfQogICAgX19uYW1lKHJlYWxEb25lLCAicmVhbERvbmUiKTsKICB9CiAgLyoqCiAgICogQ29tcGlsZSBhIHN5bnRheCB0cmVlLgogICAqCiAgICogPiAqKk5vdGUqKjogYHN0cmluZ2lmeWAgZnJlZXplcyB0aGUgcHJvY2Vzc29yIGlmIG5vdCBhbHJlYWR5ICpmcm96ZW4qLgogICAqCiAgICogPiAqKk5vdGUqKjogYHN0cmluZ2lmeWAgcGVyZm9ybXMgdGhlIHN0cmluZ2lmeSBwaGFzZSwgbm90IHRoZSBydW4gcGhhc2UKICAgKiA+IG9yIG90aGVyIHBoYXNlcy4KICAgKgogICAqIEBwYXJhbSB7Q29tcGlsZVRyZWUgZXh0ZW5kcyB1bmRlZmluZWQgPyBOb2RlIDogQ29tcGlsZVRyZWV9IHRyZWUKICAgKiAgIFRyZWUgdG8gY29tcGlsZS4KICAgKiBAcGFyYW0ge0NvbXBhdGlibGUgfCB1bmRlZmluZWR9IFtmaWxlXQogICAqICAgRmlsZSBhc3NvY2lhdGVkIHdpdGggYG5vZGVgIChvcHRpb25hbCk7IGFueSB2YWx1ZSBhY2NlcHRlZCBhcyBgeGAgaW4KICAgKiAgIGBuZXcgVkZpbGUoeClgLgogICAqIEByZXR1cm5zIHtDb21waWxlUmVzdWx0IGV4dGVuZHMgdW5kZWZpbmVkID8gVmFsdWUgOiBDb21waWxlUmVzdWx0fQogICAqICAgVGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdHJlZSAoc2VlIG5vdGUpLgogICAqCiAgICogICA+ICoqTm90ZSoqOiB1bmlmaWVkIHR5cGljYWxseSBjb21waWxlcyBieSBzZXJpYWxpemluZzogbW9zdCBjb21waWxlcnMKICAgKiAgID4gcmV0dXJuIGBzdHJpbmdgIChvciBgVWludDhBcnJheWApLgogICAqICAgPiBTb21lIGNvbXBpbGVycywgc3VjaCBhcyB0aGUgb25lIGNvbmZpZ3VyZWQgd2l0aAogICAqICAgPiBbYHJlaHlwZS1yZWFjdGBdW3JlaHlwZS1yZWFjdF0sIHJldHVybiBvdGhlciB2YWx1ZXMgKGluIHRoaXMgY2FzZSwgYQogICAqICAgPiBSZWFjdCB0cmVlKS4KICAgKiAgID4gSWYgeW914oCZcmUgdXNpbmcgYSBjb21waWxlciB0aGF0IGRvZXNu4oCZdCBzZXJpYWxpemUsIGV4cGVjdCBkaWZmZXJlbnQKICAgKiAgID4gcmVzdWx0IHZhbHVlcy4KICAgKiAgID4KICAgKiAgID4gVG8gcmVnaXN0ZXIgY3VzdG9tIHJlc3VsdHMgaW4gVHlwZVNjcmlwdCwgYWRkIHRoZW0gdG8KICAgKiAgID4ge0BsaW5rY29kZSBDb21waWxlUmVzdWx0TWFwfS4KICAgKgogICAqICAgW3JlaHlwZS1yZWFjdF06IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWh5cGVqcy9yZWh5cGUtcmVhY3QKICAgKi8KICBzdHJpbmdpZnkodHJlZSwgZmlsZSkgewogICAgdGhpcy5mcmVlemUoKTsKICAgIGNvbnN0IHJlYWxGaWxlID0gdmZpbGUoZmlsZSk7CiAgICBjb25zdCBjb21waWxlcjIgPSB0aGlzLmNvbXBpbGVyIHx8IHRoaXMuQ29tcGlsZXI7CiAgICBhc3NlcnRDb21waWxlcigic3RyaW5naWZ5IiwgY29tcGlsZXIyKTsKICAgIGFzc2VydE5vZGUodHJlZSk7CiAgICByZXR1cm4gY29tcGlsZXIyKHRyZWUsIHJlYWxGaWxlKTsKICB9CiAgLyoqCiAgICogQ29uZmlndXJlIHRoZSBwcm9jZXNzb3IgdG8gdXNlIGEgcGx1Z2luLCBhIGxpc3Qgb2YgdXNhYmxlIHZhbHVlcywgb3IgYQogICAqIHByZXNldC4KICAgKgogICAqIElmIHRoZSBwcm9jZXNzb3IgaXMgYWxyZWFkeSB1c2luZyBhIHBsdWdpbiwgdGhlIHByZXZpb3VzIHBsdWdpbgogICAqIGNvbmZpZ3VyYXRpb24gaXMgY2hhbmdlZCBiYXNlZCBvbiB0aGUgb3B0aW9ucyB0aGF0IGFyZSBwYXNzZWQgaW4uCiAgICogSW4gb3RoZXIgd29yZHMsIHRoZSBwbHVnaW4gaXMgbm90IGFkZGVkIGEgc2Vjb25kIHRpbWUuCiAgICoKICAgKiA+ICoqTm90ZSoqOiBgdXNlYCBjYW5ub3QgYmUgY2FsbGVkIG9uICpmcm96ZW4qIHByb2Nlc3NvcnMuCiAgICogPiBDYWxsIHRoZSBwcm9jZXNzb3IgZmlyc3QgdG8gY3JlYXRlIGEgbmV3IHVuZnJvemVuIHByb2Nlc3Nvci4KICAgKgogICAqIEBleGFtcGxlCiAgICogICBUaGVyZSBhcmUgbWFueSB3YXlzIHRvIHBhc3MgcGx1Z2lucyB0byBgLnVzZSgpYC4KICAgKiAgIFRoaXMgZXhhbXBsZSBnaXZlcyBhbiBvdmVydmlldzoKICAgKgogICAqICAgYGBganMKICAgKiAgIGltcG9ydCB7dW5pZmllZH0gZnJvbSAndW5pZmllZCcKICAgKgogICAqICAgdW5pZmllZCgpCiAgICogICAgIC8vIFBsdWdpbiB3aXRoIG9wdGlvbnM6CiAgICogICAgIC51c2UocGx1Z2luQSwge3g6IHRydWUsIHk6IHRydWV9KQogICAqICAgICAvLyBQYXNzaW5nIHRoZSBzYW1lIHBsdWdpbiBhZ2FpbiBtZXJnZXMgY29uZmlndXJhdGlvbiAodG8gYHt4OiB0cnVlLCB5OiBmYWxzZSwgejogdHJ1ZX1gKToKICAgKiAgICAgLnVzZShwbHVnaW5BLCB7eTogZmFsc2UsIHo6IHRydWV9KQogICAqICAgICAvLyBQbHVnaW5zOgogICAqICAgICAudXNlKFtwbHVnaW5CLCBwbHVnaW5DXSkKICAgKiAgICAgLy8gVHdvIHBsdWdpbnMsIHRoZSBzZWNvbmQgd2l0aCBvcHRpb25zOgogICAqICAgICAudXNlKFtwbHVnaW5ELCBbcGx1Z2luRSwge31dXSkKICAgKiAgICAgLy8gUHJlc2V0IHdpdGggcGx1Z2lucyBhbmQgc2V0dGluZ3M6CiAgICogICAgIC51c2Uoe3BsdWdpbnM6IFtwbHVnaW5GLCBbcGx1Z2luRywge31dXSwgc2V0dGluZ3M6IHtwb3NpdGlvbjogZmFsc2V9fSkKICAgKiAgICAgLy8gU2V0dGluZ3Mgb25seToKICAgKiAgICAgLnVzZSh7c2V0dGluZ3M6IHtwb3NpdGlvbjogZmFsc2V9fSkKICAgKiAgIGBgYAogICAqCiAgICogQHRlbXBsYXRlIHtBcnJheTx1bmtub3duPn0gW1BhcmFtZXRlcnM9W11dCiAgICogQHRlbXBsYXRlIHtOb2RlIHwgc3RyaW5nIHwgdW5kZWZpbmVkfSBbSW5wdXQ9dW5kZWZpbmVkXQogICAqIEB0ZW1wbGF0ZSBbT3V0cHV0PUlucHV0XQogICAqCiAgICogQG92ZXJsb2FkCiAgICogQHBhcmFtIHtQcmVzZXQgfCBudWxsIHwgdW5kZWZpbmVkfSBbcHJlc2V0XQogICAqIEByZXR1cm5zIHtQcm9jZXNzb3I8UGFyc2VUcmVlLCBIZWFkVHJlZSwgVGFpbFRyZWUsIENvbXBpbGVUcmVlLCBDb21waWxlUmVzdWx0Pn0KICAgKgogICAqIEBvdmVybG9hZAogICAqIEBwYXJhbSB7UGx1Z2dhYmxlTGlzdH0gbGlzdAogICAqIEByZXR1cm5zIHtQcm9jZXNzb3I8UGFyc2VUcmVlLCBIZWFkVHJlZSwgVGFpbFRyZWUsIENvbXBpbGVUcmVlLCBDb21waWxlUmVzdWx0Pn0KICAgKgogICAqIEBvdmVybG9hZAogICAqIEBwYXJhbSB7UGx1Z2luPFBhcmFtZXRlcnMsIElucHV0LCBPdXRwdXQ+fSBwbHVnaW4KICAgKiBAcGFyYW0gey4uLihQYXJhbWV0ZXJzIHwgW2Jvb2xlYW5dKX0gcGFyYW1ldGVycwogICAqIEByZXR1cm5zIHtVc2VQbHVnaW48UGFyc2VUcmVlLCBIZWFkVHJlZSwgVGFpbFRyZWUsIENvbXBpbGVUcmVlLCBDb21waWxlUmVzdWx0LCBJbnB1dCwgT3V0cHV0Pn0KICAgKgogICAqIEBwYXJhbSB7UGx1Z2dhYmxlTGlzdCB8IFBsdWdpbiB8IFByZXNldCB8IG51bGwgfCB1bmRlZmluZWR9IHZhbHVlCiAgICogICBVc2FibGUgdmFsdWUuCiAgICogQHBhcmFtIHsuLi51bmtub3dufSBwYXJhbWV0ZXJzCiAgICogICBQYXJhbWV0ZXJzLCB3aGVuIGEgcGx1Z2luIGlzIGdpdmVuIGFzIGEgdXNhYmxlIHZhbHVlLgogICAqIEByZXR1cm5zIHtQcm9jZXNzb3I8UGFyc2VUcmVlLCBIZWFkVHJlZSwgVGFpbFRyZWUsIENvbXBpbGVUcmVlLCBDb21waWxlUmVzdWx0Pn0KICAgKiAgIEN1cnJlbnQgcHJvY2Vzc29yLgogICAqLwogIHVzZSh2YWx1ZTIsIC4uLnBhcmFtZXRlcnMpIHsKICAgIGNvbnN0IGF0dGFjaGVycyA9IHRoaXMuYXR0YWNoZXJzOwogICAgY29uc3QgbmFtZXNwYWNlID0gdGhpcy5uYW1lc3BhY2U7CiAgICBhc3NlcnRVbmZyb3plbigidXNlIiwgdGhpcy5mcm96ZW4pOwogICAgaWYgKHZhbHVlMiA9PT0gbnVsbCB8fCB2YWx1ZTIgPT09IHZvaWQgMCkgewogICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUyID09PSAiZnVuY3Rpb24iKSB7CiAgICAgIGFkZFBsdWdpbih2YWx1ZTIsIHBhcmFtZXRlcnMpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUyID09PSAib2JqZWN0IikgewogICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZTIpKSB7CiAgICAgICAgYWRkTGlzdCh2YWx1ZTIpOwogICAgICB9IGVsc2UgewogICAgICAgIGFkZFByZXNldCh2YWx1ZTIpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJFeHBlY3RlZCB1c2FibGUgdmFsdWUsIG5vdCBgIiArIHZhbHVlMiArICJgIik7CiAgICB9CiAgICByZXR1cm4gdGhpczsKICAgIGZ1bmN0aW9uIGFkZDIodmFsdWUzKSB7CiAgICAgIGlmICh0eXBlb2YgdmFsdWUzID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgYWRkUGx1Z2luKHZhbHVlMywgW10pOwogICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZTMgPT09ICJvYmplY3QiKSB7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUzKSkgewogICAgICAgICAgY29uc3QgW3BsdWdpbiwgLi4ucGFyYW1ldGVyczJdID0gKAogICAgICAgICAgICAvKiogQHR5cGUge1BsdWdpblR1cGxlPEFycmF5PHVua25vd24+Pn0gKi8KICAgICAgICAgICAgdmFsdWUzCiAgICAgICAgICApOwogICAgICAgICAgYWRkUGx1Z2luKHBsdWdpbiwgcGFyYW1ldGVyczIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBhZGRQcmVzZXQodmFsdWUzKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiRXhwZWN0ZWQgdXNhYmxlIHZhbHVlLCBub3QgYCIgKyB2YWx1ZTMgKyAiYCIpOwogICAgICB9CiAgICB9CiAgICBfX25hbWUoYWRkMiwgImFkZCIpOwogICAgZnVuY3Rpb24gYWRkUHJlc2V0KHJlc3VsdCkgewogICAgICBpZiAoISgicGx1Z2lucyIgaW4gcmVzdWx0KSAmJiAhKCJzZXR0aW5ncyIgaW4gcmVzdWx0KSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICJFeHBlY3RlZCB1c2FibGUgdmFsdWUgYnV0IHJlY2VpdmVkIGFuIGVtcHR5IHByZXNldCwgd2hpY2ggaXMgcHJvYmFibHkgYSBtaXN0YWtlOiBwcmVzZXRzIHR5cGljYWxseSBjb21lIHdpdGggYHBsdWdpbnNgIGFuZCBzb21ldGltZXMgd2l0aCBgc2V0dGluZ3NgLCBidXQgdGhpcyBoYXMgbmVpdGhlciIKICAgICAgICApOwogICAgICB9CiAgICAgIGFkZExpc3QocmVzdWx0LnBsdWdpbnMpOwogICAgICBpZiAocmVzdWx0LnNldHRpbmdzKSB7CiAgICAgICAgbmFtZXNwYWNlLnNldHRpbmdzID0gKDAsIGltcG9ydF9leHRlbmQuZGVmYXVsdCkodHJ1ZSwgbmFtZXNwYWNlLnNldHRpbmdzLCByZXN1bHQuc2V0dGluZ3MpOwogICAgICB9CiAgICB9CiAgICBfX25hbWUoYWRkUHJlc2V0LCAiYWRkUHJlc2V0Iik7CiAgICBmdW5jdGlvbiBhZGRMaXN0KHBsdWdpbnMpIHsKICAgICAgbGV0IGluZGV4MiA9IC0xOwogICAgICBpZiAocGx1Z2lucyA9PT0gbnVsbCB8fCBwbHVnaW5zID09PSB2b2lkIDApIHsKICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHBsdWdpbnMpKSB7CiAgICAgICAgd2hpbGUgKCsraW5kZXgyIDwgcGx1Z2lucy5sZW5ndGgpIHsKICAgICAgICAgIGNvbnN0IHRoaW5nID0gcGx1Z2luc1tpbmRleDJdOwogICAgICAgICAgYWRkMih0aGluZyk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIGEgbGlzdCBvZiBwbHVnaW5zLCBub3QgYCIgKyBwbHVnaW5zICsgImAiKTsKICAgICAgfQogICAgfQogICAgX19uYW1lKGFkZExpc3QsICJhZGRMaXN0Iik7CiAgICBmdW5jdGlvbiBhZGRQbHVnaW4ocGx1Z2luLCBwYXJhbWV0ZXJzMikgewogICAgICBsZXQgaW5kZXgyID0gLTE7CiAgICAgIGxldCBlbnRyeUluZGV4ID0gLTE7CiAgICAgIHdoaWxlICgrK2luZGV4MiA8IGF0dGFjaGVycy5sZW5ndGgpIHsKICAgICAgICBpZiAoYXR0YWNoZXJzW2luZGV4Ml1bMF0gPT09IHBsdWdpbikgewogICAgICAgICAgZW50cnlJbmRleCA9IGluZGV4MjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZW50cnlJbmRleCA9PT0gLTEpIHsKICAgICAgICBhdHRhY2hlcnMucHVzaChbcGx1Z2luLCAuLi5wYXJhbWV0ZXJzMl0pOwogICAgICB9IGVsc2UgaWYgKHBhcmFtZXRlcnMyLmxlbmd0aCA+IDApIHsKICAgICAgICBsZXQgW3ByaW1hcnksIC4uLnJlc3RdID0gcGFyYW1ldGVyczI7CiAgICAgICAgY29uc3QgY3VycmVudFByaW1hcnkgPSBhdHRhY2hlcnNbZW50cnlJbmRleF1bMV07CiAgICAgICAgaWYgKGlzUGxhaW5PYmplY3QoY3VycmVudFByaW1hcnkpICYmIGlzUGxhaW5PYmplY3QocHJpbWFyeSkpIHsKICAgICAgICAgIHByaW1hcnkgPSAoMCwgaW1wb3J0X2V4dGVuZC5kZWZhdWx0KSh0cnVlLCBjdXJyZW50UHJpbWFyeSwgcHJpbWFyeSk7CiAgICAgICAgfQogICAgICAgIGF0dGFjaGVyc1tlbnRyeUluZGV4XSA9IFtwbHVnaW4sIHByaW1hcnksIC4uLnJlc3RdOwogICAgICB9CiAgICB9CiAgICBfX25hbWUoYWRkUGx1Z2luLCAiYWRkUGx1Z2luIik7CiAgfQp9Owp2YXIgdW5pZmllZCA9IG5ldyBQcm9jZXNzb3IoKS5mcmVlemUoKTsKZnVuY3Rpb24gYXNzZXJ0UGFyc2VyKG5hbWUsIHZhbHVlMikgewogIGlmICh0eXBlb2YgdmFsdWUyICE9PSAiZnVuY3Rpb24iKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYCIgKyBuYW1lICsgImAgd2l0aG91dCBgcGFyc2VyYCIpOwogIH0KfQpfX25hbWUoYXNzZXJ0UGFyc2VyLCAiYXNzZXJ0UGFyc2VyIik7CmZ1bmN0aW9uIGFzc2VydENvbXBpbGVyKG5hbWUsIHZhbHVlMikgewogIGlmICh0eXBlb2YgdmFsdWUyICE9PSAiZnVuY3Rpb24iKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYCIgKyBuYW1lICsgImAgd2l0aG91dCBgY29tcGlsZXJgIik7CiAgfQp9Cl9fbmFtZShhc3NlcnRDb21waWxlciwgImFzc2VydENvbXBpbGVyIik7CmZ1bmN0aW9uIGFzc2VydFVuZnJvemVuKG5hbWUsIGZyb3plbikgewogIGlmIChmcm96ZW4pIHsKICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgIkNhbm5vdCBjYWxsIGAiICsgbmFtZSArICJgIG9uIGEgZnJvemVuIHByb2Nlc3Nvci5cbkNyZWF0ZSBhIG5ldyBwcm9jZXNzb3IgZmlyc3QsIGJ5IGNhbGxpbmcgaXQ6IHVzZSBgcHJvY2Vzc29yKClgIGluc3RlYWQgb2YgYHByb2Nlc3NvcmAuIgogICAgKTsKICB9Cn0KX19uYW1lKGFzc2VydFVuZnJvemVuLCAiYXNzZXJ0VW5mcm96ZW4iKTsKZnVuY3Rpb24gYXNzZXJ0Tm9kZShub2RlMikgewogIGlmICghaXNQbGFpbk9iamVjdChub2RlMikgfHwgdHlwZW9mIG5vZGUyLnR5cGUgIT09ICJzdHJpbmciKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJFeHBlY3RlZCBub2RlLCBnb3QgYCIgKyBub2RlMiArICJgIik7CiAgfQp9Cl9fbmFtZShhc3NlcnROb2RlLCAiYXNzZXJ0Tm9kZSIpOwpmdW5jdGlvbiBhc3NlcnREb25lKG5hbWUsIGFzeW5jTmFtZSwgY29tcGxldGUpIHsKICBpZiAoIWNvbXBsZXRlKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICJgIiArIG5hbWUgKyAiYCBmaW5pc2hlZCBhc3luYy4gVXNlIGAiICsgYXN5bmNOYW1lICsgImAgaW5zdGVhZCIKICAgICk7CiAgfQp9Cl9fbmFtZShhc3NlcnREb25lLCAiYXNzZXJ0RG9uZSIpOwpmdW5jdGlvbiB2ZmlsZSh2YWx1ZTIpIHsKICByZXR1cm4gbG9va3NMaWtlQVZGaWxlKHZhbHVlMikgPyB2YWx1ZTIgOiBuZXcgVkZpbGUodmFsdWUyKTsKfQpfX25hbWUodmZpbGUsICJ2ZmlsZSIpOwpmdW5jdGlvbiBsb29rc0xpa2VBVkZpbGUodmFsdWUyKSB7CiAgcmV0dXJuIEJvb2xlYW4oCiAgICB2YWx1ZTIgJiYgdHlwZW9mIHZhbHVlMiA9PT0gIm9iamVjdCIgJiYgIm1lc3NhZ2UiIGluIHZhbHVlMiAmJiAibWVzc2FnZXMiIGluIHZhbHVlMgogICk7Cn0KX19uYW1lKGxvb2tzTGlrZUFWRmlsZSwgImxvb2tzTGlrZUFWRmlsZSIpOwpmdW5jdGlvbiBsb29rc0xpa2VBVmFsdWUodmFsdWUyKSB7CiAgcmV0dXJuIHR5cGVvZiB2YWx1ZTIgPT09ICJzdHJpbmciIHx8IGlzVWludDhBcnJheTQodmFsdWUyKTsKfQpfX25hbWUobG9va3NMaWtlQVZhbHVlLCAibG9va3NMaWtlQVZhbHVlIik7CmZ1bmN0aW9uIGlzVWludDhBcnJheTQodmFsdWUyKSB7CiAgcmV0dXJuIEJvb2xlYW4oCiAgICB2YWx1ZTIgJiYgdHlwZW9mIHZhbHVlMiA9PT0gIm9iamVjdCIgJiYgImJ5dGVMZW5ndGgiIGluIHZhbHVlMiAmJiAiYnl0ZU9mZnNldCIgaW4gdmFsdWUyCiAgKTsKfQpfX25hbWUoaXNVaW50OEFycmF5NCwgImlzVWludDhBcnJheSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2Njb3VudEAyLjAuMS9ub2RlX21vZHVsZXMvY2NvdW50L2luZGV4LmpzCmZ1bmN0aW9uIGNjb3VudCh2YWx1ZTIsIGNoYXJhY3RlcikgewogIGNvbnN0IHNvdXJjZSA9IFN0cmluZyh2YWx1ZTIpOwogIGlmICh0eXBlb2YgY2hhcmFjdGVyICE9PSAic3RyaW5nIikgewogICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiRXhwZWN0ZWQgY2hhcmFjdGVyIik7CiAgfQogIGxldCBjb3VudDIgPSAwOwogIGxldCBpbmRleDIgPSBzb3VyY2UuaW5kZXhPZihjaGFyYWN0ZXIpOwogIHdoaWxlIChpbmRleDIgIT09IC0xKSB7CiAgICBjb3VudDIrKzsKICAgIGluZGV4MiA9IHNvdXJjZS5pbmRleE9mKGNoYXJhY3RlciwgaW5kZXgyICsgY2hhcmFjdGVyLmxlbmd0aCk7CiAgfQogIHJldHVybiBjb3VudDI7Cn0KX19uYW1lKGNjb3VudCwgImNjb3VudCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay11dGlsLWNoYXJhY3RlckAyLjEuMS9ub2RlX21vZHVsZXMvbWljcm9tYXJrLXV0aWwtY2hhcmFjdGVyL2luZGV4LmpzCnZhciBhc2NpaUFscGhhID0gcmVnZXhDaGVjaygvW0EtWmEtel0vKTsKdmFyIGFzY2lpQWxwaGFudW1lcmljID0gcmVnZXhDaGVjaygvW1xkQS1aYS16XS8pOwp2YXIgYXNjaWlBdGV4dCA9IHJlZ2V4Q2hlY2soL1sjLScqK1wtLTk9P0EtWl4tfl0vKTsKZnVuY3Rpb24gYXNjaWlDb250cm9sKGNvZGU0KSB7CiAgcmV0dXJuICgKICAgIC8vIFNwZWNpYWwgd2hpdGVzcGFjZSBjb2RlcyAod2hpY2ggaGF2ZSBuZWdhdGl2ZSB2YWx1ZXMpLCBDMCBhbmQgQ29udHJvbAogICAgLy8gY2hhcmFjdGVyIERFTAogICAgY29kZTQgIT09IG51bGwgJiYgKGNvZGU0IDwgMzIgfHwgY29kZTQgPT09IDEyNykKICApOwp9Cl9fbmFtZShhc2NpaUNvbnRyb2wsICJhc2NpaUNvbnRyb2wiKTsKdmFyIGFzY2lpRGlnaXQgPSByZWdleENoZWNrKC9cZC8pOwp2YXIgYXNjaWlIZXhEaWdpdCA9IHJlZ2V4Q2hlY2soL1tcZEEtRmEtZl0vKTsKdmFyIGFzY2lpUHVuY3R1YXRpb24gPSByZWdleENoZWNrKC9bIS0vOi1AWy1gey1+XS8pOwpmdW5jdGlvbiBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpIHsKICByZXR1cm4gY29kZTQgIT09IG51bGwgJiYgY29kZTQgPCAtMjsKfQpfX25hbWUobWFya2Rvd25MaW5lRW5kaW5nLCAibWFya2Rvd25MaW5lRW5kaW5nIik7CmZ1bmN0aW9uIG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpIHsKICByZXR1cm4gY29kZTQgIT09IG51bGwgJiYgKGNvZGU0IDwgMCB8fCBjb2RlNCA9PT0gMzIpOwp9Cl9fbmFtZShtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlLCAibWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZSIpOwpmdW5jdGlvbiBtYXJrZG93blNwYWNlKGNvZGU0KSB7CiAgcmV0dXJuIGNvZGU0ID09PSAtMiB8fCBjb2RlNCA9PT0gLTEgfHwgY29kZTQgPT09IDMyOwp9Cl9fbmFtZShtYXJrZG93blNwYWNlLCAibWFya2Rvd25TcGFjZSIpOwp2YXIgdW5pY29kZVB1bmN0dWF0aW9uID0gcmVnZXhDaGVjaygvXHB7UH18XHB7U30vdSk7CnZhciB1bmljb2RlV2hpdGVzcGFjZSA9IHJlZ2V4Q2hlY2soL1xzLyk7CmZ1bmN0aW9uIHJlZ2V4Q2hlY2socmVnZXgpIHsKICByZXR1cm4gY2hlY2s7CiAgZnVuY3Rpb24gY2hlY2soY29kZTQpIHsKICAgIHJldHVybiBjb2RlNCAhPT0gbnVsbCAmJiBjb2RlNCA+IC0xICYmIHJlZ2V4LnRlc3QoU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlNCkpOwogIH0KICBfX25hbWUoY2hlY2ssICJjaGVjayIpOwp9Cl9fbmFtZShyZWdleENoZWNrLCAicmVnZXhDaGVjayIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3VuaXN0LXV0aWwtaXNANi4wLjEvbm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtaXMvbGliL2luZGV4LmpzCnZhciBpcyA9ICgKICAvLyBOb3RlOiBvdmVybG9hZHMgaW4gSlNEb2MgY2Fu4oCZdCB5ZXQgdXNlIGRpZmZlcmVudCBgQHRlbXBsYXRlYHMuCiAgLyoqCiAgICogQHR5cGUgeygKICAgKiAgICg8Q29uZGl0aW9uIGV4dGVuZHMgUmVhZG9ubHlBcnJheTxzdHJpbmc+Pihub2RlOiB1bmtub3duLCB0ZXN0OiBDb25kaXRpb24sIGluZGV4PzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgcGFyZW50PzogUGFyZW50IHwgbnVsbCB8IHVuZGVmaW5lZCwgY29udGV4dD86IHVua25vd24pID0+IG5vZGUgaXMgTm9kZSAmIHt0eXBlOiBDb25kaXRpb25bbnVtYmVyXX0pICYKICAgKiAgICg8Q29uZGl0aW9uIGV4dGVuZHMgQXJyYXk8c3RyaW5nPj4obm9kZTogdW5rbm93biwgdGVzdDogQ29uZGl0aW9uLCBpbmRleD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHBhcmVudD86IFBhcmVudCB8IG51bGwgfCB1bmRlZmluZWQsIGNvbnRleHQ/OiB1bmtub3duKSA9PiBub2RlIGlzIE5vZGUgJiB7dHlwZTogQ29uZGl0aW9uW251bWJlcl19KSAmCiAgICogICAoPENvbmRpdGlvbiBleHRlbmRzIHN0cmluZz4obm9kZTogdW5rbm93biwgdGVzdDogQ29uZGl0aW9uLCBpbmRleD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHBhcmVudD86IFBhcmVudCB8IG51bGwgfCB1bmRlZmluZWQsIGNvbnRleHQ/OiB1bmtub3duKSA9PiBub2RlIGlzIE5vZGUgJiB7dHlwZTogQ29uZGl0aW9ufSkgJgogICAqICAgKDxDb25kaXRpb24gZXh0ZW5kcyBQcm9wcz4obm9kZTogdW5rbm93biwgdGVzdDogQ29uZGl0aW9uLCBpbmRleD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHBhcmVudD86IFBhcmVudCB8IG51bGwgfCB1bmRlZmluZWQsIGNvbnRleHQ/OiB1bmtub3duKSA9PiBub2RlIGlzIE5vZGUgJiBDb25kaXRpb24pICYKICAgKiAgICg8Q29uZGl0aW9uIGV4dGVuZHMgVGVzdEZ1bmN0aW9uPihub2RlOiB1bmtub3duLCB0ZXN0OiBDb25kaXRpb24sIGluZGV4PzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgcGFyZW50PzogUGFyZW50IHwgbnVsbCB8IHVuZGVmaW5lZCwgY29udGV4dD86IHVua25vd24pID0+IG5vZGUgaXMgTm9kZSAmIFByZWRpY2F0ZTxDb25kaXRpb24sIE5vZGU+KSAmCiAgICogICAoKG5vZGU/OiBudWxsIHwgdW5kZWZpbmVkKSA9PiBmYWxzZSkgJgogICAqICAgKChub2RlOiB1bmtub3duLCB0ZXN0PzogbnVsbCB8IHVuZGVmaW5lZCwgaW5kZXg/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBwYXJlbnQ/OiBQYXJlbnQgfCBudWxsIHwgdW5kZWZpbmVkLCBjb250ZXh0PzogdW5rbm93bikgPT4gbm9kZSBpcyBOb2RlKSAmCiAgICogICAoKG5vZGU6IHVua25vd24sIHRlc3Q/OiBUZXN0LCBpbmRleD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHBhcmVudD86IFBhcmVudCB8IG51bGwgfCB1bmRlZmluZWQsIGNvbnRleHQ/OiB1bmtub3duKSA9PiBib29sZWFuKQogICAqICl9CiAgICovCiAgLyoqCiAgICogQHBhcmFtIHt1bmtub3dufSBbbm9kZV0KICAgKiBAcGFyYW0ge1Rlc3R9IFt0ZXN0XQogICAqIEBwYXJhbSB7bnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZH0gW2luZGV4XQogICAqIEBwYXJhbSB7UGFyZW50IHwgbnVsbCB8IHVuZGVmaW5lZH0gW3BhcmVudF0KICAgKiBAcGFyYW0ge3Vua25vd259IFtjb250ZXh0XQogICAqIEByZXR1cm5zIHtib29sZWFufQogICAqLwogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtcGFyYW1zCiAgLyogQF9fUFVSRV9fICovIF9fbmFtZSgoZnVuY3Rpb24obm9kZTIsIHRlc3QsIGluZGV4MiwgcGFyZW50LCBjb250ZXh0MikgewogICAgY29uc3QgY2hlY2sgPSBjb252ZXJ0KHRlc3QpOwogICAgaWYgKGluZGV4MiAhPT0gdm9pZCAwICYmIGluZGV4MiAhPT0gbnVsbCAmJiAodHlwZW9mIGluZGV4MiAhPT0gIm51bWJlciIgfHwgaW5kZXgyIDwgMCB8fCBpbmRleDIgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RlZCBwb3NpdGl2ZSBmaW5pdGUgaW5kZXgiKTsKICAgIH0KICAgIGlmIChwYXJlbnQgIT09IHZvaWQgMCAmJiBwYXJlbnQgIT09IG51bGwgJiYgKCFpcyhwYXJlbnQpIHx8ICFwYXJlbnQuY2hpbGRyZW4pKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiRXhwZWN0ZWQgcGFyZW50IG5vZGUiKTsKICAgIH0KICAgIGlmICgocGFyZW50ID09PSB2b2lkIDAgfHwgcGFyZW50ID09PSBudWxsKSAhPT0gKGluZGV4MiA9PT0gdm9pZCAwIHx8IGluZGV4MiA9PT0gbnVsbCkpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RlZCBib3RoIHBhcmVudCBhbmQgaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBsb29rc0xpa2VBTm9kZShub2RlMikgPyBjaGVjay5jYWxsKGNvbnRleHQyLCBub2RlMiwgaW5kZXgyLCBwYXJlbnQpIDogZmFsc2U7CiAgfSksICJpcyIpCik7CnZhciBjb252ZXJ0ID0gKAogIC8vIE5vdGU6IG92ZXJsb2FkcyBpbiBKU0RvYyBjYW7igJl0IHlldCB1c2UgZGlmZmVyZW50IGBAdGVtcGxhdGVgcy4KICAvKioKICAgKiBAdHlwZSB7KAogICAqICAgKDxDb25kaXRpb24gZXh0ZW5kcyBzdHJpbmc+KHRlc3Q6IENvbmRpdGlvbikgPT4gKG5vZGU6IHVua25vd24sIGluZGV4PzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgcGFyZW50PzogUGFyZW50IHwgbnVsbCB8IHVuZGVmaW5lZCwgY29udGV4dD86IHVua25vd24pID0+IG5vZGUgaXMgTm9kZSAmIHt0eXBlOiBDb25kaXRpb259KSAmCiAgICogICAoPENvbmRpdGlvbiBleHRlbmRzIFByb3BzPih0ZXN0OiBDb25kaXRpb24pID0+IChub2RlOiB1bmtub3duLCBpbmRleD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHBhcmVudD86IFBhcmVudCB8IG51bGwgfCB1bmRlZmluZWQsIGNvbnRleHQ/OiB1bmtub3duKSA9PiBub2RlIGlzIE5vZGUgJiBDb25kaXRpb24pICYKICAgKiAgICg8Q29uZGl0aW9uIGV4dGVuZHMgVGVzdEZ1bmN0aW9uPih0ZXN0OiBDb25kaXRpb24pID0+IChub2RlOiB1bmtub3duLCBpbmRleD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHBhcmVudD86IFBhcmVudCB8IG51bGwgfCB1bmRlZmluZWQsIGNvbnRleHQ/OiB1bmtub3duKSA9PiBub2RlIGlzIE5vZGUgJiBQcmVkaWNhdGU8Q29uZGl0aW9uLCBOb2RlPikgJgogICAqICAgKCh0ZXN0PzogbnVsbCB8IHVuZGVmaW5lZCkgPT4gKG5vZGU/OiB1bmtub3duLCBpbmRleD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHBhcmVudD86IFBhcmVudCB8IG51bGwgfCB1bmRlZmluZWQsIGNvbnRleHQ/OiB1bmtub3duKSA9PiBub2RlIGlzIE5vZGUpICYKICAgKiAgICgodGVzdD86IFRlc3QpID0+IENoZWNrKQogICAqICl9CiAgICovCiAgLyoqCiAgICogQHBhcmFtIHtUZXN0fSBbdGVzdF0KICAgKiBAcmV0dXJucyB7Q2hlY2t9CiAgICovCiAgLyogQF9fUFVSRV9fICovIF9fbmFtZSgoZnVuY3Rpb24odGVzdCkgewogICAgaWYgKHRlc3QgPT09IG51bGwgfHwgdGVzdCA9PT0gdm9pZCAwKSB7CiAgICAgIHJldHVybiBvazI7CiAgICB9CiAgICBpZiAodHlwZW9mIHRlc3QgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgcmV0dXJuIGNhc3RGYWN0b3J5KHRlc3QpOwogICAgfQogICAgaWYgKHR5cGVvZiB0ZXN0ID09PSAib2JqZWN0IikgewogICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0ZXN0KSA/IGFueUZhY3RvcnkodGVzdCkgOiAoCiAgICAgICAgLy8gQ2FzdCBiZWNhdXNlIGBSZWFkb25seUFycmF5YCBnb2VzIGludG8gdGhlIGFib3ZlIGJ1dCBgaXNBcnJheWAKICAgICAgICAvLyBuYXJyb3dzIHRvIGBBcnJheWAuCiAgICAgICAgcHJvcGVydGllc0ZhY3RvcnkoCiAgICAgICAgICAvKiogQHR5cGUge1Byb3BzfSAqLwogICAgICAgICAgdGVzdAogICAgICAgICkKICAgICAgKTsKICAgIH0KICAgIGlmICh0eXBlb2YgdGVzdCA9PT0gInN0cmluZyIpIHsKICAgICAgcmV0dXJuIHR5cGVGYWN0b3J5KHRlc3QpOwogICAgfQogICAgdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RlZCBmdW5jdGlvbiwgc3RyaW5nLCBvciBvYmplY3QgYXMgdGVzdCIpOwogIH0pLCAiY29udmVydCIpCik7CmZ1bmN0aW9uIGFueUZhY3RvcnkodGVzdHMpIHsKICBjb25zdCBjaGVja3MyID0gW107CiAgbGV0IGluZGV4MiA9IC0xOwogIHdoaWxlICgrK2luZGV4MiA8IHRlc3RzLmxlbmd0aCkgewogICAgY2hlY2tzMltpbmRleDJdID0gY29udmVydCh0ZXN0c1tpbmRleDJdKTsKICB9CiAgcmV0dXJuIGNhc3RGYWN0b3J5KGFueSk7CiAgZnVuY3Rpb24gYW55KC4uLnBhcmFtZXRlcnMpIHsKICAgIGxldCBpbmRleDMgPSAtMTsKICAgIHdoaWxlICgrK2luZGV4MyA8IGNoZWNrczIubGVuZ3RoKSB7CiAgICAgIGlmIChjaGVja3MyW2luZGV4M10uYXBwbHkodGhpcywgcGFyYW1ldGVycykpIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KICBfX25hbWUoYW55LCAiYW55Iik7Cn0KX19uYW1lKGFueUZhY3RvcnksICJhbnlGYWN0b3J5Iik7CmZ1bmN0aW9uIHByb3BlcnRpZXNGYWN0b3J5KGNoZWNrKSB7CiAgY29uc3QgY2hlY2tBc1JlY29yZCA9ICgKICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovCiAgICBjaGVjawogICk7CiAgcmV0dXJuIGNhc3RGYWN0b3J5KGFsbDMpOwogIGZ1bmN0aW9uIGFsbDMobm9kZTIpIHsKICAgIGNvbnN0IG5vZGVBc1JlY29yZCA9ICgKICAgICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8KICAgICAgLyoqIEB0eXBlIHt1bmtub3dufSAqLwogICAgICBub2RlMgogICAgKTsKICAgIGxldCBrZXkyOwogICAgZm9yIChrZXkyIGluIGNoZWNrKSB7CiAgICAgIGlmIChub2RlQXNSZWNvcmRba2V5Ml0gIT09IGNoZWNrQXNSZWNvcmRba2V5Ml0pIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KICBfX25hbWUoYWxsMywgImFsbCIpOwp9Cl9fbmFtZShwcm9wZXJ0aWVzRmFjdG9yeSwgInByb3BlcnRpZXNGYWN0b3J5Iik7CmZ1bmN0aW9uIHR5cGVGYWN0b3J5KGNoZWNrKSB7CiAgcmV0dXJuIGNhc3RGYWN0b3J5KHR5cGU1KTsKICBmdW5jdGlvbiB0eXBlNShub2RlMikgewogICAgcmV0dXJuIG5vZGUyICYmIG5vZGUyLnR5cGUgPT09IGNoZWNrOwogIH0KICBfX25hbWUodHlwZTUsICJ0eXBlIik7Cn0KX19uYW1lKHR5cGVGYWN0b3J5LCAidHlwZUZhY3RvcnkiKTsKZnVuY3Rpb24gY2FzdEZhY3RvcnkodGVzdEZ1bmN0aW9uKSB7CiAgcmV0dXJuIGNoZWNrOwogIGZ1bmN0aW9uIGNoZWNrKHZhbHVlMiwgaW5kZXgyLCBwYXJlbnQpIHsKICAgIHJldHVybiBCb29sZWFuKAogICAgICBsb29rc0xpa2VBTm9kZSh2YWx1ZTIpICYmIHRlc3RGdW5jdGlvbi5jYWxsKAogICAgICAgIHRoaXMsCiAgICAgICAgdmFsdWUyLAogICAgICAgIHR5cGVvZiBpbmRleDIgPT09ICJudW1iZXIiID8gaW5kZXgyIDogdm9pZCAwLAogICAgICAgIHBhcmVudCB8fCB2b2lkIDAKICAgICAgKQogICAgKTsKICB9CiAgX19uYW1lKGNoZWNrLCAiY2hlY2siKTsKfQpfX25hbWUoY2FzdEZhY3RvcnksICJjYXN0RmFjdG9yeSIpOwpmdW5jdGlvbiBvazIoKSB7CiAgcmV0dXJuIHRydWU7Cn0KX19uYW1lKG9rMiwgIm9rIik7CmZ1bmN0aW9uIGxvb2tzTGlrZUFOb2RlKHZhbHVlMikgewogIHJldHVybiB2YWx1ZTIgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlMiA9PT0gIm9iamVjdCIgJiYgInR5cGUiIGluIHZhbHVlMjsKfQpfX25hbWUobG9va3NMaWtlQU5vZGUsICJsb29rc0xpa2VBTm9kZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3VuaXN0LXV0aWwtdmlzaXQtcGFyZW50c0A2LjAuMi9ub2RlX21vZHVsZXMvdW5pc3QtdXRpbC12aXNpdC1wYXJlbnRzL2xpYi9jb2xvci5qcwpmdW5jdGlvbiBjb2xvcihkNCkgewogIHJldHVybiBkNDsKfQpfX25hbWUoY29sb3IsICJjb2xvciIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3VuaXN0LXV0aWwtdmlzaXQtcGFyZW50c0A2LjAuMi9ub2RlX21vZHVsZXMvdW5pc3QtdXRpbC12aXNpdC1wYXJlbnRzL2xpYi9pbmRleC5qcwp2YXIgZW1wdHkyID0gW107CnZhciBDT05USU5VRSA9IHRydWU7CnZhciBFWElUID0gZmFsc2U7CnZhciBTS0lQID0gInNraXAiOwpmdW5jdGlvbiB2aXNpdFBhcmVudHModHJlZSwgdGVzdCwgdmlzaXRvciwgcmV2ZXJzZSkgewogIGxldCBjaGVjazsKICBpZiAodHlwZW9mIHRlc3QgPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIHZpc2l0b3IgIT09ICJmdW5jdGlvbiIpIHsKICAgIHJldmVyc2UgPSB2aXNpdG9yOwogICAgdmlzaXRvciA9IHRlc3Q7CiAgfSBlbHNlIHsKICAgIGNoZWNrID0gdGVzdDsKICB9CiAgY29uc3QgaXMzID0gY29udmVydChjaGVjayk7CiAgY29uc3Qgc3RlcCA9IHJldmVyc2UgPyAtMSA6IDE7CiAgZmFjdG9yeSh0cmVlLCB2b2lkIDAsIFtdKSgpOwogIGZ1bmN0aW9uIGZhY3Rvcnkobm9kZTIsIGluZGV4MiwgcGFyZW50cykgewogICAgY29uc3QgdmFsdWUyID0gKAogICAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLwogICAgICBub2RlMiAmJiB0eXBlb2Ygbm9kZTIgPT09ICJvYmplY3QiID8gbm9kZTIgOiB7fQogICAgKTsKICAgIGlmICh0eXBlb2YgdmFsdWUyLnR5cGUgPT09ICJzdHJpbmciKSB7CiAgICAgIGNvbnN0IG5hbWUgPSAoCiAgICAgICAgLy8gYGhhc3RgCiAgICAgICAgdHlwZW9mIHZhbHVlMi50YWdOYW1lID09PSAic3RyaW5nIiA/IHZhbHVlMi50YWdOYW1lIDogKAogICAgICAgICAgLy8gYHhhc3RgCiAgICAgICAgICB0eXBlb2YgdmFsdWUyLm5hbWUgPT09ICJzdHJpbmciID8gdmFsdWUyLm5hbWUgOiB2b2lkIDAKICAgICAgICApCiAgICAgICk7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2aXNpdDIsICJuYW1lIiwgewogICAgICAgIHZhbHVlOiAibm9kZSAoIiArIGNvbG9yKG5vZGUyLnR5cGUgKyAobmFtZSA/ICI8IiArIG5hbWUgKyAiPiIgOiAiIikpICsgIikiCiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIHZpc2l0MjsKICAgIGZ1bmN0aW9uIHZpc2l0MigpIHsKICAgICAgbGV0IHJlc3VsdCA9IGVtcHR5MjsKICAgICAgbGV0IHN1YnJlc3VsdDsKICAgICAgbGV0IG9mZnNldDsKICAgICAgbGV0IGdyYW5kcGFyZW50czsKICAgICAgaWYgKCF0ZXN0IHx8IGlzMyhub2RlMiwgaW5kZXgyLCBwYXJlbnRzW3BhcmVudHMubGVuZ3RoIC0gMV0gfHwgdm9pZCAwKSkgewogICAgICAgIHJlc3VsdCA9IHRvUmVzdWx0KHZpc2l0b3Iobm9kZTIsIHBhcmVudHMpKTsKICAgICAgICBpZiAocmVzdWx0WzBdID09PSBFWElUKSB7CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoImNoaWxkcmVuIiBpbiBub2RlMiAmJiBub2RlMi5jaGlsZHJlbikgewogICAgICAgIGNvbnN0IG5vZGVBc1BhcmVudCA9ICgKICAgICAgICAgIC8qKiBAdHlwZSB7VW5pc3RQYXJlbnR9ICovCiAgICAgICAgICBub2RlMgogICAgICAgICk7CiAgICAgICAgaWYgKG5vZGVBc1BhcmVudC5jaGlsZHJlbiAmJiByZXN1bHRbMF0gIT09IFNLSVApIHsKICAgICAgICAgIG9mZnNldCA9IChyZXZlcnNlID8gbm9kZUFzUGFyZW50LmNoaWxkcmVuLmxlbmd0aCA6IC0xKSArIHN0ZXA7CiAgICAgICAgICBncmFuZHBhcmVudHMgPSBwYXJlbnRzLmNvbmNhdChub2RlQXNQYXJlbnQpOwogICAgICAgICAgd2hpbGUgKG9mZnNldCA+IC0xICYmIG9mZnNldCA8IG5vZGVBc1BhcmVudC5jaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBub2RlQXNQYXJlbnQuY2hpbGRyZW5bb2Zmc2V0XTsKICAgICAgICAgICAgc3VicmVzdWx0ID0gZmFjdG9yeShjaGlsZCwgb2Zmc2V0LCBncmFuZHBhcmVudHMpKCk7CiAgICAgICAgICAgIGlmIChzdWJyZXN1bHRbMF0gPT09IEVYSVQpIHsKICAgICAgICAgICAgICByZXR1cm4gc3VicmVzdWx0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIG9mZnNldCA9IHR5cGVvZiBzdWJyZXN1bHRbMV0gPT09ICJudW1iZXIiID8gc3VicmVzdWx0WzFdIDogb2Zmc2V0ICsgc3RlcDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIF9fbmFtZSh2aXNpdDIsICJ2aXNpdCIpOwogIH0KICBfX25hbWUoZmFjdG9yeSwgImZhY3RvcnkiKTsKfQpfX25hbWUodmlzaXRQYXJlbnRzLCAidmlzaXRQYXJlbnRzIik7CmZ1bmN0aW9uIHRvUmVzdWx0KHZhbHVlMikgewogIGlmIChBcnJheS5pc0FycmF5KHZhbHVlMikpIHsKICAgIHJldHVybiB2YWx1ZTI7CiAgfQogIGlmICh0eXBlb2YgdmFsdWUyID09PSAibnVtYmVyIikgewogICAgcmV0dXJuIFtDT05USU5VRSwgdmFsdWUyXTsKICB9CiAgcmV0dXJuIHZhbHVlMiA9PT0gbnVsbCB8fCB2YWx1ZTIgPT09IHZvaWQgMCA/IGVtcHR5MiA6IFt2YWx1ZTJdOwp9Cl9fbmFtZSh0b1Jlc3VsdCwgInRvUmVzdWx0Iik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC1maW5kLWFuZC1yZXBsYWNlQDMuMC4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLWZpbmQtYW5kLXJlcGxhY2UvbGliL2luZGV4LmpzCmZ1bmN0aW9uIGZpbmRBbmRSZXBsYWNlKHRyZWUsIGxpc3Q1LCBvcHRpb25zKSB7CiAgY29uc3Qgc2V0dGluZ3MgPSBvcHRpb25zIHx8IHt9OwogIGNvbnN0IGlnbm9yZWQgPSBjb252ZXJ0KHNldHRpbmdzLmlnbm9yZSB8fCBbXSk7CiAgY29uc3QgcGFpcnMyID0gdG9QYWlycyhsaXN0NSk7CiAgbGV0IHBhaXJJbmRleCA9IC0xOwogIHdoaWxlICgrK3BhaXJJbmRleCA8IHBhaXJzMi5sZW5ndGgpIHsKICAgIHZpc2l0UGFyZW50cyh0cmVlLCAidGV4dCIsIHZpc2l0b3IpOwogIH0KICBmdW5jdGlvbiB2aXNpdG9yKG5vZGUyLCBwYXJlbnRzKSB7CiAgICBsZXQgaW5kZXgyID0gLTE7CiAgICBsZXQgZ3JhbmRwYXJlbnQ7CiAgICB3aGlsZSAoKytpbmRleDIgPCBwYXJlbnRzLmxlbmd0aCkgewogICAgICBjb25zdCBwYXJlbnQgPSBwYXJlbnRzW2luZGV4Ml07CiAgICAgIGNvbnN0IHNpYmxpbmdzMiA9IGdyYW5kcGFyZW50ID8gZ3JhbmRwYXJlbnQuY2hpbGRyZW4gOiB2b2lkIDA7CiAgICAgIGlmIChpZ25vcmVkKAogICAgICAgIHBhcmVudCwKICAgICAgICBzaWJsaW5nczIgPyBzaWJsaW5nczIuaW5kZXhPZihwYXJlbnQpIDogdm9pZCAwLAogICAgICAgIGdyYW5kcGFyZW50CiAgICAgICkpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgZ3JhbmRwYXJlbnQgPSBwYXJlbnQ7CiAgICB9CiAgICBpZiAoZ3JhbmRwYXJlbnQpIHsKICAgICAgcmV0dXJuIGhhbmRsZXIyKG5vZGUyLCBwYXJlbnRzKTsKICAgIH0KICB9CiAgX19uYW1lKHZpc2l0b3IsICJ2aXNpdG9yIik7CiAgZnVuY3Rpb24gaGFuZGxlcjIobm9kZTIsIHBhcmVudHMpIHsKICAgIGNvbnN0IHBhcmVudCA9IHBhcmVudHNbcGFyZW50cy5sZW5ndGggLSAxXTsKICAgIGNvbnN0IGZpbmQzID0gcGFpcnMyW3BhaXJJbmRleF1bMF07CiAgICBjb25zdCByZXBsYWNlMyA9IHBhaXJzMltwYWlySW5kZXhdWzFdOwogICAgbGV0IHN0YXJ0ID0gMDsKICAgIGNvbnN0IHNpYmxpbmdzMiA9IHBhcmVudC5jaGlsZHJlbjsKICAgIGNvbnN0IGluZGV4MiA9IHNpYmxpbmdzMi5pbmRleE9mKG5vZGUyKTsKICAgIGxldCBjaGFuZ2UgPSBmYWxzZTsKICAgIGxldCBub2RlcyA9IFtdOwogICAgZmluZDMubGFzdEluZGV4ID0gMDsKICAgIGxldCBtYXRjaDIgPSBmaW5kMy5leGVjKG5vZGUyLnZhbHVlKTsKICAgIHdoaWxlIChtYXRjaDIpIHsKICAgICAgY29uc3QgcG9zaXRpb24zID0gbWF0Y2gyLmluZGV4OwogICAgICBjb25zdCBtYXRjaE9iamVjdCA9IHsKICAgICAgICBpbmRleDogbWF0Y2gyLmluZGV4LAogICAgICAgIGlucHV0OiBtYXRjaDIuaW5wdXQsCiAgICAgICAgc3RhY2s6IFsuLi5wYXJlbnRzLCBub2RlMl0KICAgICAgfTsKICAgICAgbGV0IHZhbHVlMiA9IHJlcGxhY2UzKC4uLm1hdGNoMiwgbWF0Y2hPYmplY3QpOwogICAgICBpZiAodHlwZW9mIHZhbHVlMiA9PT0gInN0cmluZyIpIHsKICAgICAgICB2YWx1ZTIgPSB2YWx1ZTIubGVuZ3RoID4gMCA/IHsgdHlwZTogInRleHQiLCB2YWx1ZTogdmFsdWUyIH0gOiB2b2lkIDA7CiAgICAgIH0KICAgICAgaWYgKHZhbHVlMiA9PT0gZmFsc2UpIHsKICAgICAgICBmaW5kMy5sYXN0SW5kZXggPSBwb3NpdGlvbjMgKyAxOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChzdGFydCAhPT0gcG9zaXRpb24zKSB7CiAgICAgICAgICBub2Rlcy5wdXNoKHsKICAgICAgICAgICAgdHlwZTogInRleHQiLAogICAgICAgICAgICB2YWx1ZTogbm9kZTIudmFsdWUuc2xpY2Uoc3RhcnQsIHBvc2l0aW9uMykKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZTIpKSB7CiAgICAgICAgICBub2Rlcy5wdXNoKC4uLnZhbHVlMik7CiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZTIpIHsKICAgICAgICAgIG5vZGVzLnB1c2godmFsdWUyKTsKICAgICAgICB9CiAgICAgICAgc3RhcnQgPSBwb3NpdGlvbjMgKyBtYXRjaDJbMF0ubGVuZ3RoOwogICAgICAgIGNoYW5nZSA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKCFmaW5kMy5nbG9iYWwpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBtYXRjaDIgPSBmaW5kMy5leGVjKG5vZGUyLnZhbHVlKTsKICAgIH0KICAgIGlmIChjaGFuZ2UpIHsKICAgICAgaWYgKHN0YXJ0IDwgbm9kZTIudmFsdWUubGVuZ3RoKSB7CiAgICAgICAgbm9kZXMucHVzaCh7IHR5cGU6ICJ0ZXh0IiwgdmFsdWU6IG5vZGUyLnZhbHVlLnNsaWNlKHN0YXJ0KSB9KTsKICAgICAgfQogICAgICBwYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4MiwgMSwgLi4ubm9kZXMpOwogICAgfSBlbHNlIHsKICAgICAgbm9kZXMgPSBbbm9kZTJdOwogICAgfQogICAgcmV0dXJuIGluZGV4MiArIG5vZGVzLmxlbmd0aDsKICB9CiAgX19uYW1lKGhhbmRsZXIyLCAiaGFuZGxlciIpOwp9Cl9fbmFtZShmaW5kQW5kUmVwbGFjZSwgImZpbmRBbmRSZXBsYWNlIik7CmZ1bmN0aW9uIHRvUGFpcnModHVwbGVPckxpc3QpIHsKICBjb25zdCByZXN1bHQgPSBbXTsKICBpZiAoIUFycmF5LmlzQXJyYXkodHVwbGVPckxpc3QpKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJFeHBlY3RlZCBmaW5kIGFuZCByZXBsYWNlIHR1cGxlIG9yIGxpc3Qgb2YgdHVwbGVzIik7CiAgfQogIGNvbnN0IGxpc3Q1ID0gIXR1cGxlT3JMaXN0WzBdIHx8IEFycmF5LmlzQXJyYXkodHVwbGVPckxpc3RbMF0pID8gdHVwbGVPckxpc3QgOiBbdHVwbGVPckxpc3RdOwogIGxldCBpbmRleDIgPSAtMTsKICB3aGlsZSAoKytpbmRleDIgPCBsaXN0NS5sZW5ndGgpIHsKICAgIGNvbnN0IHR1cGxlID0gbGlzdDVbaW5kZXgyXTsKICAgIHJlc3VsdC5wdXNoKFt0b0V4cHJlc3Npb24odHVwbGVbMF0pLCB0b0Z1bmN0aW9uKHR1cGxlWzFdKV0pOwogIH0KICByZXR1cm4gcmVzdWx0Owp9Cl9fbmFtZSh0b1BhaXJzLCAidG9QYWlycyIpOwpmdW5jdGlvbiB0b0V4cHJlc3Npb24oZmluZDMpIHsKICByZXR1cm4gdHlwZW9mIGZpbmQzID09PSAic3RyaW5nIiA/IG5ldyBSZWdFeHAoZXNjYXBlU3RyaW5nUmVnZXhwKGZpbmQzKSwgImciKSA6IGZpbmQzOwp9Cl9fbmFtZSh0b0V4cHJlc3Npb24sICJ0b0V4cHJlc3Npb24iKTsKZnVuY3Rpb24gdG9GdW5jdGlvbihyZXBsYWNlMykgewogIHJldHVybiB0eXBlb2YgcmVwbGFjZTMgPT09ICJmdW5jdGlvbiIgPyByZXBsYWNlMyA6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHJlcGxhY2UzOwogIH07Cn0KX19uYW1lKHRvRnVuY3Rpb24sICJ0b0Z1bmN0aW9uIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC1nZm0tYXV0b2xpbmstbGl0ZXJhbEAyLjAuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1nZm0tYXV0b2xpbmstbGl0ZXJhbC9saWIvaW5kZXguanMKdmFyIGluQ29uc3RydWN0ID0gInBocmFzaW5nIjsKdmFyIG5vdEluQ29uc3RydWN0ID0gWyJhdXRvbGluayIsICJsaW5rIiwgImltYWdlIiwgImxhYmVsIl07CmZ1bmN0aW9uIGdmbUF1dG9saW5rTGl0ZXJhbEZyb21NYXJrZG93bigpIHsKICByZXR1cm4gewogICAgdHJhbnNmb3JtczogW3RyYW5zZm9ybUdmbUF1dG9saW5rTGl0ZXJhbHNdLAogICAgZW50ZXI6IHsKICAgICAgbGl0ZXJhbEF1dG9saW5rOiBlbnRlckxpdGVyYWxBdXRvbGluaywKICAgICAgbGl0ZXJhbEF1dG9saW5rRW1haWw6IGVudGVyTGl0ZXJhbEF1dG9saW5rVmFsdWUsCiAgICAgIGxpdGVyYWxBdXRvbGlua0h0dHA6IGVudGVyTGl0ZXJhbEF1dG9saW5rVmFsdWUsCiAgICAgIGxpdGVyYWxBdXRvbGlua1d3dzogZW50ZXJMaXRlcmFsQXV0b2xpbmtWYWx1ZQogICAgfSwKICAgIGV4aXQ6IHsKICAgICAgbGl0ZXJhbEF1dG9saW5rOiBleGl0TGl0ZXJhbEF1dG9saW5rLAogICAgICBsaXRlcmFsQXV0b2xpbmtFbWFpbDogZXhpdExpdGVyYWxBdXRvbGlua0VtYWlsLAogICAgICBsaXRlcmFsQXV0b2xpbmtIdHRwOiBleGl0TGl0ZXJhbEF1dG9saW5rSHR0cCwKICAgICAgbGl0ZXJhbEF1dG9saW5rV3d3OiBleGl0TGl0ZXJhbEF1dG9saW5rV3d3CiAgICB9CiAgfTsKfQpfX25hbWUoZ2ZtQXV0b2xpbmtMaXRlcmFsRnJvbU1hcmtkb3duLCAiZ2ZtQXV0b2xpbmtMaXRlcmFsRnJvbU1hcmtkb3duIik7CmZ1bmN0aW9uIGdmbUF1dG9saW5rTGl0ZXJhbFRvTWFya2Rvd24oKSB7CiAgcmV0dXJuIHsKICAgIHVuc2FmZTogWwogICAgICB7CiAgICAgICAgY2hhcmFjdGVyOiAiQCIsCiAgICAgICAgYmVmb3JlOiAiWytcXC0uXFx3XSIsCiAgICAgICAgYWZ0ZXI6ICJbXFwtLlxcd10iLAogICAgICAgIGluQ29uc3RydWN0LAogICAgICAgIG5vdEluQ29uc3RydWN0CiAgICAgIH0sCiAgICAgIHsKICAgICAgICBjaGFyYWN0ZXI6ICIuIiwKICAgICAgICBiZWZvcmU6ICJbV3ddIiwKICAgICAgICBhZnRlcjogIltcXC0uXFx3XSIsCiAgICAgICAgaW5Db25zdHJ1Y3QsCiAgICAgICAgbm90SW5Db25zdHJ1Y3QKICAgICAgfSwKICAgICAgewogICAgICAgIGNoYXJhY3RlcjogIjoiLAogICAgICAgIGJlZm9yZTogIltwc10iLAogICAgICAgIGFmdGVyOiAiXFwvIiwKICAgICAgICBpbkNvbnN0cnVjdCwKICAgICAgICBub3RJbkNvbnN0cnVjdAogICAgICB9CiAgICBdCiAgfTsKfQpfX25hbWUoZ2ZtQXV0b2xpbmtMaXRlcmFsVG9NYXJrZG93biwgImdmbUF1dG9saW5rTGl0ZXJhbFRvTWFya2Rvd24iKTsKZnVuY3Rpb24gZW50ZXJMaXRlcmFsQXV0b2xpbmsodG9rZW4pIHsKICB0aGlzLmVudGVyKHsgdHlwZTogImxpbmsiLCB0aXRsZTogbnVsbCwgdXJsOiAiIiwgY2hpbGRyZW46IFtdIH0sIHRva2VuKTsKfQpfX25hbWUoZW50ZXJMaXRlcmFsQXV0b2xpbmssICJlbnRlckxpdGVyYWxBdXRvbGluayIpOwpmdW5jdGlvbiBlbnRlckxpdGVyYWxBdXRvbGlua1ZhbHVlKHRva2VuKSB7CiAgdGhpcy5jb25maWcuZW50ZXIuYXV0b2xpbmtQcm90b2NvbC5jYWxsKHRoaXMsIHRva2VuKTsKfQpfX25hbWUoZW50ZXJMaXRlcmFsQXV0b2xpbmtWYWx1ZSwgImVudGVyTGl0ZXJhbEF1dG9saW5rVmFsdWUiKTsKZnVuY3Rpb24gZXhpdExpdGVyYWxBdXRvbGlua0h0dHAodG9rZW4pIHsKICB0aGlzLmNvbmZpZy5leGl0LmF1dG9saW5rUHJvdG9jb2wuY2FsbCh0aGlzLCB0b2tlbik7Cn0KX19uYW1lKGV4aXRMaXRlcmFsQXV0b2xpbmtIdHRwLCAiZXhpdExpdGVyYWxBdXRvbGlua0h0dHAiKTsKZnVuY3Rpb24gZXhpdExpdGVyYWxBdXRvbGlua1d3dyh0b2tlbikgewogIHRoaXMuY29uZmlnLmV4aXQuZGF0YS5jYWxsKHRoaXMsIHRva2VuKTsKICBjb25zdCBub2RlMiA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTsKICBvayhub2RlMi50eXBlID09PSAibGluayIpOwogIG5vZGUyLnVybCA9ICJodHRwOi8vIiArIHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pOwp9Cl9fbmFtZShleGl0TGl0ZXJhbEF1dG9saW5rV3d3LCAiZXhpdExpdGVyYWxBdXRvbGlua1d3dyIpOwpmdW5jdGlvbiBleGl0TGl0ZXJhbEF1dG9saW5rRW1haWwodG9rZW4pIHsKICB0aGlzLmNvbmZpZy5leGl0LmF1dG9saW5rRW1haWwuY2FsbCh0aGlzLCB0b2tlbik7Cn0KX19uYW1lKGV4aXRMaXRlcmFsQXV0b2xpbmtFbWFpbCwgImV4aXRMaXRlcmFsQXV0b2xpbmtFbWFpbCIpOwpmdW5jdGlvbiBleGl0TGl0ZXJhbEF1dG9saW5rKHRva2VuKSB7CiAgdGhpcy5leGl0KHRva2VuKTsKfQpfX25hbWUoZXhpdExpdGVyYWxBdXRvbGluaywgImV4aXRMaXRlcmFsQXV0b2xpbmsiKTsKZnVuY3Rpb24gdHJhbnNmb3JtR2ZtQXV0b2xpbmtMaXRlcmFscyh0cmVlKSB7CiAgZmluZEFuZFJlcGxhY2UoCiAgICB0cmVlLAogICAgWwogICAgICBbLyhodHRwcz86XC9cL3x3d3coPz1cLikpKFstLlx3XSspKFteIFx0XHJcbl0qKS9naSwgZmluZFVybF0sCiAgICAgIFsvKD88PV58XHN8XHB7UH18XHB7U30pKFstLlx3K10rKUAoWy1cd10rKD86XC5bLVx3XSspKykvZ3UsIGZpbmRFbWFpbF0KICAgIF0sCiAgICB7IGlnbm9yZTogWyJsaW5rIiwgImxpbmtSZWZlcmVuY2UiXSB9CiAgKTsKfQpfX25hbWUodHJhbnNmb3JtR2ZtQXV0b2xpbmtMaXRlcmFscywgInRyYW5zZm9ybUdmbUF1dG9saW5rTGl0ZXJhbHMiKTsKZnVuY3Rpb24gZmluZFVybChfMywgcHJvdG9jb2wsIGRvbWFpbjIsIHBhdGgyLCBtYXRjaDIpIHsKICBsZXQgcHJlZml4ID0gIiI7CiAgaWYgKCFwcmV2aW91cyhtYXRjaDIpKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGlmICgvXncvaS50ZXN0KHByb3RvY29sKSkgewogICAgZG9tYWluMiA9IHByb3RvY29sICsgZG9tYWluMjsKICAgIHByb3RvY29sID0gIiI7CiAgICBwcmVmaXggPSAiaHR0cDovLyI7CiAgfQogIGlmICghaXNDb3JyZWN0RG9tYWluKGRvbWFpbjIpKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGNvbnN0IHBhcnRzID0gc3BsaXRVcmwoZG9tYWluMiArIHBhdGgyKTsKICBpZiAoIXBhcnRzWzBdKSByZXR1cm4gZmFsc2U7CiAgY29uc3QgcmVzdWx0ID0gewogICAgdHlwZTogImxpbmsiLAogICAgdGl0bGU6IG51bGwsCiAgICB1cmw6IHByZWZpeCArIHByb3RvY29sICsgcGFydHNbMF0sCiAgICBjaGlsZHJlbjogW3sgdHlwZTogInRleHQiLCB2YWx1ZTogcHJvdG9jb2wgKyBwYXJ0c1swXSB9XQogIH07CiAgaWYgKHBhcnRzWzFdKSB7CiAgICByZXR1cm4gW3Jlc3VsdCwgeyB0eXBlOiAidGV4dCIsIHZhbHVlOiBwYXJ0c1sxXSB9XTsKICB9CiAgcmV0dXJuIHJlc3VsdDsKfQpfX25hbWUoZmluZFVybCwgImZpbmRVcmwiKTsKZnVuY3Rpb24gZmluZEVtYWlsKF8zLCBhdGV4dCwgbGFiZWwsIG1hdGNoMikgewogIGlmICgKICAgIC8vIE5vdCBhbiBleHBlY3RlZCBwcmV2aW91cyBjaGFyYWN0ZXIuCiAgICAhcHJldmlvdXMobWF0Y2gyLCB0cnVlKSB8fCAvLyBMYWJlbCBlbmRzIGluIG5vdCBhbGxvd2VkIGNoYXJhY3Rlci4KICAgIC9bLVxkX10kLy50ZXN0KGxhYmVsKQogICkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICByZXR1cm4gewogICAgdHlwZTogImxpbmsiLAogICAgdGl0bGU6IG51bGwsCiAgICB1cmw6ICJtYWlsdG86IiArIGF0ZXh0ICsgIkAiICsgbGFiZWwsCiAgICBjaGlsZHJlbjogW3sgdHlwZTogInRleHQiLCB2YWx1ZTogYXRleHQgKyAiQCIgKyBsYWJlbCB9XQogIH07Cn0KX19uYW1lKGZpbmRFbWFpbCwgImZpbmRFbWFpbCIpOwpmdW5jdGlvbiBpc0NvcnJlY3REb21haW4oZG9tYWluMikgewogIGNvbnN0IHBhcnRzID0gZG9tYWluMi5zcGxpdCgiLiIpOwogIGlmIChwYXJ0cy5sZW5ndGggPCAyIHx8IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdICYmICgvXy8udGVzdChwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXSkgfHwgIS9bYS16QS1aXGRdLy50ZXN0KHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdKSkgfHwgcGFydHNbcGFydHMubGVuZ3RoIC0gMl0gJiYgKC9fLy50ZXN0KHBhcnRzW3BhcnRzLmxlbmd0aCAtIDJdKSB8fCAhL1thLXpBLVpcZF0vLnRlc3QocGFydHNbcGFydHMubGVuZ3RoIC0gMl0pKSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICByZXR1cm4gdHJ1ZTsKfQpfX25hbWUoaXNDb3JyZWN0RG9tYWluLCAiaXNDb3JyZWN0RG9tYWluIik7CmZ1bmN0aW9uIHNwbGl0VXJsKHVybCkgewogIGNvbnN0IHRyYWlsRXhlYyA9IC9bISImJyksLjo7PD4/XF19XSskLy5leGVjKHVybCk7CiAgaWYgKCF0cmFpbEV4ZWMpIHsKICAgIHJldHVybiBbdXJsLCB2b2lkIDBdOwogIH0KICB1cmwgPSB1cmwuc2xpY2UoMCwgdHJhaWxFeGVjLmluZGV4KTsKICBsZXQgdHJhaWwyID0gdHJhaWxFeGVjWzBdOwogIGxldCBjbG9zaW5nUGFyZW5JbmRleCA9IHRyYWlsMi5pbmRleE9mKCIpIik7CiAgY29uc3Qgb3BlbmluZ1BhcmVucyA9IGNjb3VudCh1cmwsICIoIik7CiAgbGV0IGNsb3NpbmdQYXJlbnMgPSBjY291bnQodXJsLCAiKSIpOwogIHdoaWxlIChjbG9zaW5nUGFyZW5JbmRleCAhPT0gLTEgJiYgb3BlbmluZ1BhcmVucyA+IGNsb3NpbmdQYXJlbnMpIHsKICAgIHVybCArPSB0cmFpbDIuc2xpY2UoMCwgY2xvc2luZ1BhcmVuSW5kZXggKyAxKTsKICAgIHRyYWlsMiA9IHRyYWlsMi5zbGljZShjbG9zaW5nUGFyZW5JbmRleCArIDEpOwogICAgY2xvc2luZ1BhcmVuSW5kZXggPSB0cmFpbDIuaW5kZXhPZigiKSIpOwogICAgY2xvc2luZ1BhcmVucysrOwogIH0KICByZXR1cm4gW3VybCwgdHJhaWwyXTsKfQpfX25hbWUoc3BsaXRVcmwsICJzcGxpdFVybCIpOwpmdW5jdGlvbiBwcmV2aW91cyhtYXRjaDIsIGVtYWlsKSB7CiAgY29uc3QgY29kZTQgPSBtYXRjaDIuaW5wdXQuY2hhckNvZGVBdChtYXRjaDIuaW5kZXggLSAxKTsKICByZXR1cm4gKG1hdGNoMi5pbmRleCA9PT0gMCB8fCB1bmljb2RlV2hpdGVzcGFjZShjb2RlNCkgfHwgdW5pY29kZVB1bmN0dWF0aW9uKGNvZGU0KSkgJiYgLy8gSWYgaXTigJlzIGFuIGVtYWlsLCB0aGUgcHJldmlvdXMgY2hhcmFjdGVyIHNob3VsZCBub3QgYmUgYSBzbGFzaC4KICAoIWVtYWlsIHx8IGNvZGU0ICE9PSA0Nyk7Cn0KX19uYW1lKHByZXZpb3VzLCAicHJldmlvdXMiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstdXRpbC1ub3JtYWxpemUtaWRlbnRpZmllckAyLjAuMS9ub2RlX21vZHVsZXMvbWljcm9tYXJrLXV0aWwtbm9ybWFsaXplLWlkZW50aWZpZXIvaW5kZXguanMKZnVuY3Rpb24gbm9ybWFsaXplSWRlbnRpZmllcih2YWx1ZTIpIHsKICByZXR1cm4gdmFsdWUyLnJlcGxhY2UoL1tcdFxuXHIgXSsvZywgIiAiKS5yZXBsYWNlKC9eIHwgJC9nLCAiIikudG9Mb3dlckNhc2UoKS50b1VwcGVyQ2FzZSgpOwp9Cl9fbmFtZShub3JtYWxpemVJZGVudGlmaWVyLCAibm9ybWFsaXplSWRlbnRpZmllciIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtZ2ZtLWZvb3Rub3RlQDIuMS4wL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLWdmbS1mb290bm90ZS9saWIvaW5kZXguanMKZm9vdG5vdGVSZWZlcmVuY2UucGVlayA9IGZvb3Rub3RlUmVmZXJlbmNlUGVlazsKZnVuY3Rpb24gZW50ZXJGb290bm90ZUNhbGxTdHJpbmcoKSB7CiAgdGhpcy5idWZmZXIoKTsKfQpfX25hbWUoZW50ZXJGb290bm90ZUNhbGxTdHJpbmcsICJlbnRlckZvb3Rub3RlQ2FsbFN0cmluZyIpOwpmdW5jdGlvbiBlbnRlckZvb3Rub3RlQ2FsbCh0b2tlbikgewogIHRoaXMuZW50ZXIoeyB0eXBlOiAiZm9vdG5vdGVSZWZlcmVuY2UiLCBpZGVudGlmaWVyOiAiIiwgbGFiZWw6ICIiIH0sIHRva2VuKTsKfQpfX25hbWUoZW50ZXJGb290bm90ZUNhbGwsICJlbnRlckZvb3Rub3RlQ2FsbCIpOwpmdW5jdGlvbiBlbnRlckZvb3Rub3RlRGVmaW5pdGlvbkxhYmVsU3RyaW5nKCkgewogIHRoaXMuYnVmZmVyKCk7Cn0KX19uYW1lKGVudGVyRm9vdG5vdGVEZWZpbml0aW9uTGFiZWxTdHJpbmcsICJlbnRlckZvb3Rub3RlRGVmaW5pdGlvbkxhYmVsU3RyaW5nIik7CmZ1bmN0aW9uIGVudGVyRm9vdG5vdGVEZWZpbml0aW9uKHRva2VuKSB7CiAgdGhpcy5lbnRlcigKICAgIHsgdHlwZTogImZvb3Rub3RlRGVmaW5pdGlvbiIsIGlkZW50aWZpZXI6ICIiLCBsYWJlbDogIiIsIGNoaWxkcmVuOiBbXSB9LAogICAgdG9rZW4KICApOwp9Cl9fbmFtZShlbnRlckZvb3Rub3RlRGVmaW5pdGlvbiwgImVudGVyRm9vdG5vdGVEZWZpbml0aW9uIik7CmZ1bmN0aW9uIGV4aXRGb290bm90ZUNhbGxTdHJpbmcodG9rZW4pIHsKICBjb25zdCBsYWJlbCA9IHRoaXMucmVzdW1lKCk7CiAgY29uc3Qgbm9kZTIgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgb2sobm9kZTIudHlwZSA9PT0gImZvb3Rub3RlUmVmZXJlbmNlIik7CiAgbm9kZTIuaWRlbnRpZmllciA9IG5vcm1hbGl6ZUlkZW50aWZpZXIoCiAgICB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKQogICkudG9Mb3dlckNhc2UoKTsKICBub2RlMi5sYWJlbCA9IGxhYmVsOwp9Cl9fbmFtZShleGl0Rm9vdG5vdGVDYWxsU3RyaW5nLCAiZXhpdEZvb3Rub3RlQ2FsbFN0cmluZyIpOwpmdW5jdGlvbiBleGl0Rm9vdG5vdGVDYWxsKHRva2VuKSB7CiAgdGhpcy5leGl0KHRva2VuKTsKfQpfX25hbWUoZXhpdEZvb3Rub3RlQ2FsbCwgImV4aXRGb290bm90ZUNhbGwiKTsKZnVuY3Rpb24gZXhpdEZvb3Rub3RlRGVmaW5pdGlvbkxhYmVsU3RyaW5nKHRva2VuKSB7CiAgY29uc3QgbGFiZWwgPSB0aGlzLnJlc3VtZSgpOwogIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogIG9rKG5vZGUyLnR5cGUgPT09ICJmb290bm90ZURlZmluaXRpb24iKTsKICBub2RlMi5pZGVudGlmaWVyID0gbm9ybWFsaXplSWRlbnRpZmllcigKICAgIHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pCiAgKS50b0xvd2VyQ2FzZSgpOwogIG5vZGUyLmxhYmVsID0gbGFiZWw7Cn0KX19uYW1lKGV4aXRGb290bm90ZURlZmluaXRpb25MYWJlbFN0cmluZywgImV4aXRGb290bm90ZURlZmluaXRpb25MYWJlbFN0cmluZyIpOwpmdW5jdGlvbiBleGl0Rm9vdG5vdGVEZWZpbml0aW9uKHRva2VuKSB7CiAgdGhpcy5leGl0KHRva2VuKTsKfQpfX25hbWUoZXhpdEZvb3Rub3RlRGVmaW5pdGlvbiwgImV4aXRGb290bm90ZURlZmluaXRpb24iKTsKZnVuY3Rpb24gZm9vdG5vdGVSZWZlcmVuY2VQZWVrKCkgewogIHJldHVybiAiWyI7Cn0KX19uYW1lKGZvb3Rub3RlUmVmZXJlbmNlUGVlaywgImZvb3Rub3RlUmVmZXJlbmNlUGVlayIpOwpmdW5jdGlvbiBmb290bm90ZVJlZmVyZW5jZShub2RlMiwgXzMsIHN0YXRlLCBpbmZvKSB7CiAgY29uc3QgdHJhY2tlciA9IHN0YXRlLmNyZWF0ZVRyYWNrZXIoaW5mbyk7CiAgbGV0IHZhbHVlMiA9IHRyYWNrZXIubW92ZSgiW14iKTsKICBjb25zdCBleGl0MyA9IHN0YXRlLmVudGVyKCJmb290bm90ZVJlZmVyZW5jZSIpOwogIGNvbnN0IHN1YmV4aXQgPSBzdGF0ZS5lbnRlcigicmVmZXJlbmNlIik7CiAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgKICAgIHN0YXRlLnNhZmUoc3RhdGUuYXNzb2NpYXRpb25JZChub2RlMiksIHsgYWZ0ZXI6ICJdIiwgYmVmb3JlOiB2YWx1ZTIgfSkKICApOwogIHN1YmV4aXQoKTsKICBleGl0MygpOwogIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoIl0iKTsKICByZXR1cm4gdmFsdWUyOwp9Cl9fbmFtZShmb290bm90ZVJlZmVyZW5jZSwgImZvb3Rub3RlUmVmZXJlbmNlIik7CmZ1bmN0aW9uIGdmbUZvb3Rub3RlRnJvbU1hcmtkb3duKCkgewogIHJldHVybiB7CiAgICBlbnRlcjogewogICAgICBnZm1Gb290bm90ZUNhbGxTdHJpbmc6IGVudGVyRm9vdG5vdGVDYWxsU3RyaW5nLAogICAgICBnZm1Gb290bm90ZUNhbGw6IGVudGVyRm9vdG5vdGVDYWxsLAogICAgICBnZm1Gb290bm90ZURlZmluaXRpb25MYWJlbFN0cmluZzogZW50ZXJGb290bm90ZURlZmluaXRpb25MYWJlbFN0cmluZywKICAgICAgZ2ZtRm9vdG5vdGVEZWZpbml0aW9uOiBlbnRlckZvb3Rub3RlRGVmaW5pdGlvbgogICAgfSwKICAgIGV4aXQ6IHsKICAgICAgZ2ZtRm9vdG5vdGVDYWxsU3RyaW5nOiBleGl0Rm9vdG5vdGVDYWxsU3RyaW5nLAogICAgICBnZm1Gb290bm90ZUNhbGw6IGV4aXRGb290bm90ZUNhbGwsCiAgICAgIGdmbUZvb3Rub3RlRGVmaW5pdGlvbkxhYmVsU3RyaW5nOiBleGl0Rm9vdG5vdGVEZWZpbml0aW9uTGFiZWxTdHJpbmcsCiAgICAgIGdmbUZvb3Rub3RlRGVmaW5pdGlvbjogZXhpdEZvb3Rub3RlRGVmaW5pdGlvbgogICAgfQogIH07Cn0KX19uYW1lKGdmbUZvb3Rub3RlRnJvbU1hcmtkb3duLCAiZ2ZtRm9vdG5vdGVGcm9tTWFya2Rvd24iKTsKZnVuY3Rpb24gZ2ZtRm9vdG5vdGVUb01hcmtkb3duKG9wdGlvbnMpIHsKICBsZXQgZmlyc3RMaW5lQmxhbmsgPSBmYWxzZTsKICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmZpcnN0TGluZUJsYW5rKSB7CiAgICBmaXJzdExpbmVCbGFuayA9IHRydWU7CiAgfQogIHJldHVybiB7CiAgICBoYW5kbGVyczogeyBmb290bm90ZURlZmluaXRpb24sIGZvb3Rub3RlUmVmZXJlbmNlIH0sCiAgICAvLyBUaGlzIGlzIG9uIGJ5IGRlZmF1bHQgYWxyZWFkeS4KICAgIHVuc2FmZTogW3sgY2hhcmFjdGVyOiAiWyIsIGluQ29uc3RydWN0OiBbImxhYmVsIiwgInBocmFzaW5nIiwgInJlZmVyZW5jZSJdIH1dCiAgfTsKICBmdW5jdGlvbiBmb290bm90ZURlZmluaXRpb24obm9kZTIsIF8zLCBzdGF0ZSwgaW5mbykgewogICAgY29uc3QgdHJhY2tlciA9IHN0YXRlLmNyZWF0ZVRyYWNrZXIoaW5mbyk7CiAgICBsZXQgdmFsdWUyID0gdHJhY2tlci5tb3ZlKCJbXiIpOwogICAgY29uc3QgZXhpdDMgPSBzdGF0ZS5lbnRlcigiZm9vdG5vdGVEZWZpbml0aW9uIik7CiAgICBjb25zdCBzdWJleGl0ID0gc3RhdGUuZW50ZXIoImxhYmVsIik7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKAogICAgICBzdGF0ZS5zYWZlKHN0YXRlLmFzc29jaWF0aW9uSWQobm9kZTIpLCB7IGJlZm9yZTogdmFsdWUyLCBhZnRlcjogIl0iIH0pCiAgICApOwogICAgc3ViZXhpdCgpOwogICAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgiXToiKTsKICAgIGlmIChub2RlMi5jaGlsZHJlbiAmJiBub2RlMi5jaGlsZHJlbi5sZW5ndGggPiAwKSB7CiAgICAgIHRyYWNrZXIuc2hpZnQoNCk7CiAgICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoCiAgICAgICAgKGZpcnN0TGluZUJsYW5rID8gIlxuIiA6ICIgIikgKyBzdGF0ZS5pbmRlbnRMaW5lcygKICAgICAgICAgIHN0YXRlLmNvbnRhaW5lckZsb3cobm9kZTIsIHRyYWNrZXIuY3VycmVudCgpKSwKICAgICAgICAgIGZpcnN0TGluZUJsYW5rID8gbWFwQWxsIDogbWFwRXhjZXB0Rmlyc3QKICAgICAgICApCiAgICAgICk7CiAgICB9CiAgICBleGl0MygpOwogICAgcmV0dXJuIHZhbHVlMjsKICB9CiAgX19uYW1lKGZvb3Rub3RlRGVmaW5pdGlvbiwgImZvb3Rub3RlRGVmaW5pdGlvbiIpOwp9Cl9fbmFtZShnZm1Gb290bm90ZVRvTWFya2Rvd24sICJnZm1Gb290bm90ZVRvTWFya2Rvd24iKTsKZnVuY3Rpb24gbWFwRXhjZXB0Rmlyc3QobGluZSwgaW5kZXgyLCBibGFuaykgewogIHJldHVybiBpbmRleDIgPT09IDAgPyBsaW5lIDogbWFwQWxsKGxpbmUsIGluZGV4MiwgYmxhbmspOwp9Cl9fbmFtZShtYXBFeGNlcHRGaXJzdCwgIm1hcEV4Y2VwdEZpcnN0Iik7CmZ1bmN0aW9uIG1hcEFsbChsaW5lLCBpbmRleDIsIGJsYW5rKSB7CiAgcmV0dXJuIChibGFuayA/ICIiIDogIiAgICAiKSArIGxpbmU7Cn0KX19uYW1lKG1hcEFsbCwgIm1hcEFsbCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtZ2ZtLXN0cmlrZXRocm91Z2hAMi4wLjAvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtZ2ZtLXN0cmlrZXRocm91Z2gvbGliL2luZGV4LmpzCnZhciBjb25zdHJ1Y3RzV2l0aG91dFN0cmlrZXRocm91Z2ggPSBbCiAgImF1dG9saW5rIiwKICAiZGVzdGluYXRpb25MaXRlcmFsIiwKICAiZGVzdGluYXRpb25SYXciLAogICJyZWZlcmVuY2UiLAogICJ0aXRsZVF1b3RlIiwKICAidGl0bGVBcG9zdHJvcGhlIgpdOwpoYW5kbGVEZWxldGUucGVlayA9IHBlZWtEZWxldGU7CmZ1bmN0aW9uIGdmbVN0cmlrZXRocm91Z2hGcm9tTWFya2Rvd24oKSB7CiAgcmV0dXJuIHsKICAgIGNhbkNvbnRhaW5Fb2xzOiBbImRlbGV0ZSJdLAogICAgZW50ZXI6IHsgc3RyaWtldGhyb3VnaDogZW50ZXJTdHJpa2V0aHJvdWdoIH0sCiAgICBleGl0OiB7IHN0cmlrZXRocm91Z2g6IGV4aXRTdHJpa2V0aHJvdWdoIH0KICB9Owp9Cl9fbmFtZShnZm1TdHJpa2V0aHJvdWdoRnJvbU1hcmtkb3duLCAiZ2ZtU3RyaWtldGhyb3VnaEZyb21NYXJrZG93biIpOwpmdW5jdGlvbiBnZm1TdHJpa2V0aHJvdWdoVG9NYXJrZG93bigpIHsKICByZXR1cm4gewogICAgdW5zYWZlOiBbCiAgICAgIHsKICAgICAgICBjaGFyYWN0ZXI6ICJ+IiwKICAgICAgICBpbkNvbnN0cnVjdDogInBocmFzaW5nIiwKICAgICAgICBub3RJbkNvbnN0cnVjdDogY29uc3RydWN0c1dpdGhvdXRTdHJpa2V0aHJvdWdoCiAgICAgIH0KICAgIF0sCiAgICBoYW5kbGVyczogeyBkZWxldGU6IGhhbmRsZURlbGV0ZSB9CiAgfTsKfQpfX25hbWUoZ2ZtU3RyaWtldGhyb3VnaFRvTWFya2Rvd24sICJnZm1TdHJpa2V0aHJvdWdoVG9NYXJrZG93biIpOwpmdW5jdGlvbiBlbnRlclN0cmlrZXRocm91Z2godG9rZW4pIHsKICB0aGlzLmVudGVyKHsgdHlwZTogImRlbGV0ZSIsIGNoaWxkcmVuOiBbXSB9LCB0b2tlbik7Cn0KX19uYW1lKGVudGVyU3RyaWtldGhyb3VnaCwgImVudGVyU3RyaWtldGhyb3VnaCIpOwpmdW5jdGlvbiBleGl0U3RyaWtldGhyb3VnaCh0b2tlbikgewogIHRoaXMuZXhpdCh0b2tlbik7Cn0KX19uYW1lKGV4aXRTdHJpa2V0aHJvdWdoLCAiZXhpdFN0cmlrZXRocm91Z2giKTsKZnVuY3Rpb24gaGFuZGxlRGVsZXRlKG5vZGUyLCBfMywgc3RhdGUsIGluZm8pIHsKICBjb25zdCB0cmFja2VyID0gc3RhdGUuY3JlYXRlVHJhY2tlcihpbmZvKTsKICBjb25zdCBleGl0MyA9IHN0YXRlLmVudGVyKCJzdHJpa2V0aHJvdWdoIik7CiAgbGV0IHZhbHVlMiA9IHRyYWNrZXIubW92ZSgifn4iKTsKICB2YWx1ZTIgKz0gc3RhdGUuY29udGFpbmVyUGhyYXNpbmcobm9kZTIsIHsKICAgIC4uLnRyYWNrZXIuY3VycmVudCgpLAogICAgYmVmb3JlOiB2YWx1ZTIsCiAgICBhZnRlcjogIn4iCiAgfSk7CiAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgifn4iKTsKICBleGl0MygpOwogIHJldHVybiB2YWx1ZTI7Cn0KX19uYW1lKGhhbmRsZURlbGV0ZSwgImhhbmRsZURlbGV0ZSIpOwpmdW5jdGlvbiBwZWVrRGVsZXRlKCkgewogIHJldHVybiAifiI7Cn0KX19uYW1lKHBlZWtEZWxldGUsICJwZWVrRGVsZXRlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWFya2Rvd24tdGFibGVAMy4wLjQvbm9kZV9tb2R1bGVzL21hcmtkb3duLXRhYmxlL2luZGV4LmpzCmZ1bmN0aW9uIGRlZmF1bHRTdHJpbmdMZW5ndGgodmFsdWUyKSB7CiAgcmV0dXJuIHZhbHVlMi5sZW5ndGg7Cn0KX19uYW1lKGRlZmF1bHRTdHJpbmdMZW5ndGgsICJkZWZhdWx0U3RyaW5nTGVuZ3RoIik7CmZ1bmN0aW9uIG1hcmtkb3duVGFibGUodGFibGUyLCBvcHRpb25zKSB7CiAgY29uc3Qgc2V0dGluZ3MgPSBvcHRpb25zIHx8IHt9OwogIGNvbnN0IGFsaWduID0gKHNldHRpbmdzLmFsaWduIHx8IFtdKS5jb25jYXQoKTsKICBjb25zdCBzdHJpbmdMZW5ndGggPSBzZXR0aW5ncy5zdHJpbmdMZW5ndGggfHwgZGVmYXVsdFN0cmluZ0xlbmd0aDsKICBjb25zdCBhbGlnbm1lbnRzID0gW107CiAgY29uc3QgY2VsbE1hdHJpeCA9IFtdOwogIGNvbnN0IHNpemVNYXRyaXggPSBbXTsKICBjb25zdCBsb25nZXN0Q2VsbEJ5Q29sdW1uID0gW107CiAgbGV0IG1vc3RDZWxsc1BlclJvdyA9IDA7CiAgbGV0IHJvd0luZGV4ID0gLTE7CiAgd2hpbGUgKCsrcm93SW5kZXggPCB0YWJsZTIubGVuZ3RoKSB7CiAgICBjb25zdCByb3cyID0gW107CiAgICBjb25zdCBzaXplczIgPSBbXTsKICAgIGxldCBjb2x1bW5JbmRleDIgPSAtMTsKICAgIGlmICh0YWJsZTJbcm93SW5kZXhdLmxlbmd0aCA+IG1vc3RDZWxsc1BlclJvdykgewogICAgICBtb3N0Q2VsbHNQZXJSb3cgPSB0YWJsZTJbcm93SW5kZXhdLmxlbmd0aDsKICAgIH0KICAgIHdoaWxlICgrK2NvbHVtbkluZGV4MiA8IHRhYmxlMltyb3dJbmRleF0ubGVuZ3RoKSB7CiAgICAgIGNvbnN0IGNlbGwyID0gc2VyaWFsaXplKHRhYmxlMltyb3dJbmRleF1bY29sdW1uSW5kZXgyXSk7CiAgICAgIGlmIChzZXR0aW5ncy5hbGlnbkRlbGltaXRlcnMgIT09IGZhbHNlKSB7CiAgICAgICAgY29uc3Qgc2l6ZSA9IHN0cmluZ0xlbmd0aChjZWxsMik7CiAgICAgICAgc2l6ZXMyW2NvbHVtbkluZGV4Ml0gPSBzaXplOwogICAgICAgIGlmIChsb25nZXN0Q2VsbEJ5Q29sdW1uW2NvbHVtbkluZGV4Ml0gPT09IHZvaWQgMCB8fCBzaXplID4gbG9uZ2VzdENlbGxCeUNvbHVtbltjb2x1bW5JbmRleDJdKSB7CiAgICAgICAgICBsb25nZXN0Q2VsbEJ5Q29sdW1uW2NvbHVtbkluZGV4Ml0gPSBzaXplOwogICAgICAgIH0KICAgICAgfQogICAgICByb3cyLnB1c2goY2VsbDIpOwogICAgfQogICAgY2VsbE1hdHJpeFtyb3dJbmRleF0gPSByb3cyOwogICAgc2l6ZU1hdHJpeFtyb3dJbmRleF0gPSBzaXplczI7CiAgfQogIGxldCBjb2x1bW5JbmRleCA9IC0xOwogIGlmICh0eXBlb2YgYWxpZ24gPT09ICJvYmplY3QiICYmICJsZW5ndGgiIGluIGFsaWduKSB7CiAgICB3aGlsZSAoKytjb2x1bW5JbmRleCA8IG1vc3RDZWxsc1BlclJvdykgewogICAgICBhbGlnbm1lbnRzW2NvbHVtbkluZGV4XSA9IHRvQWxpZ25tZW50KGFsaWduW2NvbHVtbkluZGV4XSk7CiAgICB9CiAgfSBlbHNlIHsKICAgIGNvbnN0IGNvZGU0ID0gdG9BbGlnbm1lbnQoYWxpZ24pOwogICAgd2hpbGUgKCsrY29sdW1uSW5kZXggPCBtb3N0Q2VsbHNQZXJSb3cpIHsKICAgICAgYWxpZ25tZW50c1tjb2x1bW5JbmRleF0gPSBjb2RlNDsKICAgIH0KICB9CiAgY29sdW1uSW5kZXggPSAtMTsKICBjb25zdCByb3cgPSBbXTsKICBjb25zdCBzaXplcyA9IFtdOwogIHdoaWxlICgrK2NvbHVtbkluZGV4IDwgbW9zdENlbGxzUGVyUm93KSB7CiAgICBjb25zdCBjb2RlNCA9IGFsaWdubWVudHNbY29sdW1uSW5kZXhdOwogICAgbGV0IGJlZm9yZSA9ICIiOwogICAgbGV0IGFmdGVyID0gIiI7CiAgICBpZiAoY29kZTQgPT09IDk5KSB7CiAgICAgIGJlZm9yZSA9ICI6IjsKICAgICAgYWZ0ZXIgPSAiOiI7CiAgICB9IGVsc2UgaWYgKGNvZGU0ID09PSAxMDgpIHsKICAgICAgYmVmb3JlID0gIjoiOwogICAgfSBlbHNlIGlmIChjb2RlNCA9PT0gMTE0KSB7CiAgICAgIGFmdGVyID0gIjoiOwogICAgfQogICAgbGV0IHNpemUgPSBzZXR0aW5ncy5hbGlnbkRlbGltaXRlcnMgPT09IGZhbHNlID8gMSA6IE1hdGgubWF4KAogICAgICAxLAogICAgICBsb25nZXN0Q2VsbEJ5Q29sdW1uW2NvbHVtbkluZGV4XSAtIGJlZm9yZS5sZW5ndGggLSBhZnRlci5sZW5ndGgKICAgICk7CiAgICBjb25zdCBjZWxsMiA9IGJlZm9yZSArICItIi5yZXBlYXQoc2l6ZSkgKyBhZnRlcjsKICAgIGlmIChzZXR0aW5ncy5hbGlnbkRlbGltaXRlcnMgIT09IGZhbHNlKSB7CiAgICAgIHNpemUgPSBiZWZvcmUubGVuZ3RoICsgc2l6ZSArIGFmdGVyLmxlbmd0aDsKICAgICAgaWYgKHNpemUgPiBsb25nZXN0Q2VsbEJ5Q29sdW1uW2NvbHVtbkluZGV4XSkgewogICAgICAgIGxvbmdlc3RDZWxsQnlDb2x1bW5bY29sdW1uSW5kZXhdID0gc2l6ZTsKICAgICAgfQogICAgICBzaXplc1tjb2x1bW5JbmRleF0gPSBzaXplOwogICAgfQogICAgcm93W2NvbHVtbkluZGV4XSA9IGNlbGwyOwogIH0KICBjZWxsTWF0cml4LnNwbGljZSgxLCAwLCByb3cpOwogIHNpemVNYXRyaXguc3BsaWNlKDEsIDAsIHNpemVzKTsKICByb3dJbmRleCA9IC0xOwogIGNvbnN0IGxpbmVzID0gW107CiAgd2hpbGUgKCsrcm93SW5kZXggPCBjZWxsTWF0cml4Lmxlbmd0aCkgewogICAgY29uc3Qgcm93MiA9IGNlbGxNYXRyaXhbcm93SW5kZXhdOwogICAgY29uc3Qgc2l6ZXMyID0gc2l6ZU1hdHJpeFtyb3dJbmRleF07CiAgICBjb2x1bW5JbmRleCA9IC0xOwogICAgY29uc3QgbGluZSA9IFtdOwogICAgd2hpbGUgKCsrY29sdW1uSW5kZXggPCBtb3N0Q2VsbHNQZXJSb3cpIHsKICAgICAgY29uc3QgY2VsbDIgPSByb3cyW2NvbHVtbkluZGV4XSB8fCAiIjsKICAgICAgbGV0IGJlZm9yZSA9ICIiOwogICAgICBsZXQgYWZ0ZXIgPSAiIjsKICAgICAgaWYgKHNldHRpbmdzLmFsaWduRGVsaW1pdGVycyAhPT0gZmFsc2UpIHsKICAgICAgICBjb25zdCBzaXplID0gbG9uZ2VzdENlbGxCeUNvbHVtbltjb2x1bW5JbmRleF0gLSAoc2l6ZXMyW2NvbHVtbkluZGV4XSB8fCAwKTsKICAgICAgICBjb25zdCBjb2RlNCA9IGFsaWdubWVudHNbY29sdW1uSW5kZXhdOwogICAgICAgIGlmIChjb2RlNCA9PT0gMTE0KSB7CiAgICAgICAgICBiZWZvcmUgPSAiICIucmVwZWF0KHNpemUpOwogICAgICAgIH0gZWxzZSBpZiAoY29kZTQgPT09IDk5KSB7CiAgICAgICAgICBpZiAoc2l6ZSAlIDIpIHsKICAgICAgICAgICAgYmVmb3JlID0gIiAiLnJlcGVhdChzaXplIC8gMiArIDAuNSk7CiAgICAgICAgICAgIGFmdGVyID0gIiAiLnJlcGVhdChzaXplIC8gMiAtIDAuNSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBiZWZvcmUgPSAiICIucmVwZWF0KHNpemUgLyAyKTsKICAgICAgICAgICAgYWZ0ZXIgPSBiZWZvcmU7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGFmdGVyID0gIiAiLnJlcGVhdChzaXplKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHNldHRpbmdzLmRlbGltaXRlclN0YXJ0ICE9PSBmYWxzZSAmJiAhY29sdW1uSW5kZXgpIHsKICAgICAgICBsaW5lLnB1c2goInwiKTsKICAgICAgfQogICAgICBpZiAoc2V0dGluZ3MucGFkZGluZyAhPT0gZmFsc2UgJiYgLy8gRG9u4oCZdCBhZGQgdGhlIG9wZW5pbmcgc3BhY2UgaWYgd2XigJlyZSBub3QgYWxpZ25pbmcgYW5kIHRoZSBjZWxsIGlzCiAgICAgIC8vIGVtcHR5OiB0aGVyZSB3aWxsIGJlIGEgY2xvc2luZyBzcGFjZS4KICAgICAgIShzZXR0aW5ncy5hbGlnbkRlbGltaXRlcnMgPT09IGZhbHNlICYmIGNlbGwyID09PSAiIikgJiYgKHNldHRpbmdzLmRlbGltaXRlclN0YXJ0ICE9PSBmYWxzZSB8fCBjb2x1bW5JbmRleCkpIHsKICAgICAgICBsaW5lLnB1c2goIiAiKTsKICAgICAgfQogICAgICBpZiAoc2V0dGluZ3MuYWxpZ25EZWxpbWl0ZXJzICE9PSBmYWxzZSkgewogICAgICAgIGxpbmUucHVzaChiZWZvcmUpOwogICAgICB9CiAgICAgIGxpbmUucHVzaChjZWxsMik7CiAgICAgIGlmIChzZXR0aW5ncy5hbGlnbkRlbGltaXRlcnMgIT09IGZhbHNlKSB7CiAgICAgICAgbGluZS5wdXNoKGFmdGVyKTsKICAgICAgfQogICAgICBpZiAoc2V0dGluZ3MucGFkZGluZyAhPT0gZmFsc2UpIHsKICAgICAgICBsaW5lLnB1c2goIiAiKTsKICAgICAgfQogICAgICBpZiAoc2V0dGluZ3MuZGVsaW1pdGVyRW5kICE9PSBmYWxzZSB8fCBjb2x1bW5JbmRleCAhPT0gbW9zdENlbGxzUGVyUm93IC0gMSkgewogICAgICAgIGxpbmUucHVzaCgifCIpOwogICAgICB9CiAgICB9CiAgICBsaW5lcy5wdXNoKAogICAgICBzZXR0aW5ncy5kZWxpbWl0ZXJFbmQgPT09IGZhbHNlID8gbGluZS5qb2luKCIiKS5yZXBsYWNlKC8gKyQvLCAiIikgOiBsaW5lLmpvaW4oIiIpCiAgICApOwogIH0KICByZXR1cm4gbGluZXMuam9pbigiXG4iKTsKfQpfX25hbWUobWFya2Rvd25UYWJsZSwgIm1hcmtkb3duVGFibGUiKTsKZnVuY3Rpb24gc2VyaWFsaXplKHZhbHVlMikgewogIHJldHVybiB2YWx1ZTIgPT09IG51bGwgfHwgdmFsdWUyID09PSB2b2lkIDAgPyAiIiA6IFN0cmluZyh2YWx1ZTIpOwp9Cl9fbmFtZShzZXJpYWxpemUsICJzZXJpYWxpemUiKTsKZnVuY3Rpb24gdG9BbGlnbm1lbnQodmFsdWUyKSB7CiAgY29uc3QgY29kZTQgPSB0eXBlb2YgdmFsdWUyID09PSAic3RyaW5nIiA/IHZhbHVlMi5jb2RlUG9pbnRBdCgwKSA6IDA7CiAgcmV0dXJuIGNvZGU0ID09PSA2NyB8fCBjb2RlNCA9PT0gOTkgPyA5OSA6IGNvZGU0ID09PSA3NiB8fCBjb2RlNCA9PT0gMTA4ID8gMTA4IDogY29kZTQgPT09IDgyIHx8IGNvZGU0ID09PSAxMTQgPyAxMTQgOiAwOwp9Cl9fbmFtZSh0b0FsaWdubWVudCwgInRvQWxpZ25tZW50Iik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vendpdGNoQDIuMC40L25vZGVfbW9kdWxlcy96d2l0Y2gvaW5kZXguanMKdmFyIG93bjIgPSB7fS5oYXNPd25Qcm9wZXJ0eTsKZnVuY3Rpb24gendpdGNoKGtleTIsIG9wdGlvbnMpIHsKICBjb25zdCBzZXR0aW5ncyA9IG9wdGlvbnMgfHwge307CiAgZnVuY3Rpb24gb25lMyh2YWx1ZTIsIC4uLnBhcmFtZXRlcnMpIHsKICAgIGxldCBmbiA9IG9uZTMuaW52YWxpZDsKICAgIGNvbnN0IGhhbmRsZXJzMiA9IG9uZTMuaGFuZGxlcnM7CiAgICBpZiAodmFsdWUyICYmIG93bjIuY2FsbCh2YWx1ZTIsIGtleTIpKSB7CiAgICAgIGNvbnN0IGlkID0gU3RyaW5nKHZhbHVlMltrZXkyXSk7CiAgICAgIGZuID0gb3duMi5jYWxsKGhhbmRsZXJzMiwgaWQpID8gaGFuZGxlcnMyW2lkXSA6IG9uZTMudW5rbm93bjsKICAgIH0KICAgIGlmIChmbikgewogICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCB2YWx1ZTIsIC4uLnBhcmFtZXRlcnMpOwogICAgfQogIH0KICBfX25hbWUob25lMywgIm9uZSIpOwogIG9uZTMuaGFuZGxlcnMgPSBzZXR0aW5ncy5oYW5kbGVycyB8fCB7fTsKICBvbmUzLmludmFsaWQgPSBzZXR0aW5ncy5pbnZhbGlkOwogIG9uZTMudW5rbm93biA9IHNldHRpbmdzLnVua25vd247CiAgcmV0dXJuIG9uZTM7Cn0KX19uYW1lKHp3aXRjaCwgInp3aXRjaCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2NvbmZpZ3VyZS5qcwp2YXIgb3duMyA9IHt9Lmhhc093blByb3BlcnR5OwpmdW5jdGlvbiBjb25maWd1cmUoYmFzZSwgZXh0ZW5zaW9uMikgewogIGxldCBpbmRleDIgPSAtMTsKICBsZXQga2V5MjsKICBpZiAoZXh0ZW5zaW9uMi5leHRlbnNpb25zKSB7CiAgICB3aGlsZSAoKytpbmRleDIgPCBleHRlbnNpb24yLmV4dGVuc2lvbnMubGVuZ3RoKSB7CiAgICAgIGNvbmZpZ3VyZShiYXNlLCBleHRlbnNpb24yLmV4dGVuc2lvbnNbaW5kZXgyXSk7CiAgICB9CiAgfQogIGZvciAoa2V5MiBpbiBleHRlbnNpb24yKSB7CiAgICBpZiAob3duMy5jYWxsKGV4dGVuc2lvbjIsIGtleTIpKSB7CiAgICAgIHN3aXRjaCAoa2V5MikgewogICAgICAgIGNhc2UgImV4dGVuc2lvbnMiOiB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgLyogYzggaWdub3JlIG5leHQgNCAqLwogICAgICAgIGNhc2UgInVuc2FmZSI6IHsKICAgICAgICAgIGxpc3QoYmFzZVtrZXkyXSwgZXh0ZW5zaW9uMltrZXkyXSk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY2FzZSAiam9pbiI6IHsKICAgICAgICAgIGxpc3QoYmFzZVtrZXkyXSwgZXh0ZW5zaW9uMltrZXkyXSk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY2FzZSAiaGFuZGxlcnMiOiB7CiAgICAgICAgICBtYXAzKGJhc2Vba2V5Ml0sIGV4dGVuc2lvbjJba2V5Ml0pOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGRlZmF1bHQ6IHsKICAgICAgICAgIGJhc2Uub3B0aW9uc1trZXkyXSA9IGV4dGVuc2lvbjJba2V5Ml07CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIHJldHVybiBiYXNlOwp9Cl9fbmFtZShjb25maWd1cmUsICJjb25maWd1cmUiKTsKZnVuY3Rpb24gbGlzdChsZWZ0LCByaWdodCkgewogIGlmIChyaWdodCkgewogICAgbGVmdC5wdXNoKC4uLnJpZ2h0KTsKICB9Cn0KX19uYW1lKGxpc3QsICJsaXN0Iik7CmZ1bmN0aW9uIG1hcDMobGVmdCwgcmlnaHQpIHsKICBpZiAocmlnaHQpIHsKICAgIE9iamVjdC5hc3NpZ24obGVmdCwgcmlnaHQpOwogIH0KfQpfX25hbWUobWFwMywgIm1hcCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9ibG9ja3F1b3RlLmpzCmZ1bmN0aW9uIGJsb2NrcXVvdGUobm9kZTIsIF8zLCBzdGF0ZSwgaW5mbykgewogIGNvbnN0IGV4aXQzID0gc3RhdGUuZW50ZXIoImJsb2NrcXVvdGUiKTsKICBjb25zdCB0cmFja2VyID0gc3RhdGUuY3JlYXRlVHJhY2tlcihpbmZvKTsKICB0cmFja2VyLm1vdmUoIj4gIik7CiAgdHJhY2tlci5zaGlmdCgyKTsKICBjb25zdCB2YWx1ZTIgPSBzdGF0ZS5pbmRlbnRMaW5lcygKICAgIHN0YXRlLmNvbnRhaW5lckZsb3cobm9kZTIsIHRyYWNrZXIuY3VycmVudCgpKSwKICAgIG1hcDQKICApOwogIGV4aXQzKCk7CiAgcmV0dXJuIHZhbHVlMjsKfQpfX25hbWUoYmxvY2txdW90ZSwgImJsb2NrcXVvdGUiKTsKZnVuY3Rpb24gbWFwNChsaW5lLCBfMywgYmxhbmspIHsKICByZXR1cm4gIj4iICsgKGJsYW5rID8gIiIgOiAiICIpICsgbGluZTsKfQpfX25hbWUobWFwNCwgIm1hcCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvcGF0dGVybi1pbi1zY29wZS5qcwpmdW5jdGlvbiBwYXR0ZXJuSW5TY29wZShzdGFjaywgcGF0dGVybikgewogIHJldHVybiBsaXN0SW5TY29wZShzdGFjaywgcGF0dGVybi5pbkNvbnN0cnVjdCwgdHJ1ZSkgJiYgIWxpc3RJblNjb3BlKHN0YWNrLCBwYXR0ZXJuLm5vdEluQ29uc3RydWN0LCBmYWxzZSk7Cn0KX19uYW1lKHBhdHRlcm5JblNjb3BlLCAicGF0dGVybkluU2NvcGUiKTsKZnVuY3Rpb24gbGlzdEluU2NvcGUoc3RhY2ssIGxpc3Q1LCBub25lKSB7CiAgaWYgKHR5cGVvZiBsaXN0NSA9PT0gInN0cmluZyIpIHsKICAgIGxpc3Q1ID0gW2xpc3Q1XTsKICB9CiAgaWYgKCFsaXN0NSB8fCBsaXN0NS5sZW5ndGggPT09IDApIHsKICAgIHJldHVybiBub25lOwogIH0KICBsZXQgaW5kZXgyID0gLTE7CiAgd2hpbGUgKCsraW5kZXgyIDwgbGlzdDUubGVuZ3RoKSB7CiAgICBpZiAoc3RhY2suaW5jbHVkZXMobGlzdDVbaW5kZXgyXSkpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgfQogIHJldHVybiBmYWxzZTsKfQpfX25hbWUobGlzdEluU2NvcGUsICJsaXN0SW5TY29wZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9icmVhay5qcwpmdW5jdGlvbiBoYXJkQnJlYWsoXzMsIF8xLCBzdGF0ZSwgaW5mbykgewogIGxldCBpbmRleDIgPSAtMTsKICB3aGlsZSAoKytpbmRleDIgPCBzdGF0ZS51bnNhZmUubGVuZ3RoKSB7CiAgICBpZiAoc3RhdGUudW5zYWZlW2luZGV4Ml0uY2hhcmFjdGVyID09PSAiXG4iICYmIHBhdHRlcm5JblNjb3BlKHN0YXRlLnN0YWNrLCBzdGF0ZS51bnNhZmVbaW5kZXgyXSkpIHsKICAgICAgcmV0dXJuIC9bIFx0XS8udGVzdChpbmZvLmJlZm9yZSkgPyAiIiA6ICIgIjsKICAgIH0KICB9CiAgcmV0dXJuICJcXFxuIjsKfQpfX25hbWUoaGFyZEJyZWFrLCAiaGFyZEJyZWFrIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbG9uZ2VzdC1zdHJlYWtAMy4xLjAvbm9kZV9tb2R1bGVzL2xvbmdlc3Qtc3RyZWFrL2luZGV4LmpzCmZ1bmN0aW9uIGxvbmdlc3RTdHJlYWsodmFsdWUyLCBzdWJzdHJpbmcpIHsKICBjb25zdCBzb3VyY2UgPSBTdHJpbmcodmFsdWUyKTsKICBsZXQgaW5kZXgyID0gc291cmNlLmluZGV4T2Yoc3Vic3RyaW5nKTsKICBsZXQgZXhwZWN0ZWQgPSBpbmRleDI7CiAgbGV0IGNvdW50MiA9IDA7CiAgbGV0IG1heDMgPSAwOwogIGlmICh0eXBlb2Ygc3Vic3RyaW5nICE9PSAic3RyaW5nIikgewogICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiRXhwZWN0ZWQgc3Vic3RyaW5nIik7CiAgfQogIHdoaWxlIChpbmRleDIgIT09IC0xKSB7CiAgICBpZiAoaW5kZXgyID09PSBleHBlY3RlZCkgewogICAgICBpZiAoKytjb3VudDIgPiBtYXgzKSB7CiAgICAgICAgbWF4MyA9IGNvdW50MjsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgY291bnQyID0gMTsKICAgIH0KICAgIGV4cGVjdGVkID0gaW5kZXgyICsgc3Vic3RyaW5nLmxlbmd0aDsKICAgIGluZGV4MiA9IHNvdXJjZS5pbmRleE9mKHN1YnN0cmluZywgZXhwZWN0ZWQpOwogIH0KICByZXR1cm4gbWF4MzsKfQpfX25hbWUobG9uZ2VzdFN0cmVhaywgImxvbmdlc3RTdHJlYWsiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2Zvcm1hdC1jb2RlLWFzLWluZGVudGVkLmpzCmZ1bmN0aW9uIGZvcm1hdENvZGVBc0luZGVudGVkKG5vZGUyLCBzdGF0ZSkgewogIHJldHVybiBCb29sZWFuKAogICAgc3RhdGUub3B0aW9ucy5mZW5jZXMgPT09IGZhbHNlICYmIG5vZGUyLnZhbHVlICYmIC8vIElmIHRoZXJl4oCZcyBubyBpbmZv4oCmCiAgICAhbm9kZTIubGFuZyAmJiAvLyBBbmQgdGhlcmXigJlzIGEgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVy4oCmCiAgICAvW14gXHJcbl0vLnRlc3Qobm9kZTIudmFsdWUpICYmIC8vIEFuZCB0aGUgdmFsdWUgZG9lc27igJl0IHN0YXJ0IG9yIGVuZCBpbiBhIGJsYW5r4oCmCiAgICAhL15bXHQgXSooPzpbXHJcbl18JCl8KD86XnxbXHJcbl0pW1x0IF0qJC8udGVzdChub2RlMi52YWx1ZSkKICApOwp9Cl9fbmFtZShmb3JtYXRDb2RlQXNJbmRlbnRlZCwgImZvcm1hdENvZGVBc0luZGVudGVkIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9jaGVjay1mZW5jZS5qcwpmdW5jdGlvbiBjaGVja0ZlbmNlKHN0YXRlKSB7CiAgY29uc3QgbWFya2VyID0gc3RhdGUub3B0aW9ucy5mZW5jZSB8fCAiYCI7CiAgaWYgKG1hcmtlciAhPT0gImAiICYmIG1hcmtlciAhPT0gIn4iKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICJDYW5ub3Qgc2VyaWFsaXplIGNvZGUgd2l0aCBgIiArIG1hcmtlciArICJgIGZvciBgb3B0aW9ucy5mZW5jZWAsIGV4cGVjdGVkIGBgIGAgYGAgb3IgYH5gIgogICAgKTsKICB9CiAgcmV0dXJuIG1hcmtlcjsKfQpfX25hbWUoY2hlY2tGZW5jZSwgImNoZWNrRmVuY2UiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9oYW5kbGUvY29kZS5qcwpmdW5jdGlvbiBjb2RlKG5vZGUyLCBfMywgc3RhdGUsIGluZm8pIHsKICBjb25zdCBtYXJrZXIgPSBjaGVja0ZlbmNlKHN0YXRlKTsKICBjb25zdCByYXcyID0gbm9kZTIudmFsdWUgfHwgIiI7CiAgY29uc3Qgc3VmZml4ID0gbWFya2VyID09PSAiYCIgPyAiR3JhdmVBY2NlbnQiIDogIlRpbGRlIjsKICBpZiAoZm9ybWF0Q29kZUFzSW5kZW50ZWQobm9kZTIsIHN0YXRlKSkgewogICAgY29uc3QgZXhpdDQgPSBzdGF0ZS5lbnRlcigiY29kZUluZGVudGVkIik7CiAgICBjb25zdCB2YWx1ZTMgPSBzdGF0ZS5pbmRlbnRMaW5lcyhyYXcyLCBtYXA1KTsKICAgIGV4aXQ0KCk7CiAgICByZXR1cm4gdmFsdWUzOwogIH0KICBjb25zdCB0cmFja2VyID0gc3RhdGUuY3JlYXRlVHJhY2tlcihpbmZvKTsKICBjb25zdCBzZXF1ZW5jZSA9IG1hcmtlci5yZXBlYXQoTWF0aC5tYXgobG9uZ2VzdFN0cmVhayhyYXcyLCBtYXJrZXIpICsgMSwgMykpOwogIGNvbnN0IGV4aXQzID0gc3RhdGUuZW50ZXIoImNvZGVGZW5jZWQiKTsKICBsZXQgdmFsdWUyID0gdHJhY2tlci5tb3ZlKHNlcXVlbmNlKTsKICBpZiAobm9kZTIubGFuZykgewogICAgY29uc3Qgc3ViZXhpdCA9IHN0YXRlLmVudGVyKGBjb2RlRmVuY2VkTGFuZyR7c3VmZml4fWApOwogICAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgKICAgICAgc3RhdGUuc2FmZShub2RlMi5sYW5nLCB7CiAgICAgICAgYmVmb3JlOiB2YWx1ZTIsCiAgICAgICAgYWZ0ZXI6ICIgIiwKICAgICAgICBlbmNvZGU6IFsiYCJdLAogICAgICAgIC4uLnRyYWNrZXIuY3VycmVudCgpCiAgICAgIH0pCiAgICApOwogICAgc3ViZXhpdCgpOwogIH0KICBpZiAobm9kZTIubGFuZyAmJiBub2RlMi5tZXRhKSB7CiAgICBjb25zdCBzdWJleGl0ID0gc3RhdGUuZW50ZXIoYGNvZGVGZW5jZWRNZXRhJHtzdWZmaXh9YCk7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKCIgIik7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKAogICAgICBzdGF0ZS5zYWZlKG5vZGUyLm1ldGEsIHsKICAgICAgICBiZWZvcmU6IHZhbHVlMiwKICAgICAgICBhZnRlcjogIlxuIiwKICAgICAgICBlbmNvZGU6IFsiYCJdLAogICAgICAgIC4uLnRyYWNrZXIuY3VycmVudCgpCiAgICAgIH0pCiAgICApOwogICAgc3ViZXhpdCgpOwogIH0KICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKCJcbiIpOwogIGlmIChyYXcyKSB7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKHJhdzIgKyAiXG4iKTsKICB9CiAgdmFsdWUyICs9IHRyYWNrZXIubW92ZShzZXF1ZW5jZSk7CiAgZXhpdDMoKTsKICByZXR1cm4gdmFsdWUyOwp9Cl9fbmFtZShjb2RlLCAiY29kZSIpOwpmdW5jdGlvbiBtYXA1KGxpbmUsIF8zLCBibGFuaykgewogIHJldHVybiAoYmxhbmsgPyAiIiA6ICIgICAgIikgKyBsaW5lOwp9Cl9fbmFtZShtYXA1LCAibWFwIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9jaGVjay1xdW90ZS5qcwpmdW5jdGlvbiBjaGVja1F1b3RlKHN0YXRlKSB7CiAgY29uc3QgbWFya2VyID0gc3RhdGUub3B0aW9ucy5xdW90ZSB8fCAnIic7CiAgaWYgKG1hcmtlciAhPT0gJyInICYmIG1hcmtlciAhPT0gIiciKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICJDYW5ub3Qgc2VyaWFsaXplIHRpdGxlIHdpdGggYCIgKyBtYXJrZXIgKyAiYCBmb3IgYG9wdGlvbnMucXVvdGVgLCBleHBlY3RlZCBgXCJgLCBvciBgJ2AiCiAgICApOwogIH0KICByZXR1cm4gbWFya2VyOwp9Cl9fbmFtZShjaGVja1F1b3RlLCAiY2hlY2tRdW90ZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9kZWZpbml0aW9uLmpzCmZ1bmN0aW9uIGRlZmluaXRpb24obm9kZTIsIF8zLCBzdGF0ZSwgaW5mbykgewogIGNvbnN0IHF1b3RlID0gY2hlY2tRdW90ZShzdGF0ZSk7CiAgY29uc3Qgc3VmZml4ID0gcXVvdGUgPT09ICciJyA/ICJRdW90ZSIgOiAiQXBvc3Ryb3BoZSI7CiAgY29uc3QgZXhpdDMgPSBzdGF0ZS5lbnRlcigiZGVmaW5pdGlvbiIpOwogIGxldCBzdWJleGl0ID0gc3RhdGUuZW50ZXIoImxhYmVsIik7CiAgY29uc3QgdHJhY2tlciA9IHN0YXRlLmNyZWF0ZVRyYWNrZXIoaW5mbyk7CiAgbGV0IHZhbHVlMiA9IHRyYWNrZXIubW92ZSgiWyIpOwogIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoCiAgICBzdGF0ZS5zYWZlKHN0YXRlLmFzc29jaWF0aW9uSWQobm9kZTIpLCB7CiAgICAgIGJlZm9yZTogdmFsdWUyLAogICAgICBhZnRlcjogIl0iLAogICAgICAuLi50cmFja2VyLmN1cnJlbnQoKQogICAgfSkKICApOwogIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoIl06ICIpOwogIHN1YmV4aXQoKTsKICBpZiAoCiAgICAvLyBJZiB0aGVyZeKAmXMgbm8gdXJsLCBvcuKApgogICAgIW5vZGUyLnVybCB8fCAvLyBJZiB0aGVyZSBhcmUgY29udHJvbCBjaGFyYWN0ZXJzIG9yIHdoaXRlc3BhY2UuCiAgICAvW1wwLSBcdTAwN0ZdLy50ZXN0KG5vZGUyLnVybCkKICApIHsKICAgIHN1YmV4aXQgPSBzdGF0ZS5lbnRlcigiZGVzdGluYXRpb25MaXRlcmFsIik7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKCI8Iik7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKAogICAgICBzdGF0ZS5zYWZlKG5vZGUyLnVybCwgeyBiZWZvcmU6IHZhbHVlMiwgYWZ0ZXI6ICI+IiwgLi4udHJhY2tlci5jdXJyZW50KCkgfSkKICAgICk7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKCI+Iik7CiAgfSBlbHNlIHsKICAgIHN1YmV4aXQgPSBzdGF0ZS5lbnRlcigiZGVzdGluYXRpb25SYXciKTsKICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoCiAgICAgIHN0YXRlLnNhZmUobm9kZTIudXJsLCB7CiAgICAgICAgYmVmb3JlOiB2YWx1ZTIsCiAgICAgICAgYWZ0ZXI6IG5vZGUyLnRpdGxlID8gIiAiIDogIlxuIiwKICAgICAgICAuLi50cmFja2VyLmN1cnJlbnQoKQogICAgICB9KQogICAgKTsKICB9CiAgc3ViZXhpdCgpOwogIGlmIChub2RlMi50aXRsZSkgewogICAgc3ViZXhpdCA9IHN0YXRlLmVudGVyKGB0aXRsZSR7c3VmZml4fWApOwogICAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgiICIgKyBxdW90ZSk7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKAogICAgICBzdGF0ZS5zYWZlKG5vZGUyLnRpdGxlLCB7CiAgICAgICAgYmVmb3JlOiB2YWx1ZTIsCiAgICAgICAgYWZ0ZXI6IHF1b3RlLAogICAgICAgIC4uLnRyYWNrZXIuY3VycmVudCgpCiAgICAgIH0pCiAgICApOwogICAgdmFsdWUyICs9IHRyYWNrZXIubW92ZShxdW90ZSk7CiAgICBzdWJleGl0KCk7CiAgfQogIGV4aXQzKCk7CiAgcmV0dXJuIHZhbHVlMjsKfQpfX25hbWUoZGVmaW5pdGlvbiwgImRlZmluaXRpb24iKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2NoZWNrLWVtcGhhc2lzLmpzCmZ1bmN0aW9uIGNoZWNrRW1waGFzaXMoc3RhdGUpIHsKICBjb25zdCBtYXJrZXIgPSBzdGF0ZS5vcHRpb25zLmVtcGhhc2lzIHx8ICIqIjsKICBpZiAobWFya2VyICE9PSAiKiIgJiYgbWFya2VyICE9PSAiXyIpIHsKICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgIkNhbm5vdCBzZXJpYWxpemUgZW1waGFzaXMgd2l0aCBgIiArIG1hcmtlciArICJgIGZvciBgb3B0aW9ucy5lbXBoYXNpc2AsIGV4cGVjdGVkIGAqYCwgb3IgYF9gIgogICAgKTsKICB9CiAgcmV0dXJuIG1hcmtlcjsKfQpfX25hbWUoY2hlY2tFbXBoYXNpcywgImNoZWNrRW1waGFzaXMiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2VuY29kZS1jaGFyYWN0ZXItcmVmZXJlbmNlLmpzCmZ1bmN0aW9uIGVuY29kZUNoYXJhY3RlclJlZmVyZW5jZShjb2RlNCkgewogIHJldHVybiAiJiN4IiArIGNvZGU0LnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpICsgIjsiOwp9Cl9fbmFtZShlbmNvZGVDaGFyYWN0ZXJSZWZlcmVuY2UsICJlbmNvZGVDaGFyYWN0ZXJSZWZlcmVuY2UiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstdXRpbC1jbGFzc2lmeS1jaGFyYWN0ZXJAMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay11dGlsLWNsYXNzaWZ5LWNoYXJhY3Rlci9pbmRleC5qcwpmdW5jdGlvbiBjbGFzc2lmeUNoYXJhY3Rlcihjb2RlNCkgewogIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlKGNvZGU0KSB8fCB1bmljb2RlV2hpdGVzcGFjZShjb2RlNCkpIHsKICAgIHJldHVybiAxOwogIH0KICBpZiAodW5pY29kZVB1bmN0dWF0aW9uKGNvZGU0KSkgewogICAgcmV0dXJuIDI7CiAgfQp9Cl9fbmFtZShjbGFzc2lmeUNoYXJhY3RlciwgImNsYXNzaWZ5Q2hhcmFjdGVyIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9lbmNvZGUtaW5mby5qcwpmdW5jdGlvbiBlbmNvZGVJbmZvKG91dHNpZGUsIGluc2lkZSwgbWFya2VyKSB7CiAgY29uc3Qgb3V0c2lkZUtpbmQgPSBjbGFzc2lmeUNoYXJhY3RlcihvdXRzaWRlKTsKICBjb25zdCBpbnNpZGVLaW5kID0gY2xhc3NpZnlDaGFyYWN0ZXIoaW5zaWRlKTsKICBpZiAob3V0c2lkZUtpbmQgPT09IHZvaWQgMCkgewogICAgcmV0dXJuIGluc2lkZUtpbmQgPT09IHZvaWQgMCA/ICgKICAgICAgLy8gTGV0dGVyIGluc2lkZToKICAgICAgLy8gd2UgaGF2ZSB0byBlbmNvZGUgKmJvdGgqIGxldHRlcnMgZm9yIGBfYCBhcyBpdCBpcyBsb29zZXIuCiAgICAgIC8vIGl0IGFscmVhZHkgZm9ybXMgZm9yIGAqYCAoYW5kIEdGTXMgYH5gKS4KICAgICAgbWFya2VyID09PSAiXyIgPyB7IGluc2lkZTogdHJ1ZSwgb3V0c2lkZTogdHJ1ZSB9IDogeyBpbnNpZGU6IGZhbHNlLCBvdXRzaWRlOiBmYWxzZSB9CiAgICApIDogaW5zaWRlS2luZCA9PT0gMSA/ICgKICAgICAgLy8gV2hpdGVzcGFjZSBpbnNpZGU6IGVuY29kZSBib3RoIChsZXR0ZXIsIHdoaXRlc3BhY2UpLgogICAgICB7IGluc2lkZTogdHJ1ZSwgb3V0c2lkZTogdHJ1ZSB9CiAgICApIDogKAogICAgICAvLyBQdW5jdHVhdGlvbiBpbnNpZGU6IGVuY29kZSBvdXRlciAobGV0dGVyKQogICAgICB7IGluc2lkZTogZmFsc2UsIG91dHNpZGU6IHRydWUgfQogICAgKTsKICB9CiAgaWYgKG91dHNpZGVLaW5kID09PSAxKSB7CiAgICByZXR1cm4gaW5zaWRlS2luZCA9PT0gdm9pZCAwID8gKAogICAgICAvLyBMZXR0ZXIgaW5zaWRlOiBhbHJlYWR5IGZvcm1zLgogICAgICB7IGluc2lkZTogZmFsc2UsIG91dHNpZGU6IGZhbHNlIH0KICAgICkgOiBpbnNpZGVLaW5kID09PSAxID8gKAogICAgICAvLyBXaGl0ZXNwYWNlIGluc2lkZTogZW5jb2RlIGJvdGggKHdoaXRlc3BhY2UpLgogICAgICB7IGluc2lkZTogdHJ1ZSwgb3V0c2lkZTogdHJ1ZSB9CiAgICApIDogKAogICAgICAvLyBQdW5jdHVhdGlvbiBpbnNpZGU6IGFscmVhZHkgZm9ybXMuCiAgICAgIHsgaW5zaWRlOiBmYWxzZSwgb3V0c2lkZTogZmFsc2UgfQogICAgKTsKICB9CiAgcmV0dXJuIGluc2lkZUtpbmQgPT09IHZvaWQgMCA/ICgKICAgIC8vIExldHRlciBpbnNpZGU6IGFscmVhZHkgZm9ybXMuCiAgICB7IGluc2lkZTogZmFsc2UsIG91dHNpZGU6IGZhbHNlIH0KICApIDogaW5zaWRlS2luZCA9PT0gMSA/ICgKICAgIC8vIFdoaXRlc3BhY2UgaW5zaWRlOiBlbmNvZGUgaW5uZXIgKHdoaXRlc3BhY2UpLgogICAgeyBpbnNpZGU6IHRydWUsIG91dHNpZGU6IGZhbHNlIH0KICApIDogKAogICAgLy8gUHVuY3R1YXRpb24gaW5zaWRlOiBhbHJlYWR5IGZvcm1zLgogICAgeyBpbnNpZGU6IGZhbHNlLCBvdXRzaWRlOiBmYWxzZSB9CiAgKTsKfQpfX25hbWUoZW5jb2RlSW5mbywgImVuY29kZUluZm8iKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9oYW5kbGUvZW1waGFzaXMuanMKZW1waGFzaXMucGVlayA9IGVtcGhhc2lzUGVlazsKZnVuY3Rpb24gZW1waGFzaXMobm9kZTIsIF8zLCBzdGF0ZSwgaW5mbykgewogIGNvbnN0IG1hcmtlciA9IGNoZWNrRW1waGFzaXMoc3RhdGUpOwogIGNvbnN0IGV4aXQzID0gc3RhdGUuZW50ZXIoImVtcGhhc2lzIik7CiAgY29uc3QgdHJhY2tlciA9IHN0YXRlLmNyZWF0ZVRyYWNrZXIoaW5mbyk7CiAgY29uc3QgYmVmb3JlID0gdHJhY2tlci5tb3ZlKG1hcmtlcik7CiAgbGV0IGJldHdlZW4yID0gdHJhY2tlci5tb3ZlKAogICAgc3RhdGUuY29udGFpbmVyUGhyYXNpbmcobm9kZTIsIHsKICAgICAgYWZ0ZXI6IG1hcmtlciwKICAgICAgYmVmb3JlLAogICAgICAuLi50cmFja2VyLmN1cnJlbnQoKQogICAgfSkKICApOwogIGNvbnN0IGJldHdlZW5IZWFkID0gYmV0d2VlbjIuY2hhckNvZGVBdCgwKTsKICBjb25zdCBvcGVuID0gZW5jb2RlSW5mbygKICAgIGluZm8uYmVmb3JlLmNoYXJDb2RlQXQoaW5mby5iZWZvcmUubGVuZ3RoIC0gMSksCiAgICBiZXR3ZWVuSGVhZCwKICAgIG1hcmtlcgogICk7CiAgaWYgKG9wZW4uaW5zaWRlKSB7CiAgICBiZXR3ZWVuMiA9IGVuY29kZUNoYXJhY3RlclJlZmVyZW5jZShiZXR3ZWVuSGVhZCkgKyBiZXR3ZWVuMi5zbGljZSgxKTsKICB9CiAgY29uc3QgYmV0d2VlblRhaWwgPSBiZXR3ZWVuMi5jaGFyQ29kZUF0KGJldHdlZW4yLmxlbmd0aCAtIDEpOwogIGNvbnN0IGNsb3NlNyA9IGVuY29kZUluZm8oaW5mby5hZnRlci5jaGFyQ29kZUF0KDApLCBiZXR3ZWVuVGFpbCwgbWFya2VyKTsKICBpZiAoY2xvc2U3Lmluc2lkZSkgewogICAgYmV0d2VlbjIgPSBiZXR3ZWVuMi5zbGljZSgwLCAtMSkgKyBlbmNvZGVDaGFyYWN0ZXJSZWZlcmVuY2UoYmV0d2VlblRhaWwpOwogIH0KICBjb25zdCBhZnRlciA9IHRyYWNrZXIubW92ZShtYXJrZXIpOwogIGV4aXQzKCk7CiAgc3RhdGUuYXR0ZW50aW9uRW5jb2RlU3Vycm91bmRpbmdJbmZvID0gewogICAgYWZ0ZXI6IGNsb3NlNy5vdXRzaWRlLAogICAgYmVmb3JlOiBvcGVuLm91dHNpZGUKICB9OwogIHJldHVybiBiZWZvcmUgKyBiZXR3ZWVuMiArIGFmdGVyOwp9Cl9fbmFtZShlbXBoYXNpcywgImVtcGhhc2lzIik7CmZ1bmN0aW9uIGVtcGhhc2lzUGVlayhfMywgXzEsIHN0YXRlKSB7CiAgcmV0dXJuIHN0YXRlLm9wdGlvbnMuZW1waGFzaXMgfHwgIioiOwp9Cl9fbmFtZShlbXBoYXNpc1BlZWssICJlbXBoYXNpc1BlZWsiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS91bmlzdC11dGlsLXZpc2l0QDUuMS4wL25vZGVfbW9kdWxlcy91bmlzdC11dGlsLXZpc2l0L2xpYi9pbmRleC5qcwpmdW5jdGlvbiB2aXNpdCh0cmVlLCB0ZXN0T3JWaXNpdG9yLCB2aXNpdG9yT3JSZXZlcnNlLCBtYXliZVJldmVyc2UpIHsKICBsZXQgcmV2ZXJzZTsKICBsZXQgdGVzdDsKICBsZXQgdmlzaXRvcjsKICBpZiAodHlwZW9mIHRlc3RPclZpc2l0b3IgPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIHZpc2l0b3JPclJldmVyc2UgIT09ICJmdW5jdGlvbiIpIHsKICAgIHRlc3QgPSB2b2lkIDA7CiAgICB2aXNpdG9yID0gdGVzdE9yVmlzaXRvcjsKICAgIHJldmVyc2UgPSB2aXNpdG9yT3JSZXZlcnNlOwogIH0gZWxzZSB7CiAgICB0ZXN0ID0gdGVzdE9yVmlzaXRvcjsKICAgIHZpc2l0b3IgPSB2aXNpdG9yT3JSZXZlcnNlOwogICAgcmV2ZXJzZSA9IG1heWJlUmV2ZXJzZTsKICB9CiAgdmlzaXRQYXJlbnRzKHRyZWUsIHRlc3QsIG92ZXJsb2FkLCByZXZlcnNlKTsKICBmdW5jdGlvbiBvdmVybG9hZChub2RlMiwgcGFyZW50cykgewogICAgY29uc3QgcGFyZW50ID0gcGFyZW50c1twYXJlbnRzLmxlbmd0aCAtIDFdOwogICAgY29uc3QgaW5kZXgyID0gcGFyZW50ID8gcGFyZW50LmNoaWxkcmVuLmluZGV4T2Yobm9kZTIpIDogdm9pZCAwOwogICAgcmV0dXJuIHZpc2l0b3Iobm9kZTIsIGluZGV4MiwgcGFyZW50KTsKICB9CiAgX19uYW1lKG92ZXJsb2FkLCAib3ZlcmxvYWQiKTsKfQpfX25hbWUodmlzaXQsICJ2aXNpdCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tc3RyaW5nQDQuMC4wL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLXN0cmluZy9saWIvaW5kZXguanMKdmFyIGVtcHR5T3B0aW9ucyA9IHt9OwpmdW5jdGlvbiB0b1N0cmluZyh2YWx1ZTIsIG9wdGlvbnMpIHsKICBjb25zdCBzZXR0aW5ncyA9IG9wdGlvbnMgfHwgZW1wdHlPcHRpb25zOwogIGNvbnN0IGluY2x1ZGVJbWFnZUFsdCA9IHR5cGVvZiBzZXR0aW5ncy5pbmNsdWRlSW1hZ2VBbHQgPT09ICJib29sZWFuIiA/IHNldHRpbmdzLmluY2x1ZGVJbWFnZUFsdCA6IHRydWU7CiAgY29uc3QgaW5jbHVkZUh0bWwgPSB0eXBlb2Ygc2V0dGluZ3MuaW5jbHVkZUh0bWwgPT09ICJib29sZWFuIiA/IHNldHRpbmdzLmluY2x1ZGVIdG1sIDogdHJ1ZTsKICByZXR1cm4gb25lKHZhbHVlMiwgaW5jbHVkZUltYWdlQWx0LCBpbmNsdWRlSHRtbCk7Cn0KX19uYW1lKHRvU3RyaW5nLCAidG9TdHJpbmciKTsKZnVuY3Rpb24gb25lKHZhbHVlMiwgaW5jbHVkZUltYWdlQWx0LCBpbmNsdWRlSHRtbCkgewogIGlmIChub2RlKHZhbHVlMikpIHsKICAgIGlmICgidmFsdWUiIGluIHZhbHVlMikgewogICAgICByZXR1cm4gdmFsdWUyLnR5cGUgPT09ICJodG1sIiAmJiAhaW5jbHVkZUh0bWwgPyAiIiA6IHZhbHVlMi52YWx1ZTsKICAgIH0KICAgIGlmIChpbmNsdWRlSW1hZ2VBbHQgJiYgImFsdCIgaW4gdmFsdWUyICYmIHZhbHVlMi5hbHQpIHsKICAgICAgcmV0dXJuIHZhbHVlMi5hbHQ7CiAgICB9CiAgICBpZiAoImNoaWxkcmVuIiBpbiB2YWx1ZTIpIHsKICAgICAgcmV0dXJuIGFsbCh2YWx1ZTIuY2hpbGRyZW4sIGluY2x1ZGVJbWFnZUFsdCwgaW5jbHVkZUh0bWwpOwogICAgfQogIH0KICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZTIpKSB7CiAgICByZXR1cm4gYWxsKHZhbHVlMiwgaW5jbHVkZUltYWdlQWx0LCBpbmNsdWRlSHRtbCk7CiAgfQogIHJldHVybiAiIjsKfQpfX25hbWUob25lLCAib25lIik7CmZ1bmN0aW9uIGFsbCh2YWx1ZXMsIGluY2x1ZGVJbWFnZUFsdCwgaW5jbHVkZUh0bWwpIHsKICBjb25zdCByZXN1bHQgPSBbXTsKICBsZXQgaW5kZXgyID0gLTE7CiAgd2hpbGUgKCsraW5kZXgyIDwgdmFsdWVzLmxlbmd0aCkgewogICAgcmVzdWx0W2luZGV4Ml0gPSBvbmUodmFsdWVzW2luZGV4Ml0sIGluY2x1ZGVJbWFnZUFsdCwgaW5jbHVkZUh0bWwpOwogIH0KICByZXR1cm4gcmVzdWx0LmpvaW4oIiIpOwp9Cl9fbmFtZShhbGwsICJhbGwiKTsKZnVuY3Rpb24gbm9kZSh2YWx1ZTIpIHsKICByZXR1cm4gQm9vbGVhbih2YWx1ZTIgJiYgdHlwZW9mIHZhbHVlMiA9PT0gIm9iamVjdCIpOwp9Cl9fbmFtZShub2RlLCAibm9kZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvZm9ybWF0LWhlYWRpbmctYXMtc2V0ZXh0LmpzCmZ1bmN0aW9uIGZvcm1hdEhlYWRpbmdBc1NldGV4dChub2RlMiwgc3RhdGUpIHsKICBsZXQgbGl0ZXJhbFdpdGhCcmVhayA9IGZhbHNlOwogIHZpc2l0KG5vZGUyLCBmdW5jdGlvbihub2RlMykgewogICAgaWYgKCJ2YWx1ZSIgaW4gbm9kZTMgJiYgL1xyP1xufFxyLy50ZXN0KG5vZGUzLnZhbHVlKSB8fCBub2RlMy50eXBlID09PSAiYnJlYWsiKSB7CiAgICAgIGxpdGVyYWxXaXRoQnJlYWsgPSB0cnVlOwogICAgICByZXR1cm4gRVhJVDsKICAgIH0KICB9KTsKICByZXR1cm4gQm9vbGVhbigKICAgICghbm9kZTIuZGVwdGggfHwgbm9kZTIuZGVwdGggPCAzKSAmJiB0b1N0cmluZyhub2RlMikgJiYgKHN0YXRlLm9wdGlvbnMuc2V0ZXh0IHx8IGxpdGVyYWxXaXRoQnJlYWspCiAgKTsKfQpfX25hbWUoZm9ybWF0SGVhZGluZ0FzU2V0ZXh0LCAiZm9ybWF0SGVhZGluZ0FzU2V0ZXh0Iik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaGFuZGxlL2hlYWRpbmcuanMKZnVuY3Rpb24gaGVhZGluZyhub2RlMiwgXzMsIHN0YXRlLCBpbmZvKSB7CiAgY29uc3QgcmFuayA9IE1hdGgubWF4KE1hdGgubWluKDYsIG5vZGUyLmRlcHRoIHx8IDEpLCAxKTsKICBjb25zdCB0cmFja2VyID0gc3RhdGUuY3JlYXRlVHJhY2tlcihpbmZvKTsKICBpZiAoZm9ybWF0SGVhZGluZ0FzU2V0ZXh0KG5vZGUyLCBzdGF0ZSkpIHsKICAgIGNvbnN0IGV4aXQ0ID0gc3RhdGUuZW50ZXIoImhlYWRpbmdTZXRleHQiKTsKICAgIGNvbnN0IHN1YmV4aXQyID0gc3RhdGUuZW50ZXIoInBocmFzaW5nIik7CiAgICBjb25zdCB2YWx1ZTMgPSBzdGF0ZS5jb250YWluZXJQaHJhc2luZyhub2RlMiwgewogICAgICAuLi50cmFja2VyLmN1cnJlbnQoKSwKICAgICAgYmVmb3JlOiAiXG4iLAogICAgICBhZnRlcjogIlxuIgogICAgfSk7CiAgICBzdWJleGl0MigpOwogICAgZXhpdDQoKTsKICAgIHJldHVybiB2YWx1ZTMgKyAiXG4iICsgKHJhbmsgPT09IDEgPyAiPSIgOiAiLSIpLnJlcGVhdCgKICAgICAgLy8gVGhlIHdob2xlIHNpemXigKYKICAgICAgdmFsdWUzLmxlbmd0aCAtIC8vIE1pbnVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgY2hhcmFjdGVyIGFmdGVyIHRoZSBsYXN0IEVPTCAob3IKICAgICAgLy8gMCBpZiB0aGVyZSBpcyBub25lKeKApgogICAgICAoTWF0aC5tYXgodmFsdWUzLmxhc3RJbmRleE9mKCJcciIpLCB2YWx1ZTMubGFzdEluZGV4T2YoIlxuIikpICsgMSkKICAgICk7CiAgfQogIGNvbnN0IHNlcXVlbmNlID0gIiMiLnJlcGVhdChyYW5rKTsKICBjb25zdCBleGl0MyA9IHN0YXRlLmVudGVyKCJoZWFkaW5nQXR4Iik7CiAgY29uc3Qgc3ViZXhpdCA9IHN0YXRlLmVudGVyKCJwaHJhc2luZyIpOwogIHRyYWNrZXIubW92ZShzZXF1ZW5jZSArICIgIik7CiAgbGV0IHZhbHVlMiA9IHN0YXRlLmNvbnRhaW5lclBocmFzaW5nKG5vZGUyLCB7CiAgICBiZWZvcmU6ICIjICIsCiAgICBhZnRlcjogIlxuIiwKICAgIC4uLnRyYWNrZXIuY3VycmVudCgpCiAgfSk7CiAgaWYgKC9eW1x0IF0vLnRlc3QodmFsdWUyKSkgewogICAgdmFsdWUyID0gZW5jb2RlQ2hhcmFjdGVyUmVmZXJlbmNlKHZhbHVlMi5jaGFyQ29kZUF0KDApKSArIHZhbHVlMi5zbGljZSgxKTsKICB9CiAgdmFsdWUyID0gdmFsdWUyID8gc2VxdWVuY2UgKyAiICIgKyB2YWx1ZTIgOiBzZXF1ZW5jZTsKICBpZiAoc3RhdGUub3B0aW9ucy5jbG9zZUF0eCkgewogICAgdmFsdWUyICs9ICIgIiArIHNlcXVlbmNlOwogIH0KICBzdWJleGl0KCk7CiAgZXhpdDMoKTsKICByZXR1cm4gdmFsdWUyOwp9Cl9fbmFtZShoZWFkaW5nLCAiaGVhZGluZyIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9odG1sLmpzCmh0bWwucGVlayA9IGh0bWxQZWVrOwpmdW5jdGlvbiBodG1sKG5vZGUyKSB7CiAgcmV0dXJuIG5vZGUyLnZhbHVlIHx8ICIiOwp9Cl9fbmFtZShodG1sLCAiaHRtbCIpOwpmdW5jdGlvbiBodG1sUGVlaygpIHsKICByZXR1cm4gIjwiOwp9Cl9fbmFtZShodG1sUGVlaywgImh0bWxQZWVrIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaGFuZGxlL2ltYWdlLmpzCmltYWdlLnBlZWsgPSBpbWFnZVBlZWs7CmZ1bmN0aW9uIGltYWdlKG5vZGUyLCBfMywgc3RhdGUsIGluZm8pIHsKICBjb25zdCBxdW90ZSA9IGNoZWNrUXVvdGUoc3RhdGUpOwogIGNvbnN0IHN1ZmZpeCA9IHF1b3RlID09PSAnIicgPyAiUXVvdGUiIDogIkFwb3N0cm9waGUiOwogIGNvbnN0IGV4aXQzID0gc3RhdGUuZW50ZXIoImltYWdlIik7CiAgbGV0IHN1YmV4aXQgPSBzdGF0ZS5lbnRlcigibGFiZWwiKTsKICBjb25zdCB0cmFja2VyID0gc3RhdGUuY3JlYXRlVHJhY2tlcihpbmZvKTsKICBsZXQgdmFsdWUyID0gdHJhY2tlci5tb3ZlKCIhWyIpOwogIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoCiAgICBzdGF0ZS5zYWZlKG5vZGUyLmFsdCwgeyBiZWZvcmU6IHZhbHVlMiwgYWZ0ZXI6ICJdIiwgLi4udHJhY2tlci5jdXJyZW50KCkgfSkKICApOwogIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoIl0oIik7CiAgc3ViZXhpdCgpOwogIGlmICgKICAgIC8vIElmIHRoZXJl4oCZcyBubyB1cmwgYnV0IHRoZXJlIGlzIGEgdGl0bGXigKYKICAgICFub2RlMi51cmwgJiYgbm9kZTIudGl0bGUgfHwgLy8gSWYgdGhlcmUgYXJlIGNvbnRyb2wgY2hhcmFjdGVycyBvciB3aGl0ZXNwYWNlLgogICAgL1tcMC0gXHUwMDdGXS8udGVzdChub2RlMi51cmwpCiAgKSB7CiAgICBzdWJleGl0ID0gc3RhdGUuZW50ZXIoImRlc3RpbmF0aW9uTGl0ZXJhbCIpOwogICAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgiPCIpOwogICAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgKICAgICAgc3RhdGUuc2FmZShub2RlMi51cmwsIHsgYmVmb3JlOiB2YWx1ZTIsIGFmdGVyOiAiPiIsIC4uLnRyYWNrZXIuY3VycmVudCgpIH0pCiAgICApOwogICAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgiPiIpOwogIH0gZWxzZSB7CiAgICBzdWJleGl0ID0gc3RhdGUuZW50ZXIoImRlc3RpbmF0aW9uUmF3Iik7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKAogICAgICBzdGF0ZS5zYWZlKG5vZGUyLnVybCwgewogICAgICAgIGJlZm9yZTogdmFsdWUyLAogICAgICAgIGFmdGVyOiBub2RlMi50aXRsZSA/ICIgIiA6ICIpIiwKICAgICAgICAuLi50cmFja2VyLmN1cnJlbnQoKQogICAgICB9KQogICAgKTsKICB9CiAgc3ViZXhpdCgpOwogIGlmIChub2RlMi50aXRsZSkgewogICAgc3ViZXhpdCA9IHN0YXRlLmVudGVyKGB0aXRsZSR7c3VmZml4fWApOwogICAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgiICIgKyBxdW90ZSk7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKAogICAgICBzdGF0ZS5zYWZlKG5vZGUyLnRpdGxlLCB7CiAgICAgICAgYmVmb3JlOiB2YWx1ZTIsCiAgICAgICAgYWZ0ZXI6IHF1b3RlLAogICAgICAgIC4uLnRyYWNrZXIuY3VycmVudCgpCiAgICAgIH0pCiAgICApOwogICAgdmFsdWUyICs9IHRyYWNrZXIubW92ZShxdW90ZSk7CiAgICBzdWJleGl0KCk7CiAgfQogIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoIikiKTsKICBleGl0MygpOwogIHJldHVybiB2YWx1ZTI7Cn0KX19uYW1lKGltYWdlLCAiaW1hZ2UiKTsKZnVuY3Rpb24gaW1hZ2VQZWVrKCkgewogIHJldHVybiAiISI7Cn0KX19uYW1lKGltYWdlUGVlaywgImltYWdlUGVlayIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9pbWFnZS1yZWZlcmVuY2UuanMKaW1hZ2VSZWZlcmVuY2UucGVlayA9IGltYWdlUmVmZXJlbmNlUGVlazsKZnVuY3Rpb24gaW1hZ2VSZWZlcmVuY2Uobm9kZTIsIF8zLCBzdGF0ZSwgaW5mbykgewogIGNvbnN0IHR5cGU1ID0gbm9kZTIucmVmZXJlbmNlVHlwZTsKICBjb25zdCBleGl0MyA9IHN0YXRlLmVudGVyKCJpbWFnZVJlZmVyZW5jZSIpOwogIGxldCBzdWJleGl0ID0gc3RhdGUuZW50ZXIoImxhYmVsIik7CiAgY29uc3QgdHJhY2tlciA9IHN0YXRlLmNyZWF0ZVRyYWNrZXIoaW5mbyk7CiAgbGV0IHZhbHVlMiA9IHRyYWNrZXIubW92ZSgiIVsiKTsKICBjb25zdCBhbHQgPSBzdGF0ZS5zYWZlKG5vZGUyLmFsdCwgewogICAgYmVmb3JlOiB2YWx1ZTIsCiAgICBhZnRlcjogIl0iLAogICAgLi4udHJhY2tlci5jdXJyZW50KCkKICB9KTsKICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKGFsdCArICJdWyIpOwogIHN1YmV4aXQoKTsKICBjb25zdCBzdGFjayA9IHN0YXRlLnN0YWNrOwogIHN0YXRlLnN0YWNrID0gW107CiAgc3ViZXhpdCA9IHN0YXRlLmVudGVyKCJyZWZlcmVuY2UiKTsKICBjb25zdCByZWZlcmVuY2UgPSBzdGF0ZS5zYWZlKHN0YXRlLmFzc29jaWF0aW9uSWQobm9kZTIpLCB7CiAgICBiZWZvcmU6IHZhbHVlMiwKICAgIGFmdGVyOiAiXSIsCiAgICAuLi50cmFja2VyLmN1cnJlbnQoKQogIH0pOwogIHN1YmV4aXQoKTsKICBzdGF0ZS5zdGFjayA9IHN0YWNrOwogIGV4aXQzKCk7CiAgaWYgKHR5cGU1ID09PSAiZnVsbCIgfHwgIWFsdCB8fCBhbHQgIT09IHJlZmVyZW5jZSkgewogICAgdmFsdWUyICs9IHRyYWNrZXIubW92ZShyZWZlcmVuY2UgKyAiXSIpOwogIH0gZWxzZSBpZiAodHlwZTUgPT09ICJzaG9ydGN1dCIpIHsKICAgIHZhbHVlMiA9IHZhbHVlMi5zbGljZSgwLCAtMSk7CiAgfSBlbHNlIHsKICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoIl0iKTsKICB9CiAgcmV0dXJuIHZhbHVlMjsKfQpfX25hbWUoaW1hZ2VSZWZlcmVuY2UsICJpbWFnZVJlZmVyZW5jZSIpOwpmdW5jdGlvbiBpbWFnZVJlZmVyZW5jZVBlZWsoKSB7CiAgcmV0dXJuICIhIjsKfQpfX25hbWUoaW1hZ2VSZWZlcmVuY2VQZWVrLCAiaW1hZ2VSZWZlcmVuY2VQZWVrIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaGFuZGxlL2lubGluZS1jb2RlLmpzCmlubGluZUNvZGUucGVlayA9IGlubGluZUNvZGVQZWVrOwpmdW5jdGlvbiBpbmxpbmVDb2RlKG5vZGUyLCBfMywgc3RhdGUpIHsKICBsZXQgdmFsdWUyID0gbm9kZTIudmFsdWUgfHwgIiI7CiAgbGV0IHNlcXVlbmNlID0gImAiOwogIGxldCBpbmRleDIgPSAtMTsKICB3aGlsZSAobmV3IFJlZ0V4cCgiKF58W15gXSkiICsgc2VxdWVuY2UgKyAiKFteYF18JCkiKS50ZXN0KHZhbHVlMikpIHsKICAgIHNlcXVlbmNlICs9ICJgIjsKICB9CiAgaWYgKC9bXiBcclxuXS8udGVzdCh2YWx1ZTIpICYmICgvXlsgXHJcbl0vLnRlc3QodmFsdWUyKSAmJiAvWyBcclxuXSQvLnRlc3QodmFsdWUyKSB8fCAvXmB8YCQvLnRlc3QodmFsdWUyKSkpIHsKICAgIHZhbHVlMiA9ICIgIiArIHZhbHVlMiArICIgIjsKICB9CiAgd2hpbGUgKCsraW5kZXgyIDwgc3RhdGUudW5zYWZlLmxlbmd0aCkgewogICAgY29uc3QgcGF0dGVybiA9IHN0YXRlLnVuc2FmZVtpbmRleDJdOwogICAgY29uc3QgZXhwcmVzc2lvbiA9IHN0YXRlLmNvbXBpbGVQYXR0ZXJuKHBhdHRlcm4pOwogICAgbGV0IG1hdGNoMjsKICAgIGlmICghcGF0dGVybi5hdEJyZWFrKSBjb250aW51ZTsKICAgIHdoaWxlIChtYXRjaDIgPSBleHByZXNzaW9uLmV4ZWModmFsdWUyKSkgewogICAgICBsZXQgcG9zaXRpb24zID0gbWF0Y2gyLmluZGV4OwogICAgICBpZiAodmFsdWUyLmNoYXJDb2RlQXQocG9zaXRpb24zKSA9PT0gMTAgJiYgdmFsdWUyLmNoYXJDb2RlQXQocG9zaXRpb24zIC0gMSkgPT09IDEzKSB7CiAgICAgICAgcG9zaXRpb24zLS07CiAgICAgIH0KICAgICAgdmFsdWUyID0gdmFsdWUyLnNsaWNlKDAsIHBvc2l0aW9uMykgKyAiICIgKyB2YWx1ZTIuc2xpY2UobWF0Y2gyLmluZGV4ICsgMSk7CiAgICB9CiAgfQogIHJldHVybiBzZXF1ZW5jZSArIHZhbHVlMiArIHNlcXVlbmNlOwp9Cl9fbmFtZShpbmxpbmVDb2RlLCAiaW5saW5lQ29kZSIpOwpmdW5jdGlvbiBpbmxpbmVDb2RlUGVlaygpIHsKICByZXR1cm4gImAiOwp9Cl9fbmFtZShpbmxpbmVDb2RlUGVlaywgImlubGluZUNvZGVQZWVrIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9mb3JtYXQtbGluay1hcy1hdXRvbGluay5qcwpmdW5jdGlvbiBmb3JtYXRMaW5rQXNBdXRvbGluayhub2RlMiwgc3RhdGUpIHsKICBjb25zdCByYXcyID0gdG9TdHJpbmcobm9kZTIpOwogIHJldHVybiBCb29sZWFuKAogICAgIXN0YXRlLm9wdGlvbnMucmVzb3VyY2VMaW5rICYmIC8vIElmIHRoZXJl4oCZcyBhIHVybOKApgogICAgbm9kZTIudXJsICYmIC8vIEFuZCB0aGVyZeKAmXMgYSBubyB0aXRsZeKApgogICAgIW5vZGUyLnRpdGxlICYmIC8vIEFuZCB0aGUgY29udGVudCBvZiBgbm9kZWAgaXMgYSBzaW5nbGUgdGV4dCBub2Rl4oCmCiAgICBub2RlMi5jaGlsZHJlbiAmJiBub2RlMi5jaGlsZHJlbi5sZW5ndGggPT09IDEgJiYgbm9kZTIuY2hpbGRyZW5bMF0udHlwZSA9PT0gInRleHQiICYmIC8vIEFuZCBpZiB0aGUgdXJsIGlzIHRoZSBzYW1lIGFzIHRoZSBjb250ZW504oCmCiAgICAocmF3MiA9PT0gbm9kZTIudXJsIHx8ICJtYWlsdG86IiArIHJhdzIgPT09IG5vZGUyLnVybCkgJiYgLy8gQW5kIHRoYXQgc3RhcnRzIHcvIGEgcHJvdG9jb2zigKYKICAgIC9eW2Etel1bYS16Ky4tXSs6L2kudGVzdChub2RlMi51cmwpICYmIC8vIEFuZCB0aGF0IGRvZXNu4oCZdCBjb250YWluIEFTQ0lJIGNvbnRyb2wgY29kZXMgKGNoYXJhY3RlciBlc2NhcGVzIGFuZAogICAgLy8gcmVmZXJlbmNlcyBkb27igJl0IHdvcmspLCBzcGFjZSwgb3IgYW5nbGUgYnJhY2tldHPigKYKICAgICEvW1wwLSA8Plx1MDA3Rl0vLnRlc3Qobm9kZTIudXJsKQogICk7Cn0KX19uYW1lKGZvcm1hdExpbmtBc0F1dG9saW5rLCAiZm9ybWF0TGlua0FzQXV0b2xpbmsiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9oYW5kbGUvbGluay5qcwpsaW5rLnBlZWsgPSBsaW5rUGVlazsKZnVuY3Rpb24gbGluayhub2RlMiwgXzMsIHN0YXRlLCBpbmZvKSB7CiAgY29uc3QgcXVvdGUgPSBjaGVja1F1b3RlKHN0YXRlKTsKICBjb25zdCBzdWZmaXggPSBxdW90ZSA9PT0gJyInID8gIlF1b3RlIiA6ICJBcG9zdHJvcGhlIjsKICBjb25zdCB0cmFja2VyID0gc3RhdGUuY3JlYXRlVHJhY2tlcihpbmZvKTsKICBsZXQgZXhpdDM7CiAgbGV0IHN1YmV4aXQ7CiAgaWYgKGZvcm1hdExpbmtBc0F1dG9saW5rKG5vZGUyLCBzdGF0ZSkpIHsKICAgIGNvbnN0IHN0YWNrID0gc3RhdGUuc3RhY2s7CiAgICBzdGF0ZS5zdGFjayA9IFtdOwogICAgZXhpdDMgPSBzdGF0ZS5lbnRlcigiYXV0b2xpbmsiKTsKICAgIGxldCB2YWx1ZTMgPSB0cmFja2VyLm1vdmUoIjwiKTsKICAgIHZhbHVlMyArPSB0cmFja2VyLm1vdmUoCiAgICAgIHN0YXRlLmNvbnRhaW5lclBocmFzaW5nKG5vZGUyLCB7CiAgICAgICAgYmVmb3JlOiB2YWx1ZTMsCiAgICAgICAgYWZ0ZXI6ICI+IiwKICAgICAgICAuLi50cmFja2VyLmN1cnJlbnQoKQogICAgICB9KQogICAgKTsKICAgIHZhbHVlMyArPSB0cmFja2VyLm1vdmUoIj4iKTsKICAgIGV4aXQzKCk7CiAgICBzdGF0ZS5zdGFjayA9IHN0YWNrOwogICAgcmV0dXJuIHZhbHVlMzsKICB9CiAgZXhpdDMgPSBzdGF0ZS5lbnRlcigibGluayIpOwogIHN1YmV4aXQgPSBzdGF0ZS5lbnRlcigibGFiZWwiKTsKICBsZXQgdmFsdWUyID0gdHJhY2tlci5tb3ZlKCJbIik7CiAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgKICAgIHN0YXRlLmNvbnRhaW5lclBocmFzaW5nKG5vZGUyLCB7CiAgICAgIGJlZm9yZTogdmFsdWUyLAogICAgICBhZnRlcjogIl0oIiwKICAgICAgLi4udHJhY2tlci5jdXJyZW50KCkKICAgIH0pCiAgKTsKICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKCJdKCIpOwogIHN1YmV4aXQoKTsKICBpZiAoCiAgICAvLyBJZiB0aGVyZeKAmXMgbm8gdXJsIGJ1dCB0aGVyZSBpcyBhIHRpdGxl4oCmCiAgICAhbm9kZTIudXJsICYmIG5vZGUyLnRpdGxlIHx8IC8vIElmIHRoZXJlIGFyZSBjb250cm9sIGNoYXJhY3RlcnMgb3Igd2hpdGVzcGFjZS4KICAgIC9bXDAtIFx1MDA3Rl0vLnRlc3Qobm9kZTIudXJsKQogICkgewogICAgc3ViZXhpdCA9IHN0YXRlLmVudGVyKCJkZXN0aW5hdGlvbkxpdGVyYWwiKTsKICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoIjwiKTsKICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoCiAgICAgIHN0YXRlLnNhZmUobm9kZTIudXJsLCB7IGJlZm9yZTogdmFsdWUyLCBhZnRlcjogIj4iLCAuLi50cmFja2VyLmN1cnJlbnQoKSB9KQogICAgKTsKICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoIj4iKTsKICB9IGVsc2UgewogICAgc3ViZXhpdCA9IHN0YXRlLmVudGVyKCJkZXN0aW5hdGlvblJhdyIpOwogICAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgKICAgICAgc3RhdGUuc2FmZShub2RlMi51cmwsIHsKICAgICAgICBiZWZvcmU6IHZhbHVlMiwKICAgICAgICBhZnRlcjogbm9kZTIudGl0bGUgPyAiICIgOiAiKSIsCiAgICAgICAgLi4udHJhY2tlci5jdXJyZW50KCkKICAgICAgfSkKICAgICk7CiAgfQogIHN1YmV4aXQoKTsKICBpZiAobm9kZTIudGl0bGUpIHsKICAgIHN1YmV4aXQgPSBzdGF0ZS5lbnRlcihgdGl0bGUke3N1ZmZpeH1gKTsKICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoIiAiICsgcXVvdGUpOwogICAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgKICAgICAgc3RhdGUuc2FmZShub2RlMi50aXRsZSwgewogICAgICAgIGJlZm9yZTogdmFsdWUyLAogICAgICAgIGFmdGVyOiBxdW90ZSwKICAgICAgICAuLi50cmFja2VyLmN1cnJlbnQoKQogICAgICB9KQogICAgKTsKICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUocXVvdGUpOwogICAgc3ViZXhpdCgpOwogIH0KICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKCIpIik7CiAgZXhpdDMoKTsKICByZXR1cm4gdmFsdWUyOwp9Cl9fbmFtZShsaW5rLCAibGluayIpOwpmdW5jdGlvbiBsaW5rUGVlayhub2RlMiwgXzMsIHN0YXRlKSB7CiAgcmV0dXJuIGZvcm1hdExpbmtBc0F1dG9saW5rKG5vZGUyLCBzdGF0ZSkgPyAiPCIgOiAiWyI7Cn0KX19uYW1lKGxpbmtQZWVrLCAibGlua1BlZWsiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9oYW5kbGUvbGluay1yZWZlcmVuY2UuanMKbGlua1JlZmVyZW5jZS5wZWVrID0gbGlua1JlZmVyZW5jZVBlZWs7CmZ1bmN0aW9uIGxpbmtSZWZlcmVuY2Uobm9kZTIsIF8zLCBzdGF0ZSwgaW5mbykgewogIGNvbnN0IHR5cGU1ID0gbm9kZTIucmVmZXJlbmNlVHlwZTsKICBjb25zdCBleGl0MyA9IHN0YXRlLmVudGVyKCJsaW5rUmVmZXJlbmNlIik7CiAgbGV0IHN1YmV4aXQgPSBzdGF0ZS5lbnRlcigibGFiZWwiKTsKICBjb25zdCB0cmFja2VyID0gc3RhdGUuY3JlYXRlVHJhY2tlcihpbmZvKTsKICBsZXQgdmFsdWUyID0gdHJhY2tlci5tb3ZlKCJbIik7CiAgY29uc3QgdGV4dDggPSBzdGF0ZS5jb250YWluZXJQaHJhc2luZyhub2RlMiwgewogICAgYmVmb3JlOiB2YWx1ZTIsCiAgICBhZnRlcjogIl0iLAogICAgLi4udHJhY2tlci5jdXJyZW50KCkKICB9KTsKICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKHRleHQ4ICsgIl1bIik7CiAgc3ViZXhpdCgpOwogIGNvbnN0IHN0YWNrID0gc3RhdGUuc3RhY2s7CiAgc3RhdGUuc3RhY2sgPSBbXTsKICBzdWJleGl0ID0gc3RhdGUuZW50ZXIoInJlZmVyZW5jZSIpOwogIGNvbnN0IHJlZmVyZW5jZSA9IHN0YXRlLnNhZmUoc3RhdGUuYXNzb2NpYXRpb25JZChub2RlMiksIHsKICAgIGJlZm9yZTogdmFsdWUyLAogICAgYWZ0ZXI6ICJdIiwKICAgIC4uLnRyYWNrZXIuY3VycmVudCgpCiAgfSk7CiAgc3ViZXhpdCgpOwogIHN0YXRlLnN0YWNrID0gc3RhY2s7CiAgZXhpdDMoKTsKICBpZiAodHlwZTUgPT09ICJmdWxsIiB8fCAhdGV4dDggfHwgdGV4dDggIT09IHJlZmVyZW5jZSkgewogICAgdmFsdWUyICs9IHRyYWNrZXIubW92ZShyZWZlcmVuY2UgKyAiXSIpOwogIH0gZWxzZSBpZiAodHlwZTUgPT09ICJzaG9ydGN1dCIpIHsKICAgIHZhbHVlMiA9IHZhbHVlMi5zbGljZSgwLCAtMSk7CiAgfSBlbHNlIHsKICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoIl0iKTsKICB9CiAgcmV0dXJuIHZhbHVlMjsKfQpfX25hbWUobGlua1JlZmVyZW5jZSwgImxpbmtSZWZlcmVuY2UiKTsKZnVuY3Rpb24gbGlua1JlZmVyZW5jZVBlZWsoKSB7CiAgcmV0dXJuICJbIjsKfQpfX25hbWUobGlua1JlZmVyZW5jZVBlZWssICJsaW5rUmVmZXJlbmNlUGVlayIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvY2hlY2stYnVsbGV0LmpzCmZ1bmN0aW9uIGNoZWNrQnVsbGV0KHN0YXRlKSB7CiAgY29uc3QgbWFya2VyID0gc3RhdGUub3B0aW9ucy5idWxsZXQgfHwgIioiOwogIGlmIChtYXJrZXIgIT09ICIqIiAmJiBtYXJrZXIgIT09ICIrIiAmJiBtYXJrZXIgIT09ICItIikgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAiQ2Fubm90IHNlcmlhbGl6ZSBpdGVtcyB3aXRoIGAiICsgbWFya2VyICsgImAgZm9yIGBvcHRpb25zLmJ1bGxldGAsIGV4cGVjdGVkIGAqYCwgYCtgLCBvciBgLWAiCiAgICApOwogIH0KICByZXR1cm4gbWFya2VyOwp9Cl9fbmFtZShjaGVja0J1bGxldCwgImNoZWNrQnVsbGV0Iik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9jaGVjay1idWxsZXQtb3RoZXIuanMKZnVuY3Rpb24gY2hlY2tCdWxsZXRPdGhlcihzdGF0ZSkgewogIGNvbnN0IGJ1bGxldCA9IGNoZWNrQnVsbGV0KHN0YXRlKTsKICBjb25zdCBidWxsZXRPdGhlciA9IHN0YXRlLm9wdGlvbnMuYnVsbGV0T3RoZXI7CiAgaWYgKCFidWxsZXRPdGhlcikgewogICAgcmV0dXJuIGJ1bGxldCA9PT0gIioiID8gIi0iIDogIioiOwogIH0KICBpZiAoYnVsbGV0T3RoZXIgIT09ICIqIiAmJiBidWxsZXRPdGhlciAhPT0gIisiICYmIGJ1bGxldE90aGVyICE9PSAiLSIpIHsKICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgIkNhbm5vdCBzZXJpYWxpemUgaXRlbXMgd2l0aCBgIiArIGJ1bGxldE90aGVyICsgImAgZm9yIGBvcHRpb25zLmJ1bGxldE90aGVyYCwgZXhwZWN0ZWQgYCpgLCBgK2AsIG9yIGAtYCIKICAgICk7CiAgfQogIGlmIChidWxsZXRPdGhlciA9PT0gYnVsbGV0KSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICJFeHBlY3RlZCBgYnVsbGV0YCAoYCIgKyBidWxsZXQgKyAiYCkgYW5kIGBidWxsZXRPdGhlcmAgKGAiICsgYnVsbGV0T3RoZXIgKyAiYCkgdG8gYmUgZGlmZmVyZW50IgogICAgKTsKICB9CiAgcmV0dXJuIGJ1bGxldE90aGVyOwp9Cl9fbmFtZShjaGVja0J1bGxldE90aGVyLCAiY2hlY2tCdWxsZXRPdGhlciIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvY2hlY2stYnVsbGV0LW9yZGVyZWQuanMKZnVuY3Rpb24gY2hlY2tCdWxsZXRPcmRlcmVkKHN0YXRlKSB7CiAgY29uc3QgbWFya2VyID0gc3RhdGUub3B0aW9ucy5idWxsZXRPcmRlcmVkIHx8ICIuIjsKICBpZiAobWFya2VyICE9PSAiLiIgJiYgbWFya2VyICE9PSAiKSIpIHsKICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgIkNhbm5vdCBzZXJpYWxpemUgaXRlbXMgd2l0aCBgIiArIG1hcmtlciArICJgIGZvciBgb3B0aW9ucy5idWxsZXRPcmRlcmVkYCwgZXhwZWN0ZWQgYC5gIG9yIGApYCIKICAgICk7CiAgfQogIHJldHVybiBtYXJrZXI7Cn0KX19uYW1lKGNoZWNrQnVsbGV0T3JkZXJlZCwgImNoZWNrQnVsbGV0T3JkZXJlZCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvY2hlY2stcnVsZS5qcwpmdW5jdGlvbiBjaGVja1J1bGUoc3RhdGUpIHsKICBjb25zdCBtYXJrZXIgPSBzdGF0ZS5vcHRpb25zLnJ1bGUgfHwgIioiOwogIGlmIChtYXJrZXIgIT09ICIqIiAmJiBtYXJrZXIgIT09ICItIiAmJiBtYXJrZXIgIT09ICJfIikgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAiQ2Fubm90IHNlcmlhbGl6ZSBydWxlcyB3aXRoIGAiICsgbWFya2VyICsgImAgZm9yIGBvcHRpb25zLnJ1bGVgLCBleHBlY3RlZCBgKmAsIGAtYCwgb3IgYF9gIgogICAgKTsKICB9CiAgcmV0dXJuIG1hcmtlcjsKfQpfX25hbWUoY2hlY2tSdWxlLCAiY2hlY2tSdWxlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaGFuZGxlL2xpc3QuanMKZnVuY3Rpb24gbGlzdDIobm9kZTIsIHBhcmVudCwgc3RhdGUsIGluZm8pIHsKICBjb25zdCBleGl0MyA9IHN0YXRlLmVudGVyKCJsaXN0Iik7CiAgY29uc3QgYnVsbGV0Q3VycmVudCA9IHN0YXRlLmJ1bGxldEN1cnJlbnQ7CiAgbGV0IGJ1bGxldCA9IG5vZGUyLm9yZGVyZWQgPyBjaGVja0J1bGxldE9yZGVyZWQoc3RhdGUpIDogY2hlY2tCdWxsZXQoc3RhdGUpOwogIGNvbnN0IGJ1bGxldE90aGVyID0gbm9kZTIub3JkZXJlZCA/IGJ1bGxldCA9PT0gIi4iID8gIikiIDogIi4iIDogY2hlY2tCdWxsZXRPdGhlcihzdGF0ZSk7CiAgbGV0IHVzZURpZmZlcmVudE1hcmtlciA9IHBhcmVudCAmJiBzdGF0ZS5idWxsZXRMYXN0VXNlZCA/IGJ1bGxldCA9PT0gc3RhdGUuYnVsbGV0TGFzdFVzZWQgOiBmYWxzZTsKICBpZiAoIW5vZGUyLm9yZGVyZWQpIHsKICAgIGNvbnN0IGZpcnN0TGlzdEl0ZW0gPSBub2RlMi5jaGlsZHJlbiA/IG5vZGUyLmNoaWxkcmVuWzBdIDogdm9pZCAwOwogICAgaWYgKAogICAgICAvLyBCdWxsZXQgY291bGQgYmUgdXNlZCBhcyBhIHRoZW1hdGljIGJyZWFrIG1hcmtlcjoKICAgICAgKGJ1bGxldCA9PT0gIioiIHx8IGJ1bGxldCA9PT0gIi0iKSAmJiAvLyBFbXB0eSBmaXJzdCBsaXN0IGl0ZW06CiAgICAgIGZpcnN0TGlzdEl0ZW0gJiYgKCFmaXJzdExpc3RJdGVtLmNoaWxkcmVuIHx8ICFmaXJzdExpc3RJdGVtLmNoaWxkcmVuWzBdKSAmJiAvLyBEaXJlY3RseSBpbiB0d28gb3RoZXIgbGlzdCBpdGVtczoKICAgICAgc3RhdGUuc3RhY2tbc3RhdGUuc3RhY2subGVuZ3RoIC0gMV0gPT09ICJsaXN0IiAmJiBzdGF0ZS5zdGFja1tzdGF0ZS5zdGFjay5sZW5ndGggLSAyXSA9PT0gImxpc3RJdGVtIiAmJiBzdGF0ZS5zdGFja1tzdGF0ZS5zdGFjay5sZW5ndGggLSAzXSA9PT0gImxpc3QiICYmIHN0YXRlLnN0YWNrW3N0YXRlLnN0YWNrLmxlbmd0aCAtIDRdID09PSAibGlzdEl0ZW0iICYmIC8vIFRoYXQgYXJlIGVhY2ggdGhlIGZpcnN0IGNoaWxkLgogICAgICBzdGF0ZS5pbmRleFN0YWNrW3N0YXRlLmluZGV4U3RhY2subGVuZ3RoIC0gMV0gPT09IDAgJiYgc3RhdGUuaW5kZXhTdGFja1tzdGF0ZS5pbmRleFN0YWNrLmxlbmd0aCAtIDJdID09PSAwICYmIHN0YXRlLmluZGV4U3RhY2tbc3RhdGUuaW5kZXhTdGFjay5sZW5ndGggLSAzXSA9PT0gMAogICAgKSB7CiAgICAgIHVzZURpZmZlcmVudE1hcmtlciA9IHRydWU7CiAgICB9CiAgICBpZiAoY2hlY2tSdWxlKHN0YXRlKSA9PT0gYnVsbGV0ICYmIGZpcnN0TGlzdEl0ZW0pIHsKICAgICAgbGV0IGluZGV4MiA9IC0xOwogICAgICB3aGlsZSAoKytpbmRleDIgPCBub2RlMi5jaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgICBjb25zdCBpdGVtID0gbm9kZTIuY2hpbGRyZW5baW5kZXgyXTsKICAgICAgICBpZiAoaXRlbSAmJiBpdGVtLnR5cGUgPT09ICJsaXN0SXRlbSIgJiYgaXRlbS5jaGlsZHJlbiAmJiBpdGVtLmNoaWxkcmVuWzBdICYmIGl0ZW0uY2hpbGRyZW5bMF0udHlwZSA9PT0gInRoZW1hdGljQnJlYWsiKSB7CiAgICAgICAgICB1c2VEaWZmZXJlbnRNYXJrZXIgPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIGlmICh1c2VEaWZmZXJlbnRNYXJrZXIpIHsKICAgIGJ1bGxldCA9IGJ1bGxldE90aGVyOwogIH0KICBzdGF0ZS5idWxsZXRDdXJyZW50ID0gYnVsbGV0OwogIGNvbnN0IHZhbHVlMiA9IHN0YXRlLmNvbnRhaW5lckZsb3cobm9kZTIsIGluZm8pOwogIHN0YXRlLmJ1bGxldExhc3RVc2VkID0gYnVsbGV0OwogIHN0YXRlLmJ1bGxldEN1cnJlbnQgPSBidWxsZXRDdXJyZW50OwogIGV4aXQzKCk7CiAgcmV0dXJuIHZhbHVlMjsKfQpfX25hbWUobGlzdDIsICJsaXN0Iik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9jaGVjay1saXN0LWl0ZW0taW5kZW50LmpzCmZ1bmN0aW9uIGNoZWNrTGlzdEl0ZW1JbmRlbnQoc3RhdGUpIHsKICBjb25zdCBzdHlsZSA9IHN0YXRlLm9wdGlvbnMubGlzdEl0ZW1JbmRlbnQgfHwgIm9uZSI7CiAgaWYgKHN0eWxlICE9PSAidGFiIiAmJiBzdHlsZSAhPT0gIm9uZSIgJiYgc3R5bGUgIT09ICJtaXhlZCIpIHsKICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgIkNhbm5vdCBzZXJpYWxpemUgaXRlbXMgd2l0aCBgIiArIHN0eWxlICsgImAgZm9yIGBvcHRpb25zLmxpc3RJdGVtSW5kZW50YCwgZXhwZWN0ZWQgYHRhYmAsIGBvbmVgLCBvciBgbWl4ZWRgIgogICAgKTsKICB9CiAgcmV0dXJuIHN0eWxlOwp9Cl9fbmFtZShjaGVja0xpc3RJdGVtSW5kZW50LCAiY2hlY2tMaXN0SXRlbUluZGVudCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9saXN0LWl0ZW0uanMKZnVuY3Rpb24gbGlzdEl0ZW0obm9kZTIsIHBhcmVudCwgc3RhdGUsIGluZm8pIHsKICBjb25zdCBsaXN0SXRlbUluZGVudCA9IGNoZWNrTGlzdEl0ZW1JbmRlbnQoc3RhdGUpOwogIGxldCBidWxsZXQgPSBzdGF0ZS5idWxsZXRDdXJyZW50IHx8IGNoZWNrQnVsbGV0KHN0YXRlKTsKICBpZiAocGFyZW50ICYmIHBhcmVudC50eXBlID09PSAibGlzdCIgJiYgcGFyZW50Lm9yZGVyZWQpIHsKICAgIGJ1bGxldCA9ICh0eXBlb2YgcGFyZW50LnN0YXJ0ID09PSAibnVtYmVyIiAmJiBwYXJlbnQuc3RhcnQgPiAtMSA/IHBhcmVudC5zdGFydCA6IDEpICsgKHN0YXRlLm9wdGlvbnMuaW5jcmVtZW50TGlzdE1hcmtlciA9PT0gZmFsc2UgPyAwIDogcGFyZW50LmNoaWxkcmVuLmluZGV4T2Yobm9kZTIpKSArIGJ1bGxldDsKICB9CiAgbGV0IHNpemUgPSBidWxsZXQubGVuZ3RoICsgMTsKICBpZiAobGlzdEl0ZW1JbmRlbnQgPT09ICJ0YWIiIHx8IGxpc3RJdGVtSW5kZW50ID09PSAibWl4ZWQiICYmIChwYXJlbnQgJiYgcGFyZW50LnR5cGUgPT09ICJsaXN0IiAmJiBwYXJlbnQuc3ByZWFkIHx8IG5vZGUyLnNwcmVhZCkpIHsKICAgIHNpemUgPSBNYXRoLmNlaWwoc2l6ZSAvIDQpICogNDsKICB9CiAgY29uc3QgdHJhY2tlciA9IHN0YXRlLmNyZWF0ZVRyYWNrZXIoaW5mbyk7CiAgdHJhY2tlci5tb3ZlKGJ1bGxldCArICIgIi5yZXBlYXQoc2l6ZSAtIGJ1bGxldC5sZW5ndGgpKTsKICB0cmFja2VyLnNoaWZ0KHNpemUpOwogIGNvbnN0IGV4aXQzID0gc3RhdGUuZW50ZXIoImxpc3RJdGVtIik7CiAgY29uc3QgdmFsdWUyID0gc3RhdGUuaW5kZW50TGluZXMoCiAgICBzdGF0ZS5jb250YWluZXJGbG93KG5vZGUyLCB0cmFja2VyLmN1cnJlbnQoKSksCiAgICBtYXA3CiAgKTsKICBleGl0MygpOwogIHJldHVybiB2YWx1ZTI7CiAgZnVuY3Rpb24gbWFwNyhsaW5lLCBpbmRleDIsIGJsYW5rKSB7CiAgICBpZiAoaW5kZXgyKSB7CiAgICAgIHJldHVybiAoYmxhbmsgPyAiIiA6ICIgIi5yZXBlYXQoc2l6ZSkpICsgbGluZTsKICAgIH0KICAgIHJldHVybiAoYmxhbmsgPyBidWxsZXQgOiBidWxsZXQgKyAiICIucmVwZWF0KHNpemUgLSBidWxsZXQubGVuZ3RoKSkgKyBsaW5lOwogIH0KICBfX25hbWUobWFwNywgIm1hcCIpOwp9Cl9fbmFtZShsaXN0SXRlbSwgImxpc3RJdGVtIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaGFuZGxlL3BhcmFncmFwaC5qcwpmdW5jdGlvbiBwYXJhZ3JhcGgobm9kZTIsIF8zLCBzdGF0ZSwgaW5mbykgewogIGNvbnN0IGV4aXQzID0gc3RhdGUuZW50ZXIoInBhcmFncmFwaCIpOwogIGNvbnN0IHN1YmV4aXQgPSBzdGF0ZS5lbnRlcigicGhyYXNpbmciKTsKICBjb25zdCB2YWx1ZTIgPSBzdGF0ZS5jb250YWluZXJQaHJhc2luZyhub2RlMiwgaW5mbyk7CiAgc3ViZXhpdCgpOwogIGV4aXQzKCk7CiAgcmV0dXJuIHZhbHVlMjsKfQpfX25hbWUocGFyYWdyYXBoLCAicGFyYWdyYXBoIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC1waHJhc2luZ0A0LjEuMC9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1waHJhc2luZy9saWIvaW5kZXguanMKdmFyIHBocmFzaW5nID0gKAogIC8qKiBAdHlwZSB7KG5vZGU/OiB1bmtub3duKSA9PiBub2RlIGlzIEV4Y2x1ZGU8UGhyYXNpbmdDb250ZW50LCBIdG1sPn0gKi8KICBjb252ZXJ0KFsKICAgICJicmVhayIsCiAgICAiZGVsZXRlIiwKICAgICJlbXBoYXNpcyIsCiAgICAvLyBUbyBkbzogbmV4dCBtYWpvcjogcmVtb3ZlZCBzaW5jZSBmb290bm90ZXMgd2VyZSBhZGRlZCB0byBHRk0uCiAgICAiZm9vdG5vdGUiLAogICAgImZvb3Rub3RlUmVmZXJlbmNlIiwKICAgICJpbWFnZSIsCiAgICAiaW1hZ2VSZWZlcmVuY2UiLAogICAgImlubGluZUNvZGUiLAogICAgLy8gRW5hYmxlZCBieSBgbWRhc3QtdXRpbC1tYXRoYDoKICAgICJpbmxpbmVNYXRoIiwKICAgICJsaW5rIiwKICAgICJsaW5rUmVmZXJlbmNlIiwKICAgIC8vIEVuYWJsZWQgYnkgYG1kYXN0LXV0aWwtbWR4YDoKICAgICJtZHhKc3hUZXh0RWxlbWVudCIsCiAgICAvLyBFbmFibGVkIGJ5IGBtZGFzdC11dGlsLW1keGA6CiAgICAibWR4VGV4dEV4cHJlc3Npb24iLAogICAgInN0cm9uZyIsCiAgICAidGV4dCIsCiAgICAvLyBFbmFibGVkIGJ5IGBtZGFzdC11dGlsLWRpcmVjdGl2ZWA6CiAgICAidGV4dERpcmVjdGl2ZSIKICBdKQopOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9yb290LmpzCmZ1bmN0aW9uIHJvb3Qobm9kZTIsIF8zLCBzdGF0ZSwgaW5mbykgewogIGNvbnN0IGhhc1BocmFzaW5nID0gbm9kZTIuY2hpbGRyZW4uc29tZShmdW5jdGlvbihkNCkgewogICAgcmV0dXJuIHBocmFzaW5nKGQ0KTsKICB9KTsKICBjb25zdCBjb250YWluZXIgPSBoYXNQaHJhc2luZyA/IHN0YXRlLmNvbnRhaW5lclBocmFzaW5nIDogc3RhdGUuY29udGFpbmVyRmxvdzsKICByZXR1cm4gY29udGFpbmVyLmNhbGwoc3RhdGUsIG5vZGUyLCBpbmZvKTsKfQpfX25hbWUocm9vdCwgInJvb3QiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2NoZWNrLXN0cm9uZy5qcwpmdW5jdGlvbiBjaGVja1N0cm9uZyhzdGF0ZSkgewogIGNvbnN0IG1hcmtlciA9IHN0YXRlLm9wdGlvbnMuc3Ryb25nIHx8ICIqIjsKICBpZiAobWFya2VyICE9PSAiKiIgJiYgbWFya2VyICE9PSAiXyIpIHsKICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgIkNhbm5vdCBzZXJpYWxpemUgc3Ryb25nIHdpdGggYCIgKyBtYXJrZXIgKyAiYCBmb3IgYG9wdGlvbnMuc3Ryb25nYCwgZXhwZWN0ZWQgYCpgLCBvciBgX2AiCiAgICApOwogIH0KICByZXR1cm4gbWFya2VyOwp9Cl9fbmFtZShjaGVja1N0cm9uZywgImNoZWNrU3Ryb25nIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaGFuZGxlL3N0cm9uZy5qcwpzdHJvbmcucGVlayA9IHN0cm9uZ1BlZWs7CmZ1bmN0aW9uIHN0cm9uZyhub2RlMiwgXzMsIHN0YXRlLCBpbmZvKSB7CiAgY29uc3QgbWFya2VyID0gY2hlY2tTdHJvbmcoc3RhdGUpOwogIGNvbnN0IGV4aXQzID0gc3RhdGUuZW50ZXIoInN0cm9uZyIpOwogIGNvbnN0IHRyYWNrZXIgPSBzdGF0ZS5jcmVhdGVUcmFja2VyKGluZm8pOwogIGNvbnN0IGJlZm9yZSA9IHRyYWNrZXIubW92ZShtYXJrZXIgKyBtYXJrZXIpOwogIGxldCBiZXR3ZWVuMiA9IHRyYWNrZXIubW92ZSgKICAgIHN0YXRlLmNvbnRhaW5lclBocmFzaW5nKG5vZGUyLCB7CiAgICAgIGFmdGVyOiBtYXJrZXIsCiAgICAgIGJlZm9yZSwKICAgICAgLi4udHJhY2tlci5jdXJyZW50KCkKICAgIH0pCiAgKTsKICBjb25zdCBiZXR3ZWVuSGVhZCA9IGJldHdlZW4yLmNoYXJDb2RlQXQoMCk7CiAgY29uc3Qgb3BlbiA9IGVuY29kZUluZm8oCiAgICBpbmZvLmJlZm9yZS5jaGFyQ29kZUF0KGluZm8uYmVmb3JlLmxlbmd0aCAtIDEpLAogICAgYmV0d2VlbkhlYWQsCiAgICBtYXJrZXIKICApOwogIGlmIChvcGVuLmluc2lkZSkgewogICAgYmV0d2VlbjIgPSBlbmNvZGVDaGFyYWN0ZXJSZWZlcmVuY2UoYmV0d2VlbkhlYWQpICsgYmV0d2VlbjIuc2xpY2UoMSk7CiAgfQogIGNvbnN0IGJldHdlZW5UYWlsID0gYmV0d2VlbjIuY2hhckNvZGVBdChiZXR3ZWVuMi5sZW5ndGggLSAxKTsKICBjb25zdCBjbG9zZTcgPSBlbmNvZGVJbmZvKGluZm8uYWZ0ZXIuY2hhckNvZGVBdCgwKSwgYmV0d2VlblRhaWwsIG1hcmtlcik7CiAgaWYgKGNsb3NlNy5pbnNpZGUpIHsKICAgIGJldHdlZW4yID0gYmV0d2VlbjIuc2xpY2UoMCwgLTEpICsgZW5jb2RlQ2hhcmFjdGVyUmVmZXJlbmNlKGJldHdlZW5UYWlsKTsKICB9CiAgY29uc3QgYWZ0ZXIgPSB0cmFja2VyLm1vdmUobWFya2VyICsgbWFya2VyKTsKICBleGl0MygpOwogIHN0YXRlLmF0dGVudGlvbkVuY29kZVN1cnJvdW5kaW5nSW5mbyA9IHsKICAgIGFmdGVyOiBjbG9zZTcub3V0c2lkZSwKICAgIGJlZm9yZTogb3Blbi5vdXRzaWRlCiAgfTsKICByZXR1cm4gYmVmb3JlICsgYmV0d2VlbjIgKyBhZnRlcjsKfQpfX25hbWUoc3Ryb25nLCAic3Ryb25nIik7CmZ1bmN0aW9uIHN0cm9uZ1BlZWsoXzMsIF8xLCBzdGF0ZSkgewogIHJldHVybiBzdGF0ZS5vcHRpb25zLnN0cm9uZyB8fCAiKiI7Cn0KX19uYW1lKHN0cm9uZ1BlZWssICJzdHJvbmdQZWVrIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaGFuZGxlL3RleHQuanMKZnVuY3Rpb24gdGV4dChub2RlMiwgXzMsIHN0YXRlLCBpbmZvKSB7CiAgcmV0dXJuIHN0YXRlLnNhZmUobm9kZTIudmFsdWUsIGluZm8pOwp9Cl9fbmFtZSh0ZXh0LCAidGV4dCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvY2hlY2stcnVsZS1yZXBldGl0aW9uLmpzCmZ1bmN0aW9uIGNoZWNrUnVsZVJlcGV0aXRpb24oc3RhdGUpIHsKICBjb25zdCByZXBldGl0aW9uID0gc3RhdGUub3B0aW9ucy5ydWxlUmVwZXRpdGlvbiB8fCAzOwogIGlmIChyZXBldGl0aW9uIDwgMykgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAiQ2Fubm90IHNlcmlhbGl6ZSBydWxlcyB3aXRoIHJlcGV0aXRpb24gYCIgKyByZXBldGl0aW9uICsgImAgZm9yIGBvcHRpb25zLnJ1bGVSZXBldGl0aW9uYCwgZXhwZWN0ZWQgYDNgIG9yIG1vcmUiCiAgICApOwogIH0KICByZXR1cm4gcmVwZXRpdGlvbjsKfQpfX25hbWUoY2hlY2tSdWxlUmVwZXRpdGlvbiwgImNoZWNrUnVsZVJlcGV0aXRpb24iKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9oYW5kbGUvdGhlbWF0aWMtYnJlYWsuanMKZnVuY3Rpb24gdGhlbWF0aWNCcmVhayhfMywgXzEsIHN0YXRlKSB7CiAgY29uc3QgdmFsdWUyID0gKGNoZWNrUnVsZShzdGF0ZSkgKyAoc3RhdGUub3B0aW9ucy5ydWxlU3BhY2VzID8gIiAiIDogIiIpKS5yZXBlYXQoY2hlY2tSdWxlUmVwZXRpdGlvbihzdGF0ZSkpOwogIHJldHVybiBzdGF0ZS5vcHRpb25zLnJ1bGVTcGFjZXMgPyB2YWx1ZTIuc2xpY2UoMCwgLTEpIDogdmFsdWUyOwp9Cl9fbmFtZSh0aGVtYXRpY0JyZWFrLCAidGhlbWF0aWNCcmVhayIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9pbmRleC5qcwp2YXIgaGFuZGxlID0gewogIGJsb2NrcXVvdGUsCiAgYnJlYWs6IGhhcmRCcmVhaywKICBjb2RlLAogIGRlZmluaXRpb24sCiAgZW1waGFzaXMsCiAgaGFyZEJyZWFrLAogIGhlYWRpbmcsCiAgaHRtbCwKICBpbWFnZSwKICBpbWFnZVJlZmVyZW5jZSwKICBpbmxpbmVDb2RlLAogIGxpbmssCiAgbGlua1JlZmVyZW5jZSwKICBsaXN0OiBsaXN0MiwKICBsaXN0SXRlbSwKICBwYXJhZ3JhcGgsCiAgcm9vdCwKICBzdHJvbmcsCiAgdGV4dCwKICB0aGVtYXRpY0JyZWFrCn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvam9pbi5qcwp2YXIgam9pbjIgPSBbam9pbkRlZmF1bHRzXTsKZnVuY3Rpb24gam9pbkRlZmF1bHRzKGxlZnQsIHJpZ2h0LCBwYXJlbnQsIHN0YXRlKSB7CiAgaWYgKHJpZ2h0LnR5cGUgPT09ICJjb2RlIiAmJiBmb3JtYXRDb2RlQXNJbmRlbnRlZChyaWdodCwgc3RhdGUpICYmIChsZWZ0LnR5cGUgPT09ICJsaXN0IiB8fCBsZWZ0LnR5cGUgPT09IHJpZ2h0LnR5cGUgJiYgZm9ybWF0Q29kZUFzSW5kZW50ZWQobGVmdCwgc3RhdGUpKSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBpZiAoInNwcmVhZCIgaW4gcGFyZW50ICYmIHR5cGVvZiBwYXJlbnQuc3ByZWFkID09PSAiYm9vbGVhbiIpIHsKICAgIGlmIChsZWZ0LnR5cGUgPT09ICJwYXJhZ3JhcGgiICYmIC8vIFR3byBwYXJhZ3JhcGhzLgogICAgKGxlZnQudHlwZSA9PT0gcmlnaHQudHlwZSB8fCByaWdodC50eXBlID09PSAiZGVmaW5pdGlvbiIgfHwgLy8gUGFyYWdyYXBoIGZvbGxvd2VkIGJ5IGEgc2V0ZXh0IGhlYWRpbmcuCiAgICByaWdodC50eXBlID09PSAiaGVhZGluZyIgJiYgZm9ybWF0SGVhZGluZ0FzU2V0ZXh0KHJpZ2h0LCBzdGF0ZSkpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHJldHVybiBwYXJlbnQuc3ByZWFkID8gMSA6IDA7CiAgfQp9Cl9fbmFtZShqb2luRGVmYXVsdHMsICJqb2luRGVmYXVsdHMiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91bnNhZmUuanMKdmFyIGZ1bGxQaHJhc2luZ1NwYW5zID0gWwogICJhdXRvbGluayIsCiAgImRlc3RpbmF0aW9uTGl0ZXJhbCIsCiAgImRlc3RpbmF0aW9uUmF3IiwKICAicmVmZXJlbmNlIiwKICAidGl0bGVRdW90ZSIsCiAgInRpdGxlQXBvc3Ryb3BoZSIKXTsKdmFyIHVuc2FmZSA9IFsKICB7IGNoYXJhY3RlcjogIgkiLCBhZnRlcjogIltcXHJcXG5dIiwgaW5Db25zdHJ1Y3Q6ICJwaHJhc2luZyIgfSwKICB7IGNoYXJhY3RlcjogIgkiLCBiZWZvcmU6ICJbXFxyXFxuXSIsIGluQ29uc3RydWN0OiAicGhyYXNpbmciIH0sCiAgewogICAgY2hhcmFjdGVyOiAiCSIsCiAgICBpbkNvbnN0cnVjdDogWyJjb2RlRmVuY2VkTGFuZ0dyYXZlQWNjZW50IiwgImNvZGVGZW5jZWRMYW5nVGlsZGUiXQogIH0sCiAgewogICAgY2hhcmFjdGVyOiAiXHIiLAogICAgaW5Db25zdHJ1Y3Q6IFsKICAgICAgImNvZGVGZW5jZWRMYW5nR3JhdmVBY2NlbnQiLAogICAgICAiY29kZUZlbmNlZExhbmdUaWxkZSIsCiAgICAgICJjb2RlRmVuY2VkTWV0YUdyYXZlQWNjZW50IiwKICAgICAgImNvZGVGZW5jZWRNZXRhVGlsZGUiLAogICAgICAiZGVzdGluYXRpb25MaXRlcmFsIiwKICAgICAgImhlYWRpbmdBdHgiCiAgICBdCiAgfSwKICB7CiAgICBjaGFyYWN0ZXI6ICJcbiIsCiAgICBpbkNvbnN0cnVjdDogWwogICAgICAiY29kZUZlbmNlZExhbmdHcmF2ZUFjY2VudCIsCiAgICAgICJjb2RlRmVuY2VkTGFuZ1RpbGRlIiwKICAgICAgImNvZGVGZW5jZWRNZXRhR3JhdmVBY2NlbnQiLAogICAgICAiY29kZUZlbmNlZE1ldGFUaWxkZSIsCiAgICAgICJkZXN0aW5hdGlvbkxpdGVyYWwiLAogICAgICAiaGVhZGluZ0F0eCIKICAgIF0KICB9LAogIHsgY2hhcmFjdGVyOiAiICIsIGFmdGVyOiAiW1xcclxcbl0iLCBpbkNvbnN0cnVjdDogInBocmFzaW5nIiB9LAogIHsgY2hhcmFjdGVyOiAiICIsIGJlZm9yZTogIltcXHJcXG5dIiwgaW5Db25zdHJ1Y3Q6ICJwaHJhc2luZyIgfSwKICB7CiAgICBjaGFyYWN0ZXI6ICIgIiwKICAgIGluQ29uc3RydWN0OiBbImNvZGVGZW5jZWRMYW5nR3JhdmVBY2NlbnQiLCAiY29kZUZlbmNlZExhbmdUaWxkZSJdCiAgfSwKICAvLyBBbiBleGNsYW1hdGlvbiBtYXJrIGNhbiBzdGFydCBhbiBpbWFnZSwgaWYgaXQgaXMgZm9sbG93ZWQgYnkgYSBsaW5rIG9yCiAgLy8gYSBsaW5rIHJlZmVyZW5jZS4KICB7CiAgICBjaGFyYWN0ZXI6ICIhIiwKICAgIGFmdGVyOiAiXFxbIiwKICAgIGluQ29uc3RydWN0OiAicGhyYXNpbmciLAogICAgbm90SW5Db25zdHJ1Y3Q6IGZ1bGxQaHJhc2luZ1NwYW5zCiAgfSwKICAvLyBBIHF1b3RlIGNhbiBicmVhayBvdXQgb2YgYSB0aXRsZS4KICB7IGNoYXJhY3RlcjogJyInLCBpbkNvbnN0cnVjdDogInRpdGxlUXVvdGUiIH0sCiAgLy8gQSBudW1iZXIgc2lnbiBjb3VsZCBzdGFydCBhbiBBVFggaGVhZGluZyBpZiBpdCBzdGFydHMgYSBsaW5lLgogIHsgYXRCcmVhazogdHJ1ZSwgY2hhcmFjdGVyOiAiIyIgfSwKICB7IGNoYXJhY3RlcjogIiMiLCBpbkNvbnN0cnVjdDogImhlYWRpbmdBdHgiLCBhZnRlcjogIig/OltcclxuXXwkKSIgfSwKICAvLyBEb2xsYXIgc2lnbiBhbmQgcGVyY2VudGFnZSBhcmUgbm90IHVzZWQgaW4gbWFya2Rvd24uCiAgLy8gQW4gYW1wZXJzYW5kIGNvdWxkIHN0YXJ0IGEgY2hhcmFjdGVyIHJlZmVyZW5jZS4KICB7IGNoYXJhY3RlcjogIiYiLCBhZnRlcjogIlsjQS1aYS16XSIsIGluQ29uc3RydWN0OiAicGhyYXNpbmciIH0sCiAgLy8gQW4gYXBvc3Ryb3BoZSBjYW4gYnJlYWsgb3V0IG9mIGEgdGl0bGUuCiAgeyBjaGFyYWN0ZXI6ICInIiwgaW5Db25zdHJ1Y3Q6ICJ0aXRsZUFwb3N0cm9waGUiIH0sCiAgLy8gQSBsZWZ0IHBhcmVuIGNvdWxkIGJyZWFrIG91dCBvZiBhIGRlc3RpbmF0aW9uIHJhdy4KICB7IGNoYXJhY3RlcjogIigiLCBpbkNvbnN0cnVjdDogImRlc3RpbmF0aW9uUmF3IiB9LAogIC8vIEEgbGVmdCBwYXJlbiBmb2xsb3dlZCBieSBgXWAgY291bGQgbWFrZSBzb21ldGhpbmcgaW50byBhIGxpbmsgb3IgaW1hZ2UuCiAgewogICAgYmVmb3JlOiAiXFxdIiwKICAgIGNoYXJhY3RlcjogIigiLAogICAgaW5Db25zdHJ1Y3Q6ICJwaHJhc2luZyIsCiAgICBub3RJbkNvbnN0cnVjdDogZnVsbFBocmFzaW5nU3BhbnMKICB9LAogIC8vIEEgcmlnaHQgcGFyZW4gY291bGQgc3RhcnQgYSBsaXN0IGl0ZW0gb3IgYnJlYWsgb3V0IG9mIGEgZGVzdGluYXRpb24KICAvLyByYXcuCiAgeyBhdEJyZWFrOiB0cnVlLCBiZWZvcmU6ICJcXGQrIiwgY2hhcmFjdGVyOiAiKSIgfSwKICB7IGNoYXJhY3RlcjogIikiLCBpbkNvbnN0cnVjdDogImRlc3RpbmF0aW9uUmF3IiB9LAogIC8vIEFuIGFzdGVyaXNrIGNhbiBzdGFydCB0aGVtYXRpYyBicmVha3MsIGxpc3QgaXRlbXMsIGVtcGhhc2lzLCBzdHJvbmcuCiAgeyBhdEJyZWFrOiB0cnVlLCBjaGFyYWN0ZXI6ICIqIiwgYWZ0ZXI6ICIoPzpbIAlcclxuKl0pIiB9LAogIHsgY2hhcmFjdGVyOiAiKiIsIGluQ29uc3RydWN0OiAicGhyYXNpbmciLCBub3RJbkNvbnN0cnVjdDogZnVsbFBocmFzaW5nU3BhbnMgfSwKICAvLyBBIHBsdXMgc2lnbiBjb3VsZCBzdGFydCBhIGxpc3QgaXRlbS4KICB7IGF0QnJlYWs6IHRydWUsIGNoYXJhY3RlcjogIisiLCBhZnRlcjogIig/OlsgCVxyXG5dKSIgfSwKICAvLyBBIGRhc2ggY2FuIHN0YXJ0IHRoZW1hdGljIGJyZWFrcywgbGlzdCBpdGVtcywgYW5kIHNldGV4dCBoZWFkaW5nCiAgLy8gdW5kZXJsaW5lcy4KICB7IGF0QnJlYWs6IHRydWUsIGNoYXJhY3RlcjogIi0iLCBhZnRlcjogIig/OlsgCVxyXG4tXSkiIH0sCiAgLy8gQSBkb3QgY291bGQgc3RhcnQgYSBsaXN0IGl0ZW0uCiAgeyBhdEJyZWFrOiB0cnVlLCBiZWZvcmU6ICJcXGQrIiwgY2hhcmFjdGVyOiAiLiIsIGFmdGVyOiAiKD86WyAJXHJcbl18JCkiIH0sCiAgLy8gU2xhc2gsIGNvbG9uLCBhbmQgc2VtaWNvbG9uIGFyZSBub3QgdXNlZCBpbiBtYXJrZG93biBmb3IgY29uc3RydWN0cy4KICAvLyBBIGxlc3MgdGhhbiBjYW4gc3RhcnQgaHRtbCAoZmxvdyBvciB0ZXh0KSBvciBhbiBhdXRvbGluay4KICAvLyBIVE1MIGNvdWxkIHN0YXJ0IHdpdGggYW4gZXhjbGFtYXRpb24gbWFyayAoZGVjbGFyYXRpb24sIGNkYXRhLCBjb21tZW50KSwKICAvLyBzbGFzaCAoY2xvc2luZyB0YWcpLCBxdWVzdGlvbiBtYXJrIChpbnN0cnVjdGlvbiksIG9yIGEgbGV0dGVyICh0YWcpLgogIC8vIEFuIGF1dG9saW5rIGFsc28gc3RhcnRzIHdpdGggYSBsZXR0ZXIuCiAgLy8gRmluYWxseSwgaXQgY291bGQgYnJlYWsgb3V0IG9mIGEgZGVzdGluYXRpb24gbGl0ZXJhbC4KICB7IGF0QnJlYWs6IHRydWUsIGNoYXJhY3RlcjogIjwiLCBhZnRlcjogIlshLz9BLVphLXpdIiB9LAogIHsKICAgIGNoYXJhY3RlcjogIjwiLAogICAgYWZ0ZXI6ICJbIS8/QS1aYS16XSIsCiAgICBpbkNvbnN0cnVjdDogInBocmFzaW5nIiwKICAgIG5vdEluQ29uc3RydWN0OiBmdWxsUGhyYXNpbmdTcGFucwogIH0sCiAgeyBjaGFyYWN0ZXI6ICI8IiwgaW5Db25zdHJ1Y3Q6ICJkZXN0aW5hdGlvbkxpdGVyYWwiIH0sCiAgLy8gQW4gZXF1YWxzIHRvIGNhbiBzdGFydCBzZXRleHQgaGVhZGluZyB1bmRlcmxpbmVzLgogIHsgYXRCcmVhazogdHJ1ZSwgY2hhcmFjdGVyOiAiPSIgfSwKICAvLyBBIGdyZWF0ZXIgdGhhbiBjYW4gc3RhcnQgYmxvY2sgcXVvdGVzIGFuZCBpdCBjYW4gYnJlYWsgb3V0IG9mIGEKICAvLyBkZXN0aW5hdGlvbiBsaXRlcmFsLgogIHsgYXRCcmVhazogdHJ1ZSwgY2hhcmFjdGVyOiAiPiIgfSwKICB7IGNoYXJhY3RlcjogIj4iLCBpbkNvbnN0cnVjdDogImRlc3RpbmF0aW9uTGl0ZXJhbCIgfSwKICAvLyBRdWVzdGlvbiBtYXJrIGFuZCBhdCBzaWduIGFyZSBub3QgdXNlZCBpbiBtYXJrZG93biBmb3IgY29uc3RydWN0cy4KICAvLyBBIGxlZnQgYnJhY2tldCBjYW4gc3RhcnQgZGVmaW5pdGlvbnMsIHJlZmVyZW5jZXMsIGxhYmVscywKICB7IGF0QnJlYWs6IHRydWUsIGNoYXJhY3RlcjogIlsiIH0sCiAgeyBjaGFyYWN0ZXI6ICJbIiwgaW5Db25zdHJ1Y3Q6ICJwaHJhc2luZyIsIG5vdEluQ29uc3RydWN0OiBmdWxsUGhyYXNpbmdTcGFucyB9LAogIHsgY2hhcmFjdGVyOiAiWyIsIGluQ29uc3RydWN0OiBbImxhYmVsIiwgInJlZmVyZW5jZSJdIH0sCiAgLy8gQSBiYWNrc2xhc2ggY2FuIHN0YXJ0IGFuIGVzY2FwZSAod2hlbiBmb2xsb3dlZCBieSBwdW5jdHVhdGlvbikgb3IgYQogIC8vIGhhcmQgYnJlYWsgKHdoZW4gZm9sbG93ZWQgYnkgYW4gZW9sKS4KICAvLyBOb3RlOiB0eXBpY2FsIGVzY2FwZXMgYXJlIGhhbmRsZWQgaW4gYHNhZmVgIQogIHsgY2hhcmFjdGVyOiAiXFwiLCBhZnRlcjogIltcXHJcXG5dIiwgaW5Db25zdHJ1Y3Q6ICJwaHJhc2luZyIgfSwKICAvLyBBIHJpZ2h0IGJyYWNrZXQgY2FuIGV4aXQgbGFiZWxzLgogIHsgY2hhcmFjdGVyOiAiXSIsIGluQ29uc3RydWN0OiBbImxhYmVsIiwgInJlZmVyZW5jZSJdIH0sCiAgLy8gQ2FyZXQgaXMgbm90IHVzZWQgaW4gbWFya2Rvd24gZm9yIGNvbnN0cnVjdHMuCiAgLy8gQW4gdW5kZXJzY29yZSBjYW4gc3RhcnQgZW1waGFzaXMsIHN0cm9uZywgb3IgYSB0aGVtYXRpYyBicmVhay4KICB7IGF0QnJlYWs6IHRydWUsIGNoYXJhY3RlcjogIl8iIH0sCiAgeyBjaGFyYWN0ZXI6ICJfIiwgaW5Db25zdHJ1Y3Q6ICJwaHJhc2luZyIsIG5vdEluQ29uc3RydWN0OiBmdWxsUGhyYXNpbmdTcGFucyB9LAogIC8vIEEgZ3JhdmUgYWNjZW50IGNhbiBzdGFydCBjb2RlIChmZW5jZWQgb3IgdGV4dCksIG9yIGl0IGNhbiBicmVhayBvdXQgb2YKICAvLyBhIGdyYXZlIGFjY2VudCBjb2RlIGZlbmNlLgogIHsgYXRCcmVhazogdHJ1ZSwgY2hhcmFjdGVyOiAiYCIgfSwKICB7CiAgICBjaGFyYWN0ZXI6ICJgIiwKICAgIGluQ29uc3RydWN0OiBbImNvZGVGZW5jZWRMYW5nR3JhdmVBY2NlbnQiLCAiY29kZUZlbmNlZE1ldGFHcmF2ZUFjY2VudCJdCiAgfSwKICB7IGNoYXJhY3RlcjogImAiLCBpbkNvbnN0cnVjdDogInBocmFzaW5nIiwgbm90SW5Db25zdHJ1Y3Q6IGZ1bGxQaHJhc2luZ1NwYW5zIH0sCiAgLy8gTGVmdCBicmFjZSwgdmVydGljYWwgYmFyLCByaWdodCBicmFjZSBhcmUgbm90IHVzZWQgaW4gbWFya2Rvd24gZm9yCiAgLy8gY29uc3RydWN0cy4KICAvLyBBIHRpbGRlIGNhbiBzdGFydCBjb2RlIChmZW5jZWQpLgogIHsgYXRCcmVhazogdHJ1ZSwgY2hhcmFjdGVyOiAifiIgfQpdOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RlY29kZS1uYW1lZC1jaGFyYWN0ZXItcmVmZXJlbmNlQDEuMy4wL25vZGVfbW9kdWxlcy9kZWNvZGUtbmFtZWQtY2hhcmFjdGVyLXJlZmVyZW5jZS9pbmRleC5kb20uanMKdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpIik7CmZ1bmN0aW9uIGRlY29kZU5hbWVkQ2hhcmFjdGVyUmVmZXJlbmNlKHZhbHVlMikgewogIGNvbnN0IGNoYXJhY3RlclJlZmVyZW5jZTIgPSAiJiIgKyB2YWx1ZTIgKyAiOyI7CiAgZWxlbWVudC5pbm5lckhUTUwgPSBjaGFyYWN0ZXJSZWZlcmVuY2UyOwogIGNvbnN0IGNoYXJhY3RlciA9IGVsZW1lbnQudGV4dENvbnRlbnQ7CiAgaWYgKGNoYXJhY3Rlci5jaGFyQ29kZUF0KGNoYXJhY3Rlci5sZW5ndGggLSAxKSA9PT0gNTkgJiYgdmFsdWUyICE9PSAic2VtaSIpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgcmV0dXJuIGNoYXJhY3RlciA9PT0gY2hhcmFjdGVyUmVmZXJlbmNlMiA/IGZhbHNlIDogY2hhcmFjdGVyOwp9Cl9fbmFtZShkZWNvZGVOYW1lZENoYXJhY3RlclJlZmVyZW5jZSwgImRlY29kZU5hbWVkQ2hhcmFjdGVyUmVmZXJlbmNlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLXV0aWwtZGVjb2RlLW51bWVyaWMtY2hhcmFjdGVyLXJlZmVyZW5jZUAyLjAuMi9ub2RlX21vZHVsZXMvbWljcm9tYXJrLXV0aWwtZGVjb2RlLW51bWVyaWMtY2hhcmFjdGVyLXJlZmVyZW5jZS9pbmRleC5qcwpmdW5jdGlvbiBkZWNvZGVOdW1lcmljQ2hhcmFjdGVyUmVmZXJlbmNlKHZhbHVlMiwgYmFzZSkgewogIGNvbnN0IGNvZGU0ID0gTnVtYmVyLnBhcnNlSW50KHZhbHVlMiwgYmFzZSk7CiAgaWYgKAogICAgLy8gQzAgZXhjZXB0IGZvciBIVCwgTEYsIEZGLCBDUiwgc3BhY2UuCiAgICBjb2RlNCA8IDkgfHwgY29kZTQgPT09IDExIHx8IGNvZGU0ID4gMTMgJiYgY29kZTQgPCAzMiB8fCAvLyBDb250cm9sIGNoYXJhY3RlciAoREVMKSBvZiBDMCwgYW5kIEMxIGNvbnRyb2xzLgogICAgY29kZTQgPiAxMjYgJiYgY29kZTQgPCAxNjAgfHwgLy8gTG9uZSBoaWdoIHN1cnJvZ2F0ZXMgYW5kIGxvdyBzdXJyb2dhdGVzLgogICAgY29kZTQgPiA1NTI5NSAmJiBjb2RlNCA8IDU3MzQ0IHx8IC8vIE5vbmNoYXJhY3RlcnMuCiAgICBjb2RlNCA+IDY0OTc1ICYmIGNvZGU0IDwgNjUwMDggfHwgLyogZXNsaW50LWRpc2FibGUgbm8tYml0d2lzZSAqLwogICAgKGNvZGU0ICYgNjU1MzUpID09PSA2NTUzNSB8fCAoY29kZTQgJiA2NTUzNSkgPT09IDY1NTM0IHx8IC8qIGVzbGludC1lbmFibGUgbm8tYml0d2lzZSAqLwogICAgLy8gT3V0IG9mIHJhbmdlCiAgICBjb2RlNCA+IDExMTQxMTEKICApIHsKICAgIHJldHVybiAiXHVGRkZEIjsKICB9CiAgcmV0dXJuIFN0cmluZy5mcm9tQ29kZVBvaW50KGNvZGU0KTsKfQpfX25hbWUoZGVjb2RlTnVtZXJpY0NoYXJhY3RlclJlZmVyZW5jZSwgImRlY29kZU51bWVyaWNDaGFyYWN0ZXJSZWZlcmVuY2UiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstdXRpbC1kZWNvZGUtc3RyaW5nQDIuMC4xL25vZGVfbW9kdWxlcy9taWNyb21hcmstdXRpbC1kZWNvZGUtc3RyaW5nL2luZGV4LmpzCnZhciBjaGFyYWN0ZXJFc2NhcGVPclJlZmVyZW5jZSA9IC9cXChbIS0vOi1AWy1gey1+XSl8JigjKD86XGR7MSw3fXx4W1xkYS1mXXsxLDZ9KXxbXGRhLXpdezEsMzF9KTsvZ2k7CmZ1bmN0aW9uIGRlY29kZVN0cmluZyh2YWx1ZTIpIHsKICByZXR1cm4gdmFsdWUyLnJlcGxhY2UoY2hhcmFjdGVyRXNjYXBlT3JSZWZlcmVuY2UsIGRlY29kZSk7Cn0KX19uYW1lKGRlY29kZVN0cmluZywgImRlY29kZVN0cmluZyIpOwpmdW5jdGlvbiBkZWNvZGUoJDAsICQxLCAkMjIpIHsKICBpZiAoJDEpIHsKICAgIHJldHVybiAkMTsKICB9CiAgY29uc3QgaGVhZDIgPSAkMjIuY2hhckNvZGVBdCgwKTsKICBpZiAoaGVhZDIgPT09IDM1KSB7CiAgICBjb25zdCBoZWFkMyA9ICQyMi5jaGFyQ29kZUF0KDEpOwogICAgY29uc3QgaGV4MiA9IGhlYWQzID09PSAxMjAgfHwgaGVhZDMgPT09IDg4OwogICAgcmV0dXJuIGRlY29kZU51bWVyaWNDaGFyYWN0ZXJSZWZlcmVuY2UoJDIyLnNsaWNlKGhleDIgPyAyIDogMSksIGhleDIgPyAxNiA6IDEwKTsKICB9CiAgcmV0dXJuIGRlY29kZU5hbWVkQ2hhcmFjdGVyUmVmZXJlbmNlKCQyMikgfHwgJDA7Cn0KX19uYW1lKGRlY29kZSwgImRlY29kZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvYXNzb2NpYXRpb24uanMKZnVuY3Rpb24gYXNzb2NpYXRpb24obm9kZTIpIHsKICBpZiAobm9kZTIubGFiZWwgfHwgIW5vZGUyLmlkZW50aWZpZXIpIHsKICAgIHJldHVybiBub2RlMi5sYWJlbCB8fCAiIjsKICB9CiAgcmV0dXJuIGRlY29kZVN0cmluZyhub2RlMi5pZGVudGlmaWVyKTsKfQpfX25hbWUoYXNzb2NpYXRpb24sICJhc3NvY2lhdGlvbiIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvY29tcGlsZS1wYXR0ZXJuLmpzCmZ1bmN0aW9uIGNvbXBpbGVQYXR0ZXJuKHBhdHRlcm4pIHsKICBpZiAoIXBhdHRlcm4uX2NvbXBpbGVkKSB7CiAgICBjb25zdCBiZWZvcmUgPSAocGF0dGVybi5hdEJyZWFrID8gIltcXHJcXG5dW1xcdCBdKiIgOiAiIikgKyAocGF0dGVybi5iZWZvcmUgPyAiKD86IiArIHBhdHRlcm4uYmVmb3JlICsgIikiIDogIiIpOwogICAgcGF0dGVybi5fY29tcGlsZWQgPSBuZXcgUmVnRXhwKAogICAgICAoYmVmb3JlID8gIigiICsgYmVmb3JlICsgIikiIDogIiIpICsgKC9bfFxce30oKVtcXV4kKyo/Li1dLy50ZXN0KHBhdHRlcm4uY2hhcmFjdGVyKSA/ICJcXCIgOiAiIikgKyBwYXR0ZXJuLmNoYXJhY3RlciArIChwYXR0ZXJuLmFmdGVyID8gIig/OiIgKyBwYXR0ZXJuLmFmdGVyICsgIikiIDogIiIpLAogICAgICAiZyIKICAgICk7CiAgfQogIHJldHVybiBwYXR0ZXJuLl9jb21waWxlZDsKfQpfX25hbWUoY29tcGlsZVBhdHRlcm4sICJjb21waWxlUGF0dGVybiIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvY29udGFpbmVyLXBocmFzaW5nLmpzCmZ1bmN0aW9uIGNvbnRhaW5lclBocmFzaW5nKHBhcmVudCwgc3RhdGUsIGluZm8pIHsKICBjb25zdCBpbmRleFN0YWNrID0gc3RhdGUuaW5kZXhTdGFjazsKICBjb25zdCBjaGlsZHJlbjIgPSBwYXJlbnQuY2hpbGRyZW4gfHwgW107CiAgY29uc3QgcmVzdWx0cyA9IFtdOwogIGxldCBpbmRleDIgPSAtMTsKICBsZXQgYmVmb3JlID0gaW5mby5iZWZvcmU7CiAgbGV0IGVuY29kZUFmdGVyOwogIGluZGV4U3RhY2sucHVzaCgtMSk7CiAgbGV0IHRyYWNrZXIgPSBzdGF0ZS5jcmVhdGVUcmFja2VyKGluZm8pOwogIHdoaWxlICgrK2luZGV4MiA8IGNoaWxkcmVuMi5sZW5ndGgpIHsKICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW4yW2luZGV4Ml07CiAgICBsZXQgYWZ0ZXI7CiAgICBpbmRleFN0YWNrW2luZGV4U3RhY2subGVuZ3RoIC0gMV0gPSBpbmRleDI7CiAgICBpZiAoaW5kZXgyICsgMSA8IGNoaWxkcmVuMi5sZW5ndGgpIHsKICAgICAgbGV0IGhhbmRsZTMgPSBzdGF0ZS5oYW5kbGUuaGFuZGxlcnNbY2hpbGRyZW4yW2luZGV4MiArIDFdLnR5cGVdOwogICAgICBpZiAoaGFuZGxlMyAmJiBoYW5kbGUzLnBlZWspIGhhbmRsZTMgPSBoYW5kbGUzLnBlZWs7CiAgICAgIGFmdGVyID0gaGFuZGxlMyA/IGhhbmRsZTMoY2hpbGRyZW4yW2luZGV4MiArIDFdLCBwYXJlbnQsIHN0YXRlLCB7CiAgICAgICAgYmVmb3JlOiAiIiwKICAgICAgICBhZnRlcjogIiIsCiAgICAgICAgLi4udHJhY2tlci5jdXJyZW50KCkKICAgICAgfSkuY2hhckF0KDApIDogIiI7CiAgICB9IGVsc2UgewogICAgICBhZnRlciA9IGluZm8uYWZ0ZXI7CiAgICB9CiAgICBpZiAocmVzdWx0cy5sZW5ndGggPiAwICYmIChiZWZvcmUgPT09ICJcciIgfHwgYmVmb3JlID09PSAiXG4iKSAmJiBjaGlsZC50eXBlID09PSAiaHRtbCIpIHsKICAgICAgcmVzdWx0c1tyZXN1bHRzLmxlbmd0aCAtIDFdID0gcmVzdWx0c1tyZXN1bHRzLmxlbmd0aCAtIDFdLnJlcGxhY2UoCiAgICAgICAgLyhccj9cbnxccikkLywKICAgICAgICAiICIKICAgICAgKTsKICAgICAgYmVmb3JlID0gIiAiOwogICAgICB0cmFja2VyID0gc3RhdGUuY3JlYXRlVHJhY2tlcihpbmZvKTsKICAgICAgdHJhY2tlci5tb3ZlKHJlc3VsdHMuam9pbigiIikpOwogICAgfQogICAgbGV0IHZhbHVlMiA9IHN0YXRlLmhhbmRsZShjaGlsZCwgcGFyZW50LCBzdGF0ZSwgewogICAgICAuLi50cmFja2VyLmN1cnJlbnQoKSwKICAgICAgYWZ0ZXIsCiAgICAgIGJlZm9yZQogICAgfSk7CiAgICBpZiAoZW5jb2RlQWZ0ZXIgJiYgZW5jb2RlQWZ0ZXIgPT09IHZhbHVlMi5zbGljZSgwLCAxKSkgewogICAgICB2YWx1ZTIgPSBlbmNvZGVDaGFyYWN0ZXJSZWZlcmVuY2UoZW5jb2RlQWZ0ZXIuY2hhckNvZGVBdCgwKSkgKyB2YWx1ZTIuc2xpY2UoMSk7CiAgICB9CiAgICBjb25zdCBlbmNvZGluZ0luZm8gPSBzdGF0ZS5hdHRlbnRpb25FbmNvZGVTdXJyb3VuZGluZ0luZm87CiAgICBzdGF0ZS5hdHRlbnRpb25FbmNvZGVTdXJyb3VuZGluZ0luZm8gPSB2b2lkIDA7CiAgICBlbmNvZGVBZnRlciA9IHZvaWQgMDsKICAgIGlmIChlbmNvZGluZ0luZm8pIHsKICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID4gMCAmJiBlbmNvZGluZ0luZm8uYmVmb3JlICYmIGJlZm9yZSA9PT0gcmVzdWx0c1tyZXN1bHRzLmxlbmd0aCAtIDFdLnNsaWNlKC0xKSkgewogICAgICAgIHJlc3VsdHNbcmVzdWx0cy5sZW5ndGggLSAxXSA9IHJlc3VsdHNbcmVzdWx0cy5sZW5ndGggLSAxXS5zbGljZSgwLCAtMSkgKyBlbmNvZGVDaGFyYWN0ZXJSZWZlcmVuY2UoYmVmb3JlLmNoYXJDb2RlQXQoMCkpOwogICAgICB9CiAgICAgIGlmIChlbmNvZGluZ0luZm8uYWZ0ZXIpIGVuY29kZUFmdGVyID0gYWZ0ZXI7CiAgICB9CiAgICB0cmFja2VyLm1vdmUodmFsdWUyKTsKICAgIHJlc3VsdHMucHVzaCh2YWx1ZTIpOwogICAgYmVmb3JlID0gdmFsdWUyLnNsaWNlKC0xKTsKICB9CiAgaW5kZXhTdGFjay5wb3AoKTsKICByZXR1cm4gcmVzdWx0cy5qb2luKCIiKTsKfQpfX25hbWUoY29udGFpbmVyUGhyYXNpbmcsICJjb250YWluZXJQaHJhc2luZyIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvY29udGFpbmVyLWZsb3cuanMKZnVuY3Rpb24gY29udGFpbmVyRmxvdyhwYXJlbnQsIHN0YXRlLCBpbmZvKSB7CiAgY29uc3QgaW5kZXhTdGFjayA9IHN0YXRlLmluZGV4U3RhY2s7CiAgY29uc3QgY2hpbGRyZW4yID0gcGFyZW50LmNoaWxkcmVuIHx8IFtdOwogIGNvbnN0IHRyYWNrZXIgPSBzdGF0ZS5jcmVhdGVUcmFja2VyKGluZm8pOwogIGNvbnN0IHJlc3VsdHMgPSBbXTsKICBsZXQgaW5kZXgyID0gLTE7CiAgaW5kZXhTdGFjay5wdXNoKC0xKTsKICB3aGlsZSAoKytpbmRleDIgPCBjaGlsZHJlbjIubGVuZ3RoKSB7CiAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuMltpbmRleDJdOwogICAgaW5kZXhTdGFja1tpbmRleFN0YWNrLmxlbmd0aCAtIDFdID0gaW5kZXgyOwogICAgcmVzdWx0cy5wdXNoKAogICAgICB0cmFja2VyLm1vdmUoCiAgICAgICAgc3RhdGUuaGFuZGxlKGNoaWxkLCBwYXJlbnQsIHN0YXRlLCB7CiAgICAgICAgICBiZWZvcmU6ICJcbiIsCiAgICAgICAgICBhZnRlcjogIlxuIiwKICAgICAgICAgIC4uLnRyYWNrZXIuY3VycmVudCgpCiAgICAgICAgfSkKICAgICAgKQogICAgKTsKICAgIGlmIChjaGlsZC50eXBlICE9PSAibGlzdCIpIHsKICAgICAgc3RhdGUuYnVsbGV0TGFzdFVzZWQgPSB2b2lkIDA7CiAgICB9CiAgICBpZiAoaW5kZXgyIDwgY2hpbGRyZW4yLmxlbmd0aCAtIDEpIHsKICAgICAgcmVzdWx0cy5wdXNoKAogICAgICAgIHRyYWNrZXIubW92ZShiZXR3ZWVuKGNoaWxkLCBjaGlsZHJlbjJbaW5kZXgyICsgMV0sIHBhcmVudCwgc3RhdGUpKQogICAgICApOwogICAgfQogIH0KICBpbmRleFN0YWNrLnBvcCgpOwogIHJldHVybiByZXN1bHRzLmpvaW4oIiIpOwp9Cl9fbmFtZShjb250YWluZXJGbG93LCAiY29udGFpbmVyRmxvdyIpOwpmdW5jdGlvbiBiZXR3ZWVuKGxlZnQsIHJpZ2h0LCBwYXJlbnQsIHN0YXRlKSB7CiAgbGV0IGluZGV4MiA9IHN0YXRlLmpvaW4ubGVuZ3RoOwogIHdoaWxlIChpbmRleDItLSkgewogICAgY29uc3QgcmVzdWx0ID0gc3RhdGUuam9pbltpbmRleDJdKGxlZnQsIHJpZ2h0LCBwYXJlbnQsIHN0YXRlKTsKICAgIGlmIChyZXN1bHQgPT09IHRydWUgfHwgcmVzdWx0ID09PSAxKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICJudW1iZXIiKSB7CiAgICAgIHJldHVybiAiXG4iLnJlcGVhdCgxICsgcmVzdWx0KTsKICAgIH0KICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSB7CiAgICAgIHJldHVybiAiXG5cbjwhLS0tLT5cblxuIjsKICAgIH0KICB9CiAgcmV0dXJuICJcblxuIjsKfQpfX25hbWUoYmV0d2VlbiwgImJldHdlZW4iKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2luZGVudC1saW5lcy5qcwp2YXIgZW9sID0gL1xyP1xufFxyL2c7CmZ1bmN0aW9uIGluZGVudExpbmVzKHZhbHVlMiwgbWFwNykgewogIGNvbnN0IHJlc3VsdCA9IFtdOwogIGxldCBzdGFydCA9IDA7CiAgbGV0IGxpbmUgPSAwOwogIGxldCBtYXRjaDI7CiAgd2hpbGUgKG1hdGNoMiA9IGVvbC5leGVjKHZhbHVlMikpIHsKICAgIG9uZTModmFsdWUyLnNsaWNlKHN0YXJ0LCBtYXRjaDIuaW5kZXgpKTsKICAgIHJlc3VsdC5wdXNoKG1hdGNoMlswXSk7CiAgICBzdGFydCA9IG1hdGNoMi5pbmRleCArIG1hdGNoMlswXS5sZW5ndGg7CiAgICBsaW5lKys7CiAgfQogIG9uZTModmFsdWUyLnNsaWNlKHN0YXJ0KSk7CiAgcmV0dXJuIHJlc3VsdC5qb2luKCIiKTsKICBmdW5jdGlvbiBvbmUzKHZhbHVlMykgewogICAgcmVzdWx0LnB1c2gobWFwNyh2YWx1ZTMsIGxpbmUsICF2YWx1ZTMpKTsKICB9CiAgX19uYW1lKG9uZTMsICJvbmUiKTsKfQpfX25hbWUoaW5kZW50TGluZXMsICJpbmRlbnRMaW5lcyIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvc2FmZS5qcwpmdW5jdGlvbiBzYWZlKHN0YXRlLCBpbnB1dCwgY29uZmlnMikgewogIGNvbnN0IHZhbHVlMiA9IChjb25maWcyLmJlZm9yZSB8fCAiIikgKyAoaW5wdXQgfHwgIiIpICsgKGNvbmZpZzIuYWZ0ZXIgfHwgIiIpOwogIGNvbnN0IHBvc2l0aW9ucyA9IFtdOwogIGNvbnN0IHJlc3VsdCA9IFtdOwogIGNvbnN0IGluZm9zID0ge307CiAgbGV0IGluZGV4MiA9IC0xOwogIHdoaWxlICgrK2luZGV4MiA8IHN0YXRlLnVuc2FmZS5sZW5ndGgpIHsKICAgIGNvbnN0IHBhdHRlcm4gPSBzdGF0ZS51bnNhZmVbaW5kZXgyXTsKICAgIGlmICghcGF0dGVybkluU2NvcGUoc3RhdGUuc3RhY2ssIHBhdHRlcm4pKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uc3QgZXhwcmVzc2lvbiA9IHN0YXRlLmNvbXBpbGVQYXR0ZXJuKHBhdHRlcm4pOwogICAgbGV0IG1hdGNoMjsKICAgIHdoaWxlIChtYXRjaDIgPSBleHByZXNzaW9uLmV4ZWModmFsdWUyKSkgewogICAgICBjb25zdCBiZWZvcmUgPSAiYmVmb3JlIiBpbiBwYXR0ZXJuIHx8IEJvb2xlYW4ocGF0dGVybi5hdEJyZWFrKTsKICAgICAgY29uc3QgYWZ0ZXIgPSAiYWZ0ZXIiIGluIHBhdHRlcm47CiAgICAgIGNvbnN0IHBvc2l0aW9uMyA9IG1hdGNoMi5pbmRleCArIChiZWZvcmUgPyBtYXRjaDJbMV0ubGVuZ3RoIDogMCk7CiAgICAgIGlmIChwb3NpdGlvbnMuaW5jbHVkZXMocG9zaXRpb24zKSkgewogICAgICAgIGlmIChpbmZvc1twb3NpdGlvbjNdLmJlZm9yZSAmJiAhYmVmb3JlKSB7CiAgICAgICAgICBpbmZvc1twb3NpdGlvbjNdLmJlZm9yZSA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBpZiAoaW5mb3NbcG9zaXRpb24zXS5hZnRlciAmJiAhYWZ0ZXIpIHsKICAgICAgICAgIGluZm9zW3Bvc2l0aW9uM10uYWZ0ZXIgPSBmYWxzZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcG9zaXRpb25zLnB1c2gocG9zaXRpb24zKTsKICAgICAgICBpbmZvc1twb3NpdGlvbjNdID0geyBiZWZvcmUsIGFmdGVyIH07CiAgICAgIH0KICAgIH0KICB9CiAgcG9zaXRpb25zLnNvcnQobnVtZXJpY2FsKTsKICBsZXQgc3RhcnQgPSBjb25maWcyLmJlZm9yZSA/IGNvbmZpZzIuYmVmb3JlLmxlbmd0aCA6IDA7CiAgY29uc3QgZW5kID0gdmFsdWUyLmxlbmd0aCAtIChjb25maWcyLmFmdGVyID8gY29uZmlnMi5hZnRlci5sZW5ndGggOiAwKTsKICBpbmRleDIgPSAtMTsKICB3aGlsZSAoKytpbmRleDIgPCBwb3NpdGlvbnMubGVuZ3RoKSB7CiAgICBjb25zdCBwb3NpdGlvbjMgPSBwb3NpdGlvbnNbaW5kZXgyXTsKICAgIGlmIChwb3NpdGlvbjMgPCBzdGFydCB8fCBwb3NpdGlvbjMgPj0gZW5kKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgaWYgKHBvc2l0aW9uMyArIDEgPCBlbmQgJiYgcG9zaXRpb25zW2luZGV4MiArIDFdID09PSBwb3NpdGlvbjMgKyAxICYmIGluZm9zW3Bvc2l0aW9uM10uYWZ0ZXIgJiYgIWluZm9zW3Bvc2l0aW9uMyArIDFdLmJlZm9yZSAmJiAhaW5mb3NbcG9zaXRpb24zICsgMV0uYWZ0ZXIgfHwgcG9zaXRpb25zW2luZGV4MiAtIDFdID09PSBwb3NpdGlvbjMgLSAxICYmIGluZm9zW3Bvc2l0aW9uM10uYmVmb3JlICYmICFpbmZvc1twb3NpdGlvbjMgLSAxXS5iZWZvcmUgJiYgIWluZm9zW3Bvc2l0aW9uMyAtIDFdLmFmdGVyKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgaWYgKHN0YXJ0ICE9PSBwb3NpdGlvbjMpIHsKICAgICAgcmVzdWx0LnB1c2goZXNjYXBlQmFja3NsYXNoZXModmFsdWUyLnNsaWNlKHN0YXJ0LCBwb3NpdGlvbjMpLCAiXFwiKSk7CiAgICB9CiAgICBzdGFydCA9IHBvc2l0aW9uMzsKICAgIGlmICgvWyEtLzotQFstYHstfl0vLnRlc3QodmFsdWUyLmNoYXJBdChwb3NpdGlvbjMpKSAmJiAoIWNvbmZpZzIuZW5jb2RlIHx8ICFjb25maWcyLmVuY29kZS5pbmNsdWRlcyh2YWx1ZTIuY2hhckF0KHBvc2l0aW9uMykpKSkgewogICAgICByZXN1bHQucHVzaCgiXFwiKTsKICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdC5wdXNoKGVuY29kZUNoYXJhY3RlclJlZmVyZW5jZSh2YWx1ZTIuY2hhckNvZGVBdChwb3NpdGlvbjMpKSk7CiAgICAgIHN0YXJ0Kys7CiAgICB9CiAgfQogIHJlc3VsdC5wdXNoKGVzY2FwZUJhY2tzbGFzaGVzKHZhbHVlMi5zbGljZShzdGFydCwgZW5kKSwgY29uZmlnMi5hZnRlcikpOwogIHJldHVybiByZXN1bHQuam9pbigiIik7Cn0KX19uYW1lKHNhZmUsICJzYWZlIik7CmZ1bmN0aW9uIG51bWVyaWNhbChhNCwgYjQpIHsKICByZXR1cm4gYTQgLSBiNDsKfQpfX25hbWUobnVtZXJpY2FsLCAibnVtZXJpY2FsIik7CmZ1bmN0aW9uIGVzY2FwZUJhY2tzbGFzaGVzKHZhbHVlMiwgYWZ0ZXIpIHsKICBjb25zdCBleHByZXNzaW9uID0gL1xcKD89WyEtLzotQFstYHstfl0pL2c7CiAgY29uc3QgcG9zaXRpb25zID0gW107CiAgY29uc3QgcmVzdWx0cyA9IFtdOwogIGNvbnN0IHdob2xlID0gdmFsdWUyICsgYWZ0ZXI7CiAgbGV0IGluZGV4MiA9IC0xOwogIGxldCBzdGFydCA9IDA7CiAgbGV0IG1hdGNoMjsKICB3aGlsZSAobWF0Y2gyID0gZXhwcmVzc2lvbi5leGVjKHdob2xlKSkgewogICAgcG9zaXRpb25zLnB1c2gobWF0Y2gyLmluZGV4KTsKICB9CiAgd2hpbGUgKCsraW5kZXgyIDwgcG9zaXRpb25zLmxlbmd0aCkgewogICAgaWYgKHN0YXJ0ICE9PSBwb3NpdGlvbnNbaW5kZXgyXSkgewogICAgICByZXN1bHRzLnB1c2godmFsdWUyLnNsaWNlKHN0YXJ0LCBwb3NpdGlvbnNbaW5kZXgyXSkpOwogICAgfQogICAgcmVzdWx0cy5wdXNoKCJcXCIpOwogICAgc3RhcnQgPSBwb3NpdGlvbnNbaW5kZXgyXTsKICB9CiAgcmVzdWx0cy5wdXNoKHZhbHVlMi5zbGljZShzdGFydCkpOwogIHJldHVybiByZXN1bHRzLmpvaW4oIiIpOwp9Cl9fbmFtZShlc2NhcGVCYWNrc2xhc2hlcywgImVzY2FwZUJhY2tzbGFzaGVzIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC90cmFjay5qcwpmdW5jdGlvbiB0cmFjayhjb25maWcyKSB7CiAgY29uc3Qgb3B0aW9ucyA9IGNvbmZpZzIgfHwge307CiAgY29uc3Qgbm93MiA9IG9wdGlvbnMubm93IHx8IHt9OwogIGxldCBsaW5lU2hpZnQgPSBvcHRpb25zLmxpbmVTaGlmdCB8fCAwOwogIGxldCBsaW5lID0gbm93Mi5saW5lIHx8IDE7CiAgbGV0IGNvbHVtbiA9IG5vdzIuY29sdW1uIHx8IDE7CiAgcmV0dXJuIHsgbW92ZSwgY3VycmVudCwgc2hpZnQgfTsKICBmdW5jdGlvbiBjdXJyZW50KCkgewogICAgcmV0dXJuIHsgbm93OiB7IGxpbmUsIGNvbHVtbiB9LCBsaW5lU2hpZnQgfTsKICB9CiAgX19uYW1lKGN1cnJlbnQsICJjdXJyZW50Iik7CiAgZnVuY3Rpb24gc2hpZnQodmFsdWUyKSB7CiAgICBsaW5lU2hpZnQgKz0gdmFsdWUyOwogIH0KICBfX25hbWUoc2hpZnQsICJzaGlmdCIpOwogIGZ1bmN0aW9uIG1vdmUoaW5wdXQpIHsKICAgIGNvbnN0IHZhbHVlMiA9IGlucHV0IHx8ICIiOwogICAgY29uc3QgY2h1bmtzID0gdmFsdWUyLnNwbGl0KC9ccj9cbnxcci9nKTsKICAgIGNvbnN0IHRhaWwgPSBjaHVua3NbY2h1bmtzLmxlbmd0aCAtIDFdOwogICAgbGluZSArPSBjaHVua3MubGVuZ3RoIC0gMTsKICAgIGNvbHVtbiA9IGNodW5rcy5sZW5ndGggPT09IDEgPyBjb2x1bW4gKyB0YWlsLmxlbmd0aCA6IDEgKyB0YWlsLmxlbmd0aCArIGxpbmVTaGlmdDsKICAgIHJldHVybiB2YWx1ZTI7CiAgfQogIF9fbmFtZShtb3ZlLCAibW92ZSIpOwp9Cl9fbmFtZSh0cmFjaywgInRyYWNrIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaW5kZXguanMKZnVuY3Rpb24gdG9NYXJrZG93bih0cmVlLCBvcHRpb25zKSB7CiAgY29uc3Qgc2V0dGluZ3MgPSBvcHRpb25zIHx8IHt9OwogIGNvbnN0IHN0YXRlID0gewogICAgYXNzb2NpYXRpb25JZDogYXNzb2NpYXRpb24sCiAgICBjb250YWluZXJQaHJhc2luZzogY29udGFpbmVyUGhyYXNpbmdCb3VuZCwKICAgIGNvbnRhaW5lckZsb3c6IGNvbnRhaW5lckZsb3dCb3VuZCwKICAgIGNyZWF0ZVRyYWNrZXI6IHRyYWNrLAogICAgY29tcGlsZVBhdHRlcm4sCiAgICBlbnRlciwKICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IEdGTSAvIGZyb250bWF0dGVyIGFyZSB0eXBlZCBpbiBgbWRhc3RgIGJ1dCBub3QgZGVmaW5lZAogICAgLy8gaGVyZS4KICAgIGhhbmRsZXJzOiB7IC4uLmhhbmRsZSB9LAogICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogYWRkIGBoYW5kbGVgIGluIGEgc2Vjb25kLgogICAgaGFuZGxlOiB2b2lkIDAsCiAgICBpbmRlbnRMaW5lcywKICAgIGluZGV4U3RhY2s6IFtdLAogICAgam9pbjogWy4uLmpvaW4yXSwKICAgIG9wdGlvbnM6IHt9LAogICAgc2FmZTogc2FmZUJvdW5kLAogICAgc3RhY2s6IFtdLAogICAgdW5zYWZlOiBbLi4udW5zYWZlXQogIH07CiAgY29uZmlndXJlKHN0YXRlLCBzZXR0aW5ncyk7CiAgaWYgKHN0YXRlLm9wdGlvbnMudGlnaHREZWZpbml0aW9ucykgewogICAgc3RhdGUuam9pbi5wdXNoKGpvaW5EZWZpbml0aW9uKTsKICB9CiAgc3RhdGUuaGFuZGxlID0gendpdGNoKCJ0eXBlIiwgewogICAgaW52YWxpZCwKICAgIHVua25vd24sCiAgICBoYW5kbGVyczogc3RhdGUuaGFuZGxlcnMKICB9KTsKICBsZXQgcmVzdWx0ID0gc3RhdGUuaGFuZGxlKHRyZWUsIHZvaWQgMCwgc3RhdGUsIHsKICAgIGJlZm9yZTogIlxuIiwKICAgIGFmdGVyOiAiXG4iLAogICAgbm93OiB7IGxpbmU6IDEsIGNvbHVtbjogMSB9LAogICAgbGluZVNoaWZ0OiAwCiAgfSk7CiAgaWYgKHJlc3VsdCAmJiByZXN1bHQuY2hhckNvZGVBdChyZXN1bHQubGVuZ3RoIC0gMSkgIT09IDEwICYmIHJlc3VsdC5jaGFyQ29kZUF0KHJlc3VsdC5sZW5ndGggLSAxKSAhPT0gMTMpIHsKICAgIHJlc3VsdCArPSAiXG4iOwogIH0KICByZXR1cm4gcmVzdWx0OwogIGZ1bmN0aW9uIGVudGVyKG5hbWUpIHsKICAgIHN0YXRlLnN0YWNrLnB1c2gobmFtZSk7CiAgICByZXR1cm4gZXhpdDM7CiAgICBmdW5jdGlvbiBleGl0MygpIHsKICAgICAgc3RhdGUuc3RhY2sucG9wKCk7CiAgICB9CiAgICBfX25hbWUoZXhpdDMsICJleGl0Iik7CiAgfQogIF9fbmFtZShlbnRlciwgImVudGVyIik7Cn0KX19uYW1lKHRvTWFya2Rvd24sICJ0b01hcmtkb3duIik7CmZ1bmN0aW9uIGludmFsaWQodmFsdWUyKSB7CiAgdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaGFuZGxlIHZhbHVlIGAiICsgdmFsdWUyICsgImAsIGV4cGVjdGVkIG5vZGUiKTsKfQpfX25hbWUoaW52YWxpZCwgImludmFsaWQiKTsKZnVuY3Rpb24gdW5rbm93bih2YWx1ZTIpIHsKICBjb25zdCBub2RlMiA9ICgKICAgIC8qKiBAdHlwZSB7Tm9kZXN9ICovCiAgICB2YWx1ZTIKICApOwogIHRocm93IG5ldyBFcnJvcigiQ2Fubm90IGhhbmRsZSB1bmtub3duIG5vZGUgYCIgKyBub2RlMi50eXBlICsgImAiKTsKfQpfX25hbWUodW5rbm93biwgInVua25vd24iKTsKZnVuY3Rpb24gam9pbkRlZmluaXRpb24obGVmdCwgcmlnaHQpIHsKICBpZiAobGVmdC50eXBlID09PSAiZGVmaW5pdGlvbiIgJiYgbGVmdC50eXBlID09PSByaWdodC50eXBlKSB7CiAgICByZXR1cm4gMDsKICB9Cn0KX19uYW1lKGpvaW5EZWZpbml0aW9uLCAiam9pbkRlZmluaXRpb24iKTsKZnVuY3Rpb24gY29udGFpbmVyUGhyYXNpbmdCb3VuZChwYXJlbnQsIGluZm8pIHsKICByZXR1cm4gY29udGFpbmVyUGhyYXNpbmcocGFyZW50LCB0aGlzLCBpbmZvKTsKfQpfX25hbWUoY29udGFpbmVyUGhyYXNpbmdCb3VuZCwgImNvbnRhaW5lclBocmFzaW5nQm91bmQiKTsKZnVuY3Rpb24gY29udGFpbmVyRmxvd0JvdW5kKHBhcmVudCwgaW5mbykgewogIHJldHVybiBjb250YWluZXJGbG93KHBhcmVudCwgdGhpcywgaW5mbyk7Cn0KX19uYW1lKGNvbnRhaW5lckZsb3dCb3VuZCwgImNvbnRhaW5lckZsb3dCb3VuZCIpOwpmdW5jdGlvbiBzYWZlQm91bmQodmFsdWUyLCBjb25maWcyKSB7CiAgcmV0dXJuIHNhZmUodGhpcywgdmFsdWUyLCBjb25maWcyKTsKfQpfX25hbWUoc2FmZUJvdW5kLCAic2FmZUJvdW5kIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC1nZm0tdGFibGVAMi4wLjAvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtZ2ZtLXRhYmxlL2xpYi9pbmRleC5qcwpmdW5jdGlvbiBnZm1UYWJsZUZyb21NYXJrZG93bigpIHsKICByZXR1cm4gewogICAgZW50ZXI6IHsKICAgICAgdGFibGU6IGVudGVyVGFibGUsCiAgICAgIHRhYmxlRGF0YTogZW50ZXJDZWxsLAogICAgICB0YWJsZUhlYWRlcjogZW50ZXJDZWxsLAogICAgICB0YWJsZVJvdzogZW50ZXJSb3cKICAgIH0sCiAgICBleGl0OiB7CiAgICAgIGNvZGVUZXh0OiBleGl0Q29kZVRleHQsCiAgICAgIHRhYmxlOiBleGl0VGFibGUsCiAgICAgIHRhYmxlRGF0YTogZXhpdCwKICAgICAgdGFibGVIZWFkZXI6IGV4aXQsCiAgICAgIHRhYmxlUm93OiBleGl0CiAgICB9CiAgfTsKfQpfX25hbWUoZ2ZtVGFibGVGcm9tTWFya2Rvd24sICJnZm1UYWJsZUZyb21NYXJrZG93biIpOwpmdW5jdGlvbiBlbnRlclRhYmxlKHRva2VuKSB7CiAgY29uc3QgYWxpZ24gPSB0b2tlbi5fYWxpZ247CiAgb2soYWxpZ24sICJleHBlY3RlZCBgX2FsaWduYCBvbiB0YWJsZSIpOwogIHRoaXMuZW50ZXIoCiAgICB7CiAgICAgIHR5cGU6ICJ0YWJsZSIsCiAgICAgIGFsaWduOiBhbGlnbi5tYXAoZnVuY3Rpb24oZDQpIHsKICAgICAgICByZXR1cm4gZDQgPT09ICJub25lIiA/IG51bGwgOiBkNDsKICAgICAgfSksCiAgICAgIGNoaWxkcmVuOiBbXQogICAgfSwKICAgIHRva2VuCiAgKTsKICB0aGlzLmRhdGEuaW5UYWJsZSA9IHRydWU7Cn0KX19uYW1lKGVudGVyVGFibGUsICJlbnRlclRhYmxlIik7CmZ1bmN0aW9uIGV4aXRUYWJsZSh0b2tlbikgewogIHRoaXMuZXhpdCh0b2tlbik7CiAgdGhpcy5kYXRhLmluVGFibGUgPSB2b2lkIDA7Cn0KX19uYW1lKGV4aXRUYWJsZSwgImV4aXRUYWJsZSIpOwpmdW5jdGlvbiBlbnRlclJvdyh0b2tlbikgewogIHRoaXMuZW50ZXIoeyB0eXBlOiAidGFibGVSb3ciLCBjaGlsZHJlbjogW10gfSwgdG9rZW4pOwp9Cl9fbmFtZShlbnRlclJvdywgImVudGVyUm93Iik7CmZ1bmN0aW9uIGV4aXQodG9rZW4pIHsKICB0aGlzLmV4aXQodG9rZW4pOwp9Cl9fbmFtZShleGl0LCAiZXhpdCIpOwpmdW5jdGlvbiBlbnRlckNlbGwodG9rZW4pIHsKICB0aGlzLmVudGVyKHsgdHlwZTogInRhYmxlQ2VsbCIsIGNoaWxkcmVuOiBbXSB9LCB0b2tlbik7Cn0KX19uYW1lKGVudGVyQ2VsbCwgImVudGVyQ2VsbCIpOwpmdW5jdGlvbiBleGl0Q29kZVRleHQodG9rZW4pIHsKICBsZXQgdmFsdWUyID0gdGhpcy5yZXN1bWUoKTsKICBpZiAodGhpcy5kYXRhLmluVGFibGUpIHsKICAgIHZhbHVlMiA9IHZhbHVlMi5yZXBsYWNlKC9cXChbXFx8XSkvZywgcmVwbGFjZSk7CiAgfQogIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogIG9rKG5vZGUyLnR5cGUgPT09ICJpbmxpbmVDb2RlIik7CiAgbm9kZTIudmFsdWUgPSB2YWx1ZTI7CiAgdGhpcy5leGl0KHRva2VuKTsKfQpfX25hbWUoZXhpdENvZGVUZXh0LCAiZXhpdENvZGVUZXh0Iik7CmZ1bmN0aW9uIHJlcGxhY2UoJDAsICQxKSB7CiAgcmV0dXJuICQxID09PSAifCIgPyAkMSA6ICQwOwp9Cl9fbmFtZShyZXBsYWNlLCAicmVwbGFjZSIpOwpmdW5jdGlvbiBnZm1UYWJsZVRvTWFya2Rvd24ob3B0aW9ucykgewogIGNvbnN0IHNldHRpbmdzID0gb3B0aW9ucyB8fCB7fTsKICBjb25zdCBwYWRkaW5nID0gc2V0dGluZ3MudGFibGVDZWxsUGFkZGluZzsKICBjb25zdCBhbGlnbkRlbGltaXRlcnMgPSBzZXR0aW5ncy50YWJsZVBpcGVBbGlnbjsKICBjb25zdCBzdHJpbmdMZW5ndGggPSBzZXR0aW5ncy5zdHJpbmdMZW5ndGg7CiAgY29uc3QgYXJvdW5kID0gcGFkZGluZyA/ICIgIiA6ICJ8IjsKICByZXR1cm4gewogICAgdW5zYWZlOiBbCiAgICAgIHsgY2hhcmFjdGVyOiAiXHIiLCBpbkNvbnN0cnVjdDogInRhYmxlQ2VsbCIgfSwKICAgICAgeyBjaGFyYWN0ZXI6ICJcbiIsIGluQ29uc3RydWN0OiAidGFibGVDZWxsIiB9LAogICAgICAvLyBBIHBpcGUsIHdoZW4gZm9sbG93ZWQgYnkgYSB0YWIgb3Igc3BhY2UgKHBhZGRpbmcpLCBvciBhIGRhc2ggb3IgY29sb24KICAgICAgLy8gKHVucGFkZGVkIGRlbGltaXRlciByb3cpLCBjb3VsZCByZXN1bHQgaW4gYSB0YWJsZS4KICAgICAgeyBhdEJyZWFrOiB0cnVlLCBjaGFyYWN0ZXI6ICJ8IiwgYWZ0ZXI6ICJbCSA6LV0iIH0sCiAgICAgIC8vIEEgcGlwZSBpbiBhIGNlbGwgbXVzdCBiZSBlbmNvZGVkLgogICAgICB7IGNoYXJhY3RlcjogInwiLCBpbkNvbnN0cnVjdDogInRhYmxlQ2VsbCIgfSwKICAgICAgLy8gQSBjb2xvbiBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgZGFzaCwgaW4gd2hpY2ggY2FzZSBpdCBjb3VsZCBzdGFydCBhCiAgICAgIC8vIGRlbGltaXRlciByb3cuCiAgICAgIHsgYXRCcmVhazogdHJ1ZSwgY2hhcmFjdGVyOiAiOiIsIGFmdGVyOiAiLSIgfSwKICAgICAgLy8gQSBkZWxpbWl0ZXIgcm93IGNhbiBhbHNvIHN0YXJ0IHdpdGggYSBkYXNoLCB3aGVuIGZvbGxvd2VkIGJ5IG1vcmUKICAgICAgLy8gZGFzaGVzLCBhIGNvbG9uLCBvciBhIHBpcGUuCiAgICAgIC8vIFRoaXMgaXMgYSBzdHJpY3RlciB2ZXJzaW9uIHRoYW4gdGhlIGJ1aWx0IGluIGNoZWNrIGZvciBsaXN0cywgdGhlbWF0aWMKICAgICAgLy8gYnJlYWtzLCBhbmQgc2V0ZXggaGVhZGluZyB1bmRlcmxpbmVzIHRob3VnaDoKICAgICAgLy8gPGh0dHBzOi8vZ2l0aHViLmNvbS9zeW50YXgtdHJlZS9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2Jsb2IvNTFhMjAzOC9saWIvdW5zYWZlLmpzI0w1Nz4KICAgICAgeyBhdEJyZWFrOiB0cnVlLCBjaGFyYWN0ZXI6ICItIiwgYWZ0ZXI6ICJbOnwtXSIgfQogICAgXSwKICAgIGhhbmRsZXJzOiB7CiAgICAgIGlubGluZUNvZGU6IGlubGluZUNvZGVXaXRoVGFibGUsCiAgICAgIHRhYmxlOiBoYW5kbGVUYWJsZSwKICAgICAgdGFibGVDZWxsOiBoYW5kbGVUYWJsZUNlbGwsCiAgICAgIHRhYmxlUm93OiBoYW5kbGVUYWJsZVJvdwogICAgfQogIH07CiAgZnVuY3Rpb24gaGFuZGxlVGFibGUobm9kZTIsIF8zLCBzdGF0ZSwgaW5mbykgewogICAgcmV0dXJuIHNlcmlhbGl6ZURhdGEoaGFuZGxlVGFibGVBc0RhdGEobm9kZTIsIHN0YXRlLCBpbmZvKSwgbm9kZTIuYWxpZ24pOwogIH0KICBfX25hbWUoaGFuZGxlVGFibGUsICJoYW5kbGVUYWJsZSIpOwogIGZ1bmN0aW9uIGhhbmRsZVRhYmxlUm93KG5vZGUyLCBfMywgc3RhdGUsIGluZm8pIHsKICAgIGNvbnN0IHJvdyA9IGhhbmRsZVRhYmxlUm93QXNEYXRhKG5vZGUyLCBzdGF0ZSwgaW5mbyk7CiAgICBjb25zdCB2YWx1ZTIgPSBzZXJpYWxpemVEYXRhKFtyb3ddKTsKICAgIHJldHVybiB2YWx1ZTIuc2xpY2UoMCwgdmFsdWUyLmluZGV4T2YoIlxuIikpOwogIH0KICBfX25hbWUoaGFuZGxlVGFibGVSb3csICJoYW5kbGVUYWJsZVJvdyIpOwogIGZ1bmN0aW9uIGhhbmRsZVRhYmxlQ2VsbChub2RlMiwgXzMsIHN0YXRlLCBpbmZvKSB7CiAgICBjb25zdCBleGl0MyA9IHN0YXRlLmVudGVyKCJ0YWJsZUNlbGwiKTsKICAgIGNvbnN0IHN1YmV4aXQgPSBzdGF0ZS5lbnRlcigicGhyYXNpbmciKTsKICAgIGNvbnN0IHZhbHVlMiA9IHN0YXRlLmNvbnRhaW5lclBocmFzaW5nKG5vZGUyLCB7CiAgICAgIC4uLmluZm8sCiAgICAgIGJlZm9yZTogYXJvdW5kLAogICAgICBhZnRlcjogYXJvdW5kCiAgICB9KTsKICAgIHN1YmV4aXQoKTsKICAgIGV4aXQzKCk7CiAgICByZXR1cm4gdmFsdWUyOwogIH0KICBfX25hbWUoaGFuZGxlVGFibGVDZWxsLCAiaGFuZGxlVGFibGVDZWxsIik7CiAgZnVuY3Rpb24gc2VyaWFsaXplRGF0YShtYXRyaXgsIGFsaWduKSB7CiAgICByZXR1cm4gbWFya2Rvd25UYWJsZShtYXRyaXgsIHsKICAgICAgYWxpZ24sCiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IGBtYXJrZG93bi10YWJsZWAgdHlwZXMgc2hvdWxkIHN1cHBvcnQgYG51bGxgLgogICAgICBhbGlnbkRlbGltaXRlcnMsCiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IGBtYXJrZG93bi10YWJsZWAgdHlwZXMgc2hvdWxkIHN1cHBvcnQgYG51bGxgLgogICAgICBwYWRkaW5nLAogICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBgbWFya2Rvd24tdGFibGVgIHR5cGVzIHNob3VsZCBzdXBwb3J0IGBudWxsYC4KICAgICAgc3RyaW5nTGVuZ3RoCiAgICB9KTsKICB9CiAgX19uYW1lKHNlcmlhbGl6ZURhdGEsICJzZXJpYWxpemVEYXRhIik7CiAgZnVuY3Rpb24gaGFuZGxlVGFibGVBc0RhdGEobm9kZTIsIHN0YXRlLCBpbmZvKSB7CiAgICBjb25zdCBjaGlsZHJlbjIgPSBub2RlMi5jaGlsZHJlbjsKICAgIGxldCBpbmRleDIgPSAtMTsKICAgIGNvbnN0IHJlc3VsdCA9IFtdOwogICAgY29uc3Qgc3ViZXhpdCA9IHN0YXRlLmVudGVyKCJ0YWJsZSIpOwogICAgd2hpbGUgKCsraW5kZXgyIDwgY2hpbGRyZW4yLmxlbmd0aCkgewogICAgICByZXN1bHRbaW5kZXgyXSA9IGhhbmRsZVRhYmxlUm93QXNEYXRhKGNoaWxkcmVuMltpbmRleDJdLCBzdGF0ZSwgaW5mbyk7CiAgICB9CiAgICBzdWJleGl0KCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KICBfX25hbWUoaGFuZGxlVGFibGVBc0RhdGEsICJoYW5kbGVUYWJsZUFzRGF0YSIpOwogIGZ1bmN0aW9uIGhhbmRsZVRhYmxlUm93QXNEYXRhKG5vZGUyLCBzdGF0ZSwgaW5mbykgewogICAgY29uc3QgY2hpbGRyZW4yID0gbm9kZTIuY2hpbGRyZW47CiAgICBsZXQgaW5kZXgyID0gLTE7CiAgICBjb25zdCByZXN1bHQgPSBbXTsKICAgIGNvbnN0IHN1YmV4aXQgPSBzdGF0ZS5lbnRlcigidGFibGVSb3ciKTsKICAgIHdoaWxlICgrK2luZGV4MiA8IGNoaWxkcmVuMi5sZW5ndGgpIHsKICAgICAgcmVzdWx0W2luZGV4Ml0gPSBoYW5kbGVUYWJsZUNlbGwoY2hpbGRyZW4yW2luZGV4Ml0sIG5vZGUyLCBzdGF0ZSwgaW5mbyk7CiAgICB9CiAgICBzdWJleGl0KCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KICBfX25hbWUoaGFuZGxlVGFibGVSb3dBc0RhdGEsICJoYW5kbGVUYWJsZVJvd0FzRGF0YSIpOwogIGZ1bmN0aW9uIGlubGluZUNvZGVXaXRoVGFibGUobm9kZTIsIHBhcmVudCwgc3RhdGUpIHsKICAgIGxldCB2YWx1ZTIgPSBoYW5kbGUuaW5saW5lQ29kZShub2RlMiwgcGFyZW50LCBzdGF0ZSk7CiAgICBpZiAoc3RhdGUuc3RhY2suaW5jbHVkZXMoInRhYmxlQ2VsbCIpKSB7CiAgICAgIHZhbHVlMiA9IHZhbHVlMi5yZXBsYWNlKC9cfC9nLCAiXFwkJiIpOwogICAgfQogICAgcmV0dXJuIHZhbHVlMjsKICB9CiAgX19uYW1lKGlubGluZUNvZGVXaXRoVGFibGUsICJpbmxpbmVDb2RlV2l0aFRhYmxlIik7Cn0KX19uYW1lKGdmbVRhYmxlVG9NYXJrZG93biwgImdmbVRhYmxlVG9NYXJrZG93biIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtZ2ZtLXRhc2stbGlzdC1pdGVtQDIuMC4wL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLWdmbS10YXNrLWxpc3QtaXRlbS9saWIvaW5kZXguanMKZnVuY3Rpb24gZ2ZtVGFza0xpc3RJdGVtRnJvbU1hcmtkb3duKCkgewogIHJldHVybiB7CiAgICBleGl0OiB7CiAgICAgIHRhc2tMaXN0Q2hlY2tWYWx1ZUNoZWNrZWQ6IGV4aXRDaGVjaywKICAgICAgdGFza0xpc3RDaGVja1ZhbHVlVW5jaGVja2VkOiBleGl0Q2hlY2ssCiAgICAgIHBhcmFncmFwaDogZXhpdFBhcmFncmFwaFdpdGhUYXNrTGlzdEl0ZW0KICAgIH0KICB9Owp9Cl9fbmFtZShnZm1UYXNrTGlzdEl0ZW1Gcm9tTWFya2Rvd24sICJnZm1UYXNrTGlzdEl0ZW1Gcm9tTWFya2Rvd24iKTsKZnVuY3Rpb24gZ2ZtVGFza0xpc3RJdGVtVG9NYXJrZG93bigpIHsKICByZXR1cm4gewogICAgdW5zYWZlOiBbeyBhdEJyZWFrOiB0cnVlLCBjaGFyYWN0ZXI6ICItIiwgYWZ0ZXI6ICJbOnwtXSIgfV0sCiAgICBoYW5kbGVyczogeyBsaXN0SXRlbTogbGlzdEl0ZW1XaXRoVGFza0xpc3RJdGVtIH0KICB9Owp9Cl9fbmFtZShnZm1UYXNrTGlzdEl0ZW1Ub01hcmtkb3duLCAiZ2ZtVGFza0xpc3RJdGVtVG9NYXJrZG93biIpOwpmdW5jdGlvbiBleGl0Q2hlY2sodG9rZW4pIHsKICBjb25zdCBub2RlMiA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAyXTsKICBvayhub2RlMi50eXBlID09PSAibGlzdEl0ZW0iKTsKICBub2RlMi5jaGVja2VkID0gdG9rZW4udHlwZSA9PT0gInRhc2tMaXN0Q2hlY2tWYWx1ZUNoZWNrZWQiOwp9Cl9fbmFtZShleGl0Q2hlY2ssICJleGl0Q2hlY2siKTsKZnVuY3Rpb24gZXhpdFBhcmFncmFwaFdpdGhUYXNrTGlzdEl0ZW0odG9rZW4pIHsKICBjb25zdCBwYXJlbnQgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMl07CiAgaWYgKHBhcmVudCAmJiBwYXJlbnQudHlwZSA9PT0gImxpc3RJdGVtIiAmJiB0eXBlb2YgcGFyZW50LmNoZWNrZWQgPT09ICJib29sZWFuIikgewogICAgY29uc3Qgbm9kZTIgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgICBvayhub2RlMi50eXBlID09PSAicGFyYWdyYXBoIik7CiAgICBjb25zdCBoZWFkMiA9IG5vZGUyLmNoaWxkcmVuWzBdOwogICAgaWYgKGhlYWQyICYmIGhlYWQyLnR5cGUgPT09ICJ0ZXh0IikgewogICAgICBjb25zdCBzaWJsaW5nczIgPSBwYXJlbnQuY2hpbGRyZW47CiAgICAgIGxldCBpbmRleDIgPSAtMTsKICAgICAgbGV0IGZpcnN0UGFyYWdocmFwaDsKICAgICAgd2hpbGUgKCsraW5kZXgyIDwgc2libGluZ3MyLmxlbmd0aCkgewogICAgICAgIGNvbnN0IHNpYmxpbmcgPSBzaWJsaW5nczJbaW5kZXgyXTsKICAgICAgICBpZiAoc2libGluZy50eXBlID09PSAicGFyYWdyYXBoIikgewogICAgICAgICAgZmlyc3RQYXJhZ2hyYXBoID0gc2libGluZzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZmlyc3RQYXJhZ2hyYXBoID09PSBub2RlMikgewogICAgICAgIGhlYWQyLnZhbHVlID0gaGVhZDIudmFsdWUuc2xpY2UoMSk7CiAgICAgICAgaWYgKGhlYWQyLnZhbHVlLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgbm9kZTIuY2hpbGRyZW4uc2hpZnQoKTsKICAgICAgICB9IGVsc2UgaWYgKG5vZGUyLnBvc2l0aW9uICYmIGhlYWQyLnBvc2l0aW9uICYmIHR5cGVvZiBoZWFkMi5wb3NpdGlvbi5zdGFydC5vZmZzZXQgPT09ICJudW1iZXIiKSB7CiAgICAgICAgICBoZWFkMi5wb3NpdGlvbi5zdGFydC5jb2x1bW4rKzsKICAgICAgICAgIGhlYWQyLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldCsrOwogICAgICAgICAgbm9kZTIucG9zaXRpb24uc3RhcnQgPSBPYmplY3QuYXNzaWduKHt9LCBoZWFkMi5wb3NpdGlvbi5zdGFydCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIHRoaXMuZXhpdCh0b2tlbik7Cn0KX19uYW1lKGV4aXRQYXJhZ3JhcGhXaXRoVGFza0xpc3RJdGVtLCAiZXhpdFBhcmFncmFwaFdpdGhUYXNrTGlzdEl0ZW0iKTsKZnVuY3Rpb24gbGlzdEl0ZW1XaXRoVGFza0xpc3RJdGVtKG5vZGUyLCBwYXJlbnQsIHN0YXRlLCBpbmZvKSB7CiAgY29uc3QgaGVhZDIgPSBub2RlMi5jaGlsZHJlblswXTsKICBjb25zdCBjaGVja2FibGUgPSB0eXBlb2Ygbm9kZTIuY2hlY2tlZCA9PT0gImJvb2xlYW4iICYmIGhlYWQyICYmIGhlYWQyLnR5cGUgPT09ICJwYXJhZ3JhcGgiOwogIGNvbnN0IGNoZWNrYm94ID0gIlsiICsgKG5vZGUyLmNoZWNrZWQgPyAieCIgOiAiICIpICsgIl0gIjsKICBjb25zdCB0cmFja2VyID0gc3RhdGUuY3JlYXRlVHJhY2tlcihpbmZvKTsKICBpZiAoY2hlY2thYmxlKSB7CiAgICB0cmFja2VyLm1vdmUoY2hlY2tib3gpOwogIH0KICBsZXQgdmFsdWUyID0gaGFuZGxlLmxpc3RJdGVtKG5vZGUyLCBwYXJlbnQsIHN0YXRlLCB7CiAgICAuLi5pbmZvLAogICAgLi4udHJhY2tlci5jdXJyZW50KCkKICB9KTsKICBpZiAoY2hlY2thYmxlKSB7CiAgICB2YWx1ZTIgPSB2YWx1ZTIucmVwbGFjZSgvXig/OlsqKy1dfFxkK1wuKShbXHJcbl18IHsxLDN9KS8sIGNoZWNrKTsKICB9CiAgcmV0dXJuIHZhbHVlMjsKICBmdW5jdGlvbiBjaGVjaygkMCkgewogICAgcmV0dXJuICQwICsgY2hlY2tib3g7CiAgfQogIF9fbmFtZShjaGVjaywgImNoZWNrIik7Cn0KX19uYW1lKGxpc3RJdGVtV2l0aFRhc2tMaXN0SXRlbSwgImxpc3RJdGVtV2l0aFRhc2tMaXN0SXRlbSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtZ2ZtQDMuMS4wL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLWdmbS9saWIvaW5kZXguanMKZnVuY3Rpb24gZ2ZtRnJvbU1hcmtkb3duKCkgewogIHJldHVybiBbCiAgICBnZm1BdXRvbGlua0xpdGVyYWxGcm9tTWFya2Rvd24oKSwKICAgIGdmbUZvb3Rub3RlRnJvbU1hcmtkb3duKCksCiAgICBnZm1TdHJpa2V0aHJvdWdoRnJvbU1hcmtkb3duKCksCiAgICBnZm1UYWJsZUZyb21NYXJrZG93bigpLAogICAgZ2ZtVGFza0xpc3RJdGVtRnJvbU1hcmtkb3duKCkKICBdOwp9Cl9fbmFtZShnZm1Gcm9tTWFya2Rvd24sICJnZm1Gcm9tTWFya2Rvd24iKTsKZnVuY3Rpb24gZ2ZtVG9NYXJrZG93bihvcHRpb25zKSB7CiAgcmV0dXJuIHsKICAgIGV4dGVuc2lvbnM6IFsKICAgICAgZ2ZtQXV0b2xpbmtMaXRlcmFsVG9NYXJrZG93bigpLAogICAgICBnZm1Gb290bm90ZVRvTWFya2Rvd24ob3B0aW9ucyksCiAgICAgIGdmbVN0cmlrZXRocm91Z2hUb01hcmtkb3duKCksCiAgICAgIGdmbVRhYmxlVG9NYXJrZG93bihvcHRpb25zKSwKICAgICAgZ2ZtVGFza0xpc3RJdGVtVG9NYXJrZG93bigpCiAgICBdCiAgfTsKfQpfX25hbWUoZ2ZtVG9NYXJrZG93biwgImdmbVRvTWFya2Rvd24iKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstdXRpbC1jaHVua2VkQDIuMC4xL25vZGVfbW9kdWxlcy9taWNyb21hcmstdXRpbC1jaHVua2VkL2luZGV4LmpzCmZ1bmN0aW9uIHNwbGljZShsaXN0NSwgc3RhcnQsIHJlbW92ZTIsIGl0ZW1zKSB7CiAgY29uc3QgZW5kID0gbGlzdDUubGVuZ3RoOwogIGxldCBjaHVua1N0YXJ0ID0gMDsKICBsZXQgcGFyYW1ldGVyczsKICBpZiAoc3RhcnQgPCAwKSB7CiAgICBzdGFydCA9IC1zdGFydCA+IGVuZCA/IDAgOiBlbmQgKyBzdGFydDsKICB9IGVsc2UgewogICAgc3RhcnQgPSBzdGFydCA+IGVuZCA/IGVuZCA6IHN0YXJ0OwogIH0KICByZW1vdmUyID0gcmVtb3ZlMiA+IDAgPyByZW1vdmUyIDogMDsKICBpZiAoaXRlbXMubGVuZ3RoIDwgMWU0KSB7CiAgICBwYXJhbWV0ZXJzID0gQXJyYXkuZnJvbShpdGVtcyk7CiAgICBwYXJhbWV0ZXJzLnVuc2hpZnQoc3RhcnQsIHJlbW92ZTIpOwogICAgbGlzdDUuc3BsaWNlKC4uLnBhcmFtZXRlcnMpOwogIH0gZWxzZSB7CiAgICBpZiAocmVtb3ZlMikgbGlzdDUuc3BsaWNlKHN0YXJ0LCByZW1vdmUyKTsKICAgIHdoaWxlIChjaHVua1N0YXJ0IDwgaXRlbXMubGVuZ3RoKSB7CiAgICAgIHBhcmFtZXRlcnMgPSBpdGVtcy5zbGljZShjaHVua1N0YXJ0LCBjaHVua1N0YXJ0ICsgMWU0KTsKICAgICAgcGFyYW1ldGVycy51bnNoaWZ0KHN0YXJ0LCAwKTsKICAgICAgbGlzdDUuc3BsaWNlKC4uLnBhcmFtZXRlcnMpOwogICAgICBjaHVua1N0YXJ0ICs9IDFlNDsKICAgICAgc3RhcnQgKz0gMWU0OwogICAgfQogIH0KfQpfX25hbWUoc3BsaWNlLCAic3BsaWNlIik7CmZ1bmN0aW9uIHB1c2gobGlzdDUsIGl0ZW1zKSB7CiAgaWYgKGxpc3Q1Lmxlbmd0aCA+IDApIHsKICAgIHNwbGljZShsaXN0NSwgbGlzdDUubGVuZ3RoLCAwLCBpdGVtcyk7CiAgICByZXR1cm4gbGlzdDU7CiAgfQogIHJldHVybiBpdGVtczsKfQpfX25hbWUocHVzaCwgInB1c2giKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstdXRpbC1jb21iaW5lLWV4dGVuc2lvbnNAMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay11dGlsLWNvbWJpbmUtZXh0ZW5zaW9ucy9pbmRleC5qcwp2YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNPd25Qcm9wZXJ0eTsKZnVuY3Rpb24gY29tYmluZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucykgewogIGNvbnN0IGFsbDMgPSB7fTsKICBsZXQgaW5kZXgyID0gLTE7CiAgd2hpbGUgKCsraW5kZXgyIDwgZXh0ZW5zaW9ucy5sZW5ndGgpIHsKICAgIHN5bnRheEV4dGVuc2lvbihhbGwzLCBleHRlbnNpb25zW2luZGV4Ml0pOwogIH0KICByZXR1cm4gYWxsMzsKfQpfX25hbWUoY29tYmluZUV4dGVuc2lvbnMsICJjb21iaW5lRXh0ZW5zaW9ucyIpOwpmdW5jdGlvbiBzeW50YXhFeHRlbnNpb24oYWxsMywgZXh0ZW5zaW9uMikgewogIGxldCBob29rOwogIGZvciAoaG9vayBpbiBleHRlbnNpb24yKSB7CiAgICBjb25zdCBtYXliZSA9IGhhc093blByb3BlcnR5LmNhbGwoYWxsMywgaG9vaykgPyBhbGwzW2hvb2tdIDogdm9pZCAwOwogICAgY29uc3QgbGVmdCA9IG1heWJlIHx8IChhbGwzW2hvb2tdID0ge30pOwogICAgY29uc3QgcmlnaHQgPSBleHRlbnNpb24yW2hvb2tdOwogICAgbGV0IGNvZGU0OwogICAgaWYgKHJpZ2h0KSB7CiAgICAgIGZvciAoY29kZTQgaW4gcmlnaHQpIHsKICAgICAgICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwobGVmdCwgY29kZTQpKSBsZWZ0W2NvZGU0XSA9IFtdOwogICAgICAgIGNvbnN0IHZhbHVlMiA9IHJpZ2h0W2NvZGU0XTsKICAgICAgICBjb25zdHJ1Y3RzKAogICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBMb29rcyBsaWtlIGEgbGlzdC4KICAgICAgICAgIGxlZnRbY29kZTRdLAogICAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZTIpID8gdmFsdWUyIDogdmFsdWUyID8gW3ZhbHVlMl0gOiBbXQogICAgICAgICk7CiAgICAgIH0KICAgIH0KICB9Cn0KX19uYW1lKHN5bnRheEV4dGVuc2lvbiwgInN5bnRheEV4dGVuc2lvbiIpOwpmdW5jdGlvbiBjb25zdHJ1Y3RzKGV4aXN0aW5nLCBsaXN0NSkgewogIGxldCBpbmRleDIgPSAtMTsKICBjb25zdCBiZWZvcmUgPSBbXTsKICB3aGlsZSAoKytpbmRleDIgPCBsaXN0NS5sZW5ndGgpIHsKICAgIDsKICAgIChsaXN0NVtpbmRleDJdLmFkZCA9PT0gImFmdGVyIiA/IGV4aXN0aW5nIDogYmVmb3JlKS5wdXNoKGxpc3Q1W2luZGV4Ml0pOwogIH0KICBzcGxpY2UoZXhpc3RpbmcsIDAsIDAsIGJlZm9yZSk7Cn0KX19uYW1lKGNvbnN0cnVjdHMsICJjb25zdHJ1Y3RzIik7CmZ1bmN0aW9uIGNvbWJpbmVIdG1sRXh0ZW5zaW9ucyhodG1sRXh0ZW5zaW9ucykgewogIGNvbnN0IGhhbmRsZXJzMiA9IHt9OwogIGxldCBpbmRleDIgPSAtMTsKICB3aGlsZSAoKytpbmRleDIgPCBodG1sRXh0ZW5zaW9ucy5sZW5ndGgpIHsKICAgIGh0bWxFeHRlbnNpb24oaGFuZGxlcnMyLCBodG1sRXh0ZW5zaW9uc1tpbmRleDJdKTsKICB9CiAgcmV0dXJuIGhhbmRsZXJzMjsKfQpfX25hbWUoY29tYmluZUh0bWxFeHRlbnNpb25zLCAiY29tYmluZUh0bWxFeHRlbnNpb25zIik7CmZ1bmN0aW9uIGh0bWxFeHRlbnNpb24oYWxsMywgZXh0ZW5zaW9uMikgewogIGxldCBob29rOwogIGZvciAoaG9vayBpbiBleHRlbnNpb24yKSB7CiAgICBjb25zdCBtYXliZSA9IGhhc093blByb3BlcnR5LmNhbGwoYWxsMywgaG9vaykgPyBhbGwzW2hvb2tdIDogdm9pZCAwOwogICAgY29uc3QgbGVmdCA9IG1heWJlIHx8IChhbGwzW2hvb2tdID0ge30pOwogICAgY29uc3QgcmlnaHQgPSBleHRlbnNpb24yW2hvb2tdOwogICAgbGV0IHR5cGU1OwogICAgaWYgKHJpZ2h0KSB7CiAgICAgIGZvciAodHlwZTUgaW4gcmlnaHQpIHsKICAgICAgICBsZWZ0W3R5cGU1XSA9IHJpZ2h0W3R5cGU1XTsKICAgICAgfQogICAgfQogIH0KfQpfX25hbWUoaHRtbEV4dGVuc2lvbiwgImh0bWxFeHRlbnNpb24iKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS1hdXRvbGluay1saXRlcmFsQDIuMS4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS1hdXRvbGluay1saXRlcmFsL2xpYi9zeW50YXguanMKdmFyIHd3d1ByZWZpeCA9IHsKICB0b2tlbml6ZTogdG9rZW5pemVXd3dQcmVmaXgsCiAgcGFydGlhbDogdHJ1ZQp9Owp2YXIgZG9tYWluID0gewogIHRva2VuaXplOiB0b2tlbml6ZURvbWFpbiwKICBwYXJ0aWFsOiB0cnVlCn07CnZhciBwYXRoID0gewogIHRva2VuaXplOiB0b2tlbml6ZVBhdGgsCiAgcGFydGlhbDogdHJ1ZQp9Owp2YXIgdHJhaWwgPSB7CiAgdG9rZW5pemU6IHRva2VuaXplVHJhaWwsCiAgcGFydGlhbDogdHJ1ZQp9Owp2YXIgZW1haWxEb21haW5Eb3RUcmFpbCA9IHsKICB0b2tlbml6ZTogdG9rZW5pemVFbWFpbERvbWFpbkRvdFRyYWlsLAogIHBhcnRpYWw6IHRydWUKfTsKdmFyIHd3d0F1dG9saW5rID0gewogIG5hbWU6ICJ3d3dBdXRvbGluayIsCiAgdG9rZW5pemU6IHRva2VuaXplV3d3QXV0b2xpbmssCiAgcHJldmlvdXM6IHByZXZpb3VzV3d3Cn07CnZhciBwcm90b2NvbEF1dG9saW5rID0gewogIG5hbWU6ICJwcm90b2NvbEF1dG9saW5rIiwKICB0b2tlbml6ZTogdG9rZW5pemVQcm90b2NvbEF1dG9saW5rLAogIHByZXZpb3VzOiBwcmV2aW91c1Byb3RvY29sCn07CnZhciBlbWFpbEF1dG9saW5rID0gewogIG5hbWU6ICJlbWFpbEF1dG9saW5rIiwKICB0b2tlbml6ZTogdG9rZW5pemVFbWFpbEF1dG9saW5rLAogIHByZXZpb3VzOiBwcmV2aW91c0VtYWlsCn07CnZhciB0ZXh0MiA9IHt9OwpmdW5jdGlvbiBnZm1BdXRvbGlua0xpdGVyYWwoKSB7CiAgcmV0dXJuIHsKICAgIHRleHQ6IHRleHQyCiAgfTsKfQpfX25hbWUoZ2ZtQXV0b2xpbmtMaXRlcmFsLCAiZ2ZtQXV0b2xpbmtMaXRlcmFsIik7CnZhciBjb2RlMiA9IDQ4Owp3aGlsZSAoY29kZTIgPCAxMjMpIHsKICB0ZXh0Mltjb2RlMl0gPSBlbWFpbEF1dG9saW5rOwogIGNvZGUyKys7CiAgaWYgKGNvZGUyID09PSA1OCkgY29kZTIgPSA2NTsKICBlbHNlIGlmIChjb2RlMiA9PT0gOTEpIGNvZGUyID0gOTc7Cn0KdGV4dDJbNDNdID0gZW1haWxBdXRvbGluazsKdGV4dDJbNDVdID0gZW1haWxBdXRvbGluazsKdGV4dDJbNDZdID0gZW1haWxBdXRvbGluazsKdGV4dDJbOTVdID0gZW1haWxBdXRvbGluazsKdGV4dDJbNzJdID0gW2VtYWlsQXV0b2xpbmssIHByb3RvY29sQXV0b2xpbmtdOwp0ZXh0MlsxMDRdID0gW2VtYWlsQXV0b2xpbmssIHByb3RvY29sQXV0b2xpbmtdOwp0ZXh0Mls4N10gPSBbZW1haWxBdXRvbGluaywgd3d3QXV0b2xpbmtdOwp0ZXh0MlsxMTldID0gW2VtYWlsQXV0b2xpbmssIHd3d0F1dG9saW5rXTsKZnVuY3Rpb24gdG9rZW5pemVFbWFpbEF1dG9saW5rKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIGxldCBkb3Q7CiAgbGV0IGRhdGE7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBpZiAoIWdmbUF0ZXh0KGNvZGU0KSB8fCAhcHJldmlvdXNFbWFpbC5jYWxsKHNlbGYyLCBzZWxmMi5wcmV2aW91cykgfHwgcHJldmlvdXNVbmJhbGFuY2VkKHNlbGYyLmV2ZW50cykpIHsKICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICBlZmZlY3RzLmVudGVyKCJsaXRlcmFsQXV0b2xpbmsiKTsKICAgIGVmZmVjdHMuZW50ZXIoImxpdGVyYWxBdXRvbGlua0VtYWlsIik7CiAgICByZXR1cm4gYXRleHQoY29kZTQpOwogIH0KICBfX25hbWUoc3RhcnQsICJzdGFydCIpOwogIGZ1bmN0aW9uIGF0ZXh0KGNvZGU0KSB7CiAgICBpZiAoZ2ZtQXRleHQoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBhdGV4dDsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gNjQpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGVtYWlsRG9tYWluOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZShhdGV4dCwgImF0ZXh0Iik7CiAgZnVuY3Rpb24gZW1haWxEb21haW4oY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDYpIHsKICAgICAgcmV0dXJuIGVmZmVjdHMuY2hlY2soZW1haWxEb21haW5Eb3RUcmFpbCwgZW1haWxEb21haW5BZnRlciwgZW1haWxEb21haW5Eb3QpKGNvZGU0KTsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gNDUgfHwgY29kZTQgPT09IDk1IHx8IGFzY2lpQWxwaGFudW1lcmljKGNvZGU0KSkgewogICAgICBkYXRhID0gdHJ1ZTsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGVtYWlsRG9tYWluOwogICAgfQogICAgcmV0dXJuIGVtYWlsRG9tYWluQWZ0ZXIoY29kZTQpOwogIH0KICBfX25hbWUoZW1haWxEb21haW4sICJlbWFpbERvbWFpbiIpOwogIGZ1bmN0aW9uIGVtYWlsRG9tYWluRG90KGNvZGU0KSB7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgZG90ID0gdHJ1ZTsKICAgIHJldHVybiBlbWFpbERvbWFpbjsKICB9CiAgX19uYW1lKGVtYWlsRG9tYWluRG90LCAiZW1haWxEb21haW5Eb3QiKTsKICBmdW5jdGlvbiBlbWFpbERvbWFpbkFmdGVyKGNvZGU0KSB7CiAgICBpZiAoZGF0YSAmJiBkb3QgJiYgYXNjaWlBbHBoYShzZWxmMi5wcmV2aW91cykpIHsKICAgICAgZWZmZWN0cy5leGl0KCJsaXRlcmFsQXV0b2xpbmtFbWFpbCIpOwogICAgICBlZmZlY3RzLmV4aXQoImxpdGVyYWxBdXRvbGluayIpOwogICAgICByZXR1cm4gb2szKGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBfX25hbWUoZW1haWxEb21haW5BZnRlciwgImVtYWlsRG9tYWluQWZ0ZXIiKTsKfQpfX25hbWUodG9rZW5pemVFbWFpbEF1dG9saW5rLCAidG9rZW5pemVFbWFpbEF1dG9saW5rIik7CmZ1bmN0aW9uIHRva2VuaXplV3d3QXV0b2xpbmsoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgcmV0dXJuIHd3d1N0YXJ0OwogIGZ1bmN0aW9uIHd3d1N0YXJ0KGNvZGU0KSB7CiAgICBpZiAoY29kZTQgIT09IDg3ICYmIGNvZGU0ICE9PSAxMTkgfHwgIXByZXZpb3VzV3d3LmNhbGwoc2VsZjIsIHNlbGYyLnByZXZpb3VzKSB8fCBwcmV2aW91c1VuYmFsYW5jZWQoc2VsZjIuZXZlbnRzKSkgewogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuZW50ZXIoImxpdGVyYWxBdXRvbGluayIpOwogICAgZWZmZWN0cy5lbnRlcigibGl0ZXJhbEF1dG9saW5rV3d3Iik7CiAgICByZXR1cm4gZWZmZWN0cy5jaGVjayh3d3dQcmVmaXgsIGVmZmVjdHMuYXR0ZW1wdChkb21haW4sIGVmZmVjdHMuYXR0ZW1wdChwYXRoLCB3d3dBZnRlciksIG5vayksIG5vaykoY29kZTQpOwogIH0KICBfX25hbWUod3d3U3RhcnQsICJ3d3dTdGFydCIpOwogIGZ1bmN0aW9uIHd3d0FmdGVyKGNvZGU0KSB7CiAgICBlZmZlY3RzLmV4aXQoImxpdGVyYWxBdXRvbGlua1d3dyIpOwogICAgZWZmZWN0cy5leGl0KCJsaXRlcmFsQXV0b2xpbmsiKTsKICAgIHJldHVybiBvazMoY29kZTQpOwogIH0KICBfX25hbWUod3d3QWZ0ZXIsICJ3d3dBZnRlciIpOwp9Cl9fbmFtZSh0b2tlbml6ZVd3d0F1dG9saW5rLCAidG9rZW5pemVXd3dBdXRvbGluayIpOwpmdW5jdGlvbiB0b2tlbml6ZVByb3RvY29sQXV0b2xpbmsoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgbGV0IGJ1ZmZlcjIgPSAiIjsKICBsZXQgc2VlbiA9IGZhbHNlOwogIHJldHVybiBwcm90b2NvbFN0YXJ0OwogIGZ1bmN0aW9uIHByb3RvY29sU3RhcnQoY29kZTQpIHsKICAgIGlmICgoY29kZTQgPT09IDcyIHx8IGNvZGU0ID09PSAxMDQpICYmIHByZXZpb3VzUHJvdG9jb2wuY2FsbChzZWxmMiwgc2VsZjIucHJldmlvdXMpICYmICFwcmV2aW91c1VuYmFsYW5jZWQoc2VsZjIuZXZlbnRzKSkgewogICAgICBlZmZlY3RzLmVudGVyKCJsaXRlcmFsQXV0b2xpbmsiKTsKICAgICAgZWZmZWN0cy5lbnRlcigibGl0ZXJhbEF1dG9saW5rSHR0cCIpOwogICAgICBidWZmZXIyICs9IFN0cmluZy5mcm9tQ29kZVBvaW50KGNvZGU0KTsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHByb3RvY29sUHJlZml4SW5zaWRlOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZShwcm90b2NvbFN0YXJ0LCAicHJvdG9jb2xTdGFydCIpOwogIGZ1bmN0aW9uIHByb3RvY29sUHJlZml4SW5zaWRlKGNvZGU0KSB7CiAgICBpZiAoYXNjaWlBbHBoYShjb2RlNCkgJiYgYnVmZmVyMi5sZW5ndGggPCA1KSB7CiAgICAgIGJ1ZmZlcjIgKz0gU3RyaW5nLmZyb21Db2RlUG9pbnQoY29kZTQpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gcHJvdG9jb2xQcmVmaXhJbnNpZGU7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDU4KSB7CiAgICAgIGNvbnN0IHByb3RvY29sID0gYnVmZmVyMi50b0xvd2VyQ2FzZSgpOwogICAgICBpZiAocHJvdG9jb2wgPT09ICJodHRwIiB8fCBwcm90b2NvbCA9PT0gImh0dHBzIikgewogICAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgICAgcmV0dXJuIHByb3RvY29sU2xhc2hlc0luc2lkZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZShwcm90b2NvbFByZWZpeEluc2lkZSwgInByb3RvY29sUHJlZml4SW5zaWRlIik7CiAgZnVuY3Rpb24gcHJvdG9jb2xTbGFzaGVzSW5zaWRlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDQ3KSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGlmIChzZWVuKSB7CiAgICAgICAgcmV0dXJuIGFmdGVyUHJvdG9jb2w7CiAgICAgIH0KICAgICAgc2VlbiA9IHRydWU7CiAgICAgIHJldHVybiBwcm90b2NvbFNsYXNoZXNJbnNpZGU7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKHByb3RvY29sU2xhc2hlc0luc2lkZSwgInByb3RvY29sU2xhc2hlc0luc2lkZSIpOwogIGZ1bmN0aW9uIGFmdGVyUHJvdG9jb2woY29kZTQpIHsKICAgIHJldHVybiBjb2RlNCA9PT0gbnVsbCB8fCBhc2NpaUNvbnRyb2woY29kZTQpIHx8IG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpIHx8IHVuaWNvZGVXaGl0ZXNwYWNlKGNvZGU0KSB8fCB1bmljb2RlUHVuY3R1YXRpb24oY29kZTQpID8gbm9rKGNvZGU0KSA6IGVmZmVjdHMuYXR0ZW1wdChkb21haW4sIGVmZmVjdHMuYXR0ZW1wdChwYXRoLCBwcm90b2NvbEFmdGVyKSwgbm9rKShjb2RlNCk7CiAgfQogIF9fbmFtZShhZnRlclByb3RvY29sLCAiYWZ0ZXJQcm90b2NvbCIpOwogIGZ1bmN0aW9uIHByb3RvY29sQWZ0ZXIoY29kZTQpIHsKICAgIGVmZmVjdHMuZXhpdCgibGl0ZXJhbEF1dG9saW5rSHR0cCIpOwogICAgZWZmZWN0cy5leGl0KCJsaXRlcmFsQXV0b2xpbmsiKTsKICAgIHJldHVybiBvazMoY29kZTQpOwogIH0KICBfX25hbWUocHJvdG9jb2xBZnRlciwgInByb3RvY29sQWZ0ZXIiKTsKfQpfX25hbWUodG9rZW5pemVQcm90b2NvbEF1dG9saW5rLCAidG9rZW5pemVQcm90b2NvbEF1dG9saW5rIik7CmZ1bmN0aW9uIHRva2VuaXplV3d3UHJlZml4KGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgbGV0IHNpemUgPSAwOwogIHJldHVybiB3d3dQcmVmaXhJbnNpZGU7CiAgZnVuY3Rpb24gd3d3UHJlZml4SW5zaWRlKGNvZGU0KSB7CiAgICBpZiAoKGNvZGU0ID09PSA4NyB8fCBjb2RlNCA9PT0gMTE5KSAmJiBzaXplIDwgMykgewogICAgICBzaXplKys7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiB3d3dQcmVmaXhJbnNpZGU7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDQ2ICYmIHNpemUgPT09IDMpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHd3d1ByZWZpeEFmdGVyOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZSh3d3dQcmVmaXhJbnNpZGUsICJ3d3dQcmVmaXhJbnNpZGUiKTsKICBmdW5jdGlvbiB3d3dQcmVmaXhBZnRlcihjb2RlNCkgewogICAgcmV0dXJuIGNvZGU0ID09PSBudWxsID8gbm9rKGNvZGU0KSA6IG9rMyhjb2RlNCk7CiAgfQogIF9fbmFtZSh3d3dQcmVmaXhBZnRlciwgInd3d1ByZWZpeEFmdGVyIik7Cn0KX19uYW1lKHRva2VuaXplV3d3UHJlZml4LCAidG9rZW5pemVXd3dQcmVmaXgiKTsKZnVuY3Rpb24gdG9rZW5pemVEb21haW4oZWZmZWN0cywgb2szLCBub2spIHsKICBsZXQgdW5kZXJzY29yZUluTGFzdFNlZ21lbnQ7CiAgbGV0IHVuZGVyc2NvcmVJbkxhc3RMYXN0U2VnbWVudDsKICBsZXQgc2VlbjsKICByZXR1cm4gZG9tYWluSW5zaWRlOwogIGZ1bmN0aW9uIGRvbWFpbkluc2lkZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0NiB8fCBjb2RlNCA9PT0gOTUpIHsKICAgICAgcmV0dXJuIGVmZmVjdHMuY2hlY2sodHJhaWwsIGRvbWFpbkFmdGVyLCBkb21haW5BdFB1bmN0dWF0aW9uKShjb2RlNCk7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlNCkgfHwgdW5pY29kZVdoaXRlc3BhY2UoY29kZTQpIHx8IGNvZGU0ICE9PSA0NSAmJiB1bmljb2RlUHVuY3R1YXRpb24oY29kZTQpKSB7CiAgICAgIHJldHVybiBkb21haW5BZnRlcihjb2RlNCk7CiAgICB9CiAgICBzZWVuID0gdHJ1ZTsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gZG9tYWluSW5zaWRlOwogIH0KICBfX25hbWUoZG9tYWluSW5zaWRlLCAiZG9tYWluSW5zaWRlIik7CiAgZnVuY3Rpb24gZG9tYWluQXRQdW5jdHVhdGlvbihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA5NSkgewogICAgICB1bmRlcnNjb3JlSW5MYXN0U2VnbWVudCA9IHRydWU7CiAgICB9IGVsc2UgewogICAgICB1bmRlcnNjb3JlSW5MYXN0TGFzdFNlZ21lbnQgPSB1bmRlcnNjb3JlSW5MYXN0U2VnbWVudDsKICAgICAgdW5kZXJzY29yZUluTGFzdFNlZ21lbnQgPSB2b2lkIDA7CiAgICB9CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIGRvbWFpbkluc2lkZTsKICB9CiAgX19uYW1lKGRvbWFpbkF0UHVuY3R1YXRpb24sICJkb21haW5BdFB1bmN0dWF0aW9uIik7CiAgZnVuY3Rpb24gZG9tYWluQWZ0ZXIoY29kZTQpIHsKICAgIGlmICh1bmRlcnNjb3JlSW5MYXN0TGFzdFNlZ21lbnQgfHwgdW5kZXJzY29yZUluTGFzdFNlZ21lbnQgfHwgIXNlZW4pIHsKICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gb2szKGNvZGU0KTsKICB9CiAgX19uYW1lKGRvbWFpbkFmdGVyLCAiZG9tYWluQWZ0ZXIiKTsKfQpfX25hbWUodG9rZW5pemVEb21haW4sICJ0b2tlbml6ZURvbWFpbiIpOwpmdW5jdGlvbiB0b2tlbml6ZVBhdGgoZWZmZWN0cywgb2szKSB7CiAgbGV0IHNpemVPcGVuID0gMDsKICBsZXQgc2l6ZUNsb3NlID0gMDsKICByZXR1cm4gcGF0aEluc2lkZTsKICBmdW5jdGlvbiBwYXRoSW5zaWRlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDQwKSB7CiAgICAgIHNpemVPcGVuKys7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBwYXRoSW5zaWRlOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA0MSAmJiBzaXplQ2xvc2UgPCBzaXplT3BlbikgewogICAgICByZXR1cm4gcGF0aEF0UHVuY3R1YXRpb24oY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSAzMyB8fCBjb2RlNCA9PT0gMzQgfHwgY29kZTQgPT09IDM4IHx8IGNvZGU0ID09PSAzOSB8fCBjb2RlNCA9PT0gNDEgfHwgY29kZTQgPT09IDQyIHx8IGNvZGU0ID09PSA0NCB8fCBjb2RlNCA9PT0gNDYgfHwgY29kZTQgPT09IDU4IHx8IGNvZGU0ID09PSA1OSB8fCBjb2RlNCA9PT0gNjAgfHwgY29kZTQgPT09IDYzIHx8IGNvZGU0ID09PSA5MyB8fCBjb2RlNCA9PT0gOTUgfHwgY29kZTQgPT09IDEyNikgewogICAgICByZXR1cm4gZWZmZWN0cy5jaGVjayh0cmFpbCwgb2szLCBwYXRoQXRQdW5jdHVhdGlvbikoY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpIHx8IHVuaWNvZGVXaGl0ZXNwYWNlKGNvZGU0KSkgewogICAgICByZXR1cm4gb2szKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gcGF0aEluc2lkZTsKICB9CiAgX19uYW1lKHBhdGhJbnNpZGUsICJwYXRoSW5zaWRlIik7CiAgZnVuY3Rpb24gcGF0aEF0UHVuY3R1YXRpb24oY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDEpIHsKICAgICAgc2l6ZUNsb3NlKys7CiAgICB9CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIHBhdGhJbnNpZGU7CiAgfQogIF9fbmFtZShwYXRoQXRQdW5jdHVhdGlvbiwgInBhdGhBdFB1bmN0dWF0aW9uIik7Cn0KX19uYW1lKHRva2VuaXplUGF0aCwgInRva2VuaXplUGF0aCIpOwpmdW5jdGlvbiB0b2tlbml6ZVRyYWlsKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgcmV0dXJuIHRyYWlsMjsKICBmdW5jdGlvbiB0cmFpbDIoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gMzMgfHwgY29kZTQgPT09IDM0IHx8IGNvZGU0ID09PSAzOSB8fCBjb2RlNCA9PT0gNDEgfHwgY29kZTQgPT09IDQyIHx8IGNvZGU0ID09PSA0NCB8fCBjb2RlNCA9PT0gNDYgfHwgY29kZTQgPT09IDU4IHx8IGNvZGU0ID09PSA1OSB8fCBjb2RlNCA9PT0gNjMgfHwgY29kZTQgPT09IDk1IHx8IGNvZGU0ID09PSAxMjYpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHRyYWlsMjsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gMzgpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHRyYWlsQ2hhcmFjdGVyUmVmZXJlbmNlU3RhcnQ7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDkzKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiB0cmFpbEJyYWNrZXRBZnRlcjsKICAgIH0KICAgIGlmICgKICAgICAgLy8gYDxgIGlzIGFuIGVuZC4KICAgICAgY29kZTQgPT09IDYwIHx8IC8vIFNvIGlzIHdoaXRlc3BhY2UuCiAgICAgIGNvZGU0ID09PSBudWxsIHx8IG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpIHx8IHVuaWNvZGVXaGl0ZXNwYWNlKGNvZGU0KQogICAgKSB7CiAgICAgIHJldHVybiBvazMoY29kZTQpOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZSh0cmFpbDIsICJ0cmFpbCIpOwogIGZ1bmN0aW9uIHRyYWlsQnJhY2tldEFmdGVyKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgY29kZTQgPT09IDQwIHx8IGNvZGU0ID09PSA5MSB8fCBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlKGNvZGU0KSB8fCB1bmljb2RlV2hpdGVzcGFjZShjb2RlNCkpIHsKICAgICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gdHJhaWwyKGNvZGU0KTsKICB9CiAgX19uYW1lKHRyYWlsQnJhY2tldEFmdGVyLCAidHJhaWxCcmFja2V0QWZ0ZXIiKTsKICBmdW5jdGlvbiB0cmFpbENoYXJhY3RlclJlZmVyZW5jZVN0YXJ0KGNvZGU0KSB7CiAgICByZXR1cm4gYXNjaWlBbHBoYShjb2RlNCkgPyB0cmFpbENoYXJhY3RlclJlZmVyZW5jZUluc2lkZShjb2RlNCkgOiBub2soY29kZTQpOwogIH0KICBfX25hbWUodHJhaWxDaGFyYWN0ZXJSZWZlcmVuY2VTdGFydCwgInRyYWlsQ2hhcmFjdGVyUmVmZXJlbmNlU3RhcnQiKTsKICBmdW5jdGlvbiB0cmFpbENoYXJhY3RlclJlZmVyZW5jZUluc2lkZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA1OSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gdHJhaWwyOwogICAgfQogICAgaWYgKGFzY2lpQWxwaGEoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiB0cmFpbENoYXJhY3RlclJlZmVyZW5jZUluc2lkZTsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBfX25hbWUodHJhaWxDaGFyYWN0ZXJSZWZlcmVuY2VJbnNpZGUsICJ0cmFpbENoYXJhY3RlclJlZmVyZW5jZUluc2lkZSIpOwp9Cl9fbmFtZSh0b2tlbml6ZVRyYWlsLCAidG9rZW5pemVUcmFpbCIpOwpmdW5jdGlvbiB0b2tlbml6ZUVtYWlsRG9tYWluRG90VHJhaWwoZWZmZWN0cywgb2szLCBub2spIHsKICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gYWZ0ZXI7CiAgfQogIF9fbmFtZShzdGFydCwgInN0YXJ0Iik7CiAgZnVuY3Rpb24gYWZ0ZXIoY29kZTQpIHsKICAgIHJldHVybiBhc2NpaUFscGhhbnVtZXJpYyhjb2RlNCkgPyBub2soY29kZTQpIDogb2szKGNvZGU0KTsKICB9CiAgX19uYW1lKGFmdGVyLCAiYWZ0ZXIiKTsKfQpfX25hbWUodG9rZW5pemVFbWFpbERvbWFpbkRvdFRyYWlsLCAidG9rZW5pemVFbWFpbERvbWFpbkRvdFRyYWlsIik7CmZ1bmN0aW9uIHByZXZpb3VzV3d3KGNvZGU0KSB7CiAgcmV0dXJuIGNvZGU0ID09PSBudWxsIHx8IGNvZGU0ID09PSA0MCB8fCBjb2RlNCA9PT0gNDIgfHwgY29kZTQgPT09IDk1IHx8IGNvZGU0ID09PSA5MSB8fCBjb2RlNCA9PT0gOTMgfHwgY29kZTQgPT09IDEyNiB8fCBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlKGNvZGU0KTsKfQpfX25hbWUocHJldmlvdXNXd3csICJwcmV2aW91c1d3dyIpOwpmdW5jdGlvbiBwcmV2aW91c1Byb3RvY29sKGNvZGU0KSB7CiAgcmV0dXJuICFhc2NpaUFscGhhKGNvZGU0KTsKfQpfX25hbWUocHJldmlvdXNQcm90b2NvbCwgInByZXZpb3VzUHJvdG9jb2wiKTsKZnVuY3Rpb24gcHJldmlvdXNFbWFpbChjb2RlNCkgewogIHJldHVybiAhKGNvZGU0ID09PSA0NyB8fCBnZm1BdGV4dChjb2RlNCkpOwp9Cl9fbmFtZShwcmV2aW91c0VtYWlsLCAicHJldmlvdXNFbWFpbCIpOwpmdW5jdGlvbiBnZm1BdGV4dChjb2RlNCkgewogIHJldHVybiBjb2RlNCA9PT0gNDMgfHwgY29kZTQgPT09IDQ1IHx8IGNvZGU0ID09PSA0NiB8fCBjb2RlNCA9PT0gOTUgfHwgYXNjaWlBbHBoYW51bWVyaWMoY29kZTQpOwp9Cl9fbmFtZShnZm1BdGV4dCwgImdmbUF0ZXh0Iik7CmZ1bmN0aW9uIHByZXZpb3VzVW5iYWxhbmNlZChldmVudHMpIHsKICBsZXQgaW5kZXgyID0gZXZlbnRzLmxlbmd0aDsKICBsZXQgcmVzdWx0ID0gZmFsc2U7CiAgd2hpbGUgKGluZGV4Mi0tKSB7CiAgICBjb25zdCB0b2tlbiA9IGV2ZW50c1tpbmRleDJdWzFdOwogICAgaWYgKCh0b2tlbi50eXBlID09PSAibGFiZWxMaW5rIiB8fCB0b2tlbi50eXBlID09PSAibGFiZWxJbWFnZSIpICYmICF0b2tlbi5fYmFsYW5jZWQpIHsKICAgICAgcmVzdWx0ID0gdHJ1ZTsKICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAodG9rZW4uX2dmbUF1dG9saW5rTGl0ZXJhbFdhbGtlZEludG8pIHsKICAgICAgcmVzdWx0ID0gZmFsc2U7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICBpZiAoZXZlbnRzLmxlbmd0aCA+IDAgJiYgIXJlc3VsdCkgewogICAgZXZlbnRzW2V2ZW50cy5sZW5ndGggLSAxXVsxXS5fZ2ZtQXV0b2xpbmtMaXRlcmFsV2Fsa2VkSW50byA9IHRydWU7CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KX19uYW1lKHByZXZpb3VzVW5iYWxhbmNlZCwgInByZXZpb3VzVW5iYWxhbmNlZCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay11dGlsLWVuY29kZUAyLjAuMS9ub2RlX21vZHVsZXMvbWljcm9tYXJrLXV0aWwtZW5jb2RlL2luZGV4LmpzCnZhciBjaGFyYWN0ZXJSZWZlcmVuY2VzID0geyAnIic6ICJxdW90IiwgIiYiOiAiYW1wIiwgIjwiOiAibHQiLCAiPiI6ICJndCIgfTsKZnVuY3Rpb24gZW5jb2RlKHZhbHVlMikgewogIHJldHVybiB2YWx1ZTIucmVwbGFjZSgvWyImPD5dL2csIHJlcGxhY2UzKTsKICBmdW5jdGlvbiByZXBsYWNlMyh2YWx1ZTMpIHsKICAgIHJldHVybiAiJiIgKyBjaGFyYWN0ZXJSZWZlcmVuY2VzWwogICAgICAvKiogQHR5cGUge2tleW9mIHR5cGVvZiBjaGFyYWN0ZXJSZWZlcmVuY2VzfSAqLwogICAgICB2YWx1ZTMKICAgIF0gKyAiOyI7CiAgfQogIF9fbmFtZShyZXBsYWNlMywgInJlcGxhY2UiKTsKfQpfX25hbWUoZW5jb2RlLCAiZW5jb2RlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLXV0aWwtc2FuaXRpemUtdXJpQDIuMC4xL25vZGVfbW9kdWxlcy9taWNyb21hcmstdXRpbC1zYW5pdGl6ZS11cmkvaW5kZXguanMKZnVuY3Rpb24gc2FuaXRpemVVcmkodXJsLCBwcm90b2NvbCkgewogIGNvbnN0IHZhbHVlMiA9IGVuY29kZShub3JtYWxpemVVcmkodXJsIHx8ICIiKSk7CiAgaWYgKCFwcm90b2NvbCkgewogICAgcmV0dXJuIHZhbHVlMjsKICB9CiAgY29uc3QgY29sb24gPSB2YWx1ZTIuaW5kZXhPZigiOiIpOwogIGNvbnN0IHF1ZXN0aW9uTWFyayA9IHZhbHVlMi5pbmRleE9mKCI/Iik7CiAgY29uc3QgbnVtYmVyU2lnbiA9IHZhbHVlMi5pbmRleE9mKCIjIik7CiAgY29uc3Qgc2xhc2ggPSB2YWx1ZTIuaW5kZXhPZigiLyIpOwogIGlmICgKICAgIC8vIElmIHRoZXJlIGlzIG5vIHByb3RvY29sLCBpdOKAmXMgcmVsYXRpdmUuCiAgICBjb2xvbiA8IDAgfHwgLy8gSWYgdGhlIGZpcnN0IGNvbG9uIGlzIGFmdGVyIGEgYD9gLCBgI2AsIG9yIGAvYCwgaXTigJlzIG5vdCBhIHByb3RvY29sLgogICAgc2xhc2ggPiAtMSAmJiBjb2xvbiA+IHNsYXNoIHx8IHF1ZXN0aW9uTWFyayA+IC0xICYmIGNvbG9uID4gcXVlc3Rpb25NYXJrIHx8IG51bWJlclNpZ24gPiAtMSAmJiBjb2xvbiA+IG51bWJlclNpZ24gfHwgLy8gSXQgaXMgYSBwcm90b2NvbCwgaXQgc2hvdWxkIGJlIGFsbG93ZWQuCiAgICBwcm90b2NvbC50ZXN0KHZhbHVlMi5zbGljZSgwLCBjb2xvbikpCiAgKSB7CiAgICByZXR1cm4gdmFsdWUyOwogIH0KICByZXR1cm4gIiI7Cn0KX19uYW1lKHNhbml0aXplVXJpLCAic2FuaXRpemVVcmkiKTsKZnVuY3Rpb24gbm9ybWFsaXplVXJpKHZhbHVlMikgewogIGNvbnN0IHJlc3VsdCA9IFtdOwogIGxldCBpbmRleDIgPSAtMTsKICBsZXQgc3RhcnQgPSAwOwogIGxldCBza2lwMiA9IDA7CiAgd2hpbGUgKCsraW5kZXgyIDwgdmFsdWUyLmxlbmd0aCkgewogICAgY29uc3QgY29kZTQgPSB2YWx1ZTIuY2hhckNvZGVBdChpbmRleDIpOwogICAgbGV0IHJlcGxhY2UzID0gIiI7CiAgICBpZiAoY29kZTQgPT09IDM3ICYmIGFzY2lpQWxwaGFudW1lcmljKHZhbHVlMi5jaGFyQ29kZUF0KGluZGV4MiArIDEpKSAmJiBhc2NpaUFscGhhbnVtZXJpYyh2YWx1ZTIuY2hhckNvZGVBdChpbmRleDIgKyAyKSkpIHsKICAgICAgc2tpcDIgPSAyOwogICAgfSBlbHNlIGlmIChjb2RlNCA8IDEyOCkgewogICAgICBpZiAoIS9bISMkJi07PT8tWl9hLXp+XS8udGVzdChTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGU0KSkpIHsKICAgICAgICByZXBsYWNlMyA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZTQpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGNvZGU0ID4gNTUyOTUgJiYgY29kZTQgPCA1NzM0NCkgewogICAgICBjb25zdCBuZXh0MiA9IHZhbHVlMi5jaGFyQ29kZUF0KGluZGV4MiArIDEpOwogICAgICBpZiAoY29kZTQgPCA1NjMyMCAmJiBuZXh0MiA+IDU2MzE5ICYmIG5leHQyIDwgNTczNDQpIHsKICAgICAgICByZXBsYWNlMyA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZTQsIG5leHQyKTsKICAgICAgICBza2lwMiA9IDE7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVwbGFjZTMgPSAiXHVGRkZEIjsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmVwbGFjZTMgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGU0KTsKICAgIH0KICAgIGlmIChyZXBsYWNlMykgewogICAgICByZXN1bHQucHVzaCh2YWx1ZTIuc2xpY2Uoc3RhcnQsIGluZGV4MiksIGVuY29kZVVSSUNvbXBvbmVudChyZXBsYWNlMykpOwogICAgICBzdGFydCA9IGluZGV4MiArIHNraXAyICsgMTsKICAgICAgcmVwbGFjZTMgPSAiIjsKICAgIH0KICAgIGlmIChza2lwMikgewogICAgICBpbmRleDIgKz0gc2tpcDI7CiAgICAgIHNraXAyID0gMDsKICAgIH0KICB9CiAgcmV0dXJuIHJlc3VsdC5qb2luKCIiKSArIHZhbHVlMi5zbGljZShzdGFydCk7Cn0KX19uYW1lKG5vcm1hbGl6ZVVyaSwgIm5vcm1hbGl6ZVVyaSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLWF1dG9saW5rLWxpdGVyYWxAMi4xLjAvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLWF1dG9saW5rLWxpdGVyYWwvbGliL2h0bWwuanMKZnVuY3Rpb24gZ2ZtQXV0b2xpbmtMaXRlcmFsSHRtbCgpIHsKICByZXR1cm4gewogICAgZXhpdDogewogICAgICBsaXRlcmFsQXV0b2xpbmtFbWFpbCwKICAgICAgbGl0ZXJhbEF1dG9saW5rSHR0cCwKICAgICAgbGl0ZXJhbEF1dG9saW5rV3d3CiAgICB9CiAgfTsKfQpfX25hbWUoZ2ZtQXV0b2xpbmtMaXRlcmFsSHRtbCwgImdmbUF1dG9saW5rTGl0ZXJhbEh0bWwiKTsKZnVuY3Rpb24gbGl0ZXJhbEF1dG9saW5rV3d3KHRva2VuKSB7CiAgYW5jaG9yRnJvbVRva2VuLmNhbGwodGhpcywgdG9rZW4sICJodHRwOi8vIik7Cn0KX19uYW1lKGxpdGVyYWxBdXRvbGlua1d3dywgImxpdGVyYWxBdXRvbGlua1d3dyIpOwpmdW5jdGlvbiBsaXRlcmFsQXV0b2xpbmtFbWFpbCh0b2tlbikgewogIGFuY2hvckZyb21Ub2tlbi5jYWxsKHRoaXMsIHRva2VuLCAibWFpbHRvOiIpOwp9Cl9fbmFtZShsaXRlcmFsQXV0b2xpbmtFbWFpbCwgImxpdGVyYWxBdXRvbGlua0VtYWlsIik7CmZ1bmN0aW9uIGxpdGVyYWxBdXRvbGlua0h0dHAodG9rZW4pIHsKICBhbmNob3JGcm9tVG9rZW4uY2FsbCh0aGlzLCB0b2tlbik7Cn0KX19uYW1lKGxpdGVyYWxBdXRvbGlua0h0dHAsICJsaXRlcmFsQXV0b2xpbmtIdHRwIik7CmZ1bmN0aW9uIGFuY2hvckZyb21Ub2tlbih0b2tlbiwgcHJvdG9jb2wpIHsKICBjb25zdCB1cmwgPSB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKTsKICB0aGlzLnRhZygnPGEgaHJlZj0iJyArIHNhbml0aXplVXJpKChwcm90b2NvbCB8fCAiIikgKyB1cmwpICsgJyI+Jyk7CiAgdGhpcy5yYXcodGhpcy5lbmNvZGUodXJsKSk7CiAgdGhpcy50YWcoIjwvYT4iKTsKfQpfX25hbWUoYW5jaG9yRnJvbVRva2VuLCAiYW5jaG9yRnJvbVRva2VuIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLXV0aWwtcmVzb2x2ZS1hbGxAMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay11dGlsLXJlc29sdmUtYWxsL2luZGV4LmpzCmZ1bmN0aW9uIHJlc29sdmVBbGwoY29uc3RydWN0czIsIGV2ZW50cywgY29udGV4dDIpIHsKICBjb25zdCBjYWxsZWQgPSBbXTsKICBsZXQgaW5kZXgyID0gLTE7CiAgd2hpbGUgKCsraW5kZXgyIDwgY29uc3RydWN0czIubGVuZ3RoKSB7CiAgICBjb25zdCByZXNvbHZlMiA9IGNvbnN0cnVjdHMyW2luZGV4Ml0ucmVzb2x2ZUFsbDsKICAgIGlmIChyZXNvbHZlMiAmJiAhY2FsbGVkLmluY2x1ZGVzKHJlc29sdmUyKSkgewogICAgICBldmVudHMgPSByZXNvbHZlMihldmVudHMsIGNvbnRleHQyKTsKICAgICAgY2FsbGVkLnB1c2gocmVzb2x2ZTIpOwogICAgfQogIH0KICByZXR1cm4gZXZlbnRzOwp9Cl9fbmFtZShyZXNvbHZlQWxsLCAicmVzb2x2ZUFsbCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2F0dGVudGlvbi5qcwp2YXIgYXR0ZW50aW9uID0gewogIG5hbWU6ICJhdHRlbnRpb24iLAogIHJlc29sdmVBbGw6IHJlc29sdmVBbGxBdHRlbnRpb24sCiAgdG9rZW5pemU6IHRva2VuaXplQXR0ZW50aW9uCn07CmZ1bmN0aW9uIHJlc29sdmVBbGxBdHRlbnRpb24oZXZlbnRzLCBjb250ZXh0MikgewogIGxldCBpbmRleDIgPSAtMTsKICBsZXQgb3BlbjsKICBsZXQgZ3JvdXA7CiAgbGV0IHRleHQ4OwogIGxldCBvcGVuaW5nU2VxdWVuY2U7CiAgbGV0IGNsb3NpbmdTZXF1ZW5jZTsKICBsZXQgdXNlOwogIGxldCBuZXh0RXZlbnRzOwogIGxldCBvZmZzZXQ7CiAgd2hpbGUgKCsraW5kZXgyIDwgZXZlbnRzLmxlbmd0aCkgewogICAgaWYgKGV2ZW50c1tpbmRleDJdWzBdID09PSAiZW50ZXIiICYmIGV2ZW50c1tpbmRleDJdWzFdLnR5cGUgPT09ICJhdHRlbnRpb25TZXF1ZW5jZSIgJiYgZXZlbnRzW2luZGV4Ml1bMV0uX2Nsb3NlKSB7CiAgICAgIG9wZW4gPSBpbmRleDI7CiAgICAgIHdoaWxlIChvcGVuLS0pIHsKICAgICAgICBpZiAoZXZlbnRzW29wZW5dWzBdID09PSAiZXhpdCIgJiYgZXZlbnRzW29wZW5dWzFdLnR5cGUgPT09ICJhdHRlbnRpb25TZXF1ZW5jZSIgJiYgZXZlbnRzW29wZW5dWzFdLl9vcGVuICYmIC8vIElmIHRoZSBtYXJrZXJzIGFyZSB0aGUgc2FtZToKICAgICAgICBjb250ZXh0Mi5zbGljZVNlcmlhbGl6ZShldmVudHNbb3Blbl1bMV0pLmNoYXJDb2RlQXQoMCkgPT09IGNvbnRleHQyLnNsaWNlU2VyaWFsaXplKGV2ZW50c1tpbmRleDJdWzFdKS5jaGFyQ29kZUF0KDApKSB7CiAgICAgICAgICBpZiAoKGV2ZW50c1tvcGVuXVsxXS5fY2xvc2UgfHwgZXZlbnRzW2luZGV4Ml1bMV0uX29wZW4pICYmIChldmVudHNbaW5kZXgyXVsxXS5lbmQub2Zmc2V0IC0gZXZlbnRzW2luZGV4Ml1bMV0uc3RhcnQub2Zmc2V0KSAlIDMgJiYgISgoZXZlbnRzW29wZW5dWzFdLmVuZC5vZmZzZXQgLSBldmVudHNbb3Blbl1bMV0uc3RhcnQub2Zmc2V0ICsgZXZlbnRzW2luZGV4Ml1bMV0uZW5kLm9mZnNldCAtIGV2ZW50c1tpbmRleDJdWzFdLnN0YXJ0Lm9mZnNldCkgJSAzKSkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIHVzZSA9IGV2ZW50c1tvcGVuXVsxXS5lbmQub2Zmc2V0IC0gZXZlbnRzW29wZW5dWzFdLnN0YXJ0Lm9mZnNldCA+IDEgJiYgZXZlbnRzW2luZGV4Ml1bMV0uZW5kLm9mZnNldCAtIGV2ZW50c1tpbmRleDJdWzFdLnN0YXJ0Lm9mZnNldCA+IDEgPyAyIDogMTsKICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gewogICAgICAgICAgICAuLi5ldmVudHNbb3Blbl1bMV0uZW5kCiAgICAgICAgICB9OwogICAgICAgICAgY29uc3QgZW5kID0gewogICAgICAgICAgICAuLi5ldmVudHNbaW5kZXgyXVsxXS5zdGFydAogICAgICAgICAgfTsKICAgICAgICAgIG1vdmVQb2ludChzdGFydCwgLXVzZSk7CiAgICAgICAgICBtb3ZlUG9pbnQoZW5kLCB1c2UpOwogICAgICAgICAgb3BlbmluZ1NlcXVlbmNlID0gewogICAgICAgICAgICB0eXBlOiB1c2UgPiAxID8gInN0cm9uZ1NlcXVlbmNlIiA6ICJlbXBoYXNpc1NlcXVlbmNlIiwKICAgICAgICAgICAgc3RhcnQsCiAgICAgICAgICAgIGVuZDogewogICAgICAgICAgICAgIC4uLmV2ZW50c1tvcGVuXVsxXS5lbmQKICAgICAgICAgICAgfQogICAgICAgICAgfTsKICAgICAgICAgIGNsb3NpbmdTZXF1ZW5jZSA9IHsKICAgICAgICAgICAgdHlwZTogdXNlID4gMSA/ICJzdHJvbmdTZXF1ZW5jZSIgOiAiZW1waGFzaXNTZXF1ZW5jZSIsCiAgICAgICAgICAgIHN0YXJ0OiB7CiAgICAgICAgICAgICAgLi4uZXZlbnRzW2luZGV4Ml1bMV0uc3RhcnQKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZW5kCiAgICAgICAgICB9OwogICAgICAgICAgdGV4dDggPSB7CiAgICAgICAgICAgIHR5cGU6IHVzZSA+IDEgPyAic3Ryb25nVGV4dCIgOiAiZW1waGFzaXNUZXh0IiwKICAgICAgICAgICAgc3RhcnQ6IHsKICAgICAgICAgICAgICAuLi5ldmVudHNbb3Blbl1bMV0uZW5kCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGVuZDogewogICAgICAgICAgICAgIC4uLmV2ZW50c1tpbmRleDJdWzFdLnN0YXJ0CiAgICAgICAgICAgIH0KICAgICAgICAgIH07CiAgICAgICAgICBncm91cCA9IHsKICAgICAgICAgICAgdHlwZTogdXNlID4gMSA/ICJzdHJvbmciIDogImVtcGhhc2lzIiwKICAgICAgICAgICAgc3RhcnQ6IHsKICAgICAgICAgICAgICAuLi5vcGVuaW5nU2VxdWVuY2Uuc3RhcnQKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZW5kOiB7CiAgICAgICAgICAgICAgLi4uY2xvc2luZ1NlcXVlbmNlLmVuZAogICAgICAgICAgICB9CiAgICAgICAgICB9OwogICAgICAgICAgZXZlbnRzW29wZW5dWzFdLmVuZCA9IHsKICAgICAgICAgICAgLi4ub3BlbmluZ1NlcXVlbmNlLnN0YXJ0CiAgICAgICAgICB9OwogICAgICAgICAgZXZlbnRzW2luZGV4Ml1bMV0uc3RhcnQgPSB7CiAgICAgICAgICAgIC4uLmNsb3NpbmdTZXF1ZW5jZS5lbmQKICAgICAgICAgIH07CiAgICAgICAgICBuZXh0RXZlbnRzID0gW107CiAgICAgICAgICBpZiAoZXZlbnRzW29wZW5dWzFdLmVuZC5vZmZzZXQgLSBldmVudHNbb3Blbl1bMV0uc3RhcnQub2Zmc2V0KSB7CiAgICAgICAgICAgIG5leHRFdmVudHMgPSBwdXNoKG5leHRFdmVudHMsIFtbImVudGVyIiwgZXZlbnRzW29wZW5dWzFdLCBjb250ZXh0Ml0sIFsiZXhpdCIsIGV2ZW50c1tvcGVuXVsxXSwgY29udGV4dDJdXSk7CiAgICAgICAgICB9CiAgICAgICAgICBuZXh0RXZlbnRzID0gcHVzaChuZXh0RXZlbnRzLCBbWyJlbnRlciIsIGdyb3VwLCBjb250ZXh0Ml0sIFsiZW50ZXIiLCBvcGVuaW5nU2VxdWVuY2UsIGNvbnRleHQyXSwgWyJleGl0Iiwgb3BlbmluZ1NlcXVlbmNlLCBjb250ZXh0Ml0sIFsiZW50ZXIiLCB0ZXh0OCwgY29udGV4dDJdXSk7CiAgICAgICAgICBuZXh0RXZlbnRzID0gcHVzaChuZXh0RXZlbnRzLCByZXNvbHZlQWxsKGNvbnRleHQyLnBhcnNlci5jb25zdHJ1Y3RzLmluc2lkZVNwYW4ubnVsbCwgZXZlbnRzLnNsaWNlKG9wZW4gKyAxLCBpbmRleDIpLCBjb250ZXh0MikpOwogICAgICAgICAgbmV4dEV2ZW50cyA9IHB1c2gobmV4dEV2ZW50cywgW1siZXhpdCIsIHRleHQ4LCBjb250ZXh0Ml0sIFsiZW50ZXIiLCBjbG9zaW5nU2VxdWVuY2UsIGNvbnRleHQyXSwgWyJleGl0IiwgY2xvc2luZ1NlcXVlbmNlLCBjb250ZXh0Ml0sIFsiZXhpdCIsIGdyb3VwLCBjb250ZXh0Ml1dKTsKICAgICAgICAgIGlmIChldmVudHNbaW5kZXgyXVsxXS5lbmQub2Zmc2V0IC0gZXZlbnRzW2luZGV4Ml1bMV0uc3RhcnQub2Zmc2V0KSB7CiAgICAgICAgICAgIG9mZnNldCA9IDI7CiAgICAgICAgICAgIG5leHRFdmVudHMgPSBwdXNoKG5leHRFdmVudHMsIFtbImVudGVyIiwgZXZlbnRzW2luZGV4Ml1bMV0sIGNvbnRleHQyXSwgWyJleGl0IiwgZXZlbnRzW2luZGV4Ml1bMV0sIGNvbnRleHQyXV0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgb2Zmc2V0ID0gMDsKICAgICAgICAgIH0KICAgICAgICAgIHNwbGljZShldmVudHMsIG9wZW4gLSAxLCBpbmRleDIgLSBvcGVuICsgMywgbmV4dEV2ZW50cyk7CiAgICAgICAgICBpbmRleDIgPSBvcGVuICsgbmV4dEV2ZW50cy5sZW5ndGggLSBvZmZzZXQgLSAyOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIGluZGV4MiA9IC0xOwogIHdoaWxlICgrK2luZGV4MiA8IGV2ZW50cy5sZW5ndGgpIHsKICAgIGlmIChldmVudHNbaW5kZXgyXVsxXS50eXBlID09PSAiYXR0ZW50aW9uU2VxdWVuY2UiKSB7CiAgICAgIGV2ZW50c1tpbmRleDJdWzFdLnR5cGUgPSAiZGF0YSI7CiAgICB9CiAgfQogIHJldHVybiBldmVudHM7Cn0KX19uYW1lKHJlc29sdmVBbGxBdHRlbnRpb24sICJyZXNvbHZlQWxsQXR0ZW50aW9uIik7CmZ1bmN0aW9uIHRva2VuaXplQXR0ZW50aW9uKGVmZmVjdHMsIG9rMykgewogIGNvbnN0IGF0dGVudGlvbk1hcmtlcnMyID0gdGhpcy5wYXJzZXIuY29uc3RydWN0cy5hdHRlbnRpb25NYXJrZXJzLm51bGw7CiAgY29uc3QgcHJldmlvdXMzID0gdGhpcy5wcmV2aW91czsKICBjb25zdCBiZWZvcmUgPSBjbGFzc2lmeUNoYXJhY3RlcihwcmV2aW91czMpOwogIGxldCBtYXJrZXI7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBtYXJrZXIgPSBjb2RlNDsKICAgIGVmZmVjdHMuZW50ZXIoImF0dGVudGlvblNlcXVlbmNlIik7CiAgICByZXR1cm4gaW5zaWRlKGNvZGU0KTsKICB9CiAgX19uYW1lKHN0YXJ0LCAic3RhcnQiKTsKICBmdW5jdGlvbiBpbnNpZGUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbWFya2VyKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBpbnNpZGU7CiAgICB9CiAgICBjb25zdCB0b2tlbiA9IGVmZmVjdHMuZXhpdCgiYXR0ZW50aW9uU2VxdWVuY2UiKTsKICAgIGNvbnN0IGFmdGVyID0gY2xhc3NpZnlDaGFyYWN0ZXIoY29kZTQpOwogICAgY29uc3Qgb3BlbiA9ICFhZnRlciB8fCBhZnRlciA9PT0gMiAmJiBiZWZvcmUgfHwgYXR0ZW50aW9uTWFya2VyczIuaW5jbHVkZXMoY29kZTQpOwogICAgY29uc3QgY2xvc2U3ID0gIWJlZm9yZSB8fCBiZWZvcmUgPT09IDIgJiYgYWZ0ZXIgfHwgYXR0ZW50aW9uTWFya2VyczIuaW5jbHVkZXMocHJldmlvdXMzKTsKICAgIHRva2VuLl9vcGVuID0gQm9vbGVhbihtYXJrZXIgPT09IDQyID8gb3BlbiA6IG9wZW4gJiYgKGJlZm9yZSB8fCAhY2xvc2U3KSk7CiAgICB0b2tlbi5fY2xvc2UgPSBCb29sZWFuKG1hcmtlciA9PT0gNDIgPyBjbG9zZTcgOiBjbG9zZTcgJiYgKGFmdGVyIHx8ICFvcGVuKSk7CiAgICByZXR1cm4gb2szKGNvZGU0KTsKICB9CiAgX19uYW1lKGluc2lkZSwgImluc2lkZSIpOwp9Cl9fbmFtZSh0b2tlbml6ZUF0dGVudGlvbiwgInRva2VuaXplQXR0ZW50aW9uIik7CmZ1bmN0aW9uIG1vdmVQb2ludChwb2ludDQsIG9mZnNldCkgewogIHBvaW50NC5jb2x1bW4gKz0gb2Zmc2V0OwogIHBvaW50NC5vZmZzZXQgKz0gb2Zmc2V0OwogIHBvaW50NC5fYnVmZmVySW5kZXggKz0gb2Zmc2V0Owp9Cl9fbmFtZShtb3ZlUG9pbnQsICJtb3ZlUG9pbnQiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstY29yZS1jb21tb25tYXJrQDIuMC4zL25vZGVfbW9kdWxlcy9taWNyb21hcmstY29yZS1jb21tb25tYXJrL2xpYi9hdXRvbGluay5qcwp2YXIgYXV0b2xpbmsgPSB7CiAgbmFtZTogImF1dG9saW5rIiwKICB0b2tlbml6ZTogdG9rZW5pemVBdXRvbGluawp9OwpmdW5jdGlvbiB0b2tlbml6ZUF1dG9saW5rKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgbGV0IHNpemUgPSAwOwogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigiYXV0b2xpbmsiKTsKICAgIGVmZmVjdHMuZW50ZXIoImF1dG9saW5rTWFya2VyIik7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgZWZmZWN0cy5leGl0KCJhdXRvbGlua01hcmtlciIpOwogICAgZWZmZWN0cy5lbnRlcigiYXV0b2xpbmtQcm90b2NvbCIpOwogICAgcmV0dXJuIG9wZW47CiAgfQogIF9fbmFtZShzdGFydCwgInN0YXJ0Iik7CiAgZnVuY3Rpb24gb3Blbihjb2RlNCkgewogICAgaWYgKGFzY2lpQWxwaGEoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBzY2hlbWVPckVtYWlsQXRleHQ7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDY0KSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgcmV0dXJuIGVtYWlsQXRleHQoY29kZTQpOwogIH0KICBfX25hbWUob3BlbiwgIm9wZW4iKTsKICBmdW5jdGlvbiBzY2hlbWVPckVtYWlsQXRleHQoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDMgfHwgY29kZTQgPT09IDQ1IHx8IGNvZGU0ID09PSA0NiB8fCBhc2NpaUFscGhhbnVtZXJpYyhjb2RlNCkpIHsKICAgICAgc2l6ZSA9IDE7CiAgICAgIHJldHVybiBzY2hlbWVJbnNpZGVPckVtYWlsQXRleHQoY29kZTQpOwogICAgfQogICAgcmV0dXJuIGVtYWlsQXRleHQoY29kZTQpOwogIH0KICBfX25hbWUoc2NoZW1lT3JFbWFpbEF0ZXh0LCAic2NoZW1lT3JFbWFpbEF0ZXh0Iik7CiAgZnVuY3Rpb24gc2NoZW1lSW5zaWRlT3JFbWFpbEF0ZXh0KGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDU4KSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHNpemUgPSAwOwogICAgICByZXR1cm4gdXJsSW5zaWRlOwogICAgfQogICAgaWYgKChjb2RlNCA9PT0gNDMgfHwgY29kZTQgPT09IDQ1IHx8IGNvZGU0ID09PSA0NiB8fCBhc2NpaUFscGhhbnVtZXJpYyhjb2RlNCkpICYmIHNpemUrKyA8IDMyKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBzY2hlbWVJbnNpZGVPckVtYWlsQXRleHQ7CiAgICB9CiAgICBzaXplID0gMDsKICAgIHJldHVybiBlbWFpbEF0ZXh0KGNvZGU0KTsKICB9CiAgX19uYW1lKHNjaGVtZUluc2lkZU9yRW1haWxBdGV4dCwgInNjaGVtZUluc2lkZU9yRW1haWxBdGV4dCIpOwogIGZ1bmN0aW9uIHVybEluc2lkZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA2MikgewogICAgICBlZmZlY3RzLmV4aXQoImF1dG9saW5rUHJvdG9jb2wiKTsKICAgICAgZWZmZWN0cy5lbnRlcigiYXV0b2xpbmtNYXJrZXIiKTsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgZWZmZWN0cy5leGl0KCJhdXRvbGlua01hcmtlciIpOwogICAgICBlZmZlY3RzLmV4aXQoImF1dG9saW5rIik7CiAgICAgIHJldHVybiBvazM7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgY29kZTQgPT09IDMyIHx8IGNvZGU0ID09PSA2MCB8fCBhc2NpaUNvbnRyb2woY29kZTQpKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiB1cmxJbnNpZGU7CiAgfQogIF9fbmFtZSh1cmxJbnNpZGUsICJ1cmxJbnNpZGUiKTsKICBmdW5jdGlvbiBlbWFpbEF0ZXh0KGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDY0KSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBlbWFpbEF0U2lnbk9yRG90OwogICAgfQogICAgaWYgKGFzY2lpQXRleHQoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBlbWFpbEF0ZXh0OwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZShlbWFpbEF0ZXh0LCAiZW1haWxBdGV4dCIpOwogIGZ1bmN0aW9uIGVtYWlsQXRTaWduT3JEb3QoY29kZTQpIHsKICAgIHJldHVybiBhc2NpaUFscGhhbnVtZXJpYyhjb2RlNCkgPyBlbWFpbExhYmVsKGNvZGU0KSA6IG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZShlbWFpbEF0U2lnbk9yRG90LCAiZW1haWxBdFNpZ25PckRvdCIpOwogIGZ1bmN0aW9uIGVtYWlsTGFiZWwoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDYpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgc2l6ZSA9IDA7CiAgICAgIHJldHVybiBlbWFpbEF0U2lnbk9yRG90OwogICAgfQogICAgaWYgKGNvZGU0ID09PSA2MikgewogICAgICBlZmZlY3RzLmV4aXQoImF1dG9saW5rUHJvdG9jb2wiKS50eXBlID0gImF1dG9saW5rRW1haWwiOwogICAgICBlZmZlY3RzLmVudGVyKCJhdXRvbGlua01hcmtlciIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoImF1dG9saW5rTWFya2VyIik7CiAgICAgIGVmZmVjdHMuZXhpdCgiYXV0b2xpbmsiKTsKICAgICAgcmV0dXJuIG9rMzsKICAgIH0KICAgIHJldHVybiBlbWFpbFZhbHVlKGNvZGU0KTsKICB9CiAgX19uYW1lKGVtYWlsTGFiZWwsICJlbWFpbExhYmVsIik7CiAgZnVuY3Rpb24gZW1haWxWYWx1ZShjb2RlNCkgewogICAgaWYgKChjb2RlNCA9PT0gNDUgfHwgYXNjaWlBbHBoYW51bWVyaWMoY29kZTQpKSAmJiBzaXplKysgPCA2MykgewogICAgICBjb25zdCBuZXh0MiA9IGNvZGU0ID09PSA0NSA/IGVtYWlsVmFsdWUgOiBlbWFpbExhYmVsOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gbmV4dDI7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKGVtYWlsVmFsdWUsICJlbWFpbFZhbHVlIik7Cn0KX19uYW1lKHRva2VuaXplQXV0b2xpbmssICJ0b2tlbml6ZUF1dG9saW5rIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWZhY3Rvcnktc3BhY2VAMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1mYWN0b3J5LXNwYWNlL2luZGV4LmpzCmZ1bmN0aW9uIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBvazMsIHR5cGU1LCBtYXgzKSB7CiAgY29uc3QgbGltaXQgPSBtYXgzID8gbWF4MyAtIDEgOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7CiAgbGV0IHNpemUgPSAwOwogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuZW50ZXIodHlwZTUpOwogICAgICByZXR1cm4gcHJlZml4KGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBvazMoY29kZTQpOwogIH0KICBfX25hbWUoc3RhcnQsICJzdGFydCIpOwogIGZ1bmN0aW9uIHByZWZpeChjb2RlNCkgewogICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZTQpICYmIHNpemUrKyA8IGxpbWl0KSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBwcmVmaXg7CiAgICB9CiAgICBlZmZlY3RzLmV4aXQodHlwZTUpOwogICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgfQogIF9fbmFtZShwcmVmaXgsICJwcmVmaXgiKTsKfQpfX25hbWUoZmFjdG9yeVNwYWNlLCAiZmFjdG9yeVNwYWNlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvYmxhbmstbGluZS5qcwp2YXIgYmxhbmtMaW5lID0gewogIHBhcnRpYWw6IHRydWUsCiAgdG9rZW5pemU6IHRva2VuaXplQmxhbmtMaW5lCn07CmZ1bmN0aW9uIHRva2VuaXplQmxhbmtMaW5lKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICByZXR1cm4gbWFya2Rvd25TcGFjZShjb2RlNCkgPyBmYWN0b3J5U3BhY2UoZWZmZWN0cywgYWZ0ZXIsICJsaW5lUHJlZml4IikoY29kZTQpIDogYWZ0ZXIoY29kZTQpOwogIH0KICBfX25hbWUoc3RhcnQsICJzdGFydCIpOwogIGZ1bmN0aW9uIGFmdGVyKGNvZGU0KSB7CiAgICByZXR1cm4gY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSA/IG9rMyhjb2RlNCkgOiBub2soY29kZTQpOwogIH0KICBfX25hbWUoYWZ0ZXIsICJhZnRlciIpOwp9Cl9fbmFtZSh0b2tlbml6ZUJsYW5rTGluZSwgInRva2VuaXplQmxhbmtMaW5lIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvYmxvY2stcXVvdGUuanMKdmFyIGJsb2NrUXVvdGUgPSB7CiAgY29udGludWF0aW9uOiB7CiAgICB0b2tlbml6ZTogdG9rZW5pemVCbG9ja1F1b3RlQ29udGludWF0aW9uCiAgfSwKICBleGl0OiBleGl0MiwKICBuYW1lOiAiYmxvY2tRdW90ZSIsCiAgdG9rZW5pemU6IHRva2VuaXplQmxvY2tRdW90ZVN0YXJ0Cn07CmZ1bmN0aW9uIHRva2VuaXplQmxvY2tRdW90ZVN0YXJ0KGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA2MikgewogICAgICBjb25zdCBzdGF0ZSA9IHNlbGYyLmNvbnRhaW5lclN0YXRlOwogICAgICBpZiAoIXN0YXRlLm9wZW4pIHsKICAgICAgICBlZmZlY3RzLmVudGVyKCJibG9ja1F1b3RlIiwgewogICAgICAgICAgX2NvbnRhaW5lcjogdHJ1ZQogICAgICAgIH0pOwogICAgICAgIHN0YXRlLm9wZW4gPSB0cnVlOwogICAgICB9CiAgICAgIGVmZmVjdHMuZW50ZXIoImJsb2NrUXVvdGVQcmVmaXgiKTsKICAgICAgZWZmZWN0cy5lbnRlcigiYmxvY2tRdW90ZU1hcmtlciIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoImJsb2NrUXVvdGVNYXJrZXIiKTsKICAgICAgcmV0dXJuIGFmdGVyOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZShzdGFydCwgInN0YXJ0Iik7CiAgZnVuY3Rpb24gYWZ0ZXIoY29kZTQpIHsKICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmVudGVyKCJibG9ja1F1b3RlUHJlZml4V2hpdGVzcGFjZSIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoImJsb2NrUXVvdGVQcmVmaXhXaGl0ZXNwYWNlIik7CiAgICAgIGVmZmVjdHMuZXhpdCgiYmxvY2tRdW90ZVByZWZpeCIpOwogICAgICByZXR1cm4gb2szOwogICAgfQogICAgZWZmZWN0cy5leGl0KCJibG9ja1F1b3RlUHJlZml4Iik7CiAgICByZXR1cm4gb2szKGNvZGU0KTsKICB9CiAgX19uYW1lKGFmdGVyLCAiYWZ0ZXIiKTsKfQpfX25hbWUodG9rZW5pemVCbG9ja1F1b3RlU3RhcnQsICJ0b2tlbml6ZUJsb2NrUXVvdGVTdGFydCIpOwpmdW5jdGlvbiB0b2tlbml6ZUJsb2NrUXVvdGVDb250aW51YXRpb24oZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgcmV0dXJuIGNvbnRTdGFydDsKICBmdW5jdGlvbiBjb250U3RhcnQoY29kZTQpIHsKICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICByZXR1cm4gZmFjdG9yeVNwYWNlKGVmZmVjdHMsIGNvbnRCZWZvcmUsICJsaW5lUHJlZml4Iiwgc2VsZjIucGFyc2VyLmNvbnN0cnVjdHMuZGlzYWJsZS5udWxsLmluY2x1ZGVzKCJjb2RlSW5kZW50ZWQiKSA/IHZvaWQgMCA6IDQpKGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBjb250QmVmb3JlKGNvZGU0KTsKICB9CiAgX19uYW1lKGNvbnRTdGFydCwgImNvbnRTdGFydCIpOwogIGZ1bmN0aW9uIGNvbnRCZWZvcmUoY29kZTQpIHsKICAgIHJldHVybiBlZmZlY3RzLmF0dGVtcHQoYmxvY2tRdW90ZSwgb2szLCBub2spKGNvZGU0KTsKICB9CiAgX19uYW1lKGNvbnRCZWZvcmUsICJjb250QmVmb3JlIik7Cn0KX19uYW1lKHRva2VuaXplQmxvY2tRdW90ZUNvbnRpbnVhdGlvbiwgInRva2VuaXplQmxvY2tRdW90ZUNvbnRpbnVhdGlvbiIpOwpmdW5jdGlvbiBleGl0MihlZmZlY3RzKSB7CiAgZWZmZWN0cy5leGl0KCJibG9ja1F1b3RlIik7Cn0KX19uYW1lKGV4aXQyLCAiZXhpdCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2NoYXJhY3Rlci1lc2NhcGUuanMKdmFyIGNoYXJhY3RlckVzY2FwZSA9IHsKICBuYW1lOiAiY2hhcmFjdGVyRXNjYXBlIiwKICB0b2tlbml6ZTogdG9rZW5pemVDaGFyYWN0ZXJFc2NhcGUKfTsKZnVuY3Rpb24gdG9rZW5pemVDaGFyYWN0ZXJFc2NhcGUoZWZmZWN0cywgb2szLCBub2spIHsKICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIGVmZmVjdHMuZW50ZXIoImNoYXJhY3RlckVzY2FwZSIpOwogICAgZWZmZWN0cy5lbnRlcigiZXNjYXBlTWFya2VyIik7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgZWZmZWN0cy5leGl0KCJlc2NhcGVNYXJrZXIiKTsKICAgIHJldHVybiBpbnNpZGU7CiAgfQogIF9fbmFtZShzdGFydCwgInN0YXJ0Iik7CiAgZnVuY3Rpb24gaW5zaWRlKGNvZGU0KSB7CiAgICBpZiAoYXNjaWlQdW5jdHVhdGlvbihjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5lbnRlcigiY2hhcmFjdGVyRXNjYXBlVmFsdWUiKTsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgZWZmZWN0cy5leGl0KCJjaGFyYWN0ZXJFc2NhcGVWYWx1ZSIpOwogICAgICBlZmZlY3RzLmV4aXQoImNoYXJhY3RlckVzY2FwZSIpOwogICAgICByZXR1cm4gb2szOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZShpbnNpZGUsICJpbnNpZGUiKTsKfQpfX25hbWUodG9rZW5pemVDaGFyYWN0ZXJFc2NhcGUsICJ0b2tlbml6ZUNoYXJhY3RlckVzY2FwZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2NoYXJhY3Rlci1yZWZlcmVuY2UuanMKdmFyIGNoYXJhY3RlclJlZmVyZW5jZSA9IHsKICBuYW1lOiAiY2hhcmFjdGVyUmVmZXJlbmNlIiwKICB0b2tlbml6ZTogdG9rZW5pemVDaGFyYWN0ZXJSZWZlcmVuY2UKfTsKZnVuY3Rpb24gdG9rZW5pemVDaGFyYWN0ZXJSZWZlcmVuY2UoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgbGV0IHNpemUgPSAwOwogIGxldCBtYXgzOwogIGxldCB0ZXN0OwogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigiY2hhcmFjdGVyUmVmZXJlbmNlIik7CiAgICBlZmZlY3RzLmVudGVyKCJjaGFyYWN0ZXJSZWZlcmVuY2VNYXJrZXIiKTsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICBlZmZlY3RzLmV4aXQoImNoYXJhY3RlclJlZmVyZW5jZU1hcmtlciIpOwogICAgcmV0dXJuIG9wZW47CiAgfQogIF9fbmFtZShzdGFydCwgInN0YXJ0Iik7CiAgZnVuY3Rpb24gb3Blbihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSAzNSkgewogICAgICBlZmZlY3RzLmVudGVyKCJjaGFyYWN0ZXJSZWZlcmVuY2VNYXJrZXJOdW1lcmljIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgiY2hhcmFjdGVyUmVmZXJlbmNlTWFya2VyTnVtZXJpYyIpOwogICAgICByZXR1cm4gbnVtZXJpYzsKICAgIH0KICAgIGVmZmVjdHMuZW50ZXIoImNoYXJhY3RlclJlZmVyZW5jZVZhbHVlIik7CiAgICBtYXgzID0gMzE7CiAgICB0ZXN0ID0gYXNjaWlBbHBoYW51bWVyaWM7CiAgICByZXR1cm4gdmFsdWUyKGNvZGU0KTsKICB9CiAgX19uYW1lKG9wZW4sICJvcGVuIik7CiAgZnVuY3Rpb24gbnVtZXJpYyhjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA4OCB8fCBjb2RlNCA9PT0gMTIwKSB7CiAgICAgIGVmZmVjdHMuZW50ZXIoImNoYXJhY3RlclJlZmVyZW5jZU1hcmtlckhleGFkZWNpbWFsIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgiY2hhcmFjdGVyUmVmZXJlbmNlTWFya2VySGV4YWRlY2ltYWwiKTsKICAgICAgZWZmZWN0cy5lbnRlcigiY2hhcmFjdGVyUmVmZXJlbmNlVmFsdWUiKTsKICAgICAgbWF4MyA9IDY7CiAgICAgIHRlc3QgPSBhc2NpaUhleERpZ2l0OwogICAgICByZXR1cm4gdmFsdWUyOwogICAgfQogICAgZWZmZWN0cy5lbnRlcigiY2hhcmFjdGVyUmVmZXJlbmNlVmFsdWUiKTsKICAgIG1heDMgPSA3OwogICAgdGVzdCA9IGFzY2lpRGlnaXQ7CiAgICByZXR1cm4gdmFsdWUyKGNvZGU0KTsKICB9CiAgX19uYW1lKG51bWVyaWMsICJudW1lcmljIik7CiAgZnVuY3Rpb24gdmFsdWUyKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDU5ICYmIHNpemUpIHsKICAgICAgY29uc3QgdG9rZW4gPSBlZmZlY3RzLmV4aXQoImNoYXJhY3RlclJlZmVyZW5jZVZhbHVlIik7CiAgICAgIGlmICh0ZXN0ID09PSBhc2NpaUFscGhhbnVtZXJpYyAmJiAhZGVjb2RlTmFtZWRDaGFyYWN0ZXJSZWZlcmVuY2Uoc2VsZjIuc2xpY2VTZXJpYWxpemUodG9rZW4pKSkgewogICAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgICB9CiAgICAgIGVmZmVjdHMuZW50ZXIoImNoYXJhY3RlclJlZmVyZW5jZU1hcmtlciIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoImNoYXJhY3RlclJlZmVyZW5jZU1hcmtlciIpOwogICAgICBlZmZlY3RzLmV4aXQoImNoYXJhY3RlclJlZmVyZW5jZSIpOwogICAgICByZXR1cm4gb2szOwogICAgfQogICAgaWYgKHRlc3QoY29kZTQpICYmIHNpemUrKyA8IG1heDMpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHZhbHVlMjsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBfX25hbWUodmFsdWUyLCAidmFsdWUiKTsKfQpfX25hbWUodG9rZW5pemVDaGFyYWN0ZXJSZWZlcmVuY2UsICJ0b2tlbml6ZUNoYXJhY3RlclJlZmVyZW5jZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2NvZGUtZmVuY2VkLmpzCnZhciBub25MYXp5Q29udGludWF0aW9uID0gewogIHBhcnRpYWw6IHRydWUsCiAgdG9rZW5pemU6IHRva2VuaXplTm9uTGF6eUNvbnRpbnVhdGlvbgp9Owp2YXIgY29kZUZlbmNlZCA9IHsKICBjb25jcmV0ZTogdHJ1ZSwKICBuYW1lOiAiY29kZUZlbmNlZCIsCiAgdG9rZW5pemU6IHRva2VuaXplQ29kZUZlbmNlZAp9OwpmdW5jdGlvbiB0b2tlbml6ZUNvZGVGZW5jZWQoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgY29uc3QgY2xvc2VTdGFydCA9IHsKICAgIHBhcnRpYWw6IHRydWUsCiAgICB0b2tlbml6ZTogdG9rZW5pemVDbG9zZVN0YXJ0CiAgfTsKICBsZXQgaW5pdGlhbFByZWZpeCA9IDA7CiAgbGV0IHNpemVPcGVuID0gMDsKICBsZXQgbWFya2VyOwogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgcmV0dXJuIGJlZm9yZVNlcXVlbmNlT3Blbihjb2RlNCk7CiAgfQogIF9fbmFtZShzdGFydCwgInN0YXJ0Iik7CiAgZnVuY3Rpb24gYmVmb3JlU2VxdWVuY2VPcGVuKGNvZGU0KSB7CiAgICBjb25zdCB0YWlsID0gc2VsZjIuZXZlbnRzW3NlbGYyLmV2ZW50cy5sZW5ndGggLSAxXTsKICAgIGluaXRpYWxQcmVmaXggPSB0YWlsICYmIHRhaWxbMV0udHlwZSA9PT0gImxpbmVQcmVmaXgiID8gdGFpbFsyXS5zbGljZVNlcmlhbGl6ZSh0YWlsWzFdLCB0cnVlKS5sZW5ndGggOiAwOwogICAgbWFya2VyID0gY29kZTQ7CiAgICBlZmZlY3RzLmVudGVyKCJjb2RlRmVuY2VkIik7CiAgICBlZmZlY3RzLmVudGVyKCJjb2RlRmVuY2VkRmVuY2UiKTsKICAgIGVmZmVjdHMuZW50ZXIoImNvZGVGZW5jZWRGZW5jZVNlcXVlbmNlIik7CiAgICByZXR1cm4gc2VxdWVuY2VPcGVuKGNvZGU0KTsKICB9CiAgX19uYW1lKGJlZm9yZVNlcXVlbmNlT3BlbiwgImJlZm9yZVNlcXVlbmNlT3BlbiIpOwogIGZ1bmN0aW9uIHNlcXVlbmNlT3Blbihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBtYXJrZXIpIHsKICAgICAgc2l6ZU9wZW4rKzsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHNlcXVlbmNlT3BlbjsKICAgIH0KICAgIGlmIChzaXplT3BlbiA8IDMpIHsKICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICBlZmZlY3RzLmV4aXQoImNvZGVGZW5jZWRGZW5jZVNlcXVlbmNlIik7CiAgICByZXR1cm4gbWFya2Rvd25TcGFjZShjb2RlNCkgPyBmYWN0b3J5U3BhY2UoZWZmZWN0cywgaW5mb0JlZm9yZSwgIndoaXRlc3BhY2UiKShjb2RlNCkgOiBpbmZvQmVmb3JlKGNvZGU0KTsKICB9CiAgX19uYW1lKHNlcXVlbmNlT3BlbiwgInNlcXVlbmNlT3BlbiIpOwogIGZ1bmN0aW9uIGluZm9CZWZvcmUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuZXhpdCgiY29kZUZlbmNlZEZlbmNlIik7CiAgICAgIHJldHVybiBzZWxmMi5pbnRlcnJ1cHQgPyBvazMoY29kZTQpIDogZWZmZWN0cy5jaGVjayhub25MYXp5Q29udGludWF0aW9uLCBhdE5vbkxhenlCcmVhaywgYWZ0ZXIpKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuZW50ZXIoImNvZGVGZW5jZWRGZW5jZUluZm8iKTsKICAgIGVmZmVjdHMuZW50ZXIoImNodW5rU3RyaW5nIiwgewogICAgICBjb250ZW50VHlwZTogInN0cmluZyIKICAgIH0pOwogICAgcmV0dXJuIGluZm8oY29kZTQpOwogIH0KICBfX25hbWUoaW5mb0JlZm9yZSwgImluZm9CZWZvcmUiKTsKICBmdW5jdGlvbiBpbmZvKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmV4aXQoImNodW5rU3RyaW5nIik7CiAgICAgIGVmZmVjdHMuZXhpdCgiY29kZUZlbmNlZEZlbmNlSW5mbyIpOwogICAgICByZXR1cm4gaW5mb0JlZm9yZShjb2RlNCk7CiAgICB9CiAgICBpZiAobWFya2Rvd25TcGFjZShjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5leGl0KCJjaHVua1N0cmluZyIpOwogICAgICBlZmZlY3RzLmV4aXQoImNvZGVGZW5jZWRGZW5jZUluZm8iKTsKICAgICAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBtZXRhQmVmb3JlLCAid2hpdGVzcGFjZSIpKGNvZGU0KTsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gOTYgJiYgY29kZTQgPT09IG1hcmtlcikgewogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gaW5mbzsKICB9CiAgX19uYW1lKGluZm8sICJpbmZvIik7CiAgZnVuY3Rpb24gbWV0YUJlZm9yZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgcmV0dXJuIGluZm9CZWZvcmUoY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5lbnRlcigiY29kZUZlbmNlZEZlbmNlTWV0YSIpOwogICAgZWZmZWN0cy5lbnRlcigiY2h1bmtTdHJpbmciLCB7CiAgICAgIGNvbnRlbnRUeXBlOiAic3RyaW5nIgogICAgfSk7CiAgICByZXR1cm4gbWV0YShjb2RlNCk7CiAgfQogIF9fbmFtZShtZXRhQmVmb3JlLCAibWV0YUJlZm9yZSIpOwogIGZ1bmN0aW9uIG1ldGEoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuZXhpdCgiY2h1bmtTdHJpbmciKTsKICAgICAgZWZmZWN0cy5leGl0KCJjb2RlRmVuY2VkRmVuY2VNZXRhIik7CiAgICAgIHJldHVybiBpbmZvQmVmb3JlKGNvZGU0KTsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gOTYgJiYgY29kZTQgPT09IG1hcmtlcikgewogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gbWV0YTsKICB9CiAgX19uYW1lKG1ldGEsICJtZXRhIik7CiAgZnVuY3Rpb24gYXROb25MYXp5QnJlYWsoY29kZTQpIHsKICAgIHJldHVybiBlZmZlY3RzLmF0dGVtcHQoY2xvc2VTdGFydCwgYWZ0ZXIsIGNvbnRlbnRCZWZvcmUpKGNvZGU0KTsKICB9CiAgX19uYW1lKGF0Tm9uTGF6eUJyZWFrLCAiYXROb25MYXp5QnJlYWsiKTsKICBmdW5jdGlvbiBjb250ZW50QmVmb3JlKGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJsaW5lRW5kaW5nIik7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgZWZmZWN0cy5leGl0KCJsaW5lRW5kaW5nIik7CiAgICByZXR1cm4gY29udGVudFN0YXJ0OwogIH0KICBfX25hbWUoY29udGVudEJlZm9yZSwgImNvbnRlbnRCZWZvcmUiKTsKICBmdW5jdGlvbiBjb250ZW50U3RhcnQoY29kZTQpIHsKICAgIHJldHVybiBpbml0aWFsUHJlZml4ID4gMCAmJiBtYXJrZG93blNwYWNlKGNvZGU0KSA/IGZhY3RvcnlTcGFjZShlZmZlY3RzLCBiZWZvcmVDb250ZW50Q2h1bmssICJsaW5lUHJlZml4IiwgaW5pdGlhbFByZWZpeCArIDEpKGNvZGU0KSA6IGJlZm9yZUNvbnRlbnRDaHVuayhjb2RlNCk7CiAgfQogIF9fbmFtZShjb250ZW50U3RhcnQsICJjb250ZW50U3RhcnQiKTsKICBmdW5jdGlvbiBiZWZvcmVDb250ZW50Q2h1bmsoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIHJldHVybiBlZmZlY3RzLmNoZWNrKG5vbkxhenlDb250aW51YXRpb24sIGF0Tm9uTGF6eUJyZWFrLCBhZnRlcikoY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5lbnRlcigiY29kZUZsb3dWYWx1ZSIpOwogICAgcmV0dXJuIGNvbnRlbnRDaHVuayhjb2RlNCk7CiAgfQogIF9fbmFtZShiZWZvcmVDb250ZW50Q2h1bmssICJiZWZvcmVDb250ZW50Q2h1bmsiKTsKICBmdW5jdGlvbiBjb250ZW50Q2h1bmsoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuZXhpdCgiY29kZUZsb3dWYWx1ZSIpOwogICAgICByZXR1cm4gYmVmb3JlQ29udGVudENodW5rKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gY29udGVudENodW5rOwogIH0KICBfX25hbWUoY29udGVudENodW5rLCAiY29udGVudENodW5rIik7CiAgZnVuY3Rpb24gYWZ0ZXIoY29kZTQpIHsKICAgIGVmZmVjdHMuZXhpdCgiY29kZUZlbmNlZCIpOwogICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgfQogIF9fbmFtZShhZnRlciwgImFmdGVyIik7CiAgZnVuY3Rpb24gdG9rZW5pemVDbG9zZVN0YXJ0KGVmZmVjdHMyLCBvazQsIG5vazIpIHsKICAgIGxldCBzaXplID0gMDsKICAgIHJldHVybiBzdGFydEJlZm9yZTsKICAgIGZ1bmN0aW9uIHN0YXJ0QmVmb3JlKGNvZGU0KSB7CiAgICAgIGVmZmVjdHMyLmVudGVyKCJsaW5lRW5kaW5nIik7CiAgICAgIGVmZmVjdHMyLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzMi5leGl0KCJsaW5lRW5kaW5nIik7CiAgICAgIHJldHVybiBzdGFydDI7CiAgICB9CiAgICBfX25hbWUoc3RhcnRCZWZvcmUsICJzdGFydEJlZm9yZSIpOwogICAgZnVuY3Rpb24gc3RhcnQyKGNvZGU0KSB7CiAgICAgIGVmZmVjdHMyLmVudGVyKCJjb2RlRmVuY2VkRmVuY2UiKTsKICAgICAgcmV0dXJuIG1hcmtkb3duU3BhY2UoY29kZTQpID8gZmFjdG9yeVNwYWNlKGVmZmVjdHMyLCBiZWZvcmVTZXF1ZW5jZUNsb3NlLCAibGluZVByZWZpeCIsIHNlbGYyLnBhcnNlci5jb25zdHJ1Y3RzLmRpc2FibGUubnVsbC5pbmNsdWRlcygiY29kZUluZGVudGVkIikgPyB2b2lkIDAgOiA0KShjb2RlNCkgOiBiZWZvcmVTZXF1ZW5jZUNsb3NlKGNvZGU0KTsKICAgIH0KICAgIF9fbmFtZShzdGFydDIsICJzdGFydCIpOwogICAgZnVuY3Rpb24gYmVmb3JlU2VxdWVuY2VDbG9zZShjb2RlNCkgewogICAgICBpZiAoY29kZTQgPT09IG1hcmtlcikgewogICAgICAgIGVmZmVjdHMyLmVudGVyKCJjb2RlRmVuY2VkRmVuY2VTZXF1ZW5jZSIpOwogICAgICAgIHJldHVybiBzZXF1ZW5jZUNsb3NlKGNvZGU0KTsKICAgICAgfQogICAgICByZXR1cm4gbm9rMihjb2RlNCk7CiAgICB9CiAgICBfX25hbWUoYmVmb3JlU2VxdWVuY2VDbG9zZSwgImJlZm9yZVNlcXVlbmNlQ2xvc2UiKTsKICAgIGZ1bmN0aW9uIHNlcXVlbmNlQ2xvc2UoY29kZTQpIHsKICAgICAgaWYgKGNvZGU0ID09PSBtYXJrZXIpIHsKICAgICAgICBzaXplKys7CiAgICAgICAgZWZmZWN0czIuY29uc3VtZShjb2RlNCk7CiAgICAgICAgcmV0dXJuIHNlcXVlbmNlQ2xvc2U7CiAgICAgIH0KICAgICAgaWYgKHNpemUgPj0gc2l6ZU9wZW4pIHsKICAgICAgICBlZmZlY3RzMi5leGl0KCJjb2RlRmVuY2VkRmVuY2VTZXF1ZW5jZSIpOwogICAgICAgIHJldHVybiBtYXJrZG93blNwYWNlKGNvZGU0KSA/IGZhY3RvcnlTcGFjZShlZmZlY3RzMiwgc2VxdWVuY2VDbG9zZUFmdGVyLCAid2hpdGVzcGFjZSIpKGNvZGU0KSA6IHNlcXVlbmNlQ2xvc2VBZnRlcihjb2RlNCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5vazIoY29kZTQpOwogICAgfQogICAgX19uYW1lKHNlcXVlbmNlQ2xvc2UsICJzZXF1ZW5jZUNsb3NlIik7CiAgICBmdW5jdGlvbiBzZXF1ZW5jZUNsb3NlQWZ0ZXIoY29kZTQpIHsKICAgICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgICBlZmZlY3RzMi5leGl0KCJjb2RlRmVuY2VkRmVuY2UiKTsKICAgICAgICByZXR1cm4gb2s0KGNvZGU0KTsKICAgICAgfQogICAgICByZXR1cm4gbm9rMihjb2RlNCk7CiAgICB9CiAgICBfX25hbWUoc2VxdWVuY2VDbG9zZUFmdGVyLCAic2VxdWVuY2VDbG9zZUFmdGVyIik7CiAgfQogIF9fbmFtZSh0b2tlbml6ZUNsb3NlU3RhcnQsICJ0b2tlbml6ZUNsb3NlU3RhcnQiKTsKfQpfX25hbWUodG9rZW5pemVDb2RlRmVuY2VkLCAidG9rZW5pemVDb2RlRmVuY2VkIik7CmZ1bmN0aW9uIHRva2VuaXplTm9uTGF6eUNvbnRpbnVhdGlvbihlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCkgewogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuZW50ZXIoImxpbmVFbmRpbmciKTsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICBlZmZlY3RzLmV4aXQoImxpbmVFbmRpbmciKTsKICAgIHJldHVybiBsaW5lU3RhcnQ7CiAgfQogIF9fbmFtZShzdGFydCwgInN0YXJ0Iik7CiAgZnVuY3Rpb24gbGluZVN0YXJ0KGNvZGU0KSB7CiAgICByZXR1cm4gc2VsZjIucGFyc2VyLmxhenlbc2VsZjIubm93KCkubGluZV0gPyBub2soY29kZTQpIDogb2szKGNvZGU0KTsKICB9CiAgX19uYW1lKGxpbmVTdGFydCwgImxpbmVTdGFydCIpOwp9Cl9fbmFtZSh0b2tlbml6ZU5vbkxhenlDb250aW51YXRpb24sICJ0b2tlbml6ZU5vbkxhenlDb250aW51YXRpb24iKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstY29yZS1jb21tb25tYXJrQDIuMC4zL25vZGVfbW9kdWxlcy9taWNyb21hcmstY29yZS1jb21tb25tYXJrL2xpYi9jb2RlLWluZGVudGVkLmpzCnZhciBjb2RlSW5kZW50ZWQgPSB7CiAgbmFtZTogImNvZGVJbmRlbnRlZCIsCiAgdG9rZW5pemU6IHRva2VuaXplQ29kZUluZGVudGVkCn07CnZhciBmdXJ0aGVyU3RhcnQgPSB7CiAgcGFydGlhbDogdHJ1ZSwKICB0b2tlbml6ZTogdG9rZW5pemVGdXJ0aGVyU3RhcnQKfTsKZnVuY3Rpb24gdG9rZW5pemVDb2RlSW5kZW50ZWQoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJjb2RlSW5kZW50ZWQiKTsKICAgIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgYWZ0ZXJQcmVmaXgsICJsaW5lUHJlZml4IiwgNCArIDEpKGNvZGU0KTsKICB9CiAgX19uYW1lKHN0YXJ0LCAic3RhcnQiKTsKICBmdW5jdGlvbiBhZnRlclByZWZpeChjb2RlNCkgewogICAgY29uc3QgdGFpbCA9IHNlbGYyLmV2ZW50c1tzZWxmMi5ldmVudHMubGVuZ3RoIC0gMV07CiAgICByZXR1cm4gdGFpbCAmJiB0YWlsWzFdLnR5cGUgPT09ICJsaW5lUHJlZml4IiAmJiB0YWlsWzJdLnNsaWNlU2VyaWFsaXplKHRhaWxbMV0sIHRydWUpLmxlbmd0aCA+PSA0ID8gYXRCcmVhayhjb2RlNCkgOiBub2soY29kZTQpOwogIH0KICBfX25hbWUoYWZ0ZXJQcmVmaXgsICJhZnRlclByZWZpeCIpOwogIGZ1bmN0aW9uIGF0QnJlYWsoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCkgewogICAgICByZXR1cm4gYWZ0ZXIoY29kZTQpOwogICAgfQogICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgcmV0dXJuIGVmZmVjdHMuYXR0ZW1wdChmdXJ0aGVyU3RhcnQsIGF0QnJlYWssIGFmdGVyKShjb2RlNCk7CiAgICB9CiAgICBlZmZlY3RzLmVudGVyKCJjb2RlRmxvd1ZhbHVlIik7CiAgICByZXR1cm4gaW5zaWRlKGNvZGU0KTsKICB9CiAgX19uYW1lKGF0QnJlYWssICJhdEJyZWFrIik7CiAgZnVuY3Rpb24gaW5zaWRlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmV4aXQoImNvZGVGbG93VmFsdWUiKTsKICAgICAgcmV0dXJuIGF0QnJlYWsoY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBpbnNpZGU7CiAgfQogIF9fbmFtZShpbnNpZGUsICJpbnNpZGUiKTsKICBmdW5jdGlvbiBhZnRlcihjb2RlNCkgewogICAgZWZmZWN0cy5leGl0KCJjb2RlSW5kZW50ZWQiKTsKICAgIHJldHVybiBvazMoY29kZTQpOwogIH0KICBfX25hbWUoYWZ0ZXIsICJhZnRlciIpOwp9Cl9fbmFtZSh0b2tlbml6ZUNvZGVJbmRlbnRlZCwgInRva2VuaXplQ29kZUluZGVudGVkIik7CmZ1bmN0aW9uIHRva2VuaXplRnVydGhlclN0YXJ0KGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIHJldHVybiBmdXJ0aGVyU3RhcnQyOwogIGZ1bmN0aW9uIGZ1cnRoZXJTdGFydDIoY29kZTQpIHsKICAgIGlmIChzZWxmMi5wYXJzZXIubGF6eVtzZWxmMi5ub3coKS5saW5lXSkgewogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuZW50ZXIoImxpbmVFbmRpbmciKTsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgZWZmZWN0cy5leGl0KCJsaW5lRW5kaW5nIik7CiAgICAgIHJldHVybiBmdXJ0aGVyU3RhcnQyOwogICAgfQogICAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBhZnRlclByZWZpeCwgImxpbmVQcmVmaXgiLCA0ICsgMSkoY29kZTQpOwogIH0KICBfX25hbWUoZnVydGhlclN0YXJ0MiwgImZ1cnRoZXJTdGFydCIpOwogIGZ1bmN0aW9uIGFmdGVyUHJlZml4KGNvZGU0KSB7CiAgICBjb25zdCB0YWlsID0gc2VsZjIuZXZlbnRzW3NlbGYyLmV2ZW50cy5sZW5ndGggLSAxXTsKICAgIHJldHVybiB0YWlsICYmIHRhaWxbMV0udHlwZSA9PT0gImxpbmVQcmVmaXgiICYmIHRhaWxbMl0uc2xpY2VTZXJpYWxpemUodGFpbFsxXSwgdHJ1ZSkubGVuZ3RoID49IDQgPyBvazMoY29kZTQpIDogbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSA/IGZ1cnRoZXJTdGFydDIoY29kZTQpIDogbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKGFmdGVyUHJlZml4LCAiYWZ0ZXJQcmVmaXgiKTsKfQpfX25hbWUodG9rZW5pemVGdXJ0aGVyU3RhcnQsICJ0b2tlbml6ZUZ1cnRoZXJTdGFydCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2NvZGUtdGV4dC5qcwp2YXIgY29kZVRleHQgPSB7CiAgbmFtZTogImNvZGVUZXh0IiwKICBwcmV2aW91czogcHJldmlvdXMyLAogIHJlc29sdmU6IHJlc29sdmVDb2RlVGV4dCwKICB0b2tlbml6ZTogdG9rZW5pemVDb2RlVGV4dAp9OwpmdW5jdGlvbiByZXNvbHZlQ29kZVRleHQoZXZlbnRzKSB7CiAgbGV0IHRhaWxFeGl0SW5kZXggPSBldmVudHMubGVuZ3RoIC0gNDsKICBsZXQgaGVhZEVudGVySW5kZXggPSAzOwogIGxldCBpbmRleDI7CiAgbGV0IGVudGVyOwogIGlmICgoZXZlbnRzW2hlYWRFbnRlckluZGV4XVsxXS50eXBlID09PSAibGluZUVuZGluZyIgfHwgZXZlbnRzW2hlYWRFbnRlckluZGV4XVsxXS50eXBlID09PSAic3BhY2UiKSAmJiAoZXZlbnRzW3RhaWxFeGl0SW5kZXhdWzFdLnR5cGUgPT09ICJsaW5lRW5kaW5nIiB8fCBldmVudHNbdGFpbEV4aXRJbmRleF1bMV0udHlwZSA9PT0gInNwYWNlIikpIHsKICAgIGluZGV4MiA9IGhlYWRFbnRlckluZGV4OwogICAgd2hpbGUgKCsraW5kZXgyIDwgdGFpbEV4aXRJbmRleCkgewogICAgICBpZiAoZXZlbnRzW2luZGV4Ml1bMV0udHlwZSA9PT0gImNvZGVUZXh0RGF0YSIpIHsKICAgICAgICBldmVudHNbaGVhZEVudGVySW5kZXhdWzFdLnR5cGUgPSAiY29kZVRleHRQYWRkaW5nIjsKICAgICAgICBldmVudHNbdGFpbEV4aXRJbmRleF1bMV0udHlwZSA9ICJjb2RlVGV4dFBhZGRpbmciOwogICAgICAgIGhlYWRFbnRlckluZGV4ICs9IDI7CiAgICAgICAgdGFpbEV4aXRJbmRleCAtPSAyOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgfQogIGluZGV4MiA9IGhlYWRFbnRlckluZGV4IC0gMTsKICB0YWlsRXhpdEluZGV4Kys7CiAgd2hpbGUgKCsraW5kZXgyIDw9IHRhaWxFeGl0SW5kZXgpIHsKICAgIGlmIChlbnRlciA9PT0gdm9pZCAwKSB7CiAgICAgIGlmIChpbmRleDIgIT09IHRhaWxFeGl0SW5kZXggJiYgZXZlbnRzW2luZGV4Ml1bMV0udHlwZSAhPT0gImxpbmVFbmRpbmciKSB7CiAgICAgICAgZW50ZXIgPSBpbmRleDI7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoaW5kZXgyID09PSB0YWlsRXhpdEluZGV4IHx8IGV2ZW50c1tpbmRleDJdWzFdLnR5cGUgPT09ICJsaW5lRW5kaW5nIikgewogICAgICBldmVudHNbZW50ZXJdWzFdLnR5cGUgPSAiY29kZVRleHREYXRhIjsKICAgICAgaWYgKGluZGV4MiAhPT0gZW50ZXIgKyAyKSB7CiAgICAgICAgZXZlbnRzW2VudGVyXVsxXS5lbmQgPSBldmVudHNbaW5kZXgyIC0gMV1bMV0uZW5kOwogICAgICAgIGV2ZW50cy5zcGxpY2UoZW50ZXIgKyAyLCBpbmRleDIgLSBlbnRlciAtIDIpOwogICAgICAgIHRhaWxFeGl0SW5kZXggLT0gaW5kZXgyIC0gZW50ZXIgLSAyOwogICAgICAgIGluZGV4MiA9IGVudGVyICsgMjsKICAgICAgfQogICAgICBlbnRlciA9IHZvaWQgMDsKICAgIH0KICB9CiAgcmV0dXJuIGV2ZW50czsKfQpfX25hbWUocmVzb2x2ZUNvZGVUZXh0LCAicmVzb2x2ZUNvZGVUZXh0Iik7CmZ1bmN0aW9uIHByZXZpb3VzMihjb2RlNCkgewogIHJldHVybiBjb2RlNCAhPT0gOTYgfHwgdGhpcy5ldmVudHNbdGhpcy5ldmVudHMubGVuZ3RoIC0gMV1bMV0udHlwZSA9PT0gImNoYXJhY3RlckVzY2FwZSI7Cn0KX19uYW1lKHByZXZpb3VzMiwgInByZXZpb3VzIik7CmZ1bmN0aW9uIHRva2VuaXplQ29kZVRleHQoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgbGV0IHNpemVPcGVuID0gMDsKICBsZXQgc2l6ZTsKICBsZXQgdG9rZW47CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJjb2RlVGV4dCIpOwogICAgZWZmZWN0cy5lbnRlcigiY29kZVRleHRTZXF1ZW5jZSIpOwogICAgcmV0dXJuIHNlcXVlbmNlT3Blbihjb2RlNCk7CiAgfQogIF9fbmFtZShzdGFydCwgInN0YXJ0Iik7CiAgZnVuY3Rpb24gc2VxdWVuY2VPcGVuKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDk2KSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHNpemVPcGVuKys7CiAgICAgIHJldHVybiBzZXF1ZW5jZU9wZW47CiAgICB9CiAgICBlZmZlY3RzLmV4aXQoImNvZGVUZXh0U2VxdWVuY2UiKTsKICAgIHJldHVybiBiZXR3ZWVuMihjb2RlNCk7CiAgfQogIF9fbmFtZShzZXF1ZW5jZU9wZW4sICJzZXF1ZW5jZU9wZW4iKTsKICBmdW5jdGlvbiBiZXR3ZWVuMihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSAzMikgewogICAgICBlZmZlY3RzLmVudGVyKCJzcGFjZSIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoInNwYWNlIik7CiAgICAgIHJldHVybiBiZXR3ZWVuMjsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gOTYpIHsKICAgICAgdG9rZW4gPSBlZmZlY3RzLmVudGVyKCJjb2RlVGV4dFNlcXVlbmNlIik7CiAgICAgIHNpemUgPSAwOwogICAgICByZXR1cm4gc2VxdWVuY2VDbG9zZShjb2RlNCk7CiAgICB9CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmVudGVyKCJsaW5lRW5kaW5nIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgibGluZUVuZGluZyIpOwogICAgICByZXR1cm4gYmV0d2VlbjI7CiAgICB9CiAgICBlZmZlY3RzLmVudGVyKCJjb2RlVGV4dERhdGEiKTsKICAgIHJldHVybiBkYXRhKGNvZGU0KTsKICB9CiAgX19uYW1lKGJldHdlZW4yLCAiYmV0d2VlbiIpOwogIGZ1bmN0aW9uIGRhdGEoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBjb2RlNCA9PT0gMzIgfHwgY29kZTQgPT09IDk2IHx8IG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5leGl0KCJjb2RlVGV4dERhdGEiKTsKICAgICAgcmV0dXJuIGJldHdlZW4yKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gZGF0YTsKICB9CiAgX19uYW1lKGRhdGEsICJkYXRhIik7CiAgZnVuY3Rpb24gc2VxdWVuY2VDbG9zZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA5NikgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBzaXplKys7CiAgICAgIHJldHVybiBzZXF1ZW5jZUNsb3NlOwogICAgfQogICAgaWYgKHNpemUgPT09IHNpemVPcGVuKSB7CiAgICAgIGVmZmVjdHMuZXhpdCgiY29kZVRleHRTZXF1ZW5jZSIpOwogICAgICBlZmZlY3RzLmV4aXQoImNvZGVUZXh0Iik7CiAgICAgIHJldHVybiBvazMoY29kZTQpOwogICAgfQogICAgdG9rZW4udHlwZSA9ICJjb2RlVGV4dERhdGEiOwogICAgcmV0dXJuIGRhdGEoY29kZTQpOwogIH0KICBfX25hbWUoc2VxdWVuY2VDbG9zZSwgInNlcXVlbmNlQ2xvc2UiKTsKfQpfX25hbWUodG9rZW5pemVDb2RlVGV4dCwgInRva2VuaXplQ29kZVRleHQiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstdXRpbC1zdWJ0b2tlbml6ZUAyLjEuMC9ub2RlX21vZHVsZXMvbWljcm9tYXJrLXV0aWwtc3VidG9rZW5pemUvbGliL3NwbGljZS1idWZmZXIuanMKdmFyIFNwbGljZUJ1ZmZlciA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJTcGxpY2VCdWZmZXIiKTsKICB9CiAgLyoqCiAgICogQHBhcmFtIHtSZWFkb25seUFycmF5PFQ+IHwgbnVsbCB8IHVuZGVmaW5lZH0gW2luaXRpYWxdCiAgICogICBJbml0aWFsIGl0ZW1zIChvcHRpb25hbCkuCiAgICogQHJldHVybnMKICAgKiAgIFNwbGljZSBidWZmZXIuCiAgICovCiAgY29uc3RydWN0b3IoaW5pdGlhbCkgewogICAgdGhpcy5sZWZ0ID0gaW5pdGlhbCA/IFsuLi5pbml0aWFsXSA6IFtdOwogICAgdGhpcy5yaWdodCA9IFtdOwogIH0KICAvKioKICAgKiBBcnJheSBhY2Nlc3M7CiAgICogZG9lcyBub3QgbW92ZSB0aGUgY3Vyc29yLgogICAqCiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4CiAgICogICBJbmRleC4KICAgKiBAcmV0dXJuIHtUfQogICAqICAgSXRlbS4KICAgKi8KICBnZXQoaW5kZXgyKSB7CiAgICBpZiAoaW5kZXgyIDwgMCB8fCBpbmRleDIgPj0gdGhpcy5sZWZ0Lmxlbmd0aCArIHRoaXMucmlnaHQubGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCJDYW5ub3QgYWNjZXNzIGluZGV4IGAiICsgaW5kZXgyICsgImAgaW4gYSBzcGxpY2UgYnVmZmVyIG9mIHNpemUgYCIgKyAodGhpcy5sZWZ0Lmxlbmd0aCArIHRoaXMucmlnaHQubGVuZ3RoKSArICJgIik7CiAgICB9CiAgICBpZiAoaW5kZXgyIDwgdGhpcy5sZWZ0Lmxlbmd0aCkgcmV0dXJuIHRoaXMubGVmdFtpbmRleDJdOwogICAgcmV0dXJuIHRoaXMucmlnaHRbdGhpcy5yaWdodC5sZW5ndGggLSBpbmRleDIgKyB0aGlzLmxlZnQubGVuZ3RoIC0gMV07CiAgfQogIC8qKgogICAqIFRoZSBsZW5ndGggb2YgdGhlIHNwbGljZSBidWZmZXIsIG9uZSBncmVhdGVyIHRoYW4gdGhlIGxhcmdlc3QgaW5kZXggaW4gdGhlCiAgICogYXJyYXkuCiAgICovCiAgZ2V0IGxlbmd0aCgpIHsKICAgIHJldHVybiB0aGlzLmxlZnQubGVuZ3RoICsgdGhpcy5yaWdodC5sZW5ndGg7CiAgfQogIC8qKgogICAqIFJlbW92ZSBhbmQgcmV0dXJuIGBsaXN0WzBdYDsKICAgKiBtb3ZlcyB0aGUgY3Vyc29yIHRvIGAwYC4KICAgKgogICAqIEByZXR1cm5zIHtUIHwgdW5kZWZpbmVkfQogICAqICAgSXRlbSwgb3B0aW9uYWwuCiAgICovCiAgc2hpZnQoKSB7CiAgICB0aGlzLnNldEN1cnNvcigwKTsKICAgIHJldHVybiB0aGlzLnJpZ2h0LnBvcCgpOwogIH0KICAvKioKICAgKiBTbGljZSB0aGUgYnVmZmVyIHRvIGdldCBhbiBhcnJheTsKICAgKiBkb2VzIG5vdCBtb3ZlIHRoZSBjdXJzb3IuCiAgICoKICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQKICAgKiAgIFN0YXJ0LgogICAqIEBwYXJhbSB7bnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZH0gW2VuZF0KICAgKiAgIEVuZCAob3B0aW9uYWwpLgogICAqIEByZXR1cm5zIHtBcnJheTxUPn0KICAgKiAgIEFycmF5IG9mIGl0ZW1zLgogICAqLwogIHNsaWNlKHN0YXJ0LCBlbmQpIHsKICAgIGNvbnN0IHN0b3AgPSBlbmQgPT09IG51bGwgfHwgZW5kID09PSB2b2lkIDAgPyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgOiBlbmQ7CiAgICBpZiAoc3RvcCA8IHRoaXMubGVmdC5sZW5ndGgpIHsKICAgICAgcmV0dXJuIHRoaXMubGVmdC5zbGljZShzdGFydCwgc3RvcCk7CiAgICB9CiAgICBpZiAoc3RhcnQgPiB0aGlzLmxlZnQubGVuZ3RoKSB7CiAgICAgIHJldHVybiB0aGlzLnJpZ2h0LnNsaWNlKHRoaXMucmlnaHQubGVuZ3RoIC0gc3RvcCArIHRoaXMubGVmdC5sZW5ndGgsIHRoaXMucmlnaHQubGVuZ3RoIC0gc3RhcnQgKyB0aGlzLmxlZnQubGVuZ3RoKS5yZXZlcnNlKCk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5sZWZ0LnNsaWNlKHN0YXJ0KS5jb25jYXQodGhpcy5yaWdodC5zbGljZSh0aGlzLnJpZ2h0Lmxlbmd0aCAtIHN0b3AgKyB0aGlzLmxlZnQubGVuZ3RoKS5yZXZlcnNlKCkpOwogIH0KICAvKioKICAgKiBNaW1pY3MgdGhlIGJlaGF2aW9yIG9mIEFycmF5LnByb3RvdHlwZS5zcGxpY2UoKSBleGNlcHQgZm9yIHRoZSBjaGFuZ2Ugb2YKICAgKiBpbnRlcmZhY2UgbmVjZXNzYXJ5IHRvIGF2b2lkIHNlZ2ZhdWx0cyB3aGVuIHBhdGNoaW5nIGluIHZlcnkgbGFyZ2UgYXJyYXlzLgogICAqCiAgICogVGhpcyBvcGVyYXRpb24gbW92ZXMgY3Vyc29yIGlzIG1vdmVkIHRvIGBzdGFydGAgYW5kIHJlc3VsdHMgaW4gdGhlIGN1cnNvcgogICAqIHBsYWNlZCBhZnRlciBhbnkgaW5zZXJ0ZWQgaXRlbXMuCiAgICoKICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQKICAgKiAgIFN0YXJ0OwogICAqICAgemVyby1iYXNlZCBpbmRleCBhdCB3aGljaCB0byBzdGFydCBjaGFuZ2luZyB0aGUgYXJyYXk7CiAgICogICBuZWdhdGl2ZSBudW1iZXJzIGNvdW50IGJhY2t3YXJkcyBmcm9tIHRoZSBlbmQgb2YgdGhlIGFycmF5IGFuZCB2YWx1ZXMKICAgKiAgIHRoYXQgYXJlIG91dC1vZiBib3VuZHMgYXJlIGNsYW1wZWQgdG8gdGhlIGFwcHJvcHJpYXRlIGVuZCBvZiB0aGUgYXJyYXkuCiAgICogQHBhcmFtIHtudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkfSBbZGVsZXRlQ291bnQ9MF0KICAgKiAgIERlbGV0ZSBjb3VudCAoZGVmYXVsdDogYDBgKTsKICAgKiAgIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGRlbGV0ZSwgc3RhcnRpbmcgZnJvbSBzdGFydC4KICAgKiBAcGFyYW0ge0FycmF5PFQ+IHwgbnVsbCB8IHVuZGVmaW5lZH0gW2l0ZW1zPVtdXQogICAqICAgSXRlbXMgdG8gaW5jbHVkZSBpbiBwbGFjZSBvZiB0aGUgZGVsZXRlZCBpdGVtcyAoZGVmYXVsdDogYFtdYCkuCiAgICogQHJldHVybiB7QXJyYXk8VD59CiAgICogICBBbnkgcmVtb3ZlZCBpdGVtcy4KICAgKi8KICBzcGxpY2Uoc3RhcnQsIGRlbGV0ZUNvdW50LCBpdGVtcykgewogICAgY29uc3QgY291bnQyID0gZGVsZXRlQ291bnQgfHwgMDsKICAgIHRoaXMuc2V0Q3Vyc29yKE1hdGgudHJ1bmMoc3RhcnQpKTsKICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLnJpZ2h0LnNwbGljZSh0aGlzLnJpZ2h0Lmxlbmd0aCAtIGNvdW50MiwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTsKICAgIGlmIChpdGVtcykgY2h1bmtlZFB1c2godGhpcy5sZWZ0LCBpdGVtcyk7CiAgICByZXR1cm4gcmVtb3ZlZC5yZXZlcnNlKCk7CiAgfQogIC8qKgogICAqIFJlbW92ZSBhbmQgcmV0dXJuIHRoZSBoaWdoZXN0LW51bWJlcmVkIGl0ZW0gaW4gdGhlIGFycmF5LCBzbwogICAqIGBsaXN0W2xpc3QubGVuZ3RoIC0gMV1gOwogICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gYGxlbmd0aGAuCiAgICoKICAgKiBAcmV0dXJucyB7VCB8IHVuZGVmaW5lZH0KICAgKiAgIEl0ZW0sIG9wdGlvbmFsLgogICAqLwogIHBvcCgpIHsKICAgIHRoaXMuc2V0Q3Vyc29yKE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7CiAgICByZXR1cm4gdGhpcy5sZWZ0LnBvcCgpOwogIH0KICAvKioKICAgKiBJbnNlcnRzIGEgc2luZ2xlIGl0ZW0gdG8gdGhlIGhpZ2gtbnVtYmVyZWQgc2lkZSBvZiB0aGUgYXJyYXk7CiAgICogbW92ZXMgdGhlIGN1cnNvciB0byBgbGVuZ3RoYC4KICAgKgogICAqIEBwYXJhbSB7VH0gaXRlbQogICAqICAgSXRlbS4KICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfQogICAqICAgTm90aGluZy4KICAgKi8KICBwdXNoKGl0ZW0pIHsKICAgIHRoaXMuc2V0Q3Vyc29yKE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7CiAgICB0aGlzLmxlZnQucHVzaChpdGVtKTsKICB9CiAgLyoqCiAgICogSW5zZXJ0cyBtYW55IGl0ZW1zIHRvIHRoZSBoaWdoLW51bWJlcmVkIHNpZGUgb2YgdGhlIGFycmF5LgogICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gYGxlbmd0aGAuCiAgICoKICAgKiBAcGFyYW0ge0FycmF5PFQ+fSBpdGVtcwogICAqICAgSXRlbXMuCiAgICogQHJldHVybnMge3VuZGVmaW5lZH0KICAgKiAgIE5vdGhpbmcuCiAgICovCiAgcHVzaE1hbnkoaXRlbXMpIHsKICAgIHRoaXMuc2V0Q3Vyc29yKE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7CiAgICBjaHVua2VkUHVzaCh0aGlzLmxlZnQsIGl0ZW1zKTsKICB9CiAgLyoqCiAgICogSW5zZXJ0cyBhIHNpbmdsZSBpdGVtIHRvIHRoZSBsb3ctbnVtYmVyZWQgc2lkZSBvZiB0aGUgYXJyYXk7CiAgICogTW92ZXMgdGhlIGN1cnNvciB0byBgMGAuCiAgICoKICAgKiBAcGFyYW0ge1R9IGl0ZW0KICAgKiAgIEl0ZW0uCiAgICogQHJldHVybnMge3VuZGVmaW5lZH0KICAgKiAgIE5vdGhpbmcuCiAgICovCiAgdW5zaGlmdChpdGVtKSB7CiAgICB0aGlzLnNldEN1cnNvcigwKTsKICAgIHRoaXMucmlnaHQucHVzaChpdGVtKTsKICB9CiAgLyoqCiAgICogSW5zZXJ0cyBtYW55IGl0ZW1zIHRvIHRoZSBsb3ctbnVtYmVyZWQgc2lkZSBvZiB0aGUgYXJyYXk7CiAgICogbW92ZXMgdGhlIGN1cnNvciB0byBgMGAuCiAgICoKICAgKiBAcGFyYW0ge0FycmF5PFQ+fSBpdGVtcwogICAqICAgSXRlbXMuCiAgICogQHJldHVybnMge3VuZGVmaW5lZH0KICAgKiAgIE5vdGhpbmcuCiAgICovCiAgdW5zaGlmdE1hbnkoaXRlbXMpIHsKICAgIHRoaXMuc2V0Q3Vyc29yKDApOwogICAgY2h1bmtlZFB1c2godGhpcy5yaWdodCwgaXRlbXMucmV2ZXJzZSgpKTsKICB9CiAgLyoqCiAgICogTW92ZSB0aGUgY3Vyc29yIHRvIGEgc3BlY2lmaWMgcG9zaXRpb24gaW4gdGhlIGFycmF5LiBSZXF1aXJlcwogICAqIHRpbWUgcHJvcG9ydGlvbmFsIHRvIHRoZSBkaXN0YW5jZSBtb3ZlZC4KICAgKgogICAqIElmIGBuIDwgMGAsIHRoZSBjdXJzb3Igd2lsbCBlbmQgdXAgYXQgdGhlIGJlZ2lubmluZy4KICAgKiBJZiBgbiA+IGxlbmd0aGAsIHRoZSBjdXJzb3Igd2lsbCBlbmQgdXAgYXQgdGhlIGVuZC4KICAgKgogICAqIEBwYXJhbSB7bnVtYmVyfSBuCiAgICogICBQb3NpdGlvbi4KICAgKiBAcmV0dXJuIHt1bmRlZmluZWR9CiAgICogICBOb3RoaW5nLgogICAqLwogIHNldEN1cnNvcihuMTEpIHsKICAgIGlmIChuMTEgPT09IHRoaXMubGVmdC5sZW5ndGggfHwgbjExID4gdGhpcy5sZWZ0Lmxlbmd0aCAmJiB0aGlzLnJpZ2h0Lmxlbmd0aCA9PT0gMCB8fCBuMTEgPCAwICYmIHRoaXMubGVmdC5sZW5ndGggPT09IDApIHJldHVybjsKICAgIGlmIChuMTEgPCB0aGlzLmxlZnQubGVuZ3RoKSB7CiAgICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLmxlZnQuc3BsaWNlKG4xMSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTsKICAgICAgY2h1bmtlZFB1c2godGhpcy5yaWdodCwgcmVtb3ZlZC5yZXZlcnNlKCkpOwogICAgfSBlbHNlIHsKICAgICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMucmlnaHQuc3BsaWNlKHRoaXMubGVmdC5sZW5ndGggKyB0aGlzLnJpZ2h0Lmxlbmd0aCAtIG4xMSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTsKICAgICAgY2h1bmtlZFB1c2godGhpcy5sZWZ0LCByZW1vdmVkLnJldmVyc2UoKSk7CiAgICB9CiAgfQp9OwpmdW5jdGlvbiBjaHVua2VkUHVzaChsaXN0NSwgcmlnaHQpIHsKICBsZXQgY2h1bmtTdGFydCA9IDA7CiAgaWYgKHJpZ2h0Lmxlbmd0aCA8IDFlNCkgewogICAgbGlzdDUucHVzaCguLi5yaWdodCk7CiAgfSBlbHNlIHsKICAgIHdoaWxlIChjaHVua1N0YXJ0IDwgcmlnaHQubGVuZ3RoKSB7CiAgICAgIGxpc3Q1LnB1c2goLi4ucmlnaHQuc2xpY2UoY2h1bmtTdGFydCwgY2h1bmtTdGFydCArIDFlNCkpOwogICAgICBjaHVua1N0YXJ0ICs9IDFlNDsKICAgIH0KICB9Cn0KX19uYW1lKGNodW5rZWRQdXNoLCAiY2h1bmtlZFB1c2giKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstdXRpbC1zdWJ0b2tlbml6ZUAyLjEuMC9ub2RlX21vZHVsZXMvbWljcm9tYXJrLXV0aWwtc3VidG9rZW5pemUvaW5kZXguanMKZnVuY3Rpb24gc3VidG9rZW5pemUoZXZlbnRzQXJyYXkpIHsKICBjb25zdCBqdW1wcyA9IHt9OwogIGxldCBpbmRleDIgPSAtMTsKICBsZXQgZXZlbnQ7CiAgbGV0IGxpbmVJbmRleDsKICBsZXQgb3RoZXJJbmRleDsKICBsZXQgb3RoZXJFdmVudDsKICBsZXQgcGFyYW1ldGVyczsKICBsZXQgc3ViZXZlbnRzOwogIGxldCBtb3JlOwogIGNvbnN0IGV2ZW50cyA9IG5ldyBTcGxpY2VCdWZmZXIoZXZlbnRzQXJyYXkpOwogIHdoaWxlICgrK2luZGV4MiA8IGV2ZW50cy5sZW5ndGgpIHsKICAgIHdoaWxlIChpbmRleDIgaW4ganVtcHMpIHsKICAgICAgaW5kZXgyID0ganVtcHNbaW5kZXgyXTsKICAgIH0KICAgIGV2ZW50ID0gZXZlbnRzLmdldChpbmRleDIpOwogICAgaWYgKGluZGV4MiAmJiBldmVudFsxXS50eXBlID09PSAiY2h1bmtGbG93IiAmJiBldmVudHMuZ2V0KGluZGV4MiAtIDEpWzFdLnR5cGUgPT09ICJsaXN0SXRlbVByZWZpeCIpIHsKICAgICAgc3ViZXZlbnRzID0gZXZlbnRbMV0uX3Rva2VuaXplci5ldmVudHM7CiAgICAgIG90aGVySW5kZXggPSAwOwogICAgICBpZiAob3RoZXJJbmRleCA8IHN1YmV2ZW50cy5sZW5ndGggJiYgc3ViZXZlbnRzW290aGVySW5kZXhdWzFdLnR5cGUgPT09ICJsaW5lRW5kaW5nQmxhbmsiKSB7CiAgICAgICAgb3RoZXJJbmRleCArPSAyOwogICAgICB9CiAgICAgIGlmIChvdGhlckluZGV4IDwgc3ViZXZlbnRzLmxlbmd0aCAmJiBzdWJldmVudHNbb3RoZXJJbmRleF1bMV0udHlwZSA9PT0gImNvbnRlbnQiKSB7CiAgICAgICAgd2hpbGUgKCsrb3RoZXJJbmRleCA8IHN1YmV2ZW50cy5sZW5ndGgpIHsKICAgICAgICAgIGlmIChzdWJldmVudHNbb3RoZXJJbmRleF1bMV0udHlwZSA9PT0gImNvbnRlbnQiKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHN1YmV2ZW50c1tvdGhlckluZGV4XVsxXS50eXBlID09PSAiY2h1bmtUZXh0IikgewogICAgICAgICAgICBzdWJldmVudHNbb3RoZXJJbmRleF1bMV0uX2lzSW5GaXJzdENvbnRlbnRPZkxpc3RJdGVtID0gdHJ1ZTsKICAgICAgICAgICAgb3RoZXJJbmRleCsrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGV2ZW50WzBdID09PSAiZW50ZXIiKSB7CiAgICAgIGlmIChldmVudFsxXS5jb250ZW50VHlwZSkgewogICAgICAgIE9iamVjdC5hc3NpZ24oanVtcHMsIHN1YmNvbnRlbnQoZXZlbnRzLCBpbmRleDIpKTsKICAgICAgICBpbmRleDIgPSBqdW1wc1tpbmRleDJdOwogICAgICAgIG1vcmUgPSB0cnVlOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGV2ZW50WzFdLl9jb250YWluZXIpIHsKICAgICAgb3RoZXJJbmRleCA9IGluZGV4MjsKICAgICAgbGluZUluZGV4ID0gdm9pZCAwOwogICAgICB3aGlsZSAob3RoZXJJbmRleC0tKSB7CiAgICAgICAgb3RoZXJFdmVudCA9IGV2ZW50cy5nZXQob3RoZXJJbmRleCk7CiAgICAgICAgaWYgKG90aGVyRXZlbnRbMV0udHlwZSA9PT0gImxpbmVFbmRpbmciIHx8IG90aGVyRXZlbnRbMV0udHlwZSA9PT0gImxpbmVFbmRpbmdCbGFuayIpIHsKICAgICAgICAgIGlmIChvdGhlckV2ZW50WzBdID09PSAiZW50ZXIiKSB7CiAgICAgICAgICAgIGlmIChsaW5lSW5kZXgpIHsKICAgICAgICAgICAgICBldmVudHMuZ2V0KGxpbmVJbmRleClbMV0udHlwZSA9ICJsaW5lRW5kaW5nQmxhbmsiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG90aGVyRXZlbnRbMV0udHlwZSA9ICJsaW5lRW5kaW5nIjsKICAgICAgICAgICAgbGluZUluZGV4ID0gb3RoZXJJbmRleDsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKG90aGVyRXZlbnRbMV0udHlwZSA9PT0gImxpbmVQcmVmaXgiIHx8IG90aGVyRXZlbnRbMV0udHlwZSA9PT0gImxpc3RJdGVtSW5kZW50IikgewogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGxpbmVJbmRleCkgewogICAgICAgIGV2ZW50WzFdLmVuZCA9IHsKICAgICAgICAgIC4uLmV2ZW50cy5nZXQobGluZUluZGV4KVsxXS5zdGFydAogICAgICAgIH07CiAgICAgICAgcGFyYW1ldGVycyA9IGV2ZW50cy5zbGljZShsaW5lSW5kZXgsIGluZGV4Mik7CiAgICAgICAgcGFyYW1ldGVycy51bnNoaWZ0KGV2ZW50KTsKICAgICAgICBldmVudHMuc3BsaWNlKGxpbmVJbmRleCwgaW5kZXgyIC0gbGluZUluZGV4ICsgMSwgcGFyYW1ldGVycyk7CiAgICAgIH0KICAgIH0KICB9CiAgc3BsaWNlKGV2ZW50c0FycmF5LCAwLCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksIGV2ZW50cy5zbGljZSgwKSk7CiAgcmV0dXJuICFtb3JlOwp9Cl9fbmFtZShzdWJ0b2tlbml6ZSwgInN1YnRva2VuaXplIik7CmZ1bmN0aW9uIHN1YmNvbnRlbnQoZXZlbnRzLCBldmVudEluZGV4KSB7CiAgY29uc3QgdG9rZW4gPSBldmVudHMuZ2V0KGV2ZW50SW5kZXgpWzFdOwogIGNvbnN0IGNvbnRleHQyID0gZXZlbnRzLmdldChldmVudEluZGV4KVsyXTsKICBsZXQgc3RhcnRQb3NpdGlvbiA9IGV2ZW50SW5kZXggLSAxOwogIGNvbnN0IHN0YXJ0UG9zaXRpb25zID0gW107CiAgbGV0IHRva2VuaXplciA9IHRva2VuLl90b2tlbml6ZXI7CiAgaWYgKCF0b2tlbml6ZXIpIHsKICAgIHRva2VuaXplciA9IGNvbnRleHQyLnBhcnNlclt0b2tlbi5jb250ZW50VHlwZV0odG9rZW4uc3RhcnQpOwogICAgaWYgKHRva2VuLl9jb250ZW50VHlwZVRleHRUcmFpbGluZykgewogICAgICB0b2tlbml6ZXIuX2NvbnRlbnRUeXBlVGV4dFRyYWlsaW5nID0gdHJ1ZTsKICAgIH0KICB9CiAgY29uc3QgY2hpbGRFdmVudHMgPSB0b2tlbml6ZXIuZXZlbnRzOwogIGNvbnN0IGp1bXBzID0gW107CiAgY29uc3QgZ2FwcyA9IHt9OwogIGxldCBzdHJlYW07CiAgbGV0IHByZXZpb3VzMzsKICBsZXQgaW5kZXgyID0gLTE7CiAgbGV0IGN1cnJlbnQgPSB0b2tlbjsKICBsZXQgYWRqdXN0ID0gMDsKICBsZXQgc3RhcnQgPSAwOwogIGNvbnN0IGJyZWFrcyA9IFtzdGFydF07CiAgd2hpbGUgKGN1cnJlbnQpIHsKICAgIHdoaWxlIChldmVudHMuZ2V0KCsrc3RhcnRQb3NpdGlvbilbMV0gIT09IGN1cnJlbnQpIHsKICAgIH0KICAgIHN0YXJ0UG9zaXRpb25zLnB1c2goc3RhcnRQb3NpdGlvbik7CiAgICBpZiAoIWN1cnJlbnQuX3Rva2VuaXplcikgewogICAgICBzdHJlYW0gPSBjb250ZXh0Mi5zbGljZVN0cmVhbShjdXJyZW50KTsKICAgICAgaWYgKCFjdXJyZW50Lm5leHQpIHsKICAgICAgICBzdHJlYW0ucHVzaChudWxsKTsKICAgICAgfQogICAgICBpZiAocHJldmlvdXMzKSB7CiAgICAgICAgdG9rZW5pemVyLmRlZmluZVNraXAoY3VycmVudC5zdGFydCk7CiAgICAgIH0KICAgICAgaWYgKGN1cnJlbnQuX2lzSW5GaXJzdENvbnRlbnRPZkxpc3RJdGVtKSB7CiAgICAgICAgdG9rZW5pemVyLl9nZm1UYXNrbGlzdEZpcnN0Q29udGVudE9mTGlzdEl0ZW0gPSB0cnVlOwogICAgICB9CiAgICAgIHRva2VuaXplci53cml0ZShzdHJlYW0pOwogICAgICBpZiAoY3VycmVudC5faXNJbkZpcnN0Q29udGVudE9mTGlzdEl0ZW0pIHsKICAgICAgICB0b2tlbml6ZXIuX2dmbVRhc2tsaXN0Rmlyc3RDb250ZW50T2ZMaXN0SXRlbSA9IHZvaWQgMDsKICAgICAgfQogICAgfQogICAgcHJldmlvdXMzID0gY3VycmVudDsKICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7CiAgfQogIGN1cnJlbnQgPSB0b2tlbjsKICB3aGlsZSAoKytpbmRleDIgPCBjaGlsZEV2ZW50cy5sZW5ndGgpIHsKICAgIGlmICgKICAgICAgLy8gRmluZCBhIHZvaWQgdG9rZW4gdGhhdCBpbmNsdWRlcyBhIGJyZWFrLgogICAgICBjaGlsZEV2ZW50c1tpbmRleDJdWzBdID09PSAiZXhpdCIgJiYgY2hpbGRFdmVudHNbaW5kZXgyIC0gMV1bMF0gPT09ICJlbnRlciIgJiYgY2hpbGRFdmVudHNbaW5kZXgyXVsxXS50eXBlID09PSBjaGlsZEV2ZW50c1tpbmRleDIgLSAxXVsxXS50eXBlICYmIGNoaWxkRXZlbnRzW2luZGV4Ml1bMV0uc3RhcnQubGluZSAhPT0gY2hpbGRFdmVudHNbaW5kZXgyXVsxXS5lbmQubGluZQogICAgKSB7CiAgICAgIHN0YXJ0ID0gaW5kZXgyICsgMTsKICAgICAgYnJlYWtzLnB1c2goc3RhcnQpOwogICAgICBjdXJyZW50Ll90b2tlbml6ZXIgPSB2b2lkIDA7CiAgICAgIGN1cnJlbnQucHJldmlvdXMgPSB2b2lkIDA7CiAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7CiAgICB9CiAgfQogIHRva2VuaXplci5ldmVudHMgPSBbXTsKICBpZiAoY3VycmVudCkgewogICAgY3VycmVudC5fdG9rZW5pemVyID0gdm9pZCAwOwogICAgY3VycmVudC5wcmV2aW91cyA9IHZvaWQgMDsKICB9IGVsc2UgewogICAgYnJlYWtzLnBvcCgpOwogIH0KICBpbmRleDIgPSBicmVha3MubGVuZ3RoOwogIHdoaWxlIChpbmRleDItLSkgewogICAgY29uc3Qgc2xpY2UgPSBjaGlsZEV2ZW50cy5zbGljZShicmVha3NbaW5kZXgyXSwgYnJlYWtzW2luZGV4MiArIDFdKTsKICAgIGNvbnN0IHN0YXJ0MiA9IHN0YXJ0UG9zaXRpb25zLnBvcCgpOwogICAganVtcHMucHVzaChbc3RhcnQyLCBzdGFydDIgKyBzbGljZS5sZW5ndGggLSAxXSk7CiAgICBldmVudHMuc3BsaWNlKHN0YXJ0MiwgMiwgc2xpY2UpOwogIH0KICBqdW1wcy5yZXZlcnNlKCk7CiAgaW5kZXgyID0gLTE7CiAgd2hpbGUgKCsraW5kZXgyIDwganVtcHMubGVuZ3RoKSB7CiAgICBnYXBzW2FkanVzdCArIGp1bXBzW2luZGV4Ml1bMF1dID0gYWRqdXN0ICsganVtcHNbaW5kZXgyXVsxXTsKICAgIGFkanVzdCArPSBqdW1wc1tpbmRleDJdWzFdIC0ganVtcHNbaW5kZXgyXVswXSAtIDE7CiAgfQogIHJldHVybiBnYXBzOwp9Cl9fbmFtZShzdWJjb250ZW50LCAic3ViY29udGVudCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2NvbnRlbnQuanMKdmFyIGNvbnRlbnQgPSB7CiAgcmVzb2x2ZTogcmVzb2x2ZUNvbnRlbnQsCiAgdG9rZW5pemU6IHRva2VuaXplQ29udGVudAp9Owp2YXIgY29udGludWF0aW9uQ29uc3RydWN0ID0gewogIHBhcnRpYWw6IHRydWUsCiAgdG9rZW5pemU6IHRva2VuaXplQ29udGludWF0aW9uCn07CmZ1bmN0aW9uIHJlc29sdmVDb250ZW50KGV2ZW50cykgewogIHN1YnRva2VuaXplKGV2ZW50cyk7CiAgcmV0dXJuIGV2ZW50czsKfQpfX25hbWUocmVzb2x2ZUNvbnRlbnQsICJyZXNvbHZlQ29udGVudCIpOwpmdW5jdGlvbiB0b2tlbml6ZUNvbnRlbnQoZWZmZWN0cywgb2szKSB7CiAgbGV0IHByZXZpb3VzMzsKICByZXR1cm4gY2h1bmtTdGFydDsKICBmdW5jdGlvbiBjaHVua1N0YXJ0KGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJjb250ZW50Iik7CiAgICBwcmV2aW91czMgPSBlZmZlY3RzLmVudGVyKCJjaHVua0NvbnRlbnQiLCB7CiAgICAgIGNvbnRlbnRUeXBlOiAiY29udGVudCIKICAgIH0pOwogICAgcmV0dXJuIGNodW5rSW5zaWRlKGNvZGU0KTsKICB9CiAgX19uYW1lKGNodW5rU3RhcnQsICJjaHVua1N0YXJ0Iik7CiAgZnVuY3Rpb24gY2h1bmtJbnNpZGUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCkgewogICAgICByZXR1cm4gY29udGVudEVuZChjb2RlNCk7CiAgICB9CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICByZXR1cm4gZWZmZWN0cy5jaGVjayhjb250aW51YXRpb25Db25zdHJ1Y3QsIGNvbnRlbnRDb250aW51ZSwgY29udGVudEVuZCkoY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBjaHVua0luc2lkZTsKICB9CiAgX19uYW1lKGNodW5rSW5zaWRlLCAiY2h1bmtJbnNpZGUiKTsKICBmdW5jdGlvbiBjb250ZW50RW5kKGNvZGU0KSB7CiAgICBlZmZlY3RzLmV4aXQoImNodW5rQ29udGVudCIpOwogICAgZWZmZWN0cy5leGl0KCJjb250ZW50Iik7CiAgICByZXR1cm4gb2szKGNvZGU0KTsKICB9CiAgX19uYW1lKGNvbnRlbnRFbmQsICJjb250ZW50RW5kIik7CiAgZnVuY3Rpb24gY29udGVudENvbnRpbnVlKGNvZGU0KSB7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgZWZmZWN0cy5leGl0KCJjaHVua0NvbnRlbnQiKTsKICAgIHByZXZpb3VzMy5uZXh0ID0gZWZmZWN0cy5lbnRlcigiY2h1bmtDb250ZW50IiwgewogICAgICBjb250ZW50VHlwZTogImNvbnRlbnQiLAogICAgICBwcmV2aW91czogcHJldmlvdXMzCiAgICB9KTsKICAgIHByZXZpb3VzMyA9IHByZXZpb3VzMy5uZXh0OwogICAgcmV0dXJuIGNodW5rSW5zaWRlOwogIH0KICBfX25hbWUoY29udGVudENvbnRpbnVlLCAiY29udGVudENvbnRpbnVlIik7Cn0KX19uYW1lKHRva2VuaXplQ29udGVudCwgInRva2VuaXplQ29udGVudCIpOwpmdW5jdGlvbiB0b2tlbml6ZUNvbnRpbnVhdGlvbihlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICByZXR1cm4gc3RhcnRMb29rYWhlYWQ7CiAgZnVuY3Rpb24gc3RhcnRMb29rYWhlYWQoY29kZTQpIHsKICAgIGVmZmVjdHMuZXhpdCgiY2h1bmtDb250ZW50Iik7CiAgICBlZmZlY3RzLmVudGVyKCJsaW5lRW5kaW5nIik7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgZWZmZWN0cy5leGl0KCJsaW5lRW5kaW5nIik7CiAgICByZXR1cm4gZmFjdG9yeVNwYWNlKGVmZmVjdHMsIHByZWZpeGVkLCAibGluZVByZWZpeCIpOwogIH0KICBfX25hbWUoc3RhcnRMb29rYWhlYWQsICJzdGFydExvb2thaGVhZCIpOwogIGZ1bmN0aW9uIHByZWZpeGVkKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIGNvbnN0IHRhaWwgPSBzZWxmMi5ldmVudHNbc2VsZjIuZXZlbnRzLmxlbmd0aCAtIDFdOwogICAgaWYgKCFzZWxmMi5wYXJzZXIuY29uc3RydWN0cy5kaXNhYmxlLm51bGwuaW5jbHVkZXMoImNvZGVJbmRlbnRlZCIpICYmIHRhaWwgJiYgdGFpbFsxXS50eXBlID09PSAibGluZVByZWZpeCIgJiYgdGFpbFsyXS5zbGljZVNlcmlhbGl6ZSh0YWlsWzFdLCB0cnVlKS5sZW5ndGggPj0gNCkgewogICAgICByZXR1cm4gb2szKGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBlZmZlY3RzLmludGVycnVwdChzZWxmMi5wYXJzZXIuY29uc3RydWN0cy5mbG93LCBub2ssIG9rMykoY29kZTQpOwogIH0KICBfX25hbWUocHJlZml4ZWQsICJwcmVmaXhlZCIpOwp9Cl9fbmFtZSh0b2tlbml6ZUNvbnRpbnVhdGlvbiwgInRva2VuaXplQ29udGludWF0aW9uIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWZhY3RvcnktZGVzdGluYXRpb25AMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1mYWN0b3J5LWRlc3RpbmF0aW9uL2luZGV4LmpzCmZ1bmN0aW9uIGZhY3RvcnlEZXN0aW5hdGlvbihlZmZlY3RzLCBvazMsIG5vaywgdHlwZTUsIGxpdGVyYWxUeXBlLCBsaXRlcmFsTWFya2VyVHlwZSwgcmF3VHlwZSwgc3RyaW5nVHlwZSwgbWF4MykgewogIGNvbnN0IGxpbWl0ID0gbWF4MyB8fCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7CiAgbGV0IGJhbGFuY2UgPSAwOwogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA2MCkgewogICAgICBlZmZlY3RzLmVudGVyKHR5cGU1KTsKICAgICAgZWZmZWN0cy5lbnRlcihsaXRlcmFsVHlwZSk7CiAgICAgIGVmZmVjdHMuZW50ZXIobGl0ZXJhbE1hcmtlclR5cGUpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQobGl0ZXJhbE1hcmtlclR5cGUpOwogICAgICByZXR1cm4gZW5jbG9zZWRCZWZvcmU7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgY29kZTQgPT09IDMyIHx8IGNvZGU0ID09PSA0MSB8fCBhc2NpaUNvbnRyb2woY29kZTQpKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5lbnRlcih0eXBlNSk7CiAgICBlZmZlY3RzLmVudGVyKHJhd1R5cGUpOwogICAgZWZmZWN0cy5lbnRlcihzdHJpbmdUeXBlKTsKICAgIGVmZmVjdHMuZW50ZXIoImNodW5rU3RyaW5nIiwgewogICAgICBjb250ZW50VHlwZTogInN0cmluZyIKICAgIH0pOwogICAgcmV0dXJuIHJhdzIoY29kZTQpOwogIH0KICBfX25hbWUoc3RhcnQsICJzdGFydCIpOwogIGZ1bmN0aW9uIGVuY2xvc2VkQmVmb3JlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDYyKSB7CiAgICAgIGVmZmVjdHMuZW50ZXIobGl0ZXJhbE1hcmtlclR5cGUpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQobGl0ZXJhbE1hcmtlclR5cGUpOwogICAgICBlZmZlY3RzLmV4aXQobGl0ZXJhbFR5cGUpOwogICAgICBlZmZlY3RzLmV4aXQodHlwZTUpOwogICAgICByZXR1cm4gb2szOwogICAgfQogICAgZWZmZWN0cy5lbnRlcihzdHJpbmdUeXBlKTsKICAgIGVmZmVjdHMuZW50ZXIoImNodW5rU3RyaW5nIiwgewogICAgICBjb250ZW50VHlwZTogInN0cmluZyIKICAgIH0pOwogICAgcmV0dXJuIGVuY2xvc2VkKGNvZGU0KTsKICB9CiAgX19uYW1lKGVuY2xvc2VkQmVmb3JlLCAiZW5jbG9zZWRCZWZvcmUiKTsKICBmdW5jdGlvbiBlbmNsb3NlZChjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA2MikgewogICAgICBlZmZlY3RzLmV4aXQoImNodW5rU3RyaW5nIik7CiAgICAgIGVmZmVjdHMuZXhpdChzdHJpbmdUeXBlKTsKICAgICAgcmV0dXJuIGVuY2xvc2VkQmVmb3JlKGNvZGU0KTsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBjb2RlNCA9PT0gNjAgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gY29kZTQgPT09IDkyID8gZW5jbG9zZWRFc2NhcGUgOiBlbmNsb3NlZDsKICB9CiAgX19uYW1lKGVuY2xvc2VkLCAiZW5jbG9zZWQiKTsKICBmdW5jdGlvbiBlbmNsb3NlZEVzY2FwZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA2MCB8fCBjb2RlNCA9PT0gNjIgfHwgY29kZTQgPT09IDkyKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBlbmNsb3NlZDsKICAgIH0KICAgIHJldHVybiBlbmNsb3NlZChjb2RlNCk7CiAgfQogIF9fbmFtZShlbmNsb3NlZEVzY2FwZSwgImVuY2xvc2VkRXNjYXBlIik7CiAgZnVuY3Rpb24gcmF3Mihjb2RlNCkgewogICAgaWYgKCFiYWxhbmNlICYmIChjb2RlNCA9PT0gbnVsbCB8fCBjb2RlNCA9PT0gNDEgfHwgbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlNCkpKSB7CiAgICAgIGVmZmVjdHMuZXhpdCgiY2h1bmtTdHJpbmciKTsKICAgICAgZWZmZWN0cy5leGl0KHN0cmluZ1R5cGUpOwogICAgICBlZmZlY3RzLmV4aXQocmF3VHlwZSk7CiAgICAgIGVmZmVjdHMuZXhpdCh0eXBlNSk7CiAgICAgIHJldHVybiBvazMoY29kZTQpOwogICAgfQogICAgaWYgKGJhbGFuY2UgPCBsaW1pdCAmJiBjb2RlNCA9PT0gNDApIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgYmFsYW5jZSsrOwogICAgICByZXR1cm4gcmF3MjsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gNDEpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgYmFsYW5jZS0tOwogICAgICByZXR1cm4gcmF3MjsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBjb2RlNCA9PT0gMzIgfHwgY29kZTQgPT09IDQwIHx8IGFzY2lpQ29udHJvbChjb2RlNCkpIHsKICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIGNvZGU0ID09PSA5MiA/IHJhd0VzY2FwZSA6IHJhdzI7CiAgfQogIF9fbmFtZShyYXcyLCAicmF3Iik7CiAgZnVuY3Rpb24gcmF3RXNjYXBlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDQwIHx8IGNvZGU0ID09PSA0MSB8fCBjb2RlNCA9PT0gOTIpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHJhdzI7CiAgICB9CiAgICByZXR1cm4gcmF3Mihjb2RlNCk7CiAgfQogIF9fbmFtZShyYXdFc2NhcGUsICJyYXdFc2NhcGUiKTsKfQpfX25hbWUoZmFjdG9yeURlc3RpbmF0aW9uLCAiZmFjdG9yeURlc3RpbmF0aW9uIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWZhY3RvcnktbGFiZWxAMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1mYWN0b3J5LWxhYmVsL2luZGV4LmpzCmZ1bmN0aW9uIGZhY3RvcnlMYWJlbChlZmZlY3RzLCBvazMsIG5vaywgdHlwZTUsIG1hcmtlclR5cGUsIHN0cmluZ1R5cGUpIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgbGV0IHNpemUgPSAwOwogIGxldCBzZWVuOwogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcih0eXBlNSk7CiAgICBlZmZlY3RzLmVudGVyKG1hcmtlclR5cGUpOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIGVmZmVjdHMuZXhpdChtYXJrZXJUeXBlKTsKICAgIGVmZmVjdHMuZW50ZXIoc3RyaW5nVHlwZSk7CiAgICByZXR1cm4gYXRCcmVhazsKICB9CiAgX19uYW1lKHN0YXJ0LCAic3RhcnQiKTsKICBmdW5jdGlvbiBhdEJyZWFrKGNvZGU0KSB7CiAgICBpZiAoc2l6ZSA+IDk5OSB8fCBjb2RlNCA9PT0gbnVsbCB8fCBjb2RlNCA9PT0gOTEgfHwgY29kZTQgPT09IDkzICYmICFzZWVuIHx8IC8vIFRvIGRvOiByZW1vdmUgaW4gdGhlIGZ1dHVyZSBvbmNlIHdl4oCZdmUgc3dpdGNoZWQgZnJvbQogICAgLy8gYG1pY3JvbWFyay1leHRlbnNpb24tZm9vdG5vdGVgIHRvIGBtaWNyb21hcmstZXh0ZW5zaW9uLWdmbS1mb290bm90ZWAsCiAgICAvLyB3aGljaCBkb2VzbuKAmXQgbmVlZCB0aGlzLgogICAgLy8gSGlkZGVuIGZvb3Rub3RlcyBob29rLgogICAgLyogYzggaWdub3JlIG5leHQgMyAqLwogICAgY29kZTQgPT09IDk0ICYmICFzaXplICYmICJfaGlkZGVuRm9vdG5vdGVTdXBwb3J0IiBpbiBzZWxmMi5wYXJzZXIuY29uc3RydWN0cykgewogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gOTMpIHsKICAgICAgZWZmZWN0cy5leGl0KHN0cmluZ1R5cGUpOwogICAgICBlZmZlY3RzLmVudGVyKG1hcmtlclR5cGUpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQobWFya2VyVHlwZSk7CiAgICAgIGVmZmVjdHMuZXhpdCh0eXBlNSk7CiAgICAgIHJldHVybiBvazM7CiAgICB9CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmVudGVyKCJsaW5lRW5kaW5nIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgibGluZUVuZGluZyIpOwogICAgICByZXR1cm4gYXRCcmVhazsKICAgIH0KICAgIGVmZmVjdHMuZW50ZXIoImNodW5rU3RyaW5nIiwgewogICAgICBjb250ZW50VHlwZTogInN0cmluZyIKICAgIH0pOwogICAgcmV0dXJuIGxhYmVsSW5zaWRlKGNvZGU0KTsKICB9CiAgX19uYW1lKGF0QnJlYWssICJhdEJyZWFrIik7CiAgZnVuY3Rpb24gbGFiZWxJbnNpZGUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBjb2RlNCA9PT0gOTEgfHwgY29kZTQgPT09IDkzIHx8IG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkgfHwgc2l6ZSsrID4gOTk5KSB7CiAgICAgIGVmZmVjdHMuZXhpdCgiY2h1bmtTdHJpbmciKTsKICAgICAgcmV0dXJuIGF0QnJlYWsoY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIGlmICghc2Vlbikgc2VlbiA9ICFtYXJrZG93blNwYWNlKGNvZGU0KTsKICAgIHJldHVybiBjb2RlNCA9PT0gOTIgPyBsYWJlbEVzY2FwZSA6IGxhYmVsSW5zaWRlOwogIH0KICBfX25hbWUobGFiZWxJbnNpZGUsICJsYWJlbEluc2lkZSIpOwogIGZ1bmN0aW9uIGxhYmVsRXNjYXBlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDkxIHx8IGNvZGU0ID09PSA5MiB8fCBjb2RlNCA9PT0gOTMpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgc2l6ZSsrOwogICAgICByZXR1cm4gbGFiZWxJbnNpZGU7CiAgICB9CiAgICByZXR1cm4gbGFiZWxJbnNpZGUoY29kZTQpOwogIH0KICBfX25hbWUobGFiZWxFc2NhcGUsICJsYWJlbEVzY2FwZSIpOwp9Cl9fbmFtZShmYWN0b3J5TGFiZWwsICJmYWN0b3J5TGFiZWwiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZmFjdG9yeS10aXRsZUAyLjAuMS9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWZhY3RvcnktdGl0bGUvaW5kZXguanMKZnVuY3Rpb24gZmFjdG9yeVRpdGxlKGVmZmVjdHMsIG9rMywgbm9rLCB0eXBlNSwgbWFya2VyVHlwZSwgc3RyaW5nVHlwZSkgewogIGxldCBtYXJrZXI7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDM0IHx8IGNvZGU0ID09PSAzOSB8fCBjb2RlNCA9PT0gNDApIHsKICAgICAgZWZmZWN0cy5lbnRlcih0eXBlNSk7CiAgICAgIGVmZmVjdHMuZW50ZXIobWFya2VyVHlwZSk7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdChtYXJrZXJUeXBlKTsKICAgICAgbWFya2VyID0gY29kZTQgPT09IDQwID8gNDEgOiBjb2RlNDsKICAgICAgcmV0dXJuIGJlZ2luOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZShzdGFydCwgInN0YXJ0Iik7CiAgZnVuY3Rpb24gYmVnaW4oY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbWFya2VyKSB7CiAgICAgIGVmZmVjdHMuZW50ZXIobWFya2VyVHlwZSk7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdChtYXJrZXJUeXBlKTsKICAgICAgZWZmZWN0cy5leGl0KHR5cGU1KTsKICAgICAgcmV0dXJuIG9rMzsKICAgIH0KICAgIGVmZmVjdHMuZW50ZXIoc3RyaW5nVHlwZSk7CiAgICByZXR1cm4gYXRCcmVhayhjb2RlNCk7CiAgfQogIF9fbmFtZShiZWdpbiwgImJlZ2luIik7CiAgZnVuY3Rpb24gYXRCcmVhayhjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBtYXJrZXIpIHsKICAgICAgZWZmZWN0cy5leGl0KHN0cmluZ1R5cGUpOwogICAgICByZXR1cm4gYmVnaW4obWFya2VyKTsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gbnVsbCkgewogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuZW50ZXIoImxpbmVFbmRpbmciKTsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgZWZmZWN0cy5leGl0KCJsaW5lRW5kaW5nIik7CiAgICAgIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgYXRCcmVhaywgImxpbmVQcmVmaXgiKTsKICAgIH0KICAgIGVmZmVjdHMuZW50ZXIoImNodW5rU3RyaW5nIiwgewogICAgICBjb250ZW50VHlwZTogInN0cmluZyIKICAgIH0pOwogICAgcmV0dXJuIGluc2lkZShjb2RlNCk7CiAgfQogIF9fbmFtZShhdEJyZWFrLCAiYXRCcmVhayIpOwogIGZ1bmN0aW9uIGluc2lkZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBtYXJrZXIgfHwgY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmV4aXQoImNodW5rU3RyaW5nIik7CiAgICAgIHJldHVybiBhdEJyZWFrKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gY29kZTQgPT09IDkyID8gZXNjYXBlIDogaW5zaWRlOwogIH0KICBfX25hbWUoaW5zaWRlLCAiaW5zaWRlIik7CiAgZnVuY3Rpb24gZXNjYXBlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG1hcmtlciB8fCBjb2RlNCA9PT0gOTIpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGluc2lkZTsKICAgIH0KICAgIHJldHVybiBpbnNpZGUoY29kZTQpOwogIH0KICBfX25hbWUoZXNjYXBlLCAiZXNjYXBlIik7Cn0KX19uYW1lKGZhY3RvcnlUaXRsZSwgImZhY3RvcnlUaXRsZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1mYWN0b3J5LXdoaXRlc3BhY2VAMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1mYWN0b3J5LXdoaXRlc3BhY2UvaW5kZXguanMKZnVuY3Rpb24gZmFjdG9yeVdoaXRlc3BhY2UoZWZmZWN0cywgb2szKSB7CiAgbGV0IHNlZW47CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmVudGVyKCJsaW5lRW5kaW5nIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgibGluZUVuZGluZyIpOwogICAgICBzZWVuID0gdHJ1ZTsKICAgICAgcmV0dXJuIHN0YXJ0OwogICAgfQogICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZTQpKSB7CiAgICAgIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgc3RhcnQsIHNlZW4gPyAibGluZVByZWZpeCIgOiAibGluZVN1ZmZpeCIpKGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBvazMoY29kZTQpOwogIH0KICBfX25hbWUoc3RhcnQsICJzdGFydCIpOwp9Cl9fbmFtZShmYWN0b3J5V2hpdGVzcGFjZSwgImZhY3RvcnlXaGl0ZXNwYWNlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvZGVmaW5pdGlvbi5qcwp2YXIgZGVmaW5pdGlvbjIgPSB7CiAgbmFtZTogImRlZmluaXRpb24iLAogIHRva2VuaXplOiB0b2tlbml6ZURlZmluaXRpb24KfTsKdmFyIHRpdGxlQmVmb3JlID0gewogIHBhcnRpYWw6IHRydWUsCiAgdG9rZW5pemU6IHRva2VuaXplVGl0bGVCZWZvcmUKfTsKZnVuY3Rpb24gdG9rZW5pemVEZWZpbml0aW9uKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIGxldCBpZGVudGlmaWVyOwogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigiZGVmaW5pdGlvbiIpOwogICAgcmV0dXJuIGJlZm9yZShjb2RlNCk7CiAgfQogIF9fbmFtZShzdGFydCwgInN0YXJ0Iik7CiAgZnVuY3Rpb24gYmVmb3JlKGNvZGU0KSB7CiAgICByZXR1cm4gZmFjdG9yeUxhYmVsLmNhbGwoCiAgICAgIHNlbGYyLAogICAgICBlZmZlY3RzLAogICAgICBsYWJlbEFmdGVyLAogICAgICAvLyBOb3RlOiB3ZSBkb27igJl0IG5lZWQgdG8gcmVzZXQgdGhlIHdheSBgbWFya2Rvd24tcnNgIGRvZXMuCiAgICAgIG5vaywKICAgICAgImRlZmluaXRpb25MYWJlbCIsCiAgICAgICJkZWZpbml0aW9uTGFiZWxNYXJrZXIiLAogICAgICAiZGVmaW5pdGlvbkxhYmVsU3RyaW5nIgogICAgKShjb2RlNCk7CiAgfQogIF9fbmFtZShiZWZvcmUsICJiZWZvcmUiKTsKICBmdW5jdGlvbiBsYWJlbEFmdGVyKGNvZGU0KSB7CiAgICBpZGVudGlmaWVyID0gbm9ybWFsaXplSWRlbnRpZmllcihzZWxmMi5zbGljZVNlcmlhbGl6ZShzZWxmMi5ldmVudHNbc2VsZjIuZXZlbnRzLmxlbmd0aCAtIDFdWzFdKS5zbGljZSgxLCAtMSkpOwogICAgaWYgKGNvZGU0ID09PSA1OCkgewogICAgICBlZmZlY3RzLmVudGVyKCJkZWZpbml0aW9uTWFya2VyIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgiZGVmaW5pdGlvbk1hcmtlciIpOwogICAgICByZXR1cm4gbWFya2VyQWZ0ZXI7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKGxhYmVsQWZ0ZXIsICJsYWJlbEFmdGVyIik7CiAgZnVuY3Rpb24gbWFya2VyQWZ0ZXIoY29kZTQpIHsKICAgIHJldHVybiBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlKGNvZGU0KSA/IGZhY3RvcnlXaGl0ZXNwYWNlKGVmZmVjdHMsIGRlc3RpbmF0aW9uQmVmb3JlKShjb2RlNCkgOiBkZXN0aW5hdGlvbkJlZm9yZShjb2RlNCk7CiAgfQogIF9fbmFtZShtYXJrZXJBZnRlciwgIm1hcmtlckFmdGVyIik7CiAgZnVuY3Rpb24gZGVzdGluYXRpb25CZWZvcmUoY29kZTQpIHsKICAgIHJldHVybiBmYWN0b3J5RGVzdGluYXRpb24oCiAgICAgIGVmZmVjdHMsCiAgICAgIGRlc3RpbmF0aW9uQWZ0ZXIsCiAgICAgIC8vIE5vdGU6IHdlIGRvbuKAmXQgbmVlZCB0byByZXNldCB0aGUgd2F5IGBtYXJrZG93bi1yc2AgZG9lcy4KICAgICAgbm9rLAogICAgICAiZGVmaW5pdGlvbkRlc3RpbmF0aW9uIiwKICAgICAgImRlZmluaXRpb25EZXN0aW5hdGlvbkxpdGVyYWwiLAogICAgICAiZGVmaW5pdGlvbkRlc3RpbmF0aW9uTGl0ZXJhbE1hcmtlciIsCiAgICAgICJkZWZpbml0aW9uRGVzdGluYXRpb25SYXciLAogICAgICAiZGVmaW5pdGlvbkRlc3RpbmF0aW9uU3RyaW5nIgogICAgKShjb2RlNCk7CiAgfQogIF9fbmFtZShkZXN0aW5hdGlvbkJlZm9yZSwgImRlc3RpbmF0aW9uQmVmb3JlIik7CiAgZnVuY3Rpb24gZGVzdGluYXRpb25BZnRlcihjb2RlNCkgewogICAgcmV0dXJuIGVmZmVjdHMuYXR0ZW1wdCh0aXRsZUJlZm9yZSwgYWZ0ZXIsIGFmdGVyKShjb2RlNCk7CiAgfQogIF9fbmFtZShkZXN0aW5hdGlvbkFmdGVyLCAiZGVzdGluYXRpb25BZnRlciIpOwogIGZ1bmN0aW9uIGFmdGVyKGNvZGU0KSB7CiAgICByZXR1cm4gbWFya2Rvd25TcGFjZShjb2RlNCkgPyBmYWN0b3J5U3BhY2UoZWZmZWN0cywgYWZ0ZXJXaGl0ZXNwYWNlLCAid2hpdGVzcGFjZSIpKGNvZGU0KSA6IGFmdGVyV2hpdGVzcGFjZShjb2RlNCk7CiAgfQogIF9fbmFtZShhZnRlciwgImFmdGVyIik7CiAgZnVuY3Rpb24gYWZ0ZXJXaGl0ZXNwYWNlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmV4aXQoImRlZmluaXRpb24iKTsKICAgICAgc2VsZjIucGFyc2VyLmRlZmluZWQucHVzaChpZGVudGlmaWVyKTsKICAgICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKGFmdGVyV2hpdGVzcGFjZSwgImFmdGVyV2hpdGVzcGFjZSIpOwp9Cl9fbmFtZSh0b2tlbml6ZURlZmluaXRpb24sICJ0b2tlbml6ZURlZmluaXRpb24iKTsKZnVuY3Rpb24gdG9rZW5pemVUaXRsZUJlZm9yZShlZmZlY3RzLCBvazMsIG5vaykgewogIHJldHVybiB0aXRsZUJlZm9yZTI7CiAgZnVuY3Rpb24gdGl0bGVCZWZvcmUyKGNvZGU0KSB7CiAgICByZXR1cm4gbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlNCkgPyBmYWN0b3J5V2hpdGVzcGFjZShlZmZlY3RzLCBiZWZvcmVNYXJrZXIpKGNvZGU0KSA6IG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZSh0aXRsZUJlZm9yZTIsICJ0aXRsZUJlZm9yZSIpOwogIGZ1bmN0aW9uIGJlZm9yZU1hcmtlcihjb2RlNCkgewogICAgcmV0dXJuIGZhY3RvcnlUaXRsZShlZmZlY3RzLCB0aXRsZUFmdGVyLCBub2ssICJkZWZpbml0aW9uVGl0bGUiLCAiZGVmaW5pdGlvblRpdGxlTWFya2VyIiwgImRlZmluaXRpb25UaXRsZVN0cmluZyIpKGNvZGU0KTsKICB9CiAgX19uYW1lKGJlZm9yZU1hcmtlciwgImJlZm9yZU1hcmtlciIpOwogIGZ1bmN0aW9uIHRpdGxlQWZ0ZXIoY29kZTQpIHsKICAgIHJldHVybiBtYXJrZG93blNwYWNlKGNvZGU0KSA/IGZhY3RvcnlTcGFjZShlZmZlY3RzLCB0aXRsZUFmdGVyT3B0aW9uYWxXaGl0ZXNwYWNlLCAid2hpdGVzcGFjZSIpKGNvZGU0KSA6IHRpdGxlQWZ0ZXJPcHRpb25hbFdoaXRlc3BhY2UoY29kZTQpOwogIH0KICBfX25hbWUodGl0bGVBZnRlciwgInRpdGxlQWZ0ZXIiKTsKICBmdW5jdGlvbiB0aXRsZUFmdGVyT3B0aW9uYWxXaGl0ZXNwYWNlKGNvZGU0KSB7CiAgICByZXR1cm4gY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSA/IG9rMyhjb2RlNCkgOiBub2soY29kZTQpOwogIH0KICBfX25hbWUodGl0bGVBZnRlck9wdGlvbmFsV2hpdGVzcGFjZSwgInRpdGxlQWZ0ZXJPcHRpb25hbFdoaXRlc3BhY2UiKTsKfQpfX25hbWUodG9rZW5pemVUaXRsZUJlZm9yZSwgInRva2VuaXplVGl0bGVCZWZvcmUiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstY29yZS1jb21tb25tYXJrQDIuMC4zL25vZGVfbW9kdWxlcy9taWNyb21hcmstY29yZS1jb21tb25tYXJrL2xpYi9oYXJkLWJyZWFrLWVzY2FwZS5qcwp2YXIgaGFyZEJyZWFrRXNjYXBlID0gewogIG5hbWU6ICJoYXJkQnJlYWtFc2NhcGUiLAogIHRva2VuaXplOiB0b2tlbml6ZUhhcmRCcmVha0VzY2FwZQp9OwpmdW5jdGlvbiB0b2tlbml6ZUhhcmRCcmVha0VzY2FwZShlZmZlY3RzLCBvazMsIG5vaykgewogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigiaGFyZEJyZWFrRXNjYXBlIik7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIGFmdGVyOwogIH0KICBfX25hbWUoc3RhcnQsICJzdGFydCIpOwogIGZ1bmN0aW9uIGFmdGVyKGNvZGU0KSB7CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmV4aXQoImhhcmRCcmVha0VzY2FwZSIpOwogICAgICByZXR1cm4gb2szKGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBfX25hbWUoYWZ0ZXIsICJhZnRlciIpOwp9Cl9fbmFtZSh0b2tlbml6ZUhhcmRCcmVha0VzY2FwZSwgInRva2VuaXplSGFyZEJyZWFrRXNjYXBlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvaGVhZGluZy1hdHguanMKdmFyIGhlYWRpbmdBdHggPSB7CiAgbmFtZTogImhlYWRpbmdBdHgiLAogIHJlc29sdmU6IHJlc29sdmVIZWFkaW5nQXR4LAogIHRva2VuaXplOiB0b2tlbml6ZUhlYWRpbmdBdHgKfTsKZnVuY3Rpb24gcmVzb2x2ZUhlYWRpbmdBdHgoZXZlbnRzLCBjb250ZXh0MikgewogIGxldCBjb250ZW50RW5kID0gZXZlbnRzLmxlbmd0aCAtIDI7CiAgbGV0IGNvbnRlbnRTdGFydCA9IDM7CiAgbGV0IGNvbnRlbnQzOwogIGxldCB0ZXh0ODsKICBpZiAoZXZlbnRzW2NvbnRlbnRTdGFydF1bMV0udHlwZSA9PT0gIndoaXRlc3BhY2UiKSB7CiAgICBjb250ZW50U3RhcnQgKz0gMjsKICB9CiAgaWYgKGNvbnRlbnRFbmQgLSAyID4gY29udGVudFN0YXJ0ICYmIGV2ZW50c1tjb250ZW50RW5kXVsxXS50eXBlID09PSAid2hpdGVzcGFjZSIpIHsKICAgIGNvbnRlbnRFbmQgLT0gMjsKICB9CiAgaWYgKGV2ZW50c1tjb250ZW50RW5kXVsxXS50eXBlID09PSAiYXR4SGVhZGluZ1NlcXVlbmNlIiAmJiAoY29udGVudFN0YXJ0ID09PSBjb250ZW50RW5kIC0gMSB8fCBjb250ZW50RW5kIC0gNCA+IGNvbnRlbnRTdGFydCAmJiBldmVudHNbY29udGVudEVuZCAtIDJdWzFdLnR5cGUgPT09ICJ3aGl0ZXNwYWNlIikpIHsKICAgIGNvbnRlbnRFbmQgLT0gY29udGVudFN0YXJ0ICsgMSA9PT0gY29udGVudEVuZCA/IDIgOiA0OwogIH0KICBpZiAoY29udGVudEVuZCA+IGNvbnRlbnRTdGFydCkgewogICAgY29udGVudDMgPSB7CiAgICAgIHR5cGU6ICJhdHhIZWFkaW5nVGV4dCIsCiAgICAgIHN0YXJ0OiBldmVudHNbY29udGVudFN0YXJ0XVsxXS5zdGFydCwKICAgICAgZW5kOiBldmVudHNbY29udGVudEVuZF1bMV0uZW5kCiAgICB9OwogICAgdGV4dDggPSB7CiAgICAgIHR5cGU6ICJjaHVua1RleHQiLAogICAgICBzdGFydDogZXZlbnRzW2NvbnRlbnRTdGFydF1bMV0uc3RhcnQsCiAgICAgIGVuZDogZXZlbnRzW2NvbnRlbnRFbmRdWzFdLmVuZCwKICAgICAgY29udGVudFR5cGU6ICJ0ZXh0IgogICAgfTsKICAgIHNwbGljZShldmVudHMsIGNvbnRlbnRTdGFydCwgY29udGVudEVuZCAtIGNvbnRlbnRTdGFydCArIDEsIFtbImVudGVyIiwgY29udGVudDMsIGNvbnRleHQyXSwgWyJlbnRlciIsIHRleHQ4LCBjb250ZXh0Ml0sIFsiZXhpdCIsIHRleHQ4LCBjb250ZXh0Ml0sIFsiZXhpdCIsIGNvbnRlbnQzLCBjb250ZXh0Ml1dKTsKICB9CiAgcmV0dXJuIGV2ZW50czsKfQpfX25hbWUocmVzb2x2ZUhlYWRpbmdBdHgsICJyZXNvbHZlSGVhZGluZ0F0eCIpOwpmdW5jdGlvbiB0b2tlbml6ZUhlYWRpbmdBdHgoZWZmZWN0cywgb2szLCBub2spIHsKICBsZXQgc2l6ZSA9IDA7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJhdHhIZWFkaW5nIik7CiAgICByZXR1cm4gYmVmb3JlKGNvZGU0KTsKICB9CiAgX19uYW1lKHN0YXJ0LCAic3RhcnQiKTsKICBmdW5jdGlvbiBiZWZvcmUoY29kZTQpIHsKICAgIGVmZmVjdHMuZW50ZXIoImF0eEhlYWRpbmdTZXF1ZW5jZSIpOwogICAgcmV0dXJuIHNlcXVlbmNlT3Blbihjb2RlNCk7CiAgfQogIF9fbmFtZShiZWZvcmUsICJiZWZvcmUiKTsKICBmdW5jdGlvbiBzZXF1ZW5jZU9wZW4oY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gMzUgJiYgc2l6ZSsrIDwgNikgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gc2VxdWVuY2VPcGVuOwogICAgfQogICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuZXhpdCgiYXR4SGVhZGluZ1NlcXVlbmNlIik7CiAgICAgIHJldHVybiBhdEJyZWFrKGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBfX25hbWUoc2VxdWVuY2VPcGVuLCAic2VxdWVuY2VPcGVuIik7CiAgZnVuY3Rpb24gYXRCcmVhayhjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSAzNSkgewogICAgICBlZmZlY3RzLmVudGVyKCJhdHhIZWFkaW5nU2VxdWVuY2UiKTsKICAgICAgcmV0dXJuIHNlcXVlbmNlRnVydGhlcihjb2RlNCk7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmV4aXQoImF0eEhlYWRpbmciKTsKICAgICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgICB9CiAgICBpZiAobWFya2Rvd25TcGFjZShjb2RlNCkpIHsKICAgICAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBhdEJyZWFrLCAid2hpdGVzcGFjZSIpKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuZW50ZXIoImF0eEhlYWRpbmdUZXh0Iik7CiAgICByZXR1cm4gZGF0YShjb2RlNCk7CiAgfQogIF9fbmFtZShhdEJyZWFrLCAiYXRCcmVhayIpOwogIGZ1bmN0aW9uIHNlcXVlbmNlRnVydGhlcihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSAzNSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gc2VxdWVuY2VGdXJ0aGVyOwogICAgfQogICAgZWZmZWN0cy5leGl0KCJhdHhIZWFkaW5nU2VxdWVuY2UiKTsKICAgIHJldHVybiBhdEJyZWFrKGNvZGU0KTsKICB9CiAgX19uYW1lKHNlcXVlbmNlRnVydGhlciwgInNlcXVlbmNlRnVydGhlciIpOwogIGZ1bmN0aW9uIGRhdGEoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBjb2RlNCA9PT0gMzUgfHwgbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5leGl0KCJhdHhIZWFkaW5nVGV4dCIpOwogICAgICByZXR1cm4gYXRCcmVhayhjb2RlNCk7CiAgICB9CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIGRhdGE7CiAgfQogIF9fbmFtZShkYXRhLCAiZGF0YSIpOwp9Cl9fbmFtZSh0b2tlbml6ZUhlYWRpbmdBdHgsICJ0b2tlbml6ZUhlYWRpbmdBdHgiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstdXRpbC1odG1sLXRhZy1uYW1lQDIuMC4xL25vZGVfbW9kdWxlcy9taWNyb21hcmstdXRpbC1odG1sLXRhZy1uYW1lL2luZGV4LmpzCnZhciBodG1sQmxvY2tOYW1lcyA9IFsKICAiYWRkcmVzcyIsCiAgImFydGljbGUiLAogICJhc2lkZSIsCiAgImJhc2UiLAogICJiYXNlZm9udCIsCiAgImJsb2NrcXVvdGUiLAogICJib2R5IiwKICAiY2FwdGlvbiIsCiAgImNlbnRlciIsCiAgImNvbCIsCiAgImNvbGdyb3VwIiwKICAiZGQiLAogICJkZXRhaWxzIiwKICAiZGlhbG9nIiwKICAiZGlyIiwKICAiZGl2IiwKICAiZGwiLAogICJkdCIsCiAgImZpZWxkc2V0IiwKICAiZmlnY2FwdGlvbiIsCiAgImZpZ3VyZSIsCiAgImZvb3RlciIsCiAgImZvcm0iLAogICJmcmFtZSIsCiAgImZyYW1lc2V0IiwKICAiaDEiLAogICJoMiIsCiAgImgzIiwKICAiaDQiLAogICJoNSIsCiAgImg2IiwKICAiaGVhZCIsCiAgImhlYWRlciIsCiAgImhyIiwKICAiaHRtbCIsCiAgImlmcmFtZSIsCiAgImxlZ2VuZCIsCiAgImxpIiwKICAibGluayIsCiAgIm1haW4iLAogICJtZW51IiwKICAibWVudWl0ZW0iLAogICJuYXYiLAogICJub2ZyYW1lcyIsCiAgIm9sIiwKICAib3B0Z3JvdXAiLAogICJvcHRpb24iLAogICJwIiwKICAicGFyYW0iLAogICJzZWFyY2giLAogICJzZWN0aW9uIiwKICAic3VtbWFyeSIsCiAgInRhYmxlIiwKICAidGJvZHkiLAogICJ0ZCIsCiAgInRmb290IiwKICAidGgiLAogICJ0aGVhZCIsCiAgInRpdGxlIiwKICAidHIiLAogICJ0cmFjayIsCiAgInVsIgpdOwp2YXIgaHRtbFJhd05hbWVzID0gWyJwcmUiLCAic2NyaXB0IiwgInN0eWxlIiwgInRleHRhcmVhIl07CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvaHRtbC1mbG93LmpzCnZhciBodG1sRmxvdyA9IHsKICBjb25jcmV0ZTogdHJ1ZSwKICBuYW1lOiAiaHRtbEZsb3ciLAogIHJlc29sdmVUbzogcmVzb2x2ZVRvSHRtbEZsb3csCiAgdG9rZW5pemU6IHRva2VuaXplSHRtbEZsb3cKfTsKdmFyIGJsYW5rTGluZUJlZm9yZSA9IHsKICBwYXJ0aWFsOiB0cnVlLAogIHRva2VuaXplOiB0b2tlbml6ZUJsYW5rTGluZUJlZm9yZQp9Owp2YXIgbm9uTGF6eUNvbnRpbnVhdGlvblN0YXJ0ID0gewogIHBhcnRpYWw6IHRydWUsCiAgdG9rZW5pemU6IHRva2VuaXplTm9uTGF6eUNvbnRpbnVhdGlvblN0YXJ0Cn07CmZ1bmN0aW9uIHJlc29sdmVUb0h0bWxGbG93KGV2ZW50cykgewogIGxldCBpbmRleDIgPSBldmVudHMubGVuZ3RoOwogIHdoaWxlIChpbmRleDItLSkgewogICAgaWYgKGV2ZW50c1tpbmRleDJdWzBdID09PSAiZW50ZXIiICYmIGV2ZW50c1tpbmRleDJdWzFdLnR5cGUgPT09ICJodG1sRmxvdyIpIHsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIGlmIChpbmRleDIgPiAxICYmIGV2ZW50c1tpbmRleDIgLSAyXVsxXS50eXBlID09PSAibGluZVByZWZpeCIpIHsKICAgIGV2ZW50c1tpbmRleDJdWzFdLnN0YXJ0ID0gZXZlbnRzW2luZGV4MiAtIDJdWzFdLnN0YXJ0OwogICAgZXZlbnRzW2luZGV4MiArIDFdWzFdLnN0YXJ0ID0gZXZlbnRzW2luZGV4MiAtIDJdWzFdLnN0YXJ0OwogICAgZXZlbnRzLnNwbGljZShpbmRleDIgLSAyLCAyKTsKICB9CiAgcmV0dXJuIGV2ZW50czsKfQpfX25hbWUocmVzb2x2ZVRvSHRtbEZsb3csICJyZXNvbHZlVG9IdG1sRmxvdyIpOwpmdW5jdGlvbiB0b2tlbml6ZUh0bWxGbG93KGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIGxldCBtYXJrZXI7CiAgbGV0IGNsb3NpbmdUYWc7CiAgbGV0IGJ1ZmZlcjI7CiAgbGV0IGluZGV4MjsKICBsZXQgbWFya2VyQjsKICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIHJldHVybiBiZWZvcmUoY29kZTQpOwogIH0KICBfX25hbWUoc3RhcnQsICJzdGFydCIpOwogIGZ1bmN0aW9uIGJlZm9yZShjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigiaHRtbEZsb3ciKTsKICAgIGVmZmVjdHMuZW50ZXIoImh0bWxGbG93RGF0YSIpOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBvcGVuOwogIH0KICBfX25hbWUoYmVmb3JlLCAiYmVmb3JlIik7CiAgZnVuY3Rpb24gb3Blbihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSAzMykgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gZGVjbGFyYXRpb25PcGVuOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA0NykgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBjbG9zaW5nVGFnID0gdHJ1ZTsKICAgICAgcmV0dXJuIHRhZ0Nsb3NlU3RhcnQ7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDYzKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIG1hcmtlciA9IDM7CiAgICAgIHJldHVybiBzZWxmMi5pbnRlcnJ1cHQgPyBvazMgOiBjb250aW51YXRpb25EZWNsYXJhdGlvbkluc2lkZTsKICAgIH0KICAgIGlmIChhc2NpaUFscGhhKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBidWZmZXIyID0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlNCk7CiAgICAgIHJldHVybiB0YWdOYW1lOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZShvcGVuLCAib3BlbiIpOwogIGZ1bmN0aW9uIGRlY2xhcmF0aW9uT3Blbihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0NSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBtYXJrZXIgPSAyOwogICAgICByZXR1cm4gY29tbWVudE9wZW5JbnNpZGU7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDkxKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIG1hcmtlciA9IDU7CiAgICAgIGluZGV4MiA9IDA7CiAgICAgIHJldHVybiBjZGF0YU9wZW5JbnNpZGU7CiAgICB9CiAgICBpZiAoYXNjaWlBbHBoYShjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgbWFya2VyID0gNDsKICAgICAgcmV0dXJuIHNlbGYyLmludGVycnVwdCA/IG9rMyA6IGNvbnRpbnVhdGlvbkRlY2xhcmF0aW9uSW5zaWRlOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZShkZWNsYXJhdGlvbk9wZW4sICJkZWNsYXJhdGlvbk9wZW4iKTsKICBmdW5jdGlvbiBjb21tZW50T3Blbkluc2lkZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0NSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gc2VsZjIuaW50ZXJydXB0ID8gb2szIDogY29udGludWF0aW9uRGVjbGFyYXRpb25JbnNpZGU7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKGNvbW1lbnRPcGVuSW5zaWRlLCAiY29tbWVudE9wZW5JbnNpZGUiKTsKICBmdW5jdGlvbiBjZGF0YU9wZW5JbnNpZGUoY29kZTQpIHsKICAgIGNvbnN0IHZhbHVlMiA9ICJDREFUQVsiOwogICAgaWYgKGNvZGU0ID09PSB2YWx1ZTIuY2hhckNvZGVBdChpbmRleDIrKykpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgaWYgKGluZGV4MiA9PT0gdmFsdWUyLmxlbmd0aCkgewogICAgICAgIHJldHVybiBzZWxmMi5pbnRlcnJ1cHQgPyBvazMgOiBjb250aW51YXRpb247CiAgICAgIH0KICAgICAgcmV0dXJuIGNkYXRhT3Blbkluc2lkZTsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBfX25hbWUoY2RhdGFPcGVuSW5zaWRlLCAiY2RhdGFPcGVuSW5zaWRlIik7CiAgZnVuY3Rpb24gdGFnQ2xvc2VTdGFydChjb2RlNCkgewogICAgaWYgKGFzY2lpQWxwaGEoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGJ1ZmZlcjIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGU0KTsKICAgICAgcmV0dXJuIHRhZ05hbWU7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKHRhZ0Nsb3NlU3RhcnQsICJ0YWdDbG9zZVN0YXJ0Iik7CiAgZnVuY3Rpb24gdGFnTmFtZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IGNvZGU0ID09PSA0NyB8fCBjb2RlNCA9PT0gNjIgfHwgbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlNCkpIHsKICAgICAgY29uc3Qgc2xhc2ggPSBjb2RlNCA9PT0gNDc7CiAgICAgIGNvbnN0IG5hbWUgPSBidWZmZXIyLnRvTG93ZXJDYXNlKCk7CiAgICAgIGlmICghc2xhc2ggJiYgIWNsb3NpbmdUYWcgJiYgaHRtbFJhd05hbWVzLmluY2x1ZGVzKG5hbWUpKSB7CiAgICAgICAgbWFya2VyID0gMTsKICAgICAgICByZXR1cm4gc2VsZjIuaW50ZXJydXB0ID8gb2szKGNvZGU0KSA6IGNvbnRpbnVhdGlvbihjb2RlNCk7CiAgICAgIH0KICAgICAgaWYgKGh0bWxCbG9ja05hbWVzLmluY2x1ZGVzKGJ1ZmZlcjIudG9Mb3dlckNhc2UoKSkpIHsKICAgICAgICBtYXJrZXIgPSA2OwogICAgICAgIGlmIChzbGFzaCkgewogICAgICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgICAgIHJldHVybiBiYXNpY1NlbGZDbG9zaW5nOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc2VsZjIuaW50ZXJydXB0ID8gb2szKGNvZGU0KSA6IGNvbnRpbnVhdGlvbihjb2RlNCk7CiAgICAgIH0KICAgICAgbWFya2VyID0gNzsKICAgICAgcmV0dXJuIHNlbGYyLmludGVycnVwdCAmJiAhc2VsZjIucGFyc2VyLmxhenlbc2VsZjIubm93KCkubGluZV0gPyBub2soY29kZTQpIDogY2xvc2luZ1RhZyA/IGNvbXBsZXRlQ2xvc2luZ1RhZ0FmdGVyKGNvZGU0KSA6IGNvbXBsZXRlQXR0cmlidXRlTmFtZUJlZm9yZShjb2RlNCk7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDQ1IHx8IGFzY2lpQWxwaGFudW1lcmljKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBidWZmZXIyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZTQpOwogICAgICByZXR1cm4gdGFnTmFtZTsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBfX25hbWUodGFnTmFtZSwgInRhZ05hbWUiKTsKICBmdW5jdGlvbiBiYXNpY1NlbGZDbG9zaW5nKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDYyKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBzZWxmMi5pbnRlcnJ1cHQgPyBvazMgOiBjb250aW51YXRpb247CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKGJhc2ljU2VsZkNsb3NpbmcsICJiYXNpY1NlbGZDbG9zaW5nIik7CiAgZnVuY3Rpb24gY29tcGxldGVDbG9zaW5nVGFnQWZ0ZXIoY29kZTQpIHsKICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY29tcGxldGVDbG9zaW5nVGFnQWZ0ZXI7CiAgICB9CiAgICByZXR1cm4gY29tcGxldGVFbmQoY29kZTQpOwogIH0KICBfX25hbWUoY29tcGxldGVDbG9zaW5nVGFnQWZ0ZXIsICJjb21wbGV0ZUNsb3NpbmdUYWdBZnRlciIpOwogIGZ1bmN0aW9uIGNvbXBsZXRlQXR0cmlidXRlTmFtZUJlZm9yZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0NykgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY29tcGxldGVFbmQ7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDU4IHx8IGNvZGU0ID09PSA5NSB8fCBhc2NpaUFscGhhKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY29tcGxldGVBdHRyaWJ1dGVOYW1lOwogICAgfQogICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBjb21wbGV0ZUF0dHJpYnV0ZU5hbWVCZWZvcmU7CiAgICB9CiAgICByZXR1cm4gY29tcGxldGVFbmQoY29kZTQpOwogIH0KICBfX25hbWUoY29tcGxldGVBdHRyaWJ1dGVOYW1lQmVmb3JlLCAiY29tcGxldGVBdHRyaWJ1dGVOYW1lQmVmb3JlIik7CiAgZnVuY3Rpb24gY29tcGxldGVBdHRyaWJ1dGVOYW1lKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDQ1IHx8IGNvZGU0ID09PSA0NiB8fCBjb2RlNCA9PT0gNTggfHwgY29kZTQgPT09IDk1IHx8IGFzY2lpQWxwaGFudW1lcmljKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY29tcGxldGVBdHRyaWJ1dGVOYW1lOwogICAgfQogICAgcmV0dXJuIGNvbXBsZXRlQXR0cmlidXRlTmFtZUFmdGVyKGNvZGU0KTsKICB9CiAgX19uYW1lKGNvbXBsZXRlQXR0cmlidXRlTmFtZSwgImNvbXBsZXRlQXR0cmlidXRlTmFtZSIpOwogIGZ1bmN0aW9uIGNvbXBsZXRlQXR0cmlidXRlTmFtZUFmdGVyKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDYxKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBjb21wbGV0ZUF0dHJpYnV0ZVZhbHVlQmVmb3JlOwogICAgfQogICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBjb21wbGV0ZUF0dHJpYnV0ZU5hbWVBZnRlcjsKICAgIH0KICAgIHJldHVybiBjb21wbGV0ZUF0dHJpYnV0ZU5hbWVCZWZvcmUoY29kZTQpOwogIH0KICBfX25hbWUoY29tcGxldGVBdHRyaWJ1dGVOYW1lQWZ0ZXIsICJjb21wbGV0ZUF0dHJpYnV0ZU5hbWVBZnRlciIpOwogIGZ1bmN0aW9uIGNvbXBsZXRlQXR0cmlidXRlVmFsdWVCZWZvcmUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBjb2RlNCA9PT0gNjAgfHwgY29kZTQgPT09IDYxIHx8IGNvZGU0ID09PSA2MiB8fCBjb2RlNCA9PT0gOTYpIHsKICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDM0IHx8IGNvZGU0ID09PSAzOSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBtYXJrZXJCID0gY29kZTQ7CiAgICAgIHJldHVybiBjb21wbGV0ZUF0dHJpYnV0ZVZhbHVlUXVvdGVkOwogICAgfQogICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBjb21wbGV0ZUF0dHJpYnV0ZVZhbHVlQmVmb3JlOwogICAgfQogICAgcmV0dXJuIGNvbXBsZXRlQXR0cmlidXRlVmFsdWVVbnF1b3RlZChjb2RlNCk7CiAgfQogIF9fbmFtZShjb21wbGV0ZUF0dHJpYnV0ZVZhbHVlQmVmb3JlLCAiY29tcGxldGVBdHRyaWJ1dGVWYWx1ZUJlZm9yZSIpOwogIGZ1bmN0aW9uIGNvbXBsZXRlQXR0cmlidXRlVmFsdWVRdW90ZWQoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbWFya2VyQikgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBtYXJrZXJCID0gbnVsbDsKICAgICAgcmV0dXJuIGNvbXBsZXRlQXR0cmlidXRlVmFsdWVRdW90ZWRBZnRlcjsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBjb21wbGV0ZUF0dHJpYnV0ZVZhbHVlUXVvdGVkOwogIH0KICBfX25hbWUoY29tcGxldGVBdHRyaWJ1dGVWYWx1ZVF1b3RlZCwgImNvbXBsZXRlQXR0cmlidXRlVmFsdWVRdW90ZWQiKTsKICBmdW5jdGlvbiBjb21wbGV0ZUF0dHJpYnV0ZVZhbHVlVW5xdW90ZWQoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBjb2RlNCA9PT0gMzQgfHwgY29kZTQgPT09IDM5IHx8IGNvZGU0ID09PSA0NyB8fCBjb2RlNCA9PT0gNjAgfHwgY29kZTQgPT09IDYxIHx8IGNvZGU0ID09PSA2MiB8fCBjb2RlNCA9PT0gOTYgfHwgbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlNCkpIHsKICAgICAgcmV0dXJuIGNvbXBsZXRlQXR0cmlidXRlTmFtZUFmdGVyKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gY29tcGxldGVBdHRyaWJ1dGVWYWx1ZVVucXVvdGVkOwogIH0KICBfX25hbWUoY29tcGxldGVBdHRyaWJ1dGVWYWx1ZVVucXVvdGVkLCAiY29tcGxldGVBdHRyaWJ1dGVWYWx1ZVVucXVvdGVkIik7CiAgZnVuY3Rpb24gY29tcGxldGVBdHRyaWJ1dGVWYWx1ZVF1b3RlZEFmdGVyKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDQ3IHx8IGNvZGU0ID09PSA2MiB8fCBtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICByZXR1cm4gY29tcGxldGVBdHRyaWJ1dGVOYW1lQmVmb3JlKGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBfX25hbWUoY29tcGxldGVBdHRyaWJ1dGVWYWx1ZVF1b3RlZEFmdGVyLCAiY29tcGxldGVBdHRyaWJ1dGVWYWx1ZVF1b3RlZEFmdGVyIik7CiAgZnVuY3Rpb24gY29tcGxldGVFbmQoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNjIpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGNvbXBsZXRlQWZ0ZXI7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKGNvbXBsZXRlRW5kLCAiY29tcGxldGVFbmQiKTsKICBmdW5jdGlvbiBjb21wbGV0ZUFmdGVyKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICByZXR1cm4gY29udGludWF0aW9uKGNvZGU0KTsKICAgIH0KICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY29tcGxldGVBZnRlcjsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBfX25hbWUoY29tcGxldGVBZnRlciwgImNvbXBsZXRlQWZ0ZXIiKTsKICBmdW5jdGlvbiBjb250aW51YXRpb24oY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDUgJiYgbWFya2VyID09PSAyKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBjb250aW51YXRpb25Db21tZW50SW5zaWRlOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA2MCAmJiBtYXJrZXIgPT09IDEpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvblJhd1RhZ09wZW47CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDYyICYmIG1hcmtlciA9PT0gNCkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY29udGludWF0aW9uQ2xvc2U7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDYzICYmIG1hcmtlciA9PT0gMykgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY29udGludWF0aW9uRGVjbGFyYXRpb25JbnNpZGU7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDkzICYmIG1hcmtlciA9PT0gNSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY29udGludWF0aW9uQ2RhdGFJbnNpZGU7CiAgICB9CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSAmJiAobWFya2VyID09PSA2IHx8IG1hcmtlciA9PT0gNykpIHsKICAgICAgZWZmZWN0cy5leGl0KCJodG1sRmxvd0RhdGEiKTsKICAgICAgcmV0dXJuIGVmZmVjdHMuY2hlY2soYmxhbmtMaW5lQmVmb3JlLCBjb250aW51YXRpb25BZnRlciwgY29udGludWF0aW9uU3RhcnQpKGNvZGU0KTsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuZXhpdCgiaHRtbEZsb3dEYXRhIik7CiAgICAgIHJldHVybiBjb250aW51YXRpb25TdGFydChjb2RlNCk7CiAgICB9CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIGNvbnRpbnVhdGlvbjsKICB9CiAgX19uYW1lKGNvbnRpbnVhdGlvbiwgImNvbnRpbnVhdGlvbiIpOwogIGZ1bmN0aW9uIGNvbnRpbnVhdGlvblN0YXJ0KGNvZGU0KSB7CiAgICByZXR1cm4gZWZmZWN0cy5jaGVjayhub25MYXp5Q29udGludWF0aW9uU3RhcnQsIGNvbnRpbnVhdGlvblN0YXJ0Tm9uTGF6eSwgY29udGludWF0aW9uQWZ0ZXIpKGNvZGU0KTsKICB9CiAgX19uYW1lKGNvbnRpbnVhdGlvblN0YXJ0LCAiY29udGludWF0aW9uU3RhcnQiKTsKICBmdW5jdGlvbiBjb250aW51YXRpb25TdGFydE5vbkxhenkoY29kZTQpIHsKICAgIGVmZmVjdHMuZW50ZXIoImxpbmVFbmRpbmciKTsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICBlZmZlY3RzLmV4aXQoImxpbmVFbmRpbmciKTsKICAgIHJldHVybiBjb250aW51YXRpb25CZWZvcmU7CiAgfQogIF9fbmFtZShjb250aW51YXRpb25TdGFydE5vbkxhenksICJjb250aW51YXRpb25TdGFydE5vbkxhenkiKTsKICBmdW5jdGlvbiBjb250aW51YXRpb25CZWZvcmUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIHJldHVybiBjb250aW51YXRpb25TdGFydChjb2RlNCk7CiAgICB9CiAgICBlZmZlY3RzLmVudGVyKCJodG1sRmxvd0RhdGEiKTsKICAgIHJldHVybiBjb250aW51YXRpb24oY29kZTQpOwogIH0KICBfX25hbWUoY29udGludWF0aW9uQmVmb3JlLCAiY29udGludWF0aW9uQmVmb3JlIik7CiAgZnVuY3Rpb24gY29udGludWF0aW9uQ29tbWVudEluc2lkZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0NSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY29udGludWF0aW9uRGVjbGFyYXRpb25JbnNpZGU7CiAgICB9CiAgICByZXR1cm4gY29udGludWF0aW9uKGNvZGU0KTsKICB9CiAgX19uYW1lKGNvbnRpbnVhdGlvbkNvbW1lbnRJbnNpZGUsICJjb250aW51YXRpb25Db21tZW50SW5zaWRlIik7CiAgZnVuY3Rpb24gY29udGludWF0aW9uUmF3VGFnT3Blbihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0NykgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBidWZmZXIyID0gIiI7CiAgICAgIHJldHVybiBjb250aW51YXRpb25SYXdFbmRUYWc7CiAgICB9CiAgICByZXR1cm4gY29udGludWF0aW9uKGNvZGU0KTsKICB9CiAgX19uYW1lKGNvbnRpbnVhdGlvblJhd1RhZ09wZW4sICJjb250aW51YXRpb25SYXdUYWdPcGVuIik7CiAgZnVuY3Rpb24gY29udGludWF0aW9uUmF3RW5kVGFnKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDYyKSB7CiAgICAgIGNvbnN0IG5hbWUgPSBidWZmZXIyLnRvTG93ZXJDYXNlKCk7CiAgICAgIGlmIChodG1sUmF3TmFtZXMuaW5jbHVkZXMobmFtZSkpIHsKICAgICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICAgIHJldHVybiBjb250aW51YXRpb25DbG9zZTsKICAgICAgfQogICAgICByZXR1cm4gY29udGludWF0aW9uKGNvZGU0KTsKICAgIH0KICAgIGlmIChhc2NpaUFscGhhKGNvZGU0KSAmJiBidWZmZXIyLmxlbmd0aCA8IDgpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgYnVmZmVyMiArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGU0KTsKICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvblJhd0VuZFRhZzsKICAgIH0KICAgIHJldHVybiBjb250aW51YXRpb24oY29kZTQpOwogIH0KICBfX25hbWUoY29udGludWF0aW9uUmF3RW5kVGFnLCAiY29udGludWF0aW9uUmF3RW5kVGFnIik7CiAgZnVuY3Rpb24gY29udGludWF0aW9uQ2RhdGFJbnNpZGUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gOTMpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbkRlY2xhcmF0aW9uSW5zaWRlOwogICAgfQogICAgcmV0dXJuIGNvbnRpbnVhdGlvbihjb2RlNCk7CiAgfQogIF9fbmFtZShjb250aW51YXRpb25DZGF0YUluc2lkZSwgImNvbnRpbnVhdGlvbkNkYXRhSW5zaWRlIik7CiAgZnVuY3Rpb24gY29udGludWF0aW9uRGVjbGFyYXRpb25JbnNpZGUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNjIpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbkNsb3NlOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA0NSAmJiBtYXJrZXIgPT09IDIpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbkRlY2xhcmF0aW9uSW5zaWRlOwogICAgfQogICAgcmV0dXJuIGNvbnRpbnVhdGlvbihjb2RlNCk7CiAgfQogIF9fbmFtZShjb250aW51YXRpb25EZWNsYXJhdGlvbkluc2lkZSwgImNvbnRpbnVhdGlvbkRlY2xhcmF0aW9uSW5zaWRlIik7CiAgZnVuY3Rpb24gY29udGludWF0aW9uQ2xvc2UoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuZXhpdCgiaHRtbEZsb3dEYXRhIik7CiAgICAgIHJldHVybiBjb250aW51YXRpb25BZnRlcihjb2RlNCk7CiAgICB9CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIGNvbnRpbnVhdGlvbkNsb3NlOwogIH0KICBfX25hbWUoY29udGludWF0aW9uQ2xvc2UsICJjb250aW51YXRpb25DbG9zZSIpOwogIGZ1bmN0aW9uIGNvbnRpbnVhdGlvbkFmdGVyKGNvZGU0KSB7CiAgICBlZmZlY3RzLmV4aXQoImh0bWxGbG93Iik7CiAgICByZXR1cm4gb2szKGNvZGU0KTsKICB9CiAgX19uYW1lKGNvbnRpbnVhdGlvbkFmdGVyLCAiY29udGludWF0aW9uQWZ0ZXIiKTsKfQpfX25hbWUodG9rZW5pemVIdG1sRmxvdywgInRva2VuaXplSHRtbEZsb3ciKTsKZnVuY3Rpb24gdG9rZW5pemVOb25MYXp5Q29udGludWF0aW9uU3RhcnQoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmVudGVyKCJsaW5lRW5kaW5nIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgibGluZUVuZGluZyIpOwogICAgICByZXR1cm4gYWZ0ZXI7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKHN0YXJ0LCAic3RhcnQiKTsKICBmdW5jdGlvbiBhZnRlcihjb2RlNCkgewogICAgcmV0dXJuIHNlbGYyLnBhcnNlci5sYXp5W3NlbGYyLm5vdygpLmxpbmVdID8gbm9rKGNvZGU0KSA6IG9rMyhjb2RlNCk7CiAgfQogIF9fbmFtZShhZnRlciwgImFmdGVyIik7Cn0KX19uYW1lKHRva2VuaXplTm9uTGF6eUNvbnRpbnVhdGlvblN0YXJ0LCAidG9rZW5pemVOb25MYXp5Q29udGludWF0aW9uU3RhcnQiKTsKZnVuY3Rpb24gdG9rZW5pemVCbGFua0xpbmVCZWZvcmUoZWZmZWN0cywgb2szLCBub2spIHsKICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIGVmZmVjdHMuZW50ZXIoImxpbmVFbmRpbmciKTsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICBlZmZlY3RzLmV4aXQoImxpbmVFbmRpbmciKTsKICAgIHJldHVybiBlZmZlY3RzLmF0dGVtcHQoYmxhbmtMaW5lLCBvazMsIG5vayk7CiAgfQogIF9fbmFtZShzdGFydCwgInN0YXJ0Iik7Cn0KX19uYW1lKHRva2VuaXplQmxhbmtMaW5lQmVmb3JlLCAidG9rZW5pemVCbGFua0xpbmVCZWZvcmUiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstY29yZS1jb21tb25tYXJrQDIuMC4zL25vZGVfbW9kdWxlcy9taWNyb21hcmstY29yZS1jb21tb25tYXJrL2xpYi9odG1sLXRleHQuanMKdmFyIGh0bWxUZXh0ID0gewogIG5hbWU6ICJodG1sVGV4dCIsCiAgdG9rZW5pemU6IHRva2VuaXplSHRtbFRleHQKfTsKZnVuY3Rpb24gdG9rZW5pemVIdG1sVGV4dChlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICBsZXQgbWFya2VyOwogIGxldCBpbmRleDI7CiAgbGV0IHJldHVyblN0YXRlOwogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigiaHRtbFRleHQiKTsKICAgIGVmZmVjdHMuZW50ZXIoImh0bWxUZXh0RGF0YSIpOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBvcGVuOwogIH0KICBfX25hbWUoc3RhcnQsICJzdGFydCIpOwogIGZ1bmN0aW9uIG9wZW4oY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gMzMpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGRlY2xhcmF0aW9uT3BlbjsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gNDcpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHRhZ0Nsb3NlU3RhcnQ7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDYzKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBpbnN0cnVjdGlvbjsKICAgIH0KICAgIGlmIChhc2NpaUFscGhhKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gdGFnT3BlbjsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBfX25hbWUob3BlbiwgIm9wZW4iKTsKICBmdW5jdGlvbiBkZWNsYXJhdGlvbk9wZW4oY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDUpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGNvbW1lbnRPcGVuSW5zaWRlOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA5MSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBpbmRleDIgPSAwOwogICAgICByZXR1cm4gY2RhdGFPcGVuSW5zaWRlOwogICAgfQogICAgaWYgKGFzY2lpQWxwaGEoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBkZWNsYXJhdGlvbjsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBfX25hbWUoZGVjbGFyYXRpb25PcGVuLCAiZGVjbGFyYXRpb25PcGVuIik7CiAgZnVuY3Rpb24gY29tbWVudE9wZW5JbnNpZGUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDUpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGNvbW1lbnRFbmQ7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKGNvbW1lbnRPcGVuSW5zaWRlLCAiY29tbWVudE9wZW5JbnNpZGUiKTsKICBmdW5jdGlvbiBjb21tZW50Myhjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA0NSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY29tbWVudENsb3NlOwogICAgfQogICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgcmV0dXJuU3RhdGUgPSBjb21tZW50MzsKICAgICAgcmV0dXJuIGxpbmVFbmRpbmdCZWZvcmUoY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBjb21tZW50MzsKICB9CiAgX19uYW1lKGNvbW1lbnQzLCAiY29tbWVudCIpOwogIGZ1bmN0aW9uIGNvbW1lbnRDbG9zZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0NSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY29tbWVudEVuZDsKICAgIH0KICAgIHJldHVybiBjb21tZW50Myhjb2RlNCk7CiAgfQogIF9fbmFtZShjb21tZW50Q2xvc2UsICJjb21tZW50Q2xvc2UiKTsKICBmdW5jdGlvbiBjb21tZW50RW5kKGNvZGU0KSB7CiAgICByZXR1cm4gY29kZTQgPT09IDYyID8gZW5kKGNvZGU0KSA6IGNvZGU0ID09PSA0NSA/IGNvbW1lbnRDbG9zZShjb2RlNCkgOiBjb21tZW50Myhjb2RlNCk7CiAgfQogIF9fbmFtZShjb21tZW50RW5kLCAiY29tbWVudEVuZCIpOwogIGZ1bmN0aW9uIGNkYXRhT3Blbkluc2lkZShjb2RlNCkgewogICAgY29uc3QgdmFsdWUyID0gIkNEQVRBWyI7CiAgICBpZiAoY29kZTQgPT09IHZhbHVlMi5jaGFyQ29kZUF0KGluZGV4MisrKSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gaW5kZXgyID09PSB2YWx1ZTIubGVuZ3RoID8gY2RhdGEgOiBjZGF0YU9wZW5JbnNpZGU7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKGNkYXRhT3Blbkluc2lkZSwgImNkYXRhT3Blbkluc2lkZSIpOwogIGZ1bmN0aW9uIGNkYXRhKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwpIHsKICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDkzKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBjZGF0YUNsb3NlOwogICAgfQogICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgcmV0dXJuU3RhdGUgPSBjZGF0YTsKICAgICAgcmV0dXJuIGxpbmVFbmRpbmdCZWZvcmUoY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBjZGF0YTsKICB9CiAgX19uYW1lKGNkYXRhLCAiY2RhdGEiKTsKICBmdW5jdGlvbiBjZGF0YUNsb3NlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDkzKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBjZGF0YUVuZDsKICAgIH0KICAgIHJldHVybiBjZGF0YShjb2RlNCk7CiAgfQogIF9fbmFtZShjZGF0YUNsb3NlLCAiY2RhdGFDbG9zZSIpOwogIGZ1bmN0aW9uIGNkYXRhRW5kKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDYyKSB7CiAgICAgIHJldHVybiBlbmQoY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA5MykgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY2RhdGFFbmQ7CiAgICB9CiAgICByZXR1cm4gY2RhdGEoY29kZTQpOwogIH0KICBfX25hbWUoY2RhdGFFbmQsICJjZGF0YUVuZCIpOwogIGZ1bmN0aW9uIGRlY2xhcmF0aW9uKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgY29kZTQgPT09IDYyKSB7CiAgICAgIHJldHVybiBlbmQoY29kZTQpOwogICAgfQogICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgcmV0dXJuU3RhdGUgPSBkZWNsYXJhdGlvbjsKICAgICAgcmV0dXJuIGxpbmVFbmRpbmdCZWZvcmUoY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBkZWNsYXJhdGlvbjsKICB9CiAgX19uYW1lKGRlY2xhcmF0aW9uLCAiZGVjbGFyYXRpb24iKTsKICBmdW5jdGlvbiBpbnN0cnVjdGlvbihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA2MykgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25DbG9zZTsKICAgIH0KICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIHJldHVyblN0YXRlID0gaW5zdHJ1Y3Rpb247CiAgICAgIHJldHVybiBsaW5lRW5kaW5nQmVmb3JlKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gaW5zdHJ1Y3Rpb247CiAgfQogIF9fbmFtZShpbnN0cnVjdGlvbiwgImluc3RydWN0aW9uIik7CiAgZnVuY3Rpb24gaW5zdHJ1Y3Rpb25DbG9zZShjb2RlNCkgewogICAgcmV0dXJuIGNvZGU0ID09PSA2MiA/IGVuZChjb2RlNCkgOiBpbnN0cnVjdGlvbihjb2RlNCk7CiAgfQogIF9fbmFtZShpbnN0cnVjdGlvbkNsb3NlLCAiaW5zdHJ1Y3Rpb25DbG9zZSIpOwogIGZ1bmN0aW9uIHRhZ0Nsb3NlU3RhcnQoY29kZTQpIHsKICAgIGlmIChhc2NpaUFscGhhKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gdGFnQ2xvc2U7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKHRhZ0Nsb3NlU3RhcnQsICJ0YWdDbG9zZVN0YXJ0Iik7CiAgZnVuY3Rpb24gdGFnQ2xvc2UoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDUgfHwgYXNjaWlBbHBoYW51bWVyaWMoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiB0YWdDbG9zZTsKICAgIH0KICAgIHJldHVybiB0YWdDbG9zZUJldHdlZW4oY29kZTQpOwogIH0KICBfX25hbWUodGFnQ2xvc2UsICJ0YWdDbG9zZSIpOwogIGZ1bmN0aW9uIHRhZ0Nsb3NlQmV0d2Vlbihjb2RlNCkgewogICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgcmV0dXJuU3RhdGUgPSB0YWdDbG9zZUJldHdlZW47CiAgICAgIHJldHVybiBsaW5lRW5kaW5nQmVmb3JlKGNvZGU0KTsKICAgIH0KICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gdGFnQ2xvc2VCZXR3ZWVuOwogICAgfQogICAgcmV0dXJuIGVuZChjb2RlNCk7CiAgfQogIF9fbmFtZSh0YWdDbG9zZUJldHdlZW4sICJ0YWdDbG9zZUJldHdlZW4iKTsKICBmdW5jdGlvbiB0YWdPcGVuKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDQ1IHx8IGFzY2lpQWxwaGFudW1lcmljKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gdGFnT3BlbjsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gNDcgfHwgY29kZTQgPT09IDYyIHx8IG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpKSB7CiAgICAgIHJldHVybiB0YWdPcGVuQmV0d2Vlbihjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKHRhZ09wZW4sICJ0YWdPcGVuIik7CiAgZnVuY3Rpb24gdGFnT3BlbkJldHdlZW4oY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDcpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGVuZDsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gNTggfHwgY29kZTQgPT09IDk1IHx8IGFzY2lpQWxwaGEoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiB0YWdPcGVuQXR0cmlidXRlTmFtZTsKICAgIH0KICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIHJldHVyblN0YXRlID0gdGFnT3BlbkJldHdlZW47CiAgICAgIHJldHVybiBsaW5lRW5kaW5nQmVmb3JlKGNvZGU0KTsKICAgIH0KICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gdGFnT3BlbkJldHdlZW47CiAgICB9CiAgICByZXR1cm4gZW5kKGNvZGU0KTsKICB9CiAgX19uYW1lKHRhZ09wZW5CZXR3ZWVuLCAidGFnT3BlbkJldHdlZW4iKTsKICBmdW5jdGlvbiB0YWdPcGVuQXR0cmlidXRlTmFtZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0NSB8fCBjb2RlNCA9PT0gNDYgfHwgY29kZTQgPT09IDU4IHx8IGNvZGU0ID09PSA5NSB8fCBhc2NpaUFscGhhbnVtZXJpYyhjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHRhZ09wZW5BdHRyaWJ1dGVOYW1lOwogICAgfQogICAgcmV0dXJuIHRhZ09wZW5BdHRyaWJ1dGVOYW1lQWZ0ZXIoY29kZTQpOwogIH0KICBfX25hbWUodGFnT3BlbkF0dHJpYnV0ZU5hbWUsICJ0YWdPcGVuQXR0cmlidXRlTmFtZSIpOwogIGZ1bmN0aW9uIHRhZ09wZW5BdHRyaWJ1dGVOYW1lQWZ0ZXIoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNjEpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHRhZ09wZW5BdHRyaWJ1dGVWYWx1ZUJlZm9yZTsKICAgIH0KICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIHJldHVyblN0YXRlID0gdGFnT3BlbkF0dHJpYnV0ZU5hbWVBZnRlcjsKICAgICAgcmV0dXJuIGxpbmVFbmRpbmdCZWZvcmUoY29kZTQpOwogICAgfQogICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiB0YWdPcGVuQXR0cmlidXRlTmFtZUFmdGVyOwogICAgfQogICAgcmV0dXJuIHRhZ09wZW5CZXR3ZWVuKGNvZGU0KTsKICB9CiAgX19uYW1lKHRhZ09wZW5BdHRyaWJ1dGVOYW1lQWZ0ZXIsICJ0YWdPcGVuQXR0cmlidXRlTmFtZUFmdGVyIik7CiAgZnVuY3Rpb24gdGFnT3BlbkF0dHJpYnV0ZVZhbHVlQmVmb3JlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgY29kZTQgPT09IDYwIHx8IGNvZGU0ID09PSA2MSB8fCBjb2RlNCA9PT0gNjIgfHwgY29kZTQgPT09IDk2KSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSAzNCB8fCBjb2RlNCA9PT0gMzkpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgbWFya2VyID0gY29kZTQ7CiAgICAgIHJldHVybiB0YWdPcGVuQXR0cmlidXRlVmFsdWVRdW90ZWQ7CiAgICB9CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICByZXR1cm5TdGF0ZSA9IHRhZ09wZW5BdHRyaWJ1dGVWYWx1ZUJlZm9yZTsKICAgICAgcmV0dXJuIGxpbmVFbmRpbmdCZWZvcmUoY29kZTQpOwogICAgfQogICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiB0YWdPcGVuQXR0cmlidXRlVmFsdWVCZWZvcmU7CiAgICB9CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIHRhZ09wZW5BdHRyaWJ1dGVWYWx1ZVVucXVvdGVkOwogIH0KICBfX25hbWUodGFnT3BlbkF0dHJpYnV0ZVZhbHVlQmVmb3JlLCAidGFnT3BlbkF0dHJpYnV0ZVZhbHVlQmVmb3JlIik7CiAgZnVuY3Rpb24gdGFnT3BlbkF0dHJpYnV0ZVZhbHVlUXVvdGVkKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG1hcmtlcikgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBtYXJrZXIgPSB2b2lkIDA7CiAgICAgIHJldHVybiB0YWdPcGVuQXR0cmlidXRlVmFsdWVRdW90ZWRBZnRlcjsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gbnVsbCkgewogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIHJldHVyblN0YXRlID0gdGFnT3BlbkF0dHJpYnV0ZVZhbHVlUXVvdGVkOwogICAgICByZXR1cm4gbGluZUVuZGluZ0JlZm9yZShjb2RlNCk7CiAgICB9CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIHRhZ09wZW5BdHRyaWJ1dGVWYWx1ZVF1b3RlZDsKICB9CiAgX19uYW1lKHRhZ09wZW5BdHRyaWJ1dGVWYWx1ZVF1b3RlZCwgInRhZ09wZW5BdHRyaWJ1dGVWYWx1ZVF1b3RlZCIpOwogIGZ1bmN0aW9uIHRhZ09wZW5BdHRyaWJ1dGVWYWx1ZVVucXVvdGVkKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgY29kZTQgPT09IDM0IHx8IGNvZGU0ID09PSAzOSB8fCBjb2RlNCA9PT0gNjAgfHwgY29kZTQgPT09IDYxIHx8IGNvZGU0ID09PSA5NikgewogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gNDcgfHwgY29kZTQgPT09IDYyIHx8IG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpKSB7CiAgICAgIHJldHVybiB0YWdPcGVuQmV0d2Vlbihjb2RlNCk7CiAgICB9CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIHRhZ09wZW5BdHRyaWJ1dGVWYWx1ZVVucXVvdGVkOwogIH0KICBfX25hbWUodGFnT3BlbkF0dHJpYnV0ZVZhbHVlVW5xdW90ZWQsICJ0YWdPcGVuQXR0cmlidXRlVmFsdWVVbnF1b3RlZCIpOwogIGZ1bmN0aW9uIHRhZ09wZW5BdHRyaWJ1dGVWYWx1ZVF1b3RlZEFmdGVyKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDQ3IHx8IGNvZGU0ID09PSA2MiB8fCBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlKGNvZGU0KSkgewogICAgICByZXR1cm4gdGFnT3BlbkJldHdlZW4oY29kZTQpOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZSh0YWdPcGVuQXR0cmlidXRlVmFsdWVRdW90ZWRBZnRlciwgInRhZ09wZW5BdHRyaWJ1dGVWYWx1ZVF1b3RlZEFmdGVyIik7CiAgZnVuY3Rpb24gZW5kKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDYyKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgiaHRtbFRleHREYXRhIik7CiAgICAgIGVmZmVjdHMuZXhpdCgiaHRtbFRleHQiKTsKICAgICAgcmV0dXJuIG9rMzsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBfX25hbWUoZW5kLCAiZW5kIik7CiAgZnVuY3Rpb24gbGluZUVuZGluZ0JlZm9yZShjb2RlNCkgewogICAgZWZmZWN0cy5leGl0KCJodG1sVGV4dERhdGEiKTsKICAgIGVmZmVjdHMuZW50ZXIoImxpbmVFbmRpbmciKTsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICBlZmZlY3RzLmV4aXQoImxpbmVFbmRpbmciKTsKICAgIHJldHVybiBsaW5lRW5kaW5nQWZ0ZXI7CiAgfQogIF9fbmFtZShsaW5lRW5kaW5nQmVmb3JlLCAibGluZUVuZGluZ0JlZm9yZSIpOwogIGZ1bmN0aW9uIGxpbmVFbmRpbmdBZnRlcihjb2RlNCkgewogICAgcmV0dXJuIG1hcmtkb3duU3BhY2UoY29kZTQpID8gZmFjdG9yeVNwYWNlKGVmZmVjdHMsIGxpbmVFbmRpbmdBZnRlclByZWZpeCwgImxpbmVQcmVmaXgiLCBzZWxmMi5wYXJzZXIuY29uc3RydWN0cy5kaXNhYmxlLm51bGwuaW5jbHVkZXMoImNvZGVJbmRlbnRlZCIpID8gdm9pZCAwIDogNCkoY29kZTQpIDogbGluZUVuZGluZ0FmdGVyUHJlZml4KGNvZGU0KTsKICB9CiAgX19uYW1lKGxpbmVFbmRpbmdBZnRlciwgImxpbmVFbmRpbmdBZnRlciIpOwogIGZ1bmN0aW9uIGxpbmVFbmRpbmdBZnRlclByZWZpeChjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigiaHRtbFRleHREYXRhIik7CiAgICByZXR1cm4gcmV0dXJuU3RhdGUoY29kZTQpOwogIH0KICBfX25hbWUobGluZUVuZGluZ0FmdGVyUHJlZml4LCAibGluZUVuZGluZ0FmdGVyUHJlZml4Iik7Cn0KX19uYW1lKHRva2VuaXplSHRtbFRleHQsICJ0b2tlbml6ZUh0bWxUZXh0Iik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvbGFiZWwtZW5kLmpzCnZhciBsYWJlbEVuZCA9IHsKICBuYW1lOiAibGFiZWxFbmQiLAogIHJlc29sdmVBbGw6IHJlc29sdmVBbGxMYWJlbEVuZCwKICByZXNvbHZlVG86IHJlc29sdmVUb0xhYmVsRW5kLAogIHRva2VuaXplOiB0b2tlbml6ZUxhYmVsRW5kCn07CnZhciByZXNvdXJjZUNvbnN0cnVjdCA9IHsKICB0b2tlbml6ZTogdG9rZW5pemVSZXNvdXJjZQp9Owp2YXIgcmVmZXJlbmNlRnVsbENvbnN0cnVjdCA9IHsKICB0b2tlbml6ZTogdG9rZW5pemVSZWZlcmVuY2VGdWxsCn07CnZhciByZWZlcmVuY2VDb2xsYXBzZWRDb25zdHJ1Y3QgPSB7CiAgdG9rZW5pemU6IHRva2VuaXplUmVmZXJlbmNlQ29sbGFwc2VkCn07CmZ1bmN0aW9uIHJlc29sdmVBbGxMYWJlbEVuZChldmVudHMpIHsKICBsZXQgaW5kZXgyID0gLTE7CiAgY29uc3QgbmV3RXZlbnRzID0gW107CiAgd2hpbGUgKCsraW5kZXgyIDwgZXZlbnRzLmxlbmd0aCkgewogICAgY29uc3QgdG9rZW4gPSBldmVudHNbaW5kZXgyXVsxXTsKICAgIG5ld0V2ZW50cy5wdXNoKGV2ZW50c1tpbmRleDJdKTsKICAgIGlmICh0b2tlbi50eXBlID09PSAibGFiZWxJbWFnZSIgfHwgdG9rZW4udHlwZSA9PT0gImxhYmVsTGluayIgfHwgdG9rZW4udHlwZSA9PT0gImxhYmVsRW5kIikgewogICAgICBjb25zdCBvZmZzZXQgPSB0b2tlbi50eXBlID09PSAibGFiZWxJbWFnZSIgPyA0IDogMjsKICAgICAgdG9rZW4udHlwZSA9ICJkYXRhIjsKICAgICAgaW5kZXgyICs9IG9mZnNldDsKICAgIH0KICB9CiAgaWYgKGV2ZW50cy5sZW5ndGggIT09IG5ld0V2ZW50cy5sZW5ndGgpIHsKICAgIHNwbGljZShldmVudHMsIDAsIGV2ZW50cy5sZW5ndGgsIG5ld0V2ZW50cyk7CiAgfQogIHJldHVybiBldmVudHM7Cn0KX19uYW1lKHJlc29sdmVBbGxMYWJlbEVuZCwgInJlc29sdmVBbGxMYWJlbEVuZCIpOwpmdW5jdGlvbiByZXNvbHZlVG9MYWJlbEVuZChldmVudHMsIGNvbnRleHQyKSB7CiAgbGV0IGluZGV4MiA9IGV2ZW50cy5sZW5ndGg7CiAgbGV0IG9mZnNldCA9IDA7CiAgbGV0IHRva2VuOwogIGxldCBvcGVuOwogIGxldCBjbG9zZTc7CiAgbGV0IG1lZGlhOwogIHdoaWxlIChpbmRleDItLSkgewogICAgdG9rZW4gPSBldmVudHNbaW5kZXgyXVsxXTsKICAgIGlmIChvcGVuKSB7CiAgICAgIGlmICh0b2tlbi50eXBlID09PSAibGluayIgfHwgdG9rZW4udHlwZSA9PT0gImxhYmVsTGluayIgJiYgdG9rZW4uX2luYWN0aXZlKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKGV2ZW50c1tpbmRleDJdWzBdID09PSAiZW50ZXIiICYmIHRva2VuLnR5cGUgPT09ICJsYWJlbExpbmsiKSB7CiAgICAgICAgdG9rZW4uX2luYWN0aXZlID0gdHJ1ZTsKICAgICAgfQogICAgfSBlbHNlIGlmIChjbG9zZTcpIHsKICAgICAgaWYgKGV2ZW50c1tpbmRleDJdWzBdID09PSAiZW50ZXIiICYmICh0b2tlbi50eXBlID09PSAibGFiZWxJbWFnZSIgfHwgdG9rZW4udHlwZSA9PT0gImxhYmVsTGluayIpICYmICF0b2tlbi5fYmFsYW5jZWQpIHsKICAgICAgICBvcGVuID0gaW5kZXgyOwogICAgICAgIGlmICh0b2tlbi50eXBlICE9PSAibGFiZWxMaW5rIikgewogICAgICAgICAgb2Zmc2V0ID0gMjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIGlmICh0b2tlbi50eXBlID09PSAibGFiZWxFbmQiKSB7CiAgICAgIGNsb3NlNyA9IGluZGV4MjsKICAgIH0KICB9CiAgY29uc3QgZ3JvdXAgPSB7CiAgICB0eXBlOiBldmVudHNbb3Blbl1bMV0udHlwZSA9PT0gImxhYmVsTGluayIgPyAibGluayIgOiAiaW1hZ2UiLAogICAgc3RhcnQ6IHsKICAgICAgLi4uZXZlbnRzW29wZW5dWzFdLnN0YXJ0CiAgICB9LAogICAgZW5kOiB7CiAgICAgIC4uLmV2ZW50c1tldmVudHMubGVuZ3RoIC0gMV1bMV0uZW5kCiAgICB9CiAgfTsKICBjb25zdCBsYWJlbCA9IHsKICAgIHR5cGU6ICJsYWJlbCIsCiAgICBzdGFydDogewogICAgICAuLi5ldmVudHNbb3Blbl1bMV0uc3RhcnQKICAgIH0sCiAgICBlbmQ6IHsKICAgICAgLi4uZXZlbnRzW2Nsb3NlN11bMV0uZW5kCiAgICB9CiAgfTsKICBjb25zdCB0ZXh0OCA9IHsKICAgIHR5cGU6ICJsYWJlbFRleHQiLAogICAgc3RhcnQ6IHsKICAgICAgLi4uZXZlbnRzW29wZW4gKyBvZmZzZXQgKyAyXVsxXS5lbmQKICAgIH0sCiAgICBlbmQ6IHsKICAgICAgLi4uZXZlbnRzW2Nsb3NlNyAtIDJdWzFdLnN0YXJ0CiAgICB9CiAgfTsKICBtZWRpYSA9IFtbImVudGVyIiwgZ3JvdXAsIGNvbnRleHQyXSwgWyJlbnRlciIsIGxhYmVsLCBjb250ZXh0Ml1dOwogIG1lZGlhID0gcHVzaChtZWRpYSwgZXZlbnRzLnNsaWNlKG9wZW4gKyAxLCBvcGVuICsgb2Zmc2V0ICsgMykpOwogIG1lZGlhID0gcHVzaChtZWRpYSwgW1siZW50ZXIiLCB0ZXh0OCwgY29udGV4dDJdXSk7CiAgbWVkaWEgPSBwdXNoKG1lZGlhLCByZXNvbHZlQWxsKGNvbnRleHQyLnBhcnNlci5jb25zdHJ1Y3RzLmluc2lkZVNwYW4ubnVsbCwgZXZlbnRzLnNsaWNlKG9wZW4gKyBvZmZzZXQgKyA0LCBjbG9zZTcgLSAzKSwgY29udGV4dDIpKTsKICBtZWRpYSA9IHB1c2gobWVkaWEsIFtbImV4aXQiLCB0ZXh0OCwgY29udGV4dDJdLCBldmVudHNbY2xvc2U3IC0gMl0sIGV2ZW50c1tjbG9zZTcgLSAxXSwgWyJleGl0IiwgbGFiZWwsIGNvbnRleHQyXV0pOwogIG1lZGlhID0gcHVzaChtZWRpYSwgZXZlbnRzLnNsaWNlKGNsb3NlNyArIDEpKTsKICBtZWRpYSA9IHB1c2gobWVkaWEsIFtbImV4aXQiLCBncm91cCwgY29udGV4dDJdXSk7CiAgc3BsaWNlKGV2ZW50cywgb3BlbiwgZXZlbnRzLmxlbmd0aCwgbWVkaWEpOwogIHJldHVybiBldmVudHM7Cn0KX19uYW1lKHJlc29sdmVUb0xhYmVsRW5kLCAicmVzb2x2ZVRvTGFiZWxFbmQiKTsKZnVuY3Rpb24gdG9rZW5pemVMYWJlbEVuZChlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICBsZXQgaW5kZXgyID0gc2VsZjIuZXZlbnRzLmxlbmd0aDsKICBsZXQgbGFiZWxTdGFydDsKICBsZXQgZGVmaW5lZDsKICB3aGlsZSAoaW5kZXgyLS0pIHsKICAgIGlmICgoc2VsZjIuZXZlbnRzW2luZGV4Ml1bMV0udHlwZSA9PT0gImxhYmVsSW1hZ2UiIHx8IHNlbGYyLmV2ZW50c1tpbmRleDJdWzFdLnR5cGUgPT09ICJsYWJlbExpbmsiKSAmJiAhc2VsZjIuZXZlbnRzW2luZGV4Ml1bMV0uX2JhbGFuY2VkKSB7CiAgICAgIGxhYmVsU3RhcnQgPSBzZWxmMi5ldmVudHNbaW5kZXgyXVsxXTsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgaWYgKCFsYWJlbFN0YXJ0KSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgaWYgKGxhYmVsU3RhcnQuX2luYWN0aXZlKSB7CiAgICAgIHJldHVybiBsYWJlbEVuZE5vayhjb2RlNCk7CiAgICB9CiAgICBkZWZpbmVkID0gc2VsZjIucGFyc2VyLmRlZmluZWQuaW5jbHVkZXMobm9ybWFsaXplSWRlbnRpZmllcihzZWxmMi5zbGljZVNlcmlhbGl6ZSh7CiAgICAgIHN0YXJ0OiBsYWJlbFN0YXJ0LmVuZCwKICAgICAgZW5kOiBzZWxmMi5ub3coKQogICAgfSkpKTsKICAgIGVmZmVjdHMuZW50ZXIoImxhYmVsRW5kIik7CiAgICBlZmZlY3RzLmVudGVyKCJsYWJlbE1hcmtlciIpOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIGVmZmVjdHMuZXhpdCgibGFiZWxNYXJrZXIiKTsKICAgIGVmZmVjdHMuZXhpdCgibGFiZWxFbmQiKTsKICAgIHJldHVybiBhZnRlcjsKICB9CiAgX19uYW1lKHN0YXJ0LCAic3RhcnQiKTsKICBmdW5jdGlvbiBhZnRlcihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0MCkgewogICAgICByZXR1cm4gZWZmZWN0cy5hdHRlbXB0KHJlc291cmNlQ29uc3RydWN0LCBsYWJlbEVuZE9rLCBkZWZpbmVkID8gbGFiZWxFbmRPayA6IGxhYmVsRW5kTm9rKShjb2RlNCk7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDkxKSB7CiAgICAgIHJldHVybiBlZmZlY3RzLmF0dGVtcHQocmVmZXJlbmNlRnVsbENvbnN0cnVjdCwgbGFiZWxFbmRPaywgZGVmaW5lZCA/IHJlZmVyZW5jZU5vdEZ1bGwgOiBsYWJlbEVuZE5vaykoY29kZTQpOwogICAgfQogICAgcmV0dXJuIGRlZmluZWQgPyBsYWJlbEVuZE9rKGNvZGU0KSA6IGxhYmVsRW5kTm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKGFmdGVyLCAiYWZ0ZXIiKTsKICBmdW5jdGlvbiByZWZlcmVuY2VOb3RGdWxsKGNvZGU0KSB7CiAgICByZXR1cm4gZWZmZWN0cy5hdHRlbXB0KHJlZmVyZW5jZUNvbGxhcHNlZENvbnN0cnVjdCwgbGFiZWxFbmRPaywgbGFiZWxFbmROb2spKGNvZGU0KTsKICB9CiAgX19uYW1lKHJlZmVyZW5jZU5vdEZ1bGwsICJyZWZlcmVuY2VOb3RGdWxsIik7CiAgZnVuY3Rpb24gbGFiZWxFbmRPayhjb2RlNCkgewogICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgfQogIF9fbmFtZShsYWJlbEVuZE9rLCAibGFiZWxFbmRPayIpOwogIGZ1bmN0aW9uIGxhYmVsRW5kTm9rKGNvZGU0KSB7CiAgICBsYWJlbFN0YXJ0Ll9iYWxhbmNlZCA9IHRydWU7CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKGxhYmVsRW5kTm9rLCAibGFiZWxFbmROb2siKTsKfQpfX25hbWUodG9rZW5pemVMYWJlbEVuZCwgInRva2VuaXplTGFiZWxFbmQiKTsKZnVuY3Rpb24gdG9rZW5pemVSZXNvdXJjZShlZmZlY3RzLCBvazMsIG5vaykgewogIHJldHVybiByZXNvdXJjZVN0YXJ0OwogIGZ1bmN0aW9uIHJlc291cmNlU3RhcnQoY29kZTQpIHsKICAgIGVmZmVjdHMuZW50ZXIoInJlc291cmNlIik7CiAgICBlZmZlY3RzLmVudGVyKCJyZXNvdXJjZU1hcmtlciIpOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIGVmZmVjdHMuZXhpdCgicmVzb3VyY2VNYXJrZXIiKTsKICAgIHJldHVybiByZXNvdXJjZUJlZm9yZTsKICB9CiAgX19uYW1lKHJlc291cmNlU3RhcnQsICJyZXNvdXJjZVN0YXJ0Iik7CiAgZnVuY3Rpb24gcmVzb3VyY2VCZWZvcmUoY29kZTQpIHsKICAgIHJldHVybiBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlKGNvZGU0KSA/IGZhY3RvcnlXaGl0ZXNwYWNlKGVmZmVjdHMsIHJlc291cmNlT3BlbikoY29kZTQpIDogcmVzb3VyY2VPcGVuKGNvZGU0KTsKICB9CiAgX19uYW1lKHJlc291cmNlQmVmb3JlLCAicmVzb3VyY2VCZWZvcmUiKTsKICBmdW5jdGlvbiByZXNvdXJjZU9wZW4oY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDEpIHsKICAgICAgcmV0dXJuIHJlc291cmNlRW5kKGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBmYWN0b3J5RGVzdGluYXRpb24oZWZmZWN0cywgcmVzb3VyY2VEZXN0aW5hdGlvbkFmdGVyLCByZXNvdXJjZURlc3RpbmF0aW9uTWlzc2luZywgInJlc291cmNlRGVzdGluYXRpb24iLCAicmVzb3VyY2VEZXN0aW5hdGlvbkxpdGVyYWwiLCAicmVzb3VyY2VEZXN0aW5hdGlvbkxpdGVyYWxNYXJrZXIiLCAicmVzb3VyY2VEZXN0aW5hdGlvblJhdyIsICJyZXNvdXJjZURlc3RpbmF0aW9uU3RyaW5nIiwgMzIpKGNvZGU0KTsKICB9CiAgX19uYW1lKHJlc291cmNlT3BlbiwgInJlc291cmNlT3BlbiIpOwogIGZ1bmN0aW9uIHJlc291cmNlRGVzdGluYXRpb25BZnRlcihjb2RlNCkgewogICAgcmV0dXJuIG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpID8gZmFjdG9yeVdoaXRlc3BhY2UoZWZmZWN0cywgcmVzb3VyY2VCZXR3ZWVuKShjb2RlNCkgOiByZXNvdXJjZUVuZChjb2RlNCk7CiAgfQogIF9fbmFtZShyZXNvdXJjZURlc3RpbmF0aW9uQWZ0ZXIsICJyZXNvdXJjZURlc3RpbmF0aW9uQWZ0ZXIiKTsKICBmdW5jdGlvbiByZXNvdXJjZURlc3RpbmF0aW9uTWlzc2luZyhjb2RlNCkgewogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZShyZXNvdXJjZURlc3RpbmF0aW9uTWlzc2luZywgInJlc291cmNlRGVzdGluYXRpb25NaXNzaW5nIik7CiAgZnVuY3Rpb24gcmVzb3VyY2VCZXR3ZWVuKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDM0IHx8IGNvZGU0ID09PSAzOSB8fCBjb2RlNCA9PT0gNDApIHsKICAgICAgcmV0dXJuIGZhY3RvcnlUaXRsZShlZmZlY3RzLCByZXNvdXJjZVRpdGxlQWZ0ZXIsIG5vaywgInJlc291cmNlVGl0bGUiLCAicmVzb3VyY2VUaXRsZU1hcmtlciIsICJyZXNvdXJjZVRpdGxlU3RyaW5nIikoY29kZTQpOwogICAgfQogICAgcmV0dXJuIHJlc291cmNlRW5kKGNvZGU0KTsKICB9CiAgX19uYW1lKHJlc291cmNlQmV0d2VlbiwgInJlc291cmNlQmV0d2VlbiIpOwogIGZ1bmN0aW9uIHJlc291cmNlVGl0bGVBZnRlcihjb2RlNCkgewogICAgcmV0dXJuIG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpID8gZmFjdG9yeVdoaXRlc3BhY2UoZWZmZWN0cywgcmVzb3VyY2VFbmQpKGNvZGU0KSA6IHJlc291cmNlRW5kKGNvZGU0KTsKICB9CiAgX19uYW1lKHJlc291cmNlVGl0bGVBZnRlciwgInJlc291cmNlVGl0bGVBZnRlciIpOwogIGZ1bmN0aW9uIHJlc291cmNlRW5kKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDQxKSB7CiAgICAgIGVmZmVjdHMuZW50ZXIoInJlc291cmNlTWFya2VyIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgicmVzb3VyY2VNYXJrZXIiKTsKICAgICAgZWZmZWN0cy5leGl0KCJyZXNvdXJjZSIpOwogICAgICByZXR1cm4gb2szOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZShyZXNvdXJjZUVuZCwgInJlc291cmNlRW5kIik7Cn0KX19uYW1lKHRva2VuaXplUmVzb3VyY2UsICJ0b2tlbml6ZVJlc291cmNlIik7CmZ1bmN0aW9uIHRva2VuaXplUmVmZXJlbmNlRnVsbChlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICByZXR1cm4gcmVmZXJlbmNlRnVsbDsKICBmdW5jdGlvbiByZWZlcmVuY2VGdWxsKGNvZGU0KSB7CiAgICByZXR1cm4gZmFjdG9yeUxhYmVsLmNhbGwoc2VsZjIsIGVmZmVjdHMsIHJlZmVyZW5jZUZ1bGxBZnRlciwgcmVmZXJlbmNlRnVsbE1pc3NpbmcsICJyZWZlcmVuY2UiLCAicmVmZXJlbmNlTWFya2VyIiwgInJlZmVyZW5jZVN0cmluZyIpKGNvZGU0KTsKICB9CiAgX19uYW1lKHJlZmVyZW5jZUZ1bGwsICJyZWZlcmVuY2VGdWxsIik7CiAgZnVuY3Rpb24gcmVmZXJlbmNlRnVsbEFmdGVyKGNvZGU0KSB7CiAgICByZXR1cm4gc2VsZjIucGFyc2VyLmRlZmluZWQuaW5jbHVkZXMobm9ybWFsaXplSWRlbnRpZmllcihzZWxmMi5zbGljZVNlcmlhbGl6ZShzZWxmMi5ldmVudHNbc2VsZjIuZXZlbnRzLmxlbmd0aCAtIDFdWzFdKS5zbGljZSgxLCAtMSkpKSA/IG9rMyhjb2RlNCkgOiBub2soY29kZTQpOwogIH0KICBfX25hbWUocmVmZXJlbmNlRnVsbEFmdGVyLCAicmVmZXJlbmNlRnVsbEFmdGVyIik7CiAgZnVuY3Rpb24gcmVmZXJlbmNlRnVsbE1pc3NpbmcoY29kZTQpIHsKICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBfX25hbWUocmVmZXJlbmNlRnVsbE1pc3NpbmcsICJyZWZlcmVuY2VGdWxsTWlzc2luZyIpOwp9Cl9fbmFtZSh0b2tlbml6ZVJlZmVyZW5jZUZ1bGwsICJ0b2tlbml6ZVJlZmVyZW5jZUZ1bGwiKTsKZnVuY3Rpb24gdG9rZW5pemVSZWZlcmVuY2VDb2xsYXBzZWQoZWZmZWN0cywgb2szLCBub2spIHsKICByZXR1cm4gcmVmZXJlbmNlQ29sbGFwc2VkU3RhcnQ7CiAgZnVuY3Rpb24gcmVmZXJlbmNlQ29sbGFwc2VkU3RhcnQoY29kZTQpIHsKICAgIGVmZmVjdHMuZW50ZXIoInJlZmVyZW5jZSIpOwogICAgZWZmZWN0cy5lbnRlcigicmVmZXJlbmNlTWFya2VyIik7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgZWZmZWN0cy5leGl0KCJyZWZlcmVuY2VNYXJrZXIiKTsKICAgIHJldHVybiByZWZlcmVuY2VDb2xsYXBzZWRPcGVuOwogIH0KICBfX25hbWUocmVmZXJlbmNlQ29sbGFwc2VkU3RhcnQsICJyZWZlcmVuY2VDb2xsYXBzZWRTdGFydCIpOwogIGZ1bmN0aW9uIHJlZmVyZW5jZUNvbGxhcHNlZE9wZW4oY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gOTMpIHsKICAgICAgZWZmZWN0cy5lbnRlcigicmVmZXJlbmNlTWFya2VyIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgicmVmZXJlbmNlTWFya2VyIik7CiAgICAgIGVmZmVjdHMuZXhpdCgicmVmZXJlbmNlIik7CiAgICAgIHJldHVybiBvazM7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKHJlZmVyZW5jZUNvbGxhcHNlZE9wZW4sICJyZWZlcmVuY2VDb2xsYXBzZWRPcGVuIik7Cn0KX19uYW1lKHRva2VuaXplUmVmZXJlbmNlQ29sbGFwc2VkLCAidG9rZW5pemVSZWZlcmVuY2VDb2xsYXBzZWQiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstY29yZS1jb21tb25tYXJrQDIuMC4zL25vZGVfbW9kdWxlcy9taWNyb21hcmstY29yZS1jb21tb25tYXJrL2xpYi9sYWJlbC1zdGFydC1pbWFnZS5qcwp2YXIgbGFiZWxTdGFydEltYWdlID0gewogIG5hbWU6ICJsYWJlbFN0YXJ0SW1hZ2UiLAogIHJlc29sdmVBbGw6IGxhYmVsRW5kLnJlc29sdmVBbGwsCiAgdG9rZW5pemU6IHRva2VuaXplTGFiZWxTdGFydEltYWdlCn07CmZ1bmN0aW9uIHRva2VuaXplTGFiZWxTdGFydEltYWdlKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigibGFiZWxJbWFnZSIpOwogICAgZWZmZWN0cy5lbnRlcigibGFiZWxJbWFnZU1hcmtlciIpOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIGVmZmVjdHMuZXhpdCgibGFiZWxJbWFnZU1hcmtlciIpOwogICAgcmV0dXJuIG9wZW47CiAgfQogIF9fbmFtZShzdGFydCwgInN0YXJ0Iik7CiAgZnVuY3Rpb24gb3Blbihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA5MSkgewogICAgICBlZmZlY3RzLmVudGVyKCJsYWJlbE1hcmtlciIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoImxhYmVsTWFya2VyIik7CiAgICAgIGVmZmVjdHMuZXhpdCgibGFiZWxJbWFnZSIpOwogICAgICByZXR1cm4gYWZ0ZXI7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKG9wZW4sICJvcGVuIik7CiAgZnVuY3Rpb24gYWZ0ZXIoY29kZTQpIHsKICAgIHJldHVybiBjb2RlNCA9PT0gOTQgJiYgIl9oaWRkZW5Gb290bm90ZVN1cHBvcnQiIGluIHNlbGYyLnBhcnNlci5jb25zdHJ1Y3RzID8gbm9rKGNvZGU0KSA6IG9rMyhjb2RlNCk7CiAgfQogIF9fbmFtZShhZnRlciwgImFmdGVyIik7Cn0KX19uYW1lKHRva2VuaXplTGFiZWxTdGFydEltYWdlLCAidG9rZW5pemVMYWJlbFN0YXJ0SW1hZ2UiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstY29yZS1jb21tb25tYXJrQDIuMC4zL25vZGVfbW9kdWxlcy9taWNyb21hcmstY29yZS1jb21tb25tYXJrL2xpYi9sYWJlbC1zdGFydC1saW5rLmpzCnZhciBsYWJlbFN0YXJ0TGluayA9IHsKICBuYW1lOiAibGFiZWxTdGFydExpbmsiLAogIHJlc29sdmVBbGw6IGxhYmVsRW5kLnJlc29sdmVBbGwsCiAgdG9rZW5pemU6IHRva2VuaXplTGFiZWxTdGFydExpbmsKfTsKZnVuY3Rpb24gdG9rZW5pemVMYWJlbFN0YXJ0TGluayhlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIGVmZmVjdHMuZW50ZXIoImxhYmVsTGluayIpOwogICAgZWZmZWN0cy5lbnRlcigibGFiZWxNYXJrZXIiKTsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICBlZmZlY3RzLmV4aXQoImxhYmVsTWFya2VyIik7CiAgICBlZmZlY3RzLmV4aXQoImxhYmVsTGluayIpOwogICAgcmV0dXJuIGFmdGVyOwogIH0KICBfX25hbWUoc3RhcnQsICJzdGFydCIpOwogIGZ1bmN0aW9uIGFmdGVyKGNvZGU0KSB7CiAgICByZXR1cm4gY29kZTQgPT09IDk0ICYmICJfaGlkZGVuRm9vdG5vdGVTdXBwb3J0IiBpbiBzZWxmMi5wYXJzZXIuY29uc3RydWN0cyA/IG5vayhjb2RlNCkgOiBvazMoY29kZTQpOwogIH0KICBfX25hbWUoYWZ0ZXIsICJhZnRlciIpOwp9Cl9fbmFtZSh0b2tlbml6ZUxhYmVsU3RhcnRMaW5rLCAidG9rZW5pemVMYWJlbFN0YXJ0TGluayIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2xpbmUtZW5kaW5nLmpzCnZhciBsaW5lRW5kaW5nID0gewogIG5hbWU6ICJsaW5lRW5kaW5nIiwKICB0b2tlbml6ZTogdG9rZW5pemVMaW5lRW5kaW5nCn07CmZ1bmN0aW9uIHRva2VuaXplTGluZUVuZGluZyhlZmZlY3RzLCBvazMpIHsKICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIGVmZmVjdHMuZW50ZXIoImxpbmVFbmRpbmciKTsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICBlZmZlY3RzLmV4aXQoImxpbmVFbmRpbmciKTsKICAgIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgb2szLCAibGluZVByZWZpeCIpOwogIH0KICBfX25hbWUoc3RhcnQsICJzdGFydCIpOwp9Cl9fbmFtZSh0b2tlbml6ZUxpbmVFbmRpbmcsICJ0b2tlbml6ZUxpbmVFbmRpbmciKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstY29yZS1jb21tb25tYXJrQDIuMC4zL25vZGVfbW9kdWxlcy9taWNyb21hcmstY29yZS1jb21tb25tYXJrL2xpYi90aGVtYXRpYy1icmVhay5qcwp2YXIgdGhlbWF0aWNCcmVhazIgPSB7CiAgbmFtZTogInRoZW1hdGljQnJlYWsiLAogIHRva2VuaXplOiB0b2tlbml6ZVRoZW1hdGljQnJlYWsKfTsKZnVuY3Rpb24gdG9rZW5pemVUaGVtYXRpY0JyZWFrKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgbGV0IHNpemUgPSAwOwogIGxldCBtYXJrZXI7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJ0aGVtYXRpY0JyZWFrIik7CiAgICByZXR1cm4gYmVmb3JlKGNvZGU0KTsKICB9CiAgX19uYW1lKHN0YXJ0LCAic3RhcnQiKTsKICBmdW5jdGlvbiBiZWZvcmUoY29kZTQpIHsKICAgIG1hcmtlciA9IGNvZGU0OwogICAgcmV0dXJuIGF0QnJlYWsoY29kZTQpOwogIH0KICBfX25hbWUoYmVmb3JlLCAiYmVmb3JlIik7CiAgZnVuY3Rpb24gYXRCcmVhayhjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBtYXJrZXIpIHsKICAgICAgZWZmZWN0cy5lbnRlcigidGhlbWF0aWNCcmVha1NlcXVlbmNlIik7CiAgICAgIHJldHVybiBzZXF1ZW5jZShjb2RlNCk7CiAgICB9CiAgICBpZiAoc2l6ZSA+PSAzICYmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSkgewogICAgICBlZmZlY3RzLmV4aXQoInRoZW1hdGljQnJlYWsiKTsKICAgICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKGF0QnJlYWssICJhdEJyZWFrIik7CiAgZnVuY3Rpb24gc2VxdWVuY2UoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbWFya2VyKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHNpemUrKzsKICAgICAgcmV0dXJuIHNlcXVlbmNlOwogICAgfQogICAgZWZmZWN0cy5leGl0KCJ0aGVtYXRpY0JyZWFrU2VxdWVuY2UiKTsKICAgIHJldHVybiBtYXJrZG93blNwYWNlKGNvZGU0KSA/IGZhY3RvcnlTcGFjZShlZmZlY3RzLCBhdEJyZWFrLCAid2hpdGVzcGFjZSIpKGNvZGU0KSA6IGF0QnJlYWsoY29kZTQpOwogIH0KICBfX25hbWUoc2VxdWVuY2UsICJzZXF1ZW5jZSIpOwp9Cl9fbmFtZSh0b2tlbml6ZVRoZW1hdGljQnJlYWssICJ0b2tlbml6ZVRoZW1hdGljQnJlYWsiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstY29yZS1jb21tb25tYXJrQDIuMC4zL25vZGVfbW9kdWxlcy9taWNyb21hcmstY29yZS1jb21tb25tYXJrL2xpYi9saXN0LmpzCnZhciBsaXN0MyA9IHsKICBjb250aW51YXRpb246IHsKICAgIHRva2VuaXplOiB0b2tlbml6ZUxpc3RDb250aW51YXRpb24KICB9LAogIGV4aXQ6IHRva2VuaXplTGlzdEVuZCwKICBuYW1lOiAibGlzdCIsCiAgdG9rZW5pemU6IHRva2VuaXplTGlzdFN0YXJ0Cn07CnZhciBsaXN0SXRlbVByZWZpeFdoaXRlc3BhY2VDb25zdHJ1Y3QgPSB7CiAgcGFydGlhbDogdHJ1ZSwKICB0b2tlbml6ZTogdG9rZW5pemVMaXN0SXRlbVByZWZpeFdoaXRlc3BhY2UKfTsKdmFyIGluZGVudENvbnN0cnVjdCA9IHsKICBwYXJ0aWFsOiB0cnVlLAogIHRva2VuaXplOiB0b2tlbml6ZUluZGVudAp9OwpmdW5jdGlvbiB0b2tlbml6ZUxpc3RTdGFydChlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICBjb25zdCB0YWlsID0gc2VsZjIuZXZlbnRzW3NlbGYyLmV2ZW50cy5sZW5ndGggLSAxXTsKICBsZXQgaW5pdGlhbFNpemUgPSB0YWlsICYmIHRhaWxbMV0udHlwZSA9PT0gImxpbmVQcmVmaXgiID8gdGFpbFsyXS5zbGljZVNlcmlhbGl6ZSh0YWlsWzFdLCB0cnVlKS5sZW5ndGggOiAwOwogIGxldCBzaXplID0gMDsKICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIGNvbnN0IGtpbmQgPSBzZWxmMi5jb250YWluZXJTdGF0ZS50eXBlIHx8IChjb2RlNCA9PT0gNDIgfHwgY29kZTQgPT09IDQzIHx8IGNvZGU0ID09PSA0NSA/ICJsaXN0VW5vcmRlcmVkIiA6ICJsaXN0T3JkZXJlZCIpOwogICAgaWYgKGtpbmQgPT09ICJsaXN0VW5vcmRlcmVkIiA/ICFzZWxmMi5jb250YWluZXJTdGF0ZS5tYXJrZXIgfHwgY29kZTQgPT09IHNlbGYyLmNvbnRhaW5lclN0YXRlLm1hcmtlciA6IGFzY2lpRGlnaXQoY29kZTQpKSB7CiAgICAgIGlmICghc2VsZjIuY29udGFpbmVyU3RhdGUudHlwZSkgewogICAgICAgIHNlbGYyLmNvbnRhaW5lclN0YXRlLnR5cGUgPSBraW5kOwogICAgICAgIGVmZmVjdHMuZW50ZXIoa2luZCwgewogICAgICAgICAgX2NvbnRhaW5lcjogdHJ1ZQogICAgICAgIH0pOwogICAgICB9CiAgICAgIGlmIChraW5kID09PSAibGlzdFVub3JkZXJlZCIpIHsKICAgICAgICBlZmZlY3RzLmVudGVyKCJsaXN0SXRlbVByZWZpeCIpOwogICAgICAgIHJldHVybiBjb2RlNCA9PT0gNDIgfHwgY29kZTQgPT09IDQ1ID8gZWZmZWN0cy5jaGVjayh0aGVtYXRpY0JyZWFrMiwgbm9rLCBhdE1hcmtlcikoY29kZTQpIDogYXRNYXJrZXIoY29kZTQpOwogICAgICB9CiAgICAgIGlmICghc2VsZjIuaW50ZXJydXB0IHx8IGNvZGU0ID09PSA0OSkgewogICAgICAgIGVmZmVjdHMuZW50ZXIoImxpc3RJdGVtUHJlZml4Iik7CiAgICAgICAgZWZmZWN0cy5lbnRlcigibGlzdEl0ZW1WYWx1ZSIpOwogICAgICAgIHJldHVybiBpbnNpZGUoY29kZTQpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKHN0YXJ0LCAic3RhcnQiKTsKICBmdW5jdGlvbiBpbnNpZGUoY29kZTQpIHsKICAgIGlmIChhc2NpaURpZ2l0KGNvZGU0KSAmJiArK3NpemUgPCAxMCkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gaW5zaWRlOwogICAgfQogICAgaWYgKCghc2VsZjIuaW50ZXJydXB0IHx8IHNpemUgPCAyKSAmJiAoc2VsZjIuY29udGFpbmVyU3RhdGUubWFya2VyID8gY29kZTQgPT09IHNlbGYyLmNvbnRhaW5lclN0YXRlLm1hcmtlciA6IGNvZGU0ID09PSA0MSB8fCBjb2RlNCA9PT0gNDYpKSB7CiAgICAgIGVmZmVjdHMuZXhpdCgibGlzdEl0ZW1WYWx1ZSIpOwogICAgICByZXR1cm4gYXRNYXJrZXIoY29kZTQpOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZShpbnNpZGUsICJpbnNpZGUiKTsKICBmdW5jdGlvbiBhdE1hcmtlcihjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigibGlzdEl0ZW1NYXJrZXIiKTsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICBlZmZlY3RzLmV4aXQoImxpc3RJdGVtTWFya2VyIik7CiAgICBzZWxmMi5jb250YWluZXJTdGF0ZS5tYXJrZXIgPSBzZWxmMi5jb250YWluZXJTdGF0ZS5tYXJrZXIgfHwgY29kZTQ7CiAgICByZXR1cm4gZWZmZWN0cy5jaGVjaygKICAgICAgYmxhbmtMaW5lLAogICAgICAvLyBDYW7igJl0IGJlIGVtcHR5IHdoZW4gaW50ZXJydXB0aW5nLgogICAgICBzZWxmMi5pbnRlcnJ1cHQgPyBub2sgOiBvbkJsYW5rLAogICAgICBlZmZlY3RzLmF0dGVtcHQobGlzdEl0ZW1QcmVmaXhXaGl0ZXNwYWNlQ29uc3RydWN0LCBlbmRPZlByZWZpeCwgb3RoZXJQcmVmaXgpCiAgICApOwogIH0KICBfX25hbWUoYXRNYXJrZXIsICJhdE1hcmtlciIpOwogIGZ1bmN0aW9uIG9uQmxhbmsoY29kZTQpIHsKICAgIHNlbGYyLmNvbnRhaW5lclN0YXRlLmluaXRpYWxCbGFua0xpbmUgPSB0cnVlOwogICAgaW5pdGlhbFNpemUrKzsKICAgIHJldHVybiBlbmRPZlByZWZpeChjb2RlNCk7CiAgfQogIF9fbmFtZShvbkJsYW5rLCAib25CbGFuayIpOwogIGZ1bmN0aW9uIG90aGVyUHJlZml4KGNvZGU0KSB7CiAgICBpZiAobWFya2Rvd25TcGFjZShjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5lbnRlcigibGlzdEl0ZW1QcmVmaXhXaGl0ZXNwYWNlIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgibGlzdEl0ZW1QcmVmaXhXaGl0ZXNwYWNlIik7CiAgICAgIHJldHVybiBlbmRPZlByZWZpeDsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBfX25hbWUob3RoZXJQcmVmaXgsICJvdGhlclByZWZpeCIpOwogIGZ1bmN0aW9uIGVuZE9mUHJlZml4KGNvZGU0KSB7CiAgICBzZWxmMi5jb250YWluZXJTdGF0ZS5zaXplID0gaW5pdGlhbFNpemUgKyBzZWxmMi5zbGljZVNlcmlhbGl6ZShlZmZlY3RzLmV4aXQoImxpc3RJdGVtUHJlZml4IiksIHRydWUpLmxlbmd0aDsKICAgIHJldHVybiBvazMoY29kZTQpOwogIH0KICBfX25hbWUoZW5kT2ZQcmVmaXgsICJlbmRPZlByZWZpeCIpOwp9Cl9fbmFtZSh0b2tlbml6ZUxpc3RTdGFydCwgInRva2VuaXplTGlzdFN0YXJ0Iik7CmZ1bmN0aW9uIHRva2VuaXplTGlzdENvbnRpbnVhdGlvbihlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICBzZWxmMi5jb250YWluZXJTdGF0ZS5fY2xvc2VGbG93ID0gdm9pZCAwOwogIHJldHVybiBlZmZlY3RzLmNoZWNrKGJsYW5rTGluZSwgb25CbGFuaywgbm90QmxhbmspOwogIGZ1bmN0aW9uIG9uQmxhbmsoY29kZTQpIHsKICAgIHNlbGYyLmNvbnRhaW5lclN0YXRlLmZ1cnRoZXJCbGFua0xpbmVzID0gc2VsZjIuY29udGFpbmVyU3RhdGUuZnVydGhlckJsYW5rTGluZXMgfHwgc2VsZjIuY29udGFpbmVyU3RhdGUuaW5pdGlhbEJsYW5rTGluZTsKICAgIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgb2szLCAibGlzdEl0ZW1JbmRlbnQiLCBzZWxmMi5jb250YWluZXJTdGF0ZS5zaXplICsgMSkoY29kZTQpOwogIH0KICBfX25hbWUob25CbGFuaywgIm9uQmxhbmsiKTsKICBmdW5jdGlvbiBub3RCbGFuayhjb2RlNCkgewogICAgaWYgKHNlbGYyLmNvbnRhaW5lclN0YXRlLmZ1cnRoZXJCbGFua0xpbmVzIHx8ICFtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICBzZWxmMi5jb250YWluZXJTdGF0ZS5mdXJ0aGVyQmxhbmtMaW5lcyA9IHZvaWQgMDsKICAgICAgc2VsZjIuY29udGFpbmVyU3RhdGUuaW5pdGlhbEJsYW5rTGluZSA9IHZvaWQgMDsKICAgICAgcmV0dXJuIG5vdEluQ3VycmVudEl0ZW0oY29kZTQpOwogICAgfQogICAgc2VsZjIuY29udGFpbmVyU3RhdGUuZnVydGhlckJsYW5rTGluZXMgPSB2b2lkIDA7CiAgICBzZWxmMi5jb250YWluZXJTdGF0ZS5pbml0aWFsQmxhbmtMaW5lID0gdm9pZCAwOwogICAgcmV0dXJuIGVmZmVjdHMuYXR0ZW1wdChpbmRlbnRDb25zdHJ1Y3QsIG9rMywgbm90SW5DdXJyZW50SXRlbSkoY29kZTQpOwogIH0KICBfX25hbWUobm90QmxhbmssICJub3RCbGFuayIpOwogIGZ1bmN0aW9uIG5vdEluQ3VycmVudEl0ZW0oY29kZTQpIHsKICAgIHNlbGYyLmNvbnRhaW5lclN0YXRlLl9jbG9zZUZsb3cgPSB0cnVlOwogICAgc2VsZjIuaW50ZXJydXB0ID0gdm9pZCAwOwogICAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBlZmZlY3RzLmF0dGVtcHQobGlzdDMsIG9rMywgbm9rKSwgImxpbmVQcmVmaXgiLCBzZWxmMi5wYXJzZXIuY29uc3RydWN0cy5kaXNhYmxlLm51bGwuaW5jbHVkZXMoImNvZGVJbmRlbnRlZCIpID8gdm9pZCAwIDogNCkoY29kZTQpOwogIH0KICBfX25hbWUobm90SW5DdXJyZW50SXRlbSwgIm5vdEluQ3VycmVudEl0ZW0iKTsKfQpfX25hbWUodG9rZW5pemVMaXN0Q29udGludWF0aW9uLCAidG9rZW5pemVMaXN0Q29udGludWF0aW9uIik7CmZ1bmN0aW9uIHRva2VuaXplSW5kZW50KGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgYWZ0ZXJQcmVmaXgsICJsaXN0SXRlbUluZGVudCIsIHNlbGYyLmNvbnRhaW5lclN0YXRlLnNpemUgKyAxKTsKICBmdW5jdGlvbiBhZnRlclByZWZpeChjb2RlNCkgewogICAgY29uc3QgdGFpbCA9IHNlbGYyLmV2ZW50c1tzZWxmMi5ldmVudHMubGVuZ3RoIC0gMV07CiAgICByZXR1cm4gdGFpbCAmJiB0YWlsWzFdLnR5cGUgPT09ICJsaXN0SXRlbUluZGVudCIgJiYgdGFpbFsyXS5zbGljZVNlcmlhbGl6ZSh0YWlsWzFdLCB0cnVlKS5sZW5ndGggPT09IHNlbGYyLmNvbnRhaW5lclN0YXRlLnNpemUgPyBvazMoY29kZTQpIDogbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKGFmdGVyUHJlZml4LCAiYWZ0ZXJQcmVmaXgiKTsKfQpfX25hbWUodG9rZW5pemVJbmRlbnQsICJ0b2tlbml6ZUluZGVudCIpOwpmdW5jdGlvbiB0b2tlbml6ZUxpc3RFbmQoZWZmZWN0cykgewogIGVmZmVjdHMuZXhpdCh0aGlzLmNvbnRhaW5lclN0YXRlLnR5cGUpOwp9Cl9fbmFtZSh0b2tlbml6ZUxpc3RFbmQsICJ0b2tlbml6ZUxpc3RFbmQiKTsKZnVuY3Rpb24gdG9rZW5pemVMaXN0SXRlbVByZWZpeFdoaXRlc3BhY2UoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBhZnRlclByZWZpeCwgImxpc3RJdGVtUHJlZml4V2hpdGVzcGFjZSIsIHNlbGYyLnBhcnNlci5jb25zdHJ1Y3RzLmRpc2FibGUubnVsbC5pbmNsdWRlcygiY29kZUluZGVudGVkIikgPyB2b2lkIDAgOiA0ICsgMSk7CiAgZnVuY3Rpb24gYWZ0ZXJQcmVmaXgoY29kZTQpIHsKICAgIGNvbnN0IHRhaWwgPSBzZWxmMi5ldmVudHNbc2VsZjIuZXZlbnRzLmxlbmd0aCAtIDFdOwogICAgcmV0dXJuICFtYXJrZG93blNwYWNlKGNvZGU0KSAmJiB0YWlsICYmIHRhaWxbMV0udHlwZSA9PT0gImxpc3RJdGVtUHJlZml4V2hpdGVzcGFjZSIgPyBvazMoY29kZTQpIDogbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKGFmdGVyUHJlZml4LCAiYWZ0ZXJQcmVmaXgiKTsKfQpfX25hbWUodG9rZW5pemVMaXN0SXRlbVByZWZpeFdoaXRlc3BhY2UsICJ0b2tlbml6ZUxpc3RJdGVtUHJlZml4V2hpdGVzcGFjZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL3NldGV4dC11bmRlcmxpbmUuanMKdmFyIHNldGV4dFVuZGVybGluZSA9IHsKICBuYW1lOiAic2V0ZXh0VW5kZXJsaW5lIiwKICByZXNvbHZlVG86IHJlc29sdmVUb1NldGV4dFVuZGVybGluZSwKICB0b2tlbml6ZTogdG9rZW5pemVTZXRleHRVbmRlcmxpbmUKfTsKZnVuY3Rpb24gcmVzb2x2ZVRvU2V0ZXh0VW5kZXJsaW5lKGV2ZW50cywgY29udGV4dDIpIHsKICBsZXQgaW5kZXgyID0gZXZlbnRzLmxlbmd0aDsKICBsZXQgY29udGVudDM7CiAgbGV0IHRleHQ4OwogIGxldCBkZWZpbml0aW9uMzsKICB3aGlsZSAoaW5kZXgyLS0pIHsKICAgIGlmIChldmVudHNbaW5kZXgyXVswXSA9PT0gImVudGVyIikgewogICAgICBpZiAoZXZlbnRzW2luZGV4Ml1bMV0udHlwZSA9PT0gImNvbnRlbnQiKSB7CiAgICAgICAgY29udGVudDMgPSBpbmRleDI7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKGV2ZW50c1tpbmRleDJdWzFdLnR5cGUgPT09ICJwYXJhZ3JhcGgiKSB7CiAgICAgICAgdGV4dDggPSBpbmRleDI7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmIChldmVudHNbaW5kZXgyXVsxXS50eXBlID09PSAiY29udGVudCIpIHsKICAgICAgICBldmVudHMuc3BsaWNlKGluZGV4MiwgMSk7CiAgICAgIH0KICAgICAgaWYgKCFkZWZpbml0aW9uMyAmJiBldmVudHNbaW5kZXgyXVsxXS50eXBlID09PSAiZGVmaW5pdGlvbiIpIHsKICAgICAgICBkZWZpbml0aW9uMyA9IGluZGV4MjsKICAgICAgfQogICAgfQogIH0KICBjb25zdCBoZWFkaW5nMyA9IHsKICAgIHR5cGU6ICJzZXRleHRIZWFkaW5nIiwKICAgIHN0YXJ0OiB7CiAgICAgIC4uLmV2ZW50c1tjb250ZW50M11bMV0uc3RhcnQKICAgIH0sCiAgICBlbmQ6IHsKICAgICAgLi4uZXZlbnRzW2V2ZW50cy5sZW5ndGggLSAxXVsxXS5lbmQKICAgIH0KICB9OwogIGV2ZW50c1t0ZXh0OF1bMV0udHlwZSA9ICJzZXRleHRIZWFkaW5nVGV4dCI7CiAgaWYgKGRlZmluaXRpb24zKSB7CiAgICBldmVudHMuc3BsaWNlKHRleHQ4LCAwLCBbImVudGVyIiwgaGVhZGluZzMsIGNvbnRleHQyXSk7CiAgICBldmVudHMuc3BsaWNlKGRlZmluaXRpb24zICsgMSwgMCwgWyJleGl0IiwgZXZlbnRzW2NvbnRlbnQzXVsxXSwgY29udGV4dDJdKTsKICAgIGV2ZW50c1tjb250ZW50M11bMV0uZW5kID0gewogICAgICAuLi5ldmVudHNbZGVmaW5pdGlvbjNdWzFdLmVuZAogICAgfTsKICB9IGVsc2UgewogICAgZXZlbnRzW2NvbnRlbnQzXVsxXSA9IGhlYWRpbmczOwogIH0KICBldmVudHMucHVzaChbImV4aXQiLCBoZWFkaW5nMywgY29udGV4dDJdKTsKICByZXR1cm4gZXZlbnRzOwp9Cl9fbmFtZShyZXNvbHZlVG9TZXRleHRVbmRlcmxpbmUsICJyZXNvbHZlVG9TZXRleHRVbmRlcmxpbmUiKTsKZnVuY3Rpb24gdG9rZW5pemVTZXRleHRVbmRlcmxpbmUoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgbGV0IG1hcmtlcjsKICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIGxldCBpbmRleDIgPSBzZWxmMi5ldmVudHMubGVuZ3RoOwogICAgbGV0IHBhcmFncmFwaDM7CiAgICB3aGlsZSAoaW5kZXgyLS0pIHsKICAgICAgaWYgKHNlbGYyLmV2ZW50c1tpbmRleDJdWzFdLnR5cGUgIT09ICJsaW5lRW5kaW5nIiAmJiBzZWxmMi5ldmVudHNbaW5kZXgyXVsxXS50eXBlICE9PSAibGluZVByZWZpeCIgJiYgc2VsZjIuZXZlbnRzW2luZGV4Ml1bMV0udHlwZSAhPT0gImNvbnRlbnQiKSB7CiAgICAgICAgcGFyYWdyYXBoMyA9IHNlbGYyLmV2ZW50c1tpbmRleDJdWzFdLnR5cGUgPT09ICJwYXJhZ3JhcGgiOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBpZiAoIXNlbGYyLnBhcnNlci5sYXp5W3NlbGYyLm5vdygpLmxpbmVdICYmIChzZWxmMi5pbnRlcnJ1cHQgfHwgcGFyYWdyYXBoMykpIHsKICAgICAgZWZmZWN0cy5lbnRlcigic2V0ZXh0SGVhZGluZ0xpbmUiKTsKICAgICAgbWFya2VyID0gY29kZTQ7CiAgICAgIHJldHVybiBiZWZvcmUoY29kZTQpOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZShzdGFydCwgInN0YXJ0Iik7CiAgZnVuY3Rpb24gYmVmb3JlKGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJzZXRleHRIZWFkaW5nTGluZVNlcXVlbmNlIik7CiAgICByZXR1cm4gaW5zaWRlKGNvZGU0KTsKICB9CiAgX19uYW1lKGJlZm9yZSwgImJlZm9yZSIpOwogIGZ1bmN0aW9uIGluc2lkZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBtYXJrZXIpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGluc2lkZTsKICAgIH0KICAgIGVmZmVjdHMuZXhpdCgic2V0ZXh0SGVhZGluZ0xpbmVTZXF1ZW5jZSIpOwogICAgcmV0dXJuIG1hcmtkb3duU3BhY2UoY29kZTQpID8gZmFjdG9yeVNwYWNlKGVmZmVjdHMsIGFmdGVyLCAibGluZVN1ZmZpeCIpKGNvZGU0KSA6IGFmdGVyKGNvZGU0KTsKICB9CiAgX19uYW1lKGluc2lkZSwgImluc2lkZSIpOwogIGZ1bmN0aW9uIGFmdGVyKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmV4aXQoInNldGV4dEhlYWRpbmdMaW5lIik7CiAgICAgIHJldHVybiBvazMoY29kZTQpOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZShhZnRlciwgImFmdGVyIik7Cn0KX19uYW1lKHRva2VuaXplU2V0ZXh0VW5kZXJsaW5lLCAidG9rZW5pemVTZXRleHRVbmRlcmxpbmUiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS1mb290bm90ZUAyLjEuMC9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tZm9vdG5vdGUvbGliL3N5bnRheC5qcwp2YXIgaW5kZW50MiA9IHsKICB0b2tlbml6ZTogdG9rZW5pemVJbmRlbnQyLAogIHBhcnRpYWw6IHRydWUKfTsKZnVuY3Rpb24gZ2ZtRm9vdG5vdGUoKSB7CiAgcmV0dXJuIHsKICAgIGRvY3VtZW50OiB7CiAgICAgIFs5MV06IHsKICAgICAgICBuYW1lOiAiZ2ZtRm9vdG5vdGVEZWZpbml0aW9uIiwKICAgICAgICB0b2tlbml6ZTogdG9rZW5pemVEZWZpbml0aW9uU3RhcnQsCiAgICAgICAgY29udGludWF0aW9uOiB7CiAgICAgICAgICB0b2tlbml6ZTogdG9rZW5pemVEZWZpbml0aW9uQ29udGludWF0aW9uCiAgICAgICAgfSwKICAgICAgICBleGl0OiBnZm1Gb290bm90ZURlZmluaXRpb25FbmQKICAgICAgfQogICAgfSwKICAgIHRleHQ6IHsKICAgICAgWzkxXTogewogICAgICAgIG5hbWU6ICJnZm1Gb290bm90ZUNhbGwiLAogICAgICAgIHRva2VuaXplOiB0b2tlbml6ZUdmbUZvb3Rub3RlQ2FsbAogICAgICB9LAogICAgICBbOTNdOiB7CiAgICAgICAgbmFtZTogImdmbVBvdGVudGlhbEZvb3Rub3RlQ2FsbCIsCiAgICAgICAgYWRkOiAiYWZ0ZXIiLAogICAgICAgIHRva2VuaXplOiB0b2tlbml6ZVBvdGVudGlhbEdmbUZvb3Rub3RlQ2FsbCwKICAgICAgICByZXNvbHZlVG86IHJlc29sdmVUb1BvdGVudGlhbEdmbUZvb3Rub3RlQ2FsbAogICAgICB9CiAgICB9CiAgfTsKfQpfX25hbWUoZ2ZtRm9vdG5vdGUsICJnZm1Gb290bm90ZSIpOwpmdW5jdGlvbiB0b2tlbml6ZVBvdGVudGlhbEdmbUZvb3Rub3RlQ2FsbChlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICBsZXQgaW5kZXgyID0gc2VsZjIuZXZlbnRzLmxlbmd0aDsKICBjb25zdCBkZWZpbmVkID0gc2VsZjIucGFyc2VyLmdmbUZvb3Rub3RlcyB8fCAoc2VsZjIucGFyc2VyLmdmbUZvb3Rub3RlcyA9IFtdKTsKICBsZXQgbGFiZWxTdGFydDsKICB3aGlsZSAoaW5kZXgyLS0pIHsKICAgIGNvbnN0IHRva2VuID0gc2VsZjIuZXZlbnRzW2luZGV4Ml1bMV07CiAgICBpZiAodG9rZW4udHlwZSA9PT0gImxhYmVsSW1hZ2UiKSB7CiAgICAgIGxhYmVsU3RhcnQgPSB0b2tlbjsKICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAodG9rZW4udHlwZSA9PT0gImdmbUZvb3Rub3RlQ2FsbCIgfHwgdG9rZW4udHlwZSA9PT0gImxhYmVsTGluayIgfHwgdG9rZW4udHlwZSA9PT0gImxhYmVsIiB8fCB0b2tlbi50eXBlID09PSAiaW1hZ2UiIHx8IHRva2VuLnR5cGUgPT09ICJsaW5rIikgewogICAgICBicmVhazsKICAgIH0KICB9CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBpZiAoIWxhYmVsU3RhcnQgfHwgIWxhYmVsU3RhcnQuX2JhbGFuY2VkKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgY29uc3QgaWQgPSBub3JtYWxpemVJZGVudGlmaWVyKHNlbGYyLnNsaWNlU2VyaWFsaXplKHsKICAgICAgc3RhcnQ6IGxhYmVsU3RhcnQuZW5kLAogICAgICBlbmQ6IHNlbGYyLm5vdygpCiAgICB9KSk7CiAgICBpZiAoaWQuY29kZVBvaW50QXQoMCkgIT09IDk0IHx8ICFkZWZpbmVkLmluY2x1ZGVzKGlkLnNsaWNlKDEpKSkgewogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuZW50ZXIoImdmbUZvb3Rub3RlQ2FsbExhYmVsTWFya2VyIik7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgZWZmZWN0cy5leGl0KCJnZm1Gb290bm90ZUNhbGxMYWJlbE1hcmtlciIpOwogICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgfQogIF9fbmFtZShzdGFydCwgInN0YXJ0Iik7Cn0KX19uYW1lKHRva2VuaXplUG90ZW50aWFsR2ZtRm9vdG5vdGVDYWxsLCAidG9rZW5pemVQb3RlbnRpYWxHZm1Gb290bm90ZUNhbGwiKTsKZnVuY3Rpb24gcmVzb2x2ZVRvUG90ZW50aWFsR2ZtRm9vdG5vdGVDYWxsKGV2ZW50cywgY29udGV4dDIpIHsKICBsZXQgaW5kZXgyID0gZXZlbnRzLmxlbmd0aDsKICBsZXQgbGFiZWxTdGFydDsKICB3aGlsZSAoaW5kZXgyLS0pIHsKICAgIGlmIChldmVudHNbaW5kZXgyXVsxXS50eXBlID09PSAibGFiZWxJbWFnZSIgJiYgZXZlbnRzW2luZGV4Ml1bMF0gPT09ICJlbnRlciIpIHsKICAgICAgbGFiZWxTdGFydCA9IGV2ZW50c1tpbmRleDJdWzFdOwogICAgICBicmVhazsKICAgIH0KICB9CiAgZXZlbnRzW2luZGV4MiArIDFdWzFdLnR5cGUgPSAiZGF0YSI7CiAgZXZlbnRzW2luZGV4MiArIDNdWzFdLnR5cGUgPSAiZ2ZtRm9vdG5vdGVDYWxsTGFiZWxNYXJrZXIiOwogIGNvbnN0IGNhbGwgPSB7CiAgICB0eXBlOiAiZ2ZtRm9vdG5vdGVDYWxsIiwKICAgIHN0YXJ0OiBPYmplY3QuYXNzaWduKHt9LCBldmVudHNbaW5kZXgyICsgM11bMV0uc3RhcnQpLAogICAgZW5kOiBPYmplY3QuYXNzaWduKHt9LCBldmVudHNbZXZlbnRzLmxlbmd0aCAtIDFdWzFdLmVuZCkKICB9OwogIGNvbnN0IG1hcmtlciA9IHsKICAgIHR5cGU6ICJnZm1Gb290bm90ZUNhbGxNYXJrZXIiLAogICAgc3RhcnQ6IE9iamVjdC5hc3NpZ24oe30sIGV2ZW50c1tpbmRleDIgKyAzXVsxXS5lbmQpLAogICAgZW5kOiBPYmplY3QuYXNzaWduKHt9LCBldmVudHNbaW5kZXgyICsgM11bMV0uZW5kKQogIH07CiAgbWFya2VyLmVuZC5jb2x1bW4rKzsKICBtYXJrZXIuZW5kLm9mZnNldCsrOwogIG1hcmtlci5lbmQuX2J1ZmZlckluZGV4Kys7CiAgY29uc3Qgc3RyaW5nMyA9IHsKICAgIHR5cGU6ICJnZm1Gb290bm90ZUNhbGxTdHJpbmciLAogICAgc3RhcnQ6IE9iamVjdC5hc3NpZ24oe30sIG1hcmtlci5lbmQpLAogICAgZW5kOiBPYmplY3QuYXNzaWduKHt9LCBldmVudHNbZXZlbnRzLmxlbmd0aCAtIDFdWzFdLnN0YXJ0KQogIH07CiAgY29uc3QgY2h1bmsgPSB7CiAgICB0eXBlOiAiY2h1bmtTdHJpbmciLAogICAgY29udGVudFR5cGU6ICJzdHJpbmciLAogICAgc3RhcnQ6IE9iamVjdC5hc3NpZ24oe30sIHN0cmluZzMuc3RhcnQpLAogICAgZW5kOiBPYmplY3QuYXNzaWduKHt9LCBzdHJpbmczLmVuZCkKICB9OwogIGNvbnN0IHJlcGxhY2VtZW50ID0gWwogICAgLy8gVGFrZSB0aGUgYGxhYmVsSW1hZ2VNYXJrZXJgIChub3cgYGRhdGFgLCB0aGUgYCFgKQogICAgZXZlbnRzW2luZGV4MiArIDFdLAogICAgZXZlbnRzW2luZGV4MiArIDJdLAogICAgWyJlbnRlciIsIGNhbGwsIGNvbnRleHQyXSwKICAgIC8vIFRoZSBgW2AKICAgIGV2ZW50c1tpbmRleDIgKyAzXSwKICAgIGV2ZW50c1tpbmRleDIgKyA0XSwKICAgIC8vIFRoZSBgXmAuCiAgICBbImVudGVyIiwgbWFya2VyLCBjb250ZXh0Ml0sCiAgICBbImV4aXQiLCBtYXJrZXIsIGNvbnRleHQyXSwKICAgIC8vIEV2ZXJ5dGhpbmcgaW4gYmV0d2Vlbi4KICAgIFsiZW50ZXIiLCBzdHJpbmczLCBjb250ZXh0Ml0sCiAgICBbImVudGVyIiwgY2h1bmssIGNvbnRleHQyXSwKICAgIFsiZXhpdCIsIGNodW5rLCBjb250ZXh0Ml0sCiAgICBbImV4aXQiLCBzdHJpbmczLCBjb250ZXh0Ml0sCiAgICAvLyBUaGUgZW5kaW5nIChgXWAsIHByb3Blcmx5IHBhcnNlZCBhbmQgbGFiZWxsZWQpLgogICAgZXZlbnRzW2V2ZW50cy5sZW5ndGggLSAyXSwKICAgIGV2ZW50c1tldmVudHMubGVuZ3RoIC0gMV0sCiAgICBbImV4aXQiLCBjYWxsLCBjb250ZXh0Ml0KICBdOwogIGV2ZW50cy5zcGxpY2UoaW5kZXgyLCBldmVudHMubGVuZ3RoIC0gaW5kZXgyICsgMSwgLi4ucmVwbGFjZW1lbnQpOwogIHJldHVybiBldmVudHM7Cn0KX19uYW1lKHJlc29sdmVUb1BvdGVudGlhbEdmbUZvb3Rub3RlQ2FsbCwgInJlc29sdmVUb1BvdGVudGlhbEdmbUZvb3Rub3RlQ2FsbCIpOwpmdW5jdGlvbiB0b2tlbml6ZUdmbUZvb3Rub3RlQ2FsbChlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICBjb25zdCBkZWZpbmVkID0gc2VsZjIucGFyc2VyLmdmbUZvb3Rub3RlcyB8fCAoc2VsZjIucGFyc2VyLmdmbUZvb3Rub3RlcyA9IFtdKTsKICBsZXQgc2l6ZSA9IDA7CiAgbGV0IGRhdGE7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJnZm1Gb290bm90ZUNhbGwiKTsKICAgIGVmZmVjdHMuZW50ZXIoImdmbUZvb3Rub3RlQ2FsbExhYmVsTWFya2VyIik7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgZWZmZWN0cy5leGl0KCJnZm1Gb290bm90ZUNhbGxMYWJlbE1hcmtlciIpOwogICAgcmV0dXJuIGNhbGxTdGFydDsKICB9CiAgX19uYW1lKHN0YXJ0LCAic3RhcnQiKTsKICBmdW5jdGlvbiBjYWxsU3RhcnQoY29kZTQpIHsKICAgIGlmIChjb2RlNCAhPT0gOTQpIHJldHVybiBub2soY29kZTQpOwogICAgZWZmZWN0cy5lbnRlcigiZ2ZtRm9vdG5vdGVDYWxsTWFya2VyIik7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgZWZmZWN0cy5leGl0KCJnZm1Gb290bm90ZUNhbGxNYXJrZXIiKTsKICAgIGVmZmVjdHMuZW50ZXIoImdmbUZvb3Rub3RlQ2FsbFN0cmluZyIpOwogICAgZWZmZWN0cy5lbnRlcigiY2h1bmtTdHJpbmciKS5jb250ZW50VHlwZSA9ICJzdHJpbmciOwogICAgcmV0dXJuIGNhbGxEYXRhOwogIH0KICBfX25hbWUoY2FsbFN0YXJ0LCAiY2FsbFN0YXJ0Iik7CiAgZnVuY3Rpb24gY2FsbERhdGEoY29kZTQpIHsKICAgIGlmICgKICAgICAgLy8gVG9vIGxvbmcuCiAgICAgIHNpemUgPiA5OTkgfHwgLy8gQ2xvc2luZyBicmFjZSB3aXRoIG5vdGhpbmcuCiAgICAgIGNvZGU0ID09PSA5MyAmJiAhZGF0YSB8fCAvLyBTcGFjZSBvciB0YWIgaXMgbm90IHN1cHBvcnRlZCBieSBHRk0gZm9yIHNvbWUgcmVhc29uLgogICAgICAvLyBgXG5gIGFuZCBgW2Agbm90IGJlaW5nIHN1cHBvcnRlZCBtYWtlcyBzZW5zZS4KICAgICAgY29kZTQgPT09IG51bGwgfHwgY29kZTQgPT09IDkxIHx8IG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpCiAgICApIHsKICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDkzKSB7CiAgICAgIGVmZmVjdHMuZXhpdCgiY2h1bmtTdHJpbmciKTsKICAgICAgY29uc3QgdG9rZW4gPSBlZmZlY3RzLmV4aXQoImdmbUZvb3Rub3RlQ2FsbFN0cmluZyIpOwogICAgICBpZiAoIWRlZmluZWQuaW5jbHVkZXMobm9ybWFsaXplSWRlbnRpZmllcihzZWxmMi5zbGljZVNlcmlhbGl6ZSh0b2tlbikpKSkgewogICAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgICB9CiAgICAgIGVmZmVjdHMuZW50ZXIoImdmbUZvb3Rub3RlQ2FsbExhYmVsTWFya2VyIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgiZ2ZtRm9vdG5vdGVDYWxsTGFiZWxNYXJrZXIiKTsKICAgICAgZWZmZWN0cy5leGl0KCJnZm1Gb290bm90ZUNhbGwiKTsKICAgICAgcmV0dXJuIG9rMzsKICAgIH0KICAgIGlmICghbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlNCkpIHsKICAgICAgZGF0YSA9IHRydWU7CiAgICB9CiAgICBzaXplKys7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIGNvZGU0ID09PSA5MiA/IGNhbGxFc2NhcGUgOiBjYWxsRGF0YTsKICB9CiAgX19uYW1lKGNhbGxEYXRhLCAiY2FsbERhdGEiKTsKICBmdW5jdGlvbiBjYWxsRXNjYXBlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDkxIHx8IGNvZGU0ID09PSA5MiB8fCBjb2RlNCA9PT0gOTMpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgc2l6ZSsrOwogICAgICByZXR1cm4gY2FsbERhdGE7CiAgICB9CiAgICByZXR1cm4gY2FsbERhdGEoY29kZTQpOwogIH0KICBfX25hbWUoY2FsbEVzY2FwZSwgImNhbGxFc2NhcGUiKTsKfQpfX25hbWUodG9rZW5pemVHZm1Gb290bm90ZUNhbGwsICJ0b2tlbml6ZUdmbUZvb3Rub3RlQ2FsbCIpOwpmdW5jdGlvbiB0b2tlbml6ZURlZmluaXRpb25TdGFydChlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICBjb25zdCBkZWZpbmVkID0gc2VsZjIucGFyc2VyLmdmbUZvb3Rub3RlcyB8fCAoc2VsZjIucGFyc2VyLmdmbUZvb3Rub3RlcyA9IFtdKTsKICBsZXQgaWRlbnRpZmllcjsKICBsZXQgc2l6ZSA9IDA7CiAgbGV0IGRhdGE7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJnZm1Gb290bm90ZURlZmluaXRpb24iKS5fY29udGFpbmVyID0gdHJ1ZTsKICAgIGVmZmVjdHMuZW50ZXIoImdmbUZvb3Rub3RlRGVmaW5pdGlvbkxhYmVsIik7CiAgICBlZmZlY3RzLmVudGVyKCJnZm1Gb290bm90ZURlZmluaXRpb25MYWJlbE1hcmtlciIpOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIGVmZmVjdHMuZXhpdCgiZ2ZtRm9vdG5vdGVEZWZpbml0aW9uTGFiZWxNYXJrZXIiKTsKICAgIHJldHVybiBsYWJlbEF0TWFya2VyOwogIH0KICBfX25hbWUoc3RhcnQsICJzdGFydCIpOwogIGZ1bmN0aW9uIGxhYmVsQXRNYXJrZXIoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gOTQpIHsKICAgICAgZWZmZWN0cy5lbnRlcigiZ2ZtRm9vdG5vdGVEZWZpbml0aW9uTWFya2VyIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgiZ2ZtRm9vdG5vdGVEZWZpbml0aW9uTWFya2VyIik7CiAgICAgIGVmZmVjdHMuZW50ZXIoImdmbUZvb3Rub3RlRGVmaW5pdGlvbkxhYmVsU3RyaW5nIik7CiAgICAgIGVmZmVjdHMuZW50ZXIoImNodW5rU3RyaW5nIikuY29udGVudFR5cGUgPSAic3RyaW5nIjsKICAgICAgcmV0dXJuIGxhYmVsSW5zaWRlOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZShsYWJlbEF0TWFya2VyLCAibGFiZWxBdE1hcmtlciIpOwogIGZ1bmN0aW9uIGxhYmVsSW5zaWRlKGNvZGU0KSB7CiAgICBpZiAoCiAgICAgIC8vIFRvbyBsb25nLgogICAgICBzaXplID4gOTk5IHx8IC8vIENsb3NpbmcgYnJhY2Ugd2l0aCBub3RoaW5nLgogICAgICBjb2RlNCA9PT0gOTMgJiYgIWRhdGEgfHwgLy8gU3BhY2Ugb3IgdGFiIGlzIG5vdCBzdXBwb3J0ZWQgYnkgR0ZNIGZvciBzb21lIHJlYXNvbi4KICAgICAgLy8gYFxuYCBhbmQgYFtgIG5vdCBiZWluZyBzdXBwb3J0ZWQgbWFrZXMgc2Vuc2UuCiAgICAgIGNvZGU0ID09PSBudWxsIHx8IGNvZGU0ID09PSA5MSB8fCBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlKGNvZGU0KQogICAgKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA5MykgewogICAgICBlZmZlY3RzLmV4aXQoImNodW5rU3RyaW5nIik7CiAgICAgIGNvbnN0IHRva2VuID0gZWZmZWN0cy5leGl0KCJnZm1Gb290bm90ZURlZmluaXRpb25MYWJlbFN0cmluZyIpOwogICAgICBpZGVudGlmaWVyID0gbm9ybWFsaXplSWRlbnRpZmllcihzZWxmMi5zbGljZVNlcmlhbGl6ZSh0b2tlbikpOwogICAgICBlZmZlY3RzLmVudGVyKCJnZm1Gb290bm90ZURlZmluaXRpb25MYWJlbE1hcmtlciIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoImdmbUZvb3Rub3RlRGVmaW5pdGlvbkxhYmVsTWFya2VyIik7CiAgICAgIGVmZmVjdHMuZXhpdCgiZ2ZtRm9vdG5vdGVEZWZpbml0aW9uTGFiZWwiKTsKICAgICAgcmV0dXJuIGxhYmVsQWZ0ZXI7CiAgICB9CiAgICBpZiAoIW1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpKSB7CiAgICAgIGRhdGEgPSB0cnVlOwogICAgfQogICAgc2l6ZSsrOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBjb2RlNCA9PT0gOTIgPyBsYWJlbEVzY2FwZSA6IGxhYmVsSW5zaWRlOwogIH0KICBfX25hbWUobGFiZWxJbnNpZGUsICJsYWJlbEluc2lkZSIpOwogIGZ1bmN0aW9uIGxhYmVsRXNjYXBlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDkxIHx8IGNvZGU0ID09PSA5MiB8fCBjb2RlNCA9PT0gOTMpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgc2l6ZSsrOwogICAgICByZXR1cm4gbGFiZWxJbnNpZGU7CiAgICB9CiAgICByZXR1cm4gbGFiZWxJbnNpZGUoY29kZTQpOwogIH0KICBfX25hbWUobGFiZWxFc2NhcGUsICJsYWJlbEVzY2FwZSIpOwogIGZ1bmN0aW9uIGxhYmVsQWZ0ZXIoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNTgpIHsKICAgICAgZWZmZWN0cy5lbnRlcigiZGVmaW5pdGlvbk1hcmtlciIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoImRlZmluaXRpb25NYXJrZXIiKTsKICAgICAgaWYgKCFkZWZpbmVkLmluY2x1ZGVzKGlkZW50aWZpZXIpKSB7CiAgICAgICAgZGVmaW5lZC5wdXNoKGlkZW50aWZpZXIpOwogICAgICB9CiAgICAgIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgd2hpdGVzcGFjZUFmdGVyLCAiZ2ZtRm9vdG5vdGVEZWZpbml0aW9uV2hpdGVzcGFjZSIpOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZShsYWJlbEFmdGVyLCAibGFiZWxBZnRlciIpOwogIGZ1bmN0aW9uIHdoaXRlc3BhY2VBZnRlcihjb2RlNCkgewogICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgfQogIF9fbmFtZSh3aGl0ZXNwYWNlQWZ0ZXIsICJ3aGl0ZXNwYWNlQWZ0ZXIiKTsKfQpfX25hbWUodG9rZW5pemVEZWZpbml0aW9uU3RhcnQsICJ0b2tlbml6ZURlZmluaXRpb25TdGFydCIpOwpmdW5jdGlvbiB0b2tlbml6ZURlZmluaXRpb25Db250aW51YXRpb24oZWZmZWN0cywgb2szLCBub2spIHsKICByZXR1cm4gZWZmZWN0cy5jaGVjayhibGFua0xpbmUsIG9rMywgZWZmZWN0cy5hdHRlbXB0KGluZGVudDIsIG9rMywgbm9rKSk7Cn0KX19uYW1lKHRva2VuaXplRGVmaW5pdGlvbkNvbnRpbnVhdGlvbiwgInRva2VuaXplRGVmaW5pdGlvbkNvbnRpbnVhdGlvbiIpOwpmdW5jdGlvbiBnZm1Gb290bm90ZURlZmluaXRpb25FbmQoZWZmZWN0cykgewogIGVmZmVjdHMuZXhpdCgiZ2ZtRm9vdG5vdGVEZWZpbml0aW9uIik7Cn0KX19uYW1lKGdmbUZvb3Rub3RlRGVmaW5pdGlvbkVuZCwgImdmbUZvb3Rub3RlRGVmaW5pdGlvbkVuZCIpOwpmdW5jdGlvbiB0b2tlbml6ZUluZGVudDIoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBhZnRlclByZWZpeCwgImdmbUZvb3Rub3RlRGVmaW5pdGlvbkluZGVudCIsIDQgKyAxKTsKICBmdW5jdGlvbiBhZnRlclByZWZpeChjb2RlNCkgewogICAgY29uc3QgdGFpbCA9IHNlbGYyLmV2ZW50c1tzZWxmMi5ldmVudHMubGVuZ3RoIC0gMV07CiAgICByZXR1cm4gdGFpbCAmJiB0YWlsWzFdLnR5cGUgPT09ICJnZm1Gb290bm90ZURlZmluaXRpb25JbmRlbnQiICYmIHRhaWxbMl0uc2xpY2VTZXJpYWxpemUodGFpbFsxXSwgdHJ1ZSkubGVuZ3RoID09PSA0ID8gb2szKGNvZGU0KSA6IG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZShhZnRlclByZWZpeCwgImFmdGVyUHJlZml4Iik7Cn0KX19uYW1lKHRva2VuaXplSW5kZW50MiwgInRva2VuaXplSW5kZW50Iik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tZm9vdG5vdGVAMi4xLjAvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLWZvb3Rub3RlL2xpYi9odG1sLmpzCnZhciBvd240ID0ge30uaGFzT3duUHJvcGVydHk7CnZhciBlbXB0eU9wdGlvbnMyID0ge307CmZ1bmN0aW9uIGRlZmF1bHRCYWNrTGFiZWwocmVmZXJlbmNlSW5kZXgsIHJlcmVmZXJlbmNlSW5kZXgpIHsKICByZXR1cm4gIkJhY2sgdG8gcmVmZXJlbmNlICIgKyAocmVmZXJlbmNlSW5kZXggKyAxKSArIChyZXJlZmVyZW5jZUluZGV4ID4gMSA/ICItIiArIHJlcmVmZXJlbmNlSW5kZXggOiAiIik7Cn0KX19uYW1lKGRlZmF1bHRCYWNrTGFiZWwsICJkZWZhdWx0QmFja0xhYmVsIik7CmZ1bmN0aW9uIGdmbUZvb3Rub3RlSHRtbChvcHRpb25zKSB7CiAgY29uc3QgY29uZmlnMiA9IG9wdGlvbnMgfHwgZW1wdHlPcHRpb25zMjsKICBjb25zdCBsYWJlbCA9IGNvbmZpZzIubGFiZWwgfHwgIkZvb3Rub3RlcyI7CiAgY29uc3QgbGFiZWxUYWdOYW1lID0gY29uZmlnMi5sYWJlbFRhZ05hbWUgfHwgImgyIjsKICBjb25zdCBsYWJlbEF0dHJpYnV0ZXMgPSBjb25maWcyLmxhYmVsQXR0cmlidXRlcyA9PT0gbnVsbCB8fCBjb25maWcyLmxhYmVsQXR0cmlidXRlcyA9PT0gdm9pZCAwID8gJ2NsYXNzPSJzci1vbmx5IicgOiBjb25maWcyLmxhYmVsQXR0cmlidXRlczsKICBjb25zdCBiYWNrTGFiZWwgPSBjb25maWcyLmJhY2tMYWJlbCB8fCBkZWZhdWx0QmFja0xhYmVsOwogIGNvbnN0IGNsb2JiZXJQcmVmaXggPSBjb25maWcyLmNsb2JiZXJQcmVmaXggPT09IG51bGwgfHwgY29uZmlnMi5jbG9iYmVyUHJlZml4ID09PSB2b2lkIDAgPyAidXNlci1jb250ZW50LSIgOiBjb25maWcyLmNsb2JiZXJQcmVmaXg7CiAgcmV0dXJuIHsKICAgIGVudGVyOiB7CiAgICAgIGdmbUZvb3Rub3RlRGVmaW5pdGlvbigpIHsKICAgICAgICBjb25zdCBzdGFjayA9IHRoaXMuZ2V0RGF0YSgidGlnaHRTdGFjayIpOwogICAgICAgIHN0YWNrLnB1c2goZmFsc2UpOwogICAgICB9LAogICAgICBnZm1Gb290bm90ZURlZmluaXRpb25MYWJlbFN0cmluZygpIHsKICAgICAgICB0aGlzLmJ1ZmZlcigpOwogICAgICB9LAogICAgICBnZm1Gb290bm90ZUNhbGxTdHJpbmcoKSB7CiAgICAgICAgdGhpcy5idWZmZXIoKTsKICAgICAgfQogICAgfSwKICAgIGV4aXQ6IHsKICAgICAgZ2ZtRm9vdG5vdGVEZWZpbml0aW9uKCkgewogICAgICAgIGxldCBkZWZpbml0aW9ucyA9IHRoaXMuZ2V0RGF0YSgiZ2ZtRm9vdG5vdGVEZWZpbml0aW9ucyIpOwogICAgICAgIGNvbnN0IGZvb3Rub3RlU3RhY2sgPSB0aGlzLmdldERhdGEoImdmbUZvb3Rub3RlRGVmaW5pdGlvblN0YWNrIik7CiAgICAgICAgY29uc3QgdGlnaHRTdGFjayA9IHRoaXMuZ2V0RGF0YSgidGlnaHRTdGFjayIpOwogICAgICAgIGNvbnN0IGN1cnJlbnQgPSBmb290bm90ZVN0YWNrLnBvcCgpOwogICAgICAgIGNvbnN0IHZhbHVlMiA9IHRoaXMucmVzdW1lKCk7CiAgICAgICAgaWYgKCFkZWZpbml0aW9ucykgewogICAgICAgICAgdGhpcy5zZXREYXRhKCJnZm1Gb290bm90ZURlZmluaXRpb25zIiwgZGVmaW5pdGlvbnMgPSB7fSk7CiAgICAgICAgfQogICAgICAgIGlmICghb3duNC5jYWxsKGRlZmluaXRpb25zLCBjdXJyZW50KSkgZGVmaW5pdGlvbnNbY3VycmVudF0gPSB2YWx1ZTI7CiAgICAgICAgdGlnaHRTdGFjay5wb3AoKTsKICAgICAgICB0aGlzLnNldERhdGEoInNsdXJwT25lTGluZUVuZGluZyIsIHRydWUpOwogICAgICAgIHRoaXMuc2V0RGF0YSgibGFzdFdhc1RhZyIpOwogICAgICB9LAogICAgICBnZm1Gb290bm90ZURlZmluaXRpb25MYWJlbFN0cmluZyh0b2tlbikgewogICAgICAgIGxldCBmb290bm90ZVN0YWNrID0gdGhpcy5nZXREYXRhKCJnZm1Gb290bm90ZURlZmluaXRpb25TdGFjayIpOwogICAgICAgIGlmICghZm9vdG5vdGVTdGFjaykgewogICAgICAgICAgdGhpcy5zZXREYXRhKCJnZm1Gb290bm90ZURlZmluaXRpb25TdGFjayIsIGZvb3Rub3RlU3RhY2sgPSBbXSk7CiAgICAgICAgfQogICAgICAgIGZvb3Rub3RlU3RhY2sucHVzaChub3JtYWxpemVJZGVudGlmaWVyKHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pKSk7CiAgICAgICAgdGhpcy5yZXN1bWUoKTsKICAgICAgICB0aGlzLmJ1ZmZlcigpOwogICAgICB9LAogICAgICBnZm1Gb290bm90ZUNhbGxTdHJpbmcodG9rZW4pIHsKICAgICAgICBsZXQgY2FsbHMgPSB0aGlzLmdldERhdGEoImdmbUZvb3Rub3RlQ2FsbE9yZGVyIik7CiAgICAgICAgbGV0IGNvdW50cyA9IHRoaXMuZ2V0RGF0YSgiZ2ZtRm9vdG5vdGVDYWxsQ291bnRzIik7CiAgICAgICAgY29uc3QgaWQgPSBub3JtYWxpemVJZGVudGlmaWVyKHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pKTsKICAgICAgICBsZXQgY291bnRlcjsKICAgICAgICB0aGlzLnJlc3VtZSgpOwogICAgICAgIGlmICghY2FsbHMpIHRoaXMuc2V0RGF0YSgiZ2ZtRm9vdG5vdGVDYWxsT3JkZXIiLCBjYWxscyA9IFtdKTsKICAgICAgICBpZiAoIWNvdW50cykgdGhpcy5zZXREYXRhKCJnZm1Gb290bm90ZUNhbGxDb3VudHMiLCBjb3VudHMgPSB7fSk7CiAgICAgICAgY29uc3QgaW5kZXgyID0gY2FsbHMuaW5kZXhPZihpZCk7CiAgICAgICAgY29uc3Qgc2FmZUlkID0gc2FuaXRpemVVcmkoaWQudG9Mb3dlckNhc2UoKSk7CiAgICAgICAgaWYgKGluZGV4MiA9PT0gLTEpIHsKICAgICAgICAgIGNhbGxzLnB1c2goaWQpOwogICAgICAgICAgY291bnRzW2lkXSA9IDE7CiAgICAgICAgICBjb3VudGVyID0gY2FsbHMubGVuZ3RoOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb3VudHNbaWRdKys7CiAgICAgICAgICBjb3VudGVyID0gaW5kZXgyICsgMTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmV1c2VDb3VudGVyID0gY291bnRzW2lkXTsKICAgICAgICB0aGlzLnRhZygnPHN1cD48YSBocmVmPSIjJyArIGNsb2JiZXJQcmVmaXggKyAiZm4tIiArIHNhZmVJZCArICciIGlkPSInICsgY2xvYmJlclByZWZpeCArICJmbnJlZi0iICsgc2FmZUlkICsgKHJldXNlQ291bnRlciA+IDEgPyAiLSIgKyByZXVzZUNvdW50ZXIgOiAiIikgKyAnIiBkYXRhLWZvb3Rub3RlLXJlZj0iIiBhcmlhLWRlc2NyaWJlZGJ5PSJmb290bm90ZS1sYWJlbCI+JyArIFN0cmluZyhjb3VudGVyKSArICI8L2E+PC9zdXA+Iik7CiAgICAgIH0sCiAgICAgIG51bGwoKSB7CiAgICAgICAgY29uc3QgY2FsbHMgPSB0aGlzLmdldERhdGEoImdmbUZvb3Rub3RlQ2FsbE9yZGVyIikgfHwgW107CiAgICAgICAgY29uc3QgY291bnRzID0gdGhpcy5nZXREYXRhKCJnZm1Gb290bm90ZUNhbGxDb3VudHMiKSB8fCB7fTsKICAgICAgICBjb25zdCBkZWZpbml0aW9ucyA9IHRoaXMuZ2V0RGF0YSgiZ2ZtRm9vdG5vdGVEZWZpbml0aW9ucyIpIHx8IHt9OwogICAgICAgIGxldCBpbmRleDIgPSAtMTsKICAgICAgICBpZiAoY2FsbHMubGVuZ3RoID4gMCkgewogICAgICAgICAgdGhpcy5saW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgICAgICAgIHRoaXMudGFnKCc8c2VjdGlvbiBkYXRhLWZvb3Rub3Rlcz0iIiBjbGFzcz0iZm9vdG5vdGVzIj48JyArIGxhYmVsVGFnTmFtZSArICcgaWQ9ImZvb3Rub3RlLWxhYmVsIicgKyAobGFiZWxBdHRyaWJ1dGVzID8gIiAiICsgbGFiZWxBdHRyaWJ1dGVzIDogIiIpICsgIj4iKTsKICAgICAgICAgIHRoaXMucmF3KHRoaXMuZW5jb2RlKGxhYmVsKSk7CiAgICAgICAgICB0aGlzLnRhZygiPC8iICsgbGFiZWxUYWdOYW1lICsgIj4iKTsKICAgICAgICAgIHRoaXMubGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICAgICAgICB0aGlzLnRhZygiPG9sPiIpOwogICAgICAgIH0KICAgICAgICB3aGlsZSAoKytpbmRleDIgPCBjYWxscy5sZW5ndGgpIHsKICAgICAgICAgIGNvbnN0IGlkID0gY2FsbHNbaW5kZXgyXTsKICAgICAgICAgIGNvbnN0IHNhZmVJZCA9IHNhbml0aXplVXJpKGlkLnRvTG93ZXJDYXNlKCkpOwogICAgICAgICAgbGV0IHJlZmVyZW5jZUluZGV4ID0gMDsKICAgICAgICAgIGNvbnN0IHJlZmVyZW5jZXMgPSBbXTsKICAgICAgICAgIHdoaWxlICgrK3JlZmVyZW5jZUluZGV4IDw9IGNvdW50c1tpZF0pIHsKICAgICAgICAgICAgcmVmZXJlbmNlcy5wdXNoKCc8YSBocmVmPSIjJyArIGNsb2JiZXJQcmVmaXggKyAiZm5yZWYtIiArIHNhZmVJZCArIChyZWZlcmVuY2VJbmRleCA+IDEgPyAiLSIgKyByZWZlcmVuY2VJbmRleCA6ICIiKSArICciIGRhdGEtZm9vdG5vdGUtYmFja3JlZj0iIiBhcmlhLWxhYmVsPSInICsgdGhpcy5lbmNvZGUodHlwZW9mIGJhY2tMYWJlbCA9PT0gInN0cmluZyIgPyBiYWNrTGFiZWwgOiBiYWNrTGFiZWwoaW5kZXgyLCByZWZlcmVuY2VJbmRleCkpICsgJyIgY2xhc3M9ImRhdGEtZm9vdG5vdGUtYmFja3JlZiI+XHUyMUE5JyArIChyZWZlcmVuY2VJbmRleCA+IDEgPyAiPHN1cD4iICsgcmVmZXJlbmNlSW5kZXggKyAiPC9zdXA+IiA6ICIiKSArICI8L2E+Iik7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCByZWZlcmVuY2UgPSByZWZlcmVuY2VzLmpvaW4oIiAiKTsKICAgICAgICAgIGxldCBpbmplY3RlZCA9IGZhbHNlOwogICAgICAgICAgdGhpcy5saW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgICAgICAgIHRoaXMudGFnKCc8bGkgaWQ9IicgKyBjbG9iYmVyUHJlZml4ICsgImZuLSIgKyBzYWZlSWQgKyAnIj4nKTsKICAgICAgICAgIHRoaXMubGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICAgICAgICB0aGlzLnRhZyhkZWZpbml0aW9uc1tpZF0ucmVwbGFjZSgvPFwvcD4oPzpccj9cbnxccik/JC8sIGZ1bmN0aW9uKCQwKSB7CiAgICAgICAgICAgIGluamVjdGVkID0gdHJ1ZTsKICAgICAgICAgICAgcmV0dXJuICIgIiArIHJlZmVyZW5jZSArICQwOwogICAgICAgICAgfSkpOwogICAgICAgICAgaWYgKCFpbmplY3RlZCkgewogICAgICAgICAgICB0aGlzLmxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgICAgICAgICB0aGlzLnRhZyhyZWZlcmVuY2UpOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5saW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgICAgICAgIHRoaXMudGFnKCI8L2xpPiIpOwogICAgICAgIH0KICAgICAgICBpZiAoY2FsbHMubGVuZ3RoID4gMCkgewogICAgICAgICAgdGhpcy5saW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgICAgICAgIHRoaXMudGFnKCI8L29sPiIpOwogICAgICAgICAgdGhpcy5saW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgICAgICAgIHRoaXMudGFnKCI8L3NlY3Rpb24+Iik7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfTsKfQpfX25hbWUoZ2ZtRm9vdG5vdGVIdG1sLCAiZ2ZtRm9vdG5vdGVIdG1sIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tc3RyaWtldGhyb3VnaEAyLjEuMC9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tc3RyaWtldGhyb3VnaC9saWIvaHRtbC5qcwpmdW5jdGlvbiBnZm1TdHJpa2V0aHJvdWdoSHRtbCgpIHsKICByZXR1cm4gewogICAgZW50ZXI6IHsKICAgICAgc3RyaWtldGhyb3VnaCgpIHsKICAgICAgICB0aGlzLnRhZygiPGRlbD4iKTsKICAgICAgfQogICAgfSwKICAgIGV4aXQ6IHsKICAgICAgc3RyaWtldGhyb3VnaCgpIHsKICAgICAgICB0aGlzLnRhZygiPC9kZWw+Iik7CiAgICAgIH0KICAgIH0KICB9Owp9Cl9fbmFtZShnZm1TdHJpa2V0aHJvdWdoSHRtbCwgImdmbVN0cmlrZXRocm91Z2hIdG1sIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tc3RyaWtldGhyb3VnaEAyLjEuMC9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tc3RyaWtldGhyb3VnaC9saWIvc3ludGF4LmpzCmZ1bmN0aW9uIGdmbVN0cmlrZXRocm91Z2gob3B0aW9ucykgewogIGNvbnN0IG9wdGlvbnNfID0gb3B0aW9ucyB8fCB7fTsKICBsZXQgc2luZ2xlMiA9IG9wdGlvbnNfLnNpbmdsZVRpbGRlOwogIGNvbnN0IHRva2VuaXplciA9IHsKICAgIG5hbWU6ICJzdHJpa2V0aHJvdWdoIiwKICAgIHRva2VuaXplOiB0b2tlbml6ZVN0cmlrZXRocm91Z2gsCiAgICByZXNvbHZlQWxsOiByZXNvbHZlQWxsU3RyaWtldGhyb3VnaAogIH07CiAgaWYgKHNpbmdsZTIgPT09IG51bGwgfHwgc2luZ2xlMiA9PT0gdm9pZCAwKSB7CiAgICBzaW5nbGUyID0gdHJ1ZTsKICB9CiAgcmV0dXJuIHsKICAgIHRleHQ6IHsKICAgICAgWzEyNl06IHRva2VuaXplcgogICAgfSwKICAgIGluc2lkZVNwYW46IHsKICAgICAgbnVsbDogW3Rva2VuaXplcl0KICAgIH0sCiAgICBhdHRlbnRpb25NYXJrZXJzOiB7CiAgICAgIG51bGw6IFsxMjZdCiAgICB9CiAgfTsKICBmdW5jdGlvbiByZXNvbHZlQWxsU3RyaWtldGhyb3VnaChldmVudHMsIGNvbnRleHQyKSB7CiAgICBsZXQgaW5kZXgyID0gLTE7CiAgICB3aGlsZSAoKytpbmRleDIgPCBldmVudHMubGVuZ3RoKSB7CiAgICAgIGlmIChldmVudHNbaW5kZXgyXVswXSA9PT0gImVudGVyIiAmJiBldmVudHNbaW5kZXgyXVsxXS50eXBlID09PSAic3RyaWtldGhyb3VnaFNlcXVlbmNlVGVtcG9yYXJ5IiAmJiBldmVudHNbaW5kZXgyXVsxXS5fY2xvc2UpIHsKICAgICAgICBsZXQgb3BlbiA9IGluZGV4MjsKICAgICAgICB3aGlsZSAob3Blbi0tKSB7CiAgICAgICAgICBpZiAoZXZlbnRzW29wZW5dWzBdID09PSAiZXhpdCIgJiYgZXZlbnRzW29wZW5dWzFdLnR5cGUgPT09ICJzdHJpa2V0aHJvdWdoU2VxdWVuY2VUZW1wb3JhcnkiICYmIGV2ZW50c1tvcGVuXVsxXS5fb3BlbiAmJiAvLyBJZiB0aGUgc2l6ZXMgYXJlIHRoZSBzYW1lOgogICAgICAgICAgZXZlbnRzW2luZGV4Ml1bMV0uZW5kLm9mZnNldCAtIGV2ZW50c1tpbmRleDJdWzFdLnN0YXJ0Lm9mZnNldCA9PT0gZXZlbnRzW29wZW5dWzFdLmVuZC5vZmZzZXQgLSBldmVudHNbb3Blbl1bMV0uc3RhcnQub2Zmc2V0KSB7CiAgICAgICAgICAgIGV2ZW50c1tpbmRleDJdWzFdLnR5cGUgPSAic3RyaWtldGhyb3VnaFNlcXVlbmNlIjsKICAgICAgICAgICAgZXZlbnRzW29wZW5dWzFdLnR5cGUgPSAic3RyaWtldGhyb3VnaFNlcXVlbmNlIjsKICAgICAgICAgICAgY29uc3Qgc3RyaWtldGhyb3VnaDMgPSB7CiAgICAgICAgICAgICAgdHlwZTogInN0cmlrZXRocm91Z2giLAogICAgICAgICAgICAgIHN0YXJ0OiBPYmplY3QuYXNzaWduKHt9LCBldmVudHNbb3Blbl1bMV0uc3RhcnQpLAogICAgICAgICAgICAgIGVuZDogT2JqZWN0LmFzc2lnbih7fSwgZXZlbnRzW2luZGV4Ml1bMV0uZW5kKQogICAgICAgICAgICB9OwogICAgICAgICAgICBjb25zdCB0ZXh0OCA9IHsKICAgICAgICAgICAgICB0eXBlOiAic3RyaWtldGhyb3VnaFRleHQiLAogICAgICAgICAgICAgIHN0YXJ0OiBPYmplY3QuYXNzaWduKHt9LCBldmVudHNbb3Blbl1bMV0uZW5kKSwKICAgICAgICAgICAgICBlbmQ6IE9iamVjdC5hc3NpZ24oe30sIGV2ZW50c1tpbmRleDJdWzFdLnN0YXJ0KQogICAgICAgICAgICB9OwogICAgICAgICAgICBjb25zdCBuZXh0RXZlbnRzID0gW1siZW50ZXIiLCBzdHJpa2V0aHJvdWdoMywgY29udGV4dDJdLCBbImVudGVyIiwgZXZlbnRzW29wZW5dWzFdLCBjb250ZXh0Ml0sIFsiZXhpdCIsIGV2ZW50c1tvcGVuXVsxXSwgY29udGV4dDJdLCBbImVudGVyIiwgdGV4dDgsIGNvbnRleHQyXV07CiAgICAgICAgICAgIGNvbnN0IGluc2lkZVNwYW4yID0gY29udGV4dDIucGFyc2VyLmNvbnN0cnVjdHMuaW5zaWRlU3Bhbi5udWxsOwogICAgICAgICAgICBpZiAoaW5zaWRlU3BhbjIpIHsKICAgICAgICAgICAgICBzcGxpY2UobmV4dEV2ZW50cywgbmV4dEV2ZW50cy5sZW5ndGgsIDAsIHJlc29sdmVBbGwoaW5zaWRlU3BhbjIsIGV2ZW50cy5zbGljZShvcGVuICsgMSwgaW5kZXgyKSwgY29udGV4dDIpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzcGxpY2UobmV4dEV2ZW50cywgbmV4dEV2ZW50cy5sZW5ndGgsIDAsIFtbImV4aXQiLCB0ZXh0OCwgY29udGV4dDJdLCBbImVudGVyIiwgZXZlbnRzW2luZGV4Ml1bMV0sIGNvbnRleHQyXSwgWyJleGl0IiwgZXZlbnRzW2luZGV4Ml1bMV0sIGNvbnRleHQyXSwgWyJleGl0Iiwgc3RyaWtldGhyb3VnaDMsIGNvbnRleHQyXV0pOwogICAgICAgICAgICBzcGxpY2UoZXZlbnRzLCBvcGVuIC0gMSwgaW5kZXgyIC0gb3BlbiArIDMsIG5leHRFdmVudHMpOwogICAgICAgICAgICBpbmRleDIgPSBvcGVuICsgbmV4dEV2ZW50cy5sZW5ndGggLSAyOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGluZGV4MiA9IC0xOwogICAgd2hpbGUgKCsraW5kZXgyIDwgZXZlbnRzLmxlbmd0aCkgewogICAgICBpZiAoZXZlbnRzW2luZGV4Ml1bMV0udHlwZSA9PT0gInN0cmlrZXRocm91Z2hTZXF1ZW5jZVRlbXBvcmFyeSIpIHsKICAgICAgICBldmVudHNbaW5kZXgyXVsxXS50eXBlID0gImRhdGEiOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZXZlbnRzOwogIH0KICBfX25hbWUocmVzb2x2ZUFsbFN0cmlrZXRocm91Z2gsICJyZXNvbHZlQWxsU3RyaWtldGhyb3VnaCIpOwogIGZ1bmN0aW9uIHRva2VuaXplU3RyaWtldGhyb3VnaChlZmZlY3RzLCBvazMsIG5vaykgewogICAgY29uc3QgcHJldmlvdXMzID0gdGhpcy5wcmV2aW91czsKICAgIGNvbnN0IGV2ZW50cyA9IHRoaXMuZXZlbnRzOwogICAgbGV0IHNpemUgPSAwOwogICAgcmV0dXJuIHN0YXJ0OwogICAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgICAgaWYgKHByZXZpb3VzMyA9PT0gMTI2ICYmIGV2ZW50c1tldmVudHMubGVuZ3RoIC0gMV1bMV0udHlwZSAhPT0gImNoYXJhY3RlckVzY2FwZSIpIHsKICAgICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgICAgfQogICAgICBlZmZlY3RzLmVudGVyKCJzdHJpa2V0aHJvdWdoU2VxdWVuY2VUZW1wb3JhcnkiKTsKICAgICAgcmV0dXJuIG1vcmUoY29kZTQpOwogICAgfQogICAgX19uYW1lKHN0YXJ0LCAic3RhcnQiKTsKICAgIGZ1bmN0aW9uIG1vcmUoY29kZTQpIHsKICAgICAgY29uc3QgYmVmb3JlID0gY2xhc3NpZnlDaGFyYWN0ZXIocHJldmlvdXMzKTsKICAgICAgaWYgKGNvZGU0ID09PSAxMjYpIHsKICAgICAgICBpZiAoc2l6ZSA+IDEpIHJldHVybiBub2soY29kZTQpOwogICAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgICAgc2l6ZSsrOwogICAgICAgIHJldHVybiBtb3JlOwogICAgICB9CiAgICAgIGlmIChzaXplIDwgMiAmJiAhc2luZ2xlMikgcmV0dXJuIG5vayhjb2RlNCk7CiAgICAgIGNvbnN0IHRva2VuID0gZWZmZWN0cy5leGl0KCJzdHJpa2V0aHJvdWdoU2VxdWVuY2VUZW1wb3JhcnkiKTsKICAgICAgY29uc3QgYWZ0ZXIgPSBjbGFzc2lmeUNoYXJhY3Rlcihjb2RlNCk7CiAgICAgIHRva2VuLl9vcGVuID0gIWFmdGVyIHx8IGFmdGVyID09PSAyICYmIEJvb2xlYW4oYmVmb3JlKTsKICAgICAgdG9rZW4uX2Nsb3NlID0gIWJlZm9yZSB8fCBiZWZvcmUgPT09IDIgJiYgQm9vbGVhbihhZnRlcik7CiAgICAgIHJldHVybiBvazMoY29kZTQpOwogICAgfQogICAgX19uYW1lKG1vcmUsICJtb3JlIik7CiAgfQogIF9fbmFtZSh0b2tlbml6ZVN0cmlrZXRocm91Z2gsICJ0b2tlbml6ZVN0cmlrZXRocm91Z2giKTsKfQpfX25hbWUoZ2ZtU3RyaWtldGhyb3VnaCwgImdmbVN0cmlrZXRocm91Z2giKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS10YWJsZUAyLjEuMS9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFibGUvbGliL2h0bWwuanMKdmFyIGFsaWdubWVudCA9IHsKICBub25lOiAiIiwKICBsZWZ0OiAnIGFsaWduPSJsZWZ0IicsCiAgcmlnaHQ6ICcgYWxpZ249InJpZ2h0IicsCiAgY2VudGVyOiAnIGFsaWduPSJjZW50ZXIiJwp9OwpmdW5jdGlvbiBnZm1UYWJsZUh0bWwoKSB7CiAgcmV0dXJuIHsKICAgIGVudGVyOiB7CiAgICAgIHRhYmxlKHRva2VuKSB7CiAgICAgICAgY29uc3QgdGFibGVBbGlnbiA9IHRva2VuLl9hbGlnbjsKICAgICAgICB0aGlzLmxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgICAgIHRoaXMudGFnKCI8dGFibGU+Iik7CiAgICAgICAgdGhpcy5zZXREYXRhKCJ0YWJsZUFsaWduIiwgdGFibGVBbGlnbik7CiAgICAgIH0sCiAgICAgIHRhYmxlQm9keSgpIHsKICAgICAgICB0aGlzLnRhZygiPHRib2R5PiIpOwogICAgICB9LAogICAgICB0YWJsZURhdGEoKSB7CiAgICAgICAgY29uc3QgdGFibGVBbGlnbiA9IHRoaXMuZ2V0RGF0YSgidGFibGVBbGlnbiIpOwogICAgICAgIGNvbnN0IHRhYmxlQ29sdW1uID0gdGhpcy5nZXREYXRhKCJ0YWJsZUNvbHVtbiIpOwogICAgICAgIGNvbnN0IGFsaWduID0gYWxpZ25tZW50W3RhYmxlQWxpZ25bdGFibGVDb2x1bW5dXTsKICAgICAgICBpZiAoYWxpZ24gPT09IHZvaWQgMCkgewogICAgICAgICAgdGhpcy5idWZmZXIoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5saW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgICAgICAgIHRoaXMudGFnKCI8dGQiICsgYWxpZ24gKyAiPiIpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgdGFibGVIZWFkKCkgewogICAgICAgIHRoaXMubGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICAgICAgdGhpcy50YWcoIjx0aGVhZD4iKTsKICAgICAgfSwKICAgICAgdGFibGVIZWFkZXIoKSB7CiAgICAgICAgY29uc3QgdGFibGVBbGlnbiA9IHRoaXMuZ2V0RGF0YSgidGFibGVBbGlnbiIpOwogICAgICAgIGNvbnN0IHRhYmxlQ29sdW1uID0gdGhpcy5nZXREYXRhKCJ0YWJsZUNvbHVtbiIpOwogICAgICAgIGNvbnN0IGFsaWduID0gYWxpZ25tZW50W3RhYmxlQWxpZ25bdGFibGVDb2x1bW5dXTsKICAgICAgICB0aGlzLmxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgICAgIHRoaXMudGFnKCI8dGgiICsgYWxpZ24gKyAiPiIpOwogICAgICB9LAogICAgICB0YWJsZVJvdygpIHsKICAgICAgICB0aGlzLnNldERhdGEoInRhYmxlQ29sdW1uIiwgMCk7CiAgICAgICAgdGhpcy5saW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgICAgICB0aGlzLnRhZygiPHRyPiIpOwogICAgICB9CiAgICB9LAogICAgZXhpdDogewogICAgICAvLyBPdmVyd3JpdGUgdGhlIGRlZmF1bHQgY29kZSB0ZXh0IGRhdGEgaGFuZGxlciB0byB1bmVzY2FwZSBlc2NhcGVkIHBpcGVzIHdoZW4KICAgICAgLy8gdGhleSBhcmUgaW4gdGFibGVzLgogICAgICBjb2RlVGV4dERhdGEodG9rZW4pIHsKICAgICAgICBsZXQgdmFsdWUyID0gdGhpcy5zbGljZVNlcmlhbGl6ZSh0b2tlbik7CiAgICAgICAgaWYgKHRoaXMuZ2V0RGF0YSgidGFibGVBbGlnbiIpKSB7CiAgICAgICAgICB2YWx1ZTIgPSB2YWx1ZTIucmVwbGFjZSgvXFwoW1xcfF0pL2csIHJlcGxhY2UyKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5yYXcodGhpcy5lbmNvZGUodmFsdWUyKSk7CiAgICAgIH0sCiAgICAgIHRhYmxlKCkgewogICAgICAgIHRoaXMuc2V0RGF0YSgidGFibGVBbGlnbiIpOwogICAgICAgIHRoaXMuc2V0RGF0YSgic2x1cnBBbGxMaW5lRW5kaW5ncyIpOwogICAgICAgIHRoaXMubGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICAgICAgdGhpcy50YWcoIjwvdGFibGU+Iik7CiAgICAgIH0sCiAgICAgIHRhYmxlQm9keSgpIHsKICAgICAgICB0aGlzLmxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgICAgIHRoaXMudGFnKCI8L3Rib2R5PiIpOwogICAgICB9LAogICAgICB0YWJsZURhdGEoKSB7CiAgICAgICAgY29uc3QgdGFibGVBbGlnbiA9IHRoaXMuZ2V0RGF0YSgidGFibGVBbGlnbiIpOwogICAgICAgIGNvbnN0IHRhYmxlQ29sdW1uID0gdGhpcy5nZXREYXRhKCJ0YWJsZUNvbHVtbiIpOwogICAgICAgIGlmICh0YWJsZUNvbHVtbiBpbiB0YWJsZUFsaWduKSB7CiAgICAgICAgICB0aGlzLnRhZygiPC90ZD4iKTsKICAgICAgICAgIHRoaXMuc2V0RGF0YSgidGFibGVDb2x1bW4iLCB0YWJsZUNvbHVtbiArIDEpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLnJlc3VtZSgpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgdGFibGVIZWFkKCkgewogICAgICAgIHRoaXMubGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICAgICAgdGhpcy50YWcoIjwvdGhlYWQ+Iik7CiAgICAgIH0sCiAgICAgIHRhYmxlSGVhZGVyKCkgewogICAgICAgIGNvbnN0IHRhYmxlQ29sdW1uID0gdGhpcy5nZXREYXRhKCJ0YWJsZUNvbHVtbiIpOwogICAgICAgIHRoaXMudGFnKCI8L3RoPiIpOwogICAgICAgIHRoaXMuc2V0RGF0YSgidGFibGVDb2x1bW4iLCB0YWJsZUNvbHVtbiArIDEpOwogICAgICB9LAogICAgICB0YWJsZVJvdygpIHsKICAgICAgICBjb25zdCB0YWJsZUFsaWduID0gdGhpcy5nZXREYXRhKCJ0YWJsZUFsaWduIik7CiAgICAgICAgbGV0IHRhYmxlQ29sdW1uID0gdGhpcy5nZXREYXRhKCJ0YWJsZUNvbHVtbiIpOwogICAgICAgIHdoaWxlICh0YWJsZUNvbHVtbiA8IHRhYmxlQWxpZ24ubGVuZ3RoKSB7CiAgICAgICAgICB0aGlzLmxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgICAgICAgdGhpcy50YWcoIjx0ZCIgKyBhbGlnbm1lbnRbdGFibGVBbGlnblt0YWJsZUNvbHVtbl1dICsgIj48L3RkPiIpOwogICAgICAgICAgdGFibGVDb2x1bW4rKzsKICAgICAgICB9CiAgICAgICAgdGhpcy5zZXREYXRhKCJ0YWJsZUNvbHVtbiIsIHRhYmxlQ29sdW1uKTsKICAgICAgICB0aGlzLmxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgICAgIHRoaXMudGFnKCI8L3RyPiIpOwogICAgICB9CiAgICB9CiAgfTsKfQpfX25hbWUoZ2ZtVGFibGVIdG1sLCAiZ2ZtVGFibGVIdG1sIik7CmZ1bmN0aW9uIHJlcGxhY2UyKCQwLCAkMSkgewogIHJldHVybiAkMSA9PT0gInwiID8gJDEgOiAkMDsKfQpfX25hbWUocmVwbGFjZTIsICJyZXBsYWNlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFibGVAMi4xLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhYmxlL2xpYi9lZGl0LW1hcC5qcwp2YXIgRWRpdE1hcCA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJFZGl0TWFwIik7CiAgfQogIC8qKgogICAqIENyZWF0ZSBhIG5ldyBlZGl0IG1hcC4KICAgKi8KICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMubWFwID0gW107CiAgfQogIC8qKgogICAqIENyZWF0ZSBhbiBlZGl0OiBhIHJlbW92ZSBhbmQvb3IgYWRkIGF0IGEgY2VydGFpbiBwbGFjZS4KICAgKgogICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleAogICAqIEBwYXJhbSB7bnVtYmVyfSByZW1vdmUKICAgKiBAcGFyYW0ge0FycmF5PEV2ZW50Pn0gYWRkCiAgICogQHJldHVybnMge3VuZGVmaW5lZH0KICAgKi8KICBhZGQoaW5kZXgyLCByZW1vdmUyLCBhZGQyKSB7CiAgICBhZGRJbXBsZW1lbnRhdGlvbih0aGlzLCBpbmRleDIsIHJlbW92ZTIsIGFkZDIpOwogIH0KICAvLyBUbyBkbzogYWRkIHRoaXMgd2hlbiBtb3ZpbmcgdG8gYG1pY3JvbWFya2AuCiAgLy8gLyoqCiAgLy8gICogQ3JlYXRlIGFuIGVkaXQ6IGJ1dCBpbnNlcnQgYGFkZGAgYmVmb3JlIGV4aXN0aW5nIGFkZGl0aW9ucy4KICAvLyAgKgogIC8vICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleAogIC8vICAqIEBwYXJhbSB7bnVtYmVyfSByZW1vdmUKICAvLyAgKiBAcGFyYW0ge0FycmF5PEV2ZW50Pn0gYWRkCiAgLy8gICogQHJldHVybnMge3VuZGVmaW5lZH0KICAvLyAgKi8KICAvLyBhZGRCZWZvcmUoaW5kZXgsIHJlbW92ZSwgYWRkKSB7CiAgLy8gICBhZGRJbXBsZW1lbnRhdGlvbih0aGlzLCBpbmRleCwgcmVtb3ZlLCBhZGQsIHRydWUpCiAgLy8gfQogIC8qKgogICAqIERvbmUsIGNoYW5nZSB0aGUgZXZlbnRzLgogICAqCiAgICogQHBhcmFtIHtBcnJheTxFdmVudD59IGV2ZW50cwogICAqIEByZXR1cm5zIHt1bmRlZmluZWR9CiAgICovCiAgY29uc3VtZShldmVudHMpIHsKICAgIHRoaXMubWFwLnNvcnQoZnVuY3Rpb24oYTQsIGI0KSB7CiAgICAgIHJldHVybiBhNFswXSAtIGI0WzBdOwogICAgfSk7CiAgICBpZiAodGhpcy5tYXAubGVuZ3RoID09PSAwKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGxldCBpbmRleDIgPSB0aGlzLm1hcC5sZW5ndGg7CiAgICBjb25zdCB2ZWNzID0gW107CiAgICB3aGlsZSAoaW5kZXgyID4gMCkgewogICAgICBpbmRleDIgLT0gMTsKICAgICAgdmVjcy5wdXNoKGV2ZW50cy5zbGljZSh0aGlzLm1hcFtpbmRleDJdWzBdICsgdGhpcy5tYXBbaW5kZXgyXVsxXSksIHRoaXMubWFwW2luZGV4Ml1bMl0pOwogICAgICBldmVudHMubGVuZ3RoID0gdGhpcy5tYXBbaW5kZXgyXVswXTsKICAgIH0KICAgIHZlY3MucHVzaChldmVudHMuc2xpY2UoKSk7CiAgICBldmVudHMubGVuZ3RoID0gMDsKICAgIGxldCBzbGljZSA9IHZlY3MucG9wKCk7CiAgICB3aGlsZSAoc2xpY2UpIHsKICAgICAgZm9yIChjb25zdCBlbGVtZW50NCBvZiBzbGljZSkgewogICAgICAgIGV2ZW50cy5wdXNoKGVsZW1lbnQ0KTsKICAgICAgfQogICAgICBzbGljZSA9IHZlY3MucG9wKCk7CiAgICB9CiAgICB0aGlzLm1hcC5sZW5ndGggPSAwOwogIH0KfTsKZnVuY3Rpb24gYWRkSW1wbGVtZW50YXRpb24oZWRpdE1hcCwgYXQsIHJlbW92ZTIsIGFkZDIpIHsKICBsZXQgaW5kZXgyID0gMDsKICBpZiAocmVtb3ZlMiA9PT0gMCAmJiBhZGQyLmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuOwogIH0KICB3aGlsZSAoaW5kZXgyIDwgZWRpdE1hcC5tYXAubGVuZ3RoKSB7CiAgICBpZiAoZWRpdE1hcC5tYXBbaW5kZXgyXVswXSA9PT0gYXQpIHsKICAgICAgZWRpdE1hcC5tYXBbaW5kZXgyXVsxXSArPSByZW1vdmUyOwogICAgICBlZGl0TWFwLm1hcFtpbmRleDJdWzJdLnB1c2goLi4uYWRkMik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGluZGV4MiArPSAxOwogIH0KICBlZGl0TWFwLm1hcC5wdXNoKFthdCwgcmVtb3ZlMiwgYWRkMl0pOwp9Cl9fbmFtZShhZGRJbXBsZW1lbnRhdGlvbiwgImFkZEltcGxlbWVudGF0aW9uIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFibGVAMi4xLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhYmxlL2xpYi9pbmZlci5qcwpmdW5jdGlvbiBnZm1UYWJsZUFsaWduKGV2ZW50cywgaW5kZXgyKSB7CiAgbGV0IGluRGVsaW1pdGVyUm93ID0gZmFsc2U7CiAgY29uc3QgYWxpZ24gPSBbXTsKICB3aGlsZSAoaW5kZXgyIDwgZXZlbnRzLmxlbmd0aCkgewogICAgY29uc3QgZXZlbnQgPSBldmVudHNbaW5kZXgyXTsKICAgIGlmIChpbkRlbGltaXRlclJvdykgewogICAgICBpZiAoZXZlbnRbMF0gPT09ICJlbnRlciIpIHsKICAgICAgICBpZiAoZXZlbnRbMV0udHlwZSA9PT0gInRhYmxlQ29udGVudCIpIHsKICAgICAgICAgIGFsaWduLnB1c2goZXZlbnRzW2luZGV4MiArIDFdWzFdLnR5cGUgPT09ICJ0YWJsZURlbGltaXRlck1hcmtlciIgPyAibGVmdCIgOiAibm9uZSIpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChldmVudFsxXS50eXBlID09PSAidGFibGVDb250ZW50IikgewogICAgICAgIGlmIChldmVudHNbaW5kZXgyIC0gMV1bMV0udHlwZSA9PT0gInRhYmxlRGVsaW1pdGVyTWFya2VyIikgewogICAgICAgICAgY29uc3QgYWxpZ25JbmRleCA9IGFsaWduLmxlbmd0aCAtIDE7CiAgICAgICAgICBhbGlnblthbGlnbkluZGV4XSA9IGFsaWduW2FsaWduSW5kZXhdID09PSAibGVmdCIgPyAiY2VudGVyIiA6ICJyaWdodCI7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGV2ZW50WzFdLnR5cGUgPT09ICJ0YWJsZURlbGltaXRlclJvdyIpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfSBlbHNlIGlmIChldmVudFswXSA9PT0gImVudGVyIiAmJiBldmVudFsxXS50eXBlID09PSAidGFibGVEZWxpbWl0ZXJSb3ciKSB7CiAgICAgIGluRGVsaW1pdGVyUm93ID0gdHJ1ZTsKICAgIH0KICAgIGluZGV4MiArPSAxOwogIH0KICByZXR1cm4gYWxpZ247Cn0KX19uYW1lKGdmbVRhYmxlQWxpZ24sICJnZm1UYWJsZUFsaWduIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFibGVAMi4xLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhYmxlL2xpYi9zeW50YXguanMKZnVuY3Rpb24gZ2ZtVGFibGUoKSB7CiAgcmV0dXJuIHsKICAgIGZsb3c6IHsKICAgICAgbnVsbDogewogICAgICAgIG5hbWU6ICJ0YWJsZSIsCiAgICAgICAgdG9rZW5pemU6IHRva2VuaXplVGFibGUsCiAgICAgICAgcmVzb2x2ZUFsbDogcmVzb2x2ZVRhYmxlCiAgICAgIH0KICAgIH0KICB9Owp9Cl9fbmFtZShnZm1UYWJsZSwgImdmbVRhYmxlIik7CmZ1bmN0aW9uIHRva2VuaXplVGFibGUoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgbGV0IHNpemUgPSAwOwogIGxldCBzaXplQiA9IDA7CiAgbGV0IHNlZW47CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBsZXQgaW5kZXgyID0gc2VsZjIuZXZlbnRzLmxlbmd0aCAtIDE7CiAgICB3aGlsZSAoaW5kZXgyID4gLTEpIHsKICAgICAgY29uc3QgdHlwZTUgPSBzZWxmMi5ldmVudHNbaW5kZXgyXVsxXS50eXBlOwogICAgICBpZiAodHlwZTUgPT09ICJsaW5lRW5kaW5nIiB8fCAvLyBOb3RlOiBtYXJrZG93bi1ycyB1c2VzIGB3aGl0ZXNwYWNlYCBpbnN0ZWFkIG9mIGBsaW5lUHJlZml4YAogICAgICB0eXBlNSA9PT0gImxpbmVQcmVmaXgiKSBpbmRleDItLTsKICAgICAgZWxzZSBicmVhazsKICAgIH0KICAgIGNvbnN0IHRhaWwgPSBpbmRleDIgPiAtMSA/IHNlbGYyLmV2ZW50c1tpbmRleDJdWzFdLnR5cGUgOiBudWxsOwogICAgY29uc3QgbmV4dDIgPSB0YWlsID09PSAidGFibGVIZWFkIiB8fCB0YWlsID09PSAidGFibGVSb3ciID8gYm9keVJvd1N0YXJ0IDogaGVhZFJvd0JlZm9yZTsKICAgIGlmIChuZXh0MiA9PT0gYm9keVJvd1N0YXJ0ICYmIHNlbGYyLnBhcnNlci5sYXp5W3NlbGYyLm5vdygpLmxpbmVdKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgcmV0dXJuIG5leHQyKGNvZGU0KTsKICB9CiAgX19uYW1lKHN0YXJ0LCAic3RhcnQiKTsKICBmdW5jdGlvbiBoZWFkUm93QmVmb3JlKGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJ0YWJsZUhlYWQiKTsKICAgIGVmZmVjdHMuZW50ZXIoInRhYmxlUm93Iik7CiAgICByZXR1cm4gaGVhZFJvd1N0YXJ0KGNvZGU0KTsKICB9CiAgX19uYW1lKGhlYWRSb3dCZWZvcmUsICJoZWFkUm93QmVmb3JlIik7CiAgZnVuY3Rpb24gaGVhZFJvd1N0YXJ0KGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDEyNCkgewogICAgICByZXR1cm4gaGVhZFJvd0JyZWFrKGNvZGU0KTsKICAgIH0KICAgIHNlZW4gPSB0cnVlOwogICAgc2l6ZUIgKz0gMTsKICAgIHJldHVybiBoZWFkUm93QnJlYWsoY29kZTQpOwogIH0KICBfX25hbWUoaGVhZFJvd1N0YXJ0LCAiaGVhZFJvd1N0YXJ0Iik7CiAgZnVuY3Rpb24gaGVhZFJvd0JyZWFrKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwpIHsKICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBpZiAoc2l6ZUIgPiAxKSB7CiAgICAgICAgc2l6ZUIgPSAwOwogICAgICAgIHNlbGYyLmludGVycnVwdCA9IHRydWU7CiAgICAgICAgZWZmZWN0cy5leGl0KCJ0YWJsZVJvdyIpOwogICAgICAgIGVmZmVjdHMuZW50ZXIoImxpbmVFbmRpbmciKTsKICAgICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICAgIGVmZmVjdHMuZXhpdCgibGluZUVuZGluZyIpOwogICAgICAgIHJldHVybiBoZWFkRGVsaW1pdGVyU3RhcnQ7CiAgICAgIH0KICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICBpZiAobWFya2Rvd25TcGFjZShjb2RlNCkpIHsKICAgICAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBoZWFkUm93QnJlYWssICJ3aGl0ZXNwYWNlIikoY29kZTQpOwogICAgfQogICAgc2l6ZUIgKz0gMTsKICAgIGlmIChzZWVuKSB7CiAgICAgIHNlZW4gPSBmYWxzZTsKICAgICAgc2l6ZSArPSAxOwogICAgfQogICAgaWYgKGNvZGU0ID09PSAxMjQpIHsKICAgICAgZWZmZWN0cy5lbnRlcigidGFibGVDZWxsRGl2aWRlciIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoInRhYmxlQ2VsbERpdmlkZXIiKTsKICAgICAgc2VlbiA9IHRydWU7CiAgICAgIHJldHVybiBoZWFkUm93QnJlYWs7CiAgICB9CiAgICBlZmZlY3RzLmVudGVyKCJkYXRhIik7CiAgICByZXR1cm4gaGVhZFJvd0RhdGEoY29kZTQpOwogIH0KICBfX25hbWUoaGVhZFJvd0JyZWFrLCAiaGVhZFJvd0JyZWFrIik7CiAgZnVuY3Rpb24gaGVhZFJvd0RhdGEoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBjb2RlNCA9PT0gMTI0IHx8IG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuZXhpdCgiZGF0YSIpOwogICAgICByZXR1cm4gaGVhZFJvd0JyZWFrKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gY29kZTQgPT09IDkyID8gaGVhZFJvd0VzY2FwZSA6IGhlYWRSb3dEYXRhOwogIH0KICBfX25hbWUoaGVhZFJvd0RhdGEsICJoZWFkUm93RGF0YSIpOwogIGZ1bmN0aW9uIGhlYWRSb3dFc2NhcGUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gOTIgfHwgY29kZTQgPT09IDEyNCkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gaGVhZFJvd0RhdGE7CiAgICB9CiAgICByZXR1cm4gaGVhZFJvd0RhdGEoY29kZTQpOwogIH0KICBfX25hbWUoaGVhZFJvd0VzY2FwZSwgImhlYWRSb3dFc2NhcGUiKTsKICBmdW5jdGlvbiBoZWFkRGVsaW1pdGVyU3RhcnQoY29kZTQpIHsKICAgIHNlbGYyLmludGVycnVwdCA9IGZhbHNlOwogICAgaWYgKHNlbGYyLnBhcnNlci5sYXp5W3NlbGYyLm5vdygpLmxpbmVdKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5lbnRlcigidGFibGVEZWxpbWl0ZXJSb3ciKTsKICAgIHNlZW4gPSBmYWxzZTsKICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICByZXR1cm4gZmFjdG9yeVNwYWNlKGVmZmVjdHMsIGhlYWREZWxpbWl0ZXJCZWZvcmUsICJsaW5lUHJlZml4Iiwgc2VsZjIucGFyc2VyLmNvbnN0cnVjdHMuZGlzYWJsZS5udWxsLmluY2x1ZGVzKCJjb2RlSW5kZW50ZWQiKSA/IHZvaWQgMCA6IDQpKGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBoZWFkRGVsaW1pdGVyQmVmb3JlKGNvZGU0KTsKICB9CiAgX19uYW1lKGhlYWREZWxpbWl0ZXJTdGFydCwgImhlYWREZWxpbWl0ZXJTdGFydCIpOwogIGZ1bmN0aW9uIGhlYWREZWxpbWl0ZXJCZWZvcmUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDUgfHwgY29kZTQgPT09IDU4KSB7CiAgICAgIHJldHVybiBoZWFkRGVsaW1pdGVyVmFsdWVCZWZvcmUoY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSAxMjQpIHsKICAgICAgc2VlbiA9IHRydWU7CiAgICAgIGVmZmVjdHMuZW50ZXIoInRhYmxlQ2VsbERpdmlkZXIiKTsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgZWZmZWN0cy5leGl0KCJ0YWJsZUNlbGxEaXZpZGVyIik7CiAgICAgIHJldHVybiBoZWFkRGVsaW1pdGVyQ2VsbEJlZm9yZTsKICAgIH0KICAgIHJldHVybiBoZWFkRGVsaW1pdGVyTm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKGhlYWREZWxpbWl0ZXJCZWZvcmUsICJoZWFkRGVsaW1pdGVyQmVmb3JlIik7CiAgZnVuY3Rpb24gaGVhZERlbGltaXRlckNlbGxCZWZvcmUoY29kZTQpIHsKICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICByZXR1cm4gZmFjdG9yeVNwYWNlKGVmZmVjdHMsIGhlYWREZWxpbWl0ZXJWYWx1ZUJlZm9yZSwgIndoaXRlc3BhY2UiKShjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gaGVhZERlbGltaXRlclZhbHVlQmVmb3JlKGNvZGU0KTsKICB9CiAgX19uYW1lKGhlYWREZWxpbWl0ZXJDZWxsQmVmb3JlLCAiaGVhZERlbGltaXRlckNlbGxCZWZvcmUiKTsKICBmdW5jdGlvbiBoZWFkRGVsaW1pdGVyVmFsdWVCZWZvcmUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNTgpIHsKICAgICAgc2l6ZUIgKz0gMTsKICAgICAgc2VlbiA9IHRydWU7CiAgICAgIGVmZmVjdHMuZW50ZXIoInRhYmxlRGVsaW1pdGVyTWFya2VyIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgidGFibGVEZWxpbWl0ZXJNYXJrZXIiKTsKICAgICAgcmV0dXJuIGhlYWREZWxpbWl0ZXJMZWZ0QWxpZ25tZW50QWZ0ZXI7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDQ1KSB7CiAgICAgIHNpemVCICs9IDE7CiAgICAgIHJldHVybiBoZWFkRGVsaW1pdGVyTGVmdEFsaWdubWVudEFmdGVyKGNvZGU0KTsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIHJldHVybiBoZWFkRGVsaW1pdGVyQ2VsbEFmdGVyKGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBoZWFkRGVsaW1pdGVyTm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKGhlYWREZWxpbWl0ZXJWYWx1ZUJlZm9yZSwgImhlYWREZWxpbWl0ZXJWYWx1ZUJlZm9yZSIpOwogIGZ1bmN0aW9uIGhlYWREZWxpbWl0ZXJMZWZ0QWxpZ25tZW50QWZ0ZXIoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDUpIHsKICAgICAgZWZmZWN0cy5lbnRlcigidGFibGVEZWxpbWl0ZXJGaWxsZXIiKTsKICAgICAgcmV0dXJuIGhlYWREZWxpbWl0ZXJGaWxsZXIoY29kZTQpOwogICAgfQogICAgcmV0dXJuIGhlYWREZWxpbWl0ZXJOb2soY29kZTQpOwogIH0KICBfX25hbWUoaGVhZERlbGltaXRlckxlZnRBbGlnbm1lbnRBZnRlciwgImhlYWREZWxpbWl0ZXJMZWZ0QWxpZ25tZW50QWZ0ZXIiKTsKICBmdW5jdGlvbiBoZWFkRGVsaW1pdGVyRmlsbGVyKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDQ1KSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBoZWFkRGVsaW1pdGVyRmlsbGVyOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA1OCkgewogICAgICBzZWVuID0gdHJ1ZTsKICAgICAgZWZmZWN0cy5leGl0KCJ0YWJsZURlbGltaXRlckZpbGxlciIpOwogICAgICBlZmZlY3RzLmVudGVyKCJ0YWJsZURlbGltaXRlck1hcmtlciIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoInRhYmxlRGVsaW1pdGVyTWFya2VyIik7CiAgICAgIHJldHVybiBoZWFkRGVsaW1pdGVyUmlnaHRBbGlnbm1lbnRBZnRlcjsKICAgIH0KICAgIGVmZmVjdHMuZXhpdCgidGFibGVEZWxpbWl0ZXJGaWxsZXIiKTsKICAgIHJldHVybiBoZWFkRGVsaW1pdGVyUmlnaHRBbGlnbm1lbnRBZnRlcihjb2RlNCk7CiAgfQogIF9fbmFtZShoZWFkRGVsaW1pdGVyRmlsbGVyLCAiaGVhZERlbGltaXRlckZpbGxlciIpOwogIGZ1bmN0aW9uIGhlYWREZWxpbWl0ZXJSaWdodEFsaWdubWVudEFmdGVyKGNvZGU0KSB7CiAgICBpZiAobWFya2Rvd25TcGFjZShjb2RlNCkpIHsKICAgICAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBoZWFkRGVsaW1pdGVyQ2VsbEFmdGVyLCAid2hpdGVzcGFjZSIpKGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBoZWFkRGVsaW1pdGVyQ2VsbEFmdGVyKGNvZGU0KTsKICB9CiAgX19uYW1lKGhlYWREZWxpbWl0ZXJSaWdodEFsaWdubWVudEFmdGVyLCAiaGVhZERlbGltaXRlclJpZ2h0QWxpZ25tZW50QWZ0ZXIiKTsKICBmdW5jdGlvbiBoZWFkRGVsaW1pdGVyQ2VsbEFmdGVyKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDEyNCkgewogICAgICByZXR1cm4gaGVhZERlbGltaXRlckJlZm9yZShjb2RlNCk7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBpZiAoIXNlZW4gfHwgc2l6ZSAhPT0gc2l6ZUIpIHsKICAgICAgICByZXR1cm4gaGVhZERlbGltaXRlck5vayhjb2RlNCk7CiAgICAgIH0KICAgICAgZWZmZWN0cy5leGl0KCJ0YWJsZURlbGltaXRlclJvdyIpOwogICAgICBlZmZlY3RzLmV4aXQoInRhYmxlSGVhZCIpOwogICAgICByZXR1cm4gb2szKGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBoZWFkRGVsaW1pdGVyTm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKGhlYWREZWxpbWl0ZXJDZWxsQWZ0ZXIsICJoZWFkRGVsaW1pdGVyQ2VsbEFmdGVyIik7CiAgZnVuY3Rpb24gaGVhZERlbGltaXRlck5vayhjb2RlNCkgewogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZShoZWFkRGVsaW1pdGVyTm9rLCAiaGVhZERlbGltaXRlck5vayIpOwogIGZ1bmN0aW9uIGJvZHlSb3dTdGFydChjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigidGFibGVSb3ciKTsKICAgIHJldHVybiBib2R5Um93QnJlYWsoY29kZTQpOwogIH0KICBfX25hbWUoYm9keVJvd1N0YXJ0LCAiYm9keVJvd1N0YXJ0Iik7CiAgZnVuY3Rpb24gYm9keVJvd0JyZWFrKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDEyNCkgewogICAgICBlZmZlY3RzLmVudGVyKCJ0YWJsZUNlbGxEaXZpZGVyIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgidGFibGVDZWxsRGl2aWRlciIpOwogICAgICByZXR1cm4gYm9keVJvd0JyZWFrOwogICAgfQogICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5leGl0KCJ0YWJsZVJvdyIpOwogICAgICByZXR1cm4gb2szKGNvZGU0KTsKICAgIH0KICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICByZXR1cm4gZmFjdG9yeVNwYWNlKGVmZmVjdHMsIGJvZHlSb3dCcmVhaywgIndoaXRlc3BhY2UiKShjb2RlNCk7CiAgICB9CiAgICBlZmZlY3RzLmVudGVyKCJkYXRhIik7CiAgICByZXR1cm4gYm9keVJvd0RhdGEoY29kZTQpOwogIH0KICBfX25hbWUoYm9keVJvd0JyZWFrLCAiYm9keVJvd0JyZWFrIik7CiAgZnVuY3Rpb24gYm9keVJvd0RhdGEoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBjb2RlNCA9PT0gMTI0IHx8IG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuZXhpdCgiZGF0YSIpOwogICAgICByZXR1cm4gYm9keVJvd0JyZWFrKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gY29kZTQgPT09IDkyID8gYm9keVJvd0VzY2FwZSA6IGJvZHlSb3dEYXRhOwogIH0KICBfX25hbWUoYm9keVJvd0RhdGEsICJib2R5Um93RGF0YSIpOwogIGZ1bmN0aW9uIGJvZHlSb3dFc2NhcGUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gOTIgfHwgY29kZTQgPT09IDEyNCkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gYm9keVJvd0RhdGE7CiAgICB9CiAgICByZXR1cm4gYm9keVJvd0RhdGEoY29kZTQpOwogIH0KICBfX25hbWUoYm9keVJvd0VzY2FwZSwgImJvZHlSb3dFc2NhcGUiKTsKfQpfX25hbWUodG9rZW5pemVUYWJsZSwgInRva2VuaXplVGFibGUiKTsKZnVuY3Rpb24gcmVzb2x2ZVRhYmxlKGV2ZW50cywgY29udGV4dDIpIHsKICBsZXQgaW5kZXgyID0gLTE7CiAgbGV0IGluRmlyc3RDZWxsQXdhaXRpbmdQaXBlID0gdHJ1ZTsKICBsZXQgcm93S2luZCA9IDA7CiAgbGV0IGxhc3RDZWxsID0gWzAsIDAsIDAsIDBdOwogIGxldCBjZWxsMiA9IFswLCAwLCAwLCAwXTsKICBsZXQgYWZ0ZXJIZWFkQXdhaXRpbmdGaXJzdEJvZHlSb3cgPSBmYWxzZTsKICBsZXQgbGFzdFRhYmxlRW5kID0gMDsKICBsZXQgY3VycmVudFRhYmxlOwogIGxldCBjdXJyZW50Qm9keTsKICBsZXQgY3VycmVudENlbGw7CiAgY29uc3QgbWFwNyA9IG5ldyBFZGl0TWFwKCk7CiAgd2hpbGUgKCsraW5kZXgyIDwgZXZlbnRzLmxlbmd0aCkgewogICAgY29uc3QgZXZlbnQgPSBldmVudHNbaW5kZXgyXTsKICAgIGNvbnN0IHRva2VuID0gZXZlbnRbMV07CiAgICBpZiAoZXZlbnRbMF0gPT09ICJlbnRlciIpIHsKICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICJ0YWJsZUhlYWQiKSB7CiAgICAgICAgYWZ0ZXJIZWFkQXdhaXRpbmdGaXJzdEJvZHlSb3cgPSBmYWxzZTsKICAgICAgICBpZiAobGFzdFRhYmxlRW5kICE9PSAwKSB7CiAgICAgICAgICBmbHVzaFRhYmxlRW5kKG1hcDcsIGNvbnRleHQyLCBsYXN0VGFibGVFbmQsIGN1cnJlbnRUYWJsZSwgY3VycmVudEJvZHkpOwogICAgICAgICAgY3VycmVudEJvZHkgPSB2b2lkIDA7CiAgICAgICAgICBsYXN0VGFibGVFbmQgPSAwOwogICAgICAgIH0KICAgICAgICBjdXJyZW50VGFibGUgPSB7CiAgICAgICAgICB0eXBlOiAidGFibGUiLAogICAgICAgICAgc3RhcnQ6IE9iamVjdC5hc3NpZ24oe30sIHRva2VuLnN0YXJ0KSwKICAgICAgICAgIC8vIE5vdGU6IGNvcnJlY3QgZW5kIGlzIHNldCBsYXRlci4KICAgICAgICAgIGVuZDogT2JqZWN0LmFzc2lnbih7fSwgdG9rZW4uZW5kKQogICAgICAgIH07CiAgICAgICAgbWFwNy5hZGQoaW5kZXgyLCAwLCBbWyJlbnRlciIsIGN1cnJlbnRUYWJsZSwgY29udGV4dDJdXSk7CiAgICAgIH0gZWxzZSBpZiAodG9rZW4udHlwZSA9PT0gInRhYmxlUm93IiB8fCB0b2tlbi50eXBlID09PSAidGFibGVEZWxpbWl0ZXJSb3ciKSB7CiAgICAgICAgaW5GaXJzdENlbGxBd2FpdGluZ1BpcGUgPSB0cnVlOwogICAgICAgIGN1cnJlbnRDZWxsID0gdm9pZCAwOwogICAgICAgIGxhc3RDZWxsID0gWzAsIDAsIDAsIDBdOwogICAgICAgIGNlbGwyID0gWzAsIGluZGV4MiArIDEsIDAsIDBdOwogICAgICAgIGlmIChhZnRlckhlYWRBd2FpdGluZ0ZpcnN0Qm9keVJvdykgewogICAgICAgICAgYWZ0ZXJIZWFkQXdhaXRpbmdGaXJzdEJvZHlSb3cgPSBmYWxzZTsKICAgICAgICAgIGN1cnJlbnRCb2R5ID0gewogICAgICAgICAgICB0eXBlOiAidGFibGVCb2R5IiwKICAgICAgICAgICAgc3RhcnQ6IE9iamVjdC5hc3NpZ24oe30sIHRva2VuLnN0YXJ0KSwKICAgICAgICAgICAgLy8gTm90ZTogY29ycmVjdCBlbmQgaXMgc2V0IGxhdGVyLgogICAgICAgICAgICBlbmQ6IE9iamVjdC5hc3NpZ24oe30sIHRva2VuLmVuZCkKICAgICAgICAgIH07CiAgICAgICAgICBtYXA3LmFkZChpbmRleDIsIDAsIFtbImVudGVyIiwgY3VycmVudEJvZHksIGNvbnRleHQyXV0pOwogICAgICAgIH0KICAgICAgICByb3dLaW5kID0gdG9rZW4udHlwZSA9PT0gInRhYmxlRGVsaW1pdGVyUm93IiA/IDIgOiBjdXJyZW50Qm9keSA/IDMgOiAxOwogICAgICB9IGVsc2UgaWYgKHJvd0tpbmQgJiYgKHRva2VuLnR5cGUgPT09ICJkYXRhIiB8fCB0b2tlbi50eXBlID09PSAidGFibGVEZWxpbWl0ZXJNYXJrZXIiIHx8IHRva2VuLnR5cGUgPT09ICJ0YWJsZURlbGltaXRlckZpbGxlciIpKSB7CiAgICAgICAgaW5GaXJzdENlbGxBd2FpdGluZ1BpcGUgPSBmYWxzZTsKICAgICAgICBpZiAoY2VsbDJbMl0gPT09IDApIHsKICAgICAgICAgIGlmIChsYXN0Q2VsbFsxXSAhPT0gMCkgewogICAgICAgICAgICBjZWxsMlswXSA9IGNlbGwyWzFdOwogICAgICAgICAgICBjdXJyZW50Q2VsbCA9IGZsdXNoQ2VsbChtYXA3LCBjb250ZXh0MiwgbGFzdENlbGwsIHJvd0tpbmQsIHZvaWQgMCwgY3VycmVudENlbGwpOwogICAgICAgICAgICBsYXN0Q2VsbCA9IFswLCAwLCAwLCAwXTsKICAgICAgICAgIH0KICAgICAgICAgIGNlbGwyWzJdID0gaW5kZXgyOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh0b2tlbi50eXBlID09PSAidGFibGVDZWxsRGl2aWRlciIpIHsKICAgICAgICBpZiAoaW5GaXJzdENlbGxBd2FpdGluZ1BpcGUpIHsKICAgICAgICAgIGluRmlyc3RDZWxsQXdhaXRpbmdQaXBlID0gZmFsc2U7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChsYXN0Q2VsbFsxXSAhPT0gMCkgewogICAgICAgICAgICBjZWxsMlswXSA9IGNlbGwyWzFdOwogICAgICAgICAgICBjdXJyZW50Q2VsbCA9IGZsdXNoQ2VsbChtYXA3LCBjb250ZXh0MiwgbGFzdENlbGwsIHJvd0tpbmQsIHZvaWQgMCwgY3VycmVudENlbGwpOwogICAgICAgICAgfQogICAgICAgICAgbGFzdENlbGwgPSBjZWxsMjsKICAgICAgICAgIGNlbGwyID0gW2xhc3RDZWxsWzFdLCBpbmRleDIsIDAsIDBdOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIGlmICh0b2tlbi50eXBlID09PSAidGFibGVIZWFkIikgewogICAgICBhZnRlckhlYWRBd2FpdGluZ0ZpcnN0Qm9keVJvdyA9IHRydWU7CiAgICAgIGxhc3RUYWJsZUVuZCA9IGluZGV4MjsKICAgIH0gZWxzZSBpZiAodG9rZW4udHlwZSA9PT0gInRhYmxlUm93IiB8fCB0b2tlbi50eXBlID09PSAidGFibGVEZWxpbWl0ZXJSb3ciKSB7CiAgICAgIGxhc3RUYWJsZUVuZCA9IGluZGV4MjsKICAgICAgaWYgKGxhc3RDZWxsWzFdICE9PSAwKSB7CiAgICAgICAgY2VsbDJbMF0gPSBjZWxsMlsxXTsKICAgICAgICBjdXJyZW50Q2VsbCA9IGZsdXNoQ2VsbChtYXA3LCBjb250ZXh0MiwgbGFzdENlbGwsIHJvd0tpbmQsIGluZGV4MiwgY3VycmVudENlbGwpOwogICAgICB9IGVsc2UgaWYgKGNlbGwyWzFdICE9PSAwKSB7CiAgICAgICAgY3VycmVudENlbGwgPSBmbHVzaENlbGwobWFwNywgY29udGV4dDIsIGNlbGwyLCByb3dLaW5kLCBpbmRleDIsIGN1cnJlbnRDZWxsKTsKICAgICAgfQogICAgICByb3dLaW5kID0gMDsKICAgIH0gZWxzZSBpZiAocm93S2luZCAmJiAodG9rZW4udHlwZSA9PT0gImRhdGEiIHx8IHRva2VuLnR5cGUgPT09ICJ0YWJsZURlbGltaXRlck1hcmtlciIgfHwgdG9rZW4udHlwZSA9PT0gInRhYmxlRGVsaW1pdGVyRmlsbGVyIikpIHsKICAgICAgY2VsbDJbM10gPSBpbmRleDI7CiAgICB9CiAgfQogIGlmIChsYXN0VGFibGVFbmQgIT09IDApIHsKICAgIGZsdXNoVGFibGVFbmQobWFwNywgY29udGV4dDIsIGxhc3RUYWJsZUVuZCwgY3VycmVudFRhYmxlLCBjdXJyZW50Qm9keSk7CiAgfQogIG1hcDcuY29uc3VtZShjb250ZXh0Mi5ldmVudHMpOwogIGluZGV4MiA9IC0xOwogIHdoaWxlICgrK2luZGV4MiA8IGNvbnRleHQyLmV2ZW50cy5sZW5ndGgpIHsKICAgIGNvbnN0IGV2ZW50ID0gY29udGV4dDIuZXZlbnRzW2luZGV4Ml07CiAgICBpZiAoZXZlbnRbMF0gPT09ICJlbnRlciIgJiYgZXZlbnRbMV0udHlwZSA9PT0gInRhYmxlIikgewogICAgICBldmVudFsxXS5fYWxpZ24gPSBnZm1UYWJsZUFsaWduKGNvbnRleHQyLmV2ZW50cywgaW5kZXgyKTsKICAgIH0KICB9CiAgcmV0dXJuIGV2ZW50czsKfQpfX25hbWUocmVzb2x2ZVRhYmxlLCAicmVzb2x2ZVRhYmxlIik7CmZ1bmN0aW9uIGZsdXNoQ2VsbChtYXA3LCBjb250ZXh0MiwgcmFuZ2UyLCByb3dLaW5kLCByb3dFbmQsIHByZXZpb3VzQ2VsbCkgewogIGNvbnN0IGdyb3VwTmFtZSA9IHJvd0tpbmQgPT09IDEgPyAidGFibGVIZWFkZXIiIDogcm93S2luZCA9PT0gMiA/ICJ0YWJsZURlbGltaXRlciIgOiAidGFibGVEYXRhIjsKICBjb25zdCB2YWx1ZU5hbWUgPSAidGFibGVDb250ZW50IjsKICBpZiAocmFuZ2UyWzBdICE9PSAwKSB7CiAgICBwcmV2aW91c0NlbGwuZW5kID0gT2JqZWN0LmFzc2lnbih7fSwgZ2V0UG9pbnQoY29udGV4dDIuZXZlbnRzLCByYW5nZTJbMF0pKTsKICAgIG1hcDcuYWRkKHJhbmdlMlswXSwgMCwgW1siZXhpdCIsIHByZXZpb3VzQ2VsbCwgY29udGV4dDJdXSk7CiAgfQogIGNvbnN0IG5vdzIgPSBnZXRQb2ludChjb250ZXh0Mi5ldmVudHMsIHJhbmdlMlsxXSk7CiAgcHJldmlvdXNDZWxsID0gewogICAgdHlwZTogZ3JvdXBOYW1lLAogICAgc3RhcnQ6IE9iamVjdC5hc3NpZ24oe30sIG5vdzIpLAogICAgLy8gTm90ZTogY29ycmVjdCBlbmQgaXMgc2V0IGxhdGVyLgogICAgZW5kOiBPYmplY3QuYXNzaWduKHt9LCBub3cyKQogIH07CiAgbWFwNy5hZGQocmFuZ2UyWzFdLCAwLCBbWyJlbnRlciIsIHByZXZpb3VzQ2VsbCwgY29udGV4dDJdXSk7CiAgaWYgKHJhbmdlMlsyXSAhPT0gMCkgewogICAgY29uc3QgcmVsYXRlZFN0YXJ0ID0gZ2V0UG9pbnQoY29udGV4dDIuZXZlbnRzLCByYW5nZTJbMl0pOwogICAgY29uc3QgcmVsYXRlZEVuZCA9IGdldFBvaW50KGNvbnRleHQyLmV2ZW50cywgcmFuZ2UyWzNdKTsKICAgIGNvbnN0IHZhbHVlVG9rZW4gPSB7CiAgICAgIHR5cGU6IHZhbHVlTmFtZSwKICAgICAgc3RhcnQ6IE9iamVjdC5hc3NpZ24oe30sIHJlbGF0ZWRTdGFydCksCiAgICAgIGVuZDogT2JqZWN0LmFzc2lnbih7fSwgcmVsYXRlZEVuZCkKICAgIH07CiAgICBtYXA3LmFkZChyYW5nZTJbMl0sIDAsIFtbImVudGVyIiwgdmFsdWVUb2tlbiwgY29udGV4dDJdXSk7CiAgICBpZiAocm93S2luZCAhPT0gMikgewogICAgICBjb25zdCBzdGFydCA9IGNvbnRleHQyLmV2ZW50c1tyYW5nZTJbMl1dOwogICAgICBjb25zdCBlbmQgPSBjb250ZXh0Mi5ldmVudHNbcmFuZ2UyWzNdXTsKICAgICAgc3RhcnRbMV0uZW5kID0gT2JqZWN0LmFzc2lnbih7fSwgZW5kWzFdLmVuZCk7CiAgICAgIHN0YXJ0WzFdLnR5cGUgPSAiY2h1bmtUZXh0IjsKICAgICAgc3RhcnRbMV0uY29udGVudFR5cGUgPSAidGV4dCI7CiAgICAgIGlmIChyYW5nZTJbM10gPiByYW5nZTJbMl0gKyAxKSB7CiAgICAgICAgY29uc3QgYTQgPSByYW5nZTJbMl0gKyAxOwogICAgICAgIGNvbnN0IGI0ID0gcmFuZ2UyWzNdIC0gcmFuZ2UyWzJdIC0gMTsKICAgICAgICBtYXA3LmFkZChhNCwgYjQsIFtdKTsKICAgICAgfQogICAgfQogICAgbWFwNy5hZGQocmFuZ2UyWzNdICsgMSwgMCwgW1siZXhpdCIsIHZhbHVlVG9rZW4sIGNvbnRleHQyXV0pOwogIH0KICBpZiAocm93RW5kICE9PSB2b2lkIDApIHsKICAgIHByZXZpb3VzQ2VsbC5lbmQgPSBPYmplY3QuYXNzaWduKHt9LCBnZXRQb2ludChjb250ZXh0Mi5ldmVudHMsIHJvd0VuZCkpOwogICAgbWFwNy5hZGQocm93RW5kLCAwLCBbWyJleGl0IiwgcHJldmlvdXNDZWxsLCBjb250ZXh0Ml1dKTsKICAgIHByZXZpb3VzQ2VsbCA9IHZvaWQgMDsKICB9CiAgcmV0dXJuIHByZXZpb3VzQ2VsbDsKfQpfX25hbWUoZmx1c2hDZWxsLCAiZmx1c2hDZWxsIik7CmZ1bmN0aW9uIGZsdXNoVGFibGVFbmQobWFwNywgY29udGV4dDIsIGluZGV4MiwgdGFibGUyLCB0YWJsZUJvZHkpIHsKICBjb25zdCBleGl0cyA9IFtdOwogIGNvbnN0IHJlbGF0ZWQgPSBnZXRQb2ludChjb250ZXh0Mi5ldmVudHMsIGluZGV4Mik7CiAgaWYgKHRhYmxlQm9keSkgewogICAgdGFibGVCb2R5LmVuZCA9IE9iamVjdC5hc3NpZ24oe30sIHJlbGF0ZWQpOwogICAgZXhpdHMucHVzaChbImV4aXQiLCB0YWJsZUJvZHksIGNvbnRleHQyXSk7CiAgfQogIHRhYmxlMi5lbmQgPSBPYmplY3QuYXNzaWduKHt9LCByZWxhdGVkKTsKICBleGl0cy5wdXNoKFsiZXhpdCIsIHRhYmxlMiwgY29udGV4dDJdKTsKICBtYXA3LmFkZChpbmRleDIgKyAxLCAwLCBleGl0cyk7Cn0KX19uYW1lKGZsdXNoVGFibGVFbmQsICJmbHVzaFRhYmxlRW5kIik7CmZ1bmN0aW9uIGdldFBvaW50KGV2ZW50cywgaW5kZXgyKSB7CiAgY29uc3QgZXZlbnQgPSBldmVudHNbaW5kZXgyXTsKICBjb25zdCBzaWRlID0gZXZlbnRbMF0gPT09ICJlbnRlciIgPyAic3RhcnQiIDogImVuZCI7CiAgcmV0dXJuIGV2ZW50WzFdW3NpZGVdOwp9Cl9fbmFtZShnZXRQb2ludCwgImdldFBvaW50Iik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFnZmlsdGVyQDIuMC4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS10YWdmaWx0ZXIvbGliL2luZGV4LmpzCnZhciByZUZsb3cgPSAvPChcLz8pKGlmcmFtZXxub2VtYmVkfG5vZnJhbWVzfHBsYWludGV4dHxzY3JpcHR8c3R5bGV8dGl0bGV8dGV4dGFyZWF8eG1wKSg/PVtcdFxuXGZcciAvPl0pL2dpOwp2YXIgcmVUZXh0ID0gbmV3IFJlZ0V4cCgiXiIgKyByZUZsb3cuc291cmNlLCAiaSIpOwpmdW5jdGlvbiBnZm1UYWdmaWx0ZXJIdG1sKCkgewogIHJldHVybiB7CiAgICBleGl0OiB7CiAgICAgIGh0bWxGbG93RGF0YSh0b2tlbikgewogICAgICAgIGV4aXRIdG1sRGF0YS5jYWxsKHRoaXMsIHRva2VuLCByZUZsb3cpOwogICAgICB9LAogICAgICBodG1sVGV4dERhdGEodG9rZW4pIHsKICAgICAgICBleGl0SHRtbERhdGEuY2FsbCh0aGlzLCB0b2tlbiwgcmVUZXh0KTsKICAgICAgfQogICAgfQogIH07Cn0KX19uYW1lKGdmbVRhZ2ZpbHRlckh0bWwsICJnZm1UYWdmaWx0ZXJIdG1sIik7CmZ1bmN0aW9uIGV4aXRIdG1sRGF0YSh0b2tlbiwgZmlsdGVyMikgewogIGxldCB2YWx1ZTIgPSB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKTsKICBpZiAodGhpcy5vcHRpb25zLmFsbG93RGFuZ2Vyb3VzSHRtbCkgewogICAgdmFsdWUyID0gdmFsdWUyLnJlcGxhY2UoZmlsdGVyMiwgIiZsdDskMSQyIik7CiAgfQogIHRoaXMucmF3KHRoaXMuZW5jb2RlKHZhbHVlMikpOwp9Cl9fbmFtZShleGl0SHRtbERhdGEsICJleGl0SHRtbERhdGEiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS10YXNrLWxpc3QtaXRlbUAyLjEuMC9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFzay1saXN0LWl0ZW0vbGliL2h0bWwuanMKZnVuY3Rpb24gZ2ZtVGFza0xpc3RJdGVtSHRtbCgpIHsKICByZXR1cm4gewogICAgZW50ZXI6IHsKICAgICAgdGFza0xpc3RDaGVjaygpIHsKICAgICAgICB0aGlzLnRhZygnPGlucHV0IHR5cGU9ImNoZWNrYm94IiBkaXNhYmxlZD0iIiAnKTsKICAgICAgfQogICAgfSwKICAgIGV4aXQ6IHsKICAgICAgdGFza0xpc3RDaGVjaygpIHsKICAgICAgICB0aGlzLnRhZygiLz4iKTsKICAgICAgfSwKICAgICAgdGFza0xpc3RDaGVja1ZhbHVlQ2hlY2tlZCgpIHsKICAgICAgICB0aGlzLnRhZygnY2hlY2tlZD0iIiAnKTsKICAgICAgfQogICAgfQogIH07Cn0KX19uYW1lKGdmbVRhc2tMaXN0SXRlbUh0bWwsICJnZm1UYXNrTGlzdEl0ZW1IdG1sIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFzay1saXN0LWl0ZW1AMi4xLjAvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhc2stbGlzdC1pdGVtL2xpYi9zeW50YXguanMKdmFyIHRhc2tsaXN0Q2hlY2sgPSB7CiAgbmFtZTogInRhc2tsaXN0Q2hlY2siLAogIHRva2VuaXplOiB0b2tlbml6ZVRhc2tsaXN0Q2hlY2sKfTsKZnVuY3Rpb24gZ2ZtVGFza0xpc3RJdGVtKCkgewogIHJldHVybiB7CiAgICB0ZXh0OiB7CiAgICAgIFs5MV06IHRhc2tsaXN0Q2hlY2sKICAgIH0KICB9Owp9Cl9fbmFtZShnZm1UYXNrTGlzdEl0ZW0sICJnZm1UYXNrTGlzdEl0ZW0iKTsKZnVuY3Rpb24gdG9rZW5pemVUYXNrbGlzdENoZWNrKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIHJldHVybiBvcGVuOwogIGZ1bmN0aW9uIG9wZW4oY29kZTQpIHsKICAgIGlmICgKICAgICAgLy8gRXhpdCBpZiB0aGVyZeKAmXMgc3R1ZmYgYmVmb3JlLgogICAgICBzZWxmMi5wcmV2aW91cyAhPT0gbnVsbCB8fCAvLyBFeGl0IGlmIG5vdCBpbiB0aGUgZmlyc3QgY29udGVudCB0aGF0IGlzIHRoZSBmaXJzdCBjaGlsZCBvZiBhIGxpc3QKICAgICAgLy8gaXRlbS4KICAgICAgIXNlbGYyLl9nZm1UYXNrbGlzdEZpcnN0Q29udGVudE9mTGlzdEl0ZW0KICAgICkgewogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuZW50ZXIoInRhc2tMaXN0Q2hlY2siKTsKICAgIGVmZmVjdHMuZW50ZXIoInRhc2tMaXN0Q2hlY2tNYXJrZXIiKTsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICBlZmZlY3RzLmV4aXQoInRhc2tMaXN0Q2hlY2tNYXJrZXIiKTsKICAgIHJldHVybiBpbnNpZGU7CiAgfQogIF9fbmFtZShvcGVuLCAib3BlbiIpOwogIGZ1bmN0aW9uIGluc2lkZShjb2RlNCkgewogICAgaWYgKG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuZW50ZXIoInRhc2tMaXN0Q2hlY2tWYWx1ZVVuY2hlY2tlZCIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoInRhc2tMaXN0Q2hlY2tWYWx1ZVVuY2hlY2tlZCIpOwogICAgICByZXR1cm4gY2xvc2U3OwogICAgfQogICAgaWYgKGNvZGU0ID09PSA4OCB8fCBjb2RlNCA9PT0gMTIwKSB7CiAgICAgIGVmZmVjdHMuZW50ZXIoInRhc2tMaXN0Q2hlY2tWYWx1ZUNoZWNrZWQiKTsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgZWZmZWN0cy5leGl0KCJ0YXNrTGlzdENoZWNrVmFsdWVDaGVja2VkIik7CiAgICAgIHJldHVybiBjbG9zZTc7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKGluc2lkZSwgImluc2lkZSIpOwogIGZ1bmN0aW9uIGNsb3NlNyhjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA5MykgewogICAgICBlZmZlY3RzLmVudGVyKCJ0YXNrTGlzdENoZWNrTWFya2VyIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgidGFza0xpc3RDaGVja01hcmtlciIpOwogICAgICBlZmZlY3RzLmV4aXQoInRhc2tMaXN0Q2hlY2siKTsKICAgICAgcmV0dXJuIGFmdGVyOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIF9fbmFtZShjbG9zZTcsICJjbG9zZSIpOwogIGZ1bmN0aW9uIGFmdGVyKGNvZGU0KSB7CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICByZXR1cm4gb2szKGNvZGU0KTsKICAgIH0KICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICByZXR1cm4gZWZmZWN0cy5jaGVjayh7CiAgICAgICAgdG9rZW5pemU6IHNwYWNlVGhlbk5vblNwYWNlCiAgICAgIH0sIG9rMywgbm9rKShjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgX19uYW1lKGFmdGVyLCAiYWZ0ZXIiKTsKfQpfX25hbWUodG9rZW5pemVUYXNrbGlzdENoZWNrLCAidG9rZW5pemVUYXNrbGlzdENoZWNrIik7CmZ1bmN0aW9uIHNwYWNlVGhlbk5vblNwYWNlKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBhZnRlciwgIndoaXRlc3BhY2UiKTsKICBmdW5jdGlvbiBhZnRlcihjb2RlNCkgewogICAgcmV0dXJuIGNvZGU0ID09PSBudWxsID8gbm9rKGNvZGU0KSA6IG9rMyhjb2RlNCk7CiAgfQogIF9fbmFtZShhZnRlciwgImFmdGVyIik7Cn0KX19uYW1lKHNwYWNlVGhlbk5vblNwYWNlLCAic3BhY2VUaGVuTm9uU3BhY2UiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZXh0ZW5zaW9uLWdmbUAzLjAuMC9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0vaW5kZXguanMKZnVuY3Rpb24gZ2ZtKG9wdGlvbnMpIHsKICByZXR1cm4gY29tYmluZUV4dGVuc2lvbnMoWwogICAgZ2ZtQXV0b2xpbmtMaXRlcmFsKCksCiAgICBnZm1Gb290bm90ZSgpLAogICAgZ2ZtU3RyaWtldGhyb3VnaChvcHRpb25zKSwKICAgIGdmbVRhYmxlKCksCiAgICBnZm1UYXNrTGlzdEl0ZW0oKQogIF0pOwp9Cl9fbmFtZShnZm0sICJnZm0iKTsKZnVuY3Rpb24gZ2ZtSHRtbChvcHRpb25zKSB7CiAgcmV0dXJuIGNvbWJpbmVIdG1sRXh0ZW5zaW9ucyhbCiAgICBnZm1BdXRvbGlua0xpdGVyYWxIdG1sKCksCiAgICBnZm1Gb290bm90ZUh0bWwob3B0aW9ucyksCiAgICBnZm1TdHJpa2V0aHJvdWdoSHRtbCgpLAogICAgZ2ZtVGFibGVIdG1sKCksCiAgICBnZm1UYWdmaWx0ZXJIdG1sKCksCiAgICBnZm1UYXNrTGlzdEl0ZW1IdG1sKCkKICBdKTsKfQpfX25hbWUoZ2ZtSHRtbCwgImdmbUh0bWwiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yZW1hcmstZ2ZtQDQuMC4xL25vZGVfbW9kdWxlcy9yZW1hcmstZ2ZtL2xpYi9pbmRleC5qcwp2YXIgZW1wdHlPcHRpb25zMyA9IHt9OwpmdW5jdGlvbiByZW1hcmtHZm0ob3B0aW9ucykgewogIGNvbnN0IHNlbGYyID0gKAogICAgLyoqIEB0eXBlIHtQcm9jZXNzb3I8Um9vdD59ICovCiAgICB0aGlzCiAgKTsKICBjb25zdCBzZXR0aW5ncyA9IG9wdGlvbnMgfHwgZW1wdHlPcHRpb25zMzsKICBjb25zdCBkYXRhID0gc2VsZjIuZGF0YSgpOwogIGNvbnN0IG1pY3JvbWFya0V4dGVuc2lvbnMgPSBkYXRhLm1pY3JvbWFya0V4dGVuc2lvbnMgfHwgKGRhdGEubWljcm9tYXJrRXh0ZW5zaW9ucyA9IFtdKTsKICBjb25zdCBmcm9tTWFya2Rvd25FeHRlbnNpb25zID0gZGF0YS5mcm9tTWFya2Rvd25FeHRlbnNpb25zIHx8IChkYXRhLmZyb21NYXJrZG93bkV4dGVuc2lvbnMgPSBbXSk7CiAgY29uc3QgdG9NYXJrZG93bkV4dGVuc2lvbnMgPSBkYXRhLnRvTWFya2Rvd25FeHRlbnNpb25zIHx8IChkYXRhLnRvTWFya2Rvd25FeHRlbnNpb25zID0gW10pOwogIG1pY3JvbWFya0V4dGVuc2lvbnMucHVzaChnZm0oc2V0dGluZ3MpKTsKICBmcm9tTWFya2Rvd25FeHRlbnNpb25zLnB1c2goZ2ZtRnJvbU1hcmtkb3duKCkpOwogIHRvTWFya2Rvd25FeHRlbnNpb25zLnB1c2goZ2ZtVG9NYXJrZG93bihzZXR0aW5ncykpOwp9Cl9fbmFtZShyZW1hcmtHZm0sICJyZW1hcmtHZm0iKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmtANC4wLjIvbm9kZV9tb2R1bGVzL21pY3JvbWFyay9saWIvY29tcGlsZS5qcwp2YXIgaGFzT3duUHJvcGVydHkyID0ge30uaGFzT3duUHJvcGVydHk7CnZhciBwcm90b2NvbEhyZWYgPSAvXihodHRwcz98aXJjcz98bWFpbHRvfHhtcHApJC9pOwp2YXIgcHJvdG9jb2xTb3VyY2UgPSAvXmh0dHBzPyQvaTsKZnVuY3Rpb24gY29tcGlsZShvcHRpb25zKSB7CiAgY29uc3Qgc2V0dGluZ3MgPSBvcHRpb25zIHx8IHt9OwogIGxldCB0YWdzID0gdHJ1ZTsKICBjb25zdCBkZWZpbml0aW9ucyA9IHt9OwogIGNvbnN0IGJ1ZmZlcnMgPSBbW11dOwogIGNvbnN0IG1lZGlhU3RhY2sgPSBbXTsKICBjb25zdCB0aWdodFN0YWNrID0gW107CiAgY29uc3QgZGVmYXVsdEhhbmRsZXJzID0gewogICAgZW50ZXI6IHsKICAgICAgYmxvY2tRdW90ZTogb25lbnRlcmJsb2NrcXVvdGUsCiAgICAgIGNvZGVGZW5jZWQ6IG9uZW50ZXJjb2RlZmVuY2VkLAogICAgICBjb2RlRmVuY2VkRmVuY2VJbmZvOiBidWZmZXIyLAogICAgICBjb2RlRmVuY2VkRmVuY2VNZXRhOiBidWZmZXIyLAogICAgICBjb2RlSW5kZW50ZWQ6IG9uZW50ZXJjb2RlaW5kZW50ZWQsCiAgICAgIGNvZGVUZXh0OiBvbmVudGVyY29kZXRleHQsCiAgICAgIGNvbnRlbnQ6IG9uZW50ZXJjb250ZW50LAogICAgICBkZWZpbml0aW9uOiBvbmVudGVyZGVmaW5pdGlvbiwKICAgICAgZGVmaW5pdGlvbkRlc3RpbmF0aW9uU3RyaW5nOiBvbmVudGVyZGVmaW5pdGlvbmRlc3RpbmF0aW9uc3RyaW5nLAogICAgICBkZWZpbml0aW9uTGFiZWxTdHJpbmc6IGJ1ZmZlcjIsCiAgICAgIGRlZmluaXRpb25UaXRsZVN0cmluZzogYnVmZmVyMiwKICAgICAgZW1waGFzaXM6IG9uZW50ZXJlbXBoYXNpcywKICAgICAgaHRtbEZsb3c6IG9uZW50ZXJodG1sZmxvdywKICAgICAgaHRtbFRleHQ6IG9uZW50ZXJodG1sLAogICAgICBpbWFnZTogb25lbnRlcmltYWdlLAogICAgICBsYWJlbDogYnVmZmVyMiwKICAgICAgbGluazogb25lbnRlcmxpbmssCiAgICAgIGxpc3RJdGVtTWFya2VyOiBvbmVudGVybGlzdGl0ZW1tYXJrZXIsCiAgICAgIGxpc3RJdGVtVmFsdWU6IG9uZW50ZXJsaXN0aXRlbXZhbHVlLAogICAgICBsaXN0T3JkZXJlZDogb25lbnRlcmxpc3RvcmRlcmVkLAogICAgICBsaXN0VW5vcmRlcmVkOiBvbmVudGVybGlzdHVub3JkZXJlZCwKICAgICAgcGFyYWdyYXBoOiBvbmVudGVycGFyYWdyYXBoLAogICAgICByZWZlcmVuY2U6IGJ1ZmZlcjIsCiAgICAgIHJlc291cmNlOiBvbmVudGVycmVzb3VyY2UsCiAgICAgIHJlc291cmNlRGVzdGluYXRpb25TdHJpbmc6IG9uZW50ZXJyZXNvdXJjZWRlc3RpbmF0aW9uc3RyaW5nLAogICAgICByZXNvdXJjZVRpdGxlU3RyaW5nOiBidWZmZXIyLAogICAgICBzZXRleHRIZWFkaW5nOiBvbmVudGVyc2V0ZXh0aGVhZGluZywKICAgICAgc3Ryb25nOiBvbmVudGVyc3Ryb25nCiAgICB9LAogICAgZXhpdDogewogICAgICBhdHhIZWFkaW5nOiBvbmV4aXRhdHhoZWFkaW5nLAogICAgICBhdHhIZWFkaW5nU2VxdWVuY2U6IG9uZXhpdGF0eGhlYWRpbmdzZXF1ZW5jZSwKICAgICAgYXV0b2xpbmtFbWFpbDogb25leGl0YXV0b2xpbmtlbWFpbCwKICAgICAgYXV0b2xpbmtQcm90b2NvbDogb25leGl0YXV0b2xpbmtwcm90b2NvbCwKICAgICAgYmxvY2tRdW90ZTogb25leGl0YmxvY2txdW90ZSwKICAgICAgY2hhcmFjdGVyRXNjYXBlVmFsdWU6IG9uZXhpdGRhdGEsCiAgICAgIGNoYXJhY3RlclJlZmVyZW5jZU1hcmtlckhleGFkZWNpbWFsOiBvbmV4aXRjaGFyYWN0ZXJyZWZlcmVuY2VtYXJrZXIsCiAgICAgIGNoYXJhY3RlclJlZmVyZW5jZU1hcmtlck51bWVyaWM6IG9uZXhpdGNoYXJhY3RlcnJlZmVyZW5jZW1hcmtlciwKICAgICAgY2hhcmFjdGVyUmVmZXJlbmNlVmFsdWU6IG9uZXhpdGNoYXJhY3RlcnJlZmVyZW5jZXZhbHVlLAogICAgICBjb2RlRmVuY2VkOiBvbmV4aXRmbG93Y29kZSwKICAgICAgY29kZUZlbmNlZEZlbmNlOiBvbmV4aXRjb2RlZmVuY2VkZmVuY2UsCiAgICAgIGNvZGVGZW5jZWRGZW5jZUluZm86IG9uZXhpdGNvZGVmZW5jZWRmZW5jZWluZm8sCiAgICAgIGNvZGVGZW5jZWRGZW5jZU1ldGE6IG9ucmVzdW1lZHJvcCwKICAgICAgY29kZUZsb3dWYWx1ZTogb25leGl0Y29kZWZsb3d2YWx1ZSwKICAgICAgY29kZUluZGVudGVkOiBvbmV4aXRmbG93Y29kZSwKICAgICAgY29kZVRleHQ6IG9uZXhpdGNvZGV0ZXh0LAogICAgICBjb2RlVGV4dERhdGE6IG9uZXhpdGRhdGEsCiAgICAgIGRhdGE6IG9uZXhpdGRhdGEsCiAgICAgIGRlZmluaXRpb246IG9uZXhpdGRlZmluaXRpb24sCiAgICAgIGRlZmluaXRpb25EZXN0aW5hdGlvblN0cmluZzogb25leGl0ZGVmaW5pdGlvbmRlc3RpbmF0aW9uc3RyaW5nLAogICAgICBkZWZpbml0aW9uTGFiZWxTdHJpbmc6IG9uZXhpdGRlZmluaXRpb25sYWJlbHN0cmluZywKICAgICAgZGVmaW5pdGlvblRpdGxlU3RyaW5nOiBvbmV4aXRkZWZpbml0aW9udGl0bGVzdHJpbmcsCiAgICAgIGVtcGhhc2lzOiBvbmV4aXRlbXBoYXNpcywKICAgICAgaGFyZEJyZWFrRXNjYXBlOiBvbmV4aXRoYXJkYnJlYWssCiAgICAgIGhhcmRCcmVha1RyYWlsaW5nOiBvbmV4aXRoYXJkYnJlYWssCiAgICAgIGh0bWxGbG93OiBvbmV4aXRodG1sLAogICAgICBodG1sRmxvd0RhdGE6IG9uZXhpdGRhdGEsCiAgICAgIGh0bWxUZXh0OiBvbmV4aXRodG1sLAogICAgICBodG1sVGV4dERhdGE6IG9uZXhpdGRhdGEsCiAgICAgIGltYWdlOiBvbmV4aXRtZWRpYSwKICAgICAgbGFiZWw6IG9uZXhpdGxhYmVsLAogICAgICBsYWJlbFRleHQ6IG9uZXhpdGxhYmVsdGV4dCwKICAgICAgbGluZUVuZGluZzogb25leGl0bGluZWVuZGluZywKICAgICAgbGluazogb25leGl0bWVkaWEsCiAgICAgIGxpc3RPcmRlcmVkOiBvbmV4aXRsaXN0b3JkZXJlZCwKICAgICAgbGlzdFVub3JkZXJlZDogb25leGl0bGlzdHVub3JkZXJlZCwKICAgICAgcGFyYWdyYXBoOiBvbmV4aXRwYXJhZ3JhcGgsCiAgICAgIHJlZmVyZW5jZTogb25yZXN1bWVkcm9wLAogICAgICByZWZlcmVuY2VTdHJpbmc6IG9uZXhpdHJlZmVyZW5jZXN0cmluZywKICAgICAgcmVzb3VyY2U6IG9ucmVzdW1lZHJvcCwKICAgICAgcmVzb3VyY2VEZXN0aW5hdGlvblN0cmluZzogb25leGl0cmVzb3VyY2VkZXN0aW5hdGlvbnN0cmluZywKICAgICAgcmVzb3VyY2VUaXRsZVN0cmluZzogb25leGl0cmVzb3VyY2V0aXRsZXN0cmluZywKICAgICAgc2V0ZXh0SGVhZGluZzogb25leGl0c2V0ZXh0aGVhZGluZywKICAgICAgc2V0ZXh0SGVhZGluZ0xpbmVTZXF1ZW5jZTogb25leGl0c2V0ZXh0aGVhZGluZ2xpbmVzZXF1ZW5jZSwKICAgICAgc2V0ZXh0SGVhZGluZ1RleHQ6IG9uZXhpdHNldGV4dGhlYWRpbmd0ZXh0LAogICAgICBzdHJvbmc6IG9uZXhpdHN0cm9uZywKICAgICAgdGhlbWF0aWNCcmVhazogb25leGl0dGhlbWF0aWNicmVhawogICAgfQogIH07CiAgY29uc3QgaGFuZGxlcnMyID0gKAogICAgLyoqIEB0eXBlIHtOb3JtYWxpemVkSHRtbEV4dGVuc2lvbn0gKi8KICAgIGNvbWJpbmVIdG1sRXh0ZW5zaW9ucyhbZGVmYXVsdEhhbmRsZXJzLCAuLi5zZXR0aW5ncy5odG1sRXh0ZW5zaW9ucyB8fCBbXV0pCiAgKTsKICBjb25zdCBkYXRhID0gewogICAgZGVmaW5pdGlvbnMsCiAgICB0aWdodFN0YWNrCiAgfTsKICBjb25zdCBjb250ZXh0MiA9IHsKICAgIGJ1ZmZlcjogYnVmZmVyMiwKICAgIGVuY29kZTogZW5jb2RlMiwKICAgIGdldERhdGEsCiAgICBsaW5lRW5kaW5nSWZOZWVkZWQsCiAgICBvcHRpb25zOiBzZXR0aW5ncywKICAgIHJhdzogcmF3MiwKICAgIHJlc3VtZSwKICAgIHNldERhdGEsCiAgICB0YWcKICB9OwogIGxldCBsaW5lRW5kaW5nU3R5bGUgPSBzZXR0aW5ncy5kZWZhdWx0TGluZUVuZGluZzsKICByZXR1cm4gY29tcGlsZTI7CiAgZnVuY3Rpb24gY29tcGlsZTIoZXZlbnRzKSB7CiAgICBsZXQgaW5kZXgyID0gLTE7CiAgICBsZXQgc3RhcnQgPSAwOwogICAgY29uc3QgbGlzdFN0YWNrID0gW107CiAgICBsZXQgaGVhZDIgPSBbXTsKICAgIGxldCBib2R5MyA9IFtdOwogICAgd2hpbGUgKCsraW5kZXgyIDwgZXZlbnRzLmxlbmd0aCkgewogICAgICBpZiAoIWxpbmVFbmRpbmdTdHlsZSAmJiAoZXZlbnRzW2luZGV4Ml1bMV0udHlwZSA9PT0gImxpbmVFbmRpbmciIHx8IGV2ZW50c1tpbmRleDJdWzFdLnR5cGUgPT09ICJsaW5lRW5kaW5nQmxhbmsiKSkgewogICAgICAgIGxpbmVFbmRpbmdTdHlsZSA9IC8qKiBAdHlwZSB7TGluZUVuZGluZ30gKi8KICAgICAgICBldmVudHNbaW5kZXgyXVsyXS5zbGljZVNlcmlhbGl6ZShldmVudHNbaW5kZXgyXVsxXSk7CiAgICAgIH0KICAgICAgaWYgKGV2ZW50c1tpbmRleDJdWzFdLnR5cGUgPT09ICJsaXN0T3JkZXJlZCIgfHwgZXZlbnRzW2luZGV4Ml1bMV0udHlwZSA9PT0gImxpc3RVbm9yZGVyZWQiKSB7CiAgICAgICAgaWYgKGV2ZW50c1tpbmRleDJdWzBdID09PSAiZW50ZXIiKSB7CiAgICAgICAgICBsaXN0U3RhY2sucHVzaChpbmRleDIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwcmVwYXJlTGlzdChldmVudHMuc2xpY2UobGlzdFN0YWNrLnBvcCgpLCBpbmRleDIpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGV2ZW50c1tpbmRleDJdWzFdLnR5cGUgPT09ICJkZWZpbml0aW9uIikgewogICAgICAgIGlmIChldmVudHNbaW5kZXgyXVswXSA9PT0gImVudGVyIikgewogICAgICAgICAgYm9keTMgPSBwdXNoKGJvZHkzLCBldmVudHMuc2xpY2Uoc3RhcnQsIGluZGV4MikpOwogICAgICAgICAgc3RhcnQgPSBpbmRleDI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGhlYWQyID0gcHVzaChoZWFkMiwgZXZlbnRzLnNsaWNlKHN0YXJ0LCBpbmRleDIgKyAxKSk7CiAgICAgICAgICBzdGFydCA9IGluZGV4MiArIDE7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBoZWFkMiA9IHB1c2goaGVhZDIsIGJvZHkzKTsKICAgIGhlYWQyID0gcHVzaChoZWFkMiwgZXZlbnRzLnNsaWNlKHN0YXJ0KSk7CiAgICBpbmRleDIgPSAtMTsKICAgIGNvbnN0IHJlc3VsdCA9IGhlYWQyOwogICAgaWYgKGhhbmRsZXJzMi5lbnRlci5udWxsKSB7CiAgICAgIGhhbmRsZXJzMi5lbnRlci5udWxsLmNhbGwoY29udGV4dDIpOwogICAgfQogICAgd2hpbGUgKCsraW5kZXgyIDwgZXZlbnRzLmxlbmd0aCkgewogICAgICBjb25zdCBoYW5kbGVzID0gaGFuZGxlcnMyW3Jlc3VsdFtpbmRleDJdWzBdXTsKICAgICAgY29uc3Qga2luZCA9IHJlc3VsdFtpbmRleDJdWzFdLnR5cGU7CiAgICAgIGNvbnN0IGhhbmRsZTMgPSBoYW5kbGVzW2tpbmRdOwogICAgICBpZiAoaGFzT3duUHJvcGVydHkyLmNhbGwoaGFuZGxlcywga2luZCkgJiYgaGFuZGxlMykgewogICAgICAgIGhhbmRsZTMuY2FsbCh7CiAgICAgICAgICBzbGljZVNlcmlhbGl6ZTogcmVzdWx0W2luZGV4Ml1bMl0uc2xpY2VTZXJpYWxpemUsCiAgICAgICAgICAuLi5jb250ZXh0MgogICAgICAgIH0sIHJlc3VsdFtpbmRleDJdWzFdKTsKICAgICAgfQogICAgfQogICAgaWYgKGhhbmRsZXJzMi5leGl0Lm51bGwpIHsKICAgICAgaGFuZGxlcnMyLmV4aXQubnVsbC5jYWxsKGNvbnRleHQyKTsKICAgIH0KICAgIHJldHVybiBidWZmZXJzWzBdLmpvaW4oIiIpOwogIH0KICBfX25hbWUoY29tcGlsZTIsICJjb21waWxlIik7CiAgZnVuY3Rpb24gcHJlcGFyZUxpc3Qoc2xpY2UpIHsKICAgIGNvbnN0IGxlbmd0aCA9IHNsaWNlLmxlbmd0aDsKICAgIGxldCBpbmRleDIgPSAwOwogICAgbGV0IGNvbnRhaW5lckJhbGFuY2UgPSAwOwogICAgbGV0IGxvb3NlID0gZmFsc2U7CiAgICBsZXQgYXRNYXJrZXI7CiAgICB3aGlsZSAoKytpbmRleDIgPCBsZW5ndGgpIHsKICAgICAgY29uc3QgZXZlbnQgPSBzbGljZVtpbmRleDJdOwogICAgICBpZiAoZXZlbnRbMV0uX2NvbnRhaW5lcikgewogICAgICAgIGF0TWFya2VyID0gdm9pZCAwOwogICAgICAgIGlmIChldmVudFswXSA9PT0gImVudGVyIikgewogICAgICAgICAgY29udGFpbmVyQmFsYW5jZSsrOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb250YWluZXJCYWxhbmNlLS07CiAgICAgICAgfQogICAgICB9IGVsc2Ugc3dpdGNoIChldmVudFsxXS50eXBlKSB7CiAgICAgICAgY2FzZSAibGlzdEl0ZW1QcmVmaXgiOiB7CiAgICAgICAgICBpZiAoZXZlbnRbMF0gPT09ICJleGl0IikgewogICAgICAgICAgICBhdE1hcmtlciA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY2FzZSAibGluZVByZWZpeCI6IHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjYXNlICJsaW5lRW5kaW5nQmxhbmsiOiB7CiAgICAgICAgICBpZiAoZXZlbnRbMF0gPT09ICJlbnRlciIgJiYgIWNvbnRhaW5lckJhbGFuY2UpIHsKICAgICAgICAgICAgaWYgKGF0TWFya2VyKSB7CiAgICAgICAgICAgICAgYXRNYXJrZXIgPSB2b2lkIDA7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgbG9vc2UgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgZGVmYXVsdDogewogICAgICAgICAgYXRNYXJrZXIgPSB2b2lkIDA7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBzbGljZVswXVsxXS5fbG9vc2UgPSBsb29zZTsKICB9CiAgX19uYW1lKHByZXBhcmVMaXN0LCAicHJlcGFyZUxpc3QiKTsKICBmdW5jdGlvbiBzZXREYXRhKGtleTIsIHZhbHVlMikgewogICAgZGF0YVtrZXkyXSA9IHZhbHVlMjsKICB9CiAgX19uYW1lKHNldERhdGEsICJzZXREYXRhIik7CiAgZnVuY3Rpb24gZ2V0RGF0YShrZXkyKSB7CiAgICByZXR1cm4gZGF0YVtrZXkyXTsKICB9CiAgX19uYW1lKGdldERhdGEsICJnZXREYXRhIik7CiAgZnVuY3Rpb24gYnVmZmVyMigpIHsKICAgIGJ1ZmZlcnMucHVzaChbXSk7CiAgfQogIF9fbmFtZShidWZmZXIyLCAiYnVmZmVyIik7CiAgZnVuY3Rpb24gcmVzdW1lKCkgewogICAgY29uc3QgYnVmID0gYnVmZmVycy5wb3AoKTsKICAgIHJldHVybiBidWYuam9pbigiIik7CiAgfQogIF9fbmFtZShyZXN1bWUsICJyZXN1bWUiKTsKICBmdW5jdGlvbiB0YWcodmFsdWUyKSB7CiAgICBpZiAoIXRhZ3MpIHJldHVybjsKICAgIHNldERhdGEoImxhc3RXYXNUYWciLCB0cnVlKTsKICAgIGJ1ZmZlcnNbYnVmZmVycy5sZW5ndGggLSAxXS5wdXNoKHZhbHVlMik7CiAgfQogIF9fbmFtZSh0YWcsICJ0YWciKTsKICBmdW5jdGlvbiByYXcyKHZhbHVlMikgewogICAgc2V0RGF0YSgibGFzdFdhc1RhZyIpOwogICAgYnVmZmVyc1tidWZmZXJzLmxlbmd0aCAtIDFdLnB1c2godmFsdWUyKTsKICB9CiAgX19uYW1lKHJhdzIsICJyYXciKTsKICBmdW5jdGlvbiBsaW5lRW5kaW5nMigpIHsKICAgIHJhdzIobGluZUVuZGluZ1N0eWxlIHx8ICJcbiIpOwogIH0KICBfX25hbWUobGluZUVuZGluZzIsICJsaW5lRW5kaW5nIik7CiAgZnVuY3Rpb24gbGluZUVuZGluZ0lmTmVlZGVkKCkgewogICAgY29uc3QgYnVmZmVyMyA9IGJ1ZmZlcnNbYnVmZmVycy5sZW5ndGggLSAxXTsKICAgIGNvbnN0IHNsaWNlID0gYnVmZmVyM1tidWZmZXIzLmxlbmd0aCAtIDFdOwogICAgY29uc3QgcHJldmlvdXMzID0gc2xpY2UgPyBzbGljZS5jaGFyQ29kZUF0KHNsaWNlLmxlbmd0aCAtIDEpIDogbnVsbDsKICAgIGlmIChwcmV2aW91czMgPT09IDEwIHx8IHByZXZpb3VzMyA9PT0gMTMgfHwgcHJldmlvdXMzID09PSBudWxsKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGxpbmVFbmRpbmcyKCk7CiAgfQogIF9fbmFtZShsaW5lRW5kaW5nSWZOZWVkZWQsICJsaW5lRW5kaW5nSWZOZWVkZWQiKTsKICBmdW5jdGlvbiBlbmNvZGUyKHZhbHVlMikgewogICAgcmV0dXJuIGdldERhdGEoImlnbm9yZUVuY29kZSIpID8gdmFsdWUyIDogZW5jb2RlKHZhbHVlMik7CiAgfQogIF9fbmFtZShlbmNvZGUyLCAiZW5jb2RlIik7CiAgZnVuY3Rpb24gb25yZXN1bWVkcm9wKCkgewogICAgcmVzdW1lKCk7CiAgfQogIF9fbmFtZShvbnJlc3VtZWRyb3AsICJvbnJlc3VtZWRyb3AiKTsKICBmdW5jdGlvbiBvbmVudGVybGlzdG9yZGVyZWQodG9rZW4pIHsKICAgIHRpZ2h0U3RhY2sucHVzaCghdG9rZW4uX2xvb3NlKTsKICAgIGxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgdGFnKCI8b2wiKTsKICAgIHNldERhdGEoImV4cGVjdEZpcnN0SXRlbSIsIHRydWUpOwogIH0KICBfX25hbWUob25lbnRlcmxpc3RvcmRlcmVkLCAib25lbnRlcmxpc3RvcmRlcmVkIik7CiAgZnVuY3Rpb24gb25lbnRlcmxpc3R1bm9yZGVyZWQodG9rZW4pIHsKICAgIHRpZ2h0U3RhY2sucHVzaCghdG9rZW4uX2xvb3NlKTsKICAgIGxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgdGFnKCI8dWwiKTsKICAgIHNldERhdGEoImV4cGVjdEZpcnN0SXRlbSIsIHRydWUpOwogIH0KICBfX25hbWUob25lbnRlcmxpc3R1bm9yZGVyZWQsICJvbmVudGVybGlzdHVub3JkZXJlZCIpOwogIGZ1bmN0aW9uIG9uZW50ZXJsaXN0aXRlbXZhbHVlKHRva2VuKSB7CiAgICBpZiAoZ2V0RGF0YSgiZXhwZWN0Rmlyc3RJdGVtIikpIHsKICAgICAgY29uc3QgdmFsdWUyID0gTnVtYmVyLnBhcnNlSW50KHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pLCAxMCk7CiAgICAgIGlmICh2YWx1ZTIgIT09IDEpIHsKICAgICAgICB0YWcoJyBzdGFydD0iJyArIGVuY29kZTIoU3RyaW5nKHZhbHVlMikpICsgJyInKTsKICAgICAgfQogICAgfQogIH0KICBfX25hbWUob25lbnRlcmxpc3RpdGVtdmFsdWUsICJvbmVudGVybGlzdGl0ZW12YWx1ZSIpOwogIGZ1bmN0aW9uIG9uZW50ZXJsaXN0aXRlbW1hcmtlcigpIHsKICAgIGlmIChnZXREYXRhKCJleHBlY3RGaXJzdEl0ZW0iKSkgewogICAgICB0YWcoIj4iKTsKICAgIH0gZWxzZSB7CiAgICAgIG9uZXhpdGxpc3RpdGVtKCk7CiAgICB9CiAgICBsaW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgIHRhZygiPGxpPiIpOwogICAgc2V0RGF0YSgiZXhwZWN0Rmlyc3RJdGVtIik7CiAgICBzZXREYXRhKCJsYXN0V2FzVGFnIik7CiAgfQogIF9fbmFtZShvbmVudGVybGlzdGl0ZW1tYXJrZXIsICJvbmVudGVybGlzdGl0ZW1tYXJrZXIiKTsKICBmdW5jdGlvbiBvbmV4aXRsaXN0b3JkZXJlZCgpIHsKICAgIG9uZXhpdGxpc3RpdGVtKCk7CiAgICB0aWdodFN0YWNrLnBvcCgpOwogICAgbGluZUVuZGluZzIoKTsKICAgIHRhZygiPC9vbD4iKTsKICB9CiAgX19uYW1lKG9uZXhpdGxpc3RvcmRlcmVkLCAib25leGl0bGlzdG9yZGVyZWQiKTsKICBmdW5jdGlvbiBvbmV4aXRsaXN0dW5vcmRlcmVkKCkgewogICAgb25leGl0bGlzdGl0ZW0oKTsKICAgIHRpZ2h0U3RhY2sucG9wKCk7CiAgICBsaW5lRW5kaW5nMigpOwogICAgdGFnKCI8L3VsPiIpOwogIH0KICBfX25hbWUob25leGl0bGlzdHVub3JkZXJlZCwgIm9uZXhpdGxpc3R1bm9yZGVyZWQiKTsKICBmdW5jdGlvbiBvbmV4aXRsaXN0aXRlbSgpIHsKICAgIGlmIChnZXREYXRhKCJsYXN0V2FzVGFnIikgJiYgIWdldERhdGEoInNsdXJwQWxsTGluZUVuZGluZ3MiKSkgewogICAgICBsaW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgIH0KICAgIHRhZygiPC9saT4iKTsKICAgIHNldERhdGEoInNsdXJwQWxsTGluZUVuZGluZ3MiKTsKICB9CiAgX19uYW1lKG9uZXhpdGxpc3RpdGVtLCAib25leGl0bGlzdGl0ZW0iKTsKICBmdW5jdGlvbiBvbmVudGVyYmxvY2txdW90ZSgpIHsKICAgIHRpZ2h0U3RhY2sucHVzaChmYWxzZSk7CiAgICBsaW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgIHRhZygiPGJsb2NrcXVvdGU+Iik7CiAgfQogIF9fbmFtZShvbmVudGVyYmxvY2txdW90ZSwgIm9uZW50ZXJibG9ja3F1b3RlIik7CiAgZnVuY3Rpb24gb25leGl0YmxvY2txdW90ZSgpIHsKICAgIHRpZ2h0U3RhY2sucG9wKCk7CiAgICBsaW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgIHRhZygiPC9ibG9ja3F1b3RlPiIpOwogICAgc2V0RGF0YSgic2x1cnBBbGxMaW5lRW5kaW5ncyIpOwogIH0KICBfX25hbWUob25leGl0YmxvY2txdW90ZSwgIm9uZXhpdGJsb2NrcXVvdGUiKTsKICBmdW5jdGlvbiBvbmVudGVycGFyYWdyYXBoKCkgewogICAgaWYgKCF0aWdodFN0YWNrW3RpZ2h0U3RhY2subGVuZ3RoIC0gMV0pIHsKICAgICAgbGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICAgIHRhZygiPHA+Iik7CiAgICB9CiAgICBzZXREYXRhKCJzbHVycEFsbExpbmVFbmRpbmdzIik7CiAgfQogIF9fbmFtZShvbmVudGVycGFyYWdyYXBoLCAib25lbnRlcnBhcmFncmFwaCIpOwogIGZ1bmN0aW9uIG9uZXhpdHBhcmFncmFwaCgpIHsKICAgIGlmICh0aWdodFN0YWNrW3RpZ2h0U3RhY2subGVuZ3RoIC0gMV0pIHsKICAgICAgc2V0RGF0YSgic2x1cnBBbGxMaW5lRW5kaW5ncyIsIHRydWUpOwogICAgfSBlbHNlIHsKICAgICAgdGFnKCI8L3A+Iik7CiAgICB9CiAgfQogIF9fbmFtZShvbmV4aXRwYXJhZ3JhcGgsICJvbmV4aXRwYXJhZ3JhcGgiKTsKICBmdW5jdGlvbiBvbmVudGVyY29kZWZlbmNlZCgpIHsKICAgIGxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgdGFnKCI8cHJlPjxjb2RlIik7CiAgICBzZXREYXRhKCJmZW5jZXNDb3VudCIsIDApOwogIH0KICBfX25hbWUob25lbnRlcmNvZGVmZW5jZWQsICJvbmVudGVyY29kZWZlbmNlZCIpOwogIGZ1bmN0aW9uIG9uZXhpdGNvZGVmZW5jZWRmZW5jZWluZm8oKSB7CiAgICBjb25zdCB2YWx1ZTIgPSByZXN1bWUoKTsKICAgIHRhZygnIGNsYXNzPSJsYW5ndWFnZS0nICsgdmFsdWUyICsgJyInKTsKICB9CiAgX19uYW1lKG9uZXhpdGNvZGVmZW5jZWRmZW5jZWluZm8sICJvbmV4aXRjb2RlZmVuY2VkZmVuY2VpbmZvIik7CiAgZnVuY3Rpb24gb25leGl0Y29kZWZlbmNlZGZlbmNlKCkgewogICAgY29uc3QgY291bnQyID0gZ2V0RGF0YSgiZmVuY2VzQ291bnQiKSB8fCAwOwogICAgaWYgKCFjb3VudDIpIHsKICAgICAgdGFnKCI+Iik7CiAgICAgIHNldERhdGEoInNsdXJwT25lTGluZUVuZGluZyIsIHRydWUpOwogICAgfQogICAgc2V0RGF0YSgiZmVuY2VzQ291bnQiLCBjb3VudDIgKyAxKTsKICB9CiAgX19uYW1lKG9uZXhpdGNvZGVmZW5jZWRmZW5jZSwgIm9uZXhpdGNvZGVmZW5jZWRmZW5jZSIpOwogIGZ1bmN0aW9uIG9uZW50ZXJjb2RlaW5kZW50ZWQoKSB7CiAgICBsaW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgIHRhZygiPHByZT48Y29kZT4iKTsKICB9CiAgX19uYW1lKG9uZW50ZXJjb2RlaW5kZW50ZWQsICJvbmVudGVyY29kZWluZGVudGVkIik7CiAgZnVuY3Rpb24gb25leGl0Zmxvd2NvZGUoKSB7CiAgICBjb25zdCBjb3VudDIgPSBnZXREYXRhKCJmZW5jZXNDb3VudCIpOwogICAgaWYgKGNvdW50MiAhPT0gdm9pZCAwICYmIGNvdW50MiA8IDIgJiYgZGF0YS50aWdodFN0YWNrLmxlbmd0aCA+IDAgJiYgIWdldERhdGEoImxhc3RXYXNUYWciKSkgewogICAgICBsaW5lRW5kaW5nMigpOwogICAgfQogICAgaWYgKGdldERhdGEoImZsb3dDb2RlU2VlbkRhdGEiKSkgewogICAgICBsaW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgIH0KICAgIHRhZygiPC9jb2RlPjwvcHJlPiIpOwogICAgaWYgKGNvdW50MiAhPT0gdm9pZCAwICYmIGNvdW50MiA8IDIpIGxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgc2V0RGF0YSgiZmxvd0NvZGVTZWVuRGF0YSIpOwogICAgc2V0RGF0YSgiZmVuY2VzQ291bnQiKTsKICAgIHNldERhdGEoInNsdXJwT25lTGluZUVuZGluZyIpOwogIH0KICBfX25hbWUob25leGl0Zmxvd2NvZGUsICJvbmV4aXRmbG93Y29kZSIpOwogIGZ1bmN0aW9uIG9uZW50ZXJpbWFnZSgpIHsKICAgIG1lZGlhU3RhY2sucHVzaCh7CiAgICAgIGltYWdlOiB0cnVlCiAgICB9KTsKICAgIHRhZ3MgPSB2b2lkIDA7CiAgfQogIF9fbmFtZShvbmVudGVyaW1hZ2UsICJvbmVudGVyaW1hZ2UiKTsKICBmdW5jdGlvbiBvbmVudGVybGluaygpIHsKICAgIG1lZGlhU3RhY2sucHVzaCh7fSk7CiAgfQogIF9fbmFtZShvbmVudGVybGluaywgIm9uZW50ZXJsaW5rIik7CiAgZnVuY3Rpb24gb25leGl0bGFiZWx0ZXh0KHRva2VuKSB7CiAgICBtZWRpYVN0YWNrW21lZGlhU3RhY2subGVuZ3RoIC0gMV0ubGFiZWxJZCA9IHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pOwogIH0KICBfX25hbWUob25leGl0bGFiZWx0ZXh0LCAib25leGl0bGFiZWx0ZXh0Iik7CiAgZnVuY3Rpb24gb25leGl0bGFiZWwoKSB7CiAgICBtZWRpYVN0YWNrW21lZGlhU3RhY2subGVuZ3RoIC0gMV0ubGFiZWwgPSByZXN1bWUoKTsKICB9CiAgX19uYW1lKG9uZXhpdGxhYmVsLCAib25leGl0bGFiZWwiKTsKICBmdW5jdGlvbiBvbmV4aXRyZWZlcmVuY2VzdHJpbmcodG9rZW4pIHsKICAgIG1lZGlhU3RhY2tbbWVkaWFTdGFjay5sZW5ndGggLSAxXS5yZWZlcmVuY2VJZCA9IHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pOwogIH0KICBfX25hbWUob25leGl0cmVmZXJlbmNlc3RyaW5nLCAib25leGl0cmVmZXJlbmNlc3RyaW5nIik7CiAgZnVuY3Rpb24gb25lbnRlcnJlc291cmNlKCkgewogICAgYnVmZmVyMigpOwogICAgbWVkaWFTdGFja1ttZWRpYVN0YWNrLmxlbmd0aCAtIDFdLmRlc3RpbmF0aW9uID0gIiI7CiAgfQogIF9fbmFtZShvbmVudGVycmVzb3VyY2UsICJvbmVudGVycmVzb3VyY2UiKTsKICBmdW5jdGlvbiBvbmVudGVycmVzb3VyY2VkZXN0aW5hdGlvbnN0cmluZygpIHsKICAgIGJ1ZmZlcjIoKTsKICAgIHNldERhdGEoImlnbm9yZUVuY29kZSIsIHRydWUpOwogIH0KICBfX25hbWUob25lbnRlcnJlc291cmNlZGVzdGluYXRpb25zdHJpbmcsICJvbmVudGVycmVzb3VyY2VkZXN0aW5hdGlvbnN0cmluZyIpOwogIGZ1bmN0aW9uIG9uZXhpdHJlc291cmNlZGVzdGluYXRpb25zdHJpbmcoKSB7CiAgICBtZWRpYVN0YWNrW21lZGlhU3RhY2subGVuZ3RoIC0gMV0uZGVzdGluYXRpb24gPSByZXN1bWUoKTsKICAgIHNldERhdGEoImlnbm9yZUVuY29kZSIpOwogIH0KICBfX25hbWUob25leGl0cmVzb3VyY2VkZXN0aW5hdGlvbnN0cmluZywgIm9uZXhpdHJlc291cmNlZGVzdGluYXRpb25zdHJpbmciKTsKICBmdW5jdGlvbiBvbmV4aXRyZXNvdXJjZXRpdGxlc3RyaW5nKCkgewogICAgbWVkaWFTdGFja1ttZWRpYVN0YWNrLmxlbmd0aCAtIDFdLnRpdGxlID0gcmVzdW1lKCk7CiAgfQogIF9fbmFtZShvbmV4aXRyZXNvdXJjZXRpdGxlc3RyaW5nLCAib25leGl0cmVzb3VyY2V0aXRsZXN0cmluZyIpOwogIGZ1bmN0aW9uIG9uZXhpdG1lZGlhKCkgewogICAgbGV0IGluZGV4MiA9IG1lZGlhU3RhY2subGVuZ3RoIC0gMTsKICAgIGNvbnN0IG1lZGlhID0gbWVkaWFTdGFja1tpbmRleDJdOwogICAgY29uc3QgaWQgPSBtZWRpYS5yZWZlcmVuY2VJZCB8fCBtZWRpYS5sYWJlbElkOwogICAgY29uc3QgY29udGV4dDMgPSBtZWRpYS5kZXN0aW5hdGlvbiA9PT0gdm9pZCAwID8gZGVmaW5pdGlvbnNbbm9ybWFsaXplSWRlbnRpZmllcihpZCldIDogbWVkaWE7CiAgICB0YWdzID0gdHJ1ZTsKICAgIHdoaWxlIChpbmRleDItLSkgewogICAgICBpZiAobWVkaWFTdGFja1tpbmRleDJdLmltYWdlKSB7CiAgICAgICAgdGFncyA9IHZvaWQgMDsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaWYgKG1lZGlhLmltYWdlKSB7CiAgICAgIHRhZygnPGltZyBzcmM9IicgKyBzYW5pdGl6ZVVyaShjb250ZXh0My5kZXN0aW5hdGlvbiwgc2V0dGluZ3MuYWxsb3dEYW5nZXJvdXNQcm90b2NvbCA/IHZvaWQgMCA6IHByb3RvY29sU291cmNlKSArICciIGFsdD0iJyk7CiAgICAgIHJhdzIobWVkaWEubGFiZWwpOwogICAgICB0YWcoJyInKTsKICAgIH0gZWxzZSB7CiAgICAgIHRhZygnPGEgaHJlZj0iJyArIHNhbml0aXplVXJpKGNvbnRleHQzLmRlc3RpbmF0aW9uLCBzZXR0aW5ncy5hbGxvd0Rhbmdlcm91c1Byb3RvY29sID8gdm9pZCAwIDogcHJvdG9jb2xIcmVmKSArICciJyk7CiAgICB9CiAgICB0YWcoY29udGV4dDMudGl0bGUgPyAnIHRpdGxlPSInICsgY29udGV4dDMudGl0bGUgKyAnIicgOiAiIik7CiAgICBpZiAobWVkaWEuaW1hZ2UpIHsKICAgICAgdGFnKCIgLz4iKTsKICAgIH0gZWxzZSB7CiAgICAgIHRhZygiPiIpOwogICAgICByYXcyKG1lZGlhLmxhYmVsKTsKICAgICAgdGFnKCI8L2E+Iik7CiAgICB9CiAgICBtZWRpYVN0YWNrLnBvcCgpOwogIH0KICBfX25hbWUob25leGl0bWVkaWEsICJvbmV4aXRtZWRpYSIpOwogIGZ1bmN0aW9uIG9uZW50ZXJkZWZpbml0aW9uKCkgewogICAgYnVmZmVyMigpOwogICAgbWVkaWFTdGFjay5wdXNoKHt9KTsKICB9CiAgX19uYW1lKG9uZW50ZXJkZWZpbml0aW9uLCAib25lbnRlcmRlZmluaXRpb24iKTsKICBmdW5jdGlvbiBvbmV4aXRkZWZpbml0aW9ubGFiZWxzdHJpbmcodG9rZW4pIHsKICAgIHJlc3VtZSgpOwogICAgbWVkaWFTdGFja1ttZWRpYVN0YWNrLmxlbmd0aCAtIDFdLmxhYmVsSWQgPSB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKTsKICB9CiAgX19uYW1lKG9uZXhpdGRlZmluaXRpb25sYWJlbHN0cmluZywgIm9uZXhpdGRlZmluaXRpb25sYWJlbHN0cmluZyIpOwogIGZ1bmN0aW9uIG9uZW50ZXJkZWZpbml0aW9uZGVzdGluYXRpb25zdHJpbmcoKSB7CiAgICBidWZmZXIyKCk7CiAgICBzZXREYXRhKCJpZ25vcmVFbmNvZGUiLCB0cnVlKTsKICB9CiAgX19uYW1lKG9uZW50ZXJkZWZpbml0aW9uZGVzdGluYXRpb25zdHJpbmcsICJvbmVudGVyZGVmaW5pdGlvbmRlc3RpbmF0aW9uc3RyaW5nIik7CiAgZnVuY3Rpb24gb25leGl0ZGVmaW5pdGlvbmRlc3RpbmF0aW9uc3RyaW5nKCkgewogICAgbWVkaWFTdGFja1ttZWRpYVN0YWNrLmxlbmd0aCAtIDFdLmRlc3RpbmF0aW9uID0gcmVzdW1lKCk7CiAgICBzZXREYXRhKCJpZ25vcmVFbmNvZGUiKTsKICB9CiAgX19uYW1lKG9uZXhpdGRlZmluaXRpb25kZXN0aW5hdGlvbnN0cmluZywgIm9uZXhpdGRlZmluaXRpb25kZXN0aW5hdGlvbnN0cmluZyIpOwogIGZ1bmN0aW9uIG9uZXhpdGRlZmluaXRpb250aXRsZXN0cmluZygpIHsKICAgIG1lZGlhU3RhY2tbbWVkaWFTdGFjay5sZW5ndGggLSAxXS50aXRsZSA9IHJlc3VtZSgpOwogIH0KICBfX25hbWUob25leGl0ZGVmaW5pdGlvbnRpdGxlc3RyaW5nLCAib25leGl0ZGVmaW5pdGlvbnRpdGxlc3RyaW5nIik7CiAgZnVuY3Rpb24gb25leGl0ZGVmaW5pdGlvbigpIHsKICAgIGNvbnN0IG1lZGlhID0gbWVkaWFTdGFja1ttZWRpYVN0YWNrLmxlbmd0aCAtIDFdOwogICAgY29uc3QgaWQgPSBub3JtYWxpemVJZGVudGlmaWVyKG1lZGlhLmxhYmVsSWQpOwogICAgcmVzdW1lKCk7CiAgICBpZiAoIWhhc093blByb3BlcnR5Mi5jYWxsKGRlZmluaXRpb25zLCBpZCkpIHsKICAgICAgZGVmaW5pdGlvbnNbaWRdID0gbWVkaWFTdGFja1ttZWRpYVN0YWNrLmxlbmd0aCAtIDFdOwogICAgfQogICAgbWVkaWFTdGFjay5wb3AoKTsKICB9CiAgX19uYW1lKG9uZXhpdGRlZmluaXRpb24sICJvbmV4aXRkZWZpbml0aW9uIik7CiAgZnVuY3Rpb24gb25lbnRlcmNvbnRlbnQoKSB7CiAgICBzZXREYXRhKCJzbHVycEFsbExpbmVFbmRpbmdzIiwgdHJ1ZSk7CiAgfQogIF9fbmFtZShvbmVudGVyY29udGVudCwgIm9uZW50ZXJjb250ZW50Iik7CiAgZnVuY3Rpb24gb25leGl0YXR4aGVhZGluZ3NlcXVlbmNlKHRva2VuKSB7CiAgICBpZiAoZ2V0RGF0YSgiaGVhZGluZ1JhbmsiKSkgcmV0dXJuOwogICAgc2V0RGF0YSgiaGVhZGluZ1JhbmsiLCB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKS5sZW5ndGgpOwogICAgbGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICB0YWcoIjxoIiArIGdldERhdGEoImhlYWRpbmdSYW5rIikgKyAiPiIpOwogIH0KICBfX25hbWUob25leGl0YXR4aGVhZGluZ3NlcXVlbmNlLCAib25leGl0YXR4aGVhZGluZ3NlcXVlbmNlIik7CiAgZnVuY3Rpb24gb25lbnRlcnNldGV4dGhlYWRpbmcoKSB7CiAgICBidWZmZXIyKCk7CiAgICBzZXREYXRhKCJzbHVycEFsbExpbmVFbmRpbmdzIik7CiAgfQogIF9fbmFtZShvbmVudGVyc2V0ZXh0aGVhZGluZywgIm9uZW50ZXJzZXRleHRoZWFkaW5nIik7CiAgZnVuY3Rpb24gb25leGl0c2V0ZXh0aGVhZGluZ3RleHQoKSB7CiAgICBzZXREYXRhKCJzbHVycEFsbExpbmVFbmRpbmdzIiwgdHJ1ZSk7CiAgfQogIF9fbmFtZShvbmV4aXRzZXRleHRoZWFkaW5ndGV4dCwgIm9uZXhpdHNldGV4dGhlYWRpbmd0ZXh0Iik7CiAgZnVuY3Rpb24gb25leGl0YXR4aGVhZGluZygpIHsKICAgIHRhZygiPC9oIiArIGdldERhdGEoImhlYWRpbmdSYW5rIikgKyAiPiIpOwogICAgc2V0RGF0YSgiaGVhZGluZ1JhbmsiKTsKICB9CiAgX19uYW1lKG9uZXhpdGF0eGhlYWRpbmcsICJvbmV4aXRhdHhoZWFkaW5nIik7CiAgZnVuY3Rpb24gb25leGl0c2V0ZXh0aGVhZGluZ2xpbmVzZXF1ZW5jZSh0b2tlbikgewogICAgc2V0RGF0YSgiaGVhZGluZ1JhbmsiLCB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKS5jaGFyQ29kZUF0KDApID09PSA2MSA/IDEgOiAyKTsKICB9CiAgX19uYW1lKG9uZXhpdHNldGV4dGhlYWRpbmdsaW5lc2VxdWVuY2UsICJvbmV4aXRzZXRleHRoZWFkaW5nbGluZXNlcXVlbmNlIik7CiAgZnVuY3Rpb24gb25leGl0c2V0ZXh0aGVhZGluZygpIHsKICAgIGNvbnN0IHZhbHVlMiA9IHJlc3VtZSgpOwogICAgbGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICB0YWcoIjxoIiArIGdldERhdGEoImhlYWRpbmdSYW5rIikgKyAiPiIpOwogICAgcmF3Mih2YWx1ZTIpOwogICAgdGFnKCI8L2giICsgZ2V0RGF0YSgiaGVhZGluZ1JhbmsiKSArICI+Iik7CiAgICBzZXREYXRhKCJzbHVycEFsbExpbmVFbmRpbmdzIik7CiAgICBzZXREYXRhKCJoZWFkaW5nUmFuayIpOwogIH0KICBfX25hbWUob25leGl0c2V0ZXh0aGVhZGluZywgIm9uZXhpdHNldGV4dGhlYWRpbmciKTsKICBmdW5jdGlvbiBvbmV4aXRkYXRhKHRva2VuKSB7CiAgICByYXcyKGVuY29kZTIodGhpcy5zbGljZVNlcmlhbGl6ZSh0b2tlbikpKTsKICB9CiAgX19uYW1lKG9uZXhpdGRhdGEsICJvbmV4aXRkYXRhIik7CiAgZnVuY3Rpb24gb25leGl0bGluZWVuZGluZyh0b2tlbikgewogICAgaWYgKGdldERhdGEoInNsdXJwQWxsTGluZUVuZGluZ3MiKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoZ2V0RGF0YSgic2x1cnBPbmVMaW5lRW5kaW5nIikpIHsKICAgICAgc2V0RGF0YSgic2x1cnBPbmVMaW5lRW5kaW5nIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChnZXREYXRhKCJpbkNvZGVUZXh0IikpIHsKICAgICAgcmF3MigiICIpOwogICAgICByZXR1cm47CiAgICB9CiAgICByYXcyKGVuY29kZTIodGhpcy5zbGljZVNlcmlhbGl6ZSh0b2tlbikpKTsKICB9CiAgX19uYW1lKG9uZXhpdGxpbmVlbmRpbmcsICJvbmV4aXRsaW5lZW5kaW5nIik7CiAgZnVuY3Rpb24gb25leGl0Y29kZWZsb3d2YWx1ZSh0b2tlbikgewogICAgcmF3MihlbmNvZGUyKHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pKSk7CiAgICBzZXREYXRhKCJmbG93Q29kZVNlZW5EYXRhIiwgdHJ1ZSk7CiAgfQogIF9fbmFtZShvbmV4aXRjb2RlZmxvd3ZhbHVlLCAib25leGl0Y29kZWZsb3d2YWx1ZSIpOwogIGZ1bmN0aW9uIG9uZXhpdGhhcmRicmVhaygpIHsKICAgIHRhZygiPGJyIC8+Iik7CiAgfQogIF9fbmFtZShvbmV4aXRoYXJkYnJlYWssICJvbmV4aXRoYXJkYnJlYWsiKTsKICBmdW5jdGlvbiBvbmVudGVyaHRtbGZsb3coKSB7CiAgICBsaW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgIG9uZW50ZXJodG1sKCk7CiAgfQogIF9fbmFtZShvbmVudGVyaHRtbGZsb3csICJvbmVudGVyaHRtbGZsb3ciKTsKICBmdW5jdGlvbiBvbmV4aXRodG1sKCkgewogICAgc2V0RGF0YSgiaWdub3JlRW5jb2RlIik7CiAgfQogIF9fbmFtZShvbmV4aXRodG1sLCAib25leGl0aHRtbCIpOwogIGZ1bmN0aW9uIG9uZW50ZXJodG1sKCkgewogICAgaWYgKHNldHRpbmdzLmFsbG93RGFuZ2Vyb3VzSHRtbCkgewogICAgICBzZXREYXRhKCJpZ25vcmVFbmNvZGUiLCB0cnVlKTsKICAgIH0KICB9CiAgX19uYW1lKG9uZW50ZXJodG1sLCAib25lbnRlcmh0bWwiKTsKICBmdW5jdGlvbiBvbmVudGVyZW1waGFzaXMoKSB7CiAgICB0YWcoIjxlbT4iKTsKICB9CiAgX19uYW1lKG9uZW50ZXJlbXBoYXNpcywgIm9uZW50ZXJlbXBoYXNpcyIpOwogIGZ1bmN0aW9uIG9uZW50ZXJzdHJvbmcoKSB7CiAgICB0YWcoIjxzdHJvbmc+Iik7CiAgfQogIF9fbmFtZShvbmVudGVyc3Ryb25nLCAib25lbnRlcnN0cm9uZyIpOwogIGZ1bmN0aW9uIG9uZW50ZXJjb2RldGV4dCgpIHsKICAgIHNldERhdGEoImluQ29kZVRleHQiLCB0cnVlKTsKICAgIHRhZygiPGNvZGU+Iik7CiAgfQogIF9fbmFtZShvbmVudGVyY29kZXRleHQsICJvbmVudGVyY29kZXRleHQiKTsKICBmdW5jdGlvbiBvbmV4aXRjb2RldGV4dCgpIHsKICAgIHNldERhdGEoImluQ29kZVRleHQiKTsKICAgIHRhZygiPC9jb2RlPiIpOwogIH0KICBfX25hbWUob25leGl0Y29kZXRleHQsICJvbmV4aXRjb2RldGV4dCIpOwogIGZ1bmN0aW9uIG9uZXhpdGVtcGhhc2lzKCkgewogICAgdGFnKCI8L2VtPiIpOwogIH0KICBfX25hbWUob25leGl0ZW1waGFzaXMsICJvbmV4aXRlbXBoYXNpcyIpOwogIGZ1bmN0aW9uIG9uZXhpdHN0cm9uZygpIHsKICAgIHRhZygiPC9zdHJvbmc+Iik7CiAgfQogIF9fbmFtZShvbmV4aXRzdHJvbmcsICJvbmV4aXRzdHJvbmciKTsKICBmdW5jdGlvbiBvbmV4aXR0aGVtYXRpY2JyZWFrKCkgewogICAgbGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICB0YWcoIjxociAvPiIpOwogIH0KICBfX25hbWUob25leGl0dGhlbWF0aWNicmVhaywgIm9uZXhpdHRoZW1hdGljYnJlYWsiKTsKICBmdW5jdGlvbiBvbmV4aXRjaGFyYWN0ZXJyZWZlcmVuY2VtYXJrZXIodG9rZW4pIHsKICAgIHNldERhdGEoImNoYXJhY3RlclJlZmVyZW5jZVR5cGUiLCB0b2tlbi50eXBlKTsKICB9CiAgX19uYW1lKG9uZXhpdGNoYXJhY3RlcnJlZmVyZW5jZW1hcmtlciwgIm9uZXhpdGNoYXJhY3RlcnJlZmVyZW5jZW1hcmtlciIpOwogIGZ1bmN0aW9uIG9uZXhpdGNoYXJhY3RlcnJlZmVyZW5jZXZhbHVlKHRva2VuKSB7CiAgICBjb25zdCB2YWx1ZTIgPSB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKTsKICAgIGNvbnN0IGRlY29kZWQgPSBnZXREYXRhKCJjaGFyYWN0ZXJSZWZlcmVuY2VUeXBlIikgPyBkZWNvZGVOdW1lcmljQ2hhcmFjdGVyUmVmZXJlbmNlKHZhbHVlMiwgZ2V0RGF0YSgiY2hhcmFjdGVyUmVmZXJlbmNlVHlwZSIpID09PSAiY2hhcmFjdGVyUmVmZXJlbmNlTWFya2VyTnVtZXJpYyIgPyAxMCA6IDE2KSA6IGRlY29kZU5hbWVkQ2hhcmFjdGVyUmVmZXJlbmNlKHZhbHVlMik7CiAgICByYXcyKGVuY29kZTIoCiAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqLwogICAgICBkZWNvZGVkCiAgICApKTsKICAgIHNldERhdGEoImNoYXJhY3RlclJlZmVyZW5jZVR5cGUiKTsKICB9CiAgX19uYW1lKG9uZXhpdGNoYXJhY3RlcnJlZmVyZW5jZXZhbHVlLCAib25leGl0Y2hhcmFjdGVycmVmZXJlbmNldmFsdWUiKTsKICBmdW5jdGlvbiBvbmV4aXRhdXRvbGlua3Byb3RvY29sKHRva2VuKSB7CiAgICBjb25zdCB1cmkgPSB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKTsKICAgIHRhZygnPGEgaHJlZj0iJyArIHNhbml0aXplVXJpKHVyaSwgc2V0dGluZ3MuYWxsb3dEYW5nZXJvdXNQcm90b2NvbCA/IHZvaWQgMCA6IHByb3RvY29sSHJlZikgKyAnIj4nKTsKICAgIHJhdzIoZW5jb2RlMih1cmkpKTsKICAgIHRhZygiPC9hPiIpOwogIH0KICBfX25hbWUob25leGl0YXV0b2xpbmtwcm90b2NvbCwgIm9uZXhpdGF1dG9saW5rcHJvdG9jb2wiKTsKICBmdW5jdGlvbiBvbmV4aXRhdXRvbGlua2VtYWlsKHRva2VuKSB7CiAgICBjb25zdCB1cmkgPSB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKTsKICAgIHRhZygnPGEgaHJlZj0iJyArIHNhbml0aXplVXJpKCJtYWlsdG86IiArIHVyaSkgKyAnIj4nKTsKICAgIHJhdzIoZW5jb2RlMih1cmkpKTsKICAgIHRhZygiPC9hPiIpOwogIH0KICBfX25hbWUob25leGl0YXV0b2xpbmtlbWFpbCwgIm9uZXhpdGF1dG9saW5rZW1haWwiKTsKfQpfX25hbWUoY29tcGlsZSwgImNvbXBpbGUiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmtANC4wLjIvbm9kZV9tb2R1bGVzL21pY3JvbWFyay9saWIvaW5pdGlhbGl6ZS9jb250ZW50LmpzCnZhciBjb250ZW50MiA9IHsKICB0b2tlbml6ZTogaW5pdGlhbGl6ZUNvbnRlbnQKfTsKZnVuY3Rpb24gaW5pdGlhbGl6ZUNvbnRlbnQoZWZmZWN0cykgewogIGNvbnN0IGNvbnRlbnRTdGFydCA9IGVmZmVjdHMuYXR0ZW1wdCh0aGlzLnBhcnNlci5jb25zdHJ1Y3RzLmNvbnRlbnRJbml0aWFsLCBhZnRlckNvbnRlbnRTdGFydENvbnN0cnVjdCwgcGFyYWdyYXBoSW5pdGlhbCk7CiAgbGV0IHByZXZpb3VzMzsKICByZXR1cm4gY29udGVudFN0YXJ0OwogIGZ1bmN0aW9uIGFmdGVyQ29udGVudFN0YXJ0Q29uc3RydWN0KGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgZWZmZWN0cy5lbnRlcigibGluZUVuZGluZyIpOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIGVmZmVjdHMuZXhpdCgibGluZUVuZGluZyIpOwogICAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBjb250ZW50U3RhcnQsICJsaW5lUHJlZml4Iik7CiAgfQogIF9fbmFtZShhZnRlckNvbnRlbnRTdGFydENvbnN0cnVjdCwgImFmdGVyQ29udGVudFN0YXJ0Q29uc3RydWN0Iik7CiAgZnVuY3Rpb24gcGFyYWdyYXBoSW5pdGlhbChjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigicGFyYWdyYXBoIik7CiAgICByZXR1cm4gbGluZVN0YXJ0KGNvZGU0KTsKICB9CiAgX19uYW1lKHBhcmFncmFwaEluaXRpYWwsICJwYXJhZ3JhcGhJbml0aWFsIik7CiAgZnVuY3Rpb24gbGluZVN0YXJ0KGNvZGU0KSB7CiAgICBjb25zdCB0b2tlbiA9IGVmZmVjdHMuZW50ZXIoImNodW5rVGV4dCIsIHsKICAgICAgY29udGVudFR5cGU6ICJ0ZXh0IiwKICAgICAgcHJldmlvdXM6IHByZXZpb3VzMwogICAgfSk7CiAgICBpZiAocHJldmlvdXMzKSB7CiAgICAgIHByZXZpb3VzMy5uZXh0ID0gdG9rZW47CiAgICB9CiAgICBwcmV2aW91czMgPSB0b2tlbjsKICAgIHJldHVybiBkYXRhKGNvZGU0KTsKICB9CiAgX19uYW1lKGxpbmVTdGFydCwgImxpbmVTdGFydCIpOwogIGZ1bmN0aW9uIGRhdGEoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCkgewogICAgICBlZmZlY3RzLmV4aXQoImNodW5rVGV4dCIpOwogICAgICBlZmZlY3RzLmV4aXQoInBhcmFncmFwaCIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoImNodW5rVGV4dCIpOwogICAgICByZXR1cm4gbGluZVN0YXJ0OwogICAgfQogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBkYXRhOwogIH0KICBfX25hbWUoZGF0YSwgImRhdGEiKTsKfQpfX25hbWUoaW5pdGlhbGl6ZUNvbnRlbnQsICJpbml0aWFsaXplQ29udGVudCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFya0A0LjAuMi9ub2RlX21vZHVsZXMvbWljcm9tYXJrL2xpYi9pbml0aWFsaXplL2RvY3VtZW50LmpzCnZhciBkb2N1bWVudDIgPSB7CiAgdG9rZW5pemU6IGluaXRpYWxpemVEb2N1bWVudAp9Owp2YXIgY29udGFpbmVyQ29uc3RydWN0ID0gewogIHRva2VuaXplOiB0b2tlbml6ZUNvbnRhaW5lcgp9OwpmdW5jdGlvbiBpbml0aWFsaXplRG9jdW1lbnQoZWZmZWN0cykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICBjb25zdCBzdGFjayA9IFtdOwogIGxldCBjb250aW51ZWQgPSAwOwogIGxldCBjaGlsZEZsb3c7CiAgbGV0IGNoaWxkVG9rZW47CiAgbGV0IGxpbmVTdGFydE9mZnNldDsKICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIGlmIChjb250aW51ZWQgPCBzdGFjay5sZW5ndGgpIHsKICAgICAgY29uc3QgaXRlbSA9IHN0YWNrW2NvbnRpbnVlZF07CiAgICAgIHNlbGYyLmNvbnRhaW5lclN0YXRlID0gaXRlbVsxXTsKICAgICAgcmV0dXJuIGVmZmVjdHMuYXR0ZW1wdChpdGVtWzBdLmNvbnRpbnVhdGlvbiwgZG9jdW1lbnRDb250aW51ZSwgY2hlY2tOZXdDb250YWluZXJzKShjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gY2hlY2tOZXdDb250YWluZXJzKGNvZGU0KTsKICB9CiAgX19uYW1lKHN0YXJ0LCAic3RhcnQiKTsKICBmdW5jdGlvbiBkb2N1bWVudENvbnRpbnVlKGNvZGU0KSB7CiAgICBjb250aW51ZWQrKzsKICAgIGlmIChzZWxmMi5jb250YWluZXJTdGF0ZS5fY2xvc2VGbG93KSB7CiAgICAgIHNlbGYyLmNvbnRhaW5lclN0YXRlLl9jbG9zZUZsb3cgPSB2b2lkIDA7CiAgICAgIGlmIChjaGlsZEZsb3cpIHsKICAgICAgICBjbG9zZUZsb3coKTsKICAgICAgfQogICAgICBjb25zdCBpbmRleEJlZm9yZUV4aXRzID0gc2VsZjIuZXZlbnRzLmxlbmd0aDsKICAgICAgbGV0IGluZGV4QmVmb3JlRmxvdyA9IGluZGV4QmVmb3JlRXhpdHM7CiAgICAgIGxldCBwb2ludDQ7CiAgICAgIHdoaWxlIChpbmRleEJlZm9yZUZsb3ctLSkgewogICAgICAgIGlmIChzZWxmMi5ldmVudHNbaW5kZXhCZWZvcmVGbG93XVswXSA9PT0gImV4aXQiICYmIHNlbGYyLmV2ZW50c1tpbmRleEJlZm9yZUZsb3ddWzFdLnR5cGUgPT09ICJjaHVua0Zsb3ciKSB7CiAgICAgICAgICBwb2ludDQgPSBzZWxmMi5ldmVudHNbaW5kZXhCZWZvcmVGbG93XVsxXS5lbmQ7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgZXhpdENvbnRhaW5lcnMoY29udGludWVkKTsKICAgICAgbGV0IGluZGV4MiA9IGluZGV4QmVmb3JlRXhpdHM7CiAgICAgIHdoaWxlIChpbmRleDIgPCBzZWxmMi5ldmVudHMubGVuZ3RoKSB7CiAgICAgICAgc2VsZjIuZXZlbnRzW2luZGV4Ml1bMV0uZW5kID0gewogICAgICAgICAgLi4ucG9pbnQ0CiAgICAgICAgfTsKICAgICAgICBpbmRleDIrKzsKICAgICAgfQogICAgICBzcGxpY2Uoc2VsZjIuZXZlbnRzLCBpbmRleEJlZm9yZUZsb3cgKyAxLCAwLCBzZWxmMi5ldmVudHMuc2xpY2UoaW5kZXhCZWZvcmVFeGl0cykpOwogICAgICBzZWxmMi5ldmVudHMubGVuZ3RoID0gaW5kZXgyOwogICAgICByZXR1cm4gY2hlY2tOZXdDb250YWluZXJzKGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBzdGFydChjb2RlNCk7CiAgfQogIF9fbmFtZShkb2N1bWVudENvbnRpbnVlLCAiZG9jdW1lbnRDb250aW51ZSIpOwogIGZ1bmN0aW9uIGNoZWNrTmV3Q29udGFpbmVycyhjb2RlNCkgewogICAgaWYgKGNvbnRpbnVlZCA9PT0gc3RhY2subGVuZ3RoKSB7CiAgICAgIGlmICghY2hpbGRGbG93KSB7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50Q29udGludWVkKGNvZGU0KTsKICAgICAgfQogICAgICBpZiAoY2hpbGRGbG93LmN1cnJlbnRDb25zdHJ1Y3QgJiYgY2hpbGRGbG93LmN1cnJlbnRDb25zdHJ1Y3QuY29uY3JldGUpIHsKICAgICAgICByZXR1cm4gZmxvd1N0YXJ0KGNvZGU0KTsKICAgICAgfQogICAgICBzZWxmMi5pbnRlcnJ1cHQgPSBCb29sZWFuKGNoaWxkRmxvdy5jdXJyZW50Q29uc3RydWN0ICYmICFjaGlsZEZsb3cuX2dmbVRhYmxlRHluYW1pY0ludGVycnVwdEhhY2spOwogICAgfQogICAgc2VsZjIuY29udGFpbmVyU3RhdGUgPSB7fTsKICAgIHJldHVybiBlZmZlY3RzLmNoZWNrKGNvbnRhaW5lckNvbnN0cnVjdCwgdGhlcmVJc0FOZXdDb250YWluZXIsIHRoZXJlSXNOb05ld0NvbnRhaW5lcikoY29kZTQpOwogIH0KICBfX25hbWUoY2hlY2tOZXdDb250YWluZXJzLCAiY2hlY2tOZXdDb250YWluZXJzIik7CiAgZnVuY3Rpb24gdGhlcmVJc0FOZXdDb250YWluZXIoY29kZTQpIHsKICAgIGlmIChjaGlsZEZsb3cpIGNsb3NlRmxvdygpOwogICAgZXhpdENvbnRhaW5lcnMoY29udGludWVkKTsKICAgIHJldHVybiBkb2N1bWVudENvbnRpbnVlZChjb2RlNCk7CiAgfQogIF9fbmFtZSh0aGVyZUlzQU5ld0NvbnRhaW5lciwgInRoZXJlSXNBTmV3Q29udGFpbmVyIik7CiAgZnVuY3Rpb24gdGhlcmVJc05vTmV3Q29udGFpbmVyKGNvZGU0KSB7CiAgICBzZWxmMi5wYXJzZXIubGF6eVtzZWxmMi5ub3coKS5saW5lXSA9IGNvbnRpbnVlZCAhPT0gc3RhY2subGVuZ3RoOwogICAgbGluZVN0YXJ0T2Zmc2V0ID0gc2VsZjIubm93KCkub2Zmc2V0OwogICAgcmV0dXJuIGZsb3dTdGFydChjb2RlNCk7CiAgfQogIF9fbmFtZSh0aGVyZUlzTm9OZXdDb250YWluZXIsICJ0aGVyZUlzTm9OZXdDb250YWluZXIiKTsKICBmdW5jdGlvbiBkb2N1bWVudENvbnRpbnVlZChjb2RlNCkgewogICAgc2VsZjIuY29udGFpbmVyU3RhdGUgPSB7fTsKICAgIHJldHVybiBlZmZlY3RzLmF0dGVtcHQoY29udGFpbmVyQ29uc3RydWN0LCBjb250YWluZXJDb250aW51ZSwgZmxvd1N0YXJ0KShjb2RlNCk7CiAgfQogIF9fbmFtZShkb2N1bWVudENvbnRpbnVlZCwgImRvY3VtZW50Q29udGludWVkIik7CiAgZnVuY3Rpb24gY29udGFpbmVyQ29udGludWUoY29kZTQpIHsKICAgIGNvbnRpbnVlZCsrOwogICAgc3RhY2sucHVzaChbc2VsZjIuY3VycmVudENvbnN0cnVjdCwgc2VsZjIuY29udGFpbmVyU3RhdGVdKTsKICAgIHJldHVybiBkb2N1bWVudENvbnRpbnVlZChjb2RlNCk7CiAgfQogIF9fbmFtZShjb250YWluZXJDb250aW51ZSwgImNvbnRhaW5lckNvbnRpbnVlIik7CiAgZnVuY3Rpb24gZmxvd1N0YXJ0KGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwpIHsKICAgICAgaWYgKGNoaWxkRmxvdykgY2xvc2VGbG93KCk7CiAgICAgIGV4aXRDb250YWluZXJzKDApOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm47CiAgICB9CiAgICBjaGlsZEZsb3cgPSBjaGlsZEZsb3cgfHwgc2VsZjIucGFyc2VyLmZsb3coc2VsZjIubm93KCkpOwogICAgZWZmZWN0cy5lbnRlcigiY2h1bmtGbG93IiwgewogICAgICBfdG9rZW5pemVyOiBjaGlsZEZsb3csCiAgICAgIGNvbnRlbnRUeXBlOiAiZmxvdyIsCiAgICAgIHByZXZpb3VzOiBjaGlsZFRva2VuCiAgICB9KTsKICAgIHJldHVybiBmbG93Q29udGludWUoY29kZTQpOwogIH0KICBfX25hbWUoZmxvd1N0YXJ0LCAiZmxvd1N0YXJ0Iik7CiAgZnVuY3Rpb24gZmxvd0NvbnRpbnVlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwpIHsKICAgICAgd3JpdGVUb0NoaWxkKGVmZmVjdHMuZXhpdCgiY2h1bmtGbG93IiksIHRydWUpOwogICAgICBleGl0Q29udGFpbmVycygwKTsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgd3JpdGVUb0NoaWxkKGVmZmVjdHMuZXhpdCgiY2h1bmtGbG93IikpOwogICAgICBjb250aW51ZWQgPSAwOwogICAgICBzZWxmMi5pbnRlcnJ1cHQgPSB2b2lkIDA7CiAgICAgIHJldHVybiBzdGFydDsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gZmxvd0NvbnRpbnVlOwogIH0KICBfX25hbWUoZmxvd0NvbnRpbnVlLCAiZmxvd0NvbnRpbnVlIik7CiAgZnVuY3Rpb24gd3JpdGVUb0NoaWxkKHRva2VuLCBlbmRPZkZpbGUpIHsKICAgIGNvbnN0IHN0cmVhbSA9IHNlbGYyLnNsaWNlU3RyZWFtKHRva2VuKTsKICAgIGlmIChlbmRPZkZpbGUpIHN0cmVhbS5wdXNoKG51bGwpOwogICAgdG9rZW4ucHJldmlvdXMgPSBjaGlsZFRva2VuOwogICAgaWYgKGNoaWxkVG9rZW4pIGNoaWxkVG9rZW4ubmV4dCA9IHRva2VuOwogICAgY2hpbGRUb2tlbiA9IHRva2VuOwogICAgY2hpbGRGbG93LmRlZmluZVNraXAodG9rZW4uc3RhcnQpOwogICAgY2hpbGRGbG93LndyaXRlKHN0cmVhbSk7CiAgICBpZiAoc2VsZjIucGFyc2VyLmxhenlbdG9rZW4uc3RhcnQubGluZV0pIHsKICAgICAgbGV0IGluZGV4MiA9IGNoaWxkRmxvdy5ldmVudHMubGVuZ3RoOwogICAgICB3aGlsZSAoaW5kZXgyLS0pIHsKICAgICAgICBpZiAoCiAgICAgICAgICAvLyBUaGUgdG9rZW4gc3RhcnRzIGJlZm9yZSB0aGUgbGluZSBlbmRpbmfigKYKICAgICAgICAgIGNoaWxkRmxvdy5ldmVudHNbaW5kZXgyXVsxXS5zdGFydC5vZmZzZXQgPCBsaW5lU3RhcnRPZmZzZXQgJiYgLy8g4oCmYW5kIGVpdGhlciBpcyBub3QgZW5kZWQgeWV04oCmCiAgICAgICAgICAoIWNoaWxkRmxvdy5ldmVudHNbaW5kZXgyXVsxXS5lbmQgfHwgLy8g4oCmb3IgZW5kcyBhZnRlciBpdC4KICAgICAgICAgIGNoaWxkRmxvdy5ldmVudHNbaW5kZXgyXVsxXS5lbmQub2Zmc2V0ID4gbGluZVN0YXJ0T2Zmc2V0KQogICAgICAgICkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdCBpbmRleEJlZm9yZUV4aXRzID0gc2VsZjIuZXZlbnRzLmxlbmd0aDsKICAgICAgbGV0IGluZGV4QmVmb3JlRmxvdyA9IGluZGV4QmVmb3JlRXhpdHM7CiAgICAgIGxldCBzZWVuOwogICAgICBsZXQgcG9pbnQ0OwogICAgICB3aGlsZSAoaW5kZXhCZWZvcmVGbG93LS0pIHsKICAgICAgICBpZiAoc2VsZjIuZXZlbnRzW2luZGV4QmVmb3JlRmxvd11bMF0gPT09ICJleGl0IiAmJiBzZWxmMi5ldmVudHNbaW5kZXhCZWZvcmVGbG93XVsxXS50eXBlID09PSAiY2h1bmtGbG93IikgewogICAgICAgICAgaWYgKHNlZW4pIHsKICAgICAgICAgICAgcG9pbnQ0ID0gc2VsZjIuZXZlbnRzW2luZGV4QmVmb3JlRmxvd11bMV0uZW5kOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIHNlZW4gPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICBleGl0Q29udGFpbmVycyhjb250aW51ZWQpOwogICAgICBpbmRleDIgPSBpbmRleEJlZm9yZUV4aXRzOwogICAgICB3aGlsZSAoaW5kZXgyIDwgc2VsZjIuZXZlbnRzLmxlbmd0aCkgewogICAgICAgIHNlbGYyLmV2ZW50c1tpbmRleDJdWzFdLmVuZCA9IHsKICAgICAgICAgIC4uLnBvaW50NAogICAgICAgIH07CiAgICAgICAgaW5kZXgyKys7CiAgICAgIH0KICAgICAgc3BsaWNlKHNlbGYyLmV2ZW50cywgaW5kZXhCZWZvcmVGbG93ICsgMSwgMCwgc2VsZjIuZXZlbnRzLnNsaWNlKGluZGV4QmVmb3JlRXhpdHMpKTsKICAgICAgc2VsZjIuZXZlbnRzLmxlbmd0aCA9IGluZGV4MjsKICAgIH0KICB9CiAgX19uYW1lKHdyaXRlVG9DaGlsZCwgIndyaXRlVG9DaGlsZCIpOwogIGZ1bmN0aW9uIGV4aXRDb250YWluZXJzKHNpemUpIHsKICAgIGxldCBpbmRleDIgPSBzdGFjay5sZW5ndGg7CiAgICB3aGlsZSAoaW5kZXgyLS0gPiBzaXplKSB7CiAgICAgIGNvbnN0IGVudHJ5ID0gc3RhY2tbaW5kZXgyXTsKICAgICAgc2VsZjIuY29udGFpbmVyU3RhdGUgPSBlbnRyeVsxXTsKICAgICAgZW50cnlbMF0uZXhpdC5jYWxsKHNlbGYyLCBlZmZlY3RzKTsKICAgIH0KICAgIHN0YWNrLmxlbmd0aCA9IHNpemU7CiAgfQogIF9fbmFtZShleGl0Q29udGFpbmVycywgImV4aXRDb250YWluZXJzIik7CiAgZnVuY3Rpb24gY2xvc2VGbG93KCkgewogICAgY2hpbGRGbG93LndyaXRlKFtudWxsXSk7CiAgICBjaGlsZFRva2VuID0gdm9pZCAwOwogICAgY2hpbGRGbG93ID0gdm9pZCAwOwogICAgc2VsZjIuY29udGFpbmVyU3RhdGUuX2Nsb3NlRmxvdyA9IHZvaWQgMDsKICB9CiAgX19uYW1lKGNsb3NlRmxvdywgImNsb3NlRmxvdyIpOwp9Cl9fbmFtZShpbml0aWFsaXplRG9jdW1lbnQsICJpbml0aWFsaXplRG9jdW1lbnQiKTsKZnVuY3Rpb24gdG9rZW5pemVDb250YWluZXIoZWZmZWN0cywgb2szLCBub2spIHsKICByZXR1cm4gZmFjdG9yeVNwYWNlKGVmZmVjdHMsIGVmZmVjdHMuYXR0ZW1wdCh0aGlzLnBhcnNlci5jb25zdHJ1Y3RzLmRvY3VtZW50LCBvazMsIG5vayksICJsaW5lUHJlZml4IiwgdGhpcy5wYXJzZXIuY29uc3RydWN0cy5kaXNhYmxlLm51bGwuaW5jbHVkZXMoImNvZGVJbmRlbnRlZCIpID8gdm9pZCAwIDogNCk7Cn0KX19uYW1lKHRva2VuaXplQ29udGFpbmVyLCAidG9rZW5pemVDb250YWluZXIiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmtANC4wLjIvbm9kZV9tb2R1bGVzL21pY3JvbWFyay9saWIvaW5pdGlhbGl6ZS9mbG93LmpzCnZhciBmbG93ID0gewogIHRva2VuaXplOiBpbml0aWFsaXplRmxvdwp9OwpmdW5jdGlvbiBpbml0aWFsaXplRmxvdyhlZmZlY3RzKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIGNvbnN0IGluaXRpYWwgPSBlZmZlY3RzLmF0dGVtcHQoCiAgICAvLyBUcnkgdG8gcGFyc2UgYSBibGFuayBsaW5lLgogICAgYmxhbmtMaW5lLAogICAgYXRCbGFua0VuZGluZywKICAgIC8vIFRyeSB0byBwYXJzZSBpbml0aWFsIGZsb3cgKGVzc2VudGlhbGx5LCBvbmx5IGNvZGUpLgogICAgZWZmZWN0cy5hdHRlbXB0KHRoaXMucGFyc2VyLmNvbnN0cnVjdHMuZmxvd0luaXRpYWwsIGFmdGVyQ29uc3RydWN0LCBmYWN0b3J5U3BhY2UoZWZmZWN0cywgZWZmZWN0cy5hdHRlbXB0KHRoaXMucGFyc2VyLmNvbnN0cnVjdHMuZmxvdywgYWZ0ZXJDb25zdHJ1Y3QsIGVmZmVjdHMuYXR0ZW1wdChjb250ZW50LCBhZnRlckNvbnN0cnVjdCkpLCAibGluZVByZWZpeCIpKQogICk7CiAgcmV0dXJuIGluaXRpYWw7CiAgZnVuY3Rpb24gYXRCbGFua0VuZGluZyhjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGVmZmVjdHMuZW50ZXIoImxpbmVFbmRpbmdCbGFuayIpOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIGVmZmVjdHMuZXhpdCgibGluZUVuZGluZ0JsYW5rIik7CiAgICBzZWxmMi5jdXJyZW50Q29uc3RydWN0ID0gdm9pZCAwOwogICAgcmV0dXJuIGluaXRpYWw7CiAgfQogIF9fbmFtZShhdEJsYW5rRW5kaW5nLCAiYXRCbGFua0VuZGluZyIpOwogIGZ1bmN0aW9uIGFmdGVyQ29uc3RydWN0KGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgZWZmZWN0cy5lbnRlcigibGluZUVuZGluZyIpOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIGVmZmVjdHMuZXhpdCgibGluZUVuZGluZyIpOwogICAgc2VsZjIuY3VycmVudENvbnN0cnVjdCA9IHZvaWQgMDsKICAgIHJldHVybiBpbml0aWFsOwogIH0KICBfX25hbWUoYWZ0ZXJDb25zdHJ1Y3QsICJhZnRlckNvbnN0cnVjdCIpOwp9Cl9fbmFtZShpbml0aWFsaXplRmxvdywgImluaXRpYWxpemVGbG93Iik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrQDQuMC4yL25vZGVfbW9kdWxlcy9taWNyb21hcmsvbGliL2luaXRpYWxpemUvdGV4dC5qcwp2YXIgcmVzb2x2ZXIgPSB7CiAgcmVzb2x2ZUFsbDogY3JlYXRlUmVzb2x2ZXIoKQp9Owp2YXIgc3RyaW5nID0gaW5pdGlhbGl6ZUZhY3RvcnkoInN0cmluZyIpOwp2YXIgdGV4dDMgPSBpbml0aWFsaXplRmFjdG9yeSgidGV4dCIpOwpmdW5jdGlvbiBpbml0aWFsaXplRmFjdG9yeShmaWVsZCkgewogIHJldHVybiB7CiAgICByZXNvbHZlQWxsOiBjcmVhdGVSZXNvbHZlcihmaWVsZCA9PT0gInRleHQiID8gcmVzb2x2ZUFsbExpbmVTdWZmaXhlcyA6IHZvaWQgMCksCiAgICB0b2tlbml6ZTogaW5pdGlhbGl6ZVRleHQKICB9OwogIGZ1bmN0aW9uIGluaXRpYWxpemVUZXh0KGVmZmVjdHMpIHsKICAgIGNvbnN0IHNlbGYyID0gdGhpczsKICAgIGNvbnN0IGNvbnN0cnVjdHMyID0gdGhpcy5wYXJzZXIuY29uc3RydWN0c1tmaWVsZF07CiAgICBjb25zdCB0ZXh0OCA9IGVmZmVjdHMuYXR0ZW1wdChjb25zdHJ1Y3RzMiwgc3RhcnQsIG5vdFRleHQpOwogICAgcmV0dXJuIHN0YXJ0OwogICAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgICAgcmV0dXJuIGF0QnJlYWsoY29kZTQpID8gdGV4dDgoY29kZTQpIDogbm90VGV4dChjb2RlNCk7CiAgICB9CiAgICBfX25hbWUoc3RhcnQsICJzdGFydCIpOwogICAgZnVuY3Rpb24gbm90VGV4dChjb2RlNCkgewogICAgICBpZiAoY29kZTQgPT09IG51bGwpIHsKICAgICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBlZmZlY3RzLmVudGVyKCJkYXRhIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBkYXRhOwogICAgfQogICAgX19uYW1lKG5vdFRleHQsICJub3RUZXh0Iik7CiAgICBmdW5jdGlvbiBkYXRhKGNvZGU0KSB7CiAgICAgIGlmIChhdEJyZWFrKGNvZGU0KSkgewogICAgICAgIGVmZmVjdHMuZXhpdCgiZGF0YSIpOwogICAgICAgIHJldHVybiB0ZXh0OChjb2RlNCk7CiAgICAgIH0KICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGRhdGE7CiAgICB9CiAgICBfX25hbWUoZGF0YSwgImRhdGEiKTsKICAgIGZ1bmN0aW9uIGF0QnJlYWsoY29kZTQpIHsKICAgICAgaWYgKGNvZGU0ID09PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgY29uc3QgbGlzdDUgPSBjb25zdHJ1Y3RzMltjb2RlNF07CiAgICAgIGxldCBpbmRleDIgPSAtMTsKICAgICAgaWYgKGxpc3Q1KSB7CiAgICAgICAgd2hpbGUgKCsraW5kZXgyIDwgbGlzdDUubGVuZ3RoKSB7CiAgICAgICAgICBjb25zdCBpdGVtID0gbGlzdDVbaW5kZXgyXTsKICAgICAgICAgIGlmICghaXRlbS5wcmV2aW91cyB8fCBpdGVtLnByZXZpb3VzLmNhbGwoc2VsZjIsIHNlbGYyLnByZXZpb3VzKSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgX19uYW1lKGF0QnJlYWssICJhdEJyZWFrIik7CiAgfQogIF9fbmFtZShpbml0aWFsaXplVGV4dCwgImluaXRpYWxpemVUZXh0Iik7Cn0KX19uYW1lKGluaXRpYWxpemVGYWN0b3J5LCAiaW5pdGlhbGl6ZUZhY3RvcnkiKTsKZnVuY3Rpb24gY3JlYXRlUmVzb2x2ZXIoZXh0cmFSZXNvbHZlcikgewogIHJldHVybiByZXNvbHZlQWxsVGV4dDsKICBmdW5jdGlvbiByZXNvbHZlQWxsVGV4dChldmVudHMsIGNvbnRleHQyKSB7CiAgICBsZXQgaW5kZXgyID0gLTE7CiAgICBsZXQgZW50ZXI7CiAgICB3aGlsZSAoKytpbmRleDIgPD0gZXZlbnRzLmxlbmd0aCkgewogICAgICBpZiAoZW50ZXIgPT09IHZvaWQgMCkgewogICAgICAgIGlmIChldmVudHNbaW5kZXgyXSAmJiBldmVudHNbaW5kZXgyXVsxXS50eXBlID09PSAiZGF0YSIpIHsKICAgICAgICAgIGVudGVyID0gaW5kZXgyOwogICAgICAgICAgaW5kZXgyKys7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKCFldmVudHNbaW5kZXgyXSB8fCBldmVudHNbaW5kZXgyXVsxXS50eXBlICE9PSAiZGF0YSIpIHsKICAgICAgICBpZiAoaW5kZXgyICE9PSBlbnRlciArIDIpIHsKICAgICAgICAgIGV2ZW50c1tlbnRlcl1bMV0uZW5kID0gZXZlbnRzW2luZGV4MiAtIDFdWzFdLmVuZDsKICAgICAgICAgIGV2ZW50cy5zcGxpY2UoZW50ZXIgKyAyLCBpbmRleDIgLSBlbnRlciAtIDIpOwogICAgICAgICAgaW5kZXgyID0gZW50ZXIgKyAyOwogICAgICAgIH0KICAgICAgICBlbnRlciA9IHZvaWQgMDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGV4dHJhUmVzb2x2ZXIgPyBleHRyYVJlc29sdmVyKGV2ZW50cywgY29udGV4dDIpIDogZXZlbnRzOwogIH0KICBfX25hbWUocmVzb2x2ZUFsbFRleHQsICJyZXNvbHZlQWxsVGV4dCIpOwp9Cl9fbmFtZShjcmVhdGVSZXNvbHZlciwgImNyZWF0ZVJlc29sdmVyIik7CmZ1bmN0aW9uIHJlc29sdmVBbGxMaW5lU3VmZml4ZXMoZXZlbnRzLCBjb250ZXh0MikgewogIGxldCBldmVudEluZGV4ID0gMDsKICB3aGlsZSAoKytldmVudEluZGV4IDw9IGV2ZW50cy5sZW5ndGgpIHsKICAgIGlmICgoZXZlbnRJbmRleCA9PT0gZXZlbnRzLmxlbmd0aCB8fCBldmVudHNbZXZlbnRJbmRleF1bMV0udHlwZSA9PT0gImxpbmVFbmRpbmciKSAmJiBldmVudHNbZXZlbnRJbmRleCAtIDFdWzFdLnR5cGUgPT09ICJkYXRhIikgewogICAgICBjb25zdCBkYXRhID0gZXZlbnRzW2V2ZW50SW5kZXggLSAxXVsxXTsKICAgICAgY29uc3QgY2h1bmtzID0gY29udGV4dDIuc2xpY2VTdHJlYW0oZGF0YSk7CiAgICAgIGxldCBpbmRleDIgPSBjaHVua3MubGVuZ3RoOwogICAgICBsZXQgYnVmZmVySW5kZXggPSAtMTsKICAgICAgbGV0IHNpemUgPSAwOwogICAgICBsZXQgdGFiczsKICAgICAgd2hpbGUgKGluZGV4Mi0tKSB7CiAgICAgICAgY29uc3QgY2h1bmsgPSBjaHVua3NbaW5kZXgyXTsKICAgICAgICBpZiAodHlwZW9mIGNodW5rID09PSAic3RyaW5nIikgewogICAgICAgICAgYnVmZmVySW5kZXggPSBjaHVuay5sZW5ndGg7CiAgICAgICAgICB3aGlsZSAoY2h1bmsuY2hhckNvZGVBdChidWZmZXJJbmRleCAtIDEpID09PSAzMikgewogICAgICAgICAgICBzaXplKys7CiAgICAgICAgICAgIGJ1ZmZlckluZGV4LS07CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoYnVmZmVySW5kZXgpIGJyZWFrOwogICAgICAgICAgYnVmZmVySW5kZXggPSAtMTsKICAgICAgICB9IGVsc2UgaWYgKGNodW5rID09PSAtMikgewogICAgICAgICAgdGFicyA9IHRydWU7CiAgICAgICAgICBzaXplKys7CiAgICAgICAgfSBlbHNlIGlmIChjaHVuayA9PT0gLTEpIHsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaW5kZXgyKys7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGNvbnRleHQyLl9jb250ZW50VHlwZVRleHRUcmFpbGluZyAmJiBldmVudEluZGV4ID09PSBldmVudHMubGVuZ3RoKSB7CiAgICAgICAgc2l6ZSA9IDA7CiAgICAgIH0KICAgICAgaWYgKHNpemUpIHsKICAgICAgICBjb25zdCB0b2tlbiA9IHsKICAgICAgICAgIHR5cGU6IGV2ZW50SW5kZXggPT09IGV2ZW50cy5sZW5ndGggfHwgdGFicyB8fCBzaXplIDwgMiA/ICJsaW5lU3VmZml4IiA6ICJoYXJkQnJlYWtUcmFpbGluZyIsCiAgICAgICAgICBzdGFydDogewogICAgICAgICAgICBfYnVmZmVySW5kZXg6IGluZGV4MiA/IGJ1ZmZlckluZGV4IDogZGF0YS5zdGFydC5fYnVmZmVySW5kZXggKyBidWZmZXJJbmRleCwKICAgICAgICAgICAgX2luZGV4OiBkYXRhLnN0YXJ0Ll9pbmRleCArIGluZGV4MiwKICAgICAgICAgICAgbGluZTogZGF0YS5lbmQubGluZSwKICAgICAgICAgICAgY29sdW1uOiBkYXRhLmVuZC5jb2x1bW4gLSBzaXplLAogICAgICAgICAgICBvZmZzZXQ6IGRhdGEuZW5kLm9mZnNldCAtIHNpemUKICAgICAgICAgIH0sCiAgICAgICAgICBlbmQ6IHsKICAgICAgICAgICAgLi4uZGF0YS5lbmQKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGRhdGEuZW5kID0gewogICAgICAgICAgLi4udG9rZW4uc3RhcnQKICAgICAgICB9OwogICAgICAgIGlmIChkYXRhLnN0YXJ0Lm9mZnNldCA9PT0gZGF0YS5lbmQub2Zmc2V0KSB7CiAgICAgICAgICBPYmplY3QuYXNzaWduKGRhdGEsIHRva2VuKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZXZlbnRzLnNwbGljZShldmVudEluZGV4LCAwLCBbImVudGVyIiwgdG9rZW4sIGNvbnRleHQyXSwgWyJleGl0IiwgdG9rZW4sIGNvbnRleHQyXSk7CiAgICAgICAgICBldmVudEluZGV4ICs9IDI7CiAgICAgICAgfQogICAgICB9CiAgICAgIGV2ZW50SW5kZXgrKzsKICAgIH0KICB9CiAgcmV0dXJuIGV2ZW50czsKfQpfX25hbWUocmVzb2x2ZUFsbExpbmVTdWZmaXhlcywgInJlc29sdmVBbGxMaW5lU3VmZml4ZXMiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmtANC4wLjIvbm9kZV9tb2R1bGVzL21pY3JvbWFyay9saWIvY29uc3RydWN0cy5qcwp2YXIgY29uc3RydWN0c19leHBvcnRzID0ge307Cl9fZXhwb3J0KGNvbnN0cnVjdHNfZXhwb3J0cywgewogIGF0dGVudGlvbk1hcmtlcnM6ICgpID0+IGF0dGVudGlvbk1hcmtlcnMsCiAgY29udGVudEluaXRpYWw6ICgpID0+IGNvbnRlbnRJbml0aWFsLAogIGRpc2FibGU6ICgpID0+IGRpc2FibGUsCiAgZG9jdW1lbnQ6ICgpID0+IGRvY3VtZW50MywKICBmbG93OiAoKSA9PiBmbG93MiwKICBmbG93SW5pdGlhbDogKCkgPT4gZmxvd0luaXRpYWwsCiAgaW5zaWRlU3BhbjogKCkgPT4gaW5zaWRlU3BhbiwKICBzdHJpbmc6ICgpID0+IHN0cmluZzIsCiAgdGV4dDogKCkgPT4gdGV4dDQKfSk7CnZhciBkb2N1bWVudDMgPSB7CiAgWzQyXTogbGlzdDMsCiAgWzQzXTogbGlzdDMsCiAgWzQ1XTogbGlzdDMsCiAgWzQ4XTogbGlzdDMsCiAgWzQ5XTogbGlzdDMsCiAgWzUwXTogbGlzdDMsCiAgWzUxXTogbGlzdDMsCiAgWzUyXTogbGlzdDMsCiAgWzUzXTogbGlzdDMsCiAgWzU0XTogbGlzdDMsCiAgWzU1XTogbGlzdDMsCiAgWzU2XTogbGlzdDMsCiAgWzU3XTogbGlzdDMsCiAgWzYyXTogYmxvY2tRdW90ZQp9Owp2YXIgY29udGVudEluaXRpYWwgPSB7CiAgWzkxXTogZGVmaW5pdGlvbjIKfTsKdmFyIGZsb3dJbml0aWFsID0gewogIFstMl06IGNvZGVJbmRlbnRlZCwKICBbLTFdOiBjb2RlSW5kZW50ZWQsCiAgWzMyXTogY29kZUluZGVudGVkCn07CnZhciBmbG93MiA9IHsKICBbMzVdOiBoZWFkaW5nQXR4LAogIFs0Ml06IHRoZW1hdGljQnJlYWsyLAogIFs0NV06IFtzZXRleHRVbmRlcmxpbmUsIHRoZW1hdGljQnJlYWsyXSwKICBbNjBdOiBodG1sRmxvdywKICBbNjFdOiBzZXRleHRVbmRlcmxpbmUsCiAgWzk1XTogdGhlbWF0aWNCcmVhazIsCiAgWzk2XTogY29kZUZlbmNlZCwKICBbMTI2XTogY29kZUZlbmNlZAp9Owp2YXIgc3RyaW5nMiA9IHsKICBbMzhdOiBjaGFyYWN0ZXJSZWZlcmVuY2UsCiAgWzkyXTogY2hhcmFjdGVyRXNjYXBlCn07CnZhciB0ZXh0NCA9IHsKICBbLTVdOiBsaW5lRW5kaW5nLAogIFstNF06IGxpbmVFbmRpbmcsCiAgWy0zXTogbGluZUVuZGluZywKICBbMzNdOiBsYWJlbFN0YXJ0SW1hZ2UsCiAgWzM4XTogY2hhcmFjdGVyUmVmZXJlbmNlLAogIFs0Ml06IGF0dGVudGlvbiwKICBbNjBdOiBbYXV0b2xpbmssIGh0bWxUZXh0XSwKICBbOTFdOiBsYWJlbFN0YXJ0TGluaywKICBbOTJdOiBbaGFyZEJyZWFrRXNjYXBlLCBjaGFyYWN0ZXJFc2NhcGVdLAogIFs5M106IGxhYmVsRW5kLAogIFs5NV06IGF0dGVudGlvbiwKICBbOTZdOiBjb2RlVGV4dAp9Owp2YXIgaW5zaWRlU3BhbiA9IHsKICBudWxsOiBbYXR0ZW50aW9uLCByZXNvbHZlcl0KfTsKdmFyIGF0dGVudGlvbk1hcmtlcnMgPSB7CiAgbnVsbDogWzQyLCA5NV0KfTsKdmFyIGRpc2FibGUgPSB7CiAgbnVsbDogW10KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmtANC4wLjIvbm9kZV9tb2R1bGVzL21pY3JvbWFyay9saWIvY3JlYXRlLXRva2VuaXplci5qcwpmdW5jdGlvbiBjcmVhdGVUb2tlbml6ZXIocGFyc2VyLCBpbml0aWFsaXplLCBmcm9tMikgewogIGxldCBwb2ludDQgPSB7CiAgICBfYnVmZmVySW5kZXg6IC0xLAogICAgX2luZGV4OiAwLAogICAgbGluZTogZnJvbTIgJiYgZnJvbTIubGluZSB8fCAxLAogICAgY29sdW1uOiBmcm9tMiAmJiBmcm9tMi5jb2x1bW4gfHwgMSwKICAgIG9mZnNldDogZnJvbTIgJiYgZnJvbTIub2Zmc2V0IHx8IDAKICB9OwogIGNvbnN0IGNvbHVtblN0YXJ0ID0ge307CiAgY29uc3QgcmVzb2x2ZUFsbENvbnN0cnVjdHMgPSBbXTsKICBsZXQgY2h1bmtzID0gW107CiAgbGV0IHN0YWNrID0gW107CiAgbGV0IGNvbnN1bWVkID0gdHJ1ZTsKICBjb25zdCBlZmZlY3RzID0gewogICAgYXR0ZW1wdDogY29uc3RydWN0RmFjdG9yeShvbnN1Y2Nlc3NmdWxjb25zdHJ1Y3QpLAogICAgY2hlY2s6IGNvbnN0cnVjdEZhY3Rvcnkob25zdWNjZXNzZnVsY2hlY2spLAogICAgY29uc3VtZSwKICAgIGVudGVyLAogICAgZXhpdDogZXhpdDMsCiAgICBpbnRlcnJ1cHQ6IGNvbnN0cnVjdEZhY3Rvcnkob25zdWNjZXNzZnVsY2hlY2ssIHsKICAgICAgaW50ZXJydXB0OiB0cnVlCiAgICB9KQogIH07CiAgY29uc3QgY29udGV4dDIgPSB7CiAgICBjb2RlOiBudWxsLAogICAgY29udGFpbmVyU3RhdGU6IHt9LAogICAgZGVmaW5lU2tpcCwKICAgIGV2ZW50czogW10sCiAgICBub3c6IG5vdzIsCiAgICBwYXJzZXIsCiAgICBwcmV2aW91czogbnVsbCwKICAgIHNsaWNlU2VyaWFsaXplLAogICAgc2xpY2VTdHJlYW0sCiAgICB3cml0ZQogIH07CiAgbGV0IHN0YXRlID0gaW5pdGlhbGl6ZS50b2tlbml6ZS5jYWxsKGNvbnRleHQyLCBlZmZlY3RzKTsKICBsZXQgZXhwZWN0ZWRDb2RlOwogIGlmIChpbml0aWFsaXplLnJlc29sdmVBbGwpIHsKICAgIHJlc29sdmVBbGxDb25zdHJ1Y3RzLnB1c2goaW5pdGlhbGl6ZSk7CiAgfQogIHJldHVybiBjb250ZXh0MjsKICBmdW5jdGlvbiB3cml0ZShzbGljZSkgewogICAgY2h1bmtzID0gcHVzaChjaHVua3MsIHNsaWNlKTsKICAgIG1haW4oKTsKICAgIGlmIChjaHVua3NbY2h1bmtzLmxlbmd0aCAtIDFdICE9PSBudWxsKSB7CiAgICAgIHJldHVybiBbXTsKICAgIH0KICAgIGFkZFJlc3VsdChpbml0aWFsaXplLCAwKTsKICAgIGNvbnRleHQyLmV2ZW50cyA9IHJlc29sdmVBbGwocmVzb2x2ZUFsbENvbnN0cnVjdHMsIGNvbnRleHQyLmV2ZW50cywgY29udGV4dDIpOwogICAgcmV0dXJuIGNvbnRleHQyLmV2ZW50czsKICB9CiAgX19uYW1lKHdyaXRlLCAid3JpdGUiKTsKICBmdW5jdGlvbiBzbGljZVNlcmlhbGl6ZSh0b2tlbiwgZXhwYW5kVGFicykgewogICAgcmV0dXJuIHNlcmlhbGl6ZUNodW5rcyhzbGljZVN0cmVhbSh0b2tlbiksIGV4cGFuZFRhYnMpOwogIH0KICBfX25hbWUoc2xpY2VTZXJpYWxpemUsICJzbGljZVNlcmlhbGl6ZSIpOwogIGZ1bmN0aW9uIHNsaWNlU3RyZWFtKHRva2VuKSB7CiAgICByZXR1cm4gc2xpY2VDaHVua3MoY2h1bmtzLCB0b2tlbik7CiAgfQogIF9fbmFtZShzbGljZVN0cmVhbSwgInNsaWNlU3RyZWFtIik7CiAgZnVuY3Rpb24gbm93MigpIHsKICAgIGNvbnN0IHsKICAgICAgX2J1ZmZlckluZGV4LAogICAgICBfaW5kZXgsCiAgICAgIGxpbmUsCiAgICAgIGNvbHVtbiwKICAgICAgb2Zmc2V0CiAgICB9ID0gcG9pbnQ0OwogICAgcmV0dXJuIHsKICAgICAgX2J1ZmZlckluZGV4LAogICAgICBfaW5kZXgsCiAgICAgIGxpbmUsCiAgICAgIGNvbHVtbiwKICAgICAgb2Zmc2V0CiAgICB9OwogIH0KICBfX25hbWUobm93MiwgIm5vdyIpOwogIGZ1bmN0aW9uIGRlZmluZVNraXAodmFsdWUyKSB7CiAgICBjb2x1bW5TdGFydFt2YWx1ZTIubGluZV0gPSB2YWx1ZTIuY29sdW1uOwogICAgYWNjb3VudEZvclBvdGVudGlhbFNraXAoKTsKICB9CiAgX19uYW1lKGRlZmluZVNraXAsICJkZWZpbmVTa2lwIik7CiAgZnVuY3Rpb24gbWFpbigpIHsKICAgIGxldCBjaHVua0luZGV4OwogICAgd2hpbGUgKHBvaW50NC5faW5kZXggPCBjaHVua3MubGVuZ3RoKSB7CiAgICAgIGNvbnN0IGNodW5rID0gY2h1bmtzW3BvaW50NC5faW5kZXhdOwogICAgICBpZiAodHlwZW9mIGNodW5rID09PSAic3RyaW5nIikgewogICAgICAgIGNodW5rSW5kZXggPSBwb2ludDQuX2luZGV4OwogICAgICAgIGlmIChwb2ludDQuX2J1ZmZlckluZGV4IDwgMCkgewogICAgICAgICAgcG9pbnQ0Ll9idWZmZXJJbmRleCA9IDA7CiAgICAgICAgfQogICAgICAgIHdoaWxlIChwb2ludDQuX2luZGV4ID09PSBjaHVua0luZGV4ICYmIHBvaW50NC5fYnVmZmVySW5kZXggPCBjaHVuay5sZW5ndGgpIHsKICAgICAgICAgIGdvKGNodW5rLmNoYXJDb2RlQXQocG9pbnQ0Ll9idWZmZXJJbmRleCkpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBnbyhjaHVuayk7CiAgICAgIH0KICAgIH0KICB9CiAgX19uYW1lKG1haW4sICJtYWluIik7CiAgZnVuY3Rpb24gZ28oY29kZTQpIHsKICAgIGNvbnN1bWVkID0gdm9pZCAwOwogICAgZXhwZWN0ZWRDb2RlID0gY29kZTQ7CiAgICBzdGF0ZSA9IHN0YXRlKGNvZGU0KTsKICB9CiAgX19uYW1lKGdvLCAiZ28iKTsKICBmdW5jdGlvbiBjb25zdW1lKGNvZGU0KSB7CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBwb2ludDQubGluZSsrOwogICAgICBwb2ludDQuY29sdW1uID0gMTsKICAgICAgcG9pbnQ0Lm9mZnNldCArPSBjb2RlNCA9PT0gLTMgPyAyIDogMTsKICAgICAgYWNjb3VudEZvclBvdGVudGlhbFNraXAoKTsKICAgIH0gZWxzZSBpZiAoY29kZTQgIT09IC0xKSB7CiAgICAgIHBvaW50NC5jb2x1bW4rKzsKICAgICAgcG9pbnQ0Lm9mZnNldCsrOwogICAgfQogICAgaWYgKHBvaW50NC5fYnVmZmVySW5kZXggPCAwKSB7CiAgICAgIHBvaW50NC5faW5kZXgrKzsKICAgIH0gZWxzZSB7CiAgICAgIHBvaW50NC5fYnVmZmVySW5kZXgrKzsKICAgICAgaWYgKHBvaW50NC5fYnVmZmVySW5kZXggPT09IC8vIFBvaW50cyB3LyBub24tbmVnYXRpdmUgYF9idWZmZXJJbmRleGAgcmVmZXJlbmNlCiAgICAgIC8vIHN0cmluZ3MuCiAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqLwogICAgICBjaHVua3NbcG9pbnQ0Ll9pbmRleF0ubGVuZ3RoKSB7CiAgICAgICAgcG9pbnQ0Ll9idWZmZXJJbmRleCA9IC0xOwogICAgICAgIHBvaW50NC5faW5kZXgrKzsKICAgICAgfQogICAgfQogICAgY29udGV4dDIucHJldmlvdXMgPSBjb2RlNDsKICAgIGNvbnN1bWVkID0gdHJ1ZTsKICB9CiAgX19uYW1lKGNvbnN1bWUsICJjb25zdW1lIik7CiAgZnVuY3Rpb24gZW50ZXIodHlwZTUsIGZpZWxkcykgewogICAgY29uc3QgdG9rZW4gPSBmaWVsZHMgfHwge307CiAgICB0b2tlbi50eXBlID0gdHlwZTU7CiAgICB0b2tlbi5zdGFydCA9IG5vdzIoKTsKICAgIGNvbnRleHQyLmV2ZW50cy5wdXNoKFsiZW50ZXIiLCB0b2tlbiwgY29udGV4dDJdKTsKICAgIHN0YWNrLnB1c2godG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KICBfX25hbWUoZW50ZXIsICJlbnRlciIpOwogIGZ1bmN0aW9uIGV4aXQzKHR5cGU1KSB7CiAgICBjb25zdCB0b2tlbiA9IHN0YWNrLnBvcCgpOwogICAgdG9rZW4uZW5kID0gbm93MigpOwogICAgY29udGV4dDIuZXZlbnRzLnB1c2goWyJleGl0IiwgdG9rZW4sIGNvbnRleHQyXSk7CiAgICByZXR1cm4gdG9rZW47CiAgfQogIF9fbmFtZShleGl0MywgImV4aXQiKTsKICBmdW5jdGlvbiBvbnN1Y2Nlc3NmdWxjb25zdHJ1Y3QoY29uc3RydWN0LCBpbmZvKSB7CiAgICBhZGRSZXN1bHQoY29uc3RydWN0LCBpbmZvLmZyb20pOwogIH0KICBfX25hbWUob25zdWNjZXNzZnVsY29uc3RydWN0LCAib25zdWNjZXNzZnVsY29uc3RydWN0Iik7CiAgZnVuY3Rpb24gb25zdWNjZXNzZnVsY2hlY2soXzMsIGluZm8pIHsKICAgIGluZm8ucmVzdG9yZSgpOwogIH0KICBfX25hbWUob25zdWNjZXNzZnVsY2hlY2ssICJvbnN1Y2Nlc3NmdWxjaGVjayIpOwogIGZ1bmN0aW9uIGNvbnN0cnVjdEZhY3Rvcnkob25yZXR1cm4sIGZpZWxkcykgewogICAgcmV0dXJuIGhvb2s7CiAgICBmdW5jdGlvbiBob29rKGNvbnN0cnVjdHMyLCByZXR1cm5TdGF0ZSwgYm9ndXNTdGF0ZSkgewogICAgICBsZXQgbGlzdE9mQ29uc3RydWN0czsKICAgICAgbGV0IGNvbnN0cnVjdEluZGV4OwogICAgICBsZXQgY3VycmVudENvbnN0cnVjdDsKICAgICAgbGV0IGluZm87CiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGNvbnN0cnVjdHMyKSA/ICgKICAgICAgICAvKiBjOCBpZ25vcmUgbmV4dCAxICovCiAgICAgICAgaGFuZGxlTGlzdE9mQ29uc3RydWN0cyhjb25zdHJ1Y3RzMikKICAgICAgKSA6ICJ0b2tlbml6ZSIgaW4gY29uc3RydWN0czIgPyAoCiAgICAgICAgLy8gTG9va3MgbGlrZSBhIGNvbnN0cnVjdC4KICAgICAgICBoYW5kbGVMaXN0T2ZDb25zdHJ1Y3RzKFsKICAgICAgICAgIC8qKiBAdHlwZSB7Q29uc3RydWN0fSAqLwogICAgICAgICAgY29uc3RydWN0czIKICAgICAgICBdKQogICAgICApIDogaGFuZGxlTWFwT2ZDb25zdHJ1Y3RzKGNvbnN0cnVjdHMyKTsKICAgICAgZnVuY3Rpb24gaGFuZGxlTWFwT2ZDb25zdHJ1Y3RzKG1hcDcpIHsKICAgICAgICByZXR1cm4gc3RhcnQ7CiAgICAgICAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgICAgICAgIGNvbnN0IGxlZnQgPSBjb2RlNCAhPT0gbnVsbCAmJiBtYXA3W2NvZGU0XTsKICAgICAgICAgIGNvbnN0IGFsbDMgPSBjb2RlNCAhPT0gbnVsbCAmJiBtYXA3Lm51bGw7CiAgICAgICAgICBjb25zdCBsaXN0NSA9IFsKICAgICAgICAgICAgLy8gVG8gZG86IGFkZCBtb3JlIGV4dGVuc2lvbiB0ZXN0cy4KICAgICAgICAgICAgLyogYzggaWdub3JlIG5leHQgMiAqLwogICAgICAgICAgICAuLi5BcnJheS5pc0FycmF5KGxlZnQpID8gbGVmdCA6IGxlZnQgPyBbbGVmdF0gOiBbXSwKICAgICAgICAgICAgLi4uQXJyYXkuaXNBcnJheShhbGwzKSA/IGFsbDMgOiBhbGwzID8gW2FsbDNdIDogW10KICAgICAgICAgIF07CiAgICAgICAgICByZXR1cm4gaGFuZGxlTGlzdE9mQ29uc3RydWN0cyhsaXN0NSkoY29kZTQpOwogICAgICAgIH0KICAgICAgICBfX25hbWUoc3RhcnQsICJzdGFydCIpOwogICAgICB9CiAgICAgIF9fbmFtZShoYW5kbGVNYXBPZkNvbnN0cnVjdHMsICJoYW5kbGVNYXBPZkNvbnN0cnVjdHMiKTsKICAgICAgZnVuY3Rpb24gaGFuZGxlTGlzdE9mQ29uc3RydWN0cyhsaXN0NSkgewogICAgICAgIGxpc3RPZkNvbnN0cnVjdHMgPSBsaXN0NTsKICAgICAgICBjb25zdHJ1Y3RJbmRleCA9IDA7CiAgICAgICAgaWYgKGxpc3Q1Lmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgcmV0dXJuIGJvZ3VzU3RhdGU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBoYW5kbGVDb25zdHJ1Y3QobGlzdDVbY29uc3RydWN0SW5kZXhdKTsKICAgICAgfQogICAgICBfX25hbWUoaGFuZGxlTGlzdE9mQ29uc3RydWN0cywgImhhbmRsZUxpc3RPZkNvbnN0cnVjdHMiKTsKICAgICAgZnVuY3Rpb24gaGFuZGxlQ29uc3RydWN0KGNvbnN0cnVjdCkgewogICAgICAgIHJldHVybiBzdGFydDsKICAgICAgICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgICAgICAgaW5mbyA9IHN0b3JlKCk7CiAgICAgICAgICBjdXJyZW50Q29uc3RydWN0ID0gY29uc3RydWN0OwogICAgICAgICAgaWYgKCFjb25zdHJ1Y3QucGFydGlhbCkgewogICAgICAgICAgICBjb250ZXh0Mi5jdXJyZW50Q29uc3RydWN0ID0gY29uc3RydWN0OwogICAgICAgICAgfQogICAgICAgICAgaWYgKGNvbnN0cnVjdC5uYW1lICYmIGNvbnRleHQyLnBhcnNlci5jb25zdHJ1Y3RzLmRpc2FibGUubnVsbC5pbmNsdWRlcyhjb25zdHJ1Y3QubmFtZSkpIHsKICAgICAgICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gY29uc3RydWN0LnRva2VuaXplLmNhbGwoCiAgICAgICAgICAgIC8vIElmIHdlIGRvIGhhdmUgZmllbGRzLCBjcmVhdGUgYW4gb2JqZWN0IHcvIGBjb250ZXh0YCBhcyBpdHMKICAgICAgICAgICAgLy8gcHJvdG90eXBlLgogICAgICAgICAgICAvLyBUaGlzIGFsbG93cyBhIOKAnGxpdmUgYmluZGluZ+KAnSwgd2hpY2ggaXMgbmVlZGVkIGZvciBgaW50ZXJydXB0YC4KICAgICAgICAgICAgZmllbGRzID8gT2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKGNvbnRleHQyKSwgZmllbGRzKSA6IGNvbnRleHQyLAogICAgICAgICAgICBlZmZlY3RzLAogICAgICAgICAgICBvazMsCiAgICAgICAgICAgIG5vawogICAgICAgICAgKShjb2RlNCk7CiAgICAgICAgfQogICAgICAgIF9fbmFtZShzdGFydCwgInN0YXJ0Iik7CiAgICAgIH0KICAgICAgX19uYW1lKGhhbmRsZUNvbnN0cnVjdCwgImhhbmRsZUNvbnN0cnVjdCIpOwogICAgICBmdW5jdGlvbiBvazMoY29kZTQpIHsKICAgICAgICBjb25zdW1lZCA9IHRydWU7CiAgICAgICAgb25yZXR1cm4oY3VycmVudENvbnN0cnVjdCwgaW5mbyk7CiAgICAgICAgcmV0dXJuIHJldHVyblN0YXRlOwogICAgICB9CiAgICAgIF9fbmFtZShvazMsICJvayIpOwogICAgICBmdW5jdGlvbiBub2soY29kZTQpIHsKICAgICAgICBjb25zdW1lZCA9IHRydWU7CiAgICAgICAgaW5mby5yZXN0b3JlKCk7CiAgICAgICAgaWYgKCsrY29uc3RydWN0SW5kZXggPCBsaXN0T2ZDb25zdHJ1Y3RzLmxlbmd0aCkgewogICAgICAgICAgcmV0dXJuIGhhbmRsZUNvbnN0cnVjdChsaXN0T2ZDb25zdHJ1Y3RzW2NvbnN0cnVjdEluZGV4XSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBib2d1c1N0YXRlOwogICAgICB9CiAgICAgIF9fbmFtZShub2ssICJub2siKTsKICAgIH0KICAgIF9fbmFtZShob29rLCAiaG9vayIpOwogIH0KICBfX25hbWUoY29uc3RydWN0RmFjdG9yeSwgImNvbnN0cnVjdEZhY3RvcnkiKTsKICBmdW5jdGlvbiBhZGRSZXN1bHQoY29uc3RydWN0LCBmcm9tMykgewogICAgaWYgKGNvbnN0cnVjdC5yZXNvbHZlQWxsICYmICFyZXNvbHZlQWxsQ29uc3RydWN0cy5pbmNsdWRlcyhjb25zdHJ1Y3QpKSB7CiAgICAgIHJlc29sdmVBbGxDb25zdHJ1Y3RzLnB1c2goY29uc3RydWN0KTsKICAgIH0KICAgIGlmIChjb25zdHJ1Y3QucmVzb2x2ZSkgewogICAgICBzcGxpY2UoY29udGV4dDIuZXZlbnRzLCBmcm9tMywgY29udGV4dDIuZXZlbnRzLmxlbmd0aCAtIGZyb20zLCBjb25zdHJ1Y3QucmVzb2x2ZShjb250ZXh0Mi5ldmVudHMuc2xpY2UoZnJvbTMpLCBjb250ZXh0MikpOwogICAgfQogICAgaWYgKGNvbnN0cnVjdC5yZXNvbHZlVG8pIHsKICAgICAgY29udGV4dDIuZXZlbnRzID0gY29uc3RydWN0LnJlc29sdmVUbyhjb250ZXh0Mi5ldmVudHMsIGNvbnRleHQyKTsKICAgIH0KICB9CiAgX19uYW1lKGFkZFJlc3VsdCwgImFkZFJlc3VsdCIpOwogIGZ1bmN0aW9uIHN0b3JlKCkgewogICAgY29uc3Qgc3RhcnRQb2ludCA9IG5vdzIoKTsKICAgIGNvbnN0IHN0YXJ0UHJldmlvdXMgPSBjb250ZXh0Mi5wcmV2aW91czsKICAgIGNvbnN0IHN0YXJ0Q3VycmVudENvbnN0cnVjdCA9IGNvbnRleHQyLmN1cnJlbnRDb25zdHJ1Y3Q7CiAgICBjb25zdCBzdGFydEV2ZW50c0luZGV4ID0gY29udGV4dDIuZXZlbnRzLmxlbmd0aDsKICAgIGNvbnN0IHN0YXJ0U3RhY2sgPSBBcnJheS5mcm9tKHN0YWNrKTsKICAgIHJldHVybiB7CiAgICAgIGZyb206IHN0YXJ0RXZlbnRzSW5kZXgsCiAgICAgIHJlc3RvcmUKICAgIH07CiAgICBmdW5jdGlvbiByZXN0b3JlKCkgewogICAgICBwb2ludDQgPSBzdGFydFBvaW50OwogICAgICBjb250ZXh0Mi5wcmV2aW91cyA9IHN0YXJ0UHJldmlvdXM7CiAgICAgIGNvbnRleHQyLmN1cnJlbnRDb25zdHJ1Y3QgPSBzdGFydEN1cnJlbnRDb25zdHJ1Y3Q7CiAgICAgIGNvbnRleHQyLmV2ZW50cy5sZW5ndGggPSBzdGFydEV2ZW50c0luZGV4OwogICAgICBzdGFjayA9IHN0YXJ0U3RhY2s7CiAgICAgIGFjY291bnRGb3JQb3RlbnRpYWxTa2lwKCk7CiAgICB9CiAgICBfX25hbWUocmVzdG9yZSwgInJlc3RvcmUiKTsKICB9CiAgX19uYW1lKHN0b3JlLCAic3RvcmUiKTsKICBmdW5jdGlvbiBhY2NvdW50Rm9yUG90ZW50aWFsU2tpcCgpIHsKICAgIGlmIChwb2ludDQubGluZSBpbiBjb2x1bW5TdGFydCAmJiBwb2ludDQuY29sdW1uIDwgMikgewogICAgICBwb2ludDQuY29sdW1uID0gY29sdW1uU3RhcnRbcG9pbnQ0LmxpbmVdOwogICAgICBwb2ludDQub2Zmc2V0ICs9IGNvbHVtblN0YXJ0W3BvaW50NC5saW5lXSAtIDE7CiAgICB9CiAgfQogIF9fbmFtZShhY2NvdW50Rm9yUG90ZW50aWFsU2tpcCwgImFjY291bnRGb3JQb3RlbnRpYWxTa2lwIik7Cn0KX19uYW1lKGNyZWF0ZVRva2VuaXplciwgImNyZWF0ZVRva2VuaXplciIpOwpmdW5jdGlvbiBzbGljZUNodW5rcyhjaHVua3MsIHRva2VuKSB7CiAgY29uc3Qgc3RhcnRJbmRleCA9IHRva2VuLnN0YXJ0Ll9pbmRleDsKICBjb25zdCBzdGFydEJ1ZmZlckluZGV4ID0gdG9rZW4uc3RhcnQuX2J1ZmZlckluZGV4OwogIGNvbnN0IGVuZEluZGV4ID0gdG9rZW4uZW5kLl9pbmRleDsKICBjb25zdCBlbmRCdWZmZXJJbmRleCA9IHRva2VuLmVuZC5fYnVmZmVySW5kZXg7CiAgbGV0IHZpZXc7CiAgaWYgKHN0YXJ0SW5kZXggPT09IGVuZEluZGV4KSB7CiAgICB2aWV3ID0gW2NodW5rc1tzdGFydEluZGV4XS5zbGljZShzdGFydEJ1ZmZlckluZGV4LCBlbmRCdWZmZXJJbmRleCldOwogIH0gZWxzZSB7CiAgICB2aWV3ID0gY2h1bmtzLnNsaWNlKHN0YXJ0SW5kZXgsIGVuZEluZGV4KTsKICAgIGlmIChzdGFydEJ1ZmZlckluZGV4ID4gLTEpIHsKICAgICAgY29uc3QgaGVhZDIgPSB2aWV3WzBdOwogICAgICBpZiAodHlwZW9mIGhlYWQyID09PSAic3RyaW5nIikgewogICAgICAgIHZpZXdbMF0gPSBoZWFkMi5zbGljZShzdGFydEJ1ZmZlckluZGV4KTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2aWV3LnNoaWZ0KCk7CiAgICAgIH0KICAgIH0KICAgIGlmIChlbmRCdWZmZXJJbmRleCA+IDApIHsKICAgICAgdmlldy5wdXNoKGNodW5rc1tlbmRJbmRleF0uc2xpY2UoMCwgZW5kQnVmZmVySW5kZXgpKTsKICAgIH0KICB9CiAgcmV0dXJuIHZpZXc7Cn0KX19uYW1lKHNsaWNlQ2h1bmtzLCAic2xpY2VDaHVua3MiKTsKZnVuY3Rpb24gc2VyaWFsaXplQ2h1bmtzKGNodW5rcywgZXhwYW5kVGFicykgewogIGxldCBpbmRleDIgPSAtMTsKICBjb25zdCByZXN1bHQgPSBbXTsKICBsZXQgYXRUYWI7CiAgd2hpbGUgKCsraW5kZXgyIDwgY2h1bmtzLmxlbmd0aCkgewogICAgY29uc3QgY2h1bmsgPSBjaHVua3NbaW5kZXgyXTsKICAgIGxldCB2YWx1ZTI7CiAgICBpZiAodHlwZW9mIGNodW5rID09PSAic3RyaW5nIikgewogICAgICB2YWx1ZTIgPSBjaHVuazsKICAgIH0gZWxzZSBzd2l0Y2ggKGNodW5rKSB7CiAgICAgIGNhc2UgLTU6IHsKICAgICAgICB2YWx1ZTIgPSAiXHIiOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgLTQ6IHsKICAgICAgICB2YWx1ZTIgPSAiXG4iOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgLTM6IHsKICAgICAgICB2YWx1ZTIgPSAiXHJcbiI7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSAtMjogewogICAgICAgIHZhbHVlMiA9IGV4cGFuZFRhYnMgPyAiICIgOiAiCSI7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSAtMTogewogICAgICAgIGlmICghZXhwYW5kVGFicyAmJiBhdFRhYikgY29udGludWU7CiAgICAgICAgdmFsdWUyID0gIiAiOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGRlZmF1bHQ6IHsKICAgICAgICB2YWx1ZTIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNodW5rKTsKICAgICAgfQogICAgfQogICAgYXRUYWIgPSBjaHVuayA9PT0gLTI7CiAgICByZXN1bHQucHVzaCh2YWx1ZTIpOwogIH0KICByZXR1cm4gcmVzdWx0LmpvaW4oIiIpOwp9Cl9fbmFtZShzZXJpYWxpemVDaHVua3MsICJzZXJpYWxpemVDaHVua3MiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmtANC4wLjIvbm9kZV9tb2R1bGVzL21pY3JvbWFyay9saWIvcGFyc2UuanMKZnVuY3Rpb24gcGFyc2U0KG9wdGlvbnMpIHsKICBjb25zdCBzZXR0aW5ncyA9IG9wdGlvbnMgfHwge307CiAgY29uc3QgY29uc3RydWN0czIgPSAoCiAgICAvKiogQHR5cGUge0Z1bGxOb3JtYWxpemVkRXh0ZW5zaW9ufSAqLwogICAgY29tYmluZUV4dGVuc2lvbnMoW2NvbnN0cnVjdHNfZXhwb3J0cywgLi4uc2V0dGluZ3MuZXh0ZW5zaW9ucyB8fCBbXV0pCiAgKTsKICBjb25zdCBwYXJzZXIgPSB7CiAgICBjb25zdHJ1Y3RzOiBjb25zdHJ1Y3RzMiwKICAgIGNvbnRlbnQ6IGNyZWF0ZTcoY29udGVudDIpLAogICAgZGVmaW5lZDogW10sCiAgICBkb2N1bWVudDogY3JlYXRlNyhkb2N1bWVudDIpLAogICAgZmxvdzogY3JlYXRlNyhmbG93KSwKICAgIGxhenk6IHt9LAogICAgc3RyaW5nOiBjcmVhdGU3KHN0cmluZyksCiAgICB0ZXh0OiBjcmVhdGU3KHRleHQzKQogIH07CiAgcmV0dXJuIHBhcnNlcjsKICBmdW5jdGlvbiBjcmVhdGU3KGluaXRpYWwpIHsKICAgIHJldHVybiBjcmVhdG9yOwogICAgZnVuY3Rpb24gY3JlYXRvcihmcm9tMikgewogICAgICByZXR1cm4gY3JlYXRlVG9rZW5pemVyKHBhcnNlciwgaW5pdGlhbCwgZnJvbTIpOwogICAgfQogICAgX19uYW1lKGNyZWF0b3IsICJjcmVhdG9yIik7CiAgfQogIF9fbmFtZShjcmVhdGU3LCAiY3JlYXRlIik7Cn0KX19uYW1lKHBhcnNlNCwgInBhcnNlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrQDQuMC4yL25vZGVfbW9kdWxlcy9taWNyb21hcmsvbGliL3Bvc3Rwcm9jZXNzLmpzCmZ1bmN0aW9uIHBvc3Rwcm9jZXNzKGV2ZW50cykgewogIHdoaWxlICghc3VidG9rZW5pemUoZXZlbnRzKSkgewogIH0KICByZXR1cm4gZXZlbnRzOwp9Cl9fbmFtZShwb3N0cHJvY2VzcywgInBvc3Rwcm9jZXNzIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrQDQuMC4yL25vZGVfbW9kdWxlcy9taWNyb21hcmsvbGliL3ByZXByb2Nlc3MuanMKdmFyIHNlYXJjaCA9IC9bXDBcdFxuXHJdL2c7CmZ1bmN0aW9uIHByZXByb2Nlc3MoKSB7CiAgbGV0IGNvbHVtbiA9IDE7CiAgbGV0IGJ1ZmZlcjIgPSAiIjsKICBsZXQgc3RhcnQgPSB0cnVlOwogIGxldCBhdENhcnJpYWdlUmV0dXJuOwogIHJldHVybiBwcmVwcm9jZXNzb3I7CiAgZnVuY3Rpb24gcHJlcHJvY2Vzc29yKHZhbHVlMiwgZW5jb2RpbmcsIGVuZCkgewogICAgY29uc3QgY2h1bmtzID0gW107CiAgICBsZXQgbWF0Y2gyOwogICAgbGV0IG5leHQyOwogICAgbGV0IHN0YXJ0UG9zaXRpb247CiAgICBsZXQgZW5kUG9zaXRpb247CiAgICBsZXQgY29kZTQ7CiAgICB2YWx1ZTIgPSBidWZmZXIyICsgKHR5cGVvZiB2YWx1ZTIgPT09ICJzdHJpbmciID8gdmFsdWUyLnRvU3RyaW5nKCkgOiBuZXcgVGV4dERlY29kZXIoZW5jb2RpbmcgfHwgdm9pZCAwKS5kZWNvZGUodmFsdWUyKSk7CiAgICBzdGFydFBvc2l0aW9uID0gMDsKICAgIGJ1ZmZlcjIgPSAiIjsKICAgIGlmIChzdGFydCkgewogICAgICBpZiAodmFsdWUyLmNoYXJDb2RlQXQoMCkgPT09IDY1Mjc5KSB7CiAgICAgICAgc3RhcnRQb3NpdGlvbisrOwogICAgICB9CiAgICAgIHN0YXJ0ID0gdm9pZCAwOwogICAgfQogICAgd2hpbGUgKHN0YXJ0UG9zaXRpb24gPCB2YWx1ZTIubGVuZ3RoKSB7CiAgICAgIHNlYXJjaC5sYXN0SW5kZXggPSBzdGFydFBvc2l0aW9uOwogICAgICBtYXRjaDIgPSBzZWFyY2guZXhlYyh2YWx1ZTIpOwogICAgICBlbmRQb3NpdGlvbiA9IG1hdGNoMiAmJiBtYXRjaDIuaW5kZXggIT09IHZvaWQgMCA/IG1hdGNoMi5pbmRleCA6IHZhbHVlMi5sZW5ndGg7CiAgICAgIGNvZGU0ID0gdmFsdWUyLmNoYXJDb2RlQXQoZW5kUG9zaXRpb24pOwogICAgICBpZiAoIW1hdGNoMikgewogICAgICAgIGJ1ZmZlcjIgPSB2YWx1ZTIuc2xpY2Uoc3RhcnRQb3NpdGlvbik7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKGNvZGU0ID09PSAxMCAmJiBzdGFydFBvc2l0aW9uID09PSBlbmRQb3NpdGlvbiAmJiBhdENhcnJpYWdlUmV0dXJuKSB7CiAgICAgICAgY2h1bmtzLnB1c2goLTMpOwogICAgICAgIGF0Q2FycmlhZ2VSZXR1cm4gPSB2b2lkIDA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGF0Q2FycmlhZ2VSZXR1cm4pIHsKICAgICAgICAgIGNodW5rcy5wdXNoKC01KTsKICAgICAgICAgIGF0Q2FycmlhZ2VSZXR1cm4gPSB2b2lkIDA7CiAgICAgICAgfQogICAgICAgIGlmIChzdGFydFBvc2l0aW9uIDwgZW5kUG9zaXRpb24pIHsKICAgICAgICAgIGNodW5rcy5wdXNoKHZhbHVlMi5zbGljZShzdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlvbikpOwogICAgICAgICAgY29sdW1uICs9IGVuZFBvc2l0aW9uIC0gc3RhcnRQb3NpdGlvbjsKICAgICAgICB9CiAgICAgICAgc3dpdGNoIChjb2RlNCkgewogICAgICAgICAgY2FzZSAwOiB7CiAgICAgICAgICAgIGNodW5rcy5wdXNoKDY1NTMzKTsKICAgICAgICAgICAgY29sdW1uKys7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSA5OiB7CiAgICAgICAgICAgIG5leHQyID0gTWF0aC5jZWlsKGNvbHVtbiAvIDQpICogNDsKICAgICAgICAgICAgY2h1bmtzLnB1c2goLTIpOwogICAgICAgICAgICB3aGlsZSAoY29sdW1uKysgPCBuZXh0MikgY2h1bmtzLnB1c2goLTEpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgMTA6IHsKICAgICAgICAgICAgY2h1bmtzLnB1c2goLTQpOwogICAgICAgICAgICBjb2x1bW4gPSAxOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGRlZmF1bHQ6IHsKICAgICAgICAgICAgYXRDYXJyaWFnZVJldHVybiA9IHRydWU7CiAgICAgICAgICAgIGNvbHVtbiA9IDE7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHN0YXJ0UG9zaXRpb24gPSBlbmRQb3NpdGlvbiArIDE7CiAgICB9CiAgICBpZiAoZW5kKSB7CiAgICAgIGlmIChhdENhcnJpYWdlUmV0dXJuKSBjaHVua3MucHVzaCgtNSk7CiAgICAgIGlmIChidWZmZXIyKSBjaHVua3MucHVzaChidWZmZXIyKTsKICAgICAgY2h1bmtzLnB1c2gobnVsbCk7CiAgICB9CiAgICByZXR1cm4gY2h1bmtzOwogIH0KICBfX25hbWUocHJlcHJvY2Vzc29yLCAicHJlcHJvY2Vzc29yIik7Cn0KX19uYW1lKHByZXByb2Nlc3MsICJwcmVwcm9jZXNzIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrQDQuMC4yL25vZGVfbW9kdWxlcy9taWNyb21hcmsvaW5kZXguanMKZnVuY3Rpb24gbWljcm9tYXJrKHZhbHVlMiwgZW5jb2RpbmcsIG9wdGlvbnMpIHsKICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAic3RyaW5nIikgewogICAgb3B0aW9ucyA9IGVuY29kaW5nOwogICAgZW5jb2RpbmcgPSB2b2lkIDA7CiAgfQogIHJldHVybiBjb21waWxlKG9wdGlvbnMpKHBvc3Rwcm9jZXNzKHBhcnNlNChvcHRpb25zKS5kb2N1bWVudCgpLndyaXRlKHByZXByb2Nlc3MoKSh2YWx1ZTIsIGVuY29kaW5nLCB0cnVlKSkpKTsKfQpfX25hbWUobWljcm9tYXJrLCAibWljcm9tYXJrIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC1mcm9tLW1hcmtkb3duQDIuMC4zL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLWZyb20tbWFya2Rvd24vbGliL2luZGV4LmpzCnZhciBvd241ID0ge30uaGFzT3duUHJvcGVydHk7CmZ1bmN0aW9uIGZyb21NYXJrZG93bih2YWx1ZTIsIGVuY29kaW5nLCBvcHRpb25zKSB7CiAgaWYgKGVuY29kaW5nICYmIHR5cGVvZiBlbmNvZGluZyA9PT0gIm9iamVjdCIpIHsKICAgIG9wdGlvbnMgPSBlbmNvZGluZzsKICAgIGVuY29kaW5nID0gdm9pZCAwOwogIH0KICByZXR1cm4gY29tcGlsZXIob3B0aW9ucykocG9zdHByb2Nlc3MocGFyc2U0KG9wdGlvbnMpLmRvY3VtZW50KCkud3JpdGUocHJlcHJvY2VzcygpKHZhbHVlMiwgZW5jb2RpbmcsIHRydWUpKSkpOwp9Cl9fbmFtZShmcm9tTWFya2Rvd24sICJmcm9tTWFya2Rvd24iKTsKZnVuY3Rpb24gY29tcGlsZXIob3B0aW9ucykgewogIGNvbnN0IGNvbmZpZzIgPSB7CiAgICB0cmFuc2Zvcm1zOiBbXSwKICAgIGNhbkNvbnRhaW5Fb2xzOiBbImVtcGhhc2lzIiwgImZyYWdtZW50IiwgImhlYWRpbmciLCAicGFyYWdyYXBoIiwgInN0cm9uZyJdLAogICAgZW50ZXI6IHsKICAgICAgYXV0b2xpbms6IG9wZW5lcjIobGluazMpLAogICAgICBhdXRvbGlua1Byb3RvY29sOiBvbmVudGVyZGF0YSwKICAgICAgYXV0b2xpbmtFbWFpbDogb25lbnRlcmRhdGEsCiAgICAgIGF0eEhlYWRpbmc6IG9wZW5lcjIoaGVhZGluZzMpLAogICAgICBibG9ja1F1b3RlOiBvcGVuZXIyKGJsb2NrUXVvdGUyKSwKICAgICAgY2hhcmFjdGVyRXNjYXBlOiBvbmVudGVyZGF0YSwKICAgICAgY2hhcmFjdGVyUmVmZXJlbmNlOiBvbmVudGVyZGF0YSwKICAgICAgY29kZUZlbmNlZDogb3BlbmVyMihjb2RlRmxvdyksCiAgICAgIGNvZGVGZW5jZWRGZW5jZUluZm86IGJ1ZmZlcjIsCiAgICAgIGNvZGVGZW5jZWRGZW5jZU1ldGE6IGJ1ZmZlcjIsCiAgICAgIGNvZGVJbmRlbnRlZDogb3BlbmVyMihjb2RlRmxvdywgYnVmZmVyMiksCiAgICAgIGNvZGVUZXh0OiBvcGVuZXIyKGNvZGVUZXh0MiwgYnVmZmVyMiksCiAgICAgIGNvZGVUZXh0RGF0YTogb25lbnRlcmRhdGEsCiAgICAgIGRhdGE6IG9uZW50ZXJkYXRhLAogICAgICBjb2RlRmxvd1ZhbHVlOiBvbmVudGVyZGF0YSwKICAgICAgZGVmaW5pdGlvbjogb3BlbmVyMihkZWZpbml0aW9uMyksCiAgICAgIGRlZmluaXRpb25EZXN0aW5hdGlvblN0cmluZzogYnVmZmVyMiwKICAgICAgZGVmaW5pdGlvbkxhYmVsU3RyaW5nOiBidWZmZXIyLAogICAgICBkZWZpbml0aW9uVGl0bGVTdHJpbmc6IGJ1ZmZlcjIsCiAgICAgIGVtcGhhc2lzOiBvcGVuZXIyKGVtcGhhc2lzMyksCiAgICAgIGhhcmRCcmVha0VzY2FwZTogb3BlbmVyMihoYXJkQnJlYWszKSwKICAgICAgaGFyZEJyZWFrVHJhaWxpbmc6IG9wZW5lcjIoaGFyZEJyZWFrMyksCiAgICAgIGh0bWxGbG93OiBvcGVuZXIyKGh0bWw3LCBidWZmZXIyKSwKICAgICAgaHRtbEZsb3dEYXRhOiBvbmVudGVyZGF0YSwKICAgICAgaHRtbFRleHQ6IG9wZW5lcjIoaHRtbDcsIGJ1ZmZlcjIpLAogICAgICBodG1sVGV4dERhdGE6IG9uZW50ZXJkYXRhLAogICAgICBpbWFnZTogb3BlbmVyMihpbWFnZTMpLAogICAgICBsYWJlbDogYnVmZmVyMiwKICAgICAgbGluazogb3BlbmVyMihsaW5rMyksCiAgICAgIGxpc3RJdGVtOiBvcGVuZXIyKGxpc3RJdGVtMyksCiAgICAgIGxpc3RJdGVtVmFsdWU6IG9uZW50ZXJsaXN0aXRlbXZhbHVlLAogICAgICBsaXN0T3JkZXJlZDogb3BlbmVyMihsaXN0NSwgb25lbnRlcmxpc3RvcmRlcmVkKSwKICAgICAgbGlzdFVub3JkZXJlZDogb3BlbmVyMihsaXN0NSksCiAgICAgIHBhcmFncmFwaDogb3BlbmVyMihwYXJhZ3JhcGgzKSwKICAgICAgcmVmZXJlbmNlOiBvbmVudGVycmVmZXJlbmNlLAogICAgICByZWZlcmVuY2VTdHJpbmc6IGJ1ZmZlcjIsCiAgICAgIHJlc291cmNlRGVzdGluYXRpb25TdHJpbmc6IGJ1ZmZlcjIsCiAgICAgIHJlc291cmNlVGl0bGVTdHJpbmc6IGJ1ZmZlcjIsCiAgICAgIHNldGV4dEhlYWRpbmc6IG9wZW5lcjIoaGVhZGluZzMpLAogICAgICBzdHJvbmc6IG9wZW5lcjIoc3Ryb25nMyksCiAgICAgIHRoZW1hdGljQnJlYWs6IG9wZW5lcjIodGhlbWF0aWNCcmVhazQpCiAgICB9LAogICAgZXhpdDogewogICAgICBhdHhIZWFkaW5nOiBjbG9zZXIoKSwKICAgICAgYXR4SGVhZGluZ1NlcXVlbmNlOiBvbmV4aXRhdHhoZWFkaW5nc2VxdWVuY2UsCiAgICAgIGF1dG9saW5rOiBjbG9zZXIoKSwKICAgICAgYXV0b2xpbmtFbWFpbDogb25leGl0YXV0b2xpbmtlbWFpbCwKICAgICAgYXV0b2xpbmtQcm90b2NvbDogb25leGl0YXV0b2xpbmtwcm90b2NvbCwKICAgICAgYmxvY2tRdW90ZTogY2xvc2VyKCksCiAgICAgIGNoYXJhY3RlckVzY2FwZVZhbHVlOiBvbmV4aXRkYXRhLAogICAgICBjaGFyYWN0ZXJSZWZlcmVuY2VNYXJrZXJIZXhhZGVjaW1hbDogb25leGl0Y2hhcmFjdGVycmVmZXJlbmNlbWFya2VyLAogICAgICBjaGFyYWN0ZXJSZWZlcmVuY2VNYXJrZXJOdW1lcmljOiBvbmV4aXRjaGFyYWN0ZXJyZWZlcmVuY2VtYXJrZXIsCiAgICAgIGNoYXJhY3RlclJlZmVyZW5jZVZhbHVlOiBvbmV4aXRjaGFyYWN0ZXJyZWZlcmVuY2V2YWx1ZSwKICAgICAgY2hhcmFjdGVyUmVmZXJlbmNlOiBvbmV4aXRjaGFyYWN0ZXJyZWZlcmVuY2UsCiAgICAgIGNvZGVGZW5jZWQ6IGNsb3NlcihvbmV4aXRjb2RlZmVuY2VkKSwKICAgICAgY29kZUZlbmNlZEZlbmNlOiBvbmV4aXRjb2RlZmVuY2VkZmVuY2UsCiAgICAgIGNvZGVGZW5jZWRGZW5jZUluZm86IG9uZXhpdGNvZGVmZW5jZWRmZW5jZWluZm8sCiAgICAgIGNvZGVGZW5jZWRGZW5jZU1ldGE6IG9uZXhpdGNvZGVmZW5jZWRmZW5jZW1ldGEsCiAgICAgIGNvZGVGbG93VmFsdWU6IG9uZXhpdGRhdGEsCiAgICAgIGNvZGVJbmRlbnRlZDogY2xvc2VyKG9uZXhpdGNvZGVpbmRlbnRlZCksCiAgICAgIGNvZGVUZXh0OiBjbG9zZXIob25leGl0Y29kZXRleHQpLAogICAgICBjb2RlVGV4dERhdGE6IG9uZXhpdGRhdGEsCiAgICAgIGRhdGE6IG9uZXhpdGRhdGEsCiAgICAgIGRlZmluaXRpb246IGNsb3NlcigpLAogICAgICBkZWZpbml0aW9uRGVzdGluYXRpb25TdHJpbmc6IG9uZXhpdGRlZmluaXRpb25kZXN0aW5hdGlvbnN0cmluZywKICAgICAgZGVmaW5pdGlvbkxhYmVsU3RyaW5nOiBvbmV4aXRkZWZpbml0aW9ubGFiZWxzdHJpbmcsCiAgICAgIGRlZmluaXRpb25UaXRsZVN0cmluZzogb25leGl0ZGVmaW5pdGlvbnRpdGxlc3RyaW5nLAogICAgICBlbXBoYXNpczogY2xvc2VyKCksCiAgICAgIGhhcmRCcmVha0VzY2FwZTogY2xvc2VyKG9uZXhpdGhhcmRicmVhayksCiAgICAgIGhhcmRCcmVha1RyYWlsaW5nOiBjbG9zZXIob25leGl0aGFyZGJyZWFrKSwKICAgICAgaHRtbEZsb3c6IGNsb3NlcihvbmV4aXRodG1sZmxvdyksCiAgICAgIGh0bWxGbG93RGF0YTogb25leGl0ZGF0YSwKICAgICAgaHRtbFRleHQ6IGNsb3NlcihvbmV4aXRodG1sdGV4dCksCiAgICAgIGh0bWxUZXh0RGF0YTogb25leGl0ZGF0YSwKICAgICAgaW1hZ2U6IGNsb3NlcihvbmV4aXRpbWFnZSksCiAgICAgIGxhYmVsOiBvbmV4aXRsYWJlbCwKICAgICAgbGFiZWxUZXh0OiBvbmV4aXRsYWJlbHRleHQsCiAgICAgIGxpbmVFbmRpbmc6IG9uZXhpdGxpbmVlbmRpbmcsCiAgICAgIGxpbms6IGNsb3NlcihvbmV4aXRsaW5rKSwKICAgICAgbGlzdEl0ZW06IGNsb3NlcigpLAogICAgICBsaXN0T3JkZXJlZDogY2xvc2VyKCksCiAgICAgIGxpc3RVbm9yZGVyZWQ6IGNsb3NlcigpLAogICAgICBwYXJhZ3JhcGg6IGNsb3NlcigpLAogICAgICByZWZlcmVuY2VTdHJpbmc6IG9uZXhpdHJlZmVyZW5jZXN0cmluZywKICAgICAgcmVzb3VyY2VEZXN0aW5hdGlvblN0cmluZzogb25leGl0cmVzb3VyY2VkZXN0aW5hdGlvbnN0cmluZywKICAgICAgcmVzb3VyY2VUaXRsZVN0cmluZzogb25leGl0cmVzb3VyY2V0aXRsZXN0cmluZywKICAgICAgcmVzb3VyY2U6IG9uZXhpdHJlc291cmNlLAogICAgICBzZXRleHRIZWFkaW5nOiBjbG9zZXIob25leGl0c2V0ZXh0aGVhZGluZyksCiAgICAgIHNldGV4dEhlYWRpbmdMaW5lU2VxdWVuY2U6IG9uZXhpdHNldGV4dGhlYWRpbmdsaW5lc2VxdWVuY2UsCiAgICAgIHNldGV4dEhlYWRpbmdUZXh0OiBvbmV4aXRzZXRleHRoZWFkaW5ndGV4dCwKICAgICAgc3Ryb25nOiBjbG9zZXIoKSwKICAgICAgdGhlbWF0aWNCcmVhazogY2xvc2VyKCkKICAgIH0KICB9OwogIGNvbmZpZ3VyZTIoY29uZmlnMiwgKG9wdGlvbnMgfHwge30pLm1kYXN0RXh0ZW5zaW9ucyB8fCBbXSk7CiAgY29uc3QgZGF0YSA9IHt9OwogIHJldHVybiBjb21waWxlMjsKICBmdW5jdGlvbiBjb21waWxlMihldmVudHMpIHsKICAgIGxldCB0cmVlID0gewogICAgICB0eXBlOiAicm9vdCIsCiAgICAgIGNoaWxkcmVuOiBbXQogICAgfTsKICAgIGNvbnN0IGNvbnRleHQyID0gewogICAgICBzdGFjazogW3RyZWVdLAogICAgICB0b2tlblN0YWNrOiBbXSwKICAgICAgY29uZmlnOiBjb25maWcyLAogICAgICBlbnRlciwKICAgICAgZXhpdDogZXhpdDMsCiAgICAgIGJ1ZmZlcjogYnVmZmVyMiwKICAgICAgcmVzdW1lLAogICAgICBkYXRhCiAgICB9OwogICAgY29uc3QgbGlzdFN0YWNrID0gW107CiAgICBsZXQgaW5kZXgyID0gLTE7CiAgICB3aGlsZSAoKytpbmRleDIgPCBldmVudHMubGVuZ3RoKSB7CiAgICAgIGlmIChldmVudHNbaW5kZXgyXVsxXS50eXBlID09PSAibGlzdE9yZGVyZWQiIHx8IGV2ZW50c1tpbmRleDJdWzFdLnR5cGUgPT09ICJsaXN0VW5vcmRlcmVkIikgewogICAgICAgIGlmIChldmVudHNbaW5kZXgyXVswXSA9PT0gImVudGVyIikgewogICAgICAgICAgbGlzdFN0YWNrLnB1c2goaW5kZXgyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3QgdGFpbCA9IGxpc3RTdGFjay5wb3AoKTsKICAgICAgICAgIGluZGV4MiA9IHByZXBhcmVMaXN0KGV2ZW50cywgdGFpbCwgaW5kZXgyKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGluZGV4MiA9IC0xOwogICAgd2hpbGUgKCsraW5kZXgyIDwgZXZlbnRzLmxlbmd0aCkgewogICAgICBjb25zdCBoYW5kbGVyMiA9IGNvbmZpZzJbZXZlbnRzW2luZGV4Ml1bMF1dOwogICAgICBpZiAob3duNS5jYWxsKGhhbmRsZXIyLCBldmVudHNbaW5kZXgyXVsxXS50eXBlKSkgewogICAgICAgIGhhbmRsZXIyW2V2ZW50c1tpbmRleDJdWzFdLnR5cGVdLmNhbGwoT2JqZWN0LmFzc2lnbih7CiAgICAgICAgICBzbGljZVNlcmlhbGl6ZTogZXZlbnRzW2luZGV4Ml1bMl0uc2xpY2VTZXJpYWxpemUKICAgICAgICB9LCBjb250ZXh0MiksIGV2ZW50c1tpbmRleDJdWzFdKTsKICAgICAgfQogICAgfQogICAgaWYgKGNvbnRleHQyLnRva2VuU3RhY2subGVuZ3RoID4gMCkgewogICAgICBjb25zdCB0YWlsID0gY29udGV4dDIudG9rZW5TdGFja1tjb250ZXh0Mi50b2tlblN0YWNrLmxlbmd0aCAtIDFdOwogICAgICBjb25zdCBoYW5kbGVyMiA9IHRhaWxbMV0gfHwgZGVmYXVsdE9uRXJyb3I7CiAgICAgIGhhbmRsZXIyLmNhbGwoY29udGV4dDIsIHZvaWQgMCwgdGFpbFswXSk7CiAgICB9CiAgICB0cmVlLnBvc2l0aW9uID0gewogICAgICBzdGFydDogcG9pbnQyKGV2ZW50cy5sZW5ndGggPiAwID8gZXZlbnRzWzBdWzFdLnN0YXJ0IDogewogICAgICAgIGxpbmU6IDEsCiAgICAgICAgY29sdW1uOiAxLAogICAgICAgIG9mZnNldDogMAogICAgICB9KSwKICAgICAgZW5kOiBwb2ludDIoZXZlbnRzLmxlbmd0aCA+IDAgPyBldmVudHNbZXZlbnRzLmxlbmd0aCAtIDJdWzFdLmVuZCA6IHsKICAgICAgICBsaW5lOiAxLAogICAgICAgIGNvbHVtbjogMSwKICAgICAgICBvZmZzZXQ6IDAKICAgICAgfSkKICAgIH07CiAgICBpbmRleDIgPSAtMTsKICAgIHdoaWxlICgrK2luZGV4MiA8IGNvbmZpZzIudHJhbnNmb3Jtcy5sZW5ndGgpIHsKICAgICAgdHJlZSA9IGNvbmZpZzIudHJhbnNmb3Jtc1tpbmRleDJdKHRyZWUpIHx8IHRyZWU7CiAgICB9CiAgICByZXR1cm4gdHJlZTsKICB9CiAgX19uYW1lKGNvbXBpbGUyLCAiY29tcGlsZSIpOwogIGZ1bmN0aW9uIHByZXBhcmVMaXN0KGV2ZW50cywgc3RhcnQsIGxlbmd0aCkgewogICAgbGV0IGluZGV4MiA9IHN0YXJ0IC0gMTsKICAgIGxldCBjb250YWluZXJCYWxhbmNlID0gLTE7CiAgICBsZXQgbGlzdFNwcmVhZCA9IGZhbHNlOwogICAgbGV0IGxpc3RJdGVtNDsKICAgIGxldCBsaW5lSW5kZXg7CiAgICBsZXQgZmlyc3RCbGFua0xpbmVJbmRleDsKICAgIGxldCBhdE1hcmtlcjsKICAgIHdoaWxlICgrK2luZGV4MiA8PSBsZW5ndGgpIHsKICAgICAgY29uc3QgZXZlbnQgPSBldmVudHNbaW5kZXgyXTsKICAgICAgc3dpdGNoIChldmVudFsxXS50eXBlKSB7CiAgICAgICAgY2FzZSAibGlzdFVub3JkZXJlZCI6CiAgICAgICAgY2FzZSAibGlzdE9yZGVyZWQiOgogICAgICAgIGNhc2UgImJsb2NrUXVvdGUiOiB7CiAgICAgICAgICBpZiAoZXZlbnRbMF0gPT09ICJlbnRlciIpIHsKICAgICAgICAgICAgY29udGFpbmVyQmFsYW5jZSsrOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29udGFpbmVyQmFsYW5jZS0tOwogICAgICAgICAgfQogICAgICAgICAgYXRNYXJrZXIgPSB2b2lkIDA7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY2FzZSAibGluZUVuZGluZ0JsYW5rIjogewogICAgICAgICAgaWYgKGV2ZW50WzBdID09PSAiZW50ZXIiKSB7CiAgICAgICAgICAgIGlmIChsaXN0SXRlbTQgJiYgIWF0TWFya2VyICYmICFjb250YWluZXJCYWxhbmNlICYmICFmaXJzdEJsYW5rTGluZUluZGV4KSB7CiAgICAgICAgICAgICAgZmlyc3RCbGFua0xpbmVJbmRleCA9IGluZGV4MjsKICAgICAgICAgICAgfQogICAgICAgICAgICBhdE1hcmtlciA9IHZvaWQgMDsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjYXNlICJsaW5lUHJlZml4IjoKICAgICAgICBjYXNlICJsaXN0SXRlbVZhbHVlIjoKICAgICAgICBjYXNlICJsaXN0SXRlbU1hcmtlciI6CiAgICAgICAgY2FzZSAibGlzdEl0ZW1QcmVmaXgiOgogICAgICAgIGNhc2UgImxpc3RJdGVtUHJlZml4V2hpdGVzcGFjZSI6IHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBkZWZhdWx0OiB7CiAgICAgICAgICBhdE1hcmtlciA9IHZvaWQgMDsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCFjb250YWluZXJCYWxhbmNlICYmIGV2ZW50WzBdID09PSAiZW50ZXIiICYmIGV2ZW50WzFdLnR5cGUgPT09ICJsaXN0SXRlbVByZWZpeCIgfHwgY29udGFpbmVyQmFsYW5jZSA9PT0gLTEgJiYgZXZlbnRbMF0gPT09ICJleGl0IiAmJiAoZXZlbnRbMV0udHlwZSA9PT0gImxpc3RVbm9yZGVyZWQiIHx8IGV2ZW50WzFdLnR5cGUgPT09ICJsaXN0T3JkZXJlZCIpKSB7CiAgICAgICAgaWYgKGxpc3RJdGVtNCkgewogICAgICAgICAgbGV0IHRhaWxJbmRleCA9IGluZGV4MjsKICAgICAgICAgIGxpbmVJbmRleCA9IHZvaWQgMDsKICAgICAgICAgIHdoaWxlICh0YWlsSW5kZXgtLSkgewogICAgICAgICAgICBjb25zdCB0YWlsRXZlbnQgPSBldmVudHNbdGFpbEluZGV4XTsKICAgICAgICAgICAgaWYgKHRhaWxFdmVudFsxXS50eXBlID09PSAibGluZUVuZGluZyIgfHwgdGFpbEV2ZW50WzFdLnR5cGUgPT09ICJsaW5lRW5kaW5nQmxhbmsiKSB7CiAgICAgICAgICAgICAgaWYgKHRhaWxFdmVudFswXSA9PT0gImV4aXQiKSBjb250aW51ZTsKICAgICAgICAgICAgICBpZiAobGluZUluZGV4KSB7CiAgICAgICAgICAgICAgICBldmVudHNbbGluZUluZGV4XVsxXS50eXBlID0gImxpbmVFbmRpbmdCbGFuayI7CiAgICAgICAgICAgICAgICBsaXN0U3ByZWFkID0gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdGFpbEV2ZW50WzFdLnR5cGUgPSAibGluZUVuZGluZyI7CiAgICAgICAgICAgICAgbGluZUluZGV4ID0gdGFpbEluZGV4OwogICAgICAgICAgICB9IGVsc2UgaWYgKHRhaWxFdmVudFsxXS50eXBlID09PSAibGluZVByZWZpeCIgfHwgdGFpbEV2ZW50WzFdLnR5cGUgPT09ICJibG9ja1F1b3RlUHJlZml4IiB8fCB0YWlsRXZlbnRbMV0udHlwZSA9PT0gImJsb2NrUXVvdGVQcmVmaXhXaGl0ZXNwYWNlIiB8fCB0YWlsRXZlbnRbMV0udHlwZSA9PT0gImJsb2NrUXVvdGVNYXJrZXIiIHx8IHRhaWxFdmVudFsxXS50eXBlID09PSAibGlzdEl0ZW1JbmRlbnQiKSB7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChmaXJzdEJsYW5rTGluZUluZGV4ICYmICghbGluZUluZGV4IHx8IGZpcnN0QmxhbmtMaW5lSW5kZXggPCBsaW5lSW5kZXgpKSB7CiAgICAgICAgICAgIGxpc3RJdGVtNC5fc3ByZWFkID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGxpc3RJdGVtNC5lbmQgPSBPYmplY3QuYXNzaWduKHt9LCBsaW5lSW5kZXggPyBldmVudHNbbGluZUluZGV4XVsxXS5zdGFydCA6IGV2ZW50WzFdLmVuZCk7CiAgICAgICAgICBldmVudHMuc3BsaWNlKGxpbmVJbmRleCB8fCBpbmRleDIsIDAsIFsiZXhpdCIsIGxpc3RJdGVtNCwgZXZlbnRbMl1dKTsKICAgICAgICAgIGluZGV4MisrOwogICAgICAgICAgbGVuZ3RoKys7CiAgICAgICAgfQogICAgICAgIGlmIChldmVudFsxXS50eXBlID09PSAibGlzdEl0ZW1QcmVmaXgiKSB7CiAgICAgICAgICBjb25zdCBpdGVtID0gewogICAgICAgICAgICB0eXBlOiAibGlzdEl0ZW0iLAogICAgICAgICAgICBfc3ByZWFkOiBmYWxzZSwKICAgICAgICAgICAgc3RhcnQ6IE9iamVjdC5hc3NpZ24oe30sIGV2ZW50WzFdLnN0YXJ0KSwKICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogd2XigJlsbCBhZGQgYGVuZGAgaW4gYSBzZWNvbmQuCiAgICAgICAgICAgIGVuZDogdm9pZCAwCiAgICAgICAgICB9OwogICAgICAgICAgbGlzdEl0ZW00ID0gaXRlbTsKICAgICAgICAgIGV2ZW50cy5zcGxpY2UoaW5kZXgyLCAwLCBbImVudGVyIiwgaXRlbSwgZXZlbnRbMl1dKTsKICAgICAgICAgIGluZGV4MisrOwogICAgICAgICAgbGVuZ3RoKys7CiAgICAgICAgICBmaXJzdEJsYW5rTGluZUluZGV4ID0gdm9pZCAwOwogICAgICAgICAgYXRNYXJrZXIgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZXZlbnRzW3N0YXJ0XVsxXS5fc3ByZWFkID0gbGlzdFNwcmVhZDsKICAgIHJldHVybiBsZW5ndGg7CiAgfQogIF9fbmFtZShwcmVwYXJlTGlzdCwgInByZXBhcmVMaXN0Iik7CiAgZnVuY3Rpb24gb3BlbmVyMihjcmVhdGU3LCBhbmQpIHsKICAgIHJldHVybiBvcGVuOwogICAgZnVuY3Rpb24gb3Blbih0b2tlbikgewogICAgICBlbnRlci5jYWxsKHRoaXMsIGNyZWF0ZTcodG9rZW4pLCB0b2tlbik7CiAgICAgIGlmIChhbmQpIGFuZC5jYWxsKHRoaXMsIHRva2VuKTsKICAgIH0KICAgIF9fbmFtZShvcGVuLCAib3BlbiIpOwogIH0KICBfX25hbWUob3BlbmVyMiwgIm9wZW5lciIpOwogIGZ1bmN0aW9uIGJ1ZmZlcjIoKSB7CiAgICB0aGlzLnN0YWNrLnB1c2goewogICAgICB0eXBlOiAiZnJhZ21lbnQiLAogICAgICBjaGlsZHJlbjogW10KICAgIH0pOwogIH0KICBfX25hbWUoYnVmZmVyMiwgImJ1ZmZlciIpOwogIGZ1bmN0aW9uIGVudGVyKG5vZGUyLCB0b2tlbiwgZXJyb3JIYW5kbGVyKSB7CiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgICBjb25zdCBzaWJsaW5nczIgPSBwYXJlbnQuY2hpbGRyZW47CiAgICBzaWJsaW5nczIucHVzaChub2RlMik7CiAgICB0aGlzLnN0YWNrLnB1c2gobm9kZTIpOwogICAgdGhpcy50b2tlblN0YWNrLnB1c2goW3Rva2VuLCBlcnJvckhhbmRsZXIgfHwgdm9pZCAwXSk7CiAgICBub2RlMi5wb3NpdGlvbiA9IHsKICAgICAgc3RhcnQ6IHBvaW50Mih0b2tlbi5zdGFydCksCiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IGBlbmRgIHdpbGwgYmUgcGF0Y2hlZCBsYXRlci4KICAgICAgZW5kOiB2b2lkIDAKICAgIH07CiAgfQogIF9fbmFtZShlbnRlciwgImVudGVyIik7CiAgZnVuY3Rpb24gY2xvc2VyKGFuZCkgewogICAgcmV0dXJuIGNsb3NlNzsKICAgIGZ1bmN0aW9uIGNsb3NlNyh0b2tlbikgewogICAgICBpZiAoYW5kKSBhbmQuY2FsbCh0aGlzLCB0b2tlbik7CiAgICAgIGV4aXQzLmNhbGwodGhpcywgdG9rZW4pOwogICAgfQogICAgX19uYW1lKGNsb3NlNywgImNsb3NlIik7CiAgfQogIF9fbmFtZShjbG9zZXIsICJjbG9zZXIiKTsKICBmdW5jdGlvbiBleGl0Myh0b2tlbiwgb25FeGl0RXJyb3IpIHsKICAgIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFjay5wb3AoKTsKICAgIGNvbnN0IG9wZW4gPSB0aGlzLnRva2VuU3RhY2sucG9wKCk7CiAgICBpZiAoIW9wZW4pIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgY2xvc2UgYCIgKyB0b2tlbi50eXBlICsgImAgKCIgKyBzdHJpbmdpZnlQb3NpdGlvbih7CiAgICAgICAgc3RhcnQ6IHRva2VuLnN0YXJ0LAogICAgICAgIGVuZDogdG9rZW4uZW5kCiAgICAgIH0pICsgIik6IGl0XHUyMDE5cyBub3Qgb3BlbiIpOwogICAgfSBlbHNlIGlmIChvcGVuWzBdLnR5cGUgIT09IHRva2VuLnR5cGUpIHsKICAgICAgaWYgKG9uRXhpdEVycm9yKSB7CiAgICAgICAgb25FeGl0RXJyb3IuY2FsbCh0aGlzLCB0b2tlbiwgb3BlblswXSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgaGFuZGxlcjIgPSBvcGVuWzFdIHx8IGRlZmF1bHRPbkVycm9yOwogICAgICAgIGhhbmRsZXIyLmNhbGwodGhpcywgdG9rZW4sIG9wZW5bMF0pOwogICAgICB9CiAgICB9CiAgICBub2RlMi5wb3NpdGlvbi5lbmQgPSBwb2ludDIodG9rZW4uZW5kKTsKICB9CiAgX19uYW1lKGV4aXQzLCAiZXhpdCIpOwogIGZ1bmN0aW9uIHJlc3VtZSgpIHsKICAgIHJldHVybiB0b1N0cmluZyh0aGlzLnN0YWNrLnBvcCgpKTsKICB9CiAgX19uYW1lKHJlc3VtZSwgInJlc3VtZSIpOwogIGZ1bmN0aW9uIG9uZW50ZXJsaXN0b3JkZXJlZCgpIHsKICAgIHRoaXMuZGF0YS5leHBlY3RpbmdGaXJzdExpc3RJdGVtVmFsdWUgPSB0cnVlOwogIH0KICBfX25hbWUob25lbnRlcmxpc3RvcmRlcmVkLCAib25lbnRlcmxpc3RvcmRlcmVkIik7CiAgZnVuY3Rpb24gb25lbnRlcmxpc3RpdGVtdmFsdWUodG9rZW4pIHsKICAgIGlmICh0aGlzLmRhdGEuZXhwZWN0aW5nRmlyc3RMaXN0SXRlbVZhbHVlKSB7CiAgICAgIGNvbnN0IGFuY2VzdG9yID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDJdOwogICAgICBhbmNlc3Rvci5zdGFydCA9IE51bWJlci5wYXJzZUludCh0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKSwgMTApOwogICAgICB0aGlzLmRhdGEuZXhwZWN0aW5nRmlyc3RMaXN0SXRlbVZhbHVlID0gdm9pZCAwOwogICAgfQogIH0KICBfX25hbWUob25lbnRlcmxpc3RpdGVtdmFsdWUsICJvbmVudGVybGlzdGl0ZW12YWx1ZSIpOwogIGZ1bmN0aW9uIG9uZXhpdGNvZGVmZW5jZWRmZW5jZWluZm8oKSB7CiAgICBjb25zdCBkYXRhMiA9IHRoaXMucmVzdW1lKCk7CiAgICBjb25zdCBub2RlMiA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTsKICAgIG5vZGUyLmxhbmcgPSBkYXRhMjsKICB9CiAgX19uYW1lKG9uZXhpdGNvZGVmZW5jZWRmZW5jZWluZm8sICJvbmV4aXRjb2RlZmVuY2VkZmVuY2VpbmZvIik7CiAgZnVuY3Rpb24gb25leGl0Y29kZWZlbmNlZGZlbmNlbWV0YSgpIHsKICAgIGNvbnN0IGRhdGEyID0gdGhpcy5yZXN1bWUoKTsKICAgIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogICAgbm9kZTIubWV0YSA9IGRhdGEyOwogIH0KICBfX25hbWUob25leGl0Y29kZWZlbmNlZGZlbmNlbWV0YSwgIm9uZXhpdGNvZGVmZW5jZWRmZW5jZW1ldGEiKTsKICBmdW5jdGlvbiBvbmV4aXRjb2RlZmVuY2VkZmVuY2UoKSB7CiAgICBpZiAodGhpcy5kYXRhLmZsb3dDb2RlSW5zaWRlKSByZXR1cm47CiAgICB0aGlzLmJ1ZmZlcigpOwogICAgdGhpcy5kYXRhLmZsb3dDb2RlSW5zaWRlID0gdHJ1ZTsKICB9CiAgX19uYW1lKG9uZXhpdGNvZGVmZW5jZWRmZW5jZSwgIm9uZXhpdGNvZGVmZW5jZWRmZW5jZSIpOwogIGZ1bmN0aW9uIG9uZXhpdGNvZGVmZW5jZWQoKSB7CiAgICBjb25zdCBkYXRhMiA9IHRoaXMucmVzdW1lKCk7CiAgICBjb25zdCBub2RlMiA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTsKICAgIG5vZGUyLnZhbHVlID0gZGF0YTIucmVwbGFjZSgvXihccj9cbnxccil8KFxyP1xufFxyKSQvZywgIiIpOwogICAgdGhpcy5kYXRhLmZsb3dDb2RlSW5zaWRlID0gdm9pZCAwOwogIH0KICBfX25hbWUob25leGl0Y29kZWZlbmNlZCwgIm9uZXhpdGNvZGVmZW5jZWQiKTsKICBmdW5jdGlvbiBvbmV4aXRjb2RlaW5kZW50ZWQoKSB7CiAgICBjb25zdCBkYXRhMiA9IHRoaXMucmVzdW1lKCk7CiAgICBjb25zdCBub2RlMiA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTsKICAgIG5vZGUyLnZhbHVlID0gZGF0YTIucmVwbGFjZSgvKFxyP1xufFxyKSQvZywgIiIpOwogIH0KICBfX25hbWUob25leGl0Y29kZWluZGVudGVkLCAib25leGl0Y29kZWluZGVudGVkIik7CiAgZnVuY3Rpb24gb25leGl0ZGVmaW5pdGlvbmxhYmVsc3RyaW5nKHRva2VuKSB7CiAgICBjb25zdCBsYWJlbCA9IHRoaXMucmVzdW1lKCk7CiAgICBjb25zdCBub2RlMiA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTsKICAgIG5vZGUyLmxhYmVsID0gbGFiZWw7CiAgICBub2RlMi5pZGVudGlmaWVyID0gbm9ybWFsaXplSWRlbnRpZmllcih0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKSkudG9Mb3dlckNhc2UoKTsKICB9CiAgX19uYW1lKG9uZXhpdGRlZmluaXRpb25sYWJlbHN0cmluZywgIm9uZXhpdGRlZmluaXRpb25sYWJlbHN0cmluZyIpOwogIGZ1bmN0aW9uIG9uZXhpdGRlZmluaXRpb250aXRsZXN0cmluZygpIHsKICAgIGNvbnN0IGRhdGEyID0gdGhpcy5yZXN1bWUoKTsKICAgIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogICAgbm9kZTIudGl0bGUgPSBkYXRhMjsKICB9CiAgX19uYW1lKG9uZXhpdGRlZmluaXRpb250aXRsZXN0cmluZywgIm9uZXhpdGRlZmluaXRpb250aXRsZXN0cmluZyIpOwogIGZ1bmN0aW9uIG9uZXhpdGRlZmluaXRpb25kZXN0aW5hdGlvbnN0cmluZygpIHsKICAgIGNvbnN0IGRhdGEyID0gdGhpcy5yZXN1bWUoKTsKICAgIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogICAgbm9kZTIudXJsID0gZGF0YTI7CiAgfQogIF9fbmFtZShvbmV4aXRkZWZpbml0aW9uZGVzdGluYXRpb25zdHJpbmcsICJvbmV4aXRkZWZpbml0aW9uZGVzdGluYXRpb25zdHJpbmciKTsKICBmdW5jdGlvbiBvbmV4aXRhdHhoZWFkaW5nc2VxdWVuY2UodG9rZW4pIHsKICAgIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogICAgaWYgKCFub2RlMi5kZXB0aCkgewogICAgICBjb25zdCBkZXB0aCA9IHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pLmxlbmd0aDsKICAgICAgbm9kZTIuZGVwdGggPSBkZXB0aDsKICAgIH0KICB9CiAgX19uYW1lKG9uZXhpdGF0eGhlYWRpbmdzZXF1ZW5jZSwgIm9uZXhpdGF0eGhlYWRpbmdzZXF1ZW5jZSIpOwogIGZ1bmN0aW9uIG9uZXhpdHNldGV4dGhlYWRpbmd0ZXh0KCkgewogICAgdGhpcy5kYXRhLnNldGV4dEhlYWRpbmdTbHVycExpbmVFbmRpbmcgPSB0cnVlOwogIH0KICBfX25hbWUob25leGl0c2V0ZXh0aGVhZGluZ3RleHQsICJvbmV4aXRzZXRleHRoZWFkaW5ndGV4dCIpOwogIGZ1bmN0aW9uIG9uZXhpdHNldGV4dGhlYWRpbmdsaW5lc2VxdWVuY2UodG9rZW4pIHsKICAgIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogICAgbm9kZTIuZGVwdGggPSB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKS5jb2RlUG9pbnRBdCgwKSA9PT0gNjEgPyAxIDogMjsKICB9CiAgX19uYW1lKG9uZXhpdHNldGV4dGhlYWRpbmdsaW5lc2VxdWVuY2UsICJvbmV4aXRzZXRleHRoZWFkaW5nbGluZXNlcXVlbmNlIik7CiAgZnVuY3Rpb24gb25leGl0c2V0ZXh0aGVhZGluZygpIHsKICAgIHRoaXMuZGF0YS5zZXRleHRIZWFkaW5nU2x1cnBMaW5lRW5kaW5nID0gdm9pZCAwOwogIH0KICBfX25hbWUob25leGl0c2V0ZXh0aGVhZGluZywgIm9uZXhpdHNldGV4dGhlYWRpbmciKTsKICBmdW5jdGlvbiBvbmVudGVyZGF0YSh0b2tlbikgewogICAgY29uc3Qgbm9kZTIgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgICBjb25zdCBzaWJsaW5nczIgPSBub2RlMi5jaGlsZHJlbjsKICAgIGxldCB0YWlsID0gc2libGluZ3MyW3NpYmxpbmdzMi5sZW5ndGggLSAxXTsKICAgIGlmICghdGFpbCB8fCB0YWlsLnR5cGUgIT09ICJ0ZXh0IikgewogICAgICB0YWlsID0gdGV4dDgoKTsKICAgICAgdGFpbC5wb3NpdGlvbiA9IHsKICAgICAgICBzdGFydDogcG9pbnQyKHRva2VuLnN0YXJ0KSwKICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiB3ZeKAmWxsIGFkZCBgZW5kYCBsYXRlci4KICAgICAgICBlbmQ6IHZvaWQgMAogICAgICB9OwogICAgICBzaWJsaW5nczIucHVzaCh0YWlsKTsKICAgIH0KICAgIHRoaXMuc3RhY2sucHVzaCh0YWlsKTsKICB9CiAgX19uYW1lKG9uZW50ZXJkYXRhLCAib25lbnRlcmRhdGEiKTsKICBmdW5jdGlvbiBvbmV4aXRkYXRhKHRva2VuKSB7CiAgICBjb25zdCB0YWlsID0gdGhpcy5zdGFjay5wb3AoKTsKICAgIHRhaWwudmFsdWUgKz0gdGhpcy5zbGljZVNlcmlhbGl6ZSh0b2tlbik7CiAgICB0YWlsLnBvc2l0aW9uLmVuZCA9IHBvaW50Mih0b2tlbi5lbmQpOwogIH0KICBfX25hbWUob25leGl0ZGF0YSwgIm9uZXhpdGRhdGEiKTsKICBmdW5jdGlvbiBvbmV4aXRsaW5lZW5kaW5nKHRva2VuKSB7CiAgICBjb25zdCBjb250ZXh0MiA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTsKICAgIGlmICh0aGlzLmRhdGEuYXRIYXJkQnJlYWspIHsKICAgICAgY29uc3QgdGFpbCA9IGNvbnRleHQyLmNoaWxkcmVuW2NvbnRleHQyLmNoaWxkcmVuLmxlbmd0aCAtIDFdOwogICAgICB0YWlsLnBvc2l0aW9uLmVuZCA9IHBvaW50Mih0b2tlbi5lbmQpOwogICAgICB0aGlzLmRhdGEuYXRIYXJkQnJlYWsgPSB2b2lkIDA7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICghdGhpcy5kYXRhLnNldGV4dEhlYWRpbmdTbHVycExpbmVFbmRpbmcgJiYgY29uZmlnMi5jYW5Db250YWluRW9scy5pbmNsdWRlcyhjb250ZXh0Mi50eXBlKSkgewogICAgICBvbmVudGVyZGF0YS5jYWxsKHRoaXMsIHRva2VuKTsKICAgICAgb25leGl0ZGF0YS5jYWxsKHRoaXMsIHRva2VuKTsKICAgIH0KICB9CiAgX19uYW1lKG9uZXhpdGxpbmVlbmRpbmcsICJvbmV4aXRsaW5lZW5kaW5nIik7CiAgZnVuY3Rpb24gb25leGl0aGFyZGJyZWFrKCkgewogICAgdGhpcy5kYXRhLmF0SGFyZEJyZWFrID0gdHJ1ZTsKICB9CiAgX19uYW1lKG9uZXhpdGhhcmRicmVhaywgIm9uZXhpdGhhcmRicmVhayIpOwogIGZ1bmN0aW9uIG9uZXhpdGh0bWxmbG93KCkgewogICAgY29uc3QgZGF0YTIgPSB0aGlzLnJlc3VtZSgpOwogICAgY29uc3Qgbm9kZTIgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgICBub2RlMi52YWx1ZSA9IGRhdGEyOwogIH0KICBfX25hbWUob25leGl0aHRtbGZsb3csICJvbmV4aXRodG1sZmxvdyIpOwogIGZ1bmN0aW9uIG9uZXhpdGh0bWx0ZXh0KCkgewogICAgY29uc3QgZGF0YTIgPSB0aGlzLnJlc3VtZSgpOwogICAgY29uc3Qgbm9kZTIgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgICBub2RlMi52YWx1ZSA9IGRhdGEyOwogIH0KICBfX25hbWUob25leGl0aHRtbHRleHQsICJvbmV4aXRodG1sdGV4dCIpOwogIGZ1bmN0aW9uIG9uZXhpdGNvZGV0ZXh0KCkgewogICAgY29uc3QgZGF0YTIgPSB0aGlzLnJlc3VtZSgpOwogICAgY29uc3Qgbm9kZTIgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgICBub2RlMi52YWx1ZSA9IGRhdGEyOwogIH0KICBfX25hbWUob25leGl0Y29kZXRleHQsICJvbmV4aXRjb2RldGV4dCIpOwogIGZ1bmN0aW9uIG9uZXhpdGxpbmsoKSB7CiAgICBjb25zdCBub2RlMiA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTsKICAgIGlmICh0aGlzLmRhdGEuaW5SZWZlcmVuY2UpIHsKICAgICAgY29uc3QgcmVmZXJlbmNlVHlwZSA9IHRoaXMuZGF0YS5yZWZlcmVuY2VUeXBlIHx8ICJzaG9ydGN1dCI7CiAgICAgIG5vZGUyLnR5cGUgKz0gIlJlZmVyZW5jZSI7CiAgICAgIG5vZGUyLnJlZmVyZW5jZVR5cGUgPSByZWZlcmVuY2VUeXBlOwogICAgICBkZWxldGUgbm9kZTIudXJsOwogICAgICBkZWxldGUgbm9kZTIudGl0bGU7CiAgICB9IGVsc2UgewogICAgICBkZWxldGUgbm9kZTIuaWRlbnRpZmllcjsKICAgICAgZGVsZXRlIG5vZGUyLmxhYmVsOwogICAgfQogICAgdGhpcy5kYXRhLnJlZmVyZW5jZVR5cGUgPSB2b2lkIDA7CiAgfQogIF9fbmFtZShvbmV4aXRsaW5rLCAib25leGl0bGluayIpOwogIGZ1bmN0aW9uIG9uZXhpdGltYWdlKCkgewogICAgY29uc3Qgbm9kZTIgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgICBpZiAodGhpcy5kYXRhLmluUmVmZXJlbmNlKSB7CiAgICAgIGNvbnN0IHJlZmVyZW5jZVR5cGUgPSB0aGlzLmRhdGEucmVmZXJlbmNlVHlwZSB8fCAic2hvcnRjdXQiOwogICAgICBub2RlMi50eXBlICs9ICJSZWZlcmVuY2UiOwogICAgICBub2RlMi5yZWZlcmVuY2VUeXBlID0gcmVmZXJlbmNlVHlwZTsKICAgICAgZGVsZXRlIG5vZGUyLnVybDsKICAgICAgZGVsZXRlIG5vZGUyLnRpdGxlOwogICAgfSBlbHNlIHsKICAgICAgZGVsZXRlIG5vZGUyLmlkZW50aWZpZXI7CiAgICAgIGRlbGV0ZSBub2RlMi5sYWJlbDsKICAgIH0KICAgIHRoaXMuZGF0YS5yZWZlcmVuY2VUeXBlID0gdm9pZCAwOwogIH0KICBfX25hbWUob25leGl0aW1hZ2UsICJvbmV4aXRpbWFnZSIpOwogIGZ1bmN0aW9uIG9uZXhpdGxhYmVsdGV4dCh0b2tlbikgewogICAgY29uc3Qgc3RyaW5nMyA9IHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pOwogICAgY29uc3QgYW5jZXN0b3IgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMl07CiAgICBhbmNlc3Rvci5sYWJlbCA9IGRlY29kZVN0cmluZyhzdHJpbmczKTsKICAgIGFuY2VzdG9yLmlkZW50aWZpZXIgPSBub3JtYWxpemVJZGVudGlmaWVyKHN0cmluZzMpLnRvTG93ZXJDYXNlKCk7CiAgfQogIF9fbmFtZShvbmV4aXRsYWJlbHRleHQsICJvbmV4aXRsYWJlbHRleHQiKTsKICBmdW5jdGlvbiBvbmV4aXRsYWJlbCgpIHsKICAgIGNvbnN0IGZyYWdtZW50ID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogICAgY29uc3QgdmFsdWUyID0gdGhpcy5yZXN1bWUoKTsKICAgIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogICAgdGhpcy5kYXRhLmluUmVmZXJlbmNlID0gdHJ1ZTsKICAgIGlmIChub2RlMi50eXBlID09PSAibGluayIpIHsKICAgICAgY29uc3QgY2hpbGRyZW4yID0gZnJhZ21lbnQuY2hpbGRyZW47CiAgICAgIG5vZGUyLmNoaWxkcmVuID0gY2hpbGRyZW4yOwogICAgfSBlbHNlIHsKICAgICAgbm9kZTIuYWx0ID0gdmFsdWUyOwogICAgfQogIH0KICBfX25hbWUob25leGl0bGFiZWwsICJvbmV4aXRsYWJlbCIpOwogIGZ1bmN0aW9uIG9uZXhpdHJlc291cmNlZGVzdGluYXRpb25zdHJpbmcoKSB7CiAgICBjb25zdCBkYXRhMiA9IHRoaXMucmVzdW1lKCk7CiAgICBjb25zdCBub2RlMiA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTsKICAgIG5vZGUyLnVybCA9IGRhdGEyOwogIH0KICBfX25hbWUob25leGl0cmVzb3VyY2VkZXN0aW5hdGlvbnN0cmluZywgIm9uZXhpdHJlc291cmNlZGVzdGluYXRpb25zdHJpbmciKTsKICBmdW5jdGlvbiBvbmV4aXRyZXNvdXJjZXRpdGxlc3RyaW5nKCkgewogICAgY29uc3QgZGF0YTIgPSB0aGlzLnJlc3VtZSgpOwogICAgY29uc3Qgbm9kZTIgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgICBub2RlMi50aXRsZSA9IGRhdGEyOwogIH0KICBfX25hbWUob25leGl0cmVzb3VyY2V0aXRsZXN0cmluZywgIm9uZXhpdHJlc291cmNldGl0bGVzdHJpbmciKTsKICBmdW5jdGlvbiBvbmV4aXRyZXNvdXJjZSgpIHsKICAgIHRoaXMuZGF0YS5pblJlZmVyZW5jZSA9IHZvaWQgMDsKICB9CiAgX19uYW1lKG9uZXhpdHJlc291cmNlLCAib25leGl0cmVzb3VyY2UiKTsKICBmdW5jdGlvbiBvbmVudGVycmVmZXJlbmNlKCkgewogICAgdGhpcy5kYXRhLnJlZmVyZW5jZVR5cGUgPSAiY29sbGFwc2VkIjsKICB9CiAgX19uYW1lKG9uZW50ZXJyZWZlcmVuY2UsICJvbmVudGVycmVmZXJlbmNlIik7CiAgZnVuY3Rpb24gb25leGl0cmVmZXJlbmNlc3RyaW5nKHRva2VuKSB7CiAgICBjb25zdCBsYWJlbCA9IHRoaXMucmVzdW1lKCk7CiAgICBjb25zdCBub2RlMiA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTsKICAgIG5vZGUyLmxhYmVsID0gbGFiZWw7CiAgICBub2RlMi5pZGVudGlmaWVyID0gbm9ybWFsaXplSWRlbnRpZmllcih0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKSkudG9Mb3dlckNhc2UoKTsKICAgIHRoaXMuZGF0YS5yZWZlcmVuY2VUeXBlID0gImZ1bGwiOwogIH0KICBfX25hbWUob25leGl0cmVmZXJlbmNlc3RyaW5nLCAib25leGl0cmVmZXJlbmNlc3RyaW5nIik7CiAgZnVuY3Rpb24gb25leGl0Y2hhcmFjdGVycmVmZXJlbmNlbWFya2VyKHRva2VuKSB7CiAgICB0aGlzLmRhdGEuY2hhcmFjdGVyUmVmZXJlbmNlVHlwZSA9IHRva2VuLnR5cGU7CiAgfQogIF9fbmFtZShvbmV4aXRjaGFyYWN0ZXJyZWZlcmVuY2VtYXJrZXIsICJvbmV4aXRjaGFyYWN0ZXJyZWZlcmVuY2VtYXJrZXIiKTsKICBmdW5jdGlvbiBvbmV4aXRjaGFyYWN0ZXJyZWZlcmVuY2V2YWx1ZSh0b2tlbikgewogICAgY29uc3QgZGF0YTIgPSB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKTsKICAgIGNvbnN0IHR5cGU1ID0gdGhpcy5kYXRhLmNoYXJhY3RlclJlZmVyZW5jZVR5cGU7CiAgICBsZXQgdmFsdWUyOwogICAgaWYgKHR5cGU1KSB7CiAgICAgIHZhbHVlMiA9IGRlY29kZU51bWVyaWNDaGFyYWN0ZXJSZWZlcmVuY2UoZGF0YTIsIHR5cGU1ID09PSAiY2hhcmFjdGVyUmVmZXJlbmNlTWFya2VyTnVtZXJpYyIgPyAxMCA6IDE2KTsKICAgICAgdGhpcy5kYXRhLmNoYXJhY3RlclJlZmVyZW5jZVR5cGUgPSB2b2lkIDA7CiAgICB9IGVsc2UgewogICAgICBjb25zdCByZXN1bHQgPSBkZWNvZGVOYW1lZENoYXJhY3RlclJlZmVyZW5jZShkYXRhMik7CiAgICAgIHZhbHVlMiA9IHJlc3VsdDsKICAgIH0KICAgIGNvbnN0IHRhaWwgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgICB0YWlsLnZhbHVlICs9IHZhbHVlMjsKICB9CiAgX19uYW1lKG9uZXhpdGNoYXJhY3RlcnJlZmVyZW5jZXZhbHVlLCAib25leGl0Y2hhcmFjdGVycmVmZXJlbmNldmFsdWUiKTsKICBmdW5jdGlvbiBvbmV4aXRjaGFyYWN0ZXJyZWZlcmVuY2UodG9rZW4pIHsKICAgIGNvbnN0IHRhaWwgPSB0aGlzLnN0YWNrLnBvcCgpOwogICAgdGFpbC5wb3NpdGlvbi5lbmQgPSBwb2ludDIodG9rZW4uZW5kKTsKICB9CiAgX19uYW1lKG9uZXhpdGNoYXJhY3RlcnJlZmVyZW5jZSwgIm9uZXhpdGNoYXJhY3RlcnJlZmVyZW5jZSIpOwogIGZ1bmN0aW9uIG9uZXhpdGF1dG9saW5rcHJvdG9jb2wodG9rZW4pIHsKICAgIG9uZXhpdGRhdGEuY2FsbCh0aGlzLCB0b2tlbik7CiAgICBjb25zdCBub2RlMiA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTsKICAgIG5vZGUyLnVybCA9IHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pOwogIH0KICBfX25hbWUob25leGl0YXV0b2xpbmtwcm90b2NvbCwgIm9uZXhpdGF1dG9saW5rcHJvdG9jb2wiKTsKICBmdW5jdGlvbiBvbmV4aXRhdXRvbGlua2VtYWlsKHRva2VuKSB7CiAgICBvbmV4aXRkYXRhLmNhbGwodGhpcywgdG9rZW4pOwogICAgY29uc3Qgbm9kZTIgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgICBub2RlMi51cmwgPSAibWFpbHRvOiIgKyB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKTsKICB9CiAgX19uYW1lKG9uZXhpdGF1dG9saW5rZW1haWwsICJvbmV4aXRhdXRvbGlua2VtYWlsIik7CiAgZnVuY3Rpb24gYmxvY2tRdW90ZTIoKSB7CiAgICByZXR1cm4gewogICAgICB0eXBlOiAiYmxvY2txdW90ZSIsCiAgICAgIGNoaWxkcmVuOiBbXQogICAgfTsKICB9CiAgX19uYW1lKGJsb2NrUXVvdGUyLCAiYmxvY2tRdW90ZSIpOwogIGZ1bmN0aW9uIGNvZGVGbG93KCkgewogICAgcmV0dXJuIHsKICAgICAgdHlwZTogImNvZGUiLAogICAgICBsYW5nOiBudWxsLAogICAgICBtZXRhOiBudWxsLAogICAgICB2YWx1ZTogIiIKICAgIH07CiAgfQogIF9fbmFtZShjb2RlRmxvdywgImNvZGVGbG93Iik7CiAgZnVuY3Rpb24gY29kZVRleHQyKCkgewogICAgcmV0dXJuIHsKICAgICAgdHlwZTogImlubGluZUNvZGUiLAogICAgICB2YWx1ZTogIiIKICAgIH07CiAgfQogIF9fbmFtZShjb2RlVGV4dDIsICJjb2RlVGV4dCIpOwogIGZ1bmN0aW9uIGRlZmluaXRpb24zKCkgewogICAgcmV0dXJuIHsKICAgICAgdHlwZTogImRlZmluaXRpb24iLAogICAgICBpZGVudGlmaWVyOiAiIiwKICAgICAgbGFiZWw6IG51bGwsCiAgICAgIHRpdGxlOiBudWxsLAogICAgICB1cmw6ICIiCiAgICB9OwogIH0KICBfX25hbWUoZGVmaW5pdGlvbjMsICJkZWZpbml0aW9uIik7CiAgZnVuY3Rpb24gZW1waGFzaXMzKCkgewogICAgcmV0dXJuIHsKICAgICAgdHlwZTogImVtcGhhc2lzIiwKICAgICAgY2hpbGRyZW46IFtdCiAgICB9OwogIH0KICBfX25hbWUoZW1waGFzaXMzLCAiZW1waGFzaXMiKTsKICBmdW5jdGlvbiBoZWFkaW5nMygpIHsKICAgIHJldHVybiB7CiAgICAgIHR5cGU6ICJoZWFkaW5nIiwKICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBgZGVwdGhgIHdpbGwgYmUgc2V0IGxhdGVyLgogICAgICBkZXB0aDogMCwKICAgICAgY2hpbGRyZW46IFtdCiAgICB9OwogIH0KICBfX25hbWUoaGVhZGluZzMsICJoZWFkaW5nIik7CiAgZnVuY3Rpb24gaGFyZEJyZWFrMygpIHsKICAgIHJldHVybiB7CiAgICAgIHR5cGU6ICJicmVhayIKICAgIH07CiAgfQogIF9fbmFtZShoYXJkQnJlYWszLCAiaGFyZEJyZWFrIik7CiAgZnVuY3Rpb24gaHRtbDcoKSB7CiAgICByZXR1cm4gewogICAgICB0eXBlOiAiaHRtbCIsCiAgICAgIHZhbHVlOiAiIgogICAgfTsKICB9CiAgX19uYW1lKGh0bWw3LCAiaHRtbCIpOwogIGZ1bmN0aW9uIGltYWdlMygpIHsKICAgIHJldHVybiB7CiAgICAgIHR5cGU6ICJpbWFnZSIsCiAgICAgIHRpdGxlOiBudWxsLAogICAgICB1cmw6ICIiLAogICAgICBhbHQ6IG51bGwKICAgIH07CiAgfQogIF9fbmFtZShpbWFnZTMsICJpbWFnZSIpOwogIGZ1bmN0aW9uIGxpbmszKCkgewogICAgcmV0dXJuIHsKICAgICAgdHlwZTogImxpbmsiLAogICAgICB0aXRsZTogbnVsbCwKICAgICAgdXJsOiAiIiwKICAgICAgY2hpbGRyZW46IFtdCiAgICB9OwogIH0KICBfX25hbWUobGluazMsICJsaW5rIik7CiAgZnVuY3Rpb24gbGlzdDUodG9rZW4pIHsKICAgIHJldHVybiB7CiAgICAgIHR5cGU6ICJsaXN0IiwKICAgICAgb3JkZXJlZDogdG9rZW4udHlwZSA9PT0gImxpc3RPcmRlcmVkIiwKICAgICAgc3RhcnQ6IG51bGwsCiAgICAgIHNwcmVhZDogdG9rZW4uX3NwcmVhZCwKICAgICAgY2hpbGRyZW46IFtdCiAgICB9OwogIH0KICBfX25hbWUobGlzdDUsICJsaXN0Iik7CiAgZnVuY3Rpb24gbGlzdEl0ZW0zKHRva2VuKSB7CiAgICByZXR1cm4gewogICAgICB0eXBlOiAibGlzdEl0ZW0iLAogICAgICBzcHJlYWQ6IHRva2VuLl9zcHJlYWQsCiAgICAgIGNoZWNrZWQ6IG51bGwsCiAgICAgIGNoaWxkcmVuOiBbXQogICAgfTsKICB9CiAgX19uYW1lKGxpc3RJdGVtMywgImxpc3RJdGVtIik7CiAgZnVuY3Rpb24gcGFyYWdyYXBoMygpIHsKICAgIHJldHVybiB7CiAgICAgIHR5cGU6ICJwYXJhZ3JhcGgiLAogICAgICBjaGlsZHJlbjogW10KICAgIH07CiAgfQogIF9fbmFtZShwYXJhZ3JhcGgzLCAicGFyYWdyYXBoIik7CiAgZnVuY3Rpb24gc3Ryb25nMygpIHsKICAgIHJldHVybiB7CiAgICAgIHR5cGU6ICJzdHJvbmciLAogICAgICBjaGlsZHJlbjogW10KICAgIH07CiAgfQogIF9fbmFtZShzdHJvbmczLCAic3Ryb25nIik7CiAgZnVuY3Rpb24gdGV4dDgoKSB7CiAgICByZXR1cm4gewogICAgICB0eXBlOiAidGV4dCIsCiAgICAgIHZhbHVlOiAiIgogICAgfTsKICB9CiAgX19uYW1lKHRleHQ4LCAidGV4dCIpOwogIGZ1bmN0aW9uIHRoZW1hdGljQnJlYWs0KCkgewogICAgcmV0dXJuIHsKICAgICAgdHlwZTogInRoZW1hdGljQnJlYWsiCiAgICB9OwogIH0KICBfX25hbWUodGhlbWF0aWNCcmVhazQsICJ0aGVtYXRpY0JyZWFrIik7Cn0KX19uYW1lKGNvbXBpbGVyLCAiY29tcGlsZXIiKTsKZnVuY3Rpb24gcG9pbnQyKGQ0KSB7CiAgcmV0dXJuIHsKICAgIGxpbmU6IGQ0LmxpbmUsCiAgICBjb2x1bW46IGQ0LmNvbHVtbiwKICAgIG9mZnNldDogZDQub2Zmc2V0CiAgfTsKfQpfX25hbWUocG9pbnQyLCAicG9pbnQiKTsKZnVuY3Rpb24gY29uZmlndXJlMihjb21iaW5lZCwgZXh0ZW5zaW9ucykgewogIGxldCBpbmRleDIgPSAtMTsKICB3aGlsZSAoKytpbmRleDIgPCBleHRlbnNpb25zLmxlbmd0aCkgewogICAgY29uc3QgdmFsdWUyID0gZXh0ZW5zaW9uc1tpbmRleDJdOwogICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUyKSkgewogICAgICBjb25maWd1cmUyKGNvbWJpbmVkLCB2YWx1ZTIpOwogICAgfSBlbHNlIHsKICAgICAgZXh0ZW5zaW9uKGNvbWJpbmVkLCB2YWx1ZTIpOwogICAgfQogIH0KfQpfX25hbWUoY29uZmlndXJlMiwgImNvbmZpZ3VyZSIpOwpmdW5jdGlvbiBleHRlbnNpb24oY29tYmluZWQsIGV4dGVuc2lvbjIpIHsKICBsZXQga2V5MjsKICBmb3IgKGtleTIgaW4gZXh0ZW5zaW9uMikgewogICAgaWYgKG93bjUuY2FsbChleHRlbnNpb24yLCBrZXkyKSkgewogICAgICBzd2l0Y2ggKGtleTIpIHsKICAgICAgICBjYXNlICJjYW5Db250YWluRW9scyI6IHsKICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gZXh0ZW5zaW9uMltrZXkyXTsKICAgICAgICAgIGlmIChyaWdodCkgewogICAgICAgICAgICBjb21iaW5lZFtrZXkyXS5wdXNoKC4uLnJpZ2h0KTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjYXNlICJ0cmFuc2Zvcm1zIjogewogICAgICAgICAgY29uc3QgcmlnaHQgPSBleHRlbnNpb24yW2tleTJdOwogICAgICAgICAgaWYgKHJpZ2h0KSB7CiAgICAgICAgICAgIGNvbWJpbmVkW2tleTJdLnB1c2goLi4ucmlnaHQpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNhc2UgImVudGVyIjoKICAgICAgICBjYXNlICJleGl0IjogewogICAgICAgICAgY29uc3QgcmlnaHQgPSBleHRlbnNpb24yW2tleTJdOwogICAgICAgICAgaWYgKHJpZ2h0KSB7CiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY29tYmluZWRba2V5Ml0sIHJpZ2h0KTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQpfX25hbWUoZXh0ZW5zaW9uLCAiZXh0ZW5zaW9uIik7CmZ1bmN0aW9uIGRlZmF1bHRPbkVycm9yKGxlZnQsIHJpZ2h0KSB7CiAgaWYgKGxlZnQpIHsKICAgIHRocm93IG5ldyBFcnJvcigiQ2Fubm90IGNsb3NlIGAiICsgbGVmdC50eXBlICsgImAgKCIgKyBzdHJpbmdpZnlQb3NpdGlvbih7CiAgICAgIHN0YXJ0OiBsZWZ0LnN0YXJ0LAogICAgICBlbmQ6IGxlZnQuZW5kCiAgICB9KSArICIpOiBhIGRpZmZlcmVudCB0b2tlbiAoYCIgKyByaWdodC50eXBlICsgImAsICIgKyBzdHJpbmdpZnlQb3NpdGlvbih7CiAgICAgIHN0YXJ0OiByaWdodC5zdGFydCwKICAgICAgZW5kOiByaWdodC5lbmQKICAgIH0pICsgIikgaXMgb3BlbiIpOwogIH0gZWxzZSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBjbG9zZSBkb2N1bWVudCwgYSB0b2tlbiAoYCIgKyByaWdodC50eXBlICsgImAsICIgKyBzdHJpbmdpZnlQb3NpdGlvbih7CiAgICAgIHN0YXJ0OiByaWdodC5zdGFydCwKICAgICAgZW5kOiByaWdodC5lbmQKICAgIH0pICsgIikgaXMgc3RpbGwgb3BlbiIpOwogIH0KfQpfX25hbWUoZGVmYXVsdE9uRXJyb3IsICJkZWZhdWx0T25FcnJvciIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3JlbWFyay1wYXJzZUAxMS4wLjAvbm9kZV9tb2R1bGVzL3JlbWFyay1wYXJzZS9saWIvaW5kZXguanMKZnVuY3Rpb24gcmVtYXJrUGFyc2Uob3B0aW9ucykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICBzZWxmMi5wYXJzZXIgPSBwYXJzZXI7CiAgZnVuY3Rpb24gcGFyc2VyKGRvYykgewogICAgcmV0dXJuIGZyb21NYXJrZG93bihkb2MsIHsKICAgICAgLi4uc2VsZjIuZGF0YSgic2V0dGluZ3MiKSwKICAgICAgLi4ub3B0aW9ucywKICAgICAgLy8gTm90ZTogdGhlc2Ugb3B0aW9ucyBhcmUgbm90IGluIHRoZSByZWFkbWUuCiAgICAgIC8vIFRoZSBnb2FsIGlzIGZvciB0aGVtIHRvIGJlIHNldCBieSBwbHVnaW5zIG9uIGBkYXRhYCBpbnN0ZWFkIG9mIGJlaW5nCiAgICAgIC8vIHBhc3NlZCBieSB1c2Vycy4KICAgICAgZXh0ZW5zaW9uczogc2VsZjIuZGF0YSgibWljcm9tYXJrRXh0ZW5zaW9ucyIpIHx8IFtdLAogICAgICBtZGFzdEV4dGVuc2lvbnM6IHNlbGYyLmRhdGEoImZyb21NYXJrZG93bkV4dGVuc2lvbnMiKSB8fCBbXQogICAgfSk7CiAgfQogIF9fbmFtZShwYXJzZXIsICJwYXJzZXIiKTsKfQpfX25hbWUocmVtYXJrUGFyc2UsICJyZW1hcmtQYXJzZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZhdWx0QDIuMC4xL25vZGVfbW9kdWxlcy9mYXVsdC9pbmRleC5qcwp2YXIgaW1wb3J0X2Zvcm1hdDIgPSBfX3RvRVNNKHJlcXVpcmVfZm9ybWF0KCksIDEpOwp2YXIgZmF1bHQgPSBPYmplY3QuYXNzaWduKGNyZWF0ZTUoRXJyb3IpLCB7CiAgZXZhbDogY3JlYXRlNShFdmFsRXJyb3IpLAogIHJhbmdlOiBjcmVhdGU1KFJhbmdlRXJyb3IpLAogIHJlZmVyZW5jZTogY3JlYXRlNShSZWZlcmVuY2VFcnJvciksCiAgc3ludGF4OiBjcmVhdGU1KFN5bnRheEVycm9yKSwKICB0eXBlOiBjcmVhdGU1KFR5cGVFcnJvciksCiAgdXJpOiBjcmVhdGU1KFVSSUVycm9yKQp9KTsKZnVuY3Rpb24gY3JlYXRlNShDb25zdHJ1Y3RvcikgewogIEZvcm1hdHRlZEVycm9yLmRpc3BsYXlOYW1lID0gQ29uc3RydWN0b3IuZGlzcGxheU5hbWUgfHwgQ29uc3RydWN0b3IubmFtZTsKICByZXR1cm4gRm9ybWF0dGVkRXJyb3I7CiAgZnVuY3Rpb24gRm9ybWF0dGVkRXJyb3IoZm9ybWF0MiwgLi4udmFsdWVzKSB7CiAgICBjb25zdCByZWFzb24gPSBmb3JtYXQyID8gKDAsIGltcG9ydF9mb3JtYXQyLmRlZmF1bHQpKGZvcm1hdDIsIC4uLnZhbHVlcykgOiBmb3JtYXQyOwogICAgcmV0dXJuIG5ldyBDb25zdHJ1Y3RvcihyZWFzb24pOwogIH0KICBfX25hbWUoRm9ybWF0dGVkRXJyb3IsICJGb3JtYXR0ZWRFcnJvciIpOwp9Cl9fbmFtZShjcmVhdGU1LCAiY3JlYXRlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1mcm9udG1hdHRlckAyLjAuMC9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1mcm9udG1hdHRlci9saWIvdG8tbWF0dGVycy5qcwp2YXIgb3duNiA9IHt9Lmhhc093blByb3BlcnR5Owp2YXIgbWFya2VycyA9IHsKICB5YW1sOiAiLSIsCiAgdG9tbDogIisiCn07CmZ1bmN0aW9uIHRvTWF0dGVycyhvcHRpb25zKSB7CiAgY29uc3QgcmVzdWx0ID0gW107CiAgbGV0IGluZGV4MiA9IC0xOwogIGNvbnN0IHByZXNldHNPck1hdHRlcnMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMpID8gb3B0aW9ucyA6IG9wdGlvbnMgPyBbb3B0aW9uc10gOiBbInlhbWwiXTsKICB3aGlsZSAoKytpbmRleDIgPCBwcmVzZXRzT3JNYXR0ZXJzLmxlbmd0aCkgewogICAgcmVzdWx0W2luZGV4Ml0gPSBtYXR0ZXIocHJlc2V0c09yTWF0dGVyc1tpbmRleDJdKTsKICB9CiAgcmV0dXJuIHJlc3VsdDsKfQpfX25hbWUodG9NYXR0ZXJzLCAidG9NYXR0ZXJzIik7CmZ1bmN0aW9uIG1hdHRlcihvcHRpb24yKSB7CiAgbGV0IHJlc3VsdCA9IG9wdGlvbjI7CiAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICJzdHJpbmciKSB7CiAgICBpZiAoIW93bjYuY2FsbChtYXJrZXJzLCByZXN1bHQpKSB7CiAgICAgIHRocm93IGZhdWx0KCJNaXNzaW5nIG1hdHRlciBkZWZpbml0aW9uIGZvciBgJXNgIiwgcmVzdWx0KTsKICAgIH0KICAgIHJlc3VsdCA9IHsKICAgICAgdHlwZTogcmVzdWx0LAogICAgICBtYXJrZXI6IG1hcmtlcnNbcmVzdWx0XQogICAgfTsKICB9IGVsc2UgaWYgKHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB7CiAgICB0aHJvdyBmYXVsdCgiRXhwZWN0ZWQgbWF0dGVyIHRvIGJlIGFuIG9iamVjdCwgbm90IGAlamAiLCByZXN1bHQpOwogIH0KICBpZiAoIW93bjYuY2FsbChyZXN1bHQsICJ0eXBlIikpIHsKICAgIHRocm93IGZhdWx0KCJNaXNzaW5nIGB0eXBlYCBpbiBtYXR0ZXIgYCVqYCIsIHJlc3VsdCk7CiAgfQogIGlmICghb3duNi5jYWxsKHJlc3VsdCwgImZlbmNlIikgJiYgIW93bjYuY2FsbChyZXN1bHQsICJtYXJrZXIiKSkgewogICAgdGhyb3cgZmF1bHQoIk1pc3NpbmcgYG1hcmtlcmAgb3IgYGZlbmNlYCBpbiBtYXR0ZXIgYCVqYCIsIHJlc3VsdCk7CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KX19uYW1lKG1hdHRlciwgIm1hdHRlciIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1leHRlbnNpb24tZnJvbnRtYXR0ZXJAMi4wLjAvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZnJvbnRtYXR0ZXIvbGliL3N5bnRheC5qcwpmdW5jdGlvbiBmcm9udG1hdHRlcihvcHRpb25zKSB7CiAgY29uc3QgbWF0dGVycyA9IHRvTWF0dGVycyhvcHRpb25zKTsKICBjb25zdCBmbG93MyA9IHt9OwogIGxldCBpbmRleDIgPSAtMTsKICB3aGlsZSAoKytpbmRleDIgPCBtYXR0ZXJzLmxlbmd0aCkgewogICAgY29uc3QgbWF0dGVyMiA9IG1hdHRlcnNbaW5kZXgyXTsKICAgIGNvbnN0IGNvZGU0ID0gZmVuY2UobWF0dGVyMiwgIm9wZW4iKS5jaGFyQ29kZUF0KDApOwogICAgY29uc3QgY29uc3RydWN0ID0gY3JlYXRlQ29uc3RydWN0KG1hdHRlcjIpOwogICAgY29uc3QgZXhpc3RpbmcgPSBmbG93M1tjb2RlNF07CiAgICBpZiAoQXJyYXkuaXNBcnJheShleGlzdGluZykpIHsKICAgICAgZXhpc3RpbmcucHVzaChjb25zdHJ1Y3QpOwogICAgfSBlbHNlIHsKICAgICAgZmxvdzNbY29kZTRdID0gW2NvbnN0cnVjdF07CiAgICB9CiAgfQogIHJldHVybiB7CiAgICBmbG93OiBmbG93MwogIH07Cn0KX19uYW1lKGZyb250bWF0dGVyLCAiZnJvbnRtYXR0ZXIiKTsKZnVuY3Rpb24gY3JlYXRlQ29uc3RydWN0KG1hdHRlcjIpIHsKICBjb25zdCBhbnl3aGVyZSA9IG1hdHRlcjIuYW55d2hlcmU7CiAgY29uc3QgZnJvbnRtYXR0ZXJUeXBlID0gKAogICAgLyoqIEB0eXBlIHtUb2tlblR5cGV9ICovCiAgICBtYXR0ZXIyLnR5cGUKICApOwogIGNvbnN0IGZlbmNlVHlwZSA9ICgKICAgIC8qKiBAdHlwZSB7VG9rZW5UeXBlfSAqLwogICAgZnJvbnRtYXR0ZXJUeXBlICsgIkZlbmNlIgogICk7CiAgY29uc3Qgc2VxdWVuY2VUeXBlID0gKAogICAgLyoqIEB0eXBlIHtUb2tlblR5cGV9ICovCiAgICBmZW5jZVR5cGUgKyAiU2VxdWVuY2UiCiAgKTsKICBjb25zdCB2YWx1ZVR5cGUgPSAoCiAgICAvKiogQHR5cGUge1Rva2VuVHlwZX0gKi8KICAgIGZyb250bWF0dGVyVHlwZSArICJWYWx1ZSIKICApOwogIGNvbnN0IGNsb3NpbmdGZW5jZUNvbnN0cnVjdCA9IHsKICAgIHRva2VuaXplOiB0b2tlbml6ZUNsb3NpbmdGZW5jZSwKICAgIHBhcnRpYWw6IHRydWUKICB9OwogIGxldCBidWZmZXIyOwogIGxldCBidWZmZXJJbmRleCA9IDA7CiAgcmV0dXJuIHsKICAgIHRva2VuaXplOiB0b2tlbml6ZUZyb250bWF0dGVyLAogICAgY29uY3JldGU6IHRydWUKICB9OwogIGZ1bmN0aW9uIHRva2VuaXplRnJvbnRtYXR0ZXIoZWZmZWN0cywgb2szLCBub2spIHsKICAgIGNvbnN0IHNlbGYyID0gdGhpczsKICAgIHJldHVybiBzdGFydDsKICAgIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICAgIGNvbnN0IHBvc2l0aW9uMyA9IHNlbGYyLm5vdygpOwogICAgICBpZiAoCiAgICAgICAgLy8gSW5kZW50IG5vdCBhbGxvd2VkLgogICAgICAgIHBvc2l0aW9uMy5jb2x1bW4gPT09IDEgJiYgLy8gTm9ybWFsbHksIG9ubHkgYWxsb3dlZCBpbiBmaXJzdCBsaW5lLgogICAgICAgIChwb3NpdGlvbjMubGluZSA9PT0gMSB8fCBhbnl3aGVyZSkKICAgICAgKSB7CiAgICAgICAgYnVmZmVyMiA9IGZlbmNlKG1hdHRlcjIsICJvcGVuIik7CiAgICAgICAgYnVmZmVySW5kZXggPSAwOwogICAgICAgIGlmIChjb2RlNCA9PT0gYnVmZmVyMi5jaGFyQ29kZUF0KGJ1ZmZlckluZGV4KSkgewogICAgICAgICAgZWZmZWN0cy5lbnRlcihmcm9udG1hdHRlclR5cGUpOwogICAgICAgICAgZWZmZWN0cy5lbnRlcihmZW5jZVR5cGUpOwogICAgICAgICAgZWZmZWN0cy5lbnRlcihzZXF1ZW5jZVR5cGUpOwogICAgICAgICAgcmV0dXJuIG9wZW5TZXF1ZW5jZShjb2RlNCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgX19uYW1lKHN0YXJ0LCAic3RhcnQiKTsKICAgIGZ1bmN0aW9uIG9wZW5TZXF1ZW5jZShjb2RlNCkgewogICAgICBpZiAoYnVmZmVySW5kZXggPT09IGJ1ZmZlcjIubGVuZ3RoKSB7CiAgICAgICAgZWZmZWN0cy5leGl0KHNlcXVlbmNlVHlwZSk7CiAgICAgICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZTQpKSB7CiAgICAgICAgICBlZmZlY3RzLmVudGVyKCJ3aGl0ZXNwYWNlIik7CiAgICAgICAgICByZXR1cm4gb3BlblNlcXVlbmNlV2hpdGVzcGFjZShjb2RlNCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBvcGVuQWZ0ZXIoY29kZTQpOwogICAgICB9CiAgICAgIGlmIChjb2RlNCA9PT0gYnVmZmVyMi5jaGFyQ29kZUF0KGJ1ZmZlckluZGV4KyspKSB7CiAgICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgICByZXR1cm4gb3BlblNlcXVlbmNlOwogICAgICB9CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgX19uYW1lKG9wZW5TZXF1ZW5jZSwgIm9wZW5TZXF1ZW5jZSIpOwogICAgZnVuY3Rpb24gb3BlblNlcXVlbmNlV2hpdGVzcGFjZShjb2RlNCkgewogICAgICBpZiAobWFya2Rvd25TcGFjZShjb2RlNCkpIHsKICAgICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICAgIHJldHVybiBvcGVuU2VxdWVuY2VXaGl0ZXNwYWNlOwogICAgICB9CiAgICAgIGVmZmVjdHMuZXhpdCgid2hpdGVzcGFjZSIpOwogICAgICByZXR1cm4gb3BlbkFmdGVyKGNvZGU0KTsKICAgIH0KICAgIF9fbmFtZShvcGVuU2VxdWVuY2VXaGl0ZXNwYWNlLCAib3BlblNlcXVlbmNlV2hpdGVzcGFjZSIpOwogICAgZnVuY3Rpb24gb3BlbkFmdGVyKGNvZGU0KSB7CiAgICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgICAgZWZmZWN0cy5leGl0KGZlbmNlVHlwZSk7CiAgICAgICAgZWZmZWN0cy5lbnRlcigibGluZUVuZGluZyIpOwogICAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgICAgZWZmZWN0cy5leGl0KCJsaW5lRW5kaW5nIik7CiAgICAgICAgYnVmZmVyMiA9IGZlbmNlKG1hdHRlcjIsICJjbG9zZSIpOwogICAgICAgIGJ1ZmZlckluZGV4ID0gMDsKICAgICAgICByZXR1cm4gZWZmZWN0cy5hdHRlbXB0KGNsb3NpbmdGZW5jZUNvbnN0cnVjdCwgYWZ0ZXIsIGNvbnRlbnRTdGFydCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICBfX25hbWUob3BlbkFmdGVyLCAib3BlbkFmdGVyIik7CiAgICBmdW5jdGlvbiBjb250ZW50U3RhcnQoY29kZTQpIHsKICAgICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgICByZXR1cm4gY29udGVudEVuZChjb2RlNCk7CiAgICAgIH0KICAgICAgZWZmZWN0cy5lbnRlcih2YWx1ZVR5cGUpOwogICAgICByZXR1cm4gY29udGVudEluc2lkZShjb2RlNCk7CiAgICB9CiAgICBfX25hbWUoY29udGVudFN0YXJ0LCAiY29udGVudFN0YXJ0Iik7CiAgICBmdW5jdGlvbiBjb250ZW50SW5zaWRlKGNvZGU0KSB7CiAgICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgICAgZWZmZWN0cy5leGl0KHZhbHVlVHlwZSk7CiAgICAgICAgcmV0dXJuIGNvbnRlbnRFbmQoY29kZTQpOwogICAgICB9CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBjb250ZW50SW5zaWRlOwogICAgfQogICAgX19uYW1lKGNvbnRlbnRJbnNpZGUsICJjb250ZW50SW5zaWRlIik7CiAgICBmdW5jdGlvbiBjb250ZW50RW5kKGNvZGU0KSB7CiAgICAgIGlmIChjb2RlNCA9PT0gbnVsbCkgewogICAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgICB9CiAgICAgIGVmZmVjdHMuZW50ZXIoImxpbmVFbmRpbmciKTsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgZWZmZWN0cy5leGl0KCJsaW5lRW5kaW5nIik7CiAgICAgIHJldHVybiBlZmZlY3RzLmF0dGVtcHQoY2xvc2luZ0ZlbmNlQ29uc3RydWN0LCBhZnRlciwgY29udGVudFN0YXJ0KTsKICAgIH0KICAgIF9fbmFtZShjb250ZW50RW5kLCAiY29udGVudEVuZCIpOwogICAgZnVuY3Rpb24gYWZ0ZXIoY29kZTQpIHsKICAgICAgZWZmZWN0cy5leGl0KGZyb250bWF0dGVyVHlwZSk7CiAgICAgIHJldHVybiBvazMoY29kZTQpOwogICAgfQogICAgX19uYW1lKGFmdGVyLCAiYWZ0ZXIiKTsKICB9CiAgX19uYW1lKHRva2VuaXplRnJvbnRtYXR0ZXIsICJ0b2tlbml6ZUZyb250bWF0dGVyIik7CiAgZnVuY3Rpb24gdG9rZW5pemVDbG9zaW5nRmVuY2UoZWZmZWN0cywgb2szLCBub2spIHsKICAgIGxldCBidWZmZXJJbmRleDIgPSAwOwogICAgcmV0dXJuIGNsb3NlU3RhcnQ7CiAgICBmdW5jdGlvbiBjbG9zZVN0YXJ0KGNvZGU0KSB7CiAgICAgIGlmIChjb2RlNCA9PT0gYnVmZmVyMi5jaGFyQ29kZUF0KGJ1ZmZlckluZGV4MikpIHsKICAgICAgICBlZmZlY3RzLmVudGVyKGZlbmNlVHlwZSk7CiAgICAgICAgZWZmZWN0cy5lbnRlcihzZXF1ZW5jZVR5cGUpOwogICAgICAgIHJldHVybiBjbG9zZVNlcXVlbmNlKGNvZGU0KTsKICAgICAgfQogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIF9fbmFtZShjbG9zZVN0YXJ0LCAiY2xvc2VTdGFydCIpOwogICAgZnVuY3Rpb24gY2xvc2VTZXF1ZW5jZShjb2RlNCkgewogICAgICBpZiAoYnVmZmVySW5kZXgyID09PSBidWZmZXIyLmxlbmd0aCkgewogICAgICAgIGVmZmVjdHMuZXhpdChzZXF1ZW5jZVR5cGUpOwogICAgICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICAgICAgZWZmZWN0cy5lbnRlcigid2hpdGVzcGFjZSIpOwogICAgICAgICAgcmV0dXJuIGNsb3NlU2VxdWVuY2VXaGl0ZXNwYWNlKGNvZGU0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNsb3NlQWZ0ZXIoY29kZTQpOwogICAgICB9CiAgICAgIGlmIChjb2RlNCA9PT0gYnVmZmVyMi5jaGFyQ29kZUF0KGJ1ZmZlckluZGV4MisrKSkgewogICAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgICAgcmV0dXJuIGNsb3NlU2VxdWVuY2U7CiAgICAgIH0KICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICBfX25hbWUoY2xvc2VTZXF1ZW5jZSwgImNsb3NlU2VxdWVuY2UiKTsKICAgIGZ1bmN0aW9uIGNsb3NlU2VxdWVuY2VXaGl0ZXNwYWNlKGNvZGU0KSB7CiAgICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgICAgcmV0dXJuIGNsb3NlU2VxdWVuY2VXaGl0ZXNwYWNlOwogICAgICB9CiAgICAgIGVmZmVjdHMuZXhpdCgid2hpdGVzcGFjZSIpOwogICAgICByZXR1cm4gY2xvc2VBZnRlcihjb2RlNCk7CiAgICB9CiAgICBfX25hbWUoY2xvc2VTZXF1ZW5jZVdoaXRlc3BhY2UsICJjbG9zZVNlcXVlbmNlV2hpdGVzcGFjZSIpOwogICAgZnVuY3Rpb24gY2xvc2VBZnRlcihjb2RlNCkgewogICAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICAgIGVmZmVjdHMuZXhpdChmZW5jZVR5cGUpOwogICAgICAgIHJldHVybiBvazMoY29kZTQpOwogICAgICB9CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgX19uYW1lKGNsb3NlQWZ0ZXIsICJjbG9zZUFmdGVyIik7CiAgfQogIF9fbmFtZSh0b2tlbml6ZUNsb3NpbmdGZW5jZSwgInRva2VuaXplQ2xvc2luZ0ZlbmNlIik7Cn0KX19uYW1lKGNyZWF0ZUNvbnN0cnVjdCwgImNyZWF0ZUNvbnN0cnVjdCIpOwpmdW5jdGlvbiBmZW5jZShtYXR0ZXIyLCBwcm9wKSB7CiAgcmV0dXJuIG1hdHRlcjIubWFya2VyID8gcGljayhtYXR0ZXIyLm1hcmtlciwgcHJvcCkucmVwZWF0KDMpIDogKAogICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogVGhleeKAmXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4KICAgIHBpY2sobWF0dGVyMi5mZW5jZSwgcHJvcCkKICApOwp9Cl9fbmFtZShmZW5jZSwgImZlbmNlIik7CmZ1bmN0aW9uIHBpY2soc2NoZW1hLCBwcm9wKSB7CiAgcmV0dXJuIHR5cGVvZiBzY2hlbWEgPT09ICJzdHJpbmciID8gc2NoZW1hIDogc2NoZW1hW3Byb3BdOwp9Cl9fbmFtZShwaWNrLCAicGljayIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtZnJvbnRtYXR0ZXJAMi4wLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtZnJvbnRtYXR0ZXIvbGliL2luZGV4LmpzCmZ1bmN0aW9uIGZyb250bWF0dGVyRnJvbU1hcmtkb3duKG9wdGlvbnMpIHsKICBjb25zdCBtYXR0ZXJzID0gdG9NYXR0ZXJzKG9wdGlvbnMpOwogIGNvbnN0IGVudGVyID0ge307CiAgY29uc3QgZXhpdDMgPSB7fTsKICBsZXQgaW5kZXgyID0gLTE7CiAgd2hpbGUgKCsraW5kZXgyIDwgbWF0dGVycy5sZW5ndGgpIHsKICAgIGNvbnN0IG1hdHRlcjIgPSBtYXR0ZXJzW2luZGV4Ml07CiAgICBlbnRlclttYXR0ZXIyLnR5cGVdID0gb3BlbmVyKG1hdHRlcjIpOwogICAgZXhpdDNbbWF0dGVyMi50eXBlXSA9IGNsb3NlNjsKICAgIGV4aXQzW21hdHRlcjIudHlwZSArICJWYWx1ZSJdID0gdmFsdWU7CiAgfQogIHJldHVybiB7IGVudGVyLCBleGl0OiBleGl0MyB9Owp9Cl9fbmFtZShmcm9udG1hdHRlckZyb21NYXJrZG93biwgImZyb250bWF0dGVyRnJvbU1hcmtkb3duIik7CmZ1bmN0aW9uIG9wZW5lcihtYXR0ZXIyKSB7CiAgcmV0dXJuIG9wZW47CiAgZnVuY3Rpb24gb3Blbih0b2tlbikgewogICAgdGhpcy5lbnRlcih7IHR5cGU6IG1hdHRlcjIudHlwZSwgdmFsdWU6ICIiIH0sIHRva2VuKTsKICAgIHRoaXMuYnVmZmVyKCk7CiAgfQogIF9fbmFtZShvcGVuLCAib3BlbiIpOwp9Cl9fbmFtZShvcGVuZXIsICJvcGVuZXIiKTsKZnVuY3Rpb24gY2xvc2U2KHRva2VuKSB7CiAgY29uc3QgZGF0YSA9IHRoaXMucmVzdW1lKCk7CiAgY29uc3Qgbm9kZTIgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgb2soInZhbHVlIiBpbiBub2RlMik7CiAgdGhpcy5leGl0KHRva2VuKTsKICBub2RlMi52YWx1ZSA9IGRhdGEucmVwbGFjZSgvXihccj9cbnxccil8KFxyP1xufFxyKSQvZywgIiIpOwp9Cl9fbmFtZShjbG9zZTYsICJjbG9zZSIpOwpmdW5jdGlvbiB2YWx1ZSh0b2tlbikgewogIHRoaXMuY29uZmlnLmVudGVyLmRhdGEuY2FsbCh0aGlzLCB0b2tlbik7CiAgdGhpcy5jb25maWcuZXhpdC5kYXRhLmNhbGwodGhpcywgdG9rZW4pOwp9Cl9fbmFtZSh2YWx1ZSwgInZhbHVlIik7CmZ1bmN0aW9uIGZyb250bWF0dGVyVG9NYXJrZG93bihvcHRpb25zKSB7CiAgY29uc3QgdW5zYWZlMiA9IFtdOwogIGNvbnN0IGhhbmRsZXJzMiA9IHt9OwogIGNvbnN0IG1hdHRlcnMgPSB0b01hdHRlcnMob3B0aW9ucyk7CiAgbGV0IGluZGV4MiA9IC0xOwogIHdoaWxlICgrK2luZGV4MiA8IG1hdHRlcnMubGVuZ3RoKSB7CiAgICBjb25zdCBtYXR0ZXIyID0gbWF0dGVyc1tpbmRleDJdOwogICAgaGFuZGxlcnMyW21hdHRlcjIudHlwZV0gPSBoYW5kbGVyKG1hdHRlcjIpOwogICAgY29uc3Qgb3BlbiA9IGZlbmNlMihtYXR0ZXIyLCAib3BlbiIpOwogICAgdW5zYWZlMi5wdXNoKHsKICAgICAgYXRCcmVhazogdHJ1ZSwKICAgICAgY2hhcmFjdGVyOiBvcGVuLmNoYXJBdCgwKSwKICAgICAgYWZ0ZXI6IGVzY2FwZVN0cmluZ1JlZ2V4cChvcGVuLmNoYXJBdCgxKSkKICAgIH0pOwogIH0KICByZXR1cm4geyB1bnNhZmU6IHVuc2FmZTIsIGhhbmRsZXJzOiBoYW5kbGVyczIgfTsKfQpfX25hbWUoZnJvbnRtYXR0ZXJUb01hcmtkb3duLCAiZnJvbnRtYXR0ZXJUb01hcmtkb3duIik7CmZ1bmN0aW9uIGhhbmRsZXIobWF0dGVyMikgewogIGNvbnN0IG9wZW4gPSBmZW5jZTIobWF0dGVyMiwgIm9wZW4iKTsKICBjb25zdCBjbG9zZTcgPSBmZW5jZTIobWF0dGVyMiwgImNsb3NlIik7CiAgcmV0dXJuIGhhbmRsZTM7CiAgZnVuY3Rpb24gaGFuZGxlMyhub2RlMikgewogICAgcmV0dXJuIG9wZW4gKyAobm9kZTIudmFsdWUgPyAiXG4iICsgbm9kZTIudmFsdWUgOiAiIikgKyAiXG4iICsgY2xvc2U3OwogIH0KICBfX25hbWUoaGFuZGxlMywgImhhbmRsZSIpOwp9Cl9fbmFtZShoYW5kbGVyLCAiaGFuZGxlciIpOwpmdW5jdGlvbiBmZW5jZTIobWF0dGVyMiwgcHJvcCkgewogIHJldHVybiBtYXR0ZXIyLm1hcmtlciA/IHBpY2syKG1hdHRlcjIubWFya2VyLCBwcm9wKS5yZXBlYXQoMykgOiAoCiAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBUaGV54oCZcmUgbXV0dWFsbHkgZXhjbHVzaXZlLgogICAgcGljazIobWF0dGVyMi5mZW5jZSwgcHJvcCkKICApOwp9Cl9fbmFtZShmZW5jZTIsICJmZW5jZSIpOwpmdW5jdGlvbiBwaWNrMihzY2hlbWEsIHByb3ApIHsKICByZXR1cm4gdHlwZW9mIHNjaGVtYSA9PT0gInN0cmluZyIgPyBzY2hlbWEgOiBzY2hlbWFbcHJvcF07Cn0KX19uYW1lKHBpY2syLCAicGljayIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3JlbWFyay1mcm9udG1hdHRlckA1LjAuMC9ub2RlX21vZHVsZXMvcmVtYXJrLWZyb250bWF0dGVyL2xpYi9pbmRleC5qcwp2YXIgZW1wdHlPcHRpb25zNCA9ICJ5YW1sIjsKZnVuY3Rpb24gcmVtYXJrRnJvbnRtYXR0ZXIob3B0aW9ucykgewogIGNvbnN0IHNlbGYyID0gKAogICAgLyoqIEB0eXBlIHtQcm9jZXNzb3J9ICovCiAgICB0aGlzCiAgKTsKICBjb25zdCBzZXR0aW5ncyA9IG9wdGlvbnMgfHwgZW1wdHlPcHRpb25zNDsKICBjb25zdCBkYXRhID0gc2VsZjIuZGF0YSgpOwogIGNvbnN0IG1pY3JvbWFya0V4dGVuc2lvbnMgPSBkYXRhLm1pY3JvbWFya0V4dGVuc2lvbnMgfHwgKGRhdGEubWljcm9tYXJrRXh0ZW5zaW9ucyA9IFtdKTsKICBjb25zdCBmcm9tTWFya2Rvd25FeHRlbnNpb25zID0gZGF0YS5mcm9tTWFya2Rvd25FeHRlbnNpb25zIHx8IChkYXRhLmZyb21NYXJrZG93bkV4dGVuc2lvbnMgPSBbXSk7CiAgY29uc3QgdG9NYXJrZG93bkV4dGVuc2lvbnMgPSBkYXRhLnRvTWFya2Rvd25FeHRlbnNpb25zIHx8IChkYXRhLnRvTWFya2Rvd25FeHRlbnNpb25zID0gW10pOwogIG1pY3JvbWFya0V4dGVuc2lvbnMucHVzaChmcm9udG1hdHRlcihzZXR0aW5ncykpOwogIGZyb21NYXJrZG93bkV4dGVuc2lvbnMucHVzaChmcm9udG1hdHRlckZyb21NYXJrZG93bihzZXR0aW5ncykpOwogIHRvTWFya2Rvd25FeHRlbnNpb25zLnB1c2goZnJvbnRtYXR0ZXJUb01hcmtkb3duKHNldHRpbmdzKSk7Cn0KX19uYW1lKHJlbWFya0Zyb250bWF0dGVyLCAicmVtYXJrRnJvbnRtYXR0ZXIiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdW5nYXArc3RydWN0dXJlZC1jbG9uZUAxLjMuMC9ub2RlX21vZHVsZXMvQHVuZ2FwL3N0cnVjdHVyZWQtY2xvbmUvZXNtL3R5cGVzLmpzCnZhciBWT0lEID0gLTE7CnZhciBQUklNSVRJVkUgPSAwOwp2YXIgQVJSQVkgPSAxOwp2YXIgT0JKRUNUID0gMjsKdmFyIERBVEUgPSAzOwp2YXIgUkVHRVhQID0gNDsKdmFyIE1BUCA9IDU7CnZhciBTRVQgPSA2Owp2YXIgRVJST1IgPSA3Owp2YXIgQklHSU5UID0gODsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdW5nYXArc3RydWN0dXJlZC1jbG9uZUAxLjMuMC9ub2RlX21vZHVsZXMvQHVuZ2FwL3N0cnVjdHVyZWQtY2xvbmUvZXNtL2Rlc2VyaWFsaXplLmpzCnZhciBlbnYgPSB0eXBlb2Ygc2VsZiA9PT0gIm9iamVjdCIgPyBzZWxmIDogZ2xvYmFsVGhpczsKdmFyIGRlc2VyaWFsaXplciA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKCQzLCBfMykgPT4gewogIGNvbnN0IGFzID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgob3V0LCBpbmRleDIpID0+IHsKICAgICQzLnNldChpbmRleDIsIG91dCk7CiAgICByZXR1cm4gb3V0OwogIH0sICJhcyIpOwogIGNvbnN0IHVucGFpciA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGluZGV4MikgPT4gewogICAgaWYgKCQzLmhhcyhpbmRleDIpKQogICAgICByZXR1cm4gJDMuZ2V0KGluZGV4Mik7CiAgICBjb25zdCBbdHlwZTUsIHZhbHVlMl0gPSBfM1tpbmRleDJdOwogICAgc3dpdGNoICh0eXBlNSkgewogICAgICBjYXNlIFBSSU1JVElWRToKICAgICAgY2FzZSBWT0lEOgogICAgICAgIHJldHVybiBhcyh2YWx1ZTIsIGluZGV4Mik7CiAgICAgIGNhc2UgQVJSQVk6IHsKICAgICAgICBjb25zdCBhcnIgPSBhcyhbXSwgaW5kZXgyKTsKICAgICAgICBmb3IgKGNvbnN0IGluZGV4MyBvZiB2YWx1ZTIpCiAgICAgICAgICBhcnIucHVzaCh1bnBhaXIoaW5kZXgzKSk7CiAgICAgICAgcmV0dXJuIGFycjsKICAgICAgfQogICAgICBjYXNlIE9CSkVDVDogewogICAgICAgIGNvbnN0IG9iamVjdCA9IGFzKHt9LCBpbmRleDIpOwogICAgICAgIGZvciAoY29uc3QgW2tleTIsIGluZGV4M10gb2YgdmFsdWUyKQogICAgICAgICAgb2JqZWN0W3VucGFpcihrZXkyKV0gPSB1bnBhaXIoaW5kZXgzKTsKICAgICAgICByZXR1cm4gb2JqZWN0OwogICAgICB9CiAgICAgIGNhc2UgREFURToKICAgICAgICByZXR1cm4gYXMobmV3IERhdGUodmFsdWUyKSwgaW5kZXgyKTsKICAgICAgY2FzZSBSRUdFWFA6IHsKICAgICAgICBjb25zdCB7IHNvdXJjZSwgZmxhZ3MgfSA9IHZhbHVlMjsKICAgICAgICByZXR1cm4gYXMobmV3IFJlZ0V4cChzb3VyY2UsIGZsYWdzKSwgaW5kZXgyKTsKICAgICAgfQogICAgICBjYXNlIE1BUDogewogICAgICAgIGNvbnN0IG1hcDcgPSBhcygvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLCBpbmRleDIpOwogICAgICAgIGZvciAoY29uc3QgW2tleTIsIGluZGV4M10gb2YgdmFsdWUyKQogICAgICAgICAgbWFwNy5zZXQodW5wYWlyKGtleTIpLCB1bnBhaXIoaW5kZXgzKSk7CiAgICAgICAgcmV0dXJuIG1hcDc7CiAgICAgIH0KICAgICAgY2FzZSBTRVQ6IHsKICAgICAgICBjb25zdCBzZXQyID0gYXMoLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSwgaW5kZXgyKTsKICAgICAgICBmb3IgKGNvbnN0IGluZGV4MyBvZiB2YWx1ZTIpCiAgICAgICAgICBzZXQyLmFkZCh1bnBhaXIoaW5kZXgzKSk7CiAgICAgICAgcmV0dXJuIHNldDI7CiAgICAgIH0KICAgICAgY2FzZSBFUlJPUjogewogICAgICAgIGNvbnN0IHsgbmFtZSwgbWVzc2FnZTogbWVzc2FnZTIgfSA9IHZhbHVlMjsKICAgICAgICByZXR1cm4gYXMobmV3IGVudltuYW1lXShtZXNzYWdlMiksIGluZGV4Mik7CiAgICAgIH0KICAgICAgY2FzZSBCSUdJTlQ6CiAgICAgICAgcmV0dXJuIGFzKEJpZ0ludCh2YWx1ZTIpLCBpbmRleDIpOwogICAgICBjYXNlICJCaWdJbnQiOgogICAgICAgIHJldHVybiBhcyhPYmplY3QoQmlnSW50KHZhbHVlMikpLCBpbmRleDIpOwogICAgICBjYXNlICJBcnJheUJ1ZmZlciI6CiAgICAgICAgcmV0dXJuIGFzKG5ldyBVaW50OEFycmF5KHZhbHVlMikuYnVmZmVyLCB2YWx1ZTIpOwogICAgICBjYXNlICJEYXRhVmlldyI6IHsKICAgICAgICBjb25zdCB7IGJ1ZmZlcjogYnVmZmVyMiB9ID0gbmV3IFVpbnQ4QXJyYXkodmFsdWUyKTsKICAgICAgICByZXR1cm4gYXMobmV3IERhdGFWaWV3KGJ1ZmZlcjIpLCB2YWx1ZTIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gYXMobmV3IGVudlt0eXBlNV0odmFsdWUyKSwgaW5kZXgyKTsKICB9LCAidW5wYWlyIik7CiAgcmV0dXJuIHVucGFpcjsKfSwgImRlc2VyaWFsaXplciIpOwp2YXIgZGVzZXJpYWxpemUgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChzZXJpYWxpemVkKSA9PiBkZXNlcmlhbGl6ZXIoLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSwgc2VyaWFsaXplZCkoMCksICJkZXNlcmlhbGl6ZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B1bmdhcCtzdHJ1Y3R1cmVkLWNsb25lQDEuMy4wL25vZGVfbW9kdWxlcy9AdW5nYXAvc3RydWN0dXJlZC1jbG9uZS9lc20vc2VyaWFsaXplLmpzCnZhciBFTVBUWTIgPSAiIjsKdmFyIHsgdG9TdHJpbmc6IHRvU3RyaW5nMiB9ID0ge307CnZhciB7IGtleXMgfSA9IE9iamVjdDsKdmFyIHR5cGVPZiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHZhbHVlMikgPT4gewogIGNvbnN0IHR5cGU1ID0gdHlwZW9mIHZhbHVlMjsKICBpZiAodHlwZTUgIT09ICJvYmplY3QiIHx8ICF2YWx1ZTIpCiAgICByZXR1cm4gW1BSSU1JVElWRSwgdHlwZTVdOwogIGNvbnN0IGFzU3RyaW5nID0gdG9TdHJpbmcyLmNhbGwodmFsdWUyKS5zbGljZSg4LCAtMSk7CiAgc3dpdGNoIChhc1N0cmluZykgewogICAgY2FzZSAiQXJyYXkiOgogICAgICByZXR1cm4gW0FSUkFZLCBFTVBUWTJdOwogICAgY2FzZSAiT2JqZWN0IjoKICAgICAgcmV0dXJuIFtPQkpFQ1QsIEVNUFRZMl07CiAgICBjYXNlICJEYXRlIjoKICAgICAgcmV0dXJuIFtEQVRFLCBFTVBUWTJdOwogICAgY2FzZSAiUmVnRXhwIjoKICAgICAgcmV0dXJuIFtSRUdFWFAsIEVNUFRZMl07CiAgICBjYXNlICJNYXAiOgogICAgICByZXR1cm4gW01BUCwgRU1QVFkyXTsKICAgIGNhc2UgIlNldCI6CiAgICAgIHJldHVybiBbU0VULCBFTVBUWTJdOwogICAgY2FzZSAiRGF0YVZpZXciOgogICAgICByZXR1cm4gW0FSUkFZLCBhc1N0cmluZ107CiAgfQogIGlmIChhc1N0cmluZy5pbmNsdWRlcygiQXJyYXkiKSkKICAgIHJldHVybiBbQVJSQVksIGFzU3RyaW5nXTsKICBpZiAoYXNTdHJpbmcuaW5jbHVkZXMoIkVycm9yIikpCiAgICByZXR1cm4gW0VSUk9SLCBhc1N0cmluZ107CiAgcmV0dXJuIFtPQkpFQ1QsIGFzU3RyaW5nXTsKfSwgInR5cGVPZiIpOwp2YXIgc2hvdWxkU2tpcCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKFtUWVBFLCB0eXBlNV0pID0+IFRZUEUgPT09IFBSSU1JVElWRSAmJiAodHlwZTUgPT09ICJmdW5jdGlvbiIgfHwgdHlwZTUgPT09ICJzeW1ib2wiKSwgInNob3VsZFNraXAiKTsKdmFyIHNlcmlhbGl6ZXIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChzdHJpY3QsIGpzb24sICQzLCBfMykgPT4gewogIGNvbnN0IGFzID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgob3V0LCB2YWx1ZTIpID0+IHsKICAgIGNvbnN0IGluZGV4MiA9IF8zLnB1c2gob3V0KSAtIDE7CiAgICAkMy5zZXQodmFsdWUyLCBpbmRleDIpOwogICAgcmV0dXJuIGluZGV4MjsKICB9LCAiYXMiKTsKICBjb25zdCBwYWlyID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgodmFsdWUyKSA9PiB7CiAgICBpZiAoJDMuaGFzKHZhbHVlMikpCiAgICAgIHJldHVybiAkMy5nZXQodmFsdWUyKTsKICAgIGxldCBbVFlQRSwgdHlwZTVdID0gdHlwZU9mKHZhbHVlMik7CiAgICBzd2l0Y2ggKFRZUEUpIHsKICAgICAgY2FzZSBQUklNSVRJVkU6IHsKICAgICAgICBsZXQgZW50cnkgPSB2YWx1ZTI7CiAgICAgICAgc3dpdGNoICh0eXBlNSkgewogICAgICAgICAgY2FzZSAiYmlnaW50IjoKICAgICAgICAgICAgVFlQRSA9IEJJR0lOVDsKICAgICAgICAgICAgZW50cnkgPSB2YWx1ZTIudG9TdHJpbmcoKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJmdW5jdGlvbiI6CiAgICAgICAgICBjYXNlICJzeW1ib2wiOgogICAgICAgICAgICBpZiAoc3RyaWN0KQogICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoInVuYWJsZSB0byBzZXJpYWxpemUgIiArIHR5cGU1KTsKICAgICAgICAgICAgZW50cnkgPSBudWxsOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgInVuZGVmaW5lZCI6CiAgICAgICAgICAgIHJldHVybiBhcyhbVk9JRF0sIHZhbHVlMik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhcyhbVFlQRSwgZW50cnldLCB2YWx1ZTIpOwogICAgICB9CiAgICAgIGNhc2UgQVJSQVk6IHsKICAgICAgICBpZiAodHlwZTUpIHsKICAgICAgICAgIGxldCBzcHJlYWQgPSB2YWx1ZTI7CiAgICAgICAgICBpZiAodHlwZTUgPT09ICJEYXRhVmlldyIpIHsKICAgICAgICAgICAgc3ByZWFkID0gbmV3IFVpbnQ4QXJyYXkodmFsdWUyLmJ1ZmZlcik7CiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGU1ID09PSAiQXJyYXlCdWZmZXIiKSB7CiAgICAgICAgICAgIHNwcmVhZCA9IG5ldyBVaW50OEFycmF5KHZhbHVlMik7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gYXMoW3R5cGU1LCBbLi4uc3ByZWFkXV0sIHZhbHVlMik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGFyciA9IFtdOwogICAgICAgIGNvbnN0IGluZGV4MiA9IGFzKFtUWVBFLCBhcnJdLCB2YWx1ZTIpOwogICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgdmFsdWUyKQogICAgICAgICAgYXJyLnB1c2gocGFpcihlbnRyeSkpOwogICAgICAgIHJldHVybiBpbmRleDI7CiAgICAgIH0KICAgICAgY2FzZSBPQkpFQ1Q6IHsKICAgICAgICBpZiAodHlwZTUpIHsKICAgICAgICAgIHN3aXRjaCAodHlwZTUpIHsKICAgICAgICAgICAgY2FzZSAiQmlnSW50IjoKICAgICAgICAgICAgICByZXR1cm4gYXMoW3R5cGU1LCB2YWx1ZTIudG9TdHJpbmcoKV0sIHZhbHVlMik7CiAgICAgICAgICAgIGNhc2UgIkJvb2xlYW4iOgogICAgICAgICAgICBjYXNlICJOdW1iZXIiOgogICAgICAgICAgICBjYXNlICJTdHJpbmciOgogICAgICAgICAgICAgIHJldHVybiBhcyhbdHlwZTUsIHZhbHVlMi52YWx1ZU9mKCldLCB2YWx1ZTIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoanNvbiAmJiAidG9KU09OIiBpbiB2YWx1ZTIpCiAgICAgICAgICByZXR1cm4gcGFpcih2YWx1ZTIudG9KU09OKCkpOwogICAgICAgIGNvbnN0IGVudHJpZXMgPSBbXTsKICAgICAgICBjb25zdCBpbmRleDIgPSBhcyhbVFlQRSwgZW50cmllc10sIHZhbHVlMik7CiAgICAgICAgZm9yIChjb25zdCBrZXkyIG9mIGtleXModmFsdWUyKSkgewogICAgICAgICAgaWYgKHN0cmljdCB8fCAhc2hvdWxkU2tpcCh0eXBlT2YodmFsdWUyW2tleTJdKSkpCiAgICAgICAgICAgIGVudHJpZXMucHVzaChbcGFpcihrZXkyKSwgcGFpcih2YWx1ZTJba2V5Ml0pXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpbmRleDI7CiAgICAgIH0KICAgICAgY2FzZSBEQVRFOgogICAgICAgIHJldHVybiBhcyhbVFlQRSwgdmFsdWUyLnRvSVNPU3RyaW5nKCldLCB2YWx1ZTIpOwogICAgICBjYXNlIFJFR0VYUDogewogICAgICAgIGNvbnN0IHsgc291cmNlLCBmbGFncyB9ID0gdmFsdWUyOwogICAgICAgIHJldHVybiBhcyhbVFlQRSwgeyBzb3VyY2UsIGZsYWdzIH1dLCB2YWx1ZTIpOwogICAgICB9CiAgICAgIGNhc2UgTUFQOiB7CiAgICAgICAgY29uc3QgZW50cmllcyA9IFtdOwogICAgICAgIGNvbnN0IGluZGV4MiA9IGFzKFtUWVBFLCBlbnRyaWVzXSwgdmFsdWUyKTsKICAgICAgICBmb3IgKGNvbnN0IFtrZXkyLCBlbnRyeV0gb2YgdmFsdWUyKSB7CiAgICAgICAgICBpZiAoc3RyaWN0IHx8ICEoc2hvdWxkU2tpcCh0eXBlT2Yoa2V5MikpIHx8IHNob3VsZFNraXAodHlwZU9mKGVudHJ5KSkpKQogICAgICAgICAgICBlbnRyaWVzLnB1c2goW3BhaXIoa2V5MiksIHBhaXIoZW50cnkpXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpbmRleDI7CiAgICAgIH0KICAgICAgY2FzZSBTRVQ6IHsKICAgICAgICBjb25zdCBlbnRyaWVzID0gW107CiAgICAgICAgY29uc3QgaW5kZXgyID0gYXMoW1RZUEUsIGVudHJpZXNdLCB2YWx1ZTIpOwogICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgdmFsdWUyKSB7CiAgICAgICAgICBpZiAoc3RyaWN0IHx8ICFzaG91bGRTa2lwKHR5cGVPZihlbnRyeSkpKQogICAgICAgICAgICBlbnRyaWVzLnB1c2gocGFpcihlbnRyeSkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaW5kZXgyOwogICAgICB9CiAgICB9CiAgICBjb25zdCB7IG1lc3NhZ2U6IG1lc3NhZ2UyIH0gPSB2YWx1ZTI7CiAgICByZXR1cm4gYXMoW1RZUEUsIHsgbmFtZTogdHlwZTUsIG1lc3NhZ2U6IG1lc3NhZ2UyIH1dLCB2YWx1ZTIpOwogIH0sICJwYWlyIik7CiAgcmV0dXJuIHBhaXI7Cn0sICJzZXJpYWxpemVyIik7CnZhciBzZXJpYWxpemUyID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgodmFsdWUyLCB7IGpzb24sIGxvc3N5IH0gPSB7fSkgPT4gewogIGNvbnN0IF8zID0gW107CiAgcmV0dXJuIHNlcmlhbGl6ZXIoIShqc29uIHx8IGxvc3N5KSwgISFqc29uLCAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLCBfMykodmFsdWUyKSwgXzM7Cn0sICJzZXJpYWxpemUiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdW5nYXArc3RydWN0dXJlZC1jbG9uZUAxLjMuMC9ub2RlX21vZHVsZXMvQHVuZ2FwL3N0cnVjdHVyZWQtY2xvbmUvZXNtL2luZGV4LmpzCnZhciBlc21fZGVmYXVsdCA9IHR5cGVvZiBzdHJ1Y3R1cmVkQ2xvbmUgPT09ICJmdW5jdGlvbiIgPyAoCiAgLyogYzggaWdub3JlIHN0YXJ0ICovCiAgKGFueSwgb3B0aW9ucykgPT4gb3B0aW9ucyAmJiAoImpzb24iIGluIG9wdGlvbnMgfHwgImxvc3N5IiBpbiBvcHRpb25zKSA/IGRlc2VyaWFsaXplKHNlcmlhbGl6ZTIoYW55LCBvcHRpb25zKSkgOiBzdHJ1Y3R1cmVkQ2xvbmUoYW55KQopIDogKGFueSwgb3B0aW9ucykgPT4gZGVzZXJpYWxpemUoc2VyaWFsaXplMihhbnksIG9wdGlvbnMpKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS91bmlzdC11dGlsLXBvc2l0aW9uQDUuMC4wL25vZGVfbW9kdWxlcy91bmlzdC11dGlsLXBvc2l0aW9uL2xpYi9pbmRleC5qcwp2YXIgcG9pbnRFbmQgPSBwb2ludDMoImVuZCIpOwp2YXIgcG9pbnRTdGFydCA9IHBvaW50Mygic3RhcnQiKTsKZnVuY3Rpb24gcG9pbnQzKHR5cGU1KSB7CiAgcmV0dXJuIHBvaW50NDsKICBmdW5jdGlvbiBwb2ludDQobm9kZTIpIHsKICAgIGNvbnN0IHBvaW50NSA9IG5vZGUyICYmIG5vZGUyLnBvc2l0aW9uICYmIG5vZGUyLnBvc2l0aW9uW3R5cGU1XSB8fCB7fTsKICAgIGlmICh0eXBlb2YgcG9pbnQ1LmxpbmUgPT09ICJudW1iZXIiICYmIHBvaW50NS5saW5lID4gMCAmJiB0eXBlb2YgcG9pbnQ1LmNvbHVtbiA9PT0gIm51bWJlciIgJiYgcG9pbnQ1LmNvbHVtbiA+IDApIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBsaW5lOiBwb2ludDUubGluZSwKICAgICAgICBjb2x1bW46IHBvaW50NS5jb2x1bW4sCiAgICAgICAgb2Zmc2V0OiB0eXBlb2YgcG9pbnQ1Lm9mZnNldCA9PT0gIm51bWJlciIgJiYgcG9pbnQ1Lm9mZnNldCA+IC0xID8gcG9pbnQ1Lm9mZnNldCA6IHZvaWQgMAogICAgICB9OwogICAgfQogIH0KICBfX25hbWUocG9pbnQ0LCAicG9pbnQiKTsKfQpfX25hbWUocG9pbnQzLCAicG9pbnQiKTsKZnVuY3Rpb24gcG9zaXRpb24yKG5vZGUyKSB7CiAgY29uc3Qgc3RhcnQgPSBwb2ludFN0YXJ0KG5vZGUyKTsKICBjb25zdCBlbmQgPSBwb2ludEVuZChub2RlMik7CiAgaWYgKHN0YXJ0ICYmIGVuZCkgewogICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9OwogIH0KfQpfX25hbWUocG9zaXRpb24yLCAicG9zaXRpb24iKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9oYXN0LXV0aWwtc2FuaXRpemVANS4wLjIvbm9kZV9tb2R1bGVzL2hhc3QtdXRpbC1zYW5pdGl6ZS9saWIvc2NoZW1hLmpzCnZhciBhcmlhID0gWyJhcmlhRGVzY3JpYmVkQnkiLCAiYXJpYUxhYmVsIiwgImFyaWFMYWJlbGxlZEJ5Il07CnZhciBkZWZhdWx0U2NoZW1hID0gewogIGFuY2VzdG9yczogewogICAgdGJvZHk6IFsidGFibGUiXSwKICAgIHRkOiBbInRhYmxlIl0sCiAgICB0aDogWyJ0YWJsZSJdLAogICAgdGhlYWQ6IFsidGFibGUiXSwKICAgIHRmb290OiBbInRhYmxlIl0sCiAgICB0cjogWyJ0YWJsZSJdCiAgfSwKICBhdHRyaWJ1dGVzOiB7CiAgICBhOiBbCiAgICAgIC4uLmFyaWEsCiAgICAgIC8vIE5vdGU6IHRoZXNlIDMgYXJlIHVzZWQgYnkgR0ZNIGZvb3Rub3RlcywgdGhleSBkbyB3b3JrIG9uIGFsbCBsaW5rcy4KICAgICAgImRhdGFGb290bm90ZUJhY2tyZWYiLAogICAgICAiZGF0YUZvb3Rub3RlUmVmIiwKICAgICAgWyJjbGFzc05hbWUiLCAiZGF0YS1mb290bm90ZS1iYWNrcmVmIl0sCiAgICAgICJocmVmIgogICAgXSwKICAgIGJsb2NrcXVvdGU6IFsiY2l0ZSJdLAogICAgLy8gTm90ZTogdGhpcyBjbGFzcyBpcyBub3Qgbm9ybWFsbHkgYWxsb3dlZCBieSBHSCwgd2hlbiBtYW51YWxseSB3cml0aW5nCiAgICAvLyBgY29kZWAgYXMgSFRNTCBpbiBtYXJrZG93biwgdGhleSBhZGRzIGl0IHNvbWUgb3RoZXIgd2F5LgogICAgLy8gV2UgY2Fu4oCZdCBkbyB0aGF0LCBzbyB3ZSBoYXZlIHRvIGFsbG93IGl0LgogICAgY29kZTogW1siY2xhc3NOYW1lIiwgL15sYW5ndWFnZS0uL11dLAogICAgZGVsOiBbImNpdGUiXSwKICAgIGRpdjogWyJpdGVtU2NvcGUiLCAiaXRlbVR5cGUiXSwKICAgIGRsOiBbLi4uYXJpYV0sCiAgICAvLyBOb3RlOiB0aGlzIGlzIHVzZWQgYnkgR0ZNIGZvb3Rub3Rlcy4KICAgIGgyOiBbWyJjbGFzc05hbWUiLCAic3Itb25seSJdXSwKICAgIGltZzogWy4uLmFyaWEsICJsb25nRGVzYyIsICJzcmMiXSwKICAgIC8vIE5vdGU6IGBpbnB1dGAgaXMgbm90IG5vcm1hbGx5IGFsbG93ZWQgYnkgR0gsIHdoZW4gbWFudWFsbHkgd3JpdGluZwogICAgLy8gaXQgaW4gbWFya2Rvd24sIHRoZXkgYWRkIGl0IGZyb20gdGFza2xpc3RzIHNvbWUgb3RoZXIgd2F5LgogICAgLy8gV2UgY2Fu4oCZdCBkbyB0aGF0LCBzbyB3ZSBoYXZlIHRvIGFsbG93IGl0LgogICAgaW5wdXQ6IFsKICAgICAgWyJkaXNhYmxlZCIsIHRydWVdLAogICAgICBbInR5cGUiLCAiY2hlY2tib3giXQogICAgXSwKICAgIGluczogWyJjaXRlIl0sCiAgICAvLyBOb3RlOiB0aGlzIGNsYXNzIGlzIG5vdCBub3JtYWxseSBhbGxvd2VkIGJ5IEdILCB3aGVuIG1hbnVhbGx5IHdyaXRpbmcKICAgIC8vIGBsaWAgYXMgSFRNTCBpbiBtYXJrZG93biwgdGhleSBhZGRzIGl0IHNvbWUgb3RoZXIgd2F5LgogICAgLy8gV2UgY2Fu4oCZdCBkbyB0aGF0LCBzbyB3ZSBoYXZlIHRvIGFsbG93IGl0LgogICAgbGk6IFtbImNsYXNzTmFtZSIsICJ0YXNrLWxpc3QtaXRlbSJdXSwKICAgIC8vIE5vdGU6IHRoaXMgY2xhc3MgaXMgbm90IG5vcm1hbGx5IGFsbG93ZWQgYnkgR0gsIHdoZW4gbWFudWFsbHkgd3JpdGluZwogICAgLy8gYG9sYCBhcyBIVE1MIGluIG1hcmtkb3duLCB0aGV5IGFkZHMgaXQgc29tZSBvdGhlciB3YXkuCiAgICAvLyBXZSBjYW7igJl0IGRvIHRoYXQsIHNvIHdlIGhhdmUgdG8gYWxsb3cgaXQuCiAgICBvbDogWy4uLmFyaWEsIFsiY2xhc3NOYW1lIiwgImNvbnRhaW5zLXRhc2stbGlzdCJdXSwKICAgIHE6IFsiY2l0ZSJdLAogICAgc2VjdGlvbjogWyJkYXRhRm9vdG5vdGVzIiwgWyJjbGFzc05hbWUiLCAiZm9vdG5vdGVzIl1dLAogICAgc291cmNlOiBbInNyY1NldCJdLAogICAgc3VtbWFyeTogWy4uLmFyaWFdLAogICAgdGFibGU6IFsuLi5hcmlhXSwKICAgIC8vIE5vdGU6IHRoaXMgY2xhc3MgaXMgbm90IG5vcm1hbGx5IGFsbG93ZWQgYnkgR0gsIHdoZW4gbWFudWFsbHkgd3JpdGluZwogICAgLy8gYG9sYCBhcyBIVE1MIGluIG1hcmtkb3duLCB0aGV5IGFkZHMgaXQgc29tZSBvdGhlciB3YXkuCiAgICAvLyBXZSBjYW7igJl0IGRvIHRoYXQsIHNvIHdlIGhhdmUgdG8gYWxsb3cgaXQuCiAgICB1bDogWy4uLmFyaWEsIFsiY2xhc3NOYW1lIiwgImNvbnRhaW5zLXRhc2stbGlzdCJdXSwKICAgICIqIjogWwogICAgICAiYWJiciIsCiAgICAgICJhY2NlcHQiLAogICAgICAiYWNjZXB0Q2hhcnNldCIsCiAgICAgICJhY2Nlc3NLZXkiLAogICAgICAiYWN0aW9uIiwKICAgICAgImFsaWduIiwKICAgICAgImFsdCIsCiAgICAgICJheGlzIiwKICAgICAgImJvcmRlciIsCiAgICAgICJjZWxsUGFkZGluZyIsCiAgICAgICJjZWxsU3BhY2luZyIsCiAgICAgICJjaGFyIiwKICAgICAgImNoYXJPZmYiLAogICAgICAiY2hhclNldCIsCiAgICAgICJjaGVja2VkIiwKICAgICAgImNsZWFyIiwKICAgICAgImNvbFNwYW4iLAogICAgICAiY29sb3IiLAogICAgICAiY29scyIsCiAgICAgICJjb21wYWN0IiwKICAgICAgImNvb3JkcyIsCiAgICAgICJkYXRlVGltZSIsCiAgICAgICJkaXIiLAogICAgICAvLyBOb3RlOiBgZGlzYWJsZWRgIGlzIHRlY2huaWNhbGx5IGFsbG93ZWQgb24gYWxsIGVsZW1lbnRzIGJ5IEdILgogICAgICAvLyBCdXQgaXQgaXMgdXNlbGVzcyBvbiBldmVyeXRoaW5nIGV4Y2VwdCBgaW5wdXRgLgogICAgICAvLyBCZWNhdXNlIGBpbnB1dGBzIGFyZSBub3JtYWxseSBub3QgYWxsb3dlZCwgYnV0IHdlIGFsbG93IHRoZW0gZm9yCiAgICAgIC8vIGNoZWNrYm94ZXMgZHVlIHRvIHRhc2tsaXN0cywgd2UgYWxsb3cgYGRpc2FibGVkYCBvbmx5IHRoZXJlLgogICAgICAiZW5jVHlwZSIsCiAgICAgICJmcmFtZSIsCiAgICAgICJoU3BhY2UiLAogICAgICAiaGVhZGVycyIsCiAgICAgICJoZWlnaHQiLAogICAgICAiaHJlZkxhbmciLAogICAgICAiaHRtbEZvciIsCiAgICAgICJpZCIsCiAgICAgICJpc01hcCIsCiAgICAgICJpdGVtUHJvcCIsCiAgICAgICJsYWJlbCIsCiAgICAgICJsYW5nIiwKICAgICAgIm1heExlbmd0aCIsCiAgICAgICJtZWRpYSIsCiAgICAgICJtZXRob2QiLAogICAgICAibXVsdGlwbGUiLAogICAgICAibmFtZSIsCiAgICAgICJub0hyZWYiLAogICAgICAibm9TaGFkZSIsCiAgICAgICJub1dyYXAiLAogICAgICAib3BlbiIsCiAgICAgICJwcm9tcHQiLAogICAgICAicmVhZE9ubHkiLAogICAgICAicmV2IiwKICAgICAgInJvd1NwYW4iLAogICAgICAicm93cyIsCiAgICAgICJydWxlcyIsCiAgICAgICJzY29wZSIsCiAgICAgICJzZWxlY3RlZCIsCiAgICAgICJzaGFwZSIsCiAgICAgICJzaXplIiwKICAgICAgInNwYW4iLAogICAgICAic3RhcnQiLAogICAgICAic3VtbWFyeSIsCiAgICAgICJ0YWJJbmRleCIsCiAgICAgICJ0aXRsZSIsCiAgICAgICJ1c2VNYXAiLAogICAgICAidkFsaWduIiwKICAgICAgInZhbHVlIiwKICAgICAgIndpZHRoIgogICAgXQogIH0sCiAgY2xvYmJlcjogWyJhcmlhRGVzY3JpYmVkQnkiLCAiYXJpYUxhYmVsbGVkQnkiLCAiaWQiLCAibmFtZSJdLAogIGNsb2JiZXJQcmVmaXg6ICJ1c2VyLWNvbnRlbnQtIiwKICBwcm90b2NvbHM6IHsKICAgIGNpdGU6IFsiaHR0cCIsICJodHRwcyJdLAogICAgaHJlZjogWyJodHRwIiwgImh0dHBzIiwgImlyYyIsICJpcmNzIiwgIm1haWx0byIsICJ4bXBwIl0sCiAgICBsb25nRGVzYzogWyJodHRwIiwgImh0dHBzIl0sCiAgICBzcmM6IFsiaHR0cCIsICJodHRwcyJdCiAgfSwKICByZXF1aXJlZDogewogICAgaW5wdXQ6IHsgZGlzYWJsZWQ6IHRydWUsIHR5cGU6ICJjaGVja2JveCIgfQogIH0sCiAgc3RyaXA6IFsic2NyaXB0Il0sCiAgdGFnTmFtZXM6IFsKICAgICJhIiwKICAgICJiIiwKICAgICJibG9ja3F1b3RlIiwKICAgICJiciIsCiAgICAiY29kZSIsCiAgICAiZGQiLAogICAgImRlbCIsCiAgICAiZGV0YWlscyIsCiAgICAiZGl2IiwKICAgICJkbCIsCiAgICAiZHQiLAogICAgImVtIiwKICAgICJoMSIsCiAgICAiaDIiLAogICAgImgzIiwKICAgICJoNCIsCiAgICAiaDUiLAogICAgImg2IiwKICAgICJociIsCiAgICAiaSIsCiAgICAiaW1nIiwKICAgIC8vIE5vdGU6IGBpbnB1dGAgaXMgbm90IG5vcm1hbGx5IGFsbG93ZWQgYnkgR0gsIHdoZW4gbWFudWFsbHkgd3JpdGluZwogICAgLy8gaXQgaW4gbWFya2Rvd24sIHRoZXkgYWRkIGl0IGZyb20gdGFza2xpc3RzIHNvbWUgb3RoZXIgd2F5LgogICAgLy8gV2UgY2Fu4oCZdCBkbyB0aGF0LCBzbyB3ZSBoYXZlIHRvIGFsbG93IGl0LgogICAgImlucHV0IiwKICAgICJpbnMiLAogICAgImtiZCIsCiAgICAibGkiLAogICAgIm9sIiwKICAgICJwIiwKICAgICJwaWN0dXJlIiwKICAgICJwcmUiLAogICAgInEiLAogICAgInJwIiwKICAgICJydCIsCiAgICAicnVieSIsCiAgICAicyIsCiAgICAic2FtcCIsCiAgICAic2VjdGlvbiIsCiAgICAic291cmNlIiwKICAgICJzcGFuIiwKICAgICJzdHJpa2UiLAogICAgInN0cm9uZyIsCiAgICAic3ViIiwKICAgICJzdW1tYXJ5IiwKICAgICJzdXAiLAogICAgInRhYmxlIiwKICAgICJ0Ym9keSIsCiAgICAidGQiLAogICAgInRmb290IiwKICAgICJ0aCIsCiAgICAidGhlYWQiLAogICAgInRyIiwKICAgICJ0dCIsCiAgICAidWwiLAogICAgInZhciIKICBdCn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vaGFzdC11dGlsLXNhbml0aXplQDUuMC4yL25vZGVfbW9kdWxlcy9oYXN0LXV0aWwtc2FuaXRpemUvbGliL2luZGV4LmpzCnZhciBvd243ID0ge30uaGFzT3duUHJvcGVydHk7CmZ1bmN0aW9uIHNhbml0aXplKG5vZGUyLCBvcHRpb25zKSB7CiAgbGV0IHJlc3VsdCA9IHsgdHlwZTogInJvb3QiLCBjaGlsZHJlbjogW10gfTsKICBjb25zdCBzdGF0ZSA9IHsKICAgIHNjaGVtYTogb3B0aW9ucyA/IHsgLi4uZGVmYXVsdFNjaGVtYSwgLi4ub3B0aW9ucyB9IDogZGVmYXVsdFNjaGVtYSwKICAgIHN0YWNrOiBbXQogIH07CiAgY29uc3QgcmVwbGFjZTMgPSB0cmFuc2Zvcm0oc3RhdGUsIG5vZGUyKTsKICBpZiAocmVwbGFjZTMpIHsKICAgIGlmIChBcnJheS5pc0FycmF5KHJlcGxhY2UzKSkgewogICAgICBpZiAocmVwbGFjZTMubGVuZ3RoID09PSAxKSB7CiAgICAgICAgcmVzdWx0ID0gcmVwbGFjZTNbMF07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzdWx0LmNoaWxkcmVuID0gcmVwbGFjZTM7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdCA9IHJlcGxhY2UzOwogICAgfQogIH0KICByZXR1cm4gcmVzdWx0Owp9Cl9fbmFtZShzYW5pdGl6ZSwgInNhbml0aXplIik7CmZ1bmN0aW9uIHRyYW5zZm9ybShzdGF0ZSwgbm9kZTIpIHsKICBpZiAobm9kZTIgJiYgdHlwZW9mIG5vZGUyID09PSAib2JqZWN0IikgewogICAgY29uc3QgdW5zYWZlMiA9ICgKICAgICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZWFkb25seTx1bmtub3duPj59ICovCiAgICAgIG5vZGUyCiAgICApOwogICAgY29uc3QgdHlwZTUgPSB0eXBlb2YgdW5zYWZlMi50eXBlID09PSAic3RyaW5nIiA/IHVuc2FmZTIudHlwZSA6ICIiOwogICAgc3dpdGNoICh0eXBlNSkgewogICAgICBjYXNlICJjb21tZW50IjogewogICAgICAgIHJldHVybiBjb21tZW50KHN0YXRlLCB1bnNhZmUyKTsKICAgICAgfQogICAgICBjYXNlICJkb2N0eXBlIjogewogICAgICAgIHJldHVybiBkb2N0eXBlKHN0YXRlLCB1bnNhZmUyKTsKICAgICAgfQogICAgICBjYXNlICJlbGVtZW50IjogewogICAgICAgIHJldHVybiBlbGVtZW50MihzdGF0ZSwgdW5zYWZlMik7CiAgICAgIH0KICAgICAgY2FzZSAicm9vdCI6IHsKICAgICAgICByZXR1cm4gcm9vdDIoc3RhdGUsIHVuc2FmZTIpOwogICAgICB9CiAgICAgIGNhc2UgInRleHQiOiB7CiAgICAgICAgcmV0dXJuIHRleHQ1KHN0YXRlLCB1bnNhZmUyKTsKICAgICAgfQogICAgICBkZWZhdWx0OgogICAgfQogIH0KfQpfX25hbWUodHJhbnNmb3JtLCAidHJhbnNmb3JtIik7CmZ1bmN0aW9uIGNvbW1lbnQoc3RhdGUsIHVuc2FmZTIpIHsKICBpZiAoc3RhdGUuc2NoZW1hLmFsbG93Q29tbWVudHMpIHsKICAgIGNvbnN0IHJlc3VsdCA9IHR5cGVvZiB1bnNhZmUyLnZhbHVlID09PSAic3RyaW5nIiA/IHVuc2FmZTIudmFsdWUgOiAiIjsKICAgIGNvbnN0IGluZGV4MiA9IHJlc3VsdC5pbmRleE9mKCItLT4iKTsKICAgIGNvbnN0IHZhbHVlMiA9IGluZGV4MiA8IDAgPyByZXN1bHQgOiByZXN1bHQuc2xpY2UoMCwgaW5kZXgyKTsKICAgIGNvbnN0IG5vZGUyID0geyB0eXBlOiAiY29tbWVudCIsIHZhbHVlOiB2YWx1ZTIgfTsKICAgIHBhdGNoKG5vZGUyLCB1bnNhZmUyKTsKICAgIHJldHVybiBub2RlMjsKICB9Cn0KX19uYW1lKGNvbW1lbnQsICJjb21tZW50Iik7CmZ1bmN0aW9uIGRvY3R5cGUoc3RhdGUsIHVuc2FmZTIpIHsKICBpZiAoc3RhdGUuc2NoZW1hLmFsbG93RG9jdHlwZXMpIHsKICAgIGNvbnN0IG5vZGUyID0geyB0eXBlOiAiZG9jdHlwZSIgfTsKICAgIHBhdGNoKG5vZGUyLCB1bnNhZmUyKTsKICAgIHJldHVybiBub2RlMjsKICB9Cn0KX19uYW1lKGRvY3R5cGUsICJkb2N0eXBlIik7CmZ1bmN0aW9uIGVsZW1lbnQyKHN0YXRlLCB1bnNhZmUyKSB7CiAgY29uc3QgbmFtZSA9IHR5cGVvZiB1bnNhZmUyLnRhZ05hbWUgPT09ICJzdHJpbmciID8gdW5zYWZlMi50YWdOYW1lIDogIiI7CiAgc3RhdGUuc3RhY2sucHVzaChuYW1lKTsKICBjb25zdCBjb250ZW50MyA9ICgKICAgIC8qKiBAdHlwZSB7QXJyYXk8RWxlbWVudENvbnRlbnQ+fSAqLwogICAgY2hpbGRyZW4oc3RhdGUsIHVuc2FmZTIuY2hpbGRyZW4pCiAgKTsKICBjb25zdCBwcm9wZXJ0aWVzXyA9IHByb3BlcnRpZXMoc3RhdGUsIHVuc2FmZTIucHJvcGVydGllcyk7CiAgc3RhdGUuc3RhY2sucG9wKCk7CiAgbGV0IHNhZmVFbGVtZW50ID0gZmFsc2U7CiAgaWYgKG5hbWUgJiYgbmFtZSAhPT0gIioiICYmICghc3RhdGUuc2NoZW1hLnRhZ05hbWVzIHx8IHN0YXRlLnNjaGVtYS50YWdOYW1lcy5pbmNsdWRlcyhuYW1lKSkpIHsKICAgIHNhZmVFbGVtZW50ID0gdHJ1ZTsKICAgIGlmIChzdGF0ZS5zY2hlbWEuYW5jZXN0b3JzICYmIG93bjcuY2FsbChzdGF0ZS5zY2hlbWEuYW5jZXN0b3JzLCBuYW1lKSkgewogICAgICBjb25zdCBhbmNlc3RvcnMgPSBzdGF0ZS5zY2hlbWEuYW5jZXN0b3JzW25hbWVdOwogICAgICBsZXQgaW5kZXgyID0gLTE7CiAgICAgIHNhZmVFbGVtZW50ID0gZmFsc2U7CiAgICAgIHdoaWxlICgrK2luZGV4MiA8IGFuY2VzdG9ycy5sZW5ndGgpIHsKICAgICAgICBpZiAoc3RhdGUuc3RhY2suaW5jbHVkZXMoYW5jZXN0b3JzW2luZGV4Ml0pKSB7CiAgICAgICAgICBzYWZlRWxlbWVudCA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIGlmICghc2FmZUVsZW1lbnQpIHsKICAgIHJldHVybiBzdGF0ZS5zY2hlbWEuc3RyaXAgJiYgIXN0YXRlLnNjaGVtYS5zdHJpcC5pbmNsdWRlcyhuYW1lKSA/IGNvbnRlbnQzIDogdm9pZCAwOwogIH0KICBjb25zdCBub2RlMiA9IHsKICAgIHR5cGU6ICJlbGVtZW50IiwKICAgIHRhZ05hbWU6IG5hbWUsCiAgICBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzXywKICAgIGNoaWxkcmVuOiBjb250ZW50MwogIH07CiAgcGF0Y2gobm9kZTIsIHVuc2FmZTIpOwogIHJldHVybiBub2RlMjsKfQpfX25hbWUoZWxlbWVudDIsICJlbGVtZW50Iik7CmZ1bmN0aW9uIHJvb3QyKHN0YXRlLCB1bnNhZmUyKSB7CiAgY29uc3QgY29udGVudDMgPSAoCiAgICAvKiogQHR5cGUge0FycmF5PFJvb3RDb250ZW50Pn0gKi8KICAgIGNoaWxkcmVuKHN0YXRlLCB1bnNhZmUyLmNoaWxkcmVuKQogICk7CiAgY29uc3Qgbm9kZTIgPSB7IHR5cGU6ICJyb290IiwgY2hpbGRyZW46IGNvbnRlbnQzIH07CiAgcGF0Y2gobm9kZTIsIHVuc2FmZTIpOwogIHJldHVybiBub2RlMjsKfQpfX25hbWUocm9vdDIsICJyb290Iik7CmZ1bmN0aW9uIHRleHQ1KF8zLCB1bnNhZmUyKSB7CiAgY29uc3QgdmFsdWUyID0gdHlwZW9mIHVuc2FmZTIudmFsdWUgPT09ICJzdHJpbmciID8gdW5zYWZlMi52YWx1ZSA6ICIiOwogIGNvbnN0IG5vZGUyID0geyB0eXBlOiAidGV4dCIsIHZhbHVlOiB2YWx1ZTIgfTsKICBwYXRjaChub2RlMiwgdW5zYWZlMik7CiAgcmV0dXJuIG5vZGUyOwp9Cl9fbmFtZSh0ZXh0NSwgInRleHQiKTsKZnVuY3Rpb24gY2hpbGRyZW4oc3RhdGUsIGNoaWxkcmVuMikgewogIGNvbnN0IHJlc3VsdHMgPSBbXTsKICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbjIpKSB7CiAgICBjb25zdCBjaGlsZHJlblVua25vd24gPSAoCiAgICAgIC8qKiBAdHlwZSB7QXJyYXk8UmVhZG9ubHk8dW5rbm93bj4+fSAqLwogICAgICBjaGlsZHJlbjIKICAgICk7CiAgICBsZXQgaW5kZXgyID0gLTE7CiAgICB3aGlsZSAoKytpbmRleDIgPCBjaGlsZHJlblVua25vd24ubGVuZ3RoKSB7CiAgICAgIGNvbnN0IHZhbHVlMiA9IHRyYW5zZm9ybShzdGF0ZSwgY2hpbGRyZW5Vbmtub3duW2luZGV4Ml0pOwogICAgICBpZiAodmFsdWUyKSB7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUyKSkgewogICAgICAgICAgcmVzdWx0cy5wdXNoKC4uLnZhbHVlMik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlc3VsdHMucHVzaCh2YWx1ZTIpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICByZXR1cm4gcmVzdWx0czsKfQpfX25hbWUoY2hpbGRyZW4sICJjaGlsZHJlbiIpOwpmdW5jdGlvbiBwcm9wZXJ0aWVzKHN0YXRlLCBwcm9wZXJ0aWVzMikgewogIGNvbnN0IHRhZ05hbWUgPSBzdGF0ZS5zdGFja1tzdGF0ZS5zdGFjay5sZW5ndGggLSAxXTsKICBjb25zdCBhdHRyaWJ1dGVzID0gc3RhdGUuc2NoZW1hLmF0dHJpYnV0ZXM7CiAgY29uc3QgcmVxdWlyZWQgPSBzdGF0ZS5zY2hlbWEucmVxdWlyZWQ7CiAgY29uc3Qgc3BlY2lmaWMgPSBhdHRyaWJ1dGVzICYmIG93bjcuY2FsbChhdHRyaWJ1dGVzLCB0YWdOYW1lKSA/IGF0dHJpYnV0ZXNbdGFnTmFtZV0gOiB2b2lkIDA7CiAgY29uc3QgZGVmYXVsdHMgPSBhdHRyaWJ1dGVzICYmIG93bjcuY2FsbChhdHRyaWJ1dGVzLCAiKiIpID8gYXR0cmlidXRlc1siKiJdIDogdm9pZCAwOwogIGNvbnN0IHByb3BlcnRpZXNfID0gKAogICAgLyoqIEB0eXBlIHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBSZWFkb25seTx1bmtub3duPj4+fSAqLwogICAgcHJvcGVydGllczIgJiYgdHlwZW9mIHByb3BlcnRpZXMyID09PSAib2JqZWN0IiA/IHByb3BlcnRpZXMyIDoge30KICApOwogIGNvbnN0IHJlc3VsdCA9IHt9OwogIGxldCBrZXkyOwogIGZvciAoa2V5MiBpbiBwcm9wZXJ0aWVzXykgewogICAgaWYgKG93bjcuY2FsbChwcm9wZXJ0aWVzXywga2V5MikpIHsKICAgICAgY29uc3QgdW5zYWZlMiA9IHByb3BlcnRpZXNfW2tleTJdOwogICAgICBsZXQgc2FmZTIgPSBwcm9wZXJ0eVZhbHVlKAogICAgICAgIHN0YXRlLAogICAgICAgIGZpbmREZWZpbml0aW9uKHNwZWNpZmljLCBrZXkyKSwKICAgICAgICBrZXkyLAogICAgICAgIHVuc2FmZTIKICAgICAgKTsKICAgICAgaWYgKHNhZmUyID09PSBudWxsIHx8IHNhZmUyID09PSB2b2lkIDApIHsKICAgICAgICBzYWZlMiA9IHByb3BlcnR5VmFsdWUoc3RhdGUsIGZpbmREZWZpbml0aW9uKGRlZmF1bHRzLCBrZXkyKSwga2V5MiwgdW5zYWZlMik7CiAgICAgIH0KICAgICAgaWYgKHNhZmUyICE9PSBudWxsICYmIHNhZmUyICE9PSB2b2lkIDApIHsKICAgICAgICByZXN1bHRba2V5Ml0gPSBzYWZlMjsKICAgICAgfQogICAgfQogIH0KICBpZiAocmVxdWlyZWQgJiYgb3duNy5jYWxsKHJlcXVpcmVkLCB0YWdOYW1lKSkgewogICAgY29uc3QgcHJvcGVydGllczMgPSByZXF1aXJlZFt0YWdOYW1lXTsKICAgIGZvciAoa2V5MiBpbiBwcm9wZXJ0aWVzMykgewogICAgICBpZiAob3duNy5jYWxsKHByb3BlcnRpZXMzLCBrZXkyKSAmJiAhb3duNy5jYWxsKHJlc3VsdCwga2V5MikpIHsKICAgICAgICByZXN1bHRba2V5Ml0gPSBwcm9wZXJ0aWVzM1trZXkyXTsKICAgICAgfQogICAgfQogIH0KICByZXR1cm4gcmVzdWx0Owp9Cl9fbmFtZShwcm9wZXJ0aWVzLCAicHJvcGVydGllcyIpOwpmdW5jdGlvbiBwcm9wZXJ0eVZhbHVlKHN0YXRlLCBkZWZpbml0aW9uMywga2V5MiwgdmFsdWUyKSB7CiAgcmV0dXJuIGRlZmluaXRpb24zID8gQXJyYXkuaXNBcnJheSh2YWx1ZTIpID8gcHJvcGVydHlWYWx1ZU1hbnkoc3RhdGUsIGRlZmluaXRpb24zLCBrZXkyLCB2YWx1ZTIpIDogcHJvcGVydHlWYWx1ZVByaW1pdGl2ZShzdGF0ZSwgZGVmaW5pdGlvbjMsIGtleTIsIHZhbHVlMikgOiB2b2lkIDA7Cn0KX19uYW1lKHByb3BlcnR5VmFsdWUsICJwcm9wZXJ0eVZhbHVlIik7CmZ1bmN0aW9uIHByb3BlcnR5VmFsdWVNYW55KHN0YXRlLCBkZWZpbml0aW9uMywga2V5MiwgdmFsdWVzKSB7CiAgbGV0IGluZGV4MiA9IC0xOwogIGNvbnN0IHJlc3VsdCA9IFtdOwogIHdoaWxlICgrK2luZGV4MiA8IHZhbHVlcy5sZW5ndGgpIHsKICAgIGNvbnN0IHZhbHVlMiA9IHByb3BlcnR5VmFsdWVQcmltaXRpdmUoc3RhdGUsIGRlZmluaXRpb24zLCBrZXkyLCB2YWx1ZXNbaW5kZXgyXSk7CiAgICBpZiAodHlwZW9mIHZhbHVlMiA9PT0gIm51bWJlciIgfHwgdHlwZW9mIHZhbHVlMiA9PT0gInN0cmluZyIpIHsKICAgICAgcmVzdWx0LnB1c2godmFsdWUyKTsKICAgIH0KICB9CiAgcmV0dXJuIHJlc3VsdDsKfQpfX25hbWUocHJvcGVydHlWYWx1ZU1hbnksICJwcm9wZXJ0eVZhbHVlTWFueSIpOwpmdW5jdGlvbiBwcm9wZXJ0eVZhbHVlUHJpbWl0aXZlKHN0YXRlLCBkZWZpbml0aW9uMywga2V5MiwgdmFsdWUyKSB7CiAgaWYgKHR5cGVvZiB2YWx1ZTIgIT09ICJib29sZWFuIiAmJiB0eXBlb2YgdmFsdWUyICE9PSAibnVtYmVyIiAmJiB0eXBlb2YgdmFsdWUyICE9PSAic3RyaW5nIikgewogICAgcmV0dXJuOwogIH0KICBpZiAoIXNhZmVQcm90b2NvbChzdGF0ZSwga2V5MiwgdmFsdWUyKSkgewogICAgcmV0dXJuOwogIH0KICBpZiAodHlwZW9mIGRlZmluaXRpb24zID09PSAib2JqZWN0IiAmJiBkZWZpbml0aW9uMy5sZW5ndGggPiAxKSB7CiAgICBsZXQgb2szID0gZmFsc2U7CiAgICBsZXQgaW5kZXgyID0gMDsKICAgIHdoaWxlICgrK2luZGV4MiA8IGRlZmluaXRpb24zLmxlbmd0aCkgewogICAgICBjb25zdCBhbGxvd2VkID0gZGVmaW5pdGlvbjNbaW5kZXgyXTsKICAgICAgaWYgKGFsbG93ZWQgJiYgdHlwZW9mIGFsbG93ZWQgPT09ICJvYmplY3QiICYmICJmbGFncyIgaW4gYWxsb3dlZCkgewogICAgICAgIGlmIChhbGxvd2VkLnRlc3QoU3RyaW5nKHZhbHVlMikpKSB7CiAgICAgICAgICBvazMgPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGFsbG93ZWQgPT09IHZhbHVlMikgewogICAgICAgIG9rMyA9IHRydWU7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGlmICghb2szKSByZXR1cm47CiAgfQogIHJldHVybiBzdGF0ZS5zY2hlbWEuY2xvYmJlciAmJiBzdGF0ZS5zY2hlbWEuY2xvYmJlclByZWZpeCAmJiBzdGF0ZS5zY2hlbWEuY2xvYmJlci5pbmNsdWRlcyhrZXkyKSA/IHN0YXRlLnNjaGVtYS5jbG9iYmVyUHJlZml4ICsgdmFsdWUyIDogdmFsdWUyOwp9Cl9fbmFtZShwcm9wZXJ0eVZhbHVlUHJpbWl0aXZlLCAicHJvcGVydHlWYWx1ZVByaW1pdGl2ZSIpOwpmdW5jdGlvbiBzYWZlUHJvdG9jb2woc3RhdGUsIGtleTIsIHZhbHVlMikgewogIGNvbnN0IHByb3RvY29scyA9IHN0YXRlLnNjaGVtYS5wcm90b2NvbHMgJiYgb3duNy5jYWxsKHN0YXRlLnNjaGVtYS5wcm90b2NvbHMsIGtleTIpID8gc3RhdGUuc2NoZW1hLnByb3RvY29sc1trZXkyXSA6IHZvaWQgMDsKICBpZiAoIXByb3RvY29scyB8fCBwcm90b2NvbHMubGVuZ3RoID09PSAwKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgY29uc3QgdXJsID0gU3RyaW5nKHZhbHVlMik7CiAgY29uc3QgY29sb24gPSB1cmwuaW5kZXhPZigiOiIpOwogIGNvbnN0IHF1ZXN0aW9uTWFyayA9IHVybC5pbmRleE9mKCI/Iik7CiAgY29uc3QgbnVtYmVyU2lnbiA9IHVybC5pbmRleE9mKCIjIik7CiAgY29uc3Qgc2xhc2ggPSB1cmwuaW5kZXhPZigiLyIpOwogIGlmIChjb2xvbiA8IDAgfHwgLy8gSWYgdGhlIGZpcnN0IGNvbG9uIGlzIGFmdGVyIGEgYD9gLCBgI2AsIG9yIGAvYCwgaXTigJlzIG5vdCBhIHByb3RvY29sLgogIHNsYXNoID4gLTEgJiYgY29sb24gPiBzbGFzaCB8fCBxdWVzdGlvbk1hcmsgPiAtMSAmJiBjb2xvbiA+IHF1ZXN0aW9uTWFyayB8fCBudW1iZXJTaWduID4gLTEgJiYgY29sb24gPiBudW1iZXJTaWduKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgbGV0IGluZGV4MiA9IC0xOwogIHdoaWxlICgrK2luZGV4MiA8IHByb3RvY29scy5sZW5ndGgpIHsKICAgIGNvbnN0IHByb3RvY29sID0gcHJvdG9jb2xzW2luZGV4Ml07CiAgICBpZiAoY29sb24gPT09IHByb3RvY29sLmxlbmd0aCAmJiB1cmwuc2xpY2UoMCwgcHJvdG9jb2wubGVuZ3RoKSA9PT0gcHJvdG9jb2wpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgfQogIHJldHVybiBmYWxzZTsKfQpfX25hbWUoc2FmZVByb3RvY29sLCAic2FmZVByb3RvY29sIik7CmZ1bmN0aW9uIHBhdGNoKG5vZGUyLCB1bnNhZmUyKSB7CiAgY29uc3QgY2xlYW5Qb3NpdGlvbiA9IHBvc2l0aW9uMigKICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IGxvb2tzIGxpa2UgYSBub2RlLgogICAgdW5zYWZlMgogICk7CiAgaWYgKHVuc2FmZTIuZGF0YSkgewogICAgbm9kZTIuZGF0YSA9IGVzbV9kZWZhdWx0KHVuc2FmZTIuZGF0YSk7CiAgfQogIGlmIChjbGVhblBvc2l0aW9uKSBub2RlMi5wb3NpdGlvbiA9IGNsZWFuUG9zaXRpb247Cn0KX19uYW1lKHBhdGNoLCAicGF0Y2giKTsKZnVuY3Rpb24gZmluZERlZmluaXRpb24oZGVmaW5pdGlvbnMsIGtleTIpIHsKICBsZXQgZGF0YURlZmF1bHQ7CiAgbGV0IGluZGV4MiA9IC0xOwogIGlmIChkZWZpbml0aW9ucykgewogICAgd2hpbGUgKCsraW5kZXgyIDwgZGVmaW5pdGlvbnMubGVuZ3RoKSB7CiAgICAgIGNvbnN0IGVudHJ5ID0gZGVmaW5pdGlvbnNbaW5kZXgyXTsKICAgICAgY29uc3QgbmFtZSA9IHR5cGVvZiBlbnRyeSA9PT0gInN0cmluZyIgPyBlbnRyeSA6IGVudHJ5WzBdOwogICAgICBpZiAobmFtZSA9PT0ga2V5MikgewogICAgICAgIHJldHVybiBlbnRyeTsKICAgICAgfQogICAgICBpZiAobmFtZSA9PT0gImRhdGEqIikgZGF0YURlZmF1bHQgPSBlbnRyeTsKICAgIH0KICB9CiAgaWYgKGtleTIubGVuZ3RoID4gNCAmJiBrZXkyLnNsaWNlKDAsIDQpLnRvTG93ZXJDYXNlKCkgPT09ICJkYXRhIikgewogICAgcmV0dXJuIGRhdGFEZWZhdWx0OwogIH0KfQpfX25hbWUoZmluZERlZmluaXRpb24sICJmaW5kRGVmaW5pdGlvbiIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvYmxvY2txdW90ZS5qcwpmdW5jdGlvbiBibG9ja3F1b3RlMihzdGF0ZSwgbm9kZTIpIHsKICBjb25zdCByZXN1bHQgPSB7CiAgICB0eXBlOiAiZWxlbWVudCIsCiAgICB0YWdOYW1lOiAiYmxvY2txdW90ZSIsCiAgICBwcm9wZXJ0aWVzOiB7fSwKICAgIGNoaWxkcmVuOiBzdGF0ZS53cmFwKHN0YXRlLmFsbChub2RlMiksIHRydWUpCiAgfTsKICBzdGF0ZS5wYXRjaChub2RlMiwgcmVzdWx0KTsKICByZXR1cm4gc3RhdGUuYXBwbHlEYXRhKG5vZGUyLCByZXN1bHQpOwp9Cl9fbmFtZShibG9ja3F1b3RlMiwgImJsb2NrcXVvdGUiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2JyZWFrLmpzCmZ1bmN0aW9uIGhhcmRCcmVhazIoc3RhdGUsIG5vZGUyKSB7CiAgY29uc3QgcmVzdWx0ID0geyB0eXBlOiAiZWxlbWVudCIsIHRhZ05hbWU6ICJiciIsIHByb3BlcnRpZXM6IHt9LCBjaGlsZHJlbjogW10gfTsKICBzdGF0ZS5wYXRjaChub2RlMiwgcmVzdWx0KTsKICByZXR1cm4gW3N0YXRlLmFwcGx5RGF0YShub2RlMiwgcmVzdWx0KSwgeyB0eXBlOiAidGV4dCIsIHZhbHVlOiAiXG4iIH1dOwp9Cl9fbmFtZShoYXJkQnJlYWsyLCAiaGFyZEJyZWFrIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9jb2RlLmpzCmZ1bmN0aW9uIGNvZGUzKHN0YXRlLCBub2RlMikgewogIGNvbnN0IHZhbHVlMiA9IG5vZGUyLnZhbHVlID8gbm9kZTIudmFsdWUgKyAiXG4iIDogIiI7CiAgY29uc3QgcHJvcGVydGllczIgPSB7fTsKICBjb25zdCBsYW5ndWFnZSA9IG5vZGUyLmxhbmcgPyBub2RlMi5sYW5nLnNwbGl0KC9ccysvKSA6IFtdOwogIGlmIChsYW5ndWFnZS5sZW5ndGggPiAwKSB7CiAgICBwcm9wZXJ0aWVzMi5jbGFzc05hbWUgPSBbImxhbmd1YWdlLSIgKyBsYW5ndWFnZVswXV07CiAgfQogIGxldCByZXN1bHQgPSB7CiAgICB0eXBlOiAiZWxlbWVudCIsCiAgICB0YWdOYW1lOiAiY29kZSIsCiAgICBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzMiwKICAgIGNoaWxkcmVuOiBbeyB0eXBlOiAidGV4dCIsIHZhbHVlOiB2YWx1ZTIgfV0KICB9OwogIGlmIChub2RlMi5tZXRhKSB7CiAgICByZXN1bHQuZGF0YSA9IHsgbWV0YTogbm9kZTIubWV0YSB9OwogIH0KICBzdGF0ZS5wYXRjaChub2RlMiwgcmVzdWx0KTsKICByZXN1bHQgPSBzdGF0ZS5hcHBseURhdGEobm9kZTIsIHJlc3VsdCk7CiAgcmVzdWx0ID0geyB0eXBlOiAiZWxlbWVudCIsIHRhZ05hbWU6ICJwcmUiLCBwcm9wZXJ0aWVzOiB7fSwgY2hpbGRyZW46IFtyZXN1bHRdIH07CiAgc3RhdGUucGF0Y2gobm9kZTIsIHJlc3VsdCk7CiAgcmV0dXJuIHJlc3VsdDsKfQpfX25hbWUoY29kZTMsICJjb2RlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9kZWxldGUuanMKZnVuY3Rpb24gc3RyaWtldGhyb3VnaChzdGF0ZSwgbm9kZTIpIHsKICBjb25zdCByZXN1bHQgPSB7CiAgICB0eXBlOiAiZWxlbWVudCIsCiAgICB0YWdOYW1lOiAiZGVsIiwKICAgIHByb3BlcnRpZXM6IHt9LAogICAgY2hpbGRyZW46IHN0YXRlLmFsbChub2RlMikKICB9OwogIHN0YXRlLnBhdGNoKG5vZGUyLCByZXN1bHQpOwogIHJldHVybiBzdGF0ZS5hcHBseURhdGEobm9kZTIsIHJlc3VsdCk7Cn0KX19uYW1lKHN0cmlrZXRocm91Z2gsICJzdHJpa2V0aHJvdWdoIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9lbXBoYXNpcy5qcwpmdW5jdGlvbiBlbXBoYXNpczIoc3RhdGUsIG5vZGUyKSB7CiAgY29uc3QgcmVzdWx0ID0gewogICAgdHlwZTogImVsZW1lbnQiLAogICAgdGFnTmFtZTogImVtIiwKICAgIHByb3BlcnRpZXM6IHt9LAogICAgY2hpbGRyZW46IHN0YXRlLmFsbChub2RlMikKICB9OwogIHN0YXRlLnBhdGNoKG5vZGUyLCByZXN1bHQpOwogIHJldHVybiBzdGF0ZS5hcHBseURhdGEobm9kZTIsIHJlc3VsdCk7Cn0KX19uYW1lKGVtcGhhc2lzMiwgImVtcGhhc2lzIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9mb290bm90ZS1yZWZlcmVuY2UuanMKZnVuY3Rpb24gZm9vdG5vdGVSZWZlcmVuY2UyKHN0YXRlLCBub2RlMikgewogIGNvbnN0IGNsb2JiZXJQcmVmaXggPSB0eXBlb2Ygc3RhdGUub3B0aW9ucy5jbG9iYmVyUHJlZml4ID09PSAic3RyaW5nIiA/IHN0YXRlLm9wdGlvbnMuY2xvYmJlclByZWZpeCA6ICJ1c2VyLWNvbnRlbnQtIjsKICBjb25zdCBpZCA9IFN0cmluZyhub2RlMi5pZGVudGlmaWVyKS50b1VwcGVyQ2FzZSgpOwogIGNvbnN0IHNhZmVJZCA9IG5vcm1hbGl6ZVVyaShpZC50b0xvd2VyQ2FzZSgpKTsKICBjb25zdCBpbmRleDIgPSBzdGF0ZS5mb290bm90ZU9yZGVyLmluZGV4T2YoaWQpOwogIGxldCBjb3VudGVyOwogIGxldCByZXVzZUNvdW50ZXIgPSBzdGF0ZS5mb290bm90ZUNvdW50cy5nZXQoaWQpOwogIGlmIChyZXVzZUNvdW50ZXIgPT09IHZvaWQgMCkgewogICAgcmV1c2VDb3VudGVyID0gMDsKICAgIHN0YXRlLmZvb3Rub3RlT3JkZXIucHVzaChpZCk7CiAgICBjb3VudGVyID0gc3RhdGUuZm9vdG5vdGVPcmRlci5sZW5ndGg7CiAgfSBlbHNlIHsKICAgIGNvdW50ZXIgPSBpbmRleDIgKyAxOwogIH0KICByZXVzZUNvdW50ZXIgKz0gMTsKICBzdGF0ZS5mb290bm90ZUNvdW50cy5zZXQoaWQsIHJldXNlQ291bnRlcik7CiAgY29uc3QgbGluazMgPSB7CiAgICB0eXBlOiAiZWxlbWVudCIsCiAgICB0YWdOYW1lOiAiYSIsCiAgICBwcm9wZXJ0aWVzOiB7CiAgICAgIGhyZWY6ICIjIiArIGNsb2JiZXJQcmVmaXggKyAiZm4tIiArIHNhZmVJZCwKICAgICAgaWQ6IGNsb2JiZXJQcmVmaXggKyAiZm5yZWYtIiArIHNhZmVJZCArIChyZXVzZUNvdW50ZXIgPiAxID8gIi0iICsgcmV1c2VDb3VudGVyIDogIiIpLAogICAgICBkYXRhRm9vdG5vdGVSZWY6IHRydWUsCiAgICAgIGFyaWFEZXNjcmliZWRCeTogWyJmb290bm90ZS1sYWJlbCJdCiAgICB9LAogICAgY2hpbGRyZW46IFt7IHR5cGU6ICJ0ZXh0IiwgdmFsdWU6IFN0cmluZyhjb3VudGVyKSB9XQogIH07CiAgc3RhdGUucGF0Y2gobm9kZTIsIGxpbmszKTsKICBjb25zdCBzdXAgPSB7CiAgICB0eXBlOiAiZWxlbWVudCIsCiAgICB0YWdOYW1lOiAic3VwIiwKICAgIHByb3BlcnRpZXM6IHt9LAogICAgY2hpbGRyZW46IFtsaW5rM10KICB9OwogIHN0YXRlLnBhdGNoKG5vZGUyLCBzdXApOwogIHJldHVybiBzdGF0ZS5hcHBseURhdGEobm9kZTIsIHN1cCk7Cn0KX19uYW1lKGZvb3Rub3RlUmVmZXJlbmNlMiwgImZvb3Rub3RlUmVmZXJlbmNlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9oZWFkaW5nLmpzCmZ1bmN0aW9uIGhlYWRpbmcyKHN0YXRlLCBub2RlMikgewogIGNvbnN0IHJlc3VsdCA9IHsKICAgIHR5cGU6ICJlbGVtZW50IiwKICAgIHRhZ05hbWU6ICJoIiArIG5vZGUyLmRlcHRoLAogICAgcHJvcGVydGllczoge30sCiAgICBjaGlsZHJlbjogc3RhdGUuYWxsKG5vZGUyKQogIH07CiAgc3RhdGUucGF0Y2gobm9kZTIsIHJlc3VsdCk7CiAgcmV0dXJuIHN0YXRlLmFwcGx5RGF0YShub2RlMiwgcmVzdWx0KTsKfQpfX25hbWUoaGVhZGluZzIsICJoZWFkaW5nIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9odG1sLmpzCmZ1bmN0aW9uIGh0bWwyKHN0YXRlLCBub2RlMikgewogIGlmIChzdGF0ZS5vcHRpb25zLmFsbG93RGFuZ2Vyb3VzSHRtbCkgewogICAgY29uc3QgcmVzdWx0ID0geyB0eXBlOiAicmF3IiwgdmFsdWU6IG5vZGUyLnZhbHVlIH07CiAgICBzdGF0ZS5wYXRjaChub2RlMiwgcmVzdWx0KTsKICAgIHJldHVybiBzdGF0ZS5hcHBseURhdGEobm9kZTIsIHJlc3VsdCk7CiAgfQogIHJldHVybiB2b2lkIDA7Cn0KX19uYW1lKGh0bWwyLCAiaHRtbCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvcmV2ZXJ0LmpzCmZ1bmN0aW9uIHJldmVydChzdGF0ZSwgbm9kZTIpIHsKICBjb25zdCBzdWJ0eXBlID0gbm9kZTIucmVmZXJlbmNlVHlwZTsKICBsZXQgc3VmZml4ID0gIl0iOwogIGlmIChzdWJ0eXBlID09PSAiY29sbGFwc2VkIikgewogICAgc3VmZml4ICs9ICJbXSI7CiAgfSBlbHNlIGlmIChzdWJ0eXBlID09PSAiZnVsbCIpIHsKICAgIHN1ZmZpeCArPSAiWyIgKyAobm9kZTIubGFiZWwgfHwgbm9kZTIuaWRlbnRpZmllcikgKyAiXSI7CiAgfQogIGlmIChub2RlMi50eXBlID09PSAiaW1hZ2VSZWZlcmVuY2UiKSB7CiAgICByZXR1cm4gW3sgdHlwZTogInRleHQiLCB2YWx1ZTogIiFbIiArIG5vZGUyLmFsdCArIHN1ZmZpeCB9XTsKICB9CiAgY29uc3QgY29udGVudHMgPSBzdGF0ZS5hbGwobm9kZTIpOwogIGNvbnN0IGhlYWQyID0gY29udGVudHNbMF07CiAgaWYgKGhlYWQyICYmIGhlYWQyLnR5cGUgPT09ICJ0ZXh0IikgewogICAgaGVhZDIudmFsdWUgPSAiWyIgKyBoZWFkMi52YWx1ZTsKICB9IGVsc2UgewogICAgY29udGVudHMudW5zaGlmdCh7IHR5cGU6ICJ0ZXh0IiwgdmFsdWU6ICJbIiB9KTsKICB9CiAgY29uc3QgdGFpbCA9IGNvbnRlbnRzW2NvbnRlbnRzLmxlbmd0aCAtIDFdOwogIGlmICh0YWlsICYmIHRhaWwudHlwZSA9PT0gInRleHQiKSB7CiAgICB0YWlsLnZhbHVlICs9IHN1ZmZpeDsKICB9IGVsc2UgewogICAgY29udGVudHMucHVzaCh7IHR5cGU6ICJ0ZXh0IiwgdmFsdWU6IHN1ZmZpeCB9KTsKICB9CiAgcmV0dXJuIGNvbnRlbnRzOwp9Cl9fbmFtZShyZXZlcnQsICJyZXZlcnQiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2ltYWdlLXJlZmVyZW5jZS5qcwpmdW5jdGlvbiBpbWFnZVJlZmVyZW5jZTIoc3RhdGUsIG5vZGUyKSB7CiAgY29uc3QgaWQgPSBTdHJpbmcobm9kZTIuaWRlbnRpZmllcikudG9VcHBlckNhc2UoKTsKICBjb25zdCBkZWZpbml0aW9uMyA9IHN0YXRlLmRlZmluaXRpb25CeUlkLmdldChpZCk7CiAgaWYgKCFkZWZpbml0aW9uMykgewogICAgcmV0dXJuIHJldmVydChzdGF0ZSwgbm9kZTIpOwogIH0KICBjb25zdCBwcm9wZXJ0aWVzMiA9IHsgc3JjOiBub3JtYWxpemVVcmkoZGVmaW5pdGlvbjMudXJsIHx8ICIiKSwgYWx0OiBub2RlMi5hbHQgfTsKICBpZiAoZGVmaW5pdGlvbjMudGl0bGUgIT09IG51bGwgJiYgZGVmaW5pdGlvbjMudGl0bGUgIT09IHZvaWQgMCkgewogICAgcHJvcGVydGllczIudGl0bGUgPSBkZWZpbml0aW9uMy50aXRsZTsKICB9CiAgY29uc3QgcmVzdWx0ID0geyB0eXBlOiAiZWxlbWVudCIsIHRhZ05hbWU6ICJpbWciLCBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzMiwgY2hpbGRyZW46IFtdIH07CiAgc3RhdGUucGF0Y2gobm9kZTIsIHJlc3VsdCk7CiAgcmV0dXJuIHN0YXRlLmFwcGx5RGF0YShub2RlMiwgcmVzdWx0KTsKfQpfX25hbWUoaW1hZ2VSZWZlcmVuY2UyLCAiaW1hZ2VSZWZlcmVuY2UiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2ltYWdlLmpzCmZ1bmN0aW9uIGltYWdlMihzdGF0ZSwgbm9kZTIpIHsKICBjb25zdCBwcm9wZXJ0aWVzMiA9IHsgc3JjOiBub3JtYWxpemVVcmkobm9kZTIudXJsKSB9OwogIGlmIChub2RlMi5hbHQgIT09IG51bGwgJiYgbm9kZTIuYWx0ICE9PSB2b2lkIDApIHsKICAgIHByb3BlcnRpZXMyLmFsdCA9IG5vZGUyLmFsdDsKICB9CiAgaWYgKG5vZGUyLnRpdGxlICE9PSBudWxsICYmIG5vZGUyLnRpdGxlICE9PSB2b2lkIDApIHsKICAgIHByb3BlcnRpZXMyLnRpdGxlID0gbm9kZTIudGl0bGU7CiAgfQogIGNvbnN0IHJlc3VsdCA9IHsgdHlwZTogImVsZW1lbnQiLCB0YWdOYW1lOiAiaW1nIiwgcHJvcGVydGllczogcHJvcGVydGllczIsIGNoaWxkcmVuOiBbXSB9OwogIHN0YXRlLnBhdGNoKG5vZGUyLCByZXN1bHQpOwogIHJldHVybiBzdGF0ZS5hcHBseURhdGEobm9kZTIsIHJlc3VsdCk7Cn0KX19uYW1lKGltYWdlMiwgImltYWdlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9pbmxpbmUtY29kZS5qcwpmdW5jdGlvbiBpbmxpbmVDb2RlMihzdGF0ZSwgbm9kZTIpIHsKICBjb25zdCB0ZXh0OCA9IHsgdHlwZTogInRleHQiLCB2YWx1ZTogbm9kZTIudmFsdWUucmVwbGFjZSgvXHI/XG58XHIvZywgIiAiKSB9OwogIHN0YXRlLnBhdGNoKG5vZGUyLCB0ZXh0OCk7CiAgY29uc3QgcmVzdWx0ID0gewogICAgdHlwZTogImVsZW1lbnQiLAogICAgdGFnTmFtZTogImNvZGUiLAogICAgcHJvcGVydGllczoge30sCiAgICBjaGlsZHJlbjogW3RleHQ4XQogIH07CiAgc3RhdGUucGF0Y2gobm9kZTIsIHJlc3VsdCk7CiAgcmV0dXJuIHN0YXRlLmFwcGx5RGF0YShub2RlMiwgcmVzdWx0KTsKfQpfX25hbWUoaW5saW5lQ29kZTIsICJpbmxpbmVDb2RlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9saW5rLXJlZmVyZW5jZS5qcwpmdW5jdGlvbiBsaW5rUmVmZXJlbmNlMihzdGF0ZSwgbm9kZTIpIHsKICBjb25zdCBpZCA9IFN0cmluZyhub2RlMi5pZGVudGlmaWVyKS50b1VwcGVyQ2FzZSgpOwogIGNvbnN0IGRlZmluaXRpb24zID0gc3RhdGUuZGVmaW5pdGlvbkJ5SWQuZ2V0KGlkKTsKICBpZiAoIWRlZmluaXRpb24zKSB7CiAgICByZXR1cm4gcmV2ZXJ0KHN0YXRlLCBub2RlMik7CiAgfQogIGNvbnN0IHByb3BlcnRpZXMyID0geyBocmVmOiBub3JtYWxpemVVcmkoZGVmaW5pdGlvbjMudXJsIHx8ICIiKSB9OwogIGlmIChkZWZpbml0aW9uMy50aXRsZSAhPT0gbnVsbCAmJiBkZWZpbml0aW9uMy50aXRsZSAhPT0gdm9pZCAwKSB7CiAgICBwcm9wZXJ0aWVzMi50aXRsZSA9IGRlZmluaXRpb24zLnRpdGxlOwogIH0KICBjb25zdCByZXN1bHQgPSB7CiAgICB0eXBlOiAiZWxlbWVudCIsCiAgICB0YWdOYW1lOiAiYSIsCiAgICBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzMiwKICAgIGNoaWxkcmVuOiBzdGF0ZS5hbGwobm9kZTIpCiAgfTsKICBzdGF0ZS5wYXRjaChub2RlMiwgcmVzdWx0KTsKICByZXR1cm4gc3RhdGUuYXBwbHlEYXRhKG5vZGUyLCByZXN1bHQpOwp9Cl9fbmFtZShsaW5rUmVmZXJlbmNlMiwgImxpbmtSZWZlcmVuY2UiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2xpbmsuanMKZnVuY3Rpb24gbGluazIoc3RhdGUsIG5vZGUyKSB7CiAgY29uc3QgcHJvcGVydGllczIgPSB7IGhyZWY6IG5vcm1hbGl6ZVVyaShub2RlMi51cmwpIH07CiAgaWYgKG5vZGUyLnRpdGxlICE9PSBudWxsICYmIG5vZGUyLnRpdGxlICE9PSB2b2lkIDApIHsKICAgIHByb3BlcnRpZXMyLnRpdGxlID0gbm9kZTIudGl0bGU7CiAgfQogIGNvbnN0IHJlc3VsdCA9IHsKICAgIHR5cGU6ICJlbGVtZW50IiwKICAgIHRhZ05hbWU6ICJhIiwKICAgIHByb3BlcnRpZXM6IHByb3BlcnRpZXMyLAogICAgY2hpbGRyZW46IHN0YXRlLmFsbChub2RlMikKICB9OwogIHN0YXRlLnBhdGNoKG5vZGUyLCByZXN1bHQpOwogIHJldHVybiBzdGF0ZS5hcHBseURhdGEobm9kZTIsIHJlc3VsdCk7Cn0KX19uYW1lKGxpbmsyLCAibGluayIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvbGlzdC1pdGVtLmpzCmZ1bmN0aW9uIGxpc3RJdGVtMihzdGF0ZSwgbm9kZTIsIHBhcmVudCkgewogIGNvbnN0IHJlc3VsdHMgPSBzdGF0ZS5hbGwobm9kZTIpOwogIGNvbnN0IGxvb3NlID0gcGFyZW50ID8gbGlzdExvb3NlKHBhcmVudCkgOiBsaXN0SXRlbUxvb3NlKG5vZGUyKTsKICBjb25zdCBwcm9wZXJ0aWVzMiA9IHt9OwogIGNvbnN0IGNoaWxkcmVuMiA9IFtdOwogIGlmICh0eXBlb2Ygbm9kZTIuY2hlY2tlZCA9PT0gImJvb2xlYW4iKSB7CiAgICBjb25zdCBoZWFkMiA9IHJlc3VsdHNbMF07CiAgICBsZXQgcGFyYWdyYXBoMzsKICAgIGlmIChoZWFkMiAmJiBoZWFkMi50eXBlID09PSAiZWxlbWVudCIgJiYgaGVhZDIudGFnTmFtZSA9PT0gInAiKSB7CiAgICAgIHBhcmFncmFwaDMgPSBoZWFkMjsKICAgIH0gZWxzZSB7CiAgICAgIHBhcmFncmFwaDMgPSB7IHR5cGU6ICJlbGVtZW50IiwgdGFnTmFtZTogInAiLCBwcm9wZXJ0aWVzOiB7fSwgY2hpbGRyZW46IFtdIH07CiAgICAgIHJlc3VsdHMudW5zaGlmdChwYXJhZ3JhcGgzKTsKICAgIH0KICAgIGlmIChwYXJhZ3JhcGgzLmNoaWxkcmVuLmxlbmd0aCA+IDApIHsKICAgICAgcGFyYWdyYXBoMy5jaGlsZHJlbi51bnNoaWZ0KHsgdHlwZTogInRleHQiLCB2YWx1ZTogIiAiIH0pOwogICAgfQogICAgcGFyYWdyYXBoMy5jaGlsZHJlbi51bnNoaWZ0KHsKICAgICAgdHlwZTogImVsZW1lbnQiLAogICAgICB0YWdOYW1lOiAiaW5wdXQiLAogICAgICBwcm9wZXJ0aWVzOiB7IHR5cGU6ICJjaGVja2JveCIsIGNoZWNrZWQ6IG5vZGUyLmNoZWNrZWQsIGRpc2FibGVkOiB0cnVlIH0sCiAgICAgIGNoaWxkcmVuOiBbXQogICAgfSk7CiAgICBwcm9wZXJ0aWVzMi5jbGFzc05hbWUgPSBbInRhc2stbGlzdC1pdGVtIl07CiAgfQogIGxldCBpbmRleDIgPSAtMTsKICB3aGlsZSAoKytpbmRleDIgPCByZXN1bHRzLmxlbmd0aCkgewogICAgY29uc3QgY2hpbGQgPSByZXN1bHRzW2luZGV4Ml07CiAgICBpZiAobG9vc2UgfHwgaW5kZXgyICE9PSAwIHx8IGNoaWxkLnR5cGUgIT09ICJlbGVtZW50IiB8fCBjaGlsZC50YWdOYW1lICE9PSAicCIpIHsKICAgICAgY2hpbGRyZW4yLnB1c2goeyB0eXBlOiAidGV4dCIsIHZhbHVlOiAiXG4iIH0pOwogICAgfQogICAgaWYgKGNoaWxkLnR5cGUgPT09ICJlbGVtZW50IiAmJiBjaGlsZC50YWdOYW1lID09PSAicCIgJiYgIWxvb3NlKSB7CiAgICAgIGNoaWxkcmVuMi5wdXNoKC4uLmNoaWxkLmNoaWxkcmVuKTsKICAgIH0gZWxzZSB7CiAgICAgIGNoaWxkcmVuMi5wdXNoKGNoaWxkKTsKICAgIH0KICB9CiAgY29uc3QgdGFpbCA9IHJlc3VsdHNbcmVzdWx0cy5sZW5ndGggLSAxXTsKICBpZiAodGFpbCAmJiAobG9vc2UgfHwgdGFpbC50eXBlICE9PSAiZWxlbWVudCIgfHwgdGFpbC50YWdOYW1lICE9PSAicCIpKSB7CiAgICBjaGlsZHJlbjIucHVzaCh7IHR5cGU6ICJ0ZXh0IiwgdmFsdWU6ICJcbiIgfSk7CiAgfQogIGNvbnN0IHJlc3VsdCA9IHsgdHlwZTogImVsZW1lbnQiLCB0YWdOYW1lOiAibGkiLCBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzMiwgY2hpbGRyZW46IGNoaWxkcmVuMiB9OwogIHN0YXRlLnBhdGNoKG5vZGUyLCByZXN1bHQpOwogIHJldHVybiBzdGF0ZS5hcHBseURhdGEobm9kZTIsIHJlc3VsdCk7Cn0KX19uYW1lKGxpc3RJdGVtMiwgImxpc3RJdGVtIik7CmZ1bmN0aW9uIGxpc3RMb29zZShub2RlMikgewogIGxldCBsb29zZSA9IGZhbHNlOwogIGlmIChub2RlMi50eXBlID09PSAibGlzdCIpIHsKICAgIGxvb3NlID0gbm9kZTIuc3ByZWFkIHx8IGZhbHNlOwogICAgY29uc3QgY2hpbGRyZW4yID0gbm9kZTIuY2hpbGRyZW47CiAgICBsZXQgaW5kZXgyID0gLTE7CiAgICB3aGlsZSAoIWxvb3NlICYmICsraW5kZXgyIDwgY2hpbGRyZW4yLmxlbmd0aCkgewogICAgICBsb29zZSA9IGxpc3RJdGVtTG9vc2UoY2hpbGRyZW4yW2luZGV4Ml0pOwogICAgfQogIH0KICByZXR1cm4gbG9vc2U7Cn0KX19uYW1lKGxpc3RMb29zZSwgImxpc3RMb29zZSIpOwpmdW5jdGlvbiBsaXN0SXRlbUxvb3NlKG5vZGUyKSB7CiAgY29uc3Qgc3ByZWFkID0gbm9kZTIuc3ByZWFkOwogIHJldHVybiBzcHJlYWQgPT09IG51bGwgfHwgc3ByZWFkID09PSB2b2lkIDAgPyBub2RlMi5jaGlsZHJlbi5sZW5ndGggPiAxIDogc3ByZWFkOwp9Cl9fbmFtZShsaXN0SXRlbUxvb3NlLCAibGlzdEl0ZW1Mb29zZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvbGlzdC5qcwpmdW5jdGlvbiBsaXN0NChzdGF0ZSwgbm9kZTIpIHsKICBjb25zdCBwcm9wZXJ0aWVzMiA9IHt9OwogIGNvbnN0IHJlc3VsdHMgPSBzdGF0ZS5hbGwobm9kZTIpOwogIGxldCBpbmRleDIgPSAtMTsKICBpZiAodHlwZW9mIG5vZGUyLnN0YXJ0ID09PSAibnVtYmVyIiAmJiBub2RlMi5zdGFydCAhPT0gMSkgewogICAgcHJvcGVydGllczIuc3RhcnQgPSBub2RlMi5zdGFydDsKICB9CiAgd2hpbGUgKCsraW5kZXgyIDwgcmVzdWx0cy5sZW5ndGgpIHsKICAgIGNvbnN0IGNoaWxkID0gcmVzdWx0c1tpbmRleDJdOwogICAgaWYgKGNoaWxkLnR5cGUgPT09ICJlbGVtZW50IiAmJiBjaGlsZC50YWdOYW1lID09PSAibGkiICYmIGNoaWxkLnByb3BlcnRpZXMgJiYgQXJyYXkuaXNBcnJheShjaGlsZC5wcm9wZXJ0aWVzLmNsYXNzTmFtZSkgJiYgY2hpbGQucHJvcGVydGllcy5jbGFzc05hbWUuaW5jbHVkZXMoInRhc2stbGlzdC1pdGVtIikpIHsKICAgICAgcHJvcGVydGllczIuY2xhc3NOYW1lID0gWyJjb250YWlucy10YXNrLWxpc3QiXTsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIGNvbnN0IHJlc3VsdCA9IHsKICAgIHR5cGU6ICJlbGVtZW50IiwKICAgIHRhZ05hbWU6IG5vZGUyLm9yZGVyZWQgPyAib2wiIDogInVsIiwKICAgIHByb3BlcnRpZXM6IHByb3BlcnRpZXMyLAogICAgY2hpbGRyZW46IHN0YXRlLndyYXAocmVzdWx0cywgdHJ1ZSkKICB9OwogIHN0YXRlLnBhdGNoKG5vZGUyLCByZXN1bHQpOwogIHJldHVybiBzdGF0ZS5hcHBseURhdGEobm9kZTIsIHJlc3VsdCk7Cn0KX19uYW1lKGxpc3Q0LCAibGlzdCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvcGFyYWdyYXBoLmpzCmZ1bmN0aW9uIHBhcmFncmFwaDIoc3RhdGUsIG5vZGUyKSB7CiAgY29uc3QgcmVzdWx0ID0gewogICAgdHlwZTogImVsZW1lbnQiLAogICAgdGFnTmFtZTogInAiLAogICAgcHJvcGVydGllczoge30sCiAgICBjaGlsZHJlbjogc3RhdGUuYWxsKG5vZGUyKQogIH07CiAgc3RhdGUucGF0Y2gobm9kZTIsIHJlc3VsdCk7CiAgcmV0dXJuIHN0YXRlLmFwcGx5RGF0YShub2RlMiwgcmVzdWx0KTsKfQpfX25hbWUocGFyYWdyYXBoMiwgInBhcmFncmFwaCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvcm9vdC5qcwpmdW5jdGlvbiByb290MyhzdGF0ZSwgbm9kZTIpIHsKICBjb25zdCByZXN1bHQgPSB7IHR5cGU6ICJyb290IiwgY2hpbGRyZW46IHN0YXRlLndyYXAoc3RhdGUuYWxsKG5vZGUyKSkgfTsKICBzdGF0ZS5wYXRjaChub2RlMiwgcmVzdWx0KTsKICByZXR1cm4gc3RhdGUuYXBwbHlEYXRhKG5vZGUyLCByZXN1bHQpOwp9Cl9fbmFtZShyb290MywgInJvb3QiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL3N0cm9uZy5qcwpmdW5jdGlvbiBzdHJvbmcyKHN0YXRlLCBub2RlMikgewogIGNvbnN0IHJlc3VsdCA9IHsKICAgIHR5cGU6ICJlbGVtZW50IiwKICAgIHRhZ05hbWU6ICJzdHJvbmciLAogICAgcHJvcGVydGllczoge30sCiAgICBjaGlsZHJlbjogc3RhdGUuYWxsKG5vZGUyKQogIH07CiAgc3RhdGUucGF0Y2gobm9kZTIsIHJlc3VsdCk7CiAgcmV0dXJuIHN0YXRlLmFwcGx5RGF0YShub2RlMiwgcmVzdWx0KTsKfQpfX25hbWUoc3Ryb25nMiwgInN0cm9uZyIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvdGFibGUuanMKZnVuY3Rpb24gdGFibGUoc3RhdGUsIG5vZGUyKSB7CiAgY29uc3Qgcm93cyA9IHN0YXRlLmFsbChub2RlMik7CiAgY29uc3QgZmlyc3RSb3cgPSByb3dzLnNoaWZ0KCk7CiAgY29uc3QgdGFibGVDb250ZW50ID0gW107CiAgaWYgKGZpcnN0Um93KSB7CiAgICBjb25zdCBoZWFkMiA9IHsKICAgICAgdHlwZTogImVsZW1lbnQiLAogICAgICB0YWdOYW1lOiAidGhlYWQiLAogICAgICBwcm9wZXJ0aWVzOiB7fSwKICAgICAgY2hpbGRyZW46IHN0YXRlLndyYXAoW2ZpcnN0Um93XSwgdHJ1ZSkKICAgIH07CiAgICBzdGF0ZS5wYXRjaChub2RlMi5jaGlsZHJlblswXSwgaGVhZDIpOwogICAgdGFibGVDb250ZW50LnB1c2goaGVhZDIpOwogIH0KICBpZiAocm93cy5sZW5ndGggPiAwKSB7CiAgICBjb25zdCBib2R5MyA9IHsKICAgICAgdHlwZTogImVsZW1lbnQiLAogICAgICB0YWdOYW1lOiAidGJvZHkiLAogICAgICBwcm9wZXJ0aWVzOiB7fSwKICAgICAgY2hpbGRyZW46IHN0YXRlLndyYXAocm93cywgdHJ1ZSkKICAgIH07CiAgICBjb25zdCBzdGFydCA9IHBvaW50U3RhcnQobm9kZTIuY2hpbGRyZW5bMV0pOwogICAgY29uc3QgZW5kID0gcG9pbnRFbmQobm9kZTIuY2hpbGRyZW5bbm9kZTIuY2hpbGRyZW4ubGVuZ3RoIC0gMV0pOwogICAgaWYgKHN0YXJ0ICYmIGVuZCkgYm9keTMucG9zaXRpb24gPSB7IHN0YXJ0LCBlbmQgfTsKICAgIHRhYmxlQ29udGVudC5wdXNoKGJvZHkzKTsKICB9CiAgY29uc3QgcmVzdWx0ID0gewogICAgdHlwZTogImVsZW1lbnQiLAogICAgdGFnTmFtZTogInRhYmxlIiwKICAgIHByb3BlcnRpZXM6IHt9LAogICAgY2hpbGRyZW46IHN0YXRlLndyYXAodGFibGVDb250ZW50LCB0cnVlKQogIH07CiAgc3RhdGUucGF0Y2gobm9kZTIsIHJlc3VsdCk7CiAgcmV0dXJuIHN0YXRlLmFwcGx5RGF0YShub2RlMiwgcmVzdWx0KTsKfQpfX25hbWUodGFibGUsICJ0YWJsZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvdGFibGUtcm93LmpzCmZ1bmN0aW9uIHRhYmxlUm93KHN0YXRlLCBub2RlMiwgcGFyZW50KSB7CiAgY29uc3Qgc2libGluZ3MyID0gcGFyZW50ID8gcGFyZW50LmNoaWxkcmVuIDogdm9pZCAwOwogIGNvbnN0IHJvd0luZGV4ID0gc2libGluZ3MyID8gc2libGluZ3MyLmluZGV4T2Yobm9kZTIpIDogMTsKICBjb25zdCB0YWdOYW1lID0gcm93SW5kZXggPT09IDAgPyAidGgiIDogInRkIjsKICBjb25zdCBhbGlnbiA9IHBhcmVudCAmJiBwYXJlbnQudHlwZSA9PT0gInRhYmxlIiA/IHBhcmVudC5hbGlnbiA6IHZvaWQgMDsKICBjb25zdCBsZW5ndGggPSBhbGlnbiA/IGFsaWduLmxlbmd0aCA6IG5vZGUyLmNoaWxkcmVuLmxlbmd0aDsKICBsZXQgY2VsbEluZGV4ID0gLTE7CiAgY29uc3QgY2VsbHMyID0gW107CiAgd2hpbGUgKCsrY2VsbEluZGV4IDwgbGVuZ3RoKSB7CiAgICBjb25zdCBjZWxsMiA9IG5vZGUyLmNoaWxkcmVuW2NlbGxJbmRleF07CiAgICBjb25zdCBwcm9wZXJ0aWVzMiA9IHt9OwogICAgY29uc3QgYWxpZ25WYWx1ZSA9IGFsaWduID8gYWxpZ25bY2VsbEluZGV4XSA6IHZvaWQgMDsKICAgIGlmIChhbGlnblZhbHVlKSB7CiAgICAgIHByb3BlcnRpZXMyLmFsaWduID0gYWxpZ25WYWx1ZTsKICAgIH0KICAgIGxldCByZXN1bHQyID0geyB0eXBlOiAiZWxlbWVudCIsIHRhZ05hbWUsIHByb3BlcnRpZXM6IHByb3BlcnRpZXMyLCBjaGlsZHJlbjogW10gfTsKICAgIGlmIChjZWxsMikgewogICAgICByZXN1bHQyLmNoaWxkcmVuID0gc3RhdGUuYWxsKGNlbGwyKTsKICAgICAgc3RhdGUucGF0Y2goY2VsbDIsIHJlc3VsdDIpOwogICAgICByZXN1bHQyID0gc3RhdGUuYXBwbHlEYXRhKGNlbGwyLCByZXN1bHQyKTsKICAgIH0KICAgIGNlbGxzMi5wdXNoKHJlc3VsdDIpOwogIH0KICBjb25zdCByZXN1bHQgPSB7CiAgICB0eXBlOiAiZWxlbWVudCIsCiAgICB0YWdOYW1lOiAidHIiLAogICAgcHJvcGVydGllczoge30sCiAgICBjaGlsZHJlbjogc3RhdGUud3JhcChjZWxsczIsIHRydWUpCiAgfTsKICBzdGF0ZS5wYXRjaChub2RlMiwgcmVzdWx0KTsKICByZXR1cm4gc3RhdGUuYXBwbHlEYXRhKG5vZGUyLCByZXN1bHQpOwp9Cl9fbmFtZSh0YWJsZVJvdywgInRhYmxlUm93Iik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy90YWJsZS1jZWxsLmpzCmZ1bmN0aW9uIHRhYmxlQ2VsbChzdGF0ZSwgbm9kZTIpIHsKICBjb25zdCByZXN1bHQgPSB7CiAgICB0eXBlOiAiZWxlbWVudCIsCiAgICB0YWdOYW1lOiAidGQiLAogICAgLy8gQXNzdW1lIGJvZHkgY2VsbC4KICAgIHByb3BlcnRpZXM6IHt9LAogICAgY2hpbGRyZW46IHN0YXRlLmFsbChub2RlMikKICB9OwogIHN0YXRlLnBhdGNoKG5vZGUyLCByZXN1bHQpOwogIHJldHVybiBzdGF0ZS5hcHBseURhdGEobm9kZTIsIHJlc3VsdCk7Cn0KX19uYW1lKHRhYmxlQ2VsbCwgInRhYmxlQ2VsbCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3RyaW0tbGluZXNAMy4wLjEvbm9kZV9tb2R1bGVzL3RyaW0tbGluZXMvaW5kZXguanMKdmFyIHRhYiA9IDk7CnZhciBzcGFjZSA9IDMyOwpmdW5jdGlvbiB0cmltTGluZXModmFsdWUyKSB7CiAgY29uc3Qgc291cmNlID0gU3RyaW5nKHZhbHVlMik7CiAgY29uc3Qgc2VhcmNoMiA9IC9ccj9cbnxcci9nOwogIGxldCBtYXRjaDIgPSBzZWFyY2gyLmV4ZWMoc291cmNlKTsKICBsZXQgbGFzdDMgPSAwOwogIGNvbnN0IGxpbmVzID0gW107CiAgd2hpbGUgKG1hdGNoMikgewogICAgbGluZXMucHVzaCgKICAgICAgdHJpbUxpbmUoc291cmNlLnNsaWNlKGxhc3QzLCBtYXRjaDIuaW5kZXgpLCBsYXN0MyA+IDAsIHRydWUpLAogICAgICBtYXRjaDJbMF0KICAgICk7CiAgICBsYXN0MyA9IG1hdGNoMi5pbmRleCArIG1hdGNoMlswXS5sZW5ndGg7CiAgICBtYXRjaDIgPSBzZWFyY2gyLmV4ZWMoc291cmNlKTsKICB9CiAgbGluZXMucHVzaCh0cmltTGluZShzb3VyY2Uuc2xpY2UobGFzdDMpLCBsYXN0MyA+IDAsIGZhbHNlKSk7CiAgcmV0dXJuIGxpbmVzLmpvaW4oIiIpOwp9Cl9fbmFtZSh0cmltTGluZXMsICJ0cmltTGluZXMiKTsKZnVuY3Rpb24gdHJpbUxpbmUodmFsdWUyLCBzdGFydCwgZW5kKSB7CiAgbGV0IHN0YXJ0SW5kZXggPSAwOwogIGxldCBlbmRJbmRleCA9IHZhbHVlMi5sZW5ndGg7CiAgaWYgKHN0YXJ0KSB7CiAgICBsZXQgY29kZTQgPSB2YWx1ZTIuY29kZVBvaW50QXQoc3RhcnRJbmRleCk7CiAgICB3aGlsZSAoY29kZTQgPT09IHRhYiB8fCBjb2RlNCA9PT0gc3BhY2UpIHsKICAgICAgc3RhcnRJbmRleCsrOwogICAgICBjb2RlNCA9IHZhbHVlMi5jb2RlUG9pbnRBdChzdGFydEluZGV4KTsKICAgIH0KICB9CiAgaWYgKGVuZCkgewogICAgbGV0IGNvZGU0ID0gdmFsdWUyLmNvZGVQb2ludEF0KGVuZEluZGV4IC0gMSk7CiAgICB3aGlsZSAoY29kZTQgPT09IHRhYiB8fCBjb2RlNCA9PT0gc3BhY2UpIHsKICAgICAgZW5kSW5kZXgtLTsKICAgICAgY29kZTQgPSB2YWx1ZTIuY29kZVBvaW50QXQoZW5kSW5kZXggLSAxKTsKICAgIH0KICB9CiAgcmV0dXJuIGVuZEluZGV4ID4gc3RhcnRJbmRleCA/IHZhbHVlMi5zbGljZShzdGFydEluZGV4LCBlbmRJbmRleCkgOiAiIjsKfQpfX25hbWUodHJpbUxpbmUsICJ0cmltTGluZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvdGV4dC5qcwpmdW5jdGlvbiB0ZXh0NihzdGF0ZSwgbm9kZTIpIHsKICBjb25zdCByZXN1bHQgPSB7IHR5cGU6ICJ0ZXh0IiwgdmFsdWU6IHRyaW1MaW5lcyhTdHJpbmcobm9kZTIudmFsdWUpKSB9OwogIHN0YXRlLnBhdGNoKG5vZGUyLCByZXN1bHQpOwogIHJldHVybiBzdGF0ZS5hcHBseURhdGEobm9kZTIsIHJlc3VsdCk7Cn0KX19uYW1lKHRleHQ2LCAidGV4dCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvdGhlbWF0aWMtYnJlYWsuanMKZnVuY3Rpb24gdGhlbWF0aWNCcmVhazMoc3RhdGUsIG5vZGUyKSB7CiAgY29uc3QgcmVzdWx0ID0gewogICAgdHlwZTogImVsZW1lbnQiLAogICAgdGFnTmFtZTogImhyIiwKICAgIHByb3BlcnRpZXM6IHt9LAogICAgY2hpbGRyZW46IFtdCiAgfTsKICBzdGF0ZS5wYXRjaChub2RlMiwgcmVzdWx0KTsKICByZXR1cm4gc3RhdGUuYXBwbHlEYXRhKG5vZGUyLCByZXN1bHQpOwp9Cl9fbmFtZSh0aGVtYXRpY0JyZWFrMywgInRoZW1hdGljQnJlYWsiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2luZGV4LmpzCnZhciBoYW5kbGVycyA9IHsKICBibG9ja3F1b3RlOiBibG9ja3F1b3RlMiwKICBicmVhazogaGFyZEJyZWFrMiwKICBjb2RlOiBjb2RlMywKICBkZWxldGU6IHN0cmlrZXRocm91Z2gsCiAgZW1waGFzaXM6IGVtcGhhc2lzMiwKICBmb290bm90ZVJlZmVyZW5jZTogZm9vdG5vdGVSZWZlcmVuY2UyLAogIGhlYWRpbmc6IGhlYWRpbmcyLAogIGh0bWw6IGh0bWwyLAogIGltYWdlUmVmZXJlbmNlOiBpbWFnZVJlZmVyZW5jZTIsCiAgaW1hZ2U6IGltYWdlMiwKICBpbmxpbmVDb2RlOiBpbmxpbmVDb2RlMiwKICBsaW5rUmVmZXJlbmNlOiBsaW5rUmVmZXJlbmNlMiwKICBsaW5rOiBsaW5rMiwKICBsaXN0SXRlbTogbGlzdEl0ZW0yLAogIGxpc3Q6IGxpc3Q0LAogIHBhcmFncmFwaDogcGFyYWdyYXBoMiwKICAvLyBAdHMtZXhwZWN0LWVycm9yOiByb290IGlzIGRpZmZlcmVudCwgYnV0IGhhcmQgdG8gdHlwZS4KICByb290OiByb290MywKICBzdHJvbmc6IHN0cm9uZzIsCiAgdGFibGUsCiAgdGFibGVDZWxsLAogIHRhYmxlUm93LAogIHRleHQ6IHRleHQ2LAogIHRoZW1hdGljQnJlYWs6IHRoZW1hdGljQnJlYWszLAogIHRvbWw6IGlnbm9yZSwKICB5YW1sOiBpZ25vcmUsCiAgZGVmaW5pdGlvbjogaWdub3JlLAogIGZvb3Rub3RlRGVmaW5pdGlvbjogaWdub3JlCn07CmZ1bmN0aW9uIGlnbm9yZSgpIHsKICByZXR1cm4gdm9pZCAwOwp9Cl9fbmFtZShpZ25vcmUsICJpZ25vcmUiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2Zvb3Rlci5qcwpmdW5jdGlvbiBkZWZhdWx0Rm9vdG5vdGVCYWNrQ29udGVudChfMywgcmVyZWZlcmVuY2VJbmRleCkgewogIGNvbnN0IHJlc3VsdCA9IFt7IHR5cGU6ICJ0ZXh0IiwgdmFsdWU6ICJcdTIxQTkiIH1dOwogIGlmIChyZXJlZmVyZW5jZUluZGV4ID4gMSkgewogICAgcmVzdWx0LnB1c2goewogICAgICB0eXBlOiAiZWxlbWVudCIsCiAgICAgIHRhZ05hbWU6ICJzdXAiLAogICAgICBwcm9wZXJ0aWVzOiB7fSwKICAgICAgY2hpbGRyZW46IFt7IHR5cGU6ICJ0ZXh0IiwgdmFsdWU6IFN0cmluZyhyZXJlZmVyZW5jZUluZGV4KSB9XQogICAgfSk7CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KX19uYW1lKGRlZmF1bHRGb290bm90ZUJhY2tDb250ZW50LCAiZGVmYXVsdEZvb3Rub3RlQmFja0NvbnRlbnQiKTsKZnVuY3Rpb24gZGVmYXVsdEZvb3Rub3RlQmFja0xhYmVsKHJlZmVyZW5jZUluZGV4LCByZXJlZmVyZW5jZUluZGV4KSB7CiAgcmV0dXJuICJCYWNrIHRvIHJlZmVyZW5jZSAiICsgKHJlZmVyZW5jZUluZGV4ICsgMSkgKyAocmVyZWZlcmVuY2VJbmRleCA+IDEgPyAiLSIgKyByZXJlZmVyZW5jZUluZGV4IDogIiIpOwp9Cl9fbmFtZShkZWZhdWx0Rm9vdG5vdGVCYWNrTGFiZWwsICJkZWZhdWx0Rm9vdG5vdGVCYWNrTGFiZWwiKTsKZnVuY3Rpb24gZm9vdGVyKHN0YXRlKSB7CiAgY29uc3QgY2xvYmJlclByZWZpeCA9IHR5cGVvZiBzdGF0ZS5vcHRpb25zLmNsb2JiZXJQcmVmaXggPT09ICJzdHJpbmciID8gc3RhdGUub3B0aW9ucy5jbG9iYmVyUHJlZml4IDogInVzZXItY29udGVudC0iOwogIGNvbnN0IGZvb3Rub3RlQmFja0NvbnRlbnQgPSBzdGF0ZS5vcHRpb25zLmZvb3Rub3RlQmFja0NvbnRlbnQgfHwgZGVmYXVsdEZvb3Rub3RlQmFja0NvbnRlbnQ7CiAgY29uc3QgZm9vdG5vdGVCYWNrTGFiZWwgPSBzdGF0ZS5vcHRpb25zLmZvb3Rub3RlQmFja0xhYmVsIHx8IGRlZmF1bHRGb290bm90ZUJhY2tMYWJlbDsKICBjb25zdCBmb290bm90ZUxhYmVsID0gc3RhdGUub3B0aW9ucy5mb290bm90ZUxhYmVsIHx8ICJGb290bm90ZXMiOwogIGNvbnN0IGZvb3Rub3RlTGFiZWxUYWdOYW1lID0gc3RhdGUub3B0aW9ucy5mb290bm90ZUxhYmVsVGFnTmFtZSB8fCAiaDIiOwogIGNvbnN0IGZvb3Rub3RlTGFiZWxQcm9wZXJ0aWVzID0gc3RhdGUub3B0aW9ucy5mb290bm90ZUxhYmVsUHJvcGVydGllcyB8fCB7CiAgICBjbGFzc05hbWU6IFsic3Itb25seSJdCiAgfTsKICBjb25zdCBsaXN0SXRlbXMgPSBbXTsKICBsZXQgcmVmZXJlbmNlSW5kZXggPSAtMTsKICB3aGlsZSAoKytyZWZlcmVuY2VJbmRleCA8IHN0YXRlLmZvb3Rub3RlT3JkZXIubGVuZ3RoKSB7CiAgICBjb25zdCBkZWZpbml0aW9uMyA9IHN0YXRlLmZvb3Rub3RlQnlJZC5nZXQoCiAgICAgIHN0YXRlLmZvb3Rub3RlT3JkZXJbcmVmZXJlbmNlSW5kZXhdCiAgICApOwogICAgaWYgKCFkZWZpbml0aW9uMykgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGNvbnN0IGNvbnRlbnQzID0gc3RhdGUuYWxsKGRlZmluaXRpb24zKTsKICAgIGNvbnN0IGlkID0gU3RyaW5nKGRlZmluaXRpb24zLmlkZW50aWZpZXIpLnRvVXBwZXJDYXNlKCk7CiAgICBjb25zdCBzYWZlSWQgPSBub3JtYWxpemVVcmkoaWQudG9Mb3dlckNhc2UoKSk7CiAgICBsZXQgcmVyZWZlcmVuY2VJbmRleCA9IDA7CiAgICBjb25zdCBiYWNrUmVmZXJlbmNlcyA9IFtdOwogICAgY29uc3QgY291bnRzID0gc3RhdGUuZm9vdG5vdGVDb3VudHMuZ2V0KGlkKTsKICAgIHdoaWxlIChjb3VudHMgIT09IHZvaWQgMCAmJiArK3JlcmVmZXJlbmNlSW5kZXggPD0gY291bnRzKSB7CiAgICAgIGlmIChiYWNrUmVmZXJlbmNlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgYmFja1JlZmVyZW5jZXMucHVzaCh7IHR5cGU6ICJ0ZXh0IiwgdmFsdWU6ICIgIiB9KTsKICAgICAgfQogICAgICBsZXQgY2hpbGRyZW4yID0gdHlwZW9mIGZvb3Rub3RlQmFja0NvbnRlbnQgPT09ICJzdHJpbmciID8gZm9vdG5vdGVCYWNrQ29udGVudCA6IGZvb3Rub3RlQmFja0NvbnRlbnQocmVmZXJlbmNlSW5kZXgsIHJlcmVmZXJlbmNlSW5kZXgpOwogICAgICBpZiAodHlwZW9mIGNoaWxkcmVuMiA9PT0gInN0cmluZyIpIHsKICAgICAgICBjaGlsZHJlbjIgPSB7IHR5cGU6ICJ0ZXh0IiwgdmFsdWU6IGNoaWxkcmVuMiB9OwogICAgICB9CiAgICAgIGJhY2tSZWZlcmVuY2VzLnB1c2goewogICAgICAgIHR5cGU6ICJlbGVtZW50IiwKICAgICAgICB0YWdOYW1lOiAiYSIsCiAgICAgICAgcHJvcGVydGllczogewogICAgICAgICAgaHJlZjogIiMiICsgY2xvYmJlclByZWZpeCArICJmbnJlZi0iICsgc2FmZUlkICsgKHJlcmVmZXJlbmNlSW5kZXggPiAxID8gIi0iICsgcmVyZWZlcmVuY2VJbmRleCA6ICIiKSwKICAgICAgICAgIGRhdGFGb290bm90ZUJhY2tyZWY6ICIiLAogICAgICAgICAgYXJpYUxhYmVsOiB0eXBlb2YgZm9vdG5vdGVCYWNrTGFiZWwgPT09ICJzdHJpbmciID8gZm9vdG5vdGVCYWNrTGFiZWwgOiBmb290bm90ZUJhY2tMYWJlbChyZWZlcmVuY2VJbmRleCwgcmVyZWZlcmVuY2VJbmRleCksCiAgICAgICAgICBjbGFzc05hbWU6IFsiZGF0YS1mb290bm90ZS1iYWNrcmVmIl0KICAgICAgICB9LAogICAgICAgIGNoaWxkcmVuOiBBcnJheS5pc0FycmF5KGNoaWxkcmVuMikgPyBjaGlsZHJlbjIgOiBbY2hpbGRyZW4yXQogICAgICB9KTsKICAgIH0KICAgIGNvbnN0IHRhaWwgPSBjb250ZW50M1tjb250ZW50My5sZW5ndGggLSAxXTsKICAgIGlmICh0YWlsICYmIHRhaWwudHlwZSA9PT0gImVsZW1lbnQiICYmIHRhaWwudGFnTmFtZSA9PT0gInAiKSB7CiAgICAgIGNvbnN0IHRhaWxUYWlsID0gdGFpbC5jaGlsZHJlblt0YWlsLmNoaWxkcmVuLmxlbmd0aCAtIDFdOwogICAgICBpZiAodGFpbFRhaWwgJiYgdGFpbFRhaWwudHlwZSA9PT0gInRleHQiKSB7CiAgICAgICAgdGFpbFRhaWwudmFsdWUgKz0gIiAiOwogICAgICB9IGVsc2UgewogICAgICAgIHRhaWwuY2hpbGRyZW4ucHVzaCh7IHR5cGU6ICJ0ZXh0IiwgdmFsdWU6ICIgIiB9KTsKICAgICAgfQogICAgICB0YWlsLmNoaWxkcmVuLnB1c2goLi4uYmFja1JlZmVyZW5jZXMpOwogICAgfSBlbHNlIHsKICAgICAgY29udGVudDMucHVzaCguLi5iYWNrUmVmZXJlbmNlcyk7CiAgICB9CiAgICBjb25zdCBsaXN0SXRlbTMgPSB7CiAgICAgIHR5cGU6ICJlbGVtZW50IiwKICAgICAgdGFnTmFtZTogImxpIiwKICAgICAgcHJvcGVydGllczogeyBpZDogY2xvYmJlclByZWZpeCArICJmbi0iICsgc2FmZUlkIH0sCiAgICAgIGNoaWxkcmVuOiBzdGF0ZS53cmFwKGNvbnRlbnQzLCB0cnVlKQogICAgfTsKICAgIHN0YXRlLnBhdGNoKGRlZmluaXRpb24zLCBsaXN0SXRlbTMpOwogICAgbGlzdEl0ZW1zLnB1c2gobGlzdEl0ZW0zKTsKICB9CiAgaWYgKGxpc3RJdGVtcy5sZW5ndGggPT09IDApIHsKICAgIHJldHVybjsKICB9CiAgcmV0dXJuIHsKICAgIHR5cGU6ICJlbGVtZW50IiwKICAgIHRhZ05hbWU6ICJzZWN0aW9uIiwKICAgIHByb3BlcnRpZXM6IHsgZGF0YUZvb3Rub3RlczogdHJ1ZSwgY2xhc3NOYW1lOiBbImZvb3Rub3RlcyJdIH0sCiAgICBjaGlsZHJlbjogWwogICAgICB7CiAgICAgICAgdHlwZTogImVsZW1lbnQiLAogICAgICAgIHRhZ05hbWU6IGZvb3Rub3RlTGFiZWxUYWdOYW1lLAogICAgICAgIHByb3BlcnRpZXM6IHsKICAgICAgICAgIC4uLmVzbV9kZWZhdWx0KGZvb3Rub3RlTGFiZWxQcm9wZXJ0aWVzKSwKICAgICAgICAgIGlkOiAiZm9vdG5vdGUtbGFiZWwiCiAgICAgICAgfSwKICAgICAgICBjaGlsZHJlbjogW3sgdHlwZTogInRleHQiLCB2YWx1ZTogZm9vdG5vdGVMYWJlbCB9XQogICAgICB9LAogICAgICB7IHR5cGU6ICJ0ZXh0IiwgdmFsdWU6ICJcbiIgfSwKICAgICAgewogICAgICAgIHR5cGU6ICJlbGVtZW50IiwKICAgICAgICB0YWdOYW1lOiAib2wiLAogICAgICAgIHByb3BlcnRpZXM6IHt9LAogICAgICAgIGNoaWxkcmVuOiBzdGF0ZS53cmFwKGxpc3RJdGVtcywgdHJ1ZSkKICAgICAgfSwKICAgICAgeyB0eXBlOiAidGV4dCIsIHZhbHVlOiAiXG4iIH0KICAgIF0KICB9Owp9Cl9fbmFtZShmb290ZXIsICJmb290ZXIiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL3N0YXRlLmpzCnZhciBvd244ID0ge30uaGFzT3duUHJvcGVydHk7CnZhciBlbXB0eU9wdGlvbnM1ID0ge307CmZ1bmN0aW9uIGNyZWF0ZVN0YXRlKHRyZWUsIG9wdGlvbnMpIHsKICBjb25zdCBzZXR0aW5ncyA9IG9wdGlvbnMgfHwgZW1wdHlPcHRpb25zNTsKICBjb25zdCBkZWZpbml0aW9uQnlJZCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgY29uc3QgZm9vdG5vdGVCeUlkID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICBjb25zdCBmb290bm90ZUNvdW50cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgY29uc3QgaGFuZGxlcnMyID0geyAuLi5oYW5kbGVycywgLi4uc2V0dGluZ3MuaGFuZGxlcnMgfTsKICBjb25zdCBzdGF0ZSA9IHsKICAgIGFsbDogYWxsMywKICAgIGFwcGx5RGF0YSwKICAgIGRlZmluaXRpb25CeUlkLAogICAgZm9vdG5vdGVCeUlkLAogICAgZm9vdG5vdGVDb3VudHMsCiAgICBmb290bm90ZU9yZGVyOiBbXSwKICAgIGhhbmRsZXJzOiBoYW5kbGVyczIsCiAgICBvbmU6IG9uZTMsCiAgICBvcHRpb25zOiBzZXR0aW5ncywKICAgIHBhdGNoOiBwYXRjaDIsCiAgICB3cmFwOiB3cmFwMwogIH07CiAgdmlzaXQodHJlZSwgZnVuY3Rpb24obm9kZTIpIHsKICAgIGlmIChub2RlMi50eXBlID09PSAiZGVmaW5pdGlvbiIgfHwgbm9kZTIudHlwZSA9PT0gImZvb3Rub3RlRGVmaW5pdGlvbiIpIHsKICAgICAgY29uc3QgbWFwNyA9IG5vZGUyLnR5cGUgPT09ICJkZWZpbml0aW9uIiA/IGRlZmluaXRpb25CeUlkIDogZm9vdG5vdGVCeUlkOwogICAgICBjb25zdCBpZCA9IFN0cmluZyhub2RlMi5pZGVudGlmaWVyKS50b1VwcGVyQ2FzZSgpOwogICAgICBpZiAoIW1hcDcuaGFzKGlkKSkgewogICAgICAgIG1hcDcuc2V0KGlkLCBub2RlMik7CiAgICAgIH0KICAgIH0KICB9KTsKICByZXR1cm4gc3RhdGU7CiAgZnVuY3Rpb24gb25lMyhub2RlMiwgcGFyZW50KSB7CiAgICBjb25zdCB0eXBlNSA9IG5vZGUyLnR5cGU7CiAgICBjb25zdCBoYW5kbGUzID0gc3RhdGUuaGFuZGxlcnNbdHlwZTVdOwogICAgaWYgKG93bjguY2FsbChzdGF0ZS5oYW5kbGVycywgdHlwZTUpICYmIGhhbmRsZTMpIHsKICAgICAgcmV0dXJuIGhhbmRsZTMoc3RhdGUsIG5vZGUyLCBwYXJlbnQpOwogICAgfQogICAgaWYgKHN0YXRlLm9wdGlvbnMucGFzc1Rocm91Z2ggJiYgc3RhdGUub3B0aW9ucy5wYXNzVGhyb3VnaC5pbmNsdWRlcyh0eXBlNSkpIHsKICAgICAgaWYgKCJjaGlsZHJlbiIgaW4gbm9kZTIpIHsKICAgICAgICBjb25zdCB7IGNoaWxkcmVuOiBjaGlsZHJlbjIsIC4uLnNoYWxsb3cgfSA9IG5vZGUyOwogICAgICAgIGNvbnN0IHJlc3VsdCA9IGVzbV9kZWZhdWx0KHNoYWxsb3cpOwogICAgICAgIHJlc3VsdC5jaGlsZHJlbiA9IHN0YXRlLmFsbChub2RlMik7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgICByZXR1cm4gZXNtX2RlZmF1bHQobm9kZTIpOwogICAgfQogICAgY29uc3QgdW5rbm93bjMgPSBzdGF0ZS5vcHRpb25zLnVua25vd25IYW5kbGVyIHx8IGRlZmF1bHRVbmtub3duSGFuZGxlcjsKICAgIHJldHVybiB1bmtub3duMyhzdGF0ZSwgbm9kZTIsIHBhcmVudCk7CiAgfQogIF9fbmFtZShvbmUzLCAib25lIik7CiAgZnVuY3Rpb24gYWxsMyhwYXJlbnQpIHsKICAgIGNvbnN0IHZhbHVlcyA9IFtdOwogICAgaWYgKCJjaGlsZHJlbiIgaW4gcGFyZW50KSB7CiAgICAgIGNvbnN0IG5vZGVzID0gcGFyZW50LmNoaWxkcmVuOwogICAgICBsZXQgaW5kZXgyID0gLTE7CiAgICAgIHdoaWxlICgrK2luZGV4MiA8IG5vZGVzLmxlbmd0aCkgewogICAgICAgIGNvbnN0IHJlc3VsdCA9IHN0YXRlLm9uZShub2Rlc1tpbmRleDJdLCBwYXJlbnQpOwogICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgIGlmIChpbmRleDIgJiYgbm9kZXNbaW5kZXgyIC0gMV0udHlwZSA9PT0gImJyZWFrIikgewogICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocmVzdWx0KSAmJiByZXN1bHQudHlwZSA9PT0gInRleHQiKSB7CiAgICAgICAgICAgICAgcmVzdWx0LnZhbHVlID0gdHJpbU1hcmtkb3duU3BhY2VTdGFydChyZXN1bHQudmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShyZXN1bHQpICYmIHJlc3VsdC50eXBlID09PSAiZWxlbWVudCIpIHsKICAgICAgICAgICAgICBjb25zdCBoZWFkMiA9IHJlc3VsdC5jaGlsZHJlblswXTsKICAgICAgICAgICAgICBpZiAoaGVhZDIgJiYgaGVhZDIudHlwZSA9PT0gInRleHQiKSB7CiAgICAgICAgICAgICAgICBoZWFkMi52YWx1ZSA9IHRyaW1NYXJrZG93blNwYWNlU3RhcnQoaGVhZDIudmFsdWUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkgewogICAgICAgICAgICB2YWx1ZXMucHVzaCguLi5yZXN1bHQpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFsdWVzLnB1c2gocmVzdWx0KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB2YWx1ZXM7CiAgfQogIF9fbmFtZShhbGwzLCAiYWxsIik7Cn0KX19uYW1lKGNyZWF0ZVN0YXRlLCAiY3JlYXRlU3RhdGUiKTsKZnVuY3Rpb24gcGF0Y2gyKGZyb20yLCB0bykgewogIGlmIChmcm9tMi5wb3NpdGlvbikgdG8ucG9zaXRpb24gPSBwb3NpdGlvbjIoZnJvbTIpOwp9Cl9fbmFtZShwYXRjaDIsICJwYXRjaCIpOwpmdW5jdGlvbiBhcHBseURhdGEoZnJvbTIsIHRvKSB7CiAgbGV0IHJlc3VsdCA9IHRvOwogIGlmIChmcm9tMiAmJiBmcm9tMi5kYXRhKSB7CiAgICBjb25zdCBoTmFtZSA9IGZyb20yLmRhdGEuaE5hbWU7CiAgICBjb25zdCBoQ2hpbGRyZW4gPSBmcm9tMi5kYXRhLmhDaGlsZHJlbjsKICAgIGNvbnN0IGhQcm9wZXJ0aWVzID0gZnJvbTIuZGF0YS5oUHJvcGVydGllczsKICAgIGlmICh0eXBlb2YgaE5hbWUgPT09ICJzdHJpbmciKSB7CiAgICAgIGlmIChyZXN1bHQudHlwZSA9PT0gImVsZW1lbnQiKSB7CiAgICAgICAgcmVzdWx0LnRhZ05hbWUgPSBoTmFtZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBjaGlsZHJlbjIgPSAiY2hpbGRyZW4iIGluIHJlc3VsdCA/IHJlc3VsdC5jaGlsZHJlbiA6IFtyZXN1bHRdOwogICAgICAgIHJlc3VsdCA9IHsgdHlwZTogImVsZW1lbnQiLCB0YWdOYW1lOiBoTmFtZSwgcHJvcGVydGllczoge30sIGNoaWxkcmVuOiBjaGlsZHJlbjIgfTsKICAgICAgfQogICAgfQogICAgaWYgKHJlc3VsdC50eXBlID09PSAiZWxlbWVudCIgJiYgaFByb3BlcnRpZXMpIHsKICAgICAgT2JqZWN0LmFzc2lnbihyZXN1bHQucHJvcGVydGllcywgZXNtX2RlZmF1bHQoaFByb3BlcnRpZXMpKTsKICAgIH0KICAgIGlmICgiY2hpbGRyZW4iIGluIHJlc3VsdCAmJiByZXN1bHQuY2hpbGRyZW4gJiYgaENoaWxkcmVuICE9PSBudWxsICYmIGhDaGlsZHJlbiAhPT0gdm9pZCAwKSB7CiAgICAgIHJlc3VsdC5jaGlsZHJlbiA9IGhDaGlsZHJlbjsKICAgIH0KICB9CiAgcmV0dXJuIHJlc3VsdDsKfQpfX25hbWUoYXBwbHlEYXRhLCAiYXBwbHlEYXRhIik7CmZ1bmN0aW9uIGRlZmF1bHRVbmtub3duSGFuZGxlcihzdGF0ZSwgbm9kZTIpIHsKICBjb25zdCBkYXRhID0gbm9kZTIuZGF0YSB8fCB7fTsKICBjb25zdCByZXN1bHQgPSAidmFsdWUiIGluIG5vZGUyICYmICEob3duOC5jYWxsKGRhdGEsICJoUHJvcGVydGllcyIpIHx8IG93bjguY2FsbChkYXRhLCAiaENoaWxkcmVuIikpID8geyB0eXBlOiAidGV4dCIsIHZhbHVlOiBub2RlMi52YWx1ZSB9IDogewogICAgdHlwZTogImVsZW1lbnQiLAogICAgdGFnTmFtZTogImRpdiIsCiAgICBwcm9wZXJ0aWVzOiB7fSwKICAgIGNoaWxkcmVuOiBzdGF0ZS5hbGwobm9kZTIpCiAgfTsKICBzdGF0ZS5wYXRjaChub2RlMiwgcmVzdWx0KTsKICByZXR1cm4gc3RhdGUuYXBwbHlEYXRhKG5vZGUyLCByZXN1bHQpOwp9Cl9fbmFtZShkZWZhdWx0VW5rbm93bkhhbmRsZXIsICJkZWZhdWx0VW5rbm93bkhhbmRsZXIiKTsKZnVuY3Rpb24gd3JhcDMobm9kZXMsIGxvb3NlKSB7CiAgY29uc3QgcmVzdWx0ID0gW107CiAgbGV0IGluZGV4MiA9IC0xOwogIGlmIChsb29zZSkgewogICAgcmVzdWx0LnB1c2goeyB0eXBlOiAidGV4dCIsIHZhbHVlOiAiXG4iIH0pOwogIH0KICB3aGlsZSAoKytpbmRleDIgPCBub2Rlcy5sZW5ndGgpIHsKICAgIGlmIChpbmRleDIpIHJlc3VsdC5wdXNoKHsgdHlwZTogInRleHQiLCB2YWx1ZTogIlxuIiB9KTsKICAgIHJlc3VsdC5wdXNoKG5vZGVzW2luZGV4Ml0pOwogIH0KICBpZiAobG9vc2UgJiYgbm9kZXMubGVuZ3RoID4gMCkgewogICAgcmVzdWx0LnB1c2goeyB0eXBlOiAidGV4dCIsIHZhbHVlOiAiXG4iIH0pOwogIH0KICByZXR1cm4gcmVzdWx0Owp9Cl9fbmFtZSh3cmFwMywgIndyYXAiKTsKZnVuY3Rpb24gdHJpbU1hcmtkb3duU3BhY2VTdGFydCh2YWx1ZTIpIHsKICBsZXQgaW5kZXgyID0gMDsKICBsZXQgY29kZTQgPSB2YWx1ZTIuY2hhckNvZGVBdChpbmRleDIpOwogIHdoaWxlIChjb2RlNCA9PT0gOSB8fCBjb2RlNCA9PT0gMzIpIHsKICAgIGluZGV4MisrOwogICAgY29kZTQgPSB2YWx1ZTIuY2hhckNvZGVBdChpbmRleDIpOwogIH0KICByZXR1cm4gdmFsdWUyLnNsaWNlKGluZGV4Mik7Cn0KX19uYW1lKHRyaW1NYXJrZG93blNwYWNlU3RhcnQsICJ0cmltTWFya2Rvd25TcGFjZVN0YXJ0Iik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9pbmRleC5qcwpmdW5jdGlvbiB0b0hhc3QodHJlZSwgb3B0aW9ucykgewogIGNvbnN0IHN0YXRlID0gY3JlYXRlU3RhdGUodHJlZSwgb3B0aW9ucyk7CiAgY29uc3Qgbm9kZTIgPSBzdGF0ZS5vbmUodHJlZSwgdm9pZCAwKTsKICBjb25zdCBmb290ID0gZm9vdGVyKHN0YXRlKTsKICBjb25zdCByZXN1bHQgPSBBcnJheS5pc0FycmF5KG5vZGUyKSA/IHsgdHlwZTogInJvb3QiLCBjaGlsZHJlbjogbm9kZTIgfSA6IG5vZGUyIHx8IHsgdHlwZTogInJvb3QiLCBjaGlsZHJlbjogW10gfTsKICBpZiAoZm9vdCkgewogICAgb2soImNoaWxkcmVuIiBpbiByZXN1bHQpOwogICAgcmVzdWx0LmNoaWxkcmVuLnB1c2goeyB0eXBlOiAidGV4dCIsIHZhbHVlOiAiXG4iIH0sIGZvb3QpOwogIH0KICByZXR1cm4gcmVzdWx0Owp9Cl9fbmFtZSh0b0hhc3QsICJ0b0hhc3QiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9odG1sLXZvaWQtZWxlbWVudHNAMy4wLjAvbm9kZV9tb2R1bGVzL2h0bWwtdm9pZC1lbGVtZW50cy9pbmRleC5qcwp2YXIgaHRtbFZvaWRFbGVtZW50cyA9IFsKICAiYXJlYSIsCiAgImJhc2UiLAogICJiYXNlZm9udCIsCiAgImJnc291bmQiLAogICJiciIsCiAgImNvbCIsCiAgImNvbW1hbmQiLAogICJlbWJlZCIsCiAgImZyYW1lIiwKICAiaHIiLAogICJpbWFnZSIsCiAgImltZyIsCiAgImlucHV0IiwKICAia2V5Z2VuIiwKICAibGluayIsCiAgIm1ldGEiLAogICJwYXJhbSIsCiAgInNvdXJjZSIsCiAgInRyYWNrIiwKICAid2JyIgpdOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3Byb3BlcnR5LWluZm9ybWF0aW9uQDcuMS4wL25vZGVfbW9kdWxlcy9wcm9wZXJ0eS1pbmZvcm1hdGlvbi9saWIvdXRpbC9zY2hlbWEuanMKdmFyIFNjaGVtYSA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJTY2hlbWEiKTsKICB9CiAgLyoqCiAgICogQHBhcmFtIHtTY2hlbWFUeXBlWydwcm9wZXJ0eSddfSBwcm9wZXJ0eQogICAqICAgUHJvcGVydHkuCiAgICogQHBhcmFtIHtTY2hlbWFUeXBlWydub3JtYWwnXX0gbm9ybWFsCiAgICogICBOb3JtYWwuCiAgICogQHBhcmFtIHtTcGFjZSB8IHVuZGVmaW5lZH0gW3NwYWNlXQogICAqICAgU3BhY2UuCiAgICogQHJldHVybnMKICAgKiAgIFNjaGVtYS4KICAgKi8KICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eSwgbm9ybWFsLCBzcGFjZTIpIHsKICAgIHRoaXMubm9ybWFsID0gbm9ybWFsOwogICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5OwogICAgaWYgKHNwYWNlMikgewogICAgICB0aGlzLnNwYWNlID0gc3BhY2UyOwogICAgfQogIH0KfTsKU2NoZW1hLnByb3RvdHlwZS5ub3JtYWwgPSB7fTsKU2NoZW1hLnByb3RvdHlwZS5wcm9wZXJ0eSA9IHt9OwpTY2hlbWEucHJvdG90eXBlLnNwYWNlID0gdm9pZCAwOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3Byb3BlcnR5LWluZm9ybWF0aW9uQDcuMS4wL25vZGVfbW9kdWxlcy9wcm9wZXJ0eS1pbmZvcm1hdGlvbi9saWIvdXRpbC9tZXJnZS5qcwpmdW5jdGlvbiBtZXJnZTMoZGVmaW5pdGlvbnMsIHNwYWNlMikgewogIGNvbnN0IHByb3BlcnR5ID0ge307CiAgY29uc3Qgbm9ybWFsID0ge307CiAgZm9yIChjb25zdCBkZWZpbml0aW9uMyBvZiBkZWZpbml0aW9ucykgewogICAgT2JqZWN0LmFzc2lnbihwcm9wZXJ0eSwgZGVmaW5pdGlvbjMucHJvcGVydHkpOwogICAgT2JqZWN0LmFzc2lnbihub3JtYWwsIGRlZmluaXRpb24zLm5vcm1hbCk7CiAgfQogIHJldHVybiBuZXcgU2NoZW1hKHByb3BlcnR5LCBub3JtYWwsIHNwYWNlMik7Cn0KX19uYW1lKG1lcmdlMywgIm1lcmdlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcHJvcGVydHktaW5mb3JtYXRpb25ANy4xLjAvbm9kZV9tb2R1bGVzL3Byb3BlcnR5LWluZm9ybWF0aW9uL2xpYi9ub3JtYWxpemUuanMKZnVuY3Rpb24gbm9ybWFsaXplMyh2YWx1ZTIpIHsKICByZXR1cm4gdmFsdWUyLnRvTG93ZXJDYXNlKCk7Cn0KX19uYW1lKG5vcm1hbGl6ZTMsICJub3JtYWxpemUiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL3V0aWwvaW5mby5qcwp2YXIgSW5mbyA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJJbmZvIik7CiAgfQogIC8qKgogICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eQogICAqICAgUHJvcGVydHkuCiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZQogICAqICAgQXR0cmlidXRlLgogICAqIEByZXR1cm5zCiAgICogICBJbmZvLgogICAqLwogIGNvbnN0cnVjdG9yKHByb3BlcnR5LCBhdHRyaWJ1dGUpIHsKICAgIHRoaXMuYXR0cmlidXRlID0gYXR0cmlidXRlOwogICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5OwogIH0KfTsKSW5mby5wcm90b3R5cGUuYXR0cmlidXRlID0gIiI7CkluZm8ucHJvdG90eXBlLmJvb2xlYW5pc2ggPSBmYWxzZTsKSW5mby5wcm90b3R5cGUuYm9vbGVhbiA9IGZhbHNlOwpJbmZvLnByb3RvdHlwZS5jb21tYU9yU3BhY2VTZXBhcmF0ZWQgPSBmYWxzZTsKSW5mby5wcm90b3R5cGUuY29tbWFTZXBhcmF0ZWQgPSBmYWxzZTsKSW5mby5wcm90b3R5cGUuZGVmaW5lZCA9IGZhbHNlOwpJbmZvLnByb3RvdHlwZS5tdXN0VXNlUHJvcGVydHkgPSBmYWxzZTsKSW5mby5wcm90b3R5cGUubnVtYmVyID0gZmFsc2U7CkluZm8ucHJvdG90eXBlLm92ZXJsb2FkZWRCb29sZWFuID0gZmFsc2U7CkluZm8ucHJvdG90eXBlLnByb3BlcnR5ID0gIiI7CkluZm8ucHJvdG90eXBlLnNwYWNlU2VwYXJhdGVkID0gZmFsc2U7CkluZm8ucHJvdG90eXBlLnNwYWNlID0gdm9pZCAwOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3Byb3BlcnR5LWluZm9ybWF0aW9uQDcuMS4wL25vZGVfbW9kdWxlcy9wcm9wZXJ0eS1pbmZvcm1hdGlvbi9saWIvdXRpbC90eXBlcy5qcwp2YXIgdHlwZXNfZXhwb3J0cyA9IHt9OwpfX2V4cG9ydCh0eXBlc19leHBvcnRzLCB7CiAgYm9vbGVhbjogKCkgPT4gYm9vbGVhbiwKICBib29sZWFuaXNoOiAoKSA9PiBib29sZWFuaXNoLAogIGNvbW1hT3JTcGFjZVNlcGFyYXRlZDogKCkgPT4gY29tbWFPclNwYWNlU2VwYXJhdGVkLAogIGNvbW1hU2VwYXJhdGVkOiAoKSA9PiBjb21tYVNlcGFyYXRlZCwKICBudW1iZXI6ICgpID0+IG51bWJlciwKICBvdmVybG9hZGVkQm9vbGVhbjogKCkgPT4gb3ZlcmxvYWRlZEJvb2xlYW4sCiAgc3BhY2VTZXBhcmF0ZWQ6ICgpID0+IHNwYWNlU2VwYXJhdGVkCn0pOwp2YXIgcG93ZXJzID0gMDsKdmFyIGJvb2xlYW4gPSBpbmNyZW1lbnQoKTsKdmFyIGJvb2xlYW5pc2ggPSBpbmNyZW1lbnQoKTsKdmFyIG92ZXJsb2FkZWRCb29sZWFuID0gaW5jcmVtZW50KCk7CnZhciBudW1iZXIgPSBpbmNyZW1lbnQoKTsKdmFyIHNwYWNlU2VwYXJhdGVkID0gaW5jcmVtZW50KCk7CnZhciBjb21tYVNlcGFyYXRlZCA9IGluY3JlbWVudCgpOwp2YXIgY29tbWFPclNwYWNlU2VwYXJhdGVkID0gaW5jcmVtZW50KCk7CmZ1bmN0aW9uIGluY3JlbWVudCgpIHsKICByZXR1cm4gMiAqKiArK3Bvd2VyczsKfQpfX25hbWUoaW5jcmVtZW50LCAiaW5jcmVtZW50Iik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcHJvcGVydHktaW5mb3JtYXRpb25ANy4xLjAvbm9kZV9tb2R1bGVzL3Byb3BlcnR5LWluZm9ybWF0aW9uL2xpYi91dGlsL2RlZmluZWQtaW5mby5qcwp2YXIgY2hlY2tzID0gKAogIC8qKiBAdHlwZSB7UmVhZG9ubHlBcnJheTxrZXlvZiB0eXBlb2YgdHlwZXM+fSAqLwogIE9iamVjdC5rZXlzKHR5cGVzX2V4cG9ydHMpCik7CnZhciBEZWZpbmVkSW5mbyA9IGNsYXNzIGV4dGVuZHMgSW5mbyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiRGVmaW5lZEluZm8iKTsKICB9CiAgLyoqCiAgICogQGNvbnN0cnVjdG9yCiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5CiAgICogICBQcm9wZXJ0eS4KICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlCiAgICogICBBdHRyaWJ1dGUuCiAgICogQHBhcmFtIHtudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkfSBbbWFza10KICAgKiAgIE1hc2suCiAgICogQHBhcmFtIHtTcGFjZSB8IHVuZGVmaW5lZH0gW3NwYWNlXQogICAqICAgU3BhY2UuCiAgICogQHJldHVybnMKICAgKiAgIEluZm8uCiAgICovCiAgY29uc3RydWN0b3IocHJvcGVydHksIGF0dHJpYnV0ZSwgbWFzaywgc3BhY2UyKSB7CiAgICBsZXQgaW5kZXgyID0gLTE7CiAgICBzdXBlcihwcm9wZXJ0eSwgYXR0cmlidXRlKTsKICAgIG1hcmsodGhpcywgInNwYWNlIiwgc3BhY2UyKTsKICAgIGlmICh0eXBlb2YgbWFzayA9PT0gIm51bWJlciIpIHsKICAgICAgd2hpbGUgKCsraW5kZXgyIDwgY2hlY2tzLmxlbmd0aCkgewogICAgICAgIGNvbnN0IGNoZWNrID0gY2hlY2tzW2luZGV4Ml07CiAgICAgICAgbWFyayh0aGlzLCBjaGVja3NbaW5kZXgyXSwgKG1hc2sgJiB0eXBlc19leHBvcnRzW2NoZWNrXSkgPT09IHR5cGVzX2V4cG9ydHNbY2hlY2tdKTsKICAgICAgfQogICAgfQogIH0KfTsKRGVmaW5lZEluZm8ucHJvdG90eXBlLmRlZmluZWQgPSB0cnVlOwpmdW5jdGlvbiBtYXJrKHZhbHVlcywga2V5MiwgdmFsdWUyKSB7CiAgaWYgKHZhbHVlMikgewogICAgdmFsdWVzW2tleTJdID0gdmFsdWUyOwogIH0KfQpfX25hbWUobWFyaywgIm1hcmsiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL3V0aWwvY3JlYXRlLmpzCmZ1bmN0aW9uIGNyZWF0ZTYoZGVmaW5pdGlvbjMpIHsKICBjb25zdCBwcm9wZXJ0aWVzMiA9IHt9OwogIGNvbnN0IG5vcm1hbHMgPSB7fTsKICBmb3IgKGNvbnN0IFtwcm9wZXJ0eSwgdmFsdWUyXSBvZiBPYmplY3QuZW50cmllcyhkZWZpbml0aW9uMy5wcm9wZXJ0aWVzKSkgewogICAgY29uc3QgaW5mbyA9IG5ldyBEZWZpbmVkSW5mbygKICAgICAgcHJvcGVydHksCiAgICAgIGRlZmluaXRpb24zLnRyYW5zZm9ybShkZWZpbml0aW9uMy5hdHRyaWJ1dGVzIHx8IHt9LCBwcm9wZXJ0eSksCiAgICAgIHZhbHVlMiwKICAgICAgZGVmaW5pdGlvbjMuc3BhY2UKICAgICk7CiAgICBpZiAoZGVmaW5pdGlvbjMubXVzdFVzZVByb3BlcnR5ICYmIGRlZmluaXRpb24zLm11c3RVc2VQcm9wZXJ0eS5pbmNsdWRlcyhwcm9wZXJ0eSkpIHsKICAgICAgaW5mby5tdXN0VXNlUHJvcGVydHkgPSB0cnVlOwogICAgfQogICAgcHJvcGVydGllczJbcHJvcGVydHldID0gaW5mbzsKICAgIG5vcm1hbHNbbm9ybWFsaXplMyhwcm9wZXJ0eSldID0gcHJvcGVydHk7CiAgICBub3JtYWxzW25vcm1hbGl6ZTMoaW5mby5hdHRyaWJ1dGUpXSA9IHByb3BlcnR5OwogIH0KICByZXR1cm4gbmV3IFNjaGVtYShwcm9wZXJ0aWVzMiwgbm9ybWFscywgZGVmaW5pdGlvbjMuc3BhY2UpOwp9Cl9fbmFtZShjcmVhdGU2LCAiY3JlYXRlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcHJvcGVydHktaW5mb3JtYXRpb25ANy4xLjAvbm9kZV9tb2R1bGVzL3Byb3BlcnR5LWluZm9ybWF0aW9uL2xpYi9hcmlhLmpzCnZhciBhcmlhMiA9IGNyZWF0ZTYoewogIHByb3BlcnRpZXM6IHsKICAgIGFyaWFBY3RpdmVEZXNjZW5kYW50OiBudWxsLAogICAgYXJpYUF0b21pYzogYm9vbGVhbmlzaCwKICAgIGFyaWFBdXRvQ29tcGxldGU6IG51bGwsCiAgICBhcmlhQnVzeTogYm9vbGVhbmlzaCwKICAgIGFyaWFDaGVja2VkOiBib29sZWFuaXNoLAogICAgYXJpYUNvbENvdW50OiBudW1iZXIsCiAgICBhcmlhQ29sSW5kZXg6IG51bWJlciwKICAgIGFyaWFDb2xTcGFuOiBudW1iZXIsCiAgICBhcmlhQ29udHJvbHM6IHNwYWNlU2VwYXJhdGVkLAogICAgYXJpYUN1cnJlbnQ6IG51bGwsCiAgICBhcmlhRGVzY3JpYmVkQnk6IHNwYWNlU2VwYXJhdGVkLAogICAgYXJpYURldGFpbHM6IG51bGwsCiAgICBhcmlhRGlzYWJsZWQ6IGJvb2xlYW5pc2gsCiAgICBhcmlhRHJvcEVmZmVjdDogc3BhY2VTZXBhcmF0ZWQsCiAgICBhcmlhRXJyb3JNZXNzYWdlOiBudWxsLAogICAgYXJpYUV4cGFuZGVkOiBib29sZWFuaXNoLAogICAgYXJpYUZsb3dUbzogc3BhY2VTZXBhcmF0ZWQsCiAgICBhcmlhR3JhYmJlZDogYm9vbGVhbmlzaCwKICAgIGFyaWFIYXNQb3B1cDogbnVsbCwKICAgIGFyaWFIaWRkZW46IGJvb2xlYW5pc2gsCiAgICBhcmlhSW52YWxpZDogbnVsbCwKICAgIGFyaWFLZXlTaG9ydGN1dHM6IG51bGwsCiAgICBhcmlhTGFiZWw6IG51bGwsCiAgICBhcmlhTGFiZWxsZWRCeTogc3BhY2VTZXBhcmF0ZWQsCiAgICBhcmlhTGV2ZWw6IG51bWJlciwKICAgIGFyaWFMaXZlOiBudWxsLAogICAgYXJpYU1vZGFsOiBib29sZWFuaXNoLAogICAgYXJpYU11bHRpTGluZTogYm9vbGVhbmlzaCwKICAgIGFyaWFNdWx0aVNlbGVjdGFibGU6IGJvb2xlYW5pc2gsCiAgICBhcmlhT3JpZW50YXRpb246IG51bGwsCiAgICBhcmlhT3duczogc3BhY2VTZXBhcmF0ZWQsCiAgICBhcmlhUGxhY2Vob2xkZXI6IG51bGwsCiAgICBhcmlhUG9zSW5TZXQ6IG51bWJlciwKICAgIGFyaWFQcmVzc2VkOiBib29sZWFuaXNoLAogICAgYXJpYVJlYWRPbmx5OiBib29sZWFuaXNoLAogICAgYXJpYVJlbGV2YW50OiBudWxsLAogICAgYXJpYVJlcXVpcmVkOiBib29sZWFuaXNoLAogICAgYXJpYVJvbGVEZXNjcmlwdGlvbjogc3BhY2VTZXBhcmF0ZWQsCiAgICBhcmlhUm93Q291bnQ6IG51bWJlciwKICAgIGFyaWFSb3dJbmRleDogbnVtYmVyLAogICAgYXJpYVJvd1NwYW46IG51bWJlciwKICAgIGFyaWFTZWxlY3RlZDogYm9vbGVhbmlzaCwKICAgIGFyaWFTZXRTaXplOiBudW1iZXIsCiAgICBhcmlhU29ydDogbnVsbCwKICAgIGFyaWFWYWx1ZU1heDogbnVtYmVyLAogICAgYXJpYVZhbHVlTWluOiBudW1iZXIsCiAgICBhcmlhVmFsdWVOb3c6IG51bWJlciwKICAgIGFyaWFWYWx1ZVRleHQ6IG51bGwsCiAgICByb2xlOiBudWxsCiAgfSwKICB0cmFuc2Zvcm0oXzMsIHByb3BlcnR5KSB7CiAgICByZXR1cm4gcHJvcGVydHkgPT09ICJyb2xlIiA/IHByb3BlcnR5IDogImFyaWEtIiArIHByb3BlcnR5LnNsaWNlKDQpLnRvTG93ZXJDYXNlKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL3V0aWwvY2FzZS1zZW5zaXRpdmUtdHJhbnNmb3JtLmpzCmZ1bmN0aW9uIGNhc2VTZW5zaXRpdmVUcmFuc2Zvcm0oYXR0cmlidXRlcywgYXR0cmlidXRlKSB7CiAgcmV0dXJuIGF0dHJpYnV0ZSBpbiBhdHRyaWJ1dGVzID8gYXR0cmlidXRlc1thdHRyaWJ1dGVdIDogYXR0cmlidXRlOwp9Cl9fbmFtZShjYXNlU2Vuc2l0aXZlVHJhbnNmb3JtLCAiY2FzZVNlbnNpdGl2ZVRyYW5zZm9ybSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3Byb3BlcnR5LWluZm9ybWF0aW9uQDcuMS4wL25vZGVfbW9kdWxlcy9wcm9wZXJ0eS1pbmZvcm1hdGlvbi9saWIvdXRpbC9jYXNlLWluc2Vuc2l0aXZlLXRyYW5zZm9ybS5qcwpmdW5jdGlvbiBjYXNlSW5zZW5zaXRpdmVUcmFuc2Zvcm0oYXR0cmlidXRlcywgcHJvcGVydHkpIHsKICByZXR1cm4gY2FzZVNlbnNpdGl2ZVRyYW5zZm9ybShhdHRyaWJ1dGVzLCBwcm9wZXJ0eS50b0xvd2VyQ2FzZSgpKTsKfQpfX25hbWUoY2FzZUluc2Vuc2l0aXZlVHJhbnNmb3JtLCAiY2FzZUluc2Vuc2l0aXZlVHJhbnNmb3JtIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcHJvcGVydHktaW5mb3JtYXRpb25ANy4xLjAvbm9kZV9tb2R1bGVzL3Byb3BlcnR5LWluZm9ybWF0aW9uL2xpYi9odG1sLmpzCnZhciBodG1sMyA9IGNyZWF0ZTYoewogIGF0dHJpYnV0ZXM6IHsKICAgIGFjY2VwdGNoYXJzZXQ6ICJhY2NlcHQtY2hhcnNldCIsCiAgICBjbGFzc25hbWU6ICJjbGFzcyIsCiAgICBodG1sZm9yOiAiZm9yIiwKICAgIGh0dHBlcXVpdjogImh0dHAtZXF1aXYiCiAgfSwKICBtdXN0VXNlUHJvcGVydHk6IFsiY2hlY2tlZCIsICJtdWx0aXBsZSIsICJtdXRlZCIsICJzZWxlY3RlZCJdLAogIHByb3BlcnRpZXM6IHsKICAgIC8vIFN0YW5kYXJkIFByb3BlcnRpZXMuCiAgICBhYmJyOiBudWxsLAogICAgYWNjZXB0OiBjb21tYVNlcGFyYXRlZCwKICAgIGFjY2VwdENoYXJzZXQ6IHNwYWNlU2VwYXJhdGVkLAogICAgYWNjZXNzS2V5OiBzcGFjZVNlcGFyYXRlZCwKICAgIGFjdGlvbjogbnVsbCwKICAgIGFsbG93OiBudWxsLAogICAgYWxsb3dGdWxsU2NyZWVuOiBib29sZWFuLAogICAgYWxsb3dQYXltZW50UmVxdWVzdDogYm9vbGVhbiwKICAgIGFsbG93VXNlck1lZGlhOiBib29sZWFuLAogICAgYWx0OiBudWxsLAogICAgYXM6IG51bGwsCiAgICBhc3luYzogYm9vbGVhbiwKICAgIGF1dG9DYXBpdGFsaXplOiBudWxsLAogICAgYXV0b0NvbXBsZXRlOiBzcGFjZVNlcGFyYXRlZCwKICAgIGF1dG9Gb2N1czogYm9vbGVhbiwKICAgIGF1dG9QbGF5OiBib29sZWFuLAogICAgYmxvY2tpbmc6IHNwYWNlU2VwYXJhdGVkLAogICAgY2FwdHVyZTogbnVsbCwKICAgIGNoYXJTZXQ6IG51bGwsCiAgICBjaGVja2VkOiBib29sZWFuLAogICAgY2l0ZTogbnVsbCwKICAgIGNsYXNzTmFtZTogc3BhY2VTZXBhcmF0ZWQsCiAgICBjb2xzOiBudW1iZXIsCiAgICBjb2xTcGFuOiBudWxsLAogICAgY29udGVudDogbnVsbCwKICAgIGNvbnRlbnRFZGl0YWJsZTogYm9vbGVhbmlzaCwKICAgIGNvbnRyb2xzOiBib29sZWFuLAogICAgY29udHJvbHNMaXN0OiBzcGFjZVNlcGFyYXRlZCwKICAgIGNvb3JkczogbnVtYmVyIHwgY29tbWFTZXBhcmF0ZWQsCiAgICBjcm9zc09yaWdpbjogbnVsbCwKICAgIGRhdGE6IG51bGwsCiAgICBkYXRlVGltZTogbnVsbCwKICAgIGRlY29kaW5nOiBudWxsLAogICAgZGVmYXVsdDogYm9vbGVhbiwKICAgIGRlZmVyOiBib29sZWFuLAogICAgZGlyOiBudWxsLAogICAgZGlyTmFtZTogbnVsbCwKICAgIGRpc2FibGVkOiBib29sZWFuLAogICAgZG93bmxvYWQ6IG92ZXJsb2FkZWRCb29sZWFuLAogICAgZHJhZ2dhYmxlOiBib29sZWFuaXNoLAogICAgZW5jVHlwZTogbnVsbCwKICAgIGVudGVyS2V5SGludDogbnVsbCwKICAgIGZldGNoUHJpb3JpdHk6IG51bGwsCiAgICBmb3JtOiBudWxsLAogICAgZm9ybUFjdGlvbjogbnVsbCwKICAgIGZvcm1FbmNUeXBlOiBudWxsLAogICAgZm9ybU1ldGhvZDogbnVsbCwKICAgIGZvcm1Ob1ZhbGlkYXRlOiBib29sZWFuLAogICAgZm9ybVRhcmdldDogbnVsbCwKICAgIGhlYWRlcnM6IHNwYWNlU2VwYXJhdGVkLAogICAgaGVpZ2h0OiBudW1iZXIsCiAgICBoaWRkZW46IG92ZXJsb2FkZWRCb29sZWFuLAogICAgaGlnaDogbnVtYmVyLAogICAgaHJlZjogbnVsbCwKICAgIGhyZWZMYW5nOiBudWxsLAogICAgaHRtbEZvcjogc3BhY2VTZXBhcmF0ZWQsCiAgICBodHRwRXF1aXY6IHNwYWNlU2VwYXJhdGVkLAogICAgaWQ6IG51bGwsCiAgICBpbWFnZVNpemVzOiBudWxsLAogICAgaW1hZ2VTcmNTZXQ6IG51bGwsCiAgICBpbmVydDogYm9vbGVhbiwKICAgIGlucHV0TW9kZTogbnVsbCwKICAgIGludGVncml0eTogbnVsbCwKICAgIGlzOiBudWxsLAogICAgaXNNYXA6IGJvb2xlYW4sCiAgICBpdGVtSWQ6IG51bGwsCiAgICBpdGVtUHJvcDogc3BhY2VTZXBhcmF0ZWQsCiAgICBpdGVtUmVmOiBzcGFjZVNlcGFyYXRlZCwKICAgIGl0ZW1TY29wZTogYm9vbGVhbiwKICAgIGl0ZW1UeXBlOiBzcGFjZVNlcGFyYXRlZCwKICAgIGtpbmQ6IG51bGwsCiAgICBsYWJlbDogbnVsbCwKICAgIGxhbmc6IG51bGwsCiAgICBsYW5ndWFnZTogbnVsbCwKICAgIGxpc3Q6IG51bGwsCiAgICBsb2FkaW5nOiBudWxsLAogICAgbG9vcDogYm9vbGVhbiwKICAgIGxvdzogbnVtYmVyLAogICAgbWFuaWZlc3Q6IG51bGwsCiAgICBtYXg6IG51bGwsCiAgICBtYXhMZW5ndGg6IG51bWJlciwKICAgIG1lZGlhOiBudWxsLAogICAgbWV0aG9kOiBudWxsLAogICAgbWluOiBudWxsLAogICAgbWluTGVuZ3RoOiBudW1iZXIsCiAgICBtdWx0aXBsZTogYm9vbGVhbiwKICAgIG11dGVkOiBib29sZWFuLAogICAgbmFtZTogbnVsbCwKICAgIG5vbmNlOiBudWxsLAogICAgbm9Nb2R1bGU6IGJvb2xlYW4sCiAgICBub1ZhbGlkYXRlOiBib29sZWFuLAogICAgb25BYm9ydDogbnVsbCwKICAgIG9uQWZ0ZXJQcmludDogbnVsbCwKICAgIG9uQXV4Q2xpY2s6IG51bGwsCiAgICBvbkJlZm9yZU1hdGNoOiBudWxsLAogICAgb25CZWZvcmVQcmludDogbnVsbCwKICAgIG9uQmVmb3JlVG9nZ2xlOiBudWxsLAogICAgb25CZWZvcmVVbmxvYWQ6IG51bGwsCiAgICBvbkJsdXI6IG51bGwsCiAgICBvbkNhbmNlbDogbnVsbCwKICAgIG9uQ2FuUGxheTogbnVsbCwKICAgIG9uQ2FuUGxheVRocm91Z2g6IG51bGwsCiAgICBvbkNoYW5nZTogbnVsbCwKICAgIG9uQ2xpY2s6IG51bGwsCiAgICBvbkNsb3NlOiBudWxsLAogICAgb25Db250ZXh0TG9zdDogbnVsbCwKICAgIG9uQ29udGV4dE1lbnU6IG51bGwsCiAgICBvbkNvbnRleHRSZXN0b3JlZDogbnVsbCwKICAgIG9uQ29weTogbnVsbCwKICAgIG9uQ3VlQ2hhbmdlOiBudWxsLAogICAgb25DdXQ6IG51bGwsCiAgICBvbkRibENsaWNrOiBudWxsLAogICAgb25EcmFnOiBudWxsLAogICAgb25EcmFnRW5kOiBudWxsLAogICAgb25EcmFnRW50ZXI6IG51bGwsCiAgICBvbkRyYWdFeGl0OiBudWxsLAogICAgb25EcmFnTGVhdmU6IG51bGwsCiAgICBvbkRyYWdPdmVyOiBudWxsLAogICAgb25EcmFnU3RhcnQ6IG51bGwsCiAgICBvbkRyb3A6IG51bGwsCiAgICBvbkR1cmF0aW9uQ2hhbmdlOiBudWxsLAogICAgb25FbXB0aWVkOiBudWxsLAogICAgb25FbmRlZDogbnVsbCwKICAgIG9uRXJyb3I6IG51bGwsCiAgICBvbkZvY3VzOiBudWxsLAogICAgb25Gb3JtRGF0YTogbnVsbCwKICAgIG9uSGFzaENoYW5nZTogbnVsbCwKICAgIG9uSW5wdXQ6IG51bGwsCiAgICBvbkludmFsaWQ6IG51bGwsCiAgICBvbktleURvd246IG51bGwsCiAgICBvbktleVByZXNzOiBudWxsLAogICAgb25LZXlVcDogbnVsbCwKICAgIG9uTGFuZ3VhZ2VDaGFuZ2U6IG51bGwsCiAgICBvbkxvYWQ6IG51bGwsCiAgICBvbkxvYWRlZERhdGE6IG51bGwsCiAgICBvbkxvYWRlZE1ldGFkYXRhOiBudWxsLAogICAgb25Mb2FkRW5kOiBudWxsLAogICAgb25Mb2FkU3RhcnQ6IG51bGwsCiAgICBvbk1lc3NhZ2U6IG51bGwsCiAgICBvbk1lc3NhZ2VFcnJvcjogbnVsbCwKICAgIG9uTW91c2VEb3duOiBudWxsLAogICAgb25Nb3VzZUVudGVyOiBudWxsLAogICAgb25Nb3VzZUxlYXZlOiBudWxsLAogICAgb25Nb3VzZU1vdmU6IG51bGwsCiAgICBvbk1vdXNlT3V0OiBudWxsLAogICAgb25Nb3VzZU92ZXI6IG51bGwsCiAgICBvbk1vdXNlVXA6IG51bGwsCiAgICBvbk9mZmxpbmU6IG51bGwsCiAgICBvbk9ubGluZTogbnVsbCwKICAgIG9uUGFnZUhpZGU6IG51bGwsCiAgICBvblBhZ2VTaG93OiBudWxsLAogICAgb25QYXN0ZTogbnVsbCwKICAgIG9uUGF1c2U6IG51bGwsCiAgICBvblBsYXk6IG51bGwsCiAgICBvblBsYXlpbmc6IG51bGwsCiAgICBvblBvcFN0YXRlOiBudWxsLAogICAgb25Qcm9ncmVzczogbnVsbCwKICAgIG9uUmF0ZUNoYW5nZTogbnVsbCwKICAgIG9uUmVqZWN0aW9uSGFuZGxlZDogbnVsbCwKICAgIG9uUmVzZXQ6IG51bGwsCiAgICBvblJlc2l6ZTogbnVsbCwKICAgIG9uU2Nyb2xsOiBudWxsLAogICAgb25TY3JvbGxFbmQ6IG51bGwsCiAgICBvblNlY3VyaXR5UG9saWN5VmlvbGF0aW9uOiBudWxsLAogICAgb25TZWVrZWQ6IG51bGwsCiAgICBvblNlZWtpbmc6IG51bGwsCiAgICBvblNlbGVjdDogbnVsbCwKICAgIG9uU2xvdENoYW5nZTogbnVsbCwKICAgIG9uU3RhbGxlZDogbnVsbCwKICAgIG9uU3RvcmFnZTogbnVsbCwKICAgIG9uU3VibWl0OiBudWxsLAogICAgb25TdXNwZW5kOiBudWxsLAogICAgb25UaW1lVXBkYXRlOiBudWxsLAogICAgb25Ub2dnbGU6IG51bGwsCiAgICBvblVuaGFuZGxlZFJlamVjdGlvbjogbnVsbCwKICAgIG9uVW5sb2FkOiBudWxsLAogICAgb25Wb2x1bWVDaGFuZ2U6IG51bGwsCiAgICBvbldhaXRpbmc6IG51bGwsCiAgICBvbldoZWVsOiBudWxsLAogICAgb3BlbjogYm9vbGVhbiwKICAgIG9wdGltdW06IG51bWJlciwKICAgIHBhdHRlcm46IG51bGwsCiAgICBwaW5nOiBzcGFjZVNlcGFyYXRlZCwKICAgIHBsYWNlaG9sZGVyOiBudWxsLAogICAgcGxheXNJbmxpbmU6IGJvb2xlYW4sCiAgICBwb3BvdmVyOiBudWxsLAogICAgcG9wb3ZlclRhcmdldDogbnVsbCwKICAgIHBvcG92ZXJUYXJnZXRBY3Rpb246IG51bGwsCiAgICBwb3N0ZXI6IG51bGwsCiAgICBwcmVsb2FkOiBudWxsLAogICAgcmVhZE9ubHk6IGJvb2xlYW4sCiAgICByZWZlcnJlclBvbGljeTogbnVsbCwKICAgIHJlbDogc3BhY2VTZXBhcmF0ZWQsCiAgICByZXF1aXJlZDogYm9vbGVhbiwKICAgIHJldmVyc2VkOiBib29sZWFuLAogICAgcm93czogbnVtYmVyLAogICAgcm93U3BhbjogbnVtYmVyLAogICAgc2FuZGJveDogc3BhY2VTZXBhcmF0ZWQsCiAgICBzY29wZTogbnVsbCwKICAgIHNjb3BlZDogYm9vbGVhbiwKICAgIHNlYW1sZXNzOiBib29sZWFuLAogICAgc2VsZWN0ZWQ6IGJvb2xlYW4sCiAgICBzaGFkb3dSb290Q2xvbmFibGU6IGJvb2xlYW4sCiAgICBzaGFkb3dSb290RGVsZWdhdGVzRm9jdXM6IGJvb2xlYW4sCiAgICBzaGFkb3dSb290TW9kZTogbnVsbCwKICAgIHNoYXBlOiBudWxsLAogICAgc2l6ZTogbnVtYmVyLAogICAgc2l6ZXM6IG51bGwsCiAgICBzbG90OiBudWxsLAogICAgc3BhbjogbnVtYmVyLAogICAgc3BlbGxDaGVjazogYm9vbGVhbmlzaCwKICAgIHNyYzogbnVsbCwKICAgIHNyY0RvYzogbnVsbCwKICAgIHNyY0xhbmc6IG51bGwsCiAgICBzcmNTZXQ6IG51bGwsCiAgICBzdGFydDogbnVtYmVyLAogICAgc3RlcDogbnVsbCwKICAgIHN0eWxlOiBudWxsLAogICAgdGFiSW5kZXg6IG51bWJlciwKICAgIHRhcmdldDogbnVsbCwKICAgIHRpdGxlOiBudWxsLAogICAgdHJhbnNsYXRlOiBudWxsLAogICAgdHlwZTogbnVsbCwKICAgIHR5cGVNdXN0TWF0Y2g6IGJvb2xlYW4sCiAgICB1c2VNYXA6IG51bGwsCiAgICB2YWx1ZTogYm9vbGVhbmlzaCwKICAgIHdpZHRoOiBudW1iZXIsCiAgICB3cmFwOiBudWxsLAogICAgd3JpdGluZ1N1Z2dlc3Rpb25zOiBudWxsLAogICAgLy8gTGVnYWN5LgogICAgLy8gU2VlOiBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNvdGhlci1lbGVtZW50cywtYXR0cmlidXRlcy1hbmQtYXBpcwogICAgYWxpZ246IG51bGwsCiAgICAvLyBTZXZlcmFsLiBVc2UgQ1NTIGB0ZXh0LWFsaWduYCBpbnN0ZWFkLAogICAgYUxpbms6IG51bGwsCiAgICAvLyBgPGJvZHk+YC4gVXNlIENTUyBgYTphY3RpdmUge2NvbG9yfWAgaW5zdGVhZAogICAgYXJjaGl2ZTogc3BhY2VTZXBhcmF0ZWQsCiAgICAvLyBgPG9iamVjdD5gLiBMaXN0IG9mIFVSSXMgdG8gYXJjaGl2ZXMKICAgIGF4aXM6IG51bGwsCiAgICAvLyBgPHRkPmAgYW5kIGA8dGg+YC4gVXNlIGBzY29wZWAgb24gYDx0aD5gCiAgICBiYWNrZ3JvdW5kOiBudWxsLAogICAgLy8gYDxib2R5PmAuIFVzZSBDU1MgYGJhY2tncm91bmQtaW1hZ2VgIGluc3RlYWQKICAgIGJnQ29sb3I6IG51bGwsCiAgICAvLyBgPGJvZHk+YCBhbmQgdGFibGUgZWxlbWVudHMuIFVzZSBDU1MgYGJhY2tncm91bmQtY29sb3JgIGluc3RlYWQKICAgIGJvcmRlcjogbnVtYmVyLAogICAgLy8gYDx0YWJsZT5gLiBVc2UgQ1NTIGBib3JkZXItd2lkdGhgIGluc3RlYWQsCiAgICBib3JkZXJDb2xvcjogbnVsbCwKICAgIC8vIGA8dGFibGU+YC4gVXNlIENTUyBgYm9yZGVyLWNvbG9yYCBpbnN0ZWFkLAogICAgYm90dG9tTWFyZ2luOiBudW1iZXIsCiAgICAvLyBgPGJvZHk+YAogICAgY2VsbFBhZGRpbmc6IG51bGwsCiAgICAvLyBgPHRhYmxlPmAKICAgIGNlbGxTcGFjaW5nOiBudWxsLAogICAgLy8gYDx0YWJsZT5gCiAgICBjaGFyOiBudWxsLAogICAgLy8gU2V2ZXJhbCB0YWJsZSBlbGVtZW50cy4gV2hlbiBgYWxpZ249Y2hhcmAsIHNldHMgdGhlIGNoYXJhY3RlciB0byBhbGlnbiBvbgogICAgY2hhck9mZjogbnVsbCwKICAgIC8vIFNldmVyYWwgdGFibGUgZWxlbWVudHMuIFdoZW4gYGNoYXJgLCBvZmZzZXRzIHRoZSBhbGlnbm1lbnQKICAgIGNsYXNzSWQ6IG51bGwsCiAgICAvLyBgPG9iamVjdD5gCiAgICBjbGVhcjogbnVsbCwKICAgIC8vIGA8YnI+YC4gVXNlIENTUyBgY2xlYXJgIGluc3RlYWQKICAgIGNvZGU6IG51bGwsCiAgICAvLyBgPG9iamVjdD5gCiAgICBjb2RlQmFzZTogbnVsbCwKICAgIC8vIGA8b2JqZWN0PmAKICAgIGNvZGVUeXBlOiBudWxsLAogICAgLy8gYDxvYmplY3Q+YAogICAgY29sb3I6IG51bGwsCiAgICAvLyBgPGZvbnQ+YCBhbmQgYDxocj5gLiBVc2UgQ1NTIGluc3RlYWQKICAgIGNvbXBhY3Q6IGJvb2xlYW4sCiAgICAvLyBMaXN0cy4gVXNlIENTUyB0byByZWR1Y2Ugc3BhY2UgYmV0d2VlbiBpdGVtcyBpbnN0ZWFkCiAgICBkZWNsYXJlOiBib29sZWFuLAogICAgLy8gYDxvYmplY3Q+YAogICAgZXZlbnQ6IG51bGwsCiAgICAvLyBgPHNjcmlwdD5gCiAgICBmYWNlOiBudWxsLAogICAgLy8gYDxmb250PmAuIFVzZSBDU1MgaW5zdGVhZAogICAgZnJhbWU6IG51bGwsCiAgICAvLyBgPHRhYmxlPmAKICAgIGZyYW1lQm9yZGVyOiBudWxsLAogICAgLy8gYDxpZnJhbWU+YC4gVXNlIENTUyBgYm9yZGVyYCBpbnN0ZWFkCiAgICBoU3BhY2U6IG51bWJlciwKICAgIC8vIGA8aW1nPmAgYW5kIGA8b2JqZWN0PmAKICAgIGxlZnRNYXJnaW46IG51bWJlciwKICAgIC8vIGA8Ym9keT5gCiAgICBsaW5rOiBudWxsLAogICAgLy8gYDxib2R5PmAuIFVzZSBDU1MgYGE6bGluayB7Y29sb3I6ICp9YCBpbnN0ZWFkCiAgICBsb25nRGVzYzogbnVsbCwKICAgIC8vIGA8ZnJhbWU+YCwgYDxpZnJhbWU+YCwgYW5kIGA8aW1nPmAuIFVzZSBhbiBgPGE+YAogICAgbG93U3JjOiBudWxsLAogICAgLy8gYDxpbWc+YC4gVXNlIGEgYDxwaWN0dXJlPmAKICAgIG1hcmdpbkhlaWdodDogbnVtYmVyLAogICAgLy8gYDxib2R5PmAKICAgIG1hcmdpbldpZHRoOiBudW1iZXIsCiAgICAvLyBgPGJvZHk+YAogICAgbm9SZXNpemU6IGJvb2xlYW4sCiAgICAvLyBgPGZyYW1lPmAKICAgIG5vSHJlZjogYm9vbGVhbiwKICAgIC8vIGA8YXJlYT5gLiBVc2Ugbm8gaHJlZiBpbnN0ZWFkIG9mIGFuIGV4cGxpY2l0IGBub2hyZWZgCiAgICBub1NoYWRlOiBib29sZWFuLAogICAgLy8gYDxocj5gLiBVc2UgYmFja2dyb3VuZC1jb2xvciBhbmQgaGVpZ2h0IGluc3RlYWQgb2YgYm9yZGVycwogICAgbm9XcmFwOiBib29sZWFuLAogICAgLy8gYDx0ZD5gIGFuZCBgPHRoPmAKICAgIG9iamVjdDogbnVsbCwKICAgIC8vIGA8YXBwbGV0PmAKICAgIHByb2ZpbGU6IG51bGwsCiAgICAvLyBgPGhlYWQ+YAogICAgcHJvbXB0OiBudWxsLAogICAgLy8gYDxpc2luZGV4PmAKICAgIHJldjogbnVsbCwKICAgIC8vIGA8bGluaz5gCiAgICByaWdodE1hcmdpbjogbnVtYmVyLAogICAgLy8gYDxib2R5PmAKICAgIHJ1bGVzOiBudWxsLAogICAgLy8gYDx0YWJsZT5gCiAgICBzY2hlbWU6IG51bGwsCiAgICAvLyBgPG1ldGE+YAogICAgc2Nyb2xsaW5nOiBib29sZWFuaXNoLAogICAgLy8gYDxmcmFtZT5gLiBVc2Ugb3ZlcmZsb3cgaW4gdGhlIGNoaWxkIGNvbnRleHQKICAgIHN0YW5kYnk6IG51bGwsCiAgICAvLyBgPG9iamVjdD5gCiAgICBzdW1tYXJ5OiBudWxsLAogICAgLy8gYDx0YWJsZT5gCiAgICB0ZXh0OiBudWxsLAogICAgLy8gYDxib2R5PmAuIFVzZSBDU1MgYGNvbG9yYCBpbnN0ZWFkCiAgICB0b3BNYXJnaW46IG51bWJlciwKICAgIC8vIGA8Ym9keT5gCiAgICB2YWx1ZVR5cGU6IG51bGwsCiAgICAvLyBgPHBhcmFtPmAKICAgIHZlcnNpb246IG51bGwsCiAgICAvLyBgPGh0bWw+YC4gVXNlIGEgZG9jdHlwZS4KICAgIHZBbGlnbjogbnVsbCwKICAgIC8vIFNldmVyYWwuIFVzZSBDU1MgYHZlcnRpY2FsLWFsaWduYCBpbnN0ZWFkCiAgICB2TGluazogbnVsbCwKICAgIC8vIGA8Ym9keT5gLiBVc2UgQ1NTIGBhOnZpc2l0ZWQge2NvbG9yfWAgaW5zdGVhZAogICAgdlNwYWNlOiBudW1iZXIsCiAgICAvLyBgPGltZz5gIGFuZCBgPG9iamVjdD5gCiAgICAvLyBOb24tc3RhbmRhcmQgUHJvcGVydGllcy4KICAgIGFsbG93VHJhbnNwYXJlbmN5OiBudWxsLAogICAgYXV0b0NvcnJlY3Q6IG51bGwsCiAgICBhdXRvU2F2ZTogbnVsbCwKICAgIGRpc2FibGVQaWN0dXJlSW5QaWN0dXJlOiBib29sZWFuLAogICAgZGlzYWJsZVJlbW90ZVBsYXliYWNrOiBib29sZWFuLAogICAgcHJlZml4OiBudWxsLAogICAgcHJvcGVydHk6IG51bGwsCiAgICByZXN1bHRzOiBudW1iZXIsCiAgICBzZWN1cml0eTogbnVsbCwKICAgIHVuc2VsZWN0YWJsZTogbnVsbAogIH0sCiAgc3BhY2U6ICJodG1sIiwKICB0cmFuc2Zvcm06IGNhc2VJbnNlbnNpdGl2ZVRyYW5zZm9ybQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL3N2Zy5qcwp2YXIgc3ZnID0gY3JlYXRlNih7CiAgYXR0cmlidXRlczogewogICAgYWNjZW50SGVpZ2h0OiAiYWNjZW50LWhlaWdodCIsCiAgICBhbGlnbm1lbnRCYXNlbGluZTogImFsaWdubWVudC1iYXNlbGluZSIsCiAgICBhcmFiaWNGb3JtOiAiYXJhYmljLWZvcm0iLAogICAgYmFzZWxpbmVTaGlmdDogImJhc2VsaW5lLXNoaWZ0IiwKICAgIGNhcEhlaWdodDogImNhcC1oZWlnaHQiLAogICAgY2xhc3NOYW1lOiAiY2xhc3MiLAogICAgY2xpcFBhdGg6ICJjbGlwLXBhdGgiLAogICAgY2xpcFJ1bGU6ICJjbGlwLXJ1bGUiLAogICAgY29sb3JJbnRlcnBvbGF0aW9uOiAiY29sb3ItaW50ZXJwb2xhdGlvbiIsCiAgICBjb2xvckludGVycG9sYXRpb25GaWx0ZXJzOiAiY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzIiwKICAgIGNvbG9yUHJvZmlsZTogImNvbG9yLXByb2ZpbGUiLAogICAgY29sb3JSZW5kZXJpbmc6ICJjb2xvci1yZW5kZXJpbmciLAogICAgY3Jvc3NPcmlnaW46ICJjcm9zc29yaWdpbiIsCiAgICBkYXRhVHlwZTogImRhdGF0eXBlIiwKICAgIGRvbWluYW50QmFzZWxpbmU6ICJkb21pbmFudC1iYXNlbGluZSIsCiAgICBlbmFibGVCYWNrZ3JvdW5kOiAiZW5hYmxlLWJhY2tncm91bmQiLAogICAgZmlsbE9wYWNpdHk6ICJmaWxsLW9wYWNpdHkiLAogICAgZmlsbFJ1bGU6ICJmaWxsLXJ1bGUiLAogICAgZmxvb2RDb2xvcjogImZsb29kLWNvbG9yIiwKICAgIGZsb29kT3BhY2l0eTogImZsb29kLW9wYWNpdHkiLAogICAgZm9udEZhbWlseTogImZvbnQtZmFtaWx5IiwKICAgIGZvbnRTaXplOiAiZm9udC1zaXplIiwKICAgIGZvbnRTaXplQWRqdXN0OiAiZm9udC1zaXplLWFkanVzdCIsCiAgICBmb250U3RyZXRjaDogImZvbnQtc3RyZXRjaCIsCiAgICBmb250U3R5bGU6ICJmb250LXN0eWxlIiwKICAgIGZvbnRWYXJpYW50OiAiZm9udC12YXJpYW50IiwKICAgIGZvbnRXZWlnaHQ6ICJmb250LXdlaWdodCIsCiAgICBnbHlwaE5hbWU6ICJnbHlwaC1uYW1lIiwKICAgIGdseXBoT3JpZW50YXRpb25Ib3Jpem9udGFsOiAiZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbCIsCiAgICBnbHlwaE9yaWVudGF0aW9uVmVydGljYWw6ICJnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbCIsCiAgICBocmVmTGFuZzogImhyZWZsYW5nIiwKICAgIGhvcml6QWR2WDogImhvcml6LWFkdi14IiwKICAgIGhvcml6T3JpZ2luWDogImhvcml6LW9yaWdpbi14IiwKICAgIGhvcml6T3JpZ2luWTogImhvcml6LW9yaWdpbi15IiwKICAgIGltYWdlUmVuZGVyaW5nOiAiaW1hZ2UtcmVuZGVyaW5nIiwKICAgIGxldHRlclNwYWNpbmc6ICJsZXR0ZXItc3BhY2luZyIsCiAgICBsaWdodGluZ0NvbG9yOiAibGlnaHRpbmctY29sb3IiLAogICAgbWFya2VyRW5kOiAibWFya2VyLWVuZCIsCiAgICBtYXJrZXJNaWQ6ICJtYXJrZXItbWlkIiwKICAgIG1hcmtlclN0YXJ0OiAibWFya2VyLXN0YXJ0IiwKICAgIG5hdkRvd246ICJuYXYtZG93biIsCiAgICBuYXZEb3duTGVmdDogIm5hdi1kb3duLWxlZnQiLAogICAgbmF2RG93blJpZ2h0OiAibmF2LWRvd24tcmlnaHQiLAogICAgbmF2TGVmdDogIm5hdi1sZWZ0IiwKICAgIG5hdk5leHQ6ICJuYXYtbmV4dCIsCiAgICBuYXZQcmV2OiAibmF2LXByZXYiLAogICAgbmF2UmlnaHQ6ICJuYXYtcmlnaHQiLAogICAgbmF2VXA6ICJuYXYtdXAiLAogICAgbmF2VXBMZWZ0OiAibmF2LXVwLWxlZnQiLAogICAgbmF2VXBSaWdodDogIm5hdi11cC1yaWdodCIsCiAgICBvbkFib3J0OiAib25hYm9ydCIsCiAgICBvbkFjdGl2YXRlOiAib25hY3RpdmF0ZSIsCiAgICBvbkFmdGVyUHJpbnQ6ICJvbmFmdGVycHJpbnQiLAogICAgb25CZWZvcmVQcmludDogIm9uYmVmb3JlcHJpbnQiLAogICAgb25CZWdpbjogIm9uYmVnaW4iLAogICAgb25DYW5jZWw6ICJvbmNhbmNlbCIsCiAgICBvbkNhblBsYXk6ICJvbmNhbnBsYXkiLAogICAgb25DYW5QbGF5VGhyb3VnaDogIm9uY2FucGxheXRocm91Z2giLAogICAgb25DaGFuZ2U6ICJvbmNoYW5nZSIsCiAgICBvbkNsaWNrOiAib25jbGljayIsCiAgICBvbkNsb3NlOiAib25jbG9zZSIsCiAgICBvbkNvcHk6ICJvbmNvcHkiLAogICAgb25DdWVDaGFuZ2U6ICJvbmN1ZWNoYW5nZSIsCiAgICBvbkN1dDogIm9uY3V0IiwKICAgIG9uRGJsQ2xpY2s6ICJvbmRibGNsaWNrIiwKICAgIG9uRHJhZzogIm9uZHJhZyIsCiAgICBvbkRyYWdFbmQ6ICJvbmRyYWdlbmQiLAogICAgb25EcmFnRW50ZXI6ICJvbmRyYWdlbnRlciIsCiAgICBvbkRyYWdFeGl0OiAib25kcmFnZXhpdCIsCiAgICBvbkRyYWdMZWF2ZTogIm9uZHJhZ2xlYXZlIiwKICAgIG9uRHJhZ092ZXI6ICJvbmRyYWdvdmVyIiwKICAgIG9uRHJhZ1N0YXJ0OiAib25kcmFnc3RhcnQiLAogICAgb25Ecm9wOiAib25kcm9wIiwKICAgIG9uRHVyYXRpb25DaGFuZ2U6ICJvbmR1cmF0aW9uY2hhbmdlIiwKICAgIG9uRW1wdGllZDogIm9uZW1wdGllZCIsCiAgICBvbkVuZDogIm9uZW5kIiwKICAgIG9uRW5kZWQ6ICJvbmVuZGVkIiwKICAgIG9uRXJyb3I6ICJvbmVycm9yIiwKICAgIG9uRm9jdXM6ICJvbmZvY3VzIiwKICAgIG9uRm9jdXNJbjogIm9uZm9jdXNpbiIsCiAgICBvbkZvY3VzT3V0OiAib25mb2N1c291dCIsCiAgICBvbkhhc2hDaGFuZ2U6ICJvbmhhc2hjaGFuZ2UiLAogICAgb25JbnB1dDogIm9uaW5wdXQiLAogICAgb25JbnZhbGlkOiAib25pbnZhbGlkIiwKICAgIG9uS2V5RG93bjogIm9ua2V5ZG93biIsCiAgICBvbktleVByZXNzOiAib25rZXlwcmVzcyIsCiAgICBvbktleVVwOiAib25rZXl1cCIsCiAgICBvbkxvYWQ6ICJvbmxvYWQiLAogICAgb25Mb2FkZWREYXRhOiAib25sb2FkZWRkYXRhIiwKICAgIG9uTG9hZGVkTWV0YWRhdGE6ICJvbmxvYWRlZG1ldGFkYXRhIiwKICAgIG9uTG9hZFN0YXJ0OiAib25sb2Fkc3RhcnQiLAogICAgb25NZXNzYWdlOiAib25tZXNzYWdlIiwKICAgIG9uTW91c2VEb3duOiAib25tb3VzZWRvd24iLAogICAgb25Nb3VzZUVudGVyOiAib25tb3VzZWVudGVyIiwKICAgIG9uTW91c2VMZWF2ZTogIm9ubW91c2VsZWF2ZSIsCiAgICBvbk1vdXNlTW92ZTogIm9ubW91c2Vtb3ZlIiwKICAgIG9uTW91c2VPdXQ6ICJvbm1vdXNlb3V0IiwKICAgIG9uTW91c2VPdmVyOiAib25tb3VzZW92ZXIiLAogICAgb25Nb3VzZVVwOiAib25tb3VzZXVwIiwKICAgIG9uTW91c2VXaGVlbDogIm9ubW91c2V3aGVlbCIsCiAgICBvbk9mZmxpbmU6ICJvbm9mZmxpbmUiLAogICAgb25PbmxpbmU6ICJvbm9ubGluZSIsCiAgICBvblBhZ2VIaWRlOiAib25wYWdlaGlkZSIsCiAgICBvblBhZ2VTaG93OiAib25wYWdlc2hvdyIsCiAgICBvblBhc3RlOiAib25wYXN0ZSIsCiAgICBvblBhdXNlOiAib25wYXVzZSIsCiAgICBvblBsYXk6ICJvbnBsYXkiLAogICAgb25QbGF5aW5nOiAib25wbGF5aW5nIiwKICAgIG9uUG9wU3RhdGU6ICJvbnBvcHN0YXRlIiwKICAgIG9uUHJvZ3Jlc3M6ICJvbnByb2dyZXNzIiwKICAgIG9uUmF0ZUNoYW5nZTogIm9ucmF0ZWNoYW5nZSIsCiAgICBvblJlcGVhdDogIm9ucmVwZWF0IiwKICAgIG9uUmVzZXQ6ICJvbnJlc2V0IiwKICAgIG9uUmVzaXplOiAib25yZXNpemUiLAogICAgb25TY3JvbGw6ICJvbnNjcm9sbCIsCiAgICBvblNlZWtlZDogIm9uc2Vla2VkIiwKICAgIG9uU2Vla2luZzogIm9uc2Vla2luZyIsCiAgICBvblNlbGVjdDogIm9uc2VsZWN0IiwKICAgIG9uU2hvdzogIm9uc2hvdyIsCiAgICBvblN0YWxsZWQ6ICJvbnN0YWxsZWQiLAogICAgb25TdG9yYWdlOiAib25zdG9yYWdlIiwKICAgIG9uU3VibWl0OiAib25zdWJtaXQiLAogICAgb25TdXNwZW5kOiAib25zdXNwZW5kIiwKICAgIG9uVGltZVVwZGF0ZTogIm9udGltZXVwZGF0ZSIsCiAgICBvblRvZ2dsZTogIm9udG9nZ2xlIiwKICAgIG9uVW5sb2FkOiAib251bmxvYWQiLAogICAgb25Wb2x1bWVDaGFuZ2U6ICJvbnZvbHVtZWNoYW5nZSIsCiAgICBvbldhaXRpbmc6ICJvbndhaXRpbmciLAogICAgb25ab29tOiAib256b29tIiwKICAgIG92ZXJsaW5lUG9zaXRpb246ICJvdmVybGluZS1wb3NpdGlvbiIsCiAgICBvdmVybGluZVRoaWNrbmVzczogIm92ZXJsaW5lLXRoaWNrbmVzcyIsCiAgICBwYWludE9yZGVyOiAicGFpbnQtb3JkZXIiLAogICAgcGFub3NlMTogInBhbm9zZS0xIiwKICAgIHBvaW50ZXJFdmVudHM6ICJwb2ludGVyLWV2ZW50cyIsCiAgICByZWZlcnJlclBvbGljeTogInJlZmVycmVycG9saWN5IiwKICAgIHJlbmRlcmluZ0ludGVudDogInJlbmRlcmluZy1pbnRlbnQiLAogICAgc2hhcGVSZW5kZXJpbmc6ICJzaGFwZS1yZW5kZXJpbmciLAogICAgc3RvcENvbG9yOiAic3RvcC1jb2xvciIsCiAgICBzdG9wT3BhY2l0eTogInN0b3Atb3BhY2l0eSIsCiAgICBzdHJpa2V0aHJvdWdoUG9zaXRpb246ICJzdHJpa2V0aHJvdWdoLXBvc2l0aW9uIiwKICAgIHN0cmlrZXRocm91Z2hUaGlja25lc3M6ICJzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcyIsCiAgICBzdHJva2VEYXNoQXJyYXk6ICJzdHJva2UtZGFzaGFycmF5IiwKICAgIHN0cm9rZURhc2hPZmZzZXQ6ICJzdHJva2UtZGFzaG9mZnNldCIsCiAgICBzdHJva2VMaW5lQ2FwOiAic3Ryb2tlLWxpbmVjYXAiLAogICAgc3Ryb2tlTGluZUpvaW46ICJzdHJva2UtbGluZWpvaW4iLAogICAgc3Ryb2tlTWl0ZXJMaW1pdDogInN0cm9rZS1taXRlcmxpbWl0IiwKICAgIHN0cm9rZU9wYWNpdHk6ICJzdHJva2Utb3BhY2l0eSIsCiAgICBzdHJva2VXaWR0aDogInN0cm9rZS13aWR0aCIsCiAgICB0YWJJbmRleDogInRhYmluZGV4IiwKICAgIHRleHRBbmNob3I6ICJ0ZXh0LWFuY2hvciIsCiAgICB0ZXh0RGVjb3JhdGlvbjogInRleHQtZGVjb3JhdGlvbiIsCiAgICB0ZXh0UmVuZGVyaW5nOiAidGV4dC1yZW5kZXJpbmciLAogICAgdHJhbnNmb3JtT3JpZ2luOiAidHJhbnNmb3JtLW9yaWdpbiIsCiAgICB0eXBlT2Y6ICJ0eXBlb2YiLAogICAgdW5kZXJsaW5lUG9zaXRpb246ICJ1bmRlcmxpbmUtcG9zaXRpb24iLAogICAgdW5kZXJsaW5lVGhpY2tuZXNzOiAidW5kZXJsaW5lLXRoaWNrbmVzcyIsCiAgICB1bmljb2RlQmlkaTogInVuaWNvZGUtYmlkaSIsCiAgICB1bmljb2RlUmFuZ2U6ICJ1bmljb2RlLXJhbmdlIiwKICAgIHVuaXRzUGVyRW06ICJ1bml0cy1wZXItZW0iLAogICAgdkFscGhhYmV0aWM6ICJ2LWFscGhhYmV0aWMiLAogICAgdkhhbmdpbmc6ICJ2LWhhbmdpbmciLAogICAgdklkZW9ncmFwaGljOiAidi1pZGVvZ3JhcGhpYyIsCiAgICB2TWF0aGVtYXRpY2FsOiAidi1tYXRoZW1hdGljYWwiLAogICAgdmVjdG9yRWZmZWN0OiAidmVjdG9yLWVmZmVjdCIsCiAgICB2ZXJ0QWR2WTogInZlcnQtYWR2LXkiLAogICAgdmVydE9yaWdpblg6ICJ2ZXJ0LW9yaWdpbi14IiwKICAgIHZlcnRPcmlnaW5ZOiAidmVydC1vcmlnaW4teSIsCiAgICB3b3JkU3BhY2luZzogIndvcmQtc3BhY2luZyIsCiAgICB3cml0aW5nTW9kZTogIndyaXRpbmctbW9kZSIsCiAgICB4SGVpZ2h0OiAieC1oZWlnaHQiLAogICAgLy8gVGhlc2Ugd2VyZSBjYW1lbGNhc2VkIGluIFRpbnkuIE5vdyBsb3dlcmNhc2VkIGluIFNWRyAyCiAgICBwbGF5YmFja09yZGVyOiAicGxheWJhY2tvcmRlciIsCiAgICB0aW1lbGluZUJlZ2luOiAidGltZWxpbmViZWdpbiIKICB9LAogIHByb3BlcnRpZXM6IHsKICAgIGFib3V0OiBjb21tYU9yU3BhY2VTZXBhcmF0ZWQsCiAgICBhY2NlbnRIZWlnaHQ6IG51bWJlciwKICAgIGFjY3VtdWxhdGU6IG51bGwsCiAgICBhZGRpdGl2ZTogbnVsbCwKICAgIGFsaWdubWVudEJhc2VsaW5lOiBudWxsLAogICAgYWxwaGFiZXRpYzogbnVtYmVyLAogICAgYW1wbGl0dWRlOiBudW1iZXIsCiAgICBhcmFiaWNGb3JtOiBudWxsLAogICAgYXNjZW50OiBudW1iZXIsCiAgICBhdHRyaWJ1dGVOYW1lOiBudWxsLAogICAgYXR0cmlidXRlVHlwZTogbnVsbCwKICAgIGF6aW11dGg6IG51bWJlciwKICAgIGJhbmR3aWR0aDogbnVsbCwKICAgIGJhc2VsaW5lU2hpZnQ6IG51bGwsCiAgICBiYXNlRnJlcXVlbmN5OiBudWxsLAogICAgYmFzZVByb2ZpbGU6IG51bGwsCiAgICBiYm94OiBudWxsLAogICAgYmVnaW46IG51bGwsCiAgICBiaWFzOiBudW1iZXIsCiAgICBieTogbnVsbCwKICAgIGNhbGNNb2RlOiBudWxsLAogICAgY2FwSGVpZ2h0OiBudW1iZXIsCiAgICBjbGFzc05hbWU6IHNwYWNlU2VwYXJhdGVkLAogICAgY2xpcDogbnVsbCwKICAgIGNsaXBQYXRoOiBudWxsLAogICAgY2xpcFBhdGhVbml0czogbnVsbCwKICAgIGNsaXBSdWxlOiBudWxsLAogICAgY29sb3I6IG51bGwsCiAgICBjb2xvckludGVycG9sYXRpb246IG51bGwsCiAgICBjb2xvckludGVycG9sYXRpb25GaWx0ZXJzOiBudWxsLAogICAgY29sb3JQcm9maWxlOiBudWxsLAogICAgY29sb3JSZW5kZXJpbmc6IG51bGwsCiAgICBjb250ZW50OiBudWxsLAogICAgY29udGVudFNjcmlwdFR5cGU6IG51bGwsCiAgICBjb250ZW50U3R5bGVUeXBlOiBudWxsLAogICAgY3Jvc3NPcmlnaW46IG51bGwsCiAgICBjdXJzb3I6IG51bGwsCiAgICBjeDogbnVsbCwKICAgIGN5OiBudWxsLAogICAgZDogbnVsbCwKICAgIGRhdGFUeXBlOiBudWxsLAogICAgZGVmYXVsdEFjdGlvbjogbnVsbCwKICAgIGRlc2NlbnQ6IG51bWJlciwKICAgIGRpZmZ1c2VDb25zdGFudDogbnVtYmVyLAogICAgZGlyZWN0aW9uOiBudWxsLAogICAgZGlzcGxheTogbnVsbCwKICAgIGR1cjogbnVsbCwKICAgIGRpdmlzb3I6IG51bWJlciwKICAgIGRvbWluYW50QmFzZWxpbmU6IG51bGwsCiAgICBkb3dubG9hZDogYm9vbGVhbiwKICAgIGR4OiBudWxsLAogICAgZHk6IG51bGwsCiAgICBlZGdlTW9kZTogbnVsbCwKICAgIGVkaXRhYmxlOiBudWxsLAogICAgZWxldmF0aW9uOiBudW1iZXIsCiAgICBlbmFibGVCYWNrZ3JvdW5kOiBudWxsLAogICAgZW5kOiBudWxsLAogICAgZXZlbnQ6IG51bGwsCiAgICBleHBvbmVudDogbnVtYmVyLAogICAgZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZDogbnVsbCwKICAgIGZpbGw6IG51bGwsCiAgICBmaWxsT3BhY2l0eTogbnVtYmVyLAogICAgZmlsbFJ1bGU6IG51bGwsCiAgICBmaWx0ZXI6IG51bGwsCiAgICBmaWx0ZXJSZXM6IG51bGwsCiAgICBmaWx0ZXJVbml0czogbnVsbCwKICAgIGZsb29kQ29sb3I6IG51bGwsCiAgICBmbG9vZE9wYWNpdHk6IG51bGwsCiAgICBmb2N1c2FibGU6IG51bGwsCiAgICBmb2N1c0hpZ2hsaWdodDogbnVsbCwKICAgIGZvbnRGYW1pbHk6IG51bGwsCiAgICBmb250U2l6ZTogbnVsbCwKICAgIGZvbnRTaXplQWRqdXN0OiBudWxsLAogICAgZm9udFN0cmV0Y2g6IG51bGwsCiAgICBmb250U3R5bGU6IG51bGwsCiAgICBmb250VmFyaWFudDogbnVsbCwKICAgIGZvbnRXZWlnaHQ6IG51bGwsCiAgICBmb3JtYXQ6IG51bGwsCiAgICBmcjogbnVsbCwKICAgIGZyb206IG51bGwsCiAgICBmeDogbnVsbCwKICAgIGZ5OiBudWxsLAogICAgZzE6IGNvbW1hU2VwYXJhdGVkLAogICAgZzI6IGNvbW1hU2VwYXJhdGVkLAogICAgZ2x5cGhOYW1lOiBjb21tYVNlcGFyYXRlZCwKICAgIGdseXBoT3JpZW50YXRpb25Ib3Jpem9udGFsOiBudWxsLAogICAgZ2x5cGhPcmllbnRhdGlvblZlcnRpY2FsOiBudWxsLAogICAgZ2x5cGhSZWY6IG51bGwsCiAgICBncmFkaWVudFRyYW5zZm9ybTogbnVsbCwKICAgIGdyYWRpZW50VW5pdHM6IG51bGwsCiAgICBoYW5kbGVyOiBudWxsLAogICAgaGFuZ2luZzogbnVtYmVyLAogICAgaGF0Y2hDb250ZW50VW5pdHM6IG51bGwsCiAgICBoYXRjaFVuaXRzOiBudWxsLAogICAgaGVpZ2h0OiBudWxsLAogICAgaHJlZjogbnVsbCwKICAgIGhyZWZMYW5nOiBudWxsLAogICAgaG9yaXpBZHZYOiBudW1iZXIsCiAgICBob3Jpek9yaWdpblg6IG51bWJlciwKICAgIGhvcml6T3JpZ2luWTogbnVtYmVyLAogICAgaWQ6IG51bGwsCiAgICBpZGVvZ3JhcGhpYzogbnVtYmVyLAogICAgaW1hZ2VSZW5kZXJpbmc6IG51bGwsCiAgICBpbml0aWFsVmlzaWJpbGl0eTogbnVsbCwKICAgIGluOiBudWxsLAogICAgaW4yOiBudWxsLAogICAgaW50ZXJjZXB0OiBudW1iZXIsCiAgICBrOiBudW1iZXIsCiAgICBrMTogbnVtYmVyLAogICAgazI6IG51bWJlciwKICAgIGszOiBudW1iZXIsCiAgICBrNDogbnVtYmVyLAogICAga2VybmVsTWF0cml4OiBjb21tYU9yU3BhY2VTZXBhcmF0ZWQsCiAgICBrZXJuZWxVbml0TGVuZ3RoOiBudWxsLAogICAga2V5UG9pbnRzOiBudWxsLAogICAgLy8gU0VNSV9DT0xPTl9TRVBBUkFURUQKICAgIGtleVNwbGluZXM6IG51bGwsCiAgICAvLyBTRU1JX0NPTE9OX1NFUEFSQVRFRAogICAga2V5VGltZXM6IG51bGwsCiAgICAvLyBTRU1JX0NPTE9OX1NFUEFSQVRFRAogICAga2VybmluZzogbnVsbCwKICAgIGxhbmc6IG51bGwsCiAgICBsZW5ndGhBZGp1c3Q6IG51bGwsCiAgICBsZXR0ZXJTcGFjaW5nOiBudWxsLAogICAgbGlnaHRpbmdDb2xvcjogbnVsbCwKICAgIGxpbWl0aW5nQ29uZUFuZ2xlOiBudW1iZXIsCiAgICBsb2NhbDogbnVsbCwKICAgIG1hcmtlckVuZDogbnVsbCwKICAgIG1hcmtlck1pZDogbnVsbCwKICAgIG1hcmtlclN0YXJ0OiBudWxsLAogICAgbWFya2VySGVpZ2h0OiBudWxsLAogICAgbWFya2VyVW5pdHM6IG51bGwsCiAgICBtYXJrZXJXaWR0aDogbnVsbCwKICAgIG1hc2s6IG51bGwsCiAgICBtYXNrQ29udGVudFVuaXRzOiBudWxsLAogICAgbWFza1VuaXRzOiBudWxsLAogICAgbWF0aGVtYXRpY2FsOiBudWxsLAogICAgbWF4OiBudWxsLAogICAgbWVkaWE6IG51bGwsCiAgICBtZWRpYUNoYXJhY3RlckVuY29kaW5nOiBudWxsLAogICAgbWVkaWFDb250ZW50RW5jb2RpbmdzOiBudWxsLAogICAgbWVkaWFTaXplOiBudW1iZXIsCiAgICBtZWRpYVRpbWU6IG51bGwsCiAgICBtZXRob2Q6IG51bGwsCiAgICBtaW46IG51bGwsCiAgICBtb2RlOiBudWxsLAogICAgbmFtZTogbnVsbCwKICAgIG5hdkRvd246IG51bGwsCiAgICBuYXZEb3duTGVmdDogbnVsbCwKICAgIG5hdkRvd25SaWdodDogbnVsbCwKICAgIG5hdkxlZnQ6IG51bGwsCiAgICBuYXZOZXh0OiBudWxsLAogICAgbmF2UHJldjogbnVsbCwKICAgIG5hdlJpZ2h0OiBudWxsLAogICAgbmF2VXA6IG51bGwsCiAgICBuYXZVcExlZnQ6IG51bGwsCiAgICBuYXZVcFJpZ2h0OiBudWxsLAogICAgbnVtT2N0YXZlczogbnVsbCwKICAgIG9ic2VydmVyOiBudWxsLAogICAgb2Zmc2V0OiBudWxsLAogICAgb25BYm9ydDogbnVsbCwKICAgIG9uQWN0aXZhdGU6IG51bGwsCiAgICBvbkFmdGVyUHJpbnQ6IG51bGwsCiAgICBvbkJlZm9yZVByaW50OiBudWxsLAogICAgb25CZWdpbjogbnVsbCwKICAgIG9uQ2FuY2VsOiBudWxsLAogICAgb25DYW5QbGF5OiBudWxsLAogICAgb25DYW5QbGF5VGhyb3VnaDogbnVsbCwKICAgIG9uQ2hhbmdlOiBudWxsLAogICAgb25DbGljazogbnVsbCwKICAgIG9uQ2xvc2U6IG51bGwsCiAgICBvbkNvcHk6IG51bGwsCiAgICBvbkN1ZUNoYW5nZTogbnVsbCwKICAgIG9uQ3V0OiBudWxsLAogICAgb25EYmxDbGljazogbnVsbCwKICAgIG9uRHJhZzogbnVsbCwKICAgIG9uRHJhZ0VuZDogbnVsbCwKICAgIG9uRHJhZ0VudGVyOiBudWxsLAogICAgb25EcmFnRXhpdDogbnVsbCwKICAgIG9uRHJhZ0xlYXZlOiBudWxsLAogICAgb25EcmFnT3ZlcjogbnVsbCwKICAgIG9uRHJhZ1N0YXJ0OiBudWxsLAogICAgb25Ecm9wOiBudWxsLAogICAgb25EdXJhdGlvbkNoYW5nZTogbnVsbCwKICAgIG9uRW1wdGllZDogbnVsbCwKICAgIG9uRW5kOiBudWxsLAogICAgb25FbmRlZDogbnVsbCwKICAgIG9uRXJyb3I6IG51bGwsCiAgICBvbkZvY3VzOiBudWxsLAogICAgb25Gb2N1c0luOiBudWxsLAogICAgb25Gb2N1c091dDogbnVsbCwKICAgIG9uSGFzaENoYW5nZTogbnVsbCwKICAgIG9uSW5wdXQ6IG51bGwsCiAgICBvbkludmFsaWQ6IG51bGwsCiAgICBvbktleURvd246IG51bGwsCiAgICBvbktleVByZXNzOiBudWxsLAogICAgb25LZXlVcDogbnVsbCwKICAgIG9uTG9hZDogbnVsbCwKICAgIG9uTG9hZGVkRGF0YTogbnVsbCwKICAgIG9uTG9hZGVkTWV0YWRhdGE6IG51bGwsCiAgICBvbkxvYWRTdGFydDogbnVsbCwKICAgIG9uTWVzc2FnZTogbnVsbCwKICAgIG9uTW91c2VEb3duOiBudWxsLAogICAgb25Nb3VzZUVudGVyOiBudWxsLAogICAgb25Nb3VzZUxlYXZlOiBudWxsLAogICAgb25Nb3VzZU1vdmU6IG51bGwsCiAgICBvbk1vdXNlT3V0OiBudWxsLAogICAgb25Nb3VzZU92ZXI6IG51bGwsCiAgICBvbk1vdXNlVXA6IG51bGwsCiAgICBvbk1vdXNlV2hlZWw6IG51bGwsCiAgICBvbk9mZmxpbmU6IG51bGwsCiAgICBvbk9ubGluZTogbnVsbCwKICAgIG9uUGFnZUhpZGU6IG51bGwsCiAgICBvblBhZ2VTaG93OiBudWxsLAogICAgb25QYXN0ZTogbnVsbCwKICAgIG9uUGF1c2U6IG51bGwsCiAgICBvblBsYXk6IG51bGwsCiAgICBvblBsYXlpbmc6IG51bGwsCiAgICBvblBvcFN0YXRlOiBudWxsLAogICAgb25Qcm9ncmVzczogbnVsbCwKICAgIG9uUmF0ZUNoYW5nZTogbnVsbCwKICAgIG9uUmVwZWF0OiBudWxsLAogICAgb25SZXNldDogbnVsbCwKICAgIG9uUmVzaXplOiBudWxsLAogICAgb25TY3JvbGw6IG51bGwsCiAgICBvblNlZWtlZDogbnVsbCwKICAgIG9uU2Vla2luZzogbnVsbCwKICAgIG9uU2VsZWN0OiBudWxsLAogICAgb25TaG93OiBudWxsLAogICAgb25TdGFsbGVkOiBudWxsLAogICAgb25TdG9yYWdlOiBudWxsLAogICAgb25TdWJtaXQ6IG51bGwsCiAgICBvblN1c3BlbmQ6IG51bGwsCiAgICBvblRpbWVVcGRhdGU6IG51bGwsCiAgICBvblRvZ2dsZTogbnVsbCwKICAgIG9uVW5sb2FkOiBudWxsLAogICAgb25Wb2x1bWVDaGFuZ2U6IG51bGwsCiAgICBvbldhaXRpbmc6IG51bGwsCiAgICBvblpvb206IG51bGwsCiAgICBvcGFjaXR5OiBudWxsLAogICAgb3BlcmF0b3I6IG51bGwsCiAgICBvcmRlcjogbnVsbCwKICAgIG9yaWVudDogbnVsbCwKICAgIG9yaWVudGF0aW9uOiBudWxsLAogICAgb3JpZ2luOiBudWxsLAogICAgb3ZlcmZsb3c6IG51bGwsCiAgICBvdmVybGF5OiBudWxsLAogICAgb3ZlcmxpbmVQb3NpdGlvbjogbnVtYmVyLAogICAgb3ZlcmxpbmVUaGlja25lc3M6IG51bWJlciwKICAgIHBhaW50T3JkZXI6IG51bGwsCiAgICBwYW5vc2UxOiBudWxsLAogICAgcGF0aDogbnVsbCwKICAgIHBhdGhMZW5ndGg6IG51bWJlciwKICAgIHBhdHRlcm5Db250ZW50VW5pdHM6IG51bGwsCiAgICBwYXR0ZXJuVHJhbnNmb3JtOiBudWxsLAogICAgcGF0dGVyblVuaXRzOiBudWxsLAogICAgcGhhc2U6IG51bGwsCiAgICBwaW5nOiBzcGFjZVNlcGFyYXRlZCwKICAgIHBpdGNoOiBudWxsLAogICAgcGxheWJhY2tPcmRlcjogbnVsbCwKICAgIHBvaW50ZXJFdmVudHM6IG51bGwsCiAgICBwb2ludHM6IG51bGwsCiAgICBwb2ludHNBdFg6IG51bWJlciwKICAgIHBvaW50c0F0WTogbnVtYmVyLAogICAgcG9pbnRzQXRaOiBudW1iZXIsCiAgICBwcmVzZXJ2ZUFscGhhOiBudWxsLAogICAgcHJlc2VydmVBc3BlY3RSYXRpbzogbnVsbCwKICAgIHByaW1pdGl2ZVVuaXRzOiBudWxsLAogICAgcHJvcGFnYXRlOiBudWxsLAogICAgcHJvcGVydHk6IGNvbW1hT3JTcGFjZVNlcGFyYXRlZCwKICAgIHI6IG51bGwsCiAgICByYWRpdXM6IG51bGwsCiAgICByZWZlcnJlclBvbGljeTogbnVsbCwKICAgIHJlZlg6IG51bGwsCiAgICByZWZZOiBudWxsLAogICAgcmVsOiBjb21tYU9yU3BhY2VTZXBhcmF0ZWQsCiAgICByZXY6IGNvbW1hT3JTcGFjZVNlcGFyYXRlZCwKICAgIHJlbmRlcmluZ0ludGVudDogbnVsbCwKICAgIHJlcGVhdENvdW50OiBudWxsLAogICAgcmVwZWF0RHVyOiBudWxsLAogICAgcmVxdWlyZWRFeHRlbnNpb25zOiBjb21tYU9yU3BhY2VTZXBhcmF0ZWQsCiAgICByZXF1aXJlZEZlYXR1cmVzOiBjb21tYU9yU3BhY2VTZXBhcmF0ZWQsCiAgICByZXF1aXJlZEZvbnRzOiBjb21tYU9yU3BhY2VTZXBhcmF0ZWQsCiAgICByZXF1aXJlZEZvcm1hdHM6IGNvbW1hT3JTcGFjZVNlcGFyYXRlZCwKICAgIHJlc291cmNlOiBudWxsLAogICAgcmVzdGFydDogbnVsbCwKICAgIHJlc3VsdDogbnVsbCwKICAgIHJvdGF0ZTogbnVsbCwKICAgIHJ4OiBudWxsLAogICAgcnk6IG51bGwsCiAgICBzY2FsZTogbnVsbCwKICAgIHNlZWQ6IG51bGwsCiAgICBzaGFwZVJlbmRlcmluZzogbnVsbCwKICAgIHNpZGU6IG51bGwsCiAgICBzbG9wZTogbnVsbCwKICAgIHNuYXBzaG90VGltZTogbnVsbCwKICAgIHNwZWN1bGFyQ29uc3RhbnQ6IG51bWJlciwKICAgIHNwZWN1bGFyRXhwb25lbnQ6IG51bWJlciwKICAgIHNwcmVhZE1ldGhvZDogbnVsbCwKICAgIHNwYWNpbmc6IG51bGwsCiAgICBzdGFydE9mZnNldDogbnVsbCwKICAgIHN0ZERldmlhdGlvbjogbnVsbCwKICAgIHN0ZW1oOiBudWxsLAogICAgc3RlbXY6IG51bGwsCiAgICBzdGl0Y2hUaWxlczogbnVsbCwKICAgIHN0b3BDb2xvcjogbnVsbCwKICAgIHN0b3BPcGFjaXR5OiBudWxsLAogICAgc3RyaWtldGhyb3VnaFBvc2l0aW9uOiBudW1iZXIsCiAgICBzdHJpa2V0aHJvdWdoVGhpY2tuZXNzOiBudW1iZXIsCiAgICBzdHJpbmc6IG51bGwsCiAgICBzdHJva2U6IG51bGwsCiAgICBzdHJva2VEYXNoQXJyYXk6IGNvbW1hT3JTcGFjZVNlcGFyYXRlZCwKICAgIHN0cm9rZURhc2hPZmZzZXQ6IG51bGwsCiAgICBzdHJva2VMaW5lQ2FwOiBudWxsLAogICAgc3Ryb2tlTGluZUpvaW46IG51bGwsCiAgICBzdHJva2VNaXRlckxpbWl0OiBudW1iZXIsCiAgICBzdHJva2VPcGFjaXR5OiBudW1iZXIsCiAgICBzdHJva2VXaWR0aDogbnVsbCwKICAgIHN0eWxlOiBudWxsLAogICAgc3VyZmFjZVNjYWxlOiBudW1iZXIsCiAgICBzeW5jQmVoYXZpb3I6IG51bGwsCiAgICBzeW5jQmVoYXZpb3JEZWZhdWx0OiBudWxsLAogICAgc3luY01hc3RlcjogbnVsbCwKICAgIHN5bmNUb2xlcmFuY2U6IG51bGwsCiAgICBzeW5jVG9sZXJhbmNlRGVmYXVsdDogbnVsbCwKICAgIHN5c3RlbUxhbmd1YWdlOiBjb21tYU9yU3BhY2VTZXBhcmF0ZWQsCiAgICB0YWJJbmRleDogbnVtYmVyLAogICAgdGFibGVWYWx1ZXM6IG51bGwsCiAgICB0YXJnZXQ6IG51bGwsCiAgICB0YXJnZXRYOiBudW1iZXIsCiAgICB0YXJnZXRZOiBudW1iZXIsCiAgICB0ZXh0QW5jaG9yOiBudWxsLAogICAgdGV4dERlY29yYXRpb246IG51bGwsCiAgICB0ZXh0UmVuZGVyaW5nOiBudWxsLAogICAgdGV4dExlbmd0aDogbnVsbCwKICAgIHRpbWVsaW5lQmVnaW46IG51bGwsCiAgICB0aXRsZTogbnVsbCwKICAgIHRyYW5zZm9ybUJlaGF2aW9yOiBudWxsLAogICAgdHlwZTogbnVsbCwKICAgIHR5cGVPZjogY29tbWFPclNwYWNlU2VwYXJhdGVkLAogICAgdG86IG51bGwsCiAgICB0cmFuc2Zvcm06IG51bGwsCiAgICB0cmFuc2Zvcm1PcmlnaW46IG51bGwsCiAgICB1MTogbnVsbCwKICAgIHUyOiBudWxsLAogICAgdW5kZXJsaW5lUG9zaXRpb246IG51bWJlciwKICAgIHVuZGVybGluZVRoaWNrbmVzczogbnVtYmVyLAogICAgdW5pY29kZTogbnVsbCwKICAgIHVuaWNvZGVCaWRpOiBudWxsLAogICAgdW5pY29kZVJhbmdlOiBudWxsLAogICAgdW5pdHNQZXJFbTogbnVtYmVyLAogICAgdmFsdWVzOiBudWxsLAogICAgdkFscGhhYmV0aWM6IG51bWJlciwKICAgIHZNYXRoZW1hdGljYWw6IG51bWJlciwKICAgIHZlY3RvckVmZmVjdDogbnVsbCwKICAgIHZIYW5naW5nOiBudW1iZXIsCiAgICB2SWRlb2dyYXBoaWM6IG51bWJlciwKICAgIHZlcnNpb246IG51bGwsCiAgICB2ZXJ0QWR2WTogbnVtYmVyLAogICAgdmVydE9yaWdpblg6IG51bWJlciwKICAgIHZlcnRPcmlnaW5ZOiBudW1iZXIsCiAgICB2aWV3Qm94OiBudWxsLAogICAgdmlld1RhcmdldDogbnVsbCwKICAgIHZpc2liaWxpdHk6IG51bGwsCiAgICB3aWR0aDogbnVsbCwKICAgIHdpZHRoczogbnVsbCwKICAgIHdvcmRTcGFjaW5nOiBudWxsLAogICAgd3JpdGluZ01vZGU6IG51bGwsCiAgICB4OiBudWxsLAogICAgeDE6IG51bGwsCiAgICB4MjogbnVsbCwKICAgIHhDaGFubmVsU2VsZWN0b3I6IG51bGwsCiAgICB4SGVpZ2h0OiBudW1iZXIsCiAgICB5OiBudWxsLAogICAgeTE6IG51bGwsCiAgICB5MjogbnVsbCwKICAgIHlDaGFubmVsU2VsZWN0b3I6IG51bGwsCiAgICB6OiBudWxsLAogICAgem9vbUFuZFBhbjogbnVsbAogIH0sCiAgc3BhY2U6ICJzdmciLAogIHRyYW5zZm9ybTogY2FzZVNlbnNpdGl2ZVRyYW5zZm9ybQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL3hsaW5rLmpzCnZhciB4bGluayA9IGNyZWF0ZTYoewogIHByb3BlcnRpZXM6IHsKICAgIHhMaW5rQWN0dWF0ZTogbnVsbCwKICAgIHhMaW5rQXJjUm9sZTogbnVsbCwKICAgIHhMaW5rSHJlZjogbnVsbCwKICAgIHhMaW5rUm9sZTogbnVsbCwKICAgIHhMaW5rU2hvdzogbnVsbCwKICAgIHhMaW5rVGl0bGU6IG51bGwsCiAgICB4TGlua1R5cGU6IG51bGwKICB9LAogIHNwYWNlOiAieGxpbmsiLAogIHRyYW5zZm9ybShfMywgcHJvcGVydHkpIHsKICAgIHJldHVybiAieGxpbms6IiArIHByb3BlcnR5LnNsaWNlKDUpLnRvTG93ZXJDYXNlKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL3htbG5zLmpzCnZhciB4bWxucyA9IGNyZWF0ZTYoewogIGF0dHJpYnV0ZXM6IHsgeG1sbnN4bGluazogInhtbG5zOnhsaW5rIiB9LAogIHByb3BlcnRpZXM6IHsgeG1sbnNYTGluazogbnVsbCwgeG1sbnM6IG51bGwgfSwKICBzcGFjZTogInhtbG5zIiwKICB0cmFuc2Zvcm06IGNhc2VJbnNlbnNpdGl2ZVRyYW5zZm9ybQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL3htbC5qcwp2YXIgeG1sID0gY3JlYXRlNih7CiAgcHJvcGVydGllczogeyB4bWxCYXNlOiBudWxsLCB4bWxMYW5nOiBudWxsLCB4bWxTcGFjZTogbnVsbCB9LAogIHNwYWNlOiAieG1sIiwKICB0cmFuc2Zvcm0oXzMsIHByb3BlcnR5KSB7CiAgICByZXR1cm4gInhtbDoiICsgcHJvcGVydHkuc2xpY2UoMykudG9Mb3dlckNhc2UoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3Byb3BlcnR5LWluZm9ybWF0aW9uQDcuMS4wL25vZGVfbW9kdWxlcy9wcm9wZXJ0eS1pbmZvcm1hdGlvbi9saWIvZmluZC5qcwp2YXIgY2FwID0gL1tBLVpdL2c7CnZhciBkYXNoID0gLy1bYS16XS9nOwp2YXIgdmFsaWQgPSAvXmRhdGFbLVx3LjpdKyQvaTsKZnVuY3Rpb24gZmluZDIoc2NoZW1hLCB2YWx1ZTIpIHsKICBjb25zdCBub3JtYWwgPSBub3JtYWxpemUzKHZhbHVlMik7CiAgbGV0IHByb3BlcnR5ID0gdmFsdWUyOwogIGxldCBUeXBlID0gSW5mbzsKICBpZiAobm9ybWFsIGluIHNjaGVtYS5ub3JtYWwpIHsKICAgIHJldHVybiBzY2hlbWEucHJvcGVydHlbc2NoZW1hLm5vcm1hbFtub3JtYWxdXTsKICB9CiAgaWYgKG5vcm1hbC5sZW5ndGggPiA0ICYmIG5vcm1hbC5zbGljZSgwLCA0KSA9PT0gImRhdGEiICYmIHZhbGlkLnRlc3QodmFsdWUyKSkgewogICAgaWYgKHZhbHVlMi5jaGFyQXQoNCkgPT09ICItIikgewogICAgICBjb25zdCByZXN0ID0gdmFsdWUyLnNsaWNlKDUpLnJlcGxhY2UoZGFzaCwgY2FtZWxjYXNlKTsKICAgICAgcHJvcGVydHkgPSAiZGF0YSIgKyByZXN0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcmVzdC5zbGljZSgxKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IHJlc3QgPSB2YWx1ZTIuc2xpY2UoNCk7CiAgICAgIGlmICghZGFzaC50ZXN0KHJlc3QpKSB7CiAgICAgICAgbGV0IGRhc2hlcyA9IHJlc3QucmVwbGFjZShjYXAsIGtlYmFiKTsKICAgICAgICBpZiAoZGFzaGVzLmNoYXJBdCgwKSAhPT0gIi0iKSB7CiAgICAgICAgICBkYXNoZXMgPSAiLSIgKyBkYXNoZXM7CiAgICAgICAgfQogICAgICAgIHZhbHVlMiA9ICJkYXRhIiArIGRhc2hlczsKICAgICAgfQogICAgfQogICAgVHlwZSA9IERlZmluZWRJbmZvOwogIH0KICByZXR1cm4gbmV3IFR5cGUocHJvcGVydHksIHZhbHVlMik7Cn0KX19uYW1lKGZpbmQyLCAiZmluZCIpOwpmdW5jdGlvbiBrZWJhYigkMCkgewogIHJldHVybiAiLSIgKyAkMC50b0xvd2VyQ2FzZSgpOwp9Cl9fbmFtZShrZWJhYiwgImtlYmFiIik7CmZ1bmN0aW9uIGNhbWVsY2FzZSgkMCkgewogIHJldHVybiAkMC5jaGFyQXQoMSkudG9VcHBlckNhc2UoKTsKfQpfX25hbWUoY2FtZWxjYXNlLCAiY2FtZWxjYXNlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcHJvcGVydHktaW5mb3JtYXRpb25ANy4xLjAvbm9kZV9tb2R1bGVzL3Byb3BlcnR5LWluZm9ybWF0aW9uL2luZGV4LmpzCnZhciBodG1sNCA9IG1lcmdlMyhbYXJpYTIsIGh0bWwzLCB4bGluaywgeG1sbnMsIHhtbF0sICJodG1sIik7CnZhciBzdmcyID0gbWVyZ2UzKFthcmlhMiwgc3ZnLCB4bGluaywgeG1sbnMsIHhtbF0sICJzdmciKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9zdHJpbmdpZnktZW50aXRpZXNANC4wLjQvbm9kZV9tb2R1bGVzL3N0cmluZ2lmeS1lbnRpdGllcy9saWIvY29yZS5qcwp2YXIgZGVmYXVsdFN1YnNldFJlZ2V4ID0gL1siJic8PmBdL2c7CnZhciBzdXJyb2dhdGVQYWlyc1JlZ2V4ID0gL1tcdUQ4MDAtXHVEQkZGXVtcdURDMDAtXHVERkZGXS9nOwp2YXIgY29udHJvbENoYXJhY3RlcnNSZWdleCA9ICgKICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleCwgdW5pY29ybi9uby1oZXgtZXNjYXBlCiAgL1tceDAxLVx0XHZcZlx4MEUtXHgxRlx4N0ZceDgxXHg4RFx4OEZceDkwXHg5RFx4QTAtXHVGRkZGXS9nCik7CnZhciByZWdleEVzY2FwZVJlZ2V4ID0gL1t8XFx7fSgpW1xdXiQrKj8uXS9nOwp2YXIgc3Vic2V0VG9SZWdleENhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7CmZ1bmN0aW9uIGNvcmUodmFsdWUyLCBvcHRpb25zKSB7CiAgdmFsdWUyID0gdmFsdWUyLnJlcGxhY2UoCiAgICBvcHRpb25zLnN1YnNldCA/IGNoYXJhY3RlcnNUb0V4cHJlc3Npb25DYWNoZWQob3B0aW9ucy5zdWJzZXQpIDogZGVmYXVsdFN1YnNldFJlZ2V4LAogICAgYmFzaWMKICApOwogIGlmIChvcHRpb25zLnN1YnNldCB8fCBvcHRpb25zLmVzY2FwZU9ubHkpIHsKICAgIHJldHVybiB2YWx1ZTI7CiAgfQogIHJldHVybiB2YWx1ZTIucmVwbGFjZShzdXJyb2dhdGVQYWlyc1JlZ2V4LCBzdXJyb2dhdGUpLnJlcGxhY2UoY29udHJvbENoYXJhY3RlcnNSZWdleCwgYmFzaWMpOwogIGZ1bmN0aW9uIHN1cnJvZ2F0ZShwYWlyLCBpbmRleDIsIGFsbDMpIHsKICAgIHJldHVybiBvcHRpb25zLmZvcm1hdCgKICAgICAgKHBhaXIuY2hhckNvZGVBdCgwKSAtIDU1Mjk2KSAqIDEwMjQgKyBwYWlyLmNoYXJDb2RlQXQoMSkgLSA1NjMyMCArIDY1NTM2LAogICAgICBhbGwzLmNoYXJDb2RlQXQoaW5kZXgyICsgMiksCiAgICAgIG9wdGlvbnMKICAgICk7CiAgfQogIF9fbmFtZShzdXJyb2dhdGUsICJzdXJyb2dhdGUiKTsKICBmdW5jdGlvbiBiYXNpYyhjaGFyYWN0ZXIsIGluZGV4MiwgYWxsMykgewogICAgcmV0dXJuIG9wdGlvbnMuZm9ybWF0KAogICAgICBjaGFyYWN0ZXIuY2hhckNvZGVBdCgwKSwKICAgICAgYWxsMy5jaGFyQ29kZUF0KGluZGV4MiArIDEpLAogICAgICBvcHRpb25zCiAgICApOwogIH0KICBfX25hbWUoYmFzaWMsICJiYXNpYyIpOwp9Cl9fbmFtZShjb3JlLCAiY29yZSIpOwpmdW5jdGlvbiBjaGFyYWN0ZXJzVG9FeHByZXNzaW9uQ2FjaGVkKHN1YnNldCkgewogIGxldCBjYWNoZWQgPSBzdWJzZXRUb1JlZ2V4Q2FjaGUuZ2V0KHN1YnNldCk7CiAgaWYgKCFjYWNoZWQpIHsKICAgIGNhY2hlZCA9IGNoYXJhY3RlcnNUb0V4cHJlc3Npb24oc3Vic2V0KTsKICAgIHN1YnNldFRvUmVnZXhDYWNoZS5zZXQoc3Vic2V0LCBjYWNoZWQpOwogIH0KICByZXR1cm4gY2FjaGVkOwp9Cl9fbmFtZShjaGFyYWN0ZXJzVG9FeHByZXNzaW9uQ2FjaGVkLCAiY2hhcmFjdGVyc1RvRXhwcmVzc2lvbkNhY2hlZCIpOwpmdW5jdGlvbiBjaGFyYWN0ZXJzVG9FeHByZXNzaW9uKHN1YnNldCkgewogIGNvbnN0IGdyb3VwcyA9IFtdOwogIGxldCBpbmRleDIgPSAtMTsKICB3aGlsZSAoKytpbmRleDIgPCBzdWJzZXQubGVuZ3RoKSB7CiAgICBncm91cHMucHVzaChzdWJzZXRbaW5kZXgyXS5yZXBsYWNlKHJlZ2V4RXNjYXBlUmVnZXgsICJcXCQmIikpOwogIH0KICByZXR1cm4gbmV3IFJlZ0V4cCgiKD86IiArIGdyb3Vwcy5qb2luKCJ8IikgKyAiKSIsICJnIik7Cn0KX19uYW1lKGNoYXJhY3RlcnNUb0V4cHJlc3Npb24sICJjaGFyYWN0ZXJzVG9FeHByZXNzaW9uIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vc3RyaW5naWZ5LWVudGl0aWVzQDQuMC40L25vZGVfbW9kdWxlcy9zdHJpbmdpZnktZW50aXRpZXMvbGliL3V0aWwvdG8taGV4YWRlY2ltYWwuanMKdmFyIGhleGFkZWNpbWFsUmVnZXggPSAvW1xkQS1GYS1mXS87CmZ1bmN0aW9uIHRvSGV4YWRlY2ltYWwoY29kZTQsIG5leHQyLCBvbWl0KSB7CiAgY29uc3QgdmFsdWUyID0gIiYjeCIgKyBjb2RlNC50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTsKICByZXR1cm4gb21pdCAmJiBuZXh0MiAmJiAhaGV4YWRlY2ltYWxSZWdleC50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUobmV4dDIpKSA/IHZhbHVlMiA6IHZhbHVlMiArICI7IjsKfQpfX25hbWUodG9IZXhhZGVjaW1hbCwgInRvSGV4YWRlY2ltYWwiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9zdHJpbmdpZnktZW50aXRpZXNANC4wLjQvbm9kZV9tb2R1bGVzL3N0cmluZ2lmeS1lbnRpdGllcy9saWIvdXRpbC90by1kZWNpbWFsLmpzCnZhciBkZWNpbWFsUmVnZXggPSAvXGQvOwpmdW5jdGlvbiB0b0RlY2ltYWwoY29kZTQsIG5leHQyLCBvbWl0KSB7CiAgY29uc3QgdmFsdWUyID0gIiYjIiArIFN0cmluZyhjb2RlNCk7CiAgcmV0dXJuIG9taXQgJiYgbmV4dDIgJiYgIWRlY2ltYWxSZWdleC50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUobmV4dDIpKSA/IHZhbHVlMiA6IHZhbHVlMiArICI7IjsKfQpfX25hbWUodG9EZWNpbWFsLCAidG9EZWNpbWFsIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vY2hhcmFjdGVyLWVudGl0aWVzLWxlZ2FjeUAzLjAuMC9ub2RlX21vZHVsZXMvY2hhcmFjdGVyLWVudGl0aWVzLWxlZ2FjeS9pbmRleC5qcwp2YXIgY2hhcmFjdGVyRW50aXRpZXNMZWdhY3kgPSBbCiAgIkFFbGlnIiwKICAiQU1QIiwKICAiQWFjdXRlIiwKICAiQWNpcmMiLAogICJBZ3JhdmUiLAogICJBcmluZyIsCiAgIkF0aWxkZSIsCiAgIkF1bWwiLAogICJDT1BZIiwKICAiQ2NlZGlsIiwKICAiRVRIIiwKICAiRWFjdXRlIiwKICAiRWNpcmMiLAogICJFZ3JhdmUiLAogICJFdW1sIiwKICAiR1QiLAogICJJYWN1dGUiLAogICJJY2lyYyIsCiAgIklncmF2ZSIsCiAgIkl1bWwiLAogICJMVCIsCiAgIk50aWxkZSIsCiAgIk9hY3V0ZSIsCiAgIk9jaXJjIiwKICAiT2dyYXZlIiwKICAiT3NsYXNoIiwKICAiT3RpbGRlIiwKICAiT3VtbCIsCiAgIlFVT1QiLAogICJSRUciLAogICJUSE9STiIsCiAgIlVhY3V0ZSIsCiAgIlVjaXJjIiwKICAiVWdyYXZlIiwKICAiVXVtbCIsCiAgIllhY3V0ZSIsCiAgImFhY3V0ZSIsCiAgImFjaXJjIiwKICAiYWN1dGUiLAogICJhZWxpZyIsCiAgImFncmF2ZSIsCiAgImFtcCIsCiAgImFyaW5nIiwKICAiYXRpbGRlIiwKICAiYXVtbCIsCiAgImJydmJhciIsCiAgImNjZWRpbCIsCiAgImNlZGlsIiwKICAiY2VudCIsCiAgImNvcHkiLAogICJjdXJyZW4iLAogICJkZWciLAogICJkaXZpZGUiLAogICJlYWN1dGUiLAogICJlY2lyYyIsCiAgImVncmF2ZSIsCiAgImV0aCIsCiAgImV1bWwiLAogICJmcmFjMTIiLAogICJmcmFjMTQiLAogICJmcmFjMzQiLAogICJndCIsCiAgImlhY3V0ZSIsCiAgImljaXJjIiwKICAiaWV4Y2wiLAogICJpZ3JhdmUiLAogICJpcXVlc3QiLAogICJpdW1sIiwKICAibGFxdW8iLAogICJsdCIsCiAgIm1hY3IiLAogICJtaWNybyIsCiAgIm1pZGRvdCIsCiAgIm5ic3AiLAogICJub3QiLAogICJudGlsZGUiLAogICJvYWN1dGUiLAogICJvY2lyYyIsCiAgIm9ncmF2ZSIsCiAgIm9yZGYiLAogICJvcmRtIiwKICAib3NsYXNoIiwKICAib3RpbGRlIiwKICAib3VtbCIsCiAgInBhcmEiLAogICJwbHVzbW4iLAogICJwb3VuZCIsCiAgInF1b3QiLAogICJyYXF1byIsCiAgInJlZyIsCiAgInNlY3QiLAogICJzaHkiLAogICJzdXAxIiwKICAic3VwMiIsCiAgInN1cDMiLAogICJzemxpZyIsCiAgInRob3JuIiwKICAidGltZXMiLAogICJ1YWN1dGUiLAogICJ1Y2lyYyIsCiAgInVncmF2ZSIsCiAgInVtbCIsCiAgInV1bWwiLAogICJ5YWN1dGUiLAogICJ5ZW4iLAogICJ5dW1sIgpdOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2NoYXJhY3Rlci1lbnRpdGllcy1odG1sNEAyLjEuMC9ub2RlX21vZHVsZXMvY2hhcmFjdGVyLWVudGl0aWVzLWh0bWw0L2luZGV4LmpzCnZhciBjaGFyYWN0ZXJFbnRpdGllc0h0bWw0ID0gewogIG5ic3A6ICJceEEwIiwKICBpZXhjbDogIlx4QTEiLAogIGNlbnQ6ICJceEEyIiwKICBwb3VuZDogIlx4QTMiLAogIGN1cnJlbjogIlx4QTQiLAogIHllbjogIlx4QTUiLAogIGJydmJhcjogIlx4QTYiLAogIHNlY3Q6ICJceEE3IiwKICB1bWw6ICJceEE4IiwKICBjb3B5OiAiXHhBOSIsCiAgb3JkZjogIlx4QUEiLAogIGxhcXVvOiAiXHhBQiIsCiAgbm90OiAiXHhBQyIsCiAgc2h5OiAiXHhBRCIsCiAgcmVnOiAiXHhBRSIsCiAgbWFjcjogIlx4QUYiLAogIGRlZzogIlx4QjAiLAogIHBsdXNtbjogIlx4QjEiLAogIHN1cDI6ICJceEIyIiwKICBzdXAzOiAiXHhCMyIsCiAgYWN1dGU6ICJceEI0IiwKICBtaWNybzogIlx4QjUiLAogIHBhcmE6ICJceEI2IiwKICBtaWRkb3Q6ICJceEI3IiwKICBjZWRpbDogIlx4QjgiLAogIHN1cDE6ICJceEI5IiwKICBvcmRtOiAiXHhCQSIsCiAgcmFxdW86ICJceEJCIiwKICBmcmFjMTQ6ICJceEJDIiwKICBmcmFjMTI6ICJceEJEIiwKICBmcmFjMzQ6ICJceEJFIiwKICBpcXVlc3Q6ICJceEJGIiwKICBBZ3JhdmU6ICJceEMwIiwKICBBYWN1dGU6ICJceEMxIiwKICBBY2lyYzogIlx4QzIiLAogIEF0aWxkZTogIlx4QzMiLAogIEF1bWw6ICJceEM0IiwKICBBcmluZzogIlx4QzUiLAogIEFFbGlnOiAiXHhDNiIsCiAgQ2NlZGlsOiAiXHhDNyIsCiAgRWdyYXZlOiAiXHhDOCIsCiAgRWFjdXRlOiAiXHhDOSIsCiAgRWNpcmM6ICJceENBIiwKICBFdW1sOiAiXHhDQiIsCiAgSWdyYXZlOiAiXHhDQyIsCiAgSWFjdXRlOiAiXHhDRCIsCiAgSWNpcmM6ICJceENFIiwKICBJdW1sOiAiXHhDRiIsCiAgRVRIOiAiXHhEMCIsCiAgTnRpbGRlOiAiXHhEMSIsCiAgT2dyYXZlOiAiXHhEMiIsCiAgT2FjdXRlOiAiXHhEMyIsCiAgT2NpcmM6ICJceEQ0IiwKICBPdGlsZGU6ICJceEQ1IiwKICBPdW1sOiAiXHhENiIsCiAgdGltZXM6ICJceEQ3IiwKICBPc2xhc2g6ICJceEQ4IiwKICBVZ3JhdmU6ICJceEQ5IiwKICBVYWN1dGU6ICJceERBIiwKICBVY2lyYzogIlx4REIiLAogIFV1bWw6ICJceERDIiwKICBZYWN1dGU6ICJceEREIiwKICBUSE9STjogIlx4REUiLAogIHN6bGlnOiAiXHhERiIsCiAgYWdyYXZlOiAiXHhFMCIsCiAgYWFjdXRlOiAiXHhFMSIsCiAgYWNpcmM6ICJceEUyIiwKICBhdGlsZGU6ICJceEUzIiwKICBhdW1sOiAiXHhFNCIsCiAgYXJpbmc6ICJceEU1IiwKICBhZWxpZzogIlx4RTYiLAogIGNjZWRpbDogIlx4RTciLAogIGVncmF2ZTogIlx4RTgiLAogIGVhY3V0ZTogIlx4RTkiLAogIGVjaXJjOiAiXHhFQSIsCiAgZXVtbDogIlx4RUIiLAogIGlncmF2ZTogIlx4RUMiLAogIGlhY3V0ZTogIlx4RUQiLAogIGljaXJjOiAiXHhFRSIsCiAgaXVtbDogIlx4RUYiLAogIGV0aDogIlx4RjAiLAogIG50aWxkZTogIlx4RjEiLAogIG9ncmF2ZTogIlx4RjIiLAogIG9hY3V0ZTogIlx4RjMiLAogIG9jaXJjOiAiXHhGNCIsCiAgb3RpbGRlOiAiXHhGNSIsCiAgb3VtbDogIlx4RjYiLAogIGRpdmlkZTogIlx4RjciLAogIG9zbGFzaDogIlx4RjgiLAogIHVncmF2ZTogIlx4RjkiLAogIHVhY3V0ZTogIlx4RkEiLAogIHVjaXJjOiAiXHhGQiIsCiAgdXVtbDogIlx4RkMiLAogIHlhY3V0ZTogIlx4RkQiLAogIHRob3JuOiAiXHhGRSIsCiAgeXVtbDogIlx4RkYiLAogIGZub2Y6ICJcdTAxOTIiLAogIEFscGhhOiAiXHUwMzkxIiwKICBCZXRhOiAiXHUwMzkyIiwKICBHYW1tYTogIlx1MDM5MyIsCiAgRGVsdGE6ICJcdTAzOTQiLAogIEVwc2lsb246ICJcdTAzOTUiLAogIFpldGE6ICJcdTAzOTYiLAogIEV0YTogIlx1MDM5NyIsCiAgVGhldGE6ICJcdTAzOTgiLAogIElvdGE6ICJcdTAzOTkiLAogIEthcHBhOiAiXHUwMzlBIiwKICBMYW1iZGE6ICJcdTAzOUIiLAogIE11OiAiXHUwMzlDIiwKICBOdTogIlx1MDM5RCIsCiAgWGk6ICJcdTAzOUUiLAogIE9taWNyb246ICJcdTAzOUYiLAogIFBpOiAiXHUwM0EwIiwKICBSaG86ICJcdTAzQTEiLAogIFNpZ21hOiAiXHUwM0EzIiwKICBUYXU6ICJcdTAzQTQiLAogIFVwc2lsb246ICJcdTAzQTUiLAogIFBoaTogIlx1MDNBNiIsCiAgQ2hpOiAiXHUwM0E3IiwKICBQc2k6ICJcdTAzQTgiLAogIE9tZWdhOiAiXHUwM0E5IiwKICBhbHBoYTogIlx1MDNCMSIsCiAgYmV0YTogIlx1MDNCMiIsCiAgZ2FtbWE6ICJcdTAzQjMiLAogIGRlbHRhOiAiXHUwM0I0IiwKICBlcHNpbG9uOiAiXHUwM0I1IiwKICB6ZXRhOiAiXHUwM0I2IiwKICBldGE6ICJcdTAzQjciLAogIHRoZXRhOiAiXHUwM0I4IiwKICBpb3RhOiAiXHUwM0I5IiwKICBrYXBwYTogIlx1MDNCQSIsCiAgbGFtYmRhOiAiXHUwM0JCIiwKICBtdTogIlx1MDNCQyIsCiAgbnU6ICJcdTAzQkQiLAogIHhpOiAiXHUwM0JFIiwKICBvbWljcm9uOiAiXHUwM0JGIiwKICBwaTogIlx1MDNDMCIsCiAgcmhvOiAiXHUwM0MxIiwKICBzaWdtYWY6ICJcdTAzQzIiLAogIHNpZ21hOiAiXHUwM0MzIiwKICB0YXU6ICJcdTAzQzQiLAogIHVwc2lsb246ICJcdTAzQzUiLAogIHBoaTogIlx1MDNDNiIsCiAgY2hpOiAiXHUwM0M3IiwKICBwc2k6ICJcdTAzQzgiLAogIG9tZWdhOiAiXHUwM0M5IiwKICB0aGV0YXN5bTogIlx1MDNEMSIsCiAgdXBzaWg6ICJcdTAzRDIiLAogIHBpdjogIlx1MDNENiIsCiAgYnVsbDogIlx1MjAyMiIsCiAgaGVsbGlwOiAiXHUyMDI2IiwKICBwcmltZTogIlx1MjAzMiIsCiAgUHJpbWU6ICJcdTIwMzMiLAogIG9saW5lOiAiXHUyMDNFIiwKICBmcmFzbDogIlx1MjA0NCIsCiAgd2VpZXJwOiAiXHUyMTE4IiwKICBpbWFnZTogIlx1MjExMSIsCiAgcmVhbDogIlx1MjExQyIsCiAgdHJhZGU6ICJcdTIxMjIiLAogIGFsZWZzeW06ICJcdTIxMzUiLAogIGxhcnI6ICJcdTIxOTAiLAogIHVhcnI6ICJcdTIxOTEiLAogIHJhcnI6ICJcdTIxOTIiLAogIGRhcnI6ICJcdTIxOTMiLAogIGhhcnI6ICJcdTIxOTQiLAogIGNyYXJyOiAiXHUyMUI1IiwKICBsQXJyOiAiXHUyMUQwIiwKICB1QXJyOiAiXHUyMUQxIiwKICByQXJyOiAiXHUyMUQyIiwKICBkQXJyOiAiXHUyMUQzIiwKICBoQXJyOiAiXHUyMUQ0IiwKICBmb3JhbGw6ICJcdTIyMDAiLAogIHBhcnQ6ICJcdTIyMDIiLAogIGV4aXN0OiAiXHUyMjAzIiwKICBlbXB0eTogIlx1MjIwNSIsCiAgbmFibGE6ICJcdTIyMDciLAogIGlzaW46ICJcdTIyMDgiLAogIG5vdGluOiAiXHUyMjA5IiwKICBuaTogIlx1MjIwQiIsCiAgcHJvZDogIlx1MjIwRiIsCiAgc3VtOiAiXHUyMjExIiwKICBtaW51czogIlx1MjIxMiIsCiAgbG93YXN0OiAiXHUyMjE3IiwKICByYWRpYzogIlx1MjIxQSIsCiAgcHJvcDogIlx1MjIxRCIsCiAgaW5maW46ICJcdTIyMUUiLAogIGFuZzogIlx1MjIyMCIsCiAgYW5kOiAiXHUyMjI3IiwKICBvcjogIlx1MjIyOCIsCiAgY2FwOiAiXHUyMjI5IiwKICBjdXA6ICJcdTIyMkEiLAogIGludDogIlx1MjIyQiIsCiAgdGhlcmU0OiAiXHUyMjM0IiwKICBzaW06ICJcdTIyM0MiLAogIGNvbmc6ICJcdTIyNDUiLAogIGFzeW1wOiAiXHUyMjQ4IiwKICBuZTogIlx1MjI2MCIsCiAgZXF1aXY6ICJcdTIyNjEiLAogIGxlOiAiXHUyMjY0IiwKICBnZTogIlx1MjI2NSIsCiAgc3ViOiAiXHUyMjgyIiwKICBzdXA6ICJcdTIyODMiLAogIG5zdWI6ICJcdTIyODQiLAogIHN1YmU6ICJcdTIyODYiLAogIHN1cGU6ICJcdTIyODciLAogIG9wbHVzOiAiXHUyMjk1IiwKICBvdGltZXM6ICJcdTIyOTciLAogIHBlcnA6ICJcdTIyQTUiLAogIHNkb3Q6ICJcdTIyQzUiLAogIGxjZWlsOiAiXHUyMzA4IiwKICByY2VpbDogIlx1MjMwOSIsCiAgbGZsb29yOiAiXHUyMzBBIiwKICByZmxvb3I6ICJcdTIzMEIiLAogIGxhbmc6ICJcdTIzMjkiLAogIHJhbmc6ICJcdTIzMkEiLAogIGxvejogIlx1MjVDQSIsCiAgc3BhZGVzOiAiXHUyNjYwIiwKICBjbHViczogIlx1MjY2MyIsCiAgaGVhcnRzOiAiXHUyNjY1IiwKICBkaWFtczogIlx1MjY2NiIsCiAgcXVvdDogJyInLAogIGFtcDogIiYiLAogIGx0OiAiPCIsCiAgZ3Q6ICI+IiwKICBPRWxpZzogIlx1MDE1MiIsCiAgb2VsaWc6ICJcdTAxNTMiLAogIFNjYXJvbjogIlx1MDE2MCIsCiAgc2Nhcm9uOiAiXHUwMTYxIiwKICBZdW1sOiAiXHUwMTc4IiwKICBjaXJjOiAiXHUwMkM2IiwKICB0aWxkZTogIlx1MDJEQyIsCiAgZW5zcDogIlx1MjAwMiIsCiAgZW1zcDogIlx1MjAwMyIsCiAgdGhpbnNwOiAiXHUyMDA5IiwKICB6d25qOiAiXHUyMDBDIiwKICB6d2o6ICJcdTIwMEQiLAogIGxybTogIlx1MjAwRSIsCiAgcmxtOiAiXHUyMDBGIiwKICBuZGFzaDogIlx1MjAxMyIsCiAgbWRhc2g6ICJcdTIwMTQiLAogIGxzcXVvOiAiXHUyMDE4IiwKICByc3F1bzogIlx1MjAxOSIsCiAgc2JxdW86ICJcdTIwMUEiLAogIGxkcXVvOiAiXHUyMDFDIiwKICByZHF1bzogIlx1MjAxRCIsCiAgYmRxdW86ICJcdTIwMUUiLAogIGRhZ2dlcjogIlx1MjAyMCIsCiAgRGFnZ2VyOiAiXHUyMDIxIiwKICBwZXJtaWw6ICJcdTIwMzAiLAogIGxzYXF1bzogIlx1MjAzOSIsCiAgcnNhcXVvOiAiXHUyMDNBIiwKICBldXJvOiAiXHUyMEFDIgp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3N0cmluZ2lmeS1lbnRpdGllc0A0LjAuNC9ub2RlX21vZHVsZXMvc3RyaW5naWZ5LWVudGl0aWVzL2xpYi9jb25zdGFudC9kYW5nZXJvdXMuanMKdmFyIGRhbmdlcm91cyA9IFsKICAiY2VudCIsCiAgImNvcHkiLAogICJkaXZpZGUiLAogICJndCIsCiAgImx0IiwKICAibm90IiwKICAicGFyYSIsCiAgInRpbWVzIgpdOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3N0cmluZ2lmeS1lbnRpdGllc0A0LjAuNC9ub2RlX21vZHVsZXMvc3RyaW5naWZ5LWVudGl0aWVzL2xpYi91dGlsL3RvLW5hbWVkLmpzCnZhciBvd245ID0ge30uaGFzT3duUHJvcGVydHk7CnZhciBjaGFyYWN0ZXJzID0ge307CnZhciBrZXk7CmZvciAoa2V5IGluIGNoYXJhY3RlckVudGl0aWVzSHRtbDQpIHsKICBpZiAob3duOS5jYWxsKGNoYXJhY3RlckVudGl0aWVzSHRtbDQsIGtleSkpIHsKICAgIGNoYXJhY3RlcnNbY2hhcmFjdGVyRW50aXRpZXNIdG1sNFtrZXldXSA9IGtleTsKICB9Cn0KdmFyIG5vdEFscGhhbnVtZXJpY1JlZ2V4ID0gL1teXGRBLVphLXpdLzsKZnVuY3Rpb24gdG9OYW1lZChjb2RlNCwgbmV4dDIsIG9taXQsIGF0dHJpYnV0ZSkgewogIGNvbnN0IGNoYXJhY3RlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZTQpOwogIGlmIChvd245LmNhbGwoY2hhcmFjdGVycywgY2hhcmFjdGVyKSkgewogICAgY29uc3QgbmFtZSA9IGNoYXJhY3RlcnNbY2hhcmFjdGVyXTsKICAgIGNvbnN0IHZhbHVlMiA9ICImIiArIG5hbWU7CiAgICBpZiAob21pdCAmJiBjaGFyYWN0ZXJFbnRpdGllc0xlZ2FjeS5pbmNsdWRlcyhuYW1lKSAmJiAhZGFuZ2Vyb3VzLmluY2x1ZGVzKG5hbWUpICYmICghYXR0cmlidXRlIHx8IG5leHQyICYmIG5leHQyICE9PSA2MSAmJiBub3RBbHBoYW51bWVyaWNSZWdleC50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUobmV4dDIpKSkpIHsKICAgICAgcmV0dXJuIHZhbHVlMjsKICAgIH0KICAgIHJldHVybiB2YWx1ZTIgKyAiOyI7CiAgfQogIHJldHVybiAiIjsKfQpfX25hbWUodG9OYW1lZCwgInRvTmFtZWQiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9zdHJpbmdpZnktZW50aXRpZXNANC4wLjQvbm9kZV9tb2R1bGVzL3N0cmluZ2lmeS1lbnRpdGllcy9saWIvdXRpbC9mb3JtYXQtc21hcnQuanMKZnVuY3Rpb24gZm9ybWF0U21hcnQoY29kZTQsIG5leHQyLCBvcHRpb25zKSB7CiAgbGV0IG51bWVyaWMgPSB0b0hleGFkZWNpbWFsKGNvZGU0LCBuZXh0Miwgb3B0aW9ucy5vbWl0T3B0aW9uYWxTZW1pY29sb25zKTsKICBsZXQgbmFtZWQ7CiAgaWYgKG9wdGlvbnMudXNlTmFtZWRSZWZlcmVuY2VzIHx8IG9wdGlvbnMudXNlU2hvcnRlc3RSZWZlcmVuY2VzKSB7CiAgICBuYW1lZCA9IHRvTmFtZWQoCiAgICAgIGNvZGU0LAogICAgICBuZXh0MiwKICAgICAgb3B0aW9ucy5vbWl0T3B0aW9uYWxTZW1pY29sb25zLAogICAgICBvcHRpb25zLmF0dHJpYnV0ZQogICAgKTsKICB9CiAgaWYgKChvcHRpb25zLnVzZVNob3J0ZXN0UmVmZXJlbmNlcyB8fCAhbmFtZWQpICYmIG9wdGlvbnMudXNlU2hvcnRlc3RSZWZlcmVuY2VzKSB7CiAgICBjb25zdCBkZWNpbWFsID0gdG9EZWNpbWFsKGNvZGU0LCBuZXh0Miwgb3B0aW9ucy5vbWl0T3B0aW9uYWxTZW1pY29sb25zKTsKICAgIGlmIChkZWNpbWFsLmxlbmd0aCA8IG51bWVyaWMubGVuZ3RoKSB7CiAgICAgIG51bWVyaWMgPSBkZWNpbWFsOwogICAgfQogIH0KICByZXR1cm4gbmFtZWQgJiYgKCFvcHRpb25zLnVzZVNob3J0ZXN0UmVmZXJlbmNlcyB8fCBuYW1lZC5sZW5ndGggPCBudW1lcmljLmxlbmd0aCkgPyBuYW1lZCA6IG51bWVyaWM7Cn0KX19uYW1lKGZvcm1hdFNtYXJ0LCAiZm9ybWF0U21hcnQiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9zdHJpbmdpZnktZW50aXRpZXNANC4wLjQvbm9kZV9tb2R1bGVzL3N0cmluZ2lmeS1lbnRpdGllcy9saWIvdXRpbC9mb3JtYXQtYmFzaWMuanMKZnVuY3Rpb24gZm9ybWF0QmFzaWMoY29kZTQpIHsKICByZXR1cm4gIiYjeCIgKyBjb2RlNC50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSArICI7IjsKfQpfX25hbWUoZm9ybWF0QmFzaWMsICJmb3JtYXRCYXNpYyIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3N0cmluZ2lmeS1lbnRpdGllc0A0LjAuNC9ub2RlX21vZHVsZXMvc3RyaW5naWZ5LWVudGl0aWVzL2xpYi9pbmRleC5qcwpmdW5jdGlvbiBzdHJpbmdpZnlFbnRpdGllcyh2YWx1ZTIsIG9wdGlvbnMpIHsKICByZXR1cm4gY29yZSh2YWx1ZTIsIE9iamVjdC5hc3NpZ24oeyBmb3JtYXQ6IGZvcm1hdFNtYXJ0IH0sIG9wdGlvbnMpKTsKfQpfX25hbWUoc3RyaW5naWZ5RW50aXRpZXMsICJzdHJpbmdpZnlFbnRpdGllcyIpOwpmdW5jdGlvbiBzdHJpbmdpZnlFbnRpdGllc0xpZ2h0KHZhbHVlMiwgb3B0aW9ucykgewogIHJldHVybiBjb3JlKHZhbHVlMiwgT2JqZWN0LmFzc2lnbih7IGZvcm1hdDogZm9ybWF0QmFzaWMgfSwgb3B0aW9ucykpOwp9Cl9fbmFtZShzdHJpbmdpZnlFbnRpdGllc0xpZ2h0LCAic3RyaW5naWZ5RW50aXRpZXNMaWdodCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2hhc3QtdXRpbC10by1odG1sQDkuMC41L25vZGVfbW9kdWxlcy9oYXN0LXV0aWwtdG8taHRtbC9saWIvaGFuZGxlL2NvbW1lbnQuanMKdmFyIGh0bWxDb21tZW50UmVnZXggPSAvXj58Xi0+fDwhLS18LS0+fC0tIT58PCEtJC9nOwp2YXIgYm9ndXNDb21tZW50RW50aXR5U3Vic2V0ID0gWyI+Il07CnZhciBjb21tZW50RW50aXR5U3Vic2V0ID0gWyI8IiwgIj4iXTsKZnVuY3Rpb24gY29tbWVudDIobm9kZTIsIF8xLCBfMjIsIHN0YXRlKSB7CiAgcmV0dXJuIHN0YXRlLnNldHRpbmdzLmJvZ3VzQ29tbWVudHMgPyAiPD8iICsgc3RyaW5naWZ5RW50aXRpZXMoCiAgICBub2RlMi52YWx1ZSwKICAgIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnNldHRpbmdzLmNoYXJhY3RlclJlZmVyZW5jZXMsIHsKICAgICAgc3Vic2V0OiBib2d1c0NvbW1lbnRFbnRpdHlTdWJzZXQKICAgIH0pCiAgKSArICI+IiA6ICI8IS0tIiArIG5vZGUyLnZhbHVlLnJlcGxhY2UoaHRtbENvbW1lbnRSZWdleCwgZW5jb2RlMikgKyAiLS0+IjsKICBmdW5jdGlvbiBlbmNvZGUyKCQwKSB7CiAgICByZXR1cm4gc3RyaW5naWZ5RW50aXRpZXMoCiAgICAgICQwLAogICAgICBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5zZXR0aW5ncy5jaGFyYWN0ZXJSZWZlcmVuY2VzLCB7CiAgICAgICAgc3Vic2V0OiBjb21tZW50RW50aXR5U3Vic2V0CiAgICAgIH0pCiAgICApOwogIH0KICBfX25hbWUoZW5jb2RlMiwgImVuY29kZSIpOwp9Cl9fbmFtZShjb21tZW50MiwgImNvbW1lbnQiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9oYXN0LXV0aWwtdG8taHRtbEA5LjAuNS9ub2RlX21vZHVsZXMvaGFzdC11dGlsLXRvLWh0bWwvbGliL2hhbmRsZS9kb2N0eXBlLmpzCmZ1bmN0aW9uIGRvY3R5cGUyKF8xLCBfMjIsIF8zLCBzdGF0ZSkgewogIHJldHVybiAiPCEiICsgKHN0YXRlLnNldHRpbmdzLnVwcGVyRG9jdHlwZSA/ICJET0NUWVBFIiA6ICJkb2N0eXBlIikgKyAoc3RhdGUuc2V0dGluZ3MudGlnaHREb2N0eXBlID8gIiIgOiAiICIpICsgImh0bWw+IjsKfQpfX25hbWUoZG9jdHlwZTIsICJkb2N0eXBlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vY29tbWEtc2VwYXJhdGVkLXRva2Vuc0AyLjAuMy9ub2RlX21vZHVsZXMvY29tbWEtc2VwYXJhdGVkLXRva2Vucy9pbmRleC5qcwpmdW5jdGlvbiBwYXJzZTUodmFsdWUyKSB7CiAgY29uc3QgdG9rZW5zID0gW107CiAgY29uc3QgaW5wdXQgPSBTdHJpbmcodmFsdWUyIHx8ICIiKTsKICBsZXQgaW5kZXgyID0gaW5wdXQuaW5kZXhPZigiLCIpOwogIGxldCBzdGFydCA9IDA7CiAgbGV0IGVuZCA9IGZhbHNlOwogIHdoaWxlICghZW5kKSB7CiAgICBpZiAoaW5kZXgyID09PSAtMSkgewogICAgICBpbmRleDIgPSBpbnB1dC5sZW5ndGg7CiAgICAgIGVuZCA9IHRydWU7CiAgICB9CiAgICBjb25zdCB0b2tlbiA9IGlucHV0LnNsaWNlKHN0YXJ0LCBpbmRleDIpLnRyaW0oKTsKICAgIGlmICh0b2tlbiB8fCAhZW5kKSB7CiAgICAgIHRva2Vucy5wdXNoKHRva2VuKTsKICAgIH0KICAgIHN0YXJ0ID0gaW5kZXgyICsgMTsKICAgIGluZGV4MiA9IGlucHV0LmluZGV4T2YoIiwiLCBzdGFydCk7CiAgfQogIHJldHVybiB0b2tlbnM7Cn0KX19uYW1lKHBhcnNlNSwgInBhcnNlIik7CmZ1bmN0aW9uIHN0cmluZ2lmeTModmFsdWVzLCBvcHRpb25zKSB7CiAgY29uc3Qgc2V0dGluZ3MgPSBvcHRpb25zIHx8IHt9OwogIGNvbnN0IGlucHV0ID0gdmFsdWVzW3ZhbHVlcy5sZW5ndGggLSAxXSA9PT0gIiIgPyBbLi4udmFsdWVzLCAiIl0gOiB2YWx1ZXM7CiAgcmV0dXJuIGlucHV0LmpvaW4oCiAgICAoc2V0dGluZ3MucGFkUmlnaHQgPyAiICIgOiAiIikgKyAiLCIgKyAoc2V0dGluZ3MucGFkTGVmdCA9PT0gZmFsc2UgPyAiIiA6ICIgIikKICApLnRyaW0oKTsKfQpfX25hbWUoc3RyaW5naWZ5MywgInN0cmluZ2lmeSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3NwYWNlLXNlcGFyYXRlZC10b2tlbnNAMi4wLjIvbm9kZV9tb2R1bGVzL3NwYWNlLXNlcGFyYXRlZC10b2tlbnMvaW5kZXguanMKZnVuY3Rpb24gcGFyc2U2KHZhbHVlMikgewogIGNvbnN0IGlucHV0ID0gU3RyaW5nKHZhbHVlMiB8fCAiIikudHJpbSgpOwogIHJldHVybiBpbnB1dCA/IGlucHV0LnNwbGl0KC9bIFx0XG5cclxmXSsvZykgOiBbXTsKfQpfX25hbWUocGFyc2U2LCAicGFyc2UiKTsKZnVuY3Rpb24gc3RyaW5naWZ5NCh2YWx1ZXMpIHsKICByZXR1cm4gdmFsdWVzLmpvaW4oIiAiKS50cmltKCk7Cn0KX19uYW1lKHN0cmluZ2lmeTQsICJzdHJpbmdpZnkiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9oYXN0LXV0aWwtd2hpdGVzcGFjZUAzLjAuMC9ub2RlX21vZHVsZXMvaGFzdC11dGlsLXdoaXRlc3BhY2UvbGliL2luZGV4LmpzCnZhciByZSA9IC9bIFx0XG5cZlxyXS9nOwpmdW5jdGlvbiB3aGl0ZXNwYWNlKHRoaW5nKSB7CiAgcmV0dXJuIHR5cGVvZiB0aGluZyA9PT0gIm9iamVjdCIgPyB0aGluZy50eXBlID09PSAidGV4dCIgPyBlbXB0eTModGhpbmcudmFsdWUpIDogZmFsc2UgOiBlbXB0eTModGhpbmcpOwp9Cl9fbmFtZSh3aGl0ZXNwYWNlLCAid2hpdGVzcGFjZSIpOwpmdW5jdGlvbiBlbXB0eTModmFsdWUyKSB7CiAgcmV0dXJuIHZhbHVlMi5yZXBsYWNlKHJlLCAiIikgPT09ICIiOwp9Cl9fbmFtZShlbXB0eTMsICJlbXB0eSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2hhc3QtdXRpbC10by1odG1sQDkuMC41L25vZGVfbW9kdWxlcy9oYXN0LXV0aWwtdG8taHRtbC9saWIvb21pc3Npb24vdXRpbC9zaWJsaW5ncy5qcwp2YXIgc2libGluZ0FmdGVyID0gc2libGluZ3MoMSk7CnZhciBzaWJsaW5nQmVmb3JlID0gc2libGluZ3MoLTEpOwp2YXIgZW1wdHlDaGlsZHJlbiA9IFtdOwpmdW5jdGlvbiBzaWJsaW5ncyhpbmNyZW1lbnQyKSB7CiAgcmV0dXJuIHNpYmxpbmc7CiAgZnVuY3Rpb24gc2libGluZyhwYXJlbnQsIGluZGV4MiwgaW5jbHVkZVdoaXRlc3BhY2UpIHsKICAgIGNvbnN0IHNpYmxpbmdzMiA9IHBhcmVudCA/IHBhcmVudC5jaGlsZHJlbiA6IGVtcHR5Q2hpbGRyZW47CiAgICBsZXQgb2Zmc2V0ID0gKGluZGV4MiB8fCAwKSArIGluY3JlbWVudDI7CiAgICBsZXQgbmV4dDIgPSBzaWJsaW5nczJbb2Zmc2V0XTsKICAgIGlmICghaW5jbHVkZVdoaXRlc3BhY2UpIHsKICAgICAgd2hpbGUgKG5leHQyICYmIHdoaXRlc3BhY2UobmV4dDIpKSB7CiAgICAgICAgb2Zmc2V0ICs9IGluY3JlbWVudDI7CiAgICAgICAgbmV4dDIgPSBzaWJsaW5nczJbb2Zmc2V0XTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5leHQyOwogIH0KICBfX25hbWUoc2libGluZywgInNpYmxpbmciKTsKfQpfX25hbWUoc2libGluZ3MsICJzaWJsaW5ncyIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2hhc3QtdXRpbC10by1odG1sQDkuMC41L25vZGVfbW9kdWxlcy9oYXN0LXV0aWwtdG8taHRtbC9saWIvb21pc3Npb24vb21pc3Npb24uanMKdmFyIG93bjEwID0ge30uaGFzT3duUHJvcGVydHk7CmZ1bmN0aW9uIG9taXNzaW9uKGhhbmRsZXJzMikgewogIHJldHVybiBvbWl0OwogIGZ1bmN0aW9uIG9taXQobm9kZTIsIGluZGV4MiwgcGFyZW50KSB7CiAgICByZXR1cm4gb3duMTAuY2FsbChoYW5kbGVyczIsIG5vZGUyLnRhZ05hbWUpICYmIGhhbmRsZXJzMltub2RlMi50YWdOYW1lXShub2RlMiwgaW5kZXgyLCBwYXJlbnQpOwogIH0KICBfX25hbWUob21pdCwgIm9taXQiKTsKfQpfX25hbWUob21pc3Npb24sICJvbWlzc2lvbiIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2hhc3QtdXRpbC10by1odG1sQDkuMC41L25vZGVfbW9kdWxlcy9oYXN0LXV0aWwtdG8taHRtbC9saWIvb21pc3Npb24vY2xvc2luZy5qcwp2YXIgY2xvc2luZyA9IG9taXNzaW9uKHsKICBib2R5LAogIGNhcHRpb246IGhlYWRPckNvbGdyb3VwT3JDYXB0aW9uLAogIGNvbGdyb3VwOiBoZWFkT3JDb2xncm91cE9yQ2FwdGlvbiwKICBkZCwKICBkdCwKICBoZWFkOiBoZWFkT3JDb2xncm91cE9yQ2FwdGlvbiwKICBodG1sOiBodG1sNSwKICBsaSwKICBvcHRncm91cCwKICBvcHRpb24sCiAgcDogcDQsCiAgcnA6IHJ1YnlFbGVtZW50LAogIHJ0OiBydWJ5RWxlbWVudCwKICB0Ym9keSwKICB0ZDogY2VsbHMsCiAgdGZvb3QsCiAgdGg6IGNlbGxzLAogIHRoZWFkLAogIHRyCn0pOwpmdW5jdGlvbiBoZWFkT3JDb2xncm91cE9yQ2FwdGlvbihfMywgaW5kZXgyLCBwYXJlbnQpIHsKICBjb25zdCBuZXh0MiA9IHNpYmxpbmdBZnRlcihwYXJlbnQsIGluZGV4MiwgdHJ1ZSk7CiAgcmV0dXJuICFuZXh0MiB8fCBuZXh0Mi50eXBlICE9PSAiY29tbWVudCIgJiYgIShuZXh0Mi50eXBlID09PSAidGV4dCIgJiYgd2hpdGVzcGFjZShuZXh0Mi52YWx1ZS5jaGFyQXQoMCkpKTsKfQpfX25hbWUoaGVhZE9yQ29sZ3JvdXBPckNhcHRpb24sICJoZWFkT3JDb2xncm91cE9yQ2FwdGlvbiIpOwpmdW5jdGlvbiBodG1sNShfMywgaW5kZXgyLCBwYXJlbnQpIHsKICBjb25zdCBuZXh0MiA9IHNpYmxpbmdBZnRlcihwYXJlbnQsIGluZGV4Mik7CiAgcmV0dXJuICFuZXh0MiB8fCBuZXh0Mi50eXBlICE9PSAiY29tbWVudCI7Cn0KX19uYW1lKGh0bWw1LCAiaHRtbCIpOwpmdW5jdGlvbiBib2R5KF8zLCBpbmRleDIsIHBhcmVudCkgewogIGNvbnN0IG5leHQyID0gc2libGluZ0FmdGVyKHBhcmVudCwgaW5kZXgyKTsKICByZXR1cm4gIW5leHQyIHx8IG5leHQyLnR5cGUgIT09ICJjb21tZW50IjsKfQpfX25hbWUoYm9keSwgImJvZHkiKTsKZnVuY3Rpb24gcDQoXzMsIGluZGV4MiwgcGFyZW50KSB7CiAgY29uc3QgbmV4dDIgPSBzaWJsaW5nQWZ0ZXIocGFyZW50LCBpbmRleDIpOwogIHJldHVybiBuZXh0MiA/IG5leHQyLnR5cGUgPT09ICJlbGVtZW50IiAmJiAobmV4dDIudGFnTmFtZSA9PT0gImFkZHJlc3MiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJhcnRpY2xlIiB8fCBuZXh0Mi50YWdOYW1lID09PSAiYXNpZGUiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJibG9ja3F1b3RlIiB8fCBuZXh0Mi50YWdOYW1lID09PSAiZGV0YWlscyIgfHwgbmV4dDIudGFnTmFtZSA9PT0gImRpdiIgfHwgbmV4dDIudGFnTmFtZSA9PT0gImRsIiB8fCBuZXh0Mi50YWdOYW1lID09PSAiZmllbGRzZXQiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJmaWdjYXB0aW9uIiB8fCBuZXh0Mi50YWdOYW1lID09PSAiZmlndXJlIiB8fCBuZXh0Mi50YWdOYW1lID09PSAiZm9vdGVyIiB8fCBuZXh0Mi50YWdOYW1lID09PSAiZm9ybSIgfHwgbmV4dDIudGFnTmFtZSA9PT0gImgxIiB8fCBuZXh0Mi50YWdOYW1lID09PSAiaDIiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJoMyIgfHwgbmV4dDIudGFnTmFtZSA9PT0gImg0IiB8fCBuZXh0Mi50YWdOYW1lID09PSAiaDUiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJoNiIgfHwgbmV4dDIudGFnTmFtZSA9PT0gImhlYWRlciIgfHwgbmV4dDIudGFnTmFtZSA9PT0gImhncm91cCIgfHwgbmV4dDIudGFnTmFtZSA9PT0gImhyIiB8fCBuZXh0Mi50YWdOYW1lID09PSAibWFpbiIgfHwgbmV4dDIudGFnTmFtZSA9PT0gIm1lbnUiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJuYXYiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJvbCIgfHwgbmV4dDIudGFnTmFtZSA9PT0gInAiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJwcmUiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJzZWN0aW9uIiB8fCBuZXh0Mi50YWdOYW1lID09PSAidGFibGUiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJ1bCIpIDogIXBhcmVudCB8fCAvLyBDb25mdXNpbmcgcGFyZW50LgogICEocGFyZW50LnR5cGUgPT09ICJlbGVtZW50IiAmJiAocGFyZW50LnRhZ05hbWUgPT09ICJhIiB8fCBwYXJlbnQudGFnTmFtZSA9PT0gImF1ZGlvIiB8fCBwYXJlbnQudGFnTmFtZSA9PT0gImRlbCIgfHwgcGFyZW50LnRhZ05hbWUgPT09ICJpbnMiIHx8IHBhcmVudC50YWdOYW1lID09PSAibWFwIiB8fCBwYXJlbnQudGFnTmFtZSA9PT0gIm5vc2NyaXB0IiB8fCBwYXJlbnQudGFnTmFtZSA9PT0gInZpZGVvIikpOwp9Cl9fbmFtZShwNCwgInAiKTsKZnVuY3Rpb24gbGkoXzMsIGluZGV4MiwgcGFyZW50KSB7CiAgY29uc3QgbmV4dDIgPSBzaWJsaW5nQWZ0ZXIocGFyZW50LCBpbmRleDIpOwogIHJldHVybiAhbmV4dDIgfHwgbmV4dDIudHlwZSA9PT0gImVsZW1lbnQiICYmIG5leHQyLnRhZ05hbWUgPT09ICJsaSI7Cn0KX19uYW1lKGxpLCAibGkiKTsKZnVuY3Rpb24gZHQoXzMsIGluZGV4MiwgcGFyZW50KSB7CiAgY29uc3QgbmV4dDIgPSBzaWJsaW5nQWZ0ZXIocGFyZW50LCBpbmRleDIpOwogIHJldHVybiBCb29sZWFuKAogICAgbmV4dDIgJiYgbmV4dDIudHlwZSA9PT0gImVsZW1lbnQiICYmIChuZXh0Mi50YWdOYW1lID09PSAiZHQiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJkZCIpCiAgKTsKfQpfX25hbWUoZHQsICJkdCIpOwpmdW5jdGlvbiBkZChfMywgaW5kZXgyLCBwYXJlbnQpIHsKICBjb25zdCBuZXh0MiA9IHNpYmxpbmdBZnRlcihwYXJlbnQsIGluZGV4Mik7CiAgcmV0dXJuICFuZXh0MiB8fCBuZXh0Mi50eXBlID09PSAiZWxlbWVudCIgJiYgKG5leHQyLnRhZ05hbWUgPT09ICJkdCIgfHwgbmV4dDIudGFnTmFtZSA9PT0gImRkIik7Cn0KX19uYW1lKGRkLCAiZGQiKTsKZnVuY3Rpb24gcnVieUVsZW1lbnQoXzMsIGluZGV4MiwgcGFyZW50KSB7CiAgY29uc3QgbmV4dDIgPSBzaWJsaW5nQWZ0ZXIocGFyZW50LCBpbmRleDIpOwogIHJldHVybiAhbmV4dDIgfHwgbmV4dDIudHlwZSA9PT0gImVsZW1lbnQiICYmIChuZXh0Mi50YWdOYW1lID09PSAicnAiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJydCIpOwp9Cl9fbmFtZShydWJ5RWxlbWVudCwgInJ1YnlFbGVtZW50Iik7CmZ1bmN0aW9uIG9wdGdyb3VwKF8zLCBpbmRleDIsIHBhcmVudCkgewogIGNvbnN0IG5leHQyID0gc2libGluZ0FmdGVyKHBhcmVudCwgaW5kZXgyKTsKICByZXR1cm4gIW5leHQyIHx8IG5leHQyLnR5cGUgPT09ICJlbGVtZW50IiAmJiBuZXh0Mi50YWdOYW1lID09PSAib3B0Z3JvdXAiOwp9Cl9fbmFtZShvcHRncm91cCwgIm9wdGdyb3VwIik7CmZ1bmN0aW9uIG9wdGlvbihfMywgaW5kZXgyLCBwYXJlbnQpIHsKICBjb25zdCBuZXh0MiA9IHNpYmxpbmdBZnRlcihwYXJlbnQsIGluZGV4Mik7CiAgcmV0dXJuICFuZXh0MiB8fCBuZXh0Mi50eXBlID09PSAiZWxlbWVudCIgJiYgKG5leHQyLnRhZ05hbWUgPT09ICJvcHRpb24iIHx8IG5leHQyLnRhZ05hbWUgPT09ICJvcHRncm91cCIpOwp9Cl9fbmFtZShvcHRpb24sICJvcHRpb24iKTsKZnVuY3Rpb24gdGhlYWQoXzMsIGluZGV4MiwgcGFyZW50KSB7CiAgY29uc3QgbmV4dDIgPSBzaWJsaW5nQWZ0ZXIocGFyZW50LCBpbmRleDIpOwogIHJldHVybiBCb29sZWFuKAogICAgbmV4dDIgJiYgbmV4dDIudHlwZSA9PT0gImVsZW1lbnQiICYmIChuZXh0Mi50YWdOYW1lID09PSAidGJvZHkiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJ0Zm9vdCIpCiAgKTsKfQpfX25hbWUodGhlYWQsICJ0aGVhZCIpOwpmdW5jdGlvbiB0Ym9keShfMywgaW5kZXgyLCBwYXJlbnQpIHsKICBjb25zdCBuZXh0MiA9IHNpYmxpbmdBZnRlcihwYXJlbnQsIGluZGV4Mik7CiAgcmV0dXJuICFuZXh0MiB8fCBuZXh0Mi50eXBlID09PSAiZWxlbWVudCIgJiYgKG5leHQyLnRhZ05hbWUgPT09ICJ0Ym9keSIgfHwgbmV4dDIudGFnTmFtZSA9PT0gInRmb290Iik7Cn0KX19uYW1lKHRib2R5LCAidGJvZHkiKTsKZnVuY3Rpb24gdGZvb3QoXzMsIGluZGV4MiwgcGFyZW50KSB7CiAgcmV0dXJuICFzaWJsaW5nQWZ0ZXIocGFyZW50LCBpbmRleDIpOwp9Cl9fbmFtZSh0Zm9vdCwgInRmb290Iik7CmZ1bmN0aW9uIHRyKF8zLCBpbmRleDIsIHBhcmVudCkgewogIGNvbnN0IG5leHQyID0gc2libGluZ0FmdGVyKHBhcmVudCwgaW5kZXgyKTsKICByZXR1cm4gIW5leHQyIHx8IG5leHQyLnR5cGUgPT09ICJlbGVtZW50IiAmJiBuZXh0Mi50YWdOYW1lID09PSAidHIiOwp9Cl9fbmFtZSh0ciwgInRyIik7CmZ1bmN0aW9uIGNlbGxzKF8zLCBpbmRleDIsIHBhcmVudCkgewogIGNvbnN0IG5leHQyID0gc2libGluZ0FmdGVyKHBhcmVudCwgaW5kZXgyKTsKICByZXR1cm4gIW5leHQyIHx8IG5leHQyLnR5cGUgPT09ICJlbGVtZW50IiAmJiAobmV4dDIudGFnTmFtZSA9PT0gInRkIiB8fCBuZXh0Mi50YWdOYW1lID09PSAidGgiKTsKfQpfX25hbWUoY2VsbHMsICJjZWxscyIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2hhc3QtdXRpbC10by1odG1sQDkuMC41L25vZGVfbW9kdWxlcy9oYXN0LXV0aWwtdG8taHRtbC9saWIvb21pc3Npb24vb3BlbmluZy5qcwp2YXIgb3BlbmluZyA9IG9taXNzaW9uKHsKICBib2R5OiBib2R5MiwKICBjb2xncm91cCwKICBoZWFkLAogIGh0bWw6IGh0bWw2LAogIHRib2R5OiB0Ym9keTIKfSk7CmZ1bmN0aW9uIGh0bWw2KG5vZGUyKSB7CiAgY29uc3QgaGVhZDIgPSBzaWJsaW5nQWZ0ZXIobm9kZTIsIC0xKTsKICByZXR1cm4gIWhlYWQyIHx8IGhlYWQyLnR5cGUgIT09ICJjb21tZW50IjsKfQpfX25hbWUoaHRtbDYsICJodG1sIik7CmZ1bmN0aW9uIGhlYWQobm9kZTIpIHsKICBjb25zdCBzZWVuID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTsKICBmb3IgKGNvbnN0IGNoaWxkMiBvZiBub2RlMi5jaGlsZHJlbikgewogICAgaWYgKGNoaWxkMi50eXBlID09PSAiZWxlbWVudCIgJiYgKGNoaWxkMi50YWdOYW1lID09PSAiYmFzZSIgfHwgY2hpbGQyLnRhZ05hbWUgPT09ICJ0aXRsZSIpKSB7CiAgICAgIGlmIChzZWVuLmhhcyhjaGlsZDIudGFnTmFtZSkpIHJldHVybiBmYWxzZTsKICAgICAgc2Vlbi5hZGQoY2hpbGQyLnRhZ05hbWUpOwogICAgfQogIH0KICBjb25zdCBjaGlsZCA9IG5vZGUyLmNoaWxkcmVuWzBdOwogIHJldHVybiAhY2hpbGQgfHwgY2hpbGQudHlwZSA9PT0gImVsZW1lbnQiOwp9Cl9fbmFtZShoZWFkLCAiaGVhZCIpOwpmdW5jdGlvbiBib2R5Mihub2RlMikgewogIGNvbnN0IGhlYWQyID0gc2libGluZ0FmdGVyKG5vZGUyLCAtMSwgdHJ1ZSk7CiAgcmV0dXJuICFoZWFkMiB8fCBoZWFkMi50eXBlICE9PSAiY29tbWVudCIgJiYgIShoZWFkMi50eXBlID09PSAidGV4dCIgJiYgd2hpdGVzcGFjZShoZWFkMi52YWx1ZS5jaGFyQXQoMCkpKSAmJiAhKGhlYWQyLnR5cGUgPT09ICJlbGVtZW50IiAmJiAoaGVhZDIudGFnTmFtZSA9PT0gIm1ldGEiIHx8IGhlYWQyLnRhZ05hbWUgPT09ICJsaW5rIiB8fCBoZWFkMi50YWdOYW1lID09PSAic2NyaXB0IiB8fCBoZWFkMi50YWdOYW1lID09PSAic3R5bGUiIHx8IGhlYWQyLnRhZ05hbWUgPT09ICJ0ZW1wbGF0ZSIpKTsKfQpfX25hbWUoYm9keTIsICJib2R5Iik7CmZ1bmN0aW9uIGNvbGdyb3VwKG5vZGUyLCBpbmRleDIsIHBhcmVudCkgewogIGNvbnN0IHByZXZpb3VzMyA9IHNpYmxpbmdCZWZvcmUocGFyZW50LCBpbmRleDIpOwogIGNvbnN0IGhlYWQyID0gc2libGluZ0FmdGVyKG5vZGUyLCAtMSwgdHJ1ZSk7CiAgaWYgKHBhcmVudCAmJiBwcmV2aW91czMgJiYgcHJldmlvdXMzLnR5cGUgPT09ICJlbGVtZW50IiAmJiBwcmV2aW91czMudGFnTmFtZSA9PT0gImNvbGdyb3VwIiAmJiBjbG9zaW5nKHByZXZpb3VzMywgcGFyZW50LmNoaWxkcmVuLmluZGV4T2YocHJldmlvdXMzKSwgcGFyZW50KSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICByZXR1cm4gQm9vbGVhbihoZWFkMiAmJiBoZWFkMi50eXBlID09PSAiZWxlbWVudCIgJiYgaGVhZDIudGFnTmFtZSA9PT0gImNvbCIpOwp9Cl9fbmFtZShjb2xncm91cCwgImNvbGdyb3VwIik7CmZ1bmN0aW9uIHRib2R5Mihub2RlMiwgaW5kZXgyLCBwYXJlbnQpIHsKICBjb25zdCBwcmV2aW91czMgPSBzaWJsaW5nQmVmb3JlKHBhcmVudCwgaW5kZXgyKTsKICBjb25zdCBoZWFkMiA9IHNpYmxpbmdBZnRlcihub2RlMiwgLTEpOwogIGlmIChwYXJlbnQgJiYgcHJldmlvdXMzICYmIHByZXZpb3VzMy50eXBlID09PSAiZWxlbWVudCIgJiYgKHByZXZpb3VzMy50YWdOYW1lID09PSAidGhlYWQiIHx8IHByZXZpb3VzMy50YWdOYW1lID09PSAidGJvZHkiKSAmJiBjbG9zaW5nKHByZXZpb3VzMywgcGFyZW50LmNoaWxkcmVuLmluZGV4T2YocHJldmlvdXMzKSwgcGFyZW50KSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICByZXR1cm4gQm9vbGVhbihoZWFkMiAmJiBoZWFkMi50eXBlID09PSAiZWxlbWVudCIgJiYgaGVhZDIudGFnTmFtZSA9PT0gInRyIik7Cn0KX19uYW1lKHRib2R5MiwgInRib2R5Iik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vaGFzdC11dGlsLXRvLWh0bWxAOS4wLjUvbm9kZV9tb2R1bGVzL2hhc3QtdXRpbC10by1odG1sL2xpYi9oYW5kbGUvZWxlbWVudC5qcwp2YXIgY29uc3RhbnRzID0gewogIC8vIFNlZTogPGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI2F0dHJpYnV0ZS1uYW1lLXN0YXRlPi4KICBuYW1lOiBbCiAgICBbIglcblxmXHIgJi89PiIuc3BsaXQoIiIpLCAiCVxuXGZcciBcIiYnLz0+YCIuc3BsaXQoIiIpXSwKICAgIFtgXDAJClxmXHIgIiYnLzw9PmAuc3BsaXQoIiIpLCAiXDAJXG5cZlxyIFwiJicvPD0+YCIuc3BsaXQoIiIpXQogIF0sCiAgLy8gU2VlOiA8aHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jYXR0cmlidXRlLXZhbHVlLSh1bnF1b3RlZCktc3RhdGU+LgogIHVucXVvdGVkOiBbCiAgICBbIglcblxmXHIgJj4iLnNwbGl0KCIiKSwgIlwwCVxuXGZcciBcIiYnPD0+YCIuc3BsaXQoIiIpXSwKICAgIFsiXDAJXG5cZlxyIFwiJic8PT5gIi5zcGxpdCgiIiksICJcMAlcblxmXHIgXCImJzw9PmAiLnNwbGl0KCIiKV0KICBdLAogIC8vIFNlZTogPGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI2F0dHJpYnV0ZS12YWx1ZS0oc2luZ2xlLXF1b3RlZCktc3RhdGU+LgogIHNpbmdsZTogWwogICAgWyImJyIuc3BsaXQoIiIpLCAiXCImJ2AiLnNwbGl0KCIiKV0sCiAgICBbIlwwJiciLnNwbGl0KCIiKSwgIlwwXCImJ2AiLnNwbGl0KCIiKV0KICBdLAogIC8vIFNlZTogPGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI2F0dHJpYnV0ZS12YWx1ZS0oZG91YmxlLXF1b3RlZCktc3RhdGU+LgogIGRvdWJsZTogWwogICAgWyciJicuc3BsaXQoIiIpLCAiXCImJ2AiLnNwbGl0KCIiKV0sCiAgICBbJ1wwIiYnLnNwbGl0KCIiKSwgIlwwXCImJ2AiLnNwbGl0KCIiKV0KICBdCn07CmZ1bmN0aW9uIGVsZW1lbnQzKG5vZGUyLCBpbmRleDIsIHBhcmVudCwgc3RhdGUpIHsKICBjb25zdCBzY2hlbWEgPSBzdGF0ZS5zY2hlbWE7CiAgY29uc3Qgb21pdCA9IHNjaGVtYS5zcGFjZSA9PT0gInN2ZyIgPyBmYWxzZSA6IHN0YXRlLnNldHRpbmdzLm9taXRPcHRpb25hbFRhZ3M7CiAgbGV0IHNlbGZDbG9zaW5nID0gc2NoZW1hLnNwYWNlID09PSAic3ZnIiA/IHN0YXRlLnNldHRpbmdzLmNsb3NlRW1wdHlFbGVtZW50cyA6IHN0YXRlLnNldHRpbmdzLnZvaWRzLmluY2x1ZGVzKG5vZGUyLnRhZ05hbWUudG9Mb3dlckNhc2UoKSk7CiAgY29uc3QgcGFydHMgPSBbXTsKICBsZXQgbGFzdDM7CiAgaWYgKHNjaGVtYS5zcGFjZSA9PT0gImh0bWwiICYmIG5vZGUyLnRhZ05hbWUgPT09ICJzdmciKSB7CiAgICBzdGF0ZS5zY2hlbWEgPSBzdmcyOwogIH0KICBjb25zdCBhdHRyaWJ1dGVzID0gc2VyaWFsaXplQXR0cmlidXRlcyhzdGF0ZSwgbm9kZTIucHJvcGVydGllcyk7CiAgY29uc3QgY29udGVudDMgPSBzdGF0ZS5hbGwoCiAgICBzY2hlbWEuc3BhY2UgPT09ICJodG1sIiAmJiBub2RlMi50YWdOYW1lID09PSAidGVtcGxhdGUiID8gbm9kZTIuY29udGVudCA6IG5vZGUyCiAgKTsKICBzdGF0ZS5zY2hlbWEgPSBzY2hlbWE7CiAgaWYgKGNvbnRlbnQzKSBzZWxmQ2xvc2luZyA9IGZhbHNlOwogIGlmIChhdHRyaWJ1dGVzIHx8ICFvbWl0IHx8ICFvcGVuaW5nKG5vZGUyLCBpbmRleDIsIHBhcmVudCkpIHsKICAgIHBhcnRzLnB1c2goIjwiLCBub2RlMi50YWdOYW1lLCBhdHRyaWJ1dGVzID8gIiAiICsgYXR0cmlidXRlcyA6ICIiKTsKICAgIGlmIChzZWxmQ2xvc2luZyAmJiAoc2NoZW1hLnNwYWNlID09PSAic3ZnIiB8fCBzdGF0ZS5zZXR0aW5ncy5jbG9zZVNlbGZDbG9zaW5nKSkgewogICAgICBsYXN0MyA9IGF0dHJpYnV0ZXMuY2hhckF0KGF0dHJpYnV0ZXMubGVuZ3RoIC0gMSk7CiAgICAgIGlmICghc3RhdGUuc2V0dGluZ3MudGlnaHRTZWxmQ2xvc2luZyB8fCBsYXN0MyA9PT0gIi8iIHx8IGxhc3QzICYmIGxhc3QzICE9PSAnIicgJiYgbGFzdDMgIT09ICInIikgewogICAgICAgIHBhcnRzLnB1c2goIiAiKTsKICAgICAgfQogICAgICBwYXJ0cy5wdXNoKCIvIik7CiAgICB9CiAgICBwYXJ0cy5wdXNoKCI+Iik7CiAgfQogIHBhcnRzLnB1c2goY29udGVudDMpOwogIGlmICghc2VsZkNsb3NpbmcgJiYgKCFvbWl0IHx8ICFjbG9zaW5nKG5vZGUyLCBpbmRleDIsIHBhcmVudCkpKSB7CiAgICBwYXJ0cy5wdXNoKCI8LyIgKyBub2RlMi50YWdOYW1lICsgIj4iKTsKICB9CiAgcmV0dXJuIHBhcnRzLmpvaW4oIiIpOwp9Cl9fbmFtZShlbGVtZW50MywgImVsZW1lbnQiKTsKZnVuY3Rpb24gc2VyaWFsaXplQXR0cmlidXRlcyhzdGF0ZSwgcHJvcGVydGllczIpIHsKICBjb25zdCB2YWx1ZXMgPSBbXTsKICBsZXQgaW5kZXgyID0gLTE7CiAgbGV0IGtleTI7CiAgaWYgKHByb3BlcnRpZXMyKSB7CiAgICBmb3IgKGtleTIgaW4gcHJvcGVydGllczIpIHsKICAgICAgaWYgKHByb3BlcnRpZXMyW2tleTJdICE9PSBudWxsICYmIHByb3BlcnRpZXMyW2tleTJdICE9PSB2b2lkIDApIHsKICAgICAgICBjb25zdCB2YWx1ZTIgPSBzZXJpYWxpemVBdHRyaWJ1dGUoc3RhdGUsIGtleTIsIHByb3BlcnRpZXMyW2tleTJdKTsKICAgICAgICBpZiAodmFsdWUyKSB2YWx1ZXMucHVzaCh2YWx1ZTIpOwogICAgICB9CiAgICB9CiAgfQogIHdoaWxlICgrK2luZGV4MiA8IHZhbHVlcy5sZW5ndGgpIHsKICAgIGNvbnN0IGxhc3QzID0gc3RhdGUuc2V0dGluZ3MudGlnaHRBdHRyaWJ1dGVzID8gdmFsdWVzW2luZGV4Ml0uY2hhckF0KHZhbHVlc1tpbmRleDJdLmxlbmd0aCAtIDEpIDogdm9pZCAwOwogICAgaWYgKGluZGV4MiAhPT0gdmFsdWVzLmxlbmd0aCAtIDEgJiYgbGFzdDMgIT09ICciJyAmJiBsYXN0MyAhPT0gIiciKSB7CiAgICAgIHZhbHVlc1tpbmRleDJdICs9ICIgIjsKICAgIH0KICB9CiAgcmV0dXJuIHZhbHVlcy5qb2luKCIiKTsKfQpfX25hbWUoc2VyaWFsaXplQXR0cmlidXRlcywgInNlcmlhbGl6ZUF0dHJpYnV0ZXMiKTsKZnVuY3Rpb24gc2VyaWFsaXplQXR0cmlidXRlKHN0YXRlLCBrZXkyLCB2YWx1ZTIpIHsKICBjb25zdCBpbmZvID0gZmluZDIoc3RhdGUuc2NoZW1hLCBrZXkyKTsKICBjb25zdCB4MyA9IHN0YXRlLnNldHRpbmdzLmFsbG93UGFyc2VFcnJvcnMgJiYgc3RhdGUuc2NoZW1hLnNwYWNlID09PSAiaHRtbCIgPyAwIDogMTsKICBjb25zdCB5MyA9IHN0YXRlLnNldHRpbmdzLmFsbG93RGFuZ2Vyb3VzQ2hhcmFjdGVycyA/IDAgOiAxOwogIGxldCBxdW90ZSA9IHN0YXRlLnF1b3RlOwogIGxldCByZXN1bHQ7CiAgaWYgKGluZm8ub3ZlcmxvYWRlZEJvb2xlYW4gJiYgKHZhbHVlMiA9PT0gaW5mby5hdHRyaWJ1dGUgfHwgdmFsdWUyID09PSAiIikpIHsKICAgIHZhbHVlMiA9IHRydWU7CiAgfSBlbHNlIGlmICgoaW5mby5ib29sZWFuIHx8IGluZm8ub3ZlcmxvYWRlZEJvb2xlYW4pICYmICh0eXBlb2YgdmFsdWUyICE9PSAic3RyaW5nIiB8fCB2YWx1ZTIgPT09IGluZm8uYXR0cmlidXRlIHx8IHZhbHVlMiA9PT0gIiIpKSB7CiAgICB2YWx1ZTIgPSBCb29sZWFuKHZhbHVlMik7CiAgfQogIGlmICh2YWx1ZTIgPT09IG51bGwgfHwgdmFsdWUyID09PSB2b2lkIDAgfHwgdmFsdWUyID09PSBmYWxzZSB8fCB0eXBlb2YgdmFsdWUyID09PSAibnVtYmVyIiAmJiBOdW1iZXIuaXNOYU4odmFsdWUyKSkgewogICAgcmV0dXJuICIiOwogIH0KICBjb25zdCBuYW1lID0gc3RyaW5naWZ5RW50aXRpZXMoCiAgICBpbmZvLmF0dHJpYnV0ZSwKICAgIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnNldHRpbmdzLmNoYXJhY3RlclJlZmVyZW5jZXMsIHsKICAgICAgLy8gQWx3YXlzIGVuY29kZSB3aXRob3V0IHBhcnNlIGVycm9ycyBpbiBub24tSFRNTC4KICAgICAgc3Vic2V0OiBjb25zdGFudHMubmFtZVt4M11beTNdCiAgICB9KQogICk7CiAgaWYgKHZhbHVlMiA9PT0gdHJ1ZSkgcmV0dXJuIG5hbWU7CiAgdmFsdWUyID0gQXJyYXkuaXNBcnJheSh2YWx1ZTIpID8gKGluZm8uY29tbWFTZXBhcmF0ZWQgPyBzdHJpbmdpZnkzIDogc3RyaW5naWZ5NCkodmFsdWUyLCB7CiAgICBwYWRMZWZ0OiAhc3RhdGUuc2V0dGluZ3MudGlnaHRDb21tYVNlcGFyYXRlZExpc3RzCiAgfSkgOiBTdHJpbmcodmFsdWUyKTsKICBpZiAoc3RhdGUuc2V0dGluZ3MuY29sbGFwc2VFbXB0eUF0dHJpYnV0ZXMgJiYgIXZhbHVlMikgcmV0dXJuIG5hbWU7CiAgaWYgKHN0YXRlLnNldHRpbmdzLnByZWZlclVucXVvdGVkKSB7CiAgICByZXN1bHQgPSBzdHJpbmdpZnlFbnRpdGllcygKICAgICAgdmFsdWUyLAogICAgICBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5zZXR0aW5ncy5jaGFyYWN0ZXJSZWZlcmVuY2VzLCB7CiAgICAgICAgYXR0cmlidXRlOiB0cnVlLAogICAgICAgIHN1YnNldDogY29uc3RhbnRzLnVucXVvdGVkW3gzXVt5M10KICAgICAgfSkKICAgICk7CiAgfQogIGlmIChyZXN1bHQgIT09IHZhbHVlMikgewogICAgaWYgKHN0YXRlLnNldHRpbmdzLnF1b3RlU21hcnQgJiYgY2NvdW50KHZhbHVlMiwgcXVvdGUpID4gY2NvdW50KHZhbHVlMiwgc3RhdGUuYWx0ZXJuYXRpdmUpKSB7CiAgICAgIHF1b3RlID0gc3RhdGUuYWx0ZXJuYXRpdmU7CiAgICB9CiAgICByZXN1bHQgPSBxdW90ZSArIHN0cmluZ2lmeUVudGl0aWVzKAogICAgICB2YWx1ZTIsCiAgICAgIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnNldHRpbmdzLmNoYXJhY3RlclJlZmVyZW5jZXMsIHsKICAgICAgICAvLyBBbHdheXMgZW5jb2RlIHdpdGhvdXQgcGFyc2UgZXJyb3JzIGluIG5vbi1IVE1MLgogICAgICAgIHN1YnNldDogKHF1b3RlID09PSAiJyIgPyBjb25zdGFudHMuc2luZ2xlIDogY29uc3RhbnRzLmRvdWJsZSlbeDNdW3kzXSwKICAgICAgICBhdHRyaWJ1dGU6IHRydWUKICAgICAgfSkKICAgICkgKyBxdW90ZTsKICB9CiAgcmV0dXJuIG5hbWUgKyAocmVzdWx0ID8gIj0iICsgcmVzdWx0IDogcmVzdWx0KTsKfQpfX25hbWUoc2VyaWFsaXplQXR0cmlidXRlLCAic2VyaWFsaXplQXR0cmlidXRlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vaGFzdC11dGlsLXRvLWh0bWxAOS4wLjUvbm9kZV9tb2R1bGVzL2hhc3QtdXRpbC10by1odG1sL2xpYi9oYW5kbGUvdGV4dC5qcwp2YXIgdGV4dEVudGl0eVN1YnNldCA9IFsiPCIsICImIl07CmZ1bmN0aW9uIHRleHQ3KG5vZGUyLCBfMywgcGFyZW50LCBzdGF0ZSkgewogIHJldHVybiBwYXJlbnQgJiYgcGFyZW50LnR5cGUgPT09ICJlbGVtZW50IiAmJiAocGFyZW50LnRhZ05hbWUgPT09ICJzY3JpcHQiIHx8IHBhcmVudC50YWdOYW1lID09PSAic3R5bGUiKSA/IG5vZGUyLnZhbHVlIDogc3RyaW5naWZ5RW50aXRpZXMoCiAgICBub2RlMi52YWx1ZSwKICAgIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnNldHRpbmdzLmNoYXJhY3RlclJlZmVyZW5jZXMsIHsKICAgICAgc3Vic2V0OiB0ZXh0RW50aXR5U3Vic2V0CiAgICB9KQogICk7Cn0KX19uYW1lKHRleHQ3LCAidGV4dCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2hhc3QtdXRpbC10by1odG1sQDkuMC41L25vZGVfbW9kdWxlcy9oYXN0LXV0aWwtdG8taHRtbC9saWIvaGFuZGxlL3Jhdy5qcwpmdW5jdGlvbiByYXcobm9kZTIsIGluZGV4MiwgcGFyZW50LCBzdGF0ZSkgewogIHJldHVybiBzdGF0ZS5zZXR0aW5ncy5hbGxvd0Rhbmdlcm91c0h0bWwgPyBub2RlMi52YWx1ZSA6IHRleHQ3KG5vZGUyLCBpbmRleDIsIHBhcmVudCwgc3RhdGUpOwp9Cl9fbmFtZShyYXcsICJyYXciKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9oYXN0LXV0aWwtdG8taHRtbEA5LjAuNS9ub2RlX21vZHVsZXMvaGFzdC11dGlsLXRvLWh0bWwvbGliL2hhbmRsZS9yb290LmpzCmZ1bmN0aW9uIHJvb3Q0KG5vZGUyLCBfMSwgXzIyLCBzdGF0ZSkgewogIHJldHVybiBzdGF0ZS5hbGwobm9kZTIpOwp9Cl9fbmFtZShyb290NCwgInJvb3QiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9oYXN0LXV0aWwtdG8taHRtbEA5LjAuNS9ub2RlX21vZHVsZXMvaGFzdC11dGlsLXRvLWh0bWwvbGliL2hhbmRsZS9pbmRleC5qcwp2YXIgaGFuZGxlMiA9IHp3aXRjaCgidHlwZSIsIHsKICBpbnZhbGlkOiBpbnZhbGlkMiwKICB1bmtub3duOiB1bmtub3duMiwKICBoYW5kbGVyczogeyBjb21tZW50OiBjb21tZW50MiwgZG9jdHlwZTogZG9jdHlwZTIsIGVsZW1lbnQ6IGVsZW1lbnQzLCByYXcsIHJvb3Q6IHJvb3Q0LCB0ZXh0OiB0ZXh0NyB9Cn0pOwpmdW5jdGlvbiBpbnZhbGlkMihub2RlMikgewogIHRocm93IG5ldyBFcnJvcigiRXhwZWN0ZWQgbm9kZSwgbm90IGAiICsgbm9kZTIgKyAiYCIpOwp9Cl9fbmFtZShpbnZhbGlkMiwgImludmFsaWQiKTsKZnVuY3Rpb24gdW5rbm93bjIobm9kZV8pIHsKICBjb25zdCBub2RlMiA9ICgKICAgIC8qKiBAdHlwZSB7Tm9kZXN9ICovCiAgICBub2RlXwogICk7CiAgdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgY29tcGlsZSB1bmtub3duIG5vZGUgYCIgKyBub2RlMi50eXBlICsgImAiKTsKfQpfX25hbWUodW5rbm93bjIsICJ1bmtub3duIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vaGFzdC11dGlsLXRvLWh0bWxAOS4wLjUvbm9kZV9tb2R1bGVzL2hhc3QtdXRpbC10by1odG1sL2xpYi9pbmRleC5qcwp2YXIgZW1wdHlPcHRpb25zNiA9IHt9Owp2YXIgZW1wdHlDaGFyYWN0ZXJSZWZlcmVuY2VzID0ge307CnZhciBlbXB0eUNoaWxkcmVuMiA9IFtdOwpmdW5jdGlvbiB0b0h0bWwodHJlZSwgb3B0aW9ucykgewogIGNvbnN0IG9wdGlvbnNfID0gb3B0aW9ucyB8fCBlbXB0eU9wdGlvbnM2OwogIGNvbnN0IHF1b3RlID0gb3B0aW9uc18ucXVvdGUgfHwgJyInOwogIGNvbnN0IGFsdGVybmF0aXZlID0gcXVvdGUgPT09ICciJyA/ICInIiA6ICciJzsKICBpZiAocXVvdGUgIT09ICciJyAmJiBxdW90ZSAhPT0gIiciKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgcXVvdGUgYCIgKyBxdW90ZSArICJgLCBleHBlY3RlZCBgJ2Agb3IgYFwiYCIpOwogIH0KICBjb25zdCBzdGF0ZSA9IHsKICAgIG9uZTogb25lMiwKICAgIGFsbDogYWxsMiwKICAgIHNldHRpbmdzOiB7CiAgICAgIG9taXRPcHRpb25hbFRhZ3M6IG9wdGlvbnNfLm9taXRPcHRpb25hbFRhZ3MgfHwgZmFsc2UsCiAgICAgIGFsbG93UGFyc2VFcnJvcnM6IG9wdGlvbnNfLmFsbG93UGFyc2VFcnJvcnMgfHwgZmFsc2UsCiAgICAgIGFsbG93RGFuZ2Vyb3VzQ2hhcmFjdGVyczogb3B0aW9uc18uYWxsb3dEYW5nZXJvdXNDaGFyYWN0ZXJzIHx8IGZhbHNlLAogICAgICBxdW90ZVNtYXJ0OiBvcHRpb25zXy5xdW90ZVNtYXJ0IHx8IGZhbHNlLAogICAgICBwcmVmZXJVbnF1b3RlZDogb3B0aW9uc18ucHJlZmVyVW5xdW90ZWQgfHwgZmFsc2UsCiAgICAgIHRpZ2h0QXR0cmlidXRlczogb3B0aW9uc18udGlnaHRBdHRyaWJ1dGVzIHx8IGZhbHNlLAogICAgICB1cHBlckRvY3R5cGU6IG9wdGlvbnNfLnVwcGVyRG9jdHlwZSB8fCBmYWxzZSwKICAgICAgdGlnaHREb2N0eXBlOiBvcHRpb25zXy50aWdodERvY3R5cGUgfHwgZmFsc2UsCiAgICAgIGJvZ3VzQ29tbWVudHM6IG9wdGlvbnNfLmJvZ3VzQ29tbWVudHMgfHwgZmFsc2UsCiAgICAgIHRpZ2h0Q29tbWFTZXBhcmF0ZWRMaXN0czogb3B0aW9uc18udGlnaHRDb21tYVNlcGFyYXRlZExpc3RzIHx8IGZhbHNlLAogICAgICB0aWdodFNlbGZDbG9zaW5nOiBvcHRpb25zXy50aWdodFNlbGZDbG9zaW5nIHx8IGZhbHNlLAogICAgICBjb2xsYXBzZUVtcHR5QXR0cmlidXRlczogb3B0aW9uc18uY29sbGFwc2VFbXB0eUF0dHJpYnV0ZXMgfHwgZmFsc2UsCiAgICAgIGFsbG93RGFuZ2Vyb3VzSHRtbDogb3B0aW9uc18uYWxsb3dEYW5nZXJvdXNIdG1sIHx8IGZhbHNlLAogICAgICB2b2lkczogb3B0aW9uc18udm9pZHMgfHwgaHRtbFZvaWRFbGVtZW50cywKICAgICAgY2hhcmFjdGVyUmVmZXJlbmNlczogb3B0aW9uc18uY2hhcmFjdGVyUmVmZXJlbmNlcyB8fCBlbXB0eUNoYXJhY3RlclJlZmVyZW5jZXMsCiAgICAgIGNsb3NlU2VsZkNsb3Npbmc6IG9wdGlvbnNfLmNsb3NlU2VsZkNsb3NpbmcgfHwgZmFsc2UsCiAgICAgIGNsb3NlRW1wdHlFbGVtZW50czogb3B0aW9uc18uY2xvc2VFbXB0eUVsZW1lbnRzIHx8IGZhbHNlCiAgICB9LAogICAgc2NoZW1hOiBvcHRpb25zXy5zcGFjZSA9PT0gInN2ZyIgPyBzdmcyIDogaHRtbDQsCiAgICBxdW90ZSwKICAgIGFsdGVybmF0aXZlCiAgfTsKICByZXR1cm4gc3RhdGUub25lKAogICAgQXJyYXkuaXNBcnJheSh0cmVlKSA/IHsgdHlwZTogInJvb3QiLCBjaGlsZHJlbjogdHJlZSB9IDogdHJlZSwKICAgIHZvaWQgMCwKICAgIHZvaWQgMAogICk7Cn0KX19uYW1lKHRvSHRtbCwgInRvSHRtbCIpOwpmdW5jdGlvbiBvbmUyKG5vZGUyLCBpbmRleDIsIHBhcmVudCkgewogIHJldHVybiBoYW5kbGUyKG5vZGUyLCBpbmRleDIsIHBhcmVudCwgdGhpcyk7Cn0KX19uYW1lKG9uZTIsICJvbmUiKTsKZnVuY3Rpb24gYWxsMihwYXJlbnQpIHsKICBjb25zdCByZXN1bHRzID0gW107CiAgY29uc3QgY2hpbGRyZW4yID0gcGFyZW50ICYmIHBhcmVudC5jaGlsZHJlbiB8fCBlbXB0eUNoaWxkcmVuMjsKICBsZXQgaW5kZXgyID0gLTE7CiAgd2hpbGUgKCsraW5kZXgyIDwgY2hpbGRyZW4yLmxlbmd0aCkgewogICAgcmVzdWx0c1tpbmRleDJdID0gdGhpcy5vbmUoY2hpbGRyZW4yW2luZGV4Ml0sIGluZGV4MiwgcGFyZW50KTsKICB9CiAgcmV0dXJuIHJlc3VsdHMuam9pbigiIik7Cn0KX19uYW1lKGFsbDIsICJhbGwiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yZW1hcmstaHRtbEAxNi4wLjEvbm9kZV9tb2R1bGVzL3JlbWFyay1odG1sL2xpYi9pbmRleC5qcwp2YXIgZW1wdHlPcHRpb25zNyA9IHt9OwpmdW5jdGlvbiByZW1hcmtIdG1sKG9wdGlvbnMpIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgY29uc3QgeyBoYW5kbGVyczogaGFuZGxlcnMyLCBzYW5pdGl6ZTogY2xlYW4sIC4uLnRvSHRtbE9wdGlvbnMgfSA9IG9wdGlvbnMgfHwgZW1wdHlPcHRpb25zNzsKICBsZXQgYWxsb3dEYW5nZXJvdXNIdG1sID0gZmFsc2U7CiAgbGV0IHNjaGVtYTsKICBpZiAodHlwZW9mIGNsZWFuID09PSAiYm9vbGVhbiIpIHsKICAgIGFsbG93RGFuZ2Vyb3VzSHRtbCA9ICFjbGVhbjsKICB9IGVsc2UgaWYgKGNsZWFuKSB7CiAgICBzY2hlbWEgPSBjbGVhbjsKICB9CiAgc2VsZjIuY29tcGlsZXIgPSBjb21waWxlcjI7CiAgZnVuY3Rpb24gY29tcGlsZXIyKHRyZWUsIGZpbGUpIHsKICAgIGNvbnN0IGhhc3QgPSB0b0hhc3QodHJlZSwgeyBoYW5kbGVyczogaGFuZGxlcnMyLCBhbGxvd0Rhbmdlcm91c0h0bWwgfSk7CiAgICBjb25zdCBzYWZlSGFzdCA9IGFsbG93RGFuZ2Vyb3VzSHRtbCA/IGhhc3QgOiBzYW5pdGl6ZShoYXN0LCBzY2hlbWEpOwogICAgY29uc3QgcmVzdWx0ID0gdG9IdG1sKHNhZmVIYXN0LCB7IC4uLnRvSHRtbE9wdGlvbnMsIGFsbG93RGFuZ2Vyb3VzSHRtbCB9KTsKICAgIGlmIChmaWxlLmV4dG5hbWUpIHsKICAgICAgZmlsZS5leHRuYW1lID0gIi5odG1sIjsKICAgIH0KICAgIHJldHVybiB0cmVlICYmIHRyZWUudHlwZSA9PT0gInJvb3QiICYmIHJlc3VsdCAmJiAvW15cclxuXS8udGVzdChyZXN1bHQuY2hhckF0KHJlc3VsdC5sZW5ndGggLSAxKSkgPyByZXN1bHQgKyAiXG4iIDogcmVzdWx0OwogIH0KICBfX25hbWUoY29tcGlsZXIyLCAiY29tcGlsZXIiKTsKfQpfX25hbWUocmVtYXJrSHRtbCwgInJlbWFya0h0bWwiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yZW1hcmstc3RyaW5naWZ5QDExLjAuMC9ub2RlX21vZHVsZXMvcmVtYXJrLXN0cmluZ2lmeS9saWIvaW5kZXguanMKZnVuY3Rpb24gcmVtYXJrU3RyaW5naWZ5KG9wdGlvbnMpIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgc2VsZjIuY29tcGlsZXIgPSBjb21waWxlcjI7CiAgZnVuY3Rpb24gY29tcGlsZXIyKHRyZWUpIHsKICAgIHJldHVybiB0b01hcmtkb3duKHRyZWUsIHsKICAgICAgLi4uc2VsZjIuZGF0YSgic2V0dGluZ3MiKSwKICAgICAgLi4ub3B0aW9ucywKICAgICAgLy8gTm90ZTogdGhpcyBvcHRpb24gaXMgbm90IGluIHRoZSByZWFkbWUuCiAgICAgIC8vIFRoZSBnb2FsIGlzIGZvciBpdCB0byBiZSBzZXQgYnkgcGx1Z2lucyBvbiBgZGF0YWAgaW5zdGVhZCBvZiBiZWluZwogICAgICAvLyBwYXNzZWQgYnkgdXNlcnMuCiAgICAgIGV4dGVuc2lvbnM6IHNlbGYyLmRhdGEoInRvTWFya2Rvd25FeHRlbnNpb25zIikgfHwgW10KICAgIH0pOwogIH0KICBfX25hbWUoY29tcGlsZXIyLCAiY29tcGlsZXIiKTsKfQpfX25hbWUocmVtYXJrU3RyaW5naWZ5LCAicmVtYXJrU3RyaW5naWZ5Iik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vdHVybmRvd25ANy4yLjIvbm9kZV9tb2R1bGVzL3R1cm5kb3duL2xpYi90dXJuZG93bi5icm93c2VyLmVzLmpzCmZ1bmN0aW9uIGV4dGVuZDIoZGVzdGluYXRpb24pIHsKICBmb3IgKHZhciBpMTAgPSAxOyBpMTAgPCBhcmd1bWVudHMubGVuZ3RoOyBpMTArKykgewogICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpMTBdOwogICAgZm9yICh2YXIga2V5MiBpbiBzb3VyY2UpIHsKICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShrZXkyKSkgZGVzdGluYXRpb25ba2V5Ml0gPSBzb3VyY2Vba2V5Ml07CiAgICB9CiAgfQogIHJldHVybiBkZXN0aW5hdGlvbjsKfQpfX25hbWUoZXh0ZW5kMiwgImV4dGVuZCIpOwpmdW5jdGlvbiByZXBlYXQyKGNoYXJhY3RlciwgY291bnQyKSB7CiAgcmV0dXJuIEFycmF5KGNvdW50MiArIDEpLmpvaW4oY2hhcmFjdGVyKTsKfQpfX25hbWUocmVwZWF0MiwgInJlcGVhdCIpOwpmdW5jdGlvbiB0cmltTGVhZGluZ05ld2xpbmVzKHN0cmluZzMpIHsKICByZXR1cm4gc3RyaW5nMy5yZXBsYWNlKC9eXG4qLywgIiIpOwp9Cl9fbmFtZSh0cmltTGVhZGluZ05ld2xpbmVzLCAidHJpbUxlYWRpbmdOZXdsaW5lcyIpOwpmdW5jdGlvbiB0cmltVHJhaWxpbmdOZXdsaW5lcyhzdHJpbmczKSB7CiAgdmFyIGluZGV4RW5kID0gc3RyaW5nMy5sZW5ndGg7CiAgd2hpbGUgKGluZGV4RW5kID4gMCAmJiBzdHJpbmczW2luZGV4RW5kIC0gMV0gPT09ICJcbiIpIGluZGV4RW5kLS07CiAgcmV0dXJuIHN0cmluZzMuc3Vic3RyaW5nKDAsIGluZGV4RW5kKTsKfQpfX25hbWUodHJpbVRyYWlsaW5nTmV3bGluZXMsICJ0cmltVHJhaWxpbmdOZXdsaW5lcyIpOwpmdW5jdGlvbiB0cmltTmV3bGluZXMoc3RyaW5nMykgewogIHJldHVybiB0cmltVHJhaWxpbmdOZXdsaW5lcyh0cmltTGVhZGluZ05ld2xpbmVzKHN0cmluZzMpKTsKfQpfX25hbWUodHJpbU5ld2xpbmVzLCAidHJpbU5ld2xpbmVzIik7CnZhciBibG9ja0VsZW1lbnRzID0gWwogICJBRERSRVNTIiwKICAiQVJUSUNMRSIsCiAgIkFTSURFIiwKICAiQVVESU8iLAogICJCTE9DS1FVT1RFIiwKICAiQk9EWSIsCiAgIkNBTlZBUyIsCiAgIkNFTlRFUiIsCiAgIkREIiwKICAiRElSIiwKICAiRElWIiwKICAiREwiLAogICJEVCIsCiAgIkZJRUxEU0VUIiwKICAiRklHQ0FQVElPTiIsCiAgIkZJR1VSRSIsCiAgIkZPT1RFUiIsCiAgIkZPUk0iLAogICJGUkFNRVNFVCIsCiAgIkgxIiwKICAiSDIiLAogICJIMyIsCiAgIkg0IiwKICAiSDUiLAogICJINiIsCiAgIkhFQURFUiIsCiAgIkhHUk9VUCIsCiAgIkhSIiwKICAiSFRNTCIsCiAgIklTSU5ERVgiLAogICJMSSIsCiAgIk1BSU4iLAogICJNRU5VIiwKICAiTkFWIiwKICAiTk9GUkFNRVMiLAogICJOT1NDUklQVCIsCiAgIk9MIiwKICAiT1VUUFVUIiwKICAiUCIsCiAgIlBSRSIsCiAgIlNFQ1RJT04iLAogICJUQUJMRSIsCiAgIlRCT0RZIiwKICAiVEQiLAogICJURk9PVCIsCiAgIlRIIiwKICAiVEhFQUQiLAogICJUUiIsCiAgIlVMIgpdOwpmdW5jdGlvbiBpc0Jsb2NrKG5vZGUyKSB7CiAgcmV0dXJuIGlzMihub2RlMiwgYmxvY2tFbGVtZW50cyk7Cn0KX19uYW1lKGlzQmxvY2ssICJpc0Jsb2NrIik7CnZhciB2b2lkRWxlbWVudHMgPSBbCiAgIkFSRUEiLAogICJCQVNFIiwKICAiQlIiLAogICJDT0wiLAogICJDT01NQU5EIiwKICAiRU1CRUQiLAogICJIUiIsCiAgIklNRyIsCiAgIklOUFVUIiwKICAiS0VZR0VOIiwKICAiTElOSyIsCiAgIk1FVEEiLAogICJQQVJBTSIsCiAgIlNPVVJDRSIsCiAgIlRSQUNLIiwKICAiV0JSIgpdOwpmdW5jdGlvbiBpc1ZvaWQobm9kZTIpIHsKICByZXR1cm4gaXMyKG5vZGUyLCB2b2lkRWxlbWVudHMpOwp9Cl9fbmFtZShpc1ZvaWQsICJpc1ZvaWQiKTsKZnVuY3Rpb24gaGFzVm9pZChub2RlMikgewogIHJldHVybiBoYXMobm9kZTIsIHZvaWRFbGVtZW50cyk7Cn0KX19uYW1lKGhhc1ZvaWQsICJoYXNWb2lkIik7CnZhciBtZWFuaW5nZnVsV2hlbkJsYW5rRWxlbWVudHMgPSBbCiAgIkEiLAogICJUQUJMRSIsCiAgIlRIRUFEIiwKICAiVEJPRFkiLAogICJURk9PVCIsCiAgIlRIIiwKICAiVEQiLAogICJJRlJBTUUiLAogICJTQ1JJUFQiLAogICJBVURJTyIsCiAgIlZJREVPIgpdOwpmdW5jdGlvbiBpc01lYW5pbmdmdWxXaGVuQmxhbmsobm9kZTIpIHsKICByZXR1cm4gaXMyKG5vZGUyLCBtZWFuaW5nZnVsV2hlbkJsYW5rRWxlbWVudHMpOwp9Cl9fbmFtZShpc01lYW5pbmdmdWxXaGVuQmxhbmssICJpc01lYW5pbmdmdWxXaGVuQmxhbmsiKTsKZnVuY3Rpb24gaGFzTWVhbmluZ2Z1bFdoZW5CbGFuayhub2RlMikgewogIHJldHVybiBoYXMobm9kZTIsIG1lYW5pbmdmdWxXaGVuQmxhbmtFbGVtZW50cyk7Cn0KX19uYW1lKGhhc01lYW5pbmdmdWxXaGVuQmxhbmssICJoYXNNZWFuaW5nZnVsV2hlbkJsYW5rIik7CmZ1bmN0aW9uIGlzMihub2RlMiwgdGFnTmFtZXMpIHsKICByZXR1cm4gdGFnTmFtZXMuaW5kZXhPZihub2RlMi5ub2RlTmFtZSkgPj0gMDsKfQpfX25hbWUoaXMyLCAiaXMiKTsKZnVuY3Rpb24gaGFzKG5vZGUyLCB0YWdOYW1lcykgewogIHJldHVybiBub2RlMi5nZXRFbGVtZW50c0J5VGFnTmFtZSAmJiB0YWdOYW1lcy5zb21lKGZ1bmN0aW9uKHRhZ05hbWUpIHsKICAgIHJldHVybiBub2RlMi5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lKS5sZW5ndGg7CiAgfSk7Cn0KX19uYW1lKGhhcywgImhhcyIpOwp2YXIgcnVsZXMgPSB7fTsKcnVsZXMucGFyYWdyYXBoID0gewogIGZpbHRlcjogInAiLAogIHJlcGxhY2VtZW50OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGNvbnRlbnQzKSB7CiAgICByZXR1cm4gIlxuXG4iICsgY29udGVudDMgKyAiXG5cbiI7CiAgfSwgInJlcGxhY2VtZW50IikKfTsKcnVsZXMubGluZUJyZWFrID0gewogIGZpbHRlcjogImJyIiwKICByZXBsYWNlbWVudDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihjb250ZW50Mywgbm9kZTIsIG9wdGlvbnMpIHsKICAgIHJldHVybiBvcHRpb25zLmJyICsgIlxuIjsKICB9LCAicmVwbGFjZW1lbnQiKQp9OwpydWxlcy5oZWFkaW5nID0gewogIGZpbHRlcjogWyJoMSIsICJoMiIsICJoMyIsICJoNCIsICJoNSIsICJoNiJdLAogIHJlcGxhY2VtZW50OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGNvbnRlbnQzLCBub2RlMiwgb3B0aW9ucykgewogICAgdmFyIGhMZXZlbCA9IE51bWJlcihub2RlMi5ub2RlTmFtZS5jaGFyQXQoMSkpOwogICAgaWYgKG9wdGlvbnMuaGVhZGluZ1N0eWxlID09PSAic2V0ZXh0IiAmJiBoTGV2ZWwgPCAzKSB7CiAgICAgIHZhciB1bmRlcmxpbmUgPSByZXBlYXQyKGhMZXZlbCA9PT0gMSA/ICI9IiA6ICItIiwgY29udGVudDMubGVuZ3RoKTsKICAgICAgcmV0dXJuICJcblxuIiArIGNvbnRlbnQzICsgIlxuIiArIHVuZGVybGluZSArICJcblxuIjsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAiXG5cbiIgKyByZXBlYXQyKCIjIiwgaExldmVsKSArICIgIiArIGNvbnRlbnQzICsgIlxuXG4iOwogICAgfQogIH0sICJyZXBsYWNlbWVudCIpCn07CnJ1bGVzLmJsb2NrcXVvdGUgPSB7CiAgZmlsdGVyOiAiYmxvY2txdW90ZSIsCiAgcmVwbGFjZW1lbnQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oY29udGVudDMpIHsKICAgIGNvbnRlbnQzID0gdHJpbU5ld2xpbmVzKGNvbnRlbnQzKS5yZXBsYWNlKC9eL2dtLCAiPiAiKTsKICAgIHJldHVybiAiXG5cbiIgKyBjb250ZW50MyArICJcblxuIjsKICB9LCAicmVwbGFjZW1lbnQiKQp9OwpydWxlcy5saXN0ID0gewogIGZpbHRlcjogWyJ1bCIsICJvbCJdLAogIHJlcGxhY2VtZW50OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGNvbnRlbnQzLCBub2RlMikgewogICAgdmFyIHBhcmVudCA9IG5vZGUyLnBhcmVudE5vZGU7CiAgICBpZiAocGFyZW50Lm5vZGVOYW1lID09PSAiTEkiICYmIHBhcmVudC5sYXN0RWxlbWVudENoaWxkID09PSBub2RlMikgewogICAgICByZXR1cm4gIlxuIiArIGNvbnRlbnQzOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICJcblxuIiArIGNvbnRlbnQzICsgIlxuXG4iOwogICAgfQogIH0sICJyZXBsYWNlbWVudCIpCn07CnJ1bGVzLmxpc3RJdGVtID0gewogIGZpbHRlcjogImxpIiwKICByZXBsYWNlbWVudDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihjb250ZW50Mywgbm9kZTIsIG9wdGlvbnMpIHsKICAgIHZhciBwcmVmaXggPSBvcHRpb25zLmJ1bGxldExpc3RNYXJrZXIgKyAiICAgIjsKICAgIHZhciBwYXJlbnQgPSBub2RlMi5wYXJlbnROb2RlOwogICAgaWYgKHBhcmVudC5ub2RlTmFtZSA9PT0gIk9MIikgewogICAgICB2YXIgc3RhcnQgPSBwYXJlbnQuZ2V0QXR0cmlidXRlKCJzdGFydCIpOwogICAgICB2YXIgaW5kZXgyID0gQXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChwYXJlbnQuY2hpbGRyZW4sIG5vZGUyKTsKICAgICAgcHJlZml4ID0gKHN0YXJ0ID8gTnVtYmVyKHN0YXJ0KSArIGluZGV4MiA6IGluZGV4MiArIDEpICsgIi4gICI7CiAgICB9CiAgICB2YXIgaXNQYXJhZ3JhcGggPSAvXG4kLy50ZXN0KGNvbnRlbnQzKTsKICAgIGNvbnRlbnQzID0gdHJpbU5ld2xpbmVzKGNvbnRlbnQzKSArIChpc1BhcmFncmFwaCA/ICJcbiIgOiAiIik7CiAgICBjb250ZW50MyA9IGNvbnRlbnQzLnJlcGxhY2UoL1xuL2dtLCAiXG4iICsgIiAiLnJlcGVhdChwcmVmaXgubGVuZ3RoKSk7CiAgICByZXR1cm4gcHJlZml4ICsgY29udGVudDMgKyAobm9kZTIubmV4dFNpYmxpbmcgPyAiXG4iIDogIiIpOwogIH0sICJyZXBsYWNlbWVudCIpCn07CnJ1bGVzLmluZGVudGVkQ29kZUJsb2NrID0gewogIGZpbHRlcjogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihub2RlMiwgb3B0aW9ucykgewogICAgcmV0dXJuIG9wdGlvbnMuY29kZUJsb2NrU3R5bGUgPT09ICJpbmRlbnRlZCIgJiYgbm9kZTIubm9kZU5hbWUgPT09ICJQUkUiICYmIG5vZGUyLmZpcnN0Q2hpbGQgJiYgbm9kZTIuZmlyc3RDaGlsZC5ub2RlTmFtZSA9PT0gIkNPREUiOwogIH0sICJmaWx0ZXIiKSwKICByZXBsYWNlbWVudDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihjb250ZW50Mywgbm9kZTIsIG9wdGlvbnMpIHsKICAgIHJldHVybiAiXG5cbiAgICAiICsgbm9kZTIuZmlyc3RDaGlsZC50ZXh0Q29udGVudC5yZXBsYWNlKC9cbi9nLCAiXG4gICAgIikgKyAiXG5cbiI7CiAgfSwgInJlcGxhY2VtZW50IikKfTsKcnVsZXMuZmVuY2VkQ29kZUJsb2NrID0gewogIGZpbHRlcjogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihub2RlMiwgb3B0aW9ucykgewogICAgcmV0dXJuIG9wdGlvbnMuY29kZUJsb2NrU3R5bGUgPT09ICJmZW5jZWQiICYmIG5vZGUyLm5vZGVOYW1lID09PSAiUFJFIiAmJiBub2RlMi5maXJzdENoaWxkICYmIG5vZGUyLmZpcnN0Q2hpbGQubm9kZU5hbWUgPT09ICJDT0RFIjsKICB9LCAiZmlsdGVyIiksCiAgcmVwbGFjZW1lbnQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oY29udGVudDMsIG5vZGUyLCBvcHRpb25zKSB7CiAgICB2YXIgY2xhc3NOYW1lID0gbm9kZTIuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImNsYXNzIikgfHwgIiI7CiAgICB2YXIgbGFuZ3VhZ2UgPSAoY2xhc3NOYW1lLm1hdGNoKC9sYW5ndWFnZS0oXFMrKS8pIHx8IFtudWxsLCAiIl0pWzFdOwogICAgdmFyIGNvZGU0ID0gbm9kZTIuZmlyc3RDaGlsZC50ZXh0Q29udGVudDsKICAgIHZhciBmZW5jZUNoYXIgPSBvcHRpb25zLmZlbmNlLmNoYXJBdCgwKTsKICAgIHZhciBmZW5jZVNpemUgPSAzOwogICAgdmFyIGZlbmNlSW5Db2RlUmVnZXggPSBuZXcgUmVnRXhwKCJeIiArIGZlbmNlQ2hhciArICJ7Myx9IiwgImdtIik7CiAgICB2YXIgbWF0Y2gyOwogICAgd2hpbGUgKG1hdGNoMiA9IGZlbmNlSW5Db2RlUmVnZXguZXhlYyhjb2RlNCkpIHsKICAgICAgaWYgKG1hdGNoMlswXS5sZW5ndGggPj0gZmVuY2VTaXplKSB7CiAgICAgICAgZmVuY2VTaXplID0gbWF0Y2gyWzBdLmxlbmd0aCArIDE7CiAgICAgIH0KICAgIH0KICAgIHZhciBmZW5jZTMgPSByZXBlYXQyKGZlbmNlQ2hhciwgZmVuY2VTaXplKTsKICAgIHJldHVybiAiXG5cbiIgKyBmZW5jZTMgKyBsYW5ndWFnZSArICJcbiIgKyBjb2RlNC5yZXBsYWNlKC9cbiQvLCAiIikgKyAiXG4iICsgZmVuY2UzICsgIlxuXG4iOwogIH0sICJyZXBsYWNlbWVudCIpCn07CnJ1bGVzLmhvcml6b250YWxSdWxlID0gewogIGZpbHRlcjogImhyIiwKICByZXBsYWNlbWVudDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihjb250ZW50Mywgbm9kZTIsIG9wdGlvbnMpIHsKICAgIHJldHVybiAiXG5cbiIgKyBvcHRpb25zLmhyICsgIlxuXG4iOwogIH0sICJyZXBsYWNlbWVudCIpCn07CnJ1bGVzLmlubGluZUxpbmsgPSB7CiAgZmlsdGVyOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKG5vZGUyLCBvcHRpb25zKSB7CiAgICByZXR1cm4gb3B0aW9ucy5saW5rU3R5bGUgPT09ICJpbmxpbmVkIiAmJiBub2RlMi5ub2RlTmFtZSA9PT0gIkEiICYmIG5vZGUyLmdldEF0dHJpYnV0ZSgiaHJlZiIpOwogIH0sICJmaWx0ZXIiKSwKICByZXBsYWNlbWVudDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihjb250ZW50Mywgbm9kZTIpIHsKICAgIHZhciBocmVmID0gbm9kZTIuZ2V0QXR0cmlidXRlKCJocmVmIik7CiAgICBpZiAoaHJlZikgaHJlZiA9IGhyZWYucmVwbGFjZSgvKFsoKV0pL2csICJcXCQxIik7CiAgICB2YXIgdGl0bGUgPSBjbGVhbkF0dHJpYnV0ZShub2RlMi5nZXRBdHRyaWJ1dGUoInRpdGxlIikpOwogICAgaWYgKHRpdGxlKSB0aXRsZSA9ICcgIicgKyB0aXRsZS5yZXBsYWNlKC8iL2csICdcXCInKSArICciJzsKICAgIHJldHVybiAiWyIgKyBjb250ZW50MyArICJdKCIgKyBocmVmICsgdGl0bGUgKyAiKSI7CiAgfSwgInJlcGxhY2VtZW50IikKfTsKcnVsZXMucmVmZXJlbmNlTGluayA9IHsKICBmaWx0ZXI6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24obm9kZTIsIG9wdGlvbnMpIHsKICAgIHJldHVybiBvcHRpb25zLmxpbmtTdHlsZSA9PT0gInJlZmVyZW5jZWQiICYmIG5vZGUyLm5vZGVOYW1lID09PSAiQSIgJiYgbm9kZTIuZ2V0QXR0cmlidXRlKCJocmVmIik7CiAgfSwgImZpbHRlciIpLAogIHJlcGxhY2VtZW50OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGNvbnRlbnQzLCBub2RlMiwgb3B0aW9ucykgewogICAgdmFyIGhyZWYgPSBub2RlMi5nZXRBdHRyaWJ1dGUoImhyZWYiKTsKICAgIHZhciB0aXRsZSA9IGNsZWFuQXR0cmlidXRlKG5vZGUyLmdldEF0dHJpYnV0ZSgidGl0bGUiKSk7CiAgICBpZiAodGl0bGUpIHRpdGxlID0gJyAiJyArIHRpdGxlICsgJyInOwogICAgdmFyIHJlcGxhY2VtZW50OwogICAgdmFyIHJlZmVyZW5jZTsKICAgIHN3aXRjaCAob3B0aW9ucy5saW5rUmVmZXJlbmNlU3R5bGUpIHsKICAgICAgY2FzZSAiY29sbGFwc2VkIjoKICAgICAgICByZXBsYWNlbWVudCA9ICJbIiArIGNvbnRlbnQzICsgIl1bXSI7CiAgICAgICAgcmVmZXJlbmNlID0gIlsiICsgY29udGVudDMgKyAiXTogIiArIGhyZWYgKyB0aXRsZTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAic2hvcnRjdXQiOgogICAgICAgIHJlcGxhY2VtZW50ID0gIlsiICsgY29udGVudDMgKyAiXSI7CiAgICAgICAgcmVmZXJlbmNlID0gIlsiICsgY29udGVudDMgKyAiXTogIiArIGhyZWYgKyB0aXRsZTsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICB2YXIgaWQgPSB0aGlzLnJlZmVyZW5jZXMubGVuZ3RoICsgMTsKICAgICAgICByZXBsYWNlbWVudCA9ICJbIiArIGNvbnRlbnQzICsgIl1bIiArIGlkICsgIl0iOwogICAgICAgIHJlZmVyZW5jZSA9ICJbIiArIGlkICsgIl06ICIgKyBocmVmICsgdGl0bGU7CiAgICB9CiAgICB0aGlzLnJlZmVyZW5jZXMucHVzaChyZWZlcmVuY2UpOwogICAgcmV0dXJuIHJlcGxhY2VtZW50OwogIH0sICJyZXBsYWNlbWVudCIpLAogIHJlZmVyZW5jZXM6IFtdLAogIGFwcGVuZDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihvcHRpb25zKSB7CiAgICB2YXIgcmVmZXJlbmNlcyA9ICIiOwogICAgaWYgKHRoaXMucmVmZXJlbmNlcy5sZW5ndGgpIHsKICAgICAgcmVmZXJlbmNlcyA9ICJcblxuIiArIHRoaXMucmVmZXJlbmNlcy5qb2luKCJcbiIpICsgIlxuXG4iOwogICAgICB0aGlzLnJlZmVyZW5jZXMgPSBbXTsKICAgIH0KICAgIHJldHVybiByZWZlcmVuY2VzOwogIH0sICJhcHBlbmQiKQp9OwpydWxlcy5lbXBoYXNpcyA9IHsKICBmaWx0ZXI6IFsiZW0iLCAiaSJdLAogIHJlcGxhY2VtZW50OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGNvbnRlbnQzLCBub2RlMiwgb3B0aW9ucykgewogICAgaWYgKCFjb250ZW50My50cmltKCkpIHJldHVybiAiIjsKICAgIHJldHVybiBvcHRpb25zLmVtRGVsaW1pdGVyICsgY29udGVudDMgKyBvcHRpb25zLmVtRGVsaW1pdGVyOwogIH0sICJyZXBsYWNlbWVudCIpCn07CnJ1bGVzLnN0cm9uZyA9IHsKICBmaWx0ZXI6IFsic3Ryb25nIiwgImIiXSwKICByZXBsYWNlbWVudDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihjb250ZW50Mywgbm9kZTIsIG9wdGlvbnMpIHsKICAgIGlmICghY29udGVudDMudHJpbSgpKSByZXR1cm4gIiI7CiAgICByZXR1cm4gb3B0aW9ucy5zdHJvbmdEZWxpbWl0ZXIgKyBjb250ZW50MyArIG9wdGlvbnMuc3Ryb25nRGVsaW1pdGVyOwogIH0sICJyZXBsYWNlbWVudCIpCn07CnJ1bGVzLmNvZGUgPSB7CiAgZmlsdGVyOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKG5vZGUyKSB7CiAgICB2YXIgaGFzU2libGluZ3MgPSBub2RlMi5wcmV2aW91c1NpYmxpbmcgfHwgbm9kZTIubmV4dFNpYmxpbmc7CiAgICB2YXIgaXNDb2RlQmxvY2sgPSBub2RlMi5wYXJlbnROb2RlLm5vZGVOYW1lID09PSAiUFJFIiAmJiAhaGFzU2libGluZ3M7CiAgICByZXR1cm4gbm9kZTIubm9kZU5hbWUgPT09ICJDT0RFIiAmJiAhaXNDb2RlQmxvY2s7CiAgfSwgImZpbHRlciIpLAogIHJlcGxhY2VtZW50OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGNvbnRlbnQzKSB7CiAgICBpZiAoIWNvbnRlbnQzKSByZXR1cm4gIiI7CiAgICBjb250ZW50MyA9IGNvbnRlbnQzLnJlcGxhY2UoL1xyP1xufFxyL2csICIgIik7CiAgICB2YXIgZXh0cmFTcGFjZSA9IC9eYHxeIC4qP1teIF0uKiAkfGAkLy50ZXN0KGNvbnRlbnQzKSA/ICIgIiA6ICIiOwogICAgdmFyIGRlbGltaXRlciA9ICJgIjsKICAgIHZhciBtYXRjaGVzID0gY29udGVudDMubWF0Y2goL2ArL2dtKSB8fCBbXTsKICAgIHdoaWxlIChtYXRjaGVzLmluZGV4T2YoZGVsaW1pdGVyKSAhPT0gLTEpIGRlbGltaXRlciA9IGRlbGltaXRlciArICJgIjsKICAgIHJldHVybiBkZWxpbWl0ZXIgKyBleHRyYVNwYWNlICsgY29udGVudDMgKyBleHRyYVNwYWNlICsgZGVsaW1pdGVyOwogIH0sICJyZXBsYWNlbWVudCIpCn07CnJ1bGVzLmltYWdlID0gewogIGZpbHRlcjogImltZyIsCiAgcmVwbGFjZW1lbnQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oY29udGVudDMsIG5vZGUyKSB7CiAgICB2YXIgYWx0ID0gY2xlYW5BdHRyaWJ1dGUobm9kZTIuZ2V0QXR0cmlidXRlKCJhbHQiKSk7CiAgICB2YXIgc3JjID0gbm9kZTIuZ2V0QXR0cmlidXRlKCJzcmMiKSB8fCAiIjsKICAgIHZhciB0aXRsZSA9IGNsZWFuQXR0cmlidXRlKG5vZGUyLmdldEF0dHJpYnV0ZSgidGl0bGUiKSk7CiAgICB2YXIgdGl0bGVQYXJ0ID0gdGl0bGUgPyAnICInICsgdGl0bGUgKyAnIicgOiAiIjsKICAgIHJldHVybiBzcmMgPyAiIVsiICsgYWx0ICsgIl0oIiArIHNyYyArIHRpdGxlUGFydCArICIpIiA6ICIiOwogIH0sICJyZXBsYWNlbWVudCIpCn07CmZ1bmN0aW9uIGNsZWFuQXR0cmlidXRlKGF0dHJpYnV0ZSkgewogIHJldHVybiBhdHRyaWJ1dGUgPyBhdHRyaWJ1dGUucmVwbGFjZSgvKFxuK1xzKikrL2csICJcbiIpIDogIiI7Cn0KX19uYW1lKGNsZWFuQXR0cmlidXRlLCAiY2xlYW5BdHRyaWJ1dGUiKTsKZnVuY3Rpb24gUnVsZXMob3B0aW9ucykgewogIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CiAgdGhpcy5fa2VlcCA9IFtdOwogIHRoaXMuX3JlbW92ZSA9IFtdOwogIHRoaXMuYmxhbmtSdWxlID0gewogICAgcmVwbGFjZW1lbnQ6IG9wdGlvbnMuYmxhbmtSZXBsYWNlbWVudAogIH07CiAgdGhpcy5rZWVwUmVwbGFjZW1lbnQgPSBvcHRpb25zLmtlZXBSZXBsYWNlbWVudDsKICB0aGlzLmRlZmF1bHRSdWxlID0gewogICAgcmVwbGFjZW1lbnQ6IG9wdGlvbnMuZGVmYXVsdFJlcGxhY2VtZW50CiAgfTsKICB0aGlzLmFycmF5ID0gW107CiAgZm9yICh2YXIga2V5MiBpbiBvcHRpb25zLnJ1bGVzKSB0aGlzLmFycmF5LnB1c2gob3B0aW9ucy5ydWxlc1trZXkyXSk7Cn0KX19uYW1lKFJ1bGVzLCAiUnVsZXMiKTsKUnVsZXMucHJvdG90eXBlID0gewogIGFkZDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihrZXkyLCBydWxlKSB7CiAgICB0aGlzLmFycmF5LnVuc2hpZnQocnVsZSk7CiAgfSwgImFkZCIpLAogIGtlZXA6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oZmlsdGVyMikgewogICAgdGhpcy5fa2VlcC51bnNoaWZ0KHsKICAgICAgZmlsdGVyOiBmaWx0ZXIyLAogICAgICByZXBsYWNlbWVudDogdGhpcy5rZWVwUmVwbGFjZW1lbnQKICAgIH0pOwogIH0sICJrZWVwIiksCiAgcmVtb3ZlOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGZpbHRlcjIpIHsKICAgIHRoaXMuX3JlbW92ZS51bnNoaWZ0KHsKICAgICAgZmlsdGVyOiBmaWx0ZXIyLAogICAgICByZXBsYWNlbWVudDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gIiI7CiAgICAgIH0sICJyZXBsYWNlbWVudCIpCiAgICB9KTsKICB9LCAicmVtb3ZlIiksCiAgZm9yTm9kZTogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihub2RlMikgewogICAgaWYgKG5vZGUyLmlzQmxhbmspIHJldHVybiB0aGlzLmJsYW5rUnVsZTsKICAgIHZhciBydWxlOwogICAgaWYgKHJ1bGUgPSBmaW5kUnVsZSh0aGlzLmFycmF5LCBub2RlMiwgdGhpcy5vcHRpb25zKSkgcmV0dXJuIHJ1bGU7CiAgICBpZiAocnVsZSA9IGZpbmRSdWxlKHRoaXMuX2tlZXAsIG5vZGUyLCB0aGlzLm9wdGlvbnMpKSByZXR1cm4gcnVsZTsKICAgIGlmIChydWxlID0gZmluZFJ1bGUodGhpcy5fcmVtb3ZlLCBub2RlMiwgdGhpcy5vcHRpb25zKSkgcmV0dXJuIHJ1bGU7CiAgICByZXR1cm4gdGhpcy5kZWZhdWx0UnVsZTsKICB9LCAiZm9yTm9kZSIpLAogIGZvckVhY2g6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oZm4pIHsKICAgIGZvciAodmFyIGkxMCA9IDA7IGkxMCA8IHRoaXMuYXJyYXkubGVuZ3RoOyBpMTArKykgZm4odGhpcy5hcnJheVtpMTBdLCBpMTApOwogIH0sICJmb3JFYWNoIikKfTsKZnVuY3Rpb24gZmluZFJ1bGUocnVsZXMzLCBub2RlMiwgb3B0aW9ucykgewogIGZvciAodmFyIGkxMCA9IDA7IGkxMCA8IHJ1bGVzMy5sZW5ndGg7IGkxMCsrKSB7CiAgICB2YXIgcnVsZSA9IHJ1bGVzM1tpMTBdOwogICAgaWYgKGZpbHRlclZhbHVlKHJ1bGUsIG5vZGUyLCBvcHRpb25zKSkgcmV0dXJuIHJ1bGU7CiAgfQogIHJldHVybiB2b2lkIDA7Cn0KX19uYW1lKGZpbmRSdWxlLCAiZmluZFJ1bGUiKTsKZnVuY3Rpb24gZmlsdGVyVmFsdWUocnVsZSwgbm9kZTIsIG9wdGlvbnMpIHsKICB2YXIgZmlsdGVyMiA9IHJ1bGUuZmlsdGVyOwogIGlmICh0eXBlb2YgZmlsdGVyMiA9PT0gInN0cmluZyIpIHsKICAgIGlmIChmaWx0ZXIyID09PSBub2RlMi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSByZXR1cm4gdHJ1ZTsKICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyMikpIHsKICAgIGlmIChmaWx0ZXIyLmluZGV4T2Yobm9kZTIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkgPiAtMSkgcmV0dXJuIHRydWU7CiAgfSBlbHNlIGlmICh0eXBlb2YgZmlsdGVyMiA9PT0gImZ1bmN0aW9uIikgewogICAgaWYgKGZpbHRlcjIuY2FsbChydWxlLCBub2RlMiwgb3B0aW9ucykpIHJldHVybiB0cnVlOwogIH0gZWxzZSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJgZmlsdGVyYCBuZWVkcyB0byBiZSBhIHN0cmluZywgYXJyYXksIG9yIGZ1bmN0aW9uIik7CiAgfQp9Cl9fbmFtZShmaWx0ZXJWYWx1ZSwgImZpbHRlclZhbHVlIik7CmZ1bmN0aW9uIGNvbGxhcHNlV2hpdGVzcGFjZShvcHRpb25zKSB7CiAgdmFyIGVsZW1lbnQ0ID0gb3B0aW9ucy5lbGVtZW50OwogIHZhciBpc0Jsb2NrMiA9IG9wdGlvbnMuaXNCbG9jazsKICB2YXIgaXNWb2lkMiA9IG9wdGlvbnMuaXNWb2lkOwogIHZhciBpc1ByZSA9IG9wdGlvbnMuaXNQcmUgfHwgZnVuY3Rpb24obm9kZTMpIHsKICAgIHJldHVybiBub2RlMy5ub2RlTmFtZSA9PT0gIlBSRSI7CiAgfTsKICBpZiAoIWVsZW1lbnQ0LmZpcnN0Q2hpbGQgfHwgaXNQcmUoZWxlbWVudDQpKSByZXR1cm47CiAgdmFyIHByZXZUZXh0ID0gbnVsbDsKICB2YXIga2VlcExlYWRpbmdXcyA9IGZhbHNlOwogIHZhciBwcmV2ID0gbnVsbDsKICB2YXIgbm9kZTIgPSBuZXh0KHByZXYsIGVsZW1lbnQ0LCBpc1ByZSk7CiAgd2hpbGUgKG5vZGUyICE9PSBlbGVtZW50NCkgewogICAgaWYgKG5vZGUyLm5vZGVUeXBlID09PSAzIHx8IG5vZGUyLm5vZGVUeXBlID09PSA0KSB7CiAgICAgIHZhciB0ZXh0OCA9IG5vZGUyLmRhdGEucmVwbGFjZSgvWyBcclxuXHRdKy9nLCAiICIpOwogICAgICBpZiAoKCFwcmV2VGV4dCB8fCAvICQvLnRlc3QocHJldlRleHQuZGF0YSkpICYmICFrZWVwTGVhZGluZ1dzICYmIHRleHQ4WzBdID09PSAiICIpIHsKICAgICAgICB0ZXh0OCA9IHRleHQ4LnN1YnN0cigxKTsKICAgICAgfQogICAgICBpZiAoIXRleHQ4KSB7CiAgICAgICAgbm9kZTIgPSByZW1vdmUobm9kZTIpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIG5vZGUyLmRhdGEgPSB0ZXh0ODsKICAgICAgcHJldlRleHQgPSBub2RlMjsKICAgIH0gZWxzZSBpZiAobm9kZTIubm9kZVR5cGUgPT09IDEpIHsKICAgICAgaWYgKGlzQmxvY2syKG5vZGUyKSB8fCBub2RlMi5ub2RlTmFtZSA9PT0gIkJSIikgewogICAgICAgIGlmIChwcmV2VGV4dCkgewogICAgICAgICAgcHJldlRleHQuZGF0YSA9IHByZXZUZXh0LmRhdGEucmVwbGFjZSgvICQvLCAiIik7CiAgICAgICAgfQogICAgICAgIHByZXZUZXh0ID0gbnVsbDsKICAgICAgICBrZWVwTGVhZGluZ1dzID0gZmFsc2U7CiAgICAgIH0gZWxzZSBpZiAoaXNWb2lkMihub2RlMikgfHwgaXNQcmUobm9kZTIpKSB7CiAgICAgICAgcHJldlRleHQgPSBudWxsOwogICAgICAgIGtlZXBMZWFkaW5nV3MgPSB0cnVlOwogICAgICB9IGVsc2UgaWYgKHByZXZUZXh0KSB7CiAgICAgICAga2VlcExlYWRpbmdXcyA9IGZhbHNlOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBub2RlMiA9IHJlbW92ZShub2RlMik7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgdmFyIG5leHROb2RlID0gbmV4dChwcmV2LCBub2RlMiwgaXNQcmUpOwogICAgcHJldiA9IG5vZGUyOwogICAgbm9kZTIgPSBuZXh0Tm9kZTsKICB9CiAgaWYgKHByZXZUZXh0KSB7CiAgICBwcmV2VGV4dC5kYXRhID0gcHJldlRleHQuZGF0YS5yZXBsYWNlKC8gJC8sICIiKTsKICAgIGlmICghcHJldlRleHQuZGF0YSkgewogICAgICByZW1vdmUocHJldlRleHQpOwogICAgfQogIH0KfQpfX25hbWUoY29sbGFwc2VXaGl0ZXNwYWNlLCAiY29sbGFwc2VXaGl0ZXNwYWNlIik7CmZ1bmN0aW9uIHJlbW92ZShub2RlMikgewogIHZhciBuZXh0MiA9IG5vZGUyLm5leHRTaWJsaW5nIHx8IG5vZGUyLnBhcmVudE5vZGU7CiAgbm9kZTIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlMik7CiAgcmV0dXJuIG5leHQyOwp9Cl9fbmFtZShyZW1vdmUsICJyZW1vdmUiKTsKZnVuY3Rpb24gbmV4dChwcmV2LCBjdXJyZW50LCBpc1ByZSkgewogIGlmIChwcmV2ICYmIHByZXYucGFyZW50Tm9kZSA9PT0gY3VycmVudCB8fCBpc1ByZShjdXJyZW50KSkgewogICAgcmV0dXJuIGN1cnJlbnQubmV4dFNpYmxpbmcgfHwgY3VycmVudC5wYXJlbnROb2RlOwogIH0KICByZXR1cm4gY3VycmVudC5maXJzdENoaWxkIHx8IGN1cnJlbnQubmV4dFNpYmxpbmcgfHwgY3VycmVudC5wYXJlbnROb2RlOwp9Cl9fbmFtZShuZXh0LCAibmV4dCIpOwp2YXIgcm9vdDUgPSB0eXBlb2Ygd2luZG93ICE9PSAidW5kZWZpbmVkIiA/IHdpbmRvdyA6IHt9OwpmdW5jdGlvbiBjYW5QYXJzZUhUTUxOYXRpdmVseSgpIHsKICB2YXIgUGFyc2VyMiA9IHJvb3Q1LkRPTVBhcnNlcjsKICB2YXIgY2FuUGFyc2UgPSBmYWxzZTsKICB0cnkgewogICAgaWYgKG5ldyBQYXJzZXIyKCkucGFyc2VGcm9tU3RyaW5nKCIiLCAidGV4dC9odG1sIikpIHsKICAgICAgY2FuUGFyc2UgPSB0cnVlOwogICAgfQogIH0gY2F0Y2ggKGUxMCkgewogIH0KICByZXR1cm4gY2FuUGFyc2U7Cn0KX19uYW1lKGNhblBhcnNlSFRNTE5hdGl2ZWx5LCAiY2FuUGFyc2VIVE1MTmF0aXZlbHkiKTsKZnVuY3Rpb24gY3JlYXRlSFRNTFBhcnNlcigpIHsKICB2YXIgUGFyc2VyMiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oKSB7CiAgfSwgIlBhcnNlciIpOwogIHsKICAgIGlmIChzaG91bGRVc2VBY3RpdmVYKCkpIHsKICAgICAgUGFyc2VyMi5wcm90b3R5cGUucGFyc2VGcm9tU3RyaW5nID0gZnVuY3Rpb24oc3RyaW5nMykgewogICAgICAgIHZhciBkb2MgPSBuZXcgd2luZG93LkFjdGl2ZVhPYmplY3QoImh0bWxmaWxlIik7CiAgICAgICAgZG9jLmRlc2lnbk1vZGUgPSAib24iOwogICAgICAgIGRvYy5vcGVuKCk7CiAgICAgICAgZG9jLndyaXRlKHN0cmluZzMpOwogICAgICAgIGRvYy5jbG9zZSgpOwogICAgICAgIHJldHVybiBkb2M7CiAgICAgIH07CiAgICB9IGVsc2UgewogICAgICBQYXJzZXIyLnByb3RvdHlwZS5wYXJzZUZyb21TdHJpbmcgPSBmdW5jdGlvbihzdHJpbmczKSB7CiAgICAgICAgdmFyIGRvYyA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIik7CiAgICAgICAgZG9jLm9wZW4oKTsKICAgICAgICBkb2Mud3JpdGUoc3RyaW5nMyk7CiAgICAgICAgZG9jLmNsb3NlKCk7CiAgICAgICAgcmV0dXJuIGRvYzsKICAgICAgfTsKICAgIH0KICB9CiAgcmV0dXJuIFBhcnNlcjI7Cn0KX19uYW1lKGNyZWF0ZUhUTUxQYXJzZXIsICJjcmVhdGVIVE1MUGFyc2VyIik7CmZ1bmN0aW9uIHNob3VsZFVzZUFjdGl2ZVgoKSB7CiAgdmFyIHVzZUFjdGl2ZVggPSBmYWxzZTsKICB0cnkgewogICAgZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCIiKS5vcGVuKCk7CiAgfSBjYXRjaCAoZTEwKSB7CiAgICBpZiAocm9vdDUuQWN0aXZlWE9iamVjdCkgdXNlQWN0aXZlWCA9IHRydWU7CiAgfQogIHJldHVybiB1c2VBY3RpdmVYOwp9Cl9fbmFtZShzaG91bGRVc2VBY3RpdmVYLCAic2hvdWxkVXNlQWN0aXZlWCIpOwp2YXIgSFRNTFBhcnNlciA9IGNhblBhcnNlSFRNTE5hdGl2ZWx5KCkgPyByb290NS5ET01QYXJzZXIgOiBjcmVhdGVIVE1MUGFyc2VyKCk7CmZ1bmN0aW9uIFJvb3ROb2RlKGlucHV0LCBvcHRpb25zKSB7CiAgdmFyIHJvb3Q2OwogIGlmICh0eXBlb2YgaW5wdXQgPT09ICJzdHJpbmciKSB7CiAgICB2YXIgZG9jID0gaHRtbFBhcnNlcigpLnBhcnNlRnJvbVN0cmluZygKICAgICAgLy8gRE9NIHBhcnNlcnMgYXJyYW5nZSBlbGVtZW50cyBpbiB0aGUgPGhlYWQ+IGFuZCA8Ym9keT4uCiAgICAgIC8vIFdyYXBwaW5nIGluIGEgY3VzdG9tIGVsZW1lbnQgZW5zdXJlcyBlbGVtZW50cyBhcmUgcmVsaWFibHkgYXJyYW5nZWQgaW4KICAgICAgLy8gYSBzaW5nbGUgZWxlbWVudC4KICAgICAgJzx4LXR1cm5kb3duIGlkPSJ0dXJuZG93bi1yb290Ij4nICsgaW5wdXQgKyAiPC94LXR1cm5kb3duPiIsCiAgICAgICJ0ZXh0L2h0bWwiCiAgICApOwogICAgcm9vdDYgPSBkb2MuZ2V0RWxlbWVudEJ5SWQoInR1cm5kb3duLXJvb3QiKTsKICB9IGVsc2UgewogICAgcm9vdDYgPSBpbnB1dC5jbG9uZU5vZGUodHJ1ZSk7CiAgfQogIGNvbGxhcHNlV2hpdGVzcGFjZSh7CiAgICBlbGVtZW50OiByb290NiwKICAgIGlzQmxvY2ssCiAgICBpc1ZvaWQsCiAgICBpc1ByZTogb3B0aW9ucy5wcmVmb3JtYXR0ZWRDb2RlID8gaXNQcmVPckNvZGUgOiBudWxsCiAgfSk7CiAgcmV0dXJuIHJvb3Q2Owp9Cl9fbmFtZShSb290Tm9kZSwgIlJvb3ROb2RlIik7CnZhciBfaHRtbFBhcnNlcjsKZnVuY3Rpb24gaHRtbFBhcnNlcigpIHsKICBfaHRtbFBhcnNlciA9IF9odG1sUGFyc2VyIHx8IG5ldyBIVE1MUGFyc2VyKCk7CiAgcmV0dXJuIF9odG1sUGFyc2VyOwp9Cl9fbmFtZShodG1sUGFyc2VyLCAiaHRtbFBhcnNlciIpOwpmdW5jdGlvbiBpc1ByZU9yQ29kZShub2RlMikgewogIHJldHVybiBub2RlMi5ub2RlTmFtZSA9PT0gIlBSRSIgfHwgbm9kZTIubm9kZU5hbWUgPT09ICJDT0RFIjsKfQpfX25hbWUoaXNQcmVPckNvZGUsICJpc1ByZU9yQ29kZSIpOwpmdW5jdGlvbiBOb2RlKG5vZGUyLCBvcHRpb25zKSB7CiAgbm9kZTIuaXNCbG9jayA9IGlzQmxvY2sobm9kZTIpOwogIG5vZGUyLmlzQ29kZSA9IG5vZGUyLm5vZGVOYW1lID09PSAiQ09ERSIgfHwgbm9kZTIucGFyZW50Tm9kZS5pc0NvZGU7CiAgbm9kZTIuaXNCbGFuayA9IGlzQmxhbmsobm9kZTIpOwogIG5vZGUyLmZsYW5raW5nV2hpdGVzcGFjZSA9IGZsYW5raW5nV2hpdGVzcGFjZShub2RlMiwgb3B0aW9ucyk7CiAgcmV0dXJuIG5vZGUyOwp9Cl9fbmFtZShOb2RlLCAiTm9kZSIpOwpmdW5jdGlvbiBpc0JsYW5rKG5vZGUyKSB7CiAgcmV0dXJuICFpc1ZvaWQobm9kZTIpICYmICFpc01lYW5pbmdmdWxXaGVuQmxhbmsobm9kZTIpICYmIC9eXHMqJC9pLnRlc3Qobm9kZTIudGV4dENvbnRlbnQpICYmICFoYXNWb2lkKG5vZGUyKSAmJiAhaGFzTWVhbmluZ2Z1bFdoZW5CbGFuayhub2RlMik7Cn0KX19uYW1lKGlzQmxhbmssICJpc0JsYW5rIik7CmZ1bmN0aW9uIGZsYW5raW5nV2hpdGVzcGFjZShub2RlMiwgb3B0aW9ucykgewogIGlmIChub2RlMi5pc0Jsb2NrIHx8IG9wdGlvbnMucHJlZm9ybWF0dGVkQ29kZSAmJiBub2RlMi5pc0NvZGUpIHsKICAgIHJldHVybiB7IGxlYWRpbmc6ICIiLCB0cmFpbGluZzogIiIgfTsKICB9CiAgdmFyIGVkZ2VzID0gZWRnZVdoaXRlc3BhY2Uobm9kZTIudGV4dENvbnRlbnQpOwogIGlmIChlZGdlcy5sZWFkaW5nQXNjaWkgJiYgaXNGbGFua2VkQnlXaGl0ZXNwYWNlKCJsZWZ0Iiwgbm9kZTIsIG9wdGlvbnMpKSB7CiAgICBlZGdlcy5sZWFkaW5nID0gZWRnZXMubGVhZGluZ05vbkFzY2lpOwogIH0KICBpZiAoZWRnZXMudHJhaWxpbmdBc2NpaSAmJiBpc0ZsYW5rZWRCeVdoaXRlc3BhY2UoInJpZ2h0Iiwgbm9kZTIsIG9wdGlvbnMpKSB7CiAgICBlZGdlcy50cmFpbGluZyA9IGVkZ2VzLnRyYWlsaW5nTm9uQXNjaWk7CiAgfQogIHJldHVybiB7IGxlYWRpbmc6IGVkZ2VzLmxlYWRpbmcsIHRyYWlsaW5nOiBlZGdlcy50cmFpbGluZyB9Owp9Cl9fbmFtZShmbGFua2luZ1doaXRlc3BhY2UsICJmbGFua2luZ1doaXRlc3BhY2UiKTsKZnVuY3Rpb24gZWRnZVdoaXRlc3BhY2Uoc3RyaW5nMykgewogIHZhciBtNSA9IHN0cmluZzMubWF0Y2goL14oKFsgXHRcclxuXSopKFxzKikpKD86KD89XFMpW1xzXFNdKlxTKT8oKFxzKj8pKFsgXHRcclxuXSopKSQvKTsKICByZXR1cm4gewogICAgbGVhZGluZzogbTVbMV0sCiAgICAvLyB3aG9sZSBzdHJpbmcgZm9yIHdoaXRlc3BhY2Utb25seSBzdHJpbmdzCiAgICBsZWFkaW5nQXNjaWk6IG01WzJdLAogICAgbGVhZGluZ05vbkFzY2lpOiBtNVszXSwKICAgIHRyYWlsaW5nOiBtNVs0XSwKICAgIC8vIGVtcHR5IGZvciB3aGl0ZXNwYWNlLW9ubHkgc3RyaW5ncwogICAgdHJhaWxpbmdOb25Bc2NpaTogbTVbNV0sCiAgICB0cmFpbGluZ0FzY2lpOiBtNVs2XQogIH07Cn0KX19uYW1lKGVkZ2VXaGl0ZXNwYWNlLCAiZWRnZVdoaXRlc3BhY2UiKTsKZnVuY3Rpb24gaXNGbGFua2VkQnlXaGl0ZXNwYWNlKHNpZGUsIG5vZGUyLCBvcHRpb25zKSB7CiAgdmFyIHNpYmxpbmc7CiAgdmFyIHJlZ0V4cDsKICB2YXIgaXNGbGFua2VkOwogIGlmIChzaWRlID09PSAibGVmdCIpIHsKICAgIHNpYmxpbmcgPSBub2RlMi5wcmV2aW91c1NpYmxpbmc7CiAgICByZWdFeHAgPSAvICQvOwogIH0gZWxzZSB7CiAgICBzaWJsaW5nID0gbm9kZTIubmV4dFNpYmxpbmc7CiAgICByZWdFeHAgPSAvXiAvOwogIH0KICBpZiAoc2libGluZykgewogICAgaWYgKHNpYmxpbmcubm9kZVR5cGUgPT09IDMpIHsKICAgICAgaXNGbGFua2VkID0gcmVnRXhwLnRlc3Qoc2libGluZy5ub2RlVmFsdWUpOwogICAgfSBlbHNlIGlmIChvcHRpb25zLnByZWZvcm1hdHRlZENvZGUgJiYgc2libGluZy5ub2RlTmFtZSA9PT0gIkNPREUiKSB7CiAgICAgIGlzRmxhbmtlZCA9IGZhbHNlOwogICAgfSBlbHNlIGlmIChzaWJsaW5nLm5vZGVUeXBlID09PSAxICYmICFpc0Jsb2NrKHNpYmxpbmcpKSB7CiAgICAgIGlzRmxhbmtlZCA9IHJlZ0V4cC50ZXN0KHNpYmxpbmcudGV4dENvbnRlbnQpOwogICAgfQogIH0KICByZXR1cm4gaXNGbGFua2VkOwp9Cl9fbmFtZShpc0ZsYW5rZWRCeVdoaXRlc3BhY2UsICJpc0ZsYW5rZWRCeVdoaXRlc3BhY2UiKTsKdmFyIHJlZHVjZTIgPSBBcnJheS5wcm90b3R5cGUucmVkdWNlOwp2YXIgZXNjYXBlcyA9IFsKICBbL1xcL2csICJcXFxcIl0sCiAgWy9cKi9nLCAiXFwqIl0sCiAgWy9eLS9nLCAiXFwtIl0sCiAgWy9eXCsgL2csICJcXCsgIl0sCiAgWy9eKD0rKS9nLCAiXFwkMSJdLAogIFsvXigjezEsNn0pIC9nLCAiXFwkMSAiXSwKICBbL2AvZywgIlxcYCJdLAogIFsvXn5+fi9nLCAiXFx+fn4iXSwKICBbL1xbL2csICJcXFsiXSwKICBbL1xdL2csICJcXF0iXSwKICBbL14+L2csICJcXD4iXSwKICBbL18vZywgIlxcXyJdLAogIFsvXihcZCspXC4gL2csICIkMVxcLiAiXQpdOwpmdW5jdGlvbiBUdXJuZG93blNlcnZpY2Uob3B0aW9ucykgewogIGlmICghKHRoaXMgaW5zdGFuY2VvZiBUdXJuZG93blNlcnZpY2UpKSByZXR1cm4gbmV3IFR1cm5kb3duU2VydmljZShvcHRpb25zKTsKICB2YXIgZGVmYXVsdHMgPSB7CiAgICBydWxlcywKICAgIGhlYWRpbmdTdHlsZTogInNldGV4dCIsCiAgICBocjogIiogKiAqIiwKICAgIGJ1bGxldExpc3RNYXJrZXI6ICIqIiwKICAgIGNvZGVCbG9ja1N0eWxlOiAiaW5kZW50ZWQiLAogICAgZmVuY2U6ICJgYGAiLAogICAgZW1EZWxpbWl0ZXI6ICJfIiwKICAgIHN0cm9uZ0RlbGltaXRlcjogIioqIiwKICAgIGxpbmtTdHlsZTogImlubGluZWQiLAogICAgbGlua1JlZmVyZW5jZVN0eWxlOiAiZnVsbCIsCiAgICBicjogIiAgIiwKICAgIHByZWZvcm1hdHRlZENvZGU6IGZhbHNlLAogICAgYmxhbmtSZXBsYWNlbWVudDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihjb250ZW50Mywgbm9kZTIpIHsKICAgICAgcmV0dXJuIG5vZGUyLmlzQmxvY2sgPyAiXG5cbiIgOiAiIjsKICAgIH0sICJibGFua1JlcGxhY2VtZW50IiksCiAgICBrZWVwUmVwbGFjZW1lbnQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oY29udGVudDMsIG5vZGUyKSB7CiAgICAgIHJldHVybiBub2RlMi5pc0Jsb2NrID8gIlxuXG4iICsgbm9kZTIub3V0ZXJIVE1MICsgIlxuXG4iIDogbm9kZTIub3V0ZXJIVE1MOwogICAgfSwgImtlZXBSZXBsYWNlbWVudCIpLAogICAgZGVmYXVsdFJlcGxhY2VtZW50OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGNvbnRlbnQzLCBub2RlMikgewogICAgICByZXR1cm4gbm9kZTIuaXNCbG9jayA/ICJcblxuIiArIGNvbnRlbnQzICsgIlxuXG4iIDogY29udGVudDM7CiAgICB9LCAiZGVmYXVsdFJlcGxhY2VtZW50IikKICB9OwogIHRoaXMub3B0aW9ucyA9IGV4dGVuZDIoe30sIGRlZmF1bHRzLCBvcHRpb25zKTsKICB0aGlzLnJ1bGVzID0gbmV3IFJ1bGVzKHRoaXMub3B0aW9ucyk7Cn0KX19uYW1lKFR1cm5kb3duU2VydmljZSwgIlR1cm5kb3duU2VydmljZSIpOwpUdXJuZG93blNlcnZpY2UucHJvdG90eXBlID0gewogIC8qKgogICAqIFRoZSBlbnRyeSBwb2ludCBmb3IgY29udmVydGluZyBhIHN0cmluZyBvciBET00gbm9kZSB0byBNYXJrZG93bgogICAqIEBwdWJsaWMKICAgKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudH0gaW5wdXQgVGhlIHN0cmluZyBvciBET00gbm9kZSB0byBjb252ZXJ0CiAgICogQHJldHVybnMgQSBNYXJrZG93biByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5wdXQKICAgKiBAdHlwZSBTdHJpbmcKICAgKi8KICB0dXJuZG93bjogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihpbnB1dCkgewogICAgaWYgKCFjYW5Db252ZXJ0KGlucHV0KSkgewogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKAogICAgICAgIGlucHV0ICsgIiBpcyBub3QgYSBzdHJpbmcsIG9yIGFuIGVsZW1lbnQvZG9jdW1lbnQvZnJhZ21lbnQgbm9kZS4iCiAgICAgICk7CiAgICB9CiAgICBpZiAoaW5wdXQgPT09ICIiKSByZXR1cm4gIiI7CiAgICB2YXIgb3V0cHV0ID0gcHJvY2VzczMuY2FsbCh0aGlzLCBuZXcgUm9vdE5vZGUoaW5wdXQsIHRoaXMub3B0aW9ucykpOwogICAgcmV0dXJuIHBvc3RQcm9jZXNzLmNhbGwodGhpcywgb3V0cHV0KTsKICB9LCAidHVybmRvd24iKSwKICAvKioKICAgKiBBZGQgb25lIG9yIG1vcmUgcGx1Z2lucwogICAqIEBwdWJsaWMKICAgKiBAcGFyYW0ge0Z1bmN0aW9ufEFycmF5fSBwbHVnaW4gVGhlIHBsdWdpbiBvciBhcnJheSBvZiBwbHVnaW5zIHRvIGFkZAogICAqIEByZXR1cm5zIFRoZSBUdXJuZG93biBpbnN0YW5jZSBmb3IgY2hhaW5pbmcKICAgKiBAdHlwZSBPYmplY3QKICAgKi8KICB1c2U6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24ocGx1Z2luKSB7CiAgICBpZiAoQXJyYXkuaXNBcnJheShwbHVnaW4pKSB7CiAgICAgIGZvciAodmFyIGkxMCA9IDA7IGkxMCA8IHBsdWdpbi5sZW5ndGg7IGkxMCsrKSB0aGlzLnVzZShwbHVnaW5baTEwXSk7CiAgICB9IGVsc2UgaWYgKHR5cGVvZiBwbHVnaW4gPT09ICJmdW5jdGlvbiIpIHsKICAgICAgcGx1Z2luKHRoaXMpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigicGx1Z2luIG11c3QgYmUgYSBGdW5jdGlvbiBvciBhbiBBcnJheSBvZiBGdW5jdGlvbnMiKTsKICAgIH0KICAgIHJldHVybiB0aGlzOwogIH0sICJ1c2UiKSwKICAvKioKICAgKiBBZGRzIGEgcnVsZQogICAqIEBwdWJsaWMKICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IFRoZSB1bmlxdWUga2V5IG9mIHRoZSBydWxlCiAgICogQHBhcmFtIHtPYmplY3R9IHJ1bGUgVGhlIHJ1bGUKICAgKiBAcmV0dXJucyBUaGUgVHVybmRvd24gaW5zdGFuY2UgZm9yIGNoYWluaW5nCiAgICogQHR5cGUgT2JqZWN0CiAgICovCiAgYWRkUnVsZTogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihrZXkyLCBydWxlKSB7CiAgICB0aGlzLnJ1bGVzLmFkZChrZXkyLCBydWxlKTsKICAgIHJldHVybiB0aGlzOwogIH0sICJhZGRSdWxlIiksCiAgLyoqCiAgICogS2VlcCBhIG5vZGUgKGFzIEhUTUwpIHRoYXQgbWF0Y2hlcyB0aGUgZmlsdGVyCiAgICogQHB1YmxpYwogICAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fEZ1bmN0aW9ufSBmaWx0ZXIgVGhlIHVuaXF1ZSBrZXkgb2YgdGhlIHJ1bGUKICAgKiBAcmV0dXJucyBUaGUgVHVybmRvd24gaW5zdGFuY2UgZm9yIGNoYWluaW5nCiAgICogQHR5cGUgT2JqZWN0CiAgICovCiAga2VlcDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihmaWx0ZXIyKSB7CiAgICB0aGlzLnJ1bGVzLmtlZXAoZmlsdGVyMik7CiAgICByZXR1cm4gdGhpczsKICB9LCAia2VlcCIpLAogIC8qKgogICAqIFJlbW92ZSBhIG5vZGUgdGhhdCBtYXRjaGVzIHRoZSBmaWx0ZXIKICAgKiBAcHVibGljCiAgICogQHBhcmFtIHtTdHJpbmd8QXJyYXl8RnVuY3Rpb259IGZpbHRlciBUaGUgdW5pcXVlIGtleSBvZiB0aGUgcnVsZQogICAqIEByZXR1cm5zIFRoZSBUdXJuZG93biBpbnN0YW5jZSBmb3IgY2hhaW5pbmcKICAgKiBAdHlwZSBPYmplY3QKICAgKi8KICByZW1vdmU6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oZmlsdGVyMikgewogICAgdGhpcy5ydWxlcy5yZW1vdmUoZmlsdGVyMik7CiAgICByZXR1cm4gdGhpczsKICB9LCAicmVtb3ZlIiksCiAgLyoqCiAgICogRXNjYXBlcyBNYXJrZG93biBzeW50YXgKICAgKiBAcHVibGljCiAgICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGVzY2FwZQogICAqIEByZXR1cm5zIEEgc3RyaW5nIHdpdGggTWFya2Rvd24gc3ludGF4IGVzY2FwZWQKICAgKiBAdHlwZSBTdHJpbmcKICAgKi8KICBlc2NhcGU6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oc3RyaW5nMykgewogICAgcmV0dXJuIGVzY2FwZXMucmVkdWNlKGZ1bmN0aW9uKGFjY3VtdWxhdG9yLCBlc2NhcGUpIHsKICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yLnJlcGxhY2UoZXNjYXBlWzBdLCBlc2NhcGVbMV0pOwogICAgfSwgc3RyaW5nMyk7CiAgfSwgImVzY2FwZSIpCn07CmZ1bmN0aW9uIHByb2Nlc3MzKHBhcmVudE5vZGUpIHsKICB2YXIgc2VsZjIgPSB0aGlzOwogIHJldHVybiByZWR1Y2UyLmNhbGwocGFyZW50Tm9kZS5jaGlsZE5vZGVzLCBmdW5jdGlvbihvdXRwdXQsIG5vZGUyKSB7CiAgICBub2RlMiA9IG5ldyBOb2RlKG5vZGUyLCBzZWxmMi5vcHRpb25zKTsKICAgIHZhciByZXBsYWNlbWVudCA9ICIiOwogICAgaWYgKG5vZGUyLm5vZGVUeXBlID09PSAzKSB7CiAgICAgIHJlcGxhY2VtZW50ID0gbm9kZTIuaXNDb2RlID8gbm9kZTIubm9kZVZhbHVlIDogc2VsZjIuZXNjYXBlKG5vZGUyLm5vZGVWYWx1ZSk7CiAgICB9IGVsc2UgaWYgKG5vZGUyLm5vZGVUeXBlID09PSAxKSB7CiAgICAgIHJlcGxhY2VtZW50ID0gcmVwbGFjZW1lbnRGb3JOb2RlLmNhbGwoc2VsZjIsIG5vZGUyKTsKICAgIH0KICAgIHJldHVybiBqb2luMyhvdXRwdXQsIHJlcGxhY2VtZW50KTsKICB9LCAiIik7Cn0KX19uYW1lKHByb2Nlc3MzLCAicHJvY2VzcyIpOwpmdW5jdGlvbiBwb3N0UHJvY2VzcyhvdXRwdXQpIHsKICB2YXIgc2VsZjIgPSB0aGlzOwogIHRoaXMucnVsZXMuZm9yRWFjaChmdW5jdGlvbihydWxlKSB7CiAgICBpZiAodHlwZW9mIHJ1bGUuYXBwZW5kID09PSAiZnVuY3Rpb24iKSB7CiAgICAgIG91dHB1dCA9IGpvaW4zKG91dHB1dCwgcnVsZS5hcHBlbmQoc2VsZjIub3B0aW9ucykpOwogICAgfQogIH0pOwogIHJldHVybiBvdXRwdXQucmVwbGFjZSgvXltcdFxyXG5dKy8sICIiKS5yZXBsYWNlKC9bXHRcclxuXHNdKyQvLCAiIik7Cn0KX19uYW1lKHBvc3RQcm9jZXNzLCAicG9zdFByb2Nlc3MiKTsKZnVuY3Rpb24gcmVwbGFjZW1lbnRGb3JOb2RlKG5vZGUyKSB7CiAgdmFyIHJ1bGUgPSB0aGlzLnJ1bGVzLmZvck5vZGUobm9kZTIpOwogIHZhciBjb250ZW50MyA9IHByb2Nlc3MzLmNhbGwodGhpcywgbm9kZTIpOwogIHZhciB3aGl0ZXNwYWNlMiA9IG5vZGUyLmZsYW5raW5nV2hpdGVzcGFjZTsKICBpZiAod2hpdGVzcGFjZTIubGVhZGluZyB8fCB3aGl0ZXNwYWNlMi50cmFpbGluZykgY29udGVudDMgPSBjb250ZW50My50cmltKCk7CiAgcmV0dXJuIHdoaXRlc3BhY2UyLmxlYWRpbmcgKyBydWxlLnJlcGxhY2VtZW50KGNvbnRlbnQzLCBub2RlMiwgdGhpcy5vcHRpb25zKSArIHdoaXRlc3BhY2UyLnRyYWlsaW5nOwp9Cl9fbmFtZShyZXBsYWNlbWVudEZvck5vZGUsICJyZXBsYWNlbWVudEZvck5vZGUiKTsKZnVuY3Rpb24gam9pbjMob3V0cHV0LCByZXBsYWNlbWVudCkgewogIHZhciBzMSA9IHRyaW1UcmFpbGluZ05ld2xpbmVzKG91dHB1dCk7CiAgdmFyIHMyMiA9IHRyaW1MZWFkaW5nTmV3bGluZXMocmVwbGFjZW1lbnQpOwogIHZhciBubHMgPSBNYXRoLm1heChvdXRwdXQubGVuZ3RoIC0gczEubGVuZ3RoLCByZXBsYWNlbWVudC5sZW5ndGggLSBzMjIubGVuZ3RoKTsKICB2YXIgc2VwYXJhdG9yID0gIlxuXG4iLnN1YnN0cmluZygwLCBubHMpOwogIHJldHVybiBzMSArIHNlcGFyYXRvciArIHMyMjsKfQpfX25hbWUoam9pbjMsICJqb2luIik7CmZ1bmN0aW9uIGNhbkNvbnZlcnQoaW5wdXQpIHsKICByZXR1cm4gaW5wdXQgIT0gbnVsbCAmJiAodHlwZW9mIGlucHV0ID09PSAic3RyaW5nIiB8fCBpbnB1dC5ub2RlVHlwZSAmJiAoaW5wdXQubm9kZVR5cGUgPT09IDEgfHwgaW5wdXQubm9kZVR5cGUgPT09IDkgfHwgaW5wdXQubm9kZVR5cGUgPT09IDExKSk7Cn0KX19uYW1lKGNhbkNvbnZlcnQsICJjYW5Db252ZXJ0Iik7CnZhciB0dXJuZG93bl9icm93c2VyX2VzX2RlZmF1bHQgPSBUdXJuZG93blNlcnZpY2U7CgovLyBub2RlX21vZHVsZXMvLnBucG0vdHVybmRvd24tcGx1Z2luLWdmbUAxLjAuMi9ub2RlX21vZHVsZXMvdHVybmRvd24tcGx1Z2luLWdmbS9saWIvdHVybmRvd24tcGx1Z2luLWdmbS5lcy5qcwp2YXIgdHVybmRvd25fcGx1Z2luX2dmbV9lc19leHBvcnRzID0ge307Cl9fZXhwb3J0KHR1cm5kb3duX3BsdWdpbl9nZm1fZXNfZXhwb3J0cywgewogIGdmbTogKCkgPT4gZ2ZtMiwKICBoaWdobGlnaHRlZENvZGVCbG9jazogKCkgPT4gaGlnaGxpZ2h0ZWRDb2RlQmxvY2ssCiAgc3RyaWtldGhyb3VnaDogKCkgPT4gc3RyaWtldGhyb3VnaDIsCiAgdGFibGVzOiAoKSA9PiB0YWJsZXMsCiAgdGFza0xpc3RJdGVtczogKCkgPT4gdGFza0xpc3RJdGVtcwp9KTsKdmFyIGhpZ2hsaWdodFJlZ0V4cCA9IC9oaWdobGlnaHQtKD86dGV4dHxzb3VyY2UpLShbYS16MC05XSspLzsKZnVuY3Rpb24gaGlnaGxpZ2h0ZWRDb2RlQmxvY2sodHVybmRvd25TZXJ2aWNlKSB7CiAgdHVybmRvd25TZXJ2aWNlLmFkZFJ1bGUoImhpZ2hsaWdodGVkQ29kZUJsb2NrIiwgewogICAgZmlsdGVyOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKG5vZGUyKSB7CiAgICAgIHZhciBmaXJzdENoaWxkID0gbm9kZTIuZmlyc3RDaGlsZDsKICAgICAgcmV0dXJuIG5vZGUyLm5vZGVOYW1lID09PSAiRElWIiAmJiBoaWdobGlnaHRSZWdFeHAudGVzdChub2RlMi5jbGFzc05hbWUpICYmIGZpcnN0Q2hpbGQgJiYgZmlyc3RDaGlsZC5ub2RlTmFtZSA9PT0gIlBSRSI7CiAgICB9LCAiZmlsdGVyIiksCiAgICByZXBsYWNlbWVudDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihjb250ZW50Mywgbm9kZTIsIG9wdGlvbnMpIHsKICAgICAgdmFyIGNsYXNzTmFtZSA9IG5vZGUyLmNsYXNzTmFtZSB8fCAiIjsKICAgICAgdmFyIGxhbmd1YWdlID0gKGNsYXNzTmFtZS5tYXRjaChoaWdobGlnaHRSZWdFeHApIHx8IFtudWxsLCAiIl0pWzFdOwogICAgICByZXR1cm4gIlxuXG4iICsgb3B0aW9ucy5mZW5jZSArIGxhbmd1YWdlICsgIlxuIiArIG5vZGUyLmZpcnN0Q2hpbGQudGV4dENvbnRlbnQgKyAiXG4iICsgb3B0aW9ucy5mZW5jZSArICJcblxuIjsKICAgIH0sICJyZXBsYWNlbWVudCIpCiAgfSk7Cn0KX19uYW1lKGhpZ2hsaWdodGVkQ29kZUJsb2NrLCAiaGlnaGxpZ2h0ZWRDb2RlQmxvY2siKTsKZnVuY3Rpb24gc3RyaWtldGhyb3VnaDIodHVybmRvd25TZXJ2aWNlKSB7CiAgdHVybmRvd25TZXJ2aWNlLmFkZFJ1bGUoInN0cmlrZXRocm91Z2giLCB7CiAgICBmaWx0ZXI6IFsiZGVsIiwgInMiLCAic3RyaWtlIl0sCiAgICByZXBsYWNlbWVudDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihjb250ZW50MykgewogICAgICByZXR1cm4gIn4iICsgY29udGVudDMgKyAifiI7CiAgICB9LCAicmVwbGFjZW1lbnQiKQogIH0pOwp9Cl9fbmFtZShzdHJpa2V0aHJvdWdoMiwgInN0cmlrZXRocm91Z2giKTsKdmFyIGluZGV4T2YyID0gQXJyYXkucHJvdG90eXBlLmluZGV4T2Y7CnZhciBldmVyeTIgPSBBcnJheS5wcm90b3R5cGUuZXZlcnk7CnZhciBydWxlczIgPSB7fTsKcnVsZXMyLnRhYmxlQ2VsbCA9IHsKICBmaWx0ZXI6IFsidGgiLCAidGQiXSwKICByZXBsYWNlbWVudDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihjb250ZW50Mywgbm9kZTIpIHsKICAgIHJldHVybiBjZWxsKGNvbnRlbnQzLCBub2RlMik7CiAgfSwgInJlcGxhY2VtZW50IikKfTsKcnVsZXMyLnRhYmxlUm93ID0gewogIGZpbHRlcjogInRyIiwKICByZXBsYWNlbWVudDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihjb250ZW50Mywgbm9kZTIpIHsKICAgIHZhciBib3JkZXJDZWxscyA9ICIiOwogICAgdmFyIGFsaWduTWFwID0geyBsZWZ0OiAiOi0tIiwgcmlnaHQ6ICItLToiLCBjZW50ZXI6ICI6LToiIH07CiAgICBpZiAoaXNIZWFkaW5nUm93KG5vZGUyKSkgewogICAgICBmb3IgKHZhciBpMTAgPSAwOyBpMTAgPCBub2RlMi5jaGlsZE5vZGVzLmxlbmd0aDsgaTEwKyspIHsKICAgICAgICB2YXIgYm9yZGVyID0gIi0tLSI7CiAgICAgICAgdmFyIGFsaWduID0gKG5vZGUyLmNoaWxkTm9kZXNbaTEwXS5nZXRBdHRyaWJ1dGUoImFsaWduIikgfHwgIiIpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgaWYgKGFsaWduKSBib3JkZXIgPSBhbGlnbk1hcFthbGlnbl0gfHwgYm9yZGVyOwogICAgICAgIGJvcmRlckNlbGxzICs9IGNlbGwoYm9yZGVyLCBub2RlMi5jaGlsZE5vZGVzW2kxMF0pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gIlxuIiArIGNvbnRlbnQzICsgKGJvcmRlckNlbGxzID8gIlxuIiArIGJvcmRlckNlbGxzIDogIiIpOwogIH0sICJyZXBsYWNlbWVudCIpCn07CnJ1bGVzMi50YWJsZSA9IHsKICAvLyBPbmx5IGNvbnZlcnQgdGFibGVzIHdpdGggYSBoZWFkaW5nIHJvdy4KICAvLyBUYWJsZXMgd2l0aCBubyBoZWFkaW5nIHJvdyBhcmUga2VwdCB1c2luZyBga2VlcGAgKHNlZSBiZWxvdykuCiAgZmlsdGVyOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKG5vZGUyKSB7CiAgICByZXR1cm4gbm9kZTIubm9kZU5hbWUgPT09ICJUQUJMRSIgJiYgaXNIZWFkaW5nUm93KG5vZGUyLnJvd3NbMF0pOwogIH0sICJmaWx0ZXIiKSwKICByZXBsYWNlbWVudDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihjb250ZW50MykgewogICAgY29udGVudDMgPSBjb250ZW50My5yZXBsYWNlKCJcblxuIiwgIlxuIik7CiAgICByZXR1cm4gIlxuXG4iICsgY29udGVudDMgKyAiXG5cbiI7CiAgfSwgInJlcGxhY2VtZW50IikKfTsKcnVsZXMyLnRhYmxlU2VjdGlvbiA9IHsKICBmaWx0ZXI6IFsidGhlYWQiLCAidGJvZHkiLCAidGZvb3QiXSwKICByZXBsYWNlbWVudDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbihjb250ZW50MykgewogICAgcmV0dXJuIGNvbnRlbnQzOwogIH0sICJyZXBsYWNlbWVudCIpCn07CmZ1bmN0aW9uIGlzSGVhZGluZ1Jvdyh0cjIpIHsKICB2YXIgcGFyZW50Tm9kZSA9IHRyMi5wYXJlbnROb2RlOwogIHJldHVybiBwYXJlbnROb2RlLm5vZGVOYW1lID09PSAiVEhFQUQiIHx8IHBhcmVudE5vZGUuZmlyc3RDaGlsZCA9PT0gdHIyICYmIChwYXJlbnROb2RlLm5vZGVOYW1lID09PSAiVEFCTEUiIHx8IGlzRmlyc3RUYm9keShwYXJlbnROb2RlKSkgJiYgZXZlcnkyLmNhbGwodHIyLmNoaWxkTm9kZXMsIGZ1bmN0aW9uKG4xMSkgewogICAgcmV0dXJuIG4xMS5ub2RlTmFtZSA9PT0gIlRIIjsKICB9KTsKfQpfX25hbWUoaXNIZWFkaW5nUm93LCAiaXNIZWFkaW5nUm93Iik7CmZ1bmN0aW9uIGlzRmlyc3RUYm9keShlbGVtZW50NCkgewogIHZhciBwcmV2aW91c1NpYmxpbmcgPSBlbGVtZW50NC5wcmV2aW91c1NpYmxpbmc7CiAgcmV0dXJuIGVsZW1lbnQ0Lm5vZGVOYW1lID09PSAiVEJPRFkiICYmICghcHJldmlvdXNTaWJsaW5nIHx8IHByZXZpb3VzU2libGluZy5ub2RlTmFtZSA9PT0gIlRIRUFEIiAmJiAvXlxzKiQvaS50ZXN0KHByZXZpb3VzU2libGluZy50ZXh0Q29udGVudCkpOwp9Cl9fbmFtZShpc0ZpcnN0VGJvZHksICJpc0ZpcnN0VGJvZHkiKTsKZnVuY3Rpb24gY2VsbChjb250ZW50Mywgbm9kZTIpIHsKICB2YXIgaW5kZXgyID0gaW5kZXhPZjIuY2FsbChub2RlMi5wYXJlbnROb2RlLmNoaWxkTm9kZXMsIG5vZGUyKTsKICB2YXIgcHJlZml4ID0gIiAiOwogIGlmIChpbmRleDIgPT09IDApIHByZWZpeCA9ICJ8ICI7CiAgcmV0dXJuIHByZWZpeCArIGNvbnRlbnQzICsgIiB8IjsKfQpfX25hbWUoY2VsbCwgImNlbGwiKTsKZnVuY3Rpb24gdGFibGVzKHR1cm5kb3duU2VydmljZSkgewogIHR1cm5kb3duU2VydmljZS5rZWVwKGZ1bmN0aW9uKG5vZGUyKSB7CiAgICByZXR1cm4gbm9kZTIubm9kZU5hbWUgPT09ICJUQUJMRSIgJiYgIWlzSGVhZGluZ1Jvdyhub2RlMi5yb3dzWzBdKTsKICB9KTsKICBmb3IgKHZhciBrZXkyIGluIHJ1bGVzMikgdHVybmRvd25TZXJ2aWNlLmFkZFJ1bGUoa2V5MiwgcnVsZXMyW2tleTJdKTsKfQpfX25hbWUodGFibGVzLCAidGFibGVzIik7CmZ1bmN0aW9uIHRhc2tMaXN0SXRlbXModHVybmRvd25TZXJ2aWNlKSB7CiAgdHVybmRvd25TZXJ2aWNlLmFkZFJ1bGUoInRhc2tMaXN0SXRlbXMiLCB7CiAgICBmaWx0ZXI6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24obm9kZTIpIHsKICAgICAgcmV0dXJuIG5vZGUyLnR5cGUgPT09ICJjaGVja2JveCIgJiYgbm9kZTIucGFyZW50Tm9kZS5ub2RlTmFtZSA9PT0gIkxJIjsKICAgIH0sICJmaWx0ZXIiKSwKICAgIHJlcGxhY2VtZW50OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKGNvbnRlbnQzLCBub2RlMikgewogICAgICByZXR1cm4gKG5vZGUyLmNoZWNrZWQgPyAiW3hdIiA6ICJbIF0iKSArICIgIjsKICAgIH0sICJyZXBsYWNlbWVudCIpCiAgfSk7Cn0KX19uYW1lKHRhc2tMaXN0SXRlbXMsICJ0YXNrTGlzdEl0ZW1zIik7CmZ1bmN0aW9uIGdmbTIodHVybmRvd25TZXJ2aWNlKSB7CiAgdHVybmRvd25TZXJ2aWNlLnVzZShbCiAgICBoaWdobGlnaHRlZENvZGVCbG9jaywKICAgIHN0cmlrZXRocm91Z2gyLAogICAgdGFibGVzLAogICAgdGFza0xpc3RJdGVtcwogIF0pOwp9Cl9fbmFtZShnZm0yLCAiZ2ZtIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRtYXJrZG93bkAzLjAuMy9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRtYXJrZG93bi9kaXN0X3RzL3NtYXJ0bWFya2Rvd24ucGx1Z2lucy5qcwp2YXIgc21hcnR5YW1sID0gX190b0VTTShyZXF1aXJlX2Rpc3RfdHMyKCksIDEpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0bWFya2Rvd25AMy4wLjMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0bWFya2Rvd24vZGlzdF90cy9zbWFydG1hcmtkb3duLmNsYXNzZXMubWRwYXJzZWRyZXN1bHQuanMKdmFyIE1kUGFyc2VkUmVzdWx0ID0gY2xhc3MgX01kUGFyc2VkUmVzdWx0IHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJNZFBhcnNlZFJlc3VsdCIpOwogIH0KICBzdGF0aWMgYXN5bmMgY3JlYXRlRnJvbU1hcmtkb3duU3RyaW5nKG1kU3RyaW5nQXJnKSB7CiAgICBjb25zdCBtZFBhcnNlZFJlc3VsdCA9IG5ldyBfTWRQYXJzZWRSZXN1bHQoKTsKICAgIGF3YWl0IG1kUGFyc2VkUmVzdWx0LnVwZGF0ZUZyb21NYXJrZG93blN0cmluZyhtZFN0cmluZ0FyZyk7CiAgICByZXR1cm4gbWRQYXJzZWRSZXN1bHQ7CiAgfQogIGFzeW5jIHVwZGF0ZUZyb21NYXJrZG93blN0cmluZyhtZFN0cmluZ0FyZykgewogICAgbGV0IHlhbWxTdHJpbmc7CiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB1bmlmaWVkKCkudXNlKHJlbWFya1BhcnNlKS51c2UocmVtYXJrR2ZtKS51c2UocmVtYXJrRnJvbnRtYXR0ZXIsIFsieWFtbCIsICJ0b21sIl0pLnVzZShyZW1hcmtTdHJpbmdpZnkpLnVzZShyZW1hcmtIdG1sKS51c2UoKCkgPT4gKHRyZWUpID0+IHsKICAgICAgY29uc29sZS5kaXIodHJlZSk7CiAgICAgIGNvbnN0IHlhbWxDaGlsZCA9IHRyZWUuY2hpbGRyZW4uZmluZCgob2JqZWN0QXJnKSA9PiBvYmplY3RBcmcudHlwZSA9PT0gInlhbWwiKTsKICAgICAgaWYgKHlhbWxDaGlsZCkgewogICAgICAgIHlhbWxTdHJpbmcgPSB5YW1sQ2hpbGQudmFsdWU7CiAgICAgIH0KICAgIH0pLnByb2Nlc3MobWRTdHJpbmdBcmcpOwogICAgdGhpcy5odG1sID0gcmVzdWx0LnRvU3RyaW5nKCk7CiAgICBpZiAoeWFtbFN0cmluZykgewogICAgICB0aGlzLmZyb250bWF0dGVyRGF0YSA9IGF3YWl0IHNtYXJ0eWFtbC55YW1sU3RyaW5nVG9PYmplY3QoeWFtbFN0cmluZyk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmZyb250bWF0dGVyRGF0YSA9IHt9OwogICAgfQogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydG1hcmtkb3duQDMuMC4zL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydG1hcmtkb3duL2Rpc3RfdHMvaW5kZXguanMKdmFyIFNtYXJ0TWFya2Rvd24gPSBjbGFzcyBfU21hcnRNYXJrZG93biB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiU21hcnRNYXJrZG93biIpOwogIH0KICBzdGF0aWMgYXN5bmMgZWFzeU1hcmtkb3duVG9IdG1sKG1kU3RyaW5nQXJnKSB7CiAgICBjb25zdCBzbWFydG1hcmtkb3duSW5zdGFuY2UgPSBuZXcgX1NtYXJ0TWFya2Rvd24oKTsKICAgIGNvbnN0IG1kUGFyc2VkUmVzdWx0ID0gYXdhaXQgc21hcnRtYXJrZG93bkluc3RhbmNlLmdldE1kUGFyc2VkUmVzdWx0RnJvbU1hcmtkb3duKG1kU3RyaW5nQXJnKTsKICAgIHJldHVybiBtZFBhcnNlZFJlc3VsdC5odG1sOwogIH0KICBjb25zdHJ1Y3RvcigpIHsKICB9CiAgLyoqCiAgICogY3JlYXRlIGEgTWRQYXJzZWRSZXN1bHQgZnJvbSBtYXJrZG93bgogICAqIEBwYXJhbSBtZFN0cmluZ0FyZwogICAqLwogIGFzeW5jIGdldE1kUGFyc2VkUmVzdWx0RnJvbU1hcmtkb3duKG1kU3RyaW5nQXJnKSB7CiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBNZFBhcnNlZFJlc3VsdC5jcmVhdGVGcm9tTWFya2Rvd25TdHJpbmcobWRTdHJpbmdBcmcpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CiAgaHRtbFRvTWFya2Rvd24oaHRtbFN0cmluZykgewogICAgY29uc3QgdHVybmRvd25JbnN0YW5jZSA9IG5ldyB0dXJuZG93bl9icm93c2VyX2VzX2RlZmF1bHQoewogICAgICBoZWFkaW5nU3R5bGU6ICJhdHgiLAogICAgICBjb2RlQmxvY2tTdHlsZTogImZlbmNlZCIKICAgIH0pOwogICAgdHVybmRvd25JbnN0YW5jZS51c2UodHVybmRvd25fcGx1Z2luX2dmbV9lc19leHBvcnRzLmdmbSk7CiAgICByZXR1cm4gdHVybmRvd25JbnN0YW5jZS50dXJuZG93bihodG1sU3RyaW5nKTsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRyb3V0ZXJAMS4zLjMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0cm91dGVyL2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czE4ID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czE4LCB7CiAgU21hcnRSb3V0ZXI6ICgpID0+IFNtYXJ0Um91dGVyCn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0cm91dGVyQDEuMy4zL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHJvdXRlci9kaXN0X3RzL3NtYXJ0cm91dGVyLnBsdWdpbnMuanMKdmFyIHBhdGhUb1JlZ0V4cCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0cm91dGVyQDEuMy4zL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHJvdXRlci9kaXN0X3RzL3NtYXJ0cm91dGVyLmNsYXNzZXMucXVlcnlwYXJhbXMuanMKdmFyIFF1ZXJ5UGFyYW1zID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlF1ZXJ5UGFyYW1zIik7CiAgfQogIGNvbnN0cnVjdG9yKCkgewogIH0KICBnZXRBbGxBc09iamVjdCgpIHsKICAgIGNvbnN0IHVybFNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7CiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKHVybFNlYXJjaFBhcmFtcy5lbnRyaWVzKCkpOwogIH0KICBzZXRRdWVyeVBhcmFtKHF1ZXJ5S2V5QXJnLCBxdWVyeUNvbnRlbnRBcmcsIHB1c2hPclJlcGxhY2VBcmcgPSAicmVwbGFjZSIpIHsKICAgIHZhciBxdWVyeVBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7CiAgICBxdWVyeVBhcmFtcy5zZXQocXVlcnlLZXlBcmcsIHF1ZXJ5Q29udGVudEFyZyk7CiAgICBwdXNoT3JSZXBsYWNlQXJnID09PSAicHVzaCIgPyBoaXN0b3J5LnB1c2hTdGF0ZShudWxsLCBudWxsLCAiPyIgKyBxdWVyeVBhcmFtcy50b1N0cmluZygpKSA6IGhpc3RvcnkucmVwbGFjZVN0YXRlKG51bGwsIG51bGwsICI/IiArIHF1ZXJ5UGFyYW1zLnRvU3RyaW5nKCkpOwogIH0KICBkZWxldGVRdWVyeVBhcmFtKHF1ZXJ5S2V5QXJnLCBwdXNoT3JSZXBsYWNlQXJnID0gInJlcGxhY2UiKSB7CiAgICB2YXIgcXVlcnlQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpOwogICAgcXVlcnlQYXJhbXMuZGVsZXRlKHF1ZXJ5S2V5QXJnKTsKICAgIHB1c2hPclJlcGxhY2VBcmcgPT09ICJwdXNoIiA/IGhpc3RvcnkucHVzaFN0YXRlKG51bGwsIG51bGwsICI/IiArIHF1ZXJ5UGFyYW1zLnRvU3RyaW5nKCkpIDogaGlzdG9yeS5yZXBsYWNlU3RhdGUobnVsbCwgbnVsbCwgIj8iICsgcXVlcnlQYXJhbXMudG9TdHJpbmcoKSk7CiAgfQogIGdldFF1ZXJ5UGFyYW0ocXVlcnlQYXJhbU5hbWUpIHsKICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gdGhpcy5nZXRBbGxBc09iamVjdCgpOwogICAgcmV0dXJuIHF1ZXJ5UGFyYW1zW3F1ZXJ5UGFyYW1OYW1lXTsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRyb3V0ZXJAMS4zLjMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0cm91dGVyL2Rpc3RfdHMvc21hcnRyb3V0ZXIuY2xhc3Nlcy5zbWFydHJvdXRlci5qcwp2YXIgcm91dGVMb2cgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChtZXNzYWdlMikgPT4gewogIGNvbnNvbGUubG9nKGAlY1tSb3V0ZXJdJWMgJHttZXNzYWdlMn1gLCAiY29sb3I6IHJnYigyNTUsIDEwNSwgMTAwKTsiLCAiY29sb3I6IGluaGVyaXQiKTsKfSwgInJvdXRlTG9nIik7CnZhciBTbWFydFJvdXRlciA9IGNsYXNzIF9TbWFydFJvdXRlciB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiU21hcnRSb3V0ZXIiKTsKICB9CiAgLyoqCiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBSb3V0ZXIuCiAgICovCiAgY29uc3RydWN0b3Iob3B0aW9uc0FyZywgYmFzZVBhdGggPSAiIikgewogICAgdGhpcy5vcHRpb25zID0gewogICAgICBkZWJ1ZzogZmFsc2UKICAgIH07CiAgICB0aGlzLnF1ZXJ5UGFyYW1zID0gbmV3IFF1ZXJ5UGFyYW1zKCk7CiAgICB0aGlzLnJvdXRlcyA9IFtdOwogICAgdGhpcy5vcHRpb25zID0gewogICAgICAuLi50aGlzLm9wdGlvbnMsCiAgICAgIC4uLm9wdGlvbnNBcmcKICAgIH07CiAgICB0aGlzLmJhc2VQYXRoID0gYmFzZVBhdGg7CiAgICB0aGlzLnBvcHN0YXRlTGlzdGVuZXIgPSAocG9wU3RhdGVFdmVudEFyZykgPT4gewogICAgICBwb3BTdGF0ZUV2ZW50QXJnLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHRoaXMuX2hhbmRsZVJvdXRlU3RhdGUoKTsKICAgIH07CiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicG9wc3RhdGUiLCB0aGlzLnBvcHN0YXRlTGlzdGVuZXIpOwogIH0KICAvKioKICAgKiBDcmVhdGUgYSBzdWItcm91dGVyIHdpdGggYSBzcGVjaWZpYyBwcmVmaXgKICAgKiBAcGFyYW0ge3N0cmluZ30gc3ViUGF0aAogICAqIEBwYXJhbSB7SVJvdXRlck9wdGlvbnN9IFtvcHRpb25zXQogICAqLwogIGNyZWF0ZVN1YlJvdXRlcihzdWJQYXRoLCBvcHRpb25zKSB7CiAgICBjb25zdCBuZXdCYXNlUGF0aCA9IGAke3RoaXMuYmFzZVBhdGh9JHtzdWJQYXRofWA7CiAgICByZXR1cm4gbmV3IF9TbWFydFJvdXRlcih7IC4uLnRoaXMub3B0aW9ucywgLi4ub3B0aW9ucyB9LCBuZXdCYXNlUGF0aCk7CiAgfQogIC8qKgogICAqIFB1c2ggcm91dGUgc3RhdGUgdG8gaGlzdG9yeSBzdGFjawogICAqLwogIGFzeW5jIHB1c2hVcmwodXJsID0gIi8iLCBzdGF0ZSA9IHt9KSB7CiAgICBjb25zdCBmdWxsVXJsID0gYCR7dGhpcy5iYXNlUGF0aH0ke3VybH1gOwogICAgaWYgKGZ1bGxVcmwgIT09IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSkgewogICAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUoc3RhdGUsIHdpbmRvdy5kb2N1bWVudC50aXRsZSwgZnVsbFVybCk7CiAgICB9IGVsc2UgewogICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoc3RhdGUsIHdpbmRvdy5kb2N1bWVudC50aXRsZSwgZnVsbFVybCk7CiAgICB9CiAgICBhd2FpdCB0aGlzLl9oYW5kbGVSb3V0ZVN0YXRlKCk7CiAgfQogIC8qKgogICAqIEF0dGFjaCByb3V0ZSB3aXRoIGhhbmRsZXIKICAgKiBAcGFyYW0ge3N0cmluZ3xSZWdFeHB9IHJvdXRlQXJnCiAgICogQHBhcmFtIHtmdW5jdGlvbn0gaGFuZGxlckFyZwogICAqLwogIG9uKHJvdXRlQXJnLCBoYW5kbGVyQXJnKSB7CiAgICBjb25zdCBmdWxsUm91dGUgPSBgJHt0aGlzLmJhc2VQYXRofSR7cm91dGVBcmd9YDsKICAgIGNvbnN0IHJvdXRlT2JqZWN0ID0gewogICAgICBtYXRjaEZ1bmN0aW9uOiBwYXRoVG9SZWdFeHAubWF0Y2goZnVsbFJvdXRlKSwKICAgICAgaGFuZGxlcjogaGFuZGxlckFyZwogICAgfTsKICAgIHRoaXMucm91dGVzLnB1c2gocm91dGVPYmplY3QpOwogICAgY29uc3QgcmVtb3ZlRnVuY3Rpb24gPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCgpID0+IHsKICAgICAgdGhpcy5yb3V0ZXMuc3BsaWNlKHRoaXMucm91dGVzLmluZGV4T2Yocm91dGVPYmplY3QpLCAxKTsKICAgIH0sICJyZW1vdmVGdW5jdGlvbiIpOwogICAgcmV0dXJuIHJlbW92ZUZ1bmN0aW9uOwogIH0KICAvKioKICAgKiBBcHBseSByb3V0ZXMgaGFuZGxlciB0byBjdXJyZW50IHJvdXRlCiAgICovCiAgYXN5bmMgX2hhbmRsZVJvdXRlU3RhdGUoKSB7CiAgICBjb25zdCBjdXJyZW50TG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWU7CiAgICBjb25zdCB3YW50ZWRSb3V0ZXMgPSB0aGlzLnJvdXRlcy5maWx0ZXIoKHJvdXRlQXJnKSA9PiB7CiAgICAgIHJldHVybiAhIXJvdXRlQXJnLm1hdGNoRnVuY3Rpb24oY3VycmVudExvY2F0aW9uKTsKICAgIH0pOwogICAgZm9yIChjb25zdCB3YW50ZWRSb3V0ZSBvZiB3YW50ZWRSb3V0ZXMpIHsKICAgICAgY29uc3Qgcm91dGVSZXN1bHQgPSB3YW50ZWRSb3V0ZS5tYXRjaEZ1bmN0aW9uKGN1cnJlbnRMb2NhdGlvbik7CiAgICAgIHdhbnRlZFJvdXRlLmhhbmRsZXIoewogICAgICAgIC4uLnJvdXRlUmVzdWx0LnZhbHVlT2YoKSwKICAgICAgICBxdWVyeVBhcmFtczogdGhpcy5xdWVyeVBhcmFtcy5nZXRBbGxBc09iamVjdCgpCiAgICAgICAgLy8gVE9ETyBjaGVjayB3ZXRoZXIgZW50cmllcyBpcyBzdXBwb3J0ZWQgaW4gdHlwaW5ncwogICAgICB9KTsKICAgIH0KICB9CiAgLyoqCiAgICogRGVzdHJveSB0aGUgcm91dGVyIGluc3RhbmNlLCByZW1vdmluZyBhbGwgZXh0ZXJuYWwgcmVmZXJlbmNlcwogICAqLwogIGRlc3Ryb3koKSB7CiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9wc3RhdGUiLCB0aGlzLnBvcHN0YXRlTGlzdGVuZXIpOwogICAgdGhpcy5yb3V0ZXMgPSBbXTsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRzdGF0ZUAyLjIuMS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRzdGF0ZS9kaXN0X3RzL2luZGV4LmpzCnZhciBkaXN0X3RzX2V4cG9ydHMyMSA9IHt9OwpfX2V4cG9ydChkaXN0X3RzX2V4cG9ydHMyMSwgewogIFNtYXJ0c3RhdGU6ICgpID0+IFNtYXJ0c3RhdGUsCiAgU3RhdGVBY3Rpb246ICgpID0+IFN0YXRlQWN0aW9uLAogIFN0YXRlUGFydDogKCkgPT4gU3RhdGVQYXJ0LAogIGF0dGFjaENvbnRleHRQcm92aWRlcjogKCkgPT4gYXR0YWNoQ29udGV4dFByb3ZpZGVyLAogIGNvbXB1dGVkOiAoKSA9PiBjb21wdXRlZAp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydGhhc2hAMy4yLjYvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0aGFzaC9kaXN0X3RzX3dlYi9pbmRleC5qcwp2YXIgZGlzdF90c193ZWJfZXhwb3J0cyA9IHt9OwpfX2V4cG9ydChkaXN0X3RzX3dlYl9leHBvcnRzLCB7CiAgbWQ1RnJvbVN0cmluZzogKCkgPT4gbWQ1RnJvbVN0cmluZywKICBzaGEyNTZGcm9tQnVmZmVyOiAoKSA9PiBzaGEyNTZGcm9tQnVmZmVyLAogIHNoYTI1NkZyb21GaWxlOiAoKSA9PiBzaGEyNTZGcm9tRmlsZSwKICBzaGEyNTZGcm9tU3RyZWFtOiAoKSA9PiBzaGEyNTZGcm9tU3RyZWFtLAogIHNoYTI1NkZyb21TdHJpbmc6ICgpID0+IHNoYTI1NkZyb21TdHJpbmcsCiAgc2hhMjU2RnJvbVN0cmluZ1N5bmM6ICgpID0+IHNoYTI1NkZyb21TdHJpbmdTeW5jLAogIHNoYTI2NUZyb21PYmplY3Q6ICgpID0+IHNoYTI2NUZyb21PYmplY3QKfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRlbnZANS4wLjEzL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGVudi9kaXN0X3RzL2luZGV4LmpzCnZhciBkaXN0X3RzX2V4cG9ydHMxOSA9IHt9OwpfX2V4cG9ydChkaXN0X3RzX2V4cG9ydHMxOSwgewogIFNtYXJ0ZW52OiAoKSA9PiBTbWFydGVudjIKfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRlbnZANS4wLjEzL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGVudi9kaXN0X3RzL3NtYXJ0ZW52LmNsYXNzZXMuc21hcnRlbnYuanMKdmFyIFNtYXJ0ZW52MiA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJTbWFydGVudiIpOwogIH0KICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMubG9hZGVkU2NyaXB0cyA9IFtdOwogIH0KICBhc3luYyBnZXRFbnZBd2FyZU1vZHVsZShvcHRpb25zQXJnKSB7CiAgICBpZiAodGhpcy5pc05vZGUpIHsKICAgICAgY29uc3QgbW9kdWxlUmVzdWx0ID0gYXdhaXQgdGhpcy5nZXRTYWZlTm9kZU1vZHVsZShvcHRpb25zQXJnLm5vZGVNb2R1bGVOYW1lKTsKICAgICAgcmV0dXJuIG1vZHVsZVJlc3VsdDsKICAgIH0gZWxzZSBpZiAodGhpcy5pc0Jyb3dzZXIpIHsKICAgICAgY29uc3QgbW9kdWxlUmVzdWx0ID0gYXdhaXQgdGhpcy5nZXRTYWZlV2ViTW9kdWxlKG9wdGlvbnNBcmcud2ViVXJsQXJnLCBvcHRpb25zQXJnLmdldEZ1bmN0aW9uKTsKICAgICAgcmV0dXJuIG1vZHVsZVJlc3VsdDsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoInBsYXRmb3JtIGZvciBsb2FkaW5nIG5vdCBzdXBwb3J0ZWQgYnkgc21hcnRlbnYiKTsKICAgIH0KICB9CiAgYXN5bmMgZ2V0U2FmZU5vZGVNb2R1bGUobW9kdWxlTmFtZUFyZywgcnVuQWZ0ZXJGdW5jKSB7CiAgICBpZiAoIXRoaXMuaXNOb2RlKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoYFlvdSB0cmllZCB0byBsb2FkIGEgbm9kZSBtb2R1bGUgaW4gYSB3cm9uZyBjb250ZXh0OiAke21vZHVsZU5hbWVBcmd9LiBUaGlzIGRvZXMgbm90IHRocm93LmApOwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCByZXR1cm5WYWx1ZSA9IGF3YWl0IG5ldyBGdW5jdGlvbihgcmV0dXJuIGltcG9ydCgnJHttb2R1bGVOYW1lQXJnfScpYCkoKTsKICAgIGlmIChydW5BZnRlckZ1bmMpIHsKICAgICAgYXdhaXQgcnVuQWZ0ZXJGdW5jKHJldHVyblZhbHVlKTsKICAgIH0KICAgIHJldHVybiByZXR1cm5WYWx1ZTsKICB9CiAgYXN5bmMgZ2V0U2FmZVdlYk1vZHVsZSh1cmxBcmcsIGdldEZ1bmN0aW9uQXJnKSB7CiAgICBpZiAoIXRoaXMuaXNCcm93c2VyKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoIllvdSB0cmllZCB0byBsb2FkIGEgd2ViIG1vZHVsZSBpbiBhIHdyb25nIGNvbnRleHQiKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHRoaXMubG9hZGVkU2NyaXB0cy5pbmNsdWRlcyh1cmxBcmcpKSB7CiAgICAgIHJldHVybiBnZXRGdW5jdGlvbkFyZygpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5sb2FkZWRTY3JpcHRzLnB1c2godXJsQXJnKTsKICAgIH0KICAgIGNvbnN0IGRvbmUgPSBkaXN0X3RzX2V4cG9ydHMuZGVmZXIoKTsKICAgIGlmIChnbG9iYWxUaGlzLmltcG9ydFNjcmlwdHMpIHsKICAgICAgZ2xvYmFsVGhpcy5pbXBvcnRTY3JpcHRzKHVybEFyZyk7CiAgICAgIGRvbmUucmVzb2x2ZSgpOwogICAgfSBlbHNlIHsKICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CiAgICAgIHNjcmlwdC5vbmxvYWQgPSAoKSA9PiB7CiAgICAgICAgZG9uZS5yZXNvbHZlKCk7CiAgICAgIH07CiAgICAgIHNjcmlwdC5zcmMgPSB1cmxBcmc7CiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTsKICAgIH0KICAgIGF3YWl0IGRvbmUucHJvbWlzZTsKICAgIHJldHVybiBnZXRGdW5jdGlvbkFyZygpOwogIH0KICBnZXQgcnVudGltZUVudigpIHsKICAgIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgcmV0dXJuICJub2RlIjsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAiYnJvd3NlciI7CiAgICB9CiAgfQogIGdldCBpc0Jyb3dzZXIoKSB7CiAgICByZXR1cm4gIXRoaXMuaXNOb2RlOwogIH0KICBnZXQgdXNlckFnZW50KCkgewogICAgaWYgKHRoaXMuaXNCcm93c2VyKSB7CiAgICAgIHJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICJ1bmRlZmluZWQiOwogICAgfQogIH0KICBnZXQgaXNOb2RlKCkgewogICAgcmV0dXJuIHRoaXMucnVudGltZUVudiA9PT0gIm5vZGUiOwogIH0KICBnZXQgbm9kZVZlcnNpb24oKSB7CiAgICByZXR1cm4gcHJvY2Vzcy52ZXJzaW9uOwogIH0KICBnZXQgaXNDSSgpIHsKICAgIGlmICh0aGlzLmlzTm9kZSkgewogICAgICBpZiAocHJvY2Vzcy5lbnYuQ0kpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgYXN5bmMgaXNNYWNBc3luYygpIHsKICAgIGlmICh0aGlzLmlzTm9kZSkgewogICAgICBjb25zdCBvcyA9IGF3YWl0IHRoaXMuZ2V0U2FmZU5vZGVNb2R1bGUoIm9zIik7CiAgICAgIHJldHVybiBvcy5wbGF0Zm9ybSgpID09PSAiZGFyd2luIjsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgYXN5bmMgaXNXaW5kb3dzQXN5bmMoKSB7CiAgICBpZiAodGhpcy5pc05vZGUpIHsKICAgICAgY29uc3Qgb3MgPSBhd2FpdCB0aGlzLmdldFNhZmVOb2RlTW9kdWxlKCJvcyIpOwogICAgICByZXR1cm4gb3MucGxhdGZvcm0oKSA9PT0gIndpbjMyIjsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgYXN5bmMgaXNMaW51eEFzeW5jKCkgewogICAgaWYgKHRoaXMuaXNOb2RlKSB7CiAgICAgIGNvbnN0IG9zID0gYXdhaXQgdGhpcy5nZXRTYWZlTm9kZU1vZHVsZSgib3MiKTsKICAgICAgcmV0dXJuIG9zLnBsYXRmb3JtKCkgPT09ICJsaW51eCI7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQogIC8qKgogICAqIHByaW50cyB0aGUgZW52aXJvbm1lbnQgdG8gY29uc29sZQogICAqLwogIGFzeW5jIHByaW50RW52KCkgewogICAgaWYgKHRoaXMuaXNOb2RlKSB7CiAgICAgIGNvbnNvbGUubG9nKCJydW5uaW5nIG9uIE5PREUiKTsKICAgICAgY29uc29sZS5sb2coIm5vZGUgdmVyc2lvbiBpcyAiICsgdGhpcy5ub2RlVmVyc2lvbik7CiAgICB9IGVsc2UgewogICAgICBjb25zb2xlLmxvZygicnVubmluZyBvbiBCUk9XU0VSIik7CiAgICAgIGNvbnNvbGUubG9nKCJicm93c2VyIGlzICIgKyB0aGlzLnVzZXJBZ2VudCk7CiAgICB9CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0anNvbkA1LjIuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRqc29uL2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czIwID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czIwLCB7CiAgU21hcnRqc29uOiAoKSA9PiBTbWFydGpzb24yLAogIGRlZXBFcXVhbEpzb25MU3RyaW5nczogKCkgPT4gZGVlcEVxdWFsSnNvbkxTdHJpbmdzMiwKICBkZWVwRXF1YWxPYmplY3RzOiAoKSA9PiBkZWVwRXF1YWxPYmplY3RzMiwKICBmb2xkRGVjOiAoKSA9PiBmb2xkRGVjMiwKICBwYXJzZTogKCkgPT4gcGFyc2U4LAogIHBhcnNlQmFzZTY0OiAoKSA9PiBwYXJzZUJhc2U2NDIsCiAgcGFyc2VKc29uTDogKCkgPT4gcGFyc2VKc29uTDIsCiAgc3RhYmxlT25lV2F5U3RyaW5naWZ5OiAoKSA9PiBzdGFibGVPbmVXYXlTdHJpbmdpZnkyLAogIHN0cmluZ2lmeTogKCkgPT4gc3RyaW5naWZ5NiwKICBzdHJpbmdpZnlCYXNlNjQ6ICgpID0+IHN0cmluZ2lmeUJhc2U2NDIsCiAgc3RyaW5naWZ5SnNvbkw6ICgpID0+IHN0cmluZ2lmeUpzb25MMiwKICBzdHJpbmdpZnlQcmV0dHk6ICgpID0+IHN0cmluZ2lmeVByZXR0eTIKfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRqc29uQDUuMi4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGpzb24vZGlzdF90cy9zbWFydGpzb24ucGx1Z2lucy5qcwp2YXIgaW1wb3J0X2xvZGFzaDIgPSBfX3RvRVNNKHJlcXVpcmVfbG9kYXNoKCksIDEpOwp2YXIgaW1wb3J0X2Zhc3RfanNvbl9zdGFibGVfc3RyaW5naWZ5MiA9IF9fdG9FU00ocmVxdWlyZV9mYXN0X2pzb25fc3RhYmxlX3N0cmluZ2lmeSgpLCAxKTsKdmFyIHN0YWJsZUpzb24zID0gaW1wb3J0X2Zhc3RfanNvbl9zdGFibGVfc3RyaW5naWZ5Mi5kZWZhdWx0OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0anNvbkA1LjIuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRqc29uL2Rpc3RfdHMvYnVmZmVyaGFuZGxpbmcuanMKZnVuY3Rpb24gYmFzZTY0RW5jb2RlMihkYXRhKSB7CiAgaWYgKHR5cGVvZiBCdWZmZXIgIT09ICJ1bmRlZmluZWQiKSB7CiAgICByZXR1cm4gQnVmZmVyLmZyb20oZGF0YSkudG9TdHJpbmcoImJhc2U2NCIpOwogIH0KICByZXR1cm4gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLmRhdGEpKTsKfQpfX25hbWUoYmFzZTY0RW5jb2RlMiwgImJhc2U2NEVuY29kZSIpOwpmdW5jdGlvbiBiYXNlNjREZWNvZGUyKHN0cikgewogIGlmICh0eXBlb2YgQnVmZmVyICE9PSAidW5kZWZpbmVkIikgewogICAgY29uc3QgYnVmID0gQnVmZmVyLmZyb20oc3RyLCAiYmFzZTY0Iik7CiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYnVmLmJ1ZmZlciwgYnVmLmJ5dGVPZmZzZXQsIGJ1Zi5ieXRlTGVuZ3RoKTsKICB9CiAgcmV0dXJuIG5ldyBVaW50OEFycmF5KEFycmF5LmZyb20oYXRvYihzdHIpKS5tYXAoKGNoYXIpID0+IGNoYXIuY2hhckNvZGVBdCgwKSkpOwp9Cl9fbmFtZShiYXNlNjREZWNvZGUyLCAiYmFzZTY0RGVjb2RlIik7CmZ1bmN0aW9uIHN0cmluZ2lmeTUodmFsdWUyLCBzcGFjZTIpIHsKICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUyLCByZXBsYWNlcjIsIHNwYWNlMik7Cn0KX19uYW1lKHN0cmluZ2lmeTUsICJzdHJpbmdpZnkiKTsKZnVuY3Rpb24gcGFyc2U3KHRleHQ4KSB7CiAgcmV0dXJuIEpTT04ucGFyc2UodGV4dDgsIHJldml2ZXIyKTsKfQpfX25hbWUocGFyc2U3LCAicGFyc2UiKTsKdmFyIHJlcGxhY2VyMiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGtleTIsIHZhbHVlMikgPT4gewogIGlmIChpc0J1ZmZlckxpa2UzKHZhbHVlMikpIHsKICAgIGxldCBidWZmZXJEYXRhOwogICAgaWYgKCJkYXRhIiBpbiB2YWx1ZTIgJiYgaXNBcnJheTQodmFsdWUyLmRhdGEpKSB7CiAgICAgIGJ1ZmZlckRhdGEgPSBuZXcgVWludDhBcnJheSh2YWx1ZTIuZGF0YSk7CiAgICB9IGVsc2UgaWYgKHZhbHVlMiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHsKICAgICAgYnVmZmVyRGF0YSA9IHZhbHVlMjsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB2YWx1ZTI7CiAgICB9CiAgICBjb25zdCBiYXNlNjREYXRhID0gImJhc2U2NDoiICsgYmFzZTY0RW5jb2RlMihidWZmZXJEYXRhKTsKICAgIHJldHVybiB7CiAgICAgIHR5cGU6ICJFbmNvZGVkQnVmZmVyIiwKICAgICAgZGF0YTogYmFzZTY0RGF0YQogICAgfTsKICB9CiAgcmV0dXJuIHZhbHVlMjsKfSwgInJlcGxhY2VyIik7CnZhciByZXZpdmVyMiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGtleTIsIHZhbHVlMikgPT4gewogIGlmIChpc0VuY29kZWRCdWZmZXIyKHZhbHVlMikpIHsKICAgIGlmIChpc1N0cmluZzIodmFsdWUyLmRhdGEpICYmIHZhbHVlMi5kYXRhLnN0YXJ0c1dpdGgoImJhc2U2NDoiKSkgewogICAgICBjb25zdCBiYXNlNjREYXRhID0gdmFsdWUyLmRhdGEuc2xpY2UoNyk7CiAgICAgIGNvbnN0IGJ1ZmZlcjIgPSBiYXNlNjREZWNvZGUyKGJhc2U2NERhdGEpOwogICAgICByZXR1cm4gYnVmZmVyMjsKICAgIH0KICB9CiAgcmV0dXJuIHZhbHVlMjsKfSwgInJldml2ZXIiKTsKZnVuY3Rpb24gaXNFbmNvZGVkQnVmZmVyMih4MykgewogIHJldHVybiBpc09iamVjdDIoeDMpICYmIHgzLnR5cGUgPT09ICJFbmNvZGVkQnVmZmVyIiAmJiBpc1N0cmluZzIoeDMuZGF0YSk7Cn0KX19uYW1lKGlzRW5jb2RlZEJ1ZmZlcjIsICJpc0VuY29kZWRCdWZmZXIiKTsKZnVuY3Rpb24gaXNCdWZmZXJMaWtlMyh4MykgewogIHJldHVybiBpc09iamVjdDIoeDMpICYmICh4My50eXBlID09PSAiQnVmZmVyIiAmJiAoaXNBcnJheTQoeDMuZGF0YSkgfHwgaXNTdHJpbmcyKHgzLmRhdGEpKSkgfHwgeDMgaW5zdGFuY2VvZiBVaW50OEFycmF5Owp9Cl9fbmFtZShpc0J1ZmZlckxpa2UzLCAiaXNCdWZmZXJMaWtlIik7CmZ1bmN0aW9uIGlzQXJyYXk0KHgzKSB7CiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoeDMpOwp9Cl9fbmFtZShpc0FycmF5NCwgImlzQXJyYXkiKTsKZnVuY3Rpb24gaXNTdHJpbmcyKHgzKSB7CiAgcmV0dXJuIHR5cGVvZiB4MyA9PT0gInN0cmluZyI7Cn0KX19uYW1lKGlzU3RyaW5nMiwgImlzU3RyaW5nIik7CmZ1bmN0aW9uIGlzT2JqZWN0Mih4MykgewogIHJldHVybiB0eXBlb2YgeDMgPT09ICJvYmplY3QiICYmIHgzICE9PSBudWxsOwp9Cl9fbmFtZShpc09iamVjdDIsICJpc09iamVjdCIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0anNvbkA1LjIuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRqc29uL2Rpc3RfdHMvaW5kZXguanMKdmFyIHBhcnNlOCA9IHBhcnNlNzsKdmFyIHBhcnNlSnNvbkwyID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoanNvbmxEYXRhKSA9PiB7CiAgY29uc3QgbGluZXMgPSBqc29ubERhdGEuc3BsaXQoIlxuIik7CiAgY29uc3QgcGFyc2VkRGF0YSA9IGxpbmVzLnJlZHVjZSgoYWNjLCBsaW5lKSA9PiB7CiAgICBjb25zdCB0cmltbWVkID0gbGluZS50cmltKCk7CiAgICBpZiAodHJpbW1lZC5sZW5ndGggPiAwKSB7CiAgICAgIGFjYy5wdXNoKHBhcnNlOCh0cmltbWVkKSk7CiAgICB9CiAgICByZXR1cm4gYWNjOwogIH0sIFtdKTsKICByZXR1cm4gcGFyc2VkRGF0YTsKfSwgInBhcnNlSnNvbkwiKTsKdmFyIHN0cmluZ2lmeUpzb25MMiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGl0ZW1zKSA9PiB7CiAgcmV0dXJuIGl0ZW1zLm1hcCgoaXRlbSkgPT4gc3RyaW5naWZ5NihpdGVtKSkuam9pbigiXG4iKTsKfSwgInN0cmluZ2lmeUpzb25MIik7CnZhciBzdGFibGVPbmVXYXlTdHJpbmdpZnkyID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgob2JqQXJnLCBzaW1wbGVPcmRlckFycmF5LCBvcHRpb25zQXJnID0ge30pID0+IHsKICBjb25zdCB2aXNpdGVkID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrU2V0KCk7CiAgY29uc3Qgc2FuaXRpemUyID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgodmFsKSA9PiB7CiAgICBpZiAodmFsID09PSBudWxsIHx8IHR5cGVvZiB2YWwgIT09ICJvYmplY3QiKSB7CiAgICAgIHJldHVybiB2YWw7CiAgICB9CiAgICBjb25zdCByZXBsYWNlZCA9IHJlcGxhY2VyMigiIiwgdmFsKTsKICAgIGlmIChyZXBsYWNlZCAmJiByZXBsYWNlZC50eXBlID09PSAiRW5jb2RlZEJ1ZmZlciIgJiYgdHlwZW9mIHJlcGxhY2VkLmRhdGEgPT09ICJzdHJpbmciKSB7CiAgICAgIHJldHVybiByZXBsYWNlZDsKICAgIH0KICAgIGlmICh2aXNpdGVkLmhhcyh2YWwpKSB7CiAgICAgIHJldHVybiAiX19jeWNsZV9fIjsKICAgIH0KICAgIHZpc2l0ZWQuYWRkKHZhbCk7CiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7CiAgICAgIHJldHVybiB2YWwubWFwKChpdGVtKSA9PiBzYW5pdGl6ZTIoaXRlbSkpOwogICAgfQogICAgY29uc3Qgb3V0ID0ge307CiAgICBmb3IgKGNvbnN0IGtleTIgb2YgT2JqZWN0LmtleXModmFsKSkgewogICAgICB0cnkgewogICAgICAgIG91dFtrZXkyXSA9IHNhbml0aXplMih2YWxba2V5Ml0pOwogICAgICB9IGNhdGNoIChlMTApIHsKICAgICAgICBvdXRba2V5Ml0gPSAiX191bnNlcmlhbGl6YWJsZV9fIjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG91dDsKICB9LCAic2FuaXRpemUiKTsKICBjb25zdCBvYmogPSBzYW5pdGl6ZTIob2JqQXJnKTsKICBjb25zdCBvcHRpb25zID0gewogICAgLi4ub3B0aW9uc0FyZywKICAgIGN5Y2xlczogdHJ1ZQogIH07CiAgaWYgKHNpbXBsZU9yZGVyQXJyYXkgJiYgIW9wdGlvbnMuY21wKSB7CiAgICBjb25zdCBvcmRlcjIgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgc2ltcGxlT3JkZXJBcnJheS5mb3JFYWNoKChrZXkyLCBpZHgpID0+IG9yZGVyMi5zZXQoa2V5MiwgaWR4KSk7CiAgICBvcHRpb25zLmNtcCA9IChhNCwgYjQpID0+IHsKICAgICAgY29uc3QgYUlkeCA9IG9yZGVyMi5oYXMoYTQua2V5KSA/IG9yZGVyMi5nZXQoYTQua2V5KSA6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTsKICAgICAgY29uc3QgYklkeCA9IG9yZGVyMi5oYXMoYjQua2V5KSA/IG9yZGVyMi5nZXQoYjQua2V5KSA6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTsKICAgICAgaWYgKGFJZHggIT09IGJJZHgpCiAgICAgICAgcmV0dXJuIGFJZHggLSBiSWR4OwogICAgICByZXR1cm4gYTQua2V5IDwgYjQua2V5ID8gLTEgOiBhNC5rZXkgPiBiNC5rZXkgPyAxIDogMDsKICAgIH07CiAgfQogIHJldHVybiBzdGFibGVKc29uMyhvYmosIG9wdGlvbnMpOwp9LCAic3RhYmxlT25lV2F5U3RyaW5naWZ5Iik7CnZhciBzdHJpbmdpZnk2ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgob2JqQXJnLCBzaW1wbGVPcmRlckFycmF5LCBvcHRpb25zQXJnID0ge30pID0+IHsKICBjb25zdCBidWZmZXJlZEpzb24gPSBzdHJpbmdpZnk1KG9iakFyZyk7CiAgb2JqQXJnID0gSlNPTi5wYXJzZShidWZmZXJlZEpzb24pOwogIGxldCBvcHRpb25zID0geyAuLi5vcHRpb25zQXJnIH07CiAgaWYgKHNpbXBsZU9yZGVyQXJyYXkgJiYgIW9wdGlvbnMuY21wKSB7CiAgICBjb25zdCBvcmRlcjIgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgc2ltcGxlT3JkZXJBcnJheS5mb3JFYWNoKChrZXkyLCBpZHgpID0+IG9yZGVyMi5zZXQoa2V5MiwgaWR4KSk7CiAgICBvcHRpb25zLmNtcCA9IChhNCwgYjQpID0+IHsKICAgICAgY29uc3QgYUlkeCA9IG9yZGVyMi5oYXMoYTQua2V5KSA/IG9yZGVyMi5nZXQoYTQua2V5KSA6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTsKICAgICAgY29uc3QgYklkeCA9IG9yZGVyMi5oYXMoYjQua2V5KSA/IG9yZGVyMi5nZXQoYjQua2V5KSA6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTsKICAgICAgaWYgKGFJZHggIT09IGJJZHgpCiAgICAgICAgcmV0dXJuIGFJZHggLSBiSWR4OwogICAgICByZXR1cm4gYTQua2V5IDwgYjQua2V5ID8gLTEgOiBhNC5rZXkgPiBiNC5rZXkgPyAxIDogMDsKICAgIH07CiAgfQogIGxldCByZXR1cm5Kc29uID0gc3RhYmxlSnNvbjMob2JqQXJnLCBvcHRpb25zKTsKICByZXR1cm4gcmV0dXJuSnNvbjsKfSwgInN0cmluZ2lmeSIpOwp2YXIgc3RyaW5naWZ5UHJldHR5MiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKG9iamVjdEFyZykgPT4gewogIGNvbnN0IHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5NihvYmplY3RBcmcpOwogIGNvbnN0IG9iamVjdCA9IEpTT04ucGFyc2Uoc3RyaW5naWZpZWQpOwogIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmplY3QsIG51bGwsIDIpOwp9LCAic3RyaW5naWZ5UHJldHR5Iik7CnZhciBzdHJpbmdpZnlCYXNlNjQyID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoLi4uYXJncykgPT4gewogIGNvbnN0IHN0cmluZ2lmaWVkUmVzdWx0ID0gc3RyaW5naWZ5NiguLi5hcmdzKTsKICByZXR1cm4gZGlzdF90c19leHBvcnRzMTEuYmFzZTY0LmVuY29kZVVyaShzdHJpbmdpZmllZFJlc3VsdCk7Cn0sICJzdHJpbmdpZnlCYXNlNjQiKTsKdmFyIHBhcnNlQmFzZTY0MiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGJhc2U2NEpzb25TdHJpbmdBcmcpID0+IHsKICBjb25zdCBiYXNlNjQyID0gZGlzdF90c19leHBvcnRzMTEuYmFzZTY0OwogIGNvbnN0IGRlY29kZUZuID0gYmFzZTY0Mi5kZWNvZGVVcmkgfHwgYmFzZTY0Mi5kZWNvZGU7CiAgY29uc3Qgc2ltcGxlU3RyaW5naWZpZWQgPSBkZWNvZGVGbihiYXNlNjRKc29uU3RyaW5nQXJnKTsKICByZXR1cm4gcGFyc2U4KHNpbXBsZVN0cmluZ2lmaWVkKTsKfSwgInBhcnNlQmFzZTY0Iik7CnZhciBTbWFydGpzb24yID0gY2xhc3MgX1NtYXJ0anNvbiB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiU21hcnRqc29uIik7CiAgfQogIC8qKgogICAqIGVuZm9sZHMgZGF0YSBmcm9tIGFuIG9iamVjdAogICAqLwogIHN0YXRpYyBlbmZvbGRGcm9tT2JqZWN0KG9iamVjdEFyZykgewogICAgY29uc3QgbmV3SW5zdGFuY2UgPSBuZXcgdGhpcygpOwogICAgY29uc3Qgc2F2ZWFibGVzID0gbmV3SW5zdGFuY2Uuc2F2ZWFibGVQcm9wZXJ0aWVzIHx8IFtdOwogICAgZm9yIChjb25zdCBrZXlOYW1lIGluIG9iamVjdEFyZykgewogICAgICBpZiAoc2F2ZWFibGVzLmluZGV4T2Yoa2V5TmFtZSkgIT09IC0xKSB7CiAgICAgICAgbmV3SW5zdGFuY2Vba2V5TmFtZV0gPSBvYmplY3RBcmdba2V5TmFtZV07CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXdJbnN0YW5jZTsKICB9CiAgLyoqCiAgICogZW5mb2xkIGZyb20ganNvbgogICAqLwogIHN0YXRpYyBlbmZvbGRGcm9tSnNvbihqc29uQXJnKSB7CiAgICBjb25zdCBvYmplY3RGcm9tSnNvbiA9IHBhcnNlOChqc29uQXJnKTsKICAgIHJldHVybiB0aGlzLmVuZm9sZEZyb21PYmplY3Qob2JqZWN0RnJvbUpzb24pOwogIH0KICAvKioKICAgKiBmb2xkcyBhIGNsYXNzIGludG8gYW4gb2JqZWN0CiAgICovCiAgZm9sZFRvT2JqZWN0KCkgewogICAgY29uc3QgdHJhY2tTZXQgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpOwogICAgdHJhY2tTZXQuYWRkKHRoaXMpOwogICAgcmV0dXJuIHRoaXMuZm9sZFRvT2JqZWN0SW50ZXJuYWwodHJhY2tTZXQpOwogIH0KICBmb2xkVG9PYmplY3RJbnRlcm5hbCh0cmFja1NldCkgewogICAgY29uc3QgcmVzdWx0ID0ge307CiAgICBjb25zdCBmb2xkVmFsdWUgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh2YWwpID0+IHsKICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIF9TbWFydGpzb24pIHsKICAgICAgICBpZiAodHJhY2tTZXQuaGFzKHZhbCkpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiY3ljbGUgZGV0ZWN0ZWQiKTsKICAgICAgICB9CiAgICAgICAgdHJhY2tTZXQuYWRkKHZhbCk7CiAgICAgICAgcmV0dXJuIHZhbC5mb2xkVG9PYmplY3RJbnRlcm5hbCh0cmFja1NldCk7CiAgICAgIH0KICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkgewogICAgICAgIHJldHVybiB2YWwubWFwKChpdGVtKSA9PiBmb2xkVmFsdWUoaXRlbSkpOwogICAgICB9CiAgICAgIHJldHVybiBpbXBvcnRfbG9kYXNoMi5kZWZhdWx0KHZhbCk7CiAgICB9LCAiZm9sZFZhbHVlIik7CiAgICBjb25zdCBwcm9wcyA9IHRoaXMuc2F2ZWFibGVQcm9wZXJ0aWVzIHx8IFtdOwogICAgZm9yIChjb25zdCBrZXlOYW1lIG9mIHByb3BzKSB7CiAgICAgIGNvbnN0IHZhbHVlMiA9IHRoaXNba2V5TmFtZV07CiAgICAgIHJlc3VsdFtrZXlOYW1lXSA9IGZvbGRWYWx1ZSh2YWx1ZTIpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CiAgLyoqCiAgICogZm9sZHMgYSBjbGFzcyBpbnRvIGFuIG9iamVjdAogICAqLwogIGZvbGRUb0pzb24oKSB7CiAgICBjb25zdCBmb2xkZWRPYmplY3QgPSB0aGlzLmZvbGRUb09iamVjdCgpOwogICAgcmV0dXJuIHN0cmluZ2lmeTYoZm9sZGVkT2JqZWN0KTsKICB9Cn07CnZhciBmb2xkRGVjMiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKCkgPT4gewogIHJldHVybiAodGFyZ2V0LCBrZXkyKSA9PiB7CiAgICBpZiAoIXRhcmdldC5zYXZlYWJsZVByb3BlcnRpZXMpIHsKICAgICAgdGFyZ2V0LnNhdmVhYmxlUHJvcGVydGllcyA9IFtdOwogICAgfQogICAgdGFyZ2V0LnNhdmVhYmxlUHJvcGVydGllcy5wdXNoKGtleTIpOwogIH07Cn0sICJmb2xkRGVjIik7CnZhciBkZWVwRXF1YWxPYmplY3RzMiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKG9iamVjdDEsIG9iamVjdDIpID0+IHsKICBjb25zdCBvYmplY3QxU3RyaW5nID0gc3RyaW5naWZ5NihvYmplY3QxKTsKICBjb25zdCBvYmplY3QyU3RyaW5nID0gc3RyaW5naWZ5NihvYmplY3QyKTsKICByZXR1cm4gb2JqZWN0MVN0cmluZyA9PT0gb2JqZWN0MlN0cmluZzsKfSwgImRlZXBFcXVhbE9iamVjdHMiKTsKdmFyIGRlZXBFcXVhbEpzb25MU3RyaW5nczIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChqc29uTFN0cmluZzEsIGpzb25MU3RyaW5nMikgPT4gewogIGNvbnN0IGZpcnN0QXJyYXkgPSBwYXJzZUpzb25MMihqc29uTFN0cmluZzEpOwogIGNvbnN0IHNlY29uZEFycmF5ID0gcGFyc2VKc29uTDIoanNvbkxTdHJpbmcyKTsKICByZXR1cm4gZGVlcEVxdWFsT2JqZWN0czIoZmlyc3RBcnJheSwgc2Vjb25kQXJyYXkpOwp9LCAiZGVlcEVxdWFsSnNvbkxTdHJpbmdzIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRoYXNoQDMuMi42L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGhhc2gvZGlzdF90c193ZWIvc2hhMjU2LmZhbGxiYWNrLmpzCnZhciBLID0gWwogIDExMTYzNTI0MDgsCiAgMTg5OTQ0NzQ0MSwKICAzMDQ5MzIzNDcxLAogIDM5MjEwMDk1NzMsCiAgOTYxOTg3MTYzLAogIDE1MDg5NzA5OTMsCiAgMjQ1MzYzNTc0OCwKICAyODcwNzYzMjIxLAogIDM2MjQzODEwODAsCiAgMzEwNTk4NDAxLAogIDYwNzIyNTI3OCwKICAxNDI2ODgxOTg3LAogIDE5MjUwNzgzODgsCiAgMjE2MjA3ODIwNiwKICAyNjE0ODg4MTAzLAogIDMyNDgyMjI1ODAsCiAgMzgzNTM5MDQwMSwKICA0MDIyMjI0Nzc0LAogIDI2NDM0NzA3OCwKICA2MDQ4MDc2MjgsCiAgNzcwMjU1OTgzLAogIDEyNDkxNTAxMjIsCiAgMTU1NTA4MTY5MiwKICAxOTk2MDY0OTg2LAogIDI1NTQyMjA4ODIsCiAgMjgyMTgzNDM0OSwKICAyOTUyOTk2ODA4LAogIDMyMTAzMTM2NzEsCiAgMzMzNjU3MTg5MSwKICAzNTg0NTI4NzExLAogIDExMzkyNjk5MywKICAzMzgyNDE4OTUsCiAgNjY2MzA3MjA1LAogIDc3MzUyOTkxMiwKICAxMjk0NzU3MzcyLAogIDEzOTYxODIyOTEsCiAgMTY5NTE4MzcwMCwKICAxOTg2NjYxMDUxLAogIDIxNzcwMjYzNTAsCiAgMjQ1Njk1NjAzNywKICAyNzMwNDg1OTIxLAogIDI4MjAzMDI0MTEsCiAgMzI1OTczMDgwMCwKICAzMzQ1NzY0NzcxLAogIDM1MTYwNjU4MTcsCiAgMzYwMDM1MjgwNCwKICA0MDk0NTcxOTA5LAogIDI3NTQyMzM0NCwKICA0MzAyMjc3MzQsCiAgNTA2OTQ4NjE2LAogIDY1OTA2MDU1NiwKICA4ODM5OTc4NzcsCiAgOTU4MTM5NTcxLAogIDEzMjI4MjIyMTgsCiAgMTUzNzAwMjA2MywKICAxNzQ3ODczNzc5LAogIDE5NTU1NjIyMjIsCiAgMjAyNDEwNDgxNSwKICAyMjI3NzMwNDUyLAogIDIzNjE4NTI0MjQsCiAgMjQyODQzNjQ3NCwKICAyNzU2NzM0MTg3LAogIDMyMDQwMzE0NzksCiAgMzMyOTMyNTI5OApdOwp2YXIgSDIgPSBbCiAgMTc3OTAzMzcwMywKICAzMTQ0MTM0Mjc3LAogIDEwMTM5MDQyNDIsCiAgMjc3MzQ4MDc2MiwKICAxMzU5ODkzMTE5LAogIDI2MDA4MjI5MjQsCiAgNTI4NzM0NjM1LAogIDE1NDE0NTkyMjUKXTsKZnVuY3Rpb24gcm90cihuMTEsIGI0KSB7CiAgcmV0dXJuIG4xMSA+Pj4gYjQgfCBuMTEgPDwgMzIgLSBiNDsKfQpfX25hbWUocm90ciwgInJvdHIiKTsKZnVuY3Rpb24gc2hhMjU2VHJhbnNmb3JtKFcyLCBIMykgewogIGxldCBhNCA9IEgzWzBdOwogIGxldCBiNCA9IEgzWzFdOwogIGxldCBjMTAgPSBIM1syXTsKICBsZXQgZDQgPSBIM1szXTsKICBsZXQgZTEwID0gSDNbNF07CiAgbGV0IGY2ID0gSDNbNV07CiAgbGV0IGczID0gSDNbNl07CiAgbGV0IGg3ID0gSDNbN107CiAgZm9yIChsZXQgajMgPSAwOyBqMyA8IDY0OyBqMysrKSB7CiAgICBpZiAoajMgPj0gMTYpIHsKICAgICAgY29uc3QgczAgPSByb3RyKFcyW2ozIC0gMTVdLCA3KSBeIHJvdHIoVzJbajMgLSAxNV0sIDE4KSBeIFcyW2ozIC0gMTVdID4+PiAzOwogICAgICBjb25zdCBzMSA9IHJvdHIoVzJbajMgLSAyXSwgMTcpIF4gcm90cihXMltqMyAtIDJdLCAxOSkgXiBXMltqMyAtIDJdID4+PiAxMDsKICAgICAgVzJbajNdID0gVzJbajMgLSAxNl0gKyBzMCArIFcyW2ozIC0gN10gKyBzMSA+Pj4gMDsKICAgIH0KICAgIGNvbnN0IFMxID0gcm90cihlMTAsIDYpIF4gcm90cihlMTAsIDExKSBeIHJvdHIoZTEwLCAyNSk7CiAgICBjb25zdCBjaCA9IGUxMCAmIGY2IF4gfmUxMCAmIGczOwogICAgY29uc3QgdGVtcDEgPSBoNyArIFMxICsgY2ggKyBLW2ozXSArIFcyW2ozXSA+Pj4gMDsKICAgIGNvbnN0IFMwID0gcm90cihhNCwgMikgXiByb3RyKGE0LCAxMykgXiByb3RyKGE0LCAyMik7CiAgICBjb25zdCBtYWogPSBhNCAmIGI0IF4gYTQgJiBjMTAgXiBiNCAmIGMxMDsKICAgIGNvbnN0IHRlbXAyID0gUzAgKyBtYWogPj4+IDA7CiAgICBoNyA9IGczOwogICAgZzMgPSBmNjsKICAgIGY2ID0gZTEwOwogICAgZTEwID0gZDQgKyB0ZW1wMSA+Pj4gMDsKICAgIGQ0ID0gYzEwOwogICAgYzEwID0gYjQ7CiAgICBiNCA9IGE0OwogICAgYTQgPSB0ZW1wMSArIHRlbXAyID4+PiAwOwogIH0KICBIM1swXSA9IEgzWzBdICsgYTQgPj4+IDA7CiAgSDNbMV0gPSBIM1sxXSArIGI0ID4+PiAwOwogIEgzWzJdID0gSDNbMl0gKyBjMTAgPj4+IDA7CiAgSDNbM10gPSBIM1szXSArIGQ0ID4+PiAwOwogIEgzWzRdID0gSDNbNF0gKyBlMTAgPj4+IDA7CiAgSDNbNV0gPSBIM1s1XSArIGY2ID4+PiAwOwogIEgzWzZdID0gSDNbNl0gKyBnMyA+Pj4gMDsKICBIM1s3XSA9IEgzWzddICsgaDcgPj4+IDA7Cn0KX19uYW1lKHNoYTI1NlRyYW5zZm9ybSwgInNoYTI1NlRyYW5zZm9ybSIpOwpmdW5jdGlvbiBzaGEyNTZGYWxsYmFjayhieXRlcykgewogIGNvbnN0IEhfY29weSA9IFsuLi5IMl07CiAgY29uc3QgbXNnTGVuID0gYnl0ZXMubGVuZ3RoOwogIGNvbnN0IG1zZ0JpdExlbiA9IG1zZ0xlbiAqIDg7CiAgY29uc3QgcGFkTGVuID0gbXNnTGVuICUgNjQgPCA1NiA/IDU2IC0gbXNnTGVuICUgNjQgOiAxMjAgLSBtc2dMZW4gJSA2NDsKICBjb25zdCBwYWRkZWQgPSBuZXcgVWludDhBcnJheShtc2dMZW4gKyBwYWRMZW4gKyA4KTsKICBwYWRkZWQuc2V0KGJ5dGVzKTsKICBwYWRkZWRbbXNnTGVuXSA9IDEyODsKICBjb25zdCBkYXRhVmlldyA9IG5ldyBEYXRhVmlldyhwYWRkZWQuYnVmZmVyKTsKICBkYXRhVmlldy5zZXRVaW50MzIocGFkZGVkLmxlbmd0aCAtIDgsIDAsIGZhbHNlKTsKICBkYXRhVmlldy5zZXRVaW50MzIocGFkZGVkLmxlbmd0aCAtIDQsIG1zZ0JpdExlbiA+Pj4gMCwgZmFsc2UpOwogIGZvciAobGV0IG9mZnNldCA9IDA7IG9mZnNldCA8IHBhZGRlZC5sZW5ndGg7IG9mZnNldCArPSA2NCkgewogICAgY29uc3QgVzIgPSBuZXcgQXJyYXkoNjQpOwogICAgZm9yIChsZXQgaTEwID0gMDsgaTEwIDwgMTY7IGkxMCsrKSB7CiAgICAgIFcyW2kxMF0gPSBkYXRhVmlldy5nZXRVaW50MzIob2Zmc2V0ICsgaTEwICogNCwgZmFsc2UpOwogICAgfQogICAgc2hhMjU2VHJhbnNmb3JtKFcyLCBIX2NvcHkpOwogIH0KICBsZXQgaGV4MiA9ICIiOwogIGZvciAobGV0IGkxMCA9IDA7IGkxMCA8IDg7IGkxMCsrKSB7CiAgICBoZXgyICs9IEhfY29weVtpMTBdLnRvU3RyaW5nKDE2KS5wYWRTdGFydCg4LCAiMCIpOwogIH0KICByZXR1cm4gaGV4MjsKfQpfX25hbWUoc2hhMjU2RmFsbGJhY2ssICJzaGEyNTZGYWxsYmFjayIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0aGFzaEAzLjIuNi9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRoYXNoL2Rpc3RfdHNfd2ViL2luZGV4LmpzCnZhciBoZXggPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChidWZmZXIyKSA9PiB7CiAgY29uc3QgaGV4Q29kZXMgPSBbXTsKICBjb25zdCB2aWV3ID0gbmV3IERhdGFWaWV3KGJ1ZmZlcjIpOwogIGZvciAobGV0IGkxMCA9IDA7IGkxMCA8IHZpZXcuYnl0ZUxlbmd0aDsgaTEwICs9IDQpIHsKICAgIGNvbnN0IHZhbHVlMiA9IHZpZXcuZ2V0VWludDMyKGkxMCk7CiAgICBjb25zdCBzdHJpbmdWYWx1ZSA9IHZhbHVlMi50b1N0cmluZygxNik7CiAgICBjb25zdCBwYWRkaW5nID0gIjAwMDAwMDAwIjsKICAgIGNvbnN0IHBhZGRlZFZhbHVlID0gKHBhZGRpbmcgKyBzdHJpbmdWYWx1ZSkuc2xpY2UoLXBhZGRpbmcubGVuZ3RoKTsKICAgIGhleENvZGVzLnB1c2gocGFkZGVkVmFsdWUpOwogIH0KICByZXR1cm4gaGV4Q29kZXMuam9pbigiIik7Cn0sICJoZXgiKTsKdmFyIGlzQ3J5cHRvU3VidGxlQXZhaWxhYmxlID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoKSA9PiB7CiAgcmV0dXJuIHR5cGVvZiBjcnlwdG8gIT09ICJ1bmRlZmluZWQiICYmIGNyeXB0by5zdWJ0bGUgIT09IHZvaWQgMDsKfSwgImlzQ3J5cHRvU3VidGxlQXZhaWxhYmxlIik7CnZhciBzaGEyNTZGcm9tU3RyaW5nID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShhc3luYyAoc3RyaW5nQXJnKSA9PiB7CiAgY29uc3QgYnVmZmVyMiA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShzdHJpbmdBcmcpOwogIGlmIChpc0NyeXB0b1N1YnRsZUF2YWlsYWJsZSgpKSB7CiAgICBjb25zdCBoYXNoID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5kaWdlc3QoIlNIQS0yNTYiLCBidWZmZXIyKTsKICAgIGNvbnN0IHJlc3VsdCA9IGhleChoYXNoKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfSBlbHNlIHsKICAgIHJldHVybiBzaGEyNTZGYWxsYmFjayhidWZmZXIyKTsKICB9Cn0sICJzaGEyNTZGcm9tU3RyaW5nIik7CnZhciBzaGEyNTZGcm9tU3RyaW5nU3luYyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHN0cmluZ0FyZykgPT4gewogIGNvbnNvbGUud2Fybigic2hhMjU2RnJvbVN0cmluZ1N5bmMgaXMgbm90IHRydWx5IHN5bmNocm9ub3VzIGluIGJyb3dzZXIgZW52aXJvbm1lbnQiKTsKICB0aHJvdyBuZXcgRXJyb3IoInNoYTI1NkZyb21TdHJpbmdTeW5jIGlzIG5vdCBzdXBwb3J0ZWQgaW4gYnJvd3NlciBlbnZpcm9ubWVudC4gVXNlIHNoYTI1NkZyb21TdHJpbmcgaW5zdGVhZC4iKTsKfSwgInNoYTI1NkZyb21TdHJpbmdTeW5jIik7CnZhciBzaGEyNTZGcm9tQnVmZmVyID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShhc3luYyAoYnVmZmVyQXJnKSA9PiB7CiAgaWYgKGlzQ3J5cHRvU3VidGxlQXZhaWxhYmxlKCkpIHsKICAgIGxldCBpbnB1dEJ1ZmZlcjsKICAgIGlmIChidWZmZXJBcmcgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7CiAgICAgIGNvbnN0IHZpZXcgPSBidWZmZXJBcmc7CiAgICAgIGlucHV0QnVmZmVyID0gdmlldy5idWZmZXIuc2xpY2Uodmlldy5ieXRlT2Zmc2V0LCB2aWV3LmJ5dGVPZmZzZXQgKyB2aWV3LmJ5dGVMZW5ndGgpOwogICAgfSBlbHNlIHsKICAgICAgaW5wdXRCdWZmZXIgPSBidWZmZXJBcmc7CiAgICB9CiAgICBjb25zdCBoYXNoID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5kaWdlc3QoIlNIQS0yNTYiLCBpbnB1dEJ1ZmZlcik7CiAgICBjb25zdCByZXN1bHQgPSBoZXgoaGFzaCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0gZWxzZSB7CiAgICBjb25zdCB1aW50OEFycmF5ID0gYnVmZmVyQXJnIGluc3RhbmNlb2YgVWludDhBcnJheSA/IGJ1ZmZlckFyZyA6IG5ldyBVaW50OEFycmF5KGJ1ZmZlckFyZyk7CiAgICByZXR1cm4gc2hhMjU2RmFsbGJhY2sodWludDhBcnJheSk7CiAgfQp9LCAic2hhMjU2RnJvbUJ1ZmZlciIpOwp2YXIgc2hhMjY1RnJvbU9iamVjdCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoYXN5bmMgKG9iamVjdEFyZykgPT4gewogIGNvbnN0IHN0cmluZ2lmaWVkT2JqZWN0ID0gZGlzdF90c19leHBvcnRzMjAuc3RyaW5naWZ5KG9iamVjdEFyZyk7CiAgY29uc3QgaGFzaFJlc3VsdCA9IGF3YWl0IHNoYTI1NkZyb21TdHJpbmcoc3RyaW5naWZpZWRPYmplY3QpOwogIHJldHVybiBoYXNoUmVzdWx0Owp9LCAic2hhMjY1RnJvbU9iamVjdCIpOwp2YXIgc2hhMjU2RnJvbVN0cmVhbSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGlucHV0KSA9PiB7CiAgdGhyb3cgbmV3IEVycm9yKCJzaGEyNTZGcm9tU3RyZWFtIGlzIG5vdCBzdXBwb3J0ZWQgaW4gYnJvd3NlciBlbnZpcm9ubWVudCIpOwp9LCAic2hhMjU2RnJvbVN0cmVhbSIpOwp2YXIgc2hhMjU2RnJvbUZpbGUgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGFzeW5jIChmaWxlUGF0aCkgPT4gewogIHRocm93IG5ldyBFcnJvcigic2hhMjU2RnJvbUZpbGUgaXMgbm90IHN1cHBvcnRlZCBpbiBicm93c2VyIGVudmlyb25tZW50Iik7Cn0sICJzaGEyNTZGcm9tRmlsZSIpOwp2YXIgbWQ1RnJvbVN0cmluZyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoYXN5bmMgKHN0cmluZ1RvSGFzaCkgPT4gewogIHRocm93IG5ldyBFcnJvcigibWQ1RnJvbVN0cmluZyBpcyBub3Qgc3VwcG9ydGVkIGluIGJyb3dzZXIgZW52aXJvbm1lbnQuIFdlYiBDcnlwdG8gQVBJIGRvZXMgbm90IHN1cHBvcnQgTUQ1LiIpOwp9LCAibWQ1RnJvbVN0cmluZyIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0c3RhdGVAMi4yLjEvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0c3RhdGUvZGlzdF90cy9zbWFydHN0YXRlLmNsYXNzZXMuc3RhdGVhY3Rpb24uanMKdmFyIFN0YXRlQWN0aW9uID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlN0YXRlQWN0aW9uIik7CiAgfQogIGNvbnN0cnVjdG9yKHN0YXRlUGFydFJlZiwgYWN0aW9uRGVmKSB7CiAgICB0aGlzLnN0YXRlUGFydFJlZiA9IHN0YXRlUGFydFJlZjsKICAgIHRoaXMuYWN0aW9uRGVmID0gYWN0aW9uRGVmOwogIH0KICB0cmlnZ2VyKHBheWxvYWQpIHsKICAgIHJldHVybiB0aGlzLnN0YXRlUGFydFJlZi5kaXNwYXRjaEFjdGlvbih0aGlzLCBwYXlsb2FkKTsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRzdGF0ZUAyLjIuMS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRzdGF0ZS9kaXN0X3RzL3NtYXJ0c3RhdGUuY2xhc3Nlcy5zdGF0ZXBhcnQuanMKZnVuY3Rpb24gZnJvbUFib3J0U2lnbmFsKHNpZ25hbCkgewogIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgoc3Vic2NyaWJlcikgPT4gewogICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7CiAgICAgIHN1YnNjcmliZXIubmV4dCgpOwogICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGhhbmRsZXIyID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoKSA9PiB7CiAgICAgIHN1YnNjcmliZXIubmV4dCgpOwogICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICB9LCAiaGFuZGxlciIpOwogICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IiwgaGFuZGxlcjIpOwogICAgcmV0dXJuICgpID0+IHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsIGhhbmRsZXIyKTsKICB9KTsKfQpfX25hbWUoZnJvbUFib3J0U2lnbmFsLCAiZnJvbUFib3J0U2lnbmFsIik7CnZhciBTdGF0ZVBhcnQgPSBjbGFzcyBfU3RhdGVQYXJ0IHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJTdGF0ZVBhcnQiKTsKICB9CiAgc3RhdGljIHsKICAgIHRoaXMuTUFYX05FU1RFRF9ESVNQQVRDSF9ERVBUSCA9IDEwOwogIH0KICBjb25zdHJ1Y3RvcihuYW1lQXJnLCB3ZWJTdG9yZU9wdGlvbnNBcmcpIHsKICAgIHRoaXMuc3RhdGUgPSBuZXcgZGlzdF90c19leHBvcnRzMi5yeGpzLlN1YmplY3QoKTsKICAgIHRoaXMuY3VtdWxhdGl2ZURlZmVycmVkID0gZGlzdF90c19leHBvcnRzLmN1bXVsYXRpdmVEZWZlcigpOwogICAgdGhpcy5tdXRhdGlvblF1ZXVlID0gUHJvbWlzZS5yZXNvbHZlKCk7CiAgICB0aGlzLnBlbmRpbmdDdW11bGF0aXZlTm90aWZpY2F0aW9uID0gbnVsbDsKICAgIHRoaXMud2ViU3RvcmUgPSBudWxsOwogICAgdGhpcy5taWRkbGV3YXJlcyA9IFtdOwogICAgdGhpcy5zZWxlY3RvckNhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7CiAgICB0aGlzLmRlZmF1bHRTZWxlY3RPYnNlcnZhYmxlID0gbnVsbDsKICAgIHRoaXMubmFtZSA9IG5hbWVBcmc7CiAgICBpZiAod2ViU3RvcmVPcHRpb25zQXJnKSB7CiAgICAgIHRoaXMud2ViU3RvcmVPcHRpb25zID0gd2ViU3RvcmVPcHRpb25zQXJnOwogICAgfQogIH0KICAvKioKICAgKiBpbml0aWFsaXplcyB0aGUgd2Vic3RvcmUKICAgKi8KICBhc3luYyBpbml0KCkgewogICAgaWYgKHRoaXMud2ViU3RvcmVPcHRpb25zKSB7CiAgICAgIHRoaXMud2ViU3RvcmUgPSBuZXcgZGlzdF90c19leHBvcnRzMTMuV2ViU3RvcmUodGhpcy53ZWJTdG9yZU9wdGlvbnMpOwogICAgICBhd2FpdCB0aGlzLndlYlN0b3JlLmluaXQoKTsKICAgICAgY29uc3Qgc3RvcmVkU3RhdGUgPSBhd2FpdCB0aGlzLndlYlN0b3JlLmdldChTdHJpbmcodGhpcy5uYW1lKSk7CiAgICAgIGlmIChzdG9yZWRTdGF0ZSAmJiB0aGlzLnZhbGlkYXRlU3RhdGUoc3RvcmVkU3RhdGUpKSB7CiAgICAgICAgdGhpcy5zdGF0ZVN0b3JlID0gc3RvcmVkU3RhdGU7CiAgICAgICAgYXdhaXQgdGhpcy5ub3RpZnlDaGFuZ2UoKTsKICAgICAgfQogICAgfQogIH0KICAvKioKICAgKiBnZXRzIHRoZSBzdGF0ZSBmcm9tIHRoZSBzdGF0ZSBzdG9yZQogICAqLwogIGdldFN0YXRlKCkgewogICAgcmV0dXJuIHRoaXMuc3RhdGVTdG9yZTsKICB9CiAgLyoqCiAgICogYWRkcyBhIG1pZGRsZXdhcmUgdGhhdCBpbnRlcmNlcHRzIHNldFN0YXRlIGNhbGxzLgogICAqIG1pZGRsZXdhcmUgY2FuIHRyYW5zZm9ybSB0aGUgc3RhdGUgb3IgdGhyb3cgdG8gcmVqZWN0IGl0LgogICAqIHJldHVybnMgYSByZW1vdmFsIGZ1bmN0aW9uLgogICAqLwogIGFkZE1pZGRsZXdhcmUobWlkZGxld2FyZSkgewogICAgdGhpcy5taWRkbGV3YXJlcy5wdXNoKG1pZGRsZXdhcmUpOwogICAgcmV0dXJuICgpID0+IHsKICAgICAgY29uc3QgaWR4ID0gdGhpcy5taWRkbGV3YXJlcy5pbmRleE9mKG1pZGRsZXdhcmUpOwogICAgICBpZiAoaWR4ICE9PSAtMSkgewogICAgICAgIHRoaXMubWlkZGxld2FyZXMuc3BsaWNlKGlkeCwgMSk7CiAgICAgIH0KICAgIH07CiAgfQogIC8qKgogICAqIHNldHMgdGhlIHN0YXRlU3RvcmUgdG8gdGhlIG5ldyBzdGF0ZSAoc2VyaWFsaXplZCB2aWEgbXV0YXRpb24gcXVldWUpCiAgICovCiAgYXN5bmMgc2V0U3RhdGUobmV3U3RhdGVBcmcpIHsKICAgIHJldHVybiB0aGlzLm11dGF0aW9uUXVldWUgPSB0aGlzLm11dGF0aW9uUXVldWUudGhlbigoKSA9PiB0aGlzLmFwcGx5U3RhdGUobmV3U3RhdGVBcmcpLCAoKSA9PiB0aGlzLmFwcGx5U3RhdGUobmV3U3RhdGVBcmcpKTsKICB9CiAgLyoqCiAgICogYXBwbGllcyB0aGUgc3RhdGUgY2hhbmdlIChtaWRkbGV3YXJlIOKGkiB2YWxpZGF0ZSDihpIgcGVyc2lzdCDihpIgbm90aWZ5KQogICAqLwogIGFzeW5jIGFwcGx5U3RhdGUobmV3U3RhdGVBcmcpIHsKICAgIGxldCBwcm9jZXNzZWRTdGF0ZSA9IG5ld1N0YXRlQXJnOwogICAgZm9yIChjb25zdCBtdyBvZiB0aGlzLm1pZGRsZXdhcmVzKSB7CiAgICAgIHByb2Nlc3NlZFN0YXRlID0gYXdhaXQgbXcocHJvY2Vzc2VkU3RhdGUsIHRoaXMuc3RhdGVTdG9yZSk7CiAgICB9CiAgICBpZiAoIXRoaXMudmFsaWRhdGVTdGF0ZShwcm9jZXNzZWRTdGF0ZSkpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHN0YXRlIHN0cnVjdHVyZSBmb3Igc3RhdGUgcGFydCAnJHt0aGlzLm5hbWV9J2ApOwogICAgfQogICAgaWYgKHRoaXMud2ViU3RvcmUpIHsKICAgICAgYXdhaXQgdGhpcy53ZWJTdG9yZS5zZXQoU3RyaW5nKHRoaXMubmFtZSksIHByb2Nlc3NlZFN0YXRlKTsKICAgIH0KICAgIHRoaXMuc3RhdGVTdG9yZSA9IHByb2Nlc3NlZFN0YXRlOwogICAgYXdhaXQgdGhpcy5ub3RpZnlDaGFuZ2UoKTsKICAgIHJldHVybiB0aGlzLnN0YXRlU3RvcmU7CiAgfQogIC8qKgogICAqIFZhbGlkYXRlcyBzdGF0ZSBzdHJ1Y3R1cmUgLSBjYW4gYmUgb3ZlcnJpZGRlbiBmb3IgY3VzdG9tIHZhbGlkYXRpb24KICAgKi8KICB2YWxpZGF0ZVN0YXRlKHN0YXRlQXJnKSB7CiAgICByZXR1cm4gc3RhdGVBcmcgIT09IG51bGwgJiYgc3RhdGVBcmcgIT09IHZvaWQgMDsKICB9CiAgLyoqCiAgICogbm90aWZpZXMgb2YgYSBjaGFuZ2Ugb24gdGhlIHN0YXRlCiAgICovCiAgYXN5bmMgbm90aWZ5Q2hhbmdlKCkgewogICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLnN0YXRlU3RvcmU7CiAgICBpZiAoc25hcHNob3QgPT09IHZvaWQgMCkgewogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodGhpcy5zbWFydHN0YXRlUmVmPy5pc0JhdGNoaW5nKSB7CiAgICAgIHRoaXMuc21hcnRzdGF0ZVJlZi5yZWdpc3RlclBlbmRpbmdOb3RpZmljYXRpb24odGhpcyk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGNyZWF0ZVN0YXRlSGFzaCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoYXN5bmMgKHN0YXRlQXJnKSA9PiB7CiAgICAgIHJldHVybiBhd2FpdCBkaXN0X3RzX3dlYl9leHBvcnRzLnNoYTI1NkZyb21TdHJpbmcoZGlzdF90c19leHBvcnRzMTIuc3RhYmxlT25lV2F5U3RyaW5naWZ5KHN0YXRlQXJnKSk7CiAgICB9LCAiY3JlYXRlU3RhdGVIYXNoIik7CiAgICB0cnkgewogICAgICBjb25zdCBjdXJyZW50SGFzaCA9IGF3YWl0IGNyZWF0ZVN0YXRlSGFzaChzbmFwc2hvdCk7CiAgICAgIGlmICh0aGlzLmxhc3RTdGF0ZU5vdGlmaWNhdGlvblBheWxvYWRIYXNoICYmIGN1cnJlbnRIYXNoID09PSB0aGlzLmxhc3RTdGF0ZU5vdGlmaWNhdGlvblBheWxvYWRIYXNoKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMubGFzdFN0YXRlTm90aWZpY2F0aW9uUGF5bG9hZEhhc2ggPSBjdXJyZW50SGFzaDsKICAgIH0gY2F0Y2ggKGVycikgewogICAgICBjb25zb2xlLmVycm9yKGBTdGF0ZSBoYXNoIGNvbXB1dGF0aW9uIGZhaWxlZCBmb3IgJyR7dGhpcy5uYW1lfSc6YCwgZXJyKTsKICAgIH0KICAgIHRoaXMuc3RhdGUubmV4dChzbmFwc2hvdCk7CiAgfQogIC8qKgogICAqIGNyZWF0ZXMgYSBjdW11bGF0aXZlIG5vdGlmaWNhdGlvbiBieSBhZGRpbmcgYSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGNhbGwgc3RhY2sKICAgKi8KICBub3RpZnlDaGFuZ2VDdW11bGF0aXZlKCkgewogICAgaWYgKHRoaXMucGVuZGluZ0N1bXVsYXRpdmVOb3RpZmljYXRpb24pIHsKICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucGVuZGluZ0N1bXVsYXRpdmVOb3RpZmljYXRpb24pOwogICAgfQogICAgdGhpcy5wZW5kaW5nQ3VtdWxhdGl2ZU5vdGlmaWNhdGlvbiA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICB0aGlzLnBlbmRpbmdDdW11bGF0aXZlTm90aWZpY2F0aW9uID0gbnVsbDsKICAgICAgaWYgKHRoaXMuc3RhdGVTdG9yZSAhPT0gdm9pZCAwKSB7CiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2UoKS5jYXRjaCgoZXJyKSA9PiB7CiAgICAgICAgICBjb25zb2xlLmVycm9yKGBub3RpZnlDaGFuZ2VDdW11bGF0aXZlIGZhaWxlZCBmb3IgJyR7dGhpcy5uYW1lfSc6YCwgZXJyKTsKICAgICAgICB9KTsKICAgICAgfQogICAgfSwgMCk7CiAgfQogIC8qKgogICAqIHNlbGVjdHMgYSBzdGF0ZSBvciBhIHN1YnN0YXRlLgogICAqIHN1cHBvcnRzIGFuIG9wdGlvbmFsIEFib3J0U2lnbmFsIGZvciBhdXRvbWF0aWMgdW5zdWJzY3JpcHRpb24uCiAgICogbWVtb2l6ZXMgb2JzZXJ2YWJsZXMgYnkgc2VsZWN0b3IgZnVuY3Rpb24gcmVmZXJlbmNlLgogICAqLwogIHNlbGVjdChzZWxlY3RvckZuLCBvcHRpb25zKSB7CiAgICBjb25zdCBoYXNTaWduYWwgPSBvcHRpb25zPy5zaWduYWwgIT0gbnVsbDsKICAgIGlmICghaGFzU2lnbmFsKSB7CiAgICAgIGlmICghc2VsZWN0b3JGbikgewogICAgICAgIGlmICh0aGlzLmRlZmF1bHRTZWxlY3RPYnNlcnZhYmxlKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0U2VsZWN0T2JzZXJ2YWJsZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RvckNhY2hlLmhhcyhzZWxlY3RvckZuKSkgewogICAgICAgIHJldHVybiB0aGlzLnNlbGVjdG9yQ2FjaGUuZ2V0KHNlbGVjdG9yRm4pOwogICAgICB9CiAgICB9CiAgICBjb25zdCBlZmZlY3RpdmVTZWxlY3RvckZuID0gc2VsZWN0b3JGbiB8fCAoKHN0YXRlKSA9PiBzdGF0ZSk7CiAgICBsZXQgbWFwcGVkID0gdGhpcy5zdGF0ZS5waXBlKGRpc3RfdHNfZXhwb3J0czIucnhqcy5vcHMuc3RhcnRXaXRoKHRoaXMuZ2V0U3RhdGUoKSksIGRpc3RfdHNfZXhwb3J0czIucnhqcy5vcHMuZmlsdGVyKChzdGF0ZUFyZykgPT4gc3RhdGVBcmcgIT09IHZvaWQgMCksIGRpc3RfdHNfZXhwb3J0czIucnhqcy5vcHMubWFwKChzdGF0ZUFyZykgPT4gewogICAgICB0cnkgewogICAgICAgIHJldHVybiBlZmZlY3RpdmVTZWxlY3RvckZuKHN0YXRlQXJnKTsKICAgICAgfSBjYXRjaCAoZTEwKSB7CiAgICAgICAgY29uc29sZS5lcnJvcihgU2VsZWN0b3IgZXJyb3IgaW4gc3RhdGUgcGFydCAnJHt0aGlzLm5hbWV9JzpgLCBlMTApOwogICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgIH0KICAgIH0pKTsKICAgIGlmIChoYXNTaWduYWwpIHsKICAgICAgbWFwcGVkID0gbWFwcGVkLnBpcGUodGFrZVVudGlsKGZyb21BYm9ydFNpZ25hbChvcHRpb25zLnNpZ25hbCkpKTsKICAgICAgcmV0dXJuIG1hcHBlZDsKICAgIH0KICAgIGNvbnN0IHNoYXJlZCA9IG1hcHBlZC5waXBlKHNoYXJlUmVwbGF5KHsgYnVmZmVyU2l6ZTogMSwgcmVmQ291bnQ6IHRydWUgfSkpOwogICAgaWYgKCFzZWxlY3RvckZuKSB7CiAgICAgIHRoaXMuZGVmYXVsdFNlbGVjdE9ic2VydmFibGUgPSBzaGFyZWQ7CiAgICB9IGVsc2UgewogICAgICB0aGlzLnNlbGVjdG9yQ2FjaGUuc2V0KHNlbGVjdG9yRm4sIHNoYXJlZCk7CiAgICB9CiAgICByZXR1cm4gc2hhcmVkOwogIH0KICAvKioKICAgKiBjcmVhdGVzIGFuIGFjdGlvbiBjYXBhYmxlIG9mIG1vZGlmeWluZyB0aGUgc3RhdGUKICAgKi8KICBjcmVhdGVBY3Rpb24oYWN0aW9uRGVmKSB7CiAgICByZXR1cm4gbmV3IFN0YXRlQWN0aW9uKHRoaXMsIGFjdGlvbkRlZik7CiAgfQogIC8qKgogICAqIGNyZWF0ZXMgYSBkZXB0aC10cmFja2VkIGFjdGlvbiBjb250ZXh0IGZvciBzYWZlIG5lc3RlZCBkaXNwYXRjaC4KICAgKiBVc2luZyBjb250ZXh0LmRpc3BhdGNoKCkgd2l0aGluIGFuIGFjdGlvbkRlZiBieXBhc3NlcyB0aGUgbXV0YXRpb24gcXVldWUKICAgKiBhbmQgZXhlY3V0ZXMgdGhlIHN1Yi1hY3Rpb24gaW5saW5lLCBwcmV2ZW50aW5nIGRlYWRsb2Nrcy4KICAgKi8KICBjcmVhdGVBY3Rpb25Db250ZXh0KGRlcHRoKSB7CiAgICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgICByZXR1cm4gewogICAgICBkaXNwYXRjaDogLyogQF9fUFVSRV9fICovIF9fbmFtZShhc3luYyAoYWN0aW9uLCBwYXlsb2FkKSA9PiB7CiAgICAgICAgaWYgKGRlcHRoID49IF9TdGF0ZVBhcnQuTUFYX05FU1RFRF9ESVNQQVRDSF9ERVBUSCkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNYXhpbXVtIG5lc3RlZCBhY3Rpb24gZGlzcGF0Y2ggZGVwdGggKCR7X1N0YXRlUGFydC5NQVhfTkVTVEVEX0RJU1BBVENIX0RFUFRIfSkgZXhjZWVkZWQuIENoZWNrIGZvciBjaXJjdWxhciBhY3Rpb24gZGlzcGF0Y2hlcy5gKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgaW5uZXJDb250ZXh0ID0gc2VsZjIuY3JlYXRlQWN0aW9uQ29udGV4dChkZXB0aCArIDEpOwogICAgICAgIGNvbnN0IG5ld1N0YXRlID0gYXdhaXQgYWN0aW9uLmFjdGlvbkRlZihzZWxmMiwgcGF5bG9hZCwgaW5uZXJDb250ZXh0KTsKICAgICAgICByZXR1cm4gc2VsZjIuYXBwbHlTdGF0ZShuZXdTdGF0ZSk7CiAgICAgIH0sICJkaXNwYXRjaCIpCiAgICB9OwogIH0KICAvKioKICAgKiBkaXNwYXRjaGVzIGFuIGFjdGlvbiBvbiB0aGUgc3RhdGVwYXJ0IGxldmVsCiAgICovCiAgYXN5bmMgZGlzcGF0Y2hBY3Rpb24oc3RhdGVBY3Rpb24sIGFjdGlvblBheWxvYWQpIHsKICAgIGF3YWl0IHRoaXMuY3VtdWxhdGl2ZURlZmVycmVkLnByb21pc2U7CiAgICByZXR1cm4gdGhpcy5tdXRhdGlvblF1ZXVlID0gdGhpcy5tdXRhdGlvblF1ZXVlLnRoZW4oYXN5bmMgKCkgPT4gewogICAgICBjb25zdCBjb250ZXh0MiA9IHRoaXMuY3JlYXRlQWN0aW9uQ29udGV4dCgwKTsKICAgICAgY29uc3QgbmV3U3RhdGUgPSBhd2FpdCBzdGF0ZUFjdGlvbi5hY3Rpb25EZWYodGhpcywgYWN0aW9uUGF5bG9hZCwgY29udGV4dDIpOwogICAgICByZXR1cm4gdGhpcy5hcHBseVN0YXRlKG5ld1N0YXRlKTsKICAgIH0sIGFzeW5jICgpID0+IHsKICAgICAgY29uc3QgY29udGV4dDIgPSB0aGlzLmNyZWF0ZUFjdGlvbkNvbnRleHQoMCk7CiAgICAgIGNvbnN0IG5ld1N0YXRlID0gYXdhaXQgc3RhdGVBY3Rpb24uYWN0aW9uRGVmKHRoaXMsIGFjdGlvblBheWxvYWQsIGNvbnRleHQyKTsKICAgICAgcmV0dXJuIHRoaXMuYXBwbHlTdGF0ZShuZXdTdGF0ZSk7CiAgICB9KTsKICB9CiAgLyoqCiAgICogd2FpdHMgdW50aWwgYSBjZXJ0YWluIHBhcnQgb2YgdGhlIHN0YXRlIGJlY29tZXMgYXZhaWxhYmxlLgogICAqIHN1cHBvcnRzIG9wdGlvbmFsIHRpbWVvdXQgYW5kIEFib3J0U2lnbmFsLgogICAqLwogIGFzeW5jIHdhaXRVbnRpbFByZXNlbnQoc2VsZWN0b3JGbiwgb3B0aW9uc09yVGltZW91dCkgewogICAgbGV0IHRpbWVvdXRNczsKICAgIGxldCBzaWduYWw7CiAgICBpZiAodHlwZW9mIG9wdGlvbnNPclRpbWVvdXQgPT09ICJudW1iZXIiKSB7CiAgICAgIHRpbWVvdXRNcyA9IG9wdGlvbnNPclRpbWVvdXQ7CiAgICB9IGVsc2UgaWYgKG9wdGlvbnNPclRpbWVvdXQpIHsKICAgICAgdGltZW91dE1zID0gb3B0aW9uc09yVGltZW91dC50aW1lb3V0TXM7CiAgICAgIHNpZ25hbCA9IG9wdGlvbnNPclRpbWVvdXQuc2lnbmFsOwogICAgfQogICAgY29uc3QgZG9uZSA9IGRpc3RfdHNfZXhwb3J0cy5kZWZlcigpOwogICAgY29uc3Qgc2VsZWN0ZWRPYnNlcnZhYmxlID0gdGhpcy5zZWxlY3Qoc2VsZWN0b3JGbik7CiAgICBsZXQgcmVzb2x2ZWQgPSBmYWxzZTsKICAgIGlmIChzaWduYWw/LmFib3J0ZWQpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJBYm9ydGVkIik7CiAgICB9CiAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBzZWxlY3RlZE9ic2VydmFibGUuc3Vic2NyaWJlKCh2YWx1ZTIpID0+IHsKICAgICAgaWYgKHZhbHVlMiAhPT0gdm9pZCAwICYmIHZhbHVlMiAhPT0gbnVsbCAmJiAhcmVzb2x2ZWQpIHsKICAgICAgICByZXNvbHZlZCA9IHRydWU7CiAgICAgICAgZG9uZS5yZXNvbHZlKHZhbHVlMik7CiAgICAgIH0KICAgIH0pOwogICAgbGV0IHRpbWVvdXRJZDsKICAgIGlmICh0aW1lb3V0TXMpIHsKICAgICAgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgaWYgKCFyZXNvbHZlZCkgewogICAgICAgICAgcmVzb2x2ZWQgPSB0cnVlOwogICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICBkb25lLnJlamVjdChuZXcgRXJyb3IoYHdhaXRVbnRpbFByZXNlbnQgdGltZWQgb3V0IGFmdGVyICR7dGltZW91dE1zfW1zYCkpOwogICAgICAgIH0KICAgICAgfSwgdGltZW91dE1zKTsKICAgIH0KICAgIGNvbnN0IGFib3J0SGFuZGxlciA9IHNpZ25hbCA/ICgpID0+IHsKICAgICAgaWYgKCFyZXNvbHZlZCkgewogICAgICAgIHJlc29sdmVkID0gdHJ1ZTsKICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICBpZiAodGltZW91dElkKQogICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7CiAgICAgICAgZG9uZS5yZWplY3QobmV3IEVycm9yKCJBYm9ydGVkIikpOwogICAgICB9CiAgICB9IDogdm9pZCAwOwogICAgaWYgKHNpZ25hbCAmJiBhYm9ydEhhbmRsZXIpIHsKICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IiwgYWJvcnRIYW5kbGVyKTsKICAgIH0KICAgIHRyeSB7CiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRvbmUucHJvbWlzZTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0gZmluYWxseSB7CiAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOwogICAgICBpZiAodGltZW91dElkKQogICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpOwogICAgICBpZiAoc2lnbmFsICYmIGFib3J0SGFuZGxlcikgewogICAgICAgIHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsIGFib3J0SGFuZGxlcik7CiAgICAgIH0KICAgIH0KICB9CiAgLyoqCiAgICogaXMgZXhlY3V0ZWQKICAgKi8KICBhc3luYyBzdGF0ZVNldHVwKGZ1bmNBcmcpIHsKICAgIGNvbnN0IHJlc3VsdFByb21pc2UgPSBmdW5jQXJnKHRoaXMpOwogICAgdGhpcy5jdW11bGF0aXZlRGVmZXJyZWQuYWRkUHJvbWlzZShyZXN1bHRQcm9taXNlKTsKICAgIGF3YWl0IHRoaXMuc2V0U3RhdGUoYXdhaXQgcmVzdWx0UHJvbWlzZSk7CiAgfQogIC8qKgogICAqIGRpc3Bvc2VzIHRoZSBzdGF0ZSBwYXJ0LCBjb21wbGV0aW5nIHRoZSBTdWJqZWN0IGFuZCBjbGVhbmluZyB1cCByZXNvdXJjZXMKICAgKi8KICBkaXNwb3NlKCkgewogICAgdGhpcy5zdGF0ZS5jb21wbGV0ZSgpOwogICAgaWYgKHRoaXMucGVuZGluZ0N1bXVsYXRpdmVOb3RpZmljYXRpb24pIHsKICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucGVuZGluZ0N1bXVsYXRpdmVOb3RpZmljYXRpb24pOwogICAgICB0aGlzLnBlbmRpbmdDdW11bGF0aXZlTm90aWZpY2F0aW9uID0gbnVsbDsKICAgIH0KICAgIHRoaXMubWlkZGxld2FyZXMubGVuZ3RoID0gMDsKICAgIHRoaXMuc2VsZWN0b3JDYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpOwogICAgdGhpcy5kZWZhdWx0U2VsZWN0T2JzZXJ2YWJsZSA9IG51bGw7CiAgICB0aGlzLndlYlN0b3JlID0gbnVsbDsKICAgIHRoaXMuc21hcnRzdGF0ZVJlZiA9IHZvaWQgMDsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRzdGF0ZUAyLjIuMS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRzdGF0ZS9kaXN0X3RzL3NtYXJ0c3RhdGUuY2xhc3Nlcy5jb21wdXRlZC5qcwpmdW5jdGlvbiBjb21wdXRlZChzb3VyY2VzLCBjb21wdXRlRm4pIHsKICByZXR1cm4gY29tYmluZUxhdGVzdChzb3VyY2VzLm1hcCgoc3ApID0+IHNwLnNlbGVjdCgpKSkucGlwZShtYXAyKChzdGF0ZXMpID0+IGNvbXB1dGVGbiguLi5zdGF0ZXMpKSk7Cn0KX19uYW1lKGNvbXB1dGVkLCAiY29tcHV0ZWQiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHN0YXRlQDIuMi4xL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHN0YXRlL2Rpc3RfdHMvc21hcnRzdGF0ZS5jbGFzc2VzLnNtYXJ0c3RhdGUuanMKdmFyIFNtYXJ0c3RhdGUgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiU21hcnRzdGF0ZSIpOwogIH0KICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMuc3RhdGVQYXJ0TWFwID0ge307CiAgICB0aGlzLnBlbmRpbmdTdGF0ZVBhcnRDcmVhdGlvbiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICB0aGlzLmJhdGNoRGVwdGggPSAwOwogICAgdGhpcy5pc0ZsdXNoaW5nID0gZmFsc2U7CiAgICB0aGlzLnBlbmRpbmdOb3RpZmljYXRpb25zID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTsKICB9CiAgLyoqCiAgICogd2hldGhlciBzdGF0ZSBjaGFuZ2VzIGFyZSBjdXJyZW50bHkgYmVpbmcgYmF0Y2hlZAogICAqLwogIGdldCBpc0JhdGNoaW5nKCkgewogICAgcmV0dXJuIHRoaXMuYmF0Y2hEZXB0aCA+IDA7CiAgfQogIC8qKgogICAqIHJlZ2lzdGVycyBhIHN0YXRlIHBhcnQgZm9yIGRlZmVycmVkIG5vdGlmaWNhdGlvbiBkdXJpbmcgYSBiYXRjaAogICAqLwogIHJlZ2lzdGVyUGVuZGluZ05vdGlmaWNhdGlvbihzdGF0ZVBhcnQpIHsKICAgIHRoaXMucGVuZGluZ05vdGlmaWNhdGlvbnMuYWRkKHN0YXRlUGFydCk7CiAgfQogIC8qKgogICAqIGJhdGNoZXMgbXVsdGlwbGUgc3RhdGUgdXBkYXRlcyBzbyBzdWJzY3JpYmVycyBhcmUgb25seSBub3RpZmllZCBvbmNlIGFsbCB1cGRhdGVzIGNvbXBsZXRlCiAgICovCiAgYXN5bmMgYmF0Y2godXBkYXRlRm4pIHsKICAgIHRoaXMuYmF0Y2hEZXB0aCsrOwogICAgdHJ5IHsKICAgICAgYXdhaXQgdXBkYXRlRm4oKTsKICAgIH0gZmluYWxseSB7CiAgICAgIHRoaXMuYmF0Y2hEZXB0aC0tOwogICAgICBpZiAodGhpcy5iYXRjaERlcHRoID09PSAwICYmICF0aGlzLmlzRmx1c2hpbmcpIHsKICAgICAgICB0aGlzLmlzRmx1c2hpbmcgPSB0cnVlOwogICAgICAgIHRyeSB7CiAgICAgICAgICB3aGlsZSAodGhpcy5wZW5kaW5nTm90aWZpY2F0aW9ucy5zaXplID4gMCkgewogICAgICAgICAgICBjb25zdCBwZW5kaW5nID0gWy4uLnRoaXMucGVuZGluZ05vdGlmaWNhdGlvbnNdOwogICAgICAgICAgICB0aGlzLnBlbmRpbmdOb3RpZmljYXRpb25zLmNsZWFyKCk7CiAgICAgICAgICAgIGZvciAoY29uc3Qgc3Agb2YgcGVuZGluZykgewogICAgICAgICAgICAgIGF3YWl0IHNwLm5vdGlmeUNoYW5nZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIHRoaXMuaXNGbHVzaGluZyA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICAvKioKICAgKiBjcmVhdGVzIGEgY29tcHV0ZWQgb2JzZXJ2YWJsZSBkZXJpdmVkIGZyb20gbXVsdGlwbGUgc3RhdGUgcGFydHMKICAgKi8KICBjb21wdXRlZChzb3VyY2VzLCBjb21wdXRlRm4pIHsKICAgIHJldHVybiBjb21wdXRlZChzb3VyY2VzLCBjb21wdXRlRm4pOwogIH0KICAvKioKICAgKiBBbGxvd3MgZ2V0dGluZyBhbmQgaW5pdGlhbGl6aW5nIGEgbmV3IHN0YXRlcGFydAogICAqLwogIGFzeW5jIGdldFN0YXRlUGFydChzdGF0ZVBhcnROYW1lQXJnLCBpbml0aWFsQXJnLCBpbml0TW9kZSA9ICJzb2Z0IikgewogICAgY29uc3QgcGVuZGluZyA9IHRoaXMucGVuZGluZ1N0YXRlUGFydENyZWF0aW9uLmdldChzdGF0ZVBhcnROYW1lQXJnKTsKICAgIGlmIChwZW5kaW5nKSB7CiAgICAgIHJldHVybiBwZW5kaW5nOwogICAgfQogICAgY29uc3QgZXhpc3RpbmdTdGF0ZVBhcnQgPSB0aGlzLnN0YXRlUGFydE1hcFtzdGF0ZVBhcnROYW1lQXJnXTsKICAgIGlmIChleGlzdGluZ1N0YXRlUGFydCkgewogICAgICBzd2l0Y2ggKGluaXRNb2RlKSB7CiAgICAgICAgY2FzZSAibWFuZGF0b3J5IjoKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RhdGUgcGFydCAnJHtzdGF0ZVBhcnROYW1lQXJnfScgYWxyZWFkeSBleGlzdHMsIGJ1dCBpbml0TW9kZSBpcyAnbWFuZGF0b3J5J2ApOwogICAgICAgIGNhc2UgImZvcmNlIjoKICAgICAgICAgIGV4aXN0aW5nU3RhdGVQYXJ0LmRpc3Bvc2UoKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgInNvZnQiOgogICAgICAgIGNhc2UgInBlcnNpc3RlbnQiOgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICByZXR1cm4gZXhpc3RpbmdTdGF0ZVBhcnQ7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmIChpbml0aWFsQXJnID09PSB2b2lkIDApIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFN0YXRlIHBhcnQgJyR7c3RhdGVQYXJ0TmFtZUFyZ30nIGRvZXMgbm90IGV4aXN0IGFuZCBubyBpbml0aWFsIHN0YXRlIHByb3ZpZGVkYCk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGNyZWF0aW9uUHJvbWlzZSA9IHRoaXMuY3JlYXRlU3RhdGVQYXJ0KHN0YXRlUGFydE5hbWVBcmcsIGluaXRpYWxBcmcsIGluaXRNb2RlKTsKICAgIHRoaXMucGVuZGluZ1N0YXRlUGFydENyZWF0aW9uLnNldChzdGF0ZVBhcnROYW1lQXJnLCBjcmVhdGlvblByb21pc2UpOwogICAgdHJ5IHsKICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRpb25Qcm9taXNlOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfSBmaW5hbGx5IHsKICAgICAgdGhpcy5wZW5kaW5nU3RhdGVQYXJ0Q3JlYXRpb24uZGVsZXRlKHN0YXRlUGFydE5hbWVBcmcpOwogICAgfQogIH0KICAvKioKICAgKiBDcmVhdGVzIGEgc3RhdGVwYXJ0CiAgICovCiAgYXN5bmMgY3JlYXRlU3RhdGVQYXJ0KHN0YXRlUGFydE5hbWUsIGluaXRpYWxQYXlsb2FkQXJnLCBpbml0TW9kZSA9ICJzb2Z0IikgewogICAgY29uc3QgbmV3U3RhdGUgPSBuZXcgU3RhdGVQYXJ0KHN0YXRlUGFydE5hbWUsIGluaXRNb2RlID09PSAicGVyc2lzdGVudCIgPyB7CiAgICAgIGRiTmFtZTogInNtYXJ0c3RhdGUiLAogICAgICBzdG9yZU5hbWU6IHN0YXRlUGFydE5hbWUKICAgIH0gOiBudWxsKTsKICAgIG5ld1N0YXRlLnNtYXJ0c3RhdGVSZWYgPSB0aGlzOwogICAgYXdhaXQgbmV3U3RhdGUuaW5pdCgpOwogICAgY29uc3QgY3VycmVudFN0YXRlID0gbmV3U3RhdGUuZ2V0U3RhdGUoKTsKICAgIGlmIChpbml0TW9kZSA9PT0gInBlcnNpc3RlbnQiICYmIGN1cnJlbnRTdGF0ZSAhPT0gdm9pZCAwKSB7CiAgICAgIGF3YWl0IG5ld1N0YXRlLnNldFN0YXRlKHsKICAgICAgICAuLi5pbml0aWFsUGF5bG9hZEFyZywKICAgICAgICAuLi5jdXJyZW50U3RhdGUKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBhd2FpdCBuZXdTdGF0ZS5zZXRTdGF0ZShpbml0aWFsUGF5bG9hZEFyZyk7CiAgICB9CiAgICB0aGlzLnN0YXRlUGFydE1hcFtzdGF0ZVBhcnROYW1lXSA9IG5ld1N0YXRlOwogICAgcmV0dXJuIG5ld1N0YXRlOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHN0YXRlQDIuMi4xL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHN0YXRlL2Rpc3RfdHMvc21hcnRzdGF0ZS5jb250ZXh0cHJvdmlkZXIuanMKZnVuY3Rpb24gYXR0YWNoQ29udGV4dFByb3ZpZGVyKGVsZW1lbnQ0LCBvcHRpb25zKSB7CiAgY29uc3QgeyBjb250ZXh0OiBjb250ZXh0Miwgc3RhdGVQYXJ0LCBzZWxlY3RvckZuIH0gPSBvcHRpb25zOwogIGNvbnN0IHN1YnNjcmliZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTsKICBjb25zdCBzdWJzY3JpcHRpb24gPSBzdGF0ZVBhcnQuc2VsZWN0KHNlbGVjdG9yRm4pLnN1YnNjcmliZSgodmFsdWUyKSA9PiB7CiAgICBmb3IgKGNvbnN0IGNiIG9mIHN1YnNjcmliZXJzKSB7CiAgICAgIGNiKHZhbHVlMik7CiAgICB9CiAgfSk7CiAgY29uc3QgZ2V0VmFsdWUgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCgpID0+IHsKICAgIGNvbnN0IHN0YXRlID0gc3RhdGVQYXJ0LmdldFN0YXRlKCk7CiAgICBpZiAoc3RhdGUgPT09IHZvaWQgMCkKICAgICAgcmV0dXJuIHZvaWQgMDsKICAgIHJldHVybiBzZWxlY3RvckZuID8gc2VsZWN0b3JGbihzdGF0ZSkgOiBzdGF0ZTsKICB9LCAiZ2V0VmFsdWUiKTsKICBjb25zdCBoYW5kbGVyMiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGV2ZW50KSA9PiB7CiAgICBjb25zdCBlMTAgPSBldmVudDsKICAgIGNvbnN0IGRldGFpbCA9IGUxMC5kZXRhaWw7CiAgICBpZiAoIWRldGFpbCB8fCBkZXRhaWwuY29udGV4dCAhPT0gY29udGV4dDIpCiAgICAgIHJldHVybjsKICAgIGUxMC5zdG9wUHJvcGFnYXRpb24oKTsKICAgIGlmIChkZXRhaWwuc3Vic2NyaWJlKSB7CiAgICAgIGNvbnN0IGNiID0gZGV0YWlsLmNhbGxiYWNrOwogICAgICBzdWJzY3JpYmVycy5hZGQoY2IpOwogICAgICBjb25zdCB1bnN1YnNjcmliZSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKCkgPT4gc3Vic2NyaWJlcnMuZGVsZXRlKGNiKSwgInVuc3Vic2NyaWJlIik7CiAgICAgIGNiKGdldFZhbHVlKCksIHVuc3Vic2NyaWJlKTsKICAgIH0gZWxzZSB7CiAgICAgIGRldGFpbC5jYWxsYmFjayhnZXRWYWx1ZSgpKTsKICAgIH0KICB9LCAiaGFuZGxlciIpOwogIGVsZW1lbnQ0LmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHQtcmVxdWVzdCIsIGhhbmRsZXIyKTsKICByZXR1cm4gKCkgPT4gewogICAgZWxlbWVudDQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY29udGV4dC1yZXF1ZXN0IiwgaGFuZGxlcjIpOwogICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICBzdWJzY3JpYmVycy5jbGVhcigpOwogIH07Cn0KX19uYW1lKGF0dGFjaENvbnRleHRQcm92aWRlciwgImF0dGFjaENvbnRleHRQcm92aWRlciIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0dXJsQDMuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHVybC9kaXN0X3RzL2luZGV4LmpzCnZhciBkaXN0X3RzX2V4cG9ydHMyMiA9IHt9OwpfX2V4cG9ydChkaXN0X3RzX2V4cG9ydHMyMiwgewogIFNtYXJ0dXJsOiAoKSA9PiBTbWFydHVybAp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHVybEAzLjEuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnR1cmwvZGlzdF90cy9zbWFydHVybC5jbGFzc2VzLnNtYXJ0dXJsLmpzCnZhciBTbWFydHVybCA9IGNsYXNzIF9TbWFydHVybCB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiU21hcnR1cmwiKTsKICB9CiAgLy8gU3RhdGljIG1ldGhvZCB0byBjcmVhdGUgYSBTbWFydHVybCBpbnN0YW5jZSBmcm9tIGEgVVJMIHN0cmluZwogIHN0YXRpYyBjcmVhdGVGcm9tVXJsKHVybEFyZywgb3B0aW9uc0FyZykgewogICAgY29uc3QgcGFyc2VkVXJsSW5zdGFuY2UgPSBuZXcgVVJMKHVybEFyZyk7CiAgICBjb25zdCBzZWFyY2hQYXJhbXMgPSB7fTsKICAgIGNvbnN0IHNlYXJjaFBhcmFtUGFpcnMgPSBbXTsKICAgIGlmIChwYXJzZWRVcmxJbnN0YW5jZS5zZWFyY2gpIHsKICAgICAgcGFyc2VkVXJsSW5zdGFuY2Uuc2VhcmNoLnJlcGxhY2UoIj8iLCAiIikuc3BsaXQoIiYiKS5tYXAoKHNlYXJjaFBhcmFtUGFpcikgPT4gewogICAgICAgIHNlYXJjaFBhcmFtUGFpcnMucHVzaCh7CiAgICAgICAgICBrZXk6IHNlYXJjaFBhcmFtUGFpci5zcGxpdCgiPSIpWzBdLAogICAgICAgICAgdmFsdWU6IHNlYXJjaFBhcmFtUGFpci5zcGxpdCgiPSIpWzFdCiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfQogICAgZm9yIChjb25zdCBzZWFyY2hQYXJhbVBhaXIgb2Ygc2VhcmNoUGFyYW1QYWlycykgewogICAgICBzZWFyY2hQYXJhbXNbc2VhcmNoUGFyYW1QYWlyLmtleV0gPSBzZWFyY2hQYXJhbVBhaXIudmFsdWU7CiAgICB9CiAgICBpZiAob3B0aW9uc0FyZz8uc2VhcmNoUGFyYW1zKSB7CiAgICAgIGZvciAoY29uc3Qga2V5MiBvZiBPYmplY3Qua2V5cyhvcHRpb25zQXJnLnNlYXJjaFBhcmFtcykpIHsKICAgICAgICBzZWFyY2hQYXJhbXNba2V5Ml0gPSBvcHRpb25zQXJnLnNlYXJjaFBhcmFtc1trZXkyXTsKICAgICAgfQogICAgfQogICAgbGV0IHBhdGgyID0gcGFyc2VkVXJsSW5zdGFuY2UucGF0aG5hbWUgfHwgIiI7CiAgICBpZiAoT2JqZWN0LmtleXMoc2VhcmNoUGFyYW1zKS5sZW5ndGggPiAwKSB7CiAgICAgIHBhdGgyICs9ICI/IjsKICAgICAgbGV0IGZpcnN0MiA9IHRydWU7CiAgICAgIGZvciAoY29uc3Qga2V5MiBvZiBPYmplY3Qua2V5cyhzZWFyY2hQYXJhbXMpKSB7CiAgICAgICAgaWYgKGZpcnN0MikgewogICAgICAgICAgZmlyc3QyID0gZmFsc2U7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHBhdGgyICs9ICImIjsKICAgICAgICB9CiAgICAgICAgcGF0aDIgKz0gYCR7a2V5Mn09JHtzZWFyY2hQYXJhbXNba2V5Ml19YDsKICAgICAgfQogICAgfQogICAgY29uc3QgcGFyc2VkVXJsID0gewogICAgICAuLi5wYXJzZWRVcmxJbnN0YW5jZSwKICAgICAgaHJlZjogcGFyc2VkVXJsSW5zdGFuY2UuaHJlZiwKICAgICAgb3JpZ2luOiBwYXJzZWRVcmxJbnN0YW5jZS5vcmlnaW4sCiAgICAgIHByb3RvY29sOiBwYXJzZWRVcmxJbnN0YW5jZS5wcm90b2NvbCwKICAgICAgdXNlcm5hbWU6IHBhcnNlZFVybEluc3RhbmNlLnVzZXJuYW1lLAogICAgICBwYXNzd29yZDogcGFyc2VkVXJsSW5zdGFuY2UucGFzc3dvcmQsCiAgICAgIGhvc3Q6IHBhcnNlZFVybEluc3RhbmNlLmhvc3QsCiAgICAgIGhvc3RuYW1lOiBwYXJzZWRVcmxJbnN0YW5jZS5ob3N0bmFtZSwKICAgICAgcG9ydDogcGFyc2VkVXJsSW5zdGFuY2UucG9ydCwKICAgICAgcGF0aDogcGF0aDIsCiAgICAgIHBhdGhuYW1lOiBwYXJzZWRVcmxJbnN0YW5jZS5wYXRobmFtZSwKICAgICAgc2VhcmNoOiBwYXJzZWRVcmxJbnN0YW5jZS5zZWFyY2gsCiAgICAgIHNlYXJjaFBhcmFtcywKICAgICAgaGFzaDogcGFyc2VkVXJsSW5zdGFuY2UuaGFzaAogICAgfTsKICAgIGlmICghcGFyc2VkVXJsLnBvcnQgJiYgcGFyc2VkVXJsLnByb3RvY29sID09PSAiaHR0cHM6IikgewogICAgICBwYXJzZWRVcmwucG9ydCA9ICI0NDMiOwogICAgfQogICAgaWYgKCFwYXJzZWRVcmwucG9ydCAmJiBwYXJzZWRVcmwucHJvdG9jb2wgPT09ICJodHRwOiIpIHsKICAgICAgcGFyc2VkVXJsLnBvcnQgPSAiODAiOwogICAgfQogICAgY29uc3QgcmV0dXJuU21hcnR1cmwgPSBuZXcgX1NtYXJ0dXJsKCk7CiAgICBPYmplY3QuYXNzaWduKHJldHVyblNtYXJ0dXJsLCBwYXJzZWRVcmwpOwogICAgcmV0dXJuIHJldHVyblNtYXJ0dXJsOwogIH0KICAvLyBTdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSBhIFNtYXJ0dXJsIGluc3RhbmNlIGZyb20gYW4gZXhpc3RpbmcgSVVybE9iamVjdAogIHN0YXRpYyBjcmVhdGVGcm9tUGFyc2VkVXJsKHBhcnNlZFVybEFyZykgewogICAgY29uc3QgcmV0dXJuU21hcnR1cmwgPSBuZXcgX1NtYXJ0dXJsKCk7CiAgICBPYmplY3QuYXNzaWduKHJldHVyblNtYXJ0dXJsLCBwYXJzZWRVcmxBcmcpOwogICAgcmV0dXJuIHJldHVyblNtYXJ0dXJsOwogIH0KICAvLyBDb25zdHJ1Y3RvciBpbml0aWFsaXplcyBzZWFyY2hQYXJhbXMgYXMgYW4gZW1wdHkgb2JqZWN0CiAgY29uc3RydWN0b3IoKSB7CiAgICB0aGlzLnNlYXJjaFBhcmFtcyA9IHt9OwogIH0KICAvLyBNZXRob2QgdG8gY3JlYXRlIGFuIGluZGVwZW5kZW50IGNsb25lIG9mIHRoZSBjdXJyZW50IFNtYXJ0dXJsIGluc3RhbmNlCiAgY2xvbmUoKSB7CiAgICBjb25zdCBjbG9uZWRJbnN0YW5jZSA9IG5ldyBfU21hcnR1cmwoKTsKICAgIE9iamVjdC5hc3NpZ24oY2xvbmVkSW5zdGFuY2UsIHRoaXMpOwogICAgY2xvbmVkSW5zdGFuY2Uuc2VhcmNoUGFyYW1zID0geyAuLi50aGlzLnNlYXJjaFBhcmFtcyB9OwogICAgcmV0dXJuIGNsb25lZEluc3RhbmNlOwogIH0KICAvKioKICAgKiBUeXBlZCBtZXRob2QgdG8gc2V0IGEgcHJvcGVydHkgYW5kIHJldHVybiB0aGUgaW5zdGFuY2UgZm9yIGNoYWluaW5nLgogICAqIEBwYXJhbSBwcm9wIC0gVGhlIHByb3BlcnR5IG5hbWUgdG8gc2V0IChtdXN0IGJlIGEga2V5IG9mIFNtYXJ0dXJsKQogICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBhc3NpZ24gdG8gdGhlIHByb3BlcnR5CiAgICogQHJldHVybnMgVGhlIFNtYXJ0dXJsIGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcKICAgKi8KICBzZXQocHJvcCwgdmFsdWUyKSB7CiAgICB0aGlzW3Byb3BdID0gdmFsdWUyOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIC8vIE1ldGhvZCB0byBjb252ZXJ0IHRoZSBTbWFydHVybCBpbnN0YW5jZSBiYWNrIGludG8gYSBVUkwgc3RyaW5nCiAgdG9TdHJpbmcoKSB7CiAgICBsZXQgdXNlcnBhcnQgPSBgYDsKICAgIGlmICh0aGlzLnVzZXJuYW1lICYmICF0aGlzLnBhc3N3b3JkKSB7CiAgICAgIHVzZXJwYXJ0ID0gYCR7dGhpcy51c2VybmFtZX1AYDsKICAgIH0KICAgIGlmICh0aGlzLnVzZXJuYW1lICYmIHRoaXMucGFzc3dvcmQpIHsKICAgICAgdXNlcnBhcnQgPSBgJHt0aGlzLnVzZXJuYW1lfToke3RoaXMucGFzc3dvcmR9QGA7CiAgICB9CiAgICByZXR1cm4gYCR7dGhpcy5wcm90b2NvbH0vLyR7dXNlcnBhcnR9JHt0aGlzLmhvc3RuYW1lfToke3RoaXMucG9ydH0ke3RoaXMucGF0aH1gOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJzZXR1cEAzLjAuMTkvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnNldHVwL2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czI2ID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czI2LCB7CiAgSnNvbkxkVGFnOiAoKSA9PiBKc29uTGRUYWcsCiAgTWV0YVRhZzogKCkgPT4gTWV0YVRhZywKICBPcGVuZ3JhcGhUYWc6ICgpID0+IE9wZW5ncmFwaFRhZywKICBUaXRsZTogKCkgPT4gVGl0bGUsCiAgV2ViU2V0dXA6ICgpID0+IFdlYlNldHVwCn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNocm9ja3Mrc21hcnRkZWxheUAzLjAuMS9ub2RlX21vZHVsZXMvQHB1c2hyb2Nrcy9zbWFydGRlbGF5L2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czI0ID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czI0LCB7CiAgVGltZW91dDogKCkgPT4gVGltZW91dDIsCiAgZGVsYXlGb3I6ICgpID0+IGRlbGF5Rm9yMiwKICBkZWxheUZvclJhbmRvbTogKCkgPT4gZGVsYXlGb3JSYW5kb20yCn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNocm9ja3Mrc21hcnRwcm9taXNlQDQuMC4yL25vZGVfbW9kdWxlcy9AcHVzaHJvY2tzL3NtYXJ0cHJvbWlzZS9kaXN0X3RzL2luZGV4LmpzCnZhciBkaXN0X3RzX2V4cG9ydHMyMyA9IHt9OwpfX2V4cG9ydChkaXN0X3RzX2V4cG9ydHMyMywgewogIEN1bXVsYXRpdmVEZWZlcnJlZDogKCkgPT4gQ3VtdWxhdGl2ZURlZmVycmVkMiwKICBEZWZlcnJlZDogKCkgPT4gRGVmZXJyZWQyLAogIGN1bXVsYXRpdmVEZWZlcjogKCkgPT4gY3VtdWxhdGl2ZURlZmVyMiwKICBkZWZlcjogKCkgPT4gZGVmZXIzLAogIGdldEZpcnN0VHJ1ZU9yRmFsc2U6ICgpID0+IGdldEZpcnN0VHJ1ZU9yRmFsc2UyLAogIG1hcDogKCkgPT4gbWFwNiwKICByZWplY3RlZFByb21pc2U6ICgpID0+IHJlamVjdGVkUHJvbWlzZTIsCiAgcmVzb2x2ZWRQcm9taXNlOiAoKSA9PiByZXNvbHZlZFByb21pc2UyLAogIHRpbWVvdXRBbmRDb250aW51ZTogKCkgPT4gdGltZW91dEFuZENvbnRpbnVlMiwKICB0aW1lb3V0V3JhcDogKCkgPT4gdGltZW91dFdyYXAyCn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNocm9ja3Mrc21hcnRwcm9taXNlQDQuMC4yL25vZGVfbW9kdWxlcy9AcHVzaHJvY2tzL3NtYXJ0cHJvbWlzZS9kaXN0X3RzL3NtYXJ0cHJvbWlzZS5jbGFzc2VzLmRlZmVycmVkLmpzCnZhciBEZWZlcnJlZDIgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiRGVmZXJyZWQiKTsKICB9CiAgY2xhaW0oKSB7CiAgICBpZiAodGhpcy5jbGFpbWVkKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiRGVmZXJyZWQgYWxyZWFkeSBjbGFpbWVkIik7CiAgICB9CiAgICB0aGlzLmNsYWltZWQgPSB0cnVlOwogIH0KICBnZXQgZHVyYXRpb24oKSB7CiAgICBpZiAodGhpcy5zdG9wcGVkQXQpIHsKICAgICAgcmV0dXJuIHRoaXMuc3RvcHBlZEF0IC0gdGhpcy5zdGFydGVkQXQ7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gRGF0ZS5ub3coKSAtIHRoaXMuc3RhcnRlZEF0OwogICAgfQogIH0KICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMuY2xhaW1lZCA9IGZhbHNlOwogICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUyLCByZWplY3QpID0+IHsKICAgICAgdGhpcy5yZXNvbHZlID0gKHZhbHVlQXJnKSA9PiB7CiAgICAgICAgdGhpcy5zdGF0dXMgPSAiZnVsZmlsbGVkIjsKICAgICAgICB0aGlzLnN0b3BwZWRBdCA9IERhdGUubm93KCk7CiAgICAgICAgcmVzb2x2ZTIodmFsdWVBcmcpOwogICAgICB9OwogICAgICB0aGlzLnJlamVjdCA9IChyZWFzb24pID0+IHsKICAgICAgICB0aGlzLnN0YXR1cyA9ICJyZWplY3RlZCI7CiAgICAgICAgdGhpcy5zdG9wcGVkQXQgPSBEYXRlLm5vdygpOwogICAgICAgIHJlamVjdChyZWFzb24pOwogICAgICB9OwogICAgICB0aGlzLnN0YXJ0ZWRBdCA9IERhdGUubm93KCk7CiAgICAgIHRoaXMuc3RhdHVzID0gInBlbmRpbmciOwogICAgfSk7CiAgfQp9Owp2YXIgZGVmZXIzID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoKSA9PiB7CiAgcmV0dXJuIG5ldyBEZWZlcnJlZDIoKTsKfSwgImRlZmVyIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2hyb2NrcytzbWFydHByb21pc2VANC4wLjIvbm9kZV9tb2R1bGVzL0BwdXNocm9ja3Mvc21hcnRwcm9taXNlL2Rpc3RfdHMvc21hcnRwcm9taXNlLmNsYXNzZXMuY3VtdWxhdGl2ZWRlZmVycmVkLmpzCnZhciBDdW11bGF0aXZlRGVmZXJyZWQyID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkN1bXVsYXRpdmVEZWZlcnJlZCIpOwogIH0KICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMuYWNjdW11bGF0ZWRQcm9taXNlcyA9IFtdOwogICAgdGhpcy5kZWZlcnJlZCA9IGRlZmVyMygpOwogICAgdGhpcy5wcm9taXNlID0gdGhpcy5kZWZlcnJlZC5wcm9taXNlOwogICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7CiAgICAgIHdoaWxlICh0aGlzLmFjY3VtdWxhdGVkUHJvbWlzZXMubGVuZ3RoID4gMCkgewogICAgICAgIGNvbnN0IHBvcHBlZFByb21pc2UgPSB0aGlzLmFjY3VtdWxhdGVkUHJvbWlzZXMuc2hpZnQoKTsKICAgICAgICBhd2FpdCBwb3BwZWRQcm9taXNlOwogICAgICB9CiAgICAgIHRoaXMuZGVmZXJyZWQucmVzb2x2ZSgpOwogICAgfSwgMCk7CiAgfQogIGFkZFByb21pc2UocHJvbWlzZUFyZykgewogICAgdGhpcy5hY2N1bXVsYXRlZFByb21pc2VzLnB1c2gocHJvbWlzZUFyZyk7CiAgfQp9Owp2YXIgY3VtdWxhdGl2ZURlZmVyMiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKCkgPT4gewogIHJldHVybiBuZXcgQ3VtdWxhdGl2ZURlZmVycmVkMigpOwp9LCAiY3VtdWxhdGl2ZURlZmVyIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2hyb2NrcytzbWFydHByb21pc2VANC4wLjIvbm9kZV9tb2R1bGVzL0BwdXNocm9ja3Mvc21hcnRwcm9taXNlL2Rpc3RfdHMvaW5kZXguanMKdmFyIHJlc29sdmVkUHJvbWlzZTIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh2YWx1ZTIpID0+IHsKICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlMik7Cn0sICJyZXNvbHZlZFByb21pc2UiKTsKdmFyIHJlamVjdGVkUHJvbWlzZTIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChlcnIpID0+IHsKICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTsKfSwgInJlamVjdGVkUHJvbWlzZSIpOwp2YXIgbWFwNiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoYXN5bmMgKGlucHV0QXJnLCBmdW5jdGlvbkFyZykgPT4gewogIGNvbnN0IHByb21pc2VBcnJheSA9IFtdOwogIGNvbnN0IHJlc3VsdEFycmF5ID0gW107CiAgZm9yIChjb25zdCBpdGVtIG9mIGlucHV0QXJnKSB7CiAgICBjb25zdCBwcm9taXNlID0gZnVuY3Rpb25BcmcoaXRlbSk7CiAgICBwcm9taXNlQXJyYXkucHVzaChwcm9taXNlKTsKICAgIHByb21pc2UudGhlbigoeDMpID0+IHsKICAgICAgcmVzdWx0QXJyYXkucHVzaCh4Myk7CiAgICB9KTsKICB9CiAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZUFycmF5KTsKICByZXR1cm4gcmVzdWx0QXJyYXk7Cn0sICJtYXAiKTsKdmFyIHRpbWVvdXRXcmFwMiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoYXN5bmMgKHByb21pc2VBcmcsIHRpbWVvdXRJbk1zQXJnLCByZWplY3RBcmcgPSB0cnVlKSA9PiB7CiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlMiwgcmVqZWN0KSA9PiB7CiAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgaWYgKHJlamVjdEFyZykgewogICAgICAgIHJlamVjdChuZXcgRXJyb3IoInRpbWVvdXQiKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzb2x2ZTIobnVsbCk7CiAgICAgIH0KICAgIH0sIHRpbWVvdXRJbk1zQXJnKTsKICAgIHByb21pc2VBcmcudGhlbihyZXNvbHZlMiwgcmVqZWN0KTsKICB9KTsKfSwgInRpbWVvdXRXcmFwIik7CnZhciB0aW1lb3V0QW5kQ29udGludWUyID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShhc3luYyAocHJvbWlzZUFyZywgdGltZW91dEluTXNBcmcgPSA2ZTQpID0+IHsKICByZXR1cm4gdGltZW91dFdyYXAyKHByb21pc2VBcmcsIHRpbWVvdXRJbk1zQXJnLCBmYWxzZSk7Cn0sICJ0aW1lb3V0QW5kQ29udGludWUiKTsKdmFyIGdldEZpcnN0VHJ1ZU9yRmFsc2UyID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShhc3luYyAocHJvbWlzZXNBcmcpID0+IHsKICBjb25zdCBkb25lID0gZGVmZXIzKCk7CiAgZm9yIChjb25zdCBwcm9taXNlQXJnIG9mIHByb21pc2VzQXJnKSB7CiAgICBwcm9taXNlQXJnLnRoZW4oKHJlc3VsdEFyZykgPT4gewogICAgICBpZiAocmVzdWx0QXJnID09PSB0cnVlKSB7CiAgICAgICAgZG9uZS5yZXNvbHZlKHRydWUpOwogICAgICB9CiAgICB9KTsKICB9CiAgUHJvbWlzZS5hbGwocHJvbWlzZXNBcmcpLnRoZW4oKCkgPT4gewogICAgZG9uZS5yZXNvbHZlKGZhbHNlKTsKICB9KTsKICByZXR1cm4gZG9uZS5wcm9taXNlOwp9LCAiZ2V0Rmlyc3RUcnVlT3JGYWxzZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNocm9ja3Mrc21hcnRkZWxheUAzLjAuMS9ub2RlX21vZHVsZXMvQHB1c2hyb2Nrcy9zbWFydGRlbGF5L2Rpc3RfdHMvaW5kZXguanMKdmFyIGRlbGF5Rm9yMiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoYXN5bmMgKHRpbWVJbk1pbGxpc2Vjb25kQXJnLCBwYXNzT25BcmcsIHVucmVmZWRBcmcgPSBmYWxzZSkgPT4gewogIGNvbnN0IHRpbWVvdXQyID0gbmV3IFRpbWVvdXQyKHRpbWVJbk1pbGxpc2Vjb25kQXJnLCBudWxsLCB1bnJlZmVkQXJnKTsKICBhd2FpdCB0aW1lb3V0Mi5wcm9taXNlOwogIHJldHVybiBwYXNzT25Bcmc7Cn0sICJkZWxheUZvciIpOwp2YXIgZGVsYXlGb3JSYW5kb20yID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShhc3luYyAodGltZU1pbkluTWlsbGlzZWNvbmRBcmcsIHRpbWVNYXhJbk1pbGxpc2Vjb25kQXJnLCBwYXNzT25BcmcsIHVucmVmZWRBcmcgPSBmYWxzZSkgPT4gewogIGF3YWl0IGRlbGF5Rm9yMihNYXRoLnJhbmRvbSgpICogKHRpbWVNYXhJbk1pbGxpc2Vjb25kQXJnIC0gdGltZU1pbkluTWlsbGlzZWNvbmRBcmcpICsgdGltZU1pbkluTWlsbGlzZWNvbmRBcmcsIG51bGwsIHVucmVmZWRBcmcpOwogIHJldHVybiBwYXNzT25Bcmc7Cn0sICJkZWxheUZvclJhbmRvbSIpOwp2YXIgVGltZW91dDIgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiVGltZW91dCIpOwogIH0KICBjb25zdHJ1Y3Rvcih0aW1lSW5NaWxsaXNlY29uZEFyZywgcGFzc09uLCB1bnJlZmVkQXJnID0gZmFsc2UpIHsKICAgIHRoaXMuX2NhbmNlbGxlZCA9IGZhbHNlOwogICAgdGhpcy50aW1lb3V0SW5NaWxsaXMgPSB0aW1lSW5NaWxsaXNlY29uZEFyZzsKICAgIHRoaXMuX2RlZmVycmVkID0gZGVmZXIzKCk7CiAgICB0aGlzLnByb21pc2UgPSB0aGlzLl9kZWZlcnJlZC5wcm9taXNlOwogICAgdGhpcy5fdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICBpZiAoIXRoaXMuX2NhbmNlbGxlZCkgewogICAgICAgIHRoaXMuX2RlZmVycmVkLnJlc29sdmUocGFzc09uKTsKICAgICAgfQogICAgfSwgdGltZUluTWlsbGlzZWNvbmRBcmcpOwogICAgdGhpcy5zdGFydGVkID0gRGF0ZS5ub3coKTsKICAgIGlmICh1bnJlZmVkQXJnKSB7CiAgICAgIHRoaXMubWFrZVVucmVmZWQoKTsKICAgIH0KICB9CiAgLyoqCiAgICogdW5yZWZmaW5nIGEgdGltZW91dCBjYXVzZXMgdGhlIG5vZGUgcHJvY2VzcyB0byBub3Qgd2FpdCBmb3IgY29tcGxldGlvbiBiZWZvcmUgZXhpdAogICAqLwogIG1ha2VVbnJlZmVkKCkgewogICAgdGhpcy5fdGltZW91dC51bnJlZigpOwogIH0KICAvKioKICAgKiBjYW5jZWxzIHRoZSB0aW1lcgogICAqLwogIGNhbmNlbCgpIHsKICAgIHRoaXMuX2NhbmNlbGxlZCA9IHRydWU7CiAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCk7CiAgfQogIGdldFRpbWVMZWZ0KCkgewogICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zdGFydGVkICsgdGhpcy50aW1lb3V0SW5NaWxsaXMgLSBEYXRlLm5vdygpOwogICAgcmV0dXJuIHJlc3VsdCA+IDAgPyByZXN1bHQgOiAwOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czI1ID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czI1LCB7CiAgYnVzaW5lc3M6ICgpID0+IGJ1c2luZXNzX2V4cG9ydHMsCiAgY29kZTogKCkgPT4gY29kZV9leHBvcnRzLAogIGNvbnRhaW5lcjogKCkgPT4gY29udGFpbmVyX2V4cG9ydHMsCiAgY29udGVudDogKCkgPT4gY29udGVudF9leHBvcnRzLAogIGRhdGFiYXNlOiAoKSA9PiBkYXRhYmFzZV9leHBvcnRzLAogIGZpbmFuY2U6ICgpID0+IGZpbmFuY2VfZXhwb3J0cywKICBnZW5lcmFsOiAoKSA9PiBnZW5lcmFsX2V4cG9ydHMsCiAgbmV0d29yazogKCkgPT4gbmV0d29ya19leHBvcnRzLAogIHNhYXM6ICgpID0+IHNhYXNfZXhwb3J0cywKICBzdG9yYWdlOiAoKSA9PiBzdG9yYWdlX2V4cG9ydHMsCiAgd2Vic2l0ZTogKCkgPT4gd2Vic2l0ZV9leHBvcnRzCn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9idXNpbmVzcy9pbmRleC5qcwp2YXIgYnVzaW5lc3NfZXhwb3J0cyA9IHt9OwpfX2V4cG9ydChidXNpbmVzc19leHBvcnRzLCB7CiAgSUpvYjogKCkgPT4gSUpvYgp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvZmluYW5jZS9pbmRleC5qcwp2YXIgZmluYW5jZV9leHBvcnRzID0ge307CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2J1c2luZXNzL2pvYi5qcwp2YXIgSUpvYiA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJJSm9iIik7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9kYXRhYmFzZS9pbmRleC5qcwp2YXIgZGF0YWJhc2VfZXhwb3J0cyA9IHt9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9jb2RlL2luZGV4LmpzCnZhciBjb2RlX2V4cG9ydHMgPSB7fTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvY29udGFpbmVyL2luZGV4LmpzCnZhciBjb250YWluZXJfZXhwb3J0cyA9IHt9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9jb250ZW50L2luZGV4LmpzCnZhciBjb250ZW50X2V4cG9ydHMgPSB7fTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvZ2VuZXJhbC9pbmRleC5qcwp2YXIgZ2VuZXJhbF9leHBvcnRzID0ge307CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL25ldHdvcmsvaW5kZXguanMKdmFyIG5ldHdvcmtfZXhwb3J0cyA9IHt9OwpfX2V4cG9ydChuZXR3b3JrX2V4cG9ydHMsIHsKICBJQ25hbWVEZXNjcmlwdG9yOiAoKSA9PiBJQ25hbWVEZXNjcmlwdG9yCn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9uZXR3b3JrL2NuYW1lLmpzCnZhciBJQ25hbWVEZXNjcmlwdG9yID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIklDbmFtZURlc2NyaXB0b3IiKTsKICB9Cn07CjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvc2Fhcy9pbmRleC5qcwp2YXIgc2Fhc19leHBvcnRzID0ge307CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL3N0b3JhZ2UvaW5kZXguanMKdmFyIHN0b3JhZ2VfZXhwb3J0cyA9IHt9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy93ZWJzaXRlL2luZGV4LmpzCnZhciB3ZWJzaXRlX2V4cG9ydHMgPSB7fTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJzZXR1cEAzLjAuMTkvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnNldHVwL2Rpc3RfdHMvd2Vic2V0dXAuY2xhc3Nlcy50YWcuanMKdmFyIFRhZyA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJUYWciKTsKICB9CiAgYXBwZW5kVG9Eb20oKSB7CiAgICBpZiAoIXRoaXMuZWxlbWVudFJlZi5wYXJlbnRFbGVtZW50ICYmICF0aGlzLmVsZW1lbnRSZWYucGFyZW50Tm9kZSkgewogICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdLmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudFJlZik7CiAgICB9CiAgfQogIHJlbW92ZUZyb21Eb20oKSB7CiAgICBpZiAodGhpcy5lbGVtZW50UmVmLnBhcmVudEVsZW1lbnQpIHsKICAgICAgdGhpcy5lbGVtZW50UmVmLnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcy5lbGVtZW50UmVmKTsKICAgIH0gZWxzZSBpZiAodGhpcy5lbGVtZW50UmVmLnBhcmVudE5vZGUpIHsKICAgICAgdGhpcy5lbGVtZW50UmVmLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5lbGVtZW50UmVmKTsKICAgIH0KICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrd2Vic2V0dXBAMy4wLjE5L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJzZXR1cC9kaXN0X3RzL3dlYnNldHVwLmNsYXNzZXMudGFnLmpzb25sZHRhZy5qcwp2YXIgSnNvbkxkVGFnID0gY2xhc3MgX0pzb25MZFRhZyBleHRlbmRzIFRhZyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiSnNvbkxkVGFnIik7CiAgfQogIHN0YXRpYyBjcmVhdGVDb21wYW55SnNvbkxkKGNvbXBhbnlEYXRhQXJnKSB7CiAgICBjb25zdCBjb21wYW55TGQgPSB7CiAgICAgICJAY29udGV4dCI6ICJodHRwczovL3NjaGVtYS5vcmciLAogICAgICAiQHR5cGUiOiAiQ29ycG9yYXRpb24iLAogICAgICBuYW1lOiBjb21wYW55RGF0YUFyZy5uYW1lLAogICAgICBhbHRlcm5hdGVOYW1lOiBjb21wYW55RGF0YUFyZy5uYW1lLnJlcGxhY2UoIiBHbWJIIiwgIiIpLAogICAgICB1cmw6IGNvbXBhbnlEYXRhQXJnLmNvbnRhY3Qud2Vic2l0ZSwKICAgICAgbG9nbzogY29tcGFueURhdGFBcmcuY29udGFjdC5sb2dvVXJsLAogICAgICBjb250YWN0UG9pbnQ6IHsKICAgICAgICAiQHR5cGUiOiAiQ29udGFjdFBvaW50IiwKICAgICAgICB0ZWxlcGhvbmU6IGNvbXBhbnlEYXRhQXJnLmNvbnRhY3QucGhvbmUsCiAgICAgICAgY29udGFjdFR5cGU6ICJjdXN0b21lciBzZXJ2aWNlIiwKICAgICAgICBhcmVhU2VydmVkOiAiREUiLAogICAgICAgIGF2YWlsYWJsZUxhbmd1YWdlOiBbImVuIiwgIkdlcm1hbiJdCiAgICAgIH0sCiAgICAgIHNhbWVBczogW10KICAgIH07CiAgICBpZiAoY29tcGFueURhdGFBcmcuY29udGFjdC5mYWNlYm9va1VybCkgewogICAgICBjb21wYW55TGQuc2FtZUFzLnB1c2goY29tcGFueURhdGFBcmcuY29udGFjdC5mYWNlYm9va1VybCk7CiAgICB9CiAgICBpZiAoY29tcGFueURhdGFBcmcuY29udGFjdC50d2l0dGVyVXJsKSB7CiAgICAgIGNvbXBhbnlMZC5zYW1lQXMucHVzaChjb21wYW55RGF0YUFyZy5jb250YWN0LnR3aXR0ZXJVcmwpOwogICAgfQogICAgY29uc3QgbGRUYWcgPSBuZXcgX0pzb25MZFRhZyhjb21wYW55TGQpOwogICAgcmV0dXJuIGxkVGFnOwogIH0KICBzdGF0aWMgY3JlYXRlTmV3c0FydGljbGVKc29uTGQobmV3c0FydGljbGVBcmcpIHsKICAgIGNvbnN0IG5ld3NBcnRpY2xlTGQgPSB7CiAgICAgICJAY29udGV4dCI6ICJodHRwczovL3NjaGVtYS5vcmciLAogICAgICAiQHR5cGUiOiAiTmV3c0FydGljbGUiLAogICAgICBtYWluRW50aXR5T2ZQYWdlOiB7CiAgICAgICAgIkB0eXBlIjogIldlYlBhZ2UiLAogICAgICAgICJAaWQiOiB3aW5kb3cubG9jYXRpb24uaHJlZgogICAgICB9LAogICAgICBoZWFkbGluZTogIkFydGljbGUgaGVhZGxpbmUiLAogICAgICBpbWFnZTogW25ld3NBcnRpY2xlQXJnLmZlYXR1cmVkSW1hZ2VVcmxdLAogICAgICBkYXRlUHVibGlzaGVkOiBuZXcgRGF0ZShuZXdzQXJ0aWNsZUFyZy50aW1lc3RhbXApLnRvSVNPU3RyaW5nKCksCiAgICAgIGRhdGVNb2RpZmllZDogbmV3IERhdGUobmV3c0FydGljbGVBcmcudGltZXN0YW1wKS50b0lTT1N0cmluZygpLAogICAgICBhdXRob3I6IHsKICAgICAgICAiQHR5cGUiOiAiUGVyc29uIiwKICAgICAgICBuYW1lOiBgJHtuZXdzQXJ0aWNsZUFyZy5hdXRob3IuZmlyc3ROYW1lfSAke25ld3NBcnRpY2xlQXJnLmF1dGhvci5zdXJOYW1lfWAKICAgICAgfSwKICAgICAgcHVibGlzaGVyOiB7CiAgICAgICAgIkB0eXBlIjogIk9yZ2FuaXphdGlvbiIsCiAgICAgICAgbmFtZTogbmV3c0FydGljbGVBcmcuYXV0aG9yLnN1ck5hbWUsCiAgICAgICAgbG9nbzogewogICAgICAgICAgIkB0eXBlIjogIkltYWdlT2JqZWN0IiwKICAgICAgICAgIHVybDogbmV3c0FydGljbGVBcmcuYXV0aG9yLnN1ck5hbWUKICAgICAgICAgIC8vIFRPRE8KICAgICAgICB9CiAgICAgIH0sCiAgICAgIGRlc2NyaXB0aW9uOiBuZXdzQXJ0aWNsZUFyZy5hdXRob3IuZmlyc3ROYW1lCiAgICB9OwogICAgY29uc3QgbGRUYWcgPSBuZXcgX0pzb25MZFRhZyhuZXdzQXJ0aWNsZUxkKTsKICAgIHJldHVybiBsZFRhZzsKICB9CiAgc3RhdGljIGNyZWF0ZVByb2R1Y3RKc29uTGQocHJvZHVjdEFyZywgcHVibGlzaGVyQXJnKSB7CiAgICBjb25zdCBwcm9kdWN0TGQgPSB7CiAgICAgICJAY29udGV4dCI6ICJodHRwczovL3NjaGVtYS5vcmciLAogICAgICAiQHR5cGUiOiAiU29mdHdhcmVBcHBsaWNhdGlvbiIsCiAgICAgIG5hbWU6IHByb2R1Y3RBcmcubmFtZSwKICAgICAgZGVzY3JpcHRpb246IHByb2R1Y3RBcmcuZGVzY3JpcHRpb24sCiAgICAgIG9wZXJhdGluZ1N5c3RlbTogcHJvZHVjdEFyZy5vcywKICAgICAgYXBwbGljYXRpb25DYXRlZ29yeTogcHJvZHVjdEFyZy5jYXRlZ29yeSwKICAgICAgb2ZmZXJzOiB7CiAgICAgICAgIkB0eXBlIjogIk9mZmVyIiwKICAgICAgICBuYW1lOiAiVXNlci1iYXNlZCBQbGFuIiwKICAgICAgICBwcmljZVNwZWNpZmljYXRpb246IHsKICAgICAgICAgICJAdHlwZSI6ICJQcm9wZXJ0eVZhbHVlU3BlY2lmaWNhdGlvbiIsCiAgICAgICAgICB2YWx1ZU5hbWU6ICJOdW1iZXIgb2YgVXNlcnMiLAogICAgICAgICAgdmFsdWVSZXF1aXJlZDogdHJ1ZSwKICAgICAgICAgIHByaWNlOiAiNC45OSIsCiAgICAgICAgICBwcmljZUN1cnJlbmN5OiAiRVVSIgogICAgICAgIH0KICAgICAgfSwKICAgICAgcHVibGlzaGVyOiB0aGlzLmNyZWF0ZUNvbXBhbnlKc29uTGQocHVibGlzaGVyQXJnKS5lbGVtZW50UmVmLnRleHRDb250ZW50LAogICAgICBzY3JlZW5zaG90OiAiaHR0cHM6Ly93d3cuc29jaWFsLmlvL3NjcmVlbnNob3QucG5nIiwKICAgICAgdXJsOiAiaHR0cHM6Ly93d3cuc29jaWFsLmlvLyIKICAgIH07CiAgICBjb25zdCBsZFRhZyA9IG5ldyBfSnNvbkxkVGFnKHByb2R1Y3RMZCk7CiAgICByZXR1cm4gbGRUYWc7CiAgfQogIC8vIElOU1RBTkNFCiAgY29uc3RydWN0b3IobGRPYmplY3RBcmcpIHsKICAgIHN1cGVyKCk7CiAgICBjb25zdCBqc29uTGRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CiAgICBqc29uTGRFbGVtZW50LnR5cGUgPSAiYXBwbGljYXRpb24vbGQranNvbiI7CiAgICBqc29uTGRFbGVtZW50LnRleHQgPSBKU09OLnN0cmluZ2lmeShsZE9iamVjdEFyZyk7CiAgICB0aGlzLmVsZW1lbnRSZWYgPSBqc29uTGRFbGVtZW50OwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJzZXR1cEAzLjAuMTkvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnNldHVwL2Rpc3RfdHMvd2Vic2V0dXAuY2xhc3Nlcy50YWcub3BlbmdyYXBodGFnLmpzCnZhciBPcGVuZ3JhcGhUYWcgPSBjbGFzcyBfT3BlbmdyYXBoVGFnIGV4dGVuZHMgVGFnIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJPcGVuZ3JhcGhUYWciKTsKICB9CiAgc3RhdGljIGNyZWF0ZU5ld3NBcnRpY2xlT2dUYWdzKG5ld3NBcnRpY2xlQXJnKSB7CiAgICBjb25zdCB0YWdBcnJheSA9IFtdOwogICAgdGFnQXJyYXkucHVzaChuZXcgX09wZW5ncmFwaFRhZygib2c6dXJsIiwgbmV3c0FydGljbGVBcmcudXJsKSk7CiAgICB0YWdBcnJheS5wdXNoKG5ldyBfT3BlbmdyYXBoVGFnKCJvZzp0aXRsZSIsIG5ld3NBcnRpY2xlQXJnLnRpdGxlKSk7CiAgICB0YWdBcnJheS5wdXNoKG5ldyBfT3BlbmdyYXBoVGFnKCJvZzpkZXNjcmlwdGlvbiIsIG5ld3NBcnRpY2xlQXJnLmNvbnRlbnQpKTsKICAgIHRhZ0FycmF5LnB1c2gobmV3IF9PcGVuZ3JhcGhUYWcoIm9nOmltYWdlIiwgbmV3c0FydGljbGVBcmcuZmVhdHVyZWRJbWFnZVVybCkpOwogICAgcmV0dXJuIHRhZ0FycmF5OwogIH0KICBzdGF0aWMgY3JlYXRlUHJvZHVjdE9nVGFncyhwcm9kdWN0QXJnKSB7CiAgICBjb25zdCB0YWdBcnJheSA9IFtdOwogICAgdGFnQXJyYXkucHVzaChuZXcgX09wZW5ncmFwaFRhZygib2c6dXJsIiwgZ2xvYmFsVGhpcy5sb2NhdGlvbi5ocmVmKSk7CiAgICB0YWdBcnJheS5wdXNoKG5ldyBfT3BlbmdyYXBoVGFnKCJvZzp0aXRsZSIsIGAke3Byb2R1Y3RBcmcubmFtZX0gLSAke3Byb2R1Y3RBcmcuc2xvZ2FufWApKTsKICAgIHRhZ0FycmF5LnB1c2gobmV3IF9PcGVuZ3JhcGhUYWcoIm9nOnNpdGVfbmFtZSIsIHByb2R1Y3RBcmcubmFtZSkpOwogICAgdGFnQXJyYXkucHVzaChuZXcgX09wZW5ncmFwaFRhZygib2c6ZGVzY3JpcHRpb24iLCBwcm9kdWN0QXJnLmRlc2NyaXB0aW9uKSk7CiAgICB0YWdBcnJheS5wdXNoKG5ldyBfT3BlbmdyYXBoVGFnKCJvZzppbWFnZSIsIHByb2R1Y3RBcmcubG9nb0xpbmspKTsKICAgIHJldHVybiB0YWdBcnJheTsKICB9CiAgY29uc3RydWN0b3IocHJvcGVydHlOYW1lQXJnLCBjb250ZW50QXJnKSB7CiAgICBzdXBlcigpOwogICAgY29uc3Qgb3BlbkdyYXBoRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm1ldGEiKTsKICAgIG9wZW5HcmFwaEVsZW1lbnQuc2V0QXR0cmlidXRlKCJwcm9wZXJ0eSIsIHByb3BlcnR5TmFtZUFyZyk7CiAgICBvcGVuR3JhcGhFbGVtZW50LmNvbnRlbnQgPSBjb250ZW50QXJnOwogICAgdGhpcy5lbGVtZW50UmVmID0gb3BlbkdyYXBoRWxlbWVudDsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrd2Vic2V0dXBAMy4wLjE5L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJzZXR1cC9kaXN0X3RzL3dlYnNldHVwLmNsYXNzZXMudGFnbGV2ZWwuanMKdmFyIFRhZ0xldmVsID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlRhZ0xldmVsIik7CiAgfQogIHNldCB0aXRsZSh0aXRsZUFyZykgewogICAgdGhpcy50aXRsZVN0b3JlID0gdGl0bGVBcmc7CiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gImVuYWJsZWQiKSB7CiAgICAgIGRvY3VtZW50LnRpdGxlID0gdGhpcy50aXRsZVN0b3JlOwogICAgfQogIH0KICBnZXQgdGl0bGUoKSB7CiAgICByZXR1cm4gdGhpcy50aXRsZVN0b3JlOwogIH0KICBjb25zdHJ1Y3Rvcih0YWdNYW5hZ2VyUmVmQXJnLCBsZXZlbFR5cGUpIHsKICAgIHRoaXMudGFncyA9IFtdOwogICAgdGhpcy5zdGF0ZSA9ICJkaXNhYmxlZCI7CiAgICB0aGlzLnRhZ01hbmFnZXJSZWYgPSB0YWdNYW5hZ2VyUmVmQXJnOwogIH0KICBhZGRUYWcodGFnQXJnKSB7CiAgICBpZiAodGFnQXJnIGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgZm9yIChjb25zdCB0YWdBcmcyIG9mIHRhZ0FyZykgewogICAgICAgIHRoaXMuYWRkVGFnKHRhZ0FyZzIpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB0aGlzLnRhZ3MucHVzaCh0YWdBcmcpOwogICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gImVuYWJsZWQiKSB7CiAgICAgICAgdGFnQXJnLmFwcGVuZFRvRG9tKCk7CiAgICAgIH0KICAgIH0KICB9CiAgYXN5bmMgYWRkQ29tcGFueUluZm8oY29tcGFueURhdGFBcmcpIHsKICAgIHRoaXMuYWRkVGFnKEpzb25MZFRhZy5jcmVhdGVDb21wYW55SnNvbkxkKGNvbXBhbnlEYXRhQXJnKSk7CiAgICB0aGlzLmFkZFRhZyhuZXcgT3BlbmdyYXBoVGFnKCJvZzp0eXBlIiwgImJ1c2luZXNzLmJ1c2luZXNzIikpOwogICAgdGhpcy5hZGRUYWcobmV3IE9wZW5ncmFwaFRhZygib2c6dGl0bGUiLCBjb21wYW55RGF0YUFyZy5uYW1lKSk7CiAgICB0aGlzLmFkZFRhZyhuZXcgT3BlbmdyYXBoVGFnKCJvZzp1cmwiLCBjb21wYW55RGF0YUFyZy5jb250YWN0LndlYnNpdGUpKTsKICAgIHRoaXMuYWRkVGFnKG5ldyBPcGVuZ3JhcGhUYWcoIm9nOmltYWdlIiwgY29tcGFueURhdGFBcmcuY29udGFjdC5sb2dvVXJsKSk7CiAgICB0aGlzLmFkZFRhZyhuZXcgT3BlbmdyYXBoVGFnKCJidXNpbmVzczpjb250YWN0X2RhdGE6c3RyZWV0X2FkZHJlc3MiLCBgJHtjb21wYW55RGF0YUFyZy5jb250YWN0LmFkZHJlc3Muc3RyZWV0TmFtZX0gJHtjb21wYW55RGF0YUFyZy5jb250YWN0LmFkZHJlc3MuaG91c2VOdW1iZXJ9YCkpOwogICAgdGhpcy5hZGRUYWcobmV3IE9wZW5ncmFwaFRhZygiYnVzaW5lc3M6Y29udGFjdF9kYXRhOmxvY2FsaXR5IiwgY29tcGFueURhdGFBcmcuY29udGFjdC5hZGRyZXNzLnBvc3RhbENvZGUpKTsKICAgIHRoaXMuYWRkVGFnKG5ldyBPcGVuZ3JhcGhUYWcoImJ1c2luZXNzOmNvbnRhY3RfZGF0YTpyZWdpb24iLCBjb21wYW55RGF0YUFyZy5jb250YWN0LmFkZHJlc3MuY2l0eSkpOwogICAgdGhpcy5hZGRUYWcobmV3IE9wZW5ncmFwaFRhZygiYnVzaW5lc3M6Y29udGFjdF9kYXRhOnBvc3RhbF9jb2RlIiwgY29tcGFueURhdGFBcmcuY29udGFjdC5hZGRyZXNzLnBvc3RhbENvZGUpKTsKICAgIHRoaXMuYWRkVGFnKG5ldyBPcGVuZ3JhcGhUYWcoImJ1c2luZXNzOmNvbnRhY3RfZGF0YTpjb3VudHJ5X25hbWUiLCBjb21wYW55RGF0YUFyZy5jb250YWN0LmFkZHJlc3MuY291bnRyeSkpOwogIH0KICBhZGROZXdzQXJ0aWNsZUluZm8oYXJ0aWNsZUFyZykgewogICAgdGhpcy5hZGRUYWcoSnNvbkxkVGFnLmNyZWF0ZU5ld3NBcnRpY2xlSnNvbkxkKGFydGljbGVBcmcpKTsKICAgIHRoaXMuYWRkVGFnKE9wZW5ncmFwaFRhZy5jcmVhdGVOZXdzQXJ0aWNsZU9nVGFncyhhcnRpY2xlQXJnKSk7CiAgfQogIGFkZFByb2R1Y3RJbmZvKHByb2R1Y3RBcmcsIGNvbXBhbnlBcmcpIHsKICAgIHRoaXMuYWRkVGFnKEpzb25MZFRhZy5jcmVhdGVQcm9kdWN0SnNvbkxkKHByb2R1Y3RBcmcsIGNvbXBhbnlBcmcpKTsKICAgIHRoaXMuYWRkVGFnKE9wZW5ncmFwaFRhZy5jcmVhdGVQcm9kdWN0T2dUYWdzKHByb2R1Y3RBcmcpKTsKICB9CiAgYXN5bmMgZW5hYmxlKCkgewogICAgaWYgKHRoaXMudGl0bGUpIHsKICAgICAgZG9jdW1lbnQudGl0bGUgPSB0aGlzLnRpdGxlOwogICAgfQogICAgZm9yIChjb25zdCB0YWdBcmcgb2YgdGhpcy50YWdzKSB7CiAgICAgIHRhZ0FyZy5hcHBlbmRUb0RvbSgpOwogICAgfQogICAgdGhpcy5zdGF0ZSA9ICJlbmFibGVkIjsKICB9CiAgYXN5bmMgZGlzYWJsZSgpIHsKICAgIGZvciAoY29uc3QgdGFnQXJnIG9mIHRoaXMudGFncykgewogICAgICB0YWdBcmcucmVtb3ZlRnJvbURvbSgpOwogICAgfQogICAgdGhpcy5zdGF0ZSA9ICJkaXNhYmxlZCI7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnNldHVwQDMuMC4xOS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2Vic2V0dXAvZGlzdF90cy93ZWJzZXR1cC5jbGFzc2VzLnRhZy5tZXRhdGFnLmpzCnZhciBNZXRhVGFnID0gY2xhc3MgZXh0ZW5kcyBUYWcgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIk1ldGFUYWciKTsKICB9CiAgY29uc3RydWN0b3IobWV0YU5hbWVBcmcsIGNvbnRlbnRBcmcpIHsKICAgIHN1cGVyKCk7CiAgICBjb25zdCBtZXRhRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm1ldGEiKTsKICAgIG1ldGFFbGVtZW50Lm5hbWUgPSBtZXRhTmFtZUFyZzsKICAgIG1ldGFFbGVtZW50LmNvbnRlbnQgPSBjb250ZW50QXJnOwogICAgdGhpcy5lbGVtZW50UmVmID0gbWV0YUVsZW1lbnQ7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnNldHVwQDMuMC4xOS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2Vic2V0dXAvZGlzdF90cy93ZWJzZXR1cC5jbGFzc2VzLnRhZ21hbmFnZXIuanMKdmFyIFRhZ01hbmFnZXIgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiVGFnTWFuYWdlciIpOwogIH0KICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMuZ2xvYmFsTGV2ZWwgPSBuZXcgVGFnTGV2ZWwodGhpcywgImdsb2JhbCIpOwogICAgdGhpcy5iYXNlTGV2ZWwgPSBuZXcgVGFnTGV2ZWwodGhpcywgImJhc2UiKTsKICB9CiAgYXN5bmMgc2V0dXAobWV0YU9iamVjdEFyZykgewogICAgdGhpcy5nbG9iYWxMZXZlbC5hZGRUYWcobmV3IE1ldGFUYWcoImdvb2dsZSIsICJub3RyYW5zbGF0ZSIpKTsKICAgIHRoaXMuZ2xvYmFsTGV2ZWwuYWRkVGFnKG5ldyBNZXRhVGFnKCJyZXZpc2l0LWFmdGVyIiwgIjEgZGF5cyIpKTsKICAgIGlmIChtZXRhT2JqZWN0QXJnLnR3aXR0ZXJIYW5kbGUpIHsKICAgICAgdGhpcy5nbG9iYWxMZXZlbC5hZGRUYWcobmV3IE1ldGFUYWcoInR3aXR0ZXI6Y2FyZCIsICJzdW1tYXJ5X2xhcmdlX2ltYWdlIikpOwogICAgICB0aGlzLmdsb2JhbExldmVsLmFkZFRhZyhuZXcgTWV0YVRhZygidHdpdHRlcjpzaXRlIiwgbWV0YU9iamVjdEFyZy50d2l0dGVySGFuZGxlKSk7CiAgICAgIHRoaXMuZ2xvYmFsTGV2ZWwuYWRkVGFnKG5ldyBNZXRhVGFnKCJ0d2l0dGVyOmNyZWF0b3IiLCBtZXRhT2JqZWN0QXJnLnR3aXR0ZXJIYW5kbGUpKTsKICAgIH0KICAgIHRoaXMuYmFzZUxldmVsLnRpdGxlID0gbWV0YU9iamVjdEFyZy50aXRsZTsKICAgIGlmIChtZXRhT2JqZWN0QXJnLmRlc2NyaXB0aW9uKSB7CiAgICAgIHRoaXMuYmFzZUxldmVsLmFkZFRhZyhuZXcgTWV0YVRhZygiZGVzY3JpcHRpb24iLCBtZXRhT2JqZWN0QXJnLmRlc2NyaXB0aW9uKSk7CiAgICB9CiAgICBpZiAobWV0YU9iamVjdEFyZy5jYW5vbmljYWxEb21haW4pIHsKICAgICAgdGhpcy5iYXNlTGV2ZWwuYWRkVGFnKG5ldyBNZXRhVGFnKCJjYW5vbmljYWwiLCBtZXRhT2JqZWN0QXJnLmNhbm9uaWNhbERvbWFpbikpOwogICAgfQogICAgc3dpdGNoICh0cnVlKSB7CiAgICAgIGNhc2UgKG1ldGFPYmplY3RBcmcubGRDb21wYW55ICYmICFtZXRhT2JqZWN0QXJnLmxkUHJvZHVjdCk6CiAgICAgICAgdGhpcy5iYXNlTGV2ZWwuYWRkQ29tcGFueUluZm8obWV0YU9iamVjdEFyZy5sZENvbXBhbnkpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICEhbWV0YU9iamVjdEFyZy5sZFByb2R1Y3Q6CiAgICAgICAgdGhpcy5iYXNlTGV2ZWwuYWRkUHJvZHVjdEluZm8obWV0YU9iamVjdEFyZy5sZFByb2R1Y3QsIG1ldGFPYmplY3RBcmcubGRDb21wYW55KTsKICAgICAgICBicmVhazsKICAgIH0KICAgIGF3YWl0IHRoaXMuZ2xvYmFsTGV2ZWwuZW5hYmxlKCk7CiAgICB0aGlzLmFjdGl2ZUxldmVsID0gdGhpcy5iYXNlTGV2ZWw7CiAgICBhd2FpdCB0aGlzLmFjdGl2ZUxldmVsLmVuYWJsZSgpOwogIH0KICBhc3luYyBzZXRTdWJQYWdlTGV2ZWwobWV0YU9iamVjdEFyZykgewogICAgY29uc3Qgc3ViUGFnZUxldmVsID0gbmV3IFRhZ0xldmVsKHRoaXMsICJzdWJwYWdlIik7CiAgICBzdWJQYWdlTGV2ZWwudGl0bGUgPSBtZXRhT2JqZWN0QXJnLnRpdGxlOwogICAgaWYgKG1ldGFPYmplY3RBcmcuZGVzY3JpcHRpb24pIHsKICAgICAgc3ViUGFnZUxldmVsLmFkZFRhZyhuZXcgTWV0YVRhZygiZGVzY3JpcHRpb24iLCBtZXRhT2JqZWN0QXJnLmRlc2NyaXB0aW9uKSk7CiAgICB9CiAgICBhd2FpdCB0aGlzLmFjdGl2ZUxldmVsLmRpc2FibGUoKTsKICAgIHRoaXMuYWN0aXZlTGV2ZWwgPSBzdWJQYWdlTGV2ZWw7CiAgICBhd2FpdCB0aGlzLmFjdGl2ZUxldmVsLmVuYWJsZSgpOwogICAgcmV0dXJuIHN1YlBhZ2VMZXZlbDsKICB9CiAgYXN5bmMgcmV2ZXJ0VG9CYXNlTGV2ZWwoKSB7CiAgICBpZiAodGhpcy5hY3RpdmVMZXZlbCAhPT0gdGhpcy5iYXNlTGV2ZWwpIHsKICAgICAgYXdhaXQgdGhpcy5hY3RpdmVMZXZlbC5kaXNhYmxlKCk7CiAgICAgIHRoaXMuYWN0aXZlTGV2ZWwgPSB0aGlzLmJhc2VMZXZlbDsKICAgICAgYXdhaXQgdGhpcy5hY3RpdmVMZXZlbC5lbmFibGUoKTsKICAgIH0KICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrd2Vic2V0dXBAMy4wLjE5L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJzZXR1cC9kaXN0X3RzL3dlYnNldHVwLmNsYXNzZXMud2Vic2V0dXAuanMKdmFyIFdlYlNldHVwID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIldlYlNldHVwIik7CiAgfQogIGNvbnN0cnVjdG9yKG9wdGlvbnNBcmcpIHsKICAgIHRoaXMudGFnTWFuYWdlciA9IG5ldyBUYWdNYW5hZ2VyKCk7CiAgICB0aGlzLnJlYWR5RGVmZXJyZWQgPSBkaXN0X3RzX2V4cG9ydHMyMy5kZWZlcigpOwogICAgdGhpcy5yZWFkeUZvclNtYXJ0c3NyRGVmZXJyZWQgPSBkaXN0X3RzX2V4cG9ydHMyMy5kZWZlcigpOwogICAgdGhpcy5yZWFkeVByb21pc2UgPSB0aGlzLnJlYWR5RGVmZXJyZWQucHJvbWlzZTsKICAgIHRoaXMucmVhZHlGb3JTbWFydHNzclByb21pc2UgPSB0aGlzLnJlYWR5Rm9yU21hcnRzc3JEZWZlcnJlZC5wcm9taXNlOwogICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc0FyZzsKICAgIHRoaXMuc2V0dXAoKS50aGVuKCgpID0+IHsKICAgICAgdGhpcy5yZWFkeURlZmVycmVkLnJlc29sdmUoKTsKICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuc21hcnRzc3JXYWl0Rm9yUmVhZHlTaWduYWwpIHsKICAgICAgICB0aGlzLnJlYWR5Rm9yU21hcnRzc3JEZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgIH0KICAgIH0pOwogIH0KICAvKioKICAgKiBhbiBhc3luYyBzZXR1cCBjYWxsZWQgYnkgdGhlIGNvbnN0cnVjdG9yCiAgICovCiAgYXN5bmMgc2V0dXAob3B0aW9uc0FyZykgewogICAgaWYgKG9wdGlvbnNBcmcpIHsKICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc0FyZzsKICAgIH0KICAgIGF3YWl0IHRoaXMudGFnTWFuYWdlci5zZXR1cCh0aGlzLm9wdGlvbnMubWV0YU9iamVjdCk7CiAgfQogIC8qKgogICAqIHJldmVydHMgdGhlIGFjdGl2ZSBsZXZlbCBhbmQgcmV0dXJucyB0byB0aGUgYmFzZSBsZXZlbAogICAqLwogIHJldmVydFRvQmFzZUxldmVsKCkgewogICAgdGhpcy50YWdNYW5hZ2VyLnJldmVydFRvQmFzZUxldmVsKCk7CiAgfQogIC8qKgogICAqIHNldHMgYSBzdWJwYWdlCiAgICogQHBhcmFtIG1ldGFPYmplY3RBcmcKICAgKi8KICBhc3luYyBzZXRTdWJMZXZlbChtZXRhT2JqZWN0QXJnKSB7CiAgICBjb25zdCBzdWJMZXZlbCA9IGF3YWl0IHRoaXMudGFnTWFuYWdlci5zZXRTdWJQYWdlTGV2ZWwobWV0YU9iamVjdEFyZyk7CiAgICByZXR1cm4gc3ViTGV2ZWw7CiAgfQogIC8qKgogICAqIGZsYXNoZXMgdGhlIHRpdGxlIHdpdGggdGhlIGdpdmVuIHRleHQKICAgKiBAcGFyYW0gZmxhc2hUZXh0QXJnCiAgICovCiAgZmxhc2hUaXRsZShmbGFzaFRleHRBcmcpIHsKICB9CiAgLyoqCiAgICogaW5mb3JtcyBzbWFydHNzciB0aGF0IHRoZSBwYWdlIGlzIHJlYWR5IHRvIGJlIHJlbmRlcmVkCiAgICovCiAgaW5mb3JtUmVhZHlGb3JTbWFydHNzcigpIHsKICAgIGlmICghdGhpcy5vcHRpb25zLnNtYXJ0c3NyV2FpdEZvclJlYWR5U2lnbmFsKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoYFlvdSBoYXZlIG5vdCBpbmRpY2F0ZWQgdGhhdCB5b3UgaW5mb3JtIHNtYXJ0c3NyIGJ5IGEgZGVkaWNhdGVkIHNpZ25hbCEgUGxlYXNlIGNvbnNpZGVyIGRvaW5nIHNvIWApOwogICAgfQogICAgdGhpcy5yZWFkeUZvclNtYXJ0c3NyRGVmZXJyZWQucmVzb2x2ZSgpOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJzZXR1cEAzLjAuMTkvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnNldHVwL2Rpc3RfdHMvd2Vic2V0dXAuY2xhc3Nlcy50aXRsZS5qcwp2YXIgVGl0bGUgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiVGl0bGUiKTsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRlbXBmaXgrbGVuaXNAMS4zLjIwL25vZGVfbW9kdWxlcy9AdGVtcGZpeC9sZW5pcy9kaXN0L2xlbmlzLm1qcwp2YXIgdmVyc2lvbiA9ICIxLjMuMTciOwpmdW5jdGlvbiBjbGFtcDIobWluMywgaW5wdXQsIG1heDMpIHsKICByZXR1cm4gTWF0aC5tYXgobWluMywgTWF0aC5taW4oaW5wdXQsIG1heDMpKTsKfQpfX25hbWUoY2xhbXAyLCAiY2xhbXAiKTsKZnVuY3Rpb24gbGVycCh4MywgeTMsIHQ4KSB7CiAgcmV0dXJuICgxIC0gdDgpICogeDMgKyB0OCAqIHkzOwp9Cl9fbmFtZShsZXJwLCAibGVycCIpOwpmdW5jdGlvbiBkYW1wKHgzLCB5MywgbGFtYmRhLCBkZWx0YVRpbWUpIHsKICByZXR1cm4gbGVycCh4MywgeTMsIDEgLSBNYXRoLmV4cCgtbGFtYmRhICogZGVsdGFUaW1lKSk7Cn0KX19uYW1lKGRhbXAsICJkYW1wIik7CmZ1bmN0aW9uIG1vZHVsbyhuMTEsIGQ0KSB7CiAgcmV0dXJuIChuMTEgJSBkNCArIGQ0KSAlIGQ0Owp9Cl9fbmFtZShtb2R1bG8sICJtb2R1bG8iKTsKdmFyIEFuaW1hdGUgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiQW5pbWF0ZSIpOwogIH0KICBpc1J1bm5pbmcgPSBmYWxzZTsKICB2YWx1ZSA9IDA7CiAgZnJvbSA9IDA7CiAgdG8gPSAwOwogIGN1cnJlbnRUaW1lID0gMDsKICAvLyBUaGVzZSBhcmUgaW5zdGFuY2lhdGVkIGluIHRoZSBmcm9tVG8gbWV0aG9kCiAgbGVycDsKICBkdXJhdGlvbjsKICBlYXNpbmc7CiAgb25VcGRhdGU7CiAgLyoqCiAgICogQWR2YW5jZSB0aGUgYW5pbWF0aW9uIGJ5IHRoZSBnaXZlbiBkZWx0YSB0aW1lCiAgICoKICAgKiBAcGFyYW0gZGVsdGFUaW1lIC0gVGhlIHRpbWUgaW4gc2Vjb25kcyB0byBhZHZhbmNlIHRoZSBhbmltYXRpb24KICAgKi8KICBhZHZhbmNlKGRlbHRhVGltZSkgewogICAgaWYgKCF0aGlzLmlzUnVubmluZykgcmV0dXJuOwogICAgbGV0IGNvbXBsZXRlZCA9IGZhbHNlOwogICAgaWYgKHRoaXMuZHVyYXRpb24gJiYgdGhpcy5lYXNpbmcpIHsKICAgICAgdGhpcy5jdXJyZW50VGltZSArPSBkZWx0YVRpbWU7CiAgICAgIGNvbnN0IGxpbmVhclByb2dyZXNzID0gY2xhbXAyKDAsIHRoaXMuY3VycmVudFRpbWUgLyB0aGlzLmR1cmF0aW9uLCAxKTsKICAgICAgY29tcGxldGVkID0gbGluZWFyUHJvZ3Jlc3MgPj0gMTsKICAgICAgY29uc3QgZWFzZWRQcm9ncmVzcyA9IGNvbXBsZXRlZCA/IDEgOiB0aGlzLmVhc2luZyhsaW5lYXJQcm9ncmVzcyk7CiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLmZyb20gKyAodGhpcy50byAtIHRoaXMuZnJvbSkgKiBlYXNlZFByb2dyZXNzOwogICAgfSBlbHNlIGlmICh0aGlzLmxlcnApIHsKICAgICAgdGhpcy52YWx1ZSA9IGRhbXAodGhpcy52YWx1ZSwgdGhpcy50bywgdGhpcy5sZXJwICogNjAsIGRlbHRhVGltZSk7CiAgICAgIGlmIChNYXRoLnJvdW5kKHRoaXMudmFsdWUpID09PSB0aGlzLnRvKSB7CiAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMudG87CiAgICAgICAgY29tcGxldGVkID0gdHJ1ZTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGhpcy52YWx1ZSA9IHRoaXMudG87CiAgICAgIGNvbXBsZXRlZCA9IHRydWU7CiAgICB9CiAgICBpZiAoY29tcGxldGVkKSB7CiAgICAgIHRoaXMuc3RvcCgpOwogICAgfQogICAgdGhpcy5vblVwZGF0ZT8uKHRoaXMudmFsdWUsIGNvbXBsZXRlZCk7CiAgfQogIC8qKiBTdG9wIHRoZSBhbmltYXRpb24gKi8KICBzdG9wKCkgewogICAgdGhpcy5pc1J1bm5pbmcgPSBmYWxzZTsKICB9CiAgLyoqCiAgICogU2V0IHVwIHRoZSBhbmltYXRpb24gZnJvbSBhIHN0YXJ0aW5nIHZhbHVlIHRvIGFuIGVuZGluZyB2YWx1ZQogICAqIHdpdGggb3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgbGVycGluZywgZHVyYXRpb24sIGVhc2luZywgYW5kIG9uVXBkYXRlIGNhbGxiYWNrCiAgICoKICAgKiBAcGFyYW0gZnJvbSAtIFRoZSBzdGFydGluZyB2YWx1ZQogICAqIEBwYXJhbSB0byAtIFRoZSBlbmRpbmcgdmFsdWUKICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSBhbmltYXRpb24KICAgKi8KICBmcm9tVG8oZnJvbTIsIHRvLCB7IGxlcnA6IGxlcnAyLCBkdXJhdGlvbiwgZWFzaW5nLCBvblN0YXJ0LCBvblVwZGF0ZSB9KSB7CiAgICB0aGlzLmZyb20gPSB0aGlzLnZhbHVlID0gZnJvbTI7CiAgICB0aGlzLnRvID0gdG87CiAgICB0aGlzLmxlcnAgPSBsZXJwMjsKICAgIHRoaXMuZHVyYXRpb24gPSBkdXJhdGlvbjsKICAgIHRoaXMuZWFzaW5nID0gZWFzaW5nOwogICAgdGhpcy5jdXJyZW50VGltZSA9IDA7CiAgICB0aGlzLmlzUnVubmluZyA9IHRydWU7CiAgICBvblN0YXJ0Py4oKTsKICAgIHRoaXMub25VcGRhdGUgPSBvblVwZGF0ZTsKICB9Cn07CmZ1bmN0aW9uIGRlYm91bmNlMihjYWxsYmFjaywgZGVsYXkyKSB7CiAgbGV0IHRpbWVyMjsKICByZXR1cm4gZnVuY3Rpb24oLi4uYXJncykgewogICAgbGV0IGNvbnRleHQyID0gdGhpczsKICAgIGNsZWFyVGltZW91dCh0aW1lcjIpOwogICAgdGltZXIyID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgIHRpbWVyMiA9IHZvaWQgMDsKICAgICAgY2FsbGJhY2suYXBwbHkoY29udGV4dDIsIGFyZ3MpOwogICAgfSwgZGVsYXkyKTsKICB9Owp9Cl9fbmFtZShkZWJvdW5jZTIsICJkZWJvdW5jZSIpOwp2YXIgRGltZW5zaW9ucyA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJEaW1lbnNpb25zIik7CiAgfQogIGNvbnN0cnVjdG9yKHdyYXBwZXIsIGNvbnRlbnQzLCB7IGF1dG9SZXNpemUgPSB0cnVlLCBkZWJvdW5jZTogZGVib3VuY2VWYWx1ZSA9IDI1MCB9ID0ge30pIHsKICAgIHRoaXMud3JhcHBlciA9IHdyYXBwZXI7CiAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50MzsKICAgIGlmIChhdXRvUmVzaXplKSB7CiAgICAgIHRoaXMuZGVib3VuY2VkUmVzaXplID0gZGVib3VuY2UyKHRoaXMucmVzaXplLCBkZWJvdW5jZVZhbHVlKTsKICAgICAgaWYgKHRoaXMud3JhcHBlciBpbnN0YW5jZW9mIFdpbmRvdykgewogICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLCB0aGlzLmRlYm91bmNlZFJlc2l6ZSwgZmFsc2UpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMud3JhcHBlclJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKHRoaXMuZGVib3VuY2VkUmVzaXplKTsKICAgICAgICB0aGlzLndyYXBwZXJSZXNpemVPYnNlcnZlci5vYnNlcnZlKHRoaXMud3JhcHBlcik7CiAgICAgIH0KICAgICAgdGhpcy5jb250ZW50UmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIodGhpcy5kZWJvdW5jZWRSZXNpemUpOwogICAgICB0aGlzLmNvbnRlbnRSZXNpemVPYnNlcnZlci5vYnNlcnZlKHRoaXMuY29udGVudCk7CiAgICB9CiAgICB0aGlzLnJlc2l6ZSgpOwogIH0KICB3aWR0aCA9IDA7CiAgaGVpZ2h0ID0gMDsKICBzY3JvbGxIZWlnaHQgPSAwOwogIHNjcm9sbFdpZHRoID0gMDsKICAvLyBUaGVzZSBhcmUgaW5zdGFuY2lhdGVkIGluIHRoZSBjb25zdHJ1Y3RvciBhcyB0aGV5IG5lZWQgaW5mb3JtYXRpb24gZnJvbSB0aGUgb3B0aW9ucwogIGRlYm91bmNlZFJlc2l6ZTsKICB3cmFwcGVyUmVzaXplT2JzZXJ2ZXI7CiAgY29udGVudFJlc2l6ZU9ic2VydmVyOwogIGRlc3Ryb3koKSB7CiAgICB0aGlzLndyYXBwZXJSZXNpemVPYnNlcnZlcj8uZGlzY29ubmVjdCgpOwogICAgdGhpcy5jb250ZW50UmVzaXplT2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTsKICAgIGlmICh0aGlzLndyYXBwZXIgPT09IHdpbmRvdyAmJiB0aGlzLmRlYm91bmNlZFJlc2l6ZSkgewogICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIiwgdGhpcy5kZWJvdW5jZWRSZXNpemUsIGZhbHNlKTsKICAgIH0KICB9CiAgcmVzaXplID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoKSA9PiB7CiAgICB0aGlzLm9uV3JhcHBlclJlc2l6ZSgpOwogICAgdGhpcy5vbkNvbnRlbnRSZXNpemUoKTsKICB9LCAicmVzaXplIik7CiAgb25XcmFwcGVyUmVzaXplID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoKSA9PiB7CiAgICBpZiAodGhpcy53cmFwcGVyIGluc3RhbmNlb2YgV2luZG93KSB7CiAgICAgIHRoaXMud2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDsKICAgICAgdGhpcy5oZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7CiAgICB9IGVsc2UgewogICAgICB0aGlzLndpZHRoID0gdGhpcy53cmFwcGVyLmNsaWVudFdpZHRoOwogICAgICB0aGlzLmhlaWdodCA9IHRoaXMud3JhcHBlci5jbGllbnRIZWlnaHQ7CiAgICB9CiAgfSwgIm9uV3JhcHBlclJlc2l6ZSIpOwogIG9uQ29udGVudFJlc2l6ZSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKCkgPT4gewogICAgaWYgKHRoaXMud3JhcHBlciBpbnN0YW5jZW9mIFdpbmRvdykgewogICAgICB0aGlzLnNjcm9sbEhlaWdodCA9IHRoaXMuY29udGVudC5zY3JvbGxIZWlnaHQ7CiAgICAgIHRoaXMuc2Nyb2xsV2lkdGggPSB0aGlzLmNvbnRlbnQuc2Nyb2xsV2lkdGg7CiAgICB9IGVsc2UgewogICAgICB0aGlzLnNjcm9sbEhlaWdodCA9IHRoaXMud3JhcHBlci5zY3JvbGxIZWlnaHQ7CiAgICAgIHRoaXMuc2Nyb2xsV2lkdGggPSB0aGlzLndyYXBwZXIuc2Nyb2xsV2lkdGg7CiAgICB9CiAgfSwgIm9uQ29udGVudFJlc2l6ZSIpOwogIGdldCBsaW1pdCgpIHsKICAgIHJldHVybiB7CiAgICAgIHg6IHRoaXMuc2Nyb2xsV2lkdGggLSB0aGlzLndpZHRoLAogICAgICB5OiB0aGlzLnNjcm9sbEhlaWdodCAtIHRoaXMuaGVpZ2h0CiAgICB9OwogIH0KfTsKdmFyIEVtaXR0ZXIgPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiRW1pdHRlciIpOwogIH0KICBldmVudHMgPSB7fTsKICAvKioKICAgKiBFbWl0IGFuIGV2ZW50IHdpdGggdGhlIGdpdmVuIGRhdGEKICAgKiBAcGFyYW0gZXZlbnQgRXZlbnQgbmFtZQogICAqIEBwYXJhbSBhcmdzIERhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgaGFuZGxlcnMKICAgKi8KICBlbWl0KGV2ZW50LCAuLi5hcmdzKSB7CiAgICBsZXQgY2FsbGJhY2tzID0gdGhpcy5ldmVudHNbZXZlbnRdIHx8IFtdOwogICAgZm9yIChsZXQgaTEwID0gMCwgbGVuZ3RoID0gY2FsbGJhY2tzLmxlbmd0aDsgaTEwIDwgbGVuZ3RoOyBpMTArKykgewogICAgICBjYWxsYmFja3NbaTEwXT8uKC4uLmFyZ3MpOwogICAgfQogIH0KICAvKioKICAgKiBBZGQgYSBjYWxsYmFjayB0byB0aGUgZXZlbnQKICAgKiBAcGFyYW0gZXZlbnQgRXZlbnQgbmFtZQogICAqIEBwYXJhbSBjYiBDYWxsYmFjayBmdW5jdGlvbgogICAqIEByZXR1cm5zIFVuc3Vic2NyaWJlIGZ1bmN0aW9uCiAgICovCiAgb24oZXZlbnQsIGNiKSB7CiAgICB0aGlzLmV2ZW50c1tldmVudF0/LnB1c2goY2IpIHx8ICh0aGlzLmV2ZW50c1tldmVudF0gPSBbY2JdKTsKICAgIHJldHVybiAoKSA9PiB7CiAgICAgIHRoaXMuZXZlbnRzW2V2ZW50XSA9IHRoaXMuZXZlbnRzW2V2ZW50XT8uZmlsdGVyKChpMTApID0+IGNiICE9PSBpMTApOwogICAgfTsKICB9CiAgLyoqCiAgICogUmVtb3ZlIGEgY2FsbGJhY2sgZnJvbSB0aGUgZXZlbnQKICAgKiBAcGFyYW0gZXZlbnQgRXZlbnQgbmFtZQogICAqIEBwYXJhbSBjYWxsYmFjayBDYWxsYmFjayBmdW5jdGlvbgogICAqLwogIG9mZihldmVudCwgY2FsbGJhY2spIHsKICAgIHRoaXMuZXZlbnRzW2V2ZW50XSA9IHRoaXMuZXZlbnRzW2V2ZW50XT8uZmlsdGVyKChpMTApID0+IGNhbGxiYWNrICE9PSBpMTApOwogIH0KICAvKioKICAgKiBSZW1vdmUgYWxsIGV2ZW50IGxpc3RlbmVycyBhbmQgY2xlYW4gdXAKICAgKi8KICBkZXN0cm95KCkgewogICAgdGhpcy5ldmVudHMgPSB7fTsKICB9Cn07CnZhciBMSU5FX0hFSUdIVCA9IDEwMCAvIDY7CnZhciBsaXN0ZW5lck9wdGlvbnMgPSB7IHBhc3NpdmU6IGZhbHNlIH07CnZhciBWaXJ0dWFsU2Nyb2xsID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlZpcnR1YWxTY3JvbGwiKTsKICB9CiAgY29uc3RydWN0b3IoZWxlbWVudDQsIG9wdGlvbnMgPSB7IHdoZWVsTXVsdGlwbGllcjogMSwgdG91Y2hNdWx0aXBsaWVyOiAxIH0pIHsKICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ0OwogICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLCB0aGlzLm9uV2luZG93UmVzaXplLCBmYWxzZSk7CiAgICB0aGlzLm9uV2luZG93UmVzaXplKCk7CiAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigid2hlZWwiLCB0aGlzLm9uV2hlZWwsIGxpc3RlbmVyT3B0aW9ucyk7CiAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICAgInRvdWNoc3RhcnQiLAogICAgICB0aGlzLm9uVG91Y2hTdGFydCwKICAgICAgbGlzdGVuZXJPcHRpb25zCiAgICApOwogICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoCiAgICAgICJ0b3VjaG1vdmUiLAogICAgICB0aGlzLm9uVG91Y2hNb3ZlLAogICAgICBsaXN0ZW5lck9wdGlvbnMKICAgICk7CiAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLCB0aGlzLm9uVG91Y2hFbmQsIGxpc3RlbmVyT3B0aW9ucyk7CiAgfQogIHRvdWNoU3RhcnQgPSB7CiAgICB4OiAwLAogICAgeTogMAogIH07CiAgbGFzdERlbHRhID0gewogICAgeDogMCwKICAgIHk6IDAKICB9OwogIHdpbmRvdyA9IHsKICAgIHdpZHRoOiAwLAogICAgaGVpZ2h0OiAwCiAgfTsKICBlbWl0dGVyID0gbmV3IEVtaXR0ZXIoKTsKICAvKioKICAgKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXIgZm9yIHRoZSBnaXZlbiBldmVudCBhbmQgY2FsbGJhY2sKICAgKgogICAqIEBwYXJhbSBldmVudCBFdmVudCBuYW1lCiAgICogQHBhcmFtIGNhbGxiYWNrIENhbGxiYWNrIGZ1bmN0aW9uCiAgICovCiAgb24oZXZlbnQsIGNhbGxiYWNrKSB7CiAgICByZXR1cm4gdGhpcy5lbWl0dGVyLm9uKGV2ZW50LCBjYWxsYmFjayk7CiAgfQogIC8qKiBSZW1vdmUgYWxsIGV2ZW50IGxpc3RlbmVycyBhbmQgY2xlYW4gdXAgKi8KICBkZXN0cm95KCkgewogICAgdGhpcy5lbWl0dGVyLmRlc3Ryb3koKTsKICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJyZXNpemUiLCB0aGlzLm9uV2luZG93UmVzaXplLCBmYWxzZSk7CiAgICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigid2hlZWwiLCB0aGlzLm9uV2hlZWwsIGxpc3RlbmVyT3B0aW9ucyk7CiAgICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigKICAgICAgInRvdWNoc3RhcnQiLAogICAgICB0aGlzLm9uVG91Y2hTdGFydCwKICAgICAgbGlzdGVuZXJPcHRpb25zCiAgICApOwogICAgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoCiAgICAgICJ0b3VjaG1vdmUiLAogICAgICB0aGlzLm9uVG91Y2hNb3ZlLAogICAgICBsaXN0ZW5lck9wdGlvbnMKICAgICk7CiAgICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigKICAgICAgInRvdWNoZW5kIiwKICAgICAgdGhpcy5vblRvdWNoRW5kLAogICAgICBsaXN0ZW5lck9wdGlvbnMKICAgICk7CiAgfQogIC8qKgogICAqIEV2ZW50IGhhbmRsZXIgZm9yICd0b3VjaHN0YXJ0JyBldmVudAogICAqCiAgICogQHBhcmFtIGV2ZW50IFRvdWNoIGV2ZW50CiAgICovCiAgb25Ub3VjaFN0YXJ0ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoZXZlbnQpID0+IHsKICAgIGNvbnN0IHsgY2xpZW50WCwgY2xpZW50WSB9ID0gZXZlbnQudGFyZ2V0VG91Y2hlcyA/IGV2ZW50LnRhcmdldFRvdWNoZXNbMF0gOiBldmVudDsKICAgIHRoaXMudG91Y2hTdGFydC54ID0gY2xpZW50WDsKICAgIHRoaXMudG91Y2hTdGFydC55ID0gY2xpZW50WTsKICAgIHRoaXMubGFzdERlbHRhID0gewogICAgICB4OiAwLAogICAgICB5OiAwCiAgICB9OwogICAgdGhpcy5lbWl0dGVyLmVtaXQoInNjcm9sbCIsIHsKICAgICAgZGVsdGFYOiAwLAogICAgICBkZWx0YVk6IDAsCiAgICAgIGV2ZW50CiAgICB9KTsKICB9LCAib25Ub3VjaFN0YXJ0Iik7CiAgLyoqIEV2ZW50IGhhbmRsZXIgZm9yICd0b3VjaG1vdmUnIGV2ZW50ICovCiAgb25Ub3VjaE1vdmUgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChldmVudCkgPT4gewogICAgY29uc3QgeyBjbGllbnRYLCBjbGllbnRZIH0gPSBldmVudC50YXJnZXRUb3VjaGVzID8gZXZlbnQudGFyZ2V0VG91Y2hlc1swXSA6IGV2ZW50OwogICAgY29uc3QgZGVsdGFYID0gLShjbGllbnRYIC0gdGhpcy50b3VjaFN0YXJ0LngpICogdGhpcy5vcHRpb25zLnRvdWNoTXVsdGlwbGllcjsKICAgIGNvbnN0IGRlbHRhWSA9IC0oY2xpZW50WSAtIHRoaXMudG91Y2hTdGFydC55KSAqIHRoaXMub3B0aW9ucy50b3VjaE11bHRpcGxpZXI7CiAgICB0aGlzLnRvdWNoU3RhcnQueCA9IGNsaWVudFg7CiAgICB0aGlzLnRvdWNoU3RhcnQueSA9IGNsaWVudFk7CiAgICB0aGlzLmxhc3REZWx0YSA9IHsKICAgICAgeDogZGVsdGFYLAogICAgICB5OiBkZWx0YVkKICAgIH07CiAgICB0aGlzLmVtaXR0ZXIuZW1pdCgic2Nyb2xsIiwgewogICAgICBkZWx0YVgsCiAgICAgIGRlbHRhWSwKICAgICAgZXZlbnQKICAgIH0pOwogIH0sICJvblRvdWNoTW92ZSIpOwogIG9uVG91Y2hFbmQgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChldmVudCkgPT4gewogICAgdGhpcy5lbWl0dGVyLmVtaXQoInNjcm9sbCIsIHsKICAgICAgZGVsdGFYOiB0aGlzLmxhc3REZWx0YS54LAogICAgICBkZWx0YVk6IHRoaXMubGFzdERlbHRhLnksCiAgICAgIGV2ZW50CiAgICB9KTsKICB9LCAib25Ub3VjaEVuZCIpOwogIC8qKiBFdmVudCBoYW5kbGVyIGZvciAnd2hlZWwnIGV2ZW50ICovCiAgb25XaGVlbCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGV2ZW50KSA9PiB7CiAgICBsZXQgeyBkZWx0YVgsIGRlbHRhWSwgZGVsdGFNb2RlIH0gPSBldmVudDsKICAgIGNvbnN0IG11bHRpcGxpZXJYID0gZGVsdGFNb2RlID09PSAxID8gTElORV9IRUlHSFQgOiBkZWx0YU1vZGUgPT09IDIgPyB0aGlzLndpbmRvdy53aWR0aCA6IDE7CiAgICBjb25zdCBtdWx0aXBsaWVyWSA9IGRlbHRhTW9kZSA9PT0gMSA/IExJTkVfSEVJR0hUIDogZGVsdGFNb2RlID09PSAyID8gdGhpcy53aW5kb3cuaGVpZ2h0IDogMTsKICAgIGRlbHRhWCAqPSBtdWx0aXBsaWVyWDsKICAgIGRlbHRhWSAqPSBtdWx0aXBsaWVyWTsKICAgIGRlbHRhWCAqPSB0aGlzLm9wdGlvbnMud2hlZWxNdWx0aXBsaWVyOwogICAgZGVsdGFZICo9IHRoaXMub3B0aW9ucy53aGVlbE11bHRpcGxpZXI7CiAgICB0aGlzLmVtaXR0ZXIuZW1pdCgic2Nyb2xsIiwgeyBkZWx0YVgsIGRlbHRhWSwgZXZlbnQgfSk7CiAgfSwgIm9uV2hlZWwiKTsKICBvbldpbmRvd1Jlc2l6ZSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKCkgPT4gewogICAgdGhpcy53aW5kb3cgPSB7CiAgICAgIHdpZHRoOiB3aW5kb3cuaW5uZXJXaWR0aCwKICAgICAgaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQKICAgIH07CiAgfSwgIm9uV2luZG93UmVzaXplIik7Cn07CnZhciBkZWZhdWx0RWFzaW5nID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgodDgpID0+IE1hdGgubWluKDEsIDEuMDAxIC0gTWF0aC5wb3coMiwgLTEwICogdDgpKSwgImRlZmF1bHRFYXNpbmciKTsKdmFyIExlbmlzID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIkxlbmlzIik7CiAgfQogIF9pc1Njcm9sbGluZyA9IGZhbHNlOwogIC8vIHRydWUgd2hlbiBzY3JvbGwgaXMgYW5pbWF0aW5nCiAgX2lzU3RvcHBlZCA9IGZhbHNlOwogIC8vIHRydWUgaWYgdXNlciBzaG91bGQgbm90IGJlIGFibGUgdG8gc2Nyb2xsIC0gZW5hYmxlL2Rpc2FibGUgcHJvZ3JhbW1hdGljYWxseQogIF9pc0xvY2tlZCA9IGZhbHNlOwogIC8vIHNhbWUgYXMgaXNTdG9wcGVkIGJ1dCBlbmFibGVkL2Rpc2FibGVkIHdoZW4gc2Nyb2xsIHJlYWNoZXMgdGFyZ2V0CiAgX3ByZXZlbnROZXh0TmF0aXZlU2Nyb2xsRXZlbnQgPSBmYWxzZTsKICBfcmVzZXRWZWxvY2l0eVRpbWVvdXQgPSBudWxsOwogIF9yYWZJZCA9IG51bGw7CiAgLyoqCiAgICogV2hldGhlciBvciBub3QgdGhlIHVzZXIgaXMgdG91Y2hpbmcgdGhlIHNjcmVlbgogICAqLwogIGlzVG91Y2hpbmc7CiAgLyoqCiAgICogVGhlIHRpbWUgaW4gbXMgc2luY2UgdGhlIGxlbmlzIGluc3RhbmNlIHdhcyBjcmVhdGVkCiAgICovCiAgdGltZSA9IDA7CiAgLyoqCiAgICogVXNlciBkYXRhIHRoYXQgd2lsbCBiZSBmb3J3YXJkZWQgdGhyb3VnaCB0aGUgc2Nyb2xsIGV2ZW50CiAgICoKICAgKiBAZXhhbXBsZQogICAqIGxlbmlzLnNjcm9sbFRvKDEwMCwgewogICAqICAgdXNlckRhdGE6IHsKICAgKiAgICAgZm9vOiAnYmFyJwogICAqICAgfQogICAqIH0pCiAgICovCiAgdXNlckRhdGEgPSB7fTsKICAvKioKICAgKiBUaGUgbGFzdCB2ZWxvY2l0eSBvZiB0aGUgc2Nyb2xsCiAgICovCiAgbGFzdFZlbG9jaXR5ID0gMDsKICAvKioKICAgKiBUaGUgY3VycmVudCB2ZWxvY2l0eSBvZiB0aGUgc2Nyb2xsCiAgICovCiAgdmVsb2NpdHkgPSAwOwogIC8qKgogICAqIFRoZSBkaXJlY3Rpb24gb2YgdGhlIHNjcm9sbAogICAqLwogIGRpcmVjdGlvbiA9IDA7CiAgLyoqCiAgICogVGhlIG9wdGlvbnMgcGFzc2VkIHRvIHRoZSBsZW5pcyBpbnN0YW5jZQogICAqLwogIG9wdGlvbnM7CiAgLyoqCiAgICogVGhlIHRhcmdldCBzY3JvbGwgdmFsdWUKICAgKi8KICB0YXJnZXRTY3JvbGw7CiAgLyoqCiAgICogVGhlIGFuaW1hdGVkIHNjcm9sbCB2YWx1ZQogICAqLwogIGFuaW1hdGVkU2Nyb2xsOwogIC8vIFRoZXNlIGFyZSBpbnN0YW5jaWF0ZWQgaGVyZSBhcyB0aGV5IGRvbid0IG5lZWQgaW5mb3JtYXRpb24gZnJvbSB0aGUgb3B0aW9ucwogIGFuaW1hdGUgPSBuZXcgQW5pbWF0ZSgpOwogIGVtaXR0ZXIgPSBuZXcgRW1pdHRlcigpOwogIC8vIFRoZXNlIGFyZSBpbnN0YW5jaWF0ZWQgaW4gdGhlIGNvbnN0cnVjdG9yIGFzIHRoZXkgbmVlZCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvcHRpb25zCiAgZGltZW5zaW9uczsKICAvLyBUaGlzIGlzIG5vdCBwcml2YXRlIGJlY2F1c2UgaXQncyB1c2VkIGluIHRoZSBTbmFwIGNsYXNzCiAgdmlydHVhbFNjcm9sbDsKICBjb25zdHJ1Y3Rvcih7CiAgICB3cmFwcGVyID0gd2luZG93LAogICAgY29udGVudDogY29udGVudDMgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsCiAgICBldmVudHNUYXJnZXQgPSB3cmFwcGVyLAogICAgc21vb3RoV2hlZWwgPSB0cnVlLAogICAgc3luY1RvdWNoID0gZmFsc2UsCiAgICBzeW5jVG91Y2hMZXJwID0gMC4wNzUsCiAgICB0b3VjaEluZXJ0aWFFeHBvbmVudCA9IDEuNywKICAgIGR1cmF0aW9uLAogICAgLy8gaW4gc2Vjb25kcwogICAgZWFzaW5nLAogICAgbGVycDogbGVycDIgPSAwLjEsCiAgICBpbmZpbml0ZSA9IGZhbHNlLAogICAgb3JpZW50YXRpb24gPSAidmVydGljYWwiLAogICAgLy8gdmVydGljYWwsIGhvcml6b250YWwKICAgIGdlc3R1cmVPcmllbnRhdGlvbiA9IG9yaWVudGF0aW9uID09PSAiaG9yaXpvbnRhbCIgPyAiYm90aCIgOiAidmVydGljYWwiLAogICAgLy8gdmVydGljYWwsIGhvcml6b250YWwsIGJvdGgKICAgIHRvdWNoTXVsdGlwbGllciA9IDEsCiAgICB3aGVlbE11bHRpcGxpZXIgPSAxLAogICAgYXV0b1Jlc2l6ZSA9IHRydWUsCiAgICBwcmV2ZW50LAogICAgdmlydHVhbFNjcm9sbCwKICAgIG92ZXJzY3JvbGwgPSB0cnVlLAogICAgYXV0b1JhZiA9IGZhbHNlLAogICAgYW5jaG9ycyA9IGZhbHNlLAogICAgYXV0b1RvZ2dsZSA9IGZhbHNlLAogICAgLy8gaHR0cHM6Ly9jYW5pdXNlLmNvbS8/c2VhcmNoPXRyYW5zaXRpb24tYmVoYXZpb3IKICAgIGFsbG93TmVzdGVkU2Nyb2xsID0gZmFsc2UsCiAgICAvLyBAdHMtaWdub3JlOiB0aGlzIHdpbGwgYmUgZGVwcmVjYXRlZCBpbiB0aGUgZnV0dXJlCiAgICBfX2V4cGVyaW1lbnRhbF9fbmFpdmVEaW1lbnNpb25zID0gZmFsc2UsCiAgICBuYWl2ZURpbWVuc2lvbnMgPSBfX2V4cGVyaW1lbnRhbF9fbmFpdmVEaW1lbnNpb25zLAogICAgc3RvcEluZXJ0aWFPbk5hdmlnYXRlID0gZmFsc2UKICB9ID0ge30pIHsKICAgIHdpbmRvdy5sZW5pc1ZlcnNpb24gPSB2ZXJzaW9uOwogICAgaWYgKCF3cmFwcGVyIHx8IHdyYXBwZXIgPT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgewogICAgICB3cmFwcGVyID0gd2luZG93OwogICAgfQogICAgaWYgKHR5cGVvZiBkdXJhdGlvbiA9PT0gIm51bWJlciIgJiYgdHlwZW9mIGVhc2luZyAhPT0gImZ1bmN0aW9uIikgewogICAgICBlYXNpbmcgPSBkZWZhdWx0RWFzaW5nOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZWFzaW5nID09PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBkdXJhdGlvbiAhPT0gIm51bWJlciIpIHsKICAgICAgZHVyYXRpb24gPSAxOwogICAgfQogICAgdGhpcy5vcHRpb25zID0gewogICAgICB3cmFwcGVyLAogICAgICBjb250ZW50OiBjb250ZW50MywKICAgICAgZXZlbnRzVGFyZ2V0LAogICAgICBzbW9vdGhXaGVlbCwKICAgICAgc3luY1RvdWNoLAogICAgICBzeW5jVG91Y2hMZXJwLAogICAgICB0b3VjaEluZXJ0aWFFeHBvbmVudCwKICAgICAgZHVyYXRpb24sCiAgICAgIGVhc2luZywKICAgICAgbGVycDogbGVycDIsCiAgICAgIGluZmluaXRlLAogICAgICBnZXN0dXJlT3JpZW50YXRpb24sCiAgICAgIG9yaWVudGF0aW9uLAogICAgICB0b3VjaE11bHRpcGxpZXIsCiAgICAgIHdoZWVsTXVsdGlwbGllciwKICAgICAgYXV0b1Jlc2l6ZSwKICAgICAgcHJldmVudCwKICAgICAgdmlydHVhbFNjcm9sbCwKICAgICAgb3ZlcnNjcm9sbCwKICAgICAgYXV0b1JhZiwKICAgICAgYW5jaG9ycywKICAgICAgYXV0b1RvZ2dsZSwKICAgICAgYWxsb3dOZXN0ZWRTY3JvbGwsCiAgICAgIG5haXZlRGltZW5zaW9ucywKICAgICAgc3RvcEluZXJ0aWFPbk5hdmlnYXRlCiAgICB9OwogICAgdGhpcy5kaW1lbnNpb25zID0gbmV3IERpbWVuc2lvbnMod3JhcHBlciwgY29udGVudDMsIHsgYXV0b1Jlc2l6ZSB9KTsKICAgIHRoaXMudXBkYXRlQ2xhc3NOYW1lKCk7CiAgICB0aGlzLnRhcmdldFNjcm9sbCA9IHRoaXMuYW5pbWF0ZWRTY3JvbGwgPSB0aGlzLmFjdHVhbFNjcm9sbDsKICAgIHRoaXMub3B0aW9ucy53cmFwcGVyLmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsIHRoaXMub25OYXRpdmVTY3JvbGwsIGZhbHNlKTsKICAgIHRoaXMub3B0aW9ucy53cmFwcGVyLmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbGVuZCIsIHRoaXMub25TY3JvbGxFbmQsIHsKICAgICAgY2FwdHVyZTogdHJ1ZQogICAgfSk7CiAgICBpZiAodGhpcy5vcHRpb25zLmFuY2hvcnMgfHwgdGhpcy5vcHRpb25zLnN0b3BJbmVydGlhT25OYXZpZ2F0ZSkgewogICAgICB0aGlzLm9wdGlvbnMud3JhcHBlci5hZGRFdmVudExpc3RlbmVyKAogICAgICAgICJjbGljayIsCiAgICAgICAgdGhpcy5vbkNsaWNrLAogICAgICAgIGZhbHNlCiAgICAgICk7CiAgICB9CiAgICB0aGlzLm9wdGlvbnMud3JhcHBlci5hZGRFdmVudExpc3RlbmVyKAogICAgICAicG9pbnRlcmRvd24iLAogICAgICB0aGlzLm9uUG9pbnRlckRvd24sCiAgICAgIGZhbHNlCiAgICApOwogICAgdGhpcy52aXJ0dWFsU2Nyb2xsID0gbmV3IFZpcnR1YWxTY3JvbGwoZXZlbnRzVGFyZ2V0LCB7CiAgICAgIHRvdWNoTXVsdGlwbGllciwKICAgICAgd2hlZWxNdWx0aXBsaWVyCiAgICB9KTsKICAgIHRoaXMudmlydHVhbFNjcm9sbC5vbigic2Nyb2xsIiwgdGhpcy5vblZpcnR1YWxTY3JvbGwpOwogICAgaWYgKHRoaXMub3B0aW9ucy5hdXRvVG9nZ2xlKSB7CiAgICAgIHRoaXMuY2hlY2tPdmVyZmxvdygpOwogICAgICB0aGlzLnJvb3RFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoInRyYW5zaXRpb25lbmQiLCB0aGlzLm9uVHJhbnNpdGlvbkVuZCwgewogICAgICAgIHBhc3NpdmU6IHRydWUKICAgICAgfSk7CiAgICB9CiAgICBpZiAodGhpcy5vcHRpb25zLmF1dG9SYWYpIHsKICAgICAgdGhpcy5fcmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5yYWYpOwogICAgfQogIH0KICAvKioKICAgKiBEZXN0cm95IHRoZSBsZW5pcyBpbnN0YW5jZSwgcmVtb3ZlIGFsbCBldmVudCBsaXN0ZW5lcnMgYW5kIGNsZWFuIHVwIHRoZSBjbGFzcyBuYW1lCiAgICovCiAgZGVzdHJveSgpIHsKICAgIHRoaXMuZW1pdHRlci5kZXN0cm95KCk7CiAgICB0aGlzLm9wdGlvbnMud3JhcHBlci5yZW1vdmVFdmVudExpc3RlbmVyKAogICAgICAic2Nyb2xsIiwKICAgICAgdGhpcy5vbk5hdGl2ZVNjcm9sbCwKICAgICAgZmFsc2UKICAgICk7CiAgICB0aGlzLm9wdGlvbnMud3JhcHBlci5yZW1vdmVFdmVudExpc3RlbmVyKCJzY3JvbGxlbmQiLCB0aGlzLm9uU2Nyb2xsRW5kLCB7CiAgICAgIGNhcHR1cmU6IHRydWUKICAgIH0pOwogICAgdGhpcy5vcHRpb25zLndyYXBwZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcigKICAgICAgInBvaW50ZXJkb3duIiwKICAgICAgdGhpcy5vblBvaW50ZXJEb3duLAogICAgICBmYWxzZQogICAgKTsKICAgIGlmICh0aGlzLm9wdGlvbnMuYW5jaG9ycyB8fCB0aGlzLm9wdGlvbnMuc3RvcEluZXJ0aWFPbk5hdmlnYXRlKSB7CiAgICAgIHRoaXMub3B0aW9ucy53cmFwcGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoCiAgICAgICAgImNsaWNrIiwKICAgICAgICB0aGlzLm9uQ2xpY2ssCiAgICAgICAgZmFsc2UKICAgICAgKTsKICAgIH0KICAgIHRoaXMudmlydHVhbFNjcm9sbC5kZXN0cm95KCk7CiAgICB0aGlzLmRpbWVuc2lvbnMuZGVzdHJveSgpOwogICAgdGhpcy5jbGVhblVwQ2xhc3NOYW1lKCk7CiAgICBpZiAodGhpcy5fcmFmSWQpIHsKICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fcmFmSWQpOwogICAgfQogIH0KICBvbihldmVudCwgY2FsbGJhY2spIHsKICAgIHJldHVybiB0aGlzLmVtaXR0ZXIub24oZXZlbnQsIGNhbGxiYWNrKTsKICB9CiAgb2ZmKGV2ZW50LCBjYWxsYmFjaykgewogICAgcmV0dXJuIHRoaXMuZW1pdHRlci5vZmYoZXZlbnQsIGNhbGxiYWNrKTsKICB9CiAgb25TY3JvbGxFbmQgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChlMTApID0+IHsKICAgIGlmICghKGUxMCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkgewogICAgICBpZiAodGhpcy5pc1Njcm9sbGluZyA9PT0gInNtb290aCIgfHwgdGhpcy5pc1Njcm9sbGluZyA9PT0gZmFsc2UpIHsKICAgICAgICBlMTAuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIH0KICAgIH0KICB9LCAib25TY3JvbGxFbmQiKTsKICBkaXNwYXRjaFNjcm9sbGVuZEV2ZW50ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoKSA9PiB7CiAgICB0aGlzLm9wdGlvbnMud3JhcHBlci5kaXNwYXRjaEV2ZW50KAogICAgICBuZXcgQ3VzdG9tRXZlbnQoInNjcm9sbGVuZCIsIHsKICAgICAgICBidWJibGVzOiB0aGlzLm9wdGlvbnMud3JhcHBlciA9PT0gd2luZG93LAogICAgICAgIC8vIGNhbmNlbGFibGU6IGZhbHNlLAogICAgICAgIGRldGFpbDogewogICAgICAgICAgbGVuaXNTY3JvbGxFbmQ6IHRydWUKICAgICAgICB9CiAgICAgIH0pCiAgICApOwogIH0sICJkaXNwYXRjaFNjcm9sbGVuZEV2ZW50Iik7CiAgZ2V0IG92ZXJmbG93KCkgewogICAgY29uc3QgcHJvcGVydHkgPSB0aGlzLmlzSG9yaXpvbnRhbCA/ICJvdmVyZmxvdy14IiA6ICJvdmVyZmxvdy15IjsKICAgIHJldHVybiBnZXRDb21wdXRlZFN0eWxlKHRoaXMucm9vdEVsZW1lbnQpW3Byb3BlcnR5XTsKICB9CiAgY2hlY2tPdmVyZmxvdygpIHsKICAgIGlmIChbImhpZGRlbiIsICJjbGlwIl0uaW5jbHVkZXModGhpcy5vdmVyZmxvdykpIHsKICAgICAgdGhpcy5pbnRlcm5hbFN0b3AoKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuaW50ZXJuYWxTdGFydCgpOwogICAgfQogIH0KICBvblRyYW5zaXRpb25FbmQgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChldmVudCkgPT4gewogICAgaWYgKGV2ZW50LnByb3BlcnR5TmFtZS5pbmNsdWRlcygib3ZlcmZsb3ciKSkgewogICAgICB0aGlzLmNoZWNrT3ZlcmZsb3coKTsKICAgIH0KICB9LCAib25UcmFuc2l0aW9uRW5kIik7CiAgc2V0U2Nyb2xsKHNjcm9sbCkgewogICAgaWYgKHRoaXMuaXNIb3Jpem9udGFsKSB7CiAgICAgIHRoaXMub3B0aW9ucy53cmFwcGVyLnNjcm9sbFRvKHsgbGVmdDogc2Nyb2xsLCBiZWhhdmlvcjogImluc3RhbnQiIH0pOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5vcHRpb25zLndyYXBwZXIuc2Nyb2xsVG8oeyB0b3A6IHNjcm9sbCwgYmVoYXZpb3I6ICJpbnN0YW50IiB9KTsKICAgIH0KICB9CiAgb25DbGljayA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGV2ZW50KSA9PiB7CiAgICBjb25zdCBwYXRoMiA9IGV2ZW50LmNvbXBvc2VkUGF0aCgpOwogICAgY29uc3QgYW5jaG9yRWxlbWVudHMgPSBwYXRoMi5maWx0ZXIoCiAgICAgIChub2RlMikgPT4gbm9kZTIgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBub2RlMi5nZXRBdHRyaWJ1dGUoImhyZWYiKQogICAgKTsKICAgIGlmICh0aGlzLm9wdGlvbnMuYW5jaG9ycykgewogICAgICBjb25zdCBhbmNob3IgPSBhbmNob3JFbGVtZW50cy5maW5kKAogICAgICAgIChub2RlMikgPT4gbm9kZTIuZ2V0QXR0cmlidXRlKCJocmVmIik/LmluY2x1ZGVzKCIjIikKICAgICAgKTsKICAgICAgaWYgKGFuY2hvcikgewogICAgICAgIGNvbnN0IGhyZWYgPSBhbmNob3IuZ2V0QXR0cmlidXRlKCJocmVmIik7CiAgICAgICAgaWYgKGhyZWYpIHsKICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0eXBlb2YgdGhpcy5vcHRpb25zLmFuY2hvcnMgPT09ICJvYmplY3QiICYmIHRoaXMub3B0aW9ucy5hbmNob3JzID8gdGhpcy5vcHRpb25zLmFuY2hvcnMgOiB2b2lkIDA7CiAgICAgICAgICBjb25zdCB0YXJnZXQgPSBgIyR7aHJlZi5zcGxpdCgiIyIpWzFdfWA7CiAgICAgICAgICB0aGlzLnNjcm9sbFRvKHRhcmdldCwgb3B0aW9ucyk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAodGhpcy5vcHRpb25zLnN0b3BJbmVydGlhT25OYXZpZ2F0ZSkgewogICAgICBjb25zdCBpbnRlcm5hbExpbmsgPSBhbmNob3JFbGVtZW50cy5maW5kKAogICAgICAgIChub2RlMikgPT4gbm9kZTIuaG9zdCA9PT0gd2luZG93LmxvY2F0aW9uLmhvc3QKICAgICAgKTsKICAgICAgaWYgKGludGVybmFsTGluaykgewogICAgICAgIHRoaXMucmVzZXQoKTsKICAgICAgfQogICAgfQogIH0sICJvbkNsaWNrIik7CiAgb25Qb2ludGVyRG93biA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGV2ZW50KSA9PiB7CiAgICBpZiAoZXZlbnQuYnV0dG9uID09PSAxKSB7CiAgICAgIHRoaXMucmVzZXQoKTsKICAgIH0KICB9LCAib25Qb2ludGVyRG93biIpOwogIG9uVmlydHVhbFNjcm9sbCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGRhdGEpID0+IHsKICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLnZpcnR1YWxTY3JvbGwgPT09ICJmdW5jdGlvbiIgJiYgdGhpcy5vcHRpb25zLnZpcnR1YWxTY3JvbGwoZGF0YSkgPT09IGZhbHNlKQogICAgICByZXR1cm47CiAgICBjb25zdCB7IGRlbHRhWCwgZGVsdGFZLCBldmVudCB9ID0gZGF0YTsKICAgIHRoaXMuZW1pdHRlci5lbWl0KCJ2aXJ0dWFsLXNjcm9sbCIsIHsgZGVsdGFYLCBkZWx0YVksIGV2ZW50IH0pOwogICAgaWYgKGV2ZW50LmN0cmxLZXkpIHJldHVybjsKICAgIGlmIChldmVudC5sZW5pc1N0b3BQcm9wYWdhdGlvbikgcmV0dXJuOwogICAgY29uc3QgaXNUb3VjaCA9IGV2ZW50LnR5cGUuaW5jbHVkZXMoInRvdWNoIik7CiAgICBjb25zdCBpc1doZWVsID0gZXZlbnQudHlwZS5pbmNsdWRlcygid2hlZWwiKTsKICAgIHRoaXMuaXNUb3VjaGluZyA9IGV2ZW50LnR5cGUgPT09ICJ0b3VjaHN0YXJ0IiB8fCBldmVudC50eXBlID09PSAidG91Y2htb3ZlIjsKICAgIGNvbnN0IGlzQ2xpY2tPclRhcCA9IGRlbHRhWCA9PT0gMCAmJiBkZWx0YVkgPT09IDA7CiAgICBjb25zdCBpc1RhcFRvU3RvcCA9IHRoaXMub3B0aW9ucy5zeW5jVG91Y2ggJiYgaXNUb3VjaCAmJiBldmVudC50eXBlID09PSAidG91Y2hzdGFydCIgJiYgaXNDbGlja09yVGFwICYmICF0aGlzLmlzU3RvcHBlZCAmJiAhdGhpcy5pc0xvY2tlZDsKICAgIGlmIChpc1RhcFRvU3RvcCkgewogICAgICB0aGlzLnJlc2V0KCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGlzVW5rbm93bkdlc3R1cmUgPSB0aGlzLm9wdGlvbnMuZ2VzdHVyZU9yaWVudGF0aW9uID09PSAidmVydGljYWwiICYmIGRlbHRhWSA9PT0gMCB8fCB0aGlzLm9wdGlvbnMuZ2VzdHVyZU9yaWVudGF0aW9uID09PSAiaG9yaXpvbnRhbCIgJiYgZGVsdGFYID09PSAwOwogICAgaWYgKGlzQ2xpY2tPclRhcCB8fCBpc1Vua25vd25HZXN0dXJlKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGxldCBjb21wb3NlZFBhdGggPSBldmVudC5jb21wb3NlZFBhdGgoKTsKICAgIGNvbXBvc2VkUGF0aCA9IGNvbXBvc2VkUGF0aC5zbGljZSgwLCBjb21wb3NlZFBhdGguaW5kZXhPZih0aGlzLnJvb3RFbGVtZW50KSk7CiAgICBjb25zdCBwcmV2ZW50ID0gdGhpcy5vcHRpb25zLnByZXZlbnQ7CiAgICBpZiAoISFjb21wb3NlZFBhdGguZmluZCgKICAgICAgKG5vZGUyKSA9PiBub2RlMiBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmICh0eXBlb2YgcHJldmVudCA9PT0gImZ1bmN0aW9uIiAmJiBwcmV2ZW50Py4obm9kZTIpIHx8IG5vZGUyLmhhc0F0dHJpYnV0ZT8uKCJkYXRhLWxlbmlzLXByZXZlbnQiKSB8fCBpc1RvdWNoICYmIG5vZGUyLmhhc0F0dHJpYnV0ZT8uKCJkYXRhLWxlbmlzLXByZXZlbnQtdG91Y2giKSB8fCBpc1doZWVsICYmIG5vZGUyLmhhc0F0dHJpYnV0ZT8uKCJkYXRhLWxlbmlzLXByZXZlbnQtd2hlZWwiKSB8fCB0aGlzLm9wdGlvbnMuYWxsb3dOZXN0ZWRTY3JvbGwgJiYgdGhpcy5jaGVja05lc3RlZFNjcm9sbChub2RlMiwgeyBkZWx0YVgsIGRlbHRhWSB9KSkKICAgICkpCiAgICAgIHJldHVybjsKICAgIGlmICh0aGlzLmlzU3RvcHBlZCB8fCB0aGlzLmlzTG9ja2VkKSB7CiAgICAgIGlmIChldmVudC5jYW5jZWxhYmxlKSB7CiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBpc1Ntb290aCA9IHRoaXMub3B0aW9ucy5zeW5jVG91Y2ggJiYgaXNUb3VjaCB8fCB0aGlzLm9wdGlvbnMuc21vb3RoV2hlZWwgJiYgaXNXaGVlbDsKICAgIGlmICghaXNTbW9vdGgpIHsKICAgICAgdGhpcy5pc1Njcm9sbGluZyA9ICJuYXRpdmUiOwogICAgICB0aGlzLmFuaW1hdGUuc3RvcCgpOwogICAgICBldmVudC5sZW5pc1N0b3BQcm9wYWdhdGlvbiA9IHRydWU7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGxldCBkZWx0YSA9IGRlbHRhWTsKICAgIGlmICh0aGlzLm9wdGlvbnMuZ2VzdHVyZU9yaWVudGF0aW9uID09PSAiYm90aCIpIHsKICAgICAgZGVsdGEgPSBNYXRoLmFicyhkZWx0YVkpID4gTWF0aC5hYnMoZGVsdGFYKSA/IGRlbHRhWSA6IGRlbHRhWDsKICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLmdlc3R1cmVPcmllbnRhdGlvbiA9PT0gImhvcml6b250YWwiKSB7CiAgICAgIGRlbHRhID0gZGVsdGFYOwogICAgfQogICAgaWYgKCF0aGlzLm9wdGlvbnMub3ZlcnNjcm9sbCB8fCB0aGlzLm9wdGlvbnMuaW5maW5pdGUgfHwgdGhpcy5vcHRpb25zLndyYXBwZXIgIT09IHdpbmRvdyAmJiB0aGlzLmxpbWl0ID4gMCAmJiAodGhpcy5hbmltYXRlZFNjcm9sbCA+IDAgJiYgdGhpcy5hbmltYXRlZFNjcm9sbCA8IHRoaXMubGltaXQgfHwgdGhpcy5hbmltYXRlZFNjcm9sbCA9PT0gMCAmJiBkZWx0YVkgPiAwIHx8IHRoaXMuYW5pbWF0ZWRTY3JvbGwgPT09IHRoaXMubGltaXQgJiYgZGVsdGFZIDwgMCkpIHsKICAgICAgZXZlbnQubGVuaXNTdG9wUHJvcGFnYXRpb24gPSB0cnVlOwogICAgfQogICAgaWYgKGV2ZW50LmNhbmNlbGFibGUpIHsKICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgIH0KICAgIGNvbnN0IGlzU3luY1RvdWNoID0gaXNUb3VjaCAmJiB0aGlzLm9wdGlvbnMuc3luY1RvdWNoOwogICAgY29uc3QgaXNUb3VjaEVuZCA9IGlzVG91Y2ggJiYgZXZlbnQudHlwZSA9PT0gInRvdWNoZW5kIjsKICAgIGNvbnN0IGhhc1RvdWNoSW5lcnRpYSA9IGlzVG91Y2hFbmQ7CiAgICBpZiAoaGFzVG91Y2hJbmVydGlhKSB7CiAgICAgIGRlbHRhID0gTWF0aC5zaWduKHRoaXMudmVsb2NpdHkpICogTWF0aC5wb3coTWF0aC5hYnModGhpcy52ZWxvY2l0eSksIHRoaXMub3B0aW9ucy50b3VjaEluZXJ0aWFFeHBvbmVudCk7CiAgICB9CiAgICB0aGlzLnNjcm9sbFRvKHRoaXMudGFyZ2V0U2Nyb2xsICsgZGVsdGEsIHsKICAgICAgcHJvZ3JhbW1hdGljOiBmYWxzZSwKICAgICAgLi4uaXNTeW5jVG91Y2ggPyB7CiAgICAgICAgbGVycDogaGFzVG91Y2hJbmVydGlhID8gdGhpcy5vcHRpb25zLnN5bmNUb3VjaExlcnAgOiAxCiAgICAgIH0gOiB7CiAgICAgICAgbGVycDogdGhpcy5vcHRpb25zLmxlcnAsCiAgICAgICAgZHVyYXRpb246IHRoaXMub3B0aW9ucy5kdXJhdGlvbiwKICAgICAgICBlYXNpbmc6IHRoaXMub3B0aW9ucy5lYXNpbmcKICAgICAgfQogICAgfSk7CiAgfSwgIm9uVmlydHVhbFNjcm9sbCIpOwogIC8qKgogICAqIEZvcmNlIGxlbmlzIHRvIHJlY2FsY3VsYXRlIHRoZSBkaW1lbnNpb25zCiAgICovCiAgcmVzaXplKCkgewogICAgdGhpcy5kaW1lbnNpb25zLnJlc2l6ZSgpOwogICAgdGhpcy5hbmltYXRlZFNjcm9sbCA9IHRoaXMudGFyZ2V0U2Nyb2xsID0gdGhpcy5hY3R1YWxTY3JvbGw7CiAgICB0aGlzLmVtaXQoKTsKICB9CiAgZW1pdCgpIHsKICAgIHRoaXMuZW1pdHRlci5lbWl0KCJzY3JvbGwiLCB0aGlzKTsKICB9CiAgb25OYXRpdmVTY3JvbGwgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCgpID0+IHsKICAgIGlmICh0aGlzLl9yZXNldFZlbG9jaXR5VGltZW91dCAhPT0gbnVsbCkgewogICAgICBjbGVhclRpbWVvdXQodGhpcy5fcmVzZXRWZWxvY2l0eVRpbWVvdXQpOwogICAgICB0aGlzLl9yZXNldFZlbG9jaXR5VGltZW91dCA9IG51bGw7CiAgICB9CiAgICBpZiAodGhpcy5fcHJldmVudE5leHROYXRpdmVTY3JvbGxFdmVudCkgewogICAgICB0aGlzLl9wcmV2ZW50TmV4dE5hdGl2ZVNjcm9sbEV2ZW50ID0gZmFsc2U7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0aGlzLmlzU2Nyb2xsaW5nID09PSBmYWxzZSB8fCB0aGlzLmlzU2Nyb2xsaW5nID09PSAibmF0aXZlIikgewogICAgICBjb25zdCBsYXN0U2Nyb2xsID0gdGhpcy5hbmltYXRlZFNjcm9sbDsKICAgICAgdGhpcy5hbmltYXRlZFNjcm9sbCA9IHRoaXMudGFyZ2V0U2Nyb2xsID0gdGhpcy5hY3R1YWxTY3JvbGw7CiAgICAgIHRoaXMubGFzdFZlbG9jaXR5ID0gdGhpcy52ZWxvY2l0eTsKICAgICAgdGhpcy52ZWxvY2l0eSA9IHRoaXMuYW5pbWF0ZWRTY3JvbGwgLSBsYXN0U2Nyb2xsOwogICAgICB0aGlzLmRpcmVjdGlvbiA9IE1hdGguc2lnbigKICAgICAgICB0aGlzLmFuaW1hdGVkU2Nyb2xsIC0gbGFzdFNjcm9sbAogICAgICApOwogICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7CiAgICAgICAgdGhpcy5pc1Njcm9sbGluZyA9ICJuYXRpdmUiOwogICAgICB9CiAgICAgIHRoaXMuZW1pdCgpOwogICAgICBpZiAodGhpcy52ZWxvY2l0eSAhPT0gMCkgewogICAgICAgIHRoaXMuX3Jlc2V0VmVsb2NpdHlUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICB0aGlzLmxhc3RWZWxvY2l0eSA9IHRoaXMudmVsb2NpdHk7CiAgICAgICAgICB0aGlzLnZlbG9jaXR5ID0gMDsKICAgICAgICAgIHRoaXMuaXNTY3JvbGxpbmcgPSBmYWxzZTsKICAgICAgICAgIHRoaXMuZW1pdCgpOwogICAgICAgIH0sIDQwMCk7CiAgICAgIH0KICAgIH0KICB9LCAib25OYXRpdmVTY3JvbGwiKTsKICByZXNldCgpIHsKICAgIHRoaXMuaXNMb2NrZWQgPSBmYWxzZTsKICAgIHRoaXMuaXNTY3JvbGxpbmcgPSBmYWxzZTsKICAgIHRoaXMuYW5pbWF0ZWRTY3JvbGwgPSB0aGlzLnRhcmdldFNjcm9sbCA9IHRoaXMuYWN0dWFsU2Nyb2xsOwogICAgdGhpcy5sYXN0VmVsb2NpdHkgPSB0aGlzLnZlbG9jaXR5ID0gMDsKICAgIHRoaXMuYW5pbWF0ZS5zdG9wKCk7CiAgfQogIC8qKgogICAqIFN0YXJ0IGxlbmlzIHNjcm9sbCBhZnRlciBpdCBoYXMgYmVlbiBzdG9wcGVkCiAgICovCiAgc3RhcnQoKSB7CiAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSByZXR1cm47CiAgICBpZiAodGhpcy5vcHRpb25zLmF1dG9Ub2dnbGUpIHsKICAgICAgdGhpcy5yb290RWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgib3ZlcmZsb3ciKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5pbnRlcm5hbFN0YXJ0KCk7CiAgfQogIGludGVybmFsU3RhcnQoKSB7CiAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSByZXR1cm47CiAgICB0aGlzLnJlc2V0KCk7CiAgICB0aGlzLmlzU3RvcHBlZCA9IGZhbHNlOwogICAgdGhpcy5lbWl0KCk7CiAgfQogIC8qKgogICAqIFN0b3AgbGVuaXMgc2Nyb2xsCiAgICovCiAgc3RvcCgpIHsKICAgIGlmICh0aGlzLmlzU3RvcHBlZCkgcmV0dXJuOwogICAgaWYgKHRoaXMub3B0aW9ucy5hdXRvVG9nZ2xlKSB7CiAgICAgIHRoaXMucm9vdEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoIm92ZXJmbG93IiwgImNsaXAiKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5pbnRlcm5hbFN0b3AoKTsKICB9CiAgaW50ZXJuYWxTdG9wKCkgewogICAgaWYgKHRoaXMuaXNTdG9wcGVkKSByZXR1cm47CiAgICB0aGlzLnJlc2V0KCk7CiAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7CiAgICB0aGlzLmVtaXQoKTsKICB9CiAgLyoqCiAgICogUmVxdWVzdEFuaW1hdGlvbkZyYW1lIGZvciBsZW5pcwogICAqCiAgICogQHBhcmFtIHRpbWUgVGhlIHRpbWUgaW4gbXMgZnJvbSBhbiBleHRlcm5hbCBjbG9jayBsaWtlIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgIG9yIFRlbXB1cwogICAqLwogIHJhZiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHRpbWUpID0+IHsKICAgIGNvbnN0IGRlbHRhVGltZSA9IHRpbWUgLSAodGhpcy50aW1lIHx8IHRpbWUpOwogICAgdGhpcy50aW1lID0gdGltZTsKICAgIHRoaXMuYW5pbWF0ZS5hZHZhbmNlKGRlbHRhVGltZSAqIDFlLTMpOwogICAgaWYgKHRoaXMub3B0aW9ucy5hdXRvUmFmKSB7CiAgICAgIHRoaXMuX3JhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMucmFmKTsKICAgIH0KICB9LCAicmFmIik7CiAgLyoqCiAgICogU2Nyb2xsIHRvIGEgdGFyZ2V0IHZhbHVlCiAgICoKICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgdmFsdWUgdG8gc2Nyb2xsIHRvCiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgZm9yIHRoZSBzY3JvbGwKICAgKgogICAqIEBleGFtcGxlCiAgICogbGVuaXMuc2Nyb2xsVG8oMTAwLCB7CiAgICogICBvZmZzZXQ6IDEwMCwKICAgKiAgIGR1cmF0aW9uOiAxLAogICAqICAgZWFzaW5nOiAodCkgPT4gMSAtIE1hdGguY29zKCh0ICogTWF0aC5QSSkgLyAyKSwKICAgKiAgIGxlcnA6IDAuMSwKICAgKiAgIG9uU3RhcnQ6ICgpID0+IHsKICAgKiAgICAgY29uc29sZS5sb2coJ29uU3RhcnQnKQogICAqICAgfSwKICAgKiAgIG9uQ29tcGxldGU6ICgpID0+IHsKICAgKiAgICAgY29uc29sZS5sb2coJ29uQ29tcGxldGUnKQogICAqICAgfSwKICAgKiB9KQogICAqLwogIHNjcm9sbFRvKHRhcmdldCwgewogICAgb2Zmc2V0ID0gMCwKICAgIGltbWVkaWF0ZSA9IGZhbHNlLAogICAgbG9jayA9IGZhbHNlLAogICAgcHJvZ3JhbW1hdGljID0gdHJ1ZSwKICAgIC8vIGNhbGxlZCBmcm9tIG91dHNpZGUgb2YgdGhlIGNsYXNzCiAgICBsZXJwOiBsZXJwMiA9IHByb2dyYW1tYXRpYyA/IHRoaXMub3B0aW9ucy5sZXJwIDogdm9pZCAwLAogICAgZHVyYXRpb24gPSBwcm9ncmFtbWF0aWMgPyB0aGlzLm9wdGlvbnMuZHVyYXRpb24gOiB2b2lkIDAsCiAgICBlYXNpbmcgPSBwcm9ncmFtbWF0aWMgPyB0aGlzLm9wdGlvbnMuZWFzaW5nIDogdm9pZCAwLAogICAgb25TdGFydCwKICAgIG9uQ29tcGxldGUsCiAgICBmb3JjZSA9IGZhbHNlLAogICAgLy8gc2Nyb2xsIGV2ZW4gaWYgc3RvcHBlZAogICAgdXNlckRhdGEKICB9ID0ge30pIHsKICAgIGlmICgodGhpcy5pc1N0b3BwZWQgfHwgdGhpcy5pc0xvY2tlZCkgJiYgIWZvcmNlKSByZXR1cm47CiAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gInN0cmluZyIgJiYgWyJ0b3AiLCAibGVmdCIsICJzdGFydCIsICIjIl0uaW5jbHVkZXModGFyZ2V0KSkgewogICAgICB0YXJnZXQgPSAwOwogICAgfSBlbHNlIGlmICh0eXBlb2YgdGFyZ2V0ID09PSAic3RyaW5nIiAmJiBbImJvdHRvbSIsICJyaWdodCIsICJlbmQiXS5pbmNsdWRlcyh0YXJnZXQpKSB7CiAgICAgIHRhcmdldCA9IHRoaXMubGltaXQ7CiAgICB9IGVsc2UgewogICAgICBsZXQgbm9kZTI7CiAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSAic3RyaW5nIikgewogICAgICAgIG5vZGUyID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0YXJnZXQpOwogICAgICAgIGlmICghbm9kZTIpIHsKICAgICAgICAgIGlmICh0YXJnZXQgPT09ICIjdG9wIikgewogICAgICAgICAgICB0YXJnZXQgPSAwOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS53YXJuKCJMZW5pczogVGFyZ2V0IG5vdCBmb3VuZCIsIHRhcmdldCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRhcmdldD8ubm9kZVR5cGUpIHsKICAgICAgICBub2RlMiA9IHRhcmdldDsKICAgICAgfQogICAgICBpZiAobm9kZTIpIHsKICAgICAgICBpZiAodGhpcy5vcHRpb25zLndyYXBwZXIgIT09IHdpbmRvdykgewogICAgICAgICAgY29uc3Qgd3JhcHBlclJlY3QgPSB0aGlzLnJvb3RFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgICAgb2Zmc2V0IC09IHRoaXMuaXNIb3Jpem9udGFsID8gd3JhcHBlclJlY3QubGVmdCA6IHdyYXBwZXJSZWN0LnRvcDsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVjdCA9IG5vZGUyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIHRhcmdldCA9ICh0aGlzLmlzSG9yaXpvbnRhbCA/IHJlY3QubGVmdCA6IHJlY3QudG9wKSArIHRoaXMuYW5pbWF0ZWRTY3JvbGw7CiAgICAgIH0KICAgIH0KICAgIGlmICh0eXBlb2YgdGFyZ2V0ICE9PSAibnVtYmVyIikgcmV0dXJuOwogICAgdGFyZ2V0ICs9IG9mZnNldDsKICAgIHRhcmdldCA9IE1hdGgucm91bmQodGFyZ2V0KTsKICAgIGlmICh0aGlzLm9wdGlvbnMuaW5maW5pdGUpIHsKICAgICAgaWYgKHByb2dyYW1tYXRpYykgewogICAgICAgIHRoaXMudGFyZ2V0U2Nyb2xsID0gdGhpcy5hbmltYXRlZFNjcm9sbCA9IHRoaXMuc2Nyb2xsOwogICAgICAgIGNvbnN0IGRpc3RhbmNlID0gdGFyZ2V0IC0gdGhpcy5hbmltYXRlZFNjcm9sbDsKICAgICAgICBpZiAoZGlzdGFuY2UgPiB0aGlzLmxpbWl0IC8gMikgewogICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IC0gdGhpcy5saW1pdDsKICAgICAgICB9IGVsc2UgaWYgKGRpc3RhbmNlIDwgLXRoaXMubGltaXQgLyAyKSB7CiAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQgKyB0aGlzLmxpbWl0OwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGFyZ2V0ID0gY2xhbXAyKDAsIHRhcmdldCwgdGhpcy5saW1pdCk7CiAgICB9CiAgICBpZiAodGFyZ2V0ID09PSB0aGlzLnRhcmdldFNjcm9sbCkgewogICAgICBvblN0YXJ0Py4odGhpcyk7CiAgICAgIG9uQ29tcGxldGU/Lih0aGlzKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy51c2VyRGF0YSA9IHVzZXJEYXRhID8/IHt9OwogICAgaWYgKGltbWVkaWF0ZSkgewogICAgICB0aGlzLmFuaW1hdGVkU2Nyb2xsID0gdGhpcy50YXJnZXRTY3JvbGwgPSB0YXJnZXQ7CiAgICAgIHRoaXMuc2V0U2Nyb2xsKHRoaXMuc2Nyb2xsKTsKICAgICAgdGhpcy5yZXNldCgpOwogICAgICB0aGlzLnByZXZlbnROZXh0TmF0aXZlU2Nyb2xsRXZlbnQoKTsKICAgICAgdGhpcy5lbWl0KCk7CiAgICAgIG9uQ29tcGxldGU/Lih0aGlzKTsKICAgICAgdGhpcy51c2VyRGF0YSA9IHt9OwogICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gewogICAgICAgIHRoaXMuZGlzcGF0Y2hTY3JvbGxlbmRFdmVudCgpOwogICAgICB9KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKCFwcm9ncmFtbWF0aWMpIHsKICAgICAgdGhpcy50YXJnZXRTY3JvbGwgPSB0YXJnZXQ7CiAgICB9CiAgICBpZiAodHlwZW9mIGR1cmF0aW9uID09PSAibnVtYmVyIiAmJiB0eXBlb2YgZWFzaW5nICE9PSAiZnVuY3Rpb24iKSB7CiAgICAgIGVhc2luZyA9IGRlZmF1bHRFYXNpbmc7CiAgICB9IGVsc2UgaWYgKHR5cGVvZiBlYXNpbmcgPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIGR1cmF0aW9uICE9PSAibnVtYmVyIikgewogICAgICBkdXJhdGlvbiA9IDE7CiAgICB9CiAgICB0aGlzLmFuaW1hdGUuZnJvbVRvKHRoaXMuYW5pbWF0ZWRTY3JvbGwsIHRhcmdldCwgewogICAgICBkdXJhdGlvbiwKICAgICAgZWFzaW5nLAogICAgICBsZXJwOiBsZXJwMiwKICAgICAgb25TdGFydDogLyogQF9fUFVSRV9fICovIF9fbmFtZSgoKSA9PiB7CiAgICAgICAgaWYgKGxvY2spIHRoaXMuaXNMb2NrZWQgPSB0cnVlOwogICAgICAgIHRoaXMuaXNTY3JvbGxpbmcgPSAic21vb3RoIjsKICAgICAgICBvblN0YXJ0Py4odGhpcyk7CiAgICAgIH0sICJvblN0YXJ0IiksCiAgICAgIG9uVXBkYXRlOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh2YWx1ZTIsIGNvbXBsZXRlZCkgPT4gewogICAgICAgIHRoaXMuaXNTY3JvbGxpbmcgPSAic21vb3RoIjsKICAgICAgICB0aGlzLmxhc3RWZWxvY2l0eSA9IHRoaXMudmVsb2NpdHk7CiAgICAgICAgdGhpcy52ZWxvY2l0eSA9IHZhbHVlMiAtIHRoaXMuYW5pbWF0ZWRTY3JvbGw7CiAgICAgICAgdGhpcy5kaXJlY3Rpb24gPSBNYXRoLnNpZ24odGhpcy52ZWxvY2l0eSk7CiAgICAgICAgdGhpcy5hbmltYXRlZFNjcm9sbCA9IHZhbHVlMjsKICAgICAgICB0aGlzLnNldFNjcm9sbCh0aGlzLnNjcm9sbCk7CiAgICAgICAgaWYgKHByb2dyYW1tYXRpYykgewogICAgICAgICAgdGhpcy50YXJnZXRTY3JvbGwgPSB2YWx1ZTI7CiAgICAgICAgfQogICAgICAgIGlmICghY29tcGxldGVkKSB0aGlzLmVtaXQoKTsKICAgICAgICBpZiAoY29tcGxldGVkKSB7CiAgICAgICAgICB0aGlzLnJlc2V0KCk7CiAgICAgICAgICB0aGlzLmVtaXQoKTsKICAgICAgICAgIG9uQ29tcGxldGU/Lih0aGlzKTsKICAgICAgICAgIHRoaXMudXNlckRhdGEgPSB7fTsKICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7CiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hTY3JvbGxlbmRFdmVudCgpOwogICAgICAgICAgfSk7CiAgICAgICAgICB0aGlzLnByZXZlbnROZXh0TmF0aXZlU2Nyb2xsRXZlbnQoKTsKICAgICAgICB9CiAgICAgIH0sICJvblVwZGF0ZSIpCiAgICB9KTsKICB9CiAgcHJldmVudE5leHROYXRpdmVTY3JvbGxFdmVudCgpIHsKICAgIHRoaXMuX3ByZXZlbnROZXh0TmF0aXZlU2Nyb2xsRXZlbnQgPSB0cnVlOwogICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsKICAgICAgdGhpcy5fcHJldmVudE5leHROYXRpdmVTY3JvbGxFdmVudCA9IGZhbHNlOwogICAgfSk7CiAgfQogIGNoZWNrTmVzdGVkU2Nyb2xsKG5vZGUyLCB7IGRlbHRhWCwgZGVsdGFZIH0pIHsKICAgIGNvbnN0IHRpbWUgPSBEYXRlLm5vdygpOwogICAgY29uc3QgY2FjaGUgPSBub2RlMi5fbGVuaXMgPz89IHt9OwogICAgbGV0IGhhc092ZXJmbG93WCwgaGFzT3ZlcmZsb3dZLCBpc1Njcm9sbGFibGVYLCBpc1Njcm9sbGFibGVZLCBzY3JvbGxXaWR0aCwgc2Nyb2xsSGVpZ2h0LCBjbGllbnRXaWR0aCwgY2xpZW50SGVpZ2h0OwogICAgY29uc3QgZ2VzdHVyZU9yaWVudGF0aW9uID0gdGhpcy5vcHRpb25zLmdlc3R1cmVPcmllbnRhdGlvbjsKICAgIGlmICh0aW1lIC0gKGNhY2hlLnRpbWUgPz8gMCkgPiAyZTMpIHsKICAgICAgY2FjaGUudGltZSA9IERhdGUubm93KCk7CiAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShub2RlMik7CiAgICAgIGNhY2hlLmNvbXB1dGVkU3R5bGUgPSBjb21wdXRlZFN0eWxlOwogICAgICBjb25zdCBvdmVyZmxvd1hTdHJpbmcgPSBjb21wdXRlZFN0eWxlLm92ZXJmbG93WDsKICAgICAgY29uc3Qgb3ZlcmZsb3dZU3RyaW5nID0gY29tcHV0ZWRTdHlsZS5vdmVyZmxvd1k7CiAgICAgIGhhc092ZXJmbG93WCA9IFsiYXV0byIsICJvdmVybGF5IiwgInNjcm9sbCJdLmluY2x1ZGVzKG92ZXJmbG93WFN0cmluZyk7CiAgICAgIGhhc092ZXJmbG93WSA9IFsiYXV0byIsICJvdmVybGF5IiwgInNjcm9sbCJdLmluY2x1ZGVzKG92ZXJmbG93WVN0cmluZyk7CiAgICAgIGNhY2hlLmhhc092ZXJmbG93WCA9IGhhc092ZXJmbG93WDsKICAgICAgY2FjaGUuaGFzT3ZlcmZsb3dZID0gaGFzT3ZlcmZsb3dZOwogICAgICBpZiAoIWhhc092ZXJmbG93WCAmJiAhaGFzT3ZlcmZsb3dZKSByZXR1cm4gZmFsc2U7CiAgICAgIGlmIChnZXN0dXJlT3JpZW50YXRpb24gPT09ICJ2ZXJ0aWNhbCIgJiYgIWhhc092ZXJmbG93WSkgcmV0dXJuIGZhbHNlOwogICAgICBpZiAoZ2VzdHVyZU9yaWVudGF0aW9uID09PSAiaG9yaXpvbnRhbCIgJiYgIWhhc092ZXJmbG93WCkgcmV0dXJuIGZhbHNlOwogICAgICBzY3JvbGxXaWR0aCA9IG5vZGUyLnNjcm9sbFdpZHRoOwogICAgICBzY3JvbGxIZWlnaHQgPSBub2RlMi5zY3JvbGxIZWlnaHQ7CiAgICAgIGNsaWVudFdpZHRoID0gbm9kZTIuY2xpZW50V2lkdGg7CiAgICAgIGNsaWVudEhlaWdodCA9IG5vZGUyLmNsaWVudEhlaWdodDsKICAgICAgaXNTY3JvbGxhYmxlWCA9IHNjcm9sbFdpZHRoID4gY2xpZW50V2lkdGg7CiAgICAgIGlzU2Nyb2xsYWJsZVkgPSBzY3JvbGxIZWlnaHQgPiBjbGllbnRIZWlnaHQ7CiAgICAgIGNhY2hlLmlzU2Nyb2xsYWJsZVggPSBpc1Njcm9sbGFibGVYOwogICAgICBjYWNoZS5pc1Njcm9sbGFibGVZID0gaXNTY3JvbGxhYmxlWTsKICAgICAgY2FjaGUuc2Nyb2xsV2lkdGggPSBzY3JvbGxXaWR0aDsKICAgICAgY2FjaGUuc2Nyb2xsSGVpZ2h0ID0gc2Nyb2xsSGVpZ2h0OwogICAgICBjYWNoZS5jbGllbnRXaWR0aCA9IGNsaWVudFdpZHRoOwogICAgICBjYWNoZS5jbGllbnRIZWlnaHQgPSBjbGllbnRIZWlnaHQ7CiAgICB9IGVsc2UgewogICAgICBpc1Njcm9sbGFibGVYID0gY2FjaGUuaXNTY3JvbGxhYmxlWDsKICAgICAgaXNTY3JvbGxhYmxlWSA9IGNhY2hlLmlzU2Nyb2xsYWJsZVk7CiAgICAgIGhhc092ZXJmbG93WCA9IGNhY2hlLmhhc092ZXJmbG93WDsKICAgICAgaGFzT3ZlcmZsb3dZID0gY2FjaGUuaGFzT3ZlcmZsb3dZOwogICAgICBzY3JvbGxXaWR0aCA9IGNhY2hlLnNjcm9sbFdpZHRoOwogICAgICBzY3JvbGxIZWlnaHQgPSBjYWNoZS5zY3JvbGxIZWlnaHQ7CiAgICAgIGNsaWVudFdpZHRoID0gY2FjaGUuY2xpZW50V2lkdGg7CiAgICAgIGNsaWVudEhlaWdodCA9IGNhY2hlLmNsaWVudEhlaWdodDsKICAgIH0KICAgIGlmICghaGFzT3ZlcmZsb3dYICYmICFoYXNPdmVyZmxvd1kgfHwgIWlzU2Nyb2xsYWJsZVggJiYgIWlzU2Nyb2xsYWJsZVkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKGdlc3R1cmVPcmllbnRhdGlvbiA9PT0gInZlcnRpY2FsIiAmJiAoIWhhc092ZXJmbG93WSB8fCAhaXNTY3JvbGxhYmxlWSkpCiAgICAgIHJldHVybiBmYWxzZTsKICAgIGlmIChnZXN0dXJlT3JpZW50YXRpb24gPT09ICJob3Jpem9udGFsIiAmJiAoIWhhc092ZXJmbG93WCB8fCAhaXNTY3JvbGxhYmxlWCkpCiAgICAgIHJldHVybiBmYWxzZTsKICAgIGxldCBvcmllbnRhdGlvbjsKICAgIGlmIChnZXN0dXJlT3JpZW50YXRpb24gPT09ICJob3Jpem9udGFsIikgewogICAgICBvcmllbnRhdGlvbiA9ICJ4IjsKICAgIH0gZWxzZSBpZiAoZ2VzdHVyZU9yaWVudGF0aW9uID09PSAidmVydGljYWwiKSB7CiAgICAgIG9yaWVudGF0aW9uID0gInkiOwogICAgfSBlbHNlIHsKICAgICAgY29uc3QgaXNTY3JvbGxpbmdYID0gZGVsdGFYICE9PSAwOwogICAgICBjb25zdCBpc1Njcm9sbGluZ1kgPSBkZWx0YVkgIT09IDA7CiAgICAgIGlmIChpc1Njcm9sbGluZ1ggJiYgaGFzT3ZlcmZsb3dYICYmIGlzU2Nyb2xsYWJsZVgpIHsKICAgICAgICBvcmllbnRhdGlvbiA9ICJ4IjsKICAgICAgfQogICAgICBpZiAoaXNTY3JvbGxpbmdZICYmIGhhc092ZXJmbG93WSAmJiBpc1Njcm9sbGFibGVZKSB7CiAgICAgICAgb3JpZW50YXRpb24gPSAieSI7CiAgICAgIH0KICAgIH0KICAgIGlmICghb3JpZW50YXRpb24pIHJldHVybiBmYWxzZTsKICAgIGxldCBzY3JvbGwsIG1heFNjcm9sbCwgZGVsdGEsIGhhc092ZXJmbG93LCBpc1Njcm9sbGFibGU7CiAgICBpZiAob3JpZW50YXRpb24gPT09ICJ4IikgewogICAgICBzY3JvbGwgPSBub2RlMi5zY3JvbGxMZWZ0OwogICAgICBtYXhTY3JvbGwgPSBzY3JvbGxXaWR0aCAtIGNsaWVudFdpZHRoOwogICAgICBkZWx0YSA9IGRlbHRhWDsKICAgICAgaGFzT3ZlcmZsb3cgPSBoYXNPdmVyZmxvd1g7CiAgICAgIGlzU2Nyb2xsYWJsZSA9IGlzU2Nyb2xsYWJsZVg7CiAgICB9IGVsc2UgaWYgKG9yaWVudGF0aW9uID09PSAieSIpIHsKICAgICAgc2Nyb2xsID0gbm9kZTIuc2Nyb2xsVG9wOwogICAgICBtYXhTY3JvbGwgPSBzY3JvbGxIZWlnaHQgLSBjbGllbnRIZWlnaHQ7CiAgICAgIGRlbHRhID0gZGVsdGFZOwogICAgICBoYXNPdmVyZmxvdyA9IGhhc092ZXJmbG93WTsKICAgICAgaXNTY3JvbGxhYmxlID0gaXNTY3JvbGxhYmxlWTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGNvbnN0IHdpbGxTY3JvbGwgPSBkZWx0YSA+IDAgPyBzY3JvbGwgPCBtYXhTY3JvbGwgOiBzY3JvbGwgPiAwOwogICAgcmV0dXJuIHdpbGxTY3JvbGwgJiYgaGFzT3ZlcmZsb3cgJiYgaXNTY3JvbGxhYmxlOwogIH0KICAvKioKICAgKiBUaGUgcm9vdCBlbGVtZW50IG9uIHdoaWNoIGxlbmlzIGlzIGluc3RhbmNlZAogICAqLwogIGdldCByb290RWxlbWVudCgpIHsKICAgIHJldHVybiB0aGlzLm9wdGlvbnMud3JhcHBlciA9PT0gd2luZG93ID8gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IDogdGhpcy5vcHRpb25zLndyYXBwZXI7CiAgfQogIC8qKgogICAqIFRoZSBsaW1pdCB3aGljaCBpcyB0aGUgbWF4aW11bSBzY3JvbGwgdmFsdWUKICAgKi8KICBnZXQgbGltaXQoKSB7CiAgICBpZiAodGhpcy5vcHRpb25zLm5haXZlRGltZW5zaW9ucykgewogICAgICBpZiAodGhpcy5pc0hvcml6b250YWwpIHsKICAgICAgICByZXR1cm4gdGhpcy5yb290RWxlbWVudC5zY3JvbGxXaWR0aCAtIHRoaXMucm9vdEVsZW1lbnQuY2xpZW50V2lkdGg7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHRoaXMucm9vdEVsZW1lbnQuc2Nyb2xsSGVpZ2h0IC0gdGhpcy5yb290RWxlbWVudC5jbGllbnRIZWlnaHQ7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0aGlzLmRpbWVuc2lvbnMubGltaXRbdGhpcy5pc0hvcml6b250YWwgPyAieCIgOiAieSJdOwogICAgfQogIH0KICAvKioKICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgc2Nyb2xsIGlzIGhvcml6b250YWwKICAgKi8KICBnZXQgaXNIb3Jpem9udGFsKCkgewogICAgcmV0dXJuIHRoaXMub3B0aW9ucy5vcmllbnRhdGlvbiA9PT0gImhvcml6b250YWwiOwogIH0KICAvKioKICAgKiBUaGUgYWN0dWFsIHNjcm9sbCB2YWx1ZQogICAqLwogIGdldCBhY3R1YWxTY3JvbGwoKSB7CiAgICBjb25zdCB3cmFwcGVyID0gdGhpcy5vcHRpb25zLndyYXBwZXI7CiAgICByZXR1cm4gdGhpcy5pc0hvcml6b250YWwgPyB3cmFwcGVyLnNjcm9sbFggPz8gd3JhcHBlci5zY3JvbGxMZWZ0IDogd3JhcHBlci5zY3JvbGxZID8/IHdyYXBwZXIuc2Nyb2xsVG9wOwogIH0KICAvKioKICAgKiBUaGUgY3VycmVudCBzY3JvbGwgdmFsdWUKICAgKi8KICBnZXQgc2Nyb2xsKCkgewogICAgcmV0dXJuIHRoaXMub3B0aW9ucy5pbmZpbml0ZSA/IG1vZHVsbyh0aGlzLmFuaW1hdGVkU2Nyb2xsLCB0aGlzLmxpbWl0KSA6IHRoaXMuYW5pbWF0ZWRTY3JvbGw7CiAgfQogIC8qKgogICAqIFRoZSBwcm9ncmVzcyBvZiB0aGUgc2Nyb2xsIHJlbGF0aXZlIHRvIHRoZSBsaW1pdAogICAqLwogIGdldCBwcm9ncmVzcygpIHsKICAgIHJldHVybiB0aGlzLmxpbWl0ID09PSAwID8gMSA6IHRoaXMuc2Nyb2xsIC8gdGhpcy5saW1pdDsKICB9CiAgLyoqCiAgICogQ3VycmVudCBzY3JvbGwgc3RhdGUKICAgKi8KICBnZXQgaXNTY3JvbGxpbmcoKSB7CiAgICByZXR1cm4gdGhpcy5faXNTY3JvbGxpbmc7CiAgfQogIHNldCBpc1Njcm9sbGluZyh2YWx1ZTIpIHsKICAgIGlmICh0aGlzLl9pc1Njcm9sbGluZyAhPT0gdmFsdWUyKSB7CiAgICAgIHRoaXMuX2lzU2Nyb2xsaW5nID0gdmFsdWUyOwogICAgICB0aGlzLnVwZGF0ZUNsYXNzTmFtZSgpOwogICAgfQogIH0KICAvKioKICAgKiBDaGVjayBpZiBsZW5pcyBpcyBzdG9wcGVkCiAgICovCiAgZ2V0IGlzU3RvcHBlZCgpIHsKICAgIHJldHVybiB0aGlzLl9pc1N0b3BwZWQ7CiAgfQogIHNldCBpc1N0b3BwZWQodmFsdWUyKSB7CiAgICBpZiAodGhpcy5faXNTdG9wcGVkICE9PSB2YWx1ZTIpIHsKICAgICAgdGhpcy5faXNTdG9wcGVkID0gdmFsdWUyOwogICAgICB0aGlzLnVwZGF0ZUNsYXNzTmFtZSgpOwogICAgfQogIH0KICAvKioKICAgKiBDaGVjayBpZiBsZW5pcyBpcyBsb2NrZWQKICAgKi8KICBnZXQgaXNMb2NrZWQoKSB7CiAgICByZXR1cm4gdGhpcy5faXNMb2NrZWQ7CiAgfQogIHNldCBpc0xvY2tlZCh2YWx1ZTIpIHsKICAgIGlmICh0aGlzLl9pc0xvY2tlZCAhPT0gdmFsdWUyKSB7CiAgICAgIHRoaXMuX2lzTG9ja2VkID0gdmFsdWUyOwogICAgICB0aGlzLnVwZGF0ZUNsYXNzTmFtZSgpOwogICAgfQogIH0KICAvKioKICAgKiBDaGVjayBpZiBsZW5pcyBpcyBzbW9vdGggc2Nyb2xsaW5nCiAgICovCiAgZ2V0IGlzU21vb3RoKCkgewogICAgcmV0dXJuIHRoaXMuaXNTY3JvbGxpbmcgPT09ICJzbW9vdGgiOwogIH0KICAvKioKICAgKiBUaGUgY2xhc3MgbmFtZSBhcHBsaWVkIHRvIHRoZSB3cmFwcGVyIGVsZW1lbnQKICAgKi8KICBnZXQgY2xhc3NOYW1lKCkgewogICAgbGV0IGNsYXNzTmFtZSA9ICJsZW5pcyI7CiAgICBpZiAodGhpcy5vcHRpb25zLmF1dG9Ub2dnbGUpIGNsYXNzTmFtZSArPSAiIGxlbmlzLWF1dG9Ub2dnbGUiOwogICAgaWYgKHRoaXMuaXNTdG9wcGVkKSBjbGFzc05hbWUgKz0gIiBsZW5pcy1zdG9wcGVkIjsKICAgIGlmICh0aGlzLmlzTG9ja2VkKSBjbGFzc05hbWUgKz0gIiBsZW5pcy1sb2NrZWQiOwogICAgaWYgKHRoaXMuaXNTY3JvbGxpbmcpIGNsYXNzTmFtZSArPSAiIGxlbmlzLXNjcm9sbGluZyI7CiAgICBpZiAodGhpcy5pc1Njcm9sbGluZyA9PT0gInNtb290aCIpIGNsYXNzTmFtZSArPSAiIGxlbmlzLXNtb290aCI7CiAgICByZXR1cm4gY2xhc3NOYW1lOwogIH0KICB1cGRhdGVDbGFzc05hbWUoKSB7CiAgICB0aGlzLmNsZWFuVXBDbGFzc05hbWUoKTsKICAgIHRoaXMucm9vdEVsZW1lbnQuY2xhc3NOYW1lID0gYCR7dGhpcy5yb290RWxlbWVudC5jbGFzc05hbWV9ICR7dGhpcy5jbGFzc05hbWV9YC50cmltKCk7CiAgfQogIGNsZWFuVXBDbGFzc05hbWUoKSB7CiAgICB0aGlzLnJvb3RFbGVtZW50LmNsYXNzTmFtZSA9IHRoaXMucm9vdEVsZW1lbnQuY2xhc3NOYW1lLnJlcGxhY2UoL2xlbmlzKC1cdyspPy9nLCAiIikudHJpbSgpOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWRvbXRvb2xzQDIuNS4xL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWRvbXRvb2xzL2Rpc3RfdHMvZG9tdG9vbHMucGx1Z2lucy5qcwp2YXIgaW1wb3J0X3N3ZWV0X3Njcm9sbCA9IF9fdG9FU00ocmVxdWlyZV9zd2VldF9zY3JvbGwoKSwgMSk7CnZhciBsaWsgPSB7CiAgT2JqZWN0TWFwLAogIFN0cmluZ21hcCwKICBGYXN0TWFwCn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1kb210b29sc0AyLjUuMS9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1kb210b29scy9kaXN0X3RzL2RvbXRvb2xzLmNzcy5icmVha3BvaW50cy5qcwp2YXIgZG9tdG9vbHNfY3NzX2JyZWFrcG9pbnRzX2V4cG9ydHMgPSB7fTsKX19leHBvcnQoZG9tdG9vbHNfY3NzX2JyZWFrcG9pbnRzX2V4cG9ydHMsIHsKICBjb250YWluZXJDb250ZXh0U3R5bGVzOiAoKSA9PiBjb250YWluZXJDb250ZXh0U3R5bGVzLAogIGNzc0ZvckNvbnN0cmFpbnQ6ICgpID0+IGNzc0ZvckNvbnN0cmFpbnQsCiAgY3NzRm9yQ29uc3RyYWludENvbnRhaW5lcjogKCkgPT4gY3NzRm9yQ29uc3RyYWludENvbnRhaW5lciwKICBjc3NGb3JDb250YWluZXI6ICgpID0+IGNzc0ZvckNvbnRhaW5lciwKICBjc3NGb3JEZXNrdG9wOiAoKSA9PiBjc3NGb3JEZXNrdG9wLAogIGNzc0Zvck5vdGVib29rOiAoKSA9PiBjc3NGb3JOb3RlYm9vaywKICBjc3NGb3JQaGFibGV0OiAoKSA9PiBjc3NGb3JQaGFibGV0LAogIGNzc0ZvclBob25lOiAoKSA9PiBjc3NGb3JQaG9uZSwKICBjc3NGb3JUYWJsZXQ6ICgpID0+IGNzc0ZvclRhYmxldCwKICBjc3NGb3JWaWV3cG9ydDogKCkgPT4gY3NzRm9yVmlld3BvcnQsCiAgZGVza3RvcDogKCkgPT4gZGVza3RvcCwKICBub3RlYm9vazogKCkgPT4gbm90ZWJvb2ssCiAgcGhhYmxldDogKCkgPT4gcGhhYmxldCwKICBwaG9uZTogKCkgPT4gcGhvbmUsCiAgdGFibGV0OiAoKSA9PiB0YWJsZXQKfSk7CnZhciBkZXNrdG9wID0gMTYwMDsKdmFyIG5vdGVib29rID0gMTI0MDsKdmFyIHRhYmxldCA9IDEwMjQ7CnZhciBwaGFibGV0ID0gNjAwOwp2YXIgcGhvbmUgPSA0MDA7CnZhciBidWlsZENvbmRpdGlvbiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGNvbnN0cmFpbnRzKSA9PiB7CiAgY29uc3QgcGFydHMgPSBbXTsKICBpZiAoY29uc3RyYWludHMubWluV2lkdGgpCiAgICBwYXJ0cy5wdXNoKGAobWluLXdpZHRoOiAke2NvbnN0cmFpbnRzLm1pbldpZHRofXB4KWApOwogIGlmIChjb25zdHJhaW50cy5tYXhXaWR0aCkKICAgIHBhcnRzLnB1c2goYChtYXgtd2lkdGg6ICR7Y29uc3RyYWludHMubWF4V2lkdGh9cHgpYCk7CiAgcmV0dXJuIHBhcnRzLmpvaW4oIiBhbmQgIik7Cn0sICJidWlsZENvbmRpdGlvbiIpOwp2YXIgY3NzRm9yVmlld3BvcnQgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChjc3NBcmcsIGNvbmRpdGlvbikgPT4gewogIHJldHVybiByKGAKICAgIEBjb250YWluZXIgd2NjVG9vbHNWaWV3cG9ydCAke2NvbmRpdGlvbn0gewogICAgICAke2Nzc0FyZy5jc3NUZXh0fQogICAgfQogICAgQG1lZGlhICR7Y29uZGl0aW9ufSB7CiAgICAgICR7Y3NzQXJnLmNzc1RleHR9CiAgICB9CiAgYCk7Cn0sICJjc3NGb3JWaWV3cG9ydCIpOwp2YXIgY3NzRm9yQ29udGFpbmVyID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoY3NzQXJnLCBjb25kaXRpb24sIGNvbnRhaW5lck5hbWUpID0+IHsKICByZXR1cm4gcihgCiAgICBAY29udGFpbmVyICR7Y29udGFpbmVyTmFtZX0gJHtjb25kaXRpb259IHsKICAgICAgJHtjc3NBcmcuY3NzVGV4dH0KICAgIH0KICBgKTsKfSwgImNzc0ZvckNvbnRhaW5lciIpOwp2YXIgY3NzRm9yQ29uc3RyYWludCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGNvbnN0cmFpbnRzKSA9PiAoY3NzQXJnKSA9PiBjc3NGb3JWaWV3cG9ydChjc3NBcmcsIGJ1aWxkQ29uZGl0aW9uKGNvbnN0cmFpbnRzKSksICJjc3NGb3JDb25zdHJhaW50Iik7CnZhciBjc3NGb3JDb25zdHJhaW50Q29udGFpbmVyID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoY29uc3RyYWludHMsIGNvbnRhaW5lck5hbWUpID0+IChjc3NBcmcpID0+IGNzc0ZvckNvbnRhaW5lcihjc3NBcmcsIGJ1aWxkQ29uZGl0aW9uKGNvbnN0cmFpbnRzKSwgY29udGFpbmVyTmFtZSksICJjc3NGb3JDb25zdHJhaW50Q29udGFpbmVyIik7CnZhciBjb250YWluZXJDb250ZXh0U3R5bGVzID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoY29udGFpbmVyTmFtZSkgPT4gaWAKICA6aG9zdCB7CiAgICBjb250YWluZXItdHlwZTogaW5saW5lLXNpemU7CiAgICBjb250YWluZXItbmFtZTogJHtyKGNvbnRhaW5lck5hbWUpfTsKICB9CmAsICJjb250YWluZXJDb250ZXh0U3R5bGVzIik7CnZhciBjc3NGb3JEZXNrdG9wID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoY3NzQXJnKSA9PiB7CiAgcmV0dXJuIGNzc0ZvclZpZXdwb3J0KGNzc0FyZywgYChtaW4td2lkdGg6ICR7ZGVza3RvcH1weClgKTsKfSwgImNzc0ZvckRlc2t0b3AiKTsKdmFyIGNzc0Zvck5vdGVib29rID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoY3NzQXJnKSA9PiB7CiAgcmV0dXJuIGNzc0ZvclZpZXdwb3J0KGNzc0FyZywgYChtYXgtd2lkdGg6ICR7bm90ZWJvb2t9cHgpYCk7Cn0sICJjc3NGb3JOb3RlYm9vayIpOwp2YXIgY3NzRm9yVGFibGV0ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoY3NzQXJnKSA9PiB7CiAgcmV0dXJuIGNzc0ZvclZpZXdwb3J0KGNzc0FyZywgYChtYXgtd2lkdGg6ICR7dGFibGV0fXB4KWApOwp9LCAiY3NzRm9yVGFibGV0Iik7CnZhciBjc3NGb3JQaGFibGV0ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoY3NzQXJnKSA9PiB7CiAgcmV0dXJuIGNzc0ZvclZpZXdwb3J0KGNzc0FyZywgYChtYXgtd2lkdGg6ICR7cGhhYmxldH1weClgKTsKfSwgImNzc0ZvclBoYWJsZXQiKTsKdmFyIGNzc0ZvclBob25lID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoY3NzQXJnKSA9PiB7CiAgcmV0dXJuIGNzc0ZvclZpZXdwb3J0KGNzc0FyZywgYChtYXgtd2lkdGg6ICR7cGhvbmV9cHgpYCk7Cn0sICJjc3NGb3JQaG9uZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZG9tdG9vbHNAMi41LjEvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZG9tdG9vbHMvZGlzdF90cy9kb210b29scy5jbGFzc2VzLnNjcm9sbGVyLmpzCnZhciBTY3JvbGxlciA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJTY3JvbGxlciIpOwogIH0KICBkb210b29sc0luc3RhbmNlOwogIC8vIEFycmF5IHRvIHN0b3JlIHNjcm9sbCBjYWxsYmFjayBmdW5jdGlvbnMuCiAgc2Nyb2xsQ2FsbGJhY2tzID0gW107CiAgLy8gTGVuaXMgaW5zdGFuY2UgKGlmIGFjdGl2YXRlZCkgb3IgbnVsbC4KICBsZW5pc0luc3RhbmNlID0gbnVsbDsKICAvLyBCb3VuZCBoYW5kbGVycyB0byBhbGxvdyByZW1vdmFsIGZyb20gZXZlbnQgbGlzdGVuZXJzLgogIGhhbmRsZU5hdGl2ZVNjcm9sbCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGV2ZW50KSA9PiB7CiAgICB0aGlzLmV4ZWN1dGVTY3JvbGxDYWxsYmFja3MoKTsKICB9LCAiaGFuZGxlTmF0aXZlU2Nyb2xsIik7CiAgaGFuZGxlTGVuaXNTY3JvbGwgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChpbmZvKSA9PiB7CiAgICB0aGlzLmV4ZWN1dGVTY3JvbGxDYWxsYmFja3MoKTsKICB9LCAiaGFuZGxlTGVuaXNTY3JvbGwiKTsKICBjb25zdHJ1Y3Rvcihkb210b29sc0luc3RhbmNlQXJnKSB7CiAgICB0aGlzLmRvbXRvb2xzSW5zdGFuY2UgPSBkb210b29sc0luc3RhbmNlQXJnOwogICAgdGhpcy5hdHRhY2hOYXRpdmVTY3JvbGxMaXN0ZW5lcigpOwogIH0KICBzd2VldFNjcm9sbGVyID0gbmV3IGltcG9ydF9zd2VldF9zY3JvbGwuZGVmYXVsdCh7fSk7CiAgLyoqCiAgICogU2Nyb2xscyB0byBhIGdpdmVuIGVsZW1lbnQgd2l0aCBvcHRpb25zLgogICAqLwogIGFzeW5jIHRvRWxlbWVudChlbGVtZW50QXJnLCBvcHRpb25zQXJnKSB7CiAgICB0aGlzLnN3ZWV0U2Nyb2xsZXIudG9FbGVtZW50KGVsZW1lbnRBcmcsIG9wdGlvbnNBcmcpOwogICAgYXdhaXQgZGlzdF90c19leHBvcnRzMy5kZWxheUZvcihvcHRpb25zQXJnLmR1cmF0aW9uKTsKICB9CiAgLyoqCiAgICogRGV0ZWN0cyB3aGV0aGVyIG5hdGl2ZSBzbW9vdGggc2Nyb2xsaW5nIGlzIGVuYWJsZWQuCiAgICovCiAgYXN5bmMgZGV0ZWN0TmF0aXZlU21vb3RoU2Nyb2xsKCkgewogICAgY29uc3QgZG9uZSA9IGRpc3RfdHNfZXhwb3J0cy5kZWZlcigpOwogICAgY29uc3Qgc2FtcGxlU2l6ZSA9IDEwMDsKICAgIGNvbnN0IGFjY2VwdGFibGVEZWx0YURpZmZlcmVuY2UgPSAzOwogICAgY29uc3QgbWluaW11bVNtb290aFJhdGlvID0gMC43NTsKICAgIGNvbnN0IGV2ZW50RGVsdGFzID0gW107CiAgICBmdW5jdGlvbiBvbldoZWVsKGV2ZW50KSB7CiAgICAgIGV2ZW50RGVsdGFzLnB1c2goZXZlbnQuZGVsdGFZKTsKICAgICAgaWYgKGV2ZW50RGVsdGFzLmxlbmd0aCA+PSBzYW1wbGVTaXplKSB7CiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIndoZWVsIiwgb25XaGVlbCk7CiAgICAgICAgYW5hbHl6ZUV2ZW50cygpOwogICAgICB9CiAgICB9CiAgICBfX25hbWUob25XaGVlbCwgIm9uV2hlZWwiKTsKICAgIGZ1bmN0aW9uIGFuYWx5emVFdmVudHMoKSB7CiAgICAgIGNvbnN0IHRvdGFsRGlmZnMgPSBldmVudERlbHRhcy5sZW5ndGggLSAxOwogICAgICBsZXQgc21hbGxEaWZmQ291bnQgPSAwOwogICAgICBmb3IgKGxldCBpMTAgPSAwOyBpMTAgPCB0b3RhbERpZmZzOyBpMTArKykgewogICAgICAgIGNvbnN0IGRpZmYgPSBNYXRoLmFicyhldmVudERlbHRhc1tpMTAgKyAxXSAtIGV2ZW50RGVsdGFzW2kxMF0pOwogICAgICAgIGlmIChkaWZmIDw9IGFjY2VwdGFibGVEZWx0YURpZmZlcmVuY2UpIHsKICAgICAgICAgIHNtYWxsRGlmZkNvdW50Kys7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IHNtb290aFJhdGlvID0gc21hbGxEaWZmQ291bnQgLyB0b3RhbERpZmZzOwogICAgICBpZiAoc21vb3RoUmF0aW8gPj0gbWluaW11bVNtb290aFJhdGlvKSB7CiAgICAgICAgY29uc29sZS5sb2coIlNtb290aCBzY3JvbGxpbmcgZGV0ZWN0ZWQuIik7CiAgICAgICAgZG9uZS5yZXNvbHZlKHRydWUpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnNvbGUubG9nKCJTbW9vdGggc2Nyb2xsaW5nIE5PVCBkZXRlY3RlZC4iKTsKICAgICAgICBkb25lLnJlc29sdmUoZmFsc2UpOwogICAgICB9CiAgICB9CiAgICBfX25hbWUoYW5hbHl6ZUV2ZW50cywgImFuYWx5emVFdmVudHMiKTsKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ3aGVlbCIsIG9uV2hlZWwpOwogICAgcmV0dXJuIGRvbmUucHJvbWlzZTsKICB9CiAgLyoqCiAgICogRW5hYmxlcyBMZW5pcyBzY3JvbGxpbmcuCiAgICogSWYgb3B0aW9uc0FyZy5kaXNhYmxlT25OYXRpdmVTbW9vdGhTY3JvbGwgaXMgdHJ1ZSBhbmQgbmF0aXZlIHNtb290aCBzY3JvbGxpbmcgaXMgZGV0ZWN0ZWQsCiAgICogTGVuaXMgd2lsbCBiZSBkZXN0cm95ZWQgaW1tZWRpYXRlbHkuCiAgICovCiAgYXN5bmMgZW5hYmxlTGVuaXNTY3JvbGwob3B0aW9uc0FyZykgewogICAgY29uc3QgbGVuaXMgPSBuZXcgTGVuaXMoewogICAgICBhdXRvUmFmOiB0cnVlCiAgICB9KTsKICAgIGlmIChvcHRpb25zQXJnPy5kaXNhYmxlT25OYXRpdmVTbW9vdGhTY3JvbGwpIHsKICAgICAgaWYgKGF3YWl0IHRoaXMuZGV0ZWN0TmF0aXZlU21vb3RoU2Nyb2xsKCkpIHsKICAgICAgICBsZW5pcy5kZXN0cm95KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgICB0aGlzLmxlbmlzSW5zdGFuY2UgPSBsZW5pczsKICAgIHRoaXMuZGV0YWNoTmF0aXZlU2Nyb2xsTGlzdGVuZXIoKTsKICAgIHRoaXMuYXR0YWNoTGVuaXNTY3JvbGxMaXN0ZW5lcigpOwogICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gbGVuaXMuZGVzdHJveS5iaW5kKGxlbmlzKTsKICAgIGxlbmlzLmRlc3Ryb3kgPSAoKSA9PiB7CiAgICAgIG9yaWdpbmFsRGVzdHJveSgpOwogICAgICB0aGlzLmRldGFjaExlbmlzU2Nyb2xsTGlzdGVuZXIoKTsKICAgICAgdGhpcy5hdHRhY2hOYXRpdmVTY3JvbGxMaXN0ZW5lcigpOwogICAgICB0aGlzLmxlbmlzSW5zdGFuY2UgPSBudWxsOwogICAgfTsKICB9CiAgLyoqCiAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdG8gYmUgZXhlY3V0ZWQgb24gc2Nyb2xsLgogICAqIEBwYXJhbSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgb24gZWFjaCBzY3JvbGwgZXZlbnQuCiAgICovCiAgb25TY3JvbGwoY2FsbGJhY2spIHsKICAgIHRoaXMuc2Nyb2xsQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spOwogIH0KICAvKioKICAgKiBFeGVjdXRlcyBhbGwgcmVnaXN0ZXJlZCBzY3JvbGwgY2FsbGJhY2tzIGNvbmN1cnJlbnRseS4KICAgKi8KICBleGVjdXRlU2Nyb2xsQ2FsbGJhY2tzKCkgewogICAgdGhpcy5zY3JvbGxDYWxsYmFja3MuZm9yRWFjaCgoY2FsbGJhY2spID0+IHsKICAgICAgdHJ5IHsKICAgICAgICBjYWxsYmFjaygpOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIkVycm9yIGluIHNjcm9sbCBjYWxsYmFjazoiLCBlcnJvcik7CiAgICAgIH0KICAgIH0pOwogIH0KICAvKioKICAgKiBBdHRhY2hlcyB0aGUgbmF0aXZlIHNjcm9sbCBldmVudCBsaXN0ZW5lci4KICAgKi8KICBhdHRhY2hOYXRpdmVTY3JvbGxMaXN0ZW5lcigpIHsKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLCB0aGlzLmhhbmRsZU5hdGl2ZVNjcm9sbCk7CiAgfQogIC8qKgogICAqIERldGFjaGVzIHRoZSBuYXRpdmUgc2Nyb2xsIGV2ZW50IGxpc3RlbmVyLgogICAqLwogIGRldGFjaE5hdGl2ZVNjcm9sbExpc3RlbmVyKCkgewogICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInNjcm9sbCIsIHRoaXMuaGFuZGxlTmF0aXZlU2Nyb2xsKTsKICB9CiAgLyoqCiAgICogQXR0YWNoZXMgdGhlIExlbmlzIHNjcm9sbCBldmVudCBsaXN0ZW5lci4KICAgKi8KICBhdHRhY2hMZW5pc1Njcm9sbExpc3RlbmVyKCkgewogICAgaWYgKHRoaXMubGVuaXNJbnN0YW5jZSkgewogICAgICB0aGlzLmxlbmlzSW5zdGFuY2Uub24oInNjcm9sbCIsIHRoaXMuaGFuZGxlTGVuaXNTY3JvbGwpOwogICAgfQogIH0KICAvKioKICAgKiBEZXRhY2hlcyB0aGUgTGVuaXMgc2Nyb2xsIGV2ZW50IGxpc3RlbmVyLgogICAqLwogIGRldGFjaExlbmlzU2Nyb2xsTGlzdGVuZXIoKSB7CiAgICBpZiAodGhpcy5sZW5pc0luc3RhbmNlKSB7CiAgICAgIHRoaXMubGVuaXNJbnN0YW5jZS5vZmYoInNjcm9sbCIsIHRoaXMuaGFuZGxlTGVuaXNTY3JvbGwpOwogICAgfQogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWRvbXRvb2xzQDIuNS4xL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWRvbXRvb2xzL2Rpc3RfdHMvZG9tdG9vbHMuY2xhc3Nlcy50aGVtZW1hbmFnZXIuanMKdmFyIFRoZW1lTWFuYWdlciA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJUaGVtZU1hbmFnZXIiKTsKICB9CiAgZG9tdG9vbHNSZWY7CiAgZ29CcmlnaHRCb29sZWFuID0gZmFsc2U7CiAgcHJlZmVycmVkQ29sb3JTY2hlbWVNZWRpYU1hdGNoID0gd2luZG93Lm1hdGNoTWVkaWEoIihwcmVmZXJzLWNvbG9yLXNjaGVtZTogbGlnaHQpIik7CiAgdGhlbWVPYnNlcnZhYmxlID0gbmV3IGRpc3RfdHNfZXhwb3J0czIucnhqcy5SZXBsYXlTdWJqZWN0KDEpOwogIGNvbnN0cnVjdG9yKGRvbXRvb2xzUmVmQXJnKSB7CiAgICB0aGlzLmRvbXRvb2xzUmVmID0gZG9tdG9vbHNSZWZBcmc7CiAgICB0aGlzLmdvQnJpZ2h0Qm9vbGVhbiA9IHRoaXMucHJlZmVycmVkQ29sb3JTY2hlbWVNZWRpYU1hdGNoLm1hdGNoZXM7CiAgICB0aGlzLnByZWZlcnJlZENvbG9yU2NoZW1lTWVkaWFNYXRjaC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCAoZXZlbnRBcmcpID0+IHsKICAgICAgdGhpcy5nb0JyaWdodEJvb2xlYW4gPSBldmVudEFyZy5tYXRjaGVzOwogICAgICB0aGlzLnVwZGF0ZUFsbENvbm5lY3RlZEVsZW1lbnRzKCk7CiAgICB9KTsKICAgIHRoaXMudXBkYXRlQWxsQ29ubmVjdGVkRWxlbWVudHMoKTsKICB9CiAgYXN5bmMgZW5hYmxlQXV0b21hdGljR2xvYmFsVGhlbWVDaGFuZ2UoKSB7CiAgICBpZiAoZG9jdW1lbnQuYm9keSAmJiBkb2N1bWVudC5ib2R5LnN0eWxlKSB7CiAgICAgIHRoaXMudGhlbWVPYnNlcnZhYmxlLnN1YnNjcmliZSh7CiAgICAgICAgbmV4dDogLyogQF9fUFVSRV9fICovIF9fbmFtZSgoZ29CcmlnaHQpID0+IHsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuYmFja2dyb3VuZCA9IGdvQnJpZ2h0ID8gIiNmZmYiIDogIiMwMDAiOwogICAgICAgIH0sICJuZXh0IikKICAgICAgfSk7CiAgICB9CiAgfQogIGFzeW5jIHVwZGF0ZUFsbENvbm5lY3RlZEVsZW1lbnRzKCkgewogICAgdGhpcy50aGVtZU9ic2VydmFibGUubmV4dCh0aGlzLmdvQnJpZ2h0Qm9vbGVhbik7CiAgfQogIC8qKgogICAqIHNldCB0aGUgdGhlbWUgb2YgdGhlIHdlYnNpdGUgdG8gYnJpZ2h0CiAgICovCiAgZ29CcmlnaHQoKSB7CiAgICB0aGlzLmdvQnJpZ2h0Qm9vbGVhbiA9IHRydWU7CiAgICB0aGlzLnVwZGF0ZUFsbENvbm5lY3RlZEVsZW1lbnRzKCk7CiAgfQogIC8qKgogICAqIHNldCB0aGUgdGhlbWUgb2YgdGhlIHdlYnNpdGUgdG8gZGFyawogICAqLwogIGdvRGFyaygpIHsKICAgIHRoaXMuZ29CcmlnaHRCb29sZWFuID0gZmFsc2U7CiAgICB0aGlzLnVwZGF0ZUFsbENvbm5lY3RlZEVsZW1lbnRzKCk7CiAgfQogIC8qKgogICAqIHNpbXBseSB0b2dnbGUgYmV0d2VlbiBicmlnaHQgYW5kIGRhcmsKICAgKi8KICB0b2dnbGVEYXJrQnJpZ2h0KCkgewogICAgdGhpcy5nb0JyaWdodEJvb2xlYW4gPSAhdGhpcy5nb0JyaWdodEJvb2xlYW47CiAgICB0aGlzLnVwZGF0ZUFsbENvbm5lY3RlZEVsZW1lbnRzKCk7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZG9tdG9vbHNAMi41LjEvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZG9tdG9vbHMvZGlzdF90cy9kb210b29scy5jbGFzc2VzLmtleWJvYXJkLmpzCnZhciBLZXk7CihmdW5jdGlvbihLZXkyKSB7CiAgS2V5MltLZXkyWyJCYWNrc3BhY2UiXSA9IDhdID0gIkJhY2tzcGFjZSI7CiAgS2V5MltLZXkyWyJUYWIiXSA9IDldID0gIlRhYiI7CiAgS2V5MltLZXkyWyJFbnRlciJdID0gMTNdID0gIkVudGVyIjsKICBLZXkyW0tleTJbIlNoaWZ0Il0gPSAxNl0gPSAiU2hpZnQiOwogIEtleTJbS2V5MlsiQ3RybCJdID0gMTddID0gIkN0cmwiOwogIEtleTJbS2V5MlsiQWx0Il0gPSAxOF0gPSAiQWx0IjsKICBLZXkyW0tleTJbIlBhdXNlQnJlYWsiXSA9IDE5XSA9ICJQYXVzZUJyZWFrIjsKICBLZXkyW0tleTJbIkNhcHNMb2NrIl0gPSAyMF0gPSAiQ2Fwc0xvY2siOwogIEtleTJbS2V5MlsiRXNjYXBlIl0gPSAyN10gPSAiRXNjYXBlIjsKICBLZXkyW0tleTJbIlNwYWNlIl0gPSAzMl0gPSAiU3BhY2UiOwogIEtleTJbS2V5MlsiUGFnZVVwIl0gPSAzM10gPSAiUGFnZVVwIjsKICBLZXkyW0tleTJbIlBhZ2VEb3duIl0gPSAzNF0gPSAiUGFnZURvd24iOwogIEtleTJbS2V5MlsiRW5kIl0gPSAzNV0gPSAiRW5kIjsKICBLZXkyW0tleTJbIkhvbWUiXSA9IDM2XSA9ICJIb21lIjsKICBLZXkyW0tleTJbIkxlZnRBcnJvdyJdID0gMzddID0gIkxlZnRBcnJvdyI7CiAgS2V5MltLZXkyWyJVcEFycm93Il0gPSAzOF0gPSAiVXBBcnJvdyI7CiAgS2V5MltLZXkyWyJSaWdodEFycm93Il0gPSAzOV0gPSAiUmlnaHRBcnJvdyI7CiAgS2V5MltLZXkyWyJEb3duQXJyb3ciXSA9IDQwXSA9ICJEb3duQXJyb3ciOwogIEtleTJbS2V5MlsiSW5zZXJ0Il0gPSA0NV0gPSAiSW5zZXJ0IjsKICBLZXkyW0tleTJbIkRlbGV0ZSJdID0gNDZdID0gIkRlbGV0ZSI7CiAgS2V5MltLZXkyWyJaZXJvIl0gPSA0OF0gPSAiWmVybyI7CiAgS2V5MltLZXkyWyJDbG9zZWRQYXJlbiJdID0gNDhdID0gIkNsb3NlZFBhcmVuIjsKICBLZXkyW0tleTJbIk9uZSJdID0gNDldID0gIk9uZSI7CiAgS2V5MltLZXkyWyJFeGNsYW1hdGlvbk1hcmsiXSA9IDQ5XSA9ICJFeGNsYW1hdGlvbk1hcmsiOwogIEtleTJbS2V5MlsiVHdvIl0gPSA1MF0gPSAiVHdvIjsKICBLZXkyW0tleTJbIkF0U2lnbiJdID0gNTBdID0gIkF0U2lnbiI7CiAgS2V5MltLZXkyWyJUaHJlZSJdID0gNTFdID0gIlRocmVlIjsKICBLZXkyW0tleTJbIlBvdW5kU2lnbiJdID0gNTFdID0gIlBvdW5kU2lnbiI7CiAgS2V5MltLZXkyWyJIYXNoIl0gPSA1MV0gPSAiSGFzaCI7CiAgS2V5MltLZXkyWyJGb3VyIl0gPSA1Ml0gPSAiRm91ciI7CiAgS2V5MltLZXkyWyJEb2xsYXJTaWduIl0gPSA1Ml0gPSAiRG9sbGFyU2lnbiI7CiAgS2V5MltLZXkyWyJGaXZlIl0gPSA1M10gPSAiRml2ZSI7CiAgS2V5MltLZXkyWyJQZXJjZW50U2lnbiJdID0gNTNdID0gIlBlcmNlbnRTaWduIjsKICBLZXkyW0tleTJbIlNpeCJdID0gNTRdID0gIlNpeCI7CiAgS2V5MltLZXkyWyJDYXJldCJdID0gNTRdID0gIkNhcmV0IjsKICBLZXkyW0tleTJbIkhhdCJdID0gNTRdID0gIkhhdCI7CiAgS2V5MltLZXkyWyJTZXZlbiJdID0gNTVdID0gIlNldmVuIjsKICBLZXkyW0tleTJbIkFtcGVyc2FuZCJdID0gNTVdID0gIkFtcGVyc2FuZCI7CiAgS2V5MltLZXkyWyJFaWdodCJdID0gNTZdID0gIkVpZ2h0IjsKICBLZXkyW0tleTJbIlN0YXIiXSA9IDU2XSA9ICJTdGFyIjsKICBLZXkyW0tleTJbIkFzdGVyaWsiXSA9IDU2XSA9ICJBc3RlcmlrIjsKICBLZXkyW0tleTJbIk5pbmUiXSA9IDU3XSA9ICJOaW5lIjsKICBLZXkyW0tleTJbIk9wZW5QYXJlbiJdID0gNTddID0gIk9wZW5QYXJlbiI7CiAgS2V5MltLZXkyWyJBIl0gPSA2NV0gPSAiQSI7CiAgS2V5MltLZXkyWyJCIl0gPSA2Nl0gPSAiQiI7CiAgS2V5MltLZXkyWyJDIl0gPSA2N10gPSAiQyI7CiAgS2V5MltLZXkyWyJEIl0gPSA2OF0gPSAiRCI7CiAgS2V5MltLZXkyWyJFIl0gPSA2OV0gPSAiRSI7CiAgS2V5MltLZXkyWyJGIl0gPSA3MF0gPSAiRiI7CiAgS2V5MltLZXkyWyJHIl0gPSA3MV0gPSAiRyI7CiAgS2V5MltLZXkyWyJIIl0gPSA3Ml0gPSAiSCI7CiAgS2V5MltLZXkyWyJJIl0gPSA3M10gPSAiSSI7CiAgS2V5MltLZXkyWyJKIl0gPSA3NF0gPSAiSiI7CiAgS2V5MltLZXkyWyJLIl0gPSA3NV0gPSAiSyI7CiAgS2V5MltLZXkyWyJMIl0gPSA3Nl0gPSAiTCI7CiAgS2V5MltLZXkyWyJNIl0gPSA3N10gPSAiTSI7CiAgS2V5MltLZXkyWyJOIl0gPSA3OF0gPSAiTiI7CiAgS2V5MltLZXkyWyJPIl0gPSA3OV0gPSAiTyI7CiAgS2V5MltLZXkyWyJQIl0gPSA4MF0gPSAiUCI7CiAgS2V5MltLZXkyWyJRIl0gPSA4MV0gPSAiUSI7CiAgS2V5MltLZXkyWyJSIl0gPSA4Ml0gPSAiUiI7CiAgS2V5MltLZXkyWyJTIl0gPSA4M10gPSAiUyI7CiAgS2V5MltLZXkyWyJUIl0gPSA4NF0gPSAiVCI7CiAgS2V5MltLZXkyWyJVIl0gPSA4NV0gPSAiVSI7CiAgS2V5MltLZXkyWyJWIl0gPSA4Nl0gPSAiViI7CiAgS2V5MltLZXkyWyJXIl0gPSA4N10gPSAiVyI7CiAgS2V5MltLZXkyWyJYIl0gPSA4OF0gPSAiWCI7CiAgS2V5MltLZXkyWyJZIl0gPSA4OV0gPSAiWSI7CiAgS2V5MltLZXkyWyJaIl0gPSA5MF0gPSAiWiI7CiAgS2V5MltLZXkyWyJMZWZ0V2luZG93S2V5Il0gPSA5MV0gPSAiTGVmdFdpbmRvd0tleSI7CiAgS2V5MltLZXkyWyJSaWdodFdpbmRvd0tleSJdID0gOTJdID0gIlJpZ2h0V2luZG93S2V5IjsKICBLZXkyW0tleTJbIlNlbGVjdEtleSJdID0gOTNdID0gIlNlbGVjdEtleSI7CiAgS2V5MltLZXkyWyJOdW1wYWQwIl0gPSA5Nl0gPSAiTnVtcGFkMCI7CiAgS2V5MltLZXkyWyJOdW1wYWQxIl0gPSA5N10gPSAiTnVtcGFkMSI7CiAgS2V5MltLZXkyWyJOdW1wYWQyIl0gPSA5OF0gPSAiTnVtcGFkMiI7CiAgS2V5MltLZXkyWyJOdW1wYWQzIl0gPSA5OV0gPSAiTnVtcGFkMyI7CiAgS2V5MltLZXkyWyJOdW1wYWQ0Il0gPSAxMDBdID0gIk51bXBhZDQiOwogIEtleTJbS2V5MlsiTnVtcGFkNSJdID0gMTAxXSA9ICJOdW1wYWQ1IjsKICBLZXkyW0tleTJbIk51bXBhZDYiXSA9IDEwMl0gPSAiTnVtcGFkNiI7CiAgS2V5MltLZXkyWyJOdW1wYWQ3Il0gPSAxMDNdID0gIk51bXBhZDciOwogIEtleTJbS2V5MlsiTnVtcGFkOCJdID0gMTA0XSA9ICJOdW1wYWQ4IjsKICBLZXkyW0tleTJbIk51bXBhZDkiXSA9IDEwNV0gPSAiTnVtcGFkOSI7CiAgS2V5MltLZXkyWyJNdWx0aXBseSJdID0gMTA2XSA9ICJNdWx0aXBseSI7CiAgS2V5MltLZXkyWyJBZGQiXSA9IDEwN10gPSAiQWRkIjsKICBLZXkyW0tleTJbIlN1YnRyYWN0Il0gPSAxMDldID0gIlN1YnRyYWN0IjsKICBLZXkyW0tleTJbIkRlY2ltYWxQb2ludCJdID0gMTEwXSA9ICJEZWNpbWFsUG9pbnQiOwogIEtleTJbS2V5MlsiRGl2aWRlIl0gPSAxMTFdID0gIkRpdmlkZSI7CiAgS2V5MltLZXkyWyJGMSJdID0gMTEyXSA9ICJGMSI7CiAgS2V5MltLZXkyWyJGMiJdID0gMTEzXSA9ICJGMiI7CiAgS2V5MltLZXkyWyJGMyJdID0gMTE0XSA9ICJGMyI7CiAgS2V5MltLZXkyWyJGNCJdID0gMTE1XSA9ICJGNCI7CiAgS2V5MltLZXkyWyJGNSJdID0gMTE2XSA9ICJGNSI7CiAgS2V5MltLZXkyWyJGNiJdID0gMTE3XSA9ICJGNiI7CiAgS2V5MltLZXkyWyJGNyJdID0gMTE4XSA9ICJGNyI7CiAgS2V5MltLZXkyWyJGOCJdID0gMTE5XSA9ICJGOCI7CiAgS2V5MltLZXkyWyJGOSJdID0gMTIwXSA9ICJGOSI7CiAgS2V5MltLZXkyWyJGMTAiXSA9IDEyMV0gPSAiRjEwIjsKICBLZXkyW0tleTJbIkYxMSJdID0gMTIyXSA9ICJGMTEiOwogIEtleTJbS2V5MlsiRjEyIl0gPSAxMjNdID0gIkYxMiI7CiAgS2V5MltLZXkyWyJOdW1Mb2NrIl0gPSAxNDRdID0gIk51bUxvY2siOwogIEtleTJbS2V5MlsiU2Nyb2xsTG9jayJdID0gMTQ1XSA9ICJTY3JvbGxMb2NrIjsKICBLZXkyW0tleTJbIlNlbWlDb2xvbiJdID0gMTg2XSA9ICJTZW1pQ29sb24iOwogIEtleTJbS2V5MlsiRXF1YWxzIl0gPSAxODddID0gIkVxdWFscyI7CiAgS2V5MltLZXkyWyJDb21tYSJdID0gMTg4XSA9ICJDb21tYSI7CiAgS2V5MltLZXkyWyJEYXNoIl0gPSAxODldID0gIkRhc2giOwogIEtleTJbS2V5MlsiUGVyaW9kIl0gPSAxOTBdID0gIlBlcmlvZCI7CiAgS2V5MltLZXkyWyJVbmRlclNjb3JlIl0gPSAxODldID0gIlVuZGVyU2NvcmUiOwogIEtleTJbS2V5MlsiUGx1c1NpZ24iXSA9IDE4N10gPSAiUGx1c1NpZ24iOwogIEtleTJbS2V5MlsiRm9yd2FyZFNsYXNoIl0gPSAxOTFdID0gIkZvcndhcmRTbGFzaCI7CiAgS2V5MltLZXkyWyJUaWxkZSJdID0gMTkyXSA9ICJUaWxkZSI7CiAgS2V5MltLZXkyWyJHcmF2ZUFjY2VudCJdID0gMTkyXSA9ICJHcmF2ZUFjY2VudCI7CiAgS2V5MltLZXkyWyJPcGVuQnJhY2tldCJdID0gMjE5XSA9ICJPcGVuQnJhY2tldCI7CiAgS2V5MltLZXkyWyJDbG9zZWRCcmFja2V0Il0gPSAyMjFdID0gIkNsb3NlZEJyYWNrZXQiOwogIEtleTJbS2V5MlsiUXVvdGUiXSA9IDIyMl0gPSAiUXVvdGUiOwp9KShLZXkgfHwgKEtleSA9IHt9KSk7CnZhciBLZXlib2FyZCA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJLZXlib2FyZCIpOwogIH0KICBkb21Ob2RlOwogIG1hcENvbWJvc1RvSGFuZGxlcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogIHByZXNzZWRLZXlzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTsKICBjb25zdHJ1Y3Rvcihkb21Ob2RlKSB7CiAgICB0aGlzLmRvbU5vZGUgPSBkb21Ob2RlOwogICAgdGhpcy5zdGFydExpc3RlbmluZygpOwogIH0KICBrZXlFbnVtID0gS2V5OwogIG9uKGtleXMyKSB7CiAgICBjb25zdCBzdWJqZWN0ID0gbmV3IGRpc3RfdHNfZXhwb3J0czIucnhqcy5TdWJqZWN0KCk7CiAgICB0aGlzLnJlZ2lzdGVyS2V5cyhrZXlzMiwgc3ViamVjdCk7CiAgICByZXR1cm4gc3ViamVjdDsKICB9CiAgdHJpZ2dlcktleVByZXNzKGtleXNBcmcpIHsKICAgIGZvciAoY29uc3Qga2V5MiBvZiBrZXlzQXJnKSB7CiAgICAgIHRoaXMucHJlc3NlZEtleXMuYWRkKGtleTIpOwogICAgfQogICAgdGhpcy5jaGVja01hdGNoaW5nS2V5Ym9hcmRTdWJqZWN0cygpOwogICAgZm9yIChjb25zdCBrZXkyIG9mIGtleXNBcmcpIHsKICAgICAgdGhpcy5wcmVzc2VkS2V5cy5kZWxldGUoa2V5Mik7CiAgICB9CiAgfQogIHN0YXJ0TGlzdGVuaW5nKCkgewogICAgdGhpcy5kb21Ob2RlLmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCB0aGlzLmhhbmRsZUtleURvd24pOwogICAgdGhpcy5kb21Ob2RlLmFkZEV2ZW50TGlzdGVuZXIoImtleXVwIiwgdGhpcy5oYW5kbGVLZXlVcCk7CiAgfQogIHN0b3BMaXN0ZW5pbmcoKSB7CiAgICB0aGlzLmRvbU5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIHRoaXMuaGFuZGxlS2V5RG93bik7CiAgICB0aGlzLmRvbU5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5dXAiLCB0aGlzLmhhbmRsZUtleVVwKTsKICB9CiAgY2xlYXIoKSB7CiAgICB0aGlzLnN0b3BMaXN0ZW5pbmcoKTsKICAgIHRoaXMubWFwQ29tYm9zVG9IYW5kbGVycy5jbGVhcigpOwogICAgdGhpcy5wcmVzc2VkS2V5cy5jbGVhcigpOwogIH0KICBoYW5kbGVLZXlEb3duID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoZXZlbnQpID0+IHsKICAgIHRoaXMucHJlc3NlZEtleXMuYWRkKGV2ZW50LmtleUNvZGUpOwogICAgdGhpcy5jaGVja01hdGNoaW5nS2V5Ym9hcmRTdWJqZWN0cyhldmVudCk7CiAgfSwgImhhbmRsZUtleURvd24iKTsKICBjaGVja01hdGNoaW5nS2V5Ym9hcmRTdWJqZWN0cyhwYXlsb2FkQXJnKSB7CiAgICB0aGlzLm1hcENvbWJvc1RvSGFuZGxlcnMuZm9yRWFjaCgoc3ViamVjdEFyZywga2V5c0FyZykgPT4gewogICAgICBpZiAodGhpcy5hcmVBbGxLZXlzUHJlc3NlZChrZXlzQXJnKSkgewogICAgICAgIHN1YmplY3RBcmcubmV4dChwYXlsb2FkQXJnKTsKICAgICAgfQogICAgfSk7CiAgfQogIGhhbmRsZUtleVVwID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoZXZlbnQpID0+IHsKICAgIHRoaXMucHJlc3NlZEtleXMuZGVsZXRlKGV2ZW50LmtleUNvZGUpOwogIH0sICJoYW5kbGVLZXlVcCIpOwogIGFyZUFsbEtleXNQcmVzc2VkKGtleXNBcmcpIHsKICAgIGxldCByZXN1bHQgPSB0cnVlOwogICAga2V5c0FyZy5mb3JFYWNoKChrZXkyKSA9PiB7CiAgICAgIGlmICghdGhpcy5wcmVzc2VkS2V5cy5oYXMoa2V5MikpIHsKICAgICAgICByZXN1bHQgPSBmYWxzZTsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KICByZWdpc3RlcktleXMoa2V5c0FyZywgc3ViamVjdEFyZykgewogICAgaWYgKCF0aGlzLm1hcENvbWJvc1RvSGFuZGxlcnMuaGFzKGtleXNBcmcpKSB7CiAgICAgIHRoaXMubWFwQ29tYm9zVG9IYW5kbGVycy5zZXQoa2V5c0FyZywgc3ViamVjdEFyZyk7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBzdWJqZWN0ID0gdGhpcy5tYXBDb21ib3NUb0hhbmRsZXJzLmdldChrZXlzQXJnKTsKICAgICAgcmV0dXJuIHN1YmplY3Q7CiAgICB9CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZG9tdG9vbHNAMi41LjEvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZG9tdG9vbHMvZGlzdF90cy9kb210b29scy5jbGFzc2VzLmRvbXRvb2xzLmpzCnZhciBEb21Ub29scyA9IGNsYXNzIF9Eb21Ub29scyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiRG9tVG9vbHMiKTsKICB9CiAgLy8gPT09PT09CiAgLy8gU1RBVElDCiAgLy8gPT09PT09CiAgc3RhdGljIGluaXRpYWxpemF0aW9uUHJvbWlzZSA9IG51bGw7CiAgLyoqCiAgICogc2V0dXBzIGRvbXRvb2xzCiAgICovCiAgc3RhdGljIGFzeW5jIHNldHVwRG9tVG9vbHMob3B0aW9uc0FyZyA9IHt9KSB7CiAgICBpZiAoIW9wdGlvbnNBcmcuaWdub3JlR2xvYmFsICYmIF9Eb21Ub29scy5pbml0aWFsaXphdGlvblByb21pc2UpIHsKICAgICAgcmV0dXJuIGF3YWl0IF9Eb21Ub29scy5pbml0aWFsaXphdGlvblByb21pc2U7CiAgICB9CiAgICBpZiAoIW9wdGlvbnNBcmcuaWdub3JlR2xvYmFsKSB7CiAgICAgIF9Eb21Ub29scy5pbml0aWFsaXphdGlvblByb21pc2UgPSAoYXN5bmMgKCkgPT4gewogICAgICAgIGxldCBkb21Ub29sc0luc3RhbmNlOwogICAgICAgIGlmICghZ2xvYmFsVGhpcy5kZWVzRG9tVG9vbHMpIHsKICAgICAgICAgIGdsb2JhbFRoaXMuZGVlc0RvbVRvb2xzID0gbmV3IF9Eb21Ub29scyhvcHRpb25zQXJnKTsKICAgICAgICAgIGRvbVRvb2xzSW5zdGFuY2UgPSBnbG9iYWxUaGlzLmRlZXNEb21Ub29sczsKICAgICAgICAgIGNvbnN0IHJlYWR5U3RhdGVDaGFuZ2VkRnVuYyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKCkgPT4gewogICAgICAgICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImludGVyYWN0aXZlIiB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiKSB7CiAgICAgICAgICAgICAgZG9tVG9vbHNJbnN0YW5jZS5lbGVtZW50cy5oZWFkRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImhlYWQiKTsKICAgICAgICAgICAgICBkb21Ub29sc0luc3RhbmNlLmVsZW1lbnRzLmJvZHlFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiYm9keSIpOwogICAgICAgICAgICAgIGRvbVRvb2xzSW5zdGFuY2Uua2V5Ym9hcmQgPSBuZXcgS2V5Ym9hcmQoZG9jdW1lbnQuYm9keSk7CiAgICAgICAgICAgICAgZG9tVG9vbHNJbnN0YW5jZS5kb21SZWFkeS5yZXNvbHZlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sICJyZWFkeVN0YXRlQ2hhbmdlZEZ1bmMiKTsKICAgICAgICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiaW50ZXJhY3RpdmUiIHx8IGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJjb21wbGV0ZSIpIHsKICAgICAgICAgICAgcmVhZHlTdGF0ZUNoYW5nZWRGdW5jKCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJyZWFkeXN0YXRlY2hhbmdlIiwgcmVhZHlTdGF0ZUNoYW5nZWRGdW5jKTsKICAgICAgICAgIH0KICAgICAgICAgIGRvbVRvb2xzSW5zdGFuY2UuZG9tVG9vbHNSZWFkeS5yZXNvbHZlKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGRvbVRvb2xzSW5zdGFuY2UgPSBnbG9iYWxUaGlzLmRlZXNEb21Ub29sczsKICAgICAgICB9CiAgICAgICAgYXdhaXQgZG9tVG9vbHNJbnN0YW5jZS5kb21Ub29sc1JlYWR5LnByb21pc2U7CiAgICAgICAgcmV0dXJuIGRvbVRvb2xzSW5zdGFuY2U7CiAgICAgIH0pKCk7CiAgICAgIHJldHVybiBhd2FpdCBfRG9tVG9vbHMuaW5pdGlhbGl6YXRpb25Qcm9taXNlOwogICAgfSBlbHNlIHsKICAgICAgY29uc3QgZG9tVG9vbHNJbnN0YW5jZSA9IG5ldyBfRG9tVG9vbHMob3B0aW9uc0FyZyk7CiAgICAgIHJldHVybiBkb21Ub29sc0luc3RhbmNlOwogICAgfQogIH0KICAvKioKICAgKiBpZiB5b3UgY2FuLCB1c2UgdGhlIHN0YXRpYyBhc3lzbmMgLnNldHVwRG9tVG9vbHMoKSBmdW5jdGlvbiBpbnN0ZWFkIHNpbmNlIGl0IGlzIHNhZmVyIHRvIHVzZS4KICAgKi8KICBzdGF0aWMgZ2V0R2xvYmFsRG9tVG9vbHNTeW5jKCkgewogICAgY29uc3QgZ2xvYmFsRG9tVG9vbHMgPSBnbG9iYWxUaGlzLmRlZXNEb21Ub29sczsKICAgIGlmICghZ2xvYmFsRG9tVG9vbHMpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJZb3UgdHJpZWQgdG8gYWNjZXNzIGRvbXRvb2xzIHN5bmNocm9ub3VzbHkgdG9vIGVhcmx5Iik7CiAgICB9CiAgICByZXR1cm4gZ2xvYmFsVGhpcy5kZWVzRG9tVG9vbHM7CiAgfQogIC8vID09PT09PT09CiAgLy8gSU5TVEFOQ0UKICAvLyA9PT09PT09PQogIC8vIGVsZW1lbnRzCiAgZWxlbWVudHMgPSB7CiAgICBoZWFkRWxlbWVudDogbnVsbCwKICAgIGJvZHlFbGVtZW50OiBudWxsCiAgfTsKICB3ZWJzZXR1cCA9IG5ldyBXZWJTZXR1cCh7CiAgICBtZXRhT2JqZWN0OiB7CiAgICAgIHRpdGxlOiAiIgogICAgfQogIH0pOwogIHNtYXJ0c3RhdGUgPSBuZXcgZGlzdF90c19leHBvcnRzMjEuU21hcnRzdGF0ZSgpOwogIGRvbVRvb2xzU3RhdGVQYXJ0ID0gdGhpcy5zbWFydHN0YXRlLmdldFN0YXRlUGFydCgiZG9tdG9vbHMiLCB7CiAgICB2aXJ0dWFsVmlld3BvcnQ6ICJuYXRpdmUiLAogICAgand0OiBudWxsCiAgfSk7CiAgcm91dGVyID0gbmV3IGRpc3RfdHNfZXhwb3J0czE4LlNtYXJ0Um91dGVyKHsKICAgIGRlYnVnOiBmYWxzZQogIH0pOwogIGNvbnZlbmllbmNlID0gewogICAgdHlwZWRyZXF1ZXN0OiBkaXN0X3RzX2V4cG9ydHMxNSwKICAgIHNtYXJ0ZGVsYXk6IGRpc3RfdHNfZXhwb3J0czMsCiAgICBzbWFydGpzb246IGRpc3RfdHNfZXhwb3J0czEyLAogICAgc21hcnR1cmw6IGRpc3RfdHNfZXhwb3J0czIyCiAgfTsKICBkZWVzQ29tbXMgPSBuZXcgZGlzdF90c19leHBvcnRzMTYuRGVlc0NvbW1zKCk7CiAgc2Nyb2xsZXIgPSBuZXcgU2Nyb2xsZXIodGhpcyk7CiAgdGhlbWVNYW5hZ2VyID0gbmV3IFRoZW1lTWFuYWdlcih0aGlzKTsKICBrZXlib2FyZCA9IG51bGw7CiAgLy8gSW5pdGlhbGl6ZWQgYWZ0ZXIgRE9NIHJlYWR5IHRvIGF2b2lkIGFjY2Vzc2luZyBkb2N1bWVudC5ib2R5IGJlZm9yZSBpdCBleGlzdHMKICBkb21Ub29sc1JlYWR5ID0gZGlzdF90c19leHBvcnRzLmRlZmVyKCk7CiAgZG9tUmVhZHkgPSBkaXN0X3RzX2V4cG9ydHMuZGVmZXIoKTsKICBnbG9iYWxTdHlsZXNSZWFkeSA9IGRpc3RfdHNfZXhwb3J0cy5kZWZlcigpOwogIGNvbnN0cnVjdG9yKG9wdGlvbnNBcmcpIHsKICB9CiAgcnVuT25jZVRyYWNrZXJTdHJpbmdNYXAgPSBuZXcgbGlrLlN0cmluZ21hcCgpOwogIHJ1bk9uY2VSZXN1bHRNYXAgPSBuZXcgbGlrLkZhc3RNYXAoKTsKICBydW5PbmNlRXJyb3JNYXAgPSBuZXcgbGlrLkZhc3RNYXAoKTsKICAvKioKICAgKiBydW4gYSBmdW5jdGlvbiBvbmNlIGFuZCBhbHdheXMgZ2V0IHRoZSBQcm9taXNlIG9mIHRoZSBmaXJzdCBleGVjdXRpb24KICAgKiBAcGFyYW0gaWRlbnRpZmllckFyZyB0aGUgaW5kZW50aWZpZXIgYXJnIGlkZW50aWZpZXMgZnVuY3Rpb25zLiBmdW5jdGlvbnMgd2l0aCB0aGUgc2FtZSBpZGVudGlmaWVyIGFyZSBjb25zaWRlcmVkIGVxdWFsCiAgICogQHBhcmFtIGZ1bmNBcmcgdGhlIGFjdHVhbCBmdW5jIGFyZyB0byBydW4KICAgKi8KICBhc3luYyBydW5PbmNlKGlkZW50aWZpZXJBcmcsIGZ1bmNBcmcpIHsKICAgIGNvbnN0IHJ1bm5pbmdJZCA9IGAke2lkZW50aWZpZXJBcmd9K3J1bm5pbmdDaGVja2A7CiAgICBpZiAoIXRoaXMucnVuT25jZVRyYWNrZXJTdHJpbmdNYXAuY2hlY2tTdHJpbmcoaWRlbnRpZmllckFyZykpIHsKICAgICAgdGhpcy5ydW5PbmNlVHJhY2tlclN0cmluZ01hcC5hZGRTdHJpbmcoaWRlbnRpZmllckFyZyk7CiAgICAgIHRoaXMucnVuT25jZVRyYWNrZXJTdHJpbmdNYXAuYWRkU3RyaW5nKHJ1bm5pbmdJZCk7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZnVuY0FyZygpOwogICAgICAgIHRoaXMucnVuT25jZVJlc3VsdE1hcC5hZGRUb01hcChpZGVudGlmaWVyQXJnLCByZXN1bHQpOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIHRoaXMucnVuT25jZUVycm9yTWFwLmFkZFRvTWFwKGlkZW50aWZpZXJBcmcsIGVycm9yKTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICB0aGlzLnJ1bk9uY2VUcmFja2VyU3RyaW5nTWFwLnJlbW92ZVN0cmluZyhydW5uaW5nSWQpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gYXdhaXQgdGhpcy5ydW5PbmNlVHJhY2tlclN0cmluZ01hcC5yZWdpc3RlclVudGlsVHJ1ZSgoc3RyaW5nTWFwKSA9PiB7CiAgICAgIHJldHVybiAhc3RyaW5nTWFwLmluY2x1ZGVzKHJ1bm5pbmdJZCk7CiAgICB9LCAoKSA9PiB7CiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5ydW5PbmNlRXJyb3JNYXAuZ2V0QnlLZXkoaWRlbnRpZmllckFyZyk7CiAgICAgIGlmIChlcnJvcikgewogICAgICAgIHRocm93IGVycm9yOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLnJ1bk9uY2VSZXN1bHRNYXAuZ2V0QnlLZXkoaWRlbnRpZmllckFyZyk7CiAgICB9KTsKICB9CiAgLy8gc2V0U3R1ZmYKICAvKioKICAgKiBhbGxvd3MgdG8gc2V0IGdsb2JhbCBzdHlsZXMKICAgKiBAcGFyYW0gc3R5bGVzVGV4dCB0aGUgY3NzIHRleHQgeW91IHdhbnQgdG8gc2V0CiAgICovCiAgYXN5bmMgc2V0R2xvYmFsU3R5bGVzKHN0eWxlc1RleHQpIHsKICAgIGF3YWl0IHRoaXMuZG9tUmVhZHkucHJvbWlzZTsKICAgIGNvbnN0IHN0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7CiAgICBzdHlsZUVsZW1lbnQudHlwZSA9ICJ0ZXh0L2NzcyI7CiAgICBzdHlsZUVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoc3R5bGVzVGV4dCkpOwogICAgdGhpcy5lbGVtZW50cy5oZWFkRWxlbWVudC5hcHBlbmRDaGlsZChzdHlsZUVsZW1lbnQpOwogIH0KICAvKioKICAgKiBhbGxvd3MgdG8gc2V0IGdsb2JhbCBzdHlsZXMKICAgKiBAcGFyYW0gc3R5bGVzVGV4dCB0aGUgY3NzIHRleHQgeW91IHdhbnQgdG8gc2V0CiAgICovCiAgYXN5bmMgc2V0RXh0ZXJuYWxTY3JpcHQoc2NyaXB0TGlua0FyZykgewogICAgYXdhaXQgdGhpcy5kb21SZWFkeS5wcm9taXNlOwogICAgY29uc3QgZG9uZSA9IGRpc3RfdHNfZXhwb3J0cy5kZWZlcigpOwogICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CiAgICBzY3JpcHQuc3JjID0gc2NyaXB0TGlua0FyZzsKICAgIHNjcmlwdC5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgZnVuY3Rpb24oKSB7CiAgICAgIGRvbmUucmVzb2x2ZSgpOwogICAgfSk7CiAgICBjb25zdCBwYXJlbnROb2RlID0gZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5ib2R5OwogICAgcGFyZW50Tm9kZS5hcHBlbmQoc2NyaXB0KTsKICAgIGF3YWl0IGRvbmUucHJvbWlzZTsKICB9CiAgLyoqCiAgICogYWxsb3dzIHNldHRpbmcgZXh0ZXJuYWwgY3NzIGZpbGVzCiAgICogQHBhcmFtIGNzc0xpbmtBcmcgYSB1cmwgdG8gYW4gZXh0ZXJuYWwgc3R5bGVzaGVldAogICAqLwogIGFzeW5jIHNldEV4dGVybmFsQ3NzKGNzc0xpbmtBcmcpIHsKICAgIGNvbnN0IGNzc1RhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpbmsiKTsKICAgIGNzc1RhZy5yZWwgPSAic3R5bGVzaGVldCI7CiAgICBjc3NUYWcuY3Jvc3NPcmlnaW4gPSAiYW5vbnltb3VzIjsKICAgIGNzc1RhZy5ocmVmID0gY3NzTGlua0FyZzsKICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kKGNzc1RhZyk7CiAgfQogIC8qKgogICAqIGFsbG93cyBzZXR0aW5nIG9mIHdlYnNpdGUgaW5mb3MKICAgKiBAcGFyYW0gb3B0aW9uc0FyZyB0aGUgd2Vic2l0ZSBpbmZvCiAgICovCiAgYXN5bmMgc2V0V2Vic2l0ZUluZm8ob3B0aW9uc0FyZykgewogICAgYXdhaXQgdGhpcy53ZWJzZXR1cC5zZXR1cChvcHRpb25zQXJnKTsKICAgIGF3YWl0IHRoaXMud2Vic2V0dXAucmVhZHlQcm9taXNlOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWRvbXRvb2xzQDIuNS4xL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWRvbXRvb2xzL2Rpc3RfdHMvZG9tdG9vbHMuY3NzLmJhc2VzdHlsZXMuanMKdmFyIHNjcm9sbEJhclN0eWxlcyA9ICgoKSA9PiB7CiAgY29uc3QgcmV0dXJuU3R5bGVzT2xkID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNYWMgT1MgWCIpID09PSAtMSA/IGlgYC5jc3NUZXh0IDogYGA7CiAgY29uc3QgcmV0dXJuU3R5bGVzID0gaWAKICAgIC8qIHdpZHRoICovCiAgICA6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgICAgd2lkdGg6IDBweDsKICAgIH0KICAgIGJvZHkgewogICAgICBzY3JvbGxiYXItd2lkdGg6IG5vbmU7CiAgICB9CiAgYC5jc3NUZXh0OwogIHJldHVybiByZXR1cm5TdHlsZXM7Cn0pKCk7CnZhciBnbG9iYWxCYXNlU3R5bGVzID0gaWAKICAvKgogIEBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6ICdNYXRlcmlhbCBJY29ucyc7CiAgICBmb250LXN0eWxlOiBub3JtYWw7CiAgICBmb250LXdlaWdodDogNDAwOwogICAgc3JjOiB1cmwoaHR0cHM6Ly9mb250cy5nc3RhdGljLmNvbS9zL21hdGVyaWFsaWNvbnMvdjQyL2ZsVWhScTZ0elpjbFFFSi1WZGctSXVpYURzTmNJaFE4dFEud29mZjIpCiAgICAgIGZvcm1hdCgnd29mZjInKTsKICB9ICovCgogIC8qIGdsb2JhbCBib2R5IHN0eWxlcyAqLwogIGJvZHkgewogICAgbWFyZ2luOiAwcHg7CiAgICBmb250LWZhbWlseTogJ0dlaXN0IFNhbnMnLCAnSW50ZXInLCBzYW5zLXNlcmlmOwogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICB9CgogIC8qIHNjcm9sbCBiYXIgc3R5bGVzICovCiAgJHtyKHNjcm9sbEJhclN0eWxlcyl9CmAuY3NzVGV4dDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWRvbXRvb2xzQDIuNS4xL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWRvbXRvb2xzL2Rpc3RfdHMvZG9tdG9vbHMuZWxlbWVudGJhc2ljLmpzCnZhciBzdGF0aWNTdHlsZXMgPSBpYAogICogewogICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjFzLCBjb2xvciAwLjFzOwogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICB9CgogIDpob3N0IHsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICBmb250LWZhbWlseTogJ0dlaXN0IFNhbnMnLCAnSW50ZXInLCBzYW5zLXNlcmlmOwogIH0KCiAgJHtyKHNjcm9sbEJhclN0eWxlcyl9CmA7CnZhciBzdHlsZXMgPSBiMmAKICA8c3R5bGU+CiAgICAqIHsKICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjFzLCBjb2xvciAwLjFzOwogICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgfQoKICAgIDpob3N0IHsKICAgICAgZm9udC1mYW1pbHk6ICdHZWlzdCBTYW5zJywgJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgIH0KCiAgICAke3Njcm9sbEJhclN0eWxlc30KICA8L3N0eWxlPgpgOwp2YXIgc2V0dXAgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGFzeW5jIChlbGVtZW50QXJnLCBvcHRpb25zQXJnID0ge30pID0+IHsKICBjb25zdCBkb21Ub29scyA9IGF3YWl0IERvbVRvb2xzLnNldHVwRG9tVG9vbHMob3B0aW9uc0FyZyk7CiAgaWYgKGVsZW1lbnRBcmcpIHsKICB9CiAgZG9tVG9vbHMucnVuT25jZSgiZWxlbWVudEJhc2ljU2V0dXAiLCBhc3luYyAoKSA9PiB7CiAgICBkb21Ub29scy5zZXRHbG9iYWxTdHlsZXMoZ2xvYmFsQmFzZVN0eWxlcyk7CiAgfSk7CiAgcmV0dXJuIGRvbVRvb2xzOwp9LCAic2V0dXAiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWRvbXRvb2xzQDIuNS4xL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWRvbXRvb2xzL2Rpc3RfdHMvZG9tdG9vbHMuY3NzLmpzCnZhciBkb210b29sc19jc3NfZXhwb3J0cyA9IHt9OwpfX2V4cG9ydChkb210b29sc19jc3NfZXhwb3J0cywgewogIGNzc0dyaWRDb2x1bW5zOiAoKSA9PiBjc3NHcmlkQ29sdW1ucwp9KTsKdmFyIGNzc0dyaWRDb2x1bW5zID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoYW1vdW50T2ZDb2x1bW5zQXJnLCBnYXBTaXplQXJnKSA9PiB7CiAgbGV0IHJldHVyblN0cmluZyA9IGBgOwogIGZvciAobGV0IGkxMCA9IDA7IGkxMCA8IGFtb3VudE9mQ29sdW1uc0FyZzsgaTEwKyspIHsKICAgIHJldHVyblN0cmluZyArPSBgIGNhbGMoKDEwMCUvJHthbW91bnRPZkNvbHVtbnNBcmd9KSAtICgke2dhcFNpemVBcmcgKiAoYW1vdW50T2ZDb2x1bW5zQXJnIC0gMSl9cHgvJHthbW91bnRPZkNvbHVtbnNBcmd9KSlgOwogIH0KICByZXR1cm4gcmV0dXJuU3RyaW5nOwp9LCAiY3NzR3JpZENvbHVtbnMiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWRvbXRvb2xzQDIuNS4xL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWRvbXRvb2xzL2Rpc3RfdHMvZG9tdG9vbHMucGx1Z2luZXhwb3J0cy5qcwp2YXIgZG9tdG9vbHNfcGx1Z2luZXhwb3J0c19leHBvcnRzID0ge307Cl9fZXhwb3J0KGRvbXRvb2xzX3BsdWdpbmV4cG9ydHNfZXhwb3J0cywgewogIFN3ZWV0U2Nyb2xsOiAoKSA9PiBpbXBvcnRfc3dlZXRfc2Nyb2xsMi5kZWZhdWx0LAogIHNtYXJ0ZGVsYXk6ICgpID0+IGRpc3RfdHNfZXhwb3J0czMsCiAgc21hcnRtYXJrZG93bjogKCkgPT4gZGlzdF90c19leHBvcnRzMTcsCiAgc21hcnRwcm9taXNlOiAoKSA9PiBkaXN0X3RzX2V4cG9ydHMsCiAgc21hcnRyb3V0ZXI6ICgpID0+IGRpc3RfdHNfZXhwb3J0czE4LAogIHNtYXJ0cng6ICgpID0+IGRpc3RfdHNfZXhwb3J0czIsCiAgc21hcnRzdGF0ZTogKCkgPT4gZGlzdF90c19leHBvcnRzMjEsCiAgc21hcnRzdHJpbmc6ICgpID0+IGRpc3RfdHNfZXhwb3J0czExLAogIHNtYXJ0dXJsOiAoKSA9PiBkaXN0X3RzX2V4cG9ydHMyMiwKICB0eXBlZHJlcXVlc3Q6ICgpID0+IGRpc3RfdHNfZXhwb3J0czE1Cn0pOwp2YXIgaW1wb3J0X3N3ZWV0X3Njcm9sbDIgPSBfX3RvRVNNKHJlcXVpcmVfc3dlZXRfc2Nyb2xsKCksIDEpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZWxlbWVudEAyLjIuMy9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1lbGVtZW50L2Rpc3RfdHMvcGx1Z2lucy5qcwp2YXIgaXNvdW5pcXVlMyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0X3RzKCksIDEpOwp2YXIgbGl0ID0gewogIGNzczogaSwKICB1bnNhZmVDU1M6IHIsCiAgTGl0RWxlbWVudDogaTQsCiAgcHJvcGVydHk6IG41Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1lbGVtZW50QDIuMi4zL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWVsZW1lbnQvZGlzdF90cy9jbGFzc2VzLmNzc21hbmFnZXIuanMKdmFyIENzc01hbmFnZXIgPSBjbGFzcyBfQ3NzTWFuYWdlciB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiQ3NzTWFuYWdlciIpOwogIH0KICAvLyBTVEFUSUMKICBzdGF0aWMgaW5zdGFuY2UgPSBudWxsOwogIC8qKgogICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiBDc3NNYW5hZ2VyCiAgICovCiAgc3RhdGljIGdldFNpbmdsZXRvbigpIHsKICAgIGlmICghX0Nzc01hbmFnZXIuaW5zdGFuY2UpIHsKICAgICAgX0Nzc01hbmFnZXIuaW5zdGFuY2UgPSBuZXcgX0Nzc01hbmFnZXIoKTsKICAgIH0KICAgIHJldHVybiBfQ3NzTWFuYWdlci5pbnN0YW5jZTsKICB9CiAgLy8gSU5TVEFOQ0UKICBkb210b29sc1Byb21pc2UgPSBEb21Ub29scy5zZXR1cERvbVRvb2xzKCk7CiAgZ29CcmlnaHQgPSBmYWxzZTsKICBiZFZhclRyaXBsZXRTdG9yZSA9IFtdOwogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5kb210b29sc1Byb21pc2UudGhlbihhc3luYyAoZG9tdG9vbHNBcmcpID0+IHsKICAgICAgZG9tdG9vbHNBcmcudGhlbWVNYW5hZ2VyLnRoZW1lT2JzZXJ2YWJsZS5zdWJzY3JpYmUoYXN5bmMgKGdvQnJpZ2h0QXJnKSA9PiB7CiAgICAgICAgdGhpcy5nb0JyaWdodCA9IGdvQnJpZ2h0QXJnOwogICAgICAgIGF3YWl0IGRvbXRvb2xzQXJnLmRvbVJlYWR5LnByb21pc2U7CiAgICAgICAgZm9yIChjb25zdCBiZFRyaXBsZXRBcmcgb2YgdGhpcy5iZFZhclRyaXBsZXRTdG9yZSkgewogICAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5zZXRQcm9wZXJ0eShiZFRyaXBsZXRBcmcuY3NzVmFyTmFtZSwgdGhpcy5nb0JyaWdodCA/IGJkVHJpcGxldEFyZy5icmlnaHRWYWx1ZSA6IGJkVHJpcGxldEFyZy5kYXJrVmFsdWUpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9KTsKICB9CiAgZ2V0IGRlZmF1bHRTdHlsZXMoKSB7CiAgICByZXR1cm4gZG9tdG9vbHNfZWxlbWVudGJhc2ljX2V4cG9ydHMuc3RhdGljU3R5bGVzOwogIH0KICBnZXRDb250YWluZXJOYW1lRnJvbUNsYXNzKGVsZW1lbnRDbGFzcykgewogICAgcmV0dXJuIGVsZW1lbnRDbGFzcy5pcyB8fCBlbGVtZW50Q2xhc3MubmFtZS5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAiJDEtJDIiKS50b0xvd2VyQ2FzZSgpOwogIH0KICBjc3NGb3JEZXNrdG9wKGNvbnRlbnRBcmcsIGVsZW1lbnRDbGFzcykgewogICAgaWYgKGVsZW1lbnRDbGFzcykgewogICAgICByZXR1cm4gcihkb210b29sc19jc3NfYnJlYWtwb2ludHNfZXhwb3J0cy5jc3NGb3JDb250YWluZXIoY29udGVudEFyZywgYChtaW4td2lkdGg6ICR7ZG9tdG9vbHNfY3NzX2JyZWFrcG9pbnRzX2V4cG9ydHMuZGVza3RvcH1weClgLCB0aGlzLmdldENvbnRhaW5lck5hbWVGcm9tQ2xhc3MoZWxlbWVudENsYXNzKSkpOwogICAgfQogICAgcmV0dXJuIHIoZG9tdG9vbHNfY3NzX2JyZWFrcG9pbnRzX2V4cG9ydHMuY3NzRm9yRGVza3RvcChjb250ZW50QXJnKSk7CiAgfQogIGNzc0Zvck5vdGVib29rKGNvbnRlbnRBcmcsIGVsZW1lbnRDbGFzcykgewogICAgaWYgKGVsZW1lbnRDbGFzcykgewogICAgICByZXR1cm4gcihkb210b29sc19jc3NfYnJlYWtwb2ludHNfZXhwb3J0cy5jc3NGb3JDb250YWluZXIoY29udGVudEFyZywgYChtYXgtd2lkdGg6ICR7ZG9tdG9vbHNfY3NzX2JyZWFrcG9pbnRzX2V4cG9ydHMubm90ZWJvb2t9cHgpYCwgdGhpcy5nZXRDb250YWluZXJOYW1lRnJvbUNsYXNzKGVsZW1lbnRDbGFzcykpKTsKICAgIH0KICAgIHJldHVybiByKGRvbXRvb2xzX2Nzc19icmVha3BvaW50c19leHBvcnRzLmNzc0Zvck5vdGVib29rKGNvbnRlbnRBcmcpKTsKICB9CiAgY3NzRm9yVGFibGV0KGNvbnRlbnRBcmcsIGVsZW1lbnRDbGFzcykgewogICAgaWYgKGVsZW1lbnRDbGFzcykgewogICAgICByZXR1cm4gcihkb210b29sc19jc3NfYnJlYWtwb2ludHNfZXhwb3J0cy5jc3NGb3JDb250YWluZXIoY29udGVudEFyZywgYChtYXgtd2lkdGg6ICR7ZG9tdG9vbHNfY3NzX2JyZWFrcG9pbnRzX2V4cG9ydHMudGFibGV0fXB4KWAsIHRoaXMuZ2V0Q29udGFpbmVyTmFtZUZyb21DbGFzcyhlbGVtZW50Q2xhc3MpKSk7CiAgICB9CiAgICByZXR1cm4gcihkb210b29sc19jc3NfYnJlYWtwb2ludHNfZXhwb3J0cy5jc3NGb3JUYWJsZXQoY29udGVudEFyZykpOwogIH0KICBjc3NGb3JQaGFibGV0KGNvbnRlbnRBcmcsIGVsZW1lbnRDbGFzcykgewogICAgaWYgKGVsZW1lbnRDbGFzcykgewogICAgICByZXR1cm4gcihkb210b29sc19jc3NfYnJlYWtwb2ludHNfZXhwb3J0cy5jc3NGb3JDb250YWluZXIoY29udGVudEFyZywgYChtYXgtd2lkdGg6ICR7ZG9tdG9vbHNfY3NzX2JyZWFrcG9pbnRzX2V4cG9ydHMucGhhYmxldH1weClgLCB0aGlzLmdldENvbnRhaW5lck5hbWVGcm9tQ2xhc3MoZWxlbWVudENsYXNzKSkpOwogICAgfQogICAgcmV0dXJuIHIoZG9tdG9vbHNfY3NzX2JyZWFrcG9pbnRzX2V4cG9ydHMuY3NzRm9yUGhhYmxldChjb250ZW50QXJnKSk7CiAgfQogIGNzc0ZvclBob25lKGNvbnRlbnRBcmcsIGVsZW1lbnRDbGFzcykgewogICAgaWYgKGVsZW1lbnRDbGFzcykgewogICAgICByZXR1cm4gcihkb210b29sc19jc3NfYnJlYWtwb2ludHNfZXhwb3J0cy5jc3NGb3JDb250YWluZXIoY29udGVudEFyZywgYChtYXgtd2lkdGg6ICR7ZG9tdG9vbHNfY3NzX2JyZWFrcG9pbnRzX2V4cG9ydHMucGhvbmV9cHgpYCwgdGhpcy5nZXRDb250YWluZXJOYW1lRnJvbUNsYXNzKGVsZW1lbnRDbGFzcykpKTsKICAgIH0KICAgIHJldHVybiByKGRvbXRvb2xzX2Nzc19icmVha3BvaW50c19leHBvcnRzLmNzc0ZvclBob25lKGNvbnRlbnRBcmcpKTsKICB9CiAgY3NzRm9yQ29uc3RyYWludChjb25zdHJhaW50cykgewogICAgcmV0dXJuIChjb250ZW50QXJnKSA9PiByKGRvbXRvb2xzX2Nzc19icmVha3BvaW50c19leHBvcnRzLmNzc0ZvckNvbnN0cmFpbnQoY29uc3RyYWludHMpKGNvbnRlbnRBcmcpKTsKICB9CiAgYmRUaGVtZShicmlnaHRWYWx1ZUFyZywgZGFya1ZhbHVlQXJnKSB7CiAgICBsZXQgcmV0dXJuQ3NzVmFyOwogICAgbGV0IGRlZmF1bHRWYWx1ZTsKICAgIGlmIChEb21Ub29scy5nZXRHbG9iYWxEb21Ub29sc1N5bmMoKSkgewogICAgICBkZWZhdWx0VmFsdWUgPSBEb21Ub29scy5nZXRHbG9iYWxEb21Ub29sc1N5bmMoKS50aGVtZU1hbmFnZXIuZ29CcmlnaHRCb29sZWFuID8gYnJpZ2h0VmFsdWVBcmcgOiBkYXJrVmFsdWVBcmc7CiAgICB9IGVsc2UgewogICAgICBkZWZhdWx0VmFsdWUgPSBkYXJrVmFsdWVBcmc7CiAgICB9CiAgICBjb25zdCBleGlzdGluZ1RyaXBsZXQgPSB0aGlzLmJkVmFyVHJpcGxldFN0b3JlLmZpbmQoKHRyaXBsZXRBcmcpID0+IHRyaXBsZXRBcmcuZGFya1ZhbHVlID09PSBkYXJrVmFsdWVBcmcgJiYgdHJpcGxldEFyZy5icmlnaHRWYWx1ZSA9PT0gYnJpZ2h0VmFsdWVBcmcpOwogICAgaWYgKGV4aXN0aW5nVHJpcGxldCkgewogICAgICByZXR1cm5Dc3NWYXIgPSBleGlzdGluZ1RyaXBsZXQuY3NzVmFyTmFtZTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IG5ld1RyaXBsZXQgPSB7CiAgICAgICAgY3NzVmFyTmFtZTogYC0tJHtpc291bmlxdWUzLnVuaSgpfWAsCiAgICAgICAgYnJpZ2h0VmFsdWU6IGJyaWdodFZhbHVlQXJnLAogICAgICAgIGRhcmtWYWx1ZTogZGFya1ZhbHVlQXJnCiAgICAgIH07CiAgICAgIHRoaXMuYmRWYXJUcmlwbGV0U3RvcmUucHVzaChuZXdUcmlwbGV0KTsKICAgICAgdGhpcy5kb210b29sc1Byb21pc2UudGhlbihhc3luYyAoZG9tdG9vbHNBcmcpID0+IHsKICAgICAgICBhd2FpdCBkb210b29sc0FyZy5kb21SZWFkeS5wcm9taXNlOwogICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuc2V0UHJvcGVydHkobmV3VHJpcGxldC5jc3NWYXJOYW1lLCBkZWZhdWx0VmFsdWUpOwogICAgICB9KTsKICAgICAgcmV0dXJuQ3NzVmFyID0gbmV3VHJpcGxldC5jc3NWYXJOYW1lOwogICAgfQogICAgcmV0dXJuIGxpdC51bnNhZmVDU1MoYHZhcigke3JldHVybkNzc1Zhcn0sICR7ZGVmYXVsdFZhbHVlfSlgKTsKICB9CiAgY3NzR3JpZENvbHVtbnMgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChhbW91bnRPZkNvbHVtbnNBcmcsIGdhcFNpemVBcmcpID0+IHsKICAgIGxldCByZXR1cm5TdHJpbmcgPSBgYDsKICAgIGZvciAobGV0IGkxMCA9IDA7IGkxMCA8IGFtb3VudE9mQ29sdW1uc0FyZzsgaTEwKyspIHsKICAgICAgcmV0dXJuU3RyaW5nICs9IGAgY2FsYygoMTAwJS8ke2Ftb3VudE9mQ29sdW1uc0FyZ30pIC0gKCR7Z2FwU2l6ZUFyZyAqIChhbW91bnRPZkNvbHVtbnNBcmcgLSAxKX1weC8ke2Ftb3VudE9mQ29sdW1uc0FyZ30pKWA7CiAgICB9CiAgICByZXR1cm4gbGl0LnVuc2FmZUNTUyhyZXR1cm5TdHJpbmcpOwogIH0sICJjc3NHcmlkQ29sdW1ucyIpOwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2xpdC1odG1sQDMuMy4yL25vZGVfbW9kdWxlcy9saXQtaHRtbC9zdGF0aWMuanMKdmFyIGEzID0gLyogQF9fUFVSRV9fICovIFN5bWJvbC5mb3IoIiIpLCBvNyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHQ4KSA9PiB7CiAgaWYgKHQ4Py5yID09PSBhMykgcmV0dXJuIHQ4Py5fJGxpdFN0YXRpYyQ7Cn0sICJvIiksIHM1ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgodDgpID0+ICh7IF8kbGl0U3RhdGljJDogdDgsIHI6IGEzIH0pLCAicyIpLCBpNSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHQ4LCAuLi5yMTApID0+ICh7IF8kbGl0U3RhdGljJDogcjEwLnJlZHVjZSgocjExLCBlMTAsIGE0KSA9PiByMTEgKyAoKHQ5KSA9PiB7CiAgaWYgKHZvaWQgMCAhPT0gdDkuXyRsaXRTdGF0aWMkKSByZXR1cm4gdDkuXyRsaXRTdGF0aWMkOwogIHRocm93IEVycm9yKGBWYWx1ZSBwYXNzZWQgdG8gJ2xpdGVyYWwnIGZ1bmN0aW9uIG11c3QgYmUgYSAnbGl0ZXJhbCcgcmVzdWx0OiAke3Q5fS4gVXNlICd1bnNhZmVTdGF0aWMnIHRvIHBhc3Mgbm9uLWxpdGVyYWwgdmFsdWVzLCBidXQKICAgICAgICAgICAgdGFrZSBjYXJlIHRvIGVuc3VyZSBwYWdlIHNlY3VyaXR5LmApOwp9KShlMTApICsgdDhbYTQgKyAxXSwgdDhbMF0pLCByOiBhMyB9KSwgImkiKSwgbDMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLCBuNiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHQ4KSA9PiAocjEwLCAuLi5lMTApID0+IHsKICBjb25zdCBhNCA9IGUxMC5sZW5ndGg7CiAgbGV0IHM5LCBpMTA7CiAgY29uc3QgbjExID0gW10sIHU2ID0gW107CiAgbGV0IGMxMCwgJDMgPSAwLCBmNiA9IGZhbHNlOwogIGZvciAoOyAkMyA8IGE0OyApIHsKICAgIGZvciAoYzEwID0gcjEwWyQzXTsgJDMgPCBhNCAmJiB2b2lkIDAgIT09IChpMTAgPSBlMTBbJDNdLCBzOSA9IG83KGkxMCkpOyApIGMxMCArPSBzOSArIHIxMFsrKyQzXSwgZjYgPSB0cnVlOwogICAgJDMgIT09IGE0ICYmIHU2LnB1c2goaTEwKSwgbjExLnB1c2goYzEwKSwgJDMrKzsKICB9CiAgaWYgKCQzID09PSBhNCAmJiBuMTEucHVzaChyMTBbYTRdKSwgZjYpIHsKICAgIGNvbnN0IHQ5ID0gbjExLmpvaW4oIiQkbGl0JCQiKTsKICAgIHZvaWQgMCA9PT0gKHIxMCA9IGwzLmdldCh0OSkpICYmIChuMTEucmF3ID0gbjExLCBsMy5zZXQodDksIHIxMCA9IG4xMSkpLCBlMTAgPSB1NjsKICB9CiAgcmV0dXJuIHQ4KHIxMCwgLi4uZTEwKTsKfSwgIm4iKSwgdTMgPSBuNihiMiksIGM0ID0gbjYodyksICQyID0gbjYoVCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbGl0LWh0bWxAMy4zLjIvbm9kZV9tb2R1bGVzL2xpdC1odG1sL2RpcmVjdGl2ZS5qcwp2YXIgdDMgPSB7IEFUVFJJQlVURTogMSwgQ0hJTEQ6IDIsIFBST1BFUlRZOiAzLCBCT09MRUFOX0FUVFJJQlVURTogNCwgRVZFTlQ6IDUsIEVMRU1FTlQ6IDYgfSwgZTQgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh0OCkgPT4gKC4uLmUxMCkgPT4gKHsgXyRsaXREaXJlY3RpdmUkOiB0OCwgdmFsdWVzOiBlMTAgfSksICJlIik7CnZhciBpNiA9IGNsYXNzIHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJpIik7CiAgfQogIGNvbnN0cnVjdG9yKHQ4KSB7CiAgfQogIGdldCBfJEFVKCkgewogICAgcmV0dXJuIHRoaXMuXyRBTS5fJEFVOwogIH0KICBfJEFUKHQ4LCBlMTAsIGkxMCkgewogICAgdGhpcy5fJEN0ID0gdDgsIHRoaXMuXyRBTSA9IGUxMCwgdGhpcy5fJENpID0gaTEwOwogIH0KICBfJEFTKHQ4LCBlMTApIHsKICAgIHJldHVybiB0aGlzLnVwZGF0ZSh0OCwgZTEwKTsKICB9CiAgdXBkYXRlKHQ4LCBlMTApIHsKICAgIHJldHVybiB0aGlzLnJlbmRlciguLi5lMTApOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9saXQtaHRtbEAzLjMuMi9ub2RlX21vZHVsZXMvbGl0LWh0bWwvZGlyZWN0aXZlcy91bnNhZmUtaHRtbC5qcwp2YXIgZTUgPSBjbGFzcyBleHRlbmRzIGk2IHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJlIik7CiAgfQogIGNvbnN0cnVjdG9yKGkxMCkgewogICAgaWYgKHN1cGVyKGkxMCksIHRoaXMuaXQgPSBBLCBpMTAudHlwZSAhPT0gdDMuQ0hJTEQpIHRocm93IEVycm9yKHRoaXMuY29uc3RydWN0b3IuZGlyZWN0aXZlTmFtZSArICIoKSBjYW4gb25seSBiZSB1c2VkIGluIGNoaWxkIGJpbmRpbmdzIik7CiAgfQogIHJlbmRlcihyMTApIHsKICAgIGlmIChyMTAgPT09IEEgfHwgbnVsbCA9PSByMTApIHJldHVybiB0aGlzLl90ID0gdm9pZCAwLCB0aGlzLml0ID0gcjEwOwogICAgaWYgKHIxMCA9PT0gRSkgcmV0dXJuIHIxMDsKICAgIGlmICgic3RyaW5nIiAhPSB0eXBlb2YgcjEwKSB0aHJvdyBFcnJvcih0aGlzLmNvbnN0cnVjdG9yLmRpcmVjdGl2ZU5hbWUgKyAiKCkgY2FsbGVkIHdpdGggYSBub24tc3RyaW5nIHZhbHVlIik7CiAgICBpZiAocjEwID09PSB0aGlzLml0KSByZXR1cm4gdGhpcy5fdDsKICAgIHRoaXMuaXQgPSByMTA7CiAgICBjb25zdCBzOSA9IFtyMTBdOwogICAgcmV0dXJuIHM5LnJhdyA9IHM5LCB0aGlzLl90ID0geyBfJGxpdFR5cGUkOiB0aGlzLmNvbnN0cnVjdG9yLnJlc3VsdFR5cGUsIHN0cmluZ3M6IHM5LCB2YWx1ZXM6IFtdIH07CiAgfQp9OwplNS5kaXJlY3RpdmVOYW1lID0gInVuc2FmZUhUTUwiLCBlNS5yZXN1bHRUeXBlID0gMTsKdmFyIG84ID0gZTQoZTUpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BsaXQrcmVhY3RpdmUtZWxlbWVudEAyLjEuMi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L2RlY29yYXRvcnMvY3VzdG9tLWVsZW1lbnQuanMKdmFyIHQ0ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgodDgpID0+IChlMTAsIG8xMikgPT4gewogIHZvaWQgMCAhPT0gbzEyID8gbzEyLmFkZEluaXRpYWxpemVyKCgpID0+IHsKICAgIGN1c3RvbUVsZW1lbnRzLmRlZmluZSh0OCwgZTEwKTsKICB9KSA6IGN1c3RvbUVsZW1lbnRzLmRlZmluZSh0OCwgZTEwKTsKfSwgInQiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWVsZW1lbnRAMi4yLjMvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZWxlbWVudC9kaXN0X3RzL2RlY29yYXRvcnMuY3VzdG9tZWxlbWVudC5qcwp2YXIgY2FtZWxUb0tlYmFiID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgobmFtZSkgPT4gbmFtZS5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAiJDEtJDIiKS50b0xvd2VyQ2FzZSgpLCAiY2FtZWxUb0tlYmFiIik7CmZ1bmN0aW9uIGN1c3RvbUVsZW1lbnQodGFnTmFtZSkgewogIHJldHVybiAoY2xhc3NPclRhcmdldCwgY29udGV4dDIpID0+IHsKICAgIGNsYXNzT3JUYXJnZXQuaXMgPSB0YWdOYW1lOwogICAgaWYgKGNsYXNzT3JUYXJnZXQubmFtZSkgewogICAgICBjb25zdCBkZXJpdmVkID0gY2FtZWxUb0tlYmFiKGNsYXNzT3JUYXJnZXQubmFtZSk7CiAgICAgIGlmIChkZXJpdmVkICE9PSB0YWdOYW1lKSB7CiAgICAgICAgY29uc29sZS53YXJuKGBbZGVlcy1lbGVtZW50XSBDbGFzcyAiJHtjbGFzc09yVGFyZ2V0Lm5hbWV9IiBrZWJhYi1jYXNlcyB0byAiJHtkZXJpdmVkfSIgYnV0IHRhZyBpcyAiJHt0YWdOYW1lfSIuIENvbnRhaW5lciBxdWVyaWVzIHVzZSAuaXMgKCIke3RhZ05hbWV9IikuYCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0NCh0YWdOYW1lKShjbGFzc09yVGFyZ2V0LCBjb250ZXh0Mik7CiAgfTsKfQpfX25hbWUoY3VzdG9tRWxlbWVudCwgImN1c3RvbUVsZW1lbnQiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AbGl0K3JlYWN0aXZlLWVsZW1lbnRAMi4xLjIvbm9kZV9tb2R1bGVzL0BsaXQvcmVhY3RpdmUtZWxlbWVudC9kZWNvcmF0b3JzL3N0YXRlLmpzCmZ1bmN0aW9uIHI1KHIxMCkgewogIHJldHVybiBuNSh7IC4uLnIxMCwgc3RhdGU6IHRydWUsIGF0dHJpYnV0ZTogZmFsc2UgfSk7Cn0KX19uYW1lKHI1LCAiciIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BsaXQrcmVhY3RpdmUtZWxlbWVudEAyLjEuMi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L2RlY29yYXRvcnMvZXZlbnQtb3B0aW9ucy5qcwpmdW5jdGlvbiB0NSh0OCkgewogIHJldHVybiAobjExLCBvMTIpID0+IHsKICAgIGNvbnN0IGMxMCA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIG4xMSA/IG4xMSA6IG4xMVtvMTJdOwogICAgT2JqZWN0LmFzc2lnbihjMTAsIHQ4KTsKICB9Owp9Cl9fbmFtZSh0NSwgInQiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AbGl0K3JlYWN0aXZlLWVsZW1lbnRAMi4xLjIvbm9kZV9tb2R1bGVzL0BsaXQvcmVhY3RpdmUtZWxlbWVudC9kZWNvcmF0b3JzL2Jhc2UuanMKdmFyIGU2ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoZTEwLCB0OCwgYzEwKSA9PiAoYzEwLmNvbmZpZ3VyYWJsZSA9IHRydWUsIGMxMC5lbnVtZXJhYmxlID0gdHJ1ZSwgUmVmbGVjdC5kZWNvcmF0ZSAmJiAib2JqZWN0IiAhPSB0eXBlb2YgdDggJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUxMCwgdDgsIGMxMCksIGMxMCksICJlIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGxpdCtyZWFjdGl2ZS1lbGVtZW50QDIuMS4yL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGVjb3JhdG9ycy9xdWVyeS5qcwpmdW5jdGlvbiBlNyhlMTAsIHIxMCkgewogIHJldHVybiAobjExLCBzOSwgaTEwKSA9PiB7CiAgICBjb25zdCBvMTIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh0OCkgPT4gdDgucmVuZGVyUm9vdD8ucXVlcnlTZWxlY3RvcihlMTApID8/IG51bGwsICJvIik7CiAgICBpZiAocjEwKSB7CiAgICAgIGNvbnN0IHsgZ2V0OiBlMTEsIHNldDogcjExIH0gPSAib2JqZWN0IiA9PSB0eXBlb2YgczkgPyBuMTEgOiBpMTAgPz8gLyogQF9fUFVSRV9fICovICgoKSA9PiB7CiAgICAgICAgY29uc3QgdDggPSAvKiBAX19QVVJFX18gKi8gU3ltYm9sKCk7CiAgICAgICAgcmV0dXJuIHsgZ2V0KCkgewogICAgICAgICAgcmV0dXJuIHRoaXNbdDhdOwogICAgICAgIH0sIHNldChlMTIpIHsKICAgICAgICAgIHRoaXNbdDhdID0gZTEyOwogICAgICAgIH0gfTsKICAgICAgfSkoKTsKICAgICAgcmV0dXJuIGU2KG4xMSwgczksIHsgZ2V0KCkgewogICAgICAgIGxldCB0OCA9IGUxMS5jYWxsKHRoaXMpOwogICAgICAgIHJldHVybiB2b2lkIDAgPT09IHQ4ICYmICh0OCA9IG8xMih0aGlzKSwgKG51bGwgIT09IHQ4IHx8IHRoaXMuaGFzVXBkYXRlZCkgJiYgcjExLmNhbGwodGhpcywgdDgpKSwgdDg7CiAgICAgIH0gfSk7CiAgICB9CiAgICByZXR1cm4gZTYobjExLCBzOSwgeyBnZXQoKSB7CiAgICAgIHJldHVybiBvMTIodGhpcyk7CiAgICB9IH0pOwogIH07Cn0KX19uYW1lKGU3LCAiZSIpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BsaXQrcmVhY3RpdmUtZWxlbWVudEAyLjEuMi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L2RlY29yYXRvcnMvcXVlcnktYWxsLmpzCnZhciBlODsKZnVuY3Rpb24gcjYocjEwKSB7CiAgcmV0dXJuIChuMTEsIG8xMikgPT4gZTYobjExLCBvMTIsIHsgZ2V0KCkgewogICAgcmV0dXJuICh0aGlzLnJlbmRlclJvb3QgPz8gKGU4ID8/PSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkpKS5xdWVyeVNlbGVjdG9yQWxsKHIxMCk7CiAgfSB9KTsKfQpfX25hbWUocjYsICJyIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGxpdCtyZWFjdGl2ZS1lbGVtZW50QDIuMS4yL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGVjb3JhdG9ycy9xdWVyeS1hc3luYy5qcwpmdW5jdGlvbiByNyhyMTApIHsKICByZXR1cm4gKG4xMSwgZTEwKSA9PiBlNihuMTEsIGUxMCwgeyBhc3luYyBnZXQoKSB7CiAgICByZXR1cm4gYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZSwgdGhpcy5yZW5kZXJSb290Py5xdWVyeVNlbGVjdG9yKHIxMCkgPz8gbnVsbDsKICB9IH0pOwp9Cl9fbmFtZShyNywgInIiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AbGl0K3JlYWN0aXZlLWVsZW1lbnRAMi4xLjIvbm9kZV9tb2R1bGVzL0BsaXQvcmVhY3RpdmUtZWxlbWVudC9kZWNvcmF0b3JzL3F1ZXJ5LWFzc2lnbmVkLWVsZW1lbnRzLmpzCmZ1bmN0aW9uIG85KG8xMikgewogIHJldHVybiAoZTEwLCBuMTEpID0+IHsKICAgIGNvbnN0IHsgc2xvdDogcjEwLCBzZWxlY3RvcjogczkgfSA9IG8xMiA/PyB7fSwgYzEwID0gInNsb3QiICsgKHIxMCA/IGBbbmFtZT0ke3IxMH1dYCA6ICI6bm90KFtuYW1lXSkiKTsKICAgIHJldHVybiBlNihlMTAsIG4xMSwgeyBnZXQoKSB7CiAgICAgIGNvbnN0IHQ4ID0gdGhpcy5yZW5kZXJSb290Py5xdWVyeVNlbGVjdG9yKGMxMCksIGUxMSA9IHQ4Py5hc3NpZ25lZEVsZW1lbnRzKG8xMikgPz8gW107CiAgICAgIHJldHVybiB2b2lkIDAgPT09IHM5ID8gZTExIDogZTExLmZpbHRlcigodDkpID0+IHQ5Lm1hdGNoZXMoczkpKTsKICAgIH0gfSk7CiAgfTsKfQpfX25hbWUobzksICJvIik7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGxpdCtyZWFjdGl2ZS1lbGVtZW50QDIuMS4yL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGVjb3JhdG9ycy9xdWVyeS1hc3NpZ25lZC1ub2Rlcy5qcwpmdW5jdGlvbiBuNyhuMTEpIHsKICByZXR1cm4gKG8xMiwgcjEwKSA9PiB7CiAgICBjb25zdCB7IHNsb3Q6IGUxMCB9ID0gbjExID8/IHt9LCBzOSA9ICJzbG90IiArIChlMTAgPyBgW25hbWU9JHtlMTB9XWAgOiAiOm5vdChbbmFtZV0pIik7CiAgICByZXR1cm4gZTYobzEyLCByMTAsIHsgZ2V0KCkgewogICAgICBjb25zdCB0OCA9IHRoaXMucmVuZGVyUm9vdD8ucXVlcnlTZWxlY3RvcihzOSk7CiAgICAgIHJldHVybiB0OD8uYXNzaWduZWROb2RlcyhuMTEpID8/IFtdOwogICAgfSB9KTsKICB9Owp9Cl9fbmFtZShuNywgIm4iKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWVsZW1lbnRAMi4yLjMvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZWxlbWVudC9kaXN0X3RzL2NsYXNzZXMuZGVlcy1lbGVtZW50LmpzCnZhciBfX2VzRGVjb3JhdGUyID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjYpIHsKICAgIGlmIChmNiAhPT0gdm9pZCAwICYmIHR5cGVvZiBmNiAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmNjsKICB9CiAgX19uYW1lKGFjY2VwdCwgImFjY2VwdCIpOwogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfMywgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMCA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTEwID49IDA7IGkxMC0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA2IGluIGNvbnRleHRJbikgY29udGV4dDJbcDZdID0gcDYgPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDZdOwogICAgZm9yICh2YXIgcDYgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A2XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDZdOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmNikgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY2IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTEwXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfMyA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfMzsKICAgICAgaWYgKF8zID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF8zOwogICAgICBpZiAoXzMgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfMyk7CiAgICB9IGVsc2UgaWYgKF8zID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8zKTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzM7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzMyA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTEwID0gMDsgaTEwIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTEwKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMF0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMF0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc0VsZW1lbnQgPSAoKCkgPT4gewogIGxldCBfY2xhc3NTdXBlciA9IGxpdC5MaXRFbGVtZW50OwogIGxldCBfZ29CcmlnaHRfZGVjb3JhdG9yczsKICBsZXQgX2dvQnJpZ2h0X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZ29CcmlnaHRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2RvbXRvb2xzX2RlY29yYXRvcnM7CiAgbGV0IF9kb210b29sc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2RvbXRvb2xzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgcmV0dXJuIGNsYXNzIERlZXNFbGVtZW50IGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX19uYW1lKHRoaXMsICJEZWVzRWxlbWVudCIpOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9nb0JyaWdodF9kZWNvcmF0b3JzID0gW2xpdC5wcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfZG9tdG9vbHNfZGVjb3JhdG9ycyA9IFtsaXQucHJvcGVydHkoKV07CiAgICAgIF9fZXNEZWNvcmF0ZTIodGhpcywgbnVsbCwgX2dvQnJpZ2h0X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImdvQnJpZ2h0Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKG9iaikgPT4gImdvQnJpZ2h0IiBpbiBvYmosICJoYXMiKSwgZ2V0OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKChvYmopID0+IG9iai5nb0JyaWdodCwgImdldCIpLCBzZXQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmdvQnJpZ2h0ID0gdmFsdWUyOwogICAgICB9LCAic2V0IikgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZ29CcmlnaHRfaW5pdGlhbGl6ZXJzLCBfZ29CcmlnaHRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUyKHRoaXMsIG51bGwsIF9kb210b29sc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJkb210b29scyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKChvYmopID0+ICJkb210b29scyIgaW4gb2JqLCAiaGFzIiksIGdldDogLyogQF9fUFVSRV9fICovIF9fbmFtZSgob2JqKSA9PiBvYmouZG9tdG9vbHMsICJnZXQiKSwgc2V0OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5kb210b29scyA9IHZhbHVlMjsKICAgICAgfSwgInNldCIpIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2RvbXRvb2xzX2luaXRpYWxpemVycywgX2RvbXRvb2xzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgLy8gU1RBVElDIOKAlCBjb21wb25lbnQtbGV2ZWwgY29uc3RyYWludCBoZWxwZXIgKHVzZSBpbiBgc3RhdGljIHN0eWxlcyA9IFsuLi5dYCkKICAgIHN0YXRpYyBnZXRDb250YWluZXJOYW1lKCkgewogICAgICByZXR1cm4gdGhpcy5pcyB8fCB0aGlzLm5hbWUucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgIiQxLSQyIikudG9Mb3dlckNhc2UoKTsKICAgIH0KICAgIHN0YXRpYyBjc3NGb3JDb25zdHJhaW50KGNvbnN0cmFpbnRzKSB7CiAgICAgIHJldHVybiAoY3NzQXJnKSA9PiBkaXN0X3RzX2V4cG9ydHMyNy5icmVha3BvaW50cy5jc3NGb3JDb25zdHJhaW50Q29udGFpbmVyKGNvbnN0cmFpbnRzLCB0aGlzLmdldENvbnRhaW5lck5hbWUoKSkoY3NzQXJnKTsKICAgIH0KICAgICNnb0JyaWdodF9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnMzKHRoaXMsIF9nb0JyaWdodF9pbml0aWFsaXplcnMsIGZhbHNlKTsKICAgIC8vIElOU1RBTkNFCiAgICBnZXQgZ29CcmlnaHQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNnb0JyaWdodF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGdvQnJpZ2h0KHZhbHVlMikgewogICAgICB0aGlzLiNnb0JyaWdodF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgLy8gZG9tdG9vbHMKICAgIGRvbXRvb2xzUHJvbWlzZSA9IF9fcnVuSW5pdGlhbGl6ZXJzMyh0aGlzLCBfZ29CcmlnaHRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgI2RvbXRvb2xzX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczModGhpcywgX2RvbXRvb2xzX2luaXRpYWxpemVycywgdm9pZCAwKTsKICAgIGdldCBkb210b29scygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2RvbXRvb2xzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZG9tdG9vbHModmFsdWUyKSB7CiAgICAgIHRoaXMuI2RvbXRvb2xzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICByeFN1YnNjcmlwdGlvbnMgPSAoX19ydW5Jbml0aWFsaXplcnMzKHRoaXMsIF9kb210b29sc19leHRyYUluaXRpYWxpemVycyksIFtdKTsKICAgIHRoZW1lU3Vic2NyaXB0aW9uOwogICAgZWxlbWVudERvbVJlYWR5RGVmZXJyZWQgPSBkaXN0X3RzX2V4cG9ydHMyNy5wbHVnaW5zLnNtYXJ0cHJvbWlzZS5kZWZlcigpOwogICAgZWxlbWVudERvbVJlYWR5ID0gdGhpcy5lbGVtZW50RG9tUmVhZHlEZWZlcnJlZC5wcm9taXNlOwogICAgY29uc3RydWN0b3Iob3B0aW9uc0FyZyA9IHt9KSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMuZG9tdG9vbHNQcm9taXNlID0gZGlzdF90c19leHBvcnRzMjcuZWxlbWVudEJhc2ljLnNldHVwKHRoaXMsIG9wdGlvbnNBcmcpOwogICAgICB0aGlzLmRvbXRvb2xzUHJvbWlzZS50aGVuKChkb210b29sc0FyZykgPT4gewogICAgICAgIHRoaXMuZG9tdG9vbHMgPSBkb210b29sc0FyZzsKICAgICAgfSk7CiAgICB9CiAgICBhc3luYyBjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgY29uc3QgZG9tdG9vbHMgPSBhd2FpdCB0aGlzLmRvbXRvb2xzUHJvbWlzZTsKICAgICAgdGhpcy50aGVtZVN1YnNjcmlwdGlvbiA9IGRvbXRvb2xzLnRoZW1lTWFuYWdlci50aGVtZU9ic2VydmFibGUuc3Vic2NyaWJlKChnb0JyaWdodEFyZykgPT4gewogICAgICAgIHRoaXMuZ29CcmlnaHQgPSBnb0JyaWdodEFyZzsKICAgICAgICBpZiAodGhpcy50aGVtZUNoYW5nZWQpIHsKICAgICAgICAgIHRoaXMudGhlbWVDaGFuZ2VkKGdvQnJpZ2h0QXJnKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICB0aGlzLnJ4U3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMudGhlbWVTdWJzY3JpcHRpb24pOwogICAgICBmb3IgKGNvbnN0IHN0YXJ0dXBGdW5jdGlvbiBvZiB0aGlzLnN0YXJ0dXBGdW5jdGlvbnMpIHsKICAgICAgICBhd2FpdCBzdGFydHVwRnVuY3Rpb24oKTsKICAgICAgfQogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJkZWVzRWxlbWVudENvbm5lY3RlZCIpKTsKICAgIH0KICAgIGZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXMpIHsKICAgICAgc3VwZXIuZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllcyk7CiAgICAgIHRoaXMuZWxlbWVudERvbVJlYWR5RGVmZXJyZWQucmVzb2x2ZSgpOwogICAgfQogICAgc3RhcnR1cEZ1bmN0aW9ucyA9IFtdOwogICAgcmVnaXN0ZXJTdGFydHVwRnVuY3Rpb24oc3RhcnR1cEZ1bmN0aW9uQXJnKSB7CiAgICAgIHRoaXMuc3RhcnR1cEZ1bmN0aW9ucy5wdXNoKHN0YXJ0dXBGdW5jdGlvbkFyZyk7CiAgICB9CiAgICBnYXJiYWdlRnVuY3Rpb25zID0gW107CiAgICByZWdpc3RlckdhcmJhZ2VGdW5jdGlvbihnYXJiYWdlRnVuY3Rpb25BcmcpIHsKICAgICAgdGhpcy5nYXJiYWdlRnVuY3Rpb25zLnB1c2goZ2FyYmFnZUZ1bmN0aW9uQXJnKTsKICAgIH0KICAgIGFzeW5jIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBhd2FpdCB0aGlzLmRvbXRvb2xzUHJvbWlzZTsKICAgICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgZm9yIChjb25zdCBzdWJzY3JpcHRpb24gb2YgdGhpcy5yeFN1YnNjcmlwdGlvbnMpIHsKICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgfQogICAgICBmb3IgKGNvbnN0IGdhcmJhZ2VGdW5jdGlvbiBvZiB0aGlzLmdhcmJhZ2VGdW5jdGlvbnMpIHsKICAgICAgICBhd2FpdCBnYXJiYWdlRnVuY3Rpb24oKTsKICAgICAgfQogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJkZWVzRWxlbWVudERpc2Nvbm5lY3RlZCIpKTsKICAgIH0KICB9Owp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZWxlbWVudEAyLjIuMy9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1lbGVtZW50L2Rpc3RfdHMvZGVjb3JhdG9ycy5jb250YWluZXJyZXNwb25zaXZlLmpzCnZhciBjYW1lbFRvS2ViYWIyID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgobmFtZSkgPT4gbmFtZS5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAiJDEtJDIiKS50b0xvd2VyQ2FzZSgpLCAiY2FtZWxUb0tlYmFiIik7CmZ1bmN0aW9uIGNvbnRhaW5lclJlc3BvbnNpdmUoKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKHRhcmdldCkgewogICAgY29uc3QgdGFnTmFtZSA9IHRhcmdldC5pcyB8fCB0YXJnZXQubmFtZS5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAiJDEtJDIiKS50b0xvd2VyQ2FzZSgpOwogICAgY29uc3QgZGVyaXZlZE5hbWUgPSB0YXJnZXQubmFtZSA/IGNhbWVsVG9LZWJhYjIodGFyZ2V0Lm5hbWUpIDogbnVsbDsKICAgIGlmIChkZXJpdmVkTmFtZSAmJiBkZXJpdmVkTmFtZSAhPT0gdGFnTmFtZSkgewogICAgICBjb25zdCBmaXhTdHlsZSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHN0eWxlKSA9PiB7CiAgICAgICAgaWYgKHN0eWxlICYmIHN0eWxlLmNzc1RleHQgJiYgc3R5bGUuY3NzVGV4dC5pbmNsdWRlcyhgQGNvbnRhaW5lciAke2Rlcml2ZWROYW1lfWApKSB7CiAgICAgICAgICByZXR1cm4gcihzdHlsZS5jc3NUZXh0LnJlcGxhY2VBbGwoYEBjb250YWluZXIgJHtkZXJpdmVkTmFtZX1gLCBgQGNvbnRhaW5lciAke3RhZ05hbWV9YCkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3R5bGU7CiAgICAgIH0sICJmaXhTdHlsZSIpOwogICAgICBjb25zdCBvcmlnaW5hbCA9IHRhcmdldC5zdHlsZXM7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KG9yaWdpbmFsKSkgewogICAgICAgIHRhcmdldC5zdHlsZXMgPSBvcmlnaW5hbC5tYXAoZml4U3R5bGUpOwogICAgICB9IGVsc2UgaWYgKG9yaWdpbmFsKSB7CiAgICAgICAgdGFyZ2V0LnN0eWxlcyA9IGZpeFN0eWxlKG9yaWdpbmFsKTsKICAgICAgfQogICAgfQogICAgY29uc3QgY29udGFpbmVyU3R5bGVzID0gZG9tdG9vbHNfY3NzX2JyZWFrcG9pbnRzX2V4cG9ydHMuY29udGFpbmVyQ29udGV4dFN0eWxlcyh0YWdOYW1lKTsKICAgIGNvbnN0IGN1cnJlbnQgPSB0YXJnZXQuc3R5bGVzOwogICAgaWYgKEFycmF5LmlzQXJyYXkoY3VycmVudCkpIHsKICAgICAgdGFyZ2V0LnN0eWxlcyA9IFsuLi5jdXJyZW50LCBjb250YWluZXJTdHlsZXNdOwogICAgfSBlbHNlIGlmIChjdXJyZW50KSB7CiAgICAgIHRhcmdldC5zdHlsZXMgPSBbY3VycmVudCwgY29udGFpbmVyU3R5bGVzXTsKICAgIH0gZWxzZSB7CiAgICAgIHRhcmdldC5zdHlsZXMgPSBbY29udGFpbmVyU3R5bGVzXTsKICAgIH0KICAgIHJldHVybiB0YXJnZXQ7CiAgfTsKfQpfX25hbWUoY29udGFpbmVyUmVzcG9uc2l2ZSwgImNvbnRhaW5lclJlc3BvbnNpdmUiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWVsZW1lbnRAMi4yLjMvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZWxlbWVudC9kaXN0X3RzL2RpcmVjdGl2ZXMvaW5kZXguanMKdmFyIGRpcmVjdGl2ZXNfZXhwb3J0cyA9IHt9OwpfX2V4cG9ydChkaXJlY3RpdmVzX2V4cG9ydHMsIHsKICBhc3luY0FwcGVuZDogKCkgPT4gYzgsCiAga2V5ZWQ6ICgpID0+IGk5LAogIHJlcGVhdDogKCkgPT4gYzksCiAgcmVzb2x2ZTogKCkgPT4gcmVzb2x2ZSwKICByZXNvbHZlRXhlYzogKCkgPT4gcmVzb2x2ZUV4ZWMsCiAgc3Vic2NyaWJlOiAoKSA9PiBzdWJzY3JpYmUsCiAgc3Vic2NyaWJlV2l0aFRlbXBsYXRlOiAoKSA9PiBzdWJzY3JpYmVXaXRoVGVtcGxhdGUsCiAgdW50aWw6ICgpID0+IG00Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2xpdC1odG1sQDMuMy4yL25vZGVfbW9kdWxlcy9saXQtaHRtbC9kaXJlY3RpdmUtaGVscGVycy5qcwp2YXIgeyBJOiB0NiB9ID0gaiwgaTcgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChvMTIpID0+IG8xMiwgImkiKSwgbjggPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChvMTIpID0+IG51bGwgPT09IG8xMiB8fCAib2JqZWN0IiAhPSB0eXBlb2YgbzEyICYmICJmdW5jdGlvbiIgIT0gdHlwZW9mIG8xMiwgIm4iKSwgZTkgPSB7IEhUTUw6IDEsIFNWRzogMiwgTUFUSE1MOiAzIH0sIGw0ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgobzEyLCB0OCkgPT4gdm9pZCAwID09PSB0OCA/IHZvaWQgMCAhPT0gbzEyPy5fJGxpdFR5cGUkIDogbzEyPy5fJGxpdFR5cGUkID09PSB0OCwgImwiKSwgZDMgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChvMTIpID0+IG51bGwgIT0gbzEyPy5fJGxpdFR5cGUkPy5oLCAiZCIpLCBjNSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKG8xMikgPT4gdm9pZCAwICE9PSBvMTI/Ll8kbGl0RGlyZWN0aXZlJCwgImMiKSwgZjQgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChvMTIpID0+IG8xMj8uXyRsaXREaXJlY3RpdmUkLCAiZiIpLCByOCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKG8xMikgPT4gdm9pZCAwID09PSBvMTIuc3RyaW5ncywgInIiKSwgczYgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCgpID0+IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoIiIpLCAicyIpLCB2MyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKG8xMiwgbjExLCBlMTApID0+IHsKICBjb25zdCBsNSA9IG8xMi5fJEFBLnBhcmVudE5vZGUsIGQ0ID0gdm9pZCAwID09PSBuMTEgPyBvMTIuXyRBQiA6IG4xMS5fJEFBOwogIGlmICh2b2lkIDAgPT09IGUxMCkgewogICAgY29uc3QgaTEwID0gbDUuaW5zZXJ0QmVmb3JlKHM2KCksIGQ0KSwgbjEyID0gbDUuaW5zZXJ0QmVmb3JlKHM2KCksIGQ0KTsKICAgIGUxMCA9IG5ldyB0NihpMTAsIG4xMiwgbzEyLCBvMTIub3B0aW9ucyk7CiAgfSBlbHNlIHsKICAgIGNvbnN0IHQ4ID0gZTEwLl8kQUIubmV4dFNpYmxpbmcsIG4xMiA9IGUxMC5fJEFNLCBjMTAgPSBuMTIgIT09IG8xMjsKICAgIGlmIChjMTApIHsKICAgICAgbGV0IHQ5OwogICAgICBlMTAuXyRBUT8uKG8xMiksIGUxMC5fJEFNID0gbzEyLCB2b2lkIDAgIT09IGUxMC5fJEFQICYmICh0OSA9IG8xMi5fJEFVKSAhPT0gbjEyLl8kQVUgJiYgZTEwLl8kQVAodDkpOwogICAgfQogICAgaWYgKHQ4ICE9PSBkNCB8fCBjMTApIHsKICAgICAgbGV0IG8xMyA9IGUxMC5fJEFBOwogICAgICBmb3IgKDsgbzEzICE9PSB0ODsgKSB7CiAgICAgICAgY29uc3QgdDkgPSBpNyhvMTMpLm5leHRTaWJsaW5nOwogICAgICAgIGk3KGw1KS5pbnNlcnRCZWZvcmUobzEzLCBkNCksIG8xMyA9IHQ5OwogICAgICB9CiAgICB9CiAgfQogIHJldHVybiBlMTA7Cn0sICJ2IiksIHU0ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgobzEyLCB0OCwgaTEwID0gbzEyKSA9PiAobzEyLl8kQUkodDgsIGkxMCksIG8xMiksICJ1IiksIG0zID0ge30sIHA1ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgobzEyLCB0OCA9IG0zKSA9PiBvMTIuXyRBSCA9IHQ4LCAicCIpLCBNMiA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKG8xMikgPT4gbzEyLl8kQUgsICJNIiksIGgzID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgobzEyKSA9PiB7CiAgbzEyLl8kQVIoKSwgbzEyLl8kQUEucmVtb3ZlKCk7Cn0sICJoIiksIGoyID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgobzEyKSA9PiB7CiAgbzEyLl8kQVIoKTsKfSwgImoiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9saXQtaHRtbEAzLjMuMi9ub2RlX21vZHVsZXMvbGl0LWh0bWwvYXN5bmMtZGlyZWN0aXZlLmpzCnZhciBzNyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGkxMCwgdDgpID0+IHsKICBjb25zdCBlMTAgPSBpMTAuXyRBTjsKICBpZiAodm9pZCAwID09PSBlMTApIHJldHVybiBmYWxzZTsKICBmb3IgKGNvbnN0IGkxMSBvZiBlMTApIGkxMS5fJEFPPy4odDgsIGZhbHNlKSwgczcoaTExLCB0OCk7CiAgcmV0dXJuIHRydWU7Cn0sICJzIiksIG8xMCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGkxMCkgPT4gewogIGxldCB0OCwgZTEwOwogIGRvIHsKICAgIGlmICh2b2lkIDAgPT09ICh0OCA9IGkxMC5fJEFNKSkgYnJlYWs7CiAgICBlMTAgPSB0OC5fJEFOLCBlMTAuZGVsZXRlKGkxMCksIGkxMCA9IHQ4OwogIH0gd2hpbGUgKDAgPT09IGUxMD8uc2l6ZSk7Cn0sICJvIiksIHI5ID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoaTEwKSA9PiB7CiAgZm9yIChsZXQgdDg7IHQ4ID0gaTEwLl8kQU07IGkxMCA9IHQ4KSB7CiAgICBsZXQgZTEwID0gdDguXyRBTjsKICAgIGlmICh2b2lkIDAgPT09IGUxMCkgdDguXyRBTiA9IGUxMCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7CiAgICBlbHNlIGlmIChlMTAuaGFzKGkxMCkpIGJyZWFrOwogICAgZTEwLmFkZChpMTApLCBjNih0OCk7CiAgfQp9LCAiciIpOwpmdW5jdGlvbiBoNChpMTApIHsKICB2b2lkIDAgIT09IHRoaXMuXyRBTiA/IChvMTAodGhpcyksIHRoaXMuXyRBTSA9IGkxMCwgcjkodGhpcykpIDogdGhpcy5fJEFNID0gaTEwOwp9Cl9fbmFtZShoNCwgImgiKTsKZnVuY3Rpb24gbjkoaTEwLCB0OCA9IGZhbHNlLCBlMTAgPSAwKSB7CiAgY29uc3QgcjEwID0gdGhpcy5fJEFILCBoNyA9IHRoaXMuXyRBTjsKICBpZiAodm9pZCAwICE9PSBoNyAmJiAwICE9PSBoNy5zaXplKSBpZiAodDgpIGlmIChBcnJheS5pc0FycmF5KHIxMCkpIGZvciAobGV0IGkxMSA9IGUxMDsgaTExIDwgcjEwLmxlbmd0aDsgaTExKyspIHM3KHIxMFtpMTFdLCBmYWxzZSksIG8xMChyMTBbaTExXSk7CiAgZWxzZSBudWxsICE9IHIxMCAmJiAoczcocjEwLCBmYWxzZSksIG8xMChyMTApKTsKICBlbHNlIHM3KHRoaXMsIGkxMCk7Cn0KX19uYW1lKG45LCAibiIpOwp2YXIgYzYgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChpMTApID0+IHsKICBpMTAudHlwZSA9PSB0My5DSElMRCAmJiAoaTEwLl8kQVAgPz89IG45LCBpMTAuXyRBUSA/Pz0gaDQpOwp9LCAiYyIpOwp2YXIgZjUgPSBjbGFzcyBleHRlbmRzIGk2IHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJmIik7CiAgfQogIGNvbnN0cnVjdG9yKCkgewogICAgc3VwZXIoLi4uYXJndW1lbnRzKSwgdGhpcy5fJEFOID0gdm9pZCAwOwogIH0KICBfJEFUKGkxMCwgdDgsIGUxMCkgewogICAgc3VwZXIuXyRBVChpMTAsIHQ4LCBlMTApLCByOSh0aGlzKSwgdGhpcy5pc0Nvbm5lY3RlZCA9IGkxMC5fJEFVOwogIH0KICBfJEFPKGkxMCwgdDggPSB0cnVlKSB7CiAgICBpMTAgIT09IHRoaXMuaXNDb25uZWN0ZWQgJiYgKHRoaXMuaXNDb25uZWN0ZWQgPSBpMTAsIGkxMCA/IHRoaXMucmVjb25uZWN0ZWQ/LigpIDogdGhpcy5kaXNjb25uZWN0ZWQ/LigpKSwgdDggJiYgKHM3KHRoaXMsIGkxMCksIG8xMCh0aGlzKSk7CiAgfQogIHNldFZhbHVlKHQ4KSB7CiAgICBpZiAocjgodGhpcy5fJEN0KSkgdGhpcy5fJEN0Ll8kQUkodDgsIHRoaXMpOwogICAgZWxzZSB7CiAgICAgIGNvbnN0IGkxMCA9IFsuLi50aGlzLl8kQ3QuXyRBSF07CiAgICAgIGkxMFt0aGlzLl8kQ2ldID0gdDgsIHRoaXMuXyRDdC5fJEFJKGkxMCwgdGhpcywgMCk7CiAgICB9CiAgfQogIGRpc2Nvbm5lY3RlZCgpIHsKICB9CiAgcmVjb25uZWN0ZWQoKSB7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZWxlbWVudEAyLjIuMy9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1lbGVtZW50L2Rpc3RfdHMvZGlyZWN0aXZlcy9jbGFzc2VzLnJlc29sdmVkaXJlY3RpdmUuanMKdmFyIFJlc29sdmVEaXJlY3RpdmUgPSBjbGFzcyBleHRlbmRzIGY1IHsKICBzdGF0aWMgewogICAgX19uYW1lKHRoaXMsICJSZXNvbHZlRGlyZWN0aXZlIik7CiAgfQogIHByb21pc2U7CiAgaGFzUHJvbWlzZVNldHRsZWQgPSBmYWxzZTsKICByZW5kZXIocHJvbWlzZSkgewogICAgaWYgKHRoaXMucHJvbWlzZSAhPT0gcHJvbWlzZSkgewogICAgICB0aGlzLnByb21pc2UgPSBwcm9taXNlOwogICAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCkgewogICAgICAgIHRoaXMuaGFuZGxlUHJvbWlzZShwcm9taXNlKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIEU7CiAgfQogIGhhbmRsZVByb21pc2UocHJvbWlzZSkgewogICAgdGhpcy5oYXNQcm9taXNlU2V0dGxlZCA9IGZhbHNlOwogICAgcHJvbWlzZS50aGVuKCh2YWx1ZTIpID0+IHsKICAgICAgaWYgKHRoaXMucHJvbWlzZSA9PT0gcHJvbWlzZSAmJiAhdGhpcy5oYXNQcm9taXNlU2V0dGxlZCkgewogICAgICAgIHRoaXMuc2V0VmFsdWUodmFsdWUyKTsKICAgICAgICB0aGlzLmhhc1Byb21pc2VTZXR0bGVkID0gdHJ1ZTsKICAgICAgfQogICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7CiAgICAgIGlmICh0aGlzLnByb21pc2UgPT09IHByb21pc2UgJiYgIXRoaXMuaGFzUHJvbWlzZVNldHRsZWQpIHsKICAgICAgICB0aGlzLnNldFZhbHVlKGVycm9yKTsKICAgICAgICB0aGlzLmhhc1Byb21pc2VTZXR0bGVkID0gdHJ1ZTsKICAgICAgfQogICAgfSk7CiAgfQogIGRpc2Nvbm5lY3RlZCgpIHsKICAgIHRoaXMuaGFzUHJvbWlzZVNldHRsZWQgPSB0cnVlOwogIH0KICByZWNvbm5lY3RlZCgpIHsKICAgIGlmICghdGhpcy5oYXNQcm9taXNlU2V0dGxlZCkgewogICAgICB0aGlzLmhhbmRsZVByb21pc2UodGhpcy5wcm9taXNlKTsKICAgIH0KICB9Cn07CnZhciByZXNvbHZlID0gZTQoUmVzb2x2ZURpcmVjdGl2ZSk7CnZhciByZXNvbHZlRXhlYyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGZ1bmNBcmcpID0+IHsKICByZXR1cm4gcmVzb2x2ZShmdW5jQXJnKCkpOwp9LCAicmVzb2x2ZUV4ZWMiKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWVsZW1lbnRAMi4yLjMvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZWxlbWVudC9kaXN0X3RzL2RpcmVjdGl2ZXMvY2xhc3Nlcy5zdWJzY3JpYmVkaXJlY3RpdmUuanMKdmFyIFN1YnNjcmliZURpcmVjdGl2ZSA9IGNsYXNzIGV4dGVuZHMgZjUgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIlN1YnNjcmliZURpcmVjdGl2ZSIpOwogIH0KICBvYnNlcnZhYmxlOwogIHN1YiA9IG51bGw7CiAgcmVuZGVyKG9ic2VydmFibGUyKSB7CiAgICBpZiAodGhpcy5vYnNlcnZhYmxlICE9PSBvYnNlcnZhYmxlMikgewogICAgICB0aGlzLnN1Yj8udW5zdWJzY3JpYmUoKTsKICAgICAgdGhpcy5vYnNlcnZhYmxlID0gb2JzZXJ2YWJsZTI7CiAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKSB7CiAgICAgICAgdGhpcy5zdWJzY3JpYmUob2JzZXJ2YWJsZTIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gRTsKICB9CiAgc3Vic2NyaWJlKG9ic2VydmFibGUyKSB7CiAgICB0aGlzLnN1YiA9IG9ic2VydmFibGUyLnN1YnNjcmliZSgodjQpID0+IHsKICAgICAgdGhpcy5zZXRWYWx1ZSh2NCk7CiAgICB9KTsKICB9CiAgZGlzY29ubmVjdGVkKCkgewogICAgdGhpcy5zdWI/LnVuc3Vic2NyaWJlKCk7CiAgfQogIHJlY29ubmVjdGVkKCkgewogICAgdGhpcy5zdWJzY3JpYmUodGhpcy5vYnNlcnZhYmxlKTsKICB9Cn07CnZhciBzdWJzY3JpYmUgPSBlNChTdWJzY3JpYmVEaXJlY3RpdmUpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZWxlbWVudEAyLjIuMy9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1lbGVtZW50L2Rpc3RfdHMvZGlyZWN0aXZlcy9jbGFzc2VzLnN1YnNjcmliZXdpdGh0ZW1wbGF0ZS5qcwp2YXIgU3Vic2NyaWJlV2l0aFRlbXBsYXRlRGlyZWN0aXZlID0gY2xhc3MgZXh0ZW5kcyBmNSB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiU3Vic2NyaWJlV2l0aFRlbXBsYXRlRGlyZWN0aXZlIik7CiAgfQogIG9ic2VydmFibGU7CiAgdGVtcGxhdGVGbjsKICBzdWIgPSBudWxsOwogIHJlbmRlcihvYnNlcnZhYmxlMiwgdGVtcGxhdGVGbikgewogICAgY29uc3QgY2hhbmdlZCA9IHRoaXMub2JzZXJ2YWJsZSAhPT0gb2JzZXJ2YWJsZTIgfHwgdGhpcy50ZW1wbGF0ZUZuICE9PSB0ZW1wbGF0ZUZuOwogICAgaWYgKGNoYW5nZWQpIHsKICAgICAgdGhpcy5zdWI/LnVuc3Vic2NyaWJlKCk7CiAgICAgIHRoaXMub2JzZXJ2YWJsZSA9IG9ic2VydmFibGUyOwogICAgICB0aGlzLnRlbXBsYXRlRm4gPSB0ZW1wbGF0ZUZuOwogICAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCkgewogICAgICAgIHRoaXMuc3RhcnRTdWJzY3JpcHRpb24oKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIEU7CiAgfQogIHN0YXJ0U3Vic2NyaXB0aW9uKCkgewogICAgdGhpcy5zdWIgPSB0aGlzLm9ic2VydmFibGUuc3Vic2NyaWJlKCh2NCkgPT4gewogICAgICBjb25zdCBvdXQgPSB0aGlzLnRlbXBsYXRlRm4odjQpOwogICAgICB0aGlzLnNldFZhbHVlKG91dCk7CiAgICB9KTsKICB9CiAgZGlzY29ubmVjdGVkKCkgewogICAgdGhpcy5zdWI/LnVuc3Vic2NyaWJlKCk7CiAgfQogIHJlY29ubmVjdGVkKCkgewogICAgdGhpcy5zdGFydFN1YnNjcmlwdGlvbigpOwogIH0KfTsKdmFyIHN1YnNjcmliZVdpdGhUZW1wbGF0ZSA9IGU0KFN1YnNjcmliZVdpdGhUZW1wbGF0ZURpcmVjdGl2ZSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbGl0LWh0bWxAMy4zLjIvbm9kZV9tb2R1bGVzL2xpdC1odG1sL2RpcmVjdGl2ZXMvcHJpdmF0ZS1hc3luYy1oZWxwZXJzLmpzCnZhciB0NyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoYXN5bmMgKHQ4LCBzOSkgPT4gewogIGZvciBhd2FpdCAoY29uc3QgaTEwIG9mIHQ4KSBpZiAoZmFsc2UgPT09IGF3YWl0IHM5KGkxMCkpIHJldHVybjsKfSwgInQiKTsKdmFyIHM4ID0gY2xhc3MgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgInMiKTsKICB9CiAgY29uc3RydWN0b3IodDgpIHsKICAgIHRoaXMuRyA9IHQ4OwogIH0KICBkaXNjb25uZWN0KCkgewogICAgdGhpcy5HID0gdm9pZCAwOwogIH0KICByZWNvbm5lY3QodDgpIHsKICAgIHRoaXMuRyA9IHQ4OwogIH0KICBkZXJlZigpIHsKICAgIHJldHVybiB0aGlzLkc7CiAgfQp9Owp2YXIgaTggPSBjbGFzcyB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiaSIpOwogIH0KICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMuWSA9IHZvaWQgMCwgdGhpcy5aID0gdm9pZCAwOwogIH0KICBnZXQoKSB7CiAgICByZXR1cm4gdGhpcy5ZOwogIH0KICBwYXVzZSgpIHsKICAgIHRoaXMuWSA/Pz0gbmV3IFByb21pc2UoKHQ4KSA9PiB0aGlzLlogPSB0OCk7CiAgfQogIHJlc3VtZSgpIHsKICAgIHRoaXMuWj8uKCksIHRoaXMuWSA9IHRoaXMuWiA9IHZvaWQgMDsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vbGl0LWh0bWxAMy4zLjIvbm9kZV9tb2R1bGVzL2xpdC1odG1sL2RpcmVjdGl2ZXMvdW50aWwuanMKdmFyIG4xMCA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHQ4KSA9PiAhbjgodDgpICYmICJmdW5jdGlvbiIgPT0gdHlwZW9mIHQ4LnRoZW4sICJuIiksIGg1ID0gMTA3Mzc0MTgyMzsKdmFyIGM3ID0gY2xhc3MgZXh0ZW5kcyBmNSB7CiAgc3RhdGljIHsKICAgIF9fbmFtZSh0aGlzLCAiYyIpOwogIH0KICBjb25zdHJ1Y3RvcigpIHsKICAgIHN1cGVyKC4uLmFyZ3VtZW50cyksIHRoaXMuXyRDd3QgPSBoNSwgdGhpcy5fJENidCA9IFtdLCB0aGlzLl8kQ0sgPSBuZXcgczgodGhpcyksIHRoaXMuXyRDWCA9IG5ldyBpOCgpOwogIH0KICByZW5kZXIoLi4uczkpIHsKICAgIHJldHVybiBzOS5maW5kKCh0OCkgPT4gIW4xMCh0OCkpID8/IEU7CiAgfQogIHVwZGF0ZShzOSwgaTEwKSB7CiAgICBjb25zdCBlMTAgPSB0aGlzLl8kQ2J0OwogICAgbGV0IHIxMCA9IGUxMC5sZW5ndGg7CiAgICB0aGlzLl8kQ2J0ID0gaTEwOwogICAgY29uc3QgbzEyID0gdGhpcy5fJENLLCBjMTAgPSB0aGlzLl8kQ1g7CiAgICB0aGlzLmlzQ29ubmVjdGVkIHx8IHRoaXMuZGlzY29ubmVjdGVkKCk7CiAgICBmb3IgKGxldCB0OCA9IDA7IHQ4IDwgaTEwLmxlbmd0aCAmJiAhKHQ4ID4gdGhpcy5fJEN3dCk7IHQ4KyspIHsKICAgICAgY29uc3QgczEwID0gaTEwW3Q4XTsKICAgICAgaWYgKCFuMTAoczEwKSkgcmV0dXJuIHRoaXMuXyRDd3QgPSB0OCwgczEwOwogICAgICB0OCA8IHIxMCAmJiBzMTAgPT09IGUxMFt0OF0gfHwgKHRoaXMuXyRDd3QgPSBoNSwgcjEwID0gMCwgUHJvbWlzZS5yZXNvbHZlKHMxMCkudGhlbihhc3luYyAodDkpID0+IHsKICAgICAgICBmb3IgKDsgYzEwLmdldCgpOyApIGF3YWl0IGMxMC5nZXQoKTsKICAgICAgICBjb25zdCBpMTEgPSBvMTIuZGVyZWYoKTsKICAgICAgICBpZiAodm9pZCAwICE9PSBpMTEpIHsKICAgICAgICAgIGNvbnN0IGUxMSA9IGkxMS5fJENidC5pbmRleE9mKHMxMCk7CiAgICAgICAgICBlMTEgPiAtMSAmJiBlMTEgPCBpMTEuXyRDd3QgJiYgKGkxMS5fJEN3dCA9IGUxMSwgaTExLnNldFZhbHVlKHQ5KSk7CiAgICAgICAgfQogICAgICB9KSk7CiAgICB9CiAgICByZXR1cm4gRTsKICB9CiAgZGlzY29ubmVjdGVkKCkgewogICAgdGhpcy5fJENLLmRpc2Nvbm5lY3QoKSwgdGhpcy5fJENYLnBhdXNlKCk7CiAgfQogIHJlY29ubmVjdGVkKCkgewogICAgdGhpcy5fJENLLnJlY29ubmVjdCh0aGlzKSwgdGhpcy5fJENYLnJlc3VtZSgpOwogIH0KfTsKdmFyIG00ID0gZTQoYzcpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2xpdC1odG1sQDMuMy4yL25vZGVfbW9kdWxlcy9saXQtaHRtbC9kaXJlY3RpdmVzL2FzeW5jLXJlcGxhY2UuanMKdmFyIG8xMSA9IGNsYXNzIGV4dGVuZHMgZjUgewogIHN0YXRpYyB7CiAgICBfX25hbWUodGhpcywgIm8iKTsKICB9CiAgY29uc3RydWN0b3IoKSB7CiAgICBzdXBlciguLi5hcmd1bWVudHMpLCB0aGlzLl8kQ0sgPSBuZXcgczgodGhpcyksIHRoaXMuXyRDWCA9IG5ldyBpOCgpOwogIH0KICByZW5kZXIoaTEwLCBzOSkgewogICAgcmV0dXJuIEU7CiAgfQogIHVwZGF0ZShpMTAsIFtzOSwgcjEwXSkgewogICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQgfHwgdGhpcy5kaXNjb25uZWN0ZWQoKSwgczkgPT09IHRoaXMuXyRDSikgcmV0dXJuIEU7CiAgICB0aGlzLl8kQ0ogPSBzOTsKICAgIGxldCBuMTEgPSAwOwogICAgY29uc3QgeyBfJENLOiBvMTIsIF8kQ1g6IGg3IH0gPSB0aGlzOwogICAgcmV0dXJuIHQ3KHM5LCBhc3luYyAodDgpID0+IHsKICAgICAgZm9yICg7IGg3LmdldCgpOyApIGF3YWl0IGg3LmdldCgpOwogICAgICBjb25zdCBpMTEgPSBvMTIuZGVyZWYoKTsKICAgICAgaWYgKHZvaWQgMCAhPT0gaTExKSB7CiAgICAgICAgaWYgKGkxMS5fJENKICE9PSBzOSkgcmV0dXJuIGZhbHNlOwogICAgICAgIHZvaWQgMCAhPT0gcjEwICYmICh0OCA9IHIxMCh0OCwgbjExKSksIGkxMS5jb21taXRWYWx1ZSh0OCwgbjExKSwgbjExKys7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9KSwgRTsKICB9CiAgY29tbWl0VmFsdWUodDgsIGkxMCkgewogICAgdGhpcy5zZXRWYWx1ZSh0OCk7CiAgfQogIGRpc2Nvbm5lY3RlZCgpIHsKICAgIHRoaXMuXyRDSy5kaXNjb25uZWN0KCksIHRoaXMuXyRDWC5wYXVzZSgpOwogIH0KICByZWNvbm5lY3RlZCgpIHsKICAgIHRoaXMuXyRDSy5yZWNvbm5lY3QodGhpcyksIHRoaXMuXyRDWC5yZXN1bWUoKTsKICB9Cn07CnZhciBoNiA9IGU0KG8xMSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbGl0LWh0bWxAMy4zLjIvbm9kZV9tb2R1bGVzL2xpdC1odG1sL2RpcmVjdGl2ZXMvYXN5bmMtYXBwZW5kLmpzCnZhciBjOCA9IGU0KGNsYXNzIGV4dGVuZHMgbzExIHsKICBjb25zdHJ1Y3RvcihyMTApIHsKICAgIGlmIChzdXBlcihyMTApLCByMTAudHlwZSAhPT0gdDMuQ0hJTEQpIHRocm93IEVycm9yKCJhc3luY0FwcGVuZCBjYW4gb25seSBiZSB1c2VkIGluIGNoaWxkIGV4cHJlc3Npb25zIik7CiAgfQogIHVwZGF0ZShyMTAsIGUxMCkgewogICAgcmV0dXJuIHRoaXMuXyRDdHQgPSByMTAsIHN1cGVyLnVwZGF0ZShyMTAsIGUxMCk7CiAgfQogIGNvbW1pdFZhbHVlKHIxMCwgZTEwKSB7CiAgICAwID09PSBlMTAgJiYgajIodGhpcy5fJEN0dCk7CiAgICBjb25zdCBzOSA9IHYzKHRoaXMuXyRDdHQpOwogICAgdTQoczksIHIxMCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9saXQtaHRtbEAzLjMuMi9ub2RlX21vZHVsZXMvbGl0LWh0bWwvZGlyZWN0aXZlcy9rZXllZC5qcwp2YXIgaTkgPSBlNChjbGFzcyBleHRlbmRzIGk2IHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHN1cGVyKC4uLmFyZ3VtZW50cyksIHRoaXMua2V5ID0gQTsKICB9CiAgcmVuZGVyKHIxMCwgdDgpIHsKICAgIHJldHVybiB0aGlzLmtleSA9IHIxMCwgdDg7CiAgfQogIHVwZGF0ZShyMTAsIFt0OCwgZTEwXSkgewogICAgcmV0dXJuIHQ4ICE9PSB0aGlzLmtleSAmJiAocDUocjEwKSwgdGhpcy5rZXkgPSB0OCksIGUxMDsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2xpdC1odG1sQDMuMy4yL25vZGVfbW9kdWxlcy9saXQtaHRtbC9kaXJlY3RpdmVzL3JlcGVhdC5qcwp2YXIgdTUgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChlMTAsIHM5LCB0OCkgPT4gewogIGNvbnN0IHIxMCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgZm9yIChsZXQgbDUgPSBzOTsgbDUgPD0gdDg7IGw1KyspIHIxMC5zZXQoZTEwW2w1XSwgbDUpOwogIHJldHVybiByMTA7Cn0sICJ1IiksIGM5ID0gZTQoY2xhc3MgZXh0ZW5kcyBpNiB7CiAgY29uc3RydWN0b3IoZTEwKSB7CiAgICBpZiAoc3VwZXIoZTEwKSwgZTEwLnR5cGUgIT09IHQzLkNISUxEKSB0aHJvdyBFcnJvcigicmVwZWF0KCkgY2FuIG9ubHkgYmUgdXNlZCBpbiB0ZXh0IGV4cHJlc3Npb25zIik7CiAgfQogIGR0KGUxMCwgczksIHQ4KSB7CiAgICBsZXQgcjEwOwogICAgdm9pZCAwID09PSB0OCA/IHQ4ID0gczkgOiB2b2lkIDAgIT09IHM5ICYmIChyMTAgPSBzOSk7CiAgICBjb25zdCBsNSA9IFtdLCBvMTIgPSBbXTsKICAgIGxldCBpMTAgPSAwOwogICAgZm9yIChjb25zdCBzMTAgb2YgZTEwKSBsNVtpMTBdID0gcjEwID8gcjEwKHMxMCwgaTEwKSA6IGkxMCwgbzEyW2kxMF0gPSB0OChzMTAsIGkxMCksIGkxMCsrOwogICAgcmV0dXJuIHsgdmFsdWVzOiBvMTIsIGtleXM6IGw1IH07CiAgfQogIHJlbmRlcihlMTAsIHM5LCB0OCkgewogICAgcmV0dXJuIHRoaXMuZHQoZTEwLCBzOSwgdDgpLnZhbHVlczsKICB9CiAgdXBkYXRlKHM5LCBbdDgsIHIxMCwgYzEwXSkgewogICAgY29uc3QgZDQgPSBNMihzOSksIHsgdmFsdWVzOiBwNiwga2V5czogYTQgfSA9IHRoaXMuZHQodDgsIHIxMCwgYzEwKTsKICAgIGlmICghQXJyYXkuaXNBcnJheShkNCkpIHJldHVybiB0aGlzLnV0ID0gYTQsIHA2OwogICAgY29uc3QgaDcgPSB0aGlzLnV0ID8/PSBbXSwgdjQgPSBbXTsKICAgIGxldCBtNSwgeTMsIHgzID0gMCwgajMgPSBkNC5sZW5ndGggLSAxLCBrMyA9IDAsIHczID0gcDYubGVuZ3RoIC0gMTsKICAgIGZvciAoOyB4MyA8PSBqMyAmJiBrMyA8PSB3MzsgKSBpZiAobnVsbCA9PT0gZDRbeDNdKSB4MysrOwogICAgZWxzZSBpZiAobnVsbCA9PT0gZDRbajNdKSBqMy0tOwogICAgZWxzZSBpZiAoaDdbeDNdID09PSBhNFtrM10pIHY0W2szXSA9IHU0KGQ0W3gzXSwgcDZbazNdKSwgeDMrKywgazMrKzsKICAgIGVsc2UgaWYgKGg3W2ozXSA9PT0gYTRbdzNdKSB2NFt3M10gPSB1NChkNFtqM10sIHA2W3czXSksIGozLS0sIHczLS07CiAgICBlbHNlIGlmIChoN1t4M10gPT09IGE0W3czXSkgdjRbdzNdID0gdTQoZDRbeDNdLCBwNlt3M10pLCB2MyhzOSwgdjRbdzMgKyAxXSwgZDRbeDNdKSwgeDMrKywgdzMtLTsKICAgIGVsc2UgaWYgKGg3W2ozXSA9PT0gYTRbazNdKSB2NFtrM10gPSB1NChkNFtqM10sIHA2W2szXSksIHYzKHM5LCBkNFt4M10sIGQ0W2ozXSksIGozLS0sIGszKys7CiAgICBlbHNlIGlmICh2b2lkIDAgPT09IG01ICYmIChtNSA9IHU1KGE0LCBrMywgdzMpLCB5MyA9IHU1KGg3LCB4MywgajMpKSwgbTUuaGFzKGg3W3gzXSkpIGlmIChtNS5oYXMoaDdbajNdKSkgewogICAgICBjb25zdCBlMTAgPSB5My5nZXQoYTRbazNdKSwgdDkgPSB2b2lkIDAgIT09IGUxMCA/IGQ0W2UxMF0gOiBudWxsOwogICAgICBpZiAobnVsbCA9PT0gdDkpIHsKICAgICAgICBjb25zdCBlMTEgPSB2MyhzOSwgZDRbeDNdKTsKICAgICAgICB1NChlMTEsIHA2W2szXSksIHY0W2szXSA9IGUxMTsKICAgICAgfSBlbHNlIHY0W2szXSA9IHU0KHQ5LCBwNltrM10pLCB2MyhzOSwgZDRbeDNdLCB0OSksIGQ0W2UxMF0gPSBudWxsOwogICAgICBrMysrOwogICAgfSBlbHNlIGgzKGQ0W2ozXSksIGozLS07CiAgICBlbHNlIGgzKGQ0W3gzXSksIHgzKys7CiAgICBmb3IgKDsgazMgPD0gdzM7ICkgewogICAgICBjb25zdCBlMTAgPSB2MyhzOSwgdjRbdzMgKyAxXSk7CiAgICAgIHU0KGUxMCwgcDZbazNdKSwgdjRbazMrK10gPSBlMTA7CiAgICB9CiAgICBmb3IgKDsgeDMgPD0gajM7ICkgewogICAgICBjb25zdCBlMTAgPSBkNFt4MysrXTsKICAgICAgbnVsbCAhPT0gZTEwICYmIGgzKGUxMCk7CiAgICB9CiAgICByZXR1cm4gdGhpcy51dCA9IGE0LCBwNShzOSwgdjQpLCBFOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1lbGVtZW50QDIuMi4zL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWVsZW1lbnQvZGlzdF90cy9pbmRleC5qcwp2YXIgY3NzTWFuYWdlciA9IENzc01hbmFnZXIuZ2V0U2luZ2xldG9uKCk7CgovLyB0c19kZWJ1Z3VpL3NtYXJ0ZGItZGVidWd1aS50cwp2YXIgX29wbG9nRmlsdGVyX2RlYywgX3JldmVydEluUHJvZ3Jlc3NfZGVjLCBfcmV2ZXJ0UHJldmlld19kZWMsIF9yZXZlcnRUYXJnZXRTZXFfZGVjLCBfZXhwYW5kZWRPcGxvZ1NlcXNfZGVjLCBfZG9jdW1lbnRzVG90YWxfZGVjLCBfZG9jdW1lbnRzX2RlYywgX3NlbGVjdGVkQ29sbGVjdGlvbl9kZWMsIF9jb2xsZWN0aW9uc19kZWMsIF9vcGxvZ0VudHJpZXNfZGVjLCBfb3Bsb2dTdGF0c19kZWMsIF9tZXRyaWNzX2RlYywgX2FjdGl2ZVRhYl9kZWMsIF9yZWZyZXNoSW50ZXJ2YWxfZGVjLCBfYXBpQmFzZVVybF9kZWMsIF9zZXJ2ZXJfZGVjLCBfYSwgX1NtYXJ0ZGJEZWJ1Z1VpX2RlY29yYXRvcnMsIF9pbml0LCBfc2VydmVyLCBfYXBpQmFzZVVybCwgX3JlZnJlc2hJbnRlcnZhbCwgX2FjdGl2ZVRhYiwgX21ldHJpY3MsIF9vcGxvZ1N0YXRzLCBfb3Bsb2dFbnRyaWVzLCBfY29sbGVjdGlvbnMsIF9zZWxlY3RlZENvbGxlY3Rpb24sIF9kb2N1bWVudHMsIF9kb2N1bWVudHNUb3RhbCwgX2V4cGFuZGVkT3Bsb2dTZXFzLCBfcmV2ZXJ0VGFyZ2V0U2VxLCBfcmV2ZXJ0UHJldmlldywgX3JldmVydEluUHJvZ3Jlc3MsIF9vcGxvZ0ZpbHRlcjsKX1NtYXJ0ZGJEZWJ1Z1VpX2RlY29yYXRvcnMgPSBbY3VzdG9tRWxlbWVudCgic21hcnRkYi1kZWJ1Z3VpIildOwp2YXIgX1NtYXJ0ZGJEZWJ1Z1VpID0gY2xhc3MgX1NtYXJ0ZGJEZWJ1Z1VpIGV4dGVuZHMgKF9hID0gRGVlc0VsZW1lbnQsIF9zZXJ2ZXJfZGVjID0gW241KHsgdHlwZTogT2JqZWN0IH0pXSwgX2FwaUJhc2VVcmxfZGVjID0gW241KHsgdHlwZTogU3RyaW5nIH0pXSwgX3JlZnJlc2hJbnRlcnZhbF9kZWMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldLCBfYWN0aXZlVGFiX2RlYyA9IFtyNSgpXSwgX21ldHJpY3NfZGVjID0gW3I1KCldLCBfb3Bsb2dTdGF0c19kZWMgPSBbcjUoKV0sIF9vcGxvZ0VudHJpZXNfZGVjID0gW3I1KCldLCBfY29sbGVjdGlvbnNfZGVjID0gW3I1KCldLCBfc2VsZWN0ZWRDb2xsZWN0aW9uX2RlYyA9IFtyNSgpXSwgX2RvY3VtZW50c19kZWMgPSBbcjUoKV0sIF9kb2N1bWVudHNUb3RhbF9kZWMgPSBbcjUoKV0sIF9leHBhbmRlZE9wbG9nU2Vxc19kZWMgPSBbcjUoKV0sIF9yZXZlcnRUYXJnZXRTZXFfZGVjID0gW3I1KCldLCBfcmV2ZXJ0UHJldmlld19kZWMgPSBbcjUoKV0sIF9yZXZlcnRJblByb2dyZXNzX2RlYyA9IFtyNSgpXSwgX29wbG9nRmlsdGVyX2RlYyA9IFtyNSgpXSwgX2EpIHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX3NlcnZlciwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDgsIHRoaXMsIG51bGwpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDExLCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfYXBpQmFzZVVybCwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDEyLCB0aGlzLCBudWxsKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCAxNSwgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX3JlZnJlc2hJbnRlcnZhbCwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDE2LCB0aGlzLCAyZTMpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDE5LCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfYWN0aXZlVGFiLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgMjAsIHRoaXMsICJkYXNoYm9hcmQiKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCAyMywgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX21ldHJpY3MsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCAyNCwgdGhpcywgbnVsbCkpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgMjcsIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9vcGxvZ1N0YXRzLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgMjgsIHRoaXMsIG51bGwpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDMxLCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfb3Bsb2dFbnRyaWVzLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgMzIsIHRoaXMsIFtdKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCAzNSwgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX2NvbGxlY3Rpb25zLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgMzYsIHRoaXMsIFtdKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCAzOSwgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX3NlbGVjdGVkQ29sbGVjdGlvbiwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDQwLCB0aGlzLCBudWxsKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCA0MywgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX2RvY3VtZW50cywgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDQ0LCB0aGlzLCBbXSkpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgNDcsIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9kb2N1bWVudHNUb3RhbCwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDQ4LCB0aGlzLCAwKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCA1MSwgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX2V4cGFuZGVkT3Bsb2dTZXFzLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgNTIsIHRoaXMsIC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCkpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDU1LCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfcmV2ZXJ0VGFyZ2V0U2VxLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgNTYsIHRoaXMsIDApKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDU5LCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfcmV2ZXJ0UHJldmlldywgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDYwLCB0aGlzLCBudWxsKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCA2MywgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX3JldmVydEluUHJvZ3Jlc3MsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCA2NCwgdGhpcywgZmFsc2UpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDY3LCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfb3Bsb2dGaWx0ZXIsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCA2OCwgdGhpcywge30pKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDcxLCB0aGlzKTsKICAgIF9fcHVibGljRmllbGQodGhpcywgInJlZnJlc2hUaW1lciIpOwogIH0KICBhc3luYyBjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgIGF3YWl0IHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7CiAgICBpZiAoIXRoaXMuc2VydmVyICYmIHRoaXMuYXBpQmFzZVVybCA9PT0gbnVsbCkgewogICAgICB0aGlzLmFwaUJhc2VVcmwgPSAiIjsKICAgIH0KICAgIHRoaXMuc3RhcnRSZWZyZXNoaW5nKCk7CiAgfQogIGFzeW5jIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgYXdhaXQgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgIHRoaXMuc3RvcFJlZnJlc2hpbmcoKTsKICB9CiAgc3RhcnRSZWZyZXNoaW5nKCkgewogICAgaWYgKHRoaXMucmVmcmVzaFRpbWVyKSBjbGVhckludGVydmFsKHRoaXMucmVmcmVzaFRpbWVyKTsKICAgIHRoaXMucmVmcmVzaCgpOwogICAgdGhpcy5yZWZyZXNoVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLnJlZnJlc2goKSwgdGhpcy5yZWZyZXNoSW50ZXJ2YWwpOwogIH0KICBzdG9wUmVmcmVzaGluZygpIHsKICAgIGlmICh0aGlzLnJlZnJlc2hUaW1lcikgewogICAgICBjbGVhckludGVydmFsKHRoaXMucmVmcmVzaFRpbWVyKTsKICAgICAgdGhpcy5yZWZyZXNoVGltZXIgPSBudWxsOwogICAgfQogIH0KICAvLyAtLS0gRGF0YSBhY2Nlc3MgbGF5ZXIgKHN1cHBvcnRzIGJvdGggZGlyZWN0IHNlcnZlciBjYWxscyBhbmQgSFRUUCBmZXRjaCkgLS0tCiAgZ2V0IHVzZUh0dHAoKSB7CiAgICByZXR1cm4gdGhpcy5hcGlCYXNlVXJsICE9PSBudWxsOwogIH0KICBhc3luYyBhcGlGZXRjaChwYXRoMiwgcGFyYW1zID0ge30pIHsKICAgIGNvbnN0IGJhc2UgPSB0aGlzLmFwaUJhc2VVcmwgPz8gIiI7CiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKGAke2Jhc2V9L2FwaS9zbWFydGRiJHtwYXRoMn1gLCB3aW5kb3cubG9jYXRpb24ub3JpZ2luKTsKICAgIGZvciAoY29uc3QgW2szLCB2NF0gb2YgT2JqZWN0LmVudHJpZXMocGFyYW1zKSkgewogICAgICBpZiAodjQgIT09IHZvaWQgMCAmJiB2NCAhPT0gbnVsbCkgdXJsLnNlYXJjaFBhcmFtcy5zZXQoazMsIFN0cmluZyh2NCkpOwogICAgfQogICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsLnRvU3RyaW5nKCkpOwogICAgaWYgKCFyZXMub2spIHRocm93IG5ldyBFcnJvcihgSFRUUCAke3Jlcy5zdGF0dXN9YCk7CiAgICByZXR1cm4gcmVzLmpzb24oKTsKICB9CiAgYXN5bmMgcmVmcmVzaCgpIHsKICAgIGlmICghdGhpcy51c2VIdHRwICYmICF0aGlzLnNlcnZlcj8ucnVubmluZykgewogICAgICB0aGlzLm1ldHJpY3MgPSBudWxsOwogICAgICB0aGlzLm9wbG9nU3RhdHMgPSBudWxsOwogICAgICByZXR1cm47CiAgICB9CiAgICB0cnkgewogICAgICBpZiAodGhpcy51c2VIdHRwKSB7CiAgICAgICAgY29uc3QgW21ldHJpY3MsIG9wbG9nU3RhdHNdID0gYXdhaXQgUHJvbWlzZS5hbGwoWwogICAgICAgICAgdGhpcy5hcGlGZXRjaCgiL21ldHJpY3MiKSwKICAgICAgICAgIHRoaXMuYXBpRmV0Y2goIi9vcGxvZy9zdGF0cyIpCiAgICAgICAgXSk7CiAgICAgICAgdGhpcy5tZXRyaWNzID0gbWV0cmljczsKICAgICAgICB0aGlzLm9wbG9nU3RhdHMgPSBvcGxvZ1N0YXRzOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IFttZXRyaWNzLCBvcGxvZ1N0YXRzXSA9IGF3YWl0IFByb21pc2UuYWxsKFsKICAgICAgICAgIHRoaXMuc2VydmVyLmdldE1ldHJpY3MoKSwKICAgICAgICAgIHRoaXMuc2VydmVyLmdldE9wTG9nU3RhdHMoKQogICAgICAgIF0pOwogICAgICAgIHRoaXMubWV0cmljcyA9IG1ldHJpY3M7CiAgICAgICAgdGhpcy5vcGxvZ1N0YXRzID0gb3Bsb2dTdGF0czsKICAgICAgfQogICAgICBpZiAodGhpcy5hY3RpdmVUYWIgPT09ICJjb2xsZWN0aW9ucyIgJiYgdGhpcy5jb2xsZWN0aW9ucy5sZW5ndGggPT09IDApIHsKICAgICAgICBhd2FpdCB0aGlzLmxvYWRDb2xsZWN0aW9ucygpOwogICAgICB9CiAgICAgIGlmICh0aGlzLmFjdGl2ZVRhYiA9PT0gIm9wbG9nIiB8fCB0aGlzLmFjdGl2ZVRhYiA9PT0gInJldmVydCIpIHsKICAgICAgICBhd2FpdCB0aGlzLmxvYWRPcGxvZygpOwogICAgICB9CiAgICB9IGNhdGNoIHsKICAgIH0KICB9CiAgYXN5bmMgbG9hZE9wbG9nKCkgewogICAgaWYgKCF0aGlzLnVzZUh0dHAgJiYgIXRoaXMuc2VydmVyPy5ydW5uaW5nKSByZXR1cm47CiAgICBpZiAodGhpcy51c2VIdHRwKSB7CiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXBpRmV0Y2goIi9vcGxvZyIsIHsgbGltaXQ6IDIwMCB9KTsKICAgICAgdGhpcy5vcGxvZ0VudHJpZXMgPSByZXN1bHQuZW50cmllczsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2VydmVyLmdldE9wTG9nKHsgbGltaXQ6IDIwMCB9KTsKICAgICAgdGhpcy5vcGxvZ0VudHJpZXMgPSByZXN1bHQuZW50cmllczsKICAgIH0KICB9CiAgYXN5bmMgbG9hZENvbGxlY3Rpb25zKCkgewogICAgaWYgKCF0aGlzLnVzZUh0dHAgJiYgIXRoaXMuc2VydmVyPy5ydW5uaW5nKSByZXR1cm47CiAgICBpZiAodGhpcy51c2VIdHRwKSB7CiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXBpRmV0Y2goIi9jb2xsZWN0aW9ucyIpOwogICAgICB0aGlzLmNvbGxlY3Rpb25zID0gcmVzdWx0LmNvbGxlY3Rpb25zOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5jb2xsZWN0aW9ucyA9IGF3YWl0IHRoaXMuc2VydmVyLmdldENvbGxlY3Rpb25zKCk7CiAgICB9CiAgfQogIGFzeW5jIHNlbGVjdENvbGxlY3Rpb24oZGIsIG5hbWUpIHsKICAgIHRoaXMuc2VsZWN0ZWRDb2xsZWN0aW9uID0geyBkYiwgbmFtZSB9OwogICAgaWYgKHRoaXMudXNlSHR0cCkgewogICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFwaUZldGNoKAogICAgICAgICIvZG9jdW1lbnRzIiwKICAgICAgICB7IGRiLCBjb2xsZWN0aW9uOiBuYW1lLCBsaW1pdDogNTAsIHNraXA6IDAgfQogICAgICApOwogICAgICB0aGlzLmRvY3VtZW50cyA9IHJlc3VsdC5kb2N1bWVudHM7CiAgICAgIHRoaXMuZG9jdW1lbnRzVG90YWwgPSByZXN1bHQudG90YWw7CiAgICB9IGVsc2UgewogICAgICBpZiAoIXRoaXMuc2VydmVyPy5ydW5uaW5nKSByZXR1cm47CiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2VydmVyLmdldERvY3VtZW50cyhkYiwgbmFtZSwgNTAsIDApOwogICAgICB0aGlzLmRvY3VtZW50cyA9IHJlc3VsdC5kb2N1bWVudHM7CiAgICAgIHRoaXMuZG9jdW1lbnRzVG90YWwgPSByZXN1bHQudG90YWw7CiAgICB9CiAgfQogIHRvZ2dsZU9wbG9nRW50cnkoc2VxKSB7CiAgICBjb25zdCBuZXh0MiA9IG5ldyBTZXQodGhpcy5leHBhbmRlZE9wbG9nU2Vxcyk7CiAgICBpZiAobmV4dDIuaGFzKHNlcSkpIHsKICAgICAgbmV4dDIuZGVsZXRlKHNlcSk7CiAgICB9IGVsc2UgewogICAgICBuZXh0Mi5hZGQoc2VxKTsKICAgIH0KICAgIHRoaXMuZXhwYW5kZWRPcGxvZ1NlcXMgPSBuZXh0MjsKICB9CiAgYXN5bmMgaGFuZGxlUHJldmlld1JldmVydCgpIHsKICAgIGlmICh0aGlzLnJldmVydFRhcmdldFNlcSA8PSAwKSByZXR1cm47CiAgICBpZiAodGhpcy51c2VIdHRwKSB7CiAgICAgIHRoaXMucmV2ZXJ0UHJldmlldyA9IGF3YWl0IHRoaXMuYXBpRmV0Y2goCiAgICAgICAgIi9yZXZlcnQiLAogICAgICAgIHsgc2VxOiB0aGlzLnJldmVydFRhcmdldFNlcSwgZHJ5UnVuOiB0cnVlIH0KICAgICAgKTsKICAgIH0gZWxzZSB7CiAgICAgIGlmICghdGhpcy5zZXJ2ZXI/LnJ1bm5pbmcpIHJldHVybjsKICAgICAgdGhpcy5yZXZlcnRQcmV2aWV3ID0gYXdhaXQgdGhpcy5zZXJ2ZXIucmV2ZXJ0VG9TZXEodGhpcy5yZXZlcnRUYXJnZXRTZXEsIHRydWUpOwogICAgfQogIH0KICBhc3luYyBoYW5kbGVFeGVjdXRlUmV2ZXJ0KCkgewogICAgaWYgKHRoaXMucmV2ZXJ0VGFyZ2V0U2VxIDw9IDApIHJldHVybjsKICAgIHRoaXMucmV2ZXJ0SW5Qcm9ncmVzcyA9IHRydWU7CiAgICB0cnkgewogICAgICBpZiAodGhpcy51c2VIdHRwKSB7CiAgICAgICAgYXdhaXQgdGhpcy5hcGlGZXRjaCgiL3JldmVydCIsIHsgc2VxOiB0aGlzLnJldmVydFRhcmdldFNlcSwgZHJ5UnVuOiBmYWxzZSB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoIXRoaXMuc2VydmVyPy5ydW5uaW5nKSByZXR1cm47CiAgICAgICAgYXdhaXQgdGhpcy5zZXJ2ZXIucmV2ZXJ0VG9TZXEodGhpcy5yZXZlcnRUYXJnZXRTZXEsIGZhbHNlKTsKICAgICAgfQogICAgICB0aGlzLnJldmVydFByZXZpZXcgPSBudWxsOwogICAgICB0aGlzLnJldmVydFRhcmdldFNlcSA9IDA7CiAgICAgIGF3YWl0IHRoaXMucmVmcmVzaCgpOwogICAgfSBmaW5hbGx5IHsKICAgICAgdGhpcy5yZXZlcnRJblByb2dyZXNzID0gZmFsc2U7CiAgICB9CiAgfQogIGFzeW5jIHN3aXRjaFRhYih0YWIyKSB7CiAgICB0aGlzLmFjdGl2ZVRhYiA9IHRhYjI7CiAgICBpZiAodGFiMiA9PT0gImNvbGxlY3Rpb25zIikgewogICAgICBhd2FpdCB0aGlzLmxvYWRDb2xsZWN0aW9ucygpOwogICAgfQogICAgaWYgKHRhYjIgPT09ICJvcGxvZyIgfHwgdGFiMiA9PT0gInJldmVydCIpIHsKICAgICAgYXdhaXQgdGhpcy5sb2FkT3Bsb2coKTsKICAgIH0KICB9CiAgLy8gLS0tIERpZmYgY29tcHV0YXRpb24gLS0tCiAgY29tcHV0ZURpZmYocHJldiwgbmV4dDIpIHsKICAgIGNvbnN0IGRpZmZzID0gW107CiAgICB0aGlzLmRpZmZSZWN1cnNpdmUocHJldiB8fCB7fSwgbmV4dDIgfHwge30sICIiLCBkaWZmcyk7CiAgICByZXR1cm4gZGlmZnM7CiAgfQogIGRpZmZSZWN1cnNpdmUoYTQsIGI0LCBwYXRoMiwgZGlmZnMpIHsKICAgIGNvbnN0IGFLZXlzID0gbmV3IFNldChhNCAmJiB0eXBlb2YgYTQgPT09ICJvYmplY3QiID8gT2JqZWN0LmtleXMoYTQpIDogW10pOwogICAgY29uc3QgYktleXMgPSBuZXcgU2V0KGI0ICYmIHR5cGVvZiBiNCA9PT0gIm9iamVjdCIgPyBPYmplY3Qua2V5cyhiNCkgOiBbXSk7CiAgICBjb25zdCBhbGxLZXlzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoWy4uLmFLZXlzLCAuLi5iS2V5c10pOwogICAgZm9yIChjb25zdCBrZXkyIG9mIGFsbEtleXMpIHsKICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoMiA/IGAke3BhdGgyfS4ke2tleTJ9YCA6IGtleTI7CiAgICAgIGNvbnN0IGluQSA9IGFLZXlzLmhhcyhrZXkyKTsKICAgICAgY29uc3QgaW5CID0gYktleXMuaGFzKGtleTIpOwogICAgICBpZiAoIWluQSAmJiBpbkIpIHsKICAgICAgICBkaWZmcy5wdXNoKHsgcGF0aDogZnVsbFBhdGgsIHR5cGU6ICJhZGRlZCIsIG5ld1ZhbHVlOiBiNFtrZXkyXSB9KTsKICAgICAgfSBlbHNlIGlmIChpbkEgJiYgIWluQikgewogICAgICAgIGRpZmZzLnB1c2goeyBwYXRoOiBmdWxsUGF0aCwgdHlwZTogInJlbW92ZWQiLCBvbGRWYWx1ZTogYTRba2V5Ml0gfSk7CiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGE0W2tleTJdID09PSAib2JqZWN0IiAmJiBhNFtrZXkyXSAhPT0gbnVsbCAmJiB0eXBlb2YgYjRba2V5Ml0gPT09ICJvYmplY3QiICYmIGI0W2tleTJdICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KGE0W2tleTJdKSAmJiAhQXJyYXkuaXNBcnJheShiNFtrZXkyXSkpIHsKICAgICAgICB0aGlzLmRpZmZSZWN1cnNpdmUoYTRba2V5Ml0sIGI0W2tleTJdLCBmdWxsUGF0aCwgZGlmZnMpOwogICAgICB9IGVsc2UgaWYgKEpTT04uc3RyaW5naWZ5KGE0W2tleTJdKSAhPT0gSlNPTi5zdHJpbmdpZnkoYjRba2V5Ml0pKSB7CiAgICAgICAgZGlmZnMucHVzaCh7CiAgICAgICAgICBwYXRoOiBmdWxsUGF0aCwKICAgICAgICAgIHR5cGU6ICJjaGFuZ2VkIiwKICAgICAgICAgIG9sZFZhbHVlOiBhNFtrZXkyXSwKICAgICAgICAgIG5ld1ZhbHVlOiBiNFtrZXkyXQogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgfQogIGZvcm1hdFZhbHVlKHZhbCkgewogICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHZvaWQgMCkgcmV0dXJuICJudWxsIjsKICAgIGlmICh0eXBlb2YgdmFsID09PSAic3RyaW5nIikgcmV0dXJuIGAiJHt2YWx9ImA7CiAgICBpZiAodHlwZW9mIHZhbCA9PT0gIm9iamVjdCIpIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWwpOwogICAgcmV0dXJuIFN0cmluZyh2YWwpOwogIH0KICBmb3JtYXRUaW1lKHRpbWVzdGFtcE1zKSB7CiAgICByZXR1cm4gbmV3IERhdGUodGltZXN0YW1wTXMpLnRvTG9jYWxlVGltZVN0cmluZyh2b2lkIDAsIHsKICAgICAgaG91cjogIjItZGlnaXQiLAogICAgICBtaW51dGU6ICIyLWRpZ2l0IiwKICAgICAgc2Vjb25kOiAiMi1kaWdpdCIsCiAgICAgIGZyYWN0aW9uYWxTZWNvbmREaWdpdHM6IDMKICAgIH0pOwogIH0KICAvLyAtLS0gUmVuZGVyIC0tLQogIHJlbmRlcigpIHsKICAgIGNvbnN0IGlzT25saW5lID0gdGhpcy51c2VIdHRwID8gdGhpcy5tZXRyaWNzICE9PSBudWxsIDogdGhpcy5zZXJ2ZXI/LnJ1bm5pbmcgPz8gZmFsc2U7CiAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9ImRlYnVndWkiPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkZXItbGVmdCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj5TbWFydERCIERlYnVnPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN0YXR1cy1kb3QgJHtpc09ubGluZSA/ICIiIDogIm9mZmxpbmUifSI+PC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0idGFicyI+CiAgICAgICAgICAke1siZGFzaGJvYXJkIiwgImNvbGxlY3Rpb25zIiwgIm9wbG9nIiwgInJldmVydCJdLm1hcCgKICAgICAgKHRhYjIpID0+IGIyYAogICAgICAgICAgICAgIDxidXR0b24KICAgICAgICAgICAgICAgIGNsYXNzPSJ0YWIgJHt0aGlzLmFjdGl2ZVRhYiA9PT0gdGFiMiA/ICJhY3RpdmUiIDogIiJ9IgogICAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5zd2l0Y2hUYWIodGFiMil9CiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgJHt0YWIyID09PSAiZGFzaGJvYXJkIiA/ICJEYXNoYm9hcmQiIDogdGFiMiA9PT0gImNvbGxlY3Rpb25zIiA/ICJDb2xsZWN0aW9ucyIgOiB0YWIyID09PSAib3Bsb2ciID8gIk9wTG9nIiA6ICJSZXZlcnQifQogICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICBgCiAgICApfQogICAgICAgIDwvZGl2PgoKICAgICAgICAke3RoaXMuYWN0aXZlVGFiID09PSAiZGFzaGJvYXJkIiA/IHRoaXMucmVuZGVyRGFzaGJvYXJkKCkgOiAiIn0KICAgICAgICAke3RoaXMuYWN0aXZlVGFiID09PSAiY29sbGVjdGlvbnMiID8gdGhpcy5yZW5kZXJDb2xsZWN0aW9ucygpIDogIiJ9CiAgICAgICAgJHt0aGlzLmFjdGl2ZVRhYiA9PT0gIm9wbG9nIiA/IHRoaXMucmVuZGVyT3Bsb2coKSA6ICIifQogICAgICAgICR7dGhpcy5hY3RpdmVUYWIgPT09ICJyZXZlcnQiID8gdGhpcy5yZW5kZXJSZXZlcnQoKSA6ICIifQogICAgICA8L2Rpdj4KICAgIGA7CiAgfQogIHJlbmRlckRhc2hib2FyZCgpIHsKICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0ic3RhdHMtZ3JpZCI+CiAgICAgICAgPGRpdiBjbGFzcz0ic3RhdC1jYXJkIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InN0YXQtbGFiZWwiPkRhdGFiYXNlczwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ic3RhdC12YWx1ZSI+JHt0aGlzLm1ldHJpY3M/LmRhdGFiYXNlcyA/PyAiLSJ9PC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic3RhdC1jYXJkIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InN0YXQtbGFiZWwiPkNvbGxlY3Rpb25zPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGF0LXZhbHVlIj4ke3RoaXMubWV0cmljcz8uY29sbGVjdGlvbnMgPz8gIi0ifTwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InN0YXQtY2FyZCI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGF0LWxhYmVsIj5PcExvZyBFbnRyaWVzPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGF0LXZhbHVlIj4ke3RoaXMub3Bsb2dTdGF0cz8udG90YWxFbnRyaWVzID8/ICItIn08L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzdGF0LWNhcmQiPgogICAgICAgICAgPGRpdiBjbGFzcz0ic3RhdC1sYWJlbCI+Q3VycmVudCBTZXE8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InN0YXQtdmFsdWUiPiR7dGhpcy5vcGxvZ1N0YXRzPy5jdXJyZW50U2VxID8/ICItIn08L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzdGF0LWNhcmQiPgogICAgICAgICAgPGRpdiBjbGFzcz0ic3RhdC1sYWJlbCI+VXB0aW1lPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGF0LXZhbHVlIj4KICAgICAgICAgICAgJHt0aGlzLm1ldHJpY3MgPyB0aGlzLmZvcm1hdFVwdGltZSh0aGlzLm1ldHJpY3MudXB0aW1lU2Vjb25kcykgOiAiLSJ9CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CgogICAgICAke3RoaXMub3Bsb2dTdGF0cyA/IGIyYAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkLXRpdGxlIj5PcGVyYXRpb25zIEJyZWFrZG93bjwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN0YXRzLWdyaWQiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3RhdC1jYXJkIj4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3RhdC1sYWJlbCI+SW5zZXJ0czwvZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGF0LXZhbHVlIiBzdHlsZT0iY29sb3I6ICMyMmM1NWUiPgogICAgICAgICAgICAgICAgICAgICR7dGhpcy5vcGxvZ1N0YXRzLmVudHJpZXNCeU9wLmluc2VydH0KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN0YXQtY2FyZCI+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN0YXQtbGFiZWwiPlVwZGF0ZXM8L2Rpdj4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3RhdC12YWx1ZSIgc3R5bGU9ImNvbG9yOiAjM2I4MmY2Ij4KICAgICAgICAgICAgICAgICAgICAke3RoaXMub3Bsb2dTdGF0cy5lbnRyaWVzQnlPcC51cGRhdGV9CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGF0LWNhcmQiPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGF0LWxhYmVsIj5EZWxldGVzPC9kaXY+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN0YXQtdmFsdWUiIHN0eWxlPSJjb2xvcjogI2VmNDQ0NCI+CiAgICAgICAgICAgICAgICAgICAgJHt0aGlzLm9wbG9nU3RhdHMuZW50cmllc0J5T3AuZGVsZXRlfQogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIGAgOiAiIn0KICAgIGA7CiAgfQogIGZvcm1hdFVwdGltZShzZWNzKSB7CiAgICBpZiAoc2VjcyA8IDYwKSByZXR1cm4gYCR7c2Vjc31zYDsKICAgIGlmIChzZWNzIDwgMzYwMCkgcmV0dXJuIGAke01hdGguZmxvb3Ioc2VjcyAvIDYwKX1tYDsKICAgIHJldHVybiBgJHtNYXRoLmZsb29yKHNlY3MgLyAzNjAwKX1oICR7TWF0aC5mbG9vcihzZWNzICUgMzYwMCAvIDYwKX1tYDsKICB9CiAgcmVuZGVyQ29sbGVjdGlvbnMoKSB7CiAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9ImNvbGxlY3Rpb25zLWxheW91dCI+CiAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1zaWRlYmFyIj4KICAgICAgICAgICR7dGhpcy5jb2xsZWN0aW9ucy5sZW5ndGggPT09IDAgPyBiMmA8ZGl2IGNsYXNzPSJlbXB0eS1zdGF0ZSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJlbXB0eS1zdGF0ZS10ZXh0Ij5ObyBjb2xsZWN0aW9uczwvZGl2PgogICAgICAgICAgICAgIDwvZGl2PmAgOiB0aGlzLmNvbGxlY3Rpb25zLm1hcCgKICAgICAgKGMxMCkgPT4gYjJgCiAgICAgICAgICAgICAgICAgIDxkaXYKICAgICAgICAgICAgICAgICAgICBjbGFzcz0iY29sbC1pdGVtICR7dGhpcy5zZWxlY3RlZENvbGxlY3Rpb24/LmRiID09PSBjMTAuZGIgJiYgdGhpcy5zZWxlY3RlZENvbGxlY3Rpb24/Lm5hbWUgPT09IGMxMC5uYW1lID8gInNlbGVjdGVkIiA6ICIifSIKICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLnNlbGVjdENvbGxlY3Rpb24oYzEwLmRiLCBjMTAubmFtZSl9CiAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLW5hbWUiPiR7YzEwLmRifS4ke2MxMC5uYW1lfTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtY291bnQiPiR7YzEwLmNvdW50fSBkb2N1bWVudHM8L2Rpdj4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICBgCiAgICApfQogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJkb2Mtdmlld2VyIj4KICAgICAgICAgICR7dGhpcy5zZWxlY3RlZENvbGxlY3Rpb24gPyBiMmAKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQtdGl0bGUiPgogICAgICAgICAgICAgICAgICAke3RoaXMuc2VsZWN0ZWRDb2xsZWN0aW9uLmRifS4ke3RoaXMuc2VsZWN0ZWRDb2xsZWN0aW9uLm5hbWV9CiAgICAgICAgICAgICAgICAgICgke3RoaXMuZG9jdW1lbnRzVG90YWx9IHRvdGFsKQogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAke3RoaXMuZG9jdW1lbnRzLmxlbmd0aCA9PT0gMCA/IGIyYDxkaXYgY2xhc3M9ImVtcHR5LXN0YXRlIj4KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImVtcHR5LXN0YXRlLXRleHQiPk5vIGRvY3VtZW50czwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PmAgOiB0aGlzLmRvY3VtZW50cy5tYXAoCiAgICAgIChkb2MpID0+IGIyYAogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkb2MtaXRlbSI+JHtKU09OLnN0cmluZ2lmeShkb2MsIG51bGwsIDIpfTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgYAogICAgKX0KICAgICAgICAgICAgICBgIDogYjJgPGRpdiBjbGFzcz0iZW1wdHktc3RhdGUiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZW1wdHktc3RhdGUtdGV4dCI+U2VsZWN0IGEgY29sbGVjdGlvbjwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZW1wdHktc3RhdGUtc3ViIj4KICAgICAgICAgICAgICAgICAgQ2hvb3NlIGEgY29sbGVjdGlvbiBmcm9tIHRoZSBzaWRlYmFyIHRvIGJyb3dzZSBpdHMgZG9jdW1lbnRzCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L2Rpdj5gfQogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgfQogIHJlbmRlck9wbG9nKCkgewogICAgY29uc3QgZmlsdGVyZWQgPSB0aGlzLmdldEZpbHRlcmVkT3Bsb2coKTsKICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0ib3Bsb2ctZmlsdGVycyI+CiAgICAgICAgPGJ1dHRvbgogICAgICAgICAgY2xhc3M9ImZpbHRlci1jaGlwICR7IXRoaXMub3Bsb2dGaWx0ZXIub3AgPyAiYWN0aXZlIiA6ICIifSIKICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMub3Bsb2dGaWx0ZXIgPSB7IC4uLnRoaXMub3Bsb2dGaWx0ZXIsIG9wOiB2b2lkIDAgfX0KICAgICAgICA+CiAgICAgICAgICBBbGwKICAgICAgICA8L2J1dHRvbj4KICAgICAgICA8YnV0dG9uCiAgICAgICAgICBjbGFzcz0iZmlsdGVyLWNoaXAgJHt0aGlzLm9wbG9nRmlsdGVyLm9wID09PSAiaW5zZXJ0IiA/ICJhY3RpdmUiIDogIiJ9IgogICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5vcGxvZ0ZpbHRlciA9IHsgLi4udGhpcy5vcGxvZ0ZpbHRlciwgb3A6ICJpbnNlcnQiIH19CiAgICAgICAgPgogICAgICAgICAgSW5zZXJ0cwogICAgICAgIDwvYnV0dG9uPgogICAgICAgIDxidXR0b24KICAgICAgICAgIGNsYXNzPSJmaWx0ZXItY2hpcCAke3RoaXMub3Bsb2dGaWx0ZXIub3AgPT09ICJ1cGRhdGUiID8gImFjdGl2ZSIgOiAiIn0iCiAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLm9wbG9nRmlsdGVyID0geyAuLi50aGlzLm9wbG9nRmlsdGVyLCBvcDogInVwZGF0ZSIgfX0KICAgICAgICA+CiAgICAgICAgICBVcGRhdGVzCiAgICAgICAgPC9idXR0b24+CiAgICAgICAgPGJ1dHRvbgogICAgICAgICAgY2xhc3M9ImZpbHRlci1jaGlwICR7dGhpcy5vcGxvZ0ZpbHRlci5vcCA9PT0gImRlbGV0ZSIgPyAiYWN0aXZlIiA6ICIifSIKICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMub3Bsb2dGaWx0ZXIgPSB7IC4uLnRoaXMub3Bsb2dGaWx0ZXIsIG9wOiAiZGVsZXRlIiB9fQogICAgICAgID4KICAgICAgICAgIERlbGV0ZXMKICAgICAgICA8L2J1dHRvbj4KICAgICAgPC9kaXY+CgogICAgICAke2ZpbHRlcmVkLmxlbmd0aCA9PT0gMCA/IGIyYDxkaXYgY2xhc3M9ImVtcHR5LXN0YXRlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZW1wdHktc3RhdGUtdGV4dCI+Tm8gb3Bsb2cgZW50cmllczwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJlbXB0eS1zdGF0ZS1zdWIiPldyaXRlIG9wZXJhdGlvbnMgd2lsbCBhcHBlYXIgaGVyZSBhcyB0aGV5IG9jY3VyPC9kaXY+CiAgICAgICAgICA8L2Rpdj5gIDogWy4uLmZpbHRlcmVkXS5yZXZlcnNlKCkubWFwKChlbnRyeSkgPT4gdGhpcy5yZW5kZXJPcGxvZ0VudHJ5KGVudHJ5KSl9CiAgICBgOwogIH0KICBnZXRGaWx0ZXJlZE9wbG9nKCkgewogICAgbGV0IGVudHJpZXMgPSB0aGlzLm9wbG9nRW50cmllczsKICAgIGlmICh0aGlzLm9wbG9nRmlsdGVyLm9wKSB7CiAgICAgIGVudHJpZXMgPSBlbnRyaWVzLmZpbHRlcigoZTEwKSA9PiBlMTAub3AgPT09IHRoaXMub3Bsb2dGaWx0ZXIub3ApOwogICAgfQogICAgaWYgKHRoaXMub3Bsb2dGaWx0ZXIuY29sbGVjdGlvbikgewogICAgICBlbnRyaWVzID0gZW50cmllcy5maWx0ZXIoCiAgICAgICAgKGUxMCkgPT4gYCR7ZTEwLmRifS4ke2UxMC5jb2xsZWN0aW9ufWAgPT09IHRoaXMub3Bsb2dGaWx0ZXIuY29sbGVjdGlvbgogICAgICApOwogICAgfQogICAgcmV0dXJuIGVudHJpZXM7CiAgfQogIHJlbmRlck9wbG9nRW50cnkoZW50cnkpIHsKICAgIGNvbnN0IGlzRXhwYW5kZWQgPSB0aGlzLmV4cGFuZGVkT3Bsb2dTZXFzLmhhcyhlbnRyeS5zZXEpOwogICAgY29uc3QgZGlmZnMgPSBpc0V4cGFuZGVkID8gdGhpcy5jb21wdXRlRGlmZihlbnRyeS5wcmV2aW91c0RvY3VtZW50LCBlbnRyeS5kb2N1bWVudCkgOiBbXTsKICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0ib3Bsb2ctZW50cnkiPgogICAgICAgIDxkaXYgY2xhc3M9Im9wbG9nLWhlYWRlciIgQGNsaWNrPSR7KCkgPT4gdGhpcy50b2dnbGVPcGxvZ0VudHJ5KGVudHJ5LnNlcSl9PgogICAgICAgICAgPHNwYW4gY2xhc3M9Im9wbG9nLXNlcSI+IyR7ZW50cnkuc2VxfTwvc3Bhbj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJvcC1iYWRnZSAke2VudHJ5Lm9wfSI+JHtlbnRyeS5vcH08L3NwYW4+CiAgICAgICAgICA8c3BhbiBjbGFzcz0ib3Bsb2ctbnMiPiR7ZW50cnkuZGJ9LiR7ZW50cnkuY29sbGVjdGlvbn08L3NwYW4+CiAgICAgICAgICA8c3BhbiBjbGFzcz0ib3Bsb2ctZG9jaWQiPiR7ZW50cnkuZG9jdW1lbnRJZC5zdWJzdHJpbmcoMCwgMTIpfS4uLjwvc3Bhbj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJvcGxvZy10aW1lIj4ke3RoaXMuZm9ybWF0VGltZShlbnRyeS50aW1lc3RhbXBNcyl9PC9zcGFuPgogICAgICAgICAgPHNwYW4gY2xhc3M9Im9wbG9nLWV4cGFuZCAke2lzRXhwYW5kZWQgPyAiZXhwYW5kZWQiIDogIiJ9Ij4mIzk2NTQ7PC9zcGFuPgogICAgICAgIDwvZGl2PgoKICAgICAgICAke2lzRXhwYW5kZWQgPyBiMmAKICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJvcGxvZy1kaWZmIj4KICAgICAgICAgICAgICAgICR7ZW50cnkub3AgPT09ICJpbnNlcnQiID8gYjJgCiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWZmLWxhYmVsIj5JbnNlcnRlZCBEb2N1bWVudDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZG9jLWpzb24tYmxvY2siPgogICAgICAgICAgICAgICAgICAgICAgICAke0pTT04uc3RyaW5naWZ5KGVudHJ5LmRvY3VtZW50LCBudWxsLCAyKX0KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIGAgOiBlbnRyeS5vcCA9PT0gImRlbGV0ZSIgPyBiMmAKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGlmZi1sYWJlbCI+RGVsZXRlZCBEb2N1bWVudDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkb2MtanNvbi1ibG9jayI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgJHtKU09OLnN0cmluZ2lmeShlbnRyeS5wcmV2aW91c0RvY3VtZW50LCBudWxsLCAyKX0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICBgIDogYjJgCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpZmYtbGFiZWwiPkNoYW5nZXM8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgJHtkaWZmcy5sZW5ndGggPiAwID8gZGlmZnMubWFwKChkNCkgPT4gdGhpcy5yZW5kZXJEaWZmUm93KGQ0KSkgOiBiMmA8ZGl2IHN0eWxlPSJmb250LXNpemU6IDEycHg7IGNvbG9yOiAjOTRhM2I4OyBwYWRkaW5nOiA0cHggMCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vIGZpZWxkLWxldmVsIGNoYW5nZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PmB9CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpZmYtbGFiZWwiPkJlZm9yZTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkb2MtanNvbi1ibG9jayI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgJHtKU09OLnN0cmluZ2lmeShlbnRyeS5wcmV2aW91c0RvY3VtZW50LCBudWxsLCAyKX0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpZmYtbGFiZWwiPkFmdGVyPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRvYy1qc29uLWJsb2NrIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAke0pTT04uc3RyaW5naWZ5KGVudHJ5LmRvY3VtZW50LCBudWxsLCAyKX0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICBgfQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICBgIDogIiJ9CiAgICAgIDwvZGl2PgogICAgYDsKICB9CiAgcmVuZGVyRGlmZlJvdyhkaWZmKSB7CiAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9ImRpZmYtcm93Ij4KICAgICAgICA8c3BhbiBjbGFzcz0iZGlmZi1wYXRoIj4ke2RpZmYucGF0aH08L3NwYW4+CiAgICAgICAgJHtkaWZmLnR5cGUgPT09ICJhZGRlZCIgPyBiMmA8c3BhbiBjbGFzcz0iZGlmZi1hZGRlZCI+KyAke3RoaXMuZm9ybWF0VmFsdWUoZGlmZi5uZXdWYWx1ZSl9PC9zcGFuPmAgOiBkaWZmLnR5cGUgPT09ICJyZW1vdmVkIiA/IGIyYDxzcGFuIGNsYXNzPSJkaWZmLXJlbW92ZWQiPi0gJHt0aGlzLmZvcm1hdFZhbHVlKGRpZmYub2xkVmFsdWUpfTwvc3Bhbj5gIDogYjJgCiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGlmZi1jaGFuZ2VkLW9sZCI+JHt0aGlzLmZvcm1hdFZhbHVlKGRpZmYub2xkVmFsdWUpfTwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogIzk0YTNiOCI+LT48L3NwYW4+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGlmZi1jaGFuZ2VkLW5ldyI+JHt0aGlzLmZvcm1hdFZhbHVlKGRpZmYubmV3VmFsdWUpfTwvc3Bhbj4KICAgICAgICAgICAgICBgfQogICAgICA8L2Rpdj4KICAgIGA7CiAgfQogIHJlbmRlclJldmVydCgpIHsKICAgIGNvbnN0IGN1cnJlbnRTZXEgPSB0aGlzLm9wbG9nU3RhdHM/LmN1cnJlbnRTZXEgPz8gMDsKICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0iY2FyZCI+CiAgICAgICAgPGRpdiBjbGFzcz0iY2FyZC10aXRsZSI+UG9pbnQtaW4tVGltZSBSZXZlcnQ8L2Rpdj4KICAgICAgICA8cCBzdHlsZT0iZm9udC1zaXplOiAxM3B4OyBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM2NDc0OGIiLCAiIzk0YTNiOCIpfTsgbWFyZ2luLWJvdHRvbTogMTZweCI+CiAgICAgICAgICBSZXZlcnQgdGhlIGRhdGFiYXNlIHRvIGEgc3BlY2lmaWMgb3Bsb2cgc2VxdWVuY2UgbnVtYmVyLiBBbGwgb3BlcmF0aW9ucyBhZnRlciB0aGF0CiAgICAgICAgICBwb2ludCB3aWxsIGJlIHVuZG9uZSBpbiByZXZlcnNlIG9yZGVyLgogICAgICAgICAgQ3VycmVudCBzZXF1ZW5jZTogPHN0cm9uZz4ke2N1cnJlbnRTZXF9PC9zdHJvbmc+CiAgICAgICAgPC9wPgoKICAgICAgICA8ZGl2IGNsYXNzPSJyZXZlcnQtY29udHJvbHMiPgogICAgICAgICAgPGxhYmVsIHN0eWxlPSJmb250LXNpemU6IDEzcHg7IGZvbnQtd2VpZ2h0OiA1MDAiPlRhcmdldCBzZXE6PC9sYWJlbD4KICAgICAgICAgIDxpbnB1dAogICAgICAgICAgICBjbGFzcz0icmV2ZXJ0LWlucHV0IgogICAgICAgICAgICB0eXBlPSJudW1iZXIiCiAgICAgICAgICAgIG1pbj0iMCIKICAgICAgICAgICAgbWF4PSIke2N1cnJlbnRTZXF9IgogICAgICAgICAgICAudmFsdWU9JHtTdHJpbmcodGhpcy5yZXZlcnRUYXJnZXRTZXEpfQogICAgICAgICAgICBAaW5wdXQ9JHsoZTEwKSA9PiB7CiAgICAgIHRoaXMucmV2ZXJ0VGFyZ2V0U2VxID0gcGFyc2VJbnQoZTEwLnRhcmdldC52YWx1ZSkgfHwgMDsKICAgICAgdGhpcy5yZXZlcnRQcmV2aWV3ID0gbnVsbDsKICAgIH19CiAgICAgICAgICAvPgogICAgICAgICAgPGJ1dHRvbgogICAgICAgICAgICBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IgogICAgICAgICAgICA/ZGlzYWJsZWQ9JHt0aGlzLnJldmVydFRhcmdldFNlcSA8PSAwIHx8IHRoaXMucmV2ZXJ0VGFyZ2V0U2VxID4gY3VycmVudFNlcX0KICAgICAgICAgICAgQGNsaWNrPSR7dGhpcy5oYW5kbGVQcmV2aWV3UmV2ZXJ0fQogICAgICAgICAgPgogICAgICAgICAgICBQcmV2aWV3CiAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgJHt0aGlzLnJldmVydFByZXZpZXcgPyBiMmAKICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyZXZlcnQtcHJldmlldyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyZXZlcnQtcHJldmlldy10aXRsZSI+CiAgICAgICAgICAgICAgICAgIFJldmVydCBQcmV2aWV3OiAke3RoaXMucmV2ZXJ0UHJldmlldy5yZXZlcnRlZH0gb3BlcmF0aW9ucyB0byB1bmRvCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICR7dGhpcy5yZXZlcnRQcmV2aWV3LmVudHJpZXM/Lm1hcCgKICAgICAgKGUxMCkgPT4gYjJgCiAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iZm9udC1zaXplOiAxMnB4OyBwYWRkaW5nOiAycHggMDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZSI+CiAgICAgICAgICAgICAgICAgICAgICAjJHtlMTAuc2VxfSAke2UxMC5vcH0gJHtlMTAuZGJ9LiR7ZTEwLmNvbGxlY3Rpb259ICgke2UxMC5kb2N1bWVudElkfSkKICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgYAogICAgKX0KICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9Im1hcmdpbi10b3A6IDEycHgiPgogICAgICAgICAgICAgICAgICA8YnV0dG9uCiAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImJ0biBidG4tZGFuZ2VyIgogICAgICAgICAgICAgICAgICAgID9kaXNhYmxlZD0ke3RoaXMucmV2ZXJ0SW5Qcm9ncmVzc30KICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHt0aGlzLmhhbmRsZUV4ZWN1dGVSZXZlcnR9CiAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICAke3RoaXMucmV2ZXJ0SW5Qcm9ncmVzcyA/ICJSZXZlcnRpbmcuLi4iIDogIkV4ZWN1dGUgUmV2ZXJ0In0KICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgYCA6ICIifQogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9ImNhcmQiPgogICAgICAgIDxkaXYgY2xhc3M9ImNhcmQtdGl0bGUiPlJlY2VudCBPcGVyYXRpb25zIChuZXdlc3QgZmlyc3QpPC9kaXY+CiAgICAgICAgJHt0aGlzLm9wbG9nRW50cmllcy5sZW5ndGggPT09IDAgPyBiMmA8ZGl2IGNsYXNzPSJlbXB0eS1zdGF0ZSI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZW1wdHktc3RhdGUtdGV4dCI+Tm8gb3BlcmF0aW9ucyByZWNvcmRlZCB5ZXQ8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+YCA6IFsuLi50aGlzLm9wbG9nRW50cmllc10ucmV2ZXJzZSgpLnNsaWNlKDAsIDIwKS5tYXAoCiAgICAgIChlbnRyeSkgPT4gYjJgCiAgICAgICAgICAgICAgICAgIDxkaXYKICAgICAgICAgICAgICAgICAgICBzdHlsZT0iZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IHBhZGRpbmc6IDZweCAwOyBmb250LXNpemU6IDEycHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2YxZjVmOSIsICIjMjcyNzJhIil9IgogICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im9wbG9nLXNlcSI+IyR7ZW50cnkuc2VxfTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ib3AtYmFkZ2UgJHtlbnRyeS5vcH0iPiR7ZW50cnkub3B9PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJmbGV4OiAxIj4ke2VudHJ5LmRifS4ke2VudHJ5LmNvbGxlY3Rpb259PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM5NGEzYjgiLCAiIzY0NzQ4YiIpfSIKICAgICAgICAgICAgICAgICAgICAgID4ke2VudHJ5LmRvY3VtZW50SWQuc3Vic3RyaW5nKDAsIDEyKX08L3NwYW4KICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgYAogICAgKX0KICAgICAgPC9kaXY+CiAgICBgOwogIH0KfTsKX2luaXQgPSBfX2RlY29yYXRvclN0YXJ0KF9hKTsKX3NlcnZlciA9IG5ldyBXZWFrTWFwKCk7Cl9hcGlCYXNlVXJsID0gbmV3IFdlYWtNYXAoKTsKX3JlZnJlc2hJbnRlcnZhbCA9IG5ldyBXZWFrTWFwKCk7Cl9hY3RpdmVUYWIgPSBuZXcgV2Vha01hcCgpOwpfbWV0cmljcyA9IG5ldyBXZWFrTWFwKCk7Cl9vcGxvZ1N0YXRzID0gbmV3IFdlYWtNYXAoKTsKX29wbG9nRW50cmllcyA9IG5ldyBXZWFrTWFwKCk7Cl9jb2xsZWN0aW9ucyA9IG5ldyBXZWFrTWFwKCk7Cl9zZWxlY3RlZENvbGxlY3Rpb24gPSBuZXcgV2Vha01hcCgpOwpfZG9jdW1lbnRzID0gbmV3IFdlYWtNYXAoKTsKX2RvY3VtZW50c1RvdGFsID0gbmV3IFdlYWtNYXAoKTsKX2V4cGFuZGVkT3Bsb2dTZXFzID0gbmV3IFdlYWtNYXAoKTsKX3JldmVydFRhcmdldFNlcSA9IG5ldyBXZWFrTWFwKCk7Cl9yZXZlcnRQcmV2aWV3ID0gbmV3IFdlYWtNYXAoKTsKX3JldmVydEluUHJvZ3Jlc3MgPSBuZXcgV2Vha01hcCgpOwpfb3Bsb2dGaWx0ZXIgPSBuZXcgV2Vha01hcCgpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgInNlcnZlciIsIF9zZXJ2ZXJfZGVjLCBfU21hcnRkYkRlYnVnVWksIF9zZXJ2ZXIpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgImFwaUJhc2VVcmwiLCBfYXBpQmFzZVVybF9kZWMsIF9TbWFydGRiRGVidWdVaSwgX2FwaUJhc2VVcmwpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgInJlZnJlc2hJbnRlcnZhbCIsIF9yZWZyZXNoSW50ZXJ2YWxfZGVjLCBfU21hcnRkYkRlYnVnVWksIF9yZWZyZXNoSW50ZXJ2YWwpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgImFjdGl2ZVRhYiIsIF9hY3RpdmVUYWJfZGVjLCBfU21hcnRkYkRlYnVnVWksIF9hY3RpdmVUYWIpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgIm1ldHJpY3MiLCBfbWV0cmljc19kZWMsIF9TbWFydGRiRGVidWdVaSwgX21ldHJpY3MpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgIm9wbG9nU3RhdHMiLCBfb3Bsb2dTdGF0c19kZWMsIF9TbWFydGRiRGVidWdVaSwgX29wbG9nU3RhdHMpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgIm9wbG9nRW50cmllcyIsIF9vcGxvZ0VudHJpZXNfZGVjLCBfU21hcnRkYkRlYnVnVWksIF9vcGxvZ0VudHJpZXMpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgImNvbGxlY3Rpb25zIiwgX2NvbGxlY3Rpb25zX2RlYywgX1NtYXJ0ZGJEZWJ1Z1VpLCBfY29sbGVjdGlvbnMpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgInNlbGVjdGVkQ29sbGVjdGlvbiIsIF9zZWxlY3RlZENvbGxlY3Rpb25fZGVjLCBfU21hcnRkYkRlYnVnVWksIF9zZWxlY3RlZENvbGxlY3Rpb24pOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgImRvY3VtZW50cyIsIF9kb2N1bWVudHNfZGVjLCBfU21hcnRkYkRlYnVnVWksIF9kb2N1bWVudHMpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgImRvY3VtZW50c1RvdGFsIiwgX2RvY3VtZW50c1RvdGFsX2RlYywgX1NtYXJ0ZGJEZWJ1Z1VpLCBfZG9jdW1lbnRzVG90YWwpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgImV4cGFuZGVkT3Bsb2dTZXFzIiwgX2V4cGFuZGVkT3Bsb2dTZXFzX2RlYywgX1NtYXJ0ZGJEZWJ1Z1VpLCBfZXhwYW5kZWRPcGxvZ1NlcXMpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgInJldmVydFRhcmdldFNlcSIsIF9yZXZlcnRUYXJnZXRTZXFfZGVjLCBfU21hcnRkYkRlYnVnVWksIF9yZXZlcnRUYXJnZXRTZXEpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgInJldmVydFByZXZpZXciLCBfcmV2ZXJ0UHJldmlld19kZWMsIF9TbWFydGRiRGVidWdVaSwgX3JldmVydFByZXZpZXcpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgInJldmVydEluUHJvZ3Jlc3MiLCBfcmV2ZXJ0SW5Qcm9ncmVzc19kZWMsIF9TbWFydGRiRGVidWdVaSwgX3JldmVydEluUHJvZ3Jlc3MpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgIm9wbG9nRmlsdGVyIiwgX29wbG9nRmlsdGVyX2RlYywgX1NtYXJ0ZGJEZWJ1Z1VpLCBfb3Bsb2dGaWx0ZXIpOwpfU21hcnRkYkRlYnVnVWkgPSBfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgMCwgIlNtYXJ0ZGJEZWJ1Z1VpIiwgX1NtYXJ0ZGJEZWJ1Z1VpX2RlY29yYXRvcnMsIF9TbWFydGRiRGVidWdVaSk7Cl9fbmFtZShfU21hcnRkYkRlYnVnVWksICJTbWFydGRiRGVidWdVaSIpOwpfX3B1YmxpY0ZpZWxkKF9TbWFydGRiRGVidWdVaSwgInN0eWxlcyIsIFsKICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgaWAKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGZvbnQtZmFtaWx5OiAnSW50ZXInLCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIFJvYm90bywgc2Fucy1zZXJpZjsKICAgICAgfQoKICAgICAgLmRlYnVndWkgewogICAgICAgIHBhZGRpbmc6IDI0cHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmOGZhZmMiLCAiIzA5MDkwYiIpfTsKICAgICAgICBtaW4taGVpZ2h0OiAxMDB2aDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwZjE3MmEiLCAiI2YxZjVmOSIpfTsKICAgICAgfQoKICAgICAgLmhlYWRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyNHB4OwogICAgICB9CgogICAgICAuaGVhZGVyLWxlZnQgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDEycHg7CiAgICAgIH0KCiAgICAgIC50aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAyNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICAgIH0KCiAgICAgIC5zdGF0dXMtZG90IHsKICAgICAgICB3aWR0aDogMTBweDsKICAgICAgICBoZWlnaHQ6IDEwcHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMjJjNTVlIiwgIiMyMmM1NWUiKX07CiAgICAgIH0KCiAgICAgIC5zdGF0dXMtZG90Lm9mZmxpbmUgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZWY0NDQ0IiwgIiNlZjQ0NDQiKX07CiAgICAgIH0KCiAgICAgIC8qIFRhYnMgKi8KICAgICAgLnRhYnMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZ2FwOiAycHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlMmU4ZjAiLCAiIzFlMWUxZSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgICAgIHBhZGRpbmc6IDNweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyNHB4OwogICAgICB9CgogICAgICAudGFiIHsKICAgICAgICBwYWRkaW5nOiA4cHggMjBweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzY0NzQ4YiIsICIjOTRhM2I4Iil9OwogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgICB9CgogICAgICAudGFiOmhvdmVyIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwZjE3MmEiLCAiI2UyZThmMCIpfTsKICAgICAgfQoKICAgICAgLnRhYi5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmZmZmIiwgIiMyNzI3MmEiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMGYxNzJhIiwgIiNmMWY1ZjkiKX07CiAgICAgICAgYm94LXNoYWRvdzogMCAxcHggM3B4ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsMCwwLDAuMDgpIiwgInJnYmEoMCwwLDAsMC4zKSIpfTsKICAgICAgfQoKICAgICAgLyogQ2FyZHMgKi8KICAgICAgLmNhcmQgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmZmZmIiwgIiMxODE4MWIiKX07CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlMmU4ZjAiLCAiIzI3MjcyYSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMnB4OwogICAgICAgIHBhZGRpbmc6IDIwcHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICAgICAgfQoKICAgICAgLmNhcmQtdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzY0NzQ4YiIsICIjOTRhM2I4Iil9OwogICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuNXB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDEycHg7CiAgICAgIH0KCiAgICAgIC8qIFN0YXRzIGdyaWQgKi8KICAgICAgLnN0YXRzLWdyaWQgewogICAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maWxsLCBtaW5tYXgoMTgwcHgsIDFmcikpOwogICAgICAgIGdhcDogMTZweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyNHB4OwogICAgICB9CgogICAgICAuc3RhdC1jYXJkIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMTgxODFiIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTJlOGYwIiwgIiMyNzI3MmEiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTJweDsKICAgICAgICBwYWRkaW5nOiAyMHB4OwogICAgICB9CgogICAgICAuc3RhdC1sYWJlbCB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjOTRhM2I4IiwgIiM2NDc0OGIiKX07CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogMC41cHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgICB9CgogICAgICAuc3RhdC12YWx1ZSB7CiAgICAgICAgZm9udC1zaXplOiAyOHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMGYxNzJhIiwgIiNmMWY1ZjkiKX07CiAgICAgIH0KCiAgICAgIC8qIENvbGxlY3Rpb25zICovCiAgICAgIC5jb2xsZWN0aW9ucy1sYXlvdXQgewogICAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAyODBweCAxZnI7CiAgICAgICAgZ2FwOiAxNnB4OwogICAgICAgIG1pbi1oZWlnaHQ6IDUwMHB4OwogICAgICB9CgogICAgICAuY29sbC1zaWRlYmFyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMTgxODFiIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTJlOGYwIiwgIiMyNzI3MmEiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTJweDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAuY29sbC1pdGVtIHsKICAgICAgICBwYWRkaW5nOiAxMnB4IDE2cHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2YxZjVmOSIsICIjMjcyNzJhIil9OwogICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xcyBlYXNlOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgfQoKICAgICAgLmNvbGwtaXRlbTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmOGZhZmMiLCAiIzFmMWYyMyIpfTsKICAgICAgfQoKICAgICAgLmNvbGwtaXRlbS5zZWxlY3RlZCB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlZmY2ZmYiLCAiIzFlM2E1ZiIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMxZDRlZDgiLCAiIzkzYzVmZCIpfTsKICAgICAgfQoKICAgICAgLmNvbGwtbmFtZSB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgfQoKICAgICAgLmNvbGwtY291bnQgewogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM5NGEzYjgiLCAiIzY0NzQ4YiIpfTsKICAgICAgICBtYXJnaW4tdG9wOiAycHg7CiAgICAgIH0KCiAgICAgIC5kb2Mtdmlld2VyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMTgxODFiIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTJlOGYwIiwgIiMyNzI3MmEiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTJweDsKICAgICAgICBwYWRkaW5nOiAyMHB4OwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICAuZG9jLWl0ZW0gewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjhmYWZjIiwgIiMwZjBmMTIiKX07CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlMmU4ZjAiLCAiIzI3MjcyYSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgcGFkZGluZzogMTJweCAxNnB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgICAgICBmb250LWZhbWlseTogJ0pldEJyYWlucyBNb25vJywgJ0ZpcmEgQ29kZScsIG1vbm9zcGFjZTsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNTsKICAgICAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICAgICAgd29yZC1icmVhazogYnJlYWstYWxsOwogICAgICB9CgogICAgICAvKiBPcExvZyAqLwogICAgICAub3Bsb2ctZmlsdGVycyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBnYXA6IDhweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4OwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgfQoKICAgICAgLmZpbHRlci1jaGlwIHsKICAgICAgICBwYWRkaW5nOiA2cHggMTJweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTJlOGYwIiwgIiMyNzI3MmEiKX07CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiIzE4MTgxYiIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM2NDc0OGIiLCAiIzk0YTNiOCIpfTsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgfQoKICAgICAgLmZpbHRlci1jaGlwOmhvdmVyLAogICAgICAuZmlsdGVyLWNoaXAuYWN0aXZlIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2VmZjZmZiIsICIjMWUzYTVmIil9OwogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM5M2M1ZmQiLCAiIzNiODJmNiIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMxZDRlZDgiLCAiIzkzYzVmZCIpfTsKICAgICAgfQoKICAgICAgLm9wbG9nLWVudHJ5IHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMTgxODFiIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTJlOGYwIiwgIiMyNzI3MmEiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0cmFuc2l0aW9uOiBib3gtc2hhZG93IDAuMTVzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5vcGxvZy1lbnRyeTpob3ZlciB7CiAgICAgICAgYm94LXNoYWRvdzogMCAycHggOHB4ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsMCwwLDAuMDYpIiwgInJnYmEoMCwwLDAsMC4yKSIpfTsKICAgICAgfQoKICAgICAgLm9wbG9nLWhlYWRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogMTJweDsKICAgICAgICBwYWRkaW5nOiAxMnB4IDE2cHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CgogICAgICAub3Bsb2ctc2VxIHsKICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM5NGEzYjgiLCAiIzY0NzQ4YiIpfTsKICAgICAgICBtaW4td2lkdGg6IDQwcHg7CiAgICAgIH0KCiAgICAgIC5vcC1iYWRnZSB7CiAgICAgICAgcGFkZGluZzogM3B4IDhweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogMC4zcHg7CiAgICAgIH0KCiAgICAgIC5vcC1iYWRnZS5pbnNlcnQgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZGNmY2U3IiwgIiMxNDUzMmQiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMTU4MDNkIiwgIiM4NmVmYWMiKX07CiAgICAgIH0KCiAgICAgIC5vcC1iYWRnZS51cGRhdGUgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZGJlYWZlIiwgIiMxZTNhOGEiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMWU0MGFmIiwgIiM5M2M1ZmQiKX07CiAgICAgIH0KCiAgICAgIC5vcC1iYWRnZS5kZWxldGUgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmVlMmUyIiwgIiM3ZjFkMWQiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZGMyNjI2IiwgIiNmY2E1YTUiKX07CiAgICAgIH0KCiAgICAgIC5vcGxvZy1ucyB7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgZmxleDogMTsKICAgICAgfQoKICAgICAgLm9wbG9nLXRpbWUgewogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM5NGEzYjgiLCAiIzY0NzQ4YiIpfTsKICAgICAgfQoKICAgICAgLm9wbG9nLWRvY2lkIHsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM5NGEzYjgiLCAiIzY0NzQ4YiIpfTsKICAgICAgfQoKICAgICAgLm9wbG9nLWV4cGFuZCB7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzk0YTNiOCIsICIjNjQ3NDhiIil9OwogICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjJzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5vcGxvZy1leHBhbmQuZXhwYW5kZWQgewogICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsKICAgICAgfQoKICAgICAgLm9wbG9nLWRpZmYgewogICAgICAgIHBhZGRpbmc6IDAgMTZweCAxNnB4OwogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2YxZjVmOSIsICIjMjcyNzJhIil9OwogICAgICB9CgogICAgICAuZGlmZi1yb3cgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGJhc2VsaW5lOwogICAgICAgIGdhcDogOHB4OwogICAgICAgIHBhZGRpbmc6IDRweCAwOwogICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjY7CiAgICAgIH0KCiAgICAgIC5kaWZmLXBhdGggewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzY0NzQ4YiIsICIjOTRhM2I4Iil9OwogICAgICAgIG1pbi13aWR0aDogMTIwcHg7CiAgICAgIH0KCiAgICAgIC5kaWZmLWFkZGVkIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMxNTgwM2QiLCAiIzg2ZWZhYyIpfTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2YwZmRmNCIsICIjMDUyZTE2Iil9OwogICAgICAgIHBhZGRpbmc6IDFweCA0cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICB9CgogICAgICAuZGlmZi1yZW1vdmVkIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNkYzI2MjYiLCAiI2ZjYTVhNSIpfTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZlZjJmMiIsICIjNDUwYTBhIil9OwogICAgICAgIHBhZGRpbmc6IDFweCA0cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICB9CgogICAgICAuZGlmZi1jaGFuZ2VkLW9sZCB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZGMyNjI2IiwgIiNmY2E1YTUiKX07CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZWYyZjIiLCAiIzQ1MGEwYSIpfTsKICAgICAgICBwYWRkaW5nOiAxcHggNHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDsKICAgICAgfQoKICAgICAgLmRpZmYtY2hhbmdlZC1uZXcgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzE1ODAzZCIsICIjODZlZmFjIil9OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjBmZGY0IiwgIiMwNTJlMTYiKX07CiAgICAgICAgcGFkZGluZzogMXB4IDRweDsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgIH0KCiAgICAgIC8qIFJldmVydCAqLwogICAgICAucmV2ZXJ0LWNvbnRyb2xzIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGdhcDogMTJweDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7CiAgICAgIH0KCiAgICAgIC5yZXZlcnQtaW5wdXQgewogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2UyZThmMCIsICIjMjcyNzJhIil9OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmZmZmIiwgIiMwZjBmMTIiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMGYxNzJhIiwgIiNmMWY1ZjkiKX07CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgICAgICAgd2lkdGg6IDEyMHB4OwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5yZXZlcnQtaW5wdXQ6Zm9jdXMgewogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzYjgyZjYiLCAiIzNiODJmNiIpfTsKICAgICAgfQoKICAgICAgLmJ0biB7CiAgICAgICAgcGFkZGluZzogOHB4IDE2cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5idG4tcHJpbWFyeSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzYjgyZjYiLCAiIzI1NjNlYiIpfTsKICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgIH0KCiAgICAgIC5idG4tcHJpbWFyeTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMyNTYzZWIiLCAiIzFkNGVkOCIpfTsKICAgICAgfQoKICAgICAgLmJ0bi1kYW5nZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZWY0NDQ0IiwgIiNkYzI2MjYiKX07CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICAuYnRuLWRhbmdlcjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNkYzI2MjYiLCAiI2I5MWMxYyIpfTsKICAgICAgfQoKICAgICAgLmJ0bjpkaXNhYmxlZCB7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7CiAgICAgIH0KCiAgICAgIC5yZXZlcnQtcHJldmlldyB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZiZWIiLCAiIzFjMTMwNSIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZjZDM0ZCIsICIjODU0ZDBlIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICAgICAgcGFkZGluZzogMTZweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4OwogICAgICB9CgogICAgICAucmV2ZXJ0LXByZXZpZXctdGl0bGUgewogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzkyNDAwZSIsICIjZmJiZjI0Iil9OwogICAgICB9CgogICAgICAuZW1wdHktc3RhdGUgewogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBwYWRkaW5nOiA0OHB4IDI0cHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjOTRhM2I4IiwgIiM2NDc0OGIiKX07CiAgICAgIH0KCiAgICAgIC5lbXB0eS1zdGF0ZS10ZXh0IHsKICAgICAgICBmb250LXNpemU6IDE1cHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogNHB4OwogICAgICB9CgogICAgICAuZW1wdHktc3RhdGUtc3ViIHsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgIH0KCiAgICAgIC5kb2MtanNvbi1ibG9jayB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmOGZhZmMiLCAiIzBmMGYxMiIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2UyZThmMCIsICIjMjcyNzJhIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBwYWRkaW5nOiAxMnB4OwogICAgICAgIG1hcmdpbi10b3A6IDhweDsKICAgICAgICBmb250LWZhbWlseTogJ0pldEJyYWlucyBNb25vJywgJ0ZpcmEgQ29kZScsIG1vbm9zcGFjZTsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNTsKICAgICAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICAgICAgd29yZC1icmVhazogYnJlYWstYWxsOwogICAgICAgIG1heC1oZWlnaHQ6IDMwMHB4OwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICAuZGlmZi1sYWJlbCB7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogMC41cHg7CiAgICAgICAgbWFyZ2luLXRvcDogMTJweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiA0cHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNjQ3NDhiIiwgIiM5NGEzYjgiKX07CiAgICAgIH0KICAgIGAKXSk7Cl9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCAxLCBfU21hcnRkYkRlYnVnVWkpOwp2YXIgU21hcnRkYkRlYnVnVWkgPSBfU21hcnRkYkRlYnVnVWk7CmV4cG9ydCB7CiAgU21hcnRkYkRlYnVnVWkKfTsKLyohIEJ1bmRsZWQgbGljZW5zZSBpbmZvcm1hdGlvbjoKCnN3ZWV0LXNjcm9sbC9zd2VldC1zY3JvbGwuanM6CiAgKCohIEBwcmVzZXJ2ZSBzd2VldC1zY3JvbGwgdjQuMC4wIC0gdHN1eW9zaGl3YWRhIHwgTUlUIExpY2Vuc2UgKikKICAoKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UKICAgICAgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUKICAgICAgTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAKICAgICAgVEhJUyBDT0RFIElTIFBST1ZJREVEIE9OIEFOICpBUyBJUyogQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQogICAgICBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIEFOWSBJTVBMSUVECiAgICAgIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsCiAgICAgIE1FUkNIQU5UQUJMSVRZIE9SIE5PTi1JTkZSSU5HRU1FTlQuCiAgCiAgICAgIFNlZSB0aGUgQXBhY2hlIFZlcnNpb24gMi4wIExpY2Vuc2UgZm9yIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucwogICAgICBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICopCgpAbGl0L3JlYWN0aXZlLWVsZW1lbnQvY3NzLXRhZy5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMKICAgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCiAgICopCgpAbGl0L3JlYWN0aXZlLWVsZW1lbnQvcmVhY3RpdmUtZWxlbWVudC5qczoKbGl0LWh0bWwvbGl0LWh0bWwuanM6CmxpdC1lbGVtZW50L2xpdC1lbGVtZW50LmpzOgpAbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGVjb3JhdG9ycy9wcm9wZXJ0eS5qczoKbGl0LWh0bWwvZGlyZWN0aXZlLmpzOgpsaXQtaHRtbC9kaXJlY3RpdmVzL3Vuc2FmZS1odG1sLmpzOgpAbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGVjb3JhdG9ycy9jdXN0b20tZWxlbWVudC5qczoKQGxpdC9yZWFjdGl2ZS1lbGVtZW50L2RlY29yYXRvcnMvc3RhdGUuanM6CkBsaXQvcmVhY3RpdmUtZWxlbWVudC9kZWNvcmF0b3JzL2V2ZW50LW9wdGlvbnMuanM6CkBsaXQvcmVhY3RpdmUtZWxlbWVudC9kZWNvcmF0b3JzL2Jhc2UuanM6CkBsaXQvcmVhY3RpdmUtZWxlbWVudC9kZWNvcmF0b3JzL3F1ZXJ5LmpzOgpAbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGVjb3JhdG9ycy9xdWVyeS1hbGwuanM6CkBsaXQvcmVhY3RpdmUtZWxlbWVudC9kZWNvcmF0b3JzL3F1ZXJ5LWFzeW5jLmpzOgpAbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGVjb3JhdG9ycy9xdWVyeS1hc3NpZ25lZC1ub2Rlcy5qczoKbGl0LWh0bWwvYXN5bmMtZGlyZWN0aXZlLmpzOgpsaXQtaHRtbC9kaXJlY3RpdmVzL3VudGlsLmpzOgpsaXQtaHRtbC9kaXJlY3RpdmVzL2FzeW5jLXJlcGxhY2UuanM6CmxpdC1odG1sL2RpcmVjdGl2ZXMvYXN5bmMtYXBwZW5kLmpzOgpsaXQtaHRtbC9kaXJlY3RpdmVzL3JlcGVhdC5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMKICAgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCiAgICopCgpsaXQtaHRtbC9pcy1zZXJ2ZXIuanM6CiAgKCoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDCiAgICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQogICAqKQoKbGl0LWh0bWwvc3RhdGljLmpzOgpsaXQtaHRtbC9kaXJlY3RpdmUtaGVscGVycy5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMKICAgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCiAgICopCgpAbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGVjb3JhdG9ycy9xdWVyeS1hc3NpZ25lZC1lbGVtZW50cy5qczoKbGl0LWh0bWwvZGlyZWN0aXZlcy9wcml2YXRlLWFzeW5jLWhlbHBlcnMuanM6CmxpdC1odG1sL2RpcmVjdGl2ZXMva2V5ZWQuanM6CiAgKCoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDCiAgICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQogICAqKQoqLwovLyMgc291cmNlTWFwcGluZ1VSTD1idW5kbGUtMTc3NTM2MTE4MDkwMy5qcy5tYXAK" }, { "path": "html/index.html",