MultipleDashboards
4.0.1
GetCon GmbH
http://www.getcon-gmbh.de/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
A modification of the OTRS dashboard to add additional dashboards. Add or modify Dashboards via SysConfig or Kernel/Config/Files/MultipleDashboards.xml.
4.0.x
2015-03-24 20:39:13
192.168.73.111
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+DQo8b3Ryc19jb25maWcgdmVyc2lvbj0iMS4wIiBpbml0PSJGcmFtZXdvcmsiPg0KDQogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50TXVsdGlwbGVEYXNoYm9hcmRzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPg0KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLiBBZGQgTmF2QmFyLUVsZW1lbnRzIHRvIGFkZCBtb3JlIERhc2hib2FyZHMuPC9EZXNjcmlwdGlvbj4NCiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+DQogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+DQogICAgICAgIDxTZXR0aW5nPg0KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPg0KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5BZ2VudCBEYXNoYm9hcmQ8L0Rlc2NyaXB0aW9uPg0KICAgICAgICAgICAgICAgIDxUaXRsZT48L1RpdGxlPg0KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkRhc2hib2FyZDwvTmF2QmFyTmFtZT4NCiAgICAgICAgICAgICAgICA8TmF2QmFyPg0KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj48L0Rlc2NyaXB0aW9uPg0KICAgICAgICAgICAgICAgICAgICA8TmFtZSBUcmFuc2xhdGFibGU9IjEiPkRhc2hib2FyZDwvTmFtZT4NCiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50RGFzaGJvYXJkPC9MaW5rPg0KICAgICAgICAgICAgICAgICAgICA8TGlua09wdGlvbj48L0xpbmtPcHRpb24+DQogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+RGFzaGJvYXJkPC9OYXZCYXI+DQogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4NCiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPkl0ZW1BcmVhPC9CbG9jaz4NCiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT48L0FjY2Vzc0tleT4NCiAgICAgICAgICAgICAgICAgICAgPFByaW8+NTA8L1ByaW8+DQogICAgICAgICAgICAgICAgPC9OYXZCYXI+DQogICAgICAgICAgICAgICAgPE5hdkJhcj4NCiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+PC9EZXNjcmlwdGlvbj4NCiAgICAgICAgICAgICAgICAgICAgPE5hbWUgVHJhbnNsYXRhYmxlPSIxIj5EYXNoYm9hcmQgMjwvTmFtZT4NCiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50TXVsdGlwbGVEYXNoYm9hcmRzO0Rhc2hib2FyZD1EYXNoYm9hcmQyPC9MaW5rPg0KICAgICAgICAgICAgICAgICAgICA8TGlua09wdGlvbj48L0xpbmtPcHRpb24+DQogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+RGFzaGJvYXJkPC9OYXZCYXI+DQogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4NCiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPkl0ZW1BcmVhPC9CbG9jaz4NCiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT48L0FjY2Vzc0tleT4NCiAgICAgICAgICAgICAgICAgICAgPFByaW8+NTI8L1ByaW8+DQogICAgICAgICAgICAgICAgPC9OYXZCYXI+DQogICAgICAgICAgICAgICAgPE5hdkJhcj4NCiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+PC9EZXNjcmlwdGlvbj4NCiAgICAgICAgICAgICAgICAgICAgPE5hbWUgVHJhbnNsYXRhYmxlPSIxIj5EYXNoYm9hcmQgMzwvTmFtZT4NCiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50TXVsdGlwbGVEYXNoYm9hcmRzO0Rhc2hib2FyZD1EYXNoYm9hcmQzPC9MaW5rPg0KICAgICAgICAgICAgICAgICAgICA8TGlua09wdGlvbj48L0xpbmtPcHRpb24+DQogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+RGFzaGJvYXJkPC9OYXZCYXI+DQogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4NCiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPkl0ZW1BcmVhPC9CbG9jaz4NCiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT48L0FjY2Vzc0tleT4NCiAgICAgICAgICAgICAgICAgICAgPFByaW8+NTQ8L1ByaW8+DQogICAgICAgICAgICAgICAgPC9OYXZCYXI+DQogICAgICAgICAgICAgICAgPExvYWRlcj4NCiAgICAgICAgICAgICAgICAgICAgPENTUz5Db3JlLkFnZW50LkRhc2hib2FyZC5jc3M8L0NTUz4NCiAgICAgICAgICAgICAgICAgICAgPENTUz5Db3JlLkFsbG9jYXRpb25MaXN0LmNzczwvQ1NTPg0KICAgICAgICAgICAgICAgICAgICA8Q1NTPnRoaXJkcGFydHkvZnVsbGNhbGVuZGFyLTEuNi4xL2Z1bGxjYWxlbmRhci5jc3M8L0NTUz4NCiAgICAgICAgICAgICAgICAgICAgPENTUz50aGlyZHBhcnR5L2QzanMvbnYuZDMuY3NzPC9DU1M+DQogICAgICAgICAgICAgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvZmxvdC0wLjguMy9leGNhbnZhcy5qczwvSmF2YVNjcmlwdD4NCiAgICAgICAgICAgICAgICAgICAgPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9mbG90LTAuOC4zL2pxdWVyeS5mbG90LmpzPC9KYXZhU2NyaXB0Pg0KICAgICAgICAgICAgICAgICAgICA8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2Z1bGxjYWxlbmRhci0xLjYuMS9mdWxsY2FsZW5kYXIubWluLmpzPC9KYXZhU2NyaXB0Pg0KICAgICAgICAgICAgICAgICAgICA8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2QzanMvZDMudjMubWluLmpzPC9KYXZhU2NyaXB0Pg0KICAgICAgICAgICAgICAgICAgICA8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2QzanMvbnYuZDMubWluLmpzPC9KYXZhU2NyaXB0Pg0KICAgICAgICAgICAgICAgICAgICA8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2QzanMvbW9kZWxzL09UUlNtdWx0aUJhckNoYXJ0LmpzPC9KYXZhU2NyaXB0Pg0KICAgICAgICAgICAgICAgICAgICA8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2QzanMvbW9kZWxzL09UUlNzdGFja2VkQXJlYUNoYXJ0LmpzPC9KYXZhU2NyaXB0Pg0KICAgICAgICAgICAgICAgICAgICA8SmF2YVNjcmlwdD5Db3JlLlVJLkNoYXJ0LmpzPC9KYXZhU2NyaXB0Pg0KICAgICAgICAgICAgICAgICAgICA8SmF2YVNjcmlwdD5Db3JlLlVJLkFkdmFuY2VkQ2hhcnQuanM8L0phdmFTY3JpcHQ+DQogICAgICAgICAgICAgICAgICAgIDxKYXZhU2NyaXB0PkNvcmUuVUkuQWxsb2NhdGlvbkxpc3QuanM8L0phdmFTY3JpcHQ+DQogICAgICAgICAgICAgICAgICAgIDxKYXZhU2NyaXB0PkNvcmUuQWdlbnQuVGFibGVGaWx0ZXJzLmpzPC9KYXZhU2NyaXB0Pg0KICAgICAgICAgICAgICAgICAgICA8SmF2YVNjcmlwdD5Db3JlLkFnZW50LkRhc2hib2FyZC5qczwvSmF2YVNjcmlwdD4NCiAgICAgICAgICAgICAgICA8L0xvYWRlcj4NCiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+DQogICAgICAgIDwvU2V0dGluZz4NCiAgICA8L0NvbmZpZ0l0ZW0+DQoJDQo8L290cnNfY29uZmlnPg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50TXVsdGlwbGVEYXNoYm9hcmRzLnBtIC0gYSBtb2RpZmljYXRpb24gb2YgQWdlbnREYXNoYm9hcmQgZm9yIG11bHRpcGxlIGRhc2hib2FyZHMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNSBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE0LTIwMTUgR2V0Q29uIEdtYkgsIGh0dHA6Ly93d3cuZ2V0Y29uLWdtYmguZGUvCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRNdWx0aXBsZURhc2hib2FyZHM7CiMjIG5vZmlsdGVyKFRpZHlBbGw6OlBsdWdpbjo6T1RSUzo6UGVybDo6REJPYmplY3QpCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkNhY2hlOwp1c2UgS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQ29tcGFueTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U3RhdHM7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QgTWFpbk9iamVjdCBFbmNvZGVPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRfISIgKTsKICAgICAgICB9CiAgICB9CgogICAgJFNlbGYtPntDYWNoZU9iamVjdH0gICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CiAgICAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJDb21wYW55LT5uZXcoJVBhcmFtKTsKCiAgICAkU2VsZi0+e1NsYXZlREJPYmplY3R9ICAgICA9ICRTZWxmLT57REJPYmplY3R9OwogICAgJFNlbGYtPntTbGF2ZVRpY2tldE9iamVjdH0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH07CgogICAgIyB1c2UgYSBzbGF2ZSBkYiB0byBzZWFyY2ggZGFzaGJvYXJkIGRhdGUKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0NvcmU6Ok1pcnJvckRCOjpEU04nKSApIHsKCiAgICAgICAgJFNlbGYtPntTbGF2ZURCT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgICAgICBMb2dPYmplY3QgICAgPT4gJFBhcmFte0xvZ09iamVjdH0sCiAgICAgICAgICAgIENvbmZpZ09iamVjdCA9PiAkUGFyYW17Q29uZmlnT2JqZWN0fSwKICAgICAgICAgICAgTWFpbk9iamVjdCAgID0+ICRQYXJhbXtNYWluT2JqZWN0fSwKICAgICAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRQYXJhbXtFbmNvZGVPYmplY3R9LAogICAgICAgICAgICBEYXRhYmFzZURTTiAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0NvcmU6Ok1pcnJvckRCOjpEU04nKSwKICAgICAgICAgICAgRGF0YWJhc2VVc2VyID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdDb3JlOjpNaXJyb3JEQjo6VXNlcicpLAogICAgICAgICAgICBEYXRhYmFzZVB3ICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0NvcmU6Ok1pcnJvckRCOjpQYXNzd29yZCcpLAogICAgICAgICk7CgogICAgICAgIGlmICggJFNlbGYtPntTbGF2ZURCT2JqZWN0fSApIHsKCiAgICAgICAgICAgICRTZWxmLT57U2xhdmVUaWNrZXRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlRpY2tldC0+bmV3KAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgREJPYmplY3QgPT4gJFNlbGYtPntTbGF2ZURCT2JqZWN0fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgZXh0cmEgbmVlZGVkIG9iamVjdHMKICAgICRTZWxmLT57RHluYW1pY0ZpZWxkT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntCYWNrZW5kT2JqZWN0fSAgICAgID0gS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZC0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1N0YXRzT2JqZWN0fSAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6U3RhdHMtPm5ldyglUGFyYW0pOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKCSMjIyMgR2V0IERhc2hib2FyZHMgTmFtZSBhbmQgU3lzY29uZmlnCglteSAkRGFzaGJvYXJkTmFtZSAJPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJEYXNoYm9hcmQiICk7CglteSAkRGFzaGJvYXJkQ29uZmlnCT0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIkZyb250ZW5kOjpNb2R1bGUiKTsKCW15ICREYXNoYm9hcmRUaXRsZQk9ICJTZXQgTmFtZSBpbiBTeXNDb25maWciOwoJCglmb3JlYWNoKCBAeyAkRGFzaGJvYXJkQ29uZmlnLT57IkFnZW50TXVsdGlwbGVEYXNoYm9hcmRzIn0tPntOYXZCYXJ9IH0gKXsKCQlpZiggJF8tPntMaW5rfSBlcSAiQWN0aW9uPUFnZW50TXVsdGlwbGVEYXNoYm9hcmRzO0Rhc2hib2FyZD0iLiRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TGlua0VuY29kZSggJERhc2hib2FyZE5hbWUgKSApewoJCQkkRGFzaGJvYXJkVGl0bGUgPSAkXy0+e05hbWV9OwoJCQlsYXN0OwoJCX0KCX0KCQogICAgbXkgJEJhY2tlbmRDb25maWdLZXkgID0gJ0Rhc2hib2FyZEJhY2tlbmQnOwogICAgbXkgJE1haW5NZW51Q29uZmlnS2V5ID0gJ0FnZW50RGFzaGJvYXJkOjpNYWluTWVudSc7CiAgICBteSAkVXNlclNldHRpbmdzS2V5ICAgPSAnVXNlckRhc2hib2FyZCcuJERhc2hib2FyZE5hbWU7ICMjIyMgTXVsdGlwbHkgVXNlclNldHRpbmdzIE5hbWVzcGFjZQoKICAgICMgbG9hZCBiYWNrZW5kcwogICAgbXkgJENvbmZpZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCRCYWNrZW5kQ29uZmlnS2V5KTsKICAgIGlmICggISRDb25maWcgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ05vIHN1Y2ggY29uZmlnIGZvciAnIC4gJEJhY2tlbmRDb25maWdLZXksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIERpc2FibGUgc3RhdHMgd2lkZ2V0cyBpbiBJRTguIFRoaXMgY2FuIGJlIHJlbW92ZWQgaWYgSUU4IHN1cHBvcnQgaXMgcmVtb3ZlZCBzb21lZGF5LgogICAgbXkgJElzSUU4OwoKICAgIGlmICgKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCcm93c2VyfSBlcSAnTVNJRScKICAgICAgICAmJiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCcm93c2VyTWFqb3JWZXJzaW9ufSA8PSA4CiAgICAgICAgKQogICAgewogICAgICAgICRJc0lFOCA9IDE7CiAgICB9CgogICAgIyBHZXQgYWxsIGNvbmZpZ3VyZWQgc3RhdGlzdGljcyBmcm9tIHRoZSBzeXN0ZW0gdGhhdCBzaG91bGQgYmUgc2hvd24gYXMgYSBkYXNoYm9hcmQgd2lkZ2V0CiAgICAjICAgYW5kIHJlZ2lzdGVyIHRoZW0gZHluYW1pY2FsbHkgaW4gdGhlIGNvbmZpZ3VyYXRpb24uIFRoaXMgZG9lcyBub3Qgd29yayBpbiBJRTguCiAgICBpZiAoICRTZWxmLT57QWN0aW9ufSBlcSAnQWdlbnRNdWx0aXBsZURhc2hib2FyZHMnICYmICEkSXNJRTggKSB7CiAgICAgICAgbXkgJFN0YXRzSGFzaCA9ICRTZWxmLT57U3RhdHNPYmplY3R9LT5TdGF0c0xpc3RHZXQoKTsKCiAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkU3RhdHNIYXNoKSApIHsKICAgICAgICAgICAgU1RBVElEOgogICAgICAgICAgICBmb3IgbXkgJFN0YXRJRCAoIHNvcnQga2V5cyAleyRTdGF0c0hhc2h9ICkgewogICAgICAgICAgICAgICAgbmV4dCBTVEFUSUQgaWYgISRTdGF0c0hhc2gtPnskU3RhdElEfS0+e1Nob3dBc0Rhc2hib2FyZFdpZGdldH07CgogICAgICAgICAgICAgICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgICAgICAgICAgICAgbmV4dCBTVEFUSUQgaWYgISRTdGF0c0hhc2gtPnskU3RhdElEfS0+e1Blcm1pc3Npb259OwogICAgICAgICAgICAgICAgbmV4dCBTVEFUSUQgaWYgIUlzQXJyYXlSZWZXaXRoRGF0YSggJFN0YXRzSGFzaC0+eyRTdGF0SUR9LT57UGVybWlzc2lvbn0gKTsKCiAgICAgICAgICAgICAgICBteSBAU3RhdHNQZXJtaXNzaW9uR3JvdXBOYW1lczsKICAgICAgICAgICAgICAgIGZvciBteSAkR3JvdXBJRCAoIEB7ICRTdGF0c0hhc2gtPnskU3RhdElEfS0+e1Blcm1pc3Npb259IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAU3RhdHNQZXJtaXNzaW9uR3JvdXBOYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTG9va3VwKCBHcm91cElEID0+ICRHcm91cElEICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBteSAkU3RhdHNQZXJtaXNzaW9uR3JvdXBzID0gam9pbiggJzsnLCBAU3RhdHNQZXJtaXNzaW9uR3JvdXBOYW1lcyApOwoKICAgICAgICAgICAgICAgICMgcmVwbGFjZSBhbGwgbGluZSBicmVha3Mgd2l0aCBzcGFjZXMgKG90aGVyd2lzZSBUcmFuc2xhdGUoKSB3aWxsIG5vdCB3b3JrIGNvcnJlY3RseSkKICAgICAgICAgICAgICAgICRTdGF0c0hhc2gtPnskU3RhdElEfS0+e0Rlc2NyaXB0aW9ufSA9fiBze1xyP1xufFxyfXsgfW1zeGc7CgogICAgICAgICAgICAgICAgbXkgJERlc2NyaXB0aW9uID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoICRTdGF0c0hhc2gtPnskU3RhdElEfS0+e0Rlc2NyaXB0aW9ufSApOwoKICAgICAgICAgICAgICAgIG15ICRUaXRsZSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCAkU3RhdHNIYXNoLT57JFN0YXRJRH0tPntUaXRsZX0gKTsKICAgICAgICAgICAgICAgICRUaXRsZSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdTdGF0aXN0aWMnKSAuICc6ICcKICAgICAgICAgICAgICAgICAgICAuICRUaXRsZTsKCiAgICAgICAgICAgICAgICAkQ29uZmlnLT57ICggJFN0YXRJRCArIDEwMDAgKSAuICctU3RhdHMnIH0gPSB7CiAgICAgICAgICAgICAgICAgICAgJ0Jsb2NrJyAgICAgICA9PiAnQ29udGVudExhcmdlJywKICAgICAgICAgICAgICAgICAgICAnRGVmYXVsdCcgICAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgJ01vZHVsZScgICAgICA9PiAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkRhc2hib2FyZFN0YXRzJywKICAgICAgICAgICAgICAgICAgICAnVGl0bGUnICAgICAgID0+ICRUaXRsZSwKICAgICAgICAgICAgICAgICAgICAnU3RhdElEJyAgICAgID0+ICRTdGF0SUQsCiAgICAgICAgICAgICAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAkRGVzY3JpcHRpb24sCiAgICAgICAgICAgICAgICAgICAgJ0dyb3VwJyAgICAgICA9PiAkU3RhdHNQZXJtaXNzaW9uR3JvdXBzLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIEhhY2s6IHJlbW92ZSBKUyBmaWxlcyBmb3IgZDMgaWYgSUU4IGlzIHVzZWQsIGJlY2F1c2UgaXQgd291bGQgYnJlYWsuCiAgICBpZiAoJElzSUU4KSB7CiAgICAgICAgbXkgQE1vZHVsZUpTID0gQHsKICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+e0FnZW50TXVsdGlwbGVEYXNoYm9hcmRzfS0+e0xvYWRlcn0KICAgICAgICAgICAgICAgIC0+e0phdmFTY3JpcHR9IHx8IFtdCiAgICAgICAgfTsKICAgICAgICBATW9kdWxlSlMgPSBncmVwIHsgJF8gIX4gbS9kM2pzLyB9IEBNb2R1bGVKUzsKICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRNdWx0aXBsZURhc2hib2FyZHN9LT57TG9hZGVyfS0+e0phdmFTY3JpcHR9ID0gXEBNb2R1bGVKUzsKICAgIH0KCiAgICAjIHVwZGF0ZS9jbG9zZSBpdGVtCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVXBkYXRlUmVtb3ZlJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICBteSAkTmFtZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ05hbWUnICk7CiAgICAgICAgbXkgJEtleSA9ICRVc2VyU2V0dGluZ3NLZXkgLiAkTmFtZTsKCiAgICAgICAgIyB1cGRhdGUgc3Nlc3Npb24KICAgICAgICAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgICAgIEtleSAgICAgICA9PiAkS2V5LAogICAgICAgICAgICBWYWx1ZSAgICAgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIHVwZGF0ZSBwcmVmZXJlbmNlcwogICAgICAgIGlmICggISRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZW1vU3lzdGVtJykgKSB7CiAgICAgICAgICAgICRTZWxmLT57VXNlck9iamVjdH0tPlNldFByZWZlcmVuY2VzKAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIEtleSAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgVmFsdWUgID0+IDAsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkVVJMID0gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn07RGFzaGJvYXJkPSIuJFNlbGYtPntMYXlvdXRPYmplY3R9LT5MaW5rRW5jb2RlKCAkRGFzaGJvYXJkTmFtZSApOwogICAgICAgIGlmICggJFNlbGYtPntDdXN0b21lcklEfSApIHsKICAgICAgICAgICAgJFVSTCAuPSAiO0N1c3RvbWVySUQ9IiAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TGlua0VuY29kZSggJFNlbGYtPntDdXN0b21lcklEfSApOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICRVUkwsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHVwZGF0ZSBwcmVmZXJlbmNlcwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1VwZGF0ZVByZWZlcmVuY2VzJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICBteSAkTmFtZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ05hbWUnICk7CgogICAgICAgICMgZ2V0IHByZWZlcmVuY2VzIHNldHRpbmdzCiAgICAgICAgbXkgQFByZWZlcmVuY2VzT25seSA9ICRTZWxmLT5fRWxlbWVudCgKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgID0+ICROYW1lLAogICAgICAgICAgICBDb25maWdzICAgICAgICAgPT4gJENvbmZpZywKICAgICAgICAgICAgUHJlZmVyZW5jZXNPbmx5ID0+IDEsCiAgICAgICAgKTsKICAgICAgICBpZiAoICFAUHJlZmVyZW5jZXNPbmx5ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJObyBwcmVmZXJlbmNlcyBmb3IgJE5hbWUhIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgcmVtZW1iZXIgcHJlZmVyZW5jZXMKICAgICAgICBmb3IgbXkgJFBhcmFtIChAUHJlZmVyZW5jZXNPbmx5KSB7CgogICAgICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICAgICAgbXkgJFZhbHVlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW0tPntOYW1lfSApOwoKICAgICAgICAgICAgIyB1cGRhdGUgcnVudGltZSB2YXJzCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+eyAkUGFyYW0tPntOYW1lfSB9ID0gJFZhbHVlOwoKICAgICAgICAgICAgIyB1cGRhdGUgc3Nlc3Npb24KICAgICAgICAgICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICAgICAgICAgIEtleSAgICAgICA9PiAkUGFyYW0tPntOYW1lfSwKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAkVmFsdWUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHVwZGF0ZSBwcmVmZXJlbmNlcwogICAgICAgICAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVtb1N5c3RlbScpICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntVc2VyT2JqZWN0fS0+U2V0UHJlZmVyZW5jZXMoCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBLZXkgICAgPT4gJFBhcmFtLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgID0+ICRWYWx1ZSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZGVsaXZlciBuZXcgY29udGVudCBwYWdlCiAgICAgICAgbXkgJUVsZW1lbnRSZWxvYWQgPSAkU2VsZi0+X0VsZW1lbnQoCiAgICAgICAgICAgIE5hbWUgICAgPT4gJE5hbWUsCiAgICAgICAgICAgIENvbmZpZ3MgPT4gJENvbmZpZywKICAgICAgICAgICAgQUpBWCAgICA9PiAxCiAgICAgICAgKTsKICAgICAgICBpZiAoICElRWxlbWVudFJlbG9hZCApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiQ2FuJ3QgZ2V0IGVsZW1lbnQgZGF0YSBvZiAkTmFtZSEiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9odG1sJywKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJHsgJEVsZW1lbnRSZWxvYWR7Q29udGVudH0gfSwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHVwZGF0ZSBzZXR0aW5ncwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1VwZGF0ZVNldHRpbmdzJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICBteSBAQmFja2VuZHMgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoIFBhcmFtID0+ICdCYWNrZW5kJyApOwogICAgICAgIGZvciBteSAkTmFtZSAoIHNvcnQga2V5cyAleyRDb25maWd9ICkgewogICAgICAgICAgICBteSAkQWN0aXZlID0gMDsKICAgICAgICAgICAgQkFDS0VORDoKICAgICAgICAgICAgZm9yIG15ICRCYWNrZW5kIChAQmFja2VuZHMpIHsKICAgICAgICAgICAgICAgIG5leHQgQkFDS0VORCBpZiAkQmFja2VuZCBuZSAkTmFtZTsKICAgICAgICAgICAgICAgICRBY3RpdmUgPSAxOwogICAgICAgICAgICAgICAgbGFzdCBCQUNLRU5EOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICRLZXkgPSAkVXNlclNldHRpbmdzS2V5IC4gJE5hbWU7CgogICAgICAgICAgICAjIHVwZGF0ZSBzc2Vzc2lvbgogICAgICAgICAgICAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICAgICAgS2V5ICAgICAgID0+ICRLZXksCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJEFjdGl2ZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgdXBkYXRlIHByZWZlcmVuY2VzCiAgICAgICAgICAgIGlmICggISRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZW1vU3lzdGVtJykgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1VzZXJPYmplY3R9LT5TZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIEtleSAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgICAgIFZhbHVlICA9PiAkQWN0aXZlLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJFVSTCA9ICJBY3Rpb249JFNlbGYtPntBY3Rpb259O0Rhc2hib2FyZD0iLiRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TGlua0VuY29kZSggJERhc2hib2FyZE5hbWUgKTsKICAgICAgICBpZiAoICRTZWxmLT57Q3VzdG9tZXJJRH0gKSB7CiAgICAgICAgICAgICRVUkwgLj0gIjtDdXN0b21lcklEPSIgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkxpbmtFbmNvZGUoICRTZWxmLT57Q3VzdG9tZXJJRH0gKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PiAkVVJMLAogICAgICAgICk7CiAgICB9CgogICAgIyB1cGRhdGUgcG9zaXRpb24KICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdVcGRhdGVQb3NpdGlvbicgKSB7CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgbXkgQEJhY2tlbmRzID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldEFycmF5KCBQYXJhbSA9PiAnQmFja2VuZCcgKTsKCiAgICAgICAgIyBnZXQgbmV3IG9yZGVyCiAgICAgICAgbXkgJEtleSAgPSAkVXNlclNldHRpbmdzS2V5IC4gJ1Bvc2l0aW9uJzsKICAgICAgICBteSAkRGF0YSA9ICcnOwogICAgICAgIGZvciBteSAkQmFja2VuZCAoQEJhY2tlbmRzKSB7CiAgICAgICAgICAgICRCYWNrZW5kID1+IHN7IFxBIERhc2hib2FyZCAoLis/KSAtYm94IFx6IH17JDF9Z3htczsKICAgICAgICAgICAgJERhdGEgLj0gJEJhY2tlbmQgLiAnOyc7CiAgICAgICAgfQoKICAgICAgICAjIHVwZGF0ZSBzc2Vzc2lvbgogICAgICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICAgICAgS2V5ICAgICAgID0+ICRLZXksCiAgICAgICAgICAgIFZhbHVlICAgICA9PiAkRGF0YSwKICAgICAgICApOwoKICAgICAgICAjIHVwZGF0ZSBwcmVmZXJlbmNlcwogICAgICAgIGlmICggISRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZW1vU3lzdGVtJykgKSB7CiAgICAgICAgICAgICRTZWxmLT57VXNlck9iamVjdH0tPlNldFByZWZlcmVuY2VzKAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIEtleSAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgVmFsdWUgID0+ICREYXRhLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzZW5kIHN1Y2Nlc3NmdWwgcmVzcG9uc2UKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9odG1sJywKICAgICAgICAgICAgQ2hhcnNldCAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAnMScsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGRlbGl2ZXIgZWxlbWVudAogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0VsZW1lbnQnICkgewoKICAgICAgICBteSAkTmFtZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ05hbWUnICk7CgogICAgICAgICMgZ2V0IHRoZSBjb2x1bW4gZmlsdGVycyBmcm9tIHRoZSB3ZWIgcmVxdWVzdAogICAgICAgIG15ICVDb2x1bW5GaWx0ZXI7CiAgICAgICAgbXkgJUdldENvbHVtbkZpbHRlcjsKICAgICAgICBteSAlR2V0Q29sdW1uRmlsdGVyU2VsZWN0OwoKICAgICAgICBDT0xVTU5OQU1FOgogICAgICAgIGZvciBteSAkQ29sdW1uTmFtZSAoCiAgICAgICAgICAgIHF3KE93bmVyIFJlc3BvbnNpYmxlIFN0YXRlIFF1ZXVlIFByaW9yaXR5IFR5cGUgTG9jayBTZXJ2aWNlIFNMQSBDdXN0b21lcklEIEN1c3RvbWVyVXNlcklEKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkRmlsdGVyVmFsdWUgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdDb2x1bW5GaWx0ZXInIC4gJENvbHVtbk5hbWUgLiAkTmFtZSApCiAgICAgICAgICAgICAgICB8fCAnJzsKICAgICAgICAgICAgbmV4dCBDT0xVTU5OQU1FIGlmICRGaWx0ZXJWYWx1ZSBlcSAnJzsKCiAgICAgICAgICAgIGlmICggJENvbHVtbk5hbWUgZXEgJ0N1c3RvbWVySUQnICkgewogICAgICAgICAgICAgICAgcHVzaCBAeyAkQ29sdW1uRmlsdGVyeyRDb2x1bW5OYW1lfSB9LCAkRmlsdGVyVmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkQ29sdW1uTmFtZSBlcSAnQ3VzdG9tZXJVc2VySUQnICkgewogICAgICAgICAgICAgICAgcHVzaCBAeyAkQ29sdW1uRmlsdGVye0N1c3RvbWVyVXNlckxvZ2lufSB9LCAkRmlsdGVyVmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBwdXNoIEB7ICRDb2x1bW5GaWx0ZXJ7ICRDb2x1bW5OYW1lIC4gJ0lEcycgfSB9LCAkRmlsdGVyVmFsdWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRHZXRDb2x1bW5GaWx0ZXJ7ICRDb2x1bW5OYW1lIC4gJE5hbWUgfSA9ICRGaWx0ZXJWYWx1ZTsKICAgICAgICAgICAgJEdldENvbHVtbkZpbHRlclNlbGVjdHskQ29sdW1uTmFtZX0gPSAkRmlsdGVyVmFsdWU7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBhbGwgZHluYW1pYyBmaWVsZHMKICAgICAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gPSAkU2VsZi0+e0R5bmFtaWNGaWVsZE9iamVjdH0tPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgICAgIFZhbGlkICAgICAgPT4gMSwKICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiBbJ1RpY2tldCddLAogICAgICAgICk7CgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX07CgogICAgICAgICAgICBteSAkRmlsdGVyVmFsdWUgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oCiAgICAgICAgICAgICAgICBQYXJhbSA9PiAnQ29sdW1uRmlsdGVyRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gLiAkTmFtZQogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIWRlZmluZWQgJEZpbHRlclZhbHVlOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkRmlsdGVyVmFsdWUgZXEgJyc7CgogICAgICAgICAgICAkQ29sdW1uRmlsdGVyeyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9IHsKICAgICAgICAgICAgICAgIEVxdWFscyA9PiAkRmlsdGVyVmFsdWUsCiAgICAgICAgICAgIH07CiAgICAgICAgICAgICRHZXRDb2x1bW5GaWx0ZXJ7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSAuICROYW1lIH0gPSAkRmlsdGVyVmFsdWU7CiAgICAgICAgICAgICRHZXRDb2x1bW5GaWx0ZXJTZWxlY3R7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJEZpbHRlclZhbHVlOwogICAgICAgIH0KCiAgICAgICAgbXkgJFNvcnRCeSAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdTb3J0QnknICk7CiAgICAgICAgbXkgJE9yZGVyQnkgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdPcmRlckJ5JyApOwoKICAgICAgICBteSAlRWxlbWVudCA9ICRTZWxmLT5fRWxlbWVudCgKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgID0+ICROYW1lLAogICAgICAgICAgICBDb25maWdzICAgICAgICAgICAgICAgPT4gJENvbmZpZywKICAgICAgICAgICAgQUpBWCAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFNvcnRCeSAgICAgICAgICAgICAgICA9PiAkU29ydEJ5LAogICAgICAgICAgICBPcmRlckJ5ICAgICAgICAgICAgICAgPT4gJE9yZGVyQnksCiAgICAgICAgICAgIENvbHVtbkZpbHRlciAgICAgICAgICA9PiBcJUNvbHVtbkZpbHRlciwKICAgICAgICAgICAgR2V0Q29sdW1uRmlsdGVyICAgICAgID0+IFwlR2V0Q29sdW1uRmlsdGVyLAogICAgICAgICAgICBHZXRDb2x1bW5GaWx0ZXJTZWxlY3QgPT4gXCVHZXRDb2x1bW5GaWx0ZXJTZWxlY3QsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJUVsZW1lbnQgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkNhbid0IGdldCBlbGVtZW50IGRhdGEgb2YgJE5hbWUhIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvaHRtbCcsCiAgICAgICAgICAgIENoYXJzZXQgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e1VzZXJDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJHsgJEVsZW1lbnR7Q29udGVudH0gfSwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGRlbGl2ZXIgZWxlbWVudAogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FKQVhGaWx0ZXJVcGRhdGUnICkgewoKICAgICAgICBteSAkRWxlbWVudENoYW5nZWQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdFbGVtZW50Q2hhbmdlZCcgKTsKICAgICAgICBteSAoJE5hbWUpICAgICAgICAgPSAkRWxlbWVudENoYW5nZWQgPX4gbXsgKCBcZHs0fSAtIC4qPyApIFx6IH1neG1zOwogICAgICAgIG15ICRDb2x1bW4gICAgICAgICA9ICRFbGVtZW50Q2hhbmdlZDsKICAgICAgICAkQ29sdW1uID1+IHN7IFxBIENvbHVtbkZpbHRlciB9e31neG1zOwogICAgICAgICRDb2x1bW4gPX4gc3sgJE5hbWUgfXt9Z3htczsKCiAgICAgICAgbXkgJEZpbHRlckNvbnRlbnQgPSAkU2VsZi0+X0VsZW1lbnQoCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgID0+ICROYW1lLAogICAgICAgICAgICBGaWx0ZXJDb250ZW50T25seSA9PiAxLAogICAgICAgICAgICBGaWx0ZXJDb2x1bW4gICAgICA9PiAkQ29sdW1uLAogICAgICAgICAgICBFbGVtZW50Q2hhbmdlZCAgICA9PiAkRWxlbWVudENoYW5nZWQsCiAgICAgICAgICAgIENvbmZpZ3MgICAgICAgICAgID0+ICRDb25maWcsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJEZpbHRlckNvbnRlbnQgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkNhbid0IGdldCBmaWx0ZXIgY29udGVudCBkYXRhIG9mICROYW1lISIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57Q2hhcnNldH0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRGaWx0ZXJDb250ZW50LAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwoKICAgIH0KCiAgICAjIHN0b3JlIGxhc3QgcXVldWUgc2NyZWVuCiAgICAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW5PdmVydmlldycsCiAgICAgICAgVmFsdWUgICAgID0+ICRTZWxmLT57UmVxdWVzdGVkVVJMfSwKICAgICk7CgogICAgIyBzaG93IGRhc2hib2FyZAogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdDb250ZW50JywKICAgICAgICBEYXRhID0+IHsKCQkJRGFzaGJvYXJkVGl0bGUJPT4gJERhc2hib2FyZFRpdGxlLAoJCQlEYXNoYm9hcmROYW1lCT0+ICREYXNoYm9hcmROYW1lLAoJCX0KICAgICk7CgogICAgIyBnZXQgc2hvd24gYmFja2VuZHMKICAgIG15ICVCYWNrZW5kczsKICAgIEJBQ0tFTkQ6CiAgICBmb3IgbXkgJE5hbWUgKCBzb3J0IGtleXMgJXskQ29uZmlnfSApIHsKCiAgICAgICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgICAgIGlmICggJENvbmZpZy0+eyROYW1lfS0+e0dyb3VwfSApIHsKICAgICAgICAgICAgbXkgJFBlcm1pc3Npb25PSyA9IDA7CiAgICAgICAgICAgIG15IEBHcm91cHMgPSBzcGxpdCAvOy8sICRDb25maWctPnskTmFtZX0tPntHcm91cH07CiAgICAgICAgICAgIEdST1VQOgogICAgICAgICAgICBmb3IgbXkgJEdyb3VwIChAR3JvdXBzKSB7CiAgICAgICAgICAgICAgICBteSAkUGVybWlzc2lvbiA9ICdVc2VySXNHcm91cFJvWycgLiAkR3JvdXAgLiAnXSc7CiAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJFNlbGYtPnskUGVybWlzc2lvbn0gJiYgJFNlbGYtPnskUGVybWlzc2lvbn0gZXEgJ1llcycgKSB7CiAgICAgICAgICAgICAgICAgICAgJFBlcm1pc3Npb25PSyA9IDE7CiAgICAgICAgICAgICAgICAgICAgbGFzdCBHUk9VUDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBuZXh0IEJBQ0tFTkQgaWYgISRQZXJtaXNzaW9uT0s7CiAgICAgICAgfQoKICAgICAgICBteSAkS2V5ID0gJFVzZXJTZXR0aW5nc0tleSAuICROYW1lOwogICAgICAgIGlmICggZGVmaW5lZCAkU2VsZi0+eyRLZXl9ICkgewogICAgICAgICAgICAkQmFja2VuZHN7JE5hbWV9ID0gJFNlbGYtPnskS2V5fTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRCYWNrZW5kc3skTmFtZX0gPSAkQ29uZmlnLT57JE5hbWV9LT57RGVmYXVsdH07CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IG9yZGVyIG9mIHBsdWdpbnMKICAgIG15ICRLZXkgPSAkVXNlclNldHRpbmdzS2V5IC4gJ1Bvc2l0aW9uJzsKICAgIG15IEBPcmRlcjsKICAgIG15ICRWYWx1ZSA9ICRTZWxmLT57JEtleX07CgogICAgaWYgKCRWYWx1ZSkgewogICAgICAgIEBPcmRlciA9IHNwbGl0IC87LywgJFZhbHVlOwoKICAgICAgICAjIG9ubHkgdXNlIGFjdGl2ZSBiYWNrZW5kcwogICAgICAgIEBPcmRlciA9IGdyZXAgeyAkQ29uZmlnLT57JF99IH0gQE9yZGVyOwogICAgfQogICAgaWYgKCAhQE9yZGVyICkgewogICAgICAgIGZvciBteSAkTmFtZSAoIHNvcnQga2V5cyAlQmFja2VuZHMgKSB7CiAgICAgICAgICAgIHB1c2ggQE9yZGVyLCAkTmFtZTsKICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgbm90IG9yZGVyZWQgcGx1Z2lucyAoZS4gZy4gbmV3IGFjdGl2ZSkKICAgIE5BTUU6CiAgICBmb3IgbXkgJE5hbWUgKCBzb3J0IGtleXMgJUJhY2tlbmRzICkgewogICAgICAgIG15ICRJbmNsdWRlZCA9IDA7CiAgICAgICAgSVRFTToKICAgICAgICBmb3IgbXkgJEl0ZW0gKEBPcmRlcikgewogICAgICAgICAgICBuZXh0IElURU0gaWYgJEl0ZW0gbmUgJE5hbWU7CiAgICAgICAgICAgICRJbmNsdWRlZCA9IDE7CiAgICAgICAgfQogICAgICAgIG5leHQgTkFNRSBpZiAkSW5jbHVkZWQ7CiAgICAgICAgcHVzaCBAT3JkZXIsICROYW1lOwogICAgfQoKICAgICMgdHJ5IGV2ZXJ5IGJhY2tlbmQgdG8gbG9hZCBhbmQgZXhlY3V0ZSBpdAogICAgTkFNRToKICAgIGZvciBteSAkTmFtZSAoQE9yZGVyKSB7CgogICAgICAgICMgZ2V0IGVsZW1lbnQgZGF0YQogICAgICAgIG15ICVFbGVtZW50ID0gJFNlbGYtPl9FbGVtZW50KAogICAgICAgICAgICBOYW1lICAgICA9PiAkTmFtZSwKICAgICAgICAgICAgQ29uZmlncyAgPT4gJENvbmZpZywKICAgICAgICAgICAgQmFja2VuZHMgPT4gXCVCYWNrZW5kcywKICAgICAgICApOwogICAgICAgIG5leHQgTkFNRSBpZiAhJUVsZW1lbnQ7CgogICAgICAgICMgTmFtZUZvcm0gKHRvIHN1cHBvcnQgSUUsIGlzIG5vdCB3b3JraW5nIHdpdGggIi0iIGluIGZvcm0gbmFtZXMpCiAgICAgICAgbXkgJE5hbWVGb3JtID0gJE5hbWU7CiAgICAgICAgJE5hbWVGb3JtID1+IHN7LX17fWc7CgogICAgICAgICMgcmVuZGVyaW5nCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAkRWxlbWVudHtDb25maWd9LT57QmxvY2t9LAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7ICRFbGVtZW50e0NvbmZpZ30gfSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJE5hbWUsCiAgICAgICAgICAgICAgICBOYW1lRm9ybSAgID0+ICROYW1lRm9ybSwKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgPT4gJHsgJEVsZW1lbnR7Q29udGVudH0gfSwKICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJFNlbGYtPntDdXN0b21lcklEfSB8fCAnJywKCQkJCURhc2hib2FyZE5hbWUJPT4gJERhc2hib2FyZE5hbWUsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IHNldHRpbmdzIGxpbmsgaWYgcHJlZmVyZW5jZXMgYXJlIGF2YWlsYWJsZQogICAgICAgIGlmICggJEVsZW1lbnR7UHJlZmVyZW5jZXN9ICYmIEB7ICRFbGVtZW50e1ByZWZlcmVuY2VzfSB9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAkRWxlbWVudHtDb25maWd9LT57QmxvY2t9IC4gJ1ByZWZlcmVuY2VzJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICV7ICRFbGVtZW50e0NvbmZpZ30gfSwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICA9PiAkTmFtZSwKICAgICAgICAgICAgICAgICAgICBOYW1lRm9ybSA9PiAkTmFtZUZvcm0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICBQQVJBTToKICAgICAgICAgICAgZm9yIG15ICRQYXJhbSAoIEB7ICRFbGVtZW50e1ByZWZlcmVuY2VzfSB9ICkgewoKICAgICAgICAgICAgICAgICMgc3BlY2lhbCBwYXJhbWV0ZXJzIGFyZSBhZGRlZCwgd2hpY2ggZG8gbm90IGhhdmUgYSBkdGwgYmxvY2ssCiAgICAgICAgICAgICAgICAjIGJlY2F1c2UgdGhlIGRpc3BsYXllZCBmaWVsZHMgYXJlIGFkZGVkIHdpdGggdGhlIG91dHB1dCBmaWx0ZXIsCiAgICAgICAgICAgICAgICAjIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2FsbCBhbnkgYmxvY2sgaGVyZQogICAgICAgICAgICAgICAgbmV4dCBQQVJBTSBpZiAhJFBhcmFtLT57QmxvY2t9OwoKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkRWxlbWVudHtDb25maWd9LT57QmxvY2t9IC4gJ1ByZWZlcmVuY2VzSXRlbScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICV7ICRFbGVtZW50e0NvbmZpZ30gfSwKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgPT4gJE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVGb3JtID0+ICROYW1lRm9ybSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJFBhcmFtLT57QmxvY2t9IGVxICdPcHRpb24nICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbS0+e09wdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkUGFyYW0tPntEYXRhfSwKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJFBhcmFtLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRQYXJhbS0+e1NlbGVjdGVkSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAkUGFyYW0tPntUcmFuc2xhdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkRWxlbWVudHtDb25maWd9LT57QmxvY2t9IC4gJ1ByZWZlcmVuY2VzSXRlbScgLiAkUGFyYW0tPntCbG9ja30sCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICV7ICRFbGVtZW50e0NvbmZpZ30gfSwKICAgICAgICAgICAgICAgICAgICAgICAgJXskUGFyYW19LAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICA9PiAkU2VsZi0+eyAkUGFyYW0tPntOYW1lfSB9LAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lUHJlZiA9PiAkUGFyYW0tPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgPT4gJE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVGb3JtID0+ICROYW1lRm9ybSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBtb3JlIGxpbmsKICAgICAgICBpZiAoICRFbGVtZW50e0NvbmZpZ30tPntMaW5rfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJEVsZW1lbnR7Q29uZmlnfS0+e0Jsb2NrfSAuICdNb3JlJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICV7ICRFbGVtZW50e0NvbmZpZ30gfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgYnVpbGQgbWFpbiBtZW51CiAgICBteSAkTWFpbk1lbnVDb25maWcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgkTWFpbk1lbnVDb25maWdLZXkpOwogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkTWFpbk1lbnVDb25maWcpICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ01haW5NZW51JyApOwoKICAgICAgICBmb3IgbXkgJE1haW5NZW51SXRlbSAoIHNvcnQga2V5cyAleyRNYWluTWVudUNvbmZpZ30gKSB7CgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTWFpbk1lbnVJdGVtJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICV7ICRNYWluTWVudUNvbmZpZy0+eyRNYWluTWVudUl0ZW19IH0sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAkU2VsZi0+e0N1c3RvbWVySUR9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgdHJhbnNsYXRpb25zIGZvciB0aGUgYWxsb2NhdGlvbiBsaXN0cyBmb3IgcmVndWxhciBjb2x1bW5zCiAgICBteSAkQ29sdW1ucyA9ICRTZWxmLT57Q29uZmlnfS0+e0RlZmF1bHRDb2x1bW5zfSB8fCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdE92ZXJ2aWV3Q29sdW1ucycpIHx8IHt9OwogICAgaWYgKCAkQ29sdW1ucyAmJiBJc0hhc2hSZWZXaXRoRGF0YSgkQ29sdW1ucykgKSB7CgogICAgICAgIENPTFVNTjoKICAgICAgICBmb3IgbXkgJENvbHVtbiAoIHNvcnQga2V5cyAleyRDb2x1bW5zfSApIHsKCiAgICAgICAgICAgICMgZHluYW1pYyBmaWVsZHMgd2lsbCBiZSB0cmFuc2xhdGVkIGluIHRoZSBuZXh0IGJsb2NrCiAgICAgICAgICAgIG5leHQgQ09MVU1OIGlmICRDb2x1bW4gPX4gbXsgXEEgRHluYW1pY0ZpZWxkXyB9eG1zOwoKICAgICAgICAgICAgbXkgJFRyYW5zbGF0ZWRXb3JkID0gJENvbHVtbjsKICAgICAgICAgICAgaWYgKCAkQ29sdW1uIGVxICdFc2NhbGF0aW9uVGltZScgKSB7CiAgICAgICAgICAgICAgICAkVHJhbnNsYXRlZFdvcmQgPSAnU2VydmljZSBUaW1lJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRDb2x1bW4gZXEgJ0VzY2FsYXRpb25SZXNwb25zZVRpbWUnICkgewogICAgICAgICAgICAgICAgJFRyYW5zbGF0ZWRXb3JkID0gJ0ZpcnN0IFJlc3BvbnNlIFRpbWUnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJENvbHVtbiBlcSAnRXNjYWxhdGlvblNvbHV0aW9uVGltZScgKSB7CiAgICAgICAgICAgICAgICAkVHJhbnNsYXRlZFdvcmQgPSAnU29sdXRpb24gVGltZSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkQ29sdW1uIGVxICdFc2NhbGF0aW9uVXBkYXRlVGltZScgKSB7CiAgICAgICAgICAgICAgICAkVHJhbnNsYXRlZFdvcmQgPSAnVXBkYXRlIFRpbWUnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJENvbHVtbiBlcSAnUGVuZGluZ1RpbWUnICkgewogICAgICAgICAgICAgICAgJFRyYW5zbGF0ZWRXb3JkID0gJ1BlbmRpbmcgdGlsbCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDb2x1bW5UcmFuc2xhdGlvbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBDb2x1bW5OYW1lICAgICAgPT4gJENvbHVtbiwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGVTdHJpbmcgPT4gJFRyYW5zbGF0ZWRXb3JkLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NvbHVtblRyYW5zbGF0aW9uU2VwYXJhdG9yJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgdHJhbnNsYXRpb25zIGZvciB0aGUgYWxsb2NhdGlvbiBsaXN0cyBmb3IgZHluYW1pYyBmaWVsZCBjb2x1bW5zCiAgICBteSAkQ29sdW1uc0R5bmFtaWNGaWVsZCA9ICRTZWxmLT57RHluYW1pY0ZpZWxkT2JqZWN0fS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgID0+IDAsCiAgICAgICAgT2JqZWN0VHlwZSA9PiBbJ1RpY2tldCddLAogICAgKTsKCiAgICBpZiAoICRDb2x1bW5zRHluYW1pY0ZpZWxkICYmIElzQXJyYXlSZWZXaXRoRGF0YSgkQ29sdW1uc0R5bmFtaWNGaWVsZCkgKSB7CgogICAgICAgIG15ICRDb3VudGVyID0gMDsKCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkICggc29ydCBAeyRDb2x1bW5zRHluYW1pY0ZpZWxkfSApIHsKCiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkOwoKICAgICAgICAgICAgJENvdW50ZXIrKzsKCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDb2x1bW5UcmFuc2xhdGlvbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBDb2x1bW5OYW1lICAgICAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZC0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0ZVN0cmluZyA9PiAkRHluYW1pY0ZpZWxkLT57TGFiZWx9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggJENvdW50ZXIgPCBzY2FsYXIgQHskQ29sdW1uc0R5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NvbHVtblRyYW5zbGF0aW9uU2VwYXJhdG9yJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoICBUaXRsZSA9PiAkRGFzaGJvYXJkVGl0bGUgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0KICAgICk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIF9FbGVtZW50IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJE5hbWUgICAgICAgICAgICAgICAgICA9ICRQYXJhbXtOYW1lfTsKICAgIG15ICRDb25maWdzICAgICAgICAgICAgICAgPSAkUGFyYW17Q29uZmlnc307CiAgICBteSAkQmFja2VuZHMgICAgICAgICAgICAgID0gJFBhcmFte0JhY2tlbmRzfTsKICAgIG15ICRTb3J0QnkgICAgICAgICAgICAgICAgPSAkUGFyYW17U29ydEJ5fTsKICAgIG15ICRPcmRlckJ5ICAgICAgICAgICAgICAgPSAkUGFyYW17T3JkZXJCeX07CiAgICBteSAkQ29sdW1uRmlsdGVyICAgICAgICAgID0gJFBhcmFte0NvbHVtbkZpbHRlcn07CiAgICBteSAkR2V0Q29sdW1uRmlsdGVyICAgICAgID0gJFBhcmFte0dldENvbHVtbkZpbHRlcn07CiAgICBteSAkR2V0Q29sdW1uRmlsdGVyU2VsZWN0ID0gJFBhcmFte0dldENvbHVtbkZpbHRlclNlbGVjdH07CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgaWYgKCAkQ29uZmlncy0+eyROYW1lfS0+e0dyb3VwfSApIHsKICAgICAgICBteSAkUGVybWlzc2lvbk9LID0gMDsKICAgICAgICBteSBAR3JvdXBzID0gc3BsaXQgLzsvLCAkQ29uZmlncy0+eyROYW1lfS0+e0dyb3VwfTsKICAgICAgICBHUk9VUDoKICAgICAgICBmb3IgbXkgJEdyb3VwIChAR3JvdXBzKSB7CiAgICAgICAgICAgIG15ICRQZXJtaXNzaW9uID0gJ1VzZXJJc0dyb3VwUm9bJyAuICRHcm91cCAuICddJzsKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRTZWxmLT57JFBlcm1pc3Npb259ICYmICRTZWxmLT57JFBlcm1pc3Npb259IGVxICdZZXMnICkgewogICAgICAgICAgICAgICAgJFBlcm1pc3Npb25PSyA9IDE7CiAgICAgICAgICAgICAgICBsYXN0IEdST1VQOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBpZiAhJFBlcm1pc3Npb25PSzsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZHMKICAgIG15ICRNb2R1bGUgPSAkQ29uZmlncy0+eyROYW1lfS0+e01vZHVsZX07CiAgICByZXR1cm4gaWYgISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJE1vZHVsZSk7CiAgICBteSAkT2JqZWN0ID0gJE1vZHVsZS0+bmV3KAogICAgICAgICV7JFNlbGZ9LAogICAgICAgIERCT2JqZWN0ICAgICAgICAgICAgICA9PiAkU2VsZi0+e1NsYXZlREJPYmplY3R9LAogICAgICAgIFRpY2tldE9iamVjdCAgICAgICAgICA9PiAkU2VsZi0+e1NsYXZlVGlja2V0T2JqZWN0fSwKICAgICAgICBDb25maWcgICAgICAgICAgICAgICAgPT4gJENvbmZpZ3MtPnskTmFtZX0sCiAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgID0+ICROYW1lLAogICAgICAgIEN1c3RvbWVySUQgICAgICAgICAgICA9PiAkU2VsZi0+e0N1c3RvbWVySUR9IHx8ICcnLAogICAgICAgIFNvcnRCeSAgICAgICAgICAgICAgICA9PiAkU29ydEJ5LAogICAgICAgIE9yZGVyQnkgICAgICAgICAgICAgICA9PiAkT3JkZXJCeSwKICAgICAgICBDb2x1bW5GaWx0ZXIgICAgICAgICAgPT4gJENvbHVtbkZpbHRlciwKICAgICAgICBHZXRDb2x1bW5GaWx0ZXIgICAgICAgPT4gJEdldENvbHVtbkZpbHRlciwKICAgICAgICBHZXRDb2x1bW5GaWx0ZXJTZWxlY3QgPT4gJEdldENvbHVtbkZpbHRlclNlbGVjdCwKCiAgICApOwoKICAgICMgZ2V0IG1vZHVsZSBjb25maWcKICAgIG15ICVDb25maWcgPSAkT2JqZWN0LT5Db25maWcoKTsKCiAgICAjIGdldCBtb2R1bGUgcHJlZmVyZW5jZXMKICAgIG15IEBQcmVmZXJlbmNlcyA9ICRPYmplY3QtPlByZWZlcmVuY2VzKCk7CiAgICByZXR1cm4gQFByZWZlcmVuY2VzIGlmICRQYXJhbXtQcmVmZXJlbmNlc09ubHl9OwoKICAgIGlmICggJFBhcmFte0ZpbHRlckNvbnRlbnRPbmx5fSApIHsKICAgICAgICBteSAkRmlsdGVyQ29udGVudCA9ICRPYmplY3QtPkZpbHRlckNvbnRlbnQoCiAgICAgICAgICAgIEZpbHRlckNvbHVtbiA9PiAkUGFyYW17RmlsdGVyQ29sdW1ufSwKICAgICAgICAgICAgQ29uZmlnICAgICAgID0+ICRDb25maWdzLT57JE5hbWV9LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJE5hbWUsCiAgICAgICAgICAgIEN1c3RvbWVySUQgICA9PiAkU2VsZi0+e0N1c3RvbWVySUR9IHx8ICcnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRGaWx0ZXJDb250ZW50OwogICAgfQoKICAgICMgYWRkIGJhY2tlbmQgdG8gc2V0dGluZ3Mgc2VsZWN0aW9uCiAgICBpZiAoJEJhY2tlbmRzKSB7CiAgICAgICAgbXkgJENoZWNrZWQgPSAnJzsKICAgICAgICBpZiAoICRCYWNrZW5kcy0+eyROYW1lfSApIHsKICAgICAgICAgICAgJENoZWNrZWQgPSAnY2hlY2tlZD0iY2hlY2tlZCInOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDb250ZW50U2V0dGluZ3MnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVDb25maWcsCiAgICAgICAgICAgICAgICBOYW1lICAgID0+ICROYW1lLAogICAgICAgICAgICAgICAgQ2hlY2tlZCA9PiAkQ2hlY2tlZCwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIHJldHVybiBpZiAhJEJhY2tlbmRzLT57JE5hbWV9OwogICAgfQoKICAgICMgY2hlY2sgYmFja2VuZHMgY2FjaGUgKGh0bWwgcGFnZSBjYWNoZSkKICAgIG15ICRDb250ZW50OwogICAgbXkgJENhY2hlS2V5ID0gJENvbmZpZ3tDYWNoZUtleX07CiAgICBpZiAoICEkQ2FjaGVLZXkgKSB7CiAgICAgICAgJENhY2hlS2V5ID0gJE5hbWUgLiAnLScKICAgICAgICAgICAgLiAoICRTZWxmLT57Q3VzdG9tZXJJRH0gfHwgJycgKSAuICctJwogICAgICAgICAgICAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e1VzZXJMYW5ndWFnZX07CiAgICB9CiAgICBpZiAoICRDb25maWd7Q2FjaGVUVEx9ICkgewogICAgICAgICRDb250ZW50ID0gJFNlbGYtPntDYWNoZU9iamVjdH0tPkdldCgKICAgICAgICAgICAgVHlwZSA9PiAnRGFzaGJvYXJkJywKICAgICAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGV4ZWN1dGUgYmFja2VuZHMKICAgIG15ICRDYWNoZVVzZWQgPSAxOwogICAgaWYgKCAhZGVmaW5lZCAkQ29udGVudCB8fCAkU29ydEJ5ICkgewogICAgICAgICRDYWNoZVVzZWQgPSAwOwogICAgICAgICRDb250ZW50ICAgPSAkT2JqZWN0LT5SdW4oCiAgICAgICAgICAgIEFKQVggICAgICAgPT4gJFBhcmFte0FKQVh9LAogICAgICAgICAgICBDdXN0b21lcklEID0+ICRTZWxmLT57Q3VzdG9tZXJJRH0gfHwgJycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIGNvbnRlbnQgc2hvdWxkIGJlIHNob3duCiAgICByZXR1cm4gaWYgISRDb250ZW50OwoKICAgICMgc2V0IGNhY2hlIChodG1sIHBhZ2UgY2FjaGUpCiAgICBpZiAoICEkQ2FjaGVVc2VkICYmICRDb25maWd7Q2FjaGVUVEx9ICkgewogICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICdEYXNoYm9hcmQnLAogICAgICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgICAgIFZhbHVlID0+ICRDb250ZW50LAogICAgICAgICAgICBUVEwgICA9PiAkQ29uZmlne0NhY2hlVFRMfSAqIDYwLAogICAgICAgICk7CiAgICB9CgogICAgIyByZXR1cm4gcmVzdWx0CiAgICByZXR1cm4gKAogICAgICAgIENvbnRlbnQgICAgID0+IFwkQ29udGVudCwKICAgICAgICBDb25maWcgICAgICA9PiBcJUNvbmZpZywKICAgICAgICBQcmVmZXJlbmNlcyA9PiBcQFByZWZlcmVuY2VzLAogICAgKTsKfQoKMTsK
IyAtLQojIEFnZW50TXVsdGlwbGVEYXNoYm9hcmRzLnR0IC0gYSBtb2RpZmljYXRpb24gb2YgQWdlbnREYXNoYm9hcmRDb21tb24gZm9yIG11bHRpcGxlIGRhc2hib2FyZHMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNSBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE0LTIwMTUgR2V0Q29uIEdtYkgsIGh0dHA6Ly93d3cuZ2V0Y29uLWdtYmguZGUvCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDb250ZW50IikgJV0KPGRpdiBjbGFzcz0iTWFpbkJveCBBUklBUm9sZU1haW4gTGF5b3V0Rml4ZWRTaWRlYmFyIFNpZGViYXJMYXN0Ij4KICAgIDxoMT5bJSBUcmFuc2xhdGUoIERhdGEuRGFzaGJvYXJkVGl0bGUgKSB8IGh0bWwgJV08L2gxPgoKPGRpdiBjbGFzcz0iU2lkZWJhckNvbHVtbiI+CiAgICA8ZGl2IGNsYXNzPSJEb250UHJpbnQgV2lkZ2V0U2ltcGxlIENvbGxhcHNlZCBBbmltYXRlIFNldHRpbmdzV2lkZ2V0Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gVG9nZ2xlIj4KICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNob3cgb3IgaGlkZSB0aGUgY29udGVudCIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LXJpZ2h0Ij48L2k+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LWRvd24iPjwvaT48L2E+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJTZXR0aW5ncyIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlVwZGF0ZVNldHRpbmdzIi8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJDdXN0b21lcklEIiB2YWx1ZT0iWyUgRGF0YS5DdXN0b21lcklEIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRGFzaGJvYXJkIiB2YWx1ZT0iWyUgRGF0YS5EYXNoYm9hcmROYW1lIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgPHVsPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDb250ZW50U2V0dGluZ3MiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLkRlc2NyaXB0aW9uKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU2V0dGluZ3NbJSBEYXRhLk5hbWUgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9IkJhY2tlbmQiIGlkPSJTZXR0aW5nc1slIERhdGEuTmFtZSB8IGh0bWwgJV0iIHZhbHVlPSJbJSBEYXRhLk5hbWUgfCBodG1sICVdIiBbJSBEYXRhLkNoZWNrZWQgJV0vPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZShEYXRhLlRpdGxlKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiQ29udGVudFNldHRpbmdzIikgJV0KICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJCdXR0b25zIE5vTWFyZ2luIj4KICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJCdXR0b24gQ2FsbEZvckFjdGlvbiIgYWNjZXNza2V5PSJnIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTYXZlIHNldHRpbmdzIikgfCBodG1sICVdIChnKSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJTYXZlIikgfCBodG1sICVdIj48c3Bhbj5bJSBUcmFuc2xhdGUoIlNhdmUgc2V0dGluZ3MiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9mb3JtPgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDb250ZW50U21hbGwiKSAlXQogICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIENhbkRyYWciIGlkPSJEYXNoYm9hcmRbJSBEYXRhLk5hbWUgfCBodG1sICVdLWJveCI+CiAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQWN0aW9uTWVudSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkNvbnRlbnRTbWFsbFByZWZlcmVuY2VzIikgJV0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldEFjdGlvbiBTZXR0aW5ncyI+CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9IkRhc2hib2FyZFslIERhdGEuTmFtZSB8IGh0bWwgJV0tdG9nZ2xlIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTZXR0aW5ncyIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1jb2ciPjwvaT4KICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKQ29yZS5VSS5SZWdpc3RlclRvZ2dsZVR3b0NvbnRhaW5lcigkKCcjRGFzaGJvYXJkWyUgRGF0YS5OYW1lIHwgaHRtbCAlXS10b2dnbGUnKSwgJCgnI0Rhc2hib2FyZFslIERhdGEuTmFtZSB8IGh0bWwgJV0tc2V0dGluZycpLCAkKCcjRGFzaGJvYXJkWyUgRGF0YS5OYW1lIHwgaHRtbCAlXScpKTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrRW5kKCJDb250ZW50U21hbGxQcmVmZXJlbmNlcyIpICVdCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gQ2xvc2UiPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1VcGRhdGVSZW1vdmU7RGFzaGJvYXJkPVslIERhdGEuRGFzaGJvYXJkTmFtZSB8IHVyaSAlXTtOYW1lPVslIERhdGEuTmFtZSB8IHVyaSAlXTtDdXN0b21lcklEPVslIERhdGEuQ3VzdG9tZXJJRCB8IHVyaSAlXTtbJSBFbnYoIkNoYWxsZW5nZVRva2VuUGFyYW0iKSB8IGh0bWwgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkNsb3NlIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXRpbWVzIj48L2k+CiAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8aDIgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLkRlc2NyaXB0aW9uKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLlRpdGxlKSB8IGh0bWwgJV08L2gyPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICA8ZGl2IGlkPSJEYXNoYm9hcmRbJSBEYXRhLk5hbWUgfCBodG1sICVdLXNldHRpbmciIGNsYXNzPSJIaWRkZW4iPgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9IkRhc2hib2FyZFslIERhdGEuTmFtZUZvcm0gfCBodG1sICVdX3NldHRpbmdfZm9ybSIgaWQ9IkRhc2hib2FyZFslIERhdGEuTmFtZUZvcm0gfCBodG1sICVdX3NldHRpbmdfZm9ybSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlVwZGF0ZVByZWZlcmVuY2VzIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iTmFtZSIgdmFsdWU9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iLz4KCQkJCQk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJEYXNoYm9hcmQiIHZhbHVlPSJbJSBEYXRhLkRhc2hib2FyZE5hbWUgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ3VzdG9tZXJJRCIgdmFsdWU9IlslIERhdGEuQ3VzdG9tZXJJRCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBEb250UHJpbnQiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDb250ZW50U21hbGxQcmVmZXJlbmNlc0l0ZW0iKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDb250ZW50U21hbGxQcmVmZXJlbmNlc0l0ZW1PcHRpb24iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJbJSBEYXRhLk5hbWVQcmVmIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuRGVzYykgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIERvbnRQcmludCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLk9wdGlvbiAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQ29udGVudFNtYWxsUHJlZmVyZW5jZXNJdGVtT3B0aW9uIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ29udGVudFNtYWxsUHJlZmVyZW5jZXNJdGVtSW5wdXQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9IkRvbnRQcmludCIgZm9yPSJbJSBEYXRhLk5hbWVQcmVmIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuRGVzYykgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIERvbnRQcmludCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9IlcxMDBwYyIgbmFtZT0iWyUgRGF0YS5OYW1lUHJlZiB8IGh0bWwgJV0iIHZhbHVlPSJbJSBEYXRhLkRhdGEgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJDb250ZW50U21hbGxQcmVmZXJlbmNlc0l0ZW1JbnB1dCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkNvbnRlbnRTbWFsbFByZWZlcmVuY2VzSXRlbVRleHRBcmVhIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJEb250UHJpbnQiIGZvcj0iWyUgRGF0YS5OYW1lUHJlZiB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLkRlc2MpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBEb250UHJpbnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIHJvd3M9IlslIERhdGEuUm93cyB8IGh0bWwgJV0iIGNvbHM9IlslIERhdGEuQ29scyB8IGh0bWwgJV0iIG5hbWU9IlslIERhdGEuTmFtZVByZWYgfCBodG1sICVdIj5bJSBEYXRhLkRhdGEgfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkNvbnRlbnRTbWFsbFByZWZlcmVuY2VzSXRlbVRleHRBcmVhIikgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIkNvbnRlbnRTbWFsbFByZWZlcmVuY2VzSXRlbSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9IkRhc2hib2FyZFslIERhdGEuTmFtZSB8IGh0bWwgJV1fc3VibWl0IiBjbGFzcz0iYnV0dG9uIERvbnRQcmludCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9IkRhc2hib2FyZFslIERhdGEuTmFtZSB8IGh0bWwgJV1fY2FuY2VsIiBjbGFzcz0iYnV0dG9uIERvbnRQcmludCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJDYW5jZWwiKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZSgiQ2FuY2VsIikgfCBodG1sICVdPC9idXR0b24+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCkNvcmUuQWdlbnQuRGFzaGJvYXJkLlJlZ2lzdGVyVXBkYXRlUHJlZmVyZW5jZXMoJCgnI0Rhc2hib2FyZFslIERhdGEuTmFtZSB8IGh0bWwgJV1fc3VibWl0JyksICdEYXNoYm9hcmRbJSBEYXRhLk5hbWUgfCBodG1sICVdJywgJCgnI0Rhc2hib2FyZFslIERhdGEuTmFtZUZvcm0gfCBodG1sICVdX3NldHRpbmdfZm9ybScpKTsKQ29yZS5VSS5SZWdpc3RlclRvZ2dsZVR3b0NvbnRhaW5lcigkKCcjRGFzaGJvYXJkWyUgRGF0YS5OYW1lIHwgaHRtbCAlXV9jYW5jZWwnKSwgJCgnI0Rhc2hib2FyZFslIERhdGEuTmFtZSB8IGh0bWwgJV0tc2V0dGluZycpLCAkKCcjRGFzaGJvYXJkWyUgRGF0YS5OYW1lIHwgaHRtbCAlXScpKTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgaWQ9IkRhc2hib2FyZFslIERhdGEuTmFtZSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgWyUgRGF0YS5Db250ZW50ICVdCiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDb250ZW50U21hbGxNb3JlIikgJV0KICAgICAgICAgICAgPGEgaHJlZj0iWyUgRGF0YS5MaW5rICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuTGlua1RpdGxlKSB8IGh0bWwgJV0iIGNsYXNzPSJzbWFsbCI+WyUgVHJhbnNsYXRlKCJtb3JlIikgfCBodG1sICVdICYjMTg3OzwvYT4KWyUgUmVuZGVyQmxvY2tFbmQoIkNvbnRlbnRTbWFsbE1vcmUiKSAlXQogICAgICAgIDwvZGl2PgogICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJDb250ZW50U21hbGwiKSAlXQo8L2Rpdj4KCjxkaXYgY2xhc3M9IkNvbnRlbnRDb2x1bW4iPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiTWFpbk1lbnUiKSAlXQogICAgPGRpdiBjbGFzcz0iQWN0aW9uUm93IFNwYWNpbmdCb3R0b20iPgogICAgICAgIDx1bCBjbGFzcz0iQWN0aW9ucyI+ClslIFJlbmRlckJsb2NrU3RhcnQoIk1haW5NZW51SXRlbSIpICVdCiAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIERhdGEuTGluayAlXSI+CiAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdCiAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJNYWluTWVudUl0ZW0iKSAlXQogICAgICAgIDwvdWw+CiAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJNYWluTWVudSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDb250ZW50TGFyZ2UiKSAlXQogICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIENhbkRyYWciIGlkPSJEYXNoYm9hcmRbJSBEYXRhLk5hbWUgfCBodG1sICVdLWJveCI+CiAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQWN0aW9uTWVudSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkNvbnRlbnRMYXJnZVByZWZlcmVuY2VzIikgJV0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldEFjdGlvbiBTZXR0aW5ncyI+CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9IkRhc2hib2FyZFslIERhdGEuTmFtZSB8IGh0bWwgJV0tdG9nZ2xlIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTZXR0aW5ncyIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1jb2ciPjwvaT4KICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKQ29yZS5VSS5SZWdpc3RlclRvZ2dsZVR3b0NvbnRhaW5lcigkKCcjRGFzaGJvYXJkWyUgRGF0YS5OYW1lIHwgaHRtbCAlXS10b2dnbGUnKSwgJCgnI0Rhc2hib2FyZFslIERhdGEuTmFtZSB8IGh0bWwgJV0tc2V0dGluZycpLCAkKCcjRGFzaGJvYXJkWyUgRGF0YS5OYW1lIHwgaHRtbCAlXScpKTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrRW5kKCJDb250ZW50TGFyZ2VQcmVmZXJlbmNlcyIpICVdCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gQ2xvc2UiPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1VcGRhdGVSZW1vdmU7RGFzaGJvYXJkPVslIERhdGEuRGFzaGJvYXJkTmFtZSB8IHVyaSAlXTtOYW1lPVslIERhdGEuTmFtZSB8IHVyaSAlXTtDdXN0b21lcklEPVslIERhdGEuQ3VzdG9tZXJJRCB8IHVyaSAlXTtbJSBFbnYoIkNoYWxsZW5nZVRva2VuUGFyYW0iKSB8IGh0bWwgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkNsb3NlIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXRpbWVzIj48L2k+CiAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8aDIgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLkRlc2NyaXB0aW9uKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLlRpdGxlKSB8IGh0bWwgJV08L2gyPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgPGRpdiBpZD0iRGFzaGJvYXJkWyUgRGF0YS5OYW1lIHwgaHRtbCAlXS1zZXR0aW5nIiBjbGFzcz0iSGlkZGVuIj4KICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJEYXNoYm9hcmRbJSBEYXRhLk5hbWVGb3JtIHwgaHRtbCAlXV9zZXR0aW5nX2Zvcm0iIGlkPSJEYXNoYm9hcmRbJSBEYXRhLk5hbWVGb3JtIHwgaHRtbCAlXV9zZXR0aW5nX2Zvcm0iIGNsYXNzPSJXaWRnZXRTZXR0aW5nc0Zvcm0iPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJVcGRhdGVQcmVmZXJlbmNlcyIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Ik5hbWUiIHZhbHVlPSJbJSBEYXRhLk5hbWUgfCBodG1sICVdIi8+CgkJCQkJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRGFzaGJvYXJkIiB2YWx1ZT0iWyUgRGF0YS5EYXNoYm9hcmROYW1lIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkN1c3RvbWVySUQiIHZhbHVlPSJbJSBEYXRhLkN1c3RvbWVySUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbFNtYWxsIERvbnRQcmludCI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkNvbnRlbnRMYXJnZVByZWZlcmVuY2VzSXRlbSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkNvbnRlbnRMYXJnZVByZWZlcmVuY2VzSXRlbU9wdGlvbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iRG9udFByaW50IiBmb3I9IlslIERhdGEuTmFtZVByZWYgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5EZXNjKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRG9udFByaW50IEZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuT3B0aW9uICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJDb250ZW50TGFyZ2VQcmVmZXJlbmNlc0l0ZW1PcHRpb24iKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDb250ZW50TGFyZ2VQcmVmZXJlbmNlc0l0ZW1JbnB1dCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iRG9udFByaW50IiBmb3I9IlslIERhdGEuTmFtZVByZWYgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5EZXNjKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgRG9udFByaW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iVzIwcGMiIG5hbWU9IlslIERhdGEuTmFtZVByZWYgfCBodG1sICVdIiB2YWx1ZT0iWyUgRGF0YS5EYXRhIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQ29udGVudExhcmdlUHJlZmVyZW5jZXNJdGVtSW5wdXQiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDb250ZW50TGFyZ2VQcmVmZXJlbmNlc0l0ZW1UZXh0QXJlYSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iRG9udFByaW50IiBmb3I9IlslIERhdGEuTmFtZVByZWYgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5EZXNjKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgRG9udFByaW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSByb3dzPSJbJSBEYXRhLlJvd3MgfCBodG1sICVdIiBjb2xzPSJbJSBEYXRhLkNvbHMgJV0iIG5hbWU9IlslIERhdGEuTmFtZVByZWYgfCBodG1sICVdIj5bJSBEYXRhLkRhdGEgfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkNvbnRlbnRMYXJnZVByZWZlcmVuY2VzSXRlbVRleHRBcmVhIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ29udGVudExhcmdlUHJlZmVyZW5jZXNJdGVtQWxsb2NhdGlvbkxpc3QiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJbJSBEYXRhLk5hbWVQcmVmIHwgaHRtbCAlXSIgY2xhc3M9IkNvbHVtbnNKU09OIiB2YWx1ZT0iWyUgRGF0YS5Db2x1bW5zIHwgaHRtbCAlXSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgY2xhc3M9IkNvbHVtbnNFbmFibGVkSlNPTiIgdmFsdWU9IlslIERhdGEuQ29sdW1uc0VuYWJsZWQgfCBodG1sICVdIiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBjbGFzcz0iQ29sdW1uc0F2YWlsYWJsZUpTT04iIHZhbHVlPSJbJSBEYXRhLkNvbHVtbnNBdmFpbGFibGUgfCBodG1sICVdIiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9IkRvbnRQcmludCI+WyUgVHJhbnNsYXRlKERhdGEuRGVzYykgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIERvbnRQcmludCBMYXlvdXRHcmlkIEFsbG9jYXRpb25MaXN0Q29udGFpbmVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlNpemUxb2YyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IlRhYmxlbGlrZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iSGVhZGVyIj5bJSBUcmFuc2xhdGUoIkF2YWlsYWJsZSBDb2x1bW5zIikgfCBodG1sICVdPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpbHRlcklucHV0Q29udGFpbmVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJGaWx0ZXJBdmFpbGFibGVGaWVsZHMiIG5hbWU9IkZpbHRlckF2YWlsYWJsZUZpZWxkcyIgdmFsdWU9IiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiRmlsdGVyIGF2YWlsYWJsZSBmaWVsZHMiKSB8IGh0bWwgJV0iIHBsYWNlaG9sZGVyPSJbJSBUcmFuc2xhdGUoIkZpbHRlciBhdmFpbGFibGUgZmllbGRzIikgfCBodG1sICVdLi4uIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iQWxsb2NhdGlvbkxpc3QgVGFibGVsaWtlIEF2YWlsYWJsZUZpZWxkcyIgaWQ9IkF2YWlsYWJsZUZpZWxkLURhc2hib2FyZFslIERhdGEuTmFtZSB8IGh0bWwgJV0iPjwvdWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlNpemUxb2YyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IlRhYmxlbGlrZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iSGVhZGVyIj5bJSBUcmFuc2xhdGUoIlZpc2libGUgQ29sdW1ucyAob3JkZXIgYnkgZHJhZyAmIGRyb3ApIikgfCBodG1sICVdPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iQWxsb2NhdGlvbkxpc3QgVGFibGVsaWtlIEFzc2lnbmVkRmllbGRzIE9yZGVyTnVtYmVycyIgaWQ9IkFzc2lnbmVkRmllbGRzLURhc2hib2FyZFslIERhdGEuTmFtZSB8IGh0bWwgJV0iPjwvdWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkNvbnRlbnRMYXJnZVByZWZlcmVuY2VzSXRlbUFsbG9jYXRpb25MaXN0IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ29udGVudExhcmdlUHJlZmVyZW5jZXNJdGVtUmF3SFRNTCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuSFRNTCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiQ29udGVudExhcmdlUHJlZmVyZW5jZXNJdGVtUmF3SFRNTCIpICVdClslIFJlbmRlckJsb2NrRW5kKCJDb250ZW50TGFyZ2VQcmVmZXJlbmNlc0l0ZW0iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJCdXR0b25zIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9IkRhc2hib2FyZFslIERhdGEuTmFtZSB8IGh0bWwgJV1fc3VibWl0IiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBEb250UHJpbnQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdIj48c3Bhbj5bJSBUcmFuc2xhdGUoIlNhdmUgQ2hhbmdlcyIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwO1slIFRyYW5zbGF0ZSgib3IiKSB8IGh0bWwgJV0mbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9IkRhc2hib2FyZFslIERhdGEuTmFtZSB8IGh0bWwgJV1fY2FuY2VsIiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBEb250UHJpbnQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiQ2FuY2VsIikgfCBodG1sICVdIj48c3Bhbj5bJSBUcmFuc2xhdGUoIkNhbmNlbCIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCkNvcmUuQWdlbnQuRGFzaGJvYXJkLlJlZ2lzdGVyVXBkYXRlUHJlZmVyZW5jZXMoJCgnI0Rhc2hib2FyZFslIERhdGEuTmFtZSB8IGh0bWwgJV1fc3VibWl0JyksICdEYXNoYm9hcmRbJSBEYXRhLk5hbWUgfCBodG1sICVdJywkKCcjRGFzaGJvYXJkWyUgRGF0YS5OYW1lRm9ybSB8IGh0bWwgJV1fc2V0dGluZ19mb3JtJykpOwpDb3JlLlVJLlJlZ2lzdGVyVG9nZ2xlVHdvQ29udGFpbmVyKCQoJyNEYXNoYm9hcmRbJSBEYXRhLk5hbWUgfCBodG1sICVdX2NhbmNlbCcpLCAkKCcjRGFzaGJvYXJkWyUgRGF0YS5OYW1lIHwgaHRtbCAlXS1zZXR0aW5nJyksICQoJyNEYXNoYm9hcmRbJSBEYXRhLk5hbWUgfCBodG1sICVdJykpOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgaWQ9IkRhc2hib2FyZFslIERhdGEuTmFtZSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgWyUgRGF0YS5Db250ZW50ICVdCiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDb250ZW50TGFyZ2VNb3JlIikgJV0KICAgICAgICAgICAgPGEgaHJlZj0iWyUgRGF0YS5MaW5rICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuTGlua1RpdGxlKSB8IGh0bWwgJV0iIGNsYXNzPSJzbWFsbCI+WyUgVHJhbnNsYXRlKCJtb3JlIikgfCBodG1sICVdICYjMTg3OzwvYT4KWyUgUmVuZGVyQmxvY2tFbmQoIkNvbnRlbnRMYXJnZU1vcmUiKSAlXQogICAgICAgIDwvZGl2PgogICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJDb250ZW50TGFyZ2UiKSAlXQo8L2Rpdj4KPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgIENvcmUuQ29uZmlnLkFkZENvbmZpZyh7ClslIFJlbmRlckJsb2NrU3RhcnQoIkNvbHVtblRyYW5zbGF0aW9uIikgJV0KICAgICAgICAnQ29sdW1uWyUgRGF0YS5Db2x1bW5OYW1lIHwgaHRtbCAlXSc6IFslIFRyYW5zbGF0ZShEYXRhLlRyYW5zbGF0ZVN0cmluZykgfCBKU09OICVdWyUgUmVuZGVyQmxvY2tTdGFydCgiQ29sdW1uVHJhbnNsYXRpb25TZXBhcmF0b3IiKSAlXSxbJSBSZW5kZXJCbG9ja0VuZCgiQ29sdW1uVHJhbnNsYXRpb25TZXBhcmF0b3IiKSAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiQ29sdW1uVHJhbnNsYXRpb24iKSAlXQogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQoKWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgIENvcmUuQWdlbnQuRGFzaGJvYXJkLkluaXQoKTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCgo8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkNvbnRlbnQiKSAlXQo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9NdWx0aXBsZURhc2hib2FyZHMucG0gLSB0cmFuc2xhdGlvbiBmaWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTUgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIENvcHlyaWdodCAoQykgMjAxNC0yMDE1IEdldENvbiBHbWJILCBodHRwOi8vd3d3LmdldGNvbi1nbWJoLmRlLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpkZV9NdWx0aXBsZURhc2hib2FyZHM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYXNoYm9hcmQgMid9ID0gJ8OcYmVyc2ljaHQgMic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYXNoYm9hcmQgMyd9ID0gJ8OcYmVyc2ljaHQgMyc7Cn0KCjE7Cg==