我试图解码以下我可以通过实际解码的第一步我只是不理解哈希匹配的第二部分?
exec("import re;import base64");exec((lambda p,y:(lambda o,b,f:re.sub(o,b,f))(r"([0-9a-f]+)",lambda m:p(m,y),base64.b64decode("NWEgMmNjLCBhOSwgYywgNTQsIDJjZiwgOTcsIGIwLCAxZGYsIDE0OCwgMTAwCjVhIDI0LCAzMSwgMTIyLCAxOTgsIDE1NSwgY2EsIDcyLCBmNSwgZmUsIDJkMQphMyAxM2YgNWEgNWYKYTMgMjg1LmVjLjI4NSA1YSAxMWIKYTMgMjg1LmVjLjIyYiA1YSAyMDQKCjE5OgoJYTMgMWU5IDVhIDE0MgoyNDAgMTY0OiAjIDIyMSAyLjQgMjJjCglhMyAyMTMgNWEgMjEzIDI2NSAxNDIKCgoKCjgzCQkJID0gJzc5Ljk2Ljc0Jwo4MAkJCSAgID0gYTkuMTFiKDE0ND04MykKMWY5CQkJID0gIjEuMC4zIgoxOWQJCSAgID0gMmNjLjJhOCgyY2YuMTgzLjEzNignMTI6Ly80ZS85My8nICsgODMpKQoxODgJCSAgPSAiNTYgOTQiCmUxCQkgID0gJzJmLzU2IDk0JwoxYTEJCQkJICAgPSAyZDEuODcoJzM2JykKMjVlCQkJCSAgID0gMmQxLjg3KCczNScpCjJhZAkJCQkgICA9IDJkMS44NygnMjI2JykKCjJhMwkJCSAgPSBjLjJjZSgpCjIyYgkJCQkgPSAyMDQoKQoKODQJCQkgPSAiMTQzOi8vOTIuMjBmLjFmZC8iCjhkCQkJPSA4NCArICI3YS0yYmYuMmE1IgoKYTYJCQkJID0gMmNjLjJhOCgyY2YuMTgzLjEzNignMTI6Ly80ZS85My8nICsgODMgKyAnLzE5ZS8yYjEvJykpCjIxNQkJCSAgPSAyY2MuMmE4KCcxMjovLzFiMicpCjIyZQkJCSAgPSAyY2MuMmE4KCcxMjovLzE4MicpOwoKMTAxCQkJPSBbJzc5Ljk2Ljc0JywnYmIuMTQ5LjI4NS5lYycsJzE3Ni45YSddCgo0YQkJCSAgPSBhNisnNGIuYTcnCjI2OQkJCQk9IGE2KycxYzMuYTcnCgojMTRhIDI2YiAxMWYgMWMKNjgJCSA9IGE2KycxMmMuYTcnCjM0CT0gYTYrJzE2OS5hNycKNjYJCSA9IGE2KycxZGMuYTcnCjQyCSAgPSBhNisnMjM2LTQ5LmE3Jwo0NAkgID0gYTYrJzIzMS0xNzMuYTcnCjdlCQkgICA9IGE2KycyNTcuYTcnCgojMWQxIDIyOQoxZDIJCQk9IDRmCgoKCgoxZSAyYmIoZSk6IDJjYy4yNjIoZSkKMWUgMjYxKGUpOiAyY2MuMjYyKCI2YSglZTYpIiAlIDE3KGUpKQoxZSAyODMoZSk6IDJjYy4yNjIoIjEzNyglZTYpIiAlIDE3KGUpKQoxZSAyODIoZSk6IDJjYy4yNjIoImZmKCVlNikiICUgMTcoZSkpCjFlIDI0NihlLGUyPSIxIixlMz0iIik6IDJjYy4yNjIoJ2ZmKCVlNiwiJWU2IiwiJWU2IiknICUgKDE3KGUpLDE3KGUyKSxlMykpOyAKMWUgMmFmKGEpOiAyY2MuMjYyKCIyMGIoJWU2KSIgJSAxNyhhKSkKMWUgMjc4KGEpOiAyY2MuMjYyKCIxZWYuMWQ4KDFjOD0lZTYpIiAlICgxNyhhKSkpCjFlIDI5YShhKTogMmNjLjI2MigiZjAoJWU2KSIgJSAoMTcoYSkpKQoxZSAyM2MoYSwyNmMpOiAyY2MuMjYyKCJmMCglZTYsJWU2KSIgJSAoMTcoYSksMTcoMjZjKSkpCjFlIDE2MihlKTogMmNjLjI2MigiMTg5KCVlNikiICUgMTcoZSkpCjFlIDI2NigpOiAyY2MuMjYyKCIxNmQiKQoxZSBiYygpOgoJM2YgJzJkMyAxNjggMWI1IDIxOCEnCgkKMTQ4LjEwNyhiYykKCiMgMWQ0IDI4MCAyNTYgMjMgYmUgMmEwIDIyNCAyYSBiYiAyOTknZTYKMWUgMTg1KCk6CgkyMmYgNjgsMzQsNjYsNDIsNDQsN2UsMmFkCgkjIDIxZSAxNiAyMTEgMmJlIDEzOSAyYSAyNTggMjZlCgkjIDEwYSA9ICIxNDM6Ly83NC4yMGYuMWZkLzFjMy85YS03YS0xYy4xOWMiCgkjIDE4MyA9IDJjYy4yYTgoMmNmLjE4My4xMzYoJzEyOi8vNGUvOTMnLCc4Yy8nKSkKCSMgNzIuMTBlKDEwYSwgMTgzICsgIi85YS03YS0xYy4xOWMiKQoJIyAxYyA9IDVmKCkKCSMgMWMuZmIoMTgzICsgIi85YS03YS0xYy4xOWMiKQoJIyA2OAkJID0gMTcoMWMuMjUoJzFjJywgJzE2YicpKQoJIyAzNAk9IDE3KDFjLjI1KCcxYycsICcxMDUnKSkKCSMgNjYJCSA9IDE3KDFjLjI1KCcxYycsICcxNjYnKSkKCSMgNDIJICA9IDE3KDFjLjI1KCcxYycsICcxMjUnKSkKCSMgNDQJICA9IDE3KDFjLjI1KCcxYycsICcxMWQnKSkKCSMgN2UJCSAgID0gMTcoMWMuMjUoJzFjJywgJzE4ZicpKQoJIyA0YQkJCSAgPSAxNygxYy4yNSgnMWMnLCAnNGInKSkKCTE2IDFhMT09IiIgM2EgMjVlPT0iIiAzYSAyYWQ9PSIyNGYiOgoJCTFkNSA9ICI1ZCAxMDcgMmM3IDFmMiAxZmMgMTQzOi8vOTIuMjBmLjFmZCAzYSAxODcgYWUgMjViIDM2IDNhIDM1IDIxIDJhIDdhIDZjIDIzOSAyMyBmYS4gIgoJCTFkMyA9ICIxN2IgMzcgMWFmIDIzIDE4NyBhZSAzNiAzYSAzNSAxNWE/IgoJCTY0PTJkMS45ZCgxODggKyAiIC0gMTI3IiwxZDUsMWQzKQoJCTJkMS4xNjUoJzIyNicsJzFhNicpCgkJMTYgNjQ6CgkJCTJkMS5kNCgpCgoJMTdjKCkKCiMgMjBjIDFiNgoxZSAxN2MoKToKCgk1YignMTI5IDU2Jyw4NCwyLDY4LDRhLCcnKQoJNWIoJ2MyJyw4NCwzLDM0LDRhLCcnKQoJNWIoJzFmNScsODQsOCw2Niw0YSwnJykKCTllKCdmMicsICcxM2QnKQoKIyAyMzUgMWI2CjFlIGU3KCk6CgoJMmNhID0gODkoOGQgKyAiPzk1PTE3OCZmZD0iICsgMWExICsgIiYxMWU9IiArIDg4KDI1ZSwxYTEpKQoJMjAgPSBmZS4xMTkoMmNhKQoKCTE1IDQ3IDIxIDIwOgoJCTViKDQ3Wyc1MCddICsgJyAtICcgKyA0N1snYjEnXSw0N1snMjQzJ10sNSw0N1snMjNhJ10sNGEsJycpCgkJOWUoJ2YyJywgJzEzZCcpCgojIGMyIGI4CjFlIGM4KCk6Cgk1YignMjNlIDMzJywnMmQnLDQsNDIsNGEsJycpCgk1YignMTdmIDI1MicsJzJkJyw2LDQ0LDRhLCcnKQoJNWIoJzI0OCBiYScsJzJkJyw3LDdlLDRhLCcnKQoJOWUoJ2YyJywgJzEzZCcpCgojIDI0YiBiYgoxZSBlOChkMSxiZik6CiAgMjRjIDEyZSgpOgoJZWE9MjVhCglhYj0xCgk5MD01CgkxZSAxYjMoNmQsKjI4NiwqKjIyMyk6CgkgIDJjYy4yNjIoIjZhKCVkKSIgJSAoNmQuZWEsICkpICMgMWNjIDJhIGRhIDIxYyBiZAoJICA2ZC4xOWI9Yy4yMWIoNmQuZWEpICMgMjUgYmQKCSAgMmNjLjExYygyYTcpICMgN2QgYmQgZjUgMjMgMTg0CgkgIDZkLmM2KCkKCTFlIGM2KDZkKToKCSAgNmQuMTliLmQ2KDZkLmFiKS4xYzAoZDEpICMgMTRhIGQxCgkgIDE5OiBmPTFjOShiZik7IGRhPWYuZmIoKQoJICAyNDA6IGRhPWJmCgkgIDZkLjE5Yi5kNig2ZC45MCkuMWU2KDE3KGRhKSkKCSAgMjgKICAxMmUoKQoKIyAyM2YgMmM4IGRhCjFlIDExMCgpOgoJZTgoMTg4LCdbOTg9MjIyXTFlZCAyMyA1NlsvOThdWzI3M11bMjczXScpCQkKCQojIDEyOSAxZmUKMWUgMTRkKDI2LDJkLDFkKToKCgkyY2MuMjYyKCAiNmEoNTUpIiApCgoJIyAxODYgMmEgMzYgM2EgMzUgMTRhIDIxIDJhIDdhCgljZSA9IDI4YygpCgkxYWEgPSA4ZCArICI/OTU9MWNmJjIzND0iICsgY2UgKyAiJjQ3PSIgKyAyZCArICImZmQ9IiArIDFhMSArICImMTFlPSIgKyA4OCgyNWUsMWExKQoJMmNhID0gODkoMWFhKQoJMjAgPSBmZS4xMTkoMmNhKQoJNDcgPSAxNygyMC4yNSgnNTAnKSkKCTI5ID0gMTcoMjAuMjUoJ2IxJykpCgoJIyAyMWUgMTYgMjExIDE1MCBhIDI5IDEzYQoJYzcgPSAyY2MuMmE4KDJjZi4xODMuMTM2KCcxMjovLycsJzRlJykpCgk4NiA9IGM3ICsgJzI5LjJjMCcKCTg1ID0gMmNmLjE4My4xNTcoODYpCgk3NiA9IDVmKCkKCTc2LmZiKDg2KQoKCSMgMTg2IDJhIDI5IDE3NSAyYSA0NyAxZTEgMmEgMjA3IDE5NSAyOQoJMTYgODUgM2EgNzYuMjUoJzY3JywgJzI5JykgPT0gMjkgM2EgNzYuMjUoJzY3JywgJzQ3JykgPT0gNDc6CgkJMmEzID0gYy4yY2UoKQoJCTJjYy4yNjIoICIyY2UuOTEoNTUpIiApCgkJMmEzLjc3KDE4OCwgIjExMiAxZWMgMTUwIDJhIDI3YiAyMDggMjkiLCIiLCAxNyg3Ni4yNSgnNjcnLCAnNDcnKSkgKyAiICIgKyAxNyg3Ni4yNSgnNjcnLCAnMjknKSkpCgkyYjoKCgkJMTgzID0gMmNjLjJhOCgyY2YuMTgzLjEzNignMTI6Ly80ZS85MycsJzhjLycpKQoJCWUwID0gMmNmLjE4My4xNTcoMTgzKzJkKzI5KycuMTlhJykKCQk3YiA9IDJjZi4xODMuMTM2KDE4MysyZCsyOSsnLjE5YScpCgoJCTE2IGUwOgoJCQllZiA9IDdiCgkJCWQ4ID0gYy5hMigpCgkJCTJjYy4yNjIoICIyY2UuOTEoNTUpIiApCgkJCTNlID0gMmNjLjJhOCgyY2YuMTgzLjEzNignMTI6Ly8nLCc0ZScsJ2Y2JykpCgkJCTMyID0gMmNjLjJhOCgyY2YuMTgzLjEzNignMTI6Ly8nLCc0ZScpKQoJCQlmNS4xMWMoMikKCQkJZDguMTQ2KDE4OCwiZDcgIisgMjYsICI1ZCAxNWMuLi4iKQoJCQljYS4yMzAoZWYsMzIsZDgpCgkJCSMgOGEoM2UsIDMyKQoJCQkjIDI0LjJlKDNlKQoJCQlkOC4xNCgpCgkJCTgwLjZlKDE0ND0iMzYiLCBkNT0iIikKCQkJODAuNmUoMTQ0PSIzNSIsIGQ1PSIiKQoJCQkyYTMgPSBjLjJjZSgpCgkJCTJhMy43NygxODgsIDI2ICsgIiAxOTIgMTQ1IGVkIGEzIGFlIDFkNiA4YyIpCgkJCTJhMy43NygxODgsICIgIiwgIjE3MSAxYjcgMTMwIDM3IDE1YSAxYzYgMjMgMWEgMTQgMmYsIGRkIDFiMCAyMyAxYSAxNCAyZiIpCgkJCWMwKCkKCgkJMmI6CgoJCQkxNiAyMC4yNSgnMjg5Jyk6CgkJCQkyMjcgPSAyMC4yNSgnMjVjJykKCQkJCWQ5ID0gMjAuMjUoJzIxNycpCgkJCQkKCQkJCTE2IDIwLjI1KCcxNTgnKToKCQkJCQlkOSA9IDIwLjI1KCcxNTgnKQoJCQkJCgkJCQkzZiBkOQoKCQkJCWQ4ID0gYy5hMigpCgkJCQkyY2MuMjYyKCAiMmNlLjkxKDU1KSIgKQoKCQkJCSMgMTYgY2UgPT0gIjdmIjoKCQkJCSMJIDExOCgxOCkKCgkJCQlkOC4xNDYoMTg4LCIxNjcgIisgMjAuMjUoJzUwJykrICIgLSAiICsgMjAuMjUoJ2IxJyksICI1ZCAxNWMuLi4iKQoJCQkJZWYgPSA3YgoKCQkJCSMgMjRlIDIzIGI1IDJhZSBlZSAxOGIgMTVkCgkJCQkxOToKCQkJCQk3Mi4xMGUoZDksIGVmLCBkOCkKCQkJCTI0MCAxOTYgMjY1IGU6CgkJCQkJMTYgMTcoZSkgPT0gIjFhOCI6CgkJCQkJCTJjZi5iNShlZikKCQkJCQkyOAoKCQkJCTMyID0gMmNjLjJhOCgyY2YuMTgzLjEzNignMTI6Ly8nLCc0ZScpKQoJCQkJM2UgPSAyY2MuMmE4KDJjZi4xODMuMTM2KCcxMjovLycsJzRlJywnZjYnKSkKCQkJCWY1LjExYygyKQoJCQkJZDguMTM5KDAsIiIsICJkNyAiKyAyMC4yNSgnNTAnKSArIiAyYjkiLCI1ZCAxNWMuLi4iKQoJCQkJY2EuMjMwKGVmLDMyLGQ4KQoJCQkJIyA4YSgzZSwgMzIpCgkJCQkjIDI0LjJlKDNlKQoJCQkJZDguMTQoKQoJCQkJYzMgPSA4OSg4ZCArICI/OTU9ZWQmMjE5PSIgKyAxNygyMjcpICsgIiZmZD0iICsgMWExICsgIiYxMWU9IiArIDg4KDI1ZSwxYTEpKQoJCQkJZDAgPSBmZS4xMTkoYzMpCgkJCQkyYTMgPSBjLjJjZSgpCgkJCQkyYTMuNzcoMTg4LCBkMC4yNSgnMjhkJyksIiIsIGQwLjI1KCcyOTMnKSkKCQkJCTJhMy43NygxODgsICIgIiwgIjE3MSAxYjcgMTMwIDM3IDE1YSAxYzYgMjMgMWEgMTQgMmYsIGRkIDFiMCAyMyAxYSAxNCAyZiIpCgkJCQk4MC42ZSgxNDQ9IjM2IiwgZDU9IiIpCgkJCQk4MC42ZSgxNDQ9IjM1IiwgZDU9IiIpCgkJCQljMCgpCgoJCQkyYjoKCQkJCTJjYy4yNjIoICIyY2UuOTEoNTUpIiApCgkJCQkyYTMgPSBjLjJjZSgpCgkJCQkyYTMuNzcoMTg4LCAyMC4yNSgnMjc3JyksIiIsIDIwLjI1KCcyNzUnKSkKCiMgMjZmIDE2ZiBhMyAyYjMgMWZiIDIzIDFlYgoxZSA4YSgxOTAsIDE1NiwgMTBkPWFkLCAxM2U9N2MpOgoJMTYgYTggMmNmLjE4My40YygxNTYpOgoJCTJjZi4xYmMoMTU2KQoJMTUgMTYwIDIxIDJjZi4xZWUoMTkwKToKCQllNiA9IDJjZi4xODMuMTM2KDE5MCwgMTYwKQoJCWQgPSAyY2YuMTgzLjEzNigxNTYsIDE2MCkKCQkxNiAyY2YuMTgzLjI1ZChlNik6CgkJCThhKGU2LCBkLCAxMGQsIDEzZSkKCQkyYjoKCQkJMTYgYTggMmNmLjE4My40YyhkKSAyMDIgMmNmLjFhMyhlNikuMTBiIC0gMmNmLjFhMyhkKS4xMGIgPiAxOgoJCQkJMjQuMjMzKGU2LCBkKQoKIyAyNzEgMmE2ICgxZjYgMjMgMjlmIDEyMi4xZTUpCjFlIDg5KDJkKToKCWNmID0gewoJCScxYTctMjNiJzogZTEKCX0KCTFiYiA9IDEwMC4xZjgoKQoJMTlmID0gMWJiLjI1KDJkLCBjZj1jZikKCTFjMiA9IDE5Zi44MQoJMTlmLjE0KCkKCTI4IDFjMgoKIyAyNyBiYQoxZSBhMCgyZCk6CgkzZiAnIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCSAgIDEwMyAxYzUJCQkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjJwoJNzUgPSAyY2MuMmE4KDJjZi4xODMuMTM2KCcxMjovLzRlLzkzLzhjJywgJycpKQoJMTk6CQoJCTE1IDJjZCwgMWYsIDE1ZCAyMSAyY2YuNjUoNzUpOgoJCQlhYSA9IDAKCQkJYWEgKz0gNjAoMTVkKQoJCQkKCQkjIDcxIDE1ZCAzYSA3ZCA1YyAyMyAxYgoJCQkxNiBhYSA+IDA6CgkKCQkJCTJhMyA9IGMuMmNlKCkKCQkJCTE2IDJhMy40NigiMjcgMTI4IDMzIDNjIiwgMTcoYWEpICsgIiAxNWQgNDgiLCAiYzQgMzcgNzAgMjMgMWIgNmY/Iik6CgkJCQkJCQkKCQkJCQkxNSBmIDIxIDE1ZDoKCQkJCQkJMmNmLjQwKDJjZi4xODMuMTM2KDJjZCwgZikpCgkJCQkJMTUgZCAyMSAxZjoKCQkJCQkJMjQuMmUoMmNmLjE4My4xMzYoMmNkLCBkKSkKCQkJCQkyYTMgPSBjLjJjZSgpCgkJCQkJMmEzLjc3KDE4OCwgImJhIDE2YyAxMjAiLCAiWzk4IGMxXWM5IDE3MSAxMTIgMjA2IDU2IDk0Wy85OF0iKQoJMjQwOiAKCQkyYTMgPSBjLjJjZSgpCgkJMmEzLjc3KDE4OCwgIjI0YSAyMTEgMjdlIGE4IDI3YyAyMyBiNSAxMjggM2MiLCAiWzk4IGMxXWM5IDE3MSAxMTIgMjA2IDU2IDk0Wy85OF0iKQoJCiMgMjcgMzMgIAoxZSA4YigyZCk6CgkzZiAnIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCSAgIDEwMyAxYTAgMjQyCQkJICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIycKCTYxID0gMmNmLjE4My4xMzYoMmNjLjJhOCgnMTI6Ly80ZScpLCAnNDknKQoJMTYgMmNmLjE4My40Yyg2MSk9PTRmOgkKCQkxNSAyY2QsIDFmLCAxNWQgMjEgMmNmLjY1KDYxKToKCQkJYWEgPSAwCgkJCWFhICs9IDYwKDE1ZCkKCQkKCQkjIDcxIDE1ZCAzYSA3ZCA1YyAyMyAxYgoJCQkxNiBhYSA+IDA6CgkKCQkJCTJhMyA9IGMuMmNlKCkKCQkJCTE2IDJhMy40NigiMjcgMzMgM2MiLCAxNyhhYSkgKyAiIDE1ZCA0OCIsICJjNCAzNyA3MCAyMyAxYiA2Zj8iKToKCQkJCQoJCQkJCTE1IGYgMjEgMTVkOgoJCQkJCQkxOToKCQkJCQkJCTJjZi40MCgyY2YuMTgzLjEzNigyY2QsIGYpKQoJCQkJCQkyNDA6CgkJCQkJCQkxMWUKCQkJCQkxNSBkIDIxIDFmOgoJCQkJCQkxOToKCQkJCQkJCTI0LjJlKDJjZi4xODMuMTM2KDJjZCwgZCkpCgkJCQkJCTI0MDoKCQkJCQkJCTExZQoJCQkJCQkKCQkJMmI6CgkJCQkxMWUKCTE2IDJjYy4xMygnOTkuMjhjLjE0ZicpOgoJCWI0ID0gMmNmLjE4My4xMzYoJy8xMmYvMjAxLzE1NC8xMzIvMTVmL2NjLzExNy8nLCAnMTgxJykKCQkKCQkxNSAyY2QsIDFmLCAxNWQgMjEgMmNmLjY1KGI0KToKCQkJYWEgPSAwCgkJCWFhICs9IDYwKDE1ZCkKCQkKCQkJMTYgYWEgPiAwOgoKCQkJCTJhMyA9IGMuMmNlKCkKCQkJCTE2IDJhMy40NigiMjcgMTRmIDMzIDNjIiwgMTcoYWEpICsgIiAxNWQgNDggMjEgJzE4MSciLCAiYzQgMzcgNzAgMjMgMWIgNmY/Iik6CgkJCQkKCQkJCQkxNSBmIDIxIDE1ZDoKCQkJCQkJMmNmLjQwKDJjZi4xODMuMTM2KDJjZCwgZikpCgkJCQkJMTUgZCAyMSAxZjoKCQkJCQkJMjQuMmUoMmNmLjE4My4xMzYoMmNkLCBkKSkKCQkJCQkJCgkJCTJiOgoJCQkJMTFlCgkJYjMgPSAyY2YuMTgzLjEzNignLzEyZi8yMDEvMTU0LzEzMi8xNWYvY2MvMTE3LycsICc5ZicpCgkJCgkJMTUgMmNkLCAxZiwgMTVkIDIxIDJjZi42NShiMyk6CgkJCWFhID0gMAoJCQlhYSArPSA2MCgxNWQpCgkJCgkJCTE2IGFhID4gMDoKCgkJCQkyYTMgPSBjLjJjZSgpCgkJCQkxNiAyYTMuNDYoIjI3IDE0ZiAzMyAzYyIsIDE3KGFhKSArICIgMTVkIDQ4IDIxICc5ZiciLCAiYzQgMzcgNzAgMjMgMWIgNmY/Iik6CgkJCQkKCQkJCQkxNSBmIDIxIDE1ZDoKCQkJCQkJMmNmLjQwKDJjZi4xODMuMTM2KDJjZCwgZikpCgkJCQkJMTUgZCAyMSAxZjoKCQkJCQkJMjQuMmUoMmNmLjE4My4xMzYoMmNkLCBkKSkKCQkJCQkJCgkJCTJiOgoJCQkJMTFlCgkJCSAgIyBiOSAxODMgMjMgMjQ0IDFhYiA0OSAxNWQKCQkJCQkJCSAKCgkjIGI5IDE4MyAyMyAyOGUgMmQ1IDI4ZiA0OSAxNWQKCTZiID0gMmNmLjE4My4xMzYoMmNjLjJhOCgnMTI6Ly84Mi81Mi83OS45Ni4xNmEvNDknKSwgJycpCgkxNiAyY2YuMTgzLjRjKDZiKT09NGY6CQoJCTE1IDJjZCwgMWYsIDE1ZCAyMSAyY2YuNjUoNmIpOgoJCQlhYSA9IDAKCQkJYWEgKz0gNjAoMTVkKQoJCQoJCSMgNzEgMTVkIDNhIDdkIDVjIDIzIDFiCgkJCTE2IGFhID4gMDoKCQoJCQkJMmEzID0gYy4yY2UoKQoJCQkJMTYgMmEzLjQ2KCIyNyAyYjcgMzMgM2MiLCAxNyhhYSkgKyAiIDE1ZCA0OCIsICJjNCAzNyA3MCAyMyAxYiA2Zj8iKToKCQkJCQoJCQkJCTE1IGYgMjEgMTVkOgoJCQkJCQkyY2YuNDAoMmNmLjE4My4xMzYoMmNkLCBmKSkKCQkJCQkxNSBkIDIxIDFmOgoJCQkJCQkyNC4yZSgyY2YuMTgzLjEzNigyY2QsIGQpKQoJCQkJCQkKCQkJMmI6CgkJCQkxMWUKCQkJCQoJCQkJIyBiOSAxODMgMjMgMjI4IDQ5IDE1ZAoJNDE9IDJjZi4xODMuMTM2KDJjYy4yYTgoJzEyOi8vODIvNTIvNzkuOTYuMmJhLzQ5JyksICcnKQoJMTYgMmNmLjE4My40Yyg0MSk9PTRmOgkKCQkxNSAyY2QsIDFmLCAxNWQgMjEgMmNmLjY1KDQxKToKCQkJYWEgPSAwCgkJCWFhICs9IDYwKDE1ZCkKCQkKCQkjIDcxIDE1ZCAzYSA3ZCA1YyAyMyAxYgoJCQkxNiBhYSA+IDA6CgkKCQkJCTJhMyA9IGMuMmNlKCkKCQkJCTE2IDJhMy40NigiMjcgMjI4IDMzIDNjIiwgMTcoYWEpICsgIiAxNWQgNDgiLCAiYzQgMzcgNzAgMjMgMWIgNmY/Iik6CgkJCQkKCQkJCQkxNSBmIDIxIDE1ZDoKCQkJCQkJMmNmLjQwKDJjZi4xODMuMTM2KDJjZCwgZikpCgkJCQkJMTUgZCAyMSAxZjoKCQkJCQkJMjQuMmUoMmNmLjE4My4xMzYoMmNkLCBkKSkKCQkJCQkJCgkJCTJiOgoJCQkJMTFlCgkJCQkKCQkJCSMgYjkgMTgzIDIzIDIxZiAxMjEgNDkgMTVkCgk0ZD0gMmNmLjE4My4xMzYoMmNjLjJhOCgnMTI6Ly84Mi81Mi83OS45Ni4xZjAvZTknKSwgJycpCgkxNiAyY2YuMTgzLjRjKDRkKT09NGY6CQoJCTE1IDJjZCwgMWYsIDE1ZCAyMSAyY2YuNjUoNGQpOgoJCQlhYSA9IDAKCQkJYWEgKz0gNjAoMTVkKQoJCQoJCSMgNzEgMTVkIDNhIDdkIDVjIDIzIDFiCgkJCTE2IGFhID4gMDoKCQoJCQkJMmEzID0gYy4yY2UoKQoJCQkJMTYgMmEzLjQ2KCIyNyAyMWYgMTIxIDMzIDNjIiwgMTcoYWEpICsgIiAxNWQgNDgiLCAiYzQgMzcgNzAgMjMgMWIgNmY/Iik6CgkJCQkKCQkJCQkxNSBmIDIxIDE1ZDoKCQkJCQkJMmNmLjQwKDJjZi4xODMuMTM2KDJjZCwgZikpCgkJCQkJMTUgZCAyMSAxZjoKCQkJCQkJMjQuMmUoMmNmLjE4My4xMzYoMmNkLCBkKSkKCQkJCQkJCgkJCTJiOgoJCQkJMTFlCgkJCQkKCQkJCQoJCQkJIyBiOSAxODMgMjMgMTU5IGRmIDQ5IDE1ZAoJMzggPSAyY2YuMTgzLjEzNigyY2MuMmE4KCcxMjovLzgyLzUyL2JiLjE0OS4yMGUuNzInKSwgJycpCgkxNiAyY2YuMTgzLjRjKDM4KT09NGY6CQoJCTE1IDJjZCwgMWYsIDE1ZCAyMSAyY2YuNjUoMzgpOgoJCQlhYSA9IDAKCQkJYWEgKz0gNjAoMTVkKQoJCQoJCSMgNzEgMTVkIDNhIDdkIDVjIDIzIDFiCgkJCTE2IGFhID4gMDoKCQoJCQkJMmEzID0gYy4yY2UoKQoJCQkJMTYgMmEzLjQ2KCIyNyAxNTkgZGYgMzMgM2MiLCAxNyhhYSkgKyAiIDE1ZCA0OCIsICJjNCAzNyA3MCAyMyAxYiA2Zj8iKToKCQkJCQoJCQkJCTE1IGYgMjEgMTVkOgoJCQkJCQkyY2YuNDAoMmNmLjE4My4xMzYoMmNkLCBmKSkKCQkJCQkxNSBkIDIxIDFmOgoJCQkJCQkyNC4yZSgyY2YuMTgzLjEzNigyY2QsIGQpKQoJCQkJCQkKCQkJMmI6CgkJCQkxMWUKCQkJCQoJCQkJIyBiOSAxODMgMjMgMjFkIDQ5IDE1ZAoJNjkgPSAyY2YuMTgzLjEzNigyY2MuMmE4KCcxMjovLzgyLzUyLzc5Ljk2LjJiOC8yMDMnKSwgJycpCgkxNiAyY2YuMTgzLjRjKDY5KT09NGY6CQoJCTE1IDJjZCwgMWYsIDE1ZCAyMSAyY2YuNjUoNjkpOgoJCQlhYSA9IDAKCQkJYWEgKz0gNjAoMTVkKQoJCQoJCSMgNzEgMTVkIDNhIDdkIDVjIDIzIDFiCgkJCTE2IGFhID4gMDoKCQoJCQkJMmEzID0gYy4yY2UoKQoJCQkJMTYgMmEzLjQ2KCIyNyAyMWQgMzMgM2MiLCAxNyhhYSkgKyAiIDE1ZCA0OCIsICJjNCAzNyA3MCAyMyAxYiA2Zj8iKToKCQkJCQoJCQkJCTE1IGYgMjEgMTVkOgoJCQkJCQkyY2YuNDAoMmNmLjE4My4xMzYoMmNkLCBmKSkKCQkJCQkxNSBkIDIxIDFmOgoJCQkJCQkyNC4yZSgyY2YuMTgzLjEzNigyY2QsIGQpKQoJCQkJCQkKCQkJMmI6CgkJCQkxMWUKCQkJCQoJCQkJIyBiOSAxODMgMjMgZjYgNDkgMTVkCgk2MiA9IDJjZi4xODMuMTM2KDJjYy4yYTgoJzEyOi8vNGUvZjYnKSwgJycpCgkxNiAyY2YuMTgzLjRjKDYyKT09NGY6CQoJCTE1IDJjZCwgMWYsIDE1ZCAyMSAyY2YuNjUoNjIpOgoJCQlhYSA9IDAKCQkJYWEgKz0gNjAoMTVkKQoJCQoJCSMgNzEgMTVkIDNhIDdkIDVjIDIzIDFiCgkJCTE2IGFhID4gMDoKCQoJCQkJMmEzID0gYy4yY2UoKQoJCQkJMTYgMmEzLjQ2KCIyNyAyODcgMmMyIDMzIDNjIiwgMTcoYWEpICsgIiAxNWQgNDgiLCAiYzQgMzcgNzAgMjMgMWIgNmY/Iik6CgkJCQkKCQkJCQkxNSBmIDIxIDE1ZDoKCQkJCQkJMmNmLjQwKDJjZi4xODMuMTM2KDJjZCwgZikpCgkJCQkJMTUgZCAyMSAxZjoKCQkJCQkJMjQuMmUoMmNmLjE4My4xMzYoMmNkLCBkKSkKCQkJCQkJCgkJCTJiOgoJCQkJMTFlCgkJCQkKCgkyYTMgPSBjLjJjZSgpCgkyYTMuNzcoMTg4LCAiIDIyNSAzMyAzYyAxMjAiLCAiWzk4IGMxXWM5IDE3MSAxMTIgMjA2IDU2IDk0Wy85OF0iKQogCiMgMjcgMjE0IDE1ZAoxZSBjMCgpOgoJZjMgPSBjLjJjZSgpLjQ2KCcyNDcgOTEgMmYnLCAnMTEyIDJhOSAyMzggMjMgMTQgMmYnLCAnMTdiIDM3IDFhZiAyMyBmYT8nLCAxZTQ9JzJjOSwgMjEwJywxY2E9JzJhNCwgOTEnKQoJMTYgZjMgPT0gMDoKCQkyOAoJMmMgZjMgPT0gMToKCQkxMWUKCTNiID0gMjhjKCkKCTNmICIxY2I6ICIgKyAxNygzYikKCTE2IDNiID09ICcxNjMnOiAjIDJhMQoJCTNmICIjIyMjIyMjIyMjIyMgICAxOSAxNjMgMWEgMTQgICMjIyMjIyMjIyMjIyMjIyMjIgoJCTE5OiAyY2YuOTkoJzU3IC05IDhlJykKCQkyNDA6IDExZQoJCTE5OiAyY2YuOTkoJzU3IC05IDJmJykKCQkyNDA6IDExZQoJCTJhMy43NygiWzk4PTExYV1bMmQ5XTljICAhISFbLzk4XVsvMmQ5XSIsICIxYzEgMzdcJzE1NSBhZiAxMDkgNDMgMWI0IDI4NCAyYSAxYSAxNCIsICIxM2MgNTkuIDVkIDFhIDE0IDhlLzJmIFs5OD0xMGNdMWM3IGViWy85OF0gZjkgY2QgMTExIDJhIGI4LiIsJycpCgkyYyAzYiA9PSAnZDInOiAjMjRkCgkJM2YgIiMjIyMjIyMjIyMjIyAgIDE5IGQyIDFhIDE0ICAjIyMjIyMjIyMjIyMjIyMjIyIKCQkxOTogMmNmLjk5KCc1NyA4ZScpCgkJMjQwOiAxMWUKCQkxOTogMmNmLjk5KCc1NyAyZicpCgkJMjQwOiAxMWUKCQkxOTogMmNmLjk5KCc1NyAtOSAyY2MuMjA1JykKCQkyNDA6IDExZQoJCTE5OiAyY2YuOTkoJzU3IC05IDEwZi4yMDUnKQoJCTI0MDogMTFlCgkJMmEzLjc3KCJbOTg9MTFhXVsyZDldOWMgICEhIVsvOThdWy8yZDldIiwgIjFjMSAzN1wnMTU1IGFmIDEwOSA0MyAxYjQgMjg0IDJhIDFhIDE0IiwgIjEzYyA1OS4gNWQgMWEgMTQgOGUvMmYgWzk4PTEwY10xYzcgZWJbLzk4XSBmOSBjZCAxMTEgMmEgYjguIiwnJykKCTJjIDNiID09ICc5Yic6ICMgMWUzICAKCQkzZiAiIyMjIyMjIyMjIyMjICAgMTkgOWIgMWEgMTQgICMjIyMjIyMjIyMjIyMjIyMjIgoJCTE5OiAyY2YuOTkoJzE0MCBlNSAxYTUgMWEtYjYgMTUzLjJjYy4xMGYnKQoJCTI0MDogMTFlCgkJMTk6IDJjZi45OSgnMTQwIGU1IDFhNSAxYS1iNiAxNTMuMTBmJykKCQkyNDA6IDExZQoJCTE5OiAyY2YuOTkoJzE0MCBlNSAxYTUgMWEtYjYgMTUzLjJjYy4yY2MnKQoJCTI0MDogMTFlCgkJMTk6IDJjZi45OSgnMTQwIGU1IDFhNSAxYS1iNiAxNTMuMmNjJykKCQkyNDA6IDExZQkJCgkJMmEzLjc3KCJbOTg9YzFdWzJkOV0yZDIgMWFkIDFkZSAyMmFbLzk4XVsvMmQ5XSIsICJkZCAyYSAyOTQgMTYxIDI5MSBhZSAxZmYgM2EgWzk4PTExYV1bMmQ5XTI1ZiAyNmFbLzk4XVsvMmQ5XSAxY2QgMTExIDJhIDIyZCAxOTcgMTQxIGI4IDIxIDZjIDI5MSBhZSAyMTYgNGUgMjc2IDI4YiAxNTUtMjIwIDFjZCIpCgkyYyAzYiA9PSAnN2YnOiAjIDFkNwoJCTNmICIjIyMjIyMjIyMjIyMgICAxOSA3ZiAxYSAxNCAgIyMjIyMjIyMjIyMjIyMjIyMiCgkJMTk6CgkJCTJjZi45OSgnQDEwMiAxNTInKQoJCQkyY2YuOTkoJzE1ZSA4ZS4xNGUnKQoJCTI0MDogMTFlCgkJMTk6CgkJCTJjZi45OSgnQDEwMiAxNTInKQoJCQkyY2YuOTkoJzE1ZSAyZi4xNGUnKQoJCTI0MDogMTFlCgkJMTk6CgkJCTJjZi45OSgnQDEwMiAxNTInKQoJCQkyY2YuOTkoJzEwOCAvMjcwIDJmLjE0ZSAvZicpCgkJMjQwOiAxMWUKCQkxOToKCQkJMmNmLjk5KCdAMTAyIDE1MicpCgkJCTJjZi45OSgnMTA4IC8yNzAgOGUuMTRlIC9mJykKCQkyNDA6IDExZQoJCTJhMy43NygiWzk4PTExYV1bMmQ5XTljICAhISFbLzk4XVsvMmQ5XSIsICIxYzEgMzdcJzE1NSBhZiAxMDkgNDMgMWI0IDI4NCAyYSAxYSAxNCIsICIxM2MgNTkuIDVkIDFhIDE0IDhlLzJmIFs5OD0xMGNdMWM3IGViWy85OF0gZjkgY2QgMTExIDJhIGI4LiIsIjI5ZSAyN2YgMWZhIDNhIGViIDJiZCBmNCIpCgkyYjogIzJiMgoJCTNmICIjIyMjIyMjIyMjIyMgICAxOSAyYjQgMWEgMTQgICMjIyMjIyMjIyMjIyMjIyMjIgoJCTE5OiAyY2YuOTkoJzU3IGNjJykKCQkyNDA6IDExZQoJCTNmICIjIyMjIyMjIyMjIyMgICAxOSAxZGQgMWEgMTQgICMjIyMjIyMjIyMjIyMjIyMjIiAjMjYzIC8gMWU4CgkJMTk6IDJjZi45OSgnMWJmIDEzMyBiNiAxMGYnKQoJCTI0MDogMTFlCgkJMTk6IDJjZi45OSgnMWJmIDEzMyBiNiAyY2MnKQoJCTI0MDogMTFlCgkJMmEzLjc3KCJbOTg9MTFhXVsyZDldOWMgICEhIVsvOThdWy8yZDldIiwgIjFjMSAzN1wnMTU1IGFmIDEwOSA0MyAxYjQgMjg0IDJhIDFhIDE0IiwgIjEzYyA1OS4gNWQgMWEgMTQgOGUvMmYgWzk4PTEwY10xYzcgZWJbLzk4XSBmOSAxMTEgMmEgYjguIiwiMmEyIDFiYS4gIGRkIDNhIDI5MCAyNzQgMmEgMjMyLzI5OCAzYSAyOTYgMTYxIDE1IDFmYyAyNTEgMTAgMWQ5LCAyNTkgMzcgMmFhIDJhIDI1NSAyNjQuIikJCgojIDIwZCAxZTcgMjhjCSAgCjFlIDI4YygpOgoJMTYgMmNjLjEzKCc5OS4yOGMuOWInKToKCQkyOCAnOWInCgkyYyAyY2MuMTMoJzk5LjI4Yy5kMicpOgoJCTI4ICdkMicKCTJjIDJjYy4xMygnOTkuMjhjLjdmJyk6CgkJMjggJzdmJwoJMmMgMmNjLjEzKCc5OS4yOGMuMTYzJyk6CgkJMjggJzE2MycKCTJjIDJjYy4xMygnOTkuMjhjLjFiMScpOgoJCTI4ICcxYjEnCgkyYyAyY2MuMTMoJzk5LjI4Yy4yMDknKToKCQkyOCAnMjA5JwoJCiMgMTdmIDE3MwoxZSBkYygxOCk6CgkyZDEuYTUoIjUzLjYzICIrMjc5KDE4KSk7IDY0PTJkMS45ZCgxODgsImM0IDM3IDI2NyAyMyAxZGIgYWUiLCIyZiAxMzggMjMgMTFmIDZjPyIpCgkxNiA2NDoKCQk3OD1hOS4xMWIoMTQ0PTgzKS4xNTEoJzE4MycpOyA3OD0yY2MuMmE4KDc4KTsgCgkJNWU9MmNmLjE4My4xMzYoNzgsIi4uIiwiLi4iKTsgNWU9MmNmLjE4My4xZjMoNWUpOyAyZDEuYTUoIjUzLjYzIDVlPSIrNWUpOyBiNz1hZAoJCTE5OgoJCQkxNSAyY2QsIDFmLCAxNWQgMjEgMmNmLjY1KDVlLDFlMD00Zik6CgkJCQkxZls6XSA9IFtkIDE1IGQgMjEgMWYgMTYgZCBhOCAyMSAxMDFdCgkJCQkxNSAyNiAyMSAxNWQ6CgkJCQkJMTk6IDJjZi5iNSgyY2YuMTgzLjEzNigyY2QsMjYpKQoJCQkJCTI0MDoKCQkJCQkJMTYgMjYgYTggMjEgWyIxYjguZGIiLCIxN2QuZGIiLCIxOGQuZGIiLCIyY2MuYTUiXTogYjc9NGYKCQkJCQkJMmQxLmE1KCIxNzIgMTA0ICIrMmNkKyIgIisyNikKCQkJCTE1IDI2IDIxIDFmOgoJCQkJCTE5OiAyY2YuMjUwKDJjZi4xODMuMTM2KDJjZCwyNikpCgkJCQkJMjQwOgoJCQkJCQkxNiAyNiBhOCAyMSBbIjFjNCIsIjFiZSJdOiBiNz00ZgoJCQkJCQkyZDEuYTUoIjE3MiAxMDQgIisyY2QrIiAiKzI2KQoJCQkxNiBhOCBiNzogMmQxLmE1KCI1My42MyAyMjUgZmQgMTVkIGNiLCAzNyAxNWEgMTUwIGEgMTE1IDEyYyIpOyAyZDEuNDMoMTg4LCIyMWEgMTJiIDFiNSBmNyIsIjE4YyAxYjAgMjMgMTgwIDExNSBiMiIpCgkJCTJiOiAyZDEuYTUoIjUzLjYzIDFhNyAxNWQgZWUgY2IiKTsgMmQxLjQzKDE4OCwiMjFhIDEyYiAxYjUgZjciLCIxOGMgMWIwIDIzIDE4MCAxMTUgYjIiKQoJCTI0MDogMmQxLjQzKDE4OCwiMWVhIDQ4IiwiMWNlIDZjIDE5MiBhOCAxNDUgMTMxIik7IDVhIGYxOyAyZDEuYTUoZjEuMTc5KCkpOyAyZDEuYTUoIjUzLjYzIGViIGNiIikKCQkyZDEuMTA2KDk1PSIiLDE3ZT0iMmM1IDI5NSAyZiIsMTRjPWFkKQoJMmI6IDJkMS40MygxODgsIjFjZSA2YyIsIjE5MiBhOCAxNDUgMTMxIik7IDJkMS4xMDYoOTU9IiIsMTdlPSIyNzIiLDE0Yz1hZCkKCiMgMmM2IDJhYiAxOWEgMTVkCjFlIDEzNSgxMmEpOiAgCglmID0gMWM5KDEyYSwgJzJkNysyZDknKSAgCgkyY2EgPSBmLmZiKCkgIAoJMTQ3ID0gMmNhLjI3YSgnXDJiMFwyYzFcMmFjXDJjNCcpICMgMmI1IDE3NSAxMmQgYTQgMTk5ICAKCTE2ICgxNDcgPiAwKTogIAoJCTNmICIxOGEgMTNhIDFmYyAxYjkgIiArIDE3KDE0NyArIDIyKSsgIi4iICAKCQlmLjI3ZCgxNDcgKyAyMikgICAjIDI4MSAxNzUgJzJiNiAyYmMgMTc1IDEyZCBhNCAyMTInIAoJCWYuMWEyKCkgIAoJCWYuMTQoKSAgCgkyYjoKCQkxMWUKCQkjIDI0OSAyNDUsIDEzYSAxYjUgMTkxICAKCiMgMjliIDFhNCAxZjEKMWUgODgoMzUsIDM2KToKCSIiIgoJMjBhIDEyNiAxNzUgMmEgMmMzIDI0MSAyOTcgMWFjCgkiIiIKCTI4IDE0MigzNi4yM2QoKS4yMDAoJzI2ZCcpICsgMzUpLjE5MygpICAgCiAgIAojIDIwZCAxOAkgCjFlIGU0KCk6CgkJZDM9W10KCQljNT1iMC5hMVsyXQoJCTE2IDYwKGM1KT49MjoKCQkJCTE4PWIwLmExWzJdCgkJCQlhYz0xOC4xZjQoJz8nLCcnKQoJCQkJMTYgKDE4WzYwKDE4KS0xXT09Jy8nKToKCQkJCQkJMTg9MThbMDo2MCgxOCktMl0KCQkJCTczPWFjLjE3YSgnJicpCgkJCQlkMz17fQoJCQkJMTUgMmNiIDIxIDIzNyg2MCg3MykpOgoJCQkJCQk0NT17fQoJCQkJCQk0NT03M1syY2JdLjE3YSgnPScpCgkJCQkJCTE2ICg2MCg0NSkpPT0yOgoJCQkJCQkJCWQzWzQ1WzBdXT00NVsxXQoJCQkJCQkJCQoJCTI4IGQzCgoyZGEgPSA5Ny41OCgnJykKMmQ4ID0gOTcuNTgoJzExND0nKQoyZDkgPSA5Ny41OCgnJykKMmQ2ID0gOTcuNTgoJycpCgojIDI5ZCBhNAoxZSA1YigyNiwyZCwzMCwzOSw0YiwxZCk6CgkJMjljPWIwLmExWzBdKyI/MmQ9IiszMS41MSgyZCkrIiYzMD0iKzE3KDMwKSsiJjI2PSIrMzEuNTEoMjYpKyImMzk9IiszMS41MSgzOSkrIiY0Yj0iKzMxLjUxKDRiKSsiJjFkPSIrMzEuNTEoMWQpCgkJNzc9NGYKCQkxMTY9Yy4xYWUoMjYsIDE4ZT0iMTM0LmE3IiwgMTIzPTM5KQoJCTExNi4xZTIoIDFkMD0iMTE3IiwgMTc0PXsgIjI2MCI6IDI2LCAiMjg4IjogMWQgfSApCgkJMTE2LjE2ZSggIjE1YiIsIDRiICkKCQkxNiAzMD09NSA6CgkJCTc3PTU0LjhmKDE0Yj0xMTMoYjAuYTFbMV0pLDJkPTI5YyxmOD0xMTYsZmM9YWQpCgkJMmI6CgkJCTc3PTU0LjhmKDE0Yj0xMTMoYjAuYTFbMV0pLDJkPTI5YyxmOD0xMTYsZmM9NGYpCgkJMjggNzcKCgkJCgkJCQkJICAKMTg9ZTQoKQoyZD03YwoyNj03YwozMD03YwozOT03Ywo0Yj03YwoxZD03YwoKCjE5OgoJCTJkPTMxLjNkKDE4WyIyZCJdKQoyNDA6CgkJMTFlCjE5OgoJCTI2PTMxLjNkKDE4WyIyNiJdKQoyNDA6CgkJMTFlCjE5OgoJCTM5PTMxLjNkKDE4WyIzOSJdKQoyNDA6CgkJMTFlCjE5OgkJCgkJMzA9MTEzKDE4WyIzMCJdKQoyNDA6CgkJMTFlCjE5OgkJCgkJNGI9MzEuM2QoMThbIjRiIl0pCjI0MDoKCQkxMWUKMTk6CQkKCQkxZD0zMS4zZCgxOFsiMWQiXSkKMjQwOgoJCTExZQoKIyBiOSAyYSAxZjcgYmQgMWJkCjFlIDllKDgxLCAyZDQpOgoJIyAxNGEgODEgMWQwIDJkMCAxZGEgMjUzIDI5MiAyNTQgM2EgMjY4CgkxNiA4MToKCQk1NC4xNzcoMTEzKGIwLmExWzFdKSwgODEpCgkxNiA4MC5kZSgnMjhhLTFiZCcpPT0nMWE2JzoKCQkyY2MuMjYyKCIxOTQuMTcwKCVlNikiICUgODAuZGUoMmQ0KSApCgkJCgkJCjE2IDMwPT03YyAyMDIgMmQ9PTdjIDIwMiA2MCgyZCk8MTogMTg1KCkKMmMgMzA9PTI6IGU3KCkKMmMgMzA9PTM6IGM4KCkgCjJjIDMwPT00OiA4YigyZCkKMmMgMzA9PTU6IDE0ZCgyNiwyZCwxZCkKMmMgMzA9PTY6IGRjKDE4KQoyYyAzMD09NzogYTAoMmQpCjJjIDMwPT04OiAxMTAoKQoyYyAzMD09OTogMWE5KCkKMmMgMzA9PTExOiAxM2IoKQoKNTQuMTI0KDExMyhiMC5hMVsxXSkp")))(lambda a,b:b[int("0x"+a.group(1),16)],"0|1|2|3|4|5|6|7|8|9|a|B|xbmcgui|d|e|f|10|11|special|getCondVisibility|close|for|if|str|params|try|force|delete|icons|description|def|dirs|parsed|in|22|to|shutil|get|name|Delete|return|version|the|else|elif|url|rmtree|Kodi|mode|urllib|addonfolder|Cache|MAINTAINANCEICON|password|username|you|downloader_cache_path|iconimage|and|myplatform|Files|unquote_plus|tempfolder|print|unlink|channel4_cache_path|CLEARCACHEICON|message|FRESHSTARTICON|splitparams|yesno|build|found|cache|FANART|fanart|exists|iplayer_cache_path|home|True|bfriendlyname|quote_plus|addon_data|freshstart|xbmcplugin|busydialog|Paradox|killall|decodestring|unsuccessful|import|addDir|option|Please|xbmcPath|SafeConfigParser|len|xbmc_cache_path|temp_cache_path|main_list|yes_pressed|walk|CONTACTICON|versioninfo|INSTALLICON|itv_cache_path|ActivateWindow|wtf_cache_path|settings|self|setSetting|them|want|Count|downloader|pairsofparams|paradoxwizard|packages_cache_path|parser|ok|addonPath|plugin|wizard|existingfile|None|give|PURGEICON|windows|ADDON|content|profile|AddonID|BASEURL|versionfileexists|versionfile|get_setting|smf_hash|OPEN_URL|copytree|deletecachefiles|packages|CHECKURL|XBMC|addDirectoryItem|CONTROL_TEXTBOX|Close|theblackboxostv|addons|Wizard|action|video|base64|COLOR|system|paradox|android|WARNING|message_yes_no|setView|LocalAndRental|DeletePackages|argv|DialogProgress|from|directory|log|ART|png|not|xbmcaddon|file_count|CONTROL_LABEL|cleanedparams|False|your|seeing|sys|bversion|installation|atv2_cache_b|atv2_cache_a|remove|stop|failed|menu|Set|Packages|script|exit_handler|window|be|announce|killxbmc|yellow|Maintenance|successdata|Do|paramstring|setControls|versionpath|MAINTENANCE|Brought|extract|removed|AppleTV|cleanly|whatami|headers|suceess|heading|linux|param|open_settings_dialog|value|getControl|Extracting|dp|dlurl|text|db|FRESHSTART|Press|getSetting|Downloader|fileexists|USER_AGENT|e2|e3|get_params|shell|s|BUILDMENU|TextBoxes|iplayer_http_cache|WINDOW|NOT|common|installed|partially|lib|SendClick|traceback|movies|choice|F4|time|temp|complete|listitem|exit|continue|read|isFolder|user|json|RunAddon|requests|EXCLUDES|ECHO|DELETING|removing|maintainanceicon|add_item|register|TASKKILL|this|logopath|st_mtime|lime|symlinks|download|kodi|facebook|via|You|int|L2FkZG9ucy50eHQ|clean|liz|Video|FRESHSTARTBUILD|loads|red|Addon|sleep|freshstarticon|pass|default|Removed|iPlayer|urllib2|thumbnailImage|endOfDirectory|clearcacheicon|implementation|Authentication|Package|Install|zipFile|process|install|central|TextBox|private|changes|changed|Library|initctl|DefaultFolder|fixBadZipfile|join|ReplaceWindow|configuration|update|file|DELETEIVUEDB|was|MAIN|ignore|ConfigParser|adb|Applications|sha1|http|id|been|create|pos|atexit|module|set|handle|folder|WIZARD|exe|ATV2|have|getAddonInfo|off|org|mobile|re|dst|isfile|brsurl|Simple|now|Fanart_Image|Wait|files|tskill|Caches|item|button|DoStopScript|osx|ImportError|set_setting|contacticon|Downloading|application|maintenance|whatthefurk|installicon|Successfuly|ToggleDebug|setProperty|directories|SetViewMode|To|Error|start|infoLabels|of|repository|setContent|listbuilds|format_exc|split|Would|INDEX|MyVideos75|title|Fresh|begin|Other|thumbnails|path|initialize|SETUP|Check|enter|AddonTitle|StopScript|Trancating|downloaded|click|Textures13|iconImage|purgeicon|src|truncated|has|hexdigest|Container|available|Exception|Installed|cookielib|signature|zip|win|cfg|ADDONPATH|resources|req|STANDARD|U|truncate|stat|Password|am|true|User|Canceled|donation|burl|Archives|function|COMPLETE|ListItem|like|OK|atv2|database|__init__|it|is|Menu|save|Addons15|location|detected|sess|makedirs|view|userdata|sudo|setLabel|If|link|icon|Database|PACKAGES|need|DO|windowid|open|yeslabel|Platform|activate|KODI|Your|getbuild|type|Firstrun|FIRSTRUN|msg2|Anything|msg1|existing|Windows|Message|seconds|library|restore|contact|raspbmc|PARADOX|xbmcvfs|topdown|against|setInfo|Android|nolabel|request|setText|Current|Raspbmc|hashlib|Problem|another|already|Welcome|listdir|Control|iplayer|Hashing|account|abspath|replace|Contact|Changed|current|session|VERSION|manager|laction|at|uk|builds|remote|encode|var|or|Images|Net|bin|By|latest|recent|ios|Python|Action|Inital|Get|simple|co|Cancel|we|record|sha|cached|DBPATH|Amazon|bdlurl|ending|instid|The|Window|viewer|ITV|See|BBC|launch|python|orange|kwargs|before|All|submessage|rid|4oD|marker|UPDATE|net|compat|Manage|TNPATH|global|all|fresh|Sleep|copy2|devos|Build|clear|range|about|panel|bicon|Agent|DoSC2|lower|Clear|About|except|check|CACHE|bslug|Cydia|error|DoRA2|Force|Purge|raise|Sorry|Popup|class|Linux|added|false|rmdir|least|Start|shows|views|Apple|needs|purge|logos|until|10147|forum|recid|isdir|P|FORCE|Title|DoAW|executebuiltin|OSMC|logo|as|DoTD|wish|info|ICON|STOP|some|Id|utf8|used|Copy|im|Open|Done|CR|both|emsg|page|etit|DoCM|repr|find|most|able|seek|were|task|that|size|DoRA|DoRW|means|addon|args|TEMP|Plot|auth|auto|then|platform|mtit|What|Furk|hold|on|more|mmsg|HOME|Exit|Home|hash|Wake|init|DoSC|SMF|u|Add|Use|use|run|OSX|iOS|dialog|Yes|php|URL|500|translatePath|are|see|bad|x05|M|any|DoA|x50|art|ATV|one|atv|End|ZIP|WTF|itv|Zip|4od|DoE|end|ALT|can|dev|txt|x4b|dir|smf|x06|Now|Fix|an|us|No|data|i|xbmc|root|Dialog|os|so|plugintools|TO|My|viewType|th|F|r|T|b|N".split("|")))
特别是以下评论。
https://stackoverflow.com/a/33218455/1453147
我已经尝试在第一行设置第二个exec进行打印,但它只是在运行时一直给我一个错误
TypeError:不能在类字节对象上使用字符串模式
就像我说我可以完成解码的第一步,但匹配管道字符串的第二步就是回避我哈哈。
非常感谢任何帮助!
答案 0 :(得分:0)
正如回答this question中所述,要查看其外观,只需将exec
更改为print
编辑: 真的,这是输出
import xbmc, xbmcaddon, xbmcgui, xbmcplugin, os, base64, sys, xbmcvfs, atexit, requests
import shutil, urllib, urllib2, cookielib, re, extract, downloader, time, json, plugintools
from ConfigParser import SafeConfigParser
from addon.common.addon import Addon
from addon.common.net import Net
try:
from hashlib import sha1
except ImportError: # python 2.4 compat
from sha import sha as sha1
AddonID = 'plugin.video.paradoxwizard'
ADDON = xbmcaddon.Addon(id=AddonID)
VERSION = "1.0.3"
ADDONPATH = xbmc.translatePath(os.path.join('special://home/addons/' + AddonID))
AddonTitle = "Paradox Wizard"
USER_AGENT = 'Kodi/Paradox Wizard'
U = plugintools.get_setting('username')
P = plugintools.get_setting('password')
M = plugintools.get_setting('submessage')
dialog = xbmcgui.Dialog()
net = Net()
BASEURL = "http://theblackboxostv.co.uk/"
CHECKURL = BASEURL + "wizard-dev.php"
ART = xbmc.translatePath(os.path.join('special://home/addons/' + AddonID + '/resources/art/'))
DBPATH = xbmc.translatePath('special://database')
TNPATH = xbmc.translatePath('special://thumbnails');
EXCLUDES = ['plugin.video.paradoxwizard','script.module.addon.common','repository.paradox']
FANART = ART+'fanart.png'
ICON = ART+'icon.png'
#set some default icons
INSTALLICON = ART+'install.png'
MAINTAINANCEICON = ART+'maintenance.png'
CONTACTICON = ART+'contact.png'
CLEARCACHEICON = ART+'clear-cache.png'
FRESHSTARTICON = ART+'fresh-start.png'
PURGEICON = ART+'purge.png'
#Firstrun marker
FIRSTRUN = True
def DoE(e): xbmc.executebuiltin(e)
def DoAW(e): xbmc.executebuiltin("ActivateWindow(%s)" % str(e))
def DoRW(e): xbmc.executebuiltin("ReplaceWindow(%s)" % str(e))
def DoRA(e): xbmc.executebuiltin("RunAddon(%s)" % str(e))
def DoRA2(e,e2="1",e3=""): xbmc.executebuiltin('RunAddon(%s,"%s","%s")' % (str(e),str(e2),e3));
def DoA(a): xbmc.executebuiltin("Action(%s)" % str(a))
def DoCM(a): xbmc.executebuiltin("Control.Message(windowid=%s)" % (str(a)))
def DoSC(a): xbmc.executebuiltin("SendClick(%s)" % (str(a)))
def DoSC2(a,Id): xbmc.executebuiltin("SendClick(%s,%s)" % (str(a),str(Id)))
def DoStopScript(e): xbmc.executebuiltin("StopScript(%s)" % str(e))
def DoTD(): xbmc.executebuiltin("ToggleDebug")
def exit_handler():
print 'My application is ending!'
atexit.register(exit_handler)
# Anything that needs to be run before the script init's
def SETUP():
global INSTALLICON,MAINTAINANCEICON,CONTACTICON,CLEARCACHEICON,FRESHSTARTICON,PURGEICON,M
# See if we can update the logos used
# logopath = "http://paradoxwizard.co.uk/icon/paradox-wizard-icons.cfg"
# path = xbmc.translatePath(os.path.join('special://home/addons','packages/'))
# downloader.download(logopath, path + "/paradox-wizard-icons.cfg")
# icons = SafeConfigParser()
# icons.read(path + "/paradox-wizard-icons.cfg")
# INSTALLICON = str(icons.get('icons', 'installicon'))
# MAINTAINANCEICON = str(icons.get('icons', 'maintainanceicon'))
# CONTACTICON = str(icons.get('icons', 'contacticon'))
# CLEARCACHEICON = str(icons.get('icons', 'clearcacheicon'))
# FRESHSTARTICON = str(icons.get('icons', 'freshstarticon'))
# PURGEICON = str(icons.get('icons', 'purgeicon'))
# FANART = str(icons.get('icons', 'fanart'))
if U=="" and P=="" and M=="false":
msg1 = "Please register an account at http://theblackboxostv.co.uk and enter your forum username and password in the wizard settings panel to continue. "
msg2 = "Would you like to enter your username and password now?"
yes_pressed=plugintools.message_yes_no(AddonTitle + " - Authentication",msg1,msg2)
plugintools.set_setting('submessage','true')
if yes_pressed:
plugintools.open_settings_dialog()
INDEX()
# Inital Menu
def INDEX():
addDir('Install Paradox',BASEURL,2,INSTALLICON,FANART,'')
addDir('Maintenance',BASEURL,3,MAINTAINANCEICON,FANART,'')
addDir('Contact',BASEURL,8,CONTACTICON,FANART,'')
setView('movies', 'MAIN')
# Build Menu
def BUILDMENU():
data = OPEN_URL(CHECKURL + "?action=listbuilds&user=" + U + "&pass=" + smf_hash(P,U))
parsed = json.loads(data)
for build in parsed:
addDir(build['bfriendlyname'] + ' - ' + build['bversion'],build['bslug'],5,build['bicon'],FANART,'')
setView('movies', 'MAIN')
# Maintenance menu
def MAINTENANCE():
addDir('Clear Cache','url',4,CLEARCACHEICON,FANART,'')
addDir('Fresh Start','url',6,FRESHSTARTICON,FANART,'')
addDir('Purge Packages','url',7,PURGEICON,FANART,'')
setView('movies', 'MAIN')
# Popup script
def TextBoxes(heading,announce):
class TextBox():
WINDOW=10147
CONTROL_LABEL=1
CONTROL_TEXTBOX=5
def __init__(self,*args,**kwargs):
xbmc.executebuiltin("ActivateWindow(%d)" % (self.WINDOW, )) # activate the text viewer window
self.win=xbmcgui.Window(self.WINDOW) # get window
xbmc.sleep(500) # give window time to initialize
self.setControls()
def setControls(self):
self.win.getControl(self.CONTROL_LABEL).setLabel(heading) # set heading
try: f=open(announce); text=f.read()
except: text=announce
self.win.getControl(self.CONTROL_TEXTBOX).setText(str(text))
return
TextBox()
# About us text
def facebook():
TextBoxes(AddonTitle,'[COLOR=orange]Welcome to Paradox[/COLOR][CR][CR]')
# Install builds
def WIZARD(name,url,description):
xbmc.executebuiltin( "ActivateWindow(busydialog)" )
# Check the username and password set in the wizard
whatami = platform()
burl = CHECKURL + "?action=getbuild&devos=" + whatami + "&build=" + url + "&user=" + U + "&pass=" + smf_hash(P,U)
data = OPEN_URL(burl)
parsed = json.loads(data)
build = str(parsed.get('bfriendlyname'))
version = str(parsed.get('bversion'))
# See if we have a version file
versionpath = xbmc.translatePath(os.path.join('special://','home'))
versionfile = versionpath + 'version.txt'
versionfileexists = os.path.isfile(versionfile)
parser = SafeConfigParser()
parser.read(versionfile)
# Check the version of the build against the latest available version
if versionfileexists and parser.get('versioninfo', 'version') == version and parser.get('versioninfo', 'build') == build:
dialog = xbmcgui.Dialog()
xbmc.executebuiltin( "Dialog.Close(busydialog)" )
dialog.ok(AddonTitle, "You already have the most recent version","", str(parser.get('versioninfo', 'build')) + " " + str(parser.get('versioninfo', 'version')))
else:
path = xbmc.translatePath(os.path.join('special://home/addons','packages/'))
fileexists = os.path.isfile(path+url+version+'.zip')
existingfile = os.path.join(path+url+version+'.zip')
if fileexists:
lib = existingfile
dp = xbmcgui.DialogProgress()
xbmc.executebuiltin( "Dialog.Close(busydialog)" )
tempfolder = xbmc.translatePath(os.path.join('special://','home','temp'))
addonfolder = xbmc.translatePath(os.path.join('special://','home'))
time.sleep(2)
dp.create(AddonTitle,"Extracting "+ name, "Please Wait...")
extract.all(lib,addonfolder,dp)
# copytree(tempfolder, addonfolder)
# shutil.rmtree(tempfolder)
dp.close()
ADDON.setSetting(id="username", value="")
ADDON.setSetting(id="password", value="")
dialog = xbmcgui.Dialog()
dialog.ok(AddonTitle, name + " has been installed from your existing packages")
dialog.ok(AddonTitle, " ", "To save changes you now need to force close Kodi, Press OK to force close Kodi")
killxbmc()
else:
if parsed.get('auth'):
rid = parsed.get('recid')
dlurl = parsed.get('bdlurl')
if parsed.get('brsurl'):
dlurl = parsed.get('brsurl')
print dlurl
dp = xbmcgui.DialogProgress()
xbmc.executebuiltin( "Dialog.Close(busydialog)" )
# if whatami == "windows":
# FRESHSTARTBUILD(params)
dp.create(AddonTitle,"Downloading "+ parsed.get('bfriendlyname')+ " - " + parsed.get('bversion'), "Please Wait...")
lib = existingfile
# added to remove any partially downloaded files
try:
downloader.download(dlurl, lib, dp)
except Exception as e:
if str(e) == "Canceled":
os.remove(lib)
return
addonfolder = xbmc.translatePath(os.path.join('special://','home'))
tempfolder = xbmc.translatePath(os.path.join('special://','home','temp'))
time.sleep(2)
dp.update(0,"", "Extracting "+ parsed.get('bfriendlyname') +" Zip","Please Wait...")
extract.all(lib,addonfolder,dp)
# copytree(tempfolder, addonfolder)
# shutil.rmtree(tempfolder)
dp.close()
successdata = OPEN_URL(CHECKURL + "?action=installed&instid=" + str(rid) + "&user=" + U + "&pass=" + smf_hash(P,U))
suceess = json.loads(successdata)
dialog = xbmcgui.Dialog()
dialog.ok(AddonTitle, suceess.get('mtit'),"", suceess.get('mmsg'))
dialog.ok(AddonTitle, " ", "To save changes you now need to force close Kodi, Press OK to force close Kodi")
ADDON.setSetting(id="username", value="")
ADDON.setSetting(id="password", value="")
killxbmc()
else:
xbmc.executebuiltin( "Dialog.Close(busydialog)" )
dialog = xbmcgui.Dialog()
dialog.ok(AddonTitle, parsed.get('etit'),"", parsed.get('emsg'))
# Copy directories from one laction to another
def copytree(src, dst, symlinks=False, ignore=None):
if not os.path.exists(dst):
os.makedirs(dst)
for item in os.listdir(src):
s = os.path.join(src, item)
d = os.path.join(dst, item)
if os.path.isdir(s):
copytree(s, d, symlinks, ignore)
else:
if not os.path.exists(d) or os.stat(s).st_mtime - os.stat(d).st_mtime > 1:
shutil.copy2(s, d)
# Open URL (Changed to use urllib2.request)
def OPEN_URL(url):
headers = {
'User-Agent': USER_AGENT
}
sess = requests.session()
req = sess.get(url, headers=headers)
link = req.content
req.close()
return link
# Delete Packages
def DeletePackages(url):
print '############################################################ DELETING PACKAGES ###############################################################'
packages_cache_path = xbmc.translatePath(os.path.join('special://home/addons/packages', ''))
try:
for root, dirs, files in os.walk(packages_cache_path):
file_count = 0
file_count += len(files)
# Count files and give option to delete
if file_count > 0:
dialog = xbmcgui.Dialog()
if dialog.yesno("Delete Package Cache Files", str(file_count) + " files found", "Do you want to delete them?"):
for f in files:
os.unlink(os.path.join(root, f))
for d in dirs:
shutil.rmtree(os.path.join(root, d))
dialog = xbmcgui.Dialog()
dialog.ok(AddonTitle, "Packages Successfuly Removed", "[COLOR yellow]Brought To You By Paradox Wizard[/COLOR]")
except:
dialog = xbmcgui.Dialog()
dialog.ok(AddonTitle, "Sorry we were not able to remove Package Files", "[COLOR yellow]Brought To You By Paradox Wizard[/COLOR]")
# Delete Cache
def deletecachefiles(url):
print '############################################################ DELETING STANDARD CACHE ###############################################################'
xbmc_cache_path = os.path.join(xbmc.translatePath('special://home'), 'cache')
if os.path.exists(xbmc_cache_path)==True:
for root, dirs, files in os.walk(xbmc_cache_path):
file_count = 0
file_count += len(files)
# Count files and give option to delete
if file_count > 0:
dialog = xbmcgui.Dialog()
if dialog.yesno("Delete Cache Files", str(file_count) + " files found", "Do you want to delete them?"):
for f in files:
try:
os.unlink(os.path.join(root, f))
except:
pass
for d in dirs:
try:
shutil.rmtree(os.path.join(root, d))
except:
pass
else:
pass
if xbmc.getCondVisibility('system.platform.ATV2'):
atv2_cache_a = os.path.join('/private/var/mobile/Library/Caches/AppleTV/Video/', 'Other')
for root, dirs, files in os.walk(atv2_cache_a):
file_count = 0
file_count += len(files)
if file_count > 0:
dialog = xbmcgui.Dialog()
if dialog.yesno("Delete ATV2 Cache Files", str(file_count) + " files found in 'Other'", "Do you want to delete them?"):
for f in files:
os.unlink(os.path.join(root, f))
for d in dirs:
shutil.rmtree(os.path.join(root, d))
else:
pass
atv2_cache_b = os.path.join('/private/var/mobile/Library/Caches/AppleTV/Video/', 'LocalAndRental')
for root, dirs, files in os.walk(atv2_cache_b):
file_count = 0
file_count += len(files)
if file_count > 0:
dialog = xbmcgui.Dialog()
if dialog.yesno("Delete ATV2 Cache Files", str(file_count) + " files found in 'LocalAndRental'", "Do you want to delete them?"):
for f in files:
os.unlink(os.path.join(root, f))
for d in dirs:
shutil.rmtree(os.path.join(root, d))
else:
pass
# Set path to Cydia Archives cache files
# Set path to What th Furk cache files
wtf_cache_path = os.path.join(xbmc.translatePath('special://profile/addon_data/plugin.video.whatthefurk/cache'), '')
if os.path.exists(wtf_cache_path)==True:
for root, dirs, files in os.walk(wtf_cache_path):
file_count = 0
file_count += len(files)
# Count files and give option to delete
if file_count > 0:
dialog = xbmcgui.Dialog()
if dialog.yesno("Delete WTF Cache Files", str(file_count) + " files found", "Do you want to delete them?"):
for f in files:
os.unlink(os.path.join(root, f))
for d in dirs:
shutil.rmtree(os.path.join(root, d))
else:
pass
# Set path to 4oD cache files
channel4_cache_path= os.path.join(xbmc.translatePath('special://profile/addon_data/plugin.video.4od/cache'), '')
if os.path.exists(channel4_cache_path)==True:
for root, dirs, files in os.walk(channel4_cache_path):
file_count = 0
file_count += len(files)
# Count files and give option to delete
if file_count > 0:
dialog = xbmcgui.Dialog()
if dialog.yesno("Delete 4oD Cache Files", str(file_count) + " files found", "Do you want to delete them?"):
for f in files:
os.unlink(os.path.join(root, f))
for d in dirs:
shutil.rmtree(os.path.join(root, d))
else:
pass
# Set path to BBC iPlayer cache files
iplayer_cache_path= os.path.join(xbmc.translatePath('special://profile/addon_data/plugin.video.iplayer/iplayer_http_cache'), '')
if os.path.exists(iplayer_cache_path)==True:
for root, dirs, files in os.walk(iplayer_cache_path):
file_count = 0
file_count += len(files)
# Count files and give option to delete
if file_count > 0:
dialog = xbmcgui.Dialog()
if dialog.yesno("Delete BBC iPlayer Cache Files", str(file_count) + " files found", "Do you want to delete them?"):
for f in files:
os.unlink(os.path.join(root, f))
for d in dirs:
shutil.rmtree(os.path.join(root, d))
else:
pass
# Set path to Simple Downloader cache files
downloader_cache_path = os.path.join(xbmc.translatePath('special://profile/addon_data/script.module.simple.downloader'), '')
if os.path.exists(downloader_cache_path)==True:
for root, dirs, files in os.walk(downloader_cache_path):
file_count = 0
file_count += len(files)
# Count files and give option to delete
if file_count > 0:
dialog = xbmcgui.Dialog()
if dialog.yesno("Delete Simple Downloader Cache Files", str(file_count) + " files found", "Do you want to delete them?"):
for f in files:
os.unlink(os.path.join(root, f))
for d in dirs:
shutil.rmtree(os.path.join(root, d))
else:
pass
# Set path to ITV cache files
itv_cache_path = os.path.join(xbmc.translatePath('special://profile/addon_data/plugin.video.itv/Images'), '')
if os.path.exists(itv_cache_path)==True:
for root, dirs, files in os.walk(itv_cache_path):
file_count = 0
file_count += len(files)
# Count files and give option to delete
if file_count > 0:
dialog = xbmcgui.Dialog()
if dialog.yesno("Delete ITV Cache Files", str(file_count) + " files found", "Do you want to delete them?"):
for f in files:
os.unlink(os.path.join(root, f))
for d in dirs:
shutil.rmtree(os.path.join(root, d))
else:
pass
# Set path to temp cache files
temp_cache_path = os.path.join(xbmc.translatePath('special://home/temp'), '')
if os.path.exists(temp_cache_path)==True:
for root, dirs, files in os.walk(temp_cache_path):
file_count = 0
file_count += len(files)
# Count files and give option to delete
if file_count > 0:
dialog = xbmcgui.Dialog()
if dialog.yesno("Delete TEMP dir Cache Files", str(file_count) + " files found", "Do you want to delete them?"):
for f in files:
os.unlink(os.path.join(root, f))
for d in dirs:
shutil.rmtree(os.path.join(root, d))
else:
pass
dialog = xbmcgui.Dialog()
dialog.ok(AddonTitle, " All Cache Files Removed", "[COLOR yellow]Brought To You By Paradox Wizard[/COLOR]")
# Delete cached files
def killxbmc():
choice = xbmcgui.Dialog().yesno('Force Close Kodi', 'You are about to close Kodi', 'Would you like to continue?', nolabel='No, Cancel',yeslabel='Yes, Close')
if choice == 0:
return
elif choice == 1:
pass
myplatform = platform()
print "Platform: " + str(myplatform)
if myplatform == 'osx': # OSX
print "############ try osx force close #################"
try: os.system('killall -9 XBMC')
except: pass
try: os.system('killall -9 Kodi')
except: pass
dialog.ok("[COLOR=red][b]WARNING !!![/COLOR][/b]", "If you\'re seeing this message it means the force close", "was unsuccessful. Please force close XBMC/Kodi [COLOR=lime]DO NOT[/COLOR] exit cleanly via the menu.",'')
elif myplatform == 'linux': #Linux
print "############ try linux force close #################"
try: os.system('killall XBMC')
except: pass
try: os.system('killall Kodi')
except: pass
try: os.system('killall -9 xbmc.bin')
except: pass
try: os.system('killall -9 kodi.bin')
except: pass
dialog.ok("[COLOR=red][b]WARNING !!![/COLOR][/b]", "If you\'re seeing this message it means the force close", "was unsuccessful. Please force close XBMC/Kodi [COLOR=lime]DO NOT[/COLOR] exit cleanly via the menu.",'')
elif myplatform == 'android': # Android
print "############ try android force close #################"
try: os.system('adb shell am force-stop org.xbmc.kodi')
except: pass
try: os.system('adb shell am force-stop org.kodi')
except: pass
try: os.system('adb shell am force-stop org.xbmc.xbmc')
except: pass
try: os.system('adb shell am force-stop org.xbmc')
except: pass
dialog.ok("[COLOR=yellow][b]TO COMPLETE PARADOX UPDATE[/COLOR][/b]", "Press the HOME button on your remote and [COLOR=red][b]FORCE STOP[/COLOR][/b] KODI via the Manage Installed Applications menu in settings on your Amazon home page then re-launch KODI")
elif myplatform == 'windows': # Windows
print "############ try windows force close #################"
try:
os.system('@ECHO off')
os.system('tskill XBMC.exe')
except: pass
try:
os.system('@ECHO off')
os.system('tskill Kodi.exe')
except: pass
try:
os.system('@ECHO off')
os.system('TASKKILL /im Kodi.exe /f')
except: pass
try:
os.system('@ECHO off')
os.system('TASKKILL /im XBMC.exe /f')
except: pass
dialog.ok("[COLOR=red][b]WARNING !!![/COLOR][/b]", "If you\'re seeing this message it means the force close", "was unsuccessful. Please force close XBMC/Kodi [COLOR=lime]DO NOT[/COLOR] exit cleanly via the menu.","Use task manager and NOT ALT F4")
else: #ATV
print "############ try atv force close #################"
try: os.system('killall AppleTV')
except: pass
print "############ try raspbmc force close #################" #OSMC / Raspbmc
try: os.system('sudo initctl stop kodi')
except: pass
try: os.system('sudo initctl stop xbmc')
except: pass
dialog.ok("[COLOR=red][b]WARNING !!![/COLOR][/b]", "If you\'re seeing this message it means the force close", "was unsuccessful. Please force close XBMC/Kodi [COLOR=lime]DO NOT[/COLOR] exit via the menu.","iOS detected. Press and hold both the Sleep/Wake and Home button for at least 10 seconds, until you see the Apple logo.")
# Get Current platform
def platform():
if xbmc.getCondVisibility('system.platform.android'):
return 'android'
elif xbmc.getCondVisibility('system.platform.linux'):
return 'linux'
elif xbmc.getCondVisibility('system.platform.windows'):
return 'windows'
elif xbmc.getCondVisibility('system.platform.osx'):
return 'osx'
elif xbmc.getCondVisibility('system.platform.atv2'):
return 'atv2'
elif xbmc.getCondVisibility('system.platform.ios'):
return 'ios'
# Fresh start
def FRESHSTART(params):
plugintools.log("freshstart.main_list "+repr(params)); yes_pressed=plugintools.message_yes_no(AddonTitle,"Do you wish to restore your","Kodi configuration to default settings?")
if yes_pressed:
addonPath=xbmcaddon.Addon(id=AddonID).getAddonInfo('path'); addonPath=xbmc.translatePath(addonPath);
xbmcPath=os.path.join(addonPath,"..",".."); xbmcPath=os.path.abspath(xbmcPath); plugintools.log("freshstart.main_list xbmcPath="+xbmcPath); failed=False
try:
for root, dirs, files in os.walk(xbmcPath,topdown=True):
dirs[:] = [d for d in dirs if d not in EXCLUDES]
for name in files:
try: os.remove(os.path.join(root,name))
except:
if name not in ["Addons15.db","MyVideos75.db","Textures13.db","xbmc.log"]: failed=True
plugintools.log("Error removing "+root+" "+name)
for name in dirs:
try: os.rmdir(os.path.join(root,name))
except:
if name not in ["Database","userdata"]: failed=True
plugintools.log("Error removing "+root+" "+name)
if not failed: plugintools.log("freshstart.main_list All user files removed, you now have a clean install"); plugintools.message(AddonTitle,"The process is complete","click OK to begin clean installation")
else: plugintools.log("freshstart.main_list User files partially removed"); plugintools.message(AddonTitle,"The process is complete","click OK to begin clean installation")
except: plugintools.message(AddonTitle,"Problem found","Your settings has not been changed"); import traceback; plugintools.log(traceback.format_exc()); plugintools.log("freshstart.main_list NOT removed")
plugintools.add_item(action="",title="Now Exit Kodi",folder=False)
else: plugintools.message(AddonTitle,"Your settings","has not been changed"); plugintools.add_item(action="",title="Done",folder=False)
# Fix bad zip files
def fixBadZipfile(zipFile):
f = open(zipFile, 'r+b')
data = f.read()
pos = data.find('\x50\x4b\x05\x06') # End of central directory signature
if (pos > 0):
print "Trancating file at location " + str(pos + 22)+ "."
f.seek(pos + 22) # size of 'ZIP end of central directory record'
f.truncate()
f.close()
else:
pass
# raise error, file is truncated
# SMF Password Hashing
def smf_hash(password, username):
"""
Python implementation of the smf check hash function
"""
return sha1(username.lower().encode('utf8') + password).hexdigest()
# Get params
def get_params():
param=[]
paramstring=sys.argv[2]
if len(paramstring)>=2:
params=sys.argv[2]
cleanedparams=params.replace('?','')
if (params[len(params)-1]=='/'):
params=params[0:len(params)-2]
pairsofparams=cleanedparams.split('&')
param={}
for i in range(len(pairsofparams)):
splitparams={}
splitparams=pairsofparams[i].split('=')
if (len(splitparams))==2:
param[splitparams[0]]=splitparams[1]
return param
N = base64.decodestring('')
T = base64.decodestring('L2FkZG9ucy50eHQ=')
b = base64.decodestring('')
F = base64.decodestring('')
# Add directory
def addDir(name,url,mode,iconimage,fanart,description):
u=sys.argv[0]+"?url="+urllib.quote_plus(url)+"&mode="+str(mode)+"&name="+urllib.quote_plus(name)+"&iconimage="+urllib.quote_plus(iconimage)+"&fanart="+urllib.quote_plus(fanart)+"&description="+urllib.quote_plus(description)
ok=True
liz=xbmcgui.ListItem(name, iconImage="DefaultFolder.png", thumbnailImage=iconimage)
liz.setInfo( type="Video", infoLabels={ "Title": name, "Plot": description } )
liz.setProperty( "Fanart_Image", fanart )
if mode==5 :
ok=xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=liz,isFolder=False)
else:
ok=xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=liz,isFolder=True)
return ok
params=get_params()
url=None
name=None
mode=None
iconimage=None
fanart=None
description=None
try:
url=urllib.unquote_plus(params["url"])
except:
pass
try:
name=urllib.unquote_plus(params["name"])
except:
pass
try:
iconimage=urllib.unquote_plus(params["iconimage"])
except:
pass
try:
mode=int(params["mode"])
except:
pass
try:
fanart=urllib.unquote_plus(params["fanart"])
except:
pass
try:
description=urllib.unquote_plus(params["description"])
except:
pass
# Set the current window view
def setView(content, viewType):
# set content type so library shows more views and info
if content:
xbmcplugin.setContent(int(sys.argv[1]), content)
if ADDON.getSetting('auto-view')=='true':
xbmc.executebuiltin("Container.SetViewMode(%s)" % ADDON.getSetting(viewType) )
if mode==None or url==None or len(url)<1: SETUP()
elif mode==2: BUILDMENU()
elif mode==3: MAINTENANCE()
elif mode==4: deletecachefiles(url)
elif mode==5: WIZARD(name,url,description)
elif mode==6: FRESHSTART(params)
elif mode==7: DeletePackages(url)
elif mode==8: facebook()
elif mode==9: donation()
elif mode==11: DELETEIVUEDB()
xbmcplugin.endOfDirectory(int(sys.argv[1]))
答案 1 :(得分:0)
我成功解码了这个&#39;使用python 2.5版进行混淆,python 3.0及更高版本接收了主要的bug修复实习生,使得无法解码这个特定的base64混淆。