@next2d/core 3.0.1 → 3.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +11 -11
- package/src/renderer.worker.inline.js +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
export const workerInlineUrl = 'data:application/javascript;base64,dmFyIFJlbmRlcmVyV29ya2VyPWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2xldCBlPTIwNDg7bGV0IHQ9NDtsZXQgcjtsZXQgbjtsZXQgaT0hMTtjb25zdCBhPSgpPT57aXx8KGk9ITAsci5lbmFibGUoci5TQ0lTU09SX1RFU1QpKX0scz0oKT0+e2kmJihpPSExLHIuZGlzYWJsZShyLlNDSVNTT1JfVEVTVCkpfTtsZXQgbz0hMTtjb25zdCBsPSgpPT57b3x8KG89ITAsci5lbmFibGUoci5TVEVOQ0lMX1RFU1QpKX0sYz0oKT0+e28mJihvPSExLHIuZGlzYWJsZShyLlNURU5DSUxfVEVTVCkpfSx1PShlLHQscixuPW51bGwpPT57Y29uc3QgaT0rZTtyZXR1cm4gaXNOYU4oaSkmJm51bGwhPT1uP246TWF0aC5taW4oTWF0aC5tYXgodCxpc05hTihpKT8wOmkpLHIpfSxmPVtdLGQ9KC4uLmUpPT57Y29uc3QgdD1mLnBvcCgpfHxbXTtyZXR1cm4gZS5sZW5ndGgmJnQucHVzaCguLi5lKSx0fSxoPShlPW51bGwpPT57ZSYmKGUubGVuZ3RoJiYoZS5sZW5ndGg9MCksZi5wdXNoKGUpKX0scD1lPT4oZS0tLGV8PWU+PjEsZXw9ZT4+MixlfD1lPj40LGV8PWU+PjgsZXw9ZT4+MTYsKytlKSxtPVtdLGc9KGU9MCx0PTAscj0wLG49MCk9Pntjb25zdCBpPW0ucG9wKCl8fG5ldyBGbG9hdDMyQXJyYXkoNCk7cmV0dXJuIGlbMF09ZSxpWzFdPXQsaVsyXT1yLGlbM109bixpfSxiPWU9PnttLnB1c2goZSl9LHg9W10sdj0oZT0wLHQ9MCxyPTAsbj0wLGk9MCxhPTAscz0wLG89MCxsPTApPT57Y29uc3QgYz14LnBvcCgpfHxuZXcgRmxvYXQzMkFycmF5KDkpO3JldHVybiBjWzBdPWUsY1sxXT10LGNbMl09cixjWzNdPW4sY1s0XT1pLGNbNV09YSxjWzZdPXMsY1s3XT1vLGNbOF09bCxjfSx5PVtdLF89KGU9MCx0PTAscj0wLG49MCxpPTAsYT0wKT0+e2NvbnN0IHM9eS5wb3AoKXx8bmV3IEZsb2F0MzJBcnJheSg2KTtyZXR1cm4gc1swXT1lLHNbMV09dCxzWzJdPXIsc1szXT1uLHNbNF09aSxzWzVdPWEsc30sdz1lPT57eS5wdXNoKGUpfSxNPWU9Pntjb25zdCB0PTEvKGVbMF0qZVs0XS1lWzNdKmVbMV0pLHI9ZVszXSplWzddLWVbNF0qZVs2XSxuPWVbMV0qZVs2XS1lWzBdKmVbN107cmV0dXJuIHYoZVs0XSp0LDAtZVsxXSp0LDAsMC1lWzNdKnQsZVswXSp0LDAscip0LG4qdCwxKX07bGV0IFA9MCxTPTA7bGV0IEY9MTtjb25zdCBUPWQoKSxCPWQoKSxPPShlPSExKT0+e2NvbnN0IHQ9ZT82Ojk7VC5sZW5ndGg+PXQmJkIucHVzaChULnNsaWNlKDApKSxULmxlbmd0aD0wO2NvbnN0IHI9W107Zm9yKGxldCBlPTA7ZTxCLmxlbmd0aDtlKyspe2NvbnN0IG49QltlXTtuLmxlbmd0aD49dCYmci5wdXNoKG4pfXJldHVybiBCLmxlbmd0aD0wLHJ9LEE9KGUsdCxyKT0+e1QucHVzaChlLHQscil9LFI9KGUsdCk9Pntjb25zdCByPVQubGVuZ3RoLG49K1Rbci0zXSxpPStUW3ItMl07cmV0dXJuIGU9PT1uJiZ0PT09aX0sQz0oZSx0KT0+e1QubGVuZ3RoP1IoZSx0KXx8KFQubGVuZ3RoPDN8fEIucHVzaChULnNsaWNlKDApKSxULmxlbmd0aD0wLEEoZSx0LCExKSk6QShlLHQsITEpfSxFPShlLHQscixuKT0+e1QubGVuZ3RofHxDKDAsMCksUihyLG4pfHwoQShlLHQsITApLEEocixuLCExKSl9O2xldCBVPW5ldyBGbG9hdDMyQXJyYXkoNjQpLCQ9MDtjb25zdCBHPShlLHQscixuLGksYSxzLG8pPT57Y29uc3QgbD0oKGUsdCxyLG4saSxhLHMsbyk9Pntjb25zdCBsPTMqci0yKmUtcyxjPTMqbi0yKnQtbyx1PTMqaS0yKnMtZSxmPTMqYS0yKm8tdDtyZXR1cm4gTWF0aC5tYXgobCpsK2MqYyx1KnUrZipmKX0pKGUsdCxyLG4saSxhLHMsbyk7aWYobDwuMjUpcmV0dXJuIDI7Y29uc3QgYz1NYXRoLmNlaWwoTWF0aC5sb2cyKE1hdGguc3FydChsKS8uNSkvMik7cmV0dXJuIE1hdGgubWluKE1hdGgubWF4KGMrMiwyKSw4KX0saz1bXTtsZXQgTD0wO2NvbnN0IEk9KCk9PntMPTB9LFY9KCk9PihMPj1rLmxlbmd0aCYmay5wdXNoKG5ldyBGbG9hdDMyQXJyYXkoOCkpLGtbTCsrXSksej0oZSx0LHIsbixpLGEscyxvLGwsYyx1KT0+e2NvbnN0IGY9MS1sLGQ9ZiplK2wqcixoPWYqdCtsKm4scD1mKnIrbCppLG09ZipuK2wqYSxnPWYqaStsKnMsYj1mKmErbCpvLHg9ZipkK2wqcCx2PWYqaCtsKm0seT1mKnArbCpnLF89ZiptK2wqYix3PWYqeCtsKnksTT1mKnYrbCpfO2NbMF09ZSxjWzFdPXQsY1syXT1kLGNbM109aCxjWzRdPXgsY1s1XT12LGNbNl09dyxjWzddPU0sdVswXT13LHVbMV09TSx1WzJdPXksdVszXT1fLHVbNF09Zyx1WzVdPWIsdVs2XT1zLHVbN109b30saj0oZSx0LHIsbixpLGEscyxvLGwsYyk9Pntjb25zdCB1PS4yNSooMypyKzMqaS1lLXMpLGY9LjI1KigzKm4rMyphLXQtbyk7bFtjXT11LGxbYysxXT1mLGxbYysyXT1zLGxbYyszXT1vfSxEPW5ldyBGbG9hdDMyQXJyYXkoOCksTj1uZXcgRmxvYXQzMkFycmF5KDgpLFc9KGUsdCxyLG4saSxhLHMsbyk9Pntjb25zdCBsPUcoZSx0LHIsbixpLGEscyxvKTt2YXIgYztjPTQqbCxVLmxlbmd0aDxjJiYoVT1uZXcgRmxvYXQzMkFycmF5KDIqYykpO2xldCB1PTA7aWYobDw9Mil6KGUsdCxyLG4saSxhLHMsbywuNSxELE4pLGooRFswXSxEWzFdLERbMl0sRFszXSxEWzRdLERbNV0sRFs2XSxEWzddLFUsdSksdSs9NCxqKE5bMF0sTlsxXSxOWzJdLE5bM10sTls0XSxOWzVdLE5bNl0sTls3XSxVLHUpLHUrPTQ7ZWxzZSBpZihsPD00KXtJKCk7Y29uc3QgbD1WKCksYz1WKCk7eihlLHQscixuLGksYSxzLG8sLjUsbCxjKTtjb25zdCBmPVYoKSxkPVYoKSxoPVYoKSxwPVYoKTt6KGxbMF0sbFsxXSxsWzJdLGxbM10sbFs0XSxsWzVdLGxbNl0sbFs3XSwuNSxmLGQpLHooY1swXSxjWzFdLGNbMl0sY1szXSxjWzRdLGNbNV0sY1s2XSxjWzddLC41LGgscCksaihmWzBdLGZbMV0sZlsyXSxmWzNdLGZbNF0sZls1XSxmWzZdLGZbN10sVSx1KSx1Kz00LGooZFswXSxkWzFdLGRbMl0sZFszXSxkWzRdLGRbNV0sZFs2XSxkWzddLFUsdSksdSs9NCxqKGhbMF0saFsxXSxoWzJdLGhbM10saFs0XSxoWzVdLGhbNl0saFs3XSxVLHUpLHUrPTQsaihwWzBdLHBbMV0scFsyXSxwWzNdLHBbNF0scFs1XSxwWzZdLHBbN10sVSx1KSx1Kz00fWVsc2V7SSgpO2NvbnN0IGw9VigpLGM9VigpO3ooZSx0LHIsbixpLGEscyxvLC41LGwsYyk7Y29uc3QgZj1WKCksZD1WKCksaD1WKCkscD1WKCk7eihsWzBdLGxbMV0sbFsyXSxsWzNdLGxbNF0sbFs1XSxsWzZdLGxbN10sLjUsZixkKSx6KGNbMF0sY1sxXSxjWzJdLGNbM10sY1s0XSxjWzVdLGNbNl0sY1s3XSwuNSxoLHApO2NvbnN0IG09VigpLGc9VigpLGI9VigpLHg9VigpLHY9VigpLHk9VigpLF89VigpLHc9VigpO3ooZlswXSxmWzFdLGZbMl0sZlszXSxmWzRdLGZbNV0sZls2XSxmWzddLC41LG0sZykseihkWzBdLGRbMV0sZFsyXSxkWzNdLGRbNF0sZFs1XSxkWzZdLGRbN10sLjUsYix4KSx6KGhbMF0saFsxXSxoWzJdLGhbM10saFs0XSxoWzVdLGhbNl0saFs3XSwuNSx2LHkpLHoocFswXSxwWzFdLHBbMl0scFszXSxwWzRdLHBbNV0scFs2XSxwWzddLC41LF8sdyksaihtWzBdLG1bMV0sbVsyXSxtWzNdLG1bNF0sbVs1XSxtWzZdLG1bN10sVSx1KSx1Kz00LGooZ1swXSxnWzFdLGdbMl0sZ1szXSxnWzRdLGdbNV0sZ1s2XSxnWzddLFUsdSksdSs9NCxqKGJbMF0sYlsxXSxiWzJdLGJbM10sYls0XSxiWzVdLGJbNl0sYls3XSxVLHUpLHUrPTQsaih4WzBdLHhbMV0seFsyXSx4WzNdLHhbNF0seFs1XSx4WzZdLHhbN10sVSx1KSx1Kz00LGoodlswXSx2WzFdLHZbMl0sdlszXSx2WzRdLHZbNV0sdls2XSx2WzddLFUsdSksdSs9NCxqKHlbMF0seVsxXSx5WzJdLHlbM10seVs0XSx5WzVdLHlbNl0seVs3XSxVLHUpLHUrPTQsaihfWzBdLF9bMV0sX1syXSxfWzNdLF9bNF0sX1s1XSxfWzZdLF9bN10sVSx1KSx1Kz00LGood1swXSx3WzFdLHdbMl0sd1szXSx3WzRdLHdbNV0sd1s2XSx3WzddLFUsdSksdSs9NH1yZXR1cm4gJD11LzQse2J1ZmZlcjpVLGNvdW50OiR9fSxxPShlLHQscixuLGksYSk9PntpZihULmxlbmd0aHx8QygwLDApLFIoaSxhKSlyZXR1cm47Y29uc3Qgcz1ULmxlbmd0aCxvPStUW3MtM10sbD0rVFtzLTJdLGM9VyhvLGwsZSx0LHIsbixpLGEpLHU9Yy5idWZmZXIsZj1jLmNvdW50O2ZvcihsZXQgZT0wO2U8NCpmOylFKHVbZSsrXSx1W2UrK10sdVtlKytdLHVbZSsrXSl9LFg9W10sWT1lPT57bGV0IHQ9LTEscj1YLmxlbmd0aDtmb3IoO01hdGguYWJzKHItdCk+MTspe2NvbnN0IG49TWF0aC5mbG9vcigocit0KS8yKTtlPD1YW25dLmFyZWE/cj1uOnQ9bn1yZXR1cm4gcn0sSz1lPT57ci5kZWxldGVUZXh0dXJlKGUucmVzb3VyY2UpfSxIPVtdLFE9W107bGV0IFo7bGV0IEo9bnVsbDtsZXQgZWU9bnVsbDtsZXQgdGU9bnVsbDtjb25zdCByZT1lPT57dGU9ZX07bGV0IG5lPSExO2NvbnN0IGllPWU9PntuZT1lfTtsZXQgYWU9bnVsbCxzZT1udWxsLG9lPW51bGwsbGU9bnVsbDtjb25zdCBjZT0oZSx0PSEwKT0+e3ZhciBuO2UubXNhYT8oKGU9PntpZihYLmluZGV4T2YoZSk+LTEpcmV0dXJuO2NvbnN0IHQ9WShlLmFyZWEpO2UuZGlydHk9ITAsWC5zcGxpY2UodCwwLGUpfSkoZS5jb2xvciksZS5jb2xvcj1udWxsLGUuc3RlbmNpbD1udWxsKToodCYmSyhlLnRleHR1cmUpLGUudGV4dHVyZT1udWxsLG49ZS5zdGVuY2lsLEguaW5kZXhPZihuKT4tMXx8KEgubGVuZ3RoPjEwP3IuZGVsZXRlUmVuZGVyYnVmZmVyKG4ucmVzb3VyY2UpOihuLmRpcnR5PSEwLEgucHVzaChuKSkpLGUuc3RlbmNpbD1udWxsKSxRLnB1c2goZSl9O2xldCB1ZT0wO2NvbnN0IGZlPWU9PntpZighWC5sZW5ndGgpcmV0dXJuKCgpPT57Y29uc3QgZT17aWQ6MCxyZXNvdXJjZTpyLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLHdpZHRoOjAsaGVpZ2h0OjAsYXJlYTowLGRpcnR5OiExfTtyZXR1cm57cmVzb3VyY2U6ci5jcmVhdGVSZW5kZXJidWZmZXIoKSxzdGVuY2lsOmUsd2lkdGg6MCxoZWlnaHQ6MCxhcmVhOjAsZGlydHk6ITF9fSkoKTtjb25zdCB0PVkoZSk7aWYodDxYLmxlbmd0aCl7Y29uc3QgZT1YW3RdO3JldHVybiBYLnNwbGljZSh0LDEpLGV9Y29uc3Qgbj1YLnNoaWZ0KCk7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCJ0aGUgY29sb3IgYnVmZmVyIGlzIHZvaWQuIik7cmV0dXJuIG59O2xldCBkZT0wO2NvbnN0IGhlPShlLHQpPT57aWYoIUgubGVuZ3RoKXJldHVybntpZDpkZSsrLHJlc291cmNlOnIuY3JlYXRlUmVuZGVyYnVmZmVyKCksd2lkdGg6MCxoZWlnaHQ6MCxhcmVhOjAsZGlydHk6ITF9O2xldCBuPS0xLGk9MS8wO2ZvcihsZXQgcj0wO3I8SC5sZW5ndGg7KytyKXtjb25zdCBhPUhbcl07YS53aWR0aD49ZSYmYS5oZWlnaHQ+PXQmJmEuYXJlYTxpJiYoaT1hLmFyZWEsbj1yKX1pZigtMSE9PW4pe2NvbnN0IGU9SFtuXTtyZXR1cm4gSFtuXT1IW0gubGVuZ3RoLTFdLEgucG9wKCksZX1yZXR1cm4gSC5wb3AoKX07bGV0IHBlPTA7Y29uc3QgbWU9KGUsdCk9Pih7aWQ6cGUrKyxyZXNvdXJjZTpyLmNyZWF0ZVRleHR1cmUoKSx3aWR0aDplLGhlaWdodDp0LGFyZWE6ZSp0LHNtb290aDohMX0pO2xldCBnZT0tMTtjb25zdCBiZT1lPT57Z2U9ZX0seGU9W251bGwsbnVsbCxudWxsXSx2ZT0oZSx0LG49ITEpPT57Y29uc3QgaT1tZShlLHQpO3JldHVybigoZSx0PSExKT0+e2dlIT09ci5URVhUVVJFMCYmKGJlKHIuVEVYVFVSRTApLHIuYWN0aXZlVGV4dHVyZShyLlRFWFRVUkUwKSkseGVbMF09ZSxyLmJpbmRUZXh0dXJlKHIuVEVYVFVSRV8yRCxlLnJlc291cmNlKSxyLnRleFBhcmFtZXRlcmkoci5URVhUVVJFXzJELHIuVEVYVFVSRV9XUkFQX1Msci5DTEFNUF9UT19FREdFKSxyLnRleFBhcmFtZXRlcmkoci5URVhUVVJFXzJELHIuVEVYVFVSRV9XUkFQX1Qsci5DTEFNUF9UT19FREdFKSxyLnRleFBhcmFtZXRlcmkoci5URVhUVVJFXzJELHIuVEVYVFVSRV9NSU5fRklMVEVSLHQ/ci5MSU5FQVI6ci5ORUFSRVNUKSxyLnRleFBhcmFtZXRlcmkoci5URVhUVVJFXzJELHIuVEVYVFVSRV9NQUdfRklMVEVSLHQ/ci5MSU5FQVI6ci5ORUFSRVNUKSxyLnRleFN0b3JhZ2UyRChyLlRFWFRVUkVfMkQsMSxyLlJHQkE4LGUud2lkdGgsZS5oZWlnaHQpfSkoaSxuKSxpfSx5ZT0oZSxuLGk9ITEpPT57Y29uc3QgYT1RLmxlbmd0aD9RLnBvcCgpOntpZDp1ZSsrLHdpZHRoOjAsaGVpZ2h0OjAsY2xpcExldmVsOjAsbXNhYTohMSxtYXNrOiExLGNvbG9yOm51bGwsdGV4dHVyZTpudWxsLHN0ZW5jaWw6bnVsbH07cmV0dXJuIGEud2lkdGg9ZSxhLmhlaWdodD1uLGk/KGEubXNhYT0hMCxhLnRleHR1cmU9bnVsbCxhLmNvbG9yPSgoZSxuKT0+e2U9TWF0aC5tYXgoMjU2LHAoZSkpLG49TWF0aC5tYXgoMjU2LHAobikpO2NvbnN0IGk9ZmUoZSpuKTtyZXR1cm4oaS53aWR0aDxlfHxpLmhlaWdodDxuKSYmKGU9TWF0aC5tYXgoZSxpLndpZHRoKSxuPU1hdGgubWF4KG4saS5oZWlnaHQpLGkud2lkdGg9ZSxpLmhlaWdodD1uLGkuYXJlYT1lKm4sci5iaW5kUmVuZGVyYnVmZmVyKHIuUkVOREVSQlVGRkVSLGkucmVzb3VyY2UpLHIucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKHIuUkVOREVSQlVGRkVSLHQsci5SR0JBOCxlLG4pLHIuYmluZFJlbmRlcmJ1ZmZlcihyLlJFTkRFUkJVRkZFUixpLnN0ZW5jaWwucmVzb3VyY2UpLHIucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKHIuUkVOREVSQlVGRkVSLHQsci5TVEVOQ0lMX0lOREVYOCxlLG4pKSxpLmRpcnR5PSEwLGl9KShlLG4pLGEuc3RlbmNpbD1hLmNvbG9yLnN0ZW5jaWwpOihhLm1zYWE9ITEsYS50ZXh0dXJlPXZlKGUsbiksYS5jb2xvcj1udWxsLGEuc3RlbmNpbD0oKGUsdCk9Pntjb25zdCBuPWhlKGUsdCk7cmV0dXJuIG4ud2lkdGg9PT1lJiZuLmhlaWdodD09PXR8fChuLndpZHRoPWUsbi5oZWlnaHQ9dCxuLmFyZWE9ZSp0LG4uZGlydHk9ITEsci5iaW5kUmVuZGVyYnVmZmVyKHIuUkVOREVSQlVGRkVSLG4ucmVzb3VyY2UpLHIucmVuZGVyYnVmZmVyU3RvcmFnZShyLlJFTkRFUkJVRkZFUixyLlNURU5DSUxfSU5ERVg4LGUsdCkpLG59KShlLG4pKSxhLm1hc2s9ITEsYS5jbGlwTGV2ZWw9MCxhfSxfZT1OdW1iZXIuTUFYX1ZBTFVFLHdlPS1OdW1iZXIuTUFYX1ZBTFVFO2xldCBNZT0wO2NvbnN0IFBlPWU9PntNZT1lfSxTZT1bXSxGZT0oKT0+e3ZhciB0O3JldHVybiBNZSBpbiBTZXx8KHQ9eWUoZSxlLCEwKSxTZVtNZV09dCksU2VbTWVdfSxUZT1bXTtsZXQgQmU9bnVsbDtjb25zdCBPZT0oKT0+KEJlfHwoQmU9KCgpPT57Y29uc3QgdD1tZShlLGUpO3JldHVybiByLmFjdGl2ZVRleHR1cmUoci5URVhUVVJFMyksci5iaW5kVGV4dHVyZShyLlRFWFRVUkVfMkQsdC5yZXNvdXJjZSksci50ZXhQYXJhbWV0ZXJpKHIuVEVYVFVSRV8yRCxyLlRFWFRVUkVfV1JBUF9TLHIuQ0xBTVBfVE9fRURHRSksci50ZXhQYXJhbWV0ZXJpKHIuVEVYVFVSRV8yRCxyLlRFWFRVUkVfV1JBUF9ULHIuQ0xBTVBfVE9fRURHRSksci50ZXhQYXJhbWV0ZXJpKHIuVEVYVFVSRV8yRCxyLlRFWFRVUkVfTUlOX0ZJTFRFUixyLkxJTkVBUiksci50ZXhQYXJhbWV0ZXJpKHIuVEVYVFVSRV8yRCxyLlRFWFRVUkVfTUFHX0ZJTFRFUixyLk5FQVJFU1QpLHIudGV4U3RvcmFnZTJEKHIuVEVYVFVSRV8yRCwxLHIuUkdCQTgsdC53aWR0aCx0LmhlaWdodCksci5hY3RpdmVUZXh0dXJlKC0xIT09Z2U/Z2U6ci5URVhUVVJFMCksdH0pKCkpLEJlKSxBZT1bXSxSZT1lPT4oZSBpbiBBZXx8KEFlW2VdPW5ldyBGbG9hdDMyQXJyYXkoW19lLF9lLHdlLHdlXSkpLEFlW2VdKTtsZXQgQ2U9MDtjb25zdCBFZT1lPT57Q2U9ZX0sVWU9KCk9PntUZS5sZW5ndGg9MCxQZSgwKTtjb25zdCBlPVNlO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKWNlKGVbdF0pO2UubGVuZ3RoPTB9LCRlPShlLHQsbixpPSEwKT0+e2lmKGUuY2xlYXJBcnJheXNJbnN0YW5jZWQoKSxlLiRzdGFja0F0dGFjaG1lbnRPYmplY3QubGVuZ3RoKWZvcihsZXQgdD0wO3Q8ZS4kc3RhY2tBdHRhY2htZW50T2JqZWN0Lmxlbmd0aDsrK3Qpe2NvbnN0IHI9ZS4kc3RhY2tBdHRhY2htZW50T2JqZWN0W3RdO3ImJmNlKHIpfWVsc2UgZS4kbWFpbkF0dGFjaG1lbnRPYmplY3QmJmNlKGUuJG1haW5BdHRhY2htZW50T2JqZWN0KTtpJiZVZSgpLHJlKG51bGwpLG5lJiYoaWUoITEpLHIuYmluZEZyYW1lYnVmZmVyKHIuRlJBTUVCVUZGRVIsbnVsbCkpLGUuJG1haW5BdHRhY2htZW50T2JqZWN0PXllKHQsbiwhMCksZS5iaW5kKGUuJG1haW5BdHRhY2htZW50T2JqZWN0KX0sR2U9KGUsdCxuPW51bGwsaT0hMSk9PnstMSE9PWdlJiZ0PT09Z2V8fChiZSh0KSxyLmFjdGl2ZVRleHR1cmUodCkpO2NvbnN0IGE9eGVbZV07bnVsbCE9PWEmJm51bGwhPT1uJiZhLmlkPT09bi5pZHx8bj09PWF8fCh4ZVtlXT1uLHIuYmluZFRleHR1cmUoci5URVhUVVJFXzJELG4/bi5yZXNvdXJjZTpudWxsKSxuJiZuLnNtb290aCE9PWkmJihuLnNtb290aD1pLHIudGV4UGFyYW1ldGVyaShyLlRFWFRVUkVfMkQsci5URVhUVVJFX01JTl9GSUxURVIsaT9yLkxJTkVBUjpyLk5FQVJFU1QpLHIudGV4UGFyYW1ldGVyaShyLlRFWFRVUkVfMkQsci5URVhUVVJFX01BR19GSUxURVIsaT9yLkxJTkVBUjpyLk5FQVJFU1QpKSl9LGtlPShlLHQ9ITEpPT57R2UoMixyLlRFWFRVUkUyLG51bGwpLEdlKDEsci5URVhUVVJFMSxudWxsKSxHZSgwLHIuVEVYVFVSRTAsZSx0KX0sTGU9KCk9Pntjb25zdCBlPW4uY3VycmVudEF0dGFjaG1lbnRPYmplY3Q7aWYoIWUpcmV0dXJuO2NvbnN0IHQ9ZS5jbGlwTGV2ZWw7bGV0IGk9MDtmb3IobGV0IGU9MDtlPHQ7KytlKWl8PSgxPDx0LWUpLTE7ci5zdGVuY2lsTWFzaygyNTUpLHIuc3RlbmNpbEZ1bmMoci5FUVVBTCwyNTUmaSxpKSxyLnN0ZW5jaWxPcChyLktFRVAsci5LRUVQLHIuS0VFUCksci5jb2xvck1hc2soITAsITAsITAsITApLHIuZGlzYWJsZShyLlNBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSkscygpfTtsZXQgSWU9ITE7Y29uc3QgVmU9ZT0+e0llPWV9LHplPSgpPT5JZSxqZT1uZXcgTWFwLERlPW5ldyBNYXAsTmU9KGUsdCk9Pntjb25zdCBuPXRlO2lmKG4mJnQuaWQ9PT1uLmlkKXJldHVybjt2YXIgaSxhOyhlPT57cmUoZSksbmV8fChpZSghMCksci5iaW5kRnJhbWVidWZmZXIoci5GUkFNRUJVRkZFUixaKSksZS5tc2FhPyhyLmJpbmRSZW5kZXJidWZmZXIoci5SRU5ERVJCVUZGRVIsZS5jb2xvci5yZXNvdXJjZSksci5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcihyLkZSQU1FQlVGRkVSLHIuQ09MT1JfQVRUQUNITUVOVDAsci5SRU5ERVJCVUZGRVIsZS5jb2xvci5yZXNvdXJjZSkpOihrZShlLnRleHR1cmUpLHIuZnJhbWVidWZmZXJUZXh0dXJlMkQoci5GUkFNRUJVRkZFUixyLkNPTE9SX0FUVEFDSE1FTlQwLHIuVEVYVFVSRV8yRCxlLnRleHR1cmUucmVzb3VyY2UsMCksR2UoMCxyLlRFWFRVUkUwLG51bGwpKSxyLmJpbmRSZW5kZXJidWZmZXIoci5SRU5ERVJCVUZGRVIsZS5zdGVuY2lsLnJlc291cmNlKSxyLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKHIuRlJBTUVCVUZGRVIsci5TVEVOQ0lMX0FUVEFDSE1FTlQsci5SRU5ERVJCVUZGRVIsZS5zdGVuY2lsLnJlc291cmNlKX0pKHQpLG4mJm4ud2lkdGg9PT10LndpZHRoJiZuLmhlaWdodD09PXQuaGVpZ2h0fHwoaT10LndpZHRoLGE9dC5oZWlnaHQsUD1pLFM9YSxyLnZpZXdwb3J0KDAsMCx0LndpZHRoLHQuaGVpZ2h0KSk7Y29uc3Qgbz10Lm1zYWE/dC5jb2xvcjp0LnN0ZW5jaWw7dmFyIHU7by5kaXJ0eSYmKG8uZGlydHk9ITEsZS5jbGVhclJlY3QoMCwwLHQud2lkdGgsdC5oZWlnaHQpKSwhKHU9dC5tYXNrKSYmemUoKT8oVmUoITEpLGMoKSxzKCkpOnUmJiF6ZSgpJiYoVmUoITApLGwoKSxMZSgpKX0sV2U9ZT0+e2lmKCFlLiRzdGFjay5sZW5ndGgpcmV0dXJuO2NvbnN0IHQ9ZS4kc3RhY2sucG9wKCk7dmFyIHI7ZS4kbWF0cml4WzBdPXRbMF0sZS4kbWF0cml4WzFdPXRbMV0sZS4kbWF0cml4WzNdPXRbM10sZS4kbWF0cml4WzRdPXRbNF0sZS4kbWF0cml4WzZdPXRbNl0sZS4kbWF0cml4WzddPXRbN10scj10LHgucHVzaChyKX0scWU9KGUsdCxyLG4saSxhLHMsbyxsLGMsdSxmLGQpPT57Y29uc3QgaD1lLmxlbmd0aC01O2ZvcihsZXQgcD0zO3A8aDtwKz0zKXtsZXQgaD0xNypyO2VbcCsyXT8odFtoKytdPWVbcC0zXSx0W2grK109ZVtwLTJdLHRbaCsrXT0wLHRbaCsrXT0wLHRbaCsrXT1jLHRbaCsrXT11LHRbaCsrXT1mLHRbaCsrXT1kLHRbaCsrXT1uLHRbaCsrXT1pLHRbaCsrXT0wLHRbaCsrXT1hLHRbaCsrXT1zLHRbaCsrXT0wLHRbaCsrXT1vLHRbaCsrXT1sLHRbaCsrXT0wLHRbaCsrXT1lW3BdLHRbaCsrXT1lW3ArMV0sdFtoKytdPS41LHRbaCsrXT0wLHRbaCsrXT1jLHRbaCsrXT11LHRbaCsrXT1mLHRbaCsrXT1kLHRbaCsrXT1uLHRbaCsrXT1pLHRbaCsrXT0wLHRbaCsrXT1hLHRbaCsrXT1zLHRbaCsrXT0wLHRbaCsrXT1vLHRbaCsrXT1sLHRbaCsrXT0wLHRbaCsrXT1lW3ArM10sdFtoKytdPWVbcCs0XSx0W2grK109MSx0W2grK109MSx0W2grK109Yyx0W2grK109dSx0W2grK109Zix0W2grK109ZCx0W2grK109bix0W2grK109aSx0W2grK109MCx0W2grK109YSx0W2grK109cyx0W2grK109MCx0W2grK109byx0W2grK109bCx0W2grK109MCk6ZVtwKzVdPyh0W2grK109ZVswXSx0W2grK109ZVsxXSx0W2grK109LjUsdFtoKytdPS41LHRbaCsrXT1jLHRbaCsrXT11LHRbaCsrXT1mLHRbaCsrXT1kLHRbaCsrXT1uLHRbaCsrXT1pLHRbaCsrXT0wLHRbaCsrXT1hLHRbaCsrXT1zLHRbaCsrXT0wLHRbaCsrXT1vLHRbaCsrXT1sLHRbaCsrXT0wLHRbaCsrXT1lW3BdLHRbaCsrXT1lW3ArMV0sdFtoKytdPS41LHRbaCsrXT0uNSx0W2grK109Yyx0W2grK109dSx0W2grK109Zix0W2grK109ZCx0W2grK109bix0W2grK109aSx0W2grK109MCx0W2grK109YSx0W2grK109cyx0W2grK109MCx0W2grK109byx0W2grK109bCx0W2grK109MCx0W2grK109ZVtwKzZdLHRbaCsrXT1lW3ArN10sdFtoKytdPS41LHRbaCsrXT0uNSx0W2grK109Yyx0W2grK109dSx0W2grK109Zix0W2grK109ZCx0W2grK109bix0W2grK109aSx0W2grK109MCx0W2grK109YSx0W2grK109cyx0W2grK109MCx0W2grK109byx0W2grK109bCx0W2grK109MCk6KHRbaCsrXT1lWzBdLHRbaCsrXT1lWzFdLHRbaCsrXT0uNSx0W2grK109LjUsdFtoKytdPWMsdFtoKytdPXUsdFtoKytdPWYsdFtoKytdPWQsdFtoKytdPW4sdFtoKytdPWksdFtoKytdPTAsdFtoKytdPWEsdFtoKytdPXMsdFtoKytdPTAsdFtoKytdPW8sdFtoKytdPWwsdFtoKytdPTAsdFtoKytdPWVbcF0sdFtoKytdPWVbcCsxXSx0W2grK109LjUsdFtoKytdPS41LHRbaCsrXT1jLHRbaCsrXT11LHRbaCsrXT1mLHRbaCsrXT1kLHRbaCsrXT1uLHRbaCsrXT1pLHRbaCsrXT0wLHRbaCsrXT1hLHRbaCsrXT1zLHRbaCsrXT0wLHRbaCsrXT1vLHRbaCsrXT1sLHRbaCsrXT0wLHRbaCsrXT1lW3ArM10sdFtoKytdPWVbcCs0XSx0W2grK109LjUsdFtoKytdPS41LHRbaCsrXT1jLHRbaCsrXT11LHRbaCsrXT1mLHRbaCsrXT1kLHRbaCsrXT1uLHRbaCsrXT1pLHRbaCsrXT0wLHRbaCsrXT1hLHRbaCsrXT1zLHRbaCsrXT0wLHRbaCsrXT1vLHRbaCsrXT1sLHRbaCsrXT0wKSxyKz0zfXJldHVybiByfSxYZT1lPT4oZS0tLGV8PWU+PjEsZXw9ZT4+MixlfD1lPj40LGV8PWU+PjgsZXw9ZT4+MTYsKytlKTtsZXQgWWU9bmV3IEZsb2F0MzJBcnJheSgxMjgpLEtlPTA7Y29uc3QgSGU9ZT0+e2NvbnN0IHQ9ZS5sZW5ndGgrS2U7aWYodD5ZZS5sZW5ndGgpe2NvbnN0IHI9bmV3IEZsb2F0MzJBcnJheShYZSh0KSk7ci5zZXQoWWUpLHIuc2V0KGUsS2UpLFllPXJ9ZWxzZSBZZS5zZXQoZSxLZSk7S2UrPWUubGVuZ3RofSxRZT1bXSxaZT1bXSxKZT0oKT0+e1plLmxlbmd0aD0wLEtlPTAsUWUubGVuZ3RoPTB9O2xldCBldD1uZXcgRmxvYXQzMkFycmF5KDMyKTtjb25zdCB0dD0oZSx0PSJmaWxsIik9Pntjb25zdCByPSJmaWxsIj09PXQ/bi4kZmlsbFN0eWxlOm4uJHN0cm9rZVN0eWxlLGk9clswXSxhPXJbMV0scz1yWzJdLG89clszXSxsPW4uJG1hdHJpeCxjPVAsdT1TLGY9bFswXS9jLGQ9bFszXS9jLGg9bFs2XS9jLHA9bFsxXS91LG09bFs0XS91LGc9bFs3XS91O2xldCBiPTA7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDsrK3QpYis9NTEqKGVbdF0ubGVuZ3RoLzMtMik7Y29uc3QgeD0odj1iLGV0Lmxlbmd0aDx2JiYoZXQ9bmV3IEZsb2F0MzJBcnJheShYZSh2KSkpLGV0KTt2YXIgdjtsZXQgeT0wO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7Kyt0KXk9cWUoZVt0XSx4LHksZixwLGQsbSxoLGcsaSxhLHMsbyk7cmV0dXJue2J1ZmZlcjp4LnN1YmFycmF5KDAsYiksaW5kZXhDb3VudDp5fX0scnQ9W10sbnQ9KGUsdCxyKT0+e2NvbnN0IG49e3g6dC54LWUueCx5OnQueS1lLnl9LGk9KChlLHQscik9Pntjb25zdCBuPU1hdGguc3FydChlKmUrdCp0KTtyZXR1cm57eDotdC9uKnIseTplL24qcn19KShuLngsbi55LHIpLGE9e3g6ZS54K2kueCx5OmUueStpLnl9LHM9e3g6dC54K2kueCx5OnQueStpLnl9LG89e3g6ZS54LWkueCx5OmUueS1pLnl9LGw9e3g6dC54LWkueCx5OnQueS1pLnl9O3JldHVyblthLngsYS55LCExLHMueCxzLnksITEsbC54LGwueSwhMSxvLngsby55LCExLGEueCxhLnksITFdfSxpdD0oZSx0LHIpPT4oe3g6ZS54Kyh0LngtZS54KSpyLHk6ZS55Kyh0LnktZS55KSpyfSksYXQ9KGUsdCxyLG49LjUpPT57Y29uc3QgaT1pdChlLHQsbiksYT1pdCh0LHIsbikscz1pdChpLGEsbik7cmV0dXJuW1tlLGksc10sW3MsYSxyXV19LHN0PShlLHQscixuKT0+KHt4OigxLWUpKioyKnQueCsyKigxLWUpKmUqci54K2UqKjIqbi54LHk6KDEtZSkqKjIqdC55KzIqKDEtZSkqZSpyLnkrZSoqMipuLnl9KSxvdD0oZSx0LHIsbik9Pih7eDoyKigxLWUpKihyLngtdC54KSsyKmUqKG4ueC1yLngpLHk6MiooMS1lKSooci55LXQueSkrMiplKihuLnktci55KX0pLGx0PWU9Pntjb25zdCB0PU1hdGguc3FydChlLngqZS54K2UueSplLnkpO3JldHVybiAwPT09dD97eDowLHk6MH06e3g6ZS54L3QseTplLnkvdH19LGN0PShlLHQscixuKT0+e2NvbnN0IGk9WzAsLjUsMV0sYT1bXTtmb3IobGV0IHM9MDtzPGkubGVuZ3RoOysrcyl7Y29uc3Qgbz1pW3NdLGw9c3QobyxlLHQsciksYz1vdChvLGUsdCxyKSx1PWx0KHt4Oi1jLnkseTpjLnh9KTthLnB1c2goe3g6bC54K3UueCpuLHk6bC55K3UueSpufSl9cmV0dXJuIGF9LHV0PShlLHQscixuKT0+e2NvbnN0IGk9KChlLHQscixuPTQpPT57bGV0IGk9W1tlLHQscl1dO2ZvcihsZXQgZT0wO2U8bjsrK2Upe2NvbnN0IGU9W107Zm9yKGxldCB0PTA7dDxpLmxlbmd0aDsrK3Qpe2NvbnN0IHI9aVt0XTtpZighciljb250aW51ZTtjb25zdCBuPWF0KHJbMF0sclsxXSxyWzJdLC41KTtlLnB1c2goblswXSxuWzFdKX1pPWV9cmV0dXJuIGl9KShlLHQsciw1KSxhPVtdLHM9W107Zm9yKGxldCBlPTA7ZTxpLmxlbmd0aDsrK2Upe2NvbnN0W3QscixvXT1pW2VdO2EucHVzaChjdCh0LHIsbywrbikpLHMucHVzaChjdCh0LHIsbywtbikpfWNvbnN0IG89YVswXVswXSxsPVtvLngsby55LCExXTtmb3IobGV0IGU9MDtlPGEubGVuZ3RoOysrZSl7Y29uc3QgdD1hW2VdO2wucHVzaCh0WzFdLngsdFsxXS55LCEwLHRbMl0ueCx0WzJdLnksITEpfWNvbnN0IGM9Wy4uLnNdLnJldmVyc2UoKTtmb3IobGV0IGU9MDtlPGMubGVuZ3RoOysrZSl7Y29uc3RbdCxyLG5dPWNbZV07Y1tlXT1bbixyLHRdfWNvbnN0IHU9Y1swXVswXTtsLnB1c2godS54LHUueSwhMSk7Zm9yKGxldCBlPTA7ZTxjLmxlbmd0aDsrK2Upe2NvbnN0IHQ9Y1tlXTtsLnB1c2godFsxXS54LHRbMV0ueSwhMCx0WzJdLngsdFsyXS55LCExKX1yZXR1cm4gbH0sZnQ9KGUsdCxyLG4pPT57Y29uc3QgaT1bXTtmb3IobGV0IGE9MDthPG4ubGVuZ3RoO2ErPTMpe2lmKG5bYSsyXSljb250aW51ZTtjb25zdCBzPW5bYV0sbz1uW2ErMV0sbD1NYXRoLnNxcnQoTWF0aC5wb3cocy1lLDIpK01hdGgucG93KG8tdCwyKSk7TWF0aC5hYnMobC1yKT4xZS00fHxpLnB1c2gocyxvKX1yZXR1cm4gaX0sZHQ9bmV3IE9mZnNjcmVlbkNhbnZhcygxLDEpLmdldENvbnRleHQoIjJkIiksaHQ9KGUsdCk9PntkdC5iZWdpblBhdGgoKSxkdC5tb3ZlVG8odFswXSx0WzFdKTtmb3IobGV0IGU9MztlPHQubGVuZ3RoO2UrPTMpdFtlKzJdPyhkdC5xdWFkcmF0aWNDdXJ2ZVRvKHRbZV0sdFtlKzFdLHRbZSszXSx0W2UrNF0pLGUrPTMpOmR0LmxpbmVUbyh0W2VdLHRbZSsxXSk7ZHQuY2xvc2VQYXRoKCk7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kz0yKXtjb25zdCByPWVbdF0sbj1lW3QrMV07aWYoIWR0LmlzUG9pbnRJblBhdGgocixuKSlyZXR1cm5bcixuXX1yZXR1cm4gbnVsbH0scHQ9KGUsdCxyLG4saT0hMSk9Pntjb25zdCBhPWk/MDpuLmxlbmd0aC0xLHM9aT9uLmxlbmd0aC0xOm4ubGVuZ3RoLTIsbz1uW2FdLmxlbmd0aD4xNSxsPW5bc10ubGVuZ3RoPjE1O2lmKG8mJmwpcmV0dXJuO2NvbnN0IGM9ZnQoZSx0LHIsblthXSksdT1mdChlLHQscixuW3NdKSxmPWh0KGMsbltzXSk7aWYoIWYpcmV0dXJuO2NvbnN0IGQ9aHQodSxuW2FdKTtpZighZClyZXR1cm47Y29uc3QgaD1NYXRoLmF0YW4yKGZbMV0tdCxmWzBdLWUpO2xldCBwPU1hdGguYXRhbjIoZFsxXS10LGRbMF0tZSktaDtwPk1hdGguUEk/cC09MipNYXRoLlBJOnA8LU1hdGguUEkmJihwKz0yKk1hdGguUEkpO2NvbnN0IG09TWF0aC5hYnMocCk7aWYobTwuMXx8bT5NYXRoLlBJLS4xKXJldHVybjtjb25zdCBnPXAvOCxiPVtlLHQsITFdO2ZvcihsZXQgbj0wO248PTg7bisrKXtjb25zdCBpPWgrbipnLGE9ZStyKk1hdGguY29zKGkpLHM9dCtyKk1hdGguc2luKGkpO2IucHVzaChhLHMsITEpfW4uc3BsaWNlKC0xLDAsYil9LG10PShlLHQscixuLGk9ITEpPT57Y29uc3QgYT1pPzA6bi5sZW5ndGgtMSxzPWk/bi5sZW5ndGgtMTpuLmxlbmd0aC0yLG89blthXS5sZW5ndGg+MTUsbD1uW3NdLmxlbmd0aD4xNTtpZihvJiZsKXJldHVybjtjb25zdCBjPWZ0KGUsdCxyLG5bYV0pLHU9ZnQoZSx0LHIsbltzXSk7aWYoY1swXT09PXVbMF0mJmNbMV09PT11WzFdfHxjWzBdPT09dVsyXSYmY1sxXT09PXVbM10pcmV0dXJuO2NvbnN0IGY9aHQoYyxuW3NdKTtpZighZilyZXR1cm47Y29uc3QgZD1odCh1LG5bYV0pO2QmJm4uc3BsaWNlKC0xLDAsW2UsdCwhMSxmWzBdLGZbMV0sITEsZFswXSxkWzFdLCExLGUsdCwhMV0pfSxndD0oZSx0LHIsbixpLGE9ITEpPT57Y29uc3Qgcz1hPzA6aS5sZW5ndGgtMSxvPWE/aS5sZW5ndGgtMTppLmxlbmd0aC0yLGw9aVtzXS5sZW5ndGg+MTUsYz1pW29dLmxlbmd0aD4xNTtpZihsJiZjKXJldHVybjtjb25zdCB1PWZ0KGUueCxlLnksbixpW3NdKSxmPWZ0KGUueCxlLnksbixpW29dKTtpZih1WzBdPT09ZlswXSYmdVsxXT09PWZbMV18fHVbMF09PT1mWzJdJiZ1WzFdPT09ZlszXSlyZXR1cm47Y29uc3QgZD1odCh1LGlbb10pO2lmKCFkKXJldHVybjtjb25zdCBoPWh0KGYsaVtzXSk7aWYoIWgpcmV0dXJuO2NvbnN0IHA9dC54LWUueCxtPXQueS1lLnksZz1NYXRoLmh5cG90KHAsbSksYj17eDpwL2cseTptL2d9LHg9ci54LWUueCx2PXIueS1lLnkseT1NYXRoLmh5cG90KHgsdiksXz17eDp4L3kseTp2L3l9LHc9Yi54LE09Yi55LFA9Xy54LFM9Xy55LEY9dypTLU0qUDtpZigwPT09RilyZXR1cm4gdm9pZCBpLnNwbGljZSgtMSwwLFtlLngsZS55LCExLGRbMF0sZFsxXSwhMSxoWzBdLGhbMV0sITFdKTtjb25zdCBUPSgoaFswXS1kWzBdKSpTLShoWzFdLWRbMV0pKlApL0YsQj1kWzBdK1QqdyxPPWRbMV0rVCpNO2kuc3BsaWNlKC0xLDAsW2UueCxlLnksITEsZFswXSxkWzFdLCExLEIsTywhMSxlLngsZS55LCExLGhbMF0saFsxXSwhMSxCLE8sITFdKX0sYnQ9e3g6MCx5OjB9LHh0PXt4OjAseTowfSx2dD17eDowLHk6MH0seXQ9e3g6MCx5OjB9LF90PShlLHQpPT57Y29uc3Qgcj1idDtyLng9ZVswXSxyLnk9ZVsxXTtjb25zdCBpPXh0O2kueD0wLGkueT0wO2NvbnN0IGE9dnQ7YS54PTAsYS55PTA7Y29uc3Qgcz15dDtzLng9MCxzLnk9MDtjb25zdCBvPVtdO2ZvcihsZXQgbD0zO2w8ZS5sZW5ndGg7bCs9Myl7Y29uc3QgYz1lW2xdLHU9ZVtsKzFdO2lmKGVbbCsyXSlpLng9YyxpLnk9dTtlbHNle2lmKGEueD1jLGEueT11LGVbbC0xXT9vLnB1c2godXQocixpLGEsdCkpOm8ucHVzaChudChyLGEsdCkpLG8ubGVuZ3RoPjEpc3dpdGNoKG4uam9pbnRzKXtjYXNlIDA6bXQoci54LHIueSx0LG8pO2JyZWFrO2Nhc2UgMTpzLng9ZVtsLTZdLHMueT1lW2wtNV0sZ3QocixhLHMsdCxvKTticmVhaztjYXNlIDI6cHQoci54LHIueSx0LG8pfXIueD1hLngsci55PWEueX19Y29uc3QgbD1lWzBdLGM9ZVsxXSx1PWVbZS5sZW5ndGgtM10sZj1lW2UubGVuZ3RoLTJdLGQ9MWUtNDtpZihNYXRoLmFicyhsLXUpPGQmJk1hdGguYWJzKGMtZik8ZCYmby5sZW5ndGg+MSlzd2l0Y2gobi5qb2ludHMpe2Nhc2UgMDptdChsLGMsdCxvLCEwKTticmVhaztjYXNlIDE6ci54PWwsci55PWMsYS54PWVbM10sYS55PWVbNF0scy54PWVbZS5sZW5ndGgtNl0scy55PWVbZS5sZW5ndGgtNV0sZ3QocixhLHMsdCxvLCEwKTticmVhaztjYXNlIDI6cHQobCxjLHQsbywhMCl9ZWxzZSBzd2l0Y2gobi5jYXBzKXtjYXNlIDE6KChlLHQscik9Pntmb3IobGV0IG49MDtuPDI7KytuKXtsZXQgaT0wLGE9MCxzPTAsbz0wOzA9PT1uPyhpPWVbMF0sYT1lWzFdLHM9ZVszXSxvPWVbNF0pOihpPWVbZS5sZW5ndGgtM10sYT1lW2UubGVuZ3RoLTJdLHM9ZVtlLmxlbmd0aC02XSxvPWVbZS5sZW5ndGgtNV0pO2NvbnN0IGw9cy1pLGM9by1hLHU9TWF0aC5hdGFuMihjLGwpLGY9dStNYXRoLlBJLzIsZD11LU1hdGguUEkvMixoPTE2LHA9KGQtZikvaCxtPVtdO2ZvcihsZXQgZT0wO2U8PWg7ZSsrKXtjb25zdCByPWQrcCplLG49aSt0Kk1hdGguY29zKHIpLHM9YSt0Kk1hdGguc2luKHIpO20ucHVzaChuLHMsITEpfTA9PT1uP3IudW5zaGlmdChtKTpyLnB1c2gobSl9fSkoZSx0LG8pO2JyZWFrO2Nhc2UgMjooKGUsdCxyKT0+e2ZvcihsZXQgbj0wO248MjsrK24pe2xldCBpPTAsYT0wLHM9MCxvPTA7MD09PW4/KGk9ZVswXSxhPWVbMV0scz1lWzNdLG89ZVs0XSk6KGk9ZVtlLmxlbmd0aC0zXSxhPWVbZS5sZW5ndGgtMl0scz1lW2UubGVuZ3RoLTZdLG89ZVtlLmxlbmd0aC01XSk7Y29uc3QgbD0tKHMtaSksYz0tKG8tYSksdT1NYXRoLnNxcnQobCpsK2MqYyk7aWYoMD09PXUpY29udGludWU7Y29uc3QgZj1sL3UsZD1jL3UsaD1pK3QqZixwPWErdCpkLG09LWQsZz1baCt0KmYrdCptLHArdCpkK3QqZiwhMSxoK3QqZi10Km0scCt0KmQtdCpmLCExLGgtdCpmLXQqbSxwLXQqZC10KmYsITEsaCt0KmYrdCptLHArdCpkK3QqZiwhMSxoLXQqZi10Km0scC10KmQtdCpmLCExLGgtdCpmK3QqbSxwLXQqZCt0KmYsITFdOzA9PT1uP3IudW5zaGlmdChnKTpyLnB1c2goZyl9fSkoZSx0LG8pfXJldHVybiBvfSx3dD1lPT57Y29uc3QgdD1uLnRoaWNrbmVzcy8yLHI9ZCgpO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7KytuKXtjb25zdCBpPV90KGVbbl0sdCk7Zm9yKGxldCBlPTA7ZTxpLmxlbmd0aDsrK2Upci5wdXNoKGlbZV0pfWNvbnN0IGk9dHQociwic3Ryb2tlIik7cmV0dXJuIHIubGVuZ3RoPTAsaChyKSxpfSxNdD1uZXcgTWFwLFB0PSgpPT57TXQuY2xlYXIoKX0sU3Q9KCk9Pih7aWQ6ImZ1bmN0aW9uIj09dHlwZW9mIGNyeXB0bz8ucmFuZG9tVVVJRD9jcnlwdG8ucmFuZG9tVVVJRCgpOiJ4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgiLnJlcGxhY2UoL1t4eV0vZyxlPT57Y29uc3QgdD0xNipNYXRoLnJhbmRvbSgpfDA7cmV0dXJuKCJ4Ij09PWU/dDozJnR8OCkudG9TdHJpbmcoMTYpfSkscmVzb3VyY2U6ci5jcmVhdGVWZXJ0ZXhBcnJheSgpLHZlcnRleEJ1ZmZlcjpyLmNyZWF0ZUJ1ZmZlcigpLHZlcnRleExlbmd0aDowfSk7bGV0IEZ0O2NvbnN0IFR0PWU9PntGdCYmRnQuaWQ9PT1lLmlkfHwoRnQ9ZSxyLmJpbmRWZXJ0ZXhBcnJheShlLnJlc291cmNlKSl9LEJ0PVtdLE90PW5ldyBGbG9hdDMyQXJyYXkoWzAsMCwwLDEsMSwwLDEsMV0pO2xldCBBdDtsZXQgUnQ7bGV0IEN0O2NvbnN0IEV0PSgpPT4oQ3R8fChDdD0oKCk9Pntjb25zdCBlPVN0KCk7VHQoZSksci5iaW5kQnVmZmVyKHIuQVJSQVlfQlVGRkVSLGUudmVydGV4QnVmZmVyKTtjb25zdCB0PW5ldyBGbG9hdDMyQXJyYXkoWzAsMCwxLDAsMSwxLDAsMCwxLDEsMCwxXSk7cmV0dXJuIHIuYnVmZmVyRGF0YShyLkFSUkFZX0JVRkZFUix0LHIuU1RBVElDX0RSQVcpLHIuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoMCksci52ZXJ0ZXhBdHRyaWJQb2ludGVyKDAsMixyLkZMT0FULCExLDAsMCksZX0pKCkpLEN0KSxVdD0oKT0+e2NvbnN0IGU9KCgpPT57aWYoQnQubGVuZ3RoKXJldHVybiBCdC5wb3AoKTtjb25zdCBlPVN0KCk7cmV0dXJuIFR0KGUpLHIuYmluZEJ1ZmZlcihyLkFSUkFZX0JVRkZFUixlLnZlcnRleEJ1ZmZlciksci5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSgwKSxyLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDEpLHIuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoMiksci5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSgzKSxyLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDQpLHIuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoNSksci52ZXJ0ZXhBdHRyaWJQb2ludGVyKDAsMixyLkZMT0FULCExLDY4LDApLHIudmVydGV4QXR0cmliUG9pbnRlcigxLDIsci5GTE9BVCwhMSw2OCw4KSxyLnZlcnRleEF0dHJpYlBvaW50ZXIoMiw0LHIuRkxPQVQsITEsNjgsMTYpLHIudmVydGV4QXR0cmliUG9pbnRlcigzLDMsci5GTE9BVCwhMSw2OCwzMiksci52ZXJ0ZXhBdHRyaWJQb2ludGVyKDQsMyxyLkZMT0FULCExLDY4LDQ0KSxyLnZlcnRleEF0dHJpYlBvaW50ZXIoNSwzLHIuRkxPQVQsITEsNjgsNTYpLGV9KSgpO1R0KGUpO2NvbnN0IHQ9WWUsbj1LZTtyZXR1cm4gci5iaW5kQnVmZmVyKHIuQVJSQVlfQlVGRkVSLGUudmVydGV4QnVmZmVyKSxlLnZlcnRleExlbmd0aDx0Lmxlbmd0aCYmKGUudmVydGV4TGVuZ3RoPXAodC5sZW5ndGgpLHIuYnVmZmVyRGF0YShyLkFSUkFZX0JVRkZFUiw0KmUudmVydGV4TGVuZ3RoLHIuU1RSRUFNX0RSQVcpKSxyLmJ1ZmZlclN1YkRhdGEoci5BUlJBWV9CVUZGRVIsMCx0LnN1YmFycmF5KDAsbikpLGV9LCR0PWU9PntCdC5pbmRleE9mKGUpPi0xfHxCdC5wdXNoKGUpfTtsZXQgR3Q9MDtsZXQga3Q9LTE7Y2xhc3MgTHR7Y29uc3RydWN0b3IoZSx0LG49ITEpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJfJHByb2dyYW1PYmplY3QiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiXyR1bmlmb3JtTWFwIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImhpZ2hwIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIm1lZGl1bXAiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywidGV4dHVyZXMiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSx0aGlzLl8kcHJvZ3JhbU9iamVjdD0oKGUsdCk9Pntjb25zdCBuPXIuY3JlYXRlUHJvZ3JhbSgpLGk9ci5jcmVhdGVTaGFkZXIoci5WRVJURVhfU0hBREVSKTtyLnNoYWRlclNvdXJjZShpLGUpLHIuY29tcGlsZVNoYWRlcihpKTtjb25zdCBhPXIuY3JlYXRlU2hhZGVyKHIuRlJBR01FTlRfU0hBREVSKTtyZXR1cm4gci5zaGFkZXJTb3VyY2UoYSx0KSxyLmNvbXBpbGVTaGFkZXIoYSksci5hdHRhY2hTaGFkZXIobixpKSxyLmF0dGFjaFNoYWRlcihuLGEpLHIubGlua1Byb2dyYW0obiksci5kZXRhY2hTaGFkZXIobixpKSxyLmRldGFjaFNoYWRlcihuLGEpLHIuZGVsZXRlU2hhZGVyKGkpLHIuZGVsZXRlU2hhZGVyKGEpLHtpZDpHdCsrLHJlc291cmNlOm59fSkoZSx0KSx0aGlzLl8kdW5pZm9ybU1hcD1uZXcgTWFwLCgoZSx0LG49ITEpPT57Y29uc3QgaT1yLmdldFByb2dyYW1QYXJhbWV0ZXIoZSxyLkFDVElWRV9VTklGT1JNUyk7Zm9yKGxldCBhPTA7YTxpOysrYSl7Y29uc3QgaT1yLmdldEFjdGl2ZVVuaWZvcm0oZSxhKSxzPWkubmFtZS5lbmRzV2l0aCgiWzBdIik/aS5uYW1lLnNsaWNlKDAsLTMpOmkubmFtZSxvPXIuZ2V0VW5pZm9ybUxvY2F0aW9uKGUscyk7aWYoaS50eXBlPT09ci5TQU1QTEVSXzJEJiYxPT09aS5zaXplJiYhbiljb250aW51ZTtjb25zdCBsPXt9O3N3aXRjaChpLnR5cGUpe2Nhc2Ugci5GTE9BVF9WRUM0OmwubWV0aG9kPXIudW5pZm9ybTRmdi5iaW5kKHIsbyksbC5hcnJheT1uZXcgRmxvYXQzMkFycmF5KDQqaS5zaXplKSxsLmFzc2lnbj0tMTticmVhaztjYXNlIHIuSU5UX1ZFQzQ6bC5tZXRob2Q9ci51bmlmb3JtNGl2LmJpbmQocixvKSxsLmFycmF5PW5ldyBJbnQzMkFycmF5KDQqaS5zaXplKSxsLmFzc2lnbj0tMTticmVhaztjYXNlIHIuU0FNUExFUl8yRDpsLm1ldGhvZD1uP3IudW5pZm9ybTFpLmJpbmQocixvLDMpOnIudW5pZm9ybTFpdi5iaW5kKHIsbyksbC5hcnJheT1uZXcgSW50MzJBcnJheShpLnNpemUpLGwuYXNzaWduPTE7YnJlYWs7Y2FzZSByLkZMT0FUOmNhc2Ugci5GTE9BVF9WRUMyOmNhc2Ugci5GTE9BVF9WRUMzOmNhc2Ugci5GTE9BVF9NQVQyOmNhc2Ugci5GTE9BVF9NQVQzOmNhc2Ugci5GTE9BVF9NQVQ0OmNhc2Ugci5JTlQ6Y2FzZSByLklOVF9WRUMyOmNhc2Ugci5JTlRfVkVDMzpkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVXNlIGdsLkZMT0FUX1ZFQzQgb3IgZ2wuSU5UX1ZFQzQgaW5zdGVhZCIpfXQuc2V0KHMsbCl9fSkodGhpcy5fJHByb2dyYW1PYmplY3QucmVzb3VyY2UsdGhpcy5fJHVuaWZvcm1NYXAsbik7Y29uc3QgaT1uZXcgRmxvYXQzMkFycmF5KDApO3RoaXMuaGlnaHA9dGhpcy5fJHVuaWZvcm1NYXAuZ2V0KCJ1X2hpZ2hwIik/LmFycmF5Pz9pLHRoaXMubWVkaXVtcD10aGlzLl8kdW5pZm9ybU1hcC5nZXQoInVfbWVkaXVtcCIpPy5hcnJheT8/aSx0aGlzLnRleHR1cmVzPXRoaXMuXyR1bmlmb3JtTWFwLmdldCgidV90ZXh0dXJlcyIpPy5hcnJheT8/aX11c2VQcm9ncmFtKCl7dmFyIGU7ZT10aGlzLl8kcHJvZ3JhbU9iamVjdCxrdCE9PWUuaWQmJihrdD1lLmlkLHIudXNlUHJvZ3JhbShlLnJlc291cmNlKSl9YmluZFVuaWZvcm0oKXsoZT0+e2Zvcihjb25zdCB0IG9mIGUudmFsdWVzKCkpdm9pZCAwIT09dC5tZXRob2QmJnZvaWQgMCE9PXQuYXNzaWduJiYodC5hc3NpZ248MD90Lm1ldGhvZCh0LmFycmF5KTp0LmFzc2lnbj4wJiYodC5hc3NpZ24tLSx0Lm1ldGhvZCh0LmFycmF5KSkpfSkodGhpcy5fJHVuaWZvcm1NYXApfX1jb25zdCBJdD1uZXcgTWFwLFZ0PShlLHQscixuKT0+e2NvbnN0IGk9cj8ibGF5b3V0IChsb2NhdGlvbiA9IDEpIGluIHZlYzIgYV9iZXppZXI7IjoiIixhPXI/Im91dCB2ZWMyIHZfYmV6aWVyOyI6dD8ib3V0IHZlYzIgdl91djsiOiIiLHM9cj8idl9iZXppZXIgPSBhX2JlemllcjsiOnQ/IlxuICAgIG1hdDMgdXZfbWF0cml4ID0gbWF0MyhcbiAgICAgICAgdV9oaWdocFswXS54eXosXG4gICAgICAgIHVfaGlnaHBbMV0ueHl6LFxuICAgICAgICB1X2hpZ2hwWzJdLnh5elxuICAgICk7XG4gICAgbWF0MyBpbnZlcnNlX21hdHJpeCA9IG1hdDMoXG4gICAgICAgIHVfaGlnaHBbM10ueHl6LFxuICAgICAgICB1X2hpZ2hwWzRdLnh5eixcbiAgICAgICAgdmVjMyh1X2hpZ2hwWzJdLncsIHVfaGlnaHBbM10udywgdV9oaWdocFs0XS53KVxuICAgICk7XG4gICAgdl91diA9IChpbnZlcnNlX21hdHJpeCAqIHV2X21hdHJpeCAqIHZlYzMoYV92ZXJ0ZXgsIDEuMCkpLnh5OyI6IiIsbz1uPyhlPT5gXG52ZWMyIGFwcGx5TWF0cml4KGluIHZlYzIgdmVydGV4KSB7XG4gICAgbWF0MyBwYXJlbnRfbWF0cml4ID0gbWF0MyhcbiAgICAgICAgdV9oaWdocFske2V9XS54eXosXG4gICAgICAgIHVfaGlnaHBbJHtlKzF9XS54eXosXG4gICAgICAgIHVfaGlnaHBbJHtlKzJ9XS54eXpcbiAgICApO1xuICAgIG1hdDMgYW5jZXN0b3JfbWF0cml4ID0gbWF0MyhcbiAgICAgICAgdV9oaWdocFske2UrM31dLnh5eixcbiAgICAgICAgdV9oaWdocFske2UrNH1dLnh5eixcbiAgICAgICAgdV9oaWdocFske2UrNX1dLnh5elxuICAgICk7XG5cbiAgICB2ZWMyIHBhcmVudF9vZmZzZXQgPSB2ZWMyKHVfaGlnaHBbJHtlKzJ9XS53LCB1X2hpZ2hwWyR7ZSszfV0udyk7XG4gICAgdmVjMiBwYXJlbnRfc2l6ZSAgID0gdmVjMih1X2hpZ2hwWyR7ZSs0fV0udywgdV9oaWdocFske2UrNX1dLncpO1xuICAgIHZlYzQgZ3JpZF9taW4gPSB1X2hpZ2hwWyR7ZSs2fV07XG4gICAgdmVjNCBncmlkX21heCA9IHVfaGlnaHBbJHtlKzd9XTtcblxuICAgIHZlYzIgcG9zaXRpb24gPSAocGFyZW50X21hdHJpeCAqIHZlYzModmVydGV4LCAxLjApKS54eTtcbiAgICBwb3NpdGlvbiA9IChwb3NpdGlvbiAtIHBhcmVudF9vZmZzZXQpIC8gcGFyZW50X3NpemU7XG5cbiAgICB2ZWM0IGdhID0gZ3JpZF9taW47XG4gICAgdmVjNCBnYiA9IGdyaWRfbWF4ICAtIGdyaWRfbWluO1xuICAgIHZlYzQgZ2MgPSB2ZWM0KDEuMCkgLSBncmlkX21heDtcblxuICAgIHZlYzIgcGEgPSBwb3NpdGlvbjtcbiAgICB2ZWMyIHBiID0gcG9zaXRpb24gLSBncmlkX21pbi5zdDtcbiAgICB2ZWMyIHBjID0gcG9zaXRpb24gLSBncmlkX21heC5zdDtcblxuICAgIHBvc2l0aW9uID0gKGdhLnBxIC8gZ2Euc3QpICogbWluKHBhLCBnYS5zdClcbiAgICAgICAgICAgICAgICArIChnYi5wcSAvIGdiLnN0KSAqIGNsYW1wKHBiLCB2ZWMyKDAuMCksIGdiLnN0KVxuICAgICAgICAgICAgICAgICsgKGdjLnBxIC8gZ2Muc3QpICogbWF4KHZlYzIoMC4wKSwgcGMpO1xuXG4gICAgcG9zaXRpb24gPSBwb3NpdGlvbiAqIHBhcmVudF9zaXplICsgcGFyZW50X29mZnNldDtcbiAgICBwb3NpdGlvbiA9IChhbmNlc3Rvcl9tYXRyaXggKiB2ZWMzKHBvc2l0aW9uLCAxLjApKS54eTtcblxuICAgIHBvc2l0aW9uID0gcG9zaXRpb24gKyB2ZWMyKHVfaGlnaHBbJHtlKzh9XS54LCB1X2hpZ2hwWyR7ZSs4fV0ueSk7XG4gICAgcmV0dXJuIHBvc2l0aW9uIC8gdmVjMih1X2hpZ2hwWzBdLncsIHVfaGlnaHBbMV0udyk7XG59YCkodD81OjApOiJcbnZlYzIgYXBwbHlNYXRyaXgoaW4gdmVjMiB2ZXJ0ZXgpIHtcbiAgICBtYXQzIG1hdHJpeCA9IG1hdDMoYV9tYXRyaXgwLCBhX21hdHJpeDEsIGFfbWF0cml4Mik7XG4gICAgcmV0dXJuIChtYXRyaXggKiB2ZWMzKHZlcnRleCwgMS4wKSkueHk7XG59IjtyZXR1cm5gI3ZlcnNpb24gMzAwIGVzXG5cbmxheW91dCAobG9jYXRpb24gPSAwKSBpbiB2ZWMyIGFfdmVydGV4O1xuJHtpfVxuJHtyPyIiOiJsYXlvdXQgKGxvY2F0aW9uID0gMikgaW4gdmVjNCBhX2NvbG9yOyJ9XG4ke24/IiI6ImxheW91dCAobG9jYXRpb24gPSAzKSBpbiB2ZWMzIGFfbWF0cml4MDtcbmxheW91dCAobG9jYXRpb24gPSA0KSBpbiB2ZWMzIGFfbWF0cml4MTtcbmxheW91dCAobG9jYXRpb24gPSA1KSBpbiB2ZWMzIGFfbWF0cml4MjsifVxuXG4ke2U+MT9gdW5pZm9ybSB2ZWM0IHVfaGlnaHBbJHtlfV07YDoiIn1cbiR7YX1cbiR7cj8iIjoib3V0IHZlYzQgdl9jb2xvcjsifVxuJHtvfVxuXG52b2lkIG1haW4oKSB7XG4gICAgJHtyPyIiOiJ2X2NvbG9yID0gYV9jb2xvcjsifVxuICAgICR7c31cbiAgICB2ZWMyIHBvcyA9IGFwcGx5TWF0cml4KGFfdmVydGV4KTtcbiAgICBwb3MgPSBwb3MgKiAyLjAgLSAxLjA7XG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvcy54LCAtcG9zLnksIDAuMCwgMS4wKTtcbn1gfSx6dD1lPT57Y29uc3QgdD0ibSIrKGU/InkiOiJuIik7aWYoSXQuaGFzKHQpKXJldHVybiBJdC5nZXQodCk7Y29uc3Qgcj1uZXcgTHQoVnQoZT85OjAsITEsITAsZSksIiN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cbmluIHZlYzIgdl9iZXppZXI7XG5vdXQgdmVjNCBvX2NvbG9yO1xuXG52b2lkIG1haW4oKSB7XG4gICAgZmxvYXQgZl92YWwgPSB2X2Jlemllci54ICogdl9iZXppZXIueCAtIHZfYmV6aWVyLnk7XG5cbiAgICBmbG9hdCBkeCA9IGRGZHgoZl92YWwpO1xuICAgIGZsb2F0IGR5ID0gZEZkeShmX3ZhbCk7XG5cbiAgICBmbG9hdCBkaXN0ID0gZl92YWwgLyBsZW5ndGgodmVjMihkeCwgZHkpKTtcbiAgICBmbG9hdCBhbHBoYSA9IHNtb290aHN0ZXAoMC41LCAtMC41LCBkaXN0KTtcblxuICAgIGlmIChhbHBoYSA+IDAuMDAxKSB7XG4gICAgICAgIG9fY29sb3IgPSB2ZWM0KG1pbihhbHBoYSwgMS4wKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZGlzY2FyZDtcbiAgICB9XG59Iik7cmV0dXJuIEl0LnNldCh0LHIpLHJ9LGp0PShlLHQpPT57Y29uc3Qgcj1lLmhpZ2hwO3JbMF09dFswXSxyWzFdPXRbMV0sclsyXT0wLHJbNF09dFsyXSxyWzVdPXRbM10scls2XT0wLHJbOF09dFs0XSxyWzldPXRbNV0sclsxMF09MSxyWzEyXT10WzZdLHJbMTNdPXRbN10sclsxNF09MCxyWzE2XT10WzhdLHJbMTddPXRbOV0sclsxOF09MCxyWzIwXT10WzEwXSxyWzIxXT10WzExXSxyWzIyXT0xLHJbM109UCxyWzddPVMsclsxMV09dFsxMl0sclsxNV09dFsxM10sclsxOV09dFsxNF0sclsyM109dFsxNV0sclsyNF09dFsxNl0sclsyNV09dFsxN10sclsyNl09dFsxOF0sclsyN109dFsxOV0sclsyOF09dFsyMF0sclsyOV09dFsyMV0sclszMF09dFsyMl0sclszMV09dFsyM10sclszMl09dFsyNF0sclszM109dFsyNV19O2xldCBEdD0ibm9ybWFsIjtjb25zdCBOdD1lPT57RHQ9ZX07bGV0IFd0PTYwMDtjb25zdCBxdD1lPT57V3Q9ZX0sWHQ9KCk9Pns2MTMhPT1XdCYmKHF0KDYxMyksci5ibGVuZEZ1bmMoci5PTkUsci5PTkVfTUlOVVNfU1JDX0FMUEhBKSl9LFl0PShlLHQsbixpKT0+e2UudXNlUHJvZ3JhbSgpLGUuYmluZFVuaWZvcm0oKSxYdCgpLFR0KHQpLHIuZHJhd0FycmF5cyhyLlRSSUFOR0xFUyxuLGkpfSxLdD0oKT0+e2NvbnN0IGU9InJtbm4iO2lmKEl0LmhhcyhlKSlyZXR1cm4gSXQuZ2V0KGUpO2NvbnN0IHQ9bmV3IEx0KCIjdmVyc2lvbiAzMDAgZXNcbmxheW91dCAobG9jYXRpb24gPSAwKSBpbiB2ZWMyIGFfdmVydGV4O1xudm9pZCBtYWluKCkge1xuICAgIHZlYzIgcG9zID0gYV92ZXJ0ZXggKiAyLjAgLSAxLjA7XG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvcy54LCAtcG9zLnksIDAuMCwgMS4wKTtcbn0iLCIjdmVyc2lvbiAzMDAgZXNcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xub3V0IHZlYzQgb19jb2xvcjtcbnZvaWQgbWFpbigpIHtcbiAgICBvX2NvbG9yID0gdmVjNCgxLjApO1xufSIpO3JldHVybiBJdC5zZXQoZSx0KSx0fSxIdD0oKT0+e2NvbnN0IGU9bi5jdXJyZW50QXR0YWNobWVudE9iamVjdDtpZighZSlyZXR1cm47Y29uc3QgdD0xPDxlLmNsaXBMZXZlbC0xO3Iuc3RlbmNpbE1hc2sofnQtMSksci5zdGVuY2lsRnVuYyhyLkxFUVVBTCx0LDI1NSksci5zdGVuY2lsT3Aoci5aRVJPLHIuUkVQTEFDRSxyLlJFUExBQ0UpLFl0KEt0KCksRXQoKSwwLDYpLHIuc3RlbmNpbE1hc2soMTw8ZS5jbGlwTGV2ZWwpLHIuc3RlbmNpbEZ1bmMoci5BTFdBWVMsMCwyNTUpLHIuc3RlbmNpbE9wKHIuUkVQTEFDRSxyLlJFUExBQ0Usci5SRVBMQUNFKSxZdChLdCgpLEV0KCksMCw2KSxyLnN0ZW5jaWxNYXNrKDI1NSksci5zdGVuY2lsT3Aoci5aRVJPLHIuSU5WRVJULHIuSU5WRVJUKX0sUXQ9W107Y2xhc3MgWnR7Y29uc3RydWN0b3IoZSx0LHIsbixpKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaW5kZXgiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywieCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJ5Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInciLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJsZWZ0Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInJpZ2h0Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInVzZWQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSx0aGlzLmluZGV4PWUsdGhpcy54PXQsdGhpcy55PXIsdGhpcy53PW4sdGhpcy5oPWksdGhpcy5sZWZ0PW51bGwsdGhpcy5yaWdodD1udWxsLHRoaXMudXNlZD0hMX1pbnNlcnQoZSx0KXtyZXR1cm4oKGUsdCxyKT0+e2lmKGUudXNlZCl7Y29uc3Qgbj1lLmxlZnQ/Lmluc2VydCh0LHIpO3JldHVybiBufHxlLnJpZ2h0Py5pbnNlcnQodCxyKXx8bnVsbH1pZih0PmUud3x8cj5lLmgpcmV0dXJuIG51bGw7aWYodD09PWUudyYmcj09PWUuaClyZXR1cm4gZS51c2VkPSEwLGU7Y29uc3Qgbj10KzEsaT1yKzEsYT1lLnctbixzPWUuaC1pO3JldHVybiBhPnM/KGUubGVmdD1lLmNyZWF0ZShlLmluZGV4LGUueCxlLnksdCxlLmgpLGUucmlnaHQ9ZS5jcmVhdGUoZS5pbmRleCxlLngrbixlLnksYSxlLmgpKTooZS5sZWZ0PWUuY3JlYXRlKGUuaW5kZXgsZS54LGUueSxlLncsciksZS5yaWdodD1lLmNyZWF0ZShlLmluZGV4LGUueCxlLnkraSxlLncscykpLGUudXNlZD0hMCxlLmxlZnQuaW5zZXJ0KHQscil9KSh0aGlzLGUsdCl9ZGlzcG9zZShlLHQscixuKXtyZXR1cm4oKGUsdCxyLG4saSk9PmUubGVmdD8uZGlzcG9zZSh0LHIsbixpKT8oZS5sZWZ0LnVzZWR8fGUucmlnaHQ/LnVzZWR8fChlLmxlZnQmJmUubGVmdC5yZWxlYXNlKCksZS5yaWdodCYmZS5yaWdodC5yZWxlYXNlKCksZS5sZWZ0PWUucmlnaHQ9bnVsbCxlLnVzZWQ9ITEpLCEwKTplLnJpZ2h0Py5kaXNwb3NlKHQscixuLGkpPyhlLnJpZ2h0LnVzZWR8fGUubGVmdD8udXNlZHx8KGUubGVmdCYmZS5sZWZ0LnJlbGVhc2UoKSxlLnJpZ2h0JiZlLnJpZ2h0LnJlbGVhc2UoKSxlLmxlZnQ9ZS5yaWdodD1udWxsLGUudXNlZD0hMSksITApOnQ9PT1lLngmJnI9PT1lLnkmJm49PT1lLncmJmk9PT1lLmgmJihlLnVzZWQ9ITEsITApKSh0aGlzLGUsdCxyLG4pfWNyZWF0ZShlLHQscixuLGkpe2NvbnN0IGE9UXQubGVuZ3RoP1F0LnBvcCgpOm5ldyBadChlLDAsMCwwLDApO3JldHVybiBhLmluZGV4PWUsYS54PXQsYS55PXIsYS53PW4sYS5oPWksYS5sZWZ0PW51bGwsYS5yaWdodD1udWxsLGEudXNlZD0hMSxhfXJlbGVhc2UoKXt0aGlzLmxlZnQmJih0aGlzLmxlZnQucmVsZWFzZSgpLHRoaXMubGVmdD1udWxsKSx0aGlzLnJpZ2h0JiYodGhpcy5yaWdodC5yZWxlYXNlKCksdGhpcy5yaWdodD1udWxsKSx0aGlzLnVzZWQ9ITEsUXQucHVzaCh0aGlzKX19Y2xhc3MgSnR7Y29uc3RydWN0b3IoZSx0LHIpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJfJHJvb3QiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSx0aGlzLl8kcm9vdD1uZXcgWnQoZSwwLDAsdCxyKX1pbnNlcnQoZSx0KXtyZXR1cm4gdGhpcy5fJHJvb3QuaW5zZXJ0KGUsdCl9ZGlzcG9zZShlLHQscixuKXtyZXR1cm4gdGhpcy5fJHJvb3QuZGlzcG9zZShlLHQscixuKX19Y29uc3QgZXI9KHQscik9Pntjb25zdCBuPU1lO1RlW25dfHwoVGVbbl09bmV3IEp0KG4sZSxlKSk7Y29uc3QgaT1UZVtuXS5pbnNlcnQodCxyKTtpZihpKXJldHVybiBpO2ZvcihsZXQgZT0wO2U8MTA7ZSsrKXtpZihuPT09ZSljb250aW51ZTtQZShlKTtjb25zdCBpPVRlW2VdO2lmKCFpKXJldHVybiBlcih0LHIpO2NvbnN0IGE9aS5pbnNlcnQodCxyKTtpZihhKXJldHVybiBhfXJldHVybiBlcih0LHIpfSx0cj1lPT5gXG4gICAgdmVjNCBtdWwgPSB1X21lZGl1bXBbJHtlfV07XG4gICAgdmVjNCBhZGQgPSB1X21lZGl1bXBbJHtlKzF9XTtcblxuICAgIGlmIChtdWwueCAhPSAxLjAgfHwgbXVsLnkgIT0gMS4wIHx8IG11bC56ICE9IDEuMCB8fCBtdWwudyAhPSAxLjBcbiAgICAgICAgfHwgYWRkLnggIT0gMC4wIHx8IGFkZC55ICE9IDAuMCB8fCBhZGQueiAhPSAwLjBcbiAgICApIHtcbiAgICAgICAgc3JjLnJnYiAvPSBtYXgoMC4wMDAxLCBzcmMuYSk7XG4gICAgICAgIHNyYyA9IGNsYW1wKHNyYyAqIG11bCArIGFkZCwgMC4wLCAxLjApO1xuICAgICAgICBzcmMucmdiICo9IHNyYy5hO1xuICAgIH1cbmAscnI9ZT0+YCN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cbnVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4dHVyZTtcbiR7ZT8idW5pZm9ybSB2ZWM0IHVfbWVkaXVtcFsyXTsiOiIifVxuXG5pbiB2ZWMyIHZfY29vcmQ7XG5vdXQgdmVjNCBvX2NvbG9yO1xuXG52b2lkIG1haW4oKSB7XG4gICAgdmVjNCBzcmMgPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdl9jb29yZCk7XG4gICAgJHtlP3RyKDApOiIifVxuICAgIG9fY29sb3IgPSBzcmM7XG59YDtjb25zdCBucj1uZXcgY2xhc3N7Y29uc3RydWN0b3IoKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiYnVmZmVyIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIm9mZnNldCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLHRoaXMuYnVmZmVyPW5ldyBGbG9hdDMyQXJyYXkoMjU2KSx0aGlzLm9mZnNldD0wfXB1c2goLi4uZSl7dGhpcy5idWZmZXIubGVuZ3RoPHRoaXMub2Zmc2V0K2UubGVuZ3RoJiZ0aGlzLnJlc2l6ZShlLmxlbmd0aCk7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0KyspdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109ZVt0XX1wdXNoRGlzcGxheU9iamVjdEJ1ZmZlcihlLHQscixuLGksYSxzLG8sbCxjLHUsZixkLGgscCxtLGcsYix4LHYseSxfKXt0aGlzLmJ1ZmZlci5sZW5ndGg8dGhpcy5vZmZzZXQrMjImJnRoaXMucmVzaXplKDIyKSx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1lLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPXQsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109cix0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1uLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPWksdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109YSx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1zLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPW8sdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109bCx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1jLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPXUsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109Zix0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1kLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPWgsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109cCx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1tLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPWcsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109Yix0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT14LHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPXYsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109eSx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1ffXB1c2hJbnN0YW5jZUJ1ZmZlcihlLHQscixuLGksYSxzLG8sbCxjLHUsZixkLGgscCxtLGcsYix4LHYseSxfLHcsTSl7dGhpcy5idWZmZXIubGVuZ3RoPHRoaXMub2Zmc2V0KzI0JiZ0aGlzLnJlc2l6ZSgyNCksdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109ZSx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT10LHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPXIsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109bix0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1pLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPWEsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109cyx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1vLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPWwsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109Yyx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT11LHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPWYsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109ZCx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1oLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPXAsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109bSx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1nLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPWIsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109eCx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT12LHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPXksdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109Xyx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT13LHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPU19cHVzaFNoYXBlQnVmZmVyKGUsdCxyLG4saSxhLHMsbyxsLGMsdSxmLGQsaCxwLG0sZyxiLHgsdix5LF8sdyxNLFAsUyxGLFQsQixPLEEsUil7dGhpcy5idWZmZXIubGVuZ3RoPHRoaXMub2Zmc2V0KzMyJiZ0aGlzLnJlc2l6ZSgzMiksdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109ZSx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT10LHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPXIsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109bix0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1pLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPWEsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109cyx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1vLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPWwsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109Yyx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT11LHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPWYsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109ZCx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1oLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPXAsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109bSx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1nLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPWIsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109eCx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT12LHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPXksdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109Xyx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT13LHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPU0sdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109UCx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1TLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPUYsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109VCx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1CLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPU8sdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109QSx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1SfXB1c2hUZXh0RmllbGRCdWZmZXIoZSx0LHIsbixpLGEscyxvLGwsYyx1LGYsZCxoLHAsbSxnLGIseCx2LHksXyx3LE0sUCxTLEYsVCxCLE8pe3RoaXMuYnVmZmVyLmxlbmd0aDx0aGlzLm9mZnNldCszMCYmdGhpcy5yZXNpemUoMzApLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPWUsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109dCx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1yLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPW4sdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109aSx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1hLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPXMsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109byx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1sLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPWMsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109dSx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1mLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPWQsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109aCx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1wLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPW0sdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109Zyx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1iLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPXgsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109dix0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT15LHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPV8sdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109dyx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1NLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPVAsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109Uyx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1GLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPVQsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109Qix0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1PfXB1c2hWaWRlb0J1ZmZlcihlLHQscixuLGksYSxzLG8sbCxjLHUsZixkLGgscCxtLGcsYix4LHYseSxfLHcsTSxQLFMsRil7dGhpcy5idWZmZXIubGVuZ3RoPHRoaXMub2Zmc2V0KzI3JiZ0aGlzLnJlc2l6ZSgyNyksdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109ZSx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT10LHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPXIsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109bix0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1pLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPWEsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109cyx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1vLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPWwsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109Yyx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT11LHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPWYsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109ZCx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1oLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPXAsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109bSx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1nLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPWIsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109eCx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT12LHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPXksdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109Xyx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT13LHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPU0sdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109UCx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1TLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPUZ9c2V0KGUpe3RoaXMuYnVmZmVyLmxlbmd0aDx0aGlzLm9mZnNldCtlLmxlbmd0aCYmdGhpcy5yZXNpemUoZS5sZW5ndGgpLHRoaXMuYnVmZmVyLnNldChlLHRoaXMub2Zmc2V0KSx0aGlzLm9mZnNldCs9ZS5sZW5ndGh9cmVzaXplKGUpe2NvbnN0IHQ9bmV3IEZsb2F0MzJBcnJheSgocj10aGlzLm9mZnNldCtlLHItLSxyfD1yPj4xLHJ8PXI+PjIscnw9cj4+NCxyfD1yPj44LHJ8PXI+PjE2LCsrcikpO3ZhciByO3RoaXMuYnVmZmVyLmxlbmd0aCYmdC5zZXQodGhpcy5idWZmZXIpLHRoaXMuYnVmZmVyPXR9fTtsZXQgaXI9Y2xhc3MgZXh0ZW5kcyBMdHtjb25zdHJ1Y3RvcihlLHQscj0hMCl7c3VwZXIoZSx0LHIpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJjb3VudCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLHRoaXMuY291bnQ9MH1jbGVhcigpe3RoaXMuY291bnQ9bnIub2Zmc2V0PTB9fTtjb25zdCBhcj1uZXcgTWFwLHNyPSgpPT57aWYoYXIuaGFzKCJpIikpcmV0dXJuIGFyLmdldCgiaSIpO2NvbnN0IGU9bmV3IGlyKCIjdmVyc2lvbiAzMDAgZXNcblxubGF5b3V0IChsb2NhdGlvbiA9IDApIGluIHZlYzIgYV92ZXJ0ZXg7XG5sYXlvdXQgKGxvY2F0aW9uID0gMSkgaW4gdmVjNCBhX3JlY3Q7XG5sYXlvdXQgKGxvY2F0aW9uID0gMikgaW4gdmVjNCBhX3NpemU7XG5sYXlvdXQgKGxvY2F0aW9uID0gMykgaW4gdmVjMiBhX29mZnNldDtcbmxheW91dCAobG9jYXRpb24gPSA0KSBpbiB2ZWM0IGFfbWF0cml4O1xubGF5b3V0IChsb2NhdGlvbiA9IDUpIGluIHZlYzQgYV9tdWw7XG5sYXlvdXQgKGxvY2F0aW9uID0gNikgaW4gdmVjNCBhX2FkZDtcblxub3V0IHZlYzIgdl9jb29yZDtcbm91dCB2ZWM0IHZfbXVsO1xub3V0IHZlYzQgdl9hZGQ7XG5cbnZvaWQgbWFpbigpIHtcbiAgICB2X2Nvb3JkID0gYV92ZXJ0ZXggKiBhX3JlY3QuencgKyBhX3JlY3QueHk7XG4gICAgdl9tdWwgPSBhX211bDtcbiAgICB2X2FkZCA9IGFfYWRkO1xuXG4gICAgdmVjMiBwb3NpdGlvbiA9IHZlYzIoYV92ZXJ0ZXgueCwgMS4wIC0gYV92ZXJ0ZXgueSk7XG4gICAgcG9zaXRpb24gPSBwb3NpdGlvbiAqIGFfc2l6ZS54eTtcblxuICAgIG1hdDMgbWF0cml4ID0gbWF0MyhcbiAgICAgICAgYV9tYXRyaXgueCwgYV9tYXRyaXgueSwgMC4wLFxuICAgICAgICBhX21hdHJpeC56LCBhX21hdHJpeC53LCAwLjAsXG4gICAgICAgIGFfb2Zmc2V0LngsIGFfb2Zmc2V0LnksIDEuMFxuICAgICk7XG5cbiAgICBwb3NpdGlvbiA9IChtYXRyaXggKiB2ZWMzKHBvc2l0aW9uLCAxLjApKS54eTtcbiAgICBwb3NpdGlvbiAvPSBhX3NpemUuenc7XG5cbiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uICogMi4wIC0gMS4wO1xuICAgIGdsX1Bvc2l0aW9uID0gdmVjNChwb3NpdGlvbi54LCAtcG9zaXRpb24ueSwgMC4wLCAxLjApO1xufSIsIiN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cbnVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4dHVyZTtcblxuaW4gdmVjNCB2X211bDtcbmluIHZlYzQgdl9hZGQ7XG5pbiB2ZWMyIHZfY29vcmQ7XG5vdXQgdmVjNCBvX2NvbG9yO1xuXG52b2lkIG1haW4oKSB7XG4gICAgdmVjNCBzcmMgPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdl9jb29yZCk7XG5cbiAgICBpZiAodl9tdWwueCAhPSAxLjAgfHwgdl9tdWwueSAhPSAxLjAgfHwgdl9tdWwueiAhPSAxLjAgfHwgdl9tdWwudyAhPSAxLjBcbiAgICAgICAgfHwgdl9hZGQueCAhPSAwLjAgfHwgdl9hZGQueSAhPSAwLjAgfHwgdl9hZGQueiAhPSAwLjBcbiAgICApIHtcbiAgICAgICAgc3JjLnJnYiAvPSBtYXgoMC4wMDAxLCBzcmMuYSk7XG4gICAgICAgIHNyYyA9IGNsYW1wKHNyYyAqIHZfbXVsICsgdl9hZGQsIDAuMCwgMS4wKTtcbiAgICAgICAgc3JjLnJnYiAqPSBzcmMuYTtcbiAgICB9XG5cbiAgICBvX2NvbG9yID0gc3JjO1xufSIpO3JldHVybiBhci5zZXQoImkiLGUpLGV9LG9yPShlLHQpPT57Y29uc3Qgcj1gaSR7ZX15YDtpZihhci5oYXMocikpcmV0dXJuIGFyLmdldChyKTtjb25zdCBuPW5ldyBMdCgiI3ZlcnNpb24gMzAwIGVzXG5cbmxheW91dCAobG9jYXRpb24gPSAwKSBpbiB2ZWMyIGFfdmVydGV4O1xuXG5vdXQgdmVjMiB2X2Nvb3JkO1xuXG52b2lkIG1haW4oKSB7XG4gICAgdl9jb29yZCA9IGFfdmVydGV4O1xuXG4gICAgdmVjMiBwb3NpdGlvbiA9IGFfdmVydGV4ICogMi4wIC0gMS4wO1xuICAgIGdsX1Bvc2l0aW9uID0gdmVjNChwb3NpdGlvbiwgMC4wLCAxLjApO1xufSIsKGU9PntsZXQgdDtzd2l0Y2goZSl7Y2FzZSJzdWJ0cmFjdCI6dD0iXG52ZWM0IGJsZW5kIChpbiB2ZWM0IHNyYywgaW4gdmVjNCBkc3QpIHtcbiAgICBpZiAoc3JjLmEgPT0gMC4wKSB7IHJldHVybiBkc3Q7IH1cbiAgICBpZiAoZHN0LmEgPT0gMC4wKSB7IHJldHVybiBzcmM7IH1cblxuICAgIHZlYzQgYSA9IHNyYyAtIHNyYyAqIGRzdC5hO1xuICAgIHZlYzQgYiA9IGRzdCAtIGRzdCAqIHNyYy5hO1xuXG4gICAgc3JjLnJnYiAvPSBzcmMuYTtcbiAgICBkc3QucmdiIC89IGRzdC5hO1xuXG4gICAgdmVjNCBjID0gdmVjNChkc3QucmdiIC0gc3JjLnJnYiwgc3JjLmEgKiBkc3QuYSk7XG4gICAgYy5yZ2IgKj0gYy5hO1xuXG4gICAgcmV0dXJuIGEgKyBiICsgYztcbn0iO2JyZWFrO2Nhc2UibXVsdGlwbHkiOnQ9IlxudmVjNCBibGVuZCAoaW4gdmVjNCBzcmMsIGluIHZlYzQgZHN0KSB7XG4gICAgdmVjNCBhID0gc3JjIC0gc3JjICogZHN0LmE7XG4gICAgdmVjNCBiID0gZHN0IC0gZHN0ICogc3JjLmE7XG4gICAgdmVjNCBjID0gc3JjICogZHN0O1xuXG4gICAgcmV0dXJuIGEgKyBiICsgYztcbn0iO2JyZWFrO2Nhc2UibGlnaHRlbiI6dD0iXG52ZWM0IGJsZW5kIChpbiB2ZWM0IHNyYywgaW4gdmVjNCBkc3QpIHtcbiAgICBpZiAoc3JjLmEgPT0gMC4wKSB7IHJldHVybiBkc3Q7IH1cbiAgICBpZiAoZHN0LmEgPT0gMC4wKSB7IHJldHVybiBzcmM7IH1cblxuICAgIHZlYzQgYSA9IHNyYyAtIHNyYyAqIGRzdC5hO1xuICAgIHZlYzQgYiA9IGRzdCAtIGRzdCAqIHNyYy5hO1xuXG4gICAgc3JjLnJnYiAvPSBzcmMuYTtcbiAgICBkc3QucmdiIC89IGRzdC5hO1xuXG4gICAgdmVjNCBjID0gdmVjNChtaXgoc3JjLnJnYiwgZHN0LnJnYiwgc3RlcChzcmMucmdiLCBkc3QucmdiKSksIHNyYy5hICogZHN0LmEpO1xuICAgIGMucmdiICo9IGMuYTtcblxuICAgIHJldHVybiBhICsgYiArIGM7XG59IjticmVhaztjYXNlImRhcmtlbiI6dD0iXG52ZWM0IGJsZW5kIChpbiB2ZWM0IHNyYywgaW4gdmVjNCBkc3QpIHtcbiAgICBpZiAoc3JjLmEgPT0gMC4wKSB7IHJldHVybiBkc3Q7IH1cbiAgICBpZiAoZHN0LmEgPT0gMC4wKSB7IHJldHVybiBzcmM7IH1cblxuICAgIHZlYzQgYSA9IHNyYyAtIHNyYyAqIGRzdC5hO1xuICAgIHZlYzQgYiA9IGRzdCAtIGRzdCAqIHNyYy5hO1xuXG4gICAgc3JjLnJnYiAvPSBzcmMuYTtcbiAgICBkc3QucmdiIC89IGRzdC5hO1xuXG4gICAgdmVjNCBjID0gdmVjNChtaXgoc3JjLnJnYiwgZHN0LnJnYiwgc3RlcChkc3QucmdiLCBzcmMucmdiKSksIHNyYy5hICogZHN0LmEpO1xuICAgIGMucmdiICo9IGMuYTtcblxuICAgIHJldHVybiBhICsgYiArIGM7XG59IjticmVhaztjYXNlIm92ZXJsYXkiOnQ9IlxudmVjNCBibGVuZCAoaW4gdmVjNCBzcmMsIGluIHZlYzQgZHN0KSB7XG4gICAgaWYgKHNyYy5hID09IDAuMCkgeyByZXR1cm4gZHN0OyB9XG4gICAgaWYgKGRzdC5hID09IDAuMCkgeyByZXR1cm4gc3JjOyB9XG5cbiAgICB2ZWM0IGEgPSBzcmMgLSBzcmMgKiBkc3QuYTtcbiAgICB2ZWM0IGIgPSBkc3QgLSBkc3QgKiBzcmMuYTtcblxuICAgIHNyYy5yZ2IgLz0gc3JjLmE7XG4gICAgZHN0LnJnYiAvPSBkc3QuYTtcblxuICAgIHZlYzQgbXVsID0gc3JjICogZHN0O1xuICAgIHZlYzMgYzEgPSAyLjAgKiBtdWwucmdiO1xuICAgIHZlYzMgYzIgPSAyLjAgKiAoc3JjLnJnYiArIGRzdC5yZ2IgLSBtdWwucmdiKSAtIDEuMDtcbiAgICB2ZWM0IGMgPSB2ZWM0KG1peChjMSwgYzIsIHN0ZXAodmVjMygwLjUpLCBkc3QucmdiKSksIG11bC5hKTtcbiAgICBjLnJnYiAqPSBjLmE7XG5cbiAgICByZXR1cm4gYSArIGIgKyBjO1xufSI7YnJlYWs7Y2FzZSJoYXJkbGlnaHQiOnQ9IlxudmVjNCBibGVuZCAoaW4gdmVjNCBzcmMsIGluIHZlYzQgZHN0KSB7XG4gICAgaWYgKHNyYy5hID09IDAuMCkgeyByZXR1cm4gZHN0OyB9XG4gICAgaWYgKGRzdC5hID09IDAuMCkgeyByZXR1cm4gc3JjOyB9XG5cbiAgICB2ZWM0IGEgPSBzcmMgLSBzcmMgKiBkc3QuYTtcbiAgICB2ZWM0IGIgPSBkc3QgLSBkc3QgKiBzcmMuYTtcblxuICAgIHNyYy5yZ2IgLz0gc3JjLmE7XG4gICAgZHN0LnJnYiAvPSBkc3QuYTtcblxuICAgIHZlYzQgbXVsID0gc3JjICogZHN0O1xuICAgIHZlYzMgYzEgPSAyLjAgKiBtdWwucmdiO1xuICAgIHZlYzMgYzIgPSAyLjAgKiAoc3JjLnJnYiArIGRzdC5yZ2IgLSBtdWwucmdiKSAtIDEuMDtcbiAgICB2ZWM0IGMgPSB2ZWM0KG1peChjMSwgYzIsIHN0ZXAodmVjMygwLjUpLCBzcmMucmdiKSksIG11bC5hKTtcbiAgICBjLnJnYiAqPSBjLmE7XG5cbiAgICByZXR1cm4gYSArIGIgKyBjO1xufSI7YnJlYWs7Y2FzZSJkaWZmZXJlbmNlIjp0PSJcbnZlYzQgYmxlbmQgKGluIHZlYzQgc3JjLCBpbiB2ZWM0IGRzdCkge1xuICAgIGlmIChzcmMuYSA9PSAwLjApIHsgcmV0dXJuIGRzdDsgfVxuICAgIGlmIChkc3QuYSA9PSAwLjApIHsgcmV0dXJuIHNyYzsgfVxuXG4gICAgdmVjNCBhID0gc3JjIC0gc3JjICogZHN0LmE7XG4gICAgdmVjNCBiID0gZHN0IC0gZHN0ICogc3JjLmE7XG5cbiAgICBzcmMucmdiIC89IHNyYy5hO1xuICAgIGRzdC5yZ2IgLz0gZHN0LmE7XG5cbiAgICB2ZWM0IGMgPSB2ZWM0KGFicyhzcmMucmdiIC0gZHN0LnJnYiksIHNyYy5hICogZHN0LmEpO1xuICAgIGMucmdiICo9IGMuYTtcblxuICAgIHJldHVybiBhICsgYiArIGM7XG59IjticmVhaztjYXNlImludmVydCI6dD0iXG52ZWM0IGJsZW5kIChpbiB2ZWM0IHNyYywgaW4gdmVjNCBkc3QpIHtcbiAgICBpZiAoc3JjLmEgPT0gMC4wKSB7IHJldHVybiBkc3Q7IH1cbiAgICBpZiAoZHN0LmEgPT0gMC4wKSB7IHJldHVybiBzcmM7IH1cblxuICAgIHZlYzQgYiA9IGRzdCAtIGRzdCAqIHNyYy5hO1xuICAgIHZlYzQgYyA9IHZlYzQoc3JjLmEgLSBkc3QucmdiICogc3JjLmEsIHNyYy5hKTtcblxuICAgIHJldHVybiBiICsgYztcbn0iO2JyZWFrO2RlZmF1bHQ6dD0iXG52ZWM0IGJsZW5kIChpbiB2ZWM0IHNyYywgaW4gdmVjNCBkc3QpIHtcbiAgICByZXR1cm4gc3JjICsgZHN0IC0gZHN0ICogc3JjLmE7XG59In1yZXR1cm5gI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblxudW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlc1syXTtcbnVuaWZvcm0gdmVjNCB1X21lZGl1bXBbMl07XG5cbmluIHZlYzIgdl9jb29yZDtcbm91dCB2ZWM0IG9fY29sb3I7XG5cbiR7dH1cblxudm9pZCBtYWluKCkge1xuICAgIHZlYzQgZHN0ID0gdGV4dHVyZSh1X3RleHR1cmVzWzBdLCB2X2Nvb3JkKTtcbiAgICB2ZWM0IHNyYyA9IHRleHR1cmUodV90ZXh0dXJlc1sxXSwgdl9jb29yZCk7XG4gICAgJHt0cigwKX1cbiAgICBvX2NvbG9yID0gYmxlbmQoc3JjLCBkc3QpO1xufWB9KShlKSk7cmV0dXJuIGFyLnNldChyLG4pLG59LGxyPSgpPT57aWYoIW4ubmV3RHJhd1N0YXRlKXJldHVybjtjb25zdCBlPW4uY3VycmVudEF0dGFjaG1lbnRPYmplY3QsdD1uLmF0bGFzQXR0YWNobWVudE9iamVjdDtuLmJpbmQodCksci5iaW5kRnJhbWVidWZmZXIoci5EUkFXX0ZSQU1FQlVGRkVSLGVlKSxpZSghMSk7Y29uc3QgaT1SZShNZSk7YSgpLHIuc2Npc3NvcihpWzBdLGlbMV0saVsyXS1pWzBdLGlbM10taVsxXSksci5ibGl0RnJhbWVidWZmZXIoMCwwLHQud2lkdGgsdC5oZWlnaHQsMCwwLHQud2lkdGgsdC5oZWlnaHQsci5DT0xPUl9CVUZGRVJfQklULHIuTkVBUkVTVCkscygpLGUmJm4uYmluZChlKSxuLm5ld0RyYXdTdGF0ZT0hMX0sY3I9ZT0+e2NvbnN0IHQ9TWU7UGUoZS5pbmRleCksbHIoKSxyLmJpbmRGcmFtZWJ1ZmZlcihyLkZSQU1FQlVGRkVSLGFlKTtjb25zdCBuPU9lKCk7ci5mcmFtZWJ1ZmZlclRleHR1cmUyRChyLkZSQU1FQlVGRkVSLHIuQ09MT1JfQVRUQUNITUVOVDAsci5URVhUVVJFXzJELG4ucmVzb3VyY2UsMCksci5iaW5kRnJhbWVidWZmZXIoci5GUkFNRUJVRkZFUixzZSk7Y29uc3QgaT12ZShlLncsZS5oKTtyZXR1cm4gci5mcmFtZWJ1ZmZlclRleHR1cmUyRChyLkZSQU1FQlVGRkVSLHIuQ09MT1JfQVRUQUNITUVOVDAsci5URVhUVVJFXzJELGkucmVzb3VyY2UsMCksci5iaW5kRnJhbWVidWZmZXIoci5GUkFNRUJVRkZFUixudWxsKSxyLmJpbmRGcmFtZWJ1ZmZlcihyLlJFQURfRlJBTUVCVUZGRVIsYWUpLHIuYmluZEZyYW1lYnVmZmVyKHIuRFJBV19GUkFNRUJVRkZFUixzZSksci5ibGl0RnJhbWVidWZmZXIoZS54LGUueSxlLngrZS53LGUueStlLmgsMCwwLGUudyxlLmgsci5DT0xPUl9CVUZGRVJfQklULHIuTkVBUkVTVCksUGUodCksci5iaW5kRnJhbWVidWZmZXIoci5SRUFEX0ZSQU1FQlVGRkVSLFopLHIuYmluZEZyYW1lYnVmZmVyKHIuRlJBTUVCVUZGRVIsWiksaX0sdXI9KGUsdCxuPSExKT0+e0dlKDIsci5URVhUVVJFMixudWxsLG4pLEdlKDEsci5URVhUVVJFMSx0LG4pLEdlKDAsci5URVhUVVJFMCxlLG4pfSxmcj0oKT0+e2lmKGFyLmhhcygicCIpKXJldHVybiBhci5nZXQoInAiKTtjb25zdCBlPW5ldyBMdCgiI3ZlcnNpb24gMzAwIGVzXG5cbmxheW91dCAobG9jYXRpb24gPSAwKSBpbiB2ZWMyIGFfdmVydGV4O1xudW5pZm9ybSB2ZWM0IHVfaGlnaHBbMl07XG5cbm91dCB2ZWMyIHZfY29vcmQ7XG5cbnZvaWQgbWFpbigpIHtcbiAgICB2X2Nvb3JkID0gYV92ZXJ0ZXg7XG5cbiAgICB2ZWMyIG9mZnNldCAgID0gdV9oaWdocFswXS54eTtcbiAgICB2ZWMyIHNpemUgICAgID0gdV9oaWdocFswXS56dztcbiAgICB2ZWMyIHZpZXdwb3J0ID0gdmVjMih1X2hpZ2hwWzFdLngsIHVfaGlnaHBbMV0ueSk7XG5cbiAgICB2ZWMyIHBvc2l0aW9uID0gdmVjMihhX3ZlcnRleC54LCAxLjAgLSBhX3ZlcnRleC55KTtcbiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uICogc2l6ZSArIG9mZnNldDtcbiAgICBwb3NpdGlvbiAvPSB2aWV3cG9ydDtcblxuICAgIHBvc2l0aW9uID0gcG9zaXRpb24gKiAyLjAgLSAxLjA7XG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLngsIC1wb3NpdGlvbi55LCAwLjAsIDEuMCk7XG59IixycighMSkpO3JldHVybiBhci5zZXQoInAiLGUpLGV9LGRyPShlLHQscik9Pntjb25zdCBpPWUuaGlnaHAsYT1uLiRtYXRyaXg7aVswXT1hWzZdLGlbMV09YVs3XSxpWzJdPXQsaVszXT1yLGlbNF09UCxpWzVdPVN9LGhyPWU9PntlLnVzZVByb2dyYW0oKSxlLmJpbmRVbmlmb3JtKCksVHQoRXQoKSksci5kcmF3QXJyYXlzKHIuVFJJQU5HTEVTLDAsNil9O2xldCBwcj1udWxsO2NvbnN0IG1yPShlLHQsaSxvKT0+e2NvbnN0IGw9bi5jdXJyZW50QXR0YWNobWVudE9iamVjdCxjPW4uJG1haW5BdHRhY2htZW50T2JqZWN0O3JldHVybiBuLmJpbmQoYyksci5iaW5kRnJhbWVidWZmZXIoci5GUkFNRUJVRkZFUixzZSkscHImJnByLndpZHRoPT09Yy53aWR0aCYmcHIuaGVpZ2h0PT09Yy5oZWlnaHR8fChwcj12ZShjLndpZHRoLGMuaGVpZ2h0KSksa2UocHIpLHIuZnJhbWVidWZmZXJUZXh0dXJlMkQoci5GUkFNRUJVRkZFUixyLkNPTE9SX0FUVEFDSE1FTlQwLHIuVEVYVFVSRV8yRCxwci5yZXNvdXJjZSwwKSxyLmJpbmRGcmFtZWJ1ZmZlcihyLkZSQU1FQlVGRkVSLG51bGwpLHIuYmluZEZyYW1lYnVmZmVyKHIuUkVBRF9GUkFNRUJVRkZFUixaKSxyLmJpbmRGcmFtZWJ1ZmZlcihyLkRSQVdfRlJBTUVCVUZGRVIsc2UpLGEoKSxyLnNjaXNzb3IoZSxjLmhlaWdodC10LW8saSsxLG8rMSksci5ibGl0RnJhbWVidWZmZXIoMCwwLGMud2lkdGgsYy5oZWlnaHQsMCwwLGMud2lkdGgsYy5oZWlnaHQsci5DT0xPUl9CVUZGRVJfQklULHIuTkVBUkVTVCkscygpLHIuYmluZEZyYW1lYnVmZmVyKHIuRlJBTUVCVUZGRVIsWiksbCYmbi5iaW5kKGwpLHByfSxncj0oZSx0LHIsaSk9Pntjb25zdCBhPW4uY3VycmVudEF0dGFjaG1lbnRPYmplY3Qscz1tcihlLHQscixpKSxvPXllKHIsaSwhMSk7bi5iaW5kKG8pLG4uc2F2ZSgpLG4uc2V0VHJhbnNmb3JtKDEsMCwwLDEsLWUsLXQpO2NvbnN0IGw9ZnIoKTtkcihsLHMud2lkdGgscy5oZWlnaHQpLFh0KCksa2UocyksaHIobCk7Y29uc3QgYz1vLnRleHR1cmU7cmV0dXJuIG4ucmVzdG9yZSgpLGNlKG8sITEpLGEmJm4uYmluZChhKSxjfSxicj0oKT0+ezYxMCE9PVd0JiYocXQoNjEwKSxyLmJsZW5kRnVuYyhyLk9ORSxyLlpFUk8pKX0seHI9ZT0+e2tlKGUpLGJyKCk7Y29uc3QgdD1mcigpO2RyKHQsZS53aWR0aCxlLmhlaWdodCksaHIodCksWHQoKX0sdnI9KGUsdCxyLG4saSxhLHMsbyxsKT0+e2NvbnN0IGM9ZS50ZXh0dXJlcztjWzBdPTAsY1sxXT0xO2NvbnN0IHU9ZS5tZWRpdW1wO3VbMF09dCx1WzFdPXIsdVsyXT1uLHVbM109aSx1WzRdPWEsdVs1XT1zLHVbNl09byx1WzddPWx9LHlyPShlPSExKT0+e2NvbnN0IHQ9Im0iKyhlPyJ5IjoibiIpO2lmKGFyLmhhcyh0KSlyZXR1cm4gYXIuZ2V0KHQpO2NvbnN0IHI9bmV3IEx0KCIjdmVyc2lvbiAzMDAgZXNcblxubGF5b3V0IChsb2NhdGlvbiA9IDApIGluIHZlYzIgYV92ZXJ0ZXg7XG51bmlmb3JtIHZlYzQgdV9oaWdocFszXTtcblxub3V0IHZlYzIgdl9jb29yZDtcblxudm9pZCBtYWluKCkge1xuICAgIHZfY29vcmQgPSBhX3ZlcnRleDtcblxuICAgIG1hdDMgbWF0cml4ID0gbWF0MyhcbiAgICAgICAgdV9oaWdocFswXS54LCB1X2hpZ2hwWzBdLnksIDAuMCxcbiAgICAgICAgdV9oaWdocFswXS56LCB1X2hpZ2hwWzBdLncsIDAuMCxcbiAgICAgICAgdV9oaWdocFsxXS54LCB1X2hpZ2hwWzFdLnksIDEuMFxuICAgICk7XG5cbiAgICB2ZWMyIHNpemUgICAgID0gdV9oaWdocFsxXS56dztcbiAgICB2ZWMyIHZpZXdwb3J0ID0gdmVjMih1X2hpZ2hwWzJdLngsIHVfaGlnaHBbMl0ueSk7XG5cbiAgICB2ZWMyIHBvc2l0aW9uID0gdmVjMihhX3ZlcnRleC54LCAxLjAgLSBhX3ZlcnRleC55KTtcbiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uICogc2l6ZTtcbiAgICBwb3NpdGlvbiA9IChtYXRyaXggKiB2ZWMzKHBvc2l0aW9uLCAxLjApKS54eTtcbiAgICBwb3NpdGlvbiAvPSB2aWV3cG9ydDtcblxuICAgIHBvc2l0aW9uID0gcG9zaXRpb24gKiAyLjAgLSAxLjA7XG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLngsIC1wb3NpdGlvbi55LCAwLjAsIDEuMCk7XG59IixycihlKSk7cmV0dXJuIGFyLnNldCh0LHIpLHJ9LF9yPShlLHQscik9Pntjb25zdCBpPWUuaGlnaHAsYT1uLiRtYXRyaXg7aVswXT1hWzBdLGlbMV09YVsxXSxpWzJdPWFbM10saVszXT1hWzRdLGlbNF09YVs2XSxpWzVdPWFbN10saVs2XT10LGlbN109cixpWzhdPVAsaVs5XT1TfTtsZXQgd3I9MDtjb25zdCBNcj1lPT57ZS51c2VQcm9ncmFtKCksZS5iaW5kVW5pZm9ybSgpLFR0KFJ0KSxyLmJpbmRCdWZmZXIoci5BUlJBWV9CVUZGRVIsQXQpLG5yLmJ1ZmZlci5sZW5ndGg+d3ImJih3cj1uci5idWZmZXIubGVuZ3RoLHIuYnVmZmVyRGF0YShyLkFSUkFZX0JVRkZFUiw0KndyLHIuU1RSRUFNX0RSQVcpKSxyLmJ1ZmZlclN1YkRhdGEoci5BUlJBWV9CVUZGRVIsMCxuci5idWZmZXIsMCxuci5vZmZzZXQpLHIuZHJhd0FycmF5c0luc3RhbmNlZChyLlRSSUFOR0xFUywwLDYsZS5jb3VudCl9LFByPSgpPT57NjAzIT09V3QmJihxdCg2MDMpLHIuYmxlbmRGdW5jKHIuWkVSTyxyLk9ORV9NSU5VU19TUkNfQUxQSEEpKX0sU3I9ZT0+e3N3aXRjaChlKXtjYXNlImFkZCI6NjExIT09V3QmJihxdCg2MTEpLHIuYmxlbmRGdW5jKHIuT05FLHIuT05FKSk7YnJlYWs7Y2FzZSJzY3JlZW4iOjY0MSE9PVd0JiYocXQoNjQxKSxyLmJsZW5kRnVuYyhyLk9ORV9NSU5VU19EU1RfQ09MT1Isci5PTkUpKTticmVhaztjYXNlImFscGhhIjo2MDYhPT1XdCYmKHF0KDYwNiksci5ibGVuZEZ1bmMoci5aRVJPLHIuU1JDX0FMUEhBKSk7YnJlYWs7Y2FzZSJlcmFzZSI6UHIoKTticmVhaztjYXNlImNvcHkiOmJyKCk7YnJlYWs7ZGVmYXVsdDpYdCgpfX0sRnI9ZT0+e3ZhciB0OyhlPT57QXQ9ZS5jcmVhdGVCdWZmZXIoKX0pKGUpLHQ9KCgpPT57Y29uc3QgZT1TdCgpO3JldHVybiBUdChlKSxyLmJpbmRCdWZmZXIoci5BUlJBWV9CVUZGRVIsZS52ZXJ0ZXhCdWZmZXIpLHIuYnVmZmVyRGF0YShyLkFSUkFZX0JVRkZFUixuZXcgRmxvYXQzMkFycmF5KFswLDAsMSwwLDEsMSwwLDAsMSwxLDAsMV0pLHIuU1RBVElDX0RSQVcpLHIuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoMCksci52ZXJ0ZXhBdHRyaWJQb2ludGVyKDAsMixyLkZMT0FULCExLDAsMCksci5iaW5kQnVmZmVyKHIuQVJSQVlfQlVGRkVSLEF0KSxyLmJ1ZmZlckRhdGEoci5BUlJBWV9CVUZGRVIsbnIuYnVmZmVyLmxlbmd0aCxyLlNUUkVBTV9EUkFXKSxyLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDEpLHIudmVydGV4QXR0cmliUG9pbnRlcigxLDQsci5GTE9BVCwhMSw4OCwwKSxyLnZlcnRleEF0dHJpYkRpdmlzb3IoMSwxKSxyLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDIpLHIudmVydGV4QXR0cmliUG9pbnRlcigyLDQsci5GTE9BVCwhMSw4OCwxNiksci52ZXJ0ZXhBdHRyaWJEaXZpc29yKDIsMSksci5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSgzKSxyLnZlcnRleEF0dHJpYlBvaW50ZXIoMywyLHIuRkxPQVQsITEsODgsMzIpLHIudmVydGV4QXR0cmliRGl2aXNvcigzLDEpLHIuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoNCksci52ZXJ0ZXhBdHRyaWJQb2ludGVyKDQsNCxyLkZMT0FULCExLDg4LDQwKSxyLnZlcnRleEF0dHJpYkRpdmlzb3IoNCwxKSxyLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDUpLHIudmVydGV4QXR0cmliUG9pbnRlcig1LDQsci5GTE9BVCwhMSw4OCw1Niksci52ZXJ0ZXhBdHRyaWJEaXZpc29yKDUsMSksci5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSg2KSxyLnZlcnRleEF0dHJpYlBvaW50ZXIoNiw0LHIuRkxPQVQsITEsODgsNzIpLHIudmVydGV4QXR0cmliRGl2aXNvcig2LDEpLGV9KSgpLFJ0PXR9LFRyPShlLHQsbixpPSExKT0+e2NvbnN0IGE9dmUoZSx0LGkpO3JldHVybiByLnRleFN1YkltYWdlMkQoci5URVhUVVJFXzJELDAsMCwwLGUsdCxyLlJHQkEsci5VTlNJR05FRF9CWVRFLG4pLGF9LEJyPShlLHQpPT57Y29uc3Qgbj0oKGUsdCxuLGk9ITEpPT57Y29uc3QgYT12ZShlLHQsaSk7cmV0dXJuIHIudGV4U3ViSW1hZ2UyRChyLlRFWFRVUkVfMkQsMCwwLDAsci5SR0JBLHIuVU5TSUdORURfQllURSxuKSxhfSkoZS53LGUuaCx0KSxpPWZyKCk7ZHIoaSxlLncsZS5oKSxYdCgpLGhyKGkpLEsobil9LE9yPVtdLEFyPW5ldyBNYXAsUnI9KGUsdCxyKT0+e2tlKGUsITApO2NvbnN0IG49TWF0aC5jZWlsKC41KnIpLGk9MS0obi0uNSpyKSxhPTErcixzPShlPT57Y29uc3QgdD1gYiR7ZX1gO2lmKEFyLmhhcyh0KSlyZXR1cm4gQXIuZ2V0KHQpO2NvbnN0IHI9bmV3IEx0KCIjdmVyc2lvbiAzMDAgZXNcblxubGF5b3V0IChsb2NhdGlvbiA9IDApIGluIHZlYzIgYV92ZXJ0ZXg7XG5cbm91dCB2ZWMyIHZfY29vcmQ7XG5cbnZvaWQgbWFpbigpIHtcbiAgICB2X2Nvb3JkID0gYV92ZXJ0ZXg7XG5cbiAgICB2ZWMyIHBvc2l0aW9uID0gYV92ZXJ0ZXggKiAyLjAgLSAxLjA7XG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLjAsIDEuMCk7XG59IiwoZT0+e2NvbnN0IHQ9ZS50b0ZpeGVkKDEpO3JldHVybmAjdmVyc2lvbiAzMDAgZXNcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXG51bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmU7XG51bmlmb3JtIHZlYzQgdV9tZWRpdW1wO1xuXG5pbiB2ZWMyIHZfY29vcmQ7XG5vdXQgdmVjNCBvX2NvbG9yO1xuXG52b2lkIG1haW4oKSB7XG4gICAgdmVjMiAgb2Zmc2V0ICAgPSB1X21lZGl1bXAueHk7XG4gICAgZmxvYXQgZnJhY3Rpb24gPSB1X21lZGl1bXAuejtcbiAgICBmbG9hdCBzYW1wbGVzICA9IHVfbWVkaXVtcC53O1xuICAgIFxuICAgIHZlYzQgY29sb3IgPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdl9jb29yZCk7XG5cbiAgICBmb3IgKGZsb2F0IGkgPSAxLjA7IGkgPCAke3R9OyBpICs9IDEuMCkge1xuICAgICAgICBjb2xvciArPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdl9jb29yZCArIG9mZnNldCAqIGkpO1xuICAgICAgICBjb2xvciArPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdl9jb29yZCAtIG9mZnNldCAqIGkpO1xuICAgIH1cbiAgICBjb2xvciArPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdl9jb29yZCArIG9mZnNldCAqICR7dH0pICogZnJhY3Rpb247XG4gICAgY29sb3IgKz0gdGV4dHVyZSh1X3RleHR1cmUsIHZfY29vcmQgLSBvZmZzZXQgKiAke3R9KSAqIGZyYWN0aW9uO1xuICAgIGNvbG9yIC89IHNhbXBsZXM7XG5cbiAgICBvX2NvbG9yID0gY29sb3I7XG59YH0pKGUpKTtyZXR1cm4gQXIuc2V0KHQscikscn0pKG4pOygoZSx0LHIsbixpLGEpPT57Y29uc3Qgcz1lLm1lZGl1bXA7bj8oc1swXT0xL3Qsc1sxXT0wKTooc1swXT0wLHNbMV09MS9yKSxzWzJdPWksc1szXT1hfSkocyxlLndpZHRoLGUuaGVpZ2h0LHQsaSxhKSxocihzKX0sQ3I9e3g6MCx5OjB9LEVyPShlLHQscik9PihlPj4xNikqKHI/dDoxKS8yNTUsVXI9KGUsdCxyKT0+KGU+PjgmMjU1KSoocj90OjEpLzI1NSwkcj0oZSx0LHIpPT4oMjU1JmUpKihyP3Q6MSkvMjU1LEdyPVsuNSwxLjA1LDEuNCwxLjU1LDEuNzUsMS45LDIsMi4xNSwyLjIsMi4zLDIuNSwzLDMsMy41LDMuNV0sa3I9KGUsdCxyPTQsaT00LGE9MSxzPSEwKT0+e2NvbnN0IG89bi5jdXJyZW50QXR0YWNobWVudE9iamVjdCxsPU1hdGguc3FydCh0WzBdKnRbMF0rdFsxXSp0WzFdKSxjPU1hdGguc3FydCh0WzJdKnRbMl0rdFszXSp0WzNdKSx1PXIqKGwvRiksZj1pKihjL0YpLGQ9R3JbYS0xXSxoPU1hdGgucm91bmQodSpkKSxwPU1hdGgucm91bmQoZipkKTtDci54Kz1oLENyLnkrPXA7Y29uc3QgbT1lLndpZHRoKzIqaCxnPWUuaGVpZ2h0KzIqcDtsZXQgYj0xLHg9MTt1PjEyOD9iPS4wNjI1OnU+NjQ/Yj0uMTI1OnU+MzI/Yj0uMjU6dT4xNiYmKGI9LjUpLGY+MTI4P3g9LjA2MjU6Zj42ND94PS4xMjU6Zj4zMj94PS4yNTpmPjE2JiYoeD0uNSk7Y29uc3Qgdj1NYXRoLmNlaWwobSpiKSx5PU1hdGguY2VpbChnKngpLF89eWUodix5LCExKSx3PVtfLHllKHYseSwhMSldO24uYmluZChfKSxuLnJlc2V0KCksbi5zZXRUcmFuc2Zvcm0oYiwwLDAseCxoKmIscCp4KSxrZShlKTtjb25zdCBNPXlyKCk7X3IoTSxlLndpZHRoLGUuaGVpZ2h0KSxocihNKSxzJiZLKGUpO2NvbnN0IFA9dSpiLFM9Zip4O2xldCBUPTAsQj1fLnRleHR1cmU7a2UoQiwhMCksYnIoKTtmb3IobGV0IGU9MDtlPGE7KytlKXtpZihyPjApe1Q9KFQrMSklMjtjb25zdCBlPXdbVF07bi5iaW5kKGUpLFJyKEIsITAsUCksQj1lLnRleHR1cmV9aWYoaT4wKXtUPShUKzEpJTI7Y29uc3QgZT13W1RdO24uYmluZChlKSxScihCLCExLFMpLEI9ZS50ZXh0dXJlfX1pZihYdCgpLDEhPT1ifHwxIT09eCl7Y29uc3QgZT15ZShtLGcsITEpO24uYmluZChlKSxuLnNldFRyYW5zZm9ybSgxL2IsMCwwLDEveCwwLDApLGtlKEIsITApLF9yKE0sQi53aWR0aCxCLmhlaWdodCksaHIoTSksQj1lLnRleHR1cmUsY2Uod1swXSksY2Uod1sxXSksY2UoZSwhMSl9ZWxzZSBUPShUKzEpJTIsY2Uod1tUXSksVD0oVCsxKSUyLGNlKHdbVF0sITEpO3JldHVybiBvJiZuLmJpbmQobyksQn0sTHI9KGUsdCk9Pntjb25zdCByPW4uY3VycmVudEF0dGFjaG1lbnRPYmplY3QsaT15ZShlLndpZHRoLGUuaGVpZ2h0LCExKTtuLmJpbmQoaSksbi5yZXNldCgpLG4uc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKSxrZShlKSxYdCgpO2NvbnN0IGE9KCgpPT57aWYoQXIuaGFzKCJtIikpcmV0dXJuIEFyLmdldCgibSIpO2NvbnN0IGU9bmV3IEx0KCIjdmVyc2lvbiAzMDAgZXNcblxubGF5b3V0IChsb2NhdGlvbiA9IDApIGluIHZlYzIgYV92ZXJ0ZXg7XG5cbm91dCB2ZWMyIHZfY29vcmQ7XG5cbnZvaWQgbWFpbigpIHtcbiAgICB2X2Nvb3JkID0gYV92ZXJ0ZXg7XG5cbiAgICB2ZWMyIHBvc2l0aW9uID0gYV92ZXJ0ZXggKiAyLjAgLSAxLjA7XG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLjAsIDEuMCk7XG59IiwiI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblxudW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlO1xudW5pZm9ybSB2ZWM0IHVfbWVkaXVtcFs1XTtcblxuaW4gdmVjMiB2X2Nvb3JkO1xub3V0IHZlYzQgb19jb2xvcjtcblxudm9pZCBtYWluKCkge1xuICAgIG1hdDQgbXVsID0gbWF0NCh1X21lZGl1bXBbMF0sIHVfbWVkaXVtcFsxXSwgdV9tZWRpdW1wWzJdLCB1X21lZGl1bXBbM10pO1xuICAgIHZlYzQgYWRkID0gdV9tZWRpdW1wWzRdO1xuICAgIFxuICAgIHZlYzQgY29sb3IgPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdl9jb29yZCk7XG5cbiAgICBjb2xvci5yZ2IgLz0gbWF4KDAuMDAwMSwgY29sb3IuYSk7XG4gICAgY29sb3IgPSBjbGFtcChjb2xvciAqIG11bCArIGFkZCwgMC4wLCAxLjApO1xuICAgIGNvbG9yLnJnYiAqPSBjb2xvci5hO1xuXG4gICAgb19jb2xvciA9IGNvbG9yO1xufSIpO3JldHVybiBBci5zZXQoIm0iLGUpLGV9KSgpOygoZSx0KT0+e2NvbnN0IHI9ZS5tZWRpdW1wO3JbMF09dFswXSxyWzFdPXRbMV0sclsyXT10WzJdLHJbM109dFszXSxyWzRdPXRbNV0scls1XT10WzZdLHJbNl09dFs3XSxyWzddPXRbOF0scls4XT10WzEwXSxyWzldPXRbMTFdLHJbMTBdPXRbMTJdLHJbMTFdPXRbMTNdLHJbMTJdPXRbMTVdLHJbMTNdPXRbMTZdLHJbMTRdPXRbMTddLHJbMTVdPXRbMThdLHJbMTZdPXRbNF0vMjU1LHJbMTddPXRbOV0vMjU1LHJbMThdPXRbMTRdLzI1NSxyWzE5XT10WzE5XS8yNTV9KShhLHQpLGhyKGEpO2NvbnN0IHM9aS50ZXh0dXJlO3JldHVybiBLKGUpLGNlKGksITEpLHImJm4uYmluZChyKSxzfSxJcj0oZSx0LHIsbixpLGEpPT57Y29uc3Qgcz1lPyJibHVyLmEgPSAxLjAgLSBibHVyLmE7IjoiIixvPXI/KGw9YSxgXG4gICAgZmxvYXQgc3RyZW5ndGggPSB1X21lZGl1bXBbJHtNYXRoLmZsb29yKGwvNCl9XVske2wlNH1dO1xuICAgIGJsdXIuYSA9IGNsYW1wKGJsdXIuYSAqIHN0cmVuZ3RoLCAwLjAsIDEuMCk7XG5gKToiIjt2YXIgbDtjb25zdCBjPW4/KGU9PmBcbiAgICBibHVyID0gdGV4dHVyZSh1X3RleHR1cmVzWyR7ZT8yOjF9XSwgdmVjMihibHVyLmEsIDAuNSkpO1xuYCkodCk6KGU9PmBcbiAgICB2ZWM0IGNvbG9yID0gdV9tZWRpdW1wWyR7ZX1dO1xuICAgIGJsdXIgPSBjb2xvciAqIGJsdXIuYTtcbmApKGkpO3JldHVybmBcbiAgICAke3N9XG4gICAgJHtvfVxuICAgICR7Y31cbmB9LFZyPShlLHQscixuLGksYSk9Pntjb25zdCBzPXQ/IlxuICAgIHZlYzIgcHEgPSAoMS4wIC0gdl9jb29yZCkgKiBibHVyX3NjYWxlIC0gYmx1cl9vZmZzZXQ7XG4gICAgdmVjNCBibHVyMiA9IG1peCh2ZWM0KDAuMCksIHRleHR1cmUodV90ZXh0dXJlc1swXSwgcHEpLCBpc0luc2lkZShwcSkpO1xuIjoiXG4gICAgdmVjNCBibHVyMiA9IHRleHR1cmUodV90ZXh0dXJlc1swXSwgMS4wIC0gdl9jb29yZCk7XG4iLG89cj8obD1hLGBcbiAgICBmbG9hdCBzdHJlbmd0aCA9IHVfbWVkaXVtcFske01hdGguZmxvb3IobC80KX1dWyR7bCU0fV07XG4gICAgaGlnaGxpZ2h0X2FscGhhICo9IHN0cmVuZ3RoO1xuICAgIHNoYWRvd19hbHBoYSAgICAqPSBzdHJlbmd0aDtcbmApOiIiO3ZhciBsO2NvbnN0IGM9bj8oZT0+YFxuICAgIGJsdXIgPSB0ZXh0dXJlKHVfdGV4dHVyZXNbJHtlPzI6MX1dLCB2ZWMyKFxuICAgICAgICAwLjUwMTk2MDc4NDMxMzcyNTUgLSAwLjUwMTk2MDc4NDMxMzcyNTUgKiBzaGFkb3dfYWxwaGEgKyAwLjQ5ODAzOTIxNTY4NjI3NDUgKiBoaWdobGlnaHRfYWxwaGEsXG4gICAgICAgIDAuNVxuICAgICkpO1xuYCkoZSk6KGU9PmBcbiAgICB2ZWM0IGhpZ2hsaWdodF9jb2xvciA9IHVfbWVkaXVtcFske2V9XTtcbiAgICB2ZWM0IHNoYWRvd19jb2xvciAgICA9IHVfbWVkaXVtcFske2UrMX1dO1xuICAgIGJsdXIgPSBoaWdobGlnaHRfY29sb3IgKiBoaWdobGlnaHRfYWxwaGEgKyBzaGFkb3dfY29sb3IgKiBzaGFkb3dfYWxwaGE7XG5gKShpKTtyZXR1cm5gXG4gICAgJHtzfVxuICAgIGZsb2F0IGhpZ2hsaWdodF9hbHBoYSA9IGJsdXIuYSAtIGJsdXIyLmE7XG4gICAgZmxvYXQgc2hhZG93X2FscGhhICAgID0gYmx1cjIuYSAtIGJsdXIuYTtcbiAgICAke299XG4gICAgaGlnaGxpZ2h0X2FscGhhID0gY2xhbXAoaGlnaGxpZ2h0X2FscGhhLCAwLjAsIDEuMCk7XG4gICAgc2hhZG93X2FscGhhICAgID0gY2xhbXAoc2hhZG93X2FscGhhLCAwLjAsIDEuMCk7XG4gICAgJHtjfVxuYH0senI9KGUsdCxyLG4saSxhLHMpPT57Y29uc3Qgbz1gZiR7ZT8ieSI6Im4ifSR7dD8ieSI6Im4ifSR7cj8ieSI6Im4ifSR7bn0ke2k/InkiOiJuIn0ke2E/InkiOiJuIn0ke3M/InkiOiJuIn1gO2lmKEFyLmhhcyhvKSlyZXR1cm4gQXIuZ2V0KG8pO2xldCBsPTE7ZSYmbCsrLHMmJmwrKztsZXQgYz0oZT80OjApKyh0PzQ6MCkrKGE/MTowKTtzfHwoYys9cj80OjgpLGM9TWF0aC5jZWlsKGMvNCk7Y29uc3QgdT1uZXcgTHQoIiN2ZXJzaW9uIDMwMCBlc1xuXG5sYXlvdXQgKGxvY2F0aW9uID0gMCkgaW4gdmVjMiBhX3ZlcnRleDtcblxub3V0IHZlYzIgdl9jb29yZDtcblxudm9pZCBtYWluKCkge1xuICAgIHZfY29vcmQgPSBhX3ZlcnRleDtcblxuICAgIHZlYzIgcG9zaXRpb24gPSBhX3ZlcnRleCAqIDIuMCAtIDEuMDtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuMCwgMS4wKTtcbn0iLCgoZSx0LHIsbixpLGEscyxvLGwpPT57bGV0IGM9MDtjb25zdCB1PXI/KGU9PmBcbiAgICB2ZWMyIGJhc2Vfc2NhbGUgID0gdV9tZWRpdW1wWyR7ZX1dLnh5O1xuICAgIHZlYzIgYmFzZV9vZmZzZXQgPSB1X21lZGl1bXBbJHtlfV0uenc7XG5cbiAgICB2ZWMyIHV2ID0gdl9jb29yZCAqIGJhc2Vfc2NhbGUgLSBiYXNlX29mZnNldDtcbiAgICB2ZWM0IGJhc2UgPSBtaXgodmVjNCgwLjApLCB0ZXh0dXJlKHVfdGV4dHVyZXNbMV0sIHV2KSwgaXNJbnNpZGUodXYpKTtcbmApKGMrKyk6IiIsZj1uPyhlPT5gXG4gICAgdmVjMiBibHVyX3NjYWxlICA9IHVfbWVkaXVtcFske2V9XS54eTtcbiAgICB2ZWMyIGJsdXJfb2Zmc2V0ID0gdV9tZWRpdW1wWyR7ZX1dLnp3O1xuXG4gICAgdmVjMiBzdCA9IHZfY29vcmQgKiBibHVyX3NjYWxlIC0gYmx1cl9vZmZzZXQ7XG4gICAgdmVjNCBibHVyID0gbWl4KHZlYzQoMC4wKSwgdGV4dHVyZSh1X3RleHR1cmVzWzBdLCBzdCksIGlzSW5zaWRlKHN0KSk7XG5gKShjKyspOiJcbiAgICB2ZWM0IGJsdXIgPSB0ZXh0dXJlKHVfdGV4dHVyZXNbMF0sIHZfY29vcmQpO1xuIixkPSJpbm5lciI9PT1hLGg9YztsZXQgcCxtLGc9NCpjO3N3aXRjaChsP3A9aT9JcighMSxyLG8sbCxoLGcpOlZyKHIsbixvLGwsaCxnKTppPyhnKz00LHA9SXIoZCxyLG8sbCxoLGcpKTooZys9OCxwPVZyKHIsbixvLGwsaCxnKSksYSl7Y2FzZSJvdXRlciI6bT1zPyJibHVyIC0gYmx1ciAqIGJhc2UuYSI6ImJhc2UgKyBibHVyIC0gYmx1ciAqIGJhc2UuYSI7YnJlYWs7Y2FzZSJmdWxsIjptPXM/ImJsdXIiOiJiYXNlIC0gYmFzZSAqIGJsdXIuYSArIGJsdXIiO2JyZWFrO2RlZmF1bHQ6bT0iYmx1ciJ9cmV0dXJuYCN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cbnVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4dHVyZXNbJHtlfV07XG51bmlmb3JtIHZlYzQgdV9tZWRpdW1wWyR7dH1dO1xuXG5pbiB2ZWMyIHZfY29vcmQ7XG5vdXQgdmVjNCBvX2NvbG9yO1xuXG5cbmZsb2F0IGlzSW5zaWRlKGluIHZlYzIgdXYpIHtcbiAgICByZXR1cm4gc3RlcCg0LjAsIGRvdChzdGVwKHZlYzQoMC4wLCB1di54LCAwLjAsIHV2LnkpLCB2ZWM0KHV2LngsIDEuMCwgdXYueSwgMS4wKSksIHZlYzQoMS4wKSkpO1xufVxuXG52b2lkIG1haW4oKSB7XG4gICAgJHt1fVxuICAgICR7Zn1cbiAgICAke3B9XG4gICAgb19jb2xvciA9ICR7bX07XG59YH0pKGwsYyxlLHQscixuLGksYSxzKSk7cmV0dXJuIEFyLnNldChvLHUpLHV9LGpyPW5ldyBNYXAsRHI9W10sTnI9KGUsdCk9Pntjb25zdCByPWBsJHsoIjAwIitlKS5zbGljZSgtMyl9JHt0PyJ5IjoibiJ9YCxuPShlPT57Y29uc3QgdD1qci5nZXQoZSk7aWYodCl7Y29uc3QgdD1Eci5pbmRleE9mKGUpOy0xIT09dCYmKERyLnNwbGljZSh0LDEpLERyLnB1c2goZSkpfXJldHVybiB0fSkocik7aWYobilyZXR1cm4gbjtjb25zdCBpPU1hdGguY2VpbCg1KmUvNCksYT1uZXcgTHQoIiN2ZXJzaW9uIDMwMCBlc1xuXG5sYXlvdXQgKGxvY2F0aW9uID0gMCkgaW4gdmVjMiBhX3ZlcnRleDtcblxub3V0IHZlYzIgdl9jb29yZDtcblxudm9pZCBtYWluKCkge1xuICAgIHZfY29vcmQgPSBhX3ZlcnRleDtcblxuICAgIHZlYzIgcG9zaXRpb24gPSBhX3ZlcnRleCAqIDIuMCAtIDEuMDtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuMCwgMS4wKTtcbn0iLCgoZSx0LHIpPT57bGV0IG49IiI7Zm9yKGxldCBlPTE7ZTx0OysrZSl7Y29uc3Qgcj1lLTEsaT1lLGE9YHVfbWVkaXVtcFske3QrTWF0aC5mbG9vcihyLzQpfV1bJHtyJTR9XWAscz1gdV9tZWRpdW1wWyR7dCtNYXRoLmZsb29yKGkvNCl9XVske2klNH1dYDtuKz1gXG4gICAgaWYgKHQgPD0gJHtzfSkge1xuICAgICAgICByZXR1cm4gbWl4KHVfbWVkaXVtcFske3J9XSwgdV9tZWRpdW1wWyR7aX1dLCAodCAtICR7YX0pIC8gKCR7c30gLSAke2F9KSk7XG4gICAgfVxuYH1yZXR1cm5gI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblxudW5pZm9ybSB2ZWM0IHVfbWVkaXVtcFske2V9XTtcblxuaW4gdmVjMiB2X2Nvb3JkO1xub3V0IHZlYzQgb19jb2xvcjtcblxudmVjNCBnZXRHcmFkaWVudENvbG9yKGluIGZsb2F0IHQpIHtcbiAgICBpZiAodCA8PSB1X21lZGl1bXBbJHt0fV1bMF0pIHtcbiAgICAgICAgcmV0dXJuIHVfbWVkaXVtcFswXTtcbiAgICB9XG4gICAgJHtufVxuICAgIHJldHVybiB1X21lZGl1bXBbJHt0LTF9XTtcbn1cblxudm9pZCBtYWluKCkge1xuICAgIHZlYzQgY29sb3IgPSBnZXRHcmFkaWVudENvbG9yKHZfY29vcmQueCk7XG4gICAgJHtyPyJjb2xvciA9IHBvdyhjb2xvciwgdmVjNCgwLjQ1NDU0NTQ1KSk7IjoiIn1cbiAgICBjb2xvci5yZ2IgKj0gY29sb3IuYTtcblxuICAgIG9fY29sb3IgPSBjb2xvcjtcbn1gfSkoaSxlLHQpKTtyZXR1cm4oKGUsdCk9Pntjb25zdCByPURyLmluZGV4T2YoZSk7Zm9yKC0xIT09ciYmRHIuc3BsaWNlKHIsMSk7anIuc2l6ZT49MTYmJkRyLmxlbmd0aD4wOyl7Y29uc3QgZT1Eci5zaGlmdCgpO2UmJmpyLmRlbGV0ZShlKX1qci5zZXQoZSx0KSxEci5wdXNoKGUpfSkocixhKSxhfSxXcj0oZSx0LHIsbixpLGEpPT57Y29uc3Qgcz1lLm1lZGl1bXA7bGV0IG89MDtmb3IobGV0IGU9aTtlPGE7ZSsrKXtjb25zdCB0PXJbZV07c1tvKytdPSh0Pj4xNikvMjU1LHNbbysrXT0odD4+OCYyNTUpLzI1NSxzW28rK109KDI1NSZ0KS8yNTUsc1tvKytdPW5bZV19Zm9yKGxldCBlPWk7ZTxhO2UrKylzW28rK109dFtlXS8yNTV9O2xldCBxcjtjb25zdCBYcj0oZSx0KT0+KHFyP090WzBdPT09ZSYmT3RbNF09PT10fHwoT3RbMF09ZSxPdFsyXT1lLE90WzRdPXQsT3RbNl09dCxyLmJ1ZmZlclN1YkRhdGEoci5BUlJBWV9CVUZGRVIsMCxPdCkpOnFyPSgoZSx0KT0+e2NvbnN0IG49U3QoKTtyZXR1cm4gVHQobiksci5iaW5kQnVmZmVyKHIuQVJSQVlfQlVGRkVSLG4udmVydGV4QnVmZmVyKSxPdFswXT1lLE90WzJdPWUsT3RbNF09dCxPdFs2XT10LHIuYnVmZmVyRGF0YShyLkFSUkFZX0JVRkZFUixPdCxyLlNUQVRJQ19EUkFXKSxyLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDApLHIudmVydGV4QXR0cmliUG9pbnRlcigwLDIsci5GTE9BVCwhMSwwLDApLG59KShlLHQpLHFyKSxZcj0oZSx0LG4pPT57ZS51c2VQcm9ncmFtKCksZS5iaW5kVW5pZm9ybSgpLFR0KFhyKHQsbikpLHIuZHJhd0FycmF5cyhyLlRSSUFOR0xFX1NUUklQLDAsNCl9LEtyPW5ldyBNYXAsSHI9ZT0+e2lmKCFLci5oYXMoZSkpe2NvbnN0IHQ9eWUoZSwxLCExKTtLci5zZXQoZSx0KX1yZXR1cm4gS3IuZ2V0KGUpfTtsZXQgUXI9MDtjb25zdCBacj0oKT0+UXIsSnI9bmV3IEZsb2F0MzJBcnJheSgyNTYpLGVuPW5ldyBGbG9hdDMyQXJyYXkoMjU2KTtmb3IobGV0IGU9MDtlPDI1NjsrK2Upe2NvbnN0IHQ9ZS8yNTU7SnJbZV09TWF0aC5wb3codCwyLjIzMzMzMzMzKSxlbltlXT10fWNvbnN0IHRuPShlLHQscik9Pntjb25zdCBpPW4uY3VycmVudEF0dGFjaG1lbnRPYmplY3QsYT1Icig1MTIpO24uYmluZChhKTtjb25zdCBzPWUubGVuZ3RoO2JyKCk7Y29uc3Qgbz1acigpO2ZvcihsZXQgbj0wO248cztuKz1vLTEpe2NvbnN0IGk9TWF0aC5taW4obitvLHMpLGE9TnIoaS1uLCExKTtXcihhLGUsdCxyLG4saSksWXIoYSxlW25dLzI1NSxlW2ktMV0vMjU1KX1yZXR1cm4gWHQoKSxpJiZuLmJpbmQoaSksYS50ZXh0dXJlfSxybj0oZSx0LGksYSxzLG8sbCxjLHUsZixkLGgscCxtLGcsYix4PW51bGwsdj1udWxsLHk9bnVsbCxfPTAsdz0wLE09MCxQPTAsUz0wLEY9MCxUPTAsQj0wKT0+e2NvbnN0IE89bi5jdXJyZW50QXR0YWNobWVudE9iamVjdCxBPXllKGksYSwhMSk7bi5iaW5kKEEpO2NvbnN0IFI9ImlubmVyIj09PW0sQz1udWxsIT09eCYmbnVsbCE9PXYmJm51bGwhPT15O2xldCBFPW51bGw7aWYoQyYmKEU9dG4oeCx2LHkpKSxSKXtuLnJlc2V0KCksbi5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLGtlKGUsITApO2NvbnN0IGk9ZnIoKTtkcihpLGUud2lkdGgsZS5oZWlnaHQpLGhyKGkpLEMmJkU/KChlLHQsbj0hMSk9PntHZSgyLHIuVEVYVFVSRTIsdCxuKSxHZSgxLHIuVEVYVFVSRTEsbnVsbCksR2UoMCxyLlRFWFRVUkUwLGUsbil9KSh0LEUsITApOmtlKHQsITApfWVsc2UgQyYmRT8oKGUsdCxuLGk9ITEpPT57R2UoMixyLlRFWFRVUkUyLG4saSksR2UoMSxyLlRFWFRVUkUxLHQsaSksR2UoMCxyLlRFWFRVUkUwLGUsaSl9KSh0LGUsRSwhMCk6dXIodCxlLCEwKTtjb25zdCBVPSEoUnx8ImZ1bGwiPT09bSYmZyksJD0hKGk9PT11JiZhPT09ZiYmMD09PWQmJjA9PT1oKSxHPSEoMT09PWIpO1I/Zz82NzAhPT1XdCYmKHF0KDY3MCksci5ibGVuZEZ1bmMoci5EU1RfQUxQSEEsci5aRVJPKSk6NjczIT09V3QmJihxdCg2NzMpLHIuYmxlbmRGdW5jKHIuRFNUX0FMUEhBLHIuT05FX01JTlVTX1NSQ19BTFBIQSkpOmJyKCk7Y29uc3Qgaz16cihVLCQscCxtLGcsRyxDKTsoKGUsdCxyLG4saSxhLHMsbyxsLGMsdSxmLGQsaCxwLG0sZyxiLHgsdix5LF8sdyxNLFApPT57bGV0IFM7Xz8oUz1lLnRleHR1cmVzLFNbMF09MCxTWzFdPTEsUCYmKFNbMl09MikpOlAmJihTPWUudGV4dHVyZXMsU1swXT0wLFNbMV09Mik7Y29uc3QgRj1lLm1lZGl1bXA7bGV0IFQ9MDtfJiYoRltUKytdPXQvbixGW1QrK109ci9pLEZbVCsrXT1hL24sRltUKytdPShyLWktcykvaSksdyYmKEZbVCsrXT10L28sRltUKytdPXIvbCxGW1QrK109Yy9vLEZbVCsrXT0oci1sLXUpL2wpLFB8fChmPyhGW1QrK109aCxGW1QrK109cCxGW1QrK109bSxGW1QrK109Zyk6KEZbVCsrXT1oLEZbVCsrXT1wLEZbVCsrXT1tLEZbVCsrXT1nLEZbVCsrXT1iLEZbVCsrXT14LEZbVCsrXT12LEZbVCsrXT15KSksTSYmKEZbVF09ZCl9KShrLGksYSxzLG8sbCxjLHUsZixkLGgscCxiLF8sdyxNLFAsUyxGLFQsQixVLCQsRyxDKSxocihrKTtjb25zdCBMPUEudGV4dHVyZTtyZXR1cm4gY2UoQSwhMSksWHQoKSxPJiZuLmJpbmQoTyksTH0sbm49KGUsdCxyPTAsaT0xLGE9NCxzPTQsbz0xLGw9MSxjPSExLHU9ITEpPT57Y29uc3QgZj1uLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0LGQ9ZS53aWR0aCxoPWUuaGVpZ2h0LHA9Q3IueCxtPUNyLnksZz1rcihlLHQsYSxzLGwsITEpLGI9Zy53aWR0aCx4PWcuaGVpZ2h0LHY9Q3IueC1wLHk9Q3IueS1tLF89cm4oZSxnLGM/ZDpiLGM/aDp4LGQsaCxjPzA6dixjPzA6eSxiLHgsYz8tdjowLGM/LXk6MCwhMCxjPyJpbm5lciI6Im91dGVyIix1LG8sbnVsbCxudWxsLG51bGwsRXIocixpLCEwKSxVcihyLGksITApLCRyKHIsaSwhMCksaSwwLDAsMCwwKTtyZXR1cm4gSyhlKSxLKGcpLGYmJm4uYmluZChmKSxffSxhbj1NYXRoLlBJLzE4MCxzbj0oZSx0LHI9NCxpPTQ1LGE9MCxzPTEsbz00LGw9NCxjPTEsdT0xLGY9ITEsZD0hMSxoPSExKT0+e2NvbnN0IHA9bi5jdXJyZW50QXR0YWNobWVudE9iamVjdCxtPWUud2lkdGgsZz1lLmhlaWdodCxiPUNyLngseD1Dci55LHY9a3IoZSx0LG8sbCx1LCExKSx5PXYud2lkdGgsXz12LmhlaWdodCx3PUNyLngsTT1Dci55LFA9dy1iLFM9TS14LFQ9TWF0aC5zcXJ0KHRbMF0qdFswXSt0WzFdKnRbMV0pLEI9TWF0aC5zcXJ0KHRbMl0qdFsyXSt0WzNdKnRbM10pLE89RixBPWkqYW4sUj1NYXRoLmNvcyhBKSpyKihUL08pLEM9TWF0aC5zaW4oQSkqciooQi9PKSxFPWY/bTp5K01hdGgubWF4KDAsTWF0aC5hYnMoUiktUCksVT1mP2c6XytNYXRoLm1heCgwLE1hdGguYWJzKEMpLVMpLCQ9TWF0aC5jZWlsKEUpLEc9TWF0aC5jZWlsKFUpLGs9KCQtRSkvMixMPShHLVUpLzIsST1mPzA6TWF0aC5tYXgoMCxQLVIpK2ssVj1mPzA6TWF0aC5tYXgoMCxTLUMpK0wsej1mP1ItdzooUj4wP01hdGgubWF4KDAsUi1QKTowKStrLGo9Zj9DLU06KEM+MD9NYXRoLm1heCgwLEMtUyk6MCkrTDtsZXQgRCxOPSIiO2Y/KE49ImlubmVyIixEPWR8fGgpOiFkJiZoPyhOPSJmdWxsIixEPSEwKTooTj0ib3V0ZXIiLEQ9ZCk7Y29uc3QgVz1ybihlLHYsJCxHLG0sZyxJLFYseSxfLHosaiwhMCxOLEQsYyxudWxsLG51bGwsbnVsbCxFcihhLHMsITApLFVyKGEscywhMCksJHIoYSxzLCEwKSxzLDAsMCwwLDApO3JldHVybiBLKGUpLEsodikscCYmbi5iaW5kKHApLFd9LG9uPU1hdGguUEkvMTgwLGxuPShlLHQscj00LGk9NDUsYT0xNjc3NzIxNSxzPTEsbz0wLGw9MSxjPTQsdT00LGY9MSxkPTEsaD0wLHA9ITEpPT57Y29uc3QgbT1lLndpZHRoLGc9ZS5oZWlnaHQsYj1Dci54LHg9Q3IueSx2PU1hdGguc3FydCh0WzBdKnRbMF0rdFsxXSp0WzFdKSx5PU1hdGguc3FydCh0WzJdKnRbMl0rdFszXSp0WzNdKSxfPUYsdz1pKm9uLE09TWF0aC5jb3Modykqcioodi9fKSxQPU1hdGguc2luKHcpKnIqKHkvXyksUz1uLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0LFQ9eWUobSxnLCExKTtuLmJpbmQoVCksbi5yZXNldCgpLG4uc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKSxrZShlKTtjb25zdCBCPWZyKCk7ZHIoQixlLndpZHRoLGUuaGVpZ2h0KSxocihCKSxuLnNldFRyYW5zZm9ybSgxLDAsMCwxLDIqTSwyKlApLFByKCksZHIoQixlLndpZHRoLGUuaGVpZ2h0KSxocihCKSxYdCgpO2NvbnN0IE89VC50ZXh0dXJlO1MmJm4uYmluZChTKTtjb25zdCBBPWtyKE8sdCxjLHUsZCwhMSk7Y2UoVCk7Y29uc3QgUj1BLndpZHRoLEM9QS5oZWlnaHQsRT1NYXRoLmNlaWwoUisyKk1hdGguYWJzKE0pKSxVPU1hdGguY2VpbChDKzIqTWF0aC5hYnMoUCkpO2xldCAkPSIiO3N3aXRjaChoKXtjYXNlIDA6JD0iZnVsbCI7YnJlYWs7Y2FzZSAxOiQ9ImlubmVyIjticmVhaztjYXNlIDI6JD0ib3V0ZXIifWNvbnN0IEc9ImlubmVyIj09PSQsaz1HP206RSxMPUc/ZzpVLEk9TWF0aC5hYnMoTSksVj1NYXRoLmFicyhQKSx6PShSLW0pLzIsaj0oQy1nKS8yLEQ9Rz8wOkkreixOPUc/MDpWK2osVz1ybihlLEEsayxMLG0sZyxELE4sUixDLEc/LXotTTpJLU0sRz8tai1QOlYtUCwhMSwkLHAsZixudWxsLG51bGwsbnVsbCxFcihhLHMsITApLFVyKGEscywhMCksJHIoYSxzLCEwKSxzLEVyKG8sbCwhMCksVXIobyxsLCEwKSwkcihvLGwsITApLGwpO3JldHVybiBDci54PWIrRCxDci55PXgrTixLKGUpLEsoQSksV30sY249TWF0aC5QSS8xODAsdW49KGUsdCxyPTQsaT00NSxhLHMsbyxsPTQsYz00LHU9MSxmPTEsZD0wLGg9ITEpPT57Y29uc3QgcD1lLndpZHRoLG09ZS5oZWlnaHQsZz1Dci54LGI9Q3IueSx4PU1hdGguc3FydCh0WzBdKnRbMF0rdFsxXSp0WzFdKSx2PU1hdGguc3FydCh0WzJdKnRbMl0rdFszXSp0WzNdKSx5PUYsXz1pKmNuLHc9TWF0aC5jb3MoXykqciooeC95KSxNPU1hdGguc2luKF8pKnIqKHYveSksUD1uLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0LFM9eWUocCxtLCExKTtuLmJpbmQoUyksbi5yZXNldCgpLG4uc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKSxrZShlKTtjb25zdCBUPWZyKCk7ZHIoVCxlLndpZHRoLGUuaGVpZ2h0KSxocihUKSxuLnNldFRyYW5zZm9ybSgxLDAsMCwxLDIqdywyKk0pLFByKCksZHIoVCxlLndpZHRoLGUuaGVpZ2h0KSxocihUKSxYdCgpO2NvbnN0IEI9Uy50ZXh0dXJlO1AmJm4uYmluZChQKTtjb25zdCBPPWtyKEIsdCxsLGMsZiwhMSk7Y2UoUyk7Y29uc3QgQT1PLndpZHRoLFI9Ty5oZWlnaHQsQz1NYXRoLmNlaWwoQSsyKk1hdGguYWJzKHcpKSxFPU1hdGguY2VpbChSKzIqTWF0aC5hYnMoTSkpO2xldCBVPSIiO3N3aXRjaChkKXtjYXNlIDA6VT0iZnVsbCI7YnJlYWs7Y2FzZSAxOlU9ImlubmVyIjticmVhaztjYXNlIDI6VT0ib3V0ZXIifWNvbnN0ICQ9ImlubmVyIj09PVUsRz0kP3A6QyxrPSQ/bTpFLEw9TWF0aC5hYnModyksST1NYXRoLmFicyhNKSxWPShBLXApLzIsej0oUi1tKS8yLGo9JD8wOkwrVixEPSQ/MDpJK3osTj1ybihlLE8sRyxrLHAsbSxqLEQsQSxSLCQ/LVYtdzpMLXcsJD8tei1NOkktTSwhMSxVLGgsdSxvLGEscywwLDAsMCwwLDAsMCwwLDApO3JldHVybiBDci54PWcraixDci55PWIrRCxLKGUpLEsoTyksTn0sZm49TWF0aC5QSS8xODAsZG49KGUsdCxyPTQsbj00NSxpLGEscyxvPTQsbD00LGM9MSx1PTEsZj0wLGQ9ITEpPT57Y29uc3QgaD1lLndpZHRoLHA9ZS5oZWlnaHQsbT1Dci54LGc9Q3IueSxiPWtyKGUsdCxvLGwsdSwhMSkseD1iLndpZHRoLHY9Yi5oZWlnaHQseT1Dci54LF89Q3IueSx3PXktbSxNPV8tZyxQPU1hdGguc3FydCh0WzBdKnRbMF0rdFsxXSp0WzFdKSxTPU1hdGguc3FydCh0WzJdKnRbMl0rdFszXSp0WzNdKSxUPUYsQj1uKmZuLE89TWF0aC5jb3MoQikqciooUC9UKSxBPU1hdGguc2luKEIpKnIqKFMvVCksUj0xPT09ZixDPVI/aDp4K01hdGgubWF4KDAsTWF0aC5hYnMoTyktdyksRT1SP3A6ditNYXRoLm1heCgwLE1hdGguYWJzKEEpLU0pLFU9TWF0aC5jZWlsKEMpLCQ9TWF0aC5jZWlsKEUpLEc9KFUtQykvMixrPSgkLUUpLzIsTD1SPzA6TWF0aC5tYXgoMCx3LU8pK0csST1SPzA6TWF0aC5tYXgoMCxNLUEpK2ssVj1SP08teTooTz4wP01hdGgubWF4KDAsTy13KTowKStHLHo9Uj9BLV86KEE+MD9NYXRoLm1heCgwLEEtTSk6MCkraztsZXQgaj0iIjtzd2l0Y2goZil7Y2FzZSAwOmo9ImZ1bGwiO2JyZWFrO2Nhc2UgMTpqPSJpbm5lciI7YnJlYWs7Y2FzZSAyOmo9Im91dGVyIn1jb25zdCBEPXJuKGUsYixVLCQsaCxwLEwsSSx4LHYsVix6LCEwLGosZCxjLHMsaSxhLDAsMCwwLDAsMCwwLDAsMCk7cmV0dXJuIENyLng9bStMLENyLnk9ZytJLEsoZSksSyhiKSxEfSxobj0oZSx0LHIsbik9Pntjb25zdCBpPWBjJHsoIjAiK2UpLnNsaWNlKC0yKX0keygiMCIrdCkuc2xpY2UoLTIpfSR7cj8ieSI6Im4ifSR7bj8ieSI6Im4ifWA7aWYoQXIuaGFzKGkpKXJldHVybiBBci5nZXQoaSk7Y29uc3QgYT0obj8xOjIpK01hdGguY2VpbChlKnQvNCkscz1uZXcgTHQoIiN2ZXJzaW9uIDMwMCBlc1xuXG5sYXlvdXQgKGxvY2F0aW9uID0gMCkgaW4gdmVjMiBhX3ZlcnRleDtcblxub3V0IHZlYzIgdl9jb29yZDtcblxudm9pZCBtYWluKCkge1xuICAgIHZfY29vcmQgPSBhX3ZlcnRleDtcblxuICAgIHZlYzIgcG9zaXRpb24gPSBhX3ZlcnRleCAqIDIuMCAtIDEuMDtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuMCwgMS4wKTtcbn0iLCgoZSx0LHIsbixpKT0+e2NvbnN0IGE9TWF0aC5mbG9vciguNSp0KSxzPU1hdGguZmxvb3IoLjUqciksbz10KnI7bGV0IGw9IiI7Y29uc3QgYz1pPzE6Mjtmb3IobGV0IGU9MDtlPG87KytlKWwrPWBcbiAgICByZXN1bHQgKz0gZ2V0V2VpZ2h0ZWRDb2xvcigke2V9LCB1X21lZGl1bXBbJHtjK01hdGguZmxvb3IoZS80KX1dWyR7ZSU0fV0pO1xuYDtyZXR1cm5gI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblxudW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlO1xudW5pZm9ybSB2ZWM0IHVfbWVkaXVtcFske2V9XTtcblxuaW4gdmVjMiB2X2Nvb3JkO1xub3V0IHZlYzQgb19jb2xvcjtcblxuXG5mbG9hdCBpc0luc2lkZShpbiB2ZWMyIHV2KSB7XG4gICAgcmV0dXJuIHN0ZXAoNC4wLCBkb3Qoc3RlcCh2ZWM0KDAuMCwgdXYueCwgMC4wLCB1di55KSwgdmVjNCh1di54LCAxLjAsIHV2LnksIDEuMCkpLCB2ZWM0KDEuMCkpKTtcbn1cblxudmVjNCBnZXRXZWlnaHRlZENvbG9yIChpbiBpbnQgaSwgaW4gZmxvYXQgd2VpZ2h0KSB7XG4gICAgdmVjMiByY3Bfc2l6ZSA9IHVfbWVkaXVtcFswXS54eTtcblxuICAgIGludCBpX2Rpdl94ID0gaSAvICR7dH07XG4gICAgaW50IGlfbW9kX3ggPSBpIC0gJHt0fSAqIGlfZGl2X3g7XG4gICAgdmVjMiBvZmZzZXQgPSB2ZWMyKGlfbW9kX3ggLSAke2F9LCAke3N9IC0gaV9kaXZfeCk7XG4gICAgdmVjMiB1diA9IHZfY29vcmQgKyBvZmZzZXQgKiByY3Bfc2l6ZTtcblxuICAgIHZlYzQgY29sb3IgPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdXYpO1xuICAgIGNvbG9yLnJnYiAvPSBtYXgoMC4wMDAxLCBjb2xvci5hKTtcbiAgICAke2k/IiI6IlxuICAgIHZlYzQgc3Vic3RpdHV0ZV9jb2xvciA9IHVfbWVkaXVtcFsxXTtcbiAgICBjb2xvciA9IG1peChzdWJzdGl0dXRlX2NvbG9yLCBjb2xvciwgaXNJbnNpZGUodXYpKTtcbiJ9XG5cbiAgICByZXR1cm4gY29sb3IgKiB3ZWlnaHQ7XG59XG5cbnZvaWQgbWFpbigpIHtcbiAgICBmbG9hdCByY3BfZGl2aXNvciA9IHVfbWVkaXVtcFswXS56O1xuICAgIGZsb2F0IGJpYXMgICAgICAgID0gdV9tZWRpdW1wWzBdLnc7XG5cbiAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoMC4wKTtcbiAgICAke2x9XG4gICAgcmVzdWx0ID0gY2xhbXAocmVzdWx0ICogcmNwX2Rpdmlzb3IgKyBiaWFzLCAwLjAsIDEuMCk7XG4gICAgJHtuPyJyZXN1bHQuYSA9IHRleHR1cmUodV90ZXh0dXJlLCB2X2Nvb3JkKS5hOyI6IiJ9XG5cbiAgICByZXN1bHQucmdiICo9IHJlc3VsdC5hO1xuICAgIG9fY29sb3IgPSByZXN1bHQ7XG59YH0pKGEsZSx0LHIsbikpO3JldHVybiBBci5zZXQoaSxzKSxzfSxwbj0oZSx0PTAscj0wLGksYT0xLHM9MCxvPSEwLGw9ITAsYz0wLHU9MCk9Pntjb25zdCBmPW4uY3VycmVudEF0dGFjaG1lbnRPYmplY3QsZD1lLndpZHRoLGg9ZS5oZWlnaHQscD15ZShkLGgsITEpO24uYmluZChwKSxuLnJlc2V0KCksbi5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLGtlKGUsITApLFh0KCk7Y29uc3QgbT1obih0LHIsbyxsKTsoKGUsdCxyLG4saSxhLHMsbyxsLGMsdSk9Pntjb25zdCBmPWUubWVkaXVtcDtmWzBdPTEvdCxmWzFdPTEvcixmWzJdPTEvaSxmWzNdPWEvMjU1O2xldCBkPTQ7c3x8KGZbZCsrXT1vLGZbZCsrXT1sLGZbZCsrXT1jLGZbZCsrXT11KTtjb25zdCBoPW4ubGVuZ3RoO2ZvcihsZXQgZT0wO2U8aDtlKyspZltkKytdPW5bZV19KShtLGQsaCxpLGEscyxsLEVyKGMsdSwhMSksVXIoYyx1LCExKSwkcihjLHUsITEpLHUpLGhyKG0pO2NvbnN0IGc9cC50ZXh0dXJlO3JldHVybiBLKGUpLGNlKHAsITEpLGYmJm4uYmluZChmKSxnfSxtbj0oZSx0LHI9MCxpPTAsYT0wLHM9MCxvPTAsbD0wLGM9MCx1PTAsZj0yLGQ9MCxoPTApPT57Y29uc3QgcD1uLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0LG09ZS53aWR0aCxnPWUuaGVpZ2h0LGI9eWUobSxnLCExKTtuLmJpbmQoYik7Y29uc3QgeD1UcihyLGksdCk7dXIoZSx4KTtjb25zdCB2PSgoZSx0LHIpPT57Y29uc3Qgbj1gZCR7ZX0ke3R9JHtyfWA7aWYoQXIuaGFzKG4pKXJldHVybiBBci5nZXQobik7Y29uc3QgaT1uZXcgTHQoIiN2ZXJzaW9uIDMwMCBlc1xuXG5sYXlvdXQgKGxvY2F0aW9uID0gMCkgaW4gdmVjMiBhX3ZlcnRleDtcblxub3V0IHZlYzIgdl9jb29yZDtcblxudm9pZCBtYWluKCkge1xuICAgIHZfY29vcmQgPSBhX3ZlcnRleDtcblxuICAgIHZlYzIgcG9zaXRpb24gPSBhX3ZlcnRleCAqIDIuMCAtIDEuMDtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuMCwgMS4wKTtcbn0iLCgoZSx0LHIsbik9PntsZXQgaSxhLHM7c3dpdGNoKHQpe2Nhc2UgMTppPSJtYXBfY29sb3IuciI7YnJlYWs7Y2FzZSAyOmk9Im1hcF9jb2xvci5nIjticmVhaztjYXNlIDQ6aT0ibWFwX2NvbG9yLmIiO2JyZWFrO2Nhc2UgODppPSJtYXBfY29sb3IuYSI7YnJlYWs7ZGVmYXVsdDppPSIwLjUifXN3aXRjaChyKXtjYXNlIDE6YT0ibWFwX2NvbG9yLnIiO2JyZWFrO2Nhc2UgMjphPSJtYXBfY29sb3IuZyI7YnJlYWs7Y2FzZSA0OmE9Im1hcF9jb2xvci5iIjticmVhaztjYXNlIDg6YT0ibWFwX2NvbG9yLmEiO2JyZWFrO2RlZmF1bHQ6YT0iMC41In1zd2l0Y2gobil7Y2FzZSAwOnM9IlxuICAgIHZlYzQgc291cmNlX2NvbG9yID0gdGV4dHVyZSh1X3RleHR1cmVzWzBdLCB1dik7XG4iO2JyZWFrO2Nhc2UgMzpzPSJcbiAgICB2ZWM0IHNvdXJjZV9jb2xvciA9dGV4dHVyZSh1X3RleHR1cmVzWzBdLCBtaXgodl9jb29yZCwgdXYsIHN0ZXAoYWJzKHV2IC0gdmVjMigwLjUpKSwgdmVjMigwLjUpKSkpO1xuIjticmVhaztjYXNlIDE6cz0iXG4gICAgdmVjNCBzdWJzdGl0dXRlX2NvbG9yID0gdV9tZWRpdW1wWzJdO1xuICAgIHZlYzQgc291cmNlX2NvbG9yID0gbWl4KHN1YnN0aXR1dGVfY29sb3IsIHRleHR1cmUodV90ZXh0dXJlc1swXSwgdXYpLCBpc0luc2lkZSh1dikpO1xuIjticmVhaztkZWZhdWx0OnM9IlxuICAgIHZlYzQgc291cmNlX2NvbG9yID0gdGV4dHVyZSh1X3RleHR1cmVzWzBdLCBmcmFjdCh1dikpO1xuIn1yZXR1cm5gI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblxudW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlc1syXTtcbnVuaWZvcm0gdmVjNCB1X21lZGl1bXBbJHtlfV07XG5cbmluIHZlYzIgdl9jb29yZDtcbm91dCB2ZWM0IG9fY29sb3I7XG5cblxuZmxvYXQgaXNJbnNpZGUoaW4gdmVjMiB1dikge1xuICAgIHJldHVybiBzdGVwKDQuMCwgZG90KHN0ZXAodmVjNCgwLjAsIHV2LngsIDAuMCwgdXYueSksIHZlYzQodXYueCwgMS4wLCB1di55LCAxLjApKSwgdmVjNCgxLjApKSk7XG59XG5cbnZvaWQgbWFpbigpIHtcbiAgICB2ZWMyIHV2X3RvX3N0X3NjYWxlICA9IHVfbWVkaXVtcFswXS54eTtcbiAgICB2ZWMyIHV2X3RvX3N0X29mZnNldCA9IHVfbWVkaXVtcFswXS56dztcbiAgICB2ZWMyIHNjYWxlICAgICAgICAgICA9IHVfbWVkaXVtcFsxXS54eTtcblxuICAgIHZlYzIgc3QgPSB2X2Nvb3JkICogdXZfdG9fc3Rfc2NhbGUgLSB1dl90b19zdF9vZmZzZXQ7XG4gICAgdmVjNCBtYXBfY29sb3IgPSB0ZXh0dXJlKHVfdGV4dHVyZXNbMV0sIHN0KTtcblxuICAgIHZlYzIgb2Zmc2V0ID0gdmVjMigke2l9LCAke2F9KSAtIDAuNTtcbiAgICB2ZWMyIHV2ID0gdl9jb29yZCArIG9mZnNldCAqIHNjYWxlO1xuICAgICR7c31cblxuICAgIG9fY29sb3IgPSBtaXgodGV4dHVyZSh1X3RleHR1cmVzWzBdLCB2X2Nvb3JkKSwgc291cmNlX2NvbG9yLCBpc0luc2lkZShzdCkpO1xufWB9KSgxPT09cj8zOjIsZSx0LHIpKTtyZXR1cm4gQXIuc2V0KG4saSksaX0pKG8sbCxmKTsoKGUsdCxyLG4saSxhLHMsbyxsLGMsdSxmLGQsaCk9Pntjb25zdCBwPWUudGV4dHVyZXM7cFswXT0wLHBbMV09MTtjb25zdCBtPWUubWVkaXVtcDttWzBdPW4vdCxtWzFdPWkvcixtWzJdPWEvdCxtWzNdPShpLXItcykvcixtWzRdPW8vbixtWzVdPS1sL2ksMT09PWMmJihtWzhdPXUsbVs5XT1mLG1bMTBdPWQsbVsxMV09aCl9KSh2LHIsaSxyLGksYSxzLGMsdSxmLEVyKGQsaCwhMCksVXIoZCxoLCEwKSwkcihkLGgsITApLGgpLFh0KCksaHIodik7Y29uc3QgeT1iLnRleHR1cmU7cmV0dXJuIHAmJm4uYmluZChwKSxLKGUpLEsoeCksY2UoYiwhMSkseX0sZ249KGUsdCxyLGkpPT57Y29uc3QgYT1uLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0LHM9ZS53aWR0aCxvPWUuaGVpZ2h0O3N3aXRjaChuLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbil7Y2FzZSJub3JtYWwiOmNhc2UibGF5ZXIiOmNhc2UiYWRkIjpjYXNlInNjcmVlbiI6Y2FzZSJhbHBoYSI6Y2FzZSJlcmFzZSI6Y2FzZSJjb3B5Ijp7bi5iaW5kKG4uJG1haW5BdHRhY2htZW50T2JqZWN0KSxuLnNldFRyYW5zZm9ybSgxLDAsMCwxLHIsaSk7Y29uc3QgYT15cighMCk7KChlLHQscixpKT0+e2NvbnN0IGE9ZS5oaWdocCxzPW4uJG1hdHJpeDthWzBdPXNbMF0sYVsxXT1zWzFdLGFbMl09c1szXSxhWzNdPXNbNF0sYVs0XT1zWzZdLGFbNV09c1s3XSxhWzZdPXIsYVs3XT1pLGFbOF09UCxhWzldPVM7Y29uc3Qgbz1lLm1lZGl1bXA7b1swXT10WzBdLG9bMV09dFsxXSxvWzJdPXRbMl0sb1szXT10WzNdLG9bNF09dFs0XSxvWzVdPXRbNV0sb1s2XT10WzZdLG9bN109dFs3XX0pKGEsdCxzLG8pLGtlKGUpLFNyKG4uZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uKSxocihhKX1icmVhaztkZWZhdWx0Ontjb25zdCBhPWdyKHIsaSxzLG8pLGw9eWUocyxvLCExKTtuLmJpbmQobCksdXIoYSxlKTtjb25zdCBjPW9yKG4uZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uKTt2cihjLHRbMF0sdFsxXSx0WzJdLHRbM10sdFs0XSx0WzVdLHRbNl0sdFs3XSksaHIoYyksbi5iaW5kKG4uJG1haW5BdHRhY2htZW50T2JqZWN0KSxuLnJlc2V0KCksbi5zZXRUcmFuc2Zvcm0oMSwwLDAsMSxyLGkpLHhyKGwudGV4dHVyZSksSyhhKSxjZShsKX19YSYmbi5iaW5kKGEpLFh0KCl9LGJuPVtdLHhuPWU9PntlLnNpemUmJmUuY2xlYXIoKSxibi5wdXNoKGUpfSx2bj0oZSx0LHIsbixpPW51bGwpPT57dC5oYXMocil8fHQuc2V0KHIsYm4ucG9wKCl8fG5ldyBNYXApO2NvbnN0IGE9dC5nZXQocik7aWYobnVsbD09PWkpe2lmKCFhLmhhcyhuKSlyZXR1cm47cmV0dXJuIGUuZGVzdHJveShhLmdldChuKSksYS5kZWxldGUobiksdm9pZChhLnNpemV8fCh0LmRlbGV0ZShyKSx4bihhKSkpfWEuc2V0KG4saSl9O2NvbnN0IHluPW5ldyBjbGFzc3tjb25zdHJ1Y3Rvcigpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJfJHBvb2wiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiXyRzdG9yZSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJfJHRyYXNoIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiR0aW1lcklkIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRyZW1vdmVDYWNoZSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkcmVtb3ZlSWRzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksdGhpcy5fJHBvb2w9W10sdGhpcy5fJHN0b3JlPW5ldyBNYXAsdGhpcy5fJHRyYXNoPW5ldyBNYXAsdGhpcy4kdGltZXJJZD1udWxsLHRoaXMuJHJlbW92ZUlkcz1bXSx0aGlzLiRyZW1vdmVDYWNoZT0hMX1yZXNldCgpeygoZSx0LHIpPT57ci5jbGVhcigpLG51bGwhPT1lLiR0aW1lcklkJiZjbGVhclRpbWVvdXQoZS4kdGltZXJJZCk7Zm9yKGNvbnN0IHIgb2YgdC52YWx1ZXMoKSl7Zm9yKGNvbnN0IHQgb2Ygci52YWx1ZXMoKSl0JiZlLmRlc3Ryb3kodCk7eG4ocil9dC5jbGVhcigpfSkodGhpcyx0aGlzLl8kc3RvcmUsdGhpcy5fJHRyYXNoKX1kZXN0cm95KGU9bnVsbCl7KChlLHQpPT57aWYodCYmIm9iamVjdCI9PXR5cGVvZiB0JiYiY2FudmFzImluIHQpe2NvbnN0IHI9dC5jYW52YXMsbj1yLndpZHRoLGk9ci5oZWlnaHQ7dC5jbGVhclJlY3QoMCwwLG4rMSxpKzEpLHIud2lkdGg9ci5oZWlnaHQ9MSxlLnB1c2gocil9fSkodGhpcy5fJHBvb2wsZSl9Z2V0Q2FudmFzKCl7cmV0dXJuIHRoaXMuXyRwb29sLnBvcCgpfHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKX1yZW1vdmUoZSx0KXsoKGUsdCxyKT0+e2lmKCFlLmhhcyh0KSlyZXR1cm47Y29uc3Qgbj1lLmdldCh0KTtuLmhhcyhyKSYmKG4uZGVsZXRlKHIpLG4uc2l6ZXx8KHhuKG4pLGUuZGVsZXRlKHQpKSl9KSh0aGlzLl8kc3RvcmUsZSx0KX1yZW1vdmVUaW1lcihlKXsoKGUsdCxyLG4pPT57aWYoci5oYXMobikpcmV0dXJuO2NvbnN0IGk9dC5nZXQobik7aSYmKGkuc2V0KCJ0cmFzaCIsITApLHIuc2V0KG4saSksbnVsbCE9PWUuJHRpbWVySWQmJmNsZWFyVGltZW91dChlLiR0aW1lcklkKSxlLiRyZW1vdmVDYWNoZT0hMSxlLiR0aW1lcklkPXNldFRpbWVvdXQoKCk9PntlLiRyZW1vdmVDYWNoZT0hMCxlLiR0aW1lcklkPW51bGx9LDFlMykpfSkodGhpcyx0aGlzLl8kc3RvcmUsdGhpcy5fJHRyYXNoLGUpfXJlbW92ZVRpbWVyU2NoZWR1bGVkQ2FjaGUoKXsoKGUsdCk9PntpZih0LnNpemUpe2Zvcihjb25zdFtyLG5db2YgdCluLmhhcygidHJhc2giKSYmKGUucmVtb3ZlQnlJZChyKSxlLiRyZW1vdmVJZHMucHVzaCgrcikpO3QuY2xlYXIoKSxlLiRyZW1vdmVDYWNoZT0hMX19KSh0aGlzLHRoaXMuXyR0cmFzaCl9cmVtb3ZlQnlJZChlKXsoKGUsdCxyKT0+e2lmKCF0LmhhcyhyKSlyZXR1cm47Y29uc3Qgbj10LmdldChyKTtmb3IoY29uc3QgdCBvZiBuLnZhbHVlcygpKWUuZGVzdHJveSh0KTt0LmRlbGV0ZShyKSx4bihuKX0pKHRoaXMsdGhpcy5fJHN0b3JlLGUpfWdldEJ5SWQoZSl7cmV0dXJuIHRoaXMuXyRzdG9yZS5nZXQoZSl9Z2V0KGUsdCl7cmV0dXJuKChlLHQscik9Pntjb25zdCBuPWUuZ2V0KHQpfHxudWxsO3JldHVybiBuPyhuLmRlbGV0ZSgidHJhc2giKSxuLmdldChyKXx8bnVsbCk6bnVsbH0pKHRoaXMuXyRzdG9yZSxlLHQpfXNldChlLHQscj1udWxsKXt2bih0aGlzLHRoaXMuXyRzdG9yZSxlLHQscil9aGFzKGUsdD0iIil7cmV0dXJuKChlLHQscj0iIik9PnI/ISFlLmhhcyh0KSYmZS5nZXQodCkuaGFzKHIpOmUuaGFzKHQpKSh0aGlzLl8kc3RvcmUsZSx0KX1nZW5lcmF0ZUtleXMoZSx0LHIpe3JldHVybigoZSx0LHIpPT57bGV0IG49MjE2NjEzNjI2MSxpPTEwMCplfDA7cmV0dXJuIG5ePTI1NSZpLG49TWF0aC5pbXVsKG4sMTY3Nzc2MTkpLG5ePWk+Pj44JjI1NSxuPU1hdGguaW11bChuLDE2Nzc3NjE5KSxuXj1pPj4+MTYmMjU1LG49TWF0aC5pbXVsKG4sMTY3Nzc2MTkpLG5ePWk+Pj4yNCxuPU1hdGguaW11bChuLDE2Nzc3NjE5KSxpPTEwMCp0fDAsbl49MjU1Jmksbj1NYXRoLmltdWwobiwxNjc3NzYxOSksbl49aT4+PjgmMjU1LG49TWF0aC5pbXVsKG4sMTY3Nzc2MTkpLG5ePWk+Pj4xNiYyNTUsbj1NYXRoLmltdWwobiwxNjc3NzYxOSksbl49aT4+PjI0LG49TWF0aC5pbXVsKG4sMTY3Nzc2MTkpLHImJihpPTEwMCpyfDAsbl49MjU1Jmksbj1NYXRoLmltdWwobiwxNjc3NzYxOSksbl49aT4+PjgmMjU1LG49TWF0aC5pbXVsKG4sMTY3Nzc2MTkpLG5ePWk+Pj4xNiYyNTUsbj1NYXRoLmltdWwobiwxNjc3NzYxOSksbl49aT4+PjI0LG49TWF0aC5pbXVsKG4sMTY3Nzc2MTkpKSwobj4+PjApJTE2Nzc3MjE2fSkoZSx0LHIpfWdlbmVyYXRlRmlsdGVyS2V5cyhlLHQscixuKXtyZXR1cm4oKGUsdCxyLG4pPT57bGV0IGk9MjE2NjEzNjI2MSxhPTEwMCplfDA7cmV0dXJuIGlePTI1NSZhLGk9TWF0aC5pbXVsKGksMTY3Nzc2MTkpLGlePWE+Pj44JjI1NSxpPU1hdGguaW11bChpLDE2Nzc3NjE5KSxpXj1hPj4+MTYmMjU1LGk9TWF0aC5pbXVsKGksMTY3Nzc2MTkpLGlePWE+Pj4yNCxpPU1hdGguaW11bChpLDE2Nzc3NjE5KSxhPTEwMCp0fDAsaV49MjU1JmEsaT1NYXRoLmltdWwoaSwxNjc3NzYxOSksaV49YT4+PjgmMjU1LGk9TWF0aC5pbXVsKGksMTY3Nzc2MTkpLGlePWE+Pj4xNiYyNTUsaT1NYXRoLmltdWwoaSwxNjc3NzYxOSksaV49YT4+PjI0LGk9TWF0aC5pbXVsKGksMTY3Nzc2MTkpLGE9MTAwKnJ8MCxpXj0yNTUmYSxpPU1hdGguaW11bChpLDE2Nzc3NjE5KSxpXj1hPj4+OCYyNTUsaT1NYXRoLmltdWwoaSwxNjc3NzYxOSksaV49YT4+PjE2JjI1NSxpPU1hdGguaW11bChpLDE2Nzc3NjE5KSxpXj1hPj4+MjQsaT1NYXRoLmltdWwoaSwxNjc3NzYxOSksYT0xMDAqbnwwLGlePTI1NSZhLGk9TWF0aC5pbXVsKGksMTY3Nzc2MTkpLGlePWE+Pj44JjI1NSxpPU1hdGguaW11bChpLDE2Nzc3NjE5KSxpXj1hPj4+MTYmMjU1LGk9TWF0aC5pbXVsKGksMTY3Nzc2MTkpLGlePWE+Pj4yNCxpPU1hdGguaW11bChpLDE2Nzc3NjE5KSwoaT4+PjApJTE2Nzc3MjE2fSkoZSx0LHIsbil9fSxfbj1uZXcgRmxvYXQzMkFycmF5KDIwKSx3bj0oZSx0LHIsaSxhLHMsbyxsLGMsdSxmKT0+e2NvbnN0IGQ9bi5jdXJyZW50QXR0YWNobWVudE9iamVjdDtsZXQgaD1udWxsO2NvbnN0IHA9TWF0aC5zcXJ0KG9bMF0qb1swXStvWzFdKm9bMV0pLG09TWF0aC5zcXJ0KG9bMl0qb1syXStvWzNdKm9bM10pLGc9eW4uZ2VuZXJhdGVGaWx0ZXJLZXlzKG9bMF0sb1sxXSxvWzJdLG9bM10pO2xldCBiPSExO2lmKHluLmdldCh0LCJmS2V5Iik9PT1nKXtjb25zdCBlPXluLmdldCh0LCJmVGV4dHVyZSIpO3I/SyhlKTooYj0hMCxoPWUpfWxldCB4PTAsdj0wO2lmKGIpeD15bi5nZXQodCwib2Zmc2V0WCIpLHY9eW4uZ2V0KHQsIm9mZnNldFkiKTtlbHNle2g9Y3IoZSk7Y29uc3QgdD1NYXRoLmF0YW4yKG9bMV0sb1swXSkscj1NYXRoLmF0YW4yKC1vWzJdLG9bM10pLGw9cz9wKk1hdGguY29zKHQpOk1hdGguY29zKHQpLGM9cz9wKk1hdGguc2luKHQpOk1hdGguc2luKHQpLHU9cz8tbSpNYXRoLnNpbihyKTotTWF0aC5zaW4ociksZz1zP20qTWF0aC5jb3Mocik6TWF0aC5jb3MociksYj1fKGwsYyx1LGcsaS8yLGEvMikseT1fKDEsMCwwLDEsLWUudy8yLC1lLmgvMiksTT0oKGUsdCk9Pntjb25zdCByPWVbMF0sbj1lWzFdLGk9ZVsyXSxhPWVbM10scz1lWzRdLG89ZVs1XSxsPXRbMF0sYz10WzFdLHU9dFsyXSxmPXRbM10sZD10WzRdLGg9dFs1XTtyZXR1cm4gXyhyKmwraSpjLG4qbCthKmMscip1K2kqZixuKnUrYSpmLHIqZCtpKmgrcyxuKmQrYSpoK28pfSkoYix5KTtpZih3KGIpLHcoeSksMSE9PU1bMF18fDAhPT1NWzFdfHwwIT09TVsyXXx8MSE9PU1bM10pe2NvbnN0IGU9eWUoaSxhLCExKTtuLmJpbmQoZSksbi5yZXNldCgpLG4uc2V0VHJhbnNmb3JtKE1bMF0sTVsxXSxNWzJdLE1bM10sTVs0XSxNWzVdKSx4PU1bNF0sdj1NWzVdLGtlKGgpO2NvbnN0IHQ9eXIoKTtfcih0LGgud2lkdGgsaC5oZWlnaHQpLGhyKHQpLEsoaCksaD1lLnRleHR1cmUsY2UoZSwhMSksZCYmbi5iaW5kKGQpfXcoTSksQ3IueD0wLENyLnk9MDtmb3IobGV0IGU9MDtmLmxlbmd0aD5lOyl7c3dpdGNoKGZbZSsrXSl7Y2FzZSAwOmg9bG4oaCxvLGZbZSsrXSxmW2UrK10sZltlKytdLGZbZSsrXSxmW2UrK10sZltlKytdLGZbZSsrXSxmW2UrK10sZltlKytdLGZbZSsrXSxmW2UrK10sQm9vbGVhbihmW2UrK10pKTticmVhaztjYXNlIDE6aD1rcihoLG8sZltlKytdLGZbZSsrXSxmW2UrK10pO2JyZWFrO2Nhc2UgMjpmb3IobGV0IHQ9MDt0PDIwOysrdClfblt0XT1mW2UrK107aD1McihoLF9uKTticmVhaztjYXNlIDM6e2NvbnN0IHQ9ZltlKytdLHI9ZltlKytdLG49dCpyLGk9Zi5zdWJhcnJheShlLGUrbik7ZSs9bixoPXBuKGgsdCxyLGksZltlKytdLGZbZSsrXSxCb29sZWFuKGZbZSsrXSksQm9vbGVhbihmW2UrK10pLGZbZSsrXSxmW2UrK10pfWJyZWFrO2Nhc2UgNDp7Y29uc3QgdD1mW2UrK10scj1uZXcgVWludDhBcnJheSh0KTtyLnNldChmLnN1YmFycmF5KGUsZSt0KSksZSs9dCxoPW1uKGgscixmW2UrK10sZltlKytdLGZbZSsrXSxmW2UrK10sZltlKytdLGZbZSsrXSxmW2UrK10sZltlKytdLGZbZSsrXSxmW2UrK10sZltlKytdKX1icmVhaztjYXNlIDU6aD1zbihoLG8sZltlKytdLGZbZSsrXSxmW2UrK10sZltlKytdLGZbZSsrXSxmW2UrK10sZltlKytdLGZbZSsrXSxCb29sZWFuKGZbZSsrXSksQm9vbGVhbihmW2UrK10pLEJvb2xlYW4oZltlKytdKSk7YnJlYWs7Y2FzZSA2Omg9bm4oaCxvLGZbZSsrXSxmW2UrK10sZltlKytdLGZbZSsrXSxmW2UrK10sZltlKytdLEJvb2xlYW4oZltlKytdKSxCb29sZWFuKGZbZSsrXSkpO2JyZWFrO2Nhc2UgNzp7Y29uc3QgdD1mW2UrK10scj1mW2UrK107bGV0IG49ZltlKytdO2NvbnN0IGk9Zi5zdWJhcnJheShlLGUrbik7ZSs9bixuPWZbZSsrXTtjb25zdCBhPWYuc3ViYXJyYXkoZSxlK24pO2UrPW4sbj1mW2UrK107Y29uc3Qgcz1mLnN1YmFycmF5KGUsZStuKTtlKz1uLGg9dW4oaCxvLHQscixpLGEscyxmW2UrK10sZltlKytdLGZbZSsrXSxmW2UrK10sZltlKytdLEJvb2xlYW4oZltlKytdKSl9YnJlYWs7Y2FzZSA4Ontjb25zdCB0PWZbZSsrXSxyPWZbZSsrXTtsZXQgbj1mW2UrK107Y29uc3QgaT1mLnN1YmFycmF5KGUsZStuKTtlKz1uLG49ZltlKytdO2NvbnN0IGE9Zi5zdWJhcnJheShlLGUrbik7ZSs9bixuPWZbZSsrXTtjb25zdCBzPWYuc3ViYXJyYXkoZSxlK24pO2UrPW4saD1kbihoLG8sdCxyLGksYSxzLGZbZSsrXSxmW2UrK10sZltlKytdLGZbZSsrXSxmW2UrK10sQm9vbGVhbihmW2UrK10pKX19fX1pZihoKXtjb25zdCBlPUYsdD11WzBdKihwL2UpLHI9dVsxXSoobS9lKTtuLnJlc2V0KCksbi5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLG4uZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPWMsZ24oaCxsLC14K3Qrb1s0XSwtdityK29bNV0pfWJ8fCh5bi5zZXQodCwiZktleSIsZykseW4uc2V0KHQsImZUZXh0dXJlIixoKSx5bi5zZXQodCwib2Zmc2V0WCIseCkseW4uc2V0KHQsIm9mZnNldFkiLHYpKSxkJiZuLmJpbmQoZCl9LE1uPVtdLFBuPW5ldyBGbG9hdDMyQXJyYXkoMjApLFNuPWU9Pntjb25zdCB0PVJlKGUuaW5kZXgpLHI9dFswXSxuPXRbMV0saT10WzJdLGE9dFszXTt0WzBdPU1hdGgubWluKGUueCxyKSx0WzFdPU1hdGgubWluKGUueSxuKSx0WzJdPU1hdGgubWF4KGUueCtlLncrMSxpKSx0WzNdPU1hdGgubWF4KGUueStlLmgrMSxhKX07bGV0IEZuPTA7Y29uc3QgVG49ZT0+e0ZuPWV9O2xldCBCbj0hMDtjb25zdCBPbj1lPT57Qm49ZX07bGV0IEFuPSExO2NvbnN0IFJuPWU9PntBbj1lfSxDbj0oKT0+ezEhPT1GbiYmKFRuKDEpLHIuc3RlbmNpbEZ1bmMoci5BTFdBWVMsMCwyNTUpLHIuc3RlbmNpbE9wU2VwYXJhdGUoci5GUk9OVCxyLktFRVAsci5LRUVQLHIuSU5DUl9XUkFQKSxyLnN0ZW5jaWxPcFNlcGFyYXRlKHIuQkFDSyxyLktFRVAsci5LRUVQLHIuREVDUl9XUkFQKSksQm4mJihPbighMSksci5jb2xvck1hc2soITEsITEsITEsITEpKX0sRW49KCk9PnsyIT09Rm4mJihUbigyKSxyLnN0ZW5jaWxGdW5jKHIuTk9URVFVQUwsMCwyNTUpLHIuc3RlbmNpbE9wKHIuS0VFUCxyLlpFUk8sci5aRVJPKSksQm58fChPbighMCksci5jb2xvck1hc2soITAsITAsITAsITApKX0sVW49KCk9PntBbnx8KFJuKCEwKSxyLmVuYWJsZShyLlNBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSkpfSwkbj0oKT0+e0FuJiYoUm4oITEpLHIuZGlzYWJsZShyLlNBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSkpfSxHbj0oZSx0LHIsbik9PntDbigpO2NvbnN0IGk9ISFuLGE9enQoaSk7biYmanQoYSxuKSxVbigpLFl0KGEsZSx0LHIpLCRuKCksRW4oKTtjb25zdCBzPShlPT57Y29uc3QgdD0icyIrKGU/InkiOiJuIik7aWYoSXQuaGFzKHQpKXJldHVybiBJdC5nZXQodCk7Y29uc3Qgcj1uZXcgTHQoVnQoZT85OjAsITEsITEsZSksIiN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cbmluIHZlYzQgdl9jb2xvcjtcbm91dCB2ZWM0IG9fY29sb3I7XG5cbnZvaWQgbWFpbigpIHtcbiAgICBvX2NvbG9yID0gdmVjNCh2X2NvbG9yLnJnYiAqIHZfY29sb3IuYSwgdl9jb2xvci5hKTtcbn0iKTtyZXR1cm4gSXQuc2V0KHQscikscn0pKGkpO24mJigoZSx0KT0+e2NvbnN0IHI9ZS5oaWdocDtyWzBdPXRbMF0sclsxXT10WzFdLHJbMl09MCxyWzRdPXRbMl0scls1XT10WzNdLHJbNl09MCxyWzhdPXRbNF0scls5XT10WzVdLHJbMTBdPTEsclsxMl09dFs2XSxyWzEzXT10WzddLHJbMTRdPTAsclsxNl09dFs4XSxyWzE3XT10WzldLHJbMThdPTAsclsyMF09dFsxMF0sclsyMV09dFsxMV0sclsyMl09MSxyWzNdPVAscls3XT1TLHJbMTFdPXRbMTJdLHJbMTVdPXRbMTNdLHJbMTldPXRbMTRdLHJbMjNdPXRbMTVdLHJbMjRdPXRbMTZdLHJbMjVdPXRbMTddLHJbMjZdPXRbMThdLHJbMjddPXRbMTldLHJbMjhdPXRbMjBdLHJbMjldPXRbMjFdLHJbMzBdPXRbMjJdLHJbMzFdPXRbMjNdLHJbMzJdPXRbMjRdLHJbMzNdPXRbMjVdfSkocyxuKSxZdChzLGUsdCxyKX0sa249KGUsdCxyLG4saSk9Pntjb25zdCBhPWUubWVkaXVtcDtsZXQgcz0wO2ZvcihsZXQgZT1yO2U8bjsrK2Upe2NvbnN0IHI9NSplO2FbcysrXT1pW3RbcisxXV0sYVtzKytdPWlbdFtyKzJdXSxhW3MrK109aVt0W3IrM11dLGFbcysrXT1pW3Rbcis0XV19Zm9yKGxldCBlPXI7ZTxuOysrZSlhW3MrK109dFs1KmVdfSxMbj0oZSx0KT0+e2NvbnN0IGk9bi5jdXJyZW50QXR0YWNobWVudE9iamVjdCxvPXIuZ2V0UGFyYW1ldGVyKHIuU0NJU1NPUl9CT1gpO3MoKTtjb25zdCBsPTA9PT10LGM9ZS5sZW5ndGgvNSx1PShlPT5lPD00PzI1NjplPD04PzUxMjoxMDI0KShjKSxmPUhyKHUpO24uYmluZChmKTtjb25zdCBkPWw/SnI6ZW47YnIoKTtjb25zdCBoPVpyKCk7Zm9yKGxldCB0PTA7dDxjO3QrPWgtMSl7Y29uc3Qgcj1NYXRoLm1pbih0K2gsYyksbj1OcihyLXQsbCk7a24obixlLHQscixkKSxZcihuLGVbMF0sZVtlLmxlbmd0aC01XSl9cmV0dXJuIFh0KCksaSYmbi5iaW5kKGkpLGEoKSxyLnNjaXNzb3Iob1swXSxvWzFdLG9bMl0sb1szXSksZi50ZXh0dXJlfSxJbj1uZXcgTWFwLFZuPShlLHQscixuKT0+e2NvbnN0IGk9KChlLHQscixuKT0+YCR7ZT8ieSI6Im4ifSR7dD8ieSI6Im4ifSR7dCYmcj8ieSI6Im4ifSR7bn1gKShuLGUsdCxyKTtpZihJbi5oYXMoaSkpcmV0dXJuIEluLmdldChpKTtjb25zdCBhPTErKG4/MTQ6NSkscz1hLTEsbz1uZXcgTHQoVnQoYSwhMCwhMSxuKSwoKGUsdCxyLG4saSk9Pntjb25zdCBhPXI/KChlLHQpPT57Y29uc3Qgcj10PyhlPT5gXG4gICAgdmVjMiBmb2NhbCA9IHZlYzIodV9oaWdocFske2V9XVsxXSwgMC4wKTtcblxuICAgIHZlYzIgZGlmZiA9IGNvb3JkIC0gZm9jYWw7XG4gICAgZmxvYXQgbGVuRGlmZiA9IGxlbmd0aChkaWZmKTtcbiAgICB2ZWMyIGRpciA9IGRpZmYgLyBsZW5EaWZmO1xuICAgIGZsb2F0IGIgPSAyLjAgKiBkb3QoZGlyLCBmb2NhbCk7XG4gICAgZmxvYXQgYyA9IGRvdChmb2NhbCwgZm9jYWwpIC0gMS4wO1xuICAgIGZsb2F0IHggPSAoLWIgKyBzcXJ0KG1heChiICogYiAtIDQuMCAqIGMsIDAuMCkpKSAqIDAuNTtcblxuICAgIGZsb2F0IHQgPSBsZW5EaWZmIC8gYWJzKHgpO2ApKGUpOiJmbG9hdCB0ID0gbGVuZ3RoKGNvb3JkKTsiO3JldHVybmBcbiAgICBmbG9hdCByYWRpdXMgPSB1X2hpZ2hwWyR7ZX1dWzBdO1xuICAgIHZlYzIgY29vcmQgPSBwIC8gcmFkaXVzO1xuICAgICR7cn1cbmB9KSh0LG4pOihlPT5gXG4gICAgdmVjMiBhID0gdV9oaWdocFske2V9XS54eTtcbiAgICB2ZWMyIGIgPSB1X2hpZ2hwWyR7ZX1dLnp3O1xuXG4gICAgdmVjMiBhYiA9IGIgLSBhO1xuICAgIHZlYzIgYXAgPSBwIC0gYTtcblxuICAgIGZsb2F0IHQgPSBkb3QoYWIsIGFwKSAvIGRvdChhYiwgYWIpO2ApKHQpO2xldCBzO3N3aXRjaChpKXtjYXNlIDA6cz0iMS4wIC0gYWJzKGZyYWN0KHQgKiAwLjUpICogMi4wIC0gMS4wKSI7YnJlYWs7Y2FzZSAxOnM9ImZyYWN0KHQpIjticmVhaztkZWZhdWx0OnM9ImNsYW1wKHQsIDAuMCwgMS4wKSJ9cmV0dXJuYCN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xuXG51bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmU7XG51bmlmb3JtIHZlYzQgdV9oaWdocFske2V9XTtcblxuaW4gdmVjMiB2X3V2O1xub3V0IHZlYzQgb19jb2xvcjtcblxudm9pZCBtYWluKCkge1xuICAgIHZlYzIgcCA9IHZfdXY7XG4gICAgJHthfVxuICAgIHQgPSAke3N9O1xuICAgIG9fY29sb3IgPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdmVjMih0LCAwLjUpKTtcbn1gfSkoYSxzLGUsdCxyKSk7cmV0dXJuIEluLnNldChpLG8pLG99LHpuPShlLHQscixuLGk9MCxhPW51bGwscz1udWxsKT0+e2NvbnN0IG89ZS5oaWdocDtvWzBdPXJbMF0sb1sxXT1yWzFdLG9bMl09clsyXSxvWzRdPXJbM10sb1s1XT1yWzRdLG9bNl09cls1XSxvWzhdPXJbNl0sb1s5XT1yWzddLG9bMTBdPXJbOF0sb1sxMl09blswXSxvWzEzXT1uWzFdLG9bMTRdPW5bMl0sb1sxNl09blszXSxvWzE3XT1uWzRdLG9bMThdPW5bNV0sb1sxMV09bls2XSxvWzE1XT1uWzddLG9bMTldPW5bOF0sb1szXT1QLG9bN109UztsZXQgbD0yMDtzJiYob1syMF09c1swXSxvWzIxXT1zWzFdLG9bMjJdPTAsb1syNF09c1syXSxvWzI1XT1zWzNdLG9bMjZdPTAsb1syOF09c1s0XSxvWzI5XT1zWzVdLG9bMzBdPTEsb1szMl09c1s2XSxvWzMzXT1zWzddLG9bMzRdPTAsb1szNl09c1s4XSxvWzM3XT1zWzldLG9bMzhdPTAsb1s0MF09c1sxMF0sb1s0MV09c1sxMV0sb1s0Ml09MSxvWzMxXT1zWzEyXSxvWzM1XT1zWzEzXSxvWzM5XT1zWzE0XSxvWzQzXT1zWzE1XSxvWzQ0XT1zWzE2XSxvWzQ1XT1zWzE3XSxvWzQ2XT1zWzE4XSxvWzQ3XT1zWzE5XSxvWzQ4XT1zWzIwXSxvWzQ5XT1zWzIxXSxvWzUwXT1zWzIyXSxvWzUxXT1zWzIzXSxvWzUyXT1zWzI0XSxvWzUzXT1zWzI1XSxsPTU2KSwwPT09dD8ob1tsKytdPWFbMF0sb1tsKytdPWFbMV0sb1tsKytdPWFbMl0sb1tsXT1hWzNdKToob1tsKytdPTgxOS4yLG9bbF09dShpLC0uOTc1LC45NzUsMCkpfSxqbj0oKT0+e0ZuPTAsT24oITApLFJuKCExKX0sRG49KGUsdCxpLGEpPT57Y29uc3Qgcz1ydC5zaGlmdCgpLG89cnQuc2hpZnQoKSx1PXJ0LnNoaWZ0KCksZj1ydC5zaGlmdCgpO2puKCksYygpO2NvbnN0IGQ9TG4ocyxmKTtrZShkKSxsKCksci5zdGVuY2lsTWFzaygyNTUpLENuKCk7Y29uc3QgaD0hIWEscD16dChoKTthJiZqdChwLGEpLFVuKCksWXQocCxlLHQsaSksJG4oKSxFbigpO2NvbnN0IG09Vm4oITEsITEsdSxoKSx4PShlPT57Y29uc3QgdD0tODE5LjIqZVswXS04MTkuMiplWzJdK2VbNF0scj04MTkuMiplWzBdLTgxOS4yKmVbMl0rZVs0XSxuPS04MTkuMiplWzBdKzgxOS4yKmVbMl0rZVs0XSxpPS04MTkuMiplWzFdLTgxOS4yKmVbM10rZVs1XSxhPTgxOS4yKmVbMV0tODE5LjIqZVszXStlWzVdO2xldCBzPW4tdCxvPS04MTkuMiplWzFdKzgxOS4yKmVbM10rZVs1XS1pO2NvbnN0IGw9TWF0aC5zcXJ0KHMqcytvKm8pO2w/KHMvPWwsby89bCk6KHM9MCxvPTApO2NvbnN0IGM9KHItdCkqcysoYS1pKSpvO3JldHVybiBnKHQrYypzLGkrYypvLHIsYSl9KShvKSx2PU0obi4kbWF0cml4KTt6bihtLDAsbi4kbWF0cml4LHYsMCx4LGEpLGIoeCksdyh2KSxZdChtLGUsdCxpKX0sTm49KGUsdCxpLGEpPT57Y29uc3Qgcz1ydC5zaGlmdCgpLG89cnQuc2hpZnQoKSx1PXJ0LnNoaWZ0KCksZj1ydC5zaGlmdCgpLGQ9cnQuc2hpZnQoKTtqbigpLGMoKTtjb25zdCBoPUxuKHMsZik7a2UoaCksbCgpLHIuc3RlbmNpbE1hc2soMjU1KSxDbigpO2NvbnN0IHA9ISFhLG09enQocCk7YSYmanQobSxhKSxVbigpLFl0KG0sZSx0LGkpLCRuKCksRW4oKSxuLnNhdmUoKSxuLnRyYW5zZm9ybShvWzBdLG9bMV0sb1syXSxvWzNdLG9bNF0sb1s1XSk7Y29uc3QgZz1uLiRzdGFja1tuLiRzdGFjay5sZW5ndGgtMV0sYj1NKG4uJG1hdHJpeCkseD1WbighMCxCb29sZWFuKGQpLHUscCk7em4oeCwxLGcsYixkLGEpLG4ucmVzdG9yZSgpLHcoYiksWXQoeCxlLHQsaSl9LFduPW5ldyBNYXAscW49KGUsdCxyLGkpPT57Q24oKTtjb25zdCBhPSEhaSxzPXp0KGEpO2kmJmp0KHMsaSksVW4oKSxZdChzLGUsdCxyKSwkbigpO2NvbnN0IG89T3Iuc2hpZnQoKSxsPU9yLnNoaWZ0KCksYz1Pci5zaGlmdCgpLHU9T3Iuc2hpZnQoKSxmPU9yLnNoaWZ0KCksZD1Pci5zaGlmdCgpLGg9VHIoYyx1LG8sZCk7bi5zYXZlKCksbi50cmFuc2Zvcm0obFswXSxsWzFdLGxbMl0sbFszXSxsWzRdLGxbNV0pLEVuKCk7Y29uc3QgcD0oKGUsdCk9Pntjb25zdCByPWBiJHtlPyJ5IjoibiJ9JHt0PyJ5IjoibiJ9YDtpZihXbi5oYXMocikpcmV0dXJuIFduLmdldChyKTtjb25zdCBuPWU/IiN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cbnVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4dHVyZTtcbnVuaWZvcm0gdmVjNCB1X21lZGl1bXBbMV07XG5cbmluIHZlYzIgdl91djtcbm91dCB2ZWM0IG9fY29sb3I7XG5cbnZvaWQgbWFpbigpIHtcbiAgICB2ZWMyIHV2ID0gZnJhY3QodmVjMih2X3V2LngsIC12X3V2LnkpIC8gdV9tZWRpdW1wWzBdLnh5KTtcblxuICAgIHZlYzQgc3JjID0gdGV4dHVyZSh1X3RleHR1cmUsIHV2KTtcbiAgICBvX2NvbG9yID0gc3JjO1xufSI6IiN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cbnVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4dHVyZTtcbnVuaWZvcm0gdmVjNCB1X21lZGl1bXBbMV07XG5cbmluIHZlYzIgdl91djtcbm91dCB2ZWM0IG9fY29sb3I7XG5cbnZvaWQgbWFpbigpIHtcbiAgICB2ZWMyIHV2ID0gdmVjMih2X3V2LngsIHVfbWVkaXVtcFswXS55IC0gdl91di55KSAvIHVfbWVkaXVtcFswXS54eTtcblxuICAgIHZlYzQgc3JjID0gdGV4dHVyZSh1X3RleHR1cmUsIHV2KTtcbiAgICBvX2NvbG9yID0gc3JjO1xufSIsaT1uZXcgTHQoVnQodD8xNDo1LCEwLCExLHQpLG4pO3JldHVybiBXbi5zZXQocixpKSxpfSkoZixhKTsoKGUsdCxyLGkpPT57Y29uc3QgYT1lLmhpZ2hwLHM9bi4kc3RhY2tbbi4kc3RhY2subGVuZ3RoLTFdO2FbMF09c1swXSxhWzFdPXNbMV0sYVsyXT1zWzJdLGFbNF09c1szXSxhWzVdPXNbNF0sYVs2XT1zWzVdLGFbOF09c1s2XSxhWzldPXNbN10sYVsxMF09c1s4XTtjb25zdCBvPU0obi4kbWF0cml4KTthWzEyXT1vWzBdLGFbMTNdPW9bMV0sYVsxNF09b1syXSxhWzE2XT1vWzNdLGFbMTddPW9bNF0sYVsxOF09b1s1XSxhWzExXT1vWzZdLGFbMTVdPW9bN10sYVsxOV09b1s4XSxhWzNdPVAsYVs3XT1TLGkmJihhWzIwXT1pWzBdLGFbMjFdPWlbMV0sYVsyMl09MCxhWzI0XT1pWzJdLGFbMjVdPWlbM10sYVsyNl09MCxhWzI4XT1pWzRdLGFbMjldPWlbNV0sYVszMF09MSxhWzMyXT1pWzZdLGFbMzNdPWlbN10sYVszNF09MCxhWzM2XT1pWzhdLGFbMzddPWlbOV0sYVszOF09MCxhWzQwXT1pWzEwXSxhWzQxXT1pWzExXSxhWzQyXT0xLGFbMzFdPWlbMTJdLGFbMzVdPWlbMTNdLGFbMzldPWlbMTRdLGFbNDNdPWlbMTVdLGFbNDRdPWlbMTZdLGFbNDVdPWlbMTddLGFbNDZdPWlbMThdLGFbNDddPWlbMTldLGFbNDhdPWlbMjBdLGFbNDldPWlbMjFdLGFbNTBdPWlbMjJdLGFbNTFdPWlbMjNdLGFbNTJdPWlbMjRdLGFbNTNdPWlbMjVdKTtjb25zdCBsPWUubWVkaXVtcDtsWzBdPXQsbFsxXT1yfSkocCxjLHUsaSksWXQocCxlLHQsciksbi5yZXN0b3JlKCksSyhoKX07bGV0IFhuPTA7Y29uc3QgWW49bmV3IEZsb2F0MzJBcnJheSgyNTYpO2ZvcihsZXQgZT0xO2U8MjU2O2UrKylZbltlXT0yNTUvZTtsZXQgS249Y2xhc3N7Y29uc3RydWN0b3IoaSxhLHM9MSl7dmFyIG87T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRzdGFjayIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkbWF0cml4Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRjbGVhckNvbG9yUiIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkY2xlYXJDb2xvckciLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJGNsZWFyQ29sb3JCIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRjbGVhckNvbG9yQSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkbWFpbkF0dGFjaG1lbnRPYmplY3QiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJHN0YWNrQXR0YWNobWVudE9iamVjdCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJnbG9iYWxBbHBoYSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJnbG9iYWxDb21wb3NpdGVPcGVyYXRpb24iLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaW1hZ2VTbW9vdGhpbmdFbmFibGVkIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRmaWxsU3R5bGUiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJHN0cm9rZVN0eWxlIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIm1hc2tCb3VuZHMiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywidGhpY2tuZXNzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImNhcHMiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiam9pbnRzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIm1pdGVyTGltaXQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywibmV3RHJhd1N0YXRlIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ITF9KSwoZT0+e3I9ZX0pKGkpLG89aS5nZXRQYXJhbWV0ZXIoaS5NQVhfVEVYVFVSRV9TSVpFKSxlPU1hdGgubWF4KDIwNDgsby8yKSwoZT0+e3Q9ZX0pKGEpLChlPT57Rj1lfSkocyksdGhpcy4kc3RhY2s9ZCgpLHRoaXMuJHN0YWNrQXR0YWNobWVudE9iamVjdD1kKCksdGhpcy4kbWF0cml4PXYoMSwwLDAsMCwxLDAsMCwwLDEpLHRoaXMuJGNsZWFyQ29sb3JSPTAsdGhpcy4kY2xlYXJDb2xvckc9MCx0aGlzLiRjbGVhckNvbG9yQj0wLHRoaXMuJGNsZWFyQ29sb3JBPTAsdGhpcy50aGlja25lc3M9MSx0aGlzLmNhcHM9MCx0aGlzLmpvaW50cz0yLHRoaXMubWl0ZXJMaW1pdD0wLHRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0PW51bGwsdGhpcy5nbG9iYWxBbHBoYT0xLHRoaXMuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJub3JtYWwiLHRoaXMuaW1hZ2VTbW9vdGhpbmdFbmFibGVkPSExLHRoaXMuJGZpbGxTdHlsZT1uZXcgRmxvYXQzMkFycmF5KFsxLDEsMSwxXSksdGhpcy4kc3Ryb2tlU3R5bGU9bmV3IEZsb2F0MzJBcnJheShbMSwxLDEsMV0pLHRoaXMubWFza0JvdW5kcz17eE1pbjowLHlNaW46MCx4TWF4OjAseU1heDowfSxpLnBpeGVsU3RvcmVpKGkuVU5QQUNLX0FMSUdOTUVOVCwxKSxpLnBpeGVsU3RvcmVpKGkuVU5QQUNLX0ZMSVBfWV9XRUJHTCwhMCksaS5jbGVhckNvbG9yKDAsMCwwLDApLGkuZnJvbnRGYWNlKGkuQ0NXKSwoZT0+e1o9ZS5jcmVhdGVGcmFtZWJ1ZmZlcigpfSkoaSksKGU9PntKPWUuY3JlYXRlRnJhbWVidWZmZXIoKX0pKGkpLCgoZSx0KT0+e2VlPWUuY3JlYXRlRnJhbWVidWZmZXIoKSxlLmJpbmRGcmFtZWJ1ZmZlcihlLkZSQU1FQlVGRkVSLGVlKSxlLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGUuRlJBTUVCVUZGRVIsZS5DT0xPUl9BVFRBQ0hNRU5UMCxlLlRFWFRVUkVfMkQsdC5yZXNvdXJjZSwwKSxlLmJpbmRGcmFtZWJ1ZmZlcihlLkZSQU1FQlVGRkVSLG51bGwpLGUuYmluZEZyYW1lYnVmZmVyKGUuRFJBV19GUkFNRUJVRkZFUixlZSl9KShpLE9lKCkpLChlPT57c2U9ZS5jcmVhdGVGcmFtZWJ1ZmZlcigpLGFlPWUuY3JlYXRlRnJhbWVidWZmZXIoKSxvZT1lLmNyZWF0ZUZyYW1lYnVmZmVyKCksbGU9ZS5jcmVhdGVCdWZmZXIoKSxlLmJpbmRCdWZmZXIoZS5QSVhFTF9QQUNLX0JVRkZFUixsZSl9KShpKSxGcihpKSxyLmVuYWJsZShyLkJMRU5EKSxYdCgpLChlPT57UXI9TWF0aC5mbG9vciguNzUqZS5nZXRQYXJhbWV0ZXIoZS5NQVhfRlJBR01FTlRfVU5JRk9STV9WRUNUT1JTKSl9KShpKSxuPXRoaXN9Y2xlYXJUcmFuc2ZlckJvdW5kcygpeygoKT0+e2ZvcihsZXQgZT0wO2U8QWUubGVuZ3RoOysrZSl7Y29uc3QgdD1BZVtlXTt0JiYodFswXT10WzFdPV9lLHRbMl09dFszXT13ZSl9fSkoKX11cGRhdGVCYWNrZ3JvdW5kQ29sb3IoZSx0LHIsbil7KChlLHQscixuLGkpPT57ZS4kY2xlYXJDb2xvclI9dSh0LDAsMSwwKSxlLiRjbGVhckNvbG9yRz11KHIsMCwxLDApLGUuJGNsZWFyQ29sb3JCPXUobiwwLDEsMCksZS4kY2xlYXJDb2xvckE9dShpLDAsMSwwKX0pKHRoaXMsZSx0LHIsbil9ZmlsbEJhY2tncm91bmRDb2xvcigpe3ZhciBlLHQsbixpO2U9dGhpcy4kY2xlYXJDb2xvclIsdD10aGlzLiRjbGVhckNvbG9yRyxuPXRoaXMuJGNsZWFyQ29sb3JCLGk9dGhpcy4kY2xlYXJDb2xvckEsci5jbGVhckNvbG9yKGUsdCxuLGkpLHIuY2xlYXIoci5DT0xPUl9CVUZGRVJfQklUfHIuU1RFTkNJTF9CVUZGRVJfQklUKSxyLmNsZWFyQ29sb3IoMCwwLDAsMCl9cmVzaXplKGUsdCxyPSEwKXskZSh0aGlzLGUsdCxyKX1jbGVhclJlY3QoZSx0LG4saSl7KChlLHQsbixpKT0+e2EoKSxyLnNjaXNzb3IoZSx0LG4saSksci5jbGVhcihyLkNPTE9SX0JVRkZFUl9CSVR8ci5TVEVOQ0lMX0JVRkZFUl9CSVQpLHMoKX0pKGUsdCxuLGkpfWJpbmQoZSl7TmUodGhpcyxlKX1zYXZlKCl7dmFyIGU7KGU9dGhpcykuJHN0YWNrLnB1c2godiguLi5lLiRtYXRyaXgpKX1yZXN0b3JlKCl7V2UodGhpcyl9c2V0VHJhbnNmb3JtKGUsdCxyLG4saSxhKXsoKGUsdCxyLG4saSxhLHMpPT57ZVswXT10LGVbMV09cixlWzNdPW4sZVs0XT1pLGVbNl09YSxlWzddPXN9KSh0aGlzLiRtYXRyaXgsZSx0LHIsbixpLGEpfXRyYW5zZm9ybShlLHQscixuLGksYSl7KChlLHQscixuLGksYSxzKT0+e2NvbnN0IG89ZS4kbWF0cml4WzBdLGw9ZS4kbWF0cml4WzFdLGM9ZS4kbWF0cml4WzNdLHU9ZS4kbWF0cml4WzRdLGY9ZS4kbWF0cml4WzZdLGQ9ZS4kbWF0cml4WzddO2UuJG1hdHJpeFswXT10Km8rcipjLGUuJG1hdHJpeFsxXT10Kmwrcip1LGUuJG1hdHJpeFszXT1uKm8raSpjLGUuJG1hdHJpeFs0XT1uKmwraSp1LGUuJG1hdHJpeFs2XT1hKm8rcypjK2YsZS4kbWF0cml4WzddPWEqbCtzKnUrZH0pKHRoaXMsZSx0LHIsbixpLGEpfXJlc2V0KCl7dmFyIGU7KGU9dGhpcykuZ2xvYmFsQWxwaGE9MSxlLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0ibm9ybWFsIixlLmltYWdlU21vb3RoaW5nRW5hYmxlZD0hMX1iZWdpblBhdGgoKXt2YXIgZTsoZT10aGlzKS4kZmlsbFN0eWxlLmZpbGwoMSksZS4kc3Ryb2tlU3R5bGUuZmlsbCgxKSwoKCk9Pntmb3IoVC5sZW5ndGg9MDtCLmxlbmd0aDspaChCLnBvcCgpKX0pKCl9bW92ZVRvKGUsdCl7QyhlLHQpfWxpbmVUbyhlLHQpeygoZSx0KT0+e1QubGVuZ3RofHxDKGUsdCksUihlLHQpfHxBKGUsdCwhMSl9KShlLHQpfXF1YWRyYXRpY0N1cnZlVG8oZSx0LHIsbil7RShlLHQscixuKX1maWxsU3R5bGUoZSx0LHIsbil7dGhpcy4kZmlsbFN0eWxlWzBdPWUsdGhpcy4kZmlsbFN0eWxlWzFdPXQsdGhpcy4kZmlsbFN0eWxlWzJdPXIsdGhpcy4kZmlsbFN0eWxlWzNdPW59c3Ryb2tlU3R5bGUoZSx0LHIsbil7dGhpcy4kc3Ryb2tlU3R5bGVbMF09ZSx0aGlzLiRzdHJva2VTdHlsZVsxXT10LHRoaXMuJHN0cm9rZVN0eWxlWzJdPXIsdGhpcy4kc3Ryb2tlU3R5bGVbM109bn1jbG9zZVBhdGgoKXsoKCk9PntpZihULmxlbmd0aDw3KXJldHVybjtjb25zdCBlPStUWzBdLHQ9K1RbMV07UihlLHQpfHxBKGUsdCwhMSl9KSgpfWFyYyhlLHQscil7KChlLHQscik9Pntjb25zdCBuPXIsaT0uNTUyMjg0NzQ5ODMwNzkzNipyO3EoZStuLHQraSxlK2ksdCtuLGUsdCtuKSxxKGUtaSx0K24sZS1uLHQraSxlLW4sdCkscShlLW4sdC1pLGUtaSx0LW4sZSx0LW4pLHEoZStpLHQtbixlK24sdC1pLGUrbix0KX0pKGUsdCxyKX1iZXppZXJDdXJ2ZVRvKGUsdCxyLG4saSxhKXtxKGUsdCxyLG4saSxhKX1maWxsKCl7KGU9Pntjb25zdCB0PU8oKTtpZighdC5sZW5ndGgpcmV0dXJuO1plLnB1c2goZSk7Y29uc3Qgcj10dCh0KTtIZShyLmJ1ZmZlciksUWUucHVzaChyLmluZGV4Q291bnQpfSkoImZpbGwiKX1ncmFkaWVudEZpbGwoZSx0LHIsbixpLGEpeygoZSx0LHIsbixpLGEpPT57Y29uc3Qgcz1PKCk7aWYoIXMubGVuZ3RoKXJldHVybjtaZS5wdXNoKDA9PT1lPyJsaW5lYXIiOiJyYWRpYWwiKTtjb25zdCBvPXR0KHMpO0hlKG8uYnVmZmVyKSxRZS5wdXNoKG8uaW5kZXhDb3VudCkscnQucHVzaCh0LHIsbixpKSwxPT09ZSYmcnQucHVzaChhKX0pKGUsdCxyLG4saSxhKX1iaXRtYXBGaWxsKGUsdCxyLG4saSxhKXsoKGUsdCxyLG4saSxhKT0+e2NvbnN0IHM9TygpO2lmKCFzLmxlbmd0aClyZXR1cm47WmUucHVzaCgiYml0bWFwIik7Y29uc3Qgbz10dChzKTtIZShvLmJ1ZmZlciksUWUucHVzaChvLmluZGV4Q291bnQpLE9yLnB1c2goZSx0LHIsbixpLGEpfSkoZSx0LHIsbixpLGEpfXN0cm9rZSgpeygoKT0+e2NvbnN0IGU9TyghMCk7aWYoIWUubGVuZ3RoKXJldHVybjtaZS5wdXNoKCJmaWxsIik7Y29uc3QgdD13dChlKTtIZSh0LmJ1ZmZlciksUWUucHVzaCh0LmluZGV4Q291bnQpfSkoKX1ncmFkaWVudFN0cm9rZShlLHQscixuLGksYSl7KChlLHQscixuLGksYSk9Pntjb25zdCBzPU8oITApO2lmKCFzLmxlbmd0aClyZXR1cm47WmUucHVzaCgwPT09ZT8ibGluZWFyIjoicmFkaWFsIik7Y29uc3Qgbz13dChzKTtIZShvLmJ1ZmZlciksUWUucHVzaChvLmluZGV4Q291bnQpLHJ0LnB1c2godCxyLG4saSksMT09PWUmJnJ0LnB1c2goYSl9KShlLHQscixuLGksYSl9Yml0bWFwU3Ryb2tlKGUsdCxyLG4saSxhKXsoKGUsdCxyLG4saSxhKT0+e2NvbnN0IHM9TyghMCk7aWYoIXMubGVuZ3RoKXJldHVybjtaZS5wdXNoKCJiaXRtYXAiKTtjb25zdCBvPXd0KHMpO0hlKG8uYnVmZmVyKSxRZS5wdXNoKG8uaW5kZXhDb3VudCksT3IucHVzaChlLHQscixuLGksYSl9KShlLHQscixuLGksYSl9Y2xpcCgpeygoKT0+e2NvbnN0IGU9bi5jdXJyZW50QXR0YWNobWVudE9iamVjdDtpZighZSlyZXR1cm47Y29uc3QgdD1qZS5nZXQoZS5jbGlwTGV2ZWwpLGk9dFswXSxvPXRbMV0sbD10WzJdLGM9dFszXSx1PU1hdGguY2VpbChNYXRoLmFicyhsLWkpKSxmPU1hdGguY2VpbChNYXRoLmFicyhjLW8pKTthKCksci5zY2lzc29yKGksZS5oZWlnaHQtby1mLHUsZik7Y29uc3QgZD1VdCgpO2xldCBoPURlLmdldChlLmNsaXBMZXZlbCkscD0wLG09bnVsbDtjb25zdCBnPVFlLmxlbmd0aDtmb3IobGV0IHQ9MDt0PGc7dCsrKXtyLnN0ZW5jaWxNYXNrKDE8PGgtMSk7Y29uc3Qgbj1RZVt0XTtNdC5oYXModCkmJihtPU10LmdldCh0KSk7Y29uc3QgaT16dCghIW0pO20mJmp0KGksbSksWXQoaSxkLHAsbikscCs9biwrK2gsaD43JiYoSHQoKSxoPWUuY2xpcExldmVsKzEpfURlLnNldChlLmNsaXBMZXZlbCxoKSwkdChkKSxKZSgpLFB0KCkscygpfSkoKX1nZXQgY3VycmVudEF0dGFjaG1lbnRPYmplY3QoKXtyZXR1cm4gdGV9Z2V0IGF0bGFzQXR0YWNobWVudE9iamVjdCgpe3JldHVybiBGZSgpfWNyZWF0ZU5vZGUoZSx0KXtyZXR1cm4gZXIoZSx0KX1yZW1vdmVOb2RlKGUpeyhlPT57Y29uc3QgdD1UZVtlLmluZGV4XTt0JiZ0LmRpc3Bvc2UoZS54LGUueSxlLncsZS5oKX0pKGUpfWJlZ2luTm9kZVJlbmRlcmluZyhlKXt2YXIgdCxuLGksczt0aGlzLm5ld0RyYXdTdGF0ZT0hMCxTbihlKSx0PWUueCxuPWUueSxpPWUudyxzPWUuaCxhKCksci5zY2lzc29yKHQsbixpKzEscysxKSxyLmNsZWFyKHIuQ09MT1JfQlVGRkVSX0JJVHxyLlNURU5DSUxfQlVGRkVSX0JJVCksci5zY2lzc29yKHQsbixpLHMpfWVuZE5vZGVSZW5kZXJpbmcoKXtzKCl9ZHJhd0ZpbGwoKXsoKCk9Pntjb25zdCBlPVV0KCk7bCgpLHIuc3RlbmNpbE1hc2soMjU1KSxqbigpO2xldCB0PTAsbj1udWxsO2ZvcihsZXQgcj0wO3I8WmUubGVuZ3RoO3IrKylzd2l0Y2goTXQuaGFzKHIpJiYobj1NdC5nZXQocikpLFplW3JdKXtjYXNlImZpbGwiOntjb25zdCByPVFlLnNoaWZ0KCk7R24oZSx0LHIsbiksdCs9cn1icmVhaztjYXNlImxpbmVhciI6e2NvbnN0IHI9UWUuc2hpZnQoKTtEbihlLHQscixuKSx0Kz1yfWJyZWFrO2Nhc2UicmFkaWFsIjp7Y29uc3Qgcj1RZS5zaGlmdCgpO05uKGUsdCxyLG4pLHQrPXJ9YnJlYWs7Y2FzZSJiaXRtYXAiOntjb25zdCByPVFlLnNoaWZ0KCk7cW4oZSx0LHIsbiksdCs9cn19YygpLGpuKCksJHQoZSksSmUoKSxQdCgpfSkoKX1kcmF3RGlzcGxheU9iamVjdCh0LHIsaSxhLHMsbyl7U24odCksKCh0LHIsaSxhLHMsbyk9Pntjb25zdCBsPW9bMF0sYz1vWzFdLHU9b1syXSxmPW4uZ2xvYmFsQWxwaGEsZD1vWzRdLzI1NSxoPW9bNV0vMjU1LHA9b1s2XS8yNTUsbT1uLiRtYXRyaXg7c3dpdGNoKG4uZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uKXtjYXNlIm5vcm1hbCI6Y2FzZSJsYXllciI6Y2FzZSJhZGQiOmNhc2Uic2NyZWVuIjpjYXNlImFscGhhIjpjYXNlImVyYXNlIjpjYXNlImNvcHkiOntpZihEdCE9PW4uZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9ufHxDZSE9PXQuaW5kZXgpe1BlKENlKTtjb25zdCBlPW4uZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uO24uZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPUR0LG4ubmV3RHJhd1N0YXRlPSEwLG4uZHJhd0FycmF5c0luc3RhbmNlZCgpLG4ubmV3RHJhd1N0YXRlPSEwLG4uZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPWUsTnQobi5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24pLEVlKHQuaW5kZXgpLFBlKHQuaW5kZXgpfWNvbnN0IHI9c3IoKTtuci5wdXNoRGlzcGxheU9iamVjdEJ1ZmZlcigodC54Ky41KS9lLCh0LnkrLjUpL2UsKHQudy0xKS9lLCh0LmgtMSkvZSx0LncsdC5oLFAsUyxtWzZdLG1bN10sbVswXSxtWzFdLG1bM10sbVs0XSxsLGMsdSxmLGQsaCxwLDApLHIuY291bnQrK31icmVhaztkZWZhdWx0Ontjb25zdCBlPW4uY3VycmVudEF0dGFjaG1lbnRPYmplY3Q7bi5kcmF3QXJyYXlzSW5zdGFuY2VkKCk7Y29uc3Qgbz1NYXRoLmNlaWwoTWF0aC5hYnMoYS1yKSksZz1NYXRoLmNlaWwoTWF0aC5hYnMocy1pKSk7bGV0IGI9MCx4PTAsdj1jcih0KTtpZigxIT09bVswXXx8MCE9PW1bMV18fDAhPT1tWzNdfHwxIT09bVs0XSl7Y29uc3Qgcj15ZShvLGcsITEpLGk9XyhtWzBdLG1bMV0sbVszXSxtWzRdLG8vMixnLzIpLGE9XygxLDAsMCwxLC10LncvMiwtdC5oLzIpLHM9XyhpWzBdKmFbMF0raVsyXSphWzFdLGlbMV0qYVswXStpWzNdKmFbMV0saVswXSphWzJdK2lbMl0qYVszXSxpWzFdKmFbMl0raVszXSphWzNdLGlbMF0qYVs0XStpWzJdKmFbNV0raVs0XSxpWzFdKmFbNF0raVszXSphWzVdK2lbNV0pO24uc2F2ZSgpLG4uYmluZChyKSxuLnNldFRyYW5zZm9ybShzWzBdLHNbMV0sc1syXSxzWzNdLHNbNF0sc1s1XSksYj1zWzRdLHg9c1s1XTtjb25zdCBsPXlyKCk7X3IobCx2LndpZHRoLHYuaGVpZ2h0KSxrZSh2LCEwKSxocihsKSxLKHYpLHY9ci50ZXh0dXJlLGNlKHIsITEpLGUmJm4uYmluZChlKSxuLnJlc3RvcmUoKX0oYnx8eCkmJihtWzZdLT1iLG1bN10tPXgpO2NvbnN0IHk9Z3IobVs2XSxtWzddLG8sZyksdz15ZShvLGcsITEpO24uYmluZCh3KSx1cih5LHYpO2NvbnN0IE09b3Iobi5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24pO3ZyKE0sbCxjLHUsZixkLGgscCwwKSxocihNKSxlJiZuLmJpbmQoZSkseHIody50ZXh0dXJlKSwoYnx8eCkmJihtWzZdKz1iLG1bN10rPXgpLEsodiksSyh5KSxjZSh3KSxOdChuLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiksRWUodC5pbmRleCksUGUodC5pbmRleCl9fX0pKHQscixpLGEscyxvKX1kcmF3QXJyYXlzSW5zdGFuY2VkKCl7KCgpPT57Y29uc3QgZT1zcigpO2UuY291bnQmJihscigpLFNyKER0KSxNcihlKSxlLmNsZWFyKCkpfSkoKX1jbGVhckFycmF5c0luc3RhbmNlZCgpe3NyKCkuY2xlYXIoKX10cmFuc2Zlck1haW5DYW52YXMoKXsoKCk9Pntjb25zdCBlPW4uJG1haW5BdHRhY2htZW50T2JqZWN0O24uYmluZChlKSxyLmJpbmRGcmFtZWJ1ZmZlcihyLlJFQURfRlJBTUVCVUZGRVIsWiksci5iaW5kRnJhbWVidWZmZXIoci5EUkFXX0ZSQU1FQlVGRkVSLG51bGwpO2NvbnN0IHQ9ZS53aWR0aCxpPWUuaGVpZ2h0O3IuYmxpdEZyYW1lYnVmZmVyKDAsMCx0LGksMCwwLHQsaSxyLkNPTE9SX0JVRkZFUl9CSVQsci5ORUFSRVNUKSxyLmJpbmRGcmFtZWJ1ZmZlcihyLkRSQVdfRlJBTUVCVUZGRVIsSiksci5iaW5kRnJhbWVidWZmZXIoci5GUkFNRUJVRkZFUixaKX0pKCl9ZHJhd1BpeGVscyhlLHQpeygoZSx0KT0+e2NvbnN0IHI9VHIoZS53LGUuaCx0KSxuPWZyKCk7ZHIobixlLncsZS5oKSxYdCgpLGhyKG4pLEsocil9KShlLHQpfWRyYXdFbGVtZW50KGUsdCxyPSExKXtCcihlLHQpfWJlZ2luTWFzaygpeygoKT0+e2NvbnN0IGU9bi5jdXJyZW50QXR0YWNobWVudE9iamVjdDtlJiYoZS5tYXNrPSEwLGUuY2xpcExldmVsKyssRGUuc2V0KGUuY2xpcExldmVsLGUuY2xpcExldmVsKSx6ZSgpfHwoVmUoITApLGwoKSxyLmVuYWJsZShyLlNBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSksci5zdGVuY2lsRnVuYyhyLkFMV0FZUywwLDI1NSksci5zdGVuY2lsT3Aoci5aRVJPLHIuSU5WRVJULHIuSU5WRVJUKSxyLmNvbG9yTWFzayghMSwhMSwhMSwhMSkpKX0pKCl9c2V0TWFza0JvdW5kcyhlLHQsaSxzKXsoKGUsdCxpLHMpPT57Y29uc3Qgbz1uLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0O2lmKCFvKXJldHVybjtqZS5zZXQoby5jbGlwTGV2ZWwsZyhlLHQsaSxzKSk7Y29uc3QgbD1NYXRoLmNlaWwoTWF0aC5hYnMoaS1lKSksYz1NYXRoLmNlaWwoTWF0aC5hYnMocy10KSk7YSgpLHIuc2Npc3NvcihlLG8uaGVpZ2h0LXQtYyxsLGMpfSkoZSx0LGkscyl9ZW5kTWFzaygpe0xlKCl9bGVhdmVNYXNrKCl7dGhpcy5kcmF3QXJyYXlzSW5zdGFuY2VkKCksKCgpPT57Y29uc3QgZT1uLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0O2lmKCFlKXJldHVybjtjb25zdCB0PWUuY2xpcExldmVsLGk9amUuZ2V0KHQpLG89aVswXSxsPWlbMV0sdT1pWzJdLGY9aVszXTtqZS5kZWxldGUodCksRGUuZGVsZXRlKHQpLGIoaSk7Y29uc3QgZD1NYXRoLmNlaWwoTWF0aC5hYnModS1vKSksaD1NYXRoLmNlaWwoTWF0aC5hYnMoZi1sKSk7aWYoYSgpLHIuc2Npc3NvcihvLGUuaGVpZ2h0LWwtaCxkLGgpLC0tZS5jbGlwTGV2ZWwsIWUuY2xpcExldmVsKXJldHVybiBlLm1hc2s9ITEsVmUoITEpLHIuY2xlYXIoci5TVEVOQ0lMX0JVRkZFUl9CSVQpLGMoKSxzKCksRGUuY2xlYXIoKSx2b2lkIGplLmNsZWFyKCk7ci5zdGVuY2lsTWFzaygxPDxlLmNsaXBMZXZlbCksci5zdGVuY2lsRnVuYyhyLkFMV0FZUywwLDI1NSksci5zdGVuY2lsT3Aoci5SRVBMQUNFLHIuUkVQTEFDRSxyLlJFUExBQ0UpLHIuY29sb3JNYXNrKCExLCExLCExLCExKSxZdChLdCgpLEV0KCksMCw2KSxMZSgpfSkoKX11c2VHcmlkKGUpeyhlPT57TXQuc2V0KFFlLmxlbmd0aCxlKX0pKGUpfWFwcGx5RmlsdGVyKGUsdCxyLG4saSxhLHMsbyxsLGMsdSl7dGhpcy5kcmF3QXJyYXlzSW5zdGFuY2VkKCksd24oZSx0LHIsbixpLGEscyxvLGwsYyx1KX1jb250YWluZXJCZWdpbkxheWVyKGUsdCl7dGhpcy5kcmF3QXJyYXlzSW5zdGFuY2VkKCksKChlLHQpPT57bi5kcmF3QXJyYXlzSW5zdGFuY2VkKCk7Y29uc3Qgcj1uLiRtYWluQXR0YWNobWVudE9iamVjdDtNbi5wdXNoKHIpO2NvbnN0IGk9eWUoZSx0LCExKTtuLiRtYWluQXR0YWNobWVudE9iamVjdD1pLG4uYmluZChpKX0pKGUsdCl9Y29udGFpbmVyRW5kTGF5ZXIoZSx0LHIsaSxhLHMsbyxsKXsoKGUsdCxyLGksYSxzLG8sbCk9PntuLmRyYXdBcnJheXNJbnN0YW5jZWQoKTtjb25zdCBjPW4uJG1haW5BdHRhY2htZW50T2JqZWN0O2xldCB1PW51bGw7aWYoaSYmYSYmcyl7dT1ncigwLDAsYy53aWR0aCxjLmhlaWdodCksbi4kbWFpbkF0dGFjaG1lbnRPYmplY3Q9TW4ucG9wKCksY2UoYyksbi5iaW5kKG4uJG1haW5BdHRhY2htZW50T2JqZWN0KSxDci54PTAsQ3IueT0wO2ZvcihsZXQgZT0wO3MubGVuZ3RoPmU7KXN3aXRjaChzW2UrK10pe2Nhc2UgMDp1PWxuKHUsdCxzW2UrK10sc1tlKytdLHNbZSsrXSxzW2UrK10sc1tlKytdLHNbZSsrXSxzW2UrK10sc1tlKytdLHNbZSsrXSxzW2UrK10sc1tlKytdLEJvb2xlYW4oc1tlKytdKSk7YnJlYWs7Y2FzZSAxOnU9a3IodSx0LHNbZSsrXSxzW2UrK10sc1tlKytdKTticmVhaztjYXNlIDI6Zm9yKGxldCB0PTA7dDwyMDsrK3QpUG5bdF09c1tlKytdO3U9THIodSxQbik7YnJlYWs7Y2FzZSAzOntjb25zdCB0PXNbZSsrXSxyPXNbZSsrXSxuPXQqcixpPXMuc3ViYXJyYXkoZSxlK24pO2UrPW4sdT1wbih1LHQscixpLHNbZSsrXSxzW2UrK10sQm9vbGVhbihzW2UrK10pLEJvb2xlYW4oc1tlKytdKSxzW2UrK10sc1tlKytdKX1icmVhaztjYXNlIDQ6e2NvbnN0IHQ9c1tlKytdLHI9bmV3IFVpbnQ4QXJyYXkodCk7ci5zZXQocy5zdWJhcnJheShlLGUrdCkpLGUrPXQsdT1tbih1LHIsc1tlKytdLHNbZSsrXSxzW2UrK10sc1tlKytdLHNbZSsrXSxzW2UrK10sc1tlKytdLHNbZSsrXSxzW2UrK10sc1tlKytdLHNbZSsrXSl9YnJlYWs7Y2FzZSA1OnU9c24odSx0LHNbZSsrXSxzW2UrK10sc1tlKytdLHNbZSsrXSxzW2UrK10sc1tlKytdLHNbZSsrXSxzW2UrK10sQm9vbGVhbihzW2UrK10pLEJvb2xlYW4oc1tlKytdKSxCb29sZWFuKHNbZSsrXSkpO2JyZWFrO2Nhc2UgNjp1PW5uKHUsdCxzW2UrK10sc1tlKytdLHNbZSsrXSxzW2UrK10sc1tlKytdLHNbZSsrXSxCb29sZWFuKHNbZSsrXSksQm9vbGVhbihzW2UrK10pKTticmVhaztjYXNlIDc6e2NvbnN0IHI9c1tlKytdLG49c1tlKytdO2xldCBpPXNbZSsrXTtjb25zdCBhPXMuc3ViYXJyYXkoZSxlK2kpO2UrPWksaT1zW2UrK107Y29uc3Qgbz1zLnN1YmFycmF5KGUsZStpKTtlKz1pLGk9c1tlKytdO2NvbnN0IGw9cy5zdWJhcnJheShlLGUraSk7ZSs9aSx1PXVuKHUsdCxyLG4sYSxvLGwsc1tlKytdLHNbZSsrXSxzW2UrK10sc1tlKytdLHNbZSsrXSxCb29sZWFuKHNbZSsrXSkpfWJyZWFrO2Nhc2UgODp7Y29uc3Qgcj1zW2UrK10sbj1zW2UrK107bGV0IGk9c1tlKytdO2NvbnN0IGE9cy5zdWJhcnJheShlLGUraSk7ZSs9aSxpPXNbZSsrXTtjb25zdCBvPXMuc3ViYXJyYXkoZSxlK2kpO2UrPWksaT1zW2UrK107Y29uc3QgbD1zLnN1YmFycmF5KGUsZStpKTtlKz1pLHU9ZG4odSx0LHIsbixhLG8sbCxzW2UrK10sc1tlKytdLHNbZSsrXSxzW2UrK10sc1tlKytdLEJvb2xlYW4oc1tlKytdKSl9fWlmKG8mJih5bi5zZXQobywiZktleSIsbCkseW4uc2V0KG8sImZUZXh0dXJlIix1KSksdSl7Y29uc3QgaT1NYXRoLnNxcnQodFswXSp0WzBdK3RbMV0qdFsxXSkscz1NYXRoLnNxcnQodFsyXSp0WzJdK3RbM10qdFszXSksbz1GLGw9YVswXSooaS9vKSxjPWFbMV0qKHMvbyk7bi5yZXNldCgpLG4uZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPWUsZ24odSxyLGwrdFs0XSxjK3RbNV0pfX1lbHNlIHU9Z3IoMCwwLGMud2lkdGgsYy5oZWlnaHQpLG4uJG1haW5BdHRhY2htZW50T2JqZWN0PU1uLnBvcCgpLGNlKGMpLG4uYmluZChuLiRtYWluQXR0YWNobWVudE9iamVjdCksdSYmKG4ucmVzZXQoKSxuLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj1lLGduKHUscix0WzRdLHRbNV0pLEsodSkpO24uYmluZChuLiRtYWluQXR0YWNobWVudE9iamVjdCl9KShlLHQscixpLGEscyxvLGwpfWNvbnRhaW5lckRyYXdDYWNoZWRGaWx0ZXIoZSx0LHIsaSxhLHMpeygoZSx0LHIsaSxhLHMpPT57aWYoeW4uZ2V0KGEsImZLZXkiKSE9PXMpcmV0dXJuO2NvbnN0IG89eW4uZ2V0KGEsImZUZXh0dXJlIik7aWYoIW8pcmV0dXJuO2NvbnN0IGw9TWF0aC5zcXJ0KHRbMF0qdFswXSt0WzFdKnRbMV0pLGM9TWF0aC5zcXJ0KHRbMl0qdFsyXSt0WzNdKnRbM10pLHU9RixmPWlbMF0qKGwvdSksZD1pWzFdKihjL3UpO24uZHJhd0FycmF5c0luc3RhbmNlZCgpLG4ucmVzZXQoKSxuLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj1lLGduKG8scixmK3RbNF0sZCt0WzVdKX0pKGUsdCxyLGksYSxzKX1hc3luYyBjcmVhdGVJbWFnZUJpdG1hcChlLHQpe3JldHVybiBhd2FpdChhc3luYyhlLHQpPT57Y29uc3QgaT1tcigwLDAsZSx0KTtrZShpKSxyLmJpbmRGcmFtZWJ1ZmZlcihyLkZSQU1FQlVGRkVSLG9lKSxyLmZyYW1lYnVmZmVyVGV4dHVyZTJEKHIuRlJBTUVCVUZGRVIsci5DT0xPUl9BVFRBQ0hNRU5UMCxyLlRFWFRVUkVfMkQsaS5yZXNvdXJjZSwwKTtjb25zdCBhPW5ldyBVaW50OEFycmF5KGUqdCo0KSxzPW4uJG1haW5BdHRhY2htZW50T2JqZWN0O2EuYnl0ZUxlbmd0aD5YbiYmKFhuPXAoYS5ieXRlTGVuZ3RoKSxyLmJ1ZmZlckRhdGEoci5QSVhFTF9QQUNLX0JVRkZFUixYbixyLlNUUkVBTV9SRUFEKSksci5yZWFkUGl4ZWxzKDAscy5oZWlnaHQtdCxlLHQsci5SR0JBLHIuVU5TSUdORURfQllURSwwKTtjb25zdCBvPXIuZmVuY2VTeW5jKHIuU1lOQ19HUFVfQ09NTUFORFNfQ09NUExFVEUsMCk7YXdhaXQgbmV3IFByb21pc2UoZT0+e2NvbnN0IHQ9KCk9PntpZihyLmNsaWVudFdhaXRTeW5jKG8sci5TWU5DX0ZMVVNIX0NPTU1BTkRTX0JJVCwwKSE9PXIuVElNRU9VVF9FWFBJUkVEKXJldHVybiByLmRlbGV0ZVN5bmMobyksci5nZXRCdWZmZXJTdWJEYXRhKHIuUElYRUxfUEFDS19CVUZGRVIsMCxhKSxlKCk7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHQpfTt0KCl9KSxyLmJpbmRGcmFtZWJ1ZmZlcihyLkZSQU1FQlVGRkVSLFopO2ZvcihsZXQgZT0wO2U8YS5sZW5ndGg7ZSs9NCl7Y29uc3QgdD1hW2UrM107aWYoMD09PXR8fDI1NT09PXQpY29udGludWU7Y29uc3Qgcj1Zblt0XTthW2VdPU1hdGgubWluKDI1NSxNYXRoLnJvdW5kKGFbZV0qcikpLGFbZSsxXT1NYXRoLm1pbigyNTUsTWF0aC5yb3VuZChhW2UrMV0qcikpLGFbZSsyXT1NYXRoLm1pbigyNTUsTWF0aC5yb3VuZChhW2UrMl0qcikpfXJldHVybiBhd2FpdCBjcmVhdGVJbWFnZUJpdG1hcChuZXcgSW1hZ2VEYXRhKG5ldyBVaW50OENsYW1wZWRBcnJheShhKSxlLHQpLHtpbWFnZU9yaWVudGF0aW9uOiJmbGlwWSIscHJlbXVsdGlwbHlBbHBoYToibm9uZSIsY29sb3JTcGFjZUNvbnZlcnNpb246Im5vbmUifSl9KShlLHQpfX07Y2xhc3MgSG57c3RhdGljIHNldERldmljZShlKXtIbi5kZXZpY2U9ZX1zdGF0aWMgZ2V0RGV2aWNlKCl7aWYoIUhuLmRldmljZSl0aHJvdyBuZXcgRXJyb3IoIkdQVURldmljZSBpcyBub3QgaW5pdGlhbGl6ZWQiKTtyZXR1cm4gSG4uZGV2aWNlfXN0YXRpYyBzZXREZXZpY2VQaXhlbFJhdGlvKGUpe0huLmRldmljZVBpeGVsUmF0aW89ZX1zdGF0aWMgZ2V0RGV2aWNlUGl4ZWxSYXRpbygpe3JldHVybiBIbi5kZXZpY2VQaXhlbFJhdGlvfXN0YXRpYyBzZXRSZW5kZXJNYXhTaXplKGUpe0huLnJlbmRlck1heFNpemU9ZX1zdGF0aWMgZ2V0UmVuZGVyTWF4U2l6ZSgpe3JldHVybiBIbi5yZW5kZXJNYXhTaXplfXN0YXRpYyBjcmVhdGVGbG9hdDMyQXJyYXkoZSl7cmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoZSl9c3RhdGljIGNyZWF0ZUFycmF5KCl7cmV0dXJuW119c3RhdGljIGdldEZsb2F0MzJBcnJheTQoKXtyZXR1cm4gSG4uZmxvYXQzMkFycmF5NFBvb2wubGVuZ3RoPjA/SG4uZmxvYXQzMkFycmF5NFBvb2wucG9wKCk6bmV3IEZsb2F0MzJBcnJheSg0KX1zdGF0aWMgcG9vbEZsb2F0MzJBcnJheTQoZSl7ND09PWUubGVuZ3RoJiZIbi5mbG9hdDMyQXJyYXk0UG9vbC5wdXNoKGUpfX1PYmplY3QuZGVmaW5lUHJvcGVydHkoSG4sImRldmljZSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOm51bGx9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoSG4sImRldmljZVBpeGVsUmF0aW8iLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZToxfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEhuLCJyZW5kZXJNYXhTaXplIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ODE5Mn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShIbiwiZmxvYXQzMkFycmF5NFBvb2wiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpbXX0pO2xldCBRbj1udWxsO2NvbnN0IFpuPShlLHQscixuLGk9LjI1KT0+e2NvbnN0IGE9W10scz0oZSx0LHIsbixvKT0+e2NvbnN0IGw9KChlLHQscixuKT0+e2NvbnN0IGk9bi54LWUueCxhPW4ueS1lLnkscz1pKmkrYSphO2lmKHM8MWUtMTApe2NvbnN0IG49KHQueC1lLngpKih0LngtZS54KSsodC55LWUueSkqKHQueS1lLnkpLGk9KHIueC1lLngpKihyLngtZS54KSsoci55LWUueSkqKHIueS1lLnkpO3JldHVybiBNYXRoLm1heChuLGkpfWNvbnN0IG89KHQueC1lLngpKmEtKHQueS1lLnkpKmksbD1vKm8vcyxjPShyLngtZS54KSphLShyLnktZS55KSppLHU9YypjL3M7cmV0dXJuIE1hdGgubWF4KGwsdSl9KShlLHQscixuKTtpZihsPD1pfHxvPj04KXtjb25zdCBlPXt4Oi41Kih0Lngrci54KSx5Oi41Kih0Lnkrci55KX07cmV0dXJuIHZvaWQgYS5wdXNoKHtjdHJsOmUsZW5kOm59KX1jb25zdCBjPSgoZSx0LHIsbik9Pntjb25zdCBpPXt4Oi41KihlLngrdC54KSx5Oi41KihlLnkrdC55KX0sYT0uNSoodC54K3IueCkscz0uNSoodC55K3IueSksbz17eDouNSooci54K24ueCkseTouNSooci55K24ueSl9LGw9e3g6LjUqKGkueCthKSx5Oi41KihpLnkrcyl9LGM9e3g6LjUqKGErby54KSx5Oi41KihzK28ueSl9LHU9e3g6LjUqKGwueCtjLngpLHk6LjUqKGwueStjLnkpfTtyZXR1cm57Zmlyc3Q6W2UsaSxsLHVdLHNlY29uZDpbdSxjLG8sbl19fSkoZSx0LHIsbik7cyhjLmZpcnN0WzBdLGMuZmlyc3RbMV0sYy5maXJzdFsyXSxjLmZpcnN0WzNdLG8rMSkscyhjLnNlY29uZFswXSxjLnNlY29uZFsxXSxjLnNlY29uZFsyXSxjLnNlY29uZFszXSxvKzEpfTtyZXR1cm4gcyhlLHQscixuLDApLGF9O2NsYXNzIEpue2NvbnN0cnVjdG9yKCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRjdXJyZW50UGF0aCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkdmVydGljZXMiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJGN1cnJlbnRYIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRjdXJyZW50WSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkc3RhcnRYIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRzdGFydFkiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJGZsYXRuZXNzVGhyZXNob2xkIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6LjI1fSksdGhpcy4kY3VycmVudFBhdGg9W10sdGhpcy4kdmVydGljZXM9W10sdGhpcy4kY3VycmVudFg9MCx0aGlzLiRjdXJyZW50WT0wLHRoaXMuJHN0YXJ0WD0wLHRoaXMuJHN0YXJ0WT0wfWJlZ2luUGF0aCgpe3RoaXMuJGN1cnJlbnRQYXRoPVtdLHRoaXMuJHZlcnRpY2VzPVtdLHRoaXMuJGN1cnJlbnRYPTAsdGhpcy4kY3VycmVudFk9MCx0aGlzLiRzdGFydFg9MCx0aGlzLiRzdGFydFk9MH1tb3ZlVG8oZSx0KXt0aGlzLiRjdXJyZW50UGF0aC5sZW5ndGg+PTYmJnRoaXMuJHZlcnRpY2VzLnB1c2godGhpcy4kY3VycmVudFBhdGgpLHRoaXMuJGN1cnJlbnRQYXRoPVtlLHQsITFdLHRoaXMuJGN1cnJlbnRYPWUsdGhpcy4kY3VycmVudFk9dCx0aGlzLiRzdGFydFg9ZSx0aGlzLiRzdGFydFk9dH1saW5lVG8oZSx0KXtlPT09dGhpcy4kY3VycmVudFgmJnQ9PT10aGlzLiRjdXJyZW50WXx8KHRoaXMuJGN1cnJlbnRQYXRoLnB1c2goZSx0LCExKSx0aGlzLiRjdXJyZW50WD1lLHRoaXMuJGN1cnJlbnRZPXQpfXF1YWRyYXRpY0N1cnZlVG8oZSx0LHIsbil7dGhpcy4kY3VycmVudFBhdGgucHVzaChlLHQsITApLHRoaXMuJGN1cnJlbnRQYXRoLnB1c2gocixuLCExKSx0aGlzLiRjdXJyZW50WD1yLHRoaXMuJGN1cnJlbnRZPW59c2V0U2NhbGUoZSl7dGhpcy4kZmxhdG5lc3NUaHJlc2hvbGQ9KGU9Pntjb25zdCB0PS4yNS8oZSplKTtyZXR1cm4gTWF0aC5tYXgoLjA2MjUsTWF0aC5taW4oNCx0KSl9KShlKX1iZXppZXJDdXJ2ZVRvKGUsdCxyLG4saSxhKXtjb25zdCBzPXt4OnRoaXMuJGN1cnJlbnRYLHk6dGhpcy4kY3VycmVudFl9LG89Wm4ocyx7eDplLHk6dH0se3g6cix5Om59LHt4OmkseTphfSx0aGlzLiRmbGF0bmVzc1RocmVzaG9sZCk7Zm9yKGNvbnN0IGUgb2Ygbyl0aGlzLiRjdXJyZW50UGF0aC5wdXNoKGUuY3RybC54LGUuY3RybC55LCEwKSx0aGlzLiRjdXJyZW50UGF0aC5wdXNoKGUuZW5kLngsZS5lbmQueSwhMSk7dGhpcy4kY3VycmVudFg9aSx0aGlzLiRjdXJyZW50WT1hfWFyYyhlLHQscil7Y29uc3Qgbj1yLGk9LjU1MjI4NDc0OTgzMDc5MzYqcjt0aGlzLmJlemllckN1cnZlVG8oZStuLHQraSxlK2ksdCtuLGUsdCtuKSx0aGlzLmJlemllckN1cnZlVG8oZS1pLHQrbixlLW4sdCtpLGUtbix0KSx0aGlzLmJlemllckN1cnZlVG8oZS1uLHQtaSxlLWksdC1uLGUsdC1uKSx0aGlzLmJlemllckN1cnZlVG8oZStpLHQtbixlK24sdC1pLGUrbix0KTtjb25zdCBhPXRoaXMuJGN1cnJlbnRQYXRoLmxlbmd0aDthPj0zJiYodGhpcy4kY3VycmVudFBhdGhbYS0zXT10aGlzLiRzdGFydFgsdGhpcy4kY3VycmVudFBhdGhbYS0yXT10aGlzLiRzdGFydFkpLHRoaXMuJGN1cnJlbnRYPXRoaXMuJHN0YXJ0WCx0aGlzLiRjdXJyZW50WT10aGlzLiRzdGFydFl9Y2xvc2VQYXRoKCl7dGhpcy4kY3VycmVudFBhdGgubGVuZ3RoPj0zJiYodGhpcy4kY3VycmVudFg9PT10aGlzLiRzdGFydFgmJnRoaXMuJGN1cnJlbnRZPT09dGhpcy4kc3RhcnRZfHx0aGlzLiRjdXJyZW50UGF0aC5wdXNoKHRoaXMuJHN0YXJ0WCx0aGlzLiRzdGFydFksITEpKX1nZXQgJGdldFZlcnRpY2VzKCl7Y29uc3QgZT1bLi4udGhpcy4kdmVydGljZXNdO3JldHVybiB0aGlzLiRjdXJyZW50UGF0aC5sZW5ndGg+PTkmJmUucHVzaCh0aGlzLiRjdXJyZW50UGF0aCksZX1nZW5lcmF0ZVZlcnRpY2VzKCl7Y29uc3QgZT10aGlzLiRnZXRWZXJ0aWNlcyx0PVtdO2Zvcihjb25zdCByIG9mIGUpe2lmKHIubGVuZ3RoPDkpY29udGludWU7Y29uc3QgZT1bXTtmb3IobGV0IHQ9MDt0PHIubGVuZ3RoO3QrPTMpZS5wdXNoKHt4OnJbdF0seTpyW3QrMV19KTtmb3IobGV0IHI9MTtyPGUubGVuZ3RoLTE7cisrKXQucHVzaChlWzBdLngsZVswXS55LGVbcl0ueCxlW3JdLnksZVtyKzFdLngsZVtyKzFdLnkpfXJldHVybiBuZXcgRmxvYXQzMkFycmF5KHQpfWdldEN1cnJlbnRQYXRoKCl7Y29uc3QgZT1bXTtmb3IobGV0IHQ9MDt0PHRoaXMuJGN1cnJlbnRQYXRoLmxlbmd0aDt0Kz0zKWUucHVzaCh7eDp0aGlzLiRjdXJyZW50UGF0aFt0XSx5OnRoaXMuJGN1cnJlbnRQYXRoW3QrMV19KTtyZXR1cm4gZX1nZXRBbGxQYXRocygpe2NvbnN0IGU9W107Zm9yKGNvbnN0IHQgb2YgdGhpcy4kdmVydGljZXMpe2NvbnN0IHI9W107Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKz0zKXIucHVzaCh7eDp0W2VdLHk6dFtlKzFdfSk7ci5sZW5ndGg+MCYmZS5wdXNoKHIpfWlmKHRoaXMuJGN1cnJlbnRQYXRoLmxlbmd0aD49Myl7Y29uc3QgdD1bXTtmb3IobGV0IGU9MDtlPHRoaXMuJGN1cnJlbnRQYXRoLmxlbmd0aDtlKz0zKXQucHVzaCh7eDp0aGlzLiRjdXJyZW50UGF0aFtlXSx5OnRoaXMuJGN1cnJlbnRQYXRoW2UrMV19KTt0Lmxlbmd0aD4wJiZlLnB1c2godCl9cmV0dXJuIGV9Z2V0VmVydGljZXNGb3JTdHJva2UoKXtjb25zdCBlPVsuLi50aGlzLiR2ZXJ0aWNlc107cmV0dXJuIHRoaXMuJGN1cnJlbnRQYXRoLmxlbmd0aD49NiYmZS5wdXNoKHRoaXMuJGN1cnJlbnRQYXRoKSxlfXJlc2V0KCl7dGhpcy4kY3VycmVudFBhdGg9W10sdGhpcy4kdmVydGljZXM9W10sdGhpcy4kY3VycmVudFg9MCx0aGlzLiRjdXJyZW50WT0wLHRoaXMuJHN0YXJ0WD0wLHRoaXMuJHN0YXJ0WT0wfX1jb25zdCBlaT0oZSx0KT0+e2NvbnN0IHI9dC5zaXplO2xldCBuPWUuZ2V0KHIpO258fChuPVtdLGUuc2V0KHIsbikpLG4ubGVuZ3RoPj0zMj90LmRlc3Ryb3koKTpuLnB1c2godCl9LHRpPShlLHQpPT57Y29uc3Qgcj10LnNpemU7bGV0IG49ZS5nZXQocik7bnx8KG49W10sZS5zZXQocixuKSksbi5sZW5ndGg+PTMyP3QuZGVzdHJveSgpOm4ucHVzaCh0KX0scmk9KGUsdCxyLG4pPT57Y29uc3QgaT0yNTYqTWF0aC5jZWlsKHIvMjU2KTtsZXQgYT1udWxsLHM9MS8wO2Zvcihjb25zdCBlIG9mIHQpaWYoIWUuaW5Vc2UmJmUuc2l6ZT49aSl7Y29uc3QgdD1lLnNpemUtaTt0PHMmJihhPWUscz10KX1pZihhKXJldHVybiBhLmluVXNlPSEwLGEubGFzdFVzZWRGcmFtZT1uLGEuYnVmZmVyO2NvbnN0IG89TWF0aC5tYXgoaSwxNjM4NCksbD0oKGUsdCk9PmUuY3JlYXRlQnVmZmVyKHtzaXplOnQuc2l6ZSx1c2FnZTp0LnVzYWdlfEdQVUJ1ZmZlclVzYWdlLlNUT1JBR0V8R1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1R8R1BVQnVmZmVyVXNhZ2UuVkVSVEVYLGxhYmVsOnQubGFiZWx8fCJzdG9yYWdlX2J1ZmZlciJ9KSkoZSx7c2l6ZTpvLHVzYWdlOkdQVUJ1ZmZlclVzYWdlLlNUT1JBR0V8R1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1R8R1BVQnVmZmVyVXNhZ2UuVkVSVEVYLGxhYmVsOmBzdG9yYWdlX2J1ZmZlcl8ke3QubGVuZ3RofWB9KTtyZXR1cm4gdC5wdXNoKHtidWZmZXI6bCxzaXplOm8saW5Vc2U6ITAsbGFzdFVzZWRGcmFtZTpufSksbH0sbmk9KGUsdCxyLG49MCxpPTApPT57Y29uc3QgYT1uZXcgVWludDMyQXJyYXkoW3QscixuLGldKSxzPWUuY3JlYXRlQnVmZmVyKHtzaXplOmEuYnl0ZUxlbmd0aCx1c2FnZTpHUFVCdWZmZXJVc2FnZS5JTkRJUkVDVHxHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVCxtYXBwZWRBdENyZWF0aW9uOiEwLGxhYmVsOiJpbmRpcmVjdF9idWZmZXIifSk7cmV0dXJuIG5ldyBVaW50MzJBcnJheShzLmdldE1hcHBlZFJhbmdlKCkpLnNldChhKSxzLnVubWFwKCksc30saWk9KGUsdCxyLG4saT0wLGE9MCk9Pntjb25zdCBzPW5ldyBVaW50MzJBcnJheShbcixuLGksYV0pO2UucXVldWUud3JpdGVCdWZmZXIodCwwLHMpfTtjbGFzcyBhaXtjb25zdHJ1Y3RvcihlLHQ9NjU1MzYpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJkZXZpY2UiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiYnVmZmVyIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bnVsbH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJvZmZzZXQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTowfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImNhcGFjaXR5Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImFsaWdubWVudCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOjI1Nn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJwZW5kaW5nRGVzdHJveUJ1ZmZlcnMiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpbXX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJzdGFnaW5nQnVmZmVyIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInN0YWdpbmdGbG9hdDMyIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImRpcnR5RW5kIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6MH0pLHRoaXMuZGV2aWNlPWUsdGhpcy5jYXBhY2l0eT10LHRoaXMuc3RhZ2luZ0J1ZmZlcj1uZXcgQXJyYXlCdWZmZXIodCksdGhpcy5zdGFnaW5nRmxvYXQzMj1uZXcgRmxvYXQzMkFycmF5KHRoaXMuc3RhZ2luZ0J1ZmZlcil9cmVzZXRGcmFtZSgpe3RoaXMub2Zmc2V0PTAsdGhpcy5kaXJ0eUVuZD0wO2Zvcihjb25zdCBlIG9mIHRoaXMucGVuZGluZ0Rlc3Ryb3lCdWZmZXJzKWUuZGVzdHJveSgpO3RoaXMucGVuZGluZ0Rlc3Ryb3lCdWZmZXJzLmxlbmd0aD0wfWdldEJ1ZmZlcigpe3JldHVybiB0aGlzLmJ1ZmZlcnx8KHRoaXMuYnVmZmVyPXRoaXMuZGV2aWNlLmNyZWF0ZUJ1ZmZlcih7c2l6ZTp0aGlzLmNhcGFjaXR5LHVzYWdlOkdQVUJ1ZmZlclVzYWdlLlVOSUZPUk18R1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1R9KSksdGhpcy5idWZmZXJ9YWxsb2NhdGUoZSl7dGhpcy5idWZmZXJ8fHRoaXMuZ2V0QnVmZmVyKCk7Y29uc3QgdD10aGlzLm9mZnNldCxyPWUuYnl0ZUxlbmd0aDtpZih0K3I+dGhpcy5jYXBhY2l0eSl7dGhpcy5mbHVzaCgpLHRoaXMuY2FwYWNpdHkqPTI7Y29uc3QgZT10aGlzLmJ1ZmZlcjt0aGlzLmJ1ZmZlcj10aGlzLmRldmljZS5jcmVhdGVCdWZmZXIoe3NpemU6dGhpcy5jYXBhY2l0eSx1c2FnZTpHUFVCdWZmZXJVc2FnZS5VTklGT1JNfEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNUfSksZSYmdGhpcy5wZW5kaW5nRGVzdHJveUJ1ZmZlcnMucHVzaChlKSx0aGlzLnN0YWdpbmdCdWZmZXI9bmV3IEFycmF5QnVmZmVyKHRoaXMuY2FwYWNpdHkpLHRoaXMuc3RhZ2luZ0Zsb2F0MzI9bmV3IEZsb2F0MzJBcnJheSh0aGlzLnN0YWdpbmdCdWZmZXIpfXRoaXMuc3RhZ2luZ0Zsb2F0MzIuc2V0KGUsdC80KTtjb25zdCBuPXQrcjtyZXR1cm4gbj50aGlzLmRpcnR5RW5kJiYodGhpcy5kaXJ0eUVuZD1uKSx0aGlzLm9mZnNldD10K01hdGguY2VpbChyL3RoaXMuYWxpZ25tZW50KSp0aGlzLmFsaWdubWVudCx0fWZsdXNoKCl7dGhpcy5kaXJ0eUVuZD4wJiZ0aGlzLmJ1ZmZlciYmKHRoaXMuZGV2aWNlLnF1ZXVlLndyaXRlQnVmZmVyKHRoaXMuYnVmZmVyLDAsdGhpcy5zdGFnaW5nQnVmZmVyLDAsdGhpcy5kaXJ0eUVuZCksdGhpcy5kaXJ0eUVuZD0wKX1kaXNwb3NlKCl7dGhpcy5idWZmZXImJih0aGlzLmJ1ZmZlci5kZXN0cm95KCksdGhpcy5idWZmZXI9bnVsbCk7Zm9yKGNvbnN0IGUgb2YgdGhpcy5wZW5kaW5nRGVzdHJveUJ1ZmZlcnMpZS5kZXN0cm95KCk7dGhpcy5wZW5kaW5nRGVzdHJveUJ1ZmZlcnMubGVuZ3RoPTB9fWNsYXNzIHNpe2NvbnN0cnVjdG9yKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJkZXZpY2UiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywidmVydGV4QnVmZmVycyIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJ1bmlmb3JtQnVmZmVycyIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJ2ZXJ0ZXhCdWZmZXJCdWNrZXRzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInVuaWZvcm1CdWZmZXJCdWNrZXRzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInN0b3JhZ2VCdWZmZXJQb29sIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImluZGlyZWN0QnVmZmVyIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImluZGlyZWN0QnVmZmVyUG9vbCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJmcmFtZUluZGlyZWN0QnVmZmVycyIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJmcmFtZU51bWJlciIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJ1bml0UmVjdEJ1ZmZlciIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJmcmFtZVZlcnRleFBvb2xCdWZmZXJzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImZyYW1lVW5pZm9ybVBvb2xCdWZmZXJzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImR5bmFtaWNVbmlmb3JtIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksdGhpcy5kZXZpY2U9ZSx0aGlzLnZlcnRleEJ1ZmZlcnM9bmV3IE1hcCx0aGlzLnVuaWZvcm1CdWZmZXJzPW5ldyBNYXAsdGhpcy52ZXJ0ZXhCdWZmZXJCdWNrZXRzPW5ldyBNYXAsdGhpcy51bmlmb3JtQnVmZmVyQnVja2V0cz1uZXcgTWFwLHRoaXMuc3RvcmFnZUJ1ZmZlclBvb2w9W10sdGhpcy5pbmRpcmVjdEJ1ZmZlcj1udWxsLHRoaXMuaW5kaXJlY3RCdWZmZXJQb29sPVtdLHRoaXMuZnJhbWVJbmRpcmVjdEJ1ZmZlcnM9W10sdGhpcy5mcmFtZU51bWJlcj0wLHRoaXMudW5pdFJlY3RCdWZmZXI9bnVsbCx0aGlzLmZyYW1lVmVydGV4UG9vbEJ1ZmZlcnM9W10sdGhpcy5mcmFtZVVuaWZvcm1Qb29sQnVmZmVycz1bXSx0aGlzLmR5bmFtaWNVbmlmb3JtPW5ldyBhaShlKX1jcmVhdGVWZXJ0ZXhCdWZmZXIoZSx0KXtjb25zdCByPXRoaXMuZGV2aWNlLmNyZWF0ZUJ1ZmZlcih7c2l6ZTp0LmJ5dGVMZW5ndGgsdXNhZ2U6R1BVQnVmZmVyVXNhZ2UuVkVSVEVYfEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNULG1hcHBlZEF0Q3JlYXRpb246ITB9KTtyZXR1cm4gbmV3IEZsb2F0MzJBcnJheShyLmdldE1hcHBlZFJhbmdlKCkpLnNldCh0KSxyLnVubWFwKCksdGhpcy52ZXJ0ZXhCdWZmZXJzLnNldChlLHIpLHJ9Y3JlYXRlVW5pZm9ybUJ1ZmZlcihlLHQpe2NvbnN0IHI9dGhpcy5kZXZpY2UuY3JlYXRlQnVmZmVyKHtzaXplOnQsdXNhZ2U6R1BVQnVmZmVyVXNhZ2UuVU5JRk9STXxHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVH0pO3JldHVybiB0aGlzLnVuaWZvcm1CdWZmZXJzLnNldChlLHIpLHJ9dXBkYXRlVW5pZm9ybUJ1ZmZlcihlLHQpe2NvbnN0IHI9dGhpcy51bmlmb3JtQnVmZmVycy5nZXQoZSk7ciYmdGhpcy5kZXZpY2UucXVldWUud3JpdGVCdWZmZXIociwwLHQuYnVmZmVyLHQuYnl0ZU9mZnNldCx0LmJ5dGVMZW5ndGgpfWdldFZlcnRleEJ1ZmZlcihlKXtyZXR1cm4gdGhpcy52ZXJ0ZXhCdWZmZXJzLmdldChlKX1nZXRVbmlmb3JtQnVmZmVyKGUpe3JldHVybiB0aGlzLnVuaWZvcm1CdWZmZXJzLmdldChlKX1jcmVhdGVSZWN0VmVydGljZXMoZSx0LHIsbil7cmV0dXJuKChlLHQscixuKT0+bmV3IEZsb2F0MzJBcnJheShbZSx0LDAsMCxlK3IsdCwxLDAsZSx0K24sMCwxLGUrcix0LDEsMCxlK3IsdCtuLDEsMSxlLHQrbiwwLDFdKSkoZSx0LHIsbil9YWNxdWlyZVZlcnRleEJ1ZmZlcihlLHQpe2NvbnN0IHI9KChlLHQscixuKT0+e2NvbnN0IGk9KGE9cixhLS0sYXw9YT4+MSxhfD1hPj4yLGF8PWE+PjQsYXw9YT4+OCwxKyhhfD1hPj4xNikpO3ZhciBhO2NvbnN0IHM9dC5nZXQoaSk7bGV0IG87cmV0dXJuIHMmJnMubGVuZ3RoPjA/KG89cy5wb3AoKSxuJiZlLnF1ZXVlLndyaXRlQnVmZmVyKG8sMCxuLmJ1ZmZlcixuLmJ5dGVPZmZzZXQsbi5ieXRlTGVuZ3RoKSk6bj8obz1lLmNyZWF0ZUJ1ZmZlcih7c2l6ZTppLHVzYWdlOkdQVUJ1ZmZlclVzYWdlLlZFUlRFWHxHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVCxtYXBwZWRBdENyZWF0aW9uOiEwfSksbmV3IEZsb2F0MzJBcnJheShvLmdldE1hcHBlZFJhbmdlKCkpLnNldChuKSxvLnVubWFwKCkpOm89ZS5jcmVhdGVCdWZmZXIoe3NpemU6aSx1c2FnZTpHUFVCdWZmZXJVc2FnZS5WRVJURVh8R1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1R9KSxvfSkodGhpcy5kZXZpY2UsdGhpcy52ZXJ0ZXhCdWZmZXJCdWNrZXRzLGUsdCk7cmV0dXJuIHRoaXMuZnJhbWVWZXJ0ZXhQb29sQnVmZmVycy5wdXNoKHIpLHJ9cmVsZWFzZVZlcnRleEJ1ZmZlcihlKXtlaSh0aGlzLnZlcnRleEJ1ZmZlckJ1Y2tldHMsZSl9YWNxdWlyZVVuaWZvcm1CdWZmZXIoZSl7Y29uc3QgdD0oKGUsdCxyKT0+e2NvbnN0IG49MTYqTWF0aC5jZWlsKHIvMTYpLGk9dC5nZXQobik7cmV0dXJuIGkmJmkubGVuZ3RoPjA/aS5wb3AoKTplLmNyZWF0ZUJ1ZmZlcih7c2l6ZTpuLHVzYWdlOkdQVUJ1ZmZlclVzYWdlLlVOSUZPUk18R1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1R9KX0pKHRoaXMuZGV2aWNlLHRoaXMudW5pZm9ybUJ1ZmZlckJ1Y2tldHMsZSk7cmV0dXJuIHRoaXMuZnJhbWVVbmlmb3JtUG9vbEJ1ZmZlcnMucHVzaCh0KSx0fWFjcXVpcmVBbmRXcml0ZVVuaWZvcm1CdWZmZXIoZSx0KXtjb25zdCByPXQ/P2UuYnl0ZUxlbmd0aCxuPXRoaXMuYWNxdWlyZVVuaWZvcm1CdWZmZXIocik7cmV0dXJuIHRoaXMuZGV2aWNlLnF1ZXVlLndyaXRlQnVmZmVyKG4sMCxlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsciksbn1yZWxlYXNlVW5pZm9ybUJ1ZmZlcihlKXt0aSh0aGlzLnVuaWZvcm1CdWZmZXJCdWNrZXRzLGUpfWRlc3Ryb3lCdWZmZXIoZSl7Y29uc3QgdD10aGlzLnZlcnRleEJ1ZmZlcnMuZ2V0KGUpO3QmJih0LmRlc3Ryb3koKSx0aGlzLnZlcnRleEJ1ZmZlcnMuZGVsZXRlKGUpKTtjb25zdCByPXRoaXMudW5pZm9ybUJ1ZmZlcnMuZ2V0KGUpO3ImJihyLmRlc3Ryb3koKSx0aGlzLnVuaWZvcm1CdWZmZXJzLmRlbGV0ZShlKSl9ZGlzcG9zZSgpe2Zvcihjb25zdCBlIG9mIHRoaXMudmVydGV4QnVmZmVycy52YWx1ZXMoKSllLmRlc3Ryb3koKTt0aGlzLnZlcnRleEJ1ZmZlcnMuY2xlYXIoKTtmb3IoY29uc3QgZSBvZiB0aGlzLnVuaWZvcm1CdWZmZXJzLnZhbHVlcygpKWUuZGVzdHJveSgpO3RoaXMudW5pZm9ybUJ1ZmZlcnMuY2xlYXIoKTtmb3IoY29uc3QgZSBvZiB0aGlzLnZlcnRleEJ1ZmZlckJ1Y2tldHMudmFsdWVzKCkpZm9yKGNvbnN0IHQgb2YgZSl0LmRlc3Ryb3koKTt0aGlzLnZlcnRleEJ1ZmZlckJ1Y2tldHMuY2xlYXIoKTtmb3IoY29uc3QgZSBvZiB0aGlzLnVuaWZvcm1CdWZmZXJCdWNrZXRzLnZhbHVlcygpKWZvcihjb25zdCB0IG9mIGUpdC5kZXN0cm95KCk7dGhpcy51bmlmb3JtQnVmZmVyQnVja2V0cy5jbGVhcigpO2Zvcihjb25zdCBlIG9mIHRoaXMuc3RvcmFnZUJ1ZmZlclBvb2wpZS5idWZmZXIuZGVzdHJveSgpO3RoaXMuc3RvcmFnZUJ1ZmZlclBvb2w9W10sdGhpcy5pbmRpcmVjdEJ1ZmZlciYmKHRoaXMuaW5kaXJlY3RCdWZmZXIuZGVzdHJveSgpLHRoaXMuaW5kaXJlY3RCdWZmZXI9bnVsbCk7Zm9yKGNvbnN0IGUgb2YgdGhpcy5pbmRpcmVjdEJ1ZmZlclBvb2wpZS5kZXN0cm95KCk7dGhpcy5pbmRpcmVjdEJ1ZmZlclBvb2w9W107Zm9yKGNvbnN0IGUgb2YgdGhpcy5mcmFtZUluZGlyZWN0QnVmZmVycyllLmRlc3Ryb3koKTt0aGlzLmZyYW1lSW5kaXJlY3RCdWZmZXJzPVtdLHRoaXMudW5pdFJlY3RCdWZmZXImJih0aGlzLnVuaXRSZWN0QnVmZmVyLmRlc3Ryb3koKSx0aGlzLnVuaXRSZWN0QnVmZmVyPW51bGwpLHRoaXMuZnJhbWVWZXJ0ZXhQb29sQnVmZmVycy5sZW5ndGg9MCx0aGlzLmZyYW1lVW5pZm9ybVBvb2xCdWZmZXJzLmxlbmd0aD0wLHRoaXMuZHluYW1pY1VuaWZvcm0uZGlzcG9zZSgpfWdldFBvb2xTdGF0cygpe2xldCBlPTA7Zm9yKGNvbnN0IHQgb2YgdGhpcy52ZXJ0ZXhCdWZmZXJCdWNrZXRzLnZhbHVlcygpKWUrPXQubGVuZ3RoO2xldCB0PTA7Zm9yKGNvbnN0IGUgb2YgdGhpcy51bmlmb3JtQnVmZmVyQnVja2V0cy52YWx1ZXMoKSl0Kz1lLmxlbmd0aDtyZXR1cm57dmVydGV4UG9vbFNpemU6ZSx1bmlmb3JtUG9vbFNpemU6dH19Y2xlYXJGcmFtZUJ1ZmZlcnMoKXtmb3IoY29uc3QgZSBvZiB0aGlzLnZlcnRleEJ1ZmZlcnMudmFsdWVzKCkpZS5kZXN0cm95KCk7dGhpcy52ZXJ0ZXhCdWZmZXJzLmNsZWFyKCk7Zm9yKGNvbnN0IGUgb2YgdGhpcy51bmlmb3JtQnVmZmVycy52YWx1ZXMoKSllLmRlc3Ryb3koKTt0aGlzLnVuaWZvcm1CdWZmZXJzLmNsZWFyKCk7Zm9yKGNvbnN0IGUgb2YgdGhpcy5mcmFtZVZlcnRleFBvb2xCdWZmZXJzKWVpKHRoaXMudmVydGV4QnVmZmVyQnVja2V0cyxlKTt0aGlzLmZyYW1lVmVydGV4UG9vbEJ1ZmZlcnMubGVuZ3RoPTA7Zm9yKGNvbnN0IGUgb2YgdGhpcy5mcmFtZVVuaWZvcm1Qb29sQnVmZmVycyl0aSh0aGlzLnVuaWZvcm1CdWZmZXJCdWNrZXRzLGUpO3RoaXMuZnJhbWVVbmlmb3JtUG9vbEJ1ZmZlcnMubGVuZ3RoPTA7Zm9yKGNvbnN0IGUgb2YgdGhpcy5mcmFtZUluZGlyZWN0QnVmZmVycyl0aGlzLmluZGlyZWN0QnVmZmVyUG9vbC5wdXNoKGUpO3RoaXMuZnJhbWVJbmRpcmVjdEJ1ZmZlcnMubGVuZ3RoPTAsdGhpcy5yZWxlYXNlQWxsU3RvcmFnZUJ1ZmZlcnMoKSx0aGlzLmR5bmFtaWNVbmlmb3JtLnJlc2V0RnJhbWUoKSx0aGlzLmZyYW1lTnVtYmVyKyssdGhpcy5mcmFtZU51bWJlciU2MD09MCYmKChlLHQscj02MCk9Pntmb3IobGV0IG49ZS5sZW5ndGgtMTtuPj0wO24tLSl7Y29uc3QgaT1lW25dOyFpLmluVXNlJiZ0LWkubGFzdFVzZWRGcmFtZT5yJiYoaS5idWZmZXIuZGVzdHJveSgpLGUuc3BsaWNlKG4sMSkpfX0pKHRoaXMuc3RvcmFnZUJ1ZmZlclBvb2wsdGhpcy5mcmFtZU51bWJlcil9cmVsZWFzZUFsbFN0b3JhZ2VCdWZmZXJzKCl7Zm9yKGNvbnN0IGUgb2YgdGhpcy5zdG9yYWdlQnVmZmVyUG9vbCllLmluVXNlPSExfWFjcXVpcmVTdG9yYWdlQnVmZmVyKGUpe3JldHVybiByaSh0aGlzLmRldmljZSx0aGlzLnN0b3JhZ2VCdWZmZXJQb29sLGUsdGhpcy5mcmFtZU51bWJlcil9cmVsZWFzZVN0b3JhZ2VCdWZmZXIoZSl7KChlLHQpPT57Zm9yKGNvbnN0IHIgb2YgZSlpZihyLmJ1ZmZlcj09PXQpcmV0dXJuIHZvaWQoci5pblVzZT0hMSl9KSh0aGlzLnN0b3JhZ2VCdWZmZXJQb29sLGUpfXdyaXRlU3RvcmFnZUJ1ZmZlcihlLHQpe3RoaXMuZGV2aWNlLnF1ZXVlLndyaXRlQnVmZmVyKGUsMCx0LmJ1ZmZlcix0LmJ5dGVPZmZzZXQsdC5ieXRlTGVuZ3RoKX1nZXRPckNyZWF0ZUluZGlyZWN0QnVmZmVyKGUsdCxyPTAsbj0wKXtyZXR1cm4gdGhpcy5pbmRpcmVjdEJ1ZmZlcj9paSh0aGlzLmRldmljZSx0aGlzLmluZGlyZWN0QnVmZmVyLGUsdCxyLG4pOnRoaXMuaW5kaXJlY3RCdWZmZXI9bmkodGhpcy5kZXZpY2UsZSx0LHIsbiksdGhpcy5pbmRpcmVjdEJ1ZmZlcn1jcmVhdGVJbmRpcmVjdEJ1ZmZlcihlLHQscj0wLG49MCl7bGV0IGk9dGhpcy5pbmRpcmVjdEJ1ZmZlclBvb2wucG9wKCk7cmV0dXJuIGk/aWkodGhpcy5kZXZpY2UsaSxlLHQscixuKTppPW5pKHRoaXMuZGV2aWNlLGUsdCxyLG4pLHRoaXMuZnJhbWVJbmRpcmVjdEJ1ZmZlcnMucHVzaChpKSxpfWdldFVuaXRSZWN0QnVmZmVyKCl7aWYoIXRoaXMudW5pdFJlY3RCdWZmZXIpe2NvbnN0IGU9dGhpcy5jcmVhdGVSZWN0VmVydGljZXMoMCwwLDEsMSk7dGhpcy51bml0UmVjdEJ1ZmZlcj10aGlzLmRldmljZS5jcmVhdGVCdWZmZXIoe3NpemU6ZS5ieXRlTGVuZ3RoLHVzYWdlOkdQVUJ1ZmZlclVzYWdlLlZFUlRFWHxHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVCxtYXBwZWRBdENyZWF0aW9uOiEwfSksbmV3IEZsb2F0MzJBcnJheSh0aGlzLnVuaXRSZWN0QnVmZmVyLmdldE1hcHBlZFJhbmdlKCkpLnNldChlKSx0aGlzLnVuaXRSZWN0QnVmZmVyLnVubWFwKCl9cmV0dXJuIHRoaXMudW5pdFJlY3RCdWZmZXJ9Z2V0RnJhbWVOdW1iZXIoKXtyZXR1cm4gdGhpcy5mcmFtZU51bWJlcn1nZXRTdG9yYWdlUG9vbFN0YXRzKCl7Y29uc3QgZT10aGlzLnN0b3JhZ2VCdWZmZXJQb29sLmZpbHRlcihlPT5lLmluVXNlKS5sZW5ndGg7cmV0dXJue3N0b3JhZ2VQb29sU2l6ZTp0aGlzLnN0b3JhZ2VCdWZmZXJQb29sLmxlbmd0aCxzdG9yYWdlUG9vbEluVXNlOmV9fX1jbGFzcyBvaXtjb25zdHJ1Y3RvcihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiZGV2aWNlIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInRleHR1cmVzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInNhbXBsZXJzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksdGhpcy5kZXZpY2U9ZSx0aGlzLnRleHR1cmVzPW5ldyBNYXAsdGhpcy5zYW1wbGVycz1uZXcgTWFwLCgoZSx0KT0+e2NvbnN0IHI9ZS5jcmVhdGVTYW1wbGVyKHttYWdGaWx0ZXI6ImxpbmVhciIsbWluRmlsdGVyOiJsaW5lYXIiLG1pcG1hcEZpbHRlcjoibGluZWFyIixhZGRyZXNzTW9kZVU6ImNsYW1wLXRvLWVkZ2UiLGFkZHJlc3NNb2RlVjoiY2xhbXAtdG8tZWRnZSJ9KTt0LnNldCgibGluZWFyIixyKTtjb25zdCBuPWUuY3JlYXRlU2FtcGxlcih7bWFnRmlsdGVyOiJuZWFyZXN0IixtaW5GaWx0ZXI6Im5lYXJlc3QiLG1pcG1hcEZpbHRlcjoibmVhcmVzdCIsYWRkcmVzc01vZGVVOiJjbGFtcC10by1lZGdlIixhZGRyZXNzTW9kZVY6ImNsYW1wLXRvLWVkZ2UifSk7dC5zZXQoIm5lYXJlc3QiLG4pO2NvbnN0IGk9ZS5jcmVhdGVTYW1wbGVyKHttYWdGaWx0ZXI6Im5lYXJlc3QiLG1pbkZpbHRlcjoibGluZWFyIixtaXBtYXBGaWx0ZXI6Im5lYXJlc3QiLGFkZHJlc3NNb2RlVToiY2xhbXAtdG8tZWRnZSIsYWRkcmVzc01vZGVWOiJjbGFtcC10by1lZGdlIn0pO3Quc2V0KCJhdGxhc19pbnN0YW5jZWRfc2FtcGxlciIsaSk7Y29uc3QgYT1lLmNyZWF0ZVNhbXBsZXIoe21hZ0ZpbHRlcjoibGluZWFyIixtaW5GaWx0ZXI6ImxpbmVhciIsbWlwbWFwRmlsdGVyOiJsaW5lYXIiLGFkZHJlc3NNb2RlVToicmVwZWF0IixhZGRyZXNzTW9kZVY6InJlcGVhdCJ9KTt0LnNldCgicmVwZWF0IixhKX0pKGUsdGhpcy5zYW1wbGVycyl9Y3JlYXRlVGV4dHVyZShlLHQscixuPSJyZ2JhOHVub3JtIil7Y29uc3QgaT10aGlzLmRldmljZS5jcmVhdGVUZXh0dXJlKHtzaXplOnt3aWR0aDp0LGhlaWdodDpyfSxmb3JtYXQ6bix1c2FnZTpHUFVUZXh0dXJlVXNhZ2UuVEVYVFVSRV9CSU5ESU5HfEdQVVRleHR1cmVVc2FnZS5DT1BZX0RTVHxHUFVUZXh0dXJlVXNhZ2UuUkVOREVSX0FUVEFDSE1FTlR9KTtyZXR1cm4gdGhpcy50ZXh0dXJlcy5zZXQoZSxpKSxpfWNyZWF0ZVRleHR1cmVGcm9tUGl4ZWxzKGUsdCxyLG4pe3JldHVybigoZSx0LHIsbixpLGEpPT57Y29uc3Qgcz1lLmNyZWF0ZVRleHR1cmUoe3NpemU6e3dpZHRoOmksaGVpZ2h0OmF9LGZvcm1hdDoicmdiYTh1bm9ybSIsdXNhZ2U6R1BVVGV4dHVyZVVzYWdlLlRFWFRVUkVfQklORElOR3xHUFVUZXh0dXJlVXNhZ2UuQ09QWV9EU1R8R1BVVGV4dHVyZVVzYWdlLlJFTkRFUl9BVFRBQ0hNRU5UfSk7cmV0dXJuIGUucXVldWUud3JpdGVUZXh0dXJlKHt0ZXh0dXJlOnN9LG4uYnVmZmVyLHtieXRlc1BlclJvdzo0Kmksb2Zmc2V0Om4uYnl0ZU9mZnNldH0se3dpZHRoOmksaGVpZ2h0OmF9KSx0LnNldChyLHMpLHN9KSh0aGlzLmRldmljZSx0aGlzLnRleHR1cmVzLGUsdCxyLG4pfWNyZWF0ZVRleHR1cmVGcm9tSW1hZ2VCaXRtYXAoZSx0KXtyZXR1cm4oKGUsdCxyLG4pPT57Y29uc3QgaT1lLmNyZWF0ZVRleHR1cmUoe3NpemU6e3dpZHRoOm4ud2lkdGgsaGVpZ2h0Om4uaGVpZ2h0fSxmb3JtYXQ6InJnYmE4dW5vcm0iLHVzYWdlOkdQVVRleHR1cmVVc2FnZS5URVhUVVJFX0JJTkRJTkd8R1BVVGV4dHVyZVVzYWdlLkNPUFlfRFNUfEdQVVRleHR1cmVVc2FnZS5SRU5ERVJfQVRUQUNITUVOVH0pO3JldHVybiBlLnF1ZXVlLmNvcHlFeHRlcm5hbEltYWdlVG9UZXh0dXJlKHtzb3VyY2U6bixmbGlwWTohMH0se3RleHR1cmU6aSxwcmVtdWx0aXBsaWVkQWxwaGE6ITB9LHt3aWR0aDpuLndpZHRoLGhlaWdodDpuLmhlaWdodH0pLHQuc2V0KHIsaSksaX0pKHRoaXMuZGV2aWNlLHRoaXMudGV4dHVyZXMsZSx0KX11cGRhdGVUZXh0dXJlKGUsdCxyLG4pe2NvbnN0IGk9dGhpcy50ZXh0dXJlcy5nZXQoZSk7aSYmdGhpcy5kZXZpY2UucXVldWUud3JpdGVUZXh0dXJlKHt0ZXh0dXJlOml9LHQuYnVmZmVyLHtieXRlc1BlclJvdzo0KnIsb2Zmc2V0OnQuYnl0ZU9mZnNldH0se3dpZHRoOnIsaGVpZ2h0Om59KX1nZXRUZXh0dXJlKGUpe3JldHVybiB0aGlzLnRleHR1cmVzLmdldChlKX1nZXRTYW1wbGVyKGUpe3JldHVybiB0aGlzLnNhbXBsZXJzLmdldChlKX1jcmVhdGVTYW1wbGVyKGUsdD0hMCl7Y29uc3Qgcj10aGlzLnNhbXBsZXJzLmdldChlKTtpZihyKXJldHVybiByO2NvbnN0IG49dGhpcy5kZXZpY2UuY3JlYXRlU2FtcGxlcih7bWFnRmlsdGVyOnQ/ImxpbmVhciI6Im5lYXJlc3QiLG1pbkZpbHRlcjp0PyJsaW5lYXIiOiJuZWFyZXN0IixtaXBtYXBGaWx0ZXI6dD8ibGluZWFyIjoibmVhcmVzdCIsYWRkcmVzc01vZGVVOiJjbGFtcC10by1lZGdlIixhZGRyZXNzTW9kZVY6ImNsYW1wLXRvLWVkZ2UifSk7cmV0dXJuIHRoaXMuc2FtcGxlcnMuc2V0KGUsbiksbn1kZXN0cm95VGV4dHVyZShlKXtjb25zdCB0PXRoaXMudGV4dHVyZXMuZ2V0KGUpO3QmJih0LmRlc3Ryb3koKSx0aGlzLnRleHR1cmVzLmRlbGV0ZShlKSl9ZGlzcG9zZSgpe2Zvcihjb25zdCBlIG9mIHRoaXMudGV4dHVyZXMudmFsdWVzKCkpZS5kZXN0cm95KCk7dGhpcy50ZXh0dXJlcy5jbGVhcigpLHRoaXMuc2FtcGxlcnMuY2xlYXIoKX19Y29uc3QgbGk9e3I6MCxnOjAsYjowLGE6MH0sY2k9e3ZpZXc6bnVsbCxjbGVhclZhbHVlOmxpLGxvYWRPcDoiY2xlYXIiLHN0b3JlT3A6InN0b3JlIn0sdWk9e2NvbG9yQXR0YWNobWVudHM6W2NpXX0sZmk9e3ZpZXc6bnVsbCxjbGVhclZhbHVlOntyOjAsZzowLGI6MCxhOjB9LGxvYWRPcDoibG9hZCIsc3RvcmVPcDoic3RvcmUifSxkaT17dmlldzpudWxsLHN0ZW5jaWxDbGVhclZhbHVlOjAsc3RlbmNpbExvYWRPcDoiY2xlYXIiLHN0ZW5jaWxTdG9yZU9wOiJzdG9yZSJ9LGhpPXtjb2xvckF0dGFjaG1lbnRzOltmaV0sZGVwdGhTdGVuY2lsQXR0YWNobWVudDpkaX07Y2xhc3MgcGl7Y29uc3RydWN0b3IoZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImRldmljZSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJidWNrZXRzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImN1cnJlbnRGcmFtZSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJ0b3RhbENvdW50Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksdGhpcy5kZXZpY2U9ZSx0aGlzLmJ1Y2tldHM9bmV3IE1hcCx0aGlzLmN1cnJlbnRGcmFtZT0wLHRoaXMudG90YWxDb3VudD1bMF19YmVnaW5GcmFtZSgpe3RoaXMuY3VycmVudEZyYW1lKyssdGhpcy5jdXJyZW50RnJhbWUlNjA9PTAmJigoZSx0LHIsbik9Pntjb25zdCBpPXQtcjtmb3IoY29uc3RbdCxyXW9mIGUpe2ZvcihsZXQgZT1yLmxlbmd0aC0xO2U+PTA7ZS0tKXtjb25zdCB0PXJbZV07IXQuaW5Vc2UmJnQubGFzdFVzZWRGcmFtZTxpJiYodC50ZXh0dXJlLmRlc3Ryb3koKSxyLnNwbGljZShlLDEpLG5bMF0tLSl9MD09PXIubGVuZ3RoJiZlLmRlbGV0ZSh0KX19KSh0aGlzLmJ1Y2tldHMsdGhpcy5jdXJyZW50RnJhbWUsMTgwLHRoaXMudG90YWxDb3VudCl9YWNxdWlyZShlLHQscj0icmdiYTh1bm9ybSIsbj1HUFVUZXh0dXJlVXNhZ2UuVEVYVFVSRV9CSU5ESU5HfEdQVVRleHR1cmVVc2FnZS5DT1BZX0RTVHxHUFVUZXh0dXJlVXNhZ2UuUkVOREVSX0FUVEFDSE1FTlQpe3JldHVybigoZSx0LHIsbixpLGEscyxvLGwpPT57Y29uc3QgYz0oKGUsdCxyKT0+YCR7ZX1fJHt0fV8ke3J9YCkocixuLGkpLHU9dC5nZXQoYyk7aWYodSlmb3IobGV0IGU9MDtlPHUubGVuZ3RoO2UrKyl7Y29uc3QgdD11W2VdO2lmKCF0LmluVXNlKXJldHVybiB0LmluVXNlPSEwLHQubGFzdFVzZWRGcmFtZT1zLHQudGV4dHVyZX1pZihsWzBdPj1vKXtsZXQgZT0xLzAscj0iIixuPS0xO2Zvcihjb25zdFtpLGFdb2YgdClmb3IobGV0IHQ9MDt0PGEubGVuZ3RoO3QrKyl7Y29uc3Qgcz1hW3RdOyFzLmluVXNlJiZzLmxhc3RVc2VkRnJhbWU8ZSYmKGU9cy5sYXN0VXNlZEZyYW1lLHI9aSxuPXQpfWlmKG4+PTApe2NvbnN0IGU9dC5nZXQocik7ZVtuXS50ZXh0dXJlLmRlc3Ryb3koKSxlLnNwbGljZShuLDEpLDA9PT1lLmxlbmd0aCYmdC5kZWxldGUociksbFswXS0tfX1jb25zdCBmPWUuY3JlYXRlVGV4dHVyZSh7c2l6ZTp7d2lkdGg6cixoZWlnaHQ6bn0sZm9ybWF0OmksdXNhZ2U6YX0pLGQ9e3RleHR1cmU6Zix3aWR0aDpyLGhlaWdodDpuLGZvcm1hdDppLGxhc3RVc2VkRnJhbWU6cyxpblVzZTohMH07cmV0dXJuIHU/dS5wdXNoKGQpOnQuc2V0KGMsW2RdKSxsWzBdKyssZn0pKHRoaXMuZGV2aWNlLHRoaXMuYnVja2V0cyxlLHQscixuLHRoaXMuY3VycmVudEZyYW1lLDMyLHRoaXMudG90YWxDb3VudCl9cmVsZWFzZShlKXsoKGUsdCxyKT0+e2Zvcihjb25zdCBuIG9mIGUudmFsdWVzKCkpZm9yKGxldCBlPTA7ZTxuLmxlbmd0aDtlKyspaWYobltlXS50ZXh0dXJlPT09dClyZXR1cm4gbltlXS5pblVzZT0hMSx2b2lkKG5bZV0ubGFzdFVzZWRGcmFtZT1yKX0pKHRoaXMuYnVja2V0cyxlLHRoaXMuY3VycmVudEZyYW1lKX1nZXRTdGF0cygpe2xldCBlPTAsdD0wO2Zvcihjb25zdCByIG9mIHRoaXMuYnVja2V0cy52YWx1ZXMoKSlmb3IoY29uc3QgbiBvZiByKW4uaW5Vc2U/ZSsrOnQrKztyZXR1cm57dG90YWw6dGhpcy50b3RhbENvdW50WzBdLGluVXNlOmUsYXZhaWxhYmxlOnR9fWRpc3Bvc2UoKXtmb3IoY29uc3QgZSBvZiB0aGlzLmJ1Y2tldHMudmFsdWVzKCkpZm9yKGNvbnN0IHQgb2YgZSl0LnRleHR1cmUuZGVzdHJveSgpO3RoaXMuYnVja2V0cy5jbGVhcigpLHRoaXMudG90YWxDb3VudFswXT0wfX1jbGFzcyBtaXtjb25zdHJ1Y3RvcihlLHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJkZXZpY2UiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiZm9ybWF0Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImF0dGFjaG1lbnRzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImN1cnJlbnRBdHRhY2htZW50Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkQ291bnRlciIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJ0ZXh0dXJlUG9vbCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJwZW5kaW5nUmVsZWFzZXMiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpbXX0pLHRoaXMuZGV2aWNlPWUsdGhpcy5mb3JtYXQ9dCx0aGlzLmF0dGFjaG1lbnRzPW5ldyBNYXAsdGhpcy5jdXJyZW50QXR0YWNobWVudD1udWxsLHRoaXMuaWRDb3VudGVyPXtuZXh0SWQ6MSx0ZXh0dXJlSWQ6MSxzdGVuY2lsSWQ6MX0sdGhpcy50ZXh0dXJlUG9vbD1uZXcgcGkoZSl9YmVnaW5GcmFtZSgpe3RoaXMudGV4dHVyZVBvb2wuYmVnaW5GcmFtZSgpfWNyZWF0ZUF0dGFjaG1lbnQoZSx0LHIsbj0hMSxpPSExKXtyZXR1cm4oKGUsdCxyLG4saSxhLHMsbyxsKT0+e2NvbnN0IGM9ImF0bGFzIj09PW58fG4uc3RhcnRzV2l0aCgiYXRsYXNfIiksdT1jfHxuLnN0YXJ0c1dpdGgoInRlbXBfIik/InJnYmE4dW5vcm0iOnQsZj1zfHxjJiYhMCxkPWY/NDoxLGg9ZS5jcmVhdGVUZXh0dXJlKHtzaXplOnt3aWR0aDppLGhlaWdodDphfSxmb3JtYXQ6dSx1c2FnZTpHUFVUZXh0dXJlVXNhZ2UuUkVOREVSX0FUVEFDSE1FTlR8R1BVVGV4dHVyZVVzYWdlLlRFWFRVUkVfQklORElOR3xHUFVUZXh0dXJlVXNhZ2UuQ09QWV9TUkN8R1BVVGV4dHVyZVVzYWdlLkNPUFlfRFNUfSkscD1oLmNyZWF0ZVZpZXcoKSxtPXtpZDpsLnRleHR1cmVJZCsrLHJlc291cmNlOmgsdmlldzpwLHdpZHRoOmksaGVpZ2h0OmEsYXJlYTppKmEsc21vb3RoOiEwfTtsZXQgZz1udWxsO2lmKGYpe2NvbnN0IHQ9ZS5jcmVhdGVUZXh0dXJlKHtzaXplOnt3aWR0aDppLGhlaWdodDphfSxmb3JtYXQ6dSxzYW1wbGVDb3VudDpkLHVzYWdlOkdQVVRleHR1cmVVc2FnZS5SRU5ERVJfQVRUQUNITUVOVH0pLHI9dC5jcmVhdGVWaWV3KCk7Zz17aWQ6bC50ZXh0dXJlSWQrKyxyZXNvdXJjZTp0LHZpZXc6cix3aWR0aDppLGhlaWdodDphLGFyZWE6aSphLHNtb290aDohMH19bGV0IGI9bnVsbCx4PW51bGw7aWYoY3x8Im1haW4iPT09bnx8byl7Y29uc3QgdD1lLmNyZWF0ZVRleHR1cmUoe3NpemU6e3dpZHRoOmksaGVpZ2h0OmF9LGZvcm1hdDoic3RlbmNpbDgiLHVzYWdlOkdQVVRleHR1cmVVc2FnZS5SRU5ERVJfQVRUQUNITUVOVH0pLHI9dC5jcmVhdGVWaWV3KCk7aWYoYj17aWQ6bC5zdGVuY2lsSWQrKyxyZXNvdXJjZTp0LHZpZXc6cix3aWR0aDppLGhlaWdodDphLGFyZWE6aSphLGRpcnR5OiExfSxmKXtjb25zdCB0PWUuY3JlYXRlVGV4dHVyZSh7c2l6ZTp7d2lkdGg6aSxoZWlnaHQ6YX0sZm9ybWF0OiJzdGVuY2lsOCIsc2FtcGxlQ291bnQ6ZCx1c2FnZTpHUFVUZXh0dXJlVXNhZ2UuUkVOREVSX0FUVEFDSE1FTlR9KSxyPXQuY3JlYXRlVmlldygpO3g9e2lkOmwuc3RlbmNpbElkKysscmVzb3VyY2U6dCx2aWV3OnIsd2lkdGg6aSxoZWlnaHQ6YSxhcmVhOmkqYSxkaXJ0eTohMX19fWNvbnN0IHY9e2lkOmwubmV4dElkKyssd2lkdGg6aSxoZWlnaHQ6YSxjbGlwTGV2ZWw6MCxtc2FhOmYsbWFzazpvLGNvbG9yOm51bGwsdGV4dHVyZTptLHN0ZW5jaWw6Yixtc2FhVGV4dHVyZTpnLG1zYWFTdGVuY2lsOnh9O3JldHVybiByLnNldChuLHYpLHZ9KSh0aGlzLmRldmljZSx0aGlzLmZvcm1hdCx0aGlzLmF0dGFjaG1lbnRzLGUsdCxyLG4saSx0aGlzLmlkQ291bnRlcil9Z2V0QXR0YWNobWVudChlKXtyZXR1cm4gdGhpcy5hdHRhY2htZW50cy5nZXQoZSl9c2V0Q3VycmVudEF0dGFjaG1lbnQoZSl7dGhpcy5jdXJyZW50QXR0YWNobWVudD1lfWdldEN1cnJlbnRBdHRhY2htZW50KCl7cmV0dXJuIHRoaXMuY3VycmVudEF0dGFjaG1lbnR9Y3JlYXRlUmVuZGVyUGFzc0Rlc2NyaXB0b3IoZSx0PTAscj0wLG49MCxpPTAsYT0iY2xlYXIiLHM9bnVsbCl7cmV0dXJuKChlLHQ9MCxyPTAsbj0wLGk9MCxhPSJjbGVhciIscz1udWxsKT0+KGNpLnZpZXc9ZSxsaS5yPXQsbGkuZz1yLGxpLmI9bixsaS5hPWksY2kubG9hZE9wPWEsY2kucmVzb2x2ZVRhcmdldD1zPz92b2lkIDAsdWkpKShlLHQscixuLGksYSxzKX1jcmVhdGVTdGVuY2lsUmVuZGVyUGFzc0Rlc2NyaXB0b3IoZSx0LHI9ImxvYWQiLG49ImNsZWFyIixpPW51bGwpe3JldHVybigoZSx0LHI9ImxvYWQiLG49ImNsZWFyIixpPW51bGwpPT4oZmkudmlldz1lLGZpLmxvYWRPcD1yLGZpLnJlc29sdmVUYXJnZXQ9aT8/dm9pZCAwLGRpLnZpZXc9dCxkaS5zdGVuY2lsTG9hZE9wPW4saGkpKShlLHQscixuLGkpfWRlc3Ryb3lBdHRhY2htZW50KGUpe2NvbnN0IHQ9dGhpcy5hdHRhY2htZW50cy5nZXQoZSk7dCYmKHQudGV4dHVyZSYmdC50ZXh0dXJlLnJlc291cmNlLmRlc3Ryb3koKSx0LnN0ZW5jaWwmJnQuc3RlbmNpbC5yZXNvdXJjZS5kZXN0cm95KCksdGhpcy5hdHRhY2htZW50cy5kZWxldGUoZSkpfXJlc2l6ZUF0dGFjaG1lbnQoZSx0LHIpe3JldHVybiB0aGlzLmRlc3Ryb3lBdHRhY2htZW50KGUpLHRoaXMuY3JlYXRlQXR0YWNobWVudChlLHQscil9Y3JlYXRlVGVtcG9yYXJ5QXR0YWNobWVudChlLHQpe2NvbnN0IHI9YHRlbXBfJHt0aGlzLmlkQ291bnRlci5uZXh0SWR9YCxuPUdQVVRleHR1cmVVc2FnZS5SRU5ERVJfQVRUQUNITUVOVHxHUFVUZXh0dXJlVXNhZ2UuVEVYVFVSRV9CSU5ESU5HfEdQVVRleHR1cmVVc2FnZS5DT1BZX1NSQ3xHUFVUZXh0dXJlVXNhZ2UuQ09QWV9EU1R8R1BVVGV4dHVyZVVzYWdlLlNUT1JBR0VfQklORElORyxpPXRoaXMudGV4dHVyZVBvb2wuYWNxdWlyZShlLHQsInJnYmE4dW5vcm0iLG4pLGE9aS5jcmVhdGVWaWV3KCkscz17aWQ6dGhpcy5pZENvdW50ZXIudGV4dHVyZUlkKysscmVzb3VyY2U6aSx2aWV3OmEsd2lkdGg6ZSxoZWlnaHQ6dCxhcmVhOmUqdCxzbW9vdGg6ITB9LG89e2lkOnRoaXMuaWRDb3VudGVyLm5leHRJZCsrLHdpZHRoOmUsaGVpZ2h0OnQsY2xpcExldmVsOjAsbXNhYTohMSxtYXNrOiExLGNvbG9yOm51bGwsdGV4dHVyZTpzLHN0ZW5jaWw6bnVsbCxtc2FhVGV4dHVyZTpudWxsLG1zYWFTdGVuY2lsOm51bGx9O3JldHVybiB0aGlzLmF0dGFjaG1lbnRzLnNldChyLG8pLG99cmVsZWFzZVRlbXBvcmFyeUF0dGFjaG1lbnQoZSl7KChlLHQscik9Pntmb3IoY29uc3RbbixpXW9mIGUuZW50cmllcygpKWlmKGkuaWQ9PT1yLmlkKXtlLmRlbGV0ZShuKSx0LnB1c2goaSk7YnJlYWt9fSkodGhpcy5hdHRhY2htZW50cyx0aGlzLnBlbmRpbmdSZWxlYXNlcyxlKX1mbHVzaFBlbmRpbmdSZWxlYXNlcygpe2Zvcihjb25zdCBlIG9mIHRoaXMucGVuZGluZ1JlbGVhc2VzKWUudGV4dHVyZSYmdGhpcy50ZXh0dXJlUG9vbC5yZWxlYXNlKGUudGV4dHVyZS5yZXNvdXJjZSksZS5tc2FhVGV4dHVyZSYmZS5tc2FhVGV4dHVyZS5yZXNvdXJjZS5kZXN0cm95KCksZS5zdGVuY2lsJiZlLnN0ZW5jaWwucmVzb3VyY2UuZGVzdHJveSgpLGUubXNhYVN0ZW5jaWwmJmUubXNhYVN0ZW5jaWwucmVzb3VyY2UuZGVzdHJveSgpO3RoaXMucGVuZGluZ1JlbGVhc2VzPVtdfWRpc3Bvc2UoKXtmb3IoY29uc3QgZSBvZiB0aGlzLmF0dGFjaG1lbnRzLnZhbHVlcygpKWUudGV4dHVyZSYmZS50ZXh0dXJlLnJlc291cmNlLmRlc3Ryb3koKSxlLnN0ZW5jaWwmJmUuc3RlbmNpbC5yZXNvdXJjZS5kZXN0cm95KCk7dGhpcy5hdHRhY2htZW50cy5jbGVhcigpLHRoaXMuY3VycmVudEF0dGFjaG1lbnQ9bnVsbCx0aGlzLnRleHR1cmVQb29sLmRpc3Bvc2UoKX19Y29uc3QgZ2k9KGUsdCxyLG4saSk9Pntmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKyl7Y29uc3QgaT10W2VdO2lmKGkud2lkdGg+PXImJmkuaGVpZ2h0Pj1uKXJldHVybiB0LnNwbGljZShlLDEpLGkuZGlydHk9ITEsaX1yZXR1cm4oKGUsdCxyLG4pPT57Y29uc3QgaT1lLmNyZWF0ZVRleHR1cmUoe3NpemU6e3dpZHRoOnQsaGVpZ2h0OnJ9LGZvcm1hdDoiZGVwdGgyNHBsdXMtc3RlbmNpbDgiLHVzYWdlOkdQVVRleHR1cmVVc2FnZS5SRU5ERVJfQVRUQUNITUVOVH0pO3JldHVybntpZDpuLnN0ZW5jaWxJZCsrLHJlc291cmNlOmksdmlldzppLmNyZWF0ZVZpZXcoKSx3aWR0aDp0LGhlaWdodDpyLGFyZWE6dCpyLGRpcnR5OiExfX0pKGUscixuLGkpfSxiaT0oZSx0LHIsbixpKT0+e2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXtjb25zdCBhPXRbZV07aWYoYS53aWR0aD49ciYmYS5oZWlnaHQ+PW4pcmV0dXJuIHQuc3BsaWNlKGUsMSksYS5zdGVuY2lsPWksYS5kaXJ0eT0hMSxhfXJldHVybigoZSx0LHIsbik9Pntjb25zdCBpPWUuY3JlYXRlVGV4dHVyZSh7c2l6ZTp7d2lkdGg6dCxoZWlnaHQ6cn0sZm9ybWF0OiJyZ2JhOHVub3JtIix1c2FnZTpHUFVUZXh0dXJlVXNhZ2UuUkVOREVSX0FUVEFDSE1FTlR8R1BVVGV4dHVyZVVzYWdlLlRFWFRVUkVfQklORElOR3xHUFVUZXh0dXJlVXNhZ2UuQ09QWV9TUkN8R1BVVGV4dHVyZVVzYWdlLkNPUFlfRFNUfSk7cmV0dXJue3Jlc291cmNlOmksdmlldzppLmNyZWF0ZVZpZXcoKSxzdGVuY2lsOm4sd2lkdGg6dCxoZWlnaHQ6cixhcmVhOnQqcixkaXJ0eTohMX19KShlLHIsbixpKX0seGk9KGUsdCxyLG4saSxhKT0+e2NvbnN0IHM9YCR7cn14JHtufV9zbW9vdGhgO2lmKHQuaGFzKHMpKXtjb25zdCBlPXQuZ2V0KHMpO2lmKGUubGVuZ3RoPjApcmV0dXJuIGUucG9wKCl9cmV0dXJuKChlLHQscixuLGkpPT57Y29uc3QgYT1lLmNyZWF0ZVRleHR1cmUoe3NpemU6e3dpZHRoOnQsaGVpZ2h0OnJ9LGZvcm1hdDoicmdiYTh1bm9ybSIsdXNhZ2U6R1BVVGV4dHVyZVVzYWdlLlJFTkRFUl9BVFRBQ0hNRU5UfEdQVVRleHR1cmVVc2FnZS5URVhUVVJFX0JJTkRJTkd8R1BVVGV4dHVyZVVzYWdlLkNPUFlfU1JDfEdQVVRleHR1cmVVc2FnZS5DT1BZX0RTVH0pLHM9YS5jcmVhdGVWaWV3KCk7cmV0dXJue2lkOmkudGV4dHVyZUlkKysscmVzb3VyY2U6YSx2aWV3OnMsd2lkdGg6dCxoZWlnaHQ6cixhcmVhOnQqcixzbW9vdGg6bn19KShlLHIsbixpLGEpfSx2aT17cjowLGc6MCxiOjAsYTowfSx5aT17dmlldzpudWxsLGxvYWRPcDoiY2xlYXIiLHN0b3JlT3A6InN0b3JlIixjbGVhclZhbHVlOnZpfSxfaT17dmlldzpudWxsLGRlcHRoTG9hZE9wOiJjbGVhciIsZGVwdGhTdG9yZU9wOiJzdG9yZSIsZGVwdGhDbGVhclZhbHVlOjEsc3RlbmNpbExvYWRPcDoiY2xlYXIiLHN0ZW5jaWxTdG9yZU9wOiJzdG9yZSIsc3RlbmNpbENsZWFyVmFsdWU6MH0sd2k9e2NvbG9yQXR0YWNobWVudHM6W3lpXX07Y2xhc3MgTWl7Y29uc3RydWN0b3IoZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImRldmljZSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJhdHRhY2htZW50UG9vbCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJ0ZXh0dXJlUG9vbCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJjb2xvckJ1ZmZlclBvb2wiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywic3RlbmNpbEJ1ZmZlclBvb2wiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWRDb3VudGVyIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImN1cnJlbnRBdHRhY2htZW50Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksdGhpcy5kZXZpY2U9ZSx0aGlzLmF0dGFjaG1lbnRQb29sPVtdLHRoaXMudGV4dHVyZVBvb2w9bmV3IE1hcCx0aGlzLmNvbG9yQnVmZmVyUG9vbD1bXSx0aGlzLnN0ZW5jaWxCdWZmZXJQb29sPVtdLHRoaXMuaWRDb3VudGVyPXthdHRhY2htZW50SWQ6MCx0ZXh0dXJlSWQ6MCxzdGVuY2lsSWQ6MH0sdGhpcy5jdXJyZW50QXR0YWNobWVudD1udWxsfWdldEF0dGFjaG1lbnRPYmplY3QoZSx0LHI9ITEpe3JldHVybigoZSx0LHIsbixpLGEscyxvLGwpPT57Y29uc3QgYz10Lmxlbmd0aD4wP3QucG9wKCk6KGU9Pih7aWQ6ZS5hdHRhY2htZW50SWQrKyx3aWR0aDowLGhlaWdodDowLGNsaXBMZXZlbDowLG1zYWE6ITEsbWFzazohMSxjb2xvcjpudWxsLHRleHR1cmU6bnVsbCxzdGVuY2lsOm51bGwsbXNhYVRleHR1cmU6bnVsbCxtc2FhU3RlbmNpbDpudWxsfSkpKGwpO2Mud2lkdGg9YSxjLmhlaWdodD1zLGMubXNhYT1vLGMubWFzaz0hMSxjLmNsaXBMZXZlbD0wO2NvbnN0IHU9Z2koZSxpLGEscyxsKSxmPWJpKGUsbixhLHMsdSk7Yy5jb2xvcj1mLGMuc3RlbmNpbD11O2NvbnN0IGQ9eGkoZSxyLGEscywhMCxsKTtyZXR1cm4gYy50ZXh0dXJlPWQsY30pKHRoaXMuZGV2aWNlLHRoaXMuYXR0YWNobWVudFBvb2wsdGhpcy50ZXh0dXJlUG9vbCx0aGlzLmNvbG9yQnVmZmVyUG9vbCx0aGlzLnN0ZW5jaWxCdWZmZXJQb29sLGUsdCxyLHRoaXMuaWRDb3VudGVyKX1iaW5kQXR0YWNobWVudChlKXt0aGlzLmN1cnJlbnRBdHRhY2htZW50PWV9Z2V0Q3VycmVudEF0dGFjaG1lbnQoKXtyZXR1cm4gdGhpcy5jdXJyZW50QXR0YWNobWVudH1nZXQgY3VycmVudEF0dGFjaG1lbnRPYmplY3QoKXtyZXR1cm4gdGhpcy5jdXJyZW50QXR0YWNobWVudH11bmJpbmRBdHRhY2htZW50KCl7dGhpcy5jdXJyZW50QXR0YWNobWVudD1udWxsfXJlbGVhc2VBdHRhY2htZW50KGUpeygoZSx0LHIsbixpKT0+e2kudGV4dHVyZSYmKCgoZSx0KT0+e2NvbnN0IHI9YCR7dC53aWR0aH14JHt0LmhlaWdodH1fJHt0LnNtb290aD8ic21vb3RoIjoibmVhcmVzdCJ9YDtlLmhhcyhyKXx8ZS5zZXQocixbXSksZS5nZXQocikucHVzaCh0KX0pKHQsaS50ZXh0dXJlKSxpLnRleHR1cmU9bnVsbCksaS5jb2xvciYmKHIucHVzaChpLmNvbG9yKSxpLmNvbG9yPW51bGwpLGkuc3RlbmNpbCYmKG4ucHVzaChpLnN0ZW5jaWwpLGkuc3RlbmNpbD1udWxsKSxlLnB1c2goaSl9KSh0aGlzLmF0dGFjaG1lbnRQb29sLHRoaXMudGV4dHVyZVBvb2wsdGhpcy5jb2xvckJ1ZmZlclBvb2wsdGhpcy5zdGVuY2lsQnVmZmVyUG9vbCxlKX1jcmVhdGVSZW5kZXJQYXNzRGVzY3JpcHRvcihlLHQscixuLGksYT0iY2xlYXIiKXtyZXR1cm4oKGUsdCxyLG4saSxhPSJjbGVhciIpPT57Y29uc3Qgcz1lLmNvbG9yPy52aWV3Pz9lLnRleHR1cmU/LnZpZXc7aWYoIXMpdGhyb3cgbmV3IEVycm9yKCJObyBjb2xvciB2aWV3IGF2YWlsYWJsZSBmb3IgcmVuZGVyIHBhc3MiKTtyZXR1cm4geWkudmlldz1zLHlpLmxvYWRPcD1hLHZpLnI9dCx2aS5nPXIsdmkuYj1uLHZpLmE9aSxlLnN0ZW5jaWw/LnZpZXc/KF9pLnZpZXc9ZS5zdGVuY2lsLnZpZXcsd2kuZGVwdGhTdGVuY2lsQXR0YWNobWVudD1faSk6d2kuZGVwdGhTdGVuY2lsQXR0YWNobWVudD12b2lkIDAsd2l9KShlLHQscixuLGksYSl9ZGlzcG9zZSgpe2Zvcihjb25zdCBlIG9mIHRoaXMudGV4dHVyZVBvb2wudmFsdWVzKCkpZm9yKGNvbnN0IHQgb2YgZSl0LnJlc291cmNlLmRlc3Ryb3koKTt0aGlzLnRleHR1cmVQb29sLmNsZWFyKCk7Zm9yKGNvbnN0IGUgb2YgdGhpcy5jb2xvckJ1ZmZlclBvb2wpZS5yZXNvdXJjZS5kZXN0cm95KCk7dGhpcy5jb2xvckJ1ZmZlclBvb2w9W107Zm9yKGNvbnN0IGUgb2YgdGhpcy5zdGVuY2lsQnVmZmVyUG9vbCllLnJlc291cmNlLmRlc3Ryb3koKTt0aGlzLnN0ZW5jaWxCdWZmZXJQb29sPVtdO2Zvcihjb25zdCBlIG9mIHRoaXMuYXR0YWNobWVudFBvb2wpZS50ZXh0dXJlJiZlLnRleHR1cmUucmVzb3VyY2UuZGVzdHJveSgpLGUuY29sb3ImJmUuY29sb3IucmVzb3VyY2UuZGVzdHJveSgpLGUuc3RlbmNpbCYmZS5zdGVuY2lsLnJlc291cmNlLmRlc3Ryb3koKTt0aGlzLmF0dGFjaG1lbnRQb29sPVtdfX1jb25zdCBQaT0iXG5vdmVycmlkZSB5RmxpcFNpZ246IGYzMiA9IDEuMDtcblxuc3RydWN0IFZlcnRleElucHV0IHtcbiAgICBAbG9jYXRpb24oMCkgcG9zaXRpb246IHZlYzI8ZjMyPixcbiAgICBAbG9jYXRpb24oMSkgYmV6aWVyOiB2ZWMyPGYzMj4sXG59XG5cbnN0cnVjdCBWZXJ0ZXhPdXRwdXQge1xuICAgIEBidWlsdGluKHBvc2l0aW9uKSBwb3NpdGlvbjogdmVjNDxmMzI+LFxuICAgIEBsb2NhdGlvbigwKSBiZXppZXI6IHZlYzI8ZjMyPixcbiAgICBAbG9jYXRpb24oMSkgY29sb3I6IHZlYzQ8ZjMyPixcbn1cblxuc3RydWN0IEZpbGxVbmlmb3JtcyB7XG4gICAgY29sb3I6IHZlYzQ8ZjMyPixcbiAgICBtYXRyaXgwOiB2ZWM0PGYzMj4sXG4gICAgbWF0cml4MTogdmVjNDxmMzI+LFxuICAgIG1hdHJpeDI6IHZlYzQ8ZjMyPixcbn1cblxuQGdyb3VwKDApIEBiaW5kaW5nKDApIHZhcjx1bmlmb3JtPiB1bmlmb3JtczogRmlsbFVuaWZvcm1zO1xuXG5AdmVydGV4XG5mbiBtYWluKGlucHV0OiBWZXJ0ZXhJbnB1dCkgLT4gVmVydGV4T3V0cHV0IHtcbiAgICB2YXIgb3V0cHV0OiBWZXJ0ZXhPdXRwdXQ7XG4gICAgbGV0IG1hdHJpeCA9IG1hdDN4MzxmMzI+KHVuaWZvcm1zLm1hdHJpeDAueHl6LCB1bmlmb3Jtcy5tYXRyaXgxLnh5eiwgdW5pZm9ybXMubWF0cml4Mi54eXopO1xuICAgIGxldCB0cmFuc2Zvcm1lZCA9IG1hdHJpeCAqIHZlYzM8ZjMyPihpbnB1dC5wb3NpdGlvbiwgMS4wKTtcbiAgICBsZXQgbmRjID0gdHJhbnNmb3JtZWQueHkgKiAyLjAgLSAxLjA7XG4gICAgb3V0cHV0LnBvc2l0aW9uID0gdmVjNDxmMzI+KG5kYy54LCBuZGMueSAqIHlGbGlwU2lnbiwgMC4wLCAxLjApO1xuICAgIG91dHB1dC5iZXppZXIgPSBpbnB1dC5iZXppZXI7XG4gICAgb3V0cHV0LmNvbG9yID0gdW5pZm9ybXMuY29sb3I7XG4gICAgcmV0dXJuIG91dHB1dDtcbn1cbiIsU2k9Ilxub3ZlcnJpZGUgeUZsaXBTaWduOiBmMzIgPSAxLjA7XG5cbnN0cnVjdCBWZXJ0ZXhJbnB1dCB7XG4gICAgQGxvY2F0aW9uKDApIHBvc2l0aW9uOiB2ZWMyPGYzMj4sXG4gICAgQGxvY2F0aW9uKDEpIGJlemllcjogdmVjMjxmMzI+LFxufVxuXG5zdHJ1Y3QgVmVydGV4T3V0cHV0IHtcbiAgICBAYnVpbHRpbihwb3NpdGlvbikgcG9zaXRpb246IHZlYzQ8ZjMyPixcbiAgICBAbG9jYXRpb24oMCkgYmV6aWVyOiB2ZWMyPGYzMj4sXG59XG5cbnN0cnVjdCBGaWxsVW5pZm9ybXMge1xuICAgIGNvbG9yOiB2ZWM0PGYzMj4sXG4gICAgbWF0cml4MDogdmVjNDxmMzI+LFxuICAgIG1hdHJpeDE6IHZlYzQ8ZjMyPixcbiAgICBtYXRyaXgyOiB2ZWM0PGYzMj4sXG59XG5cbkBncm91cCgwKSBAYmluZGluZygwKSB2YXI8dW5pZm9ybT4gdW5pZm9ybXM6IEZpbGxVbmlmb3JtcztcblxuQHZlcnRleFxuZm4gbWFpbihpbnB1dDogVmVydGV4SW5wdXQpIC0+IFZlcnRleE91dHB1dCB7XG4gICAgdmFyIG91dHB1dDogVmVydGV4T3V0cHV0O1xuICAgIGxldCBtYXRyaXggPSBtYXQzeDM8ZjMyPih1bmlmb3Jtcy5tYXRyaXgwLnh5eiwgdW5pZm9ybXMubWF0cml4MS54eXosIHVuaWZvcm1zLm1hdHJpeDIueHl6KTtcbiAgICBsZXQgdHJhbnNmb3JtZWQgPSBtYXRyaXggKiB2ZWMzPGYzMj4oaW5wdXQucG9zaXRpb24sIDEuMCk7XG4gICAgbGV0IG5kYyA9IHRyYW5zZm9ybWVkLnh5ICogMi4wIC0gMS4wO1xuICAgIG91dHB1dC5wb3NpdGlvbiA9IHZlYzQ8ZjMyPihuZGMueCwgbmRjLnkgKiB5RmxpcFNpZ24sIDAuMCwgMS4wKTtcbiAgICBvdXRwdXQuYmV6aWVyID0gaW5wdXQuYmV6aWVyO1xuICAgIHJldHVybiBvdXRwdXQ7XG59XG4iLEZpPSJcbm92ZXJyaWRlIHlGbGlwU2lnbjogZjMyID0gMS4wO1xuXG5zdHJ1Y3QgVmVydGV4SW5wdXQge1xuICAgIEBsb2NhdGlvbigwKSBwb3NpdGlvbjogdmVjMjxmMzI+LFxuICAgIEBsb2NhdGlvbigxKSBiZXppZXI6IHZlYzI8ZjMyPixcbn1cblxuc3RydWN0IFZlcnRleE91dHB1dCB7XG4gICAgQGJ1aWx0aW4ocG9zaXRpb24pIHBvc2l0aW9uOiB2ZWM0PGYzMj4sXG4gICAgQGxvY2F0aW9uKDApIGNvbG9yOiB2ZWM0PGYzMj4sXG59XG5cbnN0cnVjdCBGaWxsVW5pZm9ybXMge1xuICAgIGNvbG9yOiB2ZWM0PGYzMj4sXG4gICAgbWF0cml4MDogdmVjNDxmMzI+LFxuICAgIG1hdHJpeDE6IHZlYzQ8ZjMyPixcbiAgICBtYXRyaXgyOiB2ZWM0PGYzMj4sXG59XG5cbkBncm91cCgwKSBAYmluZGluZygwKSB2YXI8dW5pZm9ybT4gdW5pZm9ybXM6IEZpbGxVbmlmb3JtcztcblxuQHZlcnRleFxuZm4gbWFpbihpbnB1dDogVmVydGV4SW5wdXQpIC0+IFZlcnRleE91dHB1dCB7XG4gICAgdmFyIG91dHB1dDogVmVydGV4T3V0cHV0O1xuICAgIGxldCBtYXRyaXggPSBtYXQzeDM8ZjMyPih1bmlmb3Jtcy5tYXRyaXgwLnh5eiwgdW5pZm9ybXMubWF0cml4MS54eXosIHVuaWZvcm1zLm1hdHJpeDIueHl6KTtcbiAgICBsZXQgdHJhbnNmb3JtZWQgPSBtYXRyaXggKiB2ZWMzPGYzMj4oaW5wdXQucG9zaXRpb24sIDEuMCk7XG4gICAgbGV0IG5kYyA9IHRyYW5zZm9ybWVkLnh5ICogMi4wIC0gMS4wO1xuICAgIG91dHB1dC5wb3NpdGlvbiA9IHZlYzQ8ZjMyPihuZGMueCwgbmRjLnkgKiB5RmxpcFNpZ24sIDAuMCwgMS4wKTtcbiAgICBvdXRwdXQuY29sb3IgPSB1bmlmb3Jtcy5jb2xvcjtcbiAgICByZXR1cm4gb3V0cHV0O1xufVxuIixUaT0iXG5vdmVycmlkZSB5RmxpcFNpZ246IGYzMiA9IDEuMDtcblxuc3RydWN0IFZlcnRleElucHV0IHtcbiAgICBAbG9jYXRpb24oMCkgcG9zaXRpb246IHZlYzI8ZjMyPixcbiAgICBAbG9jYXRpb24oMSkgdGV4Q29vcmQ6IHZlYzI8ZjMyPixcbn1cblxuc3RydWN0IFZlcnRleE91dHB1dCB7XG4gICAgQGJ1aWx0aW4ocG9zaXRpb24pIHBvc2l0aW9uOiB2ZWM0PGYzMj4sXG4gICAgQGxvY2F0aW9uKDApIHRleENvb3JkOiB2ZWMyPGYzMj4sXG4gICAgQGxvY2F0aW9uKDEpIGNvbG9yOiB2ZWM0PGYzMj4sXG59XG5cbnN0cnVjdCBVbmlmb3JtcyB7XG4gICAgbWF0cml4OiBtYXQzeDM8ZjMyPixcbiAgICBjb2xvcjogdmVjNDxmMzI+LFxuICAgIGFscGhhOiBmMzIsXG59XG5cbkBncm91cCgwKSBAYmluZGluZygwKSB2YXI8dW5pZm9ybT4gdW5pZm9ybXM6IFVuaWZvcm1zO1xuXG5AdmVydGV4XG5mbiBtYWluKGlucHV0OiBWZXJ0ZXhJbnB1dCkgLT4gVmVydGV4T3V0cHV0IHtcbiAgICB2YXIgb3V0cHV0OiBWZXJ0ZXhPdXRwdXQ7XG4gICAgbGV0IHBvcyA9IHVuaWZvcm1zLm1hdHJpeCAqIHZlYzM8ZjMyPihpbnB1dC5wb3NpdGlvbiwgMS4wKTtcbiAgICBsZXQgbmRjID0gcG9zLnh5ICogMi4wIC0gMS4wO1xuICAgIG91dHB1dC5wb3NpdGlvbiA9IHZlYzQ8ZjMyPihuZGMueCwgbmRjLnkgKiB5RmxpcFNpZ24sIDAuMCwgMS4wKTtcbiAgICBvdXRwdXQudGV4Q29vcmQgPSBpbnB1dC50ZXhDb29yZDtcbiAgICBsZXQgcHJlbXVsdGlwbGllZENvbG9yID0gdmVjNDxmMzI+KFxuICAgICAgICB1bmlmb3Jtcy5jb2xvci5yZ2IgKiB1bmlmb3Jtcy5jb2xvci5hICogdW5pZm9ybXMuYWxwaGEsXG4gICAgICAgIHVuaWZvcm1zLmNvbG9yLmEgKiB1bmlmb3Jtcy5hbHBoYVxuICAgICk7XG4gICAgb3V0cHV0LmNvbG9yID0gcHJlbXVsdGlwbGllZENvbG9yO1xuICAgIHJldHVybiBvdXRwdXQ7XG59XG4iLEJpPSJcbm92ZXJyaWRlIHlGbGlwU2lnbjogZjMyID0gMS4wO1xuXG5zdHJ1Y3QgVmVydGV4SW5wdXQge1xuICAgIEBsb2NhdGlvbigwKSBwb3NpdGlvbjogdmVjMjxmMzI+LFxuICAgIEBsb2NhdGlvbigxKSBiZXppZXI6IHZlYzI8ZjMyPixcbn1cblxuc3RydWN0IFZlcnRleE91dHB1dCB7XG4gICAgQGJ1aWx0aW4ocG9zaXRpb24pIHBvc2l0aW9uOiB2ZWM0PGYzMj4sXG4gICAgQGxvY2F0aW9uKDApIHZfdXY6IHZlYzI8ZjMyPixcbiAgICBAbG9jYXRpb24oMSkgYmV6aWVyOiB2ZWMyPGYzMj4sXG4gICAgQGxvY2F0aW9uKDIpIGNvbG9yOiB2ZWM0PGYzMj4sXG59XG5cbnN0cnVjdCBHcmFkaWVudFVuaWZvcm1zIHtcbiAgICBpbnZlcnNlTWF0cml4OiBtYXQzeDM8ZjMyPixcbiAgICBncmFkaWVudFR5cGU6IGYzMixcbiAgICBmb2NhbDogZjMyLFxuICAgIHNwcmVhZDogZjMyLFxuICAgIHJhZGl1czogZjMyLFxuICAgIGxpbmVhclBvaW50czogdmVjNDxmMzI+LFxuICAgIGNvbG9yOiB2ZWM0PGYzMj4sXG4gICAgY29udGV4dE1hdHJpeDA6IHZlYzQ8ZjMyPixcbiAgICBjb250ZXh0TWF0cml4MTogdmVjNDxmMzI+LFxuICAgIGNvbnRleHRNYXRyaXgyOiB2ZWM0PGYzMj4sXG59XG5cbkBncm91cCgwKSBAYmluZGluZygwKSB2YXI8dW5pZm9ybT4gZ3JhZGllbnQ6IEdyYWRpZW50VW5pZm9ybXM7XG5cbkB2ZXJ0ZXhcbmZuIG1haW4oaW5wdXQ6IFZlcnRleElucHV0KSAtPiBWZXJ0ZXhPdXRwdXQge1xuICAgIHZhciBvdXRwdXQ6IFZlcnRleE91dHB1dDtcbiAgICBsZXQgY29udGV4dE1hdHJpeCA9IG1hdDN4MzxmMzI+KGdyYWRpZW50LmNvbnRleHRNYXRyaXgwLnh5eiwgZ3JhZGllbnQuY29udGV4dE1hdHJpeDEueHl6LCBncmFkaWVudC5jb250ZXh0TWF0cml4Mi54eXopO1xuICAgIGxldCBwb3MgPSBjb250ZXh0TWF0cml4ICogdmVjMzxmMzI+KGlucHV0LnBvc2l0aW9uLCAxLjApO1xuICAgIGxldCBuZGMgPSB2ZWMyPGYzMj4ocG9zLnggKiAyLjAgLSAxLjAsIHBvcy55ICogMi4wIC0gMS4wKTtcbiAgICBvdXRwdXQucG9zaXRpb24gPSB2ZWM0PGYzMj4obmRjLngsIG5kYy55ICogeUZsaXBTaWduLCAwLjAsIDEuMCk7XG4gICAgbGV0IHV2UG9zID0gZ3JhZGllbnQuaW52ZXJzZU1hdHJpeCAqIHZlYzM8ZjMyPihpbnB1dC5wb3NpdGlvbiwgMS4wKTtcbiAgICBvdXRwdXQudl91diA9IHV2UG9zLnh5O1xuICAgIG91dHB1dC5iZXppZXIgPSBpbnB1dC5iZXppZXI7XG4gICAgb3V0cHV0LmNvbG9yID0gZ3JhZGllbnQuY29sb3I7XG4gICAgcmV0dXJuIG91dHB1dDtcbn1cbiIsT2k9Ilxub3ZlcnJpZGUgeUZsaXBTaWduOiBmMzIgPSAxLjA7XG5cbnN0cnVjdCBWZXJ0ZXhJbnB1dCB7XG4gICAgQGxvY2F0aW9uKDApIHBvc2l0aW9uOiB2ZWMyPGYzMj4sXG4gICAgQGxvY2F0aW9uKDEpIGJlemllcjogdmVjMjxmMzI+LFxufVxuXG5zdHJ1Y3QgVmVydGV4T3V0cHV0IHtcbiAgICBAYnVpbHRpbihwb3NpdGlvbikgcG9zaXRpb246IHZlYzQ8ZjMyPixcbiAgICBAbG9jYXRpb24oMCkgYmV6aWVyOiB2ZWMyPGYzMj4sXG4gICAgQGxvY2F0aW9uKDEpIGNvbG9yOiB2ZWM0PGYzMj4sXG4gICAgQGxvY2F0aW9uKDIpIHdvcmxkUG9zOiB2ZWMyPGYzMj4sXG59XG5cbnN0cnVjdCBCaXRtYXBVbmlmb3JtcyB7XG4gICAgYml0bWFwTWF0cml4OiBtYXQzeDM8ZjMyPixcbiAgICB3aWR0aDogZjMyLFxuICAgIGhlaWdodDogZjMyLFxuICAgIHJlcGVhdDogZjMyLFxuICAgIF9wYWQ6IGYzMixcbiAgICBjb2xvcjogdmVjNDxmMzI+LFxuICAgIGNvbnRleHRNYXRyaXgwOiB2ZWM0PGYzMj4sXG4gICAgY29udGV4dE1hdHJpeDE6IHZlYzQ8ZjMyPixcbiAgICBjb250ZXh0TWF0cml4MjogdmVjNDxmMzI+LFxufVxuXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyPHVuaWZvcm0+IGJpdG1hcDogQml0bWFwVW5pZm9ybXM7XG5cbkB2ZXJ0ZXhcbmZuIG1haW4oaW5wdXQ6IFZlcnRleElucHV0KSAtPiBWZXJ0ZXhPdXRwdXQge1xuICAgIHZhciBvdXRwdXQ6IFZlcnRleE91dHB1dDtcbiAgICBsZXQgbWF0cml4ID0gbWF0M3gzPGYzMj4oYml0bWFwLmNvbnRleHRNYXRyaXgwLnh5eiwgYml0bWFwLmNvbnRleHRNYXRyaXgxLnh5eiwgYml0bWFwLmNvbnRleHRNYXRyaXgyLnh5eik7XG4gICAgbGV0IHRyYW5zZm9ybWVkUG9zID0gbWF0cml4ICogdmVjMzxmMzI+KGlucHV0LnBvc2l0aW9uLCAxLjApO1xuICAgIGxldCBjbGlwWCA9IHRyYW5zZm9ybWVkUG9zLnggKiAyLjAgLSAxLjA7XG4gICAgbGV0IGNsaXBZID0gKHRyYW5zZm9ybWVkUG9zLnkgKiAyLjAgLSAxLjApICogeUZsaXBTaWduO1xuICAgIG91dHB1dC5wb3NpdGlvbiA9IHZlYzQ8ZjMyPihjbGlwWCwgY2xpcFksIDAuMCwgMS4wKTtcbiAgICBvdXRwdXQuYmV6aWVyID0gaW5wdXQuYmV6aWVyO1xuICAgIG91dHB1dC5jb2xvciA9IGJpdG1hcC5jb2xvcjtcbiAgICBvdXRwdXQud29ybGRQb3MgPSBpbnB1dC5wb3NpdGlvbjtcbiAgICByZXR1cm4gb3V0cHV0O1xufVxuIixBaT0iXG5mbiBpc0luc2lkZSh1djogdmVjMjxmMzI+KSAtPiBmMzIge1xuICAgIGxldCBzID0gc3RlcCh2ZWMyPGYzMj4oMC4wKSwgdXYpICogc3RlcCh1diwgdmVjMjxmMzI+KDEuMCkpO1xuICAgIHJldHVybiBzLnggKiBzLnk7XG59IixSaT0iXG4gICAgY29uc3QgdmVydGljZXMgPSBhcnJheTx2ZWMyPGYzMj4sIDY+KFxuICAgICAgICB2ZWMyPGYzMj4oMC4wLCAwLjApLFxuICAgICAgICB2ZWMyPGYzMj4oMS4wLCAwLjApLFxuICAgICAgICB2ZWMyPGYzMj4oMC4wLCAxLjApLFxuICAgICAgICB2ZWMyPGYzMj4oMC4wLCAxLjApLFxuICAgICAgICB2ZWMyPGYzMj4oMS4wLCAwLjApLFxuICAgICAgICB2ZWMyPGYzMj4oMS4wLCAxLjApXG4gICAgKTsiLENpPSJcbnN0cnVjdCBWZXJ0ZXhPdXRwdXQge1xuICAgIEBidWlsdGluKHBvc2l0aW9uKSBwb3NpdGlvbjogdmVjNDxmMzI+LFxuICAgIEBsb2NhdGlvbigwKSB0ZXhDb29yZDogdmVjMjxmMzI+LFxufSIsRWk9ZT0+YFxuJHtDaX1cblxuQHZlcnRleFxuZm4gbWFpbihAYnVpbHRpbih2ZXJ0ZXhfaW5kZXgpIHZlcnRleEluZGV4OiB1MzIpIC0+IFZlcnRleE91dHB1dCB7XG4gICAgdmFyIG91dHB1dDogVmVydGV4T3V0cHV0O1xuXG4gICAgY29uc3QgcG9zaXRpb25zID0gYXJyYXk8dmVjMjxmMzI+LCA2PihcbiAgICAgICAgdmVjMjxmMzI+KC0xLjAsIC0xLjApLFxuICAgICAgICB2ZWMyPGYzMj4oIDEuMCwgLTEuMCksXG4gICAgICAgIHZlYzI8ZjMyPigtMS4wLCAgMS4wKSxcbiAgICAgICAgdmVjMjxmMzI+KC0xLjAsICAxLjApLFxuICAgICAgICB2ZWMyPGYzMj4oIDEuMCwgLTEuMCksXG4gICAgICAgIHZlYzI8ZjMyPiggMS4wLCAgMS4wKVxuICAgICk7XG4gICAgdmFyIHRleENvb3JkcyA9IGFycmF5PHZlYzI8ZjMyPiwgNj4oXG4gICAgICAgIHZlYzI8ZjMyPigwLjAsICR7ZT8iMS4wIjoiMC4wIn0pLFxuICAgICAgICB2ZWMyPGYzMj4oMS4wLCAke2U/IjEuMCI6IjAuMCJ9KSxcbiAgICAgICAgdmVjMjxmMzI+KDAuMCwgJHtlPyIwLjAiOiIxLjAifSksXG4gICAgICAgIHZlYzI8ZjMyPigwLjAsICR7ZT8iMC4wIjoiMS4wIn0pLFxuICAgICAgICB2ZWMyPGYzMj4oMS4wLCAke2U/IjEuMCI6IjAuMCJ9KSxcbiAgICAgICAgdmVjMjxmMzI+KDEuMCwgJHtlPyIwLjAiOiIxLjAifSlcbiAgICApO1xuICAgIG91dHB1dC5wb3NpdGlvbiA9IHZlYzQ8ZjMyPihwb3NpdGlvbnNbdmVydGV4SW5kZXhdLCAwLjAsIDEuMCk7XG4gICAgb3V0cHV0LnRleENvb3JkID0gdGV4Q29vcmRzW3ZlcnRleEluZGV4XTtcbiAgICByZXR1cm4gb3V0cHV0O1xufVxuYCxVaT1FaSghMCksJGk9RWkoITEpLEdpPUVpKCExKSxraT1gXG5zdHJ1Y3QgUG9zaXRpb25Vbmlmb3JtcyB7XG4gICAgb2Zmc2V0OiB2ZWMyPGYzMj4sXG4gICAgc2l6ZTogdmVjMjxmMzI+LFxuICAgIHZpZXdwb3J0OiB2ZWMyPGYzMj4sXG4gICAgcGFkZGluZzogdmVjMjxmMzI+LFxufVxuXG5zdHJ1Y3QgVmVydGV4T3V0cHV0IHtcbiAgICBAYnVpbHRpbihwb3NpdGlvbikgcG9zaXRpb246IHZlYzQ8ZjMyPixcbiAgICBAbG9jYXRpb24oMCkgdGV4Q29vcmQ6IHZlYzI8ZjMyPixcbn1cblxuQGdyb3VwKDApIEBiaW5kaW5nKDApIHZhcjx1bmlmb3JtPiB1bmlmb3JtczogUG9zaXRpb25Vbmlmb3JtcztcblxuQHZlcnRleFxuZm4gbWFpbihAYnVpbHRpbih2ZXJ0ZXhfaW5kZXgpIHZlcnRleEluZGV4OiB1MzIpIC0+IFZlcnRleE91dHB1dCB7XG4gICAgdmFyIG91dHB1dDogVmVydGV4T3V0cHV0O1xuJHtSaX1cbiAgICBsZXQgdmVydGV4ID0gdmVydGljZXNbdmVydGV4SW5kZXhdO1xuICAgIG91dHB1dC50ZXhDb29yZCA9IHZlYzI8ZjMyPih2ZXJ0ZXgueCwgMS4wIC0gdmVydGV4LnkpO1xuICAgIHZhciBwb3NpdGlvbiA9IHZlcnRleCAqIHVuaWZvcm1zLnNpemUgKyB1bmlmb3Jtcy5vZmZzZXQ7XG4gICAgcG9zaXRpb24gPSBwb3NpdGlvbiAvIHVuaWZvcm1zLnZpZXdwb3J0O1xuICAgIHBvc2l0aW9uID0gcG9zaXRpb24gKiAyLjAgLSAxLjA7XG4gICAgb3V0cHV0LnBvc2l0aW9uID0gdmVjNDxmMzI+KHBvc2l0aW9uLngsIC1wb3NpdGlvbi55LCAwLjAsIDEuMCk7XG4gICAgcmV0dXJuIG91dHB1dDtcbn1cbmAsTGk9YFxuc3RydWN0IEJpdG1hcFN5bmNVbmlmb3JtcyB7XG4gICAgbm9kZVJlY3Q6IHZlYzQ8ZjMyPixcbiAgICB0ZXh0dXJlU2l6ZTogdmVjMjxmMzI+LFxuICAgIHBhZGRpbmc6IHZlYzI8ZjMyPixcbn1cblxuc3RydWN0IFZlcnRleE91dHB1dCB7XG4gICAgQGJ1aWx0aW4ocG9zaXRpb24pIHBvc2l0aW9uOiB2ZWM0PGYzMj4sXG4gICAgQGxvY2F0aW9uKDApIHRleENvb3JkOiB2ZWMyPGYzMj4sXG59XG5cbkBncm91cCgwKSBAYmluZGluZygwKSB2YXI8dW5pZm9ybT4gdW5pZm9ybXM6IEJpdG1hcFN5bmNVbmlmb3JtcztcblxuQHZlcnRleFxuZm4gbWFpbihAYnVpbHRpbih2ZXJ0ZXhfaW5kZXgpIHZlcnRleEluZGV4OiB1MzIpIC0+IFZlcnRleE91dHB1dCB7XG4gICAgdmFyIG91dHB1dDogVmVydGV4T3V0cHV0O1xuJHtSaX1cbiAgICBsZXQgdmVydGV4ID0gdmVydGljZXNbdmVydGV4SW5kZXhdO1xuICAgIGxldCBwaXhlbFBvcyA9IHZlYzI8ZjMyPihcbiAgICAgICAgdW5pZm9ybXMubm9kZVJlY3QueCArIHZlcnRleC54ICogdW5pZm9ybXMubm9kZVJlY3QueixcbiAgICAgICAgdW5pZm9ybXMubm9kZVJlY3QueSArIHZlcnRleC55ICogdW5pZm9ybXMubm9kZVJlY3Qud1xuICAgICk7XG4gICAgbGV0IG5kYyA9IHBpeGVsUG9zIC8gdW5pZm9ybXMudGV4dHVyZVNpemUgKiAyLjAgLSAxLjA7XG4gICAgb3V0cHV0LnBvc2l0aW9uID0gdmVjNDxmMzI+KG5kYy54LCAtbmRjLnksIDAuMCwgMS4wKTtcbiAgICBvdXRwdXQudGV4Q29vcmQgPSBwaXhlbFBvcyAvIHVuaWZvcm1zLnRleHR1cmVTaXplO1xuICAgIHJldHVybiBvdXRwdXQ7XG59XG5gLElpPWU9PmBcblxuc3RydWN0IFNjYWxlVW5pZm9ybXMge1xuICAgIG1hdHJpeDogdmVjNDxmMzI+LFxuICAgIHRyYW5zbGF0ZTogdmVjMjxmMzI+LFxuICAgIHNyY1NpemU6IHZlYzI8ZjMyPixcbiAgICBkc3RTaXplOiB2ZWMyPGYzMj4sXG4gICAgcGFkZGluZzogdmVjMjxmMzI+LFxufVxuXG5zdHJ1Y3QgVmVydGV4T3V0cHV0IHtcbiAgICBAYnVpbHRpbihwb3NpdGlvbikgcG9zaXRpb246IHZlYzQ8ZjMyPixcbiAgICBAbG9jYXRpb24oMCkgdGV4Q29vcmQ6IHZlYzI8ZjMyPixcbn1cblxuQGdyb3VwKDApIEBiaW5kaW5nKDApIHZhcjx1bmlmb3JtPiB1bmlmb3JtczogU2NhbGVVbmlmb3JtcztcblxuXG5AdmVydGV4XG5mbiBtYWluKEBidWlsdGluKHZlcnRleF9pbmRleCkgdmVydGV4SW5kZXg6IHUzMikgLT4gVmVydGV4T3V0cHV0IHtcbiAgICB2YXIgb3V0cHV0OiBWZXJ0ZXhPdXRwdXQ7XG4ke1JpfVxuICAgIGxldCB2ZXJ0ZXggPSB2ZXJ0aWNlc1t2ZXJ0ZXhJbmRleF07XG4gICAgb3V0cHV0LnRleENvb3JkID0gJHtlPyJ2ZWMyPGYzMj4odmVydGV4LngsIDEuMCAtIHZlcnRleC55KSI6InZlcnRleCJ9O1xuXG4gICAgdmFyIHBvcyA9IHZlcnRleCAqIHVuaWZvcm1zLnNyY1NpemU7XG4gICAgbGV0IGEgPSB1bmlmb3Jtcy5tYXRyaXgueDtcbiAgICBsZXQgYiA9IHVuaWZvcm1zLm1hdHJpeC55O1xuICAgIGxldCBjID0gdW5pZm9ybXMubWF0cml4Lno7XG4gICAgbGV0IGQgPSB1bmlmb3Jtcy5tYXRyaXgudztcbiAgICBsZXQgdHggPSB1bmlmb3Jtcy50cmFuc2xhdGUueDtcbiAgICBsZXQgdHkgPSB1bmlmb3Jtcy50cmFuc2xhdGUueTtcbiAgICBsZXQgdHJhbnNmb3JtZWRYID0gcG9zLnggKiBhICsgcG9zLnkgKiBjICsgdHg7XG4gICAgbGV0IHRyYW5zZm9ybWVkWSA9IHBvcy54ICogYiArIHBvcy55ICogZCArIHR5O1xuICAgIHZhciBwb3NpdGlvbiA9IHZlYzI8ZjMyPih0cmFuc2Zvcm1lZFgsIHRyYW5zZm9ybWVkWSkgLyB1bmlmb3Jtcy5kc3RTaXplO1xuICAgIHBvc2l0aW9uID0gcG9zaXRpb24gKiAyLjAgLSAxLjA7XG4gICAgb3V0cHV0LnBvc2l0aW9uID0gdmVjNDxmMzI+KHBvc2l0aW9uLngsIC1wb3NpdGlvbi55LCAwLjAsIDEuMCk7XG5cbiAgICByZXR1cm4gb3V0cHV0O1xufVxuYCxWaT1JaSghMSksemk9SWkoITApLGppPUlpKCExKSxEaT1lPT5gXG5zdHJ1Y3QgUG9zaXRpb25Vbmlmb3JtcyB7XG4gICAgb2Zmc2V0OiB2ZWMyPGYzMj4sXG4gICAgc2l6ZTogdmVjMjxmMzI+LFxuICAgIHZpZXdwb3J0OiB2ZWMyPGYzMj4sXG4gICAgcGFkZGluZzogdmVjMjxmMzI+LFxufVxuXG5zdHJ1Y3QgVmVydGV4T3V0cHV0IHtcbiAgICBAYnVpbHRpbihwb3NpdGlvbikgcG9zaXRpb246IHZlYzQ8ZjMyPixcbiAgICBAbG9jYXRpb24oMCkgdGV4Q29vcmQ6IHZlYzI8ZjMyPixcbn1cblxuQGdyb3VwKDApIEBiaW5kaW5nKDApIHZhcjx1bmlmb3JtPiB1bmlmb3JtczogUG9zaXRpb25Vbmlmb3JtcztcblxuQHZlcnRleFxuZm4gbWFpbihAYnVpbHRpbih2ZXJ0ZXhfaW5kZXgpIHZlcnRleEluZGV4OiB1MzIpIC0+IFZlcnRleE91dHB1dCB7XG4gICAgdmFyIG91dHB1dDogVmVydGV4T3V0cHV0O1xuJHtSaX1cbiAgICBsZXQgdmVydGV4ID0gdmVydGljZXNbdmVydGV4SW5kZXhdO1xuICAgIG91dHB1dC50ZXhDb29yZCA9ICR7ZT8idmVjMjxmMzI+KHZlcnRleC54LCAxLjAgLSB2ZXJ0ZXgueSkiOiJ2ZXJ0ZXgifTtcbiAgICB2YXIgcG9zaXRpb24gPSB2ZXJ0ZXggKiB1bmlmb3Jtcy5zaXplICsgdW5pZm9ybXMub2Zmc2V0O1xuICAgIHBvc2l0aW9uID0gcG9zaXRpb24gLyB1bmlmb3Jtcy52aWV3cG9ydDtcbiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uICogMi4wIC0gMS4wO1xuICAgIG91dHB1dC5wb3NpdGlvbiA9IHZlYzQ8ZjMyPihwb3NpdGlvbi54LCAtcG9zaXRpb24ueSwgMC4wLCAxLjApO1xuICAgIHJldHVybiBvdXRwdXQ7XG59XG5gLE5pPURpKCExKSxXaT1EaSghMCkscWk9Ilxuc3RydWN0IEdyYWRpZW50VW5pZm9ybXMge1xuICAgIGludmVyc2VNYXRyaXg6IG1hdDN4MzxmMzI+LFxuICAgIGdyYWRpZW50VHlwZTogZjMyLFxuICAgIGZvY2FsOiBmMzIsXG4gICAgc3ByZWFkOiBmMzIsXG4gICAgcmFkaXVzOiBmMzIsXG4gICAgbGluZWFyUG9pbnRzOiB2ZWM0PGYzMj4sXG59XG5cbkBncm91cCgwKSBAYmluZGluZygwKSB2YXI8dW5pZm9ybT4gZ3JhZGllbnQ6IEdyYWRpZW50VW5pZm9ybXM7XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMSkgdmFyIGdyYWRpZW50U2FtcGxlcjogc2FtcGxlcjtcbkBncm91cCgwKSBAYmluZGluZygyKSB2YXIgZ3JhZGllbnRUZXh0dXJlOiB0ZXh0dXJlXzJkPGYzMj47XG5cbm92ZXJyaWRlIEdSQURJRU5UX1RZUEU6IHUzMiA9IDB1O1xub3ZlcnJpZGUgU1BSRUFEX01PREU6IHUzMiA9IDJ1O1xuXG5mbiBhcHBseVNwcmVhZCh0OiBmMzIpIC0+IGYzMiB7XG4gICAgaWYgKFNQUkVBRF9NT0RFID09IDB1KSB7XG4gICAgICAgIHJldHVybiAxLjAgLSBhYnMoZnJhY3QodCAqIDAuNSkgKiAyLjAgLSAxLjApO1xuICAgIH0gZWxzZSBpZiAoU1BSRUFEX01PREUgPT0gMXUpIHtcbiAgICAgICAgcmV0dXJuIGZyYWN0KHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjbGFtcCh0LCAwLjAsIDEuMCk7XG4gICAgfVxufVxuIixYaT0iXG4gICAgdmFyIHQ6IGYzMjtcbiAgICBpZiAoR1JBRElFTlRfVFlQRSA9PSAwdSkge1xuICAgICAgICBsZXQgYSA9IGdyYWRpZW50LmxpbmVhclBvaW50cy54eTtcbiAgICAgICAgbGV0IGIgPSBncmFkaWVudC5saW5lYXJQb2ludHMuenc7XG4gICAgICAgIGxldCBhYiA9IGIgLSBhO1xuICAgICAgICBsZXQgYXAgPSBwIC0gYTtcbiAgICAgICAgbGV0IGRvdEFCID0gZG90KGFiLCBhYik7XG4gICAgICAgIGlmIChkb3RBQiA8IDAuMDAwMSkge1xuICAgICAgICAgICAgdCA9IDAuMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHQgPSBkb3QoYWIsIGFwKSAvIGRvdEFCO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IHIgPSBncmFkaWVudC5yYWRpdXM7XG4gICAgICAgIGxldCBjb29yZCA9IHAgLyByO1xuICAgICAgICBsZXQgZm9jYWxSYXRpbyA9IGdyYWRpZW50LmZvY2FsO1xuXG4gICAgICAgIGlmIChhYnMoZm9jYWxSYXRpbykgPCAwLjAwMSkge1xuICAgICAgICAgICAgdCA9IGxlbmd0aChjb29yZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgZm9jYWwgPSB2ZWMyPGYzMj4oZm9jYWxSYXRpbywgMC4wKTtcbiAgICAgICAgICAgIGxldCBkaWZmID0gY29vcmQgLSBmb2NhbDtcbiAgICAgICAgICAgIGxldCBsZW5EaWZmID0gbGVuZ3RoKGRpZmYpO1xuXG4gICAgICAgICAgICBpZiAobGVuRGlmZiA8IDAuMDAwMSkge1xuICAgICAgICAgICAgICAgIHQgPSAwLjA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBkaXIgPSBkaWZmIC8gbGVuRGlmZjtcblxuICAgICAgICAgICAgICAgIC8vIFNvbHZlIHF1YWRyYXRpYyBlcXVhdGlvbiBmb3IgdW5pdCBjaXJjbGUgaW50ZXJzZWN0aW9uIChhPTEgc2luY2UgZGlyIGlzIG5vcm1hbGl6ZWQpXG4gICAgICAgICAgICAgICAgbGV0IGJfY29lZiA9IDIuMCAqIGRvdChkaXIsIGZvY2FsKTtcbiAgICAgICAgICAgICAgICBsZXQgY19jb2VmID0gZG90KGZvY2FsLCBmb2NhbCkgLSAxLjA7XG4gICAgICAgICAgICAgICAgbGV0IGRpc2NyaW1pbmFudCA9IGJfY29lZiAqIGJfY29lZiAtIDQuMCAqIGNfY29lZjtcbiAgICAgICAgICAgICAgICBsZXQgeCA9ICgtYl9jb2VmICsgc3FydChtYXgoZGlzY3JpbWluYW50LCAwLjApKSkgKiAwLjU7XG4gICAgICAgICAgICAgICAgdCA9IGxlbkRpZmYgLyBhYnMoeCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgdCA9IGFwcGx5U3ByZWFkKHQpO1xuICAgIGxldCBncmFkaWVudENvbG9yID0gdGV4dHVyZVNhbXBsZUxldmVsKGdyYWRpZW50VGV4dHVyZSwgZ3JhZGllbnRTYW1wbGVyLCB2ZWMyPGYzMj4odCwgMC41KSwgMCk7XG4iLFlpPWBcbnN0cnVjdCBWZXJ0ZXhPdXRwdXQge1xuICAgIEBidWlsdGluKHBvc2l0aW9uKSBwb3NpdGlvbjogdmVjNDxmMzI+LFxuICAgIEBsb2NhdGlvbigwKSB2X3V2OiB2ZWMyPGYzMj4sXG4gICAgQGxvY2F0aW9uKDEpIGJlemllcjogdmVjMjxmMzI+LFxuICAgIEBsb2NhdGlvbigyKSBjb2xvcjogdmVjNDxmMzI+LFxufVxuJHtxaX1cblxuQGZyYWdtZW50XG5mbiBtYWluKGlucHV0OiBWZXJ0ZXhPdXRwdXQpIC0+IEBsb2NhdGlvbigwKSB2ZWM0PGYzMj4ge1xuICAgIGxldCBwID0gaW5wdXQudl91djtcbiR7WGl9XG4gICAgbGV0IHJlc3VsdCA9IGdyYWRpZW50Q29sb3IgKiBpbnB1dC5jb2xvcjtcbiAgICByZXR1cm4gdmVjNDxmMzI+KHJlc3VsdC5yZ2IgKiByZXN1bHQuYSwgcmVzdWx0LmEpO1xufVxuYCxLaT1gXG5zdHJ1Y3QgVmVydGV4T3V0cHV0IHtcbiAgICBAYnVpbHRpbihwb3NpdGlvbikgcG9zaXRpb246IHZlYzQ8ZjMyPixcbiAgICBAbG9jYXRpb24oMCkgdl91djogdmVjMjxmMzI+LFxuICAgIEBsb2NhdGlvbigxKSBiZXppZXI6IHZlYzI8ZjMyPixcbiAgICBAbG9jYXRpb24oMikgY29sb3I6IHZlYzQ8ZjMyPixcbn1cbiR7cWl9XG5cbkBmcmFnbWVudFxuZm4gbWFpbihpbnB1dDogVmVydGV4T3V0cHV0KSAtPiBAbG9jYXRpb24oMCkgdmVjNDxmMzI+IHtcbiAgICBsZXQgcCA9IGlucHV0LnZfdXY7XG4ke1hpfVxuICAgIHJldHVybiB2ZWM0PGYzMj4oZ3JhZGllbnRDb2xvci5yZ2IgKiBncmFkaWVudENvbG9yLmEsIGdyYWRpZW50Q29sb3IuYSk7XG59XG5gLEhpPWBcbnN0cnVjdCBWZXJ0ZXhPdXRwdXQge1xuICAgIEBidWlsdGluKHBvc2l0aW9uKSBwb3NpdGlvbjogdmVjNDxmMzI+LFxuICAgIEBsb2NhdGlvbigwKSB0ZXhDb29yZDogdmVjMjxmMzI+LFxuICAgIEBsb2NhdGlvbigxKSBjb2xvcjogdmVjNDxmMzI+LFxufVxuJHtxaX1cblxuQGZyYWdtZW50XG5mbiBtYWluKGlucHV0OiBWZXJ0ZXhPdXRwdXQpIC0+IEBsb2NhdGlvbigwKSB2ZWM0PGYzMj4ge1xuICAgIGxldCBwID0gaW5wdXQudGV4Q29vcmQ7XG4ke1hpfVxuICAgIGxldCByZXN1bHQgPSBncmFkaWVudENvbG9yICogaW5wdXQuY29sb3I7XG4gICAgcmV0dXJuIHZlYzQ8ZjMyPihyZXN1bHQucmdiICogcmVzdWx0LmEsIHJlc3VsdC5hKTtcbn1cbmAsUWk9YFxuJHtDaX1cblxuc3RydWN0IENvcHlVbmlmb3JtcyB7XG4gICAgc2NhbGU6IHZlYzI8ZjMyPixcbiAgICBvZmZzZXQ6IHZlYzI8ZjMyPixcbn1cblxuQGdyb3VwKDApIEBiaW5kaW5nKDApIHZhcjx1bmlmb3JtPiB1bmlmb3JtczogQ29weVVuaWZvcm1zO1xuQGdyb3VwKDApIEBiaW5kaW5nKDEpIHZhciB0ZXh0dXJlU2FtcGxlcjogc2FtcGxlcjtcbkBncm91cCgwKSBAYmluZGluZygyKSB2YXIgaW5wdXRUZXh0dXJlOiB0ZXh0dXJlXzJkPGYzMj47XG5cbkBmcmFnbWVudFxuZm4gbWFpbihpbnB1dDogVmVydGV4T3V0cHV0KSAtPiBAbG9jYXRpb24oMCkgdmVjNDxmMzI+IHtcbiAgICBsZXQgdXYgPSBpbnB1dC50ZXhDb29yZCAqIHVuaWZvcm1zLnNjYWxlICsgdW5pZm9ybXMub2Zmc2V0O1xuICAgIHJldHVybiB0ZXh0dXJlU2FtcGxlTGV2ZWwoaW5wdXRUZXh0dXJlLCB0ZXh0dXJlU2FtcGxlciwgdXYsIDApO1xufVxuYCxaaT1gXG4ke0NpfVxuXG5zdHJ1Y3QgQ29weVVuaWZvcm1zIHtcbiAgICBzY2FsZTogdmVjMjxmMzI+LFxuICAgIG9mZnNldDogdmVjMjxmMzI+LFxufVxuXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyPHVuaWZvcm0+IHVuaWZvcm1zOiBDb3B5VW5pZm9ybXM7XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMSkgdmFyIHRleHR1cmVTYW1wbGVyOiBzYW1wbGVyO1xuQGdyb3VwKDApIEBiaW5kaW5nKDIpIHZhciBpbnB1dFRleHR1cmU6IHRleHR1cmVfMmQ8ZjMyPjtcblxuQGZyYWdtZW50XG5mbiBtYWluKGlucHV0OiBWZXJ0ZXhPdXRwdXQpIC0+IEBsb2NhdGlvbigwKSB2ZWM0PGYzMj4ge1xuICAgIGxldCB1diA9IChpbnB1dC50ZXhDb29yZCAtIHVuaWZvcm1zLm9mZnNldCkgKiB1bmlmb3Jtcy5zY2FsZTtcbiAgICBsZXQgY2xhbXBlZFV2ID0gY2xhbXAodXYsIHZlYzI8ZjMyPigwLjApLCB2ZWMyPGYzMj4oMS4wKSk7XG4gICAgbGV0IGNvbG9yID0gdGV4dHVyZVNhbXBsZUxldmVsKGlucHV0VGV4dHVyZSwgdGV4dHVyZVNhbXBsZXIsIGNsYW1wZWRVdiwgMCk7XG4gICAgbGV0IGluQm91bmRzID0gdXYueCA+PSAwLjAgJiYgdXYueCA8PSAxLjAgJiYgdXYueSA+PSAwLjAgJiYgdXYueSA8PSAxLjA7XG4gICAgcmV0dXJuIHNlbGVjdCh2ZWM0PGYzMj4oMC4wLCAwLjAsIDAuMCwgMC4wKSwgY29sb3IsIGluQm91bmRzKTtcbn1cbmAsSmk9YFxuJHtDaX1cblxuc3RydWN0IENvcHlVbmlmb3JtcyB7XG4gICAgc2NhbGU6IHZlYzI8ZjMyPixcbiAgICBvZmZzZXQ6IHZlYzI8ZjMyPixcbn1cblxuQGdyb3VwKDApIEBiaW5kaW5nKDApIHZhcjx1bmlmb3JtPiB1bmlmb3JtczogQ29weVVuaWZvcm1zO1xuQGdyb3VwKDApIEBiaW5kaW5nKDEpIHZhciB0ZXh0dXJlU2FtcGxlcjogc2FtcGxlcjtcbkBncm91cCgwKSBAYmluZGluZygyKSB2YXIgaW5wdXRUZXh0dXJlOiB0ZXh0dXJlXzJkPGYzMj47XG5cbkBmcmFnbWVudFxuZm4gbWFpbihpbnB1dDogVmVydGV4T3V0cHV0KSAtPiBAbG9jYXRpb24oMCkgdmVjNDxmMzI+IHtcbiAgICBsZXQgdXYgPSBpbnB1dC50ZXhDb29yZCAqIHVuaWZvcm1zLnNjYWxlICsgdW5pZm9ybXMub2Zmc2V0O1xuICAgIGxldCBjbGFtcGVkVXYgPSBjbGFtcCh1diwgdmVjMjxmMzI+KDAuMCksIHZlYzI8ZjMyPigxLjApKTtcbiAgICBsZXQgY29sb3IgPSB0ZXh0dXJlU2FtcGxlTGV2ZWwoaW5wdXRUZXh0dXJlLCB0ZXh0dXJlU2FtcGxlciwgY2xhbXBlZFV2LCAwKTtcbiAgICBsZXQgaW5Cb3VuZHMgPSB1di54ID49IDAuMCAmJiB1di54IDw9IDEuMCAmJiB1di55ID49IDAuMCAmJiB1di55IDw9IDEuMDtcbiAgICByZXR1cm4gc2VsZWN0KHZlYzQ8ZjMyPigwLjAsIDAuMCwgMC4wLCAwLjApLCBjb2xvciwgaW5Cb3VuZHMpO1xufVxuYCxlYT1gXG4ke0NpfVxuXG5zdHJ1Y3QgQ29sb3JUcmFuc2Zvcm1Vbmlmb3JtcyB7XG4gICAgbXVsOiB2ZWM0PGYzMj4sXG4gICAgYWRkOiB2ZWM0PGYzMj4sXG59XG5cbkBncm91cCgwKSBAYmluZGluZygwKSB2YXI8dW5pZm9ybT4gY3Q6IENvbG9yVHJhbnNmb3JtVW5pZm9ybXM7XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMSkgdmFyIHRleHR1cmVTYW1wbGVyOiBzYW1wbGVyO1xuQGdyb3VwKDApIEBiaW5kaW5nKDIpIHZhciBpbnB1dFRleHR1cmU6IHRleHR1cmVfMmQ8ZjMyPjtcblxuQGZyYWdtZW50XG5mbiBtYWluKGlucHV0OiBWZXJ0ZXhPdXRwdXQpIC0+IEBsb2NhdGlvbigwKSB2ZWM0PGYzMj4ge1xuICAgIHZhciBjb2xvciA9IHRleHR1cmVTYW1wbGVMZXZlbChpbnB1dFRleHR1cmUsIHRleHR1cmVTYW1wbGVyLCBpbnB1dC50ZXhDb29yZCwgMCk7XG5cbiAgICBjb2xvciA9IHZlYzQ8ZjMyPihjb2xvci5yZ2IgLyBtYXgodmVjMzxmMzI+KDAuMDAwMSksIHZlYzM8ZjMyPihjb2xvci5hKSksIGNvbG9yLmEpO1xuICAgIGNvbG9yID0gY2xhbXAoY29sb3IgKiBjdC5tdWwgKyBjdC5hZGQsIHZlYzQ8ZjMyPigwLjApLCB2ZWM0PGYzMj4oMS4wKSk7XG4gICAgY29sb3IgPSB2ZWM0PGYzMj4oY29sb3IucmdiICogY29sb3IuYSwgY29sb3IuYSk7XG5cbiAgICByZXR1cm4gY29sb3I7XG59XG5gLHRhPWBcbiR7Q2l9XG5cbnN0cnVjdCBZRmxpcENUVW5pZm9ybXMge1xuICAgIHNjYWxlOiB2ZWMyPGYzMj4sXG4gICAgb2Zmc2V0OiB2ZWMyPGYzMj4sXG4gICAgbXVsOiB2ZWM0PGYzMj4sXG4gICAgYWRkOiB2ZWM0PGYzMj4sXG59XG5cbkBncm91cCgwKSBAYmluZGluZygwKSB2YXI8dW5pZm9ybT4gdW5pZm9ybXM6IFlGbGlwQ1RVbmlmb3JtcztcbkBncm91cCgwKSBAYmluZGluZygxKSB2YXIgdGV4dHVyZVNhbXBsZXI6IHNhbXBsZXI7XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMikgdmFyIGlucHV0VGV4dHVyZTogdGV4dHVyZV8yZDxmMzI+O1xuXG5AZnJhZ21lbnRcbmZuIG1haW4oaW5wdXQ6IFZlcnRleE91dHB1dCkgLT4gQGxvY2F0aW9uKDApIHZlYzQ8ZjMyPiB7XG4gICAgbGV0IHV2ID0gaW5wdXQudGV4Q29vcmQgKiB1bmlmb3Jtcy5zY2FsZSArIHVuaWZvcm1zLm9mZnNldDtcbiAgICB2YXIgY29sb3IgPSB0ZXh0dXJlU2FtcGxlTGV2ZWwoaW5wdXRUZXh0dXJlLCB0ZXh0dXJlU2FtcGxlciwgdXYsIDApO1xuXG4gICAgY29sb3IgPSB2ZWM0PGYzMj4oY29sb3IucmdiIC8gbWF4KHZlYzM8ZjMyPigwLjAwMDEpLCB2ZWMzPGYzMj4oY29sb3IuYSkpLCBjb2xvci5hKTtcbiAgICBjb2xvciA9IGNsYW1wKGNvbG9yICogdW5pZm9ybXMubXVsICsgdW5pZm9ybXMuYWRkLCB2ZWM0PGYzMj4oMC4wKSwgdmVjNDxmMzI+KDEuMCkpO1xuICAgIGNvbG9yID0gdmVjNDxmMzI+KGNvbG9yLnJnYiAqIGNvbG9yLmEsIGNvbG9yLmEpO1xuXG4gICAgcmV0dXJuIGNvbG9yO1xufVxuYCxyYT1gXG4ke0NpfVxuXG5zdHJ1Y3QgQ29sb3JNYXRyaXhVbmlmb3JtcyB7XG4gICAgbWF0cml4OiBtYXQ0eDQ8ZjMyPixcbiAgICBvZmZzZXQ6IHZlYzQ8ZjMyPixcbn1cblxuQGdyb3VwKDApIEBiaW5kaW5nKDApIHZhcjx1bmlmb3JtPiB1bmlmb3JtczogQ29sb3JNYXRyaXhVbmlmb3JtcztcbkBncm91cCgwKSBAYmluZGluZygxKSB2YXIgdGV4dHVyZVNhbXBsZXI6IHNhbXBsZXI7XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMikgdmFyIGlucHV0VGV4dHVyZTogdGV4dHVyZV8yZDxmMzI+O1xuXG5AZnJhZ21lbnRcbmZuIG1haW4oaW5wdXQ6IFZlcnRleE91dHB1dCkgLT4gQGxvY2F0aW9uKDApIHZlYzQ8ZjMyPiB7XG4gICAgdmFyIGNvbG9yID0gdGV4dHVyZVNhbXBsZUxldmVsKGlucHV0VGV4dHVyZSwgdGV4dHVyZVNhbXBsZXIsIGlucHV0LnRleENvb3JkLCAwKTtcblxuICAgIGNvbG9yID0gdmVjNDxmMzI+KGNvbG9yLnJnYiAvIG1heCh2ZWMzPGYzMj4oMC4wMDAxKSwgdmVjMzxmMzI+KGNvbG9yLmEpKSwgY29sb3IuYSk7XG4gICAgdmFyIHJlc3VsdCA9IHVuaWZvcm1zLm1hdHJpeCAqIGNvbG9yICsgdW5pZm9ybXMub2Zmc2V0O1xuICAgIHJlc3VsdCA9IGNsYW1wKHJlc3VsdCwgdmVjNDxmMzI+KDAuMCksIHZlYzQ8ZjMyPigxLjApKTtcbiAgICByZXN1bHQgPSB2ZWM0PGYzMj4ocmVzdWx0LnJnYiAqIHJlc3VsdC5hLCByZXN1bHQuYSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuYCxuYT1gXG4ke0NpfVxuXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMSkgdmFyIHRleHR1cmVTYW1wbGVyOiBzYW1wbGVyO1xuQGdyb3VwKDApIEBiaW5kaW5nKDIpIHZhciBpbnB1dFRleHR1cmU6IHRleHR1cmVfMmQ8ZjMyPjtcblxuQGZyYWdtZW50XG5mbiBtYWluKGlucHV0OiBWZXJ0ZXhPdXRwdXQpIC0+IEBsb2NhdGlvbigwKSB2ZWM0PGYzMj4ge1xuICAgIHJldHVybiB0ZXh0dXJlU2FtcGxlTGV2ZWwoaW5wdXRUZXh0dXJlLCB0ZXh0dXJlU2FtcGxlciwgaW5wdXQudGV4Q29vcmQsIDApO1xufVxuYCxpYT1gXG4ke0NpfVxuXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMSkgdmFyIHRleHR1cmVTYW1wbGVyOiBzYW1wbGVyO1xuQGdyb3VwKDApIEBiaW5kaW5nKDIpIHZhciBpbnB1dFRleHR1cmU6IHRleHR1cmVfMmQ8ZjMyPjtcblxuQGZyYWdtZW50XG5mbiBtYWluKGlucHV0OiBWZXJ0ZXhPdXRwdXQpIC0+IEBsb2NhdGlvbigwKSB2ZWM0PGYzMj4ge1xuICAgIHJldHVybiB0ZXh0dXJlU2FtcGxlTGV2ZWwoaW5wdXRUZXh0dXJlLCB0ZXh0dXJlU2FtcGxlciwgaW5wdXQudGV4Q29vcmQsIDApO1xufVxuYCxhYT1gXG4ke0NpfVxuXG5vdmVycmlkZSBJU19JTk5FUjogdTMyID0gMHU7XG5vdmVycmlkZSBJU19LTk9DS09VVDogdTMyID0gMHU7XG5cbnN0cnVjdCBHbG93VW5pZm9ybXMge1xuICAgIGNvbG9yOiB2ZWM0PGYzMj4sXG4gICAgYmFzZVNjYWxlOiB2ZWMyPGYzMj4sXG4gICAgYmFzZU9mZnNldDogdmVjMjxmMzI+LFxuICAgIGJsdXJTY2FsZTogdmVjMjxmMzI+LFxuICAgIGJsdXJPZmZzZXQ6IHZlYzI8ZjMyPixcbiAgICBzdHJlbmd0aDogZjMyLFxuICAgIF9wYWRkaW5nMTogZjMyLFxuICAgIF9wYWRkaW5nMjogZjMyLFxuICAgIF9wYWRkaW5nMzogZjMyLFxufVxuXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyPHVuaWZvcm0+IHVuaWZvcm1zOiBHbG93VW5pZm9ybXM7XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMSkgdmFyIHRleHR1cmVTYW1wbGVyOiBzYW1wbGVyO1xuQGdyb3VwKDApIEBiaW5kaW5nKDIpIHZhciBibHVyVGV4dHVyZTogdGV4dHVyZV8yZDxmMzI+O1xuQGdyb3VwKDApIEBiaW5kaW5nKDMpIHZhciBiYXNlVGV4dHVyZTogdGV4dHVyZV8yZDxmMzI+O1xuJHtBaX1cblxuQGZyYWdtZW50XG5mbiBtYWluKGlucHV0OiBWZXJ0ZXhPdXRwdXQpIC0+IEBsb2NhdGlvbigwKSB2ZWM0PGYzMj4ge1xuICAgIGxldCBiYXNlVVYgPSBpbnB1dC50ZXhDb29yZCAqIHVuaWZvcm1zLmJhc2VTY2FsZSAtIHVuaWZvcm1zLmJhc2VPZmZzZXQ7XG4gICAgbGV0IGJhc2VDb2xvciA9IHRleHR1cmVTYW1wbGVMZXZlbChiYXNlVGV4dHVyZSwgdGV4dHVyZVNhbXBsZXIsIGJhc2VVViwgMCkgKiBpc0luc2lkZShiYXNlVVYpO1xuXG4gICAgbGV0IGJsdXJVViA9IGlucHV0LnRleENvb3JkICogdW5pZm9ybXMuYmx1clNjYWxlIC0gdW5pZm9ybXMuYmx1ck9mZnNldDtcbiAgICBsZXQgYmx1ckNvbG9yID0gdGV4dHVyZVNhbXBsZUxldmVsKGJsdXJUZXh0dXJlLCB0ZXh0dXJlU2FtcGxlciwgYmx1clVWLCAwKSAqIGlzSW5zaWRlKGJsdXJVVik7XG5cbiAgICB2YXIgcmF3QWxwaGEgPSBibHVyQ29sb3IuYTtcbiAgICBpZiAoSVNfSU5ORVIgPT0gMXUpIHtcbiAgICAgICAgcmF3QWxwaGEgPSAxLjAgLSByYXdBbHBoYTtcbiAgICB9XG4gICAgbGV0IGdsb3dBbHBoYSA9IGNsYW1wKHJhd0FscGhhICogdW5pZm9ybXMuc3RyZW5ndGgsIDAuMCwgMS4wKTtcbiAgICBsZXQgZ2xvd0NvbG9yID0gdmVjNDxmMzI+KHVuaWZvcm1zLmNvbG9yLnJnYiAqIGdsb3dBbHBoYSwgdW5pZm9ybXMuY29sb3IuYSAqIGdsb3dBbHBoYSk7XG4gICAgaWYgKElTX0lOTkVSID09IDF1KSB7XG4gICAgICAgIGxldCBpbm5lckdsb3cgPSBnbG93Q29sb3IgKiBiYXNlQ29sb3IuYTtcbiAgICAgICAgaWYgKElTX0tOT0NLT1VUID09IDF1KSB7XG4gICAgICAgICAgICByZXR1cm4gaW5uZXJHbG93O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGlubmVyR2xvdyArIGJhc2VDb2xvciAqICgxLjAgLSBnbG93Q29sb3IuYSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoSVNfS05PQ0tPVVQgPT0gMXUpIHtcbiAgICAgICAgICAgIHJldHVybiBnbG93Q29sb3IgKiAoMS4wIC0gYmFzZUNvbG9yLmEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGJhc2VDb2xvciArIGdsb3dDb2xvciAqICgxLjAgLSBiYXNlQ29sb3IuYSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5gLHNhPWBcbiR7Q2l9XG5cbm92ZXJyaWRlIElTX0lOTkVSOiB1MzIgPSAwdTtcbm92ZXJyaWRlIElTX0tOT0NLT1VUOiB1MzIgPSAwdTtcbm92ZXJyaWRlIElTX0hJREVfT0JKRUNUOiB1MzIgPSAwdTtcblxuc3RydWN0IERyb3BTaGFkb3dVbmlmb3JtcyB7XG4gICAgY29sb3I6IHZlYzQ8ZjMyPixcbiAgICBiYXNlU2NhbGU6IHZlYzI8ZjMyPixcbiAgICBiYXNlT2Zmc2V0OiB2ZWMyPGYzMj4sXG4gICAgYmx1clNjYWxlOiB2ZWMyPGYzMj4sXG4gICAgYmx1ck9mZnNldDogdmVjMjxmMzI+LFxuICAgIHN0cmVuZ3RoOiBmMzIsXG4gICAgX3BhZGRpbmcxOiBmMzIsXG4gICAgX3BhZGRpbmcyOiBmMzIsXG4gICAgX3BhZGRpbmczOiBmMzIsXG59XG5cbkBncm91cCgwKSBAYmluZGluZygwKSB2YXI8dW5pZm9ybT4gdW5pZm9ybXM6IERyb3BTaGFkb3dVbmlmb3JtcztcbkBncm91cCgwKSBAYmluZGluZygxKSB2YXIgdGV4dHVyZVNhbXBsZXI6IHNhbXBsZXI7XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMikgdmFyIGJsdXJUZXh0dXJlOiB0ZXh0dXJlXzJkPGYzMj47XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMykgdmFyIGJhc2VUZXh0dXJlOiB0ZXh0dXJlXzJkPGYzMj47XG4ke0FpfVxuXG5AZnJhZ21lbnRcbmZuIG1haW4oaW5wdXQ6IFZlcnRleE91dHB1dCkgLT4gQGxvY2F0aW9uKDApIHZlYzQ8ZjMyPiB7XG4gICAgbGV0IGJhc2VVViA9IGlucHV0LnRleENvb3JkICogdW5pZm9ybXMuYmFzZVNjYWxlIC0gdW5pZm9ybXMuYmFzZU9mZnNldDtcbiAgICBsZXQgYmFzZUNvbG9yID0gdGV4dHVyZVNhbXBsZUxldmVsKGJhc2VUZXh0dXJlLCB0ZXh0dXJlU2FtcGxlciwgYmFzZVVWLCAwKSAqIGlzSW5zaWRlKGJhc2VVVik7XG5cbiAgICBsZXQgYmx1clVWID0gaW5wdXQudGV4Q29vcmQgKiB1bmlmb3Jtcy5ibHVyU2NhbGUgLSB1bmlmb3Jtcy5ibHVyT2Zmc2V0O1xuICAgIGxldCBibHVyID0gdGV4dHVyZVNhbXBsZUxldmVsKGJsdXJUZXh0dXJlLCB0ZXh0dXJlU2FtcGxlciwgYmx1clVWLCAwKSAqIGlzSW5zaWRlKGJsdXJVVik7XG5cbiAgICB2YXIgcmF3QWxwaGEgPSBibHVyLmE7XG4gICAgaWYgKElTX0lOTkVSID09IDF1KSB7XG4gICAgICAgIHJhd0FscGhhID0gMS4wIC0gcmF3QWxwaGE7XG4gICAgfVxuICAgIGxldCBzaGFkb3dBbHBoYSA9IGNsYW1wKHJhd0FscGhhICogdW5pZm9ybXMuc3RyZW5ndGgsIDAuMCwgMS4wKTtcbiAgICBsZXQgc2hhZG93Q29sb3IgPSB2ZWM0PGYzMj4odW5pZm9ybXMuY29sb3IucmdiICogc2hhZG93QWxwaGEsIHVuaWZvcm1zLmNvbG9yLmEgKiBzaGFkb3dBbHBoYSk7XG5cbiAgICBpZiAoSVNfSU5ORVIgPT0gMXUpIHtcbiAgICAgICAgbGV0IGlubmVyU2hhZG93ID0gc2hhZG93Q29sb3IgKiBiYXNlQ29sb3IuYTtcbiAgICAgICAgaWYgKElTX0tOT0NLT1VUID09IDF1KSB7XG4gICAgICAgICAgICByZXR1cm4gaW5uZXJTaGFkb3c7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaW5uZXJTaGFkb3cgKyBiYXNlQ29sb3IgKiAoMS4wIC0gc2hhZG93Q29sb3IuYSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoSVNfSElERV9PQkpFQ1QgPT0gMXUpIHtcbiAgICAgICAgICAgIHJldHVybiBzaGFkb3dDb2xvcjtcbiAgICAgICAgfSBlbHNlIGlmIChJU19LTk9DS09VVCA9PSAxdSkge1xuICAgICAgICAgICAgcmV0dXJuIHNoYWRvd0NvbG9yICogKDEuMCAtIGJhc2VDb2xvci5hKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBzaGFkb3dDb2xvciAqICgxLjAgLSBiYXNlQ29sb3IuYSkgKyBiYXNlQ29sb3I7XG4gICAgICAgIH1cbiAgICB9XG59XG5gLG9hPWBcbiR7Q2l9XG5cbm92ZXJyaWRlIEdMT1dfVFlQRTogdTMyID0gMHU7XG5vdmVycmlkZSBJU19LTk9DS09VVDogdTMyID0gMHU7XG5cbnN0cnVjdCBHcmFkaWVudEdsb3dVbmlmb3JtcyB7XG4gICAgc3RyZW5ndGg6IGYzMixcbiAgICBfcGFkZGluZzE6IGYzMixcbiAgICBfcGFkZGluZzI6IGYzMixcbiAgICBfcGFkZGluZzM6IGYzMixcbiAgICBiYXNlU2NhbGU6IHZlYzI8ZjMyPixcbiAgICBiYXNlT2Zmc2V0OiB2ZWMyPGYzMj4sXG4gICAgYmx1clNjYWxlOiB2ZWMyPGYzMj4sXG4gICAgYmx1ck9mZnNldDogdmVjMjxmMzI+LFxufVxuXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyPHVuaWZvcm0+IHVuaWZvcm1zOiBHcmFkaWVudEdsb3dVbmlmb3JtcztcbkBncm91cCgwKSBAYmluZGluZygxKSB2YXIgdGV4dHVyZVNhbXBsZXI6IHNhbXBsZXI7XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMikgdmFyIGJsdXJUZXh0dXJlOiB0ZXh0dXJlXzJkPGYzMj47XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMykgdmFyIGJhc2VUZXh0dXJlOiB0ZXh0dXJlXzJkPGYzMj47XG5AZ3JvdXAoMCkgQGJpbmRpbmcoNCkgdmFyIGdyYWRpZW50TFVUOiB0ZXh0dXJlXzJkPGYzMj47XG4ke0FpfVxuXG5AZnJhZ21lbnRcbmZuIG1haW4oaW5wdXQ6IFZlcnRleE91dHB1dCkgLT4gQGxvY2F0aW9uKDApIHZlYzQ8ZjMyPiB7XG4gICAgbGV0IGJhc2VVViA9IGlucHV0LnRleENvb3JkICogdW5pZm9ybXMuYmFzZVNjYWxlIC0gdW5pZm9ybXMuYmFzZU9mZnNldDtcbiAgICBsZXQgYmFzZSA9IHRleHR1cmVTYW1wbGVMZXZlbChiYXNlVGV4dHVyZSwgdGV4dHVyZVNhbXBsZXIsIGJhc2VVViwgMCkgKiBpc0luc2lkZShiYXNlVVYpO1xuXG4gICAgbGV0IGJsdXJVViA9IGlucHV0LnRleENvb3JkICogdW5pZm9ybXMuYmx1clNjYWxlIC0gdW5pZm9ybXMuYmx1ck9mZnNldDtcbiAgICB2YXIgYmx1ciA9IHRleHR1cmVTYW1wbGVMZXZlbChibHVyVGV4dHVyZSwgdGV4dHVyZVNhbXBsZXIsIGJsdXJVViwgMCkgKiBpc0luc2lkZShibHVyVVYpO1xuXG4gICAgYmx1ci5hID0gY2xhbXAoYmx1ci5hICogdW5pZm9ybXMuc3RyZW5ndGgsIDAuMCwgMS4wKTtcbiAgICBsZXQgZ2xvd0NvbG9yID0gdGV4dHVyZVNhbXBsZUxldmVsKGdyYWRpZW50TFVULCB0ZXh0dXJlU2FtcGxlciwgdmVjMjxmMzI+KGJsdXIuYSwgMC41KSwgMCk7XG4gICAgdmFyIHJlc3VsdDogdmVjNDxmMzI+O1xuICAgIGlmIChHTE9XX1RZUEUgPT0gMHUpIHtcbiAgICAgICAgaWYgKElTX0tOT0NLT1VUID09IDF1KSB7XG4gICAgICAgICAgICByZXN1bHQgPSBnbG93Q29sb3I7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSBiYXNlIC0gYmFzZSAqIGdsb3dDb2xvci5hICsgZ2xvd0NvbG9yO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChHTE9XX1RZUEUgPT0gMXUpIHtcbiAgICAgICAgaWYgKElTX0tOT0NLT1VUID09IDF1KSB7XG4gICAgICAgICAgICByZXN1bHQgPSBnbG93Q29sb3IgKiBiYXNlLmE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSBnbG93Q29sb3IgKiBiYXNlLmEgKyBiYXNlICogKDEuMCAtIGdsb3dDb2xvci5hKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChJU19LTk9DS09VVCA9PSAxdSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gZ2xvd0NvbG9yIC0gZ2xvd0NvbG9yICogYmFzZS5hO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0gYmFzZSArIGdsb3dDb2xvciAtIGdsb3dDb2xvciAqIGJhc2UuYTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuYCxsYT1gXG4ke0NpfVxuXG5vdmVycmlkZSBCRVZFTF9UWVBFOiB1MzIgPSAwdTtcbm92ZXJyaWRlIElTX0tOT0NLT1VUOiB1MzIgPSAwdTtcblxuc3RydWN0IEdyYWRpZW50QmV2ZWxVbmlmb3JtcyB7XG4gICAgc3RyZW5ndGg6IGYzMixcbiAgICBfcGFkZGluZzE6IGYzMixcbiAgICBfcGFkZGluZzI6IGYzMixcbiAgICBfcGFkZGluZzM6IGYzMixcbiAgICBiYXNlU2NhbGU6IHZlYzI8ZjMyPixcbiAgICBiYXNlT2Zmc2V0OiB2ZWMyPGYzMj4sXG4gICAgYmx1clNjYWxlOiB2ZWMyPGYzMj4sXG4gICAgYmx1ck9mZnNldDogdmVjMjxmMzI+LFxufVxuXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyPHVuaWZvcm0+IHVuaWZvcm1zOiBHcmFkaWVudEJldmVsVW5pZm9ybXM7XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMSkgdmFyIHRleHR1cmVTYW1wbGVyOiBzYW1wbGVyO1xuQGdyb3VwKDApIEBiaW5kaW5nKDIpIHZhciBibHVyVGV4dHVyZTogdGV4dHVyZV8yZDxmMzI+O1xuQGdyb3VwKDApIEBiaW5kaW5nKDMpIHZhciBiYXNlVGV4dHVyZTogdGV4dHVyZV8yZDxmMzI+O1xuQGdyb3VwKDApIEBiaW5kaW5nKDQpIHZhciBncmFkaWVudExVVDogdGV4dHVyZV8yZDxmMzI+O1xuJHtBaX1cblxuQGZyYWdtZW50XG5mbiBtYWluKGlucHV0OiBWZXJ0ZXhPdXRwdXQpIC0+IEBsb2NhdGlvbigwKSB2ZWM0PGYzMj4ge1xuICAgIGxldCBiYXNlVVYgPSBpbnB1dC50ZXhDb29yZCAqIHVuaWZvcm1zLmJhc2VTY2FsZSAtIHVuaWZvcm1zLmJhc2VPZmZzZXQ7XG4gICAgbGV0IGJhc2UgPSB0ZXh0dXJlU2FtcGxlTGV2ZWwoYmFzZVRleHR1cmUsIHRleHR1cmVTYW1wbGVyLCBiYXNlVVYsIDApICogaXNJbnNpZGUoYmFzZVVWKTtcblxuICAgIGxldCBibHVyVVYgPSBpbnB1dC50ZXhDb29yZCAqIHVuaWZvcm1zLmJsdXJTY2FsZSAtIHVuaWZvcm1zLmJsdXJPZmZzZXQ7XG4gICAgbGV0IGJsdXIxID0gdGV4dHVyZVNhbXBsZUxldmVsKGJsdXJUZXh0dXJlLCB0ZXh0dXJlU2FtcGxlciwgYmx1clVWLCAwKSAqIGlzSW5zaWRlKGJsdXJVVik7XG5cbiAgICBsZXQgbWlycm9yVVYgPSAoMS4wIC0gaW5wdXQudGV4Q29vcmQpICogdW5pZm9ybXMuYmx1clNjYWxlIC0gdW5pZm9ybXMuYmx1ck9mZnNldDtcbiAgICBsZXQgYmx1cjIgPSB0ZXh0dXJlU2FtcGxlTGV2ZWwoYmx1clRleHR1cmUsIHRleHR1cmVTYW1wbGVyLCBtaXJyb3JVViwgMCkgKiBpc0luc2lkZShtaXJyb3JVVik7XG5cbiAgICB2YXIgaGlnaGxpZ2h0QWxwaGEgPSBibHVyMS5hIC0gYmx1cjIuYTtcbiAgICB2YXIgc2hhZG93QWxwaGEgPSBibHVyMi5hIC0gYmx1cjEuYTtcbiAgICBoaWdobGlnaHRBbHBoYSA9IGNsYW1wKGhpZ2hsaWdodEFscGhhICogdW5pZm9ybXMuc3RyZW5ndGgsIDAuMCwgMS4wKTtcbiAgICBzaGFkb3dBbHBoYSA9IGNsYW1wKHNoYWRvd0FscGhhICogdW5pZm9ybXMuc3RyZW5ndGgsIDAuMCwgMS4wKTtcblxuICAgIGxldCBsdXRDb29yZCA9IDAuNTAxOTYwNzg0MzEzNzI1NSAtIDAuNTAxOTYwNzg0MzEzNzI1NSAqIHNoYWRvd0FscGhhICsgMC40OTgwMzkyMTU2ODYyNzQ1ICogaGlnaGxpZ2h0QWxwaGE7XG4gICAgbGV0IGJldmVsQ29sb3IgPSB0ZXh0dXJlU2FtcGxlTGV2ZWwoZ3JhZGllbnRMVVQsIHRleHR1cmVTYW1wbGVyLCB2ZWMyPGYzMj4obHV0Q29vcmQsIDAuNSksIDApO1xuXG4gICAgdmFyIHJlc3VsdDogdmVjNDxmMzI+O1xuICAgIGlmIChCRVZFTF9UWVBFID09IDB1KSB7XG4gICAgICAgIGlmIChJU19LTk9DS09VVCA9PSAxdSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gYmV2ZWxDb2xvcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGJhc2UgLSBiYXNlICogYmV2ZWxDb2xvci5hICsgYmV2ZWxDb2xvcjtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoQkVWRUxfVFlQRSA9PSAxdSkge1xuICAgICAgICBpZiAoSVNfS05PQ0tPVVQgPT0gMXUpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGJldmVsQ29sb3IgKiBiYXNlLmE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSBiZXZlbENvbG9yICogYmFzZS5hICsgYmFzZSAqICgxLjAgLSBiZXZlbENvbG9yLmEpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKElTX0tOT0NLT1VUID09IDF1KSB7XG4gICAgICAgICAgICByZXN1bHQgPSBiZXZlbENvbG9yIC0gYmV2ZWxDb2xvciAqIGJhc2UuYTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGJhc2UgKyBiZXZlbENvbG9yIC0gYmV2ZWxDb2xvciAqIGJhc2UuYTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5gLGNhPWBcbiR7Q2l9XG5cbm92ZXJyaWRlIEJFVkVMX1RZUEU6IHUzMiA9IDB1O1xub3ZlcnJpZGUgSVNfS05PQ0tPVVQ6IHUzMiA9IDB1O1xuXG5zdHJ1Y3QgQmV2ZWxVbmlmb3JtcyB7XG4gICAgaGlnaGxpZ2h0Q29sb3I6IHZlYzQ8ZjMyPixcbiAgICBzaGFkb3dDb2xvcjogdmVjNDxmMzI+LFxuICAgIHN0cmVuZ3RoOiBmMzIsXG4gICAgX3BhZGRpbmcxOiBmMzIsXG4gICAgX3BhZGRpbmcyOiBmMzIsXG4gICAgX3BhZGRpbmczOiBmMzIsXG4gICAgYmFzZVNjYWxlOiB2ZWMyPGYzMj4sXG4gICAgYmFzZU9mZnNldDogdmVjMjxmMzI+LFxuICAgIGJsdXJTY2FsZTogdmVjMjxmMzI+LFxuICAgIGJsdXJPZmZzZXQ6IHZlYzI8ZjMyPixcbn1cblxuQGdyb3VwKDApIEBiaW5kaW5nKDApIHZhcjx1bmlmb3JtPiB1bmlmb3JtczogQmV2ZWxVbmlmb3JtcztcbkBncm91cCgwKSBAYmluZGluZygxKSB2YXIgdGV4dHVyZVNhbXBsZXI6IHNhbXBsZXI7XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMikgdmFyIGJsdXJUZXh0dXJlOiB0ZXh0dXJlXzJkPGYzMj47XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMykgdmFyIGJhc2VUZXh0dXJlOiB0ZXh0dXJlXzJkPGYzMj47XG4ke0FpfVxuXG5AZnJhZ21lbnRcbmZuIG1haW4oaW5wdXQ6IFZlcnRleE91dHB1dCkgLT4gQGxvY2F0aW9uKDApIHZlYzQ8ZjMyPiB7XG4gICAgbGV0IGJhc2VVViA9IGlucHV0LnRleENvb3JkICogdW5pZm9ybXMuYmFzZVNjYWxlIC0gdW5pZm9ybXMuYmFzZU9mZnNldDtcbiAgICBsZXQgYmFzZSA9IHRleHR1cmVTYW1wbGVMZXZlbChiYXNlVGV4dHVyZSwgdGV4dHVyZVNhbXBsZXIsIGJhc2VVViwgMCkgKiBpc0luc2lkZShiYXNlVVYpO1xuXG4gICAgbGV0IGJsdXJVViA9IGlucHV0LnRleENvb3JkICogdW5pZm9ybXMuYmx1clNjYWxlIC0gdW5pZm9ybXMuYmx1ck9mZnNldDtcbiAgICBsZXQgYmx1cjEgPSB0ZXh0dXJlU2FtcGxlTGV2ZWwoYmx1clRleHR1cmUsIHRleHR1cmVTYW1wbGVyLCBibHVyVVYsIDApICogaXNJbnNpZGUoYmx1clVWKTtcblxuICAgIGxldCBtaXJyb3JVViA9ICgxLjAgLSBpbnB1dC50ZXhDb29yZCkgKiB1bmlmb3Jtcy5ibHVyU2NhbGUgLSB1bmlmb3Jtcy5ibHVyT2Zmc2V0O1xuICAgIGxldCBibHVyMiA9IHRleHR1cmVTYW1wbGVMZXZlbChibHVyVGV4dHVyZSwgdGV4dHVyZVNhbXBsZXIsIG1pcnJvclVWLCAwKSAqIGlzSW5zaWRlKG1pcnJvclVWKTtcblxuICAgIHZhciBoaWdobGlnaHRBbHBoYSA9IGJsdXIxLmEgLSBibHVyMi5hO1xuICAgIHZhciBzaGFkb3dBbHBoYSA9IGJsdXIyLmEgLSBibHVyMS5hO1xuICAgIGhpZ2hsaWdodEFscGhhID0gY2xhbXAoaGlnaGxpZ2h0QWxwaGEgKiB1bmlmb3Jtcy5zdHJlbmd0aCwgMC4wLCAxLjApO1xuICAgIHNoYWRvd0FscGhhID0gY2xhbXAoc2hhZG93QWxwaGEgKiB1bmlmb3Jtcy5zdHJlbmd0aCwgMC4wLCAxLjApO1xuXG4gICAgbGV0IGJldmVsQ29sb3IgPSB1bmlmb3Jtcy5oaWdobGlnaHRDb2xvciAqIGhpZ2hsaWdodEFscGhhICsgdW5pZm9ybXMuc2hhZG93Q29sb3IgKiBzaGFkb3dBbHBoYTtcbiAgICB2YXIgcmVzdWx0OiB2ZWM0PGYzMj47XG4gICAgaWYgKEJFVkVMX1RZUEUgPT0gMHUpIHtcbiAgICAgICAgaWYgKElTX0tOT0NLT1VUID09IDF1KSB7XG4gICAgICAgICAgICByZXN1bHQgPSBiZXZlbENvbG9yO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0gYmFzZSAtIGJhc2UgKiBiZXZlbENvbG9yLmEgKyBiZXZlbENvbG9yO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChCRVZFTF9UWVBFID09IDF1KSB7XG4gICAgICAgIGlmIChJU19LTk9DS09VVCA9PSAxdSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gYmV2ZWxDb2xvciAqIGJhc2UuYTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGJldmVsQ29sb3IgKiBiYXNlLmEgKyBiYXNlICogKDEuMCAtIGJldmVsQ29sb3IuYSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoSVNfS05PQ0tPVVQgPT0gMXUpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGJldmVsQ29sb3IgLSBiZXZlbENvbG9yICogYmFzZS5hO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0gYmFzZSArIGJldmVsQ29sb3IgLSBiZXZlbENvbG9yICogYmFzZS5hO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmAsdWE9YFxuJHtDaX1cblxuc3RydWN0IEJldmVsQmFzZVVuaWZvcm1zIHtcbiAgICBvZmZzZXQ6IHZlYzI8ZjMyPixcbiAgICBfcGFkZGluZzogdmVjMjxmMzI+LFxufVxuXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyPHVuaWZvcm0+IHVuaWZvcm1zOiBCZXZlbEJhc2VVbmlmb3JtcztcbkBncm91cCgwKSBAYmluZGluZygxKSB2YXIgdGV4dHVyZVNhbXBsZXI6IHNhbXBsZXI7XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMikgdmFyIHNvdXJjZVRleHR1cmU6IHRleHR1cmVfMmQ8ZjMyPjtcbiR7QWl9XG5cbkBmcmFnbWVudFxuZm4gbWFpbihpbnB1dDogVmVydGV4T3V0cHV0KSAtPiBAbG9jYXRpb24oMCkgdmVjNDxmMzI+IHtcbiAgICBsZXQgb3JpZ2luYWwgPSB0ZXh0dXJlU2FtcGxlTGV2ZWwoc291cmNlVGV4dHVyZSwgdGV4dHVyZVNhbXBsZXIsIGlucHV0LnRleENvb3JkLCAwKTtcbiAgICBsZXQgc2hpZnRlZFVWID0gaW5wdXQudGV4Q29vcmQgLSB1bmlmb3Jtcy5vZmZzZXQ7XG4gICAgbGV0IHNoaWZ0ZWQgPSB0ZXh0dXJlU2FtcGxlTGV2ZWwoc291cmNlVGV4dHVyZSwgdGV4dHVyZVNhbXBsZXIsIHNoaWZ0ZWRVViwgMCkgKiBpc0luc2lkZShzaGlmdGVkVVYpO1xuICAgIHJldHVybiBvcmlnaW5hbCAqICgxLjAgLSBzaGlmdGVkLmEpO1xufVxuYDtjbGFzcyBmYXtzdGF0aWMgZ2V0RmlsbFZlcnRleFNoYWRlcigpe3JldHVybiBQaX1zdGF0aWMgZ2V0RmlsbE1haW5WZXJ0ZXhTaGFkZXIoKXtyZXR1cm4gUGl9c3RhdGljIGdldEZpbGxGcmFnbWVudFNoYWRlcigpe3JldHVybiJcbnN0cnVjdCBGcmFnbWVudElucHV0IHtcbiAgICBAYnVpbHRpbihwb3NpdGlvbikgcG9zaXRpb246IHZlYzQ8ZjMyPixcbiAgICBAbG9jYXRpb24oMCkgYmV6aWVyOiB2ZWMyPGYzMj4sXG4gICAgQGxvY2F0aW9uKDEpIGNvbG9yOiB2ZWM0PGYzMj4sXG59XG5cbkBmcmFnbWVudFxuZm4gbWFpbihpbnB1dDogRnJhZ21lbnRJbnB1dCkgLT4gQGxvY2F0aW9uKDApIHZlYzQ8ZjMyPiB7XG4gICAgbGV0IGZfdmFsID0gaW5wdXQuYmV6aWVyLnggKiBpbnB1dC5iZXppZXIueCAtIGlucHV0LmJlemllci55O1xuICAgIGxldCBkeCA9IGRwZHgoZl92YWwpO1xuICAgIGxldCBkeSA9IGRwZHkoZl92YWwpO1xuXG4gICAgaWYgKGlucHV0LmJlemllci54ID09IDAuNSAmJiBpbnB1dC5iZXppZXIueSA9PSAwLjUpIHtcbiAgICAgICAgcmV0dXJuIHZlYzQ8ZjMyPihpbnB1dC5jb2xvci5yZ2IgKiBpbnB1dC5jb2xvci5hLCBpbnB1dC5jb2xvci5hKTtcbiAgICB9XG5cbiAgICBsZXQgZGlzdCA9IGZfdmFsICogaW52ZXJzZVNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xuICAgIGxldCBjb3ZlcmFnZSA9IHNtb290aHN0ZXAoMC41LCAtMC41LCBkaXN0KTtcblxuICAgIGlmIChjb3ZlcmFnZSA8PSAwLjAwMSkge1xuICAgICAgICBkaXNjYXJkO1xuICAgIH1cblxuICAgIGxldCBmaW5hbEFscGhhID0gaW5wdXQuY29sb3IuYSAqIG1pbihjb3ZlcmFnZSwgMS4wKTtcbiAgICByZXR1cm4gdmVjNDxmMzI+KGlucHV0LmNvbG9yLnJnYiAqIGZpbmFsQWxwaGEsIGZpbmFsQWxwaGEpO1xufVxuIn1zdGF0aWMgZ2V0U3RlbmNpbFdyaXRlVmVydGV4U2hhZGVyKCl7cmV0dXJuIFNpfXN0YXRpYyBnZXRTdGVuY2lsV3JpdGVNYWluVmVydGV4U2hhZGVyKCl7cmV0dXJuIFNpfXN0YXRpYyBnZXRTdGVuY2lsV3JpdGVGcmFnbWVudFNoYWRlcigpe3JldHVybiJcbnN0cnVjdCBGcmFnbWVudElucHV0IHtcbiAgICBAYnVpbHRpbihwb3NpdGlvbikgcG9zaXRpb246IHZlYzQ8ZjMyPixcbiAgICBAbG9jYXRpb24oMCkgYmV6aWVyOiB2ZWMyPGYzMj4sXG59XG5cbkBmcmFnbWVudFxuZm4gbWFpbihpbnB1dDogRnJhZ21lbnRJbnB1dCkgLT4gQGxvY2F0aW9uKDApIHZlYzQ8ZjMyPiB7XG4gICAgbGV0IGZfdmFsID0gaW5wdXQuYmV6aWVyLnggKiBpbnB1dC5iZXppZXIueCAtIGlucHV0LmJlemllci55O1xuICAgIGxldCBkeCA9IGRwZHgoZl92YWwpO1xuICAgIGxldCBkeSA9IGRwZHkoZl92YWwpO1xuICAgIGxldCBkaXN0ID0gZl92YWwgKiBpbnZlcnNlU3FydChkeCAqIGR4ICsgZHkgKiBkeSk7XG4gICAgbGV0IGFscGhhID0gc21vb3Roc3RlcCgwLjUsIC0wLjUsIGRpc3QpO1xuXG4gICAgaWYgKGFscGhhIDw9IDAuMDAxKSB7XG4gICAgICAgIGRpc2NhcmQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZlYzQ8ZjMyPigwLjAsIDAuMCwgMC4wLCBtaW4oYWxwaGEsIDEuMCkpO1xufVxuIn1zdGF0aWMgZ2V0U3RlbmNpbEZpbGxWZXJ0ZXhTaGFkZXIoKXtyZXR1cm4gRml9c3RhdGljIGdldFN0ZW5jaWxGaWxsTWFpblZlcnRleFNoYWRlcigpe3JldHVybiBGaX1zdGF0aWMgZ2V0U3RlbmNpbEZpbGxGcmFnbWVudFNoYWRlcigpe3JldHVybiJcbnN0cnVjdCBGcmFnbWVudElucHV0IHtcbiAgICBAYnVpbHRpbihwb3NpdGlvbikgcG9zaXRpb246IHZlYzQ8ZjMyPixcbiAgICBAbG9jYXRpb24oMCkgY29sb3I6IHZlYzQ8ZjMyPixcbn1cblxuQGZyYWdtZW50XG5mbiBtYWluKGlucHV0OiBGcmFnbWVudElucHV0KSAtPiBAbG9jYXRpb24oMCkgdmVjNDxmMzI+IHtcbiAgICBsZXQgYSA9IGlucHV0LmNvbG9yLmE7XG4gICAgcmV0dXJuIHZlYzQ8ZjMyPihpbnB1dC5jb2xvci5yICogYSwgaW5wdXQuY29sb3IuZyAqIGEsIGlucHV0LmNvbG9yLmIgKiBhLCBhKTtcbn1cbiJ9c3RhdGljIGdldE1hc2tWZXJ0ZXhTaGFkZXIoKXtyZXR1cm4iXG5zdHJ1Y3QgVmVydGV4SW5wdXQge1xuICAgIEBsb2NhdGlvbigwKSBwb3NpdGlvbjogdmVjMjxmMzI+LFxuICAgIEBsb2NhdGlvbigxKSBiZXppZXI6IHZlYzI8ZjMyPixcbn1cblxuc3RydWN0IFZlcnRleE91dHB1dCB7XG4gICAgQGJ1aWx0aW4ocG9zaXRpb24pIHBvc2l0aW9uOiB2ZWM0PGYzMj4sXG4gICAgQGxvY2F0aW9uKDApIGJlemllcjogdmVjMjxmMzI+LFxufVxuXG5zdHJ1Y3QgVW5pZm9ybXMge1xuICAgIHZpZXdwb3J0U2l6ZTogdmVjMjxmMzI+LFxuICAgIF9wYWRkaW5nMDogdmVjMjxmMzI+LFxuICAgIG1hdHJpeENvbDA6IHZlYzM8ZjMyPixcbiAgICBfcGFkZGluZzE6IGYzMixcbiAgICBtYXRyaXhDb2wxOiB2ZWMzPGYzMj4sXG4gICAgX3BhZGRpbmcyOiBmMzIsXG4gICAgbWF0cml4Q29sMjogdmVjMzxmMzI+LFxuICAgIF9wYWRkaW5nMzogZjMyLFxufVxuXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyPHVuaWZvcm0+IHVuaWZvcm1zOiBVbmlmb3JtcztcblxuQHZlcnRleFxuZm4gbWFpbihpbnB1dDogVmVydGV4SW5wdXQpIC0+IFZlcnRleE91dHB1dCB7XG4gICAgdmFyIG91dHB1dDogVmVydGV4T3V0cHV0O1xuICAgIGxldCBtYXRyaXggPSBtYXQzeDM8ZjMyPih1bmlmb3Jtcy5tYXRyaXhDb2wwLCB1bmlmb3Jtcy5tYXRyaXhDb2wxLCB1bmlmb3Jtcy5tYXRyaXhDb2wyKTtcbiAgICBsZXQgdHJhbnNmb3JtZWQgPSBtYXRyaXggKiB2ZWMzPGYzMj4oaW5wdXQucG9zaXRpb24sIDEuMCk7XG4gICAgbGV0IHBvcyA9IHRyYW5zZm9ybWVkLnh5O1xuICAgIGxldCBuZGMgPSBwb3MgKiAyLjAgLSAxLjA7XG4gICAgb3V0cHV0LnBvc2l0aW9uID0gdmVjNDxmMzI+KG5kYy54LCAtbmRjLnksIDAuMCwgMS4wKTtcbiAgICBvdXRwdXQuYmV6aWVyID0gaW5wdXQuYmV6aWVyO1xuICAgIHJldHVybiBvdXRwdXQ7XG59XG4ifXN0YXRpYyBnZXRNYXNrRnJhZ21lbnRTaGFkZXIoKXtyZXR1cm4iXG5zdHJ1Y3QgRnJhZ21lbnRJbnB1dCB7XG4gICAgQGxvY2F0aW9uKDApIGJlemllcjogdmVjMjxmMzI+LFxufVxuXG5AZnJhZ21lbnRcbmZuIG1haW4oaW5wdXQ6IEZyYWdtZW50SW5wdXQpIC0+IEBsb2NhdGlvbigwKSB2ZWM0PGYzMj4ge1xuICAgIGxldCBweCA9IGRwZHgoaW5wdXQuYmV6aWVyKTtcbiAgICBsZXQgcHkgPSBkcGR5KGlucHV0LmJlemllcik7XG4gICAgbGV0IGYgPSAoMi4wICogaW5wdXQuYmV6aWVyLngpICogdmVjMjxmMzI+KHB4LngsIHB5LngpIC0gdmVjMjxmMzI+KHB4LnksIHB5LnkpO1xuICAgIGxldCBhbHBoYSA9IDAuNSAtIChpbnB1dC5iZXppZXIueCAqIGlucHV0LmJlemllci54IC0gaW5wdXQuYmV6aWVyLnkpIC8gbGVuZ3RoKGYpO1xuICAgIGlmIChhbHBoYSA8PSAwLjApIHtcbiAgICAgICAgZGlzY2FyZDtcbiAgICB9XG4gICAgcmV0dXJuIHZlYzQ8ZjMyPihtaW4oYWxwaGEsIDEuMCkpO1xufVxuIn1zdGF0aWMgZ2V0QmFzaWNWZXJ0ZXhTaGFkZXIoKXtyZXR1cm4gVGl9c3RhdGljIGdldEJhc2ljTWFpblZlcnRleFNoYWRlcigpe3JldHVybiBUaX1zdGF0aWMgZ2V0QmFzaWNGcmFnbWVudFNoYWRlcigpe3JldHVybiJcbnN0cnVjdCBWZXJ0ZXhPdXRwdXQge1xuICAgIEBidWlsdGluKHBvc2l0aW9uKSBwb3NpdGlvbjogdmVjNDxmMzI+LFxuICAgIEBsb2NhdGlvbigwKSB0ZXhDb29yZDogdmVjMjxmMzI+LFxuICAgIEBsb2NhdGlvbigxKSBjb2xvcjogdmVjNDxmMzI+LFxufVxuXG5AZnJhZ21lbnRcbmZuIG1haW4oaW5wdXQ6IFZlcnRleE91dHB1dCkgLT4gQGxvY2F0aW9uKDApIHZlYzQ8ZjMyPiB7XG4gICAgcmV0dXJuIGlucHV0LmNvbG9yO1xufVxuIn1zdGF0aWMgZ2V0VGV4dHVyZUZyYWdtZW50U2hhZGVyKCl7cmV0dXJuIlxuc3RydWN0IFZlcnRleE91dHB1dCB7XG4gICAgQGJ1aWx0aW4ocG9zaXRpb24pIHBvc2l0aW9uOiB2ZWM0PGYzMj4sXG4gICAgQGxvY2F0aW9uKDApIHRleENvb3JkOiB2ZWMyPGYzMj4sXG4gICAgQGxvY2F0aW9uKDEpIGNvbG9yOiB2ZWM0PGYzMj4sXG59XG5cbkBncm91cCgwKSBAYmluZGluZygxKSB2YXIgdGV4dHVyZVNhbXBsZXI6IHNhbXBsZXI7XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMikgdmFyIHRleHR1cmVEYXRhOiB0ZXh0dXJlXzJkPGYzMj47XG5cbkBmcmFnbWVudFxuZm4gbWFpbihpbnB1dDogVmVydGV4T3V0cHV0KSAtPiBAbG9jYXRpb24oMCkgdmVjNDxmMzI+IHtcbiAgICBsZXQgdGV4dHVyZUNvbG9yID0gdGV4dHVyZVNhbXBsZUxldmVsKHRleHR1cmVEYXRhLCB0ZXh0dXJlU2FtcGxlciwgaW5wdXQudGV4Q29vcmQsIDApO1xuICAgIHJldHVybiB0ZXh0dXJlQ29sb3IgKiBpbnB1dC5jb2xvcjtcbn1cbiJ9c3RhdGljIGdldEluc3RhbmNlZFZlcnRleFNoYWRlcigpe3JldHVybiJcbnN0cnVjdCBWZXJ0ZXhJbnB1dCB7XG4gICAgQGxvY2F0aW9uKDApIHBvc2l0aW9uOiB2ZWMyPGYzMj4sXG4gICAgQGxvY2F0aW9uKDEpIHRleENvb3JkOiB2ZWMyPGYzMj4sXG59XG5cbnN0cnVjdCBJbnN0YW5jZUlucHV0IHtcbiAgICBAbG9jYXRpb24oMikgdGV4dHVyZVJlY3Q6IHZlYzQ8ZjMyPixcbiAgICBAbG9jYXRpb24oMykgdGV4dHVyZURpbTogdmVjNDxmMzI+LFxuICAgIEBsb2NhdGlvbig0KSBtYXRyaXhUeDogdmVjNDxmMzI+LFxuICAgIEBsb2NhdGlvbig1KSBtYXRyaXhTY2FsZTogdmVjNDxmMzI+LFxuICAgIEBsb2NhdGlvbig2KSBtdWxDb2xvcjogdmVjNDxmMzI+LFxuICAgIEBsb2NhdGlvbig3KSBhZGRDb2xvcjogdmVjNDxmMzI+LFxufVxuXG5zdHJ1Y3QgVmVydGV4T3V0cHV0IHtcbiAgICBAYnVpbHRpbihwb3NpdGlvbikgcG9zaXRpb246IHZlYzQ8ZjMyPixcbiAgICBAbG9jYXRpb24oMCkgdGV4Q29vcmQ6IHZlYzI8ZjMyPixcbiAgICBAbG9jYXRpb24oMSkgbXVsQ29sb3I6IHZlYzQ8ZjMyPixcbiAgICBAbG9jYXRpb24oMikgYWRkQ29sb3I6IHZlYzQ8ZjMyPixcbn1cblxuQHZlcnRleFxuZm4gbWFpbihcbiAgICBpbnB1dDogVmVydGV4SW5wdXQsXG4gICAgaW5zdGFuY2U6IEluc3RhbmNlSW5wdXQsXG4gICAgQGJ1aWx0aW4oaW5zdGFuY2VfaW5kZXgpIGluc3RhbmNlSWR4OiB1MzJcbikgLT4gVmVydGV4T3V0cHV0IHtcbiAgICB2YXIgb3V0cHV0OiBWZXJ0ZXhPdXRwdXQ7XG4gICAgbGV0IHRleFggPSBpbnN0YW5jZS50ZXh0dXJlUmVjdC54ICsgaW5wdXQudGV4Q29vcmQueCAqIGluc3RhbmNlLnRleHR1cmVSZWN0Lno7XG4gICAgbGV0IHRleFkgPSBpbnN0YW5jZS50ZXh0dXJlUmVjdC55ICsgaW5wdXQudGV4Q29vcmQueSAqIGluc3RhbmNlLnRleHR1cmVSZWN0Lnc7XG4gICAgb3V0cHV0LnRleENvb3JkID0gdmVjMjxmMzI+KHRleFgsIHRleFkpO1xuICAgIHZhciBwb3MgPSB2ZWMyPGYzMj4oaW5wdXQucG9zaXRpb24ueCwgMS4wIC0gaW5wdXQucG9zaXRpb24ueSk7XG4gICAgcG9zID0gcG9zICogdmVjMjxmMzI+KGluc3RhbmNlLnRleHR1cmVEaW0ueCwgaW5zdGFuY2UudGV4dHVyZURpbS55KTtcbiAgICBsZXQgc2NhbGUwID0gaW5zdGFuY2UubWF0cml4U2NhbGUueDtcbiAgICBsZXQgcm90YXRlMCA9IGluc3RhbmNlLm1hdHJpeFNjYWxlLnk7XG4gICAgbGV0IHNjYWxlMSA9IGluc3RhbmNlLm1hdHJpeFNjYWxlLno7XG4gICAgbGV0IHJvdGF0ZTEgPSBpbnN0YW5jZS5tYXRyaXhTY2FsZS53O1xuICAgIGxldCB0cmFuc2Zvcm1lZFggPSBwb3MueCAqIHNjYWxlMCArIHBvcy55ICogc2NhbGUxICsgaW5zdGFuY2UubWF0cml4VHgueDtcbiAgICBsZXQgdHJhbnNmb3JtZWRZID0gcG9zLnggKiByb3RhdGUwICsgcG9zLnkgKiByb3RhdGUxICsgaW5zdGFuY2UubWF0cml4VHgueTtcbiAgICB2YXIgcG9zaXRpb24gPSB2ZWMyPGYzMj4odHJhbnNmb3JtZWRYLCB0cmFuc2Zvcm1lZFkpIC8gdmVjMjxmMzI+KGluc3RhbmNlLnRleHR1cmVEaW0ueiwgaW5zdGFuY2UudGV4dHVyZURpbS53KTtcbiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uICogMi4wIC0gMS4wO1xuICAgIG91dHB1dC5wb3NpdGlvbiA9IHZlYzQ8ZjMyPihwb3NpdGlvbi54LCAtcG9zaXRpb24ueSwgMC4wLCAxLjApO1xuICAgIG91dHB1dC5tdWxDb2xvciA9IGluc3RhbmNlLm11bENvbG9yO1xuICAgIG91dHB1dC5hZGRDb2xvciA9IGluc3RhbmNlLmFkZENvbG9yO1xuICAgIHJldHVybiBvdXRwdXQ7XG59XG4ifXN0YXRpYyBnZXRJbnN0YW5jZWRGcmFnbWVudFNoYWRlcigpe3JldHVybiJcbnN0cnVjdCBWZXJ0ZXhPdXRwdXQge1xuICAgIEBidWlsdGluKHBvc2l0aW9uKSBwb3NpdGlvbjogdmVjNDxmMzI+LFxuICAgIEBsb2NhdGlvbigwKSB0ZXhDb29yZDogdmVjMjxmMzI+LFxuICAgIEBsb2NhdGlvbigxKSBtdWxDb2xvcjogdmVjNDxmMzI+LFxuICAgIEBsb2NhdGlvbigyKSBhZGRDb2xvcjogdmVjNDxmMzI+LFxufVxuXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyIHRleHR1cmVTYW1wbGVyOiBzYW1wbGVyO1xuQGdyb3VwKDApIEBiaW5kaW5nKDEpIHZhciB0ZXh0dXJlRGF0YTogdGV4dHVyZV8yZDxmMzI+O1xuXG5AZnJhZ21lbnRcbmZuIG1haW4oaW5wdXQ6IFZlcnRleE91dHB1dCkgLT4gQGxvY2F0aW9uKDApIHZlYzQ8ZjMyPiB7XG4gICAgdmFyIHNyYyA9IHRleHR1cmVTYW1wbGUodGV4dHVyZURhdGEsIHRleHR1cmVTYW1wbGVyLCBpbnB1dC50ZXhDb29yZCk7XG4gICAgc3JjID0gdmVjNDxmMzI+KHNyYy5yZ2IgLyBtYXgoMC4wMDAxLCBzcmMuYSksIHNyYy5hKTtcbiAgICBzcmMgPSBjbGFtcChzcmMgKiBpbnB1dC5tdWxDb2xvciArIGlucHV0LmFkZENvbG9yLCB2ZWM0PGYzMj4oMC4wKSwgdmVjNDxmMzI+KDEuMCkpO1xuICAgIHNyYyA9IHZlYzQ8ZjMyPihzcmMucmdiICogc3JjLmEsIHNyYy5hKTtcbiAgICByZXR1cm4gc3JjO1xufVxuIn1zdGF0aWMgZ2V0R3JhZGllbnRGaWxsVmVydGV4U2hhZGVyKCl7cmV0dXJuIEJpfXN0YXRpYyBnZXRHcmFkaWVudEZpbGxNYWluVmVydGV4U2hhZGVyKCl7cmV0dXJuIEJpfXN0YXRpYyBnZXRHcmFkaWVudEZpbGxGcmFnbWVudFNoYWRlcigpe3JldHVybiBZaX1zdGF0aWMgZ2V0R3JhZGllbnRGaWxsU3RlbmNpbEZyYWdtZW50U2hhZGVyKCl7cmV0dXJuIEtpfXN0YXRpYyBnZXRHcmFkaWVudEZyYWdtZW50U2hhZGVyKCl7cmV0dXJuIEhpfXN0YXRpYyBnZXRCaXRtYXBGaWxsVmVydGV4U2hhZGVyKCl7cmV0dXJuIE9pfXN0YXRpYyBnZXRCaXRtYXBGaWxsTWFpblZlcnRleFNoYWRlcigpe3JldHVybiBPaX1zdGF0aWMgZ2V0Qml0bWFwRmlsbEZyYWdtZW50U2hhZGVyKCl7cmV0dXJuIlxuc3RydWN0IFZlcnRleE91dHB1dCB7XG4gICAgQGJ1aWx0aW4ocG9zaXRpb24pIHBvc2l0aW9uOiB2ZWM0PGYzMj4sXG4gICAgQGxvY2F0aW9uKDApIGJlemllcjogdmVjMjxmMzI+LFxuICAgIEBsb2NhdGlvbigxKSBjb2xvcjogdmVjNDxmMzI+LFxuICAgIEBsb2NhdGlvbigyKSB3b3JsZFBvczogdmVjMjxmMzI+LFxufVxuXG5zdHJ1Y3QgQml0bWFwVW5pZm9ybXMge1xuICAgIGJpdG1hcE1hdHJpeDogbWF0M3gzPGYzMj4sXG4gICAgdGV4dHVyZVdpZHRoOiBmMzIsXG4gICAgdGV4dHVyZUhlaWdodDogZjMyLFxuICAgIHJlcGVhdDogZjMyLFxuICAgIF9wYWQ6IGYzMixcbn1cblxuQGdyb3VwKDApIEBiaW5kaW5nKDApIHZhcjx1bmlmb3JtPiB1bmlmb3JtczogQml0bWFwVW5pZm9ybXM7XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMSkgdmFyIGJpdG1hcFNhbXBsZXI6IHNhbXBsZXI7XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMikgdmFyIGJpdG1hcFRleHR1cmU6IHRleHR1cmVfMmQ8ZjMyPjtcblxuQGZyYWdtZW50XG5mbiBtYWluKGlucHV0OiBWZXJ0ZXhPdXRwdXQpIC0+IEBsb2NhdGlvbigwKSB2ZWM0PGYzMj4ge1xuICAgIGxldCB1ID0gaW5wdXQuYmV6aWVyLng7XG4gICAgbGV0IHYgPSBpbnB1dC5iZXppZXIueTtcbiAgICBpZiAoYWJzKHUgLSAwLjUpID4gMC4wMDEgfHwgYWJzKHYgLSAwLjUpID4gMC4wMDEpIHtcbiAgICAgICAgbGV0IGQgPSB1ICogdSAtIHY7XG4gICAgICAgIGlmIChkID4gMC4wKSB7XG4gICAgICAgICAgICBkaXNjYXJkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCB0cmFuc2Zvcm1lZFBvcyA9IHVuaWZvcm1zLmJpdG1hcE1hdHJpeCAqIHZlYzM8ZjMyPihpbnB1dC53b3JsZFBvcywgMS4wKTtcbiAgICB2YXIgdXYgPSB2ZWMyPGYzMj4oXG4gICAgICAgIHRyYW5zZm9ybWVkUG9zLnggLyB1bmlmb3Jtcy50ZXh0dXJlV2lkdGgsXG4gICAgICAgIHRyYW5zZm9ybWVkUG9zLnkgLyB1bmlmb3Jtcy50ZXh0dXJlSGVpZ2h0XG4gICAgKTtcbiAgICBpZiAodW5pZm9ybXMucmVwZWF0ID4gMC41KSB7XG4gICAgICAgIHV2ID0gZnJhY3QodXYpO1xuICAgIH1cbiAgICBsZXQgYml0bWFwQ29sb3IgPSB0ZXh0dXJlU2FtcGxlTGV2ZWwoYml0bWFwVGV4dHVyZSwgYml0bWFwU2FtcGxlciwgdXYsIDApO1xuICAgIGxldCBhbHBoYSA9IGJpdG1hcENvbG9yLmEgKiBpbnB1dC5jb2xvci5hO1xuICAgIHJldHVybiB2ZWM0PGYzMj4oYml0bWFwQ29sb3IucmdiICogaW5wdXQuY29sb3IuYSwgYWxwaGEpO1xufVxuIn1zdGF0aWMgZ2V0QmxlbmRGcmFnbWVudFNoYWRlcigpe3JldHVybiJcbnN0cnVjdCBWZXJ0ZXhPdXRwdXQge1xuICAgIEBidWlsdGluKHBvc2l0aW9uKSBwb3NpdGlvbjogdmVjNDxmMzI+LFxuICAgIEBsb2NhdGlvbigwKSB0ZXhDb29yZDogdmVjMjxmMzI+LFxuICAgIEBsb2NhdGlvbigxKSBjb2xvcjogdmVjNDxmMzI+LFxufVxuXG5zdHJ1Y3QgQmxlbmRVbmlmb3JtcyB7XG4gICAgYmxlbmRNb2RlOiBmMzIsXG59XG5cbkBncm91cCgwKSBAYmluZGluZygxKSB2YXI8dW5pZm9ybT4gYmxlbmQ6IEJsZW5kVW5pZm9ybXM7XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMikgdmFyIHNyY1NhbXBsZXI6IHNhbXBsZXI7XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMykgdmFyIHNyY1RleHR1cmU6IHRleHR1cmVfMmQ8ZjMyPjtcbkBncm91cCgwKSBAYmluZGluZyg0KSB2YXIgZHN0U2FtcGxlcjogc2FtcGxlcjtcbkBncm91cCgwKSBAYmluZGluZyg1KSB2YXIgZHN0VGV4dHVyZTogdGV4dHVyZV8yZDxmMzI+O1xuXG5mbiBibGVuZE5vcm1hbChzcmM6IHZlYzQ8ZjMyPiwgZHN0OiB2ZWM0PGYzMj4pIC0+IHZlYzQ8ZjMyPiB7XG4gICAgcmV0dXJuIHNyYztcbn1cblxuZm4gYmxlbmRNdWx0aXBseShzcmM6IHZlYzQ8ZjMyPiwgZHN0OiB2ZWM0PGYzMj4pIC0+IHZlYzQ8ZjMyPiB7XG4gICAgcmV0dXJuIHNyYyAqIGRzdDtcbn1cblxuZm4gYmxlbmRTY3JlZW4oc3JjOiB2ZWM0PGYzMj4sIGRzdDogdmVjNDxmMzI+KSAtPiB2ZWM0PGYzMj4ge1xuICAgIHJldHVybiBzcmMgKyBkc3QgLSBzcmMgKiBkc3Q7XG59XG5cbmZuIGJsZW5kQWRkKHNyYzogdmVjNDxmMzI+LCBkc3Q6IHZlYzQ8ZjMyPikgLT4gdmVjNDxmMzI+IHtcbiAgICByZXR1cm4gbWluKHNyYyArIGRzdCwgdmVjNDxmMzI+KDEuMCkpO1xufVxuXG5AZnJhZ21lbnRcbmZuIG1haW4oaW5wdXQ6IFZlcnRleE91dHB1dCkgLT4gQGxvY2F0aW9uKDApIHZlYzQ8ZjMyPiB7XG4gICAgbGV0IHNyYyA9IHRleHR1cmVTYW1wbGVMZXZlbChzcmNUZXh0dXJlLCBzcmNTYW1wbGVyLCBpbnB1dC50ZXhDb29yZCwgMCk7XG4gICAgbGV0IGRzdCA9IHRleHR1cmVTYW1wbGVMZXZlbChkc3RUZXh0dXJlLCBkc3RTYW1wbGVyLCBpbnB1dC50ZXhDb29yZCwgMCk7XG4gICAgdmFyIHJlc3VsdDogdmVjNDxmMzI+O1xuICAgIGlmIChibGVuZC5ibGVuZE1vZGUgPCAwLjUpIHtcbiAgICAgICAgcmVzdWx0ID0gYmxlbmROb3JtYWwoc3JjLCBkc3QpO1xuICAgIH0gZWxzZSBpZiAoYmxlbmQuYmxlbmRNb2RlIDwgMS41KSB7XG4gICAgICAgIHJlc3VsdCA9IGJsZW5kTXVsdGlwbHkoc3JjLCBkc3QpO1xuICAgIH0gZWxzZSBpZiAoYmxlbmQuYmxlbmRNb2RlIDwgMi41KSB7XG4gICAgICAgIHJlc3VsdCA9IGJsZW5kU2NyZWVuKHNyYywgZHN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBibGVuZEFkZChzcmMsIGRzdCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQgKiBpbnB1dC5jb2xvcjtcbn1cbiJ9c3RhdGljIGdldEJsdXJGaWx0ZXJWZXJ0ZXhTaGFkZXIoKXtyZXR1cm4gVWl9c3RhdGljIGdldEJpdG1hcFN5bmNWZXJ0ZXhTaGFkZXIoKXtyZXR1cm4gTGl9c3RhdGljIGdldEJpdG1hcFN5bmNGcmFnbWVudFNoYWRlcigpe3JldHVybiBpYX1zdGF0aWMgZ2V0Qmx1ckZpbHRlckZyYWdtZW50U2hhZGVyKGUpe2NvbnN0IHQ9ZS50b0ZpeGVkKDEpO3JldHVybmBcbiR7Q2l9XG5cbnN0cnVjdCBCbHVyVW5pZm9ybXMge1xuICAgIG9mZnNldDogdmVjMjxmMzI+LFxuICAgIGZyYWN0aW9uOiBmMzIsXG4gICAgc2FtcGxlczogZjMyLFxufVxuXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyPHVuaWZvcm0+IHVuaWZvcm1zOiBCbHVyVW5pZm9ybXM7XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMSkgdmFyIHRleHR1cmVTYW1wbGVyOiBzYW1wbGVyO1xuQGdyb3VwKDApIEBiaW5kaW5nKDIpIHZhciBpbnB1dFRleHR1cmU6IHRleHR1cmVfMmQ8ZjMyPjtcblxuQGZyYWdtZW50XG5mbiBtYWluKGlucHV0OiBWZXJ0ZXhPdXRwdXQpIC0+IEBsb2NhdGlvbigwKSB2ZWM0PGYzMj4ge1xuICAgIGxldCBvZmZzZXQgPSB1bmlmb3Jtcy5vZmZzZXQ7XG4gICAgbGV0IGZyYWN0aW9uID0gdW5pZm9ybXMuZnJhY3Rpb247XG4gICAgbGV0IHNhbXBsZXMgPSB1bmlmb3Jtcy5zYW1wbGVzO1xuICAgIHZhciBjb2xvciA9IHRleHR1cmVTYW1wbGUoaW5wdXRUZXh0dXJlLCB0ZXh0dXJlU2FtcGxlciwgaW5wdXQudGV4Q29vcmQpO1xuICAgIGZvciAodmFyIGk6IGYzMiA9IDEuMDsgaSA8ICR7dH07IGkgKz0gMS4wKSB7XG4gICAgICAgIGNvbG9yICs9IHRleHR1cmVTYW1wbGUoaW5wdXRUZXh0dXJlLCB0ZXh0dXJlU2FtcGxlciwgaW5wdXQudGV4Q29vcmQgKyBvZmZzZXQgKiBpKTtcbiAgICAgICAgY29sb3IgKz0gdGV4dHVyZVNhbXBsZShpbnB1dFRleHR1cmUsIHRleHR1cmVTYW1wbGVyLCBpbnB1dC50ZXhDb29yZCAtIG9mZnNldCAqIGkpO1xuICAgIH1cbiAgICBjb2xvciArPSB0ZXh0dXJlU2FtcGxlKGlucHV0VGV4dHVyZSwgdGV4dHVyZVNhbXBsZXIsIGlucHV0LnRleENvb3JkICsgb2Zmc2V0ICogJHt0fSkgKiBmcmFjdGlvbjtcbiAgICBjb2xvciArPSB0ZXh0dXJlU2FtcGxlKGlucHV0VGV4dHVyZSwgdGV4dHVyZVNhbXBsZXIsIGlucHV0LnRleENvb3JkIC0gb2Zmc2V0ICogJHt0fSkgKiBmcmFjdGlvbjtcbiAgICBjb2xvciAvPSBzYW1wbGVzO1xuICAgIHJldHVybiBjb2xvcjtcbn1cbmB9c3RhdGljIGdldFRleHR1cmVDb3B5RnJhZ21lbnRTaGFkZXIoKXtyZXR1cm4gUWl9c3RhdGljIGdldEJsdXJUZXh0dXJlQ29weUZyYWdtZW50U2hhZGVyKCl7cmV0dXJuIFppfXN0YXRpYyBnZXRGaWx0ZXJPdXRwdXRGcmFnbWVudFNoYWRlcigpe3JldHVybiBKaX1zdGF0aWMgZ2V0Q29sb3JUcmFuc2Zvcm1GcmFnbWVudFNoYWRlcigpe3JldHVybiBlYX1zdGF0aWMgZ2V0WUZsaXBDb2xvclRyYW5zZm9ybUZyYWdtZW50U2hhZGVyKCl7cmV0dXJuIHRhfXN0YXRpYyBnZXRDb2xvck1hdHJpeEZpbHRlckZyYWdtZW50U2hhZGVyKCl7cmV0dXJuIHJhfXN0YXRpYyBnZXRHbG93RmlsdGVyRnJhZ21lbnRTaGFkZXIoKXtyZXR1cm4gYWF9c3RhdGljIGdldERyb3BTaGFkb3dGaWx0ZXJGcmFnbWVudFNoYWRlcigpe3JldHVybiBzYX1zdGF0aWMgZ2V0R3JhZGllbnRHbG93RmlsdGVyRnJhZ21lbnRTaGFkZXIoKXtyZXR1cm4gb2F9c3RhdGljIGdldEdyYWRpZW50QmV2ZWxGaWx0ZXJGcmFnbWVudFNoYWRlcigpe3JldHVybiBsYX1zdGF0aWMgZ2V0QmV2ZWxGaWx0ZXJGcmFnbWVudFNoYWRlcigpe3JldHVybiBjYX1zdGF0aWMgZ2V0QmV2ZWxCYXNlRnJhZ21lbnRTaGFkZXIoKXtyZXR1cm4gdWF9c3RhdGljIGdldENvbnZvbHV0aW9uRmlsdGVyRnJhZ21lbnRTaGFkZXIoZSx0LHI9ITAsbj0hMCl7Y29uc3QgaT1NYXRoLmZsb29yKC41KmUpLGE9TWF0aC5mbG9vciguNSp0KSxzPWUqdDtsZXQgbz0iIjtmb3IobGV0IGU9MDtlPHM7ZSsrKW8rPWBcbiAgICByZXN1bHQgPSByZXN1bHQgKyBnZXRXZWlnaHRlZENvbG9yKCR7ZX0sIGdldE1hdHJpeFdlaWdodCgke2V9KSk7YDtjb25zdCBsPXI/InJlc3VsdC5hID0gdGV4dHVyZVNhbXBsZShzb3VyY2VUZXh0dXJlLCBzb3VyY2VTYW1wbGVyLCBpbnB1dC50ZXhDb29yZCkuYTsiOiIiLGM9bj8iIjoiXG4gICAgbGV0IHN1YnN0aXR1dGVDb2xvciA9IHVuaWZvcm1zLnN1YnN0aXR1dGVDb2xvcjtcbiAgICBjb2xvciA9IG1peChzdWJzdGl0dXRlQ29sb3IsIGNvbG9yLCBpc0luc2lkZSh1dikpOyI7cmV0dXJuYFxuc3RydWN0IENvbnZvbHV0aW9uVW5pZm9ybXMge1xuICAgIHJjcFNpemU6IHZlYzI8ZjMyPixcbiAgICByY3BEaXZpc29yOiBmMzIsXG4gICAgYmlhczogZjMyLFxuICAgIHN1YnN0aXR1dGVDb2xvcjogdmVjNDxmMzI+LFxuICAgIG1hdHJpeDogYXJyYXk8dmVjNDxmMzI+LCAke01hdGguY2VpbChzLzQpfT4sXG59XG5cbkBncm91cCgwKSBAYmluZGluZygwKSB2YXI8dW5pZm9ybT4gdW5pZm9ybXM6IENvbnZvbHV0aW9uVW5pZm9ybXM7XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMSkgdmFyIHNvdXJjZVNhbXBsZXI6IHNhbXBsZXI7XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMikgdmFyIHNvdXJjZVRleHR1cmU6IHRleHR1cmVfMmQ8ZjMyPjtcblxuJHtDaX1cblxuJHtBaX1cblxuZm4gZ2V0TWF0cml4V2VpZ2h0KGluZGV4OiBpMzIpIC0+IGYzMiB7XG4gICAgbGV0IHZlY0luZGV4ID0gaW5kZXggLyA0O1xuICAgIGxldCBjb21wb25lbnQgPSBpbmRleCAlIDQ7XG4gICAgbGV0IHZlYyA9IHVuaWZvcm1zLm1hdHJpeFt2ZWNJbmRleF07XG4gICAgaWYgKGNvbXBvbmVudCA9PSAwKSB7IHJldHVybiB2ZWMueDsgfVxuICAgIGVsc2UgaWYgKGNvbXBvbmVudCA9PSAxKSB7IHJldHVybiB2ZWMueTsgfVxuICAgIGVsc2UgaWYgKGNvbXBvbmVudCA9PSAyKSB7IHJldHVybiB2ZWMuejsgfVxuICAgIGVsc2UgeyByZXR1cm4gdmVjLnc7IH1cbn1cblxuZm4gZ2V0V2VpZ2h0ZWRDb2xvcihpOiBpMzIsIHdlaWdodDogZjMyKSAtPiB2ZWM0PGYzMj4ge1xuICAgIGxldCByY3BTaXplID0gdW5pZm9ybXMucmNwU2l6ZTtcbiAgICBsZXQgaURpdlggPSBpIC8gJHtlfTtcbiAgICBsZXQgaU1vZFggPSBpIC0gJHtlfSAqIGlEaXZYO1xuICAgIGxldCBvZmZzZXQgPSB2ZWMyPGYzMj4oZjMyKGlNb2RYIC0gJHtpfSksIGYzMigke2F9IC0gaURpdlgpKTtcbiAgICB2YXIgdXYgPSBpbnB1dC50ZXhDb29yZCArIG9mZnNldCAqIHJjcFNpemU7XG4gICAgdmFyIGNvbG9yID0gdGV4dHVyZVNhbXBsZShzb3VyY2VUZXh0dXJlLCBzb3VyY2VTYW1wbGVyLCB1dik7XG4gICAgY29sb3IgPSB2ZWM0PGYzMj4oY29sb3IucmdiIC8gbWF4KDAuMDAwMSwgY29sb3IuYSksIGNvbG9yLmEpO1xuICAgICR7Y31cbiAgICByZXR1cm4gY29sb3IgKiB3ZWlnaHQ7XG59XG5cbnZhcjxwcml2YXRlPiBpbnB1dDogVmVydGV4T3V0cHV0O1xuXG5AdmVydGV4XG5mbiB2c19tYWluKEBidWlsdGluKHZlcnRleF9pbmRleCkgdmVydGV4SW5kZXg6IHUzMikgLT4gVmVydGV4T3V0cHV0IHtcbiAgICB2YXIgcG9zaXRpb25zID0gYXJyYXk8dmVjMjxmMzI+LCA2PihcbiAgICAgICAgdmVjMjxmMzI+KC0xLjAsIC0xLjApLFxuICAgICAgICB2ZWMyPGYzMj4oMS4wLCAtMS4wKSxcbiAgICAgICAgdmVjMjxmMzI+KC0xLjAsIDEuMCksXG4gICAgICAgIHZlYzI8ZjMyPigtMS4wLCAxLjApLFxuICAgICAgICB2ZWMyPGYzMj4oMS4wLCAtMS4wKSxcbiAgICAgICAgdmVjMjxmMzI+KDEuMCwgMS4wKVxuICAgICk7XG4gICAgdmFyIHRleENvb3JkcyA9IGFycmF5PHZlYzI8ZjMyPiwgNj4oXG4gICAgICAgIHZlYzI8ZjMyPigwLjAsIDEuMCksXG4gICAgICAgIHZlYzI8ZjMyPigxLjAsIDEuMCksXG4gICAgICAgIHZlYzI8ZjMyPigwLjAsIDAuMCksXG4gICAgICAgIHZlYzI8ZjMyPigwLjAsIDAuMCksXG4gICAgICAgIHZlYzI8ZjMyPigxLjAsIDEuMCksXG4gICAgICAgIHZlYzI8ZjMyPigxLjAsIDAuMClcbiAgICApO1xuICAgIHZhciBvdXRwdXQ6IFZlcnRleE91dHB1dDtcbiAgICBvdXRwdXQucG9zaXRpb24gPSB2ZWM0PGYzMj4ocG9zaXRpb25zW3ZlcnRleEluZGV4XSwgMC4wLCAxLjApO1xuICAgIG91dHB1dC50ZXhDb29yZCA9IHRleENvb3Jkc1t2ZXJ0ZXhJbmRleF07XG4gICAgcmV0dXJuIG91dHB1dDtcbn1cblxuQGZyYWdtZW50XG5mbiBmc19tYWluKGZyYWdJbnB1dDogVmVydGV4T3V0cHV0KSAtPiBAbG9jYXRpb24oMCkgdmVjNDxmMzI+IHtcbiAgICBpbnB1dCA9IGZyYWdJbnB1dDtcbiAgICBsZXQgcmNwRGl2aXNvciA9IHVuaWZvcm1zLnJjcERpdmlzb3I7XG4gICAgbGV0IGJpYXMgPSB1bmlmb3Jtcy5iaWFzO1xuICAgIHZhciByZXN1bHQgPSB2ZWM0PGYzMj4oMC4wKTtcbiAgICAke299XG4gICAgcmVzdWx0ID0gY2xhbXAocmVzdWx0ICogcmNwRGl2aXNvciArIGJpYXMsIHZlYzQ8ZjMyPigwLjApLCB2ZWM0PGYzMj4oMS4wKSk7XG4gICAgJHtsfVxuICAgIHJlc3VsdCA9IHZlYzQ8ZjMyPihyZXN1bHQucmdiICogcmVzdWx0LmEsIHJlc3VsdC5hKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuYH1zdGF0aWMgZ2V0Q29tcGxleEJsZW5kRnJhZ21lbnRTaGFkZXIoKXtyZXR1cm4gZmEuZ2V0VW5pZmllZENvbXBsZXhCbGVuZEZyYWdtZW50U2hhZGVyKCl9c3RhdGljIGdldEJsZW5kTW9kZUluZGV4KGUpe3N3aXRjaChlKXtjYXNlInN1YnRyYWN0IjpyZXR1cm4gMDtjYXNlIm11bHRpcGx5IjpkZWZhdWx0OnJldHVybiAxO2Nhc2UibGlnaHRlbiI6cmV0dXJuIDI7Y2FzZSJkYXJrZW4iOnJldHVybiAzO2Nhc2Uib3ZlcmxheSI6cmV0dXJuIDQ7Y2FzZSJoYXJkbGlnaHQiOnJldHVybiA1O2Nhc2UiZGlmZmVyZW5jZSI6cmV0dXJuIDY7Y2FzZSJpbnZlcnQiOnJldHVybiA3fX1zdGF0aWMgZ2V0VW5pZmllZENvbXBsZXhCbGVuZEZyYWdtZW50U2hhZGVyKCl7cmV0dXJuYFxuJHtDaX1cblxuc3RydWN0IEJsZW5kVW5pZm9ybXMge1xuICAgIG11bENvbG9yOiB2ZWM0PGYzMj4sXG4gICAgYWRkQ29sb3I6IHZlYzQ8ZjMyPixcbiAgICBibGVuZE1vZGU6IGYzMixcbiAgICBfcGFkMDogZjMyLFxuICAgIF9wYWQxOiBmMzIsXG4gICAgX3BhZDI6IGYzMixcbn1cblxuQGdyb3VwKDApIEBiaW5kaW5nKDApIHZhcjx1bmlmb3JtPiB1bmlmb3JtczogQmxlbmRVbmlmb3JtcztcbkBncm91cCgwKSBAYmluZGluZygxKSB2YXIgdGV4dHVyZVNhbXBsZXI6IHNhbXBsZXI7XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMikgdmFyIGRzdFRleHR1cmU6IHRleHR1cmVfMmQ8ZjMyPjtcbkBncm91cCgwKSBAYmluZGluZygzKSB2YXIgc3JjVGV4dHVyZTogdGV4dHVyZV8yZDxmMzI+O1xuXG5mbiBibGVuZChzcmM6IHZlYzQ8ZjMyPiwgZHN0OiB2ZWM0PGYzMj4sIG1vZGU6IGkzMikgLT4gdmVjNDxmMzI+IHtcbiAgICBpZiAoc3JjLmEgPT0gMC4wKSB7IHJldHVybiBkc3Q7IH1cbiAgICBpZiAoZHN0LmEgPT0gMC4wKSB7IHJldHVybiBzcmM7IH1cblxuICAgIGxldCBhID0gc3JjIC0gc3JjICogZHN0LmE7XG4gICAgbGV0IGIgPSBkc3QgLSBkc3QgKiBzcmMuYTtcblxuICAgIGlmIChtb2RlID09IDEpIHtcbiAgICAgICAgbGV0IGMgPSBzcmMgKiBkc3Q7XG4gICAgICAgIHJldHVybiBhICsgYiArIGM7XG4gICAgfVxuXG4gICAgbGV0IHNyY1JnYiA9IHNyYy5yZ2IgLyBzcmMuYTtcbiAgICBsZXQgZHN0UmdiID0gZHN0LnJnYiAvIGRzdC5hO1xuXG4gICAgdmFyIGJsZW5kZWQ6IHZlYzM8ZjMyPjtcblxuICAgIHN3aXRjaCAobW9kZSkge1xuICAgICAgICBjYXNlIDA6IHtcbiAgICAgICAgICAgIGJsZW5kZWQgPSBkc3RSZ2IgLSBzcmNSZ2I7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAyOiB7XG4gICAgICAgICAgICBibGVuZGVkID0gbWl4KHNyY1JnYiwgZHN0UmdiLCBzdGVwKHNyY1JnYiwgZHN0UmdiKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAzOiB7XG4gICAgICAgICAgICBibGVuZGVkID0gbWl4KHNyY1JnYiwgZHN0UmdiLCBzdGVwKGRzdFJnYiwgc3JjUmdiKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSA0OiB7XG4gICAgICAgICAgICBsZXQgbXVsID0gc3JjUmdiICogZHN0UmdiO1xuICAgICAgICAgICAgbGV0IGMxID0gMi4wICogbXVsO1xuICAgICAgICAgICAgbGV0IGMyID0gMi4wICogKHNyY1JnYiArIGRzdFJnYiAtIG11bCkgLSAxLjA7XG4gICAgICAgICAgICBibGVuZGVkID0gbWl4KGMxLCBjMiwgc3RlcCh2ZWMzPGYzMj4oMC41KSwgZHN0UmdiKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSA1OiB7XG4gICAgICAgICAgICBsZXQgbXVsID0gc3JjUmdiICogZHN0UmdiO1xuICAgICAgICAgICAgbGV0IGMxID0gMi4wICogbXVsO1xuICAgICAgICAgICAgbGV0IGMyID0gMi4wICogKHNyY1JnYiArIGRzdFJnYiAtIG11bCkgLSAxLjA7XG4gICAgICAgICAgICBibGVuZGVkID0gbWl4KGMxLCBjMiwgc3RlcCh2ZWMzPGYzMj4oMC41KSwgc3JjUmdiKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSA2OiB7XG4gICAgICAgICAgICBibGVuZGVkID0gYWJzKHNyY1JnYiAtIGRzdFJnYik7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSA3OiB7XG4gICAgICAgICAgICBsZXQgaWIgPSBkc3QgLSBkc3QgKiBzcmMuYTtcbiAgICAgICAgICAgIGxldCBpYyA9IHZlYzQ8ZjMyPihzcmMuYSAtIGRzdC5yZ2IgKiBzcmMuYSwgc3JjLmEpO1xuICAgICAgICAgICAgcmV0dXJuIGliICsgaWM7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYmxlbmRlZCA9IHNyY1JnYjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBjID0gdmVjNDxmMzI+KGJsZW5kZWQsIHNyYy5hICogZHN0LmEpO1xuICAgIGMgPSB2ZWM0PGYzMj4oYy5yZ2IgKiBjLmEsIGMuYSk7XG4gICAgcmV0dXJuIGEgKyBiICsgYztcbn1cblxuQGZyYWdtZW50XG5mbiBtYWluKGlucHV0OiBWZXJ0ZXhPdXRwdXQpIC0+IEBsb2NhdGlvbigwKSB2ZWM0PGYzMj4ge1xuICAgIHZhciBkc3QgPSB0ZXh0dXJlU2FtcGxlKGRzdFRleHR1cmUsIHRleHR1cmVTYW1wbGVyLCBpbnB1dC50ZXhDb29yZCk7XG4gICAgdmFyIHNyYyA9IHRleHR1cmVTYW1wbGUoc3JjVGV4dHVyZSwgdGV4dHVyZVNhbXBsZXIsIGlucHV0LnRleENvb3JkKTtcbiAgICBsZXQgbXVsID0gdW5pZm9ybXMubXVsQ29sb3I7XG4gICAgbGV0IGFkZCA9IHVuaWZvcm1zLmFkZENvbG9yO1xuICAgIGlmIChtdWwueCAhPSAxLjAgfHwgbXVsLnkgIT0gMS4wIHx8IG11bC56ICE9IDEuMCB8fCBtdWwudyAhPSAxLjBcbiAgICAgICAgfHwgYWRkLnggIT0gMC4wIHx8IGFkZC55ICE9IDAuMCB8fCBhZGQueiAhPSAwLjApIHtcbiAgICAgICAgc3JjID0gdmVjNDxmMzI+KHNyYy5yZ2IgLyBtYXgodmVjMzxmMzI+KDAuMDAwMSksIHZlYzM8ZjMyPihzcmMuYSkpLCBzcmMuYSk7XG4gICAgICAgIHNyYyA9IGNsYW1wKHNyYyAqIG11bCArIGFkZCwgdmVjNDxmMzI+KDAuMCksIHZlYzQ8ZjMyPigxLjApKTtcbiAgICAgICAgc3JjID0gdmVjNDxmMzI+KHNyYy5yZ2IgKiBzcmMuYSwgc3JjLmEpO1xuICAgIH1cbiAgICByZXR1cm4gYmxlbmQoc3JjLCBkc3QsIGkzMih1bmlmb3Jtcy5ibGVuZE1vZGUpKTtcbn1cbmB9c3RhdGljIGdldERpc3BsYWNlbWVudE1hcEZpbHRlckZyYWdtZW50U2hhZGVyKGUsdCxyKXtsZXQgbixpLGE7c3dpdGNoKGUpe2Nhc2UgMTpuPSJtYXBDb2xvci5yIjticmVhaztjYXNlIDI6bj0ibWFwQ29sb3IuZyI7YnJlYWs7Y2FzZSA0Om49Im1hcENvbG9yLmIiO2JyZWFrO2Nhc2UgODpuPSJtYXBDb2xvci5hIjticmVhaztkZWZhdWx0Om49IjAuNSJ9c3dpdGNoKHQpe2Nhc2UgMTppPSJtYXBDb2xvci5yIjticmVhaztjYXNlIDI6aT0ibWFwQ29sb3IuZyI7YnJlYWs7Y2FzZSA0Omk9Im1hcENvbG9yLmIiO2JyZWFrO2Nhc2UgODppPSJtYXBDb2xvci5hIjticmVhaztkZWZhdWx0Omk9IjAuNSJ9bGV0IHM9ITE7c3dpdGNoKHIpe2Nhc2UgMDphPSJcbnNvdXJjZUNvbG9yID0gdGV4dHVyZVNhbXBsZShzcmNUZXh0dXJlLCB0ZXh0dXJlU2FtcGxlciwgdXYpO1xuIjticmVhaztjYXNlIDE6cz0hMCxhPSJcbnNvdXJjZUNvbG9yID0gbWl4KHVuaWZvcm1zLnN1YnN0aXR1dGVDb2xvciwgdGV4dHVyZVNhbXBsZShzcmNUZXh0dXJlLCB0ZXh0dXJlU2FtcGxlciwgdXYpLCBpc0luc2lkZSh1dikpO1xuIjticmVhaztjYXNlIDI6ZGVmYXVsdDphPSJcbnNvdXJjZUNvbG9yID0gdGV4dHVyZVNhbXBsZShzcmNUZXh0dXJlLCB0ZXh0dXJlU2FtcGxlciwgZnJhY3QodXYpKTtcbiI7YnJlYWs7Y2FzZSAzOmE9IlxubGV0IGluc2lkZVVWID0gc3RlcChhYnModXYgLSB2ZWMyPGYzMj4oMC41KSksIHZlYzI8ZjMyPigwLjUpKTtcbnNvdXJjZUNvbG9yID0gdGV4dHVyZVNhbXBsZShzcmNUZXh0dXJlLCB0ZXh0dXJlU2FtcGxlciwgbWl4KGlucHV0LnRleENvb3JkLCB1diwgaW5zaWRlVVYpKTtcbiJ9cmV0dXJuYFxuJHtDaX1cblxuJHtzPyJzdHJ1Y3QgRGlzcGxhY2VtZW50VW5pZm9ybXMge1xuICAgIHV2VG9TdFNjYWxlOiB2ZWMyPGYzMj4sXG4gICAgdXZUb1N0T2Zmc2V0OiB2ZWMyPGYzMj4sXG4gICAgc2NhbGU6IHZlYzI8ZjMyPixcbiAgICBwYWRkaW5nOiB2ZWMyPGYzMj4sXG4gICAgc3Vic3RpdHV0ZUNvbG9yOiB2ZWM0PGYzMj4sXG59Ijoic3RydWN0IERpc3BsYWNlbWVudFVuaWZvcm1zIHtcbiAgICB1dlRvU3RTY2FsZTogdmVjMjxmMzI+LFxuICAgIHV2VG9TdE9mZnNldDogdmVjMjxmMzI+LFxuICAgIHNjYWxlOiB2ZWMyPGYzMj4sXG4gICAgcGFkZGluZzogdmVjMjxmMzI+LFxufSJ9XG5cbkBncm91cCgwKSBAYmluZGluZygwKSB2YXI8dW5pZm9ybT4gdW5pZm9ybXM6IERpc3BsYWNlbWVudFVuaWZvcm1zO1xuQGdyb3VwKDApIEBiaW5kaW5nKDEpIHZhciB0ZXh0dXJlU2FtcGxlcjogc2FtcGxlcjtcbkBncm91cCgwKSBAYmluZGluZygyKSB2YXIgc3JjVGV4dHVyZTogdGV4dHVyZV8yZDxmMzI+O1xuQGdyb3VwKDApIEBiaW5kaW5nKDMpIHZhciBtYXBUZXh0dXJlOiB0ZXh0dXJlXzJkPGYzMj47XG5cbiR7QWl9XG5cbkBmcmFnbWVudFxuZm4gbWFpbihpbnB1dDogVmVydGV4T3V0cHV0KSAtPiBAbG9jYXRpb24oMCkgdmVjNDxmMzI+IHtcbiAgICBsZXQgc3RDb29yZCA9IHZlYzI8ZjMyPihpbnB1dC50ZXhDb29yZC54LCAxLjAgLSBpbnB1dC50ZXhDb29yZC55KTtcbiAgICBsZXQgc3QgPSBzdENvb3JkICogdW5pZm9ybXMudXZUb1N0U2NhbGUgLSB1bmlmb3Jtcy51dlRvU3RPZmZzZXQ7XG4gICAgbGV0IG1hcENvbG9yID0gdGV4dHVyZVNhbXBsZShtYXBUZXh0dXJlLCB0ZXh0dXJlU2FtcGxlciwgdmVjMjxmMzI+KHN0LngsIDEuMCAtIHN0LnkpKTtcbiAgICBsZXQgb2Zmc2V0ID0gdmVjMjxmMzI+KCR7bn0sICR7aX0pIC0gMC41O1xuICAgIGxldCB1diA9IGlucHV0LnRleENvb3JkICsgb2Zmc2V0ICogdW5pZm9ybXMuc2NhbGU7XG4gICAgdmFyIHNvdXJjZUNvbG9yOiB2ZWM0PGYzMj47XG4gICAgJHthfVxuICAgIHJldHVybiBtaXgodGV4dHVyZVNhbXBsZShzcmNUZXh0dXJlLCB0ZXh0dXJlU2FtcGxlciwgaW5wdXQudGV4Q29vcmQpLCBzb3VyY2VDb2xvciwgaXNJbnNpZGUoc3QpKTtcbn1cbmB9c3RhdGljIGdldE5vZGVDbGVhclZlcnRleFNoYWRlcigpe3JldHVybiJcbnN0cnVjdCBWZXJ0ZXhJbnB1dCB7XG4gICAgQGxvY2F0aW9uKDApIHBvc2l0aW9uOiB2ZWMyPGYzMj4sXG59XG5cbnN0cnVjdCBWZXJ0ZXhPdXRwdXQge1xuICAgIEBidWlsdGluKHBvc2l0aW9uKSBwb3NpdGlvbjogdmVjNDxmMzI+LFxufVxuXG5AdmVydGV4XG5mbiBtYWluKGlucHV0OiBWZXJ0ZXhJbnB1dCkgLT4gVmVydGV4T3V0cHV0IHtcbiAgICB2YXIgb3V0cHV0OiBWZXJ0ZXhPdXRwdXQ7XG4gICAgbGV0IG5kYyA9IGlucHV0LnBvc2l0aW9uICogMi4wIC0gMS4wO1xuICAgIG91dHB1dC5wb3NpdGlvbiA9IHZlYzQ8ZjMyPihuZGMueCwgbmRjLnksIDAuMCwgMS4wKTtcbiAgICByZXR1cm4gb3V0cHV0O1xufVxuIn1zdGF0aWMgZ2V0Tm9kZUNsZWFyRnJhZ21lbnRTaGFkZXIoKXtyZXR1cm4iXG5AZnJhZ21lbnRcbmZuIG1haW4oKSAtPiBAbG9jYXRpb24oMCkgdmVjNDxmMzI+IHtcbiAgICByZXR1cm4gdmVjNDxmMzI+KDAuMCwgMC4wLCAwLjAsIDAuMCk7XG59XG4ifXN0YXRpYyBnZXRQb3NpdGlvbmVkVGV4dHVyZVZlcnRleFNoYWRlcigpe3JldHVybiBraX1zdGF0aWMgZ2V0VGV4dHVyZVNjYWxlVmVydGV4U2hhZGVyKCl7cmV0dXJuIFZpfXN0YXRpYyBnZXRUZXh0dXJlU2NhbGVCbGVuZFZlcnRleFNoYWRlcigpe3JldHVybiB6aX1zdGF0aWMgZ2V0Q29tcGxleEJsZW5kU2NhbGVWZXJ0ZXhTaGFkZXIoKXtyZXR1cm4gaml9c3RhdGljIGdldENvbXBsZXhCbGVuZFZlcnRleFNoYWRlcigpe3JldHVybiAkaX1zdGF0aWMgZ2V0Q29tcGxleEJsZW5kQ29weVZlcnRleFNoYWRlcigpe3JldHVybiBHaX1zdGF0aWMgZ2V0Q29tcGxleEJsZW5kT3V0cHV0VmVydGV4U2hhZGVyKCl7cmV0dXJuIE5pfXN0YXRpYyBnZXRGaWx0ZXJDb21wbGV4QmxlbmRPdXRwdXRWZXJ0ZXhTaGFkZXIoKXtyZXR1cm4gV2l9c3RhdGljIGdldFBvc2l0aW9uZWRUZXh0dXJlRnJhZ21lbnRTaGFkZXIoKXtyZXR1cm4gbmF9fWNvbnN0IGRhPXthcnJheVN0cmlkZToxNixhdHRyaWJ1dGVzOlt7c2hhZGVyTG9jYXRpb246MCxvZmZzZXQ6MCxmb3JtYXQ6ImZsb2F0MzJ4MiJ9LHtzaGFkZXJMb2NhdGlvbjoxLG9mZnNldDo4LGZvcm1hdDoiZmxvYXQzMngyIn1dfSxoYT17Y29sb3I6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn0sYWxwaGE6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn19O2NsYXNzIHBhe2NvbnN0cnVjdG9yKGUsdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImRldmljZSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJmb3JtYXQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywicGlwZWxpbmVzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImJpbmRHcm91cExheW91dHMiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywic2FtcGxlQ291bnQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywic2hhZGVyTW9kdWxlQ2FjaGUiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpuZXcgTWFwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImZpbHRlckJpbmRHcm91cExheW91dHMiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpuZXcgTWFwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImxhenlJbml0R3JvdXBzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bmV3IFNldH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJsYXp5R3JvdXBNYXAiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpuZXcgTWFwKFsuLi5BcnJheS5mcm9tKHtsZW5ndGg6MTZ9LChlLHQpPT5bYGJsdXJfZmlsdGVyXyR7dCsxfWAsImJsdXJfZmlsdGVyIl0pLFsiYmx1cl9maWx0ZXIiLCJibHVyX2ZpbHRlciJdLFsidGV4dHVyZV9jb3B5IiwidGV4dHVyZV9jb3B5Il0sWyJ0ZXh0dXJlX2NvcHlfcmdiYTgiLCJ0ZXh0dXJlX2NvcHkiXSxbImNvbG9yX3RyYW5zZm9ybSIsInRleHR1cmVfY29weSJdLFsieV9mbGlwX2NvbG9yX3RyYW5zZm9ybSIsInRleHR1cmVfY29weSJdLFsidGV4dHVyZV9lcmFzZSIsInRleHR1cmVfY29weSJdLFsiYmx1cl90ZXh0dXJlX2NvcHkiLCJ0ZXh0dXJlX2NvcHkiXSxbImZpbHRlcl9ibGVuZCIsInRleHR1cmVfY29weSJdLFsidGV4dHVyZV9jb3B5X2JncmEiLCJ0ZXh0dXJlX2NvcHkiXSxbImZpbHRlcl9vdXRwdXQiLCJ0ZXh0dXJlX2NvcHkiXSxbImZpbHRlcl9vdXRwdXRfYWRkIiwidGV4dHVyZV9jb3B5Il0sWyJmaWx0ZXJfb3V0cHV0X3NjcmVlbiIsInRleHR1cmVfY29weSJdLFsiZmlsdGVyX291dHB1dF9hbHBoYSIsInRleHR1cmVfY29weSJdLFsiZmlsdGVyX291dHB1dF9lcmFzZSIsInRleHR1cmVfY29weSJdLFsidGV4dHVyZV9jb3B5X2JncmFfbXNhYSIsInRleHR1cmVfY29weSJdLFsiZmlsdGVyX291dHB1dF9tc2FhIiwidGV4dHVyZV9jb3B5Il0sWyJmaWx0ZXJfb3V0cHV0X2FkZF9tc2FhIiwidGV4dHVyZV9jb3B5Il0sWyJmaWx0ZXJfb3V0cHV0X3NjcmVlbl9tc2FhIiwidGV4dHVyZV9jb3B5Il0sWyJmaWx0ZXJfb3V0cHV0X2FscGhhX21zYWEiLCJ0ZXh0dXJlX2NvcHkiXSxbImZpbHRlcl9vdXRwdXRfZXJhc2VfbXNhYSIsInRleHR1cmVfY29weSJdLFsicG9zaXRpb25lZF90ZXh0dXJlIiwidGV4dHVyZV9jb3B5Il0sWyJwb3NpdGlvbmVkX3RleHR1cmVfcmdiYSIsInRleHR1cmVfY29weSJdLFsiYml0bWFwX3JlbmRlcl9tc2FhIiwidGV4dHVyZV9jb3B5Il0sWyJiaXRtYXBfcmVuZGVyIiwidGV4dHVyZV9jb3B5Il0sWyJ0ZXh0dXJlX3NjYWxlIiwidGV4dHVyZV9jb3B5Il0sWyJ0ZXh0dXJlX3NjYWxlX2JsZW5kIiwidGV4dHVyZV9jb3B5Il0sWyJiaXRtYXBfc3luYyIsImJpdG1hcF9zeW5jIl0sWyJjb2xvcl9tYXRyaXhfZmlsdGVyIiwiZmlsdGVyIl0sWyJiZXZlbF9iYXNlIiwiZmlsdGVyIl0sWyJnbG93X2ZpbHRlciIsImZpbHRlciJdLFsiZHJvcF9zaGFkb3dfZmlsdGVyIiwiZmlsdGVyIl0sWyJiZXZlbF9maWx0ZXIiLCJmaWx0ZXIiXSxbImdyYWRpZW50X2dsb3dfZmlsdGVyIiwiZmlsdGVyIl0sWyJncmFkaWVudF9iZXZlbF9maWx0ZXIiLCJmaWx0ZXIiXSxbImNvbXBsZXhfYmxlbmQiLCJjb21wbGV4X2JsZW5kIl0sWyJjb21wbGV4X2JsZW5kX2NvcHkiLCJjb21wbGV4X2JsZW5kIl0sWyJjb21wbGV4X2JsZW5kX3NjYWxlIiwiY29tcGxleF9ibGVuZCJdLFsiY29tcGxleF9ibGVuZF9vdXRwdXQiLCJjb21wbGV4X2JsZW5kIl0sWyJjb21wbGV4X2JsZW5kX291dHB1dF9tc2FhIiwiY29tcGxleF9ibGVuZCJdLFsiZmlsdGVyX2NvbXBsZXhfYmxlbmRfb3V0cHV0IiwiY29tcGxleF9ibGVuZCJdLFsiZmlsdGVyX2NvbXBsZXhfYmxlbmRfb3V0cHV0X21zYWEiLCJjb21wbGV4X2JsZW5kIl1dKX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJncmFkaWVudFBpcGVsaW5lTGF5b3V0Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bnVsbH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJncmFkaWVudFZlcnRleFNoYWRlck1vZHVsZSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOm51bGx9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiZ3JhZGllbnRGcmFnbWVudFNoYWRlck1vZHVsZSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOm51bGx9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiZ3JhZGllbnRTdGVuY2lsRnJhZ21lbnRTaGFkZXJNb2R1bGUiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpudWxsfSksdGhpcy5kZXZpY2U9ZSx0aGlzLmZvcm1hdD10LHRoaXMucGlwZWxpbmVzPW5ldyBNYXAsdGhpcy5iaW5kR3JvdXBMYXlvdXRzPW5ldyBNYXAsdGhpcy5zYW1wbGVDb3VudD00LHRoaXMuaW5pdGlhbGl6ZSgpfWdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKGUsdCl7bGV0IHI9dGhpcy5zaGFkZXJNb2R1bGVDYWNoZS5nZXQoZSk7cmV0dXJuIHJ8fChyPXRoaXMuZGV2aWNlLmNyZWF0ZVNoYWRlck1vZHVsZSh7Y29kZTp0fSksdGhpcy5zaGFkZXJNb2R1bGVDYWNoZS5zZXQoZSxyKSkscn1pbml0aWFsaXplKCl7dGhpcy5jcmVhdGVGaWxsUGlwZWxpbmUoKSx0aGlzLmNyZWF0ZVN0ZW5jaWxGaWxsUGlwZWxpbmVzKCksdGhpcy5jcmVhdGVDbGlwUGlwZWxpbmUoKSx0aGlzLmNyZWF0ZU1hc2tVbmlvblBpcGVsaW5lcygpLHRoaXMuY3JlYXRlTWFza1BpcGVsaW5lKCksdGhpcy5jcmVhdGVCYXNpY1BpcGVsaW5lKCksdGhpcy5jcmVhdGVUZXh0dXJlUGlwZWxpbmUoKSx0aGlzLmNyZWF0ZUluc3RhbmNlZFBpcGVsaW5lKCksdGhpcy5jcmVhdGVHcmFkaWVudFBpcGVsaW5lKCksdGhpcy5jcmVhdGVCaXRtYXBGaWxsUGlwZWxpbmUoKSx0aGlzLmNyZWF0ZUJsZW5kUGlwZWxpbmUoKSx0aGlzLmNyZWF0ZU5vZGVDbGVhclBpcGVsaW5lKCl9ZW5zdXJlTGF6eUdyb3VwKGUpe2NvbnN0IHQ9dGhpcy5sYXp5R3JvdXBNYXAuZ2V0KGUpO2lmKHQmJiF0aGlzLmxhenlJbml0R3JvdXBzLmhhcyh0KSlzd2l0Y2godGhpcy5sYXp5SW5pdEdyb3Vwcy5hZGQodCksdCl7Y2FzZSJibHVyX2ZpbHRlciI6dGhpcy5jcmVhdGVCbHVyRmlsdGVyUGlwZWxpbmUoKTticmVhaztjYXNlInRleHR1cmVfY29weSI6dGhpcy5jcmVhdGVUZXh0dXJlQ29weVBpcGVsaW5lKCk7YnJlYWs7Y2FzZSJiaXRtYXBfc3luYyI6dGhpcy5jcmVhdGVCaXRtYXBTeW5jUGlwZWxpbmUoKTticmVhaztjYXNlImZpbHRlciI6dGhpcy5jcmVhdGVDb2xvck1hdHJpeEZpbHRlclBpcGVsaW5lKCk7YnJlYWs7Y2FzZSJjb21wbGV4X2JsZW5kIjp0aGlzLmNyZWF0ZUNvbXBsZXhCbGVuZFBpcGVsaW5lcygpfX1wcmVsb2FkTGF6eUdyb3Vwcygpe2NvbnN0IGU9WyJibHVyX2ZpbHRlciIsInRleHR1cmVfY29weSIsImJpdG1hcF9zeW5jIiwiZmlsdGVyIiwiY29tcGxleF9ibGVuZCJdO2Zvcihjb25zdCB0IG9mIGUpdGhpcy5lbnN1cmVMYXp5R3JvdXAodCl9Y3JlYXRlRmlsbFBpcGVsaW5lKCl7Y29uc3QgZT10aGlzLmRldmljZS5jcmVhdGVCaW5kR3JvdXBMYXlvdXQoe2VudHJpZXM6W3tiaW5kaW5nOjAsdmlzaWJpbGl0eTpHUFVTaGFkZXJTdGFnZS5WRVJURVh8R1BVU2hhZGVyU3RhZ2UuRlJBR01FTlQsYnVmZmVyOnt0eXBlOiJ1bmlmb3JtIixoYXNEeW5hbWljT2Zmc2V0OiEwfX1dfSk7dGhpcy5iaW5kR3JvdXBMYXlvdXRzLnNldCgiZmlsbF9keW5hbWljIixlKTtjb25zdCB0PXRoaXMuZGV2aWNlLmNyZWF0ZVBpcGVsaW5lTGF5b3V0KHtiaW5kR3JvdXBMYXlvdXRzOltlXX0pLHI9dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgiZmlsbFZlcnRleCIsZmEuZ2V0RmlsbFZlcnRleFNoYWRlcigpKSxuPXRoaXMuZ2V0T3JDcmVhdGVTaGFkZXJNb2R1bGUoImZpbGxGcmFnbWVudCIsZmEuZ2V0RmlsbEZyYWdtZW50U2hhZGVyKCkpLGk9ZGEsYT1oYSxzPXRoaXMuZGV2aWNlLmNyZWF0ZVJlbmRlclBpcGVsaW5lKHtsYXlvdXQ6dCx2ZXJ0ZXg6e21vZHVsZTpyLGVudHJ5UG9pbnQ6Im1haW4iLGJ1ZmZlcnM6W2ldfSxmcmFnbWVudDp7bW9kdWxlOm4sZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDoicmdiYTh1bm9ybSIsYmxlbmQ6YX1dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9LGRlcHRoU3RlbmNpbDp7Zm9ybWF0OiJzdGVuY2lsOCIsc3RlbmNpbEZyb250Ontjb21wYXJlOiJhbHdheXMiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6ImtlZXAiLHBhc3NPcDoia2VlcCJ9LHN0ZW5jaWxCYWNrOntjb21wYXJlOiJhbHdheXMiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6ImtlZXAiLHBhc3NPcDoia2VlcCJ9LHN0ZW5jaWxSZWFkTWFzazowLHN0ZW5jaWxXcml0ZU1hc2s6MH0sbXVsdGlzYW1wbGU6e2NvdW50OnRoaXMuc2FtcGxlQ291bnQsYWxwaGFUb0NvdmVyYWdlRW5hYmxlZDohMH19KSxvPXRoaXMuZGV2aWNlLmNyZWF0ZVJlbmRlclBpcGVsaW5lKHtsYXlvdXQ6dCx2ZXJ0ZXg6e21vZHVsZTpyLGVudHJ5UG9pbnQ6Im1haW4iLGJ1ZmZlcnM6W2ldLGNvbnN0YW50czp7eUZsaXBTaWduOi0xfX0sZnJhZ21lbnQ6e21vZHVsZTpuLGVudHJ5UG9pbnQ6Im1haW4iLHRhcmdldHM6W3tmb3JtYXQ6dGhpcy5mb3JtYXQsYmxlbmQ6YX1dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9LG11bHRpc2FtcGxlOntjb3VudDp0aGlzLnNhbXBsZUNvdW50LGFscGhhVG9Db3ZlcmFnZUVuYWJsZWQ6ITB9fSk7dGhpcy5waXBlbGluZXMuc2V0KCJmaWxsIixzKSx0aGlzLnBpcGVsaW5lcy5zZXQoImZpbGxfYmdyYSIsbyk7Y29uc3QgbD10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGF5b3V0OnQsdmVydGV4Onttb2R1bGU6cixlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOltpXSxjb25zdGFudHM6e3lGbGlwU2lnbjotMX19LGZyYWdtZW50Onttb2R1bGU6bixlbnRyeVBvaW50OiJtYWluIix0YXJnZXRzOlt7Zm9ybWF0OnRoaXMuZm9ybWF0LGJsZW5kOmF9XX0scHJpbWl0aXZlOnt0b3BvbG9neToidHJpYW5nbGUtbGlzdCIsY3VsbE1vZGU6Im5vbmUifSxkZXB0aFN0ZW5jaWw6e2Zvcm1hdDoic3RlbmNpbDgiLHN0ZW5jaWxGcm9udDp7Y29tcGFyZToiZXF1YWwiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6ImtlZXAiLHBhc3NPcDoia2VlcCJ9LHN0ZW5jaWxCYWNrOntjb21wYXJlOiJlcXVhbCIsZmFpbE9wOiJrZWVwIixkZXB0aEZhaWxPcDoia2VlcCIscGFzc09wOiJrZWVwIn0sc3RlbmNpbFJlYWRNYXNrOjI1NSxzdGVuY2lsV3JpdGVNYXNrOjB9LG11bHRpc2FtcGxlOntjb3VudDp0aGlzLnNhbXBsZUNvdW50LGFscGhhVG9Db3ZlcmFnZUVuYWJsZWQ6ITB9fSk7dGhpcy5waXBlbGluZXMuc2V0KCJmaWxsX2JncmFfc3RlbmNpbCIsbCl9Y3JlYXRlU3RlbmNpbEZpbGxQaXBlbGluZXMoKXtjb25zdCBlPWRhLHQ9dGhpcy5iaW5kR3JvdXBMYXlvdXRzLmdldCgiZmlsbF9keW5hbWljIikscj10aGlzLmRldmljZS5jcmVhdGVQaXBlbGluZUxheW91dCh7YmluZEdyb3VwTGF5b3V0czpbdF19KSxuPXRoaXMuZGV2aWNlLmNyZWF0ZVJlbmRlclBpcGVsaW5lKHtsYXlvdXQ6cix2ZXJ0ZXg6e21vZHVsZTp0aGlzLmdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKCJzdGVuY2lsV3JpdGVWZXJ0ZXgiLGZhLmdldFN0ZW5jaWxXcml0ZVZlcnRleFNoYWRlcigpKSxlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOltlXX0sZnJhZ21lbnQ6e21vZHVsZTp0aGlzLmdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKCJzdGVuY2lsV3JpdGVGcmFnbWVudCIsZmEuZ2V0U3RlbmNpbFdyaXRlRnJhZ21lbnRTaGFkZXIoKSksZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDoicmdiYTh1bm9ybSIsd3JpdGVNYXNrOjB9XX0scHJpbWl0aXZlOnt0b3BvbG9neToidHJpYW5nbGUtbGlzdCIsY3VsbE1vZGU6Im5vbmUiLGZyb250RmFjZToiY2N3In0sZGVwdGhTdGVuY2lsOntmb3JtYXQ6InN0ZW5jaWw4IixzdGVuY2lsRnJvbnQ6e2NvbXBhcmU6ImFsd2F5cyIsZmFpbE9wOiJrZWVwIixkZXB0aEZhaWxPcDoia2VlcCIscGFzc09wOiJpbmNyZW1lbnQtd3JhcCJ9LHN0ZW5jaWxCYWNrOntjb21wYXJlOiJhbHdheXMiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6ImtlZXAiLHBhc3NPcDoiZGVjcmVtZW50LXdyYXAifSxzdGVuY2lsUmVhZE1hc2s6MjU1LHN0ZW5jaWxXcml0ZU1hc2s6MjU1fSxtdWx0aXNhbXBsZTp7Y291bnQ6dGhpcy5zYW1wbGVDb3VudCxhbHBoYVRvQ292ZXJhZ2VFbmFibGVkOiEwfX0pO3RoaXMucGlwZWxpbmVzLnNldCgic3RlbmNpbF93cml0ZSIsbik7Y29uc3QgaT10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGF5b3V0OnIsdmVydGV4Onttb2R1bGU6dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgic3RlbmNpbEZpbGxWZXJ0ZXgiLGZhLmdldFN0ZW5jaWxGaWxsVmVydGV4U2hhZGVyKCkpLGVudHJ5UG9pbnQ6Im1haW4iLGJ1ZmZlcnM6W2VdfSxmcmFnbWVudDp7bW9kdWxlOnRoaXMuZ2V0T3JDcmVhdGVTaGFkZXJNb2R1bGUoInN0ZW5jaWxGaWxsRnJhZ21lbnQiLGZhLmdldFN0ZW5jaWxGaWxsRnJhZ21lbnRTaGFkZXIoKSksZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDoicmdiYTh1bm9ybSIsYmxlbmQ6e2NvbG9yOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJvbmUtbWludXMtc3JjLWFscGhhIixvcGVyYXRpb246ImFkZCJ9LGFscGhhOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJvbmUtbWludXMtc3JjLWFscGhhIixvcGVyYXRpb246ImFkZCJ9fX1dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9LGRlcHRoU3RlbmNpbDp7Zm9ybWF0OiJzdGVuY2lsOCIsc3RlbmNpbEZyb250Ontjb21wYXJlOiJub3QtZXF1YWwiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6Inplcm8iLHBhc3NPcDoiemVybyJ9LHN0ZW5jaWxCYWNrOntjb21wYXJlOiJub3QtZXF1YWwiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6Inplcm8iLHBhc3NPcDoiemVybyJ9LHN0ZW5jaWxSZWFkTWFzazoyNTUsc3RlbmNpbFdyaXRlTWFzazoyNTV9LG11bHRpc2FtcGxlOntjb3VudDp0aGlzLnNhbXBsZUNvdW50fX0pO3RoaXMucGlwZWxpbmVzLnNldCgic3RlbmNpbF9maWxsIixpKTtjb25zdCBhPXRoaXMuZGV2aWNlLmNyZWF0ZVJlbmRlclBpcGVsaW5lKHtsYXlvdXQ6cix2ZXJ0ZXg6e21vZHVsZTp0aGlzLmdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKCJzdGVuY2lsV3JpdGVWZXJ0ZXgiLGZhLmdldFN0ZW5jaWxXcml0ZVZlcnRleFNoYWRlcigpKSxlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOltlXX0sZnJhZ21lbnQ6e21vZHVsZTp0aGlzLmdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKCJzdGVuY2lsV3JpdGVGcmFnbWVudCIsZmEuZ2V0U3RlbmNpbFdyaXRlRnJhZ21lbnRTaGFkZXIoKSksZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDoicmdiYTh1bm9ybSIsd3JpdGVNYXNrOjB9XX0scHJpbWl0aXZlOnt0b3BvbG9neToidHJpYW5nbGUtbGlzdCIsY3VsbE1vZGU6Im5vbmUiLGZyb250RmFjZToiY2N3In0sZGVwdGhTdGVuY2lsOntmb3JtYXQ6InN0ZW5jaWw4IixzdGVuY2lsRnJvbnQ6e2NvbXBhcmU6ImFsd2F5cyIsZmFpbE9wOiJrZWVwIixkZXB0aEZhaWxPcDoia2VlcCIscGFzc09wOiJpbmNyZW1lbnQtd3JhcCJ9LHN0ZW5jaWxCYWNrOntjb21wYXJlOiJhbHdheXMiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6ImtlZXAiLHBhc3NPcDoiZGVjcmVtZW50LXdyYXAifSxzdGVuY2lsUmVhZE1hc2s6MjU1LHN0ZW5jaWxXcml0ZU1hc2s6MjU1fSxtdWx0aXNhbXBsZTp7Y291bnQ6dGhpcy5zYW1wbGVDb3VudCxhbHBoYVRvQ292ZXJhZ2VFbmFibGVkOiEwfX0pO3RoaXMucGlwZWxpbmVzLnNldCgic3RlbmNpbF93cml0ZV9hdGxhcyIsYSk7Y29uc3Qgcz10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGF5b3V0OnIsdmVydGV4Onttb2R1bGU6dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgic3RlbmNpbFdyaXRlVmVydGV4IixmYS5nZXRTdGVuY2lsV3JpdGVWZXJ0ZXhTaGFkZXIoKSksZW50cnlQb2ludDoibWFpbiIsYnVmZmVyczpbZV0sY29uc3RhbnRzOnt5RmxpcFNpZ246LTF9fSxmcmFnbWVudDp7bW9kdWxlOnRoaXMuZ2V0T3JDcmVhdGVTaGFkZXJNb2R1bGUoInN0ZW5jaWxXcml0ZUZyYWdtZW50IixmYS5nZXRTdGVuY2lsV3JpdGVGcmFnbWVudFNoYWRlcigpKSxlbnRyeVBvaW50OiJtYWluIix0YXJnZXRzOlt7Zm9ybWF0OnRoaXMuZm9ybWF0LHdyaXRlTWFzazowfV19LHByaW1pdGl2ZTp7dG9wb2xvZ3k6InRyaWFuZ2xlLWxpc3QiLGN1bGxNb2RlOiJub25lIixmcm9udEZhY2U6ImNjdyJ9LGRlcHRoU3RlbmNpbDp7Zm9ybWF0OiJzdGVuY2lsOCIsc3RlbmNpbEZyb250Ontjb21wYXJlOiJhbHdheXMiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6ImtlZXAiLHBhc3NPcDoiaW5jcmVtZW50LXdyYXAifSxzdGVuY2lsQmFjazp7Y29tcGFyZToiYWx3YXlzIixmYWlsT3A6ImtlZXAiLGRlcHRoRmFpbE9wOiJrZWVwIixwYXNzT3A6ImRlY3JlbWVudC13cmFwIn0sc3RlbmNpbFJlYWRNYXNrOjI1NSxzdGVuY2lsV3JpdGVNYXNrOjI1NX0sbXVsdGlzYW1wbGU6e2NvdW50OnRoaXMuc2FtcGxlQ291bnQsYWxwaGFUb0NvdmVyYWdlRW5hYmxlZDohMH19KTt0aGlzLnBpcGVsaW5lcy5zZXQoInN0ZW5jaWxfd3JpdGVfbWFpbiIscyk7Y29uc3Qgbz10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGF5b3V0OnIsdmVydGV4Onttb2R1bGU6dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgic3RlbmNpbEZpbGxWZXJ0ZXgiLGZhLmdldFN0ZW5jaWxGaWxsVmVydGV4U2hhZGVyKCkpLGVudHJ5UG9pbnQ6Im1haW4iLGJ1ZmZlcnM6W2VdfSxmcmFnbWVudDp7bW9kdWxlOnRoaXMuZ2V0T3JDcmVhdGVTaGFkZXJNb2R1bGUoInN0ZW5jaWxGaWxsRnJhZ21lbnQiLGZhLmdldFN0ZW5jaWxGaWxsRnJhZ21lbnRTaGFkZXIoKSksZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDoicmdiYTh1bm9ybSIsYmxlbmQ6e2NvbG9yOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJvbmUtbWludXMtc3JjLWFscGhhIixvcGVyYXRpb246ImFkZCJ9LGFscGhhOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJvbmUiLG9wZXJhdGlvbjoibWF4In19fV19LHByaW1pdGl2ZTp7dG9wb2xvZ3k6InRyaWFuZ2xlLWxpc3QiLGN1bGxNb2RlOiJub25lIn0sZGVwdGhTdGVuY2lsOntmb3JtYXQ6InN0ZW5jaWw4IixzdGVuY2lsRnJvbnQ6e2NvbXBhcmU6Im5vdC1lcXVhbCIsZmFpbE9wOiJrZWVwIixkZXB0aEZhaWxPcDoiemVybyIscGFzc09wOiJ6ZXJvIn0sc3RlbmNpbEJhY2s6e2NvbXBhcmU6Im5vdC1lcXVhbCIsZmFpbE9wOiJrZWVwIixkZXB0aEZhaWxPcDoiemVybyIscGFzc09wOiJ6ZXJvIn0sc3RlbmNpbFJlYWRNYXNrOjI1NSxzdGVuY2lsV3JpdGVNYXNrOjI1NX0sbXVsdGlzYW1wbGU6e2NvdW50OnRoaXMuc2FtcGxlQ291bnR9fSk7dGhpcy5waXBlbGluZXMuc2V0KCJzdGVuY2lsX2ZpbGxfYXRsYXMiLG8pO2NvbnN0IGw9dGhpcy5kZXZpY2UuY3JlYXRlUmVuZGVyUGlwZWxpbmUoe2xheW91dDpyLHZlcnRleDp7bW9kdWxlOnRoaXMuZ2V0T3JDcmVhdGVTaGFkZXJNb2R1bGUoInN0ZW5jaWxGaWxsVmVydGV4IixmYS5nZXRTdGVuY2lsRmlsbFZlcnRleFNoYWRlcigpKSxlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOltlXSxjb25zdGFudHM6e3lGbGlwU2lnbjotMX19LGZyYWdtZW50Onttb2R1bGU6dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgic3RlbmNpbEZpbGxGcmFnbWVudCIsZmEuZ2V0U3RlbmNpbEZpbGxGcmFnbWVudFNoYWRlcigpKSxlbnRyeVBvaW50OiJtYWluIix0YXJnZXRzOlt7Zm9ybWF0OnRoaXMuZm9ybWF0LGJsZW5kOntjb2xvcjp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3Rvcjoib25lLW1pbnVzLXNyYy1hbHBoYSIsb3BlcmF0aW9uOiJhZGQifSxhbHBoYTp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3Rvcjoib25lIixvcGVyYXRpb246Im1heCJ9fX1dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9LGRlcHRoU3RlbmNpbDp7Zm9ybWF0OiJzdGVuY2lsOCIsc3RlbmNpbEZyb250Ontjb21wYXJlOiJub3QtZXF1YWwiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6Inplcm8iLHBhc3NPcDoiemVybyJ9LHN0ZW5jaWxCYWNrOntjb21wYXJlOiJub3QtZXF1YWwiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6Inplcm8iLHBhc3NPcDoiemVybyJ9LHN0ZW5jaWxSZWFkTWFzazoyNTUsc3RlbmNpbFdyaXRlTWFzazoyNTV9LG11bHRpc2FtcGxlOntjb3VudDp0aGlzLnNhbXBsZUNvdW50fX0pO3RoaXMucGlwZWxpbmVzLnNldCgic3RlbmNpbF9maWxsX21haW4iLGwpO2NvbnN0IGM9dGhpcy5kZXZpY2UuY3JlYXRlUmVuZGVyUGlwZWxpbmUoe2xheW91dDpyLHZlcnRleDp7bW9kdWxlOnRoaXMuZ2V0T3JDcmVhdGVTaGFkZXJNb2R1bGUoInN0ZW5jaWxGaWxsVmVydGV4IixmYS5nZXRTdGVuY2lsRmlsbFZlcnRleFNoYWRlcigpKSxlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOltlXX0sZnJhZ21lbnQ6e21vZHVsZTp0aGlzLmdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKCJzdGVuY2lsRmlsbEZyYWdtZW50IixmYS5nZXRTdGVuY2lsRmlsbEZyYWdtZW50U2hhZGVyKCkpLGVudHJ5UG9pbnQ6Im1haW4iLHRhcmdldHM6W3tmb3JtYXQ6InJnYmE4dW5vcm0iLGJsZW5kOntjb2xvcjp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3Rvcjoib25lLW1pbnVzLXNyYy1hbHBoYSIsb3BlcmF0aW9uOiJhZGQifSxhbHBoYTp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3Rvcjoib25lLW1pbnVzLXNyYy1hbHBoYSIsb3BlcmF0aW9uOiJhZGQifX19XX0scHJpbWl0aXZlOnt0b3BvbG9neToidHJpYW5nbGUtbGlzdCIsY3VsbE1vZGU6Im5vbmUifSxkZXB0aFN0ZW5jaWw6e2Zvcm1hdDoic3RlbmNpbDgiLHN0ZW5jaWxGcm9udDp7Y29tcGFyZToiZ3JlYXRlciIsZmFpbE9wOiJrZWVwIixkZXB0aEZhaWxPcDoicmVwbGFjZSIscGFzc09wOiJyZXBsYWNlIn0sc3RlbmNpbEJhY2s6e2NvbXBhcmU6ImdyZWF0ZXIiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6InJlcGxhY2UiLHBhc3NPcDoicmVwbGFjZSJ9LHN0ZW5jaWxSZWFkTWFzazoyNTUsc3RlbmNpbFdyaXRlTWFzazoyNTV9LG11bHRpc2FtcGxlOntjb3VudDp0aGlzLnNhbXBsZUNvdW50fX0pO3RoaXMucGlwZWxpbmVzLnNldCgic3RlbmNpbF9maWxsX21hc2tlZCIsYyl9Y3JlYXRlQ2xpcFBpcGVsaW5lKCl7Y29uc3QgZT1kYSx0PXRoaXMuYmluZEdyb3VwTGF5b3V0cy5nZXQoImZpbGxfZHluYW1pYyIpLHI9dGhpcy5kZXZpY2UuY3JlYXRlUGlwZWxpbmVMYXlvdXQoe2JpbmRHcm91cExheW91dHM6W3RdfSksbj10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGF5b3V0OnIsdmVydGV4Onttb2R1bGU6dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgic3RlbmNpbFdyaXRlVmVydGV4IixmYS5nZXRTdGVuY2lsV3JpdGVWZXJ0ZXhTaGFkZXIoKSksZW50cnlQb2ludDoibWFpbiIsYnVmZmVyczpbZV19LGZyYWdtZW50Onttb2R1bGU6dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgic3RlbmNpbFdyaXRlRnJhZ21lbnQiLGZhLmdldFN0ZW5jaWxXcml0ZUZyYWdtZW50U2hhZGVyKCkpLGVudHJ5UG9pbnQ6Im1haW4iLHRhcmdldHM6W3tmb3JtYXQ6InJnYmE4dW5vcm0iLHdyaXRlTWFzazowfV19LHByaW1pdGl2ZTp7dG9wb2xvZ3k6InRyaWFuZ2xlLWxpc3QiLGN1bGxNb2RlOiJub25lIn0sZGVwdGhTdGVuY2lsOntmb3JtYXQ6InN0ZW5jaWw4IixzdGVuY2lsRnJvbnQ6e2NvbXBhcmU6ImFsd2F5cyIsZmFpbE9wOiJ6ZXJvIixkZXB0aEZhaWxPcDoiaW52ZXJ0IixwYXNzT3A6ImludmVydCJ9LHN0ZW5jaWxCYWNrOntjb21wYXJlOiJhbHdheXMiLGZhaWxPcDoiemVybyIsZGVwdGhGYWlsT3A6ImludmVydCIscGFzc09wOiJpbnZlcnQifSxzdGVuY2lsUmVhZE1hc2s6MjU1LHN0ZW5jaWxXcml0ZU1hc2s6MjU1fSxtdWx0aXNhbXBsZTp7Y291bnQ6dGhpcy5zYW1wbGVDb3VudH19KTt0aGlzLnBpcGVsaW5lcy5zZXQoImNsaXBfd3JpdGUiLG4pO2NvbnN0IGk9dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgic3RlbmNpbFdyaXRlVmVydGV4IixmYS5nZXRTdGVuY2lsV3JpdGVWZXJ0ZXhTaGFkZXIoKSksYT10aGlzLmdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKCJzdGVuY2lsV3JpdGVGcmFnbWVudCIsZmEuZ2V0U3RlbmNpbFdyaXRlRnJhZ21lbnRTaGFkZXIoKSk7Zm9yKGxldCB0PTE7dDw9ODt0Kyspe2NvbnN0IG49MTw8dC0xLHM9dGhpcy5kZXZpY2UuY3JlYXRlUmVuZGVyUGlwZWxpbmUoe2xheW91dDpyLHZlcnRleDp7bW9kdWxlOmksZW50cnlQb2ludDoibWFpbiIsYnVmZmVyczpbZV0sY29uc3RhbnRzOnt5RmxpcFNpZ246LTF9fSxmcmFnbWVudDp7bW9kdWxlOmEsZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDp0aGlzLmZvcm1hdCx3cml0ZU1hc2s6MH1dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9LGRlcHRoU3RlbmNpbDp7Zm9ybWF0OiJzdGVuY2lsOCIsc3RlbmNpbEZyb250Ontjb21wYXJlOiJhbHdheXMiLGZhaWxPcDoiemVybyIsZGVwdGhGYWlsT3A6ImludmVydCIscGFzc09wOiJpbnZlcnQifSxzdGVuY2lsQmFjazp7Y29tcGFyZToiYWx3YXlzIixmYWlsT3A6Inplcm8iLGRlcHRoRmFpbE9wOiJpbnZlcnQiLHBhc3NPcDoiaW52ZXJ0In0sc3RlbmNpbFJlYWRNYXNrOjI1NSxzdGVuY2lsV3JpdGVNYXNrOm59LG11bHRpc2FtcGxlOntjb3VudDp0aGlzLnNhbXBsZUNvdW50LGFscGhhVG9Db3ZlcmFnZUVuYWJsZWQ6ITB9fSk7dGhpcy5waXBlbGluZXMuc2V0KGBjbGlwX3dyaXRlX21haW5fJHt0fWAscyl9dGhpcy5waXBlbGluZXMuc2V0KCJjbGlwX3dyaXRlX21haW4iLHRoaXMucGlwZWxpbmVzLmdldCgiY2xpcF93cml0ZV9tYWluXzEiKSk7Zm9yKGxldCB0PTE7dDw9ODt0Kyspe2NvbnN0IG49MTw8dC0xLHM9dGhpcy5kZXZpY2UuY3JlYXRlUmVuZGVyUGlwZWxpbmUoe2xheW91dDpyLHZlcnRleDp7bW9kdWxlOmksZW50cnlQb2ludDoibWFpbiIsYnVmZmVyczpbZV0sY29uc3RhbnRzOnt5RmxpcFNpZ246LTF9fSxmcmFnbWVudDp7bW9kdWxlOmEsZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDp0aGlzLmZvcm1hdCx3cml0ZU1hc2s6MH1dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9LGRlcHRoU3RlbmNpbDp7Zm9ybWF0OiJzdGVuY2lsOCIsc3RlbmNpbEZyb250Ontjb21wYXJlOiJhbHdheXMiLGZhaWxPcDoicmVwbGFjZSIsZGVwdGhGYWlsT3A6InJlcGxhY2UiLHBhc3NPcDoicmVwbGFjZSJ9LHN0ZW5jaWxCYWNrOntjb21wYXJlOiJhbHdheXMiLGZhaWxPcDoicmVwbGFjZSIsZGVwdGhGYWlsT3A6InJlcGxhY2UiLHBhc3NPcDoicmVwbGFjZSJ9LHN0ZW5jaWxSZWFkTWFzazoyNTUsc3RlbmNpbFdyaXRlTWFzazpufSxtdWx0aXNhbXBsZTp7Y291bnQ6dGhpcy5zYW1wbGVDb3VudH19KTt0aGlzLnBpcGVsaW5lcy5zZXQoYGNsaXBfY2xlYXJfbWFpbl8ke3R9YCxzKX19Y3JlYXRlTWFza1VuaW9uUGlwZWxpbmVzKCl7Y29uc3QgZT1kYSx0PXRoaXMuYmluZEdyb3VwTGF5b3V0cy5nZXQoImZpbGxfZHluYW1pYyIpLHI9dGhpcy5kZXZpY2UuY3JlYXRlUGlwZWxpbmVMYXlvdXQoe2JpbmRHcm91cExheW91dHM6W3RdfSksbj10aGlzLmdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKCJzdGVuY2lsV3JpdGVWZXJ0ZXgiLGZhLmdldFN0ZW5jaWxXcml0ZVZlcnRleFNoYWRlcigpKSxpPXRoaXMuZ2V0T3JDcmVhdGVTaGFkZXJNb2R1bGUoInN0ZW5jaWxXcml0ZUZyYWdtZW50IixmYS5nZXRTdGVuY2lsV3JpdGVGcmFnbWVudFNoYWRlcigpKTtmb3IobGV0IHQ9MTt0PD04O3QrKyl7Y29uc3QgYT0yNTUmfigxPDx0LTEpLHM9dGhpcy5kZXZpY2UuY3JlYXRlUmVuZGVyUGlwZWxpbmUoe2xheW91dDpyLHZlcnRleDp7bW9kdWxlOm4sZW50cnlQb2ludDoibWFpbiIsYnVmZmVyczpbZV0sY29uc3RhbnRzOnt5RmxpcFNpZ246LTF9fSxmcmFnbWVudDp7bW9kdWxlOmksZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDp0aGlzLmZvcm1hdCx3cml0ZU1hc2s6MH1dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9LGRlcHRoU3RlbmNpbDp7Zm9ybWF0OiJzdGVuY2lsOCIsc3RlbmNpbEZyb250Ontjb21wYXJlOiJsZXNzLWVxdWFsIixmYWlsT3A6Inplcm8iLGRlcHRoRmFpbE9wOiJyZXBsYWNlIixwYXNzT3A6InJlcGxhY2UifSxzdGVuY2lsQmFjazp7Y29tcGFyZToibGVzcy1lcXVhbCIsZmFpbE9wOiJ6ZXJvIixkZXB0aEZhaWxPcDoicmVwbGFjZSIscGFzc09wOiJyZXBsYWNlIn0sc3RlbmNpbFJlYWRNYXNrOjI1NSxzdGVuY2lsV3JpdGVNYXNrOmF9fSk7dGhpcy5waXBlbGluZXMuc2V0KGBtYXNrX3VuaW9uX21lcmdlXyR7dH1gLHMpO2NvbnN0IG89dGhpcy5kZXZpY2UuY3JlYXRlUmVuZGVyUGlwZWxpbmUoe2xheW91dDpyLHZlcnRleDp7bW9kdWxlOm4sZW50cnlQb2ludDoibWFpbiIsYnVmZmVyczpbZV0sY29uc3RhbnRzOnt5RmxpcFNpZ246LTF9fSxmcmFnbWVudDp7bW9kdWxlOmksZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDp0aGlzLmZvcm1hdCx3cml0ZU1hc2s6MH1dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9LGRlcHRoU3RlbmNpbDp7Zm9ybWF0OiJzdGVuY2lsOCIsc3RlbmNpbEZyb250Ontjb21wYXJlOiJhbHdheXMiLGZhaWxPcDoicmVwbGFjZSIsZGVwdGhGYWlsT3A6InJlcGxhY2UiLHBhc3NPcDoicmVwbGFjZSJ9LHN0ZW5jaWxCYWNrOntjb21wYXJlOiJhbHdheXMiLGZhaWxPcDoicmVwbGFjZSIsZGVwdGhGYWlsT3A6InJlcGxhY2UiLHBhc3NPcDoicmVwbGFjZSJ9LHN0ZW5jaWxSZWFkTWFzazoyNTUsc3RlbmNpbFdyaXRlTWFzazoxPDx0fX0pO3RoaXMucGlwZWxpbmVzLnNldChgbWFza191bmlvbl9jbGVhcl8ke3R9YCxvKX19Y3JlYXRlTWFza1BpcGVsaW5lKCl7Y29uc3QgZT10aGlzLmRldmljZS5jcmVhdGVCaW5kR3JvdXBMYXlvdXQoe2VudHJpZXM6W3tiaW5kaW5nOjAsdmlzaWJpbGl0eTpHUFVTaGFkZXJTdGFnZS5WRVJURVgsYnVmZmVyOnt0eXBlOiJ1bmlmb3JtIn19XX0pO3RoaXMuYmluZEdyb3VwTGF5b3V0cy5zZXQoIm1hc2siLGUpO2NvbnN0IHQ9dGhpcy5kZXZpY2UuY3JlYXRlUGlwZWxpbmVMYXlvdXQoe2JpbmRHcm91cExheW91dHM6W2VdfSkscj10aGlzLmdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKCJtYXNrVmVydGV4IixmYS5nZXRNYXNrVmVydGV4U2hhZGVyKCkpLG49dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgibWFza0ZyYWdtZW50IixmYS5nZXRNYXNrRnJhZ21lbnRTaGFkZXIoKSksaT10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGF5b3V0OnQsdmVydGV4Onttb2R1bGU6cixlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOlt7YXJyYXlTdHJpZGU6MTYsYXR0cmlidXRlczpbe3NoYWRlckxvY2F0aW9uOjAsb2Zmc2V0OjAsZm9ybWF0OiJmbG9hdDMyeDIifSx7c2hhZGVyTG9jYXRpb246MSxvZmZzZXQ6OCxmb3JtYXQ6ImZsb2F0MzJ4MiJ9XX1dfSxmcmFnbWVudDp7bW9kdWxlOm4sZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDp0aGlzLmZvcm1hdCxibGVuZDp7Y29sb3I6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn0sYWxwaGE6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn19fV19LHByaW1pdGl2ZTp7dG9wb2xvZ3k6InRyaWFuZ2xlLWxpc3QiLGN1bGxNb2RlOiJub25lIn19KTt0aGlzLnBpcGVsaW5lcy5zZXQoIm1hc2siLGkpfWNyZWF0ZUJhc2ljUGlwZWxpbmUoKXtjb25zdCBlPXRoaXMuZGV2aWNlLmNyZWF0ZUJpbmRHcm91cExheW91dCh7ZW50cmllczpbe2JpbmRpbmc6MCx2aXNpYmlsaXR5OkdQVVNoYWRlclN0YWdlLlZFUlRFWHxHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCxidWZmZXI6e3R5cGU6InVuaWZvcm0ifX1dfSk7dGhpcy5iaW5kR3JvdXBMYXlvdXRzLnNldCgiYmFzaWMiLGUpO2NvbnN0IHQ9dGhpcy5kZXZpY2UuY3JlYXRlUGlwZWxpbmVMYXlvdXQoe2JpbmRHcm91cExheW91dHM6W2VdfSkscj10aGlzLmdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKCJiYXNpY1ZlcnRleCIsZmEuZ2V0QmFzaWNWZXJ0ZXhTaGFkZXIoKSksbj10aGlzLmdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKCJiYXNpY0ZyYWdtZW50IixmYS5nZXRCYXNpY0ZyYWdtZW50U2hhZGVyKCkpLGk9e2FycmF5U3RyaWRlOjE2LGF0dHJpYnV0ZXM6W3tzaGFkZXJMb2NhdGlvbjowLG9mZnNldDowLGZvcm1hdDoiZmxvYXQzMngyIn0se3NoYWRlckxvY2F0aW9uOjEsb2Zmc2V0OjgsZm9ybWF0OiJmbG9hdDMyeDIifV19LGE9aGEscz10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGF5b3V0OnQsdmVydGV4Onttb2R1bGU6cixlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOltpXX0sZnJhZ21lbnQ6e21vZHVsZTpuLGVudHJ5UG9pbnQ6Im1haW4iLHRhcmdldHM6W3tmb3JtYXQ6InJnYmE4dW5vcm0iLGJsZW5kOmF9XX0scHJpbWl0aXZlOnt0b3BvbG9neToidHJpYW5nbGUtbGlzdCIsY3VsbE1vZGU6Im5vbmUifSxtdWx0aXNhbXBsZTp7Y291bnQ6dGhpcy5zYW1wbGVDb3VudH19KSxvPXRoaXMuZGV2aWNlLmNyZWF0ZVJlbmRlclBpcGVsaW5lKHtsYXlvdXQ6dCx2ZXJ0ZXg6e21vZHVsZTpyLGVudHJ5UG9pbnQ6Im1haW4iLGJ1ZmZlcnM6W2ldLGNvbnN0YW50czp7eUZsaXBTaWduOi0xfX0sZnJhZ21lbnQ6e21vZHVsZTpuLGVudHJ5UG9pbnQ6Im1haW4iLHRhcmdldHM6W3tmb3JtYXQ6dGhpcy5mb3JtYXQsYmxlbmQ6YX1dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9fSk7dGhpcy5waXBlbGluZXMuc2V0KCJiYXNpYyIscyksdGhpcy5waXBlbGluZXMuc2V0KCJiYXNpY19iZ3JhIixvKX1jcmVhdGVUZXh0dXJlUGlwZWxpbmUoKXtjb25zdCBlPXRoaXMuZGV2aWNlLmNyZWF0ZUJpbmRHcm91cExheW91dCh7ZW50cmllczpbe2JpbmRpbmc6MCx2aXNpYmlsaXR5OkdQVVNoYWRlclN0YWdlLlZFUlRFWHxHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCxidWZmZXI6e3R5cGU6InVuaWZvcm0ifX0se2JpbmRpbmc6MSx2aXNpYmlsaXR5OkdQVVNoYWRlclN0YWdlLkZSQUdNRU5ULHNhbXBsZXI6e319LHtiaW5kaW5nOjIsdmlzaWJpbGl0eTpHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCx0ZXh0dXJlOnt9fV19KTt0aGlzLmJpbmRHcm91cExheW91dHMuc2V0KCJ0ZXh0dXJlIixlKTtjb25zdCB0PXRoaXMuZGV2aWNlLmNyZWF0ZVBpcGVsaW5lTGF5b3V0KHtiaW5kR3JvdXBMYXlvdXRzOltlXX0pLHI9dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgiYmFzaWNWZXJ0ZXgiLGZhLmdldEJhc2ljVmVydGV4U2hhZGVyKCkpLG49dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgidGV4dHVyZUZyYWdtZW50IixmYS5nZXRUZXh0dXJlRnJhZ21lbnRTaGFkZXIoKSksaT10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGF5b3V0OnQsdmVydGV4Onttb2R1bGU6cixlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOlt7YXJyYXlTdHJpZGU6MTYsYXR0cmlidXRlczpbe3NoYWRlckxvY2F0aW9uOjAsb2Zmc2V0OjAsZm9ybWF0OiJmbG9hdDMyeDIifSx7c2hhZGVyTG9jYXRpb246MSxvZmZzZXQ6OCxmb3JtYXQ6ImZsb2F0MzJ4MiJ9XX1dfSxmcmFnbWVudDp7bW9kdWxlOm4sZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDp0aGlzLmZvcm1hdCxibGVuZDp7Y29sb3I6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn0sYWxwaGE6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn19fV19LHByaW1pdGl2ZTp7dG9wb2xvZ3k6InRyaWFuZ2xlLWxpc3QiLGN1bGxNb2RlOiJub25lIn19KTt0aGlzLnBpcGVsaW5lcy5zZXQoInRleHR1cmUiLGkpfWNyZWF0ZUluc3RhbmNlZFBpcGVsaW5lKCl7Y29uc3QgZT10aGlzLmRldmljZS5jcmVhdGVCaW5kR3JvdXBMYXlvdXQoe2VudHJpZXM6W3tiaW5kaW5nOjAsdmlzaWJpbGl0eTpHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCxzYW1wbGVyOnt9fSx7YmluZGluZzoxLHZpc2liaWxpdHk6R1BVU2hhZGVyU3RhZ2UuRlJBR01FTlQsdGV4dHVyZTp7fX1dfSk7dGhpcy5iaW5kR3JvdXBMYXlvdXRzLnNldCgiaW5zdGFuY2VkIixlKTtjb25zdCB0PXRoaXMuZGV2aWNlLmNyZWF0ZVBpcGVsaW5lTGF5b3V0KHtiaW5kR3JvdXBMYXlvdXRzOltlXX0pLHI9dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgiaW5zdGFuY2VkVmVydGV4IixmYS5nZXRJbnN0YW5jZWRWZXJ0ZXhTaGFkZXIoKSksbj10aGlzLmdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKCJpbnN0YW5jZWRGcmFnbWVudCIsZmEuZ2V0SW5zdGFuY2VkRnJhZ21lbnRTaGFkZXIoKSksaT17YXJyYXlTdHJpZGU6OTYsc3RlcE1vZGU6Imluc3RhbmNlIixhdHRyaWJ1dGVzOlt7c2hhZGVyTG9jYXRpb246MixvZmZzZXQ6MCxmb3JtYXQ6ImZsb2F0MzJ4NCJ9LHtzaGFkZXJMb2NhdGlvbjozLG9mZnNldDoxNixmb3JtYXQ6ImZsb2F0MzJ4NCJ9LHtzaGFkZXJMb2NhdGlvbjo0LG9mZnNldDozMixmb3JtYXQ6ImZsb2F0MzJ4NCJ9LHtzaGFkZXJMb2NhdGlvbjo1LG9mZnNldDo0OCxmb3JtYXQ6ImZsb2F0MzJ4NCJ9LHtzaGFkZXJMb2NhdGlvbjo2LG9mZnNldDo2NCxmb3JtYXQ6ImZsb2F0MzJ4NCJ9LHtzaGFkZXJMb2NhdGlvbjo3LG9mZnNldDo4MCxmb3JtYXQ6ImZsb2F0MzJ4NCJ9XX0sYT10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGF5b3V0OnQsdmVydGV4Onttb2R1bGU6cixlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOlt7YXJyYXlTdHJpZGU6MTYsc3RlcE1vZGU6InZlcnRleCIsYXR0cmlidXRlczpbe3NoYWRlckxvY2F0aW9uOjAsb2Zmc2V0OjAsZm9ybWF0OiJmbG9hdDMyeDIifSx7c2hhZGVyTG9jYXRpb246MSxvZmZzZXQ6OCxmb3JtYXQ6ImZsb2F0MzJ4MiJ9XX0saV19LGZyYWdtZW50Onttb2R1bGU6bixlbnRyeVBvaW50OiJtYWluIix0YXJnZXRzOlt7Zm9ybWF0OnRoaXMuZm9ybWF0LGJsZW5kOntjb2xvcjp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3Rvcjoib25lLW1pbnVzLXNyYy1hbHBoYSIsb3BlcmF0aW9uOiJhZGQifSxhbHBoYTp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3Rvcjoib25lLW1pbnVzLXNyYy1hbHBoYSIsb3BlcmF0aW9uOiJhZGQifX19XX0scHJpbWl0aXZlOnt0b3BvbG9neToidHJpYW5nbGUtbGlzdCIsY3VsbE1vZGU6Im5vbmUifSxtdWx0aXNhbXBsZTp7Y291bnQ6dGhpcy5zYW1wbGVDb3VudH19KTt0aGlzLnBpcGVsaW5lcy5zZXQoImluc3RhbmNlZCIsYSk7Y29uc3Qgcz1be2FycmF5U3RyaWRlOjE2LHN0ZXBNb2RlOiJ2ZXJ0ZXgiLGF0dHJpYnV0ZXM6W3tzaGFkZXJMb2NhdGlvbjowLG9mZnNldDowLGZvcm1hdDoiZmxvYXQzMngyIn0se3NoYWRlckxvY2F0aW9uOjEsb2Zmc2V0OjgsZm9ybWF0OiJmbG9hdDMyeDIifV19LGldLG89W1siaW5zdGFuY2VkX2FkZCIse2NvbG9yOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJvbmUiLG9wZXJhdGlvbjoiYWRkIn0sYWxwaGE6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn19XSxbImluc3RhbmNlZF9zY3JlZW4iLHtjb2xvcjp7c3JjRmFjdG9yOiJvbmUtbWludXMtZHN0Iixkc3RGYWN0b3I6Im9uZSIsb3BlcmF0aW9uOiJhZGQifSxhbHBoYTp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3Rvcjoib25lLW1pbnVzLXNyYy1hbHBoYSIsb3BlcmF0aW9uOiJhZGQifX1dLFsiaW5zdGFuY2VkX2FscGhhIix7Y29sb3I6e3NyY0ZhY3RvcjoiemVybyIsZHN0RmFjdG9yOiJzcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn0sYWxwaGE6e3NyY0ZhY3RvcjoiemVybyIsZHN0RmFjdG9yOiJzcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn19XSxbImluc3RhbmNlZF9lcmFzZSIse2NvbG9yOntzcmNGYWN0b3I6Inplcm8iLGRzdEZhY3Rvcjoib25lLW1pbnVzLXNyYy1hbHBoYSIsb3BlcmF0aW9uOiJhZGQifSxhbHBoYTp7c3JjRmFjdG9yOiJ6ZXJvIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn19XSxbImluc3RhbmNlZF9jb3B5Iix7Y29sb3I6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Inplcm8iLG9wZXJhdGlvbjoiYWRkIn0sYWxwaGE6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Inplcm8iLG9wZXJhdGlvbjoiYWRkIn19XV07Zm9yKGNvbnN0W2UsaV1vZiBvKXtjb25zdCBhPXRoaXMuZGV2aWNlLmNyZWF0ZVJlbmRlclBpcGVsaW5lKHtsYXlvdXQ6dCx2ZXJ0ZXg6e21vZHVsZTpyLGVudHJ5UG9pbnQ6Im1haW4iLGJ1ZmZlcnM6c30sZnJhZ21lbnQ6e21vZHVsZTpuLGVudHJ5UG9pbnQ6Im1haW4iLHRhcmdldHM6W3tmb3JtYXQ6dGhpcy5mb3JtYXQsYmxlbmQ6aX1dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9LG11bHRpc2FtcGxlOntjb3VudDp0aGlzLnNhbXBsZUNvdW50fX0pO3RoaXMucGlwZWxpbmVzLnNldChlLGEpfWNvbnN0IGw9dGhpcy5kZXZpY2UuY3JlYXRlUmVuZGVyUGlwZWxpbmUoe2xheW91dDp0LHZlcnRleDp7bW9kdWxlOnIsZW50cnlQb2ludDoibWFpbiIsYnVmZmVyczpbe2FycmF5U3RyaWRlOjE2LHN0ZXBNb2RlOiJ2ZXJ0ZXgiLGF0dHJpYnV0ZXM6W3tzaGFkZXJMb2NhdGlvbjowLG9mZnNldDowLGZvcm1hdDoiZmxvYXQzMngyIn0se3NoYWRlckxvY2F0aW9uOjEsb2Zmc2V0OjgsZm9ybWF0OiJmbG9hdDMyeDIifV19LGldfSxmcmFnbWVudDp7bW9kdWxlOm4sZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDp0aGlzLmZvcm1hdCxibGVuZDp7Y29sb3I6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn0sYWxwaGE6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn19fV19LHByaW1pdGl2ZTp7dG9wb2xvZ3k6InRyaWFuZ2xlLWxpc3QiLGN1bGxNb2RlOiJub25lIn0sZGVwdGhTdGVuY2lsOntmb3JtYXQ6InN0ZW5jaWw4IixzdGVuY2lsRnJvbnQ6e2NvbXBhcmU6ImVxdWFsIixmYWlsT3A6ImtlZXAiLGRlcHRoRmFpbE9wOiJrZWVwIixwYXNzT3A6ImtlZXAifSxzdGVuY2lsQmFjazp7Y29tcGFyZToiZXF1YWwiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6ImtlZXAiLHBhc3NPcDoia2VlcCJ9LHN0ZW5jaWxSZWFkTWFzazoyNTUsc3RlbmNpbFdyaXRlTWFzazowfSxtdWx0aXNhbXBsZTp7Y291bnQ6dGhpcy5zYW1wbGVDb3VudH19KTt0aGlzLnBpcGVsaW5lcy5zZXQoImluc3RhbmNlZF9tYXNrZWQiLGwpfWNyZWF0ZUdyYWRpZW50UGlwZWxpbmUoKXtjb25zdCBlPXRoaXMuZGV2aWNlLmNyZWF0ZUJpbmRHcm91cExheW91dCh7ZW50cmllczpbe2JpbmRpbmc6MCx2aXNpYmlsaXR5OkdQVVNoYWRlclN0YWdlLlZFUlRFWHxHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCxidWZmZXI6e3R5cGU6InVuaWZvcm0ifX0se2JpbmRpbmc6MSx2aXNpYmlsaXR5OkdQVVNoYWRlclN0YWdlLkZSQUdNRU5ULHNhbXBsZXI6e319LHtiaW5kaW5nOjIsdmlzaWJpbGl0eTpHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCx0ZXh0dXJlOnt9fV19KTt0aGlzLmJpbmRHcm91cExheW91dHMuc2V0KCJncmFkaWVudF9maWxsIixlKTtjb25zdCB0PXRoaXMuZGV2aWNlLmNyZWF0ZVBpcGVsaW5lTGF5b3V0KHtiaW5kR3JvdXBMYXlvdXRzOltlXX0pO3RoaXMuZ3JhZGllbnRQaXBlbGluZUxheW91dD10O2NvbnN0IHI9dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgiZ3JhZGllbnRGaWxsVmVydGV4IixmYS5nZXRHcmFkaWVudEZpbGxWZXJ0ZXhTaGFkZXIoKSk7dGhpcy5ncmFkaWVudFZlcnRleFNoYWRlck1vZHVsZT1yO2NvbnN0IG49dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgiZ3JhZGllbnRGaWxsRnJhZ21lbnQiLGZhLmdldEdyYWRpZW50RmlsbEZyYWdtZW50U2hhZGVyKCkpO3RoaXMuZ3JhZGllbnRGcmFnbWVudFNoYWRlck1vZHVsZT1uO2NvbnN0IGk9dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgiZ3JhZGllbnRGaWxsU3RlbmNpbEZyYWdtZW50IixmYS5nZXRHcmFkaWVudEZpbGxTdGVuY2lsRnJhZ21lbnRTaGFkZXIoKSk7dGhpcy5ncmFkaWVudFN0ZW5jaWxGcmFnbWVudFNoYWRlck1vZHVsZT1pO2NvbnN0IGE9ZGEscz1oYSxvPXRoaXMuZGV2aWNlLmNyZWF0ZVJlbmRlclBpcGVsaW5lKHtsYWJlbDoiZ3JhZGllbnRfZmlsbF9ub19zdGVuY2lsX3BpcGVsaW5lIixsYXlvdXQ6dCx2ZXJ0ZXg6e21vZHVsZTpyLGVudHJ5UG9pbnQ6Im1haW4iLGJ1ZmZlcnM6W2FdfSxmcmFnbWVudDp7bW9kdWxlOm4sZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDoicmdiYTh1bm9ybSIsYmxlbmQ6c31dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9LG11bHRpc2FtcGxlOntjb3VudDp0aGlzLnNhbXBsZUNvdW50fX0pLGw9dGhpcy5kZXZpY2UuY3JlYXRlUmVuZGVyUGlwZWxpbmUoe2xheW91dDp0LHZlcnRleDp7bW9kdWxlOnIsZW50cnlQb2ludDoibWFpbiIsYnVmZmVyczpbYV0sY29uc3RhbnRzOnt5RmxpcFNpZ246LTF9fSxmcmFnbWVudDp7bW9kdWxlOm4sZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDp0aGlzLmZvcm1hdCxibGVuZDpzfV19LHByaW1pdGl2ZTp7dG9wb2xvZ3k6InRyaWFuZ2xlLWxpc3QiLGN1bGxNb2RlOiJub25lIn0sbXVsdGlzYW1wbGU6e2NvdW50OnRoaXMuc2FtcGxlQ291bnR9fSk7dGhpcy5waXBlbGluZXMuc2V0KCJncmFkaWVudF9maWxsIixvKSx0aGlzLnBpcGVsaW5lcy5zZXQoImdyYWRpZW50X2ZpbGxfbm9fc3RlbmNpbCIsbyksdGhpcy5waXBlbGluZXMuc2V0KCJncmFkaWVudF9maWxsX2JncmEiLGwpO2NvbnN0IGM9e2Zvcm1hdDoic3RlbmNpbDgiLHN0ZW5jaWxGcm9udDp7Y29tcGFyZToiYWx3YXlzIixmYWlsT3A6ImtlZXAiLGRlcHRoRmFpbE9wOiJrZWVwIixwYXNzT3A6ImtlZXAifSxzdGVuY2lsQmFjazp7Y29tcGFyZToiYWx3YXlzIixmYWlsT3A6ImtlZXAiLGRlcHRoRmFpbE9wOiJrZWVwIixwYXNzT3A6ImtlZXAifSxzdGVuY2lsUmVhZE1hc2s6MCxzdGVuY2lsV3JpdGVNYXNrOjB9LHU9dGhpcy5kZXZpY2UuY3JlYXRlUmVuZGVyUGlwZWxpbmUoe2xhYmVsOiJncmFkaWVudF9zdHJva2VfYXRsYXNfcGlwZWxpbmUiLGxheW91dDp0LHZlcnRleDp7bW9kdWxlOnIsZW50cnlQb2ludDoibWFpbiIsYnVmZmVyczpbYV19LGZyYWdtZW50Onttb2R1bGU6bixlbnRyeVBvaW50OiJtYWluIix0YXJnZXRzOlt7Zm9ybWF0OiJyZ2JhOHVub3JtIixibGVuZDpzfV19LHByaW1pdGl2ZTp7dG9wb2xvZ3k6InRyaWFuZ2xlLWxpc3QiLGN1bGxNb2RlOiJub25lIn0sZGVwdGhTdGVuY2lsOmMsbXVsdGlzYW1wbGU6e2NvdW50OnRoaXMuc2FtcGxlQ291bnR9fSk7dGhpcy5waXBlbGluZXMuc2V0KCJncmFkaWVudF9zdHJva2VfYXRsYXMiLHUpO2NvbnN0IGY9dGhpcy5kZXZpY2UuY3JlYXRlUmVuZGVyUGlwZWxpbmUoe2xhYmVsOiJncmFkaWVudF9zdHJva2VfYmdyYV9waXBlbGluZSIsbGF5b3V0OnQsdmVydGV4Onttb2R1bGU6cixlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOlthXSxjb25zdGFudHM6e3lGbGlwU2lnbjotMX19LGZyYWdtZW50Onttb2R1bGU6bixlbnRyeVBvaW50OiJtYWluIix0YXJnZXRzOlt7Zm9ybWF0OnRoaXMuZm9ybWF0LGJsZW5kOnN9XX0scHJpbWl0aXZlOnt0b3BvbG9neToidHJpYW5nbGUtbGlzdCIsY3VsbE1vZGU6Im5vbmUifSxkZXB0aFN0ZW5jaWw6YyxtdWx0aXNhbXBsZTp7Y291bnQ6dGhpcy5zYW1wbGVDb3VudH19KTt0aGlzLnBpcGVsaW5lcy5zZXQoImdyYWRpZW50X3N0cm9rZV9iZ3JhIixmKTtjb25zdCBkPXRoaXMuZGV2aWNlLmNyZWF0ZVJlbmRlclBpcGVsaW5lKHtsYXlvdXQ6dCx2ZXJ0ZXg6e21vZHVsZTpyLGVudHJ5UG9pbnQ6Im1haW4iLGJ1ZmZlcnM6W2FdLGNvbnN0YW50czp7eUZsaXBTaWduOi0xfX0sZnJhZ21lbnQ6e21vZHVsZTpuLGVudHJ5UG9pbnQ6Im1haW4iLHRhcmdldHM6W3tmb3JtYXQ6dGhpcy5mb3JtYXQsYmxlbmQ6c31dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9LG11bHRpc2FtcGxlOntjb3VudDoxfX0pO3RoaXMucGlwZWxpbmVzLnNldCgiZ3JhZGllbnRfZmlsbF9iZ3JhX25vX21zYWEiLGQpO2NvbnN0IGg9dGhpcy5kZXZpY2UuY3JlYXRlUmVuZGVyUGlwZWxpbmUoe2xheW91dDp0LHZlcnRleDp7bW9kdWxlOnIsZW50cnlQb2ludDoibWFpbiIsYnVmZmVyczpbYV19LGZyYWdtZW50Onttb2R1bGU6bixlbnRyeVBvaW50OiJtYWluIix0YXJnZXRzOlt7Zm9ybWF0OiJyZ2JhOHVub3JtIixibGVuZDpzfV19LHByaW1pdGl2ZTp7dG9wb2xvZ3k6InRyaWFuZ2xlLWxpc3QiLGN1bGxNb2RlOiJub25lIn0sZGVwdGhTdGVuY2lsOntmb3JtYXQ6InN0ZW5jaWw4IixzdGVuY2lsRnJvbnQ6e2NvbXBhcmU6Im5vdC1lcXVhbCIsZmFpbE9wOiJrZWVwIixkZXB0aEZhaWxPcDoiemVybyIscGFzc09wOiJ6ZXJvIn0sc3RlbmNpbEJhY2s6e2NvbXBhcmU6Im5vdC1lcXVhbCIsZmFpbE9wOiJrZWVwIixkZXB0aEZhaWxPcDoiemVybyIscGFzc09wOiJ6ZXJvIn0sc3RlbmNpbFJlYWRNYXNrOjI1NSxzdGVuY2lsV3JpdGVNYXNrOjI1NX0sbXVsdGlzYW1wbGU6e2NvdW50OnRoaXMuc2FtcGxlQ291bnR9fSk7dGhpcy5waXBlbGluZXMuc2V0KCJncmFkaWVudF9maWxsX3N0ZW5jaWwiLGgpO2NvbnN0IHA9dGhpcy5kZXZpY2UuY3JlYXRlUmVuZGVyUGlwZWxpbmUoe2xheW91dDp0LHZlcnRleDp7bW9kdWxlOnIsZW50cnlQb2ludDoibWFpbiIsYnVmZmVyczpbYV19LGZyYWdtZW50Onttb2R1bGU6aSxlbnRyeVBvaW50OiJtYWluIix0YXJnZXRzOlt7Zm9ybWF0OiJyZ2JhOHVub3JtIixibGVuZDpzfV19LHByaW1pdGl2ZTp7dG9wb2xvZ3k6InRyaWFuZ2xlLWxpc3QiLGN1bGxNb2RlOiJub25lIn0sZGVwdGhTdGVuY2lsOntmb3JtYXQ6InN0ZW5jaWw4IixzdGVuY2lsRnJvbnQ6e2NvbXBhcmU6Im5vdC1lcXVhbCIsZmFpbE9wOiJrZWVwIixkZXB0aEZhaWxPcDoiemVybyIscGFzc09wOiJ6ZXJvIn0sc3RlbmNpbEJhY2s6e2NvbXBhcmU6Im5vdC1lcXVhbCIsZmFpbE9wOiJrZWVwIixkZXB0aEZhaWxPcDoiemVybyIscGFzc09wOiJ6ZXJvIn0sc3RlbmNpbFJlYWRNYXNrOjI1NSxzdGVuY2lsV3JpdGVNYXNrOjI1NX0sbXVsdGlzYW1wbGU6e2NvdW50OnRoaXMuc2FtcGxlQ291bnR9fSk7dGhpcy5waXBlbGluZXMuc2V0KCJncmFkaWVudF9maWxsX3N0ZW5jaWxfYXRsYXMiLHApO2NvbnN0IG09dGhpcy5kZXZpY2UuY3JlYXRlUmVuZGVyUGlwZWxpbmUoe2xheW91dDp0LHZlcnRleDp7bW9kdWxlOnIsZW50cnlQb2ludDoibWFpbiIsYnVmZmVyczpbYV0sY29uc3RhbnRzOnt5RmxpcFNpZ246LTF9fSxmcmFnbWVudDp7bW9kdWxlOmksZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDp0aGlzLmZvcm1hdCxibGVuZDpzfV19LHByaW1pdGl2ZTp7dG9wb2xvZ3k6InRyaWFuZ2xlLWxpc3QiLGN1bGxNb2RlOiJub25lIn0sZGVwdGhTdGVuY2lsOntmb3JtYXQ6InN0ZW5jaWw4IixzdGVuY2lsRnJvbnQ6e2NvbXBhcmU6Im5vdC1lcXVhbCIsZmFpbE9wOiJrZWVwIixkZXB0aEZhaWxPcDoiemVybyIscGFzc09wOiJ6ZXJvIn0sc3RlbmNpbEJhY2s6e2NvbXBhcmU6Im5vdC1lcXVhbCIsZmFpbE9wOiJrZWVwIixkZXB0aEZhaWxPcDoiemVybyIscGFzc09wOiJ6ZXJvIn0sc3RlbmNpbFJlYWRNYXNrOjI1NSxzdGVuY2lsV3JpdGVNYXNrOjI1NX0sbXVsdGlzYW1wbGU6e2NvdW50OjF9fSk7dGhpcy5waXBlbGluZXMuc2V0KCJncmFkaWVudF9maWxsX3N0ZW5jaWxfbWFpbiIsbSk7Y29uc3QgZz10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGF5b3V0OnQsdmVydGV4Onttb2R1bGU6cixlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOlthXSxjb25zdGFudHM6e3lGbGlwU2lnbjotMX19LGZyYWdtZW50Onttb2R1bGU6bixlbnRyeVBvaW50OiJtYWluIix0YXJnZXRzOlt7Zm9ybWF0OnRoaXMuZm9ybWF0LGJsZW5kOnN9XX0scHJpbWl0aXZlOnt0b3BvbG9neToidHJpYW5nbGUtbGlzdCIsY3VsbE1vZGU6Im5vbmUifSxkZXB0aFN0ZW5jaWw6e2Zvcm1hdDoic3RlbmNpbDgiLHN0ZW5jaWxGcm9udDp7Y29tcGFyZToiZXF1YWwiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6ImtlZXAiLHBhc3NPcDoia2VlcCJ9LHN0ZW5jaWxCYWNrOntjb21wYXJlOiJlcXVhbCIsZmFpbE9wOiJrZWVwIixkZXB0aEZhaWxPcDoia2VlcCIscGFzc09wOiJrZWVwIn0sc3RlbmNpbFJlYWRNYXNrOjI1NSxzdGVuY2lsV3JpdGVNYXNrOjB9LG11bHRpc2FtcGxlOntjb3VudDp0aGlzLnNhbXBsZUNvdW50fX0pO3RoaXMucGlwZWxpbmVzLnNldCgiZ3JhZGllbnRfZmlsbF9iZ3JhX3N0ZW5jaWwiLGcpfWNyZWF0ZUJpdG1hcEZpbGxQaXBlbGluZSgpe2NvbnN0IGU9dGhpcy5kZXZpY2UuY3JlYXRlQmluZEdyb3VwTGF5b3V0KHtlbnRyaWVzOlt7YmluZGluZzowLHZpc2liaWxpdHk6R1BVU2hhZGVyU3RhZ2UuVkVSVEVYfEdQVVNoYWRlclN0YWdlLkZSQUdNRU5ULGJ1ZmZlcjp7dHlwZToidW5pZm9ybSJ9fSx7YmluZGluZzoxLHZpc2liaWxpdHk6R1BVU2hhZGVyU3RhZ2UuRlJBR01FTlQsc2FtcGxlcjp7fX0se2JpbmRpbmc6Mix2aXNpYmlsaXR5OkdQVVNoYWRlclN0YWdlLkZSQUdNRU5ULHRleHR1cmU6e319XX0pO3RoaXMuYmluZEdyb3VwTGF5b3V0cy5zZXQoImJpdG1hcF9maWxsIixlKTtjb25zdCB0PXRoaXMuZGV2aWNlLmNyZWF0ZVBpcGVsaW5lTGF5b3V0KHtiaW5kR3JvdXBMYXlvdXRzOltlXX0pLHI9dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgiYml0bWFwRmlsbFZlcnRleCIsZmEuZ2V0Qml0bWFwRmlsbFZlcnRleFNoYWRlcigpKSxuPXRoaXMuZ2V0T3JDcmVhdGVTaGFkZXJNb2R1bGUoImJpdG1hcEZpbGxGcmFnbWVudCIsZmEuZ2V0Qml0bWFwRmlsbEZyYWdtZW50U2hhZGVyKCkpLGk9ZGEsYT1oYSxzPXRoaXMuZGV2aWNlLmNyZWF0ZVJlbmRlclBpcGVsaW5lKHtsYXlvdXQ6dCx2ZXJ0ZXg6e21vZHVsZTpyLGVudHJ5UG9pbnQ6Im1haW4iLGJ1ZmZlcnM6W2ldfSxmcmFnbWVudDp7bW9kdWxlOm4sZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDoicmdiYTh1bm9ybSIsYmxlbmQ6YX1dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9LG11bHRpc2FtcGxlOntjb3VudDp0aGlzLnNhbXBsZUNvdW50fX0pLG89dGhpcy5kZXZpY2UuY3JlYXRlUmVuZGVyUGlwZWxpbmUoe2xheW91dDp0LHZlcnRleDp7bW9kdWxlOnIsZW50cnlQb2ludDoibWFpbiIsYnVmZmVyczpbaV0sY29uc3RhbnRzOnt5RmxpcFNpZ246LTF9fSxmcmFnbWVudDp7bW9kdWxlOm4sZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDp0aGlzLmZvcm1hdCxibGVuZDphfV19LHByaW1pdGl2ZTp7dG9wb2xvZ3k6InRyaWFuZ2xlLWxpc3QiLGN1bGxNb2RlOiJub25lIn19KTt0aGlzLnBpcGVsaW5lcy5zZXQoImJpdG1hcF9maWxsIixzKSx0aGlzLnBpcGVsaW5lcy5zZXQoImJpdG1hcF9maWxsX2JncmEiLG8pO2NvbnN0IGw9e2Zvcm1hdDoic3RlbmNpbDgiLHN0ZW5jaWxGcm9udDp7Y29tcGFyZToiYWx3YXlzIixmYWlsT3A6ImtlZXAiLGRlcHRoRmFpbE9wOiJrZWVwIixwYXNzT3A6ImtlZXAifSxzdGVuY2lsQmFjazp7Y29tcGFyZToiYWx3YXlzIixmYWlsT3A6ImtlZXAiLGRlcHRoRmFpbE9wOiJrZWVwIixwYXNzT3A6ImtlZXAifSxzdGVuY2lsUmVhZE1hc2s6MCxzdGVuY2lsV3JpdGVNYXNrOjB9LGM9dGhpcy5kZXZpY2UuY3JlYXRlUmVuZGVyUGlwZWxpbmUoe2xhYmVsOiJiaXRtYXBfc3Ryb2tlX2F0bGFzX3BpcGVsaW5lIixsYXlvdXQ6dCx2ZXJ0ZXg6e21vZHVsZTpyLGVudHJ5UG9pbnQ6Im1haW4iLGJ1ZmZlcnM6W2ldfSxmcmFnbWVudDp7bW9kdWxlOm4sZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDoicmdiYTh1bm9ybSIsYmxlbmQ6YX1dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9LGRlcHRoU3RlbmNpbDpsLG11bHRpc2FtcGxlOntjb3VudDp0aGlzLnNhbXBsZUNvdW50fX0pO3RoaXMucGlwZWxpbmVzLnNldCgiYml0bWFwX3N0cm9rZV9hdGxhcyIsYyk7Y29uc3QgdT10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGFiZWw6ImJpdG1hcF9zdHJva2VfYmdyYV9waXBlbGluZSIsbGF5b3V0OnQsdmVydGV4Onttb2R1bGU6cixlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOltpXSxjb25zdGFudHM6e3lGbGlwU2lnbjotMX19LGZyYWdtZW50Onttb2R1bGU6bixlbnRyeVBvaW50OiJtYWluIix0YXJnZXRzOlt7Zm9ybWF0OnRoaXMuZm9ybWF0LGJsZW5kOmF9XX0scHJpbWl0aXZlOnt0b3BvbG9neToidHJpYW5nbGUtbGlzdCIsY3VsbE1vZGU6Im5vbmUifSxkZXB0aFN0ZW5jaWw6bCxtdWx0aXNhbXBsZTp7Y291bnQ6dGhpcy5zYW1wbGVDb3VudH19KTt0aGlzLnBpcGVsaW5lcy5zZXQoImJpdG1hcF9zdHJva2VfYmdyYSIsdSk7Y29uc3QgZj10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGF5b3V0OnQsdmVydGV4Onttb2R1bGU6cixlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOltpXX0sZnJhZ21lbnQ6e21vZHVsZTpuLGVudHJ5UG9pbnQ6Im1haW4iLHRhcmdldHM6W3tmb3JtYXQ6InJnYmE4dW5vcm0iLGJsZW5kOmF9XX0scHJpbWl0aXZlOnt0b3BvbG9neToidHJpYW5nbGUtbGlzdCIsY3VsbE1vZGU6Im5vbmUifSxkZXB0aFN0ZW5jaWw6e2Zvcm1hdDoic3RlbmNpbDgiLHN0ZW5jaWxGcm9udDp7Y29tcGFyZToibm90LWVxdWFsIixmYWlsT3A6ImtlZXAiLGRlcHRoRmFpbE9wOiJ6ZXJvIixwYXNzT3A6Inplcm8ifSxzdGVuY2lsQmFjazp7Y29tcGFyZToibm90LWVxdWFsIixmYWlsT3A6ImtlZXAiLGRlcHRoRmFpbE9wOiJ6ZXJvIixwYXNzT3A6Inplcm8ifSxzdGVuY2lsUmVhZE1hc2s6MjU1LHN0ZW5jaWxXcml0ZU1hc2s6MjU1fSxtdWx0aXNhbXBsZTp7Y291bnQ6dGhpcy5zYW1wbGVDb3VudH19KTt0aGlzLnBpcGVsaW5lcy5zZXQoImJpdG1hcF9maWxsX3N0ZW5jaWwiLGYpO2NvbnN0IGQ9dGhpcy5kZXZpY2UuY3JlYXRlUmVuZGVyUGlwZWxpbmUoe2xheW91dDp0LHZlcnRleDp7bW9kdWxlOnIsZW50cnlQb2ludDoibWFpbiIsYnVmZmVyczpbaV0sY29uc3RhbnRzOnt5RmxpcFNpZ246LTF9fSxmcmFnbWVudDp7bW9kdWxlOm4sZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDp0aGlzLmZvcm1hdCxibGVuZDphfV19LHByaW1pdGl2ZTp7dG9wb2xvZ3k6InRyaWFuZ2xlLWxpc3QiLGN1bGxNb2RlOiJub25lIn0sZGVwdGhTdGVuY2lsOntmb3JtYXQ6InN0ZW5jaWw4IixzdGVuY2lsRnJvbnQ6e2NvbXBhcmU6ImVxdWFsIixmYWlsT3A6ImtlZXAiLGRlcHRoRmFpbE9wOiJrZWVwIixwYXNzT3A6ImtlZXAifSxzdGVuY2lsQmFjazp7Y29tcGFyZToiZXF1YWwiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6ImtlZXAiLHBhc3NPcDoia2VlcCJ9LHN0ZW5jaWxSZWFkTWFzazoyNTUsc3RlbmNpbFdyaXRlTWFzazowfX0pO3RoaXMucGlwZWxpbmVzLnNldCgiYml0bWFwX2ZpbGxfYmdyYV9zdGVuY2lsIixkKX1jcmVhdGVCbGVuZFBpcGVsaW5lKCl7Y29uc3QgZT10aGlzLmRldmljZS5jcmVhdGVCaW5kR3JvdXBMYXlvdXQoe2VudHJpZXM6W3tiaW5kaW5nOjAsdmlzaWJpbGl0eTpHUFVTaGFkZXJTdGFnZS5WRVJURVh8R1BVU2hhZGVyU3RhZ2UuRlJBR01FTlQsYnVmZmVyOnt0eXBlOiJ1bmlmb3JtIn19LHtiaW5kaW5nOjEsdmlzaWJpbGl0eTpHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCxidWZmZXI6e3R5cGU6InVuaWZvcm0ifX0se2JpbmRpbmc6Mix2aXNpYmlsaXR5OkdQVVNoYWRlclN0YWdlLkZSQUdNRU5ULHNhbXBsZXI6e319LHtiaW5kaW5nOjMsdmlzaWJpbGl0eTpHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCx0ZXh0dXJlOnt9fSx7YmluZGluZzo0LHZpc2liaWxpdHk6R1BVU2hhZGVyU3RhZ2UuRlJBR01FTlQsc2FtcGxlcjp7fX0se2JpbmRpbmc6NSx2aXNpYmlsaXR5OkdQVVNoYWRlclN0YWdlLkZSQUdNRU5ULHRleHR1cmU6e319XX0pO3RoaXMuYmluZEdyb3VwTGF5b3V0cy5zZXQoImJsZW5kIixlKTtjb25zdCB0PXRoaXMuZGV2aWNlLmNyZWF0ZVBpcGVsaW5lTGF5b3V0KHtiaW5kR3JvdXBMYXlvdXRzOltlXX0pLHI9dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgiYmFzaWNWZXJ0ZXgiLGZhLmdldEJhc2ljVmVydGV4U2hhZGVyKCkpLG49dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgiYmxlbmRGcmFnbWVudCIsZmEuZ2V0QmxlbmRGcmFnbWVudFNoYWRlcigpKSxpPXRoaXMuZGV2aWNlLmNyZWF0ZVJlbmRlclBpcGVsaW5lKHtsYXlvdXQ6dCx2ZXJ0ZXg6e21vZHVsZTpyLGVudHJ5UG9pbnQ6Im1haW4iLGJ1ZmZlcnM6W3thcnJheVN0cmlkZToxNixhdHRyaWJ1dGVzOlt7c2hhZGVyTG9jYXRpb246MCxvZmZzZXQ6MCxmb3JtYXQ6ImZsb2F0MzJ4MiJ9LHtzaGFkZXJMb2NhdGlvbjoxLG9mZnNldDo4LGZvcm1hdDoiZmxvYXQzMngyIn1dfV19LGZyYWdtZW50Onttb2R1bGU6bixlbnRyeVBvaW50OiJtYWluIix0YXJnZXRzOlt7Zm9ybWF0OnRoaXMuZm9ybWF0LGJsZW5kOntjb2xvcjp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3Rvcjoib25lLW1pbnVzLXNyYy1hbHBoYSIsb3BlcmF0aW9uOiJhZGQifSxhbHBoYTp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3Rvcjoib25lLW1pbnVzLXNyYy1hbHBoYSIsb3BlcmF0aW9uOiJhZGQifX19XX0scHJpbWl0aXZlOnt0b3BvbG9neToidHJpYW5nbGUtbGlzdCIsY3VsbE1vZGU6Im5vbmUifX0pO3RoaXMucGlwZWxpbmVzLnNldCgiYmxlbmQiLGkpfWNyZWF0ZUJsdXJGaWx0ZXJQaXBlbGluZSgpe2NvbnN0IGU9dGhpcy5kZXZpY2UuY3JlYXRlQmluZEdyb3VwTGF5b3V0KHtlbnRyaWVzOlt7YmluZGluZzowLHZpc2liaWxpdHk6R1BVU2hhZGVyU3RhZ2UuRlJBR01FTlQsYnVmZmVyOnt0eXBlOiJ1bmlmb3JtIn19LHtiaW5kaW5nOjEsdmlzaWJpbGl0eTpHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCxzYW1wbGVyOnt9fSx7YmluZGluZzoyLHZpc2liaWxpdHk6R1BVU2hhZGVyU3RhZ2UuRlJBR01FTlQsdGV4dHVyZTp7fX1dfSk7dGhpcy5iaW5kR3JvdXBMYXlvdXRzLnNldCgiYmx1cl9maWx0ZXIiLGUpO2NvbnN0IHQ9dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgiYmx1ckZpbHRlclZlcnRleCIsZmEuZ2V0Qmx1ckZpbHRlclZlcnRleFNoYWRlcigpKSxyPXRoaXMuZGV2aWNlLmNyZWF0ZVBpcGVsaW5lTGF5b3V0KHtiaW5kR3JvdXBMYXlvdXRzOltlXX0pO2ZvcihsZXQgZT0xO2U8PTE2O2UrKyl7Y29uc3Qgbj10aGlzLmdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKGBibHVyRmlsdGVyRnJhZ21lbnRfJHtlfWAsZmEuZ2V0Qmx1ckZpbHRlckZyYWdtZW50U2hhZGVyKGUpKSxpPXRoaXMuZGV2aWNlLmNyZWF0ZVJlbmRlclBpcGVsaW5lKHtsYXlvdXQ6cix2ZXJ0ZXg6e21vZHVsZTp0LGVudHJ5UG9pbnQ6Im1haW4iLGJ1ZmZlcnM6W119LGZyYWdtZW50Onttb2R1bGU6bixlbnRyeVBvaW50OiJtYWluIix0YXJnZXRzOlt7Zm9ybWF0OiJyZ2JhOHVub3JtIixibGVuZDp7Y29sb3I6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Inplcm8iLG9wZXJhdGlvbjoiYWRkIn0sYWxwaGE6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Inplcm8iLG9wZXJhdGlvbjoiYWRkIn19fV19LHByaW1pdGl2ZTp7dG9wb2xvZ3k6InRyaWFuZ2xlLWxpc3QiLGN1bGxNb2RlOiJub25lIn19KTt0aGlzLnBpcGVsaW5lcy5zZXQoYGJsdXJfZmlsdGVyXyR7ZX1gLGkpfX1jcmVhdGVUZXh0dXJlQ29weVBpcGVsaW5lKCl7Y29uc3QgZT10aGlzLmRldmljZS5jcmVhdGVCaW5kR3JvdXBMYXlvdXQoe2VudHJpZXM6W3tiaW5kaW5nOjAsdmlzaWJpbGl0eTpHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCxidWZmZXI6e3R5cGU6InVuaWZvcm0ifX0se2JpbmRpbmc6MSx2aXNpYmlsaXR5OkdQVVNoYWRlclN0YWdlLkZSQUdNRU5ULHNhbXBsZXI6e319LHtiaW5kaW5nOjIsdmlzaWJpbGl0eTpHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCx0ZXh0dXJlOnt9fV19KTt0aGlzLmJpbmRHcm91cExheW91dHMuc2V0KCJ0ZXh0dXJlX2NvcHkiLGUpO2NvbnN0IHQ9dGhpcy5kZXZpY2UuY3JlYXRlUGlwZWxpbmVMYXlvdXQoe2JpbmRHcm91cExheW91dHM6W2VdfSkscj10aGlzLmdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKCJibHVyRmlsdGVyVmVydGV4IixmYS5nZXRCbHVyRmlsdGVyVmVydGV4U2hhZGVyKCkpLG49dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgidGV4dHVyZUNvcHlGcmFnbWVudCIsZmEuZ2V0VGV4dHVyZUNvcHlGcmFnbWVudFNoYWRlcigpKSxpPXtjb2xvcjp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3RvcjoiemVybyIsb3BlcmF0aW9uOiJhZGQifSxhbHBoYTp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3RvcjoiemVybyIsb3BlcmF0aW9uOiJhZGQifX0sYT17Y29sb3I6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn0sYWxwaGE6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn19O3RoaXMucGlwZWxpbmVzLnNldCgidGV4dHVyZV9jb3B5Iix0aGlzLmNyZWF0ZUZ1bGxzY3JlZW5RdWFkUGlwZWxpbmUodCxyLG4sdGhpcy5mb3JtYXQsaSkpLHRoaXMucGlwZWxpbmVzLnNldCgidGV4dHVyZV9jb3B5X3JnYmE4Iix0aGlzLmNyZWF0ZUZ1bGxzY3JlZW5RdWFkUGlwZWxpbmUodCxyLG4sInJnYmE4dW5vcm0iLGkpKTtjb25zdCBzPXRoaXMuZ2V0T3JDcmVhdGVTaGFkZXJNb2R1bGUoImNvbG9yVHJhbnNmb3JtRnJhZ21lbnQiLGZhLmdldENvbG9yVHJhbnNmb3JtRnJhZ21lbnRTaGFkZXIoKSk7dGhpcy5waXBlbGluZXMuc2V0KCJjb2xvcl90cmFuc2Zvcm0iLHRoaXMuY3JlYXRlRnVsbHNjcmVlblF1YWRQaXBlbGluZSh0LHIscywicmdiYTh1bm9ybSIsaSkpO2NvbnN0IG89dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgieUZsaXBDb2xvclRyYW5zZm9ybUZyYWdtZW50IixmYS5nZXRZRmxpcENvbG9yVHJhbnNmb3JtRnJhZ21lbnRTaGFkZXIoKSk7dGhpcy5waXBlbGluZXMuc2V0KCJ5X2ZsaXBfY29sb3JfdHJhbnNmb3JtIix0aGlzLmNyZWF0ZUZ1bGxzY3JlZW5RdWFkUGlwZWxpbmUodCxyLG8sInJnYmE4dW5vcm0iLGkpKTtjb25zdCBsPXRoaXMuZ2V0T3JDcmVhdGVTaGFkZXJNb2R1bGUoImJsdXJUZXh0dXJlQ29weUZyYWdtZW50IixmYS5nZXRCbHVyVGV4dHVyZUNvcHlGcmFnbWVudFNoYWRlcigpKTt0aGlzLnBpcGVsaW5lcy5zZXQoInRleHR1cmVfZXJhc2UiLHRoaXMuY3JlYXRlRnVsbHNjcmVlblF1YWRQaXBlbGluZSh0LHIsbCwicmdiYTh1bm9ybSIse2NvbG9yOntzcmNGYWN0b3I6Inplcm8iLGRzdEZhY3Rvcjoib25lLW1pbnVzLXNyYy1hbHBoYSIsb3BlcmF0aW9uOiJhZGQifSxhbHBoYTp7c3JjRmFjdG9yOiJ6ZXJvIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn19KSksdGhpcy5waXBlbGluZXMuc2V0KCJibHVyX3RleHR1cmVfY29weSIsdGhpcy5jcmVhdGVGdWxsc2NyZWVuUXVhZFBpcGVsaW5lKHQscixsLCJyZ2JhOHVub3JtIixpKSksdGhpcy5waXBlbGluZXMuc2V0KCJmaWx0ZXJfYmxlbmQiLHRoaXMuY3JlYXRlRnVsbHNjcmVlblF1YWRQaXBlbGluZSh0LHIsbix0aGlzLmZvcm1hdCxhKSksdGhpcy5waXBlbGluZXMuc2V0KCJ0ZXh0dXJlX2NvcHlfYmdyYSIsdGhpcy5jcmVhdGVGdWxsc2NyZWVuUXVhZFBpcGVsaW5lKHQscixuLHRoaXMuZm9ybWF0LGkpKTtjb25zdCBjPXRoaXMuZ2V0T3JDcmVhdGVTaGFkZXJNb2R1bGUoImZpbHRlck91dHB1dEZyYWdtZW50IixmYS5nZXRGaWx0ZXJPdXRwdXRGcmFnbWVudFNoYWRlcigpKTt0aGlzLnBpcGVsaW5lcy5zZXQoImZpbHRlcl9vdXRwdXQiLHRoaXMuY3JlYXRlRnVsbHNjcmVlblF1YWRQaXBlbGluZSh0LHIsYyx0aGlzLmZvcm1hdCxhKSk7Y29uc3QgdT1bWyJmaWx0ZXJfb3V0cHV0X2FkZCIse2NvbG9yOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJvbmUiLG9wZXJhdGlvbjoiYWRkIn0sYWxwaGE6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Im9uZSIsb3BlcmF0aW9uOiJhZGQifX1dLFsiZmlsdGVyX291dHB1dF9zY3JlZW4iLHtjb2xvcjp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3Rvcjoib25lLW1pbnVzLXNyYyIsb3BlcmF0aW9uOiJhZGQifSxhbHBoYTp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3Rvcjoib25lLW1pbnVzLXNyYy1hbHBoYSIsb3BlcmF0aW9uOiJhZGQifX1dLFsiZmlsdGVyX291dHB1dF9hbHBoYSIse2NvbG9yOntzcmNGYWN0b3I6Inplcm8iLGRzdEZhY3Rvcjoic3JjLWFscGhhIixvcGVyYXRpb246ImFkZCJ9LGFscGhhOntzcmNGYWN0b3I6Inplcm8iLGRzdEZhY3Rvcjoic3JjLWFscGhhIixvcGVyYXRpb246ImFkZCJ9fV0sWyJmaWx0ZXJfb3V0cHV0X2VyYXNlIix7Y29sb3I6e3NyY0ZhY3RvcjoiemVybyIsZHN0RmFjdG9yOiJvbmUtbWludXMtc3JjLWFscGhhIixvcGVyYXRpb246ImFkZCJ9LGFscGhhOntzcmNGYWN0b3I6Inplcm8iLGRzdEZhY3Rvcjoib25lLW1pbnVzLXNyYy1hbHBoYSIsb3BlcmF0aW9uOiJhZGQifX1dXTtmb3IoY29uc3RbZSxuXW9mIHUpdGhpcy5waXBlbGluZXMuc2V0KGUsdGhpcy5jcmVhdGVGdWxsc2NyZWVuUXVhZFBpcGVsaW5lKHQscixjLHRoaXMuZm9ybWF0LG4pKTtpZih0aGlzLnNhbXBsZUNvdW50PjEpe2NvbnN0IGU9e2NvbG9yOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJ6ZXJvIixvcGVyYXRpb246ImFkZCJ9LGFscGhhOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJ6ZXJvIixvcGVyYXRpb246ImFkZCJ9fTt0aGlzLnBpcGVsaW5lcy5zZXQoInRleHR1cmVfY29weV9iZ3JhX21zYWEiLHRoaXMuY3JlYXRlRnVsbHNjcmVlblF1YWRQaXBlbGluZSh0LHIsbix0aGlzLmZvcm1hdCxlLHRoaXMuc2FtcGxlQ291bnQpKTtjb25zdCBpPXtjb2xvcjp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3Rvcjoib25lLW1pbnVzLXNyYy1hbHBoYSIsb3BlcmF0aW9uOiJhZGQifSxhbHBoYTp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3Rvcjoib25lLW1pbnVzLXNyYy1hbHBoYSIsb3BlcmF0aW9uOiJhZGQifX07dGhpcy5waXBlbGluZXMuc2V0KCJmaWx0ZXJfb3V0cHV0X21zYWEiLHRoaXMuY3JlYXRlRnVsbHNjcmVlblF1YWRQaXBlbGluZSh0LHIsYyx0aGlzLmZvcm1hdCxpLHRoaXMuc2FtcGxlQ291bnQpKTtmb3IoY29uc3RbZSxuXW9mIHUpdGhpcy5waXBlbGluZXMuc2V0KGAke2V9X21zYWFgLHRoaXMuY3JlYXRlRnVsbHNjcmVlblF1YWRQaXBlbGluZSh0LHIsYyx0aGlzLmZvcm1hdCxuLHRoaXMuc2FtcGxlQ291bnQpKX10aGlzLmNyZWF0ZVBvc2l0aW9uZWRUZXh0dXJlUGlwZWxpbmUoKSx0aGlzLmNyZWF0ZVRleHR1cmVTY2FsZVBpcGVsaW5lKCl9Y3JlYXRlUG9zaXRpb25lZFRleHR1cmVQaXBlbGluZSgpe2NvbnN0IGU9dGhpcy5kZXZpY2UuY3JlYXRlQmluZEdyb3VwTGF5b3V0KHtlbnRyaWVzOlt7YmluZGluZzowLHZpc2liaWxpdHk6R1BVU2hhZGVyU3RhZ2UuVkVSVEVYLGJ1ZmZlcjp7dHlwZToidW5pZm9ybSJ9fSx7YmluZGluZzoxLHZpc2liaWxpdHk6R1BVU2hhZGVyU3RhZ2UuRlJBR01FTlQsc2FtcGxlcjp7fX0se2JpbmRpbmc6Mix2aXNpYmlsaXR5OkdQVVNoYWRlclN0YWdlLkZSQUdNRU5ULHRleHR1cmU6e319XX0pO3RoaXMuYmluZEdyb3VwTGF5b3V0cy5zZXQoInBvc2l0aW9uZWRfdGV4dHVyZSIsZSk7Y29uc3QgdD10aGlzLmRldmljZS5jcmVhdGVQaXBlbGluZUxheW91dCh7YmluZEdyb3VwTGF5b3V0czpbZV19KSxyPXRoaXMuZ2V0T3JDcmVhdGVTaGFkZXJNb2R1bGUoInBvc2l0aW9uZWRUZXh0dXJlVmVydGV4IixmYS5nZXRQb3NpdGlvbmVkVGV4dHVyZVZlcnRleFNoYWRlcigpKSxuPXRoaXMuZ2V0T3JDcmVhdGVTaGFkZXJNb2R1bGUoInBvc2l0aW9uZWRUZXh0dXJlRnJhZ21lbnQiLGZhLmdldFBvc2l0aW9uZWRUZXh0dXJlRnJhZ21lbnRTaGFkZXIoKSksaT10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGF5b3V0OnQsdmVydGV4Onttb2R1bGU6cixlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOltdfSxmcmFnbWVudDp7bW9kdWxlOm4sZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDp0aGlzLmZvcm1hdCxibGVuZDp7Y29sb3I6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn0sYWxwaGE6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn19fV19LHByaW1pdGl2ZTp7dG9wb2xvZ3k6InRyaWFuZ2xlLWxpc3QiLGN1bGxNb2RlOiJub25lIn19KTt0aGlzLnBpcGVsaW5lcy5zZXQoInBvc2l0aW9uZWRfdGV4dHVyZSIsaSk7Y29uc3QgYT10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGF5b3V0OnQsdmVydGV4Onttb2R1bGU6cixlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOltdfSxmcmFnbWVudDp7bW9kdWxlOm4sZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDoicmdiYTh1bm9ybSIsYmxlbmQ6e2NvbG9yOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJvbmUtbWludXMtc3JjLWFscGhhIixvcGVyYXRpb246ImFkZCJ9LGFscGhhOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJvbmUtbWludXMtc3JjLWFscGhhIixvcGVyYXRpb246ImFkZCJ9fX1dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9fSk7dGhpcy5waXBlbGluZXMuc2V0KCJwb3NpdGlvbmVkX3RleHR1cmVfcmdiYSIsYSk7Y29uc3Qgcz10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGF5b3V0OnQsdmVydGV4Onttb2R1bGU6cixlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOltdfSxmcmFnbWVudDp7bW9kdWxlOm4sZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDoicmdiYTh1bm9ybSIsYmxlbmQ6e2NvbG9yOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJ6ZXJvIixvcGVyYXRpb246ImFkZCJ9LGFscGhhOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJ6ZXJvIixvcGVyYXRpb246ImFkZCJ9fX1dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9LG11bHRpc2FtcGxlOntjb3VudDo0fSxkZXB0aFN0ZW5jaWw6e2Zvcm1hdDoic3RlbmNpbDgiLHN0ZW5jaWxGcm9udDp7Y29tcGFyZToiYWx3YXlzIixmYWlsT3A6ImtlZXAiLGRlcHRoRmFpbE9wOiJrZWVwIixwYXNzT3A6ImtlZXAifSxzdGVuY2lsQmFjazp7Y29tcGFyZToiYWx3YXlzIixmYWlsT3A6ImtlZXAiLGRlcHRoRmFpbE9wOiJrZWVwIixwYXNzT3A6ImtlZXAifX19KTt0aGlzLnBpcGVsaW5lcy5zZXQoImJpdG1hcF9yZW5kZXJfbXNhYSIscyk7Y29uc3Qgbz10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGF5b3V0OnQsdmVydGV4Onttb2R1bGU6cixlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOltdfSxmcmFnbWVudDp7bW9kdWxlOm4sZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDoicmdiYTh1bm9ybSIsYmxlbmQ6e2NvbG9yOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJ6ZXJvIixvcGVyYXRpb246ImFkZCJ9LGFscGhhOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJ6ZXJvIixvcGVyYXRpb246ImFkZCJ9fX1dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9LGRlcHRoU3RlbmNpbDp7Zm9ybWF0OiJzdGVuY2lsOCIsc3RlbmNpbEZyb250Ontjb21wYXJlOiJhbHdheXMiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6ImtlZXAiLHBhc3NPcDoia2VlcCJ9LHN0ZW5jaWxCYWNrOntjb21wYXJlOiJhbHdheXMiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6ImtlZXAiLHBhc3NPcDoia2VlcCJ9fX0pO3RoaXMucGlwZWxpbmVzLnNldCgiYml0bWFwX3JlbmRlciIsbyl9Y3JlYXRlVGV4dHVyZVNjYWxlUGlwZWxpbmUoKXtjb25zdCBlPXRoaXMuZGV2aWNlLmNyZWF0ZUJpbmRHcm91cExheW91dCh7ZW50cmllczpbe2JpbmRpbmc6MCx2aXNpYmlsaXR5OkdQVVNoYWRlclN0YWdlLlZFUlRFWCxidWZmZXI6e3R5cGU6InVuaWZvcm0ifX0se2JpbmRpbmc6MSx2aXNpYmlsaXR5OkdQVVNoYWRlclN0YWdlLkZSQUdNRU5ULHNhbXBsZXI6e319LHtiaW5kaW5nOjIsdmlzaWJpbGl0eTpHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCx0ZXh0dXJlOnt9fV19KTt0aGlzLmJpbmRHcm91cExheW91dHMuc2V0KCJ0ZXh0dXJlX3NjYWxlIixlKTtjb25zdCB0PXRoaXMuZGV2aWNlLmNyZWF0ZVBpcGVsaW5lTGF5b3V0KHtiaW5kR3JvdXBMYXlvdXRzOltlXX0pLHI9dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgidGV4dHVyZVNjYWxlVmVydGV4IixmYS5nZXRUZXh0dXJlU2NhbGVWZXJ0ZXhTaGFkZXIoKSksbj10aGlzLmdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKCJwb3NpdGlvbmVkVGV4dHVyZUZyYWdtZW50IixmYS5nZXRQb3NpdGlvbmVkVGV4dHVyZUZyYWdtZW50U2hhZGVyKCkpLGk9dGhpcy5kZXZpY2UuY3JlYXRlUmVuZGVyUGlwZWxpbmUoe2xheW91dDp0LHZlcnRleDp7bW9kdWxlOnIsZW50cnlQb2ludDoibWFpbiIsYnVmZmVyczpbXX0sZnJhZ21lbnQ6e21vZHVsZTpuLGVudHJ5UG9pbnQ6Im1haW4iLHRhcmdldHM6W3tmb3JtYXQ6InJnYmE4dW5vcm0iLGJsZW5kOntjb2xvcjp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3RvcjoiemVybyIsb3BlcmF0aW9uOiJhZGQifSxhbHBoYTp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3RvcjoiemVybyIsb3BlcmF0aW9uOiJhZGQifX19XX0scHJpbWl0aXZlOnt0b3BvbG9neToidHJpYW5nbGUtbGlzdCIsY3VsbE1vZGU6Im5vbmUifX0pO3RoaXMucGlwZWxpbmVzLnNldCgidGV4dHVyZV9zY2FsZSIsaSk7Y29uc3QgYT10aGlzLmdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKCJ0ZXh0dXJlU2NhbGVCbGVuZFZlcnRleCIsZmEuZ2V0VGV4dHVyZVNjYWxlQmxlbmRWZXJ0ZXhTaGFkZXIoKSkscz10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGF5b3V0OnQsdmVydGV4Onttb2R1bGU6YSxlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOltdfSxmcmFnbWVudDp7bW9kdWxlOm4sZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDoicmdiYTh1bm9ybSIsYmxlbmQ6e2NvbG9yOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJ6ZXJvIixvcGVyYXRpb246ImFkZCJ9LGFscGhhOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJ6ZXJvIixvcGVyYXRpb246ImFkZCJ9fX1dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9fSk7dGhpcy5waXBlbGluZXMuc2V0KCJ0ZXh0dXJlX3NjYWxlX2JsZW5kIixzKX1jcmVhdGVCaXRtYXBTeW5jUGlwZWxpbmUoKXtjb25zdCBlPXRoaXMuZGV2aWNlLmNyZWF0ZUJpbmRHcm91cExheW91dCh7ZW50cmllczpbe2JpbmRpbmc6MCx2aXNpYmlsaXR5OkdQVVNoYWRlclN0YWdlLlZFUlRFWCxidWZmZXI6e3R5cGU6InVuaWZvcm0ifX0se2JpbmRpbmc6MSx2aXNpYmlsaXR5OkdQVVNoYWRlclN0YWdlLkZSQUdNRU5ULHNhbXBsZXI6e3R5cGU6ImZpbHRlcmluZyJ9fSx7YmluZGluZzoyLHZpc2liaWxpdHk6R1BVU2hhZGVyU3RhZ2UuRlJBR01FTlQsdGV4dHVyZTp7c2FtcGxlVHlwZToiZmxvYXQifX1dfSk7dGhpcy5iaW5kR3JvdXBMYXlvdXRzLnNldCgiYml0bWFwX3N5bmMiLGUpO2NvbnN0IHQ9dGhpcy5kZXZpY2UuY3JlYXRlUGlwZWxpbmVMYXlvdXQoe2JpbmRHcm91cExheW91dHM6W2VdfSkscj10aGlzLmdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKCJiaXRtYXBTeW5jVmVydGV4IixmYS5nZXRCaXRtYXBTeW5jVmVydGV4U2hhZGVyKCkpLG49dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgiYml0bWFwU3luY0ZyYWdtZW50IixmYS5nZXRCaXRtYXBTeW5jRnJhZ21lbnRTaGFkZXIoKSksaT10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGF5b3V0OnQsdmVydGV4Onttb2R1bGU6cixlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOltdfSxmcmFnbWVudDp7bW9kdWxlOm4sZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDoicmdiYTh1bm9ybSIsYmxlbmQ6e2NvbG9yOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJ6ZXJvIixvcGVyYXRpb246ImFkZCJ9LGFscGhhOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJ6ZXJvIixvcGVyYXRpb246ImFkZCJ9fX1dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9LG11bHRpc2FtcGxlOntjb3VudDo0fX0pO3RoaXMucGlwZWxpbmVzLnNldCgiYml0bWFwX3N5bmMiLGkpfWNyZWF0ZUNvbG9yTWF0cml4RmlsdGVyUGlwZWxpbmUoKXtjb25zdCBlPXtjb2xvcjp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3RvcjoiemVybyIsb3BlcmF0aW9uOiJhZGQifSxhbHBoYTp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3RvcjoiemVybyIsb3BlcmF0aW9uOiJhZGQifX0sdD17Y29sb3I6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn0sYWxwaGE6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn19O3RoaXMuY3JlYXRlRmlsdGVyUGlwZWxpbmVXaXRoTGF5b3V0KCJjb2xvcl9tYXRyaXhfZmlsdGVyIixmYS5nZXRDb2xvck1hdHJpeEZpbHRlckZyYWdtZW50U2hhZGVyKCksMSxlKSx0aGlzLmNyZWF0ZUZpbHRlclBpcGVsaW5lV2l0aExheW91dCgiYmV2ZWxfYmFzZSIsZmEuZ2V0QmV2ZWxCYXNlRnJhZ21lbnRTaGFkZXIoKSwxLGUpLHRoaXMuY3JlYXRlRmlsdGVyUGlwZWxpbmVXaXRoTGF5b3V0KCJnbG93X2ZpbHRlciIsZmEuZ2V0R2xvd0ZpbHRlckZyYWdtZW50U2hhZGVyKCksMix0KSx0aGlzLmNyZWF0ZUZpbHRlclBpcGVsaW5lV2l0aExheW91dCgiZHJvcF9zaGFkb3dfZmlsdGVyIixmYS5nZXREcm9wU2hhZG93RmlsdGVyRnJhZ21lbnRTaGFkZXIoKSwyLHQpLHRoaXMuY3JlYXRlRmlsdGVyUGlwZWxpbmVXaXRoTGF5b3V0KCJiZXZlbF9maWx0ZXIiLGZhLmdldEJldmVsRmlsdGVyRnJhZ21lbnRTaGFkZXIoKSwyLHQpLHRoaXMuY3JlYXRlRmlsdGVyUGlwZWxpbmVXaXRoTGF5b3V0KCJncmFkaWVudF9nbG93X2ZpbHRlciIsZmEuZ2V0R3JhZGllbnRHbG93RmlsdGVyRnJhZ21lbnRTaGFkZXIoKSwzLHQpLHRoaXMuY3JlYXRlRmlsdGVyUGlwZWxpbmVXaXRoTGF5b3V0KCJncmFkaWVudF9iZXZlbF9maWx0ZXIiLGZhLmdldEdyYWRpZW50QmV2ZWxGaWx0ZXJGcmFnbWVudFNoYWRlcigpLDMsdCl9Y3JlYXRlQ29tcGxleEJsZW5kUGlwZWxpbmVzKCl7Y29uc3QgZT10aGlzLmRldmljZS5jcmVhdGVCaW5kR3JvdXBMYXlvdXQoe2VudHJpZXM6W3tiaW5kaW5nOjAsdmlzaWJpbGl0eTpHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCxidWZmZXI6e3R5cGU6InVuaWZvcm0ifX0se2JpbmRpbmc6MSx2aXNpYmlsaXR5OkdQVVNoYWRlclN0YWdlLkZSQUdNRU5ULHNhbXBsZXI6e319LHtiaW5kaW5nOjIsdmlzaWJpbGl0eTpHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCx0ZXh0dXJlOnt9fSx7YmluZGluZzozLHZpc2liaWxpdHk6R1BVU2hhZGVyU3RhZ2UuRlJBR01FTlQsdGV4dHVyZTp7fX1dfSk7dGhpcy5iaW5kR3JvdXBMYXlvdXRzLnNldCgiY29tcGxleF9ibGVuZCIsZSk7Y29uc3QgdD10aGlzLmRldmljZS5jcmVhdGVQaXBlbGluZUxheW91dCh7YmluZEdyb3VwTGF5b3V0czpbZV19KSxyPXRoaXMuZ2V0T3JDcmVhdGVTaGFkZXJNb2R1bGUoImNvbXBsZXhCbGVuZFZlcnRleCIsZmEuZ2V0Q29tcGxleEJsZW5kVmVydGV4U2hhZGVyKCkpLG49dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgidW5pZmllZENvbXBsZXhCbGVuZEZyYWdtZW50IixmYS5nZXRVbmlmaWVkQ29tcGxleEJsZW5kRnJhZ21lbnRTaGFkZXIoKSksaT10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGF5b3V0OnQsdmVydGV4Onttb2R1bGU6cixlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOltdfSxmcmFnbWVudDp7bW9kdWxlOm4sZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDoicmdiYTh1bm9ybSIsYmxlbmQ6e2NvbG9yOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJ6ZXJvIixvcGVyYXRpb246ImFkZCJ9LGFscGhhOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJ6ZXJvIixvcGVyYXRpb246ImFkZCJ9fX1dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9fSk7dGhpcy5waXBlbGluZXMuc2V0KCJjb21wbGV4X2JsZW5kIixpKSx0aGlzLmNyZWF0ZUNvbXBsZXhCbGVuZENvcHlQaXBlbGluZSgpLHRoaXMuY3JlYXRlQ29tcGxleEJsZW5kT3V0cHV0UGlwZWxpbmUoKX1jcmVhdGVDb21wbGV4QmxlbmRDb3B5UGlwZWxpbmUoKXtjb25zdCBlPXtjb2xvcjp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3RvcjoiemVybyIsb3BlcmF0aW9uOiJhZGQifSxhbHBoYTp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3RvcjoiemVybyIsb3BlcmF0aW9uOiJhZGQifX0sdD10aGlzLmJpbmRHcm91cExheW91dHMuZ2V0KCJ0ZXh0dXJlX2NvcHkiKTtpZih0KXtjb25zdCByPXRoaXMuZGV2aWNlLmNyZWF0ZVBpcGVsaW5lTGF5b3V0KHtiaW5kR3JvdXBMYXlvdXRzOlt0XX0pLG49dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgiY29tcGxleEJsZW5kQ29weVZlcnRleCIsZmEuZ2V0Q29tcGxleEJsZW5kQ29weVZlcnRleFNoYWRlcigpKSxpPXRoaXMuZ2V0T3JDcmVhdGVTaGFkZXJNb2R1bGUoInRleHR1cmVDb3B5RnJhZ21lbnQiLGZhLmdldFRleHR1cmVDb3B5RnJhZ21lbnRTaGFkZXIoKSk7dGhpcy5waXBlbGluZXMuc2V0KCJjb21wbGV4X2JsZW5kX2NvcHkiLHRoaXMuY3JlYXRlRnVsbHNjcmVlblF1YWRQaXBlbGluZShyLG4saSwicmdiYTh1bm9ybSIsZSkpfWNvbnN0IHI9dGhpcy5iaW5kR3JvdXBMYXlvdXRzLmdldCgidGV4dHVyZV9zY2FsZSIpO2lmKHIpe2NvbnN0IHQ9dGhpcy5kZXZpY2UuY3JlYXRlUGlwZWxpbmVMYXlvdXQoe2JpbmRHcm91cExheW91dHM6W3JdfSksbj10aGlzLmdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKCJjb21wbGV4QmxlbmRTY2FsZVZlcnRleCIsZmEuZ2V0Q29tcGxleEJsZW5kU2NhbGVWZXJ0ZXhTaGFkZXIoKSksaT10aGlzLmdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKCJwb3NpdGlvbmVkVGV4dHVyZUZyYWdtZW50IixmYS5nZXRQb3NpdGlvbmVkVGV4dHVyZUZyYWdtZW50U2hhZGVyKCkpO3RoaXMucGlwZWxpbmVzLnNldCgiY29tcGxleF9ibGVuZF9zY2FsZSIsdGhpcy5jcmVhdGVGdWxsc2NyZWVuUXVhZFBpcGVsaW5lKHQsbixpLCJyZ2JhOHVub3JtIixlKSl9fWNyZWF0ZUNvbXBsZXhCbGVuZE91dHB1dFBpcGVsaW5lKCl7Y29uc3QgZT10aGlzLmJpbmRHcm91cExheW91dHMuZ2V0KCJwb3NpdGlvbmVkX3RleHR1cmUiKTtpZighZSlyZXR1cm47Y29uc3QgdD10aGlzLmRldmljZS5jcmVhdGVQaXBlbGluZUxheW91dCh7YmluZEdyb3VwTGF5b3V0czpbZV19KSxyPXRoaXMuZ2V0T3JDcmVhdGVTaGFkZXJNb2R1bGUoInBvc2l0aW9uZWRUZXh0dXJlRnJhZ21lbnQiLGZhLmdldFBvc2l0aW9uZWRUZXh0dXJlRnJhZ21lbnRTaGFkZXIoKSksbj17Y29sb3I6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn0sYWxwaGE6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn19LGk9dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgiY29tcGxleEJsZW5kT3V0cHV0VmVydGV4IixmYS5nZXRDb21wbGV4QmxlbmRPdXRwdXRWZXJ0ZXhTaGFkZXIoKSk7dGhpcy5waXBlbGluZXMuc2V0KCJjb21wbGV4X2JsZW5kX291dHB1dCIsdGhpcy5jcmVhdGVGdWxsc2NyZWVuUXVhZFBpcGVsaW5lKHQsaSxyLHRoaXMuZm9ybWF0LG4pKSx0aGlzLnNhbXBsZUNvdW50PjEmJnRoaXMucGlwZWxpbmVzLnNldCgiY29tcGxleF9ibGVuZF9vdXRwdXRfbXNhYSIsdGhpcy5jcmVhdGVGdWxsc2NyZWVuUXVhZFBpcGVsaW5lKHQsaSxyLHRoaXMuZm9ybWF0LG4sdGhpcy5zYW1wbGVDb3VudCkpO2NvbnN0IGE9dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgiZmlsdGVyQ29tcGxleEJsZW5kT3V0cHV0VmVydGV4IixmYS5nZXRGaWx0ZXJDb21wbGV4QmxlbmRPdXRwdXRWZXJ0ZXhTaGFkZXIoKSk7dGhpcy5waXBlbGluZXMuc2V0KCJmaWx0ZXJfY29tcGxleF9ibGVuZF9vdXRwdXQiLHRoaXMuY3JlYXRlRnVsbHNjcmVlblF1YWRQaXBlbGluZSh0LGEscix0aGlzLmZvcm1hdCxuKSksdGhpcy5zYW1wbGVDb3VudD4xJiZ0aGlzLnBpcGVsaW5lcy5zZXQoImZpbHRlcl9jb21wbGV4X2JsZW5kX291dHB1dF9tc2FhIix0aGlzLmNyZWF0ZUZ1bGxzY3JlZW5RdWFkUGlwZWxpbmUodCxhLHIsdGhpcy5mb3JtYXQsbix0aGlzLnNhbXBsZUNvdW50KSl9Y3JlYXRlRmlsdGVyUGlwZWxpbmVXaXRoTGF5b3V0KGUsdCxyLG4pe2xldCBpPXRoaXMuZmlsdGVyQmluZEdyb3VwTGF5b3V0cy5nZXQocik7aWYoIWkpe2NvbnN0IGU9W3tiaW5kaW5nOjAsdmlzaWJpbGl0eTpHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCxidWZmZXI6e3R5cGU6InVuaWZvcm0ifX0se2JpbmRpbmc6MSx2aXNpYmlsaXR5OkdQVVNoYWRlclN0YWdlLkZSQUdNRU5ULHNhbXBsZXI6e319XTtmb3IobGV0IHQ9MDt0PHI7dCsrKWUucHVzaCh7YmluZGluZzoyK3QsdmlzaWJpbGl0eTpHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCx0ZXh0dXJlOnt9fSk7aT10aGlzLmRldmljZS5jcmVhdGVCaW5kR3JvdXBMYXlvdXQoe2VudHJpZXM6ZX0pLHRoaXMuZmlsdGVyQmluZEdyb3VwTGF5b3V0cy5zZXQocixpKX10aGlzLmJpbmRHcm91cExheW91dHMuc2V0KGUsaSk7Y29uc3QgYT10aGlzLmRldmljZS5jcmVhdGVQaXBlbGluZUxheW91dCh7YmluZEdyb3VwTGF5b3V0czpbaV19KSxzPXRoaXMuZ2V0T3JDcmVhdGVTaGFkZXJNb2R1bGUoImJsdXJGaWx0ZXJWZXJ0ZXgiLGZhLmdldEJsdXJGaWx0ZXJWZXJ0ZXhTaGFkZXIoKSksbz10aGlzLmdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKGBmaWx0ZXJfJHtlfWAsdCk7dGhpcy5waXBlbGluZXMuc2V0KGUsdGhpcy5jcmVhdGVGdWxsc2NyZWVuUXVhZFBpcGVsaW5lKGEscyxvLCJyZ2JhOHVub3JtIixuKSl9Y3JlYXRlRnVsbHNjcmVlblF1YWRQaXBlbGluZShlLHQscixuLGksYSxzKXtjb25zdCBvPXtsYXlvdXQ6ZSx2ZXJ0ZXg6e21vZHVsZTp0LGVudHJ5UG9pbnQ6Im1haW4iLGJ1ZmZlcnM6W119LGZyYWdtZW50Onttb2R1bGU6cixlbnRyeVBvaW50OiJtYWluIix0YXJnZXRzOlt7Zm9ybWF0Om4sYmxlbmQ6aX1dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9fTtyZXR1cm4gYSYmYT4xJiYoby5tdWx0aXNhbXBsZT17Y291bnQ6YX0pLHMmJihvLmRlcHRoU3RlbmNpbD1zKSx0aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZShvKX1nZXRQaXBlbGluZShlKXtsZXQgdD10aGlzLnBpcGVsaW5lcy5nZXQoZSk7cmV0dXJuIHR8fCh0aGlzLmVuc3VyZUxhenlHcm91cChlKSx0PXRoaXMucGlwZWxpbmVzLmdldChlKSksdH1nZXRGaWx0ZXJQaXBlbGluZShlLHQpe2NvbnN0IHI9YCR7ZX1fJHtPYmplY3Qua2V5cyh0KS5zb3J0KCkubWFwKGU9PmAke2V9JHt0W2VdfWApLmpvaW4oIl8iKX1gO2xldCBuPXRoaXMucGlwZWxpbmVzLmdldChyKTtpZihuKXJldHVybiBuO3RoaXMuZW5zdXJlTGF6eUdyb3VwKGUpO2NvbnN0IGk9dGhpcy5zaGFkZXJNb2R1bGVDYWNoZS5nZXQoYGZpbHRlcl8ke2V9YCksYT10aGlzLnNoYWRlck1vZHVsZUNhY2hlLmdldCgiYmx1ckZpbHRlclZlcnRleCIpLHM9dGhpcy5iaW5kR3JvdXBMYXlvdXRzLmdldChlKTtpZighaXx8IWF8fCFzKXJldHVybiB0aGlzLnBpcGVsaW5lcy5nZXQoZSk7Y29uc3Qgbz10aGlzLmRldmljZS5jcmVhdGVQaXBlbGluZUxheW91dCh7YmluZEdyb3VwTGF5b3V0czpbc119KTtyZXR1cm4gbj10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGF5b3V0Om8sdmVydGV4Onttb2R1bGU6YSxlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOltdfSxmcmFnbWVudDp7bW9kdWxlOmksZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDoicmdiYTh1bm9ybSIsYmxlbmQ6e2NvbG9yOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJvbmUtbWludXMtc3JjLWFscGhhIixvcGVyYXRpb246ImFkZCJ9LGFscGhhOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJvbmUtbWludXMtc3JjLWFscGhhIixvcGVyYXRpb246ImFkZCJ9fX1dLGNvbnN0YW50czp0fSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9fSksdGhpcy5waXBlbGluZXMuc2V0KHIsbiksbn1nZXRHcmFkaWVudFBpcGVsaW5lKGUsdCxyKXtjb25zdCBuPWAke2V9X3Qke3R9cyR7cn1gO2xldCBpPXRoaXMucGlwZWxpbmVzLmdldChuKTtyZXR1cm4gaXx8KHRoaXMuZ3JhZGllbnRQaXBlbGluZUxheW91dD8oaT10aGlzLmNyZWF0ZUdyYWRpZW50VmFyaWFudChlLHQsciksaT8odGhpcy5waXBlbGluZXMuc2V0KG4saSksaSk6dGhpcy5nZXRQaXBlbGluZShlKSk6dGhpcy5nZXRQaXBlbGluZShlKSl9Y3JlYXRlR3JhZGllbnRWYXJpYW50KGUsdCxyKXtpZighdGhpcy5ncmFkaWVudFBpcGVsaW5lTGF5b3V0KXJldHVybjtjb25zdCBuPXtHUkFESUVOVF9UWVBFOnQsU1BSRUFEX01PREU6cn0saT1kYSxhPWhhLHM9ZS5pbmNsdWRlcygic3RlbmNpbF9hdGxhcyIpfHwiZ3JhZGllbnRfZmlsbF9zdGVuY2lsX21haW4iPT09ZT90aGlzLmdyYWRpZW50U3RlbmNpbEZyYWdtZW50U2hhZGVyTW9kdWxlOnRoaXMuZ3JhZGllbnRGcmFnbWVudFNoYWRlck1vZHVsZSxvPWUuaW5jbHVkZXMoImJncmEiKXx8ImdyYWRpZW50X2ZpbGxfc3RlbmNpbF9tYWluIj09PWU/dGhpcy5mb3JtYXQ6InJnYmE4dW5vcm0iLGw9e307bGV0IGM7KGUuaW5jbHVkZXMoImJncmEiKXx8ImdyYWRpZW50X2ZpbGxfc3RlbmNpbF9tYWluIj09PWUpJiYobC55RmxpcFNpZ249LTEpO2xldCB1PXRoaXMuc2FtcGxlQ291bnQ7ZS5pbmNsdWRlcygic3Ryb2tlIik/Yz17Zm9ybWF0OiJzdGVuY2lsOCIsc3RlbmNpbEZyb250Ontjb21wYXJlOiJhbHdheXMiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6ImtlZXAiLHBhc3NPcDoia2VlcCJ9LHN0ZW5jaWxCYWNrOntjb21wYXJlOiJhbHdheXMiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6ImtlZXAiLHBhc3NPcDoia2VlcCJ9LHN0ZW5jaWxSZWFkTWFzazowLHN0ZW5jaWxXcml0ZU1hc2s6MH06ImdyYWRpZW50X2ZpbGxfc3RlbmNpbCI9PT1lfHwiZ3JhZGllbnRfZmlsbF9zdGVuY2lsX2F0bGFzIj09PWU/Yz17Zm9ybWF0OiJzdGVuY2lsOCIsc3RlbmNpbEZyb250Ontjb21wYXJlOiJub3QtZXF1YWwiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6Inplcm8iLHBhc3NPcDoiemVybyJ9LHN0ZW5jaWxCYWNrOntjb21wYXJlOiJub3QtZXF1YWwiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6Inplcm8iLHBhc3NPcDoiemVybyJ9LHN0ZW5jaWxSZWFkTWFzazoyNTUsc3RlbmNpbFdyaXRlTWFzazoyNTV9OiJncmFkaWVudF9maWxsX3N0ZW5jaWxfbWFpbiI9PT1lPyhjPXtmb3JtYXQ6InN0ZW5jaWw4IixzdGVuY2lsRnJvbnQ6e2NvbXBhcmU6Im5vdC1lcXVhbCIsZmFpbE9wOiJrZWVwIixkZXB0aEZhaWxPcDoiemVybyIscGFzc09wOiJ6ZXJvIn0sc3RlbmNpbEJhY2s6e2NvbXBhcmU6Im5vdC1lcXVhbCIsZmFpbE9wOiJrZWVwIixkZXB0aEZhaWxPcDoiemVybyIscGFzc09wOiJ6ZXJvIn0sc3RlbmNpbFJlYWRNYXNrOjI1NSxzdGVuY2lsV3JpdGVNYXNrOjI1NX0sdT0xKToiZ3JhZGllbnRfZmlsbF9iZ3JhX3N0ZW5jaWwiPT09ZT9jPXtmb3JtYXQ6InN0ZW5jaWw4IixzdGVuY2lsRnJvbnQ6e2NvbXBhcmU6ImVxdWFsIixmYWlsT3A6ImtlZXAiLGRlcHRoRmFpbE9wOiJrZWVwIixwYXNzT3A6ImtlZXAifSxzdGVuY2lsQmFjazp7Y29tcGFyZToiZXF1YWwiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6ImtlZXAiLHBhc3NPcDoia2VlcCJ9LHN0ZW5jaWxSZWFkTWFzazoyNTUsc3RlbmNpbFdyaXRlTWFzazowfToiZ3JhZGllbnRfZmlsbF9iZ3JhX25vX21zYWEiPT09ZSYmKHU9MSk7Y29uc3QgZj17bGF5b3V0OnRoaXMuZ3JhZGllbnRQaXBlbGluZUxheW91dCx2ZXJ0ZXg6e21vZHVsZTp0aGlzLmdyYWRpZW50VmVydGV4U2hhZGVyTW9kdWxlLGVudHJ5UG9pbnQ6Im1haW4iLGJ1ZmZlcnM6W2ldLGNvbnN0YW50czpPYmplY3Qua2V5cyhsKS5sZW5ndGg+MD9sOnZvaWQgMH0sZnJhZ21lbnQ6e21vZHVsZTpzLGVudHJ5UG9pbnQ6Im1haW4iLHRhcmdldHM6W3tmb3JtYXQ6byxibGVuZDphfV0sY29uc3RhbnRzOm59LHByaW1pdGl2ZTp7dG9wb2xvZ3k6InRyaWFuZ2xlLWxpc3QiLGN1bGxNb2RlOiJub25lIn0sbXVsdGlzYW1wbGU6e2NvdW50OnV9fTtyZXR1cm4gYyYmKGYuZGVwdGhTdGVuY2lsPWMpLHRoaXMuZGV2aWNlLmNyZWF0ZVJlbmRlclBpcGVsaW5lKGYpfWdldEJpbmRHcm91cExheW91dChlKXtsZXQgdD10aGlzLmJpbmRHcm91cExheW91dHMuZ2V0KGUpO3JldHVybiB0fHwodGhpcy5lbnN1cmVMYXp5R3JvdXAoZSksdD10aGlzLmJpbmRHcm91cExheW91dHMuZ2V0KGUpKSx0fWNyZWF0ZU5vZGVDbGVhclBpcGVsaW5lKCl7Y29uc3QgZT10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGF5b3V0OiJhdXRvIix2ZXJ0ZXg6e21vZHVsZTp0aGlzLmdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKCJub2RlQ2xlYXJWZXJ0ZXgiLGZhLmdldE5vZGVDbGVhclZlcnRleFNoYWRlcigpKSxlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOlt7YXJyYXlTdHJpZGU6OCxhdHRyaWJ1dGVzOlt7c2hhZGVyTG9jYXRpb246MCxvZmZzZXQ6MCxmb3JtYXQ6ImZsb2F0MzJ4MiJ9XX1dfSxmcmFnbWVudDp7bW9kdWxlOnRoaXMuZ2V0T3JDcmVhdGVTaGFkZXJNb2R1bGUoIm5vZGVDbGVhckZyYWdtZW50IixmYS5nZXROb2RlQ2xlYXJGcmFnbWVudFNoYWRlcigpKSxlbnRyeVBvaW50OiJtYWluIix0YXJnZXRzOlt7Zm9ybWF0OiJyZ2JhOHVub3JtIixibGVuZDp7Y29sb3I6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Inplcm8iLG9wZXJhdGlvbjoiYWRkIn0sYWxwaGE6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Inplcm8iLG9wZXJhdGlvbjoiYWRkIn19LHdyaXRlTWFzazpHUFVDb2xvcldyaXRlLkFMTH1dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9LGRlcHRoU3RlbmNpbDp7Zm9ybWF0OiJzdGVuY2lsOCIsc3RlbmNpbEZyb250Ontjb21wYXJlOiJhbHdheXMiLGZhaWxPcDoiemVybyIsZGVwdGhGYWlsT3A6Inplcm8iLHBhc3NPcDoiemVybyJ9LHN0ZW5jaWxCYWNrOntjb21wYXJlOiJhbHdheXMiLGZhaWxPcDoiemVybyIsZGVwdGhGYWlsT3A6Inplcm8iLHBhc3NPcDoiemVybyJ9LHN0ZW5jaWxSZWFkTWFzazoyNTUsc3RlbmNpbFdyaXRlTWFzazoyNTV9LG11bHRpc2FtcGxlOntjb3VudDp0aGlzLnNhbXBsZUNvdW50fX0pO3RoaXMucGlwZWxpbmVzLnNldCgibm9kZV9jbGVhcl9hdGxhcyIsZSl9ZGlzcG9zZSgpe3RoaXMucGlwZWxpbmVzLmNsZWFyKCksdGhpcy5iaW5kR3JvdXBMYXlvdXRzLmNsZWFyKCksdGhpcy5zaGFkZXJNb2R1bGVDYWNoZS5jbGVhcigpLHRoaXMuZmlsdGVyQmluZEdyb3VwTGF5b3V0cy5jbGVhcigpfX1jbGFzcyBtYXtjb25zdHJ1Y3RvcihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiZGV2aWNlIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInBpcGVsaW5lcyIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJiaW5kR3JvdXBMYXlvdXRzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksdGhpcy5kZXZpY2U9ZSx0aGlzLnBpcGVsaW5lcz1uZXcgTWFwLHRoaXMuYmluZEdyb3VwTGF5b3V0cz1uZXcgTWFwLHRoaXMuaW5pdGlhbGl6ZUJsdXJQaXBlbGluZXMoKX1pbml0aWFsaXplQmx1clBpcGVsaW5lcygpe2NvbnN0IGU9dGhpcy5kZXZpY2UuY3JlYXRlQmluZEdyb3VwTGF5b3V0KHtsYWJlbDoiYmx1cl9jb21wdXRlX2JpbmRfZ3JvdXBfbGF5b3V0IixlbnRyaWVzOlt7YmluZGluZzowLHZpc2liaWxpdHk6R1BVU2hhZGVyU3RhZ2UuQ09NUFVURSx0ZXh0dXJlOntzYW1wbGVUeXBlOiJmbG9hdCJ9fSx7YmluZGluZzoxLHZpc2liaWxpdHk6R1BVU2hhZGVyU3RhZ2UuQ09NUFVURSxzdG9yYWdlVGV4dHVyZTp7YWNjZXNzOiJ3cml0ZS1vbmx5Iixmb3JtYXQ6InJnYmE4dW5vcm0ifX0se2JpbmRpbmc6Mix2aXNpYmlsaXR5OkdQVVNoYWRlclN0YWdlLkNPTVBVVEUsYnVmZmVyOnt0eXBlOiJ1bmlmb3JtIn19XX0pO3RoaXMuYmluZEdyb3VwTGF5b3V0cy5zZXQoImJsdXJfY29tcHV0ZSIsZSksdGhpcy5jcmVhdGVCbHVyQ29tcHV0ZVBpcGVsaW5lKCJibHVyX2NvbXB1dGVfaG9yaXpvbnRhbCIpLHRoaXMuY3JlYXRlQmx1ckNvbXB1dGVQaXBlbGluZSgiYmx1cl9jb21wdXRlX3ZlcnRpY2FsIiksdGhpcy5jcmVhdGVCbHVyQ29tcHV0ZVBpcGVsaW5lKCJibHVyX2NvbXB1dGVfc2hhcmVkX2hvcml6b250YWwiLCEwKSx0aGlzLmNyZWF0ZUJsdXJDb21wdXRlUGlwZWxpbmUoImJsdXJfY29tcHV0ZV9zaGFyZWRfdmVydGljYWwiLCEwKX1jcmVhdGVCbHVyQ29tcHV0ZVBpcGVsaW5lKGUsdD0hMSl7Y29uc3Qgcj10aGlzLmRldmljZS5jcmVhdGVTaGFkZXJNb2R1bGUoe2xhYmVsOmAke2V9X3NoYWRlcmAsY29kZTp0P3RoaXMuZ2V0U2hhcmVkQmx1ckNvbXB1dGVTaGFkZXJDb2RlKCk6dGhpcy5nZXRCbHVyQ29tcHV0ZVNoYWRlckNvZGUoKX0pLG49dGhpcy5kZXZpY2UuY3JlYXRlUGlwZWxpbmVMYXlvdXQoe2xhYmVsOmAke2V9X2xheW91dGAsYmluZEdyb3VwTGF5b3V0czpbdGhpcy5iaW5kR3JvdXBMYXlvdXRzLmdldCgiYmx1cl9jb21wdXRlIildfSksaT10aGlzLmRldmljZS5jcmVhdGVDb21wdXRlUGlwZWxpbmUoe2xhYmVsOmUsbGF5b3V0Om4sY29tcHV0ZTp7bW9kdWxlOnIsZW50cnlQb2ludDoibWFpbiJ9fSk7dGhpcy5waXBlbGluZXMuc2V0KGUsaSl9Z2V0Qmx1ckNvbXB1dGVTaGFkZXJDb2RlKCl7cmV0dXJuIlxuc3RydWN0IEJsdXJQYXJhbXMge1xuICAgIGRpcmVjdGlvbjogdmVjMjxmMzI+LCAgLy8gKDEsMCkgb3IgKDAsMSlcbiAgICByYWRpdXM6IGYzMiwgICAgICAgICAgIC8vIOODluODqeODvOWNiuW+hFxuICAgIGZyYWN0aW9uOiBmMzIsICAgICAgICAgLy8g56uv44OU44Kv44K744Or44Gu44OW44Os44Oz44OJ5Ymy5ZCIXG4gICAgdGV4U2l6ZTogdmVjMjxmMzI+LCAgICAvLyDjg4bjgq/jgrnjg4Hjg6PjgrXjgqTjgrpcbiAgICBzYW1wbGVzOiBmMzIsICAgICAgICAgIC8vIOOCteODs+ODl+ODq+aVsFxuICAgIHBhZGRpbmc6IGYzMiwgICAgICAgICAgLy8g44OR44OH44Kj44Oz44Kw77yIMTbjg5DjgqTjg4jjgqLjg6njgqTjg6Hjg7Pjg4jvvIlcbn1cblxuQGdyb3VwKDApIEBiaW5kaW5nKDApIHZhciBpbnB1dFRleHR1cmU6IHRleHR1cmVfMmQ8ZjMyPjtcbkBncm91cCgwKSBAYmluZGluZygxKSB2YXIgb3V0cHV0VGV4dHVyZTogdGV4dHVyZV9zdG9yYWdlXzJkPHJnYmE4dW5vcm0sIHdyaXRlPjtcbkBncm91cCgwKSBAYmluZGluZygyKSB2YXI8dW5pZm9ybT4gcGFyYW1zOiBCbHVyUGFyYW1zO1xuXG5jb25zdCBXT1JLR1JPVVBfU0laRTogdTMyID0gMTZ1O1xuXG5AY29tcHV0ZSBAd29ya2dyb3VwX3NpemUoMTYsIDE2LCAxKVxuZm4gbWFpbihcbiAgICBAYnVpbHRpbihnbG9iYWxfaW52b2NhdGlvbl9pZCkgZ2xvYmFsSWQ6IHZlYzM8dTMyPlxuKSB7XG4gICAgbGV0IHRleFNpemUgPSB2ZWMyPHUzMj4odTMyKHBhcmFtcy50ZXhTaXplLngpLCB1MzIocGFyYW1zLnRleFNpemUueSkpO1xuICAgIGxldCByYWRpdXMgPSBpMzIocGFyYW1zLnJhZGl1cyk7XG5cbiAgICBsZXQgb3V0Q29vcmQgPSBnbG9iYWxJZC54eTtcblxuICAgIGlmIChvdXRDb29yZC54ID49IHRleFNpemUueCB8fCBvdXRDb29yZC55ID49IHRleFNpemUueSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGRpcmVjdGlvbiA9IHZlYzI8aTMyPihpMzIocGFyYW1zLmRpcmVjdGlvbi54KSwgaTMyKHBhcmFtcy5kaXJlY3Rpb24ueSkpO1xuICAgIGxldCBzYW1wbGVzID0gcGFyYW1zLnNhbXBsZXM7XG4gICAgbGV0IGZyYWN0aW9uID0gcGFyYW1zLmZyYWN0aW9uO1xuXG4gICAgdmFyIGNvbG9yID0gdmVjNDxmMzI+KDAuMCk7XG5cbiAgICBmb3IgKHZhciBpID0gLXJhZGl1czsgaSA8PSByYWRpdXM7IGkgPSBpICsgMSkge1xuICAgICAgICB2YXIgc2FtcGxlQ29vcmQgPSB2ZWMyPGkzMj4ob3V0Q29vcmQpICsgZGlyZWN0aW9uICogaTtcblxuICAgICAgICBzYW1wbGVDb29yZC54ID0gY2xhbXAoc2FtcGxlQ29vcmQueCwgMCwgaTMyKHRleFNpemUueCkgLSAxKTtcbiAgICAgICAgc2FtcGxlQ29vcmQueSA9IGNsYW1wKHNhbXBsZUNvb3JkLnksIDAsIGkzMih0ZXhTaXplLnkpIC0gMSk7XG5cbiAgICAgICAgbGV0IHNhbXBsZSA9IHRleHR1cmVMb2FkKGlucHV0VGV4dHVyZSwgdmVjMjx1MzI+KHNhbXBsZUNvb3JkKSwgMCk7XG5cbiAgICAgICAgLy8g56uv44OU44Kv44K744Or44GrZnJhY3Rpb27ph43jgb/jgpLpgannlKjvvIhGcmFnbWVudCBTaGFkZXLjgajlkIzjgZjjg63jgrjjg4Pjgq/vvIlcbiAgICAgICAgaWYgKGkgPT0gLXJhZGl1cyB8fCBpID09IHJhZGl1cykge1xuICAgICAgICAgICAgY29sb3IgPSBjb2xvciArIHNhbXBsZSAqIGZyYWN0aW9uO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29sb3IgPSBjb2xvciArIHNhbXBsZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbG9yID0gY29sb3IgLyBzYW1wbGVzO1xuXG4gICAgdGV4dHVyZVN0b3JlKG91dHB1dFRleHR1cmUsIG91dENvb3JkLCBjb2xvcik7XG59XG4ifWdldFNoYXJlZEJsdXJDb21wdXRlU2hhZGVyQ29kZSgpe3JldHVybiJcbnN0cnVjdCBCbHVyUGFyYW1zIHtcbiAgICBkaXJlY3Rpb246IHZlYzI8ZjMyPixcbiAgICByYWRpdXM6IGYzMixcbiAgICBmcmFjdGlvbjogZjMyLFxuICAgIHRleFNpemU6IHZlYzI8ZjMyPixcbiAgICBzYW1wbGVzOiBmMzIsXG4gICAgcGFkZGluZzogZjMyLFxufVxuXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyIGlucHV0VGV4dHVyZTogdGV4dHVyZV8yZDxmMzI+O1xuQGdyb3VwKDApIEBiaW5kaW5nKDEpIHZhciBvdXRwdXRUZXh0dXJlOiB0ZXh0dXJlX3N0b3JhZ2VfMmQ8cmdiYTh1bm9ybSwgd3JpdGU+O1xuQGdyb3VwKDApIEBiaW5kaW5nKDIpIHZhcjx1bmlmb3JtPiBwYXJhbXM6IEJsdXJQYXJhbXM7XG5cbmNvbnN0IFRJTEU6IHUzMiA9IDE2dTtcbmNvbnN0IE1BWF9BUFJPTjogdTMyID0gMjR1O1xuY29uc3QgU0hBUkVEX1c6IHUzMiA9IFRJTEUgKyAydSAqIE1BWF9BUFJPTjtcblxudmFyPHdvcmtncm91cD4gdGlsZTogYXJyYXk8dmVjNDxmMzI+LCAxMDI0PjtcblxuQGNvbXB1dGUgQHdvcmtncm91cF9zaXplKDE2LCAxNiwgMSlcbmZuIG1haW4oXG4gICAgQGJ1aWx0aW4oZ2xvYmFsX2ludm9jYXRpb25faWQpIGdsb2JhbElkOiB2ZWMzPHUzMj4sXG4gICAgQGJ1aWx0aW4obG9jYWxfaW52b2NhdGlvbl9pZCkgbG9jYWxJZDogdmVjMzx1MzI+LFxuICAgIEBidWlsdGluKHdvcmtncm91cF9pZCkgd29ya2dyb3VwSWQ6IHZlYzM8dTMyPlxuKSB7XG4gICAgbGV0IHRleFNpemUgPSB2ZWMyPHUzMj4odTMyKHBhcmFtcy50ZXhTaXplLngpLCB1MzIocGFyYW1zLnRleFNpemUueSkpO1xuICAgIGxldCByYWRpdXMgPSB1MzIocGFyYW1zLnJhZGl1cyk7XG4gICAgbGV0IGFwcm9uID0gbWluKHJhZGl1cywgTUFYX0FQUk9OKTtcbiAgICBsZXQgaXNIb3Jpem9udGFsID0gcGFyYW1zLmRpcmVjdGlvbi54ID4gMC41O1xuICAgIGxldCBmcmFjdGlvbiA9IHBhcmFtcy5mcmFjdGlvbjtcbiAgICBsZXQgc2FtcGxlcyA9IHBhcmFtcy5zYW1wbGVzO1xuXG4gICAgbGV0IHRocmVhZElkeCA9IGxvY2FsSWQueCArIGxvY2FsSWQueSAqIFRJTEU7XG4gICAgbGV0IHRvdGFsVGhyZWFkcyA9IFRJTEUgKiBUSUxFO1xuXG4gICAgaWYgKGlzSG9yaXpvbnRhbCkge1xuICAgICAgICBsZXQgc2hhcmVkV2lkdGggPSBUSUxFICsgMnUgKiBhcHJvbjtcbiAgICAgICAgbGV0IGJhc2VYID0gd29ya2dyb3VwSWQueCAqIFRJTEU7XG4gICAgICAgIGxldCB5ID0gZ2xvYmFsSWQueTtcbiAgICAgICAgbGV0IGNsYW1wZWRZID0gY2xhbXAoeSwgMHUsIG1heCh0ZXhTaXplLnksIDF1KSAtIDF1KTtcblxuICAgICAgICAvLyDlhajjgrnjg6zjg4Pjg4njgYzljZToqr/jg63jg7zjg4nvvIjnr4Tlm7LlpJbjgrnjg6zjg4Pjg4njgoJjbGFtcOOBleOCjOOBn+W6p+aomeOBp+ODreODvOODie+8iVxuICAgICAgICB2YXIgaWR4ID0gdGhyZWFkSWR4O1xuICAgICAgICBsb29wIHtcbiAgICAgICAgICAgIGlmIChpZHggPj0gc2hhcmVkV2lkdGgpIHsgYnJlYWs7IH1cbiAgICAgICAgICAgIGxldCBneCA9IGkzMihiYXNlWCkgKyBpMzIoaWR4KSAtIGkzMihhcHJvbik7XG4gICAgICAgICAgICBsZXQgY3ggPSB1MzIoY2xhbXAoZ3gsIDAsIGkzMihtYXgodGV4U2l6ZS54LCAxdSkpIC0gMSkpO1xuICAgICAgICAgICAgdGlsZVtsb2NhbElkLnkgKiBTSEFSRURfVyArIGlkeF0gPSB0ZXh0dXJlTG9hZChpbnB1dFRleHR1cmUsIHZlYzI8dTMyPihjeCwgY2xhbXBlZFkpLCAwKTtcbiAgICAgICAgICAgIGlkeCArPSB0b3RhbFRocmVhZHM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDlhajjgrnjg6zjg4Pjg4njgYzjg5Djg6rjgqLjgavliLDpgZTvvIjml6nmnJ9yZXR1cm7jgarjgZfvvIlcbiAgICAgICAgd29ya2dyb3VwQmFycmllcigpO1xuXG4gICAgICAgIC8vIOevhOWbsuWGheOBruOCueODrOODg+ODieOBruOBv+WHuuWKm1xuICAgICAgICBsZXQgb3V0WCA9IGdsb2JhbElkLng7XG4gICAgICAgIGlmIChvdXRYIDwgdGV4U2l6ZS54ICYmIHkgPCB0ZXhTaXplLnkpIHtcbiAgICAgICAgICAgIGxldCBpUmFkaXVzID0gaTMyKHJhZGl1cyk7XG4gICAgICAgICAgICB2YXIgY29sb3IgPSB2ZWM0PGYzMj4oMC4wKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAtaVJhZGl1czsgaSA8PSBpUmFkaXVzOyBpID0gaSArIDEpIHtcbiAgICAgICAgICAgICAgICBsZXQgdGlsZUlkeCA9IGkzMihsb2NhbElkLngpICsgaTMyKGFwcm9uKSArIGk7XG4gICAgICAgICAgICAgICAgbGV0IHMgPSB0aWxlW2xvY2FsSWQueSAqIFNIQVJFRF9XICsgdTMyKGNsYW1wKHRpbGVJZHgsIDAsIGkzMihzaGFyZWRXaWR0aCkgLSAxKSldO1xuICAgICAgICAgICAgICAgIGlmIChpID09IC1pUmFkaXVzIHx8IGkgPT0gaVJhZGl1cykge1xuICAgICAgICAgICAgICAgICAgICBjb2xvciArPSBzICogZnJhY3Rpb247XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29sb3IgKz0gcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0ZXh0dXJlU3RvcmUob3V0cHV0VGV4dHVyZSwgdmVjMjx1MzI+KG91dFgsIHkpLCBjb2xvciAvIHNhbXBsZXMpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IHNoYXJlZEhlaWdodCA9IFRJTEUgKyAydSAqIGFwcm9uO1xuICAgICAgICBsZXQgYmFzZVkgPSB3b3JrZ3JvdXBJZC55ICogVElMRTtcbiAgICAgICAgbGV0IHggPSBnbG9iYWxJZC54O1xuICAgICAgICBsZXQgY2xhbXBlZFggPSBjbGFtcCh4LCAwdSwgbWF4KHRleFNpemUueCwgMXUpIC0gMXUpO1xuXG4gICAgICAgIC8vIOWFqOOCueODrOODg+ODieOBjOWNlOiqv+ODreODvOODie+8iOevhOWbsuWkluOCueODrOODg+ODieOCgmNsYW1w44GV44KM44Gf5bqn5qiZ44Gn44Ot44O844OJ77yJXG4gICAgICAgIHZhciBpZHggPSB0aHJlYWRJZHg7XG4gICAgICAgIGxvb3Age1xuICAgICAgICAgICAgaWYgKGlkeCA+PSBzaGFyZWRIZWlnaHQpIHsgYnJlYWs7IH1cbiAgICAgICAgICAgIGxldCBneSA9IGkzMihiYXNlWSkgKyBpMzIoaWR4KSAtIGkzMihhcHJvbik7XG4gICAgICAgICAgICBsZXQgY3kgPSB1MzIoY2xhbXAoZ3ksIDAsIGkzMihtYXgodGV4U2l6ZS55LCAxdSkpIC0gMSkpO1xuICAgICAgICAgICAgdGlsZVtpZHggKiBUSUxFICsgbG9jYWxJZC54XSA9IHRleHR1cmVMb2FkKGlucHV0VGV4dHVyZSwgdmVjMjx1MzI+KGNsYW1wZWRYLCBjeSksIDApO1xuICAgICAgICAgICAgaWR4ICs9IHRvdGFsVGhyZWFkcztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOWFqOOCueODrOODg+ODieOBjOODkOODquOCouOBq+WIsOmBlO+8iOaXqeacn3JldHVybuOBquOBl++8iVxuICAgICAgICB3b3JrZ3JvdXBCYXJyaWVyKCk7XG5cbiAgICAgICAgLy8g56+E5Zuy5YaF44Gu44K544Os44OD44OJ44Gu44G/5Ye65YqbXG4gICAgICAgIGxldCBvdXRZID0gZ2xvYmFsSWQueTtcbiAgICAgICAgaWYgKHggPCB0ZXhTaXplLnggJiYgb3V0WSA8IHRleFNpemUueSkge1xuICAgICAgICAgICAgbGV0IGlSYWRpdXMgPSBpMzIocmFkaXVzKTtcbiAgICAgICAgICAgIHZhciBjb2xvciA9IHZlYzQ8ZjMyPigwLjApO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IC1pUmFkaXVzOyBpIDw9IGlSYWRpdXM7IGkgPSBpICsgMSkge1xuICAgICAgICAgICAgICAgIGxldCB0aWxlSWR4ID0gaTMyKGxvY2FsSWQueSkgKyBpMzIoYXByb24pICsgaTtcbiAgICAgICAgICAgICAgICBsZXQgcyA9IHRpbGVbdTMyKGNsYW1wKHRpbGVJZHgsIDAsIGkzMihzaGFyZWRIZWlnaHQpIC0gMSkpICogVElMRSArIGxvY2FsSWQueF07XG4gICAgICAgICAgICAgICAgaWYgKGkgPT0gLWlSYWRpdXMgfHwgaSA9PSBpUmFkaXVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbG9yICs9IHMgKiBmcmFjdGlvbjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb2xvciArPSBzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRleHR1cmVTdG9yZShvdXRwdXRUZXh0dXJlLCB2ZWMyPHUzMj4oeCwgb3V0WSksIGNvbG9yIC8gc2FtcGxlcyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4ifWdldFBpcGVsaW5lKGUpe3JldHVybiB0aGlzLnBpcGVsaW5lcy5nZXQoZSl9Z2V0QmluZEdyb3VwTGF5b3V0KGUpe3JldHVybiB0aGlzLmJpbmRHcm91cExheW91dHMuZ2V0KGUpfWRlc3Ryb3koKXt0aGlzLnBpcGVsaW5lcy5jbGVhcigpLHRoaXMuYmluZEdyb3VwTGF5b3V0cy5jbGVhcigpfX1jb25zdCBnYT1OdW1iZXIuTUFYX1ZBTFVFLGJhPS1OdW1iZXIuTUFYX1ZBTFVFO2xldCB4YT0wO2NvbnN0IHZhPWU9Pnt4YT1lfSx5YT1bXTtsZXQgX2E9bnVsbDtjb25zdCB3YT0oKT0+e2lmKCEoeGEgaW4geWEpKXtpZighX2EpcmV0dXJuIG51bGw7e2NvbnN0IHQ9X2EoeGEpO2U9dCx5YVt4YV09ZX19dmFyIGU7cmV0dXJuIHlhW3hhXX0sTWE9ZT0+ZSBpbiB5YT95YVtlXTpudWxsLFBhPVtdLFNhPVtdLEZhPVtdO2xldCBUYT0wO2NvbnN0IEJhPWU9PntUYT1lfSxPYT0oKT0+VGEsQWE9KCk9PntQYS5sZW5ndGg9MCx2YSgwKTtmb3IobGV0IGU9MDtlPHlhLmxlbmd0aDtlKyspe2NvbnN0IHQ9eWFbZV07dCYmKHQudGV4dHVyZSYmdC50ZXh0dXJlLnJlc291cmNlLmRlc3Ryb3koKSx0LnN0ZW5jaWwmJnQuc3RlbmNpbC5yZXNvdXJjZS5kZXN0cm95KCksdC5tc2FhVGV4dHVyZSYmdC5tc2FhVGV4dHVyZS5yZXNvdXJjZS5kZXN0cm95KCksdC5tc2FhU3RlbmNpbCYmdC5tc2FhU3RlbmNpbC5yZXNvdXJjZS5kZXN0cm95KCkpfXlhLmxlbmd0aD0wLCgoKT0+e2ZvcihsZXQgZT0wO2U8U2EubGVuZ3RoOysrZSl7Y29uc3QgdD1TYVtlXTt0JiYodFswXT10WzFdPWdhLHRbMl09dFszXT1iYSl9Zm9yKGxldCBlPTA7ZTxGYS5sZW5ndGg7KytlKXtjb25zdCB0PUZhW2VdO3QmJih0WzBdPXRbMV09Z2EsdFsyXT10WzNdPWJhKX19KSgpLEJhKDApfTtjbGFzcyBSYXtjb25zdHJ1Y3Rvcigpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJjb3VudCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLHRoaXMuY291bnQ9MH1jbGVhcigpe3RoaXMuY291bnQ9bnIub2Zmc2V0PTB9fWxldCBDYT0ibm9ybWFsIjtjb25zdCBFYT1lPT57Q2E9ZX0sVWE9bmV3IFNldChbIm5vcm1hbCIsImxheWVyIiwiYWRkIiwic2NyZWVuIiwiYWxwaGEiLCJlcmFzZSIsImNvcHkiXSksJGE9W10sR2E9W10sa2E9W10sTGE9KCk9Pntmb3IobGV0IGU9MDtlPCRhLmxlbmd0aDtlKyspe2NvbnN0IHQ9JGFbZV07R2EucHVzaCh0LmNvbG9yX3RyYW5zZm9ybSksa2EucHVzaCh0Lm1hdHJpeCl9JGEubGVuZ3RoPTB9LElhPW5ldyBNYXAsVmE9KCk9Pntjb25zdCBlPSJibGVuZF9pbnN0YW5jZWQiO3JldHVybiBJYS5oYXMoZSl8fElhLnNldChlLG5ldyBSYSksSWEuZ2V0KGUpfTtsZXQgemE9ITE7Y29uc3QgamE9ZT0+e3phPWV9LERhPSgpPT56YTtsZXQgTmE9ITEsV2E9MDtjb25zdCBxYT1lPT57TmE9ZX0sWGE9KCk9Pk5hLFlhPWU9PntXYT1lfSxLYT0oKT0+V2EsSGE9bmV3IE1hcCxRYT1uZXcgTWFwLFphPShlLHQscixuKT0+e2NvbnN0IGk9UW4uY3VycmVudEF0dGFjaG1lbnRPYmplY3Q7aWYoIWkpcmV0dXJuO2NvbnN0IGE9aS5jbGlwTGV2ZWw7bGV0IHM9SGEuZ2V0KGEpO3M/KHNbMF09TWF0aC5taW4oc1swXSxlKSxzWzFdPU1hdGgubWluKHNbMV0sdCksc1syXT1NYXRoLm1heChzWzJdLHIpLHNbM109TWF0aC5tYXgoc1szXSxuKSk6KHM9SG4uZ2V0RmxvYXQzMkFycmF5NCgpLHNbMF09ZSxzWzFdPXQsc1syXT1yLHNbM109bixIYS5zZXQoYSxzKSl9LEphPSgpPT57Y29uc3QgZT1Rbi5jdXJyZW50QXR0YWNobWVudE9iamVjdDtpZighZSlyZXR1cm47Y29uc3QgdD0oMTw8ZS5jbGlwTGV2ZWwpLTE7cWEoITApLFlhKDI1NSZ0KSxqYSghMSl9LGVzPSgpPT57Y29uc3QgZT1Rbi5jdXJyZW50QXR0YWNobWVudE9iamVjdDtpZighZSlyZXR1cm47Y29uc3QgdD1lLmNsaXBMZXZlbCxyPUhhLmdldCh0KTt2YXIgbjtpZihyJiYoSGEuZGVsZXRlKHQpLG49cixIbi5wb29sRmxvYXQzMkFycmF5NChuKSksUWEuZGVsZXRlKHQpLC0tZS5jbGlwTGV2ZWwsIWUuY2xpcExldmVsKXJldHVybiBlLm1hc2s9ITEsamEoITEpLHFhKCExKSxZYSgwKSxlLm5lZWRzU3RlbmNpbENsZWFyPSEwLFFhLmNsZWFyKCksdm9pZCBIYS5jbGVhcigpO2UucGVuZGluZ1N0ZW5jaWxDbGVhckxldmVsPWUuY2xpcExldmVsLEphKCl9LHRzPShlLHQscik9Pntjb25zdCBuPWUubGVuZ3RoLTU7Zm9yKGxldCBpPTM7aTxuO2krPTMpe2xldCBuPTQqcjtlW2krMl0/KHRbbisrXT1lW2ktM10sdFtuKytdPWVbaS0yXSx0W24rK109MCx0W24rK109MCx0W24rK109ZVtpXSx0W24rK109ZVtpKzFdLHRbbisrXT0uNSx0W24rK109MCx0W24rK109ZVtpKzNdLHRbbisrXT1lW2krNF0sdFtuKytdPTEsdFtuKytdPTEpOmVbaSs1XT8odFtuKytdPWVbMF0sdFtuKytdPWVbMV0sdFtuKytdPS41LHRbbisrXT0uNSx0W24rK109ZVtpXSx0W24rK109ZVtpKzFdLHRbbisrXT0uNSx0W24rK109LjUsdFtuKytdPWVbaSs2XSx0W24rK109ZVtpKzddLHRbbisrXT0uNSx0W24rK109LjUpOih0W24rK109ZVswXSx0W24rK109ZVsxXSx0W24rK109LjUsdFtuKytdPS41LHRbbisrXT1lW2ldLHRbbisrXT1lW2krMV0sdFtuKytdPS41LHRbbisrXT0uNSx0W24rK109ZVtpKzNdLHRbbisrXT1lW2krNF0sdFtuKytdPS41LHRbbisrXT0uNSkscis9M31yZXR1cm4gcn07bGV0IHJzPW5ldyBGbG9hdDMyQXJyYXkoMzIpO2NvbnN0IG5zPWU9PntsZXQgdD0wO2Zvcihjb25zdCByIG9mIGUpe2NvbnN0IGU9ci5sZW5ndGgtNTtmb3IobGV0IHI9MztyPGU7cis9Myl0Kz0zfWNvbnN0IHI9NCp0O3ZhciBuO3JzLmxlbmd0aDxyJiYocnM9bmV3IEZsb2F0MzJBcnJheSgobj1yLG4tLSxufD1uPj4xLG58PW4+PjIsbnw9bj4+NCxufD1uPj44LG58PW4+PjE2LCsrbikpKTtjb25zdCBpPXJzO2xldCBhPTA7Zm9yKGNvbnN0IHQgb2YgZSlhPXRzKHQsaSxhKTtyZXR1cm57YnVmZmVyOmkuc3ViYXJyYXkoMCw0KmEpLGluZGV4Q291bnQ6YX19LGlzPW5ldyBPZmZzY3JlZW5DYW52YXMoMSwxKS5nZXRDb250ZXh0KCIyZCIpLGFzPXt4OjAseTowfSxzcz17eDowLHk6MH0sb3M9e3g6MCx5OjB9LGxzPXt4OjAseTowfSxjcz0oZSx0LHIpPT4oe3g6ZS54Kyh0LngtZS54KSpyLHk6ZS55Kyh0LnktZS55KSpyfSksdXM9ZT0+e2NvbnN0IHQ9TWF0aC5zcXJ0KGUueCplLngrZS55KmUueSk7cmV0dXJuIDA9PT10P3t4OjAseTowfTp7eDplLngvdCx5OmUueS90fX0sZnM9KGUsdCxyLG4pPT4oe3g6KDEtZSkqKjIqdC54KzIqKDEtZSkqZSpyLngrZSoqMipuLngseTooMS1lKSoqMip0LnkrMiooMS1lKSplKnIueStlKioyKm4ueX0pLGRzPShlLHQscixuKT0+KHt4OjIqKDEtZSkqKHIueC10LngpKzIqZSoobi54LXIueCkseToyKigxLWUpKihyLnktdC55KSsyKmUqKG4ueS1yLnkpfSksaHM9KGUsdCxyLG49LjUpPT57Y29uc3QgaT1jcyhlLHQsbiksYT1jcyh0LHIsbikscz1jcyhpLGEsbik7cmV0dXJuW1tlLGksc10sW3MsYSxyXV19LHBzPShlLHQscixuKT0+e2NvbnN0IGk9WzAsLjUsMV0sYT1bXTtmb3IoY29uc3QgcyBvZiBpKXtjb25zdCBpPWZzKHMsZSx0LHIpLG89ZHMocyxlLHQsciksbD11cyh7eDotby55LHk6by54fSk7YS5wdXNoKHt4OmkueCtsLngqbix5OmkueStsLnkqbn0pfXJldHVybiBhfSxtcz0oZSx0LHIsbik9Pntjb25zdCBpPSgoZSx0LHIsbj00KT0+e2xldCBpPVtbZSx0LHJdXTtmb3IobGV0IGU9MDtlPG47ZSsrKXtjb25zdCBlPVtdO2Zvcihjb25zdCB0IG9mIGkpe2NvbnN0IHI9aHModFswXSx0WzFdLHRbMl0sLjUpO2UucHVzaChyWzBdLHJbMV0pfWk9ZX1yZXR1cm4gaX0pKGUsdCxyLDUpLGE9W10scz1bXTtmb3IoY29uc3QgZSBvZiBpKWEucHVzaChwcyhlWzBdLGVbMV0sZVsyXSwrbikpLHMucHVzaChwcyhlWzBdLGVbMV0sZVsyXSwtbikpO2ZvcihsZXQgZT0wO2U8YS5sZW5ndGgtMTsrK2UpYVtlKzFdWzBdPWFbZV1bMl07Zm9yKGxldCBlPTA7ZTxzLmxlbmd0aC0xOysrZSlzW2UrMV1bMF09c1tlXVsyXTtjb25zdCBvPWFbMF1bMF0sbD1bby54LG8ueSwhMV07Zm9yKGxldCBlPTA7ZTxhLmxlbmd0aDsrK2Upe2NvbnN0IHQ9YVtlXTtsLnB1c2godFsxXS54LHRbMV0ueSwhMCx0WzJdLngsdFsyXS55LCExKX1jb25zdCBjPVsuLi5zXS5yZXZlcnNlKCk7Zm9yKGxldCBlPTA7ZTxjLmxlbmd0aDsrK2Upe2NvbnN0W3QscixuXT1jW2VdO2NbZV09W24scix0XX1jb25zdCB1PWNbMF1bMF07bC5wdXNoKHUueCx1LnksITEpO2ZvcihsZXQgZT0wO2U8Yy5sZW5ndGg7KytlKXtjb25zdCB0PWNbZV07bC5wdXNoKHRbMV0ueCx0WzFdLnksITAsdFsyXS54LHRbMl0ueSwhMSl9cmV0dXJuIGx9LGdzPShlLHQscik9Pntjb25zdCBuPXt4OnQueC1lLngseTp0LnktZS55fSxpPSgoZSx0LHIpPT57Y29uc3Qgbj1NYXRoLnNxcnQoZSplK3QqdCk7cmV0dXJuIDA9PT1uP3t4OjAseTowfTp7eDotdC9uKnIseTplL24qcn19KShuLngsbi55LHIpLGE9e3g6ZS54K2kueCx5OmUueStpLnl9LHM9e3g6dC54K2kueCx5OnQueStpLnl9LG89e3g6dC54LWkueCx5OnQueS1pLnl9LGw9e3g6ZS54LWkueCx5OmUueS1pLnl9O3JldHVyblthLngsYS55LCExLHMueCxzLnksITEsby54LG8ueSwhMSxsLngsbC55LCExLGEueCxhLnksITFdfSxicz0oZSx0LHIsbik9Pntjb25zdCBpPVtdO2ZvcihsZXQgYT0wO2E8bi5sZW5ndGg7YSs9Myl7aWYoblthKzJdKWNvbnRpbnVlO2NvbnN0IHM9blthXSxvPW5bYSsxXSxsPU1hdGguc3FydChNYXRoLnBvdyhzLWUsMikrTWF0aC5wb3coby10LDIpKTtNYXRoLmFicyhsLXIpPjFlLTR8fGkucHVzaChzLG8pfXJldHVybiBpfSx4cz0oZSx0KT0+e2lzLmJlZ2luUGF0aCgpLGlzLm1vdmVUbyh0WzBdLHRbMV0pO2ZvcihsZXQgZT0zO2U8dC5sZW5ndGg7ZSs9Myl0W2UrMl0/KGlzLnF1YWRyYXRpY0N1cnZlVG8odFtlXSx0W2UrMV0sdFtlKzNdLHRbZSs0XSksZSs9Myk6aXMubGluZVRvKHRbZV0sdFtlKzFdKTtpcy5jbG9zZVBhdGgoKTtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrPTIpe2NvbnN0IHI9ZVt0XSxuPWVbdCsxXTtpZighaXMuaXNQb2ludEluUGF0aChyLG4pKXJldHVybltyLG5dfXJldHVybiBudWxsfSx2cz0oZSx0LHIsbixpPSExKT0+e2NvbnN0IGE9aT8wOm4ubGVuZ3RoLTEscz1pP24ubGVuZ3RoLTE6bi5sZW5ndGgtMixvPWJzKGUsdCxyLG5bYV0pLGw9YnMoZSx0LHIsbltzXSk7aWYob1swXT09PWxbMF0mJm9bMV09PT1sWzFdfHxvWzBdPT09bFsyXSYmb1sxXT09PWxbM10pcmV0dXJuO2NvbnN0IGM9eHMobyxuW3NdKTtpZighYylyZXR1cm47Y29uc3QgdT14cyhsLG5bYV0pO3UmJm4uc3BsaWNlKC0xLDAsW2UsdCwhMSxjWzBdLGNbMV0sITEsdVswXSx1WzFdLCExLGUsdCwhMV0pfSx5cz0oZSx0LHIsbixpPSExKT0+e2NvbnN0IGE9aT8wOm4ubGVuZ3RoLTEscz1pP24ubGVuZ3RoLTE6bi5sZW5ndGgtMixvPWJzKGUsdCxyLG5bYV0pLGw9YnMoZSx0LHIsbltzXSksYz14cyhvLG5bc10pO2lmKCFjKXJldHVybjtjb25zdCB1PXhzKGwsblthXSk7aWYoIXUpcmV0dXJuO2NvbnN0IGY9TWF0aC5hdGFuMihjWzFdLXQsY1swXS1lKTtsZXQgZD1NYXRoLmF0YW4yKHVbMV0tdCx1WzBdLWUpLWY7ZD5NYXRoLlBJP2QtPTIqTWF0aC5QSTpkPC1NYXRoLlBJJiYoZCs9MipNYXRoLlBJKTtjb25zdCBoPWQvOCxwPVtlLHQsITFdO2ZvcihsZXQgbj0wO248PTg7bisrKXtjb25zdCBpPWYrbipoLGE9ZStyKk1hdGguY29zKGkpLHM9dCtyKk1hdGguc2luKGkpO3AucHVzaChhLHMsITEpfW4uc3BsaWNlKC0xLDAscCl9LF9zPShlLHQscixuLGksYT0hMSk9Pntjb25zdCBzPWE/MDppLmxlbmd0aC0xLG89YT9pLmxlbmd0aC0xOmkubGVuZ3RoLTIsbD1icyhlLngsZS55LG4saVtzXSksYz1icyhlLngsZS55LG4saVtvXSk7aWYobFswXT09PWNbMF0mJmxbMV09PT1jWzFdfHxsWzBdPT09Y1syXSYmbFsxXT09PWNbM10pcmV0dXJuO2NvbnN0IHU9eHMobCxpW29dKTtpZighdSlyZXR1cm47Y29uc3QgZj14cyhjLGlbc10pO2lmKCFmKXJldHVybjtjb25zdCBkPXQueC1lLngsaD10LnktZS55LHA9TWF0aC5oeXBvdChkLGgpLG09e3g6ZC9wLHk6aC9wfSxnPXIueC1lLngsYj1yLnktZS55LHg9TWF0aC5oeXBvdChnLGIpLHY9e3g6Zy94LHk6Yi94fSx5PW0ueCxfPW0ueSx3PXYueCxNPXYueSxQPXkqTS1fKnc7aWYoMD09PVApcmV0dXJuIHZvaWQgaS5zcGxpY2UoLTEsMCxbZS54LGUueSwhMSx1WzBdLHVbMV0sITEsZlswXSxmWzFdLCExXSk7Y29uc3QgUz0oKGZbMF0tdVswXSkqTS0oZlsxXS11WzFdKSp3KS9QLEY9dVswXStTKnksVD11WzFdK1MqXztpLnNwbGljZSgtMSwwLFtlLngsZS55LCExLHVbMF0sdVsxXSwhMSxGLFQsITEsZS54LGUueSwhMSxmWzBdLGZbMV0sITEsRixULCExXSl9LHdzPShlLHQpPT57Y29uc3Qgcj1hcztyLng9ZVswXSxyLnk9ZVsxXTtjb25zdCBuPXNzO24ueD0wLG4ueT0wO2NvbnN0IGk9b3M7aS54PTAsaS55PTA7Y29uc3QgYT1sczthLng9MCxhLnk9MDtjb25zdCBzPVtdO2ZvcihsZXQgbz0zO288ZS5sZW5ndGg7bys9Myl7Y29uc3QgbD1lW29dLGM9ZVtvKzFdO2lmKGVbbysyXSluLng9bCxuLnk9YztlbHNle2lmKGkueD1sLGkueT1jLGVbby0xXT9zLnB1c2gobXMocixuLGksdCkpOnMucHVzaChncyhyLGksdCkpLHMubGVuZ3RoPjEpc3dpdGNoKFFuLmpvaW50cyl7Y2FzZSAwOnZzKHIueCxyLnksdCxzKTticmVhaztjYXNlIDE6YS54PWVbby02XSxhLnk9ZVtvLTVdLF9zKHIsaSxhLHQscyk7YnJlYWs7Y2FzZSAyOnlzKHIueCxyLnksdCxzKX1yLng9aS54LHIueT1pLnl9fWNvbnN0IG89ZVswXSxsPWVbMV0sYz1lW2UubGVuZ3RoLTNdLHU9ZVtlLmxlbmd0aC0yXSxmPTFlLTQ7aWYoTWF0aC5hYnMoby1jKTxmJiZNYXRoLmFicyhsLXUpPGYmJnMubGVuZ3RoPjEpc3dpdGNoKFFuLmpvaW50cyl7Y2FzZSAwOnZzKG8sbCx0LHMsITApO2JyZWFrO2Nhc2UgMTpyLng9byxyLnk9bCxpLng9ZVszXSxpLnk9ZVs0XSxhLng9ZVtlLmxlbmd0aC02XSxhLnk9ZVtlLmxlbmd0aC01XSxfcyhyLGksYSx0LHMsITApO2JyZWFrO2Nhc2UgMjp5cyhvLGwsdCxzLCEwKX1lbHNlIGlmKHMubGVuZ3RoPjApc3dpdGNoKFFuLmNhcHMpe2Nhc2UgMTooKGUsdCxyKT0+e2NvbnN0IG49ZVswXSxpPWVbMV0sYT1lWzNdLHM9ZVs0XSxvPU1hdGguYXRhbjIoaS1zLG4tYSksbD1bbixpLCExXTtmb3IobGV0IGU9MDtlPD04O2UrKyl7Y29uc3Qgcj1vLU1hdGguUEkvMitlKk1hdGguUEkvODtsLnB1c2gobit0Kk1hdGguY29zKHIpLGkrdCpNYXRoLnNpbihyKSwhMSl9ci51bnNoaWZ0KGwpO2NvbnN0IGM9ZVtlLmxlbmd0aC0zXSx1PWVbZS5sZW5ndGgtMl0sZj1lW2UubGVuZ3RoLTZdLGQ9ZVtlLmxlbmd0aC01XSxoPU1hdGguYXRhbjIodS1kLGMtZikscD1bYyx1LCExXTtmb3IobGV0IGU9MDtlPD04O2UrKyl7Y29uc3Qgcj1oLU1hdGguUEkvMitlKk1hdGguUEkvODtwLnB1c2goYyt0Kk1hdGguY29zKHIpLHUrdCpNYXRoLnNpbihyKSwhMSl9ci5wdXNoKHApfSkoZSx0LHMpO2JyZWFrO2Nhc2UgMjooKGUsdCxyKT0+e2NvbnN0IG49ZVswXSxpPWVbMV0sYT1uLWVbM10scz1pLWVbNF0sbz1NYXRoLmh5cG90KGEscyk7aWYobz4wKXtjb25zdCBlPWEvbyxsPXMvbyxjPW4rZSp0LHU9aStsKnQsZj1bbi1sKnQsaStlKnQsITEsYy1sKnQsdStlKnQsITEsYytsKnQsdS1lKnQsITEsbitsKnQsaS1lKnQsITEsbi1sKnQsaStlKnQsITFdO3IudW5zaGlmdChmKX1jb25zdCBsPWVbZS5sZW5ndGgtM10sYz1lW2UubGVuZ3RoLTJdLHU9bC1lW2UubGVuZ3RoLTZdLGY9Yy1lW2UubGVuZ3RoLTVdLGQ9TWF0aC5oeXBvdCh1LGYpO2lmKGQ+MCl7Y29uc3QgZT11L2Qsbj1mL2QsaT1sK2UqdCxhPWMrbip0LHM9W2wtbip0LGMrZSp0LCExLGktbip0LGErZSp0LCExLGkrbip0LGEtZSp0LCExLGwrbip0LGMtZSp0LCExLGwtbip0LGMrZSp0LCExXTtyLnB1c2gocyl9fSkoZSx0LHMpfXJldHVybiBzfSxNcz1uZXcgTWFwO2xldCBQcz0wO2NvbnN0IFNzPW5ldyBXZWFrTWFwLEZzPWU9PntsZXQgdD1Tcy5nZXQoZSk7cmV0dXJuIHR8fCh0PWUuY3JlYXRlVmlldygpLFNzLnNldChlLHQpKSx0fSxUcz1uZXcgTWFwLEJzPW5ldyBNYXAsT3M9KGUsdCxyKT0+e2NvbnN0IG49YCR7dH1fJHtyfWAsaT1Ucy5nZXQobik7cmV0dXJuIGkmJmkubGVuZ3RoPjA/aS5wb3AoKTplLmNyZWF0ZVRleHR1cmUoe3NpemU6e3dpZHRoOnQsaGVpZ2h0OnJ9LGZvcm1hdDoicmdiYTh1bm9ybSIsdXNhZ2U6Nn0pfSxBcz1lPT57Y29uc3QgdD1gJHtlLndpZHRofV8ke2UuaGVpZ2h0fWA7bGV0IHI9VHMuZ2V0KHQpO3J8fChyPVtdLFRzLnNldCh0LHIpKSxyLnB1c2goZSl9LFJzPShlLHQscik9Pntjb25zdCBuPWAke3R9XyR7cn1gLGk9QnMuZ2V0KG4pO3JldHVybiBpJiZpLmxlbmd0aD4wP2kucG9wKCk6ZS5jcmVhdGVUZXh0dXJlKHtzaXplOnt3aWR0aDp0LGhlaWdodDpyfSxmb3JtYXQ6InJnYmE4dW5vcm0iLHVzYWdlOjIyfSl9LENzPWU9Pntjb25zdCB0PWAke2Uud2lkdGh9XyR7ZS5oZWlnaHR9YDtsZXQgcj1Ccy5nZXQodCk7cnx8KHI9W10sQnMuc2V0KHQscikpLHIucHVzaChlKX0sRXM9bmV3IE1hcCxVcz1uZXcgTWFwO2xldCAkcz0wO2NvbnN0IEdzPShlLHQscik9PmAke3R9XyR7cn1fJHtlLmpvaW4oIiwiKX1gLGtzPShlLHQscik9Pntjb25zdCBuPUdzKGUsdCxyKSxpPVVzLmdldChuKTtyZXR1cm4gaT8oaS5sYXN0VXNlZEZyYW1lPSRzLGkpOm51bGx9LExzPShlLHQscixuLGkpPT57Y29uc3QgYT1HcyhlLHQscik7VXMuc2V0KGEse3RleHR1cmU6bix2aWV3OmksbGFzdFVzZWRGcmFtZTokc30pfTtsZXQgSXM9bnVsbDtjb25zdCBWcz1lPT5lPD00PzI1NjplPD04PzUxMjoxMDI0LHpzPShlLHQscik9Pntjb25zdCBuPWUubGVuZ3RoLzUsaT1WcyhuKSxhPW5ldyBVaW50OEFycmF5KDQqaSk7Zm9yKGxldCB0PTA7dDxpO3QrKyl7Y29uc3Qgbj1qcyhlLHQvKGktMSkscikscz00KnQ7YVtzKzBdPU1hdGgucm91bmQoTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsbi5yKSkpLGFbcysxXT1NYXRoLnJvdW5kKE1hdGgubWF4KDAsTWF0aC5taW4oMjU1LG4uZykpKSxhW3MrMl09TWF0aC5yb3VuZChNYXRoLm1heCgwLE1hdGgubWluKDI1NSxuLmIpKSksYVtzKzNdPU1hdGgucm91bmQoTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsbi5hKSkpfXJldHVybiBhfSxqcz0oZSx0LHIpPT57Y29uc3Qgbj1lLmxlbmd0aC81O2xldCBpPTAsYT0wO2ZvcihsZXQgcj0wO3I8bjtyKyspe2NvbnN0IG49ZVs1KnJdO2lmKG48PXQmJihpPXIpLG4+PXQmJjA9PT1hKXthPXI7YnJlYWt9fWlmKDA9PT1hJiYoYT1uLTEpLGk9PT1hKXtjb25zdCB0PTUqaTtyZXR1cm57cjplW3QrMV0sZzplW3QrMl0sYjplW3QrM10sYTplW3QrNF19fWNvbnN0IHM9ZVs1KmldLG89KHQtcykvKGVbNSphXS1zKSxsPWVbNSppKzFdLGM9ZVs1KmkrMl0sdT1lWzUqaSszXSxmPWVbNSppKzRdLGQ9ZVs1KmErMV0saD1lWzUqYSsyXSxwPWVbNSphKzNdLG09ZVs1KmErNF07cmV0dXJuIDA9PT1yP3tyOjI1NSpXcyhEcyhOcyhsLzI1NSksTnMoZC8yNTUpLG8pKSxnOjI1NSpXcyhEcyhOcyhjLzI1NSksTnMoaC8yNTUpLG8pKSxiOjI1NSpXcyhEcyhOcyh1LzI1NSksTnMocC8yNTUpLG8pKSxhOkRzKGYsbSxvKX06e3I6RHMobCxkLG8pLGc6RHMoYyxoLG8pLGI6RHModSxwLG8pLGE6RHMoZixtLG8pfX0sRHM9KGUsdCxyKT0+ZSsodC1lKSpyLE5zPWU9Pk1hdGgucG93KGUsMi4yMzMzMzMzMyksV3M9ZT0+TWF0aC5wb3coZSwuNDU0NTQ1NDUpLHFzPShlLHQscik9Pntjb25zdCBuPW5ldyBVaW50OEFycmF5KDEwMjQpLGk9ZS5sZW5ndGgsYT1bXTtmb3IobGV0IG49MDtuPGk7bisrKXtjb25zdCBpPXRbbl07YS5wdXNoKHtvZmZzZXQ6ZVtuXS8yNTUscjooaT4+MTYmMjU1KS8yNTUsZzooaT4+OCYyNTUpLzI1NSxiOigyNTUmaSkvMjU1LGE6cltuXX0pfWZvcihsZXQgZT0wO2U8MjU2O2UrKyl7Y29uc3QgdD1lLzI1NTtsZXQgcj0wLHM9aS0xO2ZvcihsZXQgZT0wO2U8aS0xO2UrKylpZihhW2VdLm9mZnNldDw9dCYmYVtlKzFdLm9mZnNldD49dCl7cj1lLHM9ZSsxO2JyZWFrfWNvbnN0IG89YVtyXSxsPWFbc107bGV0IGM9MDtsLm9mZnNldCE9PW8ub2Zmc2V0JiYoYz0odC1vLm9mZnNldCkvKGwub2Zmc2V0LW8ub2Zmc2V0KSk7Y29uc3QgdT1EcyhvLnIsbC5yLGMpLGY9RHMoby5nLGwuZyxjKSxkPURzKG8uYixsLmIsYyksaD1EcyhvLmEsbC5hLGMpLHA9NCplO25bcCswXT1NYXRoLnJvdW5kKHUqaCoyNTUpLG5bcCsxXT1NYXRoLnJvdW5kKGYqaCoyNTUpLG5bcCsyXT1NYXRoLnJvdW5kKGQqaCoyNTUpLG5bcCszXT1NYXRoLnJvdW5kKDI1NSpoKX1yZXR1cm4gbn0sWHM9KGUsdCxyKT0+e2NvbnN0IG49ZVswXSxpPWVbMV0sYT1lWzJdLHM9ZVszXSxvPWVbNF0sbD1lWzVdO2lmKDA9PT1yKXtjb25zdCBlPS04MTkuMipuLTgxOS4yKmErbyx0PTgxOS4yKm4tODE5LjIqYStvLHI9LTgxOS4yKmktODE5LjIqcytsLGM9ODE5LjIqaS04MTkuMipzK2w7bGV0IHU9LTgxOS4yKm4rODE5LjIqYStvLWUsZj0tODE5LjIqaSs4MTkuMipzK2wtcjtjb25zdCBkPU1hdGguc3FydCh1KnUrZipmKTtkPyh1Lz1kLGYvPWQpOih1PTAsZj0wKTtjb25zdCBoPSh0LWUpKnUrKGMtcikqZixwPW5ldyBGbG9hdDMyQXJyYXkoW2UraCp1LHIraCpmLHQsY10pO3JldHVybntpbnZlcnNlTWF0cml4Om5ldyBGbG9hdDMyQXJyYXkoWzEsMCwwLDAsMSwwLDAsMCwxXSksbGluZWFyUG9pbnRzOnB9fWNvbnN0IGM9bipzLWkqYTtpZihNYXRoLmFicyhjKTwxZS0xMClyZXR1cm57aW52ZXJzZU1hdHJpeDpuZXcgRmxvYXQzMkFycmF5KFsxLDAsMCwwLDEsMCwwLDAsMV0pLGxpbmVhclBvaW50czpudWxsfTtjb25zdCB1PTEvYztyZXR1cm57aW52ZXJzZU1hdHJpeDpuZXcgRmxvYXQzMkFycmF5KFtzKnUsLWkqdSwwLC1hKnUsbip1LDAsKGEqbC1zKm8pKnUsKGkqby1uKmwpKnUsMV0pLGxpbmVhclBvaW50czpudWxsfX07bGV0IFlzPW51bGw7Y29uc3QgS3M9bmV3IEZsb2F0MzJBcnJheSgzNiksSHM9bmV3IEZsb2F0MzJBcnJheSgxNik7bGV0IFFzPW51bGwsWnM9bnVsbDtjb25zdCBKcz1be2JpbmRpbmc6MCxyZXNvdXJjZTp7YnVmZmVyOm51bGx9fSx7YmluZGluZzoxLHJlc291cmNlOm51bGx9LHtiaW5kaW5nOjIscmVzb3VyY2U6bnVsbH1dLGVvPShlLHQpPT57Y29uc3Qgcj1lWzBdLG49ZVsxXSxpPWVbMl0sYT1lWzNdLHM9ZVs0XSxvPWVbNV0sbD10WzBdLGM9dFsxXSx1PXRbM10sZj10WzRdLGQ9dFs2XSxoPXRbN10scD1sKnIrdSpuLG09bCppK3UqYSxnPWMqcitmKm4sYj1jKmkrZiphLHg9bCpzK3UqbytkLHY9YypzK2YqbytoLHk9cCpiLW0qZztpZihNYXRoLmFicyh5KTwxZS0xMClyZXR1cm4gbmV3IEZsb2F0MzJBcnJheShbMSwwLDAsMCwxLDAsMCwwLDFdKTtjb25zdCBfPTEveSx3PWIqXyxNPS1tKl8sUD0tZypfLFM9cCpfO3JldHVybiBuZXcgRmxvYXQzMkFycmF5KFt3KmwrTSpjLFAqbCtTKmMsMCx3KnUrTSpmLFAqdStTKmYsMCx3KmQrTSpoKyhtKnYtYip4KSpfLFAqZCtTKmgrKGcqeC1wKnYpKl8sMV0pfSx0bz1uZXcgTWFwLHJvPW5ldyBGbG9hdDMyQXJyYXkoMzIpLG5vPW5ldyBGbG9hdDMyQXJyYXkoMTYpO2xldCBpbz1udWxsLGFvPW51bGw7Y29uc3Qgc289W3tiaW5kaW5nOjAscmVzb3VyY2U6e2J1ZmZlcjpudWxsfX0se2JpbmRpbmc6MSxyZXNvdXJjZTpudWxsfSx7YmluZGluZzoyLHJlc291cmNlOm51bGx9XSxvbz0oZSx0LHIsbixpLGEscyxvLGwsYyx1LGYsZCxoLHAsbSxnPSExLGI9MSk9Pntjb25zdCB4PW5zKGkpO2lmKDA9PT14LmluZGV4Q291bnQpcmV0dXJuIG51bGw7Y29uc3Qgdj1yLmFjcXVpcmVWZXJ0ZXhCdWZmZXIoeC5idWZmZXIuYnl0ZUxlbmd0aCx4LmJ1ZmZlcikseT1PcyhlLGMsdSk7ZS5xdWV1ZS53cml0ZVRleHR1cmUoe3RleHR1cmU6eX0sby5idWZmZXIse2J5dGVzUGVyUm93OjQqYyxyb3dzUGVySW1hZ2U6dSxvZmZzZXQ6by5ieXRlT2Zmc2V0fSx7d2lkdGg6YyxoZWlnaHQ6dX0pO2NvbnN0IF89ZW8obCxhKSx3PXNbMF0sTT1zWzFdLFA9c1syXSxTPXNbM10sRj1hWzBdLFQ9YVsxXSxCPWFbM10sTz1hWzRdLEE9YVs2XSxSPWFbN107cm9bMF09X1swXSxyb1sxXT1fWzFdLHJvWzJdPV9bMl0scm9bM109MCxyb1s0XT1fWzNdLHJvWzVdPV9bNF0scm9bNl09X1s1XSxyb1s3XT0wLHJvWzhdPV9bNl0scm9bOV09X1s3XSxyb1sxMF09X1s4XSxyb1sxMV09MCxyb1sxMl09Yyxyb1sxM109dSxyb1sxNF09Zj8xOjAscm9bMTVdPTAscm9bMTZdPXcscm9bMTddPU0scm9bMThdPVAscm9bMTldPVMscm9bMjBdPUYvaCxyb1syMV09VC9wLHJvWzIyXT0wLHJvWzIzXT0wLHJvWzI0XT1CL2gscm9bMjVdPU8vcCxyb1syNl09MCxyb1syN109MCxyb1syOF09QS9oLHJvWzI5XT1SL3Ascm9bMzBdPTEscm9bMzFdPTA7Y29uc3QgQz1yLmFjcXVpcmVBbmRXcml0ZVVuaWZvcm1CdWZmZXIocm8pLEU9YGJpdG1hcF8ke2Q/InMiOiJuIn1fJHtmPyJyIjoiYyJ9YDtsZXQgVT10by5nZXQoRSk7VXx8KFU9ZS5jcmVhdGVTYW1wbGVyKHttYWdGaWx0ZXI6ZD8ibGluZWFyIjoibmVhcmVzdCIsbWluRmlsdGVyOmQ/ImxpbmVhciI6Im5lYXJlc3QiLGFkZHJlc3NNb2RlVTpmPyJyZXBlYXQiOiJjbGFtcC10by1lZGdlIixhZGRyZXNzTW9kZVY6Zj8icmVwZWF0IjoiY2xhbXAtdG8tZWRnZSJ9KSx0by5zZXQoRSxVKSk7Y29uc3QgJD1uLmdldEJpbmRHcm91cExheW91dCgiYml0bWFwX2ZpbGwiKTtpZighJClyZXR1cm4gY29uc29sZS5lcnJvcigiW1dlYkdQVV0gYml0bWFwX2ZpbGwgYmluZCBncm91cCBsYXlvdXQgbm90IGZvdW5kIiksQXMoeSksbnVsbDtzb1swXS5yZXNvdXJjZS5idWZmZXI9Qyxzb1sxXS5yZXNvdXJjZT1VLHNvWzJdLnJlc291cmNlPXkuY3JlYXRlVmlldygpO2NvbnN0IEc9ZS5jcmVhdGVCaW5kR3JvdXAoe2xheW91dDokLGVudHJpZXM6c299KTtpZihtJiZnKXtjb25zdCBpPW4uZ2V0UGlwZWxpbmUoInN0ZW5jaWxfd3JpdGUiKTtpZihpKXtjb25zdCBhPSgoKT0+e2NvbnN0IHQ9bi5nZXRCaW5kR3JvdXBMYXlvdXQoImZpbGxfZHluYW1pYyIpO2lmKCF0KXJldHVybiBudWxsO25vWzBdPXcsbm9bMV09TSxub1syXT1QLG5vWzNdPVMsbm9bNF09Ri9oLG5vWzVdPVQvcCxub1s2XT0wLG5vWzddPTAsbm9bOF09Qi9oLG5vWzldPU8vcCxub1sxMF09MCxub1sxMV09MCxub1sxMl09QS9oLG5vWzEzXT1SL3Asbm9bMTRdPTEsbm9bMTVdPTA7Y29uc3QgaT1yLmR5bmFtaWNVbmlmb3JtLmFsbG9jYXRlKG5vKSxhPXIuZHluYW1pY1VuaWZvcm0uZ2V0QnVmZmVyKCk7cmV0dXJuIGlvJiZhbz09PWF8fChpbz1lLmNyZWF0ZUJpbmRHcm91cCh7bGF5b3V0OnQsZW50cmllczpbe2JpbmRpbmc6MCxyZXNvdXJjZTp7YnVmZmVyOmEsc2l6ZToyNTZ9fV19KSxhbz1hKSx7YmluZEdyb3VwOmlvLG9mZnNldDppfX0pKCk7YSYmKHQuc2V0UGlwZWxpbmUoaSksdC5zZXRTdGVuY2lsUmVmZXJlbmNlKDApLHQuc2V0VmVydGV4QnVmZmVyKDAsdiksdC5zZXRCaW5kR3JvdXAoMCxhLmJpbmRHcm91cCxbYS5vZmZzZXRdKSx0LmRyYXcoeC5pbmRleENvdW50LDEsMCwwKSl9Y29uc3QgYT1uLmdldFBpcGVsaW5lKCJiaXRtYXBfZmlsbF9zdGVuY2lsIik7YSYmKHQuc2V0UGlwZWxpbmUoYSksdC5zZXRTdGVuY2lsUmVmZXJlbmNlKDApLHQuc2V0QmluZEdyb3VwKDAsRyksdC5kcmF3KHguaW5kZXhDb3VudCwxLDAsMCkpfWVsc2V7bGV0IGU7aWYobSllPSJiaXRtYXBfZmlsbCI7ZWxzZSBpZihnKXtpZihEYSgpKXJldHVybiBBcyh5KSxudWxsO2U9ImJpdG1hcF9maWxsX2JncmFfc3RlbmNpbCJ9ZWxzZSBlPSJiaXRtYXBfZmlsbF9iZ3JhIjtjb25zdCByPW4uZ2V0UGlwZWxpbmUoZSk7aWYoIXIpcmV0dXJuIGNvbnNvbGUuZXJyb3IoYFtXZWJHUFVdICR7ZX0gcGlwZWxpbmUgbm90IGZvdW5kYCksQXMoeSksbnVsbDt0LnNldFBpcGVsaW5lKHIpLHQuc2V0VmVydGV4QnVmZmVyKDAsdiksdC5zZXRCaW5kR3JvdXAoMCxHKSwhZ3x8bXx8RGEoKXx8dC5zZXRTdGVuY2lsUmVmZXJlbmNlKEthKCkpLHQuZHJhdyh4LmluZGV4Q291bnQsMSwwLDApfXJldHVybiB5fSxsbz0oZSx0LHIpPT57Y29uc3Qgbj1lLmxlbmd0aC01O2ZvcihsZXQgaT0zO2k8bjtpKz0zKXtsZXQgbj00KnI7ZVtpKzJdPyh0W24rK109ZVtpLTNdLHRbbisrXT1lW2ktMl0sdFtuKytdPS41LHRbbisrXT0uNSx0W24rK109ZVtpXSx0W24rK109ZVtpKzFdLHRbbisrXT0uNSx0W24rK109LjUsdFtuKytdPWVbaSszXSx0W24rK109ZVtpKzRdLHRbbisrXT0uNSx0W24rK109LjUpOmVbaSs1XT8odFtuKytdPWVbMF0sdFtuKytdPWVbMV0sdFtuKytdPS41LHRbbisrXT0uNSx0W24rK109ZVtpXSx0W24rK109ZVtpKzFdLHRbbisrXT0uNSx0W24rK109LjUsdFtuKytdPWVbaSs2XSx0W24rK109ZVtpKzddLHRbbisrXT0uNSx0W24rK109LjUpOih0W24rK109ZVswXSx0W24rK109ZVsxXSx0W24rK109LjUsdFtuKytdPS41LHRbbisrXT1lW2ldLHRbbisrXT1lW2krMV0sdFtuKytdPS41LHRbbisrXT0uNSx0W24rK109ZVtpKzNdLHRbbisrXT1lW2krNF0sdFtuKytdPS41LHRbbisrXT0uNSkscis9M31yZXR1cm4gcn07bGV0IGNvPW5ldyBGbG9hdDMyQXJyYXkoMzIpO2xldCB1bz1udWxsO2NvbnN0IGZvPW5ldyBGbG9hdDMyQXJyYXkoMzYpLGhvPVt7YmluZGluZzowLHJlc291cmNlOntidWZmZXI6bnVsbH19LHtiaW5kaW5nOjEscmVzb3VyY2U6bnVsbH0se2JpbmRpbmc6MixyZXNvdXJjZTpudWxsfV0scG89KGUsdCxyLG4saSxhLHMsbyxsLGMsdSxmLGQsaCxwLG0sZyxiKT0+e2NvbnN0IHg9KChlLHQpPT57Y29uc3Qgcj10LzIsbj1bXTtmb3IoY29uc3QgdCBvZiBlKXtjb25zdCBlPXdzKHQscik7Zm9yKGNvbnN0IHQgb2YgZSluLnB1c2godCl9bGV0IGk9MDtmb3IoY29uc3QgZSBvZiBuKXtjb25zdCB0PWUubGVuZ3RoLTU7Zm9yKGxldCBlPTM7ZTx0O2UrPTMpaSs9M31pZigwPT09aSlyZXR1cm57YnVmZmVyOm5ldyBGbG9hdDMyQXJyYXkoMCksaW5kZXhDb3VudDowfTtjb25zdCBhPTQqaTt2YXIgcztjby5sZW5ndGg8YSYmKGNvPW5ldyBGbG9hdDMyQXJyYXkoKHM9YSxzLS0sc3w9cz4+MSxzfD1zPj4yLHN8PXM+PjQsc3w9cz4+OCxzfD1zPj4xNiwrK3MpKSk7Y29uc3Qgbz1jbztsZXQgbD0wO2Zvcihjb25zdCBlIG9mIG4pbD1sbyhlLG8sbCk7cmV0dXJue2J1ZmZlcjpvLnN1YmFycmF5KDAsNCpsKSxpbmRleENvdW50Omx9fSkoaSxhKTtpZigwPT09eC5pbmRleENvdW50KXJldHVybiBudWxsO2NvbnN0IHY9ci5hY3F1aXJlVmVydGV4QnVmZmVyKHguYnVmZmVyLmJ5dGVMZW5ndGgseC5idWZmZXIpO2xldCB5LF87Y29uc3Qgdz1rcyhjLGYsZCk7aWYodyl5PXcudGV4dHVyZSxfPXcudmlldztlbHNle2NvbnN0IHQ9enMoYywwLGQpLHI9Yy5sZW5ndGgvNSxuPVZzKHIpO3k9T3MoZSxuLDEpLGUucXVldWUud3JpdGVUZXh0dXJlKHt0ZXh0dXJlOnl9LHQse2J5dGVzUGVyUm93OjQqbixyb3dzUGVySW1hZ2U6MX0se3dpZHRoOm4saGVpZ2h0OjF9KSxfPXkuY3JlYXRlVmlldygpLExzKGMsZixkLHksXyl9Y29uc3QgTT1Ycyh1LDAsbCksUD1vWzNdPjA/b1szXToxLFM9c1swXSxGPXNbMV0sVD1zWzNdLEI9c1s0XSxPPXNbNl0sQT1zWzddO2ZvWzBdPU0uaW52ZXJzZU1hdHJpeFswXSxmb1sxXT1NLmludmVyc2VNYXRyaXhbM10sZm9bMl09MCxmb1szXT0wLGZvWzRdPU0uaW52ZXJzZU1hdHJpeFsxXSxmb1s1XT1NLmludmVyc2VNYXRyaXhbNF0sZm9bNl09MCxmb1s3XT0wLGZvWzhdPU0uaW52ZXJzZU1hdHJpeFs2XSxmb1s5XT1NLmludmVyc2VNYXRyaXhbN10sZm9bMTBdPTEsZm9bMTFdPTAsZm9bMTJdPWwsZm9bMTNdPU1hdGgubWF4KC0uOTc1LE1hdGgubWluKC45NzUsaCkpLGZvWzE0XT1mLGZvWzE1XT04MTkuMixNLmxpbmVhclBvaW50cz8oZm9bMTZdPU0ubGluZWFyUG9pbnRzWzBdLGZvWzE3XT1NLmxpbmVhclBvaW50c1sxXSxmb1sxOF09TS5saW5lYXJQb2ludHNbMl0sZm9bMTldPU0ubGluZWFyUG9pbnRzWzNdKTooZm9bMTZdPTAsZm9bMTddPTAsZm9bMThdPTAsZm9bMTldPTApLGZvWzIwXT0xLGZvWzIxXT0xLGZvWzIyXT0xLGZvWzIzXT1QLGZvWzI0XT1TL3AsZm9bMjVdPUYvbSxmb1syNl09MCxmb1syN109MCxmb1syOF09VC9wLGZvWzI5XT1CL20sZm9bMzBdPTAsZm9bMzFdPTAsZm9bMzJdPU8vcCxmb1szM109QS9tLGZvWzM0XT0xLGZvWzM1XT0wO2NvbnN0IFI9ci5hY3F1aXJlQW5kV3JpdGVVbmlmb3JtQnVmZmVyKGZvKTt1b3x8KHVvPWUuY3JlYXRlU2FtcGxlcih7bWFnRmlsdGVyOiJsaW5lYXIiLG1pbkZpbHRlcjoibGluZWFyIixhZGRyZXNzTW9kZVU6ImNsYW1wLXRvLWVkZ2UiLGFkZHJlc3NNb2RlVjoiY2xhbXAtdG8tZWRnZSJ9KSk7Y29uc3QgQz11byxFPW4uZ2V0QmluZEdyb3VwTGF5b3V0KCJncmFkaWVudF9maWxsIik7aWYoIUUpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIltXZWJHUFVdIGdyYWRpZW50X2ZpbGwgYmluZCBncm91cCBsYXlvdXQgbm90IGZvdW5kIiksbnVsbDtob1swXS5yZXNvdXJjZS5idWZmZXI9Uixob1sxXS5yZXNvdXJjZT1DLGhvWzJdLnJlc291cmNlPV87Y29uc3QgVT1lLmNyZWF0ZUJpbmRHcm91cCh7bGF5b3V0OkUsZW50cmllczpob30pLCQ9Yj9nPyJncmFkaWVudF9zdHJva2VfYXRsYXMiOiJncmFkaWVudF9zdHJva2VfYmdyYSI6Zz8iZ3JhZGllbnRfZmlsbCI6ImdyYWRpZW50X2ZpbGxfYmdyYSIsRz1uLmdldEdyYWRpZW50UGlwZWxpbmUoJCxsLGYpO3JldHVybiBHPyh0LnNldFBpcGVsaW5lKEcpLHQuc2V0VmVydGV4QnVmZmVyKDAsdiksdC5zZXRCaW5kR3JvdXAoMCxVKSx0LmRyYXcoeC5pbmRleENvdW50LDEsMCwwKSxudWxsKTooY29uc29sZS5lcnJvcihgW1dlYkdQVV0gJHskfSBwaXBlbGluZSBub3QgZm91bmRgKSxudWxsKX07bGV0IG1vPW5ldyBGbG9hdDMyQXJyYXkoMzIpO2NvbnN0IGdvPW5ldyBNYXAsYm89bmV3IEZsb2F0MzJBcnJheSgzMikseG89W3tiaW5kaW5nOjAscmVzb3VyY2U6e2J1ZmZlcjpudWxsfX0se2JpbmRpbmc6MSxyZXNvdXJjZTpudWxsfSx7YmluZGluZzoyLHJlc291cmNlOm51bGx9XSx2bz0oZSx0LHIsbixpLGEscyxvLGwsYyx1LGYsZCxoLHAsbSxnLGIpPT57Y29uc3QgeD0oKGUsdCk9Pntjb25zdCByPXQvMixuPVtdO2Zvcihjb25zdCB0IG9mIGUpe2NvbnN0IGU9d3ModCxyKTtmb3IoY29uc3QgdCBvZiBlKW4ucHVzaCh0KX1sZXQgaT0wO2Zvcihjb25zdCBlIG9mIG4pe2NvbnN0IHQ9ZS5sZW5ndGgtNTtmb3IobGV0IGU9MztlPHQ7ZSs9MylpKz0zfWlmKDA9PT1pKXJldHVybntidWZmZXI6bmV3IEZsb2F0MzJBcnJheSgwKSxpbmRleENvdW50OjB9O2NvbnN0IGE9NCppO3ZhciBzO21vLmxlbmd0aDxhJiYobW89bmV3IEZsb2F0MzJBcnJheSgocz1hLHMtLSxzfD1zPj4xLHN8PXM+PjIsc3w9cz4+NCxzfD1zPj44LHN8PXM+PjE2LCsrcykpKTtjb25zdCBvPW1vO2xldCBsPTA7Zm9yKGNvbnN0IGUgb2YgbilsPWxvKGUsbyxsKTtyZXR1cm57YnVmZmVyOm8uc3ViYXJyYXkoMCw0KmwpLGluZGV4Q291bnQ6bH19KShpLGEpO2lmKDA9PT14LmluZGV4Q291bnQpcmV0dXJuIG51bGw7Y29uc3Qgdj1yLmFjcXVpcmVWZXJ0ZXhCdWZmZXIoeC5idWZmZXIuYnl0ZUxlbmd0aCx4LmJ1ZmZlcikseT1PcyhlLHUsZik7ZS5xdWV1ZS53cml0ZVRleHR1cmUoe3RleHR1cmU6eX0sbC5idWZmZXIse2J5dGVzUGVyUm93OjQqdSxyb3dzUGVySW1hZ2U6ZixvZmZzZXQ6bC5ieXRlT2Zmc2V0fSx7d2lkdGg6dSxoZWlnaHQ6Zn0pO2NvbnN0IF89ZW8oYyxzKSx3PW9bM10+MD9vWzNdOjEsTT1zWzBdLFA9c1sxXSxTPXNbM10sRj1zWzRdLFQ9c1s2XSxCPXNbN107Ym9bMF09X1swXSxib1sxXT1fWzFdLGJvWzJdPV9bMl0sYm9bM109MCxib1s0XT1fWzNdLGJvWzVdPV9bNF0sYm9bNl09X1s1XSxib1s3XT0wLGJvWzhdPV9bNl0sYm9bOV09X1s3XSxib1sxMF09X1s4XSxib1sxMV09MCxib1sxMl09dSxib1sxM109Zixib1sxNF09ZD8xOjAsYm9bMTVdPTAsYm9bMTZdPTEsYm9bMTddPTEsYm9bMThdPTEsYm9bMTldPXcsYm9bMjBdPU0vcCxib1syMV09UC9tLGJvWzIyXT0wLGJvWzIzXT0wLGJvWzI0XT1TL3AsYm9bMjVdPUYvbSxib1syNl09MCxib1syN109MCxib1syOF09VC9wLGJvWzI5XT1CL20sYm9bMzBdPTEsYm9bMzFdPTA7Y29uc3QgTz1yLmFjcXVpcmVBbmRXcml0ZVVuaWZvcm1CdWZmZXIoYm8pLEE9YGJpdG1hcF8ke2g/InMiOiJuIn1fJHtkPyJyIjoiYyJ9YDtsZXQgUj1nby5nZXQoQSk7Unx8KFI9ZS5jcmVhdGVTYW1wbGVyKHttYWdGaWx0ZXI6aD8ibGluZWFyIjoibmVhcmVzdCIsbWluRmlsdGVyOmg/ImxpbmVhciI6Im5lYXJlc3QiLGFkZHJlc3NNb2RlVTpkPyJyZXBlYXQiOiJjbGFtcC10by1lZGdlIixhZGRyZXNzTW9kZVY6ZD8icmVwZWF0IjoiY2xhbXAtdG8tZWRnZSJ9KSxnby5zZXQoQSxSKSk7Y29uc3QgQz1uLmdldEJpbmRHcm91cExheW91dCgiYml0bWFwX2ZpbGwiKTtpZighQylyZXR1cm4gY29uc29sZS5lcnJvcigiW1dlYkdQVV0gYml0bWFwX2ZpbGwgYmluZCBncm91cCBsYXlvdXQgbm90IGZvdW5kIiksQXMoeSksbnVsbDt4b1swXS5yZXNvdXJjZS5idWZmZXI9Tyx4b1sxXS5yZXNvdXJjZT1SLHhvWzJdLnJlc291cmNlPXkuY3JlYXRlVmlldygpO2NvbnN0IEU9ZS5jcmVhdGVCaW5kR3JvdXAoe2xheW91dDpDLGVudHJpZXM6eG99KSxVPWI/Zz8iYml0bWFwX3N0cm9rZV9hdGxhcyI6ImJpdG1hcF9zdHJva2VfYmdyYSI6Zz8iYml0bWFwX2ZpbGwiOiJiaXRtYXBfZmlsbF9iZ3JhIiwkPW4uZ2V0UGlwZWxpbmUoVSk7cmV0dXJuICQ/KHQuc2V0UGlwZWxpbmUoJCksdC5zZXRWZXJ0ZXhCdWZmZXIoMCx2KSx0LnNldEJpbmRHcm91cCgwLEUpLHQuZHJhdyh4LmluZGV4Q291bnQsMSwwLDApLHkpOihjb25zb2xlLmVycm9yKGBbV2ViR1BVXSAke1V9IHBpcGVsaW5lIG5vdCBmb3VuZGApLEFzKHkpLG51bGwpfSx5bz1uZXcgRmxvYXQzMkFycmF5KFstMSwtMSwuNSwuNSwxLC0xLC41LC41LC0xLDEsLjUsLjUsLTEsMSwuNSwuNSwxLC0xLC41LC41LDEsMSwuNSwuNV0pLF9vPW5ldyBGbG9hdDMyQXJyYXkoWzEsMSwxLDEsLjUsMCwwLDAsMCwuNSwwLDAsLjUsLjUsMSwwXSksd289bmV3IEZsb2F0MzJBcnJheSgxNiksTW89KGUsdCxyLG4saSxhLHMsbyxsLGM9ITEpPT57Y29uc3QgdT1pLmNsaXBMZXZlbCxmPWkud2lkdGgsZD1pLmhlaWdodCxoPW9bMF0scD1vWzFdLG09b1syXSxnPW9bM10qbDtpZigwPT09YS5sZW5ndGgpcmV0dXJuO2NvbnN0IGI9bnMoYSk7aWYoMD09PWIuaW5kZXhDb3VudClyZXR1cm47Y29uc3QgeD1yLmFjcXVpcmVWZXJ0ZXhCdWZmZXIoYi5idWZmZXIuYnl0ZUxlbmd0aCxiLmJ1ZmZlciksdj1zWzBdLHk9c1sxXSxfPXNbM10sdz1zWzRdLE09c1s2XSxQPXNbN107d29bMF09aCx3b1sxXT1wLHdvWzJdPW0sd29bM109Zyx3b1s0XT12L2Ysd29bNV09eS9kLHdvWzZdPTAsd29bN109MCx3b1s4XT1fL2Ysd29bOV09dy9kLHdvWzEwXT0wLHdvWzExXT0wLHdvWzEyXT1NL2Ysd29bMTNdPVAvZCx3b1sxNF09MSx3b1sxNV09MDtjb25zdCBTPXIuZHluYW1pY1VuaWZvcm0uYWxsb2NhdGUod28pO2xldCBGLFQ9UWEuZ2V0KHUpPz91O2lmKGMpe0Y9YGNsaXBfd3JpdGVfbWFpbl8ke01hdGgubWluKDgsTWF0aC5tYXgoMSxUKSl9YH1lbHNlIEY9ImNsaXBfd3JpdGUiO2NvbnN0IEI9bi5nZXRQaXBlbGluZShGKTtpZighQilyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKGBbV2ViR1BVXSAke0Z9IHBpcGVsaW5lIG5vdCBmb3VuZGApO2NvbnN0IE89bi5nZXRCaW5kR3JvdXBMYXlvdXQoImZpbGxfZHluYW1pYyIpO2lmKCFPKXJldHVybjtjb25zdCBBPWUuY3JlYXRlQmluZEdyb3VwKHtsYXlvdXQ6TyxlbnRyaWVzOlt7YmluZGluZzowLHJlc291cmNlOntidWZmZXI6ci5keW5hbWljVW5pZm9ybS5nZXRCdWZmZXIoKSxzaXplOjI1Nn19XX0pO3Quc2V0UGlwZWxpbmUoQiksdC5zZXRTdGVuY2lsUmVmZXJlbmNlKDApLHQuc2V0VmVydGV4QnVmZmVyKDAseCksdC5zZXRCaW5kR3JvdXAoMCxBLFtTXSksdC5kcmF3KGIuaW5kZXhDb3VudCwxLDAsMCksVCsrLFQ+OCYmKCgoZSx0LHIsbixpKT0+e2lmKCFpKXJldHVybjtjb25zdCBhPWkuY2xpcExldmVsLHM9MTw8YS0xLG89ci5hY3F1aXJlVmVydGV4QnVmZmVyKHlvLmJ5dGVMZW5ndGgseW8pLGw9ci5keW5hbWljVW5pZm9ybS5hbGxvY2F0ZShfbyksYz1uLmdldEJpbmRHcm91cExheW91dCgiZmlsbF9keW5hbWljIik7aWYoIWMpcmV0dXJuO2NvbnN0IHU9ZS5jcmVhdGVCaW5kR3JvdXAoe2xheW91dDpjLGVudHJpZXM6W3tiaW5kaW5nOjAscmVzb3VyY2U6e2J1ZmZlcjpyLmR5bmFtaWNVbmlmb3JtLmdldEJ1ZmZlcigpLHNpemU6MjU2fX1dfSksZj1uLmdldFBpcGVsaW5lKGBtYXNrX3VuaW9uX21lcmdlXyR7YX1gKTtmJiYodC5zZXRQaXBlbGluZShmKSx0LnNldFN0ZW5jaWxSZWZlcmVuY2UocyksdC5zZXRWZXJ0ZXhCdWZmZXIoMCxvKSx0LnNldEJpbmRHcm91cCgwLHUsW2xdKSx0LmRyYXcoNiwxLDAsMCkpO2NvbnN0IGQ9bi5nZXRQaXBlbGluZShgbWFza191bmlvbl9jbGVhcl8ke2F9YCk7ZCYmKHQuc2V0UGlwZWxpbmUoZCksdC5zZXRTdGVuY2lsUmVmZXJlbmNlKDApLHQuc2V0VmVydGV4QnVmZmVyKDAsbyksdC5zZXRCaW5kR3JvdXAoMCx1LFtsXSksdC5kcmF3KDYsMSwwLDApKX0pKGUsdCxyLG4saSksVD11KzEpLFFhLnNldCh1LFQpfTtsZXQgUG89bnVsbCxTbz1udWxsO2xldCBGbz1udWxsLFRvPW51bGw7Y29uc3QgQm89bmV3IEZsb2F0MzJBcnJheSgxMiksT289W3tiaW5kaW5nOjAscmVzb3VyY2U6e2J1ZmZlcjpudWxsfX0se2JpbmRpbmc6MSxyZXNvdXJjZTpudWxsfSx7YmluZGluZzoyLHJlc291cmNlOm51bGx9LHtiaW5kaW5nOjMscmVzb3VyY2U6bnVsbH1dLEFvPShlLHQscixuLGkpPT57Y29uc3R7ZGV2aWNlOmEsY29tbWFuZEVuY29kZXI6cyxmcmFtZUJ1ZmZlck1hbmFnZXI6byxwaXBlbGluZU1hbmFnZXI6bCx0ZXh0dXJlTWFuYWdlcjpjfT1pLHU9TWF0aC5tYXgoZS53aWR0aCx0LndpZHRoKSxmPU1hdGgubWF4KGUuaGVpZ2h0LHQuaGVpZ2h0KSxkPW8uY3JlYXRlVGVtcG9yYXJ5QXR0YWNobWVudCh1LGYpLGg9bC5nZXRQaXBlbGluZSgiY29tcGxleF9ibGVuZCIpLHA9bC5nZXRCaW5kR3JvdXBMYXlvdXQoImNvbXBsZXhfYmxlbmQiKTtpZighaHx8IXApcmV0dXJuIGNvbnNvbGUuZXJyb3IoYFtXZWJHUFUgQ29tcGxleEJsZW5kXSBQaXBlbGluZSBub3QgZm91bmQgZm9yIGJsZW5kIG1vZGU6ICR7cn1gKSxlO2NvbnN0IG09Yy5jcmVhdGVTYW1wbGVyKCJjb21wbGV4X2JsZW5kX3NhbXBsZXIiLCEwKSxnPWZhLmdldEJsZW5kTW9kZUluZGV4KHIpO0JvWzBdPW5bMF0sQm9bMV09blsxXSxCb1syXT1uWzJdLEJvWzNdPW5bM10sQm9bNF09bls0XSxCb1s1XT1uWzVdLEJvWzZdPW5bNl0sQm9bN109bls3XSxCb1s4XT1nLEJvWzldPTAsQm9bMTBdPTAsQm9bMTFdPTA7Y29uc3QgYj1pLmJ1ZmZlck1hbmFnZXI/aS5idWZmZXJNYW5hZ2VyLmFjcXVpcmVBbmRXcml0ZVVuaWZvcm1CdWZmZXIoQm8pOmEuY3JlYXRlQnVmZmVyKHtzaXplOjQ4LHVzYWdlOkdQVUJ1ZmZlclVzYWdlLlVOSUZPUk18R1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1R9KTtpLmJ1ZmZlck1hbmFnZXJ8fGEucXVldWUud3JpdGVCdWZmZXIoYiwwLEJvKSxPb1swXS5yZXNvdXJjZS5idWZmZXI9YixPb1sxXS5yZXNvdXJjZT1tLE9vWzJdLnJlc291cmNlPXQudGV4dHVyZS52aWV3LE9vWzNdLnJlc291cmNlPWUudGV4dHVyZS52aWV3O2NvbnN0IHg9YS5jcmVhdGVCaW5kR3JvdXAoe2xheW91dDpwLGVudHJpZXM6T299KSx2PW8uY3JlYXRlUmVuZGVyUGFzc0Rlc2NyaXB0b3IoZC50ZXh0dXJlLnZpZXcsMCwwLDAsMCwiY2xlYXIiKSx5PXMuYmVnaW5SZW5kZXJQYXNzKHYpO3JldHVybiB5LnNldFBpcGVsaW5lKGgpLHkuc2V0QmluZEdyb3VwKDAseCkseS5kcmF3KDYsMSwwLDApLHkuZW5kKCksZH0sUm89bmV3IEZsb2F0MzJBcnJheSg0KSxDbz1uZXcgRmxvYXQzMkFycmF5KDYpLEVvPW5ldyBGbG9hdDMyQXJyYXkoOCksVW89bmV3IEZsb2F0MzJBcnJheSgxMiksJG89W3tiaW5kaW5nOjAscmVzb3VyY2U6e2J1ZmZlcjpudWxsfX0se2JpbmRpbmc6MSxyZXNvdXJjZTpudWxsfSx7YmluZGluZzoyLHJlc291cmNlOm51bGx9XSxHbz0oZSx0LHIsbixpLGEscyxvLGwsYyx1LGYsZCxoKT0+e2NvbnN0IHA9ZC5nZXRQaXBlbGluZSgiY29tcGxleF9ibGVuZF9jb3B5IiksbT1kLmdldEJpbmRHcm91cExheW91dCgidGV4dHVyZV9jb3B5Iik7aWYoIXB8fCFtKXJldHVybjtSb1swXT1sL3MsUm9bMV09Yy9vLFJvWzJdPWkvcyxSb1szXT1hL287Y29uc3QgZz1oLmFjcXVpcmVBbmRXcml0ZVVuaWZvcm1CdWZmZXIoUm8pLGI9Zi5jcmVhdGVTYW1wbGVyKCJjb21wbGV4X2JsZW5kX2NvcHlfc2FtcGxlciIsITEpOyRvWzBdLnJlc291cmNlLmJ1ZmZlcj1nLCRvWzFdLnJlc291cmNlPWIsJG9bMl0ucmVzb3VyY2U9cjtjb25zdCB4PWUuY3JlYXRlQmluZEdyb3VwKHtsYXlvdXQ6bSxlbnRyaWVzOiRvfSksdj11LmNyZWF0ZVJlbmRlclBhc3NEZXNjcmlwdG9yKG4udGV4dHVyZS52aWV3LDAsMCwwLDAsImNsZWFyIikseT10LmJlZ2luUmVuZGVyUGFzcyh2KTt5LnNldFBpcGVsaW5lKHApLHkuc2V0QmluZEdyb3VwKDAseCkseS5kcmF3KDYsMSwwLDApLHkuZW5kKCl9LGtvPShlLHQscixuLGksYSxzLG8sbCxjKT0+e2NvbnN0IHU9bi5tc2FhJiZuLm1zYWFUZXh0dXJlPy52aWV3LGY9dT8iY29tcGxleF9ibGVuZF9vdXRwdXRfbXNhYSI6ImNvbXBsZXhfYmxlbmRfb3V0cHV0IixkPWwuZ2V0UGlwZWxpbmUoZiksaD1sLmdldEJpbmRHcm91cExheW91dCgicG9zaXRpb25lZF90ZXh0dXJlIik7aWYoIWR8fCFoKXJldHVybjtFb1swXT1pLEVvWzFdPWEsRW9bMl09ci53aWR0aCxFb1szXT1yLmhlaWdodCxFb1s0XT1uLndpZHRoLEVvWzVdPW4uaGVpZ2h0LEVvWzZdPTAsRW9bN109MDtjb25zdCBwPWMuYWNxdWlyZUFuZFdyaXRlVW5pZm9ybUJ1ZmZlcihFbyksbT1vLmNyZWF0ZVNhbXBsZXIoImNvbXBsZXhfYmxlbmRfb3V0cHV0X3NhbXBsZXIiLCExKTskb1swXS5yZXNvdXJjZS5idWZmZXI9cCwkb1sxXS5yZXNvdXJjZT1tLCRvWzJdLnJlc291cmNlPXIudGV4dHVyZS52aWV3O2NvbnN0IGc9ZS5jcmVhdGVCaW5kR3JvdXAoe2xheW91dDpoLGVudHJpZXM6JG99KSxiPXU/bi5tc2FhVGV4dHVyZS52aWV3Om4udGV4dHVyZS52aWV3LHg9dT9uLnRleHR1cmUudmlldzpudWxsLHY9cy5jcmVhdGVSZW5kZXJQYXNzRGVzY3JpcHRvcihiLDAsMCwwLDAsImxvYWQiLHgpLHk9dC5iZWdpblJlbmRlclBhc3Modik7eS5zZXRQaXBlbGluZShkKSx5LnNldEJpbmRHcm91cCgwLGcpLHkuZHJhdyg2LDEsMCwwKSx5LmVuZCgpfSxMbz0oZSx0LHIsbixpLGEscyk9Pntjb25zdCBvPSRhO2lmKDA9PT1vLmxlbmd0aClyZXR1cm47aWYoIXJ8fCFyLnRleHR1cmUpcmV0dXJuIHZvaWQgTGEoKTtjb25zdCBsPXdhKCl8fG4uZ2V0QXR0YWNobWVudCgiYXRsYXMiKTtpZihsJiZsLnRleHR1cmUpe2Zvcihjb25zdCBjIG9mIG8pe2NvbnN0e25vZGU6byx4X21pbjp1LHlfbWluOmYseF9tYXg6ZCx5X21heDpoLGNvbG9yX3RyYW5zZm9ybTpwLG1hdHJpeDptLGJsZW5kX21vZGU6ZyxnbG9iYWxfYWxwaGE6Yn09Yyx4PU1hdGguY2VpbChNYXRoLmFicyhkLXUpKSx2PU1hdGguY2VpbChNYXRoLmFicyhoLWYpKTtpZih4PD0wfHx2PD0wKWNvbnRpbnVlO2NvbnN0IHk9TWF0aC5tYXgoMCxNYXRoLmZsb29yKG1bNl0pKSxfPU1hdGgubWF4KDAsTWF0aC5mbG9vcihtWzddKSk7aWYoeT49ci53aWR0aHx8Xz49ci5oZWlnaHQpY29udGludWU7Y29uc3Qgdz0xIT09bVswXXx8MCE9PW1bMV18fDAhPT1tWzNdfHwxIT09bVs0XSxNPXc/eDpvLncsUD13P3Y6by5oLFM9TWF0aC5taW4oTSxyLndpZHRoLXkpLEY9TWF0aC5taW4oUCxyLmhlaWdodC1fKTtpZihTPD0wfHxGPD0wKWNvbnRpbnVlO2xldCBUO2lmKHcpe1Q9bi5jcmVhdGVUZW1wb3JhcnlBdHRhY2htZW50KE0sUCk7Y29uc3Qgcj1hLmdldFBpcGVsaW5lKCJjb21wbGV4X2JsZW5kX3NjYWxlIiksYz1hLmdldEJpbmRHcm91cExheW91dCgidGV4dHVyZV9zY2FsZSIpO2lmKHImJmMpe2NvbnN0IGE9TS8yLHU9UC8yLGY9by53LzIsZD1vLmgvMjtDb1swXT1tWzBdLENvWzFdPW1bMV0sQ29bMl09bVszXSxDb1szXT1tWzRdLENvWzRdPS1mKm1bMF0tZCptWzNdK2EsQ29bNV09LWYqbVsxXS1kKm1bNF0rdTtjb25zdCBoPW4uY3JlYXRlVGVtcG9yYXJ5QXR0YWNobWVudChvLncsby5oKTt0LmNvcHlUZXh0dXJlVG9UZXh0dXJlKHt0ZXh0dXJlOmwudGV4dHVyZS5yZXNvdXJjZSxvcmlnaW46e3g6by54LHk6by55LHo6MH19LHt0ZXh0dXJlOmgudGV4dHVyZS5yZXNvdXJjZSxvcmlnaW46e3g6MCx5OjAsejowfX0se3dpZHRoOm8udyxoZWlnaHQ6by5ofSksVW9bMF09Q29bMF0sVW9bMV09Q29bMV0sVW9bMl09Q29bMl0sVW9bM109Q29bM10sVW9bNF09Q29bNF0sVW9bNV09Q29bNV0sVW9bNl09by53LFVvWzddPW8uaCxVb1s4XT1NLFVvWzldPVAsVW9bMTBdPTAsVW9bMTFdPTA7Y29uc3QgcD1zLmFjcXVpcmVBbmRXcml0ZVVuaWZvcm1CdWZmZXIoVW8sNDgpLGc9aS5jcmVhdGVTYW1wbGVyKCJzY2FsZV9zYW1wbGVyIiwhMCk7JG9bMF0ucmVzb3VyY2UuYnVmZmVyPXAsJG9bMV0ucmVzb3VyY2U9Zywkb1syXS5yZXNvdXJjZT1oLnRleHR1cmUudmlldztjb25zdCBiPWUuY3JlYXRlQmluZEdyb3VwKHtsYXlvdXQ6YyxlbnRyaWVzOiRvfSkseD1uLmNyZWF0ZVJlbmRlclBhc3NEZXNjcmlwdG9yKFQudGV4dHVyZS52aWV3LDAsMCwwLDAsImNsZWFyIiksdj10LmJlZ2luUmVuZGVyUGFzcyh4KTt2LnNldFBpcGVsaW5lKHIpLHYuc2V0QmluZEdyb3VwKDAsYiksdi5kcmF3KDYsMSwwLDApLHYuZW5kKCksbi5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChoKX1lbHNlIHQuY29weVRleHR1cmVUb1RleHR1cmUoe3RleHR1cmU6bC50ZXh0dXJlLnJlc291cmNlLG9yaWdpbjp7eDpvLngseTpvLnksejowfX0se3RleHR1cmU6VC50ZXh0dXJlLnJlc291cmNlLG9yaWdpbjp7eDowLHk6MCx6OjB9fSx7d2lkdGg6TWF0aC5taW4oby53LE0pLGhlaWdodDpNYXRoLm1pbihvLmgsUCl9KX1lbHNlIFQ9bi5jcmVhdGVUZW1wb3JhcnlBdHRhY2htZW50KE0sUCksdC5jb3B5VGV4dHVyZVRvVGV4dHVyZSh7dGV4dHVyZTpsLnRleHR1cmUucmVzb3VyY2Usb3JpZ2luOnt4Om8ueCx5Om8ueSx6OjB9fSx7dGV4dHVyZTpULnRleHR1cmUucmVzb3VyY2Usb3JpZ2luOnt4OjAseTowLHo6MH19LHt3aWR0aDpNLGhlaWdodDpQfSk7Y29uc3QgQj1uLmNyZWF0ZVRlbXBvcmFyeUF0dGFjaG1lbnQoTSxQKTtHbyhlLHQsci50ZXh0dXJlLnZpZXcsQix5LF8sci53aWR0aCxyLmhlaWdodCxNLFAsbixpLGEscyksRW9bMF09cFswXSxFb1sxXT1wWzFdLEVvWzJdPXBbMl0sRW9bM109YixFb1s0XT1wWzRdLEVvWzVdPXBbNV0sRW9bNl09cFs2XSxFb1s3XT0wO2NvbnN0IE89QW8oVCxCLGcsRW8se2RldmljZTplLGNvbW1hbmRFbmNvZGVyOnQsYnVmZmVyTWFuYWdlcjpzLGZyYW1lQnVmZmVyTWFuYWdlcjpuLHBpcGVsaW5lTWFuYWdlcjphLHRleHR1cmVNYW5hZ2VyOml9KTtrbyhlLHQsTyxyLHksXyxuLGksYSxzKSxuLnJlbGVhc2VUZW1wb3JhcnlBdHRhY2htZW50KFQpLG4ucmVsZWFzZVRlbXBvcmFyeUF0dGFjaG1lbnQoQiksbi5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChPKX1MYSgpfWVsc2UgTGEoKX0sSW89e3g6MCx5OjB9LFZvPVsuNSwxLjA1LDEuNCwxLjU1LDEuNzUsMS45LDIsMi4xNSwyLjIsMi4zLDIuNSwzLDMsMy41LDMuNV0sem89bmV3IEZsb2F0MzJBcnJheSg4KSxqbz1be2JpbmRpbmc6MCxyZXNvdXJjZTpudWxsfSx7YmluZGluZzoxLHJlc291cmNlOm51bGx9LHtiaW5kaW5nOjIscmVzb3VyY2U6e2J1ZmZlcjpudWxsfX1dLERvPXtsYWJlbDoiYmx1cl9jb21wdXRlX3Bhc3NfaCJ9LE5vPXtsYWJlbDoiYmx1cl9jb21wdXRlX3Bhc3NfdiJ9LFdvPShlLHQscixuLGksYSxzLG8pPT57Y29uc3QgbD1NYXRoLmNlaWwoLjUqcyksYz1sPj04JiZsPD0yND9hPyJibHVyX2NvbXB1dGVfc2hhcmVkX2hvcml6b250YWwiOiJibHVyX2NvbXB1dGVfc2hhcmVkX3ZlcnRpY2FsIjphPyJibHVyX2NvbXB1dGVfaG9yaXpvbnRhbCI6ImJsdXJfY29tcHV0ZV92ZXJ0aWNhbCIsdT1yLmdldFBpcGVsaW5lKGMpLGY9ci5nZXRCaW5kR3JvdXBMYXlvdXQoImJsdXJfY29tcHV0ZSIpO2lmKCF1fHwhZilyZXR1cm47Y29uc3QgZD0xLShsLS41KnMpLGg9MStzO3pvWzBdPWE/MTowLHpvWzFdPWE/MDoxLHpvWzJdPWwsem9bM109ZCx6b1s0XT1uLndpZHRoLHpvWzVdPW4uaGVpZ2h0LHpvWzZdPWgsem9bN109MDtjb25zdCBwPW8/by5hY3F1aXJlQW5kV3JpdGVVbmlmb3JtQnVmZmVyKHpvKTooKCk9Pntjb25zdCB0PWUuY3JlYXRlQnVmZmVyKHtzaXplOnpvLmJ5dGVMZW5ndGgsdXNhZ2U6R1BVQnVmZmVyVXNhZ2UuVU5JRk9STXxHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVH0pO3JldHVybiBlLnF1ZXVlLndyaXRlQnVmZmVyKHQsMCx6byksdH0pKCk7am9bMF0ucmVzb3VyY2U9bi50ZXh0dXJlLnZpZXcsam9bMV0ucmVzb3VyY2U9aS50ZXh0dXJlLnZpZXcsam9bMl0ucmVzb3VyY2UuYnVmZmVyPXA7Y29uc3QgbT1lLmNyZWF0ZUJpbmRHcm91cCh7bGF5b3V0OmYsZW50cmllczpqb30pLGc9dC5iZWdpbkNvbXB1dGVQYXNzKGE/RG86Tm8pO2cuc2V0UGlwZWxpbmUodSksZy5zZXRCaW5kR3JvdXAoMCxtKTtjb25zdCBiPU1hdGguY2VpbChpLndpZHRoLzE2KSx4PU1hdGguY2VpbChpLmhlaWdodC8xNik7Zy5kaXNwYXRjaFdvcmtncm91cHMoYix4LDEpLGcuZW5kKCl9LHFvPW5ldyBGbG9hdDMyQXJyYXkoNCksWG89W3tiaW5kaW5nOjAscmVzb3VyY2U6e2J1ZmZlcjpudWxsfX0se2JpbmRpbmc6MSxyZXNvdXJjZTpudWxsfSx7YmluZGluZzoyLHJlc291cmNlOm51bGx9XSxZbz0oZSx0LHIsbixpLGEscyk9Pntjb25zdHtkZXZpY2U6byxjb21tYW5kRW5jb2RlcjpsLGZyYW1lQnVmZmVyTWFuYWdlcjpjLHBpcGVsaW5lTWFuYWdlcjp1LHRleHR1cmVNYW5hZ2VyOmZ9PXMsZD0oKGUsdCxyLG4saSk9Pntjb25zdCBhPXQqKE1hdGguc3FydChlWzBdKmVbMF0rZVsxXSplWzFdKS9pKSxzPXIqKE1hdGguc3FydChlWzJdKmVbMl0rZVszXSplWzNdKS9pKSxvPVZvW01hdGgubWluKG4tMSxWby5sZW5ndGgtMSldO2xldCBsPTEsYz0xO3JldHVybiBhPjEyOD9sPS4wNjI1OmE+NjQ/bD0uMTI1OmE+MzI/bD0uMjU6YT4xNiYmKGw9LjUpLHM+MTI4P2M9LjA2MjU6cz42ND9jPS4xMjU6cz4zMj9jPS4yNTpzPjE2JiYoYz0uNSkse2Jhc2VCbHVyWDphLGJhc2VCbHVyWTpzLG9mZnNldFg6TWF0aC5yb3VuZChhKm8pLG9mZnNldFk6TWF0aC5yb3VuZChzKm8pLGJ1ZmZlclNjYWxlWDpsLGJ1ZmZlclNjYWxlWTpjfX0pKHQscixuLGksYSkse2Jhc2VCbHVyWDpoLGJhc2VCbHVyWTpwLG9mZnNldFg6bSxvZmZzZXRZOmcsYnVmZmVyU2NhbGVYOmIsYnVmZmVyU2NhbGVZOnh9PWQ7SW8ueCs9bSxJby55Kz1nO2NvbnN0IHY9ZS53aWR0aCsyKm0seT1lLmhlaWdodCsyKmcsXz1NYXRoLmNlaWwodipiKSx3PU1hdGguY2VpbCh5KngpLE09Yy5jcmVhdGVUZW1wb3JhcnlBdHRhY2htZW50KF8sdyksUD1jLmNyZWF0ZVRlbXBvcmFyeUF0dGFjaG1lbnQoXyx3KSxTPWYuY3JlYXRlU2FtcGxlcigiYmx1cl9zYW1wbGVyIiwhMCk7S28obyxsLGMsdSxlLE0sUyxiLHgsbSpiLGcqeCxzLmJ1ZmZlck1hbmFnZXIpO2NvbnN0IEY9aCpiLFQ9cCp4LEI9cy5jb21wdXRlUGlwZWxpbmVNYW5hZ2VyJiYoKGUsdCxyLG4pPT57Y29uc3QgaT1NYXRoLm1heChlLHQpLGE9TWF0aC5taW4ocixuKTtyZXR1cm4gaT49NCYmYT49MTI4fSkoaCxwLF8sdyksTz1bTSxQXTtsZXQgQT0wO2ZvcihsZXQgZT0wO2U8aTsrK2Upe2lmKHI+MCl7Y29uc3QgZT1BO0E9KEErMSklMixCP1dvKG8sbCxzLmNvbXB1dGVQaXBlbGluZU1hbmFnZXIsT1tlXSxPW0FdLCEwLEYscy5idWZmZXJNYW5hZ2VyKTpIbyhvLGwsYyx1LE9bZV0sT1tBXSxTLCEwLEYscy5idWZmZXJNYW5hZ2VyKX1pZihuPjApe2NvbnN0IGU9QTtBPShBKzEpJTIsQj9XbyhvLGwscy5jb21wdXRlUGlwZWxpbmVNYW5hZ2VyLE9bZV0sT1tBXSwhMSxULHMuYnVmZmVyTWFuYWdlcik6SG8obyxsLGMsdSxPW2VdLE9bQV0sUywhMSxULHMuYnVmZmVyTWFuYWdlcil9fWxldCBSPU9bQV07aWYoMSE9PWJ8fDEhPT14KXtjb25zdCBlPWMuY3JlYXRlVGVtcG9yYXJ5QXR0YWNobWVudCh2LHkpO1FvKG8sbCxjLHUsUixlLFMsMS9iLDEveCxzLmJ1ZmZlck1hbmFnZXIpLGMucmVsZWFzZVRlbXBvcmFyeUF0dGFjaG1lbnQoTSksYy5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChQKSxSPWV9ZWxzZXtjb25zdCBlPShBKzEpJTI7Yy5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChPW2VdKX1yZXR1cm4gUn0sS289KGUsdCxyLG4saSxhLHMsbyxsLGMsdSxmKT0+e2NvbnN0IGQ9bi5nZXRQaXBlbGluZSgidGV4dHVyZV9jb3B5X3JnYmE4IiksaD1uLmdldEJpbmRHcm91cExheW91dCgidGV4dHVyZV9jb3B5Iik7aWYoIWR8fCFoKXJldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoIltXZWJHUFUgQmx1ckZpbHRlcl0gdGV4dHVyZV9jb3B5X3JnYmE4IHBpcGVsaW5lIG5vdCBmb3VuZCIpO2NvbnN0IHA9aS53aWR0aCpvLG09aS5oZWlnaHQqbDtxb1swXT0xLHFvWzFdPTEscW9bMl09MCxxb1szXT0wO2NvbnN0IGc9Zj9mLmFjcXVpcmVBbmRXcml0ZVVuaWZvcm1CdWZmZXIocW8pOmUuY3JlYXRlQnVmZmVyKHtzaXplOnFvLmJ5dGVMZW5ndGgsdXNhZ2U6R1BVQnVmZmVyVXNhZ2UuVU5JRk9STXxHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVH0pO2Z8fGUucXVldWUud3JpdGVCdWZmZXIoZywwLHFvKSxYb1swXS5yZXNvdXJjZS5idWZmZXI9ZyxYb1sxXS5yZXNvdXJjZT1zLFhvWzJdLnJlc291cmNlPWkudGV4dHVyZS52aWV3O2NvbnN0IGI9ZS5jcmVhdGVCaW5kR3JvdXAoe2xheW91dDpoLGVudHJpZXM6WG99KSx4PXIuY3JlYXRlUmVuZGVyUGFzc0Rlc2NyaXB0b3IoYS50ZXh0dXJlLnZpZXcsMCwwLDAsMCwiY2xlYXIiKSx2PXQuYmVnaW5SZW5kZXJQYXNzKHgpO3Yuc2V0UGlwZWxpbmUoZCksdi5zZXRCaW5kR3JvdXAoMCxiKSx2LnNldFZpZXdwb3J0KGMsdSxwLG0sMCwxKSx2LnNldFNjaXNzb3JSZWN0KE1hdGguZmxvb3IoYyksTWF0aC5mbG9vcih1KSxNYXRoLmNlaWwocCksTWF0aC5jZWlsKG0pKSx2LmRyYXcoNiwxLDAsMCksdi5lbmQoKX0sSG89KGUsdCxyLG4saSxhLHMsbyxsLGMpPT57Y29uc3QgdT0oKGUsdCxyLG4pPT57Y29uc3QgaT1NYXRoLmNlaWwoLjUqdCk7cmV0dXJue29mZnNldFg6ZT8xL3I6MCxvZmZzZXRZOmU/MDoxL24sZnJhY3Rpb246MS0oaS0uNSp0KSxzYW1wbGVzOjErdCxoYWxmQmx1cjppfX0pKG8sbCxpLndpZHRoLGkuaGVpZ2h0KSx7b2Zmc2V0WDpmLG9mZnNldFk6ZCxmcmFjdGlvbjpoLHNhbXBsZXM6cCxoYWxmQmx1cjptfT11LGc9TWF0aC5tYXgoMSxNYXRoLm1pbigxNixtKSksYj1uLmdldFBpcGVsaW5lKGBibHVyX2ZpbHRlcl8ke2d9YCkseD1uLmdldEJpbmRHcm91cExheW91dCgiYmx1cl9maWx0ZXIiKTtpZighYnx8IXgpcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcihgW1dlYkdQVSBCbHVyRmlsdGVyXSBibHVyX2ZpbHRlcl8ke2d9IHBpcGVsaW5lIG5vdCBmb3VuZGApO3FvWzBdPWYscW9bMV09ZCxxb1syXT1oLHFvWzNdPXA7Y29uc3Qgdj1jP2MuYWNxdWlyZUFuZFdyaXRlVW5pZm9ybUJ1ZmZlcihxbyk6ZS5jcmVhdGVCdWZmZXIoe3NpemU6cW8uYnl0ZUxlbmd0aCx1c2FnZTpHUFVCdWZmZXJVc2FnZS5VTklGT1JNfEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNUfSk7Y3x8ZS5xdWV1ZS53cml0ZUJ1ZmZlcih2LDAscW8pLFhvWzBdLnJlc291cmNlLmJ1ZmZlcj12LFhvWzFdLnJlc291cmNlPXMsWG9bMl0ucmVzb3VyY2U9aS50ZXh0dXJlLnZpZXc7Y29uc3QgeT1lLmNyZWF0ZUJpbmRHcm91cCh7bGF5b3V0OngsZW50cmllczpYb30pLF89ci5jcmVhdGVSZW5kZXJQYXNzRGVzY3JpcHRvcihhLnRleHR1cmUudmlldywwLDAsMCwwLCJjbGVhciIpLHc9dC5iZWdpblJlbmRlclBhc3MoXyk7dy5zZXRQaXBlbGluZShiKSx3LnNldEJpbmRHcm91cCgwLHkpLHcuZHJhdyg2LDEsMCwwKSx3LmVuZCgpfSxRbz0oZSx0LHIsbixpLGEscyxvLGwsYyk9Pntjb25zdCB1PW4uZ2V0UGlwZWxpbmUoInRleHR1cmVfY29weV9yZ2JhOCIpLGY9bi5nZXRCaW5kR3JvdXBMYXlvdXQoInRleHR1cmVfY29weSIpO2lmKCF1fHwhZilyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJbV2ViR1BVIEJsdXJGaWx0ZXJdIHRleHR1cmVfY29weV9yZ2JhOCBwaXBlbGluZSBub3QgZm91bmQiKTtxb1swXT0xLHFvWzFdPTEscW9bMl09MCxxb1szXT0wO2NvbnN0IGQ9Yz9jLmFjcXVpcmVBbmRXcml0ZVVuaWZvcm1CdWZmZXIocW8pOmUuY3JlYXRlQnVmZmVyKHtzaXplOnFvLmJ5dGVMZW5ndGgsdXNhZ2U6R1BVQnVmZmVyVXNhZ2UuVU5JRk9STXxHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVH0pO2N8fGUucXVldWUud3JpdGVCdWZmZXIoZCwwLHFvKSxYb1swXS5yZXNvdXJjZS5idWZmZXI9ZCxYb1sxXS5yZXNvdXJjZT1zLFhvWzJdLnJlc291cmNlPWkudGV4dHVyZS52aWV3O2NvbnN0IGg9ZS5jcmVhdGVCaW5kR3JvdXAoe2xheW91dDpmLGVudHJpZXM6WG99KSxwPXIuY3JlYXRlUmVuZGVyUGFzc0Rlc2NyaXB0b3IoYS50ZXh0dXJlLnZpZXcsMCwwLDAsMCwiY2xlYXIiKSxtPXQuYmVnaW5SZW5kZXJQYXNzKHApO20uc2V0UGlwZWxpbmUodSksbS5zZXRCaW5kR3JvdXAoMCxoKSxtLmRyYXcoNiwxLDAsMCksbS5lbmQoKX0sWm89bmV3IEZsb2F0MzJBcnJheSgyMCksSm89W3tiaW5kaW5nOjAscmVzb3VyY2U6e2J1ZmZlcjpudWxsfX0se2JpbmRpbmc6MSxyZXNvdXJjZTpudWxsfSx7YmluZGluZzoyLHJlc291cmNlOm51bGx9XSxlbD0oZSx0LHIpPT57Y29uc3R7ZGV2aWNlOm4sY29tbWFuZEVuY29kZXI6aSxmcmFtZUJ1ZmZlck1hbmFnZXI6YSxwaXBlbGluZU1hbmFnZXI6cyx0ZXh0dXJlTWFuYWdlcjpvfT1yLGw9YS5jcmVhdGVUZW1wb3JhcnlBdHRhY2htZW50KGUud2lkdGgsZS5oZWlnaHQpLGM9cy5nZXRQaXBlbGluZSgiY29sb3JfbWF0cml4X2ZpbHRlciIpLHU9cy5nZXRCaW5kR3JvdXBMYXlvdXQoImNvbG9yX21hdHJpeF9maWx0ZXIiKTtpZighY3x8IXUpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIltXZWJHUFUgQ29sb3JNYXRyaXhGaWx0ZXJdIFBpcGVsaW5lIG5vdCBmb3VuZCIpLGU7Y29uc3QgZj1vLmNyZWF0ZVNhbXBsZXIoImNvbG9yX21hdHJpeF9zYW1wbGVyIiwhMCk7Wm9bMF09dFswXSxab1sxXT10WzVdLFpvWzJdPXRbMTBdLFpvWzNdPXRbMTVdLFpvWzRdPXRbMV0sWm9bNV09dFs2XSxab1s2XT10WzExXSxab1s3XT10WzE2XSxab1s4XT10WzJdLFpvWzldPXRbN10sWm9bMTBdPXRbMTJdLFpvWzExXT10WzE3XSxab1sxMl09dFszXSxab1sxM109dFs4XSxab1sxNF09dFsxM10sWm9bMTVdPXRbMThdLFpvWzE2XT10WzRdLzI1NSxab1sxN109dFs5XS8yNTUsWm9bMThdPXRbMTRdLzI1NSxab1sxOV09dFsxOV0vMjU1O2NvbnN0IGQ9ci5idWZmZXJNYW5hZ2VyP3IuYnVmZmVyTWFuYWdlci5hY3F1aXJlQW5kV3JpdGVVbmlmb3JtQnVmZmVyKFpvKTpuLmNyZWF0ZUJ1ZmZlcih7c2l6ZTpaby5ieXRlTGVuZ3RoLHVzYWdlOkdQVUJ1ZmZlclVzYWdlLlVOSUZPUk18R1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1R9KTtyLmJ1ZmZlck1hbmFnZXJ8fG4ucXVldWUud3JpdGVCdWZmZXIoZCwwLFpvKSxKb1swXS5yZXNvdXJjZS5idWZmZXI9ZCxKb1sxXS5yZXNvdXJjZT1mLEpvWzJdLnJlc291cmNlPWUudGV4dHVyZS52aWV3O2NvbnN0IGg9bi5jcmVhdGVCaW5kR3JvdXAoe2xheW91dDp1LGVudHJpZXM6Sm99KSxwPWEuY3JlYXRlUmVuZGVyUGFzc0Rlc2NyaXB0b3IobC50ZXh0dXJlLnZpZXcsMCwwLDAsMCwiY2xlYXIiKSxtPWkuYmVnaW5SZW5kZXJQYXNzKHApO3JldHVybiBtLnNldFBpcGVsaW5lKGMpLG0uc2V0QmluZEdyb3VwKDAsaCksbS5kcmF3KDYsMSwwLDApLG0uZW5kKCksbH0sdGw9bmV3IEZsb2F0MzJBcnJheSgxNikscmw9W3tiaW5kaW5nOjAscmVzb3VyY2U6e2J1ZmZlcjpudWxsfX0se2JpbmRpbmc6MSxyZXNvdXJjZTpudWxsfSx7YmluZGluZzoyLHJlc291cmNlOm51bGx9LHtiaW5kaW5nOjMscmVzb3VyY2U6bnVsbH1dLG5sPShlLHQscixuLGksYSxzLG8sbCxjLHUsZik9Pntjb25zdHtkZXZpY2U6ZCxjb21tYW5kRW5jb2RlcjpoLGZyYW1lQnVmZmVyTWFuYWdlcjpwLHBpcGVsaW5lTWFuYWdlcjptLHRleHR1cmVNYW5hZ2VyOmd9PWYsYj1Jby54LHg9SW8ueSx2PWUud2lkdGgseT1lLmhlaWdodCxfPVlvKGUsdCxpLGEsbyx1LGYpLHc9Xy53aWR0aCxNPV8uaGVpZ2h0LFA9bD92OncsUz1sP3k6TSxGPUlvLngtYixUPUlvLnkteCxCPVAvdixPPVMveSxBPShsPzA6RikvdixSPShsPzA6VCkveSxDPVAvdyxFPVMvTSxVPShsPy1GOjApL3csJD0obD8tVDowKS9NLEc9cC5jcmVhdGVUZW1wb3JhcnlBdHRhY2htZW50KFAsUyksaz1tLmdldEZpbHRlclBpcGVsaW5lKCJnbG93X2ZpbHRlciIse0lTX0lOTkVSOmw/MTowLElTX0tOT0NLT1VUOmM/MTowfSksTD1tLmdldEJpbmRHcm91cExheW91dCgiZ2xvd19maWx0ZXIiKTtpZigha3x8IUwpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIltXZWJHUFUgR2xvd0ZpbHRlcl0gUGlwZWxpbmUgbm90IGZvdW5kIikscC5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChfKSxlO2NvbnN0IEk9Zy5jcmVhdGVTYW1wbGVyKCJnbG93X3NhbXBsZXIiLCEwKSxbVix6LGosRF09KChlLHQpPT5bKGU+PjE2JjI1NSkvMjU1KnQsKGU+PjgmMjU1KS8yNTUqdCwoMjU1JmUpLzI1NSp0LHRdKShyLG4pO3RsWzBdPVYsdGxbMV09eix0bFsyXT1qLHRsWzNdPUQsdGxbNF09Qix0bFs1XT1PLHRsWzZdPUEsdGxbN109Uix0bFs4XT1DLHRsWzldPUUsdGxbMTBdPVUsdGxbMTFdPSQsdGxbMTJdPXMsdGxbMTNdPWw/MTowLHRsWzE0XT1jPzE6MCx0bFsxNV09MDtjb25zdCBOPWYuYnVmZmVyTWFuYWdlcj9mLmJ1ZmZlck1hbmFnZXIuYWNxdWlyZUFuZFdyaXRlVW5pZm9ybUJ1ZmZlcih0bCk6ZC5jcmVhdGVCdWZmZXIoe3NpemU6dGwuYnl0ZUxlbmd0aCx1c2FnZTpHUFVCdWZmZXJVc2FnZS5VTklGT1JNfEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNUfSk7Zi5idWZmZXJNYW5hZ2VyfHxkLnF1ZXVlLndyaXRlQnVmZmVyKE4sMCx0bCkscmxbMF0ucmVzb3VyY2UuYnVmZmVyPU4scmxbMV0ucmVzb3VyY2U9SSxybFsyXS5yZXNvdXJjZT1fLnRleHR1cmUudmlldyxybFszXS5yZXNvdXJjZT1lLnRleHR1cmUudmlldztjb25zdCBXPWQuY3JlYXRlQmluZEdyb3VwKHtsYXlvdXQ6TCxlbnRyaWVzOnJsfSkscT1wLmNyZWF0ZVJlbmRlclBhc3NEZXNjcmlwdG9yKEcudGV4dHVyZS52aWV3LDAsMCwwLDAsImNsZWFyIiksWD1oLmJlZ2luUmVuZGVyUGFzcyhxKTtyZXR1cm4gWC5zZXRQaXBlbGluZShrKSxYLnNldEJpbmRHcm91cCgwLFcpLFguZHJhdyg2LDEsMCwwKSxYLmVuZCgpLHAucmVsZWFzZVRlbXBvcmFyeUF0dGFjaG1lbnQoXyksR30saWw9TWF0aC5QSS8xODAsYWw9bmV3IEZsb2F0MzJBcnJheSgxNiksc2w9W3tiaW5kaW5nOjAscmVzb3VyY2U6e2J1ZmZlcjpudWxsfX0se2JpbmRpbmc6MSxyZXNvdXJjZTpudWxsfSx7YmluZGluZzoyLHJlc291cmNlOm51bGx9LHtiaW5kaW5nOjMscmVzb3VyY2U6bnVsbH1dLG9sPShlLHQscixuLGksYSxzLG8sbCxjLHUsZixkLGgscCk9Pntjb25zdHtkZXZpY2U6bSxjb21tYW5kRW5jb2RlcjpnLGZyYW1lQnVmZmVyTWFuYWdlcjpiLHBpcGVsaW5lTWFuYWdlcjp4LHRleHR1cmVNYW5hZ2VyOnZ9PXAseT1Jby54LF89SW8ueSx3PWUud2lkdGgsTT1lLmhlaWdodCxQPVlvKGUsdCxzLG8sYyxoLHApLFM9UC53aWR0aCxGPVAuaGVpZ2h0LFQ9SW8ueCxCPUlvLnksTz1ULXksQT1CLV8sUj1NYXRoLnNxcnQodFswXSp0WzBdK3RbMV0qdFsxXSksQz1NYXRoLnNxcnQodFsyXSp0WzJdK3RbM10qdFszXSksRT1uKmlsLFU9TWF0aC5jb3MoRSkqciooUi9oKSwkPU1hdGguc2luKEUpKnIqKEMvaCksRz11P3c6UytNYXRoLm1heCgwLE1hdGguYWJzKFUpLU8pLGs9dT9NOkYrTWF0aC5tYXgoMCxNYXRoLmFicygkKS1BKSxMPU1hdGguY2VpbChHKSxJPU1hdGguY2VpbChrKSxWPShMLUcpLzIsej0oSS1rKS8yLGo9dT8wOk1hdGgubWF4KDAsTy1VKStWLEQ9dT8wOk1hdGgubWF4KDAsQS0kKSt6LE49dT9VLVQ6KFU+MD9NYXRoLm1heCgwLFUtTyk6MCkrVixXPXU/JC1COigkPjA/TWF0aC5tYXgoMCwkLUEpOjApK3oscT1iLmNyZWF0ZVRlbXBvcmFyeUF0dGFjaG1lbnQoTCxJKSxYPXU7bGV0IFk9ZixLPWQ7dT9ZPWZ8fGQ6IWYmJmQmJihZPSEwLEs9ITApO2NvbnN0IEg9eC5nZXRGaWx0ZXJQaXBlbGluZSgiZHJvcF9zaGFkb3dfZmlsdGVyIix7SVNfSU5ORVI6WD8xOjAsSVNfS05PQ0tPVVQ6WT8xOjAsSVNfSElERV9PQkpFQ1Q6Sz8xOjB9KSxRPXguZ2V0QmluZEdyb3VwTGF5b3V0KCJkcm9wX3NoYWRvd19maWx0ZXIiKTtpZighSHx8IVEpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIltXZWJHUFUgRHJvcFNoYWRvd0ZpbHRlcl0gUGlwZWxpbmUgbm90IGZvdW5kIiksYi5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChQKSxlO2NvbnN0IFo9di5jcmVhdGVTYW1wbGVyKCJkcm9wX3NoYWRvd19zYW1wbGVyIiwhMCksW0osZWUsdGUscmVdPSgoZSx0KT0+WyhlPj4xNiYyNTUpLzI1NSp0LChlPj44JjI1NSkvMjU1KnQsKDI1NSZlKS8yNTUqdCx0XSkoaSxhKSxuZT1ML3csaWU9SS9NLGFlPWovdyxzZT1EL00sb2U9TC9TLGxlPUkvRixjZT1OL1MsdWU9Vy9GO2FsWzBdPUosYWxbMV09ZWUsYWxbMl09dGUsYWxbM109cmUsYWxbNF09bmUsYWxbNV09aWUsYWxbNl09YWUsYWxbN109c2UsYWxbOF09b2UsYWxbOV09bGUsYWxbMTBdPWNlLGFsWzExXT11ZSxhbFsxMl09bCxhbFsxM109WD8xOjAsYWxbMTRdPVk/MTowLGFsWzE1XT1LPzE6MDtjb25zdCBmZT1wLmJ1ZmZlck1hbmFnZXI/cC5idWZmZXJNYW5hZ2VyLmFjcXVpcmVBbmRXcml0ZVVuaWZvcm1CdWZmZXIoYWwpOm0uY3JlYXRlQnVmZmVyKHtzaXplOmFsLmJ5dGVMZW5ndGgsdXNhZ2U6R1BVQnVmZmVyVXNhZ2UuVU5JRk9STXxHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVH0pO3AuYnVmZmVyTWFuYWdlcnx8bS5xdWV1ZS53cml0ZUJ1ZmZlcihmZSwwLGFsKSxzbFswXS5yZXNvdXJjZS5idWZmZXI9ZmUsc2xbMV0ucmVzb3VyY2U9WixzbFsyXS5yZXNvdXJjZT1QLnRleHR1cmUudmlldyxzbFszXS5yZXNvdXJjZT1lLnRleHR1cmUudmlldztjb25zdCBkZT1tLmNyZWF0ZUJpbmRHcm91cCh7bGF5b3V0OlEsZW50cmllczpzbH0pLGhlPWIuY3JlYXRlUmVuZGVyUGFzc0Rlc2NyaXB0b3IocS50ZXh0dXJlLnZpZXcsMCwwLDAsMCwiY2xlYXIiKSxwZT1nLmJlZ2luUmVuZGVyUGFzcyhoZSk7cmV0dXJuIHBlLnNldFBpcGVsaW5lKEgpLHBlLnNldEJpbmRHcm91cCgwLGRlKSxwZS5kcmF3KDYsMSwwLDApLHBlLmVuZCgpLGIucmVsZWFzZVRlbXBvcmFyeUF0dGFjaG1lbnQoUCkscX0sbGw9TWF0aC5QSS8xODAsY2w9bmV3IEZsb2F0MzJBcnJheSg4KSx1bD1uZXcgRmxvYXQzMkFycmF5KDIwKSxmbD1be2JpbmRpbmc6MCxyZXNvdXJjZTp7YnVmZmVyOm51bGx9fSx7YmluZGluZzoxLHJlc291cmNlOm51bGx9LHtiaW5kaW5nOjIscmVzb3VyY2U6bnVsbH1dLGRsPVt7YmluZGluZzowLHJlc291cmNlOntidWZmZXI6bnVsbH19LHtiaW5kaW5nOjEscmVzb3VyY2U6bnVsbH0se2JpbmRpbmc6MixyZXNvdXJjZTpudWxsfSx7YmluZGluZzozLHJlc291cmNlOm51bGx9XSxobD0oZSx0KT0+WyhlPj4xNiYyNTUpLzI1NSp0LChlPj44JjI1NSkvMjU1KnQsKDI1NSZlKS8yNTUqdCx0XSxwbD0oZSx0LHIsbixpLGEscyxvLGwsYyx1LGYsZCxoLHAsbSk9Pntjb25zdHtkZXZpY2U6Zyxjb21tYW5kRW5jb2RlcjpiLGZyYW1lQnVmZmVyTWFuYWdlcjp4LHBpcGVsaW5lTWFuYWdlcjp2LHRleHR1cmVNYW5hZ2VyOnl9PW0sXz1Jby54LHc9SW8ueSxNPWUud2lkdGgsUD1lLmhlaWdodCxTPU1hdGguc3FydCh0WzBdKnRbMF0rdFsxXSp0WzFdKSxGPU1hdGguc3FydCh0WzJdKnRbMl0rdFszXSp0WzNdKSxUPW4qbGwsQj1NYXRoLmNvcyhUKSpyKihTL3ApLE89TWF0aC5zaW4oVCkqciooRi9wKSxBPXguY3JlYXRlVGVtcG9yYXJ5QXR0YWNobWVudChNLFApO2IuY29weVRleHR1cmVUb1RleHR1cmUoe3RleHR1cmU6ZS50ZXh0dXJlLnJlc291cmNlLG9yaWdpbjp7eDowLHk6MCx6OjB9fSx7dGV4dHVyZTpBLnRleHR1cmUucmVzb3VyY2Usb3JpZ2luOnt4OjAseTowLHo6MH19LHt3aWR0aDpNLGhlaWdodDpQfSk7Y29uc3QgUj12LmdldFBpcGVsaW5lKCJ0ZXh0dXJlX2VyYXNlIiksQz12LmdldEJpbmRHcm91cExheW91dCgidGV4dHVyZV9jb3B5Iik7aWYoUiYmQyl7Y29uc3QgdD15LmNyZWF0ZVNhbXBsZXIoImVyYXNlX3NhbXBsZXIiLCEwKSxyPTIqQi9NLG49MipPL1A7Y2xbMF09MSxjbFsxXT0xLGNsWzJdPXIsY2xbM109bixjbFs0XT0wLGNsWzVdPTAsY2xbNl09MCxjbFs3XT0wO2NvbnN0IGk9bS5idWZmZXJNYW5hZ2VyP20uYnVmZmVyTWFuYWdlci5hY3F1aXJlQW5kV3JpdGVVbmlmb3JtQnVmZmVyKGNsKTpnLmNyZWF0ZUJ1ZmZlcih7c2l6ZTpjbC5ieXRlTGVuZ3RoLHVzYWdlOkdQVUJ1ZmZlclVzYWdlLlVOSUZPUk18R1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1R9KTttLmJ1ZmZlck1hbmFnZXJ8fGcucXVldWUud3JpdGVCdWZmZXIoaSwwLGNsKSxmbFswXS5yZXNvdXJjZS5idWZmZXI9aSxmbFsxXS5yZXNvdXJjZT10LGZsWzJdLnJlc291cmNlPWUudGV4dHVyZS52aWV3O2NvbnN0IGE9Zy5jcmVhdGVCaW5kR3JvdXAoe2xheW91dDpDLGVudHJpZXM6Zmx9KSxzPXguY3JlYXRlUmVuZGVyUGFzc0Rlc2NyaXB0b3IoQS50ZXh0dXJlLnZpZXcsMCwwLDAsMCwibG9hZCIpLG89Yi5iZWdpblJlbmRlclBhc3Mocyk7by5zZXRQaXBlbGluZShSKSxvLnNldEJpbmRHcm91cCgwLGEpLG8uZHJhdyg2LDEsMCwwKSxvLmVuZCgpfWNvbnN0IEU9WW8oQSx0LGwsYyxmLHAsbSk7eC5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChBKTtjb25zdCBVPUUud2lkdGgsJD1FLmhlaWdodCxHPU1hdGguYWJzKEIpLGs9TWF0aC5hYnMoTyksTD0xPT09ZCxJPU1hdGguY2VpbChVKzIqRyksVj1NYXRoLmNlaWwoJCsyKmspLHo9TD9NOkksaj1MP1A6VixEPShVLU0pLzIsTj0oJC1QKS8yLFc9TD8wOk1hdGguZmxvb3IoRytEKSxxPUw/MDpNYXRoLmZsb29yKGsrTiksWD16L00sWT1qL1AsSz1XL00sSD1xL1AsUT16L1UsWj1qLyQsSj0oTD9NYXRoLmZsb29yKC1ELUIpOk1hdGguZmxvb3IoRy1CKSkvVSxlZT0oTD9NYXRoLmZsb29yKC1OLU8pOk1hdGguZmxvb3Ioay1PKSkvJCx0ZT14LmNyZWF0ZVRlbXBvcmFyeUF0dGFjaG1lbnQoeixqKSxyZT12LmdldEZpbHRlclBpcGVsaW5lKCJiZXZlbF9maWx0ZXIiLHtCRVZFTF9UWVBFOmQsSVNfS05PQ0tPVVQ6aD8xOjB9KSxuZT12LmdldEJpbmRHcm91cExheW91dCgiYmV2ZWxfZmlsdGVyIik7aWYoIXJlfHwhbmUpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIltXZWJHUFUgQmV2ZWxGaWx0ZXJdIFBpcGVsaW5lIG5vdCBmb3VuZCIpLHgucmVsZWFzZVRlbXBvcmFyeUF0dGFjaG1lbnQoRSksZTtjb25zdCBpZT15LmNyZWF0ZVNhbXBsZXIoImJldmVsX3NhbXBsZXIiLCEwKSxbYWUsc2Usb2UsbGVdPWhsKGksYSksW2NlLHVlLGZlLGRlXT1obChzLG8pO3VsWzBdPWFlLHVsWzFdPXNlLHVsWzJdPW9lLHVsWzNdPWxlLHVsWzRdPWNlLHVsWzVdPXVlLHVsWzZdPWZlLHVsWzddPWRlLHVsWzhdPXUsdWxbOV09TD8xOjAsdWxbMTBdPWg/MTowLHVsWzExXT1kLHVsWzEyXT1YLHVsWzEzXT1ZLHVsWzE0XT1LLHVsWzE1XT1ILHVsWzE2XT1RLHVsWzE3XT1aLHVsWzE4XT1KLHVsWzE5XT1lZTtjb25zdCBoZT1tLmJ1ZmZlck1hbmFnZXI/bS5idWZmZXJNYW5hZ2VyLmFjcXVpcmVBbmRXcml0ZVVuaWZvcm1CdWZmZXIodWwpOmcuY3JlYXRlQnVmZmVyKHtzaXplOnVsLmJ5dGVMZW5ndGgsdXNhZ2U6R1BVQnVmZmVyVXNhZ2UuVU5JRk9STXxHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVH0pO20uYnVmZmVyTWFuYWdlcnx8Zy5xdWV1ZS53cml0ZUJ1ZmZlcihoZSwwLHVsKSxkbFswXS5yZXNvdXJjZS5idWZmZXI9aGUsZGxbMV0ucmVzb3VyY2U9aWUsZGxbMl0ucmVzb3VyY2U9RS50ZXh0dXJlLnZpZXcsZGxbM10ucmVzb3VyY2U9ZS50ZXh0dXJlLnZpZXc7Y29uc3QgcGU9Zy5jcmVhdGVCaW5kR3JvdXAoe2xheW91dDpuZSxlbnRyaWVzOmRsfSksbWU9eC5jcmVhdGVSZW5kZXJQYXNzRGVzY3JpcHRvcih0ZS50ZXh0dXJlLnZpZXcsMCwwLDAsMCwiY2xlYXIiKSxnZT1iLmJlZ2luUmVuZGVyUGFzcyhtZSk7cmV0dXJuIGdlLnNldFBpcGVsaW5lKHJlKSxnZS5zZXRCaW5kR3JvdXAoMCxwZSksZ2UuZHJhdyg2LDEsMCwwKSxnZS5lbmQoKSx4LnJlbGVhc2VUZW1wb3JhcnlBdHRhY2htZW50KEUpLElvLng9XytXLElvLnk9dytxLHRlfSxtbD1be2JpbmRpbmc6MCxyZXNvdXJjZTp7YnVmZmVyOm51bGx9fSx7YmluZGluZzoxLHJlc291cmNlOm51bGx9LHtiaW5kaW5nOjIscmVzb3VyY2U6bnVsbH1dLGdsPW5ldyBNYXAsYmw9KGUsdCxyLG4saSxhLHMsbyxsLGMsdSk9Pntjb25zdHtkZXZpY2U6Zixjb21tYW5kRW5jb2RlcjpkLGZyYW1lQnVmZmVyTWFuYWdlcjpoLHRleHR1cmVNYW5hZ2VyOnB9PXUsbT1lLndpZHRoLGc9ZS5oZWlnaHQsYj1oLmNyZWF0ZVRlbXBvcmFyeUF0dGFjaG1lbnQobSxnKSx4PWAke3R9LCR7cn0sJHtzfSwke299YDtsZXQgdj1nbC5nZXQoeCk7aWYoIXYpe2NvbnN0IGU9ZmEuZ2V0Q29udm9sdXRpb25GaWx0ZXJGcmFnbWVudFNoYWRlcih0LHIscyxvKSxuPWYuY3JlYXRlU2hhZGVyTW9kdWxlKHtjb2RlOmV9KSxpPWYuY3JlYXRlQmluZEdyb3VwTGF5b3V0KHtlbnRyaWVzOlt7YmluZGluZzowLHZpc2liaWxpdHk6R1BVU2hhZGVyU3RhZ2UuRlJBR01FTlQsYnVmZmVyOnt0eXBlOiJ1bmlmb3JtIn19LHtiaW5kaW5nOjEsdmlzaWJpbGl0eTpHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCxzYW1wbGVyOnt9fSx7YmluZGluZzoyLHZpc2liaWxpdHk6R1BVU2hhZGVyU3RhZ2UuRlJBR01FTlQsdGV4dHVyZTp7fX1dfSksYT1mLmNyZWF0ZVBpcGVsaW5lTGF5b3V0KHtiaW5kR3JvdXBMYXlvdXRzOltpXX0pO3Y9e3BpcGVsaW5lOmYuY3JlYXRlUmVuZGVyUGlwZWxpbmUoe2xheW91dDphLHZlcnRleDp7bW9kdWxlOm4sZW50cnlQb2ludDoidnNfbWFpbiIsYnVmZmVyczpbXX0sZnJhZ21lbnQ6e21vZHVsZTpuLGVudHJ5UG9pbnQ6ImZzX21haW4iLHRhcmdldHM6W3tmb3JtYXQ6InJnYmE4dW5vcm0iLGJsZW5kOntjb2xvcjp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3Rvcjoib25lLW1pbnVzLXNyYy1hbHBoYSIsb3BlcmF0aW9uOiJhZGQifSxhbHBoYTp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3Rvcjoib25lLW1pbnVzLXNyYy1hbHBoYSIsb3BlcmF0aW9uOiJhZGQifX19XX0scHJpbWl0aXZlOnt0b3BvbG9neToidHJpYW5nbGUtbGlzdCIsY3VsbE1vZGU6Im5vbmUifX0pLGJpbmRHcm91cExheW91dDppfSxnbC5zZXQoeCx2KX1jb25zdCB5PXAuY3JlYXRlU2FtcGxlcigiY29udm9sdXRpb25fc2FtcGxlciIsITApLF89dCpyLHc9TWF0aC5jZWlsKF8vNCksW00sUCxTLEZdPSgoZSx0KT0+WyhlPj4xNiYyNTUpLzI1NSwoZT4+OCYyNTUpLzI1NSwoMjU1JmUpLzI1NSx0XSkobCxjKSxUPW5ldyBGbG9hdDMyQXJyYXkoNCp3KTtmb3IobGV0IGU9MDtlPF87ZSsrKVRbZV09bltlXTtjb25zdCBCPW5ldyBGbG9hdDMyQXJyYXkoKDMyKzE2KncpLzQpO0JbMF09MS9tLEJbMV09MS9nLEJbMl09MCE9PWk/MS9pOjEsQlszXT1hLzI1NSxCWzRdPU0sQls1XT1QLEJbNl09UyxCWzddPUY7Zm9yKGxldCBlPTA7ZTxULmxlbmd0aDtlKyspQls4K2VdPVRbZV07Y29uc3QgTz11LmJ1ZmZlck1hbmFnZXI/dS5idWZmZXJNYW5hZ2VyLmFjcXVpcmVBbmRXcml0ZVVuaWZvcm1CdWZmZXIoQik6Zi5jcmVhdGVCdWZmZXIoe3NpemU6Qi5ieXRlTGVuZ3RoLHVzYWdlOkdQVUJ1ZmZlclVzYWdlLlVOSUZPUk18R1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1R9KTt1LmJ1ZmZlck1hbmFnZXJ8fGYucXVldWUud3JpdGVCdWZmZXIoTywwLEIpLG1sWzBdLnJlc291cmNlLmJ1ZmZlcj1PLG1sWzFdLnJlc291cmNlPXksbWxbMl0ucmVzb3VyY2U9ZS50ZXh0dXJlLnZpZXc7Y29uc3QgQT1mLmNyZWF0ZUJpbmRHcm91cCh7bGF5b3V0OnYuYmluZEdyb3VwTGF5b3V0LGVudHJpZXM6bWx9KSxSPWguY3JlYXRlUmVuZGVyUGFzc0Rlc2NyaXB0b3IoYi50ZXh0dXJlLnZpZXcsMCwwLDAsMCwiY2xlYXIiKSxDPWQuYmVnaW5SZW5kZXJQYXNzKFIpO3JldHVybiBDLnNldFBpcGVsaW5lKHYucGlwZWxpbmUpLEMuc2V0QmluZEdyb3VwKDAsQSksQy5kcmF3KDYsMSwwLDApLEMuZW5kKCksYn0seGw9TWF0aC5QSS8xODAsdmw9bmV3IEZsb2F0MzJBcnJheSg0KSx5bD1uZXcgRmxvYXQzMkFycmF5KDEyKSxfbD1be2JpbmRpbmc6MCxyZXNvdXJjZTp7YnVmZmVyOm51bGx9fSx7YmluZGluZzoxLHJlc291cmNlOm51bGx9LHtiaW5kaW5nOjIscmVzb3VyY2U6bnVsbH1dLHdsPVt7YmluZGluZzowLHJlc291cmNlOntidWZmZXI6bnVsbH19LHtiaW5kaW5nOjEscmVzb3VyY2U6bnVsbH0se2JpbmRpbmc6MixyZXNvdXJjZTpudWxsfSx7YmluZGluZzozLHJlc291cmNlOm51bGx9LHtiaW5kaW5nOjQscmVzb3VyY2U6bnVsbH1dLE1sPShlLHQscixuLGksYSxzLG8sbCxjLHUsZixkLGgscCk9Pntjb25zdHtkZXZpY2U6bSxjb21tYW5kRW5jb2RlcjpnLGZyYW1lQnVmZmVyTWFuYWdlcjpiLHBpcGVsaW5lTWFuYWdlcjp4LHRleHR1cmVNYW5hZ2VyOnZ9PXAseT1Jby54LF89SW8ueSx3PWUud2lkdGgsTT1lLmhlaWdodCxQPU1hdGguc3FydCh0WzBdKnRbMF0rdFsxXSp0WzFdKSxTPU1hdGguc3FydCh0WzJdKnRbMl0rdFszXSp0WzNdKSxGPW4qeGwsVD1NYXRoLmNvcyhGKSpyKihQL2gpLEI9TWF0aC5zaW4oRikqciooUy9oKSxPPXguZ2V0UGlwZWxpbmUoImJldmVsX2Jhc2UiKSxBPXguZ2V0QmluZEdyb3VwTGF5b3V0KCJiZXZlbF9iYXNlIik7aWYoIU98fCFBKXJldHVybiBjb25zb2xlLmVycm9yKCJbV2ViR1BVIEdyYWRpZW50QmV2ZWxGaWx0ZXJdIGJldmVsX2Jhc2UgcGlwZWxpbmUgbm90IGZvdW5kIiksZTtjb25zdCBSPWIuY3JlYXRlVGVtcG9yYXJ5QXR0YWNobWVudCh3LE0pLEM9di5jcmVhdGVTYW1wbGVyKCJiZXZlbF9iYXNlX3NhbXBsZXIiLCEwKTt2bFswXT0yKlQvdyx2bFsxXT0yKkIvTSx2bFsyXT0wLHZsWzNdPTA7Y29uc3QgRT1wLmJ1ZmZlck1hbmFnZXI/cC5idWZmZXJNYW5hZ2VyLmFjcXVpcmVBbmRXcml0ZVVuaWZvcm1CdWZmZXIodmwpOm0uY3JlYXRlQnVmZmVyKHtzaXplOnZsLmJ5dGVMZW5ndGgsdXNhZ2U6R1BVQnVmZmVyVXNhZ2UuVU5JRk9STXxHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVH0pO3AuYnVmZmVyTWFuYWdlcnx8bS5xdWV1ZS53cml0ZUJ1ZmZlcihFLDAsdmwpLF9sWzBdLnJlc291cmNlLmJ1ZmZlcj1FLF9sWzFdLnJlc291cmNlPUMsX2xbMl0ucmVzb3VyY2U9ZS50ZXh0dXJlLnZpZXc7Y29uc3QgVT1tLmNyZWF0ZUJpbmRHcm91cCh7bGF5b3V0OkEsZW50cmllczpfbH0pLCQ9Yi5jcmVhdGVSZW5kZXJQYXNzRGVzY3JpcHRvcihSLnRleHR1cmUudmlldywwLDAsMCwwLCJjbGVhciIpLEc9Zy5iZWdpblJlbmRlclBhc3MoJCk7Ry5zZXRQaXBlbGluZShPKSxHLnNldEJpbmRHcm91cCgwLFUpLEcuZHJhdyg2LDEsMCwwKSxHLmVuZCgpO2NvbnN0IGs9WW8oUix0LG8sbCx1LGgscCk7Yi5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChSKTtjb25zdCBMPWsud2lkdGgsST1rLmhlaWdodCxWPTE9PT1mLHo9TWF0aC5hYnMoVCksaj1NYXRoLmFicyhCKSxEPShMLXcpLzIsTj0oSS1NKS8yLFc9TWF0aC5jZWlsKEwrMip6KSxxPU1hdGguY2VpbChJKzIqaiksWD1WP3c6VyxZPVY/TTpxLEs9Vj8wOnorRCxIPVY/MDpqK04sUT1WPy1ELVQ6ei1ULFo9Vj8tTi1COmotQixKPXFzKHMsaSxhKSxlZT1tLmNyZWF0ZVRleHR1cmUoe3NpemU6e3dpZHRoOjI1NixoZWlnaHQ6MX0sZm9ybWF0OiJyZ2JhOHVub3JtIix1c2FnZTpHUFVUZXh0dXJlVXNhZ2UuVEVYVFVSRV9CSU5ESU5HfEdQVVRleHR1cmVVc2FnZS5DT1BZX0RTVH0pO20ucXVldWUud3JpdGVUZXh0dXJlKHt0ZXh0dXJlOmVlfSxKLmJ1ZmZlcix7Ynl0ZXNQZXJSb3c6MTAyNCxvZmZzZXQ6Si5ieXRlT2Zmc2V0fSx7d2lkdGg6MjU2LGhlaWdodDoxfSk7Y29uc3QgdGU9ZWUuY3JlYXRlVmlldygpLHJlPVgvdyxuZT1ZL00saWU9Sy93LGFlPUgvTSxzZT1YL0wsb2U9WS9JLGxlPVEvTCxjZT1aL0ksdWU9Yi5jcmVhdGVUZW1wb3JhcnlBdHRhY2htZW50KFgsWSksZmU9eC5nZXRGaWx0ZXJQaXBlbGluZSgiZ3JhZGllbnRfYmV2ZWxfZmlsdGVyIix7QkVWRUxfVFlQRTpmLElTX0tOT0NLT1VUOmQ/MTowfSksZGU9eC5nZXRCaW5kR3JvdXBMYXlvdXQoImdyYWRpZW50X2JldmVsX2ZpbHRlciIpO2lmKCFmZXx8IWRlKXJldHVybiBjb25zb2xlLmVycm9yKCJbV2ViR1BVIEdyYWRpZW50QmV2ZWxGaWx0ZXJdIFBpcGVsaW5lIG5vdCBmb3VuZCIpLGIucmVsZWFzZVRlbXBvcmFyeUF0dGFjaG1lbnQoayksZTtjb25zdCBoZT12LmNyZWF0ZVNhbXBsZXIoImdyYWRpZW50X2JldmVsX3NhbXBsZXIiLCEwKTt5bFswXT1jLHlsWzFdPVY/MTowLHlsWzJdPWQ/MTowLHlsWzNdPWYseWxbNF09cmUseWxbNV09bmUseWxbNl09aWUseWxbN109YWUseWxbOF09c2UseWxbOV09b2UseWxbMTBdPWxlLHlsWzExXT1jZTtjb25zdCBwZT1wLmJ1ZmZlck1hbmFnZXI/cC5idWZmZXJNYW5hZ2VyLmFjcXVpcmVBbmRXcml0ZVVuaWZvcm1CdWZmZXIoeWwpOm0uY3JlYXRlQnVmZmVyKHtzaXplOnlsLmJ5dGVMZW5ndGgsdXNhZ2U6R1BVQnVmZmVyVXNhZ2UuVU5JRk9STXxHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVH0pO3AuYnVmZmVyTWFuYWdlcnx8bS5xdWV1ZS53cml0ZUJ1ZmZlcihwZSwwLHlsKSx3bFswXS5yZXNvdXJjZS5idWZmZXI9cGUsd2xbMV0ucmVzb3VyY2U9aGUsd2xbMl0ucmVzb3VyY2U9ay50ZXh0dXJlLnZpZXcsd2xbM10ucmVzb3VyY2U9ZS50ZXh0dXJlLnZpZXcsd2xbNF0ucmVzb3VyY2U9dGU7Y29uc3QgbWU9bS5jcmVhdGVCaW5kR3JvdXAoe2xheW91dDpkZSxlbnRyaWVzOndsfSksZ2U9Yi5jcmVhdGVSZW5kZXJQYXNzRGVzY3JpcHRvcih1ZS50ZXh0dXJlLnZpZXcsMCwwLDAsMCwiY2xlYXIiKSxiZT1nLmJlZ2luUmVuZGVyUGFzcyhnZSk7cmV0dXJuIGJlLnNldFBpcGVsaW5lKGZlKSxiZS5zZXRCaW5kR3JvdXAoMCxtZSksYmUuZHJhdyg2LDEsMCwwKSxiZS5lbmQoKSxwLmZyYW1lVGV4dHVyZXMucHVzaChlZSksYi5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChrKSxJby54PXkrSyxJby55PV8rSCx1ZX0sUGw9TWF0aC5QSS8xODAsU2w9bmV3IEZsb2F0MzJBcnJheSgxMiksRmw9W3tiaW5kaW5nOjAscmVzb3VyY2U6e2J1ZmZlcjpudWxsfX0se2JpbmRpbmc6MSxyZXNvdXJjZTpudWxsfSx7YmluZGluZzoyLHJlc291cmNlOm51bGx9LHtiaW5kaW5nOjMscmVzb3VyY2U6bnVsbH0se2JpbmRpbmc6NCxyZXNvdXJjZTpudWxsfV0sVGw9KGUsdCxyLG4saSxhLHMsbyxsLGMsdSxmLGQsaCxwKT0+e2NvbnN0e2RldmljZTptLGNvbW1hbmRFbmNvZGVyOmcsZnJhbWVCdWZmZXJNYW5hZ2VyOmIscGlwZWxpbmVNYW5hZ2VyOngsdGV4dHVyZU1hbmFnZXI6dn09cCx5PUlvLngsXz1Jby55LHc9ZS53aWR0aCxNPWUuaGVpZ2h0LFA9WW8oZSx0LG8sbCx1LGgscCksUz1QLndpZHRoLEY9UC5oZWlnaHQsVD1Jby54LEI9SW8ueSxPPVQteSxBPUItXyxSPU1hdGguc3FydCh0WzBdKnRbMF0rdFsxXSp0WzFdKSxDPU1hdGguc3FydCh0WzJdKnRbMl0rdFszXSp0WzNdKSxFPW4qUGwsVT1NYXRoLmNvcyhFKSpyKihSL2gpLCQ9TWF0aC5zaW4oRSkqciooQy9oKSxHPTE9PT1mLGs9Rz93OlMrTWF0aC5tYXgoMCxNYXRoLmFicyhVKS1PKSxMPUc/TTpGK01hdGgubWF4KDAsTWF0aC5hYnMoJCktQSksST1NYXRoLmNlaWwoayksVj1NYXRoLmNlaWwoTCksej0oSS1rKS8yLGo9KFYtTCkvMixEPUc/MDpNYXRoLm1heCgwLE8tVSkreixOPUc/MDpNYXRoLm1heCgwLEEtJCkraixXPUc/VS1UOihVPjA/TWF0aC5tYXgoMCxVLU8pOjApK3oscT1HPyQtQjooJD4wP01hdGgubWF4KDAsJC1BKTowKStqLFg9cXMocyxpLGEpLFk9bS5jcmVhdGVUZXh0dXJlKHtzaXplOnt3aWR0aDoyNTYsaGVpZ2h0OjF9LGZvcm1hdDoicmdiYTh1bm9ybSIsdXNhZ2U6R1BVVGV4dHVyZVVzYWdlLlRFWFRVUkVfQklORElOR3xHUFVUZXh0dXJlVXNhZ2UuQ09QWV9EU1R9KTttLnF1ZXVlLndyaXRlVGV4dHVyZSh7dGV4dHVyZTpZfSxYLmJ1ZmZlcix7Ynl0ZXNQZXJSb3c6MTAyNCxvZmZzZXQ6WC5ieXRlT2Zmc2V0fSx7d2lkdGg6MjU2LGhlaWdodDoxfSk7Y29uc3QgSz1ZLmNyZWF0ZVZpZXcoKSxIPUkvdyxRPVYvTSxaPUQvdyxKPU4vTSxlZT1JL1MsdGU9Vi9GLHJlPVcvUyxuZT1xL0YsaWU9Yi5jcmVhdGVUZW1wb3JhcnlBdHRhY2htZW50KEksViksYWU9eC5nZXRGaWx0ZXJQaXBlbGluZSgiZ3JhZGllbnRfZ2xvd19maWx0ZXIiLHtHTE9XX1RZUEU6ZixJU19LTk9DS09VVDpkPzE6MH0pLHNlPXguZ2V0QmluZEdyb3VwTGF5b3V0KCJncmFkaWVudF9nbG93X2ZpbHRlciIpO2lmKCFhZXx8IXNlKXJldHVybiBjb25zb2xlLmVycm9yKCJbV2ViR1BVIEdyYWRpZW50R2xvd0ZpbHRlcl0gUGlwZWxpbmUgbm90IGZvdW5kIiksYi5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChQKSxlO2NvbnN0IG9lPXYuY3JlYXRlU2FtcGxlcigiZ3JhZGllbnRfZ2xvd19zYW1wbGVyIiwhMCk7U2xbMF09YyxTbFsxXT1HPzE6MCxTbFsyXT1kPzE6MCxTbFszXT1mLFNsWzRdPUgsU2xbNV09USxTbFs2XT1aLFNsWzddPUosU2xbOF09ZWUsU2xbOV09dGUsU2xbMTBdPXJlLFNsWzExXT1uZTtjb25zdCBsZT1wLmJ1ZmZlck1hbmFnZXI/cC5idWZmZXJNYW5hZ2VyLmFjcXVpcmVBbmRXcml0ZVVuaWZvcm1CdWZmZXIoU2wpOm0uY3JlYXRlQnVmZmVyKHtzaXplOlNsLmJ5dGVMZW5ndGgsdXNhZ2U6R1BVQnVmZmVyVXNhZ2UuVU5JRk9STXxHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVH0pO3AuYnVmZmVyTWFuYWdlcnx8bS5xdWV1ZS53cml0ZUJ1ZmZlcihsZSwwLFNsKSxGbFswXS5yZXNvdXJjZS5idWZmZXI9bGUsRmxbMV0ucmVzb3VyY2U9b2UsRmxbMl0ucmVzb3VyY2U9UC50ZXh0dXJlLnZpZXcsRmxbM10ucmVzb3VyY2U9ZS50ZXh0dXJlLnZpZXcsRmxbNF0ucmVzb3VyY2U9Sztjb25zdCBjZT1tLmNyZWF0ZUJpbmRHcm91cCh7bGF5b3V0OnNlLGVudHJpZXM6Rmx9KSx1ZT1iLmNyZWF0ZVJlbmRlclBhc3NEZXNjcmlwdG9yKGllLnRleHR1cmUudmlldywwLDAsMCwwLCJjbGVhciIpLGZlPWcuYmVnaW5SZW5kZXJQYXNzKHVlKTtyZXR1cm4gZmUuc2V0UGlwZWxpbmUoYWUpLGZlLnNldEJpbmRHcm91cCgwLGNlKSxmZS5kcmF3KDYsMSwwLDApLGZlLmVuZCgpLHAuZnJhbWVUZXh0dXJlcy5wdXNoKFkpLGIucmVsZWFzZVRlbXBvcmFyeUF0dGFjaG1lbnQoUCksSW8ueD15K0QsSW8ueT1fK04saWV9LEJsPW5ldyBGbG9hdDMyQXJyYXkoMTIpLE9sPVt7YmluZGluZzowLHJlc291cmNlOntidWZmZXI6bnVsbH19LHtiaW5kaW5nOjEscmVzb3VyY2U6bnVsbH0se2JpbmRpbmc6MixyZXNvdXJjZTpudWxsfSx7YmluZGluZzozLHJlc291cmNlOm51bGx9XSxBbD1uZXcgTWFwLFJsPShlLHQscixuLGksYSxzLG8sbCxjLHUsZixkLGgscCxtKT0+e2NvbnN0e2RldmljZTpnLGNvbW1hbmRFbmNvZGVyOmIsZnJhbWVCdWZmZXJNYW5hZ2VyOngsdGV4dHVyZU1hbmFnZXI6dn09bSx5PWUud2lkdGgsXz1lLmhlaWdodCx3PW4sTT1pLFA9eC5jcmVhdGVUZW1wb3JhcnlBdHRhY2htZW50KHksXyksUz1nLmNyZWF0ZVRleHR1cmUoe3NpemU6e3dpZHRoOm4saGVpZ2h0Oml9LGZvcm1hdDoicmdiYTh1bm9ybSIsdXNhZ2U6R1BVVGV4dHVyZVVzYWdlLlRFWFRVUkVfQklORElOR3xHUFVUZXh0dXJlVXNhZ2UuQ09QWV9EU1R9KTtnLnF1ZXVlLndyaXRlVGV4dHVyZSh7dGV4dHVyZTpTfSxyLmJ1ZmZlcix7Ynl0ZXNQZXJSb3c6NCpuLG9mZnNldDpyLmJ5dGVPZmZzZXR9LHt3aWR0aDpuLGhlaWdodDppfSk7Y29uc3QgRj1gJHtvfSwke2x9LCR7Zn1gO2xldCBUPUFsLmdldChGKTtpZighVCl7Y29uc3QgZT1mYS5nZXREaXNwbGFjZW1lbnRNYXBGaWx0ZXJGcmFnbWVudFNoYWRlcihvLGwsZiksdD1nLmNyZWF0ZVNoYWRlck1vZHVsZSh7Y29kZTpmYS5nZXRCbHVyRmlsdGVyVmVydGV4U2hhZGVyKCl9KSxyPWcuY3JlYXRlU2hhZGVyTW9kdWxlKHtjb2RlOmV9KSxuPWcuY3JlYXRlQmluZEdyb3VwTGF5b3V0KHtlbnRyaWVzOlt7YmluZGluZzowLHZpc2liaWxpdHk6R1BVU2hhZGVyU3RhZ2UuRlJBR01FTlQsYnVmZmVyOnt0eXBlOiJ1bmlmb3JtIn19LHtiaW5kaW5nOjEsdmlzaWJpbGl0eTpHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCxzYW1wbGVyOnt9fSx7YmluZGluZzoyLHZpc2liaWxpdHk6R1BVU2hhZGVyU3RhZ2UuRlJBR01FTlQsdGV4dHVyZTp7fX0se2JpbmRpbmc6Myx2aXNpYmlsaXR5OkdQVVNoYWRlclN0YWdlLkZSQUdNRU5ULHRleHR1cmU6e319XX0pLGk9Zy5jcmVhdGVQaXBlbGluZUxheW91dCh7YmluZEdyb3VwTGF5b3V0czpbbl19KTtUPXtwaXBlbGluZTpnLmNyZWF0ZVJlbmRlclBpcGVsaW5lKHtsYXlvdXQ6aSx2ZXJ0ZXg6e21vZHVsZTp0LGVudHJ5UG9pbnQ6Im1haW4iLGJ1ZmZlcnM6W119LGZyYWdtZW50Onttb2R1bGU6cixlbnRyeVBvaW50OiJtYWluIix0YXJnZXRzOlt7Zm9ybWF0OiJyZ2JhOHVub3JtIixibGVuZDp7Y29sb3I6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn0sYWxwaGE6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn19fV19LHByaW1pdGl2ZTp7dG9wb2xvZ3k6InRyaWFuZ2xlLWxpc3QiLGN1bGxNb2RlOiJub25lIn19KSxiaW5kR3JvdXBMYXlvdXQ6bn0sQWwuc2V0KEYsVCl9Y29uc3QgQj12LmNyZWF0ZVNhbXBsZXIoImRpc3BsYWNlbWVudF9zYW1wbGVyIiwhMCksTz0xPT09ZixBPU8/NDg6MzI7aWYoQmxbMF09dy9uLEJsWzFdPU0vaSxCbFsyXT1hL24sQmxbM109KE0taS1zKS9pLEJsWzRdPWMvdyxCbFs1XT11L00sQmxbNl09MCxCbFs3XT0wLE8pe2NvbnN0W2UsdCxyLG5dPSgoZSx0KT0+WyhlPj4xNiYyNTUpLzI1NSp0LChlPj44JjI1NSkvMjU1KnQsKDI1NSZlKS8yNTUqdCx0XSkoZCxoKTtCbFs4XT1lLEJsWzldPXQsQmxbMTBdPXIsQmxbMTFdPW59Y29uc3QgUj1tLmJ1ZmZlck1hbmFnZXI/bS5idWZmZXJNYW5hZ2VyLmFjcXVpcmVBbmRXcml0ZVVuaWZvcm1CdWZmZXIoQmwsQSk6Zy5jcmVhdGVCdWZmZXIoe3NpemU6QSx1c2FnZTpHUFVCdWZmZXJVc2FnZS5VTklGT1JNfEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNUfSk7bS5idWZmZXJNYW5hZ2VyfHxnLnF1ZXVlLndyaXRlQnVmZmVyKFIsMCxCbCwwLEEvNCksT2xbMF0ucmVzb3VyY2UuYnVmZmVyPVIsT2xbMV0ucmVzb3VyY2U9QixPbFsyXS5yZXNvdXJjZT1lLnRleHR1cmUudmlldyxPbFszXS5yZXNvdXJjZT1TLmNyZWF0ZVZpZXcoKTtjb25zdCBDPWcuY3JlYXRlQmluZEdyb3VwKHtsYXlvdXQ6VC5iaW5kR3JvdXBMYXlvdXQsZW50cmllczpPbH0pLEU9eC5jcmVhdGVSZW5kZXJQYXNzRGVzY3JpcHRvcihQLnRleHR1cmUudmlldywwLDAsMCwwLCJjbGVhciIpLFU9Yi5iZWdpblJlbmRlclBhc3MoRSk7cmV0dXJuIFUuc2V0UGlwZWxpbmUoVC5waXBlbGluZSksVS5zZXRCaW5kR3JvdXAoMCxDKSxVLmRyYXcoNiwxLDAsMCksVS5lbmQoKSxtLmZyYW1lVGV4dHVyZXMucHVzaChTKSxQfSxDbD1uZXcgRmxvYXQzMkFycmF5KDQpLEVsPW5ldyBGbG9hdDMyQXJyYXkoNiksVWw9bmV3IEZsb2F0MzJBcnJheSg2KSwkbD1uZXcgRmxvYXQzMkFycmF5KDgpLEdsPW5ldyBGbG9hdDMyQXJyYXkoMTIpLGtsPW5ldyBGbG9hdDMyQXJyYXkoMjApLExsPVt7YmluZGluZzowLHJlc291cmNlOntidWZmZXI6bnVsbH19LHtiaW5kaW5nOjEscmVzb3VyY2U6bnVsbH0se2JpbmRpbmc6MixyZXNvdXJjZTpudWxsfV0sSWw9bmV3IFNldChbIm5vcm1hbCIsImxheWVyIiwiYWRkIiwic2NyZWVuIiwiYWxwaGEiLCJlcmFzZSIsImNvcHkiXSksVmw9bmV3IEZsb2F0MzJBcnJheShbMSwtMSwwLDFdKSx6bD0oZSx0LHIsbixpLGEscyxvKT0+e2NvbnN0IGw9ZS5tYWluQXR0YWNobWVudHx8ZS5mcmFtZUJ1ZmZlck1hbmFnZXIuZ2V0QXR0YWNobWVudCgibWFpbiIpO2lmKCFsfHwhbC50ZXh0dXJlfHwhdC50ZXh0dXJlKXJldHVybjtsZXQgYz1pLHU9YSxmPXQud2lkdGgsZD10LmhlaWdodCxoPTAscD0wO2lmKGM8MCYmKGg9LWMvdC53aWR0aCxmKz1jLGM9MCksdTwwJiYocD0tdS90LmhlaWdodCxkKz11LHU9MCksZjw9MHx8ZDw9MClyZXR1cm47Y29uc3QgbT1sLndpZHRoLGc9bC5oZWlnaHQ7aWYoYytmPm0mJihmPW0tYyksdStkPmcmJihkPWctdSksYj1uLElsLmhhcyhiKSl7Y29uc3Qgcj1sLm1zYWEmJmwubXNhYVRleHR1cmU/LnZpZXc7bGV0IGk7c3dpdGNoKG4pe2Nhc2UiYWRkIjppPXI/ImZpbHRlcl9vdXRwdXRfYWRkX21zYWEiOiJmaWx0ZXJfb3V0cHV0X2FkZCI7YnJlYWs7Y2FzZSJzY3JlZW4iOmk9cj8iZmlsdGVyX291dHB1dF9zY3JlZW5fbXNhYSI6ImZpbHRlcl9vdXRwdXRfc2NyZWVuIjticmVhaztjYXNlImFscGhhIjppPXI/ImZpbHRlcl9vdXRwdXRfYWxwaGFfbXNhYSI6ImZpbHRlcl9vdXRwdXRfYWxwaGEiO2JyZWFrO2Nhc2UiZXJhc2UiOmk9cj8iZmlsdGVyX291dHB1dF9lcmFzZV9tc2FhIjoiZmlsdGVyX291dHB1dF9lcmFzZSI7YnJlYWs7Y2FzZSJjb3B5IjppPXI/InRleHR1cmVfY29weV9iZ3JhX21zYWEiOiJ0ZXh0dXJlX2NvcHlfYmdyYSI7YnJlYWs7ZGVmYXVsdDppPXI/ImZpbHRlcl9vdXRwdXRfbXNhYSI6ImZpbHRlcl9vdXRwdXQifWxldCBhPWUucGlwZWxpbmVNYW5hZ2VyLmdldFBpcGVsaW5lKGkpLHM9ZS5waXBlbGluZU1hbmFnZXIuZ2V0QmluZEdyb3VwTGF5b3V0KCJ0ZXh0dXJlX2NvcHkiKTtpZighKGEmJnN8fChpPXI/ImZpbHRlcl9vdXRwdXRfbXNhYSI6ImZpbHRlcl9vdXRwdXQiLGE9ZS5waXBlbGluZU1hbmFnZXIuZ2V0UGlwZWxpbmUoaSkscz1lLnBpcGVsaW5lTWFuYWdlci5nZXRCaW5kR3JvdXBMYXlvdXQoInRleHR1cmVfY29weSIpLGEmJnMpKSlyZXR1cm47Y29uc3Qgbz1lLnRleHR1cmVNYW5hZ2VyLmNyZWF0ZVNhbXBsZXIoImZpbHRlcl9vdXRwdXRfc2FtcGxlciIsITApLGI9Zi90LndpZHRoLHg9ZC90LmhlaWdodDtDbFswXT1iLENsWzFdPXgsQ2xbMl09aCxDbFszXT1wO2NvbnN0IHY9ZS5idWZmZXJNYW5hZ2VyLmFjcXVpcmVBbmRXcml0ZVVuaWZvcm1CdWZmZXIoQ2wpO0xsWzBdLnJlc291cmNlLmJ1ZmZlcj12LExsWzFdLnJlc291cmNlPW8sTGxbMl0ucmVzb3VyY2U9dC50ZXh0dXJlLnZpZXc7Y29uc3QgeT1lLmRldmljZS5jcmVhdGVCaW5kR3JvdXAoe2xheW91dDpzLGVudHJpZXM6TGx9KSxfPXI/bC5tc2FhVGV4dHVyZS52aWV3OmwudGV4dHVyZS52aWV3LHc9cj9sLnRleHR1cmUudmlldzpudWxsLE09ZS5mcmFtZUJ1ZmZlck1hbmFnZXIuY3JlYXRlUmVuZGVyUGFzc0Rlc2NyaXB0b3IoXywwLDAsMCwwLCJsb2FkIix3KSxQPU1hdGgubWF4KDAsYyksUz1NYXRoLm1heCgwLHUpLEY9TWF0aC5tYXgoMSxmKSxUPU1hdGgubWF4KDEsZCksQj1NYXRoLm1heCgwLE1hdGguZmxvb3IoUCkpLE89TWF0aC5tYXgoMCxNYXRoLmZsb29yKFMpKSxBPU1hdGgubWF4KDEsTWF0aC5taW4oTWF0aC5jZWlsKFArRiktQixtLUIpKSxSPU1hdGgubWF4KDEsTWF0aC5taW4oTWF0aC5jZWlsKFMrVCktTyxnLU8pKTtpZihBPD0wfHxSPD0wfHxCPj1tfHxPPj1nKXJldHVybjtjb25zdCBDPWUuY29tbWFuZEVuY29kZXIuYmVnaW5SZW5kZXJQYXNzKE0pO0Muc2V0UGlwZWxpbmUoYSksQy5zZXRCaW5kR3JvdXAoMCx5KSxDLnNldFZpZXdwb3J0KFAsUyxGLFQsMCwxKSxDLnNldFNjaXNzb3JSZWN0KEIsTyxBLFIpLEMuZHJhdyg2LDEsMCwwKSxDLmVuZCgpfWVsc2V7Y29uc3QgaT0oKGUsdCxyLG4saSxhKT0+e2NvbnN0IHM9ZS5mcmFtZUJ1ZmZlck1hbmFnZXIuY3JlYXRlVGVtcG9yYXJ5QXR0YWNobWVudChpLGEpLG89ZS5waXBlbGluZU1hbmFnZXIuZ2V0UGlwZWxpbmUoImNvbXBsZXhfYmxlbmRfY29weSIpLGw9ZS5waXBlbGluZU1hbmFnZXIuZ2V0QmluZEdyb3VwTGF5b3V0KCJ0ZXh0dXJlX2NvcHkiKTtpZighKG8mJmwmJnQudGV4dHVyZSYmcy50ZXh0dXJlKSlyZXR1cm4gcztjb25zdCBjPWkvdC53aWR0aCx1PWEvdC5oZWlnaHQsZj1yL3Qud2lkdGgsZD1uL3QuaGVpZ2h0O0NsWzBdPWMsQ2xbMV09dSxDbFsyXT1mLENsWzNdPWQ7Y29uc3QgaD1lLmJ1ZmZlck1hbmFnZXIuYWNxdWlyZUFuZFdyaXRlVW5pZm9ybUJ1ZmZlcihDbCkscD1lLnRleHR1cmVNYW5hZ2VyLmNyZWF0ZVNhbXBsZXIoImZpbHRlcl9jb3B5X3NhbXBsZXIiLCExKTtMbFswXS5yZXNvdXJjZS5idWZmZXI9aCxMbFsxXS5yZXNvdXJjZT1wLExsWzJdLnJlc291cmNlPXQudGV4dHVyZS52aWV3O2NvbnN0IG09ZS5kZXZpY2UuY3JlYXRlQmluZEdyb3VwKHtsYXlvdXQ6bCxlbnRyaWVzOkxsfSksZz1lLmZyYW1lQnVmZmVyTWFuYWdlci5jcmVhdGVSZW5kZXJQYXNzRGVzY3JpcHRvcihzLnRleHR1cmUudmlldywwLDAsMCwwLCJjbGVhciIpLGI9ZS5jb21tYW5kRW5jb2Rlci5iZWdpblJlbmRlclBhc3MoZyk7cmV0dXJuIGIuc2V0UGlwZWxpbmUobyksYi5zZXRCaW5kR3JvdXAoMCxtKSxiLmRyYXcoNiwxLDAsMCksYi5lbmQoKSxzfSkoZSxsLGMsdSxmLGQpOyRsWzBdPXJbMF0sJGxbMV09clsxXSwkbFsyXT1yWzJdLCRsWzNdPXJbM10sJGxbNF09cls0XSwkbFs1XT1yWzVdLCRsWzZdPXJbNl0sJGxbN109MDtjb25zdCBhPUFvKHQsaSxuLCRsLHtkZXZpY2U6ZS5kZXZpY2UsY29tbWFuZEVuY29kZXI6ZS5jb21tYW5kRW5jb2RlcixidWZmZXJNYW5hZ2VyOmUuYnVmZmVyTWFuYWdlcixmcmFtZUJ1ZmZlck1hbmFnZXI6ZS5mcmFtZUJ1ZmZlck1hbmFnZXIscGlwZWxpbmVNYW5hZ2VyOmUucGlwZWxpbmVNYW5hZ2VyLHRleHR1cmVNYW5hZ2VyOmUudGV4dHVyZU1hbmFnZXIsZnJhbWVUZXh0dXJlczplLmZyYW1lVGV4dHVyZXN9KTsoKGUsdCxyLG4saSk9Pntjb25zdCBhPXIubXNhYSYmci5tc2FhVGV4dHVyZT8udmlldyxzPWE/ImZpbHRlcl9jb21wbGV4X2JsZW5kX291dHB1dF9tc2FhIjoiZmlsdGVyX2NvbXBsZXhfYmxlbmRfb3V0cHV0IixvPWUucGlwZWxpbmVNYW5hZ2VyLmdldFBpcGVsaW5lKHMpLGw9ZS5waXBlbGluZU1hbmFnZXIuZ2V0QmluZEdyb3VwTGF5b3V0KCJwb3NpdGlvbmVkX3RleHR1cmUiKTtpZighKG8mJmwmJnQudGV4dHVyZSYmci50ZXh0dXJlKSlyZXR1cm47JGxbMF09biwkbFsxXT1pLCRsWzJdPXQud2lkdGgsJGxbM109dC5oZWlnaHQsJGxbNF09ci53aWR0aCwkbFs1XT1yLmhlaWdodCwkbFs2XT0wLCRsWzddPTA7Y29uc3QgYz1lLmJ1ZmZlck1hbmFnZXIuYWNxdWlyZUFuZFdyaXRlVW5pZm9ybUJ1ZmZlcigkbCksdT1lLnRleHR1cmVNYW5hZ2VyLmNyZWF0ZVNhbXBsZXIoImZpbHRlcl9ibGVuZF9vdXRwdXRfc2FtcGxlciIsITEpO0xsWzBdLnJlc291cmNlLmJ1ZmZlcj1jLExsWzFdLnJlc291cmNlPXUsTGxbMl0ucmVzb3VyY2U9dC50ZXh0dXJlLnZpZXc7Y29uc3QgZj1lLmRldmljZS5jcmVhdGVCaW5kR3JvdXAoe2xheW91dDpsLGVudHJpZXM6TGx9KSxkPWE/ci5tc2FhVGV4dHVyZS52aWV3OnIudGV4dHVyZS52aWV3LGg9YT9yLnRleHR1cmUudmlldzpudWxsLHA9ZS5mcmFtZUJ1ZmZlck1hbmFnZXIuY3JlYXRlUmVuZGVyUGFzc0Rlc2NyaXB0b3IoZCwwLDAsMCwwLCJsb2FkIixoKSxtPWUuY29tbWFuZEVuY29kZXIuYmVnaW5SZW5kZXJQYXNzKHApO20uc2V0UGlwZWxpbmUobyksbS5zZXRCaW5kR3JvdXAoMCxmKSxtLmRyYXcoNiwxLDAsMCksbS5lbmQoKX0pKGUsYSxsLGMsdSksZS5mcmFtZUJ1ZmZlck1hbmFnZXIucmVsZWFzZVRlbXBvcmFyeUF0dGFjaG1lbnQoaSksZS5mcmFtZUJ1ZmZlck1hbmFnZXIucmVsZWFzZVRlbXBvcmFyeUF0dGFjaG1lbnQoYSl9dmFyIGJ9LGpsPShlLHQscixuLGksYSxzLG8sbCxjLHUsZik9PntJby54PTAsSW8ueT0wO2xldCBkPSgoZSx0LHIpPT57Y29uc3Qgbj1yLmNyZWF0ZVRlbXBvcmFyeUF0dGFjaG1lbnQoZS53LGUuaCksaT13YSgpfHxyLmdldEF0dGFjaG1lbnQoImF0bGFzIik7cmV0dXJuIGkmJmkudGV4dHVyZSYmbi50ZXh0dXJlP3QuY29weVRleHR1cmVUb1RleHR1cmUoe3RleHR1cmU6aS50ZXh0dXJlLnJlc291cmNlLG9yaWdpbjp7eDplLngseTplLnksejowfX0se3RleHR1cmU6bi50ZXh0dXJlLnJlc291cmNlLG9yaWdpbjp7eDowLHk6MCx6OjB9fSx7d2lkdGg6ZS53LGhlaWdodDplLmh9KTpjb25zb2xlLmVycm9yKCJbV2ViR1BVIEZpbHRlcl0gZ2V0VGV4dHVyZUZyb21Ob2RlOiBGQUlMRUQgLSBtaXNzaW5nIGF0bGFzIG9yIHRleHR1cmVzIiksbn0pKGUsYy5jb21tYW5kRW5jb2RlcixjLmZyYW1lQnVmZmVyTWFuYWdlcik7aWYoZC50ZXh0dXJlKXtjb25zdCB0PWMuZnJhbWVCdWZmZXJNYW5hZ2VyLmNyZWF0ZVRlbXBvcmFyeUF0dGFjaG1lbnQoZS53LGUuaCkscj1jLnBpcGVsaW5lTWFuYWdlci5nZXRQaXBlbGluZSgidGV4dHVyZV9jb3B5X3JnYmE4Iiksbj1jLnBpcGVsaW5lTWFuYWdlci5nZXRCaW5kR3JvdXBMYXlvdXQoInRleHR1cmVfY29weSIpO2lmKHImJm4mJnQudGV4dHVyZSl7Y29uc3QgZT1jLnRleHR1cmVNYW5hZ2VyLmNyZWF0ZVNhbXBsZXIoImZpbHRlcl9mbGlwX3NhbXBsZXIiLCExKSxpPWMuYnVmZmVyTWFuYWdlci5hY3F1aXJlQW5kV3JpdGVVbmlmb3JtQnVmZmVyKFZsKTtMbFswXS5yZXNvdXJjZS5idWZmZXI9aSxMbFsxXS5yZXNvdXJjZT1lLExsWzJdLnJlc291cmNlPWQudGV4dHVyZS52aWV3O2NvbnN0IGE9Yy5kZXZpY2UuY3JlYXRlQmluZEdyb3VwKHtsYXlvdXQ6bixlbnRyaWVzOkxsfSkscz1jLmZyYW1lQnVmZmVyTWFuYWdlci5jcmVhdGVSZW5kZXJQYXNzRGVzY3JpcHRvcih0LnRleHR1cmUudmlldywwLDAsMCwwLCJjbGVhciIpLG89Yy5jb21tYW5kRW5jb2Rlci5iZWdpblJlbmRlclBhc3Mocyk7by5zZXRQaXBlbGluZShyKSxvLnNldEJpbmRHcm91cCgwLGEpLG8uZHJhdyg2LDEsMCwwKSxvLmVuZCgpLGMuZnJhbWVCdWZmZXJNYW5hZ2VyLnJlbGVhc2VUZW1wb3JhcnlBdHRhY2htZW50KGQpLGQ9dH19Y29uc3QgaD1Ibi5nZXREZXZpY2VQaXhlbFJhdGlvKCkscD1NYXRoLnNxcnQoaVswXSppWzBdK2lbMV0qaVsxXSksbT1NYXRoLnNxcnQoaVsyXSppWzJdK2lbM10qaVszXSksZz1NYXRoLmF0YW4yKGlbMV0saVswXSksYj1NYXRoLmF0YW4yKC1pWzJdLGlbM10pLHg9bj9wKk1hdGguY29zKGcpOk1hdGguY29zKGcpLHY9bj9wKk1hdGguc2luKGcpOk1hdGguc2luKGcpLHk9bj8tbSpNYXRoLnNpbihiKTotTWF0aC5zaW4oYiksXz1uP20qTWF0aC5jb3MoYik6TWF0aC5jb3MoYik7RWxbMF09eCxFbFsxXT12LEVsWzJdPXksRWxbM109XyxFbFs0XT10LzIsRWxbNV09ci8yLFVsWzBdPTEsVWxbMV09MCxVbFsyXT0wLFVsWzNdPTEsVWxbNF09LWUudy8yLFVsWzVdPS1lLmgvMjtjb25zdCB3PUVsWzBdKlVsWzBdK0VsWzJdKlVsWzFdLE09RWxbMV0qVWxbMF0rRWxbM10qVWxbMV0sUD1FbFswXSpVbFsyXStFbFsyXSpVbFszXSxTPUVsWzFdKlVsWzJdK0VsWzNdKlVsWzNdLEY9RWxbMF0qVWxbNF0rRWxbMl0qVWxbNV0rRWxbNF0sVD1FbFsxXSpVbFs0XStFbFszXSpVbFs1XStFbFs1XTtsZXQgQj0wLE89MDtpZigxIT09d3x8MCE9PU18fDAhPT1QfHwxIT09Uyl7Y29uc3Qgbj1jLmZyYW1lQnVmZmVyTWFuYWdlci5jcmVhdGVUZW1wb3JhcnlBdHRhY2htZW50KHQsciksaT0idGV4dHVyZV9zY2FsZSIsYT1jLnBpcGVsaW5lTWFuYWdlci5nZXRQaXBlbGluZShpKSxzPWMucGlwZWxpbmVNYW5hZ2VyLmdldEJpbmRHcm91cExheW91dCgidGV4dHVyZV9zY2FsZSIpO2lmKGEmJnMpe0dsWzBdPXcsR2xbMV09TSxHbFsyXT1QLEdsWzNdPVMsR2xbNF09RixHbFs1XT1ULEdsWzZdPWUudyxHbFs3XT1lLmgsR2xbOF09dCxHbFs5XT1yLEdsWzEwXT0wLEdsWzExXT0wO2NvbnN0IGk9Yy5idWZmZXJNYW5hZ2VyLmFjcXVpcmVBbmRXcml0ZVVuaWZvcm1CdWZmZXIoR2wsNDgpLG89Yy50ZXh0dXJlTWFuYWdlci5jcmVhdGVTYW1wbGVyKCJmaWx0ZXJfc2NhbGVfc2FtcGxlciIsITApO0xsWzBdLnJlc291cmNlLmJ1ZmZlcj1pLExsWzFdLnJlc291cmNlPW8sTGxbMl0ucmVzb3VyY2U9ZC50ZXh0dXJlLnZpZXc7Y29uc3QgbD1jLmRldmljZS5jcmVhdGVCaW5kR3JvdXAoe2xheW91dDpzLGVudHJpZXM6TGx9KSx1PWMuZnJhbWVCdWZmZXJNYW5hZ2VyLmNyZWF0ZVJlbmRlclBhc3NEZXNjcmlwdG9yKG4udGV4dHVyZS52aWV3LDAsMCwwLDAsImNsZWFyIiksZj1jLmNvbW1hbmRFbmNvZGVyLmJlZ2luUmVuZGVyUGFzcyh1KTtmLnNldFBpcGVsaW5lKGEpLGYuc2V0QmluZEdyb3VwKDAsbCksZi5kcmF3KDYsMSwwLDApLGYuZW5kKCksQj1GLE89VCxjLmZyYW1lQnVmZmVyTWFuYWdlci5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChkKSxkPW59fWZvcihsZXQgZT0wO2wubGVuZ3RoPmU7KXtzd2l0Y2gobFtlKytdKXtjYXNlIDA6e2NvbnN0IHQ9bFtlKytdLHI9bFtlKytdLG49bFtlKytdLGE9bFtlKytdLHM9bFtlKytdLG89bFtlKytdLHU9bFtlKytdLGY9bFtlKytdLHA9bFtlKytdLG09bFtlKytdLGc9bFtlKytdLGI9Qm9vbGVhbihsW2UrK10pLHg9cGwoZCxpLHQscixuLGEscyxvLHUsZixwLG0sZyxiLGgsYyk7ZCE9PXgmJmMuZnJhbWVCdWZmZXJNYW5hZ2VyLnJlbGVhc2VUZW1wb3JhcnlBdHRhY2htZW50KGQpLGQ9eH1icmVhaztjYXNlIDE6e2NvbnN0IHQ9bFtlKytdLHI9bFtlKytdLG49bFtlKytdLGE9WW8oZCxpLHQscixuLGgsYyk7ZCE9PWEmJmMuZnJhbWVCdWZmZXJNYW5hZ2VyLnJlbGVhc2VUZW1wb3JhcnlBdHRhY2htZW50KGQpLGQ9YX1icmVhaztjYXNlIDI6e2tsWzBdPWxbZSsrXSxrbFsxXT1sW2UrK10sa2xbMl09bFtlKytdLGtsWzNdPWxbZSsrXSxrbFs0XT1sW2UrK10sa2xbNV09bFtlKytdLGtsWzZdPWxbZSsrXSxrbFs3XT1sW2UrK10sa2xbOF09bFtlKytdLGtsWzldPWxbZSsrXSxrbFsxMF09bFtlKytdLGtsWzExXT1sW2UrK10sa2xbMTJdPWxbZSsrXSxrbFsxM109bFtlKytdLGtsWzE0XT1sW2UrK10sa2xbMTVdPWxbZSsrXSxrbFsxNl09bFtlKytdLGtsWzE3XT1sW2UrK10sa2xbMThdPWxbZSsrXSxrbFsxOV09bFtlKytdO2NvbnN0IHQ9ZWwoZCxrbCxjKTtkIT09dCYmYy5mcmFtZUJ1ZmZlck1hbmFnZXIucmVsZWFzZVRlbXBvcmFyeUF0dGFjaG1lbnQoZCksZD10fWJyZWFrO2Nhc2UgMzp7Y29uc3QgdD1sW2UrK10scj1sW2UrK10sbj10KnIsaT1uZXcgRmxvYXQzMkFycmF5KG4pO2ZvcihsZXQgdD0wO3Q8bjt0KyspaVt0XT1sW2UrK107Y29uc3QgYT1sW2UrK10scz1sW2UrK10sbz1Cb29sZWFuKGxbZSsrXSksdT1Cb29sZWFuKGxbZSsrXSksZj1sW2UrK10saD1sW2UrK10scD1ibChkLHQscixpLGEscyxvLHUsZixoLGMpO2QhPT1wJiZjLmZyYW1lQnVmZmVyTWFuYWdlci5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChkKSxkPXB9YnJlYWs7Y2FzZSA0Ontjb25zdCB0PWxbZSsrXSxyPW5ldyBVaW50OEFycmF5KHQpO2ZvcihsZXQgbj0wO248dDtuKyspcltuXT1sW2UrK107Y29uc3Qgbj1sW2UrK10saT1sW2UrK10sYT1sW2UrK10scz1sW2UrK10sbz1sW2UrK10sdT1sW2UrK10sZj1sW2UrK10saD1sW2UrK10scD1sW2UrK10sbT1sW2UrK10sZz1sW2UrK10sYj1SbChkLDAscixuLGksYSxzLG8sdSxmLGgscCxtLGcsMCxjKTtkIT09YiYmYy5mcmFtZUJ1ZmZlck1hbmFnZXIucmVsZWFzZVRlbXBvcmFyeUF0dGFjaG1lbnQoZCksZD1ifWJyZWFrO2Nhc2UgNTp7Y29uc3QgdD1sW2UrK10scj1sW2UrK10sbj1sW2UrK10sYT1sW2UrK10scz1sW2UrK10sbz1sW2UrK10sdT1sW2UrK10sZj1sW2UrK10scD1Cb29sZWFuKGxbZSsrXSksbT1Cb29sZWFuKGxbZSsrXSksZz1Cb29sZWFuKGxbZSsrXSksYj1vbChkLGksdCxyLG4sYSxzLG8sdSxmLHAsbSxnLGgsYyk7ZCE9PWImJmMuZnJhbWVCdWZmZXJNYW5hZ2VyLnJlbGVhc2VUZW1wb3JhcnlBdHRhY2htZW50KGQpLGQ9Yn1icmVhaztjYXNlIDY6e2NvbnN0IHQ9bFtlKytdLHI9bFtlKytdLG49bFtlKytdLGE9bFtlKytdLHM9bFtlKytdLG89bFtlKytdLHU9Qm9vbGVhbihsW2UrK10pLGY9Qm9vbGVhbihsW2UrK10pLHA9bmwoZCxpLHQscixuLGEscyxvLHUsZixoLGMpO2QhPT1wJiZjLmZyYW1lQnVmZmVyTWFuYWdlci5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChkKSxkPXB9YnJlYWs7Y2FzZSA3Ontjb25zdCB0PWxbZSsrXSxyPWxbZSsrXSxuPWxbZSsrXSxhPW5ldyBGbG9hdDMyQXJyYXkobik7Zm9yKGxldCB0PTA7dDxuO3QrKylhW3RdPWxbZSsrXTtjb25zdCBzPWxbZSsrXSxvPW5ldyBGbG9hdDMyQXJyYXkocyk7Zm9yKGxldCB0PTA7dDxzO3QrKylvW3RdPWxbZSsrXTtjb25zdCB1PWxbZSsrXSxmPW5ldyBGbG9hdDMyQXJyYXkodSk7Zm9yKGxldCB0PTA7dDx1O3QrKylmW3RdPWxbZSsrXTtjb25zdCBwPWxbZSsrXSxtPWxbZSsrXSxnPWxbZSsrXSxiPWxbZSsrXSx4PWxbZSsrXSx2PUJvb2xlYW4obFtlKytdKSx5PU1sKGQsaSx0LHIsYSxvLGYscCxtLGcsYix4LHYsaCxjKTtkIT09eSYmYy5mcmFtZUJ1ZmZlck1hbmFnZXIucmVsZWFzZVRlbXBvcmFyeUF0dGFjaG1lbnQoZCksZD15fWJyZWFrO2Nhc2UgODp7Y29uc3QgdD1sW2UrK10scj1sW2UrK10sbj1sW2UrK10sYT1uZXcgRmxvYXQzMkFycmF5KG4pO2ZvcihsZXQgdD0wO3Q8bjt0KyspYVt0XT1sW2UrK107Y29uc3Qgcz1sW2UrK10sbz1uZXcgRmxvYXQzMkFycmF5KHMpO2ZvcihsZXQgdD0wO3Q8czt0Kyspb1t0XT1sW2UrK107Y29uc3QgdT1sW2UrK10sZj1uZXcgRmxvYXQzMkFycmF5KHUpO2ZvcihsZXQgdD0wO3Q8dTt0KyspZlt0XT1sW2UrK107Y29uc3QgcD1sW2UrK10sbT1sW2UrK10sZz1sW2UrK10sYj1sW2UrK10seD1sW2UrK10sdj1Cb29sZWFuKGxbZSsrXSkseT1UbChkLGksdCxyLGEsbyxmLHAsbSxnLGIseCx2LGgsYyk7ZCE9PXkmJmMuZnJhbWVCdWZmZXJNYW5hZ2VyLnJlbGVhc2VUZW1wb3JhcnlBdHRhY2htZW50KGQpLGQ9eX19fWlmKDEhPT0oQT1hKVswXXx8MSE9PUFbMV18fDEhPT1BWzJdfHwxIT09QVszXXx8MCE9PUFbNF18fDAhPT1BWzVdfHwwIT09QVs2XXx8MCE9PUFbN10pe2NvbnN0IGU9KChlLHQscik9Pntjb25zdCBuPWUuZnJhbWVCdWZmZXJNYW5hZ2VyLmNyZWF0ZVRlbXBvcmFyeUF0dGFjaG1lbnQodC53aWR0aCx0LmhlaWdodCksaT1lLnBpcGVsaW5lTWFuYWdlci5nZXRQaXBlbGluZSgiY29sb3JfdHJhbnNmb3JtIiksYT1lLnBpcGVsaW5lTWFuYWdlci5nZXRCaW5kR3JvdXBMYXlvdXQoInRleHR1cmVfY29weSIpO2lmKCEoaSYmYSYmdC50ZXh0dXJlJiZuLnRleHR1cmUpKXJldHVybiB0OyRsWzBdPXJbMF0sJGxbMV09clsxXSwkbFsyXT1yWzJdLCRsWzNdPXJbM10sJGxbNF09cls0XSwkbFs1XT1yWzVdLCRsWzZdPXJbNl0sJGxbN109MDtjb25zdCBzPWUuYnVmZmVyTWFuYWdlci5hY3F1aXJlQW5kV3JpdGVVbmlmb3JtQnVmZmVyKCRsKSxvPWUudGV4dHVyZU1hbmFnZXIuY3JlYXRlU2FtcGxlcigiY29sb3JfdHJhbnNmb3JtX3NhbXBsZXIiLCExKTtMbFswXS5yZXNvdXJjZS5idWZmZXI9cyxMbFsxXS5yZXNvdXJjZT1vLExsWzJdLnJlc291cmNlPXQudGV4dHVyZS52aWV3O2NvbnN0IGw9ZS5kZXZpY2UuY3JlYXRlQmluZEdyb3VwKHtsYXlvdXQ6YSxlbnRyaWVzOkxsfSksYz1lLmZyYW1lQnVmZmVyTWFuYWdlci5jcmVhdGVSZW5kZXJQYXNzRGVzY3JpcHRvcihuLnRleHR1cmUudmlldywwLDAsMCwwLCJjbGVhciIpLHU9ZS5jb21tYW5kRW5jb2Rlci5iZWdpblJlbmRlclBhc3MoYyk7cmV0dXJuIHUuc2V0UGlwZWxpbmUoaSksdS5zZXRCaW5kR3JvdXAoMCxsKSx1LmRyYXcoNiwxLDAsMCksdS5lbmQoKSxufSkoYyxkLGEpO2MuZnJhbWVCdWZmZXJNYW5hZ2VyLnJlbGVhc2VUZW1wb3JhcnlBdHRhY2htZW50KGQpLGQ9ZX12YXIgQTtjb25zdCBSPW9bMF0qKHAvaCksQz1vWzFdKihtL2gpLEU9LUIrUitpWzRdLFU9LU8rQytpWzVdO3psKGMsZCxhLHMsRSxVKSxjLmZyYW1lQnVmZmVyTWFuYWdlci5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChkKX0sRGw9bmV3IEZsb2F0MzJBcnJheSg0KSxObD1uZXcgRmxvYXQzMkFycmF5KDgpLFdsPW5ldyBGbG9hdDMyQXJyYXkoMjApLHFsPVt7YmluZGluZzowLHJlc291cmNlOntidWZmZXI6bnVsbH19LHtiaW5kaW5nOjEscmVzb3VyY2U6bnVsbH0se2JpbmRpbmc6MixyZXNvdXJjZTpudWxsfV0sWGw9bmV3IFNldChbIm5vcm1hbCIsImxheWVyIiwiYWRkIiwic2NyZWVuIiwiYWxwaGEiLCJlcmFzZSIsImNvcHkiXSksWWw9bmV3IEZsb2F0MzJBcnJheShbMSwxLDEsMSwwLDAsMCwwXSksS2w9ZT0+IWV8fDE9PT1lWzBdJiYxPT09ZVsxXSYmMT09PWVbMl0mJjE9PT1lWzNdJiYwPT09ZVs0XSYmMD09PWVbNV0mJjA9PT1lWzZdJiYwPT09ZVs3XSxIbD0oZSx0LHIpPT57Y29uc3Qgbj1lLmZyYW1lQnVmZmVyTWFuYWdlci5jcmVhdGVUZW1wb3JhcnlBdHRhY2htZW50KHQud2lkdGgsdC5oZWlnaHQpLGk9ZS5waXBlbGluZU1hbmFnZXIuZ2V0UGlwZWxpbmUoImNvbG9yX3RyYW5zZm9ybSIpLGE9ZS5waXBlbGluZU1hbmFnZXIuZ2V0QmluZEdyb3VwTGF5b3V0KCJ0ZXh0dXJlX2NvcHkiKTtpZighKGkmJmEmJnQudGV4dHVyZSYmbi50ZXh0dXJlKSlyZXR1cm4gdDtObFswXT1yWzBdLE5sWzFdPXJbMV0sTmxbMl09clsyXSxObFszXT1yWzNdLE5sWzRdPXJbNF0sTmxbNV09cls1XSxObFs2XT1yWzZdLE5sWzddPTA7Y29uc3Qgcz1lLmJ1ZmZlck1hbmFnZXIuYWNxdWlyZUFuZFdyaXRlVW5pZm9ybUJ1ZmZlcihObCksbz1lLnRleHR1cmVNYW5hZ2VyLmNyZWF0ZVNhbXBsZXIoImNvbnRhaW5lcl9jdF9zYW1wbGVyIiwhMSk7cWxbMF0ucmVzb3VyY2UuYnVmZmVyPXMscWxbMV0ucmVzb3VyY2U9byxxbFsyXS5yZXNvdXJjZT10LnRleHR1cmUudmlldztjb25zdCBsPWUuZGV2aWNlLmNyZWF0ZUJpbmRHcm91cCh7bGF5b3V0OmEsZW50cmllczpxbH0pLGM9ZS5mcmFtZUJ1ZmZlck1hbmFnZXIuY3JlYXRlUmVuZGVyUGFzc0Rlc2NyaXB0b3Iobi50ZXh0dXJlLnZpZXcsMCwwLDAsMCwiY2xlYXIiKSx1PWUuY29tbWFuZEVuY29kZXIuYmVnaW5SZW5kZXJQYXNzKGMpO3JldHVybiB1LnNldFBpcGVsaW5lKGkpLHUuc2V0QmluZEdyb3VwKDAsbCksdS5kcmF3KDYsMSwwLDApLHUuZW5kKCksbn0sUWw9KGUsdCxyLG4saSxhKT0+e2NvbnN0IHM9ZS5mcmFtZUJ1ZmZlck1hbmFnZXIuY3JlYXRlVGVtcG9yYXJ5QXR0YWNobWVudChpLGEpLG89ZS5waXBlbGluZU1hbmFnZXIuZ2V0UGlwZWxpbmUoImNvbXBsZXhfYmxlbmRfY29weSIpLGw9ZS5waXBlbGluZU1hbmFnZXIuZ2V0QmluZEdyb3VwTGF5b3V0KCJ0ZXh0dXJlX2NvcHkiKTtpZighKG8mJmwmJnQudGV4dHVyZSYmcy50ZXh0dXJlKSlyZXR1cm4gcztjb25zdCBjPWkvdC53aWR0aCx1PXIvdC53aWR0aCxmPS1hL3QuaGVpZ2h0LGQ9KG4rYSkvdC5oZWlnaHQ7RGxbMF09YyxEbFsxXT1mLERsWzJdPXUsRGxbM109ZDtjb25zdCBoPWUuYnVmZmVyTWFuYWdlci5hY3F1aXJlQW5kV3JpdGVVbmlmb3JtQnVmZmVyKERsKSxwPWUudGV4dHVyZU1hbmFnZXIuY3JlYXRlU2FtcGxlcigiY29udGFpbmVyX2NvcHlfc2FtcGxlciIsITEpO3FsWzBdLnJlc291cmNlLmJ1ZmZlcj1oLHFsWzFdLnJlc291cmNlPXAscWxbMl0ucmVzb3VyY2U9dC50ZXh0dXJlLnZpZXc7Y29uc3QgbT1lLmRldmljZS5jcmVhdGVCaW5kR3JvdXAoe2xheW91dDpsLGVudHJpZXM6cWx9KSxnPWUuZnJhbWVCdWZmZXJNYW5hZ2VyLmNyZWF0ZVJlbmRlclBhc3NEZXNjcmlwdG9yKHMudGV4dHVyZS52aWV3LDAsMCwwLDAsImNsZWFyIiksYj1lLmNvbW1hbmRFbmNvZGVyLmJlZ2luUmVuZGVyUGFzcyhnKTtyZXR1cm4gYi5zZXRQaXBlbGluZShvKSxiLnNldEJpbmRHcm91cCgwLG0pLGIuZHJhdyg2LDEsMCwwKSxiLmVuZCgpLHN9LFpsPShlLHQscixuLGksYSxzKT0+e2lmKCFyLnRleHR1cmV8fCF0LnRleHR1cmUpcmV0dXJuO2xldCBvPWksbD1hLGM9dC53aWR0aCx1PXQuaGVpZ2h0LGY9MCxkPTA7aWYobzwwJiYoZj0tby90LndpZHRoLGMrPW8sbz0wKSxsPDAmJihkPS1sL3QuaGVpZ2h0LHUrPWwsbD0wKSxjPD0wfHx1PD0wKXJldHVybjtjb25zdCBoPXIud2lkdGgscD1yLmhlaWdodDtpZihvK2M+aCYmKGM9aC1vKSxsK3U+cCYmKHU9cC1sKSxYbC5oYXMobikpe2NvbnN0IGk9ci5tc2FhJiZyLm1zYWFUZXh0dXJlPy52aWV3O2xldCBhO3N3aXRjaChuKXtjYXNlImFkZCI6YT1pPyJmaWx0ZXJfb3V0cHV0X2FkZF9tc2FhIjoiZmlsdGVyX291dHB1dF9hZGQiO2JyZWFrO2Nhc2Uic2NyZWVuIjphPWk/ImZpbHRlcl9vdXRwdXRfc2NyZWVuX21zYWEiOiJmaWx0ZXJfb3V0cHV0X3NjcmVlbiI7YnJlYWs7Y2FzZSJhbHBoYSI6YT1pPyJmaWx0ZXJfb3V0cHV0X2FscGhhX21zYWEiOiJmaWx0ZXJfb3V0cHV0X2FscGhhIjticmVhaztjYXNlImVyYXNlIjphPWk/ImZpbHRlcl9vdXRwdXRfZXJhc2VfbXNhYSI6ImZpbHRlcl9vdXRwdXRfZXJhc2UiO2JyZWFrO2Nhc2UiY29weSI6YT1pPyJ0ZXh0dXJlX2NvcHlfYmdyYV9tc2FhIjoidGV4dHVyZV9jb3B5X2JncmEiO2JyZWFrO2RlZmF1bHQ6YT1pPyJmaWx0ZXJfb3V0cHV0X21zYWEiOiJmaWx0ZXJfb3V0cHV0In1jb25zdCBtPWUucGlwZWxpbmVNYW5hZ2VyLmdldFBpcGVsaW5lKGEpLGc9ZS5waXBlbGluZU1hbmFnZXIuZ2V0QmluZEdyb3VwTGF5b3V0KCJ0ZXh0dXJlX2NvcHkiKTtpZighbXx8IWcpcmV0dXJuO2NvbnN0IGI9ZS50ZXh0dXJlTWFuYWdlci5jcmVhdGVTYW1wbGVyKCJjb250YWluZXJfb3V0cHV0X3NhbXBsZXIiLCEwKSx4PWMvdC53aWR0aCx2PXUvdC5oZWlnaHQ7RGxbMF09eCxEbFsxXT12LERsWzJdPWYsRGxbM109ZDtjb25zdCB5PXMuYWNxdWlyZUFuZFdyaXRlVW5pZm9ybUJ1ZmZlcihEbCk7cWxbMF0ucmVzb3VyY2UuYnVmZmVyPXkscWxbMV0ucmVzb3VyY2U9YixxbFsyXS5yZXNvdXJjZT10LnRleHR1cmUudmlldztjb25zdCBfPWUuZGV2aWNlLmNyZWF0ZUJpbmRHcm91cCh7bGF5b3V0OmcsZW50cmllczpxbH0pLHc9aT9yLm1zYWFUZXh0dXJlLnZpZXc6ci50ZXh0dXJlLnZpZXcsTT1pP3IudGV4dHVyZS52aWV3Om51bGwsUD1lLmZyYW1lQnVmZmVyTWFuYWdlci5jcmVhdGVSZW5kZXJQYXNzRGVzY3JpcHRvcih3LDAsMCwwLDAsImxvYWQiLE0pLFM9TWF0aC5tYXgoMCxvKSxGPU1hdGgubWF4KDAsbCksVD1NYXRoLm1heCgxLGMpLEI9TWF0aC5tYXgoMSx1KSxPPU1hdGgubWF4KDAsTWF0aC5mbG9vcihTKSksQT1NYXRoLm1heCgwLE1hdGguZmxvb3IoRikpLFI9TWF0aC5tYXgoMSxNYXRoLm1pbihNYXRoLmNlaWwoUytUKS1PLGgtTykpLEM9TWF0aC5tYXgoMSxNYXRoLm1pbihNYXRoLmNlaWwoRitCKS1BLHAtQSkpO2lmKFI8PTB8fEM8PTB8fE8+PWh8fEE+PXApcmV0dXJuO2NvbnN0IEU9ZS5jb21tYW5kRW5jb2Rlci5iZWdpblJlbmRlclBhc3MoUCk7RS5zZXRQaXBlbGluZShtKSxFLnNldEJpbmRHcm91cCgwLF8pLEUuc2V0Vmlld3BvcnQoUyxGLFQsQiwwLDEpLEUuc2V0U2Npc3NvclJlY3QoTyxBLFIsQyksRS5kcmF3KDYsMSwwLDApLEUuZW5kKCl9ZWxzZXtjb25zdCBpPVFsKGUscixvLGwsYyx1KTtObFswXT1ZbFswXSxObFsxXT1ZbFsxXSxObFsyXT1ZbFsyXSxObFszXT1ZbFszXSxObFs0XT1ZbFs0XS8yNTUsTmxbNV09WWxbNV0vMjU1LE5sWzZdPVlsWzZdLzI1NSxObFs3XT0wO2NvbnN0IGE9QW8odCxpLG4sTmwse2RldmljZTplLmRldmljZSxjb21tYW5kRW5jb2RlcjplLmNvbW1hbmRFbmNvZGVyLGJ1ZmZlck1hbmFnZXI6ZS5idWZmZXJNYW5hZ2VyLGZyYW1lQnVmZmVyTWFuYWdlcjplLmZyYW1lQnVmZmVyTWFuYWdlcixwaXBlbGluZU1hbmFnZXI6ZS5waXBlbGluZU1hbmFnZXIsdGV4dHVyZU1hbmFnZXI6ZS50ZXh0dXJlTWFuYWdlcixmcmFtZVRleHR1cmVzOmUuZnJhbWVUZXh0dXJlc30pLGY9ci5tc2FhJiZyLm1zYWFUZXh0dXJlPy52aWV3LGQ9Zj8iZmlsdGVyX2NvbXBsZXhfYmxlbmRfb3V0cHV0X21zYWEiOiJmaWx0ZXJfY29tcGxleF9ibGVuZF9vdXRwdXQiLGg9ZS5waXBlbGluZU1hbmFnZXIuZ2V0UGlwZWxpbmUoZCkscD1lLnBpcGVsaW5lTWFuYWdlci5nZXRCaW5kR3JvdXBMYXlvdXQoInBvc2l0aW9uZWRfdGV4dHVyZSIpO2lmKGgmJnAmJmEudGV4dHVyZSYmci50ZXh0dXJlKXtObFswXT1vLE5sWzFdPWwsTmxbMl09YS53aWR0aCxObFszXT1hLmhlaWdodCxObFs0XT1yLndpZHRoLE5sWzVdPXIuaGVpZ2h0LE5sWzZdPTAsTmxbN109MDtjb25zdCB0PXMuYWNxdWlyZUFuZFdyaXRlVW5pZm9ybUJ1ZmZlcihObCksbj1lLnRleHR1cmVNYW5hZ2VyLmNyZWF0ZVNhbXBsZXIoImNvbnRhaW5lcl9ibGVuZF9vdXRwdXRfc2FtcGxlciIsITEpO3FsWzBdLnJlc291cmNlLmJ1ZmZlcj10LHFsWzFdLnJlc291cmNlPW4scWxbMl0ucmVzb3VyY2U9YS50ZXh0dXJlLnZpZXc7Y29uc3QgaT1lLmRldmljZS5jcmVhdGVCaW5kR3JvdXAoe2xheW91dDpwLGVudHJpZXM6cWx9KSxjPWY/ci5tc2FhVGV4dHVyZS52aWV3OnIudGV4dHVyZS52aWV3LHU9Zj9yLnRleHR1cmUudmlldzpudWxsLGQ9ZS5mcmFtZUJ1ZmZlck1hbmFnZXIuY3JlYXRlUmVuZGVyUGFzc0Rlc2NyaXB0b3IoYywwLDAsMCwwLCJsb2FkIix1KSxtPWUuY29tbWFuZEVuY29kZXIuYmVnaW5SZW5kZXJQYXNzKGQpO20uc2V0UGlwZWxpbmUoaCksbS5zZXRCaW5kR3JvdXAoMCxpKSxtLmRyYXcoNiwxLDAsMCksbS5lbmQoKX1lLmZyYW1lQnVmZmVyTWFuYWdlci5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChpKSxlLmZyYW1lQnVmZmVyTWFuYWdlci5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChhKX19LEpsPShlLHQscixuLGksYSxzLG8sbCxjLHUsZixkLGgscCk9PntpZihzJiZpJiZvJiZsKXtsZXQgcj1RbChoLGUsMCwwLGUud2lkdGgsZS5oZWlnaHQpO2guZnJhbWVCdWZmZXJNYW5hZ2VyLnJlbGVhc2VUZW1wb3JhcnlBdHRhY2htZW50KGUpO2NvbnN0IHM9SG4uZ2V0RGV2aWNlUGl4ZWxSYXRpbygpO2lmKHI9KChlLHQscixuLGkpPT57SW8ueD0wLElvLnk9MDtmb3IobGV0IGE9MDtyLmxlbmd0aD5hOylzd2l0Y2goclthKytdKXtjYXNlIDA6e2NvbnN0IHM9cGwoZSx0LHJbYSsrXSxyW2ErK10sclthKytdLHJbYSsrXSxyW2ErK10sclthKytdLHJbYSsrXSxyW2ErK10sclthKytdLHJbYSsrXSxyW2ErK10sQm9vbGVhbihyW2ErK10pLG4saSk7ZSE9PXMmJmkuZnJhbWVCdWZmZXJNYW5hZ2VyLnJlbGVhc2VUZW1wb3JhcnlBdHRhY2htZW50KGUpLGU9c31icmVhaztjYXNlIDE6e2NvbnN0IHM9WW8oZSx0LHJbYSsrXSxyW2ErK10sclthKytdLG4saSk7ZSE9PXMmJmkuZnJhbWVCdWZmZXJNYW5hZ2VyLnJlbGVhc2VUZW1wb3JhcnlBdHRhY2htZW50KGUpLGU9c31icmVhaztjYXNlIDI6e1dsWzBdPXJbYSsrXSxXbFsxXT1yW2ErK10sV2xbMl09clthKytdLFdsWzNdPXJbYSsrXSxXbFs0XT1yW2ErK10sV2xbNV09clthKytdLFdsWzZdPXJbYSsrXSxXbFs3XT1yW2ErK10sV2xbOF09clthKytdLFdsWzldPXJbYSsrXSxXbFsxMF09clthKytdLFdsWzExXT1yW2ErK10sV2xbMTJdPXJbYSsrXSxXbFsxM109clthKytdLFdsWzE0XT1yW2ErK10sV2xbMTVdPXJbYSsrXSxXbFsxNl09clthKytdLFdsWzE3XT1yW2ErK10sV2xbMThdPXJbYSsrXSxXbFsxOV09clthKytdO2NvbnN0IHQ9ZWwoZSxXbCxpKTtlIT09dCYmaS5mcmFtZUJ1ZmZlck1hbmFnZXIucmVsZWFzZVRlbXBvcmFyeUF0dGFjaG1lbnQoZSksZT10fWJyZWFrO2Nhc2UgMzp7Y29uc3QgdD1yW2ErK10sbj1yW2ErK10scz10Km4sbz1uZXcgRmxvYXQzMkFycmF5KHMpO2ZvcihsZXQgZT0wO2U8cztlKyspb1tlXT1yW2ErK107Y29uc3QgbD1ibChlLHQsbixvLHJbYSsrXSxyW2ErK10sQm9vbGVhbihyW2ErK10pLEJvb2xlYW4oclthKytdKSxyW2ErK10sclthKytdLGkpO2UhPT1sJiZpLmZyYW1lQnVmZmVyTWFuYWdlci5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChlKSxlPWx9YnJlYWs7Y2FzZSA0Ontjb25zdCB0PXJbYSsrXSxuPW5ldyBVaW50OEFycmF5KHQpO2ZvcihsZXQgZT0wO2U8dDtlKyspbltlXT1yW2ErK107Y29uc3Qgcz1SbChlLDAsbixyW2ErK10sclthKytdLHJbYSsrXSxyW2ErK10sclthKytdLHJbYSsrXSxyW2ErK10sclthKytdLHJbYSsrXSxyW2ErK10sclthKytdLDAsaSk7ZSE9PXMmJmkuZnJhbWVCdWZmZXJNYW5hZ2VyLnJlbGVhc2VUZW1wb3JhcnlBdHRhY2htZW50KGUpLGU9c31icmVhaztjYXNlIDU6e2NvbnN0IHM9b2woZSx0LHJbYSsrXSxyW2ErK10sclthKytdLHJbYSsrXSxyW2ErK10sclthKytdLHJbYSsrXSxyW2ErK10sQm9vbGVhbihyW2ErK10pLEJvb2xlYW4oclthKytdKSxCb29sZWFuKHJbYSsrXSksbixpKTtlIT09cyYmaS5mcmFtZUJ1ZmZlck1hbmFnZXIucmVsZWFzZVRlbXBvcmFyeUF0dGFjaG1lbnQoZSksZT1zfWJyZWFrO2Nhc2UgNjp7Y29uc3Qgcz1ubChlLHQsclthKytdLHJbYSsrXSxyW2ErK10sclthKytdLHJbYSsrXSxyW2ErK10sQm9vbGVhbihyW2ErK10pLEJvb2xlYW4oclthKytdKSxuLGkpO2UhPT1zJiZpLmZyYW1lQnVmZmVyTWFuYWdlci5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChlKSxlPXN9YnJlYWs7Y2FzZSA3Ontjb25zdCBzPXJbYSsrXSxvPXJbYSsrXSxsPXJbYSsrXSxjPW5ldyBGbG9hdDMyQXJyYXkobCk7Zm9yKGxldCBlPTA7ZTxsO2UrKyljW2VdPXJbYSsrXTtjb25zdCB1PXJbYSsrXSxmPW5ldyBGbG9hdDMyQXJyYXkodSk7Zm9yKGxldCBlPTA7ZTx1O2UrKylmW2VdPXJbYSsrXTtjb25zdCBkPXJbYSsrXSxoPW5ldyBGbG9hdDMyQXJyYXkoZCk7Zm9yKGxldCBlPTA7ZTxkO2UrKyloW2VdPXJbYSsrXTtjb25zdCBwPU1sKGUsdCxzLG8sYyxmLGgsclthKytdLHJbYSsrXSxyW2ErK10sclthKytdLHJbYSsrXSxCb29sZWFuKHJbYSsrXSksbixpKTtlIT09cCYmaS5mcmFtZUJ1ZmZlck1hbmFnZXIucmVsZWFzZVRlbXBvcmFyeUF0dGFjaG1lbnQoZSksZT1wfWJyZWFrO2Nhc2UgODp7Y29uc3Qgcz1yW2ErK10sbz1yW2ErK10sbD1yW2ErK10sYz1uZXcgRmxvYXQzMkFycmF5KGwpO2ZvcihsZXQgZT0wO2U8bDtlKyspY1tlXT1yW2ErK107Y29uc3QgdT1yW2ErK10sZj1uZXcgRmxvYXQzMkFycmF5KHUpO2ZvcihsZXQgZT0wO2U8dTtlKyspZltlXT1yW2ErK107Y29uc3QgZD1yW2ErK10saD1uZXcgRmxvYXQzMkFycmF5KGQpO2ZvcihsZXQgZT0wO2U8ZDtlKyspaFtlXT1yW2ErK107Y29uc3QgcD1UbChlLHQscyxvLGMsZixoLHJbYSsrXSxyW2ErK10sclthKytdLHJbYSsrXSxyW2ErK10sQm9vbGVhbihyW2ErK10pLG4saSk7ZSE9PXAmJmkuZnJhbWVCdWZmZXJNYW5hZ2VyLnJlbGVhc2VUZW1wb3JhcnlBdHRhY2htZW50KGUpLGU9cH19cmV0dXJuIGV9KShyLGksbCxzLGgpLGMmJih5bi5zZXQoYywiZktleSIsdSkseW4uc2V0KGMsImZUZXh0dXJlIixyKSkscil7bGV0IGU9cixsPW51bGw7S2woYSl8fChsPUhsKGgscixhKSxlPWwpO2NvbnN0IHU9TWF0aC5zcXJ0KGlbMF0qaVswXStpWzFdKmlbMV0pLGY9TWF0aC5zcXJ0KGlbMl0qaVsyXStpWzNdKmlbM10pLGQ9b1swXSoodS9zKSxtPW9bMV0qKGYvcyksZz1kK2lbNF0sYj1tK2lbNV07WmwoaCxlLHQsbixnLGIscCksbCYmaC5mcmFtZUJ1ZmZlck1hbmFnZXIucmVsZWFzZVRlbXBvcmFyeUF0dGFjaG1lbnQobCksY3x8aC5mcmFtZUJ1ZmZlck1hbmFnZXIucmVsZWFzZVRlbXBvcmFyeUF0dGFjaG1lbnQocil9fWVsc2V7bGV0IHI9UWwoaCxlLDAsMCxlLndpZHRoLGUuaGVpZ2h0KTtpZihoLmZyYW1lQnVmZmVyTWFuYWdlci5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChlKSwhS2woYSkpe2NvbnN0IGU9SGwoaCxyLGEpO2guZnJhbWVCdWZmZXJNYW5hZ2VyLnJlbGVhc2VUZW1wb3JhcnlBdHRhY2htZW50KHIpLHI9ZX1abChoLHIsdCxuLGlbNF0saVs1XSxwKSxoLmZyYW1lQnVmZmVyTWFuYWdlci5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChyKX19LGVjPW5ldyBGbG9hdDMyQXJyYXkoWzEsMSwwLDBdKSx0Yz1bXSxyYz1uZXcgRmxvYXQzMkFycmF5KFswLDAsLjUsLjUsMSwxLDEsMSwxLDAsMCwwLDEsMCwwLDAsMSwxLDAsLjUsLjUsMSwxLDEsMSwxLDAsMCwwLDEsMCwwLDAsMSwwLDEsLjUsLjUsMSwxLDEsMSwxLDAsMCwwLDEsMCwwLDAsMSwxLDAsLjUsLjUsMSwxLDEsMSwxLDAsMCwwLDEsMCwwLDAsMSwxLDEsLjUsLjUsMSwxLDEsMSwxLDAsMCwwLDEsMCwwLDAsMSwwLDEsLjUsLjUsMSwxLDEsMSwxLDAsMCwwLDEsMCwwLDAsMV0pLG5jPW5ldyBGbG9hdDMyQXJyYXkoWzAsMCwxLDAsMCwxLDEsMCwxLDEsMCwxXSksaWM9bmV3IEZsb2F0MzJBcnJheSg4KSxhYz1uZXcgRmxvYXQzMkFycmF5KDE2KTtsZXQgc2M9bnVsbCxvYz1udWxsLGxjPW51bGw7Y29uc3QgY2M9e3ZpZXc6bnVsbCxjbGVhclZhbHVlOntyOjAsZzowLGI6MCxhOjB9LGxvYWRPcDoiY2xlYXIiLHN0b3JlT3A6InN0b3JlIn0sdWM9e2NvbG9yQXR0YWNobWVudHM6W2NjXX0sZmM9W3tiaW5kaW5nOjAscmVzb3VyY2U6e2J1ZmZlcjpudWxsfX0se2JpbmRpbmc6MSxyZXNvdXJjZTpudWxsfSx7YmluZGluZzoyLHJlc291cmNlOm51bGx9XSxkYz17cjowLGc6MCxiOjAsYTowfSxoYz17dmlldzpudWxsLGNsZWFyVmFsdWU6ZGMsbG9hZE9wOiJjbGVhciIsc3RvcmVPcDoic3RvcmUiLHJlc29sdmVUYXJnZXQ6dm9pZCAwfSxwYz17dmlldzpudWxsLHN0ZW5jaWxDbGVhclZhbHVlOjAsc3RlbmNpbExvYWRPcDoiY2xlYXIiLHN0ZW5jaWxTdG9yZU9wOiJzdG9yZSJ9LG1jPXtjb2xvckF0dGFjaG1lbnRzOltoY119LGdjPXt2aWV3Om51bGwscmVzb2x2ZVRhcmdldDp2b2lkIDAsbG9hZE9wOiJsb2FkIixzdG9yZU9wOiJzdG9yZSJ9LGJjPXt2aWV3Om51bGwsc3RlbmNpbExvYWRPcDoibG9hZCIsc3RlbmNpbFN0b3JlT3A6InN0b3JlIn0seGM9e2NvbG9yQXR0YWNobWVudHM6W2djXX07Y2xhc3MgdmN7Y29uc3RydWN0b3IoZSx0LHIsbj0xKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJHN0YWNrIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRtYXRyaXgiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJGNsZWFyQ29sb3JSIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRjbGVhckNvbG9yRyIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkY2xlYXJDb2xvckIiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJGNsZWFyQ29sb3JBIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRtYWluQXR0YWNobWVudE9iamVjdCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkc3RhY2tBdHRhY2htZW50T2JqZWN0Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImdsb2JhbEFscGhhIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpbWFnZVNtb290aGluZ0VuYWJsZWQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJGZpbGxTdHlsZSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkc3Ryb2tlU3R5bGUiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywibWFza0JvdW5kcyIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJ0aGlja25lc3MiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiY2FwcyIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJqb2ludHMiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywibWl0ZXJMaW1pdCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJkZXZpY2UiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiY2FudmFzQ29udGV4dCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJwcmVmZXJyZWRGb3JtYXQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiY29tbWFuZEVuY29kZXIiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpudWxsfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInJlbmRlclBhc3NFbmNvZGVyIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bnVsbH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJtYWluVGV4dHVyZSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOm51bGx9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywibWFpblRleHR1cmVWaWV3Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bnVsbH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJmcmFtZVN0YXJ0ZWQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTohMX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJmcmFtZVRleHR1cmVzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6W119KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywicG9vbGVkVGV4dHVyZXMiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpbXX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJwb29sZWRSZW5kZXJUZXh0dXJlcyIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOltdfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImN1cnJlbnRSZW5kZXJUYXJnZXQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpudWxsfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInZpZXdwb3J0V2lkdGgiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTowfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInZpZXdwb3J0SGVpZ2h0Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6MH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJwYXRoQ29tbWFuZCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJidWZmZXJNYW5hZ2VyIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInRleHR1cmVNYW5hZ2VyIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImZyYW1lQnVmZmVyTWFuYWdlciIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJwaXBlbGluZU1hbmFnZXIiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiY29tcHV0ZVBpcGVsaW5lTWFuYWdlciIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJhdHRhY2htZW50TWFuYWdlciIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJuZXdEcmF3U3RhdGUiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTohMX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkY29udGFpbmVyTGF5ZXJTdGFjayIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOltdfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImNvbnRhaW5lckxheWVyQ29udGVudFNpemVzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6W119KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaW5NYXNrTW9kZSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOiExfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIm5vZGVBcmVhQ2xlYXJlZCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOiExfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImN1cnJlbnROb2RlU2Npc3NvciIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOm51bGx9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywibm9kZVJlbmRlclBhc3NBdGxhc0luZGV4Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6LTF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiZmlsbER5bmFtaWNCaW5kR3JvdXAiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpudWxsfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImZpbGxEeW5hbWljQmluZEdyb3VwQnVmZmVyIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bnVsbH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJub2RlQ2xlYXJRdWFkQnVmZmVyIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bnVsbH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJ1c2VPcHRpbWl6ZWRJbnN0YW5jaW5nIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJHVuaWZvcm1EYXRhOCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOm5ldyBGbG9hdDMyQXJyYXkoOCl9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJHNjaXNzb3JSZWN0Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6e3g6MCx5OjAsdzowLGg6MH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJGZpbHRlckNvbmZpZyIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLHRoaXMuZGV2aWNlPWUsdGhpcy5jYW52YXNDb250ZXh0PXQsdGhpcy5wcmVmZXJyZWRGb3JtYXQ9cixIbi5zZXREZXZpY2UoZSksSG4uc2V0RGV2aWNlUGl4ZWxSYXRpbyhuKTtjb25zdCBpPWUubGltaXRzLm1heFRleHR1cmVEaW1lbnNpb24yRCxhPU1hdGgubWF4KDIwNDgsaS8yKTt2YXIgcztIbi5zZXRSZW5kZXJNYXhTaXplKGEpLHRoaXMuJHN0YWNrPUhuLmNyZWF0ZUFycmF5KCksdGhpcy4kc3RhY2tBdHRhY2htZW50T2JqZWN0PUhuLmNyZWF0ZUFycmF5KCksdGhpcy4kbWF0cml4PUhuLmNyZWF0ZUZsb2F0MzJBcnJheSg5KSx0aGlzLiRtYXRyaXguc2V0KFsxLDAsMCwwLDEsMCwwLDAsMV0pLHRoaXMuJGNsZWFyQ29sb3JSPTAsdGhpcy4kY2xlYXJDb2xvckc9MCx0aGlzLiRjbGVhckNvbG9yQj0wLHRoaXMuJGNsZWFyQ29sb3JBPTAsdGhpcy50aGlja25lc3M9MSx0aGlzLmNhcHM9MCx0aGlzLmpvaW50cz0yLHRoaXMubWl0ZXJMaW1pdD0wLHRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0PW51bGwsdGhpcy5nbG9iYWxBbHBoYT0xLHRoaXMuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJub3JtYWwiLHRoaXMuaW1hZ2VTbW9vdGhpbmdFbmFibGVkPSExLHRoaXMuJGZpbGxTdHlsZT1uZXcgRmxvYXQzMkFycmF5KFsxLDEsMSwxXSksdGhpcy4kc3Ryb2tlU3R5bGU9bmV3IEZsb2F0MzJBcnJheShbMSwxLDEsMV0pLHRoaXMubWFza0JvdW5kcz17eE1pbjowLHlNaW46MCx4TWF4OjAseU1heDowfSx0LmNvbmZpZ3VyZSh7ZGV2aWNlOmUsZm9ybWF0OnIsYWxwaGFNb2RlOiJwcmVtdWx0aXBsaWVkIn0pLHRoaXMudmlld3BvcnRXaWR0aD10LmNhbnZhcy53aWR0aCx0aGlzLnZpZXdwb3J0SGVpZ2h0PXQuY2FudmFzLmhlaWdodCx0aGlzLnBhdGhDb21tYW5kPW5ldyBKbix0aGlzLmJ1ZmZlck1hbmFnZXI9bmV3IHNpKGUpLHRoaXMudGV4dHVyZU1hbmFnZXI9bmV3IG9pKGUpLHRoaXMuZnJhbWVCdWZmZXJNYW5hZ2VyPW5ldyBtaShlLHIpLHRoaXMucGlwZWxpbmVNYW5hZ2VyPW5ldyBwYShlLHIpLHRoaXMucGlwZWxpbmVNYW5hZ2VyLnByZWxvYWRMYXp5R3JvdXBzKCksdGhpcy5jb21wdXRlUGlwZWxpbmVNYW5hZ2VyPW5ldyBtYShlKSx0aGlzLmF0dGFjaG1lbnRNYW5hZ2VyPW5ldyBNaShlKSxzPWU9Pntjb25zdCB0PUhuLmdldFJlbmRlck1heFNpemUoKTtyZXR1cm4gdGhpcy5mcmFtZUJ1ZmZlck1hbmFnZXIuY3JlYXRlQXR0YWNobWVudChgYXRsYXNfJHtlfWAsdCx0LCExLCEwKX0sX2E9cyx0aGlzLiRmaWx0ZXJDb25maWc9e2RldmljZTp0aGlzLmRldmljZSxjb21tYW5kRW5jb2RlcjpudWxsLGJ1ZmZlck1hbmFnZXI6dGhpcy5idWZmZXJNYW5hZ2VyLGZyYW1lQnVmZmVyTWFuYWdlcjp0aGlzLmZyYW1lQnVmZmVyTWFuYWdlcixwaXBlbGluZU1hbmFnZXI6dGhpcy5waXBlbGluZU1hbmFnZXIsdGV4dHVyZU1hbmFnZXI6dGhpcy50ZXh0dXJlTWFuYWdlcixjb21wdXRlUGlwZWxpbmVNYW5hZ2VyOnRoaXMuY29tcHV0ZVBpcGVsaW5lTWFuYWdlcixmcmFtZVRleHR1cmVzOnRoaXMuZnJhbWVUZXh0dXJlc30sUW49dGhpc31jbGVhclRyYW5zZmVyQm91bmRzKCl7dGhpcy5iZWdpbkZyYW1lKCl9dXBkYXRlQmFja2dyb3VuZENvbG9yKGUsdCxyLG4pe3RoaXMuJGNsZWFyQ29sb3JSPWUsdGhpcy4kY2xlYXJDb2xvckc9dCx0aGlzLiRjbGVhckNvbG9yQj1yLHRoaXMuJGNsZWFyQ29sb3JBPW59ZmlsbEJhY2tncm91bmRDb2xvcigpe2lmKCF0aGlzLiRtYWluQXR0YWNobWVudE9iamVjdHx8IXRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0LnRleHR1cmUpcmV0dXJuO3RoaXMuZnJhbWVTdGFydGVkfHx0aGlzLmJlZ2luRnJhbWUoKSx0aGlzLnJlbmRlclBhc3NFbmNvZGVyJiYodGhpcy5yZW5kZXJQYXNzRW5jb2Rlci5lbmQoKSx0aGlzLnJlbmRlclBhc3NFbmNvZGVyPW51bGwpLHRoaXMuZW5zdXJlQ29tbWFuZEVuY29kZXIoKTtjb25zdCBlPXRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0Lm1zYWEmJnRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0Lm1zYWFUZXh0dXJlPy52aWV3O2hjLnZpZXc9ZT90aGlzLiRtYWluQXR0YWNobWVudE9iamVjdC5tc2FhVGV4dHVyZS52aWV3OnRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0LnRleHR1cmUudmlldyxoYy5yZXNvbHZlVGFyZ2V0PWU/dGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3QudGV4dHVyZS52aWV3OnZvaWQgMCxkYy5yPXRoaXMuJGNsZWFyQ29sb3JSLGRjLmc9dGhpcy4kY2xlYXJDb2xvckcsZGMuYj10aGlzLiRjbGVhckNvbG9yQixkYy5hPXRoaXMuJGNsZWFyQ29sb3JBO2NvbnN0IHQ9ZSYmdGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3QubXNhYVN0ZW5jaWw/LnZpZXc/dGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3QubXNhYVN0ZW5jaWwudmlldzp0aGlzLiRtYWluQXR0YWNobWVudE9iamVjdC5zdGVuY2lsPy52aWV3O3Q/KHBjLnZpZXc9dCxtYy5kZXB0aFN0ZW5jaWxBdHRhY2htZW50PXBjKTptYy5kZXB0aFN0ZW5jaWxBdHRhY2htZW50PXZvaWQgMCx0aGlzLnJlbmRlclBhc3NFbmNvZGVyPXRoaXMuY29tbWFuZEVuY29kZXIuYmVnaW5SZW5kZXJQYXNzKG1jKSx0aGlzLnJlbmRlclBhc3NFbmNvZGVyLmVuZCgpLHRoaXMucmVuZGVyUGFzc0VuY29kZXI9bnVsbH1yZXNpemUoZSx0LHI9ITApe3RoaXMuY2xlYXJBcnJheXNJbnN0YW5jZWQoKTtmb3IoY29uc3QgZSBvZiB0aGlzLmZyYW1lVGV4dHVyZXMpZS5kZXN0cm95KCk7dGhpcy5mcmFtZVRleHR1cmVzLmxlbmd0aD0wO2Zvcihjb25zdCBlIG9mIHRoaXMucG9vbGVkVGV4dHVyZXMpQXMoZSk7dGhpcy5wb29sZWRUZXh0dXJlcy5sZW5ndGg9MDtmb3IoY29uc3QgZSBvZiB0aGlzLnBvb2xlZFJlbmRlclRleHR1cmVzKUNzKGUpO3RoaXMucG9vbGVkUmVuZGVyVGV4dHVyZXMubGVuZ3RoPTAsKCgpPT57Zm9yKGNvbnN0WyxlXW9mIFRzKWZvcihjb25zdCB0IG9mIGUpdC5kZXN0cm95KCk7VHMuY2xlYXIoKTtmb3IoY29uc3RbLGVdb2YgQnMpZm9yKGNvbnN0IHQgb2YgZSl0LmRlc3Ryb3koKTtCcy5jbGVhcigpfSkoKSx0aGlzLmZyYW1lU3RhcnRlZD0hMSx0aGlzLmNvbW1hbmRFbmNvZGVyPW51bGwsdGhpcy5yZW5kZXJQYXNzRW5jb2Rlcj1udWxsLHRoaXMuY3VycmVudFJlbmRlclRhcmdldD1udWxsLHphPSExLE5hPSExLFdhPTAsSGEuY2xlYXIoKSxRYS5jbGVhcigpO2NvbnN0IG49dGhpcy5jYW52YXNDb250ZXh0LmNhbnZhcztpZihuJiYid2lkdGgiaW4gbiYmImhlaWdodCJpbiBuJiYobi53aWR0aD1lLG4uaGVpZ2h0PXQpLHRoaXMuJHN0YWNrQXR0YWNobWVudE9iamVjdC5sZW5ndGgpe2ZvcihsZXQgZT0wO2U8dGhpcy4kc3RhY2tBdHRhY2htZW50T2JqZWN0Lmxlbmd0aDsrK2Upe2NvbnN0IHQ9dGhpcy4kc3RhY2tBdHRhY2htZW50T2JqZWN0W2VdO3QmJih0LnRleHR1cmUmJnQudGV4dHVyZS5yZXNvdXJjZS5kZXN0cm95KCksdC5zdGVuY2lsJiZ0LnN0ZW5jaWwucmVzb3VyY2UuZGVzdHJveSgpLHQubXNhYVRleHR1cmUmJnQubXNhYVRleHR1cmUucmVzb3VyY2UuZGVzdHJveSgpLHQubXNhYVN0ZW5jaWwmJnQubXNhYVN0ZW5jaWwucmVzb3VyY2UuZGVzdHJveSgpKX10aGlzLiRzdGFja0F0dGFjaG1lbnRPYmplY3QubGVuZ3RoPTB9dGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3QmJnRoaXMuZnJhbWVCdWZmZXJNYW5hZ2VyLmRlc3Ryb3lBdHRhY2htZW50KCJtYWluIiksciYmKCgoKT0+e2Zvcihjb25zdCBlIG9mIEVzLnZhbHVlcygpKWUudGV4dHVyZT8ucmVzb3VyY2UmJmUudGV4dHVyZS5yZXNvdXJjZS5kZXN0cm95KCk7RXMuY2xlYXIoKX0pKCksKCgpPT57Zm9yKGNvbnN0IGUgb2YgVXMudmFsdWVzKCkpQXMoZS50ZXh0dXJlKTtVcy5jbGVhcigpLCRzPTB9KSgpLElzPy50ZXh0dXJlPy5yZXNvdXJjZSYmSXMudGV4dHVyZS5yZXNvdXJjZS5kZXN0cm95KCksSXM9bnVsbCxBYSgpLHRoaXMuZnJhbWVCdWZmZXJNYW5hZ2VyLmRlc3Ryb3lBdHRhY2htZW50KCJhdGxhcyIpLHRoaXMuZnJhbWVCdWZmZXJNYW5hZ2VyLmNyZWF0ZUF0dGFjaG1lbnQoImF0bGFzIiw0MDk2LDQwOTYsITEsITApKSx0aGlzLmZyYW1lQnVmZmVyTWFuYWdlci5zZXRDdXJyZW50QXR0YWNobWVudChudWxsKSx0aGlzLmNhbnZhc0NvbnRleHQuY29uZmlndXJlKHtkZXZpY2U6dGhpcy5kZXZpY2UsZm9ybWF0OnRoaXMucHJlZmVycmVkRm9ybWF0LGFscGhhTW9kZToicHJlbXVsdGlwbGllZCJ9KSx0aGlzLm1haW5UZXh0dXJlPW51bGwsdGhpcy5tYWluVGV4dHVyZVZpZXc9bnVsbCx0aGlzLiRtYWluQXR0YWNobWVudE9iamVjdD10aGlzLmZyYW1lQnVmZmVyTWFuYWdlci5jcmVhdGVBdHRhY2htZW50KCJtYWluIixlLHQsITAsITApLHRoaXMuYmluZCh0aGlzLiRtYWluQXR0YWNobWVudE9iamVjdCl9Y2xlYXJSZWN0KGUsdCxyLG4pe31zYXZlKCl7Y29uc3QgZT10Yy5sZW5ndGg+MD90Yy5wb3AoKTpuZXcgRmxvYXQzMkFycmF5KDkpO2Uuc2V0KHRoaXMuJG1hdHJpeCksdGhpcy4kc3RhY2sucHVzaChlKX1yZXN0b3JlKCl7Y29uc3QgZT10aGlzLiRzdGFjay5wb3AoKTtlJiYodGhpcy4kbWF0cml4LnNldChlKSx0Yy5wdXNoKGUpKX1zZXRUcmFuc2Zvcm0oZSx0LHIsbixpLGEpe3RoaXMuJG1hdHJpeFswXT1lLHRoaXMuJG1hdHJpeFsxXT10LHRoaXMuJG1hdHJpeFszXT1yLHRoaXMuJG1hdHJpeFs0XT1uLHRoaXMuJG1hdHJpeFs2XT1pLHRoaXMuJG1hdHJpeFs3XT1hfXRyYW5zZm9ybShlLHQscixuLGksYSl7Y29uc3Qgcz10aGlzLiRtYXRyaXgsbz1zWzBdLGw9c1sxXSxjPXNbM10sdT1zWzRdLGY9c1s2XSxkPXNbN107c1swXT1lKm8rdCpjLHNbMV09ZSpsK3QqdSxzWzNdPXIqbytuKmMsc1s0XT1yKmwrbip1LHNbNl09aSpvK2EqYytmLHNbN109aSpsK2EqdStkfXJlc2V0KCl7dGhpcy4kbWF0cml4LnNldChbMSwwLDAsMCwxLDAsMCwwLDFdKSx0aGlzLiRzdGFjay5sZW5ndGg9MCx0aGlzLiRzdGFja0F0dGFjaG1lbnRPYmplY3QubGVuZ3RoPTAsdGhpcy5nbG9iYWxBbHBoYT0xLHRoaXMuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJub3JtYWwiLHRoaXMuaW1hZ2VTbW9vdGhpbmdFbmFibGVkPSExfWJlZ2luUGF0aCgpe3RoaXMucGF0aENvbW1hbmQuYmVnaW5QYXRoKCl9bW92ZVRvKGUsdCl7dGhpcy5wYXRoQ29tbWFuZC5tb3ZlVG8oZSx0KX1saW5lVG8oZSx0KXt0aGlzLnBhdGhDb21tYW5kLmxpbmVUbyhlLHQpfXF1YWRyYXRpY0N1cnZlVG8oZSx0LHIsbil7dGhpcy5wYXRoQ29tbWFuZC5xdWFkcmF0aWNDdXJ2ZVRvKGUsdCxyLG4pfWZpbGxTdHlsZShlLHQscixuKXt0aGlzLiRmaWxsU3R5bGVbMF09ZSx0aGlzLiRmaWxsU3R5bGVbMV09dCx0aGlzLiRmaWxsU3R5bGVbMl09cix0aGlzLiRmaWxsU3R5bGVbM109bn1zdHJva2VTdHlsZShlLHQscixuKXt0aGlzLiRzdHJva2VTdHlsZVswXT1lLHRoaXMuJHN0cm9rZVN0eWxlWzFdPXQsdGhpcy4kc3Ryb2tlU3R5bGVbMl09cix0aGlzLiRzdHJva2VTdHlsZVszXT1ufWNsb3NlUGF0aCgpe3RoaXMucGF0aENvbW1hbmQuY2xvc2VQYXRoKCl9YXJjKGUsdCxyKXt0aGlzLnBhdGhDb21tYW5kLmFyYyhlLHQscil9YmV6aWVyQ3VydmVUbyhlLHQscixuLGksYSl7dGhpcy5wYXRoQ29tbWFuZC5iZXppZXJDdXJ2ZVRvKGUsdCxyLG4saSxhKX1lbnN1cmVGaWxsUmVuZGVyUGFzcygpe2lmKHRoaXMuZnJhbWVTdGFydGVkfHx0aGlzLmJlZ2luRnJhbWUoKSx0aGlzLmVuc3VyZUNvbW1hbmRFbmNvZGVyKCksdGhpcy5yZW5kZXJQYXNzRW5jb2Rlcil0aGlzLmN1cnJlbnRSZW5kZXJUYXJnZXQmJnRoaXMuZW5zdXJlTm9kZUFyZWFDbGVhcmVkKCk7ZWxzZXt7Y29uc3QgZT10aGlzLmdldEN1cnJlbnRUZXh0dXJlVmlldygpLHQ9d2EoKSxyPXQ/Lm1zYWEmJnQ/Lm1zYWFUZXh0dXJlPy52aWV3LG49cj90Lm1zYWFUZXh0dXJlLnZpZXc6ZSxpPXI/ZTpudWxsO2lmKHRoaXMuY3VycmVudFJlbmRlclRhcmdldCYmdD8uc3RlbmNpbD8udmlldyl7Y29uc3QgZT1yJiZ0Py5tc2FhU3RlbmNpbD8udmlldz90Lm1zYWFTdGVuY2lsLnZpZXc6dC5zdGVuY2lsLnZpZXcsYT10aGlzLmZyYW1lQnVmZmVyTWFuYWdlci5jcmVhdGVTdGVuY2lsUmVuZGVyUGFzc0Rlc2NyaXB0b3IobixlLCJsb2FkIiwiY2xlYXIiLGkpO3RoaXMucmVuZGVyUGFzc0VuY29kZXI9dGhpcy5jb21tYW5kRW5jb2Rlci5iZWdpblJlbmRlclBhc3MoYSl9ZWxzZSBpZighdGhpcy5jdXJyZW50UmVuZGVyVGFyZ2V0JiYoWGEoKXx8RGEoKSkmJnRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0Py5zdGVuY2lsPy52aWV3KXtjb25zdCBlPXRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0Lm1zYWEmJnRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0Lm1zYWFUZXh0dXJlPy52aWV3LHQ9ZT90aGlzLiRtYWluQXR0YWNobWVudE9iamVjdC5tc2FhVGV4dHVyZS52aWV3OnRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0LnRleHR1cmUudmlldyxyPWUmJnRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0Lm1zYWFTdGVuY2lsPy52aWV3P3RoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0Lm1zYWFTdGVuY2lsLnZpZXc6dGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3Quc3RlbmNpbC52aWV3LG49ZT90aGlzLiRtYWluQXR0YWNobWVudE9iamVjdC50ZXh0dXJlLnZpZXc6bnVsbCxpPXRoaXMuZnJhbWVCdWZmZXJNYW5hZ2VyLmNyZWF0ZVN0ZW5jaWxSZW5kZXJQYXNzRGVzY3JpcHRvcih0LHIsImxvYWQiLCJsb2FkIixuKTt0aGlzLnJlbmRlclBhc3NFbmNvZGVyPXRoaXMuY29tbWFuZEVuY29kZXIuYmVnaW5SZW5kZXJQYXNzKGkpLFhhKCkmJnRoaXMucmVuZGVyUGFzc0VuY29kZXIuc2V0U3RlbmNpbFJlZmVyZW5jZShLYSgpKX1lbHNlIGlmKCF0aGlzLmN1cnJlbnRSZW5kZXJUYXJnZXQmJnRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0KXtjb25zdCBlPXRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0Lm1zYWEmJnRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0Lm1zYWFUZXh0dXJlPy52aWV3LHQ9ZT90aGlzLiRtYWluQXR0YWNobWVudE9iamVjdC5tc2FhVGV4dHVyZS52aWV3OnRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0LnRleHR1cmUudmlldyxyPWU/dGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3QudGV4dHVyZS52aWV3Om51bGw7aWYodGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3Quc3RlbmNpbD8udmlldyl7Y29uc3Qgbj1lJiZ0aGlzLiRtYWluQXR0YWNobWVudE9iamVjdC5tc2FhU3RlbmNpbD8udmlldz90aGlzLiRtYWluQXR0YWNobWVudE9iamVjdC5tc2FhU3RlbmNpbC52aWV3OnRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0LnN0ZW5jaWwudmlldyxpPXRoaXMuZnJhbWVCdWZmZXJNYW5hZ2VyLmNyZWF0ZVN0ZW5jaWxSZW5kZXJQYXNzRGVzY3JpcHRvcih0LG4sImxvYWQiLCJjbGVhciIscik7dGhpcy5yZW5kZXJQYXNzRW5jb2Rlcj10aGlzLmNvbW1hbmRFbmNvZGVyLmJlZ2luUmVuZGVyUGFzcyhpKX1lbHNle2NvbnN0IGU9dGhpcy5mcmFtZUJ1ZmZlck1hbmFnZXIuY3JlYXRlUmVuZGVyUGFzc0Rlc2NyaXB0b3IodCwwLDAsMCwwLCJsb2FkIixyKTt0aGlzLnJlbmRlclBhc3NFbmNvZGVyPXRoaXMuY29tbWFuZEVuY29kZXIuYmVnaW5SZW5kZXJQYXNzKGUpfX1lbHNle2NvbnN0IGU9dGhpcy5mcmFtZUJ1ZmZlck1hbmFnZXIuY3JlYXRlUmVuZGVyUGFzc0Rlc2NyaXB0b3IobiwwLDAsMCwwLCJsb2FkIixpKTt0aGlzLnJlbmRlclBhc3NFbmNvZGVyPXRoaXMuY29tbWFuZEVuY29kZXIuYmVnaW5SZW5kZXJQYXNzKGUpfX10aGlzLmN1cnJlbnRSZW5kZXJUYXJnZXQmJnRoaXMuZW5zdXJlTm9kZUFyZWFDbGVhcmVkKCl9fWZpbGwoKXtjb25zdCBlPXRoaXMucGF0aENvbW1hbmQuJGdldFZlcnRpY2VzO2lmKDA9PT1lLmxlbmd0aClyZXR1cm47dGhpcy5lbnN1cmVGaWxsUmVuZGVyUGFzcygpO2NvbnN0IHQ9dGhpcy52aWV3cG9ydFdpZHRoLHI9dGhpcy52aWV3cG9ydEhlaWdodCxuPW5zKGUpO2lmKDA9PT1uLmluZGV4Q291bnQpcmV0dXJuO2NvbnN0IGk9dGhpcy5idWZmZXJNYW5hZ2VyLmFjcXVpcmVWZXJ0ZXhCdWZmZXIobi5idWZmZXIuYnl0ZUxlbmd0aCxuLmJ1ZmZlciksYT10aGlzLndyaXRlRmlsbFVuaWZvcm0odGhpcy4kZmlsbFN0eWxlWzBdLHRoaXMuJGZpbGxTdHlsZVsxXSx0aGlzLiRmaWxsU3R5bGVbMl0sdGhpcy4kZmlsbFN0eWxlWzNdLHRoaXMuJG1hdHJpeFswXSx0aGlzLiRtYXRyaXhbMV0sdGhpcy4kbWF0cml4WzNdLHRoaXMuJG1hdHJpeFs0XSx0aGlzLiRtYXRyaXhbNl0sdGhpcy4kbWF0cml4WzddLHQscikscz10aGlzLmdldE9yQ3JlYXRlRmlsbER5bmFtaWNCaW5kR3JvdXAoKSxvPXdhKCk7aWYodGhpcy5jdXJyZW50UmVuZGVyVGFyZ2V0JiZvPy5zdGVuY2lsPy52aWV3KXRoaXMuZmlsbFdpdGhTdGVuY2lsKGksbi5pbmRleENvdW50LHMsYSk7ZWxzZSBpZih0aGlzLmN1cnJlbnRSZW5kZXJUYXJnZXR8fHRoaXMuaW5NYXNrTW9kZXx8WGEoKXx8IXRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0Py5zdGVuY2lsPy52aWV3KXtjb25zdCBlPSh0aGlzLmluTWFza01vZGV8fFhhKCkpJiYhIXRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0Py5zdGVuY2lsPy52aWV3JiYhdGhpcy5jdXJyZW50UmVuZGVyVGFyZ2V0O3RoaXMuZmlsbFNpbXBsZShpLG4uaW5kZXhDb3VudCxlLHMsYSl9ZWxzZSB0aGlzLmZpbGxXaXRoU3RlbmNpbE1haW4oaSxuLmluZGV4Q291bnQscyxhKX1nZXRPckNyZWF0ZUZpbGxEeW5hbWljQmluZEdyb3VwKCl7Y29uc3QgZT10aGlzLmJ1ZmZlck1hbmFnZXIuZHluYW1pY1VuaWZvcm0uZ2V0QnVmZmVyKCk7aWYoIXRoaXMuZmlsbER5bmFtaWNCaW5kR3JvdXB8fHRoaXMuZmlsbER5bmFtaWNCaW5kR3JvdXBCdWZmZXIhPT1lKXtjb25zdCB0PXRoaXMucGlwZWxpbmVNYW5hZ2VyLmdldEJpbmRHcm91cExheW91dCgiZmlsbF9keW5hbWljIik7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJbV2ViR1BVXSBmaWxsX2R5bmFtaWMgYmluZCBncm91cCBsYXlvdXQgbm90IGZvdW5kIik7dGhpcy5maWxsRHluYW1pY0JpbmRHcm91cD10aGlzLmRldmljZS5jcmVhdGVCaW5kR3JvdXAoe2xheW91dDp0LGVudHJpZXM6W3tiaW5kaW5nOjAscmVzb3VyY2U6e2J1ZmZlcjplLHNpemU6MjU2fX1dfSksdGhpcy5maWxsRHluYW1pY0JpbmRHcm91cEJ1ZmZlcj1lfXJldHVybiB0aGlzLmZpbGxEeW5hbWljQmluZEdyb3VwfXdyaXRlRmlsbFVuaWZvcm0oZSx0LHIsbixpLGEscyxvLGwsYyx1LGYpe3JldHVybiBhY1swXT1lLGFjWzFdPXQsYWNbMl09cixhY1szXT1uLGFjWzRdPWkvdSxhY1s1XT1hL2YsYWNbNl09MCxhY1s3XT0wLGFjWzhdPXMvdSxhY1s5XT1vL2YsYWNbMTBdPTAsYWNbMTFdPTAsYWNbMTJdPWwvdSxhY1sxM109Yy9mLGFjWzE0XT0xLGFjWzE1XT0wLHRoaXMuYnVmZmVyTWFuYWdlci5keW5hbWljVW5pZm9ybS5hbGxvY2F0ZShhYyl9ZmlsbFdpdGhTdGVuY2lsKGUsdCxyLG4peygoZSx0LHIsbixpLGEpPT57Y29uc3Qgcz10LmdldFBpcGVsaW5lKCJzdGVuY2lsX3dyaXRlX2F0bGFzIik7cyYmKGUuc2V0UGlwZWxpbmUocyksZS5zZXRTdGVuY2lsUmVmZXJlbmNlKDApLGUuc2V0VmVydGV4QnVmZmVyKDAsciksZS5zZXRCaW5kR3JvdXAoMCxpLFthXSksZS5kcmF3KG4sMSwwLDApKTtjb25zdCBvPXQuZ2V0UGlwZWxpbmUoInN0ZW5jaWxfZmlsbF9hdGxhcyIpO28mJihlLnNldFBpcGVsaW5lKG8pLGUuc2V0U3RlbmNpbFJlZmVyZW5jZSgwKSxlLnNldEJpbmRHcm91cCgwLGksW2FdKSxlLmRyYXcobiwxLDAsMCkpfSkodGhpcy5yZW5kZXJQYXNzRW5jb2Rlcix0aGlzLnBpcGVsaW5lTWFuYWdlcixlLHQscixuKX1maWxsV2l0aFN0ZW5jaWxNYWluKGUsdCxyLG4peygoZSx0LHIsbixpLGEpPT57Y29uc3Qgcz10LmdldFBpcGVsaW5lKCJzdGVuY2lsX3dyaXRlX21haW4iKTtzJiYoZS5zZXRQaXBlbGluZShzKSxlLnNldFN0ZW5jaWxSZWZlcmVuY2UoMCksZS5zZXRWZXJ0ZXhCdWZmZXIoMCxyKSxlLnNldEJpbmRHcm91cCgwLGksW2FdKSxlLmRyYXcobiwxLDAsMCkpO2NvbnN0IG89dC5nZXRQaXBlbGluZSgic3RlbmNpbF9maWxsX21haW4iKTtvJiYoZS5zZXRQaXBlbGluZShvKSxlLnNldFN0ZW5jaWxSZWZlcmVuY2UoMCksZS5zZXRCaW5kR3JvdXAoMCxpLFthXSksZS5kcmF3KG4sMSwwLDApKX0pKHRoaXMucmVuZGVyUGFzc0VuY29kZXIsdGhpcy5waXBlbGluZU1hbmFnZXIsZSx0LHIsbil9ZmlsbFNpbXBsZShlLHQscixuLGkpe2NvbnN0IGE9dGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3Q/LmNsaXBMZXZlbD8/MTsoKGUsdCxyLG4saSxhLHMsbz0hMSk9PntsZXQgbDtpZihzKWw9ImZpbGwiO2Vsc2UgaWYobyl7aWYoRGEoKSlyZXR1cm47bD0iZmlsbF9iZ3JhX3N0ZW5jaWwifWVsc2UgbD0iZmlsbF9iZ3JhIjtjb25zdCBjPXQuZ2V0UGlwZWxpbmUobCk7Yz8oZS5zZXRQaXBlbGluZShjKSxlLnNldFZlcnRleEJ1ZmZlcigwLHIpLGUuc2V0QmluZEdyb3VwKDAsaSxbYV0pLCFvfHxzfHxEYSgpfHxlLnNldFN0ZW5jaWxSZWZlcmVuY2UoS2EoKSksZS5kcmF3KG4sMSwwLDApKTpjb25zb2xlLmVycm9yKGBbV2ViR1BVXSAke2x9IHBpcGVsaW5lIG5vdCBmb3VuZGApfSkodGhpcy5yZW5kZXJQYXNzRW5jb2Rlcix0aGlzLnBpcGVsaW5lTWFuYWdlcixlLHQsbixpLCEhdGhpcy5jdXJyZW50UmVuZGVyVGFyZ2V0LHIsYSl9YmluZEF0dGFjaG1lbnQoZSl7dGhpcy5hdHRhY2htZW50TWFuYWdlci5iaW5kQXR0YWNobWVudChlKTtjb25zdCB0PWUuY29sb3I/LnZpZXc/P2UudGV4dHVyZT8udmlldzt0JiYodGhpcy5jdXJyZW50UmVuZGVyVGFyZ2V0PXQpfXVuYmluZEF0dGFjaG1lbnQoKXt0aGlzLmF0dGFjaG1lbnRNYW5hZ2VyLnVuYmluZEF0dGFjaG1lbnQoKSx0aGlzLmN1cnJlbnRSZW5kZXJUYXJnZXQ9bnVsbH1nZXRBdHRhY2htZW50T2JqZWN0KGUsdCxyPSExKXtyZXR1cm4gdGhpcy5hdHRhY2htZW50TWFuYWdlci5nZXRBdHRhY2htZW50T2JqZWN0KGUsdCxyKX1yZWxlYXNlQXR0YWNobWVudChlKXt0aGlzLmF0dGFjaG1lbnRNYW5hZ2VyLnJlbGVhc2VBdHRhY2htZW50KGUpfXN0cm9rZSgpe2NvbnN0IGU9dGhpcy5wYXRoQ29tbWFuZC5nZXRWZXJ0aWNlc0ZvclN0cm9rZSgpO2lmKDA9PT1lLmxlbmd0aClyZXR1cm47dGhpcy5lbnN1cmVGaWxsUmVuZGVyUGFzcygpO2NvbnN0IHQ9dGhpcy52aWV3cG9ydFdpZHRoLHI9dGhpcy52aWV3cG9ydEhlaWdodCxuPSgoZSx0KT0+e2NvbnN0IHI9dC8yLG49W107Zm9yKGNvbnN0IHQgb2YgZSl7aWYodC5sZW5ndGg8Niljb250aW51ZTtjb25zdCBlPXdzKHQscik7Zm9yKGNvbnN0IHQgb2YgZSluLnB1c2godCl9cmV0dXJuIG59KShlLHRoaXMudGhpY2tuZXNzKTtpZigwPT09bi5sZW5ndGgpcmV0dXJuO2NvbnN0IGk9bnMobik7aWYoMD09PWkuaW5kZXhDb3VudClyZXR1cm47Y29uc3QgYT10aGlzLmJ1ZmZlck1hbmFnZXIuYWNxdWlyZVZlcnRleEJ1ZmZlcihpLmJ1ZmZlci5ieXRlTGVuZ3RoLGkuYnVmZmVyKSxzPXRoaXMud3JpdGVGaWxsVW5pZm9ybSh0aGlzLiRzdHJva2VTdHlsZVswXSx0aGlzLiRzdHJva2VTdHlsZVsxXSx0aGlzLiRzdHJva2VTdHlsZVsyXSx0aGlzLiRzdHJva2VTdHlsZVszXSx0aGlzLiRtYXRyaXhbMF0sdGhpcy4kbWF0cml4WzFdLHRoaXMuJG1hdHJpeFszXSx0aGlzLiRtYXRyaXhbNF0sdGhpcy4kbWF0cml4WzZdLHRoaXMuJG1hdHJpeFs3XSx0LHIpLG89dGhpcy5nZXRPckNyZWF0ZUZpbGxEeW5hbWljQmluZEdyb3VwKCksbD13YSgpO2lmKHRoaXMuY3VycmVudFJlbmRlclRhcmdldCYmbD8uc3RlbmNpbD8udmlldyl0aGlzLmZpbGxXaXRoU3RlbmNpbChhLGkuaW5kZXhDb3VudCxvLHMpO2Vsc2UgaWYodGhpcy5jdXJyZW50UmVuZGVyVGFyZ2V0fHx0aGlzLmluTWFza01vZGV8fFhhKCl8fCF0aGlzLiRtYWluQXR0YWNobWVudE9iamVjdD8uc3RlbmNpbD8udmlldyl7Y29uc3QgZT0odGhpcy5pbk1hc2tNb2RlfHxYYSgpKSYmISF0aGlzLiRtYWluQXR0YWNobWVudE9iamVjdD8uc3RlbmNpbD8udmlldyYmIXRoaXMuY3VycmVudFJlbmRlclRhcmdldDt0aGlzLmZpbGxTaW1wbGUoYSxpLmluZGV4Q291bnQsZSxvLHMpfWVsc2UgdGhpcy5maWxsV2l0aFN0ZW5jaWxNYWluKGEsaS5pbmRleENvdW50LG8scyk7dGhpcy5wYXRoQ29tbWFuZC5yZXNldCgpfWdyYWRpZW50RmlsbChlLHQscixuLGksYSl7Y29uc3Qgcz10aGlzLnBhdGhDb21tYW5kLiRnZXRWZXJ0aWNlcztpZigwPT09cy5sZW5ndGgpcmV0dXJuO3RoaXMuZW5zdXJlRmlsbFJlbmRlclBhc3MoKTtjb25zdCBvPXRoaXMudmlld3BvcnRXaWR0aCxsPXRoaXMudmlld3BvcnRIZWlnaHQsYz0hKCF0aGlzLmluTWFza01vZGUmJiFYYSgpfHwhdGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3Q/LnN0ZW5jaWw/LnZpZXd8fHRoaXMuY3VycmVudFJlbmRlclRhcmdldCksdT0hIXRoaXMuY3VycmVudFJlbmRlclRhcmdldCxmPSgoZSx0LHIsbixpLGEscyxvLGwsYyx1LGYsZCxoLHAsbSxnPSExKT0+e2NvbnN0IGI9bnMoaSk7aWYoMD09PWIuaW5kZXhDb3VudClyZXR1cm4gbnVsbDtjb25zdCB4PXIuYWNxdWlyZVZlcnRleEJ1ZmZlcihiLmJ1ZmZlci5ieXRlTGVuZ3RoLGIuYnVmZmVyKTtsZXQgdix5O2NvbnN0IF89a3MobCx1LGYpO2lmKF8pdj1fLnRleHR1cmUseT1fLnZpZXc7ZWxzZXtjb25zdCB0PXpzKGwsMCxmKSxyPWwubGVuZ3RoLzUsbj1WcyhyKTt2PU9zKGUsbiwxKSxlLnF1ZXVlLndyaXRlVGV4dHVyZSh7dGV4dHVyZTp2fSx0LHtieXRlc1BlclJvdzo0Km4scm93c1BlckltYWdlOjF9LHt3aWR0aDpuLGhlaWdodDoxfSkseT12LmNyZWF0ZVZpZXcoKSxMcyhsLHUsZix2LHkpfWNvbnN0IHc9WHMoYywwLG8pLE09c1szXT4wP3NbM106MSxQPWFbMF0sUz1hWzFdLEY9YVszXSxUPWFbNF0sQj1hWzZdLE89YVs3XTtLc1swXT13LmludmVyc2VNYXRyaXhbMF0sS3NbMV09dy5pbnZlcnNlTWF0cml4WzNdLEtzWzJdPTAsS3NbM109MCxLc1s0XT13LmludmVyc2VNYXRyaXhbMV0sS3NbNV09dy5pbnZlcnNlTWF0cml4WzRdLEtzWzZdPTAsS3NbN109MCxLc1s4XT13LmludmVyc2VNYXRyaXhbNl0sS3NbOV09dy5pbnZlcnNlTWF0cml4WzddLEtzWzEwXT0xLEtzWzExXT0wLEtzWzEyXT1vLEtzWzEzXT1NYXRoLm1heCgtLjk3NSxNYXRoLm1pbiguOTc1LGQpKSxLc1sxNF09dSxLc1sxNV09ODE5LjIsdy5saW5lYXJQb2ludHM/KEtzWzE2XT13LmxpbmVhclBvaW50c1swXSxLc1sxN109dy5saW5lYXJQb2ludHNbMV0sS3NbMThdPXcubGluZWFyUG9pbnRzWzJdLEtzWzE5XT13LmxpbmVhclBvaW50c1szXSk6KEtzWzE2XT0wLEtzWzE3XT0wLEtzWzE4XT0wLEtzWzE5XT0wKSxLc1syMF09MSxLc1syMV09MSxLc1syMl09MSxLc1syM109TSxLc1syNF09UC9oLEtzWzI1XT1TL3AsS3NbMjZdPTAsS3NbMjddPTAsS3NbMjhdPUYvaCxLc1syOV09VC9wLEtzWzMwXT0wLEtzWzMxXT0wLEtzWzMyXT1CL2gsS3NbMzNdPU8vcCxLc1szNF09MSxLc1szNV09MDtjb25zdCBBPXIuYWNxdWlyZUFuZFdyaXRlVW5pZm9ybUJ1ZmZlcihLcyk7WXN8fChZcz1lLmNyZWF0ZVNhbXBsZXIoe21hZ0ZpbHRlcjoibGluZWFyIixtaW5GaWx0ZXI6ImxpbmVhciIsYWRkcmVzc01vZGVVOiJjbGFtcC10by1lZGdlIixhZGRyZXNzTW9kZVY6ImNsYW1wLXRvLWVkZ2UifSkpO2NvbnN0IFI9WXMsQz1uLmdldEJpbmRHcm91cExheW91dCgiZ3JhZGllbnRfZmlsbCIpO2lmKCFDKXJldHVybiBjb25zb2xlLmVycm9yKCJbV2ViR1BVXSBncmFkaWVudF9maWxsIGJpbmQgZ3JvdXAgbGF5b3V0IG5vdCBmb3VuZCIpLG51bGw7SnNbMF0ucmVzb3VyY2UuYnVmZmVyPUEsSnNbMV0ucmVzb3VyY2U9UixKc1syXS5yZXNvdXJjZT15O2NvbnN0IEU9ZS5jcmVhdGVCaW5kR3JvdXAoe2xheW91dDpDLGVudHJpZXM6SnN9KSxVPSgpPT57Y29uc3QgdD1uLmdldEJpbmRHcm91cExheW91dCgiZmlsbF9keW5hbWljIik7aWYoIXQpcmV0dXJuIG51bGw7SHNbMF09MSxIc1sxXT0xLEhzWzJdPTEsSHNbM109TSxIc1s0XT1QL2gsSHNbNV09Uy9wLEhzWzZdPTAsSHNbN109MCxIc1s4XT1GL2gsSHNbOV09VC9wLEhzWzEwXT0wLEhzWzExXT0wLEhzWzEyXT1CL2gsSHNbMTNdPU8vcCxIc1sxNF09MSxIc1sxNV09MDtjb25zdCBpPXIuZHluYW1pY1VuaWZvcm0uYWxsb2NhdGUoSHMpLGE9ci5keW5hbWljVW5pZm9ybS5nZXRCdWZmZXIoKTtyZXR1cm4gUXMmJlpzPT09YXx8KFFzPWUuY3JlYXRlQmluZEdyb3VwKHtsYXlvdXQ6dCxlbnRyaWVzOlt7YmluZGluZzowLHJlc291cmNlOntidWZmZXI6YSxzaXplOjI1Nn19XX0pLFpzPWEpLHtiaW5kR3JvdXA6UXMsb2Zmc2V0Oml9fTtpZihtKXtjb25zdCBlPW4uZ2V0UGlwZWxpbmUoInN0ZW5jaWxfd3JpdGVfYXRsYXMiKTtpZihlKXtjb25zdCByPVUoKTt0LnNldFBpcGVsaW5lKGUpLHQuc2V0U3RlbmNpbFJlZmVyZW5jZSgwKSx0LnNldFZlcnRleEJ1ZmZlcigwLHgpLHImJnQuc2V0QmluZEdyb3VwKDAsci5iaW5kR3JvdXAsW3Iub2Zmc2V0XSksdC5kcmF3KGIuaW5kZXhDb3VudCwxLDAsMCl9Y29uc3Qgcj1uLmdldEdyYWRpZW50UGlwZWxpbmUoImdyYWRpZW50X2ZpbGxfc3RlbmNpbF9hdGxhcyIsbyx1KTtyZXR1cm4gciYmKHQuc2V0UGlwZWxpbmUociksdC5zZXRTdGVuY2lsUmVmZXJlbmNlKDApLHQuc2V0QmluZEdyb3VwKDAsRSksdC5kcmF3KGIuaW5kZXhDb3VudCwxLDAsMCkpLG51bGx9aWYoZyYmRGEoKSlyZXR1cm4gbnVsbDtjb25zdCAkPW4uZ2V0UGlwZWxpbmUoInN0ZW5jaWxfd3JpdGVfbWFpbiIpO2lmKCQpe2NvbnN0IGU9VSgpO3Quc2V0UGlwZWxpbmUoJCksdC5zZXRTdGVuY2lsUmVmZXJlbmNlKDApLHQuc2V0VmVydGV4QnVmZmVyKDAseCksZSYmdC5zZXRCaW5kR3JvdXAoMCxlLmJpbmRHcm91cCxbZS5vZmZzZXRdKSx0LmRyYXcoYi5pbmRleENvdW50LDEsMCwwKX1jb25zdCBHPWc/ImdyYWRpZW50X2ZpbGxfYmdyYV9zdGVuY2lsX21hc2tlZCI6ImdyYWRpZW50X2ZpbGxfc3RlbmNpbF9tYWluIixrPW4uZ2V0R3JhZGllbnRQaXBlbGluZShHLG8sdSk7cmV0dXJuIGsmJih0LnNldFBpcGVsaW5lKGspLHQuc2V0U3RlbmNpbFJlZmVyZW5jZShnP0thKCk6MCksdC5zZXRCaW5kR3JvdXAoMCxFKSx0LmRyYXcoYi5pbmRleENvdW50LDEsMCwwKSksbnVsbH0pKHRoaXMuZGV2aWNlLHRoaXMucmVuZGVyUGFzc0VuY29kZXIsdGhpcy5idWZmZXJNYW5hZ2VyLHRoaXMucGlwZWxpbmVNYW5hZ2VyLHMsdGhpcy4kbWF0cml4LHRoaXMuJGZpbGxTdHlsZSxlLHQscixuLGksYSxvLGwsdSxjLHRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0Py5jbGlwTGV2ZWw/PzEpO2YmJnRoaXMuYWRkRnJhbWVUZXh0dXJlKGYpLHRoaXMuYmVnaW5QYXRoKCl9Yml0bWFwRmlsbChlLHQscixuLGksYSl7Y29uc3Qgcz10aGlzLnBhdGhDb21tYW5kLiRnZXRWZXJ0aWNlcztpZigwPT09cy5sZW5ndGgpcmV0dXJuO3RoaXMuZW5zdXJlRmlsbFJlbmRlclBhc3MoKTtjb25zdCBvPXdhKCksbD0hKCF0aGlzLmN1cnJlbnRSZW5kZXJUYXJnZXR8fCFvPy5zdGVuY2lsPy52aWV3KSxjPSEoIXRoaXMuaW5NYXNrTW9kZSYmIVhhKCl8fCF0aGlzLiRtYWluQXR0YWNobWVudE9iamVjdD8uc3RlbmNpbD8udmlld3x8dGhpcy5jdXJyZW50UmVuZGVyVGFyZ2V0KSx1PWx8fGMsZj10aGlzLiRtYWluQXR0YWNobWVudE9iamVjdD8uY2xpcExldmVsPz8xLGQ9b28odGhpcy5kZXZpY2UsdGhpcy5yZW5kZXJQYXNzRW5jb2Rlcix0aGlzLmJ1ZmZlck1hbmFnZXIsdGhpcy5waXBlbGluZU1hbmFnZXIscyx0aGlzLiRtYXRyaXgsdGhpcy4kZmlsbFN0eWxlLGUsdCxyLG4saSxhLHRoaXMudmlld3BvcnRXaWR0aCx0aGlzLnZpZXdwb3J0SGVpZ2h0LCEhdGhpcy5jdXJyZW50UmVuZGVyVGFyZ2V0LCEhdSxmKTtkJiZ0aGlzLmFkZEZyYW1lVGV4dHVyZShkKSx0aGlzLmJlZ2luUGF0aCgpfWdyYWRpZW50U3Ryb2tlKGUsdCxyLG4saSxhKXtjb25zdCBzPXRoaXMucGF0aENvbW1hbmQuZ2V0VmVydGljZXNGb3JTdHJva2UoKTtpZigwPT09cy5sZW5ndGgpcmV0dXJuO3RoaXMuZW5zdXJlRmlsbFJlbmRlclBhc3MoKTtjb25zdCBvPXdhKCksbD0hKCF0aGlzLmN1cnJlbnRSZW5kZXJUYXJnZXR8fCFvPy5zdGVuY2lsPy52aWV3KSxjPSEodGhpcy5jdXJyZW50UmVuZGVyVGFyZ2V0fHwhdGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3Q/LnN0ZW5jaWw/LnZpZXcpLHU9bHx8YyxmPXBvKHRoaXMuZGV2aWNlLHRoaXMucmVuZGVyUGFzc0VuY29kZXIsdGhpcy5idWZmZXJNYW5hZ2VyLHRoaXMucGlwZWxpbmVNYW5hZ2VyLHMsdGhpcy50aGlja25lc3MsdGhpcy4kbWF0cml4LHRoaXMuJHN0cm9rZVN0eWxlLGUsdCxyLG4saSxhLHRoaXMudmlld3BvcnRXaWR0aCx0aGlzLnZpZXdwb3J0SGVpZ2h0LCEhdGhpcy5jdXJyZW50UmVuZGVyVGFyZ2V0LHUpO2YmJnRoaXMuYWRkRnJhbWVUZXh0dXJlKGYpLHRoaXMucGF0aENvbW1hbmQucmVzZXQoKX1iaXRtYXBTdHJva2UoZSx0LHIsbixpLGEpe2NvbnN0IHM9dGhpcy5wYXRoQ29tbWFuZC5nZXRWZXJ0aWNlc0ZvclN0cm9rZSgpO2lmKDA9PT1zLmxlbmd0aClyZXR1cm47dGhpcy5lbnN1cmVGaWxsUmVuZGVyUGFzcygpO2NvbnN0IG89d2EoKSxsPSEoIXRoaXMuY3VycmVudFJlbmRlclRhcmdldHx8IW8/LnN0ZW5jaWw/LnZpZXcpLGM9ISh0aGlzLmN1cnJlbnRSZW5kZXJUYXJnZXR8fCF0aGlzLiRtYWluQXR0YWNobWVudE9iamVjdD8uc3RlbmNpbD8udmlldyksdT1sfHxjLGY9dm8odGhpcy5kZXZpY2UsdGhpcy5yZW5kZXJQYXNzRW5jb2Rlcix0aGlzLmJ1ZmZlck1hbmFnZXIsdGhpcy5waXBlbGluZU1hbmFnZXIscyx0aGlzLnRoaWNrbmVzcyx0aGlzLiRtYXRyaXgsdGhpcy4kc3Ryb2tlU3R5bGUsZSx0LHIsbixpLGEsdGhpcy52aWV3cG9ydFdpZHRoLHRoaXMudmlld3BvcnRIZWlnaHQsISF0aGlzLmN1cnJlbnRSZW5kZXJUYXJnZXQsdSk7ZiYmdGhpcy5hZGRGcmFtZVRleHR1cmUoZiksdGhpcy5wYXRoQ29tbWFuZC5yZXNldCgpfWNsaXAoKXtsZXQgZT10aGlzLmZyYW1lQnVmZmVyTWFuYWdlci5nZXRDdXJyZW50QXR0YWNobWVudCgpO2NvbnN0IHQ9IWV8fGU9PT10aGlzLiRtYWluQXR0YWNobWVudE9iamVjdDtpZighZSYmdGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3QmJihlPXRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0KSwhZSlyZXR1cm47aWYoIWUuc3RlbmNpbClyZXR1cm47Y29uc3Qgcj10aGlzLnBhdGhDb21tYW5kLiRnZXRWZXJ0aWNlcztpZigwIT09ci5sZW5ndGgpe2lmKCF0aGlzLnJlbmRlclBhc3NFbmNvZGVyKXtpZih0aGlzLmVuc3VyZUNvbW1hbmRFbmNvZGVyKCksIXR8fCF0aGlzLiRtYWluQXR0YWNobWVudE9iamVjdD8uc3RlbmNpbD8udmlldylyZXR1cm47e2NvbnN0IGU9dGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3QubXNhYSYmdGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3QubXNhYVRleHR1cmU/LnZpZXcsdD1lP3RoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0Lm1zYWFUZXh0dXJlLnZpZXc6dGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3QudGV4dHVyZS52aWV3LHI9ZSYmdGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3QubXNhYVN0ZW5jaWw/LnZpZXc/dGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3QubXNhYVN0ZW5jaWwudmlldzp0aGlzLiRtYWluQXR0YWNobWVudE9iamVjdC5zdGVuY2lsLnZpZXcsbj10aGlzLmZyYW1lQnVmZmVyTWFuYWdlci5jcmVhdGVTdGVuY2lsUmVuZGVyUGFzc0Rlc2NyaXB0b3IodCxyLCJsb2FkIiwibG9hZCIpO3RoaXMucmVuZGVyUGFzc0VuY29kZXI9dGhpcy5jb21tYW5kRW5jb2Rlci5iZWdpblJlbmRlclBhc3Mobil9fU1vKHRoaXMuZGV2aWNlLHRoaXMucmVuZGVyUGFzc0VuY29kZXIsdGhpcy5idWZmZXJNYW5hZ2VyLHRoaXMucGlwZWxpbmVNYW5hZ2VyLGUscix0aGlzLiRtYXRyaXgsdGhpcy4kZmlsbFN0eWxlLHRoaXMuZ2xvYmFsQWxwaGEsdCl9fWJpbmQoZSl7dGhpcy5mcmFtZUJ1ZmZlck1hbmFnZXIuc2V0Q3VycmVudEF0dGFjaG1lbnQoZSksdGhpcy52aWV3cG9ydFdpZHRoPWUud2lkdGgsdGhpcy52aWV3cG9ydEhlaWdodD1lLmhlaWdodH1nZXQgY3VycmVudEF0dGFjaG1lbnRPYmplY3QoKXtyZXR1cm4gdGhpcy5mcmFtZUJ1ZmZlck1hbmFnZXIuZ2V0Q3VycmVudEF0dGFjaG1lbnQoKXx8dGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3R9Z2V0IGF0bGFzQXR0YWNobWVudE9iamVjdCgpe3JldHVybiB3YSgpfXVzZUdyaWQoZSl7TXMuc2V0KFBzLGUpfWJlZ2luTm9kZVJlbmRlcmluZyhlKXt0aGlzLm5vZGVBcmVhQ2xlYXJlZD0hMSx0aGlzLmZyYW1lU3RhcnRlZHx8dGhpcy5iZWdpbkZyYW1lKCk7Y29uc3QgdD1NYShlLmluZGV4KXx8d2EoKTtpZih0JiZ0LnRleHR1cmUpe2lmKHRoaXMucmVuZGVyUGFzc0VuY29kZXImJnRoaXMubm9kZVJlbmRlclBhc3NBdGxhc0luZGV4PT09ZS5pbmRleCl0aGlzLmN1cnJlbnRSZW5kZXJUYXJnZXQ9dC50ZXh0dXJlLnZpZXcsdGhpcy52aWV3cG9ydFdpZHRoPXQud2lkdGgsdGhpcy52aWV3cG9ydEhlaWdodD10LmhlaWdodDtlbHNle3RoaXMucmVuZGVyUGFzc0VuY29kZXImJih0aGlzLnJlbmRlclBhc3NFbmNvZGVyLmVuZCgpLHRoaXMucmVuZGVyUGFzc0VuY29kZXI9bnVsbCksdGhpcy5jdXJyZW50UmVuZGVyVGFyZ2V0PXQudGV4dHVyZS52aWV3LHRoaXMudmlld3BvcnRXaWR0aD10LndpZHRoLHRoaXMudmlld3BvcnRIZWlnaHQ9dC5oZWlnaHQsdGhpcy5lbnN1cmVDb21tYW5kRW5jb2RlcigpO2NvbnN0IHI9dC5tc2FhJiZ0Lm1zYWFUZXh0dXJlPy52aWV3LG49cj90Lm1zYWFUZXh0dXJlLnZpZXc6dC50ZXh0dXJlLnZpZXcsaT1yP3QudGV4dHVyZS52aWV3Om51bGw7aWYodC5zdGVuY2lsPy52aWV3KXtjb25zdCBlPXImJnQubXNhYVN0ZW5jaWw/LnZpZXc/dC5tc2FhU3RlbmNpbC52aWV3OnQuc3RlbmNpbC52aWV3LGE9dGhpcy5mcmFtZUJ1ZmZlck1hbmFnZXIuY3JlYXRlU3RlbmNpbFJlbmRlclBhc3NEZXNjcmlwdG9yKG4sZSwibG9hZCIsImxvYWQiLGkpO3RoaXMucmVuZGVyUGFzc0VuY29kZXI9dGhpcy5jb21tYW5kRW5jb2Rlci5iZWdpblJlbmRlclBhc3MoYSl9ZWxzZXtjb25zdCBlPXRoaXMuZnJhbWVCdWZmZXJNYW5hZ2VyLmNyZWF0ZVJlbmRlclBhc3NEZXNjcmlwdG9yKG4sMCwwLDAsMCwibG9hZCIsaSk7dGhpcy5yZW5kZXJQYXNzRW5jb2Rlcj10aGlzLmNvbW1hbmRFbmNvZGVyLmJlZ2luUmVuZGVyUGFzcyhlKX10aGlzLm5vZGVSZW5kZXJQYXNzQXRsYXNJbmRleD1lLmluZGV4fWxldCByPU1hdGgubWF4KDAsZS54KSxuPU1hdGgubWF4KDAsZS55KSxpPU1hdGgubWluKGUudyx0LndpZHRoLXIpLGE9TWF0aC5taW4oZS5oLHQuaGVpZ2h0LW4pO2lmKHI9TWF0aC5taW4ocix0LndpZHRoKSxuPU1hdGgubWluKG4sdC5oZWlnaHQpLGk9TWF0aC5tYXgoMCxNYXRoLm1pbihpLHQud2lkdGgtcikpLGE9TWF0aC5tYXgoMCxNYXRoLm1pbihhLHQuaGVpZ2h0LW4pKSx0aGlzLiRzY2lzc29yUmVjdC54PXIsdGhpcy4kc2Npc3NvclJlY3QueT1uLHRoaXMuJHNjaXNzb3JSZWN0Lnc9aSx0aGlzLiRzY2lzc29yUmVjdC5oPWEsdGhpcy5jdXJyZW50Tm9kZVNjaXNzb3I9dGhpcy4kc2Npc3NvclJlY3QsaT4wJiZhPjApe2NvbnN0IGU9TWF0aC5taW4oaSsxLHQud2lkdGgtcikscz1NYXRoLm1pbihhKzEsdC5oZWlnaHQtbik7dGhpcy5yZW5kZXJQYXNzRW5jb2Rlci5zZXRTY2lzc29yUmVjdChyLG4sZSxzKX19fWVuc3VyZU5vZGVBcmVhQ2xlYXJlZCgpe3RoaXMubm9kZUFyZWFDbGVhcmVkfHwodGhpcy5ub2RlQXJlYUNsZWFyZWQ9ITAsdGhpcy5jbGVhck5vZGVBcmVhKCkpfWNsZWFyTm9kZUFyZWEoKXtpZighdGhpcy5yZW5kZXJQYXNzRW5jb2RlcilyZXR1cm47Y29uc3QgZT10aGlzLnBpcGVsaW5lTWFuYWdlci5nZXRQaXBlbGluZSgibm9kZV9jbGVhcl9hdGxhcyIpO2lmKCFlKXJldHVybjtpZighdGhpcy5ub2RlQ2xlYXJRdWFkQnVmZmVyKXtjb25zdCBlPXRoaXMuZGV2aWNlLmNyZWF0ZUJ1ZmZlcih7c2l6ZTpuYy5ieXRlTGVuZ3RoLHVzYWdlOkdQVUJ1ZmZlclVzYWdlLlZFUlRFWHxHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVCxtYXBwZWRBdENyZWF0aW9uOiEwfSk7bmV3IEZsb2F0MzJBcnJheShlLmdldE1hcHBlZFJhbmdlKCkpLnNldChuYyksZS51bm1hcCgpLHRoaXMubm9kZUNsZWFyUXVhZEJ1ZmZlcj1lfWNvbnN0IHQ9dGhpcy5ub2RlQ2xlYXJRdWFkQnVmZmVyO3RoaXMucmVuZGVyUGFzc0VuY29kZXIuc2V0UGlwZWxpbmUoZSksdGhpcy5yZW5kZXJQYXNzRW5jb2Rlci5zZXRWZXJ0ZXhCdWZmZXIoMCx0KSx0aGlzLnJlbmRlclBhc3NFbmNvZGVyLmRyYXcoNiksdGhpcy5jdXJyZW50Tm9kZVNjaXNzb3ImJnRoaXMucmVuZGVyUGFzc0VuY29kZXIuc2V0U2Npc3NvclJlY3QodGhpcy5jdXJyZW50Tm9kZVNjaXNzb3IueCx0aGlzLmN1cnJlbnROb2RlU2Npc3Nvci55LHRoaXMuY3VycmVudE5vZGVTY2lzc29yLncsdGhpcy5jdXJyZW50Tm9kZVNjaXNzb3IuaCl9ZW5kTm9kZVJlbmRlcmluZygpe3RoaXMuY3VycmVudFJlbmRlclRhcmdldD1udWxsLHRoaXMuY3VycmVudE5vZGVTY2lzc29yPW51bGwsdGhpcy52aWV3cG9ydFdpZHRoPXRoaXMuY2FudmFzQ29udGV4dC5jYW52YXMud2lkdGgsdGhpcy52aWV3cG9ydEhlaWdodD10aGlzLmNhbnZhc0NvbnRleHQuY2FudmFzLmhlaWdodH1kcmF3RmlsbCgpe01zLmNsZWFyKCksUHM9MH1kcmF3RGlzcGxheU9iamVjdChlLHQscixuLGksYSl7Y29uc3Qgcz1Ibi5nZXRSZW5kZXJNYXhTaXplKCk7KChlLHQscixuLGksYSxzLG8sbCxjLHUsZik9Pntjb25zdCBkPWFbMF0saD1hWzFdLHA9YVsyXSxtPWYsZz1hWzRdLzI1NSxiPWFbNV0vMjU1LHg9YVs2XS8yNTU7aWYoVWEuaGFzKG8pKXtDYT09PW8mJk9hKCk9PT1lLmluZGV4fHwoUW4mJih2YShPYSgpKSxRbi5kcmF3QXJyYXlzSW5zdGFuY2VkKCkpLEVhKG8pLEJhKGUuaW5kZXgpLHZhKGUuaW5kZXgpKTtjb25zdCB0PVZhKCk7bnIucHVzaEluc3RhbmNlQnVmZmVyKChlLngrLjUpL3UsKGUueSsuNSkvdSwoZS53LTEpL3UsKGUuaC0xKS91LGUudyxlLmgsbCxjLHNbNl0sc1s3XSwwLDAsc1swXSxzWzFdLHNbM10sc1s0XSxkLGgscCxtLGcsYix4LDApLHQuY291bnQrK31lbHNle1FuJiYodmEoT2EoKSksUW4uZHJhd0FycmF5c0luc3RhbmNlZCgpKTtjb25zdCBkPUdhLmxlbmd0aD4wP0dhLnBvcCgpOm5ldyBGbG9hdDMyQXJyYXkoOCk7ZC5zZXQoYSk7Y29uc3QgaD1rYS5sZW5ndGg+MD9rYS5wb3AoKTpuZXcgRmxvYXQzMkFycmF5KDkpO2guc2V0KHMpLCRhLnB1c2goe25vZGU6ZSx4X21pbjp0LHlfbWluOnIseF9tYXg6bix5X21heDppLGNvbG9yX3RyYW5zZm9ybTpkLG1hdHJpeDpoLGJsZW5kX21vZGU6byx2aWV3cG9ydF93aWR0aDpsLHZpZXdwb3J0X2hlaWdodDpjLHJlbmRlcl9tYXhfc2l6ZTp1LGdsb2JhbF9hbHBoYTpmfSksRWEobyksQmEoZS5pbmRleCksdmEoZS5pbmRleCl9fSkoZSx0LHIsbixpLGEsdGhpcy4kbWF0cml4LHRoaXMuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uLHRoaXMudmlld3BvcnRXaWR0aCx0aGlzLnZpZXdwb3J0SGVpZ2h0LHMsdGhpcy5nbG9iYWxBbHBoYSl9ZHJhd0FycmF5c0luc3RhbmNlZCgpe3RoaXMuZnJhbWVTdGFydGVkfHx0aGlzLmJlZ2luRnJhbWUoKSx0aGlzLnJlbmRlclBhc3NFbmNvZGVyJiYodGhpcy5yZW5kZXJQYXNzRW5jb2Rlci5lbmQoKSx0aGlzLnJlbmRlclBhc3NFbmNvZGVyPW51bGwpLHRoaXMubm9kZVJlbmRlclBhc3NBdGxhc0luZGV4PS0xLHRoaXMuZW5zdXJlQ29tbWFuZEVuY29kZXIoKSx0aGlzLiRtYWluQXR0YWNobWVudE9iamVjdCYmKHRoaXMudXNlT3B0aW1pemVkSW5zdGFuY2luZz90aGlzLnJlbmRlclBhc3NFbmNvZGVyPSgoZSx0LHIsbixpLGEscyxvLGw9ITAsYz0hMCk9Pntjb25zdCB1PVZhKCk7aWYoMD09PXUuY291bnQpcmV0dXJuIHI7ciYmKHIuZW5kKCkscj1udWxsKTtjb25zdCBmPVhhKCksZD1LYSgpLGg9KGU9Pntzd2l0Y2goZSl7Y2FzZSJhZGQiOnJldHVybiJpbnN0YW5jZWRfYWRkIjtjYXNlInNjcmVlbiI6cmV0dXJuImluc3RhbmNlZF9zY3JlZW4iO2Nhc2UiYWxwaGEiOnJldHVybiJpbnN0YW5jZWRfYWxwaGEiO2Nhc2UiZXJhc2UiOnJldHVybiJpbnN0YW5jZWRfZXJhc2UiO2Nhc2UiY29weSI6cmV0dXJuImluc3RhbmNlZF9jb3B5IjtkZWZhdWx0OnJldHVybiJpbnN0YW5jZWQifX0pKENhKSxwPW8uZ2V0UGlwZWxpbmUoaCksbT1vLmdldFBpcGVsaW5lKCJpbnN0YW5jZWRfbWFza2VkIiksZz1mJiZtJiYobi5tc2FhU3RlbmNpbD8udmlld3x8bi5zdGVuY2lsPy52aWV3KSxiPWc/bTpwO2lmKCFiKXJldHVybiBjb25zb2xlLmVycm9yKCJbV2ViR1BVXSBJbnN0YW5jZWQgcGlwZWxpbmUgbm90IGZvdW5kIiksbnVsbDtsZXQgeDtpZihnKXtjb25zdCBlPW4ubXNhYSYmbi5tc2FhVGV4dHVyZT8udmlldyxyPWU/bi5tc2FhVGV4dHVyZS52aWV3Om4udGV4dHVyZS52aWV3LGk9ZSYmbi5tc2FhU3RlbmNpbD8udmlldz9uLm1zYWFTdGVuY2lsLnZpZXc6bi5zdGVuY2lsLnZpZXcscz1lP24udGV4dHVyZS52aWV3Om51bGwsbz1hLmNyZWF0ZVN0ZW5jaWxSZW5kZXJQYXNzRGVzY3JpcHRvcihyLGksImxvYWQiLCJsb2FkIixzKTt4PXQuYmVnaW5SZW5kZXJQYXNzKG8pfWVsc2V7Y29uc3QgZT1uLm1zYWEmJm4ubXNhYVRleHR1cmU/LnZpZXcscj1lP24ubXNhYVRleHR1cmUudmlldzpuLnRleHR1cmUudmlldyxpPWU/bi50ZXh0dXJlLnZpZXc6bnVsbCxzPWEuY3JlYXRlUmVuZGVyUGFzc0Rlc2NyaXB0b3IociwwLDAsMCwwLCJsb2FkIixpKTt4PXQuYmVnaW5SZW5kZXJQYXNzKHMpfXguc2V0UGlwZWxpbmUoYiksZyYmeC5zZXRTdGVuY2lsUmVmZXJlbmNlKGQpO2NvbnN0IHY9bmV3IEZsb2F0MzJBcnJheShuci5idWZmZXIuYnVmZmVyLG5yLmJ1ZmZlci5ieXRlT2Zmc2V0LG5yLm9mZnNldCk7bGV0IHk7Yz8oeT1pLmFjcXVpcmVTdG9yYWdlQnVmZmVyKHYuYnl0ZUxlbmd0aCksaS53cml0ZVN0b3JhZ2VCdWZmZXIoeSx2KSk6eT1pLmFjcXVpcmVWZXJ0ZXhCdWZmZXIodi5ieXRlTGVuZ3RoLHYpO2NvbnN0IF89aS5nZXRVbml0UmVjdEJ1ZmZlcigpLHc9d2EoKXx8YS5nZXRBdHRhY2htZW50KCJhdGxhcyIpO2lmKCF3KXJldHVybiBjb25zb2xlLmVycm9yKCJbV2ViR1BVXSBBdGxhcyBhdHRhY2htZW50IG5vdCBmb3VuZCIpLHguZW5kKCksbnVsbDtjb25zdCBNPXMuY3JlYXRlU2FtcGxlcigiYXRsYXNfaW5zdGFuY2VkX3NhbXBsZXIiLCExKSxQPW8uZ2V0QmluZEdyb3VwTGF5b3V0KCJpbnN0YW5jZWQiKTtpZighUClyZXR1cm4gY29uc29sZS5lcnJvcigiW1dlYkdQVV0gSW5zdGFuY2VkIGJpbmQgZ3JvdXAgbGF5b3V0IG5vdCBmb3VuZCIpLHguZW5kKCksbnVsbDtjb25zdCBTPXcudGV4dHVyZS52aWV3O2lmKEZvJiZUbz09PVN8fChGbz1lLmNyZWF0ZUJpbmRHcm91cCh7bGF5b3V0OlAsZW50cmllczpbe2JpbmRpbmc6MCxyZXNvdXJjZTpNfSx7YmluZGluZzoxLHJlc291cmNlOlN9XX0pLFRvPVMpLHguc2V0VmVydGV4QnVmZmVyKDAsXykseC5zZXRWZXJ0ZXhCdWZmZXIoMSx5KSx4LnNldEJpbmRHcm91cCgwLEZvKSxsKXtjb25zdCBlPWkuY3JlYXRlSW5kaXJlY3RCdWZmZXIoNix1LmNvdW50LDAsMCk7eC5kcmF3SW5kaXJlY3QoZSwwKX1lbHNlIHguZHJhdyg2LHUuY291bnQsMCwwKTtyZXR1cm4geC5lbmQoKSx1LmNsZWFyKCksbnVsbH0pKHRoaXMuZGV2aWNlLHRoaXMuY29tbWFuZEVuY29kZXIsdGhpcy5yZW5kZXJQYXNzRW5jb2Rlcix0aGlzLiRtYWluQXR0YWNobWVudE9iamVjdCx0aGlzLmJ1ZmZlck1hbmFnZXIsdGhpcy5mcmFtZUJ1ZmZlck1hbmFnZXIsdGhpcy50ZXh0dXJlTWFuYWdlcix0aGlzLnBpcGVsaW5lTWFuYWdlciwhMCwhMCk6dGhpcy5yZW5kZXJQYXNzRW5jb2Rlcj0oKGUsdCxyLG4saSxhLHMsbyk9Pntjb25zdCBsPVZhKCk7aWYoMD09PWwuY291bnQpcmV0dXJuIHI7ciYmKHIuZW5kKCkscj1udWxsKTtjb25zdCBjPVhhKCksdT1LYSgpLGY9KGU9Pntzd2l0Y2goZSl7Y2FzZSJhZGQiOnJldHVybiJpbnN0YW5jZWRfYWRkIjtjYXNlInNjcmVlbiI6cmV0dXJuImluc3RhbmNlZF9zY3JlZW4iO2Nhc2UiYWxwaGEiOnJldHVybiJpbnN0YW5jZWRfYWxwaGEiO2Nhc2UiZXJhc2UiOnJldHVybiJpbnN0YW5jZWRfZXJhc2UiO2Nhc2UiY29weSI6cmV0dXJuImluc3RhbmNlZF9jb3B5IjtkZWZhdWx0OnJldHVybiJpbnN0YW5jZWQifX0pKENhKSxkPW8uZ2V0UGlwZWxpbmUoZiksaD1vLmdldFBpcGVsaW5lKCJpbnN0YW5jZWRfbWFza2VkIikscD1jJiZoJiYobi5tc2FhU3RlbmNpbD8udmlld3x8bi5zdGVuY2lsPy52aWV3KSxtPXA/aDpkO2lmKCFtKXJldHVybiBjb25zb2xlLmVycm9yKCJbV2ViR1BVXSBJbnN0YW5jZWQgcGlwZWxpbmUgbm90IGZvdW5kIiksbnVsbDtsZXQgZztpZihwKXtjb25zdCBlPW4ubXNhYSYmbi5tc2FhVGV4dHVyZT8udmlldyxyPWU/bi5tc2FhVGV4dHVyZS52aWV3Om4udGV4dHVyZS52aWV3LGk9ZSYmbi5tc2FhU3RlbmNpbD8udmlldz9uLm1zYWFTdGVuY2lsLnZpZXc6bi5zdGVuY2lsLnZpZXcscz1lP24udGV4dHVyZS52aWV3Om51bGwsbz1hLmNyZWF0ZVN0ZW5jaWxSZW5kZXJQYXNzRGVzY3JpcHRvcihyLGksImxvYWQiLCJsb2FkIixzKTtnPXQuYmVnaW5SZW5kZXJQYXNzKG8pfWVsc2V7Y29uc3QgZT1uLm1zYWEmJm4ubXNhYVRleHR1cmU/LnZpZXcscj1lP24ubXNhYVRleHR1cmUudmlldzpuLnRleHR1cmUudmlldyxpPWU/bi50ZXh0dXJlLnZpZXc6bnVsbCxzPWEuY3JlYXRlUmVuZGVyUGFzc0Rlc2NyaXB0b3IociwwLDAsMCwwLCJsb2FkIixpKTtnPXQuYmVnaW5SZW5kZXJQYXNzKHMpfWcuc2V0UGlwZWxpbmUobSkscCYmZy5zZXRTdGVuY2lsUmVmZXJlbmNlKHUpO2NvbnN0IGI9bmV3IEZsb2F0MzJBcnJheShuci5idWZmZXIuYnVmZmVyLG5yLmJ1ZmZlci5ieXRlT2Zmc2V0LG5yLm9mZnNldCkseD1pLmFjcXVpcmVWZXJ0ZXhCdWZmZXIoYi5ieXRlTGVuZ3RoLGIpLHY9aS5nZXRVbml0UmVjdEJ1ZmZlcigpLHk9d2EoKXx8YS5nZXRBdHRhY2htZW50KCJhdGxhcyIpO2lmKCF5KXJldHVybiBjb25zb2xlLmVycm9yKCJbV2ViR1BVXSBBdGxhcyBhdHRhY2htZW50IG5vdCBmb3VuZCIpLGcuZW5kKCksbnVsbDtjb25zdCBfPXMuY3JlYXRlU2FtcGxlcigiYXRsYXNfaW5zdGFuY2VkX3NhbXBsZXIiLCExKSx3PW8uZ2V0QmluZEdyb3VwTGF5b3V0KCJpbnN0YW5jZWQiKTtpZighdylyZXR1cm4gY29uc29sZS5lcnJvcigiW1dlYkdQVV0gSW5zdGFuY2VkIGJpbmQgZ3JvdXAgbGF5b3V0IG5vdCBmb3VuZCIpLGcuZW5kKCksbnVsbDtjb25zdCBNPXkudGV4dHVyZS52aWV3O3JldHVybiBQbyYmU289PT1NfHwoUG89ZS5jcmVhdGVCaW5kR3JvdXAoe2xheW91dDp3LGVudHJpZXM6W3tiaW5kaW5nOjAscmVzb3VyY2U6X30se2JpbmRpbmc6MSxyZXNvdXJjZTpNfV19KSxTbz1NKSxnLnNldFZlcnRleEJ1ZmZlcigwLHYpLGcuc2V0VmVydGV4QnVmZmVyKDEseCksZy5zZXRCaW5kR3JvdXAoMCxQbyksZy5kcmF3KDYsbC5jb3VudCwwLDApLGcuZW5kKCksbC5jbGVhcigpLG51bGx9KSh0aGlzLmRldmljZSx0aGlzLmNvbW1hbmRFbmNvZGVyLHRoaXMucmVuZGVyUGFzc0VuY29kZXIsdGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3QsdGhpcy5idWZmZXJNYW5hZ2VyLHRoaXMuZnJhbWVCdWZmZXJNYW5hZ2VyLHRoaXMudGV4dHVyZU1hbmFnZXIsdGhpcy5waXBlbGluZU1hbmFnZXIpLHRoaXMucHJvY2Vzc0NvbXBsZXhCbGVuZFF1ZXVlKCkpfXNldE9wdGltaXplZEluc3RhbmNpbmcoZSl7dGhpcy51c2VPcHRpbWl6ZWRJbnN0YW5jaW5nPWV9aXNPcHRpbWl6ZWRJbnN0YW5jaW5nRW5hYmxlZCgpe3JldHVybiB0aGlzLnVzZU9wdGltaXplZEluc3RhbmNpbmd9cHJvY2Vzc0NvbXBsZXhCbGVuZFF1ZXVlKCl7dGhpcy5lbnN1cmVDb21tYW5kRW5jb2RlcigpLExvKHRoaXMuZGV2aWNlLHRoaXMuY29tbWFuZEVuY29kZXIsdGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3QsdGhpcy5mcmFtZUJ1ZmZlck1hbmFnZXIsdGhpcy50ZXh0dXJlTWFuYWdlcix0aGlzLnBpcGVsaW5lTWFuYWdlcix0aGlzLmJ1ZmZlck1hbmFnZXIpfWNsZWFyQXJyYXlzSW5zdGFuY2VkKCl7VmEoKS5jbGVhcigpfWRyYXdQaXhlbHMoZSx0KXtjb25zdCByPU1hKGUuaW5kZXgpfHx3YSgpO2lmKCFyfHwhci50ZXh0dXJlKXJldHVybjtjb25zdCBuPWUudyxpPWUuaDtpZih0aGlzLnJlbmRlclBhc3NFbmNvZGVyJiYodGhpcy5lbnN1cmVOb2RlQXJlYUNsZWFyZWQoKSx0aGlzLnJlbmRlclBhc3NFbmNvZGVyLmVuZCgpLHRoaXMucmVuZGVyUGFzc0VuY29kZXI9bnVsbCksdGhpcy5ub2RlUmVuZGVyUGFzc0F0bGFzSW5kZXg9LTEsci5tc2FhJiZyLm1zYWFUZXh0dXJlPy52aWV3KXRoaXMuZHJhd1BpeGVsc1RvTXNhYShyLGUsdCxuLGkpO2Vsc2V7Y29uc3QgYT00Km47dGhpcy5kZXZpY2UucXVldWUud3JpdGVUZXh0dXJlKHt0ZXh0dXJlOnIudGV4dHVyZS5yZXNvdXJjZSxvcmlnaW46e3g6ZS54LHk6ZS55LHo6MH19LHQse2J5dGVzUGVyUm93OmEscm93c1BlckltYWdlOmksb2Zmc2V0OjB9LHt3aWR0aDpuLGhlaWdodDppLGRlcHRoT3JBcnJheUxheWVyczoxfSl9fWRyYXdQaXhlbHNUb01zYWEoZSx0LHIsbixpKXtjb25zdCBhPVJzKHRoaXMuZGV2aWNlLG4saSkscz00Km47dGhpcy5kZXZpY2UucXVldWUud3JpdGVUZXh0dXJlKHt0ZXh0dXJlOmF9LHIse2J5dGVzUGVyUm93OnMscm93c1BlckltYWdlOml9LHt3aWR0aDpuLGhlaWdodDppfSk7Y29uc3Qgbz10aGlzLnBpcGVsaW5lTWFuYWdlci5nZXRQaXBlbGluZSgiYml0bWFwX3JlbmRlcl9tc2FhIik7aWYoIW8pcmV0dXJuIHZvaWQgQ3MoYSk7Y29uc3QgbD10aGlzLnBpcGVsaW5lTWFuYWdlci5nZXRCaW5kR3JvdXBMYXlvdXQoInBvc2l0aW9uZWRfdGV4dHVyZSIpO2lmKCFsKXJldHVybiB2b2lkIENzKGEpO2NvbnN0IGM9dGhpcy4kdW5pZm9ybURhdGE4O2NbMF09dC54LGNbMV09dC55LGNbMl09bixjWzNdPWksY1s0XT1lLndpZHRoLGNbNV09ZS5oZWlnaHQsY1s2XT0wLGNbN109MDtjb25zdCB1PXRoaXMuYnVmZmVyTWFuYWdlci5hY3F1aXJlQW5kV3JpdGVVbmlmb3JtQnVmZmVyKGMpLGY9dGhpcy50ZXh0dXJlTWFuYWdlci5jcmVhdGVTYW1wbGVyKCJsaW5lYXJfc2FtcGxlciIsITApLGQ9RnMoYSk7ZmNbMF0ucmVzb3VyY2UuYnVmZmVyPXUsZmNbMV0ucmVzb3VyY2U9ZixmY1syXS5yZXNvdXJjZT1kO2NvbnN0IGg9dGhpcy5kZXZpY2UuY3JlYXRlQmluZEdyb3VwKHtsYXlvdXQ6bCxlbnRyaWVzOmZjfSk7dGhpcy5lbnN1cmVDb21tYW5kRW5jb2RlcigpLGdjLnZpZXc9ZS5tc2FhVGV4dHVyZS52aWV3LGdjLnJlc29sdmVUYXJnZXQ9ZS50ZXh0dXJlLnZpZXc7Y29uc3QgcD1lLm1zYWFTdGVuY2lsPy52aWV3O3A/KGJjLnZpZXc9cCx4Yy5kZXB0aFN0ZW5jaWxBdHRhY2htZW50PWJjKTp4Yy5kZXB0aFN0ZW5jaWxBdHRhY2htZW50PXZvaWQgMDtjb25zdCBtPXRoaXMuY29tbWFuZEVuY29kZXIuYmVnaW5SZW5kZXJQYXNzKHhjKTttLnNldFZpZXdwb3J0KDAsMCxlLndpZHRoLGUuaGVpZ2h0LDAsMSksbS5zZXRTY2lzc29yUmVjdCh0LngsdC55LG4saSksbS5zZXRQaXBlbGluZShvKSxtLnNldEJpbmRHcm91cCgwLGgpLG0uZHJhdyg2KSxtLmVuZCgpLHRoaXMucG9vbGVkUmVuZGVyVGV4dHVyZXMucHVzaChhKX1kcmF3RWxlbWVudChlLHQscj0hMSl7Y29uc3Qgbj1NYShlLmluZGV4KXx8d2EoKTtpZighbnx8IW4udGV4dHVyZSlyZXR1cm47Y29uc3QgaT1lLncsYT1lLmg7dGhpcy5yZW5kZXJQYXNzRW5jb2RlciYmKHRoaXMuZW5zdXJlTm9kZUFyZWFDbGVhcmVkKCksdGhpcy5yZW5kZXJQYXNzRW5jb2Rlci5lbmQoKSx0aGlzLnJlbmRlclBhc3NFbmNvZGVyPW51bGwpLHRoaXMubm9kZVJlbmRlclBhc3NBdGxhc0luZGV4PS0xLG4ubXNhYSYmbi5tc2FhVGV4dHVyZT8udmlldz90aGlzLmRyYXdFbGVtZW50VG9Nc2FhKG4sZSx0LGksYSxyKTp0aGlzLmRyYXdFbGVtZW50VG9UZXh0dXJlKG4sZSx0LGksYSxyKX1kcmF3RWxlbWVudFRvTXNhYShlLHQscixuLGksYSl7Y29uc3Qgcz1Scyh0aGlzLmRldmljZSxuLGkpO3RoaXMuZGV2aWNlLnF1ZXVlLmNvcHlFeHRlcm5hbEltYWdlVG9UZXh0dXJlKHtzb3VyY2U6cixmbGlwWTphfSx7dGV4dHVyZTpzLHByZW11bHRpcGxpZWRBbHBoYTohMH0se3dpZHRoOm4saGVpZ2h0Oml9KTtjb25zdCBvPXRoaXMucGlwZWxpbmVNYW5hZ2VyLmdldFBpcGVsaW5lKCJiaXRtYXBfcmVuZGVyX21zYWEiKTtpZighbylyZXR1cm4gdm9pZCBDcyhzKTtjb25zdCBsPXRoaXMucGlwZWxpbmVNYW5hZ2VyLmdldEJpbmRHcm91cExheW91dCgicG9zaXRpb25lZF90ZXh0dXJlIik7aWYoIWwpcmV0dXJuIHZvaWQgQ3Mocyk7Y29uc3QgYz10aGlzLiR1bmlmb3JtRGF0YTg7Y1swXT10LngsY1sxXT10LnksY1syXT1uLGNbM109aSxjWzRdPWUud2lkdGgsY1s1XT1lLmhlaWdodCxjWzZdPTAsY1s3XT0wO2NvbnN0IHU9dGhpcy5idWZmZXJNYW5hZ2VyLmFjcXVpcmVBbmRXcml0ZVVuaWZvcm1CdWZmZXIoYyksZj10aGlzLnRleHR1cmVNYW5hZ2VyLmNyZWF0ZVNhbXBsZXIoImxpbmVhcl9zYW1wbGVyIiwhMCksZD1GcyhzKTtmY1swXS5yZXNvdXJjZS5idWZmZXI9dSxmY1sxXS5yZXNvdXJjZT1mLGZjWzJdLnJlc291cmNlPWQ7Y29uc3QgaD10aGlzLmRldmljZS5jcmVhdGVCaW5kR3JvdXAoe2xheW91dDpsLGVudHJpZXM6ZmN9KTt0aGlzLmVuc3VyZUNvbW1hbmRFbmNvZGVyKCksZ2Mudmlldz1lLm1zYWFUZXh0dXJlLnZpZXcsZ2MucmVzb2x2ZVRhcmdldD1lLnRleHR1cmUudmlldztjb25zdCBwPWUubXNhYVN0ZW5jaWw/LnZpZXc7cD8oYmMudmlldz1wLHhjLmRlcHRoU3RlbmNpbEF0dGFjaG1lbnQ9YmMpOnhjLmRlcHRoU3RlbmNpbEF0dGFjaG1lbnQ9dm9pZCAwO2NvbnN0IG09dGhpcy5jb21tYW5kRW5jb2Rlci5iZWdpblJlbmRlclBhc3MoeGMpO20uc2V0Vmlld3BvcnQoMCwwLGUud2lkdGgsZS5oZWlnaHQsMCwxKSxtLnNldFNjaXNzb3JSZWN0KHQueCx0LnksbixpKSxtLnNldFBpcGVsaW5lKG8pLG0uc2V0QmluZEdyb3VwKDAsaCksbS5kcmF3KDYpLG0uZW5kKCksdGhpcy5wb29sZWRSZW5kZXJUZXh0dXJlcy5wdXNoKHMpfWRyYXdFbGVtZW50VG9UZXh0dXJlKGUsdCxyLG4saSxhKXtjb25zdCBzPVJzKHRoaXMuZGV2aWNlLG4saSk7dGhpcy5kZXZpY2UucXVldWUuY29weUV4dGVybmFsSW1hZ2VUb1RleHR1cmUoe3NvdXJjZTpyLGZsaXBZOmF9LHt0ZXh0dXJlOnMscHJlbXVsdGlwbGllZEFscGhhOiEwfSx7d2lkdGg6bixoZWlnaHQ6aX0pO2NvbnN0IG89dGhpcy5waXBlbGluZU1hbmFnZXIuZ2V0UGlwZWxpbmUoImJpdG1hcF9yZW5kZXIiKTtpZighbylyZXR1cm4gdm9pZCBDcyhzKTtjb25zdCBsPXRoaXMucGlwZWxpbmVNYW5hZ2VyLmdldEJpbmRHcm91cExheW91dCgicG9zaXRpb25lZF90ZXh0dXJlIik7aWYoIWwpcmV0dXJuIHZvaWQgQ3Mocyk7Y29uc3QgYz10aGlzLiR1bmlmb3JtRGF0YTg7Y1swXT10LngsY1sxXT10LnksY1syXT1uLGNbM109aSxjWzRdPWUud2lkdGgsY1s1XT1lLmhlaWdodCxjWzZdPTAsY1s3XT0wO2NvbnN0IHU9dGhpcy5idWZmZXJNYW5hZ2VyLmFjcXVpcmVBbmRXcml0ZVVuaWZvcm1CdWZmZXIoYyksZj10aGlzLnRleHR1cmVNYW5hZ2VyLmNyZWF0ZVNhbXBsZXIoImxpbmVhcl9zYW1wbGVyIiwhMCksZD1GcyhzKTtmY1swXS5yZXNvdXJjZS5idWZmZXI9dSxmY1sxXS5yZXNvdXJjZT1mLGZjWzJdLnJlc291cmNlPWQ7Y29uc3QgaD10aGlzLmRldmljZS5jcmVhdGVCaW5kR3JvdXAoe2xheW91dDpsLGVudHJpZXM6ZmN9KTt0aGlzLmVuc3VyZUNvbW1hbmRFbmNvZGVyKCksZ2Mudmlldz1lLnRleHR1cmUudmlldyxnYy5yZXNvbHZlVGFyZ2V0PXZvaWQgMDtjb25zdCBwPWUuc3RlbmNpbD8udmlldztwPyhiYy52aWV3PXAseGMuZGVwdGhTdGVuY2lsQXR0YWNobWVudD1iYyk6eGMuZGVwdGhTdGVuY2lsQXR0YWNobWVudD12b2lkIDA7Y29uc3QgbT10aGlzLmNvbW1hbmRFbmNvZGVyLmJlZ2luUmVuZGVyUGFzcyh4Yyk7bS5zZXRWaWV3cG9ydCgwLDAsZS53aWR0aCxlLmhlaWdodCwwLDEpLG0uc2V0U2Npc3NvclJlY3QodC54LHQueSxuLGkpLG0uc2V0UGlwZWxpbmUobyksbS5zZXRCaW5kR3JvdXAoMCxoKSxtLmRyYXcoNiksbS5lbmQoKSx0aGlzLnBvb2xlZFJlbmRlclRleHR1cmVzLnB1c2gocyl9YXBwbHlGaWx0ZXIoZSx0LHIsbixpLGEscyxvLGwsYyx1KXt0aGlzLmRyYXdBcnJheXNJbnN0YW5jZWQoKSx0aGlzLmZyYW1lU3RhcnRlZHx8dGhpcy5iZWdpbkZyYW1lKCksdGhpcy5yZW5kZXJQYXNzRW5jb2RlciYmKHRoaXMucmVuZGVyUGFzc0VuY29kZXIuZW5kKCksdGhpcy5yZW5kZXJQYXNzRW5jb2Rlcj1udWxsKSx0aGlzLm5vZGVSZW5kZXJQYXNzQXRsYXNJbmRleD0tMSx0aGlzLmVuc3VyZUNvbW1hbmRFbmNvZGVyKCksdGhpcy4kZmlsdGVyQ29uZmlnLmNvbW1hbmRFbmNvZGVyPXRoaXMuY29tbWFuZEVuY29kZXIsdGhpcy4kZmlsdGVyQ29uZmlnLm1haW5BdHRhY2htZW50PXRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0LGpsKGUsbixpLGEscyxvLGwsYyx1LHRoaXMuJGZpbHRlckNvbmZpZyx0aGlzLm1haW5UZXh0dXJlVmlldyx0aGlzLmJ1ZmZlck1hbmFnZXIpfWNvbnRhaW5lckJlZ2luTGF5ZXIoZSx0KXt0aGlzLmRyYXdBcnJheXNJbnN0YW5jZWQoKSx0aGlzLmZyYW1lU3RhcnRlZHx8dGhpcy5iZWdpbkZyYW1lKCksdGhpcy5yZW5kZXJQYXNzRW5jb2RlciYmKHRoaXMucmVuZGVyUGFzc0VuY29kZXIuZW5kKCksdGhpcy5yZW5kZXJQYXNzRW5jb2Rlcj1udWxsKTtjb25zdCByPXRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0O3RoaXMuJGNvbnRhaW5lckxheWVyU3RhY2sucHVzaChyKSx0aGlzLmNvbnRhaW5lckxheWVyQ29udGVudFNpemVzLnB1c2goe3dpZHRoOmUsaGVpZ2h0OnR9KTtjb25zdCBuPXRoaXMuZnJhbWVCdWZmZXJNYW5hZ2VyLmNyZWF0ZUF0dGFjaG1lbnQoImNvbnRhaW5lcl9sYXllciIsZSx0LHIubXNhYSwhMCk7dGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3Q9bix0aGlzLmJpbmQobil9Y29udGFpbmVyRW5kTGF5ZXIoZSx0LHIsbixpLGEscyxvKXt0aGlzLmRyYXdBcnJheXNJbnN0YW5jZWQoKSx0aGlzLnJlbmRlclBhc3NFbmNvZGVyJiYodGhpcy5yZW5kZXJQYXNzRW5jb2Rlci5lbmQoKSx0aGlzLnJlbmRlclBhc3NFbmNvZGVyPW51bGwpLHRoaXMuZW5zdXJlQ29tbWFuZEVuY29kZXIoKTtjb25zdCBsPXRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0LGM9dGhpcy5jb250YWluZXJMYXllckNvbnRlbnRTaXplcy5wb3AoKXx8e3dpZHRoOmwud2lkdGgsaGVpZ2h0OmwuaGVpZ2h0fTt0aGlzLiRtYWluQXR0YWNobWVudE9iamVjdD10aGlzLiRjb250YWluZXJMYXllclN0YWNrLnBvcCgpLHRoaXMuJGZpbHRlckNvbmZpZy5jb21tYW5kRW5jb2Rlcj10aGlzLmNvbW1hbmRFbmNvZGVyLHRoaXMuJGZpbHRlckNvbmZpZy5tYWluQXR0YWNobWVudD12b2lkIDAsSmwobCx0aGlzLiRtYWluQXR0YWNobWVudE9iamVjdCwwLGUsdCxyLG4saSxhLHMsbyxjLndpZHRoLGMuaGVpZ2h0LHRoaXMuJGZpbHRlckNvbmZpZyx0aGlzLmJ1ZmZlck1hbmFnZXIpLHRoaXMuYmluZCh0aGlzLiRtYWluQXR0YWNobWVudE9iamVjdCl9Y29udGFpbmVyRHJhd0NhY2hlZEZpbHRlcihlLHQscixuLGksYSl7aWYoeW4uZ2V0KGksImZLZXkiKSE9PWEpcmV0dXJuO2NvbnN0IHM9eW4uZ2V0KGksImZUZXh0dXJlIik7aWYoIXN8fCFzLnRleHR1cmUpcmV0dXJuO3RoaXMuZHJhd0FycmF5c0luc3RhbmNlZCgpLHRoaXMuZnJhbWVTdGFydGVkfHx0aGlzLmJlZ2luRnJhbWUoKSx0aGlzLnJlbmRlclBhc3NFbmNvZGVyJiYodGhpcy5yZW5kZXJQYXNzRW5jb2Rlci5lbmQoKSx0aGlzLnJlbmRlclBhc3NFbmNvZGVyPW51bGwpLHRoaXMuZW5zdXJlQ29tbWFuZEVuY29kZXIoKTtjb25zdCBvPXRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0O2lmKCFvfHwhby50ZXh0dXJlKXJldHVybjtsZXQgbD1zLGM9bnVsbDtpZighKDE9PT1yWzBdJiYxPT09clsxXSYmMT09PXJbMl0mJjE9PT1yWzNdJiYwPT09cls0XSYmMD09PXJbNV0mJjA9PT1yWzZdJiYwPT09cls3XSkpe2M9dGhpcy5mcmFtZUJ1ZmZlck1hbmFnZXIuY3JlYXRlVGVtcG9yYXJ5QXR0YWNobWVudChzLndpZHRoLHMuaGVpZ2h0KTtjb25zdCBlPXRoaXMucGlwZWxpbmVNYW5hZ2VyLmdldFBpcGVsaW5lKCJjb2xvcl90cmFuc2Zvcm0iKSx0PXRoaXMucGlwZWxpbmVNYW5hZ2VyLmdldEJpbmRHcm91cExheW91dCgidGV4dHVyZV9jb3B5Iik7aWYoZSYmdCYmYy50ZXh0dXJlKXtpY1swXT1yWzBdLGljWzFdPXJbMV0saWNbMl09clsyXSxpY1szXT1yWzNdLGljWzRdPXJbNF0saWNbNV09cls1XSxpY1s2XT1yWzZdLGljWzddPTA7Y29uc3Qgbj1pYyxpPXRoaXMuYnVmZmVyTWFuYWdlci5hY3F1aXJlQW5kV3JpdGVVbmlmb3JtQnVmZmVyKG4pLGE9dGhpcy50ZXh0dXJlTWFuYWdlci5jcmVhdGVTYW1wbGVyKCJjYWNoZWRfY3Rfc2FtcGxlciIsITEpO2ZjWzBdLnJlc291cmNlLmJ1ZmZlcj1pLGZjWzFdLnJlc291cmNlPWEsZmNbMl0ucmVzb3VyY2U9cy50ZXh0dXJlLnZpZXc7Y29uc3Qgbz10aGlzLmRldmljZS5jcmVhdGVCaW5kR3JvdXAoe2xheW91dDp0LGVudHJpZXM6ZmN9KSx1PXRoaXMuZnJhbWVCdWZmZXJNYW5hZ2VyLmNyZWF0ZVJlbmRlclBhc3NEZXNjcmlwdG9yKGMudGV4dHVyZS52aWV3LDAsMCwwLDAsImNsZWFyIiksZj10aGlzLmNvbW1hbmRFbmNvZGVyLmJlZ2luUmVuZGVyUGFzcyh1KTtmLnNldFBpcGVsaW5lKGUpLGYuc2V0QmluZEdyb3VwKDAsbyksZi5kcmF3KDYsMSwwLDApLGYuZW5kKCksbD1jfX1jb25zdCB1PUhuLmdldERldmljZVBpeGVsUmF0aW8oKSxmPU1hdGguc3FydCh0WzBdKnRbMF0rdFsxXSp0WzFdKSxkPU1hdGguc3FydCh0WzJdKnRbMl0rdFszXSp0WzNdKSxoPW5bMF0qKGYvdSkscD1uWzFdKihkL3UpLG09TWF0aC5mbG9vcihoK3RbNF0pLGc9TWF0aC5mbG9vcihwK3RbNV0pLGI9by5tc2FhJiZvLm1zYWFUZXh0dXJlPy52aWV3O2xldCB4O3N3aXRjaChlKXtjYXNlImFkZCI6eD1iPyJmaWx0ZXJfb3V0cHV0X2FkZF9tc2FhIjoiZmlsdGVyX291dHB1dF9hZGQiO2JyZWFrO2Nhc2Uic2NyZWVuIjp4PWI/ImZpbHRlcl9vdXRwdXRfc2NyZWVuX21zYWEiOiJmaWx0ZXJfb3V0cHV0X3NjcmVlbiI7YnJlYWs7Y2FzZSJhbHBoYSI6eD1iPyJmaWx0ZXJfb3V0cHV0X2FscGhhX21zYWEiOiJmaWx0ZXJfb3V0cHV0X2FscGhhIjticmVhaztjYXNlImVyYXNlIjp4PWI/ImZpbHRlcl9vdXRwdXRfZXJhc2VfbXNhYSI6ImZpbHRlcl9vdXRwdXRfZXJhc2UiO2JyZWFrO2RlZmF1bHQ6eD1iPyJmaWx0ZXJfb3V0cHV0X21zYWEiOiJmaWx0ZXJfb3V0cHV0In1jb25zdCB2PXRoaXMucGlwZWxpbmVNYW5hZ2VyLmdldFBpcGVsaW5lKHgpLHk9dGhpcy5waXBlbGluZU1hbmFnZXIuZ2V0QmluZEdyb3VwTGF5b3V0KCJ0ZXh0dXJlX2NvcHkiKTtpZighdnx8IXkpcmV0dXJuO2NvbnN0IF89dGhpcy50ZXh0dXJlTWFuYWdlci5jcmVhdGVTYW1wbGVyKCJjYWNoZWRfZmlsdGVyX3NhbXBsZXIiLCEwKSx3PXRoaXMuYnVmZmVyTWFuYWdlci5hY3F1aXJlQW5kV3JpdGVVbmlmb3JtQnVmZmVyKGVjKTtmY1swXS5yZXNvdXJjZS5idWZmZXI9dyxmY1sxXS5yZXNvdXJjZT1fLGZjWzJdLnJlc291cmNlPWwudGV4dHVyZS52aWV3O2NvbnN0IE09dGhpcy5kZXZpY2UuY3JlYXRlQmluZEdyb3VwKHtsYXlvdXQ6eSxlbnRyaWVzOmZjfSksUD1iP28ubXNhYVRleHR1cmUudmlldzpvLnRleHR1cmUudmlldyxTPWI/by50ZXh0dXJlLnZpZXc6bnVsbCxGPXRoaXMuZnJhbWVCdWZmZXJNYW5hZ2VyLmNyZWF0ZVJlbmRlclBhc3NEZXNjcmlwdG9yKFAsMCwwLDAsMCwibG9hZCIsUyksVD1NYXRoLm1heCgwLG0pLEI9TWF0aC5tYXgoMCxnKSxPPU1hdGgubWF4KDEsbC53aWR0aCksQT1NYXRoLm1heCgxLGwuaGVpZ2h0KSxSPW8ud2lkdGgsQz1vLmhlaWdodCxFPU1hdGgubWF4KDEsTWF0aC5taW4oTyxSLVQpKSxVPU1hdGgubWF4KDEsTWF0aC5taW4oQSxDLUIpKTtpZihFPD0wfHxVPD0wfHxUPj1SfHxCPj1DKXJldHVybiB2b2lkKGMmJnRoaXMuZnJhbWVCdWZmZXJNYW5hZ2VyLnJlbGVhc2VUZW1wb3JhcnlBdHRhY2htZW50KGMpKTtjb25zdCAkPXRoaXMuY29tbWFuZEVuY29kZXIuYmVnaW5SZW5kZXJQYXNzKEYpOyQuc2V0UGlwZWxpbmUodiksJC5zZXRCaW5kR3JvdXAoMCxNKSwkLnNldFZpZXdwb3J0KFQsQixPLEEsMCwxKSwkLnNldFNjaXNzb3JSZWN0KFQsQixFLFUpLCQuZHJhdyg2LDEsMCwwKSwkLmVuZCgpLGMmJnRoaXMuZnJhbWVCdWZmZXJNYW5hZ2VyLnJlbGVhc2VUZW1wb3JhcnlBdHRhY2htZW50KGMpLHRoaXMuYmluZChvKX1lbnN1cmVNYWluVGV4dHVyZSgpe3RoaXMubWFpblRleHR1cmV8fCh0aGlzLm1haW5UZXh0dXJlPXRoaXMuY2FudmFzQ29udGV4dC5nZXRDdXJyZW50VGV4dHVyZSgpLHRoaXMubWFpblRleHR1cmVWaWV3PXRoaXMubWFpblRleHR1cmUuY3JlYXRlVmlldygpKX1nZXRDdXJyZW50VGV4dHVyZVZpZXcoKXtyZXR1cm4gdGhpcy5jdXJyZW50UmVuZGVyVGFyZ2V0P3RoaXMuY3VycmVudFJlbmRlclRhcmdldDoodGhpcy5lbnN1cmVNYWluVGV4dHVyZSgpLHRoaXMubWFpblRleHR1cmVWaWV3KX1lbnN1cmVDb21tYW5kRW5jb2Rlcigpe3RoaXMuY29tbWFuZEVuY29kZXJ8fCh0aGlzLmNvbW1hbmRFbmNvZGVyPXRoaXMuZGV2aWNlLmNyZWF0ZUNvbW1hbmRFbmNvZGVyKCkpfWJlZ2luRnJhbWUoKXt0aGlzLmZyYW1lU3RhcnRlZHx8KHRoaXMuZW5zdXJlTWFpblRleHR1cmUoKSx0aGlzLmVuc3VyZUNvbW1hbmRFbmNvZGVyKCksdGhpcy5mcmFtZVN0YXJ0ZWQ9ITAsdGhpcy5mcmFtZUJ1ZmZlck1hbmFnZXIuYmVnaW5GcmFtZSgpKX1hZGRGcmFtZVRleHR1cmUoZSl7dGhpcy5wb29sZWRUZXh0dXJlcy5wdXNoKGUpfWVuZEZyYW1lKCl7aWYodGhpcy5mcmFtZVN0YXJ0ZWQpe2lmKHRoaXMucmVuZGVyUGFzc0VuY29kZXImJih0aGlzLnJlbmRlclBhc3NFbmNvZGVyLmVuZCgpLHRoaXMucmVuZGVyUGFzc0VuY29kZXI9bnVsbCksdGhpcy5idWZmZXJNYW5hZ2VyLmR5bmFtaWNVbmlmb3JtLmZsdXNoKCksdGhpcy5jb21tYW5kRW5jb2Rlcil0cnl7Y29uc3QgZT10aGlzLmNvbW1hbmRFbmNvZGVyLmZpbmlzaCgpO3RoaXMuZGV2aWNlLnF1ZXVlLnN1Ym1pdChbZV0pfWNhdGNoKGUpe2NvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byBzdWJtaXQgZnJhbWUgY29tbWFuZHM6IixlKX10aGlzLmZyYW1lQnVmZmVyTWFuYWdlci5mbHVzaFBlbmRpbmdSZWxlYXNlcygpLHRoaXMuYnVmZmVyTWFuYWdlci5jbGVhckZyYW1lQnVmZmVycygpO2Zvcihjb25zdCBlIG9mIHRoaXMuZnJhbWVUZXh0dXJlcyllLmRlc3Ryb3koKTt0aGlzLmZyYW1lVGV4dHVyZXMubGVuZ3RoPTA7Zm9yKGNvbnN0IGUgb2YgdGhpcy5wb29sZWRUZXh0dXJlcylBcyhlKTt0aGlzLnBvb2xlZFRleHR1cmVzLmxlbmd0aD0wO2Zvcihjb25zdCBlIG9mIHRoaXMucG9vbGVkUmVuZGVyVGV4dHVyZXMpQ3MoZSk7dGhpcy5wb29sZWRSZW5kZXJUZXh0dXJlcy5sZW5ndGg9MCwoKCk9PnskcysrO2Zvcihjb25zdFtlLHRdb2YgVXMpJHMtdC5sYXN0VXNlZEZyYW1lPjYwJiYoQXModC50ZXh0dXJlKSxVcy5kZWxldGUoZSkpfSkoKSx0aGlzLmZpbGxEeW5hbWljQmluZEdyb3VwPW51bGwsdGhpcy5maWxsRHluYW1pY0JpbmRHcm91cEJ1ZmZlcj1udWxsLHRoaXMuY29tbWFuZEVuY29kZXI9bnVsbCx0aGlzLnJlbmRlclBhc3NFbmNvZGVyPW51bGwsdGhpcy5jdXJyZW50UmVuZGVyVGFyZ2V0PW51bGwsdGhpcy5ub2RlUmVuZGVyUGFzc0F0bGFzSW5kZXg9LTEsdGhpcy5tYWluVGV4dHVyZT1udWxsLHRoaXMubWFpblRleHR1cmVWaWV3PW51bGwsdGhpcy5mcmFtZVN0YXJ0ZWQ9ITF9fXN1Ym1pdCgpe3RoaXMuZW5kRnJhbWUoKX1jcmVhdGVOb2RlKGUsdCl7Y29uc3Qgcj14YTtpZighUGFbcl0pe2NvbnN0IGU9SG4uZ2V0UmVuZGVyTWF4U2l6ZSgpO1BhW3JdPW5ldyBKdChyLGUsZSl9Y29uc3Qgbj1QYVtyXS5pbnNlcnQoZSx0KTtyZXR1cm4gbnx8KHZhKHIrMSksdGhpcy5jcmVhdGVOb2RlKGUsdCkpfXJlbW92ZU5vZGUoZSl7Y29uc3QgdD1lLmluZGV4LHI9UGFbdF07ciYmci5kaXNwb3NlKGUueCxlLnksZS53LGUuaCl9dHJhbnNmZXJNYWluQ2FudmFzKCl7aWYoIXRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0fHwhdGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3QudGV4dHVyZSlyZXR1cm4gdm9pZCB0aGlzLmVuZEZyYW1lKCk7dGhpcy5yZW5kZXJQYXNzRW5jb2RlciYmKHRoaXMucmVuZGVyUGFzc0VuY29kZXIuZW5kKCksdGhpcy5yZW5kZXJQYXNzRW5jb2Rlcj1udWxsKSx0aGlzLmVuc3VyZUNvbW1hbmRFbmNvZGVyKCksdGhpcy5lbnN1cmVNYWluVGV4dHVyZSgpO2NvbnN0IGU9dGhpcy5waXBlbGluZU1hbmFnZXIuZ2V0UGlwZWxpbmUoInRleHR1cmVfY29weV9iZ3JhIiksdD10aGlzLnBpcGVsaW5lTWFuYWdlci5nZXRCaW5kR3JvdXBMYXlvdXQoInRleHR1cmVfY29weSIpO2lmKCFlfHwhdClyZXR1cm4gY29uc29sZS5lcnJvcigiW1dlYkdQVV0gdGV4dHVyZV9jb3B5X2JncmEgcGlwZWxpbmUgbm90IGZvdW5kIiksdm9pZCB0aGlzLmVuZEZyYW1lKCk7Y29uc3Qgcj10aGlzLiRtYWluQXR0YWNobWVudE9iamVjdC50ZXh0dXJlLnZpZXc7aWYoIXNjfHxvYyE9PXIpe2xjfHwobGM9dGhpcy5kZXZpY2UuY3JlYXRlQnVmZmVyKHtzaXplOmVjLmJ5dGVMZW5ndGgsdXNhZ2U6R1BVQnVmZmVyVXNhZ2UuVU5JRk9STXxHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVH0pLHRoaXMuZGV2aWNlLnF1ZXVlLndyaXRlQnVmZmVyKGxjLDAsZWMuYnVmZmVyLGVjLmJ5dGVPZmZzZXQsZWMuYnl0ZUxlbmd0aCkpO2NvbnN0IGU9dGhpcy50ZXh0dXJlTWFuYWdlci5jcmVhdGVTYW1wbGVyKCJ0cmFuc2Zlcl9zYW1wbGVyIiwhMSk7ZmNbMF0ucmVzb3VyY2U9e2J1ZmZlcjpsY30sZmNbMV0ucmVzb3VyY2U9ZSxmY1syXS5yZXNvdXJjZT1yLHNjPXRoaXMuZGV2aWNlLmNyZWF0ZUJpbmRHcm91cCh7bGF5b3V0OnQsZW50cmllczpmY30pLG9jPXJ9Y29uc3Qgbj1zYztjYy52aWV3PXRoaXMubWFpblRleHR1cmVWaWV3O2NvbnN0IGk9dGhpcy5jb21tYW5kRW5jb2Rlci5iZWdpblJlbmRlclBhc3ModWMpO2kuc2V0UGlwZWxpbmUoZSksaS5zZXRCaW5kR3JvdXAoMCxuKSxpLmRyYXcoNiwxLDAsMCksaS5lbmQoKSx0aGlzLmVuZEZyYW1lKCl9YXN5bmMgY3JlYXRlSW1hZ2VCaXRtYXAoZSx0KXtjb25zdCByPXdhKCk7aWYoIXIpdGhyb3cgbmV3IEVycm9yKCJbV2ViR1BVXSBBdGxhcyBhdHRhY2htZW50IG5vdCBmb3VuZCIpO3RoaXMucmVuZGVyUGFzc0VuY29kZXImJih0aGlzLnJlbmRlclBhc3NFbmNvZGVyLmVuZCgpLHRoaXMucmVuZGVyUGFzc0VuY29kZXI9bnVsbCk7Y29uc3Qgbj0yNTYqTWF0aC5jZWlsKDQqZS8yNTYpLGk9bip0LGE9dGhpcy5kZXZpY2UuY3JlYXRlQnVmZmVyKHtzaXplOmksdXNhZ2U6R1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1R8R1BVQnVmZmVyVXNhZ2UuTUFQX1JFQUR9KSxzPXRoaXMuZGV2aWNlLmNyZWF0ZUNvbW1hbmRFbmNvZGVyKCk7aWYoIXIudGV4dHVyZSl0aHJvdyBuZXcgRXJyb3IoIkF0dGFjaG1lbnQgdGV4dHVyZSBpcyBudWxsIik7cy5jb3B5VGV4dHVyZVRvQnVmZmVyKHt0ZXh0dXJlOnIudGV4dHVyZS5yZXNvdXJjZSxtaXBMZXZlbDowLG9yaWdpbjp7eDowLHk6MCx6OjB9fSx7YnVmZmVyOmEsYnl0ZXNQZXJSb3c6bixyb3dzUGVySW1hZ2U6dH0se3dpZHRoOmUsaGVpZ2h0OnQsZGVwdGhPckFycmF5TGF5ZXJzOjF9KSx0aGlzLmRldmljZS5xdWV1ZS5zdWJtaXQoW3MuZmluaXNoKCldKSxhd2FpdCBhLm1hcEFzeW5jKEdQVU1hcE1vZGUuUkVBRCk7Y29uc3Qgbz1hLmdldE1hcHBlZFJhbmdlKCksbD1uZXcgVWludDhBcnJheShvKSxjPW5ldyBVaW50OEFycmF5KGUqdCo0KTtmb3IobGV0IHI9MDtyPHQ7cisrKXtjb25zdCB0PXIqbixpPXIqZSo0O2Muc2V0KGwuc3ViYXJyYXkodCx0KzQqZSksaSl9YS51bm1hcCgpLGEuZGVzdHJveSgpO2NvbnN0IHU9bmV3IEZsb2F0MzJBcnJheSgyNTYpO2ZvcihsZXQgZT0xO2U8MjU2O2UrKyl1W2VdPTI1NS9lO2ZvcihsZXQgZT0wO2U8Yy5sZW5ndGg7ZSs9NCl7Y29uc3QgdD1jW2UrM107aWYoMD09PXR8fDI1NT09PXQpY29udGludWU7Y29uc3Qgcj11W3RdO2NbZV09TWF0aC5taW4oMjU1LE1hdGgucm91bmQoY1tlXSpyKSksY1tlKzFdPU1hdGgubWluKDI1NSxNYXRoLnJvdW5kKGNbZSsxXSpyKSksY1tlKzJdPU1hdGgubWluKDI1NSxNYXRoLnJvdW5kKGNbZSsyXSpyKSl9Y29uc3QgZj1uZXcgSW1hZ2VEYXRhKG5ldyBVaW50OENsYW1wZWRBcnJheShjKSxlLHQpO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgY3JlYXRlSW1hZ2VCaXRtYXApcmV0dXJuIGF3YWl0IGNyZWF0ZUltYWdlQml0bWFwKGYse3ByZW11bHRpcGx5QWxwaGE6Im5vbmUiLGNvbG9yU3BhY2VDb252ZXJzaW9uOiJub25lIn0pO3Rocm93IG5ldyBFcnJvcigiW1dlYkdQVV0gY3JlYXRlSW1hZ2VCaXRtYXAgbm90IGF2YWlsYWJsZSBpbiB0aGlzIGVudmlyb25tZW50Iil9YmVnaW5NYXNrKCl7aWYodGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3QmJnRoaXMuYmluZCh0aGlzLiRtYWluQXR0YWNobWVudE9iamVjdCksdGhpcy5jdXJyZW50UmVuZGVyVGFyZ2V0PW51bGwsdGhpcy5yZW5kZXJQYXNzRW5jb2RlciYmKHRoaXMucmVuZGVyUGFzc0VuY29kZXIuZW5kKCksdGhpcy5yZW5kZXJQYXNzRW5jb2Rlcj1udWxsKSx0aGlzLmZyYW1lU3RhcnRlZHx8dGhpcy5iZWdpbkZyYW1lKCksdGhpcy5lbnN1cmVDb21tYW5kRW5jb2RlcigpLHRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0Py50ZXh0dXJlJiZ0aGlzLiRtYWluQXR0YWNobWVudE9iamVjdD8uc3RlbmNpbD8udmlldyl7Y29uc3QgZT0wPT09dGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3QuY2xpcExldmVsPyJjbGVhciI6ImxvYWQiLHQ9dGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3QubXNhYSYmdGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3QubXNhYVRleHR1cmU/LnZpZXcscj10P3RoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0Lm1zYWFUZXh0dXJlLnZpZXc6dGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3QudGV4dHVyZS52aWV3LG49dCYmdGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3QubXNhYVN0ZW5jaWw/LnZpZXc/dGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3QubXNhYVN0ZW5jaWwudmlldzp0aGlzLiRtYWluQXR0YWNobWVudE9iamVjdC5zdGVuY2lsLnZpZXcsaT10aGlzLmZyYW1lQnVmZmVyTWFuYWdlci5jcmVhdGVTdGVuY2lsUmVuZGVyUGFzc0Rlc2NyaXB0b3IocixuLCJsb2FkIixlKTt0aGlzLnJlbmRlclBhc3NFbmNvZGVyPXRoaXMuY29tbWFuZEVuY29kZXIuYmVnaW5SZW5kZXJQYXNzKGkpLHRoaXMudmlld3BvcnRXaWR0aD10aGlzLiRtYWluQXR0YWNobWVudE9iamVjdC53aWR0aCx0aGlzLnZpZXdwb3J0SGVpZ2h0PXRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0LmhlaWdodH0oKCk9Pntjb25zdCBlPVFuLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0O2UmJihlLm1hc2s9ITAsZS5jbGlwTGV2ZWwrKyxRYS5zZXQoZS5jbGlwTGV2ZWwsZS5jbGlwTGV2ZWwpLERhKCl8fGphKCEwKSl9KSgpLHRoaXMuaW5NYXNrTW9kZT0hMH1zZXRNYXNrQm91bmRzKGUsdCxyLG4pe1phKGUsdCxyLG4pfWVuZE1hc2soKXt0aGlzLnJlbmRlclBhc3NFbmNvZGVyJiYodGhpcy5yZW5kZXJQYXNzRW5jb2Rlci5lbmQoKSx0aGlzLnJlbmRlclBhc3NFbmNvZGVyPW51bGwpLEphKCksdGhpcy5pbk1hc2tNb2RlPSExfWxlYXZlTWFzaygpe3RoaXMuZHJhd0FycmF5c0luc3RhbmNlZCgpO2NvbnN0IGU9dGhpcy5mcmFtZUJ1ZmZlck1hbmFnZXIuZ2V0Q3VycmVudEF0dGFjaG1lbnQoKSx0PWU/LmNsaXBMZXZlbD8/MCxyPTE9PT10O2VzKCksdGhpcy5yZW5kZXJQYXNzRW5jb2RlciYmKHRoaXMucmVuZGVyUGFzc0VuY29kZXIuZW5kKCksdGhpcy5yZW5kZXJQYXNzRW5jb2Rlcj1udWxsKSx0aGlzLmVuc3VyZUNvbW1hbmRFbmNvZGVyKCk7Y29uc3Qgbj10aGlzLiRtYWluQXR0YWNobWVudE9iamVjdD8ubXNhYSYmdGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3Q/Lm1zYWFUZXh0dXJlPy52aWV3LGk9bj90aGlzLiRtYWluQXR0YWNobWVudE9iamVjdC5tc2FhVGV4dHVyZS52aWV3OnRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0Py50ZXh0dXJlLnZpZXcsYT1uJiZ0aGlzLiRtYWluQXR0YWNobWVudE9iamVjdD8ubXNhYVN0ZW5jaWw/LnZpZXc/dGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3QubXNhYVN0ZW5jaWwudmlldzp0aGlzLiRtYWluQXR0YWNobWVudE9iamVjdD8uc3RlbmNpbD8udmlldztpZihyJiZhKXtjb25zdCBlPXtjb2xvckF0dGFjaG1lbnRzOlt7dmlldzppLGxvYWRPcDoibG9hZCIsc3RvcmVPcDoic3RvcmUifV0sZGVwdGhTdGVuY2lsQXR0YWNobWVudDp7dmlldzphLHN0ZW5jaWxMb2FkT3A6ImNsZWFyIixzdGVuY2lsU3RvcmVPcDoic3RvcmUiLHN0ZW5jaWxDbGVhclZhbHVlOjB9fTt0aGlzLmNvbW1hbmRFbmNvZGVyLmJlZ2luUmVuZGVyUGFzcyhlKS5lbmQoKX1lbHNlIGlmKHQ+MSYmYSl7Y29uc3QgZT10LHI9YGNsaXBfY2xlYXJfbWFpbl8ke01hdGgubWluKDgsTWF0aC5tYXgoMSxlKSl9YCxuPXRoaXMucGlwZWxpbmVNYW5hZ2VyLmdldFBpcGVsaW5lKHIpO2lmKG4pe2NvbnN0IGU9dGhpcy5mcmFtZUJ1ZmZlck1hbmFnZXIuY3JlYXRlU3RlbmNpbFJlbmRlclBhc3NEZXNjcmlwdG9yKGksYSwibG9hZCIsImxvYWQiKSx0PXRoaXMuY29tbWFuZEVuY29kZXIuYmVnaW5SZW5kZXJQYXNzKGUpLHI9dGhpcy5idWZmZXJNYW5hZ2VyLmFjcXVpcmVWZXJ0ZXhCdWZmZXIocmMuYnl0ZUxlbmd0aCxyYyk7dC5zZXRQaXBlbGluZShuKSx0LnNldFN0ZW5jaWxSZWZlcmVuY2UoMCksdC5zZXRWZXJ0ZXhCdWZmZXIoMCxyKSx0LmRyYXcoNiwxLDAsMCksdC5lbmQoKX19fX1sZXQgeWM7Y29uc3QgX2M9ZT0+e3ljPWV9O2xldCB3YztsZXQgTWM9MDtsZXQgUGM9MDtsZXQgU2M9ITE7Y29uc3QgRmM9W10sVGM9KC4uLmUpPT57Y29uc3QgdD1GYy5wb3AoKXx8W107cmV0dXJuIGUubGVuZ3RoJiZ0LnB1c2goLi4uZSksdH0sQmM9KGUsdD0xKT0+KHtSOigxNjcxMTY4MCZlKT4+MTYsRzooNjUyODAmZSk+PjgsQjoyNTUmZSxBOjI1NSp0fSksT2M9YXN5bmMoZSx0KT0+e2lmKChlPT57d2M9ZX0pKGUpLCJncHUiaW4gbmF2aWdhdG9yKXtjb25zdCByPW5hdmlnYXRvci5ncHUsbj1hd2FpdCByLnJlcXVlc3RBZGFwdGVyKCk7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCJXZWJHUFUgYWRhcHRlciBub3QgYXZhaWxhYmxlIik7Y29uc3QgaT1hd2FpdCBuLnJlcXVlc3REZXZpY2UoKTtpZighaSl0aHJvdyBuZXcgRXJyb3IoIldlYkdQVSBkZXZpY2Ugbm90IGF2YWlsYWJsZSIpO2NvbnN0IGE9ZS5nZXRDb250ZXh0KCJ3ZWJncHUiKTtpZighYSl0aHJvdyBuZXcgRXJyb3IoIldlYkdQVSBjb250ZXh0IG5vdCBhdmFpbGFibGUiKTtjb25zdCBzPXIuZ2V0UHJlZmVycmVkQ2FudmFzRm9ybWF0KCk7X2MobmV3IHZjKGksYSxzLHQpKX1lbHNle2NvbnN0IHI9ZS5nZXRDb250ZXh0KCJ3ZWJnbDIiLHtzdGVuY2lsOiEwLHByZW11bHRpcGxpZWRBbHBoYTohMCxhbnRpYWxpYXM6ITEsZGVwdGg6ITF9KTtpZighcil0aHJvdyBuZXcgRXJyb3IoIndlYmdsMiBpcyBub3Qgc3VwcG9ydGVkLiIpO19jKG5ldyBLbihyLDQsdCkpfX0sQWM9KGUsdCxyPSEwKT0+e01jPT09ZSYmUGM9PT10fHwoU2M9ITAsTWM9ZSxQYz10LHljLnJlc2l6ZShlLHQsciksciYmeW4ucmVzZXQoKSl9LFJjPShlLHQ9ITEpPT57bGV0IHI9MDtmb3IoO2UubGVuZ3RoPnI7KXN3aXRjaChlW3IrK10pe2Nhc2UgOTp5Yy5iZWdpblBhdGgoKTticmVhaztjYXNlIDA6eWMubW92ZVRvKGVbcisrXSxlW3IrK10pO2JyZWFrO2Nhc2UgMjp5Yy5saW5lVG8oZVtyKytdLGVbcisrXSk7YnJlYWs7Y2FzZSAxOnljLnF1YWRyYXRpY0N1cnZlVG8oZVtyKytdLGVbcisrXSxlW3IrK10sZVtyKytdKTticmVhaztjYXNlIDU6aWYodCl7cis9NDticmVha315Yy5maWxsU3R5bGUoZVtyKytdLzI1NSxlW3IrK10vMjU1LGVbcisrXS8yNTUsZVtyKytdLzI1NSk7YnJlYWs7Y2FzZSA3OnljLmZpbGwoKTticmVhaztjYXNlIDY6aWYodCl7cis9ODticmVha315Yy50aGlja25lc3M9ZVtyKytdLHljLmNhcHM9ZVtyKytdLHljLmpvaW50cz1lW3IrK10seWMubWl0ZXJMaW1pdD1lW3IrK10seWMuc3Ryb2tlU3R5bGUoZVtyKytdLzI1NSxlW3IrK10vMjU1LGVbcisrXS8yNTUsZVtyKytdLzI1NSk7YnJlYWs7Y2FzZSA4OmlmKHQpYnJlYWs7eWMuc3Ryb2tlKCk7YnJlYWs7Y2FzZSAxMjp5Yy5jbG9zZVBhdGgoKTticmVhaztjYXNlIDQ6eWMuYXJjKGVbcisrXSxlW3IrK10sZVtyKytdKTticmVhaztjYXNlIDM6eWMuYmV6aWVyQ3VydmVUbyhlW3IrK10sZVtyKytdLGVbcisrXSxlW3IrK10sZVtyKytdLGVbcisrXSk7YnJlYWs7Y2FzZSAxMDp7aWYodCl7cis9MTtjb25zdCB0PWVbcisrXTtyKz01KnQscis9OSx5Yy5maWxsKCk7YnJlYWt9Y29uc3Qgbj1lW3IrK10saT1UYygpLGE9ZVtyKytdO2ZvcihsZXQgdD0wO3Q8YTsrK3QpaS5wdXNoKGVbcisrXSxlW3IrK10sZVtyKytdLGVbcisrXSxlW3IrK10pO2NvbnN0IHM9ZS5zdWJhcnJheShyLHIrNik7cis9Njtjb25zdCBvPWVbcisrXSxsPWVbcisrXSxjPWVbcisrXTt5Yy5ncmFkaWVudEZpbGwobixpLHMsbyxsLGMpfWJyZWFrO2Nhc2UgMTM6e2lmKHQpe3IrPTI7Y29uc3QgdD1lW3IrK107cis9dCxyKz04LHljLmZpbGwoKTticmVha31jb25zdCBuPWVbcisrXSxpPWVbcisrXSxhPWVbcisrXSxzPW5ldyBVaW50OEFycmF5KGUuc3ViYXJyYXkocixyK2EpKTtyKz1hO2NvbnN0IG89ZS5zdWJhcnJheShyLHIrNik7cis9Nix5Yy5iaXRtYXBGaWxsKHMsbyxuLGksQm9vbGVhbihlW3IrK10pLEJvb2xlYW4oZVtyKytdKSl9YnJlYWs7Y2FzZSAxMTp7aWYodCl7cis9MjAseWMuZmlsbCgpO2JyZWFrfXljLnRoaWNrbmVzcz1lW3IrK10seWMuY2Fwcz1lW3IrK10seWMuam9pbnRzPWVbcisrXSx5Yy5taXRlckxpbWl0PWVbcisrXTtjb25zdCBuPWVbcisrXSxpPVRjKCksYT1lW3IrK107Zm9yKGxldCB0PTA7dDxhOysrdClpLnB1c2goZVtyKytdLGVbcisrXSxlW3IrK10sZVtyKytdLGVbcisrXSk7Y29uc3Qgcz1lLnN1YmFycmF5KHIscis2KTtyKz02O2NvbnN0IG89ZVtyKytdLGw9ZVtyKytdLGM9ZVtyKytdO3ljLmdyYWRpZW50U3Ryb2tlKG4saSxzLG8sbCxjKX1icmVhaztjYXNlIDE0OntpZih0KXtyKz02O2NvbnN0IHQ9ZVtyKytdO3IrPXQscis9OCx5Yy5maWxsKCk7YnJlYWt9eWMudGhpY2tuZXNzPWVbcisrXSx5Yy5jYXBzPWVbcisrXSx5Yy5qb2ludHM9ZVtyKytdLHljLm1pdGVyTGltaXQ9ZVtyKytdO2NvbnN0IG49ZVtyKytdLGk9ZVtyKytdLGE9ZVtyKytdLHM9bmV3IFVpbnQ4QXJyYXkoZS5zdWJhcnJheShyLHIrYSkpO3IrPWE7Y29uc3Qgbz1lLnN1YmFycmF5KHIscis2KTtyKz02LHljLmJpdG1hcFN0cm9rZShzLG8sbixpLEJvb2xlYW4oZVtyKytdKSxCb29sZWFuKGVbcisrXSkpfX19LENjPWU9Pntzd2l0Y2goZSl7Y2FzZSAwOnJldHVybiJjb3B5IjtjYXNlIDE6cmV0dXJuImFkZCI7Y2FzZSAyOnJldHVybiJhbHBoYSI7Y2FzZSAzOnJldHVybiJkYXJrZW4iO2Nhc2UgNDpyZXR1cm4iZGlmZmVyZW5jZSI7Y2FzZSA1OnJldHVybiJlcmFzZSI7Y2FzZSA2OnJldHVybiJoYXJkbGlnaHQiO2Nhc2UgNzpyZXR1cm4iaW52ZXJ0IjtjYXNlIDg6cmV0dXJuImxheWVyIjtjYXNlIDk6cmV0dXJuImxpZ2h0ZW4iO2Nhc2UgMTA6cmV0dXJuIm11bHRpcGx5IjtjYXNlIDExOmRlZmF1bHQ6cmV0dXJuIm5vcm1hbCI7Y2FzZSAxMjpyZXR1cm4ib3ZlcmxheSI7Y2FzZSAxMzpyZXR1cm4ic2NyZWVuIjtjYXNlIDE0OnJldHVybiJzdWJ0cmFjdCJ9fSxFYz0oZSx0KT0+e2NvbnN0IHI9ZS5zdWJhcnJheSh0LHQrNik7dCs9Njtjb25zdCBuPWUuc3ViYXJyYXkodCx0KzgpO3QrPTg7Y29uc3QgaT1lLnN1YmFycmF5KHQsdCs0KTt0Kz00O2NvbnN0IGE9ZVt0KytdLHM9ZVt0KytdLG89ZVt0KytdLGw9ZVt0KytdLGM9Qm9vbGVhbihlW3QrK10pLHU9Qm9vbGVhbihlW3QrK10pLGY9Qm9vbGVhbihlW3QrK10pLGQ9YCR7ZVt0KytdfWAsaD1lW3QrK10scD1lW3QrK10sbT1lW3QrK10sZz1gJHtlW3QrK119YDtsZXQgYjtpZihlW3QrK10pe2lmKGI9eW4uZ2V0KGQsYCR7aH1gKSwhYilyZXR1cm4gdH1lbHNle2NvbnN0IHI9Yz9uZXcgRmxvYXQzMkFycmF5KDI4KTpudWxsO3ImJihyLnNldChlLnN1YmFycmF5KHQsdCsyNCkpLHQrPTI0KSx5Yy51c2VHcmlkKHIpO2NvbnN0IG49ZVt0KytdLGk9ZS5zdWJhcnJheSh0LHQrbik7aWYoZiYmIWMpe2NvbnN0IGU9TWF0aC5jZWlsKE1hdGguYWJzKG8tYSkpLHQ9TWF0aC5jZWlsKE1hdGguYWJzKGwtcykpO2I9eWMuY3JlYXRlTm9kZShlLHQpLHluLnNldChkLGAke2h9YCxiKTtjb25zdCByPXljLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0LG49eWMuYXRsYXNBdHRhY2htZW50T2JqZWN0O24mJnljLmJpbmQobikseWMucmVzZXQoKSx5Yy5iZWdpbk5vZGVSZW5kZXJpbmcoYik7Y29uc3QgYz1uP24uaGVpZ2h0LWIueS10OjA7eWMuc2V0VHJhbnNmb3JtKDEsMCwwLDEsYi54LGMpLHU/KFJjKGkpLHljLmRyYXdGaWxsKCkpOnljLmRyYXdQaXhlbHMoYixuZXcgVWludDhBcnJheShpKSkseWMuZW5kTm9kZVJlbmRlcmluZygpLHImJnljLmJpbmQocil9ZWxzZXtjb25zdCBlPU1hdGguY2VpbChNYXRoLmFicyhvLWEpKnApLHQ9TWF0aC5jZWlsKE1hdGguYWJzKGwtcykqbSk7Yj15Yy5jcmVhdGVOb2RlKGUsdCkseW4uc2V0KGQsYCR7aH1gLGIpO2NvbnN0IG49eWMuY3VycmVudEF0dGFjaG1lbnRPYmplY3QsYz15Yy5hdGxhc0F0dGFjaG1lbnRPYmplY3Q7YyYmeWMuYmluZChjKSx5Yy5yZXNldCgpLHljLmJlZ2luTm9kZVJlbmRlcmluZyhiKTtjb25zdCB1PWM/Yy5oZWlnaHQtYi55LXQ6MDt5Yy5zZXRUcmFuc2Zvcm0ocCwwLDAsbSwtYSpwK2IueCwtcyptK3UpLHImJihyWzI0XT1iLngsclsyNV09dSksUmMoaSkseWMuZHJhd0ZpbGwoKSx5Yy5lbmROb2RlUmVuZGVyaW5nKCksbiYmeWMuYmluZChuKX10Kz1ufWNvbnN0IHg9ZVt0KytdO2lmKEJvb2xlYW4oZVt0KytdKSl7Y29uc3QgYT1Cb29sZWFuKGVbdCsrXSkscz1lLnN1YmFycmF5KHQsdCs0KTt0Kz00O2NvbnN0IG89ZVt0KytdLGw9ZS5zdWJhcnJheSh0LHQrbyksYz1NYXRoLmNlaWwoTWF0aC5hYnMoaVsyXS1pWzBdKSksdT1NYXRoLmNlaWwoTWF0aC5hYnMoaVszXS1pWzFdKSk7cmV0dXJuIHljLmFwcGx5RmlsdGVyKGIsZyxhLGMsdSxmLHIsbixDYyh4KSxzLGwpLHQrPW99aWYoeWMuZ2xvYmFsQWxwaGE9TWF0aC5taW4oTWF0aC5tYXgoMCxuWzNdK25bN10vMjU1KSwxKSx5Yy5pbWFnZVNtb290aGluZ0VuYWJsZWQ9ITAseWMuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPUNjKHgpLGYmJiFjKXljLnNldFRyYW5zZm9ybShyWzBdLHJbMV0sclsyXSxyWzNdLHJbNF0scls1XSkseWMuZHJhd0Rpc3BsYXlPYmplY3QoYixpWzBdLGlbMV0saVsyXSxpWzNdLG4pO2Vsc2V7Y29uc3QgZT1NYXRoLmF0YW4yKHJbMV0sclswXSksdD1NYXRoLmF0YW4yKC1yWzJdLHJbM10pO2lmKGV8fHQpe2NvbnN0IG49YSpwLGk9cyptLG89TWF0aC5jb3MoZSksbD1NYXRoLnNpbihlKSxjPU1hdGguY29zKHQpLHU9TWF0aC5zaW4odCk7eWMuc2V0VHJhbnNmb3JtKG8sbCwtdSxjLG4qby1pKnUrcls0XSxuKmwraSpjK3JbNV0pfWVsc2UgeWMuc2V0VHJhbnNmb3JtKDEsMCwwLDEsaVswXSxpWzFdKTt5Yy5kcmF3RGlzcGxheU9iamVjdChiLGlbMF0saVsxXSxpWzJdLGlbM10sbil9cmV0dXJuIHR9LFVjPShlLHQpPT57Y29uc3Qgcj1lLnN1YmFycmF5KHQsdCs2KTt0Kz02LHljLnJlc2V0KCkseWMuc2V0VHJhbnNmb3JtKHJbMF0sclsxXSxyWzJdLHJbM10scls0XSxyWzVdKTtjb25zdCBuPUJvb2xlYW4oZVt0KytdKT9uZXcgRmxvYXQzMkFycmF5KDI4KTpudWxsO3ljLnVzZUdyaWQobiksbiYmKG4uc2V0KGUuc3ViYXJyYXkodCx0KzI0KSksdCs9MjQpO2NvbnN0IGk9ZVt0KytdLGE9ZS5zdWJhcnJheSh0LHQraSk7cmV0dXJuIFJjKGEsITApLHQrPWkseWMuY2xpcCgpLHR9LCRjPShlLHQscik9Pntjb25zdCBuPWUud2lkdGhUYWJsZVt0LmxpbmVdfHwwLGk9dC50ZXh0Rm9ybWF0LGE9aS5sZWZ0TWFyZ2lufHwwO2lmKCFyLndvcmRXcmFwJiZuPnIucmF3V2lkdGgpcmV0dXJuIE1hdGgubWF4KDAsYSk7Y29uc3Qgcz1pLnJpZ2h0TWFyZ2lufHwwO3JldHVybiJjZW50ZXIiPT09aS5hbGlnbnx8ImNlbnRlciI9PT1yLmF1dG9TaXplP01hdGgubWF4KDAsci5yYXdXaWR0aC8yLWEtcy1uLzItMik6InJpZ2h0Ij09PWkuYWxpZ258fCJyaWdodCI9PT1yLmF1dG9TaXplP01hdGgubWF4KDAsci5yYXdXaWR0aC1hLW4tcy00KTpNYXRoLm1heCgwLGEpfSxHYz1lPT57bGV0IHQ9IiI7cmV0dXJuIGUuaXRhbGljJiYodCs9Iml0YWxpYyAiKSxlLmJvbGQmJih0Kz0iYm9sZCAiKSxgJHt0fSR7ZS5zaXplfXB4ICcke2UuZm9udH0nLCdzYW5zLXNlcmlmJ2B9LGtjPW5ldyBUZXh0RGVjb2RlcixMYz0oZSx0KT0+e2NvbnN0IHI9ZS5zdWJhcnJheSh0LHQrNik7dCs9Njtjb25zdCBuPWUuc3ViYXJyYXkodCx0KzgpO3QrPTg7Y29uc3QgaT1lLnN1YmFycmF5KHQsdCs0KTt0Kz00O2NvbnN0IGE9ZVt0KytdLHM9ZVt0KytdLG89ZVt0KytdLGw9ZVt0KytdLGM9YCR7ZVt0KytdfWAsdT1lW3QrK10sZj1Cb29sZWFuKGVbdCsrXSksZD1lW3QrK10saD1lW3QrK10scD1gJHtlW3QrK119YDtsZXQgbTtpZihlW3QrK10pe2lmKG09eW4uZ2V0KGMsYCR7dX1gKSwhbSlyZXR1cm4gdH1lbHNle2NvbnN0IHI9TWF0aC5jZWlsKE1hdGguYWJzKG8tYSkqZCksbj1NYXRoLmNlaWwoTWF0aC5hYnMobC1zKSpoKSxpPUJvb2xlYW4oZVt0KytdKTttPWk/eW4uZ2V0KGMsYCR7dX1gKTp5Yy5jcmVhdGVOb2RlKHIsbiksaXx8eW4uc2V0KGMsYCR7dX1gLG0pO2NvbnN0IGY9ZVt0KytdLHA9bmV3IFVpbnQ4QXJyYXkoZS5zdWJhcnJheSh0LHQrZikpO3QrPWY7bGV0IGc9Im5vbmUiO3N3aXRjaChlW3QrK10pe2Nhc2UgMDpnPSJjZW50ZXIiO2JyZWFrO2Nhc2UgMTpnPSJsZWZ0IjticmVhaztjYXNlIDI6Zz0ibm9uZSI7YnJlYWs7Y2FzZSAzOmc9InJpZ2h0In1jb25zdCBiPXt3aWR0aDpyLGhlaWdodDpuLGF1dG9TaXplOmcsc3RvcEluZGV4OmVbdCsrXSxzY3JvbGxYOmVbdCsrXSxzY3JvbGxZOmVbdCsrXSx0ZXh0V2lkdGg6ZVt0KytdLHRleHRIZWlnaHQ6ZVt0KytdLHJhd1dpZHRoOmVbdCsrXSxyYXdIZWlnaHQ6ZVt0KytdLGZvY3VzSW5kZXg6ZVt0KytdLHNlbGVjdEluZGV4OmVbdCsrXSxmb2N1c1Zpc2libGU6Qm9vbGVhbihlW3QrK10pLHRoaWNrbmVzczplW3QrK10sdGhpY2tuZXNzQ29sb3I6ZVt0KytdLHdvcmRXcmFwOkJvb2xlYW4oZVt0KytdKSxib3JkZXI6Qm9vbGVhbihlW3QrK10pLGJvcmRlckNvbG9yOmVbdCsrXSxiYWNrZ3JvdW5kOkJvb2xlYW4oZVt0KytdKSxiYWNrZ3JvdW5kQ29sb3I6ZVt0KytdLGRlZmF1bHRDb2xvcjplW3QrK10sZGVmYXVsdFNpemU6ZVt0KytdfSx4PSgoZSx0LHIsbik9Pntjb25zdCBpPW5ldyBPZmZzY3JlZW5DYW52YXModC53aWR0aCx0LmhlaWdodCksYT1pLmdldENvbnRleHQoIjJkIik7aWYoIWEpcmV0dXJuIGk7Y29uc3Qgcz1NYXRoLm1pbigxLE1hdGgubWF4KHIsbikpO2lmKHQuYmFja2dyb3VuZHx8dC5ib3JkZXIpe2lmKGEuYmVnaW5QYXRoKCksYS5tb3ZlVG8oMCwwKSxhLmxpbmVUbyh0LndpZHRoLDApLGEubGluZVRvKHQud2lkdGgsdC5oZWlnaHQpLGEubGluZVRvKDAsdC5oZWlnaHQpLGEubGluZVRvKDAsMCksdC5iYWNrZ3JvdW5kKXtjb25zdCBlPUJjKHQuYmFja2dyb3VuZENvbG9yKTthLmZpbGxTdHlsZT1gcmdiYSgke2UuUn0sJHtlLkd9LCR7ZS5CfSwke2UuQX0pYCxhLmZpbGwoKX1pZih0LmJvcmRlcil7Y29uc3QgZT1CYyh0LmJvcmRlckNvbG9yKTthLmxpbmVXaWR0aD1zLGEuc3Ryb2tlU3R5bGU9YHJnYmEoJHtlLlJ9LCR7ZS5HfSwke2UuQn0sJHtlLkF9KWAsYS5zdHJva2UoKX19aWYoIWUpcmV0dXJuIGk7YS5zYXZlKCksYS5iZWdpblBhdGgoKSxhLm1vdmVUbygyLDIpLGEubGluZVRvKHQud2lkdGgtMiwyKSxhLmxpbmVUbyh0LndpZHRoLTIsdC5oZWlnaHQtMiksYS5saW5lVG8oMix0LmhlaWdodC0yKSxhLmxpbmVUbygyLDIpLGEuY2xpcCgpO2xldCBvPTI7aWYodC5zY3JvbGxYPjApe2NvbnN0IGU9KHQudGV4dFdpZHRoKzQtdC5yYXdXaWR0aCkvdC5yYXdXaWR0aDtvKz0tdC5zY3JvbGxYKmV9bGV0IGw9MjtpZih0LnNjcm9sbFk+MCl7Y29uc3QgZT0odC50ZXh0SGVpZ2h0KzItdC5yYXdIZWlnaHQpL3QucmF3SGVpZ2h0O2wrPS10LnNjcm9sbFkqZX1pZihhLnNldFRyYW5zZm9ybShyLDAsMCxuLG8qcixsKm4pLGEuYmVnaW5QYXRoKCksdC5zZWxlY3RJbmRleD4tMSYmdC5mb2N1c0luZGV4Pi0xKXtjb25zdCByPWUudGV4dFRhYmxlLmxlbmd0aC0xO2xldCBuPTAsaT0wO3QuZm9jdXNJbmRleDw9dC5zZWxlY3RJbmRleD8obj1NYXRoLm1pbih0LmZvY3VzSW5kZXgsciksaT1NYXRoLm1pbih0LnNlbGVjdEluZGV4LHIpKToobj1NYXRoLm1pbih0LnNlbGVjdEluZGV4LHIpLGk9TWF0aC5taW4odC5mb2N1c0luZGV4LTEscikpO2NvbnN0IHM9ZS50ZXh0VGFibGVbbl0sbz1lLmxpbmVUYWJsZVtzLmxpbmVdLGw9JGMoZSxvLHQpO2xldCBjPTA7aWYobiYmInRleHQiPT09cy5tb2RlKXtsZXQgdD1uO2Zvcig7dDspe2NvbnN0IHI9ZS50ZXh0VGFibGVbLS10XTtpZigidGV4dCIhPT1yLm1vZGUpYnJlYWs7Yys9ci53fX1hLmZpbGxTdHlsZT0iI2I0ZDdmZiI7bGV0IHU9MDtmb3IobGV0IHQ9bjt0PD1pOysrdCl7Y29uc3Qgcj1lLnRleHRUYWJsZVt0XTtpZigidGV4dCI9PT1yLm1vZGUmJih1Kz1yLncsdCE9PWkpKWNvbnRpbnVlO2xldCBuPTA7Y29uc3Qgcz0idGV4dCI9PT1yLm1vZGU/ci5saW5lOnIubGluZS0xO2ZvcihsZXQgdD0wO3Q8czsrK3Qpbis9ZS5oZWlnaHRUYWJsZVt0XTthLmJlZ2luUGF0aCgpLGEucmVjdChjLG4sdStsLGUuaGVpZ2h0VGFibGVbc10pLGEuZmlsbCgpLGM9MCx1PTB9fWNvbnN0IGM9dC5yYXdXaWR0aDtsZXQgdT0wO2lmKHQuc2Nyb2xsWD4wKXtjb25zdCBlPSh0LnRleHRXaWR0aC1jKS9jO3U9dC5zY3JvbGxYKmV9Y29uc3QgZj1jK3UsZD10LnJhd0hlaWdodDtsZXQgaD0wO2lmKHQuc2Nyb2xsWT4wKXtjb25zdCBlPSh0LnRleHRIZWlnaHQtZCkvZDtoPXQuc2Nyb2xsWSplfWNvbnN0IHA9ZCtoO2xldCBtPTAsZz0wLGI9MCx4PTAsdj0hMSx5PS0xO2ZvcihsZXQgcj0wO3I8ZS50ZXh0VGFibGUubGVuZ3RoOysrcil7Y29uc3Qgbj1lLnRleHRUYWJsZVtyXTtpZighbiljb250aW51ZTtpZigoInRleHQiPT09bi5tb2RlfHwiYnJlYWsiPT09bi5tb2RlKSYmKHkrKyx0LnN0b3BJbmRleD4tMSYmeT50LnN0b3BJbmRleCkpYnJlYWs7aWYodiYmInRleHQiPT09bi5tb2RlKWNvbnRpbnVlO2NvbnN0IGk9bi50ZXh0Rm9ybWF0O2lmKCJub25lIj09PXQuYXV0b1NpemUpe2lmKGc+cClicmVhaztpZigidGV4dCI9PT1uLm1vZGUmJih1Pm0rbi53fHxtPmYpKXttKz1uLnc7Y29udGludWV9fWNvbnN0IG89QmMoaS5jb2xvcnx8MCk7aWYoYS5maWxsU3R5bGU9YHJnYmEoJHtvLlJ9LCR7by5HfSwke28uQn0sJHtvLkF9KWAsdC5mb2N1c1Zpc2libGUmJnQuZm9jdXNJbmRleD09PXIpe2NvbnN0IHQ9bStiKy4xO2xldCByPW4ubGluZSxpPW4ueSxzPWUuYXNjZW50VGFibGVbcl07InRleHQiIT09bi5tb2RlJiYoaT0iYnJlYWsiPT09bi5tb2RlP24uaDplLmFzY2VudFRhYmxlW3ItMV0scj4wPyhyPW4ubGluZS0xLHM9ZS5hc2NlbnRUYWJsZVtyXSk6cz1uLmgpLHI+MCYmMD09PWUuYXNjZW50VGFibGVbcl0mJnIrKztmb3IobGV0IHQ9MDt0PHI7Kyt0KXMrPWUuaGVpZ2h0VGFibGVbdF07YS5zdHJva2VTdHlsZT1gcmdiYSgke28uUn0sJHtvLkd9LCR7by5CfSwke28uQX0pYCxhLmJlZ2luUGF0aCgpLGEubW92ZVRvKHQscyksYS5saW5lVG8odCxzLWkpLGEuc3Ryb2tlKCl9aWYodC50aGlja25lc3Mpe2NvbnN0IGU9QmModC50aGlja25lc3NDb2xvcik7YS5saW5lV2lkdGg9dC50aGlja25lc3MsYS5zdHJva2VTdHlsZT1gcmdiYSgke2UuUn0sJHtlLkd9LCR7ZS5CfSwke2UuQX0pYH1jb25zdCBsPTB8bi5saW5lO3N3aXRjaChuLm1vZGUpe2Nhc2UiYnJlYWsiOmNhc2Uid3JhcCI6aWYobT0wLGwmJihnKz1lLmhlaWdodFRhYmxlW2wtMV0pLGg+ZytlLmhlaWdodFRhYmxlW2xdKXt2PSEwO2NvbnRpbnVlfXg9ZS5hc2NlbnRUYWJsZVtsXSxiPSRjKGUsbix0KSx2PSExO2JyZWFrO2Nhc2UidGV4dCI6e2EuYmVnaW5QYXRoKCksYS5mb250PUdjKGkpO2NvbnN0IGU9bStiLHI9Zyt4O2lmKGkudW5kZXJsaW5lKXtjb25zdCB0PUJjKGkuY29sb3J8fDApO2EubGluZVdpZHRoPXMsYS5zdHJva2VTdHlsZT1gcmdiYSgke3QuUn0sJHt0Lkd9LCR7dC5CfSwke3QuQX0pYCxhLmJlZ2luUGF0aCgpLGEubW92ZVRvKGUscisyKSxhLmxpbmVUbyhlK24udyxyKzIpLGEuc3Ryb2tlKCl9dC50aGlja25lc3MmJmEuc3Ryb2tlVGV4dChuLnRleHQsZSxyKSxhLmZpbGxUZXh0KG4udGV4dCxlLHIpLG0rPW4ud319fWlmKHQuZm9jdXNWaXNpYmxlJiZ0LmZvY3VzSW5kZXg+PWUudGV4dFRhYmxlLmxlbmd0aCl7Y29uc3Qgcj1lLnRleHRUYWJsZVt0LmZvY3VzSW5kZXgtMV07aWYocil7Y29uc3QgZT1CYyhyLnRleHRGb3JtYXQuY29sb3J8fDApO2Euc3Ryb2tlU3R5bGU9YHJnYmEoJHtlLlJ9LCR7ZS5HfSwke2UuQn0sJHtlLkF9KWA7Y29uc3QgdD1tK2IrLjEsbj1nK3g7YS5iZWdpblBhdGgoKSwidGV4dCI9PT1yLm1vZGU/YS5tb3ZlVG8odCxuLXIueSk6YS5tb3ZlVG8odCxuK3IuaCksYS5saW5lVG8odCxuKSxhLnN0cm9rZSgpfX1yZXR1cm4gYS5yZXN0b3JlKCksaX0pKEpTT04ucGFyc2Uoa2MuZGVjb2RlKHApKSxiLGQsaCksdj15Yy5jdXJyZW50QXR0YWNobWVudE9iamVjdCx5PXljLmF0bGFzQXR0YWNobWVudE9iamVjdDt5JiZ5Yy5iaW5kKHkpLHljLnJlc2V0KCkseWMuYmVnaW5Ob2RlUmVuZGVyaW5nKG0pO2NvbnN0IF89eT95LmhlaWdodC1tLnktbjowO3ljLnNldFRyYW5zZm9ybSgxLDAsMCwxLG0ueCxfKSx5Yy5kcmF3RWxlbWVudChtLHgpLHljLmVuZE5vZGVSZW5kZXJpbmcoKSx2JiZ5Yy5iaW5kKHYpfWNvbnN0IGc9ZVt0KytdO2lmKEJvb2xlYW4oZVt0KytdKSl7Y29uc3QgYT1Cb29sZWFuKGVbdCsrXSkscz1lLnN1YmFycmF5KHQsdCs0KTt0Kz00O2NvbnN0IG89ZVt0KytdLGw9ZS5zdWJhcnJheSh0LHQrbyksYz1NYXRoLmNlaWwoTWF0aC5hYnMoaVsyXS1pWzBdKSksdT1NYXRoLmNlaWwoTWF0aC5hYnMoaVszXS1pWzFdKSk7cmV0dXJuIHljLmFwcGx5RmlsdGVyKG0scCxCb29sZWFuKE1hdGgubWF4KCtmLCthKSksYyx1LCExLHIsbixDYyhnKSxzLGwpLHQrPW99eWMuZ2xvYmFsQWxwaGE9TWF0aC5taW4oTWF0aC5tYXgoMCxuWzNdK25bN10vMjU1KSwxKSx5Yy5pbWFnZVNtb290aGluZ0VuYWJsZWQ9ITAseWMuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPUNjKGcpO2NvbnN0IGI9TWF0aC5hdGFuMihyWzFdLHJbMF0pLHg9TWF0aC5hdGFuMigtclsyXSxyWzNdKTtpZihifHx4KXtjb25zdCBlPWEqZCx0PXMqaCxuPU1hdGguY29zKGIpLGk9TWF0aC5zaW4oYiksbz1NYXRoLmNvcyh4KSxsPU1hdGguc2luKHgpO3ljLnNldFRyYW5zZm9ybShuLGksLWwsbyxlKm4tdCpsK3JbNF0sZSppK3QqbytyWzVdKX1lbHNlIHljLnNldFRyYW5zZm9ybSgxLDAsMCwxLGlbMF0saVsxXSk7cmV0dXJuIHljLmRyYXdEaXNwbGF5T2JqZWN0KG0saVswXSxpWzFdLGlbMl0saVszXSxuKSx0fSxJYz0oZSx0LHIpPT57Y29uc3Qgbj1lLnN1YmFycmF5KHQsdCs2KTt0Kz02O2NvbnN0IGk9ZS5zdWJhcnJheSh0LHQrOCk7dCs9ODtjb25zdCBhPWUuc3ViYXJyYXkodCx0KzQpO3QrPTQ7Y29uc3Qgcz1lW3QrK10sbz1lW3QrK10sbD1lW3QrK10sYz1lW3QrK10sdT1gJHtlW3QrK119YCxmPUJvb2xlYW4oZVt0KytdKSxkPWAke2VbdCsrXX1gO2xldCBoO2lmKGVbdCsrXSl7aWYoaD15bi5nZXQodSwiMCIpLCFoKXJldHVybiB0fWVsc2V7Y29uc3Qgbj1NYXRoLmFicyhsLXMpLGk9TWF0aC5hYnMoYy1vKSxhPUJvb2xlYW4oZVt0KytdKTtpZihoPWE/eW4uZ2V0KHUsIjAiKTp5Yy5jcmVhdGVOb2RlKG4saSksYXx8eW4uc2V0KHUsIjAiLGgpLHImJnIubGVuZ3RoKXtjb25zdCBlPXljLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0LHQ9eWMuYXRsYXNBdHRhY2htZW50T2JqZWN0O3QmJnljLmJpbmQodCkseWMucmVzZXQoKSx5Yy5iZWdpbk5vZGVSZW5kZXJpbmcoaCk7Y29uc3Qgbj10P3QuaGVpZ2h0LWgueS1pOjA7eWMuc2V0VHJhbnNmb3JtKDEsMCwwLDEsaC54LG4pO2NvbnN0IGE9ci5zaGlmdCgpO3ljLmRyYXdFbGVtZW50KGgsYSwhMCkseWMuZW5kTm9kZVJlbmRlcmluZygpLGUmJnljLmJpbmQoZSl9fWNvbnN0IHA9ZVt0KytdO2lmKEJvb2xlYW4oZVt0KytdKSl7Y29uc3Qgcj1Cb29sZWFuKGVbdCsrXSkscz1lLnN1YmFycmF5KHQsdCs0KTt0Kz00O2NvbnN0IG89ZVt0KytdLGw9ZS5zdWJhcnJheSh0LHQrbyksYz1NYXRoLmNlaWwoTWF0aC5hYnMoYVsyXS1hWzBdKSksdT1NYXRoLmNlaWwoTWF0aC5hYnMoYVszXS1hWzFdKSk7cmV0dXJuIHljLmFwcGx5RmlsdGVyKGgsZCxCb29sZWFuKE1hdGgubWF4KCtmLCtyKSksYyx1LCEwLG4saSxDYyhwKSxzLGwpLHQrPW99cmV0dXJuIHljLmdsb2JhbEFscGhhPU1hdGgubWluKE1hdGgubWF4KDAsaVszXStpWzddLzI1NSksMSkseWMuaW1hZ2VTbW9vdGhpbmdFbmFibGVkPSEwLHljLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj1DYyhwKSx5Yy5zZXRUcmFuc2Zvcm0oblswXSxuWzFdLG5bMl0sblszXSxuWzRdLG5bNV0pLHljLmRyYXdEaXNwbGF5T2JqZWN0KGgsYVswXSxhWzFdLGFbMl0sYVszXSxpKSx0fSxWYz0oZSx0KT0+e2NvbnN0IHI9ZVt0KytdO2ZvcihsZXQgbj0wO248cjsrK24pe3N3aXRjaChlW3QrK10pe2Nhc2UgMDp0PVZjKGUsdCk7YnJlYWs7Y2FzZSAxOnQ9VWMoZSx0KX19cmV0dXJuIHR9LHpjPShlLHQscik9PntsZXQgbj0wLGk9ITA7Y29uc3QgYT1DYyhlW3QrK10pLHM9Qm9vbGVhbihlW3QrK10pO2xldCBvPTAsbD0wLGM9ITEsdT0iIixmPSIiLGQ9bnVsbCxoPW51bGwscD1udWxsLG09bnVsbDtpZihzKWlmKG89ZVt0KytdLGw9ZVt0KytdLGM9Qm9vbGVhbihlW3QrK10pLGMpe2NvbnN0IHI9Qm9vbGVhbihlW3QrK10pO2lmKHU9YCR7ZVt0KytdfWAsZj1gJHtlW3QrK119YCxyKXJldHVybiBkPWUuc3ViYXJyYXkodCx0KzQpLHQrPTQscD1lLnN1YmFycmF5KHQsdCs2KSx0Kz02LG09ZS5zdWJhcnJheSh0LHQrOCksdCs9OCx5Yy5jb250YWluZXJEcmF3Q2FjaGVkRmlsdGVyKGEscCxtLGQsdSxmKSx0O2Q9ZS5zdWJhcnJheSh0LHQrNCksdCs9NCxwPWUuc3ViYXJyYXkodCx0KzYpLHQrPTYsbT1lLnN1YmFycmF5KHQsdCs4KSx0Kz04O2NvbnN0IG49ZVt0KytdO2g9ZS5zdWJhcnJheSh0LHQrbiksdCs9bn1lbHNlIHA9ZS5zdWJhcnJheSh0LHQrNiksdCs9NixtPWUuc3ViYXJyYXkodCx0KzgpLHQrPTg7cyYmeWMuY29udGFpbmVyQmVnaW5MYXllcihvLGwpO2NvbnN0IGc9Qm9vbGVhbihlW3QrK10pO2lmKGcpe3ljLmRyYXdBcnJheXNJbnN0YW5jZWQoKSx5Yy5zYXZlKCkseWMuYmVnaW5NYXNrKCkseWMuc2V0TWFza0JvdW5kcyhlW3QrK10sZVt0KytdLGVbdCsrXSxlW3QrK10pO3N3aXRjaChlW3QrK10pe2Nhc2UgMDp0PVZjKGUsdCk7YnJlYWs7Y2FzZSAxOnQ9VWMoZSx0KX15Yy5lbmRNYXNrKCl9Y29uc3QgYj1lW3QrK107Zm9yKGxldCBhPTA7Yj5hO2ErKyl7Y29uc3QgYT1lW3QrK10scz1lW3QrK107aWYobiYmYT5uJiYoaSYmKHljLnJlc3RvcmUoKSx5Yy5sZWF2ZU1hc2soKSksbj0wLGk9ITApLCFpKWNvbnRpbnVlO2lmKHMpe2lmKG49cyxpPUJvb2xlYW4oZVt0KytdKSwhaSljb250aW51ZTt5Yy5kcmF3QXJyYXlzSW5zdGFuY2VkKCkseWMuc2F2ZSgpLHljLmJlZ2luTWFzaygpLHljLnNldE1hc2tCb3VuZHMoZVt0KytdLGVbdCsrXSxlW3QrK10sZVt0KytdKTtzd2l0Y2goZVt0KytdKXtjYXNlIDA6dD1WYyhlLHQpO2JyZWFrO2Nhc2UgMTp0PVVjKGUsdCl9eWMuZW5kTWFzaygpO2NvbnRpbnVlfWlmKCFlW3QrK10pY29udGludWU7c3dpdGNoKGVbdCsrXSl7Y2FzZSAwOnQ9emMoZSx0LHIpO2JyZWFrO2Nhc2UgMTp0PUVjKGUsdCk7YnJlYWs7Y2FzZSAyOnQ9TGMoZSx0KTticmVhaztjYXNlIDM6dD1JYyhlLHQscil9fXJldHVybihufHxnKSYmKHljLnJlc3RvcmUoKSx5Yy5sZWF2ZU1hc2soKSkscyYmeWMuY29udGFpbmVyRW5kTGF5ZXIoYSxwLG0sYyxkLGgsdSxmKSx0fTtsZXQgamM9LTE7Y29uc3QgRGM9KGUsdCk9Pnt5Yy5jbGVhclRyYW5zZmVyQm91bmRzKCk7bGV0IHI9MDtjb25zdCBuPWVbcisrXTtmb3IoamMhPT1uJiYoamM9biwtMT09PWpjP3ljLnVwZGF0ZUJhY2tncm91bmRDb2xvcigwLDAsMCwwKTp5Yy51cGRhdGVCYWNrZ3JvdW5kQ29sb3IoKGpjPj4xNiYyNTUpLzI1NSwoamM+PjgmMjU1KS8yNTUsKDI1NSZqYykvMjU1LDEpKSx5Yy5yZXNldCgpLHljLnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCkseWMuZmlsbEJhY2tncm91bmRDb2xvcigpO2UubGVuZ3RoPnI7KXtpZighZVtyKytdKWNvbnRpbnVlO2NvbnN0IG49ZVtyKytdO3N3aXRjaChuKXtjYXNlIDA6cj16YyhlLHIsdCk7YnJlYWs7Y2FzZSAxOnI9RWMoZSxyKTticmVhaztjYXNlIDI6cj1MYyhlLHIpO2JyZWFrO2Nhc2UgMzpyPUljKGUscix0KTticmVhaztkZWZhdWx0OmNvbnNvbGUuZXJyb3IoInVua25vd24gdHlwZSIsbil9fXljLmRyYXdBcnJheXNJbnN0YW5jZWQoKSxTYyYmKHdjLndpZHRoPU1jLHdjLmhlaWdodD1QYyxTYz0hMSkseWMudHJhbnNmZXJNYWluQ2FudmFzKCl9LE5jPWU9Pntmb3IobGV0IHQ9MDt0PGUubGVuZ3RoOysrdCl7Y29uc3Qgcj1gJHtlW3RdfWA7aWYoIXluLmhhcyhyKSljb250aW51ZTtjb25zdCBuPXluLmdldEJ5SWQocik7Zm9yKGNvbnN0IGUgb2Ygbi52YWx1ZXMoKSl5Yy5yZW1vdmVOb2RlKGUpO3luLnJlbW92ZUJ5SWQocil9fSxXYz1hc3luYyhlLHQscixuPTAsaT0wLGEpPT57eWMuY2xlYXJUcmFuc2ZlckJvdW5kcygpO2xldCBzPTE7eWMucmVzZXQoKSx5Yy5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApO2NvbnN0IG89eWMuJGNsZWFyQ29sb3JSLGw9eWMuJGNsZWFyQ29sb3JHLGM9eWMuJGNsZWFyQ29sb3JCLHU9eWMuJGNsZWFyQ29sb3JBO2Zvcih5Yy51cGRhdGVCYWNrZ3JvdW5kQ29sb3IoKG4+PjE2JjI1NSkvMjU1LChuPj44JjI1NSkvMjU1LCgyNTUmbikvMjU1LGkpLHljLmZpbGxCYWNrZ3JvdW5kQ29sb3IoKTtlLmxlbmd0aD5zOyl7aWYoIWVbcysrXSljb250aW51ZTtjb25zdCB0PWVbcysrXTtzd2l0Y2godCl7Y2FzZSAwOnM9emMoZSxzLGEpO2JyZWFrO2Nhc2UgMTpzPUVjKGUscyk7YnJlYWs7Y2FzZSAyOnM9TGMoZSxzKTticmVhaztjYXNlIDM6cz1JYyhlLHMsYSk7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLmVycm9yKCJ1bmtub3duIHR5cGUiLHQpfX15Yy5kcmF3QXJyYXlzSW5zdGFuY2VkKCk7Y29uc3QgZj1hd2FpdCB5Yy5jcmVhdGVJbWFnZUJpdG1hcCh0LHIpO3JldHVybiB5Yy51cGRhdGVCYWNrZ3JvdW5kQ29sb3IobyxsLGMsdSksZn07Y29uc3QgcWM9bmV3IGNsYXNze2NvbnN0cnVjdG9yKCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInN0YXRlIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInF1ZXVlIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksdGhpcy5zdGF0ZT0iZGVhY3RpdmF0ZSIsdGhpcy5xdWV1ZT1bXX1hc3luYyBleGVjdXRlKCl7Zm9yKHRoaXMuc3RhdGU9ImFjdGl2ZSI7dGhpcy5xdWV1ZS5sZW5ndGg7KXtjb25zdCBlPXRoaXMucXVldWUuc2hpZnQoKTtpZihlKXN3aXRjaChlLmNvbW1hbmQpe2Nhc2UicmVuZGVyIjpEYyhlLmJ1ZmZlci5zdWJhcnJheSgwLGUubGVuZ3RoKSxlLmltYWdlQml0bWFwcyksZ2xvYmFsVGhpcy5wb3N0TWVzc2FnZSh7bWVzc2FnZToicmVuZGVyIixidWZmZXI6ZS5idWZmZXJ9LFtlLmJ1ZmZlci5idWZmZXJdKTticmVhaztjYXNlInJlc2l6ZSI6QWMoZS5idWZmZXJbMF0sZS5idWZmZXJbMV0sQm9vbGVhbihlLmJ1ZmZlclsyXSkpO2JyZWFrO2Nhc2UiaW5pdGlhbGl6ZSI6YXdhaXQgT2MoZS5jYW52YXMsZS5kZXZpY2VQaXhlbFJhdGlvKTticmVhaztjYXNlInJlbW92ZUNhY2hlIjpOYyhlLmJ1ZmZlcik7YnJlYWs7Y2FzZSJjYWNoZUNsZWFyIjp5bi5yZXNldCgpO2JyZWFrO2Nhc2UiY2FwdHVyZSI6e2NvbnN0IHQ9YXdhaXQgV2MoZS5idWZmZXIuc3ViYXJyYXkoMCxlLmxlbmd0aCksZS53aWR0aCxlLmhlaWdodCxlLmJnQ29sb3IsZS5iZ0FscGhhLGUuaW1hZ2VCaXRtYXBzKTtnbG9iYWxUaGlzLnBvc3RNZXNzYWdlKHttZXNzYWdlOiJjYXB0dXJlIixidWZmZXI6ZS5idWZmZXIsaW1hZ2VCaXRtYXA6dH0sW2UuYnVmZmVyLmJ1ZmZlcix0XSl9fX10aGlzLnN0YXRlPSJkZWFjdGl2YXRlIn19O3NlbGYuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsYXN5bmMgZT0+e3FjLnF1ZXVlLnB1c2goZS5kYXRhKSwiZGVhY3RpdmF0ZSI9PT1xYy5zdGF0ZSYmYXdhaXQgcWMuZXhlY3V0ZSgpfSk7cmV0dXJue319KCk7Cg==';
|
|
1
|
+
export const workerInlineUrl = 'data:application/javascript;base64,dmFyIFJlbmRlcmVyV29ya2VyPWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2xldCBlPTIwNDg7bGV0IHQ9NDtsZXQgcjtsZXQgbjtsZXQgaT0hMTtjb25zdCBhPSgpPT57aXx8KGk9ITAsci5lbmFibGUoci5TQ0lTU09SX1RFU1QpKX0scz0oKT0+e2kmJihpPSExLHIuZGlzYWJsZShyLlNDSVNTT1JfVEVTVCkpfTtsZXQgbz0hMTtjb25zdCBsPSgpPT57b3x8KG89ITAsci5lbmFibGUoci5TVEVOQ0lMX1RFU1QpKX0sYz0oKT0+e28mJihvPSExLHIuZGlzYWJsZShyLlNURU5DSUxfVEVTVCkpfSx1PShlLHQscixuPW51bGwpPT57Y29uc3QgaT0rZTtyZXR1cm4gaXNOYU4oaSkmJm51bGwhPT1uP246TWF0aC5taW4oTWF0aC5tYXgodCxpc05hTihpKT8wOmkpLHIpfSxmPVtdLGQ9KC4uLmUpPT57Y29uc3QgdD1mLnBvcCgpfHxbXTtyZXR1cm4gZS5sZW5ndGgmJnQucHVzaCguLi5lKSx0fSxoPShlPW51bGwpPT57ZSYmKGUubGVuZ3RoJiYoZS5sZW5ndGg9MCksZi5wdXNoKGUpKX0scD1lPT4oZS0tLGV8PWU+PjEsZXw9ZT4+MixlfD1lPj40LGV8PWU+PjgsZXw9ZT4+MTYsKytlKSxtPVtdLGc9KGU9MCx0PTAscj0wLG49MCk9Pntjb25zdCBpPW0ucG9wKCl8fG5ldyBGbG9hdDMyQXJyYXkoNCk7cmV0dXJuIGlbMF09ZSxpWzFdPXQsaVsyXT1yLGlbM109bixpfSxiPWU9PnttLnB1c2goZSl9LHg9W10sdj0oZT0wLHQ9MCxyPTAsbj0wLGk9MCxhPTAscz0wLG89MCxsPTApPT57Y29uc3QgYz14LnBvcCgpfHxuZXcgRmxvYXQzMkFycmF5KDkpO3JldHVybiBjWzBdPWUsY1sxXT10LGNbMl09cixjWzNdPW4sY1s0XT1pLGNbNV09YSxjWzZdPXMsY1s3XT1vLGNbOF09bCxjfSx5PVtdLF89KGU9MCx0PTAscj0wLG49MCxpPTAsYT0wKT0+e2NvbnN0IHM9eS5wb3AoKXx8bmV3IEZsb2F0MzJBcnJheSg2KTtyZXR1cm4gc1swXT1lLHNbMV09dCxzWzJdPXIsc1szXT1uLHNbNF09aSxzWzVdPWEsc30sdz1lPT57eS5wdXNoKGUpfSxNPWU9Pntjb25zdCB0PTEvKGVbMF0qZVs0XS1lWzNdKmVbMV0pLHI9ZVszXSplWzddLWVbNF0qZVs2XSxuPWVbMV0qZVs2XS1lWzBdKmVbN107cmV0dXJuIHYoZVs0XSp0LDAtZVsxXSp0LDAsMC1lWzNdKnQsZVswXSp0LDAscip0LG4qdCwxKX07bGV0IFA9MCxTPTA7bGV0IEY9MTtjb25zdCBUPWQoKSxCPWQoKSxPPShlPSExKT0+e2NvbnN0IHQ9ZT82Ojk7VC5sZW5ndGg+PXQmJkIucHVzaChULnNsaWNlKDApKSxULmxlbmd0aD0wO2NvbnN0IHI9W107Zm9yKGxldCBlPTA7ZTxCLmxlbmd0aDtlKyspe2NvbnN0IG49QltlXTtuLmxlbmd0aD49dCYmci5wdXNoKG4pfXJldHVybiBCLmxlbmd0aD0wLHJ9LEE9KGUsdCxyKT0+e1QucHVzaChlLHQscil9LFI9KGUsdCk9Pntjb25zdCByPVQubGVuZ3RoLG49K1Rbci0zXSxpPStUW3ItMl07cmV0dXJuIGU9PT1uJiZ0PT09aX0sQz0oZSx0KT0+e1QubGVuZ3RoP1IoZSx0KXx8KFQubGVuZ3RoPDN8fEIucHVzaChULnNsaWNlKDApKSxULmxlbmd0aD0wLEEoZSx0LCExKSk6QShlLHQsITEpfSxFPShlLHQscixuKT0+e1QubGVuZ3RofHxDKDAsMCksUihyLG4pfHwoQShlLHQsITApLEEocixuLCExKSl9O2xldCBVPW5ldyBGbG9hdDMyQXJyYXkoNjQpLCQ9MDtjb25zdCBHPShlLHQscixuLGksYSxzLG8pPT57Y29uc3QgbD0oKGUsdCxyLG4saSxhLHMsbyk9Pntjb25zdCBsPTMqci0yKmUtcyxjPTMqbi0yKnQtbyx1PTMqaS0yKnMtZSxmPTMqYS0yKm8tdDtyZXR1cm4gTWF0aC5tYXgobCpsK2MqYyx1KnUrZipmKX0pKGUsdCxyLG4saSxhLHMsbyk7aWYobDwuMjUpcmV0dXJuIDI7Y29uc3QgYz1NYXRoLmNlaWwoTWF0aC5sb2cyKE1hdGguc3FydChsKS8uNSkvMik7cmV0dXJuIE1hdGgubWluKE1hdGgubWF4KGMrMiwyKSw4KX0saz1bXTtsZXQgTD0wO2NvbnN0IEk9KCk9PntMPTB9LFY9KCk9PihMPj1rLmxlbmd0aCYmay5wdXNoKG5ldyBGbG9hdDMyQXJyYXkoOCkpLGtbTCsrXSksej0oZSx0LHIsbixpLGEscyxvLGwsYyx1KT0+e2NvbnN0IGY9MS1sLGQ9ZiplK2wqcixoPWYqdCtsKm4scD1mKnIrbCppLG09ZipuK2wqYSxnPWYqaStsKnMsYj1mKmErbCpvLHg9ZipkK2wqcCx2PWYqaCtsKm0seT1mKnArbCpnLF89ZiptK2wqYix3PWYqeCtsKnksTT1mKnYrbCpfO2NbMF09ZSxjWzFdPXQsY1syXT1kLGNbM109aCxjWzRdPXgsY1s1XT12LGNbNl09dyxjWzddPU0sdVswXT13LHVbMV09TSx1WzJdPXksdVszXT1fLHVbNF09Zyx1WzVdPWIsdVs2XT1zLHVbN109b30saj0oZSx0LHIsbixpLGEscyxvLGwsYyk9Pntjb25zdCB1PS4yNSooMypyKzMqaS1lLXMpLGY9LjI1KigzKm4rMyphLXQtbyk7bFtjXT11LGxbYysxXT1mLGxbYysyXT1zLGxbYyszXT1vfSxEPW5ldyBGbG9hdDMyQXJyYXkoOCksTj1uZXcgRmxvYXQzMkFycmF5KDgpLFc9KGUsdCxyLG4saSxhLHMsbyk9Pntjb25zdCBsPUcoZSx0LHIsbixpLGEscyxvKTt2YXIgYztjPTQqbCxVLmxlbmd0aDxjJiYoVT1uZXcgRmxvYXQzMkFycmF5KDIqYykpO2xldCB1PTA7aWYobDw9Mil6KGUsdCxyLG4saSxhLHMsbywuNSxELE4pLGooRFswXSxEWzFdLERbMl0sRFszXSxEWzRdLERbNV0sRFs2XSxEWzddLFUsdSksdSs9NCxqKE5bMF0sTlsxXSxOWzJdLE5bM10sTls0XSxOWzVdLE5bNl0sTls3XSxVLHUpLHUrPTQ7ZWxzZSBpZihsPD00KXtJKCk7Y29uc3QgbD1WKCksYz1WKCk7eihlLHQscixuLGksYSxzLG8sLjUsbCxjKTtjb25zdCBmPVYoKSxkPVYoKSxoPVYoKSxwPVYoKTt6KGxbMF0sbFsxXSxsWzJdLGxbM10sbFs0XSxsWzVdLGxbNl0sbFs3XSwuNSxmLGQpLHooY1swXSxjWzFdLGNbMl0sY1szXSxjWzRdLGNbNV0sY1s2XSxjWzddLC41LGgscCksaihmWzBdLGZbMV0sZlsyXSxmWzNdLGZbNF0sZls1XSxmWzZdLGZbN10sVSx1KSx1Kz00LGooZFswXSxkWzFdLGRbMl0sZFszXSxkWzRdLGRbNV0sZFs2XSxkWzddLFUsdSksdSs9NCxqKGhbMF0saFsxXSxoWzJdLGhbM10saFs0XSxoWzVdLGhbNl0saFs3XSxVLHUpLHUrPTQsaihwWzBdLHBbMV0scFsyXSxwWzNdLHBbNF0scFs1XSxwWzZdLHBbN10sVSx1KSx1Kz00fWVsc2V7SSgpO2NvbnN0IGw9VigpLGM9VigpO3ooZSx0LHIsbixpLGEscyxvLC41LGwsYyk7Y29uc3QgZj1WKCksZD1WKCksaD1WKCkscD1WKCk7eihsWzBdLGxbMV0sbFsyXSxsWzNdLGxbNF0sbFs1XSxsWzZdLGxbN10sLjUsZixkKSx6KGNbMF0sY1sxXSxjWzJdLGNbM10sY1s0XSxjWzVdLGNbNl0sY1s3XSwuNSxoLHApO2NvbnN0IG09VigpLGc9VigpLGI9VigpLHg9VigpLHY9VigpLHk9VigpLF89VigpLHc9VigpO3ooZlswXSxmWzFdLGZbMl0sZlszXSxmWzRdLGZbNV0sZls2XSxmWzddLC41LG0sZykseihkWzBdLGRbMV0sZFsyXSxkWzNdLGRbNF0sZFs1XSxkWzZdLGRbN10sLjUsYix4KSx6KGhbMF0saFsxXSxoWzJdLGhbM10saFs0XSxoWzVdLGhbNl0saFs3XSwuNSx2LHkpLHoocFswXSxwWzFdLHBbMl0scFszXSxwWzRdLHBbNV0scFs2XSxwWzddLC41LF8sdyksaihtWzBdLG1bMV0sbVsyXSxtWzNdLG1bNF0sbVs1XSxtWzZdLG1bN10sVSx1KSx1Kz00LGooZ1swXSxnWzFdLGdbMl0sZ1szXSxnWzRdLGdbNV0sZ1s2XSxnWzddLFUsdSksdSs9NCxqKGJbMF0sYlsxXSxiWzJdLGJbM10sYls0XSxiWzVdLGJbNl0sYls3XSxVLHUpLHUrPTQsaih4WzBdLHhbMV0seFsyXSx4WzNdLHhbNF0seFs1XSx4WzZdLHhbN10sVSx1KSx1Kz00LGoodlswXSx2WzFdLHZbMl0sdlszXSx2WzRdLHZbNV0sdls2XSx2WzddLFUsdSksdSs9NCxqKHlbMF0seVsxXSx5WzJdLHlbM10seVs0XSx5WzVdLHlbNl0seVs3XSxVLHUpLHUrPTQsaihfWzBdLF9bMV0sX1syXSxfWzNdLF9bNF0sX1s1XSxfWzZdLF9bN10sVSx1KSx1Kz00LGood1swXSx3WzFdLHdbMl0sd1szXSx3WzRdLHdbNV0sd1s2XSx3WzddLFUsdSksdSs9NH1yZXR1cm4gJD11LzQse2J1ZmZlcjpVLGNvdW50OiR9fSxxPShlLHQscixuLGksYSk9PntpZihULmxlbmd0aHx8QygwLDApLFIoaSxhKSlyZXR1cm47Y29uc3Qgcz1ULmxlbmd0aCxvPStUW3MtM10sbD0rVFtzLTJdLGM9VyhvLGwsZSx0LHIsbixpLGEpLHU9Yy5idWZmZXIsZj1jLmNvdW50O2ZvcihsZXQgZT0wO2U8NCpmOylFKHVbZSsrXSx1W2UrK10sdVtlKytdLHVbZSsrXSl9LFg9W10sWT1lPT57bGV0IHQ9LTEscj1YLmxlbmd0aDtmb3IoO01hdGguYWJzKHItdCk+MTspe2NvbnN0IG49TWF0aC5mbG9vcigocit0KS8yKTtlPD1YW25dLmFyZWE/cj1uOnQ9bn1yZXR1cm4gcn0sSz1lPT57ci5kZWxldGVUZXh0dXJlKGUucmVzb3VyY2UpfSxIPVtdLFE9W107bGV0IFo7bGV0IEo9bnVsbDtsZXQgZWU9bnVsbDtsZXQgdGU9bnVsbDtjb25zdCByZT1lPT57dGU9ZX07bGV0IG5lPSExO2NvbnN0IGllPWU9PntuZT1lfTtsZXQgYWU9bnVsbCxzZT1udWxsLG9lPW51bGwsbGU9bnVsbDtjb25zdCBjZT0oZSx0PSEwKT0+e3ZhciBuO2UubXNhYT8oKGU9PntpZihYLmluZGV4T2YoZSk+LTEpcmV0dXJuO2NvbnN0IHQ9WShlLmFyZWEpO2UuZGlydHk9ITAsWC5zcGxpY2UodCwwLGUpfSkoZS5jb2xvciksZS5jb2xvcj1udWxsLGUuc3RlbmNpbD1udWxsKToodCYmSyhlLnRleHR1cmUpLGUudGV4dHVyZT1udWxsLG49ZS5zdGVuY2lsLEguaW5kZXhPZihuKT4tMXx8KEgubGVuZ3RoPjEwP3IuZGVsZXRlUmVuZGVyYnVmZmVyKG4ucmVzb3VyY2UpOihuLmRpcnR5PSEwLEgucHVzaChuKSkpLGUuc3RlbmNpbD1udWxsKSxRLnB1c2goZSl9O2xldCB1ZT0wO2NvbnN0IGZlPWU9PntpZighWC5sZW5ndGgpcmV0dXJuKCgpPT57Y29uc3QgZT17aWQ6MCxyZXNvdXJjZTpyLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLHdpZHRoOjAsaGVpZ2h0OjAsYXJlYTowLGRpcnR5OiExfTtyZXR1cm57cmVzb3VyY2U6ci5jcmVhdGVSZW5kZXJidWZmZXIoKSxzdGVuY2lsOmUsd2lkdGg6MCxoZWlnaHQ6MCxhcmVhOjAsZGlydHk6ITF9fSkoKTtjb25zdCB0PVkoZSk7aWYodDxYLmxlbmd0aCl7Y29uc3QgZT1YW3RdO3JldHVybiBYLnNwbGljZSh0LDEpLGV9Y29uc3Qgbj1YLnNoaWZ0KCk7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCJ0aGUgY29sb3IgYnVmZmVyIGlzIHZvaWQuIik7cmV0dXJuIG59O2xldCBkZT0wO2NvbnN0IGhlPShlLHQpPT57aWYoIUgubGVuZ3RoKXJldHVybntpZDpkZSsrLHJlc291cmNlOnIuY3JlYXRlUmVuZGVyYnVmZmVyKCksd2lkdGg6MCxoZWlnaHQ6MCxhcmVhOjAsZGlydHk6ITF9O2xldCBuPS0xLGk9MS8wO2ZvcihsZXQgcj0wO3I8SC5sZW5ndGg7KytyKXtjb25zdCBhPUhbcl07YS53aWR0aD49ZSYmYS5oZWlnaHQ+PXQmJmEuYXJlYTxpJiYoaT1hLmFyZWEsbj1yKX1pZigtMSE9PW4pe2NvbnN0IGU9SFtuXTtyZXR1cm4gSFtuXT1IW0gubGVuZ3RoLTFdLEgucG9wKCksZX1yZXR1cm4gSC5wb3AoKX07bGV0IHBlPTA7Y29uc3QgbWU9KGUsdCk9Pih7aWQ6cGUrKyxyZXNvdXJjZTpyLmNyZWF0ZVRleHR1cmUoKSx3aWR0aDplLGhlaWdodDp0LGFyZWE6ZSp0LHNtb290aDohMX0pO2xldCBnZT0tMTtjb25zdCBiZT1lPT57Z2U9ZX0seGU9W251bGwsbnVsbCxudWxsXSx2ZT0oZSx0LG49ITEpPT57Y29uc3QgaT1tZShlLHQpO3JldHVybigoZSx0PSExKT0+e2dlIT09ci5URVhUVVJFMCYmKGJlKHIuVEVYVFVSRTApLHIuYWN0aXZlVGV4dHVyZShyLlRFWFRVUkUwKSkseGVbMF09ZSxyLmJpbmRUZXh0dXJlKHIuVEVYVFVSRV8yRCxlLnJlc291cmNlKSxyLnRleFBhcmFtZXRlcmkoci5URVhUVVJFXzJELHIuVEVYVFVSRV9XUkFQX1Msci5DTEFNUF9UT19FREdFKSxyLnRleFBhcmFtZXRlcmkoci5URVhUVVJFXzJELHIuVEVYVFVSRV9XUkFQX1Qsci5DTEFNUF9UT19FREdFKSxyLnRleFBhcmFtZXRlcmkoci5URVhUVVJFXzJELHIuVEVYVFVSRV9NSU5fRklMVEVSLHQ/ci5MSU5FQVI6ci5ORUFSRVNUKSxyLnRleFBhcmFtZXRlcmkoci5URVhUVVJFXzJELHIuVEVYVFVSRV9NQUdfRklMVEVSLHQ/ci5MSU5FQVI6ci5ORUFSRVNUKSxyLnRleFN0b3JhZ2UyRChyLlRFWFRVUkVfMkQsMSxyLlJHQkE4LGUud2lkdGgsZS5oZWlnaHQpfSkoaSxuKSxpfSx5ZT0oZSxuLGk9ITEpPT57Y29uc3QgYT1RLmxlbmd0aD9RLnBvcCgpOntpZDp1ZSsrLHdpZHRoOjAsaGVpZ2h0OjAsY2xpcExldmVsOjAsbXNhYTohMSxtYXNrOiExLGNvbG9yOm51bGwsdGV4dHVyZTpudWxsLHN0ZW5jaWw6bnVsbH07cmV0dXJuIGEud2lkdGg9ZSxhLmhlaWdodD1uLGk/KGEubXNhYT0hMCxhLnRleHR1cmU9bnVsbCxhLmNvbG9yPSgoZSxuKT0+e2U9TWF0aC5tYXgoMjU2LHAoZSkpLG49TWF0aC5tYXgoMjU2LHAobikpO2NvbnN0IGk9ZmUoZSpuKTtyZXR1cm4oaS53aWR0aDxlfHxpLmhlaWdodDxuKSYmKGU9TWF0aC5tYXgoZSxpLndpZHRoKSxuPU1hdGgubWF4KG4saS5oZWlnaHQpLGkud2lkdGg9ZSxpLmhlaWdodD1uLGkuYXJlYT1lKm4sci5iaW5kUmVuZGVyYnVmZmVyKHIuUkVOREVSQlVGRkVSLGkucmVzb3VyY2UpLHIucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKHIuUkVOREVSQlVGRkVSLHQsci5SR0JBOCxlLG4pLHIuYmluZFJlbmRlcmJ1ZmZlcihyLlJFTkRFUkJVRkZFUixpLnN0ZW5jaWwucmVzb3VyY2UpLHIucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKHIuUkVOREVSQlVGRkVSLHQsci5TVEVOQ0lMX0lOREVYOCxlLG4pKSxpLmRpcnR5PSEwLGl9KShlLG4pLGEuc3RlbmNpbD1hLmNvbG9yLnN0ZW5jaWwpOihhLm1zYWE9ITEsYS50ZXh0dXJlPXZlKGUsbiksYS5jb2xvcj1udWxsLGEuc3RlbmNpbD0oKGUsdCk9Pntjb25zdCBuPWhlKGUsdCk7cmV0dXJuIG4ud2lkdGg9PT1lJiZuLmhlaWdodD09PXR8fChuLndpZHRoPWUsbi5oZWlnaHQ9dCxuLmFyZWE9ZSp0LG4uZGlydHk9ITEsci5iaW5kUmVuZGVyYnVmZmVyKHIuUkVOREVSQlVGRkVSLG4ucmVzb3VyY2UpLHIucmVuZGVyYnVmZmVyU3RvcmFnZShyLlJFTkRFUkJVRkZFUixyLlNURU5DSUxfSU5ERVg4LGUsdCkpLG59KShlLG4pKSxhLm1hc2s9ITEsYS5jbGlwTGV2ZWw9MCxhfSxfZT1OdW1iZXIuTUFYX1ZBTFVFLHdlPS1OdW1iZXIuTUFYX1ZBTFVFO2xldCBNZT0wO2NvbnN0IFBlPWU9PntNZT1lfSxTZT1bXSxGZT0oKT0+e3ZhciB0O3JldHVybiBNZSBpbiBTZXx8KHQ9eWUoZSxlLCEwKSxTZVtNZV09dCksU2VbTWVdfSxUZT1bXTtsZXQgQmU9bnVsbDtjb25zdCBPZT0oKT0+KEJlfHwoQmU9KCgpPT57Y29uc3QgdD1tZShlLGUpO3JldHVybiByLmFjdGl2ZVRleHR1cmUoci5URVhUVVJFMyksci5iaW5kVGV4dHVyZShyLlRFWFRVUkVfMkQsdC5yZXNvdXJjZSksci50ZXhQYXJhbWV0ZXJpKHIuVEVYVFVSRV8yRCxyLlRFWFRVUkVfV1JBUF9TLHIuQ0xBTVBfVE9fRURHRSksci50ZXhQYXJhbWV0ZXJpKHIuVEVYVFVSRV8yRCxyLlRFWFRVUkVfV1JBUF9ULHIuQ0xBTVBfVE9fRURHRSksci50ZXhQYXJhbWV0ZXJpKHIuVEVYVFVSRV8yRCxyLlRFWFRVUkVfTUlOX0ZJTFRFUixyLkxJTkVBUiksci50ZXhQYXJhbWV0ZXJpKHIuVEVYVFVSRV8yRCxyLlRFWFRVUkVfTUFHX0ZJTFRFUixyLk5FQVJFU1QpLHIudGV4U3RvcmFnZTJEKHIuVEVYVFVSRV8yRCwxLHIuUkdCQTgsdC53aWR0aCx0LmhlaWdodCksci5hY3RpdmVUZXh0dXJlKC0xIT09Z2U/Z2U6ci5URVhUVVJFMCksdH0pKCkpLEJlKSxBZT1bXSxSZT1lPT4oZSBpbiBBZXx8KEFlW2VdPW5ldyBGbG9hdDMyQXJyYXkoW19lLF9lLHdlLHdlXSkpLEFlW2VdKTtsZXQgQ2U9MDtjb25zdCBFZT1lPT57Q2U9ZX0sVWU9KCk9PntUZS5sZW5ndGg9MCxQZSgwKTtjb25zdCBlPVNlO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKWNlKGVbdF0pO2UubGVuZ3RoPTB9LCRlPShlLHQsbixpPSEwKT0+e2lmKGUuY2xlYXJBcnJheXNJbnN0YW5jZWQoKSxlLiRzdGFja0F0dGFjaG1lbnRPYmplY3QubGVuZ3RoKWZvcihsZXQgdD0wO3Q8ZS4kc3RhY2tBdHRhY2htZW50T2JqZWN0Lmxlbmd0aDsrK3Qpe2NvbnN0IHI9ZS4kc3RhY2tBdHRhY2htZW50T2JqZWN0W3RdO3ImJmNlKHIpfWVsc2UgZS4kbWFpbkF0dGFjaG1lbnRPYmplY3QmJmNlKGUuJG1haW5BdHRhY2htZW50T2JqZWN0KTtpJiZVZSgpLHJlKG51bGwpLG5lJiYoaWUoITEpLHIuYmluZEZyYW1lYnVmZmVyKHIuRlJBTUVCVUZGRVIsbnVsbCkpLGUuJG1haW5BdHRhY2htZW50T2JqZWN0PXllKHQsbiwhMCksZS5iaW5kKGUuJG1haW5BdHRhY2htZW50T2JqZWN0KX0sR2U9KGUsdCxuPW51bGwsaT0hMSk9PnstMSE9PWdlJiZ0PT09Z2V8fChiZSh0KSxyLmFjdGl2ZVRleHR1cmUodCkpO2NvbnN0IGE9eGVbZV07bnVsbCE9PWEmJm51bGwhPT1uJiZhLmlkPT09bi5pZHx8bj09PWF8fCh4ZVtlXT1uLHIuYmluZFRleHR1cmUoci5URVhUVVJFXzJELG4/bi5yZXNvdXJjZTpudWxsKSxuJiZuLnNtb290aCE9PWkmJihuLnNtb290aD1pLHIudGV4UGFyYW1ldGVyaShyLlRFWFRVUkVfMkQsci5URVhUVVJFX01JTl9GSUxURVIsaT9yLkxJTkVBUjpyLk5FQVJFU1QpLHIudGV4UGFyYW1ldGVyaShyLlRFWFRVUkVfMkQsci5URVhUVVJFX01BR19GSUxURVIsaT9yLkxJTkVBUjpyLk5FQVJFU1QpKSl9LGtlPShlLHQ9ITEpPT57R2UoMixyLlRFWFRVUkUyLG51bGwpLEdlKDEsci5URVhUVVJFMSxudWxsKSxHZSgwLHIuVEVYVFVSRTAsZSx0KX0sTGU9KCk9Pntjb25zdCBlPW4uY3VycmVudEF0dGFjaG1lbnRPYmplY3Q7aWYoIWUpcmV0dXJuO2NvbnN0IHQ9ZS5jbGlwTGV2ZWw7bGV0IGk9MDtmb3IobGV0IGU9MDtlPHQ7KytlKWl8PSgxPDx0LWUpLTE7ci5zdGVuY2lsTWFzaygyNTUpLHIuc3RlbmNpbEZ1bmMoci5FUVVBTCwyNTUmaSxpKSxyLnN0ZW5jaWxPcChyLktFRVAsci5LRUVQLHIuS0VFUCksci5jb2xvck1hc2soITAsITAsITAsITApLHIuZGlzYWJsZShyLlNBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSkscygpfTtsZXQgSWU9ITE7Y29uc3QgVmU9ZT0+e0llPWV9LHplPSgpPT5JZSxqZT1uZXcgTWFwLERlPW5ldyBNYXAsTmU9KGUsdCk9Pntjb25zdCBuPXRlO2lmKG4mJnQuaWQ9PT1uLmlkKXJldHVybjt2YXIgaSxhOyhlPT57cmUoZSksbmV8fChpZSghMCksci5iaW5kRnJhbWVidWZmZXIoci5GUkFNRUJVRkZFUixaKSksZS5tc2FhPyhyLmJpbmRSZW5kZXJidWZmZXIoci5SRU5ERVJCVUZGRVIsZS5jb2xvci5yZXNvdXJjZSksci5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcihyLkZSQU1FQlVGRkVSLHIuQ09MT1JfQVRUQUNITUVOVDAsci5SRU5ERVJCVUZGRVIsZS5jb2xvci5yZXNvdXJjZSkpOihrZShlLnRleHR1cmUpLHIuZnJhbWVidWZmZXJUZXh0dXJlMkQoci5GUkFNRUJVRkZFUixyLkNPTE9SX0FUVEFDSE1FTlQwLHIuVEVYVFVSRV8yRCxlLnRleHR1cmUucmVzb3VyY2UsMCksR2UoMCxyLlRFWFRVUkUwLG51bGwpKSxyLmJpbmRSZW5kZXJidWZmZXIoci5SRU5ERVJCVUZGRVIsZS5zdGVuY2lsLnJlc291cmNlKSxyLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKHIuRlJBTUVCVUZGRVIsci5TVEVOQ0lMX0FUVEFDSE1FTlQsci5SRU5ERVJCVUZGRVIsZS5zdGVuY2lsLnJlc291cmNlKX0pKHQpLG4mJm4ud2lkdGg9PT10LndpZHRoJiZuLmhlaWdodD09PXQuaGVpZ2h0fHwoaT10LndpZHRoLGE9dC5oZWlnaHQsUD1pLFM9YSxyLnZpZXdwb3J0KDAsMCx0LndpZHRoLHQuaGVpZ2h0KSk7Y29uc3Qgbz10Lm1zYWE/dC5jb2xvcjp0LnN0ZW5jaWw7dmFyIHU7by5kaXJ0eSYmKG8uZGlydHk9ITEsZS5jbGVhclJlY3QoMCwwLHQud2lkdGgsdC5oZWlnaHQpKSwhKHU9dC5tYXNrKSYmemUoKT8oVmUoITEpLGMoKSxzKCkpOnUmJiF6ZSgpJiYoVmUoITApLGwoKSxMZSgpKX0sV2U9ZT0+e2lmKCFlLiRzdGFjay5sZW5ndGgpcmV0dXJuO2NvbnN0IHQ9ZS4kc3RhY2sucG9wKCk7dmFyIHI7ZS4kbWF0cml4WzBdPXRbMF0sZS4kbWF0cml4WzFdPXRbMV0sZS4kbWF0cml4WzNdPXRbM10sZS4kbWF0cml4WzRdPXRbNF0sZS4kbWF0cml4WzZdPXRbNl0sZS4kbWF0cml4WzddPXRbN10scj10LHgucHVzaChyKX0scWU9KGUsdCxyLG4saSxhLHMsbyxsLGMsdSxmLGQpPT57Y29uc3QgaD1lLmxlbmd0aC01O2ZvcihsZXQgcD0zO3A8aDtwKz0zKXtsZXQgaD0xNypyO2VbcCsyXT8odFtoKytdPWVbcC0zXSx0W2grK109ZVtwLTJdLHRbaCsrXT0wLHRbaCsrXT0wLHRbaCsrXT1jLHRbaCsrXT11LHRbaCsrXT1mLHRbaCsrXT1kLHRbaCsrXT1uLHRbaCsrXT1pLHRbaCsrXT0wLHRbaCsrXT1hLHRbaCsrXT1zLHRbaCsrXT0wLHRbaCsrXT1vLHRbaCsrXT1sLHRbaCsrXT0wLHRbaCsrXT1lW3BdLHRbaCsrXT1lW3ArMV0sdFtoKytdPS41LHRbaCsrXT0wLHRbaCsrXT1jLHRbaCsrXT11LHRbaCsrXT1mLHRbaCsrXT1kLHRbaCsrXT1uLHRbaCsrXT1pLHRbaCsrXT0wLHRbaCsrXT1hLHRbaCsrXT1zLHRbaCsrXT0wLHRbaCsrXT1vLHRbaCsrXT1sLHRbaCsrXT0wLHRbaCsrXT1lW3ArM10sdFtoKytdPWVbcCs0XSx0W2grK109MSx0W2grK109MSx0W2grK109Yyx0W2grK109dSx0W2grK109Zix0W2grK109ZCx0W2grK109bix0W2grK109aSx0W2grK109MCx0W2grK109YSx0W2grK109cyx0W2grK109MCx0W2grK109byx0W2grK109bCx0W2grK109MCk6ZVtwKzVdPyh0W2grK109ZVswXSx0W2grK109ZVsxXSx0W2grK109LjUsdFtoKytdPS41LHRbaCsrXT1jLHRbaCsrXT11LHRbaCsrXT1mLHRbaCsrXT1kLHRbaCsrXT1uLHRbaCsrXT1pLHRbaCsrXT0wLHRbaCsrXT1hLHRbaCsrXT1zLHRbaCsrXT0wLHRbaCsrXT1vLHRbaCsrXT1sLHRbaCsrXT0wLHRbaCsrXT1lW3BdLHRbaCsrXT1lW3ArMV0sdFtoKytdPS41LHRbaCsrXT0uNSx0W2grK109Yyx0W2grK109dSx0W2grK109Zix0W2grK109ZCx0W2grK109bix0W2grK109aSx0W2grK109MCx0W2grK109YSx0W2grK109cyx0W2grK109MCx0W2grK109byx0W2grK109bCx0W2grK109MCx0W2grK109ZVtwKzZdLHRbaCsrXT1lW3ArN10sdFtoKytdPS41LHRbaCsrXT0uNSx0W2grK109Yyx0W2grK109dSx0W2grK109Zix0W2grK109ZCx0W2grK109bix0W2grK109aSx0W2grK109MCx0W2grK109YSx0W2grK109cyx0W2grK109MCx0W2grK109byx0W2grK109bCx0W2grK109MCk6KHRbaCsrXT1lWzBdLHRbaCsrXT1lWzFdLHRbaCsrXT0uNSx0W2grK109LjUsdFtoKytdPWMsdFtoKytdPXUsdFtoKytdPWYsdFtoKytdPWQsdFtoKytdPW4sdFtoKytdPWksdFtoKytdPTAsdFtoKytdPWEsdFtoKytdPXMsdFtoKytdPTAsdFtoKytdPW8sdFtoKytdPWwsdFtoKytdPTAsdFtoKytdPWVbcF0sdFtoKytdPWVbcCsxXSx0W2grK109LjUsdFtoKytdPS41LHRbaCsrXT1jLHRbaCsrXT11LHRbaCsrXT1mLHRbaCsrXT1kLHRbaCsrXT1uLHRbaCsrXT1pLHRbaCsrXT0wLHRbaCsrXT1hLHRbaCsrXT1zLHRbaCsrXT0wLHRbaCsrXT1vLHRbaCsrXT1sLHRbaCsrXT0wLHRbaCsrXT1lW3ArM10sdFtoKytdPWVbcCs0XSx0W2grK109LjUsdFtoKytdPS41LHRbaCsrXT1jLHRbaCsrXT11LHRbaCsrXT1mLHRbaCsrXT1kLHRbaCsrXT1uLHRbaCsrXT1pLHRbaCsrXT0wLHRbaCsrXT1hLHRbaCsrXT1zLHRbaCsrXT0wLHRbaCsrXT1vLHRbaCsrXT1sLHRbaCsrXT0wKSxyKz0zfXJldHVybiByfSxYZT1lPT4oZS0tLGV8PWU+PjEsZXw9ZT4+MixlfD1lPj40LGV8PWU+PjgsZXw9ZT4+MTYsKytlKTtsZXQgWWU9bmV3IEZsb2F0MzJBcnJheSgxMjgpLEtlPTA7Y29uc3QgSGU9ZT0+e2NvbnN0IHQ9ZS5sZW5ndGgrS2U7aWYodD5ZZS5sZW5ndGgpe2NvbnN0IHI9bmV3IEZsb2F0MzJBcnJheShYZSh0KSk7ci5zZXQoWWUpLHIuc2V0KGUsS2UpLFllPXJ9ZWxzZSBZZS5zZXQoZSxLZSk7S2UrPWUubGVuZ3RofSxRZT1bXSxaZT1bXSxKZT0oKT0+e1plLmxlbmd0aD0wLEtlPTAsUWUubGVuZ3RoPTB9O2xldCBldD1uZXcgRmxvYXQzMkFycmF5KDMyKTtjb25zdCB0dD0oZSx0PSJmaWxsIik9Pntjb25zdCByPSJmaWxsIj09PXQ/bi4kZmlsbFN0eWxlOm4uJHN0cm9rZVN0eWxlLGk9clswXSxhPXJbMV0scz1yWzJdLG89clszXSxsPW4uJG1hdHJpeCxjPVAsdT1TLGY9bFswXS9jLGQ9bFszXS9jLGg9bFs2XS9jLHA9bFsxXS91LG09bFs0XS91LGc9bFs3XS91O2xldCBiPTA7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDsrK3QpYis9NTEqKGVbdF0ubGVuZ3RoLzMtMik7Y29uc3QgeD0odj1iLGV0Lmxlbmd0aDx2JiYoZXQ9bmV3IEZsb2F0MzJBcnJheShYZSh2KSkpLGV0KTt2YXIgdjtsZXQgeT0wO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7Kyt0KXk9cWUoZVt0XSx4LHksZixwLGQsbSxoLGcsaSxhLHMsbyk7cmV0dXJue2J1ZmZlcjp4LnN1YmFycmF5KDAsYiksaW5kZXhDb3VudDp5fX0scnQ9W10sbnQ9KGUsdCxyKT0+e2NvbnN0IG49e3g6dC54LWUueCx5OnQueS1lLnl9LGk9KChlLHQscik9Pntjb25zdCBuPU1hdGguc3FydChlKmUrdCp0KTtyZXR1cm57eDotdC9uKnIseTplL24qcn19KShuLngsbi55LHIpLGE9e3g6ZS54K2kueCx5OmUueStpLnl9LHM9e3g6dC54K2kueCx5OnQueStpLnl9LG89e3g6ZS54LWkueCx5OmUueS1pLnl9LGw9e3g6dC54LWkueCx5OnQueS1pLnl9O3JldHVyblthLngsYS55LCExLHMueCxzLnksITEsbC54LGwueSwhMSxvLngsby55LCExLGEueCxhLnksITFdfSxpdD0oZSx0LHIpPT4oe3g6ZS54Kyh0LngtZS54KSpyLHk6ZS55Kyh0LnktZS55KSpyfSksYXQ9KGUsdCxyLG49LjUpPT57Y29uc3QgaT1pdChlLHQsbiksYT1pdCh0LHIsbikscz1pdChpLGEsbik7cmV0dXJuW1tlLGksc10sW3MsYSxyXV19LHN0PShlLHQscixuKT0+KHt4OigxLWUpKioyKnQueCsyKigxLWUpKmUqci54K2UqKjIqbi54LHk6KDEtZSkqKjIqdC55KzIqKDEtZSkqZSpyLnkrZSoqMipuLnl9KSxvdD0oZSx0LHIsbik9Pih7eDoyKigxLWUpKihyLngtdC54KSsyKmUqKG4ueC1yLngpLHk6MiooMS1lKSooci55LXQueSkrMiplKihuLnktci55KX0pLGx0PWU9Pntjb25zdCB0PU1hdGguc3FydChlLngqZS54K2UueSplLnkpO3JldHVybiAwPT09dD97eDowLHk6MH06e3g6ZS54L3QseTplLnkvdH19LGN0PShlLHQscixuKT0+e2NvbnN0IGk9WzAsLjUsMV0sYT1bXTtmb3IobGV0IHM9MDtzPGkubGVuZ3RoOysrcyl7Y29uc3Qgbz1pW3NdLGw9c3QobyxlLHQsciksYz1vdChvLGUsdCxyKSx1PWx0KHt4Oi1jLnkseTpjLnh9KTthLnB1c2goe3g6bC54K3UueCpuLHk6bC55K3UueSpufSl9cmV0dXJuIGF9LHV0PShlLHQscixuKT0+e2NvbnN0IGk9KChlLHQscixuPTQpPT57bGV0IGk9W1tlLHQscl1dO2ZvcihsZXQgZT0wO2U8bjsrK2Upe2NvbnN0IGU9W107Zm9yKGxldCB0PTA7dDxpLmxlbmd0aDsrK3Qpe2NvbnN0IHI9aVt0XTtpZighciljb250aW51ZTtjb25zdCBuPWF0KHJbMF0sclsxXSxyWzJdLC41KTtlLnB1c2goblswXSxuWzFdKX1pPWV9cmV0dXJuIGl9KShlLHQsciw1KSxhPVtdLHM9W107Zm9yKGxldCBlPTA7ZTxpLmxlbmd0aDsrK2Upe2NvbnN0W3QscixvXT1pW2VdO2EucHVzaChjdCh0LHIsbywrbikpLHMucHVzaChjdCh0LHIsbywtbikpfWNvbnN0IG89YVswXVswXSxsPVtvLngsby55LCExXTtmb3IobGV0IGU9MDtlPGEubGVuZ3RoOysrZSl7Y29uc3QgdD1hW2VdO2wucHVzaCh0WzFdLngsdFsxXS55LCEwLHRbMl0ueCx0WzJdLnksITEpfWNvbnN0IGM9Wy4uLnNdLnJldmVyc2UoKTtmb3IobGV0IGU9MDtlPGMubGVuZ3RoOysrZSl7Y29uc3RbdCxyLG5dPWNbZV07Y1tlXT1bbixyLHRdfWNvbnN0IHU9Y1swXVswXTtsLnB1c2godS54LHUueSwhMSk7Zm9yKGxldCBlPTA7ZTxjLmxlbmd0aDsrK2Upe2NvbnN0IHQ9Y1tlXTtsLnB1c2godFsxXS54LHRbMV0ueSwhMCx0WzJdLngsdFsyXS55LCExKX1yZXR1cm4gbH0sZnQ9KGUsdCxyLG4pPT57Y29uc3QgaT1bXTtmb3IobGV0IGE9MDthPG4ubGVuZ3RoO2ErPTMpe2lmKG5bYSsyXSljb250aW51ZTtjb25zdCBzPW5bYV0sbz1uW2ErMV0sbD1NYXRoLnNxcnQoTWF0aC5wb3cocy1lLDIpK01hdGgucG93KG8tdCwyKSk7TWF0aC5hYnMobC1yKT4xZS00fHxpLnB1c2gocyxvKX1yZXR1cm4gaX0sZHQ9bmV3IE9mZnNjcmVlbkNhbnZhcygxLDEpLmdldENvbnRleHQoIjJkIiksaHQ9KGUsdCk9PntkdC5iZWdpblBhdGgoKSxkdC5tb3ZlVG8odFswXSx0WzFdKTtmb3IobGV0IGU9MztlPHQubGVuZ3RoO2UrPTMpdFtlKzJdPyhkdC5xdWFkcmF0aWNDdXJ2ZVRvKHRbZV0sdFtlKzFdLHRbZSszXSx0W2UrNF0pLGUrPTMpOmR0LmxpbmVUbyh0W2VdLHRbZSsxXSk7ZHQuY2xvc2VQYXRoKCk7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kz0yKXtjb25zdCByPWVbdF0sbj1lW3QrMV07aWYoIWR0LmlzUG9pbnRJblBhdGgocixuKSlyZXR1cm5bcixuXX1yZXR1cm4gbnVsbH0scHQ9KGUsdCxyLG4saT0hMSk9Pntjb25zdCBhPWk/MDpuLmxlbmd0aC0xLHM9aT9uLmxlbmd0aC0xOm4ubGVuZ3RoLTIsbz1uW2FdLmxlbmd0aD4xNSxsPW5bc10ubGVuZ3RoPjE1O2lmKG8mJmwpcmV0dXJuO2NvbnN0IGM9ZnQoZSx0LHIsblthXSksdT1mdChlLHQscixuW3NdKSxmPWh0KGMsbltzXSk7aWYoIWYpcmV0dXJuO2NvbnN0IGQ9aHQodSxuW2FdKTtpZighZClyZXR1cm47Y29uc3QgaD1NYXRoLmF0YW4yKGZbMV0tdCxmWzBdLWUpO2xldCBwPU1hdGguYXRhbjIoZFsxXS10LGRbMF0tZSktaDtwPk1hdGguUEk/cC09MipNYXRoLlBJOnA8LU1hdGguUEkmJihwKz0yKk1hdGguUEkpO2NvbnN0IG09TWF0aC5hYnMocCk7aWYobTwuMXx8bT5NYXRoLlBJLS4xKXJldHVybjtjb25zdCBnPXAvOCxiPVtlLHQsITFdO2ZvcihsZXQgbj0wO248PTg7bisrKXtjb25zdCBpPWgrbipnLGE9ZStyKk1hdGguY29zKGkpLHM9dCtyKk1hdGguc2luKGkpO2IucHVzaChhLHMsITEpfW4uc3BsaWNlKC0xLDAsYil9LG10PShlLHQscixuLGk9ITEpPT57Y29uc3QgYT1pPzA6bi5sZW5ndGgtMSxzPWk/bi5sZW5ndGgtMTpuLmxlbmd0aC0yLG89blthXS5sZW5ndGg+MTUsbD1uW3NdLmxlbmd0aD4xNTtpZihvJiZsKXJldHVybjtjb25zdCBjPWZ0KGUsdCxyLG5bYV0pLHU9ZnQoZSx0LHIsbltzXSk7aWYoY1swXT09PXVbMF0mJmNbMV09PT11WzFdfHxjWzBdPT09dVsyXSYmY1sxXT09PXVbM10pcmV0dXJuO2NvbnN0IGY9aHQoYyxuW3NdKTtpZighZilyZXR1cm47Y29uc3QgZD1odCh1LG5bYV0pO2QmJm4uc3BsaWNlKC0xLDAsW2UsdCwhMSxmWzBdLGZbMV0sITEsZFswXSxkWzFdLCExLGUsdCwhMV0pfSxndD0oZSx0LHIsbixpLGE9ITEpPT57Y29uc3Qgcz1hPzA6aS5sZW5ndGgtMSxvPWE/aS5sZW5ndGgtMTppLmxlbmd0aC0yLGw9aVtzXS5sZW5ndGg+MTUsYz1pW29dLmxlbmd0aD4xNTtpZihsJiZjKXJldHVybjtjb25zdCB1PWZ0KGUueCxlLnksbixpW3NdKSxmPWZ0KGUueCxlLnksbixpW29dKTtpZih1WzBdPT09ZlswXSYmdVsxXT09PWZbMV18fHVbMF09PT1mWzJdJiZ1WzFdPT09ZlszXSlyZXR1cm47Y29uc3QgZD1odCh1LGlbb10pO2lmKCFkKXJldHVybjtjb25zdCBoPWh0KGYsaVtzXSk7aWYoIWgpcmV0dXJuO2NvbnN0IHA9dC54LWUueCxtPXQueS1lLnksZz1NYXRoLmh5cG90KHAsbSksYj17eDpwL2cseTptL2d9LHg9ci54LWUueCx2PXIueS1lLnkseT1NYXRoLmh5cG90KHgsdiksXz17eDp4L3kseTp2L3l9LHc9Yi54LE09Yi55LFA9Xy54LFM9Xy55LEY9dypTLU0qUDtpZigwPT09RilyZXR1cm4gdm9pZCBpLnNwbGljZSgtMSwwLFtlLngsZS55LCExLGRbMF0sZFsxXSwhMSxoWzBdLGhbMV0sITFdKTtjb25zdCBUPSgoaFswXS1kWzBdKSpTLShoWzFdLWRbMV0pKlApL0YsQj1kWzBdK1QqdyxPPWRbMV0rVCpNO2kuc3BsaWNlKC0xLDAsW2UueCxlLnksITEsZFswXSxkWzFdLCExLEIsTywhMSxlLngsZS55LCExLGhbMF0saFsxXSwhMSxCLE8sITFdKX0sYnQ9e3g6MCx5OjB9LHh0PXt4OjAseTowfSx2dD17eDowLHk6MH0seXQ9e3g6MCx5OjB9LF90PShlLHQpPT57Y29uc3Qgcj1idDtyLng9ZVswXSxyLnk9ZVsxXTtjb25zdCBpPXh0O2kueD0wLGkueT0wO2NvbnN0IGE9dnQ7YS54PTAsYS55PTA7Y29uc3Qgcz15dDtzLng9MCxzLnk9MDtjb25zdCBvPVtdO2ZvcihsZXQgbD0zO2w8ZS5sZW5ndGg7bCs9Myl7Y29uc3QgYz1lW2xdLHU9ZVtsKzFdO2lmKGVbbCsyXSlpLng9YyxpLnk9dTtlbHNle2lmKGEueD1jLGEueT11LGVbbC0xXT9vLnB1c2godXQocixpLGEsdCkpOm8ucHVzaChudChyLGEsdCkpLG8ubGVuZ3RoPjEpc3dpdGNoKG4uam9pbnRzKXtjYXNlIDA6bXQoci54LHIueSx0LG8pO2JyZWFrO2Nhc2UgMTpzLng9ZVtsLTZdLHMueT1lW2wtNV0sZ3QocixhLHMsdCxvKTticmVhaztjYXNlIDI6cHQoci54LHIueSx0LG8pfXIueD1hLngsci55PWEueX19Y29uc3QgbD1lWzBdLGM9ZVsxXSx1PWVbZS5sZW5ndGgtM10sZj1lW2UubGVuZ3RoLTJdLGQ9MWUtNDtpZihNYXRoLmFicyhsLXUpPGQmJk1hdGguYWJzKGMtZik8ZCYmby5sZW5ndGg+MSlzd2l0Y2gobi5qb2ludHMpe2Nhc2UgMDptdChsLGMsdCxvLCEwKTticmVhaztjYXNlIDE6ci54PWwsci55PWMsYS54PWVbM10sYS55PWVbNF0scy54PWVbZS5sZW5ndGgtNl0scy55PWVbZS5sZW5ndGgtNV0sZ3QocixhLHMsdCxvLCEwKTticmVhaztjYXNlIDI6cHQobCxjLHQsbywhMCl9ZWxzZSBzd2l0Y2gobi5jYXBzKXtjYXNlIDE6KChlLHQscik9Pntmb3IobGV0IG49MDtuPDI7KytuKXtsZXQgaT0wLGE9MCxzPTAsbz0wOzA9PT1uPyhpPWVbMF0sYT1lWzFdLHM9ZVszXSxvPWVbNF0pOihpPWVbZS5sZW5ndGgtM10sYT1lW2UubGVuZ3RoLTJdLHM9ZVtlLmxlbmd0aC02XSxvPWVbZS5sZW5ndGgtNV0pO2NvbnN0IGw9cy1pLGM9by1hLHU9TWF0aC5hdGFuMihjLGwpLGY9dStNYXRoLlBJLzIsZD11LU1hdGguUEkvMixoPTE2LHA9KGQtZikvaCxtPVtdO2ZvcihsZXQgZT0wO2U8PWg7ZSsrKXtjb25zdCByPWQrcCplLG49aSt0Kk1hdGguY29zKHIpLHM9YSt0Kk1hdGguc2luKHIpO20ucHVzaChuLHMsITEpfTA9PT1uP3IudW5zaGlmdChtKTpyLnB1c2gobSl9fSkoZSx0LG8pO2JyZWFrO2Nhc2UgMjooKGUsdCxyKT0+e2ZvcihsZXQgbj0wO248MjsrK24pe2xldCBpPTAsYT0wLHM9MCxvPTA7MD09PW4/KGk9ZVswXSxhPWVbMV0scz1lWzNdLG89ZVs0XSk6KGk9ZVtlLmxlbmd0aC0zXSxhPWVbZS5sZW5ndGgtMl0scz1lW2UubGVuZ3RoLTZdLG89ZVtlLmxlbmd0aC01XSk7Y29uc3QgbD0tKHMtaSksYz0tKG8tYSksdT1NYXRoLnNxcnQobCpsK2MqYyk7aWYoMD09PXUpY29udGludWU7Y29uc3QgZj1sL3UsZD1jL3UsaD1pK3QqZixwPWErdCpkLG09LWQsZz1baCt0KmYrdCptLHArdCpkK3QqZiwhMSxoK3QqZi10Km0scCt0KmQtdCpmLCExLGgtdCpmLXQqbSxwLXQqZC10KmYsITEsaCt0KmYrdCptLHArdCpkK3QqZiwhMSxoLXQqZi10Km0scC10KmQtdCpmLCExLGgtdCpmK3QqbSxwLXQqZCt0KmYsITFdOzA9PT1uP3IudW5zaGlmdChnKTpyLnB1c2goZyl9fSkoZSx0LG8pfXJldHVybiBvfSx3dD1lPT57Y29uc3QgdD1uLnRoaWNrbmVzcy8yLHI9ZCgpO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7KytuKXtjb25zdCBpPV90KGVbbl0sdCk7Zm9yKGxldCBlPTA7ZTxpLmxlbmd0aDsrK2Upci5wdXNoKGlbZV0pfWNvbnN0IGk9dHQociwic3Ryb2tlIik7cmV0dXJuIHIubGVuZ3RoPTAsaChyKSxpfSxNdD1uZXcgTWFwLFB0PSgpPT57TXQuY2xlYXIoKX0sU3Q9KCk9Pih7aWQ6ImZ1bmN0aW9uIj09dHlwZW9mIGNyeXB0bz8ucmFuZG9tVVVJRD9jcnlwdG8ucmFuZG9tVVVJRCgpOiJ4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgiLnJlcGxhY2UoL1t4eV0vZyxlPT57Y29uc3QgdD0xNipNYXRoLnJhbmRvbSgpfDA7cmV0dXJuKCJ4Ij09PWU/dDozJnR8OCkudG9TdHJpbmcoMTYpfSkscmVzb3VyY2U6ci5jcmVhdGVWZXJ0ZXhBcnJheSgpLHZlcnRleEJ1ZmZlcjpyLmNyZWF0ZUJ1ZmZlcigpLHZlcnRleExlbmd0aDowfSk7bGV0IEZ0O2NvbnN0IFR0PWU9PntGdCYmRnQuaWQ9PT1lLmlkfHwoRnQ9ZSxyLmJpbmRWZXJ0ZXhBcnJheShlLnJlc291cmNlKSl9LEJ0PVtdLE90PW5ldyBGbG9hdDMyQXJyYXkoWzAsMCwwLDEsMSwwLDEsMV0pO2xldCBBdDtsZXQgUnQ7bGV0IEN0O2NvbnN0IEV0PSgpPT4oQ3R8fChDdD0oKCk9Pntjb25zdCBlPVN0KCk7VHQoZSksci5iaW5kQnVmZmVyKHIuQVJSQVlfQlVGRkVSLGUudmVydGV4QnVmZmVyKTtjb25zdCB0PW5ldyBGbG9hdDMyQXJyYXkoWzAsMCwxLDAsMSwxLDAsMCwxLDEsMCwxXSk7cmV0dXJuIHIuYnVmZmVyRGF0YShyLkFSUkFZX0JVRkZFUix0LHIuU1RBVElDX0RSQVcpLHIuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoMCksci52ZXJ0ZXhBdHRyaWJQb2ludGVyKDAsMixyLkZMT0FULCExLDAsMCksZX0pKCkpLEN0KSxVdD0oKT0+e2NvbnN0IGU9KCgpPT57aWYoQnQubGVuZ3RoKXJldHVybiBCdC5wb3AoKTtjb25zdCBlPVN0KCk7cmV0dXJuIFR0KGUpLHIuYmluZEJ1ZmZlcihyLkFSUkFZX0JVRkZFUixlLnZlcnRleEJ1ZmZlciksci5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSgwKSxyLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDEpLHIuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoMiksci5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSgzKSxyLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDQpLHIuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoNSksci52ZXJ0ZXhBdHRyaWJQb2ludGVyKDAsMixyLkZMT0FULCExLDY4LDApLHIudmVydGV4QXR0cmliUG9pbnRlcigxLDIsci5GTE9BVCwhMSw2OCw4KSxyLnZlcnRleEF0dHJpYlBvaW50ZXIoMiw0LHIuRkxPQVQsITEsNjgsMTYpLHIudmVydGV4QXR0cmliUG9pbnRlcigzLDMsci5GTE9BVCwhMSw2OCwzMiksci52ZXJ0ZXhBdHRyaWJQb2ludGVyKDQsMyxyLkZMT0FULCExLDY4LDQ0KSxyLnZlcnRleEF0dHJpYlBvaW50ZXIoNSwzLHIuRkxPQVQsITEsNjgsNTYpLGV9KSgpO1R0KGUpO2NvbnN0IHQ9WWUsbj1LZTtyZXR1cm4gci5iaW5kQnVmZmVyKHIuQVJSQVlfQlVGRkVSLGUudmVydGV4QnVmZmVyKSxlLnZlcnRleExlbmd0aDx0Lmxlbmd0aCYmKGUudmVydGV4TGVuZ3RoPXAodC5sZW5ndGgpLHIuYnVmZmVyRGF0YShyLkFSUkFZX0JVRkZFUiw0KmUudmVydGV4TGVuZ3RoLHIuU1RSRUFNX0RSQVcpKSxyLmJ1ZmZlclN1YkRhdGEoci5BUlJBWV9CVUZGRVIsMCx0LnN1YmFycmF5KDAsbikpLGV9LCR0PWU9PntCdC5pbmRleE9mKGUpPi0xfHxCdC5wdXNoKGUpfTtsZXQgR3Q9MDtsZXQga3Q9LTE7Y2xhc3MgTHR7Y29uc3RydWN0b3IoZSx0LG49ITEpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJfJHByb2dyYW1PYmplY3QiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiXyR1bmlmb3JtTWFwIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImhpZ2hwIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIm1lZGl1bXAiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywidGV4dHVyZXMiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSx0aGlzLl8kcHJvZ3JhbU9iamVjdD0oKGUsdCk9Pntjb25zdCBuPXIuY3JlYXRlUHJvZ3JhbSgpLGk9ci5jcmVhdGVTaGFkZXIoci5WRVJURVhfU0hBREVSKTtyLnNoYWRlclNvdXJjZShpLGUpLHIuY29tcGlsZVNoYWRlcihpKTtjb25zdCBhPXIuY3JlYXRlU2hhZGVyKHIuRlJBR01FTlRfU0hBREVSKTtyZXR1cm4gci5zaGFkZXJTb3VyY2UoYSx0KSxyLmNvbXBpbGVTaGFkZXIoYSksci5hdHRhY2hTaGFkZXIobixpKSxyLmF0dGFjaFNoYWRlcihuLGEpLHIubGlua1Byb2dyYW0obiksci5kZXRhY2hTaGFkZXIobixpKSxyLmRldGFjaFNoYWRlcihuLGEpLHIuZGVsZXRlU2hhZGVyKGkpLHIuZGVsZXRlU2hhZGVyKGEpLHtpZDpHdCsrLHJlc291cmNlOm59fSkoZSx0KSx0aGlzLl8kdW5pZm9ybU1hcD1uZXcgTWFwLCgoZSx0LG49ITEpPT57Y29uc3QgaT1yLmdldFByb2dyYW1QYXJhbWV0ZXIoZSxyLkFDVElWRV9VTklGT1JNUyk7Zm9yKGxldCBhPTA7YTxpOysrYSl7Y29uc3QgaT1yLmdldEFjdGl2ZVVuaWZvcm0oZSxhKSxzPWkubmFtZS5lbmRzV2l0aCgiWzBdIik/aS5uYW1lLnNsaWNlKDAsLTMpOmkubmFtZSxvPXIuZ2V0VW5pZm9ybUxvY2F0aW9uKGUscyk7aWYoaS50eXBlPT09ci5TQU1QTEVSXzJEJiYxPT09aS5zaXplJiYhbiljb250aW51ZTtjb25zdCBsPXt9O3N3aXRjaChpLnR5cGUpe2Nhc2Ugci5GTE9BVF9WRUM0OmwubWV0aG9kPXIudW5pZm9ybTRmdi5iaW5kKHIsbyksbC5hcnJheT1uZXcgRmxvYXQzMkFycmF5KDQqaS5zaXplKSxsLmFzc2lnbj0tMTticmVhaztjYXNlIHIuSU5UX1ZFQzQ6bC5tZXRob2Q9ci51bmlmb3JtNGl2LmJpbmQocixvKSxsLmFycmF5PW5ldyBJbnQzMkFycmF5KDQqaS5zaXplKSxsLmFzc2lnbj0tMTticmVhaztjYXNlIHIuU0FNUExFUl8yRDpsLm1ldGhvZD1uP3IudW5pZm9ybTFpLmJpbmQocixvLDMpOnIudW5pZm9ybTFpdi5iaW5kKHIsbyksbC5hcnJheT1uZXcgSW50MzJBcnJheShpLnNpemUpLGwuYXNzaWduPTE7YnJlYWs7Y2FzZSByLkZMT0FUOmNhc2Ugci5GTE9BVF9WRUMyOmNhc2Ugci5GTE9BVF9WRUMzOmNhc2Ugci5GTE9BVF9NQVQyOmNhc2Ugci5GTE9BVF9NQVQzOmNhc2Ugci5GTE9BVF9NQVQ0OmNhc2Ugci5JTlQ6Y2FzZSByLklOVF9WRUMyOmNhc2Ugci5JTlRfVkVDMzpkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVXNlIGdsLkZMT0FUX1ZFQzQgb3IgZ2wuSU5UX1ZFQzQgaW5zdGVhZCIpfXQuc2V0KHMsbCl9fSkodGhpcy5fJHByb2dyYW1PYmplY3QucmVzb3VyY2UsdGhpcy5fJHVuaWZvcm1NYXAsbik7Y29uc3QgaT1uZXcgRmxvYXQzMkFycmF5KDApO3RoaXMuaGlnaHA9dGhpcy5fJHVuaWZvcm1NYXAuZ2V0KCJ1X2hpZ2hwIik/LmFycmF5Pz9pLHRoaXMubWVkaXVtcD10aGlzLl8kdW5pZm9ybU1hcC5nZXQoInVfbWVkaXVtcCIpPy5hcnJheT8/aSx0aGlzLnRleHR1cmVzPXRoaXMuXyR1bmlmb3JtTWFwLmdldCgidV90ZXh0dXJlcyIpPy5hcnJheT8/aX11c2VQcm9ncmFtKCl7dmFyIGU7ZT10aGlzLl8kcHJvZ3JhbU9iamVjdCxrdCE9PWUuaWQmJihrdD1lLmlkLHIudXNlUHJvZ3JhbShlLnJlc291cmNlKSl9YmluZFVuaWZvcm0oKXsoZT0+e2Zvcihjb25zdCB0IG9mIGUudmFsdWVzKCkpdm9pZCAwIT09dC5tZXRob2QmJnZvaWQgMCE9PXQuYXNzaWduJiYodC5hc3NpZ248MD90Lm1ldGhvZCh0LmFycmF5KTp0LmFzc2lnbj4wJiYodC5hc3NpZ24tLSx0Lm1ldGhvZCh0LmFycmF5KSkpfSkodGhpcy5fJHVuaWZvcm1NYXApfX1jb25zdCBJdD1uZXcgTWFwLFZ0PShlLHQscixuKT0+e2NvbnN0IGk9cj8ibGF5b3V0IChsb2NhdGlvbiA9IDEpIGluIHZlYzIgYV9iZXppZXI7IjoiIixhPXI/Im91dCB2ZWMyIHZfYmV6aWVyOyI6dD8ib3V0IHZlYzIgdl91djsiOiIiLHM9cj8idl9iZXppZXIgPSBhX2JlemllcjsiOnQ/IlxuICAgIG1hdDMgdXZfbWF0cml4ID0gbWF0MyhcbiAgICAgICAgdV9oaWdocFswXS54eXosXG4gICAgICAgIHVfaGlnaHBbMV0ueHl6LFxuICAgICAgICB1X2hpZ2hwWzJdLnh5elxuICAgICk7XG4gICAgbWF0MyBpbnZlcnNlX21hdHJpeCA9IG1hdDMoXG4gICAgICAgIHVfaGlnaHBbM10ueHl6LFxuICAgICAgICB1X2hpZ2hwWzRdLnh5eixcbiAgICAgICAgdmVjMyh1X2hpZ2hwWzJdLncsIHVfaGlnaHBbM10udywgdV9oaWdocFs0XS53KVxuICAgICk7XG4gICAgdl91diA9IChpbnZlcnNlX21hdHJpeCAqIHV2X21hdHJpeCAqIHZlYzMoYV92ZXJ0ZXgsIDEuMCkpLnh5OyI6IiIsbz1uPyhlPT5gXG52ZWMyIGFwcGx5TWF0cml4KGluIHZlYzIgdmVydGV4KSB7XG4gICAgbWF0MyBwYXJlbnRfbWF0cml4ID0gbWF0MyhcbiAgICAgICAgdV9oaWdocFske2V9XS54eXosXG4gICAgICAgIHVfaGlnaHBbJHtlKzF9XS54eXosXG4gICAgICAgIHVfaGlnaHBbJHtlKzJ9XS54eXpcbiAgICApO1xuICAgIG1hdDMgYW5jZXN0b3JfbWF0cml4ID0gbWF0MyhcbiAgICAgICAgdV9oaWdocFske2UrM31dLnh5eixcbiAgICAgICAgdV9oaWdocFske2UrNH1dLnh5eixcbiAgICAgICAgdV9oaWdocFske2UrNX1dLnh5elxuICAgICk7XG5cbiAgICB2ZWMyIHBhcmVudF9vZmZzZXQgPSB2ZWMyKHVfaGlnaHBbJHtlKzJ9XS53LCB1X2hpZ2hwWyR7ZSszfV0udyk7XG4gICAgdmVjMiBwYXJlbnRfc2l6ZSAgID0gdmVjMih1X2hpZ2hwWyR7ZSs0fV0udywgdV9oaWdocFske2UrNX1dLncpO1xuICAgIHZlYzQgZ3JpZF9taW4gPSB1X2hpZ2hwWyR7ZSs2fV07XG4gICAgdmVjNCBncmlkX21heCA9IHVfaGlnaHBbJHtlKzd9XTtcblxuICAgIHZlYzIgcG9zaXRpb24gPSAocGFyZW50X21hdHJpeCAqIHZlYzModmVydGV4LCAxLjApKS54eTtcbiAgICBwb3NpdGlvbiA9IChwb3NpdGlvbiAtIHBhcmVudF9vZmZzZXQpIC8gcGFyZW50X3NpemU7XG5cbiAgICB2ZWM0IGdhID0gZ3JpZF9taW47XG4gICAgdmVjNCBnYiA9IGdyaWRfbWF4ICAtIGdyaWRfbWluO1xuICAgIHZlYzQgZ2MgPSB2ZWM0KDEuMCkgLSBncmlkX21heDtcblxuICAgIHZlYzIgcGEgPSBwb3NpdGlvbjtcbiAgICB2ZWMyIHBiID0gcG9zaXRpb24gLSBncmlkX21pbi5zdDtcbiAgICB2ZWMyIHBjID0gcG9zaXRpb24gLSBncmlkX21heC5zdDtcblxuICAgIHBvc2l0aW9uID0gKGdhLnBxIC8gZ2Euc3QpICogbWluKHBhLCBnYS5zdClcbiAgICAgICAgICAgICAgICArIChnYi5wcSAvIGdiLnN0KSAqIGNsYW1wKHBiLCB2ZWMyKDAuMCksIGdiLnN0KVxuICAgICAgICAgICAgICAgICsgKGdjLnBxIC8gZ2Muc3QpICogbWF4KHZlYzIoMC4wKSwgcGMpO1xuXG4gICAgcG9zaXRpb24gPSBwb3NpdGlvbiAqIHBhcmVudF9zaXplICsgcGFyZW50X29mZnNldDtcbiAgICBwb3NpdGlvbiA9IChhbmNlc3Rvcl9tYXRyaXggKiB2ZWMzKHBvc2l0aW9uLCAxLjApKS54eTtcblxuICAgIHBvc2l0aW9uID0gcG9zaXRpb24gKyB2ZWMyKHVfaGlnaHBbJHtlKzh9XS54LCB1X2hpZ2hwWyR7ZSs4fV0ueSk7XG4gICAgcmV0dXJuIHBvc2l0aW9uIC8gdmVjMih1X2hpZ2hwWzBdLncsIHVfaGlnaHBbMV0udyk7XG59YCkodD81OjApOiJcbnZlYzIgYXBwbHlNYXRyaXgoaW4gdmVjMiB2ZXJ0ZXgpIHtcbiAgICBtYXQzIG1hdHJpeCA9IG1hdDMoYV9tYXRyaXgwLCBhX21hdHJpeDEsIGFfbWF0cml4Mik7XG4gICAgcmV0dXJuIChtYXRyaXggKiB2ZWMzKHZlcnRleCwgMS4wKSkueHk7XG59IjtyZXR1cm5gI3ZlcnNpb24gMzAwIGVzXG5cbmxheW91dCAobG9jYXRpb24gPSAwKSBpbiB2ZWMyIGFfdmVydGV4O1xuJHtpfVxuJHtyPyIiOiJsYXlvdXQgKGxvY2F0aW9uID0gMikgaW4gdmVjNCBhX2NvbG9yOyJ9XG4ke24/IiI6ImxheW91dCAobG9jYXRpb24gPSAzKSBpbiB2ZWMzIGFfbWF0cml4MDtcbmxheW91dCAobG9jYXRpb24gPSA0KSBpbiB2ZWMzIGFfbWF0cml4MTtcbmxheW91dCAobG9jYXRpb24gPSA1KSBpbiB2ZWMzIGFfbWF0cml4MjsifVxuXG4ke2U+MT9gdW5pZm9ybSB2ZWM0IHVfaGlnaHBbJHtlfV07YDoiIn1cbiR7YX1cbiR7cj8iIjoib3V0IHZlYzQgdl9jb2xvcjsifVxuJHtvfVxuXG52b2lkIG1haW4oKSB7XG4gICAgJHtyPyIiOiJ2X2NvbG9yID0gYV9jb2xvcjsifVxuICAgICR7c31cbiAgICB2ZWMyIHBvcyA9IGFwcGx5TWF0cml4KGFfdmVydGV4KTtcbiAgICBwb3MgPSBwb3MgKiAyLjAgLSAxLjA7XG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvcy54LCAtcG9zLnksIDAuMCwgMS4wKTtcbn1gfSx6dD1lPT57Y29uc3QgdD0ibSIrKGU/InkiOiJuIik7aWYoSXQuaGFzKHQpKXJldHVybiBJdC5nZXQodCk7Y29uc3Qgcj1uZXcgTHQoVnQoZT85OjAsITEsITAsZSksIiN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cbmluIHZlYzIgdl9iZXppZXI7XG5vdXQgdmVjNCBvX2NvbG9yO1xuXG52b2lkIG1haW4oKSB7XG4gICAgZmxvYXQgZl92YWwgPSB2X2Jlemllci54ICogdl9iZXppZXIueCAtIHZfYmV6aWVyLnk7XG5cbiAgICBmbG9hdCBkeCA9IGRGZHgoZl92YWwpO1xuICAgIGZsb2F0IGR5ID0gZEZkeShmX3ZhbCk7XG5cbiAgICBmbG9hdCBkaXN0ID0gZl92YWwgLyBsZW5ndGgodmVjMihkeCwgZHkpKTtcbiAgICBmbG9hdCBhbHBoYSA9IHNtb290aHN0ZXAoMC41LCAtMC41LCBkaXN0KTtcblxuICAgIGlmIChhbHBoYSA+IDAuMDAxKSB7XG4gICAgICAgIG9fY29sb3IgPSB2ZWM0KG1pbihhbHBoYSwgMS4wKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZGlzY2FyZDtcbiAgICB9XG59Iik7cmV0dXJuIEl0LnNldCh0LHIpLHJ9LGp0PShlLHQpPT57Y29uc3Qgcj1lLmhpZ2hwO3JbMF09dFswXSxyWzFdPXRbMV0sclsyXT0wLHJbNF09dFsyXSxyWzVdPXRbM10scls2XT0wLHJbOF09dFs0XSxyWzldPXRbNV0sclsxMF09MSxyWzEyXT10WzZdLHJbMTNdPXRbN10sclsxNF09MCxyWzE2XT10WzhdLHJbMTddPXRbOV0sclsxOF09MCxyWzIwXT10WzEwXSxyWzIxXT10WzExXSxyWzIyXT0xLHJbM109UCxyWzddPVMsclsxMV09dFsxMl0sclsxNV09dFsxM10sclsxOV09dFsxNF0sclsyM109dFsxNV0sclsyNF09dFsxNl0sclsyNV09dFsxN10sclsyNl09dFsxOF0sclsyN109dFsxOV0sclsyOF09dFsyMF0sclsyOV09dFsyMV0sclszMF09dFsyMl0sclszMV09dFsyM10sclszMl09dFsyNF0sclszM109dFsyNV19O2xldCBEdD0ibm9ybWFsIjtjb25zdCBOdD1lPT57RHQ9ZX07bGV0IFd0PTYwMDtjb25zdCBxdD1lPT57V3Q9ZX0sWHQ9KCk9Pns2MTMhPT1XdCYmKHF0KDYxMyksci5ibGVuZEZ1bmMoci5PTkUsci5PTkVfTUlOVVNfU1JDX0FMUEhBKSl9LFl0PShlLHQsbixpKT0+e2UudXNlUHJvZ3JhbSgpLGUuYmluZFVuaWZvcm0oKSxYdCgpLFR0KHQpLHIuZHJhd0FycmF5cyhyLlRSSUFOR0xFUyxuLGkpfSxLdD0oKT0+e2NvbnN0IGU9InJtbm4iO2lmKEl0LmhhcyhlKSlyZXR1cm4gSXQuZ2V0KGUpO2NvbnN0IHQ9bmV3IEx0KCIjdmVyc2lvbiAzMDAgZXNcbmxheW91dCAobG9jYXRpb24gPSAwKSBpbiB2ZWMyIGFfdmVydGV4O1xudm9pZCBtYWluKCkge1xuICAgIHZlYzIgcG9zID0gYV92ZXJ0ZXggKiAyLjAgLSAxLjA7XG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvcy54LCAtcG9zLnksIDAuMCwgMS4wKTtcbn0iLCIjdmVyc2lvbiAzMDAgZXNcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xub3V0IHZlYzQgb19jb2xvcjtcbnZvaWQgbWFpbigpIHtcbiAgICBvX2NvbG9yID0gdmVjNCgxLjApO1xufSIpO3JldHVybiBJdC5zZXQoZSx0KSx0fSxIdD0oKT0+e2NvbnN0IGU9bi5jdXJyZW50QXR0YWNobWVudE9iamVjdDtpZighZSlyZXR1cm47Y29uc3QgdD0xPDxlLmNsaXBMZXZlbC0xO3Iuc3RlbmNpbE1hc2sofnQtMSksci5zdGVuY2lsRnVuYyhyLkxFUVVBTCx0LDI1NSksci5zdGVuY2lsT3Aoci5aRVJPLHIuUkVQTEFDRSxyLlJFUExBQ0UpLFl0KEt0KCksRXQoKSwwLDYpLHIuc3RlbmNpbE1hc2soMTw8ZS5jbGlwTGV2ZWwpLHIuc3RlbmNpbEZ1bmMoci5BTFdBWVMsMCwyNTUpLHIuc3RlbmNpbE9wKHIuUkVQTEFDRSxyLlJFUExBQ0Usci5SRVBMQUNFKSxZdChLdCgpLEV0KCksMCw2KSxyLnN0ZW5jaWxNYXNrKDI1NSksci5zdGVuY2lsT3Aoci5aRVJPLHIuSU5WRVJULHIuSU5WRVJUKX0sUXQ9W107Y2xhc3MgWnR7Y29uc3RydWN0b3IoZSx0LHIsbixpKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaW5kZXgiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywieCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJ5Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInciLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJsZWZ0Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInJpZ2h0Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInVzZWQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSx0aGlzLmluZGV4PWUsdGhpcy54PXQsdGhpcy55PXIsdGhpcy53PW4sdGhpcy5oPWksdGhpcy5sZWZ0PW51bGwsdGhpcy5yaWdodD1udWxsLHRoaXMudXNlZD0hMX1pbnNlcnQoZSx0KXtyZXR1cm4oKGUsdCxyKT0+e2lmKGUudXNlZCl7Y29uc3Qgbj1lLmxlZnQ/Lmluc2VydCh0LHIpO3JldHVybiBufHxlLnJpZ2h0Py5pbnNlcnQodCxyKXx8bnVsbH1pZih0PmUud3x8cj5lLmgpcmV0dXJuIG51bGw7aWYodD09PWUudyYmcj09PWUuaClyZXR1cm4gZS51c2VkPSEwLGU7Y29uc3Qgbj10KzEsaT1yKzEsYT1lLnctbixzPWUuaC1pO3JldHVybiBhPnM/KGUubGVmdD1lLmNyZWF0ZShlLmluZGV4LGUueCxlLnksdCxlLmgpLGUucmlnaHQ9ZS5jcmVhdGUoZS5pbmRleCxlLngrbixlLnksYSxlLmgpKTooZS5sZWZ0PWUuY3JlYXRlKGUuaW5kZXgsZS54LGUueSxlLncsciksZS5yaWdodD1lLmNyZWF0ZShlLmluZGV4LGUueCxlLnkraSxlLncscykpLGUudXNlZD0hMCxlLmxlZnQuaW5zZXJ0KHQscil9KSh0aGlzLGUsdCl9ZGlzcG9zZShlLHQscixuKXtyZXR1cm4oKGUsdCxyLG4saSk9PmUubGVmdD8uZGlzcG9zZSh0LHIsbixpKT8oZS5sZWZ0LnVzZWR8fGUucmlnaHQ/LnVzZWR8fChlLmxlZnQmJmUubGVmdC5yZWxlYXNlKCksZS5yaWdodCYmZS5yaWdodC5yZWxlYXNlKCksZS5sZWZ0PWUucmlnaHQ9bnVsbCxlLnVzZWQ9ITEpLCEwKTplLnJpZ2h0Py5kaXNwb3NlKHQscixuLGkpPyhlLnJpZ2h0LnVzZWR8fGUubGVmdD8udXNlZHx8KGUubGVmdCYmZS5sZWZ0LnJlbGVhc2UoKSxlLnJpZ2h0JiZlLnJpZ2h0LnJlbGVhc2UoKSxlLmxlZnQ9ZS5yaWdodD1udWxsLGUudXNlZD0hMSksITApOnQ9PT1lLngmJnI9PT1lLnkmJm49PT1lLncmJmk9PT1lLmgmJihlLnVzZWQ9ITEsITApKSh0aGlzLGUsdCxyLG4pfWNyZWF0ZShlLHQscixuLGkpe2NvbnN0IGE9UXQubGVuZ3RoP1F0LnBvcCgpOm5ldyBadChlLDAsMCwwLDApO3JldHVybiBhLmluZGV4PWUsYS54PXQsYS55PXIsYS53PW4sYS5oPWksYS5sZWZ0PW51bGwsYS5yaWdodD1udWxsLGEudXNlZD0hMSxhfXJlbGVhc2UoKXt0aGlzLmxlZnQmJih0aGlzLmxlZnQucmVsZWFzZSgpLHRoaXMubGVmdD1udWxsKSx0aGlzLnJpZ2h0JiYodGhpcy5yaWdodC5yZWxlYXNlKCksdGhpcy5yaWdodD1udWxsKSx0aGlzLnVzZWQ9ITEsUXQucHVzaCh0aGlzKX19Y2xhc3MgSnR7Y29uc3RydWN0b3IoZSx0LHIpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJfJHJvb3QiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSx0aGlzLl8kcm9vdD1uZXcgWnQoZSwwLDAsdCxyKX1pbnNlcnQoZSx0KXtyZXR1cm4gdGhpcy5fJHJvb3QuaW5zZXJ0KGUsdCl9ZGlzcG9zZShlLHQscixuKXtyZXR1cm4gdGhpcy5fJHJvb3QuZGlzcG9zZShlLHQscixuKX19Y29uc3QgZXI9KHQscik9Pntjb25zdCBuPU1lO1RlW25dfHwoVGVbbl09bmV3IEp0KG4sZSxlKSk7Y29uc3QgaT1UZVtuXS5pbnNlcnQodCxyKTtpZihpKXJldHVybiBpO2ZvcihsZXQgZT0wO2U8MTA7ZSsrKXtpZihuPT09ZSljb250aW51ZTtQZShlKTtjb25zdCBpPVRlW2VdO2lmKCFpKXJldHVybiBlcih0LHIpO2NvbnN0IGE9aS5pbnNlcnQodCxyKTtpZihhKXJldHVybiBhfXJldHVybiBlcih0LHIpfSx0cj1lPT5gXG4gICAgdmVjNCBtdWwgPSB1X21lZGl1bXBbJHtlfV07XG4gICAgdmVjNCBhZGQgPSB1X21lZGl1bXBbJHtlKzF9XTtcblxuICAgIGlmIChtdWwueCAhPSAxLjAgfHwgbXVsLnkgIT0gMS4wIHx8IG11bC56ICE9IDEuMCB8fCBtdWwudyAhPSAxLjBcbiAgICAgICAgfHwgYWRkLnggIT0gMC4wIHx8IGFkZC55ICE9IDAuMCB8fCBhZGQueiAhPSAwLjBcbiAgICApIHtcbiAgICAgICAgc3JjLnJnYiAvPSBtYXgoMC4wMDAxLCBzcmMuYSk7XG4gICAgICAgIHNyYyA9IGNsYW1wKHNyYyAqIG11bCArIGFkZCwgMC4wLCAxLjApO1xuICAgICAgICBzcmMucmdiICo9IHNyYy5hO1xuICAgIH1cbmAscnI9ZT0+YCN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cbnVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4dHVyZTtcbiR7ZT8idW5pZm9ybSB2ZWM0IHVfbWVkaXVtcFsyXTsiOiIifVxuXG5pbiB2ZWMyIHZfY29vcmQ7XG5vdXQgdmVjNCBvX2NvbG9yO1xuXG52b2lkIG1haW4oKSB7XG4gICAgdmVjNCBzcmMgPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdl9jb29yZCk7XG4gICAgJHtlP3RyKDApOiIifVxuICAgIG9fY29sb3IgPSBzcmM7XG59YDtjb25zdCBucj1uZXcgY2xhc3N7Y29uc3RydWN0b3IoKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiYnVmZmVyIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIm9mZnNldCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLHRoaXMuYnVmZmVyPW5ldyBGbG9hdDMyQXJyYXkoMjU2KSx0aGlzLm9mZnNldD0wfXB1c2goLi4uZSl7dGhpcy5idWZmZXIubGVuZ3RoPHRoaXMub2Zmc2V0K2UubGVuZ3RoJiZ0aGlzLnJlc2l6ZShlLmxlbmd0aCk7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0KyspdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109ZVt0XX1wdXNoRGlzcGxheU9iamVjdEJ1ZmZlcihlLHQscixuLGksYSxzLG8sbCxjLHUsZixkLGgscCxtLGcsYix4LHYseSxfKXt0aGlzLmJ1ZmZlci5sZW5ndGg8dGhpcy5vZmZzZXQrMjImJnRoaXMucmVzaXplKDIyKSx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1lLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPXQsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109cix0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1uLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPWksdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109YSx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1zLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPW8sdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109bCx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1jLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPXUsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109Zix0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1kLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPWgsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109cCx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1tLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPWcsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109Yix0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT14LHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPXYsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109eSx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1ffXB1c2hJbnN0YW5jZUJ1ZmZlcihlLHQscixuLGksYSxzLG8sbCxjLHUsZixkLGgscCxtLGcsYix4LHYseSxfLHcsTSl7dGhpcy5idWZmZXIubGVuZ3RoPHRoaXMub2Zmc2V0KzI0JiZ0aGlzLnJlc2l6ZSgyNCksdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109ZSx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT10LHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPXIsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109bix0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1pLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPWEsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109cyx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1vLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPWwsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109Yyx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT11LHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPWYsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109ZCx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1oLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPXAsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109bSx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1nLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPWIsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109eCx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT12LHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPXksdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109Xyx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT13LHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPU19cHVzaFNoYXBlQnVmZmVyKGUsdCxyLG4saSxhLHMsbyxsLGMsdSxmLGQsaCxwLG0sZyxiLHgsdix5LF8sdyxNLFAsUyxGLFQsQixPLEEsUil7dGhpcy5idWZmZXIubGVuZ3RoPHRoaXMub2Zmc2V0KzMyJiZ0aGlzLnJlc2l6ZSgzMiksdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109ZSx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT10LHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPXIsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109bix0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1pLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPWEsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109cyx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1vLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPWwsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109Yyx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT11LHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPWYsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109ZCx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1oLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPXAsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109bSx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1nLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPWIsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109eCx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT12LHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPXksdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109Xyx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT13LHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPU0sdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109UCx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1TLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPUYsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109VCx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1CLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPU8sdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109QSx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1SfXB1c2hUZXh0RmllbGRCdWZmZXIoZSx0LHIsbixpLGEscyxvLGwsYyx1LGYsZCxoLHAsbSxnLGIseCx2LHksXyx3LE0sUCxTLEYsVCxCLE8pe3RoaXMuYnVmZmVyLmxlbmd0aDx0aGlzLm9mZnNldCszMCYmdGhpcy5yZXNpemUoMzApLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPWUsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109dCx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1yLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPW4sdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109aSx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1hLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPXMsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109byx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1sLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPWMsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109dSx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1mLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPWQsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109aCx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1wLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPW0sdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109Zyx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1iLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPXgsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109dix0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT15LHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPV8sdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109dyx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1NLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPVAsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109Uyx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1GLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPVQsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109Qix0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1PfXB1c2hWaWRlb0J1ZmZlcihlLHQscixuLGksYSxzLG8sbCxjLHUsZixkLGgscCxtLGcsYix4LHYseSxfLHcsTSxQLFMsRil7dGhpcy5idWZmZXIubGVuZ3RoPHRoaXMub2Zmc2V0KzI3JiZ0aGlzLnJlc2l6ZSgyNyksdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109ZSx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT10LHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPXIsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109bix0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1pLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPWEsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109cyx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1vLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPWwsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109Yyx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT11LHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPWYsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109ZCx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1oLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPXAsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109bSx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1nLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPWIsdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109eCx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT12LHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPXksdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109Xyx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT13LHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPU0sdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109UCx0aGlzLmJ1ZmZlclt0aGlzLm9mZnNldCsrXT1TLHRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPUZ9c2V0KGUpe3RoaXMuYnVmZmVyLmxlbmd0aDx0aGlzLm9mZnNldCtlLmxlbmd0aCYmdGhpcy5yZXNpemUoZS5sZW5ndGgpLHRoaXMuYnVmZmVyLnNldChlLHRoaXMub2Zmc2V0KSx0aGlzLm9mZnNldCs9ZS5sZW5ndGh9cmVzaXplKGUpe2NvbnN0IHQ9bmV3IEZsb2F0MzJBcnJheSgocj10aGlzLm9mZnNldCtlLHItLSxyfD1yPj4xLHJ8PXI+PjIscnw9cj4+NCxyfD1yPj44LHJ8PXI+PjE2LCsrcikpO3ZhciByO3RoaXMuYnVmZmVyLmxlbmd0aCYmdC5zZXQodGhpcy5idWZmZXIpLHRoaXMuYnVmZmVyPXR9fTtsZXQgaXI9Y2xhc3MgZXh0ZW5kcyBMdHtjb25zdHJ1Y3RvcihlLHQscj0hMCl7c3VwZXIoZSx0LHIpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJjb3VudCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLHRoaXMuY291bnQ9MH1jbGVhcigpe3RoaXMuY291bnQ9bnIub2Zmc2V0PTB9fTtjb25zdCBhcj1uZXcgTWFwLHNyPSgpPT57aWYoYXIuaGFzKCJpIikpcmV0dXJuIGFyLmdldCgiaSIpO2NvbnN0IGU9bmV3IGlyKCIjdmVyc2lvbiAzMDAgZXNcblxubGF5b3V0IChsb2NhdGlvbiA9IDApIGluIHZlYzIgYV92ZXJ0ZXg7XG5sYXlvdXQgKGxvY2F0aW9uID0gMSkgaW4gdmVjNCBhX3JlY3Q7XG5sYXlvdXQgKGxvY2F0aW9uID0gMikgaW4gdmVjNCBhX3NpemU7XG5sYXlvdXQgKGxvY2F0aW9uID0gMykgaW4gdmVjMiBhX29mZnNldDtcbmxheW91dCAobG9jYXRpb24gPSA0KSBpbiB2ZWM0IGFfbWF0cml4O1xubGF5b3V0IChsb2NhdGlvbiA9IDUpIGluIHZlYzQgYV9tdWw7XG5sYXlvdXQgKGxvY2F0aW9uID0gNikgaW4gdmVjNCBhX2FkZDtcblxub3V0IHZlYzIgdl9jb29yZDtcbm91dCB2ZWM0IHZfbXVsO1xub3V0IHZlYzQgdl9hZGQ7XG5cbnZvaWQgbWFpbigpIHtcbiAgICB2X2Nvb3JkID0gYV92ZXJ0ZXggKiBhX3JlY3QuencgKyBhX3JlY3QueHk7XG4gICAgdl9tdWwgPSBhX211bDtcbiAgICB2X2FkZCA9IGFfYWRkO1xuXG4gICAgdmVjMiBwb3NpdGlvbiA9IHZlYzIoYV92ZXJ0ZXgueCwgMS4wIC0gYV92ZXJ0ZXgueSk7XG4gICAgcG9zaXRpb24gPSBwb3NpdGlvbiAqIGFfc2l6ZS54eTtcblxuICAgIG1hdDMgbWF0cml4ID0gbWF0MyhcbiAgICAgICAgYV9tYXRyaXgueCwgYV9tYXRyaXgueSwgMC4wLFxuICAgICAgICBhX21hdHJpeC56LCBhX21hdHJpeC53LCAwLjAsXG4gICAgICAgIGFfb2Zmc2V0LngsIGFfb2Zmc2V0LnksIDEuMFxuICAgICk7XG5cbiAgICBwb3NpdGlvbiA9IChtYXRyaXggKiB2ZWMzKHBvc2l0aW9uLCAxLjApKS54eTtcbiAgICBwb3NpdGlvbiAvPSBhX3NpemUuenc7XG5cbiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uICogMi4wIC0gMS4wO1xuICAgIGdsX1Bvc2l0aW9uID0gdmVjNChwb3NpdGlvbi54LCAtcG9zaXRpb24ueSwgMC4wLCAxLjApO1xufSIsIiN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cbnVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4dHVyZTtcblxuaW4gdmVjNCB2X211bDtcbmluIHZlYzQgdl9hZGQ7XG5pbiB2ZWMyIHZfY29vcmQ7XG5vdXQgdmVjNCBvX2NvbG9yO1xuXG52b2lkIG1haW4oKSB7XG4gICAgdmVjNCBzcmMgPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdl9jb29yZCk7XG5cbiAgICBpZiAodl9tdWwueCAhPSAxLjAgfHwgdl9tdWwueSAhPSAxLjAgfHwgdl9tdWwueiAhPSAxLjAgfHwgdl9tdWwudyAhPSAxLjBcbiAgICAgICAgfHwgdl9hZGQueCAhPSAwLjAgfHwgdl9hZGQueSAhPSAwLjAgfHwgdl9hZGQueiAhPSAwLjBcbiAgICApIHtcbiAgICAgICAgc3JjLnJnYiAvPSBtYXgoMC4wMDAxLCBzcmMuYSk7XG4gICAgICAgIHNyYyA9IGNsYW1wKHNyYyAqIHZfbXVsICsgdl9hZGQsIDAuMCwgMS4wKTtcbiAgICAgICAgc3JjLnJnYiAqPSBzcmMuYTtcbiAgICB9XG5cbiAgICBvX2NvbG9yID0gc3JjO1xufSIpO3JldHVybiBhci5zZXQoImkiLGUpLGV9LG9yPShlLHQpPT57Y29uc3Qgcj1gaSR7ZX15YDtpZihhci5oYXMocikpcmV0dXJuIGFyLmdldChyKTtjb25zdCBuPW5ldyBMdCgiI3ZlcnNpb24gMzAwIGVzXG5cbmxheW91dCAobG9jYXRpb24gPSAwKSBpbiB2ZWMyIGFfdmVydGV4O1xuXG5vdXQgdmVjMiB2X2Nvb3JkO1xuXG52b2lkIG1haW4oKSB7XG4gICAgdl9jb29yZCA9IGFfdmVydGV4O1xuXG4gICAgdmVjMiBwb3NpdGlvbiA9IGFfdmVydGV4ICogMi4wIC0gMS4wO1xuICAgIGdsX1Bvc2l0aW9uID0gdmVjNChwb3NpdGlvbiwgMC4wLCAxLjApO1xufSIsKGU9PntsZXQgdDtzd2l0Y2goZSl7Y2FzZSJzdWJ0cmFjdCI6dD0iXG52ZWM0IGJsZW5kIChpbiB2ZWM0IHNyYywgaW4gdmVjNCBkc3QpIHtcbiAgICBpZiAoc3JjLmEgPT0gMC4wKSB7IHJldHVybiBkc3Q7IH1cbiAgICBpZiAoZHN0LmEgPT0gMC4wKSB7IHJldHVybiBzcmM7IH1cblxuICAgIHZlYzQgYSA9IHNyYyAtIHNyYyAqIGRzdC5hO1xuICAgIHZlYzQgYiA9IGRzdCAtIGRzdCAqIHNyYy5hO1xuXG4gICAgc3JjLnJnYiAvPSBzcmMuYTtcbiAgICBkc3QucmdiIC89IGRzdC5hO1xuXG4gICAgdmVjNCBjID0gdmVjNChkc3QucmdiIC0gc3JjLnJnYiwgc3JjLmEgKiBkc3QuYSk7XG4gICAgYy5yZ2IgKj0gYy5hO1xuXG4gICAgcmV0dXJuIGEgKyBiICsgYztcbn0iO2JyZWFrO2Nhc2UibXVsdGlwbHkiOnQ9IlxudmVjNCBibGVuZCAoaW4gdmVjNCBzcmMsIGluIHZlYzQgZHN0KSB7XG4gICAgdmVjNCBhID0gc3JjIC0gc3JjICogZHN0LmE7XG4gICAgdmVjNCBiID0gZHN0IC0gZHN0ICogc3JjLmE7XG4gICAgdmVjNCBjID0gc3JjICogZHN0O1xuXG4gICAgcmV0dXJuIGEgKyBiICsgYztcbn0iO2JyZWFrO2Nhc2UibGlnaHRlbiI6dD0iXG52ZWM0IGJsZW5kIChpbiB2ZWM0IHNyYywgaW4gdmVjNCBkc3QpIHtcbiAgICBpZiAoc3JjLmEgPT0gMC4wKSB7IHJldHVybiBkc3Q7IH1cbiAgICBpZiAoZHN0LmEgPT0gMC4wKSB7IHJldHVybiBzcmM7IH1cblxuICAgIHZlYzQgYSA9IHNyYyAtIHNyYyAqIGRzdC5hO1xuICAgIHZlYzQgYiA9IGRzdCAtIGRzdCAqIHNyYy5hO1xuXG4gICAgc3JjLnJnYiAvPSBzcmMuYTtcbiAgICBkc3QucmdiIC89IGRzdC5hO1xuXG4gICAgdmVjNCBjID0gdmVjNChtaXgoc3JjLnJnYiwgZHN0LnJnYiwgc3RlcChzcmMucmdiLCBkc3QucmdiKSksIHNyYy5hICogZHN0LmEpO1xuICAgIGMucmdiICo9IGMuYTtcblxuICAgIHJldHVybiBhICsgYiArIGM7XG59IjticmVhaztjYXNlImRhcmtlbiI6dD0iXG52ZWM0IGJsZW5kIChpbiB2ZWM0IHNyYywgaW4gdmVjNCBkc3QpIHtcbiAgICBpZiAoc3JjLmEgPT0gMC4wKSB7IHJldHVybiBkc3Q7IH1cbiAgICBpZiAoZHN0LmEgPT0gMC4wKSB7IHJldHVybiBzcmM7IH1cblxuICAgIHZlYzQgYSA9IHNyYyAtIHNyYyAqIGRzdC5hO1xuICAgIHZlYzQgYiA9IGRzdCAtIGRzdCAqIHNyYy5hO1xuXG4gICAgc3JjLnJnYiAvPSBzcmMuYTtcbiAgICBkc3QucmdiIC89IGRzdC5hO1xuXG4gICAgdmVjNCBjID0gdmVjNChtaXgoc3JjLnJnYiwgZHN0LnJnYiwgc3RlcChkc3QucmdiLCBzcmMucmdiKSksIHNyYy5hICogZHN0LmEpO1xuICAgIGMucmdiICo9IGMuYTtcblxuICAgIHJldHVybiBhICsgYiArIGM7XG59IjticmVhaztjYXNlIm92ZXJsYXkiOnQ9IlxudmVjNCBibGVuZCAoaW4gdmVjNCBzcmMsIGluIHZlYzQgZHN0KSB7XG4gICAgaWYgKHNyYy5hID09IDAuMCkgeyByZXR1cm4gZHN0OyB9XG4gICAgaWYgKGRzdC5hID09IDAuMCkgeyByZXR1cm4gc3JjOyB9XG5cbiAgICB2ZWM0IGEgPSBzcmMgLSBzcmMgKiBkc3QuYTtcbiAgICB2ZWM0IGIgPSBkc3QgLSBkc3QgKiBzcmMuYTtcblxuICAgIHNyYy5yZ2IgLz0gc3JjLmE7XG4gICAgZHN0LnJnYiAvPSBkc3QuYTtcblxuICAgIHZlYzQgbXVsID0gc3JjICogZHN0O1xuICAgIHZlYzMgYzEgPSAyLjAgKiBtdWwucmdiO1xuICAgIHZlYzMgYzIgPSAyLjAgKiAoc3JjLnJnYiArIGRzdC5yZ2IgLSBtdWwucmdiKSAtIDEuMDtcbiAgICB2ZWM0IGMgPSB2ZWM0KG1peChjMSwgYzIsIHN0ZXAodmVjMygwLjUpLCBkc3QucmdiKSksIG11bC5hKTtcbiAgICBjLnJnYiAqPSBjLmE7XG5cbiAgICByZXR1cm4gYSArIGIgKyBjO1xufSI7YnJlYWs7Y2FzZSJoYXJkbGlnaHQiOnQ9IlxudmVjNCBibGVuZCAoaW4gdmVjNCBzcmMsIGluIHZlYzQgZHN0KSB7XG4gICAgaWYgKHNyYy5hID09IDAuMCkgeyByZXR1cm4gZHN0OyB9XG4gICAgaWYgKGRzdC5hID09IDAuMCkgeyByZXR1cm4gc3JjOyB9XG5cbiAgICB2ZWM0IGEgPSBzcmMgLSBzcmMgKiBkc3QuYTtcbiAgICB2ZWM0IGIgPSBkc3QgLSBkc3QgKiBzcmMuYTtcblxuICAgIHNyYy5yZ2IgLz0gc3JjLmE7XG4gICAgZHN0LnJnYiAvPSBkc3QuYTtcblxuICAgIHZlYzQgbXVsID0gc3JjICogZHN0O1xuICAgIHZlYzMgYzEgPSAyLjAgKiBtdWwucmdiO1xuICAgIHZlYzMgYzIgPSAyLjAgKiAoc3JjLnJnYiArIGRzdC5yZ2IgLSBtdWwucmdiKSAtIDEuMDtcbiAgICB2ZWM0IGMgPSB2ZWM0KG1peChjMSwgYzIsIHN0ZXAodmVjMygwLjUpLCBzcmMucmdiKSksIG11bC5hKTtcbiAgICBjLnJnYiAqPSBjLmE7XG5cbiAgICByZXR1cm4gYSArIGIgKyBjO1xufSI7YnJlYWs7Y2FzZSJkaWZmZXJlbmNlIjp0PSJcbnZlYzQgYmxlbmQgKGluIHZlYzQgc3JjLCBpbiB2ZWM0IGRzdCkge1xuICAgIGlmIChzcmMuYSA9PSAwLjApIHsgcmV0dXJuIGRzdDsgfVxuICAgIGlmIChkc3QuYSA9PSAwLjApIHsgcmV0dXJuIHNyYzsgfVxuXG4gICAgdmVjNCBhID0gc3JjIC0gc3JjICogZHN0LmE7XG4gICAgdmVjNCBiID0gZHN0IC0gZHN0ICogc3JjLmE7XG5cbiAgICBzcmMucmdiIC89IHNyYy5hO1xuICAgIGRzdC5yZ2IgLz0gZHN0LmE7XG5cbiAgICB2ZWM0IGMgPSB2ZWM0KGFicyhzcmMucmdiIC0gZHN0LnJnYiksIHNyYy5hICogZHN0LmEpO1xuICAgIGMucmdiICo9IGMuYTtcblxuICAgIHJldHVybiBhICsgYiArIGM7XG59IjticmVhaztjYXNlImludmVydCI6dD0iXG52ZWM0IGJsZW5kIChpbiB2ZWM0IHNyYywgaW4gdmVjNCBkc3QpIHtcbiAgICBpZiAoc3JjLmEgPT0gMC4wKSB7IHJldHVybiBkc3Q7IH1cbiAgICBpZiAoZHN0LmEgPT0gMC4wKSB7IHJldHVybiBzcmM7IH1cblxuICAgIHZlYzQgYiA9IGRzdCAtIGRzdCAqIHNyYy5hO1xuICAgIHZlYzQgYyA9IHZlYzQoc3JjLmEgLSBkc3QucmdiICogc3JjLmEsIHNyYy5hKTtcblxuICAgIHJldHVybiBiICsgYztcbn0iO2JyZWFrO2RlZmF1bHQ6dD0iXG52ZWM0IGJsZW5kIChpbiB2ZWM0IHNyYywgaW4gdmVjNCBkc3QpIHtcbiAgICByZXR1cm4gc3JjICsgZHN0IC0gZHN0ICogc3JjLmE7XG59In1yZXR1cm5gI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblxudW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlc1syXTtcbnVuaWZvcm0gdmVjNCB1X21lZGl1bXBbMl07XG5cbmluIHZlYzIgdl9jb29yZDtcbm91dCB2ZWM0IG9fY29sb3I7XG5cbiR7dH1cblxudm9pZCBtYWluKCkge1xuICAgIHZlYzQgZHN0ID0gdGV4dHVyZSh1X3RleHR1cmVzWzBdLCB2X2Nvb3JkKTtcbiAgICB2ZWM0IHNyYyA9IHRleHR1cmUodV90ZXh0dXJlc1sxXSwgdl9jb29yZCk7XG4gICAgJHt0cigwKX1cbiAgICBvX2NvbG9yID0gYmxlbmQoc3JjLCBkc3QpO1xufWB9KShlKSk7cmV0dXJuIGFyLnNldChyLG4pLG59LGxyPSgpPT57aWYoIW4ubmV3RHJhd1N0YXRlKXJldHVybjtjb25zdCBlPW4uY3VycmVudEF0dGFjaG1lbnRPYmplY3QsdD1uLmF0bGFzQXR0YWNobWVudE9iamVjdDtuLmJpbmQodCksci5iaW5kRnJhbWVidWZmZXIoci5EUkFXX0ZSQU1FQlVGRkVSLGVlKSxpZSghMSk7Y29uc3QgaT1SZShNZSk7YSgpLHIuc2Npc3NvcihpWzBdLGlbMV0saVsyXS1pWzBdLGlbM10taVsxXSksci5ibGl0RnJhbWVidWZmZXIoMCwwLHQud2lkdGgsdC5oZWlnaHQsMCwwLHQud2lkdGgsdC5oZWlnaHQsci5DT0xPUl9CVUZGRVJfQklULHIuTkVBUkVTVCkscygpLGUmJm4uYmluZChlKSxuLm5ld0RyYXdTdGF0ZT0hMX0sY3I9ZT0+e2NvbnN0IHQ9TWU7UGUoZS5pbmRleCksbHIoKSxyLmJpbmRGcmFtZWJ1ZmZlcihyLkZSQU1FQlVGRkVSLGFlKTtjb25zdCBuPU9lKCk7ci5mcmFtZWJ1ZmZlclRleHR1cmUyRChyLkZSQU1FQlVGRkVSLHIuQ09MT1JfQVRUQUNITUVOVDAsci5URVhUVVJFXzJELG4ucmVzb3VyY2UsMCksci5iaW5kRnJhbWVidWZmZXIoci5GUkFNRUJVRkZFUixzZSk7Y29uc3QgaT12ZShlLncsZS5oKTtyZXR1cm4gci5mcmFtZWJ1ZmZlclRleHR1cmUyRChyLkZSQU1FQlVGRkVSLHIuQ09MT1JfQVRUQUNITUVOVDAsci5URVhUVVJFXzJELGkucmVzb3VyY2UsMCksci5iaW5kRnJhbWVidWZmZXIoci5GUkFNRUJVRkZFUixudWxsKSxyLmJpbmRGcmFtZWJ1ZmZlcihyLlJFQURfRlJBTUVCVUZGRVIsYWUpLHIuYmluZEZyYW1lYnVmZmVyKHIuRFJBV19GUkFNRUJVRkZFUixzZSksci5ibGl0RnJhbWVidWZmZXIoZS54LGUueSxlLngrZS53LGUueStlLmgsMCwwLGUudyxlLmgsci5DT0xPUl9CVUZGRVJfQklULHIuTkVBUkVTVCksUGUodCksci5iaW5kRnJhbWVidWZmZXIoci5SRUFEX0ZSQU1FQlVGRkVSLFopLHIuYmluZEZyYW1lYnVmZmVyKHIuRlJBTUVCVUZGRVIsWiksaX0sdXI9KGUsdCxuPSExKT0+e0dlKDIsci5URVhUVVJFMixudWxsLG4pLEdlKDEsci5URVhUVVJFMSx0LG4pLEdlKDAsci5URVhUVVJFMCxlLG4pfSxmcj0oKT0+e2lmKGFyLmhhcygicCIpKXJldHVybiBhci5nZXQoInAiKTtjb25zdCBlPW5ldyBMdCgiI3ZlcnNpb24gMzAwIGVzXG5cbmxheW91dCAobG9jYXRpb24gPSAwKSBpbiB2ZWMyIGFfdmVydGV4O1xudW5pZm9ybSB2ZWM0IHVfaGlnaHBbMl07XG5cbm91dCB2ZWMyIHZfY29vcmQ7XG5cbnZvaWQgbWFpbigpIHtcbiAgICB2X2Nvb3JkID0gYV92ZXJ0ZXg7XG5cbiAgICB2ZWMyIG9mZnNldCAgID0gdV9oaWdocFswXS54eTtcbiAgICB2ZWMyIHNpemUgICAgID0gdV9oaWdocFswXS56dztcbiAgICB2ZWMyIHZpZXdwb3J0ID0gdmVjMih1X2hpZ2hwWzFdLngsIHVfaGlnaHBbMV0ueSk7XG5cbiAgICB2ZWMyIHBvc2l0aW9uID0gdmVjMihhX3ZlcnRleC54LCAxLjAgLSBhX3ZlcnRleC55KTtcbiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uICogc2l6ZSArIG9mZnNldDtcbiAgICBwb3NpdGlvbiAvPSB2aWV3cG9ydDtcblxuICAgIHBvc2l0aW9uID0gcG9zaXRpb24gKiAyLjAgLSAxLjA7XG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLngsIC1wb3NpdGlvbi55LCAwLjAsIDEuMCk7XG59IixycighMSkpO3JldHVybiBhci5zZXQoInAiLGUpLGV9LGRyPShlLHQscik9Pntjb25zdCBpPWUuaGlnaHAsYT1uLiRtYXRyaXg7aVswXT1hWzZdLGlbMV09YVs3XSxpWzJdPXQsaVszXT1yLGlbNF09UCxpWzVdPVN9LGhyPWU9PntlLnVzZVByb2dyYW0oKSxlLmJpbmRVbmlmb3JtKCksVHQoRXQoKSksci5kcmF3QXJyYXlzKHIuVFJJQU5HTEVTLDAsNil9O2xldCBwcj1udWxsO2NvbnN0IG1yPShlLHQsaSxvKT0+e2NvbnN0IGw9bi5jdXJyZW50QXR0YWNobWVudE9iamVjdCxjPW4uJG1haW5BdHRhY2htZW50T2JqZWN0O3JldHVybiBuLmJpbmQoYyksci5iaW5kRnJhbWVidWZmZXIoci5GUkFNRUJVRkZFUixzZSkscHImJnByLndpZHRoPT09Yy53aWR0aCYmcHIuaGVpZ2h0PT09Yy5oZWlnaHR8fChwcj12ZShjLndpZHRoLGMuaGVpZ2h0KSksa2UocHIpLHIuZnJhbWVidWZmZXJUZXh0dXJlMkQoci5GUkFNRUJVRkZFUixyLkNPTE9SX0FUVEFDSE1FTlQwLHIuVEVYVFVSRV8yRCxwci5yZXNvdXJjZSwwKSxyLmJpbmRGcmFtZWJ1ZmZlcihyLkZSQU1FQlVGRkVSLG51bGwpLHIuYmluZEZyYW1lYnVmZmVyKHIuUkVBRF9GUkFNRUJVRkZFUixaKSxyLmJpbmRGcmFtZWJ1ZmZlcihyLkRSQVdfRlJBTUVCVUZGRVIsc2UpLGEoKSxyLnNjaXNzb3IoZSxjLmhlaWdodC10LW8saSsxLG8rMSksci5ibGl0RnJhbWVidWZmZXIoMCwwLGMud2lkdGgsYy5oZWlnaHQsMCwwLGMud2lkdGgsYy5oZWlnaHQsci5DT0xPUl9CVUZGRVJfQklULHIuTkVBUkVTVCkscygpLHIuYmluZEZyYW1lYnVmZmVyKHIuRlJBTUVCVUZGRVIsWiksbCYmbi5iaW5kKGwpLHByfSxncj0oZSx0LHIsaSk9Pntjb25zdCBhPW4uY3VycmVudEF0dGFjaG1lbnRPYmplY3Qscz1tcihlLHQscixpKSxvPXllKHIsaSwhMSk7bi5iaW5kKG8pLG4uc2F2ZSgpLG4uc2V0VHJhbnNmb3JtKDEsMCwwLDEsLWUsLXQpO2NvbnN0IGw9ZnIoKTtkcihsLHMud2lkdGgscy5oZWlnaHQpLFh0KCksa2UocyksaHIobCk7Y29uc3QgYz1vLnRleHR1cmU7cmV0dXJuIG4ucmVzdG9yZSgpLGNlKG8sITEpLGEmJm4uYmluZChhKSxjfSxicj0oKT0+ezYxMCE9PVd0JiYocXQoNjEwKSxyLmJsZW5kRnVuYyhyLk9ORSxyLlpFUk8pKX0seHI9ZT0+e2tlKGUpLGJyKCk7Y29uc3QgdD1mcigpO2RyKHQsZS53aWR0aCxlLmhlaWdodCksaHIodCksWHQoKX0sdnI9KGUsdCxyLG4saSxhLHMsbyxsKT0+e2NvbnN0IGM9ZS50ZXh0dXJlcztjWzBdPTAsY1sxXT0xO2NvbnN0IHU9ZS5tZWRpdW1wO3VbMF09dCx1WzFdPXIsdVsyXT1uLHVbM109aSx1WzRdPWEsdVs1XT1zLHVbNl09byx1WzddPWx9LHlyPShlPSExKT0+e2NvbnN0IHQ9Im0iKyhlPyJ5IjoibiIpO2lmKGFyLmhhcyh0KSlyZXR1cm4gYXIuZ2V0KHQpO2NvbnN0IHI9bmV3IEx0KCIjdmVyc2lvbiAzMDAgZXNcblxubGF5b3V0IChsb2NhdGlvbiA9IDApIGluIHZlYzIgYV92ZXJ0ZXg7XG51bmlmb3JtIHZlYzQgdV9oaWdocFszXTtcblxub3V0IHZlYzIgdl9jb29yZDtcblxudm9pZCBtYWluKCkge1xuICAgIHZfY29vcmQgPSBhX3ZlcnRleDtcblxuICAgIG1hdDMgbWF0cml4ID0gbWF0MyhcbiAgICAgICAgdV9oaWdocFswXS54LCB1X2hpZ2hwWzBdLnksIDAuMCxcbiAgICAgICAgdV9oaWdocFswXS56LCB1X2hpZ2hwWzBdLncsIDAuMCxcbiAgICAgICAgdV9oaWdocFsxXS54LCB1X2hpZ2hwWzFdLnksIDEuMFxuICAgICk7XG5cbiAgICB2ZWMyIHNpemUgICAgID0gdV9oaWdocFsxXS56dztcbiAgICB2ZWMyIHZpZXdwb3J0ID0gdmVjMih1X2hpZ2hwWzJdLngsIHVfaGlnaHBbMl0ueSk7XG5cbiAgICB2ZWMyIHBvc2l0aW9uID0gdmVjMihhX3ZlcnRleC54LCAxLjAgLSBhX3ZlcnRleC55KTtcbiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uICogc2l6ZTtcbiAgICBwb3NpdGlvbiA9IChtYXRyaXggKiB2ZWMzKHBvc2l0aW9uLCAxLjApKS54eTtcbiAgICBwb3NpdGlvbiAvPSB2aWV3cG9ydDtcblxuICAgIHBvc2l0aW9uID0gcG9zaXRpb24gKiAyLjAgLSAxLjA7XG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLngsIC1wb3NpdGlvbi55LCAwLjAsIDEuMCk7XG59IixycihlKSk7cmV0dXJuIGFyLnNldCh0LHIpLHJ9LF9yPShlLHQscik9Pntjb25zdCBpPWUuaGlnaHAsYT1uLiRtYXRyaXg7aVswXT1hWzBdLGlbMV09YVsxXSxpWzJdPWFbM10saVszXT1hWzRdLGlbNF09YVs2XSxpWzVdPWFbN10saVs2XT10LGlbN109cixpWzhdPVAsaVs5XT1TfTtsZXQgd3I9MDtjb25zdCBNcj1lPT57ZS51c2VQcm9ncmFtKCksZS5iaW5kVW5pZm9ybSgpLFR0KFJ0KSxyLmJpbmRCdWZmZXIoci5BUlJBWV9CVUZGRVIsQXQpLG5yLmJ1ZmZlci5sZW5ndGg+d3ImJih3cj1uci5idWZmZXIubGVuZ3RoLHIuYnVmZmVyRGF0YShyLkFSUkFZX0JVRkZFUiw0KndyLHIuU1RSRUFNX0RSQVcpKSxyLmJ1ZmZlclN1YkRhdGEoci5BUlJBWV9CVUZGRVIsMCxuci5idWZmZXIsMCxuci5vZmZzZXQpLHIuZHJhd0FycmF5c0luc3RhbmNlZChyLlRSSUFOR0xFUywwLDYsZS5jb3VudCl9LFByPSgpPT57NjAzIT09V3QmJihxdCg2MDMpLHIuYmxlbmRGdW5jKHIuWkVSTyxyLk9ORV9NSU5VU19TUkNfQUxQSEEpKX0sU3I9ZT0+e3N3aXRjaChlKXtjYXNlImFkZCI6NjExIT09V3QmJihxdCg2MTEpLHIuYmxlbmRGdW5jKHIuT05FLHIuT05FKSk7YnJlYWs7Y2FzZSJzY3JlZW4iOjY0MSE9PVd0JiYocXQoNjQxKSxyLmJsZW5kRnVuYyhyLk9ORV9NSU5VU19EU1RfQ09MT1Isci5PTkUpKTticmVhaztjYXNlImFscGhhIjo2MDYhPT1XdCYmKHF0KDYwNiksci5ibGVuZEZ1bmMoci5aRVJPLHIuU1JDX0FMUEhBKSk7YnJlYWs7Y2FzZSJlcmFzZSI6UHIoKTticmVhaztjYXNlImNvcHkiOmJyKCk7YnJlYWs7ZGVmYXVsdDpYdCgpfX0sRnI9ZT0+e3ZhciB0OyhlPT57QXQ9ZS5jcmVhdGVCdWZmZXIoKX0pKGUpLHQ9KCgpPT57Y29uc3QgZT1TdCgpO3JldHVybiBUdChlKSxyLmJpbmRCdWZmZXIoci5BUlJBWV9CVUZGRVIsZS52ZXJ0ZXhCdWZmZXIpLHIuYnVmZmVyRGF0YShyLkFSUkFZX0JVRkZFUixuZXcgRmxvYXQzMkFycmF5KFswLDAsMSwwLDEsMSwwLDAsMSwxLDAsMV0pLHIuU1RBVElDX0RSQVcpLHIuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoMCksci52ZXJ0ZXhBdHRyaWJQb2ludGVyKDAsMixyLkZMT0FULCExLDAsMCksci5iaW5kQnVmZmVyKHIuQVJSQVlfQlVGRkVSLEF0KSxyLmJ1ZmZlckRhdGEoci5BUlJBWV9CVUZGRVIsbnIuYnVmZmVyLmxlbmd0aCxyLlNUUkVBTV9EUkFXKSxyLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDEpLHIudmVydGV4QXR0cmliUG9pbnRlcigxLDQsci5GTE9BVCwhMSw4OCwwKSxyLnZlcnRleEF0dHJpYkRpdmlzb3IoMSwxKSxyLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDIpLHIudmVydGV4QXR0cmliUG9pbnRlcigyLDQsci5GTE9BVCwhMSw4OCwxNiksci52ZXJ0ZXhBdHRyaWJEaXZpc29yKDIsMSksci5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSgzKSxyLnZlcnRleEF0dHJpYlBvaW50ZXIoMywyLHIuRkxPQVQsITEsODgsMzIpLHIudmVydGV4QXR0cmliRGl2aXNvcigzLDEpLHIuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoNCksci52ZXJ0ZXhBdHRyaWJQb2ludGVyKDQsNCxyLkZMT0FULCExLDg4LDQwKSxyLnZlcnRleEF0dHJpYkRpdmlzb3IoNCwxKSxyLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDUpLHIudmVydGV4QXR0cmliUG9pbnRlcig1LDQsci5GTE9BVCwhMSw4OCw1Niksci52ZXJ0ZXhBdHRyaWJEaXZpc29yKDUsMSksci5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSg2KSxyLnZlcnRleEF0dHJpYlBvaW50ZXIoNiw0LHIuRkxPQVQsITEsODgsNzIpLHIudmVydGV4QXR0cmliRGl2aXNvcig2LDEpLGV9KSgpLFJ0PXR9LFRyPShlLHQsbixpPSExKT0+e2NvbnN0IGE9dmUoZSx0LGkpO3JldHVybiByLnRleFN1YkltYWdlMkQoci5URVhUVVJFXzJELDAsMCwwLGUsdCxyLlJHQkEsci5VTlNJR05FRF9CWVRFLG4pLGF9LEJyPShlLHQpPT57Y29uc3Qgbj0oKGUsdCxuLGk9ITEpPT57Y29uc3QgYT12ZShlLHQsaSk7cmV0dXJuIHIudGV4U3ViSW1hZ2UyRChyLlRFWFRVUkVfMkQsMCwwLDAsci5SR0JBLHIuVU5TSUdORURfQllURSxuKSxhfSkoZS53LGUuaCx0KSxpPWZyKCk7ZHIoaSxlLncsZS5oKSxYdCgpLGhyKGkpLEsobil9LE9yPVtdLEFyPW5ldyBNYXAsUnI9KGUsdCxyKT0+e2tlKGUsITApO2NvbnN0IG49TWF0aC5jZWlsKC41KnIpLGk9MS0obi0uNSpyKSxhPTErcixzPShlPT57Y29uc3QgdD1gYiR7ZX1gO2lmKEFyLmhhcyh0KSlyZXR1cm4gQXIuZ2V0KHQpO2NvbnN0IHI9bmV3IEx0KCIjdmVyc2lvbiAzMDAgZXNcblxubGF5b3V0IChsb2NhdGlvbiA9IDApIGluIHZlYzIgYV92ZXJ0ZXg7XG5cbm91dCB2ZWMyIHZfY29vcmQ7XG5cbnZvaWQgbWFpbigpIHtcbiAgICB2X2Nvb3JkID0gYV92ZXJ0ZXg7XG5cbiAgICB2ZWMyIHBvc2l0aW9uID0gYV92ZXJ0ZXggKiAyLjAgLSAxLjA7XG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLjAsIDEuMCk7XG59IiwoZT0+e2NvbnN0IHQ9ZS50b0ZpeGVkKDEpO3JldHVybmAjdmVyc2lvbiAzMDAgZXNcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXG51bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmU7XG51bmlmb3JtIHZlYzQgdV9tZWRpdW1wO1xuXG5pbiB2ZWMyIHZfY29vcmQ7XG5vdXQgdmVjNCBvX2NvbG9yO1xuXG52b2lkIG1haW4oKSB7XG4gICAgdmVjMiAgb2Zmc2V0ICAgPSB1X21lZGl1bXAueHk7XG4gICAgZmxvYXQgZnJhY3Rpb24gPSB1X21lZGl1bXAuejtcbiAgICBmbG9hdCBzYW1wbGVzICA9IHVfbWVkaXVtcC53O1xuICAgIFxuICAgIHZlYzQgY29sb3IgPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdl9jb29yZCk7XG5cbiAgICBmb3IgKGZsb2F0IGkgPSAxLjA7IGkgPCAke3R9OyBpICs9IDEuMCkge1xuICAgICAgICBjb2xvciArPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdl9jb29yZCArIG9mZnNldCAqIGkpO1xuICAgICAgICBjb2xvciArPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdl9jb29yZCAtIG9mZnNldCAqIGkpO1xuICAgIH1cbiAgICBjb2xvciArPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdl9jb29yZCArIG9mZnNldCAqICR7dH0pICogZnJhY3Rpb247XG4gICAgY29sb3IgKz0gdGV4dHVyZSh1X3RleHR1cmUsIHZfY29vcmQgLSBvZmZzZXQgKiAke3R9KSAqIGZyYWN0aW9uO1xuICAgIGNvbG9yIC89IHNhbXBsZXM7XG5cbiAgICBvX2NvbG9yID0gY29sb3I7XG59YH0pKGUpKTtyZXR1cm4gQXIuc2V0KHQscikscn0pKG4pOygoZSx0LHIsbixpLGEpPT57Y29uc3Qgcz1lLm1lZGl1bXA7bj8oc1swXT0xL3Qsc1sxXT0wKTooc1swXT0wLHNbMV09MS9yKSxzWzJdPWksc1szXT1hfSkocyxlLndpZHRoLGUuaGVpZ2h0LHQsaSxhKSxocihzKX0sQ3I9e3g6MCx5OjB9LEVyPShlLHQscik9PihlPj4xNikqKHI/dDoxKS8yNTUsVXI9KGUsdCxyKT0+KGU+PjgmMjU1KSoocj90OjEpLzI1NSwkcj0oZSx0LHIpPT4oMjU1JmUpKihyP3Q6MSkvMjU1LEdyPVsuNSwxLjA1LDEuNCwxLjU1LDEuNzUsMS45LDIsMi4xNSwyLjIsMi4zLDIuNSwzLDMsMy41LDMuNV0sa3I9KGUsdCxyPTQsaT00LGE9MSxzPSEwKT0+e2NvbnN0IG89bi5jdXJyZW50QXR0YWNobWVudE9iamVjdCxsPU1hdGguc3FydCh0WzBdKnRbMF0rdFsxXSp0WzFdKSxjPU1hdGguc3FydCh0WzJdKnRbMl0rdFszXSp0WzNdKSx1PXIqKGwvRiksZj1pKihjL0YpLGQ9R3JbYS0xXSxoPU1hdGgucm91bmQodSpkKSxwPU1hdGgucm91bmQoZipkKTtDci54Kz1oLENyLnkrPXA7Y29uc3QgbT1lLndpZHRoKzIqaCxnPWUuaGVpZ2h0KzIqcDtsZXQgYj0xLHg9MTt1PjEyOD9iPS4wNjI1OnU+NjQ/Yj0uMTI1OnU+MzI/Yj0uMjU6dT4xNiYmKGI9LjUpLGY+MTI4P3g9LjA2MjU6Zj42ND94PS4xMjU6Zj4zMj94PS4yNTpmPjE2JiYoeD0uNSk7Y29uc3Qgdj1NYXRoLmNlaWwobSpiKSx5PU1hdGguY2VpbChnKngpLF89eWUodix5LCExKSx3PVtfLHllKHYseSwhMSldO24uYmluZChfKSxuLnJlc2V0KCksbi5zZXRUcmFuc2Zvcm0oYiwwLDAseCxoKmIscCp4KSxrZShlKTtjb25zdCBNPXlyKCk7X3IoTSxlLndpZHRoLGUuaGVpZ2h0KSxocihNKSxzJiZLKGUpO2NvbnN0IFA9dSpiLFM9Zip4O2xldCBUPTAsQj1fLnRleHR1cmU7a2UoQiwhMCksYnIoKTtmb3IobGV0IGU9MDtlPGE7KytlKXtpZihyPjApe1Q9KFQrMSklMjtjb25zdCBlPXdbVF07bi5iaW5kKGUpLFJyKEIsITAsUCksQj1lLnRleHR1cmV9aWYoaT4wKXtUPShUKzEpJTI7Y29uc3QgZT13W1RdO24uYmluZChlKSxScihCLCExLFMpLEI9ZS50ZXh0dXJlfX1pZihYdCgpLDEhPT1ifHwxIT09eCl7Y29uc3QgZT15ZShtLGcsITEpO24uYmluZChlKSxuLnNldFRyYW5zZm9ybSgxL2IsMCwwLDEveCwwLDApLGtlKEIsITApLF9yKE0sQi53aWR0aCxCLmhlaWdodCksaHIoTSksQj1lLnRleHR1cmUsY2Uod1swXSksY2Uod1sxXSksY2UoZSwhMSl9ZWxzZSBUPShUKzEpJTIsY2Uod1tUXSksVD0oVCsxKSUyLGNlKHdbVF0sITEpO3JldHVybiBvJiZuLmJpbmQobyksQn0sTHI9KGUsdCk9Pntjb25zdCByPW4uY3VycmVudEF0dGFjaG1lbnRPYmplY3QsaT15ZShlLndpZHRoLGUuaGVpZ2h0LCExKTtuLmJpbmQoaSksbi5yZXNldCgpLG4uc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKSxrZShlKSxYdCgpO2NvbnN0IGE9KCgpPT57aWYoQXIuaGFzKCJtIikpcmV0dXJuIEFyLmdldCgibSIpO2NvbnN0IGU9bmV3IEx0KCIjdmVyc2lvbiAzMDAgZXNcblxubGF5b3V0IChsb2NhdGlvbiA9IDApIGluIHZlYzIgYV92ZXJ0ZXg7XG5cbm91dCB2ZWMyIHZfY29vcmQ7XG5cbnZvaWQgbWFpbigpIHtcbiAgICB2X2Nvb3JkID0gYV92ZXJ0ZXg7XG5cbiAgICB2ZWMyIHBvc2l0aW9uID0gYV92ZXJ0ZXggKiAyLjAgLSAxLjA7XG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLjAsIDEuMCk7XG59IiwiI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblxudW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlO1xudW5pZm9ybSB2ZWM0IHVfbWVkaXVtcFs1XTtcblxuaW4gdmVjMiB2X2Nvb3JkO1xub3V0IHZlYzQgb19jb2xvcjtcblxudm9pZCBtYWluKCkge1xuICAgIG1hdDQgbXVsID0gbWF0NCh1X21lZGl1bXBbMF0sIHVfbWVkaXVtcFsxXSwgdV9tZWRpdW1wWzJdLCB1X21lZGl1bXBbM10pO1xuICAgIHZlYzQgYWRkID0gdV9tZWRpdW1wWzRdO1xuICAgIFxuICAgIHZlYzQgY29sb3IgPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdl9jb29yZCk7XG5cbiAgICBjb2xvci5yZ2IgLz0gbWF4KDAuMDAwMSwgY29sb3IuYSk7XG4gICAgY29sb3IgPSBjbGFtcChjb2xvciAqIG11bCArIGFkZCwgMC4wLCAxLjApO1xuICAgIGNvbG9yLnJnYiAqPSBjb2xvci5hO1xuXG4gICAgb19jb2xvciA9IGNvbG9yO1xufSIpO3JldHVybiBBci5zZXQoIm0iLGUpLGV9KSgpOygoZSx0KT0+e2NvbnN0IHI9ZS5tZWRpdW1wO3JbMF09dFswXSxyWzFdPXRbMV0sclsyXT10WzJdLHJbM109dFszXSxyWzRdPXRbNV0scls1XT10WzZdLHJbNl09dFs3XSxyWzddPXRbOF0scls4XT10WzEwXSxyWzldPXRbMTFdLHJbMTBdPXRbMTJdLHJbMTFdPXRbMTNdLHJbMTJdPXRbMTVdLHJbMTNdPXRbMTZdLHJbMTRdPXRbMTddLHJbMTVdPXRbMThdLHJbMTZdPXRbNF0vMjU1LHJbMTddPXRbOV0vMjU1LHJbMThdPXRbMTRdLzI1NSxyWzE5XT10WzE5XS8yNTV9KShhLHQpLGhyKGEpO2NvbnN0IHM9aS50ZXh0dXJlO3JldHVybiBLKGUpLGNlKGksITEpLHImJm4uYmluZChyKSxzfSxJcj0oZSx0LHIsbixpLGEpPT57Y29uc3Qgcz1lPyJibHVyLmEgPSAxLjAgLSBibHVyLmE7IjoiIixvPXI/KGw9YSxgXG4gICAgZmxvYXQgc3RyZW5ndGggPSB1X21lZGl1bXBbJHtNYXRoLmZsb29yKGwvNCl9XVske2wlNH1dO1xuICAgIGJsdXIuYSA9IGNsYW1wKGJsdXIuYSAqIHN0cmVuZ3RoLCAwLjAsIDEuMCk7XG5gKToiIjt2YXIgbDtjb25zdCBjPW4/KGU9PmBcbiAgICBibHVyID0gdGV4dHVyZSh1X3RleHR1cmVzWyR7ZT8yOjF9XSwgdmVjMihibHVyLmEsIDAuNSkpO1xuYCkodCk6KGU9PmBcbiAgICB2ZWM0IGNvbG9yID0gdV9tZWRpdW1wWyR7ZX1dO1xuICAgIGJsdXIgPSBjb2xvciAqIGJsdXIuYTtcbmApKGkpO3JldHVybmBcbiAgICAke3N9XG4gICAgJHtvfVxuICAgICR7Y31cbmB9LFZyPShlLHQscixuLGksYSk9Pntjb25zdCBzPXQ/IlxuICAgIHZlYzIgcHEgPSAoMS4wIC0gdl9jb29yZCkgKiBibHVyX3NjYWxlIC0gYmx1cl9vZmZzZXQ7XG4gICAgdmVjNCBibHVyMiA9IG1peCh2ZWM0KDAuMCksIHRleHR1cmUodV90ZXh0dXJlc1swXSwgcHEpLCBpc0luc2lkZShwcSkpO1xuIjoiXG4gICAgdmVjNCBibHVyMiA9IHRleHR1cmUodV90ZXh0dXJlc1swXSwgMS4wIC0gdl9jb29yZCk7XG4iLG89cj8obD1hLGBcbiAgICBmbG9hdCBzdHJlbmd0aCA9IHVfbWVkaXVtcFske01hdGguZmxvb3IobC80KX1dWyR7bCU0fV07XG4gICAgaGlnaGxpZ2h0X2FscGhhICo9IHN0cmVuZ3RoO1xuICAgIHNoYWRvd19hbHBoYSAgICAqPSBzdHJlbmd0aDtcbmApOiIiO3ZhciBsO2NvbnN0IGM9bj8oZT0+YFxuICAgIGJsdXIgPSB0ZXh0dXJlKHVfdGV4dHVyZXNbJHtlPzI6MX1dLCB2ZWMyKFxuICAgICAgICAwLjUwMTk2MDc4NDMxMzcyNTUgLSAwLjUwMTk2MDc4NDMxMzcyNTUgKiBzaGFkb3dfYWxwaGEgKyAwLjQ5ODAzOTIxNTY4NjI3NDUgKiBoaWdobGlnaHRfYWxwaGEsXG4gICAgICAgIDAuNVxuICAgICkpO1xuYCkoZSk6KGU9PmBcbiAgICB2ZWM0IGhpZ2hsaWdodF9jb2xvciA9IHVfbWVkaXVtcFske2V9XTtcbiAgICB2ZWM0IHNoYWRvd19jb2xvciAgICA9IHVfbWVkaXVtcFske2UrMX1dO1xuICAgIGJsdXIgPSBoaWdobGlnaHRfY29sb3IgKiBoaWdobGlnaHRfYWxwaGEgKyBzaGFkb3dfY29sb3IgKiBzaGFkb3dfYWxwaGE7XG5gKShpKTtyZXR1cm5gXG4gICAgJHtzfVxuICAgIGZsb2F0IGhpZ2hsaWdodF9hbHBoYSA9IGJsdXIuYSAtIGJsdXIyLmE7XG4gICAgZmxvYXQgc2hhZG93X2FscGhhICAgID0gYmx1cjIuYSAtIGJsdXIuYTtcbiAgICAke299XG4gICAgaGlnaGxpZ2h0X2FscGhhID0gY2xhbXAoaGlnaGxpZ2h0X2FscGhhLCAwLjAsIDEuMCk7XG4gICAgc2hhZG93X2FscGhhICAgID0gY2xhbXAoc2hhZG93X2FscGhhLCAwLjAsIDEuMCk7XG4gICAgJHtjfVxuYH0senI9KGUsdCxyLG4saSxhLHMpPT57Y29uc3Qgbz1gZiR7ZT8ieSI6Im4ifSR7dD8ieSI6Im4ifSR7cj8ieSI6Im4ifSR7bn0ke2k/InkiOiJuIn0ke2E/InkiOiJuIn0ke3M/InkiOiJuIn1gO2lmKEFyLmhhcyhvKSlyZXR1cm4gQXIuZ2V0KG8pO2xldCBsPTE7ZSYmbCsrLHMmJmwrKztsZXQgYz0oZT80OjApKyh0PzQ6MCkrKGE/MTowKTtzfHwoYys9cj80OjgpLGM9TWF0aC5jZWlsKGMvNCk7Y29uc3QgdT1uZXcgTHQoIiN2ZXJzaW9uIDMwMCBlc1xuXG5sYXlvdXQgKGxvY2F0aW9uID0gMCkgaW4gdmVjMiBhX3ZlcnRleDtcblxub3V0IHZlYzIgdl9jb29yZDtcblxudm9pZCBtYWluKCkge1xuICAgIHZfY29vcmQgPSBhX3ZlcnRleDtcblxuICAgIHZlYzIgcG9zaXRpb24gPSBhX3ZlcnRleCAqIDIuMCAtIDEuMDtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuMCwgMS4wKTtcbn0iLCgoZSx0LHIsbixpLGEscyxvLGwpPT57bGV0IGM9MDtjb25zdCB1PXI/KGU9PmBcbiAgICB2ZWMyIGJhc2Vfc2NhbGUgID0gdV9tZWRpdW1wWyR7ZX1dLnh5O1xuICAgIHZlYzIgYmFzZV9vZmZzZXQgPSB1X21lZGl1bXBbJHtlfV0uenc7XG5cbiAgICB2ZWMyIHV2ID0gdl9jb29yZCAqIGJhc2Vfc2NhbGUgLSBiYXNlX29mZnNldDtcbiAgICB2ZWM0IGJhc2UgPSBtaXgodmVjNCgwLjApLCB0ZXh0dXJlKHVfdGV4dHVyZXNbMV0sIHV2KSwgaXNJbnNpZGUodXYpKTtcbmApKGMrKyk6IiIsZj1uPyhlPT5gXG4gICAgdmVjMiBibHVyX3NjYWxlICA9IHVfbWVkaXVtcFske2V9XS54eTtcbiAgICB2ZWMyIGJsdXJfb2Zmc2V0ID0gdV9tZWRpdW1wWyR7ZX1dLnp3O1xuXG4gICAgdmVjMiBzdCA9IHZfY29vcmQgKiBibHVyX3NjYWxlIC0gYmx1cl9vZmZzZXQ7XG4gICAgdmVjNCBibHVyID0gbWl4KHZlYzQoMC4wKSwgdGV4dHVyZSh1X3RleHR1cmVzWzBdLCBzdCksIGlzSW5zaWRlKHN0KSk7XG5gKShjKyspOiJcbiAgICB2ZWM0IGJsdXIgPSB0ZXh0dXJlKHVfdGV4dHVyZXNbMF0sIHZfY29vcmQpO1xuIixkPSJpbm5lciI9PT1hLGg9YztsZXQgcCxtLGc9NCpjO3N3aXRjaChsP3A9aT9JcighMSxyLG8sbCxoLGcpOlZyKHIsbixvLGwsaCxnKTppPyhnKz00LHA9SXIoZCxyLG8sbCxoLGcpKTooZys9OCxwPVZyKHIsbixvLGwsaCxnKSksYSl7Y2FzZSJvdXRlciI6bT1zPyJibHVyIC0gYmx1ciAqIGJhc2UuYSI6ImJhc2UgKyBibHVyIC0gYmx1ciAqIGJhc2UuYSI7YnJlYWs7Y2FzZSJmdWxsIjptPXM/ImJsdXIiOiJiYXNlIC0gYmFzZSAqIGJsdXIuYSArIGJsdXIiO2JyZWFrO2RlZmF1bHQ6bT0iYmx1ciJ9cmV0dXJuYCN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cbnVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4dHVyZXNbJHtlfV07XG51bmlmb3JtIHZlYzQgdV9tZWRpdW1wWyR7dH1dO1xuXG5pbiB2ZWMyIHZfY29vcmQ7XG5vdXQgdmVjNCBvX2NvbG9yO1xuXG5cbmZsb2F0IGlzSW5zaWRlKGluIHZlYzIgdXYpIHtcbiAgICByZXR1cm4gc3RlcCg0LjAsIGRvdChzdGVwKHZlYzQoMC4wLCB1di54LCAwLjAsIHV2LnkpLCB2ZWM0KHV2LngsIDEuMCwgdXYueSwgMS4wKSksIHZlYzQoMS4wKSkpO1xufVxuXG52b2lkIG1haW4oKSB7XG4gICAgJHt1fVxuICAgICR7Zn1cbiAgICAke3B9XG4gICAgb19jb2xvciA9ICR7bX07XG59YH0pKGwsYyxlLHQscixuLGksYSxzKSk7cmV0dXJuIEFyLnNldChvLHUpLHV9LGpyPW5ldyBNYXAsRHI9W10sTnI9KGUsdCk9Pntjb25zdCByPWBsJHsoIjAwIitlKS5zbGljZSgtMyl9JHt0PyJ5IjoibiJ9YCxuPShlPT57Y29uc3QgdD1qci5nZXQoZSk7aWYodCl7Y29uc3QgdD1Eci5pbmRleE9mKGUpOy0xIT09dCYmKERyLnNwbGljZSh0LDEpLERyLnB1c2goZSkpfXJldHVybiB0fSkocik7aWYobilyZXR1cm4gbjtjb25zdCBpPU1hdGguY2VpbCg1KmUvNCksYT1uZXcgTHQoIiN2ZXJzaW9uIDMwMCBlc1xuXG5sYXlvdXQgKGxvY2F0aW9uID0gMCkgaW4gdmVjMiBhX3ZlcnRleDtcblxub3V0IHZlYzIgdl9jb29yZDtcblxudm9pZCBtYWluKCkge1xuICAgIHZfY29vcmQgPSBhX3ZlcnRleDtcblxuICAgIHZlYzIgcG9zaXRpb24gPSBhX3ZlcnRleCAqIDIuMCAtIDEuMDtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuMCwgMS4wKTtcbn0iLCgoZSx0LHIpPT57bGV0IG49IiI7Zm9yKGxldCBlPTE7ZTx0OysrZSl7Y29uc3Qgcj1lLTEsaT1lLGE9YHVfbWVkaXVtcFske3QrTWF0aC5mbG9vcihyLzQpfV1bJHtyJTR9XWAscz1gdV9tZWRpdW1wWyR7dCtNYXRoLmZsb29yKGkvNCl9XVske2klNH1dYDtuKz1gXG4gICAgaWYgKHQgPD0gJHtzfSkge1xuICAgICAgICByZXR1cm4gbWl4KHVfbWVkaXVtcFske3J9XSwgdV9tZWRpdW1wWyR7aX1dLCAodCAtICR7YX0pIC8gKCR7c30gLSAke2F9KSk7XG4gICAgfVxuYH1yZXR1cm5gI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblxudW5pZm9ybSB2ZWM0IHVfbWVkaXVtcFske2V9XTtcblxuaW4gdmVjMiB2X2Nvb3JkO1xub3V0IHZlYzQgb19jb2xvcjtcblxudmVjNCBnZXRHcmFkaWVudENvbG9yKGluIGZsb2F0IHQpIHtcbiAgICBpZiAodCA8PSB1X21lZGl1bXBbJHt0fV1bMF0pIHtcbiAgICAgICAgcmV0dXJuIHVfbWVkaXVtcFswXTtcbiAgICB9XG4gICAgJHtufVxuICAgIHJldHVybiB1X21lZGl1bXBbJHt0LTF9XTtcbn1cblxudm9pZCBtYWluKCkge1xuICAgIHZlYzQgY29sb3IgPSBnZXRHcmFkaWVudENvbG9yKHZfY29vcmQueCk7XG4gICAgJHtyPyJjb2xvciA9IHBvdyhjb2xvciwgdmVjNCgwLjQ1NDU0NTQ1KSk7IjoiIn1cbiAgICBjb2xvci5yZ2IgKj0gY29sb3IuYTtcblxuICAgIG9fY29sb3IgPSBjb2xvcjtcbn1gfSkoaSxlLHQpKTtyZXR1cm4oKGUsdCk9Pntjb25zdCByPURyLmluZGV4T2YoZSk7Zm9yKC0xIT09ciYmRHIuc3BsaWNlKHIsMSk7anIuc2l6ZT49MTYmJkRyLmxlbmd0aD4wOyl7Y29uc3QgZT1Eci5zaGlmdCgpO2UmJmpyLmRlbGV0ZShlKX1qci5zZXQoZSx0KSxEci5wdXNoKGUpfSkocixhKSxhfSxXcj0oZSx0LHIsbixpLGEpPT57Y29uc3Qgcz1lLm1lZGl1bXA7bGV0IG89MDtmb3IobGV0IGU9aTtlPGE7ZSsrKXtjb25zdCB0PXJbZV07c1tvKytdPSh0Pj4xNikvMjU1LHNbbysrXT0odD4+OCYyNTUpLzI1NSxzW28rK109KDI1NSZ0KS8yNTUsc1tvKytdPW5bZV19Zm9yKGxldCBlPWk7ZTxhO2UrKylzW28rK109dFtlXS8yNTV9O2xldCBxcjtjb25zdCBYcj0oZSx0KT0+KHFyP090WzBdPT09ZSYmT3RbNF09PT10fHwoT3RbMF09ZSxPdFsyXT1lLE90WzRdPXQsT3RbNl09dCxyLmJ1ZmZlclN1YkRhdGEoci5BUlJBWV9CVUZGRVIsMCxPdCkpOnFyPSgoZSx0KT0+e2NvbnN0IG49U3QoKTtyZXR1cm4gVHQobiksci5iaW5kQnVmZmVyKHIuQVJSQVlfQlVGRkVSLG4udmVydGV4QnVmZmVyKSxPdFswXT1lLE90WzJdPWUsT3RbNF09dCxPdFs2XT10LHIuYnVmZmVyRGF0YShyLkFSUkFZX0JVRkZFUixPdCxyLlNUQVRJQ19EUkFXKSxyLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDApLHIudmVydGV4QXR0cmliUG9pbnRlcigwLDIsci5GTE9BVCwhMSwwLDApLG59KShlLHQpLHFyKSxZcj0oZSx0LG4pPT57ZS51c2VQcm9ncmFtKCksZS5iaW5kVW5pZm9ybSgpLFR0KFhyKHQsbikpLHIuZHJhd0FycmF5cyhyLlRSSUFOR0xFX1NUUklQLDAsNCl9LEtyPW5ldyBNYXAsSHI9ZT0+e2lmKCFLci5oYXMoZSkpe2NvbnN0IHQ9eWUoZSwxLCExKTtLci5zZXQoZSx0KX1yZXR1cm4gS3IuZ2V0KGUpfTtsZXQgUXI9MDtjb25zdCBacj0oKT0+UXIsSnI9bmV3IEZsb2F0MzJBcnJheSgyNTYpLGVuPW5ldyBGbG9hdDMyQXJyYXkoMjU2KTtmb3IobGV0IGU9MDtlPDI1NjsrK2Upe2NvbnN0IHQ9ZS8yNTU7SnJbZV09TWF0aC5wb3codCwyLjIzMzMzMzMzKSxlbltlXT10fWNvbnN0IHRuPShlLHQscik9Pntjb25zdCBpPW4uY3VycmVudEF0dGFjaG1lbnRPYmplY3QsYT1Icig1MTIpO24uYmluZChhKTtjb25zdCBzPWUubGVuZ3RoO2JyKCk7Y29uc3Qgbz1acigpO2ZvcihsZXQgbj0wO248cztuKz1vLTEpe2NvbnN0IGk9TWF0aC5taW4obitvLHMpLGE9TnIoaS1uLCExKTtXcihhLGUsdCxyLG4saSksWXIoYSxlW25dLzI1NSxlW2ktMV0vMjU1KX1yZXR1cm4gWHQoKSxpJiZuLmJpbmQoaSksYS50ZXh0dXJlfSxybj0oZSx0LGksYSxzLG8sbCxjLHUsZixkLGgscCxtLGcsYix4PW51bGwsdj1udWxsLHk9bnVsbCxfPTAsdz0wLE09MCxQPTAsUz0wLEY9MCxUPTAsQj0wKT0+e2NvbnN0IE89bi5jdXJyZW50QXR0YWNobWVudE9iamVjdCxBPXllKGksYSwhMSk7bi5iaW5kKEEpO2NvbnN0IFI9ImlubmVyIj09PW0sQz1udWxsIT09eCYmbnVsbCE9PXYmJm51bGwhPT15O2xldCBFPW51bGw7aWYoQyYmKEU9dG4oeCx2LHkpKSxSKXtuLnJlc2V0KCksbi5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLGtlKGUsITApO2NvbnN0IGk9ZnIoKTtkcihpLGUud2lkdGgsZS5oZWlnaHQpLGhyKGkpLEMmJkU/KChlLHQsbj0hMSk9PntHZSgyLHIuVEVYVFVSRTIsdCxuKSxHZSgxLHIuVEVYVFVSRTEsbnVsbCksR2UoMCxyLlRFWFRVUkUwLGUsbil9KSh0LEUsITApOmtlKHQsITApfWVsc2UgQyYmRT8oKGUsdCxuLGk9ITEpPT57R2UoMixyLlRFWFRVUkUyLG4saSksR2UoMSxyLlRFWFRVUkUxLHQsaSksR2UoMCxyLlRFWFRVUkUwLGUsaSl9KSh0LGUsRSwhMCk6dXIodCxlLCEwKTtjb25zdCBVPSEoUnx8ImZ1bGwiPT09bSYmZyksJD0hKGk9PT11JiZhPT09ZiYmMD09PWQmJjA9PT1oKSxHPSEoMT09PWIpO1I/Zz82NzAhPT1XdCYmKHF0KDY3MCksci5ibGVuZEZ1bmMoci5EU1RfQUxQSEEsci5aRVJPKSk6NjczIT09V3QmJihxdCg2NzMpLHIuYmxlbmRGdW5jKHIuRFNUX0FMUEhBLHIuT05FX01JTlVTX1NSQ19BTFBIQSkpOmJyKCk7Y29uc3Qgaz16cihVLCQscCxtLGcsRyxDKTsoKGUsdCxyLG4saSxhLHMsbyxsLGMsdSxmLGQsaCxwLG0sZyxiLHgsdix5LF8sdyxNLFApPT57bGV0IFM7Xz8oUz1lLnRleHR1cmVzLFNbMF09MCxTWzFdPTEsUCYmKFNbMl09MikpOlAmJihTPWUudGV4dHVyZXMsU1swXT0wLFNbMV09Mik7Y29uc3QgRj1lLm1lZGl1bXA7bGV0IFQ9MDtfJiYoRltUKytdPXQvbixGW1QrK109ci9pLEZbVCsrXT1hL24sRltUKytdPShyLWktcykvaSksdyYmKEZbVCsrXT10L28sRltUKytdPXIvbCxGW1QrK109Yy9vLEZbVCsrXT0oci1sLXUpL2wpLFB8fChmPyhGW1QrK109aCxGW1QrK109cCxGW1QrK109bSxGW1QrK109Zyk6KEZbVCsrXT1oLEZbVCsrXT1wLEZbVCsrXT1tLEZbVCsrXT1nLEZbVCsrXT1iLEZbVCsrXT14LEZbVCsrXT12LEZbVCsrXT15KSksTSYmKEZbVF09ZCl9KShrLGksYSxzLG8sbCxjLHUsZixkLGgscCxiLF8sdyxNLFAsUyxGLFQsQixVLCQsRyxDKSxocihrKTtjb25zdCBMPUEudGV4dHVyZTtyZXR1cm4gY2UoQSwhMSksWHQoKSxPJiZuLmJpbmQoTyksTH0sbm49KGUsdCxyPTAsaT0xLGE9NCxzPTQsbz0xLGw9MSxjPSExLHU9ITEpPT57Y29uc3QgZj1uLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0LGQ9ZS53aWR0aCxoPWUuaGVpZ2h0LHA9Q3IueCxtPUNyLnksZz1rcihlLHQsYSxzLGwsITEpLGI9Zy53aWR0aCx4PWcuaGVpZ2h0LHY9Q3IueC1wLHk9Q3IueS1tLF89cm4oZSxnLGM/ZDpiLGM/aDp4LGQsaCxjPzA6dixjPzA6eSxiLHgsYz8tdjowLGM/LXk6MCwhMCxjPyJpbm5lciI6Im91dGVyIix1LG8sbnVsbCxudWxsLG51bGwsRXIocixpLCEwKSxVcihyLGksITApLCRyKHIsaSwhMCksaSwwLDAsMCwwKTtyZXR1cm4gSyhlKSxLKGcpLGYmJm4uYmluZChmKSxffSxhbj1NYXRoLlBJLzE4MCxzbj0oZSx0LHI9NCxpPTQ1LGE9MCxzPTEsbz00LGw9NCxjPTEsdT0xLGY9ITEsZD0hMSxoPSExKT0+e2NvbnN0IHA9bi5jdXJyZW50QXR0YWNobWVudE9iamVjdCxtPWUud2lkdGgsZz1lLmhlaWdodCxiPUNyLngseD1Dci55LHY9a3IoZSx0LG8sbCx1LCExKSx5PXYud2lkdGgsXz12LmhlaWdodCx3PUNyLngsTT1Dci55LFA9dy1iLFM9TS14LFQ9TWF0aC5zcXJ0KHRbMF0qdFswXSt0WzFdKnRbMV0pLEI9TWF0aC5zcXJ0KHRbMl0qdFsyXSt0WzNdKnRbM10pLE89RixBPWkqYW4sUj1NYXRoLmNvcyhBKSpyKihUL08pLEM9TWF0aC5zaW4oQSkqciooQi9PKSxFPWY/bTp5K01hdGgubWF4KDAsTWF0aC5hYnMoUiktUCksVT1mP2c6XytNYXRoLm1heCgwLE1hdGguYWJzKEMpLVMpLCQ9TWF0aC5jZWlsKEUpLEc9TWF0aC5jZWlsKFUpLGs9KCQtRSkvMixMPShHLVUpLzIsST1mPzA6TWF0aC5tYXgoMCxQLVIpK2ssVj1mPzA6TWF0aC5tYXgoMCxTLUMpK0wsej1mP1ItdzooUj4wP01hdGgubWF4KDAsUi1QKTowKStrLGo9Zj9DLU06KEM+MD9NYXRoLm1heCgwLEMtUyk6MCkrTDtsZXQgRCxOPSIiO2Y/KE49ImlubmVyIixEPWR8fGgpOiFkJiZoPyhOPSJmdWxsIixEPSEwKTooTj0ib3V0ZXIiLEQ9ZCk7Y29uc3QgVz1ybihlLHYsJCxHLG0sZyxJLFYseSxfLHosaiwhMCxOLEQsYyxudWxsLG51bGwsbnVsbCxFcihhLHMsITApLFVyKGEscywhMCksJHIoYSxzLCEwKSxzLDAsMCwwLDApO3JldHVybiBLKGUpLEsodikscCYmbi5iaW5kKHApLFd9LG9uPU1hdGguUEkvMTgwLGxuPShlLHQscj00LGk9NDUsYT0xNjc3NzIxNSxzPTEsbz0wLGw9MSxjPTQsdT00LGY9MSxkPTEsaD0wLHA9ITEpPT57Y29uc3QgbT1lLndpZHRoLGc9ZS5oZWlnaHQsYj1Dci54LHg9Q3IueSx2PU1hdGguc3FydCh0WzBdKnRbMF0rdFsxXSp0WzFdKSx5PU1hdGguc3FydCh0WzJdKnRbMl0rdFszXSp0WzNdKSxfPUYsdz1pKm9uLE09TWF0aC5jb3Modykqcioodi9fKSxQPU1hdGguc2luKHcpKnIqKHkvXyksUz1uLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0LFQ9eWUobSxnLCExKTtuLmJpbmQoVCksbi5yZXNldCgpLG4uc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKSxrZShlKTtjb25zdCBCPWZyKCk7ZHIoQixlLndpZHRoLGUuaGVpZ2h0KSxocihCKSxuLnNldFRyYW5zZm9ybSgxLDAsMCwxLDIqTSwyKlApLFByKCksZHIoQixlLndpZHRoLGUuaGVpZ2h0KSxocihCKSxYdCgpO2NvbnN0IE89VC50ZXh0dXJlO1MmJm4uYmluZChTKTtjb25zdCBBPWtyKE8sdCxjLHUsZCwhMSk7Y2UoVCk7Y29uc3QgUj1BLndpZHRoLEM9QS5oZWlnaHQsRT1NYXRoLmNlaWwoUisyKk1hdGguYWJzKE0pKSxVPU1hdGguY2VpbChDKzIqTWF0aC5hYnMoUCkpO2xldCAkPSIiO3N3aXRjaChoKXtjYXNlIDA6JD0iZnVsbCI7YnJlYWs7Y2FzZSAxOiQ9ImlubmVyIjticmVhaztjYXNlIDI6JD0ib3V0ZXIifWNvbnN0IEc9ImlubmVyIj09PSQsaz1HP206RSxMPUc/ZzpVLEk9TWF0aC5hYnMoTSksVj1NYXRoLmFicyhQKSx6PShSLW0pLzIsaj0oQy1nKS8yLEQ9Rz8wOkkreixOPUc/MDpWK2osVz1ybihlLEEsayxMLG0sZyxELE4sUixDLEc/LXotTTpJLU0sRz8tai1QOlYtUCwhMSwkLHAsZixudWxsLG51bGwsbnVsbCxFcihhLHMsITApLFVyKGEscywhMCksJHIoYSxzLCEwKSxzLEVyKG8sbCwhMCksVXIobyxsLCEwKSwkcihvLGwsITApLGwpO3JldHVybiBDci54PWIrRCxDci55PXgrTixLKGUpLEsoQSksV30sY249TWF0aC5QSS8xODAsdW49KGUsdCxyPTQsaT00NSxhLHMsbyxsPTQsYz00LHU9MSxmPTEsZD0wLGg9ITEpPT57Y29uc3QgcD1lLndpZHRoLG09ZS5oZWlnaHQsZz1Dci54LGI9Q3IueSx4PU1hdGguc3FydCh0WzBdKnRbMF0rdFsxXSp0WzFdKSx2PU1hdGguc3FydCh0WzJdKnRbMl0rdFszXSp0WzNdKSx5PUYsXz1pKmNuLHc9TWF0aC5jb3MoXykqciooeC95KSxNPU1hdGguc2luKF8pKnIqKHYveSksUD1uLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0LFM9eWUocCxtLCExKTtuLmJpbmQoUyksbi5yZXNldCgpLG4uc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKSxrZShlKTtjb25zdCBUPWZyKCk7ZHIoVCxlLndpZHRoLGUuaGVpZ2h0KSxocihUKSxuLnNldFRyYW5zZm9ybSgxLDAsMCwxLDIqdywyKk0pLFByKCksZHIoVCxlLndpZHRoLGUuaGVpZ2h0KSxocihUKSxYdCgpO2NvbnN0IEI9Uy50ZXh0dXJlO1AmJm4uYmluZChQKTtjb25zdCBPPWtyKEIsdCxsLGMsZiwhMSk7Y2UoUyk7Y29uc3QgQT1PLndpZHRoLFI9Ty5oZWlnaHQsQz1NYXRoLmNlaWwoQSsyKk1hdGguYWJzKHcpKSxFPU1hdGguY2VpbChSKzIqTWF0aC5hYnMoTSkpO2xldCBVPSIiO3N3aXRjaChkKXtjYXNlIDA6VT0iZnVsbCI7YnJlYWs7Y2FzZSAxOlU9ImlubmVyIjticmVhaztjYXNlIDI6VT0ib3V0ZXIifWNvbnN0ICQ9ImlubmVyIj09PVUsRz0kP3A6QyxrPSQ/bTpFLEw9TWF0aC5hYnModyksST1NYXRoLmFicyhNKSxWPShBLXApLzIsej0oUi1tKS8yLGo9JD8wOkwrVixEPSQ/MDpJK3osTj1ybihlLE8sRyxrLHAsbSxqLEQsQSxSLCQ/LVYtdzpMLXcsJD8tei1NOkktTSwhMSxVLGgsdSxvLGEscywwLDAsMCwwLDAsMCwwLDApO3JldHVybiBDci54PWcraixDci55PWIrRCxLKGUpLEsoTyksTn0sZm49TWF0aC5QSS8xODAsZG49KGUsdCxyPTQsbj00NSxpLGEscyxvPTQsbD00LGM9MSx1PTEsZj0wLGQ9ITEpPT57Y29uc3QgaD1lLndpZHRoLHA9ZS5oZWlnaHQsbT1Dci54LGc9Q3IueSxiPWtyKGUsdCxvLGwsdSwhMSkseD1iLndpZHRoLHY9Yi5oZWlnaHQseT1Dci54LF89Q3IueSx3PXktbSxNPV8tZyxQPU1hdGguc3FydCh0WzBdKnRbMF0rdFsxXSp0WzFdKSxTPU1hdGguc3FydCh0WzJdKnRbMl0rdFszXSp0WzNdKSxUPUYsQj1uKmZuLE89TWF0aC5jb3MoQikqciooUC9UKSxBPU1hdGguc2luKEIpKnIqKFMvVCksUj0xPT09ZixDPVI/aDp4K01hdGgubWF4KDAsTWF0aC5hYnMoTyktdyksRT1SP3A6ditNYXRoLm1heCgwLE1hdGguYWJzKEEpLU0pLFU9TWF0aC5jZWlsKEMpLCQ9TWF0aC5jZWlsKEUpLEc9KFUtQykvMixrPSgkLUUpLzIsTD1SPzA6TWF0aC5tYXgoMCx3LU8pK0csST1SPzA6TWF0aC5tYXgoMCxNLUEpK2ssVj1SP08teTooTz4wP01hdGgubWF4KDAsTy13KTowKStHLHo9Uj9BLV86KEE+MD9NYXRoLm1heCgwLEEtTSk6MCkraztsZXQgaj0iIjtzd2l0Y2goZil7Y2FzZSAwOmo9ImZ1bGwiO2JyZWFrO2Nhc2UgMTpqPSJpbm5lciI7YnJlYWs7Y2FzZSAyOmo9Im91dGVyIn1jb25zdCBEPXJuKGUsYixVLCQsaCxwLEwsSSx4LHYsVix6LCEwLGosZCxjLHMsaSxhLDAsMCwwLDAsMCwwLDAsMCk7cmV0dXJuIENyLng9bStMLENyLnk9ZytJLEsoZSksSyhiKSxEfSxobj0oZSx0LHIsbik9Pntjb25zdCBpPWBjJHsoIjAiK2UpLnNsaWNlKC0yKX0keygiMCIrdCkuc2xpY2UoLTIpfSR7cj8ieSI6Im4ifSR7bj8ieSI6Im4ifWA7aWYoQXIuaGFzKGkpKXJldHVybiBBci5nZXQoaSk7Y29uc3QgYT0obj8xOjIpK01hdGguY2VpbChlKnQvNCkscz1uZXcgTHQoIiN2ZXJzaW9uIDMwMCBlc1xuXG5sYXlvdXQgKGxvY2F0aW9uID0gMCkgaW4gdmVjMiBhX3ZlcnRleDtcblxub3V0IHZlYzIgdl9jb29yZDtcblxudm9pZCBtYWluKCkge1xuICAgIHZfY29vcmQgPSBhX3ZlcnRleDtcblxuICAgIHZlYzIgcG9zaXRpb24gPSBhX3ZlcnRleCAqIDIuMCAtIDEuMDtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuMCwgMS4wKTtcbn0iLCgoZSx0LHIsbixpKT0+e2NvbnN0IGE9TWF0aC5mbG9vciguNSp0KSxzPU1hdGguZmxvb3IoLjUqciksbz10KnI7bGV0IGw9IiI7Y29uc3QgYz1pPzE6Mjtmb3IobGV0IGU9MDtlPG87KytlKWwrPWBcbiAgICByZXN1bHQgKz0gZ2V0V2VpZ2h0ZWRDb2xvcigke2V9LCB1X21lZGl1bXBbJHtjK01hdGguZmxvb3IoZS80KX1dWyR7ZSU0fV0pO1xuYDtyZXR1cm5gI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblxudW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlO1xudW5pZm9ybSB2ZWM0IHVfbWVkaXVtcFske2V9XTtcblxuaW4gdmVjMiB2X2Nvb3JkO1xub3V0IHZlYzQgb19jb2xvcjtcblxuXG5mbG9hdCBpc0luc2lkZShpbiB2ZWMyIHV2KSB7XG4gICAgcmV0dXJuIHN0ZXAoNC4wLCBkb3Qoc3RlcCh2ZWM0KDAuMCwgdXYueCwgMC4wLCB1di55KSwgdmVjNCh1di54LCAxLjAsIHV2LnksIDEuMCkpLCB2ZWM0KDEuMCkpKTtcbn1cblxudmVjNCBnZXRXZWlnaHRlZENvbG9yIChpbiBpbnQgaSwgaW4gZmxvYXQgd2VpZ2h0KSB7XG4gICAgdmVjMiByY3Bfc2l6ZSA9IHVfbWVkaXVtcFswXS54eTtcblxuICAgIGludCBpX2Rpdl94ID0gaSAvICR7dH07XG4gICAgaW50IGlfbW9kX3ggPSBpIC0gJHt0fSAqIGlfZGl2X3g7XG4gICAgdmVjMiBvZmZzZXQgPSB2ZWMyKGlfbW9kX3ggLSAke2F9LCAke3N9IC0gaV9kaXZfeCk7XG4gICAgdmVjMiB1diA9IHZfY29vcmQgKyBvZmZzZXQgKiByY3Bfc2l6ZTtcblxuICAgIHZlYzQgY29sb3IgPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdXYpO1xuICAgIGNvbG9yLnJnYiAvPSBtYXgoMC4wMDAxLCBjb2xvci5hKTtcbiAgICAke2k/IiI6IlxuICAgIHZlYzQgc3Vic3RpdHV0ZV9jb2xvciA9IHVfbWVkaXVtcFsxXTtcbiAgICBjb2xvciA9IG1peChzdWJzdGl0dXRlX2NvbG9yLCBjb2xvciwgaXNJbnNpZGUodXYpKTtcbiJ9XG5cbiAgICByZXR1cm4gY29sb3IgKiB3ZWlnaHQ7XG59XG5cbnZvaWQgbWFpbigpIHtcbiAgICBmbG9hdCByY3BfZGl2aXNvciA9IHVfbWVkaXVtcFswXS56O1xuICAgIGZsb2F0IGJpYXMgICAgICAgID0gdV9tZWRpdW1wWzBdLnc7XG5cbiAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoMC4wKTtcbiAgICAke2x9XG4gICAgcmVzdWx0ID0gY2xhbXAocmVzdWx0ICogcmNwX2Rpdmlzb3IgKyBiaWFzLCAwLjAsIDEuMCk7XG4gICAgJHtuPyJyZXN1bHQuYSA9IHRleHR1cmUodV90ZXh0dXJlLCB2X2Nvb3JkKS5hOyI6IiJ9XG5cbiAgICByZXN1bHQucmdiICo9IHJlc3VsdC5hO1xuICAgIG9fY29sb3IgPSByZXN1bHQ7XG59YH0pKGEsZSx0LHIsbikpO3JldHVybiBBci5zZXQoaSxzKSxzfSxwbj0oZSx0PTAscj0wLGksYT0xLHM9MCxvPSEwLGw9ITAsYz0wLHU9MCk9Pntjb25zdCBmPW4uY3VycmVudEF0dGFjaG1lbnRPYmplY3QsZD1lLndpZHRoLGg9ZS5oZWlnaHQscD15ZShkLGgsITEpO24uYmluZChwKSxuLnJlc2V0KCksbi5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLGtlKGUsITApLFh0KCk7Y29uc3QgbT1obih0LHIsbyxsKTsoKGUsdCxyLG4saSxhLHMsbyxsLGMsdSk9Pntjb25zdCBmPWUubWVkaXVtcDtmWzBdPTEvdCxmWzFdPTEvcixmWzJdPTEvaSxmWzNdPWEvMjU1O2xldCBkPTQ7c3x8KGZbZCsrXT1vLGZbZCsrXT1sLGZbZCsrXT1jLGZbZCsrXT11KTtjb25zdCBoPW4ubGVuZ3RoO2ZvcihsZXQgZT0wO2U8aDtlKyspZltkKytdPW5bZV19KShtLGQsaCxpLGEscyxsLEVyKGMsdSwhMSksVXIoYyx1LCExKSwkcihjLHUsITEpLHUpLGhyKG0pO2NvbnN0IGc9cC50ZXh0dXJlO3JldHVybiBLKGUpLGNlKHAsITEpLGYmJm4uYmluZChmKSxnfSxtbj0oZSx0LHI9MCxpPTAsYT0wLHM9MCxvPTAsbD0wLGM9MCx1PTAsZj0yLGQ9MCxoPTApPT57Y29uc3QgcD1uLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0LG09ZS53aWR0aCxnPWUuaGVpZ2h0LGI9eWUobSxnLCExKTtuLmJpbmQoYik7Y29uc3QgeD1UcihyLGksdCk7dXIoZSx4KTtjb25zdCB2PSgoZSx0LHIpPT57Y29uc3Qgbj1gZCR7ZX0ke3R9JHtyfWA7aWYoQXIuaGFzKG4pKXJldHVybiBBci5nZXQobik7Y29uc3QgaT1uZXcgTHQoIiN2ZXJzaW9uIDMwMCBlc1xuXG5sYXlvdXQgKGxvY2F0aW9uID0gMCkgaW4gdmVjMiBhX3ZlcnRleDtcblxub3V0IHZlYzIgdl9jb29yZDtcblxudm9pZCBtYWluKCkge1xuICAgIHZfY29vcmQgPSBhX3ZlcnRleDtcblxuICAgIHZlYzIgcG9zaXRpb24gPSBhX3ZlcnRleCAqIDIuMCAtIDEuMDtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuMCwgMS4wKTtcbn0iLCgoZSx0LHIsbik9PntsZXQgaSxhLHM7c3dpdGNoKHQpe2Nhc2UgMTppPSJtYXBfY29sb3IuciI7YnJlYWs7Y2FzZSAyOmk9Im1hcF9jb2xvci5nIjticmVhaztjYXNlIDQ6aT0ibWFwX2NvbG9yLmIiO2JyZWFrO2Nhc2UgODppPSJtYXBfY29sb3IuYSI7YnJlYWs7ZGVmYXVsdDppPSIwLjUifXN3aXRjaChyKXtjYXNlIDE6YT0ibWFwX2NvbG9yLnIiO2JyZWFrO2Nhc2UgMjphPSJtYXBfY29sb3IuZyI7YnJlYWs7Y2FzZSA0OmE9Im1hcF9jb2xvci5iIjticmVhaztjYXNlIDg6YT0ibWFwX2NvbG9yLmEiO2JyZWFrO2RlZmF1bHQ6YT0iMC41In1zd2l0Y2gobil7Y2FzZSAwOnM9IlxuICAgIHZlYzQgc291cmNlX2NvbG9yID0gdGV4dHVyZSh1X3RleHR1cmVzWzBdLCB1dik7XG4iO2JyZWFrO2Nhc2UgMzpzPSJcbiAgICB2ZWM0IHNvdXJjZV9jb2xvciA9dGV4dHVyZSh1X3RleHR1cmVzWzBdLCBtaXgodl9jb29yZCwgdXYsIHN0ZXAoYWJzKHV2IC0gdmVjMigwLjUpKSwgdmVjMigwLjUpKSkpO1xuIjticmVhaztjYXNlIDE6cz0iXG4gICAgdmVjNCBzdWJzdGl0dXRlX2NvbG9yID0gdV9tZWRpdW1wWzJdO1xuICAgIHZlYzQgc291cmNlX2NvbG9yID0gbWl4KHN1YnN0aXR1dGVfY29sb3IsIHRleHR1cmUodV90ZXh0dXJlc1swXSwgdXYpLCBpc0luc2lkZSh1dikpO1xuIjticmVhaztkZWZhdWx0OnM9IlxuICAgIHZlYzQgc291cmNlX2NvbG9yID0gdGV4dHVyZSh1X3RleHR1cmVzWzBdLCBmcmFjdCh1dikpO1xuIn1yZXR1cm5gI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblxudW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlc1syXTtcbnVuaWZvcm0gdmVjNCB1X21lZGl1bXBbJHtlfV07XG5cbmluIHZlYzIgdl9jb29yZDtcbm91dCB2ZWM0IG9fY29sb3I7XG5cblxuZmxvYXQgaXNJbnNpZGUoaW4gdmVjMiB1dikge1xuICAgIHJldHVybiBzdGVwKDQuMCwgZG90KHN0ZXAodmVjNCgwLjAsIHV2LngsIDAuMCwgdXYueSksIHZlYzQodXYueCwgMS4wLCB1di55LCAxLjApKSwgdmVjNCgxLjApKSk7XG59XG5cbnZvaWQgbWFpbigpIHtcbiAgICB2ZWMyIHV2X3RvX3N0X3NjYWxlICA9IHVfbWVkaXVtcFswXS54eTtcbiAgICB2ZWMyIHV2X3RvX3N0X29mZnNldCA9IHVfbWVkaXVtcFswXS56dztcbiAgICB2ZWMyIHNjYWxlICAgICAgICAgICA9IHVfbWVkaXVtcFsxXS54eTtcblxuICAgIHZlYzIgc3QgPSB2X2Nvb3JkICogdXZfdG9fc3Rfc2NhbGUgLSB1dl90b19zdF9vZmZzZXQ7XG4gICAgdmVjNCBtYXBfY29sb3IgPSB0ZXh0dXJlKHVfdGV4dHVyZXNbMV0sIHN0KTtcblxuICAgIHZlYzIgb2Zmc2V0ID0gdmVjMigke2l9LCAke2F9KSAtIDAuNTtcbiAgICB2ZWMyIHV2ID0gdl9jb29yZCArIG9mZnNldCAqIHNjYWxlO1xuICAgICR7c31cblxuICAgIG9fY29sb3IgPSBtaXgodGV4dHVyZSh1X3RleHR1cmVzWzBdLCB2X2Nvb3JkKSwgc291cmNlX2NvbG9yLCBpc0luc2lkZShzdCkpO1xufWB9KSgxPT09cj8zOjIsZSx0LHIpKTtyZXR1cm4gQXIuc2V0KG4saSksaX0pKG8sbCxmKTsoKGUsdCxyLG4saSxhLHMsbyxsLGMsdSxmLGQsaCk9Pntjb25zdCBwPWUudGV4dHVyZXM7cFswXT0wLHBbMV09MTtjb25zdCBtPWUubWVkaXVtcDttWzBdPW4vdCxtWzFdPWkvcixtWzJdPWEvdCxtWzNdPShpLXItcykvcixtWzRdPW8vbixtWzVdPS1sL2ksMT09PWMmJihtWzhdPXUsbVs5XT1mLG1bMTBdPWQsbVsxMV09aCl9KSh2LHIsaSxyLGksYSxzLGMsdSxmLEVyKGQsaCwhMCksVXIoZCxoLCEwKSwkcihkLGgsITApLGgpLFh0KCksaHIodik7Y29uc3QgeT1iLnRleHR1cmU7cmV0dXJuIHAmJm4uYmluZChwKSxLKGUpLEsoeCksY2UoYiwhMSkseX0sZ249KGUsdCxyLGkpPT57Y29uc3QgYT1uLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0LHM9ZS53aWR0aCxvPWUuaGVpZ2h0O3N3aXRjaChuLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbil7Y2FzZSJub3JtYWwiOmNhc2UibGF5ZXIiOmNhc2UiYWRkIjpjYXNlInNjcmVlbiI6Y2FzZSJhbHBoYSI6Y2FzZSJlcmFzZSI6Y2FzZSJjb3B5Ijp7bi5iaW5kKG4uJG1haW5BdHRhY2htZW50T2JqZWN0KSxuLnNldFRyYW5zZm9ybSgxLDAsMCwxLHIsaSk7Y29uc3QgYT15cighMCk7KChlLHQscixpKT0+e2NvbnN0IGE9ZS5oaWdocCxzPW4uJG1hdHJpeDthWzBdPXNbMF0sYVsxXT1zWzFdLGFbMl09c1szXSxhWzNdPXNbNF0sYVs0XT1zWzZdLGFbNV09c1s3XSxhWzZdPXIsYVs3XT1pLGFbOF09UCxhWzldPVM7Y29uc3Qgbz1lLm1lZGl1bXA7b1swXT10WzBdLG9bMV09dFsxXSxvWzJdPXRbMl0sb1szXT10WzNdLG9bNF09dFs0XSxvWzVdPXRbNV0sb1s2XT10WzZdLG9bN109dFs3XX0pKGEsdCxzLG8pLGtlKGUpLFNyKG4uZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uKSxocihhKX1icmVhaztkZWZhdWx0Ontjb25zdCBhPWdyKHIsaSxzLG8pLGw9eWUocyxvLCExKTtuLmJpbmQobCksdXIoYSxlKTtjb25zdCBjPW9yKG4uZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uKTt2cihjLHRbMF0sdFsxXSx0WzJdLHRbM10sdFs0XSx0WzVdLHRbNl0sdFs3XSksaHIoYyksbi5iaW5kKG4uJG1haW5BdHRhY2htZW50T2JqZWN0KSxuLnJlc2V0KCksbi5zZXRUcmFuc2Zvcm0oMSwwLDAsMSxyLGkpLHhyKGwudGV4dHVyZSksSyhhKSxjZShsKX19YSYmbi5iaW5kKGEpLFh0KCl9LGJuPVtdLHhuPWU9PntlLnNpemUmJmUuY2xlYXIoKSxibi5wdXNoKGUpfSx2bj0oZSx0LHIsbixpPW51bGwpPT57dC5oYXMocil8fHQuc2V0KHIsYm4ucG9wKCl8fG5ldyBNYXApO2NvbnN0IGE9dC5nZXQocik7aWYobnVsbD09PWkpe2lmKCFhLmhhcyhuKSlyZXR1cm47cmV0dXJuIGUuZGVzdHJveShhLmdldChuKSksYS5kZWxldGUobiksdm9pZChhLnNpemV8fCh0LmRlbGV0ZShyKSx4bihhKSkpfWEuc2V0KG4saSl9O2NvbnN0IHluPW5ldyBjbGFzc3tjb25zdHJ1Y3Rvcigpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJfJHBvb2wiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiXyRzdG9yZSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJfJHRyYXNoIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiR0aW1lcklkIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRyZW1vdmVDYWNoZSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkcmVtb3ZlSWRzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksdGhpcy5fJHBvb2w9W10sdGhpcy5fJHN0b3JlPW5ldyBNYXAsdGhpcy5fJHRyYXNoPW5ldyBNYXAsdGhpcy4kdGltZXJJZD1udWxsLHRoaXMuJHJlbW92ZUlkcz1bXSx0aGlzLiRyZW1vdmVDYWNoZT0hMX1yZXNldCgpeygoZSx0LHIpPT57ci5jbGVhcigpLG51bGwhPT1lLiR0aW1lcklkJiZjbGVhclRpbWVvdXQoZS4kdGltZXJJZCk7Zm9yKGNvbnN0IHIgb2YgdC52YWx1ZXMoKSl7Zm9yKGNvbnN0IHQgb2Ygci52YWx1ZXMoKSl0JiZlLmRlc3Ryb3kodCk7eG4ocil9dC5jbGVhcigpfSkodGhpcyx0aGlzLl8kc3RvcmUsdGhpcy5fJHRyYXNoKX1kZXN0cm95KGU9bnVsbCl7KChlLHQpPT57aWYodCYmIm9iamVjdCI9PXR5cGVvZiB0JiYiY2FudmFzImluIHQpe2NvbnN0IHI9dC5jYW52YXMsbj1yLndpZHRoLGk9ci5oZWlnaHQ7dC5jbGVhclJlY3QoMCwwLG4rMSxpKzEpLHIud2lkdGg9ci5oZWlnaHQ9MSxlLnB1c2gocil9fSkodGhpcy5fJHBvb2wsZSl9Z2V0Q2FudmFzKCl7cmV0dXJuIHRoaXMuXyRwb29sLnBvcCgpfHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKX1yZW1vdmUoZSx0KXsoKGUsdCxyKT0+e2lmKCFlLmhhcyh0KSlyZXR1cm47Y29uc3Qgbj1lLmdldCh0KTtuLmhhcyhyKSYmKG4uZGVsZXRlKHIpLG4uc2l6ZXx8KHhuKG4pLGUuZGVsZXRlKHQpKSl9KSh0aGlzLl8kc3RvcmUsZSx0KX1yZW1vdmVUaW1lcihlKXsoKGUsdCxyLG4pPT57aWYoci5oYXMobikpcmV0dXJuO2NvbnN0IGk9dC5nZXQobik7aSYmKGkuc2V0KCJ0cmFzaCIsITApLHIuc2V0KG4saSksbnVsbCE9PWUuJHRpbWVySWQmJmNsZWFyVGltZW91dChlLiR0aW1lcklkKSxlLiRyZW1vdmVDYWNoZT0hMSxlLiR0aW1lcklkPXNldFRpbWVvdXQoKCk9PntlLiRyZW1vdmVDYWNoZT0hMCxlLiR0aW1lcklkPW51bGx9LDFlMykpfSkodGhpcyx0aGlzLl8kc3RvcmUsdGhpcy5fJHRyYXNoLGUpfXJlbW92ZVRpbWVyU2NoZWR1bGVkQ2FjaGUoKXsoKGUsdCk9PntpZih0LnNpemUpe2Zvcihjb25zdFtyLG5db2YgdCluLmhhcygidHJhc2giKSYmKGUucmVtb3ZlQnlJZChyKSxlLiRyZW1vdmVJZHMucHVzaCgrcikpO3QuY2xlYXIoKSxlLiRyZW1vdmVDYWNoZT0hMX19KSh0aGlzLHRoaXMuXyR0cmFzaCl9cmVtb3ZlQnlJZChlKXsoKGUsdCxyKT0+e2lmKCF0LmhhcyhyKSlyZXR1cm47Y29uc3Qgbj10LmdldChyKTtmb3IoY29uc3QgdCBvZiBuLnZhbHVlcygpKWUuZGVzdHJveSh0KTt0LmRlbGV0ZShyKSx4bihuKX0pKHRoaXMsdGhpcy5fJHN0b3JlLGUpfWdldEJ5SWQoZSl7cmV0dXJuIHRoaXMuXyRzdG9yZS5nZXQoZSl9Z2V0KGUsdCl7cmV0dXJuKChlLHQscik9Pntjb25zdCBuPWUuZ2V0KHQpfHxudWxsO3JldHVybiBuPyhuLmRlbGV0ZSgidHJhc2giKSxuLmdldChyKXx8bnVsbCk6bnVsbH0pKHRoaXMuXyRzdG9yZSxlLHQpfXNldChlLHQscj1udWxsKXt2bih0aGlzLHRoaXMuXyRzdG9yZSxlLHQscil9aGFzKGUsdD0iIil7cmV0dXJuKChlLHQscj0iIik9PnI/ISFlLmhhcyh0KSYmZS5nZXQodCkuaGFzKHIpOmUuaGFzKHQpKSh0aGlzLl8kc3RvcmUsZSx0KX1nZW5lcmF0ZUtleXMoZSx0LHIpe3JldHVybigoZSx0LHIpPT57bGV0IG49MjE2NjEzNjI2MSxpPTEwMCplfDA7cmV0dXJuIG5ePTI1NSZpLG49TWF0aC5pbXVsKG4sMTY3Nzc2MTkpLG5ePWk+Pj44JjI1NSxuPU1hdGguaW11bChuLDE2Nzc3NjE5KSxuXj1pPj4+MTYmMjU1LG49TWF0aC5pbXVsKG4sMTY3Nzc2MTkpLG5ePWk+Pj4yNCxuPU1hdGguaW11bChuLDE2Nzc3NjE5KSxpPTEwMCp0fDAsbl49MjU1Jmksbj1NYXRoLmltdWwobiwxNjc3NzYxOSksbl49aT4+PjgmMjU1LG49TWF0aC5pbXVsKG4sMTY3Nzc2MTkpLG5ePWk+Pj4xNiYyNTUsbj1NYXRoLmltdWwobiwxNjc3NzYxOSksbl49aT4+PjI0LG49TWF0aC5pbXVsKG4sMTY3Nzc2MTkpLHImJihpPTEwMCpyfDAsbl49MjU1Jmksbj1NYXRoLmltdWwobiwxNjc3NzYxOSksbl49aT4+PjgmMjU1LG49TWF0aC5pbXVsKG4sMTY3Nzc2MTkpLG5ePWk+Pj4xNiYyNTUsbj1NYXRoLmltdWwobiwxNjc3NzYxOSksbl49aT4+PjI0LG49TWF0aC5pbXVsKG4sMTY3Nzc2MTkpKSwobj4+PjApJTE2Nzc3MjE2fSkoZSx0LHIpfWdlbmVyYXRlRmlsdGVyS2V5cyhlLHQscixuKXtyZXR1cm4oKGUsdCxyLG4pPT57bGV0IGk9MjE2NjEzNjI2MSxhPTEwMCplfDA7cmV0dXJuIGlePTI1NSZhLGk9TWF0aC5pbXVsKGksMTY3Nzc2MTkpLGlePWE+Pj44JjI1NSxpPU1hdGguaW11bChpLDE2Nzc3NjE5KSxpXj1hPj4+MTYmMjU1LGk9TWF0aC5pbXVsKGksMTY3Nzc2MTkpLGlePWE+Pj4yNCxpPU1hdGguaW11bChpLDE2Nzc3NjE5KSxhPTEwMCp0fDAsaV49MjU1JmEsaT1NYXRoLmltdWwoaSwxNjc3NzYxOSksaV49YT4+PjgmMjU1LGk9TWF0aC5pbXVsKGksMTY3Nzc2MTkpLGlePWE+Pj4xNiYyNTUsaT1NYXRoLmltdWwoaSwxNjc3NzYxOSksaV49YT4+PjI0LGk9TWF0aC5pbXVsKGksMTY3Nzc2MTkpLGE9MTAwKnJ8MCxpXj0yNTUmYSxpPU1hdGguaW11bChpLDE2Nzc3NjE5KSxpXj1hPj4+OCYyNTUsaT1NYXRoLmltdWwoaSwxNjc3NzYxOSksaV49YT4+PjE2JjI1NSxpPU1hdGguaW11bChpLDE2Nzc3NjE5KSxpXj1hPj4+MjQsaT1NYXRoLmltdWwoaSwxNjc3NzYxOSksYT0xMDAqbnwwLGlePTI1NSZhLGk9TWF0aC5pbXVsKGksMTY3Nzc2MTkpLGlePWE+Pj44JjI1NSxpPU1hdGguaW11bChpLDE2Nzc3NjE5KSxpXj1hPj4+MTYmMjU1LGk9TWF0aC5pbXVsKGksMTY3Nzc2MTkpLGlePWE+Pj4yNCxpPU1hdGguaW11bChpLDE2Nzc3NjE5KSwoaT4+PjApJTE2Nzc3MjE2fSkoZSx0LHIsbil9fSxfbj1uZXcgRmxvYXQzMkFycmF5KDIwKSx3bj0oZSx0LHIsaSxhLHMsbyxsLGMsdSxmKT0+e2NvbnN0IGQ9bi5jdXJyZW50QXR0YWNobWVudE9iamVjdDtsZXQgaD1udWxsO2NvbnN0IHA9TWF0aC5zcXJ0KG9bMF0qb1swXStvWzFdKm9bMV0pLG09TWF0aC5zcXJ0KG9bMl0qb1syXStvWzNdKm9bM10pLGc9eW4uZ2VuZXJhdGVGaWx0ZXJLZXlzKG9bMF0sb1sxXSxvWzJdLG9bM10pO2xldCBiPSExO2lmKHluLmdldCh0LCJmS2V5Iik9PT1nKXtjb25zdCBlPXluLmdldCh0LCJmVGV4dHVyZSIpO3I/SyhlKTooYj0hMCxoPWUpfWxldCB4PTAsdj0wO2lmKGIpeD15bi5nZXQodCwib2Zmc2V0WCIpLHY9eW4uZ2V0KHQsIm9mZnNldFkiKTtlbHNle2g9Y3IoZSk7Y29uc3QgdD1NYXRoLmF0YW4yKG9bMV0sb1swXSkscj1NYXRoLmF0YW4yKC1vWzJdLG9bM10pLGw9cz9wKk1hdGguY29zKHQpOk1hdGguY29zKHQpLGM9cz9wKk1hdGguc2luKHQpOk1hdGguc2luKHQpLHU9cz8tbSpNYXRoLnNpbihyKTotTWF0aC5zaW4ociksZz1zP20qTWF0aC5jb3Mocik6TWF0aC5jb3MociksYj1fKGwsYyx1LGcsaS8yLGEvMikseT1fKDEsMCwwLDEsLWUudy8yLC1lLmgvMiksTT0oKGUsdCk9Pntjb25zdCByPWVbMF0sbj1lWzFdLGk9ZVsyXSxhPWVbM10scz1lWzRdLG89ZVs1XSxsPXRbMF0sYz10WzFdLHU9dFsyXSxmPXRbM10sZD10WzRdLGg9dFs1XTtyZXR1cm4gXyhyKmwraSpjLG4qbCthKmMscip1K2kqZixuKnUrYSpmLHIqZCtpKmgrcyxuKmQrYSpoK28pfSkoYix5KTtpZih3KGIpLHcoeSksMSE9PU1bMF18fDAhPT1NWzFdfHwwIT09TVsyXXx8MSE9PU1bM10pe2NvbnN0IGU9eWUoaSxhLCExKTtuLmJpbmQoZSksbi5yZXNldCgpLG4uc2V0VHJhbnNmb3JtKE1bMF0sTVsxXSxNWzJdLE1bM10sTVs0XSxNWzVdKSx4PU1bNF0sdj1NWzVdLGtlKGgpO2NvbnN0IHQ9eXIoKTtfcih0LGgud2lkdGgsaC5oZWlnaHQpLGhyKHQpLEsoaCksaD1lLnRleHR1cmUsY2UoZSwhMSksZCYmbi5iaW5kKGQpfXcoTSksQ3IueD0wLENyLnk9MDtmb3IobGV0IGU9MDtmLmxlbmd0aD5lOyl7c3dpdGNoKGZbZSsrXSl7Y2FzZSAwOmg9bG4oaCxvLGZbZSsrXSxmW2UrK10sZltlKytdLGZbZSsrXSxmW2UrK10sZltlKytdLGZbZSsrXSxmW2UrK10sZltlKytdLGZbZSsrXSxmW2UrK10sQm9vbGVhbihmW2UrK10pKTticmVhaztjYXNlIDE6aD1rcihoLG8sZltlKytdLGZbZSsrXSxmW2UrK10pO2JyZWFrO2Nhc2UgMjpmb3IobGV0IHQ9MDt0PDIwOysrdClfblt0XT1mW2UrK107aD1McihoLF9uKTticmVhaztjYXNlIDM6e2NvbnN0IHQ9ZltlKytdLHI9ZltlKytdLG49dCpyLGk9Zi5zdWJhcnJheShlLGUrbik7ZSs9bixoPXBuKGgsdCxyLGksZltlKytdLGZbZSsrXSxCb29sZWFuKGZbZSsrXSksQm9vbGVhbihmW2UrK10pLGZbZSsrXSxmW2UrK10pfWJyZWFrO2Nhc2UgNDp7Y29uc3QgdD1mW2UrK10scj1uZXcgVWludDhBcnJheSh0KTtyLnNldChmLnN1YmFycmF5KGUsZSt0KSksZSs9dCxoPW1uKGgscixmW2UrK10sZltlKytdLGZbZSsrXSxmW2UrK10sZltlKytdLGZbZSsrXSxmW2UrK10sZltlKytdLGZbZSsrXSxmW2UrK10sZltlKytdKX1icmVhaztjYXNlIDU6aD1zbihoLG8sZltlKytdLGZbZSsrXSxmW2UrK10sZltlKytdLGZbZSsrXSxmW2UrK10sZltlKytdLGZbZSsrXSxCb29sZWFuKGZbZSsrXSksQm9vbGVhbihmW2UrK10pLEJvb2xlYW4oZltlKytdKSk7YnJlYWs7Y2FzZSA2Omg9bm4oaCxvLGZbZSsrXSxmW2UrK10sZltlKytdLGZbZSsrXSxmW2UrK10sZltlKytdLEJvb2xlYW4oZltlKytdKSxCb29sZWFuKGZbZSsrXSkpO2JyZWFrO2Nhc2UgNzp7Y29uc3QgdD1mW2UrK10scj1mW2UrK107bGV0IG49ZltlKytdO2NvbnN0IGk9Zi5zdWJhcnJheShlLGUrbik7ZSs9bixuPWZbZSsrXTtjb25zdCBhPWYuc3ViYXJyYXkoZSxlK24pO2UrPW4sbj1mW2UrK107Y29uc3Qgcz1mLnN1YmFycmF5KGUsZStuKTtlKz1uLGg9dW4oaCxvLHQscixpLGEscyxmW2UrK10sZltlKytdLGZbZSsrXSxmW2UrK10sZltlKytdLEJvb2xlYW4oZltlKytdKSl9YnJlYWs7Y2FzZSA4Ontjb25zdCB0PWZbZSsrXSxyPWZbZSsrXTtsZXQgbj1mW2UrK107Y29uc3QgaT1mLnN1YmFycmF5KGUsZStuKTtlKz1uLG49ZltlKytdO2NvbnN0IGE9Zi5zdWJhcnJheShlLGUrbik7ZSs9bixuPWZbZSsrXTtjb25zdCBzPWYuc3ViYXJyYXkoZSxlK24pO2UrPW4saD1kbihoLG8sdCxyLGksYSxzLGZbZSsrXSxmW2UrK10sZltlKytdLGZbZSsrXSxmW2UrK10sQm9vbGVhbihmW2UrK10pKX19fX1pZihoKXtjb25zdCBlPUYsdD11WzBdKihwL2UpLHI9dVsxXSoobS9lKTtuLnJlc2V0KCksbi5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLG4uZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPWMsZ24oaCxsLC14K3Qrb1s0XSwtdityK29bNV0pfWJ8fCh5bi5zZXQodCwiZktleSIsZykseW4uc2V0KHQsImZUZXh0dXJlIixoKSx5bi5zZXQodCwib2Zmc2V0WCIseCkseW4uc2V0KHQsIm9mZnNldFkiLHYpKSxkJiZuLmJpbmQoZCl9LE1uPVtdLFBuPW5ldyBGbG9hdDMyQXJyYXkoMjApLFNuPWU9Pntjb25zdCB0PVJlKGUuaW5kZXgpLHI9dFswXSxuPXRbMV0saT10WzJdLGE9dFszXTt0WzBdPU1hdGgubWluKGUueCxyKSx0WzFdPU1hdGgubWluKGUueSxuKSx0WzJdPU1hdGgubWF4KGUueCtlLncrMSxpKSx0WzNdPU1hdGgubWF4KGUueStlLmgrMSxhKX07bGV0IEZuPTA7Y29uc3QgVG49ZT0+e0ZuPWV9O2xldCBCbj0hMDtjb25zdCBPbj1lPT57Qm49ZX07bGV0IEFuPSExO2NvbnN0IFJuPWU9PntBbj1lfSxDbj0oKT0+ezEhPT1GbiYmKFRuKDEpLHIuc3RlbmNpbEZ1bmMoci5BTFdBWVMsMCwyNTUpLHIuc3RlbmNpbE9wU2VwYXJhdGUoci5GUk9OVCxyLktFRVAsci5LRUVQLHIuSU5DUl9XUkFQKSxyLnN0ZW5jaWxPcFNlcGFyYXRlKHIuQkFDSyxyLktFRVAsci5LRUVQLHIuREVDUl9XUkFQKSksQm4mJihPbighMSksci5jb2xvck1hc2soITEsITEsITEsITEpKX0sRW49KCk9PnsyIT09Rm4mJihUbigyKSxyLnN0ZW5jaWxGdW5jKHIuTk9URVFVQUwsMCwyNTUpLHIuc3RlbmNpbE9wKHIuS0VFUCxyLlpFUk8sci5aRVJPKSksQm58fChPbighMCksci5jb2xvck1hc2soITAsITAsITAsITApKX0sVW49KCk9PntBbnx8KFJuKCEwKSxyLmVuYWJsZShyLlNBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSkpfSwkbj0oKT0+e0FuJiYoUm4oITEpLHIuZGlzYWJsZShyLlNBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSkpfSxHbj0oZSx0LHIsbik9PntDbigpO2NvbnN0IGk9ISFuLGE9enQoaSk7biYmanQoYSxuKSxVbigpLFl0KGEsZSx0LHIpLCRuKCksRW4oKTtjb25zdCBzPShlPT57Y29uc3QgdD0icyIrKGU/InkiOiJuIik7aWYoSXQuaGFzKHQpKXJldHVybiBJdC5nZXQodCk7Y29uc3Qgcj1uZXcgTHQoVnQoZT85OjAsITEsITEsZSksIiN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cbmluIHZlYzQgdl9jb2xvcjtcbm91dCB2ZWM0IG9fY29sb3I7XG5cbnZvaWQgbWFpbigpIHtcbiAgICBvX2NvbG9yID0gdmVjNCh2X2NvbG9yLnJnYiAqIHZfY29sb3IuYSwgdl9jb2xvci5hKTtcbn0iKTtyZXR1cm4gSXQuc2V0KHQscikscn0pKGkpO24mJigoZSx0KT0+e2NvbnN0IHI9ZS5oaWdocDtyWzBdPXRbMF0sclsxXT10WzFdLHJbMl09MCxyWzRdPXRbMl0scls1XT10WzNdLHJbNl09MCxyWzhdPXRbNF0scls5XT10WzVdLHJbMTBdPTEsclsxMl09dFs2XSxyWzEzXT10WzddLHJbMTRdPTAsclsxNl09dFs4XSxyWzE3XT10WzldLHJbMThdPTAsclsyMF09dFsxMF0sclsyMV09dFsxMV0sclsyMl09MSxyWzNdPVAscls3XT1TLHJbMTFdPXRbMTJdLHJbMTVdPXRbMTNdLHJbMTldPXRbMTRdLHJbMjNdPXRbMTVdLHJbMjRdPXRbMTZdLHJbMjVdPXRbMTddLHJbMjZdPXRbMThdLHJbMjddPXRbMTldLHJbMjhdPXRbMjBdLHJbMjldPXRbMjFdLHJbMzBdPXRbMjJdLHJbMzFdPXRbMjNdLHJbMzJdPXRbMjRdLHJbMzNdPXRbMjVdfSkocyxuKSxZdChzLGUsdCxyKX0sa249KGUsdCxyLG4saSk9Pntjb25zdCBhPWUubWVkaXVtcDtsZXQgcz0wO2ZvcihsZXQgZT1yO2U8bjsrK2Upe2NvbnN0IHI9NSplO2FbcysrXT1pW3RbcisxXV0sYVtzKytdPWlbdFtyKzJdXSxhW3MrK109aVt0W3IrM11dLGFbcysrXT1pW3Rbcis0XV19Zm9yKGxldCBlPXI7ZTxuOysrZSlhW3MrK109dFs1KmVdfSxMbj0oZSx0KT0+e2NvbnN0IGk9bi5jdXJyZW50QXR0YWNobWVudE9iamVjdCxvPXIuZ2V0UGFyYW1ldGVyKHIuU0NJU1NPUl9CT1gpO3MoKTtjb25zdCBsPTA9PT10LGM9ZS5sZW5ndGgvNSx1PShlPT5lPD00PzI1NjplPD04PzUxMjoxMDI0KShjKSxmPUhyKHUpO24uYmluZChmKTtjb25zdCBkPWw/SnI6ZW47YnIoKTtjb25zdCBoPVpyKCk7Zm9yKGxldCB0PTA7dDxjO3QrPWgtMSl7Y29uc3Qgcj1NYXRoLm1pbih0K2gsYyksbj1OcihyLXQsbCk7a24obixlLHQscixkKSxZcihuLGVbMF0sZVtlLmxlbmd0aC01XSl9cmV0dXJuIFh0KCksaSYmbi5iaW5kKGkpLGEoKSxyLnNjaXNzb3Iob1swXSxvWzFdLG9bMl0sb1szXSksZi50ZXh0dXJlfSxJbj1uZXcgTWFwLFZuPShlLHQscixuKT0+e2NvbnN0IGk9KChlLHQscixuKT0+YCR7ZT8ieSI6Im4ifSR7dD8ieSI6Im4ifSR7dCYmcj8ieSI6Im4ifSR7bn1gKShuLGUsdCxyKTtpZihJbi5oYXMoaSkpcmV0dXJuIEluLmdldChpKTtjb25zdCBhPTErKG4/MTQ6NSkscz1hLTEsbz1uZXcgTHQoVnQoYSwhMCwhMSxuKSwoKGUsdCxyLG4saSk9Pntjb25zdCBhPXI/KChlLHQpPT57Y29uc3Qgcj10PyhlPT5gXG4gICAgdmVjMiBmb2NhbCA9IHZlYzIodV9oaWdocFske2V9XVsxXSwgMC4wKTtcblxuICAgIHZlYzIgZGlmZiA9IGNvb3JkIC0gZm9jYWw7XG4gICAgZmxvYXQgbGVuRGlmZiA9IGxlbmd0aChkaWZmKTtcbiAgICB2ZWMyIGRpciA9IGRpZmYgLyBsZW5EaWZmO1xuICAgIGZsb2F0IGIgPSAyLjAgKiBkb3QoZGlyLCBmb2NhbCk7XG4gICAgZmxvYXQgYyA9IGRvdChmb2NhbCwgZm9jYWwpIC0gMS4wO1xuICAgIGZsb2F0IHggPSAoLWIgKyBzcXJ0KG1heChiICogYiAtIDQuMCAqIGMsIDAuMCkpKSAqIDAuNTtcblxuICAgIGZsb2F0IHQgPSBsZW5EaWZmIC8gYWJzKHgpO2ApKGUpOiJmbG9hdCB0ID0gbGVuZ3RoKGNvb3JkKTsiO3JldHVybmBcbiAgICBmbG9hdCByYWRpdXMgPSB1X2hpZ2hwWyR7ZX1dWzBdO1xuICAgIHZlYzIgY29vcmQgPSBwIC8gcmFkaXVzO1xuICAgICR7cn1cbmB9KSh0LG4pOihlPT5gXG4gICAgdmVjMiBhID0gdV9oaWdocFske2V9XS54eTtcbiAgICB2ZWMyIGIgPSB1X2hpZ2hwWyR7ZX1dLnp3O1xuXG4gICAgdmVjMiBhYiA9IGIgLSBhO1xuICAgIHZlYzIgYXAgPSBwIC0gYTtcblxuICAgIGZsb2F0IHQgPSBkb3QoYWIsIGFwKSAvIGRvdChhYiwgYWIpO2ApKHQpO2xldCBzO3N3aXRjaChpKXtjYXNlIDA6cz0iMS4wIC0gYWJzKGZyYWN0KHQgKiAwLjUpICogMi4wIC0gMS4wKSI7YnJlYWs7Y2FzZSAxOnM9ImZyYWN0KHQpIjticmVhaztkZWZhdWx0OnM9ImNsYW1wKHQsIDAuMCwgMS4wKSJ9cmV0dXJuYCN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xuXG51bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmU7XG51bmlmb3JtIHZlYzQgdV9oaWdocFske2V9XTtcblxuaW4gdmVjMiB2X3V2O1xub3V0IHZlYzQgb19jb2xvcjtcblxudm9pZCBtYWluKCkge1xuICAgIHZlYzIgcCA9IHZfdXY7XG4gICAgJHthfVxuICAgIHQgPSAke3N9O1xuICAgIG9fY29sb3IgPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdmVjMih0LCAwLjUpKTtcbn1gfSkoYSxzLGUsdCxyKSk7cmV0dXJuIEluLnNldChpLG8pLG99LHpuPShlLHQscixuLGk9MCxhPW51bGwscz1udWxsKT0+e2NvbnN0IG89ZS5oaWdocDtvWzBdPXJbMF0sb1sxXT1yWzFdLG9bMl09clsyXSxvWzRdPXJbM10sb1s1XT1yWzRdLG9bNl09cls1XSxvWzhdPXJbNl0sb1s5XT1yWzddLG9bMTBdPXJbOF0sb1sxMl09blswXSxvWzEzXT1uWzFdLG9bMTRdPW5bMl0sb1sxNl09blszXSxvWzE3XT1uWzRdLG9bMThdPW5bNV0sb1sxMV09bls2XSxvWzE1XT1uWzddLG9bMTldPW5bOF0sb1szXT1QLG9bN109UztsZXQgbD0yMDtzJiYob1syMF09c1swXSxvWzIxXT1zWzFdLG9bMjJdPTAsb1syNF09c1syXSxvWzI1XT1zWzNdLG9bMjZdPTAsb1syOF09c1s0XSxvWzI5XT1zWzVdLG9bMzBdPTEsb1szMl09c1s2XSxvWzMzXT1zWzddLG9bMzRdPTAsb1szNl09c1s4XSxvWzM3XT1zWzldLG9bMzhdPTAsb1s0MF09c1sxMF0sb1s0MV09c1sxMV0sb1s0Ml09MSxvWzMxXT1zWzEyXSxvWzM1XT1zWzEzXSxvWzM5XT1zWzE0XSxvWzQzXT1zWzE1XSxvWzQ0XT1zWzE2XSxvWzQ1XT1zWzE3XSxvWzQ2XT1zWzE4XSxvWzQ3XT1zWzE5XSxvWzQ4XT1zWzIwXSxvWzQ5XT1zWzIxXSxvWzUwXT1zWzIyXSxvWzUxXT1zWzIzXSxvWzUyXT1zWzI0XSxvWzUzXT1zWzI1XSxsPTU2KSwwPT09dD8ob1tsKytdPWFbMF0sb1tsKytdPWFbMV0sb1tsKytdPWFbMl0sb1tsXT1hWzNdKToob1tsKytdPTgxOS4yLG9bbF09dShpLC0uOTc1LC45NzUsMCkpfSxqbj0oKT0+e0ZuPTAsT24oITApLFJuKCExKX0sRG49KGUsdCxpLGEpPT57Y29uc3Qgcz1ydC5zaGlmdCgpLG89cnQuc2hpZnQoKSx1PXJ0LnNoaWZ0KCksZj1ydC5zaGlmdCgpO2puKCksYygpO2NvbnN0IGQ9TG4ocyxmKTtrZShkKSxsKCksci5zdGVuY2lsTWFzaygyNTUpLENuKCk7Y29uc3QgaD0hIWEscD16dChoKTthJiZqdChwLGEpLFVuKCksWXQocCxlLHQsaSksJG4oKSxFbigpO2NvbnN0IG09Vm4oITEsITEsdSxoKSx4PShlPT57Y29uc3QgdD0tODE5LjIqZVswXS04MTkuMiplWzJdK2VbNF0scj04MTkuMiplWzBdLTgxOS4yKmVbMl0rZVs0XSxuPS04MTkuMiplWzBdKzgxOS4yKmVbMl0rZVs0XSxpPS04MTkuMiplWzFdLTgxOS4yKmVbM10rZVs1XSxhPTgxOS4yKmVbMV0tODE5LjIqZVszXStlWzVdO2xldCBzPW4tdCxvPS04MTkuMiplWzFdKzgxOS4yKmVbM10rZVs1XS1pO2NvbnN0IGw9TWF0aC5zcXJ0KHMqcytvKm8pO2w/KHMvPWwsby89bCk6KHM9MCxvPTApO2NvbnN0IGM9KHItdCkqcysoYS1pKSpvO3JldHVybiBnKHQrYypzLGkrYypvLHIsYSl9KShvKSx2PU0obi4kbWF0cml4KTt6bihtLDAsbi4kbWF0cml4LHYsMCx4LGEpLGIoeCksdyh2KSxZdChtLGUsdCxpKX0sTm49KGUsdCxpLGEpPT57Y29uc3Qgcz1ydC5zaGlmdCgpLG89cnQuc2hpZnQoKSx1PXJ0LnNoaWZ0KCksZj1ydC5zaGlmdCgpLGQ9cnQuc2hpZnQoKTtqbigpLGMoKTtjb25zdCBoPUxuKHMsZik7a2UoaCksbCgpLHIuc3RlbmNpbE1hc2soMjU1KSxDbigpO2NvbnN0IHA9ISFhLG09enQocCk7YSYmanQobSxhKSxVbigpLFl0KG0sZSx0LGkpLCRuKCksRW4oKSxuLnNhdmUoKSxuLnRyYW5zZm9ybShvWzBdLG9bMV0sb1syXSxvWzNdLG9bNF0sb1s1XSk7Y29uc3QgZz1uLiRzdGFja1tuLiRzdGFjay5sZW5ndGgtMV0sYj1NKG4uJG1hdHJpeCkseD1WbighMCxCb29sZWFuKGQpLHUscCk7em4oeCwxLGcsYixkLGEpLG4ucmVzdG9yZSgpLHcoYiksWXQoeCxlLHQsaSl9LFduPW5ldyBNYXAscW49KGUsdCxyLGkpPT57Q24oKTtjb25zdCBhPSEhaSxzPXp0KGEpO2kmJmp0KHMsaSksVW4oKSxZdChzLGUsdCxyKSwkbigpO2NvbnN0IG89T3Iuc2hpZnQoKSxsPU9yLnNoaWZ0KCksYz1Pci5zaGlmdCgpLHU9T3Iuc2hpZnQoKSxmPU9yLnNoaWZ0KCksZD1Pci5zaGlmdCgpLGg9VHIoYyx1LG8sZCk7bi5zYXZlKCksbi50cmFuc2Zvcm0obFswXSxsWzFdLGxbMl0sbFszXSxsWzRdLGxbNV0pLEVuKCk7Y29uc3QgcD0oKGUsdCk9Pntjb25zdCByPWBiJHtlPyJ5IjoibiJ9JHt0PyJ5IjoibiJ9YDtpZihXbi5oYXMocikpcmV0dXJuIFduLmdldChyKTtjb25zdCBuPWU/IiN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cbnVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4dHVyZTtcbnVuaWZvcm0gdmVjNCB1X21lZGl1bXBbMV07XG5cbmluIHZlYzIgdl91djtcbm91dCB2ZWM0IG9fY29sb3I7XG5cbnZvaWQgbWFpbigpIHtcbiAgICB2ZWMyIHV2ID0gZnJhY3QodmVjMih2X3V2LngsIC12X3V2LnkpIC8gdV9tZWRpdW1wWzBdLnh5KTtcblxuICAgIHZlYzQgc3JjID0gdGV4dHVyZSh1X3RleHR1cmUsIHV2KTtcbiAgICBvX2NvbG9yID0gc3JjO1xufSI6IiN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cbnVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4dHVyZTtcbnVuaWZvcm0gdmVjNCB1X21lZGl1bXBbMV07XG5cbmluIHZlYzIgdl91djtcbm91dCB2ZWM0IG9fY29sb3I7XG5cbnZvaWQgbWFpbigpIHtcbiAgICB2ZWMyIHV2ID0gdmVjMih2X3V2LngsIHVfbWVkaXVtcFswXS55IC0gdl91di55KSAvIHVfbWVkaXVtcFswXS54eTtcblxuICAgIHZlYzQgc3JjID0gdGV4dHVyZSh1X3RleHR1cmUsIHV2KTtcbiAgICBvX2NvbG9yID0gc3JjO1xufSIsaT1uZXcgTHQoVnQodD8xNDo1LCEwLCExLHQpLG4pO3JldHVybiBXbi5zZXQocixpKSxpfSkoZixhKTsoKGUsdCxyLGkpPT57Y29uc3QgYT1lLmhpZ2hwLHM9bi4kc3RhY2tbbi4kc3RhY2subGVuZ3RoLTFdO2FbMF09c1swXSxhWzFdPXNbMV0sYVsyXT1zWzJdLGFbNF09c1szXSxhWzVdPXNbNF0sYVs2XT1zWzVdLGFbOF09c1s2XSxhWzldPXNbN10sYVsxMF09c1s4XTtjb25zdCBvPU0obi4kbWF0cml4KTthWzEyXT1vWzBdLGFbMTNdPW9bMV0sYVsxNF09b1syXSxhWzE2XT1vWzNdLGFbMTddPW9bNF0sYVsxOF09b1s1XSxhWzExXT1vWzZdLGFbMTVdPW9bN10sYVsxOV09b1s4XSxhWzNdPVAsYVs3XT1TLGkmJihhWzIwXT1pWzBdLGFbMjFdPWlbMV0sYVsyMl09MCxhWzI0XT1pWzJdLGFbMjVdPWlbM10sYVsyNl09MCxhWzI4XT1pWzRdLGFbMjldPWlbNV0sYVszMF09MSxhWzMyXT1pWzZdLGFbMzNdPWlbN10sYVszNF09MCxhWzM2XT1pWzhdLGFbMzddPWlbOV0sYVszOF09MCxhWzQwXT1pWzEwXSxhWzQxXT1pWzExXSxhWzQyXT0xLGFbMzFdPWlbMTJdLGFbMzVdPWlbMTNdLGFbMzldPWlbMTRdLGFbNDNdPWlbMTVdLGFbNDRdPWlbMTZdLGFbNDVdPWlbMTddLGFbNDZdPWlbMThdLGFbNDddPWlbMTldLGFbNDhdPWlbMjBdLGFbNDldPWlbMjFdLGFbNTBdPWlbMjJdLGFbNTFdPWlbMjNdLGFbNTJdPWlbMjRdLGFbNTNdPWlbMjVdKTtjb25zdCBsPWUubWVkaXVtcDtsWzBdPXQsbFsxXT1yfSkocCxjLHUsaSksWXQocCxlLHQsciksbi5yZXN0b3JlKCksSyhoKX07bGV0IFhuPTA7Y29uc3QgWW49bmV3IEZsb2F0MzJBcnJheSgyNTYpO2ZvcihsZXQgZT0xO2U8MjU2O2UrKylZbltlXT0yNTUvZTtsZXQgS249Y2xhc3N7Y29uc3RydWN0b3IoaSxhLHM9MSl7dmFyIG87T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRzdGFjayIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkbWF0cml4Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRjbGVhckNvbG9yUiIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkY2xlYXJDb2xvckciLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJGNsZWFyQ29sb3JCIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRjbGVhckNvbG9yQSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkbWFpbkF0dGFjaG1lbnRPYmplY3QiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJHN0YWNrQXR0YWNobWVudE9iamVjdCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJnbG9iYWxBbHBoYSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJnbG9iYWxDb21wb3NpdGVPcGVyYXRpb24iLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaW1hZ2VTbW9vdGhpbmdFbmFibGVkIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRmaWxsU3R5bGUiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJHN0cm9rZVN0eWxlIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIm1hc2tCb3VuZHMiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywidGhpY2tuZXNzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImNhcHMiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiam9pbnRzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIm1pdGVyTGltaXQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywibmV3RHJhd1N0YXRlIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ITF9KSwoZT0+e3I9ZX0pKGkpLG89aS5nZXRQYXJhbWV0ZXIoaS5NQVhfVEVYVFVSRV9TSVpFKSxlPU1hdGgubWF4KDIwNDgsby8yKSwoZT0+e3Q9ZX0pKGEpLChlPT57Rj1lfSkocyksdGhpcy4kc3RhY2s9ZCgpLHRoaXMuJHN0YWNrQXR0YWNobWVudE9iamVjdD1kKCksdGhpcy4kbWF0cml4PXYoMSwwLDAsMCwxLDAsMCwwLDEpLHRoaXMuJGNsZWFyQ29sb3JSPTAsdGhpcy4kY2xlYXJDb2xvckc9MCx0aGlzLiRjbGVhckNvbG9yQj0wLHRoaXMuJGNsZWFyQ29sb3JBPTAsdGhpcy50aGlja25lc3M9MSx0aGlzLmNhcHM9MCx0aGlzLmpvaW50cz0yLHRoaXMubWl0ZXJMaW1pdD0wLHRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0PW51bGwsdGhpcy5nbG9iYWxBbHBoYT0xLHRoaXMuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJub3JtYWwiLHRoaXMuaW1hZ2VTbW9vdGhpbmdFbmFibGVkPSExLHRoaXMuJGZpbGxTdHlsZT1uZXcgRmxvYXQzMkFycmF5KFsxLDEsMSwxXSksdGhpcy4kc3Ryb2tlU3R5bGU9bmV3IEZsb2F0MzJBcnJheShbMSwxLDEsMV0pLHRoaXMubWFza0JvdW5kcz17eE1pbjowLHlNaW46MCx4TWF4OjAseU1heDowfSxpLnBpeGVsU3RvcmVpKGkuVU5QQUNLX0FMSUdOTUVOVCwxKSxpLnBpeGVsU3RvcmVpKGkuVU5QQUNLX0ZMSVBfWV9XRUJHTCwhMCksaS5jbGVhckNvbG9yKDAsMCwwLDApLGkuZnJvbnRGYWNlKGkuQ0NXKSwoZT0+e1o9ZS5jcmVhdGVGcmFtZWJ1ZmZlcigpfSkoaSksKGU9PntKPWUuY3JlYXRlRnJhbWVidWZmZXIoKX0pKGkpLCgoZSx0KT0+e2VlPWUuY3JlYXRlRnJhbWVidWZmZXIoKSxlLmJpbmRGcmFtZWJ1ZmZlcihlLkZSQU1FQlVGRkVSLGVlKSxlLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGUuRlJBTUVCVUZGRVIsZS5DT0xPUl9BVFRBQ0hNRU5UMCxlLlRFWFRVUkVfMkQsdC5yZXNvdXJjZSwwKSxlLmJpbmRGcmFtZWJ1ZmZlcihlLkZSQU1FQlVGRkVSLG51bGwpLGUuYmluZEZyYW1lYnVmZmVyKGUuRFJBV19GUkFNRUJVRkZFUixlZSl9KShpLE9lKCkpLChlPT57c2U9ZS5jcmVhdGVGcmFtZWJ1ZmZlcigpLGFlPWUuY3JlYXRlRnJhbWVidWZmZXIoKSxvZT1lLmNyZWF0ZUZyYW1lYnVmZmVyKCksbGU9ZS5jcmVhdGVCdWZmZXIoKSxlLmJpbmRCdWZmZXIoZS5QSVhFTF9QQUNLX0JVRkZFUixsZSl9KShpKSxGcihpKSxyLmVuYWJsZShyLkJMRU5EKSxYdCgpLChlPT57UXI9TWF0aC5mbG9vciguNzUqZS5nZXRQYXJhbWV0ZXIoZS5NQVhfRlJBR01FTlRfVU5JRk9STV9WRUNUT1JTKSl9KShpKSxuPXRoaXN9Y2xlYXJUcmFuc2ZlckJvdW5kcygpeygoKT0+e2ZvcihsZXQgZT0wO2U8QWUubGVuZ3RoOysrZSl7Y29uc3QgdD1BZVtlXTt0JiYodFswXT10WzFdPV9lLHRbMl09dFszXT13ZSl9fSkoKX11cGRhdGVCYWNrZ3JvdW5kQ29sb3IoZSx0LHIsbil7KChlLHQscixuLGkpPT57ZS4kY2xlYXJDb2xvclI9dSh0LDAsMSwwKSxlLiRjbGVhckNvbG9yRz11KHIsMCwxLDApLGUuJGNsZWFyQ29sb3JCPXUobiwwLDEsMCksZS4kY2xlYXJDb2xvckE9dShpLDAsMSwwKX0pKHRoaXMsZSx0LHIsbil9ZmlsbEJhY2tncm91bmRDb2xvcigpe3ZhciBlLHQsbixpO2U9dGhpcy4kY2xlYXJDb2xvclIsdD10aGlzLiRjbGVhckNvbG9yRyxuPXRoaXMuJGNsZWFyQ29sb3JCLGk9dGhpcy4kY2xlYXJDb2xvckEsci5jbGVhckNvbG9yKGUsdCxuLGkpLHIuY2xlYXIoci5DT0xPUl9CVUZGRVJfQklUfHIuU1RFTkNJTF9CVUZGRVJfQklUKSxyLmNsZWFyQ29sb3IoMCwwLDAsMCl9cmVzaXplKGUsdCxyPSEwKXskZSh0aGlzLGUsdCxyKX1jbGVhclJlY3QoZSx0LG4saSl7KChlLHQsbixpKT0+e2EoKSxyLnNjaXNzb3IoZSx0LG4saSksci5jbGVhcihyLkNPTE9SX0JVRkZFUl9CSVR8ci5TVEVOQ0lMX0JVRkZFUl9CSVQpLHMoKX0pKGUsdCxuLGkpfWJpbmQoZSl7TmUodGhpcyxlKX1zYXZlKCl7dmFyIGU7KGU9dGhpcykuJHN0YWNrLnB1c2godiguLi5lLiRtYXRyaXgpKX1yZXN0b3JlKCl7V2UodGhpcyl9c2V0VHJhbnNmb3JtKGUsdCxyLG4saSxhKXsoKGUsdCxyLG4saSxhLHMpPT57ZVswXT10LGVbMV09cixlWzNdPW4sZVs0XT1pLGVbNl09YSxlWzddPXN9KSh0aGlzLiRtYXRyaXgsZSx0LHIsbixpLGEpfXRyYW5zZm9ybShlLHQscixuLGksYSl7KChlLHQscixuLGksYSxzKT0+e2NvbnN0IG89ZS4kbWF0cml4WzBdLGw9ZS4kbWF0cml4WzFdLGM9ZS4kbWF0cml4WzNdLHU9ZS4kbWF0cml4WzRdLGY9ZS4kbWF0cml4WzZdLGQ9ZS4kbWF0cml4WzddO2UuJG1hdHJpeFswXT10Km8rcipjLGUuJG1hdHJpeFsxXT10Kmwrcip1LGUuJG1hdHJpeFszXT1uKm8raSpjLGUuJG1hdHJpeFs0XT1uKmwraSp1LGUuJG1hdHJpeFs2XT1hKm8rcypjK2YsZS4kbWF0cml4WzddPWEqbCtzKnUrZH0pKHRoaXMsZSx0LHIsbixpLGEpfXJlc2V0KCl7dmFyIGU7KGU9dGhpcykuZ2xvYmFsQWxwaGE9MSxlLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0ibm9ybWFsIixlLmltYWdlU21vb3RoaW5nRW5hYmxlZD0hMX1iZWdpblBhdGgoKXt2YXIgZTsoZT10aGlzKS4kZmlsbFN0eWxlLmZpbGwoMSksZS4kc3Ryb2tlU3R5bGUuZmlsbCgxKSwoKCk9Pntmb3IoVC5sZW5ndGg9MDtCLmxlbmd0aDspaChCLnBvcCgpKX0pKCl9bW92ZVRvKGUsdCl7QyhlLHQpfWxpbmVUbyhlLHQpeygoZSx0KT0+e1QubGVuZ3RofHxDKGUsdCksUihlLHQpfHxBKGUsdCwhMSl9KShlLHQpfXF1YWRyYXRpY0N1cnZlVG8oZSx0LHIsbil7RShlLHQscixuKX1maWxsU3R5bGUoZSx0LHIsbil7dGhpcy4kZmlsbFN0eWxlWzBdPWUsdGhpcy4kZmlsbFN0eWxlWzFdPXQsdGhpcy4kZmlsbFN0eWxlWzJdPXIsdGhpcy4kZmlsbFN0eWxlWzNdPW59c3Ryb2tlU3R5bGUoZSx0LHIsbil7dGhpcy4kc3Ryb2tlU3R5bGVbMF09ZSx0aGlzLiRzdHJva2VTdHlsZVsxXT10LHRoaXMuJHN0cm9rZVN0eWxlWzJdPXIsdGhpcy4kc3Ryb2tlU3R5bGVbM109bn1jbG9zZVBhdGgoKXsoKCk9PntpZihULmxlbmd0aDw3KXJldHVybjtjb25zdCBlPStUWzBdLHQ9K1RbMV07UihlLHQpfHxBKGUsdCwhMSl9KSgpfWFyYyhlLHQscil7KChlLHQscik9Pntjb25zdCBuPXIsaT0uNTUyMjg0NzQ5ODMwNzkzNipyO3EoZStuLHQraSxlK2ksdCtuLGUsdCtuKSxxKGUtaSx0K24sZS1uLHQraSxlLW4sdCkscShlLW4sdC1pLGUtaSx0LW4sZSx0LW4pLHEoZStpLHQtbixlK24sdC1pLGUrbix0KX0pKGUsdCxyKX1iZXppZXJDdXJ2ZVRvKGUsdCxyLG4saSxhKXtxKGUsdCxyLG4saSxhKX1maWxsKCl7KGU9Pntjb25zdCB0PU8oKTtpZighdC5sZW5ndGgpcmV0dXJuO1plLnB1c2goZSk7Y29uc3Qgcj10dCh0KTtIZShyLmJ1ZmZlciksUWUucHVzaChyLmluZGV4Q291bnQpfSkoImZpbGwiKX1ncmFkaWVudEZpbGwoZSx0LHIsbixpLGEpeygoZSx0LHIsbixpLGEpPT57Y29uc3Qgcz1PKCk7aWYoIXMubGVuZ3RoKXJldHVybjtaZS5wdXNoKDA9PT1lPyJsaW5lYXIiOiJyYWRpYWwiKTtjb25zdCBvPXR0KHMpO0hlKG8uYnVmZmVyKSxRZS5wdXNoKG8uaW5kZXhDb3VudCkscnQucHVzaCh0LHIsbixpKSwxPT09ZSYmcnQucHVzaChhKX0pKGUsdCxyLG4saSxhKX1iaXRtYXBGaWxsKGUsdCxyLG4saSxhKXsoKGUsdCxyLG4saSxhKT0+e2NvbnN0IHM9TygpO2lmKCFzLmxlbmd0aClyZXR1cm47WmUucHVzaCgiYml0bWFwIik7Y29uc3Qgbz10dChzKTtIZShvLmJ1ZmZlciksUWUucHVzaChvLmluZGV4Q291bnQpLE9yLnB1c2goZSx0LHIsbixpLGEpfSkoZSx0LHIsbixpLGEpfXN0cm9rZSgpeygoKT0+e2NvbnN0IGU9TyghMCk7aWYoIWUubGVuZ3RoKXJldHVybjtaZS5wdXNoKCJmaWxsIik7Y29uc3QgdD13dChlKTtIZSh0LmJ1ZmZlciksUWUucHVzaCh0LmluZGV4Q291bnQpfSkoKX1ncmFkaWVudFN0cm9rZShlLHQscixuLGksYSl7KChlLHQscixuLGksYSk9Pntjb25zdCBzPU8oITApO2lmKCFzLmxlbmd0aClyZXR1cm47WmUucHVzaCgwPT09ZT8ibGluZWFyIjoicmFkaWFsIik7Y29uc3Qgbz13dChzKTtIZShvLmJ1ZmZlciksUWUucHVzaChvLmluZGV4Q291bnQpLHJ0LnB1c2godCxyLG4saSksMT09PWUmJnJ0LnB1c2goYSl9KShlLHQscixuLGksYSl9Yml0bWFwU3Ryb2tlKGUsdCxyLG4saSxhKXsoKGUsdCxyLG4saSxhKT0+e2NvbnN0IHM9TyghMCk7aWYoIXMubGVuZ3RoKXJldHVybjtaZS5wdXNoKCJiaXRtYXAiKTtjb25zdCBvPXd0KHMpO0hlKG8uYnVmZmVyKSxRZS5wdXNoKG8uaW5kZXhDb3VudCksT3IucHVzaChlLHQscixuLGksYSl9KShlLHQscixuLGksYSl9Y2xpcCgpeygoKT0+e2NvbnN0IGU9bi5jdXJyZW50QXR0YWNobWVudE9iamVjdDtpZighZSlyZXR1cm47Y29uc3QgdD1qZS5nZXQoZS5jbGlwTGV2ZWwpLGk9dFswXSxvPXRbMV0sbD10WzJdLGM9dFszXSx1PU1hdGguY2VpbChNYXRoLmFicyhsLWkpKSxmPU1hdGguY2VpbChNYXRoLmFicyhjLW8pKTthKCksci5zY2lzc29yKGksZS5oZWlnaHQtby1mLHUsZik7Y29uc3QgZD1VdCgpO2xldCBoPURlLmdldChlLmNsaXBMZXZlbCkscD0wLG09bnVsbDtjb25zdCBnPVFlLmxlbmd0aDtmb3IobGV0IHQ9MDt0PGc7dCsrKXtyLnN0ZW5jaWxNYXNrKDE8PGgtMSk7Y29uc3Qgbj1RZVt0XTtNdC5oYXModCkmJihtPU10LmdldCh0KSk7Y29uc3QgaT16dCghIW0pO20mJmp0KGksbSksWXQoaSxkLHAsbikscCs9biwrK2gsaD43JiYoSHQoKSxoPWUuY2xpcExldmVsKzEpfURlLnNldChlLmNsaXBMZXZlbCxoKSwkdChkKSxKZSgpLFB0KCkscygpfSkoKX1nZXQgY3VycmVudEF0dGFjaG1lbnRPYmplY3QoKXtyZXR1cm4gdGV9Z2V0IGF0bGFzQXR0YWNobWVudE9iamVjdCgpe3JldHVybiBGZSgpfWNyZWF0ZU5vZGUoZSx0KXtyZXR1cm4gZXIoZSx0KX1yZW1vdmVOb2RlKGUpeyhlPT57Y29uc3QgdD1UZVtlLmluZGV4XTt0JiZ0LmRpc3Bvc2UoZS54LGUueSxlLncsZS5oKX0pKGUpfWJlZ2luTm9kZVJlbmRlcmluZyhlKXt2YXIgdCxuLGksczt0aGlzLm5ld0RyYXdTdGF0ZT0hMCxTbihlKSx0PWUueCxuPWUueSxpPWUudyxzPWUuaCxhKCksci5zY2lzc29yKHQsbixpKzEscysxKSxyLmNsZWFyKHIuQ09MT1JfQlVGRkVSX0JJVHxyLlNURU5DSUxfQlVGRkVSX0JJVCksci5zY2lzc29yKHQsbixpLHMpfWVuZE5vZGVSZW5kZXJpbmcoKXtzKCl9ZHJhd0ZpbGwoKXsoKCk9Pntjb25zdCBlPVV0KCk7bCgpLHIuc3RlbmNpbE1hc2soMjU1KSxqbigpO2xldCB0PTAsbj1udWxsO2ZvcihsZXQgcj0wO3I8WmUubGVuZ3RoO3IrKylzd2l0Y2goTXQuaGFzKHIpJiYobj1NdC5nZXQocikpLFplW3JdKXtjYXNlImZpbGwiOntjb25zdCByPVFlLnNoaWZ0KCk7R24oZSx0LHIsbiksdCs9cn1icmVhaztjYXNlImxpbmVhciI6e2NvbnN0IHI9UWUuc2hpZnQoKTtEbihlLHQscixuKSx0Kz1yfWJyZWFrO2Nhc2UicmFkaWFsIjp7Y29uc3Qgcj1RZS5zaGlmdCgpO05uKGUsdCxyLG4pLHQrPXJ9YnJlYWs7Y2FzZSJiaXRtYXAiOntjb25zdCByPVFlLnNoaWZ0KCk7cW4oZSx0LHIsbiksdCs9cn19YygpLGpuKCksJHQoZSksSmUoKSxQdCgpfSkoKX1kcmF3RGlzcGxheU9iamVjdCh0LHIsaSxhLHMsbyl7U24odCksKCh0LHIsaSxhLHMsbyk9Pntjb25zdCBsPW9bMF0sYz1vWzFdLHU9b1syXSxmPW4uZ2xvYmFsQWxwaGEsZD1vWzRdLzI1NSxoPW9bNV0vMjU1LHA9b1s2XS8yNTUsbT1uLiRtYXRyaXg7c3dpdGNoKG4uZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uKXtjYXNlIm5vcm1hbCI6Y2FzZSJsYXllciI6Y2FzZSJhZGQiOmNhc2Uic2NyZWVuIjpjYXNlImFscGhhIjpjYXNlImVyYXNlIjpjYXNlImNvcHkiOntpZihEdCE9PW4uZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9ufHxDZSE9PXQuaW5kZXgpe1BlKENlKTtjb25zdCBlPW4uZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uO24uZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPUR0LG4ubmV3RHJhd1N0YXRlPSEwLG4uZHJhd0FycmF5c0luc3RhbmNlZCgpLG4ubmV3RHJhd1N0YXRlPSEwLG4uZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPWUsTnQobi5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24pLEVlKHQuaW5kZXgpLFBlKHQuaW5kZXgpfWNvbnN0IHI9c3IoKTtuci5wdXNoRGlzcGxheU9iamVjdEJ1ZmZlcigodC54Ky41KS9lLCh0LnkrLjUpL2UsKHQudy0xKS9lLCh0LmgtMSkvZSx0LncsdC5oLFAsUyxtWzZdLG1bN10sbVswXSxtWzFdLG1bM10sbVs0XSxsLGMsdSxmLGQsaCxwLDApLHIuY291bnQrK31icmVhaztkZWZhdWx0Ontjb25zdCBlPW4uY3VycmVudEF0dGFjaG1lbnRPYmplY3Q7bi5kcmF3QXJyYXlzSW5zdGFuY2VkKCk7Y29uc3Qgbz1NYXRoLmNlaWwoTWF0aC5hYnMoYS1yKSksZz1NYXRoLmNlaWwoTWF0aC5hYnMocy1pKSk7bGV0IGI9MCx4PTAsdj1jcih0KTtpZigxIT09bVswXXx8MCE9PW1bMV18fDAhPT1tWzNdfHwxIT09bVs0XSl7Y29uc3Qgcj15ZShvLGcsITEpLGk9XyhtWzBdLG1bMV0sbVszXSxtWzRdLG8vMixnLzIpLGE9XygxLDAsMCwxLC10LncvMiwtdC5oLzIpLHM9XyhpWzBdKmFbMF0raVsyXSphWzFdLGlbMV0qYVswXStpWzNdKmFbMV0saVswXSphWzJdK2lbMl0qYVszXSxpWzFdKmFbMl0raVszXSphWzNdLGlbMF0qYVs0XStpWzJdKmFbNV0raVs0XSxpWzFdKmFbNF0raVszXSphWzVdK2lbNV0pO24uc2F2ZSgpLG4uYmluZChyKSxuLnNldFRyYW5zZm9ybShzWzBdLHNbMV0sc1syXSxzWzNdLHNbNF0sc1s1XSksYj1zWzRdLHg9c1s1XTtjb25zdCBsPXlyKCk7X3IobCx2LndpZHRoLHYuaGVpZ2h0KSxrZSh2LCEwKSxocihsKSxLKHYpLHY9ci50ZXh0dXJlLGNlKHIsITEpLGUmJm4uYmluZChlKSxuLnJlc3RvcmUoKX0oYnx8eCkmJihtWzZdLT1iLG1bN10tPXgpO2NvbnN0IHk9Z3IobVs2XSxtWzddLG8sZyksdz15ZShvLGcsITEpO24uYmluZCh3KSx1cih5LHYpO2NvbnN0IE09b3Iobi5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24pO3ZyKE0sbCxjLHUsZixkLGgscCwwKSxocihNKSxlJiZuLmJpbmQoZSkseHIody50ZXh0dXJlKSwoYnx8eCkmJihtWzZdKz1iLG1bN10rPXgpLEsodiksSyh5KSxjZSh3KSxOdChuLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiksRWUodC5pbmRleCksUGUodC5pbmRleCl9fX0pKHQscixpLGEscyxvKX1kcmF3QXJyYXlzSW5zdGFuY2VkKCl7KCgpPT57Y29uc3QgZT1zcigpO2UuY291bnQmJihscigpLFNyKER0KSxNcihlKSxlLmNsZWFyKCkpfSkoKX1jbGVhckFycmF5c0luc3RhbmNlZCgpe3NyKCkuY2xlYXIoKX10cmFuc2Zlck1haW5DYW52YXMoKXsoKCk9Pntjb25zdCBlPW4uJG1haW5BdHRhY2htZW50T2JqZWN0O24uYmluZChlKSxyLmJpbmRGcmFtZWJ1ZmZlcihyLlJFQURfRlJBTUVCVUZGRVIsWiksci5iaW5kRnJhbWVidWZmZXIoci5EUkFXX0ZSQU1FQlVGRkVSLG51bGwpO2NvbnN0IHQ9ZS53aWR0aCxpPWUuaGVpZ2h0O3IuYmxpdEZyYW1lYnVmZmVyKDAsMCx0LGksMCwwLHQsaSxyLkNPTE9SX0JVRkZFUl9CSVQsci5ORUFSRVNUKSxyLmJpbmRGcmFtZWJ1ZmZlcihyLkRSQVdfRlJBTUVCVUZGRVIsSiksci5iaW5kRnJhbWVidWZmZXIoci5GUkFNRUJVRkZFUixaKX0pKCl9ZHJhd1BpeGVscyhlLHQpeygoZSx0KT0+e2NvbnN0IHI9VHIoZS53LGUuaCx0KSxuPWZyKCk7ZHIobixlLncsZS5oKSxYdCgpLGhyKG4pLEsocil9KShlLHQpfWRyYXdFbGVtZW50KGUsdCxyPSExKXtCcihlLHQpfWJlZ2luTWFzaygpeygoKT0+e2NvbnN0IGU9bi5jdXJyZW50QXR0YWNobWVudE9iamVjdDtlJiYoZS5tYXNrPSEwLGUuY2xpcExldmVsKyssRGUuc2V0KGUuY2xpcExldmVsLGUuY2xpcExldmVsKSx6ZSgpfHwoVmUoITApLGwoKSxyLmVuYWJsZShyLlNBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSksci5zdGVuY2lsRnVuYyhyLkFMV0FZUywwLDI1NSksci5zdGVuY2lsT3Aoci5aRVJPLHIuSU5WRVJULHIuSU5WRVJUKSxyLmNvbG9yTWFzayghMSwhMSwhMSwhMSkpKX0pKCl9c2V0TWFza0JvdW5kcyhlLHQsaSxzKXsoKGUsdCxpLHMpPT57Y29uc3Qgbz1uLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0O2lmKCFvKXJldHVybjtqZS5zZXQoby5jbGlwTGV2ZWwsZyhlLHQsaSxzKSk7Y29uc3QgbD1NYXRoLmNlaWwoTWF0aC5hYnMoaS1lKSksYz1NYXRoLmNlaWwoTWF0aC5hYnMocy10KSk7YSgpLHIuc2Npc3NvcihlLG8uaGVpZ2h0LXQtYyxsLGMpfSkoZSx0LGkscyl9ZW5kTWFzaygpe0xlKCl9bGVhdmVNYXNrKCl7dGhpcy5kcmF3QXJyYXlzSW5zdGFuY2VkKCksKCgpPT57Y29uc3QgZT1uLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0O2lmKCFlKXJldHVybjtjb25zdCB0PWUuY2xpcExldmVsLGk9amUuZ2V0KHQpLG89aVswXSxsPWlbMV0sdT1pWzJdLGY9aVszXTtqZS5kZWxldGUodCksRGUuZGVsZXRlKHQpLGIoaSk7Y29uc3QgZD1NYXRoLmNlaWwoTWF0aC5hYnModS1vKSksaD1NYXRoLmNlaWwoTWF0aC5hYnMoZi1sKSk7aWYoYSgpLHIuc2Npc3NvcihvLGUuaGVpZ2h0LWwtaCxkLGgpLC0tZS5jbGlwTGV2ZWwsIWUuY2xpcExldmVsKXJldHVybiBlLm1hc2s9ITEsVmUoITEpLHIuY2xlYXIoci5TVEVOQ0lMX0JVRkZFUl9CSVQpLGMoKSxzKCksRGUuY2xlYXIoKSx2b2lkIGplLmNsZWFyKCk7ci5zdGVuY2lsTWFzaygxPDxlLmNsaXBMZXZlbCksci5zdGVuY2lsRnVuYyhyLkFMV0FZUywwLDI1NSksci5zdGVuY2lsT3Aoci5SRVBMQUNFLHIuUkVQTEFDRSxyLlJFUExBQ0UpLHIuY29sb3JNYXNrKCExLCExLCExLCExKSxZdChLdCgpLEV0KCksMCw2KSxMZSgpfSkoKX11c2VHcmlkKGUpeyhlPT57TXQuc2V0KFFlLmxlbmd0aCxlKX0pKGUpfWFwcGx5RmlsdGVyKGUsdCxyLG4saSxhLHMsbyxsLGMsdSl7dGhpcy5kcmF3QXJyYXlzSW5zdGFuY2VkKCksd24oZSx0LHIsbixpLGEscyxvLGwsYyx1KX1jb250YWluZXJCZWdpbkxheWVyKGUsdCl7dGhpcy5kcmF3QXJyYXlzSW5zdGFuY2VkKCksKChlLHQpPT57bi5kcmF3QXJyYXlzSW5zdGFuY2VkKCk7Y29uc3Qgcj1uLiRtYWluQXR0YWNobWVudE9iamVjdDtNbi5wdXNoKHIpO2NvbnN0IGk9eWUoZSx0LCExKTtuLiRtYWluQXR0YWNobWVudE9iamVjdD1pLG4uYmluZChpKX0pKGUsdCl9Y29udGFpbmVyRW5kTGF5ZXIoZSx0LHIsaSxhLHMsbyxsKXsoKGUsdCxyLGksYSxzLG8sbCk9PntuLmRyYXdBcnJheXNJbnN0YW5jZWQoKTtjb25zdCBjPW4uJG1haW5BdHRhY2htZW50T2JqZWN0O2xldCB1PW51bGw7aWYoaSYmYSYmcyl7dT1ncigwLDAsYy53aWR0aCxjLmhlaWdodCksbi4kbWFpbkF0dGFjaG1lbnRPYmplY3Q9TW4ucG9wKCksY2UoYyksbi5iaW5kKG4uJG1haW5BdHRhY2htZW50T2JqZWN0KSxDci54PTAsQ3IueT0wO2ZvcihsZXQgZT0wO3MubGVuZ3RoPmU7KXN3aXRjaChzW2UrK10pe2Nhc2UgMDp1PWxuKHUsdCxzW2UrK10sc1tlKytdLHNbZSsrXSxzW2UrK10sc1tlKytdLHNbZSsrXSxzW2UrK10sc1tlKytdLHNbZSsrXSxzW2UrK10sc1tlKytdLEJvb2xlYW4oc1tlKytdKSk7YnJlYWs7Y2FzZSAxOnU9a3IodSx0LHNbZSsrXSxzW2UrK10sc1tlKytdKTticmVhaztjYXNlIDI6Zm9yKGxldCB0PTA7dDwyMDsrK3QpUG5bdF09c1tlKytdO3U9THIodSxQbik7YnJlYWs7Y2FzZSAzOntjb25zdCB0PXNbZSsrXSxyPXNbZSsrXSxuPXQqcixpPXMuc3ViYXJyYXkoZSxlK24pO2UrPW4sdT1wbih1LHQscixpLHNbZSsrXSxzW2UrK10sQm9vbGVhbihzW2UrK10pLEJvb2xlYW4oc1tlKytdKSxzW2UrK10sc1tlKytdKX1icmVhaztjYXNlIDQ6e2NvbnN0IHQ9c1tlKytdLHI9bmV3IFVpbnQ4QXJyYXkodCk7ci5zZXQocy5zdWJhcnJheShlLGUrdCkpLGUrPXQsdT1tbih1LHIsc1tlKytdLHNbZSsrXSxzW2UrK10sc1tlKytdLHNbZSsrXSxzW2UrK10sc1tlKytdLHNbZSsrXSxzW2UrK10sc1tlKytdLHNbZSsrXSl9YnJlYWs7Y2FzZSA1OnU9c24odSx0LHNbZSsrXSxzW2UrK10sc1tlKytdLHNbZSsrXSxzW2UrK10sc1tlKytdLHNbZSsrXSxzW2UrK10sQm9vbGVhbihzW2UrK10pLEJvb2xlYW4oc1tlKytdKSxCb29sZWFuKHNbZSsrXSkpO2JyZWFrO2Nhc2UgNjp1PW5uKHUsdCxzW2UrK10sc1tlKytdLHNbZSsrXSxzW2UrK10sc1tlKytdLHNbZSsrXSxCb29sZWFuKHNbZSsrXSksQm9vbGVhbihzW2UrK10pKTticmVhaztjYXNlIDc6e2NvbnN0IHI9c1tlKytdLG49c1tlKytdO2xldCBpPXNbZSsrXTtjb25zdCBhPXMuc3ViYXJyYXkoZSxlK2kpO2UrPWksaT1zW2UrK107Y29uc3Qgbz1zLnN1YmFycmF5KGUsZStpKTtlKz1pLGk9c1tlKytdO2NvbnN0IGw9cy5zdWJhcnJheShlLGUraSk7ZSs9aSx1PXVuKHUsdCxyLG4sYSxvLGwsc1tlKytdLHNbZSsrXSxzW2UrK10sc1tlKytdLHNbZSsrXSxCb29sZWFuKHNbZSsrXSkpfWJyZWFrO2Nhc2UgODp7Y29uc3Qgcj1zW2UrK10sbj1zW2UrK107bGV0IGk9c1tlKytdO2NvbnN0IGE9cy5zdWJhcnJheShlLGUraSk7ZSs9aSxpPXNbZSsrXTtjb25zdCBvPXMuc3ViYXJyYXkoZSxlK2kpO2UrPWksaT1zW2UrK107Y29uc3QgbD1zLnN1YmFycmF5KGUsZStpKTtlKz1pLHU9ZG4odSx0LHIsbixhLG8sbCxzW2UrK10sc1tlKytdLHNbZSsrXSxzW2UrK10sc1tlKytdLEJvb2xlYW4oc1tlKytdKSl9fWlmKG8mJih5bi5zZXQobywiZktleSIsbCkseW4uc2V0KG8sImZUZXh0dXJlIix1KSksdSl7Y29uc3QgaT1NYXRoLnNxcnQodFswXSp0WzBdK3RbMV0qdFsxXSkscz1NYXRoLnNxcnQodFsyXSp0WzJdK3RbM10qdFszXSksbz1GLGw9YVswXSooaS9vKSxjPWFbMV0qKHMvbyk7bi5yZXNldCgpLG4uZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPWUsZ24odSxyLGwrdFs0XSxjK3RbNV0pfX1lbHNlIHU9Z3IoMCwwLGMud2lkdGgsYy5oZWlnaHQpLG4uJG1haW5BdHRhY2htZW50T2JqZWN0PU1uLnBvcCgpLGNlKGMpLG4uYmluZChuLiRtYWluQXR0YWNobWVudE9iamVjdCksdSYmKG4ucmVzZXQoKSxuLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj1lLGduKHUscix0WzRdLHRbNV0pLEsodSkpO24uYmluZChuLiRtYWluQXR0YWNobWVudE9iamVjdCl9KShlLHQscixpLGEscyxvLGwpfWNvbnRhaW5lckRyYXdDYWNoZWRGaWx0ZXIoZSx0LHIsaSxhLHMpeygoZSx0LHIsaSxhLHMpPT57aWYoeW4uZ2V0KGEsImZLZXkiKSE9PXMpcmV0dXJuO2NvbnN0IG89eW4uZ2V0KGEsImZUZXh0dXJlIik7aWYoIW8pcmV0dXJuO2NvbnN0IGw9TWF0aC5zcXJ0KHRbMF0qdFswXSt0WzFdKnRbMV0pLGM9TWF0aC5zcXJ0KHRbMl0qdFsyXSt0WzNdKnRbM10pLHU9RixmPWlbMF0qKGwvdSksZD1pWzFdKihjL3UpO24uZHJhd0FycmF5c0luc3RhbmNlZCgpLG4ucmVzZXQoKSxuLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj1lLGduKG8scixmK3RbNF0sZCt0WzVdKX0pKGUsdCxyLGksYSxzKX1hc3luYyBjcmVhdGVJbWFnZUJpdG1hcChlLHQpe3JldHVybiBhd2FpdChhc3luYyhlLHQpPT57Y29uc3QgaT1tcigwLDAsZSx0KTtrZShpKSxyLmJpbmRGcmFtZWJ1ZmZlcihyLkZSQU1FQlVGRkVSLG9lKSxyLmZyYW1lYnVmZmVyVGV4dHVyZTJEKHIuRlJBTUVCVUZGRVIsci5DT0xPUl9BVFRBQ0hNRU5UMCxyLlRFWFRVUkVfMkQsaS5yZXNvdXJjZSwwKTtjb25zdCBhPW5ldyBVaW50OEFycmF5KGUqdCo0KSxzPW4uJG1haW5BdHRhY2htZW50T2JqZWN0O2EuYnl0ZUxlbmd0aD5YbiYmKFhuPXAoYS5ieXRlTGVuZ3RoKSxyLmJ1ZmZlckRhdGEoci5QSVhFTF9QQUNLX0JVRkZFUixYbixyLlNUUkVBTV9SRUFEKSksci5yZWFkUGl4ZWxzKDAscy5oZWlnaHQtdCxlLHQsci5SR0JBLHIuVU5TSUdORURfQllURSwwKTtjb25zdCBvPXIuZmVuY2VTeW5jKHIuU1lOQ19HUFVfQ09NTUFORFNfQ09NUExFVEUsMCk7YXdhaXQgbmV3IFByb21pc2UoZT0+e2NvbnN0IHQ9KCk9PntpZihyLmNsaWVudFdhaXRTeW5jKG8sci5TWU5DX0ZMVVNIX0NPTU1BTkRTX0JJVCwwKSE9PXIuVElNRU9VVF9FWFBJUkVEKXJldHVybiByLmRlbGV0ZVN5bmMobyksci5nZXRCdWZmZXJTdWJEYXRhKHIuUElYRUxfUEFDS19CVUZGRVIsMCxhKSxlKCk7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHQpfTt0KCl9KSxyLmJpbmRGcmFtZWJ1ZmZlcihyLkZSQU1FQlVGRkVSLFopO2ZvcihsZXQgZT0wO2U8YS5sZW5ndGg7ZSs9NCl7Y29uc3QgdD1hW2UrM107aWYoMD09PXR8fDI1NT09PXQpY29udGludWU7Y29uc3Qgcj1Zblt0XTthW2VdPU1hdGgubWluKDI1NSxNYXRoLnJvdW5kKGFbZV0qcikpLGFbZSsxXT1NYXRoLm1pbigyNTUsTWF0aC5yb3VuZChhW2UrMV0qcikpLGFbZSsyXT1NYXRoLm1pbigyNTUsTWF0aC5yb3VuZChhW2UrMl0qcikpfXJldHVybiBhd2FpdCBjcmVhdGVJbWFnZUJpdG1hcChuZXcgSW1hZ2VEYXRhKG5ldyBVaW50OENsYW1wZWRBcnJheShhKSxlLHQpLHtpbWFnZU9yaWVudGF0aW9uOiJmbGlwWSIscHJlbXVsdGlwbHlBbHBoYToibm9uZSIsY29sb3JTcGFjZUNvbnZlcnNpb246Im5vbmUifSl9KShlLHQpfX07Y2xhc3MgSG57c3RhdGljIHNldERldmljZShlKXtIbi5kZXZpY2U9ZX1zdGF0aWMgZ2V0RGV2aWNlKCl7aWYoIUhuLmRldmljZSl0aHJvdyBuZXcgRXJyb3IoIkdQVURldmljZSBpcyBub3QgaW5pdGlhbGl6ZWQiKTtyZXR1cm4gSG4uZGV2aWNlfXN0YXRpYyBzZXREZXZpY2VQaXhlbFJhdGlvKGUpe0huLmRldmljZVBpeGVsUmF0aW89ZX1zdGF0aWMgZ2V0RGV2aWNlUGl4ZWxSYXRpbygpe3JldHVybiBIbi5kZXZpY2VQaXhlbFJhdGlvfXN0YXRpYyBzZXRSZW5kZXJNYXhTaXplKGUpe0huLnJlbmRlck1heFNpemU9ZX1zdGF0aWMgZ2V0UmVuZGVyTWF4U2l6ZSgpe3JldHVybiBIbi5yZW5kZXJNYXhTaXplfXN0YXRpYyBjcmVhdGVGbG9hdDMyQXJyYXkoZSl7cmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoZSl9c3RhdGljIGNyZWF0ZUFycmF5KCl7cmV0dXJuW119c3RhdGljIGdldEZsb2F0MzJBcnJheTQoKXtyZXR1cm4gSG4uZmxvYXQzMkFycmF5NFBvb2wubGVuZ3RoPjA/SG4uZmxvYXQzMkFycmF5NFBvb2wucG9wKCk6bmV3IEZsb2F0MzJBcnJheSg0KX1zdGF0aWMgcG9vbEZsb2F0MzJBcnJheTQoZSl7ND09PWUubGVuZ3RoJiZIbi5mbG9hdDMyQXJyYXk0UG9vbC5wdXNoKGUpfX1PYmplY3QuZGVmaW5lUHJvcGVydHkoSG4sImRldmljZSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOm51bGx9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoSG4sImRldmljZVBpeGVsUmF0aW8iLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZToxfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEhuLCJyZW5kZXJNYXhTaXplIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ODE5Mn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShIbiwiZmxvYXQzMkFycmF5NFBvb2wiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpbXX0pO2xldCBRbj1udWxsO2NvbnN0IFpuPShlLHQscixuLGk9LjI1KT0+e2NvbnN0IGE9W10scz0oZSx0LHIsbixvKT0+e2NvbnN0IGw9KChlLHQscixuKT0+e2NvbnN0IGk9bi54LWUueCxhPW4ueS1lLnkscz1pKmkrYSphO2lmKHM8MWUtMTApe2NvbnN0IG49KHQueC1lLngpKih0LngtZS54KSsodC55LWUueSkqKHQueS1lLnkpLGk9KHIueC1lLngpKihyLngtZS54KSsoci55LWUueSkqKHIueS1lLnkpO3JldHVybiBNYXRoLm1heChuLGkpfWNvbnN0IG89KHQueC1lLngpKmEtKHQueS1lLnkpKmksbD1vKm8vcyxjPShyLngtZS54KSphLShyLnktZS55KSppLHU9YypjL3M7cmV0dXJuIE1hdGgubWF4KGwsdSl9KShlLHQscixuKTtpZihsPD1pfHxvPj04KXtjb25zdCBlPXt4Oi41Kih0Lngrci54KSx5Oi41Kih0Lnkrci55KX07cmV0dXJuIHZvaWQgYS5wdXNoKHtjdHJsOmUsZW5kOm59KX1jb25zdCBjPSgoZSx0LHIsbik9Pntjb25zdCBpPXt4Oi41KihlLngrdC54KSx5Oi41KihlLnkrdC55KX0sYT0uNSoodC54K3IueCkscz0uNSoodC55K3IueSksbz17eDouNSooci54K24ueCkseTouNSooci55K24ueSl9LGw9e3g6LjUqKGkueCthKSx5Oi41KihpLnkrcyl9LGM9e3g6LjUqKGErby54KSx5Oi41KihzK28ueSl9LHU9e3g6LjUqKGwueCtjLngpLHk6LjUqKGwueStjLnkpfTtyZXR1cm57Zmlyc3Q6W2UsaSxsLHVdLHNlY29uZDpbdSxjLG8sbl19fSkoZSx0LHIsbik7cyhjLmZpcnN0WzBdLGMuZmlyc3RbMV0sYy5maXJzdFsyXSxjLmZpcnN0WzNdLG8rMSkscyhjLnNlY29uZFswXSxjLnNlY29uZFsxXSxjLnNlY29uZFsyXSxjLnNlY29uZFszXSxvKzEpfTtyZXR1cm4gcyhlLHQscixuLDApLGF9O2NsYXNzIEpue2NvbnN0cnVjdG9yKCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRjdXJyZW50UGF0aCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkdmVydGljZXMiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJGN1cnJlbnRYIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRjdXJyZW50WSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkc3RhcnRYIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRzdGFydFkiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJGZsYXRuZXNzVGhyZXNob2xkIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6LjI1fSksdGhpcy4kY3VycmVudFBhdGg9W10sdGhpcy4kdmVydGljZXM9W10sdGhpcy4kY3VycmVudFg9MCx0aGlzLiRjdXJyZW50WT0wLHRoaXMuJHN0YXJ0WD0wLHRoaXMuJHN0YXJ0WT0wfWJlZ2luUGF0aCgpe3RoaXMuJGN1cnJlbnRQYXRoPVtdLHRoaXMuJHZlcnRpY2VzPVtdLHRoaXMuJGN1cnJlbnRYPTAsdGhpcy4kY3VycmVudFk9MCx0aGlzLiRzdGFydFg9MCx0aGlzLiRzdGFydFk9MH1tb3ZlVG8oZSx0KXt0aGlzLiRjdXJyZW50UGF0aC5sZW5ndGg+PTYmJnRoaXMuJHZlcnRpY2VzLnB1c2godGhpcy4kY3VycmVudFBhdGgpLHRoaXMuJGN1cnJlbnRQYXRoPVtlLHQsITFdLHRoaXMuJGN1cnJlbnRYPWUsdGhpcy4kY3VycmVudFk9dCx0aGlzLiRzdGFydFg9ZSx0aGlzLiRzdGFydFk9dH1saW5lVG8oZSx0KXtlPT09dGhpcy4kY3VycmVudFgmJnQ9PT10aGlzLiRjdXJyZW50WXx8KHRoaXMuJGN1cnJlbnRQYXRoLnB1c2goZSx0LCExKSx0aGlzLiRjdXJyZW50WD1lLHRoaXMuJGN1cnJlbnRZPXQpfXF1YWRyYXRpY0N1cnZlVG8oZSx0LHIsbil7dGhpcy4kY3VycmVudFBhdGgucHVzaChlLHQsITApLHRoaXMuJGN1cnJlbnRQYXRoLnB1c2gocixuLCExKSx0aGlzLiRjdXJyZW50WD1yLHRoaXMuJGN1cnJlbnRZPW59c2V0U2NhbGUoZSl7dGhpcy4kZmxhdG5lc3NUaHJlc2hvbGQ9KGU9Pntjb25zdCB0PS4yNS8oZSplKTtyZXR1cm4gTWF0aC5tYXgoLjA2MjUsTWF0aC5taW4oNCx0KSl9KShlKX1iZXppZXJDdXJ2ZVRvKGUsdCxyLG4saSxhKXtjb25zdCBzPXt4OnRoaXMuJGN1cnJlbnRYLHk6dGhpcy4kY3VycmVudFl9LG89Wm4ocyx7eDplLHk6dH0se3g6cix5Om59LHt4OmkseTphfSx0aGlzLiRmbGF0bmVzc1RocmVzaG9sZCk7Zm9yKGNvbnN0IGUgb2Ygbyl0aGlzLiRjdXJyZW50UGF0aC5wdXNoKGUuY3RybC54LGUuY3RybC55LCEwKSx0aGlzLiRjdXJyZW50UGF0aC5wdXNoKGUuZW5kLngsZS5lbmQueSwhMSk7dGhpcy4kY3VycmVudFg9aSx0aGlzLiRjdXJyZW50WT1hfWFyYyhlLHQscil7Y29uc3Qgbj1yLGk9LjU1MjI4NDc0OTgzMDc5MzYqcjt0aGlzLmJlemllckN1cnZlVG8oZStuLHQraSxlK2ksdCtuLGUsdCtuKSx0aGlzLmJlemllckN1cnZlVG8oZS1pLHQrbixlLW4sdCtpLGUtbix0KSx0aGlzLmJlemllckN1cnZlVG8oZS1uLHQtaSxlLWksdC1uLGUsdC1uKSx0aGlzLmJlemllckN1cnZlVG8oZStpLHQtbixlK24sdC1pLGUrbix0KTtjb25zdCBhPXRoaXMuJGN1cnJlbnRQYXRoLmxlbmd0aDthPj0zJiYodGhpcy4kY3VycmVudFBhdGhbYS0zXT10aGlzLiRzdGFydFgsdGhpcy4kY3VycmVudFBhdGhbYS0yXT10aGlzLiRzdGFydFkpLHRoaXMuJGN1cnJlbnRYPXRoaXMuJHN0YXJ0WCx0aGlzLiRjdXJyZW50WT10aGlzLiRzdGFydFl9Y2xvc2VQYXRoKCl7dGhpcy4kY3VycmVudFBhdGgubGVuZ3RoPj0zJiYodGhpcy4kY3VycmVudFg9PT10aGlzLiRzdGFydFgmJnRoaXMuJGN1cnJlbnRZPT09dGhpcy4kc3RhcnRZfHx0aGlzLiRjdXJyZW50UGF0aC5wdXNoKHRoaXMuJHN0YXJ0WCx0aGlzLiRzdGFydFksITEpKX1nZXQgJGdldFZlcnRpY2VzKCl7Y29uc3QgZT1bLi4udGhpcy4kdmVydGljZXNdO3JldHVybiB0aGlzLiRjdXJyZW50UGF0aC5sZW5ndGg+PTkmJmUucHVzaCh0aGlzLiRjdXJyZW50UGF0aCksZX1nZW5lcmF0ZVZlcnRpY2VzKCl7Y29uc3QgZT10aGlzLiRnZXRWZXJ0aWNlcyx0PVtdO2Zvcihjb25zdCByIG9mIGUpe2lmKHIubGVuZ3RoPDkpY29udGludWU7Y29uc3QgZT1bXTtmb3IobGV0IHQ9MDt0PHIubGVuZ3RoO3QrPTMpZS5wdXNoKHt4OnJbdF0seTpyW3QrMV19KTtmb3IobGV0IHI9MTtyPGUubGVuZ3RoLTE7cisrKXQucHVzaChlWzBdLngsZVswXS55LGVbcl0ueCxlW3JdLnksZVtyKzFdLngsZVtyKzFdLnkpfXJldHVybiBuZXcgRmxvYXQzMkFycmF5KHQpfWdldEN1cnJlbnRQYXRoKCl7Y29uc3QgZT1bXTtmb3IobGV0IHQ9MDt0PHRoaXMuJGN1cnJlbnRQYXRoLmxlbmd0aDt0Kz0zKWUucHVzaCh7eDp0aGlzLiRjdXJyZW50UGF0aFt0XSx5OnRoaXMuJGN1cnJlbnRQYXRoW3QrMV19KTtyZXR1cm4gZX1nZXRBbGxQYXRocygpe2NvbnN0IGU9W107Zm9yKGNvbnN0IHQgb2YgdGhpcy4kdmVydGljZXMpe2NvbnN0IHI9W107Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKz0zKXIucHVzaCh7eDp0W2VdLHk6dFtlKzFdfSk7ci5sZW5ndGg+MCYmZS5wdXNoKHIpfWlmKHRoaXMuJGN1cnJlbnRQYXRoLmxlbmd0aD49Myl7Y29uc3QgdD1bXTtmb3IobGV0IGU9MDtlPHRoaXMuJGN1cnJlbnRQYXRoLmxlbmd0aDtlKz0zKXQucHVzaCh7eDp0aGlzLiRjdXJyZW50UGF0aFtlXSx5OnRoaXMuJGN1cnJlbnRQYXRoW2UrMV19KTt0Lmxlbmd0aD4wJiZlLnB1c2godCl9cmV0dXJuIGV9Z2V0VmVydGljZXNGb3JTdHJva2UoKXtjb25zdCBlPVsuLi50aGlzLiR2ZXJ0aWNlc107cmV0dXJuIHRoaXMuJGN1cnJlbnRQYXRoLmxlbmd0aD49NiYmZS5wdXNoKHRoaXMuJGN1cnJlbnRQYXRoKSxlfXJlc2V0KCl7dGhpcy4kY3VycmVudFBhdGg9W10sdGhpcy4kdmVydGljZXM9W10sdGhpcy4kY3VycmVudFg9MCx0aGlzLiRjdXJyZW50WT0wLHRoaXMuJHN0YXJ0WD0wLHRoaXMuJHN0YXJ0WT0wfX1jb25zdCBlaT0oZSx0KT0+e2NvbnN0IHI9dC5zaXplO2xldCBuPWUuZ2V0KHIpO258fChuPVtdLGUuc2V0KHIsbikpLG4ubGVuZ3RoPj0zMj90LmRlc3Ryb3koKTpuLnB1c2godCl9LHRpPShlLHQpPT57Y29uc3Qgcj10LnNpemU7bGV0IG49ZS5nZXQocik7bnx8KG49W10sZS5zZXQocixuKSksbi5sZW5ndGg+PTMyP3QuZGVzdHJveSgpOm4ucHVzaCh0KX0scmk9KGUsdCxyLG4pPT57Y29uc3QgaT0yNTYqTWF0aC5jZWlsKHIvMjU2KTtsZXQgYT1udWxsLHM9MS8wO2Zvcihjb25zdCBlIG9mIHQpaWYoIWUuaW5Vc2UmJmUuc2l6ZT49aSl7Y29uc3QgdD1lLnNpemUtaTt0PHMmJihhPWUscz10KX1pZihhKXJldHVybiBhLmluVXNlPSEwLGEubGFzdFVzZWRGcmFtZT1uLGEuYnVmZmVyO2NvbnN0IG89TWF0aC5tYXgoaSwxNjM4NCksbD0oKGUsdCk9PmUuY3JlYXRlQnVmZmVyKHtzaXplOnQuc2l6ZSx1c2FnZTp0LnVzYWdlfEdQVUJ1ZmZlclVzYWdlLlNUT1JBR0V8R1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1R8R1BVQnVmZmVyVXNhZ2UuVkVSVEVYLGxhYmVsOnQubGFiZWx8fCJzdG9yYWdlX2J1ZmZlciJ9KSkoZSx7c2l6ZTpvLHVzYWdlOkdQVUJ1ZmZlclVzYWdlLlNUT1JBR0V8R1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1R8R1BVQnVmZmVyVXNhZ2UuVkVSVEVYLGxhYmVsOmBzdG9yYWdlX2J1ZmZlcl8ke3QubGVuZ3RofWB9KTtyZXR1cm4gdC5wdXNoKHtidWZmZXI6bCxzaXplOm8saW5Vc2U6ITAsbGFzdFVzZWRGcmFtZTpufSksbH0sbmk9KGUsdCxyLG49MCxpPTApPT57Y29uc3QgYT1uZXcgVWludDMyQXJyYXkoW3QscixuLGldKSxzPWUuY3JlYXRlQnVmZmVyKHtzaXplOmEuYnl0ZUxlbmd0aCx1c2FnZTpHUFVCdWZmZXJVc2FnZS5JTkRJUkVDVHxHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVCxtYXBwZWRBdENyZWF0aW9uOiEwLGxhYmVsOiJpbmRpcmVjdF9idWZmZXIifSk7cmV0dXJuIG5ldyBVaW50MzJBcnJheShzLmdldE1hcHBlZFJhbmdlKCkpLnNldChhKSxzLnVubWFwKCksc30saWk9KGUsdCxyLG4saT0wLGE9MCk9Pntjb25zdCBzPW5ldyBVaW50MzJBcnJheShbcixuLGksYV0pO2UucXVldWUud3JpdGVCdWZmZXIodCwwLHMpfTtjbGFzcyBhaXtjb25zdHJ1Y3RvcihlLHQ9NjU1MzYpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJkZXZpY2UiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiYnVmZmVyIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bnVsbH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJvZmZzZXQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTowfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImNhcGFjaXR5Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImFsaWdubWVudCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOjI1Nn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJwZW5kaW5nRGVzdHJveUJ1ZmZlcnMiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpbXX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJzdGFnaW5nQnVmZmVyIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInN0YWdpbmdGbG9hdDMyIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImRpcnR5RW5kIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6MH0pLHRoaXMuZGV2aWNlPWUsdGhpcy5jYXBhY2l0eT10LHRoaXMuc3RhZ2luZ0J1ZmZlcj1uZXcgQXJyYXlCdWZmZXIodCksdGhpcy5zdGFnaW5nRmxvYXQzMj1uZXcgRmxvYXQzMkFycmF5KHRoaXMuc3RhZ2luZ0J1ZmZlcil9cmVzZXRGcmFtZSgpe3RoaXMub2Zmc2V0PTAsdGhpcy5kaXJ0eUVuZD0wO2Zvcihjb25zdCBlIG9mIHRoaXMucGVuZGluZ0Rlc3Ryb3lCdWZmZXJzKWUuZGVzdHJveSgpO3RoaXMucGVuZGluZ0Rlc3Ryb3lCdWZmZXJzLmxlbmd0aD0wfWdldEJ1ZmZlcigpe3JldHVybiB0aGlzLmJ1ZmZlcnx8KHRoaXMuYnVmZmVyPXRoaXMuZGV2aWNlLmNyZWF0ZUJ1ZmZlcih7c2l6ZTp0aGlzLmNhcGFjaXR5LHVzYWdlOkdQVUJ1ZmZlclVzYWdlLlVOSUZPUk18R1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1R9KSksdGhpcy5idWZmZXJ9YWxsb2NhdGUoZSl7dGhpcy5idWZmZXJ8fHRoaXMuZ2V0QnVmZmVyKCk7Y29uc3QgdD10aGlzLm9mZnNldCxyPWUuYnl0ZUxlbmd0aDtpZih0K3I+dGhpcy5jYXBhY2l0eSl7dGhpcy5mbHVzaCgpLHRoaXMuY2FwYWNpdHkqPTI7Y29uc3QgZT10aGlzLmJ1ZmZlcjt0aGlzLmJ1ZmZlcj10aGlzLmRldmljZS5jcmVhdGVCdWZmZXIoe3NpemU6dGhpcy5jYXBhY2l0eSx1c2FnZTpHUFVCdWZmZXJVc2FnZS5VTklGT1JNfEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNUfSksZSYmdGhpcy5wZW5kaW5nRGVzdHJveUJ1ZmZlcnMucHVzaChlKSx0aGlzLnN0YWdpbmdCdWZmZXI9bmV3IEFycmF5QnVmZmVyKHRoaXMuY2FwYWNpdHkpLHRoaXMuc3RhZ2luZ0Zsb2F0MzI9bmV3IEZsb2F0MzJBcnJheSh0aGlzLnN0YWdpbmdCdWZmZXIpfXRoaXMuc3RhZ2luZ0Zsb2F0MzIuc2V0KGUsdC80KTtjb25zdCBuPXQrcjtyZXR1cm4gbj50aGlzLmRpcnR5RW5kJiYodGhpcy5kaXJ0eUVuZD1uKSx0aGlzLm9mZnNldD10K01hdGguY2VpbChyL3RoaXMuYWxpZ25tZW50KSp0aGlzLmFsaWdubWVudCx0fWZsdXNoKCl7dGhpcy5kaXJ0eUVuZD4wJiZ0aGlzLmJ1ZmZlciYmKHRoaXMuZGV2aWNlLnF1ZXVlLndyaXRlQnVmZmVyKHRoaXMuYnVmZmVyLDAsdGhpcy5zdGFnaW5nQnVmZmVyLDAsdGhpcy5kaXJ0eUVuZCksdGhpcy5kaXJ0eUVuZD0wKX1kaXNwb3NlKCl7dGhpcy5idWZmZXImJih0aGlzLmJ1ZmZlci5kZXN0cm95KCksdGhpcy5idWZmZXI9bnVsbCk7Zm9yKGNvbnN0IGUgb2YgdGhpcy5wZW5kaW5nRGVzdHJveUJ1ZmZlcnMpZS5kZXN0cm95KCk7dGhpcy5wZW5kaW5nRGVzdHJveUJ1ZmZlcnMubGVuZ3RoPTB9fWNsYXNzIHNpe2NvbnN0cnVjdG9yKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJkZXZpY2UiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywidmVydGV4QnVmZmVycyIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJ1bmlmb3JtQnVmZmVycyIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJ2ZXJ0ZXhCdWZmZXJCdWNrZXRzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInVuaWZvcm1CdWZmZXJCdWNrZXRzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInN0b3JhZ2VCdWZmZXJQb29sIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImluZGlyZWN0QnVmZmVyIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImluZGlyZWN0QnVmZmVyUG9vbCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJmcmFtZUluZGlyZWN0QnVmZmVycyIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJmcmFtZU51bWJlciIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJ1bml0UmVjdEJ1ZmZlciIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJmcmFtZVZlcnRleFBvb2xCdWZmZXJzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImZyYW1lVW5pZm9ybVBvb2xCdWZmZXJzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImR5bmFtaWNVbmlmb3JtIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksdGhpcy5kZXZpY2U9ZSx0aGlzLnZlcnRleEJ1ZmZlcnM9bmV3IE1hcCx0aGlzLnVuaWZvcm1CdWZmZXJzPW5ldyBNYXAsdGhpcy52ZXJ0ZXhCdWZmZXJCdWNrZXRzPW5ldyBNYXAsdGhpcy51bmlmb3JtQnVmZmVyQnVja2V0cz1uZXcgTWFwLHRoaXMuc3RvcmFnZUJ1ZmZlclBvb2w9W10sdGhpcy5pbmRpcmVjdEJ1ZmZlcj1udWxsLHRoaXMuaW5kaXJlY3RCdWZmZXJQb29sPVtdLHRoaXMuZnJhbWVJbmRpcmVjdEJ1ZmZlcnM9W10sdGhpcy5mcmFtZU51bWJlcj0wLHRoaXMudW5pdFJlY3RCdWZmZXI9bnVsbCx0aGlzLmZyYW1lVmVydGV4UG9vbEJ1ZmZlcnM9W10sdGhpcy5mcmFtZVVuaWZvcm1Qb29sQnVmZmVycz1bXSx0aGlzLmR5bmFtaWNVbmlmb3JtPW5ldyBhaShlKX1jcmVhdGVWZXJ0ZXhCdWZmZXIoZSx0KXtjb25zdCByPXRoaXMuZGV2aWNlLmNyZWF0ZUJ1ZmZlcih7c2l6ZTp0LmJ5dGVMZW5ndGgsdXNhZ2U6R1BVQnVmZmVyVXNhZ2UuVkVSVEVYfEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNULG1hcHBlZEF0Q3JlYXRpb246ITB9KTtyZXR1cm4gbmV3IEZsb2F0MzJBcnJheShyLmdldE1hcHBlZFJhbmdlKCkpLnNldCh0KSxyLnVubWFwKCksdGhpcy52ZXJ0ZXhCdWZmZXJzLnNldChlLHIpLHJ9Y3JlYXRlVW5pZm9ybUJ1ZmZlcihlLHQpe2NvbnN0IHI9dGhpcy5kZXZpY2UuY3JlYXRlQnVmZmVyKHtzaXplOnQsdXNhZ2U6R1BVQnVmZmVyVXNhZ2UuVU5JRk9STXxHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVH0pO3JldHVybiB0aGlzLnVuaWZvcm1CdWZmZXJzLnNldChlLHIpLHJ9dXBkYXRlVW5pZm9ybUJ1ZmZlcihlLHQpe2NvbnN0IHI9dGhpcy51bmlmb3JtQnVmZmVycy5nZXQoZSk7ciYmdGhpcy5kZXZpY2UucXVldWUud3JpdGVCdWZmZXIociwwLHQuYnVmZmVyLHQuYnl0ZU9mZnNldCx0LmJ5dGVMZW5ndGgpfWdldFZlcnRleEJ1ZmZlcihlKXtyZXR1cm4gdGhpcy52ZXJ0ZXhCdWZmZXJzLmdldChlKX1nZXRVbmlmb3JtQnVmZmVyKGUpe3JldHVybiB0aGlzLnVuaWZvcm1CdWZmZXJzLmdldChlKX1jcmVhdGVSZWN0VmVydGljZXMoZSx0LHIsbil7cmV0dXJuKChlLHQscixuKT0+bmV3IEZsb2F0MzJBcnJheShbZSx0LDAsMCxlK3IsdCwxLDAsZSx0K24sMCwxLGUrcix0LDEsMCxlK3IsdCtuLDEsMSxlLHQrbiwwLDFdKSkoZSx0LHIsbil9YWNxdWlyZVZlcnRleEJ1ZmZlcihlLHQpe2NvbnN0IHI9KChlLHQscixuKT0+e2NvbnN0IGk9KGE9cixhLS0sYXw9YT4+MSxhfD1hPj4yLGF8PWE+PjQsYXw9YT4+OCwxKyhhfD1hPj4xNikpO3ZhciBhO2NvbnN0IHM9dC5nZXQoaSk7bGV0IG87cmV0dXJuIHMmJnMubGVuZ3RoPjA/KG89cy5wb3AoKSxuJiZlLnF1ZXVlLndyaXRlQnVmZmVyKG8sMCxuLmJ1ZmZlcixuLmJ5dGVPZmZzZXQsbi5ieXRlTGVuZ3RoKSk6bj8obz1lLmNyZWF0ZUJ1ZmZlcih7c2l6ZTppLHVzYWdlOkdQVUJ1ZmZlclVzYWdlLlZFUlRFWHxHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVCxtYXBwZWRBdENyZWF0aW9uOiEwfSksbmV3IEZsb2F0MzJBcnJheShvLmdldE1hcHBlZFJhbmdlKCkpLnNldChuKSxvLnVubWFwKCkpOm89ZS5jcmVhdGVCdWZmZXIoe3NpemU6aSx1c2FnZTpHUFVCdWZmZXJVc2FnZS5WRVJURVh8R1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1R9KSxvfSkodGhpcy5kZXZpY2UsdGhpcy52ZXJ0ZXhCdWZmZXJCdWNrZXRzLGUsdCk7cmV0dXJuIHRoaXMuZnJhbWVWZXJ0ZXhQb29sQnVmZmVycy5wdXNoKHIpLHJ9cmVsZWFzZVZlcnRleEJ1ZmZlcihlKXtlaSh0aGlzLnZlcnRleEJ1ZmZlckJ1Y2tldHMsZSl9YWNxdWlyZVVuaWZvcm1CdWZmZXIoZSl7Y29uc3QgdD0oKGUsdCxyKT0+e2NvbnN0IG49MTYqTWF0aC5jZWlsKHIvMTYpLGk9dC5nZXQobik7cmV0dXJuIGkmJmkubGVuZ3RoPjA/aS5wb3AoKTplLmNyZWF0ZUJ1ZmZlcih7c2l6ZTpuLHVzYWdlOkdQVUJ1ZmZlclVzYWdlLlVOSUZPUk18R1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1R9KX0pKHRoaXMuZGV2aWNlLHRoaXMudW5pZm9ybUJ1ZmZlckJ1Y2tldHMsZSk7cmV0dXJuIHRoaXMuZnJhbWVVbmlmb3JtUG9vbEJ1ZmZlcnMucHVzaCh0KSx0fWFjcXVpcmVBbmRXcml0ZVVuaWZvcm1CdWZmZXIoZSx0KXtjb25zdCByPXQ/P2UuYnl0ZUxlbmd0aCxuPXRoaXMuYWNxdWlyZVVuaWZvcm1CdWZmZXIocik7cmV0dXJuIHRoaXMuZGV2aWNlLnF1ZXVlLndyaXRlQnVmZmVyKG4sMCxlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsciksbn1yZWxlYXNlVW5pZm9ybUJ1ZmZlcihlKXt0aSh0aGlzLnVuaWZvcm1CdWZmZXJCdWNrZXRzLGUpfWRlc3Ryb3lCdWZmZXIoZSl7Y29uc3QgdD10aGlzLnZlcnRleEJ1ZmZlcnMuZ2V0KGUpO3QmJih0LmRlc3Ryb3koKSx0aGlzLnZlcnRleEJ1ZmZlcnMuZGVsZXRlKGUpKTtjb25zdCByPXRoaXMudW5pZm9ybUJ1ZmZlcnMuZ2V0KGUpO3ImJihyLmRlc3Ryb3koKSx0aGlzLnVuaWZvcm1CdWZmZXJzLmRlbGV0ZShlKSl9ZGlzcG9zZSgpe2Zvcihjb25zdCBlIG9mIHRoaXMudmVydGV4QnVmZmVycy52YWx1ZXMoKSllLmRlc3Ryb3koKTt0aGlzLnZlcnRleEJ1ZmZlcnMuY2xlYXIoKTtmb3IoY29uc3QgZSBvZiB0aGlzLnVuaWZvcm1CdWZmZXJzLnZhbHVlcygpKWUuZGVzdHJveSgpO3RoaXMudW5pZm9ybUJ1ZmZlcnMuY2xlYXIoKTtmb3IoY29uc3QgZSBvZiB0aGlzLnZlcnRleEJ1ZmZlckJ1Y2tldHMudmFsdWVzKCkpZm9yKGNvbnN0IHQgb2YgZSl0LmRlc3Ryb3koKTt0aGlzLnZlcnRleEJ1ZmZlckJ1Y2tldHMuY2xlYXIoKTtmb3IoY29uc3QgZSBvZiB0aGlzLnVuaWZvcm1CdWZmZXJCdWNrZXRzLnZhbHVlcygpKWZvcihjb25zdCB0IG9mIGUpdC5kZXN0cm95KCk7dGhpcy51bmlmb3JtQnVmZmVyQnVja2V0cy5jbGVhcigpO2Zvcihjb25zdCBlIG9mIHRoaXMuc3RvcmFnZUJ1ZmZlclBvb2wpZS5idWZmZXIuZGVzdHJveSgpO3RoaXMuc3RvcmFnZUJ1ZmZlclBvb2w9W10sdGhpcy5pbmRpcmVjdEJ1ZmZlciYmKHRoaXMuaW5kaXJlY3RCdWZmZXIuZGVzdHJveSgpLHRoaXMuaW5kaXJlY3RCdWZmZXI9bnVsbCk7Zm9yKGNvbnN0IGUgb2YgdGhpcy5pbmRpcmVjdEJ1ZmZlclBvb2wpZS5kZXN0cm95KCk7dGhpcy5pbmRpcmVjdEJ1ZmZlclBvb2w9W107Zm9yKGNvbnN0IGUgb2YgdGhpcy5mcmFtZUluZGlyZWN0QnVmZmVycyllLmRlc3Ryb3koKTt0aGlzLmZyYW1lSW5kaXJlY3RCdWZmZXJzPVtdLHRoaXMudW5pdFJlY3RCdWZmZXImJih0aGlzLnVuaXRSZWN0QnVmZmVyLmRlc3Ryb3koKSx0aGlzLnVuaXRSZWN0QnVmZmVyPW51bGwpLHRoaXMuZnJhbWVWZXJ0ZXhQb29sQnVmZmVycy5sZW5ndGg9MCx0aGlzLmZyYW1lVW5pZm9ybVBvb2xCdWZmZXJzLmxlbmd0aD0wLHRoaXMuZHluYW1pY1VuaWZvcm0uZGlzcG9zZSgpfWdldFBvb2xTdGF0cygpe2xldCBlPTA7Zm9yKGNvbnN0IHQgb2YgdGhpcy52ZXJ0ZXhCdWZmZXJCdWNrZXRzLnZhbHVlcygpKWUrPXQubGVuZ3RoO2xldCB0PTA7Zm9yKGNvbnN0IGUgb2YgdGhpcy51bmlmb3JtQnVmZmVyQnVja2V0cy52YWx1ZXMoKSl0Kz1lLmxlbmd0aDtyZXR1cm57dmVydGV4UG9vbFNpemU6ZSx1bmlmb3JtUG9vbFNpemU6dH19Y2xlYXJGcmFtZUJ1ZmZlcnMoKXtmb3IoY29uc3QgZSBvZiB0aGlzLnZlcnRleEJ1ZmZlcnMudmFsdWVzKCkpZS5kZXN0cm95KCk7dGhpcy52ZXJ0ZXhCdWZmZXJzLmNsZWFyKCk7Zm9yKGNvbnN0IGUgb2YgdGhpcy51bmlmb3JtQnVmZmVycy52YWx1ZXMoKSllLmRlc3Ryb3koKTt0aGlzLnVuaWZvcm1CdWZmZXJzLmNsZWFyKCk7Zm9yKGNvbnN0IGUgb2YgdGhpcy5mcmFtZVZlcnRleFBvb2xCdWZmZXJzKWVpKHRoaXMudmVydGV4QnVmZmVyQnVja2V0cyxlKTt0aGlzLmZyYW1lVmVydGV4UG9vbEJ1ZmZlcnMubGVuZ3RoPTA7Zm9yKGNvbnN0IGUgb2YgdGhpcy5mcmFtZVVuaWZvcm1Qb29sQnVmZmVycyl0aSh0aGlzLnVuaWZvcm1CdWZmZXJCdWNrZXRzLGUpO3RoaXMuZnJhbWVVbmlmb3JtUG9vbEJ1ZmZlcnMubGVuZ3RoPTA7Zm9yKGNvbnN0IGUgb2YgdGhpcy5mcmFtZUluZGlyZWN0QnVmZmVycyl0aGlzLmluZGlyZWN0QnVmZmVyUG9vbC5wdXNoKGUpO3RoaXMuZnJhbWVJbmRpcmVjdEJ1ZmZlcnMubGVuZ3RoPTAsdGhpcy5yZWxlYXNlQWxsU3RvcmFnZUJ1ZmZlcnMoKSx0aGlzLmR5bmFtaWNVbmlmb3JtLnJlc2V0RnJhbWUoKSx0aGlzLmZyYW1lTnVtYmVyKyssdGhpcy5mcmFtZU51bWJlciU2MD09MCYmKChlLHQscj02MCk9Pntmb3IobGV0IG49ZS5sZW5ndGgtMTtuPj0wO24tLSl7Y29uc3QgaT1lW25dOyFpLmluVXNlJiZ0LWkubGFzdFVzZWRGcmFtZT5yJiYoaS5idWZmZXIuZGVzdHJveSgpLGUuc3BsaWNlKG4sMSkpfX0pKHRoaXMuc3RvcmFnZUJ1ZmZlclBvb2wsdGhpcy5mcmFtZU51bWJlcil9cmVsZWFzZUFsbFN0b3JhZ2VCdWZmZXJzKCl7Zm9yKGNvbnN0IGUgb2YgdGhpcy5zdG9yYWdlQnVmZmVyUG9vbCllLmluVXNlPSExfWFjcXVpcmVTdG9yYWdlQnVmZmVyKGUpe3JldHVybiByaSh0aGlzLmRldmljZSx0aGlzLnN0b3JhZ2VCdWZmZXJQb29sLGUsdGhpcy5mcmFtZU51bWJlcil9cmVsZWFzZVN0b3JhZ2VCdWZmZXIoZSl7KChlLHQpPT57Zm9yKGNvbnN0IHIgb2YgZSlpZihyLmJ1ZmZlcj09PXQpcmV0dXJuIHZvaWQoci5pblVzZT0hMSl9KSh0aGlzLnN0b3JhZ2VCdWZmZXJQb29sLGUpfXdyaXRlU3RvcmFnZUJ1ZmZlcihlLHQpe3RoaXMuZGV2aWNlLnF1ZXVlLndyaXRlQnVmZmVyKGUsMCx0LmJ1ZmZlcix0LmJ5dGVPZmZzZXQsdC5ieXRlTGVuZ3RoKX1nZXRPckNyZWF0ZUluZGlyZWN0QnVmZmVyKGUsdCxyPTAsbj0wKXtyZXR1cm4gdGhpcy5pbmRpcmVjdEJ1ZmZlcj9paSh0aGlzLmRldmljZSx0aGlzLmluZGlyZWN0QnVmZmVyLGUsdCxyLG4pOnRoaXMuaW5kaXJlY3RCdWZmZXI9bmkodGhpcy5kZXZpY2UsZSx0LHIsbiksdGhpcy5pbmRpcmVjdEJ1ZmZlcn1jcmVhdGVJbmRpcmVjdEJ1ZmZlcihlLHQscj0wLG49MCl7bGV0IGk9dGhpcy5pbmRpcmVjdEJ1ZmZlclBvb2wucG9wKCk7cmV0dXJuIGk/aWkodGhpcy5kZXZpY2UsaSxlLHQscixuKTppPW5pKHRoaXMuZGV2aWNlLGUsdCxyLG4pLHRoaXMuZnJhbWVJbmRpcmVjdEJ1ZmZlcnMucHVzaChpKSxpfWdldFVuaXRSZWN0QnVmZmVyKCl7aWYoIXRoaXMudW5pdFJlY3RCdWZmZXIpe2NvbnN0IGU9dGhpcy5jcmVhdGVSZWN0VmVydGljZXMoMCwwLDEsMSk7dGhpcy51bml0UmVjdEJ1ZmZlcj10aGlzLmRldmljZS5jcmVhdGVCdWZmZXIoe3NpemU6ZS5ieXRlTGVuZ3RoLHVzYWdlOkdQVUJ1ZmZlclVzYWdlLlZFUlRFWHxHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVCxtYXBwZWRBdENyZWF0aW9uOiEwfSksbmV3IEZsb2F0MzJBcnJheSh0aGlzLnVuaXRSZWN0QnVmZmVyLmdldE1hcHBlZFJhbmdlKCkpLnNldChlKSx0aGlzLnVuaXRSZWN0QnVmZmVyLnVubWFwKCl9cmV0dXJuIHRoaXMudW5pdFJlY3RCdWZmZXJ9Z2V0RnJhbWVOdW1iZXIoKXtyZXR1cm4gdGhpcy5mcmFtZU51bWJlcn1nZXRTdG9yYWdlUG9vbFN0YXRzKCl7Y29uc3QgZT10aGlzLnN0b3JhZ2VCdWZmZXJQb29sLmZpbHRlcihlPT5lLmluVXNlKS5sZW5ndGg7cmV0dXJue3N0b3JhZ2VQb29sU2l6ZTp0aGlzLnN0b3JhZ2VCdWZmZXJQb29sLmxlbmd0aCxzdG9yYWdlUG9vbEluVXNlOmV9fX1jbGFzcyBvaXtjb25zdHJ1Y3RvcihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiZGV2aWNlIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInRleHR1cmVzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInNhbXBsZXJzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksdGhpcy5kZXZpY2U9ZSx0aGlzLnRleHR1cmVzPW5ldyBNYXAsdGhpcy5zYW1wbGVycz1uZXcgTWFwLCgoZSx0KT0+e2NvbnN0IHI9ZS5jcmVhdGVTYW1wbGVyKHttYWdGaWx0ZXI6ImxpbmVhciIsbWluRmlsdGVyOiJsaW5lYXIiLG1pcG1hcEZpbHRlcjoibGluZWFyIixhZGRyZXNzTW9kZVU6ImNsYW1wLXRvLWVkZ2UiLGFkZHJlc3NNb2RlVjoiY2xhbXAtdG8tZWRnZSJ9KTt0LnNldCgibGluZWFyIixyKTtjb25zdCBuPWUuY3JlYXRlU2FtcGxlcih7bWFnRmlsdGVyOiJuZWFyZXN0IixtaW5GaWx0ZXI6Im5lYXJlc3QiLG1pcG1hcEZpbHRlcjoibmVhcmVzdCIsYWRkcmVzc01vZGVVOiJjbGFtcC10by1lZGdlIixhZGRyZXNzTW9kZVY6ImNsYW1wLXRvLWVkZ2UifSk7dC5zZXQoIm5lYXJlc3QiLG4pO2NvbnN0IGk9ZS5jcmVhdGVTYW1wbGVyKHttYWdGaWx0ZXI6Im5lYXJlc3QiLG1pbkZpbHRlcjoibGluZWFyIixtaXBtYXBGaWx0ZXI6Im5lYXJlc3QiLGFkZHJlc3NNb2RlVToiY2xhbXAtdG8tZWRnZSIsYWRkcmVzc01vZGVWOiJjbGFtcC10by1lZGdlIn0pO3Quc2V0KCJhdGxhc19pbnN0YW5jZWRfc2FtcGxlciIsaSk7Y29uc3QgYT1lLmNyZWF0ZVNhbXBsZXIoe21hZ0ZpbHRlcjoibGluZWFyIixtaW5GaWx0ZXI6ImxpbmVhciIsbWlwbWFwRmlsdGVyOiJsaW5lYXIiLGFkZHJlc3NNb2RlVToicmVwZWF0IixhZGRyZXNzTW9kZVY6InJlcGVhdCJ9KTt0LnNldCgicmVwZWF0IixhKX0pKGUsdGhpcy5zYW1wbGVycyl9Y3JlYXRlVGV4dHVyZShlLHQscixuPSJyZ2JhOHVub3JtIil7Y29uc3QgaT10aGlzLmRldmljZS5jcmVhdGVUZXh0dXJlKHtzaXplOnt3aWR0aDp0LGhlaWdodDpyfSxmb3JtYXQ6bix1c2FnZTpHUFVUZXh0dXJlVXNhZ2UuVEVYVFVSRV9CSU5ESU5HfEdQVVRleHR1cmVVc2FnZS5DT1BZX0RTVHxHUFVUZXh0dXJlVXNhZ2UuUkVOREVSX0FUVEFDSE1FTlR9KTtyZXR1cm4gdGhpcy50ZXh0dXJlcy5zZXQoZSxpKSxpfWNyZWF0ZVRleHR1cmVGcm9tUGl4ZWxzKGUsdCxyLG4pe3JldHVybigoZSx0LHIsbixpLGEpPT57Y29uc3Qgcz1lLmNyZWF0ZVRleHR1cmUoe3NpemU6e3dpZHRoOmksaGVpZ2h0OmF9LGZvcm1hdDoicmdiYTh1bm9ybSIsdXNhZ2U6R1BVVGV4dHVyZVVzYWdlLlRFWFRVUkVfQklORElOR3xHUFVUZXh0dXJlVXNhZ2UuQ09QWV9EU1R8R1BVVGV4dHVyZVVzYWdlLlJFTkRFUl9BVFRBQ0hNRU5UfSk7cmV0dXJuIGUucXVldWUud3JpdGVUZXh0dXJlKHt0ZXh0dXJlOnN9LG4uYnVmZmVyLHtieXRlc1BlclJvdzo0Kmksb2Zmc2V0Om4uYnl0ZU9mZnNldH0se3dpZHRoOmksaGVpZ2h0OmF9KSx0LnNldChyLHMpLHN9KSh0aGlzLmRldmljZSx0aGlzLnRleHR1cmVzLGUsdCxyLG4pfWNyZWF0ZVRleHR1cmVGcm9tSW1hZ2VCaXRtYXAoZSx0KXtyZXR1cm4oKGUsdCxyLG4pPT57Y29uc3QgaT1lLmNyZWF0ZVRleHR1cmUoe3NpemU6e3dpZHRoOm4ud2lkdGgsaGVpZ2h0Om4uaGVpZ2h0fSxmb3JtYXQ6InJnYmE4dW5vcm0iLHVzYWdlOkdQVVRleHR1cmVVc2FnZS5URVhUVVJFX0JJTkRJTkd8R1BVVGV4dHVyZVVzYWdlLkNPUFlfRFNUfEdQVVRleHR1cmVVc2FnZS5SRU5ERVJfQVRUQUNITUVOVH0pO3JldHVybiBlLnF1ZXVlLmNvcHlFeHRlcm5hbEltYWdlVG9UZXh0dXJlKHtzb3VyY2U6bixmbGlwWTohMH0se3RleHR1cmU6aSxwcmVtdWx0aXBsaWVkQWxwaGE6ITB9LHt3aWR0aDpuLndpZHRoLGhlaWdodDpuLmhlaWdodH0pLHQuc2V0KHIsaSksaX0pKHRoaXMuZGV2aWNlLHRoaXMudGV4dHVyZXMsZSx0KX11cGRhdGVUZXh0dXJlKGUsdCxyLG4pe2NvbnN0IGk9dGhpcy50ZXh0dXJlcy5nZXQoZSk7aSYmdGhpcy5kZXZpY2UucXVldWUud3JpdGVUZXh0dXJlKHt0ZXh0dXJlOml9LHQuYnVmZmVyLHtieXRlc1BlclJvdzo0KnIsb2Zmc2V0OnQuYnl0ZU9mZnNldH0se3dpZHRoOnIsaGVpZ2h0Om59KX1nZXRUZXh0dXJlKGUpe3JldHVybiB0aGlzLnRleHR1cmVzLmdldChlKX1nZXRTYW1wbGVyKGUpe3JldHVybiB0aGlzLnNhbXBsZXJzLmdldChlKX1jcmVhdGVTYW1wbGVyKGUsdD0hMCl7Y29uc3Qgcj10aGlzLnNhbXBsZXJzLmdldChlKTtpZihyKXJldHVybiByO2NvbnN0IG49dGhpcy5kZXZpY2UuY3JlYXRlU2FtcGxlcih7bWFnRmlsdGVyOnQ/ImxpbmVhciI6Im5lYXJlc3QiLG1pbkZpbHRlcjp0PyJsaW5lYXIiOiJuZWFyZXN0IixtaXBtYXBGaWx0ZXI6dD8ibGluZWFyIjoibmVhcmVzdCIsYWRkcmVzc01vZGVVOiJjbGFtcC10by1lZGdlIixhZGRyZXNzTW9kZVY6ImNsYW1wLXRvLWVkZ2UifSk7cmV0dXJuIHRoaXMuc2FtcGxlcnMuc2V0KGUsbiksbn1kZXN0cm95VGV4dHVyZShlKXtjb25zdCB0PXRoaXMudGV4dHVyZXMuZ2V0KGUpO3QmJih0LmRlc3Ryb3koKSx0aGlzLnRleHR1cmVzLmRlbGV0ZShlKSl9ZGlzcG9zZSgpe2Zvcihjb25zdCBlIG9mIHRoaXMudGV4dHVyZXMudmFsdWVzKCkpZS5kZXN0cm95KCk7dGhpcy50ZXh0dXJlcy5jbGVhcigpLHRoaXMuc2FtcGxlcnMuY2xlYXIoKX19Y29uc3QgbGk9e3I6MCxnOjAsYjowLGE6MH0sY2k9e3ZpZXc6bnVsbCxjbGVhclZhbHVlOmxpLGxvYWRPcDoiY2xlYXIiLHN0b3JlT3A6InN0b3JlIn0sdWk9e2NvbG9yQXR0YWNobWVudHM6W2NpXX0sZmk9e3ZpZXc6bnVsbCxjbGVhclZhbHVlOntyOjAsZzowLGI6MCxhOjB9LGxvYWRPcDoibG9hZCIsc3RvcmVPcDoic3RvcmUifSxkaT17dmlldzpudWxsLHN0ZW5jaWxDbGVhclZhbHVlOjAsc3RlbmNpbExvYWRPcDoiY2xlYXIiLHN0ZW5jaWxTdG9yZU9wOiJzdG9yZSJ9LGhpPXtjb2xvckF0dGFjaG1lbnRzOltmaV0sZGVwdGhTdGVuY2lsQXR0YWNobWVudDpkaX07Y2xhc3MgcGl7Y29uc3RydWN0b3IoZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImRldmljZSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJidWNrZXRzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImN1cnJlbnRGcmFtZSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJ0b3RhbENvdW50Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksdGhpcy5kZXZpY2U9ZSx0aGlzLmJ1Y2tldHM9bmV3IE1hcCx0aGlzLmN1cnJlbnRGcmFtZT0wLHRoaXMudG90YWxDb3VudD1bMF19YmVnaW5GcmFtZSgpe3RoaXMuY3VycmVudEZyYW1lKyssdGhpcy5jdXJyZW50RnJhbWUlNjA9PTAmJigoZSx0LHIsbik9Pntjb25zdCBpPXQtcjtmb3IoY29uc3RbdCxyXW9mIGUpe2ZvcihsZXQgZT1yLmxlbmd0aC0xO2U+PTA7ZS0tKXtjb25zdCB0PXJbZV07IXQuaW5Vc2UmJnQubGFzdFVzZWRGcmFtZTxpJiYodC50ZXh0dXJlLmRlc3Ryb3koKSxyLnNwbGljZShlLDEpLG5bMF0tLSl9MD09PXIubGVuZ3RoJiZlLmRlbGV0ZSh0KX19KSh0aGlzLmJ1Y2tldHMsdGhpcy5jdXJyZW50RnJhbWUsMTgwLHRoaXMudG90YWxDb3VudCl9YWNxdWlyZShlLHQscj0icmdiYTh1bm9ybSIsbj1HUFVUZXh0dXJlVXNhZ2UuVEVYVFVSRV9CSU5ESU5HfEdQVVRleHR1cmVVc2FnZS5DT1BZX0RTVHxHUFVUZXh0dXJlVXNhZ2UuUkVOREVSX0FUVEFDSE1FTlQpe3JldHVybigoZSx0LHIsbixpLGEscyxvLGwpPT57Y29uc3QgYz0oKGUsdCxyKT0+YCR7ZX1fJHt0fV8ke3J9YCkocixuLGkpLHU9dC5nZXQoYyk7aWYodSlmb3IobGV0IGU9MDtlPHUubGVuZ3RoO2UrKyl7Y29uc3QgdD11W2VdO2lmKCF0LmluVXNlKXJldHVybiB0LmluVXNlPSEwLHQubGFzdFVzZWRGcmFtZT1zLHQudGV4dHVyZX1pZihsWzBdPj1vKXtsZXQgZT0xLzAscj0iIixuPS0xO2Zvcihjb25zdFtpLGFdb2YgdClmb3IobGV0IHQ9MDt0PGEubGVuZ3RoO3QrKyl7Y29uc3Qgcz1hW3RdOyFzLmluVXNlJiZzLmxhc3RVc2VkRnJhbWU8ZSYmKGU9cy5sYXN0VXNlZEZyYW1lLHI9aSxuPXQpfWlmKG4+PTApe2NvbnN0IGU9dC5nZXQocik7ZVtuXS50ZXh0dXJlLmRlc3Ryb3koKSxlLnNwbGljZShuLDEpLDA9PT1lLmxlbmd0aCYmdC5kZWxldGUociksbFswXS0tfX1jb25zdCBmPWUuY3JlYXRlVGV4dHVyZSh7c2l6ZTp7d2lkdGg6cixoZWlnaHQ6bn0sZm9ybWF0OmksdXNhZ2U6YX0pLGQ9e3RleHR1cmU6Zix3aWR0aDpyLGhlaWdodDpuLGZvcm1hdDppLGxhc3RVc2VkRnJhbWU6cyxpblVzZTohMH07cmV0dXJuIHU/dS5wdXNoKGQpOnQuc2V0KGMsW2RdKSxsWzBdKyssZn0pKHRoaXMuZGV2aWNlLHRoaXMuYnVja2V0cyxlLHQscixuLHRoaXMuY3VycmVudEZyYW1lLDMyLHRoaXMudG90YWxDb3VudCl9cmVsZWFzZShlKXsoKGUsdCxyKT0+e2Zvcihjb25zdCBuIG9mIGUudmFsdWVzKCkpZm9yKGxldCBlPTA7ZTxuLmxlbmd0aDtlKyspaWYobltlXS50ZXh0dXJlPT09dClyZXR1cm4gbltlXS5pblVzZT0hMSx2b2lkKG5bZV0ubGFzdFVzZWRGcmFtZT1yKX0pKHRoaXMuYnVja2V0cyxlLHRoaXMuY3VycmVudEZyYW1lKX1nZXRTdGF0cygpe2xldCBlPTAsdD0wO2Zvcihjb25zdCByIG9mIHRoaXMuYnVja2V0cy52YWx1ZXMoKSlmb3IoY29uc3QgbiBvZiByKW4uaW5Vc2U/ZSsrOnQrKztyZXR1cm57dG90YWw6dGhpcy50b3RhbENvdW50WzBdLGluVXNlOmUsYXZhaWxhYmxlOnR9fWRpc3Bvc2UoKXtmb3IoY29uc3QgZSBvZiB0aGlzLmJ1Y2tldHMudmFsdWVzKCkpZm9yKGNvbnN0IHQgb2YgZSl0LnRleHR1cmUuZGVzdHJveSgpO3RoaXMuYnVja2V0cy5jbGVhcigpLHRoaXMudG90YWxDb3VudFswXT0wfX1jbGFzcyBtaXtjb25zdHJ1Y3RvcihlLHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJkZXZpY2UiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiZm9ybWF0Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImF0dGFjaG1lbnRzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImN1cnJlbnRBdHRhY2htZW50Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkQ291bnRlciIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJ0ZXh0dXJlUG9vbCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJwZW5kaW5nUmVsZWFzZXMiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpbXX0pLHRoaXMuZGV2aWNlPWUsdGhpcy5mb3JtYXQ9dCx0aGlzLmF0dGFjaG1lbnRzPW5ldyBNYXAsdGhpcy5jdXJyZW50QXR0YWNobWVudD1udWxsLHRoaXMuaWRDb3VudGVyPXtuZXh0SWQ6MSx0ZXh0dXJlSWQ6MSxzdGVuY2lsSWQ6MX0sdGhpcy50ZXh0dXJlUG9vbD1uZXcgcGkoZSl9YmVnaW5GcmFtZSgpe3RoaXMudGV4dHVyZVBvb2wuYmVnaW5GcmFtZSgpfWNyZWF0ZUF0dGFjaG1lbnQoZSx0LHIsbj0hMSxpPSExKXtyZXR1cm4oKGUsdCxyLG4saSxhLHMsbyxsKT0+e2NvbnN0IGM9ImF0bGFzIj09PW58fG4uc3RhcnRzV2l0aCgiYXRsYXNfIiksdT1jfHxuLnN0YXJ0c1dpdGgoInRlbXBfIik/InJnYmE4dW5vcm0iOnQsZj1zfHxjJiYhMCxkPWY/NDoxLGg9ZS5jcmVhdGVUZXh0dXJlKHtzaXplOnt3aWR0aDppLGhlaWdodDphfSxmb3JtYXQ6dSx1c2FnZTpHUFVUZXh0dXJlVXNhZ2UuUkVOREVSX0FUVEFDSE1FTlR8R1BVVGV4dHVyZVVzYWdlLlRFWFRVUkVfQklORElOR3xHUFVUZXh0dXJlVXNhZ2UuQ09QWV9TUkN8R1BVVGV4dHVyZVVzYWdlLkNPUFlfRFNUfSkscD1oLmNyZWF0ZVZpZXcoKSxtPXtpZDpsLnRleHR1cmVJZCsrLHJlc291cmNlOmgsdmlldzpwLHdpZHRoOmksaGVpZ2h0OmEsYXJlYTppKmEsc21vb3RoOiEwfTtsZXQgZz1udWxsO2lmKGYpe2NvbnN0IHQ9ZS5jcmVhdGVUZXh0dXJlKHtzaXplOnt3aWR0aDppLGhlaWdodDphfSxmb3JtYXQ6dSxzYW1wbGVDb3VudDpkLHVzYWdlOkdQVVRleHR1cmVVc2FnZS5SRU5ERVJfQVRUQUNITUVOVH0pLHI9dC5jcmVhdGVWaWV3KCk7Zz17aWQ6bC50ZXh0dXJlSWQrKyxyZXNvdXJjZTp0LHZpZXc6cix3aWR0aDppLGhlaWdodDphLGFyZWE6aSphLHNtb290aDohMH19bGV0IGI9bnVsbCx4PW51bGw7aWYoY3x8Im1haW4iPT09bnx8byl7Y29uc3QgdD1lLmNyZWF0ZVRleHR1cmUoe3NpemU6e3dpZHRoOmksaGVpZ2h0OmF9LGZvcm1hdDoic3RlbmNpbDgiLHVzYWdlOkdQVVRleHR1cmVVc2FnZS5SRU5ERVJfQVRUQUNITUVOVH0pLHI9dC5jcmVhdGVWaWV3KCk7aWYoYj17aWQ6bC5zdGVuY2lsSWQrKyxyZXNvdXJjZTp0LHZpZXc6cix3aWR0aDppLGhlaWdodDphLGFyZWE6aSphLGRpcnR5OiExfSxmKXtjb25zdCB0PWUuY3JlYXRlVGV4dHVyZSh7c2l6ZTp7d2lkdGg6aSxoZWlnaHQ6YX0sZm9ybWF0OiJzdGVuY2lsOCIsc2FtcGxlQ291bnQ6ZCx1c2FnZTpHUFVUZXh0dXJlVXNhZ2UuUkVOREVSX0FUVEFDSE1FTlR9KSxyPXQuY3JlYXRlVmlldygpO3g9e2lkOmwuc3RlbmNpbElkKysscmVzb3VyY2U6dCx2aWV3OnIsd2lkdGg6aSxoZWlnaHQ6YSxhcmVhOmkqYSxkaXJ0eTohMX19fWNvbnN0IHY9e2lkOmwubmV4dElkKyssd2lkdGg6aSxoZWlnaHQ6YSxjbGlwTGV2ZWw6MCxtc2FhOmYsbWFzazpvLGNvbG9yOm51bGwsdGV4dHVyZTptLHN0ZW5jaWw6Yixtc2FhVGV4dHVyZTpnLG1zYWFTdGVuY2lsOnh9O3JldHVybiByLnNldChuLHYpLHZ9KSh0aGlzLmRldmljZSx0aGlzLmZvcm1hdCx0aGlzLmF0dGFjaG1lbnRzLGUsdCxyLG4saSx0aGlzLmlkQ291bnRlcil9Z2V0QXR0YWNobWVudChlKXtyZXR1cm4gdGhpcy5hdHRhY2htZW50cy5nZXQoZSl9c2V0Q3VycmVudEF0dGFjaG1lbnQoZSl7dGhpcy5jdXJyZW50QXR0YWNobWVudD1lfWdldEN1cnJlbnRBdHRhY2htZW50KCl7cmV0dXJuIHRoaXMuY3VycmVudEF0dGFjaG1lbnR9Y3JlYXRlUmVuZGVyUGFzc0Rlc2NyaXB0b3IoZSx0PTAscj0wLG49MCxpPTAsYT0iY2xlYXIiLHM9bnVsbCl7cmV0dXJuKChlLHQ9MCxyPTAsbj0wLGk9MCxhPSJjbGVhciIscz1udWxsKT0+KGNpLnZpZXc9ZSxsaS5yPXQsbGkuZz1yLGxpLmI9bixsaS5hPWksY2kubG9hZE9wPWEsY2kucmVzb2x2ZVRhcmdldD1zPz92b2lkIDAsdWkpKShlLHQscixuLGksYSxzKX1jcmVhdGVTdGVuY2lsUmVuZGVyUGFzc0Rlc2NyaXB0b3IoZSx0LHI9ImxvYWQiLG49ImNsZWFyIixpPW51bGwpe3JldHVybigoZSx0LHI9ImxvYWQiLG49ImNsZWFyIixpPW51bGwpPT4oZmkudmlldz1lLGZpLmxvYWRPcD1yLGZpLnJlc29sdmVUYXJnZXQ9aT8/dm9pZCAwLGRpLnZpZXc9dCxkaS5zdGVuY2lsTG9hZE9wPW4saGkpKShlLHQscixuLGkpfWRlc3Ryb3lBdHRhY2htZW50KGUpe2NvbnN0IHQ9dGhpcy5hdHRhY2htZW50cy5nZXQoZSk7dCYmKHQudGV4dHVyZSYmdC50ZXh0dXJlLnJlc291cmNlLmRlc3Ryb3koKSx0LnN0ZW5jaWwmJnQuc3RlbmNpbC5yZXNvdXJjZS5kZXN0cm95KCksdGhpcy5hdHRhY2htZW50cy5kZWxldGUoZSkpfXJlc2l6ZUF0dGFjaG1lbnQoZSx0LHIpe3JldHVybiB0aGlzLmRlc3Ryb3lBdHRhY2htZW50KGUpLHRoaXMuY3JlYXRlQXR0YWNobWVudChlLHQscil9Y3JlYXRlVGVtcG9yYXJ5QXR0YWNobWVudChlLHQpe2NvbnN0IHI9YHRlbXBfJHt0aGlzLmlkQ291bnRlci5uZXh0SWR9YCxuPUdQVVRleHR1cmVVc2FnZS5SRU5ERVJfQVRUQUNITUVOVHxHUFVUZXh0dXJlVXNhZ2UuVEVYVFVSRV9CSU5ESU5HfEdQVVRleHR1cmVVc2FnZS5DT1BZX1NSQ3xHUFVUZXh0dXJlVXNhZ2UuQ09QWV9EU1R8R1BVVGV4dHVyZVVzYWdlLlNUT1JBR0VfQklORElORyxpPXRoaXMudGV4dHVyZVBvb2wuYWNxdWlyZShlLHQsInJnYmE4dW5vcm0iLG4pLGE9aS5jcmVhdGVWaWV3KCkscz17aWQ6dGhpcy5pZENvdW50ZXIudGV4dHVyZUlkKysscmVzb3VyY2U6aSx2aWV3OmEsd2lkdGg6ZSxoZWlnaHQ6dCxhcmVhOmUqdCxzbW9vdGg6ITB9LG89e2lkOnRoaXMuaWRDb3VudGVyLm5leHRJZCsrLHdpZHRoOmUsaGVpZ2h0OnQsY2xpcExldmVsOjAsbXNhYTohMSxtYXNrOiExLGNvbG9yOm51bGwsdGV4dHVyZTpzLHN0ZW5jaWw6bnVsbCxtc2FhVGV4dHVyZTpudWxsLG1zYWFTdGVuY2lsOm51bGx9O3JldHVybiB0aGlzLmF0dGFjaG1lbnRzLnNldChyLG8pLG99cmVsZWFzZVRlbXBvcmFyeUF0dGFjaG1lbnQoZSl7KChlLHQscik9Pntmb3IoY29uc3RbbixpXW9mIGUuZW50cmllcygpKWlmKGkuaWQ9PT1yLmlkKXtlLmRlbGV0ZShuKSx0LnB1c2goaSk7YnJlYWt9fSkodGhpcy5hdHRhY2htZW50cyx0aGlzLnBlbmRpbmdSZWxlYXNlcyxlKX1mbHVzaFBlbmRpbmdSZWxlYXNlcygpe2Zvcihjb25zdCBlIG9mIHRoaXMucGVuZGluZ1JlbGVhc2VzKWUudGV4dHVyZSYmdGhpcy50ZXh0dXJlUG9vbC5yZWxlYXNlKGUudGV4dHVyZS5yZXNvdXJjZSksZS5tc2FhVGV4dHVyZSYmZS5tc2FhVGV4dHVyZS5yZXNvdXJjZS5kZXN0cm95KCksZS5zdGVuY2lsJiZlLnN0ZW5jaWwucmVzb3VyY2UuZGVzdHJveSgpLGUubXNhYVN0ZW5jaWwmJmUubXNhYVN0ZW5jaWwucmVzb3VyY2UuZGVzdHJveSgpO3RoaXMucGVuZGluZ1JlbGVhc2VzPVtdfWRpc3Bvc2UoKXtmb3IoY29uc3QgZSBvZiB0aGlzLmF0dGFjaG1lbnRzLnZhbHVlcygpKWUudGV4dHVyZSYmZS50ZXh0dXJlLnJlc291cmNlLmRlc3Ryb3koKSxlLnN0ZW5jaWwmJmUuc3RlbmNpbC5yZXNvdXJjZS5kZXN0cm95KCk7dGhpcy5hdHRhY2htZW50cy5jbGVhcigpLHRoaXMuY3VycmVudEF0dGFjaG1lbnQ9bnVsbCx0aGlzLnRleHR1cmVQb29sLmRpc3Bvc2UoKX19Y29uc3QgZ2k9KGUsdCxyLG4saSk9Pntmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKyl7Y29uc3QgaT10W2VdO2lmKGkud2lkdGg+PXImJmkuaGVpZ2h0Pj1uKXJldHVybiB0LnNwbGljZShlLDEpLGkuZGlydHk9ITEsaX1yZXR1cm4oKGUsdCxyLG4pPT57Y29uc3QgaT1lLmNyZWF0ZVRleHR1cmUoe3NpemU6e3dpZHRoOnQsaGVpZ2h0OnJ9LGZvcm1hdDoiZGVwdGgyNHBsdXMtc3RlbmNpbDgiLHVzYWdlOkdQVVRleHR1cmVVc2FnZS5SRU5ERVJfQVRUQUNITUVOVH0pO3JldHVybntpZDpuLnN0ZW5jaWxJZCsrLHJlc291cmNlOmksdmlldzppLmNyZWF0ZVZpZXcoKSx3aWR0aDp0LGhlaWdodDpyLGFyZWE6dCpyLGRpcnR5OiExfX0pKGUscixuLGkpfSxiaT0oZSx0LHIsbixpKT0+e2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXtjb25zdCBhPXRbZV07aWYoYS53aWR0aD49ciYmYS5oZWlnaHQ+PW4pcmV0dXJuIHQuc3BsaWNlKGUsMSksYS5zdGVuY2lsPWksYS5kaXJ0eT0hMSxhfXJldHVybigoZSx0LHIsbik9Pntjb25zdCBpPWUuY3JlYXRlVGV4dHVyZSh7c2l6ZTp7d2lkdGg6dCxoZWlnaHQ6cn0sZm9ybWF0OiJyZ2JhOHVub3JtIix1c2FnZTpHUFVUZXh0dXJlVXNhZ2UuUkVOREVSX0FUVEFDSE1FTlR8R1BVVGV4dHVyZVVzYWdlLlRFWFRVUkVfQklORElOR3xHUFVUZXh0dXJlVXNhZ2UuQ09QWV9TUkN8R1BVVGV4dHVyZVVzYWdlLkNPUFlfRFNUfSk7cmV0dXJue3Jlc291cmNlOmksdmlldzppLmNyZWF0ZVZpZXcoKSxzdGVuY2lsOm4sd2lkdGg6dCxoZWlnaHQ6cixhcmVhOnQqcixkaXJ0eTohMX19KShlLHIsbixpKX0seGk9KGUsdCxyLG4saSxhKT0+e2NvbnN0IHM9YCR7cn14JHtufV9zbW9vdGhgO2lmKHQuaGFzKHMpKXtjb25zdCBlPXQuZ2V0KHMpO2lmKGUubGVuZ3RoPjApcmV0dXJuIGUucG9wKCl9cmV0dXJuKChlLHQscixuLGkpPT57Y29uc3QgYT1lLmNyZWF0ZVRleHR1cmUoe3NpemU6e3dpZHRoOnQsaGVpZ2h0OnJ9LGZvcm1hdDoicmdiYTh1bm9ybSIsdXNhZ2U6R1BVVGV4dHVyZVVzYWdlLlJFTkRFUl9BVFRBQ0hNRU5UfEdQVVRleHR1cmVVc2FnZS5URVhUVVJFX0JJTkRJTkd8R1BVVGV4dHVyZVVzYWdlLkNPUFlfU1JDfEdQVVRleHR1cmVVc2FnZS5DT1BZX0RTVH0pLHM9YS5jcmVhdGVWaWV3KCk7cmV0dXJue2lkOmkudGV4dHVyZUlkKysscmVzb3VyY2U6YSx2aWV3OnMsd2lkdGg6dCxoZWlnaHQ6cixhcmVhOnQqcixzbW9vdGg6bn19KShlLHIsbixpLGEpfSx2aT17cjowLGc6MCxiOjAsYTowfSx5aT17dmlldzpudWxsLGxvYWRPcDoiY2xlYXIiLHN0b3JlT3A6InN0b3JlIixjbGVhclZhbHVlOnZpfSxfaT17dmlldzpudWxsLGRlcHRoTG9hZE9wOiJjbGVhciIsZGVwdGhTdG9yZU9wOiJzdG9yZSIsZGVwdGhDbGVhclZhbHVlOjEsc3RlbmNpbExvYWRPcDoiY2xlYXIiLHN0ZW5jaWxTdG9yZU9wOiJzdG9yZSIsc3RlbmNpbENsZWFyVmFsdWU6MH0sd2k9e2NvbG9yQXR0YWNobWVudHM6W3lpXX07Y2xhc3MgTWl7Y29uc3RydWN0b3IoZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImRldmljZSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJhdHRhY2htZW50UG9vbCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJ0ZXh0dXJlUG9vbCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJjb2xvckJ1ZmZlclBvb2wiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywic3RlbmNpbEJ1ZmZlclBvb2wiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWRDb3VudGVyIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImN1cnJlbnRBdHRhY2htZW50Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksdGhpcy5kZXZpY2U9ZSx0aGlzLmF0dGFjaG1lbnRQb29sPVtdLHRoaXMudGV4dHVyZVBvb2w9bmV3IE1hcCx0aGlzLmNvbG9yQnVmZmVyUG9vbD1bXSx0aGlzLnN0ZW5jaWxCdWZmZXJQb29sPVtdLHRoaXMuaWRDb3VudGVyPXthdHRhY2htZW50SWQ6MCx0ZXh0dXJlSWQ6MCxzdGVuY2lsSWQ6MH0sdGhpcy5jdXJyZW50QXR0YWNobWVudD1udWxsfWdldEF0dGFjaG1lbnRPYmplY3QoZSx0LHI9ITEpe3JldHVybigoZSx0LHIsbixpLGEscyxvLGwpPT57Y29uc3QgYz10Lmxlbmd0aD4wP3QucG9wKCk6KGU9Pih7aWQ6ZS5hdHRhY2htZW50SWQrKyx3aWR0aDowLGhlaWdodDowLGNsaXBMZXZlbDowLG1zYWE6ITEsbWFzazohMSxjb2xvcjpudWxsLHRleHR1cmU6bnVsbCxzdGVuY2lsOm51bGwsbXNhYVRleHR1cmU6bnVsbCxtc2FhU3RlbmNpbDpudWxsfSkpKGwpO2Mud2lkdGg9YSxjLmhlaWdodD1zLGMubXNhYT1vLGMubWFzaz0hMSxjLmNsaXBMZXZlbD0wO2NvbnN0IHU9Z2koZSxpLGEscyxsKSxmPWJpKGUsbixhLHMsdSk7Yy5jb2xvcj1mLGMuc3RlbmNpbD11O2NvbnN0IGQ9eGkoZSxyLGEscywhMCxsKTtyZXR1cm4gYy50ZXh0dXJlPWQsY30pKHRoaXMuZGV2aWNlLHRoaXMuYXR0YWNobWVudFBvb2wsdGhpcy50ZXh0dXJlUG9vbCx0aGlzLmNvbG9yQnVmZmVyUG9vbCx0aGlzLnN0ZW5jaWxCdWZmZXJQb29sLGUsdCxyLHRoaXMuaWRDb3VudGVyKX1iaW5kQXR0YWNobWVudChlKXt0aGlzLmN1cnJlbnRBdHRhY2htZW50PWV9Z2V0Q3VycmVudEF0dGFjaG1lbnQoKXtyZXR1cm4gdGhpcy5jdXJyZW50QXR0YWNobWVudH1nZXQgY3VycmVudEF0dGFjaG1lbnRPYmplY3QoKXtyZXR1cm4gdGhpcy5jdXJyZW50QXR0YWNobWVudH11bmJpbmRBdHRhY2htZW50KCl7dGhpcy5jdXJyZW50QXR0YWNobWVudD1udWxsfXJlbGVhc2VBdHRhY2htZW50KGUpeygoZSx0LHIsbixpKT0+e2kudGV4dHVyZSYmKCgoZSx0KT0+e2NvbnN0IHI9YCR7dC53aWR0aH14JHt0LmhlaWdodH1fJHt0LnNtb290aD8ic21vb3RoIjoibmVhcmVzdCJ9YDtlLmhhcyhyKXx8ZS5zZXQocixbXSksZS5nZXQocikucHVzaCh0KX0pKHQsaS50ZXh0dXJlKSxpLnRleHR1cmU9bnVsbCksaS5jb2xvciYmKHIucHVzaChpLmNvbG9yKSxpLmNvbG9yPW51bGwpLGkuc3RlbmNpbCYmKG4ucHVzaChpLnN0ZW5jaWwpLGkuc3RlbmNpbD1udWxsKSxlLnB1c2goaSl9KSh0aGlzLmF0dGFjaG1lbnRQb29sLHRoaXMudGV4dHVyZVBvb2wsdGhpcy5jb2xvckJ1ZmZlclBvb2wsdGhpcy5zdGVuY2lsQnVmZmVyUG9vbCxlKX1jcmVhdGVSZW5kZXJQYXNzRGVzY3JpcHRvcihlLHQscixuLGksYT0iY2xlYXIiKXtyZXR1cm4oKGUsdCxyLG4saSxhPSJjbGVhciIpPT57Y29uc3Qgcz1lLmNvbG9yPy52aWV3Pz9lLnRleHR1cmU/LnZpZXc7aWYoIXMpdGhyb3cgbmV3IEVycm9yKCJObyBjb2xvciB2aWV3IGF2YWlsYWJsZSBmb3IgcmVuZGVyIHBhc3MiKTtyZXR1cm4geWkudmlldz1zLHlpLmxvYWRPcD1hLHZpLnI9dCx2aS5nPXIsdmkuYj1uLHZpLmE9aSxlLnN0ZW5jaWw/LnZpZXc/KF9pLnZpZXc9ZS5zdGVuY2lsLnZpZXcsd2kuZGVwdGhTdGVuY2lsQXR0YWNobWVudD1faSk6d2kuZGVwdGhTdGVuY2lsQXR0YWNobWVudD12b2lkIDAsd2l9KShlLHQscixuLGksYSl9ZGlzcG9zZSgpe2Zvcihjb25zdCBlIG9mIHRoaXMudGV4dHVyZVBvb2wudmFsdWVzKCkpZm9yKGNvbnN0IHQgb2YgZSl0LnJlc291cmNlLmRlc3Ryb3koKTt0aGlzLnRleHR1cmVQb29sLmNsZWFyKCk7Zm9yKGNvbnN0IGUgb2YgdGhpcy5jb2xvckJ1ZmZlclBvb2wpZS5yZXNvdXJjZS5kZXN0cm95KCk7dGhpcy5jb2xvckJ1ZmZlclBvb2w9W107Zm9yKGNvbnN0IGUgb2YgdGhpcy5zdGVuY2lsQnVmZmVyUG9vbCllLnJlc291cmNlLmRlc3Ryb3koKTt0aGlzLnN0ZW5jaWxCdWZmZXJQb29sPVtdO2Zvcihjb25zdCBlIG9mIHRoaXMuYXR0YWNobWVudFBvb2wpZS50ZXh0dXJlJiZlLnRleHR1cmUucmVzb3VyY2UuZGVzdHJveSgpLGUuY29sb3ImJmUuY29sb3IucmVzb3VyY2UuZGVzdHJveSgpLGUuc3RlbmNpbCYmZS5zdGVuY2lsLnJlc291cmNlLmRlc3Ryb3koKTt0aGlzLmF0dGFjaG1lbnRQb29sPVtdfX1jb25zdCBQaT0iXG5vdmVycmlkZSB5RmxpcFNpZ246IGYzMiA9IDEuMDtcblxuc3RydWN0IFZlcnRleElucHV0IHtcbiAgICBAbG9jYXRpb24oMCkgcG9zaXRpb246IHZlYzI8ZjMyPixcbiAgICBAbG9jYXRpb24oMSkgYmV6aWVyOiB2ZWMyPGYzMj4sXG59XG5cbnN0cnVjdCBWZXJ0ZXhPdXRwdXQge1xuICAgIEBidWlsdGluKHBvc2l0aW9uKSBwb3NpdGlvbjogdmVjNDxmMzI+LFxuICAgIEBsb2NhdGlvbigwKSBiZXppZXI6IHZlYzI8ZjMyPixcbiAgICBAbG9jYXRpb24oMSkgY29sb3I6IHZlYzQ8ZjMyPixcbn1cblxuc3RydWN0IEZpbGxVbmlmb3JtcyB7XG4gICAgY29sb3I6IHZlYzQ8ZjMyPixcbiAgICBtYXRyaXgwOiB2ZWM0PGYzMj4sXG4gICAgbWF0cml4MTogdmVjNDxmMzI+LFxuICAgIG1hdHJpeDI6IHZlYzQ8ZjMyPixcbn1cblxuQGdyb3VwKDApIEBiaW5kaW5nKDApIHZhcjx1bmlmb3JtPiB1bmlmb3JtczogRmlsbFVuaWZvcm1zO1xuXG5AdmVydGV4XG5mbiBtYWluKGlucHV0OiBWZXJ0ZXhJbnB1dCkgLT4gVmVydGV4T3V0cHV0IHtcbiAgICB2YXIgb3V0cHV0OiBWZXJ0ZXhPdXRwdXQ7XG4gICAgbGV0IG1hdHJpeCA9IG1hdDN4MzxmMzI+KHVuaWZvcm1zLm1hdHJpeDAueHl6LCB1bmlmb3Jtcy5tYXRyaXgxLnh5eiwgdW5pZm9ybXMubWF0cml4Mi54eXopO1xuICAgIGxldCB0cmFuc2Zvcm1lZCA9IG1hdHJpeCAqIHZlYzM8ZjMyPihpbnB1dC5wb3NpdGlvbiwgMS4wKTtcbiAgICBsZXQgbmRjID0gdHJhbnNmb3JtZWQueHkgKiAyLjAgLSAxLjA7XG4gICAgb3V0cHV0LnBvc2l0aW9uID0gdmVjNDxmMzI+KG5kYy54LCBuZGMueSAqIHlGbGlwU2lnbiwgMC4wLCAxLjApO1xuICAgIG91dHB1dC5iZXppZXIgPSBpbnB1dC5iZXppZXI7XG4gICAgb3V0cHV0LmNvbG9yID0gdW5pZm9ybXMuY29sb3I7XG4gICAgcmV0dXJuIG91dHB1dDtcbn1cbiIsU2k9Ilxub3ZlcnJpZGUgeUZsaXBTaWduOiBmMzIgPSAxLjA7XG5cbnN0cnVjdCBWZXJ0ZXhJbnB1dCB7XG4gICAgQGxvY2F0aW9uKDApIHBvc2l0aW9uOiB2ZWMyPGYzMj4sXG4gICAgQGxvY2F0aW9uKDEpIGJlemllcjogdmVjMjxmMzI+LFxufVxuXG5zdHJ1Y3QgVmVydGV4T3V0cHV0IHtcbiAgICBAYnVpbHRpbihwb3NpdGlvbikgcG9zaXRpb246IHZlYzQ8ZjMyPixcbiAgICBAbG9jYXRpb24oMCkgYmV6aWVyOiB2ZWMyPGYzMj4sXG59XG5cbnN0cnVjdCBGaWxsVW5pZm9ybXMge1xuICAgIGNvbG9yOiB2ZWM0PGYzMj4sXG4gICAgbWF0cml4MDogdmVjNDxmMzI+LFxuICAgIG1hdHJpeDE6IHZlYzQ8ZjMyPixcbiAgICBtYXRyaXgyOiB2ZWM0PGYzMj4sXG59XG5cbkBncm91cCgwKSBAYmluZGluZygwKSB2YXI8dW5pZm9ybT4gdW5pZm9ybXM6IEZpbGxVbmlmb3JtcztcblxuQHZlcnRleFxuZm4gbWFpbihpbnB1dDogVmVydGV4SW5wdXQpIC0+IFZlcnRleE91dHB1dCB7XG4gICAgdmFyIG91dHB1dDogVmVydGV4T3V0cHV0O1xuICAgIGxldCBtYXRyaXggPSBtYXQzeDM8ZjMyPih1bmlmb3Jtcy5tYXRyaXgwLnh5eiwgdW5pZm9ybXMubWF0cml4MS54eXosIHVuaWZvcm1zLm1hdHJpeDIueHl6KTtcbiAgICBsZXQgdHJhbnNmb3JtZWQgPSBtYXRyaXggKiB2ZWMzPGYzMj4oaW5wdXQucG9zaXRpb24sIDEuMCk7XG4gICAgbGV0IG5kYyA9IHRyYW5zZm9ybWVkLnh5ICogMi4wIC0gMS4wO1xuICAgIG91dHB1dC5wb3NpdGlvbiA9IHZlYzQ8ZjMyPihuZGMueCwgbmRjLnkgKiB5RmxpcFNpZ24sIDAuMCwgMS4wKTtcbiAgICBvdXRwdXQuYmV6aWVyID0gaW5wdXQuYmV6aWVyO1xuICAgIHJldHVybiBvdXRwdXQ7XG59XG4iLEZpPSJcbm92ZXJyaWRlIHlGbGlwU2lnbjogZjMyID0gMS4wO1xuXG5zdHJ1Y3QgVmVydGV4SW5wdXQge1xuICAgIEBsb2NhdGlvbigwKSBwb3NpdGlvbjogdmVjMjxmMzI+LFxuICAgIEBsb2NhdGlvbigxKSBiZXppZXI6IHZlYzI8ZjMyPixcbn1cblxuc3RydWN0IFZlcnRleE91dHB1dCB7XG4gICAgQGJ1aWx0aW4ocG9zaXRpb24pIHBvc2l0aW9uOiB2ZWM0PGYzMj4sXG4gICAgQGxvY2F0aW9uKDApIGNvbG9yOiB2ZWM0PGYzMj4sXG59XG5cbnN0cnVjdCBGaWxsVW5pZm9ybXMge1xuICAgIGNvbG9yOiB2ZWM0PGYzMj4sXG4gICAgbWF0cml4MDogdmVjNDxmMzI+LFxuICAgIG1hdHJpeDE6IHZlYzQ8ZjMyPixcbiAgICBtYXRyaXgyOiB2ZWM0PGYzMj4sXG59XG5cbkBncm91cCgwKSBAYmluZGluZygwKSB2YXI8dW5pZm9ybT4gdW5pZm9ybXM6IEZpbGxVbmlmb3JtcztcblxuQHZlcnRleFxuZm4gbWFpbihpbnB1dDogVmVydGV4SW5wdXQpIC0+IFZlcnRleE91dHB1dCB7XG4gICAgdmFyIG91dHB1dDogVmVydGV4T3V0cHV0O1xuICAgIGxldCBtYXRyaXggPSBtYXQzeDM8ZjMyPih1bmlmb3Jtcy5tYXRyaXgwLnh5eiwgdW5pZm9ybXMubWF0cml4MS54eXosIHVuaWZvcm1zLm1hdHJpeDIueHl6KTtcbiAgICBsZXQgdHJhbnNmb3JtZWQgPSBtYXRyaXggKiB2ZWMzPGYzMj4oaW5wdXQucG9zaXRpb24sIDEuMCk7XG4gICAgbGV0IG5kYyA9IHRyYW5zZm9ybWVkLnh5ICogMi4wIC0gMS4wO1xuICAgIG91dHB1dC5wb3NpdGlvbiA9IHZlYzQ8ZjMyPihuZGMueCwgbmRjLnkgKiB5RmxpcFNpZ24sIDAuMCwgMS4wKTtcbiAgICBvdXRwdXQuY29sb3IgPSB1bmlmb3Jtcy5jb2xvcjtcbiAgICByZXR1cm4gb3V0cHV0O1xufVxuIixUaT0iXG5vdmVycmlkZSB5RmxpcFNpZ246IGYzMiA9IDEuMDtcblxuc3RydWN0IFZlcnRleElucHV0IHtcbiAgICBAbG9jYXRpb24oMCkgcG9zaXRpb246IHZlYzI8ZjMyPixcbiAgICBAbG9jYXRpb24oMSkgdGV4Q29vcmQ6IHZlYzI8ZjMyPixcbn1cblxuc3RydWN0IFZlcnRleE91dHB1dCB7XG4gICAgQGJ1aWx0aW4ocG9zaXRpb24pIHBvc2l0aW9uOiB2ZWM0PGYzMj4sXG4gICAgQGxvY2F0aW9uKDApIHRleENvb3JkOiB2ZWMyPGYzMj4sXG4gICAgQGxvY2F0aW9uKDEpIGNvbG9yOiB2ZWM0PGYzMj4sXG59XG5cbnN0cnVjdCBVbmlmb3JtcyB7XG4gICAgbWF0cml4OiBtYXQzeDM8ZjMyPixcbiAgICBjb2xvcjogdmVjNDxmMzI+LFxuICAgIGFscGhhOiBmMzIsXG59XG5cbkBncm91cCgwKSBAYmluZGluZygwKSB2YXI8dW5pZm9ybT4gdW5pZm9ybXM6IFVuaWZvcm1zO1xuXG5AdmVydGV4XG5mbiBtYWluKGlucHV0OiBWZXJ0ZXhJbnB1dCkgLT4gVmVydGV4T3V0cHV0IHtcbiAgICB2YXIgb3V0cHV0OiBWZXJ0ZXhPdXRwdXQ7XG4gICAgbGV0IHBvcyA9IHVuaWZvcm1zLm1hdHJpeCAqIHZlYzM8ZjMyPihpbnB1dC5wb3NpdGlvbiwgMS4wKTtcbiAgICBsZXQgbmRjID0gcG9zLnh5ICogMi4wIC0gMS4wO1xuICAgIG91dHB1dC5wb3NpdGlvbiA9IHZlYzQ8ZjMyPihuZGMueCwgbmRjLnkgKiB5RmxpcFNpZ24sIDAuMCwgMS4wKTtcbiAgICBvdXRwdXQudGV4Q29vcmQgPSBpbnB1dC50ZXhDb29yZDtcbiAgICBsZXQgcHJlbXVsdGlwbGllZENvbG9yID0gdmVjNDxmMzI+KFxuICAgICAgICB1bmlmb3Jtcy5jb2xvci5yZ2IgKiB1bmlmb3Jtcy5jb2xvci5hICogdW5pZm9ybXMuYWxwaGEsXG4gICAgICAgIHVuaWZvcm1zLmNvbG9yLmEgKiB1bmlmb3Jtcy5hbHBoYVxuICAgICk7XG4gICAgb3V0cHV0LmNvbG9yID0gcHJlbXVsdGlwbGllZENvbG9yO1xuICAgIHJldHVybiBvdXRwdXQ7XG59XG4iLEJpPSJcbm92ZXJyaWRlIHlGbGlwU2lnbjogZjMyID0gMS4wO1xuXG5zdHJ1Y3QgVmVydGV4SW5wdXQge1xuICAgIEBsb2NhdGlvbigwKSBwb3NpdGlvbjogdmVjMjxmMzI+LFxuICAgIEBsb2NhdGlvbigxKSBiZXppZXI6IHZlYzI8ZjMyPixcbn1cblxuc3RydWN0IFZlcnRleE91dHB1dCB7XG4gICAgQGJ1aWx0aW4ocG9zaXRpb24pIHBvc2l0aW9uOiB2ZWM0PGYzMj4sXG4gICAgQGxvY2F0aW9uKDApIHZfdXY6IHZlYzI8ZjMyPixcbiAgICBAbG9jYXRpb24oMSkgYmV6aWVyOiB2ZWMyPGYzMj4sXG4gICAgQGxvY2F0aW9uKDIpIGNvbG9yOiB2ZWM0PGYzMj4sXG59XG5cbnN0cnVjdCBHcmFkaWVudFVuaWZvcm1zIHtcbiAgICBpbnZlcnNlTWF0cml4OiBtYXQzeDM8ZjMyPixcbiAgICBncmFkaWVudFR5cGU6IGYzMixcbiAgICBmb2NhbDogZjMyLFxuICAgIHNwcmVhZDogZjMyLFxuICAgIHJhZGl1czogZjMyLFxuICAgIGxpbmVhclBvaW50czogdmVjNDxmMzI+LFxuICAgIGNvbG9yOiB2ZWM0PGYzMj4sXG4gICAgY29udGV4dE1hdHJpeDA6IHZlYzQ8ZjMyPixcbiAgICBjb250ZXh0TWF0cml4MTogdmVjNDxmMzI+LFxuICAgIGNvbnRleHRNYXRyaXgyOiB2ZWM0PGYzMj4sXG59XG5cbkBncm91cCgwKSBAYmluZGluZygwKSB2YXI8dW5pZm9ybT4gZ3JhZGllbnQ6IEdyYWRpZW50VW5pZm9ybXM7XG5cbkB2ZXJ0ZXhcbmZuIG1haW4oaW5wdXQ6IFZlcnRleElucHV0KSAtPiBWZXJ0ZXhPdXRwdXQge1xuICAgIHZhciBvdXRwdXQ6IFZlcnRleE91dHB1dDtcbiAgICBsZXQgY29udGV4dE1hdHJpeCA9IG1hdDN4MzxmMzI+KGdyYWRpZW50LmNvbnRleHRNYXRyaXgwLnh5eiwgZ3JhZGllbnQuY29udGV4dE1hdHJpeDEueHl6LCBncmFkaWVudC5jb250ZXh0TWF0cml4Mi54eXopO1xuICAgIGxldCBwb3MgPSBjb250ZXh0TWF0cml4ICogdmVjMzxmMzI+KGlucHV0LnBvc2l0aW9uLCAxLjApO1xuICAgIGxldCBuZGMgPSB2ZWMyPGYzMj4ocG9zLnggKiAyLjAgLSAxLjAsIHBvcy55ICogMi4wIC0gMS4wKTtcbiAgICBvdXRwdXQucG9zaXRpb24gPSB2ZWM0PGYzMj4obmRjLngsIG5kYy55ICogeUZsaXBTaWduLCAwLjAsIDEuMCk7XG4gICAgbGV0IHV2UG9zID0gZ3JhZGllbnQuaW52ZXJzZU1hdHJpeCAqIHZlYzM8ZjMyPihpbnB1dC5wb3NpdGlvbiwgMS4wKTtcbiAgICBvdXRwdXQudl91diA9IHV2UG9zLnh5O1xuICAgIG91dHB1dC5iZXppZXIgPSBpbnB1dC5iZXppZXI7XG4gICAgb3V0cHV0LmNvbG9yID0gZ3JhZGllbnQuY29sb3I7XG4gICAgcmV0dXJuIG91dHB1dDtcbn1cbiIsT2k9Ilxub3ZlcnJpZGUgeUZsaXBTaWduOiBmMzIgPSAxLjA7XG5cbnN0cnVjdCBWZXJ0ZXhJbnB1dCB7XG4gICAgQGxvY2F0aW9uKDApIHBvc2l0aW9uOiB2ZWMyPGYzMj4sXG4gICAgQGxvY2F0aW9uKDEpIGJlemllcjogdmVjMjxmMzI+LFxufVxuXG5zdHJ1Y3QgVmVydGV4T3V0cHV0IHtcbiAgICBAYnVpbHRpbihwb3NpdGlvbikgcG9zaXRpb246IHZlYzQ8ZjMyPixcbiAgICBAbG9jYXRpb24oMCkgYmV6aWVyOiB2ZWMyPGYzMj4sXG4gICAgQGxvY2F0aW9uKDEpIGNvbG9yOiB2ZWM0PGYzMj4sXG4gICAgQGxvY2F0aW9uKDIpIHdvcmxkUG9zOiB2ZWMyPGYzMj4sXG59XG5cbnN0cnVjdCBCaXRtYXBVbmlmb3JtcyB7XG4gICAgYml0bWFwTWF0cml4OiBtYXQzeDM8ZjMyPixcbiAgICB3aWR0aDogZjMyLFxuICAgIGhlaWdodDogZjMyLFxuICAgIHJlcGVhdDogZjMyLFxuICAgIF9wYWQ6IGYzMixcbiAgICBjb2xvcjogdmVjNDxmMzI+LFxuICAgIGNvbnRleHRNYXRyaXgwOiB2ZWM0PGYzMj4sXG4gICAgY29udGV4dE1hdHJpeDE6IHZlYzQ8ZjMyPixcbiAgICBjb250ZXh0TWF0cml4MjogdmVjNDxmMzI+LFxufVxuXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyPHVuaWZvcm0+IGJpdG1hcDogQml0bWFwVW5pZm9ybXM7XG5cbkB2ZXJ0ZXhcbmZuIG1haW4oaW5wdXQ6IFZlcnRleElucHV0KSAtPiBWZXJ0ZXhPdXRwdXQge1xuICAgIHZhciBvdXRwdXQ6IFZlcnRleE91dHB1dDtcbiAgICBsZXQgbWF0cml4ID0gbWF0M3gzPGYzMj4oYml0bWFwLmNvbnRleHRNYXRyaXgwLnh5eiwgYml0bWFwLmNvbnRleHRNYXRyaXgxLnh5eiwgYml0bWFwLmNvbnRleHRNYXRyaXgyLnh5eik7XG4gICAgbGV0IHRyYW5zZm9ybWVkUG9zID0gbWF0cml4ICogdmVjMzxmMzI+KGlucHV0LnBvc2l0aW9uLCAxLjApO1xuICAgIGxldCBjbGlwWCA9IHRyYW5zZm9ybWVkUG9zLnggKiAyLjAgLSAxLjA7XG4gICAgbGV0IGNsaXBZID0gKHRyYW5zZm9ybWVkUG9zLnkgKiAyLjAgLSAxLjApICogeUZsaXBTaWduO1xuICAgIG91dHB1dC5wb3NpdGlvbiA9IHZlYzQ8ZjMyPihjbGlwWCwgY2xpcFksIDAuMCwgMS4wKTtcbiAgICBvdXRwdXQuYmV6aWVyID0gaW5wdXQuYmV6aWVyO1xuICAgIG91dHB1dC5jb2xvciA9IGJpdG1hcC5jb2xvcjtcbiAgICBvdXRwdXQud29ybGRQb3MgPSBpbnB1dC5wb3NpdGlvbjtcbiAgICByZXR1cm4gb3V0cHV0O1xufVxuIixBaT0iXG5mbiBpc0luc2lkZSh1djogdmVjMjxmMzI+KSAtPiBmMzIge1xuICAgIGxldCBzID0gc3RlcCh2ZWMyPGYzMj4oMC4wKSwgdXYpICogc3RlcCh1diwgdmVjMjxmMzI+KDEuMCkpO1xuICAgIHJldHVybiBzLnggKiBzLnk7XG59IixSaT0iXG4gICAgY29uc3QgdmVydGljZXMgPSBhcnJheTx2ZWMyPGYzMj4sIDY+KFxuICAgICAgICB2ZWMyPGYzMj4oMC4wLCAwLjApLFxuICAgICAgICB2ZWMyPGYzMj4oMS4wLCAwLjApLFxuICAgICAgICB2ZWMyPGYzMj4oMC4wLCAxLjApLFxuICAgICAgICB2ZWMyPGYzMj4oMC4wLCAxLjApLFxuICAgICAgICB2ZWMyPGYzMj4oMS4wLCAwLjApLFxuICAgICAgICB2ZWMyPGYzMj4oMS4wLCAxLjApXG4gICAgKTsiLENpPSJcbnN0cnVjdCBWZXJ0ZXhPdXRwdXQge1xuICAgIEBidWlsdGluKHBvc2l0aW9uKSBwb3NpdGlvbjogdmVjNDxmMzI+LFxuICAgIEBsb2NhdGlvbigwKSB0ZXhDb29yZDogdmVjMjxmMzI+LFxufSIsRWk9ZT0+YFxuJHtDaX1cblxuQHZlcnRleFxuZm4gbWFpbihAYnVpbHRpbih2ZXJ0ZXhfaW5kZXgpIHZlcnRleEluZGV4OiB1MzIpIC0+IFZlcnRleE91dHB1dCB7XG4gICAgdmFyIG91dHB1dDogVmVydGV4T3V0cHV0O1xuXG4gICAgY29uc3QgcG9zaXRpb25zID0gYXJyYXk8dmVjMjxmMzI+LCA2PihcbiAgICAgICAgdmVjMjxmMzI+KC0xLjAsIC0xLjApLFxuICAgICAgICB2ZWMyPGYzMj4oIDEuMCwgLTEuMCksXG4gICAgICAgIHZlYzI8ZjMyPigtMS4wLCAgMS4wKSxcbiAgICAgICAgdmVjMjxmMzI+KC0xLjAsICAxLjApLFxuICAgICAgICB2ZWMyPGYzMj4oIDEuMCwgLTEuMCksXG4gICAgICAgIHZlYzI8ZjMyPiggMS4wLCAgMS4wKVxuICAgICk7XG4gICAgdmFyIHRleENvb3JkcyA9IGFycmF5PHZlYzI8ZjMyPiwgNj4oXG4gICAgICAgIHZlYzI8ZjMyPigwLjAsICR7ZT8iMS4wIjoiMC4wIn0pLFxuICAgICAgICB2ZWMyPGYzMj4oMS4wLCAke2U/IjEuMCI6IjAuMCJ9KSxcbiAgICAgICAgdmVjMjxmMzI+KDAuMCwgJHtlPyIwLjAiOiIxLjAifSksXG4gICAgICAgIHZlYzI8ZjMyPigwLjAsICR7ZT8iMC4wIjoiMS4wIn0pLFxuICAgICAgICB2ZWMyPGYzMj4oMS4wLCAke2U/IjEuMCI6IjAuMCJ9KSxcbiAgICAgICAgdmVjMjxmMzI+KDEuMCwgJHtlPyIwLjAiOiIxLjAifSlcbiAgICApO1xuICAgIG91dHB1dC5wb3NpdGlvbiA9IHZlYzQ8ZjMyPihwb3NpdGlvbnNbdmVydGV4SW5kZXhdLCAwLjAsIDEuMCk7XG4gICAgb3V0cHV0LnRleENvb3JkID0gdGV4Q29vcmRzW3ZlcnRleEluZGV4XTtcbiAgICByZXR1cm4gb3V0cHV0O1xufVxuYCxVaT1FaSghMCksJGk9RWkoITEpLEdpPUVpKCExKSxraT1gXG5zdHJ1Y3QgUG9zaXRpb25Vbmlmb3JtcyB7XG4gICAgb2Zmc2V0OiB2ZWMyPGYzMj4sXG4gICAgc2l6ZTogdmVjMjxmMzI+LFxuICAgIHZpZXdwb3J0OiB2ZWMyPGYzMj4sXG4gICAgcGFkZGluZzogdmVjMjxmMzI+LFxufVxuXG5zdHJ1Y3QgVmVydGV4T3V0cHV0IHtcbiAgICBAYnVpbHRpbihwb3NpdGlvbikgcG9zaXRpb246IHZlYzQ8ZjMyPixcbiAgICBAbG9jYXRpb24oMCkgdGV4Q29vcmQ6IHZlYzI8ZjMyPixcbn1cblxuQGdyb3VwKDApIEBiaW5kaW5nKDApIHZhcjx1bmlmb3JtPiB1bmlmb3JtczogUG9zaXRpb25Vbmlmb3JtcztcblxuQHZlcnRleFxuZm4gbWFpbihAYnVpbHRpbih2ZXJ0ZXhfaW5kZXgpIHZlcnRleEluZGV4OiB1MzIpIC0+IFZlcnRleE91dHB1dCB7XG4gICAgdmFyIG91dHB1dDogVmVydGV4T3V0cHV0O1xuJHtSaX1cbiAgICBsZXQgdmVydGV4ID0gdmVydGljZXNbdmVydGV4SW5kZXhdO1xuICAgIG91dHB1dC50ZXhDb29yZCA9IHZlYzI8ZjMyPih2ZXJ0ZXgueCwgMS4wIC0gdmVydGV4LnkpO1xuICAgIHZhciBwb3NpdGlvbiA9IHZlcnRleCAqIHVuaWZvcm1zLnNpemUgKyB1bmlmb3Jtcy5vZmZzZXQ7XG4gICAgcG9zaXRpb24gPSBwb3NpdGlvbiAvIHVuaWZvcm1zLnZpZXdwb3J0O1xuICAgIHBvc2l0aW9uID0gcG9zaXRpb24gKiAyLjAgLSAxLjA7XG4gICAgb3V0cHV0LnBvc2l0aW9uID0gdmVjNDxmMzI+KHBvc2l0aW9uLngsIC1wb3NpdGlvbi55LCAwLjAsIDEuMCk7XG4gICAgcmV0dXJuIG91dHB1dDtcbn1cbmAsTGk9YFxuc3RydWN0IEJpdG1hcFN5bmNVbmlmb3JtcyB7XG4gICAgbm9kZVJlY3Q6IHZlYzQ8ZjMyPixcbiAgICB0ZXh0dXJlU2l6ZTogdmVjMjxmMzI+LFxuICAgIHBhZGRpbmc6IHZlYzI8ZjMyPixcbn1cblxuc3RydWN0IFZlcnRleE91dHB1dCB7XG4gICAgQGJ1aWx0aW4ocG9zaXRpb24pIHBvc2l0aW9uOiB2ZWM0PGYzMj4sXG4gICAgQGxvY2F0aW9uKDApIHRleENvb3JkOiB2ZWMyPGYzMj4sXG59XG5cbkBncm91cCgwKSBAYmluZGluZygwKSB2YXI8dW5pZm9ybT4gdW5pZm9ybXM6IEJpdG1hcFN5bmNVbmlmb3JtcztcblxuQHZlcnRleFxuZm4gbWFpbihAYnVpbHRpbih2ZXJ0ZXhfaW5kZXgpIHZlcnRleEluZGV4OiB1MzIpIC0+IFZlcnRleE91dHB1dCB7XG4gICAgdmFyIG91dHB1dDogVmVydGV4T3V0cHV0O1xuJHtSaX1cbiAgICBsZXQgdmVydGV4ID0gdmVydGljZXNbdmVydGV4SW5kZXhdO1xuICAgIGxldCBwaXhlbFBvcyA9IHZlYzI8ZjMyPihcbiAgICAgICAgdW5pZm9ybXMubm9kZVJlY3QueCArIHZlcnRleC54ICogdW5pZm9ybXMubm9kZVJlY3QueixcbiAgICAgICAgdW5pZm9ybXMubm9kZVJlY3QueSArIHZlcnRleC55ICogdW5pZm9ybXMubm9kZVJlY3Qud1xuICAgICk7XG4gICAgbGV0IG5kYyA9IHBpeGVsUG9zIC8gdW5pZm9ybXMudGV4dHVyZVNpemUgKiAyLjAgLSAxLjA7XG4gICAgb3V0cHV0LnBvc2l0aW9uID0gdmVjNDxmMzI+KG5kYy54LCAtbmRjLnksIDAuMCwgMS4wKTtcbiAgICBvdXRwdXQudGV4Q29vcmQgPSBwaXhlbFBvcyAvIHVuaWZvcm1zLnRleHR1cmVTaXplO1xuICAgIHJldHVybiBvdXRwdXQ7XG59XG5gLElpPWU9PmBcblxuc3RydWN0IFNjYWxlVW5pZm9ybXMge1xuICAgIG1hdHJpeDogdmVjNDxmMzI+LFxuICAgIHRyYW5zbGF0ZTogdmVjMjxmMzI+LFxuICAgIHNyY1NpemU6IHZlYzI8ZjMyPixcbiAgICBkc3RTaXplOiB2ZWMyPGYzMj4sXG4gICAgcGFkZGluZzogdmVjMjxmMzI+LFxufVxuXG5zdHJ1Y3QgVmVydGV4T3V0cHV0IHtcbiAgICBAYnVpbHRpbihwb3NpdGlvbikgcG9zaXRpb246IHZlYzQ8ZjMyPixcbiAgICBAbG9jYXRpb24oMCkgdGV4Q29vcmQ6IHZlYzI8ZjMyPixcbn1cblxuQGdyb3VwKDApIEBiaW5kaW5nKDApIHZhcjx1bmlmb3JtPiB1bmlmb3JtczogU2NhbGVVbmlmb3JtcztcblxuXG5AdmVydGV4XG5mbiBtYWluKEBidWlsdGluKHZlcnRleF9pbmRleCkgdmVydGV4SW5kZXg6IHUzMikgLT4gVmVydGV4T3V0cHV0IHtcbiAgICB2YXIgb3V0cHV0OiBWZXJ0ZXhPdXRwdXQ7XG4ke1JpfVxuICAgIGxldCB2ZXJ0ZXggPSB2ZXJ0aWNlc1t2ZXJ0ZXhJbmRleF07XG4gICAgb3V0cHV0LnRleENvb3JkID0gJHtlPyJ2ZWMyPGYzMj4odmVydGV4LngsIDEuMCAtIHZlcnRleC55KSI6InZlcnRleCJ9O1xuXG4gICAgdmFyIHBvcyA9IHZlcnRleCAqIHVuaWZvcm1zLnNyY1NpemU7XG4gICAgbGV0IGEgPSB1bmlmb3Jtcy5tYXRyaXgueDtcbiAgICBsZXQgYiA9IHVuaWZvcm1zLm1hdHJpeC55O1xuICAgIGxldCBjID0gdW5pZm9ybXMubWF0cml4Lno7XG4gICAgbGV0IGQgPSB1bmlmb3Jtcy5tYXRyaXgudztcbiAgICBsZXQgdHggPSB1bmlmb3Jtcy50cmFuc2xhdGUueDtcbiAgICBsZXQgdHkgPSB1bmlmb3Jtcy50cmFuc2xhdGUueTtcbiAgICBsZXQgdHJhbnNmb3JtZWRYID0gcG9zLnggKiBhICsgcG9zLnkgKiBjICsgdHg7XG4gICAgbGV0IHRyYW5zZm9ybWVkWSA9IHBvcy54ICogYiArIHBvcy55ICogZCArIHR5O1xuICAgIHZhciBwb3NpdGlvbiA9IHZlYzI8ZjMyPih0cmFuc2Zvcm1lZFgsIHRyYW5zZm9ybWVkWSkgLyB1bmlmb3Jtcy5kc3RTaXplO1xuICAgIHBvc2l0aW9uID0gcG9zaXRpb24gKiAyLjAgLSAxLjA7XG4gICAgb3V0cHV0LnBvc2l0aW9uID0gdmVjNDxmMzI+KHBvc2l0aW9uLngsIC1wb3NpdGlvbi55LCAwLjAsIDEuMCk7XG5cbiAgICByZXR1cm4gb3V0cHV0O1xufVxuYCxWaT1JaSghMSksemk9SWkoITApLGppPUlpKCExKSxEaT1lPT5gXG5zdHJ1Y3QgUG9zaXRpb25Vbmlmb3JtcyB7XG4gICAgb2Zmc2V0OiB2ZWMyPGYzMj4sXG4gICAgc2l6ZTogdmVjMjxmMzI+LFxuICAgIHZpZXdwb3J0OiB2ZWMyPGYzMj4sXG4gICAgcGFkZGluZzogdmVjMjxmMzI+LFxufVxuXG5zdHJ1Y3QgVmVydGV4T3V0cHV0IHtcbiAgICBAYnVpbHRpbihwb3NpdGlvbikgcG9zaXRpb246IHZlYzQ8ZjMyPixcbiAgICBAbG9jYXRpb24oMCkgdGV4Q29vcmQ6IHZlYzI8ZjMyPixcbn1cblxuQGdyb3VwKDApIEBiaW5kaW5nKDApIHZhcjx1bmlmb3JtPiB1bmlmb3JtczogUG9zaXRpb25Vbmlmb3JtcztcblxuQHZlcnRleFxuZm4gbWFpbihAYnVpbHRpbih2ZXJ0ZXhfaW5kZXgpIHZlcnRleEluZGV4OiB1MzIpIC0+IFZlcnRleE91dHB1dCB7XG4gICAgdmFyIG91dHB1dDogVmVydGV4T3V0cHV0O1xuJHtSaX1cbiAgICBsZXQgdmVydGV4ID0gdmVydGljZXNbdmVydGV4SW5kZXhdO1xuICAgIG91dHB1dC50ZXhDb29yZCA9ICR7ZT8idmVjMjxmMzI+KHZlcnRleC54LCAxLjAgLSB2ZXJ0ZXgueSkiOiJ2ZXJ0ZXgifTtcbiAgICB2YXIgcG9zaXRpb24gPSB2ZXJ0ZXggKiB1bmlmb3Jtcy5zaXplICsgdW5pZm9ybXMub2Zmc2V0O1xuICAgIHBvc2l0aW9uID0gcG9zaXRpb24gLyB1bmlmb3Jtcy52aWV3cG9ydDtcbiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uICogMi4wIC0gMS4wO1xuICAgIG91dHB1dC5wb3NpdGlvbiA9IHZlYzQ8ZjMyPihwb3NpdGlvbi54LCAtcG9zaXRpb24ueSwgMC4wLCAxLjApO1xuICAgIHJldHVybiBvdXRwdXQ7XG59XG5gLE5pPURpKCExKSxXaT1EaSghMCkscWk9Ilxuc3RydWN0IEdyYWRpZW50VW5pZm9ybXMge1xuICAgIGludmVyc2VNYXRyaXg6IG1hdDN4MzxmMzI+LFxuICAgIGdyYWRpZW50VHlwZTogZjMyLFxuICAgIGZvY2FsOiBmMzIsXG4gICAgc3ByZWFkOiBmMzIsXG4gICAgcmFkaXVzOiBmMzIsXG4gICAgbGluZWFyUG9pbnRzOiB2ZWM0PGYzMj4sXG59XG5cbkBncm91cCgwKSBAYmluZGluZygwKSB2YXI8dW5pZm9ybT4gZ3JhZGllbnQ6IEdyYWRpZW50VW5pZm9ybXM7XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMSkgdmFyIGdyYWRpZW50U2FtcGxlcjogc2FtcGxlcjtcbkBncm91cCgwKSBAYmluZGluZygyKSB2YXIgZ3JhZGllbnRUZXh0dXJlOiB0ZXh0dXJlXzJkPGYzMj47XG5cbm92ZXJyaWRlIEdSQURJRU5UX1RZUEU6IHUzMiA9IDB1O1xub3ZlcnJpZGUgU1BSRUFEX01PREU6IHUzMiA9IDJ1O1xuXG5mbiBhcHBseVNwcmVhZCh0OiBmMzIpIC0+IGYzMiB7XG4gICAgaWYgKFNQUkVBRF9NT0RFID09IDB1KSB7XG4gICAgICAgIHJldHVybiAxLjAgLSBhYnMoZnJhY3QodCAqIDAuNSkgKiAyLjAgLSAxLjApO1xuICAgIH0gZWxzZSBpZiAoU1BSRUFEX01PREUgPT0gMXUpIHtcbiAgICAgICAgcmV0dXJuIGZyYWN0KHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjbGFtcCh0LCAwLjAsIDEuMCk7XG4gICAgfVxufVxuIixYaT0iXG4gICAgdmFyIHQ6IGYzMjtcbiAgICBpZiAoR1JBRElFTlRfVFlQRSA9PSAwdSkge1xuICAgICAgICBsZXQgYSA9IGdyYWRpZW50LmxpbmVhclBvaW50cy54eTtcbiAgICAgICAgbGV0IGIgPSBncmFkaWVudC5saW5lYXJQb2ludHMuenc7XG4gICAgICAgIGxldCBhYiA9IGIgLSBhO1xuICAgICAgICBsZXQgYXAgPSBwIC0gYTtcbiAgICAgICAgbGV0IGRvdEFCID0gZG90KGFiLCBhYik7XG4gICAgICAgIGlmIChkb3RBQiA8IDAuMDAwMSkge1xuICAgICAgICAgICAgdCA9IDAuMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHQgPSBkb3QoYWIsIGFwKSAvIGRvdEFCO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IHIgPSBncmFkaWVudC5yYWRpdXM7XG4gICAgICAgIGxldCBjb29yZCA9IHAgLyByO1xuICAgICAgICBsZXQgZm9jYWxSYXRpbyA9IGdyYWRpZW50LmZvY2FsO1xuXG4gICAgICAgIGlmIChhYnMoZm9jYWxSYXRpbykgPCAwLjAwMSkge1xuICAgICAgICAgICAgdCA9IGxlbmd0aChjb29yZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgZm9jYWwgPSB2ZWMyPGYzMj4oZm9jYWxSYXRpbywgMC4wKTtcbiAgICAgICAgICAgIGxldCBkaWZmID0gY29vcmQgLSBmb2NhbDtcbiAgICAgICAgICAgIGxldCBsZW5EaWZmID0gbGVuZ3RoKGRpZmYpO1xuXG4gICAgICAgICAgICBpZiAobGVuRGlmZiA8IDAuMDAwMSkge1xuICAgICAgICAgICAgICAgIHQgPSAwLjA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBkaXIgPSBkaWZmIC8gbGVuRGlmZjtcblxuICAgICAgICAgICAgICAgIC8vIFNvbHZlIHF1YWRyYXRpYyBlcXVhdGlvbiBmb3IgdW5pdCBjaXJjbGUgaW50ZXJzZWN0aW9uIChhPTEgc2luY2UgZGlyIGlzIG5vcm1hbGl6ZWQpXG4gICAgICAgICAgICAgICAgbGV0IGJfY29lZiA9IDIuMCAqIGRvdChkaXIsIGZvY2FsKTtcbiAgICAgICAgICAgICAgICBsZXQgY19jb2VmID0gZG90KGZvY2FsLCBmb2NhbCkgLSAxLjA7XG4gICAgICAgICAgICAgICAgbGV0IGRpc2NyaW1pbmFudCA9IGJfY29lZiAqIGJfY29lZiAtIDQuMCAqIGNfY29lZjtcbiAgICAgICAgICAgICAgICBsZXQgeCA9ICgtYl9jb2VmICsgc3FydChtYXgoZGlzY3JpbWluYW50LCAwLjApKSkgKiAwLjU7XG4gICAgICAgICAgICAgICAgdCA9IGxlbkRpZmYgLyBhYnMoeCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgdCA9IGFwcGx5U3ByZWFkKHQpO1xuICAgIGxldCBncmFkaWVudENvbG9yID0gdGV4dHVyZVNhbXBsZUxldmVsKGdyYWRpZW50VGV4dHVyZSwgZ3JhZGllbnRTYW1wbGVyLCB2ZWMyPGYzMj4odCwgMC41KSwgMCk7XG4iLFlpPWBcbnN0cnVjdCBWZXJ0ZXhPdXRwdXQge1xuICAgIEBidWlsdGluKHBvc2l0aW9uKSBwb3NpdGlvbjogdmVjNDxmMzI+LFxuICAgIEBsb2NhdGlvbigwKSB2X3V2OiB2ZWMyPGYzMj4sXG4gICAgQGxvY2F0aW9uKDEpIGJlemllcjogdmVjMjxmMzI+LFxuICAgIEBsb2NhdGlvbigyKSBjb2xvcjogdmVjNDxmMzI+LFxufVxuJHtxaX1cblxuQGZyYWdtZW50XG5mbiBtYWluKGlucHV0OiBWZXJ0ZXhPdXRwdXQpIC0+IEBsb2NhdGlvbigwKSB2ZWM0PGYzMj4ge1xuICAgIGxldCBwID0gaW5wdXQudl91djtcbiR7WGl9XG4gICAgbGV0IHJlc3VsdCA9IGdyYWRpZW50Q29sb3IgKiBpbnB1dC5jb2xvcjtcbiAgICByZXR1cm4gdmVjNDxmMzI+KHJlc3VsdC5yZ2IgKiByZXN1bHQuYSwgcmVzdWx0LmEpO1xufVxuYCxLaT1gXG5zdHJ1Y3QgVmVydGV4T3V0cHV0IHtcbiAgICBAYnVpbHRpbihwb3NpdGlvbikgcG9zaXRpb246IHZlYzQ8ZjMyPixcbiAgICBAbG9jYXRpb24oMCkgdl91djogdmVjMjxmMzI+LFxuICAgIEBsb2NhdGlvbigxKSBiZXppZXI6IHZlYzI8ZjMyPixcbiAgICBAbG9jYXRpb24oMikgY29sb3I6IHZlYzQ8ZjMyPixcbn1cbiR7cWl9XG5cbkBmcmFnbWVudFxuZm4gbWFpbihpbnB1dDogVmVydGV4T3V0cHV0KSAtPiBAbG9jYXRpb24oMCkgdmVjNDxmMzI+IHtcbiAgICBsZXQgcCA9IGlucHV0LnZfdXY7XG4ke1hpfVxuICAgIHJldHVybiB2ZWM0PGYzMj4oZ3JhZGllbnRDb2xvci5yZ2IgKiBncmFkaWVudENvbG9yLmEsIGdyYWRpZW50Q29sb3IuYSk7XG59XG5gLEhpPWBcbnN0cnVjdCBWZXJ0ZXhPdXRwdXQge1xuICAgIEBidWlsdGluKHBvc2l0aW9uKSBwb3NpdGlvbjogdmVjNDxmMzI+LFxuICAgIEBsb2NhdGlvbigwKSB0ZXhDb29yZDogdmVjMjxmMzI+LFxuICAgIEBsb2NhdGlvbigxKSBjb2xvcjogdmVjNDxmMzI+LFxufVxuJHtxaX1cblxuQGZyYWdtZW50XG5mbiBtYWluKGlucHV0OiBWZXJ0ZXhPdXRwdXQpIC0+IEBsb2NhdGlvbigwKSB2ZWM0PGYzMj4ge1xuICAgIGxldCBwID0gaW5wdXQudGV4Q29vcmQ7XG4ke1hpfVxuICAgIGxldCByZXN1bHQgPSBncmFkaWVudENvbG9yICogaW5wdXQuY29sb3I7XG4gICAgcmV0dXJuIHZlYzQ8ZjMyPihyZXN1bHQucmdiICogcmVzdWx0LmEsIHJlc3VsdC5hKTtcbn1cbmAsUWk9YFxuJHtDaX1cblxuc3RydWN0IENvcHlVbmlmb3JtcyB7XG4gICAgc2NhbGU6IHZlYzI8ZjMyPixcbiAgICBvZmZzZXQ6IHZlYzI8ZjMyPixcbn1cblxuQGdyb3VwKDApIEBiaW5kaW5nKDApIHZhcjx1bmlmb3JtPiB1bmlmb3JtczogQ29weVVuaWZvcm1zO1xuQGdyb3VwKDApIEBiaW5kaW5nKDEpIHZhciB0ZXh0dXJlU2FtcGxlcjogc2FtcGxlcjtcbkBncm91cCgwKSBAYmluZGluZygyKSB2YXIgaW5wdXRUZXh0dXJlOiB0ZXh0dXJlXzJkPGYzMj47XG5cbkBmcmFnbWVudFxuZm4gbWFpbihpbnB1dDogVmVydGV4T3V0cHV0KSAtPiBAbG9jYXRpb24oMCkgdmVjNDxmMzI+IHtcbiAgICBsZXQgdXYgPSBpbnB1dC50ZXhDb29yZCAqIHVuaWZvcm1zLnNjYWxlICsgdW5pZm9ybXMub2Zmc2V0O1xuICAgIHJldHVybiB0ZXh0dXJlU2FtcGxlTGV2ZWwoaW5wdXRUZXh0dXJlLCB0ZXh0dXJlU2FtcGxlciwgdXYsIDApO1xufVxuYCxaaT1gXG4ke0NpfVxuXG5zdHJ1Y3QgQ29weVVuaWZvcm1zIHtcbiAgICBzY2FsZTogdmVjMjxmMzI+LFxuICAgIG9mZnNldDogdmVjMjxmMzI+LFxufVxuXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyPHVuaWZvcm0+IHVuaWZvcm1zOiBDb3B5VW5pZm9ybXM7XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMSkgdmFyIHRleHR1cmVTYW1wbGVyOiBzYW1wbGVyO1xuQGdyb3VwKDApIEBiaW5kaW5nKDIpIHZhciBpbnB1dFRleHR1cmU6IHRleHR1cmVfMmQ8ZjMyPjtcblxuQGZyYWdtZW50XG5mbiBtYWluKGlucHV0OiBWZXJ0ZXhPdXRwdXQpIC0+IEBsb2NhdGlvbigwKSB2ZWM0PGYzMj4ge1xuICAgIGxldCB1diA9IChpbnB1dC50ZXhDb29yZCAtIHVuaWZvcm1zLm9mZnNldCkgKiB1bmlmb3Jtcy5zY2FsZTtcbiAgICBsZXQgY2xhbXBlZFV2ID0gY2xhbXAodXYsIHZlYzI8ZjMyPigwLjApLCB2ZWMyPGYzMj4oMS4wKSk7XG4gICAgbGV0IGNvbG9yID0gdGV4dHVyZVNhbXBsZUxldmVsKGlucHV0VGV4dHVyZSwgdGV4dHVyZVNhbXBsZXIsIGNsYW1wZWRVdiwgMCk7XG4gICAgbGV0IGluQm91bmRzID0gdXYueCA+PSAwLjAgJiYgdXYueCA8PSAxLjAgJiYgdXYueSA+PSAwLjAgJiYgdXYueSA8PSAxLjA7XG4gICAgcmV0dXJuIHNlbGVjdCh2ZWM0PGYzMj4oMC4wLCAwLjAsIDAuMCwgMC4wKSwgY29sb3IsIGluQm91bmRzKTtcbn1cbmAsSmk9YFxuJHtDaX1cblxuc3RydWN0IENvcHlVbmlmb3JtcyB7XG4gICAgc2NhbGU6IHZlYzI8ZjMyPixcbiAgICBvZmZzZXQ6IHZlYzI8ZjMyPixcbn1cblxuQGdyb3VwKDApIEBiaW5kaW5nKDApIHZhcjx1bmlmb3JtPiB1bmlmb3JtczogQ29weVVuaWZvcm1zO1xuQGdyb3VwKDApIEBiaW5kaW5nKDEpIHZhciB0ZXh0dXJlU2FtcGxlcjogc2FtcGxlcjtcbkBncm91cCgwKSBAYmluZGluZygyKSB2YXIgaW5wdXRUZXh0dXJlOiB0ZXh0dXJlXzJkPGYzMj47XG5cbkBmcmFnbWVudFxuZm4gbWFpbihpbnB1dDogVmVydGV4T3V0cHV0KSAtPiBAbG9jYXRpb24oMCkgdmVjNDxmMzI+IHtcbiAgICBsZXQgdXYgPSBpbnB1dC50ZXhDb29yZCAqIHVuaWZvcm1zLnNjYWxlICsgdW5pZm9ybXMub2Zmc2V0O1xuICAgIGxldCBjbGFtcGVkVXYgPSBjbGFtcCh1diwgdmVjMjxmMzI+KDAuMCksIHZlYzI8ZjMyPigxLjApKTtcbiAgICBsZXQgY29sb3IgPSB0ZXh0dXJlU2FtcGxlTGV2ZWwoaW5wdXRUZXh0dXJlLCB0ZXh0dXJlU2FtcGxlciwgY2xhbXBlZFV2LCAwKTtcbiAgICBsZXQgaW5Cb3VuZHMgPSB1di54ID49IDAuMCAmJiB1di54IDw9IDEuMCAmJiB1di55ID49IDAuMCAmJiB1di55IDw9IDEuMDtcbiAgICByZXR1cm4gc2VsZWN0KHZlYzQ8ZjMyPigwLjAsIDAuMCwgMC4wLCAwLjApLCBjb2xvciwgaW5Cb3VuZHMpO1xufVxuYCxlYT1gXG4ke0NpfVxuXG5zdHJ1Y3QgQ29sb3JUcmFuc2Zvcm1Vbmlmb3JtcyB7XG4gICAgbXVsOiB2ZWM0PGYzMj4sXG4gICAgYWRkOiB2ZWM0PGYzMj4sXG59XG5cbkBncm91cCgwKSBAYmluZGluZygwKSB2YXI8dW5pZm9ybT4gY3Q6IENvbG9yVHJhbnNmb3JtVW5pZm9ybXM7XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMSkgdmFyIHRleHR1cmVTYW1wbGVyOiBzYW1wbGVyO1xuQGdyb3VwKDApIEBiaW5kaW5nKDIpIHZhciBpbnB1dFRleHR1cmU6IHRleHR1cmVfMmQ8ZjMyPjtcblxuQGZyYWdtZW50XG5mbiBtYWluKGlucHV0OiBWZXJ0ZXhPdXRwdXQpIC0+IEBsb2NhdGlvbigwKSB2ZWM0PGYzMj4ge1xuICAgIHZhciBjb2xvciA9IHRleHR1cmVTYW1wbGVMZXZlbChpbnB1dFRleHR1cmUsIHRleHR1cmVTYW1wbGVyLCBpbnB1dC50ZXhDb29yZCwgMCk7XG5cbiAgICBjb2xvciA9IHZlYzQ8ZjMyPihjb2xvci5yZ2IgLyBtYXgodmVjMzxmMzI+KDAuMDAwMSksIHZlYzM8ZjMyPihjb2xvci5hKSksIGNvbG9yLmEpO1xuICAgIGNvbG9yID0gY2xhbXAoY29sb3IgKiBjdC5tdWwgKyBjdC5hZGQsIHZlYzQ8ZjMyPigwLjApLCB2ZWM0PGYzMj4oMS4wKSk7XG4gICAgY29sb3IgPSB2ZWM0PGYzMj4oY29sb3IucmdiICogY29sb3IuYSwgY29sb3IuYSk7XG5cbiAgICByZXR1cm4gY29sb3I7XG59XG5gLHRhPWBcbiR7Q2l9XG5cbnN0cnVjdCBZRmxpcENUVW5pZm9ybXMge1xuICAgIHNjYWxlOiB2ZWMyPGYzMj4sXG4gICAgb2Zmc2V0OiB2ZWMyPGYzMj4sXG4gICAgbXVsOiB2ZWM0PGYzMj4sXG4gICAgYWRkOiB2ZWM0PGYzMj4sXG59XG5cbkBncm91cCgwKSBAYmluZGluZygwKSB2YXI8dW5pZm9ybT4gdW5pZm9ybXM6IFlGbGlwQ1RVbmlmb3JtcztcbkBncm91cCgwKSBAYmluZGluZygxKSB2YXIgdGV4dHVyZVNhbXBsZXI6IHNhbXBsZXI7XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMikgdmFyIGlucHV0VGV4dHVyZTogdGV4dHVyZV8yZDxmMzI+O1xuXG5AZnJhZ21lbnRcbmZuIG1haW4oaW5wdXQ6IFZlcnRleE91dHB1dCkgLT4gQGxvY2F0aW9uKDApIHZlYzQ8ZjMyPiB7XG4gICAgbGV0IHV2ID0gaW5wdXQudGV4Q29vcmQgKiB1bmlmb3Jtcy5zY2FsZSArIHVuaWZvcm1zLm9mZnNldDtcbiAgICB2YXIgY29sb3IgPSB0ZXh0dXJlU2FtcGxlTGV2ZWwoaW5wdXRUZXh0dXJlLCB0ZXh0dXJlU2FtcGxlciwgdXYsIDApO1xuXG4gICAgY29sb3IgPSB2ZWM0PGYzMj4oY29sb3IucmdiIC8gbWF4KHZlYzM8ZjMyPigwLjAwMDEpLCB2ZWMzPGYzMj4oY29sb3IuYSkpLCBjb2xvci5hKTtcbiAgICBjb2xvciA9IGNsYW1wKGNvbG9yICogdW5pZm9ybXMubXVsICsgdW5pZm9ybXMuYWRkLCB2ZWM0PGYzMj4oMC4wKSwgdmVjNDxmMzI+KDEuMCkpO1xuICAgIGNvbG9yID0gdmVjNDxmMzI+KGNvbG9yLnJnYiAqIGNvbG9yLmEsIGNvbG9yLmEpO1xuXG4gICAgcmV0dXJuIGNvbG9yO1xufVxuYCxyYT1gXG4ke0NpfVxuXG5zdHJ1Y3QgQ29sb3JNYXRyaXhVbmlmb3JtcyB7XG4gICAgbWF0cml4OiBtYXQ0eDQ8ZjMyPixcbiAgICBvZmZzZXQ6IHZlYzQ8ZjMyPixcbn1cblxuQGdyb3VwKDApIEBiaW5kaW5nKDApIHZhcjx1bmlmb3JtPiB1bmlmb3JtczogQ29sb3JNYXRyaXhVbmlmb3JtcztcbkBncm91cCgwKSBAYmluZGluZygxKSB2YXIgdGV4dHVyZVNhbXBsZXI6IHNhbXBsZXI7XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMikgdmFyIGlucHV0VGV4dHVyZTogdGV4dHVyZV8yZDxmMzI+O1xuXG5AZnJhZ21lbnRcbmZuIG1haW4oaW5wdXQ6IFZlcnRleE91dHB1dCkgLT4gQGxvY2F0aW9uKDApIHZlYzQ8ZjMyPiB7XG4gICAgdmFyIGNvbG9yID0gdGV4dHVyZVNhbXBsZUxldmVsKGlucHV0VGV4dHVyZSwgdGV4dHVyZVNhbXBsZXIsIGlucHV0LnRleENvb3JkLCAwKTtcblxuICAgIGNvbG9yID0gdmVjNDxmMzI+KGNvbG9yLnJnYiAvIG1heCh2ZWMzPGYzMj4oMC4wMDAxKSwgdmVjMzxmMzI+KGNvbG9yLmEpKSwgY29sb3IuYSk7XG4gICAgdmFyIHJlc3VsdCA9IHVuaWZvcm1zLm1hdHJpeCAqIGNvbG9yICsgdW5pZm9ybXMub2Zmc2V0O1xuICAgIHJlc3VsdCA9IGNsYW1wKHJlc3VsdCwgdmVjNDxmMzI+KDAuMCksIHZlYzQ8ZjMyPigxLjApKTtcbiAgICByZXN1bHQgPSB2ZWM0PGYzMj4ocmVzdWx0LnJnYiAqIHJlc3VsdC5hLCByZXN1bHQuYSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuYCxuYT1gXG4ke0NpfVxuXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMSkgdmFyIHRleHR1cmVTYW1wbGVyOiBzYW1wbGVyO1xuQGdyb3VwKDApIEBiaW5kaW5nKDIpIHZhciBpbnB1dFRleHR1cmU6IHRleHR1cmVfMmQ8ZjMyPjtcblxuQGZyYWdtZW50XG5mbiBtYWluKGlucHV0OiBWZXJ0ZXhPdXRwdXQpIC0+IEBsb2NhdGlvbigwKSB2ZWM0PGYzMj4ge1xuICAgIHJldHVybiB0ZXh0dXJlU2FtcGxlTGV2ZWwoaW5wdXRUZXh0dXJlLCB0ZXh0dXJlU2FtcGxlciwgaW5wdXQudGV4Q29vcmQsIDApO1xufVxuYCxpYT1gXG4ke0NpfVxuXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMSkgdmFyIHRleHR1cmVTYW1wbGVyOiBzYW1wbGVyO1xuQGdyb3VwKDApIEBiaW5kaW5nKDIpIHZhciBpbnB1dFRleHR1cmU6IHRleHR1cmVfMmQ8ZjMyPjtcblxuQGZyYWdtZW50XG5mbiBtYWluKGlucHV0OiBWZXJ0ZXhPdXRwdXQpIC0+IEBsb2NhdGlvbigwKSB2ZWM0PGYzMj4ge1xuICAgIHJldHVybiB0ZXh0dXJlU2FtcGxlTGV2ZWwoaW5wdXRUZXh0dXJlLCB0ZXh0dXJlU2FtcGxlciwgaW5wdXQudGV4Q29vcmQsIDApO1xufVxuYCxhYT1gXG4ke0NpfVxuXG5vdmVycmlkZSBJU19JTk5FUjogdTMyID0gMHU7XG5vdmVycmlkZSBJU19LTk9DS09VVDogdTMyID0gMHU7XG5cbnN0cnVjdCBHbG93VW5pZm9ybXMge1xuICAgIGNvbG9yOiB2ZWM0PGYzMj4sXG4gICAgYmFzZVNjYWxlOiB2ZWMyPGYzMj4sXG4gICAgYmFzZU9mZnNldDogdmVjMjxmMzI+LFxuICAgIGJsdXJTY2FsZTogdmVjMjxmMzI+LFxuICAgIGJsdXJPZmZzZXQ6IHZlYzI8ZjMyPixcbiAgICBzdHJlbmd0aDogZjMyLFxuICAgIF9wYWRkaW5nMTogZjMyLFxuICAgIF9wYWRkaW5nMjogZjMyLFxuICAgIF9wYWRkaW5nMzogZjMyLFxufVxuXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyPHVuaWZvcm0+IHVuaWZvcm1zOiBHbG93VW5pZm9ybXM7XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMSkgdmFyIHRleHR1cmVTYW1wbGVyOiBzYW1wbGVyO1xuQGdyb3VwKDApIEBiaW5kaW5nKDIpIHZhciBibHVyVGV4dHVyZTogdGV4dHVyZV8yZDxmMzI+O1xuQGdyb3VwKDApIEBiaW5kaW5nKDMpIHZhciBiYXNlVGV4dHVyZTogdGV4dHVyZV8yZDxmMzI+O1xuJHtBaX1cblxuQGZyYWdtZW50XG5mbiBtYWluKGlucHV0OiBWZXJ0ZXhPdXRwdXQpIC0+IEBsb2NhdGlvbigwKSB2ZWM0PGYzMj4ge1xuICAgIGxldCBiYXNlVVYgPSBpbnB1dC50ZXhDb29yZCAqIHVuaWZvcm1zLmJhc2VTY2FsZSAtIHVuaWZvcm1zLmJhc2VPZmZzZXQ7XG4gICAgbGV0IGJhc2VDb2xvciA9IHRleHR1cmVTYW1wbGVMZXZlbChiYXNlVGV4dHVyZSwgdGV4dHVyZVNhbXBsZXIsIGJhc2VVViwgMCkgKiBpc0luc2lkZShiYXNlVVYpO1xuXG4gICAgbGV0IGJsdXJVViA9IGlucHV0LnRleENvb3JkICogdW5pZm9ybXMuYmx1clNjYWxlIC0gdW5pZm9ybXMuYmx1ck9mZnNldDtcbiAgICBsZXQgYmx1ckNvbG9yID0gdGV4dHVyZVNhbXBsZUxldmVsKGJsdXJUZXh0dXJlLCB0ZXh0dXJlU2FtcGxlciwgYmx1clVWLCAwKSAqIGlzSW5zaWRlKGJsdXJVVik7XG5cbiAgICB2YXIgcmF3QWxwaGEgPSBibHVyQ29sb3IuYTtcbiAgICBpZiAoSVNfSU5ORVIgPT0gMXUpIHtcbiAgICAgICAgcmF3QWxwaGEgPSAxLjAgLSByYXdBbHBoYTtcbiAgICB9XG4gICAgbGV0IGdsb3dBbHBoYSA9IGNsYW1wKHJhd0FscGhhICogdW5pZm9ybXMuc3RyZW5ndGgsIDAuMCwgMS4wKTtcbiAgICBsZXQgZ2xvd0NvbG9yID0gdmVjNDxmMzI+KHVuaWZvcm1zLmNvbG9yLnJnYiAqIGdsb3dBbHBoYSwgdW5pZm9ybXMuY29sb3IuYSAqIGdsb3dBbHBoYSk7XG4gICAgaWYgKElTX0lOTkVSID09IDF1KSB7XG4gICAgICAgIGxldCBpbm5lckdsb3cgPSBnbG93Q29sb3IgKiBiYXNlQ29sb3IuYTtcbiAgICAgICAgaWYgKElTX0tOT0NLT1VUID09IDF1KSB7XG4gICAgICAgICAgICByZXR1cm4gaW5uZXJHbG93O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGlubmVyR2xvdyArIGJhc2VDb2xvciAqICgxLjAgLSBnbG93Q29sb3IuYSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoSVNfS05PQ0tPVVQgPT0gMXUpIHtcbiAgICAgICAgICAgIHJldHVybiBnbG93Q29sb3IgKiAoMS4wIC0gYmFzZUNvbG9yLmEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGJhc2VDb2xvciArIGdsb3dDb2xvciAqICgxLjAgLSBiYXNlQ29sb3IuYSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5gLHNhPWBcbiR7Q2l9XG5cbm92ZXJyaWRlIElTX0lOTkVSOiB1MzIgPSAwdTtcbm92ZXJyaWRlIElTX0tOT0NLT1VUOiB1MzIgPSAwdTtcbm92ZXJyaWRlIElTX0hJREVfT0JKRUNUOiB1MzIgPSAwdTtcblxuc3RydWN0IERyb3BTaGFkb3dVbmlmb3JtcyB7XG4gICAgY29sb3I6IHZlYzQ8ZjMyPixcbiAgICBiYXNlU2NhbGU6IHZlYzI8ZjMyPixcbiAgICBiYXNlT2Zmc2V0OiB2ZWMyPGYzMj4sXG4gICAgYmx1clNjYWxlOiB2ZWMyPGYzMj4sXG4gICAgYmx1ck9mZnNldDogdmVjMjxmMzI+LFxuICAgIHN0cmVuZ3RoOiBmMzIsXG4gICAgX3BhZGRpbmcxOiBmMzIsXG4gICAgX3BhZGRpbmcyOiBmMzIsXG4gICAgX3BhZGRpbmczOiBmMzIsXG59XG5cbkBncm91cCgwKSBAYmluZGluZygwKSB2YXI8dW5pZm9ybT4gdW5pZm9ybXM6IERyb3BTaGFkb3dVbmlmb3JtcztcbkBncm91cCgwKSBAYmluZGluZygxKSB2YXIgdGV4dHVyZVNhbXBsZXI6IHNhbXBsZXI7XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMikgdmFyIGJsdXJUZXh0dXJlOiB0ZXh0dXJlXzJkPGYzMj47XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMykgdmFyIGJhc2VUZXh0dXJlOiB0ZXh0dXJlXzJkPGYzMj47XG4ke0FpfVxuXG5AZnJhZ21lbnRcbmZuIG1haW4oaW5wdXQ6IFZlcnRleE91dHB1dCkgLT4gQGxvY2F0aW9uKDApIHZlYzQ8ZjMyPiB7XG4gICAgbGV0IGJhc2VVViA9IGlucHV0LnRleENvb3JkICogdW5pZm9ybXMuYmFzZVNjYWxlIC0gdW5pZm9ybXMuYmFzZU9mZnNldDtcbiAgICBsZXQgYmFzZUNvbG9yID0gdGV4dHVyZVNhbXBsZUxldmVsKGJhc2VUZXh0dXJlLCB0ZXh0dXJlU2FtcGxlciwgYmFzZVVWLCAwKSAqIGlzSW5zaWRlKGJhc2VVVik7XG5cbiAgICBsZXQgYmx1clVWID0gaW5wdXQudGV4Q29vcmQgKiB1bmlmb3Jtcy5ibHVyU2NhbGUgLSB1bmlmb3Jtcy5ibHVyT2Zmc2V0O1xuICAgIGxldCBibHVyID0gdGV4dHVyZVNhbXBsZUxldmVsKGJsdXJUZXh0dXJlLCB0ZXh0dXJlU2FtcGxlciwgYmx1clVWLCAwKSAqIGlzSW5zaWRlKGJsdXJVVik7XG5cbiAgICB2YXIgcmF3QWxwaGEgPSBibHVyLmE7XG4gICAgaWYgKElTX0lOTkVSID09IDF1KSB7XG4gICAgICAgIHJhd0FscGhhID0gMS4wIC0gcmF3QWxwaGE7XG4gICAgfVxuICAgIGxldCBzaGFkb3dBbHBoYSA9IGNsYW1wKHJhd0FscGhhICogdW5pZm9ybXMuc3RyZW5ndGgsIDAuMCwgMS4wKTtcbiAgICBsZXQgc2hhZG93Q29sb3IgPSB2ZWM0PGYzMj4odW5pZm9ybXMuY29sb3IucmdiICogc2hhZG93QWxwaGEsIHVuaWZvcm1zLmNvbG9yLmEgKiBzaGFkb3dBbHBoYSk7XG5cbiAgICBpZiAoSVNfSU5ORVIgPT0gMXUpIHtcbiAgICAgICAgbGV0IGlubmVyU2hhZG93ID0gc2hhZG93Q29sb3IgKiBiYXNlQ29sb3IuYTtcbiAgICAgICAgaWYgKElTX0tOT0NLT1VUID09IDF1KSB7XG4gICAgICAgICAgICByZXR1cm4gaW5uZXJTaGFkb3c7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaW5uZXJTaGFkb3cgKyBiYXNlQ29sb3IgKiAoMS4wIC0gc2hhZG93Q29sb3IuYSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoSVNfSElERV9PQkpFQ1QgPT0gMXUpIHtcbiAgICAgICAgICAgIHJldHVybiBzaGFkb3dDb2xvcjtcbiAgICAgICAgfSBlbHNlIGlmIChJU19LTk9DS09VVCA9PSAxdSkge1xuICAgICAgICAgICAgcmV0dXJuIHNoYWRvd0NvbG9yICogKDEuMCAtIGJhc2VDb2xvci5hKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBzaGFkb3dDb2xvciAqICgxLjAgLSBiYXNlQ29sb3IuYSkgKyBiYXNlQ29sb3I7XG4gICAgICAgIH1cbiAgICB9XG59XG5gLG9hPWBcbiR7Q2l9XG5cbm92ZXJyaWRlIEdMT1dfVFlQRTogdTMyID0gMHU7XG5vdmVycmlkZSBJU19LTk9DS09VVDogdTMyID0gMHU7XG5cbnN0cnVjdCBHcmFkaWVudEdsb3dVbmlmb3JtcyB7XG4gICAgc3RyZW5ndGg6IGYzMixcbiAgICBfcGFkZGluZzE6IGYzMixcbiAgICBfcGFkZGluZzI6IGYzMixcbiAgICBfcGFkZGluZzM6IGYzMixcbiAgICBiYXNlU2NhbGU6IHZlYzI8ZjMyPixcbiAgICBiYXNlT2Zmc2V0OiB2ZWMyPGYzMj4sXG4gICAgYmx1clNjYWxlOiB2ZWMyPGYzMj4sXG4gICAgYmx1ck9mZnNldDogdmVjMjxmMzI+LFxufVxuXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyPHVuaWZvcm0+IHVuaWZvcm1zOiBHcmFkaWVudEdsb3dVbmlmb3JtcztcbkBncm91cCgwKSBAYmluZGluZygxKSB2YXIgdGV4dHVyZVNhbXBsZXI6IHNhbXBsZXI7XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMikgdmFyIGJsdXJUZXh0dXJlOiB0ZXh0dXJlXzJkPGYzMj47XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMykgdmFyIGJhc2VUZXh0dXJlOiB0ZXh0dXJlXzJkPGYzMj47XG5AZ3JvdXAoMCkgQGJpbmRpbmcoNCkgdmFyIGdyYWRpZW50TFVUOiB0ZXh0dXJlXzJkPGYzMj47XG4ke0FpfVxuXG5AZnJhZ21lbnRcbmZuIG1haW4oaW5wdXQ6IFZlcnRleE91dHB1dCkgLT4gQGxvY2F0aW9uKDApIHZlYzQ8ZjMyPiB7XG4gICAgbGV0IGJhc2VVViA9IGlucHV0LnRleENvb3JkICogdW5pZm9ybXMuYmFzZVNjYWxlIC0gdW5pZm9ybXMuYmFzZU9mZnNldDtcbiAgICBsZXQgYmFzZSA9IHRleHR1cmVTYW1wbGVMZXZlbChiYXNlVGV4dHVyZSwgdGV4dHVyZVNhbXBsZXIsIGJhc2VVViwgMCkgKiBpc0luc2lkZShiYXNlVVYpO1xuXG4gICAgbGV0IGJsdXJVViA9IGlucHV0LnRleENvb3JkICogdW5pZm9ybXMuYmx1clNjYWxlIC0gdW5pZm9ybXMuYmx1ck9mZnNldDtcbiAgICB2YXIgYmx1ciA9IHRleHR1cmVTYW1wbGVMZXZlbChibHVyVGV4dHVyZSwgdGV4dHVyZVNhbXBsZXIsIGJsdXJVViwgMCkgKiBpc0luc2lkZShibHVyVVYpO1xuXG4gICAgYmx1ci5hID0gY2xhbXAoYmx1ci5hICogdW5pZm9ybXMuc3RyZW5ndGgsIDAuMCwgMS4wKTtcbiAgICBsZXQgZ2xvd0NvbG9yID0gdGV4dHVyZVNhbXBsZUxldmVsKGdyYWRpZW50TFVULCB0ZXh0dXJlU2FtcGxlciwgdmVjMjxmMzI+KGJsdXIuYSwgMC41KSwgMCk7XG4gICAgdmFyIHJlc3VsdDogdmVjNDxmMzI+O1xuICAgIGlmIChHTE9XX1RZUEUgPT0gMHUpIHtcbiAgICAgICAgaWYgKElTX0tOT0NLT1VUID09IDF1KSB7XG4gICAgICAgICAgICByZXN1bHQgPSBnbG93Q29sb3I7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSBiYXNlIC0gYmFzZSAqIGdsb3dDb2xvci5hICsgZ2xvd0NvbG9yO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChHTE9XX1RZUEUgPT0gMXUpIHtcbiAgICAgICAgaWYgKElTX0tOT0NLT1VUID09IDF1KSB7XG4gICAgICAgICAgICByZXN1bHQgPSBnbG93Q29sb3IgKiBiYXNlLmE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSBnbG93Q29sb3IgKiBiYXNlLmEgKyBiYXNlICogKDEuMCAtIGdsb3dDb2xvci5hKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChJU19LTk9DS09VVCA9PSAxdSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gZ2xvd0NvbG9yIC0gZ2xvd0NvbG9yICogYmFzZS5hO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0gYmFzZSArIGdsb3dDb2xvciAtIGdsb3dDb2xvciAqIGJhc2UuYTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuYCxsYT1gXG4ke0NpfVxuXG5vdmVycmlkZSBCRVZFTF9UWVBFOiB1MzIgPSAwdTtcbm92ZXJyaWRlIElTX0tOT0NLT1VUOiB1MzIgPSAwdTtcblxuc3RydWN0IEdyYWRpZW50QmV2ZWxVbmlmb3JtcyB7XG4gICAgc3RyZW5ndGg6IGYzMixcbiAgICBfcGFkZGluZzE6IGYzMixcbiAgICBfcGFkZGluZzI6IGYzMixcbiAgICBfcGFkZGluZzM6IGYzMixcbiAgICBiYXNlU2NhbGU6IHZlYzI8ZjMyPixcbiAgICBiYXNlT2Zmc2V0OiB2ZWMyPGYzMj4sXG4gICAgYmx1clNjYWxlOiB2ZWMyPGYzMj4sXG4gICAgYmx1ck9mZnNldDogdmVjMjxmMzI+LFxufVxuXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyPHVuaWZvcm0+IHVuaWZvcm1zOiBHcmFkaWVudEJldmVsVW5pZm9ybXM7XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMSkgdmFyIHRleHR1cmVTYW1wbGVyOiBzYW1wbGVyO1xuQGdyb3VwKDApIEBiaW5kaW5nKDIpIHZhciBibHVyVGV4dHVyZTogdGV4dHVyZV8yZDxmMzI+O1xuQGdyb3VwKDApIEBiaW5kaW5nKDMpIHZhciBiYXNlVGV4dHVyZTogdGV4dHVyZV8yZDxmMzI+O1xuQGdyb3VwKDApIEBiaW5kaW5nKDQpIHZhciBncmFkaWVudExVVDogdGV4dHVyZV8yZDxmMzI+O1xuJHtBaX1cblxuQGZyYWdtZW50XG5mbiBtYWluKGlucHV0OiBWZXJ0ZXhPdXRwdXQpIC0+IEBsb2NhdGlvbigwKSB2ZWM0PGYzMj4ge1xuICAgIGxldCBiYXNlVVYgPSBpbnB1dC50ZXhDb29yZCAqIHVuaWZvcm1zLmJhc2VTY2FsZSAtIHVuaWZvcm1zLmJhc2VPZmZzZXQ7XG4gICAgbGV0IGJhc2UgPSB0ZXh0dXJlU2FtcGxlTGV2ZWwoYmFzZVRleHR1cmUsIHRleHR1cmVTYW1wbGVyLCBiYXNlVVYsIDApICogaXNJbnNpZGUoYmFzZVVWKTtcblxuICAgIGxldCBibHVyVVYgPSBpbnB1dC50ZXhDb29yZCAqIHVuaWZvcm1zLmJsdXJTY2FsZSAtIHVuaWZvcm1zLmJsdXJPZmZzZXQ7XG4gICAgbGV0IGJsdXIxID0gdGV4dHVyZVNhbXBsZUxldmVsKGJsdXJUZXh0dXJlLCB0ZXh0dXJlU2FtcGxlciwgYmx1clVWLCAwKSAqIGlzSW5zaWRlKGJsdXJVVik7XG5cbiAgICBsZXQgbWlycm9yVVYgPSAoMS4wIC0gaW5wdXQudGV4Q29vcmQpICogdW5pZm9ybXMuYmx1clNjYWxlIC0gdW5pZm9ybXMuYmx1ck9mZnNldDtcbiAgICBsZXQgYmx1cjIgPSB0ZXh0dXJlU2FtcGxlTGV2ZWwoYmx1clRleHR1cmUsIHRleHR1cmVTYW1wbGVyLCBtaXJyb3JVViwgMCkgKiBpc0luc2lkZShtaXJyb3JVVik7XG5cbiAgICB2YXIgaGlnaGxpZ2h0QWxwaGEgPSBibHVyMS5hIC0gYmx1cjIuYTtcbiAgICB2YXIgc2hhZG93QWxwaGEgPSBibHVyMi5hIC0gYmx1cjEuYTtcbiAgICBoaWdobGlnaHRBbHBoYSA9IGNsYW1wKGhpZ2hsaWdodEFscGhhICogdW5pZm9ybXMuc3RyZW5ndGgsIDAuMCwgMS4wKTtcbiAgICBzaGFkb3dBbHBoYSA9IGNsYW1wKHNoYWRvd0FscGhhICogdW5pZm9ybXMuc3RyZW5ndGgsIDAuMCwgMS4wKTtcblxuICAgIGxldCBsdXRDb29yZCA9IDAuNTAxOTYwNzg0MzEzNzI1NSAtIDAuNTAxOTYwNzg0MzEzNzI1NSAqIHNoYWRvd0FscGhhICsgMC40OTgwMzkyMTU2ODYyNzQ1ICogaGlnaGxpZ2h0QWxwaGE7XG4gICAgbGV0IGJldmVsQ29sb3IgPSB0ZXh0dXJlU2FtcGxlTGV2ZWwoZ3JhZGllbnRMVVQsIHRleHR1cmVTYW1wbGVyLCB2ZWMyPGYzMj4obHV0Q29vcmQsIDAuNSksIDApO1xuXG4gICAgdmFyIHJlc3VsdDogdmVjNDxmMzI+O1xuICAgIGlmIChCRVZFTF9UWVBFID09IDB1KSB7XG4gICAgICAgIGlmIChJU19LTk9DS09VVCA9PSAxdSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gYmV2ZWxDb2xvcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGJhc2UgLSBiYXNlICogYmV2ZWxDb2xvci5hICsgYmV2ZWxDb2xvcjtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoQkVWRUxfVFlQRSA9PSAxdSkge1xuICAgICAgICBpZiAoSVNfS05PQ0tPVVQgPT0gMXUpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGJldmVsQ29sb3IgKiBiYXNlLmE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSBiZXZlbENvbG9yICogYmFzZS5hICsgYmFzZSAqICgxLjAgLSBiZXZlbENvbG9yLmEpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKElTX0tOT0NLT1VUID09IDF1KSB7XG4gICAgICAgICAgICByZXN1bHQgPSBiZXZlbENvbG9yIC0gYmV2ZWxDb2xvciAqIGJhc2UuYTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGJhc2UgKyBiZXZlbENvbG9yIC0gYmV2ZWxDb2xvciAqIGJhc2UuYTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5gLGNhPWBcbiR7Q2l9XG5cbm92ZXJyaWRlIEJFVkVMX1RZUEU6IHUzMiA9IDB1O1xub3ZlcnJpZGUgSVNfS05PQ0tPVVQ6IHUzMiA9IDB1O1xuXG5zdHJ1Y3QgQmV2ZWxVbmlmb3JtcyB7XG4gICAgaGlnaGxpZ2h0Q29sb3I6IHZlYzQ8ZjMyPixcbiAgICBzaGFkb3dDb2xvcjogdmVjNDxmMzI+LFxuICAgIHN0cmVuZ3RoOiBmMzIsXG4gICAgX3BhZGRpbmcxOiBmMzIsXG4gICAgX3BhZGRpbmcyOiBmMzIsXG4gICAgX3BhZGRpbmczOiBmMzIsXG4gICAgYmFzZVNjYWxlOiB2ZWMyPGYzMj4sXG4gICAgYmFzZU9mZnNldDogdmVjMjxmMzI+LFxuICAgIGJsdXJTY2FsZTogdmVjMjxmMzI+LFxuICAgIGJsdXJPZmZzZXQ6IHZlYzI8ZjMyPixcbn1cblxuQGdyb3VwKDApIEBiaW5kaW5nKDApIHZhcjx1bmlmb3JtPiB1bmlmb3JtczogQmV2ZWxVbmlmb3JtcztcbkBncm91cCgwKSBAYmluZGluZygxKSB2YXIgdGV4dHVyZVNhbXBsZXI6IHNhbXBsZXI7XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMikgdmFyIGJsdXJUZXh0dXJlOiB0ZXh0dXJlXzJkPGYzMj47XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMykgdmFyIGJhc2VUZXh0dXJlOiB0ZXh0dXJlXzJkPGYzMj47XG4ke0FpfVxuXG5AZnJhZ21lbnRcbmZuIG1haW4oaW5wdXQ6IFZlcnRleE91dHB1dCkgLT4gQGxvY2F0aW9uKDApIHZlYzQ8ZjMyPiB7XG4gICAgbGV0IGJhc2VVViA9IGlucHV0LnRleENvb3JkICogdW5pZm9ybXMuYmFzZVNjYWxlIC0gdW5pZm9ybXMuYmFzZU9mZnNldDtcbiAgICBsZXQgYmFzZSA9IHRleHR1cmVTYW1wbGVMZXZlbChiYXNlVGV4dHVyZSwgdGV4dHVyZVNhbXBsZXIsIGJhc2VVViwgMCkgKiBpc0luc2lkZShiYXNlVVYpO1xuXG4gICAgbGV0IGJsdXJVViA9IGlucHV0LnRleENvb3JkICogdW5pZm9ybXMuYmx1clNjYWxlIC0gdW5pZm9ybXMuYmx1ck9mZnNldDtcbiAgICBsZXQgYmx1cjEgPSB0ZXh0dXJlU2FtcGxlTGV2ZWwoYmx1clRleHR1cmUsIHRleHR1cmVTYW1wbGVyLCBibHVyVVYsIDApICogaXNJbnNpZGUoYmx1clVWKTtcblxuICAgIGxldCBtaXJyb3JVViA9ICgxLjAgLSBpbnB1dC50ZXhDb29yZCkgKiB1bmlmb3Jtcy5ibHVyU2NhbGUgLSB1bmlmb3Jtcy5ibHVyT2Zmc2V0O1xuICAgIGxldCBibHVyMiA9IHRleHR1cmVTYW1wbGVMZXZlbChibHVyVGV4dHVyZSwgdGV4dHVyZVNhbXBsZXIsIG1pcnJvclVWLCAwKSAqIGlzSW5zaWRlKG1pcnJvclVWKTtcblxuICAgIHZhciBoaWdobGlnaHRBbHBoYSA9IGJsdXIxLmEgLSBibHVyMi5hO1xuICAgIHZhciBzaGFkb3dBbHBoYSA9IGJsdXIyLmEgLSBibHVyMS5hO1xuICAgIGhpZ2hsaWdodEFscGhhID0gY2xhbXAoaGlnaGxpZ2h0QWxwaGEgKiB1bmlmb3Jtcy5zdHJlbmd0aCwgMC4wLCAxLjApO1xuICAgIHNoYWRvd0FscGhhID0gY2xhbXAoc2hhZG93QWxwaGEgKiB1bmlmb3Jtcy5zdHJlbmd0aCwgMC4wLCAxLjApO1xuXG4gICAgbGV0IGJldmVsQ29sb3IgPSB1bmlmb3Jtcy5oaWdobGlnaHRDb2xvciAqIGhpZ2hsaWdodEFscGhhICsgdW5pZm9ybXMuc2hhZG93Q29sb3IgKiBzaGFkb3dBbHBoYTtcbiAgICB2YXIgcmVzdWx0OiB2ZWM0PGYzMj47XG4gICAgaWYgKEJFVkVMX1RZUEUgPT0gMHUpIHtcbiAgICAgICAgaWYgKElTX0tOT0NLT1VUID09IDF1KSB7XG4gICAgICAgICAgICByZXN1bHQgPSBiZXZlbENvbG9yO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0gYmFzZSAtIGJhc2UgKiBiZXZlbENvbG9yLmEgKyBiZXZlbENvbG9yO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChCRVZFTF9UWVBFID09IDF1KSB7XG4gICAgICAgIGlmIChJU19LTk9DS09VVCA9PSAxdSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gYmV2ZWxDb2xvciAqIGJhc2UuYTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGJldmVsQ29sb3IgKiBiYXNlLmEgKyBiYXNlICogKDEuMCAtIGJldmVsQ29sb3IuYSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoSVNfS05PQ0tPVVQgPT0gMXUpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGJldmVsQ29sb3IgLSBiZXZlbENvbG9yICogYmFzZS5hO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0gYmFzZSArIGJldmVsQ29sb3IgLSBiZXZlbENvbG9yICogYmFzZS5hO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmAsdWE9YFxuJHtDaX1cblxuc3RydWN0IEJldmVsQmFzZVVuaWZvcm1zIHtcbiAgICBvZmZzZXQ6IHZlYzI8ZjMyPixcbiAgICBfcGFkZGluZzogdmVjMjxmMzI+LFxufVxuXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyPHVuaWZvcm0+IHVuaWZvcm1zOiBCZXZlbEJhc2VVbmlmb3JtcztcbkBncm91cCgwKSBAYmluZGluZygxKSB2YXIgdGV4dHVyZVNhbXBsZXI6IHNhbXBsZXI7XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMikgdmFyIHNvdXJjZVRleHR1cmU6IHRleHR1cmVfMmQ8ZjMyPjtcbiR7QWl9XG5cbkBmcmFnbWVudFxuZm4gbWFpbihpbnB1dDogVmVydGV4T3V0cHV0KSAtPiBAbG9jYXRpb24oMCkgdmVjNDxmMzI+IHtcbiAgICBsZXQgb3JpZ2luYWwgPSB0ZXh0dXJlU2FtcGxlTGV2ZWwoc291cmNlVGV4dHVyZSwgdGV4dHVyZVNhbXBsZXIsIGlucHV0LnRleENvb3JkLCAwKTtcbiAgICBsZXQgc2hpZnRlZFVWID0gaW5wdXQudGV4Q29vcmQgLSB1bmlmb3Jtcy5vZmZzZXQ7XG4gICAgbGV0IHNoaWZ0ZWQgPSB0ZXh0dXJlU2FtcGxlTGV2ZWwoc291cmNlVGV4dHVyZSwgdGV4dHVyZVNhbXBsZXIsIHNoaWZ0ZWRVViwgMCkgKiBpc0luc2lkZShzaGlmdGVkVVYpO1xuICAgIHJldHVybiBvcmlnaW5hbCAqICgxLjAgLSBzaGlmdGVkLmEpO1xufVxuYDtjbGFzcyBmYXtzdGF0aWMgZ2V0RmlsbFZlcnRleFNoYWRlcigpe3JldHVybiBQaX1zdGF0aWMgZ2V0RmlsbE1haW5WZXJ0ZXhTaGFkZXIoKXtyZXR1cm4gUGl9c3RhdGljIGdldEZpbGxGcmFnbWVudFNoYWRlcigpe3JldHVybiJcbnN0cnVjdCBGcmFnbWVudElucHV0IHtcbiAgICBAYnVpbHRpbihwb3NpdGlvbikgcG9zaXRpb246IHZlYzQ8ZjMyPixcbiAgICBAbG9jYXRpb24oMCkgYmV6aWVyOiB2ZWMyPGYzMj4sXG4gICAgQGxvY2F0aW9uKDEpIGNvbG9yOiB2ZWM0PGYzMj4sXG59XG5cbkBmcmFnbWVudFxuZm4gbWFpbihpbnB1dDogRnJhZ21lbnRJbnB1dCkgLT4gQGxvY2F0aW9uKDApIHZlYzQ8ZjMyPiB7XG4gICAgbGV0IGZfdmFsID0gaW5wdXQuYmV6aWVyLnggKiBpbnB1dC5iZXppZXIueCAtIGlucHV0LmJlemllci55O1xuICAgIGxldCBkeCA9IGRwZHgoZl92YWwpO1xuICAgIGxldCBkeSA9IGRwZHkoZl92YWwpO1xuXG4gICAgaWYgKGlucHV0LmJlemllci54ID09IDAuNSAmJiBpbnB1dC5iZXppZXIueSA9PSAwLjUpIHtcbiAgICAgICAgcmV0dXJuIHZlYzQ8ZjMyPihpbnB1dC5jb2xvci5yZ2IgKiBpbnB1dC5jb2xvci5hLCBpbnB1dC5jb2xvci5hKTtcbiAgICB9XG5cbiAgICBsZXQgZGlzdCA9IGZfdmFsICogaW52ZXJzZVNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xuICAgIGxldCBjb3ZlcmFnZSA9IHNtb290aHN0ZXAoMC41LCAtMC41LCBkaXN0KTtcblxuICAgIGlmIChjb3ZlcmFnZSA8PSAwLjAwMSkge1xuICAgICAgICBkaXNjYXJkO1xuICAgIH1cblxuICAgIGxldCBmaW5hbEFscGhhID0gaW5wdXQuY29sb3IuYSAqIG1pbihjb3ZlcmFnZSwgMS4wKTtcbiAgICByZXR1cm4gdmVjNDxmMzI+KGlucHV0LmNvbG9yLnJnYiAqIGZpbmFsQWxwaGEsIGZpbmFsQWxwaGEpO1xufVxuIn1zdGF0aWMgZ2V0U3RlbmNpbFdyaXRlVmVydGV4U2hhZGVyKCl7cmV0dXJuIFNpfXN0YXRpYyBnZXRTdGVuY2lsV3JpdGVNYWluVmVydGV4U2hhZGVyKCl7cmV0dXJuIFNpfXN0YXRpYyBnZXRTdGVuY2lsV3JpdGVGcmFnbWVudFNoYWRlcigpe3JldHVybiJcbnN0cnVjdCBGcmFnbWVudElucHV0IHtcbiAgICBAYnVpbHRpbihwb3NpdGlvbikgcG9zaXRpb246IHZlYzQ8ZjMyPixcbiAgICBAbG9jYXRpb24oMCkgYmV6aWVyOiB2ZWMyPGYzMj4sXG59XG5cbkBmcmFnbWVudFxuZm4gbWFpbihpbnB1dDogRnJhZ21lbnRJbnB1dCkgLT4gQGxvY2F0aW9uKDApIHZlYzQ8ZjMyPiB7XG4gICAgbGV0IGZfdmFsID0gaW5wdXQuYmV6aWVyLnggKiBpbnB1dC5iZXppZXIueCAtIGlucHV0LmJlemllci55O1xuICAgIGxldCBkeCA9IGRwZHgoZl92YWwpO1xuICAgIGxldCBkeSA9IGRwZHkoZl92YWwpO1xuICAgIGxldCBkaXN0ID0gZl92YWwgKiBpbnZlcnNlU3FydChkeCAqIGR4ICsgZHkgKiBkeSk7XG4gICAgbGV0IGFscGhhID0gc21vb3Roc3RlcCgwLjUsIC0wLjUsIGRpc3QpO1xuXG4gICAgaWYgKGFscGhhIDw9IDAuMDAxKSB7XG4gICAgICAgIGRpc2NhcmQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZlYzQ8ZjMyPigwLjAsIDAuMCwgMC4wLCBtaW4oYWxwaGEsIDEuMCkpO1xufVxuIn1zdGF0aWMgZ2V0U3RlbmNpbEZpbGxWZXJ0ZXhTaGFkZXIoKXtyZXR1cm4gRml9c3RhdGljIGdldFN0ZW5jaWxGaWxsTWFpblZlcnRleFNoYWRlcigpe3JldHVybiBGaX1zdGF0aWMgZ2V0U3RlbmNpbEZpbGxGcmFnbWVudFNoYWRlcigpe3JldHVybiJcbnN0cnVjdCBGcmFnbWVudElucHV0IHtcbiAgICBAYnVpbHRpbihwb3NpdGlvbikgcG9zaXRpb246IHZlYzQ8ZjMyPixcbiAgICBAbG9jYXRpb24oMCkgY29sb3I6IHZlYzQ8ZjMyPixcbn1cblxuQGZyYWdtZW50XG5mbiBtYWluKGlucHV0OiBGcmFnbWVudElucHV0KSAtPiBAbG9jYXRpb24oMCkgdmVjNDxmMzI+IHtcbiAgICBsZXQgYSA9IGlucHV0LmNvbG9yLmE7XG4gICAgcmV0dXJuIHZlYzQ8ZjMyPihpbnB1dC5jb2xvci5yICogYSwgaW5wdXQuY29sb3IuZyAqIGEsIGlucHV0LmNvbG9yLmIgKiBhLCBhKTtcbn1cbiJ9c3RhdGljIGdldE1hc2tWZXJ0ZXhTaGFkZXIoKXtyZXR1cm4iXG5zdHJ1Y3QgVmVydGV4SW5wdXQge1xuICAgIEBsb2NhdGlvbigwKSBwb3NpdGlvbjogdmVjMjxmMzI+LFxuICAgIEBsb2NhdGlvbigxKSBiZXppZXI6IHZlYzI8ZjMyPixcbn1cblxuc3RydWN0IFZlcnRleE91dHB1dCB7XG4gICAgQGJ1aWx0aW4ocG9zaXRpb24pIHBvc2l0aW9uOiB2ZWM0PGYzMj4sXG4gICAgQGxvY2F0aW9uKDApIGJlemllcjogdmVjMjxmMzI+LFxufVxuXG5zdHJ1Y3QgVW5pZm9ybXMge1xuICAgIHZpZXdwb3J0U2l6ZTogdmVjMjxmMzI+LFxuICAgIF9wYWRkaW5nMDogdmVjMjxmMzI+LFxuICAgIG1hdHJpeENvbDA6IHZlYzM8ZjMyPixcbiAgICBfcGFkZGluZzE6IGYzMixcbiAgICBtYXRyaXhDb2wxOiB2ZWMzPGYzMj4sXG4gICAgX3BhZGRpbmcyOiBmMzIsXG4gICAgbWF0cml4Q29sMjogdmVjMzxmMzI+LFxuICAgIF9wYWRkaW5nMzogZjMyLFxufVxuXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyPHVuaWZvcm0+IHVuaWZvcm1zOiBVbmlmb3JtcztcblxuQHZlcnRleFxuZm4gbWFpbihpbnB1dDogVmVydGV4SW5wdXQpIC0+IFZlcnRleE91dHB1dCB7XG4gICAgdmFyIG91dHB1dDogVmVydGV4T3V0cHV0O1xuICAgIGxldCBtYXRyaXggPSBtYXQzeDM8ZjMyPih1bmlmb3Jtcy5tYXRyaXhDb2wwLCB1bmlmb3Jtcy5tYXRyaXhDb2wxLCB1bmlmb3Jtcy5tYXRyaXhDb2wyKTtcbiAgICBsZXQgdHJhbnNmb3JtZWQgPSBtYXRyaXggKiB2ZWMzPGYzMj4oaW5wdXQucG9zaXRpb24sIDEuMCk7XG4gICAgbGV0IHBvcyA9IHRyYW5zZm9ybWVkLnh5O1xuICAgIGxldCBuZGMgPSBwb3MgKiAyLjAgLSAxLjA7XG4gICAgb3V0cHV0LnBvc2l0aW9uID0gdmVjNDxmMzI+KG5kYy54LCAtbmRjLnksIDAuMCwgMS4wKTtcbiAgICBvdXRwdXQuYmV6aWVyID0gaW5wdXQuYmV6aWVyO1xuICAgIHJldHVybiBvdXRwdXQ7XG59XG4ifXN0YXRpYyBnZXRNYXNrRnJhZ21lbnRTaGFkZXIoKXtyZXR1cm4iXG5zdHJ1Y3QgRnJhZ21lbnRJbnB1dCB7XG4gICAgQGxvY2F0aW9uKDApIGJlemllcjogdmVjMjxmMzI+LFxufVxuXG5AZnJhZ21lbnRcbmZuIG1haW4oaW5wdXQ6IEZyYWdtZW50SW5wdXQpIC0+IEBsb2NhdGlvbigwKSB2ZWM0PGYzMj4ge1xuICAgIGxldCBweCA9IGRwZHgoaW5wdXQuYmV6aWVyKTtcbiAgICBsZXQgcHkgPSBkcGR5KGlucHV0LmJlemllcik7XG4gICAgbGV0IGYgPSAoMi4wICogaW5wdXQuYmV6aWVyLngpICogdmVjMjxmMzI+KHB4LngsIHB5LngpIC0gdmVjMjxmMzI+KHB4LnksIHB5LnkpO1xuICAgIGxldCBhbHBoYSA9IDAuNSAtIChpbnB1dC5iZXppZXIueCAqIGlucHV0LmJlemllci54IC0gaW5wdXQuYmV6aWVyLnkpIC8gbGVuZ3RoKGYpO1xuICAgIGlmIChhbHBoYSA8PSAwLjApIHtcbiAgICAgICAgZGlzY2FyZDtcbiAgICB9XG4gICAgcmV0dXJuIHZlYzQ8ZjMyPihtaW4oYWxwaGEsIDEuMCkpO1xufVxuIn1zdGF0aWMgZ2V0QmFzaWNWZXJ0ZXhTaGFkZXIoKXtyZXR1cm4gVGl9c3RhdGljIGdldEJhc2ljTWFpblZlcnRleFNoYWRlcigpe3JldHVybiBUaX1zdGF0aWMgZ2V0QmFzaWNGcmFnbWVudFNoYWRlcigpe3JldHVybiJcbnN0cnVjdCBWZXJ0ZXhPdXRwdXQge1xuICAgIEBidWlsdGluKHBvc2l0aW9uKSBwb3NpdGlvbjogdmVjNDxmMzI+LFxuICAgIEBsb2NhdGlvbigwKSB0ZXhDb29yZDogdmVjMjxmMzI+LFxuICAgIEBsb2NhdGlvbigxKSBjb2xvcjogdmVjNDxmMzI+LFxufVxuXG5AZnJhZ21lbnRcbmZuIG1haW4oaW5wdXQ6IFZlcnRleE91dHB1dCkgLT4gQGxvY2F0aW9uKDApIHZlYzQ8ZjMyPiB7XG4gICAgcmV0dXJuIGlucHV0LmNvbG9yO1xufVxuIn1zdGF0aWMgZ2V0VGV4dHVyZUZyYWdtZW50U2hhZGVyKCl7cmV0dXJuIlxuc3RydWN0IFZlcnRleE91dHB1dCB7XG4gICAgQGJ1aWx0aW4ocG9zaXRpb24pIHBvc2l0aW9uOiB2ZWM0PGYzMj4sXG4gICAgQGxvY2F0aW9uKDApIHRleENvb3JkOiB2ZWMyPGYzMj4sXG4gICAgQGxvY2F0aW9uKDEpIGNvbG9yOiB2ZWM0PGYzMj4sXG59XG5cbkBncm91cCgwKSBAYmluZGluZygxKSB2YXIgdGV4dHVyZVNhbXBsZXI6IHNhbXBsZXI7XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMikgdmFyIHRleHR1cmVEYXRhOiB0ZXh0dXJlXzJkPGYzMj47XG5cbkBmcmFnbWVudFxuZm4gbWFpbihpbnB1dDogVmVydGV4T3V0cHV0KSAtPiBAbG9jYXRpb24oMCkgdmVjNDxmMzI+IHtcbiAgICBsZXQgdGV4dHVyZUNvbG9yID0gdGV4dHVyZVNhbXBsZUxldmVsKHRleHR1cmVEYXRhLCB0ZXh0dXJlU2FtcGxlciwgaW5wdXQudGV4Q29vcmQsIDApO1xuICAgIHJldHVybiB0ZXh0dXJlQ29sb3IgKiBpbnB1dC5jb2xvcjtcbn1cbiJ9c3RhdGljIGdldEluc3RhbmNlZFZlcnRleFNoYWRlcigpe3JldHVybiJcbnN0cnVjdCBWZXJ0ZXhJbnB1dCB7XG4gICAgQGxvY2F0aW9uKDApIHBvc2l0aW9uOiB2ZWMyPGYzMj4sXG4gICAgQGxvY2F0aW9uKDEpIHRleENvb3JkOiB2ZWMyPGYzMj4sXG59XG5cbnN0cnVjdCBJbnN0YW5jZUlucHV0IHtcbiAgICBAbG9jYXRpb24oMikgdGV4dHVyZVJlY3Q6IHZlYzQ8ZjMyPixcbiAgICBAbG9jYXRpb24oMykgdGV4dHVyZURpbTogdmVjNDxmMzI+LFxuICAgIEBsb2NhdGlvbig0KSBtYXRyaXhUeDogdmVjNDxmMzI+LFxuICAgIEBsb2NhdGlvbig1KSBtYXRyaXhTY2FsZTogdmVjNDxmMzI+LFxuICAgIEBsb2NhdGlvbig2KSBtdWxDb2xvcjogdmVjNDxmMzI+LFxuICAgIEBsb2NhdGlvbig3KSBhZGRDb2xvcjogdmVjNDxmMzI+LFxufVxuXG5zdHJ1Y3QgVmVydGV4T3V0cHV0IHtcbiAgICBAYnVpbHRpbihwb3NpdGlvbikgcG9zaXRpb246IHZlYzQ8ZjMyPixcbiAgICBAbG9jYXRpb24oMCkgdGV4Q29vcmQ6IHZlYzI8ZjMyPixcbiAgICBAbG9jYXRpb24oMSkgbXVsQ29sb3I6IHZlYzQ8ZjMyPixcbiAgICBAbG9jYXRpb24oMikgYWRkQ29sb3I6IHZlYzQ8ZjMyPixcbn1cblxuQHZlcnRleFxuZm4gbWFpbihcbiAgICBpbnB1dDogVmVydGV4SW5wdXQsXG4gICAgaW5zdGFuY2U6IEluc3RhbmNlSW5wdXQsXG4gICAgQGJ1aWx0aW4oaW5zdGFuY2VfaW5kZXgpIGluc3RhbmNlSWR4OiB1MzJcbikgLT4gVmVydGV4T3V0cHV0IHtcbiAgICB2YXIgb3V0cHV0OiBWZXJ0ZXhPdXRwdXQ7XG4gICAgbGV0IHRleFggPSBpbnN0YW5jZS50ZXh0dXJlUmVjdC54ICsgaW5wdXQudGV4Q29vcmQueCAqIGluc3RhbmNlLnRleHR1cmVSZWN0Lno7XG4gICAgbGV0IHRleFkgPSBpbnN0YW5jZS50ZXh0dXJlUmVjdC55ICsgaW5wdXQudGV4Q29vcmQueSAqIGluc3RhbmNlLnRleHR1cmVSZWN0Lnc7XG4gICAgb3V0cHV0LnRleENvb3JkID0gdmVjMjxmMzI+KHRleFgsIHRleFkpO1xuICAgIHZhciBwb3MgPSB2ZWMyPGYzMj4oaW5wdXQucG9zaXRpb24ueCwgMS4wIC0gaW5wdXQucG9zaXRpb24ueSk7XG4gICAgcG9zID0gcG9zICogdmVjMjxmMzI+KGluc3RhbmNlLnRleHR1cmVEaW0ueCwgaW5zdGFuY2UudGV4dHVyZURpbS55KTtcbiAgICBsZXQgc2NhbGUwID0gaW5zdGFuY2UubWF0cml4U2NhbGUueDtcbiAgICBsZXQgcm90YXRlMCA9IGluc3RhbmNlLm1hdHJpeFNjYWxlLnk7XG4gICAgbGV0IHNjYWxlMSA9IGluc3RhbmNlLm1hdHJpeFNjYWxlLno7XG4gICAgbGV0IHJvdGF0ZTEgPSBpbnN0YW5jZS5tYXRyaXhTY2FsZS53O1xuICAgIGxldCB0cmFuc2Zvcm1lZFggPSBwb3MueCAqIHNjYWxlMCArIHBvcy55ICogc2NhbGUxICsgaW5zdGFuY2UubWF0cml4VHgueDtcbiAgICBsZXQgdHJhbnNmb3JtZWRZID0gcG9zLnggKiByb3RhdGUwICsgcG9zLnkgKiByb3RhdGUxICsgaW5zdGFuY2UubWF0cml4VHgueTtcbiAgICB2YXIgcG9zaXRpb24gPSB2ZWMyPGYzMj4odHJhbnNmb3JtZWRYLCB0cmFuc2Zvcm1lZFkpIC8gdmVjMjxmMzI+KGluc3RhbmNlLnRleHR1cmVEaW0ueiwgaW5zdGFuY2UudGV4dHVyZURpbS53KTtcbiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uICogMi4wIC0gMS4wO1xuICAgIG91dHB1dC5wb3NpdGlvbiA9IHZlYzQ8ZjMyPihwb3NpdGlvbi54LCAtcG9zaXRpb24ueSwgMC4wLCAxLjApO1xuICAgIG91dHB1dC5tdWxDb2xvciA9IGluc3RhbmNlLm11bENvbG9yO1xuICAgIG91dHB1dC5hZGRDb2xvciA9IGluc3RhbmNlLmFkZENvbG9yO1xuICAgIHJldHVybiBvdXRwdXQ7XG59XG4ifXN0YXRpYyBnZXRJbnN0YW5jZWRGcmFnbWVudFNoYWRlcigpe3JldHVybiJcbnN0cnVjdCBWZXJ0ZXhPdXRwdXQge1xuICAgIEBidWlsdGluKHBvc2l0aW9uKSBwb3NpdGlvbjogdmVjNDxmMzI+LFxuICAgIEBsb2NhdGlvbigwKSB0ZXhDb29yZDogdmVjMjxmMzI+LFxuICAgIEBsb2NhdGlvbigxKSBtdWxDb2xvcjogdmVjNDxmMzI+LFxuICAgIEBsb2NhdGlvbigyKSBhZGRDb2xvcjogdmVjNDxmMzI+LFxufVxuXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyIHRleHR1cmVTYW1wbGVyOiBzYW1wbGVyO1xuQGdyb3VwKDApIEBiaW5kaW5nKDEpIHZhciB0ZXh0dXJlRGF0YTogdGV4dHVyZV8yZDxmMzI+O1xuXG5AZnJhZ21lbnRcbmZuIG1haW4oaW5wdXQ6IFZlcnRleE91dHB1dCkgLT4gQGxvY2F0aW9uKDApIHZlYzQ8ZjMyPiB7XG4gICAgdmFyIHNyYyA9IHRleHR1cmVTYW1wbGUodGV4dHVyZURhdGEsIHRleHR1cmVTYW1wbGVyLCBpbnB1dC50ZXhDb29yZCk7XG4gICAgc3JjID0gdmVjNDxmMzI+KHNyYy5yZ2IgLyBtYXgoMC4wMDAxLCBzcmMuYSksIHNyYy5hKTtcbiAgICBzcmMgPSBjbGFtcChzcmMgKiBpbnB1dC5tdWxDb2xvciArIGlucHV0LmFkZENvbG9yLCB2ZWM0PGYzMj4oMC4wKSwgdmVjNDxmMzI+KDEuMCkpO1xuICAgIHNyYyA9IHZlYzQ8ZjMyPihzcmMucmdiICogc3JjLmEsIHNyYy5hKTtcbiAgICByZXR1cm4gc3JjO1xufVxuIn1zdGF0aWMgZ2V0R3JhZGllbnRGaWxsVmVydGV4U2hhZGVyKCl7cmV0dXJuIEJpfXN0YXRpYyBnZXRHcmFkaWVudEZpbGxNYWluVmVydGV4U2hhZGVyKCl7cmV0dXJuIEJpfXN0YXRpYyBnZXRHcmFkaWVudEZpbGxGcmFnbWVudFNoYWRlcigpe3JldHVybiBZaX1zdGF0aWMgZ2V0R3JhZGllbnRGaWxsU3RlbmNpbEZyYWdtZW50U2hhZGVyKCl7cmV0dXJuIEtpfXN0YXRpYyBnZXRHcmFkaWVudEZyYWdtZW50U2hhZGVyKCl7cmV0dXJuIEhpfXN0YXRpYyBnZXRCaXRtYXBGaWxsVmVydGV4U2hhZGVyKCl7cmV0dXJuIE9pfXN0YXRpYyBnZXRCaXRtYXBGaWxsTWFpblZlcnRleFNoYWRlcigpe3JldHVybiBPaX1zdGF0aWMgZ2V0Qml0bWFwRmlsbEZyYWdtZW50U2hhZGVyKCl7cmV0dXJuIlxuc3RydWN0IFZlcnRleE91dHB1dCB7XG4gICAgQGJ1aWx0aW4ocG9zaXRpb24pIHBvc2l0aW9uOiB2ZWM0PGYzMj4sXG4gICAgQGxvY2F0aW9uKDApIGJlemllcjogdmVjMjxmMzI+LFxuICAgIEBsb2NhdGlvbigxKSBjb2xvcjogdmVjNDxmMzI+LFxuICAgIEBsb2NhdGlvbigyKSB3b3JsZFBvczogdmVjMjxmMzI+LFxufVxuXG5zdHJ1Y3QgQml0bWFwVW5pZm9ybXMge1xuICAgIGJpdG1hcE1hdHJpeDogbWF0M3gzPGYzMj4sXG4gICAgdGV4dHVyZVdpZHRoOiBmMzIsXG4gICAgdGV4dHVyZUhlaWdodDogZjMyLFxuICAgIHJlcGVhdDogZjMyLFxuICAgIF9wYWQ6IGYzMixcbn1cblxuQGdyb3VwKDApIEBiaW5kaW5nKDApIHZhcjx1bmlmb3JtPiB1bmlmb3JtczogQml0bWFwVW5pZm9ybXM7XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMSkgdmFyIGJpdG1hcFNhbXBsZXI6IHNhbXBsZXI7XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMikgdmFyIGJpdG1hcFRleHR1cmU6IHRleHR1cmVfMmQ8ZjMyPjtcblxuQGZyYWdtZW50XG5mbiBtYWluKGlucHV0OiBWZXJ0ZXhPdXRwdXQpIC0+IEBsb2NhdGlvbigwKSB2ZWM0PGYzMj4ge1xuICAgIGxldCB1ID0gaW5wdXQuYmV6aWVyLng7XG4gICAgbGV0IHYgPSBpbnB1dC5iZXppZXIueTtcbiAgICBpZiAoYWJzKHUgLSAwLjUpID4gMC4wMDEgfHwgYWJzKHYgLSAwLjUpID4gMC4wMDEpIHtcbiAgICAgICAgbGV0IGQgPSB1ICogdSAtIHY7XG4gICAgICAgIGlmIChkID4gMC4wKSB7XG4gICAgICAgICAgICBkaXNjYXJkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCB0cmFuc2Zvcm1lZFBvcyA9IHVuaWZvcm1zLmJpdG1hcE1hdHJpeCAqIHZlYzM8ZjMyPihpbnB1dC53b3JsZFBvcywgMS4wKTtcbiAgICB2YXIgdXYgPSB2ZWMyPGYzMj4oXG4gICAgICAgIHRyYW5zZm9ybWVkUG9zLnggLyB1bmlmb3Jtcy50ZXh0dXJlV2lkdGgsXG4gICAgICAgIHRyYW5zZm9ybWVkUG9zLnkgLyB1bmlmb3Jtcy50ZXh0dXJlSGVpZ2h0XG4gICAgKTtcbiAgICBpZiAodW5pZm9ybXMucmVwZWF0ID4gMC41KSB7XG4gICAgICAgIHV2ID0gZnJhY3QodXYpO1xuICAgIH1cbiAgICBsZXQgYml0bWFwQ29sb3IgPSB0ZXh0dXJlU2FtcGxlTGV2ZWwoYml0bWFwVGV4dHVyZSwgYml0bWFwU2FtcGxlciwgdXYsIDApO1xuICAgIGxldCBhbHBoYSA9IGJpdG1hcENvbG9yLmEgKiBpbnB1dC5jb2xvci5hO1xuICAgIHJldHVybiB2ZWM0PGYzMj4oYml0bWFwQ29sb3IucmdiICogaW5wdXQuY29sb3IuYSwgYWxwaGEpO1xufVxuIn1zdGF0aWMgZ2V0QmxlbmRGcmFnbWVudFNoYWRlcigpe3JldHVybiJcbnN0cnVjdCBWZXJ0ZXhPdXRwdXQge1xuICAgIEBidWlsdGluKHBvc2l0aW9uKSBwb3NpdGlvbjogdmVjNDxmMzI+LFxuICAgIEBsb2NhdGlvbigwKSB0ZXhDb29yZDogdmVjMjxmMzI+LFxuICAgIEBsb2NhdGlvbigxKSBjb2xvcjogdmVjNDxmMzI+LFxufVxuXG5zdHJ1Y3QgQmxlbmRVbmlmb3JtcyB7XG4gICAgYmxlbmRNb2RlOiBmMzIsXG59XG5cbkBncm91cCgwKSBAYmluZGluZygxKSB2YXI8dW5pZm9ybT4gYmxlbmQ6IEJsZW5kVW5pZm9ybXM7XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMikgdmFyIHNyY1NhbXBsZXI6IHNhbXBsZXI7XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMykgdmFyIHNyY1RleHR1cmU6IHRleHR1cmVfMmQ8ZjMyPjtcbkBncm91cCgwKSBAYmluZGluZyg0KSB2YXIgZHN0U2FtcGxlcjogc2FtcGxlcjtcbkBncm91cCgwKSBAYmluZGluZyg1KSB2YXIgZHN0VGV4dHVyZTogdGV4dHVyZV8yZDxmMzI+O1xuXG5mbiBibGVuZE5vcm1hbChzcmM6IHZlYzQ8ZjMyPiwgZHN0OiB2ZWM0PGYzMj4pIC0+IHZlYzQ8ZjMyPiB7XG4gICAgcmV0dXJuIHNyYztcbn1cblxuZm4gYmxlbmRNdWx0aXBseShzcmM6IHZlYzQ8ZjMyPiwgZHN0OiB2ZWM0PGYzMj4pIC0+IHZlYzQ8ZjMyPiB7XG4gICAgcmV0dXJuIHNyYyAqIGRzdDtcbn1cblxuZm4gYmxlbmRTY3JlZW4oc3JjOiB2ZWM0PGYzMj4sIGRzdDogdmVjNDxmMzI+KSAtPiB2ZWM0PGYzMj4ge1xuICAgIHJldHVybiBzcmMgKyBkc3QgLSBzcmMgKiBkc3Q7XG59XG5cbmZuIGJsZW5kQWRkKHNyYzogdmVjNDxmMzI+LCBkc3Q6IHZlYzQ8ZjMyPikgLT4gdmVjNDxmMzI+IHtcbiAgICByZXR1cm4gbWluKHNyYyArIGRzdCwgdmVjNDxmMzI+KDEuMCkpO1xufVxuXG5AZnJhZ21lbnRcbmZuIG1haW4oaW5wdXQ6IFZlcnRleE91dHB1dCkgLT4gQGxvY2F0aW9uKDApIHZlYzQ8ZjMyPiB7XG4gICAgbGV0IHNyYyA9IHRleHR1cmVTYW1wbGVMZXZlbChzcmNUZXh0dXJlLCBzcmNTYW1wbGVyLCBpbnB1dC50ZXhDb29yZCwgMCk7XG4gICAgbGV0IGRzdCA9IHRleHR1cmVTYW1wbGVMZXZlbChkc3RUZXh0dXJlLCBkc3RTYW1wbGVyLCBpbnB1dC50ZXhDb29yZCwgMCk7XG4gICAgdmFyIHJlc3VsdDogdmVjNDxmMzI+O1xuICAgIGlmIChibGVuZC5ibGVuZE1vZGUgPCAwLjUpIHtcbiAgICAgICAgcmVzdWx0ID0gYmxlbmROb3JtYWwoc3JjLCBkc3QpO1xuICAgIH0gZWxzZSBpZiAoYmxlbmQuYmxlbmRNb2RlIDwgMS41KSB7XG4gICAgICAgIHJlc3VsdCA9IGJsZW5kTXVsdGlwbHkoc3JjLCBkc3QpO1xuICAgIH0gZWxzZSBpZiAoYmxlbmQuYmxlbmRNb2RlIDwgMi41KSB7XG4gICAgICAgIHJlc3VsdCA9IGJsZW5kU2NyZWVuKHNyYywgZHN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBibGVuZEFkZChzcmMsIGRzdCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQgKiBpbnB1dC5jb2xvcjtcbn1cbiJ9c3RhdGljIGdldEJsdXJGaWx0ZXJWZXJ0ZXhTaGFkZXIoKXtyZXR1cm4gVWl9c3RhdGljIGdldEJpdG1hcFN5bmNWZXJ0ZXhTaGFkZXIoKXtyZXR1cm4gTGl9c3RhdGljIGdldEJpdG1hcFN5bmNGcmFnbWVudFNoYWRlcigpe3JldHVybiBpYX1zdGF0aWMgZ2V0Qmx1ckZpbHRlckZyYWdtZW50U2hhZGVyKGUpe2NvbnN0IHQ9ZS50b0ZpeGVkKDEpO3JldHVybmBcbiR7Q2l9XG5cbnN0cnVjdCBCbHVyVW5pZm9ybXMge1xuICAgIG9mZnNldDogdmVjMjxmMzI+LFxuICAgIGZyYWN0aW9uOiBmMzIsXG4gICAgc2FtcGxlczogZjMyLFxufVxuXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyPHVuaWZvcm0+IHVuaWZvcm1zOiBCbHVyVW5pZm9ybXM7XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMSkgdmFyIHRleHR1cmVTYW1wbGVyOiBzYW1wbGVyO1xuQGdyb3VwKDApIEBiaW5kaW5nKDIpIHZhciBpbnB1dFRleHR1cmU6IHRleHR1cmVfMmQ8ZjMyPjtcblxuQGZyYWdtZW50XG5mbiBtYWluKGlucHV0OiBWZXJ0ZXhPdXRwdXQpIC0+IEBsb2NhdGlvbigwKSB2ZWM0PGYzMj4ge1xuICAgIGxldCBvZmZzZXQgPSB1bmlmb3Jtcy5vZmZzZXQ7XG4gICAgbGV0IGZyYWN0aW9uID0gdW5pZm9ybXMuZnJhY3Rpb247XG4gICAgbGV0IHNhbXBsZXMgPSB1bmlmb3Jtcy5zYW1wbGVzO1xuICAgIHZhciBjb2xvciA9IHRleHR1cmVTYW1wbGUoaW5wdXRUZXh0dXJlLCB0ZXh0dXJlU2FtcGxlciwgaW5wdXQudGV4Q29vcmQpO1xuICAgIGZvciAodmFyIGk6IGYzMiA9IDEuMDsgaSA8ICR7dH07IGkgKz0gMS4wKSB7XG4gICAgICAgIGNvbG9yICs9IHRleHR1cmVTYW1wbGUoaW5wdXRUZXh0dXJlLCB0ZXh0dXJlU2FtcGxlciwgaW5wdXQudGV4Q29vcmQgKyBvZmZzZXQgKiBpKTtcbiAgICAgICAgY29sb3IgKz0gdGV4dHVyZVNhbXBsZShpbnB1dFRleHR1cmUsIHRleHR1cmVTYW1wbGVyLCBpbnB1dC50ZXhDb29yZCAtIG9mZnNldCAqIGkpO1xuICAgIH1cbiAgICBjb2xvciArPSB0ZXh0dXJlU2FtcGxlKGlucHV0VGV4dHVyZSwgdGV4dHVyZVNhbXBsZXIsIGlucHV0LnRleENvb3JkICsgb2Zmc2V0ICogJHt0fSkgKiBmcmFjdGlvbjtcbiAgICBjb2xvciArPSB0ZXh0dXJlU2FtcGxlKGlucHV0VGV4dHVyZSwgdGV4dHVyZVNhbXBsZXIsIGlucHV0LnRleENvb3JkIC0gb2Zmc2V0ICogJHt0fSkgKiBmcmFjdGlvbjtcbiAgICBjb2xvciAvPSBzYW1wbGVzO1xuICAgIHJldHVybiBjb2xvcjtcbn1cbmB9c3RhdGljIGdldFRleHR1cmVDb3B5RnJhZ21lbnRTaGFkZXIoKXtyZXR1cm4gUWl9c3RhdGljIGdldEJsdXJUZXh0dXJlQ29weUZyYWdtZW50U2hhZGVyKCl7cmV0dXJuIFppfXN0YXRpYyBnZXRGaWx0ZXJPdXRwdXRGcmFnbWVudFNoYWRlcigpe3JldHVybiBKaX1zdGF0aWMgZ2V0Q29sb3JUcmFuc2Zvcm1GcmFnbWVudFNoYWRlcigpe3JldHVybiBlYX1zdGF0aWMgZ2V0WUZsaXBDb2xvclRyYW5zZm9ybUZyYWdtZW50U2hhZGVyKCl7cmV0dXJuIHRhfXN0YXRpYyBnZXRDb2xvck1hdHJpeEZpbHRlckZyYWdtZW50U2hhZGVyKCl7cmV0dXJuIHJhfXN0YXRpYyBnZXRHbG93RmlsdGVyRnJhZ21lbnRTaGFkZXIoKXtyZXR1cm4gYWF9c3RhdGljIGdldERyb3BTaGFkb3dGaWx0ZXJGcmFnbWVudFNoYWRlcigpe3JldHVybiBzYX1zdGF0aWMgZ2V0R3JhZGllbnRHbG93RmlsdGVyRnJhZ21lbnRTaGFkZXIoKXtyZXR1cm4gb2F9c3RhdGljIGdldEdyYWRpZW50QmV2ZWxGaWx0ZXJGcmFnbWVudFNoYWRlcigpe3JldHVybiBsYX1zdGF0aWMgZ2V0QmV2ZWxGaWx0ZXJGcmFnbWVudFNoYWRlcigpe3JldHVybiBjYX1zdGF0aWMgZ2V0QmV2ZWxCYXNlRnJhZ21lbnRTaGFkZXIoKXtyZXR1cm4gdWF9c3RhdGljIGdldENvbnZvbHV0aW9uRmlsdGVyRnJhZ21lbnRTaGFkZXIoZSx0LHI9ITAsbj0hMCl7Y29uc3QgaT1NYXRoLmZsb29yKC41KmUpLGE9TWF0aC5mbG9vciguNSp0KSxzPWUqdDtsZXQgbz0iIjtmb3IobGV0IGU9MDtlPHM7ZSsrKW8rPWBcbiAgICByZXN1bHQgPSByZXN1bHQgKyBnZXRXZWlnaHRlZENvbG9yKCR7ZX0sIGdldE1hdHJpeFdlaWdodCgke2V9KSk7YDtjb25zdCBsPXI/InJlc3VsdC5hID0gdGV4dHVyZVNhbXBsZShzb3VyY2VUZXh0dXJlLCBzb3VyY2VTYW1wbGVyLCBpbnB1dC50ZXhDb29yZCkuYTsiOiIiLGM9bj8iIjoiXG4gICAgbGV0IHN1YnN0aXR1dGVDb2xvciA9IHVuaWZvcm1zLnN1YnN0aXR1dGVDb2xvcjtcbiAgICBjb2xvciA9IG1peChzdWJzdGl0dXRlQ29sb3IsIGNvbG9yLCBpc0luc2lkZSh1dikpOyI7cmV0dXJuYFxuc3RydWN0IENvbnZvbHV0aW9uVW5pZm9ybXMge1xuICAgIHJjcFNpemU6IHZlYzI8ZjMyPixcbiAgICByY3BEaXZpc29yOiBmMzIsXG4gICAgYmlhczogZjMyLFxuICAgIHN1YnN0aXR1dGVDb2xvcjogdmVjNDxmMzI+LFxuICAgIG1hdHJpeDogYXJyYXk8dmVjNDxmMzI+LCAke01hdGguY2VpbChzLzQpfT4sXG59XG5cbkBncm91cCgwKSBAYmluZGluZygwKSB2YXI8dW5pZm9ybT4gdW5pZm9ybXM6IENvbnZvbHV0aW9uVW5pZm9ybXM7XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMSkgdmFyIHNvdXJjZVNhbXBsZXI6IHNhbXBsZXI7XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMikgdmFyIHNvdXJjZVRleHR1cmU6IHRleHR1cmVfMmQ8ZjMyPjtcblxuJHtDaX1cblxuJHtBaX1cblxuZm4gZ2V0TWF0cml4V2VpZ2h0KGluZGV4OiBpMzIpIC0+IGYzMiB7XG4gICAgbGV0IHZlY0luZGV4ID0gaW5kZXggLyA0O1xuICAgIGxldCBjb21wb25lbnQgPSBpbmRleCAlIDQ7XG4gICAgbGV0IHZlYyA9IHVuaWZvcm1zLm1hdHJpeFt2ZWNJbmRleF07XG4gICAgaWYgKGNvbXBvbmVudCA9PSAwKSB7IHJldHVybiB2ZWMueDsgfVxuICAgIGVsc2UgaWYgKGNvbXBvbmVudCA9PSAxKSB7IHJldHVybiB2ZWMueTsgfVxuICAgIGVsc2UgaWYgKGNvbXBvbmVudCA9PSAyKSB7IHJldHVybiB2ZWMuejsgfVxuICAgIGVsc2UgeyByZXR1cm4gdmVjLnc7IH1cbn1cblxuZm4gZ2V0V2VpZ2h0ZWRDb2xvcihpOiBpMzIsIHdlaWdodDogZjMyKSAtPiB2ZWM0PGYzMj4ge1xuICAgIGxldCByY3BTaXplID0gdW5pZm9ybXMucmNwU2l6ZTtcbiAgICBsZXQgaURpdlggPSBpIC8gJHtlfTtcbiAgICBsZXQgaU1vZFggPSBpIC0gJHtlfSAqIGlEaXZYO1xuICAgIGxldCBvZmZzZXQgPSB2ZWMyPGYzMj4oZjMyKGlNb2RYIC0gJHtpfSksIGYzMigke2F9IC0gaURpdlgpKTtcbiAgICB2YXIgdXYgPSBpbnB1dC50ZXhDb29yZCArIG9mZnNldCAqIHJjcFNpemU7XG4gICAgdmFyIGNvbG9yID0gdGV4dHVyZVNhbXBsZShzb3VyY2VUZXh0dXJlLCBzb3VyY2VTYW1wbGVyLCB1dik7XG4gICAgY29sb3IgPSB2ZWM0PGYzMj4oY29sb3IucmdiIC8gbWF4KDAuMDAwMSwgY29sb3IuYSksIGNvbG9yLmEpO1xuICAgICR7Y31cbiAgICByZXR1cm4gY29sb3IgKiB3ZWlnaHQ7XG59XG5cbnZhcjxwcml2YXRlPiBpbnB1dDogVmVydGV4T3V0cHV0O1xuXG5AdmVydGV4XG5mbiB2c19tYWluKEBidWlsdGluKHZlcnRleF9pbmRleCkgdmVydGV4SW5kZXg6IHUzMikgLT4gVmVydGV4T3V0cHV0IHtcbiAgICB2YXIgcG9zaXRpb25zID0gYXJyYXk8dmVjMjxmMzI+LCA2PihcbiAgICAgICAgdmVjMjxmMzI+KC0xLjAsIC0xLjApLFxuICAgICAgICB2ZWMyPGYzMj4oMS4wLCAtMS4wKSxcbiAgICAgICAgdmVjMjxmMzI+KC0xLjAsIDEuMCksXG4gICAgICAgIHZlYzI8ZjMyPigtMS4wLCAxLjApLFxuICAgICAgICB2ZWMyPGYzMj4oMS4wLCAtMS4wKSxcbiAgICAgICAgdmVjMjxmMzI+KDEuMCwgMS4wKVxuICAgICk7XG4gICAgdmFyIHRleENvb3JkcyA9IGFycmF5PHZlYzI8ZjMyPiwgNj4oXG4gICAgICAgIHZlYzI8ZjMyPigwLjAsIDEuMCksXG4gICAgICAgIHZlYzI8ZjMyPigxLjAsIDEuMCksXG4gICAgICAgIHZlYzI8ZjMyPigwLjAsIDAuMCksXG4gICAgICAgIHZlYzI8ZjMyPigwLjAsIDAuMCksXG4gICAgICAgIHZlYzI8ZjMyPigxLjAsIDEuMCksXG4gICAgICAgIHZlYzI8ZjMyPigxLjAsIDAuMClcbiAgICApO1xuICAgIHZhciBvdXRwdXQ6IFZlcnRleE91dHB1dDtcbiAgICBvdXRwdXQucG9zaXRpb24gPSB2ZWM0PGYzMj4ocG9zaXRpb25zW3ZlcnRleEluZGV4XSwgMC4wLCAxLjApO1xuICAgIG91dHB1dC50ZXhDb29yZCA9IHRleENvb3Jkc1t2ZXJ0ZXhJbmRleF07XG4gICAgcmV0dXJuIG91dHB1dDtcbn1cblxuQGZyYWdtZW50XG5mbiBmc19tYWluKGZyYWdJbnB1dDogVmVydGV4T3V0cHV0KSAtPiBAbG9jYXRpb24oMCkgdmVjNDxmMzI+IHtcbiAgICBpbnB1dCA9IGZyYWdJbnB1dDtcbiAgICBsZXQgcmNwRGl2aXNvciA9IHVuaWZvcm1zLnJjcERpdmlzb3I7XG4gICAgbGV0IGJpYXMgPSB1bmlmb3Jtcy5iaWFzO1xuICAgIHZhciByZXN1bHQgPSB2ZWM0PGYzMj4oMC4wKTtcbiAgICAke299XG4gICAgcmVzdWx0ID0gY2xhbXAocmVzdWx0ICogcmNwRGl2aXNvciArIGJpYXMsIHZlYzQ8ZjMyPigwLjApLCB2ZWM0PGYzMj4oMS4wKSk7XG4gICAgJHtsfVxuICAgIHJlc3VsdCA9IHZlYzQ8ZjMyPihyZXN1bHQucmdiICogcmVzdWx0LmEsIHJlc3VsdC5hKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuYH1zdGF0aWMgZ2V0Q29tcGxleEJsZW5kRnJhZ21lbnRTaGFkZXIoKXtyZXR1cm4gZmEuZ2V0VW5pZmllZENvbXBsZXhCbGVuZEZyYWdtZW50U2hhZGVyKCl9c3RhdGljIGdldEJsZW5kTW9kZUluZGV4KGUpe3N3aXRjaChlKXtjYXNlInN1YnRyYWN0IjpyZXR1cm4gMDtjYXNlIm11bHRpcGx5IjpkZWZhdWx0OnJldHVybiAxO2Nhc2UibGlnaHRlbiI6cmV0dXJuIDI7Y2FzZSJkYXJrZW4iOnJldHVybiAzO2Nhc2Uib3ZlcmxheSI6cmV0dXJuIDQ7Y2FzZSJoYXJkbGlnaHQiOnJldHVybiA1O2Nhc2UiZGlmZmVyZW5jZSI6cmV0dXJuIDY7Y2FzZSJpbnZlcnQiOnJldHVybiA3fX1zdGF0aWMgZ2V0VW5pZmllZENvbXBsZXhCbGVuZEZyYWdtZW50U2hhZGVyKCl7cmV0dXJuYFxuJHtDaX1cblxuc3RydWN0IEJsZW5kVW5pZm9ybXMge1xuICAgIG11bENvbG9yOiB2ZWM0PGYzMj4sXG4gICAgYWRkQ29sb3I6IHZlYzQ8ZjMyPixcbiAgICBibGVuZE1vZGU6IGYzMixcbiAgICBfcGFkMDogZjMyLFxuICAgIF9wYWQxOiBmMzIsXG4gICAgX3BhZDI6IGYzMixcbn1cblxuQGdyb3VwKDApIEBiaW5kaW5nKDApIHZhcjx1bmlmb3JtPiB1bmlmb3JtczogQmxlbmRVbmlmb3JtcztcbkBncm91cCgwKSBAYmluZGluZygxKSB2YXIgdGV4dHVyZVNhbXBsZXI6IHNhbXBsZXI7XG5AZ3JvdXAoMCkgQGJpbmRpbmcoMikgdmFyIGRzdFRleHR1cmU6IHRleHR1cmVfMmQ8ZjMyPjtcbkBncm91cCgwKSBAYmluZGluZygzKSB2YXIgc3JjVGV4dHVyZTogdGV4dHVyZV8yZDxmMzI+O1xuXG5mbiBibGVuZChzcmM6IHZlYzQ8ZjMyPiwgZHN0OiB2ZWM0PGYzMj4sIG1vZGU6IGkzMikgLT4gdmVjNDxmMzI+IHtcbiAgICBpZiAoc3JjLmEgPT0gMC4wKSB7IHJldHVybiBkc3Q7IH1cbiAgICBpZiAoZHN0LmEgPT0gMC4wKSB7IHJldHVybiBzcmM7IH1cblxuICAgIGxldCBhID0gc3JjIC0gc3JjICogZHN0LmE7XG4gICAgbGV0IGIgPSBkc3QgLSBkc3QgKiBzcmMuYTtcblxuICAgIGlmIChtb2RlID09IDEpIHtcbiAgICAgICAgbGV0IGMgPSBzcmMgKiBkc3Q7XG4gICAgICAgIHJldHVybiBhICsgYiArIGM7XG4gICAgfVxuXG4gICAgbGV0IHNyY1JnYiA9IHNyYy5yZ2IgLyBzcmMuYTtcbiAgICBsZXQgZHN0UmdiID0gZHN0LnJnYiAvIGRzdC5hO1xuXG4gICAgdmFyIGJsZW5kZWQ6IHZlYzM8ZjMyPjtcblxuICAgIHN3aXRjaCAobW9kZSkge1xuICAgICAgICBjYXNlIDA6IHtcbiAgICAgICAgICAgIGJsZW5kZWQgPSBkc3RSZ2IgLSBzcmNSZ2I7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAyOiB7XG4gICAgICAgICAgICBibGVuZGVkID0gbWl4KHNyY1JnYiwgZHN0UmdiLCBzdGVwKHNyY1JnYiwgZHN0UmdiKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAzOiB7XG4gICAgICAgICAgICBibGVuZGVkID0gbWl4KHNyY1JnYiwgZHN0UmdiLCBzdGVwKGRzdFJnYiwgc3JjUmdiKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSA0OiB7XG4gICAgICAgICAgICBsZXQgbXVsID0gc3JjUmdiICogZHN0UmdiO1xuICAgICAgICAgICAgbGV0IGMxID0gMi4wICogbXVsO1xuICAgICAgICAgICAgbGV0IGMyID0gMi4wICogKHNyY1JnYiArIGRzdFJnYiAtIG11bCkgLSAxLjA7XG4gICAgICAgICAgICBibGVuZGVkID0gbWl4KGMxLCBjMiwgc3RlcCh2ZWMzPGYzMj4oMC41KSwgZHN0UmdiKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSA1OiB7XG4gICAgICAgICAgICBsZXQgbXVsID0gc3JjUmdiICogZHN0UmdiO1xuICAgICAgICAgICAgbGV0IGMxID0gMi4wICogbXVsO1xuICAgICAgICAgICAgbGV0IGMyID0gMi4wICogKHNyY1JnYiArIGRzdFJnYiAtIG11bCkgLSAxLjA7XG4gICAgICAgICAgICBibGVuZGVkID0gbWl4KGMxLCBjMiwgc3RlcCh2ZWMzPGYzMj4oMC41KSwgc3JjUmdiKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSA2OiB7XG4gICAgICAgICAgICBibGVuZGVkID0gYWJzKHNyY1JnYiAtIGRzdFJnYik7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSA3OiB7XG4gICAgICAgICAgICBsZXQgaWIgPSBkc3QgLSBkc3QgKiBzcmMuYTtcbiAgICAgICAgICAgIGxldCBpYyA9IHZlYzQ8ZjMyPihzcmMuYSAtIGRzdC5yZ2IgKiBzcmMuYSwgc3JjLmEpO1xuICAgICAgICAgICAgcmV0dXJuIGliICsgaWM7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYmxlbmRlZCA9IHNyY1JnYjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBjID0gdmVjNDxmMzI+KGJsZW5kZWQsIHNyYy5hICogZHN0LmEpO1xuICAgIGMgPSB2ZWM0PGYzMj4oYy5yZ2IgKiBjLmEsIGMuYSk7XG4gICAgcmV0dXJuIGEgKyBiICsgYztcbn1cblxuQGZyYWdtZW50XG5mbiBtYWluKGlucHV0OiBWZXJ0ZXhPdXRwdXQpIC0+IEBsb2NhdGlvbigwKSB2ZWM0PGYzMj4ge1xuICAgIHZhciBkc3QgPSB0ZXh0dXJlU2FtcGxlKGRzdFRleHR1cmUsIHRleHR1cmVTYW1wbGVyLCBpbnB1dC50ZXhDb29yZCk7XG4gICAgdmFyIHNyYyA9IHRleHR1cmVTYW1wbGUoc3JjVGV4dHVyZSwgdGV4dHVyZVNhbXBsZXIsIGlucHV0LnRleENvb3JkKTtcbiAgICBsZXQgbXVsID0gdW5pZm9ybXMubXVsQ29sb3I7XG4gICAgbGV0IGFkZCA9IHVuaWZvcm1zLmFkZENvbG9yO1xuICAgIGlmIChtdWwueCAhPSAxLjAgfHwgbXVsLnkgIT0gMS4wIHx8IG11bC56ICE9IDEuMCB8fCBtdWwudyAhPSAxLjBcbiAgICAgICAgfHwgYWRkLnggIT0gMC4wIHx8IGFkZC55ICE9IDAuMCB8fCBhZGQueiAhPSAwLjApIHtcbiAgICAgICAgc3JjID0gdmVjNDxmMzI+KHNyYy5yZ2IgLyBtYXgodmVjMzxmMzI+KDAuMDAwMSksIHZlYzM8ZjMyPihzcmMuYSkpLCBzcmMuYSk7XG4gICAgICAgIHNyYyA9IGNsYW1wKHNyYyAqIG11bCArIGFkZCwgdmVjNDxmMzI+KDAuMCksIHZlYzQ8ZjMyPigxLjApKTtcbiAgICAgICAgc3JjID0gdmVjNDxmMzI+KHNyYy5yZ2IgKiBzcmMuYSwgc3JjLmEpO1xuICAgIH1cbiAgICByZXR1cm4gYmxlbmQoc3JjLCBkc3QsIGkzMih1bmlmb3Jtcy5ibGVuZE1vZGUpKTtcbn1cbmB9c3RhdGljIGdldERpc3BsYWNlbWVudE1hcEZpbHRlckZyYWdtZW50U2hhZGVyKGUsdCxyKXtsZXQgbixpLGE7c3dpdGNoKGUpe2Nhc2UgMTpuPSJtYXBDb2xvci5yIjticmVhaztjYXNlIDI6bj0ibWFwQ29sb3IuZyI7YnJlYWs7Y2FzZSA0Om49Im1hcENvbG9yLmIiO2JyZWFrO2Nhc2UgODpuPSJtYXBDb2xvci5hIjticmVhaztkZWZhdWx0Om49IjAuNSJ9c3dpdGNoKHQpe2Nhc2UgMTppPSJtYXBDb2xvci5yIjticmVhaztjYXNlIDI6aT0ibWFwQ29sb3IuZyI7YnJlYWs7Y2FzZSA0Omk9Im1hcENvbG9yLmIiO2JyZWFrO2Nhc2UgODppPSJtYXBDb2xvci5hIjticmVhaztkZWZhdWx0Omk9IjAuNSJ9bGV0IHM9ITE7c3dpdGNoKHIpe2Nhc2UgMDphPSJcbnNvdXJjZUNvbG9yID0gdGV4dHVyZVNhbXBsZShzcmNUZXh0dXJlLCB0ZXh0dXJlU2FtcGxlciwgdXYpO1xuIjticmVhaztjYXNlIDE6cz0hMCxhPSJcbnNvdXJjZUNvbG9yID0gbWl4KHVuaWZvcm1zLnN1YnN0aXR1dGVDb2xvciwgdGV4dHVyZVNhbXBsZShzcmNUZXh0dXJlLCB0ZXh0dXJlU2FtcGxlciwgdXYpLCBpc0luc2lkZSh1dikpO1xuIjticmVhaztjYXNlIDI6ZGVmYXVsdDphPSJcbnNvdXJjZUNvbG9yID0gdGV4dHVyZVNhbXBsZShzcmNUZXh0dXJlLCB0ZXh0dXJlU2FtcGxlciwgZnJhY3QodXYpKTtcbiI7YnJlYWs7Y2FzZSAzOmE9IlxubGV0IGluc2lkZVVWID0gc3RlcChhYnModXYgLSB2ZWMyPGYzMj4oMC41KSksIHZlYzI8ZjMyPigwLjUpKTtcbnNvdXJjZUNvbG9yID0gdGV4dHVyZVNhbXBsZShzcmNUZXh0dXJlLCB0ZXh0dXJlU2FtcGxlciwgbWl4KGlucHV0LnRleENvb3JkLCB1diwgaW5zaWRlVVYpKTtcbiJ9cmV0dXJuYFxuJHtDaX1cblxuJHtzPyJzdHJ1Y3QgRGlzcGxhY2VtZW50VW5pZm9ybXMge1xuICAgIHV2VG9TdFNjYWxlOiB2ZWMyPGYzMj4sXG4gICAgdXZUb1N0T2Zmc2V0OiB2ZWMyPGYzMj4sXG4gICAgc2NhbGU6IHZlYzI8ZjMyPixcbiAgICBwYWRkaW5nOiB2ZWMyPGYzMj4sXG4gICAgc3Vic3RpdHV0ZUNvbG9yOiB2ZWM0PGYzMj4sXG59Ijoic3RydWN0IERpc3BsYWNlbWVudFVuaWZvcm1zIHtcbiAgICB1dlRvU3RTY2FsZTogdmVjMjxmMzI+LFxuICAgIHV2VG9TdE9mZnNldDogdmVjMjxmMzI+LFxuICAgIHNjYWxlOiB2ZWMyPGYzMj4sXG4gICAgcGFkZGluZzogdmVjMjxmMzI+LFxufSJ9XG5cbkBncm91cCgwKSBAYmluZGluZygwKSB2YXI8dW5pZm9ybT4gdW5pZm9ybXM6IERpc3BsYWNlbWVudFVuaWZvcm1zO1xuQGdyb3VwKDApIEBiaW5kaW5nKDEpIHZhciB0ZXh0dXJlU2FtcGxlcjogc2FtcGxlcjtcbkBncm91cCgwKSBAYmluZGluZygyKSB2YXIgc3JjVGV4dHVyZTogdGV4dHVyZV8yZDxmMzI+O1xuQGdyb3VwKDApIEBiaW5kaW5nKDMpIHZhciBtYXBUZXh0dXJlOiB0ZXh0dXJlXzJkPGYzMj47XG5cbiR7QWl9XG5cbkBmcmFnbWVudFxuZm4gbWFpbihpbnB1dDogVmVydGV4T3V0cHV0KSAtPiBAbG9jYXRpb24oMCkgdmVjNDxmMzI+IHtcbiAgICBsZXQgc3RDb29yZCA9IHZlYzI8ZjMyPihpbnB1dC50ZXhDb29yZC54LCAxLjAgLSBpbnB1dC50ZXhDb29yZC55KTtcbiAgICBsZXQgc3QgPSBzdENvb3JkICogdW5pZm9ybXMudXZUb1N0U2NhbGUgLSB1bmlmb3Jtcy51dlRvU3RPZmZzZXQ7XG4gICAgbGV0IG1hcENvbG9yID0gdGV4dHVyZVNhbXBsZShtYXBUZXh0dXJlLCB0ZXh0dXJlU2FtcGxlciwgdmVjMjxmMzI+KHN0LngsIDEuMCAtIHN0LnkpKTtcbiAgICBsZXQgb2Zmc2V0ID0gdmVjMjxmMzI+KCR7bn0sICR7aX0pIC0gMC41O1xuICAgIGxldCB1diA9IGlucHV0LnRleENvb3JkICsgb2Zmc2V0ICogdW5pZm9ybXMuc2NhbGU7XG4gICAgdmFyIHNvdXJjZUNvbG9yOiB2ZWM0PGYzMj47XG4gICAgJHthfVxuICAgIHJldHVybiBtaXgodGV4dHVyZVNhbXBsZShzcmNUZXh0dXJlLCB0ZXh0dXJlU2FtcGxlciwgaW5wdXQudGV4Q29vcmQpLCBzb3VyY2VDb2xvciwgaXNJbnNpZGUoc3QpKTtcbn1cbmB9c3RhdGljIGdldE5vZGVDbGVhclZlcnRleFNoYWRlcigpe3JldHVybiJcbnN0cnVjdCBWZXJ0ZXhJbnB1dCB7XG4gICAgQGxvY2F0aW9uKDApIHBvc2l0aW9uOiB2ZWMyPGYzMj4sXG59XG5cbnN0cnVjdCBWZXJ0ZXhPdXRwdXQge1xuICAgIEBidWlsdGluKHBvc2l0aW9uKSBwb3NpdGlvbjogdmVjNDxmMzI+LFxufVxuXG5AdmVydGV4XG5mbiBtYWluKGlucHV0OiBWZXJ0ZXhJbnB1dCkgLT4gVmVydGV4T3V0cHV0IHtcbiAgICB2YXIgb3V0cHV0OiBWZXJ0ZXhPdXRwdXQ7XG4gICAgbGV0IG5kYyA9IGlucHV0LnBvc2l0aW9uICogMi4wIC0gMS4wO1xuICAgIG91dHB1dC5wb3NpdGlvbiA9IHZlYzQ8ZjMyPihuZGMueCwgbmRjLnksIDAuMCwgMS4wKTtcbiAgICByZXR1cm4gb3V0cHV0O1xufVxuIn1zdGF0aWMgZ2V0Tm9kZUNsZWFyRnJhZ21lbnRTaGFkZXIoKXtyZXR1cm4iXG5AZnJhZ21lbnRcbmZuIG1haW4oKSAtPiBAbG9jYXRpb24oMCkgdmVjNDxmMzI+IHtcbiAgICByZXR1cm4gdmVjNDxmMzI+KDAuMCwgMC4wLCAwLjAsIDAuMCk7XG59XG4ifXN0YXRpYyBnZXRQb3NpdGlvbmVkVGV4dHVyZVZlcnRleFNoYWRlcigpe3JldHVybiBraX1zdGF0aWMgZ2V0VGV4dHVyZVNjYWxlVmVydGV4U2hhZGVyKCl7cmV0dXJuIFZpfXN0YXRpYyBnZXRUZXh0dXJlU2NhbGVCbGVuZFZlcnRleFNoYWRlcigpe3JldHVybiB6aX1zdGF0aWMgZ2V0Q29tcGxleEJsZW5kU2NhbGVWZXJ0ZXhTaGFkZXIoKXtyZXR1cm4gaml9c3RhdGljIGdldENvbXBsZXhCbGVuZFZlcnRleFNoYWRlcigpe3JldHVybiAkaX1zdGF0aWMgZ2V0Q29tcGxleEJsZW5kQ29weVZlcnRleFNoYWRlcigpe3JldHVybiBHaX1zdGF0aWMgZ2V0Q29tcGxleEJsZW5kT3V0cHV0VmVydGV4U2hhZGVyKCl7cmV0dXJuIE5pfXN0YXRpYyBnZXRGaWx0ZXJDb21wbGV4QmxlbmRPdXRwdXRWZXJ0ZXhTaGFkZXIoKXtyZXR1cm4gV2l9c3RhdGljIGdldFBvc2l0aW9uZWRUZXh0dXJlRnJhZ21lbnRTaGFkZXIoKXtyZXR1cm4gbmF9fWNvbnN0IGRhPXthcnJheVN0cmlkZToxNixhdHRyaWJ1dGVzOlt7c2hhZGVyTG9jYXRpb246MCxvZmZzZXQ6MCxmb3JtYXQ6ImZsb2F0MzJ4MiJ9LHtzaGFkZXJMb2NhdGlvbjoxLG9mZnNldDo4LGZvcm1hdDoiZmxvYXQzMngyIn1dfSxoYT17Y29sb3I6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn0sYWxwaGE6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn19O2NsYXNzIHBhe2NvbnN0cnVjdG9yKGUsdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImRldmljZSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJmb3JtYXQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywicGlwZWxpbmVzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImJpbmRHcm91cExheW91dHMiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywic2FtcGxlQ291bnQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywic2hhZGVyTW9kdWxlQ2FjaGUiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpuZXcgTWFwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImZpbHRlckJpbmRHcm91cExheW91dHMiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpuZXcgTWFwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImxhenlJbml0R3JvdXBzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bmV3IFNldH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJsYXp5R3JvdXBNYXAiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpuZXcgTWFwKFsuLi5BcnJheS5mcm9tKHtsZW5ndGg6MTZ9LChlLHQpPT5bYGJsdXJfZmlsdGVyXyR7dCsxfWAsImJsdXJfZmlsdGVyIl0pLFsiYmx1cl9maWx0ZXIiLCJibHVyX2ZpbHRlciJdLFsidGV4dHVyZV9jb3B5IiwidGV4dHVyZV9jb3B5Il0sWyJ0ZXh0dXJlX2NvcHlfcmdiYTgiLCJ0ZXh0dXJlX2NvcHkiXSxbImNvbG9yX3RyYW5zZm9ybSIsInRleHR1cmVfY29weSJdLFsieV9mbGlwX2NvbG9yX3RyYW5zZm9ybSIsInRleHR1cmVfY29weSJdLFsidGV4dHVyZV9lcmFzZSIsInRleHR1cmVfY29weSJdLFsiYmx1cl90ZXh0dXJlX2NvcHkiLCJ0ZXh0dXJlX2NvcHkiXSxbImZpbHRlcl9ibGVuZCIsInRleHR1cmVfY29weSJdLFsidGV4dHVyZV9jb3B5X2JncmEiLCJ0ZXh0dXJlX2NvcHkiXSxbImZpbHRlcl9vdXRwdXQiLCJ0ZXh0dXJlX2NvcHkiXSxbImZpbHRlcl9vdXRwdXRfYWRkIiwidGV4dHVyZV9jb3B5Il0sWyJmaWx0ZXJfb3V0cHV0X3NjcmVlbiIsInRleHR1cmVfY29weSJdLFsiZmlsdGVyX291dHB1dF9hbHBoYSIsInRleHR1cmVfY29weSJdLFsiZmlsdGVyX291dHB1dF9lcmFzZSIsInRleHR1cmVfY29weSJdLFsidGV4dHVyZV9jb3B5X2JncmFfbXNhYSIsInRleHR1cmVfY29weSJdLFsiZmlsdGVyX291dHB1dF9tc2FhIiwidGV4dHVyZV9jb3B5Il0sWyJmaWx0ZXJfb3V0cHV0X2FkZF9tc2FhIiwidGV4dHVyZV9jb3B5Il0sWyJmaWx0ZXJfb3V0cHV0X3NjcmVlbl9tc2FhIiwidGV4dHVyZV9jb3B5Il0sWyJmaWx0ZXJfb3V0cHV0X2FscGhhX21zYWEiLCJ0ZXh0dXJlX2NvcHkiXSxbImZpbHRlcl9vdXRwdXRfZXJhc2VfbXNhYSIsInRleHR1cmVfY29weSJdLFsicG9zaXRpb25lZF90ZXh0dXJlIiwidGV4dHVyZV9jb3B5Il0sWyJwb3NpdGlvbmVkX3RleHR1cmVfcmdiYSIsInRleHR1cmVfY29weSJdLFsiYml0bWFwX3JlbmRlcl9tc2FhIiwidGV4dHVyZV9jb3B5Il0sWyJiaXRtYXBfcmVuZGVyIiwidGV4dHVyZV9jb3B5Il0sWyJ0ZXh0dXJlX3NjYWxlIiwidGV4dHVyZV9jb3B5Il0sWyJ0ZXh0dXJlX3NjYWxlX2JsZW5kIiwidGV4dHVyZV9jb3B5Il0sWyJiaXRtYXBfc3luYyIsImJpdG1hcF9zeW5jIl0sWyJjb2xvcl9tYXRyaXhfZmlsdGVyIiwiZmlsdGVyIl0sWyJiZXZlbF9iYXNlIiwiZmlsdGVyIl0sWyJnbG93X2ZpbHRlciIsImZpbHRlciJdLFsiZHJvcF9zaGFkb3dfZmlsdGVyIiwiZmlsdGVyIl0sWyJiZXZlbF9maWx0ZXIiLCJmaWx0ZXIiXSxbImdyYWRpZW50X2dsb3dfZmlsdGVyIiwiZmlsdGVyIl0sWyJncmFkaWVudF9iZXZlbF9maWx0ZXIiLCJmaWx0ZXIiXSxbImNvbXBsZXhfYmxlbmQiLCJjb21wbGV4X2JsZW5kIl0sWyJjb21wbGV4X2JsZW5kX2NvcHkiLCJjb21wbGV4X2JsZW5kIl0sWyJjb21wbGV4X2JsZW5kX3NjYWxlIiwiY29tcGxleF9ibGVuZCJdLFsiY29tcGxleF9ibGVuZF9vdXRwdXQiLCJjb21wbGV4X2JsZW5kIl0sWyJjb21wbGV4X2JsZW5kX291dHB1dF9tc2FhIiwiY29tcGxleF9ibGVuZCJdLFsiZmlsdGVyX2NvbXBsZXhfYmxlbmRfb3V0cHV0IiwiY29tcGxleF9ibGVuZCJdLFsiZmlsdGVyX2NvbXBsZXhfYmxlbmRfb3V0cHV0X21zYWEiLCJjb21wbGV4X2JsZW5kIl1dKX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJncmFkaWVudFBpcGVsaW5lTGF5b3V0Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bnVsbH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJncmFkaWVudFZlcnRleFNoYWRlck1vZHVsZSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOm51bGx9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiZ3JhZGllbnRGcmFnbWVudFNoYWRlck1vZHVsZSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOm51bGx9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiZ3JhZGllbnRTdGVuY2lsRnJhZ21lbnRTaGFkZXJNb2R1bGUiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpudWxsfSksdGhpcy5kZXZpY2U9ZSx0aGlzLmZvcm1hdD10LHRoaXMucGlwZWxpbmVzPW5ldyBNYXAsdGhpcy5iaW5kR3JvdXBMYXlvdXRzPW5ldyBNYXAsdGhpcy5zYW1wbGVDb3VudD00LHRoaXMuaW5pdGlhbGl6ZSgpfWdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKGUsdCl7bGV0IHI9dGhpcy5zaGFkZXJNb2R1bGVDYWNoZS5nZXQoZSk7cmV0dXJuIHJ8fChyPXRoaXMuZGV2aWNlLmNyZWF0ZVNoYWRlck1vZHVsZSh7Y29kZTp0fSksdGhpcy5zaGFkZXJNb2R1bGVDYWNoZS5zZXQoZSxyKSkscn1pbml0aWFsaXplKCl7dGhpcy5jcmVhdGVGaWxsUGlwZWxpbmUoKSx0aGlzLmNyZWF0ZVN0ZW5jaWxGaWxsUGlwZWxpbmVzKCksdGhpcy5jcmVhdGVDbGlwUGlwZWxpbmUoKSx0aGlzLmNyZWF0ZU1hc2tVbmlvblBpcGVsaW5lcygpLHRoaXMuY3JlYXRlTWFza1BpcGVsaW5lKCksdGhpcy5jcmVhdGVCYXNpY1BpcGVsaW5lKCksdGhpcy5jcmVhdGVUZXh0dXJlUGlwZWxpbmUoKSx0aGlzLmNyZWF0ZUluc3RhbmNlZFBpcGVsaW5lKCksdGhpcy5jcmVhdGVHcmFkaWVudFBpcGVsaW5lKCksdGhpcy5jcmVhdGVCaXRtYXBGaWxsUGlwZWxpbmUoKSx0aGlzLmNyZWF0ZUJsZW5kUGlwZWxpbmUoKSx0aGlzLmNyZWF0ZU5vZGVDbGVhclBpcGVsaW5lKCl9ZW5zdXJlTGF6eUdyb3VwKGUpe2NvbnN0IHQ9dGhpcy5sYXp5R3JvdXBNYXAuZ2V0KGUpO2lmKHQmJiF0aGlzLmxhenlJbml0R3JvdXBzLmhhcyh0KSlzd2l0Y2godGhpcy5sYXp5SW5pdEdyb3Vwcy5hZGQodCksdCl7Y2FzZSJibHVyX2ZpbHRlciI6dGhpcy5jcmVhdGVCbHVyRmlsdGVyUGlwZWxpbmUoKTticmVhaztjYXNlInRleHR1cmVfY29weSI6dGhpcy5jcmVhdGVUZXh0dXJlQ29weVBpcGVsaW5lKCk7YnJlYWs7Y2FzZSJiaXRtYXBfc3luYyI6dGhpcy5jcmVhdGVCaXRtYXBTeW5jUGlwZWxpbmUoKTticmVhaztjYXNlImZpbHRlciI6dGhpcy5jcmVhdGVDb2xvck1hdHJpeEZpbHRlclBpcGVsaW5lKCk7YnJlYWs7Y2FzZSJjb21wbGV4X2JsZW5kIjp0aGlzLmNyZWF0ZUNvbXBsZXhCbGVuZFBpcGVsaW5lcygpfX1wcmVsb2FkTGF6eUdyb3Vwcygpe2NvbnN0IGU9WyJibHVyX2ZpbHRlciIsInRleHR1cmVfY29weSIsImJpdG1hcF9zeW5jIiwiZmlsdGVyIiwiY29tcGxleF9ibGVuZCJdO2Zvcihjb25zdCB0IG9mIGUpdGhpcy5lbnN1cmVMYXp5R3JvdXAodCl9Y3JlYXRlRmlsbFBpcGVsaW5lKCl7Y29uc3QgZT10aGlzLmRldmljZS5jcmVhdGVCaW5kR3JvdXBMYXlvdXQoe2VudHJpZXM6W3tiaW5kaW5nOjAsdmlzaWJpbGl0eTpHUFVTaGFkZXJTdGFnZS5WRVJURVh8R1BVU2hhZGVyU3RhZ2UuRlJBR01FTlQsYnVmZmVyOnt0eXBlOiJ1bmlmb3JtIixoYXNEeW5hbWljT2Zmc2V0OiEwfX1dfSk7dGhpcy5iaW5kR3JvdXBMYXlvdXRzLnNldCgiZmlsbF9keW5hbWljIixlKTtjb25zdCB0PXRoaXMuZGV2aWNlLmNyZWF0ZVBpcGVsaW5lTGF5b3V0KHtiaW5kR3JvdXBMYXlvdXRzOltlXX0pLHI9dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgiZmlsbFZlcnRleCIsZmEuZ2V0RmlsbFZlcnRleFNoYWRlcigpKSxuPXRoaXMuZ2V0T3JDcmVhdGVTaGFkZXJNb2R1bGUoImZpbGxGcmFnbWVudCIsZmEuZ2V0RmlsbEZyYWdtZW50U2hhZGVyKCkpLGk9ZGEsYT1oYSxzPXRoaXMuZGV2aWNlLmNyZWF0ZVJlbmRlclBpcGVsaW5lKHtsYXlvdXQ6dCx2ZXJ0ZXg6e21vZHVsZTpyLGVudHJ5UG9pbnQ6Im1haW4iLGJ1ZmZlcnM6W2ldfSxmcmFnbWVudDp7bW9kdWxlOm4sZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDoicmdiYTh1bm9ybSIsYmxlbmQ6YX1dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9LGRlcHRoU3RlbmNpbDp7Zm9ybWF0OiJzdGVuY2lsOCIsc3RlbmNpbEZyb250Ontjb21wYXJlOiJhbHdheXMiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6ImtlZXAiLHBhc3NPcDoia2VlcCJ9LHN0ZW5jaWxCYWNrOntjb21wYXJlOiJhbHdheXMiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6ImtlZXAiLHBhc3NPcDoia2VlcCJ9LHN0ZW5jaWxSZWFkTWFzazowLHN0ZW5jaWxXcml0ZU1hc2s6MH0sbXVsdGlzYW1wbGU6e2NvdW50OnRoaXMuc2FtcGxlQ291bnQsYWxwaGFUb0NvdmVyYWdlRW5hYmxlZDohMH19KSxvPXRoaXMuZGV2aWNlLmNyZWF0ZVJlbmRlclBpcGVsaW5lKHtsYXlvdXQ6dCx2ZXJ0ZXg6e21vZHVsZTpyLGVudHJ5UG9pbnQ6Im1haW4iLGJ1ZmZlcnM6W2ldLGNvbnN0YW50czp7eUZsaXBTaWduOi0xfX0sZnJhZ21lbnQ6e21vZHVsZTpuLGVudHJ5UG9pbnQ6Im1haW4iLHRhcmdldHM6W3tmb3JtYXQ6dGhpcy5mb3JtYXQsYmxlbmQ6YX1dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9LG11bHRpc2FtcGxlOntjb3VudDp0aGlzLnNhbXBsZUNvdW50LGFscGhhVG9Db3ZlcmFnZUVuYWJsZWQ6ITB9fSk7dGhpcy5waXBlbGluZXMuc2V0KCJmaWxsIixzKSx0aGlzLnBpcGVsaW5lcy5zZXQoImZpbGxfYmdyYSIsbyk7Y29uc3QgbD10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGF5b3V0OnQsdmVydGV4Onttb2R1bGU6cixlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOltpXSxjb25zdGFudHM6e3lGbGlwU2lnbjotMX19LGZyYWdtZW50Onttb2R1bGU6bixlbnRyeVBvaW50OiJtYWluIix0YXJnZXRzOlt7Zm9ybWF0OnRoaXMuZm9ybWF0LGJsZW5kOmF9XX0scHJpbWl0aXZlOnt0b3BvbG9neToidHJpYW5nbGUtbGlzdCIsY3VsbE1vZGU6Im5vbmUifSxkZXB0aFN0ZW5jaWw6e2Zvcm1hdDoic3RlbmNpbDgiLHN0ZW5jaWxGcm9udDp7Y29tcGFyZToiZXF1YWwiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6ImtlZXAiLHBhc3NPcDoia2VlcCJ9LHN0ZW5jaWxCYWNrOntjb21wYXJlOiJlcXVhbCIsZmFpbE9wOiJrZWVwIixkZXB0aEZhaWxPcDoia2VlcCIscGFzc09wOiJrZWVwIn0sc3RlbmNpbFJlYWRNYXNrOjI1NSxzdGVuY2lsV3JpdGVNYXNrOjB9LG11bHRpc2FtcGxlOntjb3VudDp0aGlzLnNhbXBsZUNvdW50LGFscGhhVG9Db3ZlcmFnZUVuYWJsZWQ6ITB9fSk7dGhpcy5waXBlbGluZXMuc2V0KCJmaWxsX2JncmFfc3RlbmNpbCIsbCl9Y3JlYXRlU3RlbmNpbEZpbGxQaXBlbGluZXMoKXtjb25zdCBlPWRhLHQ9dGhpcy5iaW5kR3JvdXBMYXlvdXRzLmdldCgiZmlsbF9keW5hbWljIikscj10aGlzLmRldmljZS5jcmVhdGVQaXBlbGluZUxheW91dCh7YmluZEdyb3VwTGF5b3V0czpbdF19KSxuPXRoaXMuZGV2aWNlLmNyZWF0ZVJlbmRlclBpcGVsaW5lKHtsYXlvdXQ6cix2ZXJ0ZXg6e21vZHVsZTp0aGlzLmdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKCJzdGVuY2lsV3JpdGVWZXJ0ZXgiLGZhLmdldFN0ZW5jaWxXcml0ZVZlcnRleFNoYWRlcigpKSxlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOltlXX0sZnJhZ21lbnQ6e21vZHVsZTp0aGlzLmdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKCJzdGVuY2lsV3JpdGVGcmFnbWVudCIsZmEuZ2V0U3RlbmNpbFdyaXRlRnJhZ21lbnRTaGFkZXIoKSksZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDoicmdiYTh1bm9ybSIsd3JpdGVNYXNrOjB9XX0scHJpbWl0aXZlOnt0b3BvbG9neToidHJpYW5nbGUtbGlzdCIsY3VsbE1vZGU6Im5vbmUiLGZyb250RmFjZToiY2N3In0sZGVwdGhTdGVuY2lsOntmb3JtYXQ6InN0ZW5jaWw4IixzdGVuY2lsRnJvbnQ6e2NvbXBhcmU6ImFsd2F5cyIsZmFpbE9wOiJrZWVwIixkZXB0aEZhaWxPcDoia2VlcCIscGFzc09wOiJpbmNyZW1lbnQtd3JhcCJ9LHN0ZW5jaWxCYWNrOntjb21wYXJlOiJhbHdheXMiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6ImtlZXAiLHBhc3NPcDoiZGVjcmVtZW50LXdyYXAifSxzdGVuY2lsUmVhZE1hc2s6MjU1LHN0ZW5jaWxXcml0ZU1hc2s6MjU1fSxtdWx0aXNhbXBsZTp7Y291bnQ6dGhpcy5zYW1wbGVDb3VudCxhbHBoYVRvQ292ZXJhZ2VFbmFibGVkOiEwfX0pO3RoaXMucGlwZWxpbmVzLnNldCgic3RlbmNpbF93cml0ZSIsbik7Y29uc3QgaT10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGF5b3V0OnIsdmVydGV4Onttb2R1bGU6dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgic3RlbmNpbEZpbGxWZXJ0ZXgiLGZhLmdldFN0ZW5jaWxGaWxsVmVydGV4U2hhZGVyKCkpLGVudHJ5UG9pbnQ6Im1haW4iLGJ1ZmZlcnM6W2VdfSxmcmFnbWVudDp7bW9kdWxlOnRoaXMuZ2V0T3JDcmVhdGVTaGFkZXJNb2R1bGUoInN0ZW5jaWxGaWxsRnJhZ21lbnQiLGZhLmdldFN0ZW5jaWxGaWxsRnJhZ21lbnRTaGFkZXIoKSksZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDoicmdiYTh1bm9ybSIsYmxlbmQ6e2NvbG9yOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJvbmUtbWludXMtc3JjLWFscGhhIixvcGVyYXRpb246ImFkZCJ9LGFscGhhOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJvbmUtbWludXMtc3JjLWFscGhhIixvcGVyYXRpb246ImFkZCJ9fX1dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9LGRlcHRoU3RlbmNpbDp7Zm9ybWF0OiJzdGVuY2lsOCIsc3RlbmNpbEZyb250Ontjb21wYXJlOiJub3QtZXF1YWwiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6Inplcm8iLHBhc3NPcDoiemVybyJ9LHN0ZW5jaWxCYWNrOntjb21wYXJlOiJub3QtZXF1YWwiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6Inplcm8iLHBhc3NPcDoiemVybyJ9LHN0ZW5jaWxSZWFkTWFzazoyNTUsc3RlbmNpbFdyaXRlTWFzazoyNTV9LG11bHRpc2FtcGxlOntjb3VudDp0aGlzLnNhbXBsZUNvdW50fX0pO3RoaXMucGlwZWxpbmVzLnNldCgic3RlbmNpbF9maWxsIixpKTtjb25zdCBhPXRoaXMuZGV2aWNlLmNyZWF0ZVJlbmRlclBpcGVsaW5lKHtsYXlvdXQ6cix2ZXJ0ZXg6e21vZHVsZTp0aGlzLmdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKCJzdGVuY2lsV3JpdGVWZXJ0ZXgiLGZhLmdldFN0ZW5jaWxXcml0ZVZlcnRleFNoYWRlcigpKSxlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOltlXX0sZnJhZ21lbnQ6e21vZHVsZTp0aGlzLmdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKCJzdGVuY2lsV3JpdGVGcmFnbWVudCIsZmEuZ2V0U3RlbmNpbFdyaXRlRnJhZ21lbnRTaGFkZXIoKSksZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDoicmdiYTh1bm9ybSIsd3JpdGVNYXNrOjB9XX0scHJpbWl0aXZlOnt0b3BvbG9neToidHJpYW5nbGUtbGlzdCIsY3VsbE1vZGU6Im5vbmUiLGZyb250RmFjZToiY2N3In0sZGVwdGhTdGVuY2lsOntmb3JtYXQ6InN0ZW5jaWw4IixzdGVuY2lsRnJvbnQ6e2NvbXBhcmU6ImFsd2F5cyIsZmFpbE9wOiJrZWVwIixkZXB0aEZhaWxPcDoia2VlcCIscGFzc09wOiJpbmNyZW1lbnQtd3JhcCJ9LHN0ZW5jaWxCYWNrOntjb21wYXJlOiJhbHdheXMiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6ImtlZXAiLHBhc3NPcDoiZGVjcmVtZW50LXdyYXAifSxzdGVuY2lsUmVhZE1hc2s6MjU1LHN0ZW5jaWxXcml0ZU1hc2s6MjU1fSxtdWx0aXNhbXBsZTp7Y291bnQ6dGhpcy5zYW1wbGVDb3VudCxhbHBoYVRvQ292ZXJhZ2VFbmFibGVkOiEwfX0pO3RoaXMucGlwZWxpbmVzLnNldCgic3RlbmNpbF93cml0ZV9hdGxhcyIsYSk7Y29uc3Qgcz10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGF5b3V0OnIsdmVydGV4Onttb2R1bGU6dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgic3RlbmNpbFdyaXRlVmVydGV4IixmYS5nZXRTdGVuY2lsV3JpdGVWZXJ0ZXhTaGFkZXIoKSksZW50cnlQb2ludDoibWFpbiIsYnVmZmVyczpbZV0sY29uc3RhbnRzOnt5RmxpcFNpZ246LTF9fSxmcmFnbWVudDp7bW9kdWxlOnRoaXMuZ2V0T3JDcmVhdGVTaGFkZXJNb2R1bGUoInN0ZW5jaWxXcml0ZUZyYWdtZW50IixmYS5nZXRTdGVuY2lsV3JpdGVGcmFnbWVudFNoYWRlcigpKSxlbnRyeVBvaW50OiJtYWluIix0YXJnZXRzOlt7Zm9ybWF0OnRoaXMuZm9ybWF0LHdyaXRlTWFzazowfV19LHByaW1pdGl2ZTp7dG9wb2xvZ3k6InRyaWFuZ2xlLWxpc3QiLGN1bGxNb2RlOiJub25lIixmcm9udEZhY2U6ImNjdyJ9LGRlcHRoU3RlbmNpbDp7Zm9ybWF0OiJzdGVuY2lsOCIsc3RlbmNpbEZyb250Ontjb21wYXJlOiJhbHdheXMiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6ImtlZXAiLHBhc3NPcDoiaW5jcmVtZW50LXdyYXAifSxzdGVuY2lsQmFjazp7Y29tcGFyZToiYWx3YXlzIixmYWlsT3A6ImtlZXAiLGRlcHRoRmFpbE9wOiJrZWVwIixwYXNzT3A6ImRlY3JlbWVudC13cmFwIn0sc3RlbmNpbFJlYWRNYXNrOjI1NSxzdGVuY2lsV3JpdGVNYXNrOjI1NX0sbXVsdGlzYW1wbGU6e2NvdW50OnRoaXMuc2FtcGxlQ291bnQsYWxwaGFUb0NvdmVyYWdlRW5hYmxlZDohMH19KTt0aGlzLnBpcGVsaW5lcy5zZXQoInN0ZW5jaWxfd3JpdGVfbWFpbiIscyk7Y29uc3Qgbz10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGF5b3V0OnIsdmVydGV4Onttb2R1bGU6dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgic3RlbmNpbEZpbGxWZXJ0ZXgiLGZhLmdldFN0ZW5jaWxGaWxsVmVydGV4U2hhZGVyKCkpLGVudHJ5UG9pbnQ6Im1haW4iLGJ1ZmZlcnM6W2VdfSxmcmFnbWVudDp7bW9kdWxlOnRoaXMuZ2V0T3JDcmVhdGVTaGFkZXJNb2R1bGUoInN0ZW5jaWxGaWxsRnJhZ21lbnQiLGZhLmdldFN0ZW5jaWxGaWxsRnJhZ21lbnRTaGFkZXIoKSksZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDoicmdiYTh1bm9ybSIsYmxlbmQ6e2NvbG9yOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJvbmUtbWludXMtc3JjLWFscGhhIixvcGVyYXRpb246ImFkZCJ9LGFscGhhOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJvbmUiLG9wZXJhdGlvbjoibWF4In19fV19LHByaW1pdGl2ZTp7dG9wb2xvZ3k6InRyaWFuZ2xlLWxpc3QiLGN1bGxNb2RlOiJub25lIn0sZGVwdGhTdGVuY2lsOntmb3JtYXQ6InN0ZW5jaWw4IixzdGVuY2lsRnJvbnQ6e2NvbXBhcmU6Im5vdC1lcXVhbCIsZmFpbE9wOiJrZWVwIixkZXB0aEZhaWxPcDoiemVybyIscGFzc09wOiJ6ZXJvIn0sc3RlbmNpbEJhY2s6e2NvbXBhcmU6Im5vdC1lcXVhbCIsZmFpbE9wOiJrZWVwIixkZXB0aEZhaWxPcDoiemVybyIscGFzc09wOiJ6ZXJvIn0sc3RlbmNpbFJlYWRNYXNrOjI1NSxzdGVuY2lsV3JpdGVNYXNrOjI1NX0sbXVsdGlzYW1wbGU6e2NvdW50OnRoaXMuc2FtcGxlQ291bnR9fSk7dGhpcy5waXBlbGluZXMuc2V0KCJzdGVuY2lsX2ZpbGxfYXRsYXMiLG8pO2NvbnN0IGw9dGhpcy5kZXZpY2UuY3JlYXRlUmVuZGVyUGlwZWxpbmUoe2xheW91dDpyLHZlcnRleDp7bW9kdWxlOnRoaXMuZ2V0T3JDcmVhdGVTaGFkZXJNb2R1bGUoInN0ZW5jaWxGaWxsVmVydGV4IixmYS5nZXRTdGVuY2lsRmlsbFZlcnRleFNoYWRlcigpKSxlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOltlXSxjb25zdGFudHM6e3lGbGlwU2lnbjotMX19LGZyYWdtZW50Onttb2R1bGU6dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgic3RlbmNpbEZpbGxGcmFnbWVudCIsZmEuZ2V0U3RlbmNpbEZpbGxGcmFnbWVudFNoYWRlcigpKSxlbnRyeVBvaW50OiJtYWluIix0YXJnZXRzOlt7Zm9ybWF0OnRoaXMuZm9ybWF0LGJsZW5kOntjb2xvcjp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3Rvcjoib25lLW1pbnVzLXNyYy1hbHBoYSIsb3BlcmF0aW9uOiJhZGQifSxhbHBoYTp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3Rvcjoib25lIixvcGVyYXRpb246Im1heCJ9fX1dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9LGRlcHRoU3RlbmNpbDp7Zm9ybWF0OiJzdGVuY2lsOCIsc3RlbmNpbEZyb250Ontjb21wYXJlOiJub3QtZXF1YWwiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6Inplcm8iLHBhc3NPcDoiemVybyJ9LHN0ZW5jaWxCYWNrOntjb21wYXJlOiJub3QtZXF1YWwiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6Inplcm8iLHBhc3NPcDoiemVybyJ9LHN0ZW5jaWxSZWFkTWFzazoyNTUsc3RlbmNpbFdyaXRlTWFzazoyNTV9LG11bHRpc2FtcGxlOntjb3VudDp0aGlzLnNhbXBsZUNvdW50fX0pO3RoaXMucGlwZWxpbmVzLnNldCgic3RlbmNpbF9maWxsX21haW4iLGwpO2NvbnN0IGM9dGhpcy5kZXZpY2UuY3JlYXRlUmVuZGVyUGlwZWxpbmUoe2xheW91dDpyLHZlcnRleDp7bW9kdWxlOnRoaXMuZ2V0T3JDcmVhdGVTaGFkZXJNb2R1bGUoInN0ZW5jaWxGaWxsVmVydGV4IixmYS5nZXRTdGVuY2lsRmlsbFZlcnRleFNoYWRlcigpKSxlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOltlXX0sZnJhZ21lbnQ6e21vZHVsZTp0aGlzLmdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKCJzdGVuY2lsRmlsbEZyYWdtZW50IixmYS5nZXRTdGVuY2lsRmlsbEZyYWdtZW50U2hhZGVyKCkpLGVudHJ5UG9pbnQ6Im1haW4iLHRhcmdldHM6W3tmb3JtYXQ6InJnYmE4dW5vcm0iLGJsZW5kOntjb2xvcjp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3Rvcjoib25lLW1pbnVzLXNyYy1hbHBoYSIsb3BlcmF0aW9uOiJhZGQifSxhbHBoYTp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3Rvcjoib25lLW1pbnVzLXNyYy1hbHBoYSIsb3BlcmF0aW9uOiJhZGQifX19XX0scHJpbWl0aXZlOnt0b3BvbG9neToidHJpYW5nbGUtbGlzdCIsY3VsbE1vZGU6Im5vbmUifSxkZXB0aFN0ZW5jaWw6e2Zvcm1hdDoic3RlbmNpbDgiLHN0ZW5jaWxGcm9udDp7Y29tcGFyZToiZ3JlYXRlciIsZmFpbE9wOiJrZWVwIixkZXB0aEZhaWxPcDoicmVwbGFjZSIscGFzc09wOiJyZXBsYWNlIn0sc3RlbmNpbEJhY2s6e2NvbXBhcmU6ImdyZWF0ZXIiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6InJlcGxhY2UiLHBhc3NPcDoicmVwbGFjZSJ9LHN0ZW5jaWxSZWFkTWFzazoyNTUsc3RlbmNpbFdyaXRlTWFzazoyNTV9LG11bHRpc2FtcGxlOntjb3VudDp0aGlzLnNhbXBsZUNvdW50fX0pO3RoaXMucGlwZWxpbmVzLnNldCgic3RlbmNpbF9maWxsX21hc2tlZCIsYyl9Y3JlYXRlQ2xpcFBpcGVsaW5lKCl7Y29uc3QgZT1kYSx0PXRoaXMuYmluZEdyb3VwTGF5b3V0cy5nZXQoImZpbGxfZHluYW1pYyIpLHI9dGhpcy5kZXZpY2UuY3JlYXRlUGlwZWxpbmVMYXlvdXQoe2JpbmRHcm91cExheW91dHM6W3RdfSksbj10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGF5b3V0OnIsdmVydGV4Onttb2R1bGU6dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgic3RlbmNpbFdyaXRlVmVydGV4IixmYS5nZXRTdGVuY2lsV3JpdGVWZXJ0ZXhTaGFkZXIoKSksZW50cnlQb2ludDoibWFpbiIsYnVmZmVyczpbZV19LGZyYWdtZW50Onttb2R1bGU6dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgic3RlbmNpbFdyaXRlRnJhZ21lbnQiLGZhLmdldFN0ZW5jaWxXcml0ZUZyYWdtZW50U2hhZGVyKCkpLGVudHJ5UG9pbnQ6Im1haW4iLHRhcmdldHM6W3tmb3JtYXQ6InJnYmE4dW5vcm0iLHdyaXRlTWFzazowfV19LHByaW1pdGl2ZTp7dG9wb2xvZ3k6InRyaWFuZ2xlLWxpc3QiLGN1bGxNb2RlOiJub25lIn0sZGVwdGhTdGVuY2lsOntmb3JtYXQ6InN0ZW5jaWw4IixzdGVuY2lsRnJvbnQ6e2NvbXBhcmU6ImFsd2F5cyIsZmFpbE9wOiJ6ZXJvIixkZXB0aEZhaWxPcDoiaW52ZXJ0IixwYXNzT3A6ImludmVydCJ9LHN0ZW5jaWxCYWNrOntjb21wYXJlOiJhbHdheXMiLGZhaWxPcDoiemVybyIsZGVwdGhGYWlsT3A6ImludmVydCIscGFzc09wOiJpbnZlcnQifSxzdGVuY2lsUmVhZE1hc2s6MjU1LHN0ZW5jaWxXcml0ZU1hc2s6MjU1fSxtdWx0aXNhbXBsZTp7Y291bnQ6dGhpcy5zYW1wbGVDb3VudH19KTt0aGlzLnBpcGVsaW5lcy5zZXQoImNsaXBfd3JpdGUiLG4pO2NvbnN0IGk9dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgic3RlbmNpbFdyaXRlVmVydGV4IixmYS5nZXRTdGVuY2lsV3JpdGVWZXJ0ZXhTaGFkZXIoKSksYT10aGlzLmdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKCJzdGVuY2lsV3JpdGVGcmFnbWVudCIsZmEuZ2V0U3RlbmNpbFdyaXRlRnJhZ21lbnRTaGFkZXIoKSk7Zm9yKGxldCB0PTE7dDw9ODt0Kyspe2NvbnN0IG49MTw8dC0xLHM9dGhpcy5kZXZpY2UuY3JlYXRlUmVuZGVyUGlwZWxpbmUoe2xheW91dDpyLHZlcnRleDp7bW9kdWxlOmksZW50cnlQb2ludDoibWFpbiIsYnVmZmVyczpbZV0sY29uc3RhbnRzOnt5RmxpcFNpZ246LTF9fSxmcmFnbWVudDp7bW9kdWxlOmEsZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDp0aGlzLmZvcm1hdCx3cml0ZU1hc2s6MH1dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9LGRlcHRoU3RlbmNpbDp7Zm9ybWF0OiJzdGVuY2lsOCIsc3RlbmNpbEZyb250Ontjb21wYXJlOiJhbHdheXMiLGZhaWxPcDoiemVybyIsZGVwdGhGYWlsT3A6ImludmVydCIscGFzc09wOiJpbnZlcnQifSxzdGVuY2lsQmFjazp7Y29tcGFyZToiYWx3YXlzIixmYWlsT3A6Inplcm8iLGRlcHRoRmFpbE9wOiJpbnZlcnQiLHBhc3NPcDoiaW52ZXJ0In0sc3RlbmNpbFJlYWRNYXNrOjI1NSxzdGVuY2lsV3JpdGVNYXNrOm59LG11bHRpc2FtcGxlOntjb3VudDp0aGlzLnNhbXBsZUNvdW50LGFscGhhVG9Db3ZlcmFnZUVuYWJsZWQ6ITB9fSk7dGhpcy5waXBlbGluZXMuc2V0KGBjbGlwX3dyaXRlX21haW5fJHt0fWAscyl9dGhpcy5waXBlbGluZXMuc2V0KCJjbGlwX3dyaXRlX21haW4iLHRoaXMucGlwZWxpbmVzLmdldCgiY2xpcF93cml0ZV9tYWluXzEiKSk7Zm9yKGxldCB0PTE7dDw9ODt0Kyspe2NvbnN0IG49MTw8dC0xLHM9dGhpcy5kZXZpY2UuY3JlYXRlUmVuZGVyUGlwZWxpbmUoe2xheW91dDpyLHZlcnRleDp7bW9kdWxlOmksZW50cnlQb2ludDoibWFpbiIsYnVmZmVyczpbZV0sY29uc3RhbnRzOnt5RmxpcFNpZ246LTF9fSxmcmFnbWVudDp7bW9kdWxlOmEsZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDp0aGlzLmZvcm1hdCx3cml0ZU1hc2s6MH1dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9LGRlcHRoU3RlbmNpbDp7Zm9ybWF0OiJzdGVuY2lsOCIsc3RlbmNpbEZyb250Ontjb21wYXJlOiJhbHdheXMiLGZhaWxPcDoicmVwbGFjZSIsZGVwdGhGYWlsT3A6InJlcGxhY2UiLHBhc3NPcDoicmVwbGFjZSJ9LHN0ZW5jaWxCYWNrOntjb21wYXJlOiJhbHdheXMiLGZhaWxPcDoicmVwbGFjZSIsZGVwdGhGYWlsT3A6InJlcGxhY2UiLHBhc3NPcDoicmVwbGFjZSJ9LHN0ZW5jaWxSZWFkTWFzazoyNTUsc3RlbmNpbFdyaXRlTWFzazpufSxtdWx0aXNhbXBsZTp7Y291bnQ6dGhpcy5zYW1wbGVDb3VudH19KTt0aGlzLnBpcGVsaW5lcy5zZXQoYGNsaXBfY2xlYXJfbWFpbl8ke3R9YCxzKX19Y3JlYXRlTWFza1VuaW9uUGlwZWxpbmVzKCl7Y29uc3QgZT1kYSx0PXRoaXMuYmluZEdyb3VwTGF5b3V0cy5nZXQoImZpbGxfZHluYW1pYyIpLHI9dGhpcy5kZXZpY2UuY3JlYXRlUGlwZWxpbmVMYXlvdXQoe2JpbmRHcm91cExheW91dHM6W3RdfSksbj10aGlzLmdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKCJzdGVuY2lsV3JpdGVWZXJ0ZXgiLGZhLmdldFN0ZW5jaWxXcml0ZVZlcnRleFNoYWRlcigpKSxpPXRoaXMuZ2V0T3JDcmVhdGVTaGFkZXJNb2R1bGUoInN0ZW5jaWxXcml0ZUZyYWdtZW50IixmYS5nZXRTdGVuY2lsV3JpdGVGcmFnbWVudFNoYWRlcigpKTtmb3IobGV0IHQ9MTt0PD04O3QrKyl7Y29uc3QgYT0yNTUmfigxPDx0LTEpLHM9dGhpcy5kZXZpY2UuY3JlYXRlUmVuZGVyUGlwZWxpbmUoe2xheW91dDpyLHZlcnRleDp7bW9kdWxlOm4sZW50cnlQb2ludDoibWFpbiIsYnVmZmVyczpbZV0sY29uc3RhbnRzOnt5RmxpcFNpZ246LTF9fSxmcmFnbWVudDp7bW9kdWxlOmksZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDp0aGlzLmZvcm1hdCx3cml0ZU1hc2s6MH1dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9LGRlcHRoU3RlbmNpbDp7Zm9ybWF0OiJzdGVuY2lsOCIsc3RlbmNpbEZyb250Ontjb21wYXJlOiJsZXNzLWVxdWFsIixmYWlsT3A6Inplcm8iLGRlcHRoRmFpbE9wOiJyZXBsYWNlIixwYXNzT3A6InJlcGxhY2UifSxzdGVuY2lsQmFjazp7Y29tcGFyZToibGVzcy1lcXVhbCIsZmFpbE9wOiJ6ZXJvIixkZXB0aEZhaWxPcDoicmVwbGFjZSIscGFzc09wOiJyZXBsYWNlIn0sc3RlbmNpbFJlYWRNYXNrOjI1NSxzdGVuY2lsV3JpdGVNYXNrOmF9fSk7dGhpcy5waXBlbGluZXMuc2V0KGBtYXNrX3VuaW9uX21lcmdlXyR7dH1gLHMpO2NvbnN0IG89dGhpcy5kZXZpY2UuY3JlYXRlUmVuZGVyUGlwZWxpbmUoe2xheW91dDpyLHZlcnRleDp7bW9kdWxlOm4sZW50cnlQb2ludDoibWFpbiIsYnVmZmVyczpbZV0sY29uc3RhbnRzOnt5RmxpcFNpZ246LTF9fSxmcmFnbWVudDp7bW9kdWxlOmksZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDp0aGlzLmZvcm1hdCx3cml0ZU1hc2s6MH1dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9LGRlcHRoU3RlbmNpbDp7Zm9ybWF0OiJzdGVuY2lsOCIsc3RlbmNpbEZyb250Ontjb21wYXJlOiJhbHdheXMiLGZhaWxPcDoicmVwbGFjZSIsZGVwdGhGYWlsT3A6InJlcGxhY2UiLHBhc3NPcDoicmVwbGFjZSJ9LHN0ZW5jaWxCYWNrOntjb21wYXJlOiJhbHdheXMiLGZhaWxPcDoicmVwbGFjZSIsZGVwdGhGYWlsT3A6InJlcGxhY2UiLHBhc3NPcDoicmVwbGFjZSJ9LHN0ZW5jaWxSZWFkTWFzazoyNTUsc3RlbmNpbFdyaXRlTWFzazoxPDx0fX0pO3RoaXMucGlwZWxpbmVzLnNldChgbWFza191bmlvbl9jbGVhcl8ke3R9YCxvKX19Y3JlYXRlTWFza1BpcGVsaW5lKCl7Y29uc3QgZT10aGlzLmRldmljZS5jcmVhdGVCaW5kR3JvdXBMYXlvdXQoe2VudHJpZXM6W3tiaW5kaW5nOjAsdmlzaWJpbGl0eTpHUFVTaGFkZXJTdGFnZS5WRVJURVgsYnVmZmVyOnt0eXBlOiJ1bmlmb3JtIn19XX0pO3RoaXMuYmluZEdyb3VwTGF5b3V0cy5zZXQoIm1hc2siLGUpO2NvbnN0IHQ9dGhpcy5kZXZpY2UuY3JlYXRlUGlwZWxpbmVMYXlvdXQoe2JpbmRHcm91cExheW91dHM6W2VdfSkscj10aGlzLmdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKCJtYXNrVmVydGV4IixmYS5nZXRNYXNrVmVydGV4U2hhZGVyKCkpLG49dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgibWFza0ZyYWdtZW50IixmYS5nZXRNYXNrRnJhZ21lbnRTaGFkZXIoKSksaT10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGF5b3V0OnQsdmVydGV4Onttb2R1bGU6cixlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOlt7YXJyYXlTdHJpZGU6MTYsYXR0cmlidXRlczpbe3NoYWRlckxvY2F0aW9uOjAsb2Zmc2V0OjAsZm9ybWF0OiJmbG9hdDMyeDIifSx7c2hhZGVyTG9jYXRpb246MSxvZmZzZXQ6OCxmb3JtYXQ6ImZsb2F0MzJ4MiJ9XX1dfSxmcmFnbWVudDp7bW9kdWxlOm4sZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDp0aGlzLmZvcm1hdCxibGVuZDp7Y29sb3I6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn0sYWxwaGE6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn19fV19LHByaW1pdGl2ZTp7dG9wb2xvZ3k6InRyaWFuZ2xlLWxpc3QiLGN1bGxNb2RlOiJub25lIn19KTt0aGlzLnBpcGVsaW5lcy5zZXQoIm1hc2siLGkpfWNyZWF0ZUJhc2ljUGlwZWxpbmUoKXtjb25zdCBlPXRoaXMuZGV2aWNlLmNyZWF0ZUJpbmRHcm91cExheW91dCh7ZW50cmllczpbe2JpbmRpbmc6MCx2aXNpYmlsaXR5OkdQVVNoYWRlclN0YWdlLlZFUlRFWHxHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCxidWZmZXI6e3R5cGU6InVuaWZvcm0ifX1dfSk7dGhpcy5iaW5kR3JvdXBMYXlvdXRzLnNldCgiYmFzaWMiLGUpO2NvbnN0IHQ9dGhpcy5kZXZpY2UuY3JlYXRlUGlwZWxpbmVMYXlvdXQoe2JpbmRHcm91cExheW91dHM6W2VdfSkscj10aGlzLmdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKCJiYXNpY1ZlcnRleCIsZmEuZ2V0QmFzaWNWZXJ0ZXhTaGFkZXIoKSksbj10aGlzLmdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKCJiYXNpY0ZyYWdtZW50IixmYS5nZXRCYXNpY0ZyYWdtZW50U2hhZGVyKCkpLGk9e2FycmF5U3RyaWRlOjE2LGF0dHJpYnV0ZXM6W3tzaGFkZXJMb2NhdGlvbjowLG9mZnNldDowLGZvcm1hdDoiZmxvYXQzMngyIn0se3NoYWRlckxvY2F0aW9uOjEsb2Zmc2V0OjgsZm9ybWF0OiJmbG9hdDMyeDIifV19LGE9aGEscz10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGF5b3V0OnQsdmVydGV4Onttb2R1bGU6cixlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOltpXX0sZnJhZ21lbnQ6e21vZHVsZTpuLGVudHJ5UG9pbnQ6Im1haW4iLHRhcmdldHM6W3tmb3JtYXQ6InJnYmE4dW5vcm0iLGJsZW5kOmF9XX0scHJpbWl0aXZlOnt0b3BvbG9neToidHJpYW5nbGUtbGlzdCIsY3VsbE1vZGU6Im5vbmUifSxtdWx0aXNhbXBsZTp7Y291bnQ6dGhpcy5zYW1wbGVDb3VudH19KSxvPXRoaXMuZGV2aWNlLmNyZWF0ZVJlbmRlclBpcGVsaW5lKHtsYXlvdXQ6dCx2ZXJ0ZXg6e21vZHVsZTpyLGVudHJ5UG9pbnQ6Im1haW4iLGJ1ZmZlcnM6W2ldLGNvbnN0YW50czp7eUZsaXBTaWduOi0xfX0sZnJhZ21lbnQ6e21vZHVsZTpuLGVudHJ5UG9pbnQ6Im1haW4iLHRhcmdldHM6W3tmb3JtYXQ6dGhpcy5mb3JtYXQsYmxlbmQ6YX1dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9fSk7dGhpcy5waXBlbGluZXMuc2V0KCJiYXNpYyIscyksdGhpcy5waXBlbGluZXMuc2V0KCJiYXNpY19iZ3JhIixvKX1jcmVhdGVUZXh0dXJlUGlwZWxpbmUoKXtjb25zdCBlPXRoaXMuZGV2aWNlLmNyZWF0ZUJpbmRHcm91cExheW91dCh7ZW50cmllczpbe2JpbmRpbmc6MCx2aXNpYmlsaXR5OkdQVVNoYWRlclN0YWdlLlZFUlRFWHxHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCxidWZmZXI6e3R5cGU6InVuaWZvcm0ifX0se2JpbmRpbmc6MSx2aXNpYmlsaXR5OkdQVVNoYWRlclN0YWdlLkZSQUdNRU5ULHNhbXBsZXI6e319LHtiaW5kaW5nOjIsdmlzaWJpbGl0eTpHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCx0ZXh0dXJlOnt9fV19KTt0aGlzLmJpbmRHcm91cExheW91dHMuc2V0KCJ0ZXh0dXJlIixlKTtjb25zdCB0PXRoaXMuZGV2aWNlLmNyZWF0ZVBpcGVsaW5lTGF5b3V0KHtiaW5kR3JvdXBMYXlvdXRzOltlXX0pLHI9dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgiYmFzaWNWZXJ0ZXgiLGZhLmdldEJhc2ljVmVydGV4U2hhZGVyKCkpLG49dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgidGV4dHVyZUZyYWdtZW50IixmYS5nZXRUZXh0dXJlRnJhZ21lbnRTaGFkZXIoKSksaT10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGF5b3V0OnQsdmVydGV4Onttb2R1bGU6cixlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOlt7YXJyYXlTdHJpZGU6MTYsYXR0cmlidXRlczpbe3NoYWRlckxvY2F0aW9uOjAsb2Zmc2V0OjAsZm9ybWF0OiJmbG9hdDMyeDIifSx7c2hhZGVyTG9jYXRpb246MSxvZmZzZXQ6OCxmb3JtYXQ6ImZsb2F0MzJ4MiJ9XX1dfSxmcmFnbWVudDp7bW9kdWxlOm4sZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDp0aGlzLmZvcm1hdCxibGVuZDp7Y29sb3I6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn0sYWxwaGE6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn19fV19LHByaW1pdGl2ZTp7dG9wb2xvZ3k6InRyaWFuZ2xlLWxpc3QiLGN1bGxNb2RlOiJub25lIn19KTt0aGlzLnBpcGVsaW5lcy5zZXQoInRleHR1cmUiLGkpfWNyZWF0ZUluc3RhbmNlZFBpcGVsaW5lKCl7Y29uc3QgZT10aGlzLmRldmljZS5jcmVhdGVCaW5kR3JvdXBMYXlvdXQoe2VudHJpZXM6W3tiaW5kaW5nOjAsdmlzaWJpbGl0eTpHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCxzYW1wbGVyOnt9fSx7YmluZGluZzoxLHZpc2liaWxpdHk6R1BVU2hhZGVyU3RhZ2UuRlJBR01FTlQsdGV4dHVyZTp7fX1dfSk7dGhpcy5iaW5kR3JvdXBMYXlvdXRzLnNldCgiaW5zdGFuY2VkIixlKTtjb25zdCB0PXRoaXMuZGV2aWNlLmNyZWF0ZVBpcGVsaW5lTGF5b3V0KHtiaW5kR3JvdXBMYXlvdXRzOltlXX0pLHI9dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgiaW5zdGFuY2VkVmVydGV4IixmYS5nZXRJbnN0YW5jZWRWZXJ0ZXhTaGFkZXIoKSksbj10aGlzLmdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKCJpbnN0YW5jZWRGcmFnbWVudCIsZmEuZ2V0SW5zdGFuY2VkRnJhZ21lbnRTaGFkZXIoKSksaT17YXJyYXlTdHJpZGU6OTYsc3RlcE1vZGU6Imluc3RhbmNlIixhdHRyaWJ1dGVzOlt7c2hhZGVyTG9jYXRpb246MixvZmZzZXQ6MCxmb3JtYXQ6ImZsb2F0MzJ4NCJ9LHtzaGFkZXJMb2NhdGlvbjozLG9mZnNldDoxNixmb3JtYXQ6ImZsb2F0MzJ4NCJ9LHtzaGFkZXJMb2NhdGlvbjo0LG9mZnNldDozMixmb3JtYXQ6ImZsb2F0MzJ4NCJ9LHtzaGFkZXJMb2NhdGlvbjo1LG9mZnNldDo0OCxmb3JtYXQ6ImZsb2F0MzJ4NCJ9LHtzaGFkZXJMb2NhdGlvbjo2LG9mZnNldDo2NCxmb3JtYXQ6ImZsb2F0MzJ4NCJ9LHtzaGFkZXJMb2NhdGlvbjo3LG9mZnNldDo4MCxmb3JtYXQ6ImZsb2F0MzJ4NCJ9XX0sYT10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGF5b3V0OnQsdmVydGV4Onttb2R1bGU6cixlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOlt7YXJyYXlTdHJpZGU6MTYsc3RlcE1vZGU6InZlcnRleCIsYXR0cmlidXRlczpbe3NoYWRlckxvY2F0aW9uOjAsb2Zmc2V0OjAsZm9ybWF0OiJmbG9hdDMyeDIifSx7c2hhZGVyTG9jYXRpb246MSxvZmZzZXQ6OCxmb3JtYXQ6ImZsb2F0MzJ4MiJ9XX0saV19LGZyYWdtZW50Onttb2R1bGU6bixlbnRyeVBvaW50OiJtYWluIix0YXJnZXRzOlt7Zm9ybWF0OnRoaXMuZm9ybWF0LGJsZW5kOntjb2xvcjp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3Rvcjoib25lLW1pbnVzLXNyYy1hbHBoYSIsb3BlcmF0aW9uOiJhZGQifSxhbHBoYTp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3Rvcjoib25lLW1pbnVzLXNyYy1hbHBoYSIsb3BlcmF0aW9uOiJhZGQifX19XX0scHJpbWl0aXZlOnt0b3BvbG9neToidHJpYW5nbGUtbGlzdCIsY3VsbE1vZGU6Im5vbmUifSxtdWx0aXNhbXBsZTp7Y291bnQ6dGhpcy5zYW1wbGVDb3VudH19KTt0aGlzLnBpcGVsaW5lcy5zZXQoImluc3RhbmNlZCIsYSk7Y29uc3Qgcz1be2FycmF5U3RyaWRlOjE2LHN0ZXBNb2RlOiJ2ZXJ0ZXgiLGF0dHJpYnV0ZXM6W3tzaGFkZXJMb2NhdGlvbjowLG9mZnNldDowLGZvcm1hdDoiZmxvYXQzMngyIn0se3NoYWRlckxvY2F0aW9uOjEsb2Zmc2V0OjgsZm9ybWF0OiJmbG9hdDMyeDIifV19LGldLG89W1siaW5zdGFuY2VkX2FkZCIse2NvbG9yOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJvbmUiLG9wZXJhdGlvbjoiYWRkIn0sYWxwaGE6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn19XSxbImluc3RhbmNlZF9zY3JlZW4iLHtjb2xvcjp7c3JjRmFjdG9yOiJvbmUtbWludXMtZHN0Iixkc3RGYWN0b3I6Im9uZSIsb3BlcmF0aW9uOiJhZGQifSxhbHBoYTp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3Rvcjoib25lLW1pbnVzLXNyYy1hbHBoYSIsb3BlcmF0aW9uOiJhZGQifX1dLFsiaW5zdGFuY2VkX2FscGhhIix7Y29sb3I6e3NyY0ZhY3RvcjoiemVybyIsZHN0RmFjdG9yOiJzcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn0sYWxwaGE6e3NyY0ZhY3RvcjoiemVybyIsZHN0RmFjdG9yOiJzcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn19XSxbImluc3RhbmNlZF9lcmFzZSIse2NvbG9yOntzcmNGYWN0b3I6Inplcm8iLGRzdEZhY3Rvcjoib25lLW1pbnVzLXNyYy1hbHBoYSIsb3BlcmF0aW9uOiJhZGQifSxhbHBoYTp7c3JjRmFjdG9yOiJ6ZXJvIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn19XSxbImluc3RhbmNlZF9jb3B5Iix7Y29sb3I6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Inplcm8iLG9wZXJhdGlvbjoiYWRkIn0sYWxwaGE6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Inplcm8iLG9wZXJhdGlvbjoiYWRkIn19XV07Zm9yKGNvbnN0W2UsaV1vZiBvKXtjb25zdCBhPXRoaXMuZGV2aWNlLmNyZWF0ZVJlbmRlclBpcGVsaW5lKHtsYXlvdXQ6dCx2ZXJ0ZXg6e21vZHVsZTpyLGVudHJ5UG9pbnQ6Im1haW4iLGJ1ZmZlcnM6c30sZnJhZ21lbnQ6e21vZHVsZTpuLGVudHJ5UG9pbnQ6Im1haW4iLHRhcmdldHM6W3tmb3JtYXQ6dGhpcy5mb3JtYXQsYmxlbmQ6aX1dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9LG11bHRpc2FtcGxlOntjb3VudDp0aGlzLnNhbXBsZUNvdW50fX0pO3RoaXMucGlwZWxpbmVzLnNldChlLGEpfWNvbnN0IGw9dGhpcy5kZXZpY2UuY3JlYXRlUmVuZGVyUGlwZWxpbmUoe2xheW91dDp0LHZlcnRleDp7bW9kdWxlOnIsZW50cnlQb2ludDoibWFpbiIsYnVmZmVyczpbe2FycmF5U3RyaWRlOjE2LHN0ZXBNb2RlOiJ2ZXJ0ZXgiLGF0dHJpYnV0ZXM6W3tzaGFkZXJMb2NhdGlvbjowLG9mZnNldDowLGZvcm1hdDoiZmxvYXQzMngyIn0se3NoYWRlckxvY2F0aW9uOjEsb2Zmc2V0OjgsZm9ybWF0OiJmbG9hdDMyeDIifV19LGldfSxmcmFnbWVudDp7bW9kdWxlOm4sZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDp0aGlzLmZvcm1hdCxibGVuZDp7Y29sb3I6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn0sYWxwaGE6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn19fV19LHByaW1pdGl2ZTp7dG9wb2xvZ3k6InRyaWFuZ2xlLWxpc3QiLGN1bGxNb2RlOiJub25lIn0sZGVwdGhTdGVuY2lsOntmb3JtYXQ6InN0ZW5jaWw4IixzdGVuY2lsRnJvbnQ6e2NvbXBhcmU6ImVxdWFsIixmYWlsT3A6ImtlZXAiLGRlcHRoRmFpbE9wOiJrZWVwIixwYXNzT3A6ImtlZXAifSxzdGVuY2lsQmFjazp7Y29tcGFyZToiZXF1YWwiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6ImtlZXAiLHBhc3NPcDoia2VlcCJ9LHN0ZW5jaWxSZWFkTWFzazoyNTUsc3RlbmNpbFdyaXRlTWFzazowfSxtdWx0aXNhbXBsZTp7Y291bnQ6dGhpcy5zYW1wbGVDb3VudH19KTt0aGlzLnBpcGVsaW5lcy5zZXQoImluc3RhbmNlZF9tYXNrZWQiLGwpfWNyZWF0ZUdyYWRpZW50UGlwZWxpbmUoKXtjb25zdCBlPXRoaXMuZGV2aWNlLmNyZWF0ZUJpbmRHcm91cExheW91dCh7ZW50cmllczpbe2JpbmRpbmc6MCx2aXNpYmlsaXR5OkdQVVNoYWRlclN0YWdlLlZFUlRFWHxHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCxidWZmZXI6e3R5cGU6InVuaWZvcm0ifX0se2JpbmRpbmc6MSx2aXNpYmlsaXR5OkdQVVNoYWRlclN0YWdlLkZSQUdNRU5ULHNhbXBsZXI6e319LHtiaW5kaW5nOjIsdmlzaWJpbGl0eTpHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCx0ZXh0dXJlOnt9fV19KTt0aGlzLmJpbmRHcm91cExheW91dHMuc2V0KCJncmFkaWVudF9maWxsIixlKTtjb25zdCB0PXRoaXMuZGV2aWNlLmNyZWF0ZVBpcGVsaW5lTGF5b3V0KHtiaW5kR3JvdXBMYXlvdXRzOltlXX0pO3RoaXMuZ3JhZGllbnRQaXBlbGluZUxheW91dD10O2NvbnN0IHI9dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgiZ3JhZGllbnRGaWxsVmVydGV4IixmYS5nZXRHcmFkaWVudEZpbGxWZXJ0ZXhTaGFkZXIoKSk7dGhpcy5ncmFkaWVudFZlcnRleFNoYWRlck1vZHVsZT1yO2NvbnN0IG49dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgiZ3JhZGllbnRGaWxsRnJhZ21lbnQiLGZhLmdldEdyYWRpZW50RmlsbEZyYWdtZW50U2hhZGVyKCkpO3RoaXMuZ3JhZGllbnRGcmFnbWVudFNoYWRlck1vZHVsZT1uO2NvbnN0IGk9dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgiZ3JhZGllbnRGaWxsU3RlbmNpbEZyYWdtZW50IixmYS5nZXRHcmFkaWVudEZpbGxTdGVuY2lsRnJhZ21lbnRTaGFkZXIoKSk7dGhpcy5ncmFkaWVudFN0ZW5jaWxGcmFnbWVudFNoYWRlck1vZHVsZT1pO2NvbnN0IGE9ZGEscz1oYSxvPXRoaXMuZGV2aWNlLmNyZWF0ZVJlbmRlclBpcGVsaW5lKHtsYWJlbDoiZ3JhZGllbnRfZmlsbF9ub19zdGVuY2lsX3BpcGVsaW5lIixsYXlvdXQ6dCx2ZXJ0ZXg6e21vZHVsZTpyLGVudHJ5UG9pbnQ6Im1haW4iLGJ1ZmZlcnM6W2FdfSxmcmFnbWVudDp7bW9kdWxlOm4sZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDoicmdiYTh1bm9ybSIsYmxlbmQ6c31dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9LG11bHRpc2FtcGxlOntjb3VudDp0aGlzLnNhbXBsZUNvdW50fX0pLGw9dGhpcy5kZXZpY2UuY3JlYXRlUmVuZGVyUGlwZWxpbmUoe2xheW91dDp0LHZlcnRleDp7bW9kdWxlOnIsZW50cnlQb2ludDoibWFpbiIsYnVmZmVyczpbYV0sY29uc3RhbnRzOnt5RmxpcFNpZ246LTF9fSxmcmFnbWVudDp7bW9kdWxlOm4sZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDp0aGlzLmZvcm1hdCxibGVuZDpzfV19LHByaW1pdGl2ZTp7dG9wb2xvZ3k6InRyaWFuZ2xlLWxpc3QiLGN1bGxNb2RlOiJub25lIn0sbXVsdGlzYW1wbGU6e2NvdW50OnRoaXMuc2FtcGxlQ291bnR9fSk7dGhpcy5waXBlbGluZXMuc2V0KCJncmFkaWVudF9maWxsIixvKSx0aGlzLnBpcGVsaW5lcy5zZXQoImdyYWRpZW50X2ZpbGxfbm9fc3RlbmNpbCIsbyksdGhpcy5waXBlbGluZXMuc2V0KCJncmFkaWVudF9maWxsX2JncmEiLGwpO2NvbnN0IGM9e2Zvcm1hdDoic3RlbmNpbDgiLHN0ZW5jaWxGcm9udDp7Y29tcGFyZToiYWx3YXlzIixmYWlsT3A6ImtlZXAiLGRlcHRoRmFpbE9wOiJrZWVwIixwYXNzT3A6ImtlZXAifSxzdGVuY2lsQmFjazp7Y29tcGFyZToiYWx3YXlzIixmYWlsT3A6ImtlZXAiLGRlcHRoRmFpbE9wOiJrZWVwIixwYXNzT3A6ImtlZXAifSxzdGVuY2lsUmVhZE1hc2s6MCxzdGVuY2lsV3JpdGVNYXNrOjB9LHU9dGhpcy5kZXZpY2UuY3JlYXRlUmVuZGVyUGlwZWxpbmUoe2xhYmVsOiJncmFkaWVudF9zdHJva2VfYXRsYXNfcGlwZWxpbmUiLGxheW91dDp0LHZlcnRleDp7bW9kdWxlOnIsZW50cnlQb2ludDoibWFpbiIsYnVmZmVyczpbYV19LGZyYWdtZW50Onttb2R1bGU6bixlbnRyeVBvaW50OiJtYWluIix0YXJnZXRzOlt7Zm9ybWF0OiJyZ2JhOHVub3JtIixibGVuZDpzfV19LHByaW1pdGl2ZTp7dG9wb2xvZ3k6InRyaWFuZ2xlLWxpc3QiLGN1bGxNb2RlOiJub25lIn0sZGVwdGhTdGVuY2lsOmMsbXVsdGlzYW1wbGU6e2NvdW50OnRoaXMuc2FtcGxlQ291bnR9fSk7dGhpcy5waXBlbGluZXMuc2V0KCJncmFkaWVudF9zdHJva2VfYXRsYXMiLHUpO2NvbnN0IGY9dGhpcy5kZXZpY2UuY3JlYXRlUmVuZGVyUGlwZWxpbmUoe2xhYmVsOiJncmFkaWVudF9zdHJva2VfYmdyYV9waXBlbGluZSIsbGF5b3V0OnQsdmVydGV4Onttb2R1bGU6cixlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOlthXSxjb25zdGFudHM6e3lGbGlwU2lnbjotMX19LGZyYWdtZW50Onttb2R1bGU6bixlbnRyeVBvaW50OiJtYWluIix0YXJnZXRzOlt7Zm9ybWF0OnRoaXMuZm9ybWF0LGJsZW5kOnN9XX0scHJpbWl0aXZlOnt0b3BvbG9neToidHJpYW5nbGUtbGlzdCIsY3VsbE1vZGU6Im5vbmUifSxkZXB0aFN0ZW5jaWw6YyxtdWx0aXNhbXBsZTp7Y291bnQ6dGhpcy5zYW1wbGVDb3VudH19KTt0aGlzLnBpcGVsaW5lcy5zZXQoImdyYWRpZW50X3N0cm9rZV9iZ3JhIixmKTtjb25zdCBkPXRoaXMuZGV2aWNlLmNyZWF0ZVJlbmRlclBpcGVsaW5lKHtsYXlvdXQ6dCx2ZXJ0ZXg6e21vZHVsZTpyLGVudHJ5UG9pbnQ6Im1haW4iLGJ1ZmZlcnM6W2FdLGNvbnN0YW50czp7eUZsaXBTaWduOi0xfX0sZnJhZ21lbnQ6e21vZHVsZTpuLGVudHJ5UG9pbnQ6Im1haW4iLHRhcmdldHM6W3tmb3JtYXQ6dGhpcy5mb3JtYXQsYmxlbmQ6c31dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9LG11bHRpc2FtcGxlOntjb3VudDoxfX0pO3RoaXMucGlwZWxpbmVzLnNldCgiZ3JhZGllbnRfZmlsbF9iZ3JhX25vX21zYWEiLGQpO2NvbnN0IGg9dGhpcy5kZXZpY2UuY3JlYXRlUmVuZGVyUGlwZWxpbmUoe2xheW91dDp0LHZlcnRleDp7bW9kdWxlOnIsZW50cnlQb2ludDoibWFpbiIsYnVmZmVyczpbYV19LGZyYWdtZW50Onttb2R1bGU6bixlbnRyeVBvaW50OiJtYWluIix0YXJnZXRzOlt7Zm9ybWF0OiJyZ2JhOHVub3JtIixibGVuZDpzfV19LHByaW1pdGl2ZTp7dG9wb2xvZ3k6InRyaWFuZ2xlLWxpc3QiLGN1bGxNb2RlOiJub25lIn0sZGVwdGhTdGVuY2lsOntmb3JtYXQ6InN0ZW5jaWw4IixzdGVuY2lsRnJvbnQ6e2NvbXBhcmU6Im5vdC1lcXVhbCIsZmFpbE9wOiJrZWVwIixkZXB0aEZhaWxPcDoiemVybyIscGFzc09wOiJ6ZXJvIn0sc3RlbmNpbEJhY2s6e2NvbXBhcmU6Im5vdC1lcXVhbCIsZmFpbE9wOiJrZWVwIixkZXB0aEZhaWxPcDoiemVybyIscGFzc09wOiJ6ZXJvIn0sc3RlbmNpbFJlYWRNYXNrOjI1NSxzdGVuY2lsV3JpdGVNYXNrOjI1NX0sbXVsdGlzYW1wbGU6e2NvdW50OnRoaXMuc2FtcGxlQ291bnR9fSk7dGhpcy5waXBlbGluZXMuc2V0KCJncmFkaWVudF9maWxsX3N0ZW5jaWwiLGgpO2NvbnN0IHA9dGhpcy5kZXZpY2UuY3JlYXRlUmVuZGVyUGlwZWxpbmUoe2xheW91dDp0LHZlcnRleDp7bW9kdWxlOnIsZW50cnlQb2ludDoibWFpbiIsYnVmZmVyczpbYV19LGZyYWdtZW50Onttb2R1bGU6aSxlbnRyeVBvaW50OiJtYWluIix0YXJnZXRzOlt7Zm9ybWF0OiJyZ2JhOHVub3JtIixibGVuZDpzfV19LHByaW1pdGl2ZTp7dG9wb2xvZ3k6InRyaWFuZ2xlLWxpc3QiLGN1bGxNb2RlOiJub25lIn0sZGVwdGhTdGVuY2lsOntmb3JtYXQ6InN0ZW5jaWw4IixzdGVuY2lsRnJvbnQ6e2NvbXBhcmU6Im5vdC1lcXVhbCIsZmFpbE9wOiJrZWVwIixkZXB0aEZhaWxPcDoiemVybyIscGFzc09wOiJ6ZXJvIn0sc3RlbmNpbEJhY2s6e2NvbXBhcmU6Im5vdC1lcXVhbCIsZmFpbE9wOiJrZWVwIixkZXB0aEZhaWxPcDoiemVybyIscGFzc09wOiJ6ZXJvIn0sc3RlbmNpbFJlYWRNYXNrOjI1NSxzdGVuY2lsV3JpdGVNYXNrOjI1NX0sbXVsdGlzYW1wbGU6e2NvdW50OnRoaXMuc2FtcGxlQ291bnR9fSk7dGhpcy5waXBlbGluZXMuc2V0KCJncmFkaWVudF9maWxsX3N0ZW5jaWxfYXRsYXMiLHApO2NvbnN0IG09dGhpcy5kZXZpY2UuY3JlYXRlUmVuZGVyUGlwZWxpbmUoe2xheW91dDp0LHZlcnRleDp7bW9kdWxlOnIsZW50cnlQb2ludDoibWFpbiIsYnVmZmVyczpbYV0sY29uc3RhbnRzOnt5RmxpcFNpZ246LTF9fSxmcmFnbWVudDp7bW9kdWxlOmksZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDp0aGlzLmZvcm1hdCxibGVuZDpzfV19LHByaW1pdGl2ZTp7dG9wb2xvZ3k6InRyaWFuZ2xlLWxpc3QiLGN1bGxNb2RlOiJub25lIn0sZGVwdGhTdGVuY2lsOntmb3JtYXQ6InN0ZW5jaWw4IixzdGVuY2lsRnJvbnQ6e2NvbXBhcmU6Im5vdC1lcXVhbCIsZmFpbE9wOiJrZWVwIixkZXB0aEZhaWxPcDoiemVybyIscGFzc09wOiJ6ZXJvIn0sc3RlbmNpbEJhY2s6e2NvbXBhcmU6Im5vdC1lcXVhbCIsZmFpbE9wOiJrZWVwIixkZXB0aEZhaWxPcDoiemVybyIscGFzc09wOiJ6ZXJvIn0sc3RlbmNpbFJlYWRNYXNrOjI1NSxzdGVuY2lsV3JpdGVNYXNrOjI1NX0sbXVsdGlzYW1wbGU6e2NvdW50OjF9fSk7dGhpcy5waXBlbGluZXMuc2V0KCJncmFkaWVudF9maWxsX3N0ZW5jaWxfbWFpbiIsbSk7Y29uc3QgZz10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGF5b3V0OnQsdmVydGV4Onttb2R1bGU6cixlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOlthXSxjb25zdGFudHM6e3lGbGlwU2lnbjotMX19LGZyYWdtZW50Onttb2R1bGU6bixlbnRyeVBvaW50OiJtYWluIix0YXJnZXRzOlt7Zm9ybWF0OnRoaXMuZm9ybWF0LGJsZW5kOnN9XX0scHJpbWl0aXZlOnt0b3BvbG9neToidHJpYW5nbGUtbGlzdCIsY3VsbE1vZGU6Im5vbmUifSxkZXB0aFN0ZW5jaWw6e2Zvcm1hdDoic3RlbmNpbDgiLHN0ZW5jaWxGcm9udDp7Y29tcGFyZToiZXF1YWwiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6ImtlZXAiLHBhc3NPcDoia2VlcCJ9LHN0ZW5jaWxCYWNrOntjb21wYXJlOiJlcXVhbCIsZmFpbE9wOiJrZWVwIixkZXB0aEZhaWxPcDoia2VlcCIscGFzc09wOiJrZWVwIn0sc3RlbmNpbFJlYWRNYXNrOjI1NSxzdGVuY2lsV3JpdGVNYXNrOjB9LG11bHRpc2FtcGxlOntjb3VudDp0aGlzLnNhbXBsZUNvdW50fX0pO3RoaXMucGlwZWxpbmVzLnNldCgiZ3JhZGllbnRfZmlsbF9iZ3JhX3N0ZW5jaWwiLGcpfWNyZWF0ZUJpdG1hcEZpbGxQaXBlbGluZSgpe2NvbnN0IGU9dGhpcy5kZXZpY2UuY3JlYXRlQmluZEdyb3VwTGF5b3V0KHtlbnRyaWVzOlt7YmluZGluZzowLHZpc2liaWxpdHk6R1BVU2hhZGVyU3RhZ2UuVkVSVEVYfEdQVVNoYWRlclN0YWdlLkZSQUdNRU5ULGJ1ZmZlcjp7dHlwZToidW5pZm9ybSJ9fSx7YmluZGluZzoxLHZpc2liaWxpdHk6R1BVU2hhZGVyU3RhZ2UuRlJBR01FTlQsc2FtcGxlcjp7fX0se2JpbmRpbmc6Mix2aXNpYmlsaXR5OkdQVVNoYWRlclN0YWdlLkZSQUdNRU5ULHRleHR1cmU6e319XX0pO3RoaXMuYmluZEdyb3VwTGF5b3V0cy5zZXQoImJpdG1hcF9maWxsIixlKTtjb25zdCB0PXRoaXMuZGV2aWNlLmNyZWF0ZVBpcGVsaW5lTGF5b3V0KHtiaW5kR3JvdXBMYXlvdXRzOltlXX0pLHI9dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgiYml0bWFwRmlsbFZlcnRleCIsZmEuZ2V0Qml0bWFwRmlsbFZlcnRleFNoYWRlcigpKSxuPXRoaXMuZ2V0T3JDcmVhdGVTaGFkZXJNb2R1bGUoImJpdG1hcEZpbGxGcmFnbWVudCIsZmEuZ2V0Qml0bWFwRmlsbEZyYWdtZW50U2hhZGVyKCkpLGk9ZGEsYT1oYSxzPXRoaXMuZGV2aWNlLmNyZWF0ZVJlbmRlclBpcGVsaW5lKHtsYXlvdXQ6dCx2ZXJ0ZXg6e21vZHVsZTpyLGVudHJ5UG9pbnQ6Im1haW4iLGJ1ZmZlcnM6W2ldfSxmcmFnbWVudDp7bW9kdWxlOm4sZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDoicmdiYTh1bm9ybSIsYmxlbmQ6YX1dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9LG11bHRpc2FtcGxlOntjb3VudDp0aGlzLnNhbXBsZUNvdW50fX0pLG89dGhpcy5kZXZpY2UuY3JlYXRlUmVuZGVyUGlwZWxpbmUoe2xheW91dDp0LHZlcnRleDp7bW9kdWxlOnIsZW50cnlQb2ludDoibWFpbiIsYnVmZmVyczpbaV0sY29uc3RhbnRzOnt5RmxpcFNpZ246LTF9fSxmcmFnbWVudDp7bW9kdWxlOm4sZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDp0aGlzLmZvcm1hdCxibGVuZDphfV19LHByaW1pdGl2ZTp7dG9wb2xvZ3k6InRyaWFuZ2xlLWxpc3QiLGN1bGxNb2RlOiJub25lIn19KTt0aGlzLnBpcGVsaW5lcy5zZXQoImJpdG1hcF9maWxsIixzKSx0aGlzLnBpcGVsaW5lcy5zZXQoImJpdG1hcF9maWxsX2JncmEiLG8pO2NvbnN0IGw9e2Zvcm1hdDoic3RlbmNpbDgiLHN0ZW5jaWxGcm9udDp7Y29tcGFyZToiYWx3YXlzIixmYWlsT3A6ImtlZXAiLGRlcHRoRmFpbE9wOiJrZWVwIixwYXNzT3A6ImtlZXAifSxzdGVuY2lsQmFjazp7Y29tcGFyZToiYWx3YXlzIixmYWlsT3A6ImtlZXAiLGRlcHRoRmFpbE9wOiJrZWVwIixwYXNzT3A6ImtlZXAifSxzdGVuY2lsUmVhZE1hc2s6MCxzdGVuY2lsV3JpdGVNYXNrOjB9LGM9dGhpcy5kZXZpY2UuY3JlYXRlUmVuZGVyUGlwZWxpbmUoe2xhYmVsOiJiaXRtYXBfc3Ryb2tlX2F0bGFzX3BpcGVsaW5lIixsYXlvdXQ6dCx2ZXJ0ZXg6e21vZHVsZTpyLGVudHJ5UG9pbnQ6Im1haW4iLGJ1ZmZlcnM6W2ldfSxmcmFnbWVudDp7bW9kdWxlOm4sZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDoicmdiYTh1bm9ybSIsYmxlbmQ6YX1dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9LGRlcHRoU3RlbmNpbDpsLG11bHRpc2FtcGxlOntjb3VudDp0aGlzLnNhbXBsZUNvdW50fX0pO3RoaXMucGlwZWxpbmVzLnNldCgiYml0bWFwX3N0cm9rZV9hdGxhcyIsYyk7Y29uc3QgdT10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGFiZWw6ImJpdG1hcF9zdHJva2VfYmdyYV9waXBlbGluZSIsbGF5b3V0OnQsdmVydGV4Onttb2R1bGU6cixlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOltpXSxjb25zdGFudHM6e3lGbGlwU2lnbjotMX19LGZyYWdtZW50Onttb2R1bGU6bixlbnRyeVBvaW50OiJtYWluIix0YXJnZXRzOlt7Zm9ybWF0OnRoaXMuZm9ybWF0LGJsZW5kOmF9XX0scHJpbWl0aXZlOnt0b3BvbG9neToidHJpYW5nbGUtbGlzdCIsY3VsbE1vZGU6Im5vbmUifSxkZXB0aFN0ZW5jaWw6bCxtdWx0aXNhbXBsZTp7Y291bnQ6dGhpcy5zYW1wbGVDb3VudH19KTt0aGlzLnBpcGVsaW5lcy5zZXQoImJpdG1hcF9zdHJva2VfYmdyYSIsdSk7Y29uc3QgZj10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGF5b3V0OnQsdmVydGV4Onttb2R1bGU6cixlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOltpXX0sZnJhZ21lbnQ6e21vZHVsZTpuLGVudHJ5UG9pbnQ6Im1haW4iLHRhcmdldHM6W3tmb3JtYXQ6InJnYmE4dW5vcm0iLGJsZW5kOmF9XX0scHJpbWl0aXZlOnt0b3BvbG9neToidHJpYW5nbGUtbGlzdCIsY3VsbE1vZGU6Im5vbmUifSxkZXB0aFN0ZW5jaWw6e2Zvcm1hdDoic3RlbmNpbDgiLHN0ZW5jaWxGcm9udDp7Y29tcGFyZToibm90LWVxdWFsIixmYWlsT3A6ImtlZXAiLGRlcHRoRmFpbE9wOiJ6ZXJvIixwYXNzT3A6Inplcm8ifSxzdGVuY2lsQmFjazp7Y29tcGFyZToibm90LWVxdWFsIixmYWlsT3A6ImtlZXAiLGRlcHRoRmFpbE9wOiJ6ZXJvIixwYXNzT3A6Inplcm8ifSxzdGVuY2lsUmVhZE1hc2s6MjU1LHN0ZW5jaWxXcml0ZU1hc2s6MjU1fSxtdWx0aXNhbXBsZTp7Y291bnQ6dGhpcy5zYW1wbGVDb3VudH19KTt0aGlzLnBpcGVsaW5lcy5zZXQoImJpdG1hcF9maWxsX3N0ZW5jaWwiLGYpO2NvbnN0IGQ9dGhpcy5kZXZpY2UuY3JlYXRlUmVuZGVyUGlwZWxpbmUoe2xheW91dDp0LHZlcnRleDp7bW9kdWxlOnIsZW50cnlQb2ludDoibWFpbiIsYnVmZmVyczpbaV0sY29uc3RhbnRzOnt5RmxpcFNpZ246LTF9fSxmcmFnbWVudDp7bW9kdWxlOm4sZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDp0aGlzLmZvcm1hdCxibGVuZDphfV19LHByaW1pdGl2ZTp7dG9wb2xvZ3k6InRyaWFuZ2xlLWxpc3QiLGN1bGxNb2RlOiJub25lIn0sZGVwdGhTdGVuY2lsOntmb3JtYXQ6InN0ZW5jaWw4IixzdGVuY2lsRnJvbnQ6e2NvbXBhcmU6ImVxdWFsIixmYWlsT3A6ImtlZXAiLGRlcHRoRmFpbE9wOiJrZWVwIixwYXNzT3A6ImtlZXAifSxzdGVuY2lsQmFjazp7Y29tcGFyZToiZXF1YWwiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6ImtlZXAiLHBhc3NPcDoia2VlcCJ9LHN0ZW5jaWxSZWFkTWFzazoyNTUsc3RlbmNpbFdyaXRlTWFzazowfX0pO3RoaXMucGlwZWxpbmVzLnNldCgiYml0bWFwX2ZpbGxfYmdyYV9zdGVuY2lsIixkKX1jcmVhdGVCbGVuZFBpcGVsaW5lKCl7Y29uc3QgZT10aGlzLmRldmljZS5jcmVhdGVCaW5kR3JvdXBMYXlvdXQoe2VudHJpZXM6W3tiaW5kaW5nOjAsdmlzaWJpbGl0eTpHUFVTaGFkZXJTdGFnZS5WRVJURVh8R1BVU2hhZGVyU3RhZ2UuRlJBR01FTlQsYnVmZmVyOnt0eXBlOiJ1bmlmb3JtIn19LHtiaW5kaW5nOjEsdmlzaWJpbGl0eTpHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCxidWZmZXI6e3R5cGU6InVuaWZvcm0ifX0se2JpbmRpbmc6Mix2aXNpYmlsaXR5OkdQVVNoYWRlclN0YWdlLkZSQUdNRU5ULHNhbXBsZXI6e319LHtiaW5kaW5nOjMsdmlzaWJpbGl0eTpHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCx0ZXh0dXJlOnt9fSx7YmluZGluZzo0LHZpc2liaWxpdHk6R1BVU2hhZGVyU3RhZ2UuRlJBR01FTlQsc2FtcGxlcjp7fX0se2JpbmRpbmc6NSx2aXNpYmlsaXR5OkdQVVNoYWRlclN0YWdlLkZSQUdNRU5ULHRleHR1cmU6e319XX0pO3RoaXMuYmluZEdyb3VwTGF5b3V0cy5zZXQoImJsZW5kIixlKTtjb25zdCB0PXRoaXMuZGV2aWNlLmNyZWF0ZVBpcGVsaW5lTGF5b3V0KHtiaW5kR3JvdXBMYXlvdXRzOltlXX0pLHI9dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgiYmFzaWNWZXJ0ZXgiLGZhLmdldEJhc2ljVmVydGV4U2hhZGVyKCkpLG49dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgiYmxlbmRGcmFnbWVudCIsZmEuZ2V0QmxlbmRGcmFnbWVudFNoYWRlcigpKSxpPXRoaXMuZGV2aWNlLmNyZWF0ZVJlbmRlclBpcGVsaW5lKHtsYXlvdXQ6dCx2ZXJ0ZXg6e21vZHVsZTpyLGVudHJ5UG9pbnQ6Im1haW4iLGJ1ZmZlcnM6W3thcnJheVN0cmlkZToxNixhdHRyaWJ1dGVzOlt7c2hhZGVyTG9jYXRpb246MCxvZmZzZXQ6MCxmb3JtYXQ6ImZsb2F0MzJ4MiJ9LHtzaGFkZXJMb2NhdGlvbjoxLG9mZnNldDo4LGZvcm1hdDoiZmxvYXQzMngyIn1dfV19LGZyYWdtZW50Onttb2R1bGU6bixlbnRyeVBvaW50OiJtYWluIix0YXJnZXRzOlt7Zm9ybWF0OnRoaXMuZm9ybWF0LGJsZW5kOntjb2xvcjp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3Rvcjoib25lLW1pbnVzLXNyYy1hbHBoYSIsb3BlcmF0aW9uOiJhZGQifSxhbHBoYTp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3Rvcjoib25lLW1pbnVzLXNyYy1hbHBoYSIsb3BlcmF0aW9uOiJhZGQifX19XX0scHJpbWl0aXZlOnt0b3BvbG9neToidHJpYW5nbGUtbGlzdCIsY3VsbE1vZGU6Im5vbmUifX0pO3RoaXMucGlwZWxpbmVzLnNldCgiYmxlbmQiLGkpfWNyZWF0ZUJsdXJGaWx0ZXJQaXBlbGluZSgpe2NvbnN0IGU9dGhpcy5kZXZpY2UuY3JlYXRlQmluZEdyb3VwTGF5b3V0KHtlbnRyaWVzOlt7YmluZGluZzowLHZpc2liaWxpdHk6R1BVU2hhZGVyU3RhZ2UuRlJBR01FTlQsYnVmZmVyOnt0eXBlOiJ1bmlmb3JtIn19LHtiaW5kaW5nOjEsdmlzaWJpbGl0eTpHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCxzYW1wbGVyOnt9fSx7YmluZGluZzoyLHZpc2liaWxpdHk6R1BVU2hhZGVyU3RhZ2UuRlJBR01FTlQsdGV4dHVyZTp7fX1dfSk7dGhpcy5iaW5kR3JvdXBMYXlvdXRzLnNldCgiYmx1cl9maWx0ZXIiLGUpO2NvbnN0IHQ9dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgiYmx1ckZpbHRlclZlcnRleCIsZmEuZ2V0Qmx1ckZpbHRlclZlcnRleFNoYWRlcigpKSxyPXRoaXMuZGV2aWNlLmNyZWF0ZVBpcGVsaW5lTGF5b3V0KHtiaW5kR3JvdXBMYXlvdXRzOltlXX0pO2ZvcihsZXQgZT0xO2U8PTE2O2UrKyl7Y29uc3Qgbj10aGlzLmdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKGBibHVyRmlsdGVyRnJhZ21lbnRfJHtlfWAsZmEuZ2V0Qmx1ckZpbHRlckZyYWdtZW50U2hhZGVyKGUpKSxpPXRoaXMuZGV2aWNlLmNyZWF0ZVJlbmRlclBpcGVsaW5lKHtsYXlvdXQ6cix2ZXJ0ZXg6e21vZHVsZTp0LGVudHJ5UG9pbnQ6Im1haW4iLGJ1ZmZlcnM6W119LGZyYWdtZW50Onttb2R1bGU6bixlbnRyeVBvaW50OiJtYWluIix0YXJnZXRzOlt7Zm9ybWF0OiJyZ2JhOHVub3JtIixibGVuZDp7Y29sb3I6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Inplcm8iLG9wZXJhdGlvbjoiYWRkIn0sYWxwaGE6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Inplcm8iLG9wZXJhdGlvbjoiYWRkIn19fV19LHByaW1pdGl2ZTp7dG9wb2xvZ3k6InRyaWFuZ2xlLWxpc3QiLGN1bGxNb2RlOiJub25lIn19KTt0aGlzLnBpcGVsaW5lcy5zZXQoYGJsdXJfZmlsdGVyXyR7ZX1gLGkpfX1jcmVhdGVUZXh0dXJlQ29weVBpcGVsaW5lKCl7Y29uc3QgZT10aGlzLmRldmljZS5jcmVhdGVCaW5kR3JvdXBMYXlvdXQoe2VudHJpZXM6W3tiaW5kaW5nOjAsdmlzaWJpbGl0eTpHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCxidWZmZXI6e3R5cGU6InVuaWZvcm0ifX0se2JpbmRpbmc6MSx2aXNpYmlsaXR5OkdQVVNoYWRlclN0YWdlLkZSQUdNRU5ULHNhbXBsZXI6e319LHtiaW5kaW5nOjIsdmlzaWJpbGl0eTpHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCx0ZXh0dXJlOnt9fV19KTt0aGlzLmJpbmRHcm91cExheW91dHMuc2V0KCJ0ZXh0dXJlX2NvcHkiLGUpO2NvbnN0IHQ9dGhpcy5kZXZpY2UuY3JlYXRlUGlwZWxpbmVMYXlvdXQoe2JpbmRHcm91cExheW91dHM6W2VdfSkscj10aGlzLmdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKCJibHVyRmlsdGVyVmVydGV4IixmYS5nZXRCbHVyRmlsdGVyVmVydGV4U2hhZGVyKCkpLG49dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgidGV4dHVyZUNvcHlGcmFnbWVudCIsZmEuZ2V0VGV4dHVyZUNvcHlGcmFnbWVudFNoYWRlcigpKSxpPXtjb2xvcjp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3RvcjoiemVybyIsb3BlcmF0aW9uOiJhZGQifSxhbHBoYTp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3RvcjoiemVybyIsb3BlcmF0aW9uOiJhZGQifX0sYT17Y29sb3I6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn0sYWxwaGE6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn19O3RoaXMucGlwZWxpbmVzLnNldCgidGV4dHVyZV9jb3B5Iix0aGlzLmNyZWF0ZUZ1bGxzY3JlZW5RdWFkUGlwZWxpbmUodCxyLG4sdGhpcy5mb3JtYXQsaSkpLHRoaXMucGlwZWxpbmVzLnNldCgidGV4dHVyZV9jb3B5X3JnYmE4Iix0aGlzLmNyZWF0ZUZ1bGxzY3JlZW5RdWFkUGlwZWxpbmUodCxyLG4sInJnYmE4dW5vcm0iLGkpKTtjb25zdCBzPXRoaXMuZ2V0T3JDcmVhdGVTaGFkZXJNb2R1bGUoImNvbG9yVHJhbnNmb3JtRnJhZ21lbnQiLGZhLmdldENvbG9yVHJhbnNmb3JtRnJhZ21lbnRTaGFkZXIoKSk7dGhpcy5waXBlbGluZXMuc2V0KCJjb2xvcl90cmFuc2Zvcm0iLHRoaXMuY3JlYXRlRnVsbHNjcmVlblF1YWRQaXBlbGluZSh0LHIscywicmdiYTh1bm9ybSIsaSkpO2NvbnN0IG89dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgieUZsaXBDb2xvclRyYW5zZm9ybUZyYWdtZW50IixmYS5nZXRZRmxpcENvbG9yVHJhbnNmb3JtRnJhZ21lbnRTaGFkZXIoKSk7dGhpcy5waXBlbGluZXMuc2V0KCJ5X2ZsaXBfY29sb3JfdHJhbnNmb3JtIix0aGlzLmNyZWF0ZUZ1bGxzY3JlZW5RdWFkUGlwZWxpbmUodCxyLG8sInJnYmE4dW5vcm0iLGkpKTtjb25zdCBsPXRoaXMuZ2V0T3JDcmVhdGVTaGFkZXJNb2R1bGUoImJsdXJUZXh0dXJlQ29weUZyYWdtZW50IixmYS5nZXRCbHVyVGV4dHVyZUNvcHlGcmFnbWVudFNoYWRlcigpKTt0aGlzLnBpcGVsaW5lcy5zZXQoInRleHR1cmVfZXJhc2UiLHRoaXMuY3JlYXRlRnVsbHNjcmVlblF1YWRQaXBlbGluZSh0LHIsbCwicmdiYTh1bm9ybSIse2NvbG9yOntzcmNGYWN0b3I6Inplcm8iLGRzdEZhY3Rvcjoib25lLW1pbnVzLXNyYy1hbHBoYSIsb3BlcmF0aW9uOiJhZGQifSxhbHBoYTp7c3JjRmFjdG9yOiJ6ZXJvIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn19KSksdGhpcy5waXBlbGluZXMuc2V0KCJibHVyX3RleHR1cmVfY29weSIsdGhpcy5jcmVhdGVGdWxsc2NyZWVuUXVhZFBpcGVsaW5lKHQscixsLCJyZ2JhOHVub3JtIixpKSksdGhpcy5waXBlbGluZXMuc2V0KCJmaWx0ZXJfYmxlbmQiLHRoaXMuY3JlYXRlRnVsbHNjcmVlblF1YWRQaXBlbGluZSh0LHIsbix0aGlzLmZvcm1hdCxhKSksdGhpcy5waXBlbGluZXMuc2V0KCJ0ZXh0dXJlX2NvcHlfYmdyYSIsdGhpcy5jcmVhdGVGdWxsc2NyZWVuUXVhZFBpcGVsaW5lKHQscixuLHRoaXMuZm9ybWF0LGkpKTtjb25zdCBjPXRoaXMuZ2V0T3JDcmVhdGVTaGFkZXJNb2R1bGUoImZpbHRlck91dHB1dEZyYWdtZW50IixmYS5nZXRGaWx0ZXJPdXRwdXRGcmFnbWVudFNoYWRlcigpKTt0aGlzLnBpcGVsaW5lcy5zZXQoImZpbHRlcl9vdXRwdXQiLHRoaXMuY3JlYXRlRnVsbHNjcmVlblF1YWRQaXBlbGluZSh0LHIsYyx0aGlzLmZvcm1hdCxhKSk7Y29uc3QgdT1bWyJmaWx0ZXJfb3V0cHV0X2FkZCIse2NvbG9yOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJvbmUiLG9wZXJhdGlvbjoiYWRkIn0sYWxwaGE6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Im9uZSIsb3BlcmF0aW9uOiJhZGQifX1dLFsiZmlsdGVyX291dHB1dF9zY3JlZW4iLHtjb2xvcjp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3Rvcjoib25lLW1pbnVzLXNyYyIsb3BlcmF0aW9uOiJhZGQifSxhbHBoYTp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3Rvcjoib25lLW1pbnVzLXNyYy1hbHBoYSIsb3BlcmF0aW9uOiJhZGQifX1dLFsiZmlsdGVyX291dHB1dF9hbHBoYSIse2NvbG9yOntzcmNGYWN0b3I6Inplcm8iLGRzdEZhY3Rvcjoic3JjLWFscGhhIixvcGVyYXRpb246ImFkZCJ9LGFscGhhOntzcmNGYWN0b3I6Inplcm8iLGRzdEZhY3Rvcjoic3JjLWFscGhhIixvcGVyYXRpb246ImFkZCJ9fV0sWyJmaWx0ZXJfb3V0cHV0X2VyYXNlIix7Y29sb3I6e3NyY0ZhY3RvcjoiemVybyIsZHN0RmFjdG9yOiJvbmUtbWludXMtc3JjLWFscGhhIixvcGVyYXRpb246ImFkZCJ9LGFscGhhOntzcmNGYWN0b3I6Inplcm8iLGRzdEZhY3Rvcjoib25lLW1pbnVzLXNyYy1hbHBoYSIsb3BlcmF0aW9uOiJhZGQifX1dXTtmb3IoY29uc3RbZSxuXW9mIHUpdGhpcy5waXBlbGluZXMuc2V0KGUsdGhpcy5jcmVhdGVGdWxsc2NyZWVuUXVhZFBpcGVsaW5lKHQscixjLHRoaXMuZm9ybWF0LG4pKTtpZih0aGlzLnNhbXBsZUNvdW50PjEpe2NvbnN0IGU9e2NvbG9yOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJ6ZXJvIixvcGVyYXRpb246ImFkZCJ9LGFscGhhOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJ6ZXJvIixvcGVyYXRpb246ImFkZCJ9fTt0aGlzLnBpcGVsaW5lcy5zZXQoInRleHR1cmVfY29weV9iZ3JhX21zYWEiLHRoaXMuY3JlYXRlRnVsbHNjcmVlblF1YWRQaXBlbGluZSh0LHIsbix0aGlzLmZvcm1hdCxlLHRoaXMuc2FtcGxlQ291bnQpKTtjb25zdCBpPXtjb2xvcjp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3Rvcjoib25lLW1pbnVzLXNyYy1hbHBoYSIsb3BlcmF0aW9uOiJhZGQifSxhbHBoYTp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3Rvcjoib25lLW1pbnVzLXNyYy1hbHBoYSIsb3BlcmF0aW9uOiJhZGQifX07dGhpcy5waXBlbGluZXMuc2V0KCJmaWx0ZXJfb3V0cHV0X21zYWEiLHRoaXMuY3JlYXRlRnVsbHNjcmVlblF1YWRQaXBlbGluZSh0LHIsYyx0aGlzLmZvcm1hdCxpLHRoaXMuc2FtcGxlQ291bnQpKTtmb3IoY29uc3RbZSxuXW9mIHUpdGhpcy5waXBlbGluZXMuc2V0KGAke2V9X21zYWFgLHRoaXMuY3JlYXRlRnVsbHNjcmVlblF1YWRQaXBlbGluZSh0LHIsYyx0aGlzLmZvcm1hdCxuLHRoaXMuc2FtcGxlQ291bnQpKX10aGlzLmNyZWF0ZVBvc2l0aW9uZWRUZXh0dXJlUGlwZWxpbmUoKSx0aGlzLmNyZWF0ZVRleHR1cmVTY2FsZVBpcGVsaW5lKCl9Y3JlYXRlUG9zaXRpb25lZFRleHR1cmVQaXBlbGluZSgpe2NvbnN0IGU9dGhpcy5kZXZpY2UuY3JlYXRlQmluZEdyb3VwTGF5b3V0KHtlbnRyaWVzOlt7YmluZGluZzowLHZpc2liaWxpdHk6R1BVU2hhZGVyU3RhZ2UuVkVSVEVYLGJ1ZmZlcjp7dHlwZToidW5pZm9ybSJ9fSx7YmluZGluZzoxLHZpc2liaWxpdHk6R1BVU2hhZGVyU3RhZ2UuRlJBR01FTlQsc2FtcGxlcjp7fX0se2JpbmRpbmc6Mix2aXNpYmlsaXR5OkdQVVNoYWRlclN0YWdlLkZSQUdNRU5ULHRleHR1cmU6e319XX0pO3RoaXMuYmluZEdyb3VwTGF5b3V0cy5zZXQoInBvc2l0aW9uZWRfdGV4dHVyZSIsZSk7Y29uc3QgdD10aGlzLmRldmljZS5jcmVhdGVQaXBlbGluZUxheW91dCh7YmluZEdyb3VwTGF5b3V0czpbZV19KSxyPXRoaXMuZ2V0T3JDcmVhdGVTaGFkZXJNb2R1bGUoInBvc2l0aW9uZWRUZXh0dXJlVmVydGV4IixmYS5nZXRQb3NpdGlvbmVkVGV4dHVyZVZlcnRleFNoYWRlcigpKSxuPXRoaXMuZ2V0T3JDcmVhdGVTaGFkZXJNb2R1bGUoInBvc2l0aW9uZWRUZXh0dXJlRnJhZ21lbnQiLGZhLmdldFBvc2l0aW9uZWRUZXh0dXJlRnJhZ21lbnRTaGFkZXIoKSksaT10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGF5b3V0OnQsdmVydGV4Onttb2R1bGU6cixlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOltdfSxmcmFnbWVudDp7bW9kdWxlOm4sZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDp0aGlzLmZvcm1hdCxibGVuZDp7Y29sb3I6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn0sYWxwaGE6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn19fV19LHByaW1pdGl2ZTp7dG9wb2xvZ3k6InRyaWFuZ2xlLWxpc3QiLGN1bGxNb2RlOiJub25lIn19KTt0aGlzLnBpcGVsaW5lcy5zZXQoInBvc2l0aW9uZWRfdGV4dHVyZSIsaSk7Y29uc3QgYT10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGF5b3V0OnQsdmVydGV4Onttb2R1bGU6cixlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOltdfSxmcmFnbWVudDp7bW9kdWxlOm4sZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDoicmdiYTh1bm9ybSIsYmxlbmQ6e2NvbG9yOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJvbmUtbWludXMtc3JjLWFscGhhIixvcGVyYXRpb246ImFkZCJ9LGFscGhhOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJvbmUtbWludXMtc3JjLWFscGhhIixvcGVyYXRpb246ImFkZCJ9fX1dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9fSk7dGhpcy5waXBlbGluZXMuc2V0KCJwb3NpdGlvbmVkX3RleHR1cmVfcmdiYSIsYSk7Y29uc3Qgcz10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGF5b3V0OnQsdmVydGV4Onttb2R1bGU6cixlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOltdfSxmcmFnbWVudDp7bW9kdWxlOm4sZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDoicmdiYTh1bm9ybSIsYmxlbmQ6e2NvbG9yOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJ6ZXJvIixvcGVyYXRpb246ImFkZCJ9LGFscGhhOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJ6ZXJvIixvcGVyYXRpb246ImFkZCJ9fX1dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9LG11bHRpc2FtcGxlOntjb3VudDo0fSxkZXB0aFN0ZW5jaWw6e2Zvcm1hdDoic3RlbmNpbDgiLHN0ZW5jaWxGcm9udDp7Y29tcGFyZToiYWx3YXlzIixmYWlsT3A6ImtlZXAiLGRlcHRoRmFpbE9wOiJrZWVwIixwYXNzT3A6ImtlZXAifSxzdGVuY2lsQmFjazp7Y29tcGFyZToiYWx3YXlzIixmYWlsT3A6ImtlZXAiLGRlcHRoRmFpbE9wOiJrZWVwIixwYXNzT3A6ImtlZXAifX19KTt0aGlzLnBpcGVsaW5lcy5zZXQoImJpdG1hcF9yZW5kZXJfbXNhYSIscyk7Y29uc3Qgbz10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGF5b3V0OnQsdmVydGV4Onttb2R1bGU6cixlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOltdfSxmcmFnbWVudDp7bW9kdWxlOm4sZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDoicmdiYTh1bm9ybSIsYmxlbmQ6e2NvbG9yOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJ6ZXJvIixvcGVyYXRpb246ImFkZCJ9LGFscGhhOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJ6ZXJvIixvcGVyYXRpb246ImFkZCJ9fX1dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9LGRlcHRoU3RlbmNpbDp7Zm9ybWF0OiJzdGVuY2lsOCIsc3RlbmNpbEZyb250Ontjb21wYXJlOiJhbHdheXMiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6ImtlZXAiLHBhc3NPcDoia2VlcCJ9LHN0ZW5jaWxCYWNrOntjb21wYXJlOiJhbHdheXMiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6ImtlZXAiLHBhc3NPcDoia2VlcCJ9fX0pO3RoaXMucGlwZWxpbmVzLnNldCgiYml0bWFwX3JlbmRlciIsbyl9Y3JlYXRlVGV4dHVyZVNjYWxlUGlwZWxpbmUoKXtjb25zdCBlPXRoaXMuZGV2aWNlLmNyZWF0ZUJpbmRHcm91cExheW91dCh7ZW50cmllczpbe2JpbmRpbmc6MCx2aXNpYmlsaXR5OkdQVVNoYWRlclN0YWdlLlZFUlRFWCxidWZmZXI6e3R5cGU6InVuaWZvcm0ifX0se2JpbmRpbmc6MSx2aXNpYmlsaXR5OkdQVVNoYWRlclN0YWdlLkZSQUdNRU5ULHNhbXBsZXI6e319LHtiaW5kaW5nOjIsdmlzaWJpbGl0eTpHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCx0ZXh0dXJlOnt9fV19KTt0aGlzLmJpbmRHcm91cExheW91dHMuc2V0KCJ0ZXh0dXJlX3NjYWxlIixlKTtjb25zdCB0PXRoaXMuZGV2aWNlLmNyZWF0ZVBpcGVsaW5lTGF5b3V0KHtiaW5kR3JvdXBMYXlvdXRzOltlXX0pLHI9dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgidGV4dHVyZVNjYWxlVmVydGV4IixmYS5nZXRUZXh0dXJlU2NhbGVWZXJ0ZXhTaGFkZXIoKSksbj10aGlzLmdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKCJwb3NpdGlvbmVkVGV4dHVyZUZyYWdtZW50IixmYS5nZXRQb3NpdGlvbmVkVGV4dHVyZUZyYWdtZW50U2hhZGVyKCkpLGk9dGhpcy5kZXZpY2UuY3JlYXRlUmVuZGVyUGlwZWxpbmUoe2xheW91dDp0LHZlcnRleDp7bW9kdWxlOnIsZW50cnlQb2ludDoibWFpbiIsYnVmZmVyczpbXX0sZnJhZ21lbnQ6e21vZHVsZTpuLGVudHJ5UG9pbnQ6Im1haW4iLHRhcmdldHM6W3tmb3JtYXQ6InJnYmE4dW5vcm0iLGJsZW5kOntjb2xvcjp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3RvcjoiemVybyIsb3BlcmF0aW9uOiJhZGQifSxhbHBoYTp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3RvcjoiemVybyIsb3BlcmF0aW9uOiJhZGQifX19XX0scHJpbWl0aXZlOnt0b3BvbG9neToidHJpYW5nbGUtbGlzdCIsY3VsbE1vZGU6Im5vbmUifX0pO3RoaXMucGlwZWxpbmVzLnNldCgidGV4dHVyZV9zY2FsZSIsaSk7Y29uc3QgYT10aGlzLmdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKCJ0ZXh0dXJlU2NhbGVCbGVuZFZlcnRleCIsZmEuZ2V0VGV4dHVyZVNjYWxlQmxlbmRWZXJ0ZXhTaGFkZXIoKSkscz10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGF5b3V0OnQsdmVydGV4Onttb2R1bGU6YSxlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOltdfSxmcmFnbWVudDp7bW9kdWxlOm4sZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDoicmdiYTh1bm9ybSIsYmxlbmQ6e2NvbG9yOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJ6ZXJvIixvcGVyYXRpb246ImFkZCJ9LGFscGhhOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJ6ZXJvIixvcGVyYXRpb246ImFkZCJ9fX1dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9fSk7dGhpcy5waXBlbGluZXMuc2V0KCJ0ZXh0dXJlX3NjYWxlX2JsZW5kIixzKX1jcmVhdGVCaXRtYXBTeW5jUGlwZWxpbmUoKXtjb25zdCBlPXRoaXMuZGV2aWNlLmNyZWF0ZUJpbmRHcm91cExheW91dCh7ZW50cmllczpbe2JpbmRpbmc6MCx2aXNpYmlsaXR5OkdQVVNoYWRlclN0YWdlLlZFUlRFWCxidWZmZXI6e3R5cGU6InVuaWZvcm0ifX0se2JpbmRpbmc6MSx2aXNpYmlsaXR5OkdQVVNoYWRlclN0YWdlLkZSQUdNRU5ULHNhbXBsZXI6e3R5cGU6ImZpbHRlcmluZyJ9fSx7YmluZGluZzoyLHZpc2liaWxpdHk6R1BVU2hhZGVyU3RhZ2UuRlJBR01FTlQsdGV4dHVyZTp7c2FtcGxlVHlwZToiZmxvYXQifX1dfSk7dGhpcy5iaW5kR3JvdXBMYXlvdXRzLnNldCgiYml0bWFwX3N5bmMiLGUpO2NvbnN0IHQ9dGhpcy5kZXZpY2UuY3JlYXRlUGlwZWxpbmVMYXlvdXQoe2JpbmRHcm91cExheW91dHM6W2VdfSkscj10aGlzLmdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKCJiaXRtYXBTeW5jVmVydGV4IixmYS5nZXRCaXRtYXBTeW5jVmVydGV4U2hhZGVyKCkpLG49dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgiYml0bWFwU3luY0ZyYWdtZW50IixmYS5nZXRCaXRtYXBTeW5jRnJhZ21lbnRTaGFkZXIoKSksaT10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGF5b3V0OnQsdmVydGV4Onttb2R1bGU6cixlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOltdfSxmcmFnbWVudDp7bW9kdWxlOm4sZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDoicmdiYTh1bm9ybSIsYmxlbmQ6e2NvbG9yOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJ6ZXJvIixvcGVyYXRpb246ImFkZCJ9LGFscGhhOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJ6ZXJvIixvcGVyYXRpb246ImFkZCJ9fX1dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9LG11bHRpc2FtcGxlOntjb3VudDo0fX0pO3RoaXMucGlwZWxpbmVzLnNldCgiYml0bWFwX3N5bmMiLGkpfWNyZWF0ZUNvbG9yTWF0cml4RmlsdGVyUGlwZWxpbmUoKXtjb25zdCBlPXtjb2xvcjp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3RvcjoiemVybyIsb3BlcmF0aW9uOiJhZGQifSxhbHBoYTp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3RvcjoiemVybyIsb3BlcmF0aW9uOiJhZGQifX0sdD17Y29sb3I6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn0sYWxwaGE6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn19O3RoaXMuY3JlYXRlRmlsdGVyUGlwZWxpbmVXaXRoTGF5b3V0KCJjb2xvcl9tYXRyaXhfZmlsdGVyIixmYS5nZXRDb2xvck1hdHJpeEZpbHRlckZyYWdtZW50U2hhZGVyKCksMSxlKSx0aGlzLmNyZWF0ZUZpbHRlclBpcGVsaW5lV2l0aExheW91dCgiYmV2ZWxfYmFzZSIsZmEuZ2V0QmV2ZWxCYXNlRnJhZ21lbnRTaGFkZXIoKSwxLGUpLHRoaXMuY3JlYXRlRmlsdGVyUGlwZWxpbmVXaXRoTGF5b3V0KCJnbG93X2ZpbHRlciIsZmEuZ2V0R2xvd0ZpbHRlckZyYWdtZW50U2hhZGVyKCksMix0KSx0aGlzLmNyZWF0ZUZpbHRlclBpcGVsaW5lV2l0aExheW91dCgiZHJvcF9zaGFkb3dfZmlsdGVyIixmYS5nZXREcm9wU2hhZG93RmlsdGVyRnJhZ21lbnRTaGFkZXIoKSwyLHQpLHRoaXMuY3JlYXRlRmlsdGVyUGlwZWxpbmVXaXRoTGF5b3V0KCJiZXZlbF9maWx0ZXIiLGZhLmdldEJldmVsRmlsdGVyRnJhZ21lbnRTaGFkZXIoKSwyLHQpLHRoaXMuY3JlYXRlRmlsdGVyUGlwZWxpbmVXaXRoTGF5b3V0KCJncmFkaWVudF9nbG93X2ZpbHRlciIsZmEuZ2V0R3JhZGllbnRHbG93RmlsdGVyRnJhZ21lbnRTaGFkZXIoKSwzLHQpLHRoaXMuY3JlYXRlRmlsdGVyUGlwZWxpbmVXaXRoTGF5b3V0KCJncmFkaWVudF9iZXZlbF9maWx0ZXIiLGZhLmdldEdyYWRpZW50QmV2ZWxGaWx0ZXJGcmFnbWVudFNoYWRlcigpLDMsdCl9Y3JlYXRlQ29tcGxleEJsZW5kUGlwZWxpbmVzKCl7Y29uc3QgZT10aGlzLmRldmljZS5jcmVhdGVCaW5kR3JvdXBMYXlvdXQoe2VudHJpZXM6W3tiaW5kaW5nOjAsdmlzaWJpbGl0eTpHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCxidWZmZXI6e3R5cGU6InVuaWZvcm0ifX0se2JpbmRpbmc6MSx2aXNpYmlsaXR5OkdQVVNoYWRlclN0YWdlLkZSQUdNRU5ULHNhbXBsZXI6e319LHtiaW5kaW5nOjIsdmlzaWJpbGl0eTpHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCx0ZXh0dXJlOnt9fSx7YmluZGluZzozLHZpc2liaWxpdHk6R1BVU2hhZGVyU3RhZ2UuRlJBR01FTlQsdGV4dHVyZTp7fX1dfSk7dGhpcy5iaW5kR3JvdXBMYXlvdXRzLnNldCgiY29tcGxleF9ibGVuZCIsZSk7Y29uc3QgdD10aGlzLmRldmljZS5jcmVhdGVQaXBlbGluZUxheW91dCh7YmluZEdyb3VwTGF5b3V0czpbZV19KSxyPXRoaXMuZ2V0T3JDcmVhdGVTaGFkZXJNb2R1bGUoImNvbXBsZXhCbGVuZFZlcnRleCIsZmEuZ2V0Q29tcGxleEJsZW5kVmVydGV4U2hhZGVyKCkpLG49dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgidW5pZmllZENvbXBsZXhCbGVuZEZyYWdtZW50IixmYS5nZXRVbmlmaWVkQ29tcGxleEJsZW5kRnJhZ21lbnRTaGFkZXIoKSksaT10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGF5b3V0OnQsdmVydGV4Onttb2R1bGU6cixlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOltdfSxmcmFnbWVudDp7bW9kdWxlOm4sZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDoicmdiYTh1bm9ybSIsYmxlbmQ6e2NvbG9yOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJ6ZXJvIixvcGVyYXRpb246ImFkZCJ9LGFscGhhOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJ6ZXJvIixvcGVyYXRpb246ImFkZCJ9fX1dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9fSk7dGhpcy5waXBlbGluZXMuc2V0KCJjb21wbGV4X2JsZW5kIixpKSx0aGlzLmNyZWF0ZUNvbXBsZXhCbGVuZENvcHlQaXBlbGluZSgpLHRoaXMuY3JlYXRlQ29tcGxleEJsZW5kT3V0cHV0UGlwZWxpbmUoKX1jcmVhdGVDb21wbGV4QmxlbmRDb3B5UGlwZWxpbmUoKXtjb25zdCBlPXtjb2xvcjp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3RvcjoiemVybyIsb3BlcmF0aW9uOiJhZGQifSxhbHBoYTp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3RvcjoiemVybyIsb3BlcmF0aW9uOiJhZGQifX0sdD10aGlzLmJpbmRHcm91cExheW91dHMuZ2V0KCJ0ZXh0dXJlX2NvcHkiKTtpZih0KXtjb25zdCByPXRoaXMuZGV2aWNlLmNyZWF0ZVBpcGVsaW5lTGF5b3V0KHtiaW5kR3JvdXBMYXlvdXRzOlt0XX0pLG49dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgiY29tcGxleEJsZW5kQ29weVZlcnRleCIsZmEuZ2V0Q29tcGxleEJsZW5kQ29weVZlcnRleFNoYWRlcigpKSxpPXRoaXMuZ2V0T3JDcmVhdGVTaGFkZXJNb2R1bGUoInRleHR1cmVDb3B5RnJhZ21lbnQiLGZhLmdldFRleHR1cmVDb3B5RnJhZ21lbnRTaGFkZXIoKSk7dGhpcy5waXBlbGluZXMuc2V0KCJjb21wbGV4X2JsZW5kX2NvcHkiLHRoaXMuY3JlYXRlRnVsbHNjcmVlblF1YWRQaXBlbGluZShyLG4saSwicmdiYTh1bm9ybSIsZSkpfWNvbnN0IHI9dGhpcy5iaW5kR3JvdXBMYXlvdXRzLmdldCgidGV4dHVyZV9zY2FsZSIpO2lmKHIpe2NvbnN0IHQ9dGhpcy5kZXZpY2UuY3JlYXRlUGlwZWxpbmVMYXlvdXQoe2JpbmRHcm91cExheW91dHM6W3JdfSksbj10aGlzLmdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKCJjb21wbGV4QmxlbmRTY2FsZVZlcnRleCIsZmEuZ2V0Q29tcGxleEJsZW5kU2NhbGVWZXJ0ZXhTaGFkZXIoKSksaT10aGlzLmdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKCJwb3NpdGlvbmVkVGV4dHVyZUZyYWdtZW50IixmYS5nZXRQb3NpdGlvbmVkVGV4dHVyZUZyYWdtZW50U2hhZGVyKCkpO3RoaXMucGlwZWxpbmVzLnNldCgiY29tcGxleF9ibGVuZF9zY2FsZSIsdGhpcy5jcmVhdGVGdWxsc2NyZWVuUXVhZFBpcGVsaW5lKHQsbixpLCJyZ2JhOHVub3JtIixlKSl9fWNyZWF0ZUNvbXBsZXhCbGVuZE91dHB1dFBpcGVsaW5lKCl7Y29uc3QgZT10aGlzLmJpbmRHcm91cExheW91dHMuZ2V0KCJwb3NpdGlvbmVkX3RleHR1cmUiKTtpZighZSlyZXR1cm47Y29uc3QgdD10aGlzLmRldmljZS5jcmVhdGVQaXBlbGluZUxheW91dCh7YmluZEdyb3VwTGF5b3V0czpbZV19KSxyPXRoaXMuZ2V0T3JDcmVhdGVTaGFkZXJNb2R1bGUoInBvc2l0aW9uZWRUZXh0dXJlRnJhZ21lbnQiLGZhLmdldFBvc2l0aW9uZWRUZXh0dXJlRnJhZ21lbnRTaGFkZXIoKSksbj17Y29sb3I6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn0sYWxwaGE6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn19LGk9dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgiY29tcGxleEJsZW5kT3V0cHV0VmVydGV4IixmYS5nZXRDb21wbGV4QmxlbmRPdXRwdXRWZXJ0ZXhTaGFkZXIoKSk7dGhpcy5waXBlbGluZXMuc2V0KCJjb21wbGV4X2JsZW5kX291dHB1dCIsdGhpcy5jcmVhdGVGdWxsc2NyZWVuUXVhZFBpcGVsaW5lKHQsaSxyLHRoaXMuZm9ybWF0LG4pKSx0aGlzLnNhbXBsZUNvdW50PjEmJnRoaXMucGlwZWxpbmVzLnNldCgiY29tcGxleF9ibGVuZF9vdXRwdXRfbXNhYSIsdGhpcy5jcmVhdGVGdWxsc2NyZWVuUXVhZFBpcGVsaW5lKHQsaSxyLHRoaXMuZm9ybWF0LG4sdGhpcy5zYW1wbGVDb3VudCkpO2NvbnN0IGE9dGhpcy5nZXRPckNyZWF0ZVNoYWRlck1vZHVsZSgiZmlsdGVyQ29tcGxleEJsZW5kT3V0cHV0VmVydGV4IixmYS5nZXRGaWx0ZXJDb21wbGV4QmxlbmRPdXRwdXRWZXJ0ZXhTaGFkZXIoKSk7dGhpcy5waXBlbGluZXMuc2V0KCJmaWx0ZXJfY29tcGxleF9ibGVuZF9vdXRwdXQiLHRoaXMuY3JlYXRlRnVsbHNjcmVlblF1YWRQaXBlbGluZSh0LGEscix0aGlzLmZvcm1hdCxuKSksdGhpcy5zYW1wbGVDb3VudD4xJiZ0aGlzLnBpcGVsaW5lcy5zZXQoImZpbHRlcl9jb21wbGV4X2JsZW5kX291dHB1dF9tc2FhIix0aGlzLmNyZWF0ZUZ1bGxzY3JlZW5RdWFkUGlwZWxpbmUodCxhLHIsdGhpcy5mb3JtYXQsbix0aGlzLnNhbXBsZUNvdW50KSl9Y3JlYXRlRmlsdGVyUGlwZWxpbmVXaXRoTGF5b3V0KGUsdCxyLG4pe2xldCBpPXRoaXMuZmlsdGVyQmluZEdyb3VwTGF5b3V0cy5nZXQocik7aWYoIWkpe2NvbnN0IGU9W3tiaW5kaW5nOjAsdmlzaWJpbGl0eTpHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCxidWZmZXI6e3R5cGU6InVuaWZvcm0ifX0se2JpbmRpbmc6MSx2aXNpYmlsaXR5OkdQVVNoYWRlclN0YWdlLkZSQUdNRU5ULHNhbXBsZXI6e319XTtmb3IobGV0IHQ9MDt0PHI7dCsrKWUucHVzaCh7YmluZGluZzoyK3QsdmlzaWJpbGl0eTpHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCx0ZXh0dXJlOnt9fSk7aT10aGlzLmRldmljZS5jcmVhdGVCaW5kR3JvdXBMYXlvdXQoe2VudHJpZXM6ZX0pLHRoaXMuZmlsdGVyQmluZEdyb3VwTGF5b3V0cy5zZXQocixpKX10aGlzLmJpbmRHcm91cExheW91dHMuc2V0KGUsaSk7Y29uc3QgYT10aGlzLmRldmljZS5jcmVhdGVQaXBlbGluZUxheW91dCh7YmluZEdyb3VwTGF5b3V0czpbaV19KSxzPXRoaXMuZ2V0T3JDcmVhdGVTaGFkZXJNb2R1bGUoImJsdXJGaWx0ZXJWZXJ0ZXgiLGZhLmdldEJsdXJGaWx0ZXJWZXJ0ZXhTaGFkZXIoKSksbz10aGlzLmdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKGBmaWx0ZXJfJHtlfWAsdCk7dGhpcy5waXBlbGluZXMuc2V0KGUsdGhpcy5jcmVhdGVGdWxsc2NyZWVuUXVhZFBpcGVsaW5lKGEscyxvLCJyZ2JhOHVub3JtIixuKSl9Y3JlYXRlRnVsbHNjcmVlblF1YWRQaXBlbGluZShlLHQscixuLGksYSxzKXtjb25zdCBvPXtsYXlvdXQ6ZSx2ZXJ0ZXg6e21vZHVsZTp0LGVudHJ5UG9pbnQ6Im1haW4iLGJ1ZmZlcnM6W119LGZyYWdtZW50Onttb2R1bGU6cixlbnRyeVBvaW50OiJtYWluIix0YXJnZXRzOlt7Zm9ybWF0Om4sYmxlbmQ6aX1dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9fTtyZXR1cm4gYSYmYT4xJiYoby5tdWx0aXNhbXBsZT17Y291bnQ6YX0pLHMmJihvLmRlcHRoU3RlbmNpbD1zKSx0aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZShvKX1nZXRQaXBlbGluZShlKXtsZXQgdD10aGlzLnBpcGVsaW5lcy5nZXQoZSk7cmV0dXJuIHR8fCh0aGlzLmVuc3VyZUxhenlHcm91cChlKSx0PXRoaXMucGlwZWxpbmVzLmdldChlKSksdH1nZXRGaWx0ZXJQaXBlbGluZShlLHQpe2NvbnN0IHI9YCR7ZX1fJHtPYmplY3Qua2V5cyh0KS5zb3J0KCkubWFwKGU9PmAke2V9JHt0W2VdfWApLmpvaW4oIl8iKX1gO2xldCBuPXRoaXMucGlwZWxpbmVzLmdldChyKTtpZihuKXJldHVybiBuO3RoaXMuZW5zdXJlTGF6eUdyb3VwKGUpO2NvbnN0IGk9dGhpcy5zaGFkZXJNb2R1bGVDYWNoZS5nZXQoYGZpbHRlcl8ke2V9YCksYT10aGlzLnNoYWRlck1vZHVsZUNhY2hlLmdldCgiYmx1ckZpbHRlclZlcnRleCIpLHM9dGhpcy5iaW5kR3JvdXBMYXlvdXRzLmdldChlKTtpZighaXx8IWF8fCFzKXJldHVybiB0aGlzLnBpcGVsaW5lcy5nZXQoZSk7Y29uc3Qgbz10aGlzLmRldmljZS5jcmVhdGVQaXBlbGluZUxheW91dCh7YmluZEdyb3VwTGF5b3V0czpbc119KTtyZXR1cm4gbj10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGF5b3V0Om8sdmVydGV4Onttb2R1bGU6YSxlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOltdfSxmcmFnbWVudDp7bW9kdWxlOmksZW50cnlQb2ludDoibWFpbiIsdGFyZ2V0czpbe2Zvcm1hdDoicmdiYTh1bm9ybSIsYmxlbmQ6e2NvbG9yOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJvbmUtbWludXMtc3JjLWFscGhhIixvcGVyYXRpb246ImFkZCJ9LGFscGhhOntzcmNGYWN0b3I6Im9uZSIsZHN0RmFjdG9yOiJvbmUtbWludXMtc3JjLWFscGhhIixvcGVyYXRpb246ImFkZCJ9fX1dLGNvbnN0YW50czp0fSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9fSksdGhpcy5waXBlbGluZXMuc2V0KHIsbiksbn1nZXRHcmFkaWVudFBpcGVsaW5lKGUsdCxyKXtjb25zdCBuPWAke2V9X3Qke3R9cyR7cn1gO2xldCBpPXRoaXMucGlwZWxpbmVzLmdldChuKTtyZXR1cm4gaXx8KHRoaXMuZ3JhZGllbnRQaXBlbGluZUxheW91dD8oaT10aGlzLmNyZWF0ZUdyYWRpZW50VmFyaWFudChlLHQsciksaT8odGhpcy5waXBlbGluZXMuc2V0KG4saSksaSk6dGhpcy5nZXRQaXBlbGluZShlKSk6dGhpcy5nZXRQaXBlbGluZShlKSl9Y3JlYXRlR3JhZGllbnRWYXJpYW50KGUsdCxyKXtpZighdGhpcy5ncmFkaWVudFBpcGVsaW5lTGF5b3V0KXJldHVybjtjb25zdCBuPXtHUkFESUVOVF9UWVBFOnQsU1BSRUFEX01PREU6cn0saT1kYSxhPWhhLHM9ZS5pbmNsdWRlcygic3RlbmNpbF9hdGxhcyIpfHwiZ3JhZGllbnRfZmlsbF9zdGVuY2lsX21haW4iPT09ZT90aGlzLmdyYWRpZW50U3RlbmNpbEZyYWdtZW50U2hhZGVyTW9kdWxlOnRoaXMuZ3JhZGllbnRGcmFnbWVudFNoYWRlck1vZHVsZSxvPWUuaW5jbHVkZXMoImJncmEiKXx8ImdyYWRpZW50X2ZpbGxfc3RlbmNpbF9tYWluIj09PWU/dGhpcy5mb3JtYXQ6InJnYmE4dW5vcm0iLGw9e307bGV0IGM7KGUuaW5jbHVkZXMoImJncmEiKXx8ImdyYWRpZW50X2ZpbGxfc3RlbmNpbF9tYWluIj09PWUpJiYobC55RmxpcFNpZ249LTEpO2xldCB1PXRoaXMuc2FtcGxlQ291bnQ7ZS5pbmNsdWRlcygic3Ryb2tlIik/Yz17Zm9ybWF0OiJzdGVuY2lsOCIsc3RlbmNpbEZyb250Ontjb21wYXJlOiJhbHdheXMiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6ImtlZXAiLHBhc3NPcDoia2VlcCJ9LHN0ZW5jaWxCYWNrOntjb21wYXJlOiJhbHdheXMiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6ImtlZXAiLHBhc3NPcDoia2VlcCJ9LHN0ZW5jaWxSZWFkTWFzazowLHN0ZW5jaWxXcml0ZU1hc2s6MH06ImdyYWRpZW50X2ZpbGxfc3RlbmNpbCI9PT1lfHwiZ3JhZGllbnRfZmlsbF9zdGVuY2lsX2F0bGFzIj09PWU/Yz17Zm9ybWF0OiJzdGVuY2lsOCIsc3RlbmNpbEZyb250Ontjb21wYXJlOiJub3QtZXF1YWwiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6Inplcm8iLHBhc3NPcDoiemVybyJ9LHN0ZW5jaWxCYWNrOntjb21wYXJlOiJub3QtZXF1YWwiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6Inplcm8iLHBhc3NPcDoiemVybyJ9LHN0ZW5jaWxSZWFkTWFzazoyNTUsc3RlbmNpbFdyaXRlTWFzazoyNTV9OiJncmFkaWVudF9maWxsX3N0ZW5jaWxfbWFpbiI9PT1lPyhjPXtmb3JtYXQ6InN0ZW5jaWw4IixzdGVuY2lsRnJvbnQ6e2NvbXBhcmU6Im5vdC1lcXVhbCIsZmFpbE9wOiJrZWVwIixkZXB0aEZhaWxPcDoiemVybyIscGFzc09wOiJ6ZXJvIn0sc3RlbmNpbEJhY2s6e2NvbXBhcmU6Im5vdC1lcXVhbCIsZmFpbE9wOiJrZWVwIixkZXB0aEZhaWxPcDoiemVybyIscGFzc09wOiJ6ZXJvIn0sc3RlbmNpbFJlYWRNYXNrOjI1NSxzdGVuY2lsV3JpdGVNYXNrOjI1NX0sdT0xKToiZ3JhZGllbnRfZmlsbF9iZ3JhX3N0ZW5jaWwiPT09ZT9jPXtmb3JtYXQ6InN0ZW5jaWw4IixzdGVuY2lsRnJvbnQ6e2NvbXBhcmU6ImVxdWFsIixmYWlsT3A6ImtlZXAiLGRlcHRoRmFpbE9wOiJrZWVwIixwYXNzT3A6ImtlZXAifSxzdGVuY2lsQmFjazp7Y29tcGFyZToiZXF1YWwiLGZhaWxPcDoia2VlcCIsZGVwdGhGYWlsT3A6ImtlZXAiLHBhc3NPcDoia2VlcCJ9LHN0ZW5jaWxSZWFkTWFzazoyNTUsc3RlbmNpbFdyaXRlTWFzazowfToiZ3JhZGllbnRfZmlsbF9iZ3JhX25vX21zYWEiPT09ZSYmKHU9MSk7Y29uc3QgZj17bGF5b3V0OnRoaXMuZ3JhZGllbnRQaXBlbGluZUxheW91dCx2ZXJ0ZXg6e21vZHVsZTp0aGlzLmdyYWRpZW50VmVydGV4U2hhZGVyTW9kdWxlLGVudHJ5UG9pbnQ6Im1haW4iLGJ1ZmZlcnM6W2ldLGNvbnN0YW50czpPYmplY3Qua2V5cyhsKS5sZW5ndGg+MD9sOnZvaWQgMH0sZnJhZ21lbnQ6e21vZHVsZTpzLGVudHJ5UG9pbnQ6Im1haW4iLHRhcmdldHM6W3tmb3JtYXQ6byxibGVuZDphfV0sY29uc3RhbnRzOm59LHByaW1pdGl2ZTp7dG9wb2xvZ3k6InRyaWFuZ2xlLWxpc3QiLGN1bGxNb2RlOiJub25lIn0sbXVsdGlzYW1wbGU6e2NvdW50OnV9fTtyZXR1cm4gYyYmKGYuZGVwdGhTdGVuY2lsPWMpLHRoaXMuZGV2aWNlLmNyZWF0ZVJlbmRlclBpcGVsaW5lKGYpfWdldEJpbmRHcm91cExheW91dChlKXtsZXQgdD10aGlzLmJpbmRHcm91cExheW91dHMuZ2V0KGUpO3JldHVybiB0fHwodGhpcy5lbnN1cmVMYXp5R3JvdXAoZSksdD10aGlzLmJpbmRHcm91cExheW91dHMuZ2V0KGUpKSx0fWNyZWF0ZU5vZGVDbGVhclBpcGVsaW5lKCl7Y29uc3QgZT10aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7bGF5b3V0OiJhdXRvIix2ZXJ0ZXg6e21vZHVsZTp0aGlzLmdldE9yQ3JlYXRlU2hhZGVyTW9kdWxlKCJub2RlQ2xlYXJWZXJ0ZXgiLGZhLmdldE5vZGVDbGVhclZlcnRleFNoYWRlcigpKSxlbnRyeVBvaW50OiJtYWluIixidWZmZXJzOlt7YXJyYXlTdHJpZGU6OCxhdHRyaWJ1dGVzOlt7c2hhZGVyTG9jYXRpb246MCxvZmZzZXQ6MCxmb3JtYXQ6ImZsb2F0MzJ4MiJ9XX1dfSxmcmFnbWVudDp7bW9kdWxlOnRoaXMuZ2V0T3JDcmVhdGVTaGFkZXJNb2R1bGUoIm5vZGVDbGVhckZyYWdtZW50IixmYS5nZXROb2RlQ2xlYXJGcmFnbWVudFNoYWRlcigpKSxlbnRyeVBvaW50OiJtYWluIix0YXJnZXRzOlt7Zm9ybWF0OiJyZ2JhOHVub3JtIixibGVuZDp7Y29sb3I6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Inplcm8iLG9wZXJhdGlvbjoiYWRkIn0sYWxwaGE6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Inplcm8iLG9wZXJhdGlvbjoiYWRkIn19LHdyaXRlTWFzazpHUFVDb2xvcldyaXRlLkFMTH1dfSxwcmltaXRpdmU6e3RvcG9sb2d5OiJ0cmlhbmdsZS1saXN0IixjdWxsTW9kZToibm9uZSJ9LGRlcHRoU3RlbmNpbDp7Zm9ybWF0OiJzdGVuY2lsOCIsc3RlbmNpbEZyb250Ontjb21wYXJlOiJhbHdheXMiLGZhaWxPcDoiemVybyIsZGVwdGhGYWlsT3A6Inplcm8iLHBhc3NPcDoiemVybyJ9LHN0ZW5jaWxCYWNrOntjb21wYXJlOiJhbHdheXMiLGZhaWxPcDoiemVybyIsZGVwdGhGYWlsT3A6Inplcm8iLHBhc3NPcDoiemVybyJ9LHN0ZW5jaWxSZWFkTWFzazoyNTUsc3RlbmNpbFdyaXRlTWFzazoyNTV9LG11bHRpc2FtcGxlOntjb3VudDp0aGlzLnNhbXBsZUNvdW50fX0pO3RoaXMucGlwZWxpbmVzLnNldCgibm9kZV9jbGVhcl9hdGxhcyIsZSl9ZGlzcG9zZSgpe3RoaXMucGlwZWxpbmVzLmNsZWFyKCksdGhpcy5iaW5kR3JvdXBMYXlvdXRzLmNsZWFyKCksdGhpcy5zaGFkZXJNb2R1bGVDYWNoZS5jbGVhcigpLHRoaXMuZmlsdGVyQmluZEdyb3VwTGF5b3V0cy5jbGVhcigpfX1jbGFzcyBtYXtjb25zdHJ1Y3RvcihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiZGV2aWNlIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInBpcGVsaW5lcyIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJiaW5kR3JvdXBMYXlvdXRzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksdGhpcy5kZXZpY2U9ZSx0aGlzLnBpcGVsaW5lcz1uZXcgTWFwLHRoaXMuYmluZEdyb3VwTGF5b3V0cz1uZXcgTWFwLHRoaXMuaW5pdGlhbGl6ZUJsdXJQaXBlbGluZXMoKX1pbml0aWFsaXplQmx1clBpcGVsaW5lcygpe2NvbnN0IGU9dGhpcy5kZXZpY2UuY3JlYXRlQmluZEdyb3VwTGF5b3V0KHtsYWJlbDoiYmx1cl9jb21wdXRlX2JpbmRfZ3JvdXBfbGF5b3V0IixlbnRyaWVzOlt7YmluZGluZzowLHZpc2liaWxpdHk6R1BVU2hhZGVyU3RhZ2UuQ09NUFVURSx0ZXh0dXJlOntzYW1wbGVUeXBlOiJmbG9hdCJ9fSx7YmluZGluZzoxLHZpc2liaWxpdHk6R1BVU2hhZGVyU3RhZ2UuQ09NUFVURSxzdG9yYWdlVGV4dHVyZTp7YWNjZXNzOiJ3cml0ZS1vbmx5Iixmb3JtYXQ6InJnYmE4dW5vcm0ifX0se2JpbmRpbmc6Mix2aXNpYmlsaXR5OkdQVVNoYWRlclN0YWdlLkNPTVBVVEUsYnVmZmVyOnt0eXBlOiJ1bmlmb3JtIn19XX0pO3RoaXMuYmluZEdyb3VwTGF5b3V0cy5zZXQoImJsdXJfY29tcHV0ZSIsZSksdGhpcy5jcmVhdGVCbHVyQ29tcHV0ZVBpcGVsaW5lKCJibHVyX2NvbXB1dGVfaG9yaXpvbnRhbCIpLHRoaXMuY3JlYXRlQmx1ckNvbXB1dGVQaXBlbGluZSgiYmx1cl9jb21wdXRlX3ZlcnRpY2FsIiksdGhpcy5jcmVhdGVCbHVyQ29tcHV0ZVBpcGVsaW5lKCJibHVyX2NvbXB1dGVfc2hhcmVkX2hvcml6b250YWwiLCEwKSx0aGlzLmNyZWF0ZUJsdXJDb21wdXRlUGlwZWxpbmUoImJsdXJfY29tcHV0ZV9zaGFyZWRfdmVydGljYWwiLCEwKX1jcmVhdGVCbHVyQ29tcHV0ZVBpcGVsaW5lKGUsdD0hMSl7Y29uc3Qgcj10aGlzLmRldmljZS5jcmVhdGVTaGFkZXJNb2R1bGUoe2xhYmVsOmAke2V9X3NoYWRlcmAsY29kZTp0P3RoaXMuZ2V0U2hhcmVkQmx1ckNvbXB1dGVTaGFkZXJDb2RlKCk6dGhpcy5nZXRCbHVyQ29tcHV0ZVNoYWRlckNvZGUoKX0pLG49dGhpcy5kZXZpY2UuY3JlYXRlUGlwZWxpbmVMYXlvdXQoe2xhYmVsOmAke2V9X2xheW91dGAsYmluZEdyb3VwTGF5b3V0czpbdGhpcy5iaW5kR3JvdXBMYXlvdXRzLmdldCgiYmx1cl9jb21wdXRlIildfSksaT10aGlzLmRldmljZS5jcmVhdGVDb21wdXRlUGlwZWxpbmUoe2xhYmVsOmUsbGF5b3V0Om4sY29tcHV0ZTp7bW9kdWxlOnIsZW50cnlQb2ludDoibWFpbiJ9fSk7dGhpcy5waXBlbGluZXMuc2V0KGUsaSl9Z2V0Qmx1ckNvbXB1dGVTaGFkZXJDb2RlKCl7cmV0dXJuIlxuc3RydWN0IEJsdXJQYXJhbXMge1xuICAgIGRpcmVjdGlvbjogdmVjMjxmMzI+LCAgLy8gKDEsMCkgb3IgKDAsMSlcbiAgICByYWRpdXM6IGYzMiwgICAgICAgICAgIC8vIOODluODqeODvOWNiuW+hFxuICAgIGZyYWN0aW9uOiBmMzIsICAgICAgICAgLy8g56uv44OU44Kv44K744Or44Gu44OW44Os44Oz44OJ5Ymy5ZCIXG4gICAgdGV4U2l6ZTogdmVjMjxmMzI+LCAgICAvLyDjg4bjgq/jgrnjg4Hjg6PjgrXjgqTjgrpcbiAgICBzYW1wbGVzOiBmMzIsICAgICAgICAgIC8vIOOCteODs+ODl+ODq+aVsFxuICAgIHBhZGRpbmc6IGYzMiwgICAgICAgICAgLy8g44OR44OH44Kj44Oz44Kw77yIMTbjg5DjgqTjg4jjgqLjg6njgqTjg6Hjg7Pjg4jvvIlcbn1cblxuQGdyb3VwKDApIEBiaW5kaW5nKDApIHZhciBpbnB1dFRleHR1cmU6IHRleHR1cmVfMmQ8ZjMyPjtcbkBncm91cCgwKSBAYmluZGluZygxKSB2YXIgb3V0cHV0VGV4dHVyZTogdGV4dHVyZV9zdG9yYWdlXzJkPHJnYmE4dW5vcm0sIHdyaXRlPjtcbkBncm91cCgwKSBAYmluZGluZygyKSB2YXI8dW5pZm9ybT4gcGFyYW1zOiBCbHVyUGFyYW1zO1xuXG5jb25zdCBXT1JLR1JPVVBfU0laRTogdTMyID0gMTZ1O1xuXG5AY29tcHV0ZSBAd29ya2dyb3VwX3NpemUoMTYsIDE2LCAxKVxuZm4gbWFpbihcbiAgICBAYnVpbHRpbihnbG9iYWxfaW52b2NhdGlvbl9pZCkgZ2xvYmFsSWQ6IHZlYzM8dTMyPlxuKSB7XG4gICAgbGV0IHRleFNpemUgPSB2ZWMyPHUzMj4odTMyKHBhcmFtcy50ZXhTaXplLngpLCB1MzIocGFyYW1zLnRleFNpemUueSkpO1xuICAgIGxldCByYWRpdXMgPSBpMzIocGFyYW1zLnJhZGl1cyk7XG5cbiAgICBsZXQgb3V0Q29vcmQgPSBnbG9iYWxJZC54eTtcblxuICAgIGlmIChvdXRDb29yZC54ID49IHRleFNpemUueCB8fCBvdXRDb29yZC55ID49IHRleFNpemUueSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGRpcmVjdGlvbiA9IHZlYzI8aTMyPihpMzIocGFyYW1zLmRpcmVjdGlvbi54KSwgaTMyKHBhcmFtcy5kaXJlY3Rpb24ueSkpO1xuICAgIGxldCBzYW1wbGVzID0gcGFyYW1zLnNhbXBsZXM7XG4gICAgbGV0IGZyYWN0aW9uID0gcGFyYW1zLmZyYWN0aW9uO1xuXG4gICAgdmFyIGNvbG9yID0gdmVjNDxmMzI+KDAuMCk7XG5cbiAgICBmb3IgKHZhciBpID0gLXJhZGl1czsgaSA8PSByYWRpdXM7IGkgPSBpICsgMSkge1xuICAgICAgICB2YXIgc2FtcGxlQ29vcmQgPSB2ZWMyPGkzMj4ob3V0Q29vcmQpICsgZGlyZWN0aW9uICogaTtcblxuICAgICAgICBzYW1wbGVDb29yZC54ID0gY2xhbXAoc2FtcGxlQ29vcmQueCwgMCwgaTMyKHRleFNpemUueCkgLSAxKTtcbiAgICAgICAgc2FtcGxlQ29vcmQueSA9IGNsYW1wKHNhbXBsZUNvb3JkLnksIDAsIGkzMih0ZXhTaXplLnkpIC0gMSk7XG5cbiAgICAgICAgbGV0IHNhbXBsZSA9IHRleHR1cmVMb2FkKGlucHV0VGV4dHVyZSwgdmVjMjx1MzI+KHNhbXBsZUNvb3JkKSwgMCk7XG5cbiAgICAgICAgLy8g56uv44OU44Kv44K744Or44GrZnJhY3Rpb27ph43jgb/jgpLpgannlKjvvIhGcmFnbWVudCBTaGFkZXLjgajlkIzjgZjjg63jgrjjg4Pjgq/vvIlcbiAgICAgICAgaWYgKGkgPT0gLXJhZGl1cyB8fCBpID09IHJhZGl1cykge1xuICAgICAgICAgICAgY29sb3IgPSBjb2xvciArIHNhbXBsZSAqIGZyYWN0aW9uO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29sb3IgPSBjb2xvciArIHNhbXBsZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbG9yID0gY29sb3IgLyBzYW1wbGVzO1xuXG4gICAgdGV4dHVyZVN0b3JlKG91dHB1dFRleHR1cmUsIG91dENvb3JkLCBjb2xvcik7XG59XG4ifWdldFNoYXJlZEJsdXJDb21wdXRlU2hhZGVyQ29kZSgpe3JldHVybiJcbnN0cnVjdCBCbHVyUGFyYW1zIHtcbiAgICBkaXJlY3Rpb246IHZlYzI8ZjMyPixcbiAgICByYWRpdXM6IGYzMixcbiAgICBmcmFjdGlvbjogZjMyLFxuICAgIHRleFNpemU6IHZlYzI8ZjMyPixcbiAgICBzYW1wbGVzOiBmMzIsXG4gICAgcGFkZGluZzogZjMyLFxufVxuXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyIGlucHV0VGV4dHVyZTogdGV4dHVyZV8yZDxmMzI+O1xuQGdyb3VwKDApIEBiaW5kaW5nKDEpIHZhciBvdXRwdXRUZXh0dXJlOiB0ZXh0dXJlX3N0b3JhZ2VfMmQ8cmdiYTh1bm9ybSwgd3JpdGU+O1xuQGdyb3VwKDApIEBiaW5kaW5nKDIpIHZhcjx1bmlmb3JtPiBwYXJhbXM6IEJsdXJQYXJhbXM7XG5cbmNvbnN0IFRJTEU6IHUzMiA9IDE2dTtcbmNvbnN0IE1BWF9BUFJPTjogdTMyID0gMjR1O1xuY29uc3QgU0hBUkVEX1c6IHUzMiA9IFRJTEUgKyAydSAqIE1BWF9BUFJPTjtcblxudmFyPHdvcmtncm91cD4gdGlsZTogYXJyYXk8dmVjNDxmMzI+LCAxMDI0PjtcblxuQGNvbXB1dGUgQHdvcmtncm91cF9zaXplKDE2LCAxNiwgMSlcbmZuIG1haW4oXG4gICAgQGJ1aWx0aW4oZ2xvYmFsX2ludm9jYXRpb25faWQpIGdsb2JhbElkOiB2ZWMzPHUzMj4sXG4gICAgQGJ1aWx0aW4obG9jYWxfaW52b2NhdGlvbl9pZCkgbG9jYWxJZDogdmVjMzx1MzI+LFxuICAgIEBidWlsdGluKHdvcmtncm91cF9pZCkgd29ya2dyb3VwSWQ6IHZlYzM8dTMyPlxuKSB7XG4gICAgbGV0IHRleFNpemUgPSB2ZWMyPHUzMj4odTMyKHBhcmFtcy50ZXhTaXplLngpLCB1MzIocGFyYW1zLnRleFNpemUueSkpO1xuICAgIGxldCByYWRpdXMgPSB1MzIocGFyYW1zLnJhZGl1cyk7XG4gICAgbGV0IGFwcm9uID0gbWluKHJhZGl1cywgTUFYX0FQUk9OKTtcbiAgICBsZXQgaXNIb3Jpem9udGFsID0gcGFyYW1zLmRpcmVjdGlvbi54ID4gMC41O1xuICAgIGxldCBmcmFjdGlvbiA9IHBhcmFtcy5mcmFjdGlvbjtcbiAgICBsZXQgc2FtcGxlcyA9IHBhcmFtcy5zYW1wbGVzO1xuXG4gICAgbGV0IHRocmVhZElkeCA9IGxvY2FsSWQueCArIGxvY2FsSWQueSAqIFRJTEU7XG4gICAgbGV0IHRvdGFsVGhyZWFkcyA9IFRJTEUgKiBUSUxFO1xuXG4gICAgaWYgKGlzSG9yaXpvbnRhbCkge1xuICAgICAgICBsZXQgc2hhcmVkV2lkdGggPSBUSUxFICsgMnUgKiBhcHJvbjtcbiAgICAgICAgbGV0IGJhc2VYID0gd29ya2dyb3VwSWQueCAqIFRJTEU7XG4gICAgICAgIGxldCB5ID0gZ2xvYmFsSWQueTtcbiAgICAgICAgbGV0IGNsYW1wZWRZID0gY2xhbXAoeSwgMHUsIG1heCh0ZXhTaXplLnksIDF1KSAtIDF1KTtcblxuICAgICAgICAvLyDlhajjgrnjg6zjg4Pjg4njgYzljZToqr/jg63jg7zjg4nvvIjnr4Tlm7LlpJbjgrnjg6zjg4Pjg4njgoJjbGFtcOOBleOCjOOBn+W6p+aomeOBp+ODreODvOODie+8iVxuICAgICAgICB2YXIgaWR4ID0gdGhyZWFkSWR4O1xuICAgICAgICBsb29wIHtcbiAgICAgICAgICAgIGlmIChpZHggPj0gc2hhcmVkV2lkdGgpIHsgYnJlYWs7IH1cbiAgICAgICAgICAgIGxldCBneCA9IGkzMihiYXNlWCkgKyBpMzIoaWR4KSAtIGkzMihhcHJvbik7XG4gICAgICAgICAgICBsZXQgY3ggPSB1MzIoY2xhbXAoZ3gsIDAsIGkzMihtYXgodGV4U2l6ZS54LCAxdSkpIC0gMSkpO1xuICAgICAgICAgICAgdGlsZVtsb2NhbElkLnkgKiBTSEFSRURfVyArIGlkeF0gPSB0ZXh0dXJlTG9hZChpbnB1dFRleHR1cmUsIHZlYzI8dTMyPihjeCwgY2xhbXBlZFkpLCAwKTtcbiAgICAgICAgICAgIGlkeCArPSB0b3RhbFRocmVhZHM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDlhajjgrnjg6zjg4Pjg4njgYzjg5Djg6rjgqLjgavliLDpgZTvvIjml6nmnJ9yZXR1cm7jgarjgZfvvIlcbiAgICAgICAgd29ya2dyb3VwQmFycmllcigpO1xuXG4gICAgICAgIC8vIOevhOWbsuWGheOBruOCueODrOODg+ODieOBruOBv+WHuuWKm1xuICAgICAgICBsZXQgb3V0WCA9IGdsb2JhbElkLng7XG4gICAgICAgIGlmIChvdXRYIDwgdGV4U2l6ZS54ICYmIHkgPCB0ZXhTaXplLnkpIHtcbiAgICAgICAgICAgIGxldCBpUmFkaXVzID0gaTMyKHJhZGl1cyk7XG4gICAgICAgICAgICB2YXIgY29sb3IgPSB2ZWM0PGYzMj4oMC4wKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAtaVJhZGl1czsgaSA8PSBpUmFkaXVzOyBpID0gaSArIDEpIHtcbiAgICAgICAgICAgICAgICBsZXQgdGlsZUlkeCA9IGkzMihsb2NhbElkLngpICsgaTMyKGFwcm9uKSArIGk7XG4gICAgICAgICAgICAgICAgbGV0IHMgPSB0aWxlW2xvY2FsSWQueSAqIFNIQVJFRF9XICsgdTMyKGNsYW1wKHRpbGVJZHgsIDAsIGkzMihzaGFyZWRXaWR0aCkgLSAxKSldO1xuICAgICAgICAgICAgICAgIGlmIChpID09IC1pUmFkaXVzIHx8IGkgPT0gaVJhZGl1cykge1xuICAgICAgICAgICAgICAgICAgICBjb2xvciArPSBzICogZnJhY3Rpb247XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29sb3IgKz0gcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0ZXh0dXJlU3RvcmUob3V0cHV0VGV4dHVyZSwgdmVjMjx1MzI+KG91dFgsIHkpLCBjb2xvciAvIHNhbXBsZXMpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IHNoYXJlZEhlaWdodCA9IFRJTEUgKyAydSAqIGFwcm9uO1xuICAgICAgICBsZXQgYmFzZVkgPSB3b3JrZ3JvdXBJZC55ICogVElMRTtcbiAgICAgICAgbGV0IHggPSBnbG9iYWxJZC54O1xuICAgICAgICBsZXQgY2xhbXBlZFggPSBjbGFtcCh4LCAwdSwgbWF4KHRleFNpemUueCwgMXUpIC0gMXUpO1xuXG4gICAgICAgIC8vIOWFqOOCueODrOODg+ODieOBjOWNlOiqv+ODreODvOODie+8iOevhOWbsuWkluOCueODrOODg+ODieOCgmNsYW1w44GV44KM44Gf5bqn5qiZ44Gn44Ot44O844OJ77yJXG4gICAgICAgIHZhciBpZHggPSB0aHJlYWRJZHg7XG4gICAgICAgIGxvb3Age1xuICAgICAgICAgICAgaWYgKGlkeCA+PSBzaGFyZWRIZWlnaHQpIHsgYnJlYWs7IH1cbiAgICAgICAgICAgIGxldCBneSA9IGkzMihiYXNlWSkgKyBpMzIoaWR4KSAtIGkzMihhcHJvbik7XG4gICAgICAgICAgICBsZXQgY3kgPSB1MzIoY2xhbXAoZ3ksIDAsIGkzMihtYXgodGV4U2l6ZS55LCAxdSkpIC0gMSkpO1xuICAgICAgICAgICAgdGlsZVtpZHggKiBUSUxFICsgbG9jYWxJZC54XSA9IHRleHR1cmVMb2FkKGlucHV0VGV4dHVyZSwgdmVjMjx1MzI+KGNsYW1wZWRYLCBjeSksIDApO1xuICAgICAgICAgICAgaWR4ICs9IHRvdGFsVGhyZWFkcztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOWFqOOCueODrOODg+ODieOBjOODkOODquOCouOBq+WIsOmBlO+8iOaXqeacn3JldHVybuOBquOBl++8iVxuICAgICAgICB3b3JrZ3JvdXBCYXJyaWVyKCk7XG5cbiAgICAgICAgLy8g56+E5Zuy5YaF44Gu44K544Os44OD44OJ44Gu44G/5Ye65YqbXG4gICAgICAgIGxldCBvdXRZID0gZ2xvYmFsSWQueTtcbiAgICAgICAgaWYgKHggPCB0ZXhTaXplLnggJiYgb3V0WSA8IHRleFNpemUueSkge1xuICAgICAgICAgICAgbGV0IGlSYWRpdXMgPSBpMzIocmFkaXVzKTtcbiAgICAgICAgICAgIHZhciBjb2xvciA9IHZlYzQ8ZjMyPigwLjApO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IC1pUmFkaXVzOyBpIDw9IGlSYWRpdXM7IGkgPSBpICsgMSkge1xuICAgICAgICAgICAgICAgIGxldCB0aWxlSWR4ID0gaTMyKGxvY2FsSWQueSkgKyBpMzIoYXByb24pICsgaTtcbiAgICAgICAgICAgICAgICBsZXQgcyA9IHRpbGVbdTMyKGNsYW1wKHRpbGVJZHgsIDAsIGkzMihzaGFyZWRIZWlnaHQpIC0gMSkpICogVElMRSArIGxvY2FsSWQueF07XG4gICAgICAgICAgICAgICAgaWYgKGkgPT0gLWlSYWRpdXMgfHwgaSA9PSBpUmFkaXVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbG9yICs9IHMgKiBmcmFjdGlvbjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb2xvciArPSBzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRleHR1cmVTdG9yZShvdXRwdXRUZXh0dXJlLCB2ZWMyPHUzMj4oeCwgb3V0WSksIGNvbG9yIC8gc2FtcGxlcyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4ifWdldFBpcGVsaW5lKGUpe3JldHVybiB0aGlzLnBpcGVsaW5lcy5nZXQoZSl9Z2V0QmluZEdyb3VwTGF5b3V0KGUpe3JldHVybiB0aGlzLmJpbmRHcm91cExheW91dHMuZ2V0KGUpfWRlc3Ryb3koKXt0aGlzLnBpcGVsaW5lcy5jbGVhcigpLHRoaXMuYmluZEdyb3VwTGF5b3V0cy5jbGVhcigpfX1jb25zdCBnYT1OdW1iZXIuTUFYX1ZBTFVFLGJhPS1OdW1iZXIuTUFYX1ZBTFVFO2xldCB4YT0wO2NvbnN0IHZhPWU9Pnt4YT1lfSx5YT1bXTtsZXQgX2E9bnVsbDtjb25zdCB3YT0oKT0+e2lmKCEoeGEgaW4geWEpKXtpZighX2EpcmV0dXJuIG51bGw7e2NvbnN0IHQ9X2EoeGEpO2U9dCx5YVt4YV09ZX19dmFyIGU7cmV0dXJuIHlhW3hhXX0sTWE9ZT0+ZSBpbiB5YT95YVtlXTpudWxsLFBhPVtdLFNhPVtdLEZhPVtdO2xldCBUYT0wO2NvbnN0IEJhPWU9PntUYT1lfSxPYT0oKT0+VGEsQWE9KCk9PntQYS5sZW5ndGg9MCx2YSgwKTtmb3IobGV0IGU9MDtlPHlhLmxlbmd0aDtlKyspe2NvbnN0IHQ9eWFbZV07dCYmKHQudGV4dHVyZSYmdC50ZXh0dXJlLnJlc291cmNlLmRlc3Ryb3koKSx0LnN0ZW5jaWwmJnQuc3RlbmNpbC5yZXNvdXJjZS5kZXN0cm95KCksdC5tc2FhVGV4dHVyZSYmdC5tc2FhVGV4dHVyZS5yZXNvdXJjZS5kZXN0cm95KCksdC5tc2FhU3RlbmNpbCYmdC5tc2FhU3RlbmNpbC5yZXNvdXJjZS5kZXN0cm95KCkpfXlhLmxlbmd0aD0wLCgoKT0+e2ZvcihsZXQgZT0wO2U8U2EubGVuZ3RoOysrZSl7Y29uc3QgdD1TYVtlXTt0JiYodFswXT10WzFdPWdhLHRbMl09dFszXT1iYSl9Zm9yKGxldCBlPTA7ZTxGYS5sZW5ndGg7KytlKXtjb25zdCB0PUZhW2VdO3QmJih0WzBdPXRbMV09Z2EsdFsyXT10WzNdPWJhKX19KSgpLEJhKDApfTtjbGFzcyBSYXtjb25zdHJ1Y3Rvcigpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJjb3VudCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLHRoaXMuY291bnQ9MH1jbGVhcigpe3RoaXMuY291bnQ9bnIub2Zmc2V0PTB9fWxldCBDYT0ibm9ybWFsIjtjb25zdCBFYT1lPT57Q2E9ZX0sVWE9bmV3IFNldChbIm5vcm1hbCIsImxheWVyIiwiYWRkIiwic2NyZWVuIiwiYWxwaGEiLCJlcmFzZSIsImNvcHkiXSksJGE9W10sR2E9W10sa2E9W10sTGE9KCk9Pntmb3IobGV0IGU9MDtlPCRhLmxlbmd0aDtlKyspe2NvbnN0IHQ9JGFbZV07R2EucHVzaCh0LmNvbG9yX3RyYW5zZm9ybSksa2EucHVzaCh0Lm1hdHJpeCl9JGEubGVuZ3RoPTB9LElhPW5ldyBNYXAsVmE9KCk9Pntjb25zdCBlPSJibGVuZF9pbnN0YW5jZWQiO3JldHVybiBJYS5oYXMoZSl8fElhLnNldChlLG5ldyBSYSksSWEuZ2V0KGUpfTtsZXQgemE9ITE7Y29uc3QgamE9ZT0+e3phPWV9LERhPSgpPT56YTtsZXQgTmE9ITEsV2E9MDtjb25zdCBxYT1lPT57TmE9ZX0sWGE9KCk9Pk5hLFlhPWU9PntXYT1lfSxLYT0oKT0+V2EsSGE9bmV3IE1hcCxRYT1uZXcgTWFwLFphPShlLHQscixuKT0+e2NvbnN0IGk9UW4uY3VycmVudEF0dGFjaG1lbnRPYmplY3Q7aWYoIWkpcmV0dXJuO2NvbnN0IGE9aS5jbGlwTGV2ZWw7bGV0IHM9SGEuZ2V0KGEpO3M/KHNbMF09TWF0aC5taW4oc1swXSxlKSxzWzFdPU1hdGgubWluKHNbMV0sdCksc1syXT1NYXRoLm1heChzWzJdLHIpLHNbM109TWF0aC5tYXgoc1szXSxuKSk6KHM9SG4uZ2V0RmxvYXQzMkFycmF5NCgpLHNbMF09ZSxzWzFdPXQsc1syXT1yLHNbM109bixIYS5zZXQoYSxzKSl9LEphPSgpPT57Y29uc3QgZT1Rbi5jdXJyZW50QXR0YWNobWVudE9iamVjdDtpZighZSlyZXR1cm47Y29uc3QgdD0oMTw8ZS5jbGlwTGV2ZWwpLTE7cWEoITApLFlhKDI1NSZ0KSxqYSghMSl9LGVzPSgpPT57Y29uc3QgZT1Rbi5jdXJyZW50QXR0YWNobWVudE9iamVjdDtpZighZSlyZXR1cm47Y29uc3QgdD1lLmNsaXBMZXZlbCxyPUhhLmdldCh0KTt2YXIgbjtpZihyJiYoSGEuZGVsZXRlKHQpLG49cixIbi5wb29sRmxvYXQzMkFycmF5NChuKSksUWEuZGVsZXRlKHQpLC0tZS5jbGlwTGV2ZWwsIWUuY2xpcExldmVsKXJldHVybiBlLm1hc2s9ITEsamEoITEpLHFhKCExKSxZYSgwKSxlLm5lZWRzU3RlbmNpbENsZWFyPSEwLFFhLmNsZWFyKCksdm9pZCBIYS5jbGVhcigpO2UucGVuZGluZ1N0ZW5jaWxDbGVhckxldmVsPWUuY2xpcExldmVsLEphKCl9LHRzPShlLHQscik9Pntjb25zdCBuPWUubGVuZ3RoLTU7Zm9yKGxldCBpPTM7aTxuO2krPTMpe2xldCBuPTQqcjtlW2krMl0/KHRbbisrXT1lW2ktM10sdFtuKytdPWVbaS0yXSx0W24rK109MCx0W24rK109MCx0W24rK109ZVtpXSx0W24rK109ZVtpKzFdLHRbbisrXT0uNSx0W24rK109MCx0W24rK109ZVtpKzNdLHRbbisrXT1lW2krNF0sdFtuKytdPTEsdFtuKytdPTEpOmVbaSs1XT8odFtuKytdPWVbMF0sdFtuKytdPWVbMV0sdFtuKytdPS41LHRbbisrXT0uNSx0W24rK109ZVtpXSx0W24rK109ZVtpKzFdLHRbbisrXT0uNSx0W24rK109LjUsdFtuKytdPWVbaSs2XSx0W24rK109ZVtpKzddLHRbbisrXT0uNSx0W24rK109LjUpOih0W24rK109ZVswXSx0W24rK109ZVsxXSx0W24rK109LjUsdFtuKytdPS41LHRbbisrXT1lW2ldLHRbbisrXT1lW2krMV0sdFtuKytdPS41LHRbbisrXT0uNSx0W24rK109ZVtpKzNdLHRbbisrXT1lW2krNF0sdFtuKytdPS41LHRbbisrXT0uNSkscis9M31yZXR1cm4gcn07bGV0IHJzPW5ldyBGbG9hdDMyQXJyYXkoMzIpO2NvbnN0IG5zPWU9PntsZXQgdD0wO2Zvcihjb25zdCByIG9mIGUpe2NvbnN0IGU9ci5sZW5ndGgtNTtmb3IobGV0IHI9MztyPGU7cis9Myl0Kz0zfWNvbnN0IHI9NCp0O3ZhciBuO3JzLmxlbmd0aDxyJiYocnM9bmV3IEZsb2F0MzJBcnJheSgobj1yLG4tLSxufD1uPj4xLG58PW4+PjIsbnw9bj4+NCxufD1uPj44LG58PW4+PjE2LCsrbikpKTtjb25zdCBpPXJzO2xldCBhPTA7Zm9yKGNvbnN0IHQgb2YgZSlhPXRzKHQsaSxhKTtyZXR1cm57YnVmZmVyOmkuc3ViYXJyYXkoMCw0KmEpLGluZGV4Q291bnQ6YX19LGlzPW5ldyBPZmZzY3JlZW5DYW52YXMoMSwxKS5nZXRDb250ZXh0KCIyZCIpLGFzPXt4OjAseTowfSxzcz17eDowLHk6MH0sb3M9e3g6MCx5OjB9LGxzPXt4OjAseTowfSxjcz0oZSx0LHIpPT4oe3g6ZS54Kyh0LngtZS54KSpyLHk6ZS55Kyh0LnktZS55KSpyfSksdXM9ZT0+e2NvbnN0IHQ9TWF0aC5zcXJ0KGUueCplLngrZS55KmUueSk7cmV0dXJuIDA9PT10P3t4OjAseTowfTp7eDplLngvdCx5OmUueS90fX0sZnM9KGUsdCxyLG4pPT4oe3g6KDEtZSkqKjIqdC54KzIqKDEtZSkqZSpyLngrZSoqMipuLngseTooMS1lKSoqMip0LnkrMiooMS1lKSplKnIueStlKioyKm4ueX0pLGRzPShlLHQscixuKT0+KHt4OjIqKDEtZSkqKHIueC10LngpKzIqZSoobi54LXIueCkseToyKigxLWUpKihyLnktdC55KSsyKmUqKG4ueS1yLnkpfSksaHM9KGUsdCxyLG49LjUpPT57Y29uc3QgaT1jcyhlLHQsbiksYT1jcyh0LHIsbikscz1jcyhpLGEsbik7cmV0dXJuW1tlLGksc10sW3MsYSxyXV19LHBzPShlLHQscixuKT0+e2NvbnN0IGk9WzAsLjUsMV0sYT1bXTtmb3IoY29uc3QgcyBvZiBpKXtjb25zdCBpPWZzKHMsZSx0LHIpLG89ZHMocyxlLHQsciksbD11cyh7eDotby55LHk6by54fSk7YS5wdXNoKHt4OmkueCtsLngqbix5OmkueStsLnkqbn0pfXJldHVybiBhfSxtcz0oZSx0LHIsbik9Pntjb25zdCBpPSgoZSx0LHIsbj00KT0+e2xldCBpPVtbZSx0LHJdXTtmb3IobGV0IGU9MDtlPG47ZSsrKXtjb25zdCBlPVtdO2Zvcihjb25zdCB0IG9mIGkpe2NvbnN0IHI9aHModFswXSx0WzFdLHRbMl0sLjUpO2UucHVzaChyWzBdLHJbMV0pfWk9ZX1yZXR1cm4gaX0pKGUsdCxyLDUpLGE9W10scz1bXTtmb3IoY29uc3QgZSBvZiBpKWEucHVzaChwcyhlWzBdLGVbMV0sZVsyXSwrbikpLHMucHVzaChwcyhlWzBdLGVbMV0sZVsyXSwtbikpO2ZvcihsZXQgZT0wO2U8YS5sZW5ndGgtMTsrK2UpYVtlKzFdWzBdPWFbZV1bMl07Zm9yKGxldCBlPTA7ZTxzLmxlbmd0aC0xOysrZSlzW2UrMV1bMF09c1tlXVsyXTtjb25zdCBvPWFbMF1bMF0sbD1bby54LG8ueSwhMV07Zm9yKGxldCBlPTA7ZTxhLmxlbmd0aDsrK2Upe2NvbnN0IHQ9YVtlXTtsLnB1c2godFsxXS54LHRbMV0ueSwhMCx0WzJdLngsdFsyXS55LCExKX1jb25zdCBjPVsuLi5zXS5yZXZlcnNlKCk7Zm9yKGxldCBlPTA7ZTxjLmxlbmd0aDsrK2Upe2NvbnN0W3QscixuXT1jW2VdO2NbZV09W24scix0XX1jb25zdCB1PWNbMF1bMF07bC5wdXNoKHUueCx1LnksITEpO2ZvcihsZXQgZT0wO2U8Yy5sZW5ndGg7KytlKXtjb25zdCB0PWNbZV07bC5wdXNoKHRbMV0ueCx0WzFdLnksITAsdFsyXS54LHRbMl0ueSwhMSl9cmV0dXJuIGx9LGdzPShlLHQscik9Pntjb25zdCBuPXt4OnQueC1lLngseTp0LnktZS55fSxpPSgoZSx0LHIpPT57Y29uc3Qgbj1NYXRoLnNxcnQoZSplK3QqdCk7cmV0dXJuIDA9PT1uP3t4OjAseTowfTp7eDotdC9uKnIseTplL24qcn19KShuLngsbi55LHIpLGE9e3g6ZS54K2kueCx5OmUueStpLnl9LHM9e3g6dC54K2kueCx5OnQueStpLnl9LG89e3g6dC54LWkueCx5OnQueS1pLnl9LGw9e3g6ZS54LWkueCx5OmUueS1pLnl9O3JldHVyblthLngsYS55LCExLHMueCxzLnksITEsby54LG8ueSwhMSxsLngsbC55LCExLGEueCxhLnksITFdfSxicz0oZSx0LHIsbik9Pntjb25zdCBpPVtdO2ZvcihsZXQgYT0wO2E8bi5sZW5ndGg7YSs9Myl7aWYoblthKzJdKWNvbnRpbnVlO2NvbnN0IHM9blthXSxvPW5bYSsxXSxsPU1hdGguc3FydChNYXRoLnBvdyhzLWUsMikrTWF0aC5wb3coby10LDIpKTtNYXRoLmFicyhsLXIpPjFlLTR8fGkucHVzaChzLG8pfXJldHVybiBpfSx4cz0oZSx0KT0+e2lzLmJlZ2luUGF0aCgpLGlzLm1vdmVUbyh0WzBdLHRbMV0pO2ZvcihsZXQgZT0zO2U8dC5sZW5ndGg7ZSs9Myl0W2UrMl0/KGlzLnF1YWRyYXRpY0N1cnZlVG8odFtlXSx0W2UrMV0sdFtlKzNdLHRbZSs0XSksZSs9Myk6aXMubGluZVRvKHRbZV0sdFtlKzFdKTtpcy5jbG9zZVBhdGgoKTtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrPTIpe2NvbnN0IHI9ZVt0XSxuPWVbdCsxXTtpZighaXMuaXNQb2ludEluUGF0aChyLG4pKXJldHVybltyLG5dfXJldHVybiBudWxsfSx2cz0oZSx0LHIsbixpPSExKT0+e2NvbnN0IGE9aT8wOm4ubGVuZ3RoLTEscz1pP24ubGVuZ3RoLTE6bi5sZW5ndGgtMixvPWJzKGUsdCxyLG5bYV0pLGw9YnMoZSx0LHIsbltzXSk7aWYob1swXT09PWxbMF0mJm9bMV09PT1sWzFdfHxvWzBdPT09bFsyXSYmb1sxXT09PWxbM10pcmV0dXJuO2NvbnN0IGM9eHMobyxuW3NdKTtpZighYylyZXR1cm47Y29uc3QgdT14cyhsLG5bYV0pO3UmJm4uc3BsaWNlKC0xLDAsW2UsdCwhMSxjWzBdLGNbMV0sITEsdVswXSx1WzFdLCExLGUsdCwhMV0pfSx5cz0oZSx0LHIsbixpPSExKT0+e2NvbnN0IGE9aT8wOm4ubGVuZ3RoLTEscz1pP24ubGVuZ3RoLTE6bi5sZW5ndGgtMixvPWJzKGUsdCxyLG5bYV0pLGw9YnMoZSx0LHIsbltzXSksYz14cyhvLG5bc10pO2lmKCFjKXJldHVybjtjb25zdCB1PXhzKGwsblthXSk7aWYoIXUpcmV0dXJuO2NvbnN0IGY9TWF0aC5hdGFuMihjWzFdLXQsY1swXS1lKTtsZXQgZD1NYXRoLmF0YW4yKHVbMV0tdCx1WzBdLWUpLWY7ZD5NYXRoLlBJP2QtPTIqTWF0aC5QSTpkPC1NYXRoLlBJJiYoZCs9MipNYXRoLlBJKTtjb25zdCBoPWQvOCxwPVtlLHQsITFdO2ZvcihsZXQgbj0wO248PTg7bisrKXtjb25zdCBpPWYrbipoLGE9ZStyKk1hdGguY29zKGkpLHM9dCtyKk1hdGguc2luKGkpO3AucHVzaChhLHMsITEpfW4uc3BsaWNlKC0xLDAscCl9LF9zPShlLHQscixuLGksYT0hMSk9Pntjb25zdCBzPWE/MDppLmxlbmd0aC0xLG89YT9pLmxlbmd0aC0xOmkubGVuZ3RoLTIsbD1icyhlLngsZS55LG4saVtzXSksYz1icyhlLngsZS55LG4saVtvXSk7aWYobFswXT09PWNbMF0mJmxbMV09PT1jWzFdfHxsWzBdPT09Y1syXSYmbFsxXT09PWNbM10pcmV0dXJuO2NvbnN0IHU9eHMobCxpW29dKTtpZighdSlyZXR1cm47Y29uc3QgZj14cyhjLGlbc10pO2lmKCFmKXJldHVybjtjb25zdCBkPXQueC1lLngsaD10LnktZS55LHA9TWF0aC5oeXBvdChkLGgpLG09e3g6ZC9wLHk6aC9wfSxnPXIueC1lLngsYj1yLnktZS55LHg9TWF0aC5oeXBvdChnLGIpLHY9e3g6Zy94LHk6Yi94fSx5PW0ueCxfPW0ueSx3PXYueCxNPXYueSxQPXkqTS1fKnc7aWYoMD09PVApcmV0dXJuIHZvaWQgaS5zcGxpY2UoLTEsMCxbZS54LGUueSwhMSx1WzBdLHVbMV0sITEsZlswXSxmWzFdLCExXSk7Y29uc3QgUz0oKGZbMF0tdVswXSkqTS0oZlsxXS11WzFdKSp3KS9QLEY9dVswXStTKnksVD11WzFdK1MqXztpLnNwbGljZSgtMSwwLFtlLngsZS55LCExLHVbMF0sdVsxXSwhMSxGLFQsITEsZS54LGUueSwhMSxmWzBdLGZbMV0sITEsRixULCExXSl9LHdzPShlLHQpPT57Y29uc3Qgcj1hcztyLng9ZVswXSxyLnk9ZVsxXTtjb25zdCBuPXNzO24ueD0wLG4ueT0wO2NvbnN0IGk9b3M7aS54PTAsaS55PTA7Y29uc3QgYT1sczthLng9MCxhLnk9MDtjb25zdCBzPVtdO2ZvcihsZXQgbz0zO288ZS5sZW5ndGg7bys9Myl7Y29uc3QgbD1lW29dLGM9ZVtvKzFdO2lmKGVbbysyXSluLng9bCxuLnk9YztlbHNle2lmKGkueD1sLGkueT1jLGVbby0xXT9zLnB1c2gobXMocixuLGksdCkpOnMucHVzaChncyhyLGksdCkpLHMubGVuZ3RoPjEpc3dpdGNoKFFuLmpvaW50cyl7Y2FzZSAwOnZzKHIueCxyLnksdCxzKTticmVhaztjYXNlIDE6YS54PWVbby02XSxhLnk9ZVtvLTVdLF9zKHIsaSxhLHQscyk7YnJlYWs7Y2FzZSAyOnlzKHIueCxyLnksdCxzKX1yLng9aS54LHIueT1pLnl9fWNvbnN0IG89ZVswXSxsPWVbMV0sYz1lW2UubGVuZ3RoLTNdLHU9ZVtlLmxlbmd0aC0yXSxmPTFlLTQ7aWYoTWF0aC5hYnMoby1jKTxmJiZNYXRoLmFicyhsLXUpPGYmJnMubGVuZ3RoPjEpc3dpdGNoKFFuLmpvaW50cyl7Y2FzZSAwOnZzKG8sbCx0LHMsITApO2JyZWFrO2Nhc2UgMTpyLng9byxyLnk9bCxpLng9ZVszXSxpLnk9ZVs0XSxhLng9ZVtlLmxlbmd0aC02XSxhLnk9ZVtlLmxlbmd0aC01XSxfcyhyLGksYSx0LHMsITApO2JyZWFrO2Nhc2UgMjp5cyhvLGwsdCxzLCEwKX1lbHNlIGlmKHMubGVuZ3RoPjApc3dpdGNoKFFuLmNhcHMpe2Nhc2UgMTooKGUsdCxyKT0+e2NvbnN0IG49ZVswXSxpPWVbMV0sYT1lWzNdLHM9ZVs0XSxvPU1hdGguYXRhbjIoaS1zLG4tYSksbD1bbixpLCExXTtmb3IobGV0IGU9MDtlPD04O2UrKyl7Y29uc3Qgcj1vLU1hdGguUEkvMitlKk1hdGguUEkvODtsLnB1c2gobit0Kk1hdGguY29zKHIpLGkrdCpNYXRoLnNpbihyKSwhMSl9ci51bnNoaWZ0KGwpO2NvbnN0IGM9ZVtlLmxlbmd0aC0zXSx1PWVbZS5sZW5ndGgtMl0sZj1lW2UubGVuZ3RoLTZdLGQ9ZVtlLmxlbmd0aC01XSxoPU1hdGguYXRhbjIodS1kLGMtZikscD1bYyx1LCExXTtmb3IobGV0IGU9MDtlPD04O2UrKyl7Y29uc3Qgcj1oLU1hdGguUEkvMitlKk1hdGguUEkvODtwLnB1c2goYyt0Kk1hdGguY29zKHIpLHUrdCpNYXRoLnNpbihyKSwhMSl9ci5wdXNoKHApfSkoZSx0LHMpO2JyZWFrO2Nhc2UgMjooKGUsdCxyKT0+e2NvbnN0IG49ZVswXSxpPWVbMV0sYT1uLWVbM10scz1pLWVbNF0sbz1NYXRoLmh5cG90KGEscyk7aWYobz4wKXtjb25zdCBlPWEvbyxsPXMvbyxjPW4rZSp0LHU9aStsKnQsZj1bbi1sKnQsaStlKnQsITEsYy1sKnQsdStlKnQsITEsYytsKnQsdS1lKnQsITEsbitsKnQsaS1lKnQsITEsbi1sKnQsaStlKnQsITFdO3IudW5zaGlmdChmKX1jb25zdCBsPWVbZS5sZW5ndGgtM10sYz1lW2UubGVuZ3RoLTJdLHU9bC1lW2UubGVuZ3RoLTZdLGY9Yy1lW2UubGVuZ3RoLTVdLGQ9TWF0aC5oeXBvdCh1LGYpO2lmKGQ+MCl7Y29uc3QgZT11L2Qsbj1mL2QsaT1sK2UqdCxhPWMrbip0LHM9W2wtbip0LGMrZSp0LCExLGktbip0LGErZSp0LCExLGkrbip0LGEtZSp0LCExLGwrbip0LGMtZSp0LCExLGwtbip0LGMrZSp0LCExXTtyLnB1c2gocyl9fSkoZSx0LHMpfXJldHVybiBzfSxNcz1uZXcgTWFwO2xldCBQcz0wO2NvbnN0IFNzPW5ldyBXZWFrTWFwLEZzPWU9PntsZXQgdD1Tcy5nZXQoZSk7cmV0dXJuIHR8fCh0PWUuY3JlYXRlVmlldygpLFNzLnNldChlLHQpKSx0fSxUcz1uZXcgTWFwLEJzPW5ldyBNYXAsT3M9KGUsdCxyKT0+e2NvbnN0IG49YCR7dH1fJHtyfWAsaT1Ucy5nZXQobik7cmV0dXJuIGkmJmkubGVuZ3RoPjA/aS5wb3AoKTplLmNyZWF0ZVRleHR1cmUoe3NpemU6e3dpZHRoOnQsaGVpZ2h0OnJ9LGZvcm1hdDoicmdiYTh1bm9ybSIsdXNhZ2U6Nn0pfSxBcz1lPT57Y29uc3QgdD1gJHtlLndpZHRofV8ke2UuaGVpZ2h0fWA7bGV0IHI9VHMuZ2V0KHQpO3J8fChyPVtdLFRzLnNldCh0LHIpKSxyLnB1c2goZSl9LFJzPShlLHQscik9Pntjb25zdCBuPWAke3R9XyR7cn1gLGk9QnMuZ2V0KG4pO3JldHVybiBpJiZpLmxlbmd0aD4wP2kucG9wKCk6ZS5jcmVhdGVUZXh0dXJlKHtzaXplOnt3aWR0aDp0LGhlaWdodDpyfSxmb3JtYXQ6InJnYmE4dW5vcm0iLHVzYWdlOjIyfSl9LENzPWU9Pntjb25zdCB0PWAke2Uud2lkdGh9XyR7ZS5oZWlnaHR9YDtsZXQgcj1Ccy5nZXQodCk7cnx8KHI9W10sQnMuc2V0KHQscikpLHIucHVzaChlKX0sRXM9bmV3IE1hcCxVcz1uZXcgTWFwO2xldCAkcz0wO2NvbnN0IEdzPShlLHQscik9PmAke3R9XyR7cn1fJHtlLmpvaW4oIiwiKX1gLGtzPShlLHQscik9Pntjb25zdCBuPUdzKGUsdCxyKSxpPVVzLmdldChuKTtyZXR1cm4gaT8oaS5sYXN0VXNlZEZyYW1lPSRzLGkpOm51bGx9LExzPShlLHQscixuLGkpPT57Y29uc3QgYT1HcyhlLHQscik7VXMuc2V0KGEse3RleHR1cmU6bix2aWV3OmksbGFzdFVzZWRGcmFtZTokc30pfTtsZXQgSXM9bnVsbDtjb25zdCBWcz1lPT5lPD00PzI1NjplPD04PzUxMjoxMDI0LHpzPShlLHQscik9Pntjb25zdCBuPWUubGVuZ3RoLzUsaT1WcyhuKSxhPW5ldyBVaW50OEFycmF5KDQqaSk7Zm9yKGxldCB0PTA7dDxpO3QrKyl7Y29uc3Qgbj1qcyhlLHQvKGktMSkscikscz00KnQ7YVtzKzBdPU1hdGgucm91bmQoTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsbi5yKSkpLGFbcysxXT1NYXRoLnJvdW5kKE1hdGgubWF4KDAsTWF0aC5taW4oMjU1LG4uZykpKSxhW3MrMl09TWF0aC5yb3VuZChNYXRoLm1heCgwLE1hdGgubWluKDI1NSxuLmIpKSksYVtzKzNdPU1hdGgucm91bmQoTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsbi5hKSkpfXJldHVybiBhfSxqcz0oZSx0LHIpPT57Y29uc3Qgbj1lLmxlbmd0aC81O2xldCBpPTAsYT0wO2ZvcihsZXQgcj0wO3I8bjtyKyspe2NvbnN0IG49ZVs1KnJdO2lmKG48PXQmJihpPXIpLG4+PXQmJjA9PT1hKXthPXI7YnJlYWt9fWlmKDA9PT1hJiYoYT1uLTEpLGk9PT1hKXtjb25zdCB0PTUqaTtyZXR1cm57cjplW3QrMV0sZzplW3QrMl0sYjplW3QrM10sYTplW3QrNF19fWNvbnN0IHM9ZVs1KmldLG89KHQtcykvKGVbNSphXS1zKSxsPWVbNSppKzFdLGM9ZVs1KmkrMl0sdT1lWzUqaSszXSxmPWVbNSppKzRdLGQ9ZVs1KmErMV0saD1lWzUqYSsyXSxwPWVbNSphKzNdLG09ZVs1KmErNF07cmV0dXJuIDA9PT1yP3tyOjI1NSpXcyhEcyhOcyhsLzI1NSksTnMoZC8yNTUpLG8pKSxnOjI1NSpXcyhEcyhOcyhjLzI1NSksTnMoaC8yNTUpLG8pKSxiOjI1NSpXcyhEcyhOcyh1LzI1NSksTnMocC8yNTUpLG8pKSxhOkRzKGYsbSxvKX06e3I6RHMobCxkLG8pLGc6RHMoYyxoLG8pLGI6RHModSxwLG8pLGE6RHMoZixtLG8pfX0sRHM9KGUsdCxyKT0+ZSsodC1lKSpyLE5zPWU9Pk1hdGgucG93KGUsMi4yMzMzMzMzMyksV3M9ZT0+TWF0aC5wb3coZSwuNDU0NTQ1NDUpLHFzPShlLHQscik9Pntjb25zdCBuPW5ldyBVaW50OEFycmF5KDEwMjQpLGk9ZS5sZW5ndGgsYT1bXTtmb3IobGV0IG49MDtuPGk7bisrKXtjb25zdCBpPXRbbl07YS5wdXNoKHtvZmZzZXQ6ZVtuXS8yNTUscjooaT4+MTYmMjU1KS8yNTUsZzooaT4+OCYyNTUpLzI1NSxiOigyNTUmaSkvMjU1LGE6cltuXX0pfWZvcihsZXQgZT0wO2U8MjU2O2UrKyl7Y29uc3QgdD1lLzI1NTtsZXQgcj0wLHM9aS0xO2ZvcihsZXQgZT0wO2U8aS0xO2UrKylpZihhW2VdLm9mZnNldDw9dCYmYVtlKzFdLm9mZnNldD49dCl7cj1lLHM9ZSsxO2JyZWFrfWNvbnN0IG89YVtyXSxsPWFbc107bGV0IGM9MDtsLm9mZnNldCE9PW8ub2Zmc2V0JiYoYz0odC1vLm9mZnNldCkvKGwub2Zmc2V0LW8ub2Zmc2V0KSk7Y29uc3QgdT1EcyhvLnIsbC5yLGMpLGY9RHMoby5nLGwuZyxjKSxkPURzKG8uYixsLmIsYyksaD1EcyhvLmEsbC5hLGMpLHA9NCplO25bcCswXT1NYXRoLnJvdW5kKHUqaCoyNTUpLG5bcCsxXT1NYXRoLnJvdW5kKGYqaCoyNTUpLG5bcCsyXT1NYXRoLnJvdW5kKGQqaCoyNTUpLG5bcCszXT1NYXRoLnJvdW5kKDI1NSpoKX1yZXR1cm4gbn0sWHM9KGUsdCxyKT0+e2NvbnN0IG49ZVswXSxpPWVbMV0sYT1lWzJdLHM9ZVszXSxvPWVbNF0sbD1lWzVdO2lmKDA9PT1yKXtjb25zdCBlPS04MTkuMipuLTgxOS4yKmErbyx0PTgxOS4yKm4tODE5LjIqYStvLHI9LTgxOS4yKmktODE5LjIqcytsLGM9ODE5LjIqaS04MTkuMipzK2w7bGV0IHU9LTgxOS4yKm4rODE5LjIqYStvLWUsZj0tODE5LjIqaSs4MTkuMipzK2wtcjtjb25zdCBkPU1hdGguc3FydCh1KnUrZipmKTtkPyh1Lz1kLGYvPWQpOih1PTAsZj0wKTtjb25zdCBoPSh0LWUpKnUrKGMtcikqZixwPW5ldyBGbG9hdDMyQXJyYXkoW2UraCp1LHIraCpmLHQsY10pO3JldHVybntpbnZlcnNlTWF0cml4Om5ldyBGbG9hdDMyQXJyYXkoWzEsMCwwLDAsMSwwLDAsMCwxXSksbGluZWFyUG9pbnRzOnB9fWNvbnN0IGM9bipzLWkqYTtpZihNYXRoLmFicyhjKTwxZS0xMClyZXR1cm57aW52ZXJzZU1hdHJpeDpuZXcgRmxvYXQzMkFycmF5KFsxLDAsMCwwLDEsMCwwLDAsMV0pLGxpbmVhclBvaW50czpudWxsfTtjb25zdCB1PTEvYztyZXR1cm57aW52ZXJzZU1hdHJpeDpuZXcgRmxvYXQzMkFycmF5KFtzKnUsLWkqdSwwLC1hKnUsbip1LDAsKGEqbC1zKm8pKnUsKGkqby1uKmwpKnUsMV0pLGxpbmVhclBvaW50czpudWxsfX07bGV0IFlzPW51bGw7Y29uc3QgS3M9bmV3IEZsb2F0MzJBcnJheSgzNiksSHM9bmV3IEZsb2F0MzJBcnJheSgxNik7bGV0IFFzPW51bGwsWnM9bnVsbDtjb25zdCBKcz1be2JpbmRpbmc6MCxyZXNvdXJjZTp7YnVmZmVyOm51bGx9fSx7YmluZGluZzoxLHJlc291cmNlOm51bGx9LHtiaW5kaW5nOjIscmVzb3VyY2U6bnVsbH1dLGVvPShlLHQpPT57Y29uc3Qgcj1lWzBdLG49ZVsxXSxpPWVbMl0sYT1lWzNdLHM9ZVs0XSxvPWVbNV0sbD10WzBdLGM9dFsxXSx1PXRbM10sZj10WzRdLGQ9dFs2XSxoPXRbN10scD1sKnIrdSpuLG09bCppK3UqYSxnPWMqcitmKm4sYj1jKmkrZiphLHg9bCpzK3UqbytkLHY9YypzK2YqbytoLHk9cCpiLW0qZztpZihNYXRoLmFicyh5KTwxZS0xMClyZXR1cm4gbmV3IEZsb2F0MzJBcnJheShbMSwwLDAsMCwxLDAsMCwwLDFdKTtjb25zdCBfPTEveSx3PWIqXyxNPS1tKl8sUD0tZypfLFM9cCpfO3JldHVybiBuZXcgRmxvYXQzMkFycmF5KFt3KmwrTSpjLFAqbCtTKmMsMCx3KnUrTSpmLFAqdStTKmYsMCx3KmQrTSpoKyhtKnYtYip4KSpfLFAqZCtTKmgrKGcqeC1wKnYpKl8sMV0pfSx0bz1uZXcgTWFwLHJvPW5ldyBGbG9hdDMyQXJyYXkoMzIpLG5vPW5ldyBGbG9hdDMyQXJyYXkoMTYpO2xldCBpbz1udWxsLGFvPW51bGw7Y29uc3Qgc289W3tiaW5kaW5nOjAscmVzb3VyY2U6e2J1ZmZlcjpudWxsfX0se2JpbmRpbmc6MSxyZXNvdXJjZTpudWxsfSx7YmluZGluZzoyLHJlc291cmNlOm51bGx9XSxvbz0oZSx0LHIsbixpLGEscyxvLGwsYyx1LGYsZCxoLHAsbSxnPSExLGI9MSk9Pntjb25zdCB4PW5zKGkpO2lmKDA9PT14LmluZGV4Q291bnQpcmV0dXJuIG51bGw7Y29uc3Qgdj1yLmFjcXVpcmVWZXJ0ZXhCdWZmZXIoeC5idWZmZXIuYnl0ZUxlbmd0aCx4LmJ1ZmZlcikseT1PcyhlLGMsdSk7ZS5xdWV1ZS53cml0ZVRleHR1cmUoe3RleHR1cmU6eX0sby5idWZmZXIse2J5dGVzUGVyUm93OjQqYyxyb3dzUGVySW1hZ2U6dSxvZmZzZXQ6by5ieXRlT2Zmc2V0fSx7d2lkdGg6YyxoZWlnaHQ6dX0pO2NvbnN0IF89ZW8obCxhKSx3PXNbMF0sTT1zWzFdLFA9c1syXSxTPXNbM10sRj1hWzBdLFQ9YVsxXSxCPWFbM10sTz1hWzRdLEE9YVs2XSxSPWFbN107cm9bMF09X1swXSxyb1sxXT1fWzFdLHJvWzJdPV9bMl0scm9bM109MCxyb1s0XT1fWzNdLHJvWzVdPV9bNF0scm9bNl09X1s1XSxyb1s3XT0wLHJvWzhdPV9bNl0scm9bOV09X1s3XSxyb1sxMF09X1s4XSxyb1sxMV09MCxyb1sxMl09Yyxyb1sxM109dSxyb1sxNF09Zj8xOjAscm9bMTVdPTAscm9bMTZdPXcscm9bMTddPU0scm9bMThdPVAscm9bMTldPVMscm9bMjBdPUYvaCxyb1syMV09VC9wLHJvWzIyXT0wLHJvWzIzXT0wLHJvWzI0XT1CL2gscm9bMjVdPU8vcCxyb1syNl09MCxyb1syN109MCxyb1syOF09QS9oLHJvWzI5XT1SL3Ascm9bMzBdPTEscm9bMzFdPTA7Y29uc3QgQz1yLmFjcXVpcmVBbmRXcml0ZVVuaWZvcm1CdWZmZXIocm8pLEU9YGJpdG1hcF8ke2Q/InMiOiJuIn1fJHtmPyJyIjoiYyJ9YDtsZXQgVT10by5nZXQoRSk7VXx8KFU9ZS5jcmVhdGVTYW1wbGVyKHttYWdGaWx0ZXI6ZD8ibGluZWFyIjoibmVhcmVzdCIsbWluRmlsdGVyOmQ/ImxpbmVhciI6Im5lYXJlc3QiLGFkZHJlc3NNb2RlVTpmPyJyZXBlYXQiOiJjbGFtcC10by1lZGdlIixhZGRyZXNzTW9kZVY6Zj8icmVwZWF0IjoiY2xhbXAtdG8tZWRnZSJ9KSx0by5zZXQoRSxVKSk7Y29uc3QgJD1uLmdldEJpbmRHcm91cExheW91dCgiYml0bWFwX2ZpbGwiKTtpZighJClyZXR1cm4gY29uc29sZS5lcnJvcigiW1dlYkdQVV0gYml0bWFwX2ZpbGwgYmluZCBncm91cCBsYXlvdXQgbm90IGZvdW5kIiksQXMoeSksbnVsbDtzb1swXS5yZXNvdXJjZS5idWZmZXI9Qyxzb1sxXS5yZXNvdXJjZT1VLHNvWzJdLnJlc291cmNlPXkuY3JlYXRlVmlldygpO2NvbnN0IEc9ZS5jcmVhdGVCaW5kR3JvdXAoe2xheW91dDokLGVudHJpZXM6c299KTtpZihtJiZnKXtjb25zdCBpPW4uZ2V0UGlwZWxpbmUoInN0ZW5jaWxfd3JpdGUiKTtpZihpKXtjb25zdCBhPSgoKT0+e2NvbnN0IHQ9bi5nZXRCaW5kR3JvdXBMYXlvdXQoImZpbGxfZHluYW1pYyIpO2lmKCF0KXJldHVybiBudWxsO25vWzBdPXcsbm9bMV09TSxub1syXT1QLG5vWzNdPVMsbm9bNF09Ri9oLG5vWzVdPVQvcCxub1s2XT0wLG5vWzddPTAsbm9bOF09Qi9oLG5vWzldPU8vcCxub1sxMF09MCxub1sxMV09MCxub1sxMl09QS9oLG5vWzEzXT1SL3Asbm9bMTRdPTEsbm9bMTVdPTA7Y29uc3QgaT1yLmR5bmFtaWNVbmlmb3JtLmFsbG9jYXRlKG5vKSxhPXIuZHluYW1pY1VuaWZvcm0uZ2V0QnVmZmVyKCk7cmV0dXJuIGlvJiZhbz09PWF8fChpbz1lLmNyZWF0ZUJpbmRHcm91cCh7bGF5b3V0OnQsZW50cmllczpbe2JpbmRpbmc6MCxyZXNvdXJjZTp7YnVmZmVyOmEsc2l6ZToyNTZ9fV19KSxhbz1hKSx7YmluZEdyb3VwOmlvLG9mZnNldDppfX0pKCk7YSYmKHQuc2V0UGlwZWxpbmUoaSksdC5zZXRTdGVuY2lsUmVmZXJlbmNlKDApLHQuc2V0VmVydGV4QnVmZmVyKDAsdiksdC5zZXRCaW5kR3JvdXAoMCxhLmJpbmRHcm91cCxbYS5vZmZzZXRdKSx0LmRyYXcoeC5pbmRleENvdW50LDEsMCwwKSl9Y29uc3QgYT1uLmdldFBpcGVsaW5lKCJiaXRtYXBfZmlsbF9zdGVuY2lsIik7YSYmKHQuc2V0UGlwZWxpbmUoYSksdC5zZXRTdGVuY2lsUmVmZXJlbmNlKDApLHQuc2V0QmluZEdyb3VwKDAsRyksdC5kcmF3KHguaW5kZXhDb3VudCwxLDAsMCkpfWVsc2V7bGV0IGU7aWYobSllPSJiaXRtYXBfZmlsbCI7ZWxzZSBpZihnKXtpZihEYSgpKXJldHVybiBBcyh5KSxudWxsO2U9ImJpdG1hcF9maWxsX2JncmFfc3RlbmNpbCJ9ZWxzZSBlPSJiaXRtYXBfZmlsbF9iZ3JhIjtjb25zdCByPW4uZ2V0UGlwZWxpbmUoZSk7aWYoIXIpcmV0dXJuIGNvbnNvbGUuZXJyb3IoYFtXZWJHUFVdICR7ZX0gcGlwZWxpbmUgbm90IGZvdW5kYCksQXMoeSksbnVsbDt0LnNldFBpcGVsaW5lKHIpLHQuc2V0VmVydGV4QnVmZmVyKDAsdiksdC5zZXRCaW5kR3JvdXAoMCxHKSwhZ3x8bXx8RGEoKXx8dC5zZXRTdGVuY2lsUmVmZXJlbmNlKEthKCkpLHQuZHJhdyh4LmluZGV4Q291bnQsMSwwLDApfXJldHVybiB5fSxsbz0oZSx0LHIpPT57Y29uc3Qgbj1lLmxlbmd0aC01O2ZvcihsZXQgaT0zO2k8bjtpKz0zKXtsZXQgbj00KnI7ZVtpKzJdPyh0W24rK109ZVtpLTNdLHRbbisrXT1lW2ktMl0sdFtuKytdPS41LHRbbisrXT0uNSx0W24rK109ZVtpXSx0W24rK109ZVtpKzFdLHRbbisrXT0uNSx0W24rK109LjUsdFtuKytdPWVbaSszXSx0W24rK109ZVtpKzRdLHRbbisrXT0uNSx0W24rK109LjUpOmVbaSs1XT8odFtuKytdPWVbMF0sdFtuKytdPWVbMV0sdFtuKytdPS41LHRbbisrXT0uNSx0W24rK109ZVtpXSx0W24rK109ZVtpKzFdLHRbbisrXT0uNSx0W24rK109LjUsdFtuKytdPWVbaSs2XSx0W24rK109ZVtpKzddLHRbbisrXT0uNSx0W24rK109LjUpOih0W24rK109ZVswXSx0W24rK109ZVsxXSx0W24rK109LjUsdFtuKytdPS41LHRbbisrXT1lW2ldLHRbbisrXT1lW2krMV0sdFtuKytdPS41LHRbbisrXT0uNSx0W24rK109ZVtpKzNdLHRbbisrXT1lW2krNF0sdFtuKytdPS41LHRbbisrXT0uNSkscis9M31yZXR1cm4gcn07bGV0IGNvPW5ldyBGbG9hdDMyQXJyYXkoMzIpO2xldCB1bz1udWxsO2NvbnN0IGZvPW5ldyBGbG9hdDMyQXJyYXkoMzYpLGhvPVt7YmluZGluZzowLHJlc291cmNlOntidWZmZXI6bnVsbH19LHtiaW5kaW5nOjEscmVzb3VyY2U6bnVsbH0se2JpbmRpbmc6MixyZXNvdXJjZTpudWxsfV0scG89KGUsdCxyLG4saSxhLHMsbyxsLGMsdSxmLGQsaCxwLG0sZyxiKT0+e2NvbnN0IHg9KChlLHQpPT57Y29uc3Qgcj10LzIsbj1bXTtmb3IoY29uc3QgdCBvZiBlKXtjb25zdCBlPXdzKHQscik7Zm9yKGNvbnN0IHQgb2YgZSluLnB1c2godCl9bGV0IGk9MDtmb3IoY29uc3QgZSBvZiBuKXtjb25zdCB0PWUubGVuZ3RoLTU7Zm9yKGxldCBlPTM7ZTx0O2UrPTMpaSs9M31pZigwPT09aSlyZXR1cm57YnVmZmVyOm5ldyBGbG9hdDMyQXJyYXkoMCksaW5kZXhDb3VudDowfTtjb25zdCBhPTQqaTt2YXIgcztjby5sZW5ndGg8YSYmKGNvPW5ldyBGbG9hdDMyQXJyYXkoKHM9YSxzLS0sc3w9cz4+MSxzfD1zPj4yLHN8PXM+PjQsc3w9cz4+OCxzfD1zPj4xNiwrK3MpKSk7Y29uc3Qgbz1jbztsZXQgbD0wO2Zvcihjb25zdCBlIG9mIG4pbD1sbyhlLG8sbCk7cmV0dXJue2J1ZmZlcjpvLnN1YmFycmF5KDAsNCpsKSxpbmRleENvdW50Omx9fSkoaSxhKTtpZigwPT09eC5pbmRleENvdW50KXJldHVybiBudWxsO2NvbnN0IHY9ci5hY3F1aXJlVmVydGV4QnVmZmVyKHguYnVmZmVyLmJ5dGVMZW5ndGgseC5idWZmZXIpO2xldCB5LF87Y29uc3Qgdz1rcyhjLGYsZCk7aWYodyl5PXcudGV4dHVyZSxfPXcudmlldztlbHNle2NvbnN0IHQ9enMoYywwLGQpLHI9Yy5sZW5ndGgvNSxuPVZzKHIpO3k9T3MoZSxuLDEpLGUucXVldWUud3JpdGVUZXh0dXJlKHt0ZXh0dXJlOnl9LHQse2J5dGVzUGVyUm93OjQqbixyb3dzUGVySW1hZ2U6MX0se3dpZHRoOm4saGVpZ2h0OjF9KSxfPXkuY3JlYXRlVmlldygpLExzKGMsZixkLHksXyl9Y29uc3QgTT1Ycyh1LDAsbCksUD1vWzNdPjA/b1szXToxLFM9c1swXSxGPXNbMV0sVD1zWzNdLEI9c1s0XSxPPXNbNl0sQT1zWzddO2ZvWzBdPU0uaW52ZXJzZU1hdHJpeFswXSxmb1sxXT1NLmludmVyc2VNYXRyaXhbM10sZm9bMl09MCxmb1szXT0wLGZvWzRdPU0uaW52ZXJzZU1hdHJpeFsxXSxmb1s1XT1NLmludmVyc2VNYXRyaXhbNF0sZm9bNl09MCxmb1s3XT0wLGZvWzhdPU0uaW52ZXJzZU1hdHJpeFs2XSxmb1s5XT1NLmludmVyc2VNYXRyaXhbN10sZm9bMTBdPTEsZm9bMTFdPTAsZm9bMTJdPWwsZm9bMTNdPU1hdGgubWF4KC0uOTc1LE1hdGgubWluKC45NzUsaCkpLGZvWzE0XT1mLGZvWzE1XT04MTkuMixNLmxpbmVhclBvaW50cz8oZm9bMTZdPU0ubGluZWFyUG9pbnRzWzBdLGZvWzE3XT1NLmxpbmVhclBvaW50c1sxXSxmb1sxOF09TS5saW5lYXJQb2ludHNbMl0sZm9bMTldPU0ubGluZWFyUG9pbnRzWzNdKTooZm9bMTZdPTAsZm9bMTddPTAsZm9bMThdPTAsZm9bMTldPTApLGZvWzIwXT0xLGZvWzIxXT0xLGZvWzIyXT0xLGZvWzIzXT1QLGZvWzI0XT1TL3AsZm9bMjVdPUYvbSxmb1syNl09MCxmb1syN109MCxmb1syOF09VC9wLGZvWzI5XT1CL20sZm9bMzBdPTAsZm9bMzFdPTAsZm9bMzJdPU8vcCxmb1szM109QS9tLGZvWzM0XT0xLGZvWzM1XT0wO2NvbnN0IFI9ci5hY3F1aXJlQW5kV3JpdGVVbmlmb3JtQnVmZmVyKGZvKTt1b3x8KHVvPWUuY3JlYXRlU2FtcGxlcih7bWFnRmlsdGVyOiJsaW5lYXIiLG1pbkZpbHRlcjoibGluZWFyIixhZGRyZXNzTW9kZVU6ImNsYW1wLXRvLWVkZ2UiLGFkZHJlc3NNb2RlVjoiY2xhbXAtdG8tZWRnZSJ9KSk7Y29uc3QgQz11byxFPW4uZ2V0QmluZEdyb3VwTGF5b3V0KCJncmFkaWVudF9maWxsIik7aWYoIUUpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIltXZWJHUFVdIGdyYWRpZW50X2ZpbGwgYmluZCBncm91cCBsYXlvdXQgbm90IGZvdW5kIiksbnVsbDtob1swXS5yZXNvdXJjZS5idWZmZXI9Uixob1sxXS5yZXNvdXJjZT1DLGhvWzJdLnJlc291cmNlPV87Y29uc3QgVT1lLmNyZWF0ZUJpbmRHcm91cCh7bGF5b3V0OkUsZW50cmllczpob30pLCQ9Yj9nPyJncmFkaWVudF9zdHJva2VfYXRsYXMiOiJncmFkaWVudF9zdHJva2VfYmdyYSI6Zz8iZ3JhZGllbnRfZmlsbCI6ImdyYWRpZW50X2ZpbGxfYmdyYSIsRz1uLmdldEdyYWRpZW50UGlwZWxpbmUoJCxsLGYpO3JldHVybiBHPyh0LnNldFBpcGVsaW5lKEcpLHQuc2V0VmVydGV4QnVmZmVyKDAsdiksdC5zZXRCaW5kR3JvdXAoMCxVKSx0LmRyYXcoeC5pbmRleENvdW50LDEsMCwwKSxudWxsKTooY29uc29sZS5lcnJvcihgW1dlYkdQVV0gJHskfSBwaXBlbGluZSBub3QgZm91bmRgKSxudWxsKX07bGV0IG1vPW5ldyBGbG9hdDMyQXJyYXkoMzIpO2NvbnN0IGdvPW5ldyBNYXAsYm89bmV3IEZsb2F0MzJBcnJheSgzMikseG89W3tiaW5kaW5nOjAscmVzb3VyY2U6e2J1ZmZlcjpudWxsfX0se2JpbmRpbmc6MSxyZXNvdXJjZTpudWxsfSx7YmluZGluZzoyLHJlc291cmNlOm51bGx9XSx2bz0oZSx0LHIsbixpLGEscyxvLGwsYyx1LGYsZCxoLHAsbSxnLGIpPT57Y29uc3QgeD0oKGUsdCk9Pntjb25zdCByPXQvMixuPVtdO2Zvcihjb25zdCB0IG9mIGUpe2NvbnN0IGU9d3ModCxyKTtmb3IoY29uc3QgdCBvZiBlKW4ucHVzaCh0KX1sZXQgaT0wO2Zvcihjb25zdCBlIG9mIG4pe2NvbnN0IHQ9ZS5sZW5ndGgtNTtmb3IobGV0IGU9MztlPHQ7ZSs9MylpKz0zfWlmKDA9PT1pKXJldHVybntidWZmZXI6bmV3IEZsb2F0MzJBcnJheSgwKSxpbmRleENvdW50OjB9O2NvbnN0IGE9NCppO3ZhciBzO21vLmxlbmd0aDxhJiYobW89bmV3IEZsb2F0MzJBcnJheSgocz1hLHMtLSxzfD1zPj4xLHN8PXM+PjIsc3w9cz4+NCxzfD1zPj44LHN8PXM+PjE2LCsrcykpKTtjb25zdCBvPW1vO2xldCBsPTA7Zm9yKGNvbnN0IGUgb2YgbilsPWxvKGUsbyxsKTtyZXR1cm57YnVmZmVyOm8uc3ViYXJyYXkoMCw0KmwpLGluZGV4Q291bnQ6bH19KShpLGEpO2lmKDA9PT14LmluZGV4Q291bnQpcmV0dXJuIG51bGw7Y29uc3Qgdj1yLmFjcXVpcmVWZXJ0ZXhCdWZmZXIoeC5idWZmZXIuYnl0ZUxlbmd0aCx4LmJ1ZmZlcikseT1PcyhlLHUsZik7ZS5xdWV1ZS53cml0ZVRleHR1cmUoe3RleHR1cmU6eX0sbC5idWZmZXIse2J5dGVzUGVyUm93OjQqdSxyb3dzUGVySW1hZ2U6ZixvZmZzZXQ6bC5ieXRlT2Zmc2V0fSx7d2lkdGg6dSxoZWlnaHQ6Zn0pO2NvbnN0IF89ZW8oYyxzKSx3PW9bM10+MD9vWzNdOjEsTT1zWzBdLFA9c1sxXSxTPXNbM10sRj1zWzRdLFQ9c1s2XSxCPXNbN107Ym9bMF09X1swXSxib1sxXT1fWzFdLGJvWzJdPV9bMl0sYm9bM109MCxib1s0XT1fWzNdLGJvWzVdPV9bNF0sYm9bNl09X1s1XSxib1s3XT0wLGJvWzhdPV9bNl0sYm9bOV09X1s3XSxib1sxMF09X1s4XSxib1sxMV09MCxib1sxMl09dSxib1sxM109Zixib1sxNF09ZD8xOjAsYm9bMTVdPTAsYm9bMTZdPTEsYm9bMTddPTEsYm9bMThdPTEsYm9bMTldPXcsYm9bMjBdPU0vcCxib1syMV09UC9tLGJvWzIyXT0wLGJvWzIzXT0wLGJvWzI0XT1TL3AsYm9bMjVdPUYvbSxib1syNl09MCxib1syN109MCxib1syOF09VC9wLGJvWzI5XT1CL20sYm9bMzBdPTEsYm9bMzFdPTA7Y29uc3QgTz1yLmFjcXVpcmVBbmRXcml0ZVVuaWZvcm1CdWZmZXIoYm8pLEE9YGJpdG1hcF8ke2g/InMiOiJuIn1fJHtkPyJyIjoiYyJ9YDtsZXQgUj1nby5nZXQoQSk7Unx8KFI9ZS5jcmVhdGVTYW1wbGVyKHttYWdGaWx0ZXI6aD8ibGluZWFyIjoibmVhcmVzdCIsbWluRmlsdGVyOmg/ImxpbmVhciI6Im5lYXJlc3QiLGFkZHJlc3NNb2RlVTpkPyJyZXBlYXQiOiJjbGFtcC10by1lZGdlIixhZGRyZXNzTW9kZVY6ZD8icmVwZWF0IjoiY2xhbXAtdG8tZWRnZSJ9KSxnby5zZXQoQSxSKSk7Y29uc3QgQz1uLmdldEJpbmRHcm91cExheW91dCgiYml0bWFwX2ZpbGwiKTtpZighQylyZXR1cm4gY29uc29sZS5lcnJvcigiW1dlYkdQVV0gYml0bWFwX2ZpbGwgYmluZCBncm91cCBsYXlvdXQgbm90IGZvdW5kIiksQXMoeSksbnVsbDt4b1swXS5yZXNvdXJjZS5idWZmZXI9Tyx4b1sxXS5yZXNvdXJjZT1SLHhvWzJdLnJlc291cmNlPXkuY3JlYXRlVmlldygpO2NvbnN0IEU9ZS5jcmVhdGVCaW5kR3JvdXAoe2xheW91dDpDLGVudHJpZXM6eG99KSxVPWI/Zz8iYml0bWFwX3N0cm9rZV9hdGxhcyI6ImJpdG1hcF9zdHJva2VfYmdyYSI6Zz8iYml0bWFwX2ZpbGwiOiJiaXRtYXBfZmlsbF9iZ3JhIiwkPW4uZ2V0UGlwZWxpbmUoVSk7cmV0dXJuICQ/KHQuc2V0UGlwZWxpbmUoJCksdC5zZXRWZXJ0ZXhCdWZmZXIoMCx2KSx0LnNldEJpbmRHcm91cCgwLEUpLHQuZHJhdyh4LmluZGV4Q291bnQsMSwwLDApLHkpOihjb25zb2xlLmVycm9yKGBbV2ViR1BVXSAke1V9IHBpcGVsaW5lIG5vdCBmb3VuZGApLEFzKHkpLG51bGwpfSx5bz1uZXcgRmxvYXQzMkFycmF5KFstMSwtMSwuNSwuNSwxLC0xLC41LC41LC0xLDEsLjUsLjUsLTEsMSwuNSwuNSwxLC0xLC41LC41LDEsMSwuNSwuNV0pLF9vPW5ldyBGbG9hdDMyQXJyYXkoWzEsMSwxLDEsLjUsMCwwLDAsMCwuNSwwLDAsLjUsLjUsMSwwXSksd289bmV3IEZsb2F0MzJBcnJheSgxNiksTW89KGUsdCxyLG4saSxhLHMsbyxsLGM9ITEpPT57Y29uc3QgdT1pLmNsaXBMZXZlbCxmPWkud2lkdGgsZD1pLmhlaWdodCxoPW9bMF0scD1vWzFdLG09b1syXSxnPW9bM10qbDtpZigwPT09YS5sZW5ndGgpcmV0dXJuO2NvbnN0IGI9bnMoYSk7aWYoMD09PWIuaW5kZXhDb3VudClyZXR1cm47Y29uc3QgeD1yLmFjcXVpcmVWZXJ0ZXhCdWZmZXIoYi5idWZmZXIuYnl0ZUxlbmd0aCxiLmJ1ZmZlciksdj1zWzBdLHk9c1sxXSxfPXNbM10sdz1zWzRdLE09c1s2XSxQPXNbN107d29bMF09aCx3b1sxXT1wLHdvWzJdPW0sd29bM109Zyx3b1s0XT12L2Ysd29bNV09eS9kLHdvWzZdPTAsd29bN109MCx3b1s4XT1fL2Ysd29bOV09dy9kLHdvWzEwXT0wLHdvWzExXT0wLHdvWzEyXT1NL2Ysd29bMTNdPVAvZCx3b1sxNF09MSx3b1sxNV09MDtjb25zdCBTPXIuZHluYW1pY1VuaWZvcm0uYWxsb2NhdGUod28pO2xldCBGLFQ9UWEuZ2V0KHUpPz91O2lmKGMpe0Y9YGNsaXBfd3JpdGVfbWFpbl8ke01hdGgubWluKDgsTWF0aC5tYXgoMSxUKSl9YH1lbHNlIEY9ImNsaXBfd3JpdGUiO2NvbnN0IEI9bi5nZXRQaXBlbGluZShGKTtpZighQilyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKGBbV2ViR1BVXSAke0Z9IHBpcGVsaW5lIG5vdCBmb3VuZGApO2NvbnN0IE89bi5nZXRCaW5kR3JvdXBMYXlvdXQoImZpbGxfZHluYW1pYyIpO2lmKCFPKXJldHVybjtjb25zdCBBPWUuY3JlYXRlQmluZEdyb3VwKHtsYXlvdXQ6TyxlbnRyaWVzOlt7YmluZGluZzowLHJlc291cmNlOntidWZmZXI6ci5keW5hbWljVW5pZm9ybS5nZXRCdWZmZXIoKSxzaXplOjI1Nn19XX0pO3Quc2V0UGlwZWxpbmUoQiksdC5zZXRTdGVuY2lsUmVmZXJlbmNlKDApLHQuc2V0VmVydGV4QnVmZmVyKDAseCksdC5zZXRCaW5kR3JvdXAoMCxBLFtTXSksdC5kcmF3KGIuaW5kZXhDb3VudCwxLDAsMCksVCsrLFQ+OCYmKCgoZSx0LHIsbixpKT0+e2lmKCFpKXJldHVybjtjb25zdCBhPWkuY2xpcExldmVsLHM9MTw8YS0xLG89ci5hY3F1aXJlVmVydGV4QnVmZmVyKHlvLmJ5dGVMZW5ndGgseW8pLGw9ci5keW5hbWljVW5pZm9ybS5hbGxvY2F0ZShfbyksYz1uLmdldEJpbmRHcm91cExheW91dCgiZmlsbF9keW5hbWljIik7aWYoIWMpcmV0dXJuO2NvbnN0IHU9ZS5jcmVhdGVCaW5kR3JvdXAoe2xheW91dDpjLGVudHJpZXM6W3tiaW5kaW5nOjAscmVzb3VyY2U6e2J1ZmZlcjpyLmR5bmFtaWNVbmlmb3JtLmdldEJ1ZmZlcigpLHNpemU6MjU2fX1dfSksZj1uLmdldFBpcGVsaW5lKGBtYXNrX3VuaW9uX21lcmdlXyR7YX1gKTtmJiYodC5zZXRQaXBlbGluZShmKSx0LnNldFN0ZW5jaWxSZWZlcmVuY2UocyksdC5zZXRWZXJ0ZXhCdWZmZXIoMCxvKSx0LnNldEJpbmRHcm91cCgwLHUsW2xdKSx0LmRyYXcoNiwxLDAsMCkpO2NvbnN0IGQ9bi5nZXRQaXBlbGluZShgbWFza191bmlvbl9jbGVhcl8ke2F9YCk7ZCYmKHQuc2V0UGlwZWxpbmUoZCksdC5zZXRTdGVuY2lsUmVmZXJlbmNlKDApLHQuc2V0VmVydGV4QnVmZmVyKDAsbyksdC5zZXRCaW5kR3JvdXAoMCx1LFtsXSksdC5kcmF3KDYsMSwwLDApKX0pKGUsdCxyLG4saSksVD11KzEpLFFhLnNldCh1LFQpfTtsZXQgUG89bnVsbCxTbz1udWxsO2xldCBGbz1udWxsLFRvPW51bGw7Y29uc3QgQm89bmV3IEZsb2F0MzJBcnJheSgxMiksT289W3tiaW5kaW5nOjAscmVzb3VyY2U6e2J1ZmZlcjpudWxsfX0se2JpbmRpbmc6MSxyZXNvdXJjZTpudWxsfSx7YmluZGluZzoyLHJlc291cmNlOm51bGx9LHtiaW5kaW5nOjMscmVzb3VyY2U6bnVsbH1dLEFvPShlLHQscixuLGkpPT57Y29uc3R7ZGV2aWNlOmEsY29tbWFuZEVuY29kZXI6cyxmcmFtZUJ1ZmZlck1hbmFnZXI6byxwaXBlbGluZU1hbmFnZXI6bCx0ZXh0dXJlTWFuYWdlcjpjfT1pLHU9TWF0aC5tYXgoZS53aWR0aCx0LndpZHRoKSxmPU1hdGgubWF4KGUuaGVpZ2h0LHQuaGVpZ2h0KSxkPW8uY3JlYXRlVGVtcG9yYXJ5QXR0YWNobWVudCh1LGYpLGg9bC5nZXRQaXBlbGluZSgiY29tcGxleF9ibGVuZCIpLHA9bC5nZXRCaW5kR3JvdXBMYXlvdXQoImNvbXBsZXhfYmxlbmQiKTtpZighaHx8IXApcmV0dXJuIGNvbnNvbGUuZXJyb3IoYFtXZWJHUFUgQ29tcGxleEJsZW5kXSBQaXBlbGluZSBub3QgZm91bmQgZm9yIGJsZW5kIG1vZGU6ICR7cn1gKSxlO2NvbnN0IG09Yy5jcmVhdGVTYW1wbGVyKCJjb21wbGV4X2JsZW5kX3NhbXBsZXIiLCEwKSxnPWZhLmdldEJsZW5kTW9kZUluZGV4KHIpO0JvWzBdPW5bMF0sQm9bMV09blsxXSxCb1syXT1uWzJdLEJvWzNdPW5bM10sQm9bNF09bls0XSxCb1s1XT1uWzVdLEJvWzZdPW5bNl0sQm9bN109bls3XSxCb1s4XT1nLEJvWzldPTAsQm9bMTBdPTAsQm9bMTFdPTA7Y29uc3QgYj1pLmJ1ZmZlck1hbmFnZXI/aS5idWZmZXJNYW5hZ2VyLmFjcXVpcmVBbmRXcml0ZVVuaWZvcm1CdWZmZXIoQm8pOmEuY3JlYXRlQnVmZmVyKHtzaXplOjQ4LHVzYWdlOkdQVUJ1ZmZlclVzYWdlLlVOSUZPUk18R1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1R9KTtpLmJ1ZmZlck1hbmFnZXJ8fGEucXVldWUud3JpdGVCdWZmZXIoYiwwLEJvKSxPb1swXS5yZXNvdXJjZS5idWZmZXI9YixPb1sxXS5yZXNvdXJjZT1tLE9vWzJdLnJlc291cmNlPXQudGV4dHVyZS52aWV3LE9vWzNdLnJlc291cmNlPWUudGV4dHVyZS52aWV3O2NvbnN0IHg9YS5jcmVhdGVCaW5kR3JvdXAoe2xheW91dDpwLGVudHJpZXM6T299KSx2PW8uY3JlYXRlUmVuZGVyUGFzc0Rlc2NyaXB0b3IoZC50ZXh0dXJlLnZpZXcsMCwwLDAsMCwiY2xlYXIiKSx5PXMuYmVnaW5SZW5kZXJQYXNzKHYpO3JldHVybiB5LnNldFBpcGVsaW5lKGgpLHkuc2V0QmluZEdyb3VwKDAseCkseS5kcmF3KDYsMSwwLDApLHkuZW5kKCksZH0sUm89bmV3IEZsb2F0MzJBcnJheSg0KSxDbz1uZXcgRmxvYXQzMkFycmF5KDYpLEVvPW5ldyBGbG9hdDMyQXJyYXkoOCksVW89bmV3IEZsb2F0MzJBcnJheSgxMiksJG89W3tiaW5kaW5nOjAscmVzb3VyY2U6e2J1ZmZlcjpudWxsfX0se2JpbmRpbmc6MSxyZXNvdXJjZTpudWxsfSx7YmluZGluZzoyLHJlc291cmNlOm51bGx9XSxHbz0oZSx0LHIsbixpLGEscyxvLGwsYyx1LGYsZCxoKT0+e2NvbnN0IHA9ZC5nZXRQaXBlbGluZSgiY29tcGxleF9ibGVuZF9jb3B5IiksbT1kLmdldEJpbmRHcm91cExheW91dCgidGV4dHVyZV9jb3B5Iik7aWYoIXB8fCFtKXJldHVybjtSb1swXT1sL3MsUm9bMV09Yy9vLFJvWzJdPWkvcyxSb1szXT1hL287Y29uc3QgZz1oLmFjcXVpcmVBbmRXcml0ZVVuaWZvcm1CdWZmZXIoUm8pLGI9Zi5jcmVhdGVTYW1wbGVyKCJjb21wbGV4X2JsZW5kX2NvcHlfc2FtcGxlciIsITEpOyRvWzBdLnJlc291cmNlLmJ1ZmZlcj1nLCRvWzFdLnJlc291cmNlPWIsJG9bMl0ucmVzb3VyY2U9cjtjb25zdCB4PWUuY3JlYXRlQmluZEdyb3VwKHtsYXlvdXQ6bSxlbnRyaWVzOiRvfSksdj11LmNyZWF0ZVJlbmRlclBhc3NEZXNjcmlwdG9yKG4udGV4dHVyZS52aWV3LDAsMCwwLDAsImNsZWFyIikseT10LmJlZ2luUmVuZGVyUGFzcyh2KTt5LnNldFBpcGVsaW5lKHApLHkuc2V0QmluZEdyb3VwKDAseCkseS5kcmF3KDYsMSwwLDApLHkuZW5kKCl9LGtvPShlLHQscixuLGksYSxzLG8sbCxjKT0+e2NvbnN0IHU9bi5tc2FhJiZuLm1zYWFUZXh0dXJlPy52aWV3LGY9dT8iY29tcGxleF9ibGVuZF9vdXRwdXRfbXNhYSI6ImNvbXBsZXhfYmxlbmRfb3V0cHV0IixkPWwuZ2V0UGlwZWxpbmUoZiksaD1sLmdldEJpbmRHcm91cExheW91dCgicG9zaXRpb25lZF90ZXh0dXJlIik7aWYoIWR8fCFoKXJldHVybjtFb1swXT1pLEVvWzFdPWEsRW9bMl09ci53aWR0aCxFb1szXT1yLmhlaWdodCxFb1s0XT1uLndpZHRoLEVvWzVdPW4uaGVpZ2h0LEVvWzZdPTAsRW9bN109MDtjb25zdCBwPWMuYWNxdWlyZUFuZFdyaXRlVW5pZm9ybUJ1ZmZlcihFbyksbT1vLmNyZWF0ZVNhbXBsZXIoImNvbXBsZXhfYmxlbmRfb3V0cHV0X3NhbXBsZXIiLCExKTskb1swXS5yZXNvdXJjZS5idWZmZXI9cCwkb1sxXS5yZXNvdXJjZT1tLCRvWzJdLnJlc291cmNlPXIudGV4dHVyZS52aWV3O2NvbnN0IGc9ZS5jcmVhdGVCaW5kR3JvdXAoe2xheW91dDpoLGVudHJpZXM6JG99KSxiPXU/bi5tc2FhVGV4dHVyZS52aWV3Om4udGV4dHVyZS52aWV3LHg9dT9uLnRleHR1cmUudmlldzpudWxsLHY9cy5jcmVhdGVSZW5kZXJQYXNzRGVzY3JpcHRvcihiLDAsMCwwLDAsImxvYWQiLHgpLHk9dC5iZWdpblJlbmRlclBhc3Modik7eS5zZXRQaXBlbGluZShkKSx5LnNldEJpbmRHcm91cCgwLGcpLHkuZHJhdyg2LDEsMCwwKSx5LmVuZCgpfSxMbz0oZSx0LHIsbixpLGEscyk9Pntjb25zdCBvPSRhO2lmKDA9PT1vLmxlbmd0aClyZXR1cm47aWYoIXJ8fCFyLnRleHR1cmUpcmV0dXJuIHZvaWQgTGEoKTtjb25zdCBsPXdhKCl8fG4uZ2V0QXR0YWNobWVudCgiYXRsYXMiKTtpZihsJiZsLnRleHR1cmUpe2Zvcihjb25zdCBjIG9mIG8pe2NvbnN0e25vZGU6byx4X21pbjp1LHlfbWluOmYseF9tYXg6ZCx5X21heDpoLGNvbG9yX3RyYW5zZm9ybTpwLG1hdHJpeDptLGJsZW5kX21vZGU6ZyxnbG9iYWxfYWxwaGE6Yn09Yyx4PU1hdGguY2VpbChNYXRoLmFicyhkLXUpKSx2PU1hdGguY2VpbChNYXRoLmFicyhoLWYpKTtpZih4PD0wfHx2PD0wKWNvbnRpbnVlO2NvbnN0IHk9TWF0aC5tYXgoMCxNYXRoLmZsb29yKG1bNl0pKSxfPU1hdGgubWF4KDAsTWF0aC5mbG9vcihtWzddKSk7aWYoeT49ci53aWR0aHx8Xz49ci5oZWlnaHQpY29udGludWU7Y29uc3Qgdz0xIT09bVswXXx8MCE9PW1bMV18fDAhPT1tWzNdfHwxIT09bVs0XSxNPXc/eDpvLncsUD13P3Y6by5oLFM9TWF0aC5taW4oTSxyLndpZHRoLXkpLEY9TWF0aC5taW4oUCxyLmhlaWdodC1fKTtpZihTPD0wfHxGPD0wKWNvbnRpbnVlO2xldCBUO2lmKHcpe1Q9bi5jcmVhdGVUZW1wb3JhcnlBdHRhY2htZW50KE0sUCk7Y29uc3Qgcj1hLmdldFBpcGVsaW5lKCJjb21wbGV4X2JsZW5kX3NjYWxlIiksYz1hLmdldEJpbmRHcm91cExheW91dCgidGV4dHVyZV9zY2FsZSIpO2lmKHImJmMpe2NvbnN0IGE9TS8yLHU9UC8yLGY9by53LzIsZD1vLmgvMjtDb1swXT1tWzBdLENvWzFdPW1bMV0sQ29bMl09bVszXSxDb1szXT1tWzRdLENvWzRdPS1mKm1bMF0tZCptWzNdK2EsQ29bNV09LWYqbVsxXS1kKm1bNF0rdTtjb25zdCBoPW4uY3JlYXRlVGVtcG9yYXJ5QXR0YWNobWVudChvLncsby5oKTt0LmNvcHlUZXh0dXJlVG9UZXh0dXJlKHt0ZXh0dXJlOmwudGV4dHVyZS5yZXNvdXJjZSxvcmlnaW46e3g6by54LHk6by55LHo6MH19LHt0ZXh0dXJlOmgudGV4dHVyZS5yZXNvdXJjZSxvcmlnaW46e3g6MCx5OjAsejowfX0se3dpZHRoOm8udyxoZWlnaHQ6by5ofSksVW9bMF09Q29bMF0sVW9bMV09Q29bMV0sVW9bMl09Q29bMl0sVW9bM109Q29bM10sVW9bNF09Q29bNF0sVW9bNV09Q29bNV0sVW9bNl09by53LFVvWzddPW8uaCxVb1s4XT1NLFVvWzldPVAsVW9bMTBdPTAsVW9bMTFdPTA7Y29uc3QgcD1zLmFjcXVpcmVBbmRXcml0ZVVuaWZvcm1CdWZmZXIoVW8sNDgpLGc9aS5jcmVhdGVTYW1wbGVyKCJzY2FsZV9zYW1wbGVyIiwhMCk7JG9bMF0ucmVzb3VyY2UuYnVmZmVyPXAsJG9bMV0ucmVzb3VyY2U9Zywkb1syXS5yZXNvdXJjZT1oLnRleHR1cmUudmlldztjb25zdCBiPWUuY3JlYXRlQmluZEdyb3VwKHtsYXlvdXQ6YyxlbnRyaWVzOiRvfSkseD1uLmNyZWF0ZVJlbmRlclBhc3NEZXNjcmlwdG9yKFQudGV4dHVyZS52aWV3LDAsMCwwLDAsImNsZWFyIiksdj10LmJlZ2luUmVuZGVyUGFzcyh4KTt2LnNldFBpcGVsaW5lKHIpLHYuc2V0QmluZEdyb3VwKDAsYiksdi5kcmF3KDYsMSwwLDApLHYuZW5kKCksbi5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChoKX1lbHNlIHQuY29weVRleHR1cmVUb1RleHR1cmUoe3RleHR1cmU6bC50ZXh0dXJlLnJlc291cmNlLG9yaWdpbjp7eDpvLngseTpvLnksejowfX0se3RleHR1cmU6VC50ZXh0dXJlLnJlc291cmNlLG9yaWdpbjp7eDowLHk6MCx6OjB9fSx7d2lkdGg6TWF0aC5taW4oby53LE0pLGhlaWdodDpNYXRoLm1pbihvLmgsUCl9KX1lbHNlIFQ9bi5jcmVhdGVUZW1wb3JhcnlBdHRhY2htZW50KE0sUCksdC5jb3B5VGV4dHVyZVRvVGV4dHVyZSh7dGV4dHVyZTpsLnRleHR1cmUucmVzb3VyY2Usb3JpZ2luOnt4Om8ueCx5Om8ueSx6OjB9fSx7dGV4dHVyZTpULnRleHR1cmUucmVzb3VyY2Usb3JpZ2luOnt4OjAseTowLHo6MH19LHt3aWR0aDpNLGhlaWdodDpQfSk7Y29uc3QgQj1uLmNyZWF0ZVRlbXBvcmFyeUF0dGFjaG1lbnQoTSxQKTtHbyhlLHQsci50ZXh0dXJlLnZpZXcsQix5LF8sci53aWR0aCxyLmhlaWdodCxNLFAsbixpLGEscyksRW9bMF09cFswXSxFb1sxXT1wWzFdLEVvWzJdPXBbMl0sRW9bM109YixFb1s0XT1wWzRdLEVvWzVdPXBbNV0sRW9bNl09cFs2XSxFb1s3XT0wO2NvbnN0IE89QW8oVCxCLGcsRW8se2RldmljZTplLGNvbW1hbmRFbmNvZGVyOnQsYnVmZmVyTWFuYWdlcjpzLGZyYW1lQnVmZmVyTWFuYWdlcjpuLHBpcGVsaW5lTWFuYWdlcjphLHRleHR1cmVNYW5hZ2VyOml9KTtrbyhlLHQsTyxyLHksXyxuLGksYSxzKSxuLnJlbGVhc2VUZW1wb3JhcnlBdHRhY2htZW50KFQpLG4ucmVsZWFzZVRlbXBvcmFyeUF0dGFjaG1lbnQoQiksbi5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChPKX1MYSgpfWVsc2UgTGEoKX0sSW89e3g6MCx5OjB9LFZvPVsuNSwxLjA1LDEuNCwxLjU1LDEuNzUsMS45LDIsMi4xNSwyLjIsMi4zLDIuNSwzLDMsMy41LDMuNV0sem89bmV3IEZsb2F0MzJBcnJheSg4KSxqbz1be2JpbmRpbmc6MCxyZXNvdXJjZTpudWxsfSx7YmluZGluZzoxLHJlc291cmNlOm51bGx9LHtiaW5kaW5nOjIscmVzb3VyY2U6e2J1ZmZlcjpudWxsfX1dLERvPXtsYWJlbDoiYmx1cl9jb21wdXRlX3Bhc3NfaCJ9LE5vPXtsYWJlbDoiYmx1cl9jb21wdXRlX3Bhc3NfdiJ9LFdvPShlLHQscixuLGksYSxzLG8pPT57Y29uc3QgbD1NYXRoLmNlaWwoLjUqcyksYz1sPj04JiZsPD0yND9hPyJibHVyX2NvbXB1dGVfc2hhcmVkX2hvcml6b250YWwiOiJibHVyX2NvbXB1dGVfc2hhcmVkX3ZlcnRpY2FsIjphPyJibHVyX2NvbXB1dGVfaG9yaXpvbnRhbCI6ImJsdXJfY29tcHV0ZV92ZXJ0aWNhbCIsdT1yLmdldFBpcGVsaW5lKGMpLGY9ci5nZXRCaW5kR3JvdXBMYXlvdXQoImJsdXJfY29tcHV0ZSIpO2lmKCF1fHwhZilyZXR1cm47Y29uc3QgZD0xLShsLS41KnMpLGg9MStzO3pvWzBdPWE/MTowLHpvWzFdPWE/MDoxLHpvWzJdPWwsem9bM109ZCx6b1s0XT1uLndpZHRoLHpvWzVdPW4uaGVpZ2h0LHpvWzZdPWgsem9bN109MDtjb25zdCBwPW8/by5hY3F1aXJlQW5kV3JpdGVVbmlmb3JtQnVmZmVyKHpvKTooKCk9Pntjb25zdCB0PWUuY3JlYXRlQnVmZmVyKHtzaXplOnpvLmJ5dGVMZW5ndGgsdXNhZ2U6R1BVQnVmZmVyVXNhZ2UuVU5JRk9STXxHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVH0pO3JldHVybiBlLnF1ZXVlLndyaXRlQnVmZmVyKHQsMCx6byksdH0pKCk7am9bMF0ucmVzb3VyY2U9bi50ZXh0dXJlLnZpZXcsam9bMV0ucmVzb3VyY2U9aS50ZXh0dXJlLnZpZXcsam9bMl0ucmVzb3VyY2UuYnVmZmVyPXA7Y29uc3QgbT1lLmNyZWF0ZUJpbmRHcm91cCh7bGF5b3V0OmYsZW50cmllczpqb30pLGc9dC5iZWdpbkNvbXB1dGVQYXNzKGE/RG86Tm8pO2cuc2V0UGlwZWxpbmUodSksZy5zZXRCaW5kR3JvdXAoMCxtKTtjb25zdCBiPU1hdGguY2VpbChpLndpZHRoLzE2KSx4PU1hdGguY2VpbChpLmhlaWdodC8xNik7Zy5kaXNwYXRjaFdvcmtncm91cHMoYix4LDEpLGcuZW5kKCl9LHFvPW5ldyBGbG9hdDMyQXJyYXkoNCksWG89W3tiaW5kaW5nOjAscmVzb3VyY2U6e2J1ZmZlcjpudWxsfX0se2JpbmRpbmc6MSxyZXNvdXJjZTpudWxsfSx7YmluZGluZzoyLHJlc291cmNlOm51bGx9XSxZbz0oZSx0LHIsbixpLGEscyk9Pntjb25zdHtkZXZpY2U6byxjb21tYW5kRW5jb2RlcjpsLGZyYW1lQnVmZmVyTWFuYWdlcjpjLHBpcGVsaW5lTWFuYWdlcjp1LHRleHR1cmVNYW5hZ2VyOmZ9PXMsZD0oKGUsdCxyLG4saSk9Pntjb25zdCBhPXQqKE1hdGguc3FydChlWzBdKmVbMF0rZVsxXSplWzFdKS9pKSxzPXIqKE1hdGguc3FydChlWzJdKmVbMl0rZVszXSplWzNdKS9pKSxvPVZvW01hdGgubWluKG4tMSxWby5sZW5ndGgtMSldO2xldCBsPTEsYz0xO3JldHVybiBhPjEyOD9sPS4wNjI1OmE+NjQ/bD0uMTI1OmE+MzI/bD0uMjU6YT4xNiYmKGw9LjUpLHM+MTI4P2M9LjA2MjU6cz42ND9jPS4xMjU6cz4zMj9jPS4yNTpzPjE2JiYoYz0uNSkse2Jhc2VCbHVyWDphLGJhc2VCbHVyWTpzLG9mZnNldFg6TWF0aC5yb3VuZChhKm8pLG9mZnNldFk6TWF0aC5yb3VuZChzKm8pLGJ1ZmZlclNjYWxlWDpsLGJ1ZmZlclNjYWxlWTpjfX0pKHQscixuLGksYSkse2Jhc2VCbHVyWDpoLGJhc2VCbHVyWTpwLG9mZnNldFg6bSxvZmZzZXRZOmcsYnVmZmVyU2NhbGVYOmIsYnVmZmVyU2NhbGVZOnh9PWQ7SW8ueCs9bSxJby55Kz1nO2NvbnN0IHY9ZS53aWR0aCsyKm0seT1lLmhlaWdodCsyKmcsXz1NYXRoLmNlaWwodipiKSx3PU1hdGguY2VpbCh5KngpLE09Yy5jcmVhdGVUZW1wb3JhcnlBdHRhY2htZW50KF8sdyksUD1jLmNyZWF0ZVRlbXBvcmFyeUF0dGFjaG1lbnQoXyx3KSxTPWYuY3JlYXRlU2FtcGxlcigiYmx1cl9zYW1wbGVyIiwhMCk7S28obyxsLGMsdSxlLE0sUyxiLHgsbSpiLGcqeCxzLmJ1ZmZlck1hbmFnZXIpO2NvbnN0IEY9aCpiLFQ9cCp4LEI9cy5jb21wdXRlUGlwZWxpbmVNYW5hZ2VyJiYoKGUsdCxyLG4pPT57Y29uc3QgaT1NYXRoLm1heChlLHQpLGE9TWF0aC5taW4ocixuKTtyZXR1cm4gaT49NCYmYT49MTI4fSkoaCxwLF8sdyksTz1bTSxQXTtsZXQgQT0wO2ZvcihsZXQgZT0wO2U8aTsrK2Upe2lmKHI+MCl7Y29uc3QgZT1BO0E9KEErMSklMixCP1dvKG8sbCxzLmNvbXB1dGVQaXBlbGluZU1hbmFnZXIsT1tlXSxPW0FdLCEwLEYscy5idWZmZXJNYW5hZ2VyKTpIbyhvLGwsYyx1LE9bZV0sT1tBXSxTLCEwLEYscy5idWZmZXJNYW5hZ2VyKX1pZihuPjApe2NvbnN0IGU9QTtBPShBKzEpJTIsQj9XbyhvLGwscy5jb21wdXRlUGlwZWxpbmVNYW5hZ2VyLE9bZV0sT1tBXSwhMSxULHMuYnVmZmVyTWFuYWdlcik6SG8obyxsLGMsdSxPW2VdLE9bQV0sUywhMSxULHMuYnVmZmVyTWFuYWdlcil9fWxldCBSPU9bQV07aWYoMSE9PWJ8fDEhPT14KXtjb25zdCBlPWMuY3JlYXRlVGVtcG9yYXJ5QXR0YWNobWVudCh2LHkpO1FvKG8sbCxjLHUsUixlLFMsMS9iLDEveCxzLmJ1ZmZlck1hbmFnZXIpLGMucmVsZWFzZVRlbXBvcmFyeUF0dGFjaG1lbnQoTSksYy5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChQKSxSPWV9ZWxzZXtjb25zdCBlPShBKzEpJTI7Yy5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChPW2VdKX1yZXR1cm4gUn0sS289KGUsdCxyLG4saSxhLHMsbyxsLGMsdSxmKT0+e2NvbnN0IGQ9bi5nZXRQaXBlbGluZSgidGV4dHVyZV9jb3B5X3JnYmE4IiksaD1uLmdldEJpbmRHcm91cExheW91dCgidGV4dHVyZV9jb3B5Iik7aWYoIWR8fCFoKXJldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoIltXZWJHUFUgQmx1ckZpbHRlcl0gdGV4dHVyZV9jb3B5X3JnYmE4IHBpcGVsaW5lIG5vdCBmb3VuZCIpO2NvbnN0IHA9aS53aWR0aCpvLG09aS5oZWlnaHQqbDtxb1swXT0xLHFvWzFdPTEscW9bMl09MCxxb1szXT0wO2NvbnN0IGc9Zj9mLmFjcXVpcmVBbmRXcml0ZVVuaWZvcm1CdWZmZXIocW8pOmUuY3JlYXRlQnVmZmVyKHtzaXplOnFvLmJ5dGVMZW5ndGgsdXNhZ2U6R1BVQnVmZmVyVXNhZ2UuVU5JRk9STXxHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVH0pO2Z8fGUucXVldWUud3JpdGVCdWZmZXIoZywwLHFvKSxYb1swXS5yZXNvdXJjZS5idWZmZXI9ZyxYb1sxXS5yZXNvdXJjZT1zLFhvWzJdLnJlc291cmNlPWkudGV4dHVyZS52aWV3O2NvbnN0IGI9ZS5jcmVhdGVCaW5kR3JvdXAoe2xheW91dDpoLGVudHJpZXM6WG99KSx4PXIuY3JlYXRlUmVuZGVyUGFzc0Rlc2NyaXB0b3IoYS50ZXh0dXJlLnZpZXcsMCwwLDAsMCwiY2xlYXIiKSx2PXQuYmVnaW5SZW5kZXJQYXNzKHgpO3Yuc2V0UGlwZWxpbmUoZCksdi5zZXRCaW5kR3JvdXAoMCxiKSx2LnNldFZpZXdwb3J0KGMsdSxwLG0sMCwxKSx2LnNldFNjaXNzb3JSZWN0KE1hdGguZmxvb3IoYyksTWF0aC5mbG9vcih1KSxNYXRoLmNlaWwocCksTWF0aC5jZWlsKG0pKSx2LmRyYXcoNiwxLDAsMCksdi5lbmQoKX0sSG89KGUsdCxyLG4saSxhLHMsbyxsLGMpPT57Y29uc3QgdT0oKGUsdCxyLG4pPT57Y29uc3QgaT1NYXRoLmNlaWwoLjUqdCk7cmV0dXJue29mZnNldFg6ZT8xL3I6MCxvZmZzZXRZOmU/MDoxL24sZnJhY3Rpb246MS0oaS0uNSp0KSxzYW1wbGVzOjErdCxoYWxmQmx1cjppfX0pKG8sbCxpLndpZHRoLGkuaGVpZ2h0KSx7b2Zmc2V0WDpmLG9mZnNldFk6ZCxmcmFjdGlvbjpoLHNhbXBsZXM6cCxoYWxmQmx1cjptfT11LGc9TWF0aC5tYXgoMSxNYXRoLm1pbigxNixtKSksYj1uLmdldFBpcGVsaW5lKGBibHVyX2ZpbHRlcl8ke2d9YCkseD1uLmdldEJpbmRHcm91cExheW91dCgiYmx1cl9maWx0ZXIiKTtpZighYnx8IXgpcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcihgW1dlYkdQVSBCbHVyRmlsdGVyXSBibHVyX2ZpbHRlcl8ke2d9IHBpcGVsaW5lIG5vdCBmb3VuZGApO3FvWzBdPWYscW9bMV09ZCxxb1syXT1oLHFvWzNdPXA7Y29uc3Qgdj1jP2MuYWNxdWlyZUFuZFdyaXRlVW5pZm9ybUJ1ZmZlcihxbyk6ZS5jcmVhdGVCdWZmZXIoe3NpemU6cW8uYnl0ZUxlbmd0aCx1c2FnZTpHUFVCdWZmZXJVc2FnZS5VTklGT1JNfEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNUfSk7Y3x8ZS5xdWV1ZS53cml0ZUJ1ZmZlcih2LDAscW8pLFhvWzBdLnJlc291cmNlLmJ1ZmZlcj12LFhvWzFdLnJlc291cmNlPXMsWG9bMl0ucmVzb3VyY2U9aS50ZXh0dXJlLnZpZXc7Y29uc3QgeT1lLmNyZWF0ZUJpbmRHcm91cCh7bGF5b3V0OngsZW50cmllczpYb30pLF89ci5jcmVhdGVSZW5kZXJQYXNzRGVzY3JpcHRvcihhLnRleHR1cmUudmlldywwLDAsMCwwLCJjbGVhciIpLHc9dC5iZWdpblJlbmRlclBhc3MoXyk7dy5zZXRQaXBlbGluZShiKSx3LnNldEJpbmRHcm91cCgwLHkpLHcuZHJhdyg2LDEsMCwwKSx3LmVuZCgpfSxRbz0oZSx0LHIsbixpLGEscyxvLGwsYyk9Pntjb25zdCB1PW4uZ2V0UGlwZWxpbmUoInRleHR1cmVfY29weV9yZ2JhOCIpLGY9bi5nZXRCaW5kR3JvdXBMYXlvdXQoInRleHR1cmVfY29weSIpO2lmKCF1fHwhZilyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJbV2ViR1BVIEJsdXJGaWx0ZXJdIHRleHR1cmVfY29weV9yZ2JhOCBwaXBlbGluZSBub3QgZm91bmQiKTtxb1swXT0xLHFvWzFdPTEscW9bMl09MCxxb1szXT0wO2NvbnN0IGQ9Yz9jLmFjcXVpcmVBbmRXcml0ZVVuaWZvcm1CdWZmZXIocW8pOmUuY3JlYXRlQnVmZmVyKHtzaXplOnFvLmJ5dGVMZW5ndGgsdXNhZ2U6R1BVQnVmZmVyVXNhZ2UuVU5JRk9STXxHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVH0pO2N8fGUucXVldWUud3JpdGVCdWZmZXIoZCwwLHFvKSxYb1swXS5yZXNvdXJjZS5idWZmZXI9ZCxYb1sxXS5yZXNvdXJjZT1zLFhvWzJdLnJlc291cmNlPWkudGV4dHVyZS52aWV3O2NvbnN0IGg9ZS5jcmVhdGVCaW5kR3JvdXAoe2xheW91dDpmLGVudHJpZXM6WG99KSxwPXIuY3JlYXRlUmVuZGVyUGFzc0Rlc2NyaXB0b3IoYS50ZXh0dXJlLnZpZXcsMCwwLDAsMCwiY2xlYXIiKSxtPXQuYmVnaW5SZW5kZXJQYXNzKHApO20uc2V0UGlwZWxpbmUodSksbS5zZXRCaW5kR3JvdXAoMCxoKSxtLmRyYXcoNiwxLDAsMCksbS5lbmQoKX0sWm89bmV3IEZsb2F0MzJBcnJheSgyMCksSm89W3tiaW5kaW5nOjAscmVzb3VyY2U6e2J1ZmZlcjpudWxsfX0se2JpbmRpbmc6MSxyZXNvdXJjZTpudWxsfSx7YmluZGluZzoyLHJlc291cmNlOm51bGx9XSxlbD0oZSx0LHIpPT57Y29uc3R7ZGV2aWNlOm4sY29tbWFuZEVuY29kZXI6aSxmcmFtZUJ1ZmZlck1hbmFnZXI6YSxwaXBlbGluZU1hbmFnZXI6cyx0ZXh0dXJlTWFuYWdlcjpvfT1yLGw9YS5jcmVhdGVUZW1wb3JhcnlBdHRhY2htZW50KGUud2lkdGgsZS5oZWlnaHQpLGM9cy5nZXRQaXBlbGluZSgiY29sb3JfbWF0cml4X2ZpbHRlciIpLHU9cy5nZXRCaW5kR3JvdXBMYXlvdXQoImNvbG9yX21hdHJpeF9maWx0ZXIiKTtpZighY3x8IXUpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIltXZWJHUFUgQ29sb3JNYXRyaXhGaWx0ZXJdIFBpcGVsaW5lIG5vdCBmb3VuZCIpLGU7Y29uc3QgZj1vLmNyZWF0ZVNhbXBsZXIoImNvbG9yX21hdHJpeF9zYW1wbGVyIiwhMCk7Wm9bMF09dFswXSxab1sxXT10WzVdLFpvWzJdPXRbMTBdLFpvWzNdPXRbMTVdLFpvWzRdPXRbMV0sWm9bNV09dFs2XSxab1s2XT10WzExXSxab1s3XT10WzE2XSxab1s4XT10WzJdLFpvWzldPXRbN10sWm9bMTBdPXRbMTJdLFpvWzExXT10WzE3XSxab1sxMl09dFszXSxab1sxM109dFs4XSxab1sxNF09dFsxM10sWm9bMTVdPXRbMThdLFpvWzE2XT10WzRdLzI1NSxab1sxN109dFs5XS8yNTUsWm9bMThdPXRbMTRdLzI1NSxab1sxOV09dFsxOV0vMjU1O2NvbnN0IGQ9ci5idWZmZXJNYW5hZ2VyP3IuYnVmZmVyTWFuYWdlci5hY3F1aXJlQW5kV3JpdGVVbmlmb3JtQnVmZmVyKFpvKTpuLmNyZWF0ZUJ1ZmZlcih7c2l6ZTpaby5ieXRlTGVuZ3RoLHVzYWdlOkdQVUJ1ZmZlclVzYWdlLlVOSUZPUk18R1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1R9KTtyLmJ1ZmZlck1hbmFnZXJ8fG4ucXVldWUud3JpdGVCdWZmZXIoZCwwLFpvKSxKb1swXS5yZXNvdXJjZS5idWZmZXI9ZCxKb1sxXS5yZXNvdXJjZT1mLEpvWzJdLnJlc291cmNlPWUudGV4dHVyZS52aWV3O2NvbnN0IGg9bi5jcmVhdGVCaW5kR3JvdXAoe2xheW91dDp1LGVudHJpZXM6Sm99KSxwPWEuY3JlYXRlUmVuZGVyUGFzc0Rlc2NyaXB0b3IobC50ZXh0dXJlLnZpZXcsMCwwLDAsMCwiY2xlYXIiKSxtPWkuYmVnaW5SZW5kZXJQYXNzKHApO3JldHVybiBtLnNldFBpcGVsaW5lKGMpLG0uc2V0QmluZEdyb3VwKDAsaCksbS5kcmF3KDYsMSwwLDApLG0uZW5kKCksbH0sdGw9bmV3IEZsb2F0MzJBcnJheSgxNikscmw9W3tiaW5kaW5nOjAscmVzb3VyY2U6e2J1ZmZlcjpudWxsfX0se2JpbmRpbmc6MSxyZXNvdXJjZTpudWxsfSx7YmluZGluZzoyLHJlc291cmNlOm51bGx9LHtiaW5kaW5nOjMscmVzb3VyY2U6bnVsbH1dLG5sPShlLHQscixuLGksYSxzLG8sbCxjLHUsZik9Pntjb25zdHtkZXZpY2U6ZCxjb21tYW5kRW5jb2RlcjpoLGZyYW1lQnVmZmVyTWFuYWdlcjpwLHBpcGVsaW5lTWFuYWdlcjptLHRleHR1cmVNYW5hZ2VyOmd9PWYsYj1Jby54LHg9SW8ueSx2PWUud2lkdGgseT1lLmhlaWdodCxfPVlvKGUsdCxpLGEsbyx1LGYpLHc9Xy53aWR0aCxNPV8uaGVpZ2h0LFA9bD92OncsUz1sP3k6TSxGPUlvLngtYixUPUlvLnkteCxCPVAvdixPPVMveSxBPShsPzA6RikvdixSPShsPzA6VCkveSxDPVAvdyxFPVMvTSxVPShsPy1GOjApL3csJD0obD8tVDowKS9NLEc9cC5jcmVhdGVUZW1wb3JhcnlBdHRhY2htZW50KFAsUyksaz1tLmdldEZpbHRlclBpcGVsaW5lKCJnbG93X2ZpbHRlciIse0lTX0lOTkVSOmw/MTowLElTX0tOT0NLT1VUOmM/MTowfSksTD1tLmdldEJpbmRHcm91cExheW91dCgiZ2xvd19maWx0ZXIiKTtpZigha3x8IUwpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIltXZWJHUFUgR2xvd0ZpbHRlcl0gUGlwZWxpbmUgbm90IGZvdW5kIikscC5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChfKSxlO2NvbnN0IEk9Zy5jcmVhdGVTYW1wbGVyKCJnbG93X3NhbXBsZXIiLCEwKSxbVix6LGosRF09KChlLHQpPT5bKGU+PjE2JjI1NSkvMjU1KnQsKGU+PjgmMjU1KS8yNTUqdCwoMjU1JmUpLzI1NSp0LHRdKShyLG4pO3RsWzBdPVYsdGxbMV09eix0bFsyXT1qLHRsWzNdPUQsdGxbNF09Qix0bFs1XT1PLHRsWzZdPUEsdGxbN109Uix0bFs4XT1DLHRsWzldPUUsdGxbMTBdPVUsdGxbMTFdPSQsdGxbMTJdPXMsdGxbMTNdPWw/MTowLHRsWzE0XT1jPzE6MCx0bFsxNV09MDtjb25zdCBOPWYuYnVmZmVyTWFuYWdlcj9mLmJ1ZmZlck1hbmFnZXIuYWNxdWlyZUFuZFdyaXRlVW5pZm9ybUJ1ZmZlcih0bCk6ZC5jcmVhdGVCdWZmZXIoe3NpemU6dGwuYnl0ZUxlbmd0aCx1c2FnZTpHUFVCdWZmZXJVc2FnZS5VTklGT1JNfEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNUfSk7Zi5idWZmZXJNYW5hZ2VyfHxkLnF1ZXVlLndyaXRlQnVmZmVyKE4sMCx0bCkscmxbMF0ucmVzb3VyY2UuYnVmZmVyPU4scmxbMV0ucmVzb3VyY2U9SSxybFsyXS5yZXNvdXJjZT1fLnRleHR1cmUudmlldyxybFszXS5yZXNvdXJjZT1lLnRleHR1cmUudmlldztjb25zdCBXPWQuY3JlYXRlQmluZEdyb3VwKHtsYXlvdXQ6TCxlbnRyaWVzOnJsfSkscT1wLmNyZWF0ZVJlbmRlclBhc3NEZXNjcmlwdG9yKEcudGV4dHVyZS52aWV3LDAsMCwwLDAsImNsZWFyIiksWD1oLmJlZ2luUmVuZGVyUGFzcyhxKTtyZXR1cm4gWC5zZXRQaXBlbGluZShrKSxYLnNldEJpbmRHcm91cCgwLFcpLFguZHJhdyg2LDEsMCwwKSxYLmVuZCgpLHAucmVsZWFzZVRlbXBvcmFyeUF0dGFjaG1lbnQoXyksR30saWw9TWF0aC5QSS8xODAsYWw9bmV3IEZsb2F0MzJBcnJheSgxNiksc2w9W3tiaW5kaW5nOjAscmVzb3VyY2U6e2J1ZmZlcjpudWxsfX0se2JpbmRpbmc6MSxyZXNvdXJjZTpudWxsfSx7YmluZGluZzoyLHJlc291cmNlOm51bGx9LHtiaW5kaW5nOjMscmVzb3VyY2U6bnVsbH1dLG9sPShlLHQscixuLGksYSxzLG8sbCxjLHUsZixkLGgscCk9Pntjb25zdHtkZXZpY2U6bSxjb21tYW5kRW5jb2RlcjpnLGZyYW1lQnVmZmVyTWFuYWdlcjpiLHBpcGVsaW5lTWFuYWdlcjp4LHRleHR1cmVNYW5hZ2VyOnZ9PXAseT1Jby54LF89SW8ueSx3PWUud2lkdGgsTT1lLmhlaWdodCxQPVlvKGUsdCxzLG8sYyxoLHApLFM9UC53aWR0aCxGPVAuaGVpZ2h0LFQ9SW8ueCxCPUlvLnksTz1ULXksQT1CLV8sUj1NYXRoLnNxcnQodFswXSp0WzBdK3RbMV0qdFsxXSksQz1NYXRoLnNxcnQodFsyXSp0WzJdK3RbM10qdFszXSksRT1uKmlsLFU9TWF0aC5jb3MoRSkqciooUi9oKSwkPU1hdGguc2luKEUpKnIqKEMvaCksRz11P3c6UytNYXRoLm1heCgwLE1hdGguYWJzKFUpLU8pLGs9dT9NOkYrTWF0aC5tYXgoMCxNYXRoLmFicygkKS1BKSxMPU1hdGguY2VpbChHKSxJPU1hdGguY2VpbChrKSxWPShMLUcpLzIsej0oSS1rKS8yLGo9dT8wOk1hdGgubWF4KDAsTy1VKStWLEQ9dT8wOk1hdGgubWF4KDAsQS0kKSt6LE49dT9VLVQ6KFU+MD9NYXRoLm1heCgwLFUtTyk6MCkrVixXPXU/JC1COigkPjA/TWF0aC5tYXgoMCwkLUEpOjApK3oscT1iLmNyZWF0ZVRlbXBvcmFyeUF0dGFjaG1lbnQoTCxJKSxYPXU7bGV0IFk9ZixLPWQ7dT9ZPWZ8fGQ6IWYmJmQmJihZPSEwLEs9ITApO2NvbnN0IEg9eC5nZXRGaWx0ZXJQaXBlbGluZSgiZHJvcF9zaGFkb3dfZmlsdGVyIix7SVNfSU5ORVI6WD8xOjAsSVNfS05PQ0tPVVQ6WT8xOjAsSVNfSElERV9PQkpFQ1Q6Sz8xOjB9KSxRPXguZ2V0QmluZEdyb3VwTGF5b3V0KCJkcm9wX3NoYWRvd19maWx0ZXIiKTtpZighSHx8IVEpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIltXZWJHUFUgRHJvcFNoYWRvd0ZpbHRlcl0gUGlwZWxpbmUgbm90IGZvdW5kIiksYi5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChQKSxlO2NvbnN0IFo9di5jcmVhdGVTYW1wbGVyKCJkcm9wX3NoYWRvd19zYW1wbGVyIiwhMCksW0osZWUsdGUscmVdPSgoZSx0KT0+WyhlPj4xNiYyNTUpLzI1NSp0LChlPj44JjI1NSkvMjU1KnQsKDI1NSZlKS8yNTUqdCx0XSkoaSxhKSxuZT1ML3csaWU9SS9NLGFlPWovdyxzZT1EL00sb2U9TC9TLGxlPUkvRixjZT1OL1MsdWU9Vy9GO2FsWzBdPUosYWxbMV09ZWUsYWxbMl09dGUsYWxbM109cmUsYWxbNF09bmUsYWxbNV09aWUsYWxbNl09YWUsYWxbN109c2UsYWxbOF09b2UsYWxbOV09bGUsYWxbMTBdPWNlLGFsWzExXT11ZSxhbFsxMl09bCxhbFsxM109WD8xOjAsYWxbMTRdPVk/MTowLGFsWzE1XT1LPzE6MDtjb25zdCBmZT1wLmJ1ZmZlck1hbmFnZXI/cC5idWZmZXJNYW5hZ2VyLmFjcXVpcmVBbmRXcml0ZVVuaWZvcm1CdWZmZXIoYWwpOm0uY3JlYXRlQnVmZmVyKHtzaXplOmFsLmJ5dGVMZW5ndGgsdXNhZ2U6R1BVQnVmZmVyVXNhZ2UuVU5JRk9STXxHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVH0pO3AuYnVmZmVyTWFuYWdlcnx8bS5xdWV1ZS53cml0ZUJ1ZmZlcihmZSwwLGFsKSxzbFswXS5yZXNvdXJjZS5idWZmZXI9ZmUsc2xbMV0ucmVzb3VyY2U9WixzbFsyXS5yZXNvdXJjZT1QLnRleHR1cmUudmlldyxzbFszXS5yZXNvdXJjZT1lLnRleHR1cmUudmlldztjb25zdCBkZT1tLmNyZWF0ZUJpbmRHcm91cCh7bGF5b3V0OlEsZW50cmllczpzbH0pLGhlPWIuY3JlYXRlUmVuZGVyUGFzc0Rlc2NyaXB0b3IocS50ZXh0dXJlLnZpZXcsMCwwLDAsMCwiY2xlYXIiKSxwZT1nLmJlZ2luUmVuZGVyUGFzcyhoZSk7cmV0dXJuIHBlLnNldFBpcGVsaW5lKEgpLHBlLnNldEJpbmRHcm91cCgwLGRlKSxwZS5kcmF3KDYsMSwwLDApLHBlLmVuZCgpLGIucmVsZWFzZVRlbXBvcmFyeUF0dGFjaG1lbnQoUCkscX0sbGw9TWF0aC5QSS8xODAsY2w9bmV3IEZsb2F0MzJBcnJheSg4KSx1bD1uZXcgRmxvYXQzMkFycmF5KDIwKSxmbD1be2JpbmRpbmc6MCxyZXNvdXJjZTp7YnVmZmVyOm51bGx9fSx7YmluZGluZzoxLHJlc291cmNlOm51bGx9LHtiaW5kaW5nOjIscmVzb3VyY2U6bnVsbH1dLGRsPVt7YmluZGluZzowLHJlc291cmNlOntidWZmZXI6bnVsbH19LHtiaW5kaW5nOjEscmVzb3VyY2U6bnVsbH0se2JpbmRpbmc6MixyZXNvdXJjZTpudWxsfSx7YmluZGluZzozLHJlc291cmNlOm51bGx9XSxobD0oZSx0KT0+WyhlPj4xNiYyNTUpLzI1NSp0LChlPj44JjI1NSkvMjU1KnQsKDI1NSZlKS8yNTUqdCx0XSxwbD0oZSx0LHIsbixpLGEscyxvLGwsYyx1LGYsZCxoLHAsbSk9Pntjb25zdHtkZXZpY2U6Zyxjb21tYW5kRW5jb2RlcjpiLGZyYW1lQnVmZmVyTWFuYWdlcjp4LHBpcGVsaW5lTWFuYWdlcjp2LHRleHR1cmVNYW5hZ2VyOnl9PW0sXz1Jby54LHc9SW8ueSxNPWUud2lkdGgsUD1lLmhlaWdodCxTPU1hdGguc3FydCh0WzBdKnRbMF0rdFsxXSp0WzFdKSxGPU1hdGguc3FydCh0WzJdKnRbMl0rdFszXSp0WzNdKSxUPW4qbGwsQj1NYXRoLmNvcyhUKSpyKihTL3ApLE89TWF0aC5zaW4oVCkqciooRi9wKSxBPXguY3JlYXRlVGVtcG9yYXJ5QXR0YWNobWVudChNLFApO2IuY29weVRleHR1cmVUb1RleHR1cmUoe3RleHR1cmU6ZS50ZXh0dXJlLnJlc291cmNlLG9yaWdpbjp7eDowLHk6MCx6OjB9fSx7dGV4dHVyZTpBLnRleHR1cmUucmVzb3VyY2Usb3JpZ2luOnt4OjAseTowLHo6MH19LHt3aWR0aDpNLGhlaWdodDpQfSk7Y29uc3QgUj12LmdldFBpcGVsaW5lKCJ0ZXh0dXJlX2VyYXNlIiksQz12LmdldEJpbmRHcm91cExheW91dCgidGV4dHVyZV9jb3B5Iik7aWYoUiYmQyl7Y29uc3QgdD15LmNyZWF0ZVNhbXBsZXIoImVyYXNlX3NhbXBsZXIiLCEwKSxyPTIqQi9NLG49MipPL1A7Y2xbMF09MSxjbFsxXT0xLGNsWzJdPXIsY2xbM109bixjbFs0XT0wLGNsWzVdPTAsY2xbNl09MCxjbFs3XT0wO2NvbnN0IGk9bS5idWZmZXJNYW5hZ2VyP20uYnVmZmVyTWFuYWdlci5hY3F1aXJlQW5kV3JpdGVVbmlmb3JtQnVmZmVyKGNsKTpnLmNyZWF0ZUJ1ZmZlcih7c2l6ZTpjbC5ieXRlTGVuZ3RoLHVzYWdlOkdQVUJ1ZmZlclVzYWdlLlVOSUZPUk18R1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1R9KTttLmJ1ZmZlck1hbmFnZXJ8fGcucXVldWUud3JpdGVCdWZmZXIoaSwwLGNsKSxmbFswXS5yZXNvdXJjZS5idWZmZXI9aSxmbFsxXS5yZXNvdXJjZT10LGZsWzJdLnJlc291cmNlPWUudGV4dHVyZS52aWV3O2NvbnN0IGE9Zy5jcmVhdGVCaW5kR3JvdXAoe2xheW91dDpDLGVudHJpZXM6Zmx9KSxzPXguY3JlYXRlUmVuZGVyUGFzc0Rlc2NyaXB0b3IoQS50ZXh0dXJlLnZpZXcsMCwwLDAsMCwibG9hZCIpLG89Yi5iZWdpblJlbmRlclBhc3Mocyk7by5zZXRQaXBlbGluZShSKSxvLnNldEJpbmRHcm91cCgwLGEpLG8uZHJhdyg2LDEsMCwwKSxvLmVuZCgpfWNvbnN0IEU9WW8oQSx0LGwsYyxmLHAsbSk7eC5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChBKTtjb25zdCBVPUUud2lkdGgsJD1FLmhlaWdodCxHPU1hdGguYWJzKEIpLGs9TWF0aC5hYnMoTyksTD0xPT09ZCxJPU1hdGguY2VpbChVKzIqRyksVj1NYXRoLmNlaWwoJCsyKmspLHo9TD9NOkksaj1MP1A6VixEPShVLU0pLzIsTj0oJC1QKS8yLFc9TD8wOk1hdGguZmxvb3IoRytEKSxxPUw/MDpNYXRoLmZsb29yKGsrTiksWD16L00sWT1qL1AsSz1XL00sSD1xL1AsUT16L1UsWj1qLyQsSj0oTD9NYXRoLmZsb29yKC1ELUIpOk1hdGguZmxvb3IoRy1CKSkvVSxlZT0oTD9NYXRoLmZsb29yKC1OLU8pOk1hdGguZmxvb3Ioay1PKSkvJCx0ZT14LmNyZWF0ZVRlbXBvcmFyeUF0dGFjaG1lbnQoeixqKSxyZT12LmdldEZpbHRlclBpcGVsaW5lKCJiZXZlbF9maWx0ZXIiLHtCRVZFTF9UWVBFOmQsSVNfS05PQ0tPVVQ6aD8xOjB9KSxuZT12LmdldEJpbmRHcm91cExheW91dCgiYmV2ZWxfZmlsdGVyIik7aWYoIXJlfHwhbmUpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIltXZWJHUFUgQmV2ZWxGaWx0ZXJdIFBpcGVsaW5lIG5vdCBmb3VuZCIpLHgucmVsZWFzZVRlbXBvcmFyeUF0dGFjaG1lbnQoRSksZTtjb25zdCBpZT15LmNyZWF0ZVNhbXBsZXIoImJldmVsX3NhbXBsZXIiLCEwKSxbYWUsc2Usb2UsbGVdPWhsKGksYSksW2NlLHVlLGZlLGRlXT1obChzLG8pO3VsWzBdPWFlLHVsWzFdPXNlLHVsWzJdPW9lLHVsWzNdPWxlLHVsWzRdPWNlLHVsWzVdPXVlLHVsWzZdPWZlLHVsWzddPWRlLHVsWzhdPXUsdWxbOV09TD8xOjAsdWxbMTBdPWg/MTowLHVsWzExXT1kLHVsWzEyXT1YLHVsWzEzXT1ZLHVsWzE0XT1LLHVsWzE1XT1ILHVsWzE2XT1RLHVsWzE3XT1aLHVsWzE4XT1KLHVsWzE5XT1lZTtjb25zdCBoZT1tLmJ1ZmZlck1hbmFnZXI/bS5idWZmZXJNYW5hZ2VyLmFjcXVpcmVBbmRXcml0ZVVuaWZvcm1CdWZmZXIodWwpOmcuY3JlYXRlQnVmZmVyKHtzaXplOnVsLmJ5dGVMZW5ndGgsdXNhZ2U6R1BVQnVmZmVyVXNhZ2UuVU5JRk9STXxHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVH0pO20uYnVmZmVyTWFuYWdlcnx8Zy5xdWV1ZS53cml0ZUJ1ZmZlcihoZSwwLHVsKSxkbFswXS5yZXNvdXJjZS5idWZmZXI9aGUsZGxbMV0ucmVzb3VyY2U9aWUsZGxbMl0ucmVzb3VyY2U9RS50ZXh0dXJlLnZpZXcsZGxbM10ucmVzb3VyY2U9ZS50ZXh0dXJlLnZpZXc7Y29uc3QgcGU9Zy5jcmVhdGVCaW5kR3JvdXAoe2xheW91dDpuZSxlbnRyaWVzOmRsfSksbWU9eC5jcmVhdGVSZW5kZXJQYXNzRGVzY3JpcHRvcih0ZS50ZXh0dXJlLnZpZXcsMCwwLDAsMCwiY2xlYXIiKSxnZT1iLmJlZ2luUmVuZGVyUGFzcyhtZSk7cmV0dXJuIGdlLnNldFBpcGVsaW5lKHJlKSxnZS5zZXRCaW5kR3JvdXAoMCxwZSksZ2UuZHJhdyg2LDEsMCwwKSxnZS5lbmQoKSx4LnJlbGVhc2VUZW1wb3JhcnlBdHRhY2htZW50KEUpLElvLng9XytXLElvLnk9dytxLHRlfSxtbD1be2JpbmRpbmc6MCxyZXNvdXJjZTp7YnVmZmVyOm51bGx9fSx7YmluZGluZzoxLHJlc291cmNlOm51bGx9LHtiaW5kaW5nOjIscmVzb3VyY2U6bnVsbH1dLGdsPW5ldyBNYXAsYmw9KGUsdCxyLG4saSxhLHMsbyxsLGMsdSk9Pntjb25zdHtkZXZpY2U6Zixjb21tYW5kRW5jb2RlcjpkLGZyYW1lQnVmZmVyTWFuYWdlcjpoLHRleHR1cmVNYW5hZ2VyOnB9PXUsbT1lLndpZHRoLGc9ZS5oZWlnaHQsYj1oLmNyZWF0ZVRlbXBvcmFyeUF0dGFjaG1lbnQobSxnKSx4PWAke3R9LCR7cn0sJHtzfSwke299YDtsZXQgdj1nbC5nZXQoeCk7aWYoIXYpe2NvbnN0IGU9ZmEuZ2V0Q29udm9sdXRpb25GaWx0ZXJGcmFnbWVudFNoYWRlcih0LHIscyxvKSxuPWYuY3JlYXRlU2hhZGVyTW9kdWxlKHtjb2RlOmV9KSxpPWYuY3JlYXRlQmluZEdyb3VwTGF5b3V0KHtlbnRyaWVzOlt7YmluZGluZzowLHZpc2liaWxpdHk6R1BVU2hhZGVyU3RhZ2UuRlJBR01FTlQsYnVmZmVyOnt0eXBlOiJ1bmlmb3JtIn19LHtiaW5kaW5nOjEsdmlzaWJpbGl0eTpHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCxzYW1wbGVyOnt9fSx7YmluZGluZzoyLHZpc2liaWxpdHk6R1BVU2hhZGVyU3RhZ2UuRlJBR01FTlQsdGV4dHVyZTp7fX1dfSksYT1mLmNyZWF0ZVBpcGVsaW5lTGF5b3V0KHtiaW5kR3JvdXBMYXlvdXRzOltpXX0pO3Y9e3BpcGVsaW5lOmYuY3JlYXRlUmVuZGVyUGlwZWxpbmUoe2xheW91dDphLHZlcnRleDp7bW9kdWxlOm4sZW50cnlQb2ludDoidnNfbWFpbiIsYnVmZmVyczpbXX0sZnJhZ21lbnQ6e21vZHVsZTpuLGVudHJ5UG9pbnQ6ImZzX21haW4iLHRhcmdldHM6W3tmb3JtYXQ6InJnYmE4dW5vcm0iLGJsZW5kOntjb2xvcjp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3Rvcjoib25lLW1pbnVzLXNyYy1hbHBoYSIsb3BlcmF0aW9uOiJhZGQifSxhbHBoYTp7c3JjRmFjdG9yOiJvbmUiLGRzdEZhY3Rvcjoib25lLW1pbnVzLXNyYy1hbHBoYSIsb3BlcmF0aW9uOiJhZGQifX19XX0scHJpbWl0aXZlOnt0b3BvbG9neToidHJpYW5nbGUtbGlzdCIsY3VsbE1vZGU6Im5vbmUifX0pLGJpbmRHcm91cExheW91dDppfSxnbC5zZXQoeCx2KX1jb25zdCB5PXAuY3JlYXRlU2FtcGxlcigiY29udm9sdXRpb25fc2FtcGxlciIsITApLF89dCpyLHc9TWF0aC5jZWlsKF8vNCksW00sUCxTLEZdPSgoZSx0KT0+WyhlPj4xNiYyNTUpLzI1NSwoZT4+OCYyNTUpLzI1NSwoMjU1JmUpLzI1NSx0XSkobCxjKSxUPW5ldyBGbG9hdDMyQXJyYXkoNCp3KTtmb3IobGV0IGU9MDtlPF87ZSsrKVRbZV09bltlXTtjb25zdCBCPW5ldyBGbG9hdDMyQXJyYXkoKDMyKzE2KncpLzQpO0JbMF09MS9tLEJbMV09MS9nLEJbMl09MCE9PWk/MS9pOjEsQlszXT1hLzI1NSxCWzRdPU0sQls1XT1QLEJbNl09UyxCWzddPUY7Zm9yKGxldCBlPTA7ZTxULmxlbmd0aDtlKyspQls4K2VdPVRbZV07Y29uc3QgTz11LmJ1ZmZlck1hbmFnZXI/dS5idWZmZXJNYW5hZ2VyLmFjcXVpcmVBbmRXcml0ZVVuaWZvcm1CdWZmZXIoQik6Zi5jcmVhdGVCdWZmZXIoe3NpemU6Qi5ieXRlTGVuZ3RoLHVzYWdlOkdQVUJ1ZmZlclVzYWdlLlVOSUZPUk18R1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1R9KTt1LmJ1ZmZlck1hbmFnZXJ8fGYucXVldWUud3JpdGVCdWZmZXIoTywwLEIpLG1sWzBdLnJlc291cmNlLmJ1ZmZlcj1PLG1sWzFdLnJlc291cmNlPXksbWxbMl0ucmVzb3VyY2U9ZS50ZXh0dXJlLnZpZXc7Y29uc3QgQT1mLmNyZWF0ZUJpbmRHcm91cCh7bGF5b3V0OnYuYmluZEdyb3VwTGF5b3V0LGVudHJpZXM6bWx9KSxSPWguY3JlYXRlUmVuZGVyUGFzc0Rlc2NyaXB0b3IoYi50ZXh0dXJlLnZpZXcsMCwwLDAsMCwiY2xlYXIiKSxDPWQuYmVnaW5SZW5kZXJQYXNzKFIpO3JldHVybiBDLnNldFBpcGVsaW5lKHYucGlwZWxpbmUpLEMuc2V0QmluZEdyb3VwKDAsQSksQy5kcmF3KDYsMSwwLDApLEMuZW5kKCksYn0seGw9TWF0aC5QSS8xODAsdmw9bmV3IEZsb2F0MzJBcnJheSg0KSx5bD1uZXcgRmxvYXQzMkFycmF5KDEyKSxfbD1be2JpbmRpbmc6MCxyZXNvdXJjZTp7YnVmZmVyOm51bGx9fSx7YmluZGluZzoxLHJlc291cmNlOm51bGx9LHtiaW5kaW5nOjIscmVzb3VyY2U6bnVsbH1dLHdsPVt7YmluZGluZzowLHJlc291cmNlOntidWZmZXI6bnVsbH19LHtiaW5kaW5nOjEscmVzb3VyY2U6bnVsbH0se2JpbmRpbmc6MixyZXNvdXJjZTpudWxsfSx7YmluZGluZzozLHJlc291cmNlOm51bGx9LHtiaW5kaW5nOjQscmVzb3VyY2U6bnVsbH1dLE1sPShlLHQscixuLGksYSxzLG8sbCxjLHUsZixkLGgscCk9Pntjb25zdHtkZXZpY2U6bSxjb21tYW5kRW5jb2RlcjpnLGZyYW1lQnVmZmVyTWFuYWdlcjpiLHBpcGVsaW5lTWFuYWdlcjp4LHRleHR1cmVNYW5hZ2VyOnZ9PXAseT1Jby54LF89SW8ueSx3PWUud2lkdGgsTT1lLmhlaWdodCxQPU1hdGguc3FydCh0WzBdKnRbMF0rdFsxXSp0WzFdKSxTPU1hdGguc3FydCh0WzJdKnRbMl0rdFszXSp0WzNdKSxGPW4qeGwsVD1NYXRoLmNvcyhGKSpyKihQL2gpLEI9TWF0aC5zaW4oRikqciooUy9oKSxPPXguZ2V0UGlwZWxpbmUoImJldmVsX2Jhc2UiKSxBPXguZ2V0QmluZEdyb3VwTGF5b3V0KCJiZXZlbF9iYXNlIik7aWYoIU98fCFBKXJldHVybiBjb25zb2xlLmVycm9yKCJbV2ViR1BVIEdyYWRpZW50QmV2ZWxGaWx0ZXJdIGJldmVsX2Jhc2UgcGlwZWxpbmUgbm90IGZvdW5kIiksZTtjb25zdCBSPWIuY3JlYXRlVGVtcG9yYXJ5QXR0YWNobWVudCh3LE0pLEM9di5jcmVhdGVTYW1wbGVyKCJiZXZlbF9iYXNlX3NhbXBsZXIiLCEwKTt2bFswXT0yKlQvdyx2bFsxXT0yKkIvTSx2bFsyXT0wLHZsWzNdPTA7Y29uc3QgRT1wLmJ1ZmZlck1hbmFnZXI/cC5idWZmZXJNYW5hZ2VyLmFjcXVpcmVBbmRXcml0ZVVuaWZvcm1CdWZmZXIodmwpOm0uY3JlYXRlQnVmZmVyKHtzaXplOnZsLmJ5dGVMZW5ndGgsdXNhZ2U6R1BVQnVmZmVyVXNhZ2UuVU5JRk9STXxHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVH0pO3AuYnVmZmVyTWFuYWdlcnx8bS5xdWV1ZS53cml0ZUJ1ZmZlcihFLDAsdmwpLF9sWzBdLnJlc291cmNlLmJ1ZmZlcj1FLF9sWzFdLnJlc291cmNlPUMsX2xbMl0ucmVzb3VyY2U9ZS50ZXh0dXJlLnZpZXc7Y29uc3QgVT1tLmNyZWF0ZUJpbmRHcm91cCh7bGF5b3V0OkEsZW50cmllczpfbH0pLCQ9Yi5jcmVhdGVSZW5kZXJQYXNzRGVzY3JpcHRvcihSLnRleHR1cmUudmlldywwLDAsMCwwLCJjbGVhciIpLEc9Zy5iZWdpblJlbmRlclBhc3MoJCk7Ry5zZXRQaXBlbGluZShPKSxHLnNldEJpbmRHcm91cCgwLFUpLEcuZHJhdyg2LDEsMCwwKSxHLmVuZCgpO2NvbnN0IGs9WW8oUix0LG8sbCx1LGgscCk7Yi5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChSKTtjb25zdCBMPWsud2lkdGgsST1rLmhlaWdodCxWPTE9PT1mLHo9TWF0aC5hYnMoVCksaj1NYXRoLmFicyhCKSxEPShMLXcpLzIsTj0oSS1NKS8yLFc9TWF0aC5jZWlsKEwrMip6KSxxPU1hdGguY2VpbChJKzIqaiksWD1WP3c6VyxZPVY/TTpxLEs9Vj8wOnorRCxIPVY/MDpqK04sUT1WPy1ELVQ6ei1ULFo9Vj8tTi1COmotQixKPXFzKHMsaSxhKSxlZT1tLmNyZWF0ZVRleHR1cmUoe3NpemU6e3dpZHRoOjI1NixoZWlnaHQ6MX0sZm9ybWF0OiJyZ2JhOHVub3JtIix1c2FnZTpHUFVUZXh0dXJlVXNhZ2UuVEVYVFVSRV9CSU5ESU5HfEdQVVRleHR1cmVVc2FnZS5DT1BZX0RTVH0pO20ucXVldWUud3JpdGVUZXh0dXJlKHt0ZXh0dXJlOmVlfSxKLmJ1ZmZlcix7Ynl0ZXNQZXJSb3c6MTAyNCxvZmZzZXQ6Si5ieXRlT2Zmc2V0fSx7d2lkdGg6MjU2LGhlaWdodDoxfSk7Y29uc3QgdGU9ZWUuY3JlYXRlVmlldygpLHJlPVgvdyxuZT1ZL00saWU9Sy93LGFlPUgvTSxzZT1YL0wsb2U9WS9JLGxlPVEvTCxjZT1aL0ksdWU9Yi5jcmVhdGVUZW1wb3JhcnlBdHRhY2htZW50KFgsWSksZmU9eC5nZXRGaWx0ZXJQaXBlbGluZSgiZ3JhZGllbnRfYmV2ZWxfZmlsdGVyIix7QkVWRUxfVFlQRTpmLElTX0tOT0NLT1VUOmQ/MTowfSksZGU9eC5nZXRCaW5kR3JvdXBMYXlvdXQoImdyYWRpZW50X2JldmVsX2ZpbHRlciIpO2lmKCFmZXx8IWRlKXJldHVybiBjb25zb2xlLmVycm9yKCJbV2ViR1BVIEdyYWRpZW50QmV2ZWxGaWx0ZXJdIFBpcGVsaW5lIG5vdCBmb3VuZCIpLGIucmVsZWFzZVRlbXBvcmFyeUF0dGFjaG1lbnQoayksZTtjb25zdCBoZT12LmNyZWF0ZVNhbXBsZXIoImdyYWRpZW50X2JldmVsX3NhbXBsZXIiLCEwKTt5bFswXT1jLHlsWzFdPVY/MTowLHlsWzJdPWQ/MTowLHlsWzNdPWYseWxbNF09cmUseWxbNV09bmUseWxbNl09aWUseWxbN109YWUseWxbOF09c2UseWxbOV09b2UseWxbMTBdPWxlLHlsWzExXT1jZTtjb25zdCBwZT1wLmJ1ZmZlck1hbmFnZXI/cC5idWZmZXJNYW5hZ2VyLmFjcXVpcmVBbmRXcml0ZVVuaWZvcm1CdWZmZXIoeWwpOm0uY3JlYXRlQnVmZmVyKHtzaXplOnlsLmJ5dGVMZW5ndGgsdXNhZ2U6R1BVQnVmZmVyVXNhZ2UuVU5JRk9STXxHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVH0pO3AuYnVmZmVyTWFuYWdlcnx8bS5xdWV1ZS53cml0ZUJ1ZmZlcihwZSwwLHlsKSx3bFswXS5yZXNvdXJjZS5idWZmZXI9cGUsd2xbMV0ucmVzb3VyY2U9aGUsd2xbMl0ucmVzb3VyY2U9ay50ZXh0dXJlLnZpZXcsd2xbM10ucmVzb3VyY2U9ZS50ZXh0dXJlLnZpZXcsd2xbNF0ucmVzb3VyY2U9dGU7Y29uc3QgbWU9bS5jcmVhdGVCaW5kR3JvdXAoe2xheW91dDpkZSxlbnRyaWVzOndsfSksZ2U9Yi5jcmVhdGVSZW5kZXJQYXNzRGVzY3JpcHRvcih1ZS50ZXh0dXJlLnZpZXcsMCwwLDAsMCwiY2xlYXIiKSxiZT1nLmJlZ2luUmVuZGVyUGFzcyhnZSk7cmV0dXJuIGJlLnNldFBpcGVsaW5lKGZlKSxiZS5zZXRCaW5kR3JvdXAoMCxtZSksYmUuZHJhdyg2LDEsMCwwKSxiZS5lbmQoKSxwLmZyYW1lVGV4dHVyZXMucHVzaChlZSksYi5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChrKSxJby54PXkrSyxJby55PV8rSCx1ZX0sUGw9TWF0aC5QSS8xODAsU2w9bmV3IEZsb2F0MzJBcnJheSgxMiksRmw9W3tiaW5kaW5nOjAscmVzb3VyY2U6e2J1ZmZlcjpudWxsfX0se2JpbmRpbmc6MSxyZXNvdXJjZTpudWxsfSx7YmluZGluZzoyLHJlc291cmNlOm51bGx9LHtiaW5kaW5nOjMscmVzb3VyY2U6bnVsbH0se2JpbmRpbmc6NCxyZXNvdXJjZTpudWxsfV0sVGw9KGUsdCxyLG4saSxhLHMsbyxsLGMsdSxmLGQsaCxwKT0+e2NvbnN0e2RldmljZTptLGNvbW1hbmRFbmNvZGVyOmcsZnJhbWVCdWZmZXJNYW5hZ2VyOmIscGlwZWxpbmVNYW5hZ2VyOngsdGV4dHVyZU1hbmFnZXI6dn09cCx5PUlvLngsXz1Jby55LHc9ZS53aWR0aCxNPWUuaGVpZ2h0LFA9WW8oZSx0LG8sbCx1LGgscCksUz1QLndpZHRoLEY9UC5oZWlnaHQsVD1Jby54LEI9SW8ueSxPPVQteSxBPUItXyxSPU1hdGguc3FydCh0WzBdKnRbMF0rdFsxXSp0WzFdKSxDPU1hdGguc3FydCh0WzJdKnRbMl0rdFszXSp0WzNdKSxFPW4qUGwsVT1NYXRoLmNvcyhFKSpyKihSL2gpLCQ9TWF0aC5zaW4oRSkqciooQy9oKSxHPTE9PT1mLGs9Rz93OlMrTWF0aC5tYXgoMCxNYXRoLmFicyhVKS1PKSxMPUc/TTpGK01hdGgubWF4KDAsTWF0aC5hYnMoJCktQSksST1NYXRoLmNlaWwoayksVj1NYXRoLmNlaWwoTCksej0oSS1rKS8yLGo9KFYtTCkvMixEPUc/MDpNYXRoLm1heCgwLE8tVSkreixOPUc/MDpNYXRoLm1heCgwLEEtJCkraixXPUc/VS1UOihVPjA/TWF0aC5tYXgoMCxVLU8pOjApK3oscT1HPyQtQjooJD4wP01hdGgubWF4KDAsJC1BKTowKStqLFg9cXMocyxpLGEpLFk9bS5jcmVhdGVUZXh0dXJlKHtzaXplOnt3aWR0aDoyNTYsaGVpZ2h0OjF9LGZvcm1hdDoicmdiYTh1bm9ybSIsdXNhZ2U6R1BVVGV4dHVyZVVzYWdlLlRFWFRVUkVfQklORElOR3xHUFVUZXh0dXJlVXNhZ2UuQ09QWV9EU1R9KTttLnF1ZXVlLndyaXRlVGV4dHVyZSh7dGV4dHVyZTpZfSxYLmJ1ZmZlcix7Ynl0ZXNQZXJSb3c6MTAyNCxvZmZzZXQ6WC5ieXRlT2Zmc2V0fSx7d2lkdGg6MjU2LGhlaWdodDoxfSk7Y29uc3QgSz1ZLmNyZWF0ZVZpZXcoKSxIPUkvdyxRPVYvTSxaPUQvdyxKPU4vTSxlZT1JL1MsdGU9Vi9GLHJlPVcvUyxuZT1xL0YsaWU9Yi5jcmVhdGVUZW1wb3JhcnlBdHRhY2htZW50KEksViksYWU9eC5nZXRGaWx0ZXJQaXBlbGluZSgiZ3JhZGllbnRfZ2xvd19maWx0ZXIiLHtHTE9XX1RZUEU6ZixJU19LTk9DS09VVDpkPzE6MH0pLHNlPXguZ2V0QmluZEdyb3VwTGF5b3V0KCJncmFkaWVudF9nbG93X2ZpbHRlciIpO2lmKCFhZXx8IXNlKXJldHVybiBjb25zb2xlLmVycm9yKCJbV2ViR1BVIEdyYWRpZW50R2xvd0ZpbHRlcl0gUGlwZWxpbmUgbm90IGZvdW5kIiksYi5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChQKSxlO2NvbnN0IG9lPXYuY3JlYXRlU2FtcGxlcigiZ3JhZGllbnRfZ2xvd19zYW1wbGVyIiwhMCk7U2xbMF09YyxTbFsxXT1HPzE6MCxTbFsyXT1kPzE6MCxTbFszXT1mLFNsWzRdPUgsU2xbNV09USxTbFs2XT1aLFNsWzddPUosU2xbOF09ZWUsU2xbOV09dGUsU2xbMTBdPXJlLFNsWzExXT1uZTtjb25zdCBsZT1wLmJ1ZmZlck1hbmFnZXI/cC5idWZmZXJNYW5hZ2VyLmFjcXVpcmVBbmRXcml0ZVVuaWZvcm1CdWZmZXIoU2wpOm0uY3JlYXRlQnVmZmVyKHtzaXplOlNsLmJ5dGVMZW5ndGgsdXNhZ2U6R1BVQnVmZmVyVXNhZ2UuVU5JRk9STXxHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVH0pO3AuYnVmZmVyTWFuYWdlcnx8bS5xdWV1ZS53cml0ZUJ1ZmZlcihsZSwwLFNsKSxGbFswXS5yZXNvdXJjZS5idWZmZXI9bGUsRmxbMV0ucmVzb3VyY2U9b2UsRmxbMl0ucmVzb3VyY2U9UC50ZXh0dXJlLnZpZXcsRmxbM10ucmVzb3VyY2U9ZS50ZXh0dXJlLnZpZXcsRmxbNF0ucmVzb3VyY2U9Sztjb25zdCBjZT1tLmNyZWF0ZUJpbmRHcm91cCh7bGF5b3V0OnNlLGVudHJpZXM6Rmx9KSx1ZT1iLmNyZWF0ZVJlbmRlclBhc3NEZXNjcmlwdG9yKGllLnRleHR1cmUudmlldywwLDAsMCwwLCJjbGVhciIpLGZlPWcuYmVnaW5SZW5kZXJQYXNzKHVlKTtyZXR1cm4gZmUuc2V0UGlwZWxpbmUoYWUpLGZlLnNldEJpbmRHcm91cCgwLGNlKSxmZS5kcmF3KDYsMSwwLDApLGZlLmVuZCgpLHAuZnJhbWVUZXh0dXJlcy5wdXNoKFkpLGIucmVsZWFzZVRlbXBvcmFyeUF0dGFjaG1lbnQoUCksSW8ueD15K0QsSW8ueT1fK04saWV9LEJsPW5ldyBGbG9hdDMyQXJyYXkoMTIpLE9sPVt7YmluZGluZzowLHJlc291cmNlOntidWZmZXI6bnVsbH19LHtiaW5kaW5nOjEscmVzb3VyY2U6bnVsbH0se2JpbmRpbmc6MixyZXNvdXJjZTpudWxsfSx7YmluZGluZzozLHJlc291cmNlOm51bGx9XSxBbD1uZXcgTWFwLFJsPShlLHQscixuLGksYSxzLG8sbCxjLHUsZixkLGgscCxtKT0+e2NvbnN0e2RldmljZTpnLGNvbW1hbmRFbmNvZGVyOmIsZnJhbWVCdWZmZXJNYW5hZ2VyOngsdGV4dHVyZU1hbmFnZXI6dn09bSx5PWUud2lkdGgsXz1lLmhlaWdodCx3PW4sTT1pLFA9eC5jcmVhdGVUZW1wb3JhcnlBdHRhY2htZW50KHksXyksUz1nLmNyZWF0ZVRleHR1cmUoe3NpemU6e3dpZHRoOm4saGVpZ2h0Oml9LGZvcm1hdDoicmdiYTh1bm9ybSIsdXNhZ2U6R1BVVGV4dHVyZVVzYWdlLlRFWFRVUkVfQklORElOR3xHUFVUZXh0dXJlVXNhZ2UuQ09QWV9EU1R9KTtnLnF1ZXVlLndyaXRlVGV4dHVyZSh7dGV4dHVyZTpTfSxyLmJ1ZmZlcix7Ynl0ZXNQZXJSb3c6NCpuLG9mZnNldDpyLmJ5dGVPZmZzZXR9LHt3aWR0aDpuLGhlaWdodDppfSk7Y29uc3QgRj1gJHtvfSwke2x9LCR7Zn1gO2xldCBUPUFsLmdldChGKTtpZighVCl7Y29uc3QgZT1mYS5nZXREaXNwbGFjZW1lbnRNYXBGaWx0ZXJGcmFnbWVudFNoYWRlcihvLGwsZiksdD1nLmNyZWF0ZVNoYWRlck1vZHVsZSh7Y29kZTpmYS5nZXRCbHVyRmlsdGVyVmVydGV4U2hhZGVyKCl9KSxyPWcuY3JlYXRlU2hhZGVyTW9kdWxlKHtjb2RlOmV9KSxuPWcuY3JlYXRlQmluZEdyb3VwTGF5b3V0KHtlbnRyaWVzOlt7YmluZGluZzowLHZpc2liaWxpdHk6R1BVU2hhZGVyU3RhZ2UuRlJBR01FTlQsYnVmZmVyOnt0eXBlOiJ1bmlmb3JtIn19LHtiaW5kaW5nOjEsdmlzaWJpbGl0eTpHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCxzYW1wbGVyOnt9fSx7YmluZGluZzoyLHZpc2liaWxpdHk6R1BVU2hhZGVyU3RhZ2UuRlJBR01FTlQsdGV4dHVyZTp7fX0se2JpbmRpbmc6Myx2aXNpYmlsaXR5OkdQVVNoYWRlclN0YWdlLkZSQUdNRU5ULHRleHR1cmU6e319XX0pLGk9Zy5jcmVhdGVQaXBlbGluZUxheW91dCh7YmluZEdyb3VwTGF5b3V0czpbbl19KTtUPXtwaXBlbGluZTpnLmNyZWF0ZVJlbmRlclBpcGVsaW5lKHtsYXlvdXQ6aSx2ZXJ0ZXg6e21vZHVsZTp0LGVudHJ5UG9pbnQ6Im1haW4iLGJ1ZmZlcnM6W119LGZyYWdtZW50Onttb2R1bGU6cixlbnRyeVBvaW50OiJtYWluIix0YXJnZXRzOlt7Zm9ybWF0OiJyZ2JhOHVub3JtIixibGVuZDp7Y29sb3I6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn0sYWxwaGE6e3NyY0ZhY3Rvcjoib25lIixkc3RGYWN0b3I6Im9uZS1taW51cy1zcmMtYWxwaGEiLG9wZXJhdGlvbjoiYWRkIn19fV19LHByaW1pdGl2ZTp7dG9wb2xvZ3k6InRyaWFuZ2xlLWxpc3QiLGN1bGxNb2RlOiJub25lIn19KSxiaW5kR3JvdXBMYXlvdXQ6bn0sQWwuc2V0KEYsVCl9Y29uc3QgQj12LmNyZWF0ZVNhbXBsZXIoImRpc3BsYWNlbWVudF9zYW1wbGVyIiwhMCksTz0xPT09ZixBPU8/NDg6MzI7aWYoQmxbMF09dy9uLEJsWzFdPU0vaSxCbFsyXT1hL24sQmxbM109KE0taS1zKS9pLEJsWzRdPWMvdyxCbFs1XT11L00sQmxbNl09MCxCbFs3XT0wLE8pe2NvbnN0W2UsdCxyLG5dPSgoZSx0KT0+WyhlPj4xNiYyNTUpLzI1NSp0LChlPj44JjI1NSkvMjU1KnQsKDI1NSZlKS8yNTUqdCx0XSkoZCxoKTtCbFs4XT1lLEJsWzldPXQsQmxbMTBdPXIsQmxbMTFdPW59Y29uc3QgUj1tLmJ1ZmZlck1hbmFnZXI/bS5idWZmZXJNYW5hZ2VyLmFjcXVpcmVBbmRXcml0ZVVuaWZvcm1CdWZmZXIoQmwsQSk6Zy5jcmVhdGVCdWZmZXIoe3NpemU6QSx1c2FnZTpHUFVCdWZmZXJVc2FnZS5VTklGT1JNfEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNUfSk7bS5idWZmZXJNYW5hZ2VyfHxnLnF1ZXVlLndyaXRlQnVmZmVyKFIsMCxCbCwwLEEvNCksT2xbMF0ucmVzb3VyY2UuYnVmZmVyPVIsT2xbMV0ucmVzb3VyY2U9QixPbFsyXS5yZXNvdXJjZT1lLnRleHR1cmUudmlldyxPbFszXS5yZXNvdXJjZT1TLmNyZWF0ZVZpZXcoKTtjb25zdCBDPWcuY3JlYXRlQmluZEdyb3VwKHtsYXlvdXQ6VC5iaW5kR3JvdXBMYXlvdXQsZW50cmllczpPbH0pLEU9eC5jcmVhdGVSZW5kZXJQYXNzRGVzY3JpcHRvcihQLnRleHR1cmUudmlldywwLDAsMCwwLCJjbGVhciIpLFU9Yi5iZWdpblJlbmRlclBhc3MoRSk7cmV0dXJuIFUuc2V0UGlwZWxpbmUoVC5waXBlbGluZSksVS5zZXRCaW5kR3JvdXAoMCxDKSxVLmRyYXcoNiwxLDAsMCksVS5lbmQoKSxtLmZyYW1lVGV4dHVyZXMucHVzaChTKSxQfSxDbD1uZXcgRmxvYXQzMkFycmF5KDQpLEVsPW5ldyBGbG9hdDMyQXJyYXkoNiksVWw9bmV3IEZsb2F0MzJBcnJheSg2KSwkbD1uZXcgRmxvYXQzMkFycmF5KDgpLEdsPW5ldyBGbG9hdDMyQXJyYXkoMTIpLGtsPW5ldyBGbG9hdDMyQXJyYXkoMjApLExsPVt7YmluZGluZzowLHJlc291cmNlOntidWZmZXI6bnVsbH19LHtiaW5kaW5nOjEscmVzb3VyY2U6bnVsbH0se2JpbmRpbmc6MixyZXNvdXJjZTpudWxsfV0sSWw9bmV3IFNldChbIm5vcm1hbCIsImxheWVyIiwiYWRkIiwic2NyZWVuIiwiYWxwaGEiLCJlcmFzZSIsImNvcHkiXSksVmw9bmV3IEZsb2F0MzJBcnJheShbMSwtMSwwLDFdKSx6bD0oZSx0LHIsbixpLGEscyxvKT0+e2NvbnN0IGw9ZS5tYWluQXR0YWNobWVudHx8ZS5mcmFtZUJ1ZmZlck1hbmFnZXIuZ2V0QXR0YWNobWVudCgibWFpbiIpO2lmKCFsfHwhbC50ZXh0dXJlfHwhdC50ZXh0dXJlKXJldHVybjtsZXQgYz1pLHU9YSxmPXQud2lkdGgsZD10LmhlaWdodCxoPTAscD0wO2lmKGM8MCYmKGg9LWMvdC53aWR0aCxmKz1jLGM9MCksdTwwJiYocD0tdS90LmhlaWdodCxkKz11LHU9MCksZjw9MHx8ZDw9MClyZXR1cm47Y29uc3QgbT1sLndpZHRoLGc9bC5oZWlnaHQ7aWYoYytmPm0mJihmPW0tYyksdStkPmcmJihkPWctdSksYj1uLElsLmhhcyhiKSl7Y29uc3Qgcj1sLm1zYWEmJmwubXNhYVRleHR1cmU/LnZpZXc7bGV0IGk7c3dpdGNoKG4pe2Nhc2UiYWRkIjppPXI/ImZpbHRlcl9vdXRwdXRfYWRkX21zYWEiOiJmaWx0ZXJfb3V0cHV0X2FkZCI7YnJlYWs7Y2FzZSJzY3JlZW4iOmk9cj8iZmlsdGVyX291dHB1dF9zY3JlZW5fbXNhYSI6ImZpbHRlcl9vdXRwdXRfc2NyZWVuIjticmVhaztjYXNlImFscGhhIjppPXI/ImZpbHRlcl9vdXRwdXRfYWxwaGFfbXNhYSI6ImZpbHRlcl9vdXRwdXRfYWxwaGEiO2JyZWFrO2Nhc2UiZXJhc2UiOmk9cj8iZmlsdGVyX291dHB1dF9lcmFzZV9tc2FhIjoiZmlsdGVyX291dHB1dF9lcmFzZSI7YnJlYWs7Y2FzZSJjb3B5IjppPXI/InRleHR1cmVfY29weV9iZ3JhX21zYWEiOiJ0ZXh0dXJlX2NvcHlfYmdyYSI7YnJlYWs7ZGVmYXVsdDppPXI/ImZpbHRlcl9vdXRwdXRfbXNhYSI6ImZpbHRlcl9vdXRwdXQifWxldCBhPWUucGlwZWxpbmVNYW5hZ2VyLmdldFBpcGVsaW5lKGkpLHM9ZS5waXBlbGluZU1hbmFnZXIuZ2V0QmluZEdyb3VwTGF5b3V0KCJ0ZXh0dXJlX2NvcHkiKTtpZighKGEmJnN8fChpPXI/ImZpbHRlcl9vdXRwdXRfbXNhYSI6ImZpbHRlcl9vdXRwdXQiLGE9ZS5waXBlbGluZU1hbmFnZXIuZ2V0UGlwZWxpbmUoaSkscz1lLnBpcGVsaW5lTWFuYWdlci5nZXRCaW5kR3JvdXBMYXlvdXQoInRleHR1cmVfY29weSIpLGEmJnMpKSlyZXR1cm47Y29uc3Qgbz1lLnRleHR1cmVNYW5hZ2VyLmNyZWF0ZVNhbXBsZXIoImZpbHRlcl9vdXRwdXRfc2FtcGxlciIsITApLGI9Zi90LndpZHRoLHg9ZC90LmhlaWdodDtDbFswXT1iLENsWzFdPXgsQ2xbMl09aCxDbFszXT1wO2NvbnN0IHY9ZS5idWZmZXJNYW5hZ2VyLmFjcXVpcmVBbmRXcml0ZVVuaWZvcm1CdWZmZXIoQ2wpO0xsWzBdLnJlc291cmNlLmJ1ZmZlcj12LExsWzFdLnJlc291cmNlPW8sTGxbMl0ucmVzb3VyY2U9dC50ZXh0dXJlLnZpZXc7Y29uc3QgeT1lLmRldmljZS5jcmVhdGVCaW5kR3JvdXAoe2xheW91dDpzLGVudHJpZXM6TGx9KSxfPXI/bC5tc2FhVGV4dHVyZS52aWV3OmwudGV4dHVyZS52aWV3LHc9cj9sLnRleHR1cmUudmlldzpudWxsLE09ZS5mcmFtZUJ1ZmZlck1hbmFnZXIuY3JlYXRlUmVuZGVyUGFzc0Rlc2NyaXB0b3IoXywwLDAsMCwwLCJsb2FkIix3KSxQPU1hdGgubWF4KDAsYyksUz1NYXRoLm1heCgwLHUpLEY9TWF0aC5tYXgoMSxmKSxUPU1hdGgubWF4KDEsZCksQj1NYXRoLm1heCgwLE1hdGguZmxvb3IoUCkpLE89TWF0aC5tYXgoMCxNYXRoLmZsb29yKFMpKSxBPU1hdGgubWF4KDEsTWF0aC5taW4oTWF0aC5jZWlsKFArRiktQixtLUIpKSxSPU1hdGgubWF4KDEsTWF0aC5taW4oTWF0aC5jZWlsKFMrVCktTyxnLU8pKTtpZihBPD0wfHxSPD0wfHxCPj1tfHxPPj1nKXJldHVybjtjb25zdCBDPWUuY29tbWFuZEVuY29kZXIuYmVnaW5SZW5kZXJQYXNzKE0pO0Muc2V0UGlwZWxpbmUoYSksQy5zZXRCaW5kR3JvdXAoMCx5KSxDLnNldFZpZXdwb3J0KFAsUyxGLFQsMCwxKSxDLnNldFNjaXNzb3JSZWN0KEIsTyxBLFIpLEMuZHJhdyg2LDEsMCwwKSxDLmVuZCgpfWVsc2V7Y29uc3QgaT0oKGUsdCxyLG4saSxhKT0+e2NvbnN0IHM9ZS5mcmFtZUJ1ZmZlck1hbmFnZXIuY3JlYXRlVGVtcG9yYXJ5QXR0YWNobWVudChpLGEpLG89ZS5waXBlbGluZU1hbmFnZXIuZ2V0UGlwZWxpbmUoImNvbXBsZXhfYmxlbmRfY29weSIpLGw9ZS5waXBlbGluZU1hbmFnZXIuZ2V0QmluZEdyb3VwTGF5b3V0KCJ0ZXh0dXJlX2NvcHkiKTtpZighKG8mJmwmJnQudGV4dHVyZSYmcy50ZXh0dXJlKSlyZXR1cm4gcztjb25zdCBjPWkvdC53aWR0aCx1PWEvdC5oZWlnaHQsZj1yL3Qud2lkdGgsZD1uL3QuaGVpZ2h0O0NsWzBdPWMsQ2xbMV09dSxDbFsyXT1mLENsWzNdPWQ7Y29uc3QgaD1lLmJ1ZmZlck1hbmFnZXIuYWNxdWlyZUFuZFdyaXRlVW5pZm9ybUJ1ZmZlcihDbCkscD1lLnRleHR1cmVNYW5hZ2VyLmNyZWF0ZVNhbXBsZXIoImZpbHRlcl9jb3B5X3NhbXBsZXIiLCExKTtMbFswXS5yZXNvdXJjZS5idWZmZXI9aCxMbFsxXS5yZXNvdXJjZT1wLExsWzJdLnJlc291cmNlPXQudGV4dHVyZS52aWV3O2NvbnN0IG09ZS5kZXZpY2UuY3JlYXRlQmluZEdyb3VwKHtsYXlvdXQ6bCxlbnRyaWVzOkxsfSksZz1lLmZyYW1lQnVmZmVyTWFuYWdlci5jcmVhdGVSZW5kZXJQYXNzRGVzY3JpcHRvcihzLnRleHR1cmUudmlldywwLDAsMCwwLCJjbGVhciIpLGI9ZS5jb21tYW5kRW5jb2Rlci5iZWdpblJlbmRlclBhc3MoZyk7cmV0dXJuIGIuc2V0UGlwZWxpbmUobyksYi5zZXRCaW5kR3JvdXAoMCxtKSxiLmRyYXcoNiwxLDAsMCksYi5lbmQoKSxzfSkoZSxsLGMsdSxmLGQpOyRsWzBdPXJbMF0sJGxbMV09clsxXSwkbFsyXT1yWzJdLCRsWzNdPXJbM10sJGxbNF09cls0XSwkbFs1XT1yWzVdLCRsWzZdPXJbNl0sJGxbN109MDtjb25zdCBhPUFvKHQsaSxuLCRsLHtkZXZpY2U6ZS5kZXZpY2UsY29tbWFuZEVuY29kZXI6ZS5jb21tYW5kRW5jb2RlcixidWZmZXJNYW5hZ2VyOmUuYnVmZmVyTWFuYWdlcixmcmFtZUJ1ZmZlck1hbmFnZXI6ZS5mcmFtZUJ1ZmZlck1hbmFnZXIscGlwZWxpbmVNYW5hZ2VyOmUucGlwZWxpbmVNYW5hZ2VyLHRleHR1cmVNYW5hZ2VyOmUudGV4dHVyZU1hbmFnZXIsZnJhbWVUZXh0dXJlczplLmZyYW1lVGV4dHVyZXN9KTsoKGUsdCxyLG4saSk9Pntjb25zdCBhPXIubXNhYSYmci5tc2FhVGV4dHVyZT8udmlldyxzPWE/ImZpbHRlcl9jb21wbGV4X2JsZW5kX291dHB1dF9tc2FhIjoiZmlsdGVyX2NvbXBsZXhfYmxlbmRfb3V0cHV0IixvPWUucGlwZWxpbmVNYW5hZ2VyLmdldFBpcGVsaW5lKHMpLGw9ZS5waXBlbGluZU1hbmFnZXIuZ2V0QmluZEdyb3VwTGF5b3V0KCJwb3NpdGlvbmVkX3RleHR1cmUiKTtpZighKG8mJmwmJnQudGV4dHVyZSYmci50ZXh0dXJlKSlyZXR1cm47JGxbMF09biwkbFsxXT1pLCRsWzJdPXQud2lkdGgsJGxbM109dC5oZWlnaHQsJGxbNF09ci53aWR0aCwkbFs1XT1yLmhlaWdodCwkbFs2XT0wLCRsWzddPTA7Y29uc3QgYz1lLmJ1ZmZlck1hbmFnZXIuYWNxdWlyZUFuZFdyaXRlVW5pZm9ybUJ1ZmZlcigkbCksdT1lLnRleHR1cmVNYW5hZ2VyLmNyZWF0ZVNhbXBsZXIoImZpbHRlcl9ibGVuZF9vdXRwdXRfc2FtcGxlciIsITEpO0xsWzBdLnJlc291cmNlLmJ1ZmZlcj1jLExsWzFdLnJlc291cmNlPXUsTGxbMl0ucmVzb3VyY2U9dC50ZXh0dXJlLnZpZXc7Y29uc3QgZj1lLmRldmljZS5jcmVhdGVCaW5kR3JvdXAoe2xheW91dDpsLGVudHJpZXM6TGx9KSxkPWE/ci5tc2FhVGV4dHVyZS52aWV3OnIudGV4dHVyZS52aWV3LGg9YT9yLnRleHR1cmUudmlldzpudWxsLHA9ZS5mcmFtZUJ1ZmZlck1hbmFnZXIuY3JlYXRlUmVuZGVyUGFzc0Rlc2NyaXB0b3IoZCwwLDAsMCwwLCJsb2FkIixoKSxtPWUuY29tbWFuZEVuY29kZXIuYmVnaW5SZW5kZXJQYXNzKHApO20uc2V0UGlwZWxpbmUobyksbS5zZXRCaW5kR3JvdXAoMCxmKSxtLmRyYXcoNiwxLDAsMCksbS5lbmQoKX0pKGUsYSxsLGMsdSksZS5mcmFtZUJ1ZmZlck1hbmFnZXIucmVsZWFzZVRlbXBvcmFyeUF0dGFjaG1lbnQoaSksZS5mcmFtZUJ1ZmZlck1hbmFnZXIucmVsZWFzZVRlbXBvcmFyeUF0dGFjaG1lbnQoYSl9dmFyIGJ9LGpsPShlLHQscixuLGksYSxzLG8sbCxjLHUsZik9PntJby54PTAsSW8ueT0wO2xldCBkPSgoZSx0LHIpPT57Y29uc3Qgbj1yLmNyZWF0ZVRlbXBvcmFyeUF0dGFjaG1lbnQoZS53LGUuaCksaT13YSgpfHxyLmdldEF0dGFjaG1lbnQoImF0bGFzIik7cmV0dXJuIGkmJmkudGV4dHVyZSYmbi50ZXh0dXJlP3QuY29weVRleHR1cmVUb1RleHR1cmUoe3RleHR1cmU6aS50ZXh0dXJlLnJlc291cmNlLG9yaWdpbjp7eDplLngseTplLnksejowfX0se3RleHR1cmU6bi50ZXh0dXJlLnJlc291cmNlLG9yaWdpbjp7eDowLHk6MCx6OjB9fSx7d2lkdGg6ZS53LGhlaWdodDplLmh9KTpjb25zb2xlLmVycm9yKCJbV2ViR1BVIEZpbHRlcl0gZ2V0VGV4dHVyZUZyb21Ob2RlOiBGQUlMRUQgLSBtaXNzaW5nIGF0bGFzIG9yIHRleHR1cmVzIiksbn0pKGUsYy5jb21tYW5kRW5jb2RlcixjLmZyYW1lQnVmZmVyTWFuYWdlcik7aWYoZC50ZXh0dXJlKXtjb25zdCB0PWMuZnJhbWVCdWZmZXJNYW5hZ2VyLmNyZWF0ZVRlbXBvcmFyeUF0dGFjaG1lbnQoZS53LGUuaCkscj1jLnBpcGVsaW5lTWFuYWdlci5nZXRQaXBlbGluZSgidGV4dHVyZV9jb3B5X3JnYmE4Iiksbj1jLnBpcGVsaW5lTWFuYWdlci5nZXRCaW5kR3JvdXBMYXlvdXQoInRleHR1cmVfY29weSIpO2lmKHImJm4mJnQudGV4dHVyZSl7Y29uc3QgZT1jLnRleHR1cmVNYW5hZ2VyLmNyZWF0ZVNhbXBsZXIoImZpbHRlcl9mbGlwX3NhbXBsZXIiLCExKSxpPWMuYnVmZmVyTWFuYWdlci5hY3F1aXJlQW5kV3JpdGVVbmlmb3JtQnVmZmVyKFZsKTtMbFswXS5yZXNvdXJjZS5idWZmZXI9aSxMbFsxXS5yZXNvdXJjZT1lLExsWzJdLnJlc291cmNlPWQudGV4dHVyZS52aWV3O2NvbnN0IGE9Yy5kZXZpY2UuY3JlYXRlQmluZEdyb3VwKHtsYXlvdXQ6bixlbnRyaWVzOkxsfSkscz1jLmZyYW1lQnVmZmVyTWFuYWdlci5jcmVhdGVSZW5kZXJQYXNzRGVzY3JpcHRvcih0LnRleHR1cmUudmlldywwLDAsMCwwLCJjbGVhciIpLG89Yy5jb21tYW5kRW5jb2Rlci5iZWdpblJlbmRlclBhc3Mocyk7by5zZXRQaXBlbGluZShyKSxvLnNldEJpbmRHcm91cCgwLGEpLG8uZHJhdyg2LDEsMCwwKSxvLmVuZCgpLGMuZnJhbWVCdWZmZXJNYW5hZ2VyLnJlbGVhc2VUZW1wb3JhcnlBdHRhY2htZW50KGQpLGQ9dH19Y29uc3QgaD1Ibi5nZXREZXZpY2VQaXhlbFJhdGlvKCkscD1NYXRoLnNxcnQoaVswXSppWzBdK2lbMV0qaVsxXSksbT1NYXRoLnNxcnQoaVsyXSppWzJdK2lbM10qaVszXSksZz1NYXRoLmF0YW4yKGlbMV0saVswXSksYj1NYXRoLmF0YW4yKC1pWzJdLGlbM10pLHg9bj9wKk1hdGguY29zKGcpOk1hdGguY29zKGcpLHY9bj9wKk1hdGguc2luKGcpOk1hdGguc2luKGcpLHk9bj8tbSpNYXRoLnNpbihiKTotTWF0aC5zaW4oYiksXz1uP20qTWF0aC5jb3MoYik6TWF0aC5jb3MoYik7RWxbMF09eCxFbFsxXT12LEVsWzJdPXksRWxbM109XyxFbFs0XT10LzIsRWxbNV09ci8yLFVsWzBdPTEsVWxbMV09MCxVbFsyXT0wLFVsWzNdPTEsVWxbNF09LWUudy8yLFVsWzVdPS1lLmgvMjtjb25zdCB3PUVsWzBdKlVsWzBdK0VsWzJdKlVsWzFdLE09RWxbMV0qVWxbMF0rRWxbM10qVWxbMV0sUD1FbFswXSpVbFsyXStFbFsyXSpVbFszXSxTPUVsWzFdKlVsWzJdK0VsWzNdKlVsWzNdLEY9RWxbMF0qVWxbNF0rRWxbMl0qVWxbNV0rRWxbNF0sVD1FbFsxXSpVbFs0XStFbFszXSpVbFs1XStFbFs1XTtsZXQgQj0wLE89MDtpZigxIT09d3x8MCE9PU18fDAhPT1QfHwxIT09Uyl7Y29uc3Qgbj1jLmZyYW1lQnVmZmVyTWFuYWdlci5jcmVhdGVUZW1wb3JhcnlBdHRhY2htZW50KHQsciksaT0idGV4dHVyZV9zY2FsZSIsYT1jLnBpcGVsaW5lTWFuYWdlci5nZXRQaXBlbGluZShpKSxzPWMucGlwZWxpbmVNYW5hZ2VyLmdldEJpbmRHcm91cExheW91dCgidGV4dHVyZV9zY2FsZSIpO2lmKGEmJnMpe0dsWzBdPXcsR2xbMV09TSxHbFsyXT1QLEdsWzNdPVMsR2xbNF09RixHbFs1XT1ULEdsWzZdPWUudyxHbFs3XT1lLmgsR2xbOF09dCxHbFs5XT1yLEdsWzEwXT0wLEdsWzExXT0wO2NvbnN0IGk9Yy5idWZmZXJNYW5hZ2VyLmFjcXVpcmVBbmRXcml0ZVVuaWZvcm1CdWZmZXIoR2wsNDgpLG89Yy50ZXh0dXJlTWFuYWdlci5jcmVhdGVTYW1wbGVyKCJmaWx0ZXJfc2NhbGVfc2FtcGxlciIsITApO0xsWzBdLnJlc291cmNlLmJ1ZmZlcj1pLExsWzFdLnJlc291cmNlPW8sTGxbMl0ucmVzb3VyY2U9ZC50ZXh0dXJlLnZpZXc7Y29uc3QgbD1jLmRldmljZS5jcmVhdGVCaW5kR3JvdXAoe2xheW91dDpzLGVudHJpZXM6TGx9KSx1PWMuZnJhbWVCdWZmZXJNYW5hZ2VyLmNyZWF0ZVJlbmRlclBhc3NEZXNjcmlwdG9yKG4udGV4dHVyZS52aWV3LDAsMCwwLDAsImNsZWFyIiksZj1jLmNvbW1hbmRFbmNvZGVyLmJlZ2luUmVuZGVyUGFzcyh1KTtmLnNldFBpcGVsaW5lKGEpLGYuc2V0QmluZEdyb3VwKDAsbCksZi5kcmF3KDYsMSwwLDApLGYuZW5kKCksQj1GLE89VCxjLmZyYW1lQnVmZmVyTWFuYWdlci5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChkKSxkPW59fWZvcihsZXQgZT0wO2wubGVuZ3RoPmU7KXtzd2l0Y2gobFtlKytdKXtjYXNlIDA6e2NvbnN0IHQ9bFtlKytdLHI9bFtlKytdLG49bFtlKytdLGE9bFtlKytdLHM9bFtlKytdLG89bFtlKytdLHU9bFtlKytdLGY9bFtlKytdLHA9bFtlKytdLG09bFtlKytdLGc9bFtlKytdLGI9Qm9vbGVhbihsW2UrK10pLHg9cGwoZCxpLHQscixuLGEscyxvLHUsZixwLG0sZyxiLGgsYyk7ZCE9PXgmJmMuZnJhbWVCdWZmZXJNYW5hZ2VyLnJlbGVhc2VUZW1wb3JhcnlBdHRhY2htZW50KGQpLGQ9eH1icmVhaztjYXNlIDE6e2NvbnN0IHQ9bFtlKytdLHI9bFtlKytdLG49bFtlKytdLGE9WW8oZCxpLHQscixuLGgsYyk7ZCE9PWEmJmMuZnJhbWVCdWZmZXJNYW5hZ2VyLnJlbGVhc2VUZW1wb3JhcnlBdHRhY2htZW50KGQpLGQ9YX1icmVhaztjYXNlIDI6e2tsWzBdPWxbZSsrXSxrbFsxXT1sW2UrK10sa2xbMl09bFtlKytdLGtsWzNdPWxbZSsrXSxrbFs0XT1sW2UrK10sa2xbNV09bFtlKytdLGtsWzZdPWxbZSsrXSxrbFs3XT1sW2UrK10sa2xbOF09bFtlKytdLGtsWzldPWxbZSsrXSxrbFsxMF09bFtlKytdLGtsWzExXT1sW2UrK10sa2xbMTJdPWxbZSsrXSxrbFsxM109bFtlKytdLGtsWzE0XT1sW2UrK10sa2xbMTVdPWxbZSsrXSxrbFsxNl09bFtlKytdLGtsWzE3XT1sW2UrK10sa2xbMThdPWxbZSsrXSxrbFsxOV09bFtlKytdO2NvbnN0IHQ9ZWwoZCxrbCxjKTtkIT09dCYmYy5mcmFtZUJ1ZmZlck1hbmFnZXIucmVsZWFzZVRlbXBvcmFyeUF0dGFjaG1lbnQoZCksZD10fWJyZWFrO2Nhc2UgMzp7Y29uc3QgdD1sW2UrK10scj1sW2UrK10sbj10KnIsaT1uZXcgRmxvYXQzMkFycmF5KG4pO2ZvcihsZXQgdD0wO3Q8bjt0KyspaVt0XT1sW2UrK107Y29uc3QgYT1sW2UrK10scz1sW2UrK10sbz1Cb29sZWFuKGxbZSsrXSksdT1Cb29sZWFuKGxbZSsrXSksZj1sW2UrK10saD1sW2UrK10scD1ibChkLHQscixpLGEscyxvLHUsZixoLGMpO2QhPT1wJiZjLmZyYW1lQnVmZmVyTWFuYWdlci5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChkKSxkPXB9YnJlYWs7Y2FzZSA0Ontjb25zdCB0PWxbZSsrXSxyPW5ldyBVaW50OEFycmF5KHQpO2ZvcihsZXQgbj0wO248dDtuKyspcltuXT1sW2UrK107Y29uc3Qgbj1sW2UrK10saT1sW2UrK10sYT1sW2UrK10scz1sW2UrK10sbz1sW2UrK10sdT1sW2UrK10sZj1sW2UrK10saD1sW2UrK10scD1sW2UrK10sbT1sW2UrK10sZz1sW2UrK10sYj1SbChkLDAscixuLGksYSxzLG8sdSxmLGgscCxtLGcsMCxjKTtkIT09YiYmYy5mcmFtZUJ1ZmZlck1hbmFnZXIucmVsZWFzZVRlbXBvcmFyeUF0dGFjaG1lbnQoZCksZD1ifWJyZWFrO2Nhc2UgNTp7Y29uc3QgdD1sW2UrK10scj1sW2UrK10sbj1sW2UrK10sYT1sW2UrK10scz1sW2UrK10sbz1sW2UrK10sdT1sW2UrK10sZj1sW2UrK10scD1Cb29sZWFuKGxbZSsrXSksbT1Cb29sZWFuKGxbZSsrXSksZz1Cb29sZWFuKGxbZSsrXSksYj1vbChkLGksdCxyLG4sYSxzLG8sdSxmLHAsbSxnLGgsYyk7ZCE9PWImJmMuZnJhbWVCdWZmZXJNYW5hZ2VyLnJlbGVhc2VUZW1wb3JhcnlBdHRhY2htZW50KGQpLGQ9Yn1icmVhaztjYXNlIDY6e2NvbnN0IHQ9bFtlKytdLHI9bFtlKytdLG49bFtlKytdLGE9bFtlKytdLHM9bFtlKytdLG89bFtlKytdLHU9Qm9vbGVhbihsW2UrK10pLGY9Qm9vbGVhbihsW2UrK10pLHA9bmwoZCxpLHQscixuLGEscyxvLHUsZixoLGMpO2QhPT1wJiZjLmZyYW1lQnVmZmVyTWFuYWdlci5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChkKSxkPXB9YnJlYWs7Y2FzZSA3Ontjb25zdCB0PWxbZSsrXSxyPWxbZSsrXSxuPWxbZSsrXSxhPW5ldyBGbG9hdDMyQXJyYXkobik7Zm9yKGxldCB0PTA7dDxuO3QrKylhW3RdPWxbZSsrXTtjb25zdCBzPWxbZSsrXSxvPW5ldyBGbG9hdDMyQXJyYXkocyk7Zm9yKGxldCB0PTA7dDxzO3QrKylvW3RdPWxbZSsrXTtjb25zdCB1PWxbZSsrXSxmPW5ldyBGbG9hdDMyQXJyYXkodSk7Zm9yKGxldCB0PTA7dDx1O3QrKylmW3RdPWxbZSsrXTtjb25zdCBwPWxbZSsrXSxtPWxbZSsrXSxnPWxbZSsrXSxiPWxbZSsrXSx4PWxbZSsrXSx2PUJvb2xlYW4obFtlKytdKSx5PU1sKGQsaSx0LHIsYSxvLGYscCxtLGcsYix4LHYsaCxjKTtkIT09eSYmYy5mcmFtZUJ1ZmZlck1hbmFnZXIucmVsZWFzZVRlbXBvcmFyeUF0dGFjaG1lbnQoZCksZD15fWJyZWFrO2Nhc2UgODp7Y29uc3QgdD1sW2UrK10scj1sW2UrK10sbj1sW2UrK10sYT1uZXcgRmxvYXQzMkFycmF5KG4pO2ZvcihsZXQgdD0wO3Q8bjt0KyspYVt0XT1sW2UrK107Y29uc3Qgcz1sW2UrK10sbz1uZXcgRmxvYXQzMkFycmF5KHMpO2ZvcihsZXQgdD0wO3Q8czt0Kyspb1t0XT1sW2UrK107Y29uc3QgdT1sW2UrK10sZj1uZXcgRmxvYXQzMkFycmF5KHUpO2ZvcihsZXQgdD0wO3Q8dTt0KyspZlt0XT1sW2UrK107Y29uc3QgcD1sW2UrK10sbT1sW2UrK10sZz1sW2UrK10sYj1sW2UrK10seD1sW2UrK10sdj1Cb29sZWFuKGxbZSsrXSkseT1UbChkLGksdCxyLGEsbyxmLHAsbSxnLGIseCx2LGgsYyk7ZCE9PXkmJmMuZnJhbWVCdWZmZXJNYW5hZ2VyLnJlbGVhc2VUZW1wb3JhcnlBdHRhY2htZW50KGQpLGQ9eX19fWlmKDEhPT0oQT1hKVswXXx8MSE9PUFbMV18fDEhPT1BWzJdfHwxIT09QVszXXx8MCE9PUFbNF18fDAhPT1BWzVdfHwwIT09QVs2XXx8MCE9PUFbN10pe2NvbnN0IGU9KChlLHQscik9Pntjb25zdCBuPWUuZnJhbWVCdWZmZXJNYW5hZ2VyLmNyZWF0ZVRlbXBvcmFyeUF0dGFjaG1lbnQodC53aWR0aCx0LmhlaWdodCksaT1lLnBpcGVsaW5lTWFuYWdlci5nZXRQaXBlbGluZSgiY29sb3JfdHJhbnNmb3JtIiksYT1lLnBpcGVsaW5lTWFuYWdlci5nZXRCaW5kR3JvdXBMYXlvdXQoInRleHR1cmVfY29weSIpO2lmKCEoaSYmYSYmdC50ZXh0dXJlJiZuLnRleHR1cmUpKXJldHVybiB0OyRsWzBdPXJbMF0sJGxbMV09clsxXSwkbFsyXT1yWzJdLCRsWzNdPXJbM10sJGxbNF09cls0XSwkbFs1XT1yWzVdLCRsWzZdPXJbNl0sJGxbN109MDtjb25zdCBzPWUuYnVmZmVyTWFuYWdlci5hY3F1aXJlQW5kV3JpdGVVbmlmb3JtQnVmZmVyKCRsKSxvPWUudGV4dHVyZU1hbmFnZXIuY3JlYXRlU2FtcGxlcigiY29sb3JfdHJhbnNmb3JtX3NhbXBsZXIiLCExKTtMbFswXS5yZXNvdXJjZS5idWZmZXI9cyxMbFsxXS5yZXNvdXJjZT1vLExsWzJdLnJlc291cmNlPXQudGV4dHVyZS52aWV3O2NvbnN0IGw9ZS5kZXZpY2UuY3JlYXRlQmluZEdyb3VwKHtsYXlvdXQ6YSxlbnRyaWVzOkxsfSksYz1lLmZyYW1lQnVmZmVyTWFuYWdlci5jcmVhdGVSZW5kZXJQYXNzRGVzY3JpcHRvcihuLnRleHR1cmUudmlldywwLDAsMCwwLCJjbGVhciIpLHU9ZS5jb21tYW5kRW5jb2Rlci5iZWdpblJlbmRlclBhc3MoYyk7cmV0dXJuIHUuc2V0UGlwZWxpbmUoaSksdS5zZXRCaW5kR3JvdXAoMCxsKSx1LmRyYXcoNiwxLDAsMCksdS5lbmQoKSxufSkoYyxkLGEpO2MuZnJhbWVCdWZmZXJNYW5hZ2VyLnJlbGVhc2VUZW1wb3JhcnlBdHRhY2htZW50KGQpLGQ9ZX12YXIgQTtjb25zdCBSPW9bMF0qKHAvaCksQz1vWzFdKihtL2gpLEU9LUIrUitpWzRdLFU9LU8rQytpWzVdO3psKGMsZCxhLHMsRSxVKSxjLmZyYW1lQnVmZmVyTWFuYWdlci5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChkKX0sRGw9bmV3IEZsb2F0MzJBcnJheSg0KSxObD1uZXcgRmxvYXQzMkFycmF5KDgpLFdsPW5ldyBGbG9hdDMyQXJyYXkoMjApLHFsPVt7YmluZGluZzowLHJlc291cmNlOntidWZmZXI6bnVsbH19LHtiaW5kaW5nOjEscmVzb3VyY2U6bnVsbH0se2JpbmRpbmc6MixyZXNvdXJjZTpudWxsfV0sWGw9bmV3IFNldChbIm5vcm1hbCIsImxheWVyIiwiYWRkIiwic2NyZWVuIiwiYWxwaGEiLCJlcmFzZSIsImNvcHkiXSksWWw9bmV3IEZsb2F0MzJBcnJheShbMSwxLDEsMSwwLDAsMCwwXSksS2w9ZT0+IWV8fDE9PT1lWzBdJiYxPT09ZVsxXSYmMT09PWVbMl0mJjE9PT1lWzNdJiYwPT09ZVs0XSYmMD09PWVbNV0mJjA9PT1lWzZdJiYwPT09ZVs3XSxIbD0oZSx0LHIpPT57Y29uc3Qgbj1lLmZyYW1lQnVmZmVyTWFuYWdlci5jcmVhdGVUZW1wb3JhcnlBdHRhY2htZW50KHQud2lkdGgsdC5oZWlnaHQpLGk9ZS5waXBlbGluZU1hbmFnZXIuZ2V0UGlwZWxpbmUoImNvbG9yX3RyYW5zZm9ybSIpLGE9ZS5waXBlbGluZU1hbmFnZXIuZ2V0QmluZEdyb3VwTGF5b3V0KCJ0ZXh0dXJlX2NvcHkiKTtpZighKGkmJmEmJnQudGV4dHVyZSYmbi50ZXh0dXJlKSlyZXR1cm4gdDtObFswXT1yWzBdLE5sWzFdPXJbMV0sTmxbMl09clsyXSxObFszXT1yWzNdLE5sWzRdPXJbNF0sTmxbNV09cls1XSxObFs2XT1yWzZdLE5sWzddPTA7Y29uc3Qgcz1lLmJ1ZmZlck1hbmFnZXIuYWNxdWlyZUFuZFdyaXRlVW5pZm9ybUJ1ZmZlcihObCksbz1lLnRleHR1cmVNYW5hZ2VyLmNyZWF0ZVNhbXBsZXIoImNvbnRhaW5lcl9jdF9zYW1wbGVyIiwhMSk7cWxbMF0ucmVzb3VyY2UuYnVmZmVyPXMscWxbMV0ucmVzb3VyY2U9byxxbFsyXS5yZXNvdXJjZT10LnRleHR1cmUudmlldztjb25zdCBsPWUuZGV2aWNlLmNyZWF0ZUJpbmRHcm91cCh7bGF5b3V0OmEsZW50cmllczpxbH0pLGM9ZS5mcmFtZUJ1ZmZlck1hbmFnZXIuY3JlYXRlUmVuZGVyUGFzc0Rlc2NyaXB0b3Iobi50ZXh0dXJlLnZpZXcsMCwwLDAsMCwiY2xlYXIiKSx1PWUuY29tbWFuZEVuY29kZXIuYmVnaW5SZW5kZXJQYXNzKGMpO3JldHVybiB1LnNldFBpcGVsaW5lKGkpLHUuc2V0QmluZEdyb3VwKDAsbCksdS5kcmF3KDYsMSwwLDApLHUuZW5kKCksbn0sUWw9KGUsdCxyLG4saSxhKT0+e2NvbnN0IHM9ZS5mcmFtZUJ1ZmZlck1hbmFnZXIuY3JlYXRlVGVtcG9yYXJ5QXR0YWNobWVudChpLGEpLG89ZS5waXBlbGluZU1hbmFnZXIuZ2V0UGlwZWxpbmUoImNvbXBsZXhfYmxlbmRfY29weSIpLGw9ZS5waXBlbGluZU1hbmFnZXIuZ2V0QmluZEdyb3VwTGF5b3V0KCJ0ZXh0dXJlX2NvcHkiKTtpZighKG8mJmwmJnQudGV4dHVyZSYmcy50ZXh0dXJlKSlyZXR1cm4gcztjb25zdCBjPWkvdC53aWR0aCx1PXIvdC53aWR0aCxmPS1hL3QuaGVpZ2h0LGQ9KG4rYSkvdC5oZWlnaHQ7RGxbMF09YyxEbFsxXT1mLERsWzJdPXUsRGxbM109ZDtjb25zdCBoPWUuYnVmZmVyTWFuYWdlci5hY3F1aXJlQW5kV3JpdGVVbmlmb3JtQnVmZmVyKERsKSxwPWUudGV4dHVyZU1hbmFnZXIuY3JlYXRlU2FtcGxlcigiY29udGFpbmVyX2NvcHlfc2FtcGxlciIsITEpO3FsWzBdLnJlc291cmNlLmJ1ZmZlcj1oLHFsWzFdLnJlc291cmNlPXAscWxbMl0ucmVzb3VyY2U9dC50ZXh0dXJlLnZpZXc7Y29uc3QgbT1lLmRldmljZS5jcmVhdGVCaW5kR3JvdXAoe2xheW91dDpsLGVudHJpZXM6cWx9KSxnPWUuZnJhbWVCdWZmZXJNYW5hZ2VyLmNyZWF0ZVJlbmRlclBhc3NEZXNjcmlwdG9yKHMudGV4dHVyZS52aWV3LDAsMCwwLDAsImNsZWFyIiksYj1lLmNvbW1hbmRFbmNvZGVyLmJlZ2luUmVuZGVyUGFzcyhnKTtyZXR1cm4gYi5zZXRQaXBlbGluZShvKSxiLnNldEJpbmRHcm91cCgwLG0pLGIuZHJhdyg2LDEsMCwwKSxiLmVuZCgpLHN9LFpsPShlLHQscixuLGksYSxzKT0+e2lmKCFyLnRleHR1cmV8fCF0LnRleHR1cmUpcmV0dXJuO2xldCBvPWksbD1hLGM9dC53aWR0aCx1PXQuaGVpZ2h0LGY9MCxkPTA7aWYobzwwJiYoZj0tby90LndpZHRoLGMrPW8sbz0wKSxsPDAmJihkPS1sL3QuaGVpZ2h0LHUrPWwsbD0wKSxjPD0wfHx1PD0wKXJldHVybjtjb25zdCBoPXIud2lkdGgscD1yLmhlaWdodDtpZihvK2M+aCYmKGM9aC1vKSxsK3U+cCYmKHU9cC1sKSxYbC5oYXMobikpe2NvbnN0IGk9ci5tc2FhJiZyLm1zYWFUZXh0dXJlPy52aWV3O2xldCBhO3N3aXRjaChuKXtjYXNlImFkZCI6YT1pPyJmaWx0ZXJfb3V0cHV0X2FkZF9tc2FhIjoiZmlsdGVyX291dHB1dF9hZGQiO2JyZWFrO2Nhc2Uic2NyZWVuIjphPWk/ImZpbHRlcl9vdXRwdXRfc2NyZWVuX21zYWEiOiJmaWx0ZXJfb3V0cHV0X3NjcmVlbiI7YnJlYWs7Y2FzZSJhbHBoYSI6YT1pPyJmaWx0ZXJfb3V0cHV0X2FscGhhX21zYWEiOiJmaWx0ZXJfb3V0cHV0X2FscGhhIjticmVhaztjYXNlImVyYXNlIjphPWk/ImZpbHRlcl9vdXRwdXRfZXJhc2VfbXNhYSI6ImZpbHRlcl9vdXRwdXRfZXJhc2UiO2JyZWFrO2Nhc2UiY29weSI6YT1pPyJ0ZXh0dXJlX2NvcHlfYmdyYV9tc2FhIjoidGV4dHVyZV9jb3B5X2JncmEiO2JyZWFrO2RlZmF1bHQ6YT1pPyJmaWx0ZXJfb3V0cHV0X21zYWEiOiJmaWx0ZXJfb3V0cHV0In1jb25zdCBtPWUucGlwZWxpbmVNYW5hZ2VyLmdldFBpcGVsaW5lKGEpLGc9ZS5waXBlbGluZU1hbmFnZXIuZ2V0QmluZEdyb3VwTGF5b3V0KCJ0ZXh0dXJlX2NvcHkiKTtpZighbXx8IWcpcmV0dXJuO2NvbnN0IGI9ZS50ZXh0dXJlTWFuYWdlci5jcmVhdGVTYW1wbGVyKCJjb250YWluZXJfb3V0cHV0X3NhbXBsZXIiLCEwKSx4PWMvdC53aWR0aCx2PXUvdC5oZWlnaHQ7RGxbMF09eCxEbFsxXT12LERsWzJdPWYsRGxbM109ZDtjb25zdCB5PXMuYWNxdWlyZUFuZFdyaXRlVW5pZm9ybUJ1ZmZlcihEbCk7cWxbMF0ucmVzb3VyY2UuYnVmZmVyPXkscWxbMV0ucmVzb3VyY2U9YixxbFsyXS5yZXNvdXJjZT10LnRleHR1cmUudmlldztjb25zdCBfPWUuZGV2aWNlLmNyZWF0ZUJpbmRHcm91cCh7bGF5b3V0OmcsZW50cmllczpxbH0pLHc9aT9yLm1zYWFUZXh0dXJlLnZpZXc6ci50ZXh0dXJlLnZpZXcsTT1pP3IudGV4dHVyZS52aWV3Om51bGwsUD1lLmZyYW1lQnVmZmVyTWFuYWdlci5jcmVhdGVSZW5kZXJQYXNzRGVzY3JpcHRvcih3LDAsMCwwLDAsImxvYWQiLE0pLFM9TWF0aC5tYXgoMCxvKSxGPU1hdGgubWF4KDAsbCksVD1NYXRoLm1heCgxLGMpLEI9TWF0aC5tYXgoMSx1KSxPPU1hdGgubWF4KDAsTWF0aC5mbG9vcihTKSksQT1NYXRoLm1heCgwLE1hdGguZmxvb3IoRikpLFI9TWF0aC5tYXgoMSxNYXRoLm1pbihNYXRoLmNlaWwoUytUKS1PLGgtTykpLEM9TWF0aC5tYXgoMSxNYXRoLm1pbihNYXRoLmNlaWwoRitCKS1BLHAtQSkpO2lmKFI8PTB8fEM8PTB8fE8+PWh8fEE+PXApcmV0dXJuO2NvbnN0IEU9ZS5jb21tYW5kRW5jb2Rlci5iZWdpblJlbmRlclBhc3MoUCk7RS5zZXRQaXBlbGluZShtKSxFLnNldEJpbmRHcm91cCgwLF8pLEUuc2V0Vmlld3BvcnQoUyxGLFQsQiwwLDEpLEUuc2V0U2Npc3NvclJlY3QoTyxBLFIsQyksRS5kcmF3KDYsMSwwLDApLEUuZW5kKCl9ZWxzZXtjb25zdCBpPVFsKGUscixvLGwsYyx1KTtObFswXT1ZbFswXSxObFsxXT1ZbFsxXSxObFsyXT1ZbFsyXSxObFszXT1ZbFszXSxObFs0XT1ZbFs0XS8yNTUsTmxbNV09WWxbNV0vMjU1LE5sWzZdPVlsWzZdLzI1NSxObFs3XT0wO2NvbnN0IGE9QW8odCxpLG4sTmwse2RldmljZTplLmRldmljZSxjb21tYW5kRW5jb2RlcjplLmNvbW1hbmRFbmNvZGVyLGJ1ZmZlck1hbmFnZXI6ZS5idWZmZXJNYW5hZ2VyLGZyYW1lQnVmZmVyTWFuYWdlcjplLmZyYW1lQnVmZmVyTWFuYWdlcixwaXBlbGluZU1hbmFnZXI6ZS5waXBlbGluZU1hbmFnZXIsdGV4dHVyZU1hbmFnZXI6ZS50ZXh0dXJlTWFuYWdlcixmcmFtZVRleHR1cmVzOmUuZnJhbWVUZXh0dXJlc30pLGY9ci5tc2FhJiZyLm1zYWFUZXh0dXJlPy52aWV3LGQ9Zj8iZmlsdGVyX2NvbXBsZXhfYmxlbmRfb3V0cHV0X21zYWEiOiJmaWx0ZXJfY29tcGxleF9ibGVuZF9vdXRwdXQiLGg9ZS5waXBlbGluZU1hbmFnZXIuZ2V0UGlwZWxpbmUoZCkscD1lLnBpcGVsaW5lTWFuYWdlci5nZXRCaW5kR3JvdXBMYXlvdXQoInBvc2l0aW9uZWRfdGV4dHVyZSIpO2lmKGgmJnAmJmEudGV4dHVyZSYmci50ZXh0dXJlKXtObFswXT1vLE5sWzFdPWwsTmxbMl09YS53aWR0aCxObFszXT1hLmhlaWdodCxObFs0XT1yLndpZHRoLE5sWzVdPXIuaGVpZ2h0LE5sWzZdPTAsTmxbN109MDtjb25zdCB0PXMuYWNxdWlyZUFuZFdyaXRlVW5pZm9ybUJ1ZmZlcihObCksbj1lLnRleHR1cmVNYW5hZ2VyLmNyZWF0ZVNhbXBsZXIoImNvbnRhaW5lcl9ibGVuZF9vdXRwdXRfc2FtcGxlciIsITEpO3FsWzBdLnJlc291cmNlLmJ1ZmZlcj10LHFsWzFdLnJlc291cmNlPW4scWxbMl0ucmVzb3VyY2U9YS50ZXh0dXJlLnZpZXc7Y29uc3QgaT1lLmRldmljZS5jcmVhdGVCaW5kR3JvdXAoe2xheW91dDpwLGVudHJpZXM6cWx9KSxjPWY/ci5tc2FhVGV4dHVyZS52aWV3OnIudGV4dHVyZS52aWV3LHU9Zj9yLnRleHR1cmUudmlldzpudWxsLGQ9ZS5mcmFtZUJ1ZmZlck1hbmFnZXIuY3JlYXRlUmVuZGVyUGFzc0Rlc2NyaXB0b3IoYywwLDAsMCwwLCJsb2FkIix1KSxtPWUuY29tbWFuZEVuY29kZXIuYmVnaW5SZW5kZXJQYXNzKGQpO20uc2V0UGlwZWxpbmUoaCksbS5zZXRCaW5kR3JvdXAoMCxpKSxtLmRyYXcoNiwxLDAsMCksbS5lbmQoKX1lLmZyYW1lQnVmZmVyTWFuYWdlci5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChpKSxlLmZyYW1lQnVmZmVyTWFuYWdlci5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChhKX19LEpsPShlLHQscixuLGksYSxzLG8sbCxjLHUsZixkLGgscCk9PntpZihzJiZpJiZvJiZsKXtsZXQgcj1RbChoLGUsMCwwLGUud2lkdGgsZS5oZWlnaHQpO2guZnJhbWVCdWZmZXJNYW5hZ2VyLnJlbGVhc2VUZW1wb3JhcnlBdHRhY2htZW50KGUpO2NvbnN0IHM9SG4uZ2V0RGV2aWNlUGl4ZWxSYXRpbygpO2lmKHI9KChlLHQscixuLGkpPT57SW8ueD0wLElvLnk9MDtmb3IobGV0IGE9MDtyLmxlbmd0aD5hOylzd2l0Y2goclthKytdKXtjYXNlIDA6e2NvbnN0IHM9cGwoZSx0LHJbYSsrXSxyW2ErK10sclthKytdLHJbYSsrXSxyW2ErK10sclthKytdLHJbYSsrXSxyW2ErK10sclthKytdLHJbYSsrXSxyW2ErK10sQm9vbGVhbihyW2ErK10pLG4saSk7ZSE9PXMmJmkuZnJhbWVCdWZmZXJNYW5hZ2VyLnJlbGVhc2VUZW1wb3JhcnlBdHRhY2htZW50KGUpLGU9c31icmVhaztjYXNlIDE6e2NvbnN0IHM9WW8oZSx0LHJbYSsrXSxyW2ErK10sclthKytdLG4saSk7ZSE9PXMmJmkuZnJhbWVCdWZmZXJNYW5hZ2VyLnJlbGVhc2VUZW1wb3JhcnlBdHRhY2htZW50KGUpLGU9c31icmVhaztjYXNlIDI6e1dsWzBdPXJbYSsrXSxXbFsxXT1yW2ErK10sV2xbMl09clthKytdLFdsWzNdPXJbYSsrXSxXbFs0XT1yW2ErK10sV2xbNV09clthKytdLFdsWzZdPXJbYSsrXSxXbFs3XT1yW2ErK10sV2xbOF09clthKytdLFdsWzldPXJbYSsrXSxXbFsxMF09clthKytdLFdsWzExXT1yW2ErK10sV2xbMTJdPXJbYSsrXSxXbFsxM109clthKytdLFdsWzE0XT1yW2ErK10sV2xbMTVdPXJbYSsrXSxXbFsxNl09clthKytdLFdsWzE3XT1yW2ErK10sV2xbMThdPXJbYSsrXSxXbFsxOV09clthKytdO2NvbnN0IHQ9ZWwoZSxXbCxpKTtlIT09dCYmaS5mcmFtZUJ1ZmZlck1hbmFnZXIucmVsZWFzZVRlbXBvcmFyeUF0dGFjaG1lbnQoZSksZT10fWJyZWFrO2Nhc2UgMzp7Y29uc3QgdD1yW2ErK10sbj1yW2ErK10scz10Km4sbz1uZXcgRmxvYXQzMkFycmF5KHMpO2ZvcihsZXQgZT0wO2U8cztlKyspb1tlXT1yW2ErK107Y29uc3QgbD1ibChlLHQsbixvLHJbYSsrXSxyW2ErK10sQm9vbGVhbihyW2ErK10pLEJvb2xlYW4oclthKytdKSxyW2ErK10sclthKytdLGkpO2UhPT1sJiZpLmZyYW1lQnVmZmVyTWFuYWdlci5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChlKSxlPWx9YnJlYWs7Y2FzZSA0Ontjb25zdCB0PXJbYSsrXSxuPW5ldyBVaW50OEFycmF5KHQpO2ZvcihsZXQgZT0wO2U8dDtlKyspbltlXT1yW2ErK107Y29uc3Qgcz1SbChlLDAsbixyW2ErK10sclthKytdLHJbYSsrXSxyW2ErK10sclthKytdLHJbYSsrXSxyW2ErK10sclthKytdLHJbYSsrXSxyW2ErK10sclthKytdLDAsaSk7ZSE9PXMmJmkuZnJhbWVCdWZmZXJNYW5hZ2VyLnJlbGVhc2VUZW1wb3JhcnlBdHRhY2htZW50KGUpLGU9c31icmVhaztjYXNlIDU6e2NvbnN0IHM9b2woZSx0LHJbYSsrXSxyW2ErK10sclthKytdLHJbYSsrXSxyW2ErK10sclthKytdLHJbYSsrXSxyW2ErK10sQm9vbGVhbihyW2ErK10pLEJvb2xlYW4oclthKytdKSxCb29sZWFuKHJbYSsrXSksbixpKTtlIT09cyYmaS5mcmFtZUJ1ZmZlck1hbmFnZXIucmVsZWFzZVRlbXBvcmFyeUF0dGFjaG1lbnQoZSksZT1zfWJyZWFrO2Nhc2UgNjp7Y29uc3Qgcz1ubChlLHQsclthKytdLHJbYSsrXSxyW2ErK10sclthKytdLHJbYSsrXSxyW2ErK10sQm9vbGVhbihyW2ErK10pLEJvb2xlYW4oclthKytdKSxuLGkpO2UhPT1zJiZpLmZyYW1lQnVmZmVyTWFuYWdlci5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChlKSxlPXN9YnJlYWs7Y2FzZSA3Ontjb25zdCBzPXJbYSsrXSxvPXJbYSsrXSxsPXJbYSsrXSxjPW5ldyBGbG9hdDMyQXJyYXkobCk7Zm9yKGxldCBlPTA7ZTxsO2UrKyljW2VdPXJbYSsrXTtjb25zdCB1PXJbYSsrXSxmPW5ldyBGbG9hdDMyQXJyYXkodSk7Zm9yKGxldCBlPTA7ZTx1O2UrKylmW2VdPXJbYSsrXTtjb25zdCBkPXJbYSsrXSxoPW5ldyBGbG9hdDMyQXJyYXkoZCk7Zm9yKGxldCBlPTA7ZTxkO2UrKyloW2VdPXJbYSsrXTtjb25zdCBwPU1sKGUsdCxzLG8sYyxmLGgsclthKytdLHJbYSsrXSxyW2ErK10sclthKytdLHJbYSsrXSxCb29sZWFuKHJbYSsrXSksbixpKTtlIT09cCYmaS5mcmFtZUJ1ZmZlck1hbmFnZXIucmVsZWFzZVRlbXBvcmFyeUF0dGFjaG1lbnQoZSksZT1wfWJyZWFrO2Nhc2UgODp7Y29uc3Qgcz1yW2ErK10sbz1yW2ErK10sbD1yW2ErK10sYz1uZXcgRmxvYXQzMkFycmF5KGwpO2ZvcihsZXQgZT0wO2U8bDtlKyspY1tlXT1yW2ErK107Y29uc3QgdT1yW2ErK10sZj1uZXcgRmxvYXQzMkFycmF5KHUpO2ZvcihsZXQgZT0wO2U8dTtlKyspZltlXT1yW2ErK107Y29uc3QgZD1yW2ErK10saD1uZXcgRmxvYXQzMkFycmF5KGQpO2ZvcihsZXQgZT0wO2U8ZDtlKyspaFtlXT1yW2ErK107Y29uc3QgcD1UbChlLHQscyxvLGMsZixoLHJbYSsrXSxyW2ErK10sclthKytdLHJbYSsrXSxyW2ErK10sQm9vbGVhbihyW2ErK10pLG4saSk7ZSE9PXAmJmkuZnJhbWVCdWZmZXJNYW5hZ2VyLnJlbGVhc2VUZW1wb3JhcnlBdHRhY2htZW50KGUpLGU9cH19cmV0dXJuIGV9KShyLGksbCxzLGgpLGMmJih5bi5zZXQoYywiZktleSIsdSkseW4uc2V0KGMsImZUZXh0dXJlIixyKSkscil7bGV0IGU9cixsPW51bGw7S2woYSl8fChsPUhsKGgscixhKSxlPWwpO2NvbnN0IHU9TWF0aC5zcXJ0KGlbMF0qaVswXStpWzFdKmlbMV0pLGY9TWF0aC5zcXJ0KGlbMl0qaVsyXStpWzNdKmlbM10pLGQ9b1swXSoodS9zKSxtPW9bMV0qKGYvcyksZz1kK2lbNF0sYj1tK2lbNV07WmwoaCxlLHQsbixnLGIscCksbCYmaC5mcmFtZUJ1ZmZlck1hbmFnZXIucmVsZWFzZVRlbXBvcmFyeUF0dGFjaG1lbnQobCksY3x8aC5mcmFtZUJ1ZmZlck1hbmFnZXIucmVsZWFzZVRlbXBvcmFyeUF0dGFjaG1lbnQocil9fWVsc2V7bGV0IHI9UWwoaCxlLDAsMCxlLndpZHRoLGUuaGVpZ2h0KTtpZihoLmZyYW1lQnVmZmVyTWFuYWdlci5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChlKSwhS2woYSkpe2NvbnN0IGU9SGwoaCxyLGEpO2guZnJhbWVCdWZmZXJNYW5hZ2VyLnJlbGVhc2VUZW1wb3JhcnlBdHRhY2htZW50KHIpLHI9ZX1abChoLHIsdCxuLGlbNF0saVs1XSxwKSxoLmZyYW1lQnVmZmVyTWFuYWdlci5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChyKX19LGVjPW5ldyBGbG9hdDMyQXJyYXkoWzEsMSwwLDBdKSx0Yz1bXSxyYz1uZXcgRmxvYXQzMkFycmF5KFswLDAsLjUsLjUsMSwxLDEsMSwxLDAsMCwwLDEsMCwwLDAsMSwxLDAsLjUsLjUsMSwxLDEsMSwxLDAsMCwwLDEsMCwwLDAsMSwwLDEsLjUsLjUsMSwxLDEsMSwxLDAsMCwwLDEsMCwwLDAsMSwxLDAsLjUsLjUsMSwxLDEsMSwxLDAsMCwwLDEsMCwwLDAsMSwxLDEsLjUsLjUsMSwxLDEsMSwxLDAsMCwwLDEsMCwwLDAsMSwwLDEsLjUsLjUsMSwxLDEsMSwxLDAsMCwwLDEsMCwwLDAsMV0pLG5jPW5ldyBGbG9hdDMyQXJyYXkoWzAsMCwxLDAsMCwxLDEsMCwxLDEsMCwxXSksaWM9bmV3IEZsb2F0MzJBcnJheSg4KSxhYz1uZXcgRmxvYXQzMkFycmF5KDE2KTtsZXQgc2M9bnVsbCxvYz1udWxsLGxjPW51bGw7Y29uc3QgY2M9e3ZpZXc6bnVsbCxjbGVhclZhbHVlOntyOjAsZzowLGI6MCxhOjB9LGxvYWRPcDoiY2xlYXIiLHN0b3JlT3A6InN0b3JlIn0sdWM9e2NvbG9yQXR0YWNobWVudHM6W2NjXX0sZmM9W3tiaW5kaW5nOjAscmVzb3VyY2U6e2J1ZmZlcjpudWxsfX0se2JpbmRpbmc6MSxyZXNvdXJjZTpudWxsfSx7YmluZGluZzoyLHJlc291cmNlOm51bGx9XSxkYz17cjowLGc6MCxiOjAsYTowfSxoYz17dmlldzpudWxsLGNsZWFyVmFsdWU6ZGMsbG9hZE9wOiJjbGVhciIsc3RvcmVPcDoic3RvcmUiLHJlc29sdmVUYXJnZXQ6dm9pZCAwfSxwYz17dmlldzpudWxsLHN0ZW5jaWxDbGVhclZhbHVlOjAsc3RlbmNpbExvYWRPcDoiY2xlYXIiLHN0ZW5jaWxTdG9yZU9wOiJzdG9yZSJ9LG1jPXtjb2xvckF0dGFjaG1lbnRzOltoY119LGdjPXt2aWV3Om51bGwscmVzb2x2ZVRhcmdldDp2b2lkIDAsbG9hZE9wOiJsb2FkIixzdG9yZU9wOiJzdG9yZSJ9LGJjPXt2aWV3Om51bGwsc3RlbmNpbExvYWRPcDoibG9hZCIsc3RlbmNpbFN0b3JlT3A6InN0b3JlIn0seGM9e2NvbG9yQXR0YWNobWVudHM6W2djXX07Y2xhc3MgdmN7Y29uc3RydWN0b3IoZSx0LHIsbj0xKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJHN0YWNrIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRtYXRyaXgiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJGNsZWFyQ29sb3JSIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRjbGVhckNvbG9yRyIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkY2xlYXJDb2xvckIiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJGNsZWFyQ29sb3JBIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRtYWluQXR0YWNobWVudE9iamVjdCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkc3RhY2tBdHRhY2htZW50T2JqZWN0Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImdsb2JhbEFscGhhIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpbWFnZVNtb290aGluZ0VuYWJsZWQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJGZpbGxTdHlsZSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkc3Ryb2tlU3R5bGUiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywibWFza0JvdW5kcyIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJ0aGlja25lc3MiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiY2FwcyIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJqb2ludHMiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywibWl0ZXJMaW1pdCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJkZXZpY2UiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiY2FudmFzQ29udGV4dCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJwcmVmZXJyZWRGb3JtYXQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiY29tbWFuZEVuY29kZXIiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpudWxsfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInJlbmRlclBhc3NFbmNvZGVyIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bnVsbH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJtYWluVGV4dHVyZSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOm51bGx9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywibWFpblRleHR1cmVWaWV3Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bnVsbH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJmcmFtZVN0YXJ0ZWQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTohMX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJmcmFtZVRleHR1cmVzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6W119KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywicG9vbGVkVGV4dHVyZXMiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpbXX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJwb29sZWRSZW5kZXJUZXh0dXJlcyIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOltdfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImN1cnJlbnRSZW5kZXJUYXJnZXQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpudWxsfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInZpZXdwb3J0V2lkdGgiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTowfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInZpZXdwb3J0SGVpZ2h0Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6MH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJwYXRoQ29tbWFuZCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJidWZmZXJNYW5hZ2VyIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInRleHR1cmVNYW5hZ2VyIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImZyYW1lQnVmZmVyTWFuYWdlciIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJwaXBlbGluZU1hbmFnZXIiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiY29tcHV0ZVBpcGVsaW5lTWFuYWdlciIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJhdHRhY2htZW50TWFuYWdlciIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJuZXdEcmF3U3RhdGUiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTohMX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkY29udGFpbmVyTGF5ZXJTdGFjayIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOltdfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImNvbnRhaW5lckxheWVyQ29udGVudFNpemVzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6W119KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaW5NYXNrTW9kZSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOiExfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIm5vZGVBcmVhQ2xlYXJlZCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOiExfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImN1cnJlbnROb2RlU2Npc3NvciIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOm51bGx9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywibm9kZVJlbmRlclBhc3NBdGxhc0luZGV4Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6LTF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiZmlsbER5bmFtaWNCaW5kR3JvdXAiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpudWxsfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImZpbGxEeW5hbWljQmluZEdyb3VwQnVmZmVyIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bnVsbH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJub2RlQ2xlYXJRdWFkQnVmZmVyIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bnVsbH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJ1c2VPcHRpbWl6ZWRJbnN0YW5jaW5nIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJG5lZWRzUmVjb25maWd1cmUiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTohMX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkdW5pZm9ybURhdGE4Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bmV3IEZsb2F0MzJBcnJheSg4KX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkc2Npc3NvclJlY3QiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp7eDowLHk6MCx3OjAsaDowfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkZmlsdGVyQ29uZmlnIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksdGhpcy5kZXZpY2U9ZSx0aGlzLmNhbnZhc0NvbnRleHQ9dCx0aGlzLnByZWZlcnJlZEZvcm1hdD1yLEhuLnNldERldmljZShlKSxIbi5zZXREZXZpY2VQaXhlbFJhdGlvKG4pO2NvbnN0IGk9ZS5saW1pdHMubWF4VGV4dHVyZURpbWVuc2lvbjJELGE9TWF0aC5tYXgoMjA0OCxpLzIpO3ZhciBzO0huLnNldFJlbmRlck1heFNpemUoYSksdGhpcy4kc3RhY2s9SG4uY3JlYXRlQXJyYXkoKSx0aGlzLiRzdGFja0F0dGFjaG1lbnRPYmplY3Q9SG4uY3JlYXRlQXJyYXkoKSx0aGlzLiRtYXRyaXg9SG4uY3JlYXRlRmxvYXQzMkFycmF5KDkpLHRoaXMuJG1hdHJpeC5zZXQoWzEsMCwwLDAsMSwwLDAsMCwxXSksdGhpcy4kY2xlYXJDb2xvclI9MCx0aGlzLiRjbGVhckNvbG9yRz0wLHRoaXMuJGNsZWFyQ29sb3JCPTAsdGhpcy4kY2xlYXJDb2xvckE9MCx0aGlzLnRoaWNrbmVzcz0xLHRoaXMuY2Fwcz0wLHRoaXMuam9pbnRzPTIsdGhpcy5taXRlckxpbWl0PTAsdGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3Q9bnVsbCx0aGlzLmdsb2JhbEFscGhhPTEsdGhpcy5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249Im5vcm1hbCIsdGhpcy5pbWFnZVNtb290aGluZ0VuYWJsZWQ9ITEsdGhpcy4kZmlsbFN0eWxlPW5ldyBGbG9hdDMyQXJyYXkoWzEsMSwxLDFdKSx0aGlzLiRzdHJva2VTdHlsZT1uZXcgRmxvYXQzMkFycmF5KFsxLDEsMSwxXSksdGhpcy5tYXNrQm91bmRzPXt4TWluOjAseU1pbjowLHhNYXg6MCx5TWF4OjB9LHQuY29uZmlndXJlKHtkZXZpY2U6ZSxmb3JtYXQ6cixhbHBoYU1vZGU6InByZW11bHRpcGxpZWQifSksdGhpcy52aWV3cG9ydFdpZHRoPXQuY2FudmFzLndpZHRoLHRoaXMudmlld3BvcnRIZWlnaHQ9dC5jYW52YXMuaGVpZ2h0LHRoaXMucGF0aENvbW1hbmQ9bmV3IEpuLHRoaXMuYnVmZmVyTWFuYWdlcj1uZXcgc2koZSksdGhpcy50ZXh0dXJlTWFuYWdlcj1uZXcgb2koZSksdGhpcy5mcmFtZUJ1ZmZlck1hbmFnZXI9bmV3IG1pKGUsciksdGhpcy5waXBlbGluZU1hbmFnZXI9bmV3IHBhKGUsciksdGhpcy5waXBlbGluZU1hbmFnZXIucHJlbG9hZExhenlHcm91cHMoKSx0aGlzLmNvbXB1dGVQaXBlbGluZU1hbmFnZXI9bmV3IG1hKGUpLHRoaXMuYXR0YWNobWVudE1hbmFnZXI9bmV3IE1pKGUpLHM9ZT0+e2NvbnN0IHQ9SG4uZ2V0UmVuZGVyTWF4U2l6ZSgpO3JldHVybiB0aGlzLmZyYW1lQnVmZmVyTWFuYWdlci5jcmVhdGVBdHRhY2htZW50KGBhdGxhc18ke2V9YCx0LHQsITEsITApfSxfYT1zLHRoaXMuJGZpbHRlckNvbmZpZz17ZGV2aWNlOnRoaXMuZGV2aWNlLGNvbW1hbmRFbmNvZGVyOm51bGwsYnVmZmVyTWFuYWdlcjp0aGlzLmJ1ZmZlck1hbmFnZXIsZnJhbWVCdWZmZXJNYW5hZ2VyOnRoaXMuZnJhbWVCdWZmZXJNYW5hZ2VyLHBpcGVsaW5lTWFuYWdlcjp0aGlzLnBpcGVsaW5lTWFuYWdlcix0ZXh0dXJlTWFuYWdlcjp0aGlzLnRleHR1cmVNYW5hZ2VyLGNvbXB1dGVQaXBlbGluZU1hbmFnZXI6dGhpcy5jb21wdXRlUGlwZWxpbmVNYW5hZ2VyLGZyYW1lVGV4dHVyZXM6dGhpcy5mcmFtZVRleHR1cmVzfSxRbj10aGlzfWNsZWFyVHJhbnNmZXJCb3VuZHMoKXt0aGlzLmJlZ2luRnJhbWUoKX11cGRhdGVCYWNrZ3JvdW5kQ29sb3IoZSx0LHIsbil7dGhpcy4kY2xlYXJDb2xvclI9ZSx0aGlzLiRjbGVhckNvbG9yRz10LHRoaXMuJGNsZWFyQ29sb3JCPXIsdGhpcy4kY2xlYXJDb2xvckE9bn1maWxsQmFja2dyb3VuZENvbG9yKCl7aWYoIXRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0fHwhdGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3QudGV4dHVyZSlyZXR1cm47dGhpcy5mcmFtZVN0YXJ0ZWR8fHRoaXMuYmVnaW5GcmFtZSgpLHRoaXMucmVuZGVyUGFzc0VuY29kZXImJih0aGlzLnJlbmRlclBhc3NFbmNvZGVyLmVuZCgpLHRoaXMucmVuZGVyUGFzc0VuY29kZXI9bnVsbCksdGhpcy5lbnN1cmVDb21tYW5kRW5jb2RlcigpO2NvbnN0IGU9dGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3QubXNhYSYmdGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3QubXNhYVRleHR1cmU/LnZpZXc7aGMudmlldz1lP3RoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0Lm1zYWFUZXh0dXJlLnZpZXc6dGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3QudGV4dHVyZS52aWV3LGhjLnJlc29sdmVUYXJnZXQ9ZT90aGlzLiRtYWluQXR0YWNobWVudE9iamVjdC50ZXh0dXJlLnZpZXc6dm9pZCAwLGRjLnI9dGhpcy4kY2xlYXJDb2xvclIsZGMuZz10aGlzLiRjbGVhckNvbG9yRyxkYy5iPXRoaXMuJGNsZWFyQ29sb3JCLGRjLmE9dGhpcy4kY2xlYXJDb2xvckE7Y29uc3QgdD1lJiZ0aGlzLiRtYWluQXR0YWNobWVudE9iamVjdC5tc2FhU3RlbmNpbD8udmlldz90aGlzLiRtYWluQXR0YWNobWVudE9iamVjdC5tc2FhU3RlbmNpbC52aWV3OnRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0LnN0ZW5jaWw/LnZpZXc7dD8ocGMudmlldz10LG1jLmRlcHRoU3RlbmNpbEF0dGFjaG1lbnQ9cGMpOm1jLmRlcHRoU3RlbmNpbEF0dGFjaG1lbnQ9dm9pZCAwLHRoaXMucmVuZGVyUGFzc0VuY29kZXI9dGhpcy5jb21tYW5kRW5jb2Rlci5iZWdpblJlbmRlclBhc3MobWMpLHRoaXMucmVuZGVyUGFzc0VuY29kZXIuZW5kKCksdGhpcy5yZW5kZXJQYXNzRW5jb2Rlcj1udWxsfXJlc2l6ZShlLHQscj0hMCl7dGhpcy5jbGVhckFycmF5c0luc3RhbmNlZCgpO2Zvcihjb25zdCBlIG9mIHRoaXMuZnJhbWVUZXh0dXJlcyllLmRlc3Ryb3koKTt0aGlzLmZyYW1lVGV4dHVyZXMubGVuZ3RoPTA7Zm9yKGNvbnN0IGUgb2YgdGhpcy5wb29sZWRUZXh0dXJlcylBcyhlKTt0aGlzLnBvb2xlZFRleHR1cmVzLmxlbmd0aD0wO2Zvcihjb25zdCBlIG9mIHRoaXMucG9vbGVkUmVuZGVyVGV4dHVyZXMpQ3MoZSk7aWYodGhpcy5wb29sZWRSZW5kZXJUZXh0dXJlcy5sZW5ndGg9MCwoKCk9Pntmb3IoY29uc3RbLGVdb2YgVHMpZm9yKGNvbnN0IHQgb2YgZSl0LmRlc3Ryb3koKTtUcy5jbGVhcigpO2Zvcihjb25zdFssZV1vZiBCcylmb3IoY29uc3QgdCBvZiBlKXQuZGVzdHJveSgpO0JzLmNsZWFyKCl9KSgpLHRoaXMuZnJhbWVTdGFydGVkPSExLHRoaXMuY29tbWFuZEVuY29kZXI9bnVsbCx0aGlzLnJlbmRlclBhc3NFbmNvZGVyPW51bGwsdGhpcy5jdXJyZW50UmVuZGVyVGFyZ2V0PW51bGwsemE9ITEsTmE9ITEsV2E9MCxIYS5jbGVhcigpLFFhLmNsZWFyKCksdGhpcy4kc3RhY2tBdHRhY2htZW50T2JqZWN0Lmxlbmd0aCl7Zm9yKGxldCBlPTA7ZTx0aGlzLiRzdGFja0F0dGFjaG1lbnRPYmplY3QubGVuZ3RoOysrZSl7Y29uc3QgdD10aGlzLiRzdGFja0F0dGFjaG1lbnRPYmplY3RbZV07dCYmKHQudGV4dHVyZSYmdC50ZXh0dXJlLnJlc291cmNlLmRlc3Ryb3koKSx0LnN0ZW5jaWwmJnQuc3RlbmNpbC5yZXNvdXJjZS5kZXN0cm95KCksdC5tc2FhVGV4dHVyZSYmdC5tc2FhVGV4dHVyZS5yZXNvdXJjZS5kZXN0cm95KCksdC5tc2FhU3RlbmNpbCYmdC5tc2FhU3RlbmNpbC5yZXNvdXJjZS5kZXN0cm95KCkpfXRoaXMuJHN0YWNrQXR0YWNobWVudE9iamVjdC5sZW5ndGg9MH10aGlzLiRtYWluQXR0YWNobWVudE9iamVjdCYmdGhpcy5mcmFtZUJ1ZmZlck1hbmFnZXIuZGVzdHJveUF0dGFjaG1lbnQoIm1haW4iKSxyJiYoKCgpPT57Zm9yKGNvbnN0IGUgb2YgRXMudmFsdWVzKCkpZS50ZXh0dXJlPy5yZXNvdXJjZSYmZS50ZXh0dXJlLnJlc291cmNlLmRlc3Ryb3koKTtFcy5jbGVhcigpfSkoKSwoKCk9Pntmb3IoY29uc3QgZSBvZiBVcy52YWx1ZXMoKSlBcyhlLnRleHR1cmUpO1VzLmNsZWFyKCksJHM9MH0pKCksSXM/LnRleHR1cmU/LnJlc291cmNlJiZJcy50ZXh0dXJlLnJlc291cmNlLmRlc3Ryb3koKSxJcz1udWxsLEFhKCksdGhpcy5mcmFtZUJ1ZmZlck1hbmFnZXIuZGVzdHJveUF0dGFjaG1lbnQoImF0bGFzIiksdGhpcy5mcmFtZUJ1ZmZlck1hbmFnZXIuY3JlYXRlQXR0YWNobWVudCgiYXRsYXMiLDQwOTYsNDA5NiwhMSwhMCkpLHRoaXMuZnJhbWVCdWZmZXJNYW5hZ2VyLnNldEN1cnJlbnRBdHRhY2htZW50KG51bGwpLHRoaXMuJG5lZWRzUmVjb25maWd1cmU9ITAsdGhpcy5tYWluVGV4dHVyZT1udWxsLHRoaXMubWFpblRleHR1cmVWaWV3PW51bGwsdGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3Q9dGhpcy5mcmFtZUJ1ZmZlck1hbmFnZXIuY3JlYXRlQXR0YWNobWVudCgibWFpbiIsZSx0LCEwLCEwKSx0aGlzLmJpbmQodGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3QpfWNsZWFyUmVjdChlLHQscixuKXt9c2F2ZSgpe2NvbnN0IGU9dGMubGVuZ3RoPjA/dGMucG9wKCk6bmV3IEZsb2F0MzJBcnJheSg5KTtlLnNldCh0aGlzLiRtYXRyaXgpLHRoaXMuJHN0YWNrLnB1c2goZSl9cmVzdG9yZSgpe2NvbnN0IGU9dGhpcy4kc3RhY2sucG9wKCk7ZSYmKHRoaXMuJG1hdHJpeC5zZXQoZSksdGMucHVzaChlKSl9c2V0VHJhbnNmb3JtKGUsdCxyLG4saSxhKXt0aGlzLiRtYXRyaXhbMF09ZSx0aGlzLiRtYXRyaXhbMV09dCx0aGlzLiRtYXRyaXhbM109cix0aGlzLiRtYXRyaXhbNF09bix0aGlzLiRtYXRyaXhbNl09aSx0aGlzLiRtYXRyaXhbN109YX10cmFuc2Zvcm0oZSx0LHIsbixpLGEpe2NvbnN0IHM9dGhpcy4kbWF0cml4LG89c1swXSxsPXNbMV0sYz1zWzNdLHU9c1s0XSxmPXNbNl0sZD1zWzddO3NbMF09ZSpvK3QqYyxzWzFdPWUqbCt0KnUsc1szXT1yKm8rbipjLHNbNF09cipsK24qdSxzWzZdPWkqbythKmMrZixzWzddPWkqbCthKnUrZH1yZXNldCgpe3RoaXMuJG1hdHJpeC5zZXQoWzEsMCwwLDAsMSwwLDAsMCwxXSksdGhpcy4kc3RhY2subGVuZ3RoPTAsdGhpcy4kc3RhY2tBdHRhY2htZW50T2JqZWN0Lmxlbmd0aD0wLHRoaXMuZ2xvYmFsQWxwaGE9MSx0aGlzLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0ibm9ybWFsIix0aGlzLmltYWdlU21vb3RoaW5nRW5hYmxlZD0hMX1iZWdpblBhdGgoKXt0aGlzLnBhdGhDb21tYW5kLmJlZ2luUGF0aCgpfW1vdmVUbyhlLHQpe3RoaXMucGF0aENvbW1hbmQubW92ZVRvKGUsdCl9bGluZVRvKGUsdCl7dGhpcy5wYXRoQ29tbWFuZC5saW5lVG8oZSx0KX1xdWFkcmF0aWNDdXJ2ZVRvKGUsdCxyLG4pe3RoaXMucGF0aENvbW1hbmQucXVhZHJhdGljQ3VydmVUbyhlLHQscixuKX1maWxsU3R5bGUoZSx0LHIsbil7dGhpcy4kZmlsbFN0eWxlWzBdPWUsdGhpcy4kZmlsbFN0eWxlWzFdPXQsdGhpcy4kZmlsbFN0eWxlWzJdPXIsdGhpcy4kZmlsbFN0eWxlWzNdPW59c3Ryb2tlU3R5bGUoZSx0LHIsbil7dGhpcy4kc3Ryb2tlU3R5bGVbMF09ZSx0aGlzLiRzdHJva2VTdHlsZVsxXT10LHRoaXMuJHN0cm9rZVN0eWxlWzJdPXIsdGhpcy4kc3Ryb2tlU3R5bGVbM109bn1jbG9zZVBhdGgoKXt0aGlzLnBhdGhDb21tYW5kLmNsb3NlUGF0aCgpfWFyYyhlLHQscil7dGhpcy5wYXRoQ29tbWFuZC5hcmMoZSx0LHIpfWJlemllckN1cnZlVG8oZSx0LHIsbixpLGEpe3RoaXMucGF0aENvbW1hbmQuYmV6aWVyQ3VydmVUbyhlLHQscixuLGksYSl9ZW5zdXJlRmlsbFJlbmRlclBhc3MoKXtpZih0aGlzLmZyYW1lU3RhcnRlZHx8dGhpcy5iZWdpbkZyYW1lKCksdGhpcy5lbnN1cmVDb21tYW5kRW5jb2RlcigpLHRoaXMucmVuZGVyUGFzc0VuY29kZXIpdGhpcy5jdXJyZW50UmVuZGVyVGFyZ2V0JiZ0aGlzLmVuc3VyZU5vZGVBcmVhQ2xlYXJlZCgpO2Vsc2V7e2NvbnN0IGU9dGhpcy5nZXRDdXJyZW50VGV4dHVyZVZpZXcoKSx0PXdhKCkscj10Py5tc2FhJiZ0Py5tc2FhVGV4dHVyZT8udmlldyxuPXI/dC5tc2FhVGV4dHVyZS52aWV3OmUsaT1yP2U6bnVsbDtpZih0aGlzLmN1cnJlbnRSZW5kZXJUYXJnZXQmJnQ/LnN0ZW5jaWw/LnZpZXcpe2NvbnN0IGU9ciYmdD8ubXNhYVN0ZW5jaWw/LnZpZXc/dC5tc2FhU3RlbmNpbC52aWV3OnQuc3RlbmNpbC52aWV3LGE9dGhpcy5mcmFtZUJ1ZmZlck1hbmFnZXIuY3JlYXRlU3RlbmNpbFJlbmRlclBhc3NEZXNjcmlwdG9yKG4sZSwibG9hZCIsImNsZWFyIixpKTt0aGlzLnJlbmRlclBhc3NFbmNvZGVyPXRoaXMuY29tbWFuZEVuY29kZXIuYmVnaW5SZW5kZXJQYXNzKGEpfWVsc2UgaWYoIXRoaXMuY3VycmVudFJlbmRlclRhcmdldCYmKFhhKCl8fERhKCkpJiZ0aGlzLiRtYWluQXR0YWNobWVudE9iamVjdD8uc3RlbmNpbD8udmlldyl7Y29uc3QgZT10aGlzLiRtYWluQXR0YWNobWVudE9iamVjdC5tc2FhJiZ0aGlzLiRtYWluQXR0YWNobWVudE9iamVjdC5tc2FhVGV4dHVyZT8udmlldyx0PWU/dGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3QubXNhYVRleHR1cmUudmlldzp0aGlzLiRtYWluQXR0YWNobWVudE9iamVjdC50ZXh0dXJlLnZpZXcscj1lJiZ0aGlzLiRtYWluQXR0YWNobWVudE9iamVjdC5tc2FhU3RlbmNpbD8udmlldz90aGlzLiRtYWluQXR0YWNobWVudE9iamVjdC5tc2FhU3RlbmNpbC52aWV3OnRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0LnN0ZW5jaWwudmlldyxuPWU/dGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3QudGV4dHVyZS52aWV3Om51bGwsaT10aGlzLmZyYW1lQnVmZmVyTWFuYWdlci5jcmVhdGVTdGVuY2lsUmVuZGVyUGFzc0Rlc2NyaXB0b3IodCxyLCJsb2FkIiwibG9hZCIsbik7dGhpcy5yZW5kZXJQYXNzRW5jb2Rlcj10aGlzLmNvbW1hbmRFbmNvZGVyLmJlZ2luUmVuZGVyUGFzcyhpKSxYYSgpJiZ0aGlzLnJlbmRlclBhc3NFbmNvZGVyLnNldFN0ZW5jaWxSZWZlcmVuY2UoS2EoKSl9ZWxzZSBpZighdGhpcy5jdXJyZW50UmVuZGVyVGFyZ2V0JiZ0aGlzLiRtYWluQXR0YWNobWVudE9iamVjdCl7Y29uc3QgZT10aGlzLiRtYWluQXR0YWNobWVudE9iamVjdC5tc2FhJiZ0aGlzLiRtYWluQXR0YWNobWVudE9iamVjdC5tc2FhVGV4dHVyZT8udmlldyx0PWU/dGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3QubXNhYVRleHR1cmUudmlldzp0aGlzLiRtYWluQXR0YWNobWVudE9iamVjdC50ZXh0dXJlLnZpZXcscj1lP3RoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0LnRleHR1cmUudmlldzpudWxsO2lmKHRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0LnN0ZW5jaWw/LnZpZXcpe2NvbnN0IG49ZSYmdGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3QubXNhYVN0ZW5jaWw/LnZpZXc/dGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3QubXNhYVN0ZW5jaWwudmlldzp0aGlzLiRtYWluQXR0YWNobWVudE9iamVjdC5zdGVuY2lsLnZpZXcsaT10aGlzLmZyYW1lQnVmZmVyTWFuYWdlci5jcmVhdGVTdGVuY2lsUmVuZGVyUGFzc0Rlc2NyaXB0b3IodCxuLCJsb2FkIiwiY2xlYXIiLHIpO3RoaXMucmVuZGVyUGFzc0VuY29kZXI9dGhpcy5jb21tYW5kRW5jb2Rlci5iZWdpblJlbmRlclBhc3MoaSl9ZWxzZXtjb25zdCBlPXRoaXMuZnJhbWVCdWZmZXJNYW5hZ2VyLmNyZWF0ZVJlbmRlclBhc3NEZXNjcmlwdG9yKHQsMCwwLDAsMCwibG9hZCIscik7dGhpcy5yZW5kZXJQYXNzRW5jb2Rlcj10aGlzLmNvbW1hbmRFbmNvZGVyLmJlZ2luUmVuZGVyUGFzcyhlKX19ZWxzZXtjb25zdCBlPXRoaXMuZnJhbWVCdWZmZXJNYW5hZ2VyLmNyZWF0ZVJlbmRlclBhc3NEZXNjcmlwdG9yKG4sMCwwLDAsMCwibG9hZCIsaSk7dGhpcy5yZW5kZXJQYXNzRW5jb2Rlcj10aGlzLmNvbW1hbmRFbmNvZGVyLmJlZ2luUmVuZGVyUGFzcyhlKX19dGhpcy5jdXJyZW50UmVuZGVyVGFyZ2V0JiZ0aGlzLmVuc3VyZU5vZGVBcmVhQ2xlYXJlZCgpfX1maWxsKCl7Y29uc3QgZT10aGlzLnBhdGhDb21tYW5kLiRnZXRWZXJ0aWNlcztpZigwPT09ZS5sZW5ndGgpcmV0dXJuO3RoaXMuZW5zdXJlRmlsbFJlbmRlclBhc3MoKTtjb25zdCB0PXRoaXMudmlld3BvcnRXaWR0aCxyPXRoaXMudmlld3BvcnRIZWlnaHQsbj1ucyhlKTtpZigwPT09bi5pbmRleENvdW50KXJldHVybjtjb25zdCBpPXRoaXMuYnVmZmVyTWFuYWdlci5hY3F1aXJlVmVydGV4QnVmZmVyKG4uYnVmZmVyLmJ5dGVMZW5ndGgsbi5idWZmZXIpLGE9dGhpcy53cml0ZUZpbGxVbmlmb3JtKHRoaXMuJGZpbGxTdHlsZVswXSx0aGlzLiRmaWxsU3R5bGVbMV0sdGhpcy4kZmlsbFN0eWxlWzJdLHRoaXMuJGZpbGxTdHlsZVszXSx0aGlzLiRtYXRyaXhbMF0sdGhpcy4kbWF0cml4WzFdLHRoaXMuJG1hdHJpeFszXSx0aGlzLiRtYXRyaXhbNF0sdGhpcy4kbWF0cml4WzZdLHRoaXMuJG1hdHJpeFs3XSx0LHIpLHM9dGhpcy5nZXRPckNyZWF0ZUZpbGxEeW5hbWljQmluZEdyb3VwKCksbz13YSgpO2lmKHRoaXMuY3VycmVudFJlbmRlclRhcmdldCYmbz8uc3RlbmNpbD8udmlldyl0aGlzLmZpbGxXaXRoU3RlbmNpbChpLG4uaW5kZXhDb3VudCxzLGEpO2Vsc2UgaWYodGhpcy5jdXJyZW50UmVuZGVyVGFyZ2V0fHx0aGlzLmluTWFza01vZGV8fFhhKCl8fCF0aGlzLiRtYWluQXR0YWNobWVudE9iamVjdD8uc3RlbmNpbD8udmlldyl7Y29uc3QgZT0odGhpcy5pbk1hc2tNb2RlfHxYYSgpKSYmISF0aGlzLiRtYWluQXR0YWNobWVudE9iamVjdD8uc3RlbmNpbD8udmlldyYmIXRoaXMuY3VycmVudFJlbmRlclRhcmdldDt0aGlzLmZpbGxTaW1wbGUoaSxuLmluZGV4Q291bnQsZSxzLGEpfWVsc2UgdGhpcy5maWxsV2l0aFN0ZW5jaWxNYWluKGksbi5pbmRleENvdW50LHMsYSl9Z2V0T3JDcmVhdGVGaWxsRHluYW1pY0JpbmRHcm91cCgpe2NvbnN0IGU9dGhpcy5idWZmZXJNYW5hZ2VyLmR5bmFtaWNVbmlmb3JtLmdldEJ1ZmZlcigpO2lmKCF0aGlzLmZpbGxEeW5hbWljQmluZEdyb3VwfHx0aGlzLmZpbGxEeW5hbWljQmluZEdyb3VwQnVmZmVyIT09ZSl7Y29uc3QgdD10aGlzLnBpcGVsaW5lTWFuYWdlci5nZXRCaW5kR3JvdXBMYXlvdXQoImZpbGxfZHluYW1pYyIpO2lmKCF0KXRocm93IG5ldyBFcnJvcigiW1dlYkdQVV0gZmlsbF9keW5hbWljIGJpbmQgZ3JvdXAgbGF5b3V0IG5vdCBmb3VuZCIpO3RoaXMuZmlsbER5bmFtaWNCaW5kR3JvdXA9dGhpcy5kZXZpY2UuY3JlYXRlQmluZEdyb3VwKHtsYXlvdXQ6dCxlbnRyaWVzOlt7YmluZGluZzowLHJlc291cmNlOntidWZmZXI6ZSxzaXplOjI1Nn19XX0pLHRoaXMuZmlsbER5bmFtaWNCaW5kR3JvdXBCdWZmZXI9ZX1yZXR1cm4gdGhpcy5maWxsRHluYW1pY0JpbmRHcm91cH13cml0ZUZpbGxVbmlmb3JtKGUsdCxyLG4saSxhLHMsbyxsLGMsdSxmKXtyZXR1cm4gYWNbMF09ZSxhY1sxXT10LGFjWzJdPXIsYWNbM109bixhY1s0XT1pL3UsYWNbNV09YS9mLGFjWzZdPTAsYWNbN109MCxhY1s4XT1zL3UsYWNbOV09by9mLGFjWzEwXT0wLGFjWzExXT0wLGFjWzEyXT1sL3UsYWNbMTNdPWMvZixhY1sxNF09MSxhY1sxNV09MCx0aGlzLmJ1ZmZlck1hbmFnZXIuZHluYW1pY1VuaWZvcm0uYWxsb2NhdGUoYWMpfWZpbGxXaXRoU3RlbmNpbChlLHQscixuKXsoKGUsdCxyLG4saSxhKT0+e2NvbnN0IHM9dC5nZXRQaXBlbGluZSgic3RlbmNpbF93cml0ZV9hdGxhcyIpO3MmJihlLnNldFBpcGVsaW5lKHMpLGUuc2V0U3RlbmNpbFJlZmVyZW5jZSgwKSxlLnNldFZlcnRleEJ1ZmZlcigwLHIpLGUuc2V0QmluZEdyb3VwKDAsaSxbYV0pLGUuZHJhdyhuLDEsMCwwKSk7Y29uc3Qgbz10LmdldFBpcGVsaW5lKCJzdGVuY2lsX2ZpbGxfYXRsYXMiKTtvJiYoZS5zZXRQaXBlbGluZShvKSxlLnNldFN0ZW5jaWxSZWZlcmVuY2UoMCksZS5zZXRCaW5kR3JvdXAoMCxpLFthXSksZS5kcmF3KG4sMSwwLDApKX0pKHRoaXMucmVuZGVyUGFzc0VuY29kZXIsdGhpcy5waXBlbGluZU1hbmFnZXIsZSx0LHIsbil9ZmlsbFdpdGhTdGVuY2lsTWFpbihlLHQscixuKXsoKGUsdCxyLG4saSxhKT0+e2NvbnN0IHM9dC5nZXRQaXBlbGluZSgic3RlbmNpbF93cml0ZV9tYWluIik7cyYmKGUuc2V0UGlwZWxpbmUocyksZS5zZXRTdGVuY2lsUmVmZXJlbmNlKDApLGUuc2V0VmVydGV4QnVmZmVyKDAsciksZS5zZXRCaW5kR3JvdXAoMCxpLFthXSksZS5kcmF3KG4sMSwwLDApKTtjb25zdCBvPXQuZ2V0UGlwZWxpbmUoInN0ZW5jaWxfZmlsbF9tYWluIik7byYmKGUuc2V0UGlwZWxpbmUobyksZS5zZXRTdGVuY2lsUmVmZXJlbmNlKDApLGUuc2V0QmluZEdyb3VwKDAsaSxbYV0pLGUuZHJhdyhuLDEsMCwwKSl9KSh0aGlzLnJlbmRlclBhc3NFbmNvZGVyLHRoaXMucGlwZWxpbmVNYW5hZ2VyLGUsdCxyLG4pfWZpbGxTaW1wbGUoZSx0LHIsbixpKXtjb25zdCBhPXRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0Py5jbGlwTGV2ZWw/PzE7KChlLHQscixuLGksYSxzLG89ITEpPT57bGV0IGw7aWYocylsPSJmaWxsIjtlbHNlIGlmKG8pe2lmKERhKCkpcmV0dXJuO2w9ImZpbGxfYmdyYV9zdGVuY2lsIn1lbHNlIGw9ImZpbGxfYmdyYSI7Y29uc3QgYz10LmdldFBpcGVsaW5lKGwpO2M/KGUuc2V0UGlwZWxpbmUoYyksZS5zZXRWZXJ0ZXhCdWZmZXIoMCxyKSxlLnNldEJpbmRHcm91cCgwLGksW2FdKSwhb3x8c3x8RGEoKXx8ZS5zZXRTdGVuY2lsUmVmZXJlbmNlKEthKCkpLGUuZHJhdyhuLDEsMCwwKSk6Y29uc29sZS5lcnJvcihgW1dlYkdQVV0gJHtsfSBwaXBlbGluZSBub3QgZm91bmRgKX0pKHRoaXMucmVuZGVyUGFzc0VuY29kZXIsdGhpcy5waXBlbGluZU1hbmFnZXIsZSx0LG4saSwhIXRoaXMuY3VycmVudFJlbmRlclRhcmdldCxyLGEpfWJpbmRBdHRhY2htZW50KGUpe3RoaXMuYXR0YWNobWVudE1hbmFnZXIuYmluZEF0dGFjaG1lbnQoZSk7Y29uc3QgdD1lLmNvbG9yPy52aWV3Pz9lLnRleHR1cmU/LnZpZXc7dCYmKHRoaXMuY3VycmVudFJlbmRlclRhcmdldD10KX11bmJpbmRBdHRhY2htZW50KCl7dGhpcy5hdHRhY2htZW50TWFuYWdlci51bmJpbmRBdHRhY2htZW50KCksdGhpcy5jdXJyZW50UmVuZGVyVGFyZ2V0PW51bGx9Z2V0QXR0YWNobWVudE9iamVjdChlLHQscj0hMSl7cmV0dXJuIHRoaXMuYXR0YWNobWVudE1hbmFnZXIuZ2V0QXR0YWNobWVudE9iamVjdChlLHQscil9cmVsZWFzZUF0dGFjaG1lbnQoZSl7dGhpcy5hdHRhY2htZW50TWFuYWdlci5yZWxlYXNlQXR0YWNobWVudChlKX1zdHJva2UoKXtjb25zdCBlPXRoaXMucGF0aENvbW1hbmQuZ2V0VmVydGljZXNGb3JTdHJva2UoKTtpZigwPT09ZS5sZW5ndGgpcmV0dXJuO3RoaXMuZW5zdXJlRmlsbFJlbmRlclBhc3MoKTtjb25zdCB0PXRoaXMudmlld3BvcnRXaWR0aCxyPXRoaXMudmlld3BvcnRIZWlnaHQsbj0oKGUsdCk9Pntjb25zdCByPXQvMixuPVtdO2Zvcihjb25zdCB0IG9mIGUpe2lmKHQubGVuZ3RoPDYpY29udGludWU7Y29uc3QgZT13cyh0LHIpO2Zvcihjb25zdCB0IG9mIGUpbi5wdXNoKHQpfXJldHVybiBufSkoZSx0aGlzLnRoaWNrbmVzcyk7aWYoMD09PW4ubGVuZ3RoKXJldHVybjtjb25zdCBpPW5zKG4pO2lmKDA9PT1pLmluZGV4Q291bnQpcmV0dXJuO2NvbnN0IGE9dGhpcy5idWZmZXJNYW5hZ2VyLmFjcXVpcmVWZXJ0ZXhCdWZmZXIoaS5idWZmZXIuYnl0ZUxlbmd0aCxpLmJ1ZmZlcikscz10aGlzLndyaXRlRmlsbFVuaWZvcm0odGhpcy4kc3Ryb2tlU3R5bGVbMF0sdGhpcy4kc3Ryb2tlU3R5bGVbMV0sdGhpcy4kc3Ryb2tlU3R5bGVbMl0sdGhpcy4kc3Ryb2tlU3R5bGVbM10sdGhpcy4kbWF0cml4WzBdLHRoaXMuJG1hdHJpeFsxXSx0aGlzLiRtYXRyaXhbM10sdGhpcy4kbWF0cml4WzRdLHRoaXMuJG1hdHJpeFs2XSx0aGlzLiRtYXRyaXhbN10sdCxyKSxvPXRoaXMuZ2V0T3JDcmVhdGVGaWxsRHluYW1pY0JpbmRHcm91cCgpLGw9d2EoKTtpZih0aGlzLmN1cnJlbnRSZW5kZXJUYXJnZXQmJmw/LnN0ZW5jaWw/LnZpZXcpdGhpcy5maWxsV2l0aFN0ZW5jaWwoYSxpLmluZGV4Q291bnQsbyxzKTtlbHNlIGlmKHRoaXMuY3VycmVudFJlbmRlclRhcmdldHx8dGhpcy5pbk1hc2tNb2RlfHxYYSgpfHwhdGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3Q/LnN0ZW5jaWw/LnZpZXcpe2NvbnN0IGU9KHRoaXMuaW5NYXNrTW9kZXx8WGEoKSkmJiEhdGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3Q/LnN0ZW5jaWw/LnZpZXcmJiF0aGlzLmN1cnJlbnRSZW5kZXJUYXJnZXQ7dGhpcy5maWxsU2ltcGxlKGEsaS5pbmRleENvdW50LGUsbyxzKX1lbHNlIHRoaXMuZmlsbFdpdGhTdGVuY2lsTWFpbihhLGkuaW5kZXhDb3VudCxvLHMpO3RoaXMucGF0aENvbW1hbmQucmVzZXQoKX1ncmFkaWVudEZpbGwoZSx0LHIsbixpLGEpe2NvbnN0IHM9dGhpcy5wYXRoQ29tbWFuZC4kZ2V0VmVydGljZXM7aWYoMD09PXMubGVuZ3RoKXJldHVybjt0aGlzLmVuc3VyZUZpbGxSZW5kZXJQYXNzKCk7Y29uc3Qgbz10aGlzLnZpZXdwb3J0V2lkdGgsbD10aGlzLnZpZXdwb3J0SGVpZ2h0LGM9ISghdGhpcy5pbk1hc2tNb2RlJiYhWGEoKXx8IXRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0Py5zdGVuY2lsPy52aWV3fHx0aGlzLmN1cnJlbnRSZW5kZXJUYXJnZXQpLHU9ISF0aGlzLmN1cnJlbnRSZW5kZXJUYXJnZXQsZj0oKGUsdCxyLG4saSxhLHMsbyxsLGMsdSxmLGQsaCxwLG0sZz0hMSk9Pntjb25zdCBiPW5zKGkpO2lmKDA9PT1iLmluZGV4Q291bnQpcmV0dXJuIG51bGw7Y29uc3QgeD1yLmFjcXVpcmVWZXJ0ZXhCdWZmZXIoYi5idWZmZXIuYnl0ZUxlbmd0aCxiLmJ1ZmZlcik7bGV0IHYseTtjb25zdCBfPWtzKGwsdSxmKTtpZihfKXY9Xy50ZXh0dXJlLHk9Xy52aWV3O2Vsc2V7Y29uc3QgdD16cyhsLDAsZikscj1sLmxlbmd0aC81LG49VnMocik7dj1PcyhlLG4sMSksZS5xdWV1ZS53cml0ZVRleHR1cmUoe3RleHR1cmU6dn0sdCx7Ynl0ZXNQZXJSb3c6NCpuLHJvd3NQZXJJbWFnZToxfSx7d2lkdGg6bixoZWlnaHQ6MX0pLHk9di5jcmVhdGVWaWV3KCksTHMobCx1LGYsdix5KX1jb25zdCB3PVhzKGMsMCxvKSxNPXNbM10+MD9zWzNdOjEsUD1hWzBdLFM9YVsxXSxGPWFbM10sVD1hWzRdLEI9YVs2XSxPPWFbN107S3NbMF09dy5pbnZlcnNlTWF0cml4WzBdLEtzWzFdPXcuaW52ZXJzZU1hdHJpeFszXSxLc1syXT0wLEtzWzNdPTAsS3NbNF09dy5pbnZlcnNlTWF0cml4WzFdLEtzWzVdPXcuaW52ZXJzZU1hdHJpeFs0XSxLc1s2XT0wLEtzWzddPTAsS3NbOF09dy5pbnZlcnNlTWF0cml4WzZdLEtzWzldPXcuaW52ZXJzZU1hdHJpeFs3XSxLc1sxMF09MSxLc1sxMV09MCxLc1sxMl09byxLc1sxM109TWF0aC5tYXgoLS45NzUsTWF0aC5taW4oLjk3NSxkKSksS3NbMTRdPXUsS3NbMTVdPTgxOS4yLHcubGluZWFyUG9pbnRzPyhLc1sxNl09dy5saW5lYXJQb2ludHNbMF0sS3NbMTddPXcubGluZWFyUG9pbnRzWzFdLEtzWzE4XT13LmxpbmVhclBvaW50c1syXSxLc1sxOV09dy5saW5lYXJQb2ludHNbM10pOihLc1sxNl09MCxLc1sxN109MCxLc1sxOF09MCxLc1sxOV09MCksS3NbMjBdPTEsS3NbMjFdPTEsS3NbMjJdPTEsS3NbMjNdPU0sS3NbMjRdPVAvaCxLc1syNV09Uy9wLEtzWzI2XT0wLEtzWzI3XT0wLEtzWzI4XT1GL2gsS3NbMjldPVQvcCxLc1szMF09MCxLc1szMV09MCxLc1szMl09Qi9oLEtzWzMzXT1PL3AsS3NbMzRdPTEsS3NbMzVdPTA7Y29uc3QgQT1yLmFjcXVpcmVBbmRXcml0ZVVuaWZvcm1CdWZmZXIoS3MpO1lzfHwoWXM9ZS5jcmVhdGVTYW1wbGVyKHttYWdGaWx0ZXI6ImxpbmVhciIsbWluRmlsdGVyOiJsaW5lYXIiLGFkZHJlc3NNb2RlVToiY2xhbXAtdG8tZWRnZSIsYWRkcmVzc01vZGVWOiJjbGFtcC10by1lZGdlIn0pKTtjb25zdCBSPVlzLEM9bi5nZXRCaW5kR3JvdXBMYXlvdXQoImdyYWRpZW50X2ZpbGwiKTtpZighQylyZXR1cm4gY29uc29sZS5lcnJvcigiW1dlYkdQVV0gZ3JhZGllbnRfZmlsbCBiaW5kIGdyb3VwIGxheW91dCBub3QgZm91bmQiKSxudWxsO0pzWzBdLnJlc291cmNlLmJ1ZmZlcj1BLEpzWzFdLnJlc291cmNlPVIsSnNbMl0ucmVzb3VyY2U9eTtjb25zdCBFPWUuY3JlYXRlQmluZEdyb3VwKHtsYXlvdXQ6QyxlbnRyaWVzOkpzfSksVT0oKT0+e2NvbnN0IHQ9bi5nZXRCaW5kR3JvdXBMYXlvdXQoImZpbGxfZHluYW1pYyIpO2lmKCF0KXJldHVybiBudWxsO0hzWzBdPTEsSHNbMV09MSxIc1syXT0xLEhzWzNdPU0sSHNbNF09UC9oLEhzWzVdPVMvcCxIc1s2XT0wLEhzWzddPTAsSHNbOF09Ri9oLEhzWzldPVQvcCxIc1sxMF09MCxIc1sxMV09MCxIc1sxMl09Qi9oLEhzWzEzXT1PL3AsSHNbMTRdPTEsSHNbMTVdPTA7Y29uc3QgaT1yLmR5bmFtaWNVbmlmb3JtLmFsbG9jYXRlKEhzKSxhPXIuZHluYW1pY1VuaWZvcm0uZ2V0QnVmZmVyKCk7cmV0dXJuIFFzJiZacz09PWF8fChRcz1lLmNyZWF0ZUJpbmRHcm91cCh7bGF5b3V0OnQsZW50cmllczpbe2JpbmRpbmc6MCxyZXNvdXJjZTp7YnVmZmVyOmEsc2l6ZToyNTZ9fV19KSxacz1hKSx7YmluZEdyb3VwOlFzLG9mZnNldDppfX07aWYobSl7Y29uc3QgZT1uLmdldFBpcGVsaW5lKCJzdGVuY2lsX3dyaXRlX2F0bGFzIik7aWYoZSl7Y29uc3Qgcj1VKCk7dC5zZXRQaXBlbGluZShlKSx0LnNldFN0ZW5jaWxSZWZlcmVuY2UoMCksdC5zZXRWZXJ0ZXhCdWZmZXIoMCx4KSxyJiZ0LnNldEJpbmRHcm91cCgwLHIuYmluZEdyb3VwLFtyLm9mZnNldF0pLHQuZHJhdyhiLmluZGV4Q291bnQsMSwwLDApfWNvbnN0IHI9bi5nZXRHcmFkaWVudFBpcGVsaW5lKCJncmFkaWVudF9maWxsX3N0ZW5jaWxfYXRsYXMiLG8sdSk7cmV0dXJuIHImJih0LnNldFBpcGVsaW5lKHIpLHQuc2V0U3RlbmNpbFJlZmVyZW5jZSgwKSx0LnNldEJpbmRHcm91cCgwLEUpLHQuZHJhdyhiLmluZGV4Q291bnQsMSwwLDApKSxudWxsfWlmKGcmJkRhKCkpcmV0dXJuIG51bGw7Y29uc3QgJD1uLmdldFBpcGVsaW5lKCJzdGVuY2lsX3dyaXRlX21haW4iKTtpZigkKXtjb25zdCBlPVUoKTt0LnNldFBpcGVsaW5lKCQpLHQuc2V0U3RlbmNpbFJlZmVyZW5jZSgwKSx0LnNldFZlcnRleEJ1ZmZlcigwLHgpLGUmJnQuc2V0QmluZEdyb3VwKDAsZS5iaW5kR3JvdXAsW2Uub2Zmc2V0XSksdC5kcmF3KGIuaW5kZXhDb3VudCwxLDAsMCl9Y29uc3QgRz1nPyJncmFkaWVudF9maWxsX2JncmFfc3RlbmNpbF9tYXNrZWQiOiJncmFkaWVudF9maWxsX3N0ZW5jaWxfbWFpbiIsaz1uLmdldEdyYWRpZW50UGlwZWxpbmUoRyxvLHUpO3JldHVybiBrJiYodC5zZXRQaXBlbGluZShrKSx0LnNldFN0ZW5jaWxSZWZlcmVuY2UoZz9LYSgpOjApLHQuc2V0QmluZEdyb3VwKDAsRSksdC5kcmF3KGIuaW5kZXhDb3VudCwxLDAsMCkpLG51bGx9KSh0aGlzLmRldmljZSx0aGlzLnJlbmRlclBhc3NFbmNvZGVyLHRoaXMuYnVmZmVyTWFuYWdlcix0aGlzLnBpcGVsaW5lTWFuYWdlcixzLHRoaXMuJG1hdHJpeCx0aGlzLiRmaWxsU3R5bGUsZSx0LHIsbixpLGEsbyxsLHUsYyx0aGlzLiRtYWluQXR0YWNobWVudE9iamVjdD8uY2xpcExldmVsPz8xKTtmJiZ0aGlzLmFkZEZyYW1lVGV4dHVyZShmKSx0aGlzLmJlZ2luUGF0aCgpfWJpdG1hcEZpbGwoZSx0LHIsbixpLGEpe2NvbnN0IHM9dGhpcy5wYXRoQ29tbWFuZC4kZ2V0VmVydGljZXM7aWYoMD09PXMubGVuZ3RoKXJldHVybjt0aGlzLmVuc3VyZUZpbGxSZW5kZXJQYXNzKCk7Y29uc3Qgbz13YSgpLGw9ISghdGhpcy5jdXJyZW50UmVuZGVyVGFyZ2V0fHwhbz8uc3RlbmNpbD8udmlldyksYz0hKCF0aGlzLmluTWFza01vZGUmJiFYYSgpfHwhdGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3Q/LnN0ZW5jaWw/LnZpZXd8fHRoaXMuY3VycmVudFJlbmRlclRhcmdldCksdT1sfHxjLGY9dGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3Q/LmNsaXBMZXZlbD8/MSxkPW9vKHRoaXMuZGV2aWNlLHRoaXMucmVuZGVyUGFzc0VuY29kZXIsdGhpcy5idWZmZXJNYW5hZ2VyLHRoaXMucGlwZWxpbmVNYW5hZ2VyLHMsdGhpcy4kbWF0cml4LHRoaXMuJGZpbGxTdHlsZSxlLHQscixuLGksYSx0aGlzLnZpZXdwb3J0V2lkdGgsdGhpcy52aWV3cG9ydEhlaWdodCwhIXRoaXMuY3VycmVudFJlbmRlclRhcmdldCwhIXUsZik7ZCYmdGhpcy5hZGRGcmFtZVRleHR1cmUoZCksdGhpcy5iZWdpblBhdGgoKX1ncmFkaWVudFN0cm9rZShlLHQscixuLGksYSl7Y29uc3Qgcz10aGlzLnBhdGhDb21tYW5kLmdldFZlcnRpY2VzRm9yU3Ryb2tlKCk7aWYoMD09PXMubGVuZ3RoKXJldHVybjt0aGlzLmVuc3VyZUZpbGxSZW5kZXJQYXNzKCk7Y29uc3Qgbz13YSgpLGw9ISghdGhpcy5jdXJyZW50UmVuZGVyVGFyZ2V0fHwhbz8uc3RlbmNpbD8udmlldyksYz0hKHRoaXMuY3VycmVudFJlbmRlclRhcmdldHx8IXRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0Py5zdGVuY2lsPy52aWV3KSx1PWx8fGMsZj1wbyh0aGlzLmRldmljZSx0aGlzLnJlbmRlclBhc3NFbmNvZGVyLHRoaXMuYnVmZmVyTWFuYWdlcix0aGlzLnBpcGVsaW5lTWFuYWdlcixzLHRoaXMudGhpY2tuZXNzLHRoaXMuJG1hdHJpeCx0aGlzLiRzdHJva2VTdHlsZSxlLHQscixuLGksYSx0aGlzLnZpZXdwb3J0V2lkdGgsdGhpcy52aWV3cG9ydEhlaWdodCwhIXRoaXMuY3VycmVudFJlbmRlclRhcmdldCx1KTtmJiZ0aGlzLmFkZEZyYW1lVGV4dHVyZShmKSx0aGlzLnBhdGhDb21tYW5kLnJlc2V0KCl9Yml0bWFwU3Ryb2tlKGUsdCxyLG4saSxhKXtjb25zdCBzPXRoaXMucGF0aENvbW1hbmQuZ2V0VmVydGljZXNGb3JTdHJva2UoKTtpZigwPT09cy5sZW5ndGgpcmV0dXJuO3RoaXMuZW5zdXJlRmlsbFJlbmRlclBhc3MoKTtjb25zdCBvPXdhKCksbD0hKCF0aGlzLmN1cnJlbnRSZW5kZXJUYXJnZXR8fCFvPy5zdGVuY2lsPy52aWV3KSxjPSEodGhpcy5jdXJyZW50UmVuZGVyVGFyZ2V0fHwhdGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3Q/LnN0ZW5jaWw/LnZpZXcpLHU9bHx8YyxmPXZvKHRoaXMuZGV2aWNlLHRoaXMucmVuZGVyUGFzc0VuY29kZXIsdGhpcy5idWZmZXJNYW5hZ2VyLHRoaXMucGlwZWxpbmVNYW5hZ2VyLHMsdGhpcy50aGlja25lc3MsdGhpcy4kbWF0cml4LHRoaXMuJHN0cm9rZVN0eWxlLGUsdCxyLG4saSxhLHRoaXMudmlld3BvcnRXaWR0aCx0aGlzLnZpZXdwb3J0SGVpZ2h0LCEhdGhpcy5jdXJyZW50UmVuZGVyVGFyZ2V0LHUpO2YmJnRoaXMuYWRkRnJhbWVUZXh0dXJlKGYpLHRoaXMucGF0aENvbW1hbmQucmVzZXQoKX1jbGlwKCl7bGV0IGU9dGhpcy5mcmFtZUJ1ZmZlck1hbmFnZXIuZ2V0Q3VycmVudEF0dGFjaG1lbnQoKTtjb25zdCB0PSFlfHxlPT09dGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3Q7aWYoIWUmJnRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0JiYoZT10aGlzLiRtYWluQXR0YWNobWVudE9iamVjdCksIWUpcmV0dXJuO2lmKCFlLnN0ZW5jaWwpcmV0dXJuO2NvbnN0IHI9dGhpcy5wYXRoQ29tbWFuZC4kZ2V0VmVydGljZXM7aWYoMCE9PXIubGVuZ3RoKXtpZighdGhpcy5yZW5kZXJQYXNzRW5jb2Rlcil7aWYodGhpcy5lbnN1cmVDb21tYW5kRW5jb2RlcigpLCF0fHwhdGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3Q/LnN0ZW5jaWw/LnZpZXcpcmV0dXJuO3tjb25zdCBlPXRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0Lm1zYWEmJnRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0Lm1zYWFUZXh0dXJlPy52aWV3LHQ9ZT90aGlzLiRtYWluQXR0YWNobWVudE9iamVjdC5tc2FhVGV4dHVyZS52aWV3OnRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0LnRleHR1cmUudmlldyxyPWUmJnRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0Lm1zYWFTdGVuY2lsPy52aWV3P3RoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0Lm1zYWFTdGVuY2lsLnZpZXc6dGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3Quc3RlbmNpbC52aWV3LG49dGhpcy5mcmFtZUJ1ZmZlck1hbmFnZXIuY3JlYXRlU3RlbmNpbFJlbmRlclBhc3NEZXNjcmlwdG9yKHQsciwibG9hZCIsImxvYWQiKTt0aGlzLnJlbmRlclBhc3NFbmNvZGVyPXRoaXMuY29tbWFuZEVuY29kZXIuYmVnaW5SZW5kZXJQYXNzKG4pfX1Nbyh0aGlzLmRldmljZSx0aGlzLnJlbmRlclBhc3NFbmNvZGVyLHRoaXMuYnVmZmVyTWFuYWdlcix0aGlzLnBpcGVsaW5lTWFuYWdlcixlLHIsdGhpcy4kbWF0cml4LHRoaXMuJGZpbGxTdHlsZSx0aGlzLmdsb2JhbEFscGhhLHQpfX1iaW5kKGUpe3RoaXMuZnJhbWVCdWZmZXJNYW5hZ2VyLnNldEN1cnJlbnRBdHRhY2htZW50KGUpLHRoaXMudmlld3BvcnRXaWR0aD1lLndpZHRoLHRoaXMudmlld3BvcnRIZWlnaHQ9ZS5oZWlnaHR9Z2V0IGN1cnJlbnRBdHRhY2htZW50T2JqZWN0KCl7cmV0dXJuIHRoaXMuZnJhbWVCdWZmZXJNYW5hZ2VyLmdldEN1cnJlbnRBdHRhY2htZW50KCl8fHRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0fWdldCBhdGxhc0F0dGFjaG1lbnRPYmplY3QoKXtyZXR1cm4gd2EoKX11c2VHcmlkKGUpe01zLnNldChQcyxlKX1iZWdpbk5vZGVSZW5kZXJpbmcoZSl7dGhpcy5ub2RlQXJlYUNsZWFyZWQ9ITEsdGhpcy5mcmFtZVN0YXJ0ZWR8fHRoaXMuYmVnaW5GcmFtZSgpO2NvbnN0IHQ9TWEoZS5pbmRleCl8fHdhKCk7aWYodCYmdC50ZXh0dXJlKXtpZih0aGlzLnJlbmRlclBhc3NFbmNvZGVyJiZ0aGlzLm5vZGVSZW5kZXJQYXNzQXRsYXNJbmRleD09PWUuaW5kZXgpdGhpcy5jdXJyZW50UmVuZGVyVGFyZ2V0PXQudGV4dHVyZS52aWV3LHRoaXMudmlld3BvcnRXaWR0aD10LndpZHRoLHRoaXMudmlld3BvcnRIZWlnaHQ9dC5oZWlnaHQ7ZWxzZXt0aGlzLnJlbmRlclBhc3NFbmNvZGVyJiYodGhpcy5yZW5kZXJQYXNzRW5jb2Rlci5lbmQoKSx0aGlzLnJlbmRlclBhc3NFbmNvZGVyPW51bGwpLHRoaXMuY3VycmVudFJlbmRlclRhcmdldD10LnRleHR1cmUudmlldyx0aGlzLnZpZXdwb3J0V2lkdGg9dC53aWR0aCx0aGlzLnZpZXdwb3J0SGVpZ2h0PXQuaGVpZ2h0LHRoaXMuZW5zdXJlQ29tbWFuZEVuY29kZXIoKTtjb25zdCByPXQubXNhYSYmdC5tc2FhVGV4dHVyZT8udmlldyxuPXI/dC5tc2FhVGV4dHVyZS52aWV3OnQudGV4dHVyZS52aWV3LGk9cj90LnRleHR1cmUudmlldzpudWxsO2lmKHQuc3RlbmNpbD8udmlldyl7Y29uc3QgZT1yJiZ0Lm1zYWFTdGVuY2lsPy52aWV3P3QubXNhYVN0ZW5jaWwudmlldzp0LnN0ZW5jaWwudmlldyxhPXRoaXMuZnJhbWVCdWZmZXJNYW5hZ2VyLmNyZWF0ZVN0ZW5jaWxSZW5kZXJQYXNzRGVzY3JpcHRvcihuLGUsImxvYWQiLCJsb2FkIixpKTt0aGlzLnJlbmRlclBhc3NFbmNvZGVyPXRoaXMuY29tbWFuZEVuY29kZXIuYmVnaW5SZW5kZXJQYXNzKGEpfWVsc2V7Y29uc3QgZT10aGlzLmZyYW1lQnVmZmVyTWFuYWdlci5jcmVhdGVSZW5kZXJQYXNzRGVzY3JpcHRvcihuLDAsMCwwLDAsImxvYWQiLGkpO3RoaXMucmVuZGVyUGFzc0VuY29kZXI9dGhpcy5jb21tYW5kRW5jb2Rlci5iZWdpblJlbmRlclBhc3MoZSl9dGhpcy5ub2RlUmVuZGVyUGFzc0F0bGFzSW5kZXg9ZS5pbmRleH1sZXQgcj1NYXRoLm1heCgwLGUueCksbj1NYXRoLm1heCgwLGUueSksaT1NYXRoLm1pbihlLncsdC53aWR0aC1yKSxhPU1hdGgubWluKGUuaCx0LmhlaWdodC1uKTtpZihyPU1hdGgubWluKHIsdC53aWR0aCksbj1NYXRoLm1pbihuLHQuaGVpZ2h0KSxpPU1hdGgubWF4KDAsTWF0aC5taW4oaSx0LndpZHRoLXIpKSxhPU1hdGgubWF4KDAsTWF0aC5taW4oYSx0LmhlaWdodC1uKSksdGhpcy4kc2Npc3NvclJlY3QueD1yLHRoaXMuJHNjaXNzb3JSZWN0Lnk9bix0aGlzLiRzY2lzc29yUmVjdC53PWksdGhpcy4kc2Npc3NvclJlY3QuaD1hLHRoaXMuY3VycmVudE5vZGVTY2lzc29yPXRoaXMuJHNjaXNzb3JSZWN0LGk+MCYmYT4wKXtjb25zdCBlPU1hdGgubWluKGkrMSx0LndpZHRoLXIpLHM9TWF0aC5taW4oYSsxLHQuaGVpZ2h0LW4pO3RoaXMucmVuZGVyUGFzc0VuY29kZXIuc2V0U2Npc3NvclJlY3QocixuLGUscyl9fX1lbnN1cmVOb2RlQXJlYUNsZWFyZWQoKXt0aGlzLm5vZGVBcmVhQ2xlYXJlZHx8KHRoaXMubm9kZUFyZWFDbGVhcmVkPSEwLHRoaXMuY2xlYXJOb2RlQXJlYSgpKX1jbGVhck5vZGVBcmVhKCl7aWYoIXRoaXMucmVuZGVyUGFzc0VuY29kZXIpcmV0dXJuO2NvbnN0IGU9dGhpcy5waXBlbGluZU1hbmFnZXIuZ2V0UGlwZWxpbmUoIm5vZGVfY2xlYXJfYXRsYXMiKTtpZighZSlyZXR1cm47aWYoIXRoaXMubm9kZUNsZWFyUXVhZEJ1ZmZlcil7Y29uc3QgZT10aGlzLmRldmljZS5jcmVhdGVCdWZmZXIoe3NpemU6bmMuYnl0ZUxlbmd0aCx1c2FnZTpHUFVCdWZmZXJVc2FnZS5WRVJURVh8R1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1QsbWFwcGVkQXRDcmVhdGlvbjohMH0pO25ldyBGbG9hdDMyQXJyYXkoZS5nZXRNYXBwZWRSYW5nZSgpKS5zZXQobmMpLGUudW5tYXAoKSx0aGlzLm5vZGVDbGVhclF1YWRCdWZmZXI9ZX1jb25zdCB0PXRoaXMubm9kZUNsZWFyUXVhZEJ1ZmZlcjt0aGlzLnJlbmRlclBhc3NFbmNvZGVyLnNldFBpcGVsaW5lKGUpLHRoaXMucmVuZGVyUGFzc0VuY29kZXIuc2V0VmVydGV4QnVmZmVyKDAsdCksdGhpcy5yZW5kZXJQYXNzRW5jb2Rlci5kcmF3KDYpLHRoaXMuY3VycmVudE5vZGVTY2lzc29yJiZ0aGlzLnJlbmRlclBhc3NFbmNvZGVyLnNldFNjaXNzb3JSZWN0KHRoaXMuY3VycmVudE5vZGVTY2lzc29yLngsdGhpcy5jdXJyZW50Tm9kZVNjaXNzb3IueSx0aGlzLmN1cnJlbnROb2RlU2Npc3Nvci53LHRoaXMuY3VycmVudE5vZGVTY2lzc29yLmgpfWVuZE5vZGVSZW5kZXJpbmcoKXt0aGlzLmN1cnJlbnRSZW5kZXJUYXJnZXQ9bnVsbCx0aGlzLmN1cnJlbnROb2RlU2Npc3Nvcj1udWxsLHRoaXMudmlld3BvcnRXaWR0aD10aGlzLmNhbnZhc0NvbnRleHQuY2FudmFzLndpZHRoLHRoaXMudmlld3BvcnRIZWlnaHQ9dGhpcy5jYW52YXNDb250ZXh0LmNhbnZhcy5oZWlnaHR9ZHJhd0ZpbGwoKXtNcy5jbGVhcigpLFBzPTB9ZHJhd0Rpc3BsYXlPYmplY3QoZSx0LHIsbixpLGEpe2NvbnN0IHM9SG4uZ2V0UmVuZGVyTWF4U2l6ZSgpOygoZSx0LHIsbixpLGEscyxvLGwsYyx1LGYpPT57Y29uc3QgZD1hWzBdLGg9YVsxXSxwPWFbMl0sbT1mLGc9YVs0XS8yNTUsYj1hWzVdLzI1NSx4PWFbNl0vMjU1O2lmKFVhLmhhcyhvKSl7Q2E9PT1vJiZPYSgpPT09ZS5pbmRleHx8KFFuJiYodmEoT2EoKSksUW4uZHJhd0FycmF5c0luc3RhbmNlZCgpKSxFYShvKSxCYShlLmluZGV4KSx2YShlLmluZGV4KSk7Y29uc3QgdD1WYSgpO25yLnB1c2hJbnN0YW5jZUJ1ZmZlcigoZS54Ky41KS91LChlLnkrLjUpL3UsKGUudy0xKS91LChlLmgtMSkvdSxlLncsZS5oLGwsYyxzWzZdLHNbN10sMCwwLHNbMF0sc1sxXSxzWzNdLHNbNF0sZCxoLHAsbSxnLGIseCwwKSx0LmNvdW50Kyt9ZWxzZXtRbiYmKHZhKE9hKCkpLFFuLmRyYXdBcnJheXNJbnN0YW5jZWQoKSk7Y29uc3QgZD1HYS5sZW5ndGg+MD9HYS5wb3AoKTpuZXcgRmxvYXQzMkFycmF5KDgpO2Quc2V0KGEpO2NvbnN0IGg9a2EubGVuZ3RoPjA/a2EucG9wKCk6bmV3IEZsb2F0MzJBcnJheSg5KTtoLnNldChzKSwkYS5wdXNoKHtub2RlOmUseF9taW46dCx5X21pbjpyLHhfbWF4Om4seV9tYXg6aSxjb2xvcl90cmFuc2Zvcm06ZCxtYXRyaXg6aCxibGVuZF9tb2RlOm8sdmlld3BvcnRfd2lkdGg6bCx2aWV3cG9ydF9oZWlnaHQ6YyxyZW5kZXJfbWF4X3NpemU6dSxnbG9iYWxfYWxwaGE6Zn0pLEVhKG8pLEJhKGUuaW5kZXgpLHZhKGUuaW5kZXgpfX0pKGUsdCxyLG4saSxhLHRoaXMuJG1hdHJpeCx0aGlzLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbix0aGlzLnZpZXdwb3J0V2lkdGgsdGhpcy52aWV3cG9ydEhlaWdodCxzLHRoaXMuZ2xvYmFsQWxwaGEpfWRyYXdBcnJheXNJbnN0YW5jZWQoKXt0aGlzLmZyYW1lU3RhcnRlZHx8dGhpcy5iZWdpbkZyYW1lKCksdGhpcy5yZW5kZXJQYXNzRW5jb2RlciYmKHRoaXMucmVuZGVyUGFzc0VuY29kZXIuZW5kKCksdGhpcy5yZW5kZXJQYXNzRW5jb2Rlcj1udWxsKSx0aGlzLm5vZGVSZW5kZXJQYXNzQXRsYXNJbmRleD0tMSx0aGlzLmVuc3VyZUNvbW1hbmRFbmNvZGVyKCksdGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3QmJih0aGlzLnVzZU9wdGltaXplZEluc3RhbmNpbmc/dGhpcy5yZW5kZXJQYXNzRW5jb2Rlcj0oKGUsdCxyLG4saSxhLHMsbyxsPSEwLGM9ITApPT57Y29uc3QgdT1WYSgpO2lmKDA9PT11LmNvdW50KXJldHVybiByO3ImJihyLmVuZCgpLHI9bnVsbCk7Y29uc3QgZj1YYSgpLGQ9S2EoKSxoPShlPT57c3dpdGNoKGUpe2Nhc2UiYWRkIjpyZXR1cm4iaW5zdGFuY2VkX2FkZCI7Y2FzZSJzY3JlZW4iOnJldHVybiJpbnN0YW5jZWRfc2NyZWVuIjtjYXNlImFscGhhIjpyZXR1cm4iaW5zdGFuY2VkX2FscGhhIjtjYXNlImVyYXNlIjpyZXR1cm4iaW5zdGFuY2VkX2VyYXNlIjtjYXNlImNvcHkiOnJldHVybiJpbnN0YW5jZWRfY29weSI7ZGVmYXVsdDpyZXR1cm4iaW5zdGFuY2VkIn19KShDYSkscD1vLmdldFBpcGVsaW5lKGgpLG09by5nZXRQaXBlbGluZSgiaW5zdGFuY2VkX21hc2tlZCIpLGc9ZiYmbSYmKG4ubXNhYVN0ZW5jaWw/LnZpZXd8fG4uc3RlbmNpbD8udmlldyksYj1nP206cDtpZighYilyZXR1cm4gY29uc29sZS5lcnJvcigiW1dlYkdQVV0gSW5zdGFuY2VkIHBpcGVsaW5lIG5vdCBmb3VuZCIpLG51bGw7bGV0IHg7aWYoZyl7Y29uc3QgZT1uLm1zYWEmJm4ubXNhYVRleHR1cmU/LnZpZXcscj1lP24ubXNhYVRleHR1cmUudmlldzpuLnRleHR1cmUudmlldyxpPWUmJm4ubXNhYVN0ZW5jaWw/LnZpZXc/bi5tc2FhU3RlbmNpbC52aWV3Om4uc3RlbmNpbC52aWV3LHM9ZT9uLnRleHR1cmUudmlldzpudWxsLG89YS5jcmVhdGVTdGVuY2lsUmVuZGVyUGFzc0Rlc2NyaXB0b3IocixpLCJsb2FkIiwibG9hZCIscyk7eD10LmJlZ2luUmVuZGVyUGFzcyhvKX1lbHNle2NvbnN0IGU9bi5tc2FhJiZuLm1zYWFUZXh0dXJlPy52aWV3LHI9ZT9uLm1zYWFUZXh0dXJlLnZpZXc6bi50ZXh0dXJlLnZpZXcsaT1lP24udGV4dHVyZS52aWV3Om51bGwscz1hLmNyZWF0ZVJlbmRlclBhc3NEZXNjcmlwdG9yKHIsMCwwLDAsMCwibG9hZCIsaSk7eD10LmJlZ2luUmVuZGVyUGFzcyhzKX14LnNldFBpcGVsaW5lKGIpLGcmJnguc2V0U3RlbmNpbFJlZmVyZW5jZShkKTtjb25zdCB2PW5ldyBGbG9hdDMyQXJyYXkobnIuYnVmZmVyLmJ1ZmZlcixuci5idWZmZXIuYnl0ZU9mZnNldCxuci5vZmZzZXQpO2xldCB5O2M/KHk9aS5hY3F1aXJlU3RvcmFnZUJ1ZmZlcih2LmJ5dGVMZW5ndGgpLGkud3JpdGVTdG9yYWdlQnVmZmVyKHksdikpOnk9aS5hY3F1aXJlVmVydGV4QnVmZmVyKHYuYnl0ZUxlbmd0aCx2KTtjb25zdCBfPWkuZ2V0VW5pdFJlY3RCdWZmZXIoKSx3PXdhKCl8fGEuZ2V0QXR0YWNobWVudCgiYXRsYXMiKTtpZighdylyZXR1cm4gY29uc29sZS5lcnJvcigiW1dlYkdQVV0gQXRsYXMgYXR0YWNobWVudCBub3QgZm91bmQiKSx4LmVuZCgpLG51bGw7Y29uc3QgTT1zLmNyZWF0ZVNhbXBsZXIoImF0bGFzX2luc3RhbmNlZF9zYW1wbGVyIiwhMSksUD1vLmdldEJpbmRHcm91cExheW91dCgiaW5zdGFuY2VkIik7aWYoIVApcmV0dXJuIGNvbnNvbGUuZXJyb3IoIltXZWJHUFVdIEluc3RhbmNlZCBiaW5kIGdyb3VwIGxheW91dCBub3QgZm91bmQiKSx4LmVuZCgpLG51bGw7Y29uc3QgUz13LnRleHR1cmUudmlldztpZihGbyYmVG89PT1TfHwoRm89ZS5jcmVhdGVCaW5kR3JvdXAoe2xheW91dDpQLGVudHJpZXM6W3tiaW5kaW5nOjAscmVzb3VyY2U6TX0se2JpbmRpbmc6MSxyZXNvdXJjZTpTfV19KSxUbz1TKSx4LnNldFZlcnRleEJ1ZmZlcigwLF8pLHguc2V0VmVydGV4QnVmZmVyKDEseSkseC5zZXRCaW5kR3JvdXAoMCxGbyksbCl7Y29uc3QgZT1pLmNyZWF0ZUluZGlyZWN0QnVmZmVyKDYsdS5jb3VudCwwLDApO3guZHJhd0luZGlyZWN0KGUsMCl9ZWxzZSB4LmRyYXcoNix1LmNvdW50LDAsMCk7cmV0dXJuIHguZW5kKCksdS5jbGVhcigpLG51bGx9KSh0aGlzLmRldmljZSx0aGlzLmNvbW1hbmRFbmNvZGVyLHRoaXMucmVuZGVyUGFzc0VuY29kZXIsdGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3QsdGhpcy5idWZmZXJNYW5hZ2VyLHRoaXMuZnJhbWVCdWZmZXJNYW5hZ2VyLHRoaXMudGV4dHVyZU1hbmFnZXIsdGhpcy5waXBlbGluZU1hbmFnZXIsITAsITApOnRoaXMucmVuZGVyUGFzc0VuY29kZXI9KChlLHQscixuLGksYSxzLG8pPT57Y29uc3QgbD1WYSgpO2lmKDA9PT1sLmNvdW50KXJldHVybiByO3ImJihyLmVuZCgpLHI9bnVsbCk7Y29uc3QgYz1YYSgpLHU9S2EoKSxmPShlPT57c3dpdGNoKGUpe2Nhc2UiYWRkIjpyZXR1cm4iaW5zdGFuY2VkX2FkZCI7Y2FzZSJzY3JlZW4iOnJldHVybiJpbnN0YW5jZWRfc2NyZWVuIjtjYXNlImFscGhhIjpyZXR1cm4iaW5zdGFuY2VkX2FscGhhIjtjYXNlImVyYXNlIjpyZXR1cm4iaW5zdGFuY2VkX2VyYXNlIjtjYXNlImNvcHkiOnJldHVybiJpbnN0YW5jZWRfY29weSI7ZGVmYXVsdDpyZXR1cm4iaW5zdGFuY2VkIn19KShDYSksZD1vLmdldFBpcGVsaW5lKGYpLGg9by5nZXRQaXBlbGluZSgiaW5zdGFuY2VkX21hc2tlZCIpLHA9YyYmaCYmKG4ubXNhYVN0ZW5jaWw/LnZpZXd8fG4uc3RlbmNpbD8udmlldyksbT1wP2g6ZDtpZighbSlyZXR1cm4gY29uc29sZS5lcnJvcigiW1dlYkdQVV0gSW5zdGFuY2VkIHBpcGVsaW5lIG5vdCBmb3VuZCIpLG51bGw7bGV0IGc7aWYocCl7Y29uc3QgZT1uLm1zYWEmJm4ubXNhYVRleHR1cmU/LnZpZXcscj1lP24ubXNhYVRleHR1cmUudmlldzpuLnRleHR1cmUudmlldyxpPWUmJm4ubXNhYVN0ZW5jaWw/LnZpZXc/bi5tc2FhU3RlbmNpbC52aWV3Om4uc3RlbmNpbC52aWV3LHM9ZT9uLnRleHR1cmUudmlldzpudWxsLG89YS5jcmVhdGVTdGVuY2lsUmVuZGVyUGFzc0Rlc2NyaXB0b3IocixpLCJsb2FkIiwibG9hZCIscyk7Zz10LmJlZ2luUmVuZGVyUGFzcyhvKX1lbHNle2NvbnN0IGU9bi5tc2FhJiZuLm1zYWFUZXh0dXJlPy52aWV3LHI9ZT9uLm1zYWFUZXh0dXJlLnZpZXc6bi50ZXh0dXJlLnZpZXcsaT1lP24udGV4dHVyZS52aWV3Om51bGwscz1hLmNyZWF0ZVJlbmRlclBhc3NEZXNjcmlwdG9yKHIsMCwwLDAsMCwibG9hZCIsaSk7Zz10LmJlZ2luUmVuZGVyUGFzcyhzKX1nLnNldFBpcGVsaW5lKG0pLHAmJmcuc2V0U3RlbmNpbFJlZmVyZW5jZSh1KTtjb25zdCBiPW5ldyBGbG9hdDMyQXJyYXkobnIuYnVmZmVyLmJ1ZmZlcixuci5idWZmZXIuYnl0ZU9mZnNldCxuci5vZmZzZXQpLHg9aS5hY3F1aXJlVmVydGV4QnVmZmVyKGIuYnl0ZUxlbmd0aCxiKSx2PWkuZ2V0VW5pdFJlY3RCdWZmZXIoKSx5PXdhKCl8fGEuZ2V0QXR0YWNobWVudCgiYXRsYXMiKTtpZigheSlyZXR1cm4gY29uc29sZS5lcnJvcigiW1dlYkdQVV0gQXRsYXMgYXR0YWNobWVudCBub3QgZm91bmQiKSxnLmVuZCgpLG51bGw7Y29uc3QgXz1zLmNyZWF0ZVNhbXBsZXIoImF0bGFzX2luc3RhbmNlZF9zYW1wbGVyIiwhMSksdz1vLmdldEJpbmRHcm91cExheW91dCgiaW5zdGFuY2VkIik7aWYoIXcpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIltXZWJHUFVdIEluc3RhbmNlZCBiaW5kIGdyb3VwIGxheW91dCBub3QgZm91bmQiKSxnLmVuZCgpLG51bGw7Y29uc3QgTT15LnRleHR1cmUudmlldztyZXR1cm4gUG8mJlNvPT09TXx8KFBvPWUuY3JlYXRlQmluZEdyb3VwKHtsYXlvdXQ6dyxlbnRyaWVzOlt7YmluZGluZzowLHJlc291cmNlOl99LHtiaW5kaW5nOjEscmVzb3VyY2U6TX1dfSksU289TSksZy5zZXRWZXJ0ZXhCdWZmZXIoMCx2KSxnLnNldFZlcnRleEJ1ZmZlcigxLHgpLGcuc2V0QmluZEdyb3VwKDAsUG8pLGcuZHJhdyg2LGwuY291bnQsMCwwKSxnLmVuZCgpLGwuY2xlYXIoKSxudWxsfSkodGhpcy5kZXZpY2UsdGhpcy5jb21tYW5kRW5jb2Rlcix0aGlzLnJlbmRlclBhc3NFbmNvZGVyLHRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0LHRoaXMuYnVmZmVyTWFuYWdlcix0aGlzLmZyYW1lQnVmZmVyTWFuYWdlcix0aGlzLnRleHR1cmVNYW5hZ2VyLHRoaXMucGlwZWxpbmVNYW5hZ2VyKSx0aGlzLnByb2Nlc3NDb21wbGV4QmxlbmRRdWV1ZSgpKX1zZXRPcHRpbWl6ZWRJbnN0YW5jaW5nKGUpe3RoaXMudXNlT3B0aW1pemVkSW5zdGFuY2luZz1lfWlzT3B0aW1pemVkSW5zdGFuY2luZ0VuYWJsZWQoKXtyZXR1cm4gdGhpcy51c2VPcHRpbWl6ZWRJbnN0YW5jaW5nfXByb2Nlc3NDb21wbGV4QmxlbmRRdWV1ZSgpe3RoaXMuZW5zdXJlQ29tbWFuZEVuY29kZXIoKSxMbyh0aGlzLmRldmljZSx0aGlzLmNvbW1hbmRFbmNvZGVyLHRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0LHRoaXMuZnJhbWVCdWZmZXJNYW5hZ2VyLHRoaXMudGV4dHVyZU1hbmFnZXIsdGhpcy5waXBlbGluZU1hbmFnZXIsdGhpcy5idWZmZXJNYW5hZ2VyKX1jbGVhckFycmF5c0luc3RhbmNlZCgpe1ZhKCkuY2xlYXIoKX1kcmF3UGl4ZWxzKGUsdCl7Y29uc3Qgcj1NYShlLmluZGV4KXx8d2EoKTtpZighcnx8IXIudGV4dHVyZSlyZXR1cm47Y29uc3Qgbj1lLncsaT1lLmg7aWYodGhpcy5yZW5kZXJQYXNzRW5jb2RlciYmKHRoaXMuZW5zdXJlTm9kZUFyZWFDbGVhcmVkKCksdGhpcy5yZW5kZXJQYXNzRW5jb2Rlci5lbmQoKSx0aGlzLnJlbmRlclBhc3NFbmNvZGVyPW51bGwpLHRoaXMubm9kZVJlbmRlclBhc3NBdGxhc0luZGV4PS0xLHIubXNhYSYmci5tc2FhVGV4dHVyZT8udmlldyl0aGlzLmRyYXdQaXhlbHNUb01zYWEocixlLHQsbixpKTtlbHNle2NvbnN0IGE9NCpuO3RoaXMuZGV2aWNlLnF1ZXVlLndyaXRlVGV4dHVyZSh7dGV4dHVyZTpyLnRleHR1cmUucmVzb3VyY2Usb3JpZ2luOnt4OmUueCx5OmUueSx6OjB9fSx0LHtieXRlc1BlclJvdzphLHJvd3NQZXJJbWFnZTppLG9mZnNldDowfSx7d2lkdGg6bixoZWlnaHQ6aSxkZXB0aE9yQXJyYXlMYXllcnM6MX0pfX1kcmF3UGl4ZWxzVG9Nc2FhKGUsdCxyLG4saSl7Y29uc3QgYT1Scyh0aGlzLmRldmljZSxuLGkpLHM9NCpuO3RoaXMuZGV2aWNlLnF1ZXVlLndyaXRlVGV4dHVyZSh7dGV4dHVyZTphfSxyLHtieXRlc1BlclJvdzpzLHJvd3NQZXJJbWFnZTppfSx7d2lkdGg6bixoZWlnaHQ6aX0pO2NvbnN0IG89dGhpcy5waXBlbGluZU1hbmFnZXIuZ2V0UGlwZWxpbmUoImJpdG1hcF9yZW5kZXJfbXNhYSIpO2lmKCFvKXJldHVybiB2b2lkIENzKGEpO2NvbnN0IGw9dGhpcy5waXBlbGluZU1hbmFnZXIuZ2V0QmluZEdyb3VwTGF5b3V0KCJwb3NpdGlvbmVkX3RleHR1cmUiKTtpZighbClyZXR1cm4gdm9pZCBDcyhhKTtjb25zdCBjPXRoaXMuJHVuaWZvcm1EYXRhODtjWzBdPXQueCxjWzFdPXQueSxjWzJdPW4sY1szXT1pLGNbNF09ZS53aWR0aCxjWzVdPWUuaGVpZ2h0LGNbNl09MCxjWzddPTA7Y29uc3QgdT10aGlzLmJ1ZmZlck1hbmFnZXIuYWNxdWlyZUFuZFdyaXRlVW5pZm9ybUJ1ZmZlcihjKSxmPXRoaXMudGV4dHVyZU1hbmFnZXIuY3JlYXRlU2FtcGxlcigibGluZWFyX3NhbXBsZXIiLCEwKSxkPUZzKGEpO2ZjWzBdLnJlc291cmNlLmJ1ZmZlcj11LGZjWzFdLnJlc291cmNlPWYsZmNbMl0ucmVzb3VyY2U9ZDtjb25zdCBoPXRoaXMuZGV2aWNlLmNyZWF0ZUJpbmRHcm91cCh7bGF5b3V0OmwsZW50cmllczpmY30pO3RoaXMuZW5zdXJlQ29tbWFuZEVuY29kZXIoKSxnYy52aWV3PWUubXNhYVRleHR1cmUudmlldyxnYy5yZXNvbHZlVGFyZ2V0PWUudGV4dHVyZS52aWV3O2NvbnN0IHA9ZS5tc2FhU3RlbmNpbD8udmlldztwPyhiYy52aWV3PXAseGMuZGVwdGhTdGVuY2lsQXR0YWNobWVudD1iYyk6eGMuZGVwdGhTdGVuY2lsQXR0YWNobWVudD12b2lkIDA7Y29uc3QgbT10aGlzLmNvbW1hbmRFbmNvZGVyLmJlZ2luUmVuZGVyUGFzcyh4Yyk7bS5zZXRWaWV3cG9ydCgwLDAsZS53aWR0aCxlLmhlaWdodCwwLDEpLG0uc2V0U2Npc3NvclJlY3QodC54LHQueSxuLGkpLG0uc2V0UGlwZWxpbmUobyksbS5zZXRCaW5kR3JvdXAoMCxoKSxtLmRyYXcoNiksbS5lbmQoKSx0aGlzLnBvb2xlZFJlbmRlclRleHR1cmVzLnB1c2goYSl9ZHJhd0VsZW1lbnQoZSx0LHI9ITEpe2NvbnN0IG49TWEoZS5pbmRleCl8fHdhKCk7aWYoIW58fCFuLnRleHR1cmUpcmV0dXJuO2NvbnN0IGk9ZS53LGE9ZS5oO3RoaXMucmVuZGVyUGFzc0VuY29kZXImJih0aGlzLmVuc3VyZU5vZGVBcmVhQ2xlYXJlZCgpLHRoaXMucmVuZGVyUGFzc0VuY29kZXIuZW5kKCksdGhpcy5yZW5kZXJQYXNzRW5jb2Rlcj1udWxsKSx0aGlzLm5vZGVSZW5kZXJQYXNzQXRsYXNJbmRleD0tMSxuLm1zYWEmJm4ubXNhYVRleHR1cmU/LnZpZXc/dGhpcy5kcmF3RWxlbWVudFRvTXNhYShuLGUsdCxpLGEscik6dGhpcy5kcmF3RWxlbWVudFRvVGV4dHVyZShuLGUsdCxpLGEscil9ZHJhd0VsZW1lbnRUb01zYWEoZSx0LHIsbixpLGEpe2NvbnN0IHM9UnModGhpcy5kZXZpY2UsbixpKTt0aGlzLmRldmljZS5xdWV1ZS5jb3B5RXh0ZXJuYWxJbWFnZVRvVGV4dHVyZSh7c291cmNlOnIsZmxpcFk6YX0se3RleHR1cmU6cyxwcmVtdWx0aXBsaWVkQWxwaGE6ITB9LHt3aWR0aDpuLGhlaWdodDppfSk7Y29uc3Qgbz10aGlzLnBpcGVsaW5lTWFuYWdlci5nZXRQaXBlbGluZSgiYml0bWFwX3JlbmRlcl9tc2FhIik7aWYoIW8pcmV0dXJuIHZvaWQgQ3Mocyk7Y29uc3QgbD10aGlzLnBpcGVsaW5lTWFuYWdlci5nZXRCaW5kR3JvdXBMYXlvdXQoInBvc2l0aW9uZWRfdGV4dHVyZSIpO2lmKCFsKXJldHVybiB2b2lkIENzKHMpO2NvbnN0IGM9dGhpcy4kdW5pZm9ybURhdGE4O2NbMF09dC54LGNbMV09dC55LGNbMl09bixjWzNdPWksY1s0XT1lLndpZHRoLGNbNV09ZS5oZWlnaHQsY1s2XT0wLGNbN109MDtjb25zdCB1PXRoaXMuYnVmZmVyTWFuYWdlci5hY3F1aXJlQW5kV3JpdGVVbmlmb3JtQnVmZmVyKGMpLGY9dGhpcy50ZXh0dXJlTWFuYWdlci5jcmVhdGVTYW1wbGVyKCJsaW5lYXJfc2FtcGxlciIsITApLGQ9RnMocyk7ZmNbMF0ucmVzb3VyY2UuYnVmZmVyPXUsZmNbMV0ucmVzb3VyY2U9ZixmY1syXS5yZXNvdXJjZT1kO2NvbnN0IGg9dGhpcy5kZXZpY2UuY3JlYXRlQmluZEdyb3VwKHtsYXlvdXQ6bCxlbnRyaWVzOmZjfSk7dGhpcy5lbnN1cmVDb21tYW5kRW5jb2RlcigpLGdjLnZpZXc9ZS5tc2FhVGV4dHVyZS52aWV3LGdjLnJlc29sdmVUYXJnZXQ9ZS50ZXh0dXJlLnZpZXc7Y29uc3QgcD1lLm1zYWFTdGVuY2lsPy52aWV3O3A/KGJjLnZpZXc9cCx4Yy5kZXB0aFN0ZW5jaWxBdHRhY2htZW50PWJjKTp4Yy5kZXB0aFN0ZW5jaWxBdHRhY2htZW50PXZvaWQgMDtjb25zdCBtPXRoaXMuY29tbWFuZEVuY29kZXIuYmVnaW5SZW5kZXJQYXNzKHhjKTttLnNldFZpZXdwb3J0KDAsMCxlLndpZHRoLGUuaGVpZ2h0LDAsMSksbS5zZXRTY2lzc29yUmVjdCh0LngsdC55LG4saSksbS5zZXRQaXBlbGluZShvKSxtLnNldEJpbmRHcm91cCgwLGgpLG0uZHJhdyg2KSxtLmVuZCgpLHRoaXMucG9vbGVkUmVuZGVyVGV4dHVyZXMucHVzaChzKX1kcmF3RWxlbWVudFRvVGV4dHVyZShlLHQscixuLGksYSl7Y29uc3Qgcz1Scyh0aGlzLmRldmljZSxuLGkpO3RoaXMuZGV2aWNlLnF1ZXVlLmNvcHlFeHRlcm5hbEltYWdlVG9UZXh0dXJlKHtzb3VyY2U6cixmbGlwWTphfSx7dGV4dHVyZTpzLHByZW11bHRpcGxpZWRBbHBoYTohMH0se3dpZHRoOm4saGVpZ2h0Oml9KTtjb25zdCBvPXRoaXMucGlwZWxpbmVNYW5hZ2VyLmdldFBpcGVsaW5lKCJiaXRtYXBfcmVuZGVyIik7aWYoIW8pcmV0dXJuIHZvaWQgQ3Mocyk7Y29uc3QgbD10aGlzLnBpcGVsaW5lTWFuYWdlci5nZXRCaW5kR3JvdXBMYXlvdXQoInBvc2l0aW9uZWRfdGV4dHVyZSIpO2lmKCFsKXJldHVybiB2b2lkIENzKHMpO2NvbnN0IGM9dGhpcy4kdW5pZm9ybURhdGE4O2NbMF09dC54LGNbMV09dC55LGNbMl09bixjWzNdPWksY1s0XT1lLndpZHRoLGNbNV09ZS5oZWlnaHQsY1s2XT0wLGNbN109MDtjb25zdCB1PXRoaXMuYnVmZmVyTWFuYWdlci5hY3F1aXJlQW5kV3JpdGVVbmlmb3JtQnVmZmVyKGMpLGY9dGhpcy50ZXh0dXJlTWFuYWdlci5jcmVhdGVTYW1wbGVyKCJsaW5lYXJfc2FtcGxlciIsITApLGQ9RnMocyk7ZmNbMF0ucmVzb3VyY2UuYnVmZmVyPXUsZmNbMV0ucmVzb3VyY2U9ZixmY1syXS5yZXNvdXJjZT1kO2NvbnN0IGg9dGhpcy5kZXZpY2UuY3JlYXRlQmluZEdyb3VwKHtsYXlvdXQ6bCxlbnRyaWVzOmZjfSk7dGhpcy5lbnN1cmVDb21tYW5kRW5jb2RlcigpLGdjLnZpZXc9ZS50ZXh0dXJlLnZpZXcsZ2MucmVzb2x2ZVRhcmdldD12b2lkIDA7Y29uc3QgcD1lLnN0ZW5jaWw/LnZpZXc7cD8oYmMudmlldz1wLHhjLmRlcHRoU3RlbmNpbEF0dGFjaG1lbnQ9YmMpOnhjLmRlcHRoU3RlbmNpbEF0dGFjaG1lbnQ9dm9pZCAwO2NvbnN0IG09dGhpcy5jb21tYW5kRW5jb2Rlci5iZWdpblJlbmRlclBhc3MoeGMpO20uc2V0Vmlld3BvcnQoMCwwLGUud2lkdGgsZS5oZWlnaHQsMCwxKSxtLnNldFNjaXNzb3JSZWN0KHQueCx0LnksbixpKSxtLnNldFBpcGVsaW5lKG8pLG0uc2V0QmluZEdyb3VwKDAsaCksbS5kcmF3KDYpLG0uZW5kKCksdGhpcy5wb29sZWRSZW5kZXJUZXh0dXJlcy5wdXNoKHMpfWFwcGx5RmlsdGVyKGUsdCxyLG4saSxhLHMsbyxsLGMsdSl7dGhpcy5kcmF3QXJyYXlzSW5zdGFuY2VkKCksdGhpcy5mcmFtZVN0YXJ0ZWR8fHRoaXMuYmVnaW5GcmFtZSgpLHRoaXMucmVuZGVyUGFzc0VuY29kZXImJih0aGlzLnJlbmRlclBhc3NFbmNvZGVyLmVuZCgpLHRoaXMucmVuZGVyUGFzc0VuY29kZXI9bnVsbCksdGhpcy5ub2RlUmVuZGVyUGFzc0F0bGFzSW5kZXg9LTEsdGhpcy5lbnN1cmVDb21tYW5kRW5jb2RlcigpLHRoaXMuJGZpbHRlckNvbmZpZy5jb21tYW5kRW5jb2Rlcj10aGlzLmNvbW1hbmRFbmNvZGVyLHRoaXMuJGZpbHRlckNvbmZpZy5tYWluQXR0YWNobWVudD10aGlzLiRtYWluQXR0YWNobWVudE9iamVjdCxqbChlLG4saSxhLHMsbyxsLGMsdSx0aGlzLiRmaWx0ZXJDb25maWcsdGhpcy5tYWluVGV4dHVyZVZpZXcsdGhpcy5idWZmZXJNYW5hZ2VyKX1jb250YWluZXJCZWdpbkxheWVyKGUsdCl7dGhpcy5kcmF3QXJyYXlzSW5zdGFuY2VkKCksdGhpcy5mcmFtZVN0YXJ0ZWR8fHRoaXMuYmVnaW5GcmFtZSgpLHRoaXMucmVuZGVyUGFzc0VuY29kZXImJih0aGlzLnJlbmRlclBhc3NFbmNvZGVyLmVuZCgpLHRoaXMucmVuZGVyUGFzc0VuY29kZXI9bnVsbCk7Y29uc3Qgcj10aGlzLiRtYWluQXR0YWNobWVudE9iamVjdDt0aGlzLiRjb250YWluZXJMYXllclN0YWNrLnB1c2gociksdGhpcy5jb250YWluZXJMYXllckNvbnRlbnRTaXplcy5wdXNoKHt3aWR0aDplLGhlaWdodDp0fSk7Y29uc3Qgbj10aGlzLmZyYW1lQnVmZmVyTWFuYWdlci5jcmVhdGVBdHRhY2htZW50KCJjb250YWluZXJfbGF5ZXIiLGUsdCxyLm1zYWEsITApO3RoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0PW4sdGhpcy5iaW5kKG4pfWNvbnRhaW5lckVuZExheWVyKGUsdCxyLG4saSxhLHMsbyl7dGhpcy5kcmF3QXJyYXlzSW5zdGFuY2VkKCksdGhpcy5yZW5kZXJQYXNzRW5jb2RlciYmKHRoaXMucmVuZGVyUGFzc0VuY29kZXIuZW5kKCksdGhpcy5yZW5kZXJQYXNzRW5jb2Rlcj1udWxsKSx0aGlzLmVuc3VyZUNvbW1hbmRFbmNvZGVyKCk7Y29uc3QgbD10aGlzLiRtYWluQXR0YWNobWVudE9iamVjdCxjPXRoaXMuY29udGFpbmVyTGF5ZXJDb250ZW50U2l6ZXMucG9wKCl8fHt3aWR0aDpsLndpZHRoLGhlaWdodDpsLmhlaWdodH07dGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3Q9dGhpcy4kY29udGFpbmVyTGF5ZXJTdGFjay5wb3AoKSx0aGlzLiRmaWx0ZXJDb25maWcuY29tbWFuZEVuY29kZXI9dGhpcy5jb21tYW5kRW5jb2Rlcix0aGlzLiRmaWx0ZXJDb25maWcubWFpbkF0dGFjaG1lbnQ9dm9pZCAwLEpsKGwsdGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3QsMCxlLHQscixuLGksYSxzLG8sYy53aWR0aCxjLmhlaWdodCx0aGlzLiRmaWx0ZXJDb25maWcsdGhpcy5idWZmZXJNYW5hZ2VyKSx0aGlzLmJpbmQodGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3QpfWNvbnRhaW5lckRyYXdDYWNoZWRGaWx0ZXIoZSx0LHIsbixpLGEpe2lmKHluLmdldChpLCJmS2V5IikhPT1hKXJldHVybjtjb25zdCBzPXluLmdldChpLCJmVGV4dHVyZSIpO2lmKCFzfHwhcy50ZXh0dXJlKXJldHVybjt0aGlzLmRyYXdBcnJheXNJbnN0YW5jZWQoKSx0aGlzLmZyYW1lU3RhcnRlZHx8dGhpcy5iZWdpbkZyYW1lKCksdGhpcy5yZW5kZXJQYXNzRW5jb2RlciYmKHRoaXMucmVuZGVyUGFzc0VuY29kZXIuZW5kKCksdGhpcy5yZW5kZXJQYXNzRW5jb2Rlcj1udWxsKSx0aGlzLmVuc3VyZUNvbW1hbmRFbmNvZGVyKCk7Y29uc3Qgbz10aGlzLiRtYWluQXR0YWNobWVudE9iamVjdDtpZighb3x8IW8udGV4dHVyZSlyZXR1cm47bGV0IGw9cyxjPW51bGw7aWYoISgxPT09clswXSYmMT09PXJbMV0mJjE9PT1yWzJdJiYxPT09clszXSYmMD09PXJbNF0mJjA9PT1yWzVdJiYwPT09cls2XSYmMD09PXJbN10pKXtjPXRoaXMuZnJhbWVCdWZmZXJNYW5hZ2VyLmNyZWF0ZVRlbXBvcmFyeUF0dGFjaG1lbnQocy53aWR0aCxzLmhlaWdodCk7Y29uc3QgZT10aGlzLnBpcGVsaW5lTWFuYWdlci5nZXRQaXBlbGluZSgiY29sb3JfdHJhbnNmb3JtIiksdD10aGlzLnBpcGVsaW5lTWFuYWdlci5nZXRCaW5kR3JvdXBMYXlvdXQoInRleHR1cmVfY29weSIpO2lmKGUmJnQmJmMudGV4dHVyZSl7aWNbMF09clswXSxpY1sxXT1yWzFdLGljWzJdPXJbMl0saWNbM109clszXSxpY1s0XT1yWzRdLGljWzVdPXJbNV0saWNbNl09cls2XSxpY1s3XT0wO2NvbnN0IG49aWMsaT10aGlzLmJ1ZmZlck1hbmFnZXIuYWNxdWlyZUFuZFdyaXRlVW5pZm9ybUJ1ZmZlcihuKSxhPXRoaXMudGV4dHVyZU1hbmFnZXIuY3JlYXRlU2FtcGxlcigiY2FjaGVkX2N0X3NhbXBsZXIiLCExKTtmY1swXS5yZXNvdXJjZS5idWZmZXI9aSxmY1sxXS5yZXNvdXJjZT1hLGZjWzJdLnJlc291cmNlPXMudGV4dHVyZS52aWV3O2NvbnN0IG89dGhpcy5kZXZpY2UuY3JlYXRlQmluZEdyb3VwKHtsYXlvdXQ6dCxlbnRyaWVzOmZjfSksdT10aGlzLmZyYW1lQnVmZmVyTWFuYWdlci5jcmVhdGVSZW5kZXJQYXNzRGVzY3JpcHRvcihjLnRleHR1cmUudmlldywwLDAsMCwwLCJjbGVhciIpLGY9dGhpcy5jb21tYW5kRW5jb2Rlci5iZWdpblJlbmRlclBhc3ModSk7Zi5zZXRQaXBlbGluZShlKSxmLnNldEJpbmRHcm91cCgwLG8pLGYuZHJhdyg2LDEsMCwwKSxmLmVuZCgpLGw9Y319Y29uc3QgdT1Ibi5nZXREZXZpY2VQaXhlbFJhdGlvKCksZj1NYXRoLnNxcnQodFswXSp0WzBdK3RbMV0qdFsxXSksZD1NYXRoLnNxcnQodFsyXSp0WzJdK3RbM10qdFszXSksaD1uWzBdKihmL3UpLHA9blsxXSooZC91KSxtPU1hdGguZmxvb3IoaCt0WzRdKSxnPU1hdGguZmxvb3IocCt0WzVdKSxiPW8ubXNhYSYmby5tc2FhVGV4dHVyZT8udmlldztsZXQgeDtzd2l0Y2goZSl7Y2FzZSJhZGQiOng9Yj8iZmlsdGVyX291dHB1dF9hZGRfbXNhYSI6ImZpbHRlcl9vdXRwdXRfYWRkIjticmVhaztjYXNlInNjcmVlbiI6eD1iPyJmaWx0ZXJfb3V0cHV0X3NjcmVlbl9tc2FhIjoiZmlsdGVyX291dHB1dF9zY3JlZW4iO2JyZWFrO2Nhc2UiYWxwaGEiOng9Yj8iZmlsdGVyX291dHB1dF9hbHBoYV9tc2FhIjoiZmlsdGVyX291dHB1dF9hbHBoYSI7YnJlYWs7Y2FzZSJlcmFzZSI6eD1iPyJmaWx0ZXJfb3V0cHV0X2VyYXNlX21zYWEiOiJmaWx0ZXJfb3V0cHV0X2VyYXNlIjticmVhaztkZWZhdWx0Ong9Yj8iZmlsdGVyX291dHB1dF9tc2FhIjoiZmlsdGVyX291dHB1dCJ9Y29uc3Qgdj10aGlzLnBpcGVsaW5lTWFuYWdlci5nZXRQaXBlbGluZSh4KSx5PXRoaXMucGlwZWxpbmVNYW5hZ2VyLmdldEJpbmRHcm91cExheW91dCgidGV4dHVyZV9jb3B5Iik7aWYoIXZ8fCF5KXJldHVybjtjb25zdCBfPXRoaXMudGV4dHVyZU1hbmFnZXIuY3JlYXRlU2FtcGxlcigiY2FjaGVkX2ZpbHRlcl9zYW1wbGVyIiwhMCksdz10aGlzLmJ1ZmZlck1hbmFnZXIuYWNxdWlyZUFuZFdyaXRlVW5pZm9ybUJ1ZmZlcihlYyk7ZmNbMF0ucmVzb3VyY2UuYnVmZmVyPXcsZmNbMV0ucmVzb3VyY2U9XyxmY1syXS5yZXNvdXJjZT1sLnRleHR1cmUudmlldztjb25zdCBNPXRoaXMuZGV2aWNlLmNyZWF0ZUJpbmRHcm91cCh7bGF5b3V0OnksZW50cmllczpmY30pLFA9Yj9vLm1zYWFUZXh0dXJlLnZpZXc6by50ZXh0dXJlLnZpZXcsUz1iP28udGV4dHVyZS52aWV3Om51bGwsRj10aGlzLmZyYW1lQnVmZmVyTWFuYWdlci5jcmVhdGVSZW5kZXJQYXNzRGVzY3JpcHRvcihQLDAsMCwwLDAsImxvYWQiLFMpLFQ9TWF0aC5tYXgoMCxtKSxCPU1hdGgubWF4KDAsZyksTz1NYXRoLm1heCgxLGwud2lkdGgpLEE9TWF0aC5tYXgoMSxsLmhlaWdodCksUj1vLndpZHRoLEM9by5oZWlnaHQsRT1NYXRoLm1heCgxLE1hdGgubWluKE8sUi1UKSksVT1NYXRoLm1heCgxLE1hdGgubWluKEEsQy1CKSk7aWYoRTw9MHx8VTw9MHx8VD49Unx8Qj49QylyZXR1cm4gdm9pZChjJiZ0aGlzLmZyYW1lQnVmZmVyTWFuYWdlci5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChjKSk7Y29uc3QgJD10aGlzLmNvbW1hbmRFbmNvZGVyLmJlZ2luUmVuZGVyUGFzcyhGKTskLnNldFBpcGVsaW5lKHYpLCQuc2V0QmluZEdyb3VwKDAsTSksJC5zZXRWaWV3cG9ydChULEIsTyxBLDAsMSksJC5zZXRTY2lzc29yUmVjdChULEIsRSxVKSwkLmRyYXcoNiwxLDAsMCksJC5lbmQoKSxjJiZ0aGlzLmZyYW1lQnVmZmVyTWFuYWdlci5yZWxlYXNlVGVtcG9yYXJ5QXR0YWNobWVudChjKSx0aGlzLmJpbmQobyl9ZW5zdXJlTWFpblRleHR1cmUoKXt0aGlzLm1haW5UZXh0dXJlfHwodGhpcy4kbmVlZHNSZWNvbmZpZ3VyZSYmKHRoaXMuY2FudmFzQ29udGV4dC5jb25maWd1cmUoe2RldmljZTp0aGlzLmRldmljZSxmb3JtYXQ6dGhpcy5wcmVmZXJyZWRGb3JtYXQsYWxwaGFNb2RlOiJwcmVtdWx0aXBsaWVkIn0pLHRoaXMuJG5lZWRzUmVjb25maWd1cmU9ITEpLHRoaXMubWFpblRleHR1cmU9dGhpcy5jYW52YXNDb250ZXh0LmdldEN1cnJlbnRUZXh0dXJlKCksdGhpcy5tYWluVGV4dHVyZVZpZXc9dGhpcy5tYWluVGV4dHVyZS5jcmVhdGVWaWV3KCkpfWdldEN1cnJlbnRUZXh0dXJlVmlldygpe3JldHVybiB0aGlzLmN1cnJlbnRSZW5kZXJUYXJnZXQ/dGhpcy5jdXJyZW50UmVuZGVyVGFyZ2V0Oih0aGlzLmVuc3VyZU1haW5UZXh0dXJlKCksdGhpcy5tYWluVGV4dHVyZVZpZXcpfWVuc3VyZUNvbW1hbmRFbmNvZGVyKCl7dGhpcy5jb21tYW5kRW5jb2Rlcnx8KHRoaXMuY29tbWFuZEVuY29kZXI9dGhpcy5kZXZpY2UuY3JlYXRlQ29tbWFuZEVuY29kZXIoKSl9YmVnaW5GcmFtZSgpe3RoaXMuZnJhbWVTdGFydGVkfHwodGhpcy5lbnN1cmVNYWluVGV4dHVyZSgpLHRoaXMuZW5zdXJlQ29tbWFuZEVuY29kZXIoKSx0aGlzLmZyYW1lU3RhcnRlZD0hMCx0aGlzLmZyYW1lQnVmZmVyTWFuYWdlci5iZWdpbkZyYW1lKCkpfWFkZEZyYW1lVGV4dHVyZShlKXt0aGlzLnBvb2xlZFRleHR1cmVzLnB1c2goZSl9ZW5kRnJhbWUoKXtpZih0aGlzLmZyYW1lU3RhcnRlZCl7aWYodGhpcy5yZW5kZXJQYXNzRW5jb2RlciYmKHRoaXMucmVuZGVyUGFzc0VuY29kZXIuZW5kKCksdGhpcy5yZW5kZXJQYXNzRW5jb2Rlcj1udWxsKSx0aGlzLmJ1ZmZlck1hbmFnZXIuZHluYW1pY1VuaWZvcm0uZmx1c2goKSx0aGlzLmNvbW1hbmRFbmNvZGVyKXRyeXtjb25zdCBlPXRoaXMuY29tbWFuZEVuY29kZXIuZmluaXNoKCk7dGhpcy5kZXZpY2UucXVldWUuc3VibWl0KFtlXSl9Y2F0Y2goZSl7Y29uc29sZS5lcnJvcigiRmFpbGVkIHRvIHN1Ym1pdCBmcmFtZSBjb21tYW5kczoiLGUpfXRoaXMuZnJhbWVCdWZmZXJNYW5hZ2VyLmZsdXNoUGVuZGluZ1JlbGVhc2VzKCksdGhpcy5idWZmZXJNYW5hZ2VyLmNsZWFyRnJhbWVCdWZmZXJzKCk7Zm9yKGNvbnN0IGUgb2YgdGhpcy5mcmFtZVRleHR1cmVzKWUuZGVzdHJveSgpO3RoaXMuZnJhbWVUZXh0dXJlcy5sZW5ndGg9MDtmb3IoY29uc3QgZSBvZiB0aGlzLnBvb2xlZFRleHR1cmVzKUFzKGUpO3RoaXMucG9vbGVkVGV4dHVyZXMubGVuZ3RoPTA7Zm9yKGNvbnN0IGUgb2YgdGhpcy5wb29sZWRSZW5kZXJUZXh0dXJlcylDcyhlKTt0aGlzLnBvb2xlZFJlbmRlclRleHR1cmVzLmxlbmd0aD0wLCgoKT0+eyRzKys7Zm9yKGNvbnN0W2UsdF1vZiBVcykkcy10Lmxhc3RVc2VkRnJhbWU+NjAmJihBcyh0LnRleHR1cmUpLFVzLmRlbGV0ZShlKSl9KSgpLHRoaXMuZmlsbER5bmFtaWNCaW5kR3JvdXA9bnVsbCx0aGlzLmZpbGxEeW5hbWljQmluZEdyb3VwQnVmZmVyPW51bGwsdGhpcy5jb21tYW5kRW5jb2Rlcj1udWxsLHRoaXMucmVuZGVyUGFzc0VuY29kZXI9bnVsbCx0aGlzLmN1cnJlbnRSZW5kZXJUYXJnZXQ9bnVsbCx0aGlzLm5vZGVSZW5kZXJQYXNzQXRsYXNJbmRleD0tMSx0aGlzLm1haW5UZXh0dXJlPW51bGwsdGhpcy5tYWluVGV4dHVyZVZpZXc9bnVsbCx0aGlzLmZyYW1lU3RhcnRlZD0hMX19c3VibWl0KCl7dGhpcy5lbmRGcmFtZSgpfWNyZWF0ZU5vZGUoZSx0KXtjb25zdCByPXhhO2lmKCFQYVtyXSl7Y29uc3QgZT1Ibi5nZXRSZW5kZXJNYXhTaXplKCk7UGFbcl09bmV3IEp0KHIsZSxlKX1jb25zdCBuPVBhW3JdLmluc2VydChlLHQpO3JldHVybiBufHwodmEocisxKSx0aGlzLmNyZWF0ZU5vZGUoZSx0KSl9cmVtb3ZlTm9kZShlKXtjb25zdCB0PWUuaW5kZXgscj1QYVt0XTtyJiZyLmRpc3Bvc2UoZS54LGUueSxlLncsZS5oKX10cmFuc2Zlck1haW5DYW52YXMoKXtpZighdGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3R8fCF0aGlzLiRtYWluQXR0YWNobWVudE9iamVjdC50ZXh0dXJlKXJldHVybiB2b2lkIHRoaXMuZW5kRnJhbWUoKTt0aGlzLnJlbmRlclBhc3NFbmNvZGVyJiYodGhpcy5yZW5kZXJQYXNzRW5jb2Rlci5lbmQoKSx0aGlzLnJlbmRlclBhc3NFbmNvZGVyPW51bGwpLHRoaXMuZW5zdXJlQ29tbWFuZEVuY29kZXIoKSx0aGlzLmVuc3VyZU1haW5UZXh0dXJlKCk7Y29uc3QgZT10aGlzLnBpcGVsaW5lTWFuYWdlci5nZXRQaXBlbGluZSgidGV4dHVyZV9jb3B5X2JncmEiKSx0PXRoaXMucGlwZWxpbmVNYW5hZ2VyLmdldEJpbmRHcm91cExheW91dCgidGV4dHVyZV9jb3B5Iik7aWYoIWV8fCF0KXJldHVybiBjb25zb2xlLmVycm9yKCJbV2ViR1BVXSB0ZXh0dXJlX2NvcHlfYmdyYSBwaXBlbGluZSBub3QgZm91bmQiKSx2b2lkIHRoaXMuZW5kRnJhbWUoKTtjb25zdCByPXRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0LnRleHR1cmUudmlldztpZighc2N8fG9jIT09cil7bGN8fChsYz10aGlzLmRldmljZS5jcmVhdGVCdWZmZXIoe3NpemU6ZWMuYnl0ZUxlbmd0aCx1c2FnZTpHUFVCdWZmZXJVc2FnZS5VTklGT1JNfEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNUfSksdGhpcy5kZXZpY2UucXVldWUud3JpdGVCdWZmZXIobGMsMCxlYy5idWZmZXIsZWMuYnl0ZU9mZnNldCxlYy5ieXRlTGVuZ3RoKSk7Y29uc3QgZT10aGlzLnRleHR1cmVNYW5hZ2VyLmNyZWF0ZVNhbXBsZXIoInRyYW5zZmVyX3NhbXBsZXIiLCExKTtmY1swXS5yZXNvdXJjZT17YnVmZmVyOmxjfSxmY1sxXS5yZXNvdXJjZT1lLGZjWzJdLnJlc291cmNlPXIsc2M9dGhpcy5kZXZpY2UuY3JlYXRlQmluZEdyb3VwKHtsYXlvdXQ6dCxlbnRyaWVzOmZjfSksb2M9cn1jb25zdCBuPXNjO2NjLnZpZXc9dGhpcy5tYWluVGV4dHVyZVZpZXc7Y29uc3QgaT10aGlzLmNvbW1hbmRFbmNvZGVyLmJlZ2luUmVuZGVyUGFzcyh1Yyk7aS5zZXRQaXBlbGluZShlKSxpLnNldEJpbmRHcm91cCgwLG4pLGkuZHJhdyg2LDEsMCwwKSxpLmVuZCgpLHRoaXMuZW5kRnJhbWUoKX1hc3luYyBjcmVhdGVJbWFnZUJpdG1hcChlLHQpe2NvbnN0IHI9d2EoKTtpZighcil0aHJvdyBuZXcgRXJyb3IoIltXZWJHUFVdIEF0bGFzIGF0dGFjaG1lbnQgbm90IGZvdW5kIik7dGhpcy5yZW5kZXJQYXNzRW5jb2RlciYmKHRoaXMucmVuZGVyUGFzc0VuY29kZXIuZW5kKCksdGhpcy5yZW5kZXJQYXNzRW5jb2Rlcj1udWxsKTtjb25zdCBuPTI1NipNYXRoLmNlaWwoNCplLzI1NiksaT1uKnQsYT10aGlzLmRldmljZS5jcmVhdGVCdWZmZXIoe3NpemU6aSx1c2FnZTpHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVHxHUFVCdWZmZXJVc2FnZS5NQVBfUkVBRH0pLHM9dGhpcy5kZXZpY2UuY3JlYXRlQ29tbWFuZEVuY29kZXIoKTtpZighci50ZXh0dXJlKXRocm93IG5ldyBFcnJvcigiQXR0YWNobWVudCB0ZXh0dXJlIGlzIG51bGwiKTtzLmNvcHlUZXh0dXJlVG9CdWZmZXIoe3RleHR1cmU6ci50ZXh0dXJlLnJlc291cmNlLG1pcExldmVsOjAsb3JpZ2luOnt4OjAseTowLHo6MH19LHtidWZmZXI6YSxieXRlc1BlclJvdzpuLHJvd3NQZXJJbWFnZTp0fSx7d2lkdGg6ZSxoZWlnaHQ6dCxkZXB0aE9yQXJyYXlMYXllcnM6MX0pLHRoaXMuZGV2aWNlLnF1ZXVlLnN1Ym1pdChbcy5maW5pc2goKV0pLGF3YWl0IGEubWFwQXN5bmMoR1BVTWFwTW9kZS5SRUFEKTtjb25zdCBvPWEuZ2V0TWFwcGVkUmFuZ2UoKSxsPW5ldyBVaW50OEFycmF5KG8pLGM9bmV3IFVpbnQ4QXJyYXkoZSp0KjQpO2ZvcihsZXQgcj0wO3I8dDtyKyspe2NvbnN0IHQ9cipuLGk9ciplKjQ7Yy5zZXQobC5zdWJhcnJheSh0LHQrNCplKSxpKX1hLnVubWFwKCksYS5kZXN0cm95KCk7Y29uc3QgdT1uZXcgRmxvYXQzMkFycmF5KDI1Nik7Zm9yKGxldCBlPTE7ZTwyNTY7ZSsrKXVbZV09MjU1L2U7Zm9yKGxldCBlPTA7ZTxjLmxlbmd0aDtlKz00KXtjb25zdCB0PWNbZSszXTtpZigwPT09dHx8MjU1PT09dCljb250aW51ZTtjb25zdCByPXVbdF07Y1tlXT1NYXRoLm1pbigyNTUsTWF0aC5yb3VuZChjW2VdKnIpKSxjW2UrMV09TWF0aC5taW4oMjU1LE1hdGgucm91bmQoY1tlKzFdKnIpKSxjW2UrMl09TWF0aC5taW4oMjU1LE1hdGgucm91bmQoY1tlKzJdKnIpKX1jb25zdCBmPW5ldyBJbWFnZURhdGEobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGMpLGUsdCk7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBjcmVhdGVJbWFnZUJpdG1hcClyZXR1cm4gYXdhaXQgY3JlYXRlSW1hZ2VCaXRtYXAoZix7cHJlbXVsdGlwbHlBbHBoYToibm9uZSIsY29sb3JTcGFjZUNvbnZlcnNpb246Im5vbmUifSk7dGhyb3cgbmV3IEVycm9yKCJbV2ViR1BVXSBjcmVhdGVJbWFnZUJpdG1hcCBub3QgYXZhaWxhYmxlIGluIHRoaXMgZW52aXJvbm1lbnQiKX1iZWdpbk1hc2soKXtpZih0aGlzLiRtYWluQXR0YWNobWVudE9iamVjdCYmdGhpcy5iaW5kKHRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0KSx0aGlzLmN1cnJlbnRSZW5kZXJUYXJnZXQ9bnVsbCx0aGlzLnJlbmRlclBhc3NFbmNvZGVyJiYodGhpcy5yZW5kZXJQYXNzRW5jb2Rlci5lbmQoKSx0aGlzLnJlbmRlclBhc3NFbmNvZGVyPW51bGwpLHRoaXMuZnJhbWVTdGFydGVkfHx0aGlzLmJlZ2luRnJhbWUoKSx0aGlzLmVuc3VyZUNvbW1hbmRFbmNvZGVyKCksdGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3Q/LnRleHR1cmUmJnRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0Py5zdGVuY2lsPy52aWV3KXtjb25zdCBlPTA9PT10aGlzLiRtYWluQXR0YWNobWVudE9iamVjdC5jbGlwTGV2ZWw/ImNsZWFyIjoibG9hZCIsdD10aGlzLiRtYWluQXR0YWNobWVudE9iamVjdC5tc2FhJiZ0aGlzLiRtYWluQXR0YWNobWVudE9iamVjdC5tc2FhVGV4dHVyZT8udmlldyxyPXQ/dGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3QubXNhYVRleHR1cmUudmlldzp0aGlzLiRtYWluQXR0YWNobWVudE9iamVjdC50ZXh0dXJlLnZpZXcsbj10JiZ0aGlzLiRtYWluQXR0YWNobWVudE9iamVjdC5tc2FhU3RlbmNpbD8udmlldz90aGlzLiRtYWluQXR0YWNobWVudE9iamVjdC5tc2FhU3RlbmNpbC52aWV3OnRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0LnN0ZW5jaWwudmlldyxpPXRoaXMuZnJhbWVCdWZmZXJNYW5hZ2VyLmNyZWF0ZVN0ZW5jaWxSZW5kZXJQYXNzRGVzY3JpcHRvcihyLG4sImxvYWQiLGUpO3RoaXMucmVuZGVyUGFzc0VuY29kZXI9dGhpcy5jb21tYW5kRW5jb2Rlci5iZWdpblJlbmRlclBhc3MoaSksdGhpcy52aWV3cG9ydFdpZHRoPXRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0LndpZHRoLHRoaXMudmlld3BvcnRIZWlnaHQ9dGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3QuaGVpZ2h0fSgoKT0+e2NvbnN0IGU9UW4uY3VycmVudEF0dGFjaG1lbnRPYmplY3Q7ZSYmKGUubWFzaz0hMCxlLmNsaXBMZXZlbCsrLFFhLnNldChlLmNsaXBMZXZlbCxlLmNsaXBMZXZlbCksRGEoKXx8amEoITApKX0pKCksdGhpcy5pbk1hc2tNb2RlPSEwfXNldE1hc2tCb3VuZHMoZSx0LHIsbil7WmEoZSx0LHIsbil9ZW5kTWFzaygpe3RoaXMucmVuZGVyUGFzc0VuY29kZXImJih0aGlzLnJlbmRlclBhc3NFbmNvZGVyLmVuZCgpLHRoaXMucmVuZGVyUGFzc0VuY29kZXI9bnVsbCksSmEoKSx0aGlzLmluTWFza01vZGU9ITF9bGVhdmVNYXNrKCl7dGhpcy5kcmF3QXJyYXlzSW5zdGFuY2VkKCk7Y29uc3QgZT10aGlzLmZyYW1lQnVmZmVyTWFuYWdlci5nZXRDdXJyZW50QXR0YWNobWVudCgpLHQ9ZT8uY2xpcExldmVsPz8wLHI9MT09PXQ7ZXMoKSx0aGlzLnJlbmRlclBhc3NFbmNvZGVyJiYodGhpcy5yZW5kZXJQYXNzRW5jb2Rlci5lbmQoKSx0aGlzLnJlbmRlclBhc3NFbmNvZGVyPW51bGwpLHRoaXMuZW5zdXJlQ29tbWFuZEVuY29kZXIoKTtjb25zdCBuPXRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0Py5tc2FhJiZ0aGlzLiRtYWluQXR0YWNobWVudE9iamVjdD8ubXNhYVRleHR1cmU/LnZpZXcsaT1uP3RoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0Lm1zYWFUZXh0dXJlLnZpZXc6dGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3Q/LnRleHR1cmUudmlldyxhPW4mJnRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0Py5tc2FhU3RlbmNpbD8udmlldz90aGlzLiRtYWluQXR0YWNobWVudE9iamVjdC5tc2FhU3RlbmNpbC52aWV3OnRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0Py5zdGVuY2lsPy52aWV3O2lmKHImJmEpe2NvbnN0IGU9e2NvbG9yQXR0YWNobWVudHM6W3t2aWV3OmksbG9hZE9wOiJsb2FkIixzdG9yZU9wOiJzdG9yZSJ9XSxkZXB0aFN0ZW5jaWxBdHRhY2htZW50Ont2aWV3OmEsc3RlbmNpbExvYWRPcDoiY2xlYXIiLHN0ZW5jaWxTdG9yZU9wOiJzdG9yZSIsc3RlbmNpbENsZWFyVmFsdWU6MH19O3RoaXMuY29tbWFuZEVuY29kZXIuYmVnaW5SZW5kZXJQYXNzKGUpLmVuZCgpfWVsc2UgaWYodD4xJiZhKXtjb25zdCBlPXQscj1gY2xpcF9jbGVhcl9tYWluXyR7TWF0aC5taW4oOCxNYXRoLm1heCgxLGUpKX1gLG49dGhpcy5waXBlbGluZU1hbmFnZXIuZ2V0UGlwZWxpbmUocik7aWYobil7Y29uc3QgZT10aGlzLmZyYW1lQnVmZmVyTWFuYWdlci5jcmVhdGVTdGVuY2lsUmVuZGVyUGFzc0Rlc2NyaXB0b3IoaSxhLCJsb2FkIiwibG9hZCIpLHQ9dGhpcy5jb21tYW5kRW5jb2Rlci5iZWdpblJlbmRlclBhc3MoZSkscj10aGlzLmJ1ZmZlck1hbmFnZXIuYWNxdWlyZVZlcnRleEJ1ZmZlcihyYy5ieXRlTGVuZ3RoLHJjKTt0LnNldFBpcGVsaW5lKG4pLHQuc2V0U3RlbmNpbFJlZmVyZW5jZSgwKSx0LnNldFZlcnRleEJ1ZmZlcigwLHIpLHQuZHJhdyg2LDEsMCwwKSx0LmVuZCgpfX19fWxldCB5Yztjb25zdCBfYz1lPT57eWM9ZX07bGV0IHdjO2xldCBNYz0wO2xldCBQYz0wO2xldCBTYz0hMTtjb25zdCBGYz1bXSxUYz0oLi4uZSk9Pntjb25zdCB0PUZjLnBvcCgpfHxbXTtyZXR1cm4gZS5sZW5ndGgmJnQucHVzaCguLi5lKSx0fSxCYz0oZSx0PTEpPT4oe1I6KDE2NzExNjgwJmUpPj4xNixHOig2NTI4MCZlKT4+OCxCOjI1NSZlLEE6MjU1KnR9KSxPYz1hc3luYyhlLHQpPT57aWYoKGU9Pnt3Yz1lfSkoZSksImdwdSJpbiBuYXZpZ2F0b3Ipe2NvbnN0IHI9bmF2aWdhdG9yLmdwdSxuPWF3YWl0IHIucmVxdWVzdEFkYXB0ZXIoKTtpZighbil0aHJvdyBuZXcgRXJyb3IoIldlYkdQVSBhZGFwdGVyIG5vdCBhdmFpbGFibGUiKTtjb25zdCBpPWF3YWl0IG4ucmVxdWVzdERldmljZSgpO2lmKCFpKXRocm93IG5ldyBFcnJvcigiV2ViR1BVIGRldmljZSBub3QgYXZhaWxhYmxlIik7Y29uc3QgYT1lLmdldENvbnRleHQoIndlYmdwdSIpO2lmKCFhKXRocm93IG5ldyBFcnJvcigiV2ViR1BVIGNvbnRleHQgbm90IGF2YWlsYWJsZSIpO2NvbnN0IHM9ci5nZXRQcmVmZXJyZWRDYW52YXNGb3JtYXQoKTtfYyhuZXcgdmMoaSxhLHMsdCkpfWVsc2V7Y29uc3Qgcj1lLmdldENvbnRleHQoIndlYmdsMiIse3N0ZW5jaWw6ITAscHJlbXVsdGlwbGllZEFscGhhOiEwLGFudGlhbGlhczohMSxkZXB0aDohMX0pO2lmKCFyKXRocm93IG5ldyBFcnJvcigid2ViZ2wyIGlzIG5vdCBzdXBwb3J0ZWQuIik7X2MobmV3IEtuKHIsNCx0KSl9fSxBYz0oZSx0LHI9ITApPT57TWM9PT1lJiZQYz09PXR8fChTYz0hMCxNYz1lLFBjPXQseWMucmVzaXplKGUsdCxyKSxyJiZ5bi5yZXNldCgpKX0sUmM9KGUsdD0hMSk9PntsZXQgcj0wO2Zvcig7ZS5sZW5ndGg+cjspc3dpdGNoKGVbcisrXSl7Y2FzZSA5OnljLmJlZ2luUGF0aCgpO2JyZWFrO2Nhc2UgMDp5Yy5tb3ZlVG8oZVtyKytdLGVbcisrXSk7YnJlYWs7Y2FzZSAyOnljLmxpbmVUbyhlW3IrK10sZVtyKytdKTticmVhaztjYXNlIDE6eWMucXVhZHJhdGljQ3VydmVUbyhlW3IrK10sZVtyKytdLGVbcisrXSxlW3IrK10pO2JyZWFrO2Nhc2UgNTppZih0KXtyKz00O2JyZWFrfXljLmZpbGxTdHlsZShlW3IrK10vMjU1LGVbcisrXS8yNTUsZVtyKytdLzI1NSxlW3IrK10vMjU1KTticmVhaztjYXNlIDc6eWMuZmlsbCgpO2JyZWFrO2Nhc2UgNjppZih0KXtyKz04O2JyZWFrfXljLnRoaWNrbmVzcz1lW3IrK10seWMuY2Fwcz1lW3IrK10seWMuam9pbnRzPWVbcisrXSx5Yy5taXRlckxpbWl0PWVbcisrXSx5Yy5zdHJva2VTdHlsZShlW3IrK10vMjU1LGVbcisrXS8yNTUsZVtyKytdLzI1NSxlW3IrK10vMjU1KTticmVhaztjYXNlIDg6aWYodClicmVhazt5Yy5zdHJva2UoKTticmVhaztjYXNlIDEyOnljLmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UgNDp5Yy5hcmMoZVtyKytdLGVbcisrXSxlW3IrK10pO2JyZWFrO2Nhc2UgMzp5Yy5iZXppZXJDdXJ2ZVRvKGVbcisrXSxlW3IrK10sZVtyKytdLGVbcisrXSxlW3IrK10sZVtyKytdKTticmVhaztjYXNlIDEwOntpZih0KXtyKz0xO2NvbnN0IHQ9ZVtyKytdO3IrPTUqdCxyKz05LHljLmZpbGwoKTticmVha31jb25zdCBuPWVbcisrXSxpPVRjKCksYT1lW3IrK107Zm9yKGxldCB0PTA7dDxhOysrdClpLnB1c2goZVtyKytdLGVbcisrXSxlW3IrK10sZVtyKytdLGVbcisrXSk7Y29uc3Qgcz1lLnN1YmFycmF5KHIscis2KTtyKz02O2NvbnN0IG89ZVtyKytdLGw9ZVtyKytdLGM9ZVtyKytdO3ljLmdyYWRpZW50RmlsbChuLGkscyxvLGwsYyl9YnJlYWs7Y2FzZSAxMzp7aWYodCl7cis9Mjtjb25zdCB0PWVbcisrXTtyKz10LHIrPTgseWMuZmlsbCgpO2JyZWFrfWNvbnN0IG49ZVtyKytdLGk9ZVtyKytdLGE9ZVtyKytdLHM9bmV3IFVpbnQ4QXJyYXkoZS5zdWJhcnJheShyLHIrYSkpO3IrPWE7Y29uc3Qgbz1lLnN1YmFycmF5KHIscis2KTtyKz02LHljLmJpdG1hcEZpbGwocyxvLG4saSxCb29sZWFuKGVbcisrXSksQm9vbGVhbihlW3IrK10pKX1icmVhaztjYXNlIDExOntpZih0KXtyKz0yMCx5Yy5maWxsKCk7YnJlYWt9eWMudGhpY2tuZXNzPWVbcisrXSx5Yy5jYXBzPWVbcisrXSx5Yy5qb2ludHM9ZVtyKytdLHljLm1pdGVyTGltaXQ9ZVtyKytdO2NvbnN0IG49ZVtyKytdLGk9VGMoKSxhPWVbcisrXTtmb3IobGV0IHQ9MDt0PGE7Kyt0KWkucHVzaChlW3IrK10sZVtyKytdLGVbcisrXSxlW3IrK10sZVtyKytdKTtjb25zdCBzPWUuc3ViYXJyYXkocixyKzYpO3IrPTY7Y29uc3Qgbz1lW3IrK10sbD1lW3IrK10sYz1lW3IrK107eWMuZ3JhZGllbnRTdHJva2UobixpLHMsbyxsLGMpfWJyZWFrO2Nhc2UgMTQ6e2lmKHQpe3IrPTY7Y29uc3QgdD1lW3IrK107cis9dCxyKz04LHljLmZpbGwoKTticmVha315Yy50aGlja25lc3M9ZVtyKytdLHljLmNhcHM9ZVtyKytdLHljLmpvaW50cz1lW3IrK10seWMubWl0ZXJMaW1pdD1lW3IrK107Y29uc3Qgbj1lW3IrK10saT1lW3IrK10sYT1lW3IrK10scz1uZXcgVWludDhBcnJheShlLnN1YmFycmF5KHIscithKSk7cis9YTtjb25zdCBvPWUuc3ViYXJyYXkocixyKzYpO3IrPTYseWMuYml0bWFwU3Ryb2tlKHMsbyxuLGksQm9vbGVhbihlW3IrK10pLEJvb2xlYW4oZVtyKytdKSl9fX0sQ2M9ZT0+e3N3aXRjaChlKXtjYXNlIDA6cmV0dXJuImNvcHkiO2Nhc2UgMTpyZXR1cm4iYWRkIjtjYXNlIDI6cmV0dXJuImFscGhhIjtjYXNlIDM6cmV0dXJuImRhcmtlbiI7Y2FzZSA0OnJldHVybiJkaWZmZXJlbmNlIjtjYXNlIDU6cmV0dXJuImVyYXNlIjtjYXNlIDY6cmV0dXJuImhhcmRsaWdodCI7Y2FzZSA3OnJldHVybiJpbnZlcnQiO2Nhc2UgODpyZXR1cm4ibGF5ZXIiO2Nhc2UgOTpyZXR1cm4ibGlnaHRlbiI7Y2FzZSAxMDpyZXR1cm4ibXVsdGlwbHkiO2Nhc2UgMTE6ZGVmYXVsdDpyZXR1cm4ibm9ybWFsIjtjYXNlIDEyOnJldHVybiJvdmVybGF5IjtjYXNlIDEzOnJldHVybiJzY3JlZW4iO2Nhc2UgMTQ6cmV0dXJuInN1YnRyYWN0In19LEVjPShlLHQpPT57Y29uc3Qgcj1lLnN1YmFycmF5KHQsdCs2KTt0Kz02O2NvbnN0IG49ZS5zdWJhcnJheSh0LHQrOCk7dCs9ODtjb25zdCBpPWUuc3ViYXJyYXkodCx0KzQpO3QrPTQ7Y29uc3QgYT1lW3QrK10scz1lW3QrK10sbz1lW3QrK10sbD1lW3QrK10sYz1Cb29sZWFuKGVbdCsrXSksdT1Cb29sZWFuKGVbdCsrXSksZj1Cb29sZWFuKGVbdCsrXSksZD1gJHtlW3QrK119YCxoPWVbdCsrXSxwPWVbdCsrXSxtPWVbdCsrXSxnPWAke2VbdCsrXX1gO2xldCBiO2lmKGVbdCsrXSl7aWYoYj15bi5nZXQoZCxgJHtofWApLCFiKXJldHVybiB0fWVsc2V7Y29uc3Qgcj1jP25ldyBGbG9hdDMyQXJyYXkoMjgpOm51bGw7ciYmKHIuc2V0KGUuc3ViYXJyYXkodCx0KzI0KSksdCs9MjQpLHljLnVzZUdyaWQocik7Y29uc3Qgbj1lW3QrK10saT1lLnN1YmFycmF5KHQsdCtuKTtpZihmJiYhYyl7Y29uc3QgZT1NYXRoLmNlaWwoTWF0aC5hYnMoby1hKSksdD1NYXRoLmNlaWwoTWF0aC5hYnMobC1zKSk7Yj15Yy5jcmVhdGVOb2RlKGUsdCkseW4uc2V0KGQsYCR7aH1gLGIpO2NvbnN0IHI9eWMuY3VycmVudEF0dGFjaG1lbnRPYmplY3Qsbj15Yy5hdGxhc0F0dGFjaG1lbnRPYmplY3Q7biYmeWMuYmluZChuKSx5Yy5yZXNldCgpLHljLmJlZ2luTm9kZVJlbmRlcmluZyhiKTtjb25zdCBjPW4/bi5oZWlnaHQtYi55LXQ6MDt5Yy5zZXRUcmFuc2Zvcm0oMSwwLDAsMSxiLngsYyksdT8oUmMoaSkseWMuZHJhd0ZpbGwoKSk6eWMuZHJhd1BpeGVscyhiLG5ldyBVaW50OEFycmF5KGkpKSx5Yy5lbmROb2RlUmVuZGVyaW5nKCksciYmeWMuYmluZChyKX1lbHNle2NvbnN0IGU9TWF0aC5jZWlsKE1hdGguYWJzKG8tYSkqcCksdD1NYXRoLmNlaWwoTWF0aC5hYnMobC1zKSptKTtiPXljLmNyZWF0ZU5vZGUoZSx0KSx5bi5zZXQoZCxgJHtofWAsYik7Y29uc3Qgbj15Yy5jdXJyZW50QXR0YWNobWVudE9iamVjdCxjPXljLmF0bGFzQXR0YWNobWVudE9iamVjdDtjJiZ5Yy5iaW5kKGMpLHljLnJlc2V0KCkseWMuYmVnaW5Ob2RlUmVuZGVyaW5nKGIpO2NvbnN0IHU9Yz9jLmhlaWdodC1iLnktdDowO3ljLnNldFRyYW5zZm9ybShwLDAsMCxtLC1hKnArYi54LC1zKm0rdSksciYmKHJbMjRdPWIueCxyWzI1XT11KSxSYyhpKSx5Yy5kcmF3RmlsbCgpLHljLmVuZE5vZGVSZW5kZXJpbmcoKSxuJiZ5Yy5iaW5kKG4pfXQrPW59Y29uc3QgeD1lW3QrK107aWYoQm9vbGVhbihlW3QrK10pKXtjb25zdCBhPUJvb2xlYW4oZVt0KytdKSxzPWUuc3ViYXJyYXkodCx0KzQpO3QrPTQ7Y29uc3Qgbz1lW3QrK10sbD1lLnN1YmFycmF5KHQsdCtvKSxjPU1hdGguY2VpbChNYXRoLmFicyhpWzJdLWlbMF0pKSx1PU1hdGguY2VpbChNYXRoLmFicyhpWzNdLWlbMV0pKTtyZXR1cm4geWMuYXBwbHlGaWx0ZXIoYixnLGEsYyx1LGYscixuLENjKHgpLHMsbCksdCs9b31pZih5Yy5nbG9iYWxBbHBoYT1NYXRoLm1pbihNYXRoLm1heCgwLG5bM10rbls3XS8yNTUpLDEpLHljLmltYWdlU21vb3RoaW5nRW5hYmxlZD0hMCx5Yy5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249Q2MoeCksZiYmIWMpeWMuc2V0VHJhbnNmb3JtKHJbMF0sclsxXSxyWzJdLHJbM10scls0XSxyWzVdKSx5Yy5kcmF3RGlzcGxheU9iamVjdChiLGlbMF0saVsxXSxpWzJdLGlbM10sbik7ZWxzZXtjb25zdCBlPU1hdGguYXRhbjIoclsxXSxyWzBdKSx0PU1hdGguYXRhbjIoLXJbMl0sclszXSk7aWYoZXx8dCl7Y29uc3Qgbj1hKnAsaT1zKm0sbz1NYXRoLmNvcyhlKSxsPU1hdGguc2luKGUpLGM9TWF0aC5jb3ModCksdT1NYXRoLnNpbih0KTt5Yy5zZXRUcmFuc2Zvcm0obyxsLC11LGMsbipvLWkqdStyWzRdLG4qbCtpKmMrcls1XSl9ZWxzZSB5Yy5zZXRUcmFuc2Zvcm0oMSwwLDAsMSxpWzBdLGlbMV0pO3ljLmRyYXdEaXNwbGF5T2JqZWN0KGIsaVswXSxpWzFdLGlbMl0saVszXSxuKX1yZXR1cm4gdH0sVWM9KGUsdCk9Pntjb25zdCByPWUuc3ViYXJyYXkodCx0KzYpO3QrPTYseWMucmVzZXQoKSx5Yy5zZXRUcmFuc2Zvcm0oclswXSxyWzFdLHJbMl0sclszXSxyWzRdLHJbNV0pO2NvbnN0IG49Qm9vbGVhbihlW3QrK10pP25ldyBGbG9hdDMyQXJyYXkoMjgpOm51bGw7eWMudXNlR3JpZChuKSxuJiYobi5zZXQoZS5zdWJhcnJheSh0LHQrMjQpKSx0Kz0yNCk7Y29uc3QgaT1lW3QrK10sYT1lLnN1YmFycmF5KHQsdCtpKTtyZXR1cm4gUmMoYSwhMCksdCs9aSx5Yy5jbGlwKCksdH0sJGM9KGUsdCxyKT0+e2NvbnN0IG49ZS53aWR0aFRhYmxlW3QubGluZV18fDAsaT10LnRleHRGb3JtYXQsYT1pLmxlZnRNYXJnaW58fDA7aWYoIXIud29yZFdyYXAmJm4+ci5yYXdXaWR0aClyZXR1cm4gTWF0aC5tYXgoMCxhKTtjb25zdCBzPWkucmlnaHRNYXJnaW58fDA7cmV0dXJuImNlbnRlciI9PT1pLmFsaWdufHwiY2VudGVyIj09PXIuYXV0b1NpemU/TWF0aC5tYXgoMCxyLnJhd1dpZHRoLzItYS1zLW4vMi0yKToicmlnaHQiPT09aS5hbGlnbnx8InJpZ2h0Ij09PXIuYXV0b1NpemU/TWF0aC5tYXgoMCxyLnJhd1dpZHRoLWEtbi1zLTQpOk1hdGgubWF4KDAsYSl9LEdjPWU9PntsZXQgdD0iIjtyZXR1cm4gZS5pdGFsaWMmJih0Kz0iaXRhbGljICIpLGUuYm9sZCYmKHQrPSJib2xkICIpLGAke3R9JHtlLnNpemV9cHggJyR7ZS5mb250fScsJ3NhbnMtc2VyaWYnYH0sa2M9bmV3IFRleHREZWNvZGVyLExjPShlLHQpPT57Y29uc3Qgcj1lLnN1YmFycmF5KHQsdCs2KTt0Kz02O2NvbnN0IG49ZS5zdWJhcnJheSh0LHQrOCk7dCs9ODtjb25zdCBpPWUuc3ViYXJyYXkodCx0KzQpO3QrPTQ7Y29uc3QgYT1lW3QrK10scz1lW3QrK10sbz1lW3QrK10sbD1lW3QrK10sYz1gJHtlW3QrK119YCx1PWVbdCsrXSxmPUJvb2xlYW4oZVt0KytdKSxkPWVbdCsrXSxoPWVbdCsrXSxwPWAke2VbdCsrXX1gO2xldCBtO2lmKGVbdCsrXSl7aWYobT15bi5nZXQoYyxgJHt1fWApLCFtKXJldHVybiB0fWVsc2V7Y29uc3Qgcj1NYXRoLmNlaWwoTWF0aC5hYnMoby1hKSpkKSxuPU1hdGguY2VpbChNYXRoLmFicyhsLXMpKmgpLGk9Qm9vbGVhbihlW3QrK10pO209aT95bi5nZXQoYyxgJHt1fWApOnljLmNyZWF0ZU5vZGUocixuKSxpfHx5bi5zZXQoYyxgJHt1fWAsbSk7Y29uc3QgZj1lW3QrK10scD1uZXcgVWludDhBcnJheShlLnN1YmFycmF5KHQsdCtmKSk7dCs9ZjtsZXQgZz0ibm9uZSI7c3dpdGNoKGVbdCsrXSl7Y2FzZSAwOmc9ImNlbnRlciI7YnJlYWs7Y2FzZSAxOmc9ImxlZnQiO2JyZWFrO2Nhc2UgMjpnPSJub25lIjticmVhaztjYXNlIDM6Zz0icmlnaHQifWNvbnN0IGI9e3dpZHRoOnIsaGVpZ2h0Om4sYXV0b1NpemU6ZyxzdG9wSW5kZXg6ZVt0KytdLHNjcm9sbFg6ZVt0KytdLHNjcm9sbFk6ZVt0KytdLHRleHRXaWR0aDplW3QrK10sdGV4dEhlaWdodDplW3QrK10scmF3V2lkdGg6ZVt0KytdLHJhd0hlaWdodDplW3QrK10sZm9jdXNJbmRleDplW3QrK10sc2VsZWN0SW5kZXg6ZVt0KytdLGZvY3VzVmlzaWJsZTpCb29sZWFuKGVbdCsrXSksdGhpY2tuZXNzOmVbdCsrXSx0aGlja25lc3NDb2xvcjplW3QrK10sd29yZFdyYXA6Qm9vbGVhbihlW3QrK10pLGJvcmRlcjpCb29sZWFuKGVbdCsrXSksYm9yZGVyQ29sb3I6ZVt0KytdLGJhY2tncm91bmQ6Qm9vbGVhbihlW3QrK10pLGJhY2tncm91bmRDb2xvcjplW3QrK10sZGVmYXVsdENvbG9yOmVbdCsrXSxkZWZhdWx0U2l6ZTplW3QrK119LHg9KChlLHQscixuKT0+e2NvbnN0IGk9bmV3IE9mZnNjcmVlbkNhbnZhcyh0LndpZHRoLHQuaGVpZ2h0KSxhPWkuZ2V0Q29udGV4dCgiMmQiKTtpZighYSlyZXR1cm4gaTtjb25zdCBzPU1hdGgubWluKDEsTWF0aC5tYXgocixuKSk7aWYodC5iYWNrZ3JvdW5kfHx0LmJvcmRlcil7aWYoYS5iZWdpblBhdGgoKSxhLm1vdmVUbygwLDApLGEubGluZVRvKHQud2lkdGgsMCksYS5saW5lVG8odC53aWR0aCx0LmhlaWdodCksYS5saW5lVG8oMCx0LmhlaWdodCksYS5saW5lVG8oMCwwKSx0LmJhY2tncm91bmQpe2NvbnN0IGU9QmModC5iYWNrZ3JvdW5kQ29sb3IpO2EuZmlsbFN0eWxlPWByZ2JhKCR7ZS5SfSwke2UuR30sJHtlLkJ9LCR7ZS5BfSlgLGEuZmlsbCgpfWlmKHQuYm9yZGVyKXtjb25zdCBlPUJjKHQuYm9yZGVyQ29sb3IpO2EubGluZVdpZHRoPXMsYS5zdHJva2VTdHlsZT1gcmdiYSgke2UuUn0sJHtlLkd9LCR7ZS5CfSwke2UuQX0pYCxhLnN0cm9rZSgpfX1pZighZSlyZXR1cm4gaTthLnNhdmUoKSxhLmJlZ2luUGF0aCgpLGEubW92ZVRvKDIsMiksYS5saW5lVG8odC53aWR0aC0yLDIpLGEubGluZVRvKHQud2lkdGgtMix0LmhlaWdodC0yKSxhLmxpbmVUbygyLHQuaGVpZ2h0LTIpLGEubGluZVRvKDIsMiksYS5jbGlwKCk7bGV0IG89MjtpZih0LnNjcm9sbFg+MCl7Y29uc3QgZT0odC50ZXh0V2lkdGgrNC10LnJhd1dpZHRoKS90LnJhd1dpZHRoO28rPS10LnNjcm9sbFgqZX1sZXQgbD0yO2lmKHQuc2Nyb2xsWT4wKXtjb25zdCBlPSh0LnRleHRIZWlnaHQrMi10LnJhd0hlaWdodCkvdC5yYXdIZWlnaHQ7bCs9LXQuc2Nyb2xsWSplfWlmKGEuc2V0VHJhbnNmb3JtKHIsMCwwLG4sbypyLGwqbiksYS5iZWdpblBhdGgoKSx0LnNlbGVjdEluZGV4Pi0xJiZ0LmZvY3VzSW5kZXg+LTEpe2NvbnN0IHI9ZS50ZXh0VGFibGUubGVuZ3RoLTE7bGV0IG49MCxpPTA7dC5mb2N1c0luZGV4PD10LnNlbGVjdEluZGV4PyhuPU1hdGgubWluKHQuZm9jdXNJbmRleCxyKSxpPU1hdGgubWluKHQuc2VsZWN0SW5kZXgscikpOihuPU1hdGgubWluKHQuc2VsZWN0SW5kZXgsciksaT1NYXRoLm1pbih0LmZvY3VzSW5kZXgtMSxyKSk7Y29uc3Qgcz1lLnRleHRUYWJsZVtuXSxvPWUubGluZVRhYmxlW3MubGluZV0sbD0kYyhlLG8sdCk7bGV0IGM9MDtpZihuJiYidGV4dCI9PT1zLm1vZGUpe2xldCB0PW47Zm9yKDt0Oyl7Y29uc3Qgcj1lLnRleHRUYWJsZVstLXRdO2lmKCJ0ZXh0IiE9PXIubW9kZSlicmVhaztjKz1yLnd9fWEuZmlsbFN0eWxlPSIjYjRkN2ZmIjtsZXQgdT0wO2ZvcihsZXQgdD1uO3Q8PWk7Kyt0KXtjb25zdCByPWUudGV4dFRhYmxlW3RdO2lmKCJ0ZXh0Ij09PXIubW9kZSYmKHUrPXIudyx0IT09aSkpY29udGludWU7bGV0IG49MDtjb25zdCBzPSJ0ZXh0Ij09PXIubW9kZT9yLmxpbmU6ci5saW5lLTE7Zm9yKGxldCB0PTA7dDxzOysrdCluKz1lLmhlaWdodFRhYmxlW3RdO2EuYmVnaW5QYXRoKCksYS5yZWN0KGMsbix1K2wsZS5oZWlnaHRUYWJsZVtzXSksYS5maWxsKCksYz0wLHU9MH19Y29uc3QgYz10LnJhd1dpZHRoO2xldCB1PTA7aWYodC5zY3JvbGxYPjApe2NvbnN0IGU9KHQudGV4dFdpZHRoLWMpL2M7dT10LnNjcm9sbFgqZX1jb25zdCBmPWMrdSxkPXQucmF3SGVpZ2h0O2xldCBoPTA7aWYodC5zY3JvbGxZPjApe2NvbnN0IGU9KHQudGV4dEhlaWdodC1kKS9kO2g9dC5zY3JvbGxZKmV9Y29uc3QgcD1kK2g7bGV0IG09MCxnPTAsYj0wLHg9MCx2PSExLHk9LTE7Zm9yKGxldCByPTA7cjxlLnRleHRUYWJsZS5sZW5ndGg7KytyKXtjb25zdCBuPWUudGV4dFRhYmxlW3JdO2lmKCFuKWNvbnRpbnVlO2lmKCgidGV4dCI9PT1uLm1vZGV8fCJicmVhayI9PT1uLm1vZGUpJiYoeSsrLHQuc3RvcEluZGV4Pi0xJiZ5PnQuc3RvcEluZGV4KSlicmVhaztpZih2JiYidGV4dCI9PT1uLm1vZGUpY29udGludWU7Y29uc3QgaT1uLnRleHRGb3JtYXQ7aWYoIm5vbmUiPT09dC5hdXRvU2l6ZSl7aWYoZz5wKWJyZWFrO2lmKCJ0ZXh0Ij09PW4ubW9kZSYmKHU+bStuLnd8fG0+Zikpe20rPW4udztjb250aW51ZX19Y29uc3Qgbz1CYyhpLmNvbG9yfHwwKTtpZihhLmZpbGxTdHlsZT1gcmdiYSgke28uUn0sJHtvLkd9LCR7by5CfSwke28uQX0pYCx0LmZvY3VzVmlzaWJsZSYmdC5mb2N1c0luZGV4PT09cil7Y29uc3QgdD1tK2IrLjE7bGV0IHI9bi5saW5lLGk9bi55LHM9ZS5hc2NlbnRUYWJsZVtyXTsidGV4dCIhPT1uLm1vZGUmJihpPSJicmVhayI9PT1uLm1vZGU/bi5oOmUuYXNjZW50VGFibGVbci0xXSxyPjA/KHI9bi5saW5lLTEscz1lLmFzY2VudFRhYmxlW3JdKTpzPW4uaCkscj4wJiYwPT09ZS5hc2NlbnRUYWJsZVtyXSYmcisrO2ZvcihsZXQgdD0wO3Q8cjsrK3Qpcys9ZS5oZWlnaHRUYWJsZVt0XTthLnN0cm9rZVN0eWxlPWByZ2JhKCR7by5SfSwke28uR30sJHtvLkJ9LCR7by5BfSlgLGEuYmVnaW5QYXRoKCksYS5tb3ZlVG8odCxzKSxhLmxpbmVUbyh0LHMtaSksYS5zdHJva2UoKX1pZih0LnRoaWNrbmVzcyl7Y29uc3QgZT1CYyh0LnRoaWNrbmVzc0NvbG9yKTthLmxpbmVXaWR0aD10LnRoaWNrbmVzcyxhLnN0cm9rZVN0eWxlPWByZ2JhKCR7ZS5SfSwke2UuR30sJHtlLkJ9LCR7ZS5BfSlgfWNvbnN0IGw9MHxuLmxpbmU7c3dpdGNoKG4ubW9kZSl7Y2FzZSJicmVhayI6Y2FzZSJ3cmFwIjppZihtPTAsbCYmKGcrPWUuaGVpZ2h0VGFibGVbbC0xXSksaD5nK2UuaGVpZ2h0VGFibGVbbF0pe3Y9ITA7Y29udGludWV9eD1lLmFzY2VudFRhYmxlW2xdLGI9JGMoZSxuLHQpLHY9ITE7YnJlYWs7Y2FzZSJ0ZXh0Ijp7YS5iZWdpblBhdGgoKSxhLmZvbnQ9R2MoaSk7Y29uc3QgZT1tK2Iscj1nK3g7aWYoaS51bmRlcmxpbmUpe2NvbnN0IHQ9QmMoaS5jb2xvcnx8MCk7YS5saW5lV2lkdGg9cyxhLnN0cm9rZVN0eWxlPWByZ2JhKCR7dC5SfSwke3QuR30sJHt0LkJ9LCR7dC5BfSlgLGEuYmVnaW5QYXRoKCksYS5tb3ZlVG8oZSxyKzIpLGEubGluZVRvKGUrbi53LHIrMiksYS5zdHJva2UoKX10LnRoaWNrbmVzcyYmYS5zdHJva2VUZXh0KG4udGV4dCxlLHIpLGEuZmlsbFRleHQobi50ZXh0LGUsciksbSs9bi53fX19aWYodC5mb2N1c1Zpc2libGUmJnQuZm9jdXNJbmRleD49ZS50ZXh0VGFibGUubGVuZ3RoKXtjb25zdCByPWUudGV4dFRhYmxlW3QuZm9jdXNJbmRleC0xXTtpZihyKXtjb25zdCBlPUJjKHIudGV4dEZvcm1hdC5jb2xvcnx8MCk7YS5zdHJva2VTdHlsZT1gcmdiYSgke2UuUn0sJHtlLkd9LCR7ZS5CfSwke2UuQX0pYDtjb25zdCB0PW0rYisuMSxuPWcreDthLmJlZ2luUGF0aCgpLCJ0ZXh0Ij09PXIubW9kZT9hLm1vdmVUbyh0LG4tci55KTphLm1vdmVUbyh0LG4rci5oKSxhLmxpbmVUbyh0LG4pLGEuc3Ryb2tlKCl9fXJldHVybiBhLnJlc3RvcmUoKSxpfSkoSlNPTi5wYXJzZShrYy5kZWNvZGUocCkpLGIsZCxoKSx2PXljLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0LHk9eWMuYXRsYXNBdHRhY2htZW50T2JqZWN0O3kmJnljLmJpbmQoeSkseWMucmVzZXQoKSx5Yy5iZWdpbk5vZGVSZW5kZXJpbmcobSk7Y29uc3QgXz15P3kuaGVpZ2h0LW0ueS1uOjA7eWMuc2V0VHJhbnNmb3JtKDEsMCwwLDEsbS54LF8pLHljLmRyYXdFbGVtZW50KG0seCkseWMuZW5kTm9kZVJlbmRlcmluZygpLHYmJnljLmJpbmQodil9Y29uc3QgZz1lW3QrK107aWYoQm9vbGVhbihlW3QrK10pKXtjb25zdCBhPUJvb2xlYW4oZVt0KytdKSxzPWUuc3ViYXJyYXkodCx0KzQpO3QrPTQ7Y29uc3Qgbz1lW3QrK10sbD1lLnN1YmFycmF5KHQsdCtvKSxjPU1hdGguY2VpbChNYXRoLmFicyhpWzJdLWlbMF0pKSx1PU1hdGguY2VpbChNYXRoLmFicyhpWzNdLWlbMV0pKTtyZXR1cm4geWMuYXBwbHlGaWx0ZXIobSxwLEJvb2xlYW4oTWF0aC5tYXgoK2YsK2EpKSxjLHUsITEscixuLENjKGcpLHMsbCksdCs9b315Yy5nbG9iYWxBbHBoYT1NYXRoLm1pbihNYXRoLm1heCgwLG5bM10rbls3XS8yNTUpLDEpLHljLmltYWdlU21vb3RoaW5nRW5hYmxlZD0hMCx5Yy5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249Q2MoZyk7Y29uc3QgYj1NYXRoLmF0YW4yKHJbMV0sclswXSkseD1NYXRoLmF0YW4yKC1yWzJdLHJbM10pO2lmKGJ8fHgpe2NvbnN0IGU9YSpkLHQ9cypoLG49TWF0aC5jb3MoYiksaT1NYXRoLnNpbihiKSxvPU1hdGguY29zKHgpLGw9TWF0aC5zaW4oeCk7eWMuc2V0VHJhbnNmb3JtKG4saSwtbCxvLGUqbi10Kmwrcls0XSxlKmkrdCpvK3JbNV0pfWVsc2UgeWMuc2V0VHJhbnNmb3JtKDEsMCwwLDEsaVswXSxpWzFdKTtyZXR1cm4geWMuZHJhd0Rpc3BsYXlPYmplY3QobSxpWzBdLGlbMV0saVsyXSxpWzNdLG4pLHR9LEljPShlLHQscik9Pntjb25zdCBuPWUuc3ViYXJyYXkodCx0KzYpO3QrPTY7Y29uc3QgaT1lLnN1YmFycmF5KHQsdCs4KTt0Kz04O2NvbnN0IGE9ZS5zdWJhcnJheSh0LHQrNCk7dCs9NDtjb25zdCBzPWVbdCsrXSxvPWVbdCsrXSxsPWVbdCsrXSxjPWVbdCsrXSx1PWAke2VbdCsrXX1gLGY9Qm9vbGVhbihlW3QrK10pLGQ9YCR7ZVt0KytdfWA7bGV0IGg7aWYoZVt0KytdKXtpZihoPXluLmdldCh1LCIwIiksIWgpcmV0dXJuIHR9ZWxzZXtjb25zdCBuPU1hdGguYWJzKGwtcyksaT1NYXRoLmFicyhjLW8pLGE9Qm9vbGVhbihlW3QrK10pO2lmKGg9YT95bi5nZXQodSwiMCIpOnljLmNyZWF0ZU5vZGUobixpKSxhfHx5bi5zZXQodSwiMCIsaCksciYmci5sZW5ndGgpe2NvbnN0IGU9eWMuY3VycmVudEF0dGFjaG1lbnRPYmplY3QsdD15Yy5hdGxhc0F0dGFjaG1lbnRPYmplY3Q7dCYmeWMuYmluZCh0KSx5Yy5yZXNldCgpLHljLmJlZ2luTm9kZVJlbmRlcmluZyhoKTtjb25zdCBuPXQ/dC5oZWlnaHQtaC55LWk6MDt5Yy5zZXRUcmFuc2Zvcm0oMSwwLDAsMSxoLngsbik7Y29uc3QgYT1yLnNoaWZ0KCk7eWMuZHJhd0VsZW1lbnQoaCxhLCEwKSx5Yy5lbmROb2RlUmVuZGVyaW5nKCksZSYmeWMuYmluZChlKX19Y29uc3QgcD1lW3QrK107aWYoQm9vbGVhbihlW3QrK10pKXtjb25zdCByPUJvb2xlYW4oZVt0KytdKSxzPWUuc3ViYXJyYXkodCx0KzQpO3QrPTQ7Y29uc3Qgbz1lW3QrK10sbD1lLnN1YmFycmF5KHQsdCtvKSxjPU1hdGguY2VpbChNYXRoLmFicyhhWzJdLWFbMF0pKSx1PU1hdGguY2VpbChNYXRoLmFicyhhWzNdLWFbMV0pKTtyZXR1cm4geWMuYXBwbHlGaWx0ZXIoaCxkLEJvb2xlYW4oTWF0aC5tYXgoK2YsK3IpKSxjLHUsITAsbixpLENjKHApLHMsbCksdCs9b31yZXR1cm4geWMuZ2xvYmFsQWxwaGE9TWF0aC5taW4oTWF0aC5tYXgoMCxpWzNdK2lbN10vMjU1KSwxKSx5Yy5pbWFnZVNtb290aGluZ0VuYWJsZWQ9ITAseWMuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPUNjKHApLHljLnNldFRyYW5zZm9ybShuWzBdLG5bMV0sblsyXSxuWzNdLG5bNF0sbls1XSkseWMuZHJhd0Rpc3BsYXlPYmplY3QoaCxhWzBdLGFbMV0sYVsyXSxhWzNdLGkpLHR9LFZjPShlLHQpPT57Y29uc3Qgcj1lW3QrK107Zm9yKGxldCBuPTA7bjxyOysrbil7c3dpdGNoKGVbdCsrXSl7Y2FzZSAwOnQ9VmMoZSx0KTticmVhaztjYXNlIDE6dD1VYyhlLHQpfX1yZXR1cm4gdH0semM9KGUsdCxyKT0+e2xldCBuPTAsaT0hMDtjb25zdCBhPUNjKGVbdCsrXSkscz1Cb29sZWFuKGVbdCsrXSk7bGV0IG89MCxsPTAsYz0hMSx1PSIiLGY9IiIsZD1udWxsLGg9bnVsbCxwPW51bGwsbT1udWxsO2lmKHMpaWYobz1lW3QrK10sbD1lW3QrK10sYz1Cb29sZWFuKGVbdCsrXSksYyl7Y29uc3Qgcj1Cb29sZWFuKGVbdCsrXSk7aWYodT1gJHtlW3QrK119YCxmPWAke2VbdCsrXX1gLHIpcmV0dXJuIGQ9ZS5zdWJhcnJheSh0LHQrNCksdCs9NCxwPWUuc3ViYXJyYXkodCx0KzYpLHQrPTYsbT1lLnN1YmFycmF5KHQsdCs4KSx0Kz04LHljLmNvbnRhaW5lckRyYXdDYWNoZWRGaWx0ZXIoYSxwLG0sZCx1LGYpLHQ7ZD1lLnN1YmFycmF5KHQsdCs0KSx0Kz00LHA9ZS5zdWJhcnJheSh0LHQrNiksdCs9NixtPWUuc3ViYXJyYXkodCx0KzgpLHQrPTg7Y29uc3Qgbj1lW3QrK107aD1lLnN1YmFycmF5KHQsdCtuKSx0Kz1ufWVsc2UgcD1lLnN1YmFycmF5KHQsdCs2KSx0Kz02LG09ZS5zdWJhcnJheSh0LHQrOCksdCs9ODtzJiZ5Yy5jb250YWluZXJCZWdpbkxheWVyKG8sbCk7Y29uc3QgZz1Cb29sZWFuKGVbdCsrXSk7aWYoZyl7eWMuZHJhd0FycmF5c0luc3RhbmNlZCgpLHljLnNhdmUoKSx5Yy5iZWdpbk1hc2soKSx5Yy5zZXRNYXNrQm91bmRzKGVbdCsrXSxlW3QrK10sZVt0KytdLGVbdCsrXSk7c3dpdGNoKGVbdCsrXSl7Y2FzZSAwOnQ9VmMoZSx0KTticmVhaztjYXNlIDE6dD1VYyhlLHQpfXljLmVuZE1hc2soKX1jb25zdCBiPWVbdCsrXTtmb3IobGV0IGE9MDtiPmE7YSsrKXtjb25zdCBhPWVbdCsrXSxzPWVbdCsrXTtpZihuJiZhPm4mJihpJiYoeWMucmVzdG9yZSgpLHljLmxlYXZlTWFzaygpKSxuPTAsaT0hMCksIWkpY29udGludWU7aWYocyl7aWYobj1zLGk9Qm9vbGVhbihlW3QrK10pLCFpKWNvbnRpbnVlO3ljLmRyYXdBcnJheXNJbnN0YW5jZWQoKSx5Yy5zYXZlKCkseWMuYmVnaW5NYXNrKCkseWMuc2V0TWFza0JvdW5kcyhlW3QrK10sZVt0KytdLGVbdCsrXSxlW3QrK10pO3N3aXRjaChlW3QrK10pe2Nhc2UgMDp0PVZjKGUsdCk7YnJlYWs7Y2FzZSAxOnQ9VWMoZSx0KX15Yy5lbmRNYXNrKCk7Y29udGludWV9aWYoIWVbdCsrXSljb250aW51ZTtzd2l0Y2goZVt0KytdKXtjYXNlIDA6dD16YyhlLHQscik7YnJlYWs7Y2FzZSAxOnQ9RWMoZSx0KTticmVhaztjYXNlIDI6dD1MYyhlLHQpO2JyZWFrO2Nhc2UgMzp0PUljKGUsdCxyKX19cmV0dXJuKG58fGcpJiYoeWMucmVzdG9yZSgpLHljLmxlYXZlTWFzaygpKSxzJiZ5Yy5jb250YWluZXJFbmRMYXllcihhLHAsbSxjLGQsaCx1LGYpLHR9O2xldCBqYz0tMTtjb25zdCBEYz0oZSx0KT0+e1NjJiYod2Mud2lkdGg9TWMsd2MuaGVpZ2h0PVBjLFNjPSExKSx5Yy5jbGVhclRyYW5zZmVyQm91bmRzKCk7bGV0IHI9MDtjb25zdCBuPWVbcisrXTtmb3IoamMhPT1uJiYoamM9biwtMT09PWpjP3ljLnVwZGF0ZUJhY2tncm91bmRDb2xvcigwLDAsMCwwKTp5Yy51cGRhdGVCYWNrZ3JvdW5kQ29sb3IoKGpjPj4xNiYyNTUpLzI1NSwoamM+PjgmMjU1KS8yNTUsKDI1NSZqYykvMjU1LDEpKSx5Yy5yZXNldCgpLHljLnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCkseWMuZmlsbEJhY2tncm91bmRDb2xvcigpO2UubGVuZ3RoPnI7KXtpZighZVtyKytdKWNvbnRpbnVlO2NvbnN0IG49ZVtyKytdO3N3aXRjaChuKXtjYXNlIDA6cj16YyhlLHIsdCk7YnJlYWs7Y2FzZSAxOnI9RWMoZSxyKTticmVhaztjYXNlIDI6cj1MYyhlLHIpO2JyZWFrO2Nhc2UgMzpyPUljKGUscix0KTticmVhaztkZWZhdWx0OmNvbnNvbGUuZXJyb3IoInVua25vd24gdHlwZSIsbil9fXljLmRyYXdBcnJheXNJbnN0YW5jZWQoKSx5Yy50cmFuc2Zlck1haW5DYW52YXMoKX0sTmM9ZT0+e2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7Kyt0KXtjb25zdCByPWAke2VbdF19YDtpZigheW4uaGFzKHIpKWNvbnRpbnVlO2NvbnN0IG49eW4uZ2V0QnlJZChyKTtmb3IoY29uc3QgZSBvZiBuLnZhbHVlcygpKXljLnJlbW92ZU5vZGUoZSk7eW4ucmVtb3ZlQnlJZChyKX19LFdjPWFzeW5jKGUsdCxyLG49MCxpPTAsYSk9Pnt5Yy5jbGVhclRyYW5zZmVyQm91bmRzKCk7bGV0IHM9MTt5Yy5yZXNldCgpLHljLnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCk7Y29uc3Qgbz15Yy4kY2xlYXJDb2xvclIsbD15Yy4kY2xlYXJDb2xvckcsYz15Yy4kY2xlYXJDb2xvckIsdT15Yy4kY2xlYXJDb2xvckE7Zm9yKHljLnVwZGF0ZUJhY2tncm91bmRDb2xvcigobj4+MTYmMjU1KS8yNTUsKG4+PjgmMjU1KS8yNTUsKDI1NSZuKS8yNTUsaSkseWMuZmlsbEJhY2tncm91bmRDb2xvcigpO2UubGVuZ3RoPnM7KXtpZighZVtzKytdKWNvbnRpbnVlO2NvbnN0IHQ9ZVtzKytdO3N3aXRjaCh0KXtjYXNlIDA6cz16YyhlLHMsYSk7YnJlYWs7Y2FzZSAxOnM9RWMoZSxzKTticmVhaztjYXNlIDI6cz1MYyhlLHMpO2JyZWFrO2Nhc2UgMzpzPUljKGUscyxhKTticmVhaztkZWZhdWx0OmNvbnNvbGUuZXJyb3IoInVua25vd24gdHlwZSIsdCl9fXljLmRyYXdBcnJheXNJbnN0YW5jZWQoKTtjb25zdCBmPWF3YWl0IHljLmNyZWF0ZUltYWdlQml0bWFwKHQscik7cmV0dXJuIHljLnVwZGF0ZUJhY2tncm91bmRDb2xvcihvLGwsYyx1KSxmfTtjb25zdCBxYz1uZXcgY2xhc3N7Y29uc3RydWN0b3IoKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywic3RhdGUiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywicXVldWUiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSx0aGlzLnN0YXRlPSJkZWFjdGl2YXRlIix0aGlzLnF1ZXVlPVtdfWFzeW5jIGV4ZWN1dGUoKXtmb3IodGhpcy5zdGF0ZT0iYWN0aXZlIjt0aGlzLnF1ZXVlLmxlbmd0aDspe2NvbnN0IGU9dGhpcy5xdWV1ZS5zaGlmdCgpO2lmKGUpc3dpdGNoKGUuY29tbWFuZCl7Y2FzZSJyZW5kZXIiOkRjKGUuYnVmZmVyLnN1YmFycmF5KDAsZS5sZW5ndGgpLGUuaW1hZ2VCaXRtYXBzKSxnbG9iYWxUaGlzLnBvc3RNZXNzYWdlKHttZXNzYWdlOiJyZW5kZXIiLGJ1ZmZlcjplLmJ1ZmZlcn0sW2UuYnVmZmVyLmJ1ZmZlcl0pO2JyZWFrO2Nhc2UicmVzaXplIjpBYyhlLmJ1ZmZlclswXSxlLmJ1ZmZlclsxXSxCb29sZWFuKGUuYnVmZmVyWzJdKSk7YnJlYWs7Y2FzZSJpbml0aWFsaXplIjphd2FpdCBPYyhlLmNhbnZhcyxlLmRldmljZVBpeGVsUmF0aW8pO2JyZWFrO2Nhc2UicmVtb3ZlQ2FjaGUiOk5jKGUuYnVmZmVyKTticmVhaztjYXNlImNhY2hlQ2xlYXIiOnluLnJlc2V0KCk7YnJlYWs7Y2FzZSJjYXB0dXJlIjp7Y29uc3QgdD1hd2FpdCBXYyhlLmJ1ZmZlci5zdWJhcnJheSgwLGUubGVuZ3RoKSxlLndpZHRoLGUuaGVpZ2h0LGUuYmdDb2xvcixlLmJnQWxwaGEsZS5pbWFnZUJpdG1hcHMpO2dsb2JhbFRoaXMucG9zdE1lc3NhZ2Uoe21lc3NhZ2U6ImNhcHR1cmUiLGJ1ZmZlcjplLmJ1ZmZlcixpbWFnZUJpdG1hcDp0fSxbZS5idWZmZXIuYnVmZmVyLHRdKX19fXRoaXMuc3RhdGU9ImRlYWN0aXZhdGUifX07c2VsZi5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixhc3luYyBlPT57cWMucXVldWUucHVzaChlLmRhdGEpLCJkZWFjdGl2YXRlIj09PXFjLnN0YXRlJiZhd2FpdCBxYy5leGVjdXRlKCl9KTtyZXR1cm57fX0oKTsK';
|