IwojIEZyZWVUeXBlIDIgY29uZmlndXJhdGlvbiBmaWxlIHRvIGRldGVjdCBhIFdpbjMyIGhvc3QgcGxhdGZvcm0uCiMKCgojIENvcHlyaWdodCAxOTk2LTIwMDAsIDIwMDMsIDIwMDQsIDIwMDYsIDIwMDcgYnkKIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiMKIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAojIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQojIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0CiMgZnVsbHkuCgoKLlBIT05ZOiBzZXR1cAoKCmlmZXEgKCQoUExBVEZPUk0pLGFuc2kpCgogICMgRGV0ZWN0aW5nIFdpbmRvd3MgTlQgaXMgZWFzeSwgYXMgdGhlIE9TIHZhcmlhYmxlIG11c3QgYmUgZGVmaW5lZCBhbmQKICAjIGNvbnRhaW5zIGBXaW5kb3dzX05UJy4gIFRoaXMgYWxzbyB3b3JrcyB3aXRoIFdpbmRvd3MgMjAwMCBhbmQgWFAuCiAgIwogIGlmZXEgKCQoT1MpLFdpbmRvd3NfTlQpCgogICAgUExBVEZPUk0gOj0gd2luMzIKCiAgZWxzZQoKICAgICMgRGV0ZWN0aW5nIFdpbmRvd3MgOVgKCiAgICAjIFdlIHVzZWQgdG8gcnVuIHRoZSBgdmVyJyBjb21tYW5kIHRvIHNlZSBpZiBpdHMgb3V0cHV0IGNvbnRhaW5zIHRoZQogICAgIyB3b3JkIGBXaW5kb3dzJy4gIElmIHRoaXMgaXMgdHJ1ZSwgd2UgYXJlIHJ1bm5pbmcgV2luZG93cyA5NSBvciBsYXRlcjoKICAgICMKICAgICMgICBpZmRlZiBDT01TUEVDCiAgICAjICAgICAjIEZpcnN0LCBjaGVjayBpZiB3ZSBoYXZlIHRoZSBDT01TUEVDIGVudmlyb25tZW50IHZhcmlhYmxlLCB3aGljaAogICAgIyAgICAgIyBpbmRpY2F0ZXMgd2UgY2FuIHVzZSBDT01NQU5ELkNPTSdzIGludGVybmFsIGNvbW1hbmRzCiAgICAjICAgICBpc193aW5kb3dzIDo9ICQoZmluZHN0cmluZyBXaW5kb3dzLCQoc3RyaXAgJChzaGVsbCB2ZXIpKSkKICAgICMgICBlbmRpZgogICAgIwogICAgIyBVbmZvcnR1bmF0ZWx5LCB0aGlzIGFsc28gZGV0ZWN0cyB0aGUgY2FzZSB3aGVuIG9uZSBpcyBydW5uaW5nCiAgICAjIERPUyA3LnggKHRoZSBNUy1ET1MgdmVyc2lvbiB0aGF0IGxpZXMgYmVsb3cgV2luZG93cykgd2l0aG91dCBhY3R1YWxseQogICAgIyBsYXVuY2hpbmcgdGhlIEdVSS4KICAgICMKICAgICMgQSBiZXR0ZXIgdGVzdCBpcyB0byBjaGVjayB3aGV0aGVyIHRoZXJlIGFyZSBib3RoIHRoZSBlbnZpcm9ubWVudAogICAgIyB2YXJpYWJsZXMgYHdpbmJvb3RkaXInIGFuZCBgd2luZGlyJy4gIFRoZSBmaXJzdCBpbmRpY2F0ZXMgYW4KICAgICMgdW5kZXJseWluZyBET1MgNy54LCB3aGlsZSB0aGUgc2Vjb25kIGlzIHNldCBvbmx5IGlmIHdpbjMyIGlzIGF2YWlsYWJsZS4KICAgICMKICAgICMgTm90ZSB0aGF0IG9uIFdpbmRvd3MgTlQsIHN1Y2ggYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgd2lsbCBub3QgYmUgc2VlbgogICAgIyBmcm9tIERPUy1iYXNlZCB0b29scyBsaWtlIERKR1BQJ3MgbWFrZTsgdGhpcyBpcyBub3QgYWN0dWFsbHkgYSBwcm9ibGVtCiAgICAjIHNpbmNlIE5UIGlzIGRldGVjdGVkIGluZGVwZW5kZW50bHkgYWJvdmUuICBCdXQgZG8gbm90IHRyeSB0byBiZSBjbGV2ZXIhCiAgICAjCiAgICBpZmRlZiB3aW5ib290ZGlyCiAgICAgIGlmZGVmIHdpbmRpcgoKICAgICAgICBQTEFURk9STSA6PSB3aW4zMgoKICAgICAgZW5kaWYKICAgIGVuZGlmCgogIGVuZGlmICAjIHRlc3QgTlQKCmVuZGlmICMgdGVzdCBQTEFURk9STSBhbnNpCgppZmVxICgkKFBMQVRGT1JNKSx3aW4zMikKCiAgREVMRVRFIDo9IGRlbAogIENBVCAgICA6PSB0eXBlCiAgU0VQICAgIDo9ICQoQkFDS1NMQVNIKQoKICAjIFNldHRpbmcgQ09QWSBpcyBhIGJpdCB0cmlja2llci4gIFBsYWluIENPUFkgb24gTlQgd2lsbCBub3Qgd29yawogICMgY29ycmVjdGx5LCBiZWNhdXNlIGl0IHdpbGwgdXBwZXJjYXNlIDguMyBmaWxlbmFtZXMsIGNyZWF0aW5nIGEKICAjIGBDT05GSUcuTUsnIGZpbGUgd2hpY2ggaXNuJ3QgZm91bmQgbGF0ZXIgb24gYnkgYG1ha2UnLgogICMgU2luY2Ugd2UgZG8gbm90IHdhbnQgdGhhdCwgd2UgbmVlZCB0byBmb3JjZSBleGVjdXRpb24gb2YgQ01ELkVYRS4KICAjIFVuZm9ydHVuYXRlbHksIENNRC5FWEUgaXMgbm90IGF2YWlsYWJsZSBvbiBXaW5kb3dzIDlYLgogICMgU28gd2UgbmVlZCB0byBoYWNrLgogICMKICAjIEt1ZG9zIHRvIEVsaSBaYXJldHNraWkgKERKR1BQIGd1cnUpIHRoYXQgaGVscGVkIGRlYnVnIGl0LgogICMgRGV0YWlscyBhcmUgYXZhaWxhYmxlIGluIHRocmVhZHMgb2YgdGhlIGZyZWV0eXBlIG1haWxpbmcgbGlzdAogICMgKDIwMDQtMTEtMTEpLCBhbmQgdGhlbiBpbiB0aGUgZGV2ZWwgbWFpbGluZyBsaXN0ICgyMDA0LTExLTIwIHRvIC0yMykuCiAgIwogIGlmZXEgKCQoT1MpLFdpbmRvd3NfTlQpCiAgICBDT1BZIDo9IGNtZC5leGUgL2MgY29weQogIGVsc2UKICAgIENPUFkgOj0gY29weQogIGVuZGlmICAjIHRlc3QgTlQKCgogICMgZ2NjIE1ha2VmaWxlIGJ5IGRlZmF1bHQKICBDT05GSUdfRklMRSA6PSB3MzItZ2NjLm1rCiAgaWZlcSAoJChmaXJzdHdvcmQgJChDQykpLGNjKQogICAgQ0MgICAgICAgIDo9IGdjYwogIGVuZGlmCgogIGlmbmVxICgkKGZpbmRzdHJpbmcgbGlzdCwkKE1BS0VDTURHT0FMUykpLCkgICMgdGVzdCBmb3IgdGhlICJsaXN0IiB0YXJnZXQKICAgIGR1bXBfdGFyZ2V0X2xpc3Q6CgkgICAgQGVjaG8g/woJICAgIEBlY2hvICQoUFJPSkVDVF9USVRMRSkgYnVpbGQgc3lzdGVtIC0tIHN1cHBvcnRlZCBjb21waWxlcnMKCSAgICBAZWNobyD/CgkgICAgQGVjaG8gU2V2ZXJhbCBjb21tYW5kLWxpbmUgY29tcGlsZXJzIGFyZSBzdXBwb3J0ZWQgb24gV2luMzI6CgkgICAgQGVjaG8g/woJICAgIEBlY2hvIP//bWFrZSBzZXR1cP///////////////////////////2djYyAod2l0aCBNaW5ndykKCSAgICBAZWNobyD//21ha2Ugc2V0dXAgdmlzdWFsY/////////////////9NaWNyb3NvZnQgVmlzdWFsIEMrKwoJICAgIEBlY2hvIP//bWFrZSBzZXR1cCBiY2MzMv///////////////////0JvcmxhbmQgQy9DKysKCSAgICBAZWNobyD//21ha2Ugc2V0dXAgbGNj//////////////////////9XaW4zMi1MQ0MKCSAgICBAZWNobyD//21ha2Ugc2V0dXAgaW50ZWxj//////////////////9JbnRlbCBDL0MrKwoJICAgIEBlY2hvIP8KCiAgICBzZXR1cDogZHVtcF90YXJnZXRfbGlzdAogICAgLlBIT05ZOiBkdW1wX3RhcmdldF9saXN0IGxpc3QKICBlbHNlCiAgICBzZXR1cDogZG9zX3NldHVwCiAgZW5kaWYKCiAgIyBhZGRpdGlvbmFsbHksIHdlIHByb3ZpZGUgaG9va3MgZm9yIHZhcmlvdXMgb3RoZXIgY29tcGlsZXJzCiAgIwogIGlmbmVxICgkKGZpbmRzdHJpbmcgdmlzdWFsYywkKE1BS0VDTURHT0FMUykpLCkgICAgICMgVmlzdWFsIEMvQysrCiAgICBDT05GSUdfRklMRSA6PSB3MzItdmNjLm1rCiAgICBDQyAgICAgICAgICA6PSBjbAogICAgdmlzdWFsYzogc2V0dXAKICAgIC5QSE9OWTogdmlzdWFsYwogIGVuZGlmCgogIGlmbmVxICgkKGZpbmRzdHJpbmcgaW50ZWxjLCQoTUFLRUNNREdPQUxTKSksKSAgICAgICMgSW50ZWwgQy9DKysKICAgIENPTkZJR19GSUxFIDo9IHczMi1pbnRsLm1rCiAgICBDQyAgICAgICAgICA6PSBjbAogICAgdmlzdWFsYzogc2V0dXAKICAgIC5QSE9OWTogaW50ZWxjCiAgZW5kaWYKCiAgaWZuZXEgKCQoZmluZHN0cmluZyB3YXRjb20sJChNQUtFQ01ER09BTFMpKSwpICAgICAgIyBXYXRjb20gQy9DKysKICAgIENPTkZJR19GSUxFIDo9IHczMi13YXQubWsKICAgIENDICAgICAgICAgIDo9IHdjYzM4NgogICAgd2F0Y29tOiBzZXR1cAogICAgLlBIT05ZOiB3YXRjb20KICBlbmRpZgoKICBpZm5lcSAoJChmaW5kc3RyaW5nIHZpc3VhbGFnZSwkKE1BS0VDTURHT0FMUykpLCkgICAjIFZpc3VhbCBBZ2UgQysrCiAgICBDT05GSUdfRklMRSA6PSB3MzItaWNjLm1rCiAgICBDQyAgICAgICAgICA6PSBpY2MKICAgIHZpc3VhbGFnZTogc2V0dXAKICAgIC5QSE9OWTogdmlzdWFsYWdlCiAgZW5kaWYKCiAgaWZuZXEgKCQoZmluZHN0cmluZyBsY2MsJChNQUtFQ01ER09BTFMpKSwpICAgICAgICAgIyBMQ0MtV2luMzIKICAgIENPTkZJR19GSUxFIDo9IHczMi1sY2MubWsKICAgIENDICAgICAgICAgIDo9IGxjYwogICAgbGNjOiBzZXR1cAogICAgLlBIT05ZOiBsY2MKICBlbmRpZgoKICBpZm5lcSAoJChmaW5kc3RyaW5nIG1pbmd3MzIsJChNQUtFQ01ER09BTFMpKSwpICAgICAjIG1pbmd3MzIKICAgIENPTkZJR19GSUxFIDo9IHczMi1taW5ndzMyLm1rCiAgICBDQyAgICAgICAgICA6PSBnY2MKICAgIG1pbmd3MzI6IHNldHVwCiAgICAuUEhPTlk6IG1pbmd3MzIKICBlbmRpZgoKICBpZm5lcSAoJChmaW5kc3RyaW5nIGJjYzMyLCQoTUFLRUNNREdPQUxTKSksKSAgICAgICAjIEJvcmxhbmQgQysrCiAgICBDT05GSUdfRklMRSA6PSB3MzItYmNjLm1rCiAgICBDQyAgICAgICAgICA6PSBiY2MzMgogICAgYmNjMzI6IHNldHVwCiAgICAuUEhPTlk6IGJjYzMyCiAgZW5kaWYKCiAgaWZuZXEgKCQoZmluZHN0cmluZyBkZXZlbC1iY2MsJChNQUtFQ01ER09BTFMpKSwpICAgIyBkZXZlbG9wbWVudCB0YXJnZXQKICAgIENPTkZJR19GSUxFIDo9IHczMi1iY2NkLm1rCiAgICBDQyAgICAgICAgICA6PSBiY2MzMgogICAgZGV2ZWwtYmNjOiBzZXR1cAogICAgLlBIT05ZOiBkZXZlbC1iY2MKICBlbmRpZgoKICBpZm5lcSAoJChmaW5kc3RyaW5nIGRldmVsLWdjYywkKE1BS0VDTURHT0FMUykpLCkgICAjIGRldmVsb3BtZW50IHRhcmdldAogICAgQ09ORklHX0ZJTEUgOj0gdzMyLWRldi5tawogICAgQ0MgICAgICAgICAgOj0gZ2NjCiAgICBkZXZlbC1nY2M6IHNldHVwCiAgICAuUEhPTlk6IGRldmVsLWdjYwogIGVuZGlmCgplbmRpZiAgICMgdGVzdCBQTEFURk9STSB3aW4zMgoKCiMgRU9GCg==