dW5pdCBNUDNleHBvcnQ7CgppbnRlcmZhY2UKClVzZXMgU3lzVXRpbHMsIFdpblR5cGVzLCBXaW5Qcm9jcywgTWVzc2FnZXMsIENsYXNzZXMsIEdyYXBoaWNzLCBDb250cm9scywKRm9ybXMsIERpYWxvZ3MsIFN0ZEN0cmxzOwoKdHlwZQovL3R5cGUgZGVmaW5pdGlvbnMKLy90eXBlZGVmCQl1bnNpZ25lZCBsb25nCQkJSEJFX1NUUkVBTTsKLy90eXBlZGVmCQlIQkVfU1RSRUFNCQkJCSpQSEJFX1NUUkVBTTsKLy90eXBlZGVmCQl1bnNpZ25lZCBsb25nCQkJQkVfRVJSOwogIFRIQkVfU1RSRUFNID0gTG9uZ1dvcmQ7CiAgUEhCRV9TVFJFQU0gPSBeUEhCRV9TVFJFQU07CiAgQkVfRVJSID0gTG9uZ1dvcmQ7Cgpjb25zdAovLyBlbmNvZGluZyBmb3JtYXRzCi8vI2RlZmluZQkJQkVfQ09ORklHX01QMwkJCTAKLy8jZGVmaW5lCQlCRV9DT05GSUdfTEFNRQkJCTI1NgogIEJFX0NPTkZJR19NUDMJID0gMDsKICBCRV9DT05GSUdfTEFNRSA9IDI1NjsKCgovLyBlcnJvciBjb2RlcwovLyNkZWZpbmUgICAgQkVfRVJSX1NVQ0NFU1NGVUwJCSAgICAgICAgMHgwMDAwMDAwMAovLyNkZWZpbmUgICAgQkVfRVJSX0lOVkFMSURfRk9STUFUCQkweDAwMDAwMDAxCi8vI2RlZmluZSAgICBCRV9FUlJfSU5WQUxJRF9GT1JNQVRfUEFSQU1FVEVSUwkweDAwMDAwMDAyCi8vI2RlZmluZSAgICBCRV9FUlJfTk9fTU9SRV9IQU5ETEVTCQkweDAwMDAwMDAzCi8vI2RlZmluZSAgICBCRV9FUlJfSU5WQUxJRF9IQU5ETEUJCTB4MDAwMDAwMDQKQkVfRVJSX1NVQ0NFU1NGVUw6IExvbmdXb3JkID0gMDsKQkVfRVJSX0lOVkFMSURfRk9STUFUOiBMb25nV29yZCA9IDE7CkJFX0VSUl9JTlZBTElEX0ZPUk1BVF9QQVJBTUVURVJTOiBMb25nV29yZCA9IDI7CkJFX0VSUl9OT19NT1JFX0hBTkRMRVM6IExvbmdXb3JkID0gMzsKQkVfRVJSX0lOVkFMSURfSEFORExFOiBMb25nV29yZCA9IDQ7CgovLyBvdGhlciBjb25zdGFudHMKCkJFX01BWF9IT01FUEFHRQk9IDI1NjsKCi8vIGZvcm1hdCBzcGVjaWZpYyB2YXJpYWJsZXMKCkJFX01QM19NT0RFX1NURVJFTyA9IDA7CkJFX01QM19NT0RFX0RVQUxDSEFOTkVMID0gMjsKQkVfTVAzX01PREVfTU9OTyA9IDM7Cgp0eXBlCgogIFRNUDMgPSBwYWNrZWQgcmVjb3JkCiAgICAgICAgICAgZHdTYW1wbGVSYXRlICAgICA6IExvbmdXb3JkOwogICAgICAgICAgIGJ5TW9kZSAgICAgICAgICAgOiBCeXRlOwogICAgICAgICAgIHdCaXRSYXRlICAgICAgICAgOiBXb3JkOwogICAgICAgICAgIGJQcml2YXRlICAgICAgICAgOiBMb25nV29yZDsKICAgICAgICAgICBiQ1JDICAgICAgICAgICAgIDogTG9uZ1dvcmQ7CiAgICAgICAgICAgYkNvcHlyaWdodCAgICAgICA6IExvbmdXb3JkOwogICAgICAgICAgIGJPcmlnaW5hbCAgICAgICAgOiBMb25nV29yZDsKICAgICAgICAgICBlbmQ7CgogIFRMSFYxID0gcGFja2VkIHJlY29yZAogICAgICAgICAgLy8gU1RSVUNUVVJFIElORk9STUFUSU9OCiAgICAgICAgICAgIGR3U3RydWN0VmVyc2lvbjogRFdPUkQ7CiAgICAgICAgICAgIGR3U3RydWN0U2l6ZTogRFdPUkQ7CgogICAgICAgICAgLy8gQkFTSUMgRU5DT0RFUiBTRVRUSU5HUwogICAgICAgICAgICBkd1NhbXBsZVJhdGU6IERXT1JEOwkvLyBBTExPV0VEIFNBTVBMRVJBVEUgVkFMVUVTIERFUEVORFMgT04gZHdNUEVHVmVyc2lvbgogICAgICAgICAgICBkd1JlU2FtcGxlUmF0ZTogRFdPUkQ7CS8vIERPV05TQU1QTEVSQVRFLCAwPUVOQ09ERVIgREVDSURFUwogICAgICAgICAgICBuTW9kZTogSW50ZWdlcjsJICAJLy8gQkVfTVAzX01PREVfU1RFUkVPLCBCRV9NUDNfTU9ERV9EVUFMQ0hBTk5FTCwgQkVfTVAzX01PREVfTU9OTwogICAgICAgICAgICBkd0JpdHJhdGU6IERXT1JEOwkJLy8gQ0JSIGJpdHJhdGUsIFZCUiBtaW4gYml0cmF0ZQogICAgICAgICAgICBkd01heEJpdHJhdGU6IERXT1JEOwkvLyBDQlIgaWdub3JlZCwgVkJSIE1heCBiaXRyYXRlCiAgICAgICAgICAgIG5RdWFsaXR5OiBJbnRlZ2VyOyAgIAkvLyBRdWFsaXR5IHNldHRpbmcgKE5PUk1BTCxISUdILExPVyxWT0lDRSkKICAgICAgICAgICAgZHdNcGVnVmVyc2lvbjogRFdPUkQ7CS8vIE1QRUctMSBPUiBNUEVHLTIKICAgICAgICAgICAgZHdQc3lNb2RlbDogRFdPUkQ7CQkvLyBGVVRVUkUgVVNFLCBTRVQgVE8gMAogICAgICAgICAgICBkd0VtcGhhc2lzOiBEV09SRDsJCS8vIEZVVFVSRSBVU0UsIFNFVCBUTyAwCgogICAgICAgICAgLy8gQklUIFNUUkVBTSBTRVRUSU5HUwogICAgICAgICAgICBiUHJpdmF0ZTogTE9OR0JPT0w7CQkvLyBTZXQgUHJpdmF0ZSBCaXQgKFRSVUUvRkFMU0UpCiAgICAgICAgICAgIGJDUkM6IExPTkdCT09MOwkJLy8gSW5zZXJ0IENSQyAoVFJVRS9GQUxTRSkKICAgICAgICAgICAgYkNvcHlyaWdodDogTE9OR0JPT0w7CS8vIFNldCBDb3B5cmlnaHQgQml0IChUUlVFL0ZBTFNFKQogICAgICAgICAgICBiT3JpZ2luYWw6IExPTkdCT09MOwkvLyBTZXQgT3JpZ2luYWwgQml0IChUUlVFL0ZBTFNFXwoKICAgICAgICAgIC8vIFZCUiBTVFVGRgogICAgICAgICAgICBiV3JpdGVWQlJIZWFkZXI6IExPTkdCT09MOwkvLyBXUklURSBYSU5HIFZCUiBIRUFERVIgKFRSVUUvRkFMU0UpCiAgICAgICAgICAgIGJFbmFibGVWQlI6IExPTkdCT09MOyAgICAgICAvLyBVU0UgVkJSIEVOQ09ESU5HIChUUlVFL0ZBTFNFKQogICAgICAgICAgICBuVkJSUXVhbGl0eTogSW50ZWdlcjsJLy8gVkJSIFFVQUxJVFkgMC4uOQoKICAgICAgICAgICAgYnRSZXNlcnZlZDogYXJyYXlbMC4uMjU1XSBvZiBCeXRlOwkvLyBGVVRVUkUgVVNFLCBTRVQgVE8gMAogICAgICAgICAgICBlbmQ7CgogIFRBQUMgPSBwYWNrZWQgcmVjb3JkCiAgICAgICAgICAgZHdTYW1wbGVSYXRlICAgICA6IExvbmdXb3JkOwogICAgICAgICAgIGJ5TW9kZSAgICAgICAgICAgOiBCeXRlOwogICAgICAgICAgIHdCaXRSYXRlICAgICAgICAgOiBXb3JkOwogICAgICAgICAgIGJ5RW5jb2RpbmdNZXRob2QgOiBCeXRlOwogICAgICAgICAgIGVuZDsKCiAgVEZvcm1hdCA9IHBhY2tlZCByZWNvcmQKICAgICAgICAgICAgICBjYXNlIGJ5dGUgb2YKICAgICAgICAgICAgICAgIDEgOiAobXAzICAgICAgICAgICA6IFRNUDMpOwogICAgICAgICAgICAgICAgMiA6IChsaHYxICAgICAgICAgIDogVExIVjEpOwogICAgICAgICAgICAgICAgMyA6IChhYWMgICAgICAgICAgIDogVEFBQyk7CiAgICAgICAgICAgICAgZW5kOwoKICBUQkVfQ29uZmlnID0gcGFja2VkIHJlY29yZAogICAgICAgICAgICAgICAgIGR3Q29uZmlnICAgOiBMb25nV29yZDsKICAgICAgICAgICAgICAgICBmb3JtYXQgICAgIDogVEZvcm1hdDsKICAgICAgICAgICAgICAgICBlbmQ7CgoKICBQQkVfQ29uZmlnID0gXlRCRV9Db25maWc7CgovL3R5cGVkZWYgc3RydWN0CXsKLy8JLy8gQmxhZGVFbmMgRExMIFZlcnNpb24gbnVtYmVyCi8vCi8vCUJZVEUJYnlETExNYWpvclZlcnNpb247Ci8vCUJZVEUJYnlETExNaW5vclZlcnNpb247Ci8vCi8vCS8vIEJsYWRlRW5jIEVuZ2luZSBWZXJzaW9uIE51bWJlcgovLwovLwlCWVRFCWJ5TWFqb3JWZXJzaW9uOwovLwlCWVRFCWJ5TWlub3JWZXJzaW9uOwovLwovLwkvLyBETEwgUmVsZWFzZSBkYXRlCi8vCi8vCUJZVEUJYnlEYXk7Ci8vCUJZVEUJYnlNb250aDsKLy8JV09SRAl3WWVhcjsKLy8KLy8JLy8gQmxhZGVFbmMJSG9tZXBhZ2UgVVJMCi8vCi8vCUNIQVIJekhvbWVwYWdlW0JFX01BWF9IT01FUEFHRSArIDFdOwovLwovL30gQkVfVkVSU0lPTiwgKlBCRV9WRVJTSU9OOwoKICBUQkVfVmVyc2lvbiA9IHJlY29yZAogICAgICAgICAgICAgICAgICBieURMTE1ham9yVmVyc2lvbiA6IEJ5dGU7CiAgICAgICAgICAgICAgICAgIGJ5RExMTWlub3JWZXJzaW9uIDogQnl0ZTsKCiAgICAgICAgICAgICAgICAgIGJ5TWFqb3JWZXJzaW9uICAgIDogQnl0ZTsKICAgICAgICAgICAgICAgICAgYnlNaW5vclZlcnNpb24gICAgOiBCeXRlOwoKICAgICAgICAgICAgICAgICAgYnlEYXkgICAgICAgICAgICAgOiBCeXRlOwogICAgICAgICAgICAgICAgICBieU1vbnRoICAgICAgICAgICA6IEJ5dGU7CiAgICAgICAgICAgICAgICAgIHdZZWFyICAgICAgICAgICAgIDogV29yZDsKCiAgICAgICAgICAgICAgICAgIHpIb21lUGFnZSAgICAgICAgIDogQXJyYXlbMC4uQkVfTUFYX0hPTUVQQUdFICsgMV0gb2YgQ2hhcjsKICAgICAgICAgICAgICAgICAgZW5kOwoKICBQQkVfVmVyc2lvbiA9IF5UQkVfVmVyc2lvbjsKCi8vX19kZWNsc3BlYyhkbGxleHBvcnQpIEJFX0VSUgliZUluaXRTdHJlYW0oUEJFX0NPTkZJRyBwYmVDb25maWcsIFBEV09SRCBkd1NhbXBsZXMsIFBEV09SRCBkd0J1ZmZlclNpemUsIFBIQkVfU1RSRUFNIHBoYmVTdHJlYW0pOwovL19fZGVjbHNwZWMoZGxsZXhwb3J0KSBCRV9FUlIJYmVFbmNvZGVDaHVuayhIQkVfU1RSRUFNIGhiZVN0cmVhbSwgRFdPUkQgblNhbXBsZXMsIFBTSE9SVCBwU2FtcGxlcywgUEJZVEUgcE91dHB1dCwgUERXT1JEIHBkd091dHB1dCk7Ci8vX19kZWNsc3BlYyhkbGxleHBvcnQpIEJFX0VSUgliZURlaW5pdFN0cmVhbShIQkVfU1RSRUFNIGhiZVN0cmVhbSwgUEJZVEUgcE91dHB1dCwgUERXT1JEIHBkd091dHB1dCk7Ci8vX19kZWNsc3BlYyhkbGxleHBvcnQpIEJFX0VSUgliZUNsb3NlU3RyZWFtKEhCRV9TVFJFQU0gaGJlU3RyZWFtKTsKLy9fX2RlY2xzcGVjKGRsbGV4cG9ydCkgVk9JRAliZVZlcnNpb24oUEJFX1ZFUlNJT04gcGJlVmVyc2lvbik7Cgp7CkZ1bmN0aW9uIGJlSW5pdFN0cmVhbSh2YXIgcGJlQ29uZmlnOiBUQkVfQ09ORklHOyB2YXIgZHdTYW1wbGU6IExvbmdXb3JkOyB2YXIgZHdCdWZmZXJTaXplOiBMb25nV29yZDsgdmFyIHBoYmVTdHJlYW06IFRIQkVfU1RSRUFNICk6IEJFX0VycjsgY2RlY2w7IGV4dGVybmFsICdCbGFkZWVuYy5kbGwnOwovL0Z1bmN0aW9uIGJlRW5jb2RlQ2h1bmsoaGJlU3RyZWFtOiBUSEJFX1NUUkVBTTsgblNhbXBsZXM6IExvbmdXb3JkOyBwU2FtcGxlOiBQU21hbGxJbnQ7cE91dHB1dDogUEJ5dGU7IHZhciBwZHdPdXRwdXQ6IExvbmdXb3JkKTogQkVfRXJyOyBjZGVjbDsgZXh0ZXJuYWwgJ0JsYWRlZW5jLmRsbCc7CkZ1bmN0aW9uIGJlRW5jb2RlQ2h1bmsoaGJlU3RyZWFtOiBUSEJFX1NUUkVBTTsgblNhbXBsZXM6IExvbmdXb3JkOyB2YXIgcFNhbXBsZTt2YXIgcE91dHB1dDsgdmFyIHBkd091dHB1dDogTG9uZ1dvcmQpOiBCRV9FcnI7IHN0ZGNhbGw7IGNkZWNsICdCbGFkZWVuYy5kbGwnOwpGdW5jdGlvbiBiZURlaW5pdFN0cmVhbShoYmVTdHJlYW06IFRIQkVfU1RSRUFNOyB2YXIgcE91dHB1dDsgdmFyIHBkd091dHB1dDogTG9uZ1dvcmQpOiBCRV9FcnI7IGNkZWNsOyBleHRlcm5hbCAnQmxhZGVlbmMuZGxsJzsKRnVuY3Rpb24gYmVDbG9zZVN0cmVhbShoYmVTdHJlYW06IFRIQkVfU1RSRUFNKTogQkVfRXJyOyBjZGVjbDsgZXh0ZXJuYWwgJ0JsYWRlZW5jLmRsbCc7ClByb2NlZHVyZSBiZVZlcnNpb24odmFyIHBiZVZlcnNpb246IFRCRV9WRVJTSU9OKTsgY2RlY2w7IGV4dGVybmFsICdCbGFkZWVuYy5kbGwnOwp9CgpGdW5jdGlvbiBiZUluaXRTdHJlYW0odmFyIHBiZUNvbmZpZzogVEJFX0NPTkZJRzsgdmFyIGR3U2FtcGxlOiBMb25nV29yZDsgdmFyIGR3QnVmZmVyU2l6ZTogTG9uZ1dvcmQ7IHZhciBwaGJlU3RyZWFtOiBUSEJFX1NUUkVBTSApOiBCRV9FcnI7IGNkZWNsOyBleHRlcm5hbCAnTGFtZV9lbmMuZGxsJzsKLy9GdW5jdGlvbiBiZUVuY29kZUNodW5rKGhiZVN0cmVhbTogVEhCRV9TVFJFQU07IG5TYW1wbGVzOiBMb25nV29yZDsgcFNhbXBsZTogUFNtYWxsSW50O3BPdXRwdXQ6IFBCeXRlOyB2YXIgcGR3T3V0cHV0OiBMb25nV29yZCk6IEJFX0VycjsgY2RlY2w7IGV4dGVybmFsICdMYW1lX2VuYy5kbGwnOwpGdW5jdGlvbiBiZUVuY29kZUNodW5rKGhiZVN0cmVhbTogVEhCRV9TVFJFQU07IG5TYW1wbGVzOiBMb25nV29yZDsgdmFyIHBTYW1wbGU7dmFyIHBPdXRwdXQ7IHZhciBwZHdPdXRwdXQ6IExvbmdXb3JkKTogQkVfRXJyOyBjZGVjbDsgZXh0ZXJuYWwgJ0xhbWVfZW5jLmRsbCc7CkZ1bmN0aW9uIGJlRGVpbml0U3RyZWFtKGhiZVN0cmVhbTogVEhCRV9TVFJFQU07IHZhciBwT3V0cHV0OyB2YXIgcGR3T3V0cHV0OiBMb25nV29yZCk6IEJFX0VycjsgY2RlY2w7IGV4dGVybmFsICdMYW1lX2VuYy5kbGwnOwpGdW5jdGlvbiBiZUNsb3NlU3RyZWFtKGhiZVN0cmVhbTogVEhCRV9TVFJFQU0pOiBCRV9FcnI7IGNkZWNsOyBleHRlcm5hbCAnTGFtZV9lbmMuZGxsJzsKUHJvY2VkdXJlIGJlVmVyc2lvbih2YXIgcGJlVmVyc2lvbjogVEJFX1ZFUlNJT04pOyBjZGVjbDsgZXh0ZXJuYWwgJ0xhbWVfZW5jLmRsbCc7CgpQcm9jZWR1cmUgRW5jb2RlV2F2VG9NUDMoZnMsIGZkOiBJbnRlZ2VyKTsKaW1wbGVtZW50YXRpb24KClVzZXMgSW50ZXJuZXRTbmQsIFRyYWl0ZVdhdjsKCnstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfQpQcm9jZWR1cmUgRW5jb2RlV2F2VG9NUDMoZnMsIGZkOiBJbnRlZ2VyKTsKdmFyCiAgZXJyOiBJbnRlZ2VyOwogIGJlQ29uZmlnOiBUQkVfQ29uZmlnOwogIGR3U2FtcGxlcywgZHdTYW1wbGVzTVAzIDogTG9uZ1dvcmQ7CiAgaGJlU3RyZWFtIDogVEhCRV9TVFJFQU07CiAgZXJyb3I6IEJFX0VSUjsKICBwQnVmZmVyOiBQU21hbGxJbnQ7CiAgcE1QM0J1ZmZlcjogUEJ5dGU7CiAgTWFycXVlOlBDaGFyOwoKICBkb25lOiBMb25nV29yZDsKICBkd1dyaXRlOiBMb25nV29yZDsKICBUb1JlYWQ6IExvbmdXb3JkOwogIFRvV3JpdGU6IExvbmdXb3JkOwogIGk6SW50ZWdlcjsKCmJlZ2luCiAgYmVDb25maWcuZHdDb25maWcgOj0gQkVfQ09ORklHX0xBTUU7Cgp7CiAgYmVDb25maWcuRm9ybWF0Lm1wMy5kd1NhbXBsZVJhdGUgOj0gV2F2SW5mby5TYW1wbGVzUGVyU2VjOwogIGJlQ29uZmlnLkZvcm1hdC5tcDMuYnlNb2RlIDo9IEJFX01QM19NT0RFX1NURVJFTzsKICBiZUNvbmZpZy5Gb3JtYXQubXAzLndCaXRyYXRlIDo9IHN0clRvSW50KE1haW5Gcm0uTXAzQml0UmF0ZS5UZXh0KTsKICBiZUNvbmZpZy5Gb3JtYXQubXAzLmJDb3B5cmlnaHQgOj0gMDsKICBiZUNvbmZpZy5Gb3JtYXQubXAzLmJDUkMgOj0gJDAwMDAwMDAwOwogIGJlQ29uZmlnLkZvcm1hdC5tcDMuYk9yaWdpbmFsIDo9IDA7CiAgYmVDb25maWcuRm9ybWF0Lm1wMy5iUHJpdmF0ZSA6PSAwOwp9Ci8vU3RydWN0dXJlIGluZm9ybWF0aW9uCiAgYmVDb25maWcuRm9ybWF0LmxodjEuZHdTdHJ1Y3RWZXJzaW9uIDo9IDE7CiAgYmVDb25maWcuRm9ybWF0LmxodjEuZHdTdHJ1Y3RTaXplIDo9IFNpemVPZihiZUNvbmZpZyk7Ci8vQmFzaWMgZW5jb2RlciBzZXR0aW5nCiAgYmVDb25maWcuRm9ybWF0LmxodjEuZHdTYW1wbGVSYXRlIDo9IFdhdkluZm8uU2FtcGxlc1BlclNlYzsKICBiZUNvbmZpZy5Gb3JtYXQubGh2MS5kd1JlU2FtcGxlUmF0ZSA6PSA0NDEwMDsKICBiZUNvbmZpZy5Gb3JtYXQubGh2MS5uTW9kZSA6PSBCRV9NUDNfTU9ERV9TVEVSRU87CiAgYmVDb25maWcuRm9ybWF0LmxodjEuZHdCaXRyYXRlIDo9IHN0clRvSW50KE1haW5Gcm0uTXAzQml0UmF0ZS5UZXh0KTsKICBiZUNvbmZpZy5Gb3JtYXQubGh2MS5kd01heEJpdHJhdGUgOj0gc3RyVG9JbnQoTWFpbkZybS5NcDNCaXRSYXRlLlRleHQpOwogIGJlQ29uZmlnLkZvcm1hdC5saHYxLm5RdWFsaXR5IDo9IDI7CiAgYmVDb25maWcuRm9ybWF0LmxodjEuZHdNUGVnVmVyc2lvbiA6PSAxOyAvL01QRUcxCiAgYmVDb25maWcuRm9ybWF0LmxodjEuZHdQc3lNb2RlbCA6PSAwOwogIGJlQ29uZmlnLkZvcm1hdC5saHYxLmR3RW1waGFzaXMgOj0gMDsKLy9CaXQgU3RyZWFtIFNldHRpbmdzCiAgYmVDb25maWcuRm9ybWF0LmxodjEuYlByaXZhdGUgOj0gRmFsc2U7CiAgYmVDb25maWcuRm9ybWF0LmxodjEuYkNSQyA6PSBGYWxzZTsKICBiZUNvbmZpZy5Gb3JtYXQubGh2MS5iQ29weXJpZ2h0IDo9IFRydWU7CiAgYmVDb25maWcuRm9ybWF0LmxodjEuYk9yaWdpbmFsIDo9IFRydWU7Ci8vVkJSIFN0dWZmCiAgYmVDb25maWcuRm9ybWF0LmxodjEuYldyaXRlVkJSSGVhZGVyIDo9IGZhbHNlOwogIGJlQ29uZmlnLkZvcm1hdC5saHYxLmJFbmFibGVWQlIgOj0gZmFsc2U7CiAgYmVDb25maWcuRm9ybWF0LmxodjEublZCUlF1YWxpdHkgOj0gMDsKCiAgaSA6PSAwOwogIGVycm9yIDo9IGJlSW5pdFN0cmVhbShiZUNvbmZpZywgZHdTYW1wbGVzLCBkd1NhbXBsZXNNUDMsIGhiZVN0cmVhbSk7CiAgaWYgZXJyb3IgPSBCRV9FUlJfU1VDQ0VTU0ZVTAogICAgdGhlbiBiZWdpbgogICAgICAgICBwQnVmZmVyIDo9IEFsbG9jTWVtKGR3U2FtcGxlcyoyKTsKICAgICAgICAgcE1QM0J1ZmZlciA6PSBBbGxvY01lbShkd1NhbXBsZXNNUDMpOwogICAgICAgICB0cnkKICAgICAgICAgICBkb25lIDo9IDA7CgogICAgICAgICAgIGVycm9yIDo9IEZpbGVTZWVrKGZzLCAwLCAwKTsKICAgICAgICAgICBXaGlsZSAoZG9uZSA8IFRvdGFsU2l6ZSkgZG8KICAgICAgICAgICAgIGJlZ2luCiAgICAgICAgICAgICAgIGlmIChkb25lICsgZHdTYW1wbGVzKjIgPCBUb3RhbFNpemUpCiAgICAgICAgICAgICAgICAgdGhlbiBUb1JlYWQgOj0gZHdTYW1wbGVzKjIKICAgICAgICAgICAgICAgICBlbHNlIGJlZ2luCiAgICAgICAgICAgICAgICAgICAgICBUb1JlYWQgOj0gVG90YWxTaXplLWRvbmU7CiAgICAgICAgICAgICAgICAgICAgICAvL0ZpbGxDaGFyKGJ1ZlswXSxkd1NhbXBsZXMqMiwwKTsKICAgICAgICAgICAgICAgICAgICAgIEZpbGxDaGFyKHBidWZmZXJeLGR3U2FtcGxlcywwKTsKICAgICAgICAgICAgICAgICAgICAgIGVuZDsKCiAgICAgICAgICAgICAgIC8vaWYgRmlsZVJlYWQoZnMsIGJ1ZlswXSwgdG9yZWFkKSA9IC0xCiAgICAgICAgICAgICAgIGlmIEZpbGVSZWFkKGZzLCBwYnVmZmVyXiwgdG9yZWFkKSA9IC0xCiAgICAgICAgICAgICAgICAgdGhlbiByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKCdFcnJldXIgZGUgbGVjdHVyZScpOwoKICAgICAgICAgICAgICAgLy9lcnJvciA6PSBiZUVuY29kZUNodW5rKGhiZVN0cmVhbSwgdG9SZWFkIGRpdiAyLCBCdWZbMF0sIFRtcEJ1ZlswXSwgdG9Xcml0ZSk7CiAgICAgICAgICAgICAgIGVycm9yIDo9IGJlRW5jb2RlQ2h1bmsoaGJlU3RyZWFtLCB0b1JlYWQgZGl2IDIsIHBCdWZmZXJeLCBwTVAzQnVmZmVyXiwgdG9Xcml0ZSk7CgogICAgICAgICAgICAgICBpZiBlcnJvciA8PiBCRV9FUlJfU1VDQ0VTU0ZVTAogICAgICAgICAgICAgICAgIHRoZW4gYmVnaW4KICAgICAgICAgICAgICAgICAgICAgIGJlQ2xvc2VTdHJlYW0oaGJlU3RyZWFtKTsKICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoJ0VjaGVjIGRlIGwnJ2VuY29kYWdlJyk7CiAgICAgICAgICAgICAgICAgICAgICBlbmQ7CgogICAgICAgICAgICAgICAvL2lmIEZpbGVXcml0ZShmZCwgVG1wQnVmWzBdLCB0b1dyaXRlKSA9IC0xCiAgICAgICAgICAgICAgIGlmIEZpbGVXcml0ZShmZCwgcE1QM0J1ZmZlcl4sIHRvV3JpdGUpID0gLTEKICAgICAgICAgICAgICAgICB0aGVuIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoJ0VycmV1ciBkJyfpY3JpdHVyZScpOwoKICAgICAgICAgICAgICAgZG9uZSA6PSBkb25lICsgdG9yZWFkOwogICAgICAgICAgICAgICBpbmMoaSk7CiAgICAgICAgICAgICAgIGlmIGkgbW9kIDY0ID0gMAogICAgICAgICAgICAgICAgIHRoZW4gYmVnaW4KICAgICAgICAgICAgICAgICAgICAgIE1haW5Gcm0uUHJvZ3Jlc3NCYXIxLlBvc2l0aW9uIDo9IHJvdW5kKDEwMCpkb25lL1RvdGFsc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICBBcHBsaWNhdGlvbi5Qcm9jZXNzTWVzc2FnZXM7CiAgICAgICAgICAgICAgICAgICAgICBlbmQ7CiAgICAgICAgICAgICBlbmQ7CgogICAgICAgICAgIGVycm9yIDo9IGJlRGVJbml0U3RyZWFtKGhiZVN0cmVhbSwgcE1QM0J1ZmZlcl4sIGR3V3JpdGUpOwogICAgICAgICAgIC8vZXJyb3IgOj0gYmVEZUluaXRTdHJlYW0oaGJlU3RyZWFtLCBUbXBCdWZbMF0sIGR3V3JpdGUpOwoKICAgICAgICAgICBpZiBlcnJvciA8PiBCRV9FUlJfU1VDQ0VTU0ZVTAogICAgICAgICAgICAgdGhlbiBiZWdpbgogICAgICAgICAgICAgICAgICBiZUNsb3NlU3RyZWFtKGhiZVN0cmVhbSk7CiAgICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoJ0VjaGVjIOAgbGEgc29ydGllJyk7CiAgICAgICAgICAgICAgICAgIGVuZDsKCiAgICAgICAgICAgaWYgZHdXcml0ZSA8PiAwCiAgICAgICAgICAgICB0aGVuIGJlZ2luCiAgICAgICAgICAgICAgICAgIC8vaWYgRmlsZVdyaXRlKGZkLCBUbXBCdWZbMF0sIGR3V3JpdGUpID0gLTEKICAgICAgICAgICAgICAgICAgaWYgRmlsZVdyaXRlKGZkLCBwTVAzQnVmZmVyXiwgZHdXcml0ZSkgPSAtMQogICAgICAgICAgICAgICAgICAgIHRoZW4gcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZSgnRXJyZXVyIOAgbGEgZGVybmnocmUg6WNyaXR1cmUnKTsKICAgICAgICAgICAgICAgICAgZW5kOwoKICAgICAgICAgICBiZUNsb3NlU3RyZWFtKGhiZVN0cmVhbSk7CiAgICAgICAgICAgZmluYWxseQogICAgICAgICAgICAgRnJlZU1lbShwQnVmZmVyKTsKICAgICAgICAgICAgIEZyZWVNZW0ocE1QM0J1ZmZlcik7CiAgICAgICAgICAgICBlbmQ7CiAgICAgICAgIGVuZAogICAgZWxzZSBiZWdpbgoKICAgICAgICAgZW5kOwplbmQ7CgplbmQuCg==