@next2d/core 2.13.0 → 3.0.0

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.
@@ -1 +1 @@
1
- export const workerInlineUrl = 'data:application/javascript;base64,dmFyIFJlbmRlcmVyV29ya2VyPWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2xldCBlPTIwNDg7bGV0IHQ9NDtsZXQgbjtsZXQgcjtjb25zdCBhPShlLHQsbixyPW51bGwpPT57Y29uc3QgYT0rZTtyZXR1cm4gaXNOYU4oYSkmJm51bGwhPT1yP3I6TWF0aC5taW4oTWF0aC5tYXgodCxpc05hTihhKT8wOmEpLG4pfSxzPVtdLG89KC4uLmUpPT57Y29uc3QgdD1zLnBvcCgpfHxbXTtyZXR1cm4gZS5sZW5ndGgmJnQucHVzaCguLi5lKSx0fSxpPShlPW51bGwpPT57ZSYmKGUubGVuZ3RoJiYoZS5sZW5ndGg9MCkscy5wdXNoKGUpKX0sYz1lPT4oZS0tLGV8PWU+PjEsZXw9ZT4+MixlfD1lPj40LGV8PWU+PjgsZXw9ZT4+MTYsKytlKSxsPVtdLHU9KGU9MCx0PTAsbj0wLHI9MCk9Pntjb25zdCBhPWwucG9wKCl8fG5ldyBGbG9hdDMyQXJyYXkoNCk7cmV0dXJuIGFbMF09ZSxhWzFdPXQsYVsyXT1uLGFbM109cixhfSxoPWU9PntsLnB1c2goZSl9LGI9W10sZD0oZT0wLHQ9MCxuPTAscj0wLGE9MCxzPTAsbz0wLGk9MCxjPTApPT57Y29uc3QgbD1iLnBvcCgpfHxuZXcgRmxvYXQzMkFycmF5KDkpO3JldHVybiBsWzBdPWUsbFsxXT10LGxbMl09bixsWzNdPXIsbFs0XT1hLGxbNV09cyxsWzZdPW8sbFs3XT1pLGxbOF09YyxsfSxmPVtdLG09KGU9MCx0PTAsbj0wLHI9MCxhPTAscz0wKT0+e2NvbnN0IG89Zi5wb3AoKXx8bmV3IEZsb2F0MzJBcnJheSg2KTtyZXR1cm4gb1swXT1lLG9bMV09dCxvWzJdPW4sb1szXT1yLG9bNF09YSxvWzVdPXMsb30sdj1lPT57Zi5wdXNoKGUpfSxfPWU9Pntjb25zdCB0PTEvKGVbMF0qZVs0XS1lWzNdKmVbMV0pLG49ZVszXSplWzddLWVbNF0qZVs2XSxyPWVbMV0qZVs2XS1lWzBdKmVbN107cmV0dXJuIGQoZVs0XSp0LDAtZVsxXSp0LDAsMC1lWzNdKnQsZVswXSp0LDAsbip0LHIqdCwxKX07bGV0IHA9MCxnPTA7Y29uc3QgeD0oKT0+cCxFPSgpPT5nO2xldCB5PTE7Y29uc3QgQT0oKT0+eSxUPW8oKSxSPW8oKSxNPShlPSExKT0+e2NvbnN0IHQ9ZT80OjEwO3JldHVybiBULmxlbmd0aDx0JiYoVC5sZW5ndGg9MCksVC5sZW5ndGgmJihSLnB1c2goVC5zbGljZSgwKSksVC5sZW5ndGg9MCksUn0sdz0oZSx0LG4pPT57VC5wdXNoKGUsdCxuKX0sRj0oZSx0KT0+e2NvbnN0IG49VC5sZW5ndGgscj0rVFtuLTNdLGE9K1Rbbi0yXTtyZXR1cm4gZT09PXImJnQ9PT1hfSwkPShlLHQpPT57VC5sZW5ndGg/RihlLHQpfHwoKChlPSExKT0+e2NvbnN0IHQ9ZT80OjEwO1QubGVuZ3RoPHR8fFIucHVzaChULnNsaWNlKDApKSxULmxlbmd0aD0wfSkoKSx3KGUsdCwhMSkpOncoZSx0LCExKX0sTz0oZSx0LG4scik9PntULmxlbmd0aHx8JCgwLDApLEYobixyKXx8KHcoZSx0LCEwKSx3KG4sciwhMSkpfSxTPW5ldyBGbG9hdDMyQXJyYXkoMzIpLGs9KGUsdCxuLHIsYSxzLG8saSxjLGwpPT57Y29uc3QgdT0uMTI1KihlKzMqKG4rYSkrbyksaD0uMTI1Kih0KzMqKHIrcykraSksYj0uMTI1KihvK2Etbi1lKSxkPS4xMjUqKGkrcy1yLXQpO1NbY109ZSxTW2MrMV09dCxTW2MrMl09LjUqKGUrbiksU1tjKzNdPS41Kih0K3IpLFNbYys0XT11LWIsU1tjKzVdPWgtZCxTW2MrNl09dSxTW2MrN109aCxTW2xdPXUsU1tsKzFdPWgsU1tsKzJdPXUrYixTW2wrM109aCtkLFNbbCs0XT0uNSooYStvKSxTW2wrNV09LjUqKHMraSksU1tsKzZdPW8sU1tsKzddPWl9LEM9KGUsdCxuLHIsYSxzLG8saSxjKT0+e2NvbnN0IGw9LjEyNSooZSszKihuK2EpK28pLHU9LjEyNSoodCszKihyK3MpK2kpO1NbY109LjI1KmUrLjc1Km4sU1tjKzFdPS4yNSp0Ky43NSpyLFNbYysyXT1sLFNbYyszXT11LFNbYys0XT0uNzUqYSsuMjUqbyxTW2MrNV09Ljc1KnMrLjI1KmksU1tjKzZdPW8sU1tjKzddPWl9LFA9KGUsdCxuLHIsYSxzKT0+e2lmKFQubGVuZ3RofHwkKDAsMCksRihhLHMpKXJldHVybjtjb25zdCBvPVQubGVuZ3RoLGk9KChlLHQsbixyLGEscyxvLGkpPT4oayhlLHQsbixyLGEscyxvLGksMCwxNiksayhTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sMCw4KSxrKFNbMTZdLFNbMTddLFNbMThdLFNbMTldLFNbMjBdLFNbMjFdLFNbMjJdLFNbMjNdLDE2LDI0KSxDKFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSwwKSxDKFNbOF0sU1s5XSxTWzEwXSxTWzExXSxTWzEyXSxTWzEzXSxTWzE0XSxTWzE1XSw4KSxDKFNbMTZdLFNbMTddLFNbMThdLFNbMTldLFNbMjBdLFNbMjFdLFNbMjJdLFNbMjNdLDE2KSxDKFNbMjRdLFNbMjVdLFNbMjZdLFNbMjddLFNbMjhdLFNbMjldLFNbMzBdLFNbMzFdLDI0KSxTKSkoK1Rbby0zXSwrVFtvLTJdLGUsdCxuLHIsYSxzKTtmb3IobGV0IGU9MDszMj5lOylPKGlbZSsrXSxpW2UrK10saVtlKytdLGlbZSsrXSl9LEI9W10sST1lPT57bGV0IHQ9LTEsbj1CLmxlbmd0aDtmb3IoO01hdGguYWJzKG4tdCk+MTspe2NvbnN0IHI9TWF0aC5mbG9vcigobit0KS8yKTtlPD1CW3JdLmFyZWE/bj1yOnQ9cn1yZXR1cm4gbn0sTD1lPT57bi5kZWxldGVUZXh0dXJlKGUucmVzb3VyY2UpfSxVPVtdLE49W107bGV0IEQ7bGV0IGo9bnVsbDtsZXQgej1udWxsO2xldCBYPW51bGw7Y29uc3QgVz1lPT57WD1lfSxHPSgpPT5YO2xldCBWPSExO2NvbnN0IFk9ZT0+e1Y9ZX0scT0oKT0+VjtsZXQgSz1udWxsLEg9bnVsbCxaPW51bGwsUT1udWxsO2NvbnN0IEo9KCk9PkgsZWU9KGUsdD0hMCk9Pnt2YXIgcjtlLm1zYWE/KChlPT57aWYoQi5pbmRleE9mKGUpPi0xKXJldHVybjtjb25zdCB0PUkoZS5hcmVhKTtlLmRpcnR5PSEwLEIuc3BsaWNlKHQsMCxlKX0pKGUuY29sb3IpLGUuY29sb3I9bnVsbCxlLnN0ZW5jaWw9bnVsbCk6KHQmJkwoZS50ZXh0dXJlKSxlLnRleHR1cmU9bnVsbCxyPWUuc3RlbmNpbCxVLmluZGV4T2Yocik+LTF8fChVLmxlbmd0aD4xMD9uLmRlbGV0ZVJlbmRlcmJ1ZmZlcihyLnJlc291cmNlKTooci5kaXJ0eT0hMCxVLnB1c2gocikpKSxlLnN0ZW5jaWw9bnVsbCksTi5wdXNoKGUpfTtsZXQgdGU9MDtjb25zdCBuZT1lPT57aWYoIUIubGVuZ3RoKXJldHVybigoKT0+e2NvbnN0IGU9e2lkOjAscmVzb3VyY2U6bi5jcmVhdGVSZW5kZXJidWZmZXIoKSx3aWR0aDowLGhlaWdodDowLGFyZWE6MCxkaXJ0eTohMX07cmV0dXJue3Jlc291cmNlOm4uY3JlYXRlUmVuZGVyYnVmZmVyKCksc3RlbmNpbDplLHdpZHRoOjAsaGVpZ2h0OjAsYXJlYTowLGRpcnR5OiExfX0pKCk7Y29uc3QgdD1JKGUpO2lmKHQ8Qi5sZW5ndGgpe2NvbnN0IGU9Qlt0XTtyZXR1cm4gQi5zcGxpY2UodCwxKSxlfWNvbnN0IHI9Qi5zaGlmdCgpO2lmKCFyKXRocm93IG5ldyBFcnJvcigidGhlIGNvbG9yIGJ1ZmZlciBpcyB2b2lkLiIpO3JldHVybiByfTtsZXQgcmU9MDtjb25zdCBhZT0oZSx0KT0+e2lmKCFVLmxlbmd0aClyZXR1cm57aWQ6cmUrKyxyZXNvdXJjZTpuLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLHdpZHRoOjAsaGVpZ2h0OjAsYXJlYTowLGRpcnR5OiExfTtmb3IobGV0IG49MDtuPFUubGVuZ3RoOysrbil7Y29uc3Qgcj1VW25dO2lmKHIud2lkdGg9PT1lJiZyLmhlaWdodD09PXQpcmV0dXJuIFUuc3BsaWNlKG4sMSkscn1yZXR1cm4gVS5zaGlmdCgpfTtsZXQgc2U9MDtjb25zdCBvZT0oZSx0KT0+KHtpZDpzZSsrLHJlc291cmNlOm4uY3JlYXRlVGV4dHVyZSgpLHdpZHRoOmUsaGVpZ2h0OnQsYXJlYTplKnQsc21vb3RoOiExfSk7bGV0IGllPS0xO2NvbnN0IGNlPWU9PntpZT1lfSxsZT1bbnVsbCxudWxsLG51bGxdLHVlPShlLHQscj0hMSk9Pntjb25zdCBhPW9lKGUsdCk7cmV0dXJuKChlLHQ9ITEpPT57aWUhPT1uLlRFWFRVUkUwJiYoY2Uobi5URVhUVVJFMCksbi5hY3RpdmVUZXh0dXJlKG4uVEVYVFVSRTApKSxsZVswXT1lLG4uYmluZFRleHR1cmUobi5URVhUVVJFXzJELGUucmVzb3VyY2UpLG4udGV4UGFyYW1ldGVyaShuLlRFWFRVUkVfMkQsbi5URVhUVVJFX1dSQVBfUyxuLkNMQU1QX1RPX0VER0UpLG4udGV4UGFyYW1ldGVyaShuLlRFWFRVUkVfMkQsbi5URVhUVVJFX1dSQVBfVCxuLkNMQU1QX1RPX0VER0UpLG4udGV4UGFyYW1ldGVyaShuLlRFWFRVUkVfMkQsbi5URVhUVVJFX01JTl9GSUxURVIsdD9uLkxJTkVBUjpuLk5FQVJFU1QpLG4udGV4UGFyYW1ldGVyaShuLlRFWFRVUkVfMkQsbi5URVhUVVJFX01BR19GSUxURVIsdD9uLkxJTkVBUjpuLk5FQVJFU1QpLG4udGV4U3RvcmFnZTJEKG4uVEVYVFVSRV8yRCwxLG4uUkdCQTgsZS53aWR0aCxlLmhlaWdodCl9KShhLHIpLGF9LGhlPShlLHIsYT0hMSk9Pntjb25zdCBzPU4ubGVuZ3RoP04uc2hpZnQoKTp7aWQ6dGUrKyx3aWR0aDowLGhlaWdodDowLGNsaXBMZXZlbDowLG1zYWE6ITEsbWFzazohMSxjb2xvcjpudWxsLHRleHR1cmU6bnVsbCxzdGVuY2lsOm51bGx9O3JldHVybiBzLndpZHRoPWUscy5oZWlnaHQ9cixhPyhzLm1zYWE9ITAscy50ZXh0dXJlPW51bGwscy5jb2xvcj0oKGUscik9PntlPU1hdGgubWF4KDI1NixjKGUpKSxyPU1hdGgubWF4KDI1NixjKHIpKTtjb25zdCBhPW5lKGUqcik7cmV0dXJuKGEud2lkdGg8ZXx8YS5oZWlnaHQ8cikmJihlPU1hdGgubWF4KGUsYS53aWR0aCkscj1NYXRoLm1heChyLGEuaGVpZ2h0KSxhLndpZHRoPWUsYS5oZWlnaHQ9cixhLmFyZWE9ZSpyLG4uYmluZFJlbmRlcmJ1ZmZlcihuLlJFTkRFUkJVRkZFUixhLnJlc291cmNlKSxuLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZShuLlJFTkRFUkJVRkZFUix0LG4uUkdCQTgsZSxyKSxuLmJpbmRSZW5kZXJidWZmZXIobi5SRU5ERVJCVUZGRVIsYS5zdGVuY2lsLnJlc291cmNlKSxuLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZShuLlJFTkRFUkJVRkZFUix0LG4uU1RFTkNJTF9JTkRFWDgsZSxyKSksYS5kaXJ0eT0hMCxhfSkoZSxyKSxzLnN0ZW5jaWw9cy5jb2xvci5zdGVuY2lsKToocy5tc2FhPSExLHMudGV4dHVyZT11ZShlLHIpLHMuY29sb3I9bnVsbCxzLnN0ZW5jaWw9KChlLHQpPT57Y29uc3Qgcj1hZShlLHQpO3JldHVybiByLndpZHRoPT09ZSYmci5oZWlnaHQ9PT10fHwoci53aWR0aD1lLHIuaGVpZ2h0PXQsci5hcmVhPWUqdCxyLmRpcnR5PSExLG4uYmluZFJlbmRlcmJ1ZmZlcihuLlJFTkRFUkJVRkZFUixyLnJlc291cmNlKSxuLnJlbmRlcmJ1ZmZlclN0b3JhZ2Uobi5SRU5ERVJCVUZGRVIsbi5TVEVOQ0lMX0lOREVYOCxlLHQpKSxyfSkoZSxyKSkscy5tYXNrPSExLHMuY2xpcExldmVsPTAsc30sYmU9TnVtYmVyLk1BWF9WQUxVRSxkZT0tTnVtYmVyLk1BWF9WQUxVRTtsZXQgZmU9MDtjb25zdCBtZT1lPT57ZmU9ZX0sdmU9KCk9PmZlLF9lPVtdLHBlPSgpPT57dmFyIHQ7cmV0dXJuIGZlIGluIF9lfHwodD1oZShlLGUsITApLF9lW2ZlXT10KSxfZVtmZV19LGdlPVtdO2xldCB4ZT1udWxsO2NvbnN0IEVlPSgpPT4oeGV8fCh4ZT0oKCk9Pntjb25zdCB0PW9lKGUsZSk7cmV0dXJuIG4uYWN0aXZlVGV4dHVyZShuLlRFWFRVUkUzKSxuLmJpbmRUZXh0dXJlKG4uVEVYVFVSRV8yRCx0LnJlc291cmNlKSxuLnRleFBhcmFtZXRlcmkobi5URVhUVVJFXzJELG4uVEVYVFVSRV9XUkFQX1Msbi5DTEFNUF9UT19FREdFKSxuLnRleFBhcmFtZXRlcmkobi5URVhUVVJFXzJELG4uVEVYVFVSRV9XUkFQX1Qsbi5DTEFNUF9UT19FREdFKSxuLnRleFBhcmFtZXRlcmkobi5URVhUVVJFXzJELG4uVEVYVFVSRV9NSU5fRklMVEVSLG4uTElORUFSKSxuLnRleFBhcmFtZXRlcmkobi5URVhUVVJFXzJELG4uVEVYVFVSRV9NQUdfRklMVEVSLG4uTkVBUkVTVCksbi50ZXhTdG9yYWdlMkQobi5URVhUVVJFXzJELDEsbi5SR0JBOCx0LndpZHRoLHQuaGVpZ2h0KSxuLmFjdGl2ZVRleHR1cmUoLTEhPT1pZT9pZTpuLlRFWFRVUkUwKSx0fSkoKSkseGUpLHllPVtdLEFlPWU9PihlIGluIHllfHwoeWVbZV09bmV3IEZsb2F0MzJBcnJheShbYmUsYmUsZGUsZGVdKSkseWVbZV0pLFRlPVtdLFJlPWU9PihlIGluIFRlfHwoVGVbZV09bmV3IEZsb2F0MzJBcnJheShbYmUsYmUsZGUsZGVdKSksVGVbZV0pO2xldCBNZT0wO2NvbnN0IHdlPWU9PntNZT1lfSxGZT0oKT0+TWUsJGU9KCk9PntnZS5sZW5ndGg9MCxtZSgwKTtjb25zdCBlPV9lO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKWVlKGVbdF0pO2UubGVuZ3RoPTB9LE9lPShlLHQscixhPSEwKT0+e2lmKGUuY2xlYXJBcnJheXNJbnN0YW5jZWQoKSxlLiRzdGFja0F0dGFjaG1lbnRPYmplY3QubGVuZ3RoKWZvcihsZXQgdD0wO3Q8ZS4kc3RhY2tBdHRhY2htZW50T2JqZWN0Lmxlbmd0aDsrK3Qpe2NvbnN0IG49ZS4kc3RhY2tBdHRhY2htZW50T2JqZWN0W3RdO24mJmVlKG4pfWVsc2UgZS4kbWFpbkF0dGFjaG1lbnRPYmplY3QmJmVlKGUuJG1haW5BdHRhY2htZW50T2JqZWN0KTthJiYkZSgpLFcobnVsbCkscSgpJiYoWSghMSksbi5iaW5kRnJhbWVidWZmZXIobi5GUkFNRUJVRkZFUixudWxsKSksZS4kbWFpbkF0dGFjaG1lbnRPYmplY3Q9aGUodCxyLCEwKSxlLmJpbmQoZS4kbWFpbkF0dGFjaG1lbnRPYmplY3QpfSxTZT0oZSx0LHI9bnVsbCxhPSExKT0+ey0xIT09aWUmJnQ9PT1pZXx8KGNlKHQpLG4uYWN0aXZlVGV4dHVyZSh0KSk7Y29uc3Qgcz1sZVtlXTtudWxsIT09cyYmbnVsbCE9PXImJnMuaWQ9PT1yLmlkfHxyPT09c3x8KGxlW2VdPXIsbi5iaW5kVGV4dHVyZShuLlRFWFRVUkVfMkQscj9yLnJlc291cmNlOm51bGwpLHImJnIuc21vb3RoIT09YSYmKHIuc21vb3RoPWEsbi50ZXhQYXJhbWV0ZXJpKG4uVEVYVFVSRV8yRCxuLlRFWFRVUkVfTUlOX0ZJTFRFUixhP24uTElORUFSOm4uTkVBUkVTVCksbi50ZXhQYXJhbWV0ZXJpKG4uVEVYVFVSRV8yRCxuLlRFWFRVUkVfTUFHX0ZJTFRFUixhP24uTElORUFSOm4uTkVBUkVTVCkpKX0sa2U9KGUsdD0hMSk9PntTZSgyLG4uVEVYVFVSRTIsbnVsbCksU2UoMSxuLlRFWFRVUkUxLG51bGwpLFNlKDAsbi5URVhUVVJFMCxlLHQpfSxDZT0oKT0+e2NvbnN0IGU9ci5jdXJyZW50QXR0YWNobWVudE9iamVjdDtpZighZSlyZXR1cm47Y29uc3QgdD1lLmNsaXBMZXZlbDtsZXQgYT0wO2ZvcihsZXQgZT0wO2U8dDsrK2UpYXw9KDE8PHQtZSktMTtuLnN0ZW5jaWxNYXNrKDI1NSksbi5zdGVuY2lsRnVuYyhuLkVRVUFMLDI1NSZhLGEpLG4uc3RlbmNpbE9wKG4uS0VFUCxuLktFRVAsbi5LRUVQKSxuLmNvbG9yTWFzayghMCwhMCwhMCwhMCksbi5kaXNhYmxlKG4uU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFKSxuLmRpc2FibGUobi5TQ0lTU09SX1RFU1QpfTtsZXQgUGU9ITE7Y29uc3QgQmU9ZT0+e1BlPWV9LEllPSgpPT5QZSxMZT1uZXcgTWFwLFVlPW5ldyBNYXAsTmU9KGUsdCk9Pntjb25zdCByPUcoKTtpZihyJiZ0LmlkPT09ci5pZClyZXR1cm47dmFyIGEsczsoZT0+e1coZSkscSgpfHwoWSghMCksbi5iaW5kRnJhbWVidWZmZXIobi5GUkFNRUJVRkZFUixEKSksZS5tc2FhPyhuLmJpbmRSZW5kZXJidWZmZXIobi5SRU5ERVJCVUZGRVIsZS5jb2xvci5yZXNvdXJjZSksbi5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcihuLkZSQU1FQlVGRkVSLG4uQ09MT1JfQVRUQUNITUVOVDAsbi5SRU5ERVJCVUZGRVIsZS5jb2xvci5yZXNvdXJjZSkpOihrZShlLnRleHR1cmUpLG4uZnJhbWVidWZmZXJUZXh0dXJlMkQobi5GUkFNRUJVRkZFUixuLkNPTE9SX0FUVEFDSE1FTlQwLG4uVEVYVFVSRV8yRCxlLnRleHR1cmUucmVzb3VyY2UsMCkpLG4uYmluZFJlbmRlcmJ1ZmZlcihuLlJFTkRFUkJVRkZFUixlLnN0ZW5jaWwucmVzb3VyY2UpLG4uZnJhbWVidWZmZXJSZW5kZXJidWZmZXIobi5GUkFNRUJVRkZFUixuLlNURU5DSUxfQVRUQUNITUVOVCxuLlJFTkRFUkJVRkZFUixlLnN0ZW5jaWwucmVzb3VyY2UpfSkodCksciYmci53aWR0aD09PXQud2lkdGgmJnIuaGVpZ2h0PT09dC5oZWlnaHR8fChhPXQud2lkdGgscz10LmhlaWdodCxwPWEsZz1zLG4udmlld3BvcnQoMCwwLHQud2lkdGgsdC5oZWlnaHQpKTtjb25zdCBvPXQubXNhYT90LmNvbG9yOnQuc3RlbmNpbDt2YXIgaTtvLmRpcnR5JiYoby5kaXJ0eT0hMSxlLmNsZWFyUmVjdCgwLDAsdC53aWR0aCx0LmhlaWdodCkpLCEoaT10Lm1hc2spJiZJZSgpPyhCZSghMSksbi5kaXNhYmxlKG4uU1RFTkNJTF9URVNUKSxuLmRpc2FibGUobi5TQ0lTU09SX1RFU1QpKTppJiYhSWUoKSYmKEJlKCEwKSxuLmVuYWJsZShuLlNURU5DSUxfVEVTVCksQ2UoKSl9LERlPWU9PntpZighZS4kc3RhY2subGVuZ3RoKXJldHVybjtjb25zdCB0PWUuJHN0YWNrLnBvcCgpO3ZhciBuO2UuJG1hdHJpeFswXT10WzBdLGUuJG1hdHJpeFsxXT10WzFdLGUuJG1hdHJpeFszXT10WzNdLGUuJG1hdHJpeFs0XT10WzRdLGUuJG1hdHJpeFs2XT10WzZdLGUuJG1hdHJpeFs3XT10WzddLG49dCxiLnB1c2gobil9LGplPShlLHQsbixyLGEscyxvLGksYyxsLHUsaCxiKT0+e2NvbnN0IGQ9ZS5sZW5ndGgtNTtmb3IobGV0IGY9MztmPGQ7Zis9Myl7bGV0IGQ9MTcqbjtlW2YrMl0/KHRbZCsrXT1lW2YtM10sdFtkKytdPWVbZi0yXSx0W2QrK109MCx0W2QrK109MCx0W2QrK109bCx0W2QrK109dSx0W2QrK109aCx0W2QrK109Yix0W2QrK109cix0W2QrK109YSx0W2QrK109MCx0W2QrK109cyx0W2QrK109byx0W2QrK109MCx0W2QrK109aSx0W2QrK109Yyx0W2QrK109MCx0W2QrK109ZVtmXSx0W2QrK109ZVtmKzFdLHRbZCsrXT0uNSx0W2QrK109MCx0W2QrK109bCx0W2QrK109dSx0W2QrK109aCx0W2QrK109Yix0W2QrK109cix0W2QrK109YSx0W2QrK109MCx0W2QrK109cyx0W2QrK109byx0W2QrK109MCx0W2QrK109aSx0W2QrK109Yyx0W2QrK109MCx0W2QrK109ZVtmKzNdLHRbZCsrXT1lW2YrNF0sdFtkKytdPTEsdFtkKytdPTEsdFtkKytdPWwsdFtkKytdPXUsdFtkKytdPWgsdFtkKytdPWIsdFtkKytdPXIsdFtkKytdPWEsdFtkKytdPTAsdFtkKytdPXMsdFtkKytdPW8sdFtkKytdPTAsdFtkKytdPWksdFtkKytdPWMsdFtkKytdPTApOmVbZis1XT8odFtkKytdPWVbMF0sdFtkKytdPWVbMV0sdFtkKytdPS41LHRbZCsrXT0uNSx0W2QrK109bCx0W2QrK109dSx0W2QrK109aCx0W2QrK109Yix0W2QrK109cix0W2QrK109YSx0W2QrK109MCx0W2QrK109cyx0W2QrK109byx0W2QrK109MCx0W2QrK109aSx0W2QrK109Yyx0W2QrK109MCx0W2QrK109ZVtmXSx0W2QrK109ZVtmKzFdLHRbZCsrXT0uNSx0W2QrK109LjUsdFtkKytdPWwsdFtkKytdPXUsdFtkKytdPWgsdFtkKytdPWIsdFtkKytdPXIsdFtkKytdPWEsdFtkKytdPTAsdFtkKytdPXMsdFtkKytdPW8sdFtkKytdPTAsdFtkKytdPWksdFtkKytdPWMsdFtkKytdPTAsdFtkKytdPWVbZis2XSx0W2QrK109ZVtmKzddLHRbZCsrXT0uNSx0W2QrK109LjUsdFtkKytdPWwsdFtkKytdPXUsdFtkKytdPWgsdFtkKytdPWIsdFtkKytdPXIsdFtkKytdPWEsdFtkKytdPTAsdFtkKytdPXMsdFtkKytdPW8sdFtkKytdPTAsdFtkKytdPWksdFtkKytdPWMsdFtkKytdPTApOih0W2QrK109ZVswXSx0W2QrK109ZVsxXSx0W2QrK109LjUsdFtkKytdPS41LHRbZCsrXT1sLHRbZCsrXT11LHRbZCsrXT1oLHRbZCsrXT1iLHRbZCsrXT1yLHRbZCsrXT1hLHRbZCsrXT0wLHRbZCsrXT1zLHRbZCsrXT1vLHRbZCsrXT0wLHRbZCsrXT1pLHRbZCsrXT1jLHRbZCsrXT0wLHRbZCsrXT1lW2ZdLHRbZCsrXT1lW2YrMV0sdFtkKytdPS41LHRbZCsrXT0uNSx0W2QrK109bCx0W2QrK109dSx0W2QrK109aCx0W2QrK109Yix0W2QrK109cix0W2QrK109YSx0W2QrK109MCx0W2QrK109cyx0W2QrK109byx0W2QrK109MCx0W2QrK109aSx0W2QrK109Yyx0W2QrK109MCx0W2QrK109ZVtmKzNdLHRbZCsrXT1lW2YrNF0sdFtkKytdPS41LHRbZCsrXT0uNSx0W2QrK109bCx0W2QrK109dSx0W2QrK109aCx0W2QrK109Yix0W2QrK109cix0W2QrK109YSx0W2QrK109MCx0W2QrK109cyx0W2QrK109byx0W2QrK109MCx0W2QrK109aSx0W2QrK109Yyx0W2QrK109MCksbis9M31yZXR1cm4gbn0semU9KGUsdD0iZmlsbCIpPT57Y29uc3Qgbj0iZmlsbCI9PT10P3IuJGZpbGxTdHlsZTpyLiRzdHJva2VTdHlsZSxhPW5bMF0scz1uWzFdLG89blsyXSxpPW5bM10sYz1yLiRtYXRyaXgsbD14KCksdT1FKCksaD1jWzBdL2wsYj1jWzNdL2wsZD1jWzZdL2wsZj1jWzFdL3UsbT1jWzRdL3Usdj1jWzddL3U7bGV0IF89MDtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoOysrdClfKz01MSooZVt0XS5sZW5ndGgvMy0yKTtjb25zdCBwPW5ldyBGbG9hdDMyQXJyYXkoXyk7bGV0IGc9MDtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoOysrdClnPWplKGVbdF0scCxnLGgsZixiLG0sZCx2LGEscyxvLGkpO3JldHVybntidWZmZXI6cCxpbmRleENvdW50Omd9fTtsZXQgWGU9bmV3IEZsb2F0MzJBcnJheSgxMjgpLFdlPTA7Y29uc3QgR2U9ZT0+e2NvbnN0IHQ9ZS5sZW5ndGgrV2U7aWYodD5YZS5sZW5ndGgpe2NvbnN0IHI9bmV3IEZsb2F0MzJBcnJheSgobj10LG4tLSxufD1uPj4xLG58PW4+PjIsbnw9bj4+NCxufD1uPj44LG58PW4+PjE2LCsrbikpO3Iuc2V0KFhlKSxyLnNldChlLFdlKSxYZT1yfWVsc2UgWGUuc2V0KGUsV2UpO3ZhciBuO1dlKz1lLmxlbmd0aH0sVmU9W10sWWU9W10scWU9KCk9PntZZS5sZW5ndGg9MCxXZT0wLFZlLmxlbmd0aD0wfSxLZT1bXSxIZT0oZSx0LG4pPT57Y29uc3Qgcj17eDp0LngtZS54LHk6dC55LWUueX0sYT0oKGUsdCxuKT0+e2NvbnN0IHI9TWF0aC5zcXJ0KGUqZSt0KnQpO3JldHVybnt4Oi10L3Iqbix5OmUvcipufX0pKHIueCxyLnksbikscz17eDplLngrYS54LHk6ZS55K2EueX0sbz17eDp0LngrYS54LHk6dC55K2EueX0saT17eDplLngtYS54LHk6ZS55LWEueX0sYz17eDp0LngtYS54LHk6dC55LWEueX07cmV0dXJuW3MueCxzLnksITEsby54LG8ueSwhMSxjLngsYy55LCExLGkueCxpLnksITEscy54LHMueSwhMV19LFplPShlLHQsbik9Pih7eDplLngrKHQueC1lLngpKm4seTplLnkrKHQueS1lLnkpKm59KSxRZT0oZSx0LG4scj0uNSk9Pntjb25zdCBhPVplKGUsdCxyKSxzPVplKHQsbixyKSxvPVplKGEscyxyKTtyZXR1cm5bW2UsYSxvXSxbbyxzLG5dXX0sSmU9KGUsdCxuLHIpPT4oe3g6KDEtZSkqKjIqdC54KzIqKDEtZSkqZSpuLngrZSoqMipyLngseTooMS1lKSoqMip0LnkrMiooMS1lKSplKm4ueStlKioyKnIueX0pLGV0PShlLHQsbixyKT0+KHt4OjIqKDEtZSkqKG4ueC10LngpKzIqZSooci54LW4ueCkseToyKigxLWUpKihuLnktdC55KSsyKmUqKHIueS1uLnkpfSksdHQ9ZT0+e2NvbnN0IHQ9TWF0aC5zcXJ0KGUueCplLngrZS55KmUueSk7cmV0dXJuIDA9PT10P3t4OjAseTowfTp7eDplLngvdCx5OmUueS90fX0sbnQ9KGUsdCxuLHIpPT57Y29uc3QgYT1bMCwuNSwxXSxzPVtdO2ZvcihsZXQgbz0wO288YS5sZW5ndGg7KytvKXtjb25zdCBpPWFbb10sYz1KZShpLGUsdCxuKSxsPWV0KGksZSx0LG4pLHU9dHQoe3g6LWwueSx5OmwueH0pO3MucHVzaCh7eDpjLngrdS54KnIseTpjLnkrdS55KnJ9KX1yZXR1cm4gc30scnQ9KGUsdCxuLHIpPT57Y29uc3QgYT0oKGUsdCxuLHI9NCk9PntsZXQgYT1bW2UsdCxuXV07Zm9yKGxldCBlPTA7ZTxyOysrZSl7Y29uc3QgZT1bXTtmb3IobGV0IHQ9MDt0PGEubGVuZ3RoOysrdCl7Y29uc3Qgbj1hW3RdO2lmKCFuKWNvbnRpbnVlO2NvbnN0IHI9UWUoblswXSxuWzFdLG5bMl0sLjUpO2UucHVzaChyWzBdLHJbMV0pfWE9ZX1yZXR1cm4gYX0pKGUsdCxuLDUpLHM9W10sbz1bXTtmb3IobGV0IGU9MDtlPGEubGVuZ3RoOysrZSl7Y29uc3RbdCxuLGldPWFbZV07cy5wdXNoKG50KHQsbixpLCtyKSksby5wdXNoKG50KHQsbixpLC1yKSl9Y29uc3QgaT1zWzBdWzBdLGM9W2kueCxpLnksITFdO2ZvcihsZXQgZT0wO2U8cy5sZW5ndGg7KytlKXtjb25zdCB0PXNbZV07Yy5wdXNoKHRbMV0ueCx0WzFdLnksITAsdFsyXS54LHRbMl0ueSwhMSl9Y29uc3QgbD1bLi4ub10ucmV2ZXJzZSgpO2ZvcihsZXQgZT0wO2U8bC5sZW5ndGg7KytlKXtjb25zdFt0LG4scl09bFtlXTtsW2VdPVtyLG4sdF19Y29uc3QgdT1sWzBdWzBdO2MucHVzaCh1LngsdS55LCExKTtmb3IobGV0IGU9MDtlPGwubGVuZ3RoOysrZSl7Y29uc3QgdD1sW2VdO2MucHVzaCh0WzFdLngsdFsxXS55LCEwLHRbMl0ueCx0WzJdLnksITEpfXJldHVybiBjfSxhdD0oZSx0LG4scik9Pntjb25zdCBhPVtdO2ZvcihsZXQgcz0wO3M8ci5sZW5ndGg7cys9Myl7aWYocltzKzJdKWNvbnRpbnVlO2NvbnN0IG89cltzXSxpPXJbcysxXTtNYXRoLnNxcnQoTWF0aC5wb3coby1lLDIpK01hdGgucG93KGktdCwyKSk9PT1uJiZhLnB1c2gobyxpKX1yZXR1cm4gYX0sc3Q9bmV3IE9mZnNjcmVlbkNhbnZhcygxLDEpLmdldENvbnRleHQoIjJkIiksb3Q9KGUsdCk9PntzdC5iZWdpblBhdGgoKSxzdC5tb3ZlVG8odFswXSx0WzFdKTtmb3IobGV0IGU9MztlPHQubGVuZ3RoO2UrPTMpdFtlKzJdPyhzdC5xdWFkcmF0aWNDdXJ2ZVRvKHRbZV0sdFtlKzFdLHRbZSszXSx0W2UrNF0pLGUrPTMpOnN0LmxpbmVUbyh0W2VdLHRbZSsxXSk7c3QuY2xvc2VQYXRoKCk7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kz0yKXtjb25zdCBuPWVbdF0scj1lW3QrMV07aWYoIXN0LmlzUG9pbnRJblBhdGgobixyKSlyZXR1cm5bbixyXX1yZXR1cm4gbnVsbH0saXQ9KGUsdCxuLHIsYT0hMSk9Pntjb25zdCBzPWE/MDpyLmxlbmd0aC0xLG89YT9yLmxlbmd0aC0xOnIubGVuZ3RoLTIsaT1hdChlLHQsbixyW3NdKSxjPWF0KGUsdCxuLHJbb10pLGw9b3QoaSxyW29dKTtpZighbClyZXR1cm47Y29uc3QgdT1vdChjLHJbc10pO2lmKCF1KXJldHVybjtjb25zdCBoPU1hdGguYXRhbjIobFsxXS10LGxbMF0tZSk7bGV0IGI9TWF0aC5hdGFuMih1WzFdLXQsdVswXS1lKS1oO2I+TWF0aC5QST9iLT0yKk1hdGguUEk6YjwtTWF0aC5QSSYmKGIrPTIqTWF0aC5QSSk7Y29uc3QgZD1iLzgsZj1bZSx0LCExXTtmb3IobGV0IHI9MDtyPD04O3IrKyl7Y29uc3QgYT1oK3IqZCxzPWUrbipNYXRoLmNvcyhhKSxvPXQrbipNYXRoLnNpbihhKTtmLnB1c2gocyxvLCExKX1yLnNwbGljZSgtMSwwLGYpfSxjdD0oZSx0LG4scixhPSExKT0+e2NvbnN0IHM9YT8wOnIubGVuZ3RoLTEsbz1hP3IubGVuZ3RoLTE6ci5sZW5ndGgtMixpPWF0KGUsdCxuLHJbc10pLGM9YXQoZSx0LG4scltvXSk7aWYoaVswXT09PWNbMF0mJmlbMV09PT1jWzFdfHxpWzBdPT09Y1syXSYmaVsxXT09PWNbM10pcmV0dXJuO2NvbnN0IGw9b3QoaSxyW29dKTtpZighbClyZXR1cm47Y29uc3QgdT1vdChjLHJbc10pO3UmJnIuc3BsaWNlKC0xLDAsW2UsdCwhMSxsWzBdLGxbMV0sITEsdVswXSx1WzFdLCExLGUsdCwhMV0pfSxsdD0oZSx0LG4scixhLHM9ITEpPT57Y29uc3Qgbz1zPzA6YS5sZW5ndGgtMSxpPXM/YS5sZW5ndGgtMTphLmxlbmd0aC0yLGM9YXQoZS54LGUueSxyLGFbb10pLGw9YXQoZS54LGUueSxyLGFbaV0pO2lmKGNbMF09PT1sWzBdJiZjWzFdPT09bFsxXXx8Y1swXT09PWxbMl0mJmNbMV09PT1sWzNdKXJldHVybjtjb25zdCB1PW90KGMsYVtpXSk7aWYoIXUpcmV0dXJuO2NvbnN0IGg9b3QobCxhW29dKTtpZighaClyZXR1cm47Y29uc3QgYj10LngtZS54LGQ9dC55LWUueSxmPU1hdGguaHlwb3QoYixkKSxtPXt4OmIvZix5OmQvZn0sdj1uLngtZS54LF89bi55LWUueSxwPU1hdGguaHlwb3QodixfKSxnPXt4OnYvcCx5Ol8vcH0seD1tLngsRT1tLnkseT1nLngsQT1nLnksVD14KkEtRSp5OzA9PT1UJiZhLnNwbGljZSgtMSwwLFtlLngsZS55LCExLHVbMF0sdVsxXSwhMSxoWzBdLGhbMV0sITFdKTtjb25zdCBSPSgoaFswXS11WzBdKSpBLShoWzFdLXVbMV0pKnkpL1QsTT11WzBdK1IqeCx3PXVbMV0rUipFO2Euc3BsaWNlKC0xLDAsW2UueCxlLnksITEsdVswXSx1WzFdLCExLE0sdywhMSxlLngsZS55LCExLGhbMF0saFsxXSwhMSxNLHcsITFdKX0sdXQ9KGUsdCk9Pntjb25zdCBuPXt4OmVbMF0seTplWzFdfSxhPXt4OjAseTowfSxzPXt4OjAseTowfSxvPXt4OjAseTowfSxpPVtdO2ZvcihsZXQgYz0zO2M8ZS5sZW5ndGg7Yys9Myl7Y29uc3QgbD1lW2NdLHU9ZVtjKzFdO2lmKGVbYysyXSlhLng9bCxhLnk9dTtlbHNle2lmKHMueD1sLHMueT11LGVbYy0xXT9pLnB1c2gocnQobixhLHMsdCkpOmkucHVzaChIZShuLHMsdCkpLGkubGVuZ3RoPjEpc3dpdGNoKHIuam9pbnRzKXtjYXNlIDA6Y3Qobi54LG4ueSx0LGkpO2JyZWFrO2Nhc2UgMTpvLng9ZVtjLTZdLG8ueT1lW2MtNV0sbHQobixzLG8sdCxpKTticmVhaztjYXNlIDI6aXQobi54LG4ueSx0LGkpfW4ueD1zLngsbi55PXMueX19aWYoZVswXT09PWVbZS5sZW5ndGgtM10mJmVbMV09PT1lW2UubGVuZ3RoLTJdKXN3aXRjaChyLmpvaW50cyl7Y2FzZSAwOmN0KG4ueCxuLnksdCxpLCEwKTticmVhaztjYXNlIDE6bi54PWVbMF0sbi55PWVbMV0scy54PWVbM10scy55PWVbNF0sby54PWVbZS5sZW5ndGgtNl0sby55PWVbZS5sZW5ndGgtNV0sbHQobixzLG8sdCxpLCEwKTticmVhaztjYXNlIDI6aXQobi54LG4ueSx0LGksITApfWVsc2Ugc3dpdGNoKHIuY2Fwcyl7Y2FzZSAxOigoZSx0LG4pPT57Zm9yKGxldCByPTA7cjwyOysrcil7bGV0IGE9MCxzPTAsbz0wLGk9MDswPT09cj8oYT1lWzBdLHM9ZVsxXSxvPWVbM10saT1lWzRdKTooYT1lW2UubGVuZ3RoLTNdLHM9ZVtlLmxlbmd0aC0yXSxvPWVbZS5sZW5ndGgtNl0saT1lW2UubGVuZ3RoLTVdKTtjb25zdCBjPW8tYSxsPWktcyx1PU1hdGguYXRhbjIobCxjKSxoPXUrTWF0aC5QSS8yLGI9dS1NYXRoLlBJLzIsZD0xNixmPShiLWgpL2QsbT1bXTtmb3IobGV0IGU9MDtlPD1kO2UrKyl7Y29uc3Qgbj1iK2YqZSxyPWErdCpNYXRoLmNvcyhuKSxvPXMrdCpNYXRoLnNpbihuKTttLnB1c2gocixvLCExKX0wPT09cj9uLnVuc2hpZnQobSk6bi5wdXNoKG0pfX0pKGUsdCxpKTticmVhaztjYXNlIDI6KChlLHQsbik9Pntmb3IobGV0IHI9MDtyPDI7KytyKXtsZXQgYT0wLHM9MCxvPTAsaT0wOzA9PT1yPyhhPWVbMF0scz1lWzFdLG89ZVszXSxpPWVbNF0pOihhPWVbZS5sZW5ndGgtM10scz1lW2UubGVuZ3RoLTJdLG89ZVtlLmxlbmd0aC02XSxpPWVbZS5sZW5ndGgtNV0pO2NvbnN0IGM9LShvLWEpLGw9LShpLXMpLHU9TWF0aC5zcXJ0KGMqYytsKmwpO2lmKDA9PT11KWNvbnRpbnVlO2NvbnN0IGg9Yy91LGI9bC91LGQ9YSt0KmgsZj1zK3QqYixtPS1iLHY9W2QrdCpoK3QqbSxmK3QqYit0KmgsITEsZCt0KmgtdCptLGYrdCpiLXQqaCwhMSxkLXQqaC10Km0sZi10KmItdCpoLCExLGQrdCpoK3QqbSxmK3QqYit0KmgsITEsZC10KmgtdCptLGYtdCpiLXQqaCwhMSxkLXQqaCt0Km0sZi10KmIrdCpoLCExXTswPT09cj9uLnVuc2hpZnQodik6bi5wdXNoKHYpfX0pKGUsdCxpKX1yZXR1cm4gaX0saHQ9ZT0+e2NvbnN0IHQ9ci50aGlja25lc3MvMixuPVtdO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7KytyKXtjb25zdCBhPXV0KGVbcl0sdCk7bi5wdXNoKC4uLmEpfXJldHVybiB6ZShuLCJzdHJva2UiKX0sYnQ9bmV3IE1hcCxkdD0oKT0+e2J0LmNsZWFyKCl9LGZ0PSgpPT4oe2lkOiJmdW5jdGlvbiI9PXR5cGVvZiBjcnlwdG8/LnJhbmRvbVVVSUQ/Y3J5cHRvLnJhbmRvbVVVSUQoKToieHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Ii5yZXBsYWNlKC9beHldL2csZT0+e2NvbnN0IHQ9MTYqTWF0aC5yYW5kb20oKXwwO3JldHVybigieCI9PT1lP3Q6MyZ0fDgpLnRvU3RyaW5nKDE2KX0pLHJlc291cmNlOm4uY3JlYXRlVmVydGV4QXJyYXkoKSx2ZXJ0ZXhCdWZmZXI6bi5jcmVhdGVCdWZmZXIoKSx2ZXJ0ZXhMZW5ndGg6MH0pO2xldCBtdDtjb25zdCB2dD1lPT57bXQmJm10LmlkPT09ZS5pZHx8KG10PWUsbi5iaW5kVmVydGV4QXJyYXkoZS5yZXNvdXJjZSkpfSxfdD1bXSxwdD1uZXcgRmxvYXQzMkFycmF5KFswLDAsMCwxLDEsMCwxLDFdKTtsZXQgZ3Q7bGV0IHh0O2xldCBFdDtjb25zdCB5dD0oKT0+KEV0fHwoRXQ9KCgpPT57Y29uc3QgZT1mdCgpO3Z0KGUpLG4uYmluZEJ1ZmZlcihuLkFSUkFZX0JVRkZFUixlLnZlcnRleEJ1ZmZlcik7Y29uc3QgdD1uZXcgRmxvYXQzMkFycmF5KFswLDAsMSwwLDEsMSwwLDAsMSwxLDAsMV0pO3JldHVybiBuLmJ1ZmZlckRhdGEobi5BUlJBWV9CVUZGRVIsdCxuLlNUQVRJQ19EUkFXKSxuLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDApLG4udmVydGV4QXR0cmliUG9pbnRlcigwLDIsbi5GTE9BVCwhMSwwLDApLGV9KSgpKSxFdCksQXQ9KCk9Pntjb25zdCBlPSgoKT0+e2lmKF90Lmxlbmd0aClyZXR1cm4gX3QucG9wKCk7Y29uc3QgZT1mdCgpO3JldHVybiB2dChlKSxuLmJpbmRCdWZmZXIobi5BUlJBWV9CVUZGRVIsZS52ZXJ0ZXhCdWZmZXIpLG4uZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoMCksbi5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSgxKSxuLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDIpLG4uZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoMyksbi5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSg0KSxuLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDUpLG4udmVydGV4QXR0cmliUG9pbnRlcigwLDIsbi5GTE9BVCwhMSw2OCwwKSxuLnZlcnRleEF0dHJpYlBvaW50ZXIoMSwyLG4uRkxPQVQsITEsNjgsOCksbi52ZXJ0ZXhBdHRyaWJQb2ludGVyKDIsNCxuLkZMT0FULCExLDY4LDE2KSxuLnZlcnRleEF0dHJpYlBvaW50ZXIoMywzLG4uRkxPQVQsITEsNjgsMzIpLG4udmVydGV4QXR0cmliUG9pbnRlcig0LDMsbi5GTE9BVCwhMSw2OCw0NCksbi52ZXJ0ZXhBdHRyaWJQb2ludGVyKDUsMyxuLkZMT0FULCExLDY4LDU2KSxlfSkoKTt2dChlKTtjb25zdCB0PVhlLHI9V2U7cmV0dXJuIG4uYmluZEJ1ZmZlcihuLkFSUkFZX0JVRkZFUixlLnZlcnRleEJ1ZmZlciksZS52ZXJ0ZXhMZW5ndGg8dC5sZW5ndGgmJihlLnZlcnRleExlbmd0aD1jKHQubGVuZ3RoKSxuLmJ1ZmZlckRhdGEobi5BUlJBWV9CVUZGRVIsNCplLnZlcnRleExlbmd0aCxuLkRZTkFNSUNfRFJBVykpLG4uYnVmZmVyU3ViRGF0YShuLkFSUkFZX0JVRkZFUiwwLHQuc3ViYXJyYXkoMCxyKSksZX0sVHQ9ZT0+e190LmluZGV4T2YoZSk+LTF8fF90LnB1c2goZSl9O2xldCBSdD0wO2xldCBNdD0tMTtjbGFzcyB3dHtjb25zdHJ1Y3RvcihlLHQscj0hMSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIl8kcHJvZ3JhbU9iamVjdCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJfJHVuaWZvcm1NYXAiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSx0aGlzLl8kcHJvZ3JhbU9iamVjdD0oKGUsdCk9Pntjb25zdCByPW4uY3JlYXRlUHJvZ3JhbSgpLGE9bi5jcmVhdGVTaGFkZXIobi5WRVJURVhfU0hBREVSKTtuLnNoYWRlclNvdXJjZShhLGUpLG4uY29tcGlsZVNoYWRlcihhKTtjb25zdCBzPW4uY3JlYXRlU2hhZGVyKG4uRlJBR01FTlRfU0hBREVSKTtyZXR1cm4gbi5zaGFkZXJTb3VyY2Uocyx0KSxuLmNvbXBpbGVTaGFkZXIocyksbi5hdHRhY2hTaGFkZXIocixhKSxuLmF0dGFjaFNoYWRlcihyLHMpLG4ubGlua1Byb2dyYW0ociksbi5kZXRhY2hTaGFkZXIocixhKSxuLmRldGFjaFNoYWRlcihyLHMpLG4uZGVsZXRlU2hhZGVyKGEpLG4uZGVsZXRlU2hhZGVyKHMpLHtpZDpSdCsrLHJlc291cmNlOnJ9fSkoZSx0KSx0aGlzLl8kdW5pZm9ybU1hcD1uZXcgTWFwLCgoZSx0LHI9ITEpPT57Y29uc3QgYT1uLmdldFByb2dyYW1QYXJhbWV0ZXIoZSxuLkFDVElWRV9VTklGT1JNUyk7Zm9yKGxldCBzPTA7czxhOysrcyl7Y29uc3QgYT1uLmdldEFjdGl2ZVVuaWZvcm0oZSxzKSxvPWEubmFtZS5lbmRzV2l0aCgiWzBdIik/YS5uYW1lLnNsaWNlKDAsLTMpOmEubmFtZSxpPW4uZ2V0VW5pZm9ybUxvY2F0aW9uKGUsbyk7aWYoYS50eXBlPT09bi5TQU1QTEVSXzJEJiYxPT09YS5zaXplJiYhciljb250aW51ZTtjb25zdCBjPXt9O3N3aXRjaChhLnR5cGUpe2Nhc2Ugbi5GTE9BVF9WRUM0OmMubWV0aG9kPW4udW5pZm9ybTRmdi5iaW5kKG4saSksYy5hcnJheT1uZXcgRmxvYXQzMkFycmF5KDQqYS5zaXplKSxjLmFzc2lnbj0tMTticmVhaztjYXNlIG4uSU5UX1ZFQzQ6Yy5tZXRob2Q9bi51bmlmb3JtNGl2LmJpbmQobixpKSxjLmFycmF5PW5ldyBJbnQzMkFycmF5KDQqYS5zaXplKSxjLmFzc2lnbj0tMTticmVhaztjYXNlIG4uU0FNUExFUl8yRDpjLm1ldGhvZD1yP24udW5pZm9ybTFpLmJpbmQobixpLDMpOm4udW5pZm9ybTFpdi5iaW5kKG4saSksYy5hcnJheT1uZXcgSW50MzJBcnJheShhLnNpemUpLGMuYXNzaWduPTE7YnJlYWs7Y2FzZSBuLkZMT0FUOmNhc2Ugbi5GTE9BVF9WRUMyOmNhc2Ugbi5GTE9BVF9WRUMzOmNhc2Ugbi5GTE9BVF9NQVQyOmNhc2Ugbi5GTE9BVF9NQVQzOmNhc2Ugbi5GTE9BVF9NQVQ0OmNhc2Ugbi5JTlQ6Y2FzZSBuLklOVF9WRUMyOmNhc2Ugbi5JTlRfVkVDMzpkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVXNlIGdsLkZMT0FUX1ZFQzQgb3IgZ2wuSU5UX1ZFQzQgaW5zdGVhZCIpfXQuc2V0KG8sYyl9fSkodGhpcy5fJHByb2dyYW1PYmplY3QucmVzb3VyY2UsdGhpcy5fJHVuaWZvcm1NYXAscil9dXNlUHJvZ3JhbSgpe3ZhciBlO2U9dGhpcy5fJHByb2dyYW1PYmplY3QsTXQhPT1lLmlkJiYoTXQ9ZS5pZCxuLnVzZVByb2dyYW0oZS5yZXNvdXJjZSkpfWJpbmRVbmlmb3JtKCl7KGU9Pntmb3IoY29uc3QgdCBvZiBlLnZhbHVlcygpKXZvaWQgMCE9PXQubWV0aG9kJiZ2b2lkIDAhPT10LmFzc2lnbiYmKHQuYXNzaWduPDA/dC5tZXRob2QodC5hcnJheSk6dC5hc3NpZ24+MCYmKHQuYXNzaWduLS0sdC5tZXRob2QodC5hcnJheSkpKX0pKHRoaXMuXyR1bmlmb3JtTWFwKX1nZXQgaGlnaHAoKXtyZXR1cm4gdGhpcy5fJHVuaWZvcm1NYXAuZ2V0KCJ1X2hpZ2hwIikuYXJyYXl9Z2V0IG1lZGl1bXAoKXtyZXR1cm4gdGhpcy5fJHVuaWZvcm1NYXAuZ2V0KCJ1X21lZGl1bXAiKS5hcnJheX1nZXQgdGV4dHVyZXMoKXtyZXR1cm4gdGhpcy5fJHVuaWZvcm1NYXAuZ2V0KCJ1X3RleHR1cmVzIikuYXJyYXl9fWNvbnN0IEZ0PW5ldyBNYXAsJHQ9KGUsdCxuLHIpPT57Y29uc3QgYT1uPyJsYXlvdXQgKGxvY2F0aW9uID0gMSkgaW4gdmVjMiBhX2JlemllcjsiOiIiLHM9bj8ib3V0IHZlYzIgdl9iZXppZXI7Ijp0PyJvdXQgdmVjMiB2X3V2OyI6IiIsbz1uPyJ2X2JlemllciA9IGFfYmV6aWVyOyI6dD8iXG4gICAgbWF0MyB1dl9tYXRyaXggPSBtYXQzKFxuICAgICAgICB1X2hpZ2hwWzBdLnh5eixcbiAgICAgICAgdV9oaWdocFsxXS54eXosXG4gICAgICAgIHVfaGlnaHBbMl0ueHl6XG4gICAgKTtcbiAgICBtYXQzIGludmVyc2VfbWF0cml4ID0gbWF0MyhcbiAgICAgICAgdV9oaWdocFszXS54eXosXG4gICAgICAgIHVfaGlnaHBbNF0ueHl6LFxuICAgICAgICB2ZWMzKHVfaGlnaHBbMl0udywgdV9oaWdocFszXS53LCB1X2hpZ2hwWzRdLncpXG4gICAgKTtcbiAgICB2X3V2ID0gKGludmVyc2VfbWF0cml4ICogdXZfbWF0cml4ICogdmVjMyhhX3ZlcnRleCwgMS4wKSkueHk7IjoiIixpPXI/KGU9PmBcbnZlYzIgYXBwbHlNYXRyaXgoaW4gdmVjMiB2ZXJ0ZXgpIHtcbiAgICBtYXQzIHBhcmVudF9tYXRyaXggPSBtYXQzKFxuICAgICAgICB1X2hpZ2hwWyR7ZX1dLnh5eixcbiAgICAgICAgdV9oaWdocFske2UrMX1dLnh5eixcbiAgICAgICAgdV9oaWdocFske2UrMn1dLnh5elxuICAgICk7XG4gICAgbWF0MyBhbmNlc3Rvcl9tYXRyaXggPSBtYXQzKFxuICAgICAgICB1X2hpZ2hwWyR7ZSszfV0ueHl6LFxuICAgICAgICB1X2hpZ2hwWyR7ZSs0fV0ueHl6LFxuICAgICAgICB1X2hpZ2hwWyR7ZSs1fV0ueHl6XG4gICAgKTtcblxuICAgIHZlYzIgcGFyZW50X29mZnNldCA9IHZlYzIodV9oaWdocFske2UrMn1dLncsIHVfaGlnaHBbJHtlKzN9XS53KTtcbiAgICB2ZWMyIHBhcmVudF9zaXplICAgPSB2ZWMyKHVfaGlnaHBbJHtlKzR9XS53LCB1X2hpZ2hwWyR7ZSs1fV0udyk7XG4gICAgdmVjNCBncmlkX21pbiA9IHVfaGlnaHBbJHtlKzZ9XTtcbiAgICB2ZWM0IGdyaWRfbWF4ID0gdV9oaWdocFske2UrN31dO1xuICAgIFxuICAgIHZlYzIgcG9zaXRpb24gPSAocGFyZW50X21hdHJpeCAqIHZlYzModmVydGV4LCAxLjApKS54eTtcbiAgICBwb3NpdGlvbiA9IChwb3NpdGlvbiAtIHBhcmVudF9vZmZzZXQpIC8gcGFyZW50X3NpemU7XG5cbiAgICB2ZWM0IGdhID0gZ3JpZF9taW47XG4gICAgdmVjNCBnYiA9IGdyaWRfbWF4ICAtIGdyaWRfbWluO1xuICAgIHZlYzQgZ2MgPSB2ZWM0KDEuMCkgLSBncmlkX21heDtcblxuICAgIHZlYzIgcGEgPSBwb3NpdGlvbjtcbiAgICB2ZWMyIHBiID0gcG9zaXRpb24gLSBncmlkX21pbi5zdDtcbiAgICB2ZWMyIHBjID0gcG9zaXRpb24gLSBncmlkX21heC5zdDtcblxuICAgIHBvc2l0aW9uID0gKGdhLnBxIC8gZ2Euc3QpICogbWluKHBhLCBnYS5zdClcbiAgICAgICAgICAgICAgICArIChnYi5wcSAvIGdiLnN0KSAqIGNsYW1wKHBiLCB2ZWMyKDAuMCksIGdiLnN0KVxuICAgICAgICAgICAgICAgICsgKGdjLnBxIC8gZ2Muc3QpICogbWF4KHZlYzIoMC4wKSwgcGMpO1xuXG4gICAgcG9zaXRpb24gPSBwb3NpdGlvbiAqIHBhcmVudF9zaXplICsgcGFyZW50X29mZnNldDtcbiAgICBwb3NpdGlvbiA9IChhbmNlc3Rvcl9tYXRyaXggKiB2ZWMzKHBvc2l0aW9uLCAxLjApKS54eTtcblxuICAgIHBvc2l0aW9uID0gcG9zaXRpb24gKyB2ZWMyKHVfaGlnaHBbJHtlKzh9XS54LCB1X2hpZ2hwWyR7ZSs4fV0ueSk7XG4gICAgcmV0dXJuIHBvc2l0aW9uIC8gdmVjMih1X2hpZ2hwWzBdLncsIHVfaGlnaHBbMV0udyk7XG59YCkodD81OjApOiJcbnZlYzIgYXBwbHlNYXRyaXgoaW4gdmVjMiB2ZXJ0ZXgpIHtcbiAgICBtYXQzIG1hdHJpeCA9IG1hdDMoYV9tYXRyaXgwLCBhX21hdHJpeDEsIGFfbWF0cml4Mik7XG4gICAgcmV0dXJuIChtYXRyaXggKiB2ZWMzKHZlcnRleCwgMS4wKSkueHk7XG59IjtyZXR1cm5gI3ZlcnNpb24gMzAwIGVzXG5cbmxheW91dCAobG9jYXRpb24gPSAwKSBpbiB2ZWMyIGFfdmVydGV4O1xuJHthfVxuJHtuPyIiOiJsYXlvdXQgKGxvY2F0aW9uID0gMikgaW4gdmVjNCBhX2NvbG9yOyJ9XG4ke3I/IiI6ImxheW91dCAobG9jYXRpb24gPSAzKSBpbiB2ZWMzIGFfbWF0cml4MDtcbmxheW91dCAobG9jYXRpb24gPSA0KSBpbiB2ZWMzIGFfbWF0cml4MTtcbmxheW91dCAobG9jYXRpb24gPSA1KSBpbiB2ZWMzIGFfbWF0cml4MjsifVxuXG4ke2U+MT9gdW5pZm9ybSB2ZWM0IHVfaGlnaHBbJHtlfV07YDoiIn1cbiR7c31cbiR7bj8iIjoib3V0IHZlYzQgdl9jb2xvcjsifVxuJHtpfVxuXG52b2lkIG1haW4oKSB7XG4gICAgJHtuPyIiOiJ2X2NvbG9yID0gYV9jb2xvcjsifVxuICAgICR7b31cbiAgICB2ZWMyIHBvcyA9IGFwcGx5TWF0cml4KGFfdmVydGV4KTtcbiAgICBwb3MgPSBwb3MgKiAyLjAgLSAxLjA7XG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvcy54LCAtcG9zLnksIDAuMCwgMS4wKTtcbn1gfSxPdD1lPT57Y29uc3QgdD0ibSIrKGU/InkiOiJuIik7aWYoRnQuaGFzKHQpKXJldHVybiBGdC5nZXQodCk7Y29uc3Qgbj1uZXcgd3QoJHQoZT85OjAsITEsITAsZSksIiN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cbmluIHZlYzIgdl9iZXppZXI7XG5vdXQgdmVjNCBvX2NvbG9yO1xuXG52b2lkIG1haW4oKSB7XG4gICAgdmVjMiBweCA9IGRGZHgodl9iZXppZXIpO1xuICAgIHZlYzIgcHkgPSBkRmR5KHZfYmV6aWVyKTtcblxuICAgIHZlYzIgZiA9ICgyLjAgKiB2X2Jlemllci54KSAqIHZlYzIocHgueCwgcHkueCkgLSB2ZWMyKHB4LnksIHB5LnkpO1xuICAgIGZsb2F0IGFscGhhID0gMC41IC0gKHZfYmV6aWVyLnggKiB2X2Jlemllci54IC0gdl9iZXppZXIueSkgLyBsZW5ndGgoZik7XG5cbiAgICBpZiAoYWxwaGEgPiAwLjApIHtcbiAgICAgICAgb19jb2xvciA9IHZlYzQobWluKGFscGhhLCAxLjApKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBkaXNjYXJkO1xuICAgIH0gICAgXG59Iik7cmV0dXJuIEZ0LnNldCh0LG4pLG59LFN0PShlLHQpPT57Y29uc3Qgbj1lLmhpZ2hwO25bMF09dFswXSxuWzFdPXRbMV0sblsyXT0wLG5bNF09dFsyXSxuWzVdPXRbM10sbls2XT0wLG5bOF09dFs0XSxuWzldPXRbNV0sblsxMF09MSxuWzEyXT10WzZdLG5bMTNdPXRbN10sblsxNF09MCxuWzE2XT10WzhdLG5bMTddPXRbOV0sblsxOF09MCxuWzIwXT10WzEwXSxuWzIxXT10WzExXSxuWzIyXT0xLG5bM109eCgpLG5bN109RSgpLG5bMTFdPXRbMTJdLG5bMTVdPXRbMTNdLG5bMTldPXRbMTRdLG5bMjNdPXRbMTVdLG5bMjRdPXRbMTZdLG5bMjVdPXRbMTddLG5bMjZdPXRbMThdLG5bMjddPXRbMTldLG5bMjhdPXRbMjBdLG5bMjldPXRbMjFdLG5bMzBdPXRbMjJdLG5bMzFdPXRbMjNdLG5bMzJdPXRbMjRdLG5bMzNdPXRbMjVdfTtsZXQga3Q9Im5vcm1hbCI7Y29uc3QgQ3Q9ZT0+e2t0PWV9LFB0PSgpPT5rdDtsZXQgQnQ9NjAwO2NvbnN0IEl0PWU9PntCdD1lfSxMdD0oKT0+QnQsVXQ9KCk9Pns2MTMhPT1MdCgpJiYoSXQoNjEzKSxuLmJsZW5kRnVuYyhuLk9ORSxuLk9ORV9NSU5VU19TUkNfQUxQSEEpKX0sTnQ9KGUsdCxyLGEpPT57ZS51c2VQcm9ncmFtKCksZS5iaW5kVW5pZm9ybSgpLFV0KCksdnQodCksbi5kcmF3QXJyYXlzKG4uVFJJQU5HTEVTLHIsYSl9LER0PSgpPT57Y29uc3QgZT0icm1ubiI7aWYoRnQuaGFzKGUpKXJldHVybiBGdC5nZXQoZSk7Y29uc3QgdD1uZXcgd3QoIiN2ZXJzaW9uIDMwMCBlc1xubGF5b3V0IChsb2NhdGlvbiA9IDApIGluIHZlYzIgYV92ZXJ0ZXg7XG52b2lkIG1haW4oKSB7XG4gICAgdmVjMiBwb3MgPSBhX3ZlcnRleCAqIDIuMCAtIDEuMDtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zLngsIC1wb3MueSwgMC4wLCAxLjApO1xufSIsIiN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5vdXQgdmVjNCBvX2NvbG9yO1xudm9pZCBtYWluKCkge1xuICAgIG9fY29sb3IgPSB2ZWM0KDEuMCk7XG59Iik7cmV0dXJuIEZ0LnNldChlLHQpLHR9LGp0PSgpPT57Y29uc3QgZT1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0O2lmKCFlKXJldHVybjtjb25zdCB0PTE8PGUuY2xpcExldmVsLTE7bi5zdGVuY2lsTWFzayh+dC0xKSxuLnN0ZW5jaWxGdW5jKG4uTEVRVUFMLHQsMjU1KSxuLnN0ZW5jaWxPcChuLlpFUk8sbi5SRVBMQUNFLG4uUkVQTEFDRSksTnQoRHQoKSx5dCgpLDAsNiksbi5zdGVuY2lsTWFzaygxPDxlLmNsaXBMZXZlbCksbi5zdGVuY2lsRnVuYyhuLkFMV0FZUywwLDI1NSksbi5zdGVuY2lsT3Aobi5SRVBMQUNFLG4uUkVQTEFDRSxuLlJFUExBQ0UpLE50KER0KCkseXQoKSwwLDYpLG4uc3RlbmNpbE1hc2soMjU1KSxuLnN0ZW5jaWxPcChuLlpFUk8sbi5JTlZFUlQsbi5JTlZFUlQpfSx6dD1bXTtjbGFzcyBYdHtjb25zdHJ1Y3RvcihlLHQsbixyLGEpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpbmRleCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJ4Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInkiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywidyIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJoIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImxlZnQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywicmlnaHQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywidXNlZCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLHRoaXMuaW5kZXg9ZSx0aGlzLng9dCx0aGlzLnk9bix0aGlzLnc9cix0aGlzLmg9YSx0aGlzLmxlZnQ9bnVsbCx0aGlzLnJpZ2h0PW51bGwsdGhpcy51c2VkPSExfWluc2VydChlLHQpe3JldHVybigoZSx0LG4pPT57aWYoZS51c2VkKXtjb25zdCByPWUubGVmdD8uaW5zZXJ0KHQsbik7cmV0dXJuIHJ8fGUucmlnaHQ/Lmluc2VydCh0LG4pfHxudWxsfWNvbnN0IHI9dCsxLGE9bisxO2lmKHI+ZS53fHxhPmUuaClyZXR1cm4gbnVsbDtpZihyPT09ZS53JiZhPT09ZS5oKXJldHVybiBlLnVzZWQ9ITAsZS53PXQsZS5oPW4sZTtjb25zdCBzPWUudy1yLG89ZS5oLWE7cmV0dXJuIHM+bz8oZS5sZWZ0PWUuY3JlYXRlKGUuaW5kZXgsZS54LGUueSxyLGUuaCksZS5yaWdodD1lLmNyZWF0ZShlLmluZGV4LGUueCtyLGUueSxzLGUuaCkpOihlLmxlZnQ9ZS5jcmVhdGUoZS5pbmRleCxlLngsZS55LGUudyxhKSxlLnJpZ2h0PWUuY3JlYXRlKGUuaW5kZXgsZS54LGUueSthLGUudyxvKSksZS51c2VkPSEwLGUubGVmdC5pbnNlcnQodCxuKX0pKHRoaXMsZSx0KX1kaXNwb3NlKGUsdCxuLHIpe3JldHVybigoZSx0LG4scixhKT0+ZS5sZWZ0Py5kaXNwb3NlKHQsbixyLGEpPyhlLmxlZnQudXNlZHx8ZS5yaWdodD8udXNlZHx8KGUubGVmdCYmZS5sZWZ0LnJlbGVhc2UoKSxlLnJpZ2h0JiZlLnJpZ2h0LnJlbGVhc2UoKSxlLmxlZnQ9ZS5yaWdodD1udWxsLGUudXNlZD0hMSksITApOmUucmlnaHQ/LmRpc3Bvc2UodCxuLHIsYSk/KGUucmlnaHQudXNlZHx8ZS5sZWZ0Py51c2VkfHwoZS5sZWZ0JiZlLmxlZnQucmVsZWFzZSgpLGUucmlnaHQmJmUucmlnaHQucmVsZWFzZSgpLGUubGVmdD1lLnJpZ2h0PW51bGwsZS51c2VkPSExKSwhMCk6dD09PWUueCYmbj09PWUueSYmcj09PWUudyYmYT09PWUuaCYmKGUudXNlZD0hMSwhMCkpKHRoaXMsZSx0LG4scil9Y3JlYXRlKGUsdCxuLHIsYSl7bGV0IHM7cmV0dXJuIHp0Lmxlbmd0aD4wPyhzPXp0LnBvcCgpLHMuaW5kZXg9ZSxzLng9dCxzLnk9bixzLnc9cixzLmg9YSxzLmxlZnQ9bnVsbCxzLnJpZ2h0PW51bGwscy51c2VkPSExKTpzPW5ldyBYdChlLHQsbixyLGEpLHN9cmVsZWFzZSgpe3RoaXMubGVmdCYmKHRoaXMubGVmdC5yZWxlYXNlKCksdGhpcy5sZWZ0PW51bGwpLHRoaXMucmlnaHQmJih0aGlzLnJpZ2h0LnJlbGVhc2UoKSx0aGlzLnJpZ2h0PW51bGwpLHRoaXMudXNlZD0hMSx6dC5wdXNoKHRoaXMpfX1jbGFzcyBXdHtjb25zdHJ1Y3RvcihlLHQsbil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIl8kcm9vdCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLHRoaXMuXyRyb290PW5ldyBYdChlLDAsMCx0LG4pfWluc2VydChlLHQpe3JldHVybiB0aGlzLl8kcm9vdC5pbnNlcnQoZSx0KX1kaXNwb3NlKGUsdCxuLHIpe3JldHVybiB0aGlzLl8kcm9vdC5kaXNwb3NlKGUsdCxuLHIpfX1jb25zdCBHdD0odCxuKT0+e2NvbnN0IHI9dmUoKTtnZVtyXXx8KGdlW3JdPW5ldyBXdChyLGUsZSkpO2NvbnN0IGE9Z2Vbcl0uaW5zZXJ0KHQsbik7cmV0dXJuIGF8fChtZShyKzEpLEd0KHQsbikpfSxWdD1lPT5gXG4gICAgdmVjNCBtdWwgPSB1X21lZGl1bXBbJHtlfV07XG4gICAgdmVjNCBhZGQgPSB1X21lZGl1bXBbJHtlKzF9XTtcblxuICAgIGlmIChtdWwueCAhPSAxLjAgfHwgbXVsLnkgIT0gMS4wIHx8IG11bC56ICE9IDEuMCB8fCBtdWwudyAhPSAxLjBcbiAgICAgICAgfHwgYWRkLnggIT0gMC4wIHx8IGFkZC55ICE9IDAuMCB8fCBhZGQueiAhPSAwLjBcbiAgICApIHtcbiAgICAgICAgc3JjLnJnYiAvPSBtYXgoMC4wMDAxLCBzcmMuYSk7XG4gICAgICAgIHNyYyA9IGNsYW1wKHNyYyAqIG11bCArIGFkZCwgMC4wLCAxLjApO1xuICAgICAgICBzcmMucmdiICo9IHNyYy5hO1xuICAgIH1cbmAsWXQ9ZT0+YCN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cbnVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4dHVyZTtcbiR7ZT8idW5pZm9ybSB2ZWM0IHVfbWVkaXVtcFsyXTsiOiIifVxuXG5pbiB2ZWMyIHZfY29vcmQ7XG5vdXQgdmVjNCBvX2NvbG9yO1xuXG52b2lkIG1haW4oKSB7XG4gICAgdmVjNCBzcmMgPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdl9jb29yZCk7XG4gICAgJHtlP1Z0KDApOiIifVxuICAgIG9fY29sb3IgPSBzcmM7XG59YDtjb25zdCBxdD1uZXcgY2xhc3N7Y29uc3RydWN0b3IoKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiYnVmZmVyIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIm9mZnNldCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLHRoaXMuYnVmZmVyPW5ldyBGbG9hdDMyQXJyYXkoMjU2KSx0aGlzLm9mZnNldD0wfXB1c2goLi4uZSl7dGhpcy5idWZmZXIubGVuZ3RoPHRoaXMub2Zmc2V0K2UubGVuZ3RoJiZ0aGlzLnJlc2l6ZShlLmxlbmd0aCk7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0KyspdGhpcy5idWZmZXJbdGhpcy5vZmZzZXQrK109ZVt0XX1zZXQoZSl7dGhpcy5idWZmZXIubGVuZ3RoPHRoaXMub2Zmc2V0K2UubGVuZ3RoJiZ0aGlzLnJlc2l6ZShlLmxlbmd0aCksdGhpcy5idWZmZXIuc2V0KGUsdGhpcy5vZmZzZXQpLHRoaXMub2Zmc2V0Kz1lLmxlbmd0aH1yZXNpemUoZSl7Y29uc3QgdD1uZXcgRmxvYXQzMkFycmF5KChuPXRoaXMub2Zmc2V0K2Usbi0tLG58PW4+PjEsbnw9bj4+MixufD1uPj40LG58PW4+Pjgsbnw9bj4+MTYsKytuKSk7dmFyIG47dGhpcy5idWZmZXIubGVuZ3RoJiZ0LnNldCh0aGlzLmJ1ZmZlciksdGhpcy5idWZmZXI9dH19O2NsYXNzIEt0IGV4dGVuZHMgd3R7Y29uc3RydWN0b3IoZSx0LG49ITApe3N1cGVyKGUsdCxuKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiY291bnQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSx0aGlzLmNvdW50PTB9Y2xlYXIoKXt0aGlzLmNvdW50PXF0Lm9mZnNldD0wfX1jb25zdCBIdD1uZXcgTWFwLFp0PSgpPT57aWYoSHQuaGFzKCJpIikpcmV0dXJuIEh0LmdldCgiaSIpO2NvbnN0IGU9bmV3IEt0KCIjdmVyc2lvbiAzMDAgZXNcblxubGF5b3V0IChsb2NhdGlvbiA9IDApIGluIHZlYzIgYV92ZXJ0ZXg7XG5sYXlvdXQgKGxvY2F0aW9uID0gMSkgaW4gdmVjNCBhX3JlY3Q7XG5sYXlvdXQgKGxvY2F0aW9uID0gMikgaW4gdmVjNCBhX3NpemU7XG5sYXlvdXQgKGxvY2F0aW9uID0gMykgaW4gdmVjMiBhX29mZnNldDtcbmxheW91dCAobG9jYXRpb24gPSA0KSBpbiB2ZWM0IGFfbWF0cml4O1xubGF5b3V0IChsb2NhdGlvbiA9IDUpIGluIHZlYzQgYV9tdWw7XG5sYXlvdXQgKGxvY2F0aW9uID0gNikgaW4gdmVjNCBhX2FkZDtcblxub3V0IHZlYzIgdl9jb29yZDtcbm91dCB2ZWM0IHZfbXVsO1xub3V0IHZlYzQgdl9hZGQ7XG5cbnZvaWQgbWFpbigpIHtcbiAgICB2X2Nvb3JkID0gYV92ZXJ0ZXggKiBhX3JlY3QuencgKyBhX3JlY3QueHk7XG4gICAgdl9tdWwgPSBhX211bDtcbiAgICB2X2FkZCA9IGFfYWRkO1xuXG4gICAgdmVjMiBwb3NpdGlvbiA9IHZlYzIoYV92ZXJ0ZXgueCwgMS4wIC0gYV92ZXJ0ZXgueSk7XG4gICAgcG9zaXRpb24gPSBwb3NpdGlvbiAqIGFfc2l6ZS54eTtcblxuICAgIG1hdDMgbWF0cml4ID0gbWF0MyhcbiAgICAgICAgYV9tYXRyaXgueCwgYV9tYXRyaXgueSwgMC4wLFxuICAgICAgICBhX21hdHJpeC56LCBhX21hdHJpeC53LCAwLjAsXG4gICAgICAgIGFfb2Zmc2V0LngsIGFfb2Zmc2V0LnksIDEuMFxuICAgICk7XG5cbiAgICBwb3NpdGlvbiA9IChtYXRyaXggKiB2ZWMzKHBvc2l0aW9uLCAxLjApKS54eTtcbiAgICBwb3NpdGlvbiAvPSBhX3NpemUuenc7XG5cbiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uICogMi4wIC0gMS4wO1xuICAgIGdsX1Bvc2l0aW9uID0gdmVjNChwb3NpdGlvbi54LCAtcG9zaXRpb24ueSwgMC4wLCAxLjApO1xufSIsIiN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cbnVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4dHVyZTtcblxuaW4gdmVjNCB2X211bDtcbmluIHZlYzQgdl9hZGQ7XG5pbiB2ZWMyIHZfY29vcmQ7XG5vdXQgdmVjNCBvX2NvbG9yO1xuXG52b2lkIG1haW4oKSB7XG4gICAgdmVjNCBzcmMgPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdl9jb29yZCk7XG5cbiAgICBpZiAodl9tdWwueCAhPSAxLjAgfHwgdl9tdWwueSAhPSAxLjAgfHwgdl9tdWwueiAhPSAxLjAgfHwgdl9tdWwudyAhPSAxLjBcbiAgICAgICAgfHwgdl9hZGQueCAhPSAwLjAgfHwgdl9hZGQueSAhPSAwLjAgfHwgdl9hZGQueiAhPSAwLjBcbiAgICApIHtcbiAgICAgICAgc3JjLnJnYiAvPSBtYXgoMC4wMDAxLCBzcmMuYSk7XG4gICAgICAgIHNyYyA9IGNsYW1wKHNyYyAqIHZfbXVsICsgdl9hZGQsIDAuMCwgMS4wKTtcbiAgICAgICAgc3JjLnJnYiAqPSBzcmMuYTtcbiAgICB9XG5cbiAgICBvX2NvbG9yID0gc3JjO1xufSIpO3JldHVybiBIdC5zZXQoImkiLGUpLGV9LFF0PShlLHQpPT57Y29uc3Qgbj1gaSR7ZX15YDtpZihIdC5oYXMobikpcmV0dXJuIEh0LmdldChuKTtjb25zdCByPW5ldyB3dCgiI3ZlcnNpb24gMzAwIGVzXG5cbmxheW91dCAobG9jYXRpb24gPSAwKSBpbiB2ZWMyIGFfdmVydGV4O1xuXG5vdXQgdmVjMiB2X2Nvb3JkO1xuXG52b2lkIG1haW4oKSB7XG4gICAgdl9jb29yZCA9IGFfdmVydGV4O1xuXG4gICAgdmVjMiBwb3NpdGlvbiA9IGFfdmVydGV4ICogMi4wIC0gMS4wO1xuICAgIGdsX1Bvc2l0aW9uID0gdmVjNChwb3NpdGlvbiwgMC4wLCAxLjApO1xufSIsKGU9PntsZXQgdDtzd2l0Y2goZSl7Y2FzZSJzdWJ0cmFjdCI6dD0iXG52ZWM0IGJsZW5kIChpbiB2ZWM0IHNyYywgaW4gdmVjNCBkc3QpIHtcbiAgICBpZiAoc3JjLmEgPT0gMC4wKSB7IHJldHVybiBkc3Q7IH1cbiAgICBpZiAoZHN0LmEgPT0gMC4wKSB7IHJldHVybiBzcmM7IH1cblxuICAgIHZlYzQgYSA9IHNyYyAtIHNyYyAqIGRzdC5hO1xuICAgIHZlYzQgYiA9IGRzdCAtIGRzdCAqIHNyYy5hO1xuXG4gICAgc3JjLnJnYiAvPSBzcmMuYTtcbiAgICBkc3QucmdiIC89IGRzdC5hO1xuXG4gICAgdmVjNCBjID0gdmVjNChkc3QucmdiIC0gc3JjLnJnYiwgc3JjLmEgKiBkc3QuYSk7XG4gICAgYy5yZ2IgKj0gYy5hO1xuXG4gICAgcmV0dXJuIGEgKyBiICsgYztcbn0iO2JyZWFrO2Nhc2UibXVsdGlwbHkiOnQ9IlxudmVjNCBibGVuZCAoaW4gdmVjNCBzcmMsIGluIHZlYzQgZHN0KSB7XG4gICAgdmVjNCBhID0gc3JjIC0gc3JjICogZHN0LmE7XG4gICAgdmVjNCBiID0gZHN0IC0gZHN0ICogc3JjLmE7XG4gICAgdmVjNCBjID0gc3JjICogZHN0O1xuXG4gICAgcmV0dXJuIGEgKyBiICsgYztcbn0iO2JyZWFrO2Nhc2UibGlnaHRlbiI6dD0iXG52ZWM0IGJsZW5kIChpbiB2ZWM0IHNyYywgaW4gdmVjNCBkc3QpIHtcbiAgICBpZiAoc3JjLmEgPT0gMC4wKSB7IHJldHVybiBkc3Q7IH1cbiAgICBpZiAoZHN0LmEgPT0gMC4wKSB7IHJldHVybiBzcmM7IH1cblxuICAgIHZlYzQgYSA9IHNyYyAtIHNyYyAqIGRzdC5hO1xuICAgIHZlYzQgYiA9IGRzdCAtIGRzdCAqIHNyYy5hO1xuXG4gICAgc3JjLnJnYiAvPSBzcmMuYTtcbiAgICBkc3QucmdiIC89IGRzdC5hO1xuXG4gICAgdmVjNCBjID0gdmVjNChtaXgoc3JjLnJnYiwgZHN0LnJnYiwgc3RlcChzcmMucmdiLCBkc3QucmdiKSksIHNyYy5hICogZHN0LmEpO1xuICAgIGMucmdiICo9IGMuYTtcblxuICAgIHJldHVybiBhICsgYiArIGM7XG59IjticmVhaztjYXNlImRhcmtlbiI6dD0iXG52ZWM0IGJsZW5kIChpbiB2ZWM0IHNyYywgaW4gdmVjNCBkc3QpIHtcbiAgICBpZiAoc3JjLmEgPT0gMC4wKSB7IHJldHVybiBkc3Q7IH1cbiAgICBpZiAoZHN0LmEgPT0gMC4wKSB7IHJldHVybiBzcmM7IH1cblxuICAgIHZlYzQgYSA9IHNyYyAtIHNyYyAqIGRzdC5hO1xuICAgIHZlYzQgYiA9IGRzdCAtIGRzdCAqIHNyYy5hO1xuXG4gICAgc3JjLnJnYiAvPSBzcmMuYTtcbiAgICBkc3QucmdiIC89IGRzdC5hO1xuXG4gICAgdmVjNCBjID0gdmVjNChtaXgoc3JjLnJnYiwgZHN0LnJnYiwgc3RlcChkc3QucmdiLCBzcmMucmdiKSksIHNyYy5hICogZHN0LmEpO1xuICAgIGMucmdiICo9IGMuYTtcblxuICAgIHJldHVybiBhICsgYiArIGM7XG59IjticmVhaztjYXNlIm92ZXJsYXkiOnQ9IlxudmVjNCBibGVuZCAoaW4gdmVjNCBzcmMsIGluIHZlYzQgZHN0KSB7XG4gICAgaWYgKHNyYy5hID09IDAuMCkgeyByZXR1cm4gZHN0OyB9XG4gICAgaWYgKGRzdC5hID09IDAuMCkgeyByZXR1cm4gc3JjOyB9XG5cbiAgICB2ZWM0IGEgPSBzcmMgLSBzcmMgKiBkc3QuYTtcbiAgICB2ZWM0IGIgPSBkc3QgLSBkc3QgKiBzcmMuYTtcblxuICAgIHNyYy5yZ2IgLz0gc3JjLmE7XG4gICAgZHN0LnJnYiAvPSBkc3QuYTtcblxuICAgIHZlYzQgbXVsID0gc3JjICogZHN0O1xuICAgIHZlYzMgYzEgPSAyLjAgKiBtdWwucmdiO1xuICAgIHZlYzMgYzIgPSAyLjAgKiAoc3JjLnJnYiArIGRzdC5yZ2IgLSBtdWwucmdiKSAtIDEuMDtcbiAgICB2ZWM0IGMgPSB2ZWM0KG1peChjMSwgYzIsIHN0ZXAodmVjMygwLjUpLCBkc3QucmdiKSksIG11bC5hKTtcbiAgICBjLnJnYiAqPSBjLmE7XG5cbiAgICByZXR1cm4gYSArIGIgKyBjO1xufSI7YnJlYWs7Y2FzZSJoYXJkbGlnaHQiOnQ9IlxudmVjNCBibGVuZCAoaW4gdmVjNCBzcmMsIGluIHZlYzQgZHN0KSB7XG4gICAgaWYgKHNyYy5hID09IDAuMCkgeyByZXR1cm4gZHN0OyB9XG4gICAgaWYgKGRzdC5hID09IDAuMCkgeyByZXR1cm4gc3JjOyB9XG5cbiAgICB2ZWM0IGEgPSBzcmMgLSBzcmMgKiBkc3QuYTtcbiAgICB2ZWM0IGIgPSBkc3QgLSBkc3QgKiBzcmMuYTtcblxuICAgIHNyYy5yZ2IgLz0gc3JjLmE7XG4gICAgZHN0LnJnYiAvPSBkc3QuYTtcblxuICAgIHZlYzQgbXVsID0gc3JjICogZHN0O1xuICAgIHZlYzMgYzEgPSAyLjAgKiBtdWwucmdiO1xuICAgIHZlYzMgYzIgPSAyLjAgKiAoc3JjLnJnYiArIGRzdC5yZ2IgLSBtdWwucmdiKSAtIDEuMDtcbiAgICB2ZWM0IGMgPSB2ZWM0KG1peChjMSwgYzIsIHN0ZXAodmVjMygwLjUpLCBzcmMucmdiKSksIG11bC5hKTtcbiAgICBjLnJnYiAqPSBjLmE7XG5cbiAgICByZXR1cm4gYSArIGIgKyBjO1xufSI7YnJlYWs7Y2FzZSJkaWZmZXJlbmNlIjp0PSJcbnZlYzQgYmxlbmQgKGluIHZlYzQgc3JjLCBpbiB2ZWM0IGRzdCkge1xuICAgIGlmIChzcmMuYSA9PSAwLjApIHsgcmV0dXJuIGRzdDsgfVxuICAgIGlmIChkc3QuYSA9PSAwLjApIHsgcmV0dXJuIHNyYzsgfVxuXG4gICAgdmVjNCBhID0gc3JjIC0gc3JjICogZHN0LmE7XG4gICAgdmVjNCBiID0gZHN0IC0gZHN0ICogc3JjLmE7XG5cbiAgICBzcmMucmdiIC89IHNyYy5hO1xuICAgIGRzdC5yZ2IgLz0gZHN0LmE7XG5cbiAgICB2ZWM0IGMgPSB2ZWM0KGFicyhzcmMucmdiIC0gZHN0LnJnYiksIHNyYy5hICogZHN0LmEpO1xuICAgIGMucmdiICo9IGMuYTtcblxuICAgIHJldHVybiBhICsgYiArIGM7XG59IjticmVhaztjYXNlImludmVydCI6dD0iXG52ZWM0IGJsZW5kIChpbiB2ZWM0IHNyYywgaW4gdmVjNCBkc3QpIHtcbiAgICBpZiAoc3JjLmEgPT0gMC4wKSB7IHJldHVybiBkc3Q7IH1cbiAgICBpZiAoZHN0LmEgPT0gMC4wKSB7IHJldHVybiBzcmM7IH1cblxuICAgIHZlYzQgYiA9IGRzdCAtIGRzdCAqIHNyYy5hO1xuICAgIHZlYzQgYyA9IHZlYzQoc3JjLmEgLSBkc3QucmdiICogc3JjLmEsIHNyYy5hKTtcblxuICAgIHJldHVybiBiICsgYztcbn0iO2JyZWFrO2RlZmF1bHQ6dD0iXG52ZWM0IGJsZW5kIChpbiB2ZWM0IHNyYywgaW4gdmVjNCBkc3QpIHtcbiAgICByZXR1cm4gc3JjICsgZHN0IC0gZHN0ICogc3JjLmE7XG59In1yZXR1cm5gI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblxudW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlc1syXTtcbnVuaWZvcm0gdmVjNCB1X21lZGl1bXBbMl07XG5cbmluIHZlYzIgdl9jb29yZDtcbm91dCB2ZWM0IG9fY29sb3I7XG5cbiR7dH1cblxudm9pZCBtYWluKCkge1xuICAgIHZlYzQgZHN0ID0gdGV4dHVyZSh1X3RleHR1cmVzWzBdLCB2X2Nvb3JkKTtcbiAgICB2ZWM0IHNyYyA9IHRleHR1cmUodV90ZXh0dXJlc1sxXSwgdl9jb29yZCk7XG4gICAgJHtWdCgwKX1cbiAgICBvX2NvbG9yID0gYmxlbmQoc3JjLCBkc3QpO1xufWB9KShlKSk7cmV0dXJuIEh0LnNldChuLHIpLHJ9O2xldCBKdD0wO2NvbnN0IGVuPSgpPT57Y29uc3QgZT1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0LHQ9ci5hdGxhc0F0dGFjaG1lbnRPYmplY3Q7aWYoci5iaW5kKHQpLG4uYmluZEZyYW1lYnVmZmVyKG4uRFJBV19GUkFNRUJVRkZFUix6KSxZKCExKSxKdD09PXZlKCkpe2NvbnN0IGU9QWUodmUoKSk7ZVsyXSE9PS1OdW1iZXIuTUFYX1ZBTFVFJiZlWzNdIT09LU51bWJlci5NQVhfVkFMVUUmJihuLmVuYWJsZShuLlNDSVNTT1JfVEVTVCksbi5zY2lzc29yKGVbMF0sZVsxXSxlWzJdLGVbM10pLG4uYmxpdEZyYW1lYnVmZmVyKDAsMCx0LndpZHRoLHQuaGVpZ2h0LDAsMCx0LndpZHRoLHQuaGVpZ2h0LG4uQ09MT1JfQlVGRkVSX0JJVCxuLk5FQVJFU1QpLG4uZGlzYWJsZShuLlNDSVNTT1JfVEVTVCkpfWVsc2V7Y29uc3QgZT1SZSh2ZSgpKTtuLmVuYWJsZShuLlNDSVNTT1JfVEVTVCksbi5zY2lzc29yKGVbMF0sZVsxXSxlWzJdLGVbM10pLG4uYmxpdEZyYW1lYnVmZmVyKDAsMCx0LndpZHRoLHQuaGVpZ2h0LDAsMCx0LndpZHRoLHQuaGVpZ2h0LG4uQ09MT1JfQlVGRkVSX0JJVCxuLk5FQVJFU1QpLG4uZGlzYWJsZShuLlNDSVNTT1JfVEVTVCksSnQ9dmUoKX1lJiZyLmJpbmQoZSl9LHRuPWU9Pntjb25zdCB0PXZlKCk7bWUoZS5pbmRleCksZW4oKTtjb25zdCByPUs7bi5iaW5kRnJhbWVidWZmZXIobi5GUkFNRUJVRkZFUixyKTtjb25zdCBhPUVlKCk7bi5mcmFtZWJ1ZmZlclRleHR1cmUyRChuLkZSQU1FQlVGRkVSLG4uQ09MT1JfQVRUQUNITUVOVDAsbi5URVhUVVJFXzJELGEucmVzb3VyY2UsMCk7Y29uc3Qgcz1KKCk7bi5iaW5kRnJhbWVidWZmZXIobi5GUkFNRUJVRkZFUixzKTtjb25zdCBvPXVlKGUudyxlLmgpO3JldHVybiBuLmZyYW1lYnVmZmVyVGV4dHVyZTJEKG4uRlJBTUVCVUZGRVIsbi5DT0xPUl9BVFRBQ0hNRU5UMCxuLlRFWFRVUkVfMkQsby5yZXNvdXJjZSwwKSxuLmJpbmRGcmFtZWJ1ZmZlcihuLkZSQU1FQlVGRkVSLG51bGwpLG4uYmluZEZyYW1lYnVmZmVyKG4uUkVBRF9GUkFNRUJVRkZFUixyKSxuLmJpbmRGcmFtZWJ1ZmZlcihuLkRSQVdfRlJBTUVCVUZGRVIscyksbi5ibGl0RnJhbWVidWZmZXIoZS54LGUueSxlLngrZS53LGUueStlLmgsMCwwLGUudyxlLmgsbi5DT0xPUl9CVUZGRVJfQklULG4uTkVBUkVTVCksbWUodCksbi5iaW5kRnJhbWVidWZmZXIobi5SRUFEX0ZSQU1FQlVGRkVSLEQpLG4uYmluZEZyYW1lYnVmZmVyKG4uRlJBTUVCVUZGRVIsRCksb30sbm49KGUsdCxyPSExKT0+e1NlKDIsbi5URVhUVVJFMixudWxsLHIpLFNlKDEsbi5URVhUVVJFMSx0LHIpLFNlKDAsbi5URVhUVVJFMCxlLHIpfSxybj0oKT0+e2lmKEh0LmhhcygicCIpKXJldHVybiBIdC5nZXQoInAiKTtjb25zdCBlPW5ldyB3dCgiI3ZlcnNpb24gMzAwIGVzXG5cbmxheW91dCAobG9jYXRpb24gPSAwKSBpbiB2ZWMyIGFfdmVydGV4O1xudW5pZm9ybSB2ZWM0IHVfaGlnaHBbMl07XG5cbm91dCB2ZWMyIHZfY29vcmQ7XG5cbnZvaWQgbWFpbigpIHtcbiAgICB2X2Nvb3JkID0gYV92ZXJ0ZXg7XG5cbiAgICB2ZWMyIG9mZnNldCAgID0gdV9oaWdocFswXS54eTtcbiAgICB2ZWMyIHNpemUgICAgID0gdV9oaWdocFswXS56dztcbiAgICB2ZWMyIHZpZXdwb3J0ID0gdmVjMih1X2hpZ2hwWzFdLngsIHVfaGlnaHBbMV0ueSk7XG5cbiAgICB2ZWMyIHBvc2l0aW9uID0gdmVjMihhX3ZlcnRleC54LCAxLjAgLSBhX3ZlcnRleC55KTtcbiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uICogc2l6ZSArIG9mZnNldDtcbiAgICBwb3NpdGlvbiAvPSB2aWV3cG9ydDtcblxuICAgIHBvc2l0aW9uID0gcG9zaXRpb24gKiAyLjAgLSAxLjA7XG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLngsIC1wb3NpdGlvbi55LCAwLjAsIDEuMCk7XG59IixZdCghMSkpO3JldHVybiBIdC5zZXQoInAiLGUpLGV9LGFuPShlLHQsbik9Pntjb25zdCBhPWUuaGlnaHAscz1yLiRtYXRyaXg7YVswXT1zWzZdLGFbMV09c1s3XSxhWzJdPXQsYVszXT1uLGFbNF09eCgpLGFbNV09RSgpfSxzbj1lPT57ZS51c2VQcm9ncmFtKCksZS5iaW5kVW5pZm9ybSgpLHZ0KHl0KCkpLG4uZHJhd0FycmF5cyhuLlRSSUFOR0xFUywwLDYpfTtsZXQgb249bnVsbDtjb25zdCBjbj0oZSx0LGEscyk9Pntjb25zdCBvPXIuY3VycmVudEF0dGFjaG1lbnRPYmplY3QsaT1yLiRtYWluQXR0YWNobWVudE9iamVjdDtyLmJpbmQoaSk7Y29uc3QgYz1KKCk7cmV0dXJuIG4uYmluZEZyYW1lYnVmZmVyKG4uRlJBTUVCVUZGRVIsYyksb24mJm9uLndpZHRoPT09aS53aWR0aCYmb24uaGVpZ2h0PT09aS5oZWlnaHR8fChvbj11ZShpLndpZHRoLGkuaGVpZ2h0KSksa2Uob24pLG4uZnJhbWVidWZmZXJUZXh0dXJlMkQobi5GUkFNRUJVRkZFUixuLkNPTE9SX0FUVEFDSE1FTlQwLG4uVEVYVFVSRV8yRCxvbi5yZXNvdXJjZSwwKSxuLmJpbmRGcmFtZWJ1ZmZlcihuLkZSQU1FQlVGRkVSLG51bGwpLG4uYmluZEZyYW1lYnVmZmVyKG4uUkVBRF9GUkFNRUJVRkZFUixEKSxuLmJpbmRGcmFtZWJ1ZmZlcihuLkRSQVdfRlJBTUVCVUZGRVIsYyksbi5lbmFibGUobi5TQ0lTU09SX1RFU1QpLG4uc2Npc3NvcihlLGkuaGVpZ2h0LXQtcyxhKzEscysxKSxuLmJsaXRGcmFtZWJ1ZmZlcigwLDAsaS53aWR0aCxpLmhlaWdodCwwLDAsaS53aWR0aCxpLmhlaWdodCxuLkNPTE9SX0JVRkZFUl9CSVQsbi5ORUFSRVNUKSxuLmRpc2FibGUobi5TQ0lTU09SX1RFU1QpLG4uYmluZEZyYW1lYnVmZmVyKG4uRlJBTUVCVUZGRVIsRCksbyYmci5iaW5kKG8pLG9ufSxsbj0oZSx0LG4sYSk9Pntjb25zdCBzPXIuY3VycmVudEF0dGFjaG1lbnRPYmplY3Qsbz1jbihlLHQsbixhKSxpPWhlKG4sYSwhMSk7ci5iaW5kKGkpLHIuc2F2ZSgpLHIuc2V0VHJhbnNmb3JtKDEsMCwwLDEsLWUsLXQpO2NvbnN0IGM9cm4oKTthbihjLG8ud2lkdGgsby5oZWlnaHQpLFV0KCksa2Uobyksc24oYyk7Y29uc3QgbD1pLnRleHR1cmU7cmV0dXJuIHIucmVzdG9yZSgpLGVlKGksITEpLHMmJnIuYmluZChzKSxsfSx1bj0oKT0+ezYxMCE9PUx0KCkmJihJdCg2MTApLG4uYmxlbmRGdW5jKG4uT05FLG4uWkVSTykpfSxobj1lPT57a2UoZSksdW4oKTtjb25zdCB0PXJuKCk7YW4odCxlLndpZHRoLGUuaGVpZ2h0KSxzbih0KSxVdCgpfSxibj0oZSx0LG4scixhLHMsbyxpLGMpPT57Y29uc3QgbD1lLnRleHR1cmVzO2xbMF09MCxsWzFdPTE7Y29uc3QgdT1lLm1lZGl1bXA7dVswXT10LHVbMV09bix1WzJdPXIsdVszXT1hLHVbNF09cyx1WzVdPW8sdVs2XT1pLHVbN109Y30sZG49KGU9ITEpPT57Y29uc3QgdD0ibSIrKGU/InkiOiJuIik7aWYoSHQuaGFzKHQpKXJldHVybiBIdC5nZXQodCk7Y29uc3Qgbj1uZXcgd3QoIiN2ZXJzaW9uIDMwMCBlc1xuXG5sYXlvdXQgKGxvY2F0aW9uID0gMCkgaW4gdmVjMiBhX3ZlcnRleDtcbnVuaWZvcm0gdmVjNCB1X2hpZ2hwWzNdO1xuXG5vdXQgdmVjMiB2X2Nvb3JkO1xuXG52b2lkIG1haW4oKSB7XG4gICAgdl9jb29yZCA9IGFfdmVydGV4O1xuXG4gICAgbWF0MyBtYXRyaXggPSBtYXQzKFxuICAgICAgICB1X2hpZ2hwWzBdLngsIHVfaGlnaHBbMF0ueSwgMC4wLFxuICAgICAgICB1X2hpZ2hwWzBdLnosIHVfaGlnaHBbMF0udywgMC4wLFxuICAgICAgICB1X2hpZ2hwWzFdLngsIHVfaGlnaHBbMV0ueSwgMS4wXG4gICAgKTtcblxuICAgIHZlYzIgc2l6ZSAgICAgPSB1X2hpZ2hwWzFdLnp3O1xuICAgIHZlYzIgdmlld3BvcnQgPSB2ZWMyKHVfaGlnaHBbMl0ueCwgdV9oaWdocFsyXS55KTtcblxuICAgIHZlYzIgcG9zaXRpb24gPSB2ZWMyKGFfdmVydGV4LngsIDEuMCAtIGFfdmVydGV4LnkpO1xuICAgIHBvc2l0aW9uID0gcG9zaXRpb24gKiBzaXplO1xuICAgIHBvc2l0aW9uID0gKG1hdHJpeCAqIHZlYzMocG9zaXRpb24sIDEuMCkpLnh5O1xuICAgIHBvc2l0aW9uIC89IHZpZXdwb3J0O1xuXG4gICAgcG9zaXRpb24gPSBwb3NpdGlvbiAqIDIuMCAtIDEuMDtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24ueCwgLXBvc2l0aW9uLnksIDAuMCwgMS4wKTtcbn0iLFl0KGUpKTtyZXR1cm4gSHQuc2V0KHQsbiksbn0sZm49KGUsdCxuKT0+e2NvbnN0IGE9ZS5oaWdocCxzPXIuJG1hdHJpeDthWzBdPXNbMF0sYVsxXT1zWzFdLGFbMl09c1szXSxhWzNdPXNbNF0sYVs0XT1zWzZdLGFbNV09c1s3XSxhWzZdPXQsYVs3XT1uLGFbOF09eCgpLGFbOV09RSgpfTtsZXQgbW49MDtjb25zdCB2bj1lPT57ZS51c2VQcm9ncmFtKCksZS5iaW5kVW5pZm9ybSgpLHZ0KHh0KSxuLmJpbmRCdWZmZXIobi5BUlJBWV9CVUZGRVIsZ3QpLHF0LmJ1ZmZlci5sZW5ndGg+bW4mJihtbj1xdC5idWZmZXIubGVuZ3RoLG4uYnVmZmVyRGF0YShuLkFSUkFZX0JVRkZFUiw0Km1uLG4uRFlOQU1JQ19EUkFXKSksbi5idWZmZXJTdWJEYXRhKG4uQVJSQVlfQlVGRkVSLDAscXQuYnVmZmVyLnN1YmFycmF5KDAscXQub2Zmc2V0KSksbi5kcmF3QXJyYXlzSW5zdGFuY2VkKG4uVFJJQU5HTEVTLDAsNixlLmNvdW50KX0sX249KCk9Pns2MDMhPT1MdCgpJiYoSXQoNjAzKSxuLmJsZW5kRnVuYyhuLlpFUk8sbi5PTkVfTUlOVVNfU1JDX0FMUEhBKSl9LHBuPWU9Pntzd2l0Y2goZSl7Y2FzZSJhZGQiOjYxMSE9PUx0KCkmJihJdCg2MTEpLG4uYmxlbmRGdW5jKG4uT05FLG4uT05FKSk7YnJlYWs7Y2FzZSJzY3JlZW4iOjY0MSE9PUx0KCkmJihJdCg2NDEpLG4uYmxlbmRGdW5jKG4uT05FX01JTlVTX0RTVF9DT0xPUixuLk9ORSkpO2JyZWFrO2Nhc2UiYWxwaGEiOjYwNiE9PUx0KCkmJihJdCg2MDYpLG4uYmxlbmRGdW5jKG4uWkVSTyxuLlNSQ19BTFBIQSkpO2JyZWFrO2Nhc2UiZXJhc2UiOl9uKCk7YnJlYWs7Y2FzZSJjb3B5Ijp1bigpO2JyZWFrO2RlZmF1bHQ6VXQoKX19LGduPWU9Pnt2YXIgdDsoZT0+e2d0PWUuY3JlYXRlQnVmZmVyKCl9KShlKSx0PSgoKT0+e2NvbnN0IGU9ZnQoKTtyZXR1cm4gdnQoZSksbi5iaW5kQnVmZmVyKG4uQVJSQVlfQlVGRkVSLGUudmVydGV4QnVmZmVyKSxuLmJ1ZmZlckRhdGEobi5BUlJBWV9CVUZGRVIsbmV3IEZsb2F0MzJBcnJheShbMCwwLDEsMCwxLDEsMCwwLDEsMSwwLDFdKSxuLlNUQVRJQ19EUkFXKSxuLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDApLG4udmVydGV4QXR0cmliUG9pbnRlcigwLDIsbi5GTE9BVCwhMSwwLDApLG4uYmluZEJ1ZmZlcihuLkFSUkFZX0JVRkZFUixndCksbi5idWZmZXJEYXRhKG4uQVJSQVlfQlVGRkVSLHF0LmJ1ZmZlci5sZW5ndGgsbi5EWU5BTUlDX0RSQVcpLG4uZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoMSksbi52ZXJ0ZXhBdHRyaWJQb2ludGVyKDEsNCxuLkZMT0FULCExLDg4LDApLG4udmVydGV4QXR0cmliRGl2aXNvcigxLDEpLG4uZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoMiksbi52ZXJ0ZXhBdHRyaWJQb2ludGVyKDIsNCxuLkZMT0FULCExLDg4LDE2KSxuLnZlcnRleEF0dHJpYkRpdmlzb3IoMiwxKSxuLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDMpLG4udmVydGV4QXR0cmliUG9pbnRlcigzLDIsbi5GTE9BVCwhMSw4OCwzMiksbi52ZXJ0ZXhBdHRyaWJEaXZpc29yKDMsMSksbi5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSg0KSxuLnZlcnRleEF0dHJpYlBvaW50ZXIoNCw0LG4uRkxPQVQsITEsODgsNDApLG4udmVydGV4QXR0cmliRGl2aXNvcig0LDEpLG4uZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoNSksbi52ZXJ0ZXhBdHRyaWJQb2ludGVyKDUsNCxuLkZMT0FULCExLDg4LDU2KSxuLnZlcnRleEF0dHJpYkRpdmlzb3IoNSwxKSxuLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDYpLG4udmVydGV4QXR0cmliUG9pbnRlcig2LDQsbi5GTE9BVCwhMSw4OCw3Miksbi52ZXJ0ZXhBdHRyaWJEaXZpc29yKDYsMSksZX0pKCkseHQ9dH0seG49KGUsdCxyLGE9ITEpPT57Y29uc3Qgcz11ZShlLHQsYSk7cmV0dXJuIG4udGV4U3ViSW1hZ2UyRChuLlRFWFRVUkVfMkQsMCwwLDAsZSx0LG4uUkdCQSxuLlVOU0lHTkVEX0JZVEUsciksc30sRW49KGUsdCk9Pntjb25zdCByPSgoZSx0LHIsYT0hMSk9Pntjb25zdCBzPXVlKGUsdCxhKTtyZXR1cm4gbi50ZXhTdWJJbWFnZTJEKG4uVEVYVFVSRV8yRCwwLDAsMCxuLlJHQkEsbi5VTlNJR05FRF9CWVRFLHIpLHN9KShlLncsZS5oLHQpLGE9cm4oKTthbihhLGUudyxlLmgpLFV0KCksc24oYSksTChyKX0seW49W10sQW49bmV3IE1hcCxUbj0oZSx0LG4pPT57a2UoZSwhMCk7Y29uc3Qgcj1NYXRoLmNlaWwoLjUqbiksYT0xLShyLS41Km4pLHM9MStuLG89KGU9Pntjb25zdCB0PWBiJHtlfWA7aWYoQW4uaGFzKHQpKXJldHVybiBBbi5nZXQodCk7Y29uc3Qgbj1uZXcgd3QoIiN2ZXJzaW9uIDMwMCBlc1xuXG5sYXlvdXQgKGxvY2F0aW9uID0gMCkgaW4gdmVjMiBhX3ZlcnRleDtcblxub3V0IHZlYzIgdl9jb29yZDtcblxudm9pZCBtYWluKCkge1xuICAgIHZfY29vcmQgPSBhX3ZlcnRleDtcblxuICAgIHZlYzIgcG9zaXRpb24gPSBhX3ZlcnRleCAqIDIuMCAtIDEuMDtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuMCwgMS4wKTtcbn0iLChlPT57Y29uc3QgdD1lLnRvRml4ZWQoMSk7cmV0dXJuYCN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cbnVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4dHVyZTtcbnVuaWZvcm0gdmVjNCB1X21lZGl1bXA7XG5cbmluIHZlYzIgdl9jb29yZDtcbm91dCB2ZWM0IG9fY29sb3I7XG5cbnZvaWQgbWFpbigpIHtcbiAgICB2ZWMyICBvZmZzZXQgICA9IHVfbWVkaXVtcC54eTtcbiAgICBmbG9hdCBmcmFjdGlvbiA9IHVfbWVkaXVtcC56O1xuICAgIGZsb2F0IHNhbXBsZXMgID0gdV9tZWRpdW1wLnc7XG4gICAgXG4gICAgdmVjNCBjb2xvciA9IHRleHR1cmUodV90ZXh0dXJlLCB2X2Nvb3JkKTtcblxuICAgIGZvciAoZmxvYXQgaSA9IDEuMDsgaSA8ICR7dH07IGkgKz0gMS4wKSB7XG4gICAgICAgIGNvbG9yICs9IHRleHR1cmUodV90ZXh0dXJlLCB2X2Nvb3JkICsgb2Zmc2V0ICogaSk7XG4gICAgICAgIGNvbG9yICs9IHRleHR1cmUodV90ZXh0dXJlLCB2X2Nvb3JkIC0gb2Zmc2V0ICogaSk7XG4gICAgfVxuICAgIGNvbG9yICs9IHRleHR1cmUodV90ZXh0dXJlLCB2X2Nvb3JkICsgb2Zmc2V0ICogJHt0fSkgKiBmcmFjdGlvbjtcbiAgICBjb2xvciArPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdl9jb29yZCAtIG9mZnNldCAqICR7dH0pICogZnJhY3Rpb247XG4gICAgY29sb3IgLz0gc2FtcGxlcztcblxuICAgIG9fY29sb3IgPSBjb2xvcjtcbn1gfSkoZSkpO3JldHVybiBBbi5zZXQodCxuKSxufSkocik7KChlLHQsbixyLGEscyk9Pntjb25zdCBvPWUubWVkaXVtcDtyPyhvWzBdPTEvdCxvWzFdPTApOihvWzBdPTAsb1sxXT0xL24pLG9bMl09YSxvWzNdPXN9KShvLGUud2lkdGgsZS5oZWlnaHQsdCxhLHMpLHNuKG8pfSxSbj17eDowLHk6MH0sTW49KGUsdCxuKT0+KGU+PjE2KSoobj90OjEpLzI1NSx3bj0oZSx0LG4pPT4oZT4+OCYyNTUpKihuP3Q6MSkvMjU1LEZuPShlLHQsbik9PigyNTUmZSkqKG4/dDoxKS8yNTUsJG49Wy41LDEuMDUsMS40LDEuNTUsMS43NSwxLjksMiwyLjE1LDIuMiwyLjMsMi41LDMsMywzLjUsMy41XSxPbj0oZSx0LG49NCxhPTQscz0xLG89ITApPT57Y29uc3QgaT1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0LGM9TWF0aC5zcXJ0KHRbMF0qdFswXSt0WzFdKnRbMV0pLGw9TWF0aC5zcXJ0KHRbMl0qdFsyXSt0WzNdKnRbM10pLHU9QSgpLGg9biooYy91KSxiPWEqKGwvdSksZD0kbltzLTFdLGY9TWF0aC5yb3VuZChoKmQpLG09TWF0aC5yb3VuZChiKmQpO1JuLngrPWYsUm4ueSs9bTtjb25zdCB2PWUud2lkdGgrMipmLF89ZS5oZWlnaHQrMiptO2xldCBwPTEsZz0xO2g+MTI4P3A9LjA2MjU6aD42ND9wPS4xMjU6aD4zMj9wPS4yNTpoPjE2JiYocD0uNSksYj4xMjg/Zz0uMDYyNTpiPjY0P2c9LjEyNTpiPjMyP2c9LjI1OmI+MTYmJihnPS41KTtjb25zdCB4PU1hdGguY2VpbCh2KnApLEU9TWF0aC5jZWlsKF8qZykseT1oZSh4LEUsITEpLFQ9W3ksaGUoeCxFLCExKV07ci5iaW5kKHkpLHIucmVzZXQoKSxyLnNldFRyYW5zZm9ybShwLDAsMCxnLGYqcCxtKmcpLGtlKGUpO2NvbnN0IFI9ZG4oKTtmbihSLGUud2lkdGgsZS5oZWlnaHQpLHNuKFIpLG8mJkwoZSk7Y29uc3QgTT1oKnAsdz1iKmc7bGV0IEY9MCwkPXkudGV4dHVyZTtrZSgkLCEwKSx1bigpO2ZvcihsZXQgZT0wO2U8czsrK2Upe2lmKG4+MCl7Rj0oRisxKSUyO2NvbnN0IGU9VFtGXTtyLmJpbmQoZSksVG4oJCwhMCxNKSwkPWUudGV4dHVyZX1pZihhPjApe0Y9KEYrMSklMjtjb25zdCBlPVRbRl07ci5iaW5kKGUpLFRuKCQsITEsdyksJD1lLnRleHR1cmV9fWlmKFV0KCksMSE9PXB8fDEhPT1nKXtjb25zdCBlPWhlKHYsXywhMSk7ci5iaW5kKGUpLHIuc2V0VHJhbnNmb3JtKDEvcCwwLDAsMS9nLDAsMCksa2UoJCwhMCksZm4oUiwkLndpZHRoLCQuaGVpZ2h0KSxzbihSKSwkPWUudGV4dHVyZSxlZShUWzBdKSxlZShUWzFdKSxlZShlLCExKX1lbHNlIEY9KEYrMSklMixlZShUW0ZdKSxGPShGKzEpJTIsZWUoVFtGXSwhMSk7cmV0dXJuIGkmJnIuYmluZChpKSwkfSxTbj0oZSx0KT0+e2NvbnN0IG49ci5jdXJyZW50QXR0YWNobWVudE9iamVjdCxhPWhlKGUud2lkdGgsZS5oZWlnaHQsITEpO3IuYmluZChhKSxyLnJlc2V0KCksci5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLGtlKGUpLFV0KCk7Y29uc3Qgcz0oKCk9PntpZihBbi5oYXMoIm0iKSlyZXR1cm4gQW4uZ2V0KCJtIik7Y29uc3QgZT1uZXcgd3QoIiN2ZXJzaW9uIDMwMCBlc1xuXG5sYXlvdXQgKGxvY2F0aW9uID0gMCkgaW4gdmVjMiBhX3ZlcnRleDtcblxub3V0IHZlYzIgdl9jb29yZDtcblxudm9pZCBtYWluKCkge1xuICAgIHZfY29vcmQgPSBhX3ZlcnRleDtcblxuICAgIHZlYzIgcG9zaXRpb24gPSBhX3ZlcnRleCAqIDIuMCAtIDEuMDtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuMCwgMS4wKTtcbn0iLCIjdmVyc2lvbiAzMDAgZXNcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXG51bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmU7XG51bmlmb3JtIHZlYzQgdV9tZWRpdW1wWzVdO1xuXG5pbiB2ZWMyIHZfY29vcmQ7XG5vdXQgdmVjNCBvX2NvbG9yO1xuXG52b2lkIG1haW4oKSB7XG4gICAgbWF0NCBtdWwgPSBtYXQ0KHVfbWVkaXVtcFswXSwgdV9tZWRpdW1wWzFdLCB1X21lZGl1bXBbMl0sIHVfbWVkaXVtcFszXSk7XG4gICAgdmVjNCBhZGQgPSB1X21lZGl1bXBbNF07XG4gICAgXG4gICAgdmVjNCBjb2xvciA9IHRleHR1cmUodV90ZXh0dXJlLCB2X2Nvb3JkKTtcblxuICAgIGNvbG9yLnJnYiAvPSBtYXgoMC4wMDAxLCBjb2xvci5hKTtcbiAgICBjb2xvciA9IGNsYW1wKGNvbG9yICogbXVsICsgYWRkLCAwLjAsIDEuMCk7XG4gICAgY29sb3IucmdiICo9IGNvbG9yLmE7XG5cbiAgICBvX2NvbG9yID0gY29sb3I7XG59Iik7cmV0dXJuIEFuLnNldCgibSIsZSksZX0pKCk7KChlLHQpPT57Y29uc3Qgbj1lLm1lZGl1bXA7blswXT10WzBdLG5bMV09dFsxXSxuWzJdPXRbMl0sblszXT10WzNdLG5bNF09dFs1XSxuWzVdPXRbNl0sbls2XT10WzddLG5bN109dFs4XSxuWzhdPXRbMTBdLG5bOV09dFsxMV0sblsxMF09dFsxMl0sblsxMV09dFsxM10sblsxMl09dFsxNV0sblsxM109dFsxNl0sblsxNF09dFsxN10sblsxNV09dFsxOF0sblsxNl09dFs0XS8yNTUsblsxN109dFs5XS8yNTUsblsxOF09dFsxNF0vMjU1LG5bMTldPXRbMTldLzI1NX0pKHMsdCksc24ocyk7Y29uc3Qgbz1hLnRleHR1cmU7cmV0dXJuIEwoZSksZWUoYSwhMSksbiYmci5iaW5kKG4pLG99LGtuPShlLHQsbixyLGEscyk9Pntjb25zdCBvPWU/ImJsdXIuYSA9IDEuMCAtIGJsdXIuYTsiOiIiLGk9bj8oYz1zLGBcbiAgICBmbG9hdCBzdHJlbmd0aCA9IHVfbWVkaXVtcFske01hdGguZmxvb3IoYy80KX1dWyR7YyU0fV07XG4gICAgYmx1ci5hID0gY2xhbXAoYmx1ci5hICogc3RyZW5ndGgsIDAuMCwgMS4wKTtcbmApOiIiO3ZhciBjO2NvbnN0IGw9cj8oZT0+YFxuICAgIGJsdXIgPSB0ZXh0dXJlKHVfdGV4dHVyZXNbJHtlPzI6MX1dLCB2ZWMyKGJsdXIuYSwgMC41KSk7XG5gKSh0KTooZT0+YFxuICAgIHZlYzQgY29sb3IgPSB1X21lZGl1bXBbJHtlfV07XG4gICAgYmx1ciA9IGNvbG9yICogYmx1ci5hO1xuYCkoYSk7cmV0dXJuYFxuICAgICR7b31cbiAgICAke2l9XG4gICAgJHtsfVxuYH0sQ249KGUsdCxuLHIsYSxzKT0+e2NvbnN0IG89dD8iXG4gICAgdmVjMiBwcSA9ICgxLjAgLSB2X2Nvb3JkKSAqIGJsdXJfc2NhbGUgLSBibHVyX29mZnNldDtcbiAgICB2ZWM0IGJsdXIyID0gbWl4KHZlYzQoMC4wKSwgdGV4dHVyZSh1X3RleHR1cmVzWzBdLCBwcSksIGlzSW5zaWRlKHBxKSk7XG4iOiJcbiAgICB2ZWM0IGJsdXIyID0gdGV4dHVyZSh1X3RleHR1cmVzWzBdLCAxLjAgLSB2X2Nvb3JkKTtcbiIsaT1uPyhjPXMsYFxuICAgIGZsb2F0IHN0cmVuZ3RoID0gdV9tZWRpdW1wWyR7TWF0aC5mbG9vcihjLzQpfV1bJHtjJTR9XTtcbiAgICBoaWdobGlnaHRfYWxwaGEgKj0gc3RyZW5ndGg7XG4gICAgc2hhZG93X2FscGhhICAgICo9IHN0cmVuZ3RoO1xuYCk6IiI7dmFyIGM7Y29uc3QgbD1yPyhlPT5gXG4gICAgYmx1ciA9IHRleHR1cmUodV90ZXh0dXJlc1ske2U/MjoxfV0sIHZlYzIoXG4gICAgICAgIDAuNTAxOTYwNzg0MzEzNzI1NSAtIDAuNTAxOTYwNzg0MzEzNzI1NSAqIHNoYWRvd19hbHBoYSArIDAuNDk4MDM5MjE1Njg2Mjc0NSAqIGhpZ2hsaWdodF9hbHBoYSxcbiAgICAgICAgMC41XG4gICAgKSk7XG5gKShlKTooZT0+YFxuICAgIHZlYzQgaGlnaGxpZ2h0X2NvbG9yID0gdV9tZWRpdW1wWyR7ZX1dO1xuICAgIHZlYzQgc2hhZG93X2NvbG9yICAgID0gdV9tZWRpdW1wWyR7ZSsxfV07XG4gICAgYmx1ciA9IGhpZ2hsaWdodF9jb2xvciAqIGhpZ2hsaWdodF9hbHBoYSArIHNoYWRvd19jb2xvciAqIHNoYWRvd19hbHBoYTtcbmApKGEpO3JldHVybmBcbiAgICAke299XG4gICAgZmxvYXQgaGlnaGxpZ2h0X2FscGhhID0gYmx1ci5hIC0gYmx1cjIuYTtcbiAgICBmbG9hdCBzaGFkb3dfYWxwaGEgICAgPSBibHVyMi5hIC0gYmx1ci5hO1xuICAgICR7aX1cbiAgICBoaWdobGlnaHRfYWxwaGEgPSBjbGFtcChoaWdobGlnaHRfYWxwaGEsIDAuMCwgMS4wKTtcbiAgICBzaGFkb3dfYWxwaGEgICAgPSBjbGFtcChzaGFkb3dfYWxwaGEsIDAuMCwgMS4wKTtcbiAgICAke2x9XG5gfSxQbj0oZSx0LG4scixhLHMsbyk9Pntjb25zdCBpPWBmJHtlPyJ5IjoibiJ9JHt0PyJ5IjoibiJ9JHtuPyJ5IjoibiJ9JHtyfSR7YT8ieSI6Im4ifSR7cz8ieSI6Im4ifWA7aWYoQW4uaGFzKGkpKXJldHVybiBBbi5nZXQoaSk7bGV0IGM9MTtlJiZjKyssbyYmYysrO2xldCBsPShlPzQ6MCkrKHQ/NDowKSsocz8xOjApO298fChsKz1uPzQ6OCksbD1NYXRoLmNlaWwobC80KTtjb25zdCB1PW5ldyB3dCgiI3ZlcnNpb24gMzAwIGVzXG5cbmxheW91dCAobG9jYXRpb24gPSAwKSBpbiB2ZWMyIGFfdmVydGV4O1xuXG5vdXQgdmVjMiB2X2Nvb3JkO1xuXG52b2lkIG1haW4oKSB7XG4gICAgdl9jb29yZCA9IGFfdmVydGV4O1xuXG4gICAgdmVjMiBwb3NpdGlvbiA9IGFfdmVydGV4ICogMi4wIC0gMS4wO1xuICAgIGdsX1Bvc2l0aW9uID0gdmVjNChwb3NpdGlvbiwgMC4wLCAxLjApO1xufSIsKChlLHQsbixyLGEscyxvLGksYyk9PntsZXQgbD0wO2NvbnN0IHU9bj8oZT0+YFxuICAgIHZlYzIgYmFzZV9zY2FsZSAgPSB1X21lZGl1bXBbJHtlfV0ueHk7XG4gICAgdmVjMiBiYXNlX29mZnNldCA9IHVfbWVkaXVtcFske2V9XS56dztcblxuICAgIHZlYzIgdXYgPSB2X2Nvb3JkICogYmFzZV9zY2FsZSAtIGJhc2Vfb2Zmc2V0O1xuICAgIHZlYzQgYmFzZSA9IG1peCh2ZWM0KDAuMCksIHRleHR1cmUodV90ZXh0dXJlc1sxXSwgdXYpLCBpc0luc2lkZSh1dikpO1xuYCkobCsrKToiIixoPXI/KGU9PmBcbiAgICB2ZWMyIGJsdXJfc2NhbGUgID0gdV9tZWRpdW1wWyR7ZX1dLnh5O1xuICAgIHZlYzIgYmx1cl9vZmZzZXQgPSB1X21lZGl1bXBbJHtlfV0uenc7XG5cbiAgICB2ZWMyIHN0ID0gdl9jb29yZCAqIGJsdXJfc2NhbGUgLSBibHVyX29mZnNldDtcbiAgICB2ZWM0IGJsdXIgPSBtaXgodmVjNCgwLjApLCB0ZXh0dXJlKHVfdGV4dHVyZXNbMF0sIHN0KSwgaXNJbnNpZGUoc3QpKTtcbmApKGwrKyk6IlxuICAgIHZlYzQgYmx1ciA9IHRleHR1cmUodV90ZXh0dXJlc1swXSwgdl9jb29yZCk7XG4iLGI9ImlubmVyIj09PXMsZD1sO2xldCBmLG0sdj00Kmw7c3dpdGNoKGM/Zj1hP2tuKCExLG4saSxjLGQsdik6Q24obixyLGksYyxkLHYpOmE/KHYrPTQsZj1rbihiLG4saSxjLGQsdikpOih2Kz04LGY9Q24obixyLGksYyxkLHYpKSxzKXtjYXNlIm91dGVyIjptPW8/ImJsdXIgLSBibHVyICogYmFzZS5hIjoiYmFzZSArIGJsdXIgLSBibHVyICogYmFzZS5hIjticmVhaztjYXNlImZ1bGwiOm09bz8iYmx1ciI6ImJhc2UgLSBiYXNlICogYmx1ci5hICsgYmx1ciI7YnJlYWs7ZGVmYXVsdDptPSJibHVyIn1yZXR1cm5gI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblxudW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlc1ske2V9XTtcbnVuaWZvcm0gdmVjNCB1X21lZGl1bXBbJHt0fV07XG5cbmluIHZlYzIgdl9jb29yZDtcbm91dCB2ZWM0IG9fY29sb3I7XG5cblxuZmxvYXQgaXNJbnNpZGUoaW4gdmVjMiB1dikge1xuICAgIHJldHVybiBzdGVwKDQuMCwgZG90KHN0ZXAodmVjNCgwLjAsIHV2LngsIDAuMCwgdXYueSksIHZlYzQodXYueCwgMS4wLCB1di55LCAxLjApKSwgdmVjNCgxLjApKSk7XG59XG5cbnZvaWQgbWFpbigpIHtcbiAgICAke3V9XG4gICAgJHtofVxuICAgICR7Zn1cbiAgICBvX2NvbG9yID0gJHttfTtcbn1gfSkoYyxsLGUsdCxuLHIsYSxzLG8pKTtyZXR1cm4gQW4uc2V0KGksdSksdX0sQm49bmV3IE1hcCxJbj0oZSx0KT0+e2NvbnN0IG49YGwkeygiMDAiK2UpLnNsaWNlKC0zKX0ke3Q/InkiOiJuIn1gO2lmKEJuLmhhcyhuKSlyZXR1cm4gQm4uZ2V0KG4pO2NvbnN0IHI9TWF0aC5jZWlsKDUqZS80KSxhPW5ldyB3dCgiI3ZlcnNpb24gMzAwIGVzXG5cbmxheW91dCAobG9jYXRpb24gPSAwKSBpbiB2ZWMyIGFfdmVydGV4O1xuXG5vdXQgdmVjMiB2X2Nvb3JkO1xuXG52b2lkIG1haW4oKSB7XG4gICAgdl9jb29yZCA9IGFfdmVydGV4O1xuXG4gICAgdmVjMiBwb3NpdGlvbiA9IGFfdmVydGV4ICogMi4wIC0gMS4wO1xuICAgIGdsX1Bvc2l0aW9uID0gdmVjNChwb3NpdGlvbiwgMC4wLCAxLjApO1xufSIsKChlLHQsbik9PntsZXQgcj0iIjtmb3IobGV0IGU9MTtlPHQ7KytlKXtjb25zdCBuPWUtMSxhPWUscz1gdV9tZWRpdW1wWyR7dCtNYXRoLmZsb29yKG4vNCl9XVske24lNH1dYCxvPWB1X21lZGl1bXBbJHt0K01hdGguZmxvb3IoYS80KX1dWyR7YSU0fV1gO3IrPWBcbiAgICBpZiAodCA8PSAke299KSB7XG4gICAgICAgIHJldHVybiBtaXgodV9tZWRpdW1wWyR7bn1dLCB1X21lZGl1bXBbJHthfV0sICh0IC0gJHtzfSkgLyAoJHtvfSAtICR7c30pKTtcbiAgICB9XG5gfXJldHVybmAjdmVyc2lvbiAzMDAgZXNcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXG51bmlmb3JtIHZlYzQgdV9tZWRpdW1wWyR7ZX1dO1xuXG5pbiB2ZWMyIHZfY29vcmQ7XG5vdXQgdmVjNCBvX2NvbG9yO1xuXG52ZWM0IGdldEdyYWRpZW50Q29sb3IoaW4gZmxvYXQgdCkge1xuICAgIGlmICh0IDw9IHVfbWVkaXVtcFske3R9XVswXSkge1xuICAgICAgICByZXR1cm4gdV9tZWRpdW1wWzBdO1xuICAgIH1cbiAgICAke3J9XG4gICAgcmV0dXJuIHVfbWVkaXVtcFske3QtMX1dO1xufVxuXG52b2lkIG1haW4oKSB7XG4gICAgdmVjNCBjb2xvciA9IGdldEdyYWRpZW50Q29sb3Iodl9jb29yZC54KTtcbiAgICAke24/ImNvbG9yID0gcG93KGNvbG9yLCB2ZWM0KDAuNDU0NTQ1NDUpKTsiOiIifVxuICAgIGNvbG9yLnJnYiAqPSBjb2xvci5hO1xuXG4gICAgb19jb2xvciA9IGNvbG9yO1xufWB9KShyLGUsdCkpO3JldHVybiBCbi5zZXQobixhKSxhfSxMbj0oZSx0LG4scixhLHMpPT57Y29uc3Qgbz1lLm1lZGl1bXA7bGV0IGk9MDtmb3IobGV0IGU9YTtlPHM7ZSsrKXtjb25zdCB0PW5bZV07b1tpKytdPSh0Pj4xNikvMjU1LG9baSsrXT0odD4+OCYyNTUpLzI1NSxvW2krK109KDI1NSZ0KS8yNTUsb1tpKytdPXJbZV19Zm9yKGxldCBlPWE7ZTxzO2UrKylvW2krK109dFtlXS8yNTV9O2xldCBVbjtjb25zdCBObj0oZSx0KT0+KFVuP3B0WzBdPT09ZSYmcHRbNF09PT10fHwocHRbMF09ZSxwdFsyXT1lLHB0WzRdPXQscHRbNl09dCxuLmJ1ZmZlclN1YkRhdGEobi5BUlJBWV9CVUZGRVIsMCxwdCkpOlVuPSgoZSx0KT0+e2NvbnN0IHI9ZnQoKTtyZXR1cm4gdnQociksbi5iaW5kQnVmZmVyKG4uQVJSQVlfQlVGRkVSLHIudmVydGV4QnVmZmVyKSxwdFswXT1lLHB0WzJdPWUscHRbNF09dCxwdFs2XT10LG4uYnVmZmVyRGF0YShuLkFSUkFZX0JVRkZFUixwdCxuLlNUQVRJQ19EUkFXKSxuLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDApLG4udmVydGV4QXR0cmliUG9pbnRlcigwLDIsbi5GTE9BVCwhMSwwLDApLHJ9KShlLHQpLFVuKSxEbj0oZSx0LHIpPT57ZS51c2VQcm9ncmFtKCksZS5iaW5kVW5pZm9ybSgpLHZ0KE5uKHQscikpLG4uZHJhd0FycmF5cyhuLlRSSUFOR0xFX1NUUklQLDAsNCl9O2xldCBqbj1udWxsO2NvbnN0IHpuPSgpPT4oam58fChqbj1oZSg1MTIsMSwhMSkpLGpuKTtsZXQgWG49MDtjb25zdCBXbj0oKT0+WG4sR249bmV3IEZsb2F0MzJBcnJheSgyNTYpLFZuPW5ldyBGbG9hdDMyQXJyYXkoMjU2KTtmb3IobGV0IGU9MDtlPDI1NjsrK2Upe2NvbnN0IHQ9ZS8yNTU7R25bZV09TWF0aC5wb3codCwyLjIzMzMzMzMzKSxWbltlXT10fWNvbnN0IFluPShlLHQsYSxzLG8saSxjLGwsdSxoLGIsZCxmLG0sdixfLHA9bnVsbCxnPW51bGwseD1udWxsLEU9MCx5PTAsQT0wLFQ9MCxSPTAsTT0wLHc9MCxGPTApPT57Y29uc3QgJD1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0LE89aGUoYSxzLCExKTtyLmJpbmQoTyk7Y29uc3QgUz0iaW5uZXIiPT09bSxrPW51bGwhPT1wJiZudWxsIT09ZyYmbnVsbCE9PXg7bGV0IEM9bnVsbDtpZihrJiYoQz0oKGUsdCxuKT0+e2NvbnN0IGE9ci5jdXJyZW50QXR0YWNobWVudE9iamVjdCxzPXpuKCk7ci5iaW5kKHMpO2NvbnN0IG89ZS5sZW5ndGg7dW4oKTtjb25zdCBpPVduKCk7Zm9yKGxldCByPTA7cjxvO3IrPWktMSl7Y29uc3QgYT1NYXRoLm1pbihyK2ksbykscz1JbihhLXIsITEpO0xuKHMsZSx0LG4scixhKSxEbihzLGVbcl0vMjU1LGVbYS0xXS8yNTUpfXJldHVybiBVdCgpLGEmJnIuYmluZChhKSxzLnRleHR1cmV9KShwLGcseCkpLFMpe3IucmVzZXQoKSxyLnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCksa2UoZSwhMCk7Y29uc3QgYT1ybigpO2FuKGEsZS53aWR0aCxlLmhlaWdodCksc24oYSksayYmQz8oKGUsdCxyPSExKT0+e1NlKDIsbi5URVhUVVJFMix0LHIpLFNlKDEsbi5URVhUVVJFMSxudWxsKSxTZSgwLG4uVEVYVFVSRTAsZSxyKX0pKHQsQywhMCk6a2UodCwhMCl9ZWxzZSBrJiZDPygoZSx0LHIsYT0hMSk9PntTZSgyLG4uVEVYVFVSRTIscixhKSxTZSgxLG4uVEVYVFVSRTEsdCxhKSxTZSgwLG4uVEVYVFVSRTAsZSxhKX0pKHQsZSxDLCEwKTpubih0LGUsITApO2NvbnN0IFA9IShTfHwiZnVsbCI9PT1tJiZ2KSxCPSEoYT09PXUmJnM9PT1oJiYwPT09YiYmMD09PWQpLEk9ISgxPT09Xyk7Uz92PzY3MCE9PUx0KCkmJihJdCg2NzApLG4uYmxlbmRGdW5jKG4uRFNUX0FMUEhBLG4uWkVSTykpOjY3MyE9PUx0KCkmJihJdCg2NzMpLG4uYmxlbmRGdW5jKG4uRFNUX0FMUEhBLG4uT05FX01JTlVTX1NSQ19BTFBIQSkpOnVuKCk7Y29uc3QgTD1QbihQLEIsZixtLHYsSSxrKTsoKGUsdCxuLHIsYSxzLG8saSxjLGwsdSxoLGIsZCxmLG0sdixfLHAsZyx4LEUseSxBLFQpPT57bGV0IFI7RT8oUj1lLnRleHR1cmVzLFJbMF09MCxSWzFdPTEsVCYmKFJbMl09MikpOlQmJihSPWUudGV4dHVyZXMsUlswXT0wLFJbMV09Mik7Y29uc3QgTT1lLm1lZGl1bXA7bGV0IHc9MDtFJiYoTVt3KytdPXQvcixNW3crK109bi9hLE1bdysrXT1zL3IsTVt3KytdPShuLWEtbykvYSkseSYmKE1bdysrXT10L2ksTVt3KytdPW4vYyxNW3crK109bC9pLE1bdysrXT0obi1jLXUpL2MpLFR8fChoPyhNW3crK109ZCxNW3crK109ZixNW3crK109bSxNW3crK109dik6KE1bdysrXT1kLE1bdysrXT1mLE1bdysrXT1tLE1bdysrXT12LE1bdysrXT1fLE1bdysrXT1wLE1bdysrXT1nLE1bdysrXT14KSksQSYmKE1bd109Yil9KShMLGEscyxvLGksYyxsLHUsaCxiLGQsZixfLEUseSxBLFQsUixNLHcsRixQLEIsSSxrKSxzbihMKTtjb25zdCBVPU8udGV4dHVyZTtyZXR1cm4gZWUoTywhMSksVXQoKSwkJiZyLmJpbmQoJCksVX0scW49KGUsdCxuPTAsYT0xLHM9NCxvPTQsaT0xLGM9MSxsPSExLHU9ITEpPT57Y29uc3QgaD1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0LGI9ZS53aWR0aCxkPWUuaGVpZ2h0LGY9Um4ueCxtPVJuLnksdj1PbihlLHQscyxvLGMsITEpLF89di53aWR0aCxwPXYuaGVpZ2h0LGc9Um4ueC1mLHg9Um4ueS1tLEU9WW4oZSx2LGw/YjpfLGw/ZDpwLGIsZCxsPzA6ZyxsPzA6eCxfLHAsbD8tZzowLGw/LXg6MCwhMCxsPyJpbm5lciI6Im91dGVyIix1LGksbnVsbCxudWxsLG51bGwsTW4obixhLCEwKSx3bihuLGEsITApLEZuKG4sYSwhMCksYSwwLDAsMCwwKTtyZXR1cm4gTChlKSxMKHYpLGgmJnIuYmluZChoKSxFfSxLbj1NYXRoLlBJLzE4MCxIbj0oZSx0LG49NCxhPTQ1LHM9MCxvPTEsaT00LGM9NCxsPTEsdT0xLGg9ITEsYj0hMSxkPSExKT0+e2NvbnN0IGY9ci5jdXJyZW50QXR0YWNobWVudE9iamVjdCxtPWUud2lkdGgsdj1lLmhlaWdodCxfPVJuLngscD1Sbi55LGc9T24oZSx0LGksYyx1LCExKSx4PWcud2lkdGgsRT1nLmhlaWdodCx5PVJuLngsVD1Sbi55LFI9eS1fLE09VC1wLHc9TWF0aC5zcXJ0KHRbMF0qdFswXSt0WzFdKnRbMV0pLEY9TWF0aC5zcXJ0KHRbMl0qdFsyXSt0WzNdKnRbM10pLCQ9QSgpLE89YSpLbixTPU1hdGguY29zKE8pKm4qKHcvJCksaz1NYXRoLnNpbihPKSpuKihGLyQpLEM9aD9tOngrTWF0aC5tYXgoMCxNYXRoLmFicyhTKS1SKSxQPWg/djpFK01hdGgubWF4KDAsTWF0aC5hYnMoayktTSksQj1NYXRoLmNlaWwoQyksST1NYXRoLmNlaWwoUCksVT0oQi1DKS8yLE49KEktUCkvMixEPWg/MDpNYXRoLm1heCgwLFItUykrVSxqPWg/MDpNYXRoLm1heCgwLE0taykrTix6PWg/Uy15OihTPjA/TWF0aC5tYXgoMCxTLVIpOjApK1UsWD1oP2stVDooaz4wP01hdGgubWF4KDAsay1NKTowKStOO2xldCBXLEc9IiI7aD8oRz0iaW5uZXIiLFc9Ynx8ZCk6IWImJmQ/KEc9ImZ1bGwiLFc9ITApOihHPSJvdXRlciIsVz1iKTtjb25zdCBWPVluKGUsZyxCLEksbSx2LEQsaix4LEUseixYLCEwLEcsVyxsLG51bGwsbnVsbCxudWxsLE1uKHMsbywhMCksd24ocyxvLCEwKSxGbihzLG8sITApLG8sMCwwLDAsMCk7cmV0dXJuIEwoZSksTChnKSxmJiZyLmJpbmQoZiksVn0sWm49TWF0aC5QSS8xODAsUW49KGUsdCxuPTQsYT00NSxzPTE2Nzc3MjE1LG89MSxpPTAsYz0xLGw9NCx1PTQsaD0xLGI9MSxkPTAsZj0hMSk9Pntjb25zdCBtPWUud2lkdGgsdj1lLmhlaWdodCxfPVJuLngscD1Sbi55LGc9TWF0aC5zcXJ0KHRbMF0qdFswXSt0WzFdKnRbMV0pLHg9TWF0aC5zcXJ0KHRbMl0qdFsyXSt0WzNdKnRbM10pLEU9QSgpLHk9YSpabixUPU1hdGguY29zKHkpKm4qKGcvRSksUj1NYXRoLnNpbih5KSpuKih4L0UpLE09ci5jdXJyZW50QXR0YWNobWVudE9iamVjdCx3PWhlKG0sdiwhMSk7ci5iaW5kKHcpLHIucmVzZXQoKSxyLnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCksa2UoZSk7Y29uc3QgRj1ybigpO2FuKEYsZS53aWR0aCxlLmhlaWdodCksc24oRiksci5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwyKlQsMipSKSxfbigpLGFuKEYsZS53aWR0aCxlLmhlaWdodCksc24oRiksVXQoKTtjb25zdCAkPXcudGV4dHVyZTtNJiZyLmJpbmQoTSk7Y29uc3QgTz1PbigkLHQsbCx1LGIsITEpO2VlKHcpO2NvbnN0IFM9Ty53aWR0aCxrPU8uaGVpZ2h0LEM9TWF0aC5jZWlsKFMrMipNYXRoLmFicyhUKSksUD1NYXRoLmNlaWwoaysyKk1hdGguYWJzKFIpKTtsZXQgQj0iIjtzd2l0Y2goZCl7Y2FzZSAwOkI9ImZ1bGwiO2JyZWFrO2Nhc2UgMTpCPSJpbm5lciI7YnJlYWs7Y2FzZSAyOkI9Im91dGVyIn1jb25zdCBJPSJpbm5lciI9PT1CLFU9ST9tOkMsTj1JP3Y6UCxEPU1hdGguYWJzKFQpLGo9TWF0aC5hYnMoUiksej0oUy1tKS8yLFg9KGstdikvMixXPUk/MDpEK3osRz1JPzA6aitYLFY9WW4oZSxPLFUsTixtLHYsVyxHLFMsayxJPy16LVQ6RC1ULEk/LVgtUjpqLVIsITEsQixmLGgsbnVsbCxudWxsLG51bGwsTW4ocyxvLCEwKSx3bihzLG8sITApLEZuKHMsbywhMCksbyxNbihpLGMsITApLHduKGksYywhMCksRm4oaSxjLCEwKSxjKTtyZXR1cm4gUm4ueD1fK1csUm4ueT1wK0csTChlKSxMKE8pLFZ9LEpuPU1hdGguUEkvMTgwLGVyPShlLHQsbj00LGE9NDUscyxvLGksYz00LGw9NCx1PTEsaD0xLGI9MCxkPSExKT0+e2NvbnN0IGY9ZS53aWR0aCxtPWUuaGVpZ2h0LHY9Um4ueCxfPVJuLnkscD1NYXRoLnNxcnQodFswXSp0WzBdK3RbMV0qdFsxXSksZz1NYXRoLnNxcnQodFsyXSp0WzJdK3RbM10qdFszXSkseD1BKCksRT1hKkpuLHk9TWF0aC5jb3MoRSkqbioocC94KSxUPU1hdGguc2luKEUpKm4qKGcveCksUj1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0LE09aGUoZixtLCExKTtyLmJpbmQoTSksci5yZXNldCgpLHIuc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKSxrZShlKTtjb25zdCB3PXJuKCk7YW4odyxlLndpZHRoLGUuaGVpZ2h0KSxzbih3KSxyLnNldFRyYW5zZm9ybSgxLDAsMCwxLDIqeSwyKlQpLF9uKCksYW4odyxlLndpZHRoLGUuaGVpZ2h0KSxzbih3KSxVdCgpO2NvbnN0IEY9TS50ZXh0dXJlO1ImJnIuYmluZChSKTtjb25zdCAkPU9uKEYsdCxjLGwsaCwhMSk7ZWUoTSk7Y29uc3QgTz0kLndpZHRoLFM9JC5oZWlnaHQsaz1NYXRoLmNlaWwoTysyKk1hdGguYWJzKHkpKSxDPU1hdGguY2VpbChTKzIqTWF0aC5hYnMoVCkpO2xldCBQPSIiO3N3aXRjaChiKXtjYXNlIDA6UD0iZnVsbCI7YnJlYWs7Y2FzZSAxOlA9ImlubmVyIjticmVhaztjYXNlIDI6UD0ib3V0ZXIifWNvbnN0IEI9ImlubmVyIj09PVAsST1CP2Y6ayxVPUI/bTpDLE49TWF0aC5hYnMoeSksRD1NYXRoLmFicyhUKSxqPShPLWYpLzIsej0oUy1tKS8yLFg9Qj8wOk4raixXPUI/MDpEK3osRz1ZbihlLCQsSSxVLGYsbSxYLFcsTyxTLEI/LWoteTpOLXksQj8tei1UOkQtVCwhMSxQLGQsdSxpLHMsbywwLDAsMCwwLDAsMCwwLDApO3JldHVybiBSbi54PXYrWCxSbi55PV8rVyxMKGUpLEwoJCksR30sdHI9TWF0aC5QSS8xODAsbnI9KGUsdCxuPTQscj00NSxhLHMsbyxpPTQsYz00LGw9MSx1PTEsaD0wLGI9ITEpPT57Y29uc3QgZD1lLndpZHRoLGY9ZS5oZWlnaHQsbT1Sbi54LHY9Um4ueSxfPU9uKGUsdCxpLGMsdSwhMSkscD1fLndpZHRoLGc9Xy5oZWlnaHQseD1Sbi54LEU9Um4ueSx5PXgtbSxUPUUtdixSPU1hdGguc3FydCh0WzBdKnRbMF0rdFsxXSp0WzFdKSxNPU1hdGguc3FydCh0WzJdKnRbMl0rdFszXSp0WzNdKSx3PUEoKSxGPXIqdHIsJD1NYXRoLmNvcyhGKSpuKihSL3cpLE89TWF0aC5zaW4oRikqbiooTS93KSxTPTE9PT1oLGs9Uz9kOnArTWF0aC5tYXgoMCxNYXRoLmFicygkKS15KSxDPVM/ZjpnK01hdGgubWF4KDAsTWF0aC5hYnMoTyktVCksUD1NYXRoLmNlaWwoayksQj1NYXRoLmNlaWwoQyksST0oUC1rKS8yLFU9KEItQykvMixOPVM/MDpNYXRoLm1heCgwLHktJCkrSSxEPVM/MDpNYXRoLm1heCgwLFQtTykrVSxqPVM/JC14OigkPjA/TWF0aC5tYXgoMCwkLXkpOjApK0ksej1TP08tRTooTz4wP01hdGgubWF4KDAsTy1UKTowKStVO2xldCBYPSIiO3N3aXRjaChoKXtjYXNlIDA6WD0iZnVsbCI7YnJlYWs7Y2FzZSAxOlg9ImlubmVyIjticmVhaztjYXNlIDI6WD0ib3V0ZXIifWNvbnN0IFc9WW4oZSxfLFAsQixkLGYsTixELHAsZyxqLHosITAsWCxiLGwsbyxhLHMsMCwwLDAsMCwwLDAsMCwwKTtyZXR1cm4gUm4ueD1tK04sUm4ueT12K0QsTChlKSxMKF8pLFd9LHJyPShlLHQsbixyKT0+e2NvbnN0IGE9YGMkeygiMCIrZSkuc2xpY2UoLTIpfSR7KCIwIit0KS5zbGljZSgtMil9JHtuPyJ5IjoibiJ9JHtyPyJ5IjoibiJ9YDtpZihBbi5oYXMoYSkpcmV0dXJuIEFuLmdldChhKTtjb25zdCBzPShyPzE6MikrTWF0aC5jZWlsKGUqdC80KSxvPW5ldyB3dCgiI3ZlcnNpb24gMzAwIGVzXG5cbmxheW91dCAobG9jYXRpb24gPSAwKSBpbiB2ZWMyIGFfdmVydGV4O1xuXG5vdXQgdmVjMiB2X2Nvb3JkO1xuXG52b2lkIG1haW4oKSB7XG4gICAgdl9jb29yZCA9IGFfdmVydGV4O1xuXG4gICAgdmVjMiBwb3NpdGlvbiA9IGFfdmVydGV4ICogMi4wIC0gMS4wO1xuICAgIGdsX1Bvc2l0aW9uID0gdmVjNChwb3NpdGlvbiwgMC4wLCAxLjApO1xufSIsKChlLHQsbixyLGEpPT57Y29uc3Qgcz1NYXRoLmZsb29yKC41KnQpLG89TWF0aC5mbG9vciguNSpuKSxpPXQqbjtsZXQgYz0iIjtjb25zdCBsPWE/MToyO2ZvcihsZXQgZT0wO2U8aTsrK2UpYys9YFxuICAgIHJlc3VsdCArPSBnZXRXZWlnaHRlZENvbG9yKCR7ZX0sIHVfbWVkaXVtcFske2wrTWF0aC5mbG9vcihlLzQpfV1bJHtlJTR9XSk7XG5gO3JldHVybmAjdmVyc2lvbiAzMDAgZXNcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXG51bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmU7XG51bmlmb3JtIHZlYzQgdV9tZWRpdW1wWyR7ZX1dO1xuXG5pbiB2ZWMyIHZfY29vcmQ7XG5vdXQgdmVjNCBvX2NvbG9yO1xuXG5cbmZsb2F0IGlzSW5zaWRlKGluIHZlYzIgdXYpIHtcbiAgICByZXR1cm4gc3RlcCg0LjAsIGRvdChzdGVwKHZlYzQoMC4wLCB1di54LCAwLjAsIHV2LnkpLCB2ZWM0KHV2LngsIDEuMCwgdXYueSwgMS4wKSksIHZlYzQoMS4wKSkpO1xufVxuXG52ZWM0IGdldFdlaWdodGVkQ29sb3IgKGluIGludCBpLCBpbiBmbG9hdCB3ZWlnaHQpIHtcbiAgICB2ZWMyIHJjcF9zaXplID0gdV9tZWRpdW1wWzBdLnh5O1xuXG4gICAgaW50IGlfZGl2X3ggPSBpIC8gJHt0fTtcbiAgICBpbnQgaV9tb2RfeCA9IGkgLSAke3R9ICogaV9kaXZfeDtcbiAgICB2ZWMyIG9mZnNldCA9IHZlYzIoaV9tb2RfeCAtICR7c30sICR7b30gLSBpX2Rpdl94KTtcbiAgICB2ZWMyIHV2ID0gdl9jb29yZCArIG9mZnNldCAqIHJjcF9zaXplO1xuXG4gICAgdmVjNCBjb2xvciA9IHRleHR1cmUodV90ZXh0dXJlLCB1dik7XG4gICAgY29sb3IucmdiIC89IG1heCgwLjAwMDEsIGNvbG9yLmEpO1xuICAgICR7YT8iIjoiXG4gICAgdmVjNCBzdWJzdGl0dXRlX2NvbG9yID0gdV9tZWRpdW1wWzFdO1xuICAgIGNvbG9yID0gbWl4KHN1YnN0aXR1dGVfY29sb3IsIGNvbG9yLCBpc0luc2lkZSh1dikpO1xuIn1cblxuICAgIHJldHVybiBjb2xvciAqIHdlaWdodDtcbn1cblxudm9pZCBtYWluKCkge1xuICAgIGZsb2F0IHJjcF9kaXZpc29yID0gdV9tZWRpdW1wWzBdLno7XG4gICAgZmxvYXQgYmlhcyAgICAgICAgPSB1X21lZGl1bXBbMF0udztcblxuICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwLjApO1xuICAgICR7Y31cbiAgICByZXN1bHQgPSBjbGFtcChyZXN1bHQgKiByY3BfZGl2aXNvciArIGJpYXMsIDAuMCwgMS4wKTtcbiAgICAke3I/InJlc3VsdC5hID0gdGV4dHVyZSh1X3RleHR1cmUsIHZfY29vcmQpLmE7IjoiIn1cblxuICAgIHJlc3VsdC5yZ2IgKj0gcmVzdWx0LmE7XG4gICAgb19jb2xvciA9IHJlc3VsdDtcbn1gfSkocyxlLHQsbixyKSk7cmV0dXJuIEFuLnNldChhLG8pLG99LGFyPShlLHQ9MCxuPTAsYSxzPTEsbz0wLGk9ITAsYz0hMCxsPTAsdT0wKT0+e2NvbnN0IGg9ci5jdXJyZW50QXR0YWNobWVudE9iamVjdCxiPWUud2lkdGgsZD1lLmhlaWdodCxmPWhlKGIsZCwhMSk7ci5iaW5kKGYpLHIucmVzZXQoKSxyLnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCksa2UoZSwhMCksVXQoKTtjb25zdCBtPXJyKHQsbixpLGMpOygoZSx0LG4scixhLHMsbyxpLGMsbCx1KT0+e2NvbnN0IGg9ZS5tZWRpdW1wO2hbMF09MS90LGhbMV09MS9uLGhbMl09MS9hLGhbM109cy8yNTU7bGV0IGI9NDtvfHwoaFtiKytdPWksaFtiKytdPWMsaFtiKytdPWwsaFtiKytdPXUpO2NvbnN0IGQ9ci5sZW5ndGg7Zm9yKGxldCBlPTA7ZTxkO2UrKyloW2IrK109cltlXX0pKG0sYixkLGEscyxvLGMsTW4obCx1LCExKSx3bihsLHUsITEpLEZuKGwsdSwhMSksdSksc24obSk7Y29uc3Qgdj1mLnRleHR1cmU7cmV0dXJuIEwoZSksZWUoZiwhMSksaCYmci5iaW5kKGgpLHZ9LHNyPShlLHQsbixhPTAscz0wLG89MCxpPTAsYz0wLGw9MCx1PTAsaD0wLGI9MixkPTAsZj0wKT0+e2NvbnN0IG09ci5jdXJyZW50QXR0YWNobWVudE9iamVjdCx2PUEoKSxfPU1hdGguc3FydCh0WzBdKnRbMF0rdFsxXSp0WzFdKS92LHA9TWF0aC5zcXJ0KHRbMl0qdFsyXSt0WzNdKnRbM10pL3YsZz1lLndpZHRoLHg9ZS5oZWlnaHQsRT1nL18seT14L3AsVD1oZShnLHgsITEpO3IuYmluZChUKTtjb25zdCBSPXhuKGEscyxuKTtubihlLFIpO2NvbnN0IE09KChlLHQsbik9Pntjb25zdCByPWBkJHtlfSR7dH0ke259YDtpZihBbi5oYXMocikpcmV0dXJuIEFuLmdldChyKTtjb25zdCBhPW5ldyB3dCgiI3ZlcnNpb24gMzAwIGVzXG5cbmxheW91dCAobG9jYXRpb24gPSAwKSBpbiB2ZWMyIGFfdmVydGV4O1xuXG5vdXQgdmVjMiB2X2Nvb3JkO1xuXG52b2lkIG1haW4oKSB7XG4gICAgdl9jb29yZCA9IGFfdmVydGV4O1xuXG4gICAgdmVjMiBwb3NpdGlvbiA9IGFfdmVydGV4ICogMi4wIC0gMS4wO1xuICAgIGdsX1Bvc2l0aW9uID0gdmVjNChwb3NpdGlvbiwgMC4wLCAxLjApO1xufSIsKChlLHQsbixyKT0+e2xldCBhLHMsbztzd2l0Y2godCl7Y2FzZSAxOmE9Im1hcF9jb2xvci5yIjticmVhaztjYXNlIDI6YT0ibWFwX2NvbG9yLmciO2JyZWFrO2Nhc2UgNDphPSJtYXBfY29sb3IuYiI7YnJlYWs7Y2FzZSA4OmE9Im1hcF9jb2xvci5hIjticmVhaztkZWZhdWx0OmE9IjAuNSJ9c3dpdGNoKG4pe2Nhc2UgMTpzPSJtYXBfY29sb3IuciI7YnJlYWs7Y2FzZSAyOnM9Im1hcF9jb2xvci5nIjticmVhaztjYXNlIDQ6cz0ibWFwX2NvbG9yLmIiO2JyZWFrO2Nhc2UgODpzPSJtYXBfY29sb3IuYSI7YnJlYWs7ZGVmYXVsdDpzPSIwLjUifXN3aXRjaChyKXtjYXNlIDA6bz0iXG4gICAgdmVjNCBzb3VyY2VfY29sb3IgPSB0ZXh0dXJlKHVfdGV4dHVyZXNbMF0sIHV2KTtcbiI7YnJlYWs7Y2FzZSAzOm89IlxuICAgIHZlYzQgc291cmNlX2NvbG9yID10ZXh0dXJlKHVfdGV4dHVyZXNbMF0sIG1peCh2X2Nvb3JkLCB1diwgc3RlcChhYnModXYgLSB2ZWMyKDAuNSkpLCB2ZWMyKDAuNSkpKSk7XG4iO2JyZWFrO2Nhc2UgMTpvPSJcbiAgICB2ZWM0IHN1YnN0aXR1dGVfY29sb3IgPSB1X21lZGl1bXBbMl07XG4gICAgdmVjNCBzb3VyY2VfY29sb3IgPSBtaXgoc3Vic3RpdHV0ZV9jb2xvciwgdGV4dHVyZSh1X3RleHR1cmVzWzBdLCB1diksIGlzSW5zaWRlKHV2KSk7XG4iO2JyZWFrO2RlZmF1bHQ6bz0iXG4gICAgdmVjNCBzb3VyY2VfY29sb3IgPSB0ZXh0dXJlKHVfdGV4dHVyZXNbMF0sIGZyYWN0KHV2KSk7XG4ifXJldHVybmAjdmVyc2lvbiAzMDAgZXNcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXG51bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmVzWzJdO1xudW5pZm9ybSB2ZWM0IHVfbWVkaXVtcFske2V9XTtcblxuaW4gdmVjMiB2X2Nvb3JkO1xub3V0IHZlYzQgb19jb2xvcjtcblxuXG5mbG9hdCBpc0luc2lkZShpbiB2ZWMyIHV2KSB7XG4gICAgcmV0dXJuIHN0ZXAoNC4wLCBkb3Qoc3RlcCh2ZWM0KDAuMCwgdXYueCwgMC4wLCB1di55KSwgdmVjNCh1di54LCAxLjAsIHV2LnksIDEuMCkpLCB2ZWM0KDEuMCkpKTtcbn1cblxudm9pZCBtYWluKCkge1xuICAgIHZlYzIgdXZfdG9fc3Rfc2NhbGUgID0gdV9tZWRpdW1wWzBdLnh5O1xuICAgIHZlYzIgdXZfdG9fc3Rfb2Zmc2V0ID0gdV9tZWRpdW1wWzBdLnp3O1xuICAgIHZlYzIgc2NhbGUgICAgICAgICAgID0gdV9tZWRpdW1wWzFdLnh5O1xuXG4gICAgdmVjMiBzdCA9IHZfY29vcmQgKiB1dl90b19zdF9zY2FsZSAtIHV2X3RvX3N0X29mZnNldDtcbiAgICB2ZWM0IG1hcF9jb2xvciA9IHRleHR1cmUodV90ZXh0dXJlc1sxXSwgc3QpO1xuXG4gICAgdmVjMiBvZmZzZXQgPSB2ZWMyKCR7YX0sICR7c30pIC0gMC41O1xuICAgIHZlYzIgdXYgPSB2X2Nvb3JkICsgb2Zmc2V0ICogc2NhbGU7XG4gICAgJHtvfVxuXG4gICAgb19jb2xvciA9IG1peCh0ZXh0dXJlKHVfdGV4dHVyZXNbMF0sIHZfY29vcmQpLCBzb3VyY2VfY29sb3IsIGlzSW5zaWRlKHN0KSk7XG59YH0pKDE9PT1uPzM6MixlLHQsbikpO3JldHVybiBBbi5zZXQocixhKSxhfSkoYyxsLGIpOygoZSx0LG4scixhLHMsbyxpLGMsbCx1LGgsYixkKT0+e2NvbnN0IGY9ZS50ZXh0dXJlcztmWzBdPTAsZlsxXT0xO2NvbnN0IG09ZS5tZWRpdW1wO21bMF09ci90LG1bMV09YS9uLG1bMl09cy90LG1bM109KGEtbi1vKS9uLG1bNF09aS9yLG1bNV09LWMvYSwxPT09bCYmKG1bOF09dSxtWzldPWgsbVsxMF09YixtWzExXT1kKX0pKE0sZyx4LEUseSxvLGksdSxoLGIsTW4oZCxmLCEwKSx3bihkLGYsITApLEZuKGQsZiwhMCksZiksVXQoKSxzbihNKTtjb25zdCB3PVQudGV4dHVyZTtyZXR1cm4gbSYmci5iaW5kKG0pLEwoZSksTChSKSxlZShULCExKSx3fSxvcj0oZSx0LG4sYSk9Pntjb25zdCBzPXIuY3VycmVudEF0dGFjaG1lbnRPYmplY3Qsbz1lLndpZHRoLGk9ZS5oZWlnaHQ7c3dpdGNoKHIuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uKXtjYXNlIm5vcm1hbCI6Y2FzZSJsYXllciI6Y2FzZSJhZGQiOmNhc2Uic2NyZWVuIjpjYXNlImFscGhhIjpjYXNlImVyYXNlIjpjYXNlImNvcHkiOntyLmJpbmQoci4kbWFpbkF0dGFjaG1lbnRPYmplY3QpLHIuc2V0VHJhbnNmb3JtKDEsMCwwLDEsbixhKTtjb25zdCBzPWRuKCEwKTsoKGUsdCxuLGEpPT57Y29uc3Qgcz1lLmhpZ2hwLG89ci4kbWF0cml4O3NbMF09b1swXSxzWzFdPW9bMV0sc1syXT1vWzNdLHNbM109b1s0XSxzWzRdPW9bNl0sc1s1XT1vWzddLHNbNl09bixzWzddPWEsc1s4XT14KCksc1s5XT1FKCk7Y29uc3QgaT1lLm1lZGl1bXA7aVswXT10WzBdLGlbMV09dFsxXSxpWzJdPXRbMl0saVszXT10WzNdLGlbNF09dFs0XSxpWzVdPXRbNV0saVs2XT10WzZdLGlbN109dFs3XX0pKHMsdCxvLGkpLGtlKGUpLHBuKHIuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uKSxzbihzKX1icmVhaztkZWZhdWx0Ontjb25zdCBzPWxuKG4sYSxvLGkpLGM9aGUobyxpLCExKTtyLmJpbmQoYyksbm4ocyxlKTtjb25zdCBsPVF0KHIuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uKTtibihsLHRbMF0sdFsxXSx0WzJdLHRbM10sdFs0XSx0WzVdLHRbNl0sdFs3XSksc24obCksci5iaW5kKHIuJG1haW5BdHRhY2htZW50T2JqZWN0KSxyLnJlc2V0KCksci5zZXRUcmFuc2Zvcm0oMSwwLDAsMSxuLGEpLGhuKGMudGV4dHVyZSksTChzKSxlZShjKX19cyYmci5iaW5kKHMpLFV0KCl9LGlyPVtdLGNyPWU9PntlLnNpemUmJmUuY2xlYXIoKSxpci5wdXNoKGUpfSxscj0oZSx0LG4scixhPW51bGwpPT57dC5oYXMobil8fHQuc2V0KG4saXIucG9wKCl8fG5ldyBNYXApO2NvbnN0IHM9dC5nZXQobik7aWYobnVsbD09PWEpe2lmKCFzLmhhcyhyKSlyZXR1cm47cmV0dXJuIGUuZGVzdHJveShzLmdldChyKSkscy5kZWxldGUociksdm9pZChzLnNpemV8fCh0LmRlbGV0ZShuKSxjcihzKSkpfXMuc2V0KHIsYSl9O2NvbnN0IHVyPW5ldyBjbGFzc3tjb25zdHJ1Y3Rvcigpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJfJHBvb2wiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiXyRzdG9yZSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJfJHRyYXNoIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiR0aW1lcklkIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRyZW1vdmVDYWNoZSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkcmVtb3ZlSWRzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksdGhpcy5fJHBvb2w9W10sdGhpcy5fJHN0b3JlPW5ldyBNYXAsdGhpcy5fJHRyYXNoPW5ldyBNYXAsdGhpcy4kdGltZXJJZD1udWxsLHRoaXMuJHJlbW92ZUlkcz1bXSx0aGlzLiRyZW1vdmVDYWNoZT0hMX1yZXNldCgpeygoZSx0LG4pPT57bi5jbGVhcigpLG51bGwhPT1lLiR0aW1lcklkJiZjbGVhclRpbWVvdXQoZS4kdGltZXJJZCk7Zm9yKGNvbnN0IG4gb2YgdC52YWx1ZXMoKSl7Zm9yKGNvbnN0IHQgb2Ygbi52YWx1ZXMoKSl0JiZlLmRlc3Ryb3kodCk7Y3Iobil9dC5jbGVhcigpfSkodGhpcyx0aGlzLl8kc3RvcmUsdGhpcy5fJHRyYXNoKX1kZXN0cm95KGU9bnVsbCl7KChlLHQpPT57aWYodCYmIm9iamVjdCI9PXR5cGVvZiB0JiYiY2FudmFzImluIHQpe2NvbnN0IG49dC5jYW52YXMscj1uLndpZHRoLGE9bi5oZWlnaHQ7dC5jbGVhclJlY3QoMCwwLHIrMSxhKzEpLG4ud2lkdGg9bi5oZWlnaHQ9MSxlLnB1c2gobil9fSkodGhpcy5fJHBvb2wsZSl9Z2V0Q2FudmFzKCl7cmV0dXJuIHRoaXMuXyRwb29sLnBvcCgpfHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKX1yZW1vdmUoZSx0KXsoKGUsdCxuKT0+e2lmKCFlLmhhcyh0KSlyZXR1cm47Y29uc3Qgcj1lLmdldCh0KTtyLmhhcyhuKSYmKHIuZGVsZXRlKG4pLHIuc2l6ZXx8KGNyKHIpLGUuZGVsZXRlKHQpKSl9KSh0aGlzLl8kc3RvcmUsZSx0KX1yZW1vdmVUaW1lcihlKXsoKGUsdCxuLHIpPT57aWYobi5oYXMocikpcmV0dXJuO2NvbnN0IGE9dC5nZXQocik7YSYmKGEuc2V0KCJ0cmFzaCIsITApLG4uc2V0KHIsYSksbnVsbCE9PWUuJHRpbWVySWQmJmNsZWFyVGltZW91dChlLiR0aW1lcklkKSxlLiRyZW1vdmVDYWNoZT0hMSxlLiR0aW1lcklkPXNldFRpbWVvdXQoKCk9PntlLiRyZW1vdmVDYWNoZT0hMCxlLiR0aW1lcklkPW51bGx9LDFlMykpfSkodGhpcyx0aGlzLl8kc3RvcmUsdGhpcy5fJHRyYXNoLGUpfXJlbW92ZVRpbWVyU2NoZWR1bGVkQ2FjaGUoKXsoKGUsdCk9PntpZih0LnNpemUpe2Zvcihjb25zdFtuLHJdb2YgdClyLmhhcygidHJhc2giKSYmKGUucmVtb3ZlQnlJZChuKSxlLiRyZW1vdmVJZHMucHVzaCgrbikpO3QuY2xlYXIoKSxlLiRyZW1vdmVDYWNoZT0hMX19KSh0aGlzLHRoaXMuXyR0cmFzaCl9cmVtb3ZlQnlJZChlKXsoKGUsdCxuKT0+e2lmKCF0LmhhcyhuKSlyZXR1cm47Y29uc3Qgcj10LmdldChuKTtmb3IoY29uc3QgdCBvZiByLnZhbHVlcygpKWUuZGVzdHJveSh0KTt0LmRlbGV0ZShuKSxjcihyKX0pKHRoaXMsdGhpcy5fJHN0b3JlLGUpfWdldEJ5SWQoZSl7cmV0dXJuIHRoaXMuXyRzdG9yZS5nZXQoZSl9Z2V0KGUsdCl7cmV0dXJuKChlLHQsbik9Pntjb25zdCByPWUuZ2V0KHQpfHxudWxsO3JldHVybiByPyhyLmRlbGV0ZSgidHJhc2giKSxyLmdldChuKXx8bnVsbCk6bnVsbH0pKHRoaXMuXyRzdG9yZSxlLHQpfXNldChlLHQsbj1udWxsKXtscih0aGlzLHRoaXMuXyRzdG9yZSxlLHQsbil9aGFzKGUsdD0iIil7cmV0dXJuKChlLHQsbj0iIik9Pm4/ISFlLmhhcyh0KSYmZS5nZXQodCkuaGFzKG4pOmUuaGFzKHQpKSh0aGlzLl8kc3RvcmUsZSx0KX1nZW5lcmF0ZUtleXMoZSx0LG4pe3JldHVybigoZSx0LG4pPT57Y29uc3Qgcj1bMTAwKmUsMTAwKnRdO24mJnIucHVzaCgxMDAqbik7bGV0IGE9MjE2NjEzNjI2MTtmb3IobGV0IGU9MDtlPHIubGVuZ3RoOysrZSl7bGV0IHQ9MHxyW2VdO2ZvcihsZXQgZT0wO2U8NDtlKyspYV49MjU1JnQsYT1NYXRoLmltdWwoYSwxNjc3NzYxOSksdD4+Pj04fXJldHVybihhPj4+MCklMTY3NzcyMTZ9KShlLHQsbil9Z2VuZXJhdGVGaWx0ZXJLZXlzKGUsdCxuLHIpe3JldHVybigoZSx0LG4scik9PmAke2V9JHt0fSR7bn0ke3J9YCkoZSx0LG4scil9fSxocj0oZSx0LG4sYSxzLG8saSxjLGwsdSxoKT0+e2NvbnN0IGI9ci5jdXJyZW50QXR0YWNobWVudE9iamVjdDtsZXQgZD1udWxsO2NvbnN0IGY9TWF0aC5zcXJ0KGlbMF0qaVswXStpWzFdKmlbMV0pLF89TWF0aC5zcXJ0KGlbMl0qaVsyXStpWzNdKmlbM10pLHA9dXIuZ2VuZXJhdGVGaWx0ZXJLZXlzKGlbMF0saVsxXSxpWzJdLGlbM10pO2xldCBnPSExO2lmKHVyLmdldCh0LCJmS2V5Iik9PT1wKXtjb25zdCBlPXVyLmdldCh0LCJmVGV4dHVyZSIpO24/TChlKTooZz0hMCxkPWUpfWxldCB4PTAsRT0wO2lmKGcpeD11ci5nZXQodCwib2Zmc2V0WCIpLEU9dXIuZ2V0KHQsIm9mZnNldFkiKTtlbHNle2Q9dG4oZSk7Y29uc3QgdD1NYXRoLmF0YW4yKGlbMV0saVswXSksbj1NYXRoLmF0YW4yKC1pWzJdLGlbM10pLGM9bz9mKk1hdGguY29zKHQpOk1hdGguY29zKHQpLGw9bz9mKk1hdGguc2luKHQpOk1hdGguc2luKHQpLHU9bz8tXypNYXRoLnNpbihuKTotTWF0aC5zaW4obikscD1vP18qTWF0aC5jb3Mobik6TWF0aC5jb3MobiksZz1tKGMsbCx1LHAsYS8yLHMvMikseT1tKDEsMCwwLDEsLWUudy8yLC1lLmgvMiksQT0oKGUsdCk9Pntjb25zdCBuPWVbMF0scj1lWzFdLGE9ZVsyXSxzPWVbM10sbz1lWzRdLGk9ZVs1XSxjPXRbMF0sbD10WzFdLHU9dFsyXSxoPXRbM10sYj10WzRdLGQ9dFs1XTtyZXR1cm4gbShuKmMrYSpsLHIqYytzKmwsbip1K2EqaCxyKnUrcypoLG4qYithKmQrbyxyKmIrcypkK2kpfSkoZyx5KTtpZih2KGcpLHYoeSksMSE9PUFbMF18fDAhPT1BWzFdfHwwIT09QVsyXXx8MSE9PUFbM10pe2NvbnN0IGU9aGUoYSxzLCExKTtyLmJpbmQoZSksci5yZXNldCgpLHIuc2V0VHJhbnNmb3JtKEFbMF0sQVsxXSxBWzJdLEFbM10sQVs0XSxBWzVdKSx4PUFbNF0sRT1BWzVdLGtlKGQpO2NvbnN0IHQ9ZG4oKTtmbih0LGQud2lkdGgsZC5oZWlnaHQpLHNuKHQpLEwoZCksZD1lLnRleHR1cmUsZWUoZSwhMSksYiYmci5iaW5kKGIpfXYoQSksUm4ueD0wLFJuLnk9MDtmb3IobGV0IGU9MDtoLmxlbmd0aD5lOyl7c3dpdGNoKGhbZSsrXSl7Y2FzZSAwOmQ9UW4oZCxpLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10sQm9vbGVhbihoW2UrK10pKTticmVhaztjYXNlIDE6ZD1PbihkLGksaFtlKytdLGhbZSsrXSxoW2UrK10pO2JyZWFrO2Nhc2UgMjpkPVNuKGQsbmV3IEZsb2F0MzJBcnJheShbaFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXV0pKTticmVhaztjYXNlIDM6e2NvbnN0IHQ9aFtlKytdLG49aFtlKytdLHI9dCpuLGE9aC5zdWJhcnJheShlLGUrcik7ZSs9cixkPWFyKGQsdCxuLGEsaFtlKytdLGhbZSsrXSxCb29sZWFuKGhbZSsrXSksQm9vbGVhbihoW2UrK10pLGhbZSsrXSxoW2UrK10pfWJyZWFrO2Nhc2UgNDp7Y29uc3QgdD1oW2UrK10sbj1uZXcgVWludDhBcnJheSh0KTtuLnNldChoLnN1YmFycmF5KGUsZSt0KSksZSs9dCxkPXNyKGQsaSxuLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10pfWJyZWFrO2Nhc2UgNTpkPUhuKGQsaSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLEJvb2xlYW4oaFtlKytdKSxCb29sZWFuKGhbZSsrXSksQm9vbGVhbihoW2UrK10pKTticmVhaztjYXNlIDY6ZD1xbihkLGksaFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10sQm9vbGVhbihoW2UrK10pLEJvb2xlYW4oaFtlKytdKSk7YnJlYWs7Y2FzZSA3Ontjb25zdCB0PWhbZSsrXSxuPWhbZSsrXTtsZXQgcj1oW2UrK107Y29uc3QgYT1oLnN1YmFycmF5KGUsZStyKTtlKz1yLHI9aFtlKytdO2NvbnN0IHM9aC5zdWJhcnJheShlLGUrcik7ZSs9cixyPWhbZSsrXTtjb25zdCBvPWguc3ViYXJyYXkoZSxlK3IpO2UrPXIsZD1lcihkLGksdCxuLGEscyxvLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10sQm9vbGVhbihoW2UrK10pKX1icmVhaztjYXNlIDg6e2NvbnN0IHQ9aFtlKytdLG49aFtlKytdO2xldCByPWhbZSsrXTtjb25zdCBhPWguc3ViYXJyYXkoZSxlK3IpO2UrPXIscj1oW2UrK107Y29uc3Qgcz1oLnN1YmFycmF5KGUsZStyKTtlKz1yLHI9aFtlKytdO2NvbnN0IG89aC5zdWJhcnJheShlLGUrcik7ZSs9cixkPW5yKGQsaSx0LG4sYSxzLG8saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxCb29sZWFuKGhbZSsrXSkpfX19fWlmKGQpe2NvbnN0IGU9QSgpLHQ9dVswXSooZi9lKSxuPXVbMV0qKF8vZSk7ci5yZXNldCgpLHIuc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKSxyLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj1sLG9yKGQsYywteCt0K2lbNF0sLUUrbitpWzVdKX1nfHwodXIuc2V0KHQsImZLZXkiLHApLHVyLnNldCh0LCJmVGV4dHVyZSIsZCksdXIuc2V0KHQsIm9mZnNldFgiLHgpLHVyLnNldCh0LCJvZmZzZXRZIixFKSksYiYmci5iaW5kKGIpfSxicj0oZSx0LHIsYSk9PntuLnN0ZW5jaWxGdW5jKG4uQUxXQVlTLDAsMjU1KSxuLnN0ZW5jaWxPcFNlcGFyYXRlKG4uRlJPTlQsbi5LRUVQLG4uS0VFUCxuLklOQ1JfV1JBUCksbi5zdGVuY2lsT3BTZXBhcmF0ZShuLkJBQ0ssbi5LRUVQLG4uS0VFUCxuLkRFQ1JfV1JBUCksbi5jb2xvck1hc2soITEsITEsITEsITEpO2NvbnN0IHM9ISFhLG89T3Qocyk7YSYmU3QobyxhKSxuLmVuYWJsZShuLlNBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSksTnQobyxlLHQsciksbi5kaXNhYmxlKG4uU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFKSxuLnN0ZW5jaWxGdW5jKG4uTk9URVFVQUwsMCwyNTUpLG4uc3RlbmNpbE9wKG4uS0VFUCxuLlpFUk8sbi5aRVJPKSxuLmNvbG9yTWFzayghMCwhMCwhMCwhMCk7Y29uc3QgaT0oZT0+e2NvbnN0IHQ9InMiKyhlPyJ5IjoibiIpO2lmKEZ0Lmhhcyh0KSlyZXR1cm4gRnQuZ2V0KHQpO2NvbnN0IG49bmV3IHd0KCR0KGU/OTowLCExLCExLGUpLCIjdmVyc2lvbiAzMDAgZXNcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXG5pbiB2ZWM0IHZfY29sb3I7XG5vdXQgdmVjNCBvX2NvbG9yO1xuXG52b2lkIG1haW4oKSB7XG4gICAgb19jb2xvciA9IHZlYzQodl9jb2xvci5yZ2IgKiB2X2NvbG9yLmEsIHZfY29sb3IuYSk7XG59Iik7cmV0dXJuIEZ0LnNldCh0LG4pLG59KShzKTthJiYoKGUsdCk9Pntjb25zdCBuPWUuaGlnaHA7blswXT10WzBdLG5bMV09dFsxXSxuWzJdPTAsbls0XT10WzJdLG5bNV09dFszXSxuWzZdPTAsbls4XT10WzRdLG5bOV09dFs1XSxuWzEwXT0xLG5bMTJdPXRbNl0sblsxM109dFs3XSxuWzE0XT0wLG5bMTZdPXRbOF0sblsxN109dFs5XSxuWzE4XT0wLG5bMjBdPXRbMTBdLG5bMjFdPXRbMTFdLG5bMjJdPTEsblszXT14KCksbls3XT1FKCksblsxMV09dFsxMl0sblsxNV09dFsxM10sblsxOV09dFsxNF0sblsyM109dFsxNV0sblsyNF09dFsxNl0sblsyNV09dFsxN10sblsyNl09dFsxOF0sblsyN109dFsxOV0sblsyOF09dFsyMF0sblsyOV09dFsyMV0sblszMF09dFsyMl0sblszMV09dFsyM10sblszMl09dFsyNF0sblszM109dFsyNV19KShpLGEpLE50KGksZSx0LHIpfSxkcj0oZSx0LG4scixhKT0+e2NvbnN0IHM9ZS5tZWRpdW1wO2xldCBvPTA7Zm9yKGxldCBlPW47ZTxyOysrZSl7Y29uc3Qgbj01KmU7c1tvKytdPWFbdFtuKzFdXSxzW28rK109YVt0W24rMl1dLHNbbysrXT1hW3RbbiszXV0sc1tvKytdPWFbdFtuKzRdXX1mb3IobGV0IGU9bjtlPHI7KytlKXNbbysrXT10WzUqZV19LGZyPShlLHQpPT57Y29uc3QgYT1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0LHM9bi5nZXRQYXJhbWV0ZXIobi5TQ0lTU09SX0JPWCk7bi5kaXNhYmxlKG4uU0NJU1NPUl9URVNUKTtjb25zdCBvPXpuKCk7ci5iaW5kKG8pO2NvbnN0IGk9MD09PXQsYz1lLmxlbmd0aC81LGw9aT9HbjpWbjt1bigpO2NvbnN0IHU9V24oKTtmb3IobGV0IHQ9MDt0PGM7dCs9dS0xKXtjb25zdCBuPU1hdGgubWluKHQrdSxjKSxyPUluKG4tdCxpKTtkcihyLGUsdCxuLGwpLERuKHIsZVswXSxlW2UubGVuZ3RoLTVdKX1yZXR1cm4gVXQoKSxhJiZyLmJpbmQoYSksbi5lbmFibGUobi5TQ0lTU09SX1RFU1QpLG4uc2Npc3NvcihzWzBdLHNbMV0sc1syXSxzWzNdKSxvLnRleHR1cmV9LG1yPW5ldyBNYXAsdnI9KGUsdCxuLHIpPT57Y29uc3QgYT0oKGUsdCxuLHIpPT5gJHtlPyJ5IjoibiJ9JHt0PyJ5IjoibiJ9JHt0JiZuPyJ5IjoibiJ9JHtyfWApKHIsZSx0LG4pO2lmKG1yLmhhcyhhKSlyZXR1cm4gbXIuZ2V0KGEpO2NvbnN0IHM9MSsocj8xNDo1KSxvPXMtMSxpPW5ldyB3dCgkdChzLCEwLCExLHIpLCgoZSx0LG4scixhKT0+e2NvbnN0IHM9bj8oKGUsdCk9Pntjb25zdCBuPXQ/KGU9PmBcbiAgICB2ZWMyIGZvY2FsID0gdmVjMih1X2hpZ2hwWyR7ZX1dWzFdLCAwLjApO1xuXG4gICAgdmVjMiBkaXIgPSBub3JtYWxpemUoY29vcmQgLSBmb2NhbCk7XG5cbiAgICBmbG9hdCBhID0gZG90KGRpciwgZGlyKTtcbiAgICBmbG9hdCBiID0gMi4wICogZG90KGRpciwgZm9jYWwpO1xuICAgIGZsb2F0IGMgPSBkb3QoZm9jYWwsIGZvY2FsKSAtIDEuMDtcbiAgICBmbG9hdCB4ID0gKC1iICsgc3FydChiICogYiAtIDQuMCAqIGEgKiBjKSkgLyAoMi4wICogYSk7XG5cbiAgICBmbG9hdCB0ID0gZGlzdGFuY2UoZm9jYWwsIGNvb3JkKSAvIGRpc3RhbmNlKGZvY2FsLCBmb2NhbCArIGRpciAqIHgpO2ApKGUpOiJmbG9hdCB0ID0gbGVuZ3RoKGNvb3JkKTsiO3JldHVybmBcbiAgICBmbG9hdCByYWRpdXMgPSB1X2hpZ2hwWyR7ZX1dWzBdO1xuICAgIHZlYzIgY29vcmQgPSBwIC8gcmFkaXVzO1xuICAgICR7bn1cbmB9KSh0LHIpOihlPT5gXG4gICAgdmVjMiBhID0gdV9oaWdocFske2V9XS54eTtcbiAgICB2ZWMyIGIgPSB1X2hpZ2hwWyR7ZX1dLnp3O1xuXG4gICAgdmVjMiBhYiA9IGIgLSBhO1xuICAgIHZlYzIgYXAgPSBwIC0gYTtcblxuICAgIGZsb2F0IHQgPSBkb3QoYWIsIGFwKSAvIGRvdChhYiwgYWIpO2ApKHQpO2xldCBvO3N3aXRjaChhKXtjYXNlIDA6bz0iMS4wIC0gYWJzKGZyYWN0KHQgKiAwLjUpICogMi4wIC0gMS4wKSI7YnJlYWs7Y2FzZSAxOm89ImZyYWN0KHQpIjticmVhaztkZWZhdWx0Om89ImNsYW1wKHQsIDAuMCwgMS4wKSJ9cmV0dXJuYCN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xuXG51bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmU7XG51bmlmb3JtIHZlYzQgdV9oaWdocFske2V9XTtcbiAgICBcbmluIHZlYzIgdl91djtcbm91dCB2ZWM0IG9fY29sb3I7XG4gICAgXG52b2lkIG1haW4oKSB7XG4gICAgdmVjMiBwID0gdl91djtcbiAgICAke3N9XG4gICAgdCA9ICR7b307XG4gICAgb19jb2xvciA9IHRleHR1cmUodV90ZXh0dXJlLCB2ZWMyKHQsIDAuNSkpO1xufWB9KShzLG8sZSx0LG4pKTtyZXR1cm4gbXIuc2V0KGEsaSksaX0sX3I9KGUsdCxuLHIscz0wLG89bnVsbCxpPW51bGwpPT57Y29uc3QgYz1lLmhpZ2hwO2NbMF09blswXSxjWzFdPW5bMV0sY1syXT1uWzJdLGNbNF09blszXSxjWzVdPW5bNF0sY1s2XT1uWzVdLGNbOF09bls2XSxjWzldPW5bN10sY1sxMF09bls4XSxjWzEyXT1yWzBdLGNbMTNdPXJbMV0sY1sxNF09clsyXSxjWzE2XT1yWzNdLGNbMTddPXJbNF0sY1sxOF09cls1XSxjWzExXT1yWzZdLGNbMTVdPXJbN10sY1sxOV09cls4XSxjWzNdPXgoKSxjWzddPUUoKTtsZXQgbD0yMDtpJiYoY1syMF09aVswXSxjWzIxXT1pWzFdLGNbMjJdPTAsY1syNF09aVsyXSxjWzI1XT1pWzNdLGNbMjZdPTAsY1syOF09aVs0XSxjWzI5XT1pWzVdLGNbMzBdPTEsY1szMl09aVs2XSxjWzMzXT1pWzddLGNbMzRdPTAsY1szNl09aVs4XSxjWzM3XT1pWzldLGNbMzhdPTAsY1s0MF09aVsxMF0sY1s0MV09aVsxMV0sY1s0Ml09MSxjWzMxXT1pWzEyXSxjWzM1XT1pWzEzXSxjWzM5XT1pWzE0XSxjWzQzXT1pWzE1XSxjWzQ0XT1pWzE2XSxjWzQ1XT1pWzE3XSxjWzQ2XT1pWzE4XSxjWzQ3XT1pWzE5XSxjWzQ4XT1pWzIwXSxjWzQ5XT1pWzIxXSxjWzUwXT1pWzIyXSxjWzUxXT1pWzIzXSxjWzUyXT1pWzI0XSxjWzUzXT1pWzI1XSxsPTU2KSwwPT09dD8oY1tsKytdPW9bMF0sY1tsKytdPW9bMV0sY1tsKytdPW9bMl0sY1tsXT1vWzNdKTooY1tsKytdPTgxOS4yLGNbbF09YShzLC0uOTc1LC45NzUsMCkpfSxwcj0oZSx0LGEscyk9Pntjb25zdCBvPUtlLnNoaWZ0KCksaT1LZS5zaGlmdCgpLGM9S2Uuc2hpZnQoKSxsPUtlLnNoaWZ0KCk7bi5kaXNhYmxlKG4uU1RFTkNJTF9URVNUKTtjb25zdCBiPWZyKG8sbCk7a2UoYiksbi5lbmFibGUobi5TVEVOQ0lMX1RFU1QpLG4uZnJvbnRGYWNlKG4uQ0NXKSxuLnN0ZW5jaWxNYXNrKDI1NSksbi5zdGVuY2lsRnVuYyhuLkFMV0FZUywwLDI1NSksbi5zdGVuY2lsT3BTZXBhcmF0ZShuLkZST05ULG4uS0VFUCxuLktFRVAsbi5JTkNSX1dSQVApLG4uc3RlbmNpbE9wU2VwYXJhdGUobi5CQUNLLG4uS0VFUCxuLktFRVAsbi5ERUNSX1dSQVApLG4uY29sb3JNYXNrKCExLCExLCExLCExKTtjb25zdCBkPSEhcyxmPU90KGQpO3MmJlN0KGYscyksbi5lbmFibGUobi5TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UpLE50KGYsZSx0LGEpLG4uZGlzYWJsZShuLlNBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSksbi5zdGVuY2lsRnVuYyhuLk5PVEVRVUFMLDAsMjU1KSxuLnN0ZW5jaWxPcChuLktFRVAsbi5aRVJPLG4uWkVSTyksbi5jb2xvck1hc2soITAsITAsITAsITApO2NvbnN0IG09dnIoITEsITEsYyxkKSxwPShlPT57Y29uc3QgdD0tODE5LjIqZVswXS04MTkuMiplWzJdK2VbNF0sbj04MTkuMiplWzBdLTgxOS4yKmVbMl0rZVs0XSxyPS04MTkuMiplWzBdKzgxOS4yKmVbMl0rZVs0XSxhPS04MTkuMiplWzFdLTgxOS4yKmVbM10rZVs1XSxzPTgxOS4yKmVbMV0tODE5LjIqZVszXStlWzVdO2xldCBvPXItdCxpPS04MTkuMiplWzFdKzgxOS4yKmVbM10rZVs1XS1hO2NvbnN0IGM9TWF0aC5zcXJ0KG8qbytpKmkpO2M/KG8vPWMsaS89Yyk6KG89MCxpPTApO2NvbnN0IGw9KG4tdCkqbysocy1hKSppO3JldHVybiB1KHQrbCpvLGErbCppLG4scyl9KShpKSxnPV8oci4kbWF0cml4KTtfcihtLDAsci4kbWF0cml4LGcsMCxwLHMpLGgocCksdihnKSxOdChtLGUsdCxhKX0sZ3I9KGUsdCxhLHMpPT57Y29uc3Qgbz1LZS5zaGlmdCgpLGk9S2Uuc2hpZnQoKSxjPUtlLnNoaWZ0KCksbD1LZS5zaGlmdCgpLHU9S2Uuc2hpZnQoKTtuLmRpc2FibGUobi5TVEVOQ0lMX1RFU1QpO2NvbnN0IGg9ZnIobyxsKTtrZShoKSxuLmVuYWJsZShuLlNURU5DSUxfVEVTVCksbi5mcm9udEZhY2Uobi5DQ1cpLG4uc3RlbmNpbE1hc2soMjU1KSxuLnN0ZW5jaWxGdW5jKG4uQUxXQVlTLDAsMjU1KSxuLnN0ZW5jaWxPcFNlcGFyYXRlKG4uRlJPTlQsbi5LRUVQLG4uS0VFUCxuLklOQ1JfV1JBUCksbi5zdGVuY2lsT3BTZXBhcmF0ZShuLkJBQ0ssbi5LRUVQLG4uS0VFUCxuLkRFQ1JfV1JBUCksbi5jb2xvck1hc2soITEsITEsITEsITEpO2NvbnN0IGI9ISFzLGQ9T3QoYik7cyYmU3QoZCxzKSxuLmVuYWJsZShuLlNBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSksTnQoZCxlLHQsYSksbi5kaXNhYmxlKG4uU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFKSxuLnN0ZW5jaWxGdW5jKG4uTk9URVFVQUwsMCwyNTUpLG4uc3RlbmNpbE9wKG4uS0VFUCxuLlpFUk8sbi5aRVJPKSxuLmNvbG9yTWFzayghMCwhMCwhMCwhMCksci5zYXZlKCksci50cmFuc2Zvcm0oaVswXSxpWzFdLGlbMl0saVszXSxpWzRdLGlbNV0pO2NvbnN0IGY9ci4kc3RhY2tbci4kc3RhY2subGVuZ3RoLTFdLG09XyhyLiRtYXRyaXgpLHA9dnIoITAsQm9vbGVhbih1KSxjLGIpO19yKHAsMSxmLG0sdSxzKSxyLnJlc3RvcmUoKSx2KG0pLE50KHAsZSx0LGEpfSx4cj1uZXcgTWFwLEVyPShlLHQsYSxzKT0+e24uc3RlbmNpbEZ1bmMobi5BTFdBWVMsMCwyNTUpLG4uc3RlbmNpbE9wU2VwYXJhdGUobi5GUk9OVCxuLktFRVAsbi5LRUVQLG4uSU5DUl9XUkFQKSxuLnN0ZW5jaWxPcFNlcGFyYXRlKG4uQkFDSyxuLktFRVAsbi5LRUVQLG4uREVDUl9XUkFQKSxuLmNvbG9yTWFzayghMSwhMSwhMSwhMSk7Y29uc3Qgbz0hIXMsaT1PdChvKTtzJiZTdChpLHMpLG4uZW5hYmxlKG4uU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFKSxOdChpLGUsdCxhKSxuLmRpc2FibGUobi5TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UpO2NvbnN0IGM9eW4uc2hpZnQoKSxsPXluLnNoaWZ0KCksdT15bi5zaGlmdCgpLGg9eW4uc2hpZnQoKSxiPXluLnNoaWZ0KCksZD15bi5zaGlmdCgpLGY9eG4odSxoLGMsZCk7ci5zYXZlKCksci50cmFuc2Zvcm0obFswXSxsWzFdLGxbMl0sbFszXSxsWzRdLGxbNV0pLG4uc3RlbmNpbEZ1bmMobi5OT1RFUVVBTCwwLDI1NSksbi5zdGVuY2lsT3Aobi5LRUVQLG4uWkVSTyxuLlpFUk8pLG4uY29sb3JNYXNrKCEwLCEwLCEwLCEwKTtjb25zdCBtPSgoZSx0KT0+e2NvbnN0IG49YGIke2U/InkiOiJuIn0ke3Q/InkiOiJuIn1gO2lmKHhyLmhhcyhuKSlyZXR1cm4geHIuZ2V0KG4pO2NvbnN0IHI9ZT8iI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblxudW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlO1xudW5pZm9ybSB2ZWM0IHVfbWVkaXVtcFsxXTtcblxuaW4gdmVjMiB2X3V2O1xub3V0IHZlYzQgb19jb2xvcjtcblxudm9pZCBtYWluKCkge1xuICAgIHZlYzIgdXYgPSBmcmFjdCh2ZWMyKHZfdXYueCwgLXZfdXYueSkgLyB1X21lZGl1bXBbMF0ueHkpO1xuICAgIFxuICAgIHZlYzQgc3JjID0gdGV4dHVyZSh1X3RleHR1cmUsIHV2KTtcbiAgICBvX2NvbG9yID0gc3JjO1xufSI6IiN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cbnVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4dHVyZTtcbnVuaWZvcm0gdmVjNCB1X21lZGl1bXBbMV07XG5cbmluIHZlYzIgdl91djtcbm91dCB2ZWM0IG9fY29sb3I7XG5cbnZvaWQgbWFpbigpIHtcbiAgICB2ZWMyIHV2ID0gdmVjMih2X3V2LngsIHVfbWVkaXVtcFswXS55IC0gdl91di55KSAvIHVfbWVkaXVtcFswXS54eTtcblxuICAgIHZlYzQgc3JjID0gdGV4dHVyZSh1X3RleHR1cmUsIHV2KTtcbiAgICBvX2NvbG9yID0gc3JjO1xufSIsYT1uZXcgd3QoJHQodD8xNDo1LCEwLCExLHQpLHIpO3JldHVybiB4ci5zZXQobixhKSxhfSkoYixvKTsoKGUsdCxuLGEpPT57Y29uc3Qgcz1lLmhpZ2hwLG89ci4kc3RhY2tbci4kc3RhY2subGVuZ3RoLTFdO3NbMF09b1swXSxzWzFdPW9bMV0sc1syXT1vWzJdLHNbNF09b1szXSxzWzVdPW9bNF0sc1s2XT1vWzVdLHNbOF09b1s2XSxzWzldPW9bN10sc1sxMF09b1s4XTtjb25zdCBpPV8oci4kbWF0cml4KTtzWzEyXT1pWzBdLHNbMTNdPWlbMV0sc1sxNF09aVsyXSxzWzE2XT1pWzNdLHNbMTddPWlbNF0sc1sxOF09aVs1XSxzWzExXT1pWzZdLHNbMTVdPWlbN10sc1sxOV09aVs4XSxzWzNdPXgoKSxzWzddPUUoKSxhJiYoc1syMF09YVswXSxzWzIxXT1hWzFdLHNbMjJdPTAsc1syNF09YVsyXSxzWzI1XT1hWzNdLHNbMjZdPTAsc1syOF09YVs0XSxzWzI5XT1hWzVdLHNbMzBdPTEsc1szMl09YVs2XSxzWzMzXT1hWzddLHNbMzRdPTAsc1szNl09YVs4XSxzWzM3XT1hWzldLHNbMzhdPTAsc1s0MF09YVsxMF0sc1s0MV09YVsxMV0sc1s0Ml09MSxzWzMxXT1hWzEyXSxzWzM1XT1hWzEzXSxzWzM5XT1hWzE0XSxzWzQzXT1hWzE1XSxzWzQ0XT1hWzE2XSxzWzQ1XT1hWzE3XSxzWzQ2XT1hWzE4XSxzWzQ3XT1hWzE5XSxzWzQ4XT1hWzIwXSxzWzQ5XT1hWzIxXSxzWzUwXT1hWzIyXSxzWzUxXT1hWzIzXSxzWzUyXT1hWzI0XSxzWzUzXT1hWzI1XSk7Y29uc3QgYz1lLm1lZGl1bXA7Y1swXT10LGNbMV09bn0pKG0sdSxoLHMpLE50KG0sZSx0LGEpLHIucmVzdG9yZSgpLEwoZil9O2xldCB5cj0wO2NvbnN0IEFyPW5ldyBGbG9hdDMyQXJyYXkoMjU2KTtmb3IobGV0IGU9MTtlPDI1NjtlKyspQXJbZV09MjU1L2U7Y29uc3QgVHI9YXN5bmMoZSx0KT0+e2NvbnN0IGE9Y24oMCwwLGUsdCk7a2UoYSksbi5iaW5kRnJhbWVidWZmZXIobi5GUkFNRUJVRkZFUixaKSxuLmZyYW1lYnVmZmVyVGV4dHVyZTJEKG4uRlJBTUVCVUZGRVIsbi5DT0xPUl9BVFRBQ0hNRU5UMCxuLlRFWFRVUkVfMkQsYS5yZXNvdXJjZSwwKTtjb25zdCBzPW5ldyBVaW50OEFycmF5KGUqdCo0KSxvPXIuJG1haW5BdHRhY2htZW50T2JqZWN0O3MuYnl0ZUxlbmd0aD55ciYmKHlyPWMocy5ieXRlTGVuZ3RoKSxuLmJ1ZmZlckRhdGEobi5QSVhFTF9QQUNLX0JVRkZFUix5cixuLlNUUkVBTV9SRUFEKSksbi5yZWFkUGl4ZWxzKDAsby5oZWlnaHQtdCxlLHQsbi5SR0JBLG4uVU5TSUdORURfQllURSwwKTtjb25zdCBpPW4uZmVuY2VTeW5jKG4uU1lOQ19HUFVfQ09NTUFORFNfQ09NUExFVEUsMCk7YXdhaXQgbmV3IFByb21pc2UoZT0+e2NvbnN0IHQ9KCk9PntpZihuLmNsaWVudFdhaXRTeW5jKGksbi5TWU5DX0ZMVVNIX0NPTU1BTkRTX0JJVCwwKSE9PW4uVElNRU9VVF9FWFBJUkVEKXJldHVybiBuLmRlbGV0ZVN5bmMoaSksbi5nZXRCdWZmZXJTdWJEYXRhKG4uUElYRUxfUEFDS19CVUZGRVIsMCxzKSxlKCk7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHQpfTt0KCl9KSxuLmJpbmRGcmFtZWJ1ZmZlcihuLkZSQU1FQlVGRkVSLEQpO2ZvcihsZXQgZT0wO2U8cy5sZW5ndGg7ZSs9NCl7Y29uc3QgdD1zW2UrM107aWYoMD09PXR8fDI1NT09PXQpY29udGludWU7Y29uc3Qgbj1Bclt0XTtzW2VdPU1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHNbZV0qbikpLHNbZSsxXT1NYXRoLm1pbigyNTUsTWF0aC5yb3VuZChzW2UrMV0qbikpLHNbZSsyXT1NYXRoLm1pbigyNTUsTWF0aC5yb3VuZChzW2UrMl0qbikpfXJldHVybiBhd2FpdCBjcmVhdGVJbWFnZUJpdG1hcChuZXcgSW1hZ2VEYXRhKG5ldyBVaW50OENsYW1wZWRBcnJheShzKSxlLHQpLHtpbWFnZU9yaWVudGF0aW9uOiJmbGlwWSIscHJlbXVsdGlwbHlBbHBoYToibm9uZSIsY29sb3JTcGFjZUNvbnZlcnNpb246Im5vbmUifSl9O2NsYXNzIFJye2NvbnN0cnVjdG9yKGEscyxpPTEpe3ZhciBjO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkc3RhY2siLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJG1hdHJpeCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkY2xlYXJDb2xvclIiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJGNsZWFyQ29sb3JHIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRjbGVhckNvbG9yQiIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkY2xlYXJDb2xvckEiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJG1haW5BdHRhY2htZW50T2JqZWN0Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRzdGFja0F0dGFjaG1lbnRPYmplY3QiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiZ2xvYmFsQWxwaGEiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImltYWdlU21vb3RoaW5nRW5hYmxlZCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkZmlsbFN0eWxlIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRzdHJva2VTdHlsZSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJtYXNrQm91bmRzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInRoaWNrbmVzcyIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJjYXBzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImpvaW50cyIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJtaXRlckxpbWl0Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksKGU9PntuPWV9KShhKSxjPWEuZ2V0UGFyYW1ldGVyKGEuTUFYX1RFWFRVUkVfU0laRSksZT1NYXRoLm1pbig0MDk2LGMvMiksKGU9Pnt0PWV9KShzKSwoZT0+e3k9ZX0pKGkpLHRoaXMuJHN0YWNrPW8oKSx0aGlzLiRzdGFja0F0dGFjaG1lbnRPYmplY3Q9bygpLHRoaXMuJG1hdHJpeD1kKDEsMCwwLDAsMSwwLDAsMCwxKSx0aGlzLiRjbGVhckNvbG9yUj0wLHRoaXMuJGNsZWFyQ29sb3JHPTAsdGhpcy4kY2xlYXJDb2xvckI9MCx0aGlzLiRjbGVhckNvbG9yQT0wLHRoaXMudGhpY2tuZXNzPTEsdGhpcy5jYXBzPTEsdGhpcy5qb2ludHM9Mix0aGlzLm1pdGVyTGltaXQ9MCx0aGlzLiRtYWluQXR0YWNobWVudE9iamVjdD1udWxsLHRoaXMuZ2xvYmFsQWxwaGE9MSx0aGlzLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0ibm9ybWFsIix0aGlzLmltYWdlU21vb3RoaW5nRW5hYmxlZD0hMSx0aGlzLiRmaWxsU3R5bGU9bmV3IEZsb2F0MzJBcnJheShbMSwxLDEsMV0pLHRoaXMuJHN0cm9rZVN0eWxlPW5ldyBGbG9hdDMyQXJyYXkoWzEsMSwxLDFdKSx0aGlzLm1hc2tCb3VuZHM9e3hNaW46MCx5TWluOjAseE1heDowLHlNYXg6MH0sYS5waXhlbFN0b3JlaShhLlVOUEFDS19BTElHTk1FTlQsMSksYS5waXhlbFN0b3JlaShhLlVOUEFDS19GTElQX1lfV0VCR0wsITApLChlPT57RD1lLmNyZWF0ZUZyYW1lYnVmZmVyKCl9KShhKSwoZT0+e2o9ZS5jcmVhdGVGcmFtZWJ1ZmZlcigpfSkoYSksKChlLHQpPT57ej1lLmNyZWF0ZUZyYW1lYnVmZmVyKCksZS5iaW5kRnJhbWVidWZmZXIoZS5GUkFNRUJVRkZFUix6KSxlLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGUuRlJBTUVCVUZGRVIsZS5DT0xPUl9BVFRBQ0hNRU5UMCxlLlRFWFRVUkVfMkQsdC5yZXNvdXJjZSwwKSxlLmJpbmRGcmFtZWJ1ZmZlcihlLkZSQU1FQlVGRkVSLG51bGwpLGUuYmluZEZyYW1lYnVmZmVyKGUuRFJBV19GUkFNRUJVRkZFUix6KX0pKGEsRWUoKSksKGU9PntIPWUuY3JlYXRlRnJhbWVidWZmZXIoKSxLPWUuY3JlYXRlRnJhbWVidWZmZXIoKSxaPWUuY3JlYXRlRnJhbWVidWZmZXIoKSxRPWUuY3JlYXRlQnVmZmVyKCksZS5iaW5kQnVmZmVyKGUuUElYRUxfUEFDS19CVUZGRVIsUSl9KShhKSxnbihhKSxuLmVuYWJsZShuLkJMRU5EKSxVdCgpLChlPT57WG49TWF0aC5mbG9vciguNzUqZS5nZXRQYXJhbWV0ZXIoZS5NQVhfRlJBR01FTlRfVU5JRk9STV9WRUNUT1JTKSl9KShhKSxyPXRoaXN9Y2xlYXJUcmFuc2ZlckJvdW5kcygpeygoKT0+e2ZvcihsZXQgZT0wO2U8eWUubGVuZ3RoOysrZSl7Y29uc3QgdD15ZVtlXTt0JiYodFswXT10WzFdPWJlLHRbMl09dFszXT1kZSl9Zm9yKGxldCBlPTA7ZTxUZS5sZW5ndGg7KytlKXtjb25zdCB0PVRlW2VdO3QmJih0WzBdPXRbMV09YmUsdFsyXT10WzNdPWRlKX19KSgpfXVwZGF0ZUJhY2tncm91bmRDb2xvcihlLHQsbixyKXsoKGUsdCxuLHIscyk9PntlLiRjbGVhckNvbG9yUj1hKHQsMCwxLDApLGUuJGNsZWFyQ29sb3JHPWEobiwwLDEsMCksZS4kY2xlYXJDb2xvckI9YShyLDAsMSwwKSxlLiRjbGVhckNvbG9yQT1hKHMsMCwxLDApfSkodGhpcyxlLHQsbixyKX1maWxsQmFja2dyb3VuZENvbG9yKCl7dmFyIGUsdCxyLGE7ZT10aGlzLiRjbGVhckNvbG9yUix0PXRoaXMuJGNsZWFyQ29sb3JHLHI9dGhpcy4kY2xlYXJDb2xvckIsYT10aGlzLiRjbGVhckNvbG9yQSxuLmNsZWFyQ29sb3IoZSx0LHIsYSksbi5jbGVhcihuLkNPTE9SX0JVRkZFUl9CSVR8bi5TVEVOQ0lMX0JVRkZFUl9CSVQpLG4uY2xlYXJDb2xvcigwLDAsMCwwKX1yZXNpemUoZSx0LG49ITApe09lKHRoaXMsZSx0LG4pfWNsZWFyUmVjdChlLHQscixhKXsoKGUsdCxyLGEpPT57bi5lbmFibGUobi5TQ0lTU09SX1RFU1QpLG4uc2Npc3NvcihlLHQscixhKSxuLmNsZWFyKG4uQ09MT1JfQlVGRkVSX0JJVHxuLlNURU5DSUxfQlVGRkVSX0JJVCksbi5kaXNhYmxlKG4uU0NJU1NPUl9URVNUKX0pKGUsdCxyLGEpfWJpbmQoZSl7TmUodGhpcyxlKX1zYXZlKCl7dmFyIGU7KGU9dGhpcykuJHN0YWNrLnB1c2goZCguLi5lLiRtYXRyaXgpKX1yZXN0b3JlKCl7RGUodGhpcyl9c2V0VHJhbnNmb3JtKGUsdCxuLHIsYSxzKXsoKGUsdCxuLHIsYSxzLG8pPT57ZVswXT10LGVbMV09bixlWzNdPXIsZVs0XT1hLGVbNl09cyxlWzddPW99KSh0aGlzLiRtYXRyaXgsZSx0LG4scixhLHMpfXRyYW5zZm9ybShlLHQsbixyLGEscyl7KChlLHQsbixyLGEscyxvKT0+e2NvbnN0IGk9ZS4kbWF0cml4WzBdLGM9ZS4kbWF0cml4WzFdLGw9ZS4kbWF0cml4WzNdLHU9ZS4kbWF0cml4WzRdLGg9ZS4kbWF0cml4WzZdLGI9ZS4kbWF0cml4WzddO2UuJG1hdHJpeFswXT10KmkrbipsLGUuJG1hdHJpeFsxXT10KmMrbip1LGUuJG1hdHJpeFszXT1yKmkrYSpsLGUuJG1hdHJpeFs0XT1yKmMrYSp1LGUuJG1hdHJpeFs2XT1zKmkrbypsK2gsZS4kbWF0cml4WzddPXMqYytvKnUrYn0pKHRoaXMsZSx0LG4scixhLHMpfXJlc2V0KCl7dmFyIGU7KGU9dGhpcykuZ2xvYmFsQWxwaGE9MSxlLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0ibm9ybWFsIixlLmltYWdlU21vb3RoaW5nRW5hYmxlZD0hMX1iZWdpblBhdGgoKXt2YXIgZTsoZT10aGlzKS4kZmlsbFN0eWxlLmZpbGwoMSksZS4kc3Ryb2tlU3R5bGUuZmlsbCgxKSwoKCk9Pntmb3IoVC5sZW5ndGg9MDtSLmxlbmd0aDspaShSLnBvcCgpKX0pKCl9bW92ZVRvKGUsdCl7JChlLHQpfWxpbmVUbyhlLHQpeygoZSx0KT0+e1QubGVuZ3RofHwkKGUsdCksRihlLHQpfHx3KGUsdCwhMSl9KShlLHQpfXF1YWRyYXRpY0N1cnZlVG8oZSx0LG4scil7TyhlLHQsbixyKX1maWxsU3R5bGUoZSx0LG4scil7dGhpcy4kZmlsbFN0eWxlWzBdPWUsdGhpcy4kZmlsbFN0eWxlWzFdPXQsdGhpcy4kZmlsbFN0eWxlWzJdPW4sdGhpcy4kZmlsbFN0eWxlWzNdPXJ9c3Ryb2tlU3R5bGUoZSx0LG4scil7dGhpcy4kc3Ryb2tlU3R5bGVbMF09ZSx0aGlzLiRzdHJva2VTdHlsZVsxXT10LHRoaXMuJHN0cm9rZVN0eWxlWzJdPW4sdGhpcy4kc3Ryb2tlU3R5bGVbM109cn1jbG9zZVBhdGgoKXsoKCk9PntpZihULmxlbmd0aDw3KXJldHVybjtjb25zdCBlPStUWzBdLHQ9K1RbMV07RihlLHQpfHx3KGUsdCwhMSl9KSgpfWFyYyhlLHQsbil7KChlLHQsbik9Pntjb25zdCByPW4sYT0uNTUyMjg0NzQ5ODMwNzkzNipuO1AoZStyLHQrYSxlK2EsdCtyLGUsdCtyKSxQKGUtYSx0K3IsZS1yLHQrYSxlLXIsdCksUChlLXIsdC1hLGUtYSx0LXIsZSx0LXIpLFAoZSthLHQtcixlK3IsdC1hLGUrcix0KX0pKGUsdCxuKX1iZXppZXJDdXJ2ZVRvKGUsdCxuLHIsYSxzKXtQKGUsdCxuLHIsYSxzKX1maWxsKCl7KGU9Pntjb25zdCB0PU0oKTtpZighdC5sZW5ndGgpcmV0dXJuO1llLnB1c2goZSk7Y29uc3Qgbj16ZSh0KTtHZShuLmJ1ZmZlciksVmUucHVzaChuLmluZGV4Q291bnQpfSkoImZpbGwiKX1ncmFkaWVudEZpbGwoZSx0LG4scixhLHMpeygoZSx0LG4scixhLHMpPT57Y29uc3Qgbz1NKCk7aWYoIW8ubGVuZ3RoKXJldHVybjtZZS5wdXNoKDA9PT1lPyJsaW5lYXIiOiJyYWRpYWwiKTtjb25zdCBpPXplKG8pO0dlKGkuYnVmZmVyKSxWZS5wdXNoKGkuaW5kZXhDb3VudCksS2UucHVzaCh0LG4scixhKSwxPT09ZSYmS2UucHVzaChzKX0pKGUsdCxuLHIsYSxzKX1iaXRtYXBGaWxsKGUsdCxuLHIsYSxzKXsoKGUsdCxuLHIsYSxzKT0+e2NvbnN0IG89TSgpO2lmKCFvLmxlbmd0aClyZXR1cm47WWUucHVzaCgiYml0bWFwIik7Y29uc3QgaT16ZShvKTtHZShpLmJ1ZmZlciksVmUucHVzaChpLmluZGV4Q291bnQpLHluLnB1c2goZSx0LG4scixhLHMpfSkoZSx0LG4scixhLHMpfXN0cm9rZSgpeygoKT0+e2NvbnN0IGU9TSghMCk7aWYoIWUubGVuZ3RoKXJldHVybjtZZS5wdXNoKCJmaWxsIik7Y29uc3QgdD1odChlKTtHZSh0LmJ1ZmZlciksVmUucHVzaCh0LmluZGV4Q291bnQpfSkoKX1ncmFkaWVudFN0cm9rZShlLHQsbixyLGEscyl7KChlLHQsbixyLGEscyk9Pntjb25zdCBvPU0oKTtpZighby5sZW5ndGgpcmV0dXJuO1llLnB1c2goMD09PWU/ImxpbmVhciI6InJhZGlhbCIpO2NvbnN0IGk9aHQobyk7R2UoaS5idWZmZXIpLFZlLnB1c2goaS5pbmRleENvdW50KSxLZS5wdXNoKHQsbixyLGEpLDE9PT1lJiZLZS5wdXNoKHMpfSkoZSx0LG4scixhLHMpfWJpdG1hcFN0cm9rZShlLHQsbixyLGEscyl7KChlLHQsbixyLGEscyk9Pntjb25zdCBvPU0oITApO2lmKCFvLmxlbmd0aClyZXR1cm47WWUucHVzaCgiYml0bWFwIik7Y29uc3QgaT1odChvKTtHZShpLmJ1ZmZlciksVmUucHVzaChpLmluZGV4Q291bnQpLHluLnB1c2goZSx0LG4scixhLHMpfSkoZSx0LG4scixhLHMpfWNsaXAoKXsoKCk9Pntjb25zdCBlPXIuY3VycmVudEF0dGFjaG1lbnRPYmplY3Q7aWYoIWUpcmV0dXJuO2NvbnN0IHQ9TGUuZ2V0KGUuY2xpcExldmVsKSxhPXRbMF0scz10WzFdLG89dFsyXSxpPXRbM10sYz1NYXRoLmNlaWwoTWF0aC5hYnMoby1hKSksbD1NYXRoLmNlaWwoTWF0aC5hYnMoaS1zKSk7bi5lbmFibGUobi5TQ0lTU09SX1RFU1QpLG4uc2Npc3NvcihhLGUuaGVpZ2h0LXMtbCxjLGwpO2NvbnN0IHU9QXQoKTtsZXQgaD1VZS5nZXQoZS5jbGlwTGV2ZWwpLGI9MCxkPW51bGw7Y29uc3QgZj1WZS5sZW5ndGg7Zm9yKGxldCB0PTA7dDxmO3QrKyl7bi5zdGVuY2lsTWFzaygxPDxoLTEpO2NvbnN0IHI9VmVbdF07YnQuaGFzKHQpJiYoZD1idC5nZXQodCkpO2NvbnN0IGE9T3QoISFkKTtkJiZTdChhLGQpLE50KGEsdSxiLHIpLGIrPXIsKytoLGg+NyYmKGp0KCksaD1lLmNsaXBMZXZlbCsxKX1VZS5zZXQoZS5jbGlwTGV2ZWwsaCksVHQodSkscWUoKSxkdCgpLG4uZGlzYWJsZShuLlNDSVNTT1JfVEVTVCl9KSgpfWdldCBjdXJyZW50QXR0YWNobWVudE9iamVjdCgpe3JldHVybiBHKCl9Z2V0IGF0bGFzQXR0YWNobWVudE9iamVjdCgpe3JldHVybiBwZSgpfWNyZWF0ZU5vZGUoZSx0KXtyZXR1cm4gR3QoZSx0KX1yZW1vdmVOb2RlKGUpeyhlPT57Y29uc3QgdD1nZVtlLmluZGV4XTt0JiZ0LmRpc3Bvc2UoZS54LGUueSxlLncsZS5oKX0pKGUpfWJlZ2luTm9kZVJlbmRlcmluZyhlKXt2YXIgdCxyLGEsczsoZT0+e2NvbnN0IHQ9QWUoZS5pbmRleCksbj10WzBdLHI9dFsxXSxhPXRbMl0scz10WzNdO3RbMF09TWF0aC5taW4oZS54LG4pLHRbMV09TWF0aC5taW4oZS55LHIpLHRbMl09TWF0aC5tYXgoZS54K2UudyxhKSx0WzNdPU1hdGgubWF4KGUueStlLmgscyl9KShlKSx0PWUueCxyPWUueSxhPWUudyxzPWUuaCxuLmVuYWJsZShuLlNDSVNTT1JfVEVTVCksbi5zY2lzc29yKHQscixhKzEscysxKSxuLmNsZWFyKG4uQ09MT1JfQlVGRkVSX0JJVHxuLlNURU5DSUxfQlVGRkVSX0JJVCksbi5zY2lzc29yKHQscixhLHMpfWVuZE5vZGVSZW5kZXJpbmcoKXtuLmRpc2FibGUobi5TQ0lTU09SX1RFU1QpfWRyYXdGaWxsKCl7KCgpPT57Y29uc3QgZT1BdCgpO24uZW5hYmxlKG4uU1RFTkNJTF9URVNUKSxuLmZyb250RmFjZShuLkNDVyksbi5zdGVuY2lsTWFzaygyNTUpO2xldCB0PTAscj1udWxsO2ZvcihsZXQgbj0wO248WWUubGVuZ3RoO24rKylzd2l0Y2goYnQuaGFzKG4pJiYocj1idC5nZXQobikpLFllW25dKXtjYXNlImZpbGwiOntjb25zdCBuPVZlLnNoaWZ0KCk7YnIoZSx0LG4sciksdCs9bn1icmVhaztjYXNlImxpbmVhciI6e2NvbnN0IG49VmUuc2hpZnQoKTtwcihlLHQsbixyKSx0Kz1ufWJyZWFrO2Nhc2UicmFkaWFsIjp7Y29uc3Qgbj1WZS5zaGlmdCgpO2dyKGUsdCxuLHIpLHQrPW59YnJlYWs7Y2FzZSJiaXRtYXAiOntjb25zdCBuPVZlLnNoaWZ0KCk7RXIoZSx0LG4sciksdCs9bn19bi5kaXNhYmxlKG4uU1RFTkNJTF9URVNUKSxUdChlKSxxZSgpLGR0KCl9KSgpfWRyYXdEaXNwbGF5T2JqZWN0KHQsbixhLHMsbyxpKXsoZT0+e2NvbnN0IHQ9UmUoZS5pbmRleCksbj10WzBdLHI9dFsxXSxhPXRbMl0scz10WzNdO3RbMF09TWF0aC5taW4oZS54LG4pLHRbMV09TWF0aC5taW4oZS55LHIpLHRbMl09TWF0aC5tYXgoZS54K2UudyxhKSx0WzNdPU1hdGgubWF4KGUueStlLmgscyl9KSh0KSwoKHQsbixhLHMsbyxpKT0+e2NvbnN0IGM9aVswXSxsPWlbMV0sdT1pWzJdLGg9ci5nbG9iYWxBbHBoYSxiPWlbNF0vMjU1LGQ9aVs1XS8yNTUsZj1pWzZdLzI1NSx2PXIuJG1hdHJpeDtzd2l0Y2goci5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24pe2Nhc2Uibm9ybWFsIjpjYXNlImxheWVyIjpjYXNlImFkZCI6Y2FzZSJzY3JlZW4iOmNhc2UiYWxwaGEiOmNhc2UiZXJhc2UiOmNhc2UiY29weSI6e2lmKFB0KCkhPT1yLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbnx8RmUoKSE9PXQuaW5kZXgpe21lKEZlKCkpO2NvbnN0IGU9ci5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb247ci5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249UHQoKSxyLmRyYXdBcnJheXNJbnN0YW5jZWQoKSxyLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj1lLEN0KHIuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uKSx3ZSh0LmluZGV4KSxtZSh0LmluZGV4KX1jb25zdCBuPVp0KCk7cXQucHVzaCh0LngvZSx0LnkvZSx0LncvZSx0LmgvZSx0LncsdC5oLHgoKSxFKCksdls2XSx2WzddLHZbMF0sdlsxXSx2WzNdLHZbNF0sYyxsLHUsaCxiLGQsZiwwKSxuLmNvdW50Kyt9YnJlYWs7ZGVmYXVsdDp7Y29uc3QgZT1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0O3IuZHJhd0FycmF5c0luc3RhbmNlZCgpO2NvbnN0IGk9TWF0aC5jZWlsKE1hdGguYWJzKHMtbikpLF89TWF0aC5jZWlsKE1hdGguYWJzKG8tYSkpO2xldCBwPTAsZz0wLHg9dG4odCk7aWYoMSE9PXZbMF18fDAhPT12WzFdfHwwIT09dlszXXx8MSE9PXZbNF0pe2NvbnN0IG49aGUoaSxfLCExKSxhPW0odlswXSx2WzFdLHZbM10sdls0XSxpLzIsXy8yKSxzPW0oMSwwLDAsMSwtdC53LzIsLXQuaC8yKSxvPW0oYVswXSpzWzBdK2FbMl0qc1sxXSxhWzFdKnNbMF0rYVszXSpzWzFdLGFbMF0qc1syXSthWzJdKnNbM10sYVsxXSpzWzJdK2FbM10qc1szXSxhWzBdKnNbNF0rYVsyXSpzWzVdK2FbNF0sYVsxXSpzWzRdK2FbM10qc1s1XSthWzVdKTtyLnNhdmUoKSxyLmJpbmQobiksci5zZXRUcmFuc2Zvcm0ob1swXSxvWzFdLG9bMl0sb1szXSxvWzRdLG9bNV0pLHA9b1s0XSxnPW9bNV07Y29uc3QgYz1kbigpO2ZuKGMseC53aWR0aCx4LmhlaWdodCksa2UoeCwhMCksc24oYyksTCh4KSx4PW4udGV4dHVyZSxlZShuLCExKSxlJiZyLmJpbmQoZSksci5yZXN0b3JlKCl9KHB8fGcpJiYodls2XS09cCx2WzddLT1nKTtjb25zdCBFPWxuKHZbNl0sdls3XSxpLF8pLHk9aGUoaSxfLCExKTtyLmJpbmQoeSksbm4oRSx4KTtjb25zdCBBPVF0KHIuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uKTtibihBLGMsbCx1LGgsYixkLGYsMCksc24oQSksZSYmci5iaW5kKGUpLGhuKHkudGV4dHVyZSksKHB8fGcpJiYodls2XSs9cCx2WzddKz1nKSxMKHgpLEwoRSksZWUoeSksQ3Qoci5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24pLHdlKHQuaW5kZXgpLG1lKHQuaW5kZXgpfX19KSh0LG4sYSxzLG8saSl9ZHJhd0FycmF5c0luc3RhbmNlZCgpeygoKT0+e2NvbnN0IGU9WnQoKTtlLmNvdW50JiYoZW4oKSxwbihyLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiksdm4oZSksZS5jbGVhcigpKX0pKCl9Y2xlYXJBcnJheXNJbnN0YW5jZWQoKXtadCgpLmNsZWFyKCl9dHJhbnNmZXJNYWluQ2FudmFzKCl7KCgpPT57Y29uc3QgZT1yLiRtYWluQXR0YWNobWVudE9iamVjdDtyLmJpbmQoZSksbi5iaW5kRnJhbWVidWZmZXIobi5SRUFEX0ZSQU1FQlVGRkVSLEQpLG4uYmluZEZyYW1lYnVmZmVyKG4uRFJBV19GUkFNRUJVRkZFUixudWxsKTtjb25zdCB0PWUud2lkdGgsYT1lLmhlaWdodDtuLmJsaXRGcmFtZWJ1ZmZlcigwLDAsdCxhLDAsMCx0LGEsbi5DT0xPUl9CVUZGRVJfQklULG4uTkVBUkVTVCksbi5iaW5kRnJhbWVidWZmZXIobi5EUkFXX0ZSQU1FQlVGRkVSLGopLG4uYmluZEZyYW1lYnVmZmVyKG4uRlJBTUVCVUZGRVIsRCl9KSgpfWRyYXdQaXhlbHMoZSx0KXsoKGUsdCk9Pntjb25zdCBuPXhuKGUudyxlLmgsdCkscj1ybigpO2FuKHIsZS53LGUuaCksVXQoKSxzbihyKSxMKG4pfSkoZSx0KX1kcmF3RWxlbWVudChlLHQpe0VuKGUsdCl9YmVnaW5NYXNrKCl7KCgpPT57Y29uc3QgZT1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0O2UmJihlLm1hc2s9ITAsZS5jbGlwTGV2ZWwrKyxVZS5zZXQoZS5jbGlwTGV2ZWwsZS5jbGlwTGV2ZWwpLEllKCl8fChCZSghMCksbi5lbmFibGUobi5TVEVOQ0lMX1RFU1QpLG4uZW5hYmxlKG4uU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFKSxuLnN0ZW5jaWxGdW5jKG4uQUxXQVlTLDAsMjU1KSxuLnN0ZW5jaWxPcChuLlpFUk8sbi5JTlZFUlQsbi5JTlZFUlQpLG4uY29sb3JNYXNrKCExLCExLCExLCExKSkpfSkoKX1zZXRNYXNrQm91bmRzKGUsdCxhLHMpeygoZSx0LGEscyk9Pntjb25zdCBvPXIuY3VycmVudEF0dGFjaG1lbnRPYmplY3Q7aWYoIW8pcmV0dXJuO0xlLnNldChvLmNsaXBMZXZlbCx1KGUsdCxhLHMpKTtjb25zdCBpPU1hdGguY2VpbChNYXRoLmFicyhhLWUpKSxjPU1hdGguY2VpbChNYXRoLmFicyhzLXQpKTtuLmVuYWJsZShuLlNDSVNTT1JfVEVTVCksbi5zY2lzc29yKGUsby5oZWlnaHQtdC1jLGksYyl9KShlLHQsYSxzKX1lbmRNYXNrKCl7Q2UoKX1sZWF2ZU1hc2soKXt0aGlzLmRyYXdBcnJheXNJbnN0YW5jZWQoKSwoKCk9Pntjb25zdCBlPXIuY3VycmVudEF0dGFjaG1lbnRPYmplY3Q7aWYoIWUpcmV0dXJuO2NvbnN0IHQ9ZS5jbGlwTGV2ZWwsYT1MZS5nZXQodCkscz1hWzBdLG89YVsxXSxpPWFbMl0sYz1hWzNdO0xlLmRlbGV0ZSh0KSxVZS5kZWxldGUodCksaChhKTtjb25zdCBsPU1hdGguY2VpbChNYXRoLmFicyhpLXMpKSx1PU1hdGguY2VpbChNYXRoLmFicyhjLW8pKTtpZihuLmVuYWJsZShuLlNDSVNTT1JfVEVTVCksbi5zY2lzc29yKHMsZS5oZWlnaHQtby11LGwsdSksLS1lLmNsaXBMZXZlbCwhZS5jbGlwTGV2ZWwpcmV0dXJuIGUubWFzaz0hMSxCZSghMSksbi5jbGVhcihuLlNURU5DSUxfQlVGRkVSX0JJVCksbi5kaXNhYmxlKG4uU1RFTkNJTF9URVNUKSxuLmRpc2FibGUobi5TQ0lTU09SX1RFU1QpLFVlLmNsZWFyKCksdm9pZCBMZS5jbGVhcigpO24uc3RlbmNpbE1hc2soMTw8ZS5jbGlwTGV2ZWwpLG4uc3RlbmNpbEZ1bmMobi5BTFdBWVMsMCwyNTUpLG4uc3RlbmNpbE9wKG4uUkVQTEFDRSxuLlJFUExBQ0Usbi5SRVBMQUNFKSxuLmNvbG9yTWFzayghMSwhMSwhMSwhMSksTnQoRHQoKSx5dCgpLDAsNiksQ2UoKX0pKCl9dXNlR3JpZChlKXsoZT0+e2J0LnNldChWZS5sZW5ndGgsZSl9KShlKX1hcHBseUZpbHRlcihlLHQsbixyLGEscyxvLGksYyxsLHUpe3RoaXMuZHJhd0FycmF5c0luc3RhbmNlZCgpLGhyKGUsdCxuLHIsYSxzLG8saSxjLGwsdSl9YXN5bmMgY3JlYXRlSW1hZ2VCaXRtYXAoZSx0KXtyZXR1cm4gYXdhaXQgVHIoZSx0KX19bGV0IE1yO2xldCB3cjtsZXQgRnI9MDtsZXQgJHI9MDtsZXQgT3I9ITE7Y29uc3QgU3I9W10sa3I9KC4uLmUpPT57Y29uc3QgdD1Tci5wb3AoKXx8W107cmV0dXJuIGUubGVuZ3RoJiZ0LnB1c2goLi4uZSksdH0sQ3I9KGUsdD0xKT0+KHtSOigxNjcxMTY4MCZlKT4+MTYsRzooNjUyODAmZSk+PjgsQjoyNTUmZSxBOjI1NSp0fSksUHI9KGUsdCk9PnsoZT0+e3dyPWV9KShlKTtjb25zdCBuPWUuZ2V0Q29udGV4dCgid2ViZ2wyIix7c3RlbmNpbDohMCxwcmVtdWx0aXBsaWVkQWxwaGE6ITAsYW50aWFsaWFzOiExLGRlcHRoOiExfSk7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCJ3ZWJnbDIgaXMgbm90IHN1cHBvcnRlZC4iKTt2YXIgcjtyPW5ldyBScihuLDQsdCksTXI9cn0sQnI9KGUsdCxuPSEwKT0+e0ZyPT09ZSYmJHI9PT10fHwoT3I9ITAsRnI9ZSwkcj10LE1yLnJlc2l6ZShlLHQsbiksbiYmdXIucmVzZXQoKSl9LElyPShlLHQ9ITEpPT57bGV0IG49MDtmb3IoO2UubGVuZ3RoPm47KXN3aXRjaChlW24rK10pe2Nhc2UgOTpNci5iZWdpblBhdGgoKTticmVhaztjYXNlIDA6TXIubW92ZVRvKGVbbisrXSxlW24rK10pO2JyZWFrO2Nhc2UgMjpNci5saW5lVG8oZVtuKytdLGVbbisrXSk7YnJlYWs7Y2FzZSAxOk1yLnF1YWRyYXRpY0N1cnZlVG8oZVtuKytdLGVbbisrXSxlW24rK10sZVtuKytdKTticmVhaztjYXNlIDU6aWYodCl7bis9NDticmVha31Nci5maWxsU3R5bGUoZVtuKytdLzI1NSxlW24rK10vMjU1LGVbbisrXS8yNTUsZVtuKytdLzI1NSk7YnJlYWs7Y2FzZSA3Ok1yLmZpbGwoKTticmVhaztjYXNlIDY6aWYodCl7bis9ODticmVha31Nci50aGlja25lc3M9ZVtuKytdLE1yLmNhcHM9ZVtuKytdLE1yLmpvaW50cz1lW24rK10sTXIubWl0ZXJMaW1pdD1lW24rK10sTXIuc3Ryb2tlU3R5bGUoZVtuKytdLzI1NSxlW24rK10vMjU1LGVbbisrXS8yNTUsZVtuKytdLzI1NSk7YnJlYWs7Y2FzZSA4OmlmKHQpYnJlYWs7TXIuc3Ryb2tlKCk7YnJlYWs7Y2FzZSAxMjpNci5jbG9zZVBhdGgoKTticmVhaztjYXNlIDQ6TXIuYXJjKGVbbisrXSxlW24rK10sZVtuKytdKTticmVhaztjYXNlIDM6TXIuYmV6aWVyQ3VydmVUbyhlW24rK10sZVtuKytdLGVbbisrXSxlW24rK10sZVtuKytdLGVbbisrXSk7YnJlYWs7Y2FzZSAxMDp7aWYodCl7bis9MTtjb25zdCB0PWVbbisrXTtuKz01KnQsbis9OSxNci5maWxsKCk7YnJlYWt9Y29uc3Qgcj1lW24rK10sYT1rcigpLHM9ZVtuKytdO2ZvcihsZXQgdD0wO3Q8czsrK3QpYS5wdXNoKGVbbisrXSxlW24rK10sZVtuKytdLGVbbisrXSxlW24rK10pO2NvbnN0IG89bmV3IEZsb2F0MzJBcnJheShbZVtuKytdLGVbbisrXSxlW24rK10sZVtuKytdLGVbbisrXSxlW24rK11dKSxpPWVbbisrXSxjPWVbbisrXSxsPWVbbisrXTtNci5ncmFkaWVudEZpbGwocixhLG8saSxjLGwpfWJyZWFrO2Nhc2UgMTM6e2lmKHQpe24rPTI7Y29uc3QgdD1lW24rK107bis9dCxuKz04LE1yLmZpbGwoKTticmVha31jb25zdCByPWVbbisrXSxhPWVbbisrXSxzPWVbbisrXSxvPW5ldyBVaW50OEFycmF5KGUuc3ViYXJyYXkobixuK3MpKTtuKz1zO2NvbnN0IGk9bmV3IEZsb2F0MzJBcnJheShbZVtuKytdLGVbbisrXSxlW24rK10sZVtuKytdLGVbbisrXSxlW24rK11dKTtNci5iaXRtYXBGaWxsKG8saSxyLGEsQm9vbGVhbihlW24rK10pLEJvb2xlYW4oZVtuKytdKSl9YnJlYWs7Y2FzZSAxMTp7aWYodCl7bis9MjAsTXIuZmlsbCgpO2JyZWFrfU1yLnRoaWNrbmVzcz1lW24rK10sTXIuY2Fwcz1lW24rK10sTXIuam9pbnRzPWVbbisrXSxNci5taXRlckxpbWl0PWVbbisrXTtjb25zdCByPWVbbisrXSxhPWtyKCkscz1lW24rK107Zm9yKGxldCB0PTA7dDxzOysrdClhLnB1c2goZVtuKytdLGVbbisrXSxlW24rK10sZVtuKytdLGVbbisrXSk7Y29uc3Qgbz1uZXcgRmxvYXQzMkFycmF5KFtlW24rK10sZVtuKytdLGVbbisrXSxlW24rK10sZVtuKytdLGVbbisrXV0pLGk9ZVtuKytdLGM9ZVtuKytdLGw9ZVtuKytdO01yLmdyYWRpZW50U3Ryb2tlKHIsYSxvLGksYyxsKX1icmVhaztjYXNlIDE0OntpZih0KXtuKz02O2NvbnN0IHQ9ZVtuKytdO24rPXQsbis9OCxNci5maWxsKCk7YnJlYWt9TXIudGhpY2tuZXNzPWVbbisrXSxNci5jYXBzPWVbbisrXSxNci5qb2ludHM9ZVtuKytdLE1yLm1pdGVyTGltaXQ9ZVtuKytdO2NvbnN0IHI9ZVtuKytdLGE9ZVtuKytdLHM9ZVtuKytdLG89bmV3IFVpbnQ4QXJyYXkoZS5zdWJhcnJheShuLG4rcykpO24rPXM7Y29uc3QgaT1uZXcgRmxvYXQzMkFycmF5KFtlW24rK10sZVtuKytdLGVbbisrXSxlW24rK10sZVtuKytdLGVbbisrXV0pO01yLmJpdG1hcFN0cm9rZShvLGkscixhLEJvb2xlYW4oZVtuKytdKSxCb29sZWFuKGVbbisrXSkpfX19LExyPWU9Pntzd2l0Y2goZSl7Y2FzZSAwOnJldHVybiJjb3B5IjtjYXNlIDE6cmV0dXJuImFkZCI7Y2FzZSAyOnJldHVybiJhbHBoYSI7Y2FzZSAzOnJldHVybiJkYXJrZW4iO2Nhc2UgNDpyZXR1cm4iZGlmZmVyZW5jZSI7Y2FzZSA1OnJldHVybiJlcmFzZSI7Y2FzZSA2OnJldHVybiJoYXJkbGlnaHQiO2Nhc2UgNzpyZXR1cm4iaW52ZXJ0IjtjYXNlIDg6cmV0dXJuImxheWVyIjtjYXNlIDk6cmV0dXJuImxpZ2h0ZW4iO2Nhc2UgMTA6cmV0dXJuIm11bHRpcGx5IjtjYXNlIDExOmRlZmF1bHQ6cmV0dXJuIm5vcm1hbCI7Y2FzZSAxMjpyZXR1cm4ib3ZlcmxheSI7Y2FzZSAxMzpyZXR1cm4ic2NyZWVuIjtjYXNlIDE0OnJldHVybiJzdWJ0cmFjdCJ9fSxVcj0oZSx0KT0+e2NvbnN0IG49ZS5zdWJhcnJheSh0LHQrNik7dCs9Njtjb25zdCByPWUuc3ViYXJyYXkodCx0KzgpO3QrPTg7Y29uc3QgYT1lLnN1YmFycmF5KHQsdCs0KTt0Kz00O2NvbnN0IHM9ZVt0KytdLG89ZVt0KytdLGk9ZVt0KytdLGM9ZVt0KytdLGw9Qm9vbGVhbihlW3QrK10pLHU9Qm9vbGVhbihlW3QrK10pLGg9Qm9vbGVhbihlW3QrK10pLGI9YCR7ZVt0KytdfWAsZD1lW3QrK10sZj1NYXRoLnNxcnQoblswXSpuWzBdK25bMV0qblsxXSksbT1NYXRoLnNxcnQoblsyXSpuWzJdK25bM10qblszXSk7bGV0IHY7aWYoZVt0KytdKXtpZih2PXVyLmdldChiLGAke2R9YCksIXYpcmV0dXJuIHR9ZWxzZXtjb25zdCBuPWw/bmV3IEZsb2F0MzJBcnJheSgyOCk6bnVsbDtuJiYobi5zZXQoZS5zdWJhcnJheSh0LHQrMjQpKSx0Kz0yNCksTXIudXNlR3JpZChuKTtjb25zdCByPWVbdCsrXSxhPWUuc3ViYXJyYXkodCx0K3IpO2lmKGgmJiFsKXtjb25zdCBlPU1hdGguY2VpbChNYXRoLmFicyhpLXMpKSx0PU1hdGguY2VpbChNYXRoLmFicyhjLW8pKTt2PU1yLmNyZWF0ZU5vZGUoZSx0KSx1ci5zZXQoYixgJHtkfWAsdik7Y29uc3Qgbj1Nci5jdXJyZW50QXR0YWNobWVudE9iamVjdDtNci5iaW5kKE1yLmF0bGFzQXR0YWNobWVudE9iamVjdCksTXIucmVzZXQoKSxNci5iZWdpbk5vZGVSZW5kZXJpbmcodik7Y29uc3Qgcj1Nci5hdGxhc0F0dGFjaG1lbnRPYmplY3QuaGVpZ2h0LXYueS10O01yLnNldFRyYW5zZm9ybSgxLDAsMCwxLHYueCxyKSx1PyhJcihhKSxNci5kcmF3RmlsbCgpKTpNci5kcmF3UGl4ZWxzKHYsbmV3IFVpbnQ4QXJyYXkoYSkpLE1yLmVuZE5vZGVSZW5kZXJpbmcoKSxuJiZNci5iaW5kKG4pfWVsc2V7Y29uc3QgZT1NYXRoLmNlaWwoTWF0aC5hYnMoaS1zKSpmKSx0PU1hdGguY2VpbChNYXRoLmFicyhjLW8pKm0pO3Y9TXIuY3JlYXRlTm9kZShlLHQpLHVyLnNldChiLGAke2R9YCx2KTtjb25zdCByPU1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0O01yLmJpbmQoTXIuYXRsYXNBdHRhY2htZW50T2JqZWN0KSxNci5yZXNldCgpLE1yLmJlZ2luTm9kZVJlbmRlcmluZyh2KTtjb25zdCBsPU1yLmF0bGFzQXR0YWNobWVudE9iamVjdC5oZWlnaHQtdi55LXQ7TXIuc2V0VHJhbnNmb3JtKGYsMCwwLG0sLXMqZit2LngsLW8qbStsKSxuJiYoblsyNF09di54LG5bMjVdPWwpLElyKGEpLE1yLmRyYXdGaWxsKCksTXIuZW5kTm9kZVJlbmRlcmluZygpLHImJk1yLmJpbmQocil9dCs9cn1jb25zdCBfPWVbdCsrXTtpZihCb29sZWFuKGVbdCsrXSkpe2NvbnN0IHM9Qm9vbGVhbihlW3QrK10pLG89ZS5zdWJhcnJheSh0LHQrNCk7dCs9NDtjb25zdCBpPWVbdCsrXSxjPWUuc3ViYXJyYXkodCx0K2kpLGw9TWF0aC5jZWlsKE1hdGguYWJzKGFbMl0tYVswXSkpLHU9TWF0aC5jZWlsKE1hdGguYWJzKGFbM10tYVsxXSkpO3JldHVybiBNci5hcHBseUZpbHRlcih2LGIscyxsLHUsaCxuLHIsTHIoXyksbyxjKSx0Kz1pfWlmKE1yLmdsb2JhbEFscGhhPU1hdGgubWluKE1hdGgubWF4KDAsclszXStyWzddLzI1NSksMSksTXIuaW1hZ2VTbW9vdGhpbmdFbmFibGVkPSEwLE1yLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj1McihfKSxoJiYhbClNci5zZXRUcmFuc2Zvcm0oblswXSxuWzFdLG5bMl0sblszXSxuWzRdLG5bNV0pLE1yLmRyYXdEaXNwbGF5T2JqZWN0KHYsYVswXSxhWzFdLGFbMl0sYVszXSxyKTtlbHNle2NvbnN0IGU9TWF0aC5hdGFuMihuWzFdLG5bMF0pLHQ9TWF0aC5hdGFuMigtblsyXSxuWzNdKTtpZihlfHx0KXtjb25zdCByPXMqZixhPW8qbSxpPU1hdGguY29zKGUpLGM9TWF0aC5zaW4oZSksbD1NYXRoLmNvcyh0KSx1PU1hdGguc2luKHQpO01yLnNldFRyYW5zZm9ybShpLGMsLXUsbCxyKmktYSp1K25bNF0scipjK2EqbCtuWzVdKX1lbHNlIE1yLnNldFRyYW5zZm9ybSgxLDAsMCwxLGFbMF0sYVsxXSk7TXIuZHJhd0Rpc3BsYXlPYmplY3QodixhWzBdLGFbMV0sYVsyXSxhWzNdLHIpfXJldHVybiB0fSxOcj0oZSx0KT0+e2NvbnN0IG49ZS5zdWJhcnJheSh0LHQrNik7dCs9NixNci5yZXNldCgpLE1yLnNldFRyYW5zZm9ybShuWzBdLG5bMV0sblsyXSxuWzNdLG5bNF0sbls1XSk7Y29uc3Qgcj1Cb29sZWFuKGVbdCsrXSk/bmV3IEZsb2F0MzJBcnJheSgyOCk6bnVsbDtNci51c2VHcmlkKHIpLHImJihyLnNldChlLnN1YmFycmF5KHQsdCsyNCkpLHQrPTI0KTtjb25zdCBhPWVbdCsrXSxzPWUuc3ViYXJyYXkodCx0K2EpO3JldHVybiBJcihzLCEwKSx0Kz1hLE1yLmNsaXAoKSx0fSxEcj0oZSx0LG4pPT57Y29uc3Qgcj1lLndpZHRoVGFibGVbdC5saW5lXXx8MCxhPXQudGV4dEZvcm1hdCxzPWEubGVmdE1hcmdpbnx8MDtpZighbi53b3JkV3JhcCYmcj5uLnJhd1dpZHRoKXJldHVybiBNYXRoLm1heCgwLHMpO2NvbnN0IG89YS5yaWdodE1hcmdpbnx8MDtyZXR1cm4iY2VudGVyIj09PWEuYWxpZ258fCJjZW50ZXIiPT09bi5hdXRvU2l6ZT9NYXRoLm1heCgwLG4ucmF3V2lkdGgvMi1zLW8tci8yLTIpOiJyaWdodCI9PT1hLmFsaWdufHwicmlnaHQiPT09bi5hdXRvU2l6ZT9NYXRoLm1heCgwLG4ucmF3V2lkdGgtcy1yLW8tNCk6TWF0aC5tYXgoMCxzKX0sanI9ZT0+e2xldCB0PSIiO3JldHVybiBlLml0YWxpYyYmKHQrPSJpdGFsaWMgIiksZS5ib2xkJiYodCs9ImJvbGQgIiksYCR7dH0ke2Uuc2l6ZX1weCAnJHtlLmZvbnR9Jywnc2Fucy1zZXJpZidgfSx6cj1uZXcgVGV4dERlY29kZXIsWHI9KGUsdCk9Pntjb25zdCBuPWUuc3ViYXJyYXkodCx0KzYpO3QrPTY7Y29uc3Qgcj1lLnN1YmFycmF5KHQsdCs4KTt0Kz04O2NvbnN0IGE9ZS5zdWJhcnJheSh0LHQrNCk7dCs9NDtjb25zdCBzPWVbdCsrXSxvPWVbdCsrXSxpPWVbdCsrXSxjPWVbdCsrXSxsPWAke2VbdCsrXX1gLHU9ZVt0KytdLGg9Qm9vbGVhbihlW3QrK10pLGI9TWF0aC5zcXJ0KG5bMF0qblswXStuWzFdKm5bMV0pLGQ9TWF0aC5zcXJ0KG5bMl0qblsyXStuWzNdKm5bM10pO2xldCBmO2lmKGVbdCsrXSl7aWYoZj11ci5nZXQobCxgJHt1fWApLCFmKXJldHVybiB0fWVsc2V7Y29uc3Qgbj1NYXRoLmNlaWwoTWF0aC5hYnMoaS1zKSpiKSxyPU1hdGguY2VpbChNYXRoLmFicyhjLW8pKmQpLGE9Qm9vbGVhbihlW3QrK10pO2Y9YT91ci5nZXQobCxgJHt1fWApOk1yLmNyZWF0ZU5vZGUobixyKSxhfHx1ci5zZXQobCxgJHt1fWAsZik7Y29uc3QgaD1lW3QrK10sbT1uZXcgVWludDhBcnJheShlLnN1YmFycmF5KHQsdCtoKSk7dCs9aDtsZXQgdj0ibm9uZSI7c3dpdGNoKGVbdCsrXSl7Y2FzZSAwOnY9ImNlbnRlciI7YnJlYWs7Y2FzZSAxOnY9ImxlZnQiO2JyZWFrO2Nhc2UgMjp2PSJub25lIjticmVhaztjYXNlIDM6dj0icmlnaHQifWNvbnN0IF89e3dpZHRoOm4saGVpZ2h0OnIsYXV0b1NpemU6dixzdG9wSW5kZXg6ZVt0KytdLHNjcm9sbFg6ZVt0KytdLHNjcm9sbFk6ZVt0KytdLHRleHRXaWR0aDplW3QrK10sdGV4dEhlaWdodDplW3QrK10scmF3V2lkdGg6ZVt0KytdLHJhd0hlaWdodDplW3QrK10sZm9jdXNJbmRleDplW3QrK10sc2VsZWN0SW5kZXg6ZVt0KytdLGZvY3VzVmlzaWJsZTpCb29sZWFuKGVbdCsrXSksdGhpY2tuZXNzOmVbdCsrXSx0aGlja25lc3NDb2xvcjplW3QrK10sd29yZFdyYXA6Qm9vbGVhbihlW3QrK10pLGJvcmRlcjpCb29sZWFuKGVbdCsrXSksYm9yZGVyQ29sb3I6ZVt0KytdLGJhY2tncm91bmQ6Qm9vbGVhbihlW3QrK10pLGJhY2tncm91bmRDb2xvcjplW3QrK10sZGVmYXVsdENvbG9yOmVbdCsrXSxkZWZhdWx0U2l6ZTplW3QrK119LHA9KChlLHQsbixyKT0+e2NvbnN0IGE9bmV3IE9mZnNjcmVlbkNhbnZhcyh0LndpZHRoLHQuaGVpZ2h0KSxzPWEuZ2V0Q29udGV4dCgiMmQiKTtpZighcylyZXR1cm4gYTtjb25zdCBvPU1hdGgubWluKDEsTWF0aC5tYXgobixyKSk7aWYodC5iYWNrZ3JvdW5kfHx0LmJvcmRlcil7aWYocy5iZWdpblBhdGgoKSxzLm1vdmVUbygwLDApLHMubGluZVRvKHQud2lkdGgsMCkscy5saW5lVG8odC53aWR0aCx0LmhlaWdodCkscy5saW5lVG8oMCx0LmhlaWdodCkscy5saW5lVG8oMCwwKSx0LmJhY2tncm91bmQpe2NvbnN0IGU9Q3IodC5iYWNrZ3JvdW5kQ29sb3IpO3MuZmlsbFN0eWxlPWByZ2JhKCR7ZS5SfSwke2UuR30sJHtlLkJ9LCR7ZS5BfSlgLHMuZmlsbCgpfWlmKHQuYm9yZGVyKXtjb25zdCBlPUNyKHQuYm9yZGVyQ29sb3IpO3MubGluZVdpZHRoPW8scy5zdHJva2VTdHlsZT1gcmdiYSgke2UuUn0sJHtlLkd9LCR7ZS5CfSwke2UuQX0pYCxzLnN0cm9rZSgpfX1pZighZSlyZXR1cm4gYTtzLnNhdmUoKSxzLmJlZ2luUGF0aCgpLHMubW92ZVRvKDIsMikscy5saW5lVG8odC53aWR0aC0yLDIpLHMubGluZVRvKHQud2lkdGgtMix0LmhlaWdodC0yKSxzLmxpbmVUbygyLHQuaGVpZ2h0LTIpLHMubGluZVRvKDIsMikscy5jbGlwKCk7bGV0IGk9MjtpZih0LnNjcm9sbFg+MCl7Y29uc3QgZT0odC50ZXh0V2lkdGgrNC10LnJhd1dpZHRoKS90LnJhd1dpZHRoO2krPS10LnNjcm9sbFgqZX1sZXQgYz0yO2lmKHQuc2Nyb2xsWT4wKXtjb25zdCBlPSh0LnRleHRIZWlnaHQrMi10LnJhd0hlaWdodCkvdC5yYXdIZWlnaHQ7Yys9LXQuc2Nyb2xsWSplfWlmKHMuc2V0VHJhbnNmb3JtKG4sMCwwLHIsaSpuLGMqcikscy5iZWdpblBhdGgoKSx0LnNlbGVjdEluZGV4Pi0xJiZ0LmZvY3VzSW5kZXg+LTEpe2NvbnN0IG49ZS50ZXh0VGFibGUubGVuZ3RoLTE7bGV0IHI9MCxhPTA7dC5mb2N1c0luZGV4PD10LnNlbGVjdEluZGV4PyhyPU1hdGgubWluKHQuZm9jdXNJbmRleCxuKSxhPU1hdGgubWluKHQuc2VsZWN0SW5kZXgsbikpOihyPU1hdGgubWluKHQuc2VsZWN0SW5kZXgsbiksYT1NYXRoLm1pbih0LmZvY3VzSW5kZXgtMSxuKSk7Y29uc3Qgbz1lLnRleHRUYWJsZVtyXSxpPWUubGluZVRhYmxlW28ubGluZV0sYz1EcihlLGksdCk7bGV0IGw9MDtpZihyJiYidGV4dCI9PT1vLm1vZGUpe2xldCB0PXI7Zm9yKDt0Oyl7Y29uc3Qgbj1lLnRleHRUYWJsZVstLXRdO2lmKCJ0ZXh0IiE9PW4ubW9kZSlicmVhaztsKz1uLnd9fXMuZmlsbFN0eWxlPSIjYjRkN2ZmIjtsZXQgdT0wO2ZvcihsZXQgdD1yO3Q8PWE7Kyt0KXtjb25zdCBuPWUudGV4dFRhYmxlW3RdO2lmKCJ0ZXh0Ij09PW4ubW9kZSYmKHUrPW4udyx0IT09YSkpY29udGludWU7bGV0IHI9MDtjb25zdCBvPSJ0ZXh0Ij09PW4ubW9kZT9uLmxpbmU6bi5saW5lLTE7Zm9yKGxldCB0PTA7dDxvOysrdClyKz1lLmhlaWdodFRhYmxlW3RdO3MuYmVnaW5QYXRoKCkscy5yZWN0KGwscix1K2MsZS5oZWlnaHRUYWJsZVtvXSkscy5maWxsKCksbD0wLHU9MH19Y29uc3QgbD10LnJhd1dpZHRoO2xldCB1PTA7aWYodC5zY3JvbGxYPjApe2NvbnN0IGU9KHQudGV4dFdpZHRoLWwpL2w7dT10LnNjcm9sbFgqZX1jb25zdCBoPWwrdSxiPXQucmF3SGVpZ2h0O2xldCBkPTA7aWYodC5zY3JvbGxZPjApe2NvbnN0IGU9KHQudGV4dEhlaWdodC1iKS9iO2Q9dC5zY3JvbGxZKmV9Y29uc3QgZj1iK2Q7bGV0IG09MCx2PTAsXz0wLHA9MCxnPSExLHg9LTE7Zm9yKGxldCBuPTA7bjxlLnRleHRUYWJsZS5sZW5ndGg7KytuKXtjb25zdCByPWUudGV4dFRhYmxlW25dO2lmKCFyKWNvbnRpbnVlO2lmKCgidGV4dCI9PT1yLm1vZGV8fCJicmVhayI9PT1yLm1vZGUpJiYoeCsrLHQuc3RvcEluZGV4Pi0xJiZ4PnQuc3RvcEluZGV4KSlicmVhaztpZihnJiYidGV4dCI9PT1yLm1vZGUpY29udGludWU7Y29uc3QgYT1yLnRleHRGb3JtYXQ7aWYoIm5vbmUiPT09dC5hdXRvU2l6ZSl7aWYodj5mKWJyZWFrO2lmKCJ0ZXh0Ij09PXIubW9kZSYmKHU+bStyLnd8fG0+aCkpe20rPXIudztjb250aW51ZX19Y29uc3QgaT1DcihhLmNvbG9yfHwwKTtpZihzLmZpbGxTdHlsZT1gcmdiYSgke2kuUn0sJHtpLkd9LCR7aS5CfSwke2kuQX0pYCx0LmZvY3VzVmlzaWJsZSYmdC5mb2N1c0luZGV4PT09bil7Y29uc3QgdD1tK18rLjE7bGV0IG49ci5saW5lLGE9ci55LG89ZS5hc2NlbnRUYWJsZVtuXTsidGV4dCIhPT1yLm1vZGUmJihhPSJicmVhayI9PT1yLm1vZGU/ci5oOmUuYXNjZW50VGFibGVbbi0xXSxuPjA/KG49ci5saW5lLTEsbz1lLmFzY2VudFRhYmxlW25dKTpvPXIuaCksbj4wJiYwPT09ZS5hc2NlbnRUYWJsZVtuXSYmbisrO2ZvcihsZXQgdD0wO3Q8bjsrK3Qpbys9ZS5oZWlnaHRUYWJsZVt0XTtzLnN0cm9rZVN0eWxlPWByZ2JhKCR7aS5SfSwke2kuR30sJHtpLkJ9LCR7aS5BfSlgLHMuYmVnaW5QYXRoKCkscy5tb3ZlVG8odCxvKSxzLmxpbmVUbyh0LG8tYSkscy5zdHJva2UoKX1pZih0LnRoaWNrbmVzcyl7Y29uc3QgZT1Dcih0LnRoaWNrbmVzc0NvbG9yKTtzLmxpbmVXaWR0aD10LnRoaWNrbmVzcyxzLnN0cm9rZVN0eWxlPWByZ2JhKCR7ZS5SfSwke2UuR30sJHtlLkJ9LCR7ZS5BfSlgfWNvbnN0IGM9MHxyLmxpbmU7c3dpdGNoKHIubW9kZSl7Y2FzZSJicmVhayI6Y2FzZSJ3cmFwIjppZihtPTAsYyYmKHYrPWUuaGVpZ2h0VGFibGVbYy0xXSksZD52K2UuaGVpZ2h0VGFibGVbY10pe2c9ITA7Y29udGludWV9cD1lLmFzY2VudFRhYmxlW2NdLF89RHIoZSxyLHQpLGc9ITE7YnJlYWs7Y2FzZSJ0ZXh0Ijp7cy5iZWdpblBhdGgoKSxzLmZvbnQ9anIoYSk7Y29uc3QgZT1tK18sbj12K3A7aWYoYS51bmRlcmxpbmUpe2NvbnN0IHQ9Q3IoYS5jb2xvcnx8MCk7cy5saW5lV2lkdGg9byxzLnN0cm9rZVN0eWxlPWByZ2JhKCR7dC5SfSwke3QuR30sJHt0LkJ9LCR7dC5BfSlgLHMuYmVnaW5QYXRoKCkscy5tb3ZlVG8oZSxuKzIpLHMubGluZVRvKGUrci53LG4rMikscy5zdHJva2UoKX10LnRoaWNrbmVzcyYmcy5zdHJva2VUZXh0KHIudGV4dCxlLG4pLHMuZmlsbFRleHQoci50ZXh0LGUsbiksbSs9ci53fX19aWYodC5mb2N1c1Zpc2libGUmJnQuZm9jdXNJbmRleD49ZS50ZXh0VGFibGUubGVuZ3RoKXtjb25zdCBuPWUudGV4dFRhYmxlW3QuZm9jdXNJbmRleC0xXTtpZihuKXtjb25zdCBlPUNyKG4udGV4dEZvcm1hdC5jb2xvcnx8MCk7cy5zdHJva2VTdHlsZT1gcmdiYSgke2UuUn0sJHtlLkd9LCR7ZS5CfSwke2UuQX0pYDtjb25zdCB0PW0rXysuMSxyPXYrcDtzLmJlZ2luUGF0aCgpLCJ0ZXh0Ij09PW4ubW9kZT9zLm1vdmVUbyh0LHItbi55KTpzLm1vdmVUbyh0LHIrbi5oKSxzLmxpbmVUbyh0LHIpLHMuc3Ryb2tlKCl9fXJldHVybiBzLnJlc3RvcmUoKSxhfSkoSlNPTi5wYXJzZSh6ci5kZWNvZGUobSkpLF8sYixkKSxnPU1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0O01yLmJpbmQoTXIuYXRsYXNBdHRhY2htZW50T2JqZWN0KSxNci5yZXNldCgpLE1yLmJlZ2luTm9kZVJlbmRlcmluZyhmKTtjb25zdCB4PU1yLmF0bGFzQXR0YWNobWVudE9iamVjdC5oZWlnaHQtZi55LXI7TXIuc2V0VHJhbnNmb3JtKDEsMCwwLDEsZi54LHgpLE1yLmRyYXdFbGVtZW50KGYscCksTXIuZW5kTm9kZVJlbmRlcmluZygpLGcmJk1yLmJpbmQoZyl9Y29uc3QgbT1lW3QrK107aWYoQm9vbGVhbihlW3QrK10pKXtjb25zdCBzPUJvb2xlYW4oZVt0KytdKSxvPWUuc3ViYXJyYXkodCx0KzQpO3QrPTQ7Y29uc3QgaT1lW3QrK10sYz1lLnN1YmFycmF5KHQsdCtpKSx1PU1hdGguY2VpbChNYXRoLmFicyhhWzJdLWFbMF0pKSxiPU1hdGguY2VpbChNYXRoLmFicyhhWzNdLWFbMV0pKTtyZXR1cm4gTXIuYXBwbHlGaWx0ZXIoZixsLEJvb2xlYW4oTWF0aC5tYXgoK2gsK3MpKSx1LGIsITEsbixyLExyKG0pLG8sYyksdCs9aX1Nci5nbG9iYWxBbHBoYT1NYXRoLm1pbihNYXRoLm1heCgwLHJbM10rcls3XS8yNTUpLDEpLE1yLmltYWdlU21vb3RoaW5nRW5hYmxlZD0hMCxNci5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249THIobSk7Y29uc3Qgdj1NYXRoLmF0YW4yKG5bMV0sblswXSksXz1NYXRoLmF0YW4yKC1uWzJdLG5bM10pO2lmKHZ8fF8pe2NvbnN0IGU9cypiLHQ9bypkLHI9TWF0aC5jb3ModiksYT1NYXRoLnNpbih2KSxpPU1hdGguY29zKF8pLGM9TWF0aC5zaW4oXyk7TXIuc2V0VHJhbnNmb3JtKHIsYSwtYyxpLGUqci10KmMrbls0XSxlKmErdCppK25bNV0pfWVsc2UgTXIuc2V0VHJhbnNmb3JtKDEsMCwwLDEsYVswXSxhWzFdKTtyZXR1cm4gTXIuZHJhd0Rpc3BsYXlPYmplY3QoZixhWzBdLGFbMV0sYVsyXSxhWzNdLHIpLHR9LFdyPShlLHQsbik9Pntjb25zdCByPWUuc3ViYXJyYXkodCx0KzYpO3QrPTY7Y29uc3QgYT1lLnN1YmFycmF5KHQsdCs4KTt0Kz04O2NvbnN0IHM9ZS5zdWJhcnJheSh0LHQrNCk7dCs9NDtjb25zdCBvPWVbdCsrXSxpPWVbdCsrXSxjPWVbdCsrXSxsPWVbdCsrXSx1PWAke2VbdCsrXX1gLGg9Qm9vbGVhbihlW3QrK10pO2xldCBiO2lmKGVbdCsrXSl7aWYoYj11ci5nZXQodSwiMCIpLCFiKXJldHVybiB0fWVsc2V7Y29uc3Qgcj1NYXRoLmFicyhjLW8pLGE9TWF0aC5hYnMobC1pKSxzPUJvb2xlYW4oZVt0KytdKTtpZihiPXM/dXIuZ2V0KHUsIjAiKTpNci5jcmVhdGVOb2RlKHIsYSksc3x8dXIuc2V0KHUsIjAiLGIpLG4mJm4ubGVuZ3RoKXtjb25zdCBlPU1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0O01yLmJpbmQoTXIuYXRsYXNBdHRhY2htZW50T2JqZWN0KSxNci5yZXNldCgpLE1yLmJlZ2luTm9kZVJlbmRlcmluZyhiKTtjb25zdCB0PU1yLmF0bGFzQXR0YWNobWVudE9iamVjdC5oZWlnaHQtYi55LWE7TXIuc2V0VHJhbnNmb3JtKDEsMCwwLDEsYi54LHQpO2NvbnN0IHI9bi5zaGlmdCgpO01yLmRyYXdFbGVtZW50KGIsciksTXIuZW5kTm9kZVJlbmRlcmluZygpLGUmJk1yLmJpbmQoZSl9fWNvbnN0IGQ9ZVt0KytdO2lmKEJvb2xlYW4oZVt0KytdKSl7Y29uc3Qgbj1Cb29sZWFuKGVbdCsrXSksbz1lLnN1YmFycmF5KHQsdCs0KTt0Kz00O2NvbnN0IGk9ZVt0KytdLGM9ZS5zdWJhcnJheSh0LHQraSksbD1NYXRoLmNlaWwoTWF0aC5hYnMoc1syXS1zWzBdKSksZj1NYXRoLmNlaWwoTWF0aC5hYnMoc1szXS1zWzFdKSk7cmV0dXJuIE1yLmFwcGx5RmlsdGVyKGIsdSxCb29sZWFuKE1hdGgubWF4KCtoLCtuKSksbCxmLCEwLHIsYSxMcihkKSxvLGMpLHQrPWl9cmV0dXJuIE1yLmdsb2JhbEFscGhhPU1hdGgubWluKE1hdGgubWF4KDAsYVszXSthWzddLzI1NSksMSksTXIuaW1hZ2VTbW9vdGhpbmdFbmFibGVkPSEwLE1yLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj1McihkKSxNci5zZXRUcmFuc2Zvcm0oclswXSxyWzFdLHJbMl0sclszXSxyWzRdLHJbNV0pLE1yLmRyYXdEaXNwbGF5T2JqZWN0KGIsc1swXSxzWzFdLHNbMl0sc1szXSxhKSx0fSxHcj0oZSx0KT0+e2NvbnN0IG49ZVt0KytdO2ZvcihsZXQgcj0wO3I8bjsrK3Ipe3N3aXRjaChlW3QrK10pe2Nhc2UgMDp0PUdyKGUsdCk7YnJlYWs7Y2FzZSAxOnQ9TnIoZSx0KX19cmV0dXJuIHR9LFZyPShlLHQsbik9Pntjb25zdCByPUJvb2xlYW4oZVt0KytdKTtpZihyKXtNci5kcmF3QXJyYXlzSW5zdGFuY2VkKCksTXIuc2F2ZSgpLE1yLmJlZ2luTWFzaygpLE1yLnNldE1hc2tCb3VuZHMoZVt0KytdLGVbdCsrXSxlW3QrK10sZVt0KytdKTtzd2l0Y2goZVt0KytdKXtjYXNlIDA6dD1HcihlLHQpO2JyZWFrO2Nhc2UgMTp0PU5yKGUsdCl9TXIuZW5kTWFzaygpfWxldCBhPTAscz0hMDtjb25zdCBvPWVbdCsrXTtmb3IobGV0IHI9MDtvPnI7cisrKXtjb25zdCByPWVbdCsrXSxvPWVbdCsrXTtpZihhJiZyPmEmJihzJiYoTXIucmVzdG9yZSgpLE1yLmxlYXZlTWFzaygpKSxhPTAscz0hMCksIXMpY29udGludWU7aWYobyl7aWYoYT1vLHM9Qm9vbGVhbihlW3QrK10pLCFzKWNvbnRpbnVlO01yLmRyYXdBcnJheXNJbnN0YW5jZWQoKSxNci5zYXZlKCksTXIuYmVnaW5NYXNrKCksTXIuc2V0TWFza0JvdW5kcyhlW3QrK10sZVt0KytdLGVbdCsrXSxlW3QrK10pO3N3aXRjaChlW3QrK10pe2Nhc2UgMDp0PUdyKGUsdCk7YnJlYWs7Y2FzZSAxOnQ9TnIoZSx0KX1Nci5lbmRNYXNrKCk7Y29udGludWV9aWYoIWVbdCsrXSljb250aW51ZTtjb25zdCBpPWVbdCsrXTtzd2l0Y2goaSl7Y2FzZSAwOnQ9VnIoZSx0LG4pO2JyZWFrO2Nhc2UgMTp0PVVyKGUsdCk7YnJlYWs7Y2FzZSAyOnQ9WHIoZSx0KTticmVhaztjYXNlIDM6dD1XcihlLHQsbik7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLmVycm9yKCJ1bmtub3duIHR5cGUiLGkpfX1yZXR1cm4oYXx8cikmJihNci5yZXN0b3JlKCksTXIubGVhdmVNYXNrKCkpLHR9O2xldCBZcj0tMTtjb25zdCBxcj0oZSx0KT0+e01yLmNsZWFyVHJhbnNmZXJCb3VuZHMoKTtsZXQgbj0wO2NvbnN0IHI9ZVtuKytdO2ZvcihZciE9PXImJihZcj1yLC0xPT09WXI/TXIudXBkYXRlQmFja2dyb3VuZENvbG9yKDAsMCwwLDApOk1yLnVwZGF0ZUJhY2tncm91bmRDb2xvcigoWXI+PjE2JjI1NSkvMjU1LChZcj4+OCYyNTUpLzI1NSwoMjU1JllyKS8yNTUsMSkpLE1yLnJlc2V0KCksTXIuc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKSxNci5maWxsQmFja2dyb3VuZENvbG9yKCk7ZS5sZW5ndGg+bjspe2lmKCFlW24rK10pY29udGludWU7Y29uc3Qgcj1lW24rK107c3dpdGNoKHIpe2Nhc2UgMDpuPVZyKGUsbix0KTticmVhaztjYXNlIDE6bj1VcihlLG4pO2JyZWFrO2Nhc2UgMjpuPVhyKGUsbik7YnJlYWs7Y2FzZSAzOm49V3IoZSxuLHQpO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS5lcnJvcigidW5rbm93biB0eXBlIixyKX19TXIuZHJhd0FycmF5c0luc3RhbmNlZCgpLE9yJiYod3Iud2lkdGg9RnIsd3IuaGVpZ2h0PSRyLE9yPSExKSxNci50cmFuc2Zlck1haW5DYW52YXMoKX0sS3I9ZT0+e2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7Kyt0KXtjb25zdCBuPWAke2VbdF19YDtpZighdXIuaGFzKG4pKWNvbnRpbnVlO2NvbnN0IHI9dXIuZ2V0QnlJZChuKTtmb3IoY29uc3QgZSBvZiByLnZhbHVlcygpKU1yLnJlbW92ZU5vZGUoZSk7dXIucmVtb3ZlQnlJZChuKX19LEhyPWFzeW5jKGUsdCxuLHI9MCxhPTAscyk9PntNci5jbGVhclRyYW5zZmVyQm91bmRzKCk7bGV0IG89MTtmb3IoTXIucmVzZXQoKSxNci5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLE1yLnVwZGF0ZUJhY2tncm91bmRDb2xvcigocj4+MTYmMjU1KS8yNTUsKHI+PjgmMjU1KS8yNTUsKDI1NSZyKS8yNTUsYSksTXIuZmlsbEJhY2tncm91bmRDb2xvcigpO2UubGVuZ3RoPm87KXtpZighZVtvKytdKWNvbnRpbnVlO2NvbnN0IHQ9ZVtvKytdO3N3aXRjaCh0KXtjYXNlIDA6bz1WcihlLG8scyk7YnJlYWs7Y2FzZSAxOm89VXIoZSxvKTticmVhaztjYXNlIDI6bz1YcihlLG8pO2JyZWFrO2Nhc2UgMzpvPVdyKGUsbyxzKTticmVhaztkZWZhdWx0OmNvbnNvbGUuZXJyb3IoInVua25vd24gdHlwZSIsdCl9fXJldHVybiBNci5kcmF3QXJyYXlzSW5zdGFuY2VkKCksYXdhaXQgTXIuY3JlYXRlSW1hZ2VCaXRtYXAodCxuKX07Y29uc3QgWnI9bmV3IGNsYXNze2NvbnN0cnVjdG9yKCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInN0YXRlIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInF1ZXVlIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksdGhpcy5zdGF0ZT0iZGVhY3RpdmF0ZSIsdGhpcy5xdWV1ZT1bXX1hc3luYyBleGVjdXRlKCl7Zm9yKHRoaXMuc3RhdGU9ImFjdGl2ZSI7dGhpcy5xdWV1ZS5sZW5ndGg7KXtjb25zdCBlPXRoaXMucXVldWUuc2hpZnQoKTtpZihlKXN3aXRjaChlLmNvbW1hbmQpe2Nhc2UicmVuZGVyIjpxcihlLmJ1ZmZlci5zdWJhcnJheSgwLGUubGVuZ3RoKSxlLmltYWdlQml0bWFwcyksZ2xvYmFsVGhpcy5wb3N0TWVzc2FnZSh7bWVzc2FnZToicmVuZGVyIixidWZmZXI6ZS5idWZmZXJ9LFtlLmJ1ZmZlci5idWZmZXJdKTticmVhaztjYXNlInJlc2l6ZSI6QnIoZS5idWZmZXJbMF0sZS5idWZmZXJbMV0sQm9vbGVhbihlLmJ1ZmZlclsyXSkpO2JyZWFrO2Nhc2UiaW5pdGlhbGl6ZSI6UHIoZS5jYW52YXMsZS5kZXZpY2VQaXhlbFJhdGlvKTticmVhaztjYXNlInJlbW92ZUNhY2hlIjpLcihlLmJ1ZmZlcik7YnJlYWs7Y2FzZSJjYWNoZUNsZWFyIjp1ci5yZXNldCgpO2JyZWFrO2Nhc2UiY2FwdHVyZSI6e2NvbnN0IHQ9YXdhaXQgSHIoZS5idWZmZXIuc3ViYXJyYXkoMCxlLmxlbmd0aCksZS53aWR0aCxlLmhlaWdodCxlLmJnQ29sb3IsZS5iZ0FscGhhLGUuaW1hZ2VCaXRtYXBzKTtnbG9iYWxUaGlzLnBvc3RNZXNzYWdlKHttZXNzYWdlOiJjYXB0dXJlIixidWZmZXI6ZS5idWZmZXIsaW1hZ2VCaXRtYXA6dH0sW2UuYnVmZmVyLmJ1ZmZlcix0XSl9fX10aGlzLnN0YXRlPSJkZWFjdGl2YXRlIn19O3NlbGYuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsYXN5bmMgZT0+e1pyLnF1ZXVlLnB1c2goZS5kYXRhKSwiZGVhY3RpdmF0ZSI9PT1aci5zdGF0ZSYmYXdhaXQgWnIuZXhlY3V0ZSgpfSk7cmV0dXJue319KCk7Cg==';
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==';