FileManager 1.2.1 OTRS GmbH http://otrs.org/ GNU GENERAL PUBLIC LICENSE Version 2, June 1991 upgrade to 2.1.x renamed filemanager picture fixed bug with empty directory spaces added nb_NO translation, thanks to Espen Stefansen! added check if root exists added xml config file fixed css added change log New package A web file system manager with download/upload option. Ein Web Datei Manager mit download/upload moeglichkeit. 2.1.x 2006-10-17 22:39:41 yourhost.example.com PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8b3Ryc19jb25maWcgdmVyc2lvbj0iMS4wIiBpbml0PSJBcHBsaWNhdGlvbiI+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRGaWxlTWFuYWdlciIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkFsbCBwYXJhbWV0ZXJzIGZvciB0aGUgQWdlbnRGaWxlTWFuYWdlciBvYmplY3QgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QWxsZSBQYXJhbWV0ZXIgZGVzIEFnZW50RmlsZU1hbmFnZXItT2JqZWt0cyBpbm5lcmhhbGIgZGVzIEFnZW50LUludGVyZmFjZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RmlsZU1hbmFnZXI8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5XZWIgRmlsZSBNYW5hZ2VyPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkZpbGVNYW5hZ2VyPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPFRpdGxlPjwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5BIHdlYmJhc2VkIGZpbGUgbWFuYWdlcjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+RmlsZU1hbmFnZXI8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+TWVudTwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+SXRlbUFyZWE8L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxJbWFnZT5maWxlbWFuYWdlci5wbmc8L0ltYWdlPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1BZ2VudEZpbGVNYW5hZ2VyPC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+RmlsZU1hbmFnZXI8L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5PmY8L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz44MTAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRmlsZU1hbmFnZXI6OlJvb3QiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgcm9vdCBkaXJlY3RvcnkgZm9yIHRoZSBmaWxlIG1hbmFnZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPnJvb3QtVmVyemVpY2huaXMgZvxyIGRlbiBGaWxlLU1hbmFnZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RmlsZU1hbmFnZXI8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj4vaG9tZS9vdHJzLXNoYXJlLzwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZpbGVNYW5hZ2VyOjpUcmFzaCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRyYXNoIGRpcmVjdG9yeSBmb3IgdGhlIGZpbGUgbWFuYWdlci4gQWxsIGRlbGV0ZWQgZmlsZXMgb3IgZm9sZGVycyB3aWxsIGJlIG1vdmVkIHRvIHRoaXMgZGlyZWN0b3J5LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5WZXJ6ZWljaG5pcyBm/HIgZGVuIE38bGxlaW1lciBpbm5lcmhhbGIgZGVzIEZpbGUtTWFuYWdlcnMuIEFsbGUgZ2Vs9nNjaHRlbiBEYXRlaWVuIG9kZXIgT3JkbmVyIHdlcmRlbiBpbiBkaWVzZXMgVmVyemVpY2huaXMgdmVyc2Nob2Jlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GaWxlTWFuYWdlcjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPiZsdDtPVFJTX0ZpbGVNYW5hZ2VyOjpSb290Jmd0O1RyYXNoLzwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZpbGVNYW5hZ2VyOjpSZWFkQWNjZXNzTWFwIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2V0IHRoZSByZWFkIHBlcm1pc3Npb25zIGZvciBmb2xkZXJzIGFuZCBmaWxlcyBmb3IgdGhlIGRpZmZlcmVudCBmb2xkZXJzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5GZXN0bGVnZW4gZGVzIExlc2V6dWdyaWZmcyBm/HIgRGF0ZWllbiBvZGVyIFZlcnplaWNobmlzc2UgZGVyIGVpbnplbG5lbiBPcmRuZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RmlsZU1hbmFnZXI8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ii9UcmFzaCI+YWRtaW48L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGaWxlTWFuYWdlcjo6RGVsZXRlQWNjZXNzTWFwIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2V0IHRoZSBkZWxldGUgYWNjZXNzIGZvciBmb2xkZXJzIG9yIGZpbGVzIGZvciB0aGUgZGlmZmVyZW50IGZvbGRlcnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZlc3RsZWdlbiBkZXIgTPZzY2hlcmxhdWJuaXMgZvxyIERhdGVpZW4gb2RlciBWZXJ6ZWljaG5pc3NlIGb8ciBkaWUgZWluemVsbmVuIE9yZG5lci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GaWxlTWFuYWdlcjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iL1RyYXNoIj5hZG1pbjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZpbGVNYW5hZ2VyOjpDcmVhdGVBY2Nlc3NNYXAiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5TZXQgY3JlYXRlIHBlcm1pc3Npb25zIGZvciBmaWxlcyBvciBmb2xkZXJzIGZvciB0aGUgZGlmZmVyZW50IGZvbGRlcnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZlc3RsZWdlbiBkZXIgUmVjaHRlIHp1bSBFcnN0ZWxsZW4gdm9uIERhdGVpZW4gb2RlciBWZXJ6ZWljaG5pc3NlbiBm/HIgZGllIHZlcnNjaGllZGVuZW4gT3JkbmVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZpbGVNYW5hZ2VyPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIvVHJhc2giPmFkbWluPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgo8L290cnNfY29uZmlnPgo= CiAgICAjIG1vZHVsZSByZWcgYW5kIG5hdiBiYXIKICAgICRTZWxmLT57J0Zyb250ZW5kOjpNb2R1bGUnfS0+eydBZ2VudEZpbGVNYW5hZ2VyJ30gPSB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1dlYiBGaWxlIE1hbmFnZXInLAogICAgICAgIE5hdkJhck5hbWUgPT4gJ0ZpbGVNYW5hZ2VyJywKICAgICAgICBOYXZCYXIgPT4gWwogICAgICAgICAgewogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQSB3ZWIgZmlsZSBtYW5hZ2VyJywKICAgICAgICAgICAgTmFtZSA9PiAnRmlsZU1hbmFnZXInLAogICAgICAgICAgICBUeXBlID0+ICdNZW51JywKICAgICAgICAgICAgQmxvY2sgPT4gJ0l0ZW1BcmVhJywKICAgICAgICAgICAgSW1hZ2UgPT4gJ2ZpbGVtYW5hZ2VyLnBuZycsCiAgICAgICAgICAgIExpbmsgPT4gJ0FjdGlvbj1BZ2VudEZpbGVNYW5hZ2VyJywKICAgICAgICAgICAgTmF2QmFyID0+ICdGaWxlTWFuYWdlcicsCiAgICAgICAgICAgIFByaW8gPT4gODEwMCwKICAgICAgICAgICAgQWNjZXNzS2V5ID0+ICdmJywKICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgIH07CgogICAgIyBicm93c2UvZG93bmxvYWQgcm9vdCBkaXJlY3RvcnkKICAgICRTZWxmLT57IkZpbGVNYW5hZ2VyOjpSb290In0gPSAnL2hvbWUvJzsKCiAgICAjIHRyYXNoIGRpcmVjdG9yeQogICAgJFNlbGYtPnsiRmlsZU1hbmFnZXI6OlRyYXNoIn0gPSAkU2VsZi0+eyJGaWxlTWFuYWdlcjo6Um9vdCJ9LiIvVHJhc2gvIjsKCiAgICAjIHBlcm1pc3Npb24gY29uZmlnIChkZWZhdWx0IGlzIHJ3IGFsbCBmb3IgdXNlcnMpIQogICAgJFNlbGYtPnsiRmlsZU1hbmFnZXI6OlJlYWRBY2Nlc3NNYXAifSA9IHsKIyAgICAgICAgJy9UcmFzaCcgPT4gJ2FkbWluJywKIyAgICAgICAgJy9leHBvcnQnID0+ICd1c2VycycsCiMgICAgICAgICcvJyA9PiAndXNlcnMnLAojICAgICAgICAnLzAxNDc0OTczODAnID0+ICd1c2VycycsCiAgICB9OwogICAgJFNlbGYtPnsiRmlsZU1hbmFnZXI6OkRlbGV0ZUFjY2Vzc01hcCJ9ID0gewogICAgICAgICcvVHJhc2gnID0+ICdhZG1pbicsCiMgICAgICAgICcvbW1tMScgPT4gJ3VzZXJzMicsCiMgICAgICAgICcvJyA9PiAndXNlcnMnLAojICAgICAgICAnLzAxNDc0OTczODAvJyA9PiAndXNlcnMnLAogICAgfTsKICAgICRTZWxmLT57IkZpbGVNYW5hZ2VyOjpDcmVhdGVBY2Nlc3NNYXAifSA9IHsKICAgICAgICAnL1RyYXNoJyA9PiAnYWRtaW4nLAojICAgICAgICAnLycgPT4gJ3VzZXJzJywKIyAgICAgICAgJy9tbW0xJyA9PiAndXNlcnMyJywKIyAgICAgICAgJy8wMTQ3NDk3MzgwLycgPT4gJ3VzZXJzJwogICAgfTsKCgo= cGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpkZV9BZ2VudEZpbGVNYW5hZ2VyOwoKdXNlIHN0cmljdDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjIgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjICQkU1RBUlQkJAoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBEaXJlY3RvcnknfSA9ICdWZXJ6ZWljaG5pcyBlcnN0ZWxsZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlsZSBVcGxvYWQnfSA9ICdEYXRlaSBVcGxvYWQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlJ30gPSAnRXJzdGVsbGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwJ30gPSAnQXVmJzsKCiAgICAjICQkU1RPUCQkCn0KMTsKCg== cGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpuYl9OT19BZ2VudEZpbGVNYW5hZ2VyOwoKdXNlIHN0cmljdDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjEgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjICQkU1RBUlQkJAoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBEaXJlY3RvcnknfSA9ICdMYWcgbWFwcGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlsZSBVcGxvYWQnfSA9ICdMYXN0IG9wcCBmaWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlJ30gPSAnT3BwcmV0dCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcCd9ID0gJ09wcCc7CgogICAgIyAkJFNUT1AkJAp9CjE7Cgo= IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50RmlsZU1hbmFnZXIgLSBhIGZpbGUgZG93bmxvYWQgbWFuYWdlcgojIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudEZpbGVNYW5hZ2VyLnBtLHYgMS43IDIwMDYvMTAvMTcgMjA6Mzk6NTYgbWFydGluIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50RmlsZU1hbmFnZXI7Cgp1c2Ugc3RyaWN0Owp1c2UgRmlsZTo6R2xvYiAnOmdsb2InOwp1c2UgRmlsZTo6Q29weTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjcgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzICgkU2VsZiwgJFR5cGUpOwoKICAgIGZvcmVhY2ggKGtleXMgJVBhcmFtKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99OwogICAgfQogICAgIyBjaGVjayBuZWVkZWQgT3BqZWN0cwogICAgZm9yZWFjaCAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QpKSB7CiAgICAgICAgZGllICJHb3Qgbm8gJF8hIiBpZiAoISRTZWxmLT57JF99KTsKICAgIH0KICAgICMgY29uZmlnIG9wdGlvbnMKICAgICRTZWxmLT57RGF0YURpcn0gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRmlsZU1hbmFnZXI6OlJvb3QnKS4iLyIgfHwgJy9ob21lLzEyMy8nOwogICAgJFNlbGYtPntUcmFzaERpcn0gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRmlsZU1hbmFnZXI6OlRyYXNoJykgfHwgJFNlbGYtPntEYXRhRGlyfS4nL1RyYXNoLyc7CgogICAgJFNlbGYtPntSZWFkQWNjZXNzTWFwfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGaWxlTWFuYWdlcjo6UmVhZEFjY2Vzc01hcCcpIHx8IHsgJy8nID0+ICd1c2VycycgfTsKICAgICRTZWxmLT57RGVsZXRlQWNjZXNzTWFwfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGaWxlTWFuYWdlcjo6RGVsZXRlQWNjZXNzTWFwJykgfHwgeyAnLycgPT4gJ3VzZXJzJyB9OwogICAgJFNlbGYtPntDcmVhdGVBY2Nlc3NNYXB9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZpbGVNYW5hZ2VyOjpDcmVhdGVBY2Nlc3NNYXAnKSB8fCB7ICcvJyA9PiAndXNlcnMnIH07CgogICAgIyBwYXJhbSBpbml0LgogICAgJFNlbGYtPntMb2NhdGlvbn0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ0xvY2F0aW9uJykgfHwgJy8nOwogICAgJFNlbGYtPntOZXdEaXJ9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdOZXdEaXInKSB8fCAnJzsKICAgICRTZWxmLT57Um1EaXJ9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdSbURpcicpIHx8ICcnOwogICAgJFNlbGYtPntSbUZpbGV9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdSbUZpbGUnKSB8fCAnJzsKCiAgICAjIGZpbGUgYW5kIGRpcmVjdG9yeSBjbGVhbnVwCiAgICBmb3JlYWNoICgwLi4yKSB7CiAgICAgICAgZm9yZWFjaCAocXcoRGF0YURpciBUcmFzaERpciBMb2NhdGlvbiBOZXdEaXIgUm1GaWxlKSkgewogICAgICAgICAgICAkU2VsZi0+eyRffSA9fiBzL1wuXC5cLy8vZzsKICAgICAgICAgICAgJFNlbGYtPnskX30gPX4gcy9cL1wvL1wvL2c7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFN1YkNvdW50IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICRDb3VudCA9IDA7CiAgICBteSBATGlzdCA9IGdsb2IoIiRQYXJhbXtEaXJlY3Rvcnl9LyoiKTsKICAgIGZvcmVhY2ggbXkgJEZpbGUgKEBMaXN0KSB7CiAgICAgICAgJENvdW50Kys7CiAgICB9CiAgICByZXR1cm4gJENvdW50Owp9CgpzdWIgQ2hlY2tQZXJtaXNzaW9uIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAwOwogICAgbXkgJERpcmVjdG9yeUZvdW5kSW5QZXJtaXNzaW9uVGFibGUgPSAwOwogICAgaWYgKCRTZWxmLT57JFBhcmFte1R5cGV9fSAmJiByZWYoJFNlbGYtPnskUGFyYW17VHlwZX19KSBlcSAnSEFTSCcpIHsKICAgICAgICBmb3JlYWNoICBteSAkRGlyIChrZXlzICV7JFNlbGYtPnskUGFyYW17VHlwZX19fSkgewogICAgICAgICAgICBpZiAoJFBhcmFte0xvY2F0aW9ufSA9fiAvXiREaXIvICYmICRTZWxmLT57IlVzZXJJc0dyb3VwWyRTZWxmLT57JFBhcmFte1R5cGV9fS0+eyREaXJ9XSJ9ICYmICRTZWxmLT57IlVzZXJJc0dyb3VwWyRTZWxmLT57JFBhcmFte1R5cGV9fS0+eyREaXJ9XSJ9IGVxICdZZXMnKSB7CiMgICAgICAgICAgICAgICAgcHJpbnQgU1RERVJSICJBY2Nlc3MgJFBhcmFte1R5cGV9IHRvICREaXJcbiI7CiAgICAgICAgICAgICAgICAkQWNjZXNzID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJFBhcmFte0xvY2F0aW9ufSA9fiAvXiREaXIvKSB7CiAgICAgICAgICAgICAgICAkRGlyZWN0b3J5Rm91bmRJblBlcm1pc3Npb25UYWJsZSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBpZiAoISREaXJlY3RvcnlGb3VuZEluUGVybWlzc2lvblRhYmxlKSB7CiMgICAgICAgIHByaW50IFNUREVSUiAiTm8gZ3JvdXAgZm91bmQgZm9yICRQYXJhbXtUeXBlfSBiYXNlIGRpciAkUGFyYW17TG9jYXRpb259XG4iOwogICAgICAgIHJldHVybiAxOwogICAgfQogICAgaWYgKCEkQWNjZXNzKSB7CiMgICAgICAgIHByaW50IFNUREVSUiAiTm8gYWNjZXNzICRQYXJhbXtUeXBlfSB0byAkUGFyYW17TG9jYXRpb259XG4iOwogICAgfQogICAgcmV0dXJuICRBY2Nlc3M7Cn0KCnN1YiBSdW4gewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayByb290IGRpcmVjdG9yeQogICAgaWYgKCEgLWUgJFNlbGYtPntEYXRhRGlyfSkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJGaWxlTWFuYWdlciBSb290IGRpcmVjdG9yeSBkb2Vzbid0IGV4aXN0OiAkU2VsZi0+e0RhdGFEaXJ9LCBwbGVhc2UgY2hlY2sgeW91ciBjb25maWcgc2V0dGluZyEiLAogICAgICAgICk7CiAgICB9CiAgICAjIGNyZWF0ZSBwZXJtaXNzaW9ucwogICAgJFBhcmFte0NyZWF0ZUFjY2Vzc01hcH0gPSAkU2VsZi0+Q2hlY2tQZXJtaXNzaW9uKFR5cGUgPT4gJ0NyZWF0ZUFjY2Vzc01hcCcsIExvY2F0aW9uID0+ICRTZWxmLT57TG9jYXRpb259KTsKCiAgICAjIHJlbW92ZSBmaWxlCiAgICBpZiAoJFNlbGYtPntSbUZpbGV9ICYmICRTZWxmLT57TG9jYXRpb259ICYmICRTZWxmLT5DaGVja1Blcm1pc3Npb24oVHlwZSA9PiAnRGVsZXRlQWNjZXNzTWFwJywgTG9jYXRpb24gPT4gJFNlbGYtPntSbUZpbGV9KSkgewojcHJpbnQgU1RERVJSICJ1bmxpbmsgJFNlbGYtPntEYXRhRGlyfS4nLycuJFNlbGYtPntSbUZpbGV9XG4iOwogICAgICAgIG15ICRGaWxlID0gJFNlbGYtPntEYXRhRGlyfS4kU2VsZi0+e1JtRmlsZX07CiAgICAgICAgJEZpbGUgPX4gcy9cL1wvL1wvL2c7CiAgICAgICAgaWYgKCRGaWxlICF+IC9eJFNlbGYtPntUcmFzaERpcn0vKSB7CiAgICAgICAgICAgIGlmICghIC1lICRTZWxmLT57VHJhc2hEaXJ9KSB7CiAgICAgICAgICAgICAgICBpZiAoIW1rZGlyICRTZWxmLT57VHJhc2hEaXJ9KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkNhbid0IGNyZWF0ZSB0cmFzaCBkaXJlY3RvcnkgJFNlbGYtPntUcmFzaERpcn06ICQhIiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICROZXdGaWxlID0gdGltZSgpLiRTZWxmLT57Um1GaWxlfTsKICAgICAgICAgICAgJE5ld0ZpbGUgPX4gcy8oXFx8XC8pL19fL2c7CiAgICAgICAgICAgIGlmICghbW92ZSgkRmlsZSwgJFNlbGYtPntUcmFzaERpcn0uIi8kTmV3RmlsZSIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJDYW4ndCBtb3ZlIGZpbGUgJEZpbGUgdG8gdHJhc2ggZGlyZWN0b3J5ICRTZWxmLT57VHJhc2hEaXJ9LyROZXdGaWxlOiAkISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JkxvY2F0aW9uPSIuJFNlbGYtPntMYXlvdXRPYmplY3R9LT5MaW5rRW5jb2RlKCRTZWxmLT57TG9jYXRpb259KSk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICh1bmxpbmsgJEZpbGUpIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mTG9jYXRpb249Ii4kU2VsZi0+e0xheW91dE9iamVjdH0tPkxpbmtFbmNvZGUoJFNlbGYtPntMb2NhdGlvbn0pKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiQ2FuJ3QgcmVtb3ZlICRGaWxlOiAkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgcmVtb3ZlIGRpcmVjdG9yeQogICAgaWYgKCRTZWxmLT57Um1EaXJ9ICYmICRTZWxmLT57TG9jYXRpb259ICYmICRTZWxmLT5DaGVja1Blcm1pc3Npb24oVHlwZSA9PiAnRGVsZXRlQWNjZXNzTWFwJywgTG9jYXRpb24gPT4gJFNlbGYtPntSbURpcn0pKSB7CiNwcmludCBTVERFUlIgInJtZGlyICRTZWxmLT57Um1EaXJ9XG4iOwogICAgICAgIG15ICREaXIgPSAkU2VsZi0+e0RhdGFEaXJ9LiRTZWxmLT57Um1EaXJ9OwogICAgICAgIGlmIChybWRpciAkRGlyKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JkxvY2F0aW9uPSIuJFNlbGYtPntMYXlvdXRPYmplY3R9LT5MaW5rRW5jb2RlKCRTZWxmLT57TG9jYXRpb259KSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkNhbid0IHJlbW92ZSAkRGlyOiAkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIG5ldyBkaXJlY3RvcnkKICAgIGlmICgkU2VsZi0+e0xvY2F0aW9ufSAmJiAkU2VsZi0+e05ld0Rpcn0gJiYgJFNlbGYtPkNoZWNrUGVybWlzc2lvbihUeXBlID0+ICdDcmVhdGVBY2Nlc3NNYXAnLCBMb2NhdGlvbiA9PiAkU2VsZi0+e0xvY2F0aW9ufS4nLycuJFNlbGYtPntOZXdEaXJ9KSkgewojcHJpbnQgU1RERVJSICJta2RpciAkU2VsZi0+e0RhdGFEaXJ9LiRTZWxmLT57TG9jYXRpb259LicvJy4kU2VsZi0+e05ld0Rpcn1cbiI7CiAgICAgICAgbXkgJERpciA9ICRTZWxmLT57RGF0YURpcn0uJFNlbGYtPntMb2NhdGlvbn0uJy8nLiRTZWxmLT57TmV3RGlyfTsKICAgICAgICBpZiAobWtkaXIgJERpcikgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZMb2NhdGlvbj0iLiRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TGlua0VuY29kZSgkU2VsZi0+e0xvY2F0aW9ufS4nLycuJFNlbGYtPntOZXdEaXJ9KSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkNhbid0IGNyZWF0ZSAkRGlyOiAkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGF0dGFjaG1lbnQKICAgIG15ICVVcGxvYWRTdHVmZiA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgUGFyYW0gPT4gJ2ZpbGVfdXBsb2FkJywKICAgICAgICBTb3VyY2UgPT4gJ1N0cmluZycsCiAgICApOwogICAgaWYgKCRTZWxmLT57TG9jYXRpb259ICYmICVVcGxvYWRTdHVmZiAmJiAkU2VsZi0+Q2hlY2tQZXJtaXNzaW9uKFR5cGUgPT4gJ0NyZWF0ZUFjY2Vzc01hcCcsIExvY2F0aW9uID0+ICRTZWxmLT57TG9jYXRpb259KSkgewogICAgICAgIG15ICRGaWxlID0gJFNlbGYtPntEYXRhRGlyfS4kU2VsZi0+e0xvY2F0aW9ufS4nLycuJFVwbG9hZFN0dWZme0ZpbGVuYW1lfTsKICAgICAgICBpZiAoLWUgJEZpbGUpIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJDYW4ndCB3cml0ZSAkRmlsZSwgZmlsZSBhbHJlYWR5IGV4aXN0cyEiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNpZiAob3BlbiAoT1VULCAiPiAkRmlsZSIpKSB7CiAgICAgICAgICAgIHByaW50IE9VVCAkVXBsb2FkU3R1ZmZ7Q29udGVudH07CiAgICAgICAgICAgIGNsb3NlIChPVVQpOwogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZMb2NhdGlvbj0iLiRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TGlua0VuY29kZSgkU2VsZi0+e0xvY2F0aW9ufSkpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJDYW4ndCB3cml0ZSAkRmlsZTogJCEiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgICMgZG93bmxvYWQgYSBmaWxlCiAgICBteSAkRmlsZSA9ICRTZWxmLT57RGF0YURpcn0uJFNlbGYtPntMb2NhdGlvbn07CiAgICBpZiAoIS1kICRGaWxlICYmICRTZWxmLT5DaGVja1Blcm1pc3Npb24oVHlwZSA9PiAnUmVhZEFjY2Vzc01hcCcsIExvY2F0aW9uID0+ICRTZWxmLT57TG9jYXRpb259KSkgewogICAgICAgICMgbWltZSB0eXBlcwogICAgICAgIG15ICVNaW1lVHlwZSA9IHF3KApwZGYgYXBwbGljYXRpb24vcGRmCnBncCBhcHBsaWNhdGlvbi9wZ3AKcHMgYXBwbGljYXRpb24vcG9zdHNjcmlwdApydGYgYXBwbGljYXRpb24vcnRmCmR2aSBhcHBsaWNhdGlvbi94LWR2aQpndGFyIGFwcGxpY2F0aW9uL3gtZ3RhcgpneiBhcHBsaWNhdGlvbi94LWd1bnppcApsYXRleCBhcHBsaWNhdGlvbi94LWxhdGV4CnRhciBhcHBsaWNhdGlvbi94LXRhcgp0Y2wgYXBwbGljYXRpb24veC10Y2wKdGV4IGFwcGxpY2F0aW9uL3gtdGV4CnRleGkgYXBwbGljYXRpb24veC10ZXhpbmZvCnppcCBhcHBsaWNhdGlvbi96aXAKCndhdiBhdWRpby94LXdhdgoKZ2lmIGltYWdlL2dpZgpqcGcgaW1hZ2UvanBlZwpwbmcgaW1hZ2UvcG5nCnRpZiBpbWFnZS90aWZmCnRpZmYgaW1hZ2UvdGlmZgoKaHRtbCB0ZXh0L2h0bWwKaHRtIHRleHQvaHRtbApjc3MgdGV4dC9odG1sCnBsIHRleHQvcGxhaW4KcG0gdGV4dC9wbGFpbgpwaHAgdGV4dC9wbGFpbgpjcHAgdGV4dC9wbGFpbgpjIHRleHQvcGxhaW4KY2MgdGV4dC9wbGFpbgphc2MgdGV4dC9wbGFpbgp0eHQgdGV4dC9wbGFpbgp0ZXh0IHRleHQvcGxhaW4KcnR4IHRleHQvcmljaHRleHQKcnRmIHRleHQvcnRmCnZjZiB0ZXh0L3gtdmNhcmQKc2dtbCB0ZXh0L3NnbWwKc2dtIHRleHQvc2dtbAp4bWwgdGV4dC94bWwKZHRkIHRleHQveG1sCnhzbCB0ZXh0L3htbAoKZG9jIGFwcGxpY2F0aW9uL21zd29yZApkb3QgYXBwbGljYXRpb24vbXN3b3JkCnhscyBhcHBsaWNhdGlvbi9leGNlbAoKbXBnIHZpZGVvL21wZWcKbW92IHZpZGVvL3F1aWNrdGltZQphdmkgdmlkZW8veC1tc3ZpZGVvCgogICAgICAgICk7CiAgICAgICAgbXkgJEZpbGVNaW1lVHlwZSA9ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nOwogICAgICAgIG15ICRGaWxlRXh0ID0gJEZpbGU7CiAgICAgICAgJEZpbGVFeHQgPX4gcy9eLipcLiguKz8pJC8kMS87CiAgICAgICAgaWYgKCRNaW1lVHlwZXtsYygkRmlsZUV4dCl9KSB7CiAgICAgICAgICAgICRGaWxlTWltZVR5cGUgPSAkTWltZVR5cGV7bGMoJEZpbGVFeHQpfTsKICAgICAgICB9CiAgICAgICAgbXkgJEZpbGVTaG9ydCA9ICRGaWxlOwogICAgICAgICRGaWxlU2hvcnQgPX4gcy9eLipcLyguKz8pJC8kMS9nOwogICAgICAgICMgZ2V0IGZpbGUKICAgICAgICBteSAkQ29udGVudCA9ICcnOwogICAgICAgIHVzZSBieXRlczsKICAgICAgICBpZiAob3BlbiAoSU5GT0lOLCAiPCAiLiRGaWxlKSkgewogICAgICAgICAgICB3aGlsZSAobXkgJGxpbmUgPSA8SU5GT0lOPikgewogICAgICAgICAgICAgICAgJENvbnRlbnQgLj0gJGxpbmU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2xvc2UgKElORk9JTik7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBkaWUgIiQhIjsKICAgICAgICB9CiAgICAgICAgbm8gYnl0ZXM7CiAgICAgICAgIyByZXR1cm4gZmlsZQogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICRGaWxlTWltZVR5cGUsCiAgICAgICAgICAgIENvbnRlbnQgPT4gJENvbnRlbnQsCiAgICAgICAgICAgIEZpbGVuYW1lID0+ICRGaWxlU2hvcnQsCiAgICAgICAgICAgIFR5cGUgPT4gJ2lubGluZScsCiAgICAgICAgKTsKICAgIH0KICAgICMgZWxzZSwgdmlldyBkaXJlY3RvcnkKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnVmlldycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgTG9jYXRpb24gPT4gJFNlbGYtPntMb2NhdGlvbn0sCiAgICAgICAgICAgIH0sCiAgICApOwogICAgbXkgJERpciA9ICRTZWxmLT57RGF0YURpcn0uJFNlbGYtPntMb2NhdGlvbn07CiAgICAjIGNoZWNrIGlmIGRpcmVjdG9yeSBleGlzdHMKICAgIGlmICghIC1lICREaXIpIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiTm8gc3VjaCBkaXJlY3Rvcnk6ICREaXIiLAogICAgICAgICk7CiAgICB9CiAgICAjIGdldCBkaXJlY3RvcnkgaW5kZXgKICAgIG15IEBMaXN0ID0gZ2xvYigiJERpci8qIik7CiAgICAjIGFkZCB1cHBlciBkaXJlY3RvcgogICAgaWYgKCRTZWxmLT57TG9jYXRpb259ICYmICRTZWxmLT57TG9jYXRpb259IG5lICcvJykgewogICAgICAgICREaXIgPX4gcy9eKC4qXC8pLis/JC8kMS87CiAgICAgICAgcHVzaCAoQExpc3QsICREaXIpOwogICAgfQogICAgIyBzb3J0IGZpbGVzCiMgICAgQExpc3QgPSBzb3J0IEBMaXN0OwogICAgbXkgQERpcmVjdG9yeSA9ICgpOwogICAgbXkgQEZpbGUgPSAoKTsKICAgIGZvcmVhY2ggbXkgJEZpbGUgKHNvcnQgQExpc3QpIHsKICAgICAgICBpZiAoLWQgJEZpbGUpIHsKICAgICAgICAgICAgcHVzaCAoQERpcmVjdG9yeSwgJEZpbGUpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcHVzaCAoQEZpbGUsICRGaWxlKTsKICAgICAgICB9CiAgICB9CiAgICBATGlzdCA9IChARGlyZWN0b3J5LCBARmlsZSk7CiAgICBmb3JlYWNoIG15ICRGaWxlIChATGlzdCkgewogICAgICAgIG15ICREZWxldGUgPSAnJzsKICAgICAgICBteSAkVkZpbGUgPSAkRmlsZTsKICAgICAgICAkVkZpbGUgPX4gcy8kU2VsZi0+e0RhdGFEaXJ9Ly87CiAgICAgICAgJFZGaWxlID1+IHMvXC9cLy9cLy9nOwogICAgICAgICMgY2hlY2sgcmVhZCBwZXJtaXNzaW9uCiAgICAgICAgaWYgKCEkU2VsZi0+Q2hlY2tQZXJtaXNzaW9uKFR5cGUgPT4gJ1JlYWRBY2Nlc3NNYXAnLCBMb2NhdGlvbiA9PiAkVkZpbGUpKSB7CiAgICAgICAgICAgIG5leHQ7CiAgICAgICAgfQogICAgICAgICMgc2hvdyB1cHBlciBkaXJlY3RvcnkgbGluawogICAgICAgIGlmICgkTGlzdFswXSBlcSAkRmlsZSAmJiAkU2VsZi0+e0xvY2F0aW9ufSAmJiAkU2VsZi0+e0xvY2F0aW9ufSBuZSAnLycpIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0RpcmVjdG9yeScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdVcCcsCiAgICAgICAgICAgICAgICAgICAgRmlsZSA9PiAkVkZpbGUsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAjIHNob3cgZGlyZWN0b3JpZXMKICAgICAgICBlbHNpZiAoLWQgJEZpbGUpIHsKICAgICAgICAgICAgbXkgJENvdW50ID0gJFNlbGYtPlN1YkNvdW50KERpcmVjdG9yeSA9PiAkRmlsZSk7CiAgICAgICAgICAgIGlmICgkU2VsZi0+Q2hlY2tQZXJtaXNzaW9uKFR5cGUgPT4gJ0RlbGV0ZUFjY2Vzc01hcCcsIExvY2F0aW9uID0+ICRWRmlsZSkpIHsKICAgICAgICAgICAgICAgICAkRGVsZXRlID0gJ0RlbGV0ZSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRTZWxmLT5DaGVja1Blcm1pc3Npb24oVHlwZSA9PiAnUmVhZEFjY2Vzc01hcCcsIExvY2F0aW9uID0+ICRWRmlsZSkpIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnRGlyZWN0b3J5JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkVkZpbGUuIi8iLAogICAgICAgICAgICAgICAgICAgICAgICBGaWxlID0+ICRWRmlsZS4iLyIsCiAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0ZSA9PiAkRGVsZXRlLAogICAgICAgICAgICAgICAgICAgICAgICBMb2NhdGlvbiA9PiAkU2VsZi0+e0xvY2F0aW9ufSwKICAgICAgICAgICAgICAgICAgICAgICAgQ291bnQgPT4gIigkQ291bnQpIiwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAjIHNob3cgZmlsZXMKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJEZpbGVTaXplID0gLXMgJEZpbGUgfHwgMDsKICAgICAgICAgICAgJEZpbGVTaXplID0gJEZpbGVTaXplIC0gMzAgaWYgKCRGaWxlU2l6ZSA+IDMwKTsKICAgICAgICAgICAgaWYgKCRGaWxlU2l6ZSA+ICgxMDI0KjEwMjQpKSB7CiAgICAgICAgICAgICAgICAkRmlsZVNpemUgPSBzcHJpbnRmICIlLjFmIE1CeXRlcyIsICgkRmlsZVNpemUvKDEwMjQqMTAyNCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICgkRmlsZVNpemUgPiAxMDI0KSB7CiAgICAgICAgICAgICAgICAkRmlsZVNpemUgPSBzcHJpbnRmICIlLjFmIEtCeXRlcyIsICgoJEZpbGVTaXplLzEwMjQpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRGaWxlU2l6ZSA9ICRGaWxlU2l6ZS4nIEJ5dGVzJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJFNlbGYtPkNoZWNrUGVybWlzc2lvbihUeXBlID0+ICdEZWxldGVBY2Nlc3NNYXAnLCBMb2NhdGlvbiA9PiAkVkZpbGUpKSB7CiAgICAgICAgICAgICAgICAgJERlbGV0ZSA9ICdEZWxldGUnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkU2VsZi0+Q2hlY2tQZXJtaXNzaW9uKFR5cGUgPT4gJ1JlYWRBY2Nlc3NNYXAnLCBMb2NhdGlvbiA9PiAkVkZpbGUpKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0ZpbGUnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRWRmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSA9PiAkVkZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgIFNpemUgPT4gJEZpbGVTaXplLAogICAgICAgICAgICAgICAgICAgICAgICBEZWxldGUgPT4gJERlbGV0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgTG9jYXRpb24gPT4gJFNlbGYtPntMb2NhdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAjIGJyb3dzZSB0aGUgdHJlZQogICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKFRpdGxlID0+ICdGaWxlIERvd25sb2FkJyk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50RmlsZU1hbmFnZXInLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIExvY2F0aW9uID0+ICRTZWxmLT57TG9jYXRpb259LAogICAgICAgIH0sCiAgICApOwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg== IyAtLQojIEFnZW50RmlsZURvd25sb2FkLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWdlbnRGaWxlRG93bmxvYWQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSBNYXJ0aW4gRWRlbmhvZmVyIDxtYXJ0aW4rY29kZUBvdHJzLm9yZz4KIyAtLQojICRJZDogQWdlbnRGaWxlTWFuYWdlci5kdGwsdiAxLjMgMjAwNS8wNi8xMiAyMDowMDoxMSBtYXJ0aW4gRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCjwhLS0gZHRsOmJsb2NrOlZpZXcgLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiIGNvbHM9IjEiPgo8dHI+CiAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAkRW52eyJCb3gwIn0kVGV4dHsiRmlsZS1NYW5hZ2VyIn06ICREYXRheyJMb2NhdGlvbiJ9JEVudnsiQm94MSJ9CiAgPC90ZD4KPC90cj4KPHRyPgogIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJOYW1lIn08L3RkPgogICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTAwIj4kVGV4dHsiU2l6ZSJ9PC90ZD4KICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjEwMCI+JFRleHR7IkFjdGlvbiJ9PC90ZD4KPC90cj4KPCEtLSBkdGw6YmxvY2s6RGlyZWN0b3J5IC0tPgo8ZHRsIGlmICgkRW52eyJDb2xvciJ9IGVxICIiKSB7ICRFbnZ7IkNvbG9yIn0gPSAic2VhcmNoYWN0aXZlIjsgfT4KPHRyPgogICAgPHRkIGNsYXNzPSIkRW52eyJDb2xvciJ9Ij48YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JkxvY2F0aW9uPSRMUURhdGF7IkZpbGUifSIgdGl0bGU9IiRMUURhdGF7Ik5hbWUifSI+JFFEYXRheyJOYW1lIiwiMTEwIn08L2E+ICRRRGF0YXsiQ291bnQifTwvdGQ+CiAgICA8dGQgY2xhc3M9IiRFbnZ7IkNvbG9yIn0iPiRUZXh0eyJEaXJlY3RvcnkifTwvdGQ+CiAgICA8dGQgY2xhc3M9IiRFbnZ7IkNvbG9yIn0iPjxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mTG9jYXRpb249JExRRGF0YXsiTG9jYXRpb24ifSZSbURpcj0kTFFEYXRheyJGaWxlIn0iPiRUZXh0eyIkUURhdGF7IkRlbGV0ZSJ9In08L2E+PC90ZD4KPC90cj4KPGR0bCBpZiAoJEVudnsiQ29sb3IifSBlcSAic2VhcmNocGFzc2l2ZSIpIHsgJEVudnsiQ29sb3IifSA9ICIiOyB9Pgo8ZHRsIGlmICgkRW52eyJDb2xvciJ9IGVxICJzZWFyY2hhY3RpdmUiKSB7ICRFbnZ7IkNvbG9yIn0gPSAic2VhcmNocGFzc2l2ZSI7IH0+CjwhLS0gZHRsOmJsb2NrOkRpcmVjdG9yeSAtLT4KPCEtLSBkdGw6YmxvY2s6RmlsZSAtLT4KPGR0bCBpZiAoJEVudnsiQ29sb3IifSBlcSAiIikgeyAkRW52eyJDb2xvciJ9ID0gInNlYXJjaGFjdGl2ZSI7IH0+Cjx0cj4KICAgIDx0ZCBjbGFzcz0iJEVudnsiQ29sb3IifSI+PGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZMb2NhdGlvbj0kTFFEYXRheyJGaWxlIn0iIHRpdGxlPSIkTFFEYXRheyJOYW1lIn0iPiRRRGF0YXsiTmFtZSIsIjExMCJ9PC9hPjwvdGQ+CiAgICA8dGQgY2xhc3M9IiRFbnZ7IkNvbG9yIn0iPiRRRGF0YXsiU2l6ZSJ9PC90ZD4KICAgIDx0ZCBjbGFzcz0iJEVudnsiQ29sb3IifSI+PGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZMb2NhdGlvbj0kTFFEYXRheyJMb2NhdGlvbiJ9JlJtRmlsZT0kTFFEYXRheyJGaWxlIn0iPiRUZXh0eyIkUURhdGF7IkRlbGV0ZSJ9In08L2E+PC90ZD4KPC90cj4KPGR0bCBpZiAoJEVudnsiQ29sb3IifSBlcSAic2VhcmNocGFzc2l2ZSIpIHsgJEVudnsiQ29sb3IifSA9ICIiOyB9Pgo8ZHRsIGlmICgkRW52eyJDb2xvciJ9IGVxICJzZWFyY2hhY3RpdmUiKSB7ICRFbnZ7IkNvbG9yIn0gPSAic2VhcmNocGFzc2l2ZSI7IH0+CjwhLS0gZHRsOmJsb2NrOkZpbGUgLS0+CjwvdGFibGU+CjxkdGwgaWYgKCREYXRheyJDcmVhdGVBY2Nlc3NNYXAifSBlcSAiMSIpIHsgJERhdGF7IkNyZWF0ZUxpbmsifSA9ICI8aHI+JFRleHR7IkNyZWF0ZSBEaXJlY3RvcnkifTo8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJMb2NhdGlvbiIgdmFsdWU9IiRRRGF0YXsiTG9jYXRpb24ifSI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9Ik5ld0RpciIgdmFsdWU9IiRRRGF0YXsiTmV3RGlyIn0iIHNpemU9IjQwIj4gPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJDcmVhdGUifSI+PC9mb3JtPiI7IH0+CiREYXRheyJDcmVhdGVMaW5rIn0KCjxkdGwgaWYgKCREYXRheyJDcmVhdGVBY2Nlc3NNYXAifSBlcSAiMSIpIHsgJERhdGF7IkZpbGVGb3JtIn0gPSAiPGhyPiRUZXh0eyJGaWxlIFVwbG9hZCJ9Ojxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkxvY2F0aW9uIiB2YWx1ZT0iJFFEYXRheyJMb2NhdGlvbiJ9Ij48aW5wdXQgbmFtZT0iZmlsZV91cGxvYWQiIHR5cGU9ImZpbGUiIHNpemU9IjQwIiBjbGFzcz0iZml4ZWQiPiA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlVwbG9hZCJ9Ij48L2Zvcm0+IjsgfT4KJERhdGF7IkZpbGVGb3JtIn0KICA8L3RkPgo8L3RyPgo8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpWaWV3IC0tPgo= iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAAB3RJTUUH0wMeCyQ1BBZUOQAABKVJREFUeJy1lVlslFUYhp9//pnO35Yy004XIJQWSgsItQgVCIlEQyQFCUuUGHBJuOLCxKIhqXgBMcG4kZBgMIQCskgMFIFYBIJsloLsLq3U0IXunXaWzkynnX8/XiCLBhBNfK7P+5zv5HznO/A/If2n1JckE6Y025n9WlAEN9ir7c6/L3E+Ln/ifF+6mlAdS+aNCQGwm3TXoGthaUrpm9Nyn3mqJ+oPH/71cAXwNiCeqOLqUy35isvaI8vSiKa26P6oqVbtTy7/auG4BZ6gEWw73nw81NLZ6hBxMYUbzOQYwQfz8sOkZy92ZCESh0pLRs/OHeX1FY7NmON2ySvCoiPrbPhCQ63/jL9/KII5aLmJkEEOcS5y9bHimkutXi0RPTpr+rhZEhKmYWOYOrWxamVIxF1ZWdlj0rQx+eZQkhQLhbAHzSTcjKeZfcSxHio+VVOXYRmJb2ZOL3zO6ZAJayGqWr+m8vZWcrKyyMjMIKL2Sz6PkjTSm5kz6DdzDU1yasaATCG/c42mu657l3fy9JUMp8PcO7Wk8IU+u5uDLQdpi7dSMnoKZWPn0jLQijqoI2xBQjPo7O3A5bQkCcDCRGYZKZxk6E7VToDvT18Y7lbkncWTCxZsbd9CMBFkQX4ZxcMn0KjeIpLoRxISAhBC4I93E4j14g9F9KjW40cCZGaxjCJ20wDgOHX6B0VRXHuKJ49f7PWkUR+pY33JOjI9PgJ2H4g7MiEEhq3TGm8jqAUIxuLEnQEXssi5syNJpLDobqc50oYlby+ePGGx1zMcIeDlvFeoaq9CR8PEwBYChCBhq7QlOjAknYFBnbDwYyum5Pa6fZJDGlmSXmrle8YvZRFeAIdti8O3mm639PYGLcuyWDJ6MUfbj+J2uLGECbYgYev0mAFk2YGqWQQ0P7ZLRxISBb4iNs2tTN80e2fRkvzlMyWfYw6AvGPH9gbTsndFPVpXQ3vzNMVKSzMdGpZsElP60Q2Tbj2AYRqomk57uJOYCFCkTKJi4jrKC94jQ85Ct3TSXT4uh84nx5Kih2SAnz++nt2T1LZxQv7YgrpYneQKezkdPMa0vBICVpB+YwDLtGjt62ZUio81ee/zTn4FuUoeumVg2zYIgSKlcD16Ka+rt333nXYT9BuW0eBUnE/LPo3enFt01XcT8sdpNrsxZROPmcm6Sa8yI3kGluYgoao4ZAmnU0ZJUvil7wZ7blYGf+q+uota3PdnxX6GjXCO2LJ26to3ImkRqT3cjjvsYvg4D2Xul5iR9ixO24WqaqiqjqYZWLqgMdDExosf6bW3z+0bvBLfyzUasej963vei9O9w71tW+M2a71/vZhfPV+E1JC4i2VZYmhIFZH+uLjV1iJW7XrLSC1PPcaLzMPFOEB52Oy5h/KF8snmus3ayssrxYGbB8SD9Eb7xIYTHxqZazIvs5QVSBQAaY8V3qMSh3eL992KcxWxVd+tErqliwFtQOy8utMu+bSkntcpJ4OJQPqjFI/+QT5D9rl8y1Pl1M9Xl672Hqk/0lVzo2YHNXzLb3QAIbg/zZ5cDPABDlIpk/ql58UZUc2PNP4pNP7hzE+MAiT9m8Af195UZ1WMdw8AAAAASUVORK5CYII=