OyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKOyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKOyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCjsgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKOyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAo7IHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CjsKOyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCjsKOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCjsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCjsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgo7IFRvbWNhdCBzY3JpcHQgZm9yIE51bGxzb2Z0IEluc3RhbGxlcgo7ICRJZCQKCiAgO0NvbXByZXNzaW9uIG9wdGlvbnMKICBDUkNDaGVjayBvbgogIFNldENvbXByZXNzIGZvcmNlCiAgU2V0Q29tcHJlc3NvciBsem1hCiAgU2V0RGF0YWJsb2NrT3B0aW1pemUgb24KCiAgTmFtZSAiQXBhY2hlIFRvbWNhdCIKCiAgO1Byb2R1Y3QgaW5mb3JtYXRpb24KICBWSUFkZFZlcnNpb25LZXkgUHJvZHVjdE5hbWUgIkFwYWNoZSBUb21jYXQiCiAgVklBZGRWZXJzaW9uS2V5IENvbXBhbnlOYW1lICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIKICBWSUFkZFZlcnNpb25LZXkgTGVnYWxDb3B5cmlnaHQgIkNvcHlyaWdodCAoYykgMTk5OS0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIKICBWSUFkZFZlcnNpb25LZXkgRmlsZURlc2NyaXB0aW9uICJBcGFjaGUgVG9tY2F0IEluc3RhbGxlciIKICBWSUFkZFZlcnNpb25LZXkgRmlsZVZlcnNpb24gIjIuMCIKICBWSUFkZFZlcnNpb25LZXkgUHJvZHVjdFZlcnNpb24gIkBWRVJTSU9OQCIKICBWSUFkZFZlcnNpb25LZXkgQ29tbWVudHMgInRvbWNhdC5hcGFjaGUub3JnIgogIFZJQWRkVmVyc2lvbktleSBJbnRlcm5hbE5hbWUgImFwYWNoZS10b21jYXQtQFZFUlNJT05ALmV4ZSIKICBWSVByb2R1Y3RWZXJzaW9uIEBWRVJTSU9OX05VTUJFUkAKCiFpbmNsdWRlICJNVUkubnNoIgohaW5jbHVkZSAiU3RyRnVuYy5uc2giCiR7U3RyUmVwfQogIFZhciAiSmF2YUhvbWUiCgoKCjstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo7Q29uZmlndXJhdGlvbgoKICAhZGVmaW5lIE1VSV9IRUFERVJJTUFHRQogICFkZWZpbmUgTVVJX0hFQURFUklNQUdFX1JJR0hUCiAgIWRlZmluZSBNVUlfSEVBREVSSU1BR0VfQklUTUFQIGhlYWRlci5ibXAKICAhZGVmaW5lIE1VSV9XRUxDT01FRklOSVNIUEFHRV9CSVRNQVAgc2lkZV9sZWZ0LmJtcCAKICAhZGVmaW5lIE1VSV9GSU5JU0hQQUdFX1NIT1dSRUFETUUgIiRJTlNURElSXHdlYmFwcHNcUk9PVFxSRUxFQVNFLU5PVEVTLnR4dCIKICAhZGVmaW5lIE1VSV9GSU5JU0hQQUdFX1JVTiAkSU5TVERJUlxiaW5cdG9tY2F0NXcuZXhlCiAgIWRlZmluZSBNVUlfRklOSVNIUEFHRV9SVU5fUEFSQU1FVEVSUyAvL01SLy9Ub21jYXQ1CiAgIWRlZmluZSBNVUlfRklOSVNIUEFHRV9OT1JFQk9PVFNVUFBPUlQKCiAgIWRlZmluZSBNVUlfQUJPUlRXQVJOSU5HCgogICFkZWZpbmUgVEVNUDEgJFIwCiAgIWRlZmluZSBURU1QMiAkUjEKCiAgIWRlZmluZSBNVUlfSUNPTiB0b21jYXQuaWNvCiAgIWRlZmluZSBNVUlfVU5JQ09OIHRvbWNhdC5pY28KCiAgO0dlbmVyYWwKICBPdXRGaWxlIHRvbWNhdC1pbnN0YWxsZXIuZXhlCgogIDtJbnN0YWxsIE9wdGlvbnMgcGFnZXMKICBMYW5nU3RyaW5nIFRFWFRfSlZNX1RJVExFICR7TEFOR19FTkdMSVNIfSAiSmF2YSBWaXJ0dWFsIE1hY2hpbmUiCiAgTGFuZ1N0cmluZyBURVhUX0pWTV9TVUJUSVRMRSAke0xBTkdfRU5HTElTSH0gIkphdmEgVmlydHVhbCBNYWNoaW5lIHBhdGggc2VsZWN0aW9uLiIKICBMYW5nU3RyaW5nIFRFWFRfSlZNX1BBR0VUSVRMRSAke0xBTkdfRU5HTElTSH0gIjogSmF2YSBWaXJ0dWFsIE1hY2hpbmUgcGF0aCBzZWxlY3Rpb24iCgogIExhbmdTdHJpbmcgVEVYVF9DT05GX1RJVExFICR7TEFOR19FTkdMSVNIfSAiQ29uZmlndXJhdGlvbiIKICBMYW5nU3RyaW5nIFRFWFRfQ09ORl9TVUJUSVRMRSAke0xBTkdfRU5HTElTSH0gIlRvbWNhdCBiYXNpYyBjb25maWd1cmF0aW9uLiIKICBMYW5nU3RyaW5nIFRFWFRfQ09ORl9QQUdFVElUTEUgJHtMQU5HX0VOR0xJU0h9ICI6IENvbmZpZ3VyYXRpb24gT3B0aW9ucyIKCiAgO0luc3RhbGwgUGFnZSBvcmRlcgogICFpbnNlcnRtYWNybyBNVUlfUEFHRV9XRUxDT01FCiAgIWluc2VydG1hY3JvIE1VSV9QQUdFX0xJQ0VOU0UgSU5TVEFMTExJQ0VOU0UKICAhaW5zZXJ0bWFjcm8gTVVJX1BBR0VfQ09NUE9ORU5UUwogICFpbnNlcnRtYWNybyBNVUlfUEFHRV9ESVJFQ1RPUlkKICBQYWdlIGN1c3RvbSBTZXRDb25maWd1cmF0aW9uIFZvaWQgIiQoVEVYVF9DT05GX1BBR0VUSVRMRSkiCiAgUGFnZSBjdXN0b20gU2V0Q2hvb3NlSlZNIFZvaWQgIiQoVEVYVF9KVk1fUEFHRVRJVExFKSIKICAhaW5zZXJ0bWFjcm8gTVVJX1BBR0VfSU5TVEZJTEVTCiAgUGFnZSBjdXN0b20gQ2hlY2tVc2VyVHlwZQogICFpbnNlcnRtYWNybyBNVUlfUEFHRV9GSU5JU0gKCiAgO1VuaW5zdGFsbCBQYWdlIG9yZGVyCiAgIWluc2VydG1hY3JvIE1VSV9VTlBBR0VfQ09ORklSTQogICFpbnNlcnRtYWNybyBNVUlfVU5QQUdFX0lOU1RGSUxFUwoKICA7TGljZW5zZSBkaWFsb2cKICBMaWNlbnNlRGF0YSBMaWNlbnNlLnJ0ZgoKICA7Q29tcG9uZW50LXNlbGVjdGlvbiBwYWdlCiAgICA7RGVzY3JpcHRpb25zCiAgICBMYW5nU3RyaW5nIERFU0NfU2VjVG9tY2F0ICR7TEFOR19FTkdMSVNIfSAiSW5zdGFsbCB0aGUgVG9tY2F0IFNlcnZsZXQgY29udGFpbmVyIGFzIGEgV2luZG93cyBzZXJ2aWNlLiIKICAgIExhbmdTdHJpbmcgREVTQ19TZWNUb21jYXRDb3JlICR7TEFOR19FTkdMSVNIfSAiSW5zdGFsbCB0aGUgVG9tY2F0IFNlcnZsZXQgY29udGFpbmVyIGNvcmUuIgogICAgTGFuZ1N0cmluZyBERVNDX1NlY1RvbWNhdFNlcnZpY2UgJHtMQU5HX0VOR0xJU0h9ICJBdXRvbWF0aWNhbGx5IHN0YXJ0IHRoZSBUb21jYXQgc2VydmljZSB3aGVuIHRoZSBjb21wdXRlciBpcyBzdGFydGVkLiIKICAgIExhbmdTdHJpbmcgREVTQ19TZWNUb21jYXROYXRpdmUgJHtMQU5HX0VOR0xJU0h9ICJJbnN0YWxsIEFQUiBiYXNlZCBUb21jYXQgbmF0aXZlIC5kbGwgZm9yIGJldHRlciBwZXJmb3JtYW5jZSBhbmQgc2NhbGFiaWxpdHkgaW4gcHJvZHVjdGlvbiBlbnZpcm9ubWVudHMuIgogICAgTGFuZ1N0cmluZyBERVNDX1NlY01lbnUgJHtMQU5HX0VOR0xJU0h9ICJDcmVhdGUgYSBTdGFydCBNZW51IHByb2dyYW0gZ3JvdXAgZm9yIFRvbWNhdC4iCiAgICBMYW5nU3RyaW5nIERFU0NfU2VjRG9jcyAke0xBTkdfRU5HTElTSH0gIkluc3RhbGwgdGhlIFRvbWNhdCBkb2N1bWVudGF0aW9uIGJ1bmRsZS4gVGhpcyBpbmNsdWRlcyBkb2N1bWVudGF0aW9uIG9uIHRoZSBzZXJ2bGV0IGNvbnRhaW5lciBhbmQgaXRzIGNvbmZpZ3VyYXRpb24gb3B0aW9ucywgb24gdGhlIEphc3BlciBKU1AgcGFnZSBjb21waWxlciwgYXMgd2VsbCBhcyBvbiB0aGUgbmF0aXZlIHdlYnNlcnZlciBjb25uZWN0b3JzLiIKICAgIExhbmdTdHJpbmcgREVTQ19TZWNNYW5hZ2VyICR7TEFOR19FTkdMSVNIfSAiSW5zdGFsbCB0aGUgVG9tY2F0IE1hbmFnZXIgYWRtaW5pc3RyYXRpdmUgd2ViIGFwcGxpY2F0aW9uLiIKICAgIExhbmdTdHJpbmcgREVTQ19TZWNIb3N0TWFuYWdlciAke0xBTkdfRU5HTElTSH0gIkluc3RhbGwgdGhlIFRvbWNhdCBIb3N0IE1hbmFnZXIgYWRtaW5pc3RyYXRpdmUgd2ViIGFwcGxpY2F0aW9uLiIKICAgIExhbmdTdHJpbmcgREVTQ19TZWNFeGFtcGxlcyAke0xBTkdfRU5HTElTSH0gIkluc3RhbGwgdGhlIFNlcnZsZXQgYW5kIEpTUCBleGFtcGxlIHdlYiBhcHBsaWNhdGlvbnMuIgogICAgTGFuZ1N0cmluZyBERVNDX1NlY1dlYmFwcHMgJHtMQU5HX0VOR0xJU0h9ICJJbnN0YWxscyBvdGhlciB1dGlsaXR5IHdlYiBhcHBsaWNhdGlvbnMgKFdlYkRBViwgYmFsYW5jZXIsIGV0YykuIgo7ICAgIExhbmdTdHJpbmcgREVTQ19TZWNDb21wYXQgJHtMQU5HX0VOR0xJU0h9ICJJbnN0YWxscyBKYXZhMpkgY29tcGF0aWJpbGl0eSBwYWNrYWdlLiBUaGlzIHJlbGVhc2Ugb2YgQXBhY2hlIFRvbWNhdCB3YXMgcGFja2FnZWQgdG8gcnVuIG9uIEoyU0UgNS4wIG9yIGxhdGVyLiBJdCBjYW4gYmUgcnVuIG9uIGVhcmxpZXIgSlZNcyBieSBpbnN0YWxsbmcgdGhpcyBwYWNrYWdlLiIKCiAgO0xhbmd1YWdlCiAgIWluc2VydG1hY3JvIE1VSV9MQU5HVUFHRSBFbmdsaXNoCgogIDtGb2xkZXItc2VsZWN0IGRpYWxvZwogIEluc3RhbGxEaXIgIiRQUk9HUkFNRklMRVNcQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb25cVG9tY2F0IDUuNSIKCiAgO0luc3RhbGwgdHlwZXMKICBJbnN0VHlwZSBOb3JtYWwKICBJbnN0VHlwZSBNaW5pbXVtCiAgSW5zdFR5cGUgRnVsbAoKICA7IE1haW4gcmVnaXN0cnkga2V5CiAgSW5zdGFsbERpclJlZ0tleSBIS0xNICJTT0ZUV0FSRVxBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvblxUb21jYXRcNS41IiAiIgoKICAhaW5zZXJ0bWFjcm8gTVVJX1JFU0VSVkVGSUxFX0lOU1RBTExPUFRJT05TCiAgUmVzZXJ2ZUZpbGUgImp2bS5pbmkiCiAgUmVzZXJ2ZUZpbGUgImNvbmZpZy5pbmkiCgo7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KO0luc3RhbGxlciBTZWN0aW9ucwoKU3ViU2VjdGlvbiAiVG9tY2F0IiBTZWNUb21jYXQKClNlY3Rpb24gIkNvcmUiIFNlY1RvbWNhdENvcmUKCiAgU2VjdGlvbkluIDEgMiAzIFJPCgogIElmU2lsZW50ICsyIDAKICBDYWxsIGNoZWNrSnZtCgogIFNldE91dFBhdGggJElOU1RESVIKICBGaWxlIHRvbWNhdC5pY28KICBGaWxlIExJQ0VOU0UKICBGaWxlIE5PVElDRQogIFNldE91dFBhdGggJElOU1RESVJcY29tbW9uCiAgRmlsZSAvciBjb21tb25cKi4qCiAgU2V0T3V0UGF0aCAkSU5TVERJUlxzaGFyZWQKICBGaWxlIC9ub25mYXRhbCAvciBzaGFyZWRcKi4qCiAgU2V0T3V0UGF0aCAkSU5TVERJUlxsb2dzCiAgRmlsZSAvbm9uZmF0YWwgL3IgbG9nc1wqLioKICBTZXRPdXRQYXRoICRJTlNURElSXHdvcmsKICBGaWxlIC9ub25mYXRhbCAvciB3b3JrXCouKgogIFNldE91dFBhdGggJElOU1RESVJcdGVtcAogIEZpbGUgL25vbmZhdGFsIC9yIHRlbXBcKi4qCiAgU2V0T3V0UGF0aCAkSU5TVERJUlxiaW4KICBGaWxlIGJpblxib290c3RyYXAuamFyCiAgRmlsZSBiaW5cY29tbW9ucy1sb2dnaW5nLWFwaS0xLjEuMS5qYXIKICBGaWxlIGJpblx0b21jYXQtanVsaS5qYXIKICBTZXRPdXRQYXRoICRJTlNURElSXGNvbmYKICBGaWxlIGNvbmZcKi4qCiAgU2V0T3V0UGF0aCAkSU5TVERJUlxzZXJ2ZXJcbGliCiAgRmlsZSAvciBzZXJ2ZXJcbGliXCouKgogIFNldE91dFBhdGggJElOU1RESVJcc2VydmVyXGNsYXNzZXMKICBGaWxlIC9ub25mYXRhbCAvciBzZXJ2ZXJcY2xhc3Nlc1wqLioKICBTZXRPdXRQYXRoICRJTlNURElSXHdlYmFwcHNcUk9PVAogIEZpbGUgL3Igd2ViYXBwc1xST09UXCouKgoKICBDYWxsIGNvbmZpZ3VyZQogIENhbGwgZmluZEphdmFQYXRoCiAgUG9wICQyCgogIElmU2lsZW50ICsyIDAKICAhaW5zZXJ0bWFjcm8gTVVJX0lOU1RBTExPUFRJT05TX1JFQUQgJDIgImp2bS5pbmkiICJGaWVsZCAyIiAiU3RhdGUiCgogIFN0ckNweSAiJEphdmFIb21lIiAkMgogIENhbGwgZmluZEpWTVBhdGgKICBQb3AgJDIKCiAgRGV0YWlsUHJpbnQgIlVzaW5nIEp2bTogJDIiCgogIFNldE91dFBhdGggJElOU1RESVJcYmluCiAgRmlsZSBiaW5cdG9tY2F0QFZFUlNJT05fTUFKT1JAdy5leGUKCiAgOyBHZXQgdGhlIGN1cnJlbnQgcGxhdGZvcm0geDg2IC8gQU1ENjQgLyBJQTY0CiAgQ2FsbCBGaW5kQ3B1VHlwZQogIFBvcCAkMAogIFN0ckNtcCAkMCAieDg2IiAwICsyCiAgRmlsZSAvb25hbWU9dG9tY2F0QFZFUlNJT05fTUFKT1JALmV4ZSBiaW5cdG9tY2F0QFZFUlNJT05fTUFKT1JALmV4ZQogIFN0ckNtcCAkMCAieDY0IiAwICsyCiAgRmlsZSAvb25hbWU9dG9tY2F0QFZFUlNJT05fTUFKT1JALmV4ZSBiaW5ceDY0XHRvbWNhdEBWRVJTSU9OX01BSk9SQC5leGUKICBTdHJDbXAgJDAgImk2NCIgMCArMgogIEZpbGUgL29uYW1lPXRvbWNhdEBWRVJTSU9OX01BSk9SQC5leGUgYmluXGk2NFx0b21jYXRAVkVSU0lPTl9NQUpPUkAuZXhlCgogIEluc3RhbGxSZXRyeToKICBDbGVhckVycm9ycwogIG5zRXhlYzo6RXhlY1RvTG9nICciJElOU1RESVJcYmluXHRvbWNhdDUuZXhlIiAvL0lTLy9Ub21jYXQ1IC0tRGlzcGxheU5hbWUgIkFwYWNoZSBUb21jYXQiIC0tRGVzY3JpcHRpb24gIkFwYWNoZSBUb21jYXQgQFZFUlNJT05AIFNlcnZlciAtIGh0dHA6Ly90b21jYXQuYXBhY2hlLm9yZy8iIC0tTG9nUGF0aCAiJElOU1RESVJcbG9ncyIgLS1JbnN0YWxsICIkSU5TVERJUlxiaW5cdG9tY2F0NS5leGUiIC0tSnZtICIkMiIgLS1TdGFydFBhdGggIiRJTlNURElSIiAtLVN0b3BQYXRoICIkSU5TVERJUiInCiAgUG9wICQwCiAgU3RyQ21wICQwICIwIiBJbnN0YWxsT2sKICAgIE1lc3NhZ2VCb3ggTUJfQUJPUlRSRVRSWUlHTk9SRXxNQl9JQ09OU1RPUCBcCiAgICAgICJGYWlsZWQgdG8gaW5zdGFsbCBUb21jYXQ1IHNlcnZpY2UuJFxyJFxuQ2hlY2sgeW91ciBzZXR0aW5ncyBhbmQgcGVybWlzc2lvbnMuJFxyJFxuSWdub3JlIGFuZCBjb250aW51ZSBhbnl3YXkgKG5vdCByZWNvbW1lbmRlZCk/IiBcCiAgICAgICAvU0QgSURJR05PUkUgSURJR05PUkUgSW5zdGFsbE9rIElEUkVUUlkgSW5zdGFsbFJldHJ5CiAgUXVpdAogIEluc3RhbGxPazoKICBDbGVhckVycm9ycwoKU2VjdGlvbkVuZAoKU2VjdGlvbiAiU2VydmljZSBTdGFydHVwIiBTZWNUb21jYXRTZXJ2aWNlCgogIFNlY3Rpb25JbiAzCgogIElmU2lsZW50IDAgKzMKICBDYWxsIGZpbmRKYXZhUGF0aAogIFBvcCAkMgoKICBJZlNpbGVudCArMiAwCiAgIWluc2VydG1hY3JvIE1VSV9JTlNUQUxMT1BUSU9OU19SRUFEICQyICJqdm0uaW5pIiAiRmllbGQgMiIgIlN0YXRlIgoKICBTdHJDcHkgIiRKYXZhSG9tZSIgJDIKICBDYWxsIGZpbmRKVk1QYXRoCiAgUG9wICQyCgogIG5zRXhlYzo6RXhlY1RvTG9nICciJElOU1RESVJcYmluXHRvbWNhdDUuZXhlIiAvL1VTLy9Ub21jYXQ1IC0tU3RhcnR1cCBhdXRvJwogIDsgQmVoYXZlIGxpa2UgQXBhY2hlIEh0dHBkIChwdXQgdGhlIGljb24gaW4gdHJheSBvbiBsb2dpbikKICBXcml0ZVJlZ1N0ciBIS0xNICJTb2Z0d2FyZVxNaWNyb3NvZnRcV2luZG93c1xDdXJyZW50VmVyc2lvblxSdW4iICJBcGFjaGVUb21jYXRNb25pdG9yIiAnIiRJTlNURElSXGJpblx0b21jYXQ1dy5leGUiIC8vTVMvL1RvbWNhdDUnCgogIENsZWFyRXJyb3JzCgpTZWN0aW9uRW5kCgpTZWN0aW9uICJOYXRpdmUiIFNlY1RvbWNhdE5hdGl2ZQoKICBTZWN0aW9uSW4gMwoKICBTZXRPdXRQYXRoICRJTlNURElSXGJpbgogIENhbGwgRmluZENwdVR5cGUKICBQb3AgJDAKCiAgU3RyQ21wICQwICJ4ODYiIDAgKzIKICBGaWxlIGJpblx0Y25hdGl2ZS0xLmRsbAogIFN0ckNtcCAkMCAieDY0IiAwICsyCiAgRmlsZSAvb25hbWU9dGNuYXRpdmUtMS5kbGwgYmluXHg2NFx0Y25hdGl2ZS0xLmRsbAogIFN0ckNtcCAkMCAiaTY0IiAwICsyCiAgRmlsZSAvb25hbWU9dGNuYXRpdmUtMS5kbGwgYmluXGk2NFx0Y25hdGl2ZS0xLmRsbAoKICBDbGVhckVycm9ycwoKU2VjdGlvbkVuZAoKU3ViU2VjdGlvbkVuZAoKU2VjdGlvbiAiU3RhcnQgTWVudSBJdGVtcyIgU2VjTWVudQoKICBTZWN0aW9uSW4gMSAyIDMKCiAgIWluc2VydG1hY3JvIE1VSV9JTlNUQUxMT1BUSU9OU19SRUFEICQyICJqdm0uaW5pIiAiRmllbGQgMiIgIlN0YXRlIgoKICBTZXRPdXRQYXRoICIkU01QUk9HUkFNU1xBcGFjaGUgVG9tY2F0IDUuNSIKCiAgQ3JlYXRlU2hvcnRDdXQgIiRTTVBST0dSQU1TXEFwYWNoZSBUb21jYXQgNS41XFRvbWNhdCBIb21lIFBhZ2UubG5rIiBcCiAgICAgICAgICAgICAgICAgImh0dHA6Ly90b21jYXQuYXBhY2hlLm9yZy8iCgogIENyZWF0ZVNob3J0Q3V0ICIkU01QUk9HUkFNU1xBcGFjaGUgVG9tY2F0IDUuNVxXZWxjb21lLmxuayIgXAogICAgICAgICAgICAgICAgICJodHRwOi8vMTI3LjAuMC4xOiRSMC8iCgogIElmRmlsZUV4aXN0cyAiJElOU1RESVJcc2VydmVyXHdlYmFwcHNcbWFuYWdlciIgMCBOb01hbmFnZXJBcHAKCiAgQ3JlYXRlU2hvcnRDdXQgIiRTTVBST0dSQU1TXEFwYWNoZSBUb21jYXQgNS41XFRvbWNhdCBNYW5hZ2VyLmxuayIgXAogICAgICAgICAgICAgICAgICJodHRwOi8vMTI3LjAuMC4xOiRSMC9tYW5hZ2VyL2h0bWwiCgpOb01hbmFnZXJBcHA6CgogIElmRmlsZUV4aXN0cyAiJElOU1RESVJcd2ViYXBwc1x3ZWJhcHBzXHRvbWNhdC1kb2NzIiAwIE5vRG9jdW1lbnRhaW9uCgogIENyZWF0ZVNob3J0Q3V0ICIkU01QUk9HUkFNU1xBcGFjaGUgVG9tY2F0IDUuNVxUb21jYXQgRG9jdW1lbnRhdGlvbi5sbmsiIFwKICAgICAgICAgICAgICAgICAiJElOU1RESVJcd2ViYXBwc1x0b21jYXQtZG9jc1xpbmRleC5odG1sIgoKTm9Eb2N1bWVudGFpb246CgogIENyZWF0ZVNob3J0Q3V0ICIkU01QUk9HUkFNU1xBcGFjaGUgVG9tY2F0IDUuNVxVbmluc3RhbGwgVG9tY2F0IDUuNS5sbmsiIFwKICAgICAgICAgICAgICAgICAiJElOU1RESVJcVW5pbnN0YWxsLmV4ZSIKCiAgQ3JlYXRlU2hvcnRDdXQgIiRTTVBST0dSQU1TXEFwYWNoZSBUb21jYXQgNS41XFRvbWNhdCA1LjUgUHJvZ3JhbSBEaXJlY3RvcnkubG5rIiBcCiAgICAgICAgICAgICAgICAgIiRJTlNURElSIgoKICBDcmVhdGVTaG9ydEN1dCAiJFNNUFJPR1JBTVNcQXBhY2hlIFRvbWNhdCA1LjVcTW9uaXRvciBUb21jYXQubG5rIiBcCiAgICAgICAgICAgICAgICAgIiRJTlNURElSXGJpblx0b21jYXQ1dy5leGUiIFwKICAgICAgICAgICAgICAgICAnLy9NUy8vVG9tY2F0NScgXAogICAgICAgICAgICAgICAgICIkSU5TVERJUlx0b21jYXQuaWNvIiAwIFNXX1NIT1dOT1JNQUwKCiAgQ3JlYXRlU2hvcnRDdXQgIiRTTVBST0dSQU1TXEFwYWNoZSBUb21jYXQgNS41XENvbmZpZ3VyZSBUb21jYXQubG5rIiBcCiAgICAgICAgICAgICAgICAgIiRJTlNURElSXGJpblx0b21jYXQ1dy5leGUiIFwKICAgICAgICAgICAgICAgICAnLy9FUy8vVG9tY2F0NScgXAogICAgICAgICAgICAgICAgICIkSU5TVERJUlx0b21jYXQuaWNvIiAwIFNXX1NIT1dOT1JNQUwKClNlY3Rpb25FbmQKClNlY3Rpb24gIkRvY3VtZW50YXRpb24iIFNlY0RvY3MKCiAgU2VjdGlvbkluIDEgMwogIFNldE91dFBhdGggJElOU1RESVJcd2ViYXBwc1x0b21jYXQtZG9jcwogIEZpbGUgL3Igd2ViYXBwc1x0b21jYXQtZG9jc1wqLioKClNlY3Rpb25FbmQKClNlY3Rpb24gIk1hbmFnZXIiIFNlY01hbmFnZXIKCiAgU2VjdGlvbkluIDEgMwoKICBTZXRPdmVyd3JpdGUgb24KICBTZXRPdXRQYXRoICRJTlNURElSXHNlcnZlclx3ZWJhcHBzXG1hbmFnZXIKICBGaWxlIC9yIHNlcnZlclx3ZWJhcHBzXG1hbmFnZXJcKi4qCiAgU2V0T3V0UGF0aCAkSU5TVERJUlxjb25mXENhdGFsaW5hXGxvY2FsaG9zdAogIEZpbGUgY29uZlxDYXRhbGluYVxsb2NhbGhvc3RcbWFuYWdlci54bWwKClNlY3Rpb25FbmQKClNlY3Rpb24gIkhvc3QgTWFuYWdlciIgU2VjSG9zdE1hbmFnZXIKCiAgU2VjdGlvbkluIDMKCiAgU2V0T3ZlcndyaXRlIG9uCiAgU2V0T3V0UGF0aCAkSU5TVERJUlxzZXJ2ZXJcd2ViYXBwc1xob3N0LW1hbmFnZXIKICBGaWxlIC9yIHNlcnZlclx3ZWJhcHBzXGhvc3QtbWFuYWdlclwqLioKICBTZXRPdXRQYXRoICRJTlNURElSXGNvbmZcQ2F0YWxpbmFcbG9jYWxob3N0CiAgRmlsZSBjb25mXENhdGFsaW5hXGxvY2FsaG9zdFxob3N0LW1hbmFnZXIueG1sCgpTZWN0aW9uRW5kCgpTZWN0aW9uICJFeGFtcGxlcyIgU2VjRXhhbXBsZXMKCiAgU2VjdGlvbkluIDMKCiAgU2V0T3ZlcndyaXRlIG9uCiAgU2V0T3V0UGF0aCAkSU5TVERJUlx3ZWJhcHBzXGpzcC1leGFtcGxlcwogIEZpbGUgL3Igd2ViYXBwc1xqc3AtZXhhbXBsZXNcKi4qCiAgU2V0T3V0UGF0aCAkSU5TVERJUlx3ZWJhcHBzXHNlcnZsZXRzLWV4YW1wbGVzCiAgRmlsZSAvciB3ZWJhcHBzXHNlcnZsZXRzLWV4YW1wbGVzXCouKgoKU2VjdGlvbkVuZAoKU2VjdGlvbiAiV2ViYXBwcyIgU2VjV2ViYXBwcwoKICBTZWN0aW9uSW4gMwoKICBTZXRPdXRQYXRoICRJTlNURElSXHdlYmFwcHNcYmFsYW5jZXIKICBGaWxlIC9yIHdlYmFwcHNcYmFsYW5jZXJcKi4qCiAgU2V0T3V0UGF0aCAkSU5TVERJUlx3ZWJhcHBzXHdlYmRhdgogIEZpbGUgL3Igd2ViYXBwc1x3ZWJkYXZcKi4qCgpTZWN0aW9uRW5kCgo7U2VjdGlvbiAiQ29tcGF0aWJpbGl0eSIgU2VjQ29tcGF0CjsKOyAgU2V0T3V0UGF0aCAkSU5TVERJUgo7ICBGaWxlIC9vbmFtZT1iaW5cam14LmphciAuLlxjb21wYXRcYmluXGpteC5qYXIKOyAgRmlsZSAvb25hbWU9Y29tbW9uXGVuZG9yc2VkXHhlcmNlc0ltcGwuamFyIC4uXGNvbXBhdFxjb21tb25cZW5kb3JzZWRceGVyY2VzSW1wbC5qYXIKOyAgRmlsZSAvb25hbWU9Y29tbW9uXGVuZG9yc2VkXHhtbC1hcGlzLmphciAgLi5cY29tcGF0XGNvbW1vblxlbmRvcnNlZFx4bWwtYXBpcy5qYXIKOwo7U2VjdGlvbkVuZAoKU2VjdGlvbiAtcG9zdAogIG5zRXhlYzo6RXhlY1RvTG9nICciJElOU1RESVJcYmluXHRvbWNhdDUuZXhlIiAvL1VTLy9Ub21jYXQ1IC0tQ2xhc3NwYXRoICIkSU5TVERJUlxiaW5cYm9vdHN0cmFwLmphciIgLS1TdGFydENsYXNzIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Cb290c3RyYXAgLS1TdG9wQ2xhc3Mgb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkJvb3RzdHJhcCAtLVN0YXJ0UGFyYW1zIHN0YXJ0IC0tU3RvcFBhcmFtcyBzdG9wICAtLVN0YXJ0TW9kZSBqdm0gLS1TdG9wTW9kZSBqdm0nCiAgbnNFeGVjOjpFeGVjVG9Mb2cgJyIkSU5TVERJUlxiaW5cdG9tY2F0NS5leGUiIC8vVVMvL1RvbWNhdDUgLS1Kdm1PcHRpb25zICItRGNhdGFsaW5hLmhvbWU9JElOU1RESVIjLURjYXRhbGluYS5iYXNlPSRJTlNURElSIy1EamF2YS5lbmRvcnNlZC5kaXJzPSRJTlNURElSXGNvbW1vblxlbmRvcnNlZCMtRGphdmEuaW8udG1wZGlyPSRJTlNURElSXHRlbXAjLURqYXZhLnV0aWwubG9nZ2luZy5tYW5hZ2VyPW9yZy5hcGFjaGUuanVsaS5DbGFzc0xvYWRlckxvZ01hbmFnZXIjLURqYXZhLnV0aWwubG9nZ2luZy5jb25maWcuZmlsZT0kSU5TVERJUlxjb25mXGxvZ2dpbmcucHJvcGVydGllcyIgLS1TdGRPdXRwdXQgYXV0byAtLVN0ZEVycm9yIGF1dG8nCgogIFdyaXRlVW5pbnN0YWxsZXIgIiRJTlNURElSXFVuaW5zdGFsbC5leGUiCgogIFdyaXRlUmVnU3RyIEhLTE0gIlNPRlRXQVJFXEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uXFRvbWNhdFw1LjUiICJJbnN0YWxsUGF0aCIgJElOU1RESVIKICBXcml0ZVJlZ1N0ciBIS0xNICJTT0ZUV0FSRVxBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvblxUb21jYXRcNS41IiAiVmVyc2lvbiIgQFZFUlNJT05ACiAgV3JpdGVSZWdTdHIgSEtMTSAiU29mdHdhcmVcTWljcm9zb2Z0XFdpbmRvd3NcQ3VycmVudFZlcnNpb25cVW5pbnN0YWxsXEFwYWNoZSBUb21jYXQgNS41IiBcCiAgICAgICAgICAgICAgICAgICAiRGlzcGxheU5hbWUiICJBcGFjaGUgVG9tY2F0IDUuNSAocmVtb3ZlIG9ubHkpIgogIFdyaXRlUmVnU3RyIEhLTE0gIlNvZnR3YXJlXE1pY3Jvc29mdFxXaW5kb3dzXEN1cnJlbnRWZXJzaW9uXFVuaW5zdGFsbFxBcGFjaGUgVG9tY2F0IDUuNSIgXAogICAgICAgICAgICAgICAgICAgIlVuaW5zdGFsbFN0cmluZyIgJyIkSU5TVERJUlxVbmluc3RhbGwuZXhlIicKClNlY3Rpb25FbmQKCkZ1bmN0aW9uIC5vbkluaXQKICA7UmVzZXQgaW5zdGFsbCBkaXIgZm9yIDY0LWJpdAogIEV4cGFuZEVudlN0cmluZ3MgJDAgIiVQUk9HUkFNVzY0MzIlIgogIFN0ckNtcCAkMCAiJVBST0dSQU1XNjQzMiUiICsyIDAKICBTdHJDcHkgJElOU1RESVIgIiQwXEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uXFRvbWNhdCBAVkVSU0lPTl9NQUpPUl9NSU5PUkAiCgogIDtFeHRyYWN0IEluc3RhbGwgT3B0aW9ucyBJTkkgRmlsZXMKICAhaW5zZXJ0bWFjcm8gTVVJX0lOU1RBTExPUFRJT05TX0VYVFJBQ1QgImNvbmZpZy5pbmkiCiAgIWluc2VydG1hY3JvIE1VSV9JTlNUQUxMT1BUSU9OU19FWFRSQUNUICJqdm0uaW5pIgoKRnVuY3Rpb25FbmQKCkZ1bmN0aW9uIFNldENob29zZUpWTQogICFpbnNlcnRtYWNybyBNVUlfSEVBREVSX1RFWFQgIiQoVEVYVF9KVk1fVElUTEUpIiAiJChURVhUX0pWTV9TVUJUSVRMRSkiCiAgQ2FsbCBmaW5kSmF2YVBhdGgKICBQb3AgJDMKICAhaW5zZXJ0bWFjcm8gTVVJX0lOU1RBTExPUFRJT05TX1dSSVRFICJqdm0uaW5pIiAiRmllbGQgMiIgIlN0YXRlIiAkMwogICFpbnNlcnRtYWNybyBNVUlfSU5TVEFMTE9QVElPTlNfRElTUExBWSAianZtLmluaSIKRnVuY3Rpb25FbmQKCkZ1bmN0aW9uIFNldENvbmZpZ3VyYXRpb24KICAhaW5zZXJ0bWFjcm8gTVVJX0hFQURFUl9URVhUICIkKFRFWFRfQ09ORl9USVRMRSkiICIkKFRFWFRfQ09ORl9TVUJUSVRMRSkiCgogIFNlY3Rpb25HZXRGbGFncyAke1NlY01hbmFnZXJ9ICQwCiAgSW50T3AgJDAgJDAgJiAke1NGX1NFTEVDVEVEfQogIEludENtcCAkMCAwIDAgRW5hYmxlIEVuYWJsZQogIFNlY3Rpb25HZXRGbGFncyAke1NlY0hvc3RNYW5hZ2VyfSAkMAogIEludE9wICQwICQwICYgJHtTRl9TRUxFQ1RFRH0KICBJbnRDbXAgJDAgMCBEaXNhYmxlIDAgMAoKRW5hYmxlOgogIDsgRW5hYmxlIHRoZSB1c2VyIGFuZCBwYXNzd29yZCBjb250cm9scyBpZiB0aGUgbWFuYWdlciBvciBob3N0LW1hbmFnZXIgYXBwIGlzCiAgOyBiZWluZyBpbnN0YWxsZWQKICAhaW5zZXJ0bWFjcm8gTVVJX0lOU1RBTExPUFRJT05TX1JFQUQgJDAgImNvbmZpZy5pbmkiICJGaWVsZCA1IiAiSFdORCIKICAhaW5zZXJ0bWFjcm8gTVVJX0lOU1RBTExPUFRJT05TX1dSSVRFICJjb25maWcuaW5pIiAiRmllbGQgNSIgIkZsYWdzIiAiIgogIEVuYWJsZVdpbmRvdyAkMCAxCiAgIWluc2VydG1hY3JvIE1VSV9JTlNUQUxMT1BUSU9OU19SRUFEICQwICJjb25maWcuaW5pIiAiRmllbGQgNyIgIkhXTkQiCiAgIWluc2VydG1hY3JvIE1VSV9JTlNUQUxMT1BUSU9OU19XUklURSAiY29uZmlnLmluaSIgIkZpZWxkIDciICJGbGFncyIgIiIKICBFbmFibGVXaW5kb3cgJDAgMQogIEdvdG8gRGlzcGxheQoKRGlzYWJsZToKICA7IERpc2FibGUgdGhlIHVzZXIgYW5kIHBhc3N3b3JkIGNvbnRyb2xzIGlmIG5laXRoZXIgdGhlIG1hbmFnZXIgbm9yCiAgOyBob3N0LW1hbmFnZXIgYXBwIGlzIGJlaW5nIGluc3RhbGxlZAogICFpbnNlcnRtYWNybyBNVUlfSU5TVEFMTE9QVElPTlNfUkVBRCAkMCAiY29uZmlnLmluaSIgIkZpZWxkIDUiICJIV05EIgogICFpbnNlcnRtYWNybyBNVUlfSU5TVEFMTE9QVElPTlNfV1JJVEUgImNvbmZpZy5pbmkiICJGaWVsZCA1IiAiRmxhZ3MiICJESVNBQkxFRCIKICBFbmFibGVXaW5kb3cgJDAgMAogICFpbnNlcnRtYWNybyBNVUlfSU5TVEFMTE9QVElPTlNfUkVBRCAkMCAiY29uZmlnLmluaSIgIkZpZWxkIDciICJIV05EIgogICFpbnNlcnRtYWNybyBNVUlfSU5TVEFMTE9QVElPTlNfV1JJVEUgImNvbmZpZy5pbmkiICJGaWVsZCA3IiAiRmxhZ3MiICJESVNBQkxFRCIKICBFbmFibGVXaW5kb3cgJDAgMAogIDsgQ2xlYXIgdGhlIHZhbHVlcwogICFpbnNlcnRtYWNybyBNVUlfSU5TVEFMTE9QVElPTlNfV1JJVEUgImNvbmZpZy5pbmkiICJGaWVsZCA1IiAiU3RhdGUiICIiCiAgIWluc2VydG1hY3JvIE1VSV9JTlNUQUxMT1BUSU9OU19XUklURSAiY29uZmlnLmluaSIgIkZpZWxkIDciICJTdGF0ZSIgIiIKCkRpc3BsYXk6CiAgIWluc2VydG1hY3JvIE1VSV9JTlNUQUxMT1BUSU9OU19ESVNQTEFZICJjb25maWcuaW5pIgoKRnVuY3Rpb25FbmQKCkZ1bmN0aW9uIFZvaWQKRnVuY3Rpb25FbmQKCjstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo7RGVzY3JpcHRpb25zCgohaW5zZXJ0bWFjcm8gTVVJX0ZVTkNUSU9OX0RFU0NSSVBUSU9OX0JFR0lOCiAgIWluc2VydG1hY3JvIE1VSV9ERVNDUklQVElPTl9URVhUICR7U2VjVG9tY2F0fSAkKERFU0NfU2VjVG9tY2F0KQogICFpbnNlcnRtYWNybyBNVUlfREVTQ1JJUFRJT05fVEVYVCAke1NlY1RvbWNhdENvcmV9ICQoREVTQ19TZWNUb21jYXRDb3JlKQogICFpbnNlcnRtYWNybyBNVUlfREVTQ1JJUFRJT05fVEVYVCAke1NlY1RvbWNhdFNlcnZpY2V9ICQoREVTQ19TZWNUb21jYXRTZXJ2aWNlKQogICFpbnNlcnRtYWNybyBNVUlfREVTQ1JJUFRJT05fVEVYVCAke1NlY1RvbWNhdE5hdGl2ZX0gJChERVNDX1NlY1RvbWNhdE5hdGl2ZSkKOyAgIWluc2VydG1hY3JvIE1VSV9ERVNDUklQVElPTl9URVhUICR7U2VjQ29tcGF0fSAkKERFU0NfU2VjQ29tcGF0KQogICFpbnNlcnRtYWNybyBNVUlfREVTQ1JJUFRJT05fVEVYVCAke1NlY01lbnV9ICQoREVTQ19TZWNNZW51KQogICFpbnNlcnRtYWNybyBNVUlfREVTQ1JJUFRJT05fVEVYVCAke1NlY0RvY3N9ICQoREVTQ19TZWNEb2NzKQogICFpbnNlcnRtYWNybyBNVUlfREVTQ1JJUFRJT05fVEVYVCAke1NlY01hbmFnZXJ9ICQoREVTQ19TZWNNYW5hZ2VyKQogICFpbnNlcnRtYWNybyBNVUlfREVTQ1JJUFRJT05fVEVYVCAke1NlY0hvc3RNYW5hZ2VyfSAkKERFU0NfU2VjSG9zdE1hbmFnZXIpCiAgIWluc2VydG1hY3JvIE1VSV9ERVNDUklQVElPTl9URVhUICR7U2VjRXhhbXBsZXN9ICQoREVTQ19TZWNFeGFtcGxlcykKICAhaW5zZXJ0bWFjcm8gTVVJX0RFU0NSSVBUSU9OX1RFWFQgJHtTZWNXZWJhcHBzfSAkKERFU0NfU2VjV2ViYXBwcykKIWluc2VydG1hY3JvIE1VSV9GVU5DVElPTl9ERVNDUklQVElPTl9FTkQKCgo7ID09PT09PT09PT09PT09PT09PT09PQo7IEZpbmRDcHVUeXBlIEZ1bmN0aW9uCjsgPT09PT09PT09PT09PT09PT09PT09CjsKOyBGaW5kIHRoZSBDUFUgdXNlZCBvbiB0aGUgc3lzdGVtLCBhbmQgcHV0IHRoZSByZXN1bHQgb24gdGhlIHRvcCBvZiB0aGUKOyBzdGFjawo7CkZ1bmN0aW9uIEZpbmRDcHVUeXBlCgogIENsZWFyRXJyb3JzCiAgOyBEZWZhdWx0IENQVSBpcyBhbHdheXMgeDg2CiAgU3RyQ3B5ICQxICJ4ODYiCiAgRXhwYW5kRW52U3RyaW5ncyAkMCAiJVBST0NFU1NPUl9BUkNISVRFVzY0MzIlIgogIFN0ckNtcCAkMCAiJVBST0NFU1NPUl9BUkNISVRFVzY0MzIlIiArNSAwCiAgU3RyQ21wICQwICJJQTY0IiAwICszCiAgU3RyQ3B5ICQxICJpNjQiCiAgR290byBGb3VuZENwdQogIFN0ckNweSAkMSAieDY0IgoKRm91bmRDcHU6CiAgOyBQdXQgdGhlIHJlc3VsdCBpbiB0aGUgc3RhY2sKICBQdXNoICQxCgpGdW5jdGlvbkVuZAoKCjsgPT09PT09PT09PT09PT09PT09PT09CjsgQ2hlY2tVc2VyVHlwZSBGdW5jdGlvbgo7ID09PT09PT09PT09PT09PT09PT09PQo7CjsgQ2hlY2sgdGhlIHVzZXIgdHlwZSwgYW5kIHdhcm4gaWYgaXQncyBub3QgYW4gYWRtaW5pc3RyYXRvci4KOyBUYWtlbiBmcm9tIEV4YW1wbGVzL1VzZXJJbmZvIHRoYXQgc2hpcHMgd2l0aCBOU0lTLgpGdW5jdGlvbiBDaGVja1VzZXJUeXBlCiAgQ2xlYXJFcnJvcnMKICBVc2VySW5mbzo6R2V0TmFtZQogIElmRXJyb3JzIFdpbjl4CiAgUG9wICQwCiAgVXNlckluZm86OkdldEFjY291bnRUeXBlCiAgUG9wICQxCiAgU3RyQ21wICQxICJBZG1pbiIgMCArMwogICAgOyBUaGlzIGlzIE9LLCBkbyBub3RoaW5nCiAgICBHb3RvIGRvbmUKCiAgICBNZXNzYWdlQm94IE1CX09LfE1CX0lDT05FWENMQU1BVElPTiAnTm90ZTogdGhlIGN1cnJlbnQgdXNlciBpcyBub3QgYW4gYWRtaW5pc3RyYXRvci4gXAogICAgICAgICAgICAgICBUbyBydW4gVG9tY2F0IGFzIGEgV2luZG93cyBzZXJ2aWNlLCB5b3UgbXVzdCBiZSBhbiBhZG1pbmlzdHJhdG9yLiBcCiAgICAgICAgICAgICAgIFlvdSBjYW4gc3RpbGwgcnVuIFRvbWNhdCBmcm9tIHRoZSBjb21tYW5kLWxpbmUgYXMgdGhpcyB0eXBlIG9mIHVzZXIuJwogICAgR290byBkb25lCgogIFdpbjl4OgogICAgIyBUaGlzIG9uZSBtZWFucyB5b3UgZG9uJ3QgbmVlZCB0byBjYXJlIGFib3V0IGFkbWluIG9yCiAgICAjIG5vdCBhZG1pbiBiZWNhdXNlIFdpbmRvd3MgOXggZG9lc24ndCBlaXRoZXIKICAgIE1lc3NhZ2VCb3ggTUJfT0sgIkVycm9yISBUaGlzIERMTCBjYW4ndCBydW4gdW5kZXIgV2luZG93cyA5eCEiCgogIGRvbmU6CkZ1bmN0aW9uRW5kCgoKOyA9PT09PT09PT09PT09PT09PT09PT0KOyBGaW5kSmF2YVBhdGggRnVuY3Rpb24KOyA9PT09PT09PT09PT09PT09PT09PT0KOwo7IEZpbmQgdGhlIEpBVkFfSE9NRSB1c2VkIG9uIHRoZSBzeXN0ZW0sIGFuZCBwdXQgdGhlIHJlc3VsdCBvbiB0aGUgdG9wIG9mIHRoZQo7IHN0YWNrCjsgV2lsbCByZXR1cm4gYW4gZW1wdHkgc3RyaW5nIGlmIHRoZSBwYXRoIGNhbm5vdCBiZSBkZXRlcm1pbmVkCjsKRnVuY3Rpb24gZmluZEphdmFQYXRoCgogIDtDbGVhckVycm9ycwoKICA7UmVhZEVudlN0ciAkMSBKQVZBX0hPTUUKCiAgO0lmRXJyb3JzIDAgRm91bmRKREsKCiAgQ2xlYXJFcnJvcnMKCiAgOyBVc2UgdGhlIDY0LWJpdCByZWdpc3RyeSBvbiA2NC1iaXQgbWFjaGluZXMKICBFeHBhbmRFbnZTdHJpbmdzICQwICIlUFJPR1JBTVc2NDMyJSIKICBTdHJDbXAgJDAgIiVQUk9HUkFNVzY0MzIlIiArMiAwCiAgU2V0UmVnVmlldyA2NAoKICBSZWFkUmVnU3RyICQyIEhLTE0gIlNPRlRXQVJFXEphdmFTb2Z0XEphdmEgUnVudGltZSBFbnZpcm9ubWVudCIgIkN1cnJlbnRWZXJzaW9uIgogIFJlYWRSZWdTdHIgJDEgSEtMTSAiU09GVFdBUkVcSmF2YVNvZnRcSmF2YSBSdW50aW1lIEVudmlyb25tZW50XCQyIiAiSmF2YUhvbWUiCiAgUmVhZFJlZ1N0ciAkMyBIS0xNICJTT0ZUV0FSRVxKYXZhU29mdFxKYXZhIFJ1bnRpbWUgRW52aXJvbm1lbnRcJDIiICJSdW50aW1lTGliIgoKICA7Rm91bmRKREs6CgogIElmRXJyb3JzIDAgTm9FcnJvcnMKICBTdHJDcHkgJDEgIiIKCk5vRXJyb3JzOgoKICBDbGVhckVycm9ycwoKICA7IFB1dCB0aGUgcmVzdWx0IGluIHRoZSBzdGFjawogIFB1c2ggJDEKCkZ1bmN0aW9uRW5kCgoKOyA9PT09PT09PT09PT09PT09PT09PQo7IEZpbmRKVk1QYXRoIEZ1bmN0aW9uCjsgPT09PT09PT09PT09PT09PT09PT0KOwo7IEZpbmQgdGhlIGZ1bGwgSlZNIHBhdGgsIGFuZCBwdXQgdGhlIHJlc3VsdCBvbiB0b3Agb2YgdGhlIHN0YWNrCjsgQXJndW1lbnQ6IEpWTSBiYXNlIHBhdGggKHJlc3VsdCBvZiBmaW5kSmF2YVBhdGgpCjsgV2lsbCByZXR1cm4gYW4gZW1wdHkgc3RyaW5nIGlmIHRoZSBwYXRoIGNhbm5vdCBiZSBkZXRlcm1pbmVkCjsKRnVuY3Rpb24gZmluZEpWTVBhdGgKCiAgQ2xlYXJFcnJvcnMKICAKICA7U3RlcCBvbmU6IElzIHRoaXMgYSBKUkUgcGF0aCAoUHJvZ3JhbSBGaWxlc1xKYXZhXFhYWCkKICBTdHJDcHkgJDEgIiRKYXZhSG9tZSIKICAKICBTdHJDcHkgJDIgIiQxXGJpblxob3RzcG90XGp2bS5kbGwiCiAgSWZGaWxlRXhpc3RzICIkMiIgRm91bmRKdm1EbGwKICBTdHJDcHkgJDIgIiQxXGJpblxzZXJ2ZXJcanZtLmRsbCIKICBJZkZpbGVFeGlzdHMgIiQyIiBGb3VuZEp2bURsbAogIFN0ckNweSAkMiAiJDFcYmluXGNsaWVudFxqdm0uZGxsIiAgCiAgSWZGaWxlRXhpc3RzICIkMiIgRm91bmRKdm1EbGwKICBTdHJDcHkgJDIgIiQxXGJpblxjbGFzc2ljXGp2bS5kbGwiCiAgSWZGaWxlRXhpc3RzICIkMiIgRm91bmRKdm1EbGwKCiAgO1N0ZXAgdHdvOiBJcyB0aGlzIGEgSkRLIHBhdGggKFByb2dyYW0gRmlsZXNcWFhYXGpyZSkKICBTdHJDcHkgJDEgIiRKYXZhSG9tZVxqcmUiCiAgCiAgU3RyQ3B5ICQyICIkMVxiaW5caG90c3BvdFxqdm0uZGxsIgogIElmRmlsZUV4aXN0cyAiJDIiIEZvdW5kSnZtRGxsCiAgU3RyQ3B5ICQyICIkMVxiaW5cc2VydmVyXGp2bS5kbGwiCiAgSWZGaWxlRXhpc3RzICIkMiIgRm91bmRKdm1EbGwKICBTdHJDcHkgJDIgIiQxXGJpblxjbGllbnRcanZtLmRsbCIgIAogIElmRmlsZUV4aXN0cyAiJDIiIEZvdW5kSnZtRGxsCiAgU3RyQ3B5ICQyICIkMVxiaW5cY2xhc3NpY1xqdm0uZGxsIgogIElmRmlsZUV4aXN0cyAiJDIiIEZvdW5kSnZtRGxsCgogIENsZWFyRXJyb3JzCiAgO1N0ZXAgdHJlZTogUmVhZCBkZWZhdWx0cyBmcm9tIHJlZ2lzdHJ5CiAgCiAgUmVhZFJlZ1N0ciAkMSBIS0xNICJTT0ZUV0FSRVxKYXZhU29mdFxKYXZhIFJ1bnRpbWUgRW52aXJvbm1lbnQiICJDdXJyZW50VmVyc2lvbiIKICBSZWFkUmVnU3RyICQyIEhLTE0gIlNPRlRXQVJFXEphdmFTb2Z0XEphdmEgUnVudGltZSBFbnZpcm9ubWVudFwkMSIgIlJ1bnRpbWVMaWIiCiAgCiAgSWZFcnJvcnMgMCBGb3VuZEp2bURsbAogIFN0ckNweSAkMiAiIgoKICBGb3VuZEp2bURsbDoKICBDbGVhckVycm9ycwoKICA7IFB1dCB0aGUgcmVzdWx0IGluIHRoZSBzdGFjawogIFB1c2ggJDIKCkZ1bmN0aW9uRW5kCgoKOyA9PT09PT09PT09PT09PT09PT09PQo7IENoZWNrSnZtIEZ1bmN0aW9uCjsgPT09PT09PT09PT09PT09PT09PT0KOwpGdW5jdGlvbiBjaGVja0p2bQoKICAhaW5zZXJ0bWFjcm8gTVVJX0lOU1RBTExPUFRJT05TX1JFQUQgJDMgImp2bS5pbmkiICJGaWVsZCAyIiAiU3RhdGUiCiAgSWZGaWxlRXhpc3RzICIkM1xiaW5camF2YS5leGUiIE5vRXJyb3JzMQogIE1lc3NhZ2VCb3ggTUJfT0t8TUJfSUNPTlNUT1AgIk5vIEphdmEgVmlydHVhbCBNYWNoaW5lIGZvdW5kIGluIGZvbGRlcjokXHIkXG4kMyIKICBRdWl0Ck5vRXJyb3JzMToKICBTdHJDcHkgIiRKYXZhSG9tZSIgJDMKICBDYWxsIGZpbmRKVk1QYXRoCiAgUG9wICQ0CiAgU3RyQ21wICQ0ICIiIDAgTm9FcnJvcnMyCiAgTWVzc2FnZUJveCBNQl9PS3xNQl9JQ09OU1RPUCAiTm8gSmF2YSBWaXJ0dWFsIE1hY2hpbmUgZm91bmQgaW4gZm9sZGVyOiRcciRcbiQzIgogIFF1aXQKTm9FcnJvcnMyOgoKRnVuY3Rpb25FbmQKCjsgPT09PT09PT09PT09PT09PT09CjsgQ29uZmlndXJlIEZ1bmN0aW9uCjsgPT09PT09PT09PT09PT09PT09CjsKOyBEaXNwbGF5IHRoZSBjb25maWd1cmF0aW9uIGRpYWxvZyBib3hlcywgcmVhZCB0aGUgdmFsdWVzIGVudGVyZWQgYnkgdGhlIHVzZXIsCjsgYW5kIGJ1aWxkIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzCjsKRnVuY3Rpb24gY29uZmlndXJlCgogICFpbnNlcnRtYWNybyBNVUlfSU5TVEFMTE9QVElPTlNfUkVBRCAkUjAgImNvbmZpZy5pbmkiICJGaWVsZCAyIiAiU3RhdGUiCiAgIWluc2VydG1hY3JvIE1VSV9JTlNUQUxMT1BUSU9OU19SRUFEICRSMSAiY29uZmlnLmluaSIgIkZpZWxkIDUiICJTdGF0ZSIKICAhaW5zZXJ0bWFjcm8gTVVJX0lOU1RBTExPUFRJT05TX1JFQUQgJFIyICJjb25maWcuaW5pIiAiRmllbGQgNyIgIlN0YXRlIgoKICBJZlNpbGVudCAwICsyCiAgU3RyQ3B5ICRSMCAnODA4MCcKCiAgU3RyQ3B5ICRSNCAncG9ydD0iJFIwIicKICBTdHJDcHkgJFI1ICcnCgogIElmU2lsZW50IFNpbGVudCAwCgogIDsgRXNjYXBlIFhNTAogIFB1c2ggJFIxCiAgQ2FsbCB4bWxFc2NhcGUKICBQb3AgJFIxCiAgUHVzaCAkUjIKICBDYWxsIHhtbEVzY2FwZQogIFBvcCAkUjIKCiAgU3RyQ21wICRSMSAiIiArNCAwICA7IEJsYW5rIHVzZXIgLSBkbyBub3QgYWRkIGFueXRoaW5nIHRvIHRvbWNhdC11c2Vycy54bWwKICBTdHJDbXAgJFIyICIiICszIDAgIDsgQmxhbmsgcGFzc3dvcmQgLSBkbyBub3QgYWRkIGFueXRoaW5nIHRvIHRvbWNhdC11c2Vycy54bWwKICBTdHJDcHkgJFI1ICc8dXNlciBuYW1lPSIkUjEiIHBhc3N3b3JkPSIkUjIiIHJvbGVzPSJhZG1pbixtYW5hZ2VyIiAvPicKICBEZXRhaWxQcmludCAnQWRtaW4gdXNlciBhZGRlZDogIiRSMSInCgpTaWxlbnQ6CiAgRGV0YWlsUHJpbnQgJ0hUVFAvMS4xIENvbm5lY3RvciBjb25maWd1cmVkIG9uIHBvcnQgIiRSMCInCgogIFNldE91dFBhdGggJFRFTVAKICBGaWxlIC9yIGNvbmZpbnN0YWxsCgogIDsgQnVpbGQgZmluYWwgc2VydmVyLnhtbAogIERlbGV0ZSAiJElOU1RESVJcY29uZlxzZXJ2ZXIueG1sIgogIEZpbGVPcGVuICRSOSAiJElOU1RESVJcY29uZlxzZXJ2ZXIueG1sIiB3CgogIFB1c2ggIiRURU1QXGNvbmZpbnN0YWxsXHNlcnZlcl8xLnhtbCIKICBDYWxsIGNvcHlGaWxlCiAgRmlsZVdyaXRlICRSOSAkUjQKICBQdXNoICIkVEVNUFxjb25maW5zdGFsbFxzZXJ2ZXJfMi54bWwiCiAgQ2FsbCBjb3B5RmlsZQoKICBGaWxlQ2xvc2UgJFI5CgogIERldGFpbFByaW50ICJzZXJ2ZXIueG1sIHdyaXR0ZW4iCgogIDsgQnVpbGQgZmluYWwgdG9tY2F0LXVzZXJzLnhtbAogIAogIERlbGV0ZSAiJElOU1RESVJcY29uZlx0b21jYXQtdXNlcnMueG1sIgogIEZpbGVPcGVuICRSOSAiJElOU1RESVJcY29uZlx0b21jYXQtdXNlcnMueG1sIiB3CgogIFB1c2ggIiRURU1QXGNvbmZpbnN0YWxsXHRvbWNhdC11c2Vyc18xLnhtbCIKICBDYWxsIGNvcHlGaWxlCiAgRmlsZVdyaXRlICRSOSAkUjUKICBQdXNoICIkVEVNUFxjb25maW5zdGFsbFx0b21jYXQtdXNlcnNfMi54bWwiCiAgQ2FsbCBjb3B5RmlsZQoKICBGaWxlQ2xvc2UgJFI5CgogIERldGFpbFByaW50ICJ0b21jYXQtdXNlcnMueG1sIHdyaXR0ZW4iCgogIFJNRGlyIC9yICIkVEVNUFxjb25maW5zdGFsbCIKCkZ1bmN0aW9uRW5kCgoKRnVuY3Rpb24geG1sRXNjYXBlCiAgUG9wICQwCiAgJHtTdHJSZXB9ICQwICQwICImIiAiJmFtcDsiCiAgJHtTdHJSZXB9ICQwICQwICIkXCIiICImcXVvdDsiCiAgJHtTdHJSZXB9ICQwICQwICI8IiAiJmx0OyIKICAke1N0clJlcH0gJDAgJDAgIj4iICImZ3Q7IgogIFB1c2ggJDAKRnVuY3Rpb25FbmQKCgo7ID09PT09PT09PT09PT09PT09CjsgQ29weUZpbGUgRnVuY3Rpb24KOyA9PT09PT09PT09PT09PT09PQo7CjsgQ29weSBzcGVjaWZpZWQgZmlsZSBjb250ZW50cyB0byAkUjkKOwpGdW5jdGlvbiBjb3B5RmlsZQoKICBDbGVhckVycm9ycwoKICBQb3AgJDAKCiAgRmlsZU9wZW4gJDEgJDAgcgoKIE5vRXJyb3I6CgogIEZpbGVSZWFkICQxICQyCiAgSWZFcnJvcnMgRU9GIDAKICBGaWxlV3JpdGUgJFI5ICQyCgogIElmRXJyb3JzIDAgTm9FcnJvcgoKIEVPRjoKCiAgRmlsZUNsb3NlICQxCgogIENsZWFyRXJyb3JzCgpGdW5jdGlvbkVuZAoKCjstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo7VW5pbnN0YWxsZXIgU2VjdGlvbgoKU2VjdGlvbiBVbmluc3RhbGwKCiAgRGVsZXRlICIkSU5TVERJUlxtb2Rlcm4uZXhlIgogIERlbGV0ZSAiJElOU1RESVJcVW5pbnN0YWxsLmV4ZSIKCiAgOyBTdG9wIFRvbWNhdCBzZXJ2aWNlIG1vbml0b3IgaWYgcnVubmluZwogIG5zRXhlYzo6RXhlY1RvTG9nICciJElOU1RESVJcYmluXHRvbWNhdDV3LmV4ZSIgLy9NUS8vVG9tY2F0NScKICA7IERlbGV0ZSBUb21jYXQgc2VydmljZQogIG5zRXhlYzo6RXhlY1RvTG9nICciJElOU1RESVJcYmluXHRvbWNhdDUuZXhlIiAvL0RTLy9Ub21jYXQ1JwogIENsZWFyRXJyb3JzCgogIERlbGV0ZVJlZ0tleSBIS0NSICJKU1BGaWxlIgogIERlbGV0ZVJlZ0tleSBIS0xNICJTb2Z0d2FyZVxNaWNyb3NvZnRcV2luZG93c1xDdXJyZW50VmVyc2lvblxVbmluc3RhbGxcQXBhY2hlIFRvbWNhdCA1LjUiCiAgRGVsZXRlUmVnS2V5IEhLTE0gIlNPRlRXQVJFXEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uXFRvbWNhdFw1LjUiCiAgRGVsZXRlUmVnVmFsdWUgSEtMTSAiU29mdHdhcmVcTWljcm9zb2Z0XFdpbmRvd3NcQ3VycmVudFZlcnNpb25cUnVuIiAiQXBhY2hlVG9tY2F0TW9uaXRvciIKICBSTURpciAvciAiJFNNUFJPR1JBTVNcQXBhY2hlIFRvbWNhdCA1LjUiCiAgRGVsZXRlICIkSU5TVERJUlx0b21jYXQuaWNvIgogIERlbGV0ZSAiJElOU1RESVJcTElDRU5TRSIKICBEZWxldGUgIiRJTlNURElSXE5PVElDRSIKICBSTURpciAvciAiJElOU1RESVJcYmluIgogIFJNRGlyIC9yICIkSU5TVERJUlxjb21tb24iCiAgRGVsZXRlICIkSU5TVERJUlxjb25mXCouZHRkIgogIFJNRGlyIC9yICIkSU5TVERJUlxzaGFyZWQiCiAgUk1EaXIgIiRJTlNURElSXGxvZ3MiCiAgUk1EaXIgL3IgIiRJTlNURElSXHNlcnZlciIKICBSTURpciAvciAiJElOU1RESVJcd2ViYXBwc1xiYWxhbmNlciIKICBSTURpciAvciAiJElOU1RESVJcd2ViYXBwc1x0b21jYXQtZG9jcyIKICBSTURpciAvciAiJElOU1RESVJcd2ViYXBwc1xzZXJ2bGV0cy1leGFtcGxlcyIKICBSTURpciAvciAiJElOU1RESVJcd2ViYXBwc1xqc3AtZXhhbXBsZXMiCiAgUk1EaXIgL3IgIiRJTlNURElSXHdlYmFwcHNcd2ViZGF2IgogIFJNRGlyIC9yICIkSU5TVERJUlx3b3JrIgogIFJNRGlyIC9yICIkSU5TVERJUlx0ZW1wIgogIFJNRGlyIC9yICIkSU5TVERJUlxzcmMiCiAgUk1EaXIgIiRJTlNURElSIgoKICBJZlNpbGVudCBSZW1vdmVkIDAKCiAgOyBpZiAkSU5TVERJUiB3YXMgcmVtb3ZlZCwgc2tpcCB0aGVzZSBuZXh0IG9uZXMKICBJZkZpbGVFeGlzdHMgIiRJTlNURElSIiAwIFJlbW92ZWQgCiAgICBNZXNzYWdlQm94IE1CX1lFU05PfE1CX0lDT05RVUVTVElPTiBcCiAgICAgICJSZW1vdmUgYWxsIGZpbGVzIGluIHlvdXIgVG9tY2F0IDUuNSBkaXJlY3Rvcnk/IChJZiB5b3UgaGF2ZSBhbnl0aGluZyAgXAogeW91IGNyZWF0ZWQgdGhhdCB5b3Ugd2FudCB0byBrZWVwLCBjbGljayBObykiIElETk8gUmVtb3ZlZAogICAgUk1EaXIgL3IgIiRJTlNURElSXHdlYmFwcHNcUk9PVCIgOyB0aGlzIHdvdWxkIGJlIHNraXBwZWQgaWYgdGhlIHVzZXIgaGl0cyBubwogICAgUk1EaXIgIiRJTlNURElSXHdlYmFwcHMiCiAgICBEZWxldGUgIiRJTlNURElSXCouKiIgCiAgICBSTURpciAvciAiJElOU1RESVIiCiAgICBTbGVlcCA1MDAKICAgIElmRmlsZUV4aXN0cyAiJElOU1RESVIiIDAgUmVtb3ZlZCAKICAgICAgTWVzc2FnZUJveCBNQl9PS3xNQl9JQ09ORVhDTEFNQVRJT04gXAogICAgICAgICAgICAgICAgICJOb3RlOiAkSU5TVERJUiBjb3VsZCBub3QgYmUgcmVtb3ZlZC4iCiAgUmVtb3ZlZDoKClNlY3Rpb25FbmQKCjtlb2YK