4101-047 ノンケのイケメンが男の前でオナニーを見せる。

識別碼: 4101-047

發行日期: 2012-09-03

長度: 13分鐘

製作商:

Hey動画
( Heydouga )

類別:

推薦

W3siaWQiOiJidHNfal9NXzMwMHgxMDAiLCJhZHNwb3QiOiJqX01fMzAweDEwMCIsIndlaWdodCI6IjEiLCJmY2FwIjpmYWxzZSwic2NoZWR1bGUiOmZhbHNlLCJtYXhXaWR0aCI6Ijc2OCIsIm1pbldpZHRoIjpmYWxzZSwidGltZXpvbmUiOmZhbHNlLCJleGNsdWRlIjpmYWxzZSwiZG9tYWluIjpmYWxzZSwiY29kZSI6IjxhIGhyZWY9XCJodHRwczpcL1wvYnRzby5wd1wvdmlkZW9cLyVFMyU4MyU4RSVFMyU4MyVCMyVFMyU4MiVCMSVFMyU4MSVBRSVFMyU4MiVBNCVFMyU4MiVCMSVFMyU4MyVBMSVFMyU4MyVCMyVFMyU4MSU4QyVFNyU5NCVCNyVFMyU4MSVBRSVFNSU4OSU4RCVFMyU4MSVBNyVFMyU4MiVBQSVFMyU4MyU4QSVFMyU4MyU4QiVFMyU4MyVCQyVFMyU4MiU5MiVFOCVBNiU4QiVFMyU4MSU5QiVFMyU4MiU4QiVFMyU4MCU4MlwiIHRhcmdldD1cIl9ibGFua1wiPjxpbWcgc3JjPVwiXC9hcHBcL2J0c1wvVmlld1wvaW1nXC9wMzAwMTAwLnBuZ1wiPjxcL2E+In0seyJpZCI6ImV4b2Nfal9NXzMwMHgxMDAiLCJhZHNwb3QiOiJqX01fMzAweDEwMCIsIndlaWdodCI6IjMiLCJmY2FwIjpmYWxzZSwic2NoZWR1bGUiOmZhbHNlLCJtYXhXaWR0aCI6Ijc2OCIsIm1pbldpZHRoIjpmYWxzZSwidGltZXpvbmUiOmZhbHNlLCJleGNsdWRlIjpmYWxzZSwiZG9tYWluIjpmYWxzZSwiY29kZSI6IjxzY3JpcHQgYXN5bmMgdHlwZT1cImFwcGxpY2F0aW9uXC9qYXZhc2NyaXB0XCIgc3JjPVwiaHR0cHM6XC9cL2EubWFnc3J2LmNvbVwvYWQtcHJvdmlkZXIuanNcIj48XC9zY3JpcHQ+IFxyXG4gPGlucyBjbGFzcz1cImVhczZhOTc4ODhlMTBcIiBkYXRhLXpvbmVpZD1cIjEwMjYzMTBcIj48XC9pbnM+IFxyXG4gPHNjcmlwdD4oQWRQcm92aWRlciA9IHdpbmRvdy5BZFByb3ZpZGVyIHx8IFtdKS5wdXNoKHtcInNlcnZlXCI6IHt9fSk7PFwvc2NyaXB0PiJ9LHsiaWQiOiJqYXZfal9NXzMwMHgxMDAiLCJhZHNwb3QiOiJqX01fMzAweDEwMCIsIndlaWdodCI6IjIiLCJmY2FwIjpmYWxzZSwic2NoZWR1bGUiOmZhbHNlLCJtYXhXaWR0aCI6Ijc2OCIsIm1pbldpZHRoIjpmYWxzZSwidGltZXpvbmUiOmZhbHNlLCJleGNsdWRlIjpmYWxzZSwiZG9tYWluIjpmYWxzZSwiY29kZSI6IjxhIGhyZWY9XCJodHRwczpcL1wvdGVsbG1lLnB3XC9nb1wvamF2XCIgdGFyZ2V0PVwiX2JsYW5rXCI+PGltZyBzcmM9XCJcL2FwcFwvamF2XC9WaWV3XC9pbWdcL2Jhbm5lci42MDB4MTAwLmpwZ1wiIHdpZHRoPVwiMzAwXCIgaGVpZ2h0PVwiNTBcIj48XC9hPiJ9LHsiaWQiOiJqdWljX2pfTV8zMDB4MTAwIiwiYWRzcG90Ijoial9NXzMwMHgxMDAiLCJ3ZWlnaHQiOiI1IiwiZmNhcCI6ZmFsc2UsInNjaGVkdWxlIjpmYWxzZSwibWF4V2lkdGgiOiI3NjgiLCJtaW5XaWR0aCI6ZmFsc2UsInRpbWV6b25lIjpmYWxzZSwiZXhjbHVkZSI6ZmFsc2UsImRvbWFpbiI6ZmFsc2UsImNvZGUiOiI8aWZyYW1lIGJvcmRlcj0wIGZyYW1lYm9yZGVyPTAgbWFyZ2luaGVpZ2h0PTAgbWFyZ2lud2lkdGg9MCB3aWR0aD0zMDAgaGVpZ2h0PTEwMCBzY3JvbGxpbmc9bm8gYWxsb3d0cmFuc3BhcmVuY3k9dHJ1ZSBzcmM9XC9cL2Fkc2VydmVyLmp1aWN5YWRzLmNvbVwvYWRzaG93LnBocD9hZHpvbmU9NDUxNzQwPjxcL2lmcmFtZT4ifSx7ImlkIjoid2F2X2pfTV8zMDB4MTAwIiwiYWRzcG90Ijoial9NXzMwMHgxMDAiLCJ3ZWlnaHQiOiIyIiwiZmNhcCI6ZmFsc2UsInNjaGVkdWxlIjpmYWxzZSwibWF4V2lkdGgiOiI3NjgiLCJtaW5XaWR0aCI6ZmFsc2UsInRpbWV6b25lIjpmYWxzZSwiZXhjbHVkZSI6ZmFsc2UsImRvbWFpbiI6ZmFsc2UsImNvZGUiOiI8YSBocmVmPVwiaHR0cHM6XC9cL2F2eG8uY2x1YlwvXCIgdGFyZ2V0PVwiX2JsYW5rXCI+PGltZyBzcmM9XCJcL2FwcFwvd2F2XC9WaWV3XC9pbWdcL2Jhbm5lci42MDB4MTAwLmpwZ1wiIHdpZHRoPVwiMzAwXCIgaGVpZ2h0PVwiNTBcIj48XC9hPiJ9XQ==

演員

匿名希望ノンケ(寿松木)

推薦

W3siaWQiOiJleG9jX2pfTV8zMDB4MjUwIiwiYWRzcG90Ijoial9NXzMwMHgyNTAiLCJ3ZWlnaHQiOiIyIiwiZmNhcCI6ZmFsc2UsInNjaGVkdWxlIjpmYWxzZSwibWF4V2lkdGgiOiI3NjgiLCJtaW5XaWR0aCI6ZmFsc2UsInRpbWV6b25lIjpmYWxzZSwiZXhjbHVkZSI6ZmFsc2UsImRvbWFpbiI6ZmFsc2UsImNvZGUiOiI8c2NyaXB0IGFzeW5jIHR5cGU9XCJhcHBsaWNhdGlvblwvamF2YXNjcmlwdFwiIHNyYz1cImh0dHBzOlwvXC9hLm1hZ3Nydi5jb21cL2FkLXByb3ZpZGVyLmpzXCI+PFwvc2NyaXB0PiBcclxuIDxpbnMgY2xhc3M9XCJlYXM2YTk3ODg4ZTEwXCIgZGF0YS16b25laWQ9XCIxMDM5ODAyXCI+PFwvaW5zPiBcclxuIDxzY3JpcHQ+KEFkUHJvdmlkZXIgPSB3aW5kb3cuQWRQcm92aWRlciB8fCBbXSkucHVzaCh7XCJzZXJ2ZVwiOiB7fX0pOzxcL3NjcmlwdD4ifSx7ImlkIjoianVpY19qX01fMzAweDI1MCIsImFkc3BvdCI6ImpfTV8zMDB4MjUwIiwid2VpZ2h0IjoiMyIsImZjYXAiOmZhbHNlLCJzY2hlZHVsZSI6ZmFsc2UsIm1heFdpZHRoIjoiNzY4IiwibWluV2lkdGgiOmZhbHNlLCJ0aW1lem9uZSI6ZmFsc2UsImV4Y2x1ZGUiOmZhbHNlLCJkb21haW4iOmZhbHNlLCJjb2RlIjoiPGlmcmFtZSBib3JkZXI9MCBmcmFtZWJvcmRlcj0wIG1hcmdpbmhlaWdodD0wIG1hcmdpbndpZHRoPTAgd2lkdGg9MzA4IGhlaWdodD0yNTggc2Nyb2xsaW5nPW5vIGFsbG93dHJhbnNwYXJlbmN5PXRydWUgc3JjPVwvXC9hZHNlcnZlci5qdWljeWFkcy5jb21cL2Fkc2hvdy5waHA/YWR6b25lPTM2Mjc4MT48XC9pZnJhbWU+In1d
W3siaWQiOiJhZHN0X2pfUE9QVU5ERVIiLCJhZHNwb3QiOiJqX1BPUFVOREVSIiwid2VpZ2h0IjoiNSIsImZjYXAiOiIyIiwic2NoZWR1bGUiOmZhbHNlLCJtYXhXaWR0aCI6ZmFsc2UsIm1pbldpZHRoIjoiNzY4IiwidGltZXpvbmUiOmZhbHNlLCJleGNsdWRlIjpmYWxzZSwiZG9tYWluIjpmYWxzZSwiY29kZSI6IjxzY3JpcHQgdHlwZT0ndGV4dFwvamF2YXNjcmlwdCcgc3JjPSdcL1wvcGwxMTA3NjQucHVodG1sLmNvbVwvZjdcLzQ4XC82YVwvZjc0ODZhMDBjMjA0YjRmMGM4ZGU0NTZkN2JhNjQ2ZTAuanMnPjxcL3NjcmlwdD4ifSx7ImlkIjoiY2xpY19qX1BPUFVOREVSIiwiYWRzcG90Ijoial9QT1BVTkRFUiIsIndlaWdodCI6IjciLCJmY2FwIjoiMiIsInNjaGVkdWxlIjpmYWxzZSwibWF4V2lkdGgiOmZhbHNlLCJtaW5XaWR0aCI6ZmFsc2UsInRpbWV6b25lIjpmYWxzZSwiZXhjbHVkZSI6ZmFsc2UsImRvbWFpbiI6ZmFsc2UsImNvZGUiOiI8c2NyaXB0IHR5cGU9XCJ0ZXh0XC9qYXZhc2NyaXB0XCI+IWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7Y29uc3QgdD1cInpfZmxnZGFiY3Bva3JpbmV1dG0uXC9zXCIsZT10WzRdLG49dFs2XSxvPXRbN10scj10WzhdLHM9dFsxNF0saT10WzVdLGM9dFsxNV0sYT10WzE2XSxsPXRbMTNdLHU9dFsxMF0saD10WzEyXSxkPXRbOV0sZz10WzE3XSxtPXRbMThdLGY9dFsyXSxwPXRbM10sdz10WzBdLGI9dFsxXSwkPXRbMjBdLHY9KC4uLnQpPT50LmpvaW4oXCJcIiksST12KHIscCksUz12KG4sbykseT12KGksYyxvLGEsZSksRT12KGwscyxkLG4sZSxjKSxrPXYobyxuLHMscyxjLGgpLHg9dihiLEksYixTLGIseSxiKSxqPXYoYixiKSxDPXYodyxmLGUscCx1LG4saSxjLGkpLE49ezI6dihDLGQsdSxkLHRbMTZdLGQpLDk6dihDLGspLDEwOnYoQyxFKX0sTz12KHcsZixlLHIsdSxpLGMscCx1LG4saSxjLGkpLFI9ezI6dihPLHUscyxJLGwscix0WzExXSksOTp2KE8sayksMTA6dihPLEUpfSxfPXYoeCxnLGwsbSxjKSxBPXYoeCxpLHUsbSxuLGwscyksRD12KGoscixzLGUsZixlKSxUPXYoaixyLHMsZSxmLGUsaixpKSxNPXYoRCxqLFMpLFU9dihELGosYyxhKSxCPXYodFsyMV0scixoLGwsZCxnKSxKPXYodFsxOV0scix1LG0sJCksVz12KCQsYyxzKSx6PXYobCxpKSxWPXYoaixyLHMsZSxmLGUsaixoKSxIPVtcIm9vXCIsXCJra1wiLFwiYWFhXCIsXCJqampcIixcImZld2hcIixcImFhc2hcIixcInF3ZGh3XCIsXCJ3ZWd3Z3NcIixcImhraWl1eXJcIixcIm5mZ3JzdGRoXCJdLEs9MzZlNSxQPSh0LGUpPT5NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqKGUtdCsxKSkrdDtmdW5jdGlvbiBRKHQsZT13aW5kb3csbj0hMSl7bGV0IG87dHJ5e2lmKG89ZVt0XSwhbylyZXR1cm4hMTtjb25zdCBuPVwiX19zdG9yYWdlX3Rlc3RfX1wiO3JldHVybiBvLnNldEl0ZW0obixuKSxvLmdldEl0ZW0obiksby5yZW1vdmVJdGVtKG4pLCEwfWNhdGNoKHQpe3JldHVybiBCb29sZWFuKCFuJiZmdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIERPTUV4Y2VwdGlvbiYmKDIyPT09dC5jb2RlfHwxMDE0PT09dC5jb2RlfHxcIlF1b3RhRXhjZWVkZWRFcnJvclwiPT09dC5uYW1lfHxcIk5TX0VSUk9SX0RPTV9RVU9UQV9SRUFDSEVEXCI9PT10Lm5hbWUpfSh0KSYmbyYmby5sZW5ndGg+MCl9fWNvbnN0IHE9dD0+e2lmKFwiXCI9PT10KXRocm93IG5ldyBFcnJvcihcIktleSBjYW5ub3QgYmUgZW1wdHlcIil9O2NsYXNzIEZ7Y29uc3RydWN0b3IodCl7dGhpcy5zdG9yYWdlPXR9Z2V0SXRlbSh0KXtyZXR1cm4gdGhpcy5zdG9yYWdlLmdldEl0ZW0odCl9c2V0SXRlbSh0LGUpe3EodCksdGhpcy5zdG9yYWdlLnNldEl0ZW0odCxlKX1yZW1vdmVJdGVtKHQpe3RoaXMuc3RvcmFnZS5yZW1vdmVJdGVtKHQpfX1jbGFzcyBMe2NvbnN0cnVjdG9yKHQpe3RoaXMuZG9jPXR9Z2V0SXRlbSh0KXtjb25zdCBlPW5ldyBSZWdFeHAoXCIoPzpefDsgKVwiK3QucmVwbGFjZShcLyhbXFwuJD8qfHt9XFwoXFwpXFxbXFxdXFxcXFxcXC9cXCteXSlcL2csXCJcXFxcJDFcIikrXCI9KFteXC87XC9dKilcIikuZXhlYyh0aGlzLmRvYy5jb29raWUpO3JldHVybiBlP2RlY29kZVVSSUNvbXBvbmVudChlWzFdKTpudWxsfXNldEl0ZW0odCxlKXtxKHQpLHRoaXMuZG9jLmNvb2tpZT1gJHt0fT0ke2VuY29kZVVSSUNvbXBvbmVudChlKX07IG1heC1hZ2U9MzQ0NzAwMDA7IHBhdGg9XC87YH1yZW1vdmVJdGVtKHQpe3RoaXMuZG9jLmNvb2tpZT1gJHt0fT0wOyBtYXgtYWdlPS0xOyBwYXRoPVwvO2B9fWNsYXNzIEd7Y29uc3RydWN0b3IodCl7dGhpcy53aW49dH1nZXRJdGVtKHQpe2NvbnN0IGU9dGhpcy53aW5bdF07cmV0dXJuXCJvYmplY3RcIj09dHlwZW9mIGU/SlNPTi5zdHJpbmdpZnkoZSk6dm9pZCAwIT09ZT9lOm51bGx9c2V0SXRlbSh0LGUpe3EodCksdGhpcy53aW5bdF09ZX1yZW1vdmVJdGVtKHQpe2RlbGV0ZSB0aGlzLndpblt0XX19dmFyIFgsWTsodD0+e2NvbnN0IGU9W25ldyBHKHQpXSxuPVwib25jb250ZXh0c3RvcmVcIjtsZXQgbztRKFwibG9jYWxTdG9yYWdlXCIsdCkmJmUucHVzaChuZXcgRih0LmxvY2FsU3RvcmFnZSkpLFEoXCJzZXNzaW9uU3RvcmFnZVwiLHQpJiZlLnB1c2gobmV3IEYodC5zZXNzaW9uU3RvcmFnZSkpLGZ1bmN0aW9uKHQ9d2luZG93KXt0cnl7cmV0dXJuIHQuZG9jdW1lbnQuY29va2llLHQubmF2aWdhdG9yLmNvb2tpZUVuYWJsZWR9Y2F0Y2godCl7cmV0dXJuITF9fSh0KSYmZS5wdXNoKG5ldyBMKHQuZG9jdW1lbnQpKX0pKHdpbmRvdyksZnVuY3Rpb24odCl7dC5TRVU9XCJzZXVcIix0LlNOQz1cInNuY1wiLHQuU1NUPVwic3N0XCIsdC5TS0E9XCJza2FcIn0oWHx8KFg9e30pKSxcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5LV9cIi5zcGxpdChcIlwiKSxmdW5jdGlvbih0KXt0LlZvY2FidWxhcnk9XCJ0cG1taHYxOFwiLHQuV2VpZ2h0cz1cInRwbW1odzE4XCJ9KFl8fChZPXt9KSk7WS5Wb2NhYnVsYXJ5LFkuV2VpZ2h0cztjb25zdCBaPXQ9Pntjb25zdFtlXT10LnNwbGl0KFwiXC9cL1wiKTtsZXRbbixvLHJdPWZ1bmN0aW9uKHQsZSl7bGV0W24sbywuLi5yXT10LnNwbGl0KGUpO3JldHVybiBvPVtvLC4uLnJdLmpvaW4oZSksW24sbyxCb29sZWFuKHIubGVuZ3RoKV19KHQsXCI/XCIpO3ZhciBzO3ImJmZ1bmN0aW9uKHQsZSxuKXt0cnl7cmV0dXJuIHQoKX1jYXRjaCh0KXtpZihlKXJldHVybiBlKHQpfX0oKCgpPT57dGhyb3cgbmV3IEVycm9yKFwiVGhlIFVSTCBjb250YWlucyB1bmVuY29kZWQgY2hhcmFjdGVycy5cIil9KSxcImZ1bmN0aW9uXCI9PXR5cGVvZiBoYW5kbGVFeGNlcHRpb24/dD0+e2hhbmRsZUV4Y2VwdGlvbih0KX06cyk7Y29uc3RbaSwuLi5jXT1uLnJlcGxhY2UoXC9eaHR0cHM/OlxcXC9cXFwvXC8sXCJcIikuc3BsaXQoXCJcL1wiKTtyZXR1cm57cHJvdG9jb2w6ZSxvcmlnaW46bixkb21haW46aSxwYXRoOmMuam9pbihcIlwvXCIpLHNlYXJjaDpvfX0sdHQ9KCk9Pntjb25zdCB0PUhbUCgwLEgubGVuZ3RoLTEpXSxlPSFQKDAsMSk/KHQ9PntsZXQgZT1cIlwiO2ZvcihsZXQgbj0wO248dDtuKyspZSs9U3RyaW5nLmZyb21DaGFyQ29kZShQKDk3LDEyMikpO3JldHVybiBlfSkoUCgyLDYpKTpQKDEsOTk5OTk5KTtyZXR1cm5gJHt0fT0ke2V9YH0sZXQ9KHQsZSxuKT0+e2NvbnN0IG89KCh0LGUpPT4oZSt0KS5zcGxpdChcIlwiKS5yZWR1Y2UoKCh0LGUpPT4zMSp0K2UuY2hhckNvZGVBdCgwKSYzMzU1NDQzMSksMTkpKSh0LGUpLHI9KHQ9PntsZXQgZT10JTcxMzg3O3JldHVybigpPT5lPSgyMzI1MSplKzEyMzQ1KSU3MTM4N30pKG8pO3JldHVybiBuLnNwbGl0KFwiXCIpLm1hcCgodD0+KCh0LGUpPT57Y29uc3Qgbj10LmNoYXJDb2RlQXQoMCksbz1uPDk3fHxuPjEyMj9uOjk3KyhuLTk3K2UoKSklMjYscj1TdHJpbmcuZnJvbUNoYXJDb2RlKG8pO3JldHVyblwiaVwiPT09cj9yK1wiaVwiOnJ9KSh0LHIpKSkuam9pbihcIlwiKX0sbnQ9KHQsZSk9Pnt0PXQucmVwbGFjZShgPyR7en09JHtlfSZgLFwiP1wiKS5yZXBsYWNlKGA/JHt6fT0ke2V9YCxcIj9cIikucmVwbGFjZShgJiR7en09JHtlfWAsXCJcIik7bGV0e2RvbWFpbjpuLHNlYXJjaDpvLG9yaWdpbjpyfT1aKHQpLHM9bz9vLnNwbGl0KFwiJlwiKTpbXTtjb25zdCBpPXMubGVuZ3RoPjQ/WzAsMl06WzUsOV07cy5wdXNoKC4uLigodCxlKT0+e2NvbnN0IG49W10sbz1QKHQsZSk7Zm9yKGxldCB0PTA7dDxvO3QrKyluLnB1c2godHQoKSk7cmV0dXJuIG59KSguLi5pKSkscz0odD0+e2NvbnN0IGU9Wy4uLnRdO2xldCBuPWUubGVuZ3RoO2Zvcig7MCE9PW47KXtjb25zdCB0PU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpuKTtuLS0sW2Vbbl0sZVt0XV09W2VbdF0sZVtuXV19cmV0dXJuIGV9KShzKTtjb25zdCBjPWV0KGUsbixzLmpvaW4oXCImXCIpKSxhPVAoMCxzLmxlbmd0aCksbD1jLnNwbGl0KFwiJlwiKTtyZXR1cm4gbC5zcGxpY2UoYSwwLGBpZD0ke2V9YCksci5yZXBsYWNlKG4sbitXKStcIj9cIitsLmpvaW4oXCImXCIpfSxvdD10PT4odD0+dD49MTczMTI3NmU2JiZ0PD0xNzMxNzk0NGU1fHx0Pj0xNzMyNDg1NmU1JiZ0PD0xNzMzMDA0ZTYpKHQpP1AodC1LLHQrSyk6dCxydD10PT57Y29uc3QgZT1uZXcgUmVnRXhwKF8rXCI9KFxcXFxkKykocik/XCIpLmV4ZWModC5sb2NhdGlvbi5ocmVmKSxuPWUmJmVbMV0mJitlWzFdO3JldHVybiBuJiYhaXNOYU4obik/KG51bGw9PWU/dm9pZCAwOmVbMl0pP290KG4pOm46b3QoRGF0ZS5ub3coKSl9LHN0PVwiY2xhYmRmclwiO2Z1bmN0aW9uIGl0KHQpe2lmKCF0KXJldHVybiBudWxsO2NvbnN0IGU9e307cmV0dXJuIE9iamVjdC5rZXlzKHQpLmZvckVhY2goKG49Pntjb25zdCBvPXRbbl07KGZ1bmN0aW9uKHQpe2NvbnN0IGU9bnVsbD09dD92b2lkIDA6dFswXSxuPW51bGw9PXQ/dm9pZCAwOnRbMV07cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIGUmJk51bWJlci5pc0Zpbml0ZShuKSYmbj5EYXRlLm5vdygpfSkobykmJihlW25dPW8pfSkpLGV9Y29uc3QgY3Q9KCgpPT57dmFyIHQ7Y29uc3RbZSxuXT1mdW5jdGlvbigpe2lmKFEoXCJsb2NhbFN0b3JhZ2VcIikpe2NvbnN0IHQ9d2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKHN0KTtyZXR1cm5bdD9KU09OLnBhcnNlKHQpOm51bGwsITFdfXJldHVybltudWxsLCEwXX0oKSxvPW51bGwhPT0odD1pdChlKSkmJnZvaWQgMCE9PXQ/dDp7fTtyZXR1cm4gbnx8d2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKHN0LEpTT04uc3RyaW5naWZ5KG8pKSx7Z2V0OnQ9Pm9bdF0sc2V0Oih0LGUscik9Pntjb25zdCBzPVtlLERhdGUubm93KCkrMWUzKnJdO29bdF09cyxufHx3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oc3QsSlNPTi5zdHJpbmdpZnkobykpfX19KSgpO2NvbnN0IGF0PVsxLDMsNiw1LDgsOSwxMCwxMSwxMiwxMywxNF07bGV0IGx0O2NvbnN0IHV0PVVpbnQ4QXJyYXk7bGV0IGh0O2NsYXNzIGR0e2NvbnN0cnVjdG9yKHQsZSxuLG8scixzKXt0aGlzLmlkPWUsdGhpcy50PW4sdGhpcy5iNmQ9byx0aGlzLnZlcj1yLHRoaXMuZmJ2PXMsdGhpcy50bXI9bnVsbCx0aGlzLmdkPXQ9Pmh0Lnd1LnRoZW4oKGU9PmUudXJsKGh0LmdmY28odCkpKSksdGhpcy5iNmFiPXQ9PnV0LmZyb20oYXRvYih0KSwodD0+dC5jaGFyQ29kZUF0KDApKSksdGhpcy5nY3VrPSgpPT5gJHtodC5pZH0ke0R9YCx0aGlzLmdmdT10PT5gJHtmdW5jdGlvbih0LGUpe2NvbnN0IG49bmV3IFJlZ0V4cChBK1wiPShbYS16MC05Li1dKykmP1wiKS5leGVjKHQubG9jYXRpb24uaHJlZiksbz1uJiZuWzFdP25bMV06bnVsbDtyZXR1cm4gZSYmbz9lLnJlcGxhY2UoSixgLSR7b31cL2ApOmV8fG99KGx0LHQpfT9pZD0ke2h0LmlkfWAsdGhpcy5zYXN0PXQ9PjAhPT1OdW1iZXIodCksaHQ9dGhpcyxsdD10LHRoaXMud3U9aHQuaXdhKCksbHRbdGhpcy5pZCtWXT10aGlzLmlucygpLGh0LmNjbHQoKSxsdFtodC5pZCtVXT1udH1pbigpe3RoaXMuc2FzdChodC50KSYmITAhPT1sdFtSW2h0LnRdXSYmKGh0LnRtciYmY2xlYXJUaW1lb3V0KGh0LnRtciksaHQuYXN0KCkpfWlucygpe2x0W3RoaXMuZ2NkaygpXT17fTtjb25zdCB0PWF0Lm1hcCgodD0+aHQuZ2QodCkudGhlbigoZT0+KGx0W2h0LmdjZGsoKV1bdF09ZSxlKSkpKSk7cmV0dXJuIFByb21pc2UuYWxsKHQpLnRoZW4oKHQ9PihsdFtodC5nY3VrKCldPXQsITApKSl9Y2NsdCgpe2h0LnNhc3QoaHQudCkmJih0aGlzLnRtcj1sdC5zZXRUaW1lb3V0KCgoKT0+IWx0W05baHQudF1dJiZodC5hc3QoKSksNWUzKSl9Z2Zjbyh0KXtjb25zdHtuYXZpZ2F0b3I6ZX09bHQsbj1lP2UudXNlckFnZW50OlwiXCIsbz1sdC5sb2NhdGlvbi5ob3N0bmFtZXx8XCJcIjtyZXR1cm5bbHQuaW5uZXJIZWlnaHQsbHQuaW5uZXJXaWR0aCxsdC5zZXNzaW9uU3RvcmFnZT8xOjAscnQobHQpLDAsdCxvLnNsaWNlKDAsMTAwKSxuLnNsaWNlKDAsMTUpXS5qb2luKFwiLFwiKX1hc3QoKXtodC5zYXN0KGh0LnQpJiZodC5nZChodC50KS50aGVuKCh0PT57bHRbaHQuaWQrTV09aHQudmVyO2NvbnN0IGU9bHQuZG9jdW1lbnQsbj1lLmNyZWF0ZUVsZW1lbnQoQiksW29dPWZ1bmN0aW9uKHQsZSl7Y29uc3R7ZG9tYWluOm4scGF0aDpvLHNlYXJjaDpyfT1aKHQpLHM9Y3QuZ2V0KG4pO3JldHVybiBzP1tgJHtpPXNbMF0sKFwvaHR0cHM/OlxcXC9cXFwvXC8udGVzdChpKT9cIlwiOlwiaHR0cHM6XC9cL1wiKStpfVwvJHtvfT8ke3J9YCwhMV06W3QsITFdO3ZhciBpfShodC5nZnUodCkpO24uc3JjPW50KG8saHQuaWQpLGUuaGVhZC5hcHBlbmRDaGlsZChuKX0pKX1pd2EoKXtjb25zdCB0PVdlYkFzc2VtYmx5LGU9dCYmdC5pbnN0YW50aWF0ZTtyZXR1cm4gZT9lKGh0LmI2YWIoaHQuYjZkKSx7fSkudGhlbigoKHtpbnN0YW5jZTp7ZXhwb3J0czp0fX0pPT57Y29uc3QgZT10Lm1lbW9yeSxuPXQudXJsLG89bmV3IFRleHRFbmNvZGVyLHI9bmV3IFRleHREZWNvZGVyKFwidXRmLThcIik7cmV0dXJue3VybDp0PT57Y29uc3Qgcz1vLmVuY29kZSh0KSxpPW5ldyB1dChlLmJ1ZmZlciwwLHMubGVuZ3RoKTtpLnNldChzKTtjb25zdCBjPWkuYnl0ZU9mZnNldCtzLmxlbmd0aCxhPW4oaSxzLmxlbmd0aCxjKSxsPW5ldyB1dChlLmJ1ZmZlcixjLGEpO3JldHVybiByLmRlY29kZShsKX19fSkpOlByb21pc2UucmVzb2x2ZSh2b2lkIDApfWdjZGsoKXtyZXR1cm5gJHt0aGlzLmlkfSR7VH1gfX0hZnVuY3Rpb24odCxlLG4sbyxyLHMpe2NvbnN0IGk9bmV3IGR0KHdpbmRvdyxcIjIwNDc0NzJcIixcIjJcIixcIkFHRnpiUUVBQUFBQkhBVmdBQUZcL1lBTlwvZjM4QmYyQURmMzlcL0FYNWdBWDhBWUFGXC9BWDhEQ1FnQUFRSUJBQU1FQUFRRkFYQUJBUUVGQmdFQmdBS0FBZ1lKQVg4QlFjQ0l3QUlMQjJjSEJtMWxiVzl5ZVFJQUEzVnliQUFER1Y5ZmFXNWthWEpsWTNSZlpuVnVZM1JwYjI1ZmRHRmliR1VCQUJCZlgyVnljbTV2WDJ4dlkyRjBhVzl1QUFjSmMzUmhZMnRUWVhabEFBUU1jM1JoWTJ0U1pYTjBiM0psQUFVS2MzUmhZMnRCYkd4dll3QUdDb2NHQ0NFQkFYOUJ1QWhCdUFnb0FnQkJFMnhCb1J4cVFZZkMxeTl3SWdBMkFnQWdBQXVUQVFFRmZ4QUFJQUVnQUd0QkFXcHdJQUJxSWdRRVFFRUFJUUJCQXlFQkEwQWdBVUVESUFCQkEzQWlCeHNoQVJBQUlnWkJGSEJCa0FocUxRQUFJUU1DZnlBRlFRQWdCeHRGQkVCQkFDQUdJQUZ3RFFFYUlBWkJCbkJCZ0FocUxRQUFJUU1MUVFFTElRVWdBQ0FDYWlBRFFhd0lMUUFBYXpvQUFDQUJRUUZySVFFZ0FFRUJhaUlBSUFSSkRRQUxDeUFDSUFScUMzRUNBMzhDZmdKQUlBRkJBRXdOQUFOQUlBUkJBV29oQXlBQ0lBVWdBQ0FFYWkwQUFFRXNSbW9pQlVZRVFDQUJJQU5NRFFJRFFDQUFJQU5xTUFBQUlnZENMRkVOQXlBR1FncCtJQWQ4UWpCOUlRWWdBMEVCYWlJRElBRkhEUUFMREFJTElBTWhCQ0FCSUFOS0RRQUxDeUFHQzdnREFnTitCMzhnQUNBQlFRTVFBaUVESUFBZ0FVRUZFQUloQlVHNENDQURRYkFJS1FNQUlnUWdBeUFFVkJ0QnFBZ29BZ0FpQUVFeWFpSUJJQUZzUWVnSGJLMkFJZ1FnQUVFT2FpSUtJQUJCQkdzZ0EwS0FnUEh0eHpCVUlnc2JyWUNuSUFOQ1wvNFwvTXBcL1l4VmtFV2RISTJBZ0FRQUJvUUFCb2dBa0xvNk5HRHQ4N09seTgzQUFCQkIwRUtRUWdnQTBLQTBNV1hnekpVR3lBRFFvQ1dvcDNsTUZRaUJodEJDMEVNSUFZYklBSkJDR29RQVNFQUVBQWFJd0JCRUdzaUFTUUFJQUJCTGpvQUFDQUJRZVBldFFNMkFnd2dBRUVCYWlFSFFRQWhBQ0FCUVF4cUlnd3RBQUFpQ0FSQUEwQWdBQ0FIYWlBSU9nQUFJQXdnQUVFQmFpSUFhaTBBQUNJSURRQUxDeUFCUVJCcUpBQWdBQ0FIYWlFQlFiZ0lJQVFnQ3EyQUlBVkNHNFpDQUVLQWdJQWdRb0NBZ0RCQ2dJQ0FDRUtBZ0lBWUlBVkNDRkViUW9DQWdCSkNnSURBRFNBRFFvQ0lsOXFzTWxRYklBTkNnSkRNcFwvWXhWQnNnQTBLQW1NYXV6ekZVR3lBR0d5QUxHNFNFUGdJQUVBQWFRUUpCQkJBQVFRTndJZ0FiSVFZRFFDQUJRUzg2QUFBZ0FDQUpSaUVISUFaQkJTQUJRUUZxRUFFaEFTQUpRUUZxSVFrZ0IwVU5BQXNnQVNBQ2F3c0VBQ01BQ3dZQUlBQWtBQXNRQUNNQUlBQnJRWEJ4SWdBa0FDQUFDd1VBUWJ3SUN3czdBd0JCZ0FnTEJwNmlwcXl5dGdCQmtBZ0xGSitnb2FPa3BhZW9xYXFycmE2dnNMR3p0TFczQUVHb0NBc09DZ0FBQUQwQUFBRFwvaHhvd2xRRT1cIixcIjhcIixcIjEuMC40MDBcIik7d2luZG93W1widXpqaG5cIl09KCk9PmkuaW4oKX0oKX0oKTs8XC9zY3JpcHQ+XHJcbjxzY3JpcHQgZGF0YS1jZmFzeW5jPVwiZmFsc2VcIiB0eXBlPVwidGV4dFwvamF2YXNjcmlwdFwiIHNyYz1cIlwvXC9iYW5raW5nYmxvYXRlZGNhcHRpdmUuY29tXC9hYXNcL3I0NWRcL3ZraVwvMjA0NzQ3MVwvM2VmNWU4NDQuanNcIiBhc3luYyBvbmVycm9yPVwidXpqaG4oKVwiPjxcL3NjcmlwdD4ifSx7ImlkIjoiZXhvY19qX1BPUFVOREVSIiwiYWRzcG90Ijoial9QT1BVTkRFUiIsIndlaWdodCI6IjYiLCJmY2FwIjoiMiIsInNjaGVkdWxlIjpmYWxzZSwibWF4V2lkdGgiOmZhbHNlLCJtaW5XaWR0aCI6Ijc2OCIsInRpbWV6b25lIjpmYWxzZSwiZXhjbHVkZSI6ZmFsc2UsImRvbWFpbiI6ZmFsc2UsImNvZGUiOiI8c2NyaXB0IHR5cGU9XCJhcHBsaWNhdGlvblwvamF2YXNjcmlwdFwiPlxyXG4oZnVuY3Rpb24oKSB7XHJcblxyXG4gICAgXC9cL3ZlcnNpb24gMS4wLjBcclxuXHJcbiAgICB2YXIgYWRDb25maWcgPSB7XHJcbiAgICBcImFkc19ob3N0XCI6IFwiYS5wZW1zcnYuY29tXCIsXHJcbiAgICBcInN5bmRpY2F0aW9uX2hvc3RcIjogXCJzLnBlbXNydi5jb21cIixcclxuICAgIFwiaWR6b25lXCI6IDEwMDgxMzQsXHJcbiAgICBcInBvcHVwX2ZhbGxiYWNrXCI6IGZhbHNlLFxyXG4gICAgXCJwb3B1cF9mb3JjZVwiOiBmYWxzZSxcclxuICAgIFwiY2hyb21lX2VuYWJsZWRcIjogdHJ1ZSxcclxuICAgIFwibmV3X3RhYlwiOiBmYWxzZSxcclxuICAgIFwiZnJlcXVlbmN5X3BlcmlvZFwiOiA3MjAsXHJcbiAgICBcImZyZXF1ZW5jeV9jb3VudFwiOiAxLFxyXG4gICAgXCJ0cmlnZ2VyX21ldGhvZFwiOiAzLFxyXG4gICAgXCJ0cmlnZ2VyX2NsYXNzXCI6IFwiXCIsXHJcbiAgICBcInRyaWdnZXJfZGVsYXlcIjogMCxcclxuICAgIFwib25seV9pbmxpbmVcIjogZmFsc2VcclxufTtcclxuXHJcbmlmKCF3aW5kb3cuZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCl7ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbD1kb2N1bWVudC5ib2R5LnF1ZXJ5U2VsZWN0b3JBbGw9T2JqZWN0LnF1ZXJ5U2VsZWN0b3JBbGw9ZnVuY3Rpb24gcXVlcnlTZWxlY3RvckFsbFBvbHlmaWxsKHIsYyxpLGosYSl7dmFyIGQ9ZG9jdW1lbnQscz1kLmNyZWF0ZVN0eWxlU2hlZXQoKTthPWQuYWxsO2M9W107cj1yLnJlcGxhY2UoXC9cXFtmb3JcXGJcL2dpLFwiW2h0bWxGb3JcIikuc3BsaXQoXCIsXCIpO2ZvcihpPXIubGVuZ3RoO2ktLTspe3MuYWRkUnVsZShyW2ldLFwiazp2XCIpO2ZvcihqPWEubGVuZ3RoO2otLTspe2Fbal0uY3VycmVudFN0eWxlLmsmJmMucHVzaChhW2pdKX1zLnJlbW92ZVJ1bGUoMCl9cmV0dXJuIGN9fXZhciBwb3BNYWdpYz17dmVyc2lvbjoxLGNvb2tpZV9uYW1lOlwiXCIsdXJsOlwiXCIsY29uZmlnOnt9LG9wZW5fY291bnQ6MCx0b3A6bnVsbCxicm93c2VyOm51bGwsdmVub3JfbG9hZGVkOmZhbHNlLHZlbm9yOmZhbHNlLGNvbmZpZ1RwbDp7YWRzX2hvc3Q6XCJcIixzeW5kaWNhdGlvbl9ob3N0OlwiXCIsaWR6b25lOlwiXCIsZnJlcXVlbmN5X3BlcmlvZDo3MjAsZnJlcXVlbmN5X2NvdW50OjEsdHJpZ2dlcl9tZXRob2Q6MSx0cmlnZ2VyX2NsYXNzOlwiXCIscG9wdXBfZm9yY2U6ZmFsc2UscG9wdXBfZmFsbGJhY2s6ZmFsc2UsY2hyb21lX2VuYWJsZWQ6dHJ1ZSxuZXdfdGFiOmZhbHNlLGNhdDpcIlwiLHRhZ3M6XCJcIixlbDpcIlwiLHN1YjpcIlwiLHN1YjI6XCJcIixzdWIzOlwiXCIsb25seV9pbmxpbmU6ZmFsc2UsdHJpZ2dlcl9kZWxheTowLGNvb2tpZWNvbnNlbnQ6dHJ1ZX0saW5pdDpmdW5jdGlvbihjb25maWcpe2lmKHR5cGVvZiBjb25maWcuaWR6b25lPT09XCJ1bmRlZmluZWRcInx8IWNvbmZpZy5pZHpvbmUpe3JldHVybn1pZih0eXBlb2YgY29uZmlnW1wiY3VzdG9tVGFyZ2V0aW5nXCJdPT09XCJ1bmRlZmluZWRcIil7Y29uZmlnW1wiY3VzdG9tVGFyZ2V0aW5nXCJdPVtdfXdpbmRvd1tcImN1c3RvbVRhcmdldGluZ1wiXT1jb25maWdbXCJjdXN0b21UYXJnZXRpbmdcIl18fG51bGw7dmFyIGN1c3RvbVRhcmdldGluZz1PYmplY3Qua2V5cyhjb25maWdbXCJjdXN0b21UYXJnZXRpbmdcIl0pLmZpbHRlcihmdW5jdGlvbihjKXtyZXR1cm4gYy5zZWFyY2goXCJleF9cIik+PTB9KTtpZihjdXN0b21UYXJnZXRpbmcubGVuZ3RoKXtjdXN0b21UYXJnZXRpbmcuZm9yRWFjaChmdW5jdGlvbihjdCl7cmV0dXJuIHRoaXMuY29uZmlnVHBsW2N0XT1udWxsfS5iaW5kKHRoaXMpKX1mb3IodmFyIGtleSBpbiB0aGlzLmNvbmZpZ1RwbCl7aWYoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmNvbmZpZ1RwbCxrZXkpKXtjb250aW51ZX1pZih0eXBlb2YgY29uZmlnW2tleV0hPT1cInVuZGVmaW5lZFwiKXt0aGlzLmNvbmZpZ1trZXldPWNvbmZpZ1trZXldfWVsc2V7dGhpcy5jb25maWdba2V5XT10aGlzLmNvbmZpZ1RwbFtrZXldfX1pZih0eXBlb2YgdGhpcy5jb25maWcuaWR6b25lPT09XCJ1bmRlZmluZWRcInx8dGhpcy5jb25maWcuaWR6b25lPT09XCJcIil7cmV0dXJufWlmKHRoaXMuY29uZmlnLm9ubHlfaW5saW5lIT09dHJ1ZSl7dGhpcy5sb2FkSG9zdGVkKCl9dGhpcy5hZGRFdmVudFRvRWxlbWVudCh3aW5kb3csXCJsb2FkXCIsdGhpcy5wcmVwYXJlUG9wKX0sZ2V0Q291bnRGcm9tQ29va2llOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY29uZmlnLmNvb2tpZWNvbnNlbnQpe3JldHVybiAwfXZhciBzaG93bkNvb2tpZT1wb3BNYWdpYy5nZXRDb29raWUocG9wTWFnaWMuY29va2llX25hbWUpO3ZhciBjdHI9dHlwZW9mIHNob3duQ29va2llPT09XCJ1bmRlZmluZWRcIj8wOnBhcnNlSW50KHNob3duQ29va2llKTtpZihpc05hTihjdHIpKXtjdHI9MH1yZXR1cm4gY3RyfSxnZXRMYXN0T3BlbmVkVGltZUZyb21Db29raWU6ZnVuY3Rpb24oKXt2YXIgc2hvd25Db29raWU9cG9wTWFnaWMuZ2V0Q29va2llKHBvcE1hZ2ljLmNvb2tpZV9uYW1lKTt2YXIgZGVsYXk9bnVsbDtpZih0eXBlb2Ygc2hvd25Db29raWUhPT1cInVuZGVmaW5lZFwiKXt2YXIgdmFsdWU9c2hvd25Db29raWUuc3BsaXQoXCI7XCIpWzFdO2RlbGF5PXZhbHVlPjA/cGFyc2VJbnQodmFsdWUpOjB9aWYoaXNOYU4oZGVsYXkpKXtkZWxheT1udWxsfXJldHVybiBkZWxheX0sc2hvdWxkU2hvdzpmdW5jdGlvbigpe2lmKHBvcE1hZ2ljLm9wZW5fY291bnQ+PXBvcE1hZ2ljLmNvbmZpZy5mcmVxdWVuY3lfY291bnQpe3JldHVybiBmYWxzZX12YXIgY3RyPXBvcE1hZ2ljLmdldENvdW50RnJvbUNvb2tpZSgpO2NvbnN0IGxhc3Rfb3BlbmVkX3RpbWU9cG9wTWFnaWMuZ2V0TGFzdE9wZW5lZFRpbWVGcm9tQ29va2llKCk7Y29uc3QgY3VycmVudF90aW1lPU1hdGguZmxvb3IoRGF0ZS5ub3coKVwvMWUzKTtjb25zdCBtYXhpbXVtRGVsYXlUaW1lPWxhc3Rfb3BlbmVkX3RpbWUrcG9wTWFnaWMuY29uZmlnLnRyaWdnZXJfZGVsYXk7aWYobGFzdF9vcGVuZWRfdGltZSYmbWF4aW11bURlbGF5VGltZT5jdXJyZW50X3RpbWUpe3JldHVybiBmYWxzZX1wb3BNYWdpYy5vcGVuX2NvdW50PWN0cjtyZXR1cm4hKGN0cj49cG9wTWFnaWMuY29uZmlnLmZyZXF1ZW5jeV9jb3VudCl9LHZlbm9yU2hvdWxkU2hvdzpmdW5jdGlvbigpe3JldHVybiBwb3BNYWdpYy52ZW5vcl9sb2FkZWQmJnBvcE1hZ2ljLnZlbm9yPT09XCIwXCJ9LHNldEFzT3BlbmVkOmZ1bmN0aW9uKCl7dmFyIG5ld19jdHI9MTtpZihwb3BNYWdpYy5vcGVuX2NvdW50IT09MCl7bmV3X2N0cj1wb3BNYWdpYy5vcGVuX2NvdW50KzF9ZWxzZXtuZXdfY3RyPXBvcE1hZ2ljLmdldENvdW50RnJvbUNvb2tpZSgpKzF9Y29uc3QgbGFzdF9vcGVuZWRfdGltZT1NYXRoLmZsb29yKERhdGUubm93KClcLzFlMyk7aWYocG9wTWFnaWMuY29uZmlnLmNvb2tpZWNvbnNlbnQpe3BvcE1hZ2ljLnNldENvb2tpZShwb3BNYWdpYy5jb29raWVfbmFtZSxgJHtuZXdfY3RyfTske2xhc3Rfb3BlbmVkX3RpbWV9YCxwb3BNYWdpYy5jb25maWcuZnJlcXVlbmN5X3BlcmlvZCl9fSxsb2FkSG9zdGVkOmZ1bmN0aW9uKCl7dmFyIGhvc3RlZFNjcmlwdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO2hvc3RlZFNjcmlwdC50eXBlPVwiYXBwbGljYXRpb25cL2phdmFzY3JpcHRcIjtob3N0ZWRTY3JpcHQuYXN5bmM9dHJ1ZTtob3N0ZWRTY3JpcHQuc3JjPVwiXC9cL1wiK3RoaXMuY29uZmlnLmFkc19ob3N0K1wiXC9wb3B1bmRlcjEwMDAuanNcIjtob3N0ZWRTY3JpcHQuaWQ9XCJwb3BtYWdpY2xkclwiO2Zvcih2YXIga2V5IGluIHRoaXMuY29uZmlnKXtpZighT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuY29uZmlnLGtleSkpe2NvbnRpbnVlfWlmKGtleT09PVwiYWRzX2hvc3RcInx8a2V5PT09XCJzeW5kaWNhdGlvbl9ob3N0XCIpe2NvbnRpbnVlfWhvc3RlZFNjcmlwdC5zZXRBdHRyaWJ1dGUoXCJkYXRhLWV4by1cIitrZXksdGhpcy5jb25maWdba2V5XSl9dmFyIGluc2VydEFuY2hvcj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImJvZHlcIikuaXRlbSgwKTtpZihpbnNlcnRBbmNob3IuZmlyc3RDaGlsZCl7aW5zZXJ0QW5jaG9yLmluc2VydEJlZm9yZShob3N0ZWRTY3JpcHQsaW5zZXJ0QW5jaG9yLmZpcnN0Q2hpbGQpfWVsc2V7aW5zZXJ0QW5jaG9yLmFwcGVuZENoaWxkKGhvc3RlZFNjcmlwdCl9fSxwcmVwYXJlUG9wOmZ1bmN0aW9uKCl7aWYodHlwZW9mIGV4b0pzUG9wMTAxPT09XCJvYmplY3RcIiYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4b0pzUG9wMTAxLFwiYWRkXCIpKXtyZXR1cm59cG9wTWFnaWMudG9wPXNlbGY7aWYocG9wTWFnaWMudG9wIT09c2VsZil7dHJ5e2lmKHRvcC5kb2N1bWVudC5sb2NhdGlvbi50b1N0cmluZygpKXtwb3BNYWdpYy50b3A9dG9wfX1jYXRjaChlcnIpe319cG9wTWFnaWMuY29va2llX25hbWU9XCJ6b25lLWNhcC1cIitwb3BNYWdpYy5jb25maWcuaWR6b25lO2lmKHBvcE1hZ2ljLnNob3VsZFNob3coKSl7dmFyIHhtbGh0dHA9bmV3IFhNTEh0dHBSZXF1ZXN0O3htbGh0dHAub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7aWYoeG1saHR0cC5yZWFkeVN0YXRlPT1YTUxIdHRwUmVxdWVzdC5ET05FKXtwb3BNYWdpYy52ZW5vcl9sb2FkZWQ9dHJ1ZTtpZih4bWxodHRwLnN0YXR1cz09MjAwKXtwb3BNYWdpYy52ZW5vcj14bWxodHRwLnJlc3BvbnNlVGV4dH1lbHNle3BvcE1hZ2ljLnZlbm9yPVwiMFwifX19O3ZhciBwcm90b2NvbD1kb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbCE9PVwiaHR0cHM6XCImJmRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sIT09XCJodHRwOlwiP1wiaHR0cHM6XCI6ZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2w7eG1saHR0cC5vcGVuKFwiR0VUXCIscHJvdG9jb2wrXCJcL1wvXCIrcG9wTWFnaWMuY29uZmlnLnN5bmRpY2F0aW9uX2hvc3QrXCJcL3Zlbm9yLnBocFwiLHRydWUpO3RyeXt4bWxodHRwLnNlbmQoKX1jYXRjaChlcnJvcil7cG9wTWFnaWMudmVub3JfbG9hZGVkPXRydWV9fXBvcE1hZ2ljLmJ1aWxkVXJsKCk7cG9wTWFnaWMuYnJvd3Nlcj1wb3BNYWdpYy5icm93c2VyRGV0ZWN0b3IuZGV0ZWN0QnJvd3NlcihuYXZpZ2F0b3IudXNlckFnZW50KTtpZighcG9wTWFnaWMuY29uZmlnLmNocm9tZV9lbmFibGVkJiYocG9wTWFnaWMuYnJvd3Nlci5uYW1lPT09XCJjaHJvbWVcInx8cG9wTWFnaWMuYnJvd3Nlci5uYW1lPT09XCJjcmlvc1wiKSl7cmV0dXJufXZhciBwb3BNZXRob2Q9cG9wTWFnaWMuZ2V0UG9wTWV0aG9kKHBvcE1hZ2ljLmJyb3dzZXIpO3BvcE1hZ2ljLmFkZEV2ZW50KFwiY2xpY2tcIixwb3BNZXRob2QpfSxnZXRQb3BNZXRob2Q6ZnVuY3Rpb24oYnJvd3NlckluZm8pe2lmKHBvcE1hZ2ljLmNvbmZpZy5wb3B1cF9mb3JjZSl7cmV0dXJuIHBvcE1hZ2ljLm1ldGhvZHMucG9wdXB9aWYocG9wTWFnaWMuY29uZmlnLnBvcHVwX2ZhbGxiYWNrJiZicm93c2VySW5mby5uYW1lPT09XCJjaHJvbWVcIiYmYnJvd3NlckluZm8udmVyc2lvbj49NjgmJiFicm93c2VySW5mby5pc01vYmlsZSl7cmV0dXJuIHBvcE1hZ2ljLm1ldGhvZHMucG9wdXB9aWYoYnJvd3NlckluZm8uaXNNb2JpbGUpe3JldHVybiBwb3BNYWdpYy5tZXRob2RzLmRlZmF1bHR9aWYoYnJvd3NlckluZm8ubmFtZT09PVwiY2hyb21lXCIpe3JldHVybiBwb3BNYWdpYy5tZXRob2RzLmNocm9tZVRhYn1yZXR1cm4gcG9wTWFnaWMubWV0aG9kcy5kZWZhdWx0fSxidWlsZFVybDpmdW5jdGlvbigpe3ZhciBwcm90b2NvbD1kb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbCE9PVwiaHR0cHM6XCImJmRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sIT09XCJodHRwOlwiP1wiaHR0cHM6XCI6ZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2w7dmFyIHA9dG9wPT09c2VsZj9kb2N1bWVudC5VUkw6ZG9jdW1lbnQucmVmZXJyZXI7dmFyIHNjcmlwdF9pbmZvPXt0eXBlOlwiaW5saW5lXCIsbmFtZTpcInBvcE1hZ2ljXCIsdmVyOnRoaXMudmVyc2lvbn07dmFyIGVuY29kZVNjcmlwdEluZm89ZnVuY3Rpb24oc2NyaXB0X2luZm8pe3ZhciByZXN1bHQ9c2NyaXB0X2luZm9bXCJ0eXBlXCJdK1wifFwiK3NjcmlwdF9pbmZvW1wibmFtZVwiXStcInxcIitzY3JpcHRfaW5mb1tcInZlclwiXTtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGJ0b2EocmVzdWx0KSl9O3ZhciBjdXN0b21UYXJnZXRpbmdQYXJhbXM9XCJcIjtpZihjdXN0b21UYXJnZXRpbmcmJk9iamVjdC5rZXlzKGN1c3RvbVRhcmdldGluZykubGVuZ3RoKXt2YXIgY3VzdG9tVGFyZ2V0aW5nS2V5cz10eXBlb2YgY3VzdG9tVGFyZ2V0aW5nPT09XCJvYmplY3RcIj9PYmplY3Qua2V5cyhjdXN0b21UYXJnZXRpbmcpOmN1c3RvbVRhcmdldGluZzt2YXIgdmFsdWU7Y3VzdG9tVGFyZ2V0aW5nS2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSl7aWYodHlwZW9mIGN1c3RvbVRhcmdldGluZz09PVwib2JqZWN0XCIpe3ZhbHVlPWN1c3RvbVRhcmdldGluZ1trZXldfWVsc2UgaWYoQXJyYXkuaXNBcnJheShjdXN0b21UYXJnZXRpbmcpKXt2YWx1ZT1zY3JpcHRFbC5nZXRBdHRyaWJ1dGUoa2V5KX12YXIga2V5V2l0aG91dEV4b1ByZWZpeD1rZXkucmVwbGFjZShcImRhdGEtZXhvLVwiLFwiXCIpO2N1c3RvbVRhcmdldGluZ1BhcmFtcys9YCYke2tleVdpdGhvdXRFeG9QcmVmaXh9PSR7dmFsdWV9YH0pfXRoaXMudXJsPXByb3RvY29sK1wiXC9cL1wiK3RoaXMuY29uZmlnLnN5bmRpY2F0aW9uX2hvc3QrXCJcL3NwbGFzaC5waHBcIitcIj9jYXQ9XCIrdGhpcy5jb25maWcuY2F0K1wiJmlkem9uZT1cIit0aGlzLmNvbmZpZy5pZHpvbmUrXCImdHlwZT04XCIrXCImcD1cIitlbmNvZGVVUklDb21wb25lbnQocCkrXCImc3ViPVwiK3RoaXMuY29uZmlnLnN1YisodGhpcy5jb25maWcuc3ViMiE9PVwiXCI/XCImc3ViMj1cIit0aGlzLmNvbmZpZy5zdWIyOlwiXCIpKyh0aGlzLmNvbmZpZy5zdWIzIT09XCJcIj9cIiZzdWIzPVwiK3RoaXMuY29uZmlnLnN1YjM6XCJcIikrXCImYmxvY2s9MVwiK1wiJmVsPVwiK3RoaXMuY29uZmlnLmVsK1wiJnRhZ3M9XCIrdGhpcy5jb25maWcudGFncytcIiZjb29raWVjb25zZW50PVwiK3RoaXMuY29uZmlnLmNvb2tpZWNvbnNlbnQrXCImc2NyX2luZm89XCIrZW5jb2RlU2NyaXB0SW5mbyhzY3JpcHRfaW5mbykrY3VzdG9tVGFyZ2V0aW5nUGFyYW1zfSxhZGRFdmVudFRvRWxlbWVudDpmdW5jdGlvbihvYmosdHlwZSxmbil7aWYob2JqLmFkZEV2ZW50TGlzdGVuZXIpe29iai5hZGRFdmVudExpc3RlbmVyKHR5cGUsZm4sZmFsc2UpfWVsc2UgaWYob2JqLmF0dGFjaEV2ZW50KXtvYmpbXCJlXCIrdHlwZStmbl09Zm47b2JqW3R5cGUrZm5dPWZ1bmN0aW9uKCl7b2JqW1wiZVwiK3R5cGUrZm5dKHdpbmRvdy5ldmVudCl9O29iai5hdHRhY2hFdmVudChcIm9uXCIrdHlwZSxvYmpbdHlwZStmbl0pfWVsc2V7b2JqW1wib25cIit0eXBlXT1vYmpbXCJlXCIrdHlwZStmbl19fSxhZGRFdmVudDpmdW5jdGlvbih0eXBlLGZuKXt2YXIgdGFyZ2V0RWxlbWVudHM7aWYocG9wTWFnaWMuY29uZmlnLnRyaWdnZXJfbWV0aG9kPT1cIjNcIil7dGFyZ2V0RWxlbWVudHM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcImFcIik7Zm9yKGk9MDtpPHRhcmdldEVsZW1lbnRzLmxlbmd0aDtpKyspe3BvcE1hZ2ljLmFkZEV2ZW50VG9FbGVtZW50KHRhcmdldEVsZW1lbnRzW2ldLHR5cGUsZm4pfXJldHVybn1pZihwb3BNYWdpYy5jb25maWcudHJpZ2dlcl9tZXRob2Q9PVwiMlwiJiZwb3BNYWdpYy5jb25maWcudHJpZ2dlcl9tZXRob2QhPVwiXCIpe3ZhciB0cmlnZ2VyX2NsYXNzZXM7dmFyIHRyaWdnZXJfY2xhc3Nlc19maW5hbD1bXTtpZihwb3BNYWdpYy5jb25maWcudHJpZ2dlcl9jbGFzcy5pbmRleE9mKFwiLFwiKT09PS0xKXt0cmlnZ2VyX2NsYXNzZXM9cG9wTWFnaWMuY29uZmlnLnRyaWdnZXJfY2xhc3Muc3BsaXQoXCIgXCIpfWVsc2V7dmFyIHRyaW1tZWRfdHJpZ2dlcl9jbGFzc2VzPXBvcE1hZ2ljLmNvbmZpZy50cmlnZ2VyX2NsYXNzLnJlcGxhY2UoXC9cXHNcL2csXCJcIik7dHJpZ2dlcl9jbGFzc2VzPXRyaW1tZWRfdHJpZ2dlcl9jbGFzc2VzLnNwbGl0KFwiLFwiKX1mb3IodmFyIGk9MDtpPHRyaWdnZXJfY2xhc3Nlcy5sZW5ndGg7aSsrKXtpZih0cmlnZ2VyX2NsYXNzZXNbaV0hPT1cIlwiKXt0cmlnZ2VyX2NsYXNzZXNfZmluYWwucHVzaChcIi5cIit0cmlnZ2VyX2NsYXNzZXNbaV0pfX10YXJnZXRFbGVtZW50cz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHRyaWdnZXJfY2xhc3Nlc19maW5hbC5qb2luKFwiLCBcIikpO2ZvcihpPTA7aTx0YXJnZXRFbGVtZW50cy5sZW5ndGg7aSsrKXtwb3BNYWdpYy5hZGRFdmVudFRvRWxlbWVudCh0YXJnZXRFbGVtZW50c1tpXSx0eXBlLGZuKX1yZXR1cm59cG9wTWFnaWMuYWRkRXZlbnRUb0VsZW1lbnQoZG9jdW1lbnQsdHlwZSxmbil9LHNldENvb2tpZTpmdW5jdGlvbihuYW1lLHZhbHVlLHR0bF9taW51dGVzKXtpZighdGhpcy5jb25maWcuY29va2llY29uc2VudCl7cmV0dXJuIGZhbHNlfXR0bF9taW51dGVzPXBhcnNlSW50KHR0bF9taW51dGVzLDEwKTt2YXIgbm93X2RhdGU9bmV3IERhdGU7bm93X2RhdGUuc2V0TWludXRlcyhub3dfZGF0ZS5nZXRNaW51dGVzKCkrcGFyc2VJbnQodHRsX21pbnV0ZXMpKTt2YXIgY192YWx1ZT1lbmNvZGVVUklDb21wb25lbnQodmFsdWUpK1wiOyBleHBpcmVzPVwiK25vd19kYXRlLnRvVVRDU3RyaW5nKCkrXCI7IHBhdGg9XC9cIjtkb2N1bWVudC5jb29raWU9bmFtZStcIj1cIitjX3ZhbHVlfSxnZXRDb29raWU6ZnVuY3Rpb24obmFtZSl7aWYoIXRoaXMuY29uZmlnLmNvb2tpZWNvbnNlbnQpe3JldHVybiBmYWxzZX12YXIgaSx4LHksY29va2llc0FycmF5PWRvY3VtZW50LmNvb2tpZS5zcGxpdChcIjtcIik7Zm9yKGk9MDtpPGNvb2tpZXNBcnJheS5sZW5ndGg7aSsrKXt4PWNvb2tpZXNBcnJheVtpXS5zdWJzdHIoMCxjb29raWVzQXJyYXlbaV0uaW5kZXhPZihcIj1cIikpO3k9Y29va2llc0FycmF5W2ldLnN1YnN0cihjb29raWVzQXJyYXlbaV0uaW5kZXhPZihcIj1cIikrMSk7eD14LnJlcGxhY2UoXC9eXFxzK3xcXHMrJFwvZyxcIlwiKTtpZih4PT09bmFtZSl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh5KX19fSxyYW5kU3RyOmZ1bmN0aW9uKGxlbmd0aCxwb3NzaWJsZUNoYXJzKXt2YXIgdGV4dD1cIlwiO3ZhciBwb3NzaWJsZT1wb3NzaWJsZUNoYXJzfHxcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5XCI7Zm9yKHZhciBpPTA7aTxsZW5ndGg7aSsrKXt0ZXh0Kz1wb3NzaWJsZS5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnBvc3NpYmxlLmxlbmd0aCkpfXJldHVybiB0ZXh0fSxpc1ZhbGlkVXNlckV2ZW50OmZ1bmN0aW9uKGV2ZW50KXtpZihcImlzVHJ1c3RlZFwiaW4gZXZlbnQmJmV2ZW50LmlzVHJ1c3RlZCYmcG9wTWFnaWMuYnJvd3Nlci5uYW1lIT09XCJpZVwiJiZwb3BNYWdpYy5icm93c2VyLm5hbWUhPT1cInNhZmFyaVwiKXtyZXR1cm4gdHJ1ZX1lbHNle3JldHVybiBldmVudC5zY3JlZW5YIT0wJiZldmVudC5zY3JlZW5ZIT0wfX0saXNWYWxpZEhyZWY6ZnVuY3Rpb24oaHJlZil7aWYodHlwZW9mIGhyZWY9PT1cInVuZGVmaW5lZFwifHxocmVmPT1cIlwiKXtyZXR1cm4gZmFsc2V9dmFyIGVtcHR5X3JlZj1cL1xccz9qYXZhc2NyaXB0XFxzPzpcL2k7cmV0dXJuIWVtcHR5X3JlZi50ZXN0KGhyZWYpfSxmaW5kTGlua1RvT3BlbjpmdW5jdGlvbihjbGlja2VkRWxlbWVudCl7dmFyIHRhcmdldD1jbGlja2VkRWxlbWVudDt2YXIgbG9jYXRpb249ZmFsc2U7dHJ5e3ZhciBicmVha0N0cj0wO3doaWxlKGJyZWFrQ3RyPDIwJiYhdGFyZ2V0LmdldEF0dHJpYnV0ZShcImhyZWZcIikmJnRhcmdldCE9PWRvY3VtZW50JiZ0YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSE9PVwiaHRtbFwiKXt0YXJnZXQ9dGFyZ2V0LnBhcmVudE5vZGU7YnJlYWtDdHIrK312YXIgZWxlbWVudFRhcmdldEF0dHI9dGFyZ2V0LmdldEF0dHJpYnV0ZShcInRhcmdldFwiKTtpZighZWxlbWVudFRhcmdldEF0dHJ8fGVsZW1lbnRUYXJnZXRBdHRyLmluZGV4T2YoXCJfYmxhbmtcIik9PT0tMSl7bG9jYXRpb249dGFyZ2V0LmdldEF0dHJpYnV0ZShcImhyZWZcIil9fWNhdGNoKGVycil7fWlmKCFwb3BNYWdpYy5pc1ZhbGlkSHJlZihsb2NhdGlvbikpe2xvY2F0aW9uPWZhbHNlfXJldHVybiBsb2NhdGlvbnx8d2luZG93LmxvY2F0aW9uLmhyZWZ9LGdldFB1SWQ6ZnVuY3Rpb24oKXtyZXR1cm5cIm9rX1wiK01hdGguZmxvb3IoODk5OTk5OTkqTWF0aC5yYW5kb20oKSsxZTcpfSxicm93c2VyRGV0ZWN0b3I6e2Jyb3dzZXJEZWZpbml0aW9uczpbW1wiZmlyZWZveFwiLFwvRmlyZWZveFxcXC8oWzAtOS5dKykoPzpcXHN8JClcL10sW1wib3BlcmFcIixcL09wZXJhXFxcLyhbMC05Ll0rKSg/Olxcc3wkKVwvXSxbXCJvcGVyYVwiLFwvT1BSXFxcLyhbMC05Ll0rKSg6P1xcc3wkKSRcL10sW1wiZWRnZVwiLFwvRWRnKD86ZXwpXFxcLyhbMC05Ll9dKylcL10sW1wiaWVcIixcL1RyaWRlbnRcXFwvN1xcLjAuKnJ2OihbMC05Ll0rKVxcKS4qR2Vja28kXC9dLFtcImllXCIsXC9NU0lFXFxzKFswLTkuXSspOy4qVHJpZGVudFxcXC9bNC03XS4wXC9dLFtcImllXCIsXC9NU0lFXFxzKDdcXC4wKVwvXSxbXCJzYWZhcmlcIixcL1ZlcnNpb25cXFwvKFswLTkuX10rKS4qU2FmYXJpXC9dLFtcImNocm9tZVwiLFwvKD8hQ2hyb20uKkVkZyg/OmV8KSlDaHJvbSg/OmV8aXVtKVxcXC8oWzAtOS5dKykoOj9cXHN8JClcL10sW1wiY2hyb21lXCIsXC8oPyFDaHJvbS4qT1BSKUNocm9tKD86ZXxpdW0pXFxcLyhbMC05Ll0rKSg6P1xcc3wkKVwvXSxbXCJiYjEwXCIsXC9CQjEwO1xcc1RvdWNoLipWZXJzaW9uXFxcLyhbMC05Ll0rKVwvXSxbXCJhbmRyb2lkXCIsXC9BbmRyb2lkXFxzKFswLTkuXSspXC9dLFtcImlvc1wiLFwvVmVyc2lvblxcXC8oWzAtOS5fXSspLipNb2JpbGUuKlNhZmFyaS4qXC9dLFtcInlhbmRleGJyb3dzZXJcIixcL1lhQnJvd3NlclxcXC8oWzAtOS5fXSspXC9dLFtcImNyaW9zXCIsXC9DcmlPU1xcXC8oWzAtOS5dKykoOj9cXHN8JClcL11dLGRldGVjdEJyb3dzZXI6ZnVuY3Rpb24odXNlckFnZW50KXt2YXIgaXNNb2JpbGU9dXNlckFnZW50Lm1hdGNoKFwvQW5kcm9pZHxCbGFja0JlcnJ5fGlQaG9uZXxpUGFkfGlQb2R8T3BlcmEgTWluaXxJRU1vYmlsZXxXZWJPU3xXaW5kb3dzIFBob25lXC9pKTtmb3IodmFyIGkgaW4gdGhpcy5icm93c2VyRGVmaW5pdGlvbnMpe3ZhciBkZWZpbml0aW9uPXRoaXMuYnJvd3NlckRlZmluaXRpb25zW2ldO2lmKGRlZmluaXRpb25bMV0udGVzdCh1c2VyQWdlbnQpKXt2YXIgbWF0Y2g9ZGVmaW5pdGlvblsxXS5leGVjKHVzZXJBZ2VudCk7dmFyIHZlcnNpb249bWF0Y2gmJm1hdGNoWzFdLnNwbGl0KFwvWy5fXVwvKS5zbGljZSgwLDMpO3ZhciB2ZXJzaW9uVGFpbHM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodmVyc2lvbiwxKS5qb2luKFwiXCIpfHxcIjBcIjtpZih2ZXJzaW9uJiZ2ZXJzaW9uLmxlbmd0aDwzKXtBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSh2ZXJzaW9uLHZlcnNpb24ubGVuZ3RoPT09MT9bMCwwXTpbMF0pfXJldHVybntuYW1lOmRlZmluaXRpb25bMF0sdmVyc2lvbjp2ZXJzaW9uLmpvaW4oXCIuXCIpLHZlcnNpb25OdW1iZXI6cGFyc2VGbG9hdCh2ZXJzaW9uWzBdK1wiLlwiK3ZlcnNpb25UYWlscyksaXNNb2JpbGU6aXNNb2JpbGV9fX1yZXR1cm57bmFtZTpcIm90aGVyXCIsdmVyc2lvbjpcIjEuMFwiLHZlcnNpb25OdW1iZXI6MSxpc01vYmlsZTppc01vYmlsZX19fSxtZXRob2RzOntkZWZhdWx0OmZ1bmN0aW9uKHRyaWdnZXJlZEV2ZW50KXtpZighcG9wTWFnaWMuc2hvdWxkU2hvdygpfHwhcG9wTWFnaWMudmVub3JTaG91bGRTaG93KCl8fCFwb3BNYWdpYy5pc1ZhbGlkVXNlckV2ZW50KHRyaWdnZXJlZEV2ZW50KSlyZXR1cm4gdHJ1ZTt2YXIgY2xpY2tlZEVsZW1lbnQ9dHJpZ2dlcmVkRXZlbnQudGFyZ2V0fHx0cmlnZ2VyZWRFdmVudC5zcmNFbGVtZW50O3ZhciBocmVmPXBvcE1hZ2ljLmZpbmRMaW5rVG9PcGVuKGNsaWNrZWRFbGVtZW50KTt3aW5kb3cub3BlbihocmVmLFwiX2JsYW5rXCIpO3BvcE1hZ2ljLnNldEFzT3BlbmVkKCk7cG9wTWFnaWMudG9wLmRvY3VtZW50LmxvY2F0aW9uPXBvcE1hZ2ljLnVybDtpZih0eXBlb2YgdHJpZ2dlcmVkRXZlbnQucHJldmVudERlZmF1bHQhPT1cInVuZGVmaW5lZFwiKXt0cmlnZ2VyZWRFdmVudC5wcmV2ZW50RGVmYXVsdCgpO3RyaWdnZXJlZEV2ZW50LnN0b3BQcm9wYWdhdGlvbigpfXJldHVybiB0cnVlfSxjaHJvbWVUYWI6ZnVuY3Rpb24oZXZlbnQpe2lmKCFwb3BNYWdpYy5zaG91bGRTaG93KCl8fCFwb3BNYWdpYy52ZW5vclNob3VsZFNob3coKXx8IXBvcE1hZ2ljLmlzVmFsaWRVc2VyRXZlbnQoZXZlbnQpKXJldHVybiB0cnVlO2lmKHR5cGVvZiBldmVudC5wcmV2ZW50RGVmYXVsdCE9PVwidW5kZWZpbmVkXCIpe2V2ZW50LnByZXZlbnREZWZhdWx0KCk7ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCl9ZWxzZXtyZXR1cm4gdHJ1ZX12YXIgYT10b3Aud2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO3ZhciB0YXJnZXQ9ZXZlbnQudGFyZ2V0fHxldmVudC5zcmNFbGVtZW50O2EuaHJlZj1wb3BNYWdpYy5maW5kTGlua1RvT3Blbih0YXJnZXQpO2RvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiYm9keVwiKVswXS5hcHBlbmRDaGlsZChhKTt2YXIgZT1uZXcgTW91c2VFdmVudChcImNsaWNrXCIse2J1YmJsZXM6dHJ1ZSxjYW5jZWxhYmxlOnRydWUsdmlldzp3aW5kb3csc2NyZWVuWDowLHNjcmVlblk6MCxjbGllbnRYOjAsY2xpZW50WTowLGN0cmxLZXk6dHJ1ZSxhbHRLZXk6ZmFsc2Usc2hpZnRLZXk6ZmFsc2UsbWV0YUtleTp0cnVlLGJ1dHRvbjowfSk7ZS5wcmV2ZW50RGVmYXVsdD11bmRlZmluZWQ7YS5kaXNwYXRjaEV2ZW50KGUpO2EucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKTt3aW5kb3cub3Blbihwb3BNYWdpYy51cmwsXCJfc2VsZlwiKTtwb3BNYWdpYy5zZXRBc09wZW5lZCgpfSxwb3B1cDpmdW5jdGlvbih0cmlnZ2VyZWRFdmVudCl7aWYoIXBvcE1hZ2ljLnNob3VsZFNob3coKXx8IXBvcE1hZ2ljLnZlbm9yU2hvdWxkU2hvdygpfHwhcG9wTWFnaWMuaXNWYWxpZFVzZXJFdmVudCh0cmlnZ2VyZWRFdmVudCkpcmV0dXJuIHRydWU7dmFyIHdpbk9wdGlvbnM9XCJcIjtpZihwb3BNYWdpYy5jb25maWcucG9wdXBfZmFsbGJhY2smJiFwb3BNYWdpYy5jb25maWcucG9wdXBfZm9yY2Upe3ZhciBoZWlnaHQ9TWF0aC5tYXgoTWF0aC5yb3VuZCh3aW5kb3cuaW5uZXJIZWlnaHQqLjgpLDMwMCk7dmFyIHdpZHRoPU1hdGgubWF4KE1hdGgucm91bmQod2luZG93LmlubmVyV2lkdGgqLjcpLDMwMCk7dmFyIHRvcD13aW5kb3cuc2NyZWVuWSsxMDA7dmFyIGxlZnQ9d2luZG93LnNjcmVlblgrMTAwO3dpbk9wdGlvbnM9XCJtZW51YmFyPTEscmVzaXphYmxlPTEsd2lkdGg9XCIrd2lkdGgrXCIsaGVpZ2h0PVwiK2hlaWdodCtcIix0b3A9XCIrdG9wK1wiLGxlZnQ9XCIrbGVmdH12YXIgcHJlUG9wVXJsPWRvY3VtZW50LmxvY2F0aW9uLmhyZWY7dmFyIHBvcFdpbj13aW5kb3cub3BlbihwcmVQb3BVcmwscG9wTWFnaWMuZ2V0UHVJZCgpLHdpbk9wdGlvbnMpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtwb3BXaW4ubG9jYXRpb24uaHJlZj1wb3BNYWdpYy51cmx9LDIwMCk7cG9wTWFnaWMuc2V0QXNPcGVuZWQoKTtpZih0eXBlb2YgdHJpZ2dlcmVkRXZlbnQucHJldmVudERlZmF1bHQhPT1cInVuZGVmaW5lZFwiKXt0cmlnZ2VyZWRFdmVudC5wcmV2ZW50RGVmYXVsdCgpO3RyaWdnZXJlZEV2ZW50LnN0b3BQcm9wYWdhdGlvbigpfX19fTsgICAgcG9wTWFnaWMuaW5pdChhZENvbmZpZyk7XHJcbn0pKCk7XHJcblxyXG5cclxuPFwvc2NyaXB0PiJ9LHsiaWQiOiJleG9tX2pfUE9QVU5ERVIiLCJhZHNwb3QiOiJqX1BPUFVOREVSIiwid2VpZ2h0IjoiNiIsImZjYXAiOiIyIiwic2NoZWR1bGUiOmZhbHNlLCJtYXhXaWR0aCI6Ijc2OCIsIm1pbldpZHRoIjpmYWxzZSwidGltZXpvbmUiOmZhbHNlLCJleGNsdWRlIjpmYWxzZSwiZG9tYWluIjpmYWxzZSwiY29kZSI6IjxzY3JpcHQgdHlwZT1cImFwcGxpY2F0aW9uXC9qYXZhc2NyaXB0XCI+XHJcbihmdW5jdGlvbigpIHtcclxuXHJcbiAgICBcL1wvdmVyc2lvbiAxLjAuMFxyXG5cclxuICAgIHZhciBhZENvbmZpZyA9IHtcclxuICAgIFwiYWRzX2hvc3RcIjogXCJhLnBlbXNydi5jb21cIixcclxuICAgIFwic3luZGljYXRpb25faG9zdFwiOiBcInMucGVtc3J2LmNvbVwiLFxyXG4gICAgXCJpZHpvbmVcIjogMTEzOTcyOCxcclxuICAgIFwicG9wdXBfZmFsbGJhY2tcIjogZmFsc2UsXHJcbiAgICBcInBvcHVwX2ZvcmNlXCI6IGZhbHNlLFxyXG4gICAgXCJjaHJvbWVfZW5hYmxlZFwiOiB0cnVlLFxyXG4gICAgXCJuZXdfdGFiXCI6IGZhbHNlLFxyXG4gICAgXCJmcmVxdWVuY3lfcGVyaW9kXCI6IDcyMCxcclxuICAgIFwiZnJlcXVlbmN5X2NvdW50XCI6IDEsXHJcbiAgICBcInRyaWdnZXJfbWV0aG9kXCI6IDMsXHJcbiAgICBcInRyaWdnZXJfY2xhc3NcIjogXCJcIixcclxuICAgIFwidHJpZ2dlcl9kZWxheVwiOiAwLFxyXG4gICAgXCJvbmx5X2lubGluZVwiOiBmYWxzZVxyXG59O1xyXG5cclxuaWYoIXdpbmRvdy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKXtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsPWRvY3VtZW50LmJvZHkucXVlcnlTZWxlY3RvckFsbD1PYmplY3QucXVlcnlTZWxlY3RvckFsbD1mdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsUG9seWZpbGwocixjLGksaixhKXt2YXIgZD1kb2N1bWVudCxzPWQuY3JlYXRlU3R5bGVTaGVldCgpO2E9ZC5hbGw7Yz1bXTtyPXIucmVwbGFjZShcL1xcW2ZvclxcYlwvZ2ksXCJbaHRtbEZvclwiKS5zcGxpdChcIixcIik7Zm9yKGk9ci5sZW5ndGg7aS0tOyl7cy5hZGRSdWxlKHJbaV0sXCJrOnZcIik7Zm9yKGo9YS5sZW5ndGg7ai0tOyl7YVtqXS5jdXJyZW50U3R5bGUuayYmYy5wdXNoKGFbal0pfXMucmVtb3ZlUnVsZSgwKX1yZXR1cm4gY319dmFyIHBvcE1hZ2ljPXt2ZXJzaW9uOjEsY29va2llX25hbWU6XCJcIix1cmw6XCJcIixjb25maWc6e30sb3Blbl9jb3VudDowLHRvcDpudWxsLGJyb3dzZXI6bnVsbCx2ZW5vcl9sb2FkZWQ6ZmFsc2UsdmVub3I6ZmFsc2UsY29uZmlnVHBsOnthZHNfaG9zdDpcIlwiLHN5bmRpY2F0aW9uX2hvc3Q6XCJcIixpZHpvbmU6XCJcIixmcmVxdWVuY3lfcGVyaW9kOjcyMCxmcmVxdWVuY3lfY291bnQ6MSx0cmlnZ2VyX21ldGhvZDoxLHRyaWdnZXJfY2xhc3M6XCJcIixwb3B1cF9mb3JjZTpmYWxzZSxwb3B1cF9mYWxsYmFjazpmYWxzZSxjaHJvbWVfZW5hYmxlZDp0cnVlLG5ld190YWI6ZmFsc2UsY2F0OlwiXCIsdGFnczpcIlwiLGVsOlwiXCIsc3ViOlwiXCIsc3ViMjpcIlwiLHN1YjM6XCJcIixvbmx5X2lubGluZTpmYWxzZSx0cmlnZ2VyX2RlbGF5OjAsY29va2llY29uc2VudDp0cnVlfSxpbml0OmZ1bmN0aW9uKGNvbmZpZyl7aWYodHlwZW9mIGNvbmZpZy5pZHpvbmU9PT1cInVuZGVmaW5lZFwifHwhY29uZmlnLmlkem9uZSl7cmV0dXJufWlmKHR5cGVvZiBjb25maWdbXCJjdXN0b21UYXJnZXRpbmdcIl09PT1cInVuZGVmaW5lZFwiKXtjb25maWdbXCJjdXN0b21UYXJnZXRpbmdcIl09W119d2luZG93W1wiY3VzdG9tVGFyZ2V0aW5nXCJdPWNvbmZpZ1tcImN1c3RvbVRhcmdldGluZ1wiXXx8bnVsbDt2YXIgY3VzdG9tVGFyZ2V0aW5nPU9iamVjdC5rZXlzKGNvbmZpZ1tcImN1c3RvbVRhcmdldGluZ1wiXSkuZmlsdGVyKGZ1bmN0aW9uKGMpe3JldHVybiBjLnNlYXJjaChcImV4X1wiKT49MH0pO2lmKGN1c3RvbVRhcmdldGluZy5sZW5ndGgpe2N1c3RvbVRhcmdldGluZy5mb3JFYWNoKGZ1bmN0aW9uKGN0KXtyZXR1cm4gdGhpcy5jb25maWdUcGxbY3RdPW51bGx9LmJpbmQodGhpcykpfWZvcih2YXIga2V5IGluIHRoaXMuY29uZmlnVHBsKXtpZighT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuY29uZmlnVHBsLGtleSkpe2NvbnRpbnVlfWlmKHR5cGVvZiBjb25maWdba2V5XSE9PVwidW5kZWZpbmVkXCIpe3RoaXMuY29uZmlnW2tleV09Y29uZmlnW2tleV19ZWxzZXt0aGlzLmNvbmZpZ1trZXldPXRoaXMuY29uZmlnVHBsW2tleV19fWlmKHR5cGVvZiB0aGlzLmNvbmZpZy5pZHpvbmU9PT1cInVuZGVmaW5lZFwifHx0aGlzLmNvbmZpZy5pZHpvbmU9PT1cIlwiKXtyZXR1cm59aWYodGhpcy5jb25maWcub25seV9pbmxpbmUhPT10cnVlKXt0aGlzLmxvYWRIb3N0ZWQoKX10aGlzLmFkZEV2ZW50VG9FbGVtZW50KHdpbmRvdyxcImxvYWRcIix0aGlzLnByZXBhcmVQb3ApfSxnZXRDb3VudEZyb21Db29raWU6ZnVuY3Rpb24oKXtpZighdGhpcy5jb25maWcuY29va2llY29uc2VudCl7cmV0dXJuIDB9dmFyIHNob3duQ29va2llPXBvcE1hZ2ljLmdldENvb2tpZShwb3BNYWdpYy5jb29raWVfbmFtZSk7dmFyIGN0cj10eXBlb2Ygc2hvd25Db29raWU9PT1cInVuZGVmaW5lZFwiPzA6cGFyc2VJbnQoc2hvd25Db29raWUpO2lmKGlzTmFOKGN0cikpe2N0cj0wfXJldHVybiBjdHJ9LGdldExhc3RPcGVuZWRUaW1lRnJvbUNvb2tpZTpmdW5jdGlvbigpe3ZhciBzaG93bkNvb2tpZT1wb3BNYWdpYy5nZXRDb29raWUocG9wTWFnaWMuY29va2llX25hbWUpO3ZhciBkZWxheT1udWxsO2lmKHR5cGVvZiBzaG93bkNvb2tpZSE9PVwidW5kZWZpbmVkXCIpe3ZhciB2YWx1ZT1zaG93bkNvb2tpZS5zcGxpdChcIjtcIilbMV07ZGVsYXk9dmFsdWU+MD9wYXJzZUludCh2YWx1ZSk6MH1pZihpc05hTihkZWxheSkpe2RlbGF5PW51bGx9cmV0dXJuIGRlbGF5fSxzaG91bGRTaG93OmZ1bmN0aW9uKCl7aWYocG9wTWFnaWMub3Blbl9jb3VudD49cG9wTWFnaWMuY29uZmlnLmZyZXF1ZW5jeV9jb3VudCl7cmV0dXJuIGZhbHNlfXZhciBjdHI9cG9wTWFnaWMuZ2V0Q291bnRGcm9tQ29va2llKCk7Y29uc3QgbGFzdF9vcGVuZWRfdGltZT1wb3BNYWdpYy5nZXRMYXN0T3BlbmVkVGltZUZyb21Db29raWUoKTtjb25zdCBjdXJyZW50X3RpbWU9TWF0aC5mbG9vcihEYXRlLm5vdygpXC8xZTMpO2NvbnN0IG1heGltdW1EZWxheVRpbWU9bGFzdF9vcGVuZWRfdGltZStwb3BNYWdpYy5jb25maWcudHJpZ2dlcl9kZWxheTtpZihsYXN0X29wZW5lZF90aW1lJiZtYXhpbXVtRGVsYXlUaW1lPmN1cnJlbnRfdGltZSl7cmV0dXJuIGZhbHNlfXBvcE1hZ2ljLm9wZW5fY291bnQ9Y3RyO3JldHVybiEoY3RyPj1wb3BNYWdpYy5jb25maWcuZnJlcXVlbmN5X2NvdW50KX0sdmVub3JTaG91bGRTaG93OmZ1bmN0aW9uKCl7cmV0dXJuIHBvcE1hZ2ljLnZlbm9yX2xvYWRlZCYmcG9wTWFnaWMudmVub3I9PT1cIjBcIn0sc2V0QXNPcGVuZWQ6ZnVuY3Rpb24oKXt2YXIgbmV3X2N0cj0xO2lmKHBvcE1hZ2ljLm9wZW5fY291bnQhPT0wKXtuZXdfY3RyPXBvcE1hZ2ljLm9wZW5fY291bnQrMX1lbHNle25ld19jdHI9cG9wTWFnaWMuZ2V0Q291bnRGcm9tQ29va2llKCkrMX1jb25zdCBsYXN0X29wZW5lZF90aW1lPU1hdGguZmxvb3IoRGF0ZS5ub3coKVwvMWUzKTtpZihwb3BNYWdpYy5jb25maWcuY29va2llY29uc2VudCl7cG9wTWFnaWMuc2V0Q29va2llKHBvcE1hZ2ljLmNvb2tpZV9uYW1lLGAke25ld19jdHJ9OyR7bGFzdF9vcGVuZWRfdGltZX1gLHBvcE1hZ2ljLmNvbmZpZy5mcmVxdWVuY3lfcGVyaW9kKX19LGxvYWRIb3N0ZWQ6ZnVuY3Rpb24oKXt2YXIgaG9zdGVkU2NyaXB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7aG9zdGVkU2NyaXB0LnR5cGU9XCJhcHBsaWNhdGlvblwvamF2YXNjcmlwdFwiO2hvc3RlZFNjcmlwdC5hc3luYz10cnVlO2hvc3RlZFNjcmlwdC5zcmM9XCJcL1wvXCIrdGhpcy5jb25maWcuYWRzX2hvc3QrXCJcL3BvcHVuZGVyMTAwMC5qc1wiO2hvc3RlZFNjcmlwdC5pZD1cInBvcG1hZ2ljbGRyXCI7Zm9yKHZhciBrZXkgaW4gdGhpcy5jb25maWcpe2lmKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5jb25maWcsa2V5KSl7Y29udGludWV9aWYoa2V5PT09XCJhZHNfaG9zdFwifHxrZXk9PT1cInN5bmRpY2F0aW9uX2hvc3RcIil7Y29udGludWV9aG9zdGVkU2NyaXB0LnNldEF0dHJpYnV0ZShcImRhdGEtZXhvLVwiK2tleSx0aGlzLmNvbmZpZ1trZXldKX12YXIgaW5zZXJ0QW5jaG9yPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiYm9keVwiKS5pdGVtKDApO2lmKGluc2VydEFuY2hvci5maXJzdENoaWxkKXtpbnNlcnRBbmNob3IuaW5zZXJ0QmVmb3JlKGhvc3RlZFNjcmlwdCxpbnNlcnRBbmNob3IuZmlyc3RDaGlsZCl9ZWxzZXtpbnNlcnRBbmNob3IuYXBwZW5kQ2hpbGQoaG9zdGVkU2NyaXB0KX19LHByZXBhcmVQb3A6ZnVuY3Rpb24oKXtpZih0eXBlb2YgZXhvSnNQb3AxMDE9PT1cIm9iamVjdFwiJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhvSnNQb3AxMDEsXCJhZGRcIikpe3JldHVybn1wb3BNYWdpYy50b3A9c2VsZjtpZihwb3BNYWdpYy50b3AhPT1zZWxmKXt0cnl7aWYodG9wLmRvY3VtZW50LmxvY2F0aW9uLnRvU3RyaW5nKCkpe3BvcE1hZ2ljLnRvcD10b3B9fWNhdGNoKGVycil7fX1wb3BNYWdpYy5jb29raWVfbmFtZT1cInpvbmUtY2FwLVwiK3BvcE1hZ2ljLmNvbmZpZy5pZHpvbmU7aWYocG9wTWFnaWMuc2hvdWxkU2hvdygpKXt2YXIgeG1saHR0cD1uZXcgWE1MSHR0cFJlcXVlc3Q7eG1saHR0cC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtpZih4bWxodHRwLnJlYWR5U3RhdGU9PVhNTEh0dHBSZXF1ZXN0LkRPTkUpe3BvcE1hZ2ljLnZlbm9yX2xvYWRlZD10cnVlO2lmKHhtbGh0dHAuc3RhdHVzPT0yMDApe3BvcE1hZ2ljLnZlbm9yPXhtbGh0dHAucmVzcG9uc2VUZXh0fWVsc2V7cG9wTWFnaWMudmVub3I9XCIwXCJ9fX07dmFyIHByb3RvY29sPWRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sIT09XCJodHRwczpcIiYmZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2whPT1cImh0dHA6XCI/XCJodHRwczpcIjpkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbDt4bWxodHRwLm9wZW4oXCJHRVRcIixwcm90b2NvbCtcIlwvXC9cIitwb3BNYWdpYy5jb25maWcuc3luZGljYXRpb25faG9zdCtcIlwvdmVub3IucGhwXCIsdHJ1ZSk7dHJ5e3htbGh0dHAuc2VuZCgpfWNhdGNoKGVycm9yKXtwb3BNYWdpYy52ZW5vcl9sb2FkZWQ9dHJ1ZX19cG9wTWFnaWMuYnVpbGRVcmwoKTtwb3BNYWdpYy5icm93c2VyPXBvcE1hZ2ljLmJyb3dzZXJEZXRlY3Rvci5kZXRlY3RCcm93c2VyKG5hdmlnYXRvci51c2VyQWdlbnQpO2lmKCFwb3BNYWdpYy5jb25maWcuY2hyb21lX2VuYWJsZWQmJihwb3BNYWdpYy5icm93c2VyLm5hbWU9PT1cImNocm9tZVwifHxwb3BNYWdpYy5icm93c2VyLm5hbWU9PT1cImNyaW9zXCIpKXtyZXR1cm59dmFyIHBvcE1ldGhvZD1wb3BNYWdpYy5nZXRQb3BNZXRob2QocG9wTWFnaWMuYnJvd3Nlcik7cG9wTWFnaWMuYWRkRXZlbnQoXCJjbGlja1wiLHBvcE1ldGhvZCl9LGdldFBvcE1ldGhvZDpmdW5jdGlvbihicm93c2VySW5mbyl7aWYocG9wTWFnaWMuY29uZmlnLnBvcHVwX2ZvcmNlKXtyZXR1cm4gcG9wTWFnaWMubWV0aG9kcy5wb3B1cH1pZihwb3BNYWdpYy5jb25maWcucG9wdXBfZmFsbGJhY2smJmJyb3dzZXJJbmZvLm5hbWU9PT1cImNocm9tZVwiJiZicm93c2VySW5mby52ZXJzaW9uPj02OCYmIWJyb3dzZXJJbmZvLmlzTW9iaWxlKXtyZXR1cm4gcG9wTWFnaWMubWV0aG9kcy5wb3B1cH1pZihicm93c2VySW5mby5pc01vYmlsZSl7cmV0dXJuIHBvcE1hZ2ljLm1ldGhvZHMuZGVmYXVsdH1pZihicm93c2VySW5mby5uYW1lPT09XCJjaHJvbWVcIil7cmV0dXJuIHBvcE1hZ2ljLm1ldGhvZHMuY2hyb21lVGFifXJldHVybiBwb3BNYWdpYy5tZXRob2RzLmRlZmF1bHR9LGJ1aWxkVXJsOmZ1bmN0aW9uKCl7dmFyIHByb3RvY29sPWRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sIT09XCJodHRwczpcIiYmZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2whPT1cImh0dHA6XCI/XCJodHRwczpcIjpkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbDt2YXIgcD10b3A9PT1zZWxmP2RvY3VtZW50LlVSTDpkb2N1bWVudC5yZWZlcnJlcjt2YXIgc2NyaXB0X2luZm89e3R5cGU6XCJpbmxpbmVcIixuYW1lOlwicG9wTWFnaWNcIix2ZXI6dGhpcy52ZXJzaW9ufTt2YXIgZW5jb2RlU2NyaXB0SW5mbz1mdW5jdGlvbihzY3JpcHRfaW5mbyl7dmFyIHJlc3VsdD1zY3JpcHRfaW5mb1tcInR5cGVcIl0rXCJ8XCIrc2NyaXB0X2luZm9bXCJuYW1lXCJdK1wifFwiK3NjcmlwdF9pbmZvW1widmVyXCJdO3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoYnRvYShyZXN1bHQpKX07dmFyIGN1c3RvbVRhcmdldGluZ1BhcmFtcz1cIlwiO2lmKGN1c3RvbVRhcmdldGluZyYmT2JqZWN0LmtleXMoY3VzdG9tVGFyZ2V0aW5nKS5sZW5ndGgpe3ZhciBjdXN0b21UYXJnZXRpbmdLZXlzPXR5cGVvZiBjdXN0b21UYXJnZXRpbmc9PT1cIm9iamVjdFwiP09iamVjdC5rZXlzKGN1c3RvbVRhcmdldGluZyk6Y3VzdG9tVGFyZ2V0aW5nO3ZhciB2YWx1ZTtjdXN0b21UYXJnZXRpbmdLZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KXtpZih0eXBlb2YgY3VzdG9tVGFyZ2V0aW5nPT09XCJvYmplY3RcIil7dmFsdWU9Y3VzdG9tVGFyZ2V0aW5nW2tleV19ZWxzZSBpZihBcnJheS5pc0FycmF5KGN1c3RvbVRhcmdldGluZykpe3ZhbHVlPXNjcmlwdEVsLmdldEF0dHJpYnV0ZShrZXkpfXZhciBrZXlXaXRob3V0RXhvUHJlZml4PWtleS5yZXBsYWNlKFwiZGF0YS1leG8tXCIsXCJcIik7Y3VzdG9tVGFyZ2V0aW5nUGFyYW1zKz1gJiR7a2V5V2l0aG91dEV4b1ByZWZpeH09JHt2YWx1ZX1gfSl9dGhpcy51cmw9cHJvdG9jb2wrXCJcL1wvXCIrdGhpcy5jb25maWcuc3luZGljYXRpb25faG9zdCtcIlwvc3BsYXNoLnBocFwiK1wiP2NhdD1cIit0aGlzLmNvbmZpZy5jYXQrXCImaWR6b25lPVwiK3RoaXMuY29uZmlnLmlkem9uZStcIiZ0eXBlPThcIitcIiZwPVwiK2VuY29kZVVSSUNvbXBvbmVudChwKStcIiZzdWI9XCIrdGhpcy5jb25maWcuc3ViKyh0aGlzLmNvbmZpZy5zdWIyIT09XCJcIj9cIiZzdWIyPVwiK3RoaXMuY29uZmlnLnN1YjI6XCJcIikrKHRoaXMuY29uZmlnLnN1YjMhPT1cIlwiP1wiJnN1YjM9XCIrdGhpcy5jb25maWcuc3ViMzpcIlwiKStcIiZibG9jaz0xXCIrXCImZWw9XCIrdGhpcy5jb25maWcuZWwrXCImdGFncz1cIit0aGlzLmNvbmZpZy50YWdzK1wiJmNvb2tpZWNvbnNlbnQ9XCIrdGhpcy5jb25maWcuY29va2llY29uc2VudCtcIiZzY3JfaW5mbz1cIitlbmNvZGVTY3JpcHRJbmZvKHNjcmlwdF9pbmZvKStjdXN0b21UYXJnZXRpbmdQYXJhbXN9LGFkZEV2ZW50VG9FbGVtZW50OmZ1bmN0aW9uKG9iaix0eXBlLGZuKXtpZihvYmouYWRkRXZlbnRMaXN0ZW5lcil7b2JqLmFkZEV2ZW50TGlzdGVuZXIodHlwZSxmbixmYWxzZSl9ZWxzZSBpZihvYmouYXR0YWNoRXZlbnQpe29ialtcImVcIit0eXBlK2ZuXT1mbjtvYmpbdHlwZStmbl09ZnVuY3Rpb24oKXtvYmpbXCJlXCIrdHlwZStmbl0od2luZG93LmV2ZW50KX07b2JqLmF0dGFjaEV2ZW50KFwib25cIit0eXBlLG9ialt0eXBlK2ZuXSl9ZWxzZXtvYmpbXCJvblwiK3R5cGVdPW9ialtcImVcIit0eXBlK2ZuXX19LGFkZEV2ZW50OmZ1bmN0aW9uKHR5cGUsZm4pe3ZhciB0YXJnZXRFbGVtZW50cztpZihwb3BNYWdpYy5jb25maWcudHJpZ2dlcl9tZXRob2Q9PVwiM1wiKXt0YXJnZXRFbGVtZW50cz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiYVwiKTtmb3IoaT0wO2k8dGFyZ2V0RWxlbWVudHMubGVuZ3RoO2krKyl7cG9wTWFnaWMuYWRkRXZlbnRUb0VsZW1lbnQodGFyZ2V0RWxlbWVudHNbaV0sdHlwZSxmbil9cmV0dXJufWlmKHBvcE1hZ2ljLmNvbmZpZy50cmlnZ2VyX21ldGhvZD09XCIyXCImJnBvcE1hZ2ljLmNvbmZpZy50cmlnZ2VyX21ldGhvZCE9XCJcIil7dmFyIHRyaWdnZXJfY2xhc3Nlczt2YXIgdHJpZ2dlcl9jbGFzc2VzX2ZpbmFsPVtdO2lmKHBvcE1hZ2ljLmNvbmZpZy50cmlnZ2VyX2NsYXNzLmluZGV4T2YoXCIsXCIpPT09LTEpe3RyaWdnZXJfY2xhc3Nlcz1wb3BNYWdpYy5jb25maWcudHJpZ2dlcl9jbGFzcy5zcGxpdChcIiBcIil9ZWxzZXt2YXIgdHJpbW1lZF90cmlnZ2VyX2NsYXNzZXM9cG9wTWFnaWMuY29uZmlnLnRyaWdnZXJfY2xhc3MucmVwbGFjZShcL1xcc1wvZyxcIlwiKTt0cmlnZ2VyX2NsYXNzZXM9dHJpbW1lZF90cmlnZ2VyX2NsYXNzZXMuc3BsaXQoXCIsXCIpfWZvcih2YXIgaT0wO2k8dHJpZ2dlcl9jbGFzc2VzLmxlbmd0aDtpKyspe2lmKHRyaWdnZXJfY2xhc3Nlc1tpXSE9PVwiXCIpe3RyaWdnZXJfY2xhc3Nlc19maW5hbC5wdXNoKFwiLlwiK3RyaWdnZXJfY2xhc3Nlc1tpXSl9fXRhcmdldEVsZW1lbnRzPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodHJpZ2dlcl9jbGFzc2VzX2ZpbmFsLmpvaW4oXCIsIFwiKSk7Zm9yKGk9MDtpPHRhcmdldEVsZW1lbnRzLmxlbmd0aDtpKyspe3BvcE1hZ2ljLmFkZEV2ZW50VG9FbGVtZW50KHRhcmdldEVsZW1lbnRzW2ldLHR5cGUsZm4pfXJldHVybn1wb3BNYWdpYy5hZGRFdmVudFRvRWxlbWVudChkb2N1bWVudCx0eXBlLGZuKX0sc2V0Q29va2llOmZ1bmN0aW9uKG5hbWUsdmFsdWUsdHRsX21pbnV0ZXMpe2lmKCF0aGlzLmNvbmZpZy5jb29raWVjb25zZW50KXtyZXR1cm4gZmFsc2V9dHRsX21pbnV0ZXM9cGFyc2VJbnQodHRsX21pbnV0ZXMsMTApO3ZhciBub3dfZGF0ZT1uZXcgRGF0ZTtub3dfZGF0ZS5zZXRNaW51dGVzKG5vd19kYXRlLmdldE1pbnV0ZXMoKStwYXJzZUludCh0dGxfbWludXRlcykpO3ZhciBjX3ZhbHVlPWVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkrXCI7IGV4cGlyZXM9XCIrbm93X2RhdGUudG9VVENTdHJpbmcoKStcIjsgcGF0aD1cL1wiO2RvY3VtZW50LmNvb2tpZT1uYW1lK1wiPVwiK2NfdmFsdWV9LGdldENvb2tpZTpmdW5jdGlvbihuYW1lKXtpZighdGhpcy5jb25maWcuY29va2llY29uc2VudCl7cmV0dXJuIGZhbHNlfXZhciBpLHgseSxjb29raWVzQXJyYXk9ZG9jdW1lbnQuY29va2llLnNwbGl0KFwiO1wiKTtmb3IoaT0wO2k8Y29va2llc0FycmF5Lmxlbmd0aDtpKyspe3g9Y29va2llc0FycmF5W2ldLnN1YnN0cigwLGNvb2tpZXNBcnJheVtpXS5pbmRleE9mKFwiPVwiKSk7eT1jb29raWVzQXJyYXlbaV0uc3Vic3RyKGNvb2tpZXNBcnJheVtpXS5pbmRleE9mKFwiPVwiKSsxKTt4PXgucmVwbGFjZShcL15cXHMrfFxccyskXC9nLFwiXCIpO2lmKHg9PT1uYW1lKXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHkpfX19LHJhbmRTdHI6ZnVuY3Rpb24obGVuZ3RoLHBvc3NpYmxlQ2hhcnMpe3ZhciB0ZXh0PVwiXCI7dmFyIHBvc3NpYmxlPXBvc3NpYmxlQ2hhcnN8fFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODlcIjtmb3IodmFyIGk9MDtpPGxlbmd0aDtpKyspe3RleHQrPXBvc3NpYmxlLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqcG9zc2libGUubGVuZ3RoKSl9cmV0dXJuIHRleHR9LGlzVmFsaWRVc2VyRXZlbnQ6ZnVuY3Rpb24oZXZlbnQpe2lmKFwiaXNUcnVzdGVkXCJpbiBldmVudCYmZXZlbnQuaXNUcnVzdGVkJiZwb3BNYWdpYy5icm93c2VyLm5hbWUhPT1cImllXCImJnBvcE1hZ2ljLmJyb3dzZXIubmFtZSE9PVwic2FmYXJpXCIpe3JldHVybiB0cnVlfWVsc2V7cmV0dXJuIGV2ZW50LnNjcmVlblghPTAmJmV2ZW50LnNjcmVlblkhPTB9fSxpc1ZhbGlkSHJlZjpmdW5jdGlvbihocmVmKXtpZih0eXBlb2YgaHJlZj09PVwidW5kZWZpbmVkXCJ8fGhyZWY9PVwiXCIpe3JldHVybiBmYWxzZX12YXIgZW1wdHlfcmVmPVwvXFxzP2phdmFzY3JpcHRcXHM/OlwvaTtyZXR1cm4hZW1wdHlfcmVmLnRlc3QoaHJlZil9LGZpbmRMaW5rVG9PcGVuOmZ1bmN0aW9uKGNsaWNrZWRFbGVtZW50KXt2YXIgdGFyZ2V0PWNsaWNrZWRFbGVtZW50O3ZhciBsb2NhdGlvbj1mYWxzZTt0cnl7dmFyIGJyZWFrQ3RyPTA7d2hpbGUoYnJlYWtDdHI8MjAmJiF0YXJnZXQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKSYmdGFyZ2V0IT09ZG9jdW1lbnQmJnRhcmdldC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT09XCJodG1sXCIpe3RhcmdldD10YXJnZXQucGFyZW50Tm9kZTticmVha0N0cisrfXZhciBlbGVtZW50VGFyZ2V0QXR0cj10YXJnZXQuZ2V0QXR0cmlidXRlKFwidGFyZ2V0XCIpO2lmKCFlbGVtZW50VGFyZ2V0QXR0cnx8ZWxlbWVudFRhcmdldEF0dHIuaW5kZXhPZihcIl9ibGFua1wiKT09PS0xKXtsb2NhdGlvbj10YXJnZXQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKX19Y2F0Y2goZXJyKXt9aWYoIXBvcE1hZ2ljLmlzVmFsaWRIcmVmKGxvY2F0aW9uKSl7bG9jYXRpb249ZmFsc2V9cmV0dXJuIGxvY2F0aW9ufHx3aW5kb3cubG9jYXRpb24uaHJlZn0sZ2V0UHVJZDpmdW5jdGlvbigpe3JldHVyblwib2tfXCIrTWF0aC5mbG9vcig4OTk5OTk5OSpNYXRoLnJhbmRvbSgpKzFlNyl9LGJyb3dzZXJEZXRlY3Rvcjp7YnJvd3NlckRlZmluaXRpb25zOltbXCJmaXJlZm94XCIsXC9GaXJlZm94XFxcLyhbMC05Ll0rKSg/Olxcc3wkKVwvXSxbXCJvcGVyYVwiLFwvT3BlcmFcXFwvKFswLTkuXSspKD86XFxzfCQpXC9dLFtcIm9wZXJhXCIsXC9PUFJcXFwvKFswLTkuXSspKDo/XFxzfCQpJFwvXSxbXCJlZGdlXCIsXC9FZGcoPzplfClcXFwvKFswLTkuX10rKVwvXSxbXCJpZVwiLFwvVHJpZGVudFxcXC83XFwuMC4qcnY6KFswLTkuXSspXFwpLipHZWNrbyRcL10sW1wiaWVcIixcL01TSUVcXHMoWzAtOS5dKyk7LipUcmlkZW50XFxcL1s0LTddLjBcL10sW1wiaWVcIixcL01TSUVcXHMoN1xcLjApXC9dLFtcInNhZmFyaVwiLFwvVmVyc2lvblxcXC8oWzAtOS5fXSspLipTYWZhcmlcL10sW1wiY2hyb21lXCIsXC8oPyFDaHJvbS4qRWRnKD86ZXwpKUNocm9tKD86ZXxpdW0pXFxcLyhbMC05Ll0rKSg6P1xcc3wkKVwvXSxbXCJjaHJvbWVcIixcLyg/IUNocm9tLipPUFIpQ2hyb20oPzplfGl1bSlcXFwvKFswLTkuXSspKDo/XFxzfCQpXC9dLFtcImJiMTBcIixcL0JCMTA7XFxzVG91Y2guKlZlcnNpb25cXFwvKFswLTkuXSspXC9dLFtcImFuZHJvaWRcIixcL0FuZHJvaWRcXHMoWzAtOS5dKylcL10sW1wiaW9zXCIsXC9WZXJzaW9uXFxcLyhbMC05Ll9dKykuKk1vYmlsZS4qU2FmYXJpLipcL10sW1wieWFuZGV4YnJvd3NlclwiLFwvWWFCcm93c2VyXFxcLyhbMC05Ll9dKylcL10sW1wiY3Jpb3NcIixcL0NyaU9TXFxcLyhbMC05Ll0rKSg6P1xcc3wkKVwvXV0sZGV0ZWN0QnJvd3NlcjpmdW5jdGlvbih1c2VyQWdlbnQpe3ZhciBpc01vYmlsZT11c2VyQWdlbnQubWF0Y2goXC9BbmRyb2lkfEJsYWNrQmVycnl8aVBob25lfGlQYWR8aVBvZHxPcGVyYSBNaW5pfElFTW9iaWxlfFdlYk9TfFdpbmRvd3MgUGhvbmVcL2kpO2Zvcih2YXIgaSBpbiB0aGlzLmJyb3dzZXJEZWZpbml0aW9ucyl7dmFyIGRlZmluaXRpb249dGhpcy5icm93c2VyRGVmaW5pdGlvbnNbaV07aWYoZGVmaW5pdGlvblsxXS50ZXN0KHVzZXJBZ2VudCkpe3ZhciBtYXRjaD1kZWZpbml0aW9uWzFdLmV4ZWModXNlckFnZW50KTt2YXIgdmVyc2lvbj1tYXRjaCYmbWF0Y2hbMV0uc3BsaXQoXC9bLl9dXC8pLnNsaWNlKDAsMyk7dmFyIHZlcnNpb25UYWlscz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh2ZXJzaW9uLDEpLmpvaW4oXCJcIil8fFwiMFwiO2lmKHZlcnNpb24mJnZlcnNpb24ubGVuZ3RoPDMpe0FycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHZlcnNpb24sdmVyc2lvbi5sZW5ndGg9PT0xP1swLDBdOlswXSl9cmV0dXJue25hbWU6ZGVmaW5pdGlvblswXSx2ZXJzaW9uOnZlcnNpb24uam9pbihcIi5cIiksdmVyc2lvbk51bWJlcjpwYXJzZUZsb2F0KHZlcnNpb25bMF0rXCIuXCIrdmVyc2lvblRhaWxzKSxpc01vYmlsZTppc01vYmlsZX19fXJldHVybntuYW1lOlwib3RoZXJcIix2ZXJzaW9uOlwiMS4wXCIsdmVyc2lvbk51bWJlcjoxLGlzTW9iaWxlOmlzTW9iaWxlfX19LG1ldGhvZHM6e2RlZmF1bHQ6ZnVuY3Rpb24odHJpZ2dlcmVkRXZlbnQpe2lmKCFwb3BNYWdpYy5zaG91bGRTaG93KCl8fCFwb3BNYWdpYy52ZW5vclNob3VsZFNob3coKXx8IXBvcE1hZ2ljLmlzVmFsaWRVc2VyRXZlbnQodHJpZ2dlcmVkRXZlbnQpKXJldHVybiB0cnVlO3ZhciBjbGlja2VkRWxlbWVudD10cmlnZ2VyZWRFdmVudC50YXJnZXR8fHRyaWdnZXJlZEV2ZW50LnNyY0VsZW1lbnQ7dmFyIGhyZWY9cG9wTWFnaWMuZmluZExpbmtUb09wZW4oY2xpY2tlZEVsZW1lbnQpO3dpbmRvdy5vcGVuKGhyZWYsXCJfYmxhbmtcIik7cG9wTWFnaWMuc2V0QXNPcGVuZWQoKTtwb3BNYWdpYy50b3AuZG9jdW1lbnQubG9jYXRpb249cG9wTWFnaWMudXJsO2lmKHR5cGVvZiB0cmlnZ2VyZWRFdmVudC5wcmV2ZW50RGVmYXVsdCE9PVwidW5kZWZpbmVkXCIpe3RyaWdnZXJlZEV2ZW50LnByZXZlbnREZWZhdWx0KCk7dHJpZ2dlcmVkRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCl9cmV0dXJuIHRydWV9LGNocm9tZVRhYjpmdW5jdGlvbihldmVudCl7aWYoIXBvcE1hZ2ljLnNob3VsZFNob3coKXx8IXBvcE1hZ2ljLnZlbm9yU2hvdWxkU2hvdygpfHwhcG9wTWFnaWMuaXNWYWxpZFVzZXJFdmVudChldmVudCkpcmV0dXJuIHRydWU7aWYodHlwZW9mIGV2ZW50LnByZXZlbnREZWZhdWx0IT09XCJ1bmRlZmluZWRcIil7ZXZlbnQucHJldmVudERlZmF1bHQoKTtldmVudC5zdG9wUHJvcGFnYXRpb24oKX1lbHNle3JldHVybiB0cnVlfXZhciBhPXRvcC53aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7dmFyIHRhcmdldD1ldmVudC50YXJnZXR8fGV2ZW50LnNyY0VsZW1lbnQ7YS5ocmVmPXBvcE1hZ2ljLmZpbmRMaW5rVG9PcGVuKHRhcmdldCk7ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJib2R5XCIpWzBdLmFwcGVuZENoaWxkKGEpO3ZhciBlPW5ldyBNb3VzZUV2ZW50KFwiY2xpY2tcIix7YnViYmxlczp0cnVlLGNhbmNlbGFibGU6dHJ1ZSx2aWV3OndpbmRvdyxzY3JlZW5YOjAsc2NyZWVuWTowLGNsaWVudFg6MCxjbGllbnRZOjAsY3RybEtleTp0cnVlLGFsdEtleTpmYWxzZSxzaGlmdEtleTpmYWxzZSxtZXRhS2V5OnRydWUsYnV0dG9uOjB9KTtlLnByZXZlbnREZWZhdWx0PXVuZGVmaW5lZDthLmRpc3BhdGNoRXZlbnQoZSk7YS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpO3dpbmRvdy5vcGVuKHBvcE1hZ2ljLnVybCxcIl9zZWxmXCIpO3BvcE1hZ2ljLnNldEFzT3BlbmVkKCl9LHBvcHVwOmZ1bmN0aW9uKHRyaWdnZXJlZEV2ZW50KXtpZighcG9wTWFnaWMuc2hvdWxkU2hvdygpfHwhcG9wTWFnaWMudmVub3JTaG91bGRTaG93KCl8fCFwb3BNYWdpYy5pc1ZhbGlkVXNlckV2ZW50KHRyaWdnZXJlZEV2ZW50KSlyZXR1cm4gdHJ1ZTt2YXIgd2luT3B0aW9ucz1cIlwiO2lmKHBvcE1hZ2ljLmNvbmZpZy5wb3B1cF9mYWxsYmFjayYmIXBvcE1hZ2ljLmNvbmZpZy5wb3B1cF9mb3JjZSl7dmFyIGhlaWdodD1NYXRoLm1heChNYXRoLnJvdW5kKHdpbmRvdy5pbm5lckhlaWdodCouOCksMzAwKTt2YXIgd2lkdGg9TWF0aC5tYXgoTWF0aC5yb3VuZCh3aW5kb3cuaW5uZXJXaWR0aCouNyksMzAwKTt2YXIgdG9wPXdpbmRvdy5zY3JlZW5ZKzEwMDt2YXIgbGVmdD13aW5kb3cuc2NyZWVuWCsxMDA7d2luT3B0aW9ucz1cIm1lbnViYXI9MSxyZXNpemFibGU9MSx3aWR0aD1cIit3aWR0aCtcIixoZWlnaHQ9XCIraGVpZ2h0K1wiLHRvcD1cIit0b3ArXCIsbGVmdD1cIitsZWZ0fXZhciBwcmVQb3BVcmw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZjt2YXIgcG9wV2luPXdpbmRvdy5vcGVuKHByZVBvcFVybCxwb3BNYWdpYy5nZXRQdUlkKCksd2luT3B0aW9ucyk7c2V0VGltZW91dChmdW5jdGlvbigpe3BvcFdpbi5sb2NhdGlvbi5ocmVmPXBvcE1hZ2ljLnVybH0sMjAwKTtwb3BNYWdpYy5zZXRBc09wZW5lZCgpO2lmKHR5cGVvZiB0cmlnZ2VyZWRFdmVudC5wcmV2ZW50RGVmYXVsdCE9PVwidW5kZWZpbmVkXCIpe3RyaWdnZXJlZEV2ZW50LnByZXZlbnREZWZhdWx0KCk7dHJpZ2dlcmVkRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCl9fX19OyAgICBwb3BNYWdpYy5pbml0KGFkQ29uZmlnKTtcclxufSkoKTtcclxuXHJcblxyXG48XC9zY3JpcHQ+In1d