IwojIEZyZWVUeXBlIDIgY29uZmlndXJhdGlvbiBmaWxlIHRvIGRldGVjdCBhIFdpbjMyIGhvc3QgcGxhdGZvcm0uCiMKCgojIENvcHlyaWdodCAxOTk2LTIwMDAsIDIwMDMsIDIwMDQgYnkKIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiMKIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAojIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQojIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0CiMgZnVsbHkuCgoKLlBIT05ZOiBzZXR1cAoKCmlmZXEgKCQoUExBVEZPUk0pLGFuc2kpCgogICMgRGV0ZWN0aW5nIFdpbmRvd3MgTlQgaXMgZWFzeSwgYXMgdGhlIE9TIHZhcmlhYmxlIG11c3QgYmUgZGVmaW5lZCBhbmQKICAjIGNvbnRhaW5zIGBXaW5kb3dzX05UJy4gIFRoaXMgYWxzbyB3b3JrcyB3aXRoIFdpbmRvd3MgMjAwMCBhbmQgWFAuCiAgIwogIGlmZXEgKCQoT1MpLFdpbmRvd3NfTlQpCgogICAgUExBVEZPUk0gOj0gd2luMzIKCiAgZWxzZQoKICAgICMgRGV0ZWN0aW5nIFdpbmRvd3MgOVgKCiAgICAjIFdlIHVzZWQgdG8gcnVuIHRoZSBgdmVyJyBjb21tYW5kIHRvIHNlZSBpZiBpdHMgb3V0cHV0IGNvbnRhaW5zIHRoZQogICAgIyB3b3JkIGBXaW5kb3dzJy4gIElmIHRoaXMgaXMgdHJ1ZSwgd2UgYXJlIHJ1bm5pbmcgV2luZG93cyA5NSBvciBsYXRlcjoKICAgICMKICAgICMgICBpZmRlZiBDT01TUEVDCiAgICAjICAgICAjIEZpcnN0LCBjaGVjayBpZiB3ZSBoYXZlIHRoZSBDT01TUEVDIGVudmlyb25tZW50IHZhcmlhYmxlLCB3aGljaAogICAgIyAgICAgIyBpbmRpY2F0ZXMgd2UgY2FuIHVzZSBDT01NQU5ELkNPTSdzIGludGVybmFsIGNvbW1hbmRzCiAgICAjICAgICBpc193aW5kb3dzIDo9ICQoZmluZHN0cmluZyBXaW5kb3dzLCQoc3RyaXAgJChzaGVsbCB2ZXIpKSkKICAgICMgICBlbmRpZgogICAgIwogICAgIyBVbmZvcnR1bmF0ZWx5LCB0aGlzIGFsc28gZGV0ZWN0cyB0aGUgY2FzZSB3aGVuIG9uZSBpcyBydW5uaW5nCiAgICAjIERPUyA3LnggKHRoZSBNUy1ET1MgdmVyc2lvbiB0aGF0IGxpZXMgYmVsb3cgV2luZG93cykgd2l0aG91dCBhY3R1YWxseQogICAgIyBsYXVuY2hpbmcgdGhlIEdVSS4KICAgICMKICAgICMgQSBiZXR0ZXIgdGVzdCBpcyB0byBjaGVjayB3aGV0aGVyIHRoZXJlIGFyZSBib3RoIHRoZSBlbnZpcm9ubWVudAogICAgIyB2YXJpYWJsZXMgYHdpbmJvb3RkaXInIGFuZCBgd2luZGlyJy4gIFRoZSBmaXJzdCBpbmRpY2F0ZXMgYW4KICAgICMgdW5kZXJseWluZyBET1MgNy54LCB3aGlsZSB0aGUgc2Vjb25kIGlzIHNldCBvbmx5IGlmIHdpbjMyIGlzIGF2YWlsYWJsZS4KICAgICMKICAgICMgTm90ZSB0aGF0IG9uIFdpbmRvd3MgTlQsIHN1Y2ggYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgd2lsbCBub3QgYmUgc2VlbgogICAgIyBmcm9tIERPUy1iYXNlZCB0b29scyBsaWtlIERKR1BQJ3MgbWFrZTsgdGhpcyBpcyBub3QgYWN0dWFsbHkgYSBwcm9ibGVtCiAgICAjIHNpbmNlIE5UIGlzIGRldGVjdGVkIGluZGVwZW5kYW50bHkgYWJvdmUuICBCdXQgZG8gbm90IHRyeSB0byBiZSBjbGV2ZXIhCiAgICAjCiAgICBpZmRlZiB3aW5ib290ZGlyCiAgICAgIGlmZGVmIHdpbmRpcgoKICAgICAgICBQTEFURk9STSA6PSB3aW4zMgoKICAgICAgZW5kaWYKICAgIGVuZGlmCgogIGVuZGlmICAjIHRlc3QgTlQKCmVuZGlmICMgdGVzdCBQTEFURk9STSBhbnNpCgppZmVxICgkKFBMQVRGT1JNKSx3aW4zMikKCiAgREVMRVRFIDo9IGRlbAogIFNFUCAgICA6PSAkKEJBQ0tTTEFTSCkKCiAgIyBTZXR0aW5nIENPUFkgaXMgYSBiaXQgdHJpY2tpZXIuICBQbGFpbiBDT1BZIG9uIE5UIHdpbGwgbm90IHdvcmsKICAjIGNvcnJlY3RseSwgYmVjYXVzZSBpdCB3aWxsIHVwcGVyY2FzZSA4LjMgZmlsZW5hbWVzLCBjcmVhdGluZyBhCiAgIyBgQ09ORklHLk1LJyBmaWxlIHdoaWNoIGlzbid0IGZvdW5kIGxhdGVyIG9uIGJ5IGBtYWtlJy4KICAjIFNpbmNlIHdlIGRvIG5vdCB3YW50IHRoYXQsIHdlIG5lZWQgdG8gZm9yY2UgZXhlY3V0aW9uIG9mIENNRC5FWEUuCiAgIyBVbmZvcnR1bmF0ZWx5LCBDTUQuRVhFIGlzIG5vdCBhdmFpbGFibGUgb24gV2luZG93cyA5WC4KICAjIFNvIHdlIG5lZWQgdG8gaGFjay4KICAjCiAgIyBLdWRvcyB0byBFbGkgWmFyZXRza2lpIChESkdQUCBndXJ1KSB0aGF0IGhlbHBlZCBkZWJ1ZyBpdC4KICAjIERldGFpbHMgYXJlIGF2YWlsYWJsZSBpbiB0aHJlYWRzIG9mIHRoZSBmcmVldHlwZSBtYWlsaW5nIGxpc3QgCiAgIyAoMjAwNC0xMS0xMSksIGFuZCB0aGVuIGluIHRoZSBkZXZlbCBtYWlsaW5nIGxpc3QgKDIwMDQtMTEtMjAgdG8gLTIzKS4KICAjCiAgaWZlcSAoJChPUyksV2luZG93c19OVCkKICAgIENPUFkgOj0gY21kLmV4ZSAvYyBjb3B5CiAgZWxzZQogICAgQ09QWSA6PSBjb3B5CiAgZW5kaWYgICMgdGVzdCBOVAoKCiAgIyBnY2MgTWFrZWZpbGUgYnkgZGVmYXVsdAogIENPTkZJR19GSUxFIDo9IHczMi1nY2MubWsKICBpZmVxICgkKGZpcnN0d29yZCAkKENDKSksY2MpCiAgICBDQyAgICAgICAgOj0gZ2NjCiAgZW5kaWYKCiAgaWZuZXEgKCQoZmluZHN0cmluZyBsaXN0LCQoTUFLRUNNREdPQUxTKSksKSAgIyB0ZXN0IGZvciB0aGUgImxpc3QiIHRhcmdldAogICAgZHVtcF90YXJnZXRfbGlzdDoKCSAgICBAZWNobyD/CgkgICAgQGVjaG8gJChQUk9KRUNUX1RJVExFKSBidWlsZCBzeXN0ZW0gLS0gc3VwcG9ydGVkIGNvbXBpbGVycwoJICAgIEBlY2hvIP8KCSAgICBAZWNobyBTZXZlcmFsIGNvbW1hbmQtbGluZSBjb21waWxlcnMgYXJlIHN1cHBvcnRlZCBvbiBXaW4zMjoKCSAgICBAZWNobyD/CgkgICAgQGVjaG8g//9tYWtlIHNldHVw////////////////////////////Z2NjICh3aXRoIE1pbmd3KQoJICAgIEBlY2hvIP//bWFrZSBzZXR1cCB2aXN1YWxj/////////////////01pY3Jvc29mdCBWaXN1YWwgQysrCgkgICAgQGVjaG8g//9tYWtlIHNldHVwIGJjYzMy////////////////////Qm9ybGFuZCBDL0MrKwoJICAgIEBlY2hvIP//bWFrZSBzZXR1cCBsY2P//////////////////////1dpbjMyLUxDQwoJICAgIEBlY2hvIP//bWFrZSBzZXR1cCBpbnRlbGP//////////////////0ludGVsIEMvQysrCgkgICAgQGVjaG8g/woKICAgIHNldHVwOiBkdW1wX3RhcmdldF9saXN0CiAgICAuUEhPTlk6IGR1bXBfdGFyZ2V0X2xpc3QgbGlzdAogIGVsc2UKICAgIHNldHVwOiBkb3Nfc2V0dXAKICBlbmRpZgoKICAjIGFkZGl0aW9uYWxseSwgd2UgcHJvdmlkZSBob29rcyBmb3IgdmFyaW91cyBvdGhlciBjb21waWxlcnMKICAjCiAgaWZuZXEgKCQoZmluZHN0cmluZyB2aXN1YWxjLCQoTUFLRUNNREdPQUxTKSksKSAgICAgIyBWaXN1YWwgQy9DKysKICAgIENPTkZJR19GSUxFIDo9IHczMi12Y2MubWsKICAgIENDICAgICAgICAgIDo9IGNsCiAgICB2aXN1YWxjOiBzZXR1cAogICAgLlBIT05ZOiB2aXN1YWxjCiAgZW5kaWYKCiAgaWZuZXEgKCQoZmluZHN0cmluZyBpbnRlbGMsJChNQUtFQ01ER09BTFMpKSwpICAgICAgIyBJbnRlbCBDL0MrKwogICAgQ09ORklHX0ZJTEUgOj0gdzMyLWludGwubWsKICAgIENDICAgICAgICAgIDo9IGNsCiAgICB2aXN1YWxjOiBzZXR1cAogICAgLlBIT05ZOiBpbnRlbGMKICBlbmRpZgoKICBpZm5lcSAoJChmaW5kc3RyaW5nIHdhdGNvbSwkKE1BS0VDTURHT0FMUykpLCkgICAgICAjIFdhdGNvbSBDL0MrKwogICAgQ09ORklHX0ZJTEUgOj0gdzMyLXdhdC5tawogICAgQ0MgICAgICAgICAgOj0gd2NjMzg2CiAgICB3YXRjb206IHNldHVwCiAgICAuUEhPTlk6IHdhdGNvbQogIGVuZGlmCgogIGlmbmVxICgkKGZpbmRzdHJpbmcgdmlzdWFsYWdlLCQoTUFLRUNNREdPQUxTKSksKSAgICMgVmlzdWFsIEFnZSBDKysKICAgIENPTkZJR19GSUxFIDo9IHczMi1pY2MubWsKICAgIENDICAgICAgICAgIDo9IGljYwogICAgdmlzdWFsYWdlOiBzZXR1cAogICAgLlBIT05ZOiB2aXN1YWxhZ2UKICBlbmRpZgoKICBpZm5lcSAoJChmaW5kc3RyaW5nIGxjYywkKE1BS0VDTURHT0FMUykpLCkgICAgICAgICAjIExDQy1XaW4zMgogICAgQ09ORklHX0ZJTEUgOj0gdzMyLWxjYy5tawogICAgQ0MgICAgICAgICAgOj0gbGNjCiAgICBsY2M6IHNldHVwCiAgICAuUEhPTlk6IGxjYwogIGVuZGlmCgogIGlmbmVxICgkKGZpbmRzdHJpbmcgbWluZ3czMiwkKE1BS0VDTURHT0FMUykpLCkgICAgICMgbWluZ3czMgogICAgQ09ORklHX0ZJTEUgOj0gdzMyLW1pbmd3MzIubWsKICAgIENDICAgICAgICAgIDo9IGdjYwogICAgbWluZ3czMjogc2V0dXAKICAgIC5QSE9OWTogbWluZ3czMgogIGVuZGlmCgogIGlmbmVxICgkKGZpbmRzdHJpbmcgYmNjMzIsJChNQUtFQ01ER09BTFMpKSwpICAgICAgICMgQm9ybGFuZCBDKysKICAgIENPTkZJR19GSUxFIDo9IHczMi1iY2MubWsKICAgIENDICAgICAgICAgIDo9IGJjYzMyCiAgICBiY2MzMjogc2V0dXAKICAgIC5QSE9OWTogYmNjMzIKICBlbmRpZgoKICBpZm5lcSAoJChmaW5kc3RyaW5nIGRldmVsLWJjYywkKE1BS0VDTURHT0FMUykpLCkgICAjIGRldmVsb3BtZW50IHRhcmdldAogICAgQ09ORklHX0ZJTEUgOj0gdzMyLWJjY2QubWsKICAgIENDICAgICAgICAgIDo9IGJjYzMyCiAgICBkZXZlbC1iY2M6IHNldHVwCiAgICAuUEhPTlk6IGRldmVsLWJjYwogIGVuZGlmCgogIGlmbmVxICgkKGZpbmRzdHJpbmcgZGV2ZWwtZ2NjLCQoTUFLRUNNREdPQUxTKSksKSAgICMgZGV2ZWxvcG1lbnQgdGFyZ2V0CiAgICBDT05GSUdfRklMRSA6PSB3MzItZGV2Lm1rCiAgICBDQyAgICAgICAgICA6PSBnY2MKICAgIGRldmVsLWdjYzogc2V0dXAKICAgIC5QSE9OWTogZGV2ZWwtZ2NjCiAgZW5kaWYKCmVuZGlmICAgIyB0ZXN0IFBMQVRGT1JNIHdpbjMyCgoKIyBFT0YK