ZGlmZiAtLWdpdCBhL0xpYi9jb21waWxlYWxsLnB5IGIvTGliL2NvbXBpbGVhbGwucHkKaW5kZXggNTQxZWVjZi4uOGM2NzhlNCAxMDA2NDQKLS0tIGEvTGliL2NvbXBpbGVhbGwucHkKKysrIGIvTGliL2NvbXBpbGVhbGwucHkKQEAgLTExLDEwICsxMSwxMSBAQAogU2VlIG1vZHVsZSBweV9jb21waWxlIGZvciBkZXRhaWxzIG9mIHRoZSBhY3R1YWwgYnl0ZS1jb21waWxhdGlvbi4KIAogIiIiCi0KIGltcG9ydCBvcwogaW1wb3J0IHN5cwogaW1wb3J0IHB5X2NvbXBpbGUKK2ltcG9ydCBzdHJ1Y3QKK2ltcG9ydCBpbXAKIAogX19hbGxfXyA9IFsiY29tcGlsZV9kaXIiLCJjb21waWxlX3BhdGgiXQogCkBAIC01NCwxMSArNTUsMTcgQEAKICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZnVsbG5hbWUpOgogICAgICAgICAgICAgaGVhZCwgdGFpbCA9IG5hbWVbOi0zXSwgbmFtZVstMzpdCiAgICAgICAgICAgICBpZiB0YWlsID09ICcucHknOgotICAgICAgICAgICAgICAgIGNmaWxlID0gZnVsbG5hbWUgKyAoX19kZWJ1Z19fIGFuZCAnYycgb3IgJ28nKQotICAgICAgICAgICAgICAgIGZ0aW1lID0gb3Muc3RhdChmdWxsbmFtZSkuc3RfbXRpbWUKLSAgICAgICAgICAgICAgICB0cnk6IGN0aW1lID0gb3Muc3RhdChjZmlsZSkuc3RfbXRpbWUKLSAgICAgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6IGN0aW1lID0gMAotICAgICAgICAgICAgICAgIGlmIChjdGltZSA+IGZ0aW1lKSBhbmQgbm90IGZvcmNlOiBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIG5vdCBmb3JjZToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgbXRpbWUgPSBvcy5zdGF0KGZ1bGxuYW1lKS5zdF9tdGltZQorICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ID0gc3RydWN0LnBhY2soJzw0c2wnLCBpbXAuZ2V0X21hZ2ljKCksIG10aW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgY2ZpbGUgPSBmdWxsbmFtZSArIChfX2RlYnVnX18gYW5kICdjJyBvciAnbycpCisgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIG9wZW4oY2ZpbGUsICdyYicpIGFzIGNoYW5kbGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsID0gY2hhbmRsZS5yZWFkKDgpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBleHBlY3QgPT0gYWN0dWFsOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAgICAgIGlmIG5vdCBxdWlldDoKICAgICAgICAgICAgICAgICAgICAgcHJpbnQoJ0NvbXBpbGluZycsIGZ1bGxuYW1lLCAnLi4uJykKICAgICAgICAgICAgICAgICB0cnk6CkBAIC04Niw3ICs5Myw4IEBACiAgICAgICAgICAgICAgbmFtZSAhPSBvcy5jdXJkaXIgYW5kIG5hbWUgIT0gb3MucGFyZGlyIGFuZCBcCiAgICAgICAgICAgICAgb3MucGF0aC5pc2RpcihmdWxsbmFtZSkgYW5kIFwKICAgICAgICAgICAgICBub3Qgb3MucGF0aC5pc2xpbmsoZnVsbG5hbWUpOgotICAgICAgICAgICAgaWYgbm90IGNvbXBpbGVfZGlyKGZ1bGxuYW1lLCBtYXhsZXZlbHMgLSAxLCBkZmlsZSwgZm9yY2UsIHJ4LCBxdWlldCk6CisgICAgICAgICAgICBpZiBub3QgY29tcGlsZV9kaXIoZnVsbG5hbWUsIG1heGxldmVscyAtIDEsIGRmaWxlLCBmb3JjZSwgcngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVpZXQpOgogICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSAwCiAgICAgcmV0dXJuIHN1Y2Nlc3MKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb21waWxlYWxsLnB5IGIvTGliL3Rlc3QvdGVzdF9jb21waWxlYWxsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YjY0NDgKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC90ZXN0X2NvbXBpbGVhbGwucHkKQEAgLTAsMCArMSw2MyBAQAoraW1wb3J0IGNvbXBpbGVhbGwKK2ltcG9ydCBpbXAKK2ltcG9ydCBvcworaW1wb3J0IHB5X2NvbXBpbGUKK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCBzdHJ1Y3QKK2ltcG9ydCBzeXMKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHRpbWUKK2Zyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAoraW1wb3J0IHVuaXR0ZXN0CisKKworY2xhc3MgQ29tcGlsZWFsbFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5kaXJlY3RvcnkgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKKyAgICAgICAgc2VsZi5zb3VyY2VfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLmRpcmVjdG9yeSwgJ190ZXN0LnB5JykKKyAgICAgICAgc2VsZi5iY19wYXRoID0gc2VsZi5zb3VyY2VfcGF0aCArICgnYycgaWYgX19kZWJ1Z19fIGVsc2UgJ28nKQorICAgICAgICB3aXRoIG9wZW4oc2VsZi5zb3VyY2VfcGF0aCwgJ3cnKSBhcyBmaWxlOgorICAgICAgICAgICAgZmlsZS53cml0ZSgneCA9IDEyM1xuJykKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2h1dGlsLnJtdHJlZShzZWxmLmRpcmVjdG9yeSkKKworICAgIGRlZiBkYXRhKHNlbGYpOgorICAgICAgICB3aXRoIG9wZW4oc2VsZi5iY19wYXRoLCAncmInKSBhcyBmaWxlOgorICAgICAgICAgICAgZGF0YSA9IGZpbGUucmVhZCg4KQorICAgICAgICBtdGltZSA9IGludChvcy5zdGF0KHNlbGYuc291cmNlX3BhdGgpLnN0X210aW1lKQorICAgICAgICBjb21wYXJlID0gc3RydWN0LnBhY2soJzw0c2wnLCBpbXAuZ2V0X21hZ2ljKCksIG10aW1lKQorICAgICAgICByZXR1cm4gZGF0YSwgY29tcGFyZQorCisgICAgZGVmIHJlY3JlYXRpb25fY2hlY2soc2VsZiwgbWV0YWRhdGEpOgorICAgICAgICAiIiJDaGVjayB0aGF0IGNvbXBpbGVhbGwgcmVjcmVhdGVzIGJ5dGVjb2RlIHdoZW4gdGhlIG5ldyBtZXRhZGF0YSBpcworICAgICAgICB1c2VkLiIiIgorICAgICAgICBpZiBub3QgaGFzYXR0cihvcywgJ3N0YXQnKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBweV9jb21waWxlLmNvbXBpbGUoc2VsZi5zb3VyY2VfcGF0aCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgqc2VsZi5kYXRhKCkpCisgICAgICAgIHdpdGggb3BlbihzZWxmLmJjX3BhdGgsICdyYicpIGFzIGZpbGU6CisgICAgICAgICAgICBiYyA9IGZpbGUucmVhZCgpW2xlbihtZXRhZGF0YSk6XQorICAgICAgICB3aXRoIG9wZW4oc2VsZi5iY19wYXRoLCAnd2InKSBhcyBmaWxlOgorICAgICAgICAgICAgZmlsZS53cml0ZShtZXRhZGF0YSkKKyAgICAgICAgICAgIGZpbGUud3JpdGUoYmMpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoKnNlbGYuZGF0YSgpKQorICAgICAgICBjb21waWxlYWxsLmNvbXBpbGVfZGlyKHNlbGYuZGlyZWN0b3J5LCBmb3JjZT1GYWxzZSwgcXVpZXQ9VHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCpzZWxmLmRhdGEoKSkKKworICAgIGRlZiB0ZXN0X210aW1lKHNlbGYpOgorICAgICAgICAjIFRlc3QgYSBjaGFuZ2UgaW4gbXRpbWUgbGVhZHMgdG8gYSBuZXcgLnB5Yy4KKyAgICAgICAgc2VsZi5yZWNyZWF0aW9uX2NoZWNrKHN0cnVjdC5wYWNrKCc8NHNsJywgaW1wLmdldF9tYWdpYygpLCAxKSkKKworICAgIGRlZiB0ZXN0X21hZ2ljX251bWJlcihzZWxmKToKKyAgICAgICAgIyBUZXN0IGEgY2hhbmdlIGluIG10aW1lIGxlYWRzIHRvIGEgbmV3IC5weWMuCisgICAgICAgIHNlbGYucmVjcmVhdGlvbl9jaGVjayhiJ1wwXDBcMFwwJykKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgc3VwcG9ydC5ydW5fdW5pdHRlc3QoQ29tcGlsZWFsbFRlc3RzKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL01pc2MvQUNLUyBiL01pc2MvQUNLUwppbmRleCAyYWYxOWI1Li4zMWY5MjBlIDEwMDY0NAotLS0gYS9NaXNjL0FDS1MKKysrIGIvTWlzYy9BQ0tTCkBAIC0xODMsNyArMTgzLDcgQEAKIEFuZHkgRHVzdG1hbgogR2FyeSBEdXphbgogRXVnZW5lIER2dXJlY2hlbnNraQotSm9zaXAgRHpvbG9uZ2EgCitKb3NpcCBEem9sb25nYQogTWF4aW0gRHp1bWFuZW5rbwogV2FsdGVyIET2cndhbGQKIEhhbnMgRWNrYXJkdApAQCAtMjM0LDYgKzIzNCw3IEBACiBVbGlzc2VzIEZ1cnF1aW0KIEhhZ2VuIEb8cnN0ZW5hdQogQWNoaW0gR2FlZGtlCitNYXJ0aW4gdm9uIEdhZ2VybgogTGVsZSBHYWlmYXgKIFNhbnRpYWdvIEdhbGEKIFlpdHpjaGFrIEdhbGUKZGlmZiAtLWdpdCBhL01pc2MvTkVXUyBiL01pc2MvTkVXUwppbmRleCA1MTU3ODVjLi5hZWJiY2RlIDEwMDY0NAotLS0gYS9NaXNjL05FV1MKKysrIGIvTWlzYy9ORVdTCkBAIC0xNjMsNiArMTYzLDEwIEBACiBMaWJyYXJ5CiAtLS0tLS0tCiAKKy0gSXNzdWUgIzUxMjg6IE1ha2UgY29tcGlsZWFsbCBwcm9wZXJseSBpbnNwZWN0IGJ5dGVjb2RlIHRvIGRldGVybWluZSBpZiBuZWVkcworICB0byBiZSByZWNyZWF0ZWQuIFRoaXMgYXZvaWRzIGEgdGltaW5nIGhvbGUgdGhhbmtzIHRvIHRoZSBvbGQgcmVsaWFuY2Ugb24gdGhlCisgIGN0aW1lIG9mIHRoZSBmaWxlcyBpbnZvbHZlZC4KKwogLSBJc3N1ZSAjNTEyMjogU3luY2hyb25pemUgdGsgbG9hZCBmYWlsdXJlIGNoZWNrIHRvIHByZXZlbnQgYSBwb3RlbnRpYWwKICAgZGVhZGxvY2suCiAK