IwojIEZyZWVUeXBlIDIgaG9zdCBwbGF0Zm9ybSBkZXRlY3Rpb24gcnVsZXMKIwoKCiMgQ29weXJpZ2h0IDE5OTYtMjAwMCBieQojIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KIwojIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCiMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAojIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91CiMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKIyBmdWxseS4KCgojIFRoaXMgc3ViLU1ha2VmaWxlIGlzIGluIGNoYXJnZSBvZiBkZXRlY3RpbmcgdGhlIGN1cnJlbnQgcGxhdGZvcm0uICBJdCBzZXRzCiMgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXM6CiMKIyAgIEJVSUxEICAgICAgICBUaGUgY29uZmlndXJhdGlvbiBhbmQgc3lzdGVtLXNwZWNpZmljIGRpcmVjdG9yeS4gIFVzdWFsbHkKIyAgICAgICAgICAgICAgICBgZnJlZXR5cGUvYnVpbGRzLyQoUExBVEZPUk0pJyBidXQgY2FuIGJlIGRpZmZlcmVudCBmb3IKIyAgICAgICAgICAgICAgICBjdXN0b20gYnVpbGRzIG9mIHRoZSBsaWJyYXJ5LgojCiMgVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgbXVzdCBiZSBkZWZpbmVkIGluIHN5c3RlbSBzcGVjaWZpYyBgZGV0ZWN0Lm1rJwojIGZpbGVzOgojCiMgICBQTEFURk9STSAgICAgVGhlIGRldGVjdGVkIHBsYXRmb3JtLiAgVGhpcyB3aWxsIGRlZmF1bHQgdG8gYGFuc2knIGlmCiMgICAgICAgICAgICAgICAgYXV0by1kZXRlY3Rpb24gZmFpbHMuCiMgICBDT05GSUdfRklMRSAgVGhlIGNvbmZpZ3VyYXRpb24gc3ViLW1ha2VmaWxlIHRvIHVzZS4gIFRoaXMgdXN1YWxseSBkZXBlbmRzCiMgICAgICAgICAgICAgICAgb24gdGhlIGNvbXBpbGVyIGRlZmluZWQgaW4gdGhlIGBDQycgZW52aXJvbm1lbnQgdmFyaWFibGUuCiMgICBERUxFVEUgICAgICAgVGhlIHNoZWxsIGNvbW1hbmQgdXNlZCB0byByZW1vdmUgYSBnaXZlbiBmaWxlLgojICAgQ09QWSAgICAgICAgIFRoZSBzaGVsbCBjb21tYW5kIHVzZWQgdG8gY29weSBvbmUgZmlsZS4KIyAgIFNFUCAgICAgICAgICBUaGUgcGxhdGZvcm0tc3BlY2lmaWMgZGlyZWN0b3J5IHNlcGFyYXRvci4KIyAgIENDICAgICAgICAgICBUaGUgY29tcGlsZXIgdG8gdXNlLgojCiMgWW91IG5lZWQgdG8gc2V0IHRoZSBmb2xsb3dpbmcgdmFyaWFibGUocykgYmVmb3JlIGNhbGxpbmcgaXQ6CiMKIyAgIFRPUCAgICAgICAgICBUaGUgdG9wLW1vc3QgZGlyZWN0b3J5IGluIHRoZSBGcmVlVHlwZSBsaWJyYXJ5IHNvdXJjZQojICAgICAgICAgICAgICAgIGhpZXJhcmNoeS4gIElmIG5vdCBkZWZpbmVkLCBpdCB3aWxsIGRlZmF1bHQgdG8gYC4nLgoKIyBJZiBUT1AgaXMgbm90IGRlZmluZWQsIGRlZmF1bHQgaXQgdG8gYC4nCiMKaWZuZGVmIFRPUAogIFRPUCA6PSAuCmVuZGlmCgojIFNldCBhdXRvLWRldGVjdGlvbiBkZWZhdWx0IHRvIGBhbnNpJyByZXNwLiBVTklYLWxpa2Ugb3BlcmF0aW5nIHN5c3RlbXMuCiMgTm90ZSB0aGF0IHdlIGRlbGF5IHRoZSBldmFsdWF0aW9uIG9mICQoQlVJTERfQ09ORklHXyksICQoQlVJTEQpLCBhbmQKIyAkKENPTkZJR19SVUxFUykuCiMKUExBVEZPUk0gOj0gYW5zaQpERUxFVEUgICA6PSAkKFJNKQpDT1BZICAgICA6PSBjcApTRVAgICAgICA6PSAvCgpCVUlMRF9DT05GSUdfID0gJChUT1ApJChTRVApYnVpbGRzJChTRVApCkJVSUxEICAgICAgICAgPSAkKEJVSUxEX0NPTkZJR18pJChQTEFURk9STSkKQ09ORklHX1JVTEVTICA9ICQoQlVJTEQpJChTRVApJChDT05GSUdfRklMRSkKCiMgV2UgZGVmaW5lIHRoZSBCQUNLU0xBU0ggdmFyaWFibGUgdG8gaG9sZCBhIHNpbmdsZSBiYWNrLXNsYXNoIGNoYXJhY3Rlci4KIyBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIGEgbGluZSBsaWtlCiMKIyAgIFNFUCA6PSBcCiMKIyBkb2VzIG5vdCB3b3JrIHdpdGggR05VIE1ha2UgKHRoZSBiYWNrc2xhc2ggaXMgaW50ZXJwcmV0ZWQgYXMgYSBsaW5lCiMgY29udGludWF0aW9uKS4gIFdoaWxlIGEgbGluZSBsaWtlCiMKIyAgIFNFUCA6PSBcXAojCiMgcmVhbGx5IGRlZmluZXMgJChTRVApIGFzIGBcJyBvbiBVbml4LCBhbmQgYFxcJyBvbiBEb3MgYW5kIFdpbmRvd3MhCiMKQkFDS1NMQVNIIDo9ICQoc3RyaXAgXCApCgojIE5vdywgaW5jbHVkZSBhbGwgZGV0ZWN0aW9uIHJ1bGUgZmlsZXMgZm91bmQgaW4gdGhlIGBidWlsZHMvPHN5c3RlbT4nCiMgZGlyZWN0b3JpZXMuICBOb3RlIHRoYXQgdGhlIGNhbGxpbmcgb3JkZXIgb2YgdGhlIHZhcmlvdXMgYGRldGVjdC5taycgZmlsZXMKIyBpc24ndCBwcmVkaWN0YWJsZS4KIwppbmNsdWRlICQod2lsZGNhcmQgJChCVUlMRF9DT05GSUdfKSovZGV0ZWN0Lm1rKQoKIyBJbiBjYXNlIG5vIGRldGVjdGlvbiBydWxlIGZpbGUgd2FzIHN1Y2Nlc3NmdWwsIHVzZSB0aGUgZGVmYXVsdC4KIwppZm5kZWYgQ09ORklHX0ZJTEUKICBDT05GSUdfRklMRSA6PSBhbnNpLm1rCiAgc2V0dXA6IHN0ZF9zZXR1cAplbmRpZgoKIyBUaGUgZm9sbG93aW5nIHRhcmdldHMgYXJlIGVxdWl2YWxlbnQsIHdpdGggdGhlIGV4Y2VwdGlvbiB0aGF0IHRoZXkgdXNlCiMgYSBzbGlnaHRseSBkaWZmZXJlbnQgc3ludGF4IGZvciB0aGUgYGVjaG8nIGNvbW1hbmQuCiMKIyBzdGRfc2V0dXA6IGRlZmluZWQgZm9yIG1vc3QgKGkuZS4gVW5peC1saWtlKSBwbGF0Zm9ybXMKIyBkb3Nfc2V0dXA6IGRlZmluZWQgZm9yIERvcy1pc2ggcGxhdGZvcm1zIGxpa2UgRG9zLCBXaW5kb3dzICYgT1MvMgojCi5QSE9OWTogc3RkX3NldHVwIGRvc19zZXR1cAoKc3RkX3NldHVwOgoJQGVjaG8gIiIKCUBlY2hvICJGcmVlVHlwZSBidWlsZCBzeXN0ZW0gLS0gYXV0b21hdGljIHN5c3RlbSBkZXRlY3Rpb24iCglAZWNobyAiIgoJQGVjaG8gIlRoZSBmb2xsb3dpbmcgc2V0dGluZ3MgYXJlIHVzZWQ6IgoJQGVjaG8gIiIKCUBlY2hvICIgIHBsYXRmb3JtICAgICAgICAgICAgICAgICAgICAkKFBMQVRGT1JNKSIKCUBlY2hvICIgIGNvbXBpbGVyICAgICAgICAgICAgICAgICAgICAkKENDKSIKCUBlY2hvICIgIGNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5ICAgICAkKEJVSUxEKSIKCUBlY2hvICIgIGNvbmZpZ3VyYXRpb24gcnVsZXMgICAgICAgICAkKENPTkZJR19SVUxFUykiCglAZWNobyAiIgoJQGVjaG8gIklmIHRoaXMgZG9lcyBub3QgY29ycmVzcG9uZCB0byB5b3VyIHN5c3RlbSBvciBzZXR0aW5ncyBwbGVhc2UgcmVtb3ZlIHRoZSBmaWxlIgoJQGVjaG8gIlxgJChDT05GSUdfTUspJyBmcm9tIHRoaXMgZGlyZWN0b3J5IHRoZW4gcmVhZCB0aGUgSU5TVEFMTCBmaWxlIGZvciBoZWxwLiIKCUBlY2hvICIiCglAZWNobyAiT3RoZXJ3aXNlLCBzaW1wbHkgdHlwZSBcYG1ha2UnIGFnYWluIHRvIGJ1aWxkIHRoZSBsaWJyYXJ5LiIKCUBlY2hvICIiCglAJChDT1BZKSAkKENPTkZJR19SVUxFUykgJChDT05GSUdfTUspCgpkb3Nfc2V0dXA6CglAZWNobyD/CglAZWNobyBGcmVlVHlwZSBidWlsZCBzeXN0ZW0gLS0gYXV0b21hdGljIHN5c3RlbSBkZXRlY3Rpb24KCUBlY2hvIP8KCUBlY2hvIFRoZSBmb2xsb3dpbmcgc2V0dGluZ3MgYXJlIHVzZWQ6CglAZWNobyD/CglAZWNobyD//3BsYXRmb3Jt////////////////////////////JChQTEFURk9STSkKCUBlY2hvIP//Y29tcGlsZXL///////////////////////////8kKENDKQoJQGVjaG8g//9jb25maWd1cmF0aW9uIGRpcmVjdG9yef///////yQoQlVJTEQpCglAZWNobyD//2NvbmZpZ3VyYXRpb24gcnVsZXP/////////////JChDT05GSUdfUlVMRVMpCglAZWNobyD/CglAZWNobyBJZiB0aGlzIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8geW91ciBzeXN0ZW0gb3Igc2V0dGluZ3MgcGxlYXNlIHJlbW92ZSB0aGUgZmlsZQoJQGVjaG8gJyQoQ09ORklHX01LKScgZnJvbSB0aGlzIGRpcmVjdG9yeSB0aGVuIHJlYWQgdGhlIElOU1RBTEwgZmlsZSBmb3IgaGVscC4KCUBlY2hvIP8KCUBlY2hvIE90aGVyd2lzZSwgc2ltcGx5IHR5cGUgJ21ha2UnIGFnYWluIHRvIGJ1aWxkIHRoZSBsaWJyYXJ5LgoJQGVjaG8g/woJQCQoQ09QWSkgJChzdWJzdCAvLFwsJChDT05GSUdfUlVMRVMpICQoQ09ORklHX01LKSkgPiBudWwKCiMgRU9GCg==