this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'master' of github.com:ian-h-chamberlain/dotfiles

+2
+1
.config/tampermonkey/.gitattributes
··· 1 + *.txt binary
+1
.config/tampermonkey/firefox-backup.json
··· 1 + {"created_by":"Tampermonkey","version":"1","scripts":[{"name":"Google Meet Hangouts - PTT with Space","options":{"check_for_updates":true,"comment":null,"compatopts_for_requires":true,"compat_wrappedjsobject":false,"compat_metadata":false,"compat_foreach":false,"compat_arrayleft":false,"compat_uW_gmonkey":false,"compat_forvarin":false,"noframes":null,"awareOfChrome":false,"run_at":null,"override":{"use_includes":[],"orig_includes":[],"merge_includes":true,"use_matches":[],"orig_matches":["https://meet.google.com/*"],"merge_matches":true,"use_excludes":[],"orig_excludes":[],"merge_excludes":true,"use_connects":[],"merge_connects":true,"use_blockers":[],"orig_run_at":"document-idle","orig_noframes":null,"orig_connects":[]}},"storage":{"ts":1584639492020,"data":{}},"enabled":true,"position":1,"uuid":"f8b2cb45-bbb5-4067-9271-349366516dac","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBHb29nbGUgTWVldCBIYW5nb3V0cyAtIFBUVCB3aXRoIFNwYWNlCi8vIEBuYW1lc3BhY2UgICAgaHR0cDovL21pbmRibGVhY2guY29tLwovLyBAdmVyc2lvbiAgICAgIDAuMQovLyBAZGVzY3JpcHRpb24gIEhvbGQgZG93biBTcGFjZSBrZXkgdG8gdGFsaywgbGV0IGdvIHRvIG11dGUuIERvZXMgbm90IGludGVyZmVyZSB3aXRoIG90aGVyIG9wZXJhdGlvbiwgd29ya3MgbXVsdGluYXRpb25hbGx5LgovLyBAYXV0aG9yICAgICAgIFBhdHJpY2sgQmFybmVzCi8vIEBtYXRjaCAgICAgICAgaHR0cHM6Ly9tZWV0Lmdvb2dsZS5jb20vKgovLyBAZ3JhbnQgICAgICAgIG5vbmUKLy8gPT0vVXNlclNjcmlwdD09CgooKCkgPT4gewoJdmFyIGVsID0gdW5kZWZpbmVkOwoJY29uc3QgbWljID0gZW4gPT4gKHtrZXkscmVwZWF0LHRhcmdldH0pID0+IHsKCQllbCAmJiBlbC5pc0Nvbm5lY3RlZCB8fCAoZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1pcy1tdXRlZF1bcm9sZT0iYnV0dG9uIl0nKSk7CgkJZWwgJiYga2V5PT09JyAnICYmICFyZXBlYXQgJiYgISgndmFsdWUnIGluIHRhcmdldCkgJiYgZWwuZGF0YXNldC5pc011dGVkID09PSBTdHJpbmcoZW4pICYmIGVsLmNsaWNrKCkKCX0KCWRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG1pYyh0cnVlKSkKCWRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBtaWMoZmFsc2UpKQp9KSgpOwo="},{"name":"Wanikani Open Framework","options":{"check_for_updates":true,"comment":null,"compatopts_for_requires":true,"compat_wrappedjsobject":false,"compat_metadata":false,"compat_foreach":false,"compat_arrayleft":false,"compat_uW_gmonkey":false,"compat_forvarin":false,"noframes":null,"awareOfChrome":false,"run_at":null,"override":{"use_includes":[],"orig_includes":["/^https://(www|preview).wanikani.com//"],"merge_includes":true,"use_matches":[],"orig_matches":[],"merge_matches":true,"use_excludes":[],"orig_excludes":[],"merge_excludes":true,"use_connects":[],"merge_connects":true,"use_blockers":[],"orig_run_at":"document-start","orig_noframes":null,"orig_connects":[]}},"storage":{"ts":1588770702246,"data":{}},"enabled":true,"position":2,"file_url":"https://greasyfork.org/scripts/38582-wanikani-open-framework/code/Wanikani%20Open%20Framework.user.js","uuid":"c9477683-3470-4229-9116-979a698aac01","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgIFdhbmlrYW5pIE9wZW4gRnJhbWV3b3JrCi8vIEBuYW1lc3BhY2UgICByZmluZGxleQovLyBAZGVzY3JpcHRpb24gRnJhbWV3b3JrIGZvciB3cml0aW5nIHNjcmlwdHMgZm9yIFdhbmlrYW5pCi8vIEB2ZXJzaW9uICAgICAxLjAuNTAKLy8gQGluY2x1ZGUgICAgIC9eaHR0cHM6Ly8od3d3fHByZXZpZXcpLndhbmlrYW5pLmNvbS8vCi8vIEBjb3B5cmlnaHQgICAyMDE4KywgUm9iaW4gRmluZGxleQovLyBAbGljZW5zZSAgICAgTUlUOyBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCi8vIEBydW4tYXQgICAgICBkb2N1bWVudC1zdGFydAovLyBAZ3JhbnQgICAgICAgbm9uZQovLyA9PS9Vc2VyU2NyaXB0PT0KCihmdW5jdGlvbihnbG9iYWwpIHsKCSd1c2Ugc3RyaWN0JzsKCgkvKiBlc2xpbnQgbm8tbXVsdGktc3BhY2VzOiBvZmYgKi8KCS8qIGdsb2JhbHMgd2tvZiAqLwoKCXZhciB2ZXJzaW9uID0gJzEuMC41MCc7Cgl2YXIgaWdub3JlX21pc3NpbmdfaW5kZXhlZGRiID0gZmFsc2U7CgoJLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBTdXBwb3J0ZWQgTW9kdWxlcwoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCXZhciBzdXBwb3J0ZWRfbW9kdWxlcyA9IHsKCQlBcGl2MjogICAgeyB1cmw6ICdodHRwczovL2dyZWFzeWZvcmsub3JnL3NjcmlwdHMvMzg1ODEtd2FuaWthbmktb3Blbi1mcmFtZXdvcmstYXBpdjItbW9kdWxlL2NvZGUvV2FuaWthbmklMjBPcGVuJTIwRnJhbWV3b3JrJTIwLSUyMEFwaXYyJTIwbW9kdWxlLmpzP3ZlcnNpb249NzQ3ODY2J30sCgkJSXRlbURhdGE6IHsgdXJsOiAnaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9zY3JpcHRzLzM4NTgwLXdhbmlrYW5pLW9wZW4tZnJhbWV3b3JrLWl0ZW1kYXRhLW1vZHVsZS9jb2RlL1dhbmlrYW5pJTIwT3BlbiUyMEZyYW1ld29yayUyMC0lMjBJdGVtRGF0YSUyMG1vZHVsZS5qcz92ZXJzaW9uPTc2Nzg2OCd9LAoJCU1lbnU6ICAgICB7IHVybDogJ2h0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvc2NyaXB0cy8zODU3OC13YW5pa2FuaS1vcGVuLWZyYW1ld29yay1tZW51LW1vZHVsZS9jb2RlL1dhbmlrYW5pJTIwT3BlbiUyMEZyYW1ld29yayUyMC0lMjBNZW51JTIwbW9kdWxlLmpzP3ZlcnNpb249NzQ1Mzg4J30sCgkJUHJvZ3Jlc3M6IHsgdXJsOiAnaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9zY3JpcHRzLzM4NTc3LXdhbmlrYW5pLW9wZW4tZnJhbWV3b3JrLXByb2dyZXNzLW1vZHVsZS9jb2RlL1dhbmlrYW5pJTIwT3BlbiUyMEZyYW1ld29yayUyMC0lMjBQcm9ncmVzcyUyMG1vZHVsZS5qcz92ZXJzaW9uPTYwMTQ3Myd9LAoJCVNldHRpbmdzOiB7IHVybDogJ2h0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvc2NyaXB0cy8zODU3Ni13YW5pa2FuaS1vcGVuLWZyYW1ld29yay1zZXR0aW5ncy1tb2R1bGUvY29kZS9XYW5pa2FuaSUyME9wZW4lMjBGcmFtZXdvcmslMjAtJTIwU2V0dGluZ3MlMjBtb2R1bGUuanM/dmVyc2lvbj02MDc4NzEnfSwKCX07CgoJLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBQdWJsaXNoZWQgaW50ZXJmYWNlCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJdmFyIHB1Ymxpc2hlZF9pbnRlcmZhY2UgPSB7CgkJaW5jbHVkZTogaW5jbHVkZSwgICAgICAgICAgICAgIC8vIGluY2x1ZGUobW9kdWxlX2xpc3QpICAgICAgICA9PiBQcm9taXNlCgkJcmVhZHk6ICAgcmVhZHksICAgICAgICAgICAgICAgIC8vIHJlYWR5KG1vZHVsZV9saXN0KSAgICAgICAgICA9PiBQcm9taXNlCgoJCWxvYWRfZmlsZTogICBsb2FkX2ZpbGUsICAgICAgICAvLyBsb2FkX2ZpbGUodXJsLCB1c2VfY2FjaGUpICAgPT4gUHJvbWlzZQoJCWxvYWRfY3NzOiAgICBsb2FkX2NzcywgICAgICAgICAvLyBsb2FkX2Nzcyh1cmwsIHVzZV9jYWNoZSkgICAgPT4gUHJvbWlzZQoJCWxvYWRfc2NyaXB0OiBsb2FkX3NjcmlwdCwgICAgICAvLyBsb2FkX3NjcmlwdCh1cmwsIHVzZV9jYWNoZSkgPT4gUHJvbWlzZQoKCQlmaWxlX2NhY2hlOiB7CgkJCWRpcjogICAge30sICAgICAgICAgICAgICAgIC8vIE9iamVjdCBjb250YWluaW5nIGRpcmVjdG9yeSBvZiBmaWxlcy4KCQkJbHM6ICAgICBmaWxlX2NhY2hlX2xpc3QsICAgLy8gbHMoKQoJCQljbGVhcjogIGZpbGVfY2FjaGVfY2xlYXIsICAvLyBjbGVhcigpICAgICAgICAgICAgID0+IFByb21pc2UKCQkJZGVsZXRlOiBmaWxlX2NhY2hlX2RlbGV0ZSwgLy8gZGVsZXRlKG5hbWUpICAgICAgICA9PiBQcm9taXNlCgkJCWZsdXNoOiAgZmlsZV9jYWNoZV9mbHVzaCwgIC8vIGZsdXNoKCkgICAgICAgICAgICAgPT4gUHJvbWlzZQoJCQlsb2FkOiAgIGZpbGVfY2FjaGVfbG9hZCwgICAvLyBsb2FkKG5hbWUpICAgICAgICAgID0+IFByb21pc2UKCQkJc2F2ZTogICBmaWxlX2NhY2hlX3NhdmUsICAgLy8gc2F2ZShuYW1lLCBjb250ZW50KSA9PiBQcm9taXNlCgkJCW5vX2NhY2hlOmZpbGVfbm9jYWNoZSwgICAgIC8vIG5vX2NhY2hlKG1vZHVsZXMpCgkJfSwKCgkJb246ICAgICAgd2FpdF9ldmVudCwgICAgICAgICAgIC8vIG9uKGV2ZW50LCBjYWxsYmFjaykKCQl0cmlnZ2VyOiB0cmlnZ2VyX2V2ZW50LCAgICAgICAgLy8gdHJpZ2dlcihldmVudFssIGRhdGExWywgZGF0YTJbLCAuLi5dXV0pCgoJCWdldF9zdGF0ZTogIGdldF9zdGF0ZSwgICAgICAgICAvLyBnZXQoc3RhdGVfdmFyKQoJCXNldF9zdGF0ZTogIHNldF9zdGF0ZSwgICAgICAgICAvLyBzZXQoc3RhdGVfdmFyLCB2YWx1ZSkKCQl3YWl0X3N0YXRlOiB3YWl0X3N0YXRlLCAgICAgICAgLy8gd2FpdChzdGF0ZV92YXIsIHZhbHVlWywgY2FsbGJhY2tbLCBwZXJzaXN0ZW50XV0pID0+IGlmIG5vIGNhbGxiYWNrLCByZXR1cm4gb25lLXNob3QgUHJvbWlzZQoKCQl2ZXJzaW9uOiB7CgkJCXZhbHVlOiB2ZXJzaW9uLAoJCQljb21wYXJlX3RvOiBjb21wYXJlX3RvLCAgICAvLyBjb21wYXJlX3ZlcnNpb24odmVyc2lvbikKCQl9Cgl9OwoKCXB1Ymxpc2hlZF9pbnRlcmZhY2Uuc3VwcG9ydF9maWxlcyA9IHsKCQknanF1ZXJ5X3VpLmpzJzogJ2h0dHBzOi8vYWpheC5nb29nbGVhcGlzLmNvbS9hamF4L2xpYnMvanF1ZXJ5dWkvMS4xMi4xL2pxdWVyeS11aS5taW4uanMnLAoJCSdqcXVpX3drbWFpbi5jc3MnOiAnaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3JmaW5kbGV5L3dhbmlrYW5pLW9wZW4tZnJhbWV3b3JrLzE1NTBhZjgzODNlYzI4YWQ0MDZjZjQwMWFlZTJkZTRjNTI0NDZmNmMvanF1aS13a21haW4uY3NzJywKCX07CgoJLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCglmdW5jdGlvbiBzcGxpdF9saXN0KHN0cikge3JldHVybiBzdHIucmVwbGFjZSgvXlxzK3xccyooLClccyp8XHMrJC9nLCAnJDEnKS5zcGxpdCgnLCcpLmZpbHRlcihmdW5jdGlvbihuYW1lKSB7cmV0dXJuIChuYW1lLmxlbmd0aCA+IDApO30pO30KCWZ1bmN0aW9uIHByb21pc2UoKXt2YXIgYSxiLGM9bmV3IFByb21pc2UoZnVuY3Rpb24oZCxlKXthPWQ7Yj1lO30pO2MucmVzb2x2ZT1hO2MucmVqZWN0PWI7cmV0dXJuIGM7fQoKCS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCS8vIENvbXBhcmUgdGhlIGZyYW1ld29yayB2ZXJzaW9uIGFnYWluc3QgYSBzcGVjaWZpYyB2ZXJzaW9uLgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCWZ1bmN0aW9uIGNvbXBhcmVfdG8oY2xpZW50X3ZlcnNpb24pIHsKCQl2YXIgY2xpZW50X3ZlciA9IGNsaWVudF92ZXJzaW9uLnNwbGl0KCcuJykubWFwKGQgPT4gTnVtYmVyKGQpKTsKCQl2YXIgd2tvZl92ZXIgPSB2ZXJzaW9uLnNwbGl0KCcuJykubWFwKGQgPT4gTnVtYmVyKGQpKTsKCQl2YXIgbGVuID0gTWF0aC5tYXgoY2xpZW50X3Zlci5sZW5ndGgsIHdrb2ZfdmVyLmxlbmd0aCk7CgkJZm9yICh2YXIgaWR4ID0gMDsgaWR4IDwgbGVuOyBpZHgrKykgewoJCQl2YXIgYSA9IGNsaWVudF92ZXJbaWR4XSB8fCAwOwoJCQl2YXIgYiA9IHdrb2ZfdmVyW2lkeF0gfHwgMDsKCQkJaWYgKGEgPT09IGIpIGNvbnRpbnVlOwoJCQlpZiAoYSA8IGIpIHJldHVybiAnbmV3ZXInOwoJCQlyZXR1cm4gJ29sZGVyJzsKCQl9CgkJcmV0dXJuICdzYW1lJzsKCX0KCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJLy8gSW5jbHVkZSBhIGxpc3Qgb2YgbW9kdWxlcy4KCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgl2YXIgaW5jbHVkZV9wcm9taXNlcyA9IHt9OwoKCWZ1bmN0aW9uIGluY2x1ZGUobW9kdWxlX2xpc3QpIHsKCQlpZiAod2tvZi5nZXRfc3RhdGUoJ3drb2Yud2tvZicpICE9PSAncmVhZHknKSB7CgkJCXJldHVybiB3a29mLnJlYWR5KCd3a29mJykudGhlbihmdW5jdGlvbigpe3JldHVybiB3a29mLmluY2x1ZGUobW9kdWxlX2xpc3QpO30pOwoJCX0KCQl2YXIgaW5jbHVkZV9wcm9taXNlID0gcHJvbWlzZSgpOwoJCXZhciBtb2R1bGVfbmFtZXMgPSBzcGxpdF9saXN0KG1vZHVsZV9saXN0KTsKCQl2YXIgc2NyaXB0X2NudCA9IG1vZHVsZV9uYW1lcy5sZW5ndGg7CgkJaWYgKHNjcmlwdF9jbnQgPT09IDApIHsKCQkJaW5jbHVkZV9wcm9taXNlLnJlc29sdmUoe2xvYWRlZDpbXSwgZmFpbGVkOltdfSk7CgkJCXJldHVybiBpbmNsdWRlX3Byb21pc2U7CgkJfQoKCQl2YXIgZG9uZV9jbnQgPSAwOwoJCXZhciBsb2FkZWQgPSBbXSwgZmFpbGVkID0gW107CgkJdmFyIG5vX2NhY2hlID0gc3BsaXRfbGlzdChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnd2tvZi5pbmNsdWRlLm5vY2FjaGUnKSB8fCAnJyk7CgkJZm9yICh2YXIgaWR4ID0gMDsgaWR4IDwgbW9kdWxlX25hbWVzLmxlbmd0aDsgaWR4KyspIHsKCQkJdmFyIG1vZHVsZV9uYW1lID0gbW9kdWxlX25hbWVzW2lkeF07CgkJCXZhciBtb2R1bGUgPSBzdXBwb3J0ZWRfbW9kdWxlc1ttb2R1bGVfbmFtZV07CgkJCWlmICghbW9kdWxlKSB7CgkJCQlmYWlsZWQucHVzaCh7bmFtZTptb2R1bGVfbmFtZSwgdXJsOnVuZGVmaW5lZH0pOwoJCQkJY2hlY2tfZG9uZSgpOwoJCQkJY29udGludWU7CgkJCX0KCQkJdmFyIGF3YWl0X2xvYWQgPSBpbmNsdWRlX3Byb21pc2VzW21vZHVsZV9uYW1lXTsKCQkJdmFyIHVzZV9jYWNoZSA9IChub19jYWNoZS5pbmRleE9mKG1vZHVsZV9uYW1lKSA8IDApICYmIChub19jYWNoZS5pbmRleE9mKCcqJykgPCAwKTsKCQkJaWYgKCF1c2VfY2FjaGUpIGZpbGVfY2FjaGVfZGVsZXRlKG1vZHVsZS51cmwpOwoJCQlpZiAoYXdhaXRfbG9hZCA9PT0gdW5kZWZpbmVkKSBpbmNsdWRlX3Byb21pc2VzW21vZHVsZV9uYW1lXSA9IGF3YWl0X2xvYWQgPSBsb2FkX3NjcmlwdChtb2R1bGUudXJsLCB1c2VfY2FjaGUpOwoJCQlhd2FpdF9sb2FkLnRoZW4ocHVzaF9sb2FkZWQsIHB1c2hfZmFpbGVkKTsKCQl9CgoJCXJldHVybiBpbmNsdWRlX3Byb21pc2U7CgoJCWZ1bmN0aW9uIHB1c2hfbG9hZGVkKHVybCkgewoJCQlsb2FkZWQucHVzaCh1cmwpOwoJCQljaGVja19kb25lKCk7CgkJfQoKCQlmdW5jdGlvbiBwdXNoX2ZhaWxlZCh1cmwpIHsKCQkJZmFpbGVkLnB1c2godXJsKTsKCQkJY2hlY2tfZG9uZSgpOwoJCX0KCgkJZnVuY3Rpb24gY2hlY2tfZG9uZSgpIHsKCQkJaWYgKCsrZG9uZV9jbnQgPCBzY3JpcHRfY250KSByZXR1cm47CgkJCWlmIChmYWlsZWQubGVuZ3RoID09PSAwKSBpbmNsdWRlX3Byb21pc2UucmVzb2x2ZSh7bG9hZGVkOmxvYWRlZCwgZmFpbGVkOmZhaWxlZH0pOwoJCQllbHNlIGluY2x1ZGVfcHJvbWlzZS5yZWplY3Qoe2Vycm9yOidGYWlsdXJlIGxvYWRpbmcgbW9kdWxlJywgbG9hZGVkOmxvYWRlZCwgZmFpbGVkOmZhaWxlZH0pOwoJCX0KCX0KCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJLy8gV2FpdCBmb3IgYWxsIG1vZHVsZXMgdG8gcmVwb3J0IHRoYXQgdGhleSBhcmUgcmVhZHkKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCglmdW5jdGlvbiByZWFkeShtb2R1bGVfbGlzdCkgewoJCXZhciBtb2R1bGVfbmFtZXMgPSBzcGxpdF9saXN0KG1vZHVsZV9saXN0KTsKCgkJdmFyIHJlYWR5X3Byb21pc2VzID0gWyBdOwoJCWZvciAodmFyIGlkeCBpbiBtb2R1bGVfbmFtZXMpIHsKCQkJdmFyIG1vZHVsZV9uYW1lID0gbW9kdWxlX25hbWVzW2lkeF07CgkJCXJlYWR5X3Byb21pc2VzLnB1c2god2FpdF9zdGF0ZSgnd2tvZi4nICsgbW9kdWxlX25hbWUsICdyZWFkeScpKTsKCQl9CgoJCWlmIChyZWFkeV9wcm9taXNlcy5sZW5ndGggPT09IDApIHsKCQkJcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOwoJCX0gZWxzZSBpZiAocmVhZHlfcHJvbWlzZXMubGVuZ3RoID09PSAxKSB7CgkJCXJldHVybiByZWFkeV9wcm9taXNlc1swXTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gUHJvbWlzZS5hbGwocmVhZHlfcHJvbWlzZXMpOwoJCX0KCX0KCS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCS8vIExvYWQgYSBmaWxlIGFzeW5jaHJvbm91c2x5LCBhbmQgcGFzcyB0aGUgZmlsZSBhcyByZXNvbHZlZCBQcm9taXNlIGRhdGEuCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJZnVuY3Rpb24gbG9hZF9maWxlKHVybCwgdXNlX2NhY2hlKSB7CgkJdmFyIGZldGNoX3Byb21pc2UgPSBwcm9taXNlKCk7CgkJdmFyIG5vX2NhY2hlID0gc3BsaXRfbGlzdChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnd2tvZi5sb2FkX2ZpbGUubm9jYWNoZScpIHx8ICcnKTsKCQlpZiAobm9fY2FjaGUuaW5kZXhPZih1cmwpID49IDAgfHwgbm9fY2FjaGUuaW5kZXhPZignKicpID49IDApIHVzZV9jYWNoZSA9IGZhbHNlOwoJCWlmICh1c2VfY2FjaGUgPT09IHRydWUpIHsKCQkJcmV0dXJuIGZpbGVfY2FjaGVfbG9hZCh1cmwsIHVzZV9jYWNoZSkuY2F0Y2goZmV0Y2hfdXJsKTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gZmV0Y2hfdXJsKCk7CgkJfQoKCQkvLyBSZXRyaWV2ZSBmaWxlIGZyb20gc2VydmVyCgkJZnVuY3Rpb24gZmV0Y2hfdXJsKCl7CgkJCXZhciByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CgkJCXJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gcHJvY2Vzc19yZXN1bHQ7CgkJCXJlcXVlc3Qub3BlbignR0VUJywgdXJsLCB0cnVlKTsKCQkJcmVxdWVzdC5zZW5kKCk7CgkJCXJldHVybiBmZXRjaF9wcm9taXNlOwoJCX0KCgkJZnVuY3Rpb24gcHJvY2Vzc19yZXN1bHQoZXZlbnQpewoJCQlpZiAoZXZlbnQudGFyZ2V0LnJlYWR5U3RhdGUgIT09IDQpIHJldHVybjsKCQkJaWYgKGV2ZW50LnRhcmdldC5zdGF0dXMgPj0gNDAwIHx8IGV2ZW50LnRhcmdldC5zdGF0dXMgPT09IDApIHJldHVybiBmZXRjaF9wcm9taXNlLnJlamVjdChldmVudC50YXJnZXQuc3RhdHVzKTsKCQkJaWYgKHVzZV9jYWNoZSkgewoJCQkJZmlsZV9jYWNoZV9zYXZlKHVybCwgZXZlbnQudGFyZ2V0LnJlc3BvbnNlKQoJCQkJLnRoZW4oZmV0Y2hfcHJvbWlzZS5yZXNvbHZlLmJpbmQobnVsbCxldmVudC50YXJnZXQucmVzcG9uc2UpKTsKCQkJfSBlbHNlIHsKCQkJCWZldGNoX3Byb21pc2UucmVzb2x2ZShldmVudC50YXJnZXQucmVzcG9uc2UpOwoJCQl9CgkJfQoJfQoKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBMb2FkIGFuZCBpbnN0YWxsIGEgc3BlY2lmaWMgZmlsZSB0eXBlIGludG8gdGhlIERPTS4KCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCglmdW5jdGlvbiBsb2FkX2FuZF9hcHBlbmQodXJsLCB0YWdfbmFtZSwgbG9jYXRpb24sIHVzZV9jYWNoZSkgewoJCXVybCA9IHVybC5yZXBsYWNlKC8iL2csJ1wnJyk7CgkJaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFnX25hbWUrJ1t1aWQ9IicrdXJsKyciXScpICE9PSBudWxsKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7CgkJcmV0dXJuIGxvYWRfZmlsZSh1cmwsIHVzZV9jYWNoZSkudGhlbihhcHBlbmRfdG9fdGFnKTsKCgkJZnVuY3Rpb24gYXBwZW5kX3RvX3RhZyhjb250ZW50KSB7CgkJCXZhciB0YWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ19uYW1lKTsKCQkJdGFnLmlubmVySFRNTCA9IGNvbnRlbnQ7CgkJCXRhZy5zZXRBdHRyaWJ1dGUoJ3VpZCcsIHVybCk7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IobG9jYXRpb24pLmFwcGVuZENoaWxkKHRhZyk7CgkJCXJldHVybiB1cmw7CgkJfQoJfQoKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBMb2FkIGFuZCBpbnN0YWxsIGEgQ1NTIGZpbGUuCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJZnVuY3Rpb24gbG9hZF9jc3ModXJsLCB1c2VfY2FjaGUpIHsKCQlyZXR1cm4gbG9hZF9hbmRfYXBwZW5kKHVybCwgJ3N0eWxlJywgJ2hlYWQnLCB1c2VfY2FjaGUpOwoJfQoKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBMb2FkIGFuZCBpbnN0YWxsIEphdmFzY3JpcHQuCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJZnVuY3Rpb24gbG9hZF9zY3JpcHQodXJsLCB1c2VfY2FjaGUpIHsKCQlyZXR1cm4gbG9hZF9hbmRfYXBwZW5kKHVybCwgJ3NjcmlwdCcsICdib2R5JywgdXNlX2NhY2hlKTsKCX0KCS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgoJdmFyIHN0YXRlX2xpc3RlbmVycyA9IHt9OwoJdmFyIHN0YXRlX3ZhbHVlcyA9IHt9OwoKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBHZXQgdGhlIHZhbHVlIG9mIGEgc3RhdGUgdmFyaWFibGUsIGFuZCBub3RpZnkgbGlzdGVuZXJzLgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCWZ1bmN0aW9uIGdldF9zdGF0ZShzdGF0ZV92YXIpIHsKCQlyZXR1cm4gc3RhdGVfdmFsdWVzW3N0YXRlX3Zhcl07Cgl9CgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCS8vIFNldCB0aGUgdmFsdWUgb2YgYSBzdGF0ZSB2YXJpYWJsZSwgYW5kIG5vdGlmeSBsaXN0ZW5lcnMuCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJZnVuY3Rpb24gc2V0X3N0YXRlKHN0YXRlX3ZhciwgdmFsdWUpIHsKCQl2YXIgb2xkX3ZhbHVlID0gc3RhdGVfdmFsdWVzW3N0YXRlX3Zhcl07CgkJaWYgKG9sZF92YWx1ZSA9PT0gdmFsdWUpIHJldHVybjsKCQlzdGF0ZV92YWx1ZXNbc3RhdGVfdmFyXSA9IHZhbHVlOwoKCQkvLyBEbyBsaXN0ZW5lciBjYWxsYmFja3MsIGFuZCByZW1vdmUgbm9uLXBlcnNpc3RlbnQgbGlzdGVuZXJzCgkJdmFyIGxpc3RlbmVycyA9IHN0YXRlX2xpc3RlbmVyc1tzdGF0ZV92YXJdOwoJCXZhciBwZXJzaXN0ZW50X2xpc3RlbmVycyA9IFsgXTsKCQlmb3IgKHZhciBpZHggaW4gbGlzdGVuZXJzKSB7CgkJCXZhciBsaXN0ZW5lciA9IGxpc3RlbmVyc1tpZHhdOwoJCQl2YXIga2VlcCA9IHRydWU7CgkJCWlmIChsaXN0ZW5lci52YWx1ZSA9PT0gdmFsdWUgfHwgbGlzdGVuZXIudmFsdWUgPT09ICcqJykgewoJCQkJa2VlcCA9IGxpc3RlbmVyLnBlcnNpc3RlbnQ7CgkJCQl0cnkgewoJCQkJCWxpc3RlbmVyLmNhbGxiYWNrKHZhbHVlLCBvbGRfdmFsdWUpOwoJCQkJfSBjYXRjaCAoZSkge30KCQkJfQoJCQlpZiAoa2VlcCkgcGVyc2lzdGVudF9saXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7CgkJfQoJCXN0YXRlX2xpc3RlbmVyc1tzdGF0ZV92YXJdID0gcGVyc2lzdGVudF9saXN0ZW5lcnM7Cgl9CgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCS8vIFdoZW4gc3RhdGUgb2Ygc3RhdGVfdmFyIGNoYW5nZXMgdG8gdmFsdWUsIGNhbGwgY2FsbGJhY2suCgkvLyBJZiBwZXJzaXN0ZW50ID09PSB0cnVlLCBjb250aW51ZSBsaXN0ZW5pbmcgZm9yIGFkZGl0aW9uYWwgc3RhdGUgY2hhbmdlcwoJLy8gSWYgdmFsdWUgaXMgJyonLCBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBmb3IgYWxsIHN0YXRlIGNoYW5nZXMuCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJZnVuY3Rpb24gd2FpdF9zdGF0ZShzdGF0ZV92YXIsIHZhbHVlLCBjYWxsYmFjaywgcGVyc2lzdGVudCkgewoJCXZhciBwcm9taXNlOwoJCWlmIChjYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7CgkJCXByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKCQkJCWNhbGxiYWNrID0gcmVzb2x2ZTsKCQkJfSk7CgkJfQoJCWlmIChzdGF0ZV9saXN0ZW5lcnNbc3RhdGVfdmFyXSA9PT0gdW5kZWZpbmVkKSBzdGF0ZV9saXN0ZW5lcnNbc3RhdGVfdmFyXSA9IFsgXTsKCQlwZXJzaXN0ZW50ID0gKHBlcnNpc3RlbnQgPT09IHRydWUpOwoJCXZhciBjdXJyZW50X3ZhbHVlID0gc3RhdGVfdmFsdWVzW3N0YXRlX3Zhcl07CgkJaWYgKHBlcnNpc3RlbnQgfHwgdmFsdWUgIT09IGN1cnJlbnRfdmFsdWUpIHN0YXRlX2xpc3RlbmVyc1tzdGF0ZV92YXJdLnB1c2goe2NhbGxiYWNrOmNhbGxiYWNrLCBwZXJzaXN0ZW50OnBlcnNpc3RlbnQsIHZhbHVlOnZhbHVlfSk7CgoJCS8vIElmIGl0J3MgYWxyZWFkeSBhdCB0aGUgZGVzaXJlZCBzdGF0ZSwgY2FsbCB0aGUgY2FsbGJhY2sgaW1tZWRpYXRlbHkuCgkJaWYgKHZhbHVlID09PSBjdXJyZW50X3ZhbHVlKSB7CgkJCXRyeSB7CgkJCQljYWxsYmFjayh2YWx1ZSwgY3VycmVudF92YWx1ZSk7CgkJCX0gY2F0Y2ggKGVycikge30KCQl9CgkJcmV0dXJuIHByb21pc2U7Cgl9CgkvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKCXZhciBldmVudF9saXN0ZW5lcnMgPSB7fTsKCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJLy8gRmlyZSBhbiBldmVudCwgd2hpY2ggdGhlbiBjYWxscyBjYWxsYmFja3MgZm9yIGFueSBsaXN0ZW5lcnMuCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJZnVuY3Rpb24gdHJpZ2dlcl9ldmVudChldmVudCkgewoJCXZhciBsaXN0ZW5lcnMgPSBldmVudF9saXN0ZW5lcnNbZXZlbnRdOwoJCWlmIChsaXN0ZW5lcnMgPT09IHVuZGVmaW5lZCkgcmV0dXJuOwoJCXZhciBhcmdzID0gW107CgkJQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoYXJncyxhcmd1bWVudHMpOwoJCWFyZ3Muc2hpZnQoKTsKCQlmb3IgKHZhciBpZHggaW4gbGlzdGVuZXJzKSB0cnkgewoJCQlsaXN0ZW5lcnNbaWR4XS5hcHBseShudWxsLGFyZ3MpOwoJCX0gY2F0Y2ggKGVycikge30KCQlyZXR1cm4gZ2xvYmFsLndrb2Y7Cgl9CgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCS8vIEFkZCBhIGxpc3RlbmVyIGZvciBhbiBldmVudC4KCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCglmdW5jdGlvbiB3YWl0X2V2ZW50KGV2ZW50LCBjYWxsYmFjaykgewoJCWlmIChldmVudF9saXN0ZW5lcnNbZXZlbnRdID09PSB1bmRlZmluZWQpIGV2ZW50X2xpc3RlbmVyc1tldmVudF0gPSBbXTsKCQlldmVudF9saXN0ZW5lcnNbZXZlbnRdLnB1c2goY2FsbGJhY2spOwoJCXJldHVybiBnbG9iYWwud2tvZjsKCX0KCS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgoJdmFyIGZpbGVfY2FjaGVfb3Blbl9wcm9taXNlOwoKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBPcGVuIHRoZSBmaWxlX2NhY2hlIGRhdGFiYXNlIChvciByZXR1cm4gaGFuZGxlIGlmIG9wZW4pLgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCWZ1bmN0aW9uIGZpbGVfY2FjaGVfb3BlbigpIHsKCQlpZiAoZmlsZV9jYWNoZV9vcGVuX3Byb21pc2UpIHJldHVybiBmaWxlX2NhY2hlX29wZW5fcHJvbWlzZTsKCQl2YXIgb3Blbl9wcm9taXNlID0gcHJvbWlzZSgpOwoJCWZpbGVfY2FjaGVfb3Blbl9wcm9taXNlID0gb3Blbl9wcm9taXNlOwoJCXZhciByZXF1ZXN0OwoJCXJlcXVlc3QgPSBpbmRleGVkREIub3Blbignd2tvZi5maWxlX2NhY2hlJyk7CgkJcmVxdWVzdC5vbnVwZ3JhZGVuZWVkZWQgPSB1cGdyYWRlX2RiOwoJCXJlcXVlc3Qub25zdWNjZXNzID0gZ2V0X2RpcjsKCQlyZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvcjsKCQlyZXR1cm4gb3Blbl9wcm9taXNlOwoKCQlmdW5jdGlvbiBlcnJvcigpIHsKCQkJY29uc29sZS5sb2coJ2luZGV4ZWREQiBjb3VsZCBub3Qgb3BlbiEnKTsKCQkJd2tvZi5maWxlX2NhY2hlLmRpciA9IHt9OwoJCQlpZiAoaWdub3JlX21pc3NpbmdfaW5kZXhlZGRiKSB7CgkJCQlvcGVuX3Byb21pc2UucmVzb2x2ZShudWxsKTsKCQkJfSBlbHNlIHsKCQkJCW9wZW5fcHJvbWlzZS5yZWplY3QoKTsKCQkJfQoJCX0KCgkJZnVuY3Rpb24gdXBncmFkZV9kYihldmVudCl7CgkJCXZhciBkYiA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7CgkJCXZhciBzdG9yZSA9IGRiLmNyZWF0ZU9iamVjdFN0b3JlKCdmaWxlcycsIHtrZXlQYXRoOiduYW1lJ30pOwoJCX0KCgkJZnVuY3Rpb24gZ2V0X2RpcihldmVudCl7CgkJCXZhciBkYiA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7CgkJCXZhciB0cmFuc2FjdGlvbiA9IGRiLnRyYW5zYWN0aW9uKCdmaWxlcycsICdyZWFkb25seScpOwoJCQl2YXIgc3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZSgnZmlsZXMnKTsKCQkJdmFyIHJlcXVlc3QgPSBzdG9yZS5nZXQoJ1tkaXJdJyk7CgkJCXJlcXVlc3Qub25zdWNjZXNzID0gcHJvY2Vzc19kaXI7CgkJCXRyYW5zYWN0aW9uLm9uY29tcGxldGUgPSBvcGVuX3Byb21pc2UucmVzb2x2ZS5iaW5kKG51bGwsIGRiKTsKCQkJb3Blbl9wcm9taXNlLnRoZW4oc2V0VGltZW91dC5iaW5kKG51bGwsIGZpbGVfY2FjaGVfY2xlYW51cCwgMTAwMDApKTsKCQl9CgoJCWZ1bmN0aW9uIHByb2Nlc3NfZGlyKGV2ZW50KXsKCQkJaWYgKGV2ZW50LnRhcmdldC5yZXN1bHQgPT09IHVuZGVmaW5lZCkgewoJCQkJd2tvZi5maWxlX2NhY2hlLmRpciA9IHt9OwoJCQl9IGVsc2UgewoJCQkJd2tvZi5maWxlX2NhY2hlLmRpciA9IEpTT04ucGFyc2UoZXZlbnQudGFyZ2V0LnJlc3VsdC5jb250ZW50KTsKCQkJfQoJCX0KCX0KCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJLy8gTGlzdHMgdGhlIGNvbnRlbnQgb2YgdGhlIGZpbGVfY2FjaGUuCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJZnVuY3Rpb24gZmlsZV9jYWNoZV9saXN0KCkgewoJCWNvbnNvbGUubG9nKE9iamVjdC5rZXlzKHdrb2YuZmlsZV9jYWNoZS5kaXIpLnNvcnQoKS5qb2luKCdcbicpKTsKCX0KCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJLy8gQ2xlYXIgdGhlIGZpbGVfY2FjaGUgZGF0YWJhc2UuCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJZnVuY3Rpb24gZmlsZV9jYWNoZV9jbGVhcigpIHsKCQlyZXR1cm4gZmlsZV9jYWNoZV9vcGVuKCkudGhlbihjbGVhcik7CgoJCWZ1bmN0aW9uIGNsZWFyKGRiKSB7CgkJCXZhciBjbGVhcl9wcm9taXNlID0gcHJvbWlzZSgpOwoJCQl3a29mLmZpbGVfY2FjaGUuZGlyID0ge307CgkJCWlmIChkYiA9PT0gbnVsbCkgcmV0dXJuIGNsZWFyX3Byb21pc2UucmVzb2x2ZSgpOwoJCQl2YXIgdHJhbnNhY3Rpb24gPSBkYi50cmFuc2FjdGlvbignZmlsZXMnLCAncmVhZHdyaXRlJyk7CgkJCXZhciBzdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKCdmaWxlcycpOwoJCQlzdG9yZS5jbGVhcigpOwoJCQl0cmFuc2FjdGlvbi5vbmNvbXBsZXRlID0gY2xlYXJfcHJvbWlzZS5yZXNvbHZlOwoJCX0KCX0KCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJLy8gRGVsZXRlIGEgZmlsZSBmcm9tIHRoZSBmaWxlX2NhY2hlIGRhdGFiYXNlLgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCWZ1bmN0aW9uIGZpbGVfY2FjaGVfZGVsZXRlKHBhdHRlcm4pIHsKCQlyZXR1cm4gZmlsZV9jYWNoZV9vcGVuKCkudGhlbihkZWwpOwoKCQlmdW5jdGlvbiBkZWwoZGIpIHsKCQkJdmFyIGRlbF9wcm9taXNlID0gcHJvbWlzZSgpOwoJCQlpZiAoZGIgPT09IG51bGwpIHJldHVybiBkZWxfcHJvbWlzZS5yZXNvbHZlKCk7CgkJCXZhciB0cmFuc2FjdGlvbiA9IGRiLnRyYW5zYWN0aW9uKCdmaWxlcycsICdyZWFkd3JpdGUnKTsKCQkJdmFyIHN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoJ2ZpbGVzJyk7CgkJCXZhciBmaWxlcyA9IE9iamVjdC5rZXlzKHdrb2YuZmlsZV9jYWNoZS5kaXIpLmZpbHRlcihmdW5jdGlvbihmaWxlKXsKCQkJCWlmIChwYXR0ZXJuIGluc3RhbmNlb2YgUmVnRXhwKSB7CgkJCQkJcmV0dXJuIGZpbGUubWF0Y2gocGF0dGVybikgIT09IG51bGw7CgkJCQl9IGVsc2UgewoJCQkJCXJldHVybiAoZmlsZSA9PT0gcGF0dGVybik7CgkJCQl9CgkJCX0pOwoJCQlmaWxlcy5mb3JFYWNoKGZ1bmN0aW9uKGZpbGUpewoJCQkJc3RvcmUuZGVsZXRlKGZpbGUpOwoJCQkJZGVsZXRlIHdrb2YuZmlsZV9jYWNoZS5kaXJbZmlsZV07CgkJCX0pOwoJCQlmaWxlX2NhY2hlX2Rpcl9zYXZlKCk7CgkJCXRyYW5zYWN0aW9uLm9uY29tcGxldGUgPSBkZWxfcHJvbWlzZS5yZXNvbHZlLmJpbmQobnVsbCwgZmlsZXMpOwoJCQlyZXR1cm4gZGVsX3Byb21pc2U7CgkJfQoJfQoKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBGb3JjZSBpbW1lZGlhdGUgc2F2ZSBvZiBmaWxlX2NhY2hlIGRpcmVjdG9yeS4KCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCglmdW5jdGlvbiBmaWxlX2NhY2hlX2ZsdXNoKCkgewoJCWZpbGVfY2FjaGVfZGlyX3NhdmUodHJ1ZSAvKiBpbW1lZGlhdGVseSAqLyk7Cgl9CgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCS8vIExvYWQgYSBmaWxlIGZyb20gdGhlIGZpbGVfY2FjaGUgZGF0YWJhc2UuCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJZnVuY3Rpb24gZmlsZV9jYWNoZV9sb2FkKG5hbWUpIHsKCQl2YXIgbG9hZF9wcm9taXNlID0gcHJvbWlzZSgpOwoJCXJldHVybiBmaWxlX2NhY2hlX29wZW4oKS50aGVuKGxvYWQpOwoKCQlmdW5jdGlvbiBsb2FkKGRiKSB7CgkJCWlmICh3a29mLmZpbGVfY2FjaGUuZGlyW25hbWVdID09PSB1bmRlZmluZWQpIHsKCQkJCWxvYWRfcHJvbWlzZS5yZWplY3QobmFtZSk7CgkJCQlyZXR1cm4gbG9hZF9wcm9taXNlOwoJCQl9CgkJCXZhciB0cmFuc2FjdGlvbiA9IGRiLnRyYW5zYWN0aW9uKCdmaWxlcycsICdyZWFkb25seScpOwoJCQl2YXIgc3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZSgnZmlsZXMnKTsKCQkJdmFyIHJlcXVlc3QgPSBzdG9yZS5nZXQobmFtZSk7CgkJCXdrb2YuZmlsZV9jYWNoZS5kaXJbbmFtZV0ubGFzdF9sb2FkZWQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7CgkJCWZpbGVfY2FjaGVfZGlyX3NhdmUoKTsKCQkJcmVxdWVzdC5vbnN1Y2Nlc3MgPSBmaW5pc2g7CgkJCXJlcXVlc3Qub25lcnJvciA9IGVycm9yOwoJCQlyZXR1cm4gbG9hZF9wcm9taXNlOwoKCQkJZnVuY3Rpb24gZmluaXNoKGV2ZW50KXsKCQkJCWlmIChldmVudC50YXJnZXQucmVzdWx0ID09PSB1bmRlZmluZWQpIHsKCQkJCQlsb2FkX3Byb21pc2UucmVqZWN0KG5hbWUpOwoJCQkJfSBlbHNlIHsKCQkJCQlsb2FkX3Byb21pc2UucmVzb2x2ZShldmVudC50YXJnZXQucmVzdWx0LmNvbnRlbnQpOwoJCQkJfQoJCQl9CgoJCQlmdW5jdGlvbiBlcnJvcihldmVudCl7CgkJCQlsb2FkX3Byb21pc2UucmVqZWN0KG5hbWUpOwoJCQl9CgkJfQoJfQoKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBTYXZlIGEgZmlsZSBpbnRvIHRoZSBmaWxlX2NhY2hlIGRhdGFiYXNlLgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCWZ1bmN0aW9uIGZpbGVfY2FjaGVfc2F2ZShuYW1lLCBjb250ZW50LCBleHRyYV9hdHRyaWJzKSB7CgkJcmV0dXJuIGZpbGVfY2FjaGVfb3BlbigpLnRoZW4oc2F2ZSk7CgoJCWZ1bmN0aW9uIHNhdmUoZGIpIHsKCQkJdmFyIHNhdmVfcHJvbWlzZSA9IHByb21pc2UoKTsKCQkJaWYgKGRiID09PSBudWxsKSByZXR1cm4gc2F2ZV9wcm9taXNlLnJlc29sdmUobmFtZSk7CgkJCXZhciB0cmFuc2FjdGlvbiA9IGRiLnRyYW5zYWN0aW9uKCdmaWxlcycsICdyZWFkd3JpdGUnKTsKCQkJdmFyIHN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoJ2ZpbGVzJyk7CgkJCXN0b3JlLnB1dCh7bmFtZTpuYW1lLGNvbnRlbnQ6Y29udGVudH0pOwoJCQl2YXIgbm93ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpOwoJCQl3a29mLmZpbGVfY2FjaGUuZGlyW25hbWVdID0gT2JqZWN0LmFzc2lnbih7YWRkZWQ6bm93LCBsYXN0X2xvYWRlZDpub3d9LCBleHRyYV9hdHRyaWJzKTsKCQkJZmlsZV9jYWNoZV9kaXJfc2F2ZSh0cnVlIC8qIGltbWVkaWF0ZWx5ICovKTsKCQkJdHJhbnNhY3Rpb24ub25jb21wbGV0ZSA9IHNhdmVfcHJvbWlzZS5yZXNvbHZlLmJpbmQobnVsbCwgbmFtZSk7CgkJfQoJfQoKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBTYXZlIGEgdGhlIGZpbGVfY2FjaGUgZGlyZWN0b3J5IGNvbnRlbnRzLgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCXZhciBmY19zeW5jX3RpbWVyOwoJZnVuY3Rpb24gZmlsZV9jYWNoZV9kaXJfc2F2ZShpbW1lZGlhdGVseSkgewoJCWlmIChmY19zeW5jX3RpbWVyICE9PSB1bmRlZmluZWQpIGNsZWFyVGltZW91dChmY19zeW5jX3RpbWVyKTsKCQl2YXIgZGVsYXkgPSAoaW1tZWRpYXRlbHkgPyAwIDogMjAwMCk7CgkJZmNfc3luY190aW1lciA9IHNldFRpbWVvdXQoc2F2ZSwgZGVsYXkpOwoKCQlmdW5jdGlvbiBzYXZlKCl7CgkJCWZpbGVfY2FjaGVfb3BlbigpLnRoZW4oc2F2ZTIpOwoJCX0KCgkJZnVuY3Rpb24gc2F2ZTIoZGIpewoJCQlmY19zeW5jX3RpbWVyID0gdW5kZWZpbmVkOwoJCQl2YXIgdHJhbnNhY3Rpb24gPSBkYi50cmFuc2FjdGlvbignZmlsZXMnLCAncmVhZHdyaXRlJyk7CgkJCXZhciBzdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKCdmaWxlcycpOwoJCQlzdG9yZS5wdXQoe25hbWU6J1tkaXJdJyxjb250ZW50OkpTT04uc3RyaW5naWZ5KHdrb2YuZmlsZV9jYWNoZS5kaXIpfSk7CgkJfQoJfQoKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBSZW1vdmUgZmlsZXMgdGhhdCBoYXZlbid0IGJlZW4gYWNjZXNzZWQgaW4gYSB3aGlsZS4KCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCglmdW5jdGlvbiBmaWxlX2NhY2hlX2NsZWFudXAoKSB7CgkJdmFyIHRocmVzaG9sZCA9IG5ldyBEYXRlKCkgLSAxNCo4NjQwMDAwMDsgLy8gMTQgZGF5cwoJCXZhciBvbGRfZmlsZXMgPSBbXTsKCQlmb3IgKHZhciBmbmFtZSBpbiB3a29mLmZpbGVfY2FjaGUuZGlyKSB7CgkJCWlmIChmbmFtZS5tYXRjaCgvXndrb2ZcLnNldHRpbmdzXC4vKSkgY29udGludWU7IC8vIERvbid0IGZsdXNoIHNldHRpbmdzIGZpbGVzLgoJCQl2YXIgZmRhdGUgPSBuZXcgRGF0ZSh3a29mLmZpbGVfY2FjaGUuZGlyW2ZuYW1lXS5sYXN0X2xvYWRlZCk7CgkJCWlmIChmZGF0ZSA8IHRocmVzaG9sZCkgb2xkX2ZpbGVzLnB1c2goZm5hbWUpOwoJCX0KCQlpZiAob2xkX2ZpbGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoJCWNvbnNvbGUubG9nKCdDbGVhbmluZyBvdXQgJytvbGRfZmlsZXMubGVuZ3RoKycgb2xkIGZpbGUocykgZnJvbSAid2tvZi5maWxlX2NhY2hlIjonKTsKCQlmb3IgKHZhciBmbnVtIGluIG9sZF9maWxlcykgewoJCQljb25zb2xlLmxvZygnICAnKyhOdW1iZXIoZm51bSkrMSkrJzogJytvbGRfZmlsZXNbZm51bV0pOwoJCQl3a29mLmZpbGVfY2FjaGUuZGVsZXRlKG9sZF9maWxlc1tmbnVtXSk7CgkJfQoJfQoKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBQcm9jZXNzIG5vLWNhY2hlIHJlcXVlc3RzLgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCWZ1bmN0aW9uIGZpbGVfbm9jYWNoZShsaXN0KSB7CgkJaWYgKGxpc3QgPT09IHVuZGVmaW5lZCkgewoJCQlsaXN0ID0gc3BsaXRfbGlzdChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnd2tvZi5pbmNsdWRlLm5vY2FjaGUnKSB8fCAnJyk7CgkJCWxpc3QgPSBsaXN0LmNvbmNhdChzcGxpdF9saXN0KGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd3a29mLmxvYWRfZmlsZS5ub2NhY2hlJykgfHwgJycpKTsKCQkJY29uc29sZS5sb2cobGlzdC5qb2luKCcsJykpOwoJCX0gZWxzZSBpZiAodHlwZW9mIGxpc3QgPT09ICdzdHJpbmcnKSB7CgkJCXZhciBub19jYWNoZSA9IHNwbGl0X2xpc3QobGlzdCk7CgkJCXZhciBpZHgsIG1vZHVsZXMgPSBbXSwgdXJscyA9IFtdOwoJCQlmb3IgKGlkeCA9IDA7IGlkeCA8IG5vX2NhY2hlLmxlbmd0aDsgaWR4KyspIHsKCQkJCXZhciBpdGVtID0gbm9fY2FjaGVbaWR4XTsKCQkJCWlmIChzdXBwb3J0ZWRfbW9kdWxlc1tpdGVtXSAhPT0gdW5kZWZpbmVkKSB7CgkJCQkJbW9kdWxlcy5wdXNoKGl0ZW0pOwoJCQkJfSBlbHNlIHsKCQkJCQl1cmxzLnB1c2goaXRlbSk7CgkJCQl9CgkJCX0KCQkJY29uc29sZS5sb2coJ01vZHVsZXM6ICcrbW9kdWxlcy5qb2luKCcsJykpOwoJCQljb25zb2xlLmxvZygnICAgVVJMczogJyt1cmxzLmpvaW4oJywnKSk7CgkJCWxvY2FsU3RvcmFnZS5zZXRJdGVtKCd3a29mLmluY2x1ZGUubm9jYWNoZScsIG1vZHVsZXMuam9pbignLCcpKTsKCQkJbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3drb2YubG9hZF9maWxlLm5vY2FjaGUnLCB1cmxzLmpvaW4oJywnKSk7CgkJfQoJfQoKCWZ1bmN0aW9uIGRvY19yZWFkeSgpIHsKCQl3a29mLnNldF9zdGF0ZSgnd2tvZi5kb2N1bWVudCcsICdyZWFkeScpOwoJfQoKCS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgkvLyBCb290bG9hZGVyIFN0YXJ0dXAKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCglmdW5jdGlvbiBzdGFydHVwKCkgewoJCWdsb2JhbC53a29mID0gcHVibGlzaGVkX2ludGVyZmFjZTsKCgkJLy8gTWFyayBkb2N1bWVudCBzdGF0ZSBhcyAncmVhZHknLgoJCWlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7CgkJCWRvY19yZWFkeSgpOwoJCX0gZWxzZSB7CgkJCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgZG9jX3JlYWR5LCBmYWxzZSk7ICAvLyBOb3RpZnkgbGlzdGVuZXJzIHRoYXQgd2UgYXJlIHJlYWR5LgoJCX0KCgkJLy8gT3BlbiBjYWNoZSwgc28gd2tvZi5maWxlX2NhY2hlLmRpciBpcyBhdmFpbGFibGUgdG8gY29uc29sZSBpbW1lZGlhdGVseS4KCQlmaWxlX2NhY2hlX29wZW4oKTsKCQl3a29mLnNldF9zdGF0ZSgnd2tvZi53a29mJywgJ3JlYWR5Jyk7Cgl9CglzdGFydHVwKCk7Cgp9KSh3aW5kb3cpOw=="},{"name":"Wanikani Ultimate Timeline","options":{"check_for_updates":true,"comment":null,"compatopts_for_requires":true,"compat_wrappedjsobject":false,"compat_metadata":false,"compat_foreach":false,"compat_arrayleft":false,"compat_uW_gmonkey":false,"compat_forvarin":false,"noframes":null,"awareOfChrome":false,"run_at":null,"override":{"use_includes":[],"orig_includes":["/^https://(www|preview).wanikani.com/(dashboard)?$/"],"merge_includes":true,"use_matches":[],"orig_matches":[],"merge_matches":true,"use_excludes":[],"orig_excludes":[],"merge_excludes":true,"use_connects":[],"merge_connects":true,"use_blockers":[],"orig_run_at":"document-end","orig_noframes":null,"orig_connects":[]}},"storage":{"ts":1588770704785,"data":{}},"enabled":true,"position":3,"file_url":"https://greasyfork.org/scripts/13475-wanikani-ultimate-timeline/code/Wanikani%20Ultimate%20Timeline.user.js","uuid":"f9c0e32d-1b9a-43f2-a6aa-e641c53df129","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgIFdhbmlrYW5pIFVsdGltYXRlIFRpbWVsaW5lCi8vIEBuYW1lc3BhY2UgICByZmluZGxleQovLyBAZGVzY3JpcHRpb24gUmV2aWV3IHNjaGVkdWxlIGV4cGxvcmVyIGZvciBXYW5pS2FuaQovLyBAdmVyc2lvbiAgICAgNy4wLjI4Ci8vIEBpbmNsdWRlICAgICAvXmh0dHBzOi8vKHd3d3xwcmV2aWV3KS53YW5pa2FuaS5jb20vKGRhc2hib2FyZCk/JC8KLy8gQGNvcHlyaWdodCAgIDIwMTgrLCBSb2JpbiBGaW5kbGV5Ci8vIEBsaWNlbnNlICAgICBNSVQ7IGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKLy8gQHJ1bi1hdCAgICAgIGRvY3VtZW50LWVuZAovLyBAZ3JhbnQgICAgICAgbm9uZQovLyA9PS9Vc2VyU2NyaXB0PT0KCndpbmRvdy50aW1lbGluZSA9IHt9OwoKKGZ1bmN0aW9uKGdvYmopIHsKCiAgICAvKiBnbG9iYWwgJCwgd2tvZiAqLwogICAgLyogZXNsaW50IG5vLW11bHRpLXNwYWNlczogIm9mZiIgKi8KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEluaXRpYWxpemF0aW9uIG9mIHRoZSBXYW5pa2FuaSBPcGVuIEZyYW1ld29yay4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgdmFyIHNjcmlwdF9uYW1lID0gJ1VsdGltYXRlIFRpbWVsaW5lJzsKICAgIHZhciB3a29mX3ZlcnNpb25fbmVlZGVkID0gJzEuMC4yNyc7CiAgICBpZiAoIXdpbmRvdy53a29mKSB7CiAgICAgICAgaWYgKGNvbmZpcm0oc2NyaXB0X25hbWUrJyByZXF1aXJlcyBXYW5pa2FuaSBPcGVuIEZyYW1ld29yay5cbkRvIHlvdSB3YW50IHRvIGJlIGZvcndhcmRlZCB0byB0aGUgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucz8nKSkgewogICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICdodHRwczovL2NvbW11bml0eS53YW5pa2FuaS5jb20vdC9pbnN0cnVjdGlvbnMtaW5zdGFsbGluZy13YW5pa2FuaS1vcGVuLWZyYW1ld29yay8yODU0OSc7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh3a29mLnZlcnNpb24uY29tcGFyZV90byh3a29mX3ZlcnNpb25fbmVlZGVkKSA9PT0gJ29sZGVyJykgewogICAgICAgIGlmIChjb25maXJtKHNjcmlwdF9uYW1lKycgcmVxdWlyZXMgV2FuaWthbmkgT3BlbiBGcmFtZXdvcmsgdmVyc2lvbiAnK3drb2ZfdmVyc2lvbl9uZWVkZWQrJy5cbkRvIHlvdSB3YW50IHRvIGJlIGZvcndhcmRlZCB0byB0aGUgdXBkYXRlIHBhZ2U/JykpIHsKICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9lbi9zY3JpcHRzLzM4NTgyLXdhbmlrYW5pLW9wZW4tZnJhbWV3b3JrJzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHdrb2YuaW5jbHVkZSgnSXRlbURhdGEsTWVudSxTZXR0aW5ncycpOwogICAgd2tvZi5yZWFkeSgnZG9jdW1lbnQsSXRlbURhdGEsTWVudSxTZXR0aW5ncycpLnRoZW4obG9hZF9zZXR0aW5ncykudGhlbihzdGFydHVwKTsKCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIENoYXJ0IGRlZmluaW5nIHRoZSBhdXRvLXNjYWxpbmcgZmFjdG9ycyBvZiB0aGUgWC1heGlzLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB2YXIgeHNjYWxlID0gewogICAgICAgIC8vIFNjYWxpbmcgY2hhcnQuICBFYWNoIGNvbHVtbiByZXByZXNlbnRzIGEgc2NhbGluZyByYW5nZSwKICAgICAgICAvLyBhbmQgZWFjaCByb3cgaXMgc29tZXRoaW5nIHRoYXQgd2UgYXJlIHNjYWxpbmcuCiAgICAgICAgaG91cnNfcGVyX2xhYmVsOiAgIFsgIDEgLCAgMyAsICA2ICwgIDEyICwgIDI0ICwgIDQ4ICwgNzIwIF0sCiAgICAgICAgcmVkX3RpY19jaG9pY2VzOiAgIFsnMWQnLCcxZCcsJzFkJywgJzFkJywgJzF3JywnMXdzJywgJzFtJ10sIC8vIFJlZCBtYWpvciB0aWNzIChyZWQgbGFiZWwpCiAgICAgICAgbWFqb3JfdGljX2Nob2ljZXM6IFsnMWgnLCczaCcsJzZoJywnMTJoJywgJzFkJywnMWRzJywgJzVEJ10sIC8vIE1ham9yIHRpY3MgKGhhcyBsYWJlbCkKICAgICAgICBtaW5vcl90aWNfY2hvaWNlczogWyAnLScsJzFoJywnMWgnLCAnM2gnLCAnNmgnLCcxMmgnLCAnMWQnXSwgLy8gTWlub3IgdGljcyAobm8gbGFiZWwpCiAgICAgICAgYnVuZGxlX2Nob2ljZXMgICA6IFsgIDEgLCAgMSAsICAxICwgICAzICwgICA2ICwgIDEyICwgIDI0IF0sIC8vIEhvdyBtYW55IGhvdXJzIGFyZSBidW5kbGVkIHRvZ2V0aGVyLgogICAgICAgIGlkeDogMAogICAgfTsKCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEludGVyYWwgZ2xvYmFsIG9iamVjdCBmb3IgY2VudHJhbGl6aW5nIGRhdGEgYW5kIGNvbmZpZ3VyYXRpb24uCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHZhciBncmFwaCA9IHsKICAgICAgICBlbGVtOiBudWxsLAogICAgICAgIG1hcmdpbjogewogICAgICAgICAgICB0b3A6IDE2LAogICAgICAgICAgICBsZWZ0OiAyOCwKICAgICAgICAgICAgYm90dG9tOiAxNiwKICAgICAgICB9LAogICAgICAgIHhfYXhpczogewogICAgICAgICAgICB3aWR0aDogMCwKICAgICAgICAgICAgbWF4X2hvdXJzOiAwLAogICAgICAgICAgICBwaXhlbHNfcGVyX3RpYzogMCwKICAgICAgICB9LAogICAgICAgIHlfYXhpczogewogICAgICAgICAgICBoZWlnaHQ6IDEwMCwKICAgICAgICAgICAgbWluX2hlaWdodDogODAsCiAgICAgICAgICAgIG1heF9oZWlnaHQ6IDMwMCwKICAgICAgICAgICAgbWF4X3Jldmlld3M6IDAsCiAgICAgICAgfSwKICAgICAgICByYWRpY2FsX2NhY2hlOiB7fSwKICAgIH07CiAgICBnb2JqLmdyYXBoID0gZ3JhcGg7CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBHbG9iYWwgdXRpbGl0eSBmdW5jdGlvbnMuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHRvX3RpdGxlX2Nhc2Uoc3RyKSB7cmV0dXJuIHN0ci5yZXBsYWNlKC9cd1xTKi9nLCBmdW5jdGlvbih0eHQpe3JldHVybiB0eHQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0eHQuc3Vic3RyKDEpLnRvTG93ZXJDYXNlKCk7fSk7fQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gR2xvYmFsIHZhcmlhYmxlcwogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB2YXIgc2V0dGluZ3MsIHNldHRpbmdzX2RpYWxvZzsKICAgIHZhciB0el9vZnMgPSBuZXcgRGF0ZSgpLmdldFRpbWV6b25lT2Zmc2V0KCk7CiAgICB2YXIgdGltZV9zaGlmdCA9IE1hdGguY2VpbCh0el9vZnMgLyA2MCkgKiA2MCAtIHR6X29mczsKCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gTG9hZCB0aGUgc2NyaXB0IHNldHRpbmdzLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBsb2FkX3NldHRpbmdzKCkgewogICAgICAgIHZhciBkZWZhdWx0cyA9IHsKICAgICAgICAgICAgbWluaW1pemVkOiBmYWxzZSwKICAgICAgICAgICAgcGxhY2VtZW50OiAnYmVmb3JlX25leHRyZXZpZXcnLAogICAgICAgICAgICB0aW1lX2Zvcm1hdDogJzEyaG91cicsCiAgICAgICAgICAgIGdyYXBoX2hlaWdodDogMTAwLAogICAgICAgICAgICBtYXhfZGF5czogMTQsCiAgICAgICAgICAgIGRheXM6IDMuNSwKICAgICAgICAgICAgbWF4X2Jhcl93aWR0aDogNDAsCiAgICAgICAgICAgIG1heF9iYXJfaGVpZ2h0OiAwLAogICAgICAgICAgICBmaXhlZF9iYXJfaGVpZ2h0OiBmYWxzZSwKICAgICAgICAgICAgYmFyX3N0eWxlOiAnaXRlbV90eXBlJywKICAgICAgICAgICAgc3JzX2N1cnJfbmV4dDogJ2N1cnInLAogICAgICAgICAgICBjdXJyZW50X2xldmVsX21hcmtlcnM6ICdya3YnLAogICAgICAgICAgICBidXJuX21hcmtlcnM6ICdzaG93JywKICAgICAgICAgICAgc2hvd19yZXZpZXdfZGV0YWlsczogJ2Z1bGwnLAogICAgICAgICAgICByZXZpZXdfZGV0YWlsc19zdW1tYXJ5OiAnaXRlbV90eXBlJywKICAgICAgICAgICAgcmV2aWV3X2RldGFpbHNfYnV0dG9uczogdHJ1ZSwKICAgICAgICAgICAgc2hvd19iYXJfc3R5bGVfZHJvcGRvd246IHRydWUsCiAgICAgICAgfTsKICAgICAgICByZXR1cm4gd2tvZi5TZXR0aW5ncy5sb2FkKCd0aW1lbGluZScsIGRlZmF1bHRzKS50aGVuKGZ1bmN0aW9uKGRhdGEpewogICAgICAgICAgICBzZXR0aW5ncyA9IHdrb2Yuc2V0dGluZ3MudGltZWxpbmU7CiAgICAgICAgICAgIHN3aXRjaCAoc2V0dGluZ3Muc2hvd19tYXJrZXJzKSB7CiAgICAgICAgICAgICAgICBjYXNlICdub25lJzoKICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5jdXJyZW50X2xldmVsX21hcmtlcnMgPSAnbm9uZSc7CiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuYnVybl9tYXJrZXJzID0gJ2hpZGUnOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnY3Vycic6CiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuY3VycmVudF9sZXZlbF9tYXJrZXJzID0gJ3Jrdic7CiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuYnVybl9tYXJrZXJzID0gJ2hpZGUnOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnYnVybic6CiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuY3VycmVudF9sZXZlbF9tYXJrZXJzID0gJ25vbmUnOwogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmJ1cm5fbWFya2VycyA9ICdzaG93JzsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ2JvdGgnOgogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmN1cnJlbnRfbGV2ZWxfbWFya2VycyA9ICdya3YnOwogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmJ1cm5fbWFya2VycyA9ICdzaG93JzsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZWxldGUgc2V0dGluZ3Muc2hvd19tYXJrZXJzOwogICAgICAgIH0pOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBTdGFydHVwCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHN0YXJ0dXAoKSB7CiAgICAgICAgaW5zdGFsbF9jc3MoKTsKICAgICAgICBpbnN0YWxsX21lbnVfbGluaygpOwogICAgICAgIHBsYWNlX3RpbWVsaW5lKHRydWUgLyogZmlyc3RfdGltZSAqLyk7CiAgICAgICAgZmV0Y2hfYW5kX3VwZGF0ZSgpOwogICAgICAgIHN0YXJ0X3JlZnJlc2hfdGltZXIoKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEluc3RhbGwgYSBsaW5rIHRvIHRoZSBzZXR0aW5ncyBpbiB0aGUgbWVudS4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gaW5zdGFsbF9tZW51X2xpbmsoKQogICAgewogICAgICAgIHdrb2YuTWVudS5pbnNlcnRfc2NyaXB0X2xpbmsoewogICAgICAgICAgICBuYW1lOiAndGltZWxpbmUnLAogICAgICAgICAgICBzdWJtZW51OiAnU2V0dGluZ3MnLAogICAgICAgICAgICB0aXRsZTogJ1VsdGltYXRlIFRpbWVsaW5lJywKICAgICAgICAgICAgb25fY2xpY2s6IG9wZW5fc2V0dGluZ3MKICAgICAgICB9KTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFRvcC1sZXZlbCBIVE1MIGZvciB0aGUgc2NyaXB0LgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB2YXIgdGltZWxpbmVfaHRtbCA9CiAgICAgICAgJzxzZWN0aW9uIGlkPSJ0aW1lbGluZSI+JysKICAgICAgICAnICA8aDQgY2xhc3M9Im5vX21pbiI+UmV2aWV3cyBUaW1lbGluZTwvaDQ+JysKICAgICAgICAnICA8aSBjbGFzcz0ibGluayBvcGVuIG5vc2VsZWN0IG5vX21pbiBpY29uLWNoZXZyb24tdXAiIHRpdGxlPSJPcGVuIHRoZSB0aW1lbGluZSI+PC9pPicrCiAgICAgICAgJyAgPGkgY2xhc3M9ImxpbmsgbWluaW1pemUgbm9zZWxlY3QgaWNvbi1jaGV2cm9uLWRvd24iIHRpdGxlPSJNaW5pbWl6ZSB0aGUgdGltZWxpbmUiPjwvaT4nKwogICAgICAgICcgIDxpIGNsYXNzPSJsaW5rIHJlZnJlc2ggbm9zZWxlY3QgaWNvbi1yZWZyZXNoIiB0aXRsZT0iUmVmcmVzaCI+PC9pPicrCiAgICAgICAgJyAgPGkgY2xhc3M9Imxpbmsgc2V0dGluZ3Mgbm9zZWxlY3QgaWNvbi1nZWFyIiB0aXRsZT0iQ2hhbmdlIHRpbWVsaW5lIHNldHRpbmdzIj48L2k+JysKICAgICAgICAnICA8c3BhbiBjbGFzcz0iYmFyX3N0eWxlIGhpZGRlbiI+PGxhYmVsPkJhciBTdHlsZTogPC9sYWJlbD48c2VsZWN0PicrCiAgICAgICAgJyAgICA8b3B0aW9uIG5hbWU9ImNvdW50Ij5SZXZpZXcgQ291bnQ8L29wdGlvbj4nKwogICAgICAgICcgICAgPG9wdGlvbiBuYW1lPSJpdGVtX3R5cGUiPkl0ZW0gVHlwZTwvb3B0aW9uPicrCiAgICAgICAgJyAgICA8b3B0aW9uIG5hbWU9InNyc19zdGFnZSI+U1JTIExldmVsPC9vcHRpb24+JysKICAgICAgICAnICAgIDxvcHRpb24gbmFtZT0ibGV2ZWwiPkxldmVsPC9vcHRpb24+JysKICAgICAgICAnICA8L3NlbGVjdD48L3NwYW4+JysKICAgICAgICAnICA8Zm9ybSBjbGFzcz0icmFuZ2VfZm9ybSIgY2xhc3M9ImhpZGRlbiI+PGxhYmVsPjxzcGFuIGNsYXNzPSJyYW5nZV9yZXZpZXdzIj4wPC9zcGFuPiByZXZpZXdzIGluIDxzcGFuIGNsYXNzPSJyYW5nZV9kYXlzIj4zIGRheXM8L3NwYW4+IDxpbnB1dCBjbGFzcz0icmFuZ2VfaW5wdXQiIHR5cGU9InJhbmdlIiBtaW49IjAuMjUiIG1heD0iNyIgdmFsdWU9IjMiIHN0ZXA9IjAuMjUiIG5hbWU9InJhbmdlX2lucHV0Ij48L2xhYmVsPjwvZm9ybT48YnIgY2xlYXI9ImFsbCIgY2xhc3M9Im5vX21pbiI+JysKICAgICAgICAnICA8ZGl2IGNsYXNzPSJncmFwaF93cmFwIj4nKwogICAgICAgICcgICAgPGRpdiBjbGFzcz0icmV2aWV3X2luZm8gaGlkZGVuIj48ZGl2IGNsYXNzPSJpbm5lciI+PC9kaXY+PC9kaXY+JysKICAgICAgICAnICAgIDxkaXYgY2xhc3M9ImdyYXBoX3BhbmVsIj48L2Rpdj4nKwogICAgICAgICcgIDwvZGl2PicrCiAgICAgICAgJzwvc2VjdGlvbj4nOwoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gSW5zdGFsbCB0aGUgc3R5bGUgc2hlZXQgZm9yIHRoZSBzY3JpcHQuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIGluc3RhbGxfY3NzKCkgewogICAgICAgIHZhciB0aW1lbGluZV9jc3MgPQogICAgICAgICAgICAnLm5vc2VsZWN0IHstd2Via2l0LXRvdWNoLWNhbGxvdXQ6bm9uZTsgLXdlYmtpdC11c2VyLXNlbGVjdDpub25lOyAta2h0bWwtdXNlci1zZWxlY3Q6bm9uZTsgLW1vei11c2VyLXNlbGVjdDpub25lOyAtbXMtdXNlci1zZWxlY3Q6bm9uZTsgdXNlci1zZWxlY3Q6bm9uZTsgY3Vyc29yOmRlZmF1bHQ7fScrCiAgICAgICAgICAgICcuZGFzaGJvYXJkIHNlY3Rpb24ucmV2aWV3LXN0YXR1cyB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkICNmZmZmZmY7fScrCiAgICAgICAgICAgICcuZGFzaGJvYXJkIHNlY3Rpb24ucmV2aWV3LXN0YXR1cyB1bCBsaSB0aW1lIHt3aGl0ZS1zcGFjZTogbm93cmFwOyBvdmVyZmxvdy14OiBoaWRkZW47IGhlaWdodDogMS41ZW07IG1hcmdpbi1ib3R0b206IDA7fScrCgogICAgICAgICAgICAnI3RpbWVsaW5lIHttYXJnaW4tYm90dG9tOiAwcHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZDRkNGQ0O30nKwogICAgICAgICAgICAnI3RpbWVsaW5lID4gaDQge2NsZWFyOm5vbmU7IGZsb2F0OmxlZnQ7IGhlaWdodDoyMHB4OyBtYXJnaW4tdG9wOjBweDsgbWFyZ2luLWJvdHRvbTo0cHg7IGZvbnQtd2VpZ2h0Om5vcm1hbDsgbWFyZ2luLXJpZ2h0OjEycHg7fScrCiAgICAgICAgICAgICdAbWVkaWEgKG1heC13aWR0aDogNzY3cHgpIHsjdGltZWxpbmUgaDQge2Rpc3BsYXk6IG5vbmU7fX0nKwogICAgICAgICAgICAnI3RpbWVsaW5lID4gLmxpbmsge2NvbG9yOnJnYmEoMCwwLDAsMC4zKTsgZm9udC1zaXplOjEuMWVtOyB0ZXh0LWRlY29yYXRpb246bm9uZTsgY3Vyc29yOnBvaW50ZXI7IG1hcmdpbi1yaWdodDo0cHg7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgPiAubGluazpob3ZlciB7Y29sb3I6cmdiYSgyNTUsMzEsMzEsMC41KTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZTpub3QoLm1pbikgPiAubGluay5vcGVuLCAjdGltZWxpbmUubWluID4gOm5vdCgubm9fbWluKSB7ZGlzcGxheTpub25lO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lID4gLnJhbmdlX2Zvcm0ge2Zsb2F0OnJpZ2h0OyBtYXJnaW4tYm90dG9tOjBweDsgdGV4dC1hbGlnbjpyaWdodDt9JysKCiAgICAgICAgICAgICcjdGltZWxpbmUgLmJhcl9zdHlsZSBsYWJlbCB7ZGlzcGxheTppbmxpbmU7IG1hcmdpbi1sZWZ0OjgwcHg7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLmJhcl9zdHlsZSBzZWxlY3Qge2hlaWdodDphdXRvOyBwYWRkaW5nOjA7IHdpZHRoOmF1dG87IHZlcnRpY2FsLWFsaWduOmJhc2VsaW5lOyBiYWNrZ3JvdW5kLWNvbG9yOiNlM2UzZTM7IGJvcmRlcjoxcHggc29saWQgI2FhYTsgYm9yZGVyLXJhZGl1czoycHg7fScrCiAgICAgICAgICAgICdAbWVkaWEgKG1heC13aWR0aDogOTc5cHgpIHsnKwogICAgICAgICAgICAnICAjdGltZWxpbmUgLmJhcl9zdHlsZSB7ZmxvYXQ6bGVmdDsgY2xlYXI6Ym90aDsgbWFyZ2luLWxlZnQ6aW5oZXJpdDt9JysKICAgICAgICAgICAgJyAgI3RpbWVsaW5lIC5iYXJfc3R5bGUgbGFiZWwge21hcmdpbi1sZWZ0OmluaGVyaXQ7fScrCiAgICAgICAgICAgICd9JysKICAgICAgICAgICAgJ0BtZWRpYSAobWF4LXdpZHRoOiA3NjdweCkgeyN0aW1lbGluZSAubGluayB7ZmxvYXQ6bGVmdDt9fScrCgogICAgICAgICAgICAnI3RpbWVsaW5lID4gLmdyYXBoX3BhbmVsIGRpdiwgI3RpbWVsaW5lID4gLmdyYXBoX3BhbmVsIGNhbnZhcyB7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSA+IC5ncmFwaF9wYW5lbCBkaXYge2JvcmRlcjoxcHggc29saWQgI2Q0ZDRkNDt9JysKCiAgICAgICAgICAgICcjdGltZWxpbmUgLmdyYXBoX3dyYXAge3Bvc2l0aW9uOnJlbGF0aXZlO30nKwoKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm8ge3Bvc2l0aW9uOmFic29sdXRlOyBwYWRkaW5nLWJvdHRvbToxNTBweDsgei1pbmRleDo1O30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mbyAuaW5uZXIge3BhZGRpbmc6NHB4IDhweCA4cHggOHB4OyBjb2xvcjojZWVlZWVlOyBiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsMC44KTsgYm9yZGVyLXJhZGl1czo0cHg7IGZvbnQtd2VpZ2h0OmJvbGQ7IHotaW5kZXg6MjsgYm94LXNpemluZzpib3JkZXItYm94O30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mbyAuc3VtbWFyeSB7Zm9udC1mYW1pbHk6Ik9wZW4gU2FucyIsIkhlbHZldGljYSBOZXVlIixIZWx2ZXRpY2EsQXJpYWwsc2Fucy1zZXJpZjsgZm9udC1zaXplOjEzcHg7IGRpc3BsYXk6aW5saW5lLWJsb2NrO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mbyAuc3VtbWFyeSBkaXYge3BhZGRpbmc6MHB4IDhweDt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm8gLnN1bW1hcnkgLmluZGVudCB7cGFkZGluZzowOyBtYXJnaW4tYm90dG9tOjhweDt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm8gLnN1bW1hcnkgLmluZGVudDpsYXN0LWNoaWxkIHttYXJnaW4tYm90dG9tOjA7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLnJldmlld19pbmZvIC5zdW1tYXJ5IC5maXhlZCB7dGV4dC1hbGlnbjpyaWdodDt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm8gLnN1bW1hcnkgLnRvdCB7Y29sb3I6IzAwMDAwMDsgYmFja2dyb3VuZC1jb2xvcjojZWZlZmVmOyBiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICNlZmVmZWYsICNjZmNmY2YpO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mbyAuaXRlbXNfd3JhcCB7cG9zaXRpb246cmVsYXRpdmU7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLnN1bW1hcnkgLmZpeGVkIHtkaXNwbGF5OmlubGluZS1ibG9jazsgcG9zaXRpb246cmVsYXRpdmU7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLnJldmlld19pbmZvIC5zdW1tYXJ5IC5pbmRlbnQ+ZGl2IHtkaXNwbGF5Om5vbmV9JysKCiAgICAgICAgICAgICcjdGltZWxpbmUgLnJldmlld19pbmZvW2RhdGEtbW9kZT0iaXRlbV90eXBlIl0gLnN1bW1hcnkgLml0ZW1fdHlwZSB7ZGlzcGxheTpibG9jazt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm9bZGF0YS1tb2RlPSJzcnNfc3RhZ2UiXSAuc3VtbWFyeSAuc3JzX3N0YWdlIHtkaXNwbGF5OmJsb2NrO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mb1tkYXRhLW1vZGU9ImxldmVsIl0gLnN1bW1hcnkgLmxldmVsIHtkaXNwbGF5OmJsb2NrO30nKwoKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm9bZGF0YS1tb2RlPSJjb3VudCJdIC5pdGVtX2xpc3QgPiBsaSB7YmFja2dyb3VuZC1jb2xvcjojZWVlOyBiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICNlZmVmZWYsICNjZmNmY2YpOyBjb2xvcjojMDAwO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mb1tkYXRhLW1vZGU9ImNvdW50Il0gLml0ZW1fbGlzdCA+IGxpIHN2ZyB7c3Ryb2tlOiMwMDA7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLnJldmlld19pbmZvW2RhdGEtbW9kZT0iaXRlbV90eXBlIl0gLnJhZCB7YmFja2dyb3VuZC1jb2xvcjojMDA5NmU3OyBiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICMwYWYsICMwMDkzZGQpO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mb1tkYXRhLW1vZGU9Iml0ZW1fdHlwZSJdIC5rYW4ge2JhY2tncm91bmQtY29sb3I6I2VlMDBhMTsgYmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjZjBhLCAjZGQwMDkzKTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm9bZGF0YS1tb2RlPSJpdGVtX3R5cGUiXSAudm9jIHtiYWNrZ3JvdW5kLWNvbG9yOiM5ODAwZTg7IGJhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgI2EwZiwgIzkzMDBkZCk7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLnJldmlld19pbmZvW2RhdGEtbW9kZT0ic3JzX3N0YWdlIl0gLmFwcHIge2JhY2tncm91bmQtY29sb3I6I2RkMDA5MzsgYmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjZmYwMGFhLCAjYjMwMDc3KTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm9bZGF0YS1tb2RlPSJzcnNfc3RhZ2UiXSAuZ3VydSB7YmFja2dyb3VuZC1jb2xvcjojODgyZDllOyBiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICNhYTM4YzcsICM2NjIyNzcpO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mb1tkYXRhLW1vZGU9InNyc19zdGFnZSJdIC5tYXN0IHtiYWNrZ3JvdW5kLWNvbG9yOiMyOTRkZGI7IGJhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgIzUxNmVlMSwgIzIxNDJjNCk7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLnJldmlld19pbmZvW2RhdGEtbW9kZT0ic3JzX3N0YWdlIl0gLmVubGkge2JhY2tncm91bmQtY29sb3I6IzAwOTNkZDsgYmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjMDBhYWZmLCAjMDA3N2IzKTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm9bZGF0YS1tb2RlPSJzcnNfc3RhZ2UiXSAuYnVybiB7YmFja2dyb3VuZC1jb2xvcjojNDM0MzQzOyBiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICM0MzQzNDMsICMxYTFhMWEpO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mb1tkYXRhLW1vZGU9InNyc19zdGFnZSJdIGxpLmJ1cm4ge2JvcmRlcjoxcHggc29saWQgIzc3Nzt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm9bZGF0YS1tb2RlPSJsZXZlbCJdIC5sdmxncnAwIHtiYWNrZ3JvdW5kLWNvbG9yOiM1ZWI2ZTg7IGJhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgIzVlYjZlOCwgIzFkOGFjOSk7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLnJldmlld19pbmZvW2RhdGEtbW9kZT0ibGV2ZWwiXSAubHZsZ3JwMSB7YmFja2dyb3VuZC1jb2xvcjojZTI1ZWJjOyBiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICNlMjVlYmMsICNjMjI0OTUpO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mb1tkYXRhLW1vZGU9ImxldmVsIl0gLmx2bGdycDIge2JhY2tncm91bmQtY29sb3I6I2FmNzljMzsgYmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjYWY3OWMzLCAjODc0NzllKTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm9bZGF0YS1tb2RlPSJsZXZlbCJdIC5sdmxncnAzIHtiYWNrZ3JvdW5kLWNvbG9yOiM3NjhjZTc7IGJhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgIzc2OGNlNywgIzI2NGFkOSk7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLnJldmlld19pbmZvW2RhdGEtbW9kZT0ibGV2ZWwiXSAubHZsZ3JwNCB7YmFja2dyb3VuZC1jb2xvcjojNWU1ZTY0OyBiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICM1ZTVlNjQsICMzMTMxMzUpO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mb1tkYXRhLW1vZGU9ImxldmVsIl0gLmx2bGdycDUge2JhY2tncm91bmQtY29sb3I6I2Y1YzY2NzsgYmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjZjVjNjY3LCAjZjBhNTBmKTsgY29sb3I6IzMzM30nKwoKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm9bZGF0YS1tb2RlPSJsZXZlbCJdIC5sdmxncnA1IHN2ZyB7c3Ryb2tlOiMzMzN9JysKCiAgICAgICAgICAgICcjdGltZWxpbmUgLnJldmlld19pbmZvIC5zdW1tYXJ5IC5pbmRlbnQ+LmN1ciB7ZGlzcGxheTpibG9jazsgZm9udC1zdHlsZTppdGFsaWM7IGNvbG9yOiMwMDAwMDA7IGJhY2tncm91bmQtY29sb3I6I2ZmZmY4ODsgYmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjZmZmZmFhLCAjZWVlZTc3KTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm8gLnN1bW1hcnkgLmluZGVudD4uYnVyIHtkaXNwbGF5OmJsb2NrOyBmb250LXN0eWxlOml0YWxpYzsgY29sb3I6I2ZmZmZmZjsgYmFja2dyb3VuZC1jb2xvcjojMDAwMDAwOyBiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICM0NDQ0NDQsICMwMDAwMDApO30nKwoKICAgICAgICAgICAgJyN0aW1lbGluZSAuaXRlbV9saXN0IHttYXJnaW46IDhweCAwIDAgMDsgcGFkZGluZzogMHB4O30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5pdGVtX2xpc3QgPiBsaSB7cGFkZGluZzowIDNweDsgbWFyZ2luOjFweCAxcHg7IGRpc3BsYXk6aW5saW5lLWJsb2NrOyBib3JkZXItcmFkaXVzOjRweDsgZm9udC1zaXplOjE0cHg7IGZvbnQtd2VpZ2h0Om5vcm1hbDsgY3Vyc29yOmRlZmF1bHQ7IGJveC1zaXppbmc6Ym9yZGVyLWJveDsgYm9yZGVyOjFweCBzb2xpZCByZ2JhKDAsMCwwLDApO30nKwoKICAgICAgICAgICAgJyN0aW1lbGluZVtkYXRhLWRldGFpbD0iZnVsbCJdIC5pdGVtX2xpc3QgPiBsaSB7Y3Vyc29yOnBvaW50ZXI7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLml0ZW1faW5mbyB7cG9zaXRpb246YWJzb2x1dGU7IGJhY2tncm91bmQ6IzMzMzsgYm9yZGVyOjhweCBzb2xpZCByZ2JhKDAsMCwwLDAuNyk7IGJvcmRlci1yYWRpdXM6NnB4OyBsZWZ0OjRweDsgcGFkZGluZzowIDhweDsgei1pbmRleDoxMDt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAuaXRlbV9pbmZvIC5pdGVtIHtmb250LXNpemU6MmVtOyBsaW5lLWhlaWdodDoxLjJlbTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm8gc3ZnLnJhZGljYWwge2ZpbGw6bm9uZTtzdHJva2U6I2ZmZjtzdHJva2Utd2lkdGg6ODU7c3Ryb2tlLWxpbmVjYXA6c3F1YXJlO3N0cm9rZS1taXRlcmxpbWl0OjI7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLml0ZW1fbGlzdCBzdmcucmFkaWNhbCB7d2lkdGg6MWVtOyB0cmFuc2Zvcm06dHJhbnNsYXRlWSgycHgpOyBzdHJva2Utd2lkdGg6ODU7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLml0ZW1faW5mbyAuaXRlbSBzdmcucmFkaWNhbCB7d2lkdGg6MjhweDsgdHJhbnNmb3JtOnRyYW5zbGF0ZVkoMnB4KTt9JysKCiAgICAgICAgICAgICcjdGltZWxpbmUgLmRldGFpbF9idXR0b25zIHtkaXNwbGF5OmlubGluZS1ibG9jazsgdmVydGljYWwtYWxpZ246dG9wOyBtYXJnaW4tbGVmdDo4cHg7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLmRldGFpbF9idXR0b25zIGJ1dHRvbiB7ZGlzcGxheTpibG9jazsgd2lkdGg6MTMwcHg7IHBhZGRpbmc6MDsgbWFyZ2luLWJvdHRvbToycHg7fScrCgogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyB7b3ZlcmZsb3c6aGlkZGVuO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAuZ3JpZCB7cG9pbnRlci1ldmVudHM6bm9uZTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmdyaWQgcGF0aCB7ZmlsbDpub25lO3N0cm9rZTpibGFjaztzdHJva2UtbGluZWNhcDpzcXVhcmU7c2hhcGUtcmVuZGVyaW5nOmNyaXNwRWRnZXM7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5ncmlkIC5saWdodCB7c3Ryb2tlOiNmZmZmZmY7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5ncmlkIC5zaGFkb3cge3N0cm9rZTojZDVkNWQ1O30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAuZ3JpZCAubWFqb3Ige29wYWNpdHk6MC4xNTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmdyaWQgLm1pbm9yIHtvcGFjaXR5OjAuMDU7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5ncmlkIC5yZWR0aWMge3N0cm9rZTojZjIyO29wYWNpdHk6MTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmdyaWQgLm1heCB7c3Ryb2tlOiNmMjI7b3BhY2l0eTowLjI7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5ib3VuZGFyeSB7ZmlsbDojMDAwO29wYWNpdHk6MDt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLnJlc2l6ZV9ncmlwIHtmaWxsOm5vbmU7Y3Vyc29yOnJvdy1yZXNpemU7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5yZXNpemVfZ3JpcCAubGlnaHQge3N0cm9rZTojZmZmZmZmO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAucmVzaXplX2dyaXAgLnNoYWRvdyB7c3Ryb2tlOiNiYmI7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIHRleHQucmVkdGljIHtmaWxsOiNmMjI7Zm9udC13ZWlnaHQ6Ym9sZDt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmxhYmVsLXggdGV4dCB7dGV4dC1hbmNob3I6c3RhcnQ7Zm9udC1zaXplOjAuOGVtO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAubGFiZWwteSB0ZXh0IHt0ZXh0LWFuY2hvcjplbmQ7Zm9udC1zaXplOjAuOGVtO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyB0ZXh0IHtwb2ludGVyLWV2ZW50czpub25lO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAuYmFycyByZWN0IHtzdHJva2U6bm9uZTtzaGFwZS1yZW5kZXJpbmc6Y3Jpc3BFZGdlczt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmJhci5vdmVybGF5IHtvcGFjaXR5OjA7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5ia2dkIHtmaWxsOiNmN2Y3Zjc7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5yYWQge2ZpbGw6IzAwYTFmMTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmthbiB7ZmlsbDojZjEwMGExO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAudm9jIHtmaWxsOiNhMTAwZjE7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5zdW0ge2ZpbGw6IzI5NGRkYjt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmFwcHIge2ZpbGw6I2RkMDA5Mzt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmd1cnUge2ZpbGw6Izg4MmQ5ZTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLm1hc3Qge2ZpbGw6IzI5NGRkYjt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmVubGkge2ZpbGw6IzAwOTNkZDt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmJ1cm4ge2ZpbGw6IzQzNDM0Mzt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmNvdW50IHtmaWxsOiM3NzhhZDg7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5sdmxncnAwIHtmaWxsOiM1ZWI2ZTg7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5sdmxncnAxIHtmaWxsOiNlMjVlYmM7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5sdmxncnAyIHtmaWxsOiNhZjc5YzM7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5sdmxncnAzIHtmaWxsOiM3NjhjZTc7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5sdmxncnA0IHtmaWxsOiM1ZTVlNjQ7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5sdmxncnA1IHtmaWxsOiNmNWM2Njc7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5iYXJzIC5jdXIge2ZpbGw6I2ZmZmZmZjtvcGFjaXR5OjAuNjt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmJhcnMgLmJ1ciB7ZmlsbDojMDAwMDAwO29wYWNpdHk6MC40O30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAubWFya2VycyB7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuNTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLm1hcmtlcnMgLmJ1ciB7ZmlsbDojMDAwMDAwO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAubWFya2VycyAuY3VyIHtmaWxsOiNmZmZmZmY7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5oaWdobGlnaHQgLmJvdW5kYXJ5IHtjdXJzb3I6cG9pbnRlcjt9JysKICAgICAgICAgICAgJyN0aW1lbGluZVtkYXRhLWRldGFpbD0ibm9uZSJdIC5oaWdobGlnaHQgLmJvdW5kYXJ5IHtjdXJzb3I6YXV0bzt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmhpZ2hsaWdodCAubWFya2VyIHtwb2ludGVyLWV2ZW50czpub25lO3NoYXBlLXJlbmRlcmluZzpjcmlzcEVkZ2VzO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAuaGlnaGxpZ2h0IHBhdGgubWFya2VyIHtmaWxsOiMwMGExZjE7IHN0cm9rZTojMDBhMWYxOyBzdHJva2Utd2lkdGg6Mjt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmhpZ2hsaWdodCByZWN0Lm1hcmtlciB7ZmlsbDpyZ2JhKDAsMTYxLDI0MSwwLjEpOyBzdHJva2U6IzAwYTFmMTsgc3Ryb2tlLXdpZHRoOjE7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnLmxpbms6aG92ZXIgKiB7ZmlsbDpyZ2IoMjU1LDMxLDMxKTt9JysKICAgICAgICAgICAgJ2JvZHkubXV0ZV9wb3BvdmVyIC5wb3BvdmVyLnNycyB7ZGlzcGxheTpub25lICFpbXBvcnRhbnQ7fScrCiAgICAgICAgICAgICcnOwoKICAgICAgICAkKCdoZWFkJykuYXBwZW5kKCc8c3R5bGU+Jyt0aW1lbGluZV9jc3MrJzwvc3R5bGU+Jyk7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFBsYWNlIHRoZSB0aW1lbGluZSBvbiB0aGUgZGFzaGJvYXJkLCBvciBhZGp1c3QgaXRzIGxvY2F0aW9uIG9uIHRoZSBwYWdlLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBwbGFjZV90aW1lbGluZShmaXJzdF90aW1lKSB7CiAgICAgICAgdmFyIHRpbWVsaW5lID0gKGZpcnN0X3RpbWUgPyAkKHRpbWVsaW5lX2h0bWwpIDogJCgnI3RpbWVsaW5lJykpOwogICAgICAgICQoJy5wcm9ncmVzcy1hbmQtZm9yZWNhc3QnKS5iZWZvcmUodGltZWxpbmUpOwogICAgICAgIGlmIChmaXJzdF90aW1lKSB7CiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgVUkgZnJvbSBzZXR0aW5ncwogICAgICAgICAgICBncmFwaC5lbGVtID0gdGltZWxpbmUuZmluZCgnLmdyYXBoX3BhbmVsJyk7CiAgICAgICAgICAgIGdyYXBoLnhfYXhpcy53aWR0aCA9IGdyYXBoLmVsZW0ud2lkdGgoKSAtIGdyYXBoLm1hcmdpbi5sZWZ0OwogICAgICAgICAgICBncmFwaC55X2F4aXMuaGVpZ2h0ID0gc2V0dGluZ3MuZ3JhcGhfaGVpZ2h0IC0gKGdyYXBoLm1hcmdpbi50b3AgKyBncmFwaC5tYXJnaW4uYm90dG9tKTsKICAgICAgICAgICAgdXBkYXRlX21pbmltaXplKCk7CiAgICAgICAgICAgIGluaXRfdWkoKTsKCiAgICAgICAgICAgIC8vIEluc3RhbGwgZXZlbnQgaGFuZGxlcnMKICAgICAgICAgICAgdGltZWxpbmUuZmluZCgnLmxpbmsub3BlbiwgLmxpbmsubWluaW1pemUnKS5vbignY2xpY2snLCB0b2dnbGVfbWluaW1pemUpOwogICAgICAgICAgICB0aW1lbGluZS5maW5kKCcubGluay5yZWZyZXNoJykub24oJ2NsaWNrJywgZmV0Y2hfYW5kX3VwZGF0ZSk7CiAgICAgICAgICAgIHRpbWVsaW5lLmZpbmQoJy5saW5rLnNldHRpbmdzJykub24oJ2NsaWNrJywgb3Blbl9zZXR0aW5ncyk7CiAgICAgICAgICAgIHRpbWVsaW5lLmZpbmQoJy5iYXJfc3R5bGUgc2VsZWN0Jykub24oJ2NoYW5nZScsIGJhcl9zdHlsZV9jaGFuZ2VkKTsKICAgICAgICAgICAgdGltZWxpbmUuZmluZCgnLnJhbmdlX2lucHV0Jykub24oJ2lucHV0IGNoYW5nZScsIGRheXNfY2hhbmdlZCk7CiAgICAgICAgICAgIHRpbWVsaW5lLmZpbmQoJy5yZXZpZXdfaW5mbz4uaW5uZXInKS5vbignbW91c2VlbnRlcicsICcuaXRlbV9saXN0ID4gbGknLCBpdGVtX2hvdmVyKTsKICAgICAgICAgICAgdGltZWxpbmUuZmluZCgnLnJldmlld19pbmZvPi5pbm5lcicpLm9uKCdtb3VzZWxlYXZlJywgJy5pdGVtX2xpc3QnLCBpdGVtX2hvdmVyKTsKICAgICAgICAgICAgdGltZWxpbmUuZmluZCgnLnJldmlld19pbmZvPi5pbm5lcicpLm9uKCdjbGljaycsICcuZGV0YWlsX2J1dHRvbnMgYnV0dG9uJywgZGV0YWlsX2J1dHRvbl9jbGlja2VkKTsKICAgICAgICAgICAgdGltZWxpbmUuZmluZCgnLnJldmlld19pbmZvPi5pbm5lcicpLm9uKCdjbGljaycsIGZ1bmN0aW9uKCl7cmV0dXJuIGZhbHNlO30pOwogICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgd2luZG93X3Jlc2l6ZWQpOwogICAgICAgIH0KICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gVG9nZ2xlIHdoZXRoZXIgdGhlIHRpbWVsaW5lIGlzIG1pbmltaXplZC4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gdG9nZ2xlX21pbmltaXplKCkgewogICAgICAgIHNldHRpbmdzLm1pbmltaXplZCA9ICFzZXR0aW5ncy5taW5pbWl6ZWQ7CiAgICAgICAgdXBkYXRlX21pbmltaXplKCk7CiAgICAgICAgc2F2ZV9zZXR0aW5ncygpOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBIaWRlIG9yIHVuaGlkZSB0aGUgdGltZWxpbmUgd2hlbiB0aGUgdXNlciBtaW5pbWl6ZXMvcmVzdG9yZXMuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHVwZGF0ZV9taW5pbWl6ZSgpIHsKICAgICAgICB2YXIgdGltZWxpbmUgPSAkKCcjdGltZWxpbmUnKTsKICAgICAgICB2YXIgaXNfbWluID0gdGltZWxpbmUuaGFzQ2xhc3MoJ21pbicpOwogICAgICAgIGlmIChzZXR0aW5ncy5taW5pbWl6ZWQgJiYgIWlzX21pbikgewogICAgICAgICAgICB0aW1lbGluZS5hZGRDbGFzcygnbWluJyk7CiAgICAgICAgfSBlbHNlIGlmICghc2V0dGluZ3MubWluaW1pemVkICYmIGlzX21pbikgewogICAgICAgICAgICB0aW1lbGluZS5yZW1vdmVDbGFzcygnbWluJyk7CiAgICAgICAgfQogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBVcGRhdGUgdGhlIHRpbWVsaW5lIGFmdGVyIHRoZSB1c2VyIGNoYW5nZXMgdGhlIG51bWJlciBvZiBkYXlzIHRvIGRpc3BsYXkuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIGRheXNfY2hhbmdlZCgpIHsKICAgICAgICB2YXIgZGF5cyA9IE51bWJlcigkKCcjdGltZWxpbmUgLnJhbmdlX2lucHV0JykudmFsKCkpOwogICAgICAgIGlmIChkYXlzID09PSBzZXR0aW5ncy5kYXlzKSByZXR1cm47CiAgICAgICAgc2V0dGluZ3MuZGF5cyA9IGRheXM7CiAgICAgICAgdXBkYXRlX3NsaWRlcl9kYXlzKCk7CiAgICAgICAgYnVuZGxlX2J5X3RpbWVzbG90KCk7CiAgICAgICAgdXBkYXRlX3NsaWRlcl9yZXZpZXdzKCk7CiAgICAgICAgZHJhd190aW1lbGluZSgpOwogICAgICAgIHNhdmVfc2V0dGluZ3MoKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gSGFuZGxlciBmb3Igd2hlbiB1c2VyIGNoYW5nZXMgdGhlIEJhciBTdHlsZS4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gYmFyX3N0eWxlX2NoYW5nZWQoKSB7CiAgICAgICAgc2V0dGluZ3MuYmFyX3N0eWxlID0gJCgnI3RpbWVsaW5lIC5iYXJfc3R5bGUgc2VsZWN0IDpzZWxlY3RlZCcpLmF0dHIoJ25hbWUnKTsKICAgICAgICBkcmF3X3RpbWVsaW5lKCk7CiAgICAgICAgc2F2ZV9zZXR0aW5ncygpOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBIYW5kbGVyIGZvciB3aGVuIHVzZXIgY2xpY2tzICdTYXZlJyBpbiB0aGUgc2V0dGluZ3Mgd2luZG93LgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBzZXR0aW5nc19zYXZlZCgpIHsKICAgICAgICBzZXR0aW5ncyA9IHdrb2Yuc2V0dGluZ3MudGltZWxpbmU7CiAgICAgICAgcGxhY2VfdGltZWxpbmUoZmFsc2UgLyogZmlyc3RfdGltZSAqLyk7CiAgICAgICAgaW5pdF91aSgpOwogICAgICAgIGJ1bmRsZV9ieV90aW1lc2xvdCgpOwogICAgICAgIGRyYXdfdGltZWxpbmUoKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gSW5pdGlhbGl6ZSB0aGUgdXNlciBpbnRlcmZhY2UuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIGluaXRfdWkoKSB7CiAgICAgICAgaW5pdF9zbGlkZXIoKTsKICAgICAgICBpZiAoc2V0dGluZ3Muc2hvd19iYXJfc3R5bGVfZHJvcGRvd24pIHsKICAgICAgICAgICAgJCgnI3RpbWVsaW5lIC5iYXJfc3R5bGUnKS5yZW1vdmVDbGFzcygnaGlkZGVuJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJCgnI3RpbWVsaW5lIC5iYXJfc3R5bGUnKS5hZGRDbGFzcygnaGlkZGVuJyk7CiAgICAgICAgfQogICAgICAgICQoJyN0aW1lbGluZSAuYmFyX3N0eWxlIG9wdGlvbltuYW1lPSInK3NldHRpbmdzLmJhcl9zdHlsZSsnIl0nKS5wcm9wKCdzZWxlY3RlZCcsdHJ1ZSk7CiAgICAgICAgJCgnI3RpbWVsaW5lJykuYXR0cignZGF0YS1kZXRhaWwnLCBzZXR0aW5ncy5zaG93X3Jldmlld19kZXRhaWxzKTsKICAgICAgICAkKCcjdGltZWxpbmUgLnJldmlld19pbmZvJykuYXR0cignZGF0YS1tb2RlJywgc2V0dGluZ3MucmV2aWV3X2RldGFpbHNfc3VtbWFyeSk7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEluaXRpYWxpemUgdGhlIHNjYWxlIHNsaWRlci4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gaW5pdF9zbGlkZXIoKSB7CiAgICAgICAgdmFyIHJhbmdlID0gJCgnI3RpbWVsaW5lIC5yYW5nZV9pbnB1dCcpOwogICAgICAgIGlmIChzZXR0aW5ncy5kYXlzID4gc2V0dGluZ3MubWF4X2RheXMpIHsKICAgICAgICAgICAgc2V0dGluZ3MuZGF5cyA9IHNldHRpbmdzLm1heF9kYXlzOwogICAgICAgICAgICBzYXZlX3NldHRpbmdzKCk7CiAgICAgICAgfQogICAgICAgIHJhbmdlLmF0dHIoJ21heCcsIHNldHRpbmdzLm1heF9kYXlzKTsKICAgICAgICByYW5nZS5hdHRyKCd2YWx1ZScsIHNldHRpbmdzLmRheXMpOwogICAgICAgIHVwZGF0ZV9zbGlkZXJfZGF5cygpOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBVcGRhdGUgdGhlICdyZXZpZXdzJyB0ZXh0IG9mIHRoZSBzY2FsZSBzbGlkZXIuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHVwZGF0ZV9zbGlkZXJfcmV2aWV3cygpIHsKICAgICAgICB2YXIgcmV2aWV3X2NvdW50ID0gJCgnI3RpbWVsaW5lIC5yYW5nZV9yZXZpZXdzJyk7CiAgICAgICAgcmV2aWV3X2NvdW50LnRleHQoZ3JhcGgudG90YWxfcmV2aWV3cyk7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFVwZGF0ZSB0aGUgJ2RheXMnIHRleHQgb2YgdGhlIHNjYWxlIHNsaWRlci4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gdXBkYXRlX3NsaWRlcl9kYXlzKCkgewogICAgICAgIHZhciBkYXlzID0gc2V0dGluZ3MuZGF5czsKICAgICAgICB2YXIgcGVyaW9kID0gJCgnI3RpbWVsaW5lIC5yYW5nZV9kYXlzJyk7CiAgICAgICAgaWYgKGRheXMgPD0gMSkgewogICAgICAgICAgICBwZXJpb2QudGV4dCgoZGF5cyoyNCkrJyBob3VycycpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHBlcmlvZC50ZXh0KGRheXMudG9GaXhlZCgyKSsnIGRheXMnKTsKICAgICAgICB9CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFNhdmUgdGhlIHNjcmlwdCBzZXR0aW5ncyAoYWZ0ZXIgYSA1MDBtcyBkZWxheSkuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHZhciBzYXZlX2RlbGF5X3RpbWVyOwogICAgZnVuY3Rpb24gc2F2ZV9zZXR0aW5ncygpIHsKICAgICAgICBpZiAoc2F2ZV9kZWxheV90aW1lciAhPT0gdW5kZWZpbmVkKSBjbGVhclRpbWVvdXQoc2F2ZV9kZWxheV90aW1lcik7CiAgICAgICAgc2F2ZV9kZWxheV90aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgICAgICAgICAgd2tvZi5TZXR0aW5ncy5zYXZlKCd0aW1lbGluZScpOwogICAgICAgIH0sIDUwMCk7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEhhbmRsZXIgZm9yIHJlc2l6aW5nIHRoZSBwYW5lbCBieSBkcmFnZ2luZyB0aGUgYm90dG9tIG9mIHRoZSBncmFwaC4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiByZXNpemVfcGFuZWwoZSkgewogICAgICAgIGlmIChlLmJ1dHRvbiAhPT0gMCkgcmV0dXJuOwogICAgICAgIHZhciBwYW5lbCA9ICQoJyN0aW1lbGluZSA+IC5ncmFwaF9wYW5lbCcpOwogICAgICAgIHZhciBzdGFydF95ID0gZS5wYWdlWTsKICAgICAgICB2YXIgc3RhcnRfaGVpZ2h0ID0gc2V0dGluZ3MuZ3JhcGhfaGVpZ2h0OwogICAgICAgICQoJ2JvZHknKQogICAgICAgIC5hZGRDbGFzcygnbXV0ZV9wb3BvdmVyJykKICAgICAgICAub24oJ21vdXNlbW92ZS50aW1lbGluZV9yZXNpemUgdG91Y2htb3ZlLnRpbWVsaW5lX3Jlc2l6ZScsIGZ1bmN0aW9uKGUpewogICAgICAgICAgICB2YXIgaGVpZ2h0ID0gc3RhcnRfaGVpZ2h0ICsgKGUucGFnZVkgLSBzdGFydF95KTsKICAgICAgICAgICAgaWYgKGhlaWdodCA8IGdyYXBoLnlfYXhpcy5taW5faGVpZ2h0KSBoZWlnaHQgPSBncmFwaC55X2F4aXMubWluX2hlaWdodDsKICAgICAgICAgICAgaWYgKGhlaWdodCA+IGdyYXBoLnlfYXhpcy5tYXhfaGVpZ2h0KSBoZWlnaHQgPSBncmFwaC55X2F4aXMubWF4X2hlaWdodDsKICAgICAgICAgICAgc2V0dGluZ3MuZ3JhcGhfaGVpZ2h0ID0gaGVpZ2h0OwogICAgICAgICAgICBncmFwaC55X2F4aXMuaGVpZ2h0ID0gaGVpZ2h0IC0gKGdyYXBoLm1hcmdpbi50b3AgKyBncmFwaC5tYXJnaW4uYm90dG9tKTsKICAgICAgICAgICAgZHJhd190aW1lbGluZSgpOwogICAgICAgIH0pCiAgICAgICAgLm9uKCdtb3VzZXVwLnRpbWVsaW5lX3Jlc2l6ZSB0b3VjaGVuZC50aW1lbGluZV9yZXNpemUnLCBmdW5jdGlvbihlKXsKICAgICAgICAgICAgc2F2ZV9zZXR0aW5ncygpOwogICAgICAgICAgICAkKCdib2R5Jykub2ZmKCcudGltZWxpbmVfcmVzaXplJykucmVtb3ZlQ2xhc3MoJ211dGVfcG9wb3ZlcicpOwogICAgICAgIH0pOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBFdmVudCBoYW5kbGVyIGZvciBob3ZlcmluZyBvdmVyIHRoZSB0aW1lIHNjYWxlIGZvciBoaWdobGlnaHRpbmcuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgdmFyIGhpZ2hsaWdodCA9IHtzdGFydDowLCBlbmQ6MCwgZHJhZ2dpbmc6ZmFsc2UsIGhpZ2hsaWdodGVkOiBmYWxzZX07CiAgICBmdW5jdGlvbiBoaWdobGlnaHRfaG92ZXIoZSkgewogICAgICAgIGlmIChzZXR0aW5ncy5zaG93X3Jldmlld19kZXRhaWxzID09PSAnbm9uZScpIHJldHVybjsKICAgICAgICBpZiAoaGlnaGxpZ2h0LmRyYWdnaW5nKSByZXR1cm4gdHJ1ZTsKICAgICAgICB2YXIgYnVuZGxlX2lkeCA9IG5lYXJlc3RfYnVuZGxlKGUucGFnZVgpOwogICAgICAgIHZhciB4OwogICAgICAgIHN3aXRjaCAoZS50eXBlKSB7CiAgICAgICAgICAgIGNhc2UgJ21vdXNlZW50ZXInOgogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICdtb3VzZW1vdmUnOgogICAgICAgICAgICAgICAgaWYgKGhpZ2hsaWdodC5oaWdobGlnaHRlZCkgcmV0dXJuOwogICAgICAgICAgICAgICAgeCA9IGJ1bmRsZV90b194KGJ1bmRsZV9pZHgpOwogICAgICAgICAgICAgICAgJCgnI3RpbWVsaW5lIC5oaWdobGlnaHQgLm1hcmtlci5zdGFydCcpLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyt4KycsMCknKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSAnbW91c2VsZWF2ZSc6CiAgICAgICAgICAgICAgICBpZiAoaGlnaGxpZ2h0LmRyYWdnaW5nIHx8IGhpZ2hsaWdodC5oaWdobGlnaHRlZCkgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICBoaWRlX2hpZ2hsaWdodCgpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICd0b3VjaHN0YXJ0JzoKICAgICAgICAgICAgY2FzZSAnbW91c2Vkb3duJzoKICAgICAgICAgICAgICAgIGlmIChlLmJ1dHRvbiAhPT0gMCkgcmV0dXJuOwogICAgICAgICAgICAgICAgaGlnaGxpZ2h0LmhpZ2hsaWdodGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGhpZ2hsaWdodC5kcmFnZ2luZyA9IHRydWU7CiAgICAgICAgICAgICAgICBoaWdobGlnaHQuc3RhcnQgPSBidW5kbGVfaWR4OwogICAgICAgICAgICAgICAgeCA9IGJ1bmRsZV90b194KGJ1bmRsZV9pZHgpOwogICAgICAgICAgICAgICAgJCgnI3RpbWVsaW5lIC5oaWdobGlnaHQgLm1hcmtlci5zdGFydCcpLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyt4KycsMCknKTsKICAgICAgICAgICAgICAgICQoJyN0aW1lbGluZSAuaGlnaGxpZ2h0IC5tYXJrZXIuZW5kJykuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgtMTAwLDApJyk7CiAgICAgICAgICAgICAgICAkKCcjdGltZWxpbmUgLmhpZ2hsaWdodCByZWN0Lm1hcmtlcicpLmF0dHIoJ3dpZHRoJywwKS5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcreCsnLDApJyk7CiAgICAgICAgICAgICAgICAkKCdib2R5Jykub24oJ21vdXNlbW92ZS50aW1lbGluZV9oaWdobGlnaHQnLCBoaWdobGlnaHRfZHJhZyk7CiAgICAgICAgICAgICAgICAkKCdib2R5Jykub24oJ3RvdWNoZW5kLnRpbWVsaW5lX2hpZ2hsaWdodCBtb3VzZXVwLnRpbWVsaW5lX2hpZ2hsaWdodCcsIGhpZ2hsaWdodF9yZWxlYXNlKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gRXZlbiBoYW5kbGVyIGZvciBkcmFnZ2luZyB3aGVuIGhpZ2hsaWdodGluZyBhIHRpbWUgcmFuZ2UuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gaGlnaGxpZ2h0X2RyYWcoZSkgewogICAgICAgIHZhciBidW5kbGVfaWR4ID0gbmVhcmVzdF9idW5kbGUoZS5wYWdlWCk7CiAgICAgICAgaGlnaGxpZ2h0LmVuZCA9IGJ1bmRsZV9pZHg7CiAgICAgICAgdmFyIHgxID0gYnVuZGxlX3RvX3goaGlnaGxpZ2h0LnN0YXJ0KTsKICAgICAgICB2YXIgeDIgPSBidW5kbGVfdG9feChoaWdobGlnaHQuZW5kKTsKICAgICAgICAkKCcjdGltZWxpbmUgLmhpZ2hsaWdodCAubWFya2VyLmVuZCcpLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyt4MisnLDApJyk7CiAgICAgICAgJCgnI3RpbWVsaW5lIC5oaWdobGlnaHQgcmVjdC5tYXJrZXInKS5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcrTWF0aC5taW4oeDEseDIpKycuNSwwLjUpJykuYXR0cignd2lkdGgnLE1hdGguYWJzKHgyLXgxKSk7CiAgICAgICAgc2hvd19yZXZpZXdfaW5mbyhmYWxzZSAvKiBzdGlja3kgKi8pOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBFdmVudCBoYW5kbGVyIGZvciB0aGUgZW5kIG9mIGEgJ2RyYWcnIHdoZW4gaGlnaGxpZ2h0aW5nIGEgdGltZSByYW5nZS4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBoaWdobGlnaHRfcmVsZWFzZShlKSB7CiAgICAgICAgaWYgKGUuYnV0dG9uICE9PSAwKSByZXR1cm47CiAgICAgICAgaGlnaGxpZ2h0LmRyYWdnaW5nID0gZmFsc2U7CiAgICAgICAgJCgnYm9keScpLm9mZignLnRpbWVsaW5lX2hpZ2hsaWdodCcpOwogICAgICAgIHZhciBidW5kbGVfaWR4ID0gbmVhcmVzdF9idW5kbGUoZS5wYWdlWCk7CiAgICAgICAgaGlnaGxpZ2h0LmVuZCA9IGJ1bmRsZV9pZHg7CiAgICAgICAgaWYgKGhpZ2hsaWdodC5zdGFydCA9PT0gaGlnaGxpZ2h0LmVuZCkgewogICAgICAgICAgICBoaWRlX2hpZ2hsaWdodCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhciB4MSA9IGJ1bmRsZV90b194KE1hdGgubWluKGhpZ2hsaWdodC5zdGFydCwgaGlnaGxpZ2h0LmVuZCkpOwogICAgICAgICAgICB2YXIgeDIgPSBidW5kbGVfdG9feChNYXRoLm1heChoaWdobGlnaHQuc3RhcnQsIGhpZ2hsaWdodC5lbmQpKTsKICAgICAgICAgICAgJCgnI3RpbWVsaW5lIC5oaWdobGlnaHQgLm1hcmtlci5zdGFydCcpLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyt4MSsnLDApJyk7CiAgICAgICAgICAgICQoJyN0aW1lbGluZSAuaGlnaGxpZ2h0IC5tYXJrZXIuZW5kJykuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnK3gyKycsMCknKTsKICAgICAgICAgICAgJCgnI3RpbWVsaW5lIC5oaWdobGlnaHQgcmVjdC5tYXJrZXInKS5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcreDErJy41LDAuNSknKS5hdHRyKCd3aWR0aCcseDIteDEpOwogICAgICAgICAgICBoaWdobGlnaHQuaGlnaGxpZ2h0ZWQgPSB0cnVlOwogICAgICAgICAgICBzaG93X3Jldmlld19pbmZvKHRydWUgLyogc3RpY2t5ICovKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBIaWRlIHRoZSB0aW1lbGluZSdzIGhpZ2hsaWdodCBjdXJzb3JzLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIGhpZGVfaGlnaGxpZ2h0KCkgewogICAgICAgIGhpZ2hsaWdodC5zdGFydCA9IC0xOwogICAgICAgIGhpZ2hsaWdodC5lbmQgPSAtMTsKICAgICAgICBoaWdobGlnaHQuaGlnaGxpZ2h0ZWQgPSBmYWxzZTsKICAgICAgICAkKCcjdGltZWxpbmUgLmhpZ2hsaWdodCByZWN0Lm1hcmtlcicpLmF0dHIoJ3dpZHRoJywwKS5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKC0xMDAsMC41KScpOwogICAgICAgICQoJyN0aW1lbGluZSAuaGlnaGxpZ2h0IC5tYXJrZXIuc3RhcnQnKS5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKC0xMDAsMCknKTsKICAgICAgICAkKCcjdGltZWxpbmUgLmhpZ2hsaWdodCAubWFya2VyLmVuZCcpLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoLTEwMCwwKScpOwogICAgICAgIGhpZGVfcmV2aWV3X2luZm8oKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gbmVhcmVzdF9idW5kbGUoKQogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIG5lYXJlc3RfYnVuZGxlKHgpIHsKICAgICAgICB2YXIgcGFuZWxfbGVmdCA9IE1hdGguZmxvb3IoJCgnI3RpbWVsaW5lIC5ncmFwaF9wYW5lbCcpLm9mZnNldCgpLmxlZnQpOwogICAgICAgIHggLT0gcGFuZWxfbGVmdCArIGdyYXBoLm1hcmdpbi5sZWZ0OwogICAgICAgIGlmICh4IDwgMCkgeCA9IDA7CiAgICAgICAgdmFyIHRpYyA9IHggKiBncmFwaC54X2F4aXMubWF4X2hvdXJzIC8gZ3JhcGgueF9heGlzLndpZHRoOwogICAgICAgIHZhciBidW5kbGVfaWR4ID0gZ3JhcGgudGltZXNsb3RzW01hdGgubWluKGdyYXBoLnhfYXhpcy5tYXhfaG91cnMtMSwgTWF0aC5mbG9vcih0aWMpKV07CiAgICAgICAgdmFyIGJ1bmRsZSA9IGdyYXBoLmJ1bmRsZXNbYnVuZGxlX2lkeF07CiAgICAgICAgdmFyIHN0YXJ0ID0gYnVuZGxlLnN0YXJ0X3RpbWU7CiAgICAgICAgdmFyIGVuZCA9IGJ1bmRsZS5lbmRfdGltZTsKICAgICAgICByZXR1cm4gKHRpYyA8PSAoKHN0YXJ0K2VuZCkvMikgPyBidW5kbGVfaWR4IDogYnVuZGxlX2lkeCsxKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gQ29udmVydCBhIGJ1bmRsZV9pZHggdG8gYSBncmFwaCBob3VyIG9mZnNldC4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBidW5kbGVfdG9fdGljKGJ1bmRsZV9pZHgpIHsKICAgICAgICBpZiAoYnVuZGxlX2lkeCA+PSBncmFwaC5idW5kbGVzLmxlbmd0aCkgcmV0dXJuIGdyYXBoLnhfYXhpcy5tYXhfaG91cnM7CiAgICAgICAgcmV0dXJuIGdyYXBoLmJ1bmRsZXNbYnVuZGxlX2lkeF0uc3RhcnRfdGltZTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gQ29udmVydCBhIGJ1bmRsZV9pZHggdG8gYSBncmFwaCBYIG9mZnNldC4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBidW5kbGVfdG9feChidW5kbGVfaWR4KSB7CiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoYnVuZGxlX3RvX3RpYyhidW5kbGVfaWR4KSAqIGdyYXBoLnRpY19zcGFjaW5nKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gT3BlbiB0aGUgc2V0dGluZ3MgZGlhbG9nCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIG9wZW5fc2V0dGluZ3MoKSB7CiAgICAgICAgdmFyIGNvbmZpZyA9IHsKICAgICAgICAgICAgc2NyaXB0X2lkOiAndGltZWxpbmUnLAogICAgICAgICAgICB0aXRsZTogJ1VsdGltYXRlIFRpbWVsaW5lJywKICAgICAgICAgICAgb25fc2F2ZTogc2V0dGluZ3Nfc2F2ZWQsCiAgICAgICAgICAgIGNvbnRlbnQ6IHsKICAgICAgICAgICAgICAgIHRhYnM6IHt0eXBlOid0YWJzZXQnLCBjb250ZW50OiB7CiAgICAgICAgICAgICAgICAgICAgcGdHcmFwaDoge3R5cGU6J3BhZ2UnLCBsYWJlbDonR3JhcGgnLCBob3Zlcl90aXA6J0dyYXBoIFNldHRpbmdzJywgY29udGVudDogewogICAgICAgICAgICAgICAgICAgICAgICBncnBUaW1lOiB7dHlwZTonZ3JvdXAnLCBsYWJlbDonVGltZScsIGNvbnRlbnQ6ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZV9mb3JtYXQ6IHt0eXBlOidkcm9wZG93bicsIGxhYmVsOidUaW1lIEZvcm1hdCcsIGRlZmF1bHQ6JzEyaG91cicsIGNvbnRlbnQ6eycxMmhvdXInOicxMi1ob3VyJywnMjRob3VyJzonMjQtaG91cicsICdob3Vyc19vbmx5JzogJ0hvdXJzIG9ubHknfSwgaG92ZXJfdGlwOidEaXNwbGF5IHRpbWUgaW4gMTIgb3IgMjQtaG91ciBmb3JtYXQsIG9yIGhvdXJzLWZyb20tbm93Lid9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2RheXM6IHt0eXBlOidudW1iZXInLCBsYWJlbDonU2xpZGVyIFJhbmdlIE1heCAoZGF5cyknLCBtaW46MSwgbWF4OjEyNSwgZGVmYXVsdDo3LCBob3Zlcl90aXA6J0Nob29zZSBtYXhpbXVtIHJhbmdlIG9mIHRoZSB0aW1lbGluZSBzbGlkZXIgKGluIGRheXMpLid9LAogICAgICAgICAgICAgICAgICAgICAgICB9fSwKICAgICAgICAgICAgICAgICAgICAgICAgZ3JwQmFyczoge3R5cGU6J2dyb3VwJywgbGFiZWw6J0JhcnMnLCBjb250ZW50OnsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9iYXJfd2lkdGg6IHt0eXBlOidudW1iZXInLCBsYWJlbDonTWF4IEJhciBXaWR0aCAocGl4ZWxzKScsIGRlZmF1bHQ6MCwgaG92ZXJfdGlwOidTZXQgdGhlIG1heGltdW0gYmFyIHdpZHRoIChpbiBwaXhlbHMpLlxuKDAgPSB1bmxpbWl0ZWQpJ30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfYmFyX2hlaWdodDoge3R5cGU6J251bWJlcicsIGxhYmVsOidNYXggR3JhcGggSGVpZ2h0IChyZXZpZXdzKScsIGRlZmF1bHQ6MCwgaG92ZXJfdGlwOidTZXQgdGhlIG1heGltdW0gZ3JhcGggaGVpZ2h0IChpbiByZXZpZXdzKS5cbigwID0gdW5saW1pdGVkKVxuVXNlZnVsIGZvciB3aGVuIHlvdSBoYXZlIGEgaHVnZSBiYWNrbG9nLid9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfYmFyX2hlaWdodDoge3R5cGU6J2NoZWNrYm94JywgbGFiZWw6J0ZvcmNlIEdyYXBoIHRvIE1heCBIZWlnaHQnLCBkZWZhdWx0OmZhbHNlLCBob3Zlcl90aXA6J0ZvcmNlIHRoZSBncmFwaCBoZWlnaHQgdG8gYWx3YXlzIGJlIHRoZSBNYXggR3JhcGggSGVpZ2h0LlxuVXNlZnVsIHdoZW4gbGltaXRpbmcgdGhlIG51bWJlciBvZiByZXZpZXdzIHlvdSBkbyBpbiBvbmUgc2l0dGluZy4nfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhcl9zdHlsZToge3R5cGU6J2Ryb3Bkb3duJywgbGFiZWw6J0JhciBTdHlsZScsIGRlZmF1bHQ6J2l0ZW1fdHlwZScsIGNvbnRlbnQ6eydjb3VudCc6J1JldmlldyBDb3VudCcsJ2l0ZW1fdHlwZSc6J0l0ZW0gVHlwZScsJ3Nyc19zdGFnZSc6J1NSUyBMZXZlbCcsJ2xldmVsJzonTGV2ZWwnfSwgaG92ZXJfdGlwOidDaG9vc2UgaG93IGJhcnMgYXJlIHN1YmRpdmlkZWQuJ30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcnNfY3Vycl9uZXh0OiB7dHlwZTonZHJvcGRvd24nLCBsYWJlbDonQ3VycmVudCAvIE5leHQgU1JTIExldmVsJywgZGVmYXVsdDonY3VycicsIGNvbnRlbnQ6eydjdXJyJzonQ3VycmVudCBTUlMgTGV2ZWwnLCduZXh0JzonTmV4dCBTUlMgTGV2ZWwnfSwgaG92ZXJfdGlwOidTZWxlY3Qgd2hldGhlciBTUlMgaXMgY29sb3ItY29kZWQgYnlcbmN1cnJlbnQgU1JTIGxldmVsLCBvciBuZXh0IFNSUyBsZXZlbC4nfSwKICAgICAgICAgICAgICAgICAgICAgICAgfX0sCiAgICAgICAgICAgICAgICAgICAgICAgIGdycE1hcmtlcnM6IHt0eXBlOidncm91cCcsIGxhYmVsOidNYXJrZXJzJywgY29udGVudDp7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2xldmVsX21hcmtlcnM6IHt0eXBlOidkcm9wZG93bicsIGxhYmVsOidDdXJyZW50IExldmVsIE1hcmtlcnMnLCBkZWZhdWx0Oidya3YnLCBjb250ZW50Onsnbm9uZSc6J05vbmUnLCdyayc6J1JhZCArIEthbicsJ3Jrdic6J1JhZCArIEthbiArIFZvYyd9LCBob3Zlcl90aXA6J1NlbGVjdCB3aGljaCBpdGVtIHR5cGVzIHdpbGwgdHJpZ2dlciBhIEN1cnJlbnQgTGV2ZWxcbm1hcmtlciBhdCB0aGUgYm90dG9tIG9mIHRoZSBncmFwaC4nfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1cm5fbWFya2Vyczoge3R5cGU6J2Ryb3Bkb3duJywgbGFiZWw6J0J1cm4gTWFya2VycycsIGRlZmF1bHQ6J3Nob3cnLCBjb250ZW50Onsnc2hvdyc6J1Nob3cnLCdoaWRlJzonSGlkZSd9LCBob3Zlcl90aXA6J1NlbGVjdCB3aGV0aGVyIEJ1cm4gbWFya2VycyBhcmUgc2hvd25cbmF0IHRoZSBib3R0b20gb2YgdGhlIGdyYXBoLid9LAogICAgICAgICAgICAgICAgICAgICAgICB9fSwKICAgICAgICAgICAgICAgICAgICB9fSwKICAgICAgICAgICAgICAgICAgICBwZ1Jldmlld0RldGFpbHM6IHt0eXBlOidwYWdlJywgbGFiZWw6J1JldmlldyBEZXRhaWxzJywgaG92ZXJfdGlwOidSZXZpZXcgRGV0YWlscyBQb3AtdXAnLCBjb250ZW50OiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfcmV2aWV3X2RldGFpbHM6IHt0eXBlOidkcm9wZG93bicsIGxhYmVsOidTaG93IFJldmlldyBEZXRhaWxzJywgZGVmYXVsdDonZnVsbCcsIGNvbnRlbnQ6eydub25lJzonTm9uZScsJ3N1bW1hcnknOidTdW1tYXJ5JywnaXRlbV9saXN0JzonSXRlbSBMaXN0JywnZnVsbCc6J0Z1bGwgSXRlbSBEZXRhaWxzJ30sIGhvdmVyX3RpcDonQ2hvb3NlIHRoZSBsZXZlbCBvZiBkZXRhaWwgdG8gZGlzcGxheVxud2hlbiBhIGJhciBvciB0aW1lIHJhbmdlIGlzIHNlbGVjdGVkLid9LAogICAgICAgICAgICAgICAgICAgICAgICByZXZpZXdfZGV0YWlsc19zdW1tYXJ5OiB7dHlwZTonZHJvcGRvd24nLCBsYWJlbDonUmV2aWV3IERldGFpbHMgU3VtbWFyeScsIGRlZmF1bHQ6J2l0ZW1fdHlwZScsIGNvbnRlbnQ6eydjb3VudCc6J1JldmlldyBDb3VudCcsJ2l0ZW1fdHlwZSc6J0l0ZW0gVHlwZScsJ3Nyc19zdGFnZSc6J1NSUyBMZXZlbCcsJ2xldmVsJzonTGV2ZWwnfSwgaG92ZXJfdGlwOidDaG9vc2Ugd2hpY2ggc3VtbWFyeSBpbmZvcm1hdGlvbiB0b1xuZGlzcGxheSBvbiB0aGUgUmV2aWV3IERldGFpbHMgcG9wLXVwLid9LAogICAgICAgICAgICAgICAgICAgICAgICByZXZpZXdfZGV0YWlsc19idXR0b25zOiB7dHlwZTonY2hlY2tib3gnLCBsYWJlbDonU2hvdyBSZXZpZXcgRGV0YWlscyBCdXR0b25zJywgZGVmYXVsdDp0cnVlLCBob3Zlcl90aXA6J1Nob3cgY29uZmlndXJhdGlvbiBidXR0b25zIG9uIFJldmlldyBEZXRhaWxzIHBvcC11cC4nfSwKICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19iYXJfc3R5bGVfZHJvcGRvd246IHt0eXBlOidjaGVja2JveCcsIGxhYmVsOidTaG93IEJhciBTdHlsZSBEcm9wZG93bicsIGRlZmF1bHQ6ZmFsc2UsIGhvdmVyX3RpcDonU2hvdyB0aGUgQmFyIFN0eWxlIGRyb3Bkb3duIGFib3ZlIHRoZSB0aW1lbGluZS4nfSwKICAgICAgICAgICAgICAgICAgICB9fSwKICAgICAgICAgICAgICAgIH19LAogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICB2YXIgc2V0dGluZ3NfZGlhbG9nID0gbmV3IHdrb2YuU2V0dGluZ3MoY29uZmlnKTsKICAgICAgICBzZXR0aW5nc19kaWFsb2cub3BlbigpOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBHZXQgdGhlIG51bWJlciBvZiBob3VycyBwZXIgYmFyLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBnZXRfaG91cnNfcGVyX2JhcigpIHsKICAgICAgICBncmFwaC54X2F4aXMud2lkdGggPSBncmFwaC5lbGVtLndpZHRoKCkgLSBncmFwaC5tYXJnaW4ubGVmdDsKICAgICAgICBncmFwaC54X2F4aXMubWF4X2hvdXJzID0gTWF0aC5yb3VuZChzZXR0aW5ncy5kYXlzICogMjQpOwoKICAgICAgICAvLyBObyBtb3JlIHRoYW4gMSBsYWJlbCBldmVyeSA1MCBwaXhlbHMKICAgICAgICB2YXIgbWluX3BpeGVsc19wZXJfbGFiZWwgPSA1MDsKICAgICAgICBncmFwaC5taW5faG91cnNfcGVyX2xhYmVsID0gbWluX3BpeGVsc19wZXJfbGFiZWwgKiBncmFwaC54X2F4aXMubWF4X2hvdXJzIC8gZ3JhcGgueF9heGlzLndpZHRoOwogICAgICAgIHhzY2FsZS5pZHggPSAwOwogICAgICAgIHdoaWxlICgoeHNjYWxlLmhvdXJzX3Blcl9sYWJlbFt4c2NhbGUuaWR4XSA8PSBncmFwaC5taW5faG91cnNfcGVyX2xhYmVsKSAmJgogICAgICAgICAgICAgICAoeHNjYWxlLmlkeCA8IHhzY2FsZS5ob3Vyc19wZXJfbGFiZWwubGVuZ3RoLTEpKSB7CiAgICAgICAgICAgIHhzY2FsZS5pZHgrKzsKICAgICAgICB9CgogICAgICAgIHJldHVybiB4c2NhbGUuYnVuZGxlX2Nob2ljZXNbeHNjYWxlLmlkeF07CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIE1hcCBsZXR0ZXJzIGluIHRoZSB4c2NhbGUgY2hhcnQgdG8gY29ycmVzcG9uZGluZyBsYWJlbC1nZW5lcmF0aW5nIGZ1bmN0aW9ucy4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgdmFyIGxhYmVsX2Z1bmN0aW9ucyA9IHsKICAgICAgICAnbSc6IG1vbnRoX2xhYmVsLAogICAgICAgICd3Jzogd2Vla19sYWJlbCwKICAgICAgICAnRCc6IG1kYXlfbGFiZWwsCiAgICAgICAgJ2QnOiBkYXlfbGFiZWwsCiAgICAgICAgJ2gnOiBob3VyX2xhYmVsLAogICAgICAgICctJzogbm9fbGFiZWwsCiAgICB9OwoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBGdW5jdGlvbnMgZm9yIGdlbmVyYXRpbmcgdGltZS1zY2FsZSBsYWJlbHMKICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gbW9udGhfbGFiZWwoZGF0ZSwgcXR5LCB1c2Vfc2hvcnQpIHsKICAgICAgICBpZiAoZGF0ZS5nZXRIb3VycygpICE9PSAwIHx8IGRhdGUuZ2V0RGF0ZSgpICE9PSAxKSByZXR1cm47CiAgICAgICAgcmV0dXJuIFsnSmFuJywnRmViJywnTWFyJywnQXByJywnTWF5JywnSnVuJywnSnVsJywnQXVnJywnU2VwJywnT2N0JywnTm92JywnRGVjJ11bZGF0ZS5nZXRNb250aCgpXTsKICAgIH0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gd2Vla19sYWJlbChkYXRlLCBxdHksIHVzZV9zaG9ydCkgewogICAgICAgIGlmIChkYXRlLmdldEhvdXJzKCkgIT09IDAgfHwgZGF0ZS5nZXREYXkoKSAhPT0gMCkgcmV0dXJuOwogICAgICAgIHJldHVybiAodXNlX3Nob3J0ID8gJ1MnIDogJ1N1bicpOwogICAgfQogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBtZGF5X2xhYmVsKGRhdGUsIHF0eSwgdXNlX3Nob3J0KSB7CiAgICAgICAgaWYgKGRhdGUuZ2V0SG91cnMoKSAhPT0gMCkgcmV0dXJuOwogICAgICAgIHZhciBtZGF5ID0gZGF0ZS5nZXREYXRlKCk7CiAgICAgICAgaWYgKG1kYXkgJSBxdHkgIT09IDApIHJldHVybjsKICAgICAgICByZXR1cm4gbWRheTsKICAgIH0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gZGF5X2xhYmVsKGRhdGUsIHF0eSwgdXNlX3Nob3J0KSB7CiAgICAgICAgaWYgKGRhdGUuZ2V0SG91cnMoKSAhPT0gMCkgcmV0dXJuOwogICAgICAgIHZhciBsYWJlbCA9IFsnU3VuJywnTW9uJywnVHVlJywnV2VkJywnVGh1JywnRnJpJywnU2F0J11bZGF0ZS5nZXREYXkoKV07CiAgICAgICAgcmV0dXJuICh1c2Vfc2hvcnQgPyBsYWJlbFswXSA6IGxhYmVsKTsKICAgIH0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gaG91cl9sYWJlbChkYXRlLCBxdHksIHVzZV9zaG9ydCkgewogICAgICAgIHZhciBoaCA9IGRhdGUuZ2V0SG91cnMoKTsKICAgICAgICBpZiAoKGhoICUgcXR5KSAhPT0gMCkgcmV0dXJuOwogICAgICAgIGlmIChzZXR0aW5ncy50aW1lX2Zvcm1hdCA9PT0gJzI0aG91cicpIHsKICAgICAgICAgICAgcmV0dXJuICgnMCcraGgrJzowMCcpLnNsaWNlKC01KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gKCgoaGggKyAxMSkgJSAxMikgKyAxKSArICdhcCdbTWF0aC5mbG9vcihoaC8xMildICsgJ20nOwogICAgICAgIH0KICAgIH0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gaG91cl9vbmx5X2xhYmVsKGRhdGUsIHF0eSwgdXNlX3Nob3J0LCB0aWNfaWR4KSB7CiAgICAgICAgaWYgKHRpY19pZHggJSBxdHkgIT09IDApIHJldHVybjsKICAgICAgICByZXR1cm4gdGljX2lkeCArICh1c2Vfc2hvcnQgPyAnaCcgOiAnIGhycycpOwogICAgfQoKICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gbm9fbGFiZWwoKSB7cmV0dXJuO30KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBEcmF3IHRoZSB0aW1lbGluZQogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBkcmF3X3RpbWVsaW5lKCkgewogICAgICAgIHZhciBwYW5lbCA9IGdyYXBoLmVsZW0sCiAgICAgICAgICAgIHBhbmVsX2hlaWdodCA9IHNldHRpbmdzLmdyYXBoX2hlaWdodCwKICAgICAgICAgICAgcGFuZWxfd2lkdGggPSBncmFwaC5lbGVtLndpZHRoKCksCiAgICAgICAgICAgIGdyYXBoX2hlaWdodCA9IHBhbmVsX2hlaWdodCAtIChncmFwaC5tYXJnaW4udG9wICsgZ3JhcGgubWFyZ2luLmJvdHRvbSk7CgogICAgICAgIHZhciBtYXRjaCA9IHhzY2FsZS5yZWRfdGljX2Nob2ljZXNbeHNjYWxlLmlkeF0ubWF0Y2goL14oXGQqKSguKShzPykkLyk7CiAgICAgICAgdmFyIHJlZF9xdHkgPSBOdW1iZXIobWF0Y2hbMV0pOwogICAgICAgIHZhciByZWRfZnVuYyA9IGxhYmVsX2Z1bmN0aW9uc1ttYXRjaFsyXV07CiAgICAgICAgdmFyIHJlZF91c2Vfc2hvcnQgPSAobWF0Y2hbM10gPT09ICdzJyk7CgogICAgICAgIG1hdGNoID0geHNjYWxlLm1ham9yX3RpY19jaG9pY2VzW3hzY2FsZS5pZHhdLm1hdGNoKC9eKFxkKikoLikocz8pJC8pOwogICAgICAgIHZhciBtYWpfcXR5ID0gTnVtYmVyKG1hdGNoWzFdKTsKICAgICAgICB2YXIgbWFqX2Z1bmMgPSBsYWJlbF9mdW5jdGlvbnNbbWF0Y2hbMl1dOwogICAgICAgIHZhciBtYWpfdXNlX3Nob3J0ID0gKG1hdGNoWzNdID09PSAncycpOwoKICAgICAgICBtYXRjaCA9IHhzY2FsZS5taW5vcl90aWNfY2hvaWNlc1t4c2NhbGUuaWR4XS5tYXRjaCgvXihcZCopKC4pKHM/KSQvKTsKICAgICAgICB2YXIgbWluX3F0eSA9IE51bWJlcihtYXRjaFsxXSk7CiAgICAgICAgdmFyIG1pbl9mdW5jID0gbGFiZWxfZnVuY3Rpb25zW21hdGNoWzJdXTsKICAgICAgICB2YXIgbWluX3VzZV9zaG9ydCA9IChtYXRjaFszXSA9PT0gJ3MnKTsKCiAgICAgICAgaWYgKHNldHRpbmdzLnRpbWVfZm9ybWF0ID09PSAnaG91cnNfb25seScpIHsKICAgICAgICAgICAgcmVkX2Z1bmMgPSBmdW5jdGlvbigpIHtyZXR1cm4gMDt9OwogICAgICAgICAgICBtYWpfZnVuYyA9IGhvdXJfb25seV9sYWJlbDsKICAgICAgICAgICAgbWluX2Z1bmMgPSBob3VyX29ubHlfbGFiZWw7CiAgICAgICAgfQoKICAgICAgICB2YXIgYnVuZGxlX3NpemUgPSB4c2NhbGUuYnVuZGxlX2Nob2ljZXNbeHNjYWxlLmlkeF07CgogICAgICAgIC8vIFN0cmluZyBmb3IgYnVpbGRpbmcgaHRtbC4KICAgICAgICB2YXIgZ3JpZCA9ICcnOwogICAgICAgIHZhciBsYWJlbF94ID0gW107CiAgICAgICAgdmFyIGxhYmVsX3kgPSAnJzsKICAgICAgICB2YXIgYmFycyA9ICcnLCBiYXJfb3ZlcmxheXMgPSAnJzsKICAgICAgICB2YXIgbWFya2VycyA9ICcnOwoKICAgICAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgIC8vIERyYXcgdmVydGljYWwgYXhpcyBncmlkCgogICAgICAgIC8vIENhbGN1bGF0ZSBtYWpvciBhbmQgbWlub3IgdmVydGljYWwgZ3JhcGggdGljcy4KICAgICAgICB2YXIgaW5jX3MgPSAxLCBpbmNfbCA9IDU7CiAgICAgICAgdmFyIG1heF9yZXZpZXdzID0gZ3JhcGgubWF4X3Jldmlld3M7CiAgICAgICAgaWYgKHNldHRpbmdzLm1heF9iYXJfaGVpZ2h0ID4gMCkgewogICAgICAgICAgICBpZiAoc2V0dGluZ3MuZml4ZWRfYmFyX2hlaWdodCB8fCAobWF4X3Jldmlld3MgPiBzZXR0aW5ncy5tYXhfYmFyX2hlaWdodCkpIG1heF9yZXZpZXdzID0gc2V0dGluZ3MubWF4X2Jhcl9oZWlnaHQ7CiAgICAgICAgfQogICAgICAgIHdoaWxlIChNYXRoLmNlaWwobWF4X3Jldmlld3MgLyBpbmNfcykgPiA1KSB7CiAgICAgICAgICAgIHN3aXRjaCAoaW5jX3MudG9TdHJpbmcoKVswXSkgewogICAgICAgICAgICAgICAgY2FzZSAnMSc6IGluY19zICo9IDI7IGluY19sICo9IDI7IGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnMic6IGluY19zID0gTWF0aC5yb3VuZCgyLjUgKiBpbmNfcyk7IGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnNSc6IGluY19zICo9IDI7IGluY19sICo9IDU7IGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBEcmF3IHZlcnRpY2FsIGdyYXBoIHRpY3MgKCMgb2YgUmV2aWV3cykuCiAgICAgICAgdmFyIHRpY19jbGFzcywgeTsKICAgICAgICBncmFwaC55X2F4aXMubWF4X3Jldmlld3MgPSBNYXRoLm1heCgzLCBNYXRoLmNlaWwobWF4X3Jldmlld3MgLyBpbmNfcykgKiBpbmNfcyk7CiAgICAgICAgZm9yICh2YXIgdGljID0gMDsgdGljIDw9IGdyYXBoLnlfYXhpcy5tYXhfcmV2aWV3czsgdGljICs9IGluY19zKSB7CiAgICAgICAgICAgIHRpY19jbGFzcyA9ICgodGljICUgaW5jX2wpID09PSAwID8gJ21ham9yJyA6ICdtaW5vcicpOwogICAgICAgICAgICB5ID0gKGdyYXBoLm1hcmdpbi50b3AgKyBncmFwaF9oZWlnaHQpIC0gTWF0aC5yb3VuZChncmFwaF9oZWlnaHQgKiAodGljIC8gZ3JhcGgueV9heGlzLm1heF9yZXZpZXdzKSk7CiAgICAgICAgICAgIGlmICh0aWMgPiAwKSB7CiAgICAgICAgICAgICAgICBncmlkICs9ICc8cGF0aCBjbGFzcz0iJyt0aWNfY2xhc3MrJyIgZD0iTScrZ3JhcGgubWFyZ2luLmxlZnQrJywnK3krJ2gnK2dyYXBoLnhfYXhpcy53aWR0aCsnIiAvPic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGFiZWxfeSArPSAnPHRleHQgY2xhc3M9IicrdGljX2NsYXNzKyciIHg9IicrKGdyYXBoLm1hcmdpbi5sZWZ0LTQpKyciIHk9IicreSsnIiBkeT0iMC40ZW0iPicrdGljKyc8L3RleHQ+JzsKICAgICAgICB9CgogICAgICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgLy8gRHJhdyBob3Jpem9udGFsIGF4aXMgZ3JpZAoKICAgICAgICBncmFwaC50aWNfc3BhY2luZyA9IChncmFwaC54X2F4aXMud2lkdGgpIC8gKGdyYXBoLnhfYXhpcy5tYXhfaG91cnMpOyAvLyBXaWR0aCBvZiBhIHRpbWUgc2xvdC4KICAgICAgICB2YXIgcHJldl9sYWJlbCA9IC05ZTEwOwogICAgICAgIGZvciAodmFyIHRpY19pZHggPSAwOyB0aWNfaWR4IDwgZ3JhcGgueF9heGlzLm1heF9ob3VyczsgdGljX2lkeCsrKSB7CiAgICAgICAgICAgIHZhciB0aW1lID0gbmV3IERhdGUoZ3JhcGguc3RhcnRfdGltZS5nZXRUaW1lKCkgKyB0aWNfaWR4ICogMzYwMDAwMCk7CgogICAgICAgICAgICB2YXIgcmVkX2xhYmVsID0gcmVkX2Z1bmModGltZSwgcmVkX3F0eSwgcmVkX3VzZV9zaG9ydCwgdGljX2lkeCk7CiAgICAgICAgICAgIHZhciBtYWpfbGFiZWwgPSBtYWpfZnVuYyh0aW1lLCBtYWpfcXR5LCBtYWpfdXNlX3Nob3J0LCB0aWNfaWR4KTsKICAgICAgICAgICAgdmFyIG1pbl9sYWJlbCA9IG1pbl9mdW5jKHRpbWUsIG1pbl9xdHksIG1pbl91c2Vfc2hvcnQsIHRpY19pZHgpOwoKICAgICAgICAgICAgdmFyIHggPSBncmFwaC5tYXJnaW4ubGVmdCArIE1hdGgucm91bmQoKHRpY19pZHggLSB0aW1lX3NoaWZ0LzYwKSAqIGdyYXBoLnRpY19zcGFjaW5nKTsKICAgICAgICAgICAgdmFyIGxhYmVsOwogICAgICAgICAgICBpZiAocmVkX2xhYmVsKSB7CiAgICAgICAgICAgICAgICBpZiAodGljX2lkeCA+IDApIGdyaWQgKz0gJzxwYXRoIGNsYXNzPSJyZWR0aWMiIGQ9Ik0nK3grJywwdicrKGdyYXBoLm1hcmdpbi50b3ArZ3JhcGhfaGVpZ2h0LTEpKyciIC8+JzsKICAgICAgICAgICAgICAgIGlmICghbWFqX3VzZV9zaG9ydCAmJiB0aWNfaWR4IC0gcHJldl9sYWJlbCA8IGdyYXBoLm1pbl9ob3Vyc19wZXJfbGFiZWwqMC41OCkgbGFiZWxfeC5wb3AoKTsKICAgICAgICAgICAgICAgIGxhYmVsX3gucHVzaCgnPHRleHQgY2xhc3M9InJlZHRpYyIgeD0iJysoeCs0KSsnIiB5PSInKyhncmFwaC5tYXJnaW4udG9wLTgpKyciPicrcmVkX2xhYmVsKyc8L3RleHQ+Jyk7CiAgICAgICAgICAgICAgICBwcmV2X2xhYmVsID0gdGljX2lkeDsKICAgICAgICAgICAgfSBlbHNlIGlmIChtYWpfbGFiZWwpIHsKICAgICAgICAgICAgICAgIGlmICh0aWNfaWR4ID4gMCkgZ3JpZCArPSAnPHBhdGggY2xhc3M9Im1ham9yIiBkPSJNJyt4KycsMHYnKyhncmFwaC5tYXJnaW4udG9wK2dyYXBoX2hlaWdodC0xKSsnIiAvPic7CiAgICAgICAgICAgICAgICBpZiAobWFqX3VzZV9zaG9ydCB8fCB0aWNfaWR4IC0gcHJldl9sYWJlbCA+IGdyYXBoLm1pbl9ob3Vyc19wZXJfbGFiZWwqMC41OCkgewogICAgICAgICAgICAgICAgICAgIGxhYmVsX3gucHVzaCgnPHRleHQgY2xhc3M9Im1ham9yIiB4PSInKyh4KzQpKyciIHk9IicrKGdyYXBoLm1hcmdpbi50b3AtOCkrJyI+JyttYWpfbGFiZWwrJzwvdGV4dD4nKTsKICAgICAgICAgICAgICAgICAgICBwcmV2X2xhYmVsID0gdGljX2lkeDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChtaW5fbGFiZWwpIHsKICAgICAgICAgICAgICAgIGlmICh0aWNfaWR4ID4gMCkgZ3JpZCArPSAnPHBhdGggY2xhc3M9Im1pbm9yIiBkPSJNJyt4KycsJysoZ3JhcGgubWFyZ2luLnRvcC02KSsndicrKGdyYXBoX2hlaWdodCs2KSsnIiAvPic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgLy8gRHJhdyBiYXJzCgogICAgICAgIHZhciBtaW5fYmFyX2hlaWdodCA9IE1hdGguY2VpbChncmFwaC55X2F4aXMubWF4X3Jldmlld3MgLyBncmFwaC55X2F4aXMuaGVpZ2h0KTsKICAgICAgICBmb3IgKHZhciBidW5kbGVfaWR4IGluIGdyYXBoLmJ1bmRsZXMpIHsKICAgICAgICAgICAgdmFyIGJ1bmRsZSA9IGdyYXBoLmJ1bmRsZXNbYnVuZGxlX2lkeF07CiAgICAgICAgICAgIHZhciBiYXJfcGFydHMgPSBbXTsKICAgICAgICAgICAgdmFyIHN0YXRzID0gYnVuZGxlLnN0YXRzOwoKICAgICAgICAgICAgdmFyIHgxID0gTWF0aC5yb3VuZChidW5kbGUuc3RhcnRfdGltZSAqIGdyYXBoLnRpY19zcGFjaW5nKTsKICAgICAgICAgICAgdmFyIHgyID0gTWF0aC5yb3VuZChidW5kbGUuZW5kX3RpbWUgKiBncmFwaC50aWNfc3BhY2luZyk7CiAgICAgICAgICAgIGlmIChzZXR0aW5ncy5tYXhfYmFyX3dpZHRoID4gMCkgeDIgPSBNYXRoLm1pbih4MSArIHNldHRpbmdzLm1heF9iYXJfd2lkdGgsIHgyKTsKCiAgICAgICAgICAgIHN3aXRjaCAoc2V0dGluZ3MuYmFyX3N0eWxlKSB7CiAgICAgICAgICAgICAgICBjYXNlICdjb3VudCc6CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRzLmNvdW50KSBiYXJfcGFydHMucHVzaCh7Y2xhc3M6J2NvdW50JywgaGVpZ2h0OnN0YXRzLmNvdW50fSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnaXRlbV90eXBlJzoKICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHMucmFkKSBiYXJfcGFydHMucHVzaCh7Y2xhc3M6J3JhZCcsIGhlaWdodDpzdGF0cy5yYWR9KTsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHMua2FuKSBiYXJfcGFydHMucHVzaCh7Y2xhc3M6J2thbicsIGhlaWdodDpzdGF0cy5rYW59KTsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHMudm9jKSBiYXJfcGFydHMucHVzaCh7Y2xhc3M6J3ZvYycsIGhlaWdodDpzdGF0cy52b2N9KTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICdzcnNfc3RhZ2UnOgogICAgICAgICAgICAgICAgICAgIGlmIChzdGF0cy5hcHByKSBiYXJfcGFydHMucHVzaCh7Y2xhc3M6J2FwcHInLCBoZWlnaHQ6c3RhdHMuYXBwcn0pOwogICAgICAgICAgICAgICAgICAgIGlmIChzdGF0cy5ndXJ1KSBiYXJfcGFydHMucHVzaCh7Y2xhc3M6J2d1cnUnLCBoZWlnaHQ6c3RhdHMuZ3VydX0pOwogICAgICAgICAgICAgICAgICAgIGlmIChzdGF0cy5tYXN0KSBiYXJfcGFydHMucHVzaCh7Y2xhc3M6J21hc3QnLCBoZWlnaHQ6c3RhdHMubWFzdH0pOwogICAgICAgICAgICAgICAgICAgIGlmIChzdGF0cy5lbmxpKSBiYXJfcGFydHMucHVzaCh7Y2xhc3M6J2VubGknLCBoZWlnaHQ6c3RhdHMuZW5saX0pOwogICAgICAgICAgICAgICAgICAgIGlmIChzdGF0cy5idXJuKSBiYXJfcGFydHMucHVzaCh7Y2xhc3M6J2J1cm4nLCBoZWlnaHQ6c3RhdHMuYnVybn0pOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgJ2xldmVsJzoKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBncnBfaWR4ID0gMDsgZ3JwX2lkeCA8PSA1OyBncnBfaWR4KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGdycF9uYW1lID0gJ2x2bGdycCcrZ3JwX2lkeDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRzW2dycF9uYW1lXSkgYmFyX3BhcnRzLnB1c2goe2NsYXNzOidsdmxncnAnK2dycF9pZHgsIGhlaWdodDpzdGF0c1tncnBfbmFtZV19KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGJhcl9vZmZzZXQgPSAwOwogICAgICAgICAgICBmb3IgKHZhciBwYXJ0X2lkeCBpbiBiYXJfcGFydHMpIHsKICAgICAgICAgICAgICAgIHZhciBwYXJ0ID0gYmFyX3BhcnRzW3BhcnRfaWR4XTsKICAgICAgICAgICAgICAgIGlmICgocGFydF9pZHggPT0gYmFyX3BhcnRzLmxlbmd0aC0xKSAmJiAoYmFyX29mZnNldCArIHBhcnQuaGVpZ2h0IDwgbWluX2Jhcl9oZWlnaHQpKSB7CiAgICAgICAgICAgICAgICAgICAgcGFydC5oZWlnaHQgPSBtaW5fYmFyX2hlaWdodCAtIGJhcl9vZmZzZXQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBiYXJzICs9ICc8cmVjdCBjbGFzcz0iYmFyICcrcGFydC5jbGFzcysnIiB4PSInKyh4MSsxKSsnIiB5PSInK2Jhcl9vZmZzZXQrJyIgd2lkdGg9IicrKHgyLXgxLTMpKyciIGhlaWdodD0iJytwYXJ0LmhlaWdodCsnIiAvPic7CiAgICAgICAgICAgICAgICBiYXJfb2Zmc2V0ICs9IHBhcnQuaGVpZ2h0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChiYXJfcGFydHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgYmFyX292ZXJsYXlzICs9ICc8cmVjdCBjbGFzcz0iYmFyIG92ZXJsYXkiIHg9IicreDErJyIgeT0iMCIgd2lkdGg9IicrKHgyLXgxKSsnIiBoZWlnaHQ9IicrZ3JhcGgueV9heGlzLm1heF9yZXZpZXdzKyciIGRhdGEtYnVuZGxlPSInK2J1bmRsZV9pZHgrJyIgLz4nOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgbWFya2VyX3g7CiAgICAgICAgICAgIG1hcmtlcl94ID0gZ3JhcGgubWFyZ2luLmxlZnQgKyBNYXRoLmZsb29yKCh4MSt4MikvMik7CiAgICAgICAgICAgIGlmIChidW5kbGUuc3RhdHMuaGFzX2N1cnJfbWFya2VyICYmIHNldHRpbmdzLmN1cnJlbnRfbGV2ZWxfbWFya2VycyAhPT0gJ25vbmUnKSB7CiAgICAgICAgICAgICAgICBtYXJrZXJzICs9ICc8cGF0aCBjbGFzcz0iY3VyIiBkPSJNJyttYXJrZXJfeCsnLCcrKGdyYXBoLm1hcmdpbi50b3ArZ3JhcGhfaGVpZ2h0KzEpKydsLTMsNmg2eiIgLz4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggYnVuZGxlLnN0YXRzLmJ1cm5fY291bnQgPiAwICYmIHNldHRpbmdzLmJ1cm5fbWFya2VycyA9PT0gJ3Nob3cnKSB7CiAgICAgICAgICAgICAgICBtYXJrZXJzICs9ICc8cGF0aCBjbGFzcz0iYnVyIiBkPSJNJyttYXJrZXJfeCsnLCcrKGdyYXBoLm1hcmdpbi50b3ArZ3JhcGhfaGVpZ2h0KzgpKydsLTMsNmg2eiIgLz4nOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgIC8vIEFzc2VtYmxlIHRoZSBIVE1MCgogICAgICAgIHBhbmVsLmh0bWwoCiAgICAgICAgICAgICc8c3ZnIGNsYXNzPSJncmFwaCBub3NlbGVjdCIgd2lkdGg9IicrcGFuZWxfd2lkdGgrJyIgaGVpZ2h0PSInK3BhbmVsX2hlaWdodCsnIj4nKwogICAgICAgICAgICAnICA8cmVjdCBjbGFzcz0iYmtnZCIgeD0iJytncmFwaC5tYXJnaW4ubGVmdCsnIiB5PSInK2dyYXBoLm1hcmdpbi50b3ArJyIgd2lkdGg9IicrZ3JhcGgueF9heGlzLndpZHRoKyciIGhlaWdodD0iJytncmFwaF9oZWlnaHQrJyIgLz4nKwogICAgICAgICAgICAnICA8ZyBjbGFzcz0iZ3JpZCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC41LDAuNSkiPicrCiAgICAgICAgICAgIGdyaWQrCiAgICAgICAgICAgICcgICAgPHBhdGggY2xhc3M9InNoYWRvdyIgZD0iTScrKGdyYXBoLm1hcmdpbi5sZWZ0LTIpKycsMHYnKyhncmFwaC5tYXJnaW4udG9wK2dyYXBoX2hlaWdodCkrJyxoJysoZ3JhcGgubWFyZ2luLmxlZnQrZ3JhcGgueF9heGlzLndpZHRoKzEpKyciIC8+JysKICAgICAgICAgICAgJyAgICA8cGF0aCBjbGFzcz0ibGlnaHQiIGQ9Ik0nKyhncmFwaC5tYXJnaW4ubGVmdC0xKSsnLDB2JysoZ3JhcGgubWFyZ2luLnRvcCtncmFwaF9oZWlnaHQtMSkrJyIgLz4nKwogICAgICAgICAgICAnICAgIDxwYXRoIGNsYXNzPSJsaWdodCIgZD0iTScrKGdyYXBoLm1hcmdpbi5sZWZ0LTIpKycsJysoZ3JhcGgubWFyZ2luLnRvcCtncmFwaF9oZWlnaHQrMSkrJ2gnKyhncmFwaC5tYXJnaW4ubGVmdCtncmFwaC54X2F4aXMud2lkdGgrMSkrJyIgLz4nKwogICAgICAgICAgICAnICA8L2c+JysKICAgICAgICAgICAgJyAgPGcgY2xhc3M9ImxhYmVsLXgiPicrCiAgICAgICAgICAgIGxhYmVsX3guam9pbignJykrCiAgICAgICAgICAgICcgIDwvZz4nKwogICAgICAgICAgICAnICA8ZyBjbGFzcz0ibGFiZWwteSI+JysKICAgICAgICAgICAgbGFiZWxfeSsKICAgICAgICAgICAgJyAgPC9nPicrCiAgICAgICAgICAgICcgIDxnIGNsYXNzPSJtYXJrZXJzIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLjUsMC41KSI+JysKICAgICAgICAgICAgbWFya2VycysKICAgICAgICAgICAgJyAgPC9nPicrCiAgICAgICAgICAgICcgIDxnIGNsYXNzPSJiYXJzIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgnK2dyYXBoLm1hcmdpbi5sZWZ0KycsJysoZ3JhcGgubWFyZ2luLnRvcCtncmFwaF9oZWlnaHQpKycpIHNjYWxlKDEsJysoLTEgKiBncmFwaF9oZWlnaHQgLyBncmFwaC55X2F4aXMubWF4X3Jldmlld3MpKycpIj4nKwogICAgICAgICAgICBiYXJzKwogICAgICAgICAgICBiYXJfb3ZlcmxheXMrCiAgICAgICAgICAgICcgIDwvZz4nKwogICAgICAgICAgICAnICA8ZyBjbGFzcz0icmVzaXplX2dyaXAiPicrCiAgICAgICAgICAgICcgICAgPHBhdGggY2xhc3M9InNoYWRvdyIgZD0iTScrKHBhbmVsX3dpZHRoLTIpKycsJytwYW5lbF9oZWlnaHQrJ2wyLC0ybTAsLTRsLTYsNm0tNCwwbDEwLC0xMCIgLz4nKwogICAgICAgICAgICAnICAgIDxwYXRoIGNsYXNzPSJsaWdodCIgZD0iTScrKHBhbmVsX3dpZHRoLTMpKycsJytwYW5lbF9oZWlnaHQrJ2wzLC0zbTAsLTRsLTcsN20tNCwwbDExLC0xMSIgLz4nKwogICAgICAgICAgICAnICAgIDxyZWN0IGNsYXNzPSJib3VuZGFyeSIgeD0iMCIgeT0iJysocGFuZWxfaGVpZ2h0LTEzKSsnIiB3aWR0aD0iJytwYW5lbF93aWR0aCsnIiBoZWlnaHQ9IjEzIiAvPicrCiAgICAgICAgICAgICcgIDwvZz4nKwogICAgICAgICAgICAnICA8ZyBjbGFzcz0iaGlnaGxpZ2h0Ij4nKwogICAgICAgICAgICAnICAgIDxyZWN0IGNsYXNzPSJtYXJrZXIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMDAsMC41KSIgeD0iJytncmFwaC5tYXJnaW4ubGVmdCsnIiB5PSInK2dyYXBoLm1hcmdpbi50b3ArJyIgd2lkdGg9IjAiIGhlaWdodD0iJytncmFwaF9oZWlnaHQrJyIgLz4nKwogICAgICAgICAgICAnICAgIDxwYXRoIGNsYXNzPSJtYXJrZXIgc3RhcnQiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMDAsMCkiIGQ9Ik0nK2dyYXBoLm1hcmdpbi5sZWZ0KycsJysoZ3JhcGgubWFyZ2luLnRvcC0xKSsnbC0zLC01aDZsLTMsNXYnKyhncmFwaF9oZWlnaHQrMSkrJyIgLz4nKwogICAgICAgICAgICAnICAgIDxwYXRoIGNsYXNzPSJtYXJrZXIgZW5kIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTAwLDApIiBkPSJNJytncmFwaC5tYXJnaW4ubGVmdCsnLCcrKGdyYXBoLm1hcmdpbi50b3AtMSkrJ2wtMywtNWg2bC0zLDV2JysoZ3JhcGhfaGVpZ2h0KzEpKyciIC8+JysKICAgICAgICAgICAgJyAgICA8cmVjdCBjbGFzcz0iYm91bmRhcnkiIHg9IicrKGdyYXBoLm1hcmdpbi5sZWZ0LTIpKyciIHk9IjAiIHdpZHRoPSInKyhncmFwaC54X2F4aXMud2lkdGgrMikrJyIgaGVpZ2h0PSInK2dyYXBoLm1hcmdpbi50b3ArJyIgLz4nKwogICAgICAgICAgICAnICA8L2c+JysKICAgICAgICAgICAgJzwvc3ZnPicKICAgICAgICApOwogICAgICAgIHBhbmVsLmhlaWdodChwYW5lbF9oZWlnaHQpOwoKICAgICAgICAvLyBBdHRhY2ggZXZlbnQgaGFuZGxlcnMKICAgICAgICBwYW5lbC5maW5kKCcucmVzaXplX2dyaXAgLmJvdW5kYXJ5Jykub24oJ21vdXNlZG93biB0b3VjaHN0YXJ0JywgcmVzaXplX3BhbmVsKTsKICAgICAgICBwYW5lbC5maW5kKCcuaGlnaGxpZ2h0IC5ib3VuZGFyeScpLm9uKCdtb3VzZWVudGVyIG1vdXNlbGVhdmUgbW91c2Vtb3ZlIG1vdXNlZG93biB0b3VjaHN0YXJ0JywgaGlnaGxpZ2h0X2hvdmVyKTsKICAgICAgICBwYW5lbC5maW5kKCcuYmFyLm92ZXJsYXknKS5vbignbW91c2VlbnRlciBtb3VzZWxlYXZlJywgYmFyX2hvdmVyKTsKICAgICAgICBwYW5lbC5maW5kKCcuYmFyLm92ZXJsYXknKS5vbignY2xpY2snLCBiYXJfY2xpY2spOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBFdmVudCBoYW5kbGVyIGZvciBjbGlja2luZyB0aW1lbGluZSBiYXJzLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBiYXJfY2xpY2soZSkgewogICAgICAgIGlmIChzZXR0aW5ncy5zaG93X3Jldmlld19kZXRhaWxzID09PSAnbm9uZScpIHJldHVybjsKICAgICAgICBpZiAoaGlnaGxpZ2h0LmhpZ2hsaWdodGVkKSBoaWRlX2hpZ2hsaWdodCgpOwogICAgICAgIHZhciBidW5kbGVfaWR4ID0gTnVtYmVyKGUudGFyZ2V0LmF0dHJpYnV0ZXNbJ2RhdGEtYnVuZGxlJ10udmFsdWUpOwogICAgICAgIGhpZ2hsaWdodC5zdGFydCA9IGJ1bmRsZV9pZHg7CiAgICAgICAgaGlnaGxpZ2h0LmVuZCA9IGJ1bmRsZV9pZHggKyAxOwogICAgICAgIGhpZ2hsaWdodC5oaWdobGlnaHRlZCA9IHRydWU7CiAgICAgICAgZ3JhcGguZWxlbS5vZmYoJy5iYXJfaG92ZXJfbW92ZScpOwogICAgICAgIHNob3dfcmV2aWV3X2luZm8odHJ1ZSAvKiBzdGlja3kgKi8sIGUpOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBFdmVudCBoYW5kbGVyIGZvciBob3ZlcmluZyBvdmVyIHRpbWVsaW5lIGJhcnMuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIGJhcl9ob3ZlcihlKSB7CiAgICAgICAgaWYgKHNldHRpbmdzLnNob3dfcmV2aWV3X2RldGFpbHMgPT09ICdub25lJykgcmV0dXJuOwogICAgICAgIGlmIChoaWdobGlnaHQuaGlnaGxpZ2h0ZWQpIHJldHVybjsKICAgICAgICBzd2l0Y2ggKGUudHlwZSkgewogICAgICAgICAgICBjYXNlICdtb3VzZWVudGVyJzoKICAgICAgICAgICAgICAgIHZhciBidW5kbGVfaWR4ID0gTnVtYmVyKGUudGFyZ2V0LmF0dHJpYnV0ZXNbJ2RhdGEtYnVuZGxlJ10udmFsdWUpOwogICAgICAgICAgICAgICAgaGlnaGxpZ2h0LnN0YXJ0ID0gYnVuZGxlX2lkeDsKICAgICAgICAgICAgICAgIGhpZ2hsaWdodC5lbmQgPSBidW5kbGVfaWR4ICsgMTsKICAgICAgICAgICAgICAgIHNob3dfcmV2aWV3X2luZm8oZmFsc2UgLyogc3RpY2t5ICovLCBlKTsKICAgICAgICAgICAgICAgIGdyYXBoLmVsZW0ub24oJ21vdXNlbW92ZS5iYXJfaG92ZXJfbW92ZScsIGZ1bmN0aW9uKGUpewogICAgICAgICAgICAgICAgICAgIGdyYXBoLnJldmlld19pbmZvLmNzcygndG9wJywgZS5jbGllbnRZIC0gZS50YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIC0gMzApOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgJ21vdXNlbGVhdmUnOgogICAgICAgICAgICAgICAgZ3JhcGguZWxlbS5vZmYoJy5iYXJfaG92ZXJfbW92ZScpOwogICAgICAgICAgICAgICAgaGlkZV9yZXZpZXdfaW5mbygpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBCdWlsZCBhbmQgZGlzcGxheSB0aGUgUmV2aWV3IEluZm8gcG9wLXVwLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBzaG93X3Jldmlld19pbmZvKHN0aWNreSwgZSkgewogICAgICAgIHZhciBpbmZvID0gJCgnI3RpbWVsaW5lIC5yZXZpZXdfaW5mbycpOwogICAgICAgIGlmIChzdGlja3kpIHsKICAgICAgICAgICAgJCgnYm9keScpLm9mZignLnRpbWVsaW5lX2hpZGVpbmZvJyk7CiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICQoJ2JvZHknKS5vbignY2xpY2sudGltZWxpbmVfaGlkZWluZm8nLCBmdW5jdGlvbihlKXsKICAgICAgICAgICAgICAgICAgICAkKCdib2R5Jykub2ZmKCcudGltZWxpbmVfaGlkZWluZm8nKTsKICAgICAgICAgICAgICAgICAgICBoaWRlX2hpZ2hsaWdodCgpOwogICAgICAgICAgICAgICAgICAgIGhpZGVfcmV2aWV3X2luZm8oKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCAxMCk7CiAgICAgICAgfQoKICAgICAgICB2YXIgc3RhcnQgPSBNYXRoLm1pbihoaWdobGlnaHQuc3RhcnQsIGhpZ2hsaWdodC5lbmQpOwogICAgICAgIHZhciBlbmQgPSBNYXRoLm1heChoaWdobGlnaHQuc3RhcnQsIGhpZ2hsaWdodC5lbmQpOwoKICAgICAgICB2YXIgYnVuZGxlID0ge2l0ZW1zOltdfTsKICAgICAgICBmb3IgKHZhciBidW5kbGVfaWR4ID0gc3RhcnQ7IGJ1bmRsZV9pZHggPCBlbmQ7IGJ1bmRsZV9pZHgrKykgewogICAgICAgICAgICBidW5kbGUuaXRlbXMgPSBidW5kbGUuaXRlbXMuY29uY2F0KGdyYXBoLmJ1bmRsZXNbYnVuZGxlX2lkeF0uaXRlbXMpOwogICAgICAgIH0KCiAgICAgICAgY2FsY19idW5kbGVfc3RhdHMoYnVuZGxlKTsKCiAgICAgICAgLy8gUHJpbnQgdGhlIGRhdGUgb3IgZGF0ZSByYW5nZS4KICAgICAgICB2YXIgYWxsb3dfbm93ID0gKChzdGFydCA9PT0gMCkgJiYgKGdyYXBoLmJ1bmRsZV9zaXplID09PSAxKSk7CiAgICAgICAgdmFyIGh0bWwgPSAnPGRpdj4nOwogICAgICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpOwogICAgICAgIHZhciBzdGFydF9kYXRlID0gbmV3IERhdGUoZ3JhcGguc3RhcnRfdGltZS5nZXRUaW1lKCkgKyBidW5kbGVfdG9fdGljKHN0YXJ0KSAqIDM2MDAwMDApOwogICAgICAgIHZhciBlbmRfZGF0ZSA9IG5ldyBEYXRlKGdyYXBoLnN0YXJ0X3RpbWUuZ2V0VGltZSgpICsgYnVuZGxlX3RvX3RpYyhlbmQpICogMzYwMDAwMCArICh0aW1lX3NoaWZ0IC0gMSkgKiA2MDAwMCk7CiAgICAgICAgdmFyIHNhbWVfZGF5ID0gKG5ldyBEYXRlKHN0YXJ0X2RhdGUpLnNldEhvdXJzKDAsMCwwLDApID09IG5ldyBEYXRlKGVuZF9kYXRlKS5zZXRIb3VycygwLDAsMCwwKSk7CiAgICAgICAgdmFyIHNob3dfbW9udGggPSAoKG5vdy5nZXRNb250aCgpICE9IHN0YXJ0X2RhdGUuZ2V0TW9udGgoKSkgfHwgKChuZXcgRGF0ZShlbmRfZGF0ZSkuc2V0SG91cnMoMCwwLDAsMCkgLSBuZXcgRGF0ZShub3cpLnNldEhvdXJzKDAsMCwwLDApKSA+ICg2LjUgKiA4NjQwMDAwMCkpKTsKICAgICAgICBpZiAoKChlbmQtc3RhcnQpID4gMSkgfHwgKGdyYXBoLmJ1bmRsZV9zaXplID4gMSkpIHsKICAgICAgICAgICAgaHRtbCArPSBmb3JtYXRfZGF0ZShzdGFydF9kYXRlLCBhbGxvd19ub3csIHRydWUgLyogc2hvd19kYXkgKi8sIHNob3dfbW9udGgpICsgJyB0byAnICsgZm9ybWF0X2RhdGUoZW5kX2RhdGUsIGZhbHNlLCAhc2FtZV9kYXkgLyogc2hvd19kYXkgKi8sIHNob3dfbW9udGggJiYgIXNhbWVfZGF5KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBodG1sICs9IGZvcm1hdF9kYXRlKHN0YXJ0X2RhdGUsIGFsbG93X25vdywgdHJ1ZSAvKiBzaG93X2RheSAqLywgc2hvd19tb250aCk7CiAgICAgICAgfQogICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7CgogICAgICAgIC8vIFBvcHVsYXRlIGl0ZW0gdHlwZSBzdW1tYXJpZXMuCiAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0ic3VtbWFyeSI+JzsKICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJ0b3QiPicrKGJ1bmRsZS5zdGF0cy5jb3VudCkrJyByZXZpZXdzPC9kaXY+JzsKICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJpbmRlbnQiPic7CgogICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9Iml0ZW1fdHlwZSByYWQiPjxzcGFuIGNsYXNzPSJmaXhlZCI+JysoYnVuZGxlLnN0YXRzLnJhZCB8fCAwKSsnPC9zcGFuPiByYWRpY2FsczwvZGl2Pic7CiAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iaXRlbV90eXBlIGthbiI+PHNwYW4gY2xhc3M9ImZpeGVkIj4nKyhidW5kbGUuc3RhdHMua2FuIHx8IDApKyc8L3NwYW4+IGthbmppPC9kaXY+JzsKICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJpdGVtX3R5cGUgdm9jIj48c3BhbiBjbGFzcz0iZml4ZWQiPicrKGJ1bmRsZS5zdGF0cy52b2MgfHwgMCkrJzwvc3Bhbj4gdm9jYWJ1bGFyeTwvZGl2Pic7CgogICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9InNyc19zdGFnZSBhcHByIj48c3BhbiBjbGFzcz0iZml4ZWQiPicrKGJ1bmRsZS5zdGF0cy5hcHByIHx8IDApKyc8L3NwYW4+IGFwcHJlbnRpY2U8L2Rpdj4nOwogICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9InNyc19zdGFnZSBndXJ1Ij48c3BhbiBjbGFzcz0iZml4ZWQiPicrKGJ1bmRsZS5zdGF0cy5ndXJ1IHx8IDApKyc8L3NwYW4+IGd1cnU8L2Rpdj4nOwogICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9InNyc19zdGFnZSBtYXN0Ij48c3BhbiBjbGFzcz0iZml4ZWQiPicrKGJ1bmRsZS5zdGF0cy5tYXN0IHx8IDApKyc8L3NwYW4+IG1hc3RlcjwvZGl2Pic7CiAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0ic3JzX3N0YWdlIGVubGkiPjxzcGFuIGNsYXNzPSJmaXhlZCI+JysoYnVuZGxlLnN0YXRzLmVubGkgfHwgMCkrJzwvc3Bhbj4gZW5saWdodGVuZWQ8L2Rpdj4nOwogICAgICAgIGlmIChzZXR0aW5ncy5zcnNfY3Vycl9uZXh0ID09PSAnbmV4dCcpIHsKICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0ic3JzX3N0YWdlIGJ1cm4iPjxzcGFuIGNsYXNzPSJmaXhlZCI+JysoYnVuZGxlLnN0YXRzLmJ1cm4gfHwgMCkrJzwvc3Bhbj4gYnVybjwvZGl2Pic7CiAgICAgICAgfQoKICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJsZXZlbCBsdmxncnAwIj48c3BhbiBjbGFzcz0iZml4ZWQiPicrKGJ1bmRsZS5zdGF0cy5sdmxncnAwIHx8IDApKyc8L3NwYW4+IGxldmVscyAxLTEwPC9kaXY+JzsKICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJsZXZlbCBsdmxncnAxIj48c3BhbiBjbGFzcz0iZml4ZWQiPicrKGJ1bmRsZS5zdGF0cy5sdmxncnAxIHx8IDApKyc8L3NwYW4+IGxldmVscyAxMS0yMDwvZGl2Pic7CiAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0ibGV2ZWwgbHZsZ3JwMiI+PHNwYW4gY2xhc3M9ImZpeGVkIj4nKyhidW5kbGUuc3RhdHMubHZsZ3JwMiB8fCAwKSsnPC9zcGFuPiBsZXZlbHMgMjEtMzA8L2Rpdj4nOwogICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImxldmVsIGx2bGdycDMiPjxzcGFuIGNsYXNzPSJmaXhlZCI+JysoYnVuZGxlLnN0YXRzLmx2bGdycDMgfHwgMCkrJzwvc3Bhbj4gbGV2ZWxzIDMxLTQwPC9kaXY+JzsKICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJsZXZlbCBsdmxncnA0Ij48c3BhbiBjbGFzcz0iZml4ZWQiPicrKGJ1bmRsZS5zdGF0cy5sdmxncnA0IHx8IDApKyc8L3NwYW4+IGxldmVscyA0MS01MDwvZGl2Pic7CiAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0ibGV2ZWwgbHZsZ3JwNSI+PHNwYW4gY2xhc3M9ImZpeGVkIj4nKyhidW5kbGUuc3RhdHMubHZsZ3JwNSB8fCAwKSsnPC9zcGFuPiBsZXZlbHMgNTEtNjA8L2Rpdj4nOwoKICAgICAgICBodG1sICs9ICc8L2Rpdj4nOwoKICAgICAgICBpZiAoKGJ1bmRsZS5zdGF0cy5jdXJyX2NvdW50ID4gMCkgfHwgKGJ1bmRsZS5zdGF0cy5idXJuX2NvdW50ID4gMCkpIHsKICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iaW5kZW50Ij4nOwogICAgICAgICAgICBpZiAoYnVuZGxlLnN0YXRzLmN1cnJfY291bnQgPiAwKSBodG1sICs9ICc8ZGl2IGNsYXNzPSJjdXIiPjxzcGFuIGNsYXNzPSJmaXhlZCI+JytidW5kbGUuc3RhdHMuY3Vycl9jb3VudCsnPC9zcGFuPiBDdXJyZW50IExldmVsPC9kaXY+JzsKICAgICAgICAgICAgaWYgKGJ1bmRsZS5zdGF0cy5idXJuX2NvdW50ID4gMCkgaHRtbCArPSAnPGRpdiBjbGFzcz0iYnVyIj48c3BhbiBjbGFzcz0iZml4ZWQiPicrYnVuZGxlLnN0YXRzLmJ1cm5fY291bnQrJzwvc3Bhbj4gQnVybiBJdGVtJysoYnVuZGxlLnN0YXRzLmJ1cm5fY291bnQgPiAxID8gJ3MnIDogJycpKyc8L2Rpdj4nOwogICAgICAgICAgICBodG1sICs9ICc8L2Rpdj4nOwogICAgICAgIH0KCiAgICAgICAgaHRtbCArPSAnPC9kaXY+JzsKCiAgICAgICAgaWYgKHNldHRpbmdzLnJldmlld19kZXRhaWxzX2J1dHRvbnMpIHsKICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iZGV0YWlsX2J1dHRvbnMiPic7CiAgICAgICAgICAgIGh0bWwgKz0gJzxidXR0b24gY2xhc3M9ImNvdW50Ij5SZXZpZXcgQ291bnQ8L2J1dHRvbj4nOwogICAgICAgICAgICBodG1sICs9ICc8YnV0dG9uIGNsYXNzPSJpdGVtX3R5cGUiPkl0ZW0gVHlwZTwvYnV0dG9uPic7CiAgICAgICAgICAgIGh0bWwgKz0gJzxidXR0b24gY2xhc3M9InNyc19zdGFnZSI+U1JTIExldmVsPC9idXR0b24+JzsKICAgICAgICAgICAgaHRtbCArPSAnPGJ1dHRvbiBjbGFzcz0ibGV2ZWwiPkxldmVsPC9idXR0b24+JzsKICAgICAgICAgICAgaHRtbCArPSAnPC9kaXY+JzsKICAgICAgICB9CgogICAgICAgIGlmIChzZXR0aW5ncy5zaG93X3Jldmlld19kZXRhaWxzID09PSAnaXRlbV9saXN0JyB8fCBzZXR0aW5ncy5zaG93X3Jldmlld19kZXRhaWxzID09PSAnZnVsbCcpIHsKICAgICAgICAgICAgaHRtbCA9IHBvcHVsYXRlX2l0ZW1fbGlzdChidW5kbGUsIGh0bWwpOwogICAgICAgIH0KCiAgICAgICAgaW5mby5maW5kKCcuaW5uZXInKS5odG1sKGh0bWwpOwogICAgICAgIGdyYXBoLnJldmlld19pbmZvID0gaW5mbzsKCiAgICAgICAgdmFyIG51bV93aWR0aCA9IGJ1bmRsZS5zdGF0cy5jb3VudC50b1N0cmluZygpOwogICAgICAgIGluZm8uZmluZCgnLnN1bW1hcnkgLmZpeGVkJykuY3NzKCd3aWR0aCcsIChudW1fd2lkdGgudG9TdHJpbmcoKS5sZW5ndGggKiA5ICsgOCkgKyAncHgnKTsKCiAgICAgICAgdmFyIHRvcCwgbGVmdCwgcmlnaHQsIHdpZHRoOwogICAgICAgIHZhciBoYWxmX3dpZHRoID0gZ3JhcGgueF9heGlzLndpZHRoLzI7CiAgICAgICAgdmFyIHggPSBidW5kbGVfdG9feChzdGFydCk7CiAgICAgICAgaW5mby5jc3MoJ21heC13aWR0aCcsIGhhbGZfd2lkdGgpOwogICAgICAgIGlmIChoaWdobGlnaHQuZHJhZ2dpbmcpIHsKICAgICAgICAgICAgdG9wID0gZ3JhcGgubWFyZ2luLnRvcCArIGdyYXBoLnlfYXhpcy5oZWlnaHQgKyBncmFwaC5tYXJnaW4uYm90dG9tOwogICAgICAgICAgICBpZiAoeCA8IGhhbGZfd2lkdGgpIHsKICAgICAgICAgICAgICAgIGxlZnQgPSBncmFwaC5tYXJnaW4ubGVmdCArIHg7CiAgICAgICAgICAgICAgICBpbmZvLmNzcyh7bGVmdDpsZWZ0LCByaWdodDonYXV0bycsIHRvcDp0b3B9KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJpZ2h0ID0gMDsKICAgICAgICAgICAgICAgIGluZm8uY3NzKHtsZWZ0OidhdXRvJywgcmlnaHQ6cmlnaHQsIHRvcDp0b3B9KTsKICAgICAgICAgICAgICAgIGlmICh4IDwgZ3JhcGgueF9heGlzLndpZHRoIC0gaW5mby5vdXRlcldpZHRoKCkpIHsKICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gZ3JhcGgubWFyZ2luLmxlZnQgKyB4OwogICAgICAgICAgICAgICAgICAgIGluZm8uY3NzKHtsZWZ0OmxlZnQsIHJpZ2h0OidhdXRvJywgdG9wOnRvcH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChlKSB7CiAgICAgICAgICAgIHRvcCA9IGUuY2xpZW50WSAtIGUudGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCAtIDMwOwogICAgICAgICAgICBpZiAoeCA8IGhhbGZfd2lkdGgpIHsKICAgICAgICAgICAgICAgIGxlZnQgPSBncmFwaC5tYXJnaW4ubGVmdCArIGJ1bmRsZV90b194KHN0YXJ0KzEpICsgNDsKICAgICAgICAgICAgICAgIGluZm8uY3NzKHtsZWZ0OmxlZnQsIHJpZ2h0OidhdXRvJywgdG9wOnRvcH0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmlnaHQgPSBncmFwaC54X2F4aXMud2lkdGggLSBidW5kbGVfdG9feChzdGFydCkgKyA0OwogICAgICAgICAgICAgICAgaW5mby5jc3Moe2xlZnQ6J2F1dG8nLCByaWdodDpyaWdodCwgdG9wOnRvcH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpbmZvLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUG9wdWxhdGUgdGhlIGxpc3Qgb2YgaXRlbXMgcHJlc2VudCBpbiBhIHRpbWUgYnVuZGxlLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBwb3B1bGF0ZV9pdGVtX2xpc3QoYnVuZGxlLCBodG1sKSB7CiAgICAgICAgdmFyIHNyc190b19jbGFzcyA9IHsKICAgICAgICAgICAgY3VycjogWydhcHByJywnYXBwcicsJ2FwcHInLCdhcHByJywnYXBwcicsJ2d1cnUnLCdndXJ1JywnbWFzdCcsJ2VubGknXSwKICAgICAgICAgICAgbmV4dDogWydhcHByJywnYXBwcicsJ2FwcHInLCdhcHByJywnZ3VydScsJ2d1cnUnLCdtYXN0JywnZW5saScsJ2J1cm4nXQogICAgICAgIH07CiAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iaXRlbV9pbmZvIGhpZGRlbiI+PC9kaXY+PHVsIGNsYXNzPSJpdGVtX2xpc3QiPic7CiAgICAgICAgZm9yICh2YXIgaXRlbV9pZHggaW4gYnVuZGxlLml0ZW1zKSB7CiAgICAgICAgICAgIHZhciBpdGVtID0gYnVuZGxlLml0ZW1zW2l0ZW1faWR4XTsKICAgICAgICAgICAgdmFyIGNsYXNzZXMgPSBbCiAgICAgICAgICAgICAgICBpdGVtLm9iamVjdC5zbGljZSgwLDMpLAogICAgICAgICAgICAgICAgc3JzX3RvX2NsYXNzW3NldHRpbmdzLnNyc19jdXJyX25leHRdW2l0ZW0uYXNzaWdubWVudHMuc3JzX3N0YWdlXSwKICAgICAgICAgICAgICAgICdsdmxncnAnK01hdGguZmxvb3IoKGl0ZW0uZGF0YS5sZXZlbC0xKS8xMCkKICAgICAgICAgICAgXTsKICAgICAgICAgICAgdmFyIGl0ZW1fbmFtZTsKICAgICAgICAgICAgaWYgKGl0ZW0ub2JqZWN0ID09PSAncmFkaWNhbCcpIHsKICAgICAgICAgICAgICAgIGlmIChpdGVtLmRhdGEuY2hhcmFjdGVycykgewogICAgICAgICAgICAgICAgICAgIGh0bWwgKz0gJzxsaSBjbGFzcz0iJytjbGFzc2VzLmpvaW4oJyAnKSsnIj4nK2l0ZW0uZGF0YS5jaGFyYWN0ZXJzKyc8L2xpPic7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGh0bWwgKz0gJzxsaSBjbGFzcz0iJytjbGFzc2VzLmpvaW4oJyAnKSsnIiBkYXRhLXJhZG5hbWU9IicraXRlbS5kYXRhLnNsdWcrJyI+Li4uPC9saT4nOwogICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvciA9ICcjdGltZWxpbmUgLnJldmlld19pbmZvIC5pdGVtX2xpc3QgPiBsaVtkYXRhLXJhZG5hbWU9IicraXRlbS5kYXRhLnNsdWcrJyJdJzsKICAgICAgICAgICAgICAgICAgICBsb2FkX3JhZGljYWxfc3ZnKGl0ZW0pLnRoZW4ocG9wdWxhdGVfcmFkaWNhbF9zdmcuYmluZChudWxsLCBzZWxlY3RvcikpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaHRtbCArPSAnPGxpIGNsYXNzPSInK2NsYXNzZXMuam9pbignICcpKyciPicraXRlbS5kYXRhLnNsdWcrJzwvbGk+JzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBodG1sICs9ICc8L3VsPic7CiAgICAgICAgcmV0dXJuIGh0bWw7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEluc2VydCBhbiBzdmcgaW50byBhIHNwZWNpZmllZCBET00gZWxlbWVudC4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gcG9wdWxhdGVfcmFkaWNhbF9zdmcoc2VsZWN0b3IsIHN2ZykgewogICAgICAgICQoc2VsZWN0b3IpLmh0bWwoc3ZnKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gRXZlbnQgaGFuZGxlciBmb3IgYnV0dG9ucyBvbiB0aGUgUmV2aWV3IEluZm8gcG9wLXVwLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBkZXRhaWxfYnV0dG9uX2NsaWNrZWQoZSkgewogICAgICAgIHZhciBtb2RlID0gZS50YXJnZXQuY2xhc3NOYW1lOwogICAgICAgICQoJyN0aW1lbGluZSAucmV2aWV3X2luZm8nKS5hdHRyKCdkYXRhLW1vZGUnLCBtb2RlKTsKICAgICAgICBzZXR0aW5ncy5yZXZpZXdfZGV0YWlsc19zdW1tYXJ5ID0gbW9kZTsKICAgICAgICBzYXZlX3NldHRpbmdzKCk7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEV2ZW50IGhhbmRsZXIgZm9yIGhvdmVyaW5nIG92ZXIgYW4gaXRlbSBpbiB0aGUgUmV2aWV3IERldGFpbCBwb3AtdXAuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIGl0ZW1faG92ZXIoZSkgewogICAgICAgIGlmIChzZXR0aW5ncy5zaG93X3Jldmlld19kZXRhaWxzICE9PSAnZnVsbCcpIHJldHVybjsKICAgICAgICB2YXIgaW5mbyA9ICQoJyN0aW1lbGluZSAuaXRlbV9pbmZvJyk7CiAgICAgICAgc3dpdGNoIChlLnR5cGUpIHsKICAgICAgICAgICAgY2FzZSAnbW91c2VlbnRlcic6CiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gJChlLmN1cnJlbnRUYXJnZXQpOwogICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBncmFwaC5jdXJyZW50X2J1bmRsZS5pdGVtc1t0YXJnZXQuaW5kZXgoKV07CiAgICAgICAgICAgICAgICB2YXIgcG9zID0gdGFyZ2V0LnBvc2l0aW9uKCk7CiAgICAgICAgICAgICAgICBpbmZvLmNzcyh7dG9wOnBvcy50b3ArdGFyZ2V0Lm91dGVySGVpZ2h0KCkrM30pOwogICAgICAgICAgICAgICAgcG9wdWxhdGVfaXRlbV9pbmZvKGluZm8sIGl0ZW0pOwogICAgICAgICAgICAgICAgaW5mby5yZW1vdmVDbGFzcygnaGlkZGVuJyk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgJ21vdXNlbGVhdmUnOgogICAgICAgICAgICAgICAgaW5mby5hZGRDbGFzcygnaGlkZGVuJyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEhhbmRsZXIgZm9yIHJlc2l6aW5nIHRoZSB0aW1lbGluZSB3aGVuIHRoZSB3aW5kb3cgc2l6ZSBjaGFuZ2VzLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiB3aW5kb3dfcmVzaXplZCgpIHsKICAgICAgICB2YXIgbmV3X3dpZHRoID0gZ3JhcGguZWxlbS53aWR0aCgpOwogICAgICAgIGlmIChuZXdfd2lkdGggIT0gZ3JhcGgueF9heGlzLndpZHRoICsgZ3JhcGgubWFyZ2luLmxlZnQpIHsKICAgICAgICAgICAgYnVuZGxlX2J5X3RpbWVzbG90KCk7CiAgICAgICAgICAgIGRyYXdfdGltZWxpbmUoKTsKICAgICAgICB9CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEdlbmVyYXRlIHRoZSBIVE1MIGNvbnRlbnQgb2YgdGhlIEl0ZW0gRGV0YWlsIHBvcC11cC4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgdmFyIHNyc19zdGFnZXMgPSBbJ0luaXRpYXRlJywgJ0FwcHJlbnRpY2UgMScsICdBcHByZW50aWNlIDInLCAnQXBwcmVudGljZSAzJywgJ0FwcHJlbnRpY2UgNCcsICdHdXJ1IDEnLCAnR3VydSAyJywgJ01hc3RlcicsICdFbmxpZ2h0ZW5lZCcsICdCdXJuZWQnXQogICAgZnVuY3Rpb24gcG9wdWxhdGVfaXRlbV9pbmZvKGluZm8sIGl0ZW0pIHsKICAgICAgICB2YXIgaHRtbDsKICAgICAgICBzd2l0Y2ggKGl0ZW0ub2JqZWN0KSB7CiAgICAgICAgICAgIGNhc2UgJ3JhZGljYWwnOgogICAgICAgICAgICAgICAgaWYgKGl0ZW0uZGF0YS5jaGFyYWN0ZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgaHRtbCA9ICc8c3BhbiBjbGFzcz0iaXRlbSI+UmFkaWNhbDogPHNwYW4gY2xhc3M9InNsdWciIGxhbmc9ImphIj4nK2l0ZW0uZGF0YS5jaGFyYWN0ZXJzKyc8L3NwYW4+PC9zcGFuPjxicj4nOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBodG1sID0gJzxzcGFuIGNsYXNzPSJpdGVtIj5SYWRpY2FsOiA8c3BhbiBjbGFzcz0ic2x1ZyIgZGF0YS1yYWRuYW1lPSInK2l0ZW0uZGF0YS5zbHVnKyciPi4uLjwvc3Bhbj48L3NwYW4+PGJyPic7CiAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdG9yID0gJyN0aW1lbGluZSAuaXRlbV9pbmZvIFtkYXRhLXJhZG5hbWU9IicraXRlbS5kYXRhLnNsdWcrJyJdJzsKICAgICAgICAgICAgICAgICAgICBsb2FkX3JhZGljYWxfc3ZnKGl0ZW0pLnRoZW4ocG9wdWxhdGVfcmFkaWNhbF9zdmcuYmluZChudWxsLCBzZWxlY3RvcikpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICdrYW5qaSc6CiAgICAgICAgICAgICAgICBodG1sID0gJzxzcGFuIGNsYXNzPSJpdGVtIj5LYW5qaTogPHNwYW4gY2xhc3M9InNsdWciIGxhbmc9ImphIj4nK2l0ZW0uZGF0YS5zbHVnKyc8L3NwYW4+PC9zcGFuPjxicj4nOwogICAgICAgICAgICAgICAgaHRtbCArPSBnZXRfaW1wb3J0YW50X3JlYWRpbmcoaXRlbSkrJzxicj4nOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICd2b2NhYnVsYXJ5JzoKICAgICAgICAgICAgICAgIGh0bWwgPSAnPHNwYW4gY2xhc3M9Iml0ZW0iPlZvY2FiOiA8c3BhbiBjbGFzcz0ic2x1ZyIgbGFuZz0iamEiPicraXRlbS5kYXRhLnNsdWcrJzwvc3Bhbj48L3NwYW4+PGJyPic7CiAgICAgICAgICAgICAgICBodG1sICs9ICdSZWFkaW5nOiAnK2dldF9yZWFkaW5nKGl0ZW0pKyc8YnI+JzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBodG1sICs9ICdNZWFuaW5nOiAnK2dldF9tZWFuaW5ncyhpdGVtKSsnPGJyPic7CiAgICAgICAgaHRtbCArPSAnTGV2ZWw6ICcraXRlbS5kYXRhLmxldmVsKyc8YnI+JzsKICAgICAgICBodG1sICs9ICdTUlMgTGV2ZWw6ICcraXRlbS5hc3NpZ25tZW50cy5zcnNfc3RhZ2UrJyAoJytzcnNfc3RhZ2VzW2l0ZW0uYXNzaWdubWVudHMuc3JzX3N0YWdlXSsnKSc7CiAgICAgICAgaW5mby5odG1sKGh0bWwpOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBMb2FkIGEgcmFkaWNhbCdzIHN2ZyBmaWxlLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBsb2FkX3JhZGljYWxfc3ZnKGl0ZW0pIHsKICAgICAgICB2YXIgcHJvbWlzZSA9IGdyYXBoLnJhZGljYWxfY2FjaGVbaXRlbS5kYXRhLnNsdWddOwogICAgICAgIGlmIChwcm9taXNlKSByZXR1cm4gcHJvbWlzZTsKICAgICAgICBpZiAoaXRlbS5kYXRhLmNoYXJhY3Rlcl9pbWFnZXMubGVuZ3RoID09PSAwKSByZXR1cm4gcHJvbWlzZTsKICAgICAgICB2YXIgdXJsID0gaXRlbS5kYXRhLmNoYXJhY3Rlcl9pbWFnZXMuZmlsdGVyKGZ1bmN0aW9uKGltZyl7CiAgICAgICAgICAgIHJldHVybiAoaW1nLmNvbnRlbnRfdHlwZSA9PT0gJ2ltYWdlL3N2Zyt4bWwnICYmICFpbWcubWV0YWRhdGEuaW5saW5lX3N0eWxlcyk7CiAgICAgICAgfSlbMF0udXJsOwogICAgICAgIHByb21pc2UgPSB3a29mLmxvYWRfZmlsZSh1cmwpOwogICAgICAgIGdyYXBoLnJhZGljYWxfY2FjaGVbaXRlbS5kYXRhLnNsdWddID0gcHJvbWlzZTsKICAgICAgICByZXR1cm4gcHJvbWlzZTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gRXh0cmFjdCB0aGUgbWVhbmluZ3MgKGluY2x1ZGluZyBzeW5vbnltcykgZnJvbSBhbiBpdGVtLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBnZXRfbWVhbmluZ3MoaXRlbSkgewogICAgICAgIHZhciBtZWFuaW5ncyA9IFtdOwogICAgICAgIGlmIChpdGVtLnN0dWR5X21hdGVyaWFscyAmJiBpdGVtLnN0dWR5X21hdGVyaWFscy5tZWFuaW5nX3N5bm9ueW1zKSB7CiAgICAgICAgICAgIG1lYW5pbmdzID0gaXRlbS5zdHVkeV9tYXRlcmlhbHMubWVhbmluZ19zeW5vbnltczsKICAgICAgICB9CiAgICAgICAgbWVhbmluZ3MgPSBtZWFuaW5ncy5jb25jYXQoaXRlbS5kYXRhLm1lYW5pbmdzLm1hcChtZWFuaW5nID0+IG1lYW5pbmcubWVhbmluZykpOwogICAgICAgIHJldHVybiB0b190aXRsZV9jYXNlKG1lYW5pbmdzLmpvaW4oJywgJykpOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBFeHRyYWN0IHRoZSAnaW1wb3J0YW50JyByZWFkaW5ncyBmcm9tIGEga2FuamkuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIGdldF9pbXBvcnRhbnRfcmVhZGluZyhpdGVtKSB7CiAgICAgICAgdmFyIHJlYWRpbmdzID0gaXRlbS5kYXRhLnJlYWRpbmdzLmZpbHRlcihyZWFkaW5nID0+IHJlYWRpbmcucHJpbWFyeSk7CiAgICAgICAgcmV0dXJuIHRvX3RpdGxlX2Nhc2UocmVhZGluZ3NbMF0udHlwZSkrJzogJytyZWFkaW5ncy5tYXAocmVhZGluZyA9PiByZWFkaW5nLnJlYWRpbmcpLmpvaW4oJywgJyk7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEV4dHJhY3QgdGhlIGxpc3Qgb2YgcmVhZGluZ3MgZnJvbSBhbiBpdGVtLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBnZXRfcmVhZGluZyhpdGVtKSB7CiAgICAgICAgcmV0dXJuIGl0ZW0uZGF0YS5yZWFkaW5ncy5tYXAocmVhZGluZyA9PiByZWFkaW5nLnJlYWRpbmcpLmpvaW4oJywgJyk7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEhpZGUgdGhlIFJldmlldyBJbmZvIHBvcC11cC4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gaGlkZV9yZXZpZXdfaW5mbygpIHsKICAgICAgICAkKCcjdGltZWxpbmUgLnJldmlld19pbmZvJykuYWRkQ2xhc3MoJ2hpZGRlbicpOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBHZW5lcmF0ZSBhIGZvcm1hdHRlZCBkYXRlIHN0cmluZy4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gZm9ybWF0X2RhdGUodGltZSwgYWxsb3dfbm93LCBzaG93X2RheSwgc2hvd19tb250aCkgewogICAgICAgIHZhciBzdHIgPSAnJzsKICAgICAgICBpZiAoYWxsb3dfbm93ICYmIHRpbWUuZ2V0VGltZSgpID49IGdyYXBoLnN0YXJ0X3RpbWUuZ2V0VGltZSgpKSByZXR1cm4gJ05vdyc7CiAgICAgICAgaWYgKHNob3dfZGF5KSB7CiAgICAgICAgICAgIGlmIChuZXcgRGF0ZSh0aW1lKS5zZXRIb3VycygwLDAsMCwwKSA9PT0gKG5ldyBEYXRlKCkpLnNldEhvdXJzKDAsMCwwLDApKSB7CiAgICAgICAgICAgICAgICBzdHIgPSAnVG9kYXknOwogICAgICAgICAgICAgICAgc2hvd19tb250aCA9IGZhbHNlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc3RyID0gJ1N1bk1vblR1ZVdlZFRodUZyaVNhdCcuc3Vic3RyKHRpbWUuZ2V0RGF5KCkqMywgMyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHNob3dfbW9udGgpIHsKICAgICAgICAgICAgICAgIHN0ciArPSAnLCAnICsgJ0phbkZlYk1hckFwck1heUp1bkp1bEF1Z1NlcE9jdE5vdkRlYycuc3Vic3RyKHRpbWUuZ2V0TW9udGgoKSozLCAzKSArICcgJyArIHRpbWUuZ2V0RGF0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChzZXR0aW5ncy50aW1lX2Zvcm1hdCA9PT0gJzI0aG91cicpIHsKICAgICAgICAgICAgc3RyICs9ICcgJyArICgnMCcgKyB0aW1lLmdldEhvdXJzKCkpLnNsaWNlKC0yKSArICc6JyArICgnMCcrdGltZS5nZXRNaW51dGVzKCkpLnNsaWNlKC0yKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdHIgKz0gJyAnICsgKCcwJyArICgoKHRpbWUuZ2V0SG91cnMoKSsxMSklMTIpKzEpKS5zbGljZSgtMikgKyAnOicrKCcwJyt0aW1lLmdldE1pbnV0ZXMoKSkuc2xpY2UoLTIpICsgJ2FwJ1tNYXRoLmZsb29yKHRpbWUuZ2V0SG91cnMoKS8xMildICsgJ20nOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3RyOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBGZXRjaCBpdGVtIGluZm8sIGFuZCByZWRyYXcgdGhlIHRpbWVsaW5lLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBmZXRjaF9hbmRfdXBkYXRlKCkgewogICAgICAgIHJldHVybiB3a29mLkl0ZW1EYXRhLmdldF9pdGVtcygnc3ViamVjdHMsIGFzc2lnbm1lbnRzLCBzdHVkeV9tYXRlcmlhbHMnKQogICAgICAgIC50aGVuKHByb2Nlc3NfaXRlbXMpCiAgICAgICAgLnRoZW4oZHJhd190aW1lbGluZSk7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFByb2Nlc3MgdGhlIGZldGNoZWQgaXRlbXMuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHByb2Nlc3NfaXRlbXMoZmV0Y2hlZF9pdGVtcykgewogICAgICAgIC8vIFJlbW92ZSBhbnkgdW5sZWFybmVkIGl0ZW1zLgogICAgICAgIGdyYXBoLml0ZW1zID0gW107CiAgICAgICAgZm9yICh2YXIgaWR4IGluIGZldGNoZWRfaXRlbXMpIHsKICAgICAgICAgICAgdmFyIGl0ZW0gPSBmZXRjaGVkX2l0ZW1zW2lkeF07CiAgICAgICAgICAgIGlmICghaXRlbS5hc3NpZ25tZW50cyB8fCAhaXRlbS5hc3NpZ25tZW50cy5hdmFpbGFibGVfYXQgfHwgaXRlbS5hc3NpZ25tZW50cy5zcnNfc3RhZ2UgPD0gMCkgY29udGludWU7CiAgICAgICAgICAgIGlmIChpdGVtLmRhdGEubGV2ZWwgPiB3a29mLnVzZXIubGV2ZWwpIGNvbnRpbnVlOwogICAgICAgICAgICBncmFwaC5pdGVtcy5wdXNoKGl0ZW0pOwogICAgICAgIH0KCiAgICAgICAgZ3JhcGguaXRlbXMuc29ydChmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgICAgIHJldHVybiAobmV3IERhdGUoYS5hc3NpZ25tZW50cy5hdmFpbGFibGVfYXQpLmdldFRpbWUoKSAtIG5ldyBEYXRlKGIuYXNzaWdubWVudHMuYXZhaWxhYmxlX2F0KS5nZXRUaW1lKCkpOwogICAgICAgIH0pOwoKICAgICAgICBidW5kbGVfYnlfdGltZXNsb3QoKTsKICAgICAgICB1cGRhdGVfc2xpZGVyX3Jldmlld3MoKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gQnVuZGxlIHRoZSBpdGVtcyBpbnRvIHRpbWVzbG90cy4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gYnVuZGxlX2J5X3RpbWVzbG90KCkgewogICAgICAgIHZhciBidW5kbGVfc2l6ZSA9IGdyYXBoLmJ1bmRsZV9zaXplID0gZ2V0X2hvdXJzX3Blcl9iYXIoKTsKICAgICAgICB2YXIgYnVuZGxlcyA9IGdyYXBoLmJ1bmRsZXMgPSBbXTsKICAgICAgICB2YXIgdGltZXNsb3RzID0gZ3JhcGgudGltZXNsb3RzID0gW107CgogICAgICAgIC8vIFJld2luZCB0aGUgY2xvY2sgdG8gdGhlIHN0YXJ0IG9mIGEgYnVuZGxlIHBlcmlvZC4KICAgICAgICB2YXIgc3RhcnRfdGltZSA9IHRvU3RhcnRPZlVUQ0hvdXIobmV3IERhdGUoKSk7CiAgICAgICAgd2hpbGUgKHN0YXJ0X3RpbWUuZ2V0SG91cnMoKSAlIGJ1bmRsZV9zaXplICE9PSAwKSBzdGFydF90aW1lID0gbmV3IERhdGUoc3RhcnRfdGltZS5nZXRUaW1lKCkgLSAzNjAwMDAwKTsKICAgICAgICBncmFwaC5zdGFydF90aW1lID0gc3RhcnRfdGltZTsKCiAgICAgICAgLy8gRmluZCB0aGUgdGljIG9mIHRoZSBsYXN0IGJ1bmRsZSAocm91bmQgZG93biBpZiBvbmx5IGEgcGFydGlhbCkuCiAgICAgICAgZ3JhcGgudG90YWxfcmV2aWV3cyA9IDA7CiAgICAgICAgZ3JhcGgubWF4X3Jldmlld3MgPSAwOwogICAgICAgIHZhciBob3VyID0gMCwgaXRlbV9pZHggPSAwLCBpdGVtX2NvdW50ID0gMDsKICAgICAgICB2YXIgYnVuZGxlID0ge3N0YXJ0X3RpbWU6aG91ciwgaXRlbXM6W119OwogICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgIHRpbWVzbG90cy5wdXNoKGJ1bmRsZXMubGVuZ3RoKTsKICAgICAgICAgICAgaG91cisrOwogICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSdyZSBwYXN0IGVuZCBvZiB0aGUgdGltZWxpbmUgKGluY2x1ZGluZyByb3VuZGluZyB1cCB0byB0aGUgbmVhcmVzdCBidW5kbGUpCiAgICAgICAgICAgIC8vIE5lZWQgdG8gdXNlIGRhdGUgZnVuY3Rpb24gdG8gYWNjb3VudCBmb3IgdGltZSBzaGlmdHMgKGUuZy4gRGF5bGlnaHQgU2F2aW5ncyBUaW1lKQogICAgICAgICAgICB2YXIgdGltZSA9IG5ldyBEYXRlKHN0YXJ0X3RpbWUuZ2V0VGltZSgpICsgaG91ciAqIDM2MDAwMDApOwogICAgICAgICAgICBpZiAoKHRpbWUuZ2V0SG91cnMoKSAlIGJ1bmRsZV9zaXplKSAhPT0gMCkgY29udGludWU7CgogICAgICAgICAgICB2YXIgc3RhcnRfaWR4ID0gaXRlbV9pZHg7CiAgICAgICAgICAgIHdoaWxlICgoaXRlbV9pZHggPCBncmFwaC5pdGVtcy5sZW5ndGgpICYmCiAgICAgICAgICAgICAgICAgICAobmV3IERhdGUoZ3JhcGguaXRlbXNbaXRlbV9pZHhdLmFzc2lnbm1lbnRzLmF2YWlsYWJsZV9hdCkgPCB0aW1lKSkgewogICAgICAgICAgICAgICAgaXRlbV9pZHgrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYnVuZGxlLml0ZW1zID0gZ3JhcGguaXRlbXMuc2xpY2Uoc3RhcnRfaWR4LCBpdGVtX2lkeCk7CiAgICAgICAgICAgIGJ1bmRsZS5lbmRfdGltZSA9IGhvdXI7CiAgICAgICAgICAgIGNhbGNfYnVuZGxlX3N0YXRzKGJ1bmRsZSk7CiAgICAgICAgICAgIGdyYXBoLmJ1bmRsZXMucHVzaChidW5kbGUpOwoKICAgICAgICAgICAgZ3JhcGgudG90YWxfcmV2aWV3cyArPSBidW5kbGUuaXRlbXMubGVuZ3RoOwogICAgICAgICAgICBpZiAoYnVuZGxlLml0ZW1zLmxlbmd0aCA+IGdyYXBoLm1heF9yZXZpZXdzKSBncmFwaC5tYXhfcmV2aWV3cyA9IGJ1bmRsZS5pdGVtcy5sZW5ndGg7CiAgICAgICAgICAgIGlmIChob3VyID49IGdyYXBoLnhfYXhpcy5tYXhfaG91cnMpIGJyZWFrOwoKICAgICAgICAgICAgYnVuZGxlID0ge3N0YXJ0X3RpbWU6aG91ciwgaXRlbXM6W119OwogICAgICAgIH0KICAgICAgICBncmFwaC54X2F4aXMubWF4X2hvdXJzID0gaG91cjsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gQ2FsY3VsYXRlIHN0YXRzIGZvciBhIGJ1bmRsZQogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBjYWxjX2J1bmRsZV9zdGF0cyhidW5kbGUpIHsKICAgICAgICB2YXIgaXR5cGVfdG9faW50ID0ge3JhZGljYWw6MCwga2Fuamk6MSwgdm9jYWJ1bGFyeToyfTsKICAgICAgICB2YXIgaXR5cGVfdG9fY2xhc3MgPSB7cmFkaWNhbDoncmFkJywga2Fuamk6J2thbicsIHZvY2FidWxhcnk6J3ZvYyd9OwogICAgICAgIHZhciBzcnNfdG9fY2xhc3MgPSB7CiAgICAgICAgICAgIGN1cnI6IFsnYXBwcicsJ2FwcHInLCdhcHByJywnYXBwcicsJ2FwcHInLCdndXJ1JywnZ3VydScsJ21hc3QnLCdlbmxpJ10sCiAgICAgICAgICAgIG5leHQ6IFsnYXBwcicsJ2FwcHInLCdhcHByJywnYXBwcicsJ2d1cnUnLCdndXJ1JywnbWFzdCcsJ2VubGknLCdidXJuJ10KICAgICAgICB9OwogICAgICAgIGJ1bmRsZS5pdGVtcy5zb3J0KGZ1bmN0aW9uKGEsIGIpewogICAgICAgICAgICB2YXIgYV9pdHlwZSA9IGl0eXBlX3RvX2ludFthLm9iamVjdF07CiAgICAgICAgICAgIHZhciBiX2l0eXBlID0gaXR5cGVfdG9faW50W2Iub2JqZWN0XTsKICAgICAgICAgICAgaWYgKGFfaXR5cGUgIT09IGJfaXR5cGUpIHJldHVybiBhX2l0eXBlIC0gYl9pdHlwZTsKICAgICAgICAgICAgaWYgKGEuZGF0YS5sZXZlbCAhPT0gYi5kYXRhLmxldmVsKSByZXR1cm4gYS5kYXRhLmxldmVsIC0gYi5kYXRhLmxldmVsOwogICAgICAgICAgICByZXR1cm4gYS5kYXRhLnNsdWcubG9jYWxlQ29tcGFyZShiLmRhdGEuc2x1Zyk7CiAgICAgICAgfSk7CiAgICAgICAgYnVuZGxlLnN0YXRzID0gewogICAgICAgICAgICBjb3VudDowLAogICAgICAgICAgICByYWQ6MCwga2FuOjAsIHZvYzowLAogICAgICAgICAgICBhcHByOjAsIGd1cnU6MCwgbWFzdDowLCBlbmxpOjAsIGJ1cm46MCwKICAgICAgICAgICAgbHZsZ3JwMDowLCBsdmxncnAxOjAsIGx2bGdycDI6MCwgbHZsZ3JwMzowLCBsdmxncnA0OjAsIGx2bGdycDU6MCwKICAgICAgICAgICAgY3Vycl9jb3VudDogMCwKICAgICAgICAgICAgaGFzX2N1cnJfbWFya2VyOiBmYWxzZSwKICAgICAgICAgICAgYnVybl9jb3VudDogMAogICAgICAgIH07CiAgICAgICAgdmFyIHN0YXRzID0gYnVuZGxlLnN0YXRzOwogICAgICAgIGZvciAodmFyIGl0ZW1faWR4IGluIGJ1bmRsZS5pdGVtcykgewogICAgICAgICAgICB2YXIgaXRlbSA9IGJ1bmRsZS5pdGVtc1tpdGVtX2lkeF07CiAgICAgICAgICAgIHN0YXRzLmNvdW50Kys7CiAgICAgICAgICAgIHN0YXRzW2l0eXBlX3RvX2NsYXNzW2l0ZW0ub2JqZWN0XV0rKzsKICAgICAgICAgICAgc3RhdHNbc3JzX3RvX2NsYXNzW3NldHRpbmdzLnNyc19jdXJyX25leHRdW2l0ZW0uYXNzaWdubWVudHMuc3JzX3N0YWdlXV0rKzsKICAgICAgICAgICAgc3RhdHNbJ2x2bGdycCcrTWF0aC5mbG9vcigoaXRlbS5kYXRhLmxldmVsLTEpLzEwKV0rKzsKICAgICAgICAgICAgaWYgKGl0ZW0uZGF0YS5sZXZlbCA9PT0gd2tvZi51c2VyLmxldmVsKSB7CiAgICAgICAgICAgICAgICBzdGF0cy5jdXJyX2NvdW50Kys7CiAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuY3VycmVudF9sZXZlbF9tYXJrZXJzLmluZGV4T2YoaXRlbS5vYmplY3RbMF0pID49IDApIHsKICAgICAgICAgICAgICAgICAgICBzdGF0cy5oYXNfY3Vycl9tYXJrZXIgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGJ1bmRsZS5zdGF0cy5idXJuX2NvdW50ID0gYnVuZGxlLnN0YXRzW3Nyc190b19jbGFzc1tzZXR0aW5ncy5zcnNfY3Vycl9uZXh0XVs4XV07CiAgICAgICAgZ3JhcGguY3VycmVudF9idW5kbGUgPSBidW5kbGU7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFJldHVybiB0aGUgdGltZXN0YW1wIG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgVVRDIGhvdXIuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHRvU3RhcnRPZlVUQ0hvdXIoZGF0ZSkgewogICAgICAgIHZhciBkID0gKGRhdGUgaW5zdGFuY2VvZiBEYXRlID8gZGF0ZS5nZXRUaW1lKCkgOiBkYXRlKTsKICAgICAgICBkID0gTWF0aC5mbG9vcihkLzM2MDAwMDApKjM2MDAwMDA7CiAgICAgICAgcmV0dXJuIChkYXRlIGluc3RhbmNlb2YgRGF0ZSA/IG5ldyBEYXRlKGQpIDogZCk7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFN0YXJ0IGEgdGltZXIgdG8gcmVmcmVzaCB0aGUgdGltZWxpbmUgKHdpdGhvdXQgZmV0Y2gpIGF0IHRoZSB0b3Agb2YgdGhlIGhvdXIuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHN0YXJ0X3JlZnJlc2hfdGltZXIoKSB7CiAgICAgICAgdmFyIG5vdyA9IERhdGUubm93KCk7CiAgICAgICAgdmFyIG5leHRfaG91ciA9IHRvU3RhcnRPZlVUQ0hvdXIobm93KSArIDM2MDEwMDA7IC8vIDEgc2Vjb25kIHBhc3QgdGhlIG5leHQgVVRDIGhvdXIuCiAgICAgICAgdmFyIHdhaXRfdGltZSA9IChuZXh0X2hvdXIgLSBub3cpOwogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgICAgICAgICAgYnVuZGxlX2J5X3RpbWVzbG90KCk7CiAgICAgICAgICAgIHVwZGF0ZV9zbGlkZXJfcmV2aWV3cygpOwogICAgICAgICAgICBkcmF3X3RpbWVsaW5lKCk7CiAgICAgICAgICAgIHN0YXJ0X3JlZnJlc2hfdGltZXIoKTsKICAgICAgICB9LCB3YWl0X3RpbWUpOwogICAgfQoKfSkod2luZG93LnRpbWVsaW5lKTsK"},{"name":"WaniKani LevelUP Celebrator","options":{"check_for_updates":true,"comment":null,"compatopts_for_requires":true,"compat_wrappedjsobject":false,"compat_metadata":false,"compat_foreach":false,"compat_arrayleft":false,"compat_uW_gmonkey":false,"compat_forvarin":false,"noframes":null,"awareOfChrome":false,"run_at":null,"override":{"use_includes":[],"orig_includes":["https://www.wanikani.com/","https://www.wanikani.com/dashboard"],"merge_includes":true,"use_matches":[],"orig_matches":[],"merge_matches":true,"use_excludes":[],"orig_excludes":[],"merge_excludes":true,"use_connects":[],"merge_connects":true,"use_blockers":[],"orig_run_at":"document-end","orig_noframes":null,"orig_connects":[]}},"storage":{"ts":1588770711067,"data":{}},"enabled":true,"position":4,"file_url":"https://greasyfork.org/scripts/233-wanikani-levelup-celebrator/code/WaniKani%20LevelUP%20Celebrator.user.js","uuid":"c263f0d7-79a8-4cec-b4c7-e4729456fc3e","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICAgV2FuaUthbmkgTGV2ZWxVUCBDZWxlYnJhdG9yCi8vIEBuYW1lc3BhY2UgICAgIGh0dHBzOi8vd3d3LndhbmlrYW5pLmNvbQovLyBAZGVzY3JpcHRpb24gICBUaGlzIHdpbGwgZGlzcGxheSBhICJsZXZlbC11cCIgbm90aWZpY2F0aW9uIG9uIHlvdXIgV0sgRGFzaGJvYXJkIGFmdGVyIHlvdSBsZXZlbCB1cC4gIFlvdSBjYW4gY3VzdG9taXplIHRoZSBpbWFnZSBhbmQgdGV4dCBvZiB0aGUgZGlzcGxheS4gIE90aGVyIGFjaGlldmVtZW50cyBhcmUgYWxzbyBub3RlZC4gIEJ5IFJob3NWZWVkY3kuCi8vIEB2ZXJzaW9uIDIuNC4wCi8vIEBpbmNsdWRlICAgICAgIGh0dHBzOi8vd3d3LndhbmlrYW5pLmNvbS8KLy8gQGluY2x1ZGUgICAgICAgaHR0cHM6Ly93d3cud2FuaWthbmkuY29tL2Rhc2hib2FyZAovLyBAcnVuLWF0CSAgZG9jdW1lbnQtZW5kCi8vIEBncmFudAkgIEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQKCi8vID09L1VzZXJTY3JpcHQ9PQoKZnVuY3Rpb24gZ2V0KGlkKSB7CiAgICBjb25zb2xlLmxvZygnZ2V0IGZjdCcpOwogICAgaWYgKGlkICYmIHR5cGVvZiBpZCA9PT0gJ3N0cmluZycpIHsKCWNvbnNvbGUubG9nKGlkKTsKICAgICAgICBpZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsKICAgIH0KICAgIHJldHVybiBpZCB8fCBudWxsOwp9CgoKZnVuY3Rpb24gR01zZXR1cCgpIHsKICBpZiAoR01fcmVnaXN0ZXJNZW51Q29tbWFuZCkgewogICAgR01fcmVnaXN0ZXJNZW51Q29tbWFuZCgnV2FuaUthbmkgTGV2ZWxVUCBDZWxlYnJhdG9yOiBTZXQgaW1hZ2UgVVJMJywgZnVuY3Rpb24oKSB7CiAgICAgIHZhciBjdXJFbnRyeSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJXS2x2bHVwSW1nVVJMIikgfHwgIiI7CiAgICAgIHZhciBuZXdJbWdVUkwgPSBwcm9tcHQoJ05ldyBJbWFnZSBVUkw6JywgY3VyRW50cnkpOwogICAgICBpZiAobmV3SW1nVVJMICE9IG51bGwpIHsKCWlmICh0eXBlb2YobmV3SW1nVVJMKSAhPT0gInN0cmluZyIpIHsKCQluZXdJbWdVUkwgPSBTdHJpbmcobmV3SW1nVVJMKTsKCX0KICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiV0tsdmx1cEltZ1VSTCIsIG5ld0ltZ1VSTCk7CiAgICAgIH0KICAgIH0pOwoKICAgIEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQoJ1dhbmlLYW5pIExldmVsVVAgQ2VsZWJyYXRvcjogU2V0IGltYWdlIHBvc2l0aW9uJywgZnVuY3Rpb24oKSB7CiAgICAgIHZhciBjdXJFbnRyeSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJXS2x2bHVwSW1nUG9zIikgfHwgIkxlZnQiOwogICAgICB2YXIgbmV3SW1nUG9zID0gcHJvbXB0KCdJbWFnZSBwb3NpdGlvbiByZWxhdGl2ZSB0byB0ZXh0IChsZWZ0LCByaWdodCwgYWJvdmUsIGJlbG93KTonLCBjdXJFbnRyeSk7CiAgICAgIGlmIChuZXdJbWdQb3MgIT0gbnVsbCkgewoJaWYgKHR5cGVvZihuZXdJbWdQb3MpICE9PSAic3RyaW5nIikgewoJCW5ld0ltZ1BvcyA9IFN0cmluZyhuZXdJbWdQb3MpOwoJfQogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJXS2x2bHVwSW1nUG9zIiwgbmV3SW1nUG9zKTsKICAgICAgfQogICAgfSk7CgogICAgR01fcmVnaXN0ZXJNZW51Q29tbWFuZCgnV2FuaUthbmkgTGV2ZWxVUCBDZWxlYnJhdG9yOiBTZXQgdGV4dCcsIGZ1bmN0aW9uKCkgewogICAgICB2YXIgY3VyRW50cnkgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiV0tsdmx1cFRleHQiKSB8fCAiIjsKICAgICAgdmFyIG5ld1RleHQgPSBwcm9tcHQoJ05ldyB0ZXh0OicsIGN1ckVudHJ5KTsKICAgICAgaWYgKG5ld1RleHQgIT0gbnVsbCkgewoJaWYgKHR5cGVvZihuZXdUZXh0KSAhPT0gInN0cmluZyIpIHsKCQluZXdUZXh0ID0gU3RyaW5nKG5ld1RleHQpOwoJfQogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJXS2x2bHVwVGV4dCIsIG5ld1RleHQpOwogICAgICB9CiAgICB9KTsKCiAgICBHTV9yZWdpc3Rlck1lbnVDb21tYW5kKCdXYW5pS2FuaSBMZXZlbFVQIENlbGVicmF0b3I6IFByZXZpZXcnLCBmdW5jdGlvbigpIHsKCXNlc3Npb25TdG9yYWdlLnNldEl0ZW0oIldLbHZsdXBQcmV2aWV3IiwgMSk7Cglsb2NhdGlvbi5yZWxvYWQoKTsKICAgIH0pOwoKICB9Cn0KCgpmdW5jdGlvbiBjaGVja0xldmVsKCkgewoKCWNvbnNvbGUubG9nKCJjaGVja0xldmVsKCkgc3RhcnQiKTsKCgl2YXIgbGFzdEtub3duTGV2ZWwgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiV0tsdmx1cFByZXZMZXZlbCIpIHx8IDE7CiAgICB2YXIgbGV2ZWxUZXh0ID0gJCgnbGkudXNlci1zdW1tYXJ5X19hdHRyaWJ1dGUgYScpWzBdLmhyZWYuc3BsaXQoJy9sZXZlbC8nKVsxXTsKICAgIHZhciBjdXJsZXZlbCA9IChsZXZlbFRleHQ/IGxldmVsVGV4dDogbGFzdEtub3duTGV2ZWwpOwoKICAgIGNvbnNvbGUubG9nKCJsZXZlbFRleHQ6ICIsIGxldmVsVGV4dCk7CiAgICBjb25zb2xlLmxvZygiY3VybGV2ZWw6ICIsIGN1cmxldmVsKTsKCgl2YXIgcHJldiA9IE51bWJlcihsYXN0S25vd25MZXZlbCk7Cgl2YXIgY3VyICA9IE51bWJlcihjdXJsZXZlbCk7Cgl2YXIgbmV4dCA9IHByZXYgKyAxOwoKCWlmIChjdXIgPT0gbmV4dCkgeyAKCQljb25zb2xlLmxvZygibGV2ZWxlZCB1cCEiKTsKCQl2YXIgZCA9IG5ldyBEYXRlKCk7CgkJdmFyIG4gPSBkLmdldFRpbWUoKTsKCQlsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiV0tsdmx1cExldlRpbWUiLCBuKTsgLy8gcmVjb3JkIGxldmVsLXVwIHRpbWUKCQlsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiV0tsdmx1cFByZXZMZXZlbCIsIGN1cik7ICAvLyB1cGRhdGUgJ2xhc3RLbm93bkxldmVsJyBmb3IgbmV4dCB0aW1lCgoJfSBlbHNlIGlmIChjdXIgIT0gcHJldikgewoJCS8vIGVpdGhlciB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlJ3JlIHJ1bm5pbmcsIG9yIHRoZXJlJ3MgYSBkaWZmZXJlbnQgdXNlciBoZXJlLCAKCQkvLyBvciB0aGUgdXNlcidzIHN1YnNjcmlwdGlvbiBzdGF0dXMgaGFzIGNoYW5nZWQsIG9yIHNvbWV0aGluZyBlbHNlIHdlaXJkIGlzIGdvaW5nIG9uOwoKCQkvLyBpZiBjdXIgPT0gMiwgYXNzdW1lIHRoZSB1c2VyJ3Mgc3Vic2NyaXB0aW9uIGV4cGlyZWQ7IGxlYXZlIGV2ZXJ5dGhpbmcgYmUgYW5kIHdhaXQgZm9yIHJlbmV3YWwuIE90aGVyd2lzZSwKCgkJaWYgKGN1ciAhPSAyIHx8ICEgbG9jYWxTdG9yYWdlLmdldEl0ZW0oIldLbHZsdXBQcmV2TGV2ZWwiKSkgeyAKCgkJCS8vIGNsZWFyIFdLbHZsdXBMZXZUaW1lIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBkaXNwbGF5IHRoZSBsZXZlbC11cCBtZXNzYWdlCgkJCWNvbnNvbGUubG9nKCJyZWluaXRpYWxpemluZyIpOwoJCQlsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiV0tsdmx1cExldlRpbWUiLCAwKTsKCQkJbG9jYWxTdG9yYWdlLnNldEl0ZW0oIldLbHZsdXBQcmV2TGV2ZWwiLCBjdXIpOyAgLy8gdXBkYXRlICdsYXN0S25vd25MZXZlbCcgZm9yIG5leHQgdGltZQoKCQkJLy8gYWxzbyByZWluaXRpYWxpemUgdGhlIG5leHRNaWxlc3RvbmVzIGFycmF5CgkJCWluaXRpYWxpemVNaWxlc3RvbmVzKCk7CgoJCX0KCgl9IC8vZWxzZSBjdXIgPT0gcHJldiwgc28gJ2xhc3RLbm93bkxldmVsJyBpcyBzdGlsbCBjb3JyZWN0IChvciBpdCB3aWxsIGNvbnRpbnVlIHRvIGRlZmF1bHQgdG8gMSBpZiBpdCBoYXNuJ3QgYmVlbiBzdG9yZWQgeWV0KQoKCWNvbnNvbGUubG9nKCJwcmV2IGxldmVsOiAiLCBwcmV2KTsKCWNvbnNvbGUubG9nKCJjdXIgbGV2ZWw6ICIsIGN1cik7Cgljb25zb2xlLmxvZygibmV4dCBsZXZlbDogIiwgbmV4dCk7Cgljb25zb2xlLmxvZygiY2hlY2tMZXZlbCgpIGVuZCIpOwoKCXJldHVybiBjdXI7Cn0KCgoKZnVuY3Rpb24gc2hvdWxkRGlzcGxheSgpIHsKCgljb25zb2xlLmxvZygnc2hvdWxkRGlzcGxheSgpIHN0YXJ0Jyk7CgoJdmFyIGxldlRpbWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiV0tsdmx1cExldlRpbWUiKSB8fCAwOwoJdmFyIHJhd2R1ciA9IDEwOyAgLy8gbmV3IGxldmVsIGRpc3BsYXkgaXMgZW5hYmxlZCBmb3IgMTAgbWludXRlcyBhZnRlciBmaXJzdCBkaXNwbGF5IHRpbWUKCXZhciBkID0gbmV3IERhdGUoKTsKCXZhciBub3cgPSBkLmdldFRpbWUoKTsKCXZhciByZXR2YWw7Cgl2YXIgZHVyYXRpb24gPSBOdW1iZXIocmF3ZHVyKTsKCXZhciBwcmV2aWV3ID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgiV0tsdmx1cFByZXZpZXciKTsKCgl2YXIgdGhlVHh0ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oIldLbHZsdXBUZXh0Iik7CgoJY29uc29sZS5sb2coIm5vdyA9ICIsIG5vdyk7Cgljb25zb2xlLmxvZygibGV2VGltZSA9ICIsIGxldlRpbWUpOwoJY29uc29sZS5sb2coInJhd2R1ciA9ICIsIHJhd2R1cik7Cgljb25zb2xlLmxvZygiZHVyYXRpb24gbWludXRlcyA9ICIsIGR1cmF0aW9uKTsKCglpZiAocHJldmlldyAmJiBwcmV2aWV3ID09IDEpIHsKCQljb25zb2xlLmxvZygiUHJldmlldyBlbmFibGVkLCBkaXNwbGF5IGl0Iik7CgkJc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgiV0tsdmx1cFByZXZpZXciLCAwKTsJLy8gb25jZSBvbmx5CgkJcmV0dXJuIDE7Cgl9CgoJaWYgKHRoZVR4dCAmJiB0aGVUeHQuc3Vic3RyaW5nKDAsIDgpID09ICIlI1RFU1QlIyIpIHsKCQljb25zb2xlLmxvZygidGV4dCBiZWdpbnMgd2l0aCAlI1RFU1QlIywgYWx3YXlzIGRpc3BsYXkiKTsKCQlyZXR1cm4gMTsKCX0KCQoJZHVyYXRpb24gKj0gNjAwMDA7IC8vIGNvbnZlcnQgdG8gbWlsbGlzZWNvbmRzCgoJY29uc29sZS5sb2coImR1cmF0aW9uIG1zZWMgPSAiLCBkdXJhdGlvbik7CgoJY29uc29sZS5sb2coIm5vdyAtIGxldlRpbWUgPSAiLCBub3cgLSBsZXZUaW1lKTsKCglpZiAoKG5vdyAtIGxldlRpbWUpIDw9IGR1cmF0aW9uKSB7CgkJcmV0dmFsID0gMTsKCX0gZWxzZSB7CgkJcmV0dmFsID0gMDsKCX0KCgljb25zb2xlLmxvZygicmV0dmFsID0gIiwgcmV0dmFsKTsKCgljb25zb2xlLmxvZygnc2hvdWxkRGlzcGxheSgpIGVuZCcpOwoJcmV0dXJuIHJldHZhbDsKfQoKCgpmdW5jdGlvbiBkaXNwbGF5TGV2ZWxVcE1lc3NhZ2UgKCBjdXJMZXZlbCApIHsKCWNvbnNvbGUubG9nKCdkaXNwbGF5TGV2ZWxVcE1lc3NhZ2UoKSBzdGFydCcpOwoJdmFyIG1zZyA9IGdldCgic2VhcmNoIik7CiAgICAJdmFyIHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKIAl2YXIgdGhlSW1nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oIldLbHZsdXBJbWdVUkwiKTsKIAl2YXIgdGhlUG9zID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oIldLbHZsdXBJbWdQb3MiKSB8fCAiTEVGVCI7Cgl2YXIgdGhlVHh0ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oIldLbHZsdXBUZXh0Iik7CgogICAgc3dpdGNoKHRoZVBvcy50b1VwcGVyQ2FzZSgpKSB7CgogICAgICAgIGNhc2UgIkJFTE9XIjoKICAgICAgICBjYXNlICJVTkRFUiI6CiAgICAgICAgY2FzZSAiVU5ERVJORUFUSCI6CiAgICAgICAgY2FzZSAiRE9XTiI6CiAgICAgICAgY2FzZSAiQk9UVE9NIjoKICAgICAgICBjYXNlICLjgZfjgZ8iOgogICAgICAgIGNhc2UgIuS4iyI6CiAgICAgICAgICAgIHQuaW5uZXJIVE1MID0gJzxkaXYgaWQ9IldLbHZsdXBUeHQiIHN0eWxlPSJtYXJnaW46YXV0bzt0ZXh0LWFsaWduOmNlbnRlcjtsaW5lLWhlaWdodDoxMTAlO2ZvbnQtc2l6ZTozMDAlIj4gPC9kaXY+JysKICAgICAgICAgICAgICAgICc8aW1nIGlkPSJXS2x2bHVwSW1nIiBzdHlsZT0iZGlzcGxheTpibG9jazttYXJnaW46YXV0byI+IDwvaW1nPicrCiAgICAgICAgCQknPC9kaXY+JzsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgIkFCT1ZFIjoKICAgICAgICBjYXNlICJUT1AiOgogICAgICAgIGNhc2UgIlVQIjoKICAgICAgICBjYXNlICJPVkVSIjoKICAgICAgICBjYXNlICJPTiBUT1AgT0YiOgogICAgICAgIGNhc2UgIkNFTlRFUiI6CiAgICAgICAgY2FzZSAiQ0VOVEVSRUQiOgogICAgICAgIGNhc2UgIuOBhuOBiCI6CiAgICAgICAgY2FzZSAi5LiKIjoKICAgICAgICBjYXNlICLjgarjgYsiOgogICAgICAgIGNhc2UgIuS4rSI6CiAgICAgICAgY2FzZSAi44Gh44KF44GG44GK44GGIjoKICAgICAgICBjYXNlICLkuK3lpK4iOgogICAgICAgICAgICB0LmlubmVySFRNTCA9ICc8aW1nIGlkPSJXS2x2bHVwSW1nIiBzdHlsZT0iZGlzcGxheTpibG9jazttYXJnaW46YXV0byI+IDwvaW1nPicrCiAgICAgICAgICAgICAgICAnPGRpdiBpZD0iV0tsdmx1cFR4dCIgc3R5bGU9Im1hcmdpbjphdXRvO3RleHQtYWxpZ246Y2VudGVyO2xpbmUtaGVpZ2h0OjExMCU7Zm9udC1zaXplOjMwMCUiPiA8L2Rpdj4nKwogICAgICAgIAkJJzwvZGl2Pic7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICJMRUZUIjoKICAgICAgICBjYXNlICJBVCBMRUZUIjoKICAgICAgICBjYXNlICJPTiBMRUZUIjoKICAgICAgICBjYXNlICJPTiBUSEUgTEVGVCI6CiAgICAgICAgY2FzZSAiTEVGVCBPRiI6CiAgICAgICAgY2FzZSAiVE8gVEhFIExFRlQgT0YiOgogICAgICAgIGNhc2UgIuOBsuOBoOOCiiI6CiAgICAgICAgY2FzZSAi5bemIjoKICAgICAgICBjYXNlICLjgbLjgaDjgorjgYzjgo8iOgogICAgICAgIGNhc2UgIuW3puWBtCI6CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgdC5pbm5lckhUTUwgPSAnPGltZyBpZD0iV0tsdmx1cEltZyIgc3R5bGU9ImZsb2F0OmxlZnQ7bWFyZ2luOjIwcHgiPiA8L2ltZz4nKwogICAgICAgICAgICAgICAgJzxkaXYgaWQ9IldLbHZsdXBUeHQiIHN0eWxlPSJtYXJnaW46MjBweDtmbG9hdDpsZWZ0O3RleHQtYWxpZ246Y2VudGVyO2xpbmUtaGVpZ2h0OjExMCU7Zm9udC1zaXplOjMwMCUiPiA8L2Rpdj4nKwogICAgICAgIAkJJzwvZGl2Pic7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICJSSUdIVCI6CiAgICAgICAgY2FzZSAiQVQgUklHSFQiOgogICAgICAgIGNhc2UgIk9OIFJJR0hUIjoKICAgICAgICBjYXNlICJPTiBUSEUgUklHSFQiOgogICAgICAgIGNhc2UgIlJJR0hUIE9GIjoKICAgICAgICBjYXNlICJUTyBUSEUgUklHSFQgT0YiOgogICAgICAgIGNhc2UgIk1JR0kiOgogICAgICAgIGNhc2UgIuOBv+OBjiI6CiAgICAgICAgY2FzZSAi5Y+zIjoKICAgICAgICBjYXNlICLjgb/jgY7jgYzjgo8iOgogICAgICAgIGNhc2UgIuWPs+WBtCI6CiAgICAgICAgICAgIHQuaW5uZXJIVE1MID0gJzxpbWcgaWQ9IldLbHZsdXBJbWciIHN0eWxlPSJmbG9hdDpyaWdodDttYXJnaW46MjBweCI+IDwvaW1nPicrCiAgICAgICAgICAgICAgICAnPGRpdiBpZD0iV0tsdmx1cFR4dCIgc3R5bGU9Im1hcmdpbjoyMHB4O2Zsb2F0OnJpZ2h0O3RleHQtYWxpZ246Y2VudGVyO2xpbmUtaGVpZ2h0OjExMCU7Zm9udC1zaXplOjMwMCUiPiA8L2Rpdj4nKwogICAgICAgIAkJJzwvZGl2Pic7CiAgICAgICAgICAgIGJyZWFrOwoKICAgIH0KICAgIHQuc3R5bGUud2lkdGggPSAiMTIwMHB4IjsKICAgIHQuc3R5bGUubWFyZ2luID0gImF1dG8iOwoKICAgIG1zZy5hcHBlbmRDaGlsZCh0KTsKCgl2YXIgdGhpbmcxID0gZ2V0KCJXS2x2bHVwSW1nIik7CglpZiAodGhpbmcxICYmIHRoZUltZykgewoJCXRoaW5nMS5zcmMgPSB0aGVJbWc7Cgl9CgoJdmFyIHRoaW5nMiA9IGdldCgiV0tsdmx1cFR4dCIpOwoKCWlmICh0aGluZzIgJiYgdGhlVHh0KSB7CgkJaWYgKHRoZVR4dC5zdWJzdHJpbmcoMCwgOCkgPT0gIiUjVEVTVCUjIikgewoJCQkvLyBpbmRpY2F0ZXMgdGVzdCBtb2RlOyBzdHJpcCB0aGUgdGVzdCBmbGFnIG91dCBvZiB0aGUgdGV4dAoJCQl0aGVUeHQgPSB0aGVUeHQucmVwbGFjZSgiJSNURVNUJSMiLCAiIik7CgkJfQoJCQoJCXRoZVR4dCA9IHRoZVR4dC5yZXBsYWNlKC8jTEVWRUxOVU0jL2csIGN1ckxldmVsKTsgIC8vIHN1cHBvcnQgI0xFVkVMTlVNIyB2YXJpYWJsZSBpbiB0ZXh0IHN0cmluZ3MKCgkJdGhpbmcyLmlubmVySFRNTD0gdGhlVHh0OwoJfSAKCgljb25zb2xlLmxvZygnZGlzcGxheUxldmVsVXBNZXNzYWdlKCkgZW5kJyk7Cn0KCgpmdW5jdGlvbiBnZXROZXh0TWlsZXN0b25lKCBudW1UdXJ0bGVzICkgewoKCWNvbnNvbGUubG9nKCJnZXROZXh0TWlsZXN0b25lKCkiKTsKCgl2YXIgbWlsZXN0b25lcyA9IFsxLCAxMDAsIDI1MCwgNTAwLCA3NTAsIDEwMDAsIDE1MDAsIDIwMDAsIDI1MDAsIDMwMDAsIDQwMDAsIDUwMDAsIDYwMDAsIDcwMDAsIDgwMDAsIDkwMDAsIDEwMDAwLCA5OTk5OTldOwoJdmFyIGk9MDsKCgljb25zb2xlLmxvZygibnVtVHVydGxlcyA9ICIsIG51bVR1cnRsZXMpOwoKCXdoaWxlICggbWlsZXN0b25lc1tpXSA8PSBudW1UdXJ0bGVzICkgewoKCQlpKys7Cgl9Cgljb25zb2xlLmxvZygibmV4dCBtaWxlc3RvbmUgPSAiLCBtaWxlc3RvbmVzW2ldKTsKCXJldHVybiBtaWxlc3RvbmVzW2ldOwp9CgoKZnVuY3Rpb24gZ2V0VHVydGxlQ291bnRzKCkgewkvLyBjdW11bGF0aXZlIChlbmwgPSBlbmwgKyBidXIsIGV0Yy4pCgoJY29uc29sZS5sb2coImdldFR1cnRsZUNvdW50cygpIik7CgoJLy8gSSdtIGRvaW5nIHRoZSBzdHJpbmcgc3BsaXQoIiAiKSBhbmQgcmVwbGFjZSgpIHNvIHdlIHdpbGwgcGxheSBuaWNlbHkgd2l0aCBvbmUgb2YgbXkgb3RoZXIgc2NyaXB0cyBqdXN0IGluIGNhc2UgdGhlIG90aGVyIG9uZSBydW5zIGZpcnN0CgoJdmFyIGJzdHIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnVybmVkIikuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNwYW4iKVswXS5pbm5lckhUTUwuc3BsaXQoIiAiKVswXSB8fCAiMCI7Cgl2YXIgZXN0ciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlbmxpZ2h0ZW5lZCIpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzcGFuIilbMF0uaW5uZXJIVE1MLnNwbGl0KCIgIilbMF0gfHwgIjAiOwoJdmFyIG1zdHIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibWFzdGVyIikuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNwYW4iKVswXS5pbm5lckhUTUwuc3BsaXQoIiAiKVswXSB8fCAiMCI7Cgl2YXIgZ3N0ciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJndXJ1IikuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNwYW4iKVswXS5pbm5lckhUTUwuc3BsaXQoIiAiKVswXSB8fCAiMCI7Cgl2YXIgYXN0ciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhcHByZW50aWNlIikuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNwYW4iKVswXS5pbm5lckhUTUwuc3BsaXQoIiAiKVswXSB8fCAiMCI7CgoJdmFyIHVwYXJyb3cgPSAi4oaRIjsKCXZhciBkb3duYXJyb3cgPSAi4oaTIjsKCglic3RyID0gYnN0ci5yZXBsYWNlKHVwYXJyb3csICIiKTsKCWVzdHIgPSBlc3RyLnJlcGxhY2UodXBhcnJvdywgIiIpOwoJbXN0ciA9IG1zdHIucmVwbGFjZSh1cGFycm93LCAiIik7Cglnc3RyID0gZ3N0ci5yZXBsYWNlKHVwYXJyb3csICIiKTsKCWFzdHIgPSBhc3RyLnJlcGxhY2UodXBhcnJvdywgIiIpOwoKCWJzdHIgPSBic3RyLnJlcGxhY2UoZG93bmFycm93LCAiIik7Cgllc3RyID0gZXN0ci5yZXBsYWNlKGRvd25hcnJvdywgIiIpOwoJbXN0ciA9IG1zdHIucmVwbGFjZShkb3duYXJyb3csICIiKTsKCWdzdHIgPSBnc3RyLnJlcGxhY2UoZG93bmFycm93LCAiIik7Cglhc3RyID0gYXN0ci5yZXBsYWNlKGRvd25hcnJvdywgIiIpOwoKCXZhciBidXJuZWQgPSBOdW1iZXIoIGJzdHIgKTsKCXZhciBlbmxpZ2h0ZW5lZCA9IE51bWJlciggZXN0ciApOwoJdmFyIG1hc3RlciA9IE51bWJlciggbXN0ciApOwoJdmFyIGd1cnUgPSBOdW1iZXIoIGdzdHIgKTsKCXZhciBhcHByZW50aWNlID0gTnVtYmVyKCBhc3RyICk7CgoJY29uc29sZS5sb2coInJhdyBjb3VudHM6ICIsIGFwcHJlbnRpY2UsIGd1cnUsIG1hc3RlciwgZW5saWdodGVuZWQsIGJ1cm5lZCk7CgoJZW5saWdodGVuZWQgKz0gYnVybmVkOwoJbWFzdGVyICs9IGVubGlnaHRlbmVkOwoJZ3VydSArPSBtYXN0ZXI7CglhcHByZW50aWNlICs9IGd1cnU7CgoJY29uc29sZS5sb2coImN1bXVsYXRpdmUgY291bnRzOiAiLCBhcHByZW50aWNlLCBndXJ1LCBtYXN0ZXIsIGVubGlnaHRlbmVkLCBidXJuZWQpOwoKCXJldHVybiBbYXBwcmVudGljZSwgZ3VydSwgbWFzdGVyLCBlbmxpZ2h0ZW5lZCwgYnVybmVkXTsKfQoKCgpmdW5jdGlvbiBpbml0ICgpIHsKCWNvbnNvbGUubG9nKCdpbml0KCkgc3RhcnQnKTsKCiAJdmFyIHRoZUltZyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJXS2x2bHVwSW1nVVJMIik7Cgl2YXIgdGhlVHh0ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oIldLbHZsdXBUZXh0Iik7Cgl2YXIgbmV4dE1pbGVzdG9uZXMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiV0tsdmx1cE1pbGVzdG9uZXMiKTsKICAgIAogICAgICAJaWYgKCF0aGVJbWcpIHsKCQl0aGVJbWcgPSAiaHR0cHM6Ly9pLmltZ3VyLmNvbS9LNlVRTDFaLmdpZiI7CiAgICAgICAgCWxvY2FsU3RvcmFnZS5zZXRJdGVtKCJXS2x2bHVwSW1nVVJMIiwgdGhlSW1nKTsKICAgICAgCX0KICAgICAgCiAgICAgIAlpZiAoIXRoZVR4dCkgewoJCXRoZVR4dCA9ICc8YnIvPllvdSBsZXZlbGVkIHVwITxici8+Q29uZ3JhdHVsYXRpb25zISc7CiAgICAgICAgCWxvY2FsU3RvcmFnZS5zZXRJdGVtKCJXS2x2bHVwVGV4dCIsIHRoZVR4dCk7CiAgICAgIAl9CgoJaWYgKCFuZXh0TWlsZXN0b25lcykgewoKCQlpbml0aWFsaXplTWlsZXN0b25lcygpOwoJCQoJfQoKCWNvbnNvbGUubG9nKCdpbml0KCkgZW5kJyk7Cn0KCgpmdW5jdGlvbiBpbml0aWFsaXplTWlsZXN0b25lcyAoKSB7CgoJY29uc29sZS5sb2coImluaXRpYWxpemVNaWxlc3RvbmVzKCkiKTsKCgl2YXIgdHVydGxlQ291bnRzID0gZ2V0VHVydGxlQ291bnRzKCk7CS8vIGN1bXVsYXRpdmUgKGVubCA9IGVubCArIGJ1ciwgZXRjLikKCXZhciBuZXh0TWlsZXN0b25lcyA9IG5ldyBBcnJheSgpOwoKCWZvciAodmFyIHg9MTsgeCA8IHR1cnRsZUNvdW50cy5sZW5ndGg7IHgrKykgewoKCQluZXh0TWlsZXN0b25lc1t4LTFdID0gZ2V0TmV4dE1pbGVzdG9uZSggdHVydGxlQ291bnRzW3hdICk7ICAvLyB0dXJ0bGVDb3VudHNbXSBpbmNsdWRlcyBBcHByZW50aWNlIGl0ZW1zLCBuZXh0TWlsZXN0b25lc1tdIGRvZXMgbm90Cgl9CgoJbG9jYWxTdG9yYWdlLnNldEl0ZW0oIldLbHZsdXBNaWxlc3RvbmVzIiwgSlNPTi5zdHJpbmdpZnkobmV4dE1pbGVzdG9uZXMpKTsKfQoKCmZ1bmN0aW9uIGNoZWNrTWlsZXN0b25lcyggbGV2ZWwgKSB7CgoJY29uc29sZS5sb2coImNoZWNrTWlsZXN0b25lcygpIik7CgoJdmFyIG5leHRNaWxlc3RvbmVzID0gSlNPTi5wYXJzZSggbG9jYWxTdG9yYWdlLmdldEl0ZW0oIldLbHZsdXBNaWxlc3RvbmVzIikgKTsKCXZhciB0dXJ0bGVDb3VudHMgPSBnZXRUdXJ0bGVDb3VudHMoKTsKCXZhciBhY2hpZXZlbWVudHMgPSBuZXcgQXJyYXkoKTsKCXZhciBnb3RPbmUgPSAwOwoJdmFyIHRlc3RBbGxEb25lID0gbnVsbDsgLy9zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCJXS2x2bHVwVGVzdEFsbEJ1cm5lZCIpOwoKCWNvbnNvbGUubG9nKCJuZXh0TWlsZXN0b25lczogIiwgSlNPTi5zdHJpbmdpZnkobmV4dE1pbGVzdG9uZXMpKTsKCglpZiAoIHRlc3RBbGxEb25lIHx8IChsZXZlbCA+PSA1MCAgJiYgKHR1cnRsZUNvdW50c1swXSA9PSB0dXJ0bGVDb3VudHNbNF0pKSkgewoKCQkvLyBhbHNvIGNoZWNrIHRoYXQgbGVzc29ucyA9PSAwIGFuZCByZXZpZXdzID09IDAKCgkJdmFyIHJ2d3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJyZXZpZXdzIilbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNwYW4iKVswXTsKCQl2YXIgbHNucyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImxlc3NvbnMiKVswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic3BhbiIpWzBdOwoJCgkJaWYgKHRlc3RBbGxEb25lIHx8IChydndzID09IDAgJiYgbHNucyA9PSAwKSkgewoKCQkJY29uc29sZS5sb2coImFsbCB0dXJ0bGVzIGJ1cm5lZCEiKTsKCgkJCS8vIHNldCBmbGFnCgkJCXNlc3Npb25TdG9yYWdlLnNldEl0ZW0oIldLbHZsdXBBbGxCdXJuZWQiLCAxKTsKCgkJCS8vIHJldHVybiBzb21lIG90aGVyd2lzZS1pbXBvc3NpYmxlIGFycmF5IHNvIHRoYXQgd2UnbGwgZ2V0IGludG8gZGlzcGxheU1pbGVzdG9uZXMoKQoJCQljb25zb2xlLmxvZygicmV0dXJuaW5nIFsxLDEsMSwxXSIpOwkKCQkJcmV0dXJuIFsxLCAxLCAxLCAxXTsKCQl9Cgl9CgoJZm9yICh2YXIgeD0wOyB4IDwgbmV4dE1pbGVzdG9uZXMubGVuZ3RoOyB4KyspIHsKCgkJaWYgKHR1cnRsZUNvdW50c1t4KzFdID49IG5leHRNaWxlc3RvbmVzW3hdKSB7IC8vIHR1cnRsZUNvdW50c1tdIGluY2x1ZGVzIEFwcHJlbnRpY2UgaXRlbXMsIG5leHRNaWxlc3RvbmVzW10gZG9lcyBub3QKCQkJCgkJCWFjaGlldmVtZW50c1t4XSA9IG5leHRNaWxlc3RvbmVzW3hdOwoJCQluZXh0TWlsZXN0b25lc1t4XSA9IGdldE5leHRNaWxlc3RvbmUoIHR1cnRsZUNvdW50c1t4KzFdICk7CgkJCWdvdE9uZSsrOwoKCQl9IGVsc2UgewoJCQlhY2hpZXZlbWVudHNbeF0gPSAwOwoJCX0KCX0KCgljb25zb2xlLmxvZygiYWNoaWV2ZW1lbnRzOiAiLCBKU09OLnN0cmluZ2lmeShhY2hpZXZlbWVudHMpKTsKCglpZiAoZ290T25lICE9IDApIHsKCgkJY29uc29sZS5sb2coImNoZWNrTWlsZXN0b25lcygpIHJldHVybmluZyBhY2hpZXZlbWVudHMiKTsKCQlsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiV0tsdmx1cE1pbGVzdG9uZXMiLCBKU09OLnN0cmluZ2lmeShuZXh0TWlsZXN0b25lcykpOwoJCXJldHVybiBhY2hpZXZlbWVudHM7CgoJfSBlbHNlIHsKCQljb25zb2xlLmxvZygiY2hlY2tNaWxlc3RvbmVzKCkgcmV0dXJuaW5nIG51bGwiKTsKCQlyZXR1cm4gbnVsbDsKCX0KfQoKCmZ1bmN0aW9uIGRpc3BsYXlNaWxlc3RvbmVzICggbWlsZXN0b25lcyApIHsKCgljb25zb2xlLmxvZygnZGlzcGxheU1pbGVzdG9uZXMoKSBzdGFydCcpOwoJdmFyIG1zZyA9IGdldCgic2VhcmNoIik7CiAgICAJdmFyIHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKIAl2YXIgdGhlSW1nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oIldLbHZsdXBJbWdVUkwiKTsKCXZhciB0aGVUeHQgPSAiPGJyLz4iOwoJdmFyIGxhYmVscyA9IFsiIEd1cnUgdHVydGxlISIsICIgTWFzdGVyIHR1cnRsZSEiLCAiIEVubGlnaHRlbmVkIHR1cnRsZSEiLCAiIEJ1cm5lZCB0dXJ0bGUhIl07CiAJdmFyIHRoZVBvcyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJXS2x2bHVwSW1nUG9zIikgfHwgIkxFRlQiOwoKICAgIHN3aXRjaCh0aGVQb3MudG9VcHBlckNhc2UoKSkgewoKICAgICAgICBjYXNlICJCRUxPVyI6CiAgICAgICAgY2FzZSAiVU5ERVIiOgogICAgICAgIGNhc2UgIlVOREVSTkVBVEgiOgogICAgICAgIGNhc2UgIkRPV04iOgogICAgICAgIGNhc2UgIkJPVFRPTSI6CiAgICAgICAgY2FzZSAi44GX44GfIjoKICAgICAgICBjYXNlICLkuIsiOgogICAgICAgICAgICB0LmlubmVySFRNTCA9ICc8ZGl2IGlkPSJXS2x2bHVwVHh0IiBzdHlsZT0ibWFyZ2luOmF1dG87dGV4dC1hbGlnbjpjZW50ZXI7bGluZS1oZWlnaHQ6MTEwJTtmb250LXNpemU6MzAwJSI+IDwvZGl2PicrCiAgICAgICAgICAgICAgICAnPGltZyBpZD0iV0tsdmx1cEltZyIgc3R5bGU9ImRpc3BsYXk6YmxvY2s7bWFyZ2luOmF1dG8iPiA8L2ltZz4nKwogICAgICAgIAkJJzwvZGl2Pic7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICJBQk9WRSI6CiAgICAgICAgY2FzZSAiVE9QIjoKICAgICAgICBjYXNlICJVUCI6CiAgICAgICAgY2FzZSAiT1ZFUiI6CiAgICAgICAgY2FzZSAiT04gVE9QIE9GIjoKICAgICAgICBjYXNlICJDRU5URVIiOgogICAgICAgIGNhc2UgIkNFTlRFUkVEIjoKICAgICAgICBjYXNlICLjgYbjgYgiOgogICAgICAgIGNhc2UgIuS4iiI6CiAgICAgICAgY2FzZSAi44Gq44GLIjoKICAgICAgICBjYXNlICLkuK0iOgogICAgICAgIGNhc2UgIuOBoeOCheOBhuOBiuOBhiI6CiAgICAgICAgY2FzZSAi5Lit5aSuIjoKICAgICAgICAgICAgdC5pbm5lckhUTUwgPSAnPGltZyBpZD0iV0tsdmx1cEltZyIgc3R5bGU9ImRpc3BsYXk6YmxvY2s7bWFyZ2luOmF1dG8iPiA8L2ltZz4nKwogICAgICAgICAgICAgICAgJzxkaXYgaWQ9IldLbHZsdXBUeHQiIHN0eWxlPSJtYXJnaW46YXV0bzt0ZXh0LWFsaWduOmNlbnRlcjtsaW5lLWhlaWdodDoxMTAlO2ZvbnQtc2l6ZTozMDAlIj4gPC9kaXY+JysKICAgICAgICAJCSc8L2Rpdj4nOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAiTEVGVCI6CiAgICAgICAgY2FzZSAiQVQgTEVGVCI6CiAgICAgICAgY2FzZSAiT04gTEVGVCI6CiAgICAgICAgY2FzZSAiT04gVEhFIExFRlQiOgogICAgICAgIGNhc2UgIkxFRlQgT0YiOgogICAgICAgIGNhc2UgIlRPIFRIRSBMRUZUIE9GIjoKICAgICAgICBjYXNlICLjgbLjgaDjgooiOgogICAgICAgIGNhc2UgIuW3piI6CiAgICAgICAgY2FzZSAi44Gy44Gg44KK44GM44KPIjoKICAgICAgICBjYXNlICLlt6blgbQiOgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHQuaW5uZXJIVE1MID0gJzxpbWcgaWQ9IldLbHZsdXBJbWciIHN0eWxlPSJmbG9hdDpsZWZ0O21hcmdpbjoyMHB4Ij4gPC9pbWc+JysKICAgICAgICAgICAgICAgICc8ZGl2IGlkPSJXS2x2bHVwVHh0IiBzdHlsZT0ibWFyZ2luOjIwcHg7ZmxvYXQ6bGVmdDt0ZXh0LWFsaWduOmNlbnRlcjtsaW5lLWhlaWdodDoxMTAlO2ZvbnQtc2l6ZTozMDAlIj4gPC9kaXY+JysKICAgICAgICAJCSc8L2Rpdj4nOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAiUklHSFQiOgogICAgICAgIGNhc2UgIkFUIFJJR0hUIjoKICAgICAgICBjYXNlICJPTiBSSUdIVCI6CiAgICAgICAgY2FzZSAiT04gVEhFIFJJR0hUIjoKICAgICAgICBjYXNlICJSSUdIVCBPRiI6CiAgICAgICAgY2FzZSAiVE8gVEhFIFJJR0hUIE9GIjoKICAgICAgICBjYXNlICJNSUdJIjoKICAgICAgICBjYXNlICLjgb/jgY4iOgogICAgICAgIGNhc2UgIuWPsyI6CiAgICAgICAgY2FzZSAi44G/44GO44GM44KPIjoKICAgICAgICBjYXNlICLlj7PlgbQiOgogICAgICAgICAgICB0LmlubmVySFRNTCA9ICc8aW1nIGlkPSJXS2x2bHVwSW1nIiBzdHlsZT0iZmxvYXQ6cmlnaHQ7bWFyZ2luOjIwcHgiPiA8L2ltZz4nKwogICAgICAgICAgICAgICAgJzxkaXYgaWQ9IldLbHZsdXBUeHQiIHN0eWxlPSJtYXJnaW46MjBweDtmbG9hdDpyaWdodDt0ZXh0LWFsaWduOmNlbnRlcjtsaW5lLWhlaWdodDoxMTAlO2ZvbnQtc2l6ZTozMDAlIj4gPC9kaXY+JysKICAgICAgICAJCSc8L2Rpdj4nOwogICAgICAgICAgICBicmVhazsKCiAgICB9CgogICAgdC5zdHlsZS53aWR0aCA9ICIxMjAwcHgiOwogICAgdC5zdHlsZS5tYXJnaW4gPSAiYXV0byI7CgogICAgbXNnLmFwcGVuZENoaWxkKHQpOwoKCXZhciB0aGluZzEgPSBnZXQoIldLbHZsdXBJbWciKTsKCWlmICh0aGluZzEgJiYgdGhlSW1nKSB7CgkJdGhpbmcxLnNyYyA9IHRoZUltZzsKCX0KCgl2YXIgYWxsRG9uZVdLID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgiV0tsdmx1cEFsbEJ1cm5lZCIpOwoJCglpZiAoYWxsRG9uZVdLICYmIGFsbERvbmVXSyA9PSAxKSB7CgoJCXRoZVR4dCArPSAiQUxMIFRVUlRMRVMgQlVSTkVEITxici8+V0FOSUtBTkkgQ09NUExFVEUhIjsKCQkvL3Nlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oIldLbHZsdXBUZXN0QWxsQnVybmVkIik7Cgl9IGVsc2UgewoKCQlmb3IgKHZhciB4ID0gbWlsZXN0b25lcy5sZW5ndGggLSAxOyB4ID49IDA7IHgtLSkgewoKCQkJaWYgKG1pbGVzdG9uZXNbeF0gPT0gMSkgewoKCQkJCXRoZVR4dCArPSAiRmlyc3QiICsgbGFiZWxzW3hdICsgIjxici8+IjsKCQkJfQoJCQllbHNlIGlmIChtaWxlc3RvbmVzW3hdICE9IDApIHsKCgkJCQl0aGVUeHQgKz0gbWlsZXN0b25lc1t4XSArICJ0aCIgKyBsYWJlbHNbeF0gKyAiPGJyLz4iOwoJCQl9CgkJfQoJfQoKICAgIHZhciBjdXN0b21CdXJuTGFiZWwgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiV0tCTFJCdXJuTGV2ZWxOYW1lIikgfHwgIkJ1cm5lZCI7CiAgICBpZiAoY3VzdG9tQnVybkxhYmVsICYmIChjdXN0b21CdXJuTGFiZWwgIT0gIkJ1cm5lZCIpKSB7CiAgICAgICAgdmFyIG5ld1RleHQgPSB0aGVUeHQucmVwbGFjZSgiQnVybmVkIiwgY3VzdG9tQnVybkxhYmVsKTsKICAgICAgICBpZiAobmV3VGV4dCA9PSB0aGVUeHQpIHsKICAgICAgICAgICAgdmFyIG5ld0NCTCA9IGN1c3RvbUJ1cm5MYWJlbC50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICBuZXdUZXh0ID0gdGhlVHh0LnJlcGxhY2UoIkJVUk5FRCIsIG5ld0NCTCk7CiAgICAgICAgfQogICAgICAgIHRoZVR4dCA9IG5ld1RleHQ7CiAgICB9CgoJdmFyIHRoaW5nMiA9IGdldCgiV0tsdmx1cFR4dCIpOwoKCWlmICh0aGluZzIpIHsKCgkJdGhpbmcyLmlubmVySFRNTD0gdGhlVHh0OwoJfSAKCgljb25zb2xlLmxvZygnZGlzcGxheU1pbGVzdG9uZXMoKSBlbmQnKTsKfQoKCgpmdW5jdGlvbiBtYWluICgpIHsKCgl2YXIgY3VyTGV2ZWw7CgoJY29uc29sZS5sb2coIm1haW4oKSIpOwoKCWluaXQoKTsKCglHTXNldHVwKCk7CgoJY3VyTGV2ZWwgPSBjaGVja0xldmVsKCk7CgoJdmFyIGxhc3RLbm93bkxldmVsID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oIldLbHZsdXBQcmV2TGV2ZWwiKSB8fCAxOwoKCWlmIChjdXJMZXZlbCAhPSBsYXN0S25vd25MZXZlbCkgeyByZXR1cm47IH0KCglpZiAoc2hvdWxkRGlzcGxheSgpKSB7CgoJCXZhciBkdXJ0ZXh0ID0gZ2V0KCJXS2x2bGR1clR4dCIpOwoKCQlpZiAoZHVydGV4dCkgeyBkdXJ0ZXh0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZHVydGV4dCk7IH0gIC8vIG92ZXJyaWRlIFdLIExldmVsIER1cmF0aW9uIHNjcmlwdAoKCQlkaXNwbGF5TGV2ZWxVcE1lc3NhZ2UoIGN1ckxldmVsICk7CgoJfSBlbHNlIHsKCgkJdmFyIG1pbGVzdG9uZXMgPSBjaGVja01pbGVzdG9uZXMoIGN1ckxldmVsICk7CgoJCWlmIChtaWxlc3RvbmVzKSB7CgoJCQl2YXIgZHVydGV4dCA9IGdldCgiV0tsdmxkdXJUeHQiKTsKCgkJCWlmIChkdXJ0ZXh0KSB7IGR1cnRleHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkdXJ0ZXh0KTsgfSAgLy8gb3ZlcnJpZGUgV0sgTGV2ZWwgRHVyYXRpb24gc2NyaXB0CgoJCQlkaXNwbGF5TWlsZXN0b25lcyggbWlsZXN0b25lcyApOwoKCQl9IAoJfQp9Cgp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIG1haW4sIGZhbHNlKTsKCmNvbnNvbGUubG9nKCdzY3JpcHQgbG9hZCBlbmQnKTsK"},{"name":"WaniKani Katakana Madness","options":{"check_for_updates":true,"comment":null,"compatopts_for_requires":true,"compat_wrappedjsobject":false,"compat_metadata":false,"compat_foreach":false,"compat_arrayleft":false,"compat_uW_gmonkey":false,"compat_forvarin":false,"noframes":null,"awareOfChrome":false,"run_at":null,"override":{"use_includes":[],"orig_includes":["https://www.wanikani.com/*","http://www.wanikani.com/*"],"merge_includes":true,"use_matches":[],"orig_matches":[],"merge_matches":true,"use_excludes":[],"orig_excludes":[],"merge_excludes":true,"use_connects":[],"merge_connects":true,"use_blockers":[],"orig_run_at":"document-end","orig_noframes":null,"orig_connects":[]}},"storage":{"ts":1588770714968,"data":{}},"enabled":true,"position":5,"file_url":"https://greasyfork.org/scripts/26481-wanikani-katakana-madness/code/WaniKani%20Katakana%20Madness.user.js","uuid":"426adb92-86f2-42f5-8e8f-83e095586b99","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBXYW5pS2FuaSBLYXRha2FuYSBNYWRuZXNzCi8vIEBhdXRob3IgICAgICAgTHVrZS1GaWxld2Fsa2VyCi8vIEBuYW1lc3BhY2UgICAgaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9lbi9zY3JpcHRzLzI2NDgxLXdhbmlrYW5pLWthdGFrYW5hLW1hZG5lc3MKLy8gQGluY2x1ZGUgICAgICBodHRwczovL3d3dy53YW5pa2FuaS5jb20vKgovLyBAaW5jbHVkZSAgICAgIGh0dHA6Ly93d3cud2FuaWthbmkuY29tLyoKLy8gQHZlcnNpb24gICAgICAxLjAuOAovLyBAZGVzY3JpcHRpb24gIFRyYW5zZm9ybXMgZXZlcnl0aGluZyByZWxhdGVkIHRvIG9uJ3lvbWkgaW50byBrYXRha2FuYQovLyBAcnVuLWF0ICAgICAgIGRvY3VtZW50LWVuZAovLyBAZ3JhbnQgICAgICAgIG5vbmUKLy8gQGxpY2Vuc2UgICAgICBHUEwgdjMuMAovLyA9PS9Vc2VyU2NyaXB0PT0KCi8qCiogS2FuamkgaW1wb3J0YW50IHJlYWRpbmcgKDE6IG9ueW9taSwgMDoga3VueW9taSkKKiBTYXZlZCBsb2NhbHksIHRvIHVwZGF0ZSBlbnRlciBhcGlLZXkgYW5kIHVzZSBmdW5jdGlvbiBvbiB0aGUgYm90dG9tIG9mIHRoZSBzY3JpcHQKKi8KdmFyIGFwaUtleSA9ICJrZXkiOwp2YXIga2FuamlZb21pUExFQVNBTlQgPSB7IuS4gCI6MSwi5LqMIjoxLCLkuZ0iOjEsIuS4gyI6MSwi5Lq6IjoxLCLlhaUiOjEsIuWFqyI6MSwi5YqbIjoxLCLljYEiOjEsIuS4iSI6MSwi5LiKIjoxLCLkuIsiOjEsIuWPoyI6MSwi5aSnIjoxLCLlpbMiOjEsIuWxsSI6MSwi5bedIjowLCLlt6UiOjEsIuWIgCI6MSwi5ZyfIjoxLCLljYMiOjEsIuWklSI6MCwi5a2QIjoxLCLlsI8iOjEsIuS4gSI6MSwi5LqGIjoxLCLlj4giOjAsIuS4uCI6MCwi5omNIjoxLCLkuK0iOjEsIuS6lCI6MSwi5YWtIjoxLCLlhoYiOjEsIuWkqSI6MSwi5omLIjowLCLmlociOjEsIuaXpSI6MSwi5pyIIjoxLCLmnKgiOjEsIuawtCI6MSwi54GrIjoxLCLniqwiOjAsIueOiyI6MSwi5Ye6IjoxLCLlm5siOjEsIuWPsyI6MSwi5bemIjoxLCLmnKwiOjEsIuatoyI6MSwi55SwIjowLCLnjokiOjAsIueZvSI6MSwi55uuIjowLCLnq4siOjEsIuOAhSI6MCwi5rC3IjowLCLomasiOjAsIuefsyI6MSwi5LiWIjoxLCLkuLsiOjEsIuS7liI6MSwi5LujIjoxLCLlhpkiOjEsIuWOuyI6MSwi5Y+3IjoxLCLlubMiOjEsIuaJkyI6MSwi55SzIjowLCLnmr8iOjAsIuekvCI6MSwi5LyRIjoxLCLlhYgiOjEsIuWQjSI6MSwi5a2XIjoxLCLlubQiOjEsIuaXqSI6MSwi5rCXIjoxLCLnmb4iOjEsIueruSI6MCwi57O4IjowLCLmnZEiOjAsIuiAsyI6MCwi55S3IjoxLCLnlLoiOjEsIuiKsSI6MCwi6KaLIjowLCLosp0iOjAsIui1pCI6MCwi6LazIjoxLCLou4oiOjEsIuS4jSI6MSwi5LuVIjoxLCLlrp0iOjEsIuWkriI6MSwi5LqhIjoxLCLljJYiOjEsIuS4oSI6MSwi5ZywIjoxLCLlhagiOjEsIuWQkSI6MSwi5a6JIjoxLCLlt54iOjEsIuaciSI6MSwi5puyIjoxLCLmrKEiOjEsIuatuyI6MSwi576KIjoxLCLooYAiOjEsIuS6rCI6MSwi5Zu9IjoxLCLlpJwiOjEsIuWmuSI6MSwi5aeJIjoxLCLlupciOjEsIuaYjiI6MSwi5p2xIjoxLCLmrakiOjEsIueUuyI6MSwi55u0IjoxLCLnn6UiOjEsIumVtyI6MSwi5YmNIjoxLCLljZciOjEsIuWupCI6MSwi5b6MIjoxLCLmgJ0iOjEsIuaYnyI6MSwi5rW3IjoxLCLmtLsiOjEsIuenkSI6MSwi54K5IjoxLCLojLYiOjEsIumjnyI6MSwi6aaWIjowLCLnp4EiOjEsIum7hCI6MCwi6buSIjoxLCLmrKAiOjEsIuawjyI6MSwi55SxIjoxLCLmnK0iOjEsIuawkSI6MSwi6L66IjoxLCLku5giOjAsIuS7pSI6MSwi5aSxIjoxLCLlv4UiOjEsIuacqiI6MSwi5pyrIjoxLCLmoKEiOjEsIuWkjyI6MCwi5a62IjoxLCLlvLEiOjEsIuaZgiI6MSwi57SZIjowLCLoqJgiOjEsIumrmCI6MSwi6YCaIjoxLCLlvLciOjEsIuaVmSI6MSwi55CGIjoxLCLntYQiOjEsIuiIuSI6MSwi6YCxIjoxLCLpm6oiOjAsIumtmiI6MSwi6bOlIjoxLCLpoqgiOjEsIumdkiI6MSwi6IKJIjoxLCLnsbMiOjEsIuWFhCI6MSwi55quIjoxLCLkuqQiOjEsIuS8miI6MSwi5YWJIjoxLCLlkIwiOjEsIuWbniI6MSwi5aSaIjoxLCLlvZMiOjEsIuavjiI6MSwi5769IjowLCLogIMiOjEsIuiHqiI6MSwi6ImyIjowLCLooYwiOjEsIuilvyI6MSwi5L2VIjowLCLkvZMiOjEsIuS9nCI6MSwi5ZuzIjoxLCLlo7AiOjAsIuW8nyI6MSwi5b2iIjoxLCLmnaUiOjEsIuekviI6MSwi6KeSIjoxLCLoqIAiOjEsIui1sCI6MSwi6LC3IjowLCLov5EiOjEsIumHjCI6MCwi6bqmIjowLCLlraYiOjEsIuaelyI6MCwi56m6IjoxLCLph5EiOjEsIumbqCI6MCwi6I2JIjowLCLpn7MiOjEsIuaxoCI6MSwi5Y+NIjoxLCLmlK8iOjEsIuS9jyI6MSwi5YqpIjoxLCLlkJsiOjEsIuWMuyI6MSwi5a++IjoxLCLlsYAiOjEsIuaKlSI6MSwi5b25IjoxLCLmsboiOjEsIueptiI6MSwi6LqrIjoxLCLogIUiOjEsIueglCI6MSwi5aC0IjoxLCLmnJ0iOjAsIueVqiI6MSwi562UIjowLCLntbUiOjEsIuiytyI6MCwi6YGTIjoxLCLplpMiOjEsIumbsiI6MCwi5pWwIjoxLCLoqbEiOjEsIualvSI6MSwi5omAIjoxLCLmo64iOjAsIumbuyI6MSwi6aasIjoxLCLkuIciOjEsIuS7iiI6MSwi5YWDIjoxLCLlhawiOjEsIuWGhSI6MSwi5YiGIjoxLCLliIciOjEsIuWPiyI6MSwi5Y2IIjoxLCLlpKoiOjEsIuWwkSI6MSwi5byVIjowLCLlv4MiOjEsIuaIuCI6MCwi5pa5IjoxLCLniZsiOjEsIueItiI6MCwi5q+bIjoxLCLlhqwiOjAsIuWMlyI6MSwi5Y2KIjoxLCLlj6QiOjEsIuWPsCI6MSwi5aSWIjoxLCLluIIiOjEsIuW6gyI6MCwi5q+NIjowLCLnlKgiOjEsIuefoiI6MCwi55SfIjoxLCLmraIiOjEsIuiQvSI6MSwi6IGeIjoxLCLmqKoiOjAsIumAsiI6MSwi6LuiIjoxLCLovrIiOjEsIumJhCI6MSwi6JGJIjowLCLmnIAiOjEsIue1giI6MSwi57+SIjoxLCLmrYwiOjEsIuiqniI6MSwi6KqtIjowLCLps7QiOjAsIue3miI6MSwi6ZuGIjoxLCLpo7IiOjAsIualrSI6MSwi5ryiIjoxLCLlp4siOjEsIui1tyI6MCwi6YCfIjoxLCLphY0iOjEsIumFkiI6MSwi6ZmiIjoxLCLot68iOjEsIui7vSI6MCwi6YGLIjoxLCLplosiOjEsIueulyI6MSwi6aCtIjowLCLoqr8iOjEsIuimqiI6MSwi6aGUIjowLCLnl4UiOjEsIuaxgiI6MSwi5pawIjoxLCLov5QiOjEsIuWumiI6MSwi5aOyIjoxLCLkuosiOjEsIuS9vyI6MSwi5YW3IjoxLCLlj5ciOjEsIuWSjCI6MSwi5a6fIjoxLCLmnI0iOjEsIuazsyI6MCwi54mpIjoxLCLoi6YiOjEsIuihqCI6MSwi6YOoIjoxLCLkuZciOjAsIuWuoiI6MSwi5bGLIjowLCLluqYiOjEsIueVjCI6MSwi5oyBIjoxLCLnmboiOjEsIuebuCI6MSwi55yMIjoxLCLnvo4iOjEsIuiyoCI6MSwi6YCBIjoxLCLph40iOjEsIuirhyI6MSwi6KaBIjoxLCLli50iOjEsIuS7riI6MSwi5LqIIjoxLCLkv50iOjEsIuippiI6MSwi6aiTIjoxfTsKdmFyIGthbmppWW9taVBBSU5GVUwgPSB7IuW7uiI6MSwi54yrIjowLCLlj7giOjEsIuWkqyI6MSwi6aOvIjoxLCLli4ciOjEsIuWNmCI6MSwi5a+6IjowLCLlsqkiOjAsIuaZtCI6MCwi56eLIjowLCLluLAiOjAsIuaYpSI6MCwi5pi8IjowLCLoqIgiOjEsIuWIlyI6MSwi5Yy6IjoxLCLlnYIiOjAsIuS/oSI6MSwi5byPIjoxLCLlpIkiOjEsIuaYqCI6MSwi5q+SIjoxLCLms5UiOjEsIuazoyI6MCwi5rWFIjowLCLoi7EiOjEsIue0gCI6MSwi6LuNIjoxLCLnr4kiOjEsIuS7jyI6MSwi5pmpIjoxLCLkuIgiOjEsIumKgCI6MSwi6KydIjoxLCLnhLYiOjEsIumkiiI6MSwi5oSfIjoxLCLmqYsiOjAsIuipqSI6MSwi6aGMIjoxLCLlrr8iOjEsIumhmCI6MSwi6aeFIjoxLCLlmagiOjEsIuWjqyI6MSwi6KqyIjoxLCLllY8iOjEsIuaVtCI6MSwi5pqXIjoxLCLmp5giOjAsIuemjyI6MSwi57eRIjowLCLnt7QiOjEsIumkqCI6MSwi5YSEIjoxLCLmlpkiOjEsIuaomSI6MSwi5q66IjoxLCLnhrEiOjEsIuizniI6MSwi6YG4IjoxLCLovKoiOjEsIumPoSI6MCwi5oOFIjoxLCLmmKAiOjEsIueWkSI6MSwi55qGIjowLCLmg7MiOjEsIuWDjyI6MSwi5bmyIjoxLCLpnZ4iOjEsIueEoSI6MSwi5pivIjoxLCLntZAiOjEsIue0sCI6MSwi5oKyIjoxLCLolqwiOjEsIuWOnyI6MSwi6by7IjowLCLlgbQiOjAsIuWFtSI6MSwi5aCCIjoxLCLloakiOjAsIuW4rSI6MSwi5pWXIjoxLCLmooUiOjAsIuWboCI6MSwi5bi4IjoxLCLorZgiOjEsIua4iSI6MSwi6JmaIjoxLCLlrpgiOjEsIuWvnyI6MSwi5bqVIjowLCLmhJsiOjEsIue9siI6MSwi6K2mIjoxLCLmgYsiOjEsIuimmiI6MSwi6KqsIjoxLCLlubsiOjEsIuipsyI6MSwi5YqHIjoxLCLllpwiOjEsIuaenCI6MSwi5qCEIjoxLCLoiIwiOjAsIue2miI6MSwi5YqgIjoxLCLnr4AiOjEsIua4myI6MSwi6aCGIjoxLCLlrrkiOjEsIuW4gyI6MSwi5piTIjoxLCLoi6UiOjAsIuiyoSI6MSwi6KmeIjoxLCLmmIYiOjEsIumWpSI6MSwi5q20IjoxLCLlhooiOjEsIuWuhyI6MSwi5a6ZIjoxLCLlv5kiOjEsIuWxpSI6MSwi5ZujIjoxLCLmmrQiOjEsIua3tyI6MSwi5LmxIjoxLCLlvpIiOjEsIuW+lyI6MSwi5pS5IjoxLCLpgKMiOjEsIuWWhCI6MSwi57WhIjoxLCLmr5QiOjEsIuWPsiI6MSwi56ybIjoxLCLoirgiOjEsIuauiyI6MSwi5Y2SIjoxLCLlrowiOjEsIuW/tSI6MSwi5pybIjoxLCLmoLwiOjEsIuiDvSI6MSwi5aalIjoxLCLmnZ8iOjEsIumbsCI6MSwi5p2+IjowLCLkvosiOjEsIuWNlCI6MSwi5Y+CIjoxLCLlkagiOjEsIuWbuiI6MSwi5ZuyIjoxLCLlraMiOjEsIuW4jCI6MSwi5oqYIjoxLCLmnZAiOjEsIue0hCI6MSwi55qEIjoxLCLln7oiOjEsIuaApyI6MSwi5oqAIjoxLCLooZMiOjEsIumqqCI6MSwi6aCRIjoxLCLoqLwiOjEsIumBoCI6MSwi5ZOBIjoxLCLnrJEiOjAsIueVmSI6MSwi5ZySIjoxLCLmm5wiOjEsIuabuCI6MSwi6ZaAIjoxLCLlj5YiOjEsIuS/giI6MSwi5YW4IjoxLCLlrogiOjEsIuW5uCI6MSwi5oClIjoxLCLnnJ8iOjEsIueusSI6MCwi6I23IjowLCLpnaIiOjEsIuW6nCI6MSwi5rK7IjoxLCLmtbQiOjEsIui+niI6MSwi6ZaiIjoxLCLmlL8iOjEsIuW8gSI6MSwi6Zm6IjoxLCLljbEiOjEsIuWtmCI6MSwi5bCCIjoxLCLlhpIiOjEsIuWGlyI6MSwi6ZiqIjoxLCLlk6EiOjEsIumajiI6MSwi5YuJIjoxLCLnrKwiOjEsIumDvSI6MSwi5b6FIjoxLCLmt7EiOjEsIuerpSI6MSwi5bqtIjoxLCLml4UiOjEsIuaguSI6MSwi5rWBIjoxLCLmtogiOjEsIuWAjSI6MSwi5bO2IjowLCLnpa0iOjEsIueroCI6MSwi5YuVIjoxLCLllYYiOjEsIuaCqiI6MSwi5pePIjoxLCLnkIMiOjEsIumZvSI6MSwi5a+SIjowLCLmmpEiOjAsIuacnyI6MSwi5qSNIjoxLCLmra8iOjAsIua4qSI6MSwi5rivIjoxLCLmua8iOjAsIueZuyI6MSwi552AIjoxLCLph44iOjEsIuefrSI6MSwi5rOJIjoxLCLlkIgiOjEsIuaBryI6MSwi5YOVIjoxLCLoqJMiOjEsIuW8kyI6MSwi5ZGKIjoxLCLnqK4iOjEsIumBlCI6MSwi6aGeIjoxLCLloLEiOjEsIuetiSI6MSwi56WIIjoxLCLmsb0iOjEsIuWAnyI6MSwi54S8IjowLCLlv5giOjEsIuW6pyI6MSwi5rSXIjoxLCLog7giOjAsIuWDpyI6MSwi6ISzIjoxLCLnpoUiOjEsIuWPryI6MSwi6KixIjoxLCLmnpoiOjEsIuWPpSI6MSwi6Z2ZIjoxLCLnpoEiOjEsIuWWqyI6MSwi54WZIjoxLCLlpKIiOjEsIueBvSI6MSwi55SjIjoxLCLnqbQiOjAsIuWbsCI6MSwi5qmfIjoxLCLlrrMiOjEsIueOhyI6MSwi6aObIjoxLCLkvZkiOjEsIumboyI6MSwi5aaoIjoxLCLooqsiOjEsIuijlSI6MSwi5bC7IjowLCLpnIciOjEsIuWwviI6MSwi5qKwIjoxLCLnoroiOjEsIuWrjCI6MSwi5YCLIjoxLCLlnKciOjEsIuWcqCI6MSwi5YCSIjoxLCLoh60iOjAsIuWOmiI6MCwi5aa7IjoxLCLorbAiOjEsIueKryI6MSwi572qIjoxLCLpmLIiOjEsIuirliI6MSwi57WMIjoxLCLmiJAiOjEsIuWRsyI6MSwi5L2OIjoxLCLmi74iOjAsIuS8nSI6MSwi6ICBIjoxLCLkvY0iOjEsIuWIqSI6MSwi5YqqIjoxLCLnibkiOjEsIuaUviI6MSwi5LqJIjoxLCLku7IiOjAsIuWFsSI6MSwi5aW9IjoxLCLliJ0iOjEsIuWIpSI6MSwi5Yq0IjoxLCLlkb0iOjEsIuWyuCI6MSwi5piUIjowLCLms6IiOjEsIuazqCI6MSwi6IKyIjoxLCLmjIciOjEsIua0iyI6MSwi56WeIjoxLCLmiKYiOjEsIuenkiI6MSwi57SaIjoxLCLov70iOjAsIuertiI6MSwi6ImvIjoxLCLlip8iOjEsIuS+vyI6MSwi5LukIjoxLCLlg40iOjEsIuaEjyI6MX07CnZhciBrYW5qaVlvbWlERUFUSCA9IHsi5bGFIjoxLCLoo5wiOjEsIumuriI6MSwi6ZmQIjoxLCLkuI4iOjEsIuWQqyI6MSwi5b2xIjoxLCLms4EiOjEsIua4oSI6MCwi6Z+/IjoxLCLnpagiOjEsIuaZryI6MSwi5oqcIjowLCLoqLQiOjEsIuionyI6MSwi6YCuIjoxLCLlgJkiOjEsIuaniyI6MSwi5qihIjoxLCLmjZUiOjEsIuWKuSI6MSwi5bGeIjoxLCLmhaMiOjEsIuixiiI6MSwi5rqAIjoxLCLogqUiOjEsIuW3uyI6MSwi5o2cIjoxLCLntZ4iOjEsIumaoCI6MSwi6LypIjoxLCLmjpsiOjAsIuabvyI6MCwi576pIjoxLCLmlbUiOjEsIua4iCI6MSwi5aeUIjoxLCLmjJkiOjEsIuWItiI6MSwi5YikIjoxLCLli5kiOjEsIuafuyI6MSwi57ePIjoxLCLoqK0iOjEsIuizhyI6MSwi5qipIjoxLCLku7YiOjEsIua0viI6MSwi5bKhIjowLCLntKAiOjEsIuaWrSI6MSwi6KmVIjoxLCLku7siOjEsIuaJuSI6MSwi5qScIjoxLCLlr6kiOjEsIuadoSI6MSwi6LKsIjoxLCLnnIEiOjEsIueojiI6MSwi5aKXIjoxLCLop6MiOjEsIumamyI6MSwi6KqNIjoxLCLkvIEiOjEsIumsvCI6MSwi6Z2pIjoxLCLkv7MiOjEsIuijgSI6MSwi5ZG8IjowLCLlj44iOjEsIuWBnCI6MSwi6IG3IjoxLCLopo8iOjEsIuittyI6MSwi5YmyIjowLCLltI4iOjAsIua8lCI6MSwi5b6LIjoxLCLluKsiOjEsIueciyI6MSwi5rqWIjoxLCLliYciOjEsIuWwjiI6MSwi5YKZIjoxLCLlubkiOjEsIuW8tSI6MSwi5YSqIjoxLCLmsqIiOjEsIuWuhSI6MSwi5pa9IjoxLCLotIUiOjEsIuePviI6MSwi5LmzIjoxLCLln44iOjAsIuengCI6MSwi5oKpIjowLCLmmociOjEsIuiDgyI6MSwi6YOOIjoxLCLmi5siOjEsIuautSI6MSwi6IW5IjoxLCLnl5siOjEsIumAgCI6MSwi5bGIIjoxLCLnuZQiOjEsIuiyuCI6MCwi6L+3IjoxLCLmg5EiOjEsIuiqmCI6MSwi5bCxIjoxLCLnl4ciOjEsIuioqiI6MSwi5oCSIjoxLCLmmIciOjEsIuecoCI6MSwi552hIjoxLCLnt6AiOjEsIui/qyI6MSwi6Z20IjowLCLmv4MiOjEsIuerryI6MSwi5qW1IjoxLCLlgaUiOjEsIumAlCI6MSwi5bq3IjoxLCLntaYiOjEsIumbhCI6MSwi5aiYIjowLCLkub4iOjEsIueboyI6MSwi5p2vIjoxLCLlgqwiOjEsIuS/gyI6MSwi5qynIjoxLCLmsZ8iOjAsIuiriyI6MSwi6Z+TIjoxLCLlo4oiOjEsIuiouiI6MSwi6ZajIjoxLCLlg5oiOjEsIuepjSI6MSwi552jIjoxLCLnlaUiOjEsIuiHoyI6MSwi6IiqIjoxLCLlr4QiOjEsIuadvyI6MSwi6KGXIjoxLCLlrpciOjEsIue3iiI6MSwi5a60IjoxLCLmgZAiOjEsIuaAliI6MSwi5re7IjoxLCLnjJsiOjEsIueDiCI6MSwi57SiIjoxLCLoqbAiOjAsIuelnSI6MSwi5ouFIjoxLCLpoY0iOjEsIuijvSI6MSwi54eDIjoxLCLpgZUiOjAsIui8uCI6MSwi5bGKIjowLCLni60iOjAsIuiCqSI6MCwi6IWVIjowLCLohbAiOjAsIuinpiI6MSwi6KaWIjoxLCLovIkiOjEsIuWxpCI6MSwi5Z6LIjoxLCLluoEiOjEsIuW3riI6MSwi5q2mIjoxLCLnrqEiOjEsIuixoSI6MSwi6YePIjoxLCLlooMiOjEsIueSsCI6MSwi6LOqIjoxLCLov7AiOjEsIuS+myI6MSwi5bGVIjoxLCLosqkiOjEsIuagqiI6MCwi6LOAIjoxLCLlkIQiOjEsIuiqlSI6MSwi572wIjoxLCLohLEiOjEsIumBjiI6MSwi5Z2KIjoxLCLlr50iOjAsIuWuriI6MCwi5qGIIjoxLCLnva4iOjEsIuS+oSI6MSwi6LK7IjoxLCLli6IiOjEsIuWWtiI6MSwi56S6IjoxLCLntbEiOjEsIumgmCI6MSwi562WIjoxLCLol6QiOjAsIuWJryI6MSwi6KazIjoxLCLlgKQiOjEsIuWQuCI6MSwi5ae/IjoxLCLln58iOjEsIuW/nCI6MSwi5o+QIjoxLCLmj7QiOjEsIueKtiI6MSwi5oWLIjoxLCLpgKAiOjEsIuaOiCI6MSwi5Y2wIjoxLCLlibUiOjEsIuW+gCI6MSwi5b6pIjoxLCLovIMiOjEsIuethiI6MSwi6YmbIjoxLCLosq8iOjEsIuaIkSI6MSwi5pWFIjoxLCLpmpwiOjEsIuW+kyI6MSwi5r+AIjoxLCLliLoiOjEsIuWKsSI6MSwi6KiOIjoxLCLpg7UiOjEsIumHnSI6MSwi5b60IjoxLCLmgKoiOjEsIueNoyI6MSwi56qBIjoxLCLoj5MiOjEsIuaysyI6MSwi5rGXIjowLCLmjK8iOjEsIuixmiI6MCwi5YaNIjoxLCLmjqUiOjEsIueLrCI6MSwi5Y2gIjoxLCLlt6giOjEsIuWmmSI6MSwi6bqXIjoxLCLkuKYiOjEsIuWGtyI6MSwi5YemIjoxLCLpgIYiOjEsIuW6qyI6MSwi5YWQIjoxLCLlh40iOjEsIuW5vCI6MSwi56iaIjoxLCLljZoiOjEsIuWlhyI6MSwi5riFIjoxLCLmvZQiOjEsIumMsiI6MSwi5L+uIjoxLCLpmooiOjEsIuWIuCI6MSwi5ammIjoxLCLlvq4iOjEsIuebiiI6MSwi56e7IjoxLCLnsr4iOjEsIueoiyI6MSwi57W2IjoxLCLmhrIiOjEsIuihhiI6MSwi5YKYIjowLCLmtZwiOjAsIuaSgyI6MSwi5pS7IjoxLCLntroiOjEsIumthSI6MSwi57O7IjoxLCLmuIciOjAsIuWpmiI6MSwi6YGKIjoxLCLml5ciOjEsIueFpyI6MSwi5b+rIjoxLCLniYgiOjEsIuiypyI6MSwi5LmPIjoxLCLpgakiOjEsIumgkCI6MSwi5bu2IjoxLCLnv4wiOjEsIuimpyI6MSwi5oeQIjowLCLmirwiOjAsIuabtCI6MSwi5rWuIjowLCLmnpUiOjAsIua8jyI6MSwi56ymIjoxLCLos7wiOjEsIui2iiI6MSwi6aO+IjoxLCLpqJIiOjEsIuiDjCI6MSwi5pKuIjoxLCLnm5ciOjF9Owp2YXIga2FuamlZb21pSEVMTCA9IHsi6b2iIjoxLCLpnIAiOjEsIuWunCI6MCwi57mwIjowLCLpgb8iOjEsIuWmiiI6MSwi5aigIjoxLCLoh7QiOjEsIuWIiiI6MSwi5aWPIjoxLCLkvLQiOjEsIuS9tSI6MSwi5YK+IjoxLCLljbQiOjEsIuWlpSI6MCwi5oWuIjoxLCLmh7giOjEsIuaIvyI6MSwi5omxIjowLCLmipEiOjEsIuaKniI6MSwi5o+PIjoxLCLnm6QiOjEsIue3kiI6MSwi56ewIjoxLCLnt6kiOjAsIuiolyI6MSwi6LOEIjoxLCLos4IiOjEsIui0iCI6MSwi6YCDIjoxLCLpgoQiOjEsIuaLkiI6MSwi6Yi0IjoxLCLpgqYiOjEsIumYnCI6MSwi5bKQIjoxLCLpm4ciOjEsIumahiI6MSwi5o6nIjowLCLlo4EiOjAsIuajiyI6MSwi5riLIjoxLCLnvqQiOjEsIueJhyI6MCwi5LuZIjoxLCLlhYUiOjEsIuWFjSI6MSwi5YunIjoxLCLlnI8iOjEsIuWfiyI6MCwi5Z+8IjowLCLlpaoiOjAsIuW+oSI6MSwi5oWOIjoxLCLnlLIiOjEsIuaeoCI6MCwi5paQIjoxLCLnpYkiOjEsIueosiI6MCwi6KyZIjoxLCLorbIiOjEsIui6jSI6MSwi6YqDIjoxLCLpi7wiOjEsIumghSI6MSwi5aCAIjowLCLpmqMiOjEsIumhpyI6MSwi6aeQIjoxLCLpp4YiOjAsIuWUsSI6MSwi5p+xIjoxLCLlrZ0iOjEsIuS/iiI6MSwi5YW8IjoxLCLlkLkiOjAsIuWJpCI6MSwi5behIjoxLCLmiJIiOjEsIuaOkiI6MSwi5pC6IjoxLCLpi60iOjEsIuaVjyI6MSwi5pW3IjowLCLmrr8iOjEsIueKoCI6MSwi542yIjoxLCLojIIiOjEsIumbhSI6MSwi6aC7IjoxLCLnuYEiOjEsIuauliI6MSwi6KGdIjoxLCLoloQiOjEsIuiqiSI6MSwi6KSSIjoxLCLpgI8iOjEsIuWtqyI6MSwi5a+MIjoxLCLono0iOjEsIumboiI6MSwi57eoIjoxLCLoj68iOjEsIuaXoiI6MSwi5pmuIjoxLCLosaoiOjEsIumRkSI6MSwi6ZmkIjoxLCLlsIsiOjEsIuW5viI6MCwi5buKIjoxLCLmjoMiOjEsIuazpSI6MSwi6amaIjoxLCLmo5IiOjEsIuWYhiI6MSwi5YCJIjoxLCLlt6MiOjAsIuaVkSI6MSwi5bivIjoxLCLlvoQiOjEsIuaVoyI6MSwi57KJIjoxLCLohIgiOjEsIuiPnCI6MSwi6LKoIjoxLCLpmbgiOjEsIuS8vCI6MSwi5aKTIjoxLCLlnYciOjEsIuW+syI6MSwi5o6iIjoxLCLlgbUiOjEsIueUmCI6MCwi5bCGIjoxLCLml6ciOjEsIuWnkyI6MSwi6LK/IjoxLCLnm58iOjEsIumBuiI6MSwi5YK1IjoxLCLkvLgiOjAsIuWPiiI6MSwi5aWIIjoxLCLluYUiOjAsIuW7gyI6MSwi5o+bIjoxLCLmkZgiOjEsIuaguCI6MSwi57iEIjoxLCLmspYiOjAsIua0pSI6MCwi54yuIjoxLCLnmYIiOjEsIue2mSI6MSwi57atIjoxLCLkvI4iOjEsIuiIniI6MSwi6LiPIjoxLCLoiKwiOjEsIumgvCI6MSwi5L6dIjoxLCLoq74iOjEsIum5vyI6MCwi54mZIjoxLCLotoUiOjEsIuWFhiI6MSwi5oqxIjowLCLot6EiOjEsIuaIuyI6MCwi6LezIjoxLCLmmK0iOjEsIua8gSI6MSwi5YSfIjoxLCLli58iOjEsIuWIkSI6MSwi5Z+3IjoxLCLloYEiOjEsIuW0qSI6MSwi5oKjIjoxLCLmipciOjEsIuaKtSI6MSwi5pesIjoxLCLniIYiOjEsIua5viI6MSwi5by+IjoxLCLogbQiOjEsIumBoyI6MSwi6ZeYIjoxLCLpppkiOjEsIumZoyI6MSwi6IeoIjoxLCLliYoiOjEsIuWlkSI6MSwi5o6yIjoxLCLni5kiOjEsIuiRrCI6MSwi5oG1IjoxLCLolLUiOjEsIuewoSI6MSwi6ZaJIjoxLCLoqowiOjEsIueqkyI6MCwi5ZCmIjoxLCLnrYsiOjEsIuWegiI6MSwi5a6jIjoxLCLlsIoiOjEsIuW/oCI6MSwi5ouhIjoxLCLmk40iOjEsIuaVrCI6MSwi54GwIjowLCLnhp8iOjEsIueVsCI6MSwi55qHIjoxLCLnm5siOjEsIueggiI6MSwi5rygIjoxLCLns5YiOjEsIue0jSI6MSwi6IK6IjoxLCLokZciOjEsIuiSuCI6MSwi6KOFIjoxLCLoo48iOjAsIuiruCI6MSwi6LODIjoxLCLmmq4iOjEsIumGpCI6MSwi54KOIjoxLCLnoLQiOjEsIuadiSI6MCwi54aKIjowLCLphaIiOjAsIueNhCI6MSwi6YqFIjoxLCLpgYUiOjEsIua4rCI6MSwi5b2rIjoxLCLoiI4iOjEsIuismyI6MSwi5rueIjoxLCLku4siOjEsIue0uSI6MSwi5bexIjoxLCLljoQiOjEsIuS6gCI6MCwi5LqSIjoxLCLliaMiOjEsIuW9vCI6MCwi5a+/IjoxLCLmgaUiOjAsIuaxgSI6MSwi5ZmMIjoxLCLngroiOjEsIumFlCI6MSwi6Y2LIjowLCLmuZYiOjEsIuaJlSI6MCwi5rK5IjoxLCLkuYUiOjEsIuWNtSI6MCwi6L68IjowLCLluo8iOjEsIuW/lyI6MSwi6L+OIjoxLCLmgakiOjEsIuaOoSI6MSwi5qGcIjowLCLmsLgiOjEsIua2siI6MSwi55y8IjoxLCLnpZYiOjEsIue4viI6MSwi6IiIIjoxLCLooZsiOjEsIuikhyI6MSwi6ZuRIjoxLCLphbgiOjEsIuizmyI6MSwi6YqtIjoxLCLpo7wiOjAsIuWCtyI6MSwi5YWaIjoxLCLljrMiOjEsIuaNqCI6MCwi5a+GIjoxLCLmsZoiOjEsIuaaliI6MSwi5qyyIjoxLCLmnLoiOjAsIuenmCI6MSwi6KizIjoxLCLmn5MiOjEsIueIqiI6MCwi5oudIjoxLCLlpbQiOjEsIuixhiI6MSwi6KqkIjoxLCLoh5MiOjEsIuiytCI6MSwi6ZmNIjoxLCLkuLwiOjEsIuWQkCI6MCwi6Zq3IjoxLCLoiosiOjAsIue4riI6MSwi57SUIjoxLCLnuKYiOjAsIueyiyI6MSwi56OBIjoxLCLntIUiOjEsIuWwhCI6MSwi5bmVIjoxLCLolqYiOjEsIuaPriI6MSwi5o6oIjoxLCLmsr8iOjEsIua6kCI6MSwi5YukIjoxLCLmrZMiOjEsIuaJvyI6MSwi5p6dIjoxLCLmkI0iOjEsIuWIuyI6MSwi6IWQIjoxLCLogZYiOjF9Owp2YXIga2FuamlZb21pUEFSQURJU0UgPSB7IuaPoSI6MSwi57SbIjoxLCLns74iOjEsIuaeoiI6MSwi6Lu4IjoxLCLlhYsiOjEsIuWPjCI6MSwi5YiwIjoxLCLlk7IiOjEsIuWWqiI6MSwi5aCFIjowLCLmi6wiOjEsIuW6iiI6MSwi5bynIjoxLCLmjJEiOjEsIuaOmCI6MSwi5o+6IjoxLCLmj5oiOjEsIuaWjiI6MSwi5p6QIjoxLCLmmqsiOjEsIuaziiI6MSwi5p+EIjowLCLmvZ8iOjAsIua7kSI6MSwi56+EIjoxLCLnhKYiOjEsIue2sSI6MCwi57ayIjoxLCLogp0iOjEsIuiKnSI6MCwi6I2SIjowLCLooosiOjAsIuehrCI6MSwi5puHIjowLCLmvoQiOjEsIuefmyI6MSwi6IKMIjowLCLoiJ8iOjAsIueLqSI6MCwi5Ye2IjoxLCLpkJgiOjEsIuWhiiI6MCwi6aCDIjowLCLohJoiOjEsIumtgiI6MSwi5LqVIjoxLCLkuZ8iOjAsIuWRqiI6MCwi5ayiIjoxLCLmmqYiOjEsIuecuiI6MSwi6LOtIjowLCLoo7giOjEsIueWsiI6MSwi5Y2TIjoxLCLlob4iOjEsIuiPjCI6MSwi56OoIjowLCLpmbAiOjEsIua5vyI6MSwi6ZyKIjoxLCLlq4EiOjAsIueovCI6MSwi5rqdIjoxLCLni4IiOjEsIua7nSI6MCwi57+UIjowLCLloqgiOjAsIumzqSI6MCwi56mPIjoxLCLpiI0iOjEsIumtlCI6MSwi5a+uIjoxLCLmo58iOjEsIuebhiI6MSwi5ZC+IjowLCLmlqwiOjEsIuWvpyI6MSwi5qSFIjoxLCLmrbMiOjEsIua2vCI6MSwi54y/IjowLCLnnrMiOjEsIumNtSI6MCwi6Zu2IjoxLCLnooEiOjEsIuW5vSI6MSwi56efIjoxLCLms6EiOjEsIueZliI6MCwi6Y2bIjoxLCLpjKwiOjEsIuepgiI6MCwi5bidIjoxLCLoj4oiOjEsIueerCI6MSwi6KqHIjoxLCLluoQiOjEsIumYuyI6MSwi5L+1IjoxLCLpu5kiOjEsIue2vyI6MSwi5p62IjoxLCLlrZQiOjEsIuWUhyI6MCwi56CVIjoxLCLnspgiOjEsIueypyI6MSwi5qy6IjoxLCLoqZAiOjEsIumcpyI6MCwi5p+zIjoxLCLkvIoiOjEsIuS9kCI6MSwi556tIjoxLCLlsLoiOjEsIuWTgCI6MSwi5aGAIjoxLCLlpoIiOjEsIuWinCI6MSwi5amGIjoxLCLltJYiOjEsIuW4vSI6MSwi5bmjIjoxLCLmgagiOjEsIuaGjiI6MSwi5oapIjoxLCLmiYciOjEsIuaJiSI6MSwi5o6MIjoxLCLmjL8iOjEsIua7tCI6MSwi54KKIjoxLCLnlbMiOjEsIueIvSI6MCwi5664IjowLCLoiq8iOjEsIuiDtCI6MSwi6Jm5IjowLCLlt74iOjEsIumcnCI6MCwi6JqKIjowLCLpqI4iOjEsIuW4syI6MSwi6JuHIjowLCLovrEiOjEsIuiyvCI6MCwi6YmiIjoxLCLpl4ciOjAsIumamSI6MCwi6aOiIjoxLCLppJMiOjEsIueVnCI6MSwi6L+FIjoxLCLok4QiOjEsIuWwvSI6MSwi5b2pIjoxLCLmurYiOjEsIuaGtiI6MSwi6ICQIjoxLCLouIoiOjAsIuizoiI6MSwi6LydIjoxLCLnga8iOjEsIuiEhSI6MSwi6bq7IjoxLCLlkrIiOjAsIuaClCI6MSwi5Z+5IjoxLCLohIciOjAsIumBgiI6MSwi5aGXIjoxLCLnj60iOjEsIuaWnCI6MSwi5q60IjoxLCLnm74iOjEsIuepqyI6MSwi6ba0IjowLCLmt6EiOjEsIue0qyI6MSwi6aeSIjowLCLmir0iOjEsIuiqkyI6MSwi5oKfIjoxLCLmi5MiOjEsIuaLmCI6MSwi56SOIjoxLCLliIgiOjAsIuWJmyI6MSwi5ZSvIjoxLCLlsLwiOjEsIuWjhyI6MSwi5qaCIjoxLCLmtbgiOjEsIueFriI6MCwi6KaGIjoxLCLorIAiOjEsIumalCI6MSwi6Zm2IjoxLCLkv5ciOjEsIuW+gSI6MSwi6ZmbIjoxLCLmoZEiOjAsIua9pCI6MSwi54+gIjoxLCLoobAiOjEsIuWKoyI6MSwi5aWoIjoxLCLli5giOjEsIuWmgyI6MSwi6YKqIjoxLCLmkKwiOjEsIuWisyI6MSwi5b2wIjoxLCLpp4QiOjEsIuW7tyI6MSwi6KiCIjoxLCLlo64iOjEsIua8giI6MSwi6bCQIjowLCLon7kiOjAsIuewvyI6MSwi5pm2IjoxLCLou4wiOjEsIua2ryI6MSwi5benIjoxLCLls7AiOjEsIuWUkCI6MSwi6ayxIjoxLCLmvKsiOjEsIuirriI6MSwi6YqYIjoxLCLloLAiOjAsIuWgpCI6MSwi57+7IjoxLCLlkI4iOjEsIuWlriI6MSwi5LuwIjoxLCLkuq0iOjEsIuS8ryI6MSwi5YG2IjoxLCLmt4AiOjAsIuaKiiI6MSwi5rSeIjoxLCLnlqsiOjEsIuijgiI6MSwi57GNIjoxLCLmn5QiOjEsIuayiCI6MSwi5rK8IjowLCLoqrAiOjAsIuilsiI6MSwi6LKiIjoxLCLotqMiOjEsIui3nSI6MSwi5pyXIjoxLCLljbMiOjEsIuaXqCI6MSwi5aiBIjoxLCLnrZIiOjEsIuePjSI6MSwi6ZyyIjoxLCLliLciOjEsIueJpyI6MSwi5r2uIjoxLCLlnqMiOjAsIuWwgSI6MSwi5bKzIjoxLCLmhbAiOjEsIuaHhyI6MSwi5oeyIjoxLCLmkakiOjEsIuaTpiI6MSwi5paJIjoxLCLmkrIiOjEsIua7hSI6MSwi5rOwIjoxLCLngokiOjEsIua7iyI6MSwi55C0IjowLCLoh7MiOjEsIuWEgCI6MSwi6JmOIjowLCLpgZwiOjEsIuS8uiI6MCwi5b65IjoxLCLngKwiOjAsIuaOqiI6MSwi5pKkIjoxLCLmi6AiOjEsIuaouSI6MSwi5qOEIjoxLCLom40iOjAsIuicgiI6MCwi6YWOIjoxLCLonJwiOjEsIuWinyI6MSwi5r2cIjoxLCLoiaYiOjEsIuaLsyI6MSwi54KtIjoxLCLnlZEiOjAsIuS7gSI6MSwi5YyFIjoxLCLooaMiOjEsIumJsSI6MSwi6KqgIjoxLCLpg7ciOjEsIuS+tSI6MSwi5YG9IjoxLCLpm7ciOjEsIui+myI6MSwi57KSIjoxLCLkuJgiOjEsIuWoryI6MSwi5paXIjoxLCLorI4iOjAsIuacsSI6MSwi5aGUIjoxLCLpq6oiOjAsIuegsiI6MSwi5a+4IjoxLCLnq5wiOjEsIue4gSI6MSwi57+8IjoxLCLlkIkiOjEsIuWIgyI6MCwi5b+NIjoxLCLmoYMiOjAsIuS+jSI6MCwi5L+6IjowLCLlj7EiOjAsIuaiqCI6MCwi5Yy5IjowLCLph6MiOjAsIuWPqyI6MSwi56ygIjowLCLltZAiOjAsIue8tiI6MSwi5raZIjoxLCLmo5oiOjAsIuWnqyI6MCwi6Iq9IjowfTsKdmFyIGthbmppWW9taVJFQUxJVFkgPSB7Iui7kiI6MSwi5aqbIjowLCLnjoQiOjEsIuWBiSI6MSwi6aCCIjoxLCLlj6wiOjEsIuaeryI6MSwi5oyfIjowLCLmsrgiOjEsIua/ryI6MSwi54elIjoxLCLnk7YiOjEsIuiCryI6MSwi6ICVIjoxLCLohIIiOjEsIuiGmiI6MSwi6LufIjoxLCLpg4oiOjEsIumahSI6MCwi6Zq7IjoxLCLpgrgiOjEsIua4piI6MSwi6YOhIjoxLCLph4giOjEsIuiCqiI6MSwi5ZaaIjoxLCLosp4iOjEsIuiLlyI6MSwi5oWIIjoxLCLopZ8iOjAsIuiTriI6MSwi6IGhIjoxLCLkuq4iOjEsIua1piI6MCwi5aGaIjowLCLmvLgiOjAsIuiXuyI6MSwi5aaEIjoxLCLlgLkiOjEsIueLkCI6MCwi6YCdIjoxLCLljL8iOjEsIuWvoSI6MSwi55eiIjoxLCLol40iOjAsIuWdkSI6MSwi55WUIjoxLCLllIQiOjAsIuaLtyI6MSwi5riTIjoxLCLlu4kiOjEsIuisuSI6MSwi5rmnIjoxLCLphpwiOjEsIuWNhyI6MCwi5q6JIjoxLCLnhakiOjEsIuWKviI6MSwi5qGfIjoxLCLlqb8iOjAsIuaFlSI6MSwi5723IjoxLCLnn68iOjEsIuWbmiI6MSwi5p+QIjoxLCLms4wiOjEsIuibriI6MSwi5bq2IjoxLCLpr6giOjEsIuiNmCI6MSwi5qC9IjoxLCLlhqAiOjEsIuaLkCI6MSwi5YuyIjoxLCLphawiOjEsIuashCI6MSwi57SLIjoxLCLljbgiOjAsIumAuCI6MSwi5bCaIjoxLCLpoZUiOjEsIueymyI6MSwi5oSaIjoxLCLot7UiOjEsIuWRiCI6MSwi55aOIjoxLCLnlr4iOjEsIuisoSI6MSwi6Y6MIjowLCLphbciOjEsIuWPmSI6MSwi5LiUIjowLCLnl7QiOjEsIuWRhiI6MSwi5ZO6IjoxLCLmgqAiOjEsIuWCsiI6MSwi6IyOIjowLCLpmL8iOjEsIuadjyI6MSwi6IycIjowLCLmoJ4iOjAsIuS8jyI6MSwi6Y6uIjoxLCLlpYkiOjEsIuaGgiI6MSwi5qCDIjowLCLmnLQiOjEsIue0ryI6MSwi5oOcIjoxLCLkvbMiOjEsIuaCvCI6MSwi6KmyIjoxLCLotbQiOjEsIumrhCI6MSwi5YKNIjoxLCLnmZIiOjEsIumDrSI6MSwi5bC/IjoxLCLomZwiOjEsIuizkyI6MSwi5oa+IjoxLCLlvKUiOjAsIueylyI6MSwi5b6qIjoxLCLohIoiOjEsIuWHnSI6MSwi5piMIjoxLCLml6YiOjEsIuaEiSI6MSwi5qCTIjoxLCLmirkiOjEsIuS5iyI6MCwi6b6NIjoxLCLnkZsiOjEsIumBvCI6MSwi6YKjIjoxLCLlr4IiOjEsIuW6uCI6MSwi5ouNIjoxLCLnjLYiOjEsIuWusCI6MSwi57irIjoxLCLlkYkiOjEsIuWHoSI6MSwi5oGtIjowLCLpjK8iOjEsIuepgCI6MSwi5byKIjoxLCLpmbUiOjEsIuiItiI6MSwi5oKmIjoxLCLnqq4iOjEsIue4myI6MSwi6L2EIjoxLCLlvKYiOjEsIua0qiI6MSwi56qSIjoxLCLmkYIiOjEsIumjvSI6MSwi6Z2WIjowLCLntLMiOjEsIuWYiSI6MSwi5pC+IjoxLCLonbYiOjEsIueikSI6MSwi5bCJIjoxLCLljKAiOjEsIuWHmyI6MSwi6YGlIjowLCLmmboiOjEsIuaftCI6MCwi55GgIjoxLCLmlaIiOjEsIualkyI6MSwi5Ye5IjoxLCLlh7giOjEsIuiQjCI6MSwi54OPIjowLCLos4oiOjEsIuaXiyI6MSwi6byTIjoxLCLohbgiOjEsIuanvSI6MSwi5LyQIjoxLCLloJUiOjEsIua8rCI6MCwi5Z2qIjowLCLntLoiOjEsIue+hSI6MSwi5bOhIjoxLCLkv7giOjEsIumGuCI6MSwi5byUIjoxLCLkuZkiOjEsIuihoSI6MSwi6YGNIjoxLCLmrL4iOjEsIumWsiI6MSwi5ZadIjoxLCLohpwiOjEsIuebsiI6MSwi6YW1IjoxLCLog44iOjEsIumBriI6MSwi5ZOJIjowLCLokrwiOjEsIuWHhiI6MSwi5a+bIjoxLCLog54iOjEsIua1hCI6MSwi6ZqPIjoxLCLnqL8iOjEsIuS4uSI6MSwi5aOMIjoxLCLoiJciOjEsIumosCI6MSwi57evIjoxLCLoiYciOjEsIuaKqyI6MSwi6YymIjowLCLlibAiOjEsIue5iiI6MSwi6KutIjoxLCLmg6giOjEsIuiZkCI6MSwi5o2uIjowLCLlvpAiOjEsIuaQrSI6MSwi6JKZIjoxLCLnk5wiOjEsIumviSI6MCwi5oi0IjoxLCLnt4siOjEsIuabmSI6MCwi6IOhIjoxLCLluKUiOjEsIuWVkyI6MSwi6JG1IjowLCLpp78iOjEsIuirkiI6MSwi6I6JIjoxLCLpgYciOjEsIumZpSI6MSwi6LKrIjoxLCLopociOjEsIuiMqCI6MCwi5ZGCIjoxLCLmk4EiOjEsIuWtpCI6MSwi6Y6WIjoxLCLos6AiOjEsIuWZtCI6MSwi56WlIjoxLCLnibIiOjEsIuWUhiI6MSwi56epIjoxLCLohqgiOjEsIuiKsyI6MSwi5oGSIjoxLCLlgKsiOjEsIumZsyI6MSwi6aCIIjoxLCLlgY8iOjEsIuezpyI6MSwi5q6KIjoxLCLmhaIiOjEsIuayoSI6MSwi5oCgIjoxLCLpga0iOjEsIuaDsCI6MSwi54yfIjoxLCLkuYMiOjEsIumiryI6MSwi57a+IjoxLCLpmrwiOjAsIui8lCI6MCwi56GrIjoxLCLotaYiOjEsIueqgyI6MSwi5oWoIjoxLCLmiK8iOjEsIuaJtiI6MSwi5r+BIjoxLCLlpZQiOjEsIuiCliI6MSwi5py9IjoxLCLkuqsiOjEsIuauuyI6MSwi6JepIjoxLCLpto8iOjEsIuWqkiI6MSwi5ZixIjoxLCLmpI4iOjEsIui/rSI6MSwi57W5IjoxLCLpmaoiOjEsIuitnCI6MSwi5YmWIjoxLCLmt5EiOjEsIuW4hiI6MSwi6YWMIjoxLCLmhqQiOjEsIuaagSI6MCwi5YKRIjoxLCLpjKAiOjEsIuWHjCI6MCwi55GeIjowLCLoj4UiOjAsIueSgyI6MSwi5ryjIjoxLCLlkJ8iOjEsIuS+riI6MSwi6YuzIjoxLCLolJEiOjEsIuiDhiI6MSwi5rWqIjoxLCLnpo0iOjEsIumFqiI6MSwi5oanIjowLCLkupwiOjEsIuaFtiI6MSwi5qKTIjowLCLmsbAiOjEsIuaymSI6MSwi5b+MIjoxLCLpgbciOjEsIuaLmSI6MSwi56+kIjoxLCLls6AiOjAsIuWPlCI6MCwi6ZuMIjowLCLloKoiOjAsIuW0hyI6MSwi55SaIjoxLCLmvIYiOjEsIuWyrCI6MCwi57ShIjoxLCLnpIEiOjEsIuWxryI6MSwi5ae7IjoxLCLnnaYiOjEsIuaTrCI6MSwi6ZaRIjoxLCLmm7kiOjEsIuWNkSI6MSwi6KmgIjoxfTsKCi8qCiogVXNlZCBmb3Igc3dpdGNoaW5nIGJldHdlZW4gaGlyYSBhbmQga2F0YSAodmljZSB2ZXJzYSkKKi8KdmFyIGhpcmFUb0thdGEgPSB7IuOCgSI6ICLjg6EiLCAi44KAIjogIuODoCIsICLjgoMiOiAi44OjIiwgIuOCgiI6ICLjg6IiLCAi44KFIjogIuODpSIsICLjgoQiOiAi44OkIiwgIuOChyI6ICLjg6ciLCAi44KGIjogIuODpiIsICLjgokiOiAi44OpIiwgIuOCiCI6ICLjg6giLCAi44KLIjogIuODqyIsICLjgooiOiAi44OqIiwgIuOCjSI6ICLjg60iLCAi44KMIjogIuODrCIsICLjgo8iOiAi44OvIiwgIuOCkyI6ICLjg7MiLCAi44KSIjogIuODsiIsICLjgYIiOiAi44KiIiwgIuOBhCI6ICLjgqQiLCAi44GGIjogIuOCpiIsICLjgYgiOiAi44KoIiwgIuOBiyI6ICLjgqsiLCAi44GKIjogIuOCqiIsICLjgY0iOiAi44KtIiwgIuOBjCI6ICLjgqwiLCAi44GPIjogIuOCryIsICLjgY4iOiAi44KuIiwgIuOBkSI6ICLjgrEiLCAi44GQIjogIuOCsCIsICLjgZMiOiAi44KzIiwgIuOBkiI6ICLjgrIiLCAi44GVIjogIuOCtSIsICLjgZQiOiAi44K0IiwgIuOBlyI6ICLjgrciLCAi44GWIjogIuOCtiIsICLjgZkiOiAi44K5IiwgIuOBmCI6ICLjgrgiLCAi44GbIjogIuOCuyIsICLjgZoiOiAi44K6IiwgIuOBnSI6ICLjgr0iLCAi44GcIjogIuOCvCIsICLjgZ8iOiAi44K/IiwgIuOBniI6ICLjgr4iLCAi44GhIjogIuODgSIsICLjgaAiOiAi44OAIiwgIuOBoyI6ICLjg4MiLCAi44GiIjogIuODgiIsICLjgaUiOiAi44OFIiwgIuOBpCI6ICLjg4QiLCAi44GnIjogIuODhyIsICLjgaYiOiAi44OGIiwgIuOBqSI6ICLjg4kiLCAi44GoIjogIuODiCIsICLjgasiOiAi44OLIiwgIuOBqiI6ICLjg4oiLCAi44GtIjogIuODjSIsICLjgawiOiAi44OMIiwgIuOBryI6ICLjg48iLCAi44GuIjogIuODjiIsICLjgbEiOiAi44ORIiwgIuOBsCI6ICLjg5AiLCAi44GzIjogIuODkyIsICLjgbIiOiAi44OSIiwgIuOBtSI6ICLjg5UiLCAi44G0IjogIuODlCIsICLjgbciOiAi44OXIiwgIuOBtiI6ICLjg5YiLCAi44G5IjogIuODmSIsICLjgbgiOiAi44OYIiwgIuOBuyI6ICLjg5siLCAi44G6IjogIuODmiIsICLjgb0iOiAi44OdIiwgIuOBvCI6ICLjg5wiLCAi44G/IjogIuODnyIsICLjgb4iOiAi44OeIn07CnZhciBrYXRhVG9IaXJhID0geyLjg6EiOiAi44KBIiwgIuODoCI6ICLjgoAiLCAi44OjIjogIuOCgyIsICLjg6IiOiAi44KCIiwgIuODpSI6ICLjgoUiLCAi44OkIjogIuOChCIsICLjg6ciOiAi44KHIiwgIuODpiI6ICLjgoYiLCAi44OpIjogIuOCiSIsICLjg6giOiAi44KIIiwgIuODqyI6ICLjgosiLCAi44OqIjogIuOCiiIsICLjg60iOiAi44KNIiwgIuODrCI6ICLjgowiLCAi44OvIjogIuOCjyIsICLjg7MiOiAi44KTIiwgIuODsiI6ICLjgpIiLCAi44KiIjogIuOBgiIsICLjgqQiOiAi44GEIiwgIuOCpiI6ICLjgYYiLCAi44KoIjogIuOBiCIsICLjgqsiOiAi44GLIiwgIuOCqiI6ICLjgYoiLCAi44KtIjogIuOBjSIsICLjgqwiOiAi44GMIiwgIuOCryI6ICLjgY8iLCAi44KuIjogIuOBjiIsICLjgrEiOiAi44GRIiwgIuOCsCI6ICLjgZAiLCAi44KzIjogIuOBkyIsICLjgrIiOiAi44GSIiwgIuOCtSI6ICLjgZUiLCAi44K0IjogIuOBlCIsICLjgrciOiAi44GXIiwgIuOCtiI6ICLjgZYiLCAi44K5IjogIuOBmSIsICLjgrgiOiAi44GYIiwgIuOCuyI6ICLjgZsiLCAi44K6IjogIuOBmiIsICLjgr0iOiAi44GdIiwgIuOCvCI6ICLjgZwiLCAi44K/IjogIuOBnyIsICLjgr4iOiAi44GeIiwgIuODgSI6ICLjgaEiLCAi44OAIjogIuOBoCIsICLjg4MiOiAi44GjIiwgIuODgiI6ICLjgaIiLCAi44OFIjogIuOBpSIsICLjg4QiOiAi44GkIiwgIuODhyI6ICLjgaciLCAi44OGIjogIuOBpiIsICLjg4kiOiAi44GpIiwgIuODiCI6ICLjgagiLCAi44OLIjogIuOBqyIsICLjg4oiOiAi44GqIiwgIuODjSI6ICLjga0iLCAi44OMIjogIuOBrCIsICLjg48iOiAi44GvIiwgIuODjiI6ICLjga4iLCAi44ORIjogIuOBsSIsICLjg5AiOiAi44GwIiwgIuODkyI6ICLjgbMiLCAi44OSIjogIuOBsiIsICLjg5UiOiAi44G1IiwgIuODlCI6ICLjgbQiLCAi44OXIjogIuOBtyIsICLjg5YiOiAi44G2IiwgIuODmSI6ICLjgbkiLCAi44OYIjogIuOBuCIsICLjg5siOiAi44G7IiwgIuODmiI6ICLjgboiLCAi44OdIjogIuOBvSIsICLjg5wiOiAi44G8IiwgIuODnyI6ICLjgb8iLCAi44OeIjogIuOBviJ9OwoKaWYgKC9kYXNoYm9hcmQvLnRlc3QoZG9jdW1lbnQuVVJMKSB8fCBkb2N1bWVudC5VUkwgPT0gImh0dHA6Ly93d3cud2FuaWthbmkuY29tLyIgfHwgZG9jdW1lbnQuVVJMID09ICJodHRwczovL3d3dy53YW5pa2FuaS5jb20vIikgLy8gSG9tZXBhZ2UKewogICAgdmFyIHJlcGxhY2VQb3B1cCA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICBpZiAoIGlzT255b21pQWxsKCQodGhpcykudGV4dCgpKSA9PSAxKSAkKHRoaXMpLmF0dHIoKCdkYXRhLW9yaWdpbmFsLXRpdGxlJyksIGNvbnZlcnRUb0thdGEoJCh0aGlzKS5hdHRyKCdkYXRhLW9yaWdpbmFsLXRpdGxlJykpICk7CiAgICB9OwogICAgJCgnLmxhdHRpY2Utc2luZ2xlLWNoYXJhY3RlciBhW2RhdGEtb3JpZ2luYWwtdGl0bGVdJykuZWFjaChyZXBsYWNlUG9wdXApOwoKICAgIC8vIHRoaXMgaXMgZm9yIHNjcmlwdHMgd2hvIG1vZGlmeSB0aGUgaG9tZXNjcmVlbiBhZnRlciB0aGUgcGFnZSBmaW5pc2hlZCBsb2FkaW5nCiAgICAkKCcua2FuamktcHJvZ3Jlc3MgLmxhdHRpY2Utc2luZ2xlLWNoYXJhY3RlciAuc21hbGwtY2FwcyA+IHNwYW4nKS5iaW5kKCJET01TdWJ0cmVlTW9kaWZpZWQiLGZ1bmN0aW9uKCl7CiAgICAgICAgJCgnLmthbmppLXByb2dyZXNzIC5sYXR0aWNlLXNpbmdsZS1jaGFyYWN0ZXIgYVtkYXRhLW9yaWdpbmFsLXRpdGxlXScpLmVhY2gocmVwbGFjZVBvcHVwKTsKICAgIH0pOwoKfQplbHNlIGlmICgvXC9sYXR0aWNlXC9rYW5qaS8udGVzdChkb2N1bWVudC5VUkwpKSAvLyBMYXR0aWNlCnsKICAgIHZhciByZXBsYWNlUG9wdXAgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgaWYgKCBpc09ueW9taUFsbCgkKHRoaXMpLnRleHQoKSkgPT0gMSkgJCh0aGlzKS5hdHRyKCgnZGF0YS1vcmlnaW5hbC10aXRsZScpLCBjb252ZXJ0VG9LYXRhKCQodGhpcykuYXR0cignZGF0YS1vcmlnaW5hbC10aXRsZScpKSApOwogICAgfTsKICAgICQoJy5sYXR0aWNlLXNpbmdsZS1jaGFyYWN0ZXIgYVtkYXRhLW9yaWdpbmFsLXRpdGxlXScpLmVhY2gocmVwbGFjZVBvcHVwKTsKCn0KZWxzZSBpZiAoL1wva2FuamlcLy8udGVzdChkb2N1bWVudC5VUkwpKSAvLyBLYW5qaSBkZXRhaWwgcGFnZQp7CiAgICB2YXIgcmVwbGFjZVJlYWRpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoJCh0aGlzKS5jaGlsZHJlbignaDMnKS50ZXh0KCkgPT0gIk9u4oCZeW9taSIpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMpLmNoaWxkcmVuKCdwJykudGV4dChjb252ZXJ0VG9LYXRhKCQodGhpcykuY2hpbGRyZW4oJ3AnKS50ZXh0KCkpKTsKICAgICAgICB9CiAgICB9OwogICAgJCgnLnNwYW40JykuZWFjaChyZXBsYWNlUmVhZGluZyk7CgogICAgLy8tLS0tLS0tLS0gVmlzdWFsbHkgU2ltaWxhciBLYW5qaSAtLS0tLS0tLS0vLwogICAgdmFyIHJlcGxhY2VTaW1pbGFyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKGlzT255b21pQWxsKCQodGhpcykuZmluZCgnLmNoYXJhY3RlcicpLnRleHQoKSkgPT0gMSkgJCh0aGlzKS5maW5kKCdsaScpLmVxKDApLnRleHQoY29udmVydFRvS2F0YSgkKHRoaXMpLmZpbmQoJ2xpJykuZXEoMCkudGV4dCgpKSk7CiAgICB9OwogICAgJCgnLnNpbmdsZS1jaGFyYWN0ZXItZ3JpZCcpLmZpbmQoJ2EnKS5lYWNoKHJlcGxhY2VTaW1pbGFyKTsKfQplbHNlIGlmICgvXC9rYW5qaVw/ZGlmZmljdWx0Ly50ZXN0KGRvY3VtZW50LlVSTCkgfHwgZG9jdW1lbnQuVVJMID09ICJodHRwOi8vd3d3LndhbmlrYW5pLmNvbS9rYW5qaSIpIC8vIEJpZyBrYW5qaSBwYWdlIGJhc2VkIG9uIGRpZmZpY3VsdHkKewogICAgdmFyIG4gPSBkb2N1bWVudC5VUkwubGFzdEluZGV4T2YoJz0nKTsKICAgIHZhciBkaWZmaWN1bHR5ID0gZG9jdW1lbnQuVVJMLnN1YnN0cmluZyhuICsgMSk7CgogICAgdmFyIHJlcGxhY2VMZXZlbFBvcnRpb24gPSBmdW5jdGlvbigpIHsKICAgICAgICAkKHRoaXMpLmZpbmQoJy5jaGFyYWN0ZXItaXRlbScpLmVhY2gocmVwbGFjZVJlYWRpbmcpOwogICAgfTsKCiAgICB2YXIgcmVwbGFjZVJlYWRpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoaXNPbnlvbWkoJCh0aGlzKS5maW5kKCcuY2hhcmFjdGVyJykudGV4dCgpLnJlcGxhY2UoL1xzL2csJycpLCBkaWZmaWN1bHR5KSkgJCh0aGlzKS5maW5kKCdsaScpLmVxKDApLnRleHQoY29udmVydFRvS2F0YSgkKHRoaXMpLmZpbmQoJ2xpJykuZXEoMCkudGV4dCgpKSk7CiAgICB9OwogICAgJCgnLnNpbmdsZS1jaGFyYWN0ZXItZ3JpZCcpLmVhY2gocmVwbGFjZUxldmVsUG9ydGlvbik7Cn0KZWxzZSBpZiAoL1wvcmFkaWNhbHNcLy8udGVzdChkb2N1bWVudC5VUkwpIHx8wqAvXC92b2NhYnVsYXJ5XC8vLnRlc3QoZG9jdW1lbnQuVVJMKSkgLy8gUmFkaWNhbCBhbmQgVm9jYWJ1bGFyeSBwYWdlCnsKICAgIC8vLS0tLS0tLS0tIEZvdW5kIEluIGFuZCBVdGlsaXplZCBLYW5qaSAtLS0tLS0tLS0vLwogICAgdmFyIHJlcGxhY2VSZWFkaW5nID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKGlzT255b21pQWxsKCQodGhpcykuZmluZCgnLmNoYXJhY3RlcicpLnRleHQoKSkgPT0gMSkgJCh0aGlzKS5maW5kKCdsaScpLmVxKDApLnRleHQoY29udmVydFRvS2F0YSgkKHRoaXMpLmZpbmQoJ2xpJykuZXEoMCkudGV4dCgpKSk7CiAgICB9OwogICAgJCgnLnNpbmdsZS1jaGFyYWN0ZXItZ3JpZCcpLmZpbmQoJ2EnKS5lYWNoKHJlcGxhY2VSZWFkaW5nKTsKfQplbHNlIGlmICgvXC9sZXZlbFwvLy50ZXN0KGRvY3VtZW50LlVSTCkpIC8vIExldmVsIHBhZ2UKewogICAgdmFyIG4gPSBkb2N1bWVudC5VUkwubGFzdEluZGV4T2YoJy8nKTsKICAgIHZhciBsZXZlbCA9IGRvY3VtZW50LlVSTC5zdWJzdHJpbmcobiArIDEpOwoKICAgIHZhciByZXBsYWNlUmVhZGluZyA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmIChpc09ueW9taSgkKHRoaXMpLmNoaWxkcmVuKCcuY2hhcmFjdGVyJykudGV4dCgpLnJlcGxhY2UoL1xzL2csJycpLCBsZXZlbCkpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMpLmZpbmQoJ2xpJykuZXEoMCkudGV4dChjb252ZXJ0VG9LYXRhKCQodGhpcykuZmluZCgnbGknKS5lcSgwKS50ZXh0KCkpKTsKICAgICAgICB9CiAgICB9OwogICAgJCgnLnNpbmdsZS1jaGFyYWN0ZXItZ3JpZCcpLmVxKDEpLmZpbmQoJ2EnKS5lYWNoKHJlcGxhY2VSZWFkaW5nKTsKfQplbHNlIGlmICgvcmV2aWV3XC9zZXNzaW9uLy50ZXN0KGRvY3VtZW50LlVSTCkpIC8vIFJldmlldyB0ZXN0IHBhZ2UKewogICAgYW5zd2VyQ2hlY2tlci5vbGRJc0FzY2lpUHJlc2VudEtNID0gYW5zd2VyQ2hlY2tlci5pc0FzY2lpUHJlc2VudDsKICAgIGFuc3dlckNoZWNrZXIuaXNBc2NpaVByZXNlbnQgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgLy8gdGhpcyBpcyBmb3IgdHJhaWxpbmcgTiB0byDjg7MKICAgICAgICBpZihlW2UubGVuZ3RoLTFdID09PSAnTicpIHsKICAgICAgICAgICAgZSA9IGUuc3Vic3RyKDAsIGUubGVuZ3RoLTEpICsgJ+ODsycgKyBlLnN1YnN0cihlLmxlbmd0aCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhbnN3ZXJDaGVja2VyLm9sZElzQXNjaWlQcmVzZW50S00oZSk7CiAgICB9OwoKICAgIGFuc3dlckNoZWNrZXIub2xkRXZhbHVhdGVLTSA9IGFuc3dlckNoZWNrZXIuZXZhbHVhdGU7CiAgICBhbnN3ZXJDaGVja2VyLmV2YWx1YXRlID0gZnVuY3Rpb24oZSx0KSB7CiAgICAgICAgLy9jb25zb2xlLmxvZygkLmpTdG9yYWdlLmdldCgnY3VycmVudEl0ZW0nKSk7CiAgICAgICAgLy8gdGhpcyBpcyBmb3IgdHJhaWxpbmcgTiB0byDjg7MKICAgICAgICBpZihlID09PSAicmVhZGluZyIgJiYgdFt0Lmxlbmd0aC0xXSA9PT0gJ04nKSB7CiAgICAgICAgICAgIHQgPSB0LnN1YnN0cigwLCB0Lmxlbmd0aC0xKSArICfjg7MnICsgdC5zdWJzdHIodC5sZW5ndGgpOwogICAgICAgIH0KICAgICAgICBpZihpc09ueW9taVJldmlldygpKSB7CiAgICAgICAgICAgIC8vIHRoaXMgaXMgZm9yIHRoZSAiV2FuaUthbmkgaXMgbG9va2luZyBmb3IgdGhlIG9ueW9taSByZWFkaW5nIiBmdW5jdGlvbgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8ICQualN0b3JhZ2UuZ2V0KCdjdXJyZW50SXRlbScpLmt1bi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgJC5qU3RvcmFnZS5nZXQoJ2N1cnJlbnRJdGVtJykua3VuW2ldID0gY29udmVydFRvS2F0YSgkLmpTdG9yYWdlLmdldCgnY3VycmVudEl0ZW0nKS5rdW5baV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgJC5qU3RvcmFnZS5nZXQoJ2N1cnJlbnRJdGVtJykub24ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICQualN0b3JhZ2UuZ2V0KCdjdXJyZW50SXRlbScpLm9uW2ldID0gY29udmVydFRvS2F0YSgkLmpTdG9yYWdlLmdldCgnY3VycmVudEl0ZW0nKS5vbltpXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy9jb25zb2xlLmxvZygkLmpTdG9yYWdlLmdldCgnY3VycmVudEl0ZW0nKSk7CiAgICAgICAgcmV0dXJuIGFuc3dlckNoZWNrZXIub2xkRXZhbHVhdGVLTShlLHQpOwogICAgfTsKCiAgICAkKCcjdXNlci1yZXNwb25zZScpLm9uKCdpbnB1dCcsIGZ1bmN0aW9uKCkgewogICAgICAgIGlmKGlzT255b21pUmV2aWV3KCkpIHsKICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGNvbnZlcnRUb0thdGEoJCh0aGlzKS52YWwoKS50b1VwcGVyQ2FzZSgpKTsKICAgICAgICB9CiAgICB9KTsKCiAgICB2YXIgb2JzZXJ2ZU1lID0gJCgnI2l0ZW0taW5mbyAucHVyZS11LTEtNCcpWzBdOwogICAgb2JzZXJ2ZURPTSgpKCBvYnNlcnZlTWUgLGZ1bmN0aW9uKCkgewogICAgICAgIGlmKGlzT255b21pUmV2aWV3KCkpIHsKICAgICAgICAgICAgJCgnI2l0ZW0taW5mby1yZWFkaW5nID4gc3BhbicpLnRleHQoY29udmVydFRvS2F0YSgkKCcjaXRlbS1pbmZvLXJlYWRpbmcgPiBzcGFuJykudGV4dCgpKSk7CiAgICAgICAgfQogICAgfSk7CgogICAgLy8gY2hhbmdlIGxhc3QgMTAgaXRlbXMKICAgIHZhciBsYXN0MTBDaGFuZ2UgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYoaXNPbnlvbWlBbGwoJCh0aGlzKS5maW5kKCdsaScpLmVxKDApLnRleHQoKSkpewogICAgICAgICAgICAkKHRoaXMpLmZpbmQoJ2xpJykuZXEoMSkudGV4dChjb252ZXJ0VG9LYXRhKCQodGhpcykuZmluZCgnbGknKS5lcSgxKS50ZXh0KCkpKTsKICAgICAgICB9CiAgICB9OwogICAgdmFyIG9ic2VydmVNZSA9ICQoJyNsYXN0LWl0ZW1zLWxpc3QnKVswXTsKICAgIG9ic2VydmVET00oKSggb2JzZXJ2ZU1lICxmdW5jdGlvbigpIHsKICAgICAgICAkKCcjbGFzdC1pdGVtcy1saXN0IC5rYW5qaScpLmVhY2gobGFzdDEwQ2hhbmdlKTsKICAgIH0pOwp9CmVsc2UgaWYgKC9yZXZpZXcvLnRlc3QoZG9jdW1lbnQuVVJMKSkgLy8gUmV2aWV3IGluZm8gcGFnZSBhdCB0aGUgYmVnaW5uaW5nIGFuZCB0aGUgZW5kIG9mIGEgcmV2aWV3CnsKICAgIHZhciBvYnNlcnZlTWUgPSAkKCcjcmV2aWV3cy1zdW1tYXJ5JylbMF07CiAgICBvYnNlcnZlRE9NKCkoIG9ic2VydmVNZSAsZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGUgPSAkKCcua2FuamkgLmhvdmVyJyk7CiAgICAgICAgaWYoZS5sZW5ndGggIT09IDAgJiYgaXNPbnlvbWlBbGwoZS5wcmV2KCdhJykuZXEoMCkudGV4dCgpKSkgewogICAgICAgICAgICB2YXIgb255b21pTm9kZSA9IGUuZmluZCgndWwnKS5maW5kKCdsaScpLmVxKDEpOwogICAgICAgICAgICBvbnlvbWlOb2RlLnRleHQoY29udmVydFRvS2F0YShvbnlvbWlOb2RlLnRleHQoKSkpOwogICAgICAgIH0KICAgIH0pOwp9CmVsc2UgaWYgKC9sZXNzb25cL3Nlc3Npb24vLnRlc3QoZG9jdW1lbnQuVVJMKSkgLy8gTGVzc29uIGFuZCBsZXNzb24gdGVzdCBwYWdlCnsKICAgIC8vLS0tLS0tLS0tIExlc3NvbiBQYXJ0IC0tLS0tLS0tLS8vCiAgICB2YXIgd2hlbkxlc3NvblNsaWRlcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAvLyBLYW5qaSBpbmZvCiAgICAgICAgdmFyIHR5cGUgPSAkKCIjc3VwcGxlbWVudC1rYW4tcmVhZGluZy10eXBlIikudGV4dCgpOwogICAgICAgIGlmKHR5cGUgPT09ICJvbid5b21pIikgewogICAgICAgICAgICAkKCcjc3VwcGxlbWVudC1rYW4tcmVhZGluZyBzcGFuJykuZXEoMSkudGV4dChjb252ZXJ0VG9LYXRhKCQoJyNzdXBwbGVtZW50LWthbi1yZWFkaW5nIHNwYW4nKS5lcSgxKS50ZXh0KCkpKTsKICAgICAgICB9CiAgICAgICAgLy8gVm9jYWJsZSBicmVha2Rvd24gaW5mbwogICAgICAgICQoIiNzdXBwbGVtZW50LXZvYy1icmVha2Rvd24iKS5maW5kKCcua2FuamknKS5lYWNoKHJlcGxhY2VCcmVha2Rvd24pOwogICAgfTsKICAgIHZhciByZXBsYWNlQnJlYWtkb3duID0gZnVuY3Rpb24gKCkgewogICAgICAgIGlmKGlzT255b21pQWxsKCQodGhpcykudGV4dCgpKSkgewogICAgICAgICAgICAkKHRoaXMpLmF0dHIoInRpdGxlIiwgY29udmVydFRvS2F0YSgkKHRoaXMpLmF0dHIoJ3RpdGxlJykpKTsKICAgICAgICB9CiAgICB9OwogICAgJCgnI2JhdGNoLWl0ZW1zJykuY2xpY2sod2hlbkxlc3NvblNsaWRlcyk7CgogICAgLy8tLS0tLS0tLS0gVGVzdCBQYXJ0IC0tLS0tLS0tLS8vCiAgICBhbnN3ZXJDaGVja2VyLm9sZElzQXNjaWlQcmVzZW50S00gPSBhbnN3ZXJDaGVja2VyLmlzQXNjaWlQcmVzZW50OwogICAgYW5zd2VyQ2hlY2tlci5pc0FzY2lpUHJlc2VudCA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICAvLyB0aGlzIGlzIGZvciB0cmFpbGluZyBOIHRvIOODswogICAgICAgIGlmKGVbZS5sZW5ndGgtMV0gPT09ICdOJykgewogICAgICAgICAgICBlID0gZS5zdWJzdHIoMCwgZS5sZW5ndGgtMSkgKyAn44OzJyArIGUuc3Vic3RyKGUubGVuZ3RoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFuc3dlckNoZWNrZXIub2xkSXNBc2NpaVByZXNlbnRLTShlKTsKICAgIH07CgogICAgYW5zd2VyQ2hlY2tlci5vbGRFdmFsdWF0ZUtNID0gYW5zd2VyQ2hlY2tlci5ldmFsdWF0ZTsKICAgIGFuc3dlckNoZWNrZXIuZXZhbHVhdGUgPSBmdW5jdGlvbihlLHQpIHsKICAgICAgICAvL2NvbnNvbGUubG9nKCQualN0b3JhZ2UuZ2V0KCdsL2N1cnJlbnRRdWl6SXRlbScpKTsKICAgICAgICAvLyB0aGlzIGlzIGZvciB0cmFpbGluZyBOIHRvIOODswogICAgICAgIGlmKGUgPT09ICJyZWFkaW5nIiAmJiB0W3QubGVuZ3RoLTFdID09PSAnTicpIHsKICAgICAgICAgICAgdCA9IHQuc3Vic3RyKDAsIHQubGVuZ3RoLTEpICsgJ+ODsycgKyB0LnN1YnN0cih0Lmxlbmd0aCk7CiAgICAgICAgfQogICAgICAgIGlmKGlzT255b21pTGVzc29uKCkpIHsKICAgICAgICAgICAgLy8gdGhpcyBpcyBmb3IgdGhlICJXYW5pS2FuaSBpcyBsb29raW5nIGZvciB0aGUgb255b21pIHJlYWRpbmciIGZ1bmN0aW9uCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgJC5qU3RvcmFnZS5nZXQoJ2wvY3VycmVudFF1aXpJdGVtJykua3VuLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAkLmpTdG9yYWdlLmdldCgnbC9jdXJyZW50UXVpekl0ZW0nKS5rdW5baV0gPSBjb252ZXJ0VG9LYXRhKCQualN0b3JhZ2UuZ2V0KCdsL2N1cnJlbnRRdWl6SXRlbScpLmt1bltpXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAkLmpTdG9yYWdlLmdldCgnbC9jdXJyZW50UXVpekl0ZW0nKS5vbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgJC5qU3RvcmFnZS5nZXQoJ2wvY3VycmVudFF1aXpJdGVtJykub25baV0gPSBjb252ZXJ0VG9LYXRhKCQualN0b3JhZ2UuZ2V0KCdsL2N1cnJlbnRRdWl6SXRlbScpLm9uW2ldKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gYW5zd2VyQ2hlY2tlci5vbGRFdmFsdWF0ZUtNKGUsdCk7CiAgICB9OwoKICAgICQoJyN1c2VyLXJlc3BvbnNlJykub24oJ2lucHV0JywgZnVuY3Rpb24oKSB7CiAgICAgICAgaWYoaXNPbnlvbWlMZXNzb24oKSkgewogICAgICAgICAgICB0aGlzLnZhbHVlID0gY29udmVydFRvS2F0YSgkKHRoaXMpLnZhbCgpLnRvVXBwZXJDYXNlKCkpOwogICAgICAgIH0KICAgIH0pOwoKICAgIHZhciBvYnNlcnZlTWUgPSAkKCcjaXRlbS1pbmZvIC5wdXJlLXUtMS00JylbMF07CiAgICBvYnNlcnZlRE9NKCkoIG9ic2VydmVNZSAsZnVuY3Rpb24oKSB7CiAgICAgICAgaWYoaXNPbnlvbWlMZXNzb24oKSkgewogICAgICAgICAgICAkKCcjaXRlbS1pbmZvLXJlYWRpbmcgc3BhbicpLnRleHQoY29udmVydFRvS2F0YSgkKCcjaXRlbS1pbmZvLXJlYWRpbmcgc3BhbicpLnRleHQoKSkpOwogICAgICAgIH0KICAgIH0pOwoKfWVsc2UgaWYgKC9sZXNzb24vLnRlc3QoZG9jdW1lbnQuVVJMKSkgLy8gTGVzc29uIGluZm8gcGFnZSBhdCB0aGUgYmVnaW5uaW5nIGFuZCB0aGUgZW5kIG9mIGEgcnVuCnsKICAgIHZhciBvYnNlcnZlTWUgPSAkKCcja2FuamknKVswXTsKICAgIG9ic2VydmVET00oKSggb2JzZXJ2ZU1lICxmdW5jdGlvbigpIHsKICAgICAgICB2YXIgZSA9ICQoJy5rYW5qaSAuaG92ZXInKTsKICAgICAgICBpZihlLmxlbmd0aCAhPT0gMCAmJiBpc09ueW9taUFsbChlLnByZXYoJ2EnKS5lcSgwKS50ZXh0KCkpKSB7CiAgICAgICAgICAgIHZhciBvbnlvbWlOb2RlID0gZS5maW5kKCd1bCcpLmZpbmQoJ2xpJykuZXEoMSk7CiAgICAgICAgICAgIG9ueW9taU5vZGUudGV4dChjb252ZXJ0VG9LYXRhKG9ueW9taU5vZGUudGV4dCgpKSk7CiAgICAgICAgfQogICAgfSk7Cn0KCi8vIFNlYXJjaCByZXN1bHQKaWYoIC9kYXNoYm9hcmQvLnRlc3QoZG9jdW1lbnQuVVJMKSB8fCBkb2N1bWVudC5VUkwgPT0gImh0dHA6Ly93d3cud2FuaWthbmkuY29tLyIgfHwgZG9jdW1lbnQuVVJMID09ICJodHRwczovL3d3dy53YW5pa2FuaS5jb20vIiB8fCAvXC9sZXZlbC8udGVzdChkb2N1bWVudC5VUkwpIHx8CiAgIC9cL2xhdHRpY2UvLnRlc3QoZG9jdW1lbnQuVVJMKSB8fCAvXC9yYWRpY2Fscy8udGVzdChkb2N1bWVudC5VUkwpIHx8IC9cL2thbmppLy50ZXN0KGRvY3VtZW50LlVSTCkgfHwgL1wvdm9jYWJ1bGFyeS8udGVzdChkb2N1bWVudC5VUkwpIHx8CiAgIC9cL2NvbW11bml0eS8udGVzdChkb2N1bWVudC5VUkwpIHx8IC9cL2NoYXQvLnRlc3QoZG9jdW1lbnQuVVJMKSB8fCAvXC9hY2NvdW50Ly50ZXN0KGRvY3VtZW50LlVSTCkgKSB7CiAgICB2YXIgc2VhcmNoQ2hhbmdlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYoaXNPbnlvbWlBbGwoJCh0aGlzKS5maW5kKCdzcGFuJykudGV4dCgpKSkgewogICAgICAgICAgICAkKHRoaXMpLmZpbmQoJ2xpJykuZXEoMCkudGV4dChjb252ZXJ0VG9LYXRhKCQodGhpcykuZmluZCgnbGknKS5lcSgwKS50ZXh0KCkpKTsKICAgICAgICB9CiAgICB9OwogICAgdmFyIG9ic2VydmVNZSA9ICQoJy5zZWFyY2gtcmVzdWx0cycpWzBdOwogICAgb2JzZXJ2ZURPTSgpKCBvYnNlcnZlTWUgLGZ1bmN0aW9uKCkgewogICAgICAgICQoJy5zZWFyY2gtcmVzdWx0cyAja2FuamktJykuZWFjaChzZWFyY2hDaGFuZ2UpOwogICAgfSk7Cn0KCgoKLy8tLSBIZWxwZXIgZnVuY3Rpb25zIGZvciB0cmFuc2Zvcm1pbmcga2F0YSA8LT4gaGlyYSAtLS8vCmZ1bmN0aW9uIGlzT255b21pUmV2aWV3KCkgewoKICAgIHZhciBvYmpDdXJJdGVtID0gJC5qU3RvcmFnZS5nZXQoImN1cnJlbnRJdGVtIik7CiAgICB2YXIgc3RyUXVlc3Rpb25UeXBlID0gJC5qU3RvcmFnZS5nZXQoInF1ZXN0aW9uVHlwZSIpOwoKICAgIGlmICgia2FuIiBpbiBvYmpDdXJJdGVtKSB7CiAgICAgICAgLy8gS2FuamkKICAgICAgICBpZiAoc3RyUXVlc3Rpb25UeXBlID09PSAicmVhZGluZyIpIHsKICAgICAgICAgICAgaWYob2JqQ3VySXRlbS5lbXBoID09PSAib255b21pIikgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIGlzT255b21pTGVzc29uKCkgewoKICAgIHZhciBvYmpDdXJJdGVtID0gJC5qU3RvcmFnZS5nZXQoImwvY3VycmVudFF1aXpJdGVtIik7CiAgICB2YXIgc3RyUXVlc3Rpb25UeXBlID0gJC5qU3RvcmFnZS5nZXQoImwvcXVlc3Rpb25UeXBlIik7CgogICAgaWYgKCJrYW4iIGluIG9iakN1ckl0ZW0pCiAgICB7CiAgICAgICAgLy8gS2FuamkKICAgICAgICBpZiAoc3RyUXVlc3Rpb25UeXBlID09PSAicmVhZGluZyIpIHsKICAgICAgICAgICAgaWYob2JqQ3VySXRlbS5lbXBoID09PSAib255b21pIil7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKfQoKZnVuY3Rpb24gaXNPbnlvbWkoa2FuamksIGxldmVsKQp7CiAgICBzd2l0Y2gobGV2ZWwudG9VcHBlckNhc2UoKSkgewogICAgICAgIGNhc2UgJ1BMRUFTQU5UJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6IGNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzogY2FzZSAnMTAnOgogICAgICAgICAgICByZXR1cm4ga2FuamlZb21pUExFQVNBTlRba2FuamldOwogICAgICAgIGNhc2UgJ1BBSU5GVUwnOiBjYXNlICcxMSc6IGNhc2UgJzEyJzogY2FzZSAnMTMnOiBjYXNlICcxNCc6IGNhc2UgJzE1JzogY2FzZSAnMTYnOiBjYXNlICcxNyc6IGNhc2UgJzE4JzogY2FzZSAnMTknOiBjYXNlICcyMCc6CiAgICAgICAgICAgIHJldHVybiBrYW5qaVlvbWlQQUlORlVMW2thbmppXTsKICAgICAgICBjYXNlICdERUFUSCc6IGNhc2UgJzIxJzogY2FzZSAnMjInOiBjYXNlICcyMyc6IGNhc2UgJzI0JzogY2FzZSAnMjUnOiBjYXNlICcyNic6IGNhc2UgJzI3JzogY2FzZSAnMjgnOiBjYXNlICcyOSc6IGNhc2UgJzMwJzoKICAgICAgICAgICAgcmV0dXJuIGthbmppWW9taURFQVRIW2thbmppXTsKICAgICAgICBjYXNlICdIRUxMJzogY2FzZSAnMzEnOiBjYXNlICczMic6IGNhc2UgJzMzJzogY2FzZSAnMzQnOiBjYXNlICczNSc6IGNhc2UgJzM2JzogY2FzZSAnMzcnOiBjYXNlICczOCc6IGNhc2UgJzM5JzogY2FzZSAnNDAnOgogICAgICAgICAgICByZXR1cm4ga2FuamlZb21pSEVMTFtrYW5qaV07CiAgICAgICAgY2FzZSAnUEFSQURJU0UnOiBjYXNlICc0MSc6IGNhc2UgJzQyJzogY2FzZSAnNDMnOiBjYXNlICc0NCc6IGNhc2UgJzQ1JzogY2FzZSAnNDYnOiBjYXNlICc0Nyc6IGNhc2UgJzQ4JzogY2FzZSAnNDknOiBjYXNlICc1MCc6CiAgICAgICAgICAgIHJldHVybiBrYW5qaVlvbWlQQVJBRElTRVtrYW5qaV07CiAgICAgICAgY2FzZSAnUkVBTElUWSc6IGNhc2UgJzUxJzogY2FzZSAnNTInOiBjYXNlICc1Myc6IGNhc2UgJzU0JzogY2FzZSAnNTUnOiBjYXNlICc1Nic6IGNhc2UgJzU3JzogY2FzZSAnNTgnOiBjYXNlICc1OSc6IGNhc2UgJzYwJzoKICAgICAgICAgICAgcmV0dXJuIGthbmppWW9taVJFQUxJVFlba2FuamldOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiAwOwogICAgfQp9CmZ1bmN0aW9uIGlzT255b21pQWxsKGthbmppKQp7CgogICAgaWYoa2FuamlZb21pUExFQVNBTlRba2FuamldKSByZXR1cm4gMTsKICAgIGlmKGthbmppWW9taVBBSU5GVUxba2FuamldKSByZXR1cm4gMTsKICAgIGlmKGthbmppWW9taURFQVRIW2thbmppXSkgcmV0dXJuIDE7CiAgICBpZihrYW5qaVlvbWlIRUxMW2thbmppXSkgcmV0dXJuIDE7CiAgICBpZihrYW5qaVlvbWlQQVJBRElTRVtrYW5qaV0pIHJldHVybiAxOwogICAgaWYoa2FuamlZb21pUkVBTElUWVtrYW5qaV0pIHJldHVybiAxOwogICAgcmV0dXJuIDA7Cgp9CmZ1bmN0aW9uIGNvbnZlcnRUb0thdGEoY2hhaW4pCnsKICAgIGNoYWluID0gY2hhaW4udHJpbSgpOwogICAgZm9yICh2YXIgaSA9IDAsIGMgPSBjaGFpbi5sZW5ndGg7IGkgPCBjOyBpKyspCiAgICB7CiAgICAgICAgY2hhaW4gPSByZXBsYWNlQXQoY2hhaW4sIGksIGhpcmFUb0thdGFbY2hhaW5baV1dIHx8IGNoYWluW2ldKTsKICAgIH0KICAgIHJldHVybiBjaGFpbjsKfQoKZnVuY3Rpb24gY29udmVydFRvSGlyYShjaGFpbikKewogICAgY2hhaW4gPSBjaGFpbi50cmltKCk7CiAgICBmb3IgKHZhciBpID0gMCwgYyA9IGNoYWluLmxlbmd0aDsgaSA8IGM7IGkrKykKICAgIHsKICAgICAgICBjaGFpbiA9IHJlcGxhY2VBdChjaGFpbiwgaSwga2F0YVRvSGlyYVtjaGFpbltpXV0gfHwgY2hhaW5baV0pOwogICAgfQogICAgcmV0dXJuIGNoYWluOwp9CgpmdW5jdGlvbiByZXBsYWNlQXQocywgbiwgdCkKewogICAgcmV0dXJuIHMuc3Vic3RyaW5nKDAsIG4pICsgdCArIHMuc3Vic3RyaW5nKG4gKyAxKTsKfQoKLyoKKiBXYWl0IGZvciBlbGVtZW50cyB0byBhcHBlYXIKKiBjYWxsIHdpdGggb2JzZXJ2ZURvbSgpKG9ic2Vydk5vZGUsIGNhbGxiYWNrRnVuY3Rpb24pOwoqIGZyb20gc3RhY2tvdmVyZmxvdzogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTQ1NzA2MTQKKi8KZnVuY3Rpb24gb2JzZXJ2ZURPTSgpIHsKICAgIHZhciBNdXRhdGlvbk9ic2VydmVyID0gd2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIgfHwgd2luZG93LldlYktpdE11dGF0aW9uT2JzZXJ2ZXIsCiAgICAgICAgZXZlbnRMaXN0ZW5lclN1cHBvcnRlZCA9IHdpbmRvdy5hZGRFdmVudExpc3RlbmVyOwogICAgcmV0dXJuIGZ1bmN0aW9uKG9iaiwgY2FsbGJhY2spewogICAgICAgIGlmKCBNdXRhdGlvbk9ic2VydmVyICkgewogICAgICAgICAgICAvLyBkZWZpbmUgYSBuZXcgb2JzZXJ2ZXIKICAgICAgICAgICAgdmFyIG9icyA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKG11dGF0aW9ucywgb2JzZXJ2ZXIpIHsKICAgICAgICAgICAgICAgIGlmKCBtdXRhdGlvbnNbMF0uYWRkZWROb2Rlcy5sZW5ndGggKQogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBoYXZlIHRoZSBvYnNlcnZlciBvYnNlcnZlIGZvbyBmb3IgY2hhbmdlcyBpbiBjaGlsZHJlbgogICAgICAgICAgICBvYnMub2JzZXJ2ZSggb2JqLCB7IGNoaWxkTGlzdDp0cnVlLCBzdWJ0cmVlOnRydWUgfSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoIGV2ZW50TGlzdGVuZXJTdXBwb3J0ZWQgKSB7CiAgICAgICAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKCdET01Ob2RlSW5zZXJ0ZWQnLCBjYWxsYmFjaywgZmFsc2UpOwogICAgICAgICAgICBvYmouYWRkRXZlbnRMaXN0ZW5lcignRE9NTm9kZVJlbW92ZWQnLCBjYWxsYmFjaywgZmFsc2UpOwogICAgICAgIH0KICAgIH07Cn0KCi8qCiogT25seSB1c2VkIGZvciBnZW5lcmF0aW5nIG9ueW9taUxpc3QKKiBDYW4gYWxzbyBiZSB1c2VkIHRvIGxvYWQga2Fuamkgb255b21pIGluZm9ybWF0aW9ucyBmcm9tIHNlcnZlciAoc2xvdykKKgoqIFVwZGF0ZToKKiBDYWxsIHdpdGggcGFyYW1ldGVyIG9mIGxldmVsIGFuZCBjb3B5IHRoZSBzdHJpbmcgZnJvbSB0aGUgbG9nIHdpbmRvdyBpbiBvbmUgb2YgdGhlIHZhcmlhYmxlcyBvbiB0aGUgdG9wCiogZS5nLgoqIGNvbnNvbGUubG9nKGxvYWRLYXRhRnJvbUFwaSgiUExFQVNBTlQiKSk7CiogY29uc29sZS5sb2cobG9hZEthdGFGcm9tQXBpKCJQQUlORlVMIikpOwoqIGNvbnNvbGUubG9nKGxvYWRLYXRhRnJvbUFwaSgiREVBVEgiKSk7CiogY29uc29sZS5sb2cobG9hZEthdGFGcm9tQXBpKCJIRUxMIikpOwoqIGNvbnNvbGUubG9nKGxvYWRLYXRhRnJvbUFwaSgiUEFSQURJU0UiKSk7CiogY29uc29sZS5sb2cobG9hZEthdGFGcm9tQXBpKCJSRUFMSVRZIikpOwoqLwpmdW5jdGlvbiBsb2FkS2F0YUZyb21BcGkobGV2ZWwpIHsKICAgIHZhciBsZXZlbHM7CiAgICBzd2l0Y2gobGV2ZWwpIHsKICAgICAgICBjYXNlICdQTEVBU0FOVCc6CiAgICAgICAgICAgIGxldmVscyA9ICIxLDIsMyw0LDUsNiw3LDgsOSwxMCI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ1BBSU5GVUwnOgogICAgICAgICAgICBsZXZlbHMgPSAiMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdERUFUSCc6CiAgICAgICAgICAgIGxldmVscyA9ICIyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwzMCI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ0hFTEwnOgogICAgICAgICAgICBsZXZlbHMgPSAiMzEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdQQVJBRElTRSc6CiAgICAgICAgICAgIGxldmVscyA9ICI0MSw0Miw0Myw0NCw0NSw0Niw0Nyw0OCw0OSw1MCI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ1JFQUxJVFknOgogICAgICAgICAgICBsZXZlbHMgPSAiNTEsNTIsNTMsNTQsNTUsNTYsNTcsNTgsNTksNjAiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBsZXZlbHMgPSAnMSc7CiAgICB9CgogICAgdmFyIHJlcSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgcmVxLm9wZW4oJ0dFVCcsICdodHRwczovL3d3dy53YW5pa2FuaS5jb20vYXBpL3VzZXIvJyArIGFwaUtleSArICcva2FuamkvJyArIGxldmVscywgdHJ1ZSk7CiAgICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHJlcS5yZWFkeVN0YXRlID09PSA0KSB7CiAgICAgICAgICAgIGlmIChyZXEuc3RhdHVzID49IDIwMCAmJiByZXEuc3RhdHVzIDwgNDAwKSB7CiAgICAgICAgICAgICAgICB2YXIgbGlzdCA9IEpTT04ucGFyc2UocmVxLnJlc3BvbnNlVGV4dCkucmVxdWVzdGVkX2luZm9ybWF0aW9uOwogICAgICAgICAgICAgICAgdmFyIG91dHB1dCA9IHt9OwoKICAgICAgICAgICAgICAgIGZvcih2YXIgaT0wOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvdXRwdXRbbGlzdFtpXS5jaGFyYWN0ZXJdID0gbGlzdFtpXS5pbXBvcnRhbnRfcmVhZGluZyA9PSAib255b21pIiA/IDEgOiAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkob3V0cHV0KSk7CgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgYWxlcnQoImVycm9yIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwogICAgcmVxLnNlbmQoKTsKfQo="},{"name":"WaniKani Stroke Order","options":{"check_for_updates":true,"comment":null,"compatopts_for_requires":true,"compat_wrappedjsobject":false,"compat_metadata":false,"compat_foreach":false,"compat_arrayleft":false,"compat_uW_gmonkey":false,"compat_forvarin":false,"noframes":null,"awareOfChrome":false,"run_at":null,"override":{"use_includes":[],"orig_includes":["http*://*wanikani.com/kanji/*","http*://*wanikani.com/level/*/kanji/*","http*://*wanikani.com/review/session","http*://*wanikani.com/lesson/session"],"merge_includes":true,"use_matches":[],"orig_matches":[],"merge_matches":true,"use_excludes":[],"orig_excludes":[],"merge_excludes":true,"use_connects":["classic.jisho.org"],"merge_connects":true,"use_blockers":[],"orig_run_at":"document-idle","orig_noframes":null,"orig_connects":[]}},"storage":{"ts":1588771067655,"data":{}},"enabled":true,"position":6,"file_url":"https://greasyfork.org/scripts/723-wanikani-stroke-order/code/WaniKani%20Stroke%20Order.user.js","uuid":"d0e67b26-d760-44d3-904c-763b49575996","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgIFdhbmlLYW5pIFN0cm9rZSBPcmRlcgovLyBAbmFtZXNwYWNlICAgamFwYW5lc2UKLy8gQGRlc2NyaXB0aW9uIFNob3dzIGEga2FuamkncyBzdHJva2Ugb3JkZXIgb24gaXRzIHBhZ2UgYW5kIGR1cmluZyBsZXNzb25zIGFuZCByZXZpZXdzLgovLyBAbGljZW5zZSAgICAgR1BMIHZlcnNpb24gMyBvciBhbnkgbGF0ZXIgdmVyc2lvbjsgaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sCi8vIEBpbmNsdWRlICAgICBodHRwKjovLyp3YW5pa2FuaS5jb20va2FuamkvKgovLyBAaW5jbHVkZSAgICAgaHR0cCo6Ly8qd2FuaWthbmkuY29tL2xldmVsLyova2FuamkvKgovLyBAaW5jbHVkZSAgICAgaHR0cCo6Ly8qd2FuaWthbmkuY29tL3Jldmlldy9zZXNzaW9uCi8vIEBpbmNsdWRlICAgICBodHRwKjovLyp3YW5pa2FuaS5jb20vbGVzc29uL3Nlc3Npb24KLy8gQHZlcnNpb24gICAgIDEuMS4yCi8vIEBncmFudCAgICAgICBHTV94bWxodHRwUmVxdWVzdAovLyBAcmVxdWlyZSAgICAgaHR0cDovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjEwLjIvanF1ZXJ5Lm1pbi5qcwovLyA9PS9Vc2VyU2NyaXB0PT0KCi8qCiAqIFRoYW5rcyBhIGxvdCB0byAuLi4KICogV2FuaWthbmkgUGhvbmV0aWMtU2VtYW50aWMgQ29tcG9zaXRpb24gLSBVc2Vyc2NyaXB0CiAqIGJ5IHJ1aXBncGluaGVpcm8gKExvcmRHcmF2ZXdpc2gpCiAqIC4uLiBmb3IgY29kZSBzaG93aW5nIG1lIGhvdyB0byBpbnNlcnQgc2VjdGlvbnMgZHVyaW5nIGthbmppIHJldmlld3MuCiAqIFRoZSBjb2RlIGhlYXZpbHkgYm9ycm93cyBmcm9tIHRoYXQgc2NyaXB0IQogKiBBbHNvIHRoYW5rcyB0byBIYWxvIGZvciBhIGxvYWRpbmcgYnVnIGZpeCEKICovCgovKgogKiBIZWxwZXIgRnVuY3Rpb25zL1ZhcmlhYmxlcwogKi8KJCA9IHVuc2FmZVdpbmRvdy4kOwoKLyoKICogR2xvYmFsIFZhcmlhYmxlcy9PYmplY3RzL0NsYXNzZXMKICovCnZhciBQYWdlRW51bSA9IE9iamVjdC5mcmVlemUoeyB1bmtub3duOjAsIGthbmppOjEsIHJldmlld3M6MiwgbGVzc29uczozIH0pOwp2YXIgY3VyUGFnZSA9IFBhZ2VFbnVtLnVua25vd247CnZhciBKSVNITyA9ICJodHRwOi8vY2xhc3NpYy5qaXNoby5vcmciOwoKLyoKICogTWFpbgogKi8KZnVuY3Rpb24gaW5pdCgpIHsKICAgIC8vIERldGVybWluZSBwYWdlIHR5cGUKICAgIGlmICgvXC9rYW5qaVwvLi8udGVzdChkb2N1bWVudC5VUkwpKSB7CiAgICAgICAgY3VyUGFnZSA9IFBhZ2VFbnVtLmthbmppOwogICAgfSBlbHNlIGlmICgvXC9yZXZpZXcvLnRlc3QoZG9jdW1lbnQuVVJMKSkgewogICAgICAgIGN1clBhZ2UgPSBQYWdlRW51bS5yZXZpZXdzOwogICAgfSBlbHNlIGlmICgvXC9sZXNzb24vLnRlc3QoZG9jdW1lbnQuVVJMKSkgewogICAgICAgIGN1clBhZ2UgPSBQYWdlRW51bS5sZXNzb25zOwogICAgfQoKICAgIC8vIENyZWF0ZSBhbmQgc3RvcmUgdGhlIGVsZW1lbnQgdGhhdCB3aWxsIGhvbGQgdGhlIGltYWdlCiAgICB1bnNhZmVXaW5kb3cuZGlhZ3JhbSA9IGNyZWF0ZURpYWdyYW1TZWN0aW9uKCk7CgogICAgLy8gUmVnaXN0ZXIgY2FsbGJhY2sgZm9yIHdoZW4gdG8gbG9hZCBzdHJva2Ugb3JkZXIKICAgIHN3aXRjaCAoY3VyUGFnZSkgewogICAgICAgIGNhc2UgUGFnZUVudW0ua2Fuamk6CiAgICAgICAgICAgIGxvYWREaWFncmFtKCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgUGFnZUVudW0ucmV2aWV3czoKICAgICAgICAgICAgdmFyIG8gPSBuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihtdXRhdGlvbnMpIHsKICAgICAgICAgICAgICAgLy8gVGhlIGxhc3Qgb25lIGFsd2F5cyBoYXMgMiBtdXRhdGlvbnMsIHNvIGxldCdzIHVzZSB0aGF0CiAgICAgICAgICAgICAgIGlmIChtdXRhdGlvbnMubGVuZ3RoICE9IDIpCiAgICAgICAgICAgICAgICAgICByZXR1cm47CgogICAgICAgICAgICAgICAvLyBSZXZpZXdzIGR5bmFtaWNhbGx5IGdlbmVyYXRlIHRoZSBET00uIFdlIGFsd2F5cyBuZWVkIHRvIHJlLWluc2VydCB0aGUgZWxlbWVudAogICAgICAgICAgICAgICBpZiAoZ2V0S2FuamkoKSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgIHZhciBkaWFncmFtID0gY3JlYXRlRGlhZ3JhbVNlY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlhZ3JhbSAhPT0gbnVsbCAmJiBkaWFncmFtLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zYWZlV2luZG93LmRpYWdyYW0gPSBkaWFncmFtOwogICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkRGlhZ3JhbSgpOwogICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgIH0sIDE1MCk7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIG8ub2JzZXJ2ZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaXRlbS1pbmZvJyksIHsnYXR0cmlidXRlcycgOiB0cnVlfSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgUGFnZUVudW0ubGVzc29uczoKICAgICAgICAgICAgdmFyIG8gPSBuZXcgTXV0YXRpb25PYnNlcnZlcihsb2FkRGlhZ3JhbSk7CiAgICAgICAgICAgIG8ub2JzZXJ2ZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3VwcGxlbWVudC1rYW4nKSwgeydhdHRyaWJ1dGVzJyA6IHRydWV9KTsKICAgICAgICAgICAgbG9hZERpYWdyYW0oKTsKICAgICAgICAgICAgYnJlYWs7CiAgICB9Cn0KCmlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7CiAgICBpbml0KCk7Cn0gZWxzZSB7CiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGluaXQpOwp9CgovKgogKiBSZXR1cm5zIHRoZSBjdXJyZW50IGthbmppCiAqLwpmdW5jdGlvbiBnZXRLYW5qaSgpIHsKICAgIHN3aXRjaChjdXJQYWdlKSB7CiAgICAgICAgY2FzZSBQYWdlRW51bS5rYW5qaToKICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LnRpdGxlW2RvY3VtZW50LnRpdGxlLmxlbmd0aCAtIDFdOwoKICAgICAgICBjYXNlIFBhZ2VFbnVtLnJldmlld3M6CiAgICAgICAgICAgIHZhciBjdXJJdGVtID0gJC5qU3RvcmFnZS5nZXQoImN1cnJlbnRJdGVtIik7CiAgICAgICAgICAgIGlmKCJrYW4iIGluIGN1ckl0ZW0pCiAgICAgICAgICAgICAgICByZXR1cm4gY3VySXRlbS5rYW4udHJpbSgpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKCiAgICAgICAgY2FzZSBQYWdlRW51bS5sZXNzb25zOgogICAgICAgICAgICB2YXIga2FuamlOb2RlID0gJCgiI2NoYXJhY3RlciIpOwoKICAgICAgICAgICAgaWYoa2FuamlOb2RlID09PSB1bmRlZmluZWQgfHwga2FuamlOb2RlID09PSBudWxsKQogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CgogICAgICAgICAgICByZXR1cm4ga2FuamlOb2RlLnRleHQoKS50cmltKCk7CiAgICB9CgogICAgcmV0dXJuIG51bGw7Cn0KCi8qCiAqIENyZWF0ZXMgYSBzZWN0aW9uIGZvciB0aGUgZGlhZ3JhbSBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gaXRzIGNvbnRlbnQKICovCmZ1bmN0aW9uIGNyZWF0ZURpYWdyYW1TZWN0aW9uKCkgewoKICAgIC8vIFJldmlld3MgaGFjazogT25seSBkbyBpdCBvbmNlCiAgICBpZiAoJCgnI3N0cm9rZV9vcmRlcicpLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgdmFyIHNlY3Rpb25IVE1MID0gJzxzZWN0aW9uPjxoMj5TdHJva2UgT3JkZXI8L2gyPjxwIGlkPSJzdHJva2Vfb3JkZXIiPiZuYnNwOzwvcD48L3NlY3Rpb24+JzsKCiAgICAgICAgc3dpdGNoKGN1clBhZ2UpIHsKICAgICAgICAgICAgY2FzZSBQYWdlRW51bS5rYW5qaToKICAgICAgICAgICAgICAgICQoc2VjdGlvbkhUTUwpLmluc2VydEFmdGVyKCcjaW5mb3JtYXRpb24nKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIFBhZ2VFbnVtLnJldmlld3M6CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygicHJlcGVuZCIpOwogICAgICAgICAgICAgICAgJCgnI2l0ZW0taW5mby1jb2wyJykucHJlcGVuZChzZWN0aW9uSFRNTCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBQYWdlRW51bS5sZXNzb25zOgogICAgICAgICAgICAgICAgJCgnI3N1cHBsZW1lbnQta2FuLWJyZWFrZG93biAuY29sMScpLmFwcGVuZChzZWN0aW9uSFRNTCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICQoJyNzdHJva2Vfb3JkZXInKTsKfQoKLyoKICogQWRkcyB0aGUgZGlhZ3JhbSBzZWN0aW9uIGVsZW1lbnQgdG8gdGhlIGFwcHJvcHJpYXRlIGxvY2F0aW9uCiAqLwpmdW5jdGlvbiBsb2FkRGlhZ3JhbSgpIHsKCiAgICBpZiAoIXVuc2FmZVdpbmRvdyB8fCAhdW5zYWZlV2luZG93LmRpYWdyYW0ubGVuZ3RoKQogICAgICAgIHJldHVybjsKCiAgICB1bnNhZmVXaW5kb3cuZGlhZ3JhbS5odG1sKCJMb2FkaW5nLi4uIik7CgogICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICBHTV94bWxodHRwUmVxdWVzdCh7CiAgICAgICAgICAgIG1ldGhvZDogIkdFVCIsCiAgICAgICAgICAgIHVybDogSklTSE8gKyAiL2thbmppL2RldGFpbHMvIiArIGdldEthbmppKCksCiAgICAgICAgICAgIG9ubG9hZDogZnVuY3Rpb24oeGhyKSB7CiAgICAgICAgICAgICAgICB2YXIgZGlhZ3JhbSA9IHVuc2FmZVdpbmRvdy5kaWFncmFtOwogICAgICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRpYWdyYW1VUkwgPSB4aHIucmVzcG9uc2VUZXh0Lm1hdGNoKC9cL3N0YXRpY1wvaW1hZ2VzXC9zdHJva2VfZGlhZ3JhbXNcL1swLTldK19mcmFtZXNcLnBuZy8pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRpYWdyYW0uaHRtbCgnPGltZyBzcmM9IicgKyBKSVNITyArIGRpYWdyYW1VUkxbMF0gKyAnIiBhbHQ9IlN0cm9rZSBvcmRlciBkaWFncmFtIiAvPicpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHVuc2FmZVdpbmRvdy5kaWFncmFtLmh0bWwoIkVycm9yIHdoaWxlIGxvYWRpbmcgZGlhZ3JhbSIpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBvbmVycm9yOiBmdW5jdGlvbih4aHIpIHsKICAgICAgICAgICAgICAgIHVuc2FmZVdpbmRvdy5kaWFncmFtLmh0bWwoIkVycm9yIHdoaWxlIGxvYWRpbmcgZGlhZ3JhbSIpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9LCAwKTsKfQ==","requires":[]},{"name":"Wanikani Lightning Mode","options":{"check_for_updates":true,"comment":null,"compatopts_for_requires":true,"compat_wrappedjsobject":false,"compat_metadata":false,"compat_foreach":false,"compat_arrayleft":false,"compat_uW_gmonkey":false,"compat_forvarin":false,"noframes":null,"awareOfChrome":false,"run_at":null,"override":{"use_includes":[],"orig_includes":["https://www.wanikani.com/review/session*","https://www.wanikani.com/lesson/session*"],"merge_includes":true,"use_matches":[],"orig_matches":[],"merge_matches":true,"use_excludes":[],"orig_excludes":[],"merge_excludes":true,"use_connects":[],"merge_connects":true,"use_blockers":[],"orig_run_at":"document-end","orig_noframes":null,"orig_connects":[]}},"storage":{"ts":1588771078153,"data":{}},"enabled":true,"position":7,"file_url":"https://greasyfork.org/scripts/12853-wanikani-lightning-mode/code/Wanikani%20Lightning%20Mode.user.js","uuid":"c13061c9-6592-4c5c-b611-38e42e0e8042","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgIFdhbmlrYW5pIExpZ2h0bmluZyBNb2RlCi8vIEBuYW1lc3BhY2UgICB3a2xpZ2h0bmluZwovLyBAZGVzY3JpcHRpb24gRWxpbWluYXRlcyBzZWNvbmQgRW50ZXIgb3IgQ2xpY2sgZm9yIGNvcnJlY3QgcmV2aWV3IGFuc3dlcnMuCi8vIEBpbmNsdWRlICAgICBodHRwczovL3d3dy53YW5pa2FuaS5jb20vcmV2aWV3L3Nlc3Npb24qCi8vIEBpbmNsdWRlICAgICBodHRwczovL3d3dy53YW5pa2FuaS5jb20vbGVzc29uL3Nlc3Npb24qCi8vIEB2ZXJzaW9uICAgICAxLjAuOQovLyBAYXV0aG9yICAgICAgUm9iaW4gRmluZGxleQovLyBAY29weXJpZ2h0ICAgMjAxOCssIFJvYmluIEZpbmRsZXkKLy8gQGxpY2Vuc2UgICAgIE1JVDsgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAovLyBAcnVuLWF0ICAgICAgZG9jdW1lbnQtZW5kCi8vIEBncmFudCAgICAgICBub25lCi8vID09L1VzZXJTY3JpcHQ9PQoKLy89PVsgSGlzdG9yeSBdPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIDEuMC44IC0gRml4ZWQgaXNzdWUgd2l0aCBwcm9jZWVkaW5nIGF0IGVuZCBvZiBsZXNzb24gZ3JvdXAuCi8vIDEuMC41IC0gQWRkZWQgc3VwcG9ydCBmb3IgbGVzc29ucy4KLy8gMS4wLjQgLSBBZGRlZCBvcHRpb24gdG8gc2hvdyBpdGVtIGluZm8gd2hlbiBzbGlnaHRseSBvZmYgb3IgbXVsdGktYW5zd2VyLgovLyAxLjAuMyAtIEZpeCB0byByZXN0b3JlIFNSUyBzdGF0dXMgcG9wdXAuICBUaGFua3MgdG8gQGNjb29rZiBjb250cmlidXRpb25zIQovLyAxLjAuMiAtIEVuYWJsZSBsaWdodG5pbmcgbW9kZSBieSBkZWZhdWx0IGZvciBuZXcgaW5zdGFsbHMuCi8vIDEuMC4xIC0gQWRkZWQgb3B0aW9uIHRvIG5vdCBhdXRvLWFkdmFuY2UgaWYgYW5zd2VyIGlzIHNsaWdodGx5IG9mZi4KLy8gICAgICAgICBBZGRlZCBvcHRpb24gdG8gbm90IGF1dG8tYWR2YW5jZSBpZiBpdGVtIGhhcyBtdWx0aXBsZSBhbnN3ZXJzLgovLyAxLjAuMCAtIEluaXRpYWwgcmVsZWFzZS4KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgovLz09WyBTZXR0aW5ncyBdPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gVGhlIGZvbGxvd2luZyBzY3JpcHQgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgYXJlIGF2YWlsYWJsZS4gIFlvdQovLyBjYW4gZW5hYmxlIHRoZW0gYnkgcGFzdGluZyB0aGUgY29ycmVzcG9uZGluZyBsaW5lIGluIHRoZSBqYXZhc2NyaXB0Ci8vIGNvbnNvbGUgKHByZXNzIEYxMiBpbiBtb3N0IGJyb3dzZXJzIHRvIG9wZW4gdGhlIGNvbnNvbGUpLCBvciBieQovLyByZW1vdmluZyB0aGUgIi8vIiBiZWZvcmUgdGhlIGNvcnJlc3BvbmRpbmcgImxvY2FsU3RvcmFnZSIgbGluZQovLyBiZWxvdy4gIFRoZSBzZXR0aW5nIHdpbGwgYmUgc2F2ZWQgaW4gc3RvcmFnZS4KLy8gVG8gcmVtb3ZlIGEgc2V0dGluZyBmcm9tIHN0b3JhZ2UsIGVudGVyIHRoZSBmb2xsb3dpbmcgbGluZSBpbiB0aGUKLy8gamF2YXNjcmlwdCBjb25zb2xlLCB3aXRoIGNvcnJlc3BvbmRpbmcgc2V0dGluZyBuYW1lIHJlcGxhY2VkOgovLyAgIGRlbGV0ZSBsb2NhbFN0b3JhZ2Uud2tkcHBfc2V0dGluZ19uYW1lOwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gSGFsdCBpZiBhbnN3ZXIgaXMgc2xpZ2h0bHkgb2ZmLgovLyAgIGxvY2FsU3RvcmFnZS53a2xpZ2h0bmluZ19oYWx0X3NsaWdodGx5X29mZiA9IDE7Ci8vCi8vIEhhbHQgaWYgYW5zd2VyIGhhcyBtdWx0aXBsZSBtZWFuaW5ncy4KLy8gICBsb2NhbFN0b3JhZ2Uud2tsaWdodG5pbmdfaGFsdF9tdWx0aXBsZSA9IDE7Ci8vCi8vIE9wZW4gaXRlbSBpbmZvIHdoZW4gaGFsdGluZyBmb3IgInNsaWdodGx5IG9mZiIgb3IgIm11bHRpcGxlIG1lYW5pbmdzIi4KLy8gICBsb2NhbFN0b3JhZ2Uud2tsaWdodG5pbmdfaW5mb19vbl9oYWx0ID0gMTsKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgp3a2xpZ2h0bmluZyA9IHt9OwoKKGZ1bmN0aW9uKGdvYmopewoKICAgIHZhciBsaWdodG5pbmcgPSBmYWxzZTsKICAgIHZhciBvYnNlcnZlcjsKICAgIHZhciBpZ25vcmU7CgogICAgZnVuY3Rpb24gYWRkU3R5bGUoY3NzKSB7CiAgICAgICAgdmFyIGhlYWQsIHN0eWxlOwogICAgICAgIGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdOwogICAgICAgIGlmIChoZWFkKSB7CiAgICAgICAgICAgIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsKICAgICAgICAgICAgc3R5bGUuc2V0QXR0cmlidXRlKCd0eXBlJywgJ3RleHQvY3NzJyk7CiAgICAgICAgICAgIHN0eWxlLnRleHRDb250ZW50ID0gY3NzOwogICAgICAgICAgICBoZWFkLmFwcGVuZENoaWxkKHN0eWxlKTsKICAgICAgICAgICAgcmV0dXJuIHN0eWxlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIFByb2Nlc3Mgc3RvcmVkIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHByb2Nlc3Nfc2V0dGluZ3MoKSB7CiAgICAgICAgZnVuY3Rpb24gdmFsdWVfb3JfZGVmYXVsdCh2YWx1ZSwgZGZsdCkge3JldHVybiAodmFsdWU9PT11bmRlZmluZWQgPyBkZmx0IDogdmFsdWUpO30KCiAgICAgICAgLy8gSGFsdCBpZiBhbnN3ZXIgaXMgc2xpZ2h0bHkgb2ZmLgogICAgICAgIGdvYmouaGFsdF9zbGlnaHRseV9vZmYgPSB2YWx1ZV9vcl9kZWZhdWx0KGxvY2FsU3RvcmFnZS53a2xpZ2h0bmluZ19oYWx0X3NsaWdodGx5X29mZiwgMCk7CgogICAgICAgIC8vIEhhbHQgaWYgYW5zd2VyIGhhcyBtdWx0aXBsZSBtZWFuaW5ncy4KICAgICAgICBnb2JqLmhhbHRfbXVsdGlwbGUgPSB2YWx1ZV9vcl9kZWZhdWx0KGxvY2FsU3RvcmFnZS53a2xpZ2h0bmluZ19oYWx0X211bHRpcGxlLCAwKTsKCiAgICAgICAgLy8gSGFsdCBpZiBhbnN3ZXIgaGFzIG11bHRpcGxlIG1lYW5pbmdzLgogICAgICAgIGdvYmouaW5mb19vbl9oYWx0ID0gdmFsdWVfb3JfZGVmYXVsdChsb2NhbFN0b3JhZ2Uud2tsaWdodG5pbmdfaW5mb19vbl9oYWx0LCAwKTsKICAgIH0KCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIG1haW4oKSAtIFJ1bnMgYWZ0ZXIgcGFnZSBpcyBkb25lIGxvYWRpbmcuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIG1haW4oKSB7CiAgICAgICAgcHJvY2Vzc19zZXR0aW5ncygpOwogICAgICAgIGFkZFN0eWxlKAogICAgICAgICAgICAnI2xpZ2h0bmluZy1tb2RlLmFjdGl2ZSB7Y29sb3I6I2ZmMDsgb3BhY2l0eToxLjA7fScrCiAgICAgICAgICAgICcjYW5zd2VyLWZvcm0gZmllbGRzZXQuV0tMTV93YXJuIGJ1dHRvbiwgI2Fuc3dlci1mb3JtIGZpZWxkc2V0LldLTE1fd2FybiBpbnB1dFt0eXBlPXRleHRdLCAjYW5zd2VyLWZvcm0gZmllbGRzZXQuV0tMTV93YXJuIGlucHV0W3R5cGU9dGV4dF06ZGlzYWJsZWQge2JhY2tncm91bmQtY29sb3I6I2ZhMiAhaW1wb3J0YW50O30nCiAgICAgICAgKTsKCiAgICAgICAgbGlnaHRuaW5nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2xpZ2h0bmluZycpOwogICAgICAgIGxpZ2h0bmluZyA9IChsaWdodG5pbmcgIT09ICdmYWxzZScpOwogICAgICAgICQoJyNzdW1tYXJ5LWJ1dHRvbicpLmFwcGVuZCgnPGEgaWQ9ImxpZ2h0bmluZy1tb2RlIiBocmVmPSIjIicrKGxpZ2h0bmluZz8nIGNsYXNzPSJhY3RpdmUiJzonJykrJz48aSBjbGFzcz0iaWNvbi1ib2x0Ij48L2k+PC9hPicpOwogICAgICAgICQoJyNsaWdodG5pbmctbW9kZScpLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBsaWdodG5pbmcgPSAhbGlnaHRuaW5nOwogICAgICAgICAgICBjb25zb2xlLmxvZygnTGlnaHRuaW5nIG1vZGUgJysobGlnaHRuaW5nPydlbic6J2RpcycpKydhYmxlZCEnKTsKICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2xpZ2h0bmluZycsIGxpZ2h0bmluZyk7CiAgICAgICAgICAgICQodGhpcykudG9nZ2xlQ2xhc3MoJ2FjdGl2ZScsIGxpZ2h0bmluZyk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9KTsKICAgICAgICBpZ25vcmUgPSBmYWxzZTsKICAgICAgICBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKG11dGF0aW9ucykgewogICAgICAgICAgICBtdXRhdGlvbnMuZm9yRWFjaChmdW5jdGlvbihtdXRhdGlvbikgewogICAgICAgICAgICAgICAgaWYgKCFsaWdodG5pbmcgfHwgaWdub3JlKSByZXR1cm47CiAgICAgICAgICAgICAgICBzd2l0Y2ggKG11dGF0aW9uLnRhcmdldC5jbGFzc05hbWUpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlICdjb3JyZWN0JzoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4Y2VwdGlvbiA9ICQoJyNhbnN3ZXItZXhjZXB0aW9uJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhZHZhbmNlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbi5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbXNnID0gZXhjZXB0aW9uLnRleHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNob3cgdGhlIGl0ZW0gaW5mby4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtc2cubWF0Y2goJ211bHRpcGxlJykgIT09IG51bGwgJiYgZ29iai5oYWx0X211bHRpcGxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtc2cubWF0Y2goJ2Fuc3dlciB3YXMgYSBiaXQgb2ZmJykgIT09IG51bGwgJiYgZ29iai5oYWx0X3NsaWdodGx5X29mZikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2UgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvLyBBdXRvLWFkdmFuY2UuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZHZhbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3JzX25vdGljZSA9ICQoJyNxdWVzdGlvbi10eXBlIC5zcnMnKS5kZXRhY2goKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbXVsYXRlIGFuIDxlbnRlcj4gb24gdGhlIHN1Ym1pdCBidXR0b24uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXZlbnQgPSAkLkV2ZW50KCdrZXlkb3duJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5rZXlDb2RlID0gMTM7IGV2ZW50LndoaWNoID0gMTM7IGV2ZW50LmtleSA9ICdFbnRlcic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjYW5zd2VyLWZvcm0gYnV0dG9uJykudHJpZ2dlcihldmVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI3F1ZXN0aW9uLXR5cGUnKS5hcHBlbmQoc3JzX25vdGljZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjcXVlc3Rpb24tdHlwZSAuc3JzJykuZmFkZU91dChmdW5jdGlvbigpe3RoaXMucmVtb3ZlKCk7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwxNTAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sMTAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoIiNhbnN3ZXItZm9ybSBmaWVsZHNldCIpLmFkZENsYXNzKCJXS0xNX3dhcm4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnb2JqLmluZm9fb25faGFsdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhZSA9ICQoJyNhbnN3ZXItZXhjZXB0aW9uJykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFjID0gJCgnI2FkZGl0aW9uYWwtY29udGVudCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNhZGRpdGlvbmFsLWNvbnRlbnQgI29wdGlvbi1pdGVtLWluZm8nKS5jbGljaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjLmFwcGVuZChhZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWMuYXR0cignc3R5bGUnLCd6LWluZGV4OjEwMDAnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICd3YXJuaW5nJzoKICAgICAgICAgICAgICAgICAgICBjYXNlICcnOgogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAkKCcjYWRkaXRpb25hbC1jb250ZW50ICNvcHRpb24taXRlbS1pbmZvJykuY2xpY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gSWdub3JlIGFkZGl0aW9uYWwgY2hhbmdlcyBmb3IgMTAwbXMKICAgICAgICAgICAgICAgIGlnbm9yZSA9IHRydWU7CiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aWdub3JlID0gZmFsc2U7fSwgMTAwKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYW5zd2VyLWZvcm0gZmllbGRzZXQnKSwge2F0dHJpYnV0ZXM6IHRydWUsIHN1YnRyZWU6IHRydWUsIGF0dHJpYnV0ZUZpbHRlcjogWydjbGFzcyddfSk7CiAgICB9CgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBSdW4gbWFpbigpIHVwb24gbG9hZC4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpCiAgICAgICAgbWFpbigpOwogICAgZWxzZQogICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgbWFpbiwgZmFsc2UpOwoKfSh3a2xpZ2h0bmluZykpOwo="},{"name":"Google View Image","options":{"check_for_updates":true,"comment":null,"compatopts_for_requires":true,"compat_wrappedjsobject":false,"compat_metadata":false,"compat_foreach":false,"compat_arrayleft":false,"compat_uW_gmonkey":false,"compat_forvarin":false,"noframes":null,"awareOfChrome":false,"run_at":null,"override":{"use_includes":[],"orig_includes":[],"merge_includes":true,"use_matches":[],"orig_matches":["https://**/*","http://**/*"],"merge_matches":true,"use_excludes":[],"orig_excludes":[],"merge_excludes":true,"use_connects":[],"merge_connects":true,"use_blockers":[],"orig_run_at":"document-idle","orig_noframes":null,"orig_connects":[]}},"storage":{"ts":1589513168649,"data":{}},"enabled":true,"position":8,"file_url":"https://openuserjs.org/install/laidbacktempo/Google_View_Image.user.js","uuid":"21e7da1a-d1ce-4acf-9838-a7b170386128","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBHb29nbGUgVmlldyBJbWFnZQovLyBAbmFtZXNwYWNlICAgIGh0dHA6Ly9Hb29nbGVWaWV3SW1hZ2UuY29tLwovLyBAdmVyc2lvbiAgICAgIDAuMQovLyBAZGVzY3JpcHRpb24gIEJyaW5nIGJhY2sgR29vZ2xlIFZpZXcgSW1hZ2UhCi8vIEBhdXRob3IgICAgICAgbGFpZGJhY2tUZW1wbwovLyBAbWF0Y2ggICAgICAgIGh0dHBzOi8vKiovKgovLyBAbWF0Y2ggICAgICAgIGh0dHA6Ly8qKi8qCi8vIEBsaWNlbnNlIE1JVAovLyBAZ3JhbnQgICAgICAgIG5vbmUKLy8gPT0vVXNlclNjcmlwdD09CgooZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CmNvbnNvbGUubG9nKCJIZWxsbyIpOwoKZnVuY3Rpb24gdG9JMThuKHN0cikgewogICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9fX01TR18oXHcrKV9fL2csIGZ1bmN0aW9uIChtYXRjaCwgdjEpIHsKICAgICAgICByZXR1cm4gdjEgPyBjaHJvbWUuaTE4bi5nZXRNZXNzYWdlKHYxKSA6ICcnOwogICAgfSk7Cn0KY29uc29sZS5sb2coIkhlbGxvIDIiKTsKZnVuY3Rpb24gbG9jYWxpc2VPYmplY3Qob2JqLCB0YWcpIHsKICAgIG9iai5pbm5lckhUTUwgPSB0YWc7CiAgICByZXR1cm47CiAgICAvL3ZhciBtc2cgPSB0b0kxOG4odGFnKTsKICAgIC8vaWYgKG1zZyAhPSB0YWcpIG9iai5pbm5lckhUTUwgPSBtc2c7Cn0KCmZ1bmN0aW9uIGFkZExpbmtzKG5vZGUpIHsKICAgIGNvbnNvbGUubG9nKCJBZGRpbmcgbGluayIpOwogICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCJBZGRpbmcgbGluayBpbiIpOwogICAgICAgIGlmICgobm9kZS5jbGFzc0xpc3QuY29udGFpbnMoJ2lyY19yaXMnKSkgfHwgKG5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCdpcmNfbWknKSB8fCAobm9kZS5jbGFzc0xpc3QuY29udGFpbnMoJ2lyY190YXMnKSkpKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiQWRkaW5nIGxpbmsgT0sgT0sgIik7CiAgICAgICAgICAgIHZhciBvYmplY3QgPSBub2RlLmNsb3Nlc3QoJy5pcmNfYycpOwogICAgICAgICAgICAvLyBSZXRyaXZlIGltYWdlIGxpbmtzLCBhbmQgaW1hZ2UgdXJsCiAgICAgICAgICAgIHZhciBpbWFnZUxpbmtzID0gb2JqZWN0LnF1ZXJ5U2VsZWN0b3IoJy5fRkt3LmlyY19idXRfciA+IHRib2R5ID4gdHInKTsKICAgICAgICAgICAgdmFyIGltYWdlVGV4dCA9IG9iamVjdC5xdWVyeVNlbGVjdG9yKCcuX2NqaiA+IC5pcmNfaXQgPiAuaXJjX2hkID4gLl9yMycpOwoKICAgICAgICAgICAgLy8gUmV0cml2ZSB0aGUgaW1hZ2UgVVJMCiAgICAgICAgICAgIHZhciBpbWFnZVVSTDsKCiAgICAgICAgICAgIHZhciB0aHVtYm5haWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbWdbbmFtZT0iJyArIG9iamVjdC5kYXRhc2V0Lml0ZW1JZCArICciXScpOwogICAgICAgICAgICBpZiAodGh1bWJuYWlsKSB7CiAgICAgICAgICAgICAgICB2YXIgbWV0YSA9IHRodW1ibmFpbC5jbG9zZXN0KCcucmdfYngnKS5xdWVyeVNlbGVjdG9yKCcucmdfbWV0YScpOwogICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhID0gSlNPTi5wYXJzZShtZXRhLmlubmVySFRNTCk7CiAgICAgICAgICAgICAgICBpbWFnZVVSTCA9IG1ldGFkYXRhLm91OwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaW1hZ2VVUkwgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpcmNfbWknKVswXS5zcmM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFJlbW92ZSBwcmV2aW91c2x5IGdlbmVyYXRlZCB2aWV3IGltYWdlIGJ1dHRvbnMKICAgICAgICAgICAgdmFyIG9sZFZpZXdJbWFnZSA9IGltYWdlTGlua3MucXVlcnlTZWxlY3RvcignLmV4dF9hZGRvbicpOwogICAgICAgICAgICBpZiAob2xkVmlld0ltYWdlKSB7CiAgICAgICAgICAgICAgICBpbWFnZUxpbmtzLnJlbW92ZUNoaWxkKG9sZFZpZXdJbWFnZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHJlbW92ZSBwcmV2aW91c2x5IGdlbmVyYXRlZCBzZWFyY2ggYnkgaW1hZ2UgbGlua3MKICAgICAgICAgICAgdmFyIG9sZFNlYXJjaEJ5SW1hZ2UgPSBpbWFnZVRleHQucXVlcnlTZWxlY3RvcignLmV4dF9hZGRvbicpOwogICAgICAgICAgICBpZiAob2xkU2VhcmNoQnlJbWFnZSkgewogICAgICAgICAgICAgICAgaW1hZ2VUZXh0LnJlbW92ZUNoaWxkKG9sZFNlYXJjaEJ5SW1hZ2UpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBDcmVhdGUgU2VhcmNoIGJ5IGltYWdlIGJ1dHRvbgogICAgICAgICAgICB2YXIgc2VhcmNoQnlJbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKICAgICAgICAgICAgc2VhcmNoQnlJbWFnZS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCAnL3NlYXJjaGJ5aW1hZ2U/JmltYWdlX3VybD0nICsgaW1hZ2VVUkwpOwogICAgICAgICAgICBzZWFyY2hCeUltYWdlLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCAnZXh0X2FkZG9uJyk7CiAgICAgICAgICAgIHNlYXJjaEJ5SW1hZ2Uuc2V0QXR0cmlidXRlKCdzdHlsZScsICdtYXJnaW4tbGVmdDo0cHQ7Jyk7CgogICAgICAgICAgICAvLyBJbnNlcnQgdGV4dCBpbnRvIFNlYXJjaCBieSBpbWFnZSBidXR0b24KICAgICAgICAgICAgdmFyIHNlYXJjaEJ5SW1hZ2VUZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgICAgICAgICBsb2NhbGlzZU9iamVjdChzZWFyY2hCeUltYWdlVGV4dCwgJzxzcGFuPlZpZXcgSW1hZ2U8L3NwYW4+Jyk7CiAgICAgICAgICAgIHNlYXJjaEJ5SW1hZ2UuYXBwZW5kQ2hpbGQoc2VhcmNoQnlJbWFnZVRleHQpOwoKICAgICAgICAgICAgLy8gQXBwZW5kIFNlYXJjaCBieSBpbWFnZSBidXR0b24KICAgICAgICAgICAgaW1hZ2VUZXh0LmFwcGVuZENoaWxkKHNlYXJjaEJ5SW1hZ2UpOwoKICAgICAgICAgICAgLy8gQ3JlYXRlIFZpZXcgaW1hZ2UgYnV0dG9uCiAgICAgICAgICAgIHZhciB2aWV3SW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwogICAgICAgICAgICB2aWV3SW1hZ2Uuc2V0QXR0cmlidXRlKCdjbGFzcycsICdleHRfYWRkb24nKTsKCiAgICAgICAgICAgIC8vIEFkZCBnbG9iZSB0byBWaWV3IGltYWdlIGJ1dHRvbgogICAgICAgICAgICB2YXIgdmlld0ltYWdlTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKICAgICAgICAgICAgdmFyIGdsb2JlSWNvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5fUkt3Ll93dGYuX1B0ZicpLmNsb25lTm9kZSh0cnVlKTsKICAgICAgICAgICAgdmlld0ltYWdlTGluay5hcHBlbmRDaGlsZChnbG9iZUljb24pOwoKICAgICAgICAgICAgLy8gYWRkIHRleHQgdG8gdmlldyBpbWFnZSBidXR0b24KICAgICAgICAgICAgdmFyIHZpZXdJbWFnZVRleHQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuX1dLdycpLmNsb25lTm9kZSh0cnVlKTsKICAgICAgICAgICAgbG9jYWxpc2VPYmplY3Qodmlld0ltYWdlVGV4dCwgJ1ZpZXcgSW1hZ2UnKTsKICAgICAgICAgICAgdmlld0ltYWdlTGluay5hcHBlbmRDaGlsZCh2aWV3SW1hZ2VUZXh0KTsKCiAgICAgICAgICAgIC8vIEFkZCBWaWV3IGltYWdlIGJ1dHRvbiBVUkwKICAgICAgICAgICAgdmlld0ltYWdlTGluay5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBpbWFnZVVSTCk7CiAgICAgICAgICAgIHZpZXdJbWFnZUxpbmsuc2V0QXR0cmlidXRlKCd0YXJnZXQnLCAnX2JsYW5rJyk7CiAgICAgICAgICAgIHZpZXdJbWFnZS5hcHBlbmRDaGlsZCh2aWV3SW1hZ2VMaW5rKTsKCiAgICAgICAgICAgIC8vIEFkZCBWaWV3IGltYWdlIGJ1dHRvbiB0byBJbWFnZSBMaW5rcwogICAgICAgICAgICB2YXIgc2F2ZSA9IGltYWdlTGlua3MuY2hpbGROb2Rlc1sxXTsKICAgICAgICAgICAgaW1hZ2VMaW5rcy5pbnNlcnRCZWZvcmUodmlld0ltYWdlLCBzYXZlKTsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJBZGRpbmcgRE9ORSEhISIpOwogICAgICAgIH0KICAgIH0KfQoKCiAgICB2YXIgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbiAobXV0YXRpb25zKSB7CiAgICAgICAgbXV0YXRpb25zLmZvckVhY2goKG11dGF0aW9uKSA9PiB7CiAgICAgICAgICAgIGlmIChtdXRhdGlvbi5hZGRlZE5vZGVzICYmIG11dGF0aW9uLmFkZGVkTm9kZXMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtdXRhdGlvbi5hZGRlZE5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld05vZGUgPSBtdXRhdGlvbi5hZGRlZE5vZGVzW2ldOwogICAgICAgICAgICAgICAgICAgIGFkZExpbmtzKG5ld05vZGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9KTsKCiAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHsKICAgICAgICBjaGlsZExpc3Q6IHRydWUsCiAgICAgICAgc3VidHJlZTogdHJ1ZQogICAgfSk7CgogICAgYWRkTGlua3MoZG9jdW1lbnQuYm9keSk7Cgp9KSgpOw=="},{"name":"Bunpro: Auto-show Info","options":{"check_for_updates":true,"comment":null,"compatopts_for_requires":true,"compat_wrappedjsobject":false,"compat_metadata":false,"compat_foreach":false,"compat_arrayleft":false,"compat_uW_gmonkey":false,"compat_forvarin":false,"noframes":null,"awareOfChrome":false,"run_at":null,"override":{"use_includes":[],"orig_includes":["*bunpro.jp/*"],"merge_includes":true,"use_matches":[],"orig_matches":[],"merge_matches":true,"use_excludes":[],"orig_excludes":["*community.bunpro.jp*"],"merge_excludes":true,"use_connects":[],"merge_connects":true,"use_blockers":[],"orig_run_at":"document-idle","orig_noframes":null,"orig_connects":[]}},"storage":{"ts":1598036339905,"data":{}},"enabled":true,"position":9,"file_url":"https://greasyfork.org/scripts/370019-bunpro-auto-show-info/code/Bunpro:%20Auto-show%20Info.user.js","uuid":"19685437-f68e-4a31-804d-7ae99409b589","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBCdW5wcm86IEF1dG8tc2hvdyBJbmZvCi8vIEBuYW1lc3BhY2UgICAgaHR0cDovL3RhbXBlcm1vbmtleS5uZXQvCi8vIEB2ZXJzaW9uICAgICAgMC4yLjQKLy8gQGRlc2NyaXB0aW9uICBBdXRvbWF0aWNhbGx5IGV4cGFuZHMgdGhlIGZ1bGwgZ3JhbW1hciBpbmZvIHdoZW4geW91IGdldCBhIHJldmlldyB3cm9uZy4KLy8gQGF1dGhvciAgICAgICBLdW1pcmVpCi8vIEBpbmNsdWRlICAgICAgKmJ1bnByby5qcC8qCi8vIEBleGNsdWRlICAgICAgKmNvbW11bml0eS5idW5wcm8uanAqCi8vIEByZXF1aXJlICAgICAgaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9zY3JpcHRzLzUzOTItd2FpdGZvcmtleWVsZW1lbnRzL2NvZGUvV2FpdEZvcktleUVsZW1lbnRzLmpzP3ZlcnNpb249MTE1MDEyCi8vIEByZXF1aXJlICAgICAgaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9zY3JpcHRzLzM3MDYyMy1idW5wcm8taGVscGZ1bC1ldmVudHMvY29kZS9CdW5wcm86JTIwSGVscGZ1bCUyMEV2ZW50cy5qcz92ZXJzaW9uPTYxNTcwMAovLyBAZ3JhbnQgICAgICAgIG5vbmUKLy8gPT0vVXNlclNjcmlwdD09CgooZnVuY3Rpb24oKSB7CgkvL3dhaXQgdW50aWwgd2UncmUgcmV2aWV3aW5nCgkkKCdIVE1MJylbMF0uYWRkRXZlbnRMaXN0ZW5lcigncXVpei1wYWdlJywgZnVuY3Rpb24oKSB7CgkJLy9kbyBzdHVmZiB3aGVuIHdlIHByZXNzIGVudGVyIGFuZCBnZXQgdGhlIGFuc3dlciB3cm9uZwoJCSQoJyNzdHVkeS1hbnN3ZXItaW5wdXQnKS5vbigna2V5ZG93bicsIGZ1bmN0aW9uKGV2ZW50KSB7CgkJCWlmIChldmVudC53aGljaCA9PSAxMykgewoJCQkJb3BlbklmV3JvbmcoKTsKCQkJfQoJCX0pOwoJCS8vZG8gc3R1ZmYgd2hlbiB3ZSBjbGljayBzdWJtaXQgYW5kIGdldCB0aGUgYW5zd2VyIHdyb25nCgkJJCgnI3N1Ym1pdC1zdHVkeS1hbnN3ZXInKS5vbignY2xpY2snLCBmdW5jdGlvbigpIHsKCQkJb3BlbklmV3JvbmcoKTsKCQl9KTsKCgl9KTsKCgkvL29wZW5zIHRoZSBpbmZvIGlmIHlvdSBnZXQgdGhlIGl0ZW0gd3JvbmcKCWZ1bmN0aW9uIG9wZW5JZldyb25nKCkgewoJCWlmICgkKCcub29wcy1idXR0b24nKVswXS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIgfHwgJCgnI2xlYXJuLW5ldy1ncmFtbWFyLXBhZ2UnKS5sZW5ndGgpIHsKCQkJJCgnLnNob3ctZ3JhbW1hci10ZXh0JykuY2xpY2soKTsKCQl9Cgl9Cn0pKCk7","requires":[]},{"name":"Bunpro: Mistake Delay","options":{"check_for_updates":true,"comment":null,"compatopts_for_requires":true,"compat_wrappedjsobject":false,"compat_metadata":false,"compat_foreach":false,"compat_arrayleft":false,"compat_uW_gmonkey":false,"compat_forvarin":false,"noframes":null,"awareOfChrome":false,"run_at":null,"override":{"use_includes":[],"orig_includes":["*bunpro.jp/*"],"merge_includes":true,"use_matches":[],"orig_matches":[],"merge_matches":true,"use_excludes":[],"orig_excludes":["*community.bunpro.jp*"],"merge_excludes":true,"use_connects":[],"merge_connects":true,"use_blockers":[],"orig_run_at":"document-idle","orig_noframes":null,"orig_connects":[]}},"storage":{"ts":1598036343158,"data":{}},"enabled":true,"position":10,"file_url":"https://greasyfork.org/scripts/371388-bunpro-mistake-delay/code/Bunpro:%20Mistake%20Delay.user.js","uuid":"c70e8cb4-850d-43ad-b837-ba6c5b1e2bf0","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBCdW5wcm86IE1pc3Rha2UgRGVsYXkKLy8gQG5hbWVzcGFjZSAgICBodHRwOi8vdGFtcGVybW9ua2V5Lm5ldC8KLy8gQHZlcnNpb24gICAgICAwLjIuNQovLyBAZGVzY3JpcHRpb24gIFByZXZlbnRzIHByZW1hdHVyZSB3cm9uZyBhbnN3ZXIgc3VibWlzc2lvbi4KLy8gQGF1dGhvciAgICAgICBLdW1pcmVpCi8vIEBpbmNsdWRlICAgICAgKmJ1bnByby5qcC8qCi8vIEBleGNsdWRlICAgICAgKmNvbW11bml0eS5idW5wcm8uanAqCi8vIEByZXF1aXJlICAgICAgaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9zY3JpcHRzLzUzOTItd2FpdGZvcmtleWVsZW1lbnRzL2NvZGUvV2FpdEZvcktleUVsZW1lbnRzLmpzP3ZlcnNpb249MTE1MDEyCi8vIEByZXF1aXJlICAgICAgaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9zY3JpcHRzLzM3MDYyMy1idW5wcm8taGVscGZ1bC1ldmVudHMvY29kZS9CdW5wcm86JTIwSGVscGZ1bCUyMEV2ZW50cy5qcz92ZXJzaW9uPTYxNTcwMAovLyBAZ3JhbnQgICAgICAgIG5vbmUKLy8gPT0vVXNlclNjcmlwdD09CgooZnVuY3Rpb24oKSB7CgkvLyBTZWNvbmRzIG9mIGRlbGF5Cgljb25zdCBkZWxheSA9IDI7CgoJLy8gV2FpdCB1bnRpbCB3ZSdyZSByZXZpZXdpbmcKCSQoJ0hUTUwnKVswXS5hZGRFdmVudExpc3RlbmVyKCdxdWl6LXBhZ2UnLCBmdW5jdGlvbigpIHsKCQkvLyBBZGQgdGhlIHN0YW5kYXJkIHN0eWxpbmcgdG8gdGhlIGRpc2FibGVkIGJ1dHRvbgoJCWFkZENTUygpOwoKCQkvLyBEbyBzdHVmZiB3aGVuIHdlIHByZXNzIGVudGVyIG9yIGJhY2tzcGFjZQoJCSQoJyNzdHVkeS1hbnN3ZXItaW5wdXQnKS5vbigna2V5ZG93bicsIGZ1bmN0aW9uKGV2ZW50KSB7CgkJCXZhciBlbGVtID0gJCgnI3N0dWR5LWFuc3dlci1pbnB1dCcpOwoJCQkvLyBJbml0aWF0ZSBkZWxhdGUgd2hlbiB3ZSBwcmVzcyBlbnRlciwgZ2V0IHRoZSBhbnN3ZXIgd3JvbmcsIGFuZCBubyBkZWxheSBpcyBhbHJlYWR5IGFjdGl2ZQoJCQl2YXIgYmtnID0gZWxlbVswXS5zdHlsZS5iYWNrZ3JvdW5kOwoJCQlpZiAoYmtnICE9ICIiKSB7CgkJCQl2YXIgYmtnX2xzdCA9IGJrZy5zbGljZSg1LCBia2cubGVuZ3RoLTEpLnNwbGl0KCcsICcpOwoJCQkJaWYgKGV2ZW50LndoaWNoID09IDEzICYmIE51bWJlcihia2dfbHN0WzBdKSA+IE51bWJlcihia2dfbHN0WzFdKSArIE51bWJlcihia2dfbHN0WzJdKSAmJiAhJCgnI3N1Ym1pdC1zdHVkeS1hbnN3ZXItZGlzYWJsZWQnKS5sZW5ndGgpIHsKCQkJCQllbmFibGVEZWxheSgpOwoJCQkJCXNldFRpbWVvdXQoZGlzYWJsZURlbGF5LCBkZWxheSoxMDAwKTsKCQkJCX0KCQkJfQoJCX0pOwoJCSQoJ2JvZHknKS5vbigna2V5ZG93bicsIGZ1bmN0aW9uKGV2ZW50KSB7CgkJCS8vIENhbmNlbCBkZWxheSBpZiB3ZSBwcmVzcyBiYWNrc3BhY2UgYWZ0ZXIgZ2V0dGluZyBhbiBhbnN3ZXIgd3JvbmcKCQkJaWYgKGV2ZW50LndoaWNoID09IDggJiYgJCgnI3N1Ym1pdC1zdHVkeS1hbnN3ZXItZGlzYWJsZWQnKS5sZW5ndGgpIGRpc2FibGVEZWxheSgpOwoJCX0pOwoJfSk7CgoJLy8gTWFrZXMgdXNlciB1bmFibGUgdG8gY29udGludWUgdG8gdGhlIG5leHQgaXRlbQoJZnVuY3Rpb24gZW5hYmxlRGVsYXkoKSB7CgkJJCgnI3N0dWR5LWFuc3dlci1pbnB1dCcpWzBdLmJsdXIoKTsKCQkkKCcjc3VibWl0LXN0dWR5LWFuc3dlcicpLmF0dHIoJ2lkJywgJ3N1Ym1pdC1zdHVkeS1hbnN3ZXItZGlzYWJsZWQnKTsKCX0KCgkvLyBNYWtlcyB1c2VyIGFibGUgdG8gY29udGludWUgdG8gdGhlIG5leHQgaXRlbSBhZ2FpbgoJZnVuY3Rpb24gZGlzYWJsZURlbGF5KCkgewoJCSQoJyNzdWJtaXQtc3R1ZHktYW5zd2VyLWRpc2FibGVkJykuYXR0cignaWQnLCAnc3VibWl0LXN0dWR5LWFuc3dlcicpOwoJfQoKCS8vIEFkZHMgdGhlIG5lZWRlZCBDU1MKCWZ1bmN0aW9uIGFkZENTUygpIHsKCQkkKCdoZWFkJykuYXBwZW5kKCc8c3R5bGU+I3N1Ym1pdC1zdHVkeS1hbnN3ZXItZGlzYWJsZWQgeycgKwoJCQkJCQkgJ3dpZHRoOiAxNSU7JyArCgkJCQkJCSAncmlnaHQ6IDA7JyArCgkJCQkJCSAndGV4dC1hbGlnbjogY2VudGVyOycgKwoJCQkJCQkgJ3Bvc2l0aW9uOiBhYnNvbHV0ZTsnICsKCQkJCQkJICdmb250LXdlaWdodDogNDAwOycgKwoJCQkJCQkgJ2ZvbnQtc2l6ZTogMjBweDsnICsKCQkJCQkJICd6LWluZGV4OiAxMDA7JyArCgkJCQkJCSAnYm9yZGVyLXJhZGl1czogMDsnICsKCQkJCQkJICdjb2xvcjogd2hpdGU7JyArCgkJCQkJCSAnYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7JyArCgkJCQkJCSAnfScgKwoJCQkJCQkgJ0BtZWRpYSAobWF4LXdpZHRoOiA0ODBweCkgI3N1Ym1pdC1zdHVkeS1hbnN3ZXItZGlzYWJsZWQge2ZvbnQtc2l6ZTogMTJweCAhaW1wb3J0YW50O308L3N0eWxlPicpCgl9Cn0pKCk7","requires":[]},{"name":"Bunpro: Disable Backspace Undo","options":{"check_for_updates":true,"comment":null,"compatopts_for_requires":true,"compat_wrappedjsobject":false,"compat_metadata":false,"compat_foreach":false,"compat_arrayleft":false,"compat_uW_gmonkey":false,"compat_forvarin":false,"noframes":null,"awareOfChrome":false,"run_at":null,"override":{"use_includes":[],"orig_includes":["*bunpro.jp/*"],"merge_includes":true,"use_matches":[],"orig_matches":[],"merge_matches":true,"use_excludes":[],"orig_excludes":["*community.bunpro.jp*"],"merge_excludes":true,"use_connects":[],"merge_connects":true,"use_blockers":[],"orig_run_at":"document-idle","orig_noframes":null,"orig_connects":[]}},"storage":{"ts":1598996892793,"data":{}},"enabled":true,"position":11,"file_url":"https://greasyfork.org/scripts/396170-bunpro-disable-backspace-undo/code/Bunpro:%20Disable%20Backspace%20Undo.user.js","uuid":"3bddebe2-6cbf-43bf-b6c3-608de97ce50b","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBCdW5wcm86IERpc2FibGUgQmFja3NwYWNlIFVuZG8KLy8gQG5hbWVzcGFjZSAgICBodHRwOi8vdGFtcGVybW9ua2V5Lm5ldC8KLy8gQHZlcnNpb24gICAgICAxLjAuMwovLyBAZGVzY3JpcHRpb24gIERpc2FibGVzIHRoZSBiYWNrc3BhY2UgZnVuY3Rpb25hbGl0eSBpbiByZXZpZXdzCi8vIEBhdXRob3IgICAgICAgS3VtaXJlaQovLyBAaW5jbHVkZSAgICAgICpidW5wcm8uanAvKgovLyBAZXhjbHVkZSAgICAgICpjb21tdW5pdHkuYnVucHJvLmpwKgovLyBAcmVxdWlyZSAgICAgIGh0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvc2NyaXB0cy81MzkyLXdhaXRmb3JrZXllbGVtZW50cy9jb2RlL1dhaXRGb3JLZXlFbGVtZW50cy5qcz92ZXJzaW9uPTExNTAxMgovLyBAcmVxdWlyZSAgICAgIGh0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvc2NyaXB0cy8zNzA2MjMtYnVucHJvLWhlbHBmdWwtZXZlbnRzL2NvZGUvQnVucHJvOiUyMEhlbHBmdWwlMjBFdmVudHMuanM/dmVyc2lvbj02MTU3MDAKLy8gQGdyYW50ICAgICAgICBub25lCi8vID09L1VzZXJTY3JpcHQ9PQoKKGZ1bmN0aW9uKCkgewogICAgdmFyICQgPSB3aW5kb3cuJDsKICAgICQoJ2h0bWwnKVswXS5hZGRFdmVudExpc3RlbmVyKCdxdWl6LXBhZ2UnLCAoKT0+ewogICAgICAgIHZhciBpbnB1dF9lbGVtID0gJCgnI3N0dWR5LWFuc3dlci1pbnB1dCcpOwogICAgICAgICQoJ2JvZHknKS5rZXlkb3duKChldmVudCk9PnsKICAgICAgICAgICAgdmFyIGNvbG9ycyA9IGlucHV0X2VsZW0uY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJykubWF0Y2goL1xkKy9nKTsKICAgICAgICAgICAgdmFyIHN1bSA9IGNvbG9ycy5yZWR1Y2UoKGEsIGIpPT5OdW1iZXIoYSkrTnVtYmVyKGIpKTsKICAgICAgICAgICAgdmFyIHJlZG5lc3MgPSBjb2xvcnNbMF0vc3VtOwogICAgICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PSA4ICYmIHJlZG5lc3MgPiAwLjQpIHsKICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgaW5wdXRfZWxlbS5ibHVyKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0pOwp9KSgpOw==","requires":[]}],"settings":{"script_blacklist_server":[{"severity":"2","rules":["/https?:\\/\\/userscripts\\.org\\/scripts\\/(source|version)/(102614).*\\.user\\.js/"]},{"name":"SaveFrom.net helper","severity":"3","rules":["/https?:\\/\\/sf-addon\\.com\\/.*\\/.*\\.user\\.js/","/https?:\\/\\/.*\\.sf-helper\\.com\\/.*\\.user\\.js/"],"reason":"Shows advertisements"},{"severity":"8","reasons":{"en":"Used for a phishing compain to compromise users of baon-nutrition.com"},"rules":["/https?:\\/\\/files\\.ulysse\\.travel\\/.*\\.user\\.js/"]}]}}