cGFja2FnZSBDb25maWc6OkluaUZpbGVzOwokQ29uZmlnOjpJbmlGaWxlczo6VkVSU0lPTiA9IChxdygkUmV2aXNpb24kKSlbMV07CnJlcXVpcmUgNS4wMDQ7CnVzZSBzdHJpY3Q7CnVzZSBDYXJwOwp1c2UgU3ltYm9sICdnZW5zeW0nLCdxdWFsaWZ5X3RvX3JlZic7ICAgIyBGb3IgdGhlICdhbnkgZGF0YSB0eXBlJyBoYWNrCgpAQ29uZmlnOjpJbmlGaWxlczo6ZXJyb3JzID0gKCApOwoKIwkkSGVhZGVyJAoKPWhlYWQxIE5BTUUKCkNvbmZpZzo6SW5pRmlsZXMgLSBBIG1vZHVsZSBmb3IgcmVhZGluZyAuaW5pLXN0eWxlIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgo9aGVhZDEgU1lOT1BTSVMKCiAgdXNlIENvbmZpZzo6SW5pRmlsZXM7CiAgbXkgJGNmZyA9IG5ldyBDb25maWc6OkluaUZpbGVzKCAtZmlsZSA9PiAiL3BhdGgvY29uZmlnZmlsZS5pbmkiICk7CiAgcHJpbnQgIlRoZSB2YWx1ZSBpcyAiIC4gJGNmZy0+dmFsKCAnU2VjdGlvbicsICdQYXJhbWV0ZXInICkgLiAiLiIKICAJaWYgJGNmZy0+dmFsKCAnU2VjdGlvbicsICdQYXJhbWV0ZXInICk7Cgo9aGVhZDEgREVTQ1JJUFRJT04KCkNvbmZpZzo6SW5pRmlsZXMgcHJvdmlkZXMgYSB3YXkgdG8gaGF2ZSByZWFkYWJsZSBjb25maWd1cmF0aW9uIGZpbGVzIG91dHNpZGUKeW91ciBQZXJsIHNjcmlwdC4gIENvbmZpZ3VyYXRpb25zIGNhbiBiZSBpbXBvcnRlZCAoaW5oZXJpdGVkLCBzdGFja2VkLC4uLiksIApzZWN0aW9ucyBjYW4gYmUgZ3JvdXBlZCwgYW5kIHNldHRpbmdzIGNhbiBiZSBhY2Nlc3NlZCBmcm9tIGEgdGllZCBoYXNoLgoKPWhlYWQxIEZJTEUgRk9STUFUCgpJTkkgZmlsZXMgY29uc2lzdCBvZiBhIG51bWJlciBvZiBzZWN0aW9ucywgZWFjaCBwcmVjZWRlZCB3aXRoIHRoZQpzZWN0aW9uIG5hbWUgaW4gc3F1YXJlIGJyYWNrZXRzLiAgVGhlIGZpcnN0IG5vbi1ibGFuayBjaGFyYWN0ZXIgb2YKdGhlIGxpbmUgaW5kaWNhdGluZyBhIHNlY3Rpb24gbXVzdCBiZSBhIGxlZnQgYnJhY2tldCBhbmQgdGhlIGxhc3QKbm9uLWJsYW5rIGNoYXJhY3RlciBvZiBhIGxpbmUgaW5kaWNhdGluZyBhIHNlY3Rpb24gbXVzdCBiZSBhIHJpZ2h0CmJyYWNrZXQuIFRoZSBjaGFyYWN0ZXJzIG1ha2luZyB1cCB0aGUgc2VjdGlvbiBuYW1lIGNhbiBiZSBhbnkgCnN5bWJvbHMgYXQgYWxsLiBIb3dldmVyIHNlY3Rpb24gbmFtZXMgbXVzdCBiZSB1bmlxdWUuCgpQYXJhbWV0ZXJzIGFyZSBzcGVjaWZpZWQgaW4gZWFjaCBzZWN0aW9uIGFzIE5hbWU9VmFsdWUuICBBbnkgc3BhY2VzCmFyb3VuZCB0aGUgZXF1YWxzIHNpZ24gd2lsbCBiZSBpZ25vcmVkLCBhbmQgdGhlIHZhbHVlIGV4dGVuZHMgdG8gdGhlCmVuZCBvZiB0aGUgbGluZS4gUGFyYW1ldGVyIG5hbWVzIGFyZSBsb2NhbGl6ZWQgdG8gdGhlIG5hbWVzcGFjZSBvZiAKdGhlIHNlY3Rpb24sIGJ1dCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSBzZWN0aW9uLgoKICBbc2VjdGlvbl0KICBQYXJhbWV0ZXI9VmFsdWUKCkJvdGggdGhlIGhhc2ggbWFyayAoIykgYW5kIHRoZSBzZW1pY29sb24gKDspIGFyZSBjb21tZW50IGNoYXJhY3RlcnMuCmJ5IGRlZmF1bHQgKHRoaXMgY2FuIGJlIGNoYW5nZWQgYnkgY29uZmlndXJhdGlvbikKTGluZXMgdGhhdCBiZWdpbiB3aXRoIGVpdGhlciBvZiB0aGVzZSBjaGFyYWN0ZXJzIHdpbGwgYmUgaWdub3JlZC4gIEFueQphbW91bnQgb2Ygd2hpdGVzcGFjZSBtYXkgcHJlY2VkZSB0aGUgY29tbWVudCBjaGFyYWN0ZXIuCgpNdWx0aS1saW5lIG9yIG11bHRpLXZhbHVlZCBwYXJhbWV0ZXJzIG1heSBhbHNvIGJlIGRlZmluZWQgYWxhIFVOSVggCiJoZXJlIGRvY3VtZW50IiBzeW50YXg6CgogIFBhcmFtZXRlcj08PEVPVAogIHZhbHVlL2xpbmUgMQogIHZhbHVlL2xpbmUgMgogIEVPVAoKWW91IG1heSB1c2UgYW55IHN0cmluZyB5b3Ugd2FudCBpbiBwbGFjZSBvZiAiRU9UIi4gIE5vdGUgdGhhdCB3aGF0CmZvbGxvd3MgdGhlICI8PCIgYW5kIHdoYXQgYXBwZWFycyBhdCB0aGUgZW5kIG9mIHRoZSB0ZXh0IE1VU1QgbWF0Y2gKZXhhY3RseSwgaW5jbHVkaW5nIGFueSB0cmFpbGluZyB3aGl0ZXNwYWNlLgoKQXMgYSBjb25maWd1cmF0aW9uIG9wdGlvbiAoZGVmYXVsdCBpcyBvZmYpLCBjb250aW51YXRpb24gbGluZXMgY2FuCmJlIGFsbG93ZWQ6CgogIFtTZWN0aW9uXQogIFBhcmFtZXRlcj10aGlzIHBhcmFtZXRlciBcCiAgICBzcHJlYWRzIGFjcm9zcyBcCiAgICBhIGZldyBsaW5lcwoKCj1oZWFkMSBVU0FHRSAtLSBPYmplY3QgSW50ZXJmYWNlCgpHZXQgYSBuZXcgQ29uZmlnOjpJbmlGaWxlcyBvYmplY3Qgd2l0aCB0aGUgSTxuZXc+IG1ldGhvZDoKCiAgJGNmZyA9IENvbmZpZzo6SW5pRmlsZXMtPm5ldyggLWZpbGUgPT4gIi9wYXRoL2NvbmZpZ2ZpbGUuaW5pIiApOwogICRjZmcgPSBuZXcgQ29uZmlnOjpJbmlGaWxlcyAtZmlsZSA9PiAiL3BhdGgvY29uZmlnZmlsZS5pbmkiOwoKT3B0aW9uYWwgbmFtZWQgcGFyYW1ldGVycyBtYXkgYmUgc3BlY2lmaWVkIGFmdGVyIHRoZSBjb25maWd1cmF0aW9uCmZpbGUgbmFtZS4gIFNlZSB0aGUgSTxuZXc+IGluIHRoZSBCPE1FVEhPRFM+IHNlY3Rpb24sIGJlbG93LgoKVmFsdWVzIGZyb20gdGhlIGNvbmZpZyBmaWxlIGFyZSBmZXRjaGVkIHdpdGggdGhlIHZhbCBtZXRob2Q6CgogICR2YWx1ZSA9ICRjZmctPnZhbCgnU2VjdGlvbicsICdQYXJhbWV0ZXInKTsKCklmIHlvdSB3YW50IGEgbXVsdGktbGluZS92YWx1ZSBmaWVsZCByZXR1cm5lZCBhcyBhbiBhcnJheSwganVzdApzcGVjaWZ5IGFuIGFycmF5IGFzIHRoZSByZWNlaXZlcjoKCiAgQHZhbHVlcyA9ICRjZmctPnZhbCgnU2VjdGlvbicsICdQYXJhbWV0ZXInKTsKCj1oZWFkMSBNRVRIT0RTCgo9aGVhZDIgbmV3ICggWy1vcHRpb249PnZhbHVlIC4uLl0gKQoKUmV0dXJucyBhIG5ldyBjb25maWd1cmF0aW9uIG9iamVjdCAob3IgInVuZGVmIiBpZiB0aGUgY29uZmlndXJhdGlvbgpmaWxlIGhhcyBhbiBlcnJvcikuICBPbmUgQ29uZmlnOjpJbmlGaWxlcyBvYmplY3QgaXMgcmVxdWlyZWQgcGVyIGNvbmZpZ3VyYXRpb24KZmlsZS4gIFRoZSBmb2xsb3dpbmcgbmFtZWQgcGFyYW1ldGVycyBhcmUgYXZhaWxhYmxlOgoKPW92ZXIgMTAKCj1pdGVtIEk8LWZpbGU+ICBmaWxlbmFtZQoKU3BlY2lmaWVzIGEgZmlsZSB0byBsb2FkIHRoZSBwYXJhbWV0ZXJzIGZyb20uIFRoaXMgJ2ZpbGUnIG1heSBhY3R1YWxseSBiZSAKYW55IG9mIHRoZSBmb2xsb3dpbmcgdGhpbmdzOgoKICAxKSBhIHNpbXBsZSBmaWxlaGFuZGxlLCBzdWNoIGFzIFNURElOCiAgMikgYSBmaWxlaGFuZGxlIGdsb2IsIHN1Y2ggYXMgKkNPTkZJRwogIDMpIGEgcmVmZXJlbmNlIHRvIGEgZ2xvYiwgc3VjaCBhcyBcKkNPTkZJRwogIDQpIGFuIElPOjpGaWxlIG9iamVjdAogIDUpIHRoZSBwYXRobmFtZSBvZiBhIGZpbGUKCklmIHRoaXMgb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQsIChpLmUuIHlvdSBhcmUgY3JlYXRpbmcgYSBjb25maWcgZmlsZSBmcm9tIHNjcmF0Y2gpIAp5b3UgbXVzdCBzcGVjaWZ5IGEgdGFyZ2V0IGZpbGUgdXNpbmcgU2V0RmlsZU5hbWUgaW4gb3JkZXIgdG8gc2F2ZSB0aGUgcGFyYW1ldGVycy4KCj1pdGVtIEk8LWRlZmF1bHQ+IHNlY3Rpb24KClNwZWNpZmllcyBhIHNlY3Rpb24gdG8gYmUgdXNlZCBmb3IgZGVmYXVsdCB2YWx1ZXMuIEZvciBleGFtcGxlLCBpZiB5b3UKbG9vayB1cCB0aGUgInBlcm1pc3Npb25zIiBwYXJhbWV0ZXIgaW4gdGhlICJ1c2VycyIgc2VjdGlvbiwgYnV0IHRoZXJlCmlzIG5vbmUsIENvbmZpZzo6SW5pRmlsZXMgd2lsbCBsb29rIHRvIHlvdXIgZGVmYXVsdCBzZWN0aW9uIGZvciBhICJwZXJtaXNzaW9ucyIKdmFsdWUgYmVmb3JlIHJldHVybmluZyB1bmRlZi4KCj1pdGVtIEk8LXJlbG9hZHdhcm4+IDB8MQoKU2V0IC1yZWxvYWR3YXJuID0+IDEgdG8gZW5hYmxlIGEgd2FybmluZyBtZXNzYWdlIChvdXRwdXQgdG8gU1RERVJSKQp3aGVuZXZlciB0aGUgY29uZmlnIGZpbGUgaXMgcmVsb2FkZWQuICBUaGUgcmVsb2FkIG1lc3NhZ2UgaXMgb2YgdGhlCmZvcm06CgogIFBJRCA8UElEPiByZWxvYWRpbmcgY29uZmlnIGZpbGUgPGZpbGU+IGF0IFlZWVkuTU0uREQgSEg6TU06U1MKCkRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gbm90IHdhcm4gKGkuZS4gLXJlbG9hZHdhcm4gPT4gMCkuCgo9aXRlbSBJPC1ub2Nhc2U+IDB8MQoKU2V0IC1ub2Nhc2UgPT4gMSB0byBoYW5kbGUgdGhlIGNvbmZpZyBmaWxlIGluIGEgY2FzZS1pbnNlbnNpdGl2ZQptYW5uZXIgKGNhc2UgaW4gdmFsdWVzIGlzIHByZXNlcnZlZCwgaG93ZXZlcikuICBCeSBkZWZhdWx0LCBjb25maWcKZmlsZXMgYXJlIGNhc2Utc2Vuc2l0aXZlIChpLmUuLCBhIHNlY3Rpb24gbmFtZWQgJ1Rlc3QnIGlzIG5vdCB0aGUgc2FtZQphcyBhIHNlY3Rpb24gbmFtZWQgJ3Rlc3QnKS4gIE5vdGUgdGhhdCB0aGVyZSBpcyBhbiBhZGRlZCBvdmVyaGVhZCBmb3IKdHVybmluZyBvZmYgY2FzZSBzZW5zaXRpdml0eS4KCj1pdGVtIEk8LWFsbG93Y29udGludWU+IDB8MQoKU2V0IC1hbGxvd2NvbnRpbnVlID0+IDEgdG8gZW5hYmxlIGNvbnRpbnVhdGlvbiBsaW5lcyBpbiB0aGUgY29uZmlnIGZpbGUuCmkuZS4gaWYgYSBsaW5lIGVuZHMgd2l0aCBhIGJhY2tzbGFzaCBDPFw+LCB0aGVuIHRoZSBmb2xsb3dpbmcgbGluZSBpcwphcHBlbmRlZCB0byB0aGUgcGFyYW1ldGVyIHZhbHVlLCBkcm9wcGluZyB0aGUgYmFja3NsYXNoIGFuZCB0aGUgbmV3bGluZQpjaGFyYWN0ZXIocykuCgpEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGtlZXAgYSB0cmFpbGluZyBiYWNrc2xhc2ggQzxcPiBhcyBhIHBhcmFtZXRlcgp2YWx1ZS4gTm90ZSB0aGF0IGNvbnRpbnVhdGlvbiBjYW5ub3QgYmUgbWl4ZWQgd2l0aCB0aGUgImhlcmUiIHZhbHVlCnN5bnRheC4KCj1pdGVtIEk8LWltcG9ydD4gb2JqZWN0CgpUaGlzIGFsbG93cyB5b3UgdG8gaW1wb3J0IG9yIGluaGVyaXQgZXhpc3Rpbmcgc2V0dGluZyBmcm9tIGFub3RoZXIgCkNvbmZpZzo6SW5pRmlsZXMgb2JqZWN0LiBXaGVuIGltcG9ydGluZyBzZXR0aW5ncyBmcm9tIGFub3RoZXIgb2JqZWN0LCAKc2VjdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lIHdpbGwgYmUgbWVyZ2VkIGFuZCBwYXJhbWV0ZXJzIHRoYXQgYXJlIApkZWZpbmVkIGluIGJvdGggdGhlIGltcG9ydGVkIG9iamVjdCBhbmQgdGhlIEk8LWZpbGU+IHdpbGwgdGFrZSB0aGUgCnZhbHVlIG9mIGdpdmVuIGluIHRoZSBJPC1maWxlPi4gCgpJZiBhIEk8LWRlZmF1bHQ+IHNlY3Rpb24gaXMgYWxzbyBnaXZlbiBvbiB0aGlzIGNhbGwsIGFuZCBpdCBkb2VzIG5vdCAKY29pbmNpZGUgd2l0aCB0aGUgZGVmYXVsdCBvZiB0aGUgaW1wb3J0ZWQgb2JqZWN0LCB0aGUgbmV3IGRlZmF1bHQgCnNlY3Rpb24gd2lsbCBiZSB1c2VkIGluc3RlYWQuIElmIG5vIEk8LWRlZmF1bHQ+IHNlY3Rpb24gaXMgZ2l2ZW4sIAp0aGVuIHRoZSBkZWZhdWx0IG9mIHRoZSBpbXBvcnRlZCBvYmplY3Qgd2lsbCBiZSB1c2VkLgoKPWl0ZW0gSTwtY29tbWVudGNoYXI+ICdjaGFyJwoKVGhlIGRlZmF1bHQgY29tbWVudCBjaGFyYWN0ZXIgaXMgQzwjPi4gWW91IG1heSBjaGFuZ2UgdGhpcyBieSBzcGVjaWZ5aW5nCnRoaXMgb3B0aW9uIHRvIGFuIGFyYml0cmFyeSBjaGFyYWN0ZXIsIGV4Y2VwdCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycwphbmQgc3F1YXJlIGJyYWNrZXRzIGFuZCB0aGUgImVxdWFsIiBzaWduLgoKPWl0ZW0gSTwtYWxsb3dlZGNvbW1lbnRjaGFycz4gJ2NoYXJzJwoKQWxsb3dlZCBkZWZhdWx0IGNvbW1lbnQgY2hhcmFjdGVycyBhcmUgQzwjPiBhbmQgQzw7Pi4gQnkgc3BlY2lmeWluZyB0aGlzCm9wdGlvbiB5b3UgbWF5IGVubGFyZ2Ugb3IgbmFycm93IHRoaXMgcmFuZ2UgdG8gYSBzZXQgb2YgY2hhcmFjdGVycwooY29uY2F0ZW5hdGluZyB0aGVtIHRvIGEgc3RyaW5nKS4gTm90ZSB0aGF0IHRoZSBjaGFyYWN0ZXIgc3BlY2lmaWVkIGJ5CkI8LWNvbW1lbnRjaGFyPiAoc2VlIGFib3ZlKSBpcyBhbHdheXMgcGFydCBvZiB0aGUgYWxsb3dlZCBjb21tZW50CmNoYXJhY3RlcnMuIE5vdGU6IFRoZSBnaXZlbiBzdHJpbmcgaXMgZXZhbHVhdGVkIGFzIGEgY2hhcmFjdGVyIGNsYXNzCihpLmUuOiBsaWtlIEM8L1tjaGFyc10vPikuCgo9YmFjawoKPWN1dAoKc3ViIG5ldyB7CiAgbXkgJGNsYXNzID0gc2hpZnQ7CiAgbXkgJXBhcm1zID0gQF87CgogIG15ICRlcnJzID0gMDsKICBteSBAZ3JvdXBzID0gKCApOwoKICBteSAkc2VsZiAgICAgICAgICAgPSB7fTsKICAjIFNldCBjb25maWcgZmlsZSB0byBkZWZhdWx0IHZhbHVlLCB3aGljaCBpcyBub3RoaW5nCiAgJHNlbGYtPntjZn0gICAgICAgID0gdW5kZWY7CiAgaWYoIHJlZigkcGFybXN7LWltcG9ydH0pICYmICgkcGFybXN7LWltcG9ydH0tPmlzYSgnQ29uZmlnOjpJbmlGaWxlcycpKSApIHsKICAgICMgSW1wb3J0IGZyb20gdGhlIGltcG9ydCBvYmplY3QgYnkgQ09QWWluZywgc28gd2UKCSMgZG9uJ3QgY2xvYmJlciB0aGUgb2xkIG9iamVjdAogICAgJXskc2VsZn0gPSAleyRwYXJtc3staW1wb3J0fX07CiAgfSBlbHNlIHsKICAgICRzZWxmLT57Zmlyc3Rsb2FkfSA9IDE7CiAgICAkc2VsZi0+e2RlZmF1bHR9ICAgPSAnJzsKICAgICRzZWxmLT57aW1wb3J0ZWR9ICA9IFtdOwogICAgaWYoIGRlZmluZWQgJHBhcm1zey1pbXBvcnR9ICkgewogICAgICBjYXJwICJJbnZhbGlkIC1pbXBvcnQgdmFsdWUgXCIkcGFybXN7LWltcG9ydH1cIiB3YXMgaWdub3JlZC4iOwogICAgICBkZWxldGUgJHBhcm1zey1pbXBvcnR9OwogICAgfSAjIGVuZCBpZgogIH0gIyBlbmQgaWYKCiAgIyBDb3B5IHRoZSBvcmlnaW5hbCBwYXJhbWV0ZXJzIHNvIHdlIAogICMgY2FuIHVzZSB0aGVtIHdoZW4gd2UgYnVpbGQgbmV3IHNlY3Rpb25zIAogICV7JHNlbGYtPntzdGFydHVwX3NldHRpbmdzfX0gPSAlcGFybXM7CgogICMgUGFyc2Ugb3B0aW9ucwogIG15KCRrLCAkdik7CiAgbG9jYWwgJF87CiAgJHNlbGYtPntub2Nhc2V9ID0gMDsKCiAgIyBIYW5kbGUga25vd24gcGFyYW1ldGVycyBmaXJzdCBpbiB0aGlzIG9yZGVyLCAKICAjIGJlY2F1c2UgZWFjaCgpIGNvdWxkIHJldHVybiBwYXJhbWV0ZXJzIGluIGFueSBvcmRlcgogIGlmIChkZWZpbmVkICgkdiA9IGRlbGV0ZSAkcGFybXN7Jy1pbXBvcnQnfSkpIHsKICAgICMgU3RvcmUgdGhlIGltcG9ydGVkIG9iamVjdCdzIGZpbGUgcGFyYW1ldGVyIGZvciByZWxvYWQKICAgIGlmKCAkc2VsZi0+e2NmfSApIHsKICAgICAgICBwdXNoKCBAeyRzZWxmLT57aW1wb3J0ZWR9fSwgJHNlbGYtPntjZn0gKTsKICAgIH0gZWxzZSB7CiAgICAgICAgcHVzaCggQHskc2VsZi0+e2ltcG9ydGVkfX0sICI8VW4tbmFtZWQgZmlsZT4iICk7CiAgICB9ICMgZW5kIGlmCiAgfQogIGlmIChkZWZpbmVkICgkdiA9IGRlbGV0ZSAkcGFybXN7Jy1maWxlJ30pKSB7CiAgICAjIFNob3VsZCB3ZSBiZSBwZWRhbnRpYyBhbmQgY2hlY2sgdGhhdCB0aGUgZmlsZSBleGlzdHM/CiAgICAjIC4uIG5vLCBiZWNhdXNlIG5vdyBpdCBjb3VsZCBiZSBhIGhhbmRsZSwgSU86OiBvYmplY3Qgb3Igc29tZXRoaW5nIGVsc2UKICAgICRzZWxmLT57Y2Z9ID0gJHY7CiAgfQogIGlmIChkZWZpbmVkICgkdiA9IGRlbGV0ZSAkcGFybXN7Jy1kZWZhdWx0J30pKSB7CiAgICAkc2VsZi0+e2RlZmF1bHR9ID0gJHY7CiAgfQogIGlmIChkZWZpbmVkICgkdiA9IGRlbGV0ZSAkcGFybXN7Jy1ub2Nhc2UnfSkpIHsKICAgICRzZWxmLT57bm9jYXNlfSA9ICR2ID8gMSA6IDA7CiAgfQogIGlmIChkZWZpbmVkICgkdiA9IGRlbGV0ZSAkcGFybXN7Jy1yZWxvYWR3YXJuJ30pKSB7CiAgICAkc2VsZi0+e3JlbG9hZHdhcm59ID0gJHYgPyAxIDogMDsKICB9CiAgaWYgKGRlZmluZWQgKCR2ID0gZGVsZXRlICRwYXJtc3snLWFsbG93Y29udGludWUnfSkpIHsKICAgICRzZWxmLT57YWxsb3djb250aW51ZX0gPSAkdiA/IDEgOiAwOwogIH0KICBpZiAoZGVmaW5lZCAoJHYgPSBkZWxldGUgJHBhcm1zeyctY29tbWVudGNoYXInfSkpIHsKICAgIGlmKCFkZWZpbmVkICR2IHx8IGxlbmd0aCgkdikgIT0gMSkgewogICAgICBjYXJwICJDb21tZW50IGNoYXJhY3RlciBtdXN0IGJlIHVuaXF1ZS4iOwogICAgICAkZXJycysrOwogICAgfQogICAgZWxzaWYoJHYgPX4gL1tcW1xdPVx3XS8pIHsKICAgICAgIyBtdXN0IG5vdCBiZSBzcXVhcmUgYnJhY2tldCwgZXF1YWwgc2lnbiBvciBhbHBoYW51bWVyaWMKICAgICAgY2FycCAiSWxsZWdhbCBjb21tZW50IGNoYXJhY3Rlci4iOwogICAgICAkZXJycysrOwogICAgfSAKICAgIGVsc2UgewogICAgICAkc2VsZi0+e2NvbW1lbnRfY2hhcn0gPSAkdjsKICAgIH0KICB9CiAgaWYgKGRlZmluZWQgKCR2ID0gZGVsZXRlICRwYXJtc3snLWFsbG93ZWRjb21tZW50Y2hhcnMnfSkpIHsKICAgICMgbXVzdCBub3QgYmUgc3F1YXJlIGJyYWNrZXQsIGVxdWFsIHNpZ24gb3IgYWxwaGFudW1lcmljCiAgICBpZighZGVmaW5lZCAkdiB8fCAkdiA9fiAvW1xbXF09XHddLykgewogICAgICBjYXJwICJJbGxlZ2FsIHZhbHVlIGZvciAtYWxsb3dlZGNvbW1lbnRjaGFycy4iOwogICAgICAkZXJycysrOwogICAgfQogICAgZWxzZSB7CiAgICAgICRzZWxmLT57Y29tbWVudF9jaGFyfSA9ICR2OwogICAgfQogIH0KICAkc2VsZi0+e2NvbW1lbnRfY2hhcn0gPSAnIycgdW5sZXNzIGV4aXN0cyAkc2VsZi0+e2NvbW1lbnRfY2hhcn07CiAgJHNlbGYtPnthbGxvd2VkX2NvbW1lbnRfY2hhcn0gPSAnOycgdW5sZXNzIGV4aXN0cyAkc2VsZi0+e2FsbG93ZWRfY29tbWVudF9jaGFyfTsKICAjIG1ha2Ugc3VyZSB0aGF0IGNvbW1lbnQgY2hhcmFjdGVyIGlzIGFsd2F5cyBhbGxvd2VkCiAgJHNlbGYtPnthbGxvd2VkX2NvbW1lbnRfY2hhcn0gLj0gJHNlbGYtPntjb21tZW50X2NoYXJ9OwoKICAjIEFueSBvdGhlciBwYXJhbWV0ZXJzIGFyZSB1bmtvd24KICB3aGlsZSAoKCRrLCAkdikgPSBlYWNoICVwYXJtcykgewogICAgY2FycCAiVW5rbm93biBuYW1lZCBwYXJhbWV0ZXIgJGs9PiR2IjsKICAgICRlcnJzKys7CiAgfQoKICByZXR1cm4gdW5kZWYgaWYgJGVycnM7CgogIGJsZXNzICRzZWxmLCAkY2xhc3M7CgogICMgTm8gY29uZmlnIGZpbGUgc3BlY2lmaWVkLCBzbyBldmVyeXRoaW5nJ3Mgb2theSBzbyBmYXIuCiAgaWYgKG5vdCBkZWZpbmVkICRzZWxmLT57Y2Z9KSB7CiAgICByZXR1cm4gJHNlbGY7CiAgfQogIAogIGlmICgkc2VsZi0+UmVhZENvbmZpZykgewogICAgcmV0dXJuICRzZWxmOwogIH0gZWxzZSB7CiAgICByZXR1cm4gdW5kZWY7CiAgfQp9Cgo9aGVhZDIgdmFsICgkc2VjdGlvbiwgJHBhcmFtZXRlciBbLCAkZGVmYXVsdF0gKQoKUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgKEM8JHBhcmFtZXRlcj4pIGluIHNlY3Rpb24gCkM8JHNlY3Rpb24+LCByZXR1cm5zIHVuZGVmIChvciBDPCRkZWZhdWx0PiBpZiBzcGVjaWZpZWQpIGlmIG5vIHNlY3Rpb24gb3IgCm5vIHBhcmFtZXRlciBmb3IgdGhlIGdpdmVuIHNlY3Rpb24gc2VjdGlvbiBleGlzdHMuCgoKSWYgeW91IHdhbnQgYSBtdWx0aS1saW5lL3ZhbHVlIGZpZWxkIHJldHVybmVkIGFzIGFuIGFycmF5LCBqdXN0CnNwZWNpZnkgYW4gYXJyYXkgYXMgdGhlIHJlY2VpdmVyOgoKICBAdmFsdWVzID0gJGNmZy0+dmFsKCdTZWN0aW9uJywgJ1BhcmFtZXRlcicpOwoKQSBtdWx0aS1saW5lL3ZhbHVlIGZpZWxkIHRoYXQgaXMgcmV0dXJuZWQgaW4gYSBzY2FsYXIgY29udGV4dCB3aWxsIGJlCmpvaW5lZCB1c2luZyAkLyAoaW5wdXQgcmVjb3JkIHNlcGFyYXRvciwgZGVmYXVsdCBpcyBcbikgaWYgZGVmaW5lZCwKb3RoZXJ3aXNlIHRoZSB2YWx1ZXMgd2lsbCBiZSBqb2luZWQgdXNpbmcgXG4uCgo9Y3V0CgpzdWIgdmFsIHsKICBteSAoJHNlbGYsICRzZWN0LCAkcGFybSwgJGRlZikgPSBAXzsKCiAgIyBBbHdheXMgcmV0dXJuIHVuZGVmIG9uIGJhZCBwYXJhbWV0ZXJzCiAgcmV0dXJuIHVuZGVmIGlmIG5vdCBkZWZpbmVkICRzZWN0OwogIHJldHVybiB1bmRlZiBpZiBub3QgZGVmaW5lZCAkcGFybTsKICAKICBpZiAoJHNlbGYtPntub2Nhc2V9KSB7CiAgICAkc2VjdCA9IGxjKCRzZWN0KTsKICAgICRwYXJtID0gbGMoJHBhcm0pOwogIH0KICAKICBteSAkdmFsID0gZGVmaW5lZCgkc2VsZi0+e3Z9eyRzZWN0fXskcGFybX0pID8KICAgICRzZWxmLT57dn17JHNlY3R9eyRwYXJtfSA6CiAgICAkc2VsZi0+e3Z9eyRzZWxmLT57ZGVmYXVsdH19eyRwYXJtfTsKICAKICAjIElmIHRoZSB2YWx1ZSBpcyB1bmRlZiwgbWFrZSBpdCAkZGVmIGluc3RlYWQgKHdoaWNoIGNvdWxkIGp1c3QgYmUgdW5kZWYpCiAgJHZhbCA9ICRkZWYgdW5sZXNzIGRlZmluZWQgJHZhbDsKICAKICAjIFJldHVybiB0aGUgdmFsdWUgaW4gdGhlIGRlc2lyZWQgY29udGV4dAogIGlmICh3YW50YXJyYXkgYW5kIHJlZigkdmFsKSBlcSAiQVJSQVkiKSB7CiAgICByZXR1cm4gQCR2YWw7CiAgfSBlbHNpZiAocmVmKCR2YWwpIGVxICJBUlJBWSIpIHsKICAJaWYgKGRlZmluZWQgKCQvKSkgewoJICAgIHJldHVybiBqb2luICIkLyIsIEAkdmFsOwoJfSBlbHNlIHsKCQlyZXR1cm4gam9pbiAiXG4iLCBAJHZhbDsKCX0KICB9IGVsc2UgewogICAgcmV0dXJuICR2YWw7CiAgfQp9Cgo9aGVhZDIgc2V0dmFsICgkc2VjdGlvbiwgJHBhcmFtZXRlciwgJHZhbHVlLCBbICR2YWx1ZTIsIC4uLiBdKQoKU2V0cyB0aGUgdmFsdWUgb2YgcGFyYW1ldGVyIEM8JHBhcmFtZXRlcj4gaW4gc2VjdGlvbiBDPCRzZWN0aW9uPiB0byAKQzwkdmFsdWU+IChvciB0byBhIHNldCBvZiB2YWx1ZXMpLiAgU2VlIGJlbG93IGZvciBtZXRob2RzIHRvIHdyaXRlIAp0aGUgbmV3IGNvbmZpZ3VyYXRpb24gYmFjayBvdXQgdG8gYSBmaWxlLgoKWW91IG1heSBub3Qgc2V0IGEgcGFyYW1ldGVyIHRoYXQgZGlkbid0IGV4aXN0IGluIHRoZSBvcmlnaW5hbApjb25maWd1cmF0aW9uIGZpbGUuICBCPHNldHZhbD4gd2lsbCByZXR1cm4gSTx1bmRlZj4gaWYgdGhpcyBpcwphdHRlbXB0ZWQuIFNlZSBCPG5ld3ZhbD4gYmVsb3cgdG8gZG8gdGhpcy4gT3RoZXJ3aXNlLCBpdCByZXR1cm5zIDEuCgo9Y3V0CgpzdWIgc2V0dmFsIHsKICBteSAkc2VsZiA9IHNoaWZ0OwogIG15ICRzZWN0ID0gc2hpZnQ7CiAgbXkgJHBhcm0gPSBzaGlmdDsKICBteSBAdmFsICA9IEBfOwoKICByZXR1cm4gdW5kZWYgaWYgbm90IGRlZmluZWQgJHNlY3Q7CiAgcmV0dXJuIHVuZGVmIGlmIG5vdCBkZWZpbmVkICRwYXJtOwoKIyB0b21AeXRyYW0uY29tICsKICBpZiAoJHNlbGYtPntub2Nhc2V9KSB7CiAgICAkc2VjdCA9IGxjKCRzZWN0KTsKICAgICRwYXJtID0gbGMoJHBhcm0pOwogIH0KIyB0b21AeXRyYW0uY29tIC0KCiAgaWYgKGRlZmluZWQoJHNlbGYtPnt2fXskc2VjdH17JHBhcm19KSkgewogICAgaWYgKEB2YWwgPiAxKSB7CiAgICAgICRzZWxmLT57dn17JHNlY3R9eyRwYXJtfSA9IFxAdmFsOwoJICAkc2VsZi0+e0VPVH17JHNlY3R9eyRwYXJtfSA9ICdFT1QnOwogICAgfSBlbHNlIHsKICAgICAgJHNlbGYtPnt2fXskc2VjdH17JHBhcm19ID0gc2hpZnQgQHZhbDsKICAgIH0KICAgIHJldHVybiAxOwogIH0gZWxzZSB7CiAgICByZXR1cm4gdW5kZWY7CiAgfQp9Cgo9aGVhZDIgbmV3dmFsKCRzZWN0aW9uLCAkcGFyYW1ldGVyLCAkdmFsdWUgWywgJHZhbHVlMiwgLi4uXSkKCkFzc2lnbmVzIGEgbmV3IHZhbHVlLCBDPCR2YWx1ZT4gKG9yIHNldCBvZiB2YWx1ZXMpIHRvIHRoZSAKcGFyYW1ldGVyIEM8JHBhcmFtZXRlcj4gaW4gc2VjdGlvbiBDPCRzZWN0aW9uPiBpbiB0aGUgY29uZmlndXJhdGlvbiAKZmlsZS4KCj1jdXQKCnN1YiBuZXd2YWwgewogIG15ICRzZWxmID0gc2hpZnQ7CiAgbXkgJHNlY3QgPSBzaGlmdDsKICBteSAkcGFybSA9IHNoaWZ0OwogIG15IEB2YWwgID0gQF87CiAgCiAgcmV0dXJuIHVuZGVmIGlmIG5vdCBkZWZpbmVkICRzZWN0OwogIHJldHVybiB1bmRlZiBpZiBub3QgZGVmaW5lZCAkcGFybTsKCiMgdG9tQHl0cmFtLmNvbSArCiAgaWYgKCRzZWxmLT57bm9jYXNlfSkgewogICAgJHNlY3QgPSBsYygkc2VjdCk7CiAgICAkcGFybSA9IGxjKCRwYXJtKTsKICB9CiMgdG9tQHl0cmFtLmNvbSAtCgkkc2VsZi0+QWRkU2VjdGlvbigkc2VjdCk7CgogICAgcHVzaChAeyRzZWxmLT57cGFybXN9eyRzZWN0fX0sICRwYXJtKSAKICAgICAgdW5sZXNzIChncmVwIHsvXlxRJHBhcm1cRSQvfSBAeyRzZWxmLT57cGFybXN9eyRzZWN0fX0gKTsKCiAgaWYgKEB2YWwgPiAxKSB7CiAgICAkc2VsZi0+e3Z9eyRzZWN0fXskcGFybX0gPSBcQHZhbDsKCSRzZWxmLT57RU9UfXskc2VjdH17JHBhcm19ID0gJ0VPVCcgdW5sZXNzIGRlZmluZWQKCQkJCSRzZWxmLT57RU9UfXskc2VjdH17JHBhcm19OwogIH0gZWxzZSB7CiAgICAkc2VsZi0+e3Z9eyRzZWN0fXskcGFybX0gPSBzaGlmdCBAdmFsOwogIH0KICByZXR1cm4gMQp9Cgo9aGVhZDIgZGVsdmFsKCRzZWN0aW9uLCAkcGFyYW1ldGVyKQoKRGVsZXRlcyB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlciBmcm9tIHRoZSBjb25maWd1cmF0aW9uIGZpbGUKCj1jdXQKCnN1YiBkZWx2YWwgewogIG15ICRzZWxmID0gc2hpZnQ7CiAgbXkgJHNlY3QgPSBzaGlmdDsKICBteSAkcGFybSA9IHNoaWZ0OwogIAogIHJldHVybiB1bmRlZiBpZiBub3QgZGVmaW5lZCAkc2VjdDsKICByZXR1cm4gdW5kZWYgaWYgbm90IGRlZmluZWQgJHBhcm07CgojIHRvbUB5dHJhbS5jb20gKwogIGlmICgkc2VsZi0+e25vY2FzZX0pIHsKICAgICRzZWN0ID0gbGMoJHNlY3QpOwogICAgJHBhcm0gPSBsYygkcGFybSk7CiAgfQojIHRvbUB5dHJhbS5jb20gLQoKCUB7JHNlbGYtPntwYXJtc317JHNlY3R9fSA9IGdyZXAgIS9eXFEkcGFybVxFJC8sIEB7JHNlbGYtPntwYXJtc317JHNlY3R9fTsKCWRlbGV0ZSAkc2VsZi0+e3Z9eyRzZWN0fXskcGFybX07CglyZXR1cm4gMQp9Cgo9aGVhZDIgUmVhZENvbmZpZwoKRm9yY2VzIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgdG8gYmUgcmUtcmVhZC4gUmV0dXJucyB1bmRlZiBpZiB0aGUgCmZpbGUgY2FuIG5vdCBiZSBvcGVuZWQsIG5vIGZpbGVuYW1lIHdhcyBkZWZpbmVkICh3aXRoIHRoZSBDPC1maWxlPgpvcHRpb24pIHdoZW4gdGhlIG9iamVjdCB3YXMgY29uc3RydWN0ZWQsIG9yIGFuIGVycm9yIG9jY3VycmVkIHdoaWxlIApyZWFkaW5nLgoKSWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHBhcnNpbmcgdGhlIElOSSBmaWxlIHRoZSBAQ29uZmlnOjpJbmlGaWxlczo6ZXJyb3JzCmFycmF5IHdpbGwgY29udGFpbiBtZXNzYWdlcyB0aGF0IG1pZ2h0IGhlbHAgeW91IGZpZ3VyZSBvdXQgd2hlcmUgdGhlIApwcm9ibGVtIGlzIGluIHRoZSBmaWxlLgoKPWN1dAoKc3ViIFJlYWRDb25maWcgewogIG15ICRzZWxmID0gc2hpZnQ7CgogIG15KCRsaW5lbm8sICRzZWN0KTsKICBteSgkZ3JvdXAsICRncm91cG1lbSk7CiAgbXkoJHBhcm0sICR2YWwpOwogIG15IEBjbXRzOwogIG15ICVsb2FkZWRfcGFyYW1zID0gKCk7CQkJIyBBIGhhcyB0byByZW1lbWJlciB3aGljaCBwYXJhbXMgYXJlIGxvYWRlZCB2cy4gaW1wb3J0ZWQKICBAQ29uZmlnOjpJbmlGaWxlczo6ZXJyb3JzID0gKCApOwoKICAjIEluaXRpYWxpemUgKGFuZCBjbGVhciBvdXQpIHN0b3JhZ2UgaGFzaGVzCiAgIyB1bmxlc3Mgd2UgaW1wb3J0ZWQgdGhlbSBmcm9tIGFub3RoZXIgZmlsZSBbSlddCiAgaWYoIEB7JHNlbGYtPntpbXBvcnRlZH19ICkgewogICAgICAjCiAgICAgICMgUnVuIHVwIHRoZSBpbXBvcnQgdHJlZSB0byB0aGUgdG9wLCB0aGVuIHJlbG9hZCBjb21pbmcKICAgICAgIyBiYWNrIGRvd24sIG1haW50YWluaW5nIHRoZSBpbXBvcnRlZCBmaWxlIG5hbWVzIGFuZCBvdXIgCiAgICAgICMgZmlsZSBuYW1lLgogICAgICAjIFRoaXMgaXMgb25seSBuZWVkZWQgb24gYSByZS1sb2FkIHRob3VnaAogICAgICB1bmxlc3MoICRzZWxmLT57Zmlyc3Rsb2FkfSApIHsKICAgICAgICBteSAkY2YgPSAkc2VsZi0+e2NmfTsKICAgICAgICAkc2VsZi0+e2NmfSA9IHBvcCBAeyRzZWxmLT57aW1wb3J0ZWR9fTsKICAgICAgICAkc2VsZi0+UmVhZENvbmZpZzsKICAgICAgICBwdXNoIEB7JHNlbGYtPntpbXBvcnRlZH19LCAkc2VsZi0+e2NmfTsKICAgICAgICAkc2VsZi0+e2NmfSA9ICRjZjsKICAgICAgfSAjIGVuZCB1bmxlc3MKICB9IGVsc2UgewogICAgICAkc2VsZi0+e3NlY3RzfSAgPSBbXTsJCSMgU2VjdGlvbnMKICAgICAgJHNlbGYtPntncm91cH0gID0ge307CQkjIFN1YnNlY3Rpb24gbGlzdHMKICAgICAgJHNlbGYtPnt2fSAgICAgID0ge307CQkjIFBhcmFtZXRlciB2YWx1ZXMKICAgICAgJHNlbGYtPntzQ01UfSAgID0ge307CQkjIENvbW1lbnRzIGFib3ZlIHNlY3Rpb24KICB9ICMgZW5kIGlmCiAgCiAgcmV0dXJuIHVuZGVmIGlmICgKICAgIChub3QgZXhpc3RzICRzZWxmLT57Y2Z9KSBvcgogICAgKG5vdCBkZWZpbmVkICRzZWxmLT57Y2Z9KSBvcgogICAgKCRzZWxmLT57Y2Z9IGVxICcnKQogICk7CiAgCiAgbXkgJG5vY2FzZSA9ICRzZWxmLT57bm9jYXNlfTsKCiAgIyBJZiB0aGlzIGlzIGEgcmVsb2FkIGFuZCB3ZSB3YW50IHdhcm5pbmdzIHRoZW4gc2VuZCBvbmUgdG8gdGhlIFNUREVSUiBsb2cKICB1bmxlc3MoICRzZWxmLT57Zmlyc3Rsb2FkfSB8fCAhJHNlbGYtPntyZWxvYWR3YXJufSApIHsKICAgIG15ICgkc3MsICRtbSwgJGhoLCAkREQsICRNTSwgJFlZKSA9IChsb2NhbHRpbWUodGltZSkpWzAuLjVdOwogICAgcHJpbnRmIFNUREVSUgogICAgICAiUElEICVkIHJlbG9hZGluZyBjb25maWcgZmlsZSAlcyBhdCAlZC4lMDJkLiUwMmQgJTAyZDolMDJkOiUwMmRcbiIsCiAgICAgICQkLCAkc2VsZi0+e2NmfSwgJFlZKzE5MDAsICRNTSsxLCAkREQsICRoaCwgJG1tLCAkc3M7CiAgfQogIAogICMgVHVybiBvZmYuIEZ1dHVyZSBsb2FkcyBhcmUgcmVsb2FkcwogICRzZWxmLT57Zmlyc3Rsb2FkfSA9IDA7CgogICMgR2V0IGEgZmlsZWhhbmRsZSwgYWxsb3dpbmcgYWxtb3N0IGFueSB0eXBlIG9mICdmaWxlJyBwYXJhbWV0ZXIKICBteSAkZmggPSAkc2VsZi0+X21ha2VfZmlsZWhhbmRsZSggJHNlbGYtPntjZn0gKTsKICBpZiAoISRmaCkgewogICAgY2FycCAiRmFpbGVkIHRvIG9wZW4gJHNlbGYtPntjZn06ICQhIjsKICAgIHJldHVybiB1bmRlZjsKICB9CiAgCiAgIyBHZXQgbW9kIHRpbWUgb2YgZmlsZSBzbyB3ZSBjYW4gcmV0YWluIGl0IChpZiBub3QgZnJvbSBTVERJTikKICBteSBAc3RhdHMgPSBzdGF0ICRmaDsKICAkc2VsZi0+e2ZpbGVfbW9kZX0gPSBzcHJpbnRmKCIlMDRvIiwgJHN0YXRzWzJdKSBpZiBkZWZpbmVkICRzdGF0c1syXTsKICAKICAjIEdldCB0aGUgZW50aXJlIGZpbGUgaW50byBtZW1vcnkgKGxldCdzIGhvcGUgaXQncyBzbWFsbCEpCiAgbG9jYWwgJF87CiAgbXkgQGxpbmVzID0gc3BsaXQgL1wwMTVcMDEyP3xcMDEyfFwwMjV8XG4vLCBqb2luKCAnJywgPCRmaD4pOwogIAogICMgT25seSBjbG9zZSBpZiB0aGlzIGlzIGEgZmlsZW5hbWUsIGlmIGl0J3MKICAjIGFuIG9wZW4gaGFuZGxlLCB0aGVuIGp1c3Qgcm9sbCBiYWNrIHRvIHRoZSBzdGFydAogIGlmKCAhcmVmKCRmaCkgKSB7CiAgICBjbG9zZSgkZmgpOwogIH0gZWxzZSB7CiAgICAjIEJ1dCB3ZSBjYW4ndCByb2xsIGJhY2sgU1RESU4gc28gc2tpcCB0aGF0IG9uZQogICAgaWYoICRmaCAhPSAwICkgewogICAgICBzZWVrKCAkZmgsIDAsIDAgKTsKICAgIH0gIyBlbmQgaWYKICB9ICMgZW5kIGlmCgogICMgSWYgdGhlcmUncyBhIFVURiBCT00gKEJ5dGUtT3JkZXItTWFyaykgaW4gdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgZmlyc3QgbGluZQogICMgdGhlbiByZW1vdmUgaXQgYmVmb3JlIHByb2Nlc3NpbmcgKGh0dHA6Ly93d3cudW5pY29kZS5vcmcvdW5pY29kZS9mYXEvdXRmX2JvbS5odG1sIzIyKQogICgkbGluZXNbMF0gPX4gcy9e77u/Ly8pOwojIERpc2FibGVkIHRoZSB1dGY4IG9uZSBmb3Igbm93IChKVykgYmVjYXVzZSBpdCBkb2Vzbid0IHdvcmsgb24gYWxsIHBlcmwgZGlzdHJvcwojIGUuZy4gNS42LjEgd29ya3Mgd2l0aCBvciB3L28gJ3VzZSB1dGY4JyA1LjYuMCBmYWlscyB3L28gaXQuIDUuMDA1XzAzIAojIHNheXMgImludmFsaWQgaGV4IHZhbHVlIiwgZXRjLiBJZiBhbnlvbmUgaGFzIGEgY2x1ZSBob3cgdG8gbWFrZSB0aGlzIHdvcmsgCiMgcGxlYXNlIGxldCBtZSBrbm93IQojICAoJGxpbmVzWzBdID1+IHMvXu+7vy8vKSB8fCAoZXZhbCgndXNlIHV0Zjg7ICRsaW5lc1swXSA9fiBzL15ceHtGRUZGfS8vOycpKTsKIyAgJEAgPSAnJzsgJCEgPSB1bmRlZjsgICMgQ2xlYXIgYW55IGVycm9yIG1lc3NhZ2VzCgogIAogIAogICMgVGhlIGZpcnN0IGxpbmVzIG9mIHRoZSBmaWxlIG11c3QgYmUgYmxhbmssIGNvbW1lbnRzIG9yIHN0YXJ0IHdpdGggWwogIG15ICRmaXJzdCA9ICcnOwogIG15ICRhbGxDbXQgPSAkc2VsZi0+e2FsbG93ZWRfY29tbWVudF9jaGFyfTsKICBmb3JlYWNoICggQGxpbmVzICkgewogICAgbmV4dCBpZiAvXlxzKiQvOwkjIGlnbm9yZSBibGFuayBsaW5lcwogICAgbmV4dCBpZiAvXlxzKlskYWxsQ210XS87CSMgaWdub3JlIGNvbW1lbnRzCiAgICAkZmlyc3QgPSAkXzsKICAgIGxhc3Q7CiAgfQogIHVubGVzcyggJGZpcnN0ID1+IC9eXHMqXFsvICkgewogICAgcmV0dXJuIHVuZGVmOwogIH0KICAKICAjIFN0b3JlIHdoYXQgb3VyIGxpbmUgZW5kaW5nIGNoYXIgd2FzIGZvciBvdXRwdXQKICAoJHNlbGYtPntsaW5lX2VuZHN9KSA9ICRsaW5lc1swXSA9fiAvKFtcMDE1XDAxMlwwMjVcbl0rKS87CiAgd2hpbGUgKCBAbGluZXMgKSB7CiAgICAkXyA9IHNoaWZ0IEBsaW5lczsKCiAgICBzLyhcMDE1XDAxMj98XDAxMnxcMDI1fFxuKSQvLzsJCQkJIyByZW1vdmUgbGluZSBlbmRpbmcgY2hhcihzKQogICAgJGxpbmVubysrOwogICAgaWYgKC9eXHMqJC8pIHsJCQkJIyBpZ25vcmUgYmxhbmsgbGluZXMKICAgICAgbmV4dDsKICAgIH0KICAgIGVsc2lmICgvXlxzKlskYWxsQ210XS8pIHsJCQkjIGNvbGxlY3QgY29tbWVudHMKICAgICAgcHVzaChAY210cywgJF8pOwogICAgICBuZXh0OwogICAgfQogICAgZWxzaWYgKC9eXHMqXFtccyooXFN8XFMuKlxTKVxzKlxdXHMqJC8pIHsJCSMgTmV3IFNlY3Rpb24KICAgICAgJHNlY3QgPSAkMTsKICAgICAgaWYgKCRzZWxmLT57bm9jYXNlfSkgewogICAgICAgICRzZWN0ID0gbGMoJHNlY3QpOwogICAgICB9CiAgICAgICRzZWxmLT5BZGRTZWN0aW9uKCRzZWN0KTsKICAgICAgJHNlbGYtPlNldFNlY3Rpb25Db21tZW50KCRzZWN0LCBAY210cyk7CiAgICAgIEBjbXRzID0gKCk7CiAgICB9CiAgICBlbHNpZiAoKCRwYXJtLCAkdmFsKSA9IC9eXHMqKFtePV0qP1tePVxzXSlccyo9XHMqKC4qKSQvKSB7CSMgbmV3IHBhcmFtZXRlcgogICAgICAkcGFybSA9IGxjKCRwYXJtKSBpZiAkbm9jYXNlOwogICAgICAkc2VsZi0+e3BDTVR9eyRzZWN0fXskcGFybX0gPSBbQGNtdHNdOwogICAgICBAY210cyA9ICggKTsKICAgICAgaWYgKCR2YWwgPX4gL148PCguKikkLykgewkJCSMgImhlcmUiIHZhbHVlCglteSAkZW90bWFyayAgPSAkMTsKCW15ICRmb3VuZGVvdCA9IDA7CglteSAkc3RhcnRsaW5lID0gJGxpbmVubzsKCW15IEB2YWwgPSAoICk7Cgl3aGlsZSAoIEBsaW5lcyApIHsKCSAgJF8gPSBzaGlmdCBAbGluZXM7CgkgIHMvKFwwMTVcMDEyP3xcMDEyfFwwMjV8XG4pJC8vOwkJCQkjIHJlbW92ZSBsaW5lIGVuZGluZyBjaGFyKHMpCgkgICRsaW5lbm8rKzsKCSAgaWYgKCRfIGVxICRlb3RtYXJrKSB7CgkgICAgJGZvdW5kZW90ID0gMTsKCSAgICBsYXN0OwoJICB9IGVsc2UgewoJICAgIHB1c2goQHZhbCwgJF8pOwoJICB9Cgl9CglpZiAoJGZvdW5kZW90KSB7CgkgICAgaWYgKGV4aXN0cyAkc2VsZi0+e3Z9eyRzZWN0fXskcGFybX0gJiYgCgkgICAgICAgIGV4aXN0cyAkbG9hZGVkX3BhcmFtc3skc2VjdH0gJiYgCgkgICAgICAgIGdyZXAoIC9eXFEkcGFybVxFJC8sIEB7JGxvYWRlZF9wYXJhbXN7JHNlY3R9fSkgKSB7CgkgICAgICBpZiAocmVmKCRzZWxmLT57dn17JHNlY3R9eyRwYXJtfSkgZXEgIkFSUkFZIikgewoJICAgICAgICAjIEFkZCB0byB0aGUgYXJyYXkKCSAgICAgICAgcHVzaCBAeyRzZWxmLT57dn17JHNlY3R9eyRwYXJtfX0sIEB2YWw7CgkgICAgICB9IGVsc2UgewoJICAgICAgICAjIENyZWF0ZSBhcnJheQoJICAgICAgICBteSAkb2xkX3ZhbHVlID0gJHNlbGYtPnt2fXskc2VjdH17JHBhcm19OwoJICAgICAgICBteSBAbmV3X3ZhbHVlID0gKCRvbGRfdmFsdWUsIEB2YWwpOwoJICAgICAgICAkc2VsZi0+e3Z9eyRzZWN0fXskcGFybX0gPSBcQG5ld192YWx1ZTsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJCSRzZWxmLT57dn17JHNlY3R9eyRwYXJtfSA9IFxAdmFsOwoJCSRsb2FkZWRfcGFyYW1zeyRzZWN0fSA9IFtdIHVubGVzcyAkbG9hZGVkX3BhcmFtc3skc2VjdH07CgkJcHVzaCBAeyRsb2FkZWRfcGFyYW1zeyRzZWN0fX0sICRwYXJtOwoJICAgIH0KCSAgICAkc2VsZi0+e0VPVH17JHNlY3R9eyRwYXJtfSA9ICRlb3RtYXJrOwoJfSBlbHNlIHsKCSAgcHVzaChAQ29uZmlnOjpJbmlGaWxlczo6ZXJyb3JzLCBzcHJpbnRmKCclZDogJXMnLCAkc3RhcnRsaW5lLAoJCQkgICAgICBxcSNubyBlbmQgbWFya2VyICgiJGVvdG1hcmsiKSBmb3VuZCMpKTsKCX0KICAgICAgfSBlbHNlIHsgIyBubyBoZXJlIHZhbHVlCgogICAgICAgICMgcHJvY2VzcyBjb250aW51YXRpb24gbGluZXMsIGlmIGFueQogICAgICAgIHdoaWxlKCRzZWxmLT57YWxsb3djb250aW51ZX0gJiYgJHZhbCA9fiBzL1xcJC8vKSB7CiAgICAgICAgICAkXyA9IHNoaWZ0IEBsaW5lczsKCSAgcy8oXDAxNVwwMTI/fFwwMTJ8XDAyNXxcbikkLy87ICMgcmVtb3ZlIGxpbmUgZW5kaW5nIGNoYXIocykKCSAgJGxpbmVubysrOwogICAgICAgICAgJHZhbCAuPSAkXzsKICAgICAgICB9CgogICAgICAgICMgTm93IGxvYWQgdmFsdWUKCWlmIChleGlzdHMgJHNlbGYtPnt2fXskc2VjdH17JHBhcm19ICYmCgkgICAgZXhpc3RzICRsb2FkZWRfcGFyYW1zeyRzZWN0fSAmJiAKCSAgICBncmVwKCAvXlxRJHBhcm1cRSQvLCBAeyRsb2FkZWRfcGFyYW1zeyRzZWN0fX0pICkgewoJICAgIGlmIChyZWYoJHNlbGYtPnt2fXskc2VjdH17JHBhcm19KSBlcSAiQVJSQVkiKSB7CgkJIyBBZGQgdG8gdGhlIGFycmF5CgkJcHVzaCBAeyRzZWxmLT57dn17JHNlY3R9eyRwYXJtfX0sICR2YWw7CgkgICAgfSBlbHNlIHsKCQkjIENyZWF0ZSBhcnJheQoJCW15ICRvbGRfdmFsdWUgPSAkc2VsZi0+e3Z9eyRzZWN0fXskcGFybX07CgkJbXkgQG5ld192YWx1ZSA9ICgkb2xkX3ZhbHVlLCAkdmFsKTsKCQkkc2VsZi0+e3Z9eyRzZWN0fXskcGFybX0gPSBcQG5ld192YWx1ZTsKCSAgICB9Cgl9IGVsc2UgewoJICAgICRzZWxmLT57dn17JHNlY3R9eyRwYXJtfSA9ICR2YWw7CgkgICAgJGxvYWRlZF9wYXJhbXN7JHNlY3R9ID0gW10gdW5sZXNzICRsb2FkZWRfcGFyYW1zeyRzZWN0fTsKCSAgICBwdXNoIEB7JGxvYWRlZF9wYXJhbXN7JHNlY3R9fSwgJHBhcm07Cgl9CiAgICAgIH0KICAgICAgcHVzaChAeyRzZWxmLT57cGFybXN9eyRzZWN0fX0sICRwYXJtKSB1bmxlc3MgZ3JlcCgvXlxRJHBhcm1cRSQvLCBAeyRzZWxmLT57cGFybXN9eyRzZWN0fX0pOwogICAgfQogICAgZWxzZSB7CiAgICAgIHB1c2goQENvbmZpZzo6SW5pRmlsZXM6OmVycm9ycywgc3ByaW50ZigiTGluZSBcJWQgaW4gZmlsZSAiIC4gJHNlbGYtPntjZn0gLiAiIGlzIG1hbC1mb3JtZWQ6XG5cdFwlcyIsICRsaW5lbm8sICRfKSk7CiAgICB9CiAgfQoKICAjCiAgIyBOb3cgY29udmVydCBhbGwgdGhlIHBhcmFtZXRlciBoYXNoZXMgaW50byB0aWVkIGhhc2hlcy4KICAjIFRoaXMgaXMgaW4gYWxsIHVzZXMsIGJlY2F1c2UgaXQgbXVzdCBiZSBwYXJ0IG9mIFJlYWRDb25maWcuCiAgIwogIG15ICVwYXJtcyA9ICV7JHNlbGYtPntzdGFydHVwX3NldHRpbmdzfX07CiAgaWYoIGRlZmluZWQgJHBhcm1zey1kZWZhdWx0fSApIHsKICAgICMgSWYgdGhlIGRlZmF1bHQgc2VjdGlvbiBkb2Vzbid0IGV4aXN0cywgY3JlYXRlIGl0LgogICAgdW5sZXNzKCBkZWZpbmVkICRzZWxmLT57dn17JHBhcm1zey1kZWZhdWx0fX0gKSB7CiAgICAgICRzZWxmLT57dn17JHBhcm1zey1kZWZhdWx0fX0gPSB7fTsKICAgICAgcHVzaChAeyRzZWxmLT57c2VjdHN9fSwgJHBhcm1zey1kZWZhdWx0fSkgdW5sZXNzIChncmVwIC9eXFEkcGFybXN7LWRlZmF1bHR9XEUkLywgQHskc2VsZi0+e3NlY3RzfX0pOwogICAgICAkc2VsZi0+e3Bhcm1zfXskcGFybXN7LWRlZmF1bHR9fSA9IFtdOwogICAgfSAjIGVuZCB1bmxlc3MKICAgICRwYXJtc3stZGVmYXVsdH0gPSAkc2VsZi0+e3Z9eyRwYXJtc3stZGVmYXVsdH19OwogIH0gIyBlbmQgaWYKICBmb3JlYWNoKCBrZXlzICV7JHNlbGYtPnt2fX0gKSB7CiAgICAkcGFybXN7LV9jdXJyZW50X3ZhbHVlfSA9ICRzZWxmLT57dn17JF99OwogICAgJHBhcm1zey1wYXJtc30gPSAkc2VsZi0+e3Bhcm1zfXskX307CiAgICAkc2VsZi0+e3Z9eyRffSA9IHt9OwogICAgIyBBZGQgYSByZWZlcmVuY2UgdG8gb3VyIHtwYXJtc30gaGFzaCBmb3IgZWFjaCBzZWN0aW9uCiAgICB0aWUgJXskc2VsZi0+e3Z9eyRffX0sICdDb25maWc6OkluaUZpbGVzOjpfc2VjdGlvbicsICVwYXJtcwogIH0gIyBlbmQgZm9yZWFjaAoKICBAQ29uZmlnOjpJbmlGaWxlczo6ZXJyb3JzID8gdW5kZWYgOiAxOwp9CgoKPWhlYWQyIFNlY3Rpb25zCgpSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgc2VjdGlvbiBuYW1lcyBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgpJZiB0aGUgSTxub2Nhc2U+IG9wdGlvbiB3YXMgdHVybmVkIG9uIHdoZW4gdGhlIGNvbmZpZyBvYmplY3Qgd2FzCmNyZWF0ZWQsIHRoZSBzZWN0aW9uIG5hbWVzIHdpbGwgYmUgcmV0dXJuZWQgaW4gbG93ZXJjYXNlLgoKPWN1dAoKc3ViIFNlY3Rpb25zIHsKICBteSAkc2VsZiA9IHNoaWZ0OwogIHJldHVybiBAeyRzZWxmLT57c2VjdHN9fSBpZiByZWYgJHNlbGYtPntzZWN0c30gZXEgJ0FSUkFZJzsKICByZXR1cm4gKCk7Cn0KCj1oZWFkMiBTZWN0aW9uRXhpc3RzICggJHNlY3RfbmFtZSApCgpSZXR1cm5zIDEgaWYgdGhlIHNwZWNpZmllZCBzZWN0aW9uIGV4aXN0cyBpbiB0aGUgSU5JIGZpbGUsIDAgb3RoZXJ3aXNlICh1bmRlZmluZWQgaWYgc2VjdGlvbl9uYW1lIGlzIG5vdCBkZWZpbmVkKS4KCj1jdXQKCnN1YiBTZWN0aW9uRXhpc3RzIHsKCW15ICRzZWxmID0gc2hpZnQ7CglteSAkc2VjdCA9IHNoaWZ0OwoJCglyZXR1cm4gdW5kZWYgaWYgbm90IGRlZmluZWQgJHNlY3Q7CgkKCWlmICgkc2VsZi0+e25vY2FzZX0pIHsKCQkkc2VjdCA9IGxjKCRzZWN0KTsKCX0KCQoJcmV0dXJuIHVuZGVmKCkgaWYgbm90IGRlZmluZWQgJHNlY3Q7CglyZXR1cm4gMSBpZiAoZ3JlcCB7L15cUSRzZWN0XEUkL30gQHskc2VsZi0+e3NlY3RzfX0pOwoJcmV0dXJuIDA7Cn0KCj1oZWFkMiBBZGRTZWN0aW9uICggJHNlY3RfbmFtZSApCgpFbnN1cmVzIHRoYXQgdGhlIG5hbWVkIHNlY3Rpb24gZXhpc3RzIGluIHRoZSBJTkkgZmlsZS4gSWYgdGhlIHNlY3Rpb24gYWxyZWFkeQpleGlzdHMsIG5vdGhpbmcgaXMgZG9uZS4gSW4gdGhpcyBjYXNlLCB0aGUgIm5ldyIgc2VjdGlvbiB3aWxsIHBvc3NpYmx5IGNvbnRhaW4KZGF0YSBhbHJlYWR5LgoKSWYgeW91IHJlYWxseSBuZWVkIHRvIGhhdmUgYSBuZXcgc2VjdGlvbiB3aXRoIG5vIHBhcmFtZXRlcnMgaW4gaXQsIGNoZWNrIHRoYXQKdGhlIG5hbWUgdGhhdCB5b3UncmUgYWRkaW5nIGlzbid0IGluIHRoZSBsaXN0IG9mIHNlY3Rpb25zIGFscmVhZHkuCgo9Y3V0CgpzdWIgQWRkU2VjdGlvbiB7CglteSAkc2VsZiA9IHNoaWZ0OwoJbXkgJHNlY3QgPSBzaGlmdDsKCQoJcmV0dXJuIHVuZGVmIGlmIG5vdCBkZWZpbmVkICRzZWN0OwoJCglpZiAoJHNlbGYtPntub2Nhc2V9KSB7CgkJJHNlY3QgPSBsYygkc2VjdCk7Cgl9CgkKCXJldHVybiBpZiAkc2VsZi0+U2VjdGlvbkV4aXN0cygkc2VjdCk7CglwdXNoIEB7JHNlbGYtPntzZWN0c319LCAkc2VjdDsKCSRzZWxmLT5TZXRHcm91cE1lbWJlcigkc2VjdCk7CgkKCSMgU2V0IHVwIHRoZSBwYXJhbWV0ZXIgbmFtZXMgYW5kIHZhbHVlcyBsaXN0cwogICAgJHNlbGYtPntwYXJtc317JHNlY3R9ID0gW10gdW5sZXNzIHJlZiAkc2VsZi0+e3Bhcm1zfXskc2VjdH0gZXEgJ0FSUkFZJzsKCWlmICghZGVmaW5lZCgkc2VsZi0+e3Z9eyRzZWN0fSkpIHsKCQkkc2VsZi0+e3NDTVR9eyRzZWN0fSA9IFtdOwoJCSRzZWxmLT57cENNVH17JHNlY3R9ID0ge307CQkjIENvbW1lbnRzIGFib3ZlIHBhcmFtZXRlcnMKCQkkc2VsZi0+e3Bhcm1zfXskc2VjdH0gPSBbXTsKCQkkc2VsZi0+e3Z9eyRzZWN0fSA9IHt9OwoJfQp9Cgo9aGVhZDIgRGVsZXRlU2VjdGlvbiAoICRzZWN0X25hbWUgKQoKQ29tcGxldGVseSByZW1vdmVzIHRoZSBlbnRpcmUgc2VjdGlvbiBmcm9tIHRoZSBjb25maWd1cmF0aW9uLgoKPWN1dAoKc3ViIERlbGV0ZVNlY3Rpb24gewoJbXkgJHNlbGYgPSBzaGlmdDsKCW15ICRzZWN0ID0gc2hpZnQ7CgkKCXJldHVybiB1bmRlZiBpZiBub3QgZGVmaW5lZCAkc2VjdDsKCQoJaWYgKCRzZWxmLT57bm9jYXNlfSkgewoJCSRzZWN0ID0gbGMoJHNlY3QpOwoJfQoKCSMgVGhpcyBpcyBkb25lLCB0aGUgZmFzdCB3YXksIGNoYW5nZSBpZiBkZWx2YWwgY2hhbmdlcyEhCglkZWxldGUgJHNlbGYtPnt2fXskc2VjdH07CglkZWxldGUgJHNlbGYtPntzQ01UfXskc2VjdH07CglkZWxldGUgJHNlbGYtPntwQ01UfXskc2VjdH07CglkZWxldGUgJHNlbGYtPntFT1R9eyRzZWN0fTsKCWRlbGV0ZSAkc2VsZi0+e3Bhcm1zfXskc2VjdH07CgoJQHskc2VsZi0+e3NlY3RzfX0gPSBncmVwICEvXlxRJHNlY3RcRSQvLCBAeyRzZWxmLT57c2VjdHN9fTsKCglpZiggJHNlY3QgPX4gL14oXFMrKVxzK1xTKy8gKSB7CgkJbXkgJGdyb3VwID0gJDE7CgkJaWYoIGRlZmluZWQoJHNlbGYtPntncm91cH17JGdyb3VwfSkgKSB7CgkJCUB7JHNlbGYtPntncm91cH17JGdyb3VwfX0gPSBncmVwICEvXlxRJHNlY3RcRSQvLCBAeyRzZWxmLT57Z3JvdXB9eyRncm91cH19OwoJCX0gIyBlbmQgaWYKCX0gIyBlbmQgaWYKCglyZXR1cm4gMTsKfSAjIGVuZCBEZWxldGVTZWN0aW9uCgo9aGVhZDIgUGFyYW1ldGVycyAoJHNlY3RfbmFtZSkKClJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBjb250YWluZWQgaW4gdGhlIHNwZWNpZmllZApzZWN0aW9uLgoKPWN1dAoKc3ViIFBhcmFtZXRlcnMgewogIG15ICRzZWxmID0gc2hpZnQ7CiAgbXkgJHNlY3QgPSBzaGlmdDsKICAKICByZXR1cm4gdW5kZWYgaWYgbm90IGRlZmluZWQgJHNlY3Q7CiAgCiAgaWYgKCRzZWxmLT57bm9jYXNlfSkgewogICAgJHNlY3QgPSBsYygkc2VjdCk7CiAgfQogIAogIHJldHVybiBAeyRzZWxmLT57cGFybXN9eyRzZWN0fX0gaWYgcmVmICRzZWxmLT57cGFybXN9eyRzZWN0fSBlcSAnQVJSQVknOwogIHJldHVybiAoKTsKfQoKPWhlYWQyIEdyb3VwcwoKUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBuYW1lcyBvZiBhdmFpbGFibGUgZ3JvdXBzLgogIApHcm91cHMgYXJlIHNwZWNpZmllZCBpbiB0aGUgY29uZmlnIGZpbGUgYXMgbmV3IHNlY3Rpb25zIG9mIHRoZSBmb3JtCgogIFtHcm91cE5hbWUgTWVtYmVyTmFtZV0KClRoaXMgaXMgdXNlZnVsIGZvciBidWlsZGluZyB1cCBsaXN0cy4gIE5vdGUgdGhhdCBwYXJhbWV0ZXJzIHdpdGhpbiBhCiJtZW1iZXIiIHNlY3Rpb24gYXJlIHJlZmVyZW5jZWQgbm9ybWFsbHkgKGkuZS4sIHRoZSBzZWN0aW9uIG5hbWUgaXMKc3RpbGwgIkdyb3VwbmFtZSBNZW1iZXJuYW1lIiwgaW5jbHVkaW5nIHRoZSBzcGFjZSkgLSB0aGUgY29uY2VwdCBvZgpHcm91cHMgaXMgdG8gYWlkIHBlb3BsZSBidWlsZGluZyBtb3JlIGNvbXBsZXggY29uZmlndXJhdGlvbiBmaWxlcy4KCj1jdXQKCnN1YiBHcm91cHMJewogIG15ICRzZWxmID0gc2hpZnQ7CiAgcmV0dXJuIGtleXMgJXskc2VsZi0+e2dyb3VwfX0gaWYgcmVmICRzZWxmLT57Z3JvdXB9IGVxICdIQVNIJzsKICByZXR1cm4gKCk7Cn0KCj1oZWFkMiBTZXRHcm91cE1lbWJlciAoICRzZWN0ICkKCk1ha2VzIHN1cmUgdGhhdCB0aGUgc3BlY2lmaWVkIHNlY3Rpb24gaXMgYSBtZW1iZXIgb2YgdGhlIGFwcHJvcHJpYXRlIGdyb3VwLgoKT25seSBpbnRlbmRlZCBmb3IgdXNlIGluIG5ld3ZhbC4KCj1jdXQKCnN1YiBTZXRHcm91cE1lbWJlciB7CglteSAkc2VsZiA9IHNoaWZ0OwoJbXkgJHNlY3QgPSBzaGlmdDsKCQoJcmV0dXJuIHVuZGVmIGlmIG5vdCBkZWZpbmVkICRzZWN0OwoJCglyZXR1cm4oMSkgdW5sZXNzICRzZWN0ID1+IC9eKFxTKylccytcUysvOwoJCglteSAkZ3JvdXAgPSAkMTsKCWlmIChub3QgZXhpc3RzKCRzZWxmLT57Z3JvdXB9eyRncm91cH0pKSB7CgkJJHNlbGYtPntncm91cH17JGdyb3VwfSA9IFtdOwoJfQoJaWYgKG5vdCBncmVwIHsvXlxRJHNlY3RcRSQvfSBAeyRzZWxmLT57Z3JvdXB9eyRncm91cH19KSB7CgkJcHVzaCBAeyRzZWxmLT57Z3JvdXB9eyRncm91cH19LCAkc2VjdDsKCX0KfQoKPWhlYWQyIFJlbW92ZUdyb3VwTWVtYmVyICggJHNlY3QgKQoKTWFrZXMgc3VyZSB0aGF0IHRoZSBzcGVjaWZpZWQgc2VjdGlvbiBpcyBubyBsb25nZXIgYSBtZW1iZXIgb2YgdGhlCmFwcHJvcHJpYXRlIGdyb3VwLiBPbmx5IGludGVuZGVkIGZvciB1c2UgaW4gRGVsZXRlU2VjdGlvbi4KCj1jdXQKCnN1YiBSZW1vdmVHcm91cE1lbWJlciB7CglteSAkc2VsZiA9IHNoaWZ0OwoJbXkgJHNlY3QgPSBzaGlmdDsKCQoJcmV0dXJuIHVuZGVmIGlmIG5vdCBkZWZpbmVkICRzZWN0OwoJCglyZXR1cm4oMSkgdW5sZXNzICRzZWN0ID1+IC9eKFxTKylccytcUysvOwoJCglteSAkZ3JvdXAgPSAkMTsKCXJldHVybiB1bmxlc3MgZXhpc3RzICRzZWxmLT57Z3JvdXB9eyRncm91cH07CglAeyRzZWxmLT57Z3JvdXB9eyRncm91cH19ID0gZ3JlcCB7IS9eXFEkc2VjdFxFJC99IEB7JHNlbGYtPntncm91cH17JGdyb3VwfX07Cn0KCj1oZWFkMiBHcm91cE1lbWJlcnMgKCRncm91cCkKClJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbWVtYmVycyBvZiBzcGVjaWZpZWQgJGdyb3VwLiBFYWNoIGVsZW1lbnQKb2YgdGhlIGFycmF5IGlzIGEgc2VjdGlvbiBuYW1lLiBGb3IgZXhhbXBsZSwgZ2l2ZW4gdGhlIHNlY3Rpb25zCgogIFtHcm91cCBFbGVtZW50IDFdCiAgLi4uCgogIFtHcm91cCBFbGVtZW50IDJdCiAgLi4uCgpHcm91cE1lbWJlcnMgd291bGQgcmV0dXJuICgiR3JvdXAgRWxlbWVudCAxIiwgIkdyb3VwIEVsZW1lbnQgMiIpLgoKPWN1dAoKc3ViIEdyb3VwTWVtYmVycyB7CiAgbXkgJHNlbGYgID0gc2hpZnQ7CiAgbXkgJGdyb3VwID0gc2hpZnQ7CiAgCiAgcmV0dXJuIHVuZGVmIGlmIG5vdCBkZWZpbmVkICRncm91cDsKICAKICBpZiAoJHNlbGYtPntub2Nhc2V9KSB7CiAgCSRncm91cCA9IGxjKCRncm91cCk7CiAgfQogIAogIHJldHVybiBAeyRzZWxmLT57Z3JvdXB9eyRncm91cH19IGlmIHJlZiAkc2VsZi0+e2dyb3VwfXskZ3JvdXB9IGVxICdBUlJBWSc7CiAgcmV0dXJuICgpOwp9Cgo9aGVhZDIgU2V0V3JpdGVNb2RlICgkbW9kZSkKClNldHMgdGhlIG1vZGUgKHBlcm1pc3Npb25zKSB0byB1c2Ugd2hlbiB3cml0aW5nIHRoZSBJTkkgZmlsZS4KCiRtb2RlIG11c3QgYmUgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG9jdGFsIG1vZGUuCgo9Y3V0CgpzdWIgU2V0V3JpdGVNb2RlCnsKCW15ICRzZWxmID0gc2hpZnQ7CglteSAkbW9kZSA9IHNoaWZ0OwoJcmV0dXJuIHVuZGVmIGlmIG5vdCBkZWZpbmVkICgkbW9kZSk7CglyZXR1cm4gdW5kZWYgaWYgbm90ICgkbW9kZSA9fiBtL1swLTddezMsM30vKTsKCSRzZWxmLT57ZmlsZV9tb2RlfSA9ICRtb2RlOwoJcmV0dXJuICRtb2RlOwp9Cgo9aGVhZDIgR2V0V3JpdGVNb2RlICgkbW9kZSkKCkdldHMgdGhlIGN1cnJlbnQgbW9kZSAocGVybWlzc2lvbnMpIHRvIHVzZSB3aGVuIHdyaXRpbmcgdGhlIElOSSBmaWxlLgoKJG1vZGUgaXMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG9jdGFsIG1vZGUuCgo9Y3V0CgpzdWIgR2V0V3JpdGVNb2RlCnsKCW15ICRzZWxmID0gc2hpZnQ7CglyZXR1cm4gdW5kZWYgaWYgbm90IGV4aXN0cyAkc2VsZi0+e2ZpbGVfbW9kZX07CglyZXR1cm4gJHNlbGYtPntmaWxlX21vZGV9Owp9Cgo9aGVhZDIgV3JpdGVDb25maWcgKCRmaWxlbmFtZSkKCldyaXRlcyBvdXQgYSBuZXcgY29weSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLiAgQSB0ZW1wb3JhcnkgZmlsZQooZW5kaW5nIGluICctbmV3JykgaXMgd3JpdHRlbiBvdXQgYW5kIHRoZW4gcmVuYW1lZCB0byB0aGUgc3BlY2lmaWVkCmZpbGVuYW1lLiAgQWxzbyBzZWUgQjxCVUdTPiBiZWxvdy4KClJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBDPHVuZGVmPiBvbiBmYWlsdXJlLgoKPWN1dAoKc3ViIFdyaXRlQ29uZmlnIHsKICBteSAkc2VsZiA9IHNoaWZ0OwogIG15ICRmaWxlID0gc2hpZnQ7CiAgCiAgcmV0dXJuIHVuZGVmIHVubGVzcyBkZWZpbmVkICRmaWxlOwogIAogICMgSWYgd2UgYXJlIHVzaW5nIGEgZmlsZW5hbWUsIHRoZW4gZG8gbW9kZSBjaGVja3MgYW5kIHdyaXRlIHRvIGEgCiAgIyB0ZW1wb3JhcnkgZmlsZSB0byBhdm9pZCBhIHJhY2UgY29uZGl0aW9uCiAgaWYoICFyZWYoJGZpbGUpICkgewogICAgaWYgKC1lICRmaWxlKSB7CiAgICAgICAgICBpZiAobm90ICgtdyAkZmlsZSkpCiAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICNjYXJwICJGaWxlICRmaWxlIGlzIG5vdCB3cml0YWJsZS4gIFJlZnVzaW5nIHRvIHdyaXRlIGNvbmZpZyI7CiAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZjsKICAgICAgICAgIH0KICAgICAgICAgIG15ICRtb2RlID0gKHN0YXQgJGZpbGUpWzJdOwogICAgICAgICAgJHNlbGYtPntmaWxlX21vZGV9ID0gc3ByaW50ZiAiJTA0byIsICgkbW9kZSAmIDA3NzcpOwogICAgICAgICAgI2NhcnAgIlVzaW5nIG1vZGUgJHNlbGYtPntmaWxlX21vZGV9IGZvciBmaWxlICRmaWxlIjsKICAgIH0gZWxzaWYgKGRlZmluZWQoJHNlbGYtPntmaWxlX21vZGV9KSBhbmQgbm90IChvY3QoJHNlbGYtPntmaWxlX21vZGV9KSAmIDAyMjIpKSB7CiAgICAgICAgICAjY2FycCAiU3RvcmUgbW9kZSAkc2VsZi0+e2ZpbGVfbW9kZX0gcHJvaGliaXRzIHdyaXRpbmcgY29uZmlnIjsKICAgIH0KICAKICAgIG15ICRuZXdfZmlsZSA9ICRmaWxlIC4gIi1uZXciOwogICAgbG9jYWwoKkYpOwogICAgb3BlbihGLCAiPiAkbmV3X2ZpbGUiKSB8fCBkbyB7CiAgICAgIGNhcnAgIlVuYWJsZSB0byB3cml0ZSB0ZW1wIGNvbmZpZyBmaWxlICRuZXdfZmlsZTogJCEiOwogICAgICByZXR1cm4gdW5kZWY7CiAgICB9OwogICAgbXkgJG9sZGZoID0gc2VsZWN0KEYpOwogICAgJHNlbGYtPk91dHB1dENvbmZpZzsKICAgIGNsb3NlKEYpOwogICAgc2VsZWN0KCRvbGRmaCk7CiAgICByZW5hbWUoICRuZXdfZmlsZSwgJGZpbGUgKSB8fCBkbyB7CiAgICAgIGNhcnAgIlVuYWJsZSB0byByZW5hbWUgdGVtcCBjb25maWcgZmlsZSAoJG5ld19maWxlKSB0byAkZmlsZTogJCEiOwogICAgICByZXR1cm4gdW5kZWY7CiAgICB9OwogICAgaWYgKGV4aXN0cyAkc2VsZi0+e2ZpbGVfbW9kZX0pIHsKICAgICAgY2htb2Qgb2N0KCRzZWxmLT57ZmlsZV9tb2RlfSksICRmaWxlOwogICAgfQogIAogIH0gIyBPdGhlcndpc2UsIHJlc2V0IHRvIHRoZSBzdGFydCBvZiB0aGUgZmlsZSBhbmQgd3JpdGUsIHVubGVzcyB3ZSBhcmUgdXNpbmcgU1RESU4KICBlbHNlIHsKICAgICMgR2V0IGEgZmlsZWhhbmRsZSwgYWxsb3dpbmcgYWxtb3N0IGFueSB0eXBlIG9mICdmaWxlJyBwYXJhbWV0ZXIKICAgICMjIE5COiBJZiB0aGlzIHdlcmUgYSBmaWxlbmFtZSwgdGhpcyB3b3VsZCBmYWlsIGJlY2F1c2UgX21ha2VfZmlsZSAKICAgICMjICAgICBvcGVucyBhIHJlYWQtb25seSBoYW5kbGUsIGJ1dCB3ZSBoYXZlIGFscmVhZHkgY2hlY2tlZCB0aGF0IGNhc2UKICAgICMjICAgICBzbyByZS11c2luZyB0aGUgbG9naWMgaXMgb2sgW0pXL1dBREddCiAgICBteSAkZmggPSAkc2VsZi0+X21ha2VfZmlsZWhhbmRsZSggJGZpbGUgKTsKICAgIGlmICghJGZoKSB7CiAgICAgIGNhcnAgIkNvdWxkIG5vdCBmaW5kIGEgZmlsZWhhbmRsZSBmb3IgdGhlIGlucHV0IHN0cmVhbSAoJGZpbGUpOiAkISI7CiAgICAgIHJldHVybiB1bmRlZjsKICAgIH0KICAgIAogICAgCiAgICAjIE9ubHkgcm9sbCBiYWNrIGlmIGl0J3Mgbm90IFNURElOIChpZiBpdCBpcywgQ2FycCkKICAgIGlmKCAkZmggPT0gMCApIHsKICAgICAgY2FycCAiQ2Fubm90IHdyaXRlIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBTVERJTi4iOwogICAgfSBlbHNlIHsKICAgICAgc2VlayggJGZoLCAwLCAwICk7CiAgICAgIG15ICRvbGRmaCA9IHNlbGVjdCgkZmgpOwogICAgICAkc2VsZi0+T3V0cHV0Q29uZmlnOwogICAgICBzZWVrKCAkZmgsIDAsIDAgKTsKICAgICAgc2VsZWN0KCRvbGRmaCk7CiAgICB9ICMgZW5kIGlmCgogIH0gIyBlbmQgaWYgKGZpbGVoYW5kbGUvbmFtZSkKICAKICByZXR1cm4gMTsKICAKfQoKPWhlYWQyIFJld3JpdGVDb25maWcKClNhbWUgYXMgV3JpdGVDb25maWcsIGJ1dCBzcGVjaWZpZXMgdGhhdCB0aGUgb3JpZ2luYWwgY29uZmlndXJhdGlvbgpmaWxlIHNob3VsZCBiZSByZXdyaXR0ZW4uCgo9Y3V0CgpzdWIgUmV3cml0ZUNvbmZpZyB7CiAgbXkgJHNlbGYgPSBzaGlmdDsKICAKICByZXR1cm4gdW5kZWYgaWYgKAogICAgKG5vdCBleGlzdHMgJHNlbGYtPntjZn0pIG9yCiAgICAobm90IGRlZmluZWQgJHNlbGYtPntjZn0pIG9yCiAgICAoJHNlbGYtPntjZn0gZXEgJycpCiAgKTsKICAKICAjIFJldHVybiB3aGF0ZXZlciBXcml0ZUNvbmZpZyByZXR1cm5zIDopCiAgJHNlbGYtPldyaXRlQ29uZmlnKCRzZWxmLT57Y2Z9KTsKfQoKPWhlYWQyIEdldEZpbGVOYW1lCgpSZXR1cm5zIHRoZSBmaWxlbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBJTkkgZmlsZS4KCklmIG5vIGZpbGVuYW1lIGhhcyBiZWVuIHNwZWNpZmllZCwgcmV0dXJucyB1bmRlZi4KCj1jdXQKCnN1YiBHZXRGaWxlTmFtZQp7CglteSAkc2VsZiA9IHNoaWZ0OwoJbXkgJGZpbGVuYW1lOwoJaWYgKGV4aXN0cyAkc2VsZi0+e2NmfSkgewoJCSRmaWxlbmFtZSA9ICRzZWxmLT57Y2Z9OwoJfSBlbHNlIHsKCQl1bmRlZiAkZmlsZW5hbWU7Cgl9CglyZXR1cm4gJGZpbGVuYW1lOwp9Cgo9aGVhZDIgU2V0RmlsZU5hbWUgKCRmaWxlbmFtZSkKCklmIHlvdSBjcmVhdGVkIHRoZSBDb25maWc6OkluaUZpbGVzIG9iamVjdCB3aXRob3V0IGluaXRpYWxpc2luZyBmcm9tCmEgZmlsZSwgb3IgaWYgeW91IGp1c3Qgd2FudCB0byBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gdXNlIGZvcgpSZWFkQ29uZmlnL1Jld3JpdGVDb25maWcgZnJvbSBub3cgb24sIHVzZSB0aGlzIG1ldGhvZC4KClJldHVybnMgJGZpbGVuYW1lIGlmIHRoYXQgd2FzIGEgdmFsaWQgbmFtZSwgdW5kZWYgb3RoZXJ3aXNlLgoKPWN1dAoKc3ViIFNldEZpbGVOYW1lIHsKICBteSAkc2VsZiA9IHNoaWZ0OwogIG15ICRuZXdmaWxlID0gc2hpZnQ7CiAgCiAgcmV0dXJuIHVuZGVmIGlmIG5vdCBkZWZpbmVkICRuZXdmaWxlOwogIAogIGlmICgkbmV3ZmlsZSBuZSAiIikgewogICAgJHNlbGYtPntjZn0gPSAkbmV3ZmlsZTsKICAgIHJldHVybiAkc2VsZi0+e2NmfTsKICB9CiAgcmV0dXJuIHVuZGVmOwp9CgojIE91dHB1dENvbmZpZwojCiMgV3JpdGVzIE91dHB1dENvbmZpZyB0byBTVERPVVQuIFVzZSBzZWxlY3QoKSB0byByZWRpcmVjdCBTVERPVVQgdG8KIyB0aGUgb3V0cHV0IHRhcmdldCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uCgpzdWIgT3V0cHV0Q29uZmlnIHsKICBteSAkc2VsZiA9IHNoaWZ0OwoKICBteSgkc2VjdCwgJHBhcm0sIEBjbXRzKTsKICBteSAkb3JzID0gJHNlbGYtPntsaW5lX2VuZHN9IHx8ICRcIHx8ICJcbiI7CQkjICRcIGlzIG5vcm1hbGx5IHVuc2V0LCBidXQgdXNlIGlucHV0IGJ5IGRlZmF1bHQKICBteSAkbm90Zmlyc3QgPSAwOwogIGxvY2FsICRfOwogIGZvcmVhY2ggJHNlY3QgKEB7JHNlbGYtPntzZWN0c319KSB7CiAgICBuZXh0IHVubGVzcyBkZWZpbmVkICRzZWxmLT57dn17JHNlY3R9OwogICAgcHJpbnQgJG9ycyBpZiAkbm90Zmlyc3Q7CiAgICAkbm90Zmlyc3QgPSAxOwogICAgaWYgKChyZWYoJHNlbGYtPntzQ01UfXskc2VjdH0pIGVxICdBUlJBWScpICYmCgkoQGNtdHMgPSBAeyRzZWxmLT57c0NNVH17JHNlY3R9fSkpIHsKICAgICAgZm9yZWFjaCAoQGNtdHMpIHsKCXByaW50ICIkXyRvcnMiOwogICAgICB9CiAgICB9CiAgICBwcmludCAiWyRzZWN0XSRvcnMiOwogICAgbmV4dCB1bmxlc3MgcmVmICRzZWxmLT57dn17JHNlY3R9IGVxICdIQVNIJzsKCiAgICBmb3JlYWNoICRwYXJtIChAeyRzZWxmLT57cGFybXN9eyRzZWN0fX0pIHsKICAgICAgaWYgKChyZWYoJHNlbGYtPntwQ01UfXskc2VjdH17JHBhcm19KSBlcSAnQVJSQVknKSAmJgoJICAoQGNtdHMgPSBAeyRzZWxmLT57cENNVH17JHNlY3R9eyRwYXJtfX0pKSB7Cglmb3JlYWNoIChAY210cykgewoJICBwcmludCAiJF8kb3JzIjsKCX0KICAgICAgfQoKICAgICAgbXkgJHZhbCA9ICRzZWxmLT57dn17JHNlY3R9eyRwYXJtfTsKICAgICAgbmV4dCBpZiAhIGRlZmluZWQgKCR2YWwpOwkjIE5vIHBhcmFtZXRlciBleGlzdHMgISEKICAgICAgaWYgKHJlZigkdmFsKSBlcSAnQVJSQVknKSB7CiAgICAgICAgbXkgJGVvdG1hcmsgPSAkc2VsZi0+e0VPVH17JHNlY3R9eyRwYXJtfSB8fCAnRU9UJzsKCXByaW50ICIkcGFybT0gPDwkZW90bWFyayRvcnMiOwoJZm9yZWFjaCAoQHskdmFsfSkgewoJICBwcmludCAiJF8kb3JzIjsKCX0KCXByaW50ICIkZW90bWFyayRvcnMiOwogICAgICB9IGVsc2lmKCAkdmFsID1+IC9bJG9yc10vICkgewogICAgICAgICMgVGhlIEZFVENIIG9mIGEgdGllZCBoYXNoIGlzIG5ldmVyIGNhbGxlZCBpbiAKICAgICAgICAjIGFuIGFycmF5IGNvbnRleHQsIHNvIGdlbmVyYXRlIGEgRU9UIG11bHRpbGluZQogICAgICAgICMgZW50cnkgaWYgdGhlIGVudHJ5IGxvb2tzIHRvIGJlIG11bHRpbGluZQogICAgICAgIG15IEB2YWwgPSBzcGxpdCAvWyRvcnNdLywgJHZhbDsKICAgICAgICBpZiggQHZhbCA+IDEgKSB7CiAgICAgICAgICBteSAkZW90bWFyayA9ICRzZWxmLT57RU9UfXskc2VjdH17JHBhcm19IHx8ICdFT1QnOwogICAgICAgICAgcHJpbnQgIiRwYXJtPSA8PCRlb3RtYXJrJG9ycyI7CiAgICAgICAgICBwcmludCBtYXAgIiRfJG9ycyIsIEB2YWw7CiAgICAgICAgICBwcmludCAiJGVvdG1hcmskb3JzIjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgIHByaW50ICIkcGFybT0kdmFsWzBdJG9ycyI7CiAgICAgICAgfSAjIGVuZCBpZgogICAgICB9IGVsc2UgewogICAgICAgIHByaW50ICIkcGFybT0kdmFsJG9ycyI7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBTZXRTZWN0aW9uQ29tbWVudCgkc2VjdGlvbiwgQGNvbW1lbnQpCgpTZXRzIHRoZSBjb21tZW50IGZvciBzZWN0aW9uICRzZWN0aW9uIHRvIHRoZSBsaW5lcyBjb250YWluZWQgaW4gQGNvbW1lbnQuCgpFYWNoIGNvbW1lbnQgbGluZSB3aWxsIGJlIHByZXBlbmRlZCB3aXRoIHRoZSBjb21tZW50IGNoYXJjdGVyIChkZWZhdWx0CmlzIEM8Iz4pIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBoYXZlIGEgY29tbWVudCBjaGFyYWN0ZXIgKGllOiBpZiB0aGUKbGluZSBkb2VzIG5vdCBzdGFydCB3aXRoIHdoaXRlc3BhY2UgZm9sbG93ZWQgYnkgYW4gYWxsb3dlZCBjb21tZW50CmNoYXJhY3RlciwgZGVmYXVsdCBpcyBDPCM+IGFuZCBDPDs+KS4KClRvIGNsZWFyIGEgc2VjdGlvbiBjb21tZW50LCB1c2UgRGVsZXRlU2VjdGlvbkNvbW1lbnQgKCRzZWN0aW9uKQoKPWN1dAoKc3ViIFNldFNlY3Rpb25Db21tZW50CnsKCW15ICRzZWxmID0gc2hpZnQ7CglteSAkc2VjdCA9IHNoaWZ0OwoJbXkgQGNvbW1lbnQgPSBAXzsKCglyZXR1cm4gdW5kZWYgaWYgbm90IGRlZmluZWQgJHNlY3Q7CglyZXR1cm4gdW5kZWYgdW5sZXNzIEBjb21tZW50OwoJCglpZiAoJHNlbGYtPntub2Nhc2V9KSB7CgkJJHNlY3QgPSBsYygkc2VjdCk7Cgl9CgkKCSRzZWxmLT57c0NNVH17JHNlY3R9ID0gW107CgkjIEF0IHRoaXMgcG9pbnQgaXQncyBwb3NzaWJsZSB0byBoYXZlIGEgY29tbWVudCBmb3IgYSBzZWN0aW9uIHRoYXQKCSMgZG9lc24ndCBleGlzdC4gVGhpcyBjb21tZW50IHdpbGwgbm90IGdldCB3cml0dGVuIHRvIHRoZSBJTkkgZmlsZS4KCQoJcHVzaCBAeyRzZWxmLT57c0NNVH17JHNlY3R9fSwgJHNlbGYtPl9tYXJrdXBfY29tbWVudHMoQGNvbW1lbnQpOwoJcmV0dXJuIHNjYWxhciBAY29tbWVudDsKfQoKCgojIHRoaXMgaGVscGVyIG1ha2VzIHN1cmUgdGhhdCBlYWNoIGxpbmUgaXMgcHJlY2VkZWQgd2l0aCB0aGUgY29ycmVjdCBjb21tZW50CiMgY2hhcmFjdGVyCnN1YiBfbWFya3VwX2NvbW1lbnRzIAp7CiAgbXkgJHNlbGYgPSBzaGlmdDsKICBteSBAY29tbWVudCA9IEBfOwoKICBteSAkYWxsQ210ID0gJHNlbGYtPnthbGxvd2VkX2NvbW1lbnRfY2hhcn07CiAgbXkgJGNtdENociA9ICRzZWxmLT57Y29tbWVudF9jaGFyfTsKICBmb3JlYWNoIChAY29tbWVudCkgewogICAgbS9eXHMqWyRhbGxDbXRdLyBvciAoJF8gPSAiJGNtdENociAkXyIpOwogIH0KICBAY29tbWVudDsKfQoKCgo9aGVhZDIgR2V0U2VjdGlvbkNvbW1lbnQgKCRzZWN0aW9uKQoKUmV0dXJucyBhIGxpc3Qgb2YgbGluZXMsIGJlaW5nIHRoZSBjb21tZW50IGF0dGFjaGVkIHRvIHNlY3Rpb24gJHNlY3Rpb24uIEluIApzY2FsYXIgY29udGV4dCwgcmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBsaW5lcyBvZiB0aGUgY29tbWVudCBzZXBhcmF0ZWQKYnkgbmV3bGluZXMuCgpUaGUgbGluZXMgYXJlIHByZXNlbnRlZCBhcy1pcywgd2l0aCB3aGF0ZXZlciBjb21tZW50IGNoYXJhY3RlciB3YXMgb3JpZ2luYWxseQp1c2VkIG9uIHRoYXQgbGluZS4KCj1jdXQKCnN1YiBHZXRTZWN0aW9uQ29tbWVudAp7CglteSAkc2VsZiA9IHNoaWZ0OwoJbXkgJHNlY3QgPSBzaGlmdDsKCglyZXR1cm4gdW5kZWYgaWYgbm90IGRlZmluZWQgJHNlY3Q7CgkKCWlmICgkc2VsZi0+e25vY2FzZX0pIHsKCQkkc2VjdCA9IGxjKCRzZWN0KTsKCX0KCQoJaWYgKGV4aXN0cyAkc2VsZi0+e3NDTVR9eyRzZWN0fSkgewoJCXJldHVybiBAeyRzZWxmLT57c0NNVH17JHNlY3R9fTsKCX0gZWxzZSB7CgkJcmV0dXJuIHVuZGVmOwoJfQp9Cgo9aGVhZDIgRGVsZXRlU2VjdGlvbkNvbW1lbnQgKCRzZWN0aW9uKQoKUmVtb3ZlcyB0aGUgY29tbWVudCBmb3IgdGhlIHNwZWNpZmllZCBzZWN0aW9uLgoKPWN1dAoKc3ViIERlbGV0ZVNlY3Rpb25Db21tZW50CnsKCW15ICRzZWxmID0gc2hpZnQ7CglteSAkc2VjdCA9IHNoaWZ0OwoJCglyZXR1cm4gdW5kZWYgaWYgbm90IGRlZmluZWQgJHNlY3Q7CgkKCWlmICgkc2VsZi0+e25vY2FzZX0pIHsKCQkkc2VjdCA9IGxjKCRzZWN0KTsKCX0KCQoJZGVsZXRlICRzZWxmLT57c0NNVH17JHNlY3R9Owp9Cgo9aGVhZDIgU2V0UGFyYW1ldGVyQ29tbWVudCAoJHNlY3Rpb24sICRwYXJhbWV0ZXIsIEBjb21tZW50KQoKU2V0cyB0aGUgY29tbWVudCBhdHRhY2hlZCB0byBhIHBhcnRpY3VsYXIgcGFyYW1ldGVyLgoKQW55IGxpbmUgb2YgQGNvbW1lbnQgdGhhdCBkb2VzIG5vdCBoYXZlIGEgY29tbWVudCBjaGFyYWN0ZXIgd2lsbCBiZQpwcmVwZW5kZWQgd2l0aCBvbmUuIFNlZSBMPC9TZXRTZWN0aW9uQ29tbWVudCgkc2VjdGlvbiwgQGNvbW1lbnQpPiBhYm92ZQoKPWN1dAoKc3ViIFNldFBhcmFtZXRlckNvbW1lbnQKewoJbXkgJHNlbGYgPSBzaGlmdDsKCW15ICRzZWN0ID0gc2hpZnQ7CglteSAkcGFybSA9IHNoaWZ0OwoJbXkgQGNvbW1lbnQgPSBAXzsKCglkZWZpbmVkKCRzZWN0KSB8fCByZXR1cm4gdW5kZWY7CglkZWZpbmVkKCRwYXJtKSB8fCByZXR1cm4gdW5kZWY7CglAY29tbWVudCB8fCByZXR1cm4gdW5kZWY7CgkKCWlmICgkc2VsZi0+e25vY2FzZX0pIHsKCQkkc2VjdCA9IGxjKCRzZWN0KTsKCQkkcGFybSA9IGxjKCRwYXJtKTsKCX0KCQoJaWYgKG5vdCBleGlzdHMgJHNlbGYtPntwQ01UfXskc2VjdH0pIHsKCQkkc2VsZi0+e3BDTVR9eyRzZWN0fSA9IHt9OwoJfQoJCgkkc2VsZi0+e3BDTVR9eyRzZWN0fXskcGFybX0gPSBbXTsKCSMgTm90ZSB0aGF0IGF0IHRoaXMgcG9pbnQsIGl0J3MgcG9zc2libGUgdG8gaGF2ZSBhIGNvbW1lbnQgZm9yIGEgcGFyYW1ldGVyLAoJIyB3aXRob3V0IHRoYXQgcGFyYW1ldGVyIGFjdHVhbGx5IGV4aXN0aW5nIGluIHRoZSBJTkkgZmlsZS4KCXB1c2ggQHskc2VsZi0+e3BDTVR9eyRzZWN0fXskcGFybX19LCAkc2VsZi0+X21hcmt1cF9jb21tZW50cyhAY29tbWVudCk7CglyZXR1cm4gc2NhbGFyIEBjb21tZW50Owp9Cgo9aGVhZDIgR2V0UGFyYW1ldGVyQ29tbWVudCAoJHNlY3Rpb24sICRwYXJhbWV0ZXIpCgpHZXRzIHRoZSBjb21tZW50IGF0dGFjaGVkIHRvIGEgcGFyYW1ldGVyLgoKPWN1dAoKc3ViIEdldFBhcmFtZXRlckNvbW1lbnQKewoJbXkgJHNlbGYgPSBzaGlmdDsKCW15ICRzZWN0ID0gc2hpZnQ7CglteSAkcGFybSA9IHNoaWZ0OwoJCglkZWZpbmVkKCRzZWN0KSB8fCByZXR1cm4gdW5kZWY7CglkZWZpbmVkKCRwYXJtKSB8fCByZXR1cm4gdW5kZWY7CgkKCWlmICgkc2VsZi0+e25vY2FzZX0pIHsKCQkkc2VjdCA9IGxjKCRzZWN0KTsKCQkkcGFybSA9IGxjKCRwYXJtKTsKCX07CgkKCWV4aXN0cygkc2VsZi0+e3BDTVR9eyRzZWN0fSkgfHwgcmV0dXJuIHVuZGVmOwoJZXhpc3RzKCRzZWxmLT57cENNVH17JHNlY3R9eyRwYXJtfSkgfHwgcmV0dXJuIHVuZGVmOwoJCglteSBAY29tbWVudCA9IEB7JHNlbGYtPntwQ01UfXskc2VjdH17JHBhcm19fTsKCXJldHVybiAod2FudGFycmF5KT9AY29tbWVudDpqb2luICIgIiwgQGNvbW1lbnQ7Cn0KCj1oZWFkMiBEZWxldGVQYXJhbWV0ZXJDb21tZW50ICgkc2VjdGlvbiwgJHBhcm1ldGVyKQoKRGVsZXRlcyB0aGUgY29tbWVudCBhdHRhY2hlZCB0byBhIHBhcmFtZXRlci4KCj1jdXQKCnN1YiBEZWxldGVQYXJhbWV0ZXJDb21tZW50CnsKCW15ICRzZWxmID0gc2hpZnQ7CglteSAkc2VjdCA9IHNoaWZ0OwoJbXkgJHBhcm0gPSBzaGlmdDsKCQoJZGVmaW5lZCgkc2VjdCkgfHwgcmV0dXJuIHVuZGVmOwoJZGVmaW5lZCgkcGFybSkgfHwgcmV0dXJuIHVuZGVmOwoJCglpZiAoJHNlbGYtPntub2Nhc2V9KSB7CgkJJHNlY3QgPSBsYygkc2VjdCk7CgkJJHBhcm0gPSBsYygkcGFybSk7Cgl9OwoJCgkjIElmIHRoZSBwYXJhbWV0ZXIgZG9lc24ndCBleGlzdCwgb3VyIGdvYWwgaGFzIGFscmVhZHkgYmVlbiBhY2hpZXZlZAoJZXhpc3RzKCRzZWxmLT57cENNVH17JHNlY3R9KSB8fCByZXR1cm4gMTsKCWV4aXN0cygkc2VsZi0+e3BDTVR9eyRzZWN0fXskcGFybX0pIHx8IHJldHVybiAxOwoJCglkZWxldGUgJHNlbGYtPntwQ01UfXskc2VjdH17JHBhcm19OwoJcmV0dXJuIDE7Cn0KCj1oZWFkMiBHZXRQYXJhbWV0ZXJFT1QgKCRzZWN0aW9uLCAkcGFyYW1ldGVyKQoKQWNjZXNzb3IgbWV0aG9kIGZvciB0aGUgRU9UIHRleHQgKGluIGZhY3QsIHN0eWxlKSBvZiB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlci4gSWYgYW55IHRleHQgaXMgdXNlZCBhcyBhbiBFT1QgbWFyaywgdGhpcyB3aWxsIGJlIHJldHVybmVkLiBJZiB0aGUgcGFyYW1ldGVyIHdhcyBub3QgcmVjb3JkZWQgdXNpbmcgSEVSRSBzdHlsZSBtdWx0aXBsZSBsaW5lcywgR2V0UGFyYW1ldGVyRU9UIHJldHVybnMgdW5kZWYuCgo9Y3V0CgpzdWIgR2V0UGFyYW1ldGVyRU9UCnsKCW15ICRzZWxmID0gc2hpZnQ7CglteSAkc2VjdCA9IHNoaWZ0OwoJbXkgJHBhcm0gPSBzaGlmdDsKCglkZWZpbmVkKCRzZWN0KSB8fCByZXR1cm4gdW5kZWY7CglkZWZpbmVkKCRwYXJtKSB8fCByZXR1cm4gdW5kZWY7CgkKCWlmICgkc2VsZi0+e25vY2FzZX0pIHsKCQkkc2VjdCA9IGxjKCRzZWN0KTsKCQkkcGFybSA9IGxjKCRwYXJtKTsKCX07CgoJaWYgKG5vdCBleGlzdHMgJHNlbGYtPntFT1R9eyRzZWN0fSkgewoJCSRzZWxmLT57RU9UfXskc2VjdH0gPSB7fTsKCX0KCglpZiAobm90IGV4aXN0cyAkc2VsZi0+e0VPVH17JHNlY3R9eyRwYXJtfSkgewoJCXJldHVybiB1bmRlZjsKCX0KCXJldHVybiAkc2VsZi0+e0VPVH17JHNlY3R9eyRwYXJtfTsKfQoKPWhlYWQyIFNldFBhcmFtZXRlckVPVCAoJHNlY3Rpb24sICRFT1QpCgpBY2Nlc3NvciBtZXRob2QgZm9yIHRoZSBFT1QgdGV4dCBmb3IgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIuIFNldHMgdGhlIEhFUkUgc3R5bGUgbWFya2VyIHRleHQgdG8gdGhlIHZhbHVlICRFT1QuIE9uY2UgdGhlIEVPVCB0ZXh0IGlzIHNldCwgdGhhdCBwYXJhbWV0ZXIgd2lsbCBiZSBzYXZlZCBpbiBIRVJFIHN0eWxlLgoKVG8gdW4tc2V0IHRoZSBFT1QgdGV4dCwgdXNlIERlbGV0ZVBhcmFtZXRlckVPVCAoJHNlY3Rpb24sICRwYXJhbWV0ZXIpLgoKPWN1dAoKc3ViIFNldFBhcmFtZXRlckVPVAp7CglteSAkc2VsZiA9IHNoaWZ0OwoJbXkgJHNlY3QgPSBzaGlmdDsKCW15ICRwYXJtID0gc2hpZnQ7CglteSAkRU9UID0gc2hpZnQ7CgoJZGVmaW5lZCgkc2VjdCkgfHwgcmV0dXJuIHVuZGVmOwoJZGVmaW5lZCgkcGFybSkgfHwgcmV0dXJuIHVuZGVmOwoJZGVmaW5lZCgkRU9UKSB8fCByZXR1cm4gdW5kZWY7CgkKCWlmICgkc2VsZi0+e25vY2FzZX0pIHsKCQkkc2VjdCA9IGxjKCRzZWN0KTsKCQkkcGFybSA9IGxjKCRwYXJtKTsKCX07CgogICAgaWYgKG5vdCBleGlzdHMgJHNlbGYtPntFT1R9eyRzZWN0fSkgewogICAgICAgICRzZWxmLT57RU9UfXskc2VjdH0gPSB7fTsKICAgIH0KCiAgICAkc2VsZi0+e0VPVH17JHNlY3R9eyRwYXJtfSA9ICRFT1Q7Cn0KCj1oZWFkMiBEZWxldGVQYXJhbWV0ZXJFT1QgKCRzZWN0aW9uLCAkcGFybWV0ZXIpCgpSZW1vdmVzIHRoZSBFT1QgbWFya2VyIGZvciB0aGUgZ2l2ZW4gc2VjdGlvbiBhbmQgcGFyYW1ldGVyLgpXaGVuIHdyaXRpbmcgYSBjb25maWd1cmF0aW9uIGZpbGUsIGlmIG5vIEVPVCBtYXJrZXIgaXMgZGVmaW5lZCAKdGhlbiAiRU9UIiBpcyB1c2VkLgoKPWN1dAoKc3ViIERlbGV0ZVBhcmFtZXRlckVPVAp7CglteSAkc2VsZiA9IHNoaWZ0OwoJbXkgJHNlY3QgPSBzaGlmdDsKCW15ICRwYXJtID0gc2hpZnQ7CgkKCWRlZmluZWQoJHNlY3QpIHx8IHJldHVybiB1bmRlZjsKCWRlZmluZWQoJHBhcm0pIHx8IHJldHVybiB1bmRlZjsKCQoJaWYgKCRzZWxmLT57bm9jYXNlfSkgewoJCSRzZWN0ID0gbGMoJHNlY3QpOwoJCSRwYXJtID0gbGMoJHBhcm0pOwoJfQoKCWRlbGV0ZSAkc2VsZi0+e0VPVH17JHNlY3R9eyRwYXJtfTsKfQoKCj1oZWFkMiBEZWxldGUKCkRlbGV0ZXMgdGhlIGVudGlyZSBjb25maWd1cmF0aW9uIGZpbGUgaW4gbWVtb3J5LgoKPWN1dAoKc3ViIERlbGV0ZSB7CglteSAkc2VsZiA9IHNoaWZ0OwoKCSMgQWdhaW4sIGRvbmUgdGhlIGZhc3Qgd2F5LCBpZiB0aGUgZGF0YSBzdHJ1Y3R1cmUgY2hhbmdlcywgY2hhbmdlIHRoaXMhCgkkc2VsZi0+e3NlY3RzfSAgPSBbXTsKCSRzZWxmLT57cGFybXN9ICA9IHt9OwoJJHNlbGYtPntncm91cH0gID0ge307Cgkkc2VsZi0+e3Z9ICAgICAgPSB7fTsKCSRzZWxmLT57c0NNVH0gICA9IHt9OwoJJHNlbGYtPntwQ01UfSAgID0ge307Cgkkc2VsZi0+e0VPVH0gICAgPSB7fTsKCglyZXR1cm4gMTsKfSAjIGVuZCBEZWxldGUKCgoKPWhlYWQxIFVTQUdFIC0tIFRpZWQgSGFzaAoKPWhlYWQyIHRpZSAlaW5pLCAnQ29uZmlnOjpJbmlGaWxlcycsICgtZmlsZT0+JGZpbGVuYW1lLCBbLW9wdGlvbj0+dmFsdWUgLi4uXSApCgpVc2luZyBDPHRpZT4sIHlvdSBjYW4gdGllIGEgaGFzaCB0byBhIEI8Q29uZmlnOjpJbmlGaWxlcz4gb2JqZWN0LiBUaGlzIGNyZWF0ZXMgYSBuZXcKb2JqZWN0IHdoaWNoIHlvdSBjYW4gYWNjZXNzIHRocm91Z2ggeW91ciBoYXNoLCBzbyB5b3UgdXNlIHRoaXMgaW5zdGVhZCBvZiB0aGUgCkI8bmV3PiBtZXRob2QuIFRoaXMgYWN0dWFsbHkgY3JlYXRlcyBhIGhhc2ggb2YgaGFzaGVzIHRvIGFjY2VzcyB0aGUgdmFsdWVzIGluIAp0aGUgSU5JIGZpbGUuIFRoZSBvcHRpb25zIHlvdSBwcm92aWRlIHRocm91Z2ggQzx0aWU+IGFyZSB0aGUgc2FtZSBhcyBnaXZlbiBmb3IgCnRoZSBCPG5ldz4gbWV0aG9kLCBhYm92ZS4KCkhlcmUncyBhbiBleGFtcGxlOgoKICB1c2UgQ29uZmlnOjpJbmlGaWxlczsKICAKICBteSAlaW5pCiAgdGllICVpbmksICdDb25maWc6OkluaUZpbGVzJywgKCAtZmlsZSA9PiAiL3BhdGgvY29uZmlnZmlsZS5pbmkiICk7CgogIHByaW50ICJXZSBoYXZlICRpbml7U2VjdGlvbn17UGFyYW1ldGVyfS4iIGlmICRpbml7U2VjdGlvbn17UGFyYW1ldGVyfTsKCkFjY2Vzc2luZyBhbmQgdXNpbmcgdGhlIGhhc2ggd29ya3MganVzdCBsaWtlIGFjY2Vzc2luZyBhIHJlZ3VsYXIgaGFzaCBhbmQgCm1hbnkgb2YgdGhlIG9iamVjdCBtZXRob2RzIGFyZSBtYWRlIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBoYXNoIGludGVyZmFjZS4KCkZvciB0aG9zZSBtZXRob2RzIHRoYXQgZG8gbm90IGNvaW5jaWRlIHdpdGggdGhlIGhhc2ggcGFyYWRpZ20sIHlvdSBjYW4gdXNlIAp0aGUgUGVybCBDPHRpZWQ+IGZ1bmN0aW9uIHRvIGdldCBhdCB0aGUgdW5kZXJseWluZyBvYmplY3QgdGllZCB0byB0aGUgaGFzaCAKYW5kIGNhbGwgbWV0aG9kcyBvbiB0aGF0IG9iamVjdC4gRm9yIGV4YW1wbGUsIHRvIHdyaXRlIHRoZSBoYXNoIG91dCB0byBhIG5ldwppbmkgZmlsZSwgeW91IHdvdWxkIGRvIHNvbWV0aGluZyBsaWtlIHRoaXM6CgogIHRpZWQoICVpbmkgKS0+V3JpdGVDb25maWcoICIvbmV3cGF0aC9uZXdjb25maWcuaW5pIiApIHx8CiAgICBkaWUgIkNvdWxkIG5vdCB3cml0ZSBzZXR0aW5ncyB0byBuZXcgZmlsZS4iOwoKPWhlYWQyICR2YWwgPSAkaW5peyRzZWN0aW9ufXskcGFyYW1ldGVyfQoKUmV0dXJucyB0aGUgdmFsdWUgb2YgJHBhcmFtZXRlciBpbiAkc2VjdGlvbi4gCgpCZWNhdXNlIG9mIGxpbWl0YXRpb25zIGluIFBlcmwncyB0aWUgaW1wbGVtZW50YXRpb24sCm11bHRpbGluZSB2YWx1ZXMgYWNjZXNzZWQgdGhyb3VnaCBhIGhhc2ggd2lsbCBJPGFsd2F5cz4gYmUgcmV0dXJuZWQgCmFzIGEgc2luZ2xlIHZhbHVlIHdpdGggZWFjaCBsaW5lIGpvaW5lZCBieSB0aGUgZGVmYXVsdCBsaW5lIApzZXBhcmF0b3IgKCRcKS4gVG8gYnJlYWsgdGhlbSBhcGFydCB5b3UgY2FuIHNpbXBsZSBkbyB0aGlzOgoKICBAbGluZXMgPSBzcGxpdCggIiRcIiwgJGluaXtzZWN0aW9ufXttdWx0aV9saW5lX3BhcmFtZXRlcn0gKTsKCj1oZWFkMiAkaW5peyRzZWN0aW9ufXskcGFyYW1ldGVyfSA9ICR2YWx1ZTsKClNldHMgdGhlIHZhbHVlIG9mIEM8JHBhcmFtZXRlcj4gaW4gQzwkc2VjdGlvbj4gdG8gQzwkdmFsdWU+LiAKClRvIHNldCBhIG11bHRpbGluZSBvciBtdWx0aXYtYWx1ZSBwYXJhbWV0ZXIganVzdCBhc3NpZ24gYW4gCmFycmF5IHJlZmVyZW5jZSB0byB0aGUgaGFzaCBlbnRyeSwgbGlrZSB0aGlzOgoKICRpbml7JHNlY3Rpb259eyRwYXJhbWV0ZXJ9ID0gWyR2YWx1ZTEsICR2YWx1ZTIsIC4uLl07CgpJZiB0aGUgcGFyYW1ldGVyIGRpZCBub3QgZXhpc3QgaW4gdGhlIG9yaWdpbmFsIGZpbGUsIGl0IHdpbGwgCmJlIGNyZWF0ZWQuIEhvd2V2ZXIsIFBlcmwgZG9lcyBub3Qgc2VlbSB0byBleHRlbmQgYXV0b3ZpdmlmaWNhdGlvbiAKdG8gdGllZCBoYXNoZXMuIFRoYXQgbWVhbnMgdGhhdCBpZiB5b3UgdHJ5IHRvIHNheQoKICAkaW5pe25ld19zZWN0aW9ufXtuZXdfcGFyYW10ZXJzfSA9ICR2YWw7CgphbmQgdGhlIHNlY3Rpb24gJ25ld19zZWN0aW9uJyBkb2VzIG5vdCBleGlzdCwgdGhlbiBQZXJsIHdvbid0IApwcm9wZXJseSBjcmVhdGUgaXQuIEluIG9yZGVyIHRvIHdvcmsgYXJvdW5kIHRoaXMgeW91IHdpbGwgbmVlZCAKdG8gY3JlYXRlIGEgaGFzaCByZWZlcmVuY2UgaW4gdGhhdCBzZWN0aW9uIGFuZCB0aGVuIGFzc2lnbiB0aGUKcGFyYW1ldGVyIHZhbHVlLiBTb21ldGhpbmcgbGlrZSB0aGlzIHNob3VsZCBkbyBuaWNlbHk6CgogICRpbml7bmV3X3NlY3Rpb259ID0ge307CiAgJGluaXtuZXdfc2VjdGlvbn17bmV3X3BhcmFtdGVyc30gPSAkdmFsOwoKPWhlYWQyICVoYXNoID0gJXskaW5peyRzZWN0aW9ufX0KClVzaW5nIHRoZSB0aWUgaW50ZXJmYWNlLCB5b3UgY2FuIGNvcHkgd2hvbGUgc2VjdGlvbnMgb2YgdGhlIAppbmkgZmlsZSBpbnRvIGFub3RoZXIgaGFzaC4gTm90ZSB0aGF0IHRoaXMgbWFrZXMgYSBjb3B5IG9mIAp0aGUgZW50aXJlIHNlY3Rpb24uIFRoZSBuZXcgaGFzaCBpbiBubyBsb25nZXIgdGllZCB0byB0aGUgCmluaSBmaWxlLCBJbiBwYXJ0aWN1bGFyLCB0aGlzIG1lYW5zIC1kZWZhdWx0IGFuZCAtbm9jYXNlIApzZXR0aW5ncyB3aWxsIG5vdCBhcHBseSB0byBDPCVoYXNoPi4KCgo9aGVhZDIgJGluaXskc2VjdGlvbn0gPSB7fTsgJXskaW5peyRzZWN0aW9ufX0gPSAlcGFyYW1ldGVyczsKClRocm91Z2ggdGhlIGhhc2ggaW50ZXJmYWNlLCB5b3UgaGF2ZSB0aGUgYWJpbGl0eSB0byByZXBsYWNlIAp0aGUgZW50aXJlIHNlY3Rpb24gd2l0aCBhIG5ldyBzZXQgb2YgcGFyYW1ldGVycy4gVGhpcyBjYWxsCndpbGwgZmFpbCwgaG93ZXZlciwgaWYgdGhlIGFyZ3VtZW50IHBhc3NlZCBpbiBOT1QgYSBoYXNoIApyZWZlcmVuY2UuIFlvdSBtdXN0IHVzZSBib3RoIGxpbmVzLCBhcyBzaG93biBhYm92ZSBzbyB0aGF0IApQZXJsIHJlY29nbml6ZXMgdGhlIHNlY3Rpb24gYXMgYSBoYXNoIHJlZmVyZW5jZSBjb250ZXh0IApiZWZvcmUgQ09QWWluZyBvdmVyIHRoZSB2YWx1ZXMgZnJvbSB5b3VyIEM8JXBhcmFtZXRlcnM+IGhhc2guCgo9aGVhZDIgZGVsZXRlICRpbml7JHNlY3Rpb259eyRwYXJhbWV0ZXJ9CgpXaGVuIHRpZWQgdG8gYSBoYXNoLCB5b3UgY2FuIHVzZSB0aGUgUGVybCBDPGRlbGV0ZT4gZnVuY3Rpb24KdG8gY29tcGxldGVseSByZW1vdmUgYSBwYXJhbWV0ZXIgZnJvbSBhIHNlY3Rpb24uCgo9aGVhZDIgZGVsZXRlICRpbml7JHNlY3Rpb259CgpUaGUgdGllZCBpbnRlcmZhY2UgYWxzbyBhbGxvd3MgeW91IHRvIGRlbGV0ZSBhbiBlbnRpcmUgCnNlY3Rpb24gZnJvbSB0aGUgaW5pIGZpbGUgdXNpbmcgdGhlIFBlcmwgQzxkZWxldGU+IGZ1bmN0aW9uLgoKPWhlYWQyICVpbmkgPSAoKTsKCklmIHlvdSByZWFsbHkgd2FudCB0byBkZWxldGUgQjxhbGw+IHRoZSBpdGVtcyBpbiB0aGUgaW5pIGZpbGUsIHRoaXMgCndpbGwgZG8gaXQuIE9mIGNvdXJzZSwgdGhlIGNoYW5nZXMgd29uJ3QgYmUgd3JpdHRlbiB0byB0aGUgYWN0dWFsCmZpbGUgdW5sZXNzIHlvdSBjYWxsIEI8UmV3cml0ZUNvbmZpZz4gb24gdGhlIG9iamVjdCB0aWVkIHRvIHRoZSBoYXNoLgoKPWhlYWQyIFBhcmFtZXRlciBuYW1lcwoKPW92ZXIgNAoKPWl0ZW0gbXkgQGtleXMgPSBrZXlzICV7JGluaXskc2VjdGlvbn19Cgo9aXRlbSB3aGlsZSAoKCRrLCAkdikgPSBlYWNoICV7JGluaXskc2VjdGlvbn19KSB7Li4ufQoKPWl0ZW0gaWYoIGV4aXN0cyAleyRpbml7JHNlY3Rpb259fSwgJHBhcmFtZXRlciApIHsuLi59Cgo9YmFjawoKV2hlbiB0aWVkIHRvIGEgaGFzaCwgeW91IHVzZSB0aGUgUGVybCBDPGtleXM+IGFuZCBDPGVhY2g+IApmdW5jdGlvbnMgdG8gaXRlcmF0aXZlbHkgbGlzdCB0aGUgcGFyYW1ldGVycyAoQzxrZXlzPikgb3IgCnBhcmFtZXRlcnMgYW5kIHRoZWlyIHZhbHVlcyAoQzxlYWNoPikgaW4gYSBnaXZlbiBzZWN0aW9uLgoKWW91IGNhbiBhbHNvIHVzZSB0aGUgUGVybCBDPGV4aXN0cz4gZnVuY3Rpb24gdG8gc2VlIGlmIGEgCnBhcmFtZXRlciBpcyBkZWZpbmVkIGluIGEgZ2l2ZW4gc2VjdGlvbi4KCk5vdGUgdGhhdCBub25lIG9mIHRoZXNlIHdpbGwgcmV0dXJuIHBhcmFtZXRlciBuYW1lcyB0aGF0IAphcmUgcGFydCBpZiB0aGUgZGVmYXVsdCBzZWN0aW9uIChpZiBzZXQpLCBhbHRob3VnaCBhY2Nlc3NpbmcKYW4gdW5rbm93biBwYXJhbWV0ZXIgaW4gdGhlIHNwZWNpZmllZCBzZWN0aW9uIHdpbGwgcmV0dXJuIGEgCnZhbHVlIGZyb20gdGhlIGRlZmF1bHQgc2VjdGlvbiBpZiB0aGVyZSBpcyBvbmUuCgoKPWhlYWQyIFNlY3Rpb24gbmFtZXMKCj1vdmVyIDQKCj1pdGVtIGZvcmVhY2goIGtleXMgJWluaSApIHsuLi59Cgo9aXRlbSB3aGlsZSAoKCRrLCAkdikgPSBlYWNoICVpbmkpIHsuLi59Cgo9aXRlbSBpZiggZXhpc3RzICVpbmksICRzZWN0aW9uICkgey4uLn0KCj1iYWNrCgpXaGVuIHRpZWQgdG8gYSBoYXNoLCB5b3UgdXNlIHRoZSBQZXJsIEM8a2V5cz4gYW5kIEM8ZWFjaD4gCmZ1bmN0aW9ucyB0byBpdGVyYXRpdmVseSBsaXN0IHRoZSBzZWN0aW9ucyBpbiB0aGUgaW5pIGZpbGUuCgpZb3UgY2FuIGFsc28gdXNlIHRoZSBQZXJsIEM8ZXhpc3RzPiBmdW5jdGlvbiB0byBzZWUgaWYgYSAKc2VjdGlvbiBpcyBkZWZpbmVkIGluIHRoZSBmaWxlLgoKPWN1dAoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMKIyBUSUVIQVNIIE1ldGhvZHMKIwojIERlc2NyaXB0aW9uOgojIFRoZXNlIG1ldGhvZHMgYWxsb3cgeW91IHRvIHRpZSBhIGhhc2ggdG8gdGhlIAojIENvbmZpZzo6SW5pRmlsZXMgb2JqZWN0LiBOb3RlIHRoYXQsIHdoZW4gdGllZCwgdGhlIAojIHVzZXIgd2FudHMgdG8gbG9vayBhdCB0aGlua3MgbGlrZSAkaW5pe3NlY317cGFybX0sIGJ1dCB0aGUgCiMgVElFSEFTSCBvbmx5IHByb3ZpZGVzIG9uZSBsZXZlbCBvZiBoYXNoIGludGVyYWNlLCBzbyB0aGUgCiMgcm9vdCBvYmplY3QgZ2V0cyBhc2tlZCBmb3IgYSAkaW5pe3NlY30sIHdoaWNoIHRoaXMgCiMgaW1wbGVtZW50cy4gVG8gZnVydGhlciB0aWUgdGhlIHtwYXJtfSBoYXNoLCB0aGUgaW50ZXJuYWwgCiMgY2xhc3MgQ29uZmlnOjpJbmlGaWxlczo6X3NlY3Rpb24sIGlzIHByb3ZpZGVkLCBiZWxvdy4KIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgRGF0ZSAgICAgIE1vZGlmaWNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhvcgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAyMDAwTWF5MDkgQ3JlYXRlZCBtZXRob2QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpXCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgVElFSEFTSCB7CiAgbXkgJGNsYXNzID0gc2hpZnQ7CiAgbXkgJXBhcm1zID0gQF87CgogICMgR2V0IGEgbmV3IG9iamVjdAogIG15ICRzZWxmID0gJGNsYXNzLT5uZXcoICVwYXJtcyApOwoKICByZXR1cm4gJHNlbGY7Cn0gIyBlbmQgVElFSEFTSAoKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIERhdGUgICAgICBNb2RpZmljYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdXRob3IKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgMjAwME1heTA5IENyZWF0ZWQgbWV0aG9kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKVwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIEZFVENIIHsKICBteSAkc2VsZiA9IHNoaWZ0OwogIG15KCAka2V5ICkgPSBAXzsKCiAgJGtleSA9IGxjKCRrZXkpIGlmKCAkc2VsZi0+e25vY2FzZX0gKTsKCiAgcmV0dXJuICRzZWxmLT57dn17JGtleX07Cn0gIyBlbmQgRkVUQ0gKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIERhdGUgICAgICBNb2RpZmljYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdXRob3IKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgMjAwMEp1bjE0IEZpeGVkIGJ1ZyB3aGVyZSB3cm9uZyByZWYgd2FzIHNhdmVkICAgICAgICAgICBKVwojIDIwMDBPY3QwOSBGaXhlZCBwb3NzaWJsZSBidXQgaW4gJXBhcm1zIHdpdGggZGVmYXVsdHMgICAgSlcKIyAyMDAxQXByMDQgRml4ZWQgLW5vY2FzZSBwcm9ibGVtIGluIHN0b3JpbmcgICAgICAgICAgICAgIEpXCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgU1RPUkUgewogIG15ICRzZWxmID0gc2hpZnQ7CiAgbXkoICRrZXksICRyZWYgKSA9IEBfOwoKICByZXR1cm4gdW5kZWYgdW5sZXNzIHJlZigkcmVmKSBlcSAnSEFTSCc7CgogICRrZXkgPSBsYygka2V5KSBpZiggJHNlbGYtPntub2Nhc2V9ICk7CgogICMgQ3JlYXRlIGEgbmV3IGhhc2ggYW5kIHRpZSBpdCB0byBhIF9zZWN0aW9ucyBvYmplY3Qgd2l0aCB0aGUgcmVmJ3MgZGF0YQogICRzZWxmLT57dn17JGtleX0gPSB7fTsKCiAgIyBTdG9yZSB0aGUgc2VjdGlvbiBuYW1lIGluIHRoZSBsaXN0CiAgcHVzaChAeyRzZWxmLT57c2VjdHN9fSwgJGtleSkgdW5sZXNzIChncmVwIHsvXlxRJGtleVxFJC99IEB7JHNlbGYtPntzZWN0c319KTsKCiAgbXkgJXBhcm1zID0gJXskc2VsZi0+e3N0YXJ0dXBfc2V0dGluZ3N9fTsKICAkc2VsZi0+e3Bhcm1zfXska2V5fSA9IFtdOwogICRwYXJtc3stcGFybXN9ID0gJHNlbGYtPntwYXJtc317JGtleX07CiAgJHBhcm1zey1fY3VycmVudF92YWx1ZX0gPSAkcmVmOwogIGRlbGV0ZSAkcGFybXN7ZGVmYXVsdH07CiAgJHBhcm1zey1kZWZhdWx0fSA9ICRzZWxmLT57dn17JHBhcm1zey1kZWZhdWx0fX0gaWYgZGVmaW5lZCAkcGFybXN7LWRlZmF1bHR9ICYmIGRlZmluZWQgJHNlbGYtPnt2fXskcGFybXN7LWRlZmF1bHR9fTsKICB0aWUgJXskc2VsZi0+e3Z9eyRrZXl9fSwgJ0NvbmZpZzo6SW5pRmlsZXM6Ol9zZWN0aW9uJywgJXBhcm1zOwp9ICMgZW5kIFNUT1JFCgoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgRGF0ZSAgICAgIE1vZGlmaWNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhvcgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAyMDAwTWF5MDkgQ3JlYXRlZCBtZXRob2QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpXCiMgMjAwMERlYzE3IE5vdyByZW1vdmVzIGNvbW1lbnRzLCBncm91cHMgYW5kIEVPVHMgdG9vICAgICBKVwojIDIwMDFBcnAwNCBGaXhlZCAtbm9jYXNlIHByb2JsZW0gICAgICAgICAgICAgICAgICAgICAgICAgSlcKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBERUxFVEUgewogIG15ICRzZWxmID0gc2hpZnQ7CiAgbXkoICRrZXkgKSA9IEBfOwoKICAka2V5ID0gbGMoJGtleSkgaWYoICRzZWxmLT57bm9jYXNlfSApOwoKICBkZWxldGUgJHNlbGYtPntzQ01UfXska2V5fTsKICBkZWxldGUgJHNlbGYtPntwQ01UfXska2V5fTsKICBkZWxldGUgJHNlbGYtPntFT1R9eyRrZXl9OwogIGRlbGV0ZSAkc2VsZi0+e3Bhcm1zfXska2V5fTsKCiAgaWYoICRrZXkgPX4gLyhcUyspXHMrXFMrLyApIHsKICAgIG15ICRncm91cCA9ICQxOwogICAgaWYoIGRlZmluZWQoJHNlbGYtPntncm91cH17JGdyb3VwfSkgKSB7CiAgICAgIEB7JHNlbGYtPntncm91cH17JGdyb3VwfX0gPSBncmVwICEvXFEka2V5XEUvLCBAeyRzZWxmLT57Z3JvdXB9eyRncm91cH19OwogICAgfSAjIGVuZCBpZgogIH0gIyBlbmQgaWYKCiAgQHskc2VsZi0+e3NlY3RzfX0gPSBncmVwICEvXlxRJGtleVxFJC8sIEB7JHNlbGYtPntzZWN0c319OwogIHJldHVybiBkZWxldGUoICRzZWxmLT57dn17JGtleX0gKTsKfSAjIGVuZCBERUxFVEUKCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBEYXRlICAgICAgTW9kaWZpY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0aG9yCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIDIwMDBNYXkwOSBDcmVhdGVkIG1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlcKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBDTEVBUiB7CiAgbXkgJHNlbGYgPSBzaGlmdDsKCiAgZm9yZWFjaCAoa2V5cyAleyRzZWxmLT57dn19KSB7CiAgICAgJHNlbGYtPkRFTEVURSggJF8gKTsKICB9ICMgZW5kIGZvcmVhY2gKIAp9ICMgZW5kIENMRUFSCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBEYXRlICAgICAgTW9kaWZpY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0aG9yCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIDIwMDBNYXkwOSBDcmVhdGVkIG1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlcKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBGSVJTVEtFWSB7CiAgbXkgJHNlbGYgPSBzaGlmdDsKCiAgbXkgJGEgPSBrZXlzICV7JHNlbGYtPnt2fX07CiAgcmV0dXJuIGVhY2ggJXskc2VsZi0+e3Z9fTsKfSAjIGVuZCBGSVJTVEtFWQoKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIERhdGUgICAgICBNb2RpZmljYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdXRob3IKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgMjAwME1heTA5IENyZWF0ZWQgbWV0aG9kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKVwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIE5FWFRLRVkgewogIG15ICRzZWxmID0gc2hpZnQ7CiAgbXkoICRsYXN0ICkgPSBAXzsKCiAgcmV0dXJuIGVhY2ggJXskc2VsZi0+e3Z9fTsKfSAjIGVuZCBORVhUS0VZCgoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgRGF0ZSAgICAgIE1vZGlmaWNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhvcgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAyMDAwTWF5MDkgQ3JlYXRlZCBtZXRob2QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpXCiMgMjAwMUFwcjA0IEZpeGVkIC1ub2Nhc2UgYnVnIGFuZCBmYWxzZSB0cnVlIGJ1ZyAgICAgICAgICBKVwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIEVYSVNUUyB7CiAgbXkgJHNlbGYgPSBzaGlmdDsKICBteSggJGtleSApID0gQF87CiAgJGtleSA9IGxjKCRrZXkpIGlmKCAkc2VsZi0+e25vY2FzZX0gKTsKCiAgcmV0dXJuIGV4aXN0cyAkc2VsZi0+e3Z9eyRrZXl9Owp9ICMgZW5kIEVYSVNUUwoKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIERFU1RST1kgaXMgdXNlZCBieSBUSUVIQVNIIGFuZCB0aGUgUGVybCBnYXJiYWdlIGNvbGxlY3RvciwKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgRGF0ZSAgICAgIE1vZGlmaWNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhvcgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAyMDAwTWF5MDkgQ3JlYXRlZCBtZXRob2QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpXCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgREVTVFJPWSB7CiAgIyBteSAkc2VsZiA9IHNoaWZ0Owp9ICMgZW5kIGlmCgoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgU3ViOiBfbWFrZV9maWxlaGFuZGxlCiMKIyBBcmdzOiAkdGhpbmcKIwkkdGhpbmcJQW4gaW5wdXQgc291cmNlCiMKIyBEZXNjcmlwdGlvbjogVGFrZXMgYW4gaW5wdXQgc291cmNlIG9mIGEgZmlsZWhhbmRsZSwgCiMgZmlsZWhhbmRsZSBnbG9iLCByZWZlcmVuY2UgdG8gYSBmaWxlaGFuZGxlIGdsb2IsIElPOjpGaWxlCiMgb2JqZWN0IG9yIHNjYWxhciBmaWxlbmFtZSBhbmQgcmV0dXJucyBhIGZpbGUgaGFuZGxlIHRvIAojIHJlYWQgZnJvbSBpdCB3aXRoLgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBEYXRlICAgICAgTW9kaWZpY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0aG9yCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIDA2RGVjMjAwMSBBZGRlZCB0byBzdXBwb3J0IGlucHV0IGZyb20gYW55IHNvdXJjZSAgICAgICAgSlcKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBfbWFrZV9maWxlaGFuZGxlIHsKICBteSAkc2VsZiA9IHNoaWZ0OwoKICAjCiAgIyBUaGlzIGNvZGUgaXMgJ2JvcnJvd2VkJyBmcm9tIExpbmNvbG4gRC4gU3RlaW4ncyBHRC5wbSBtb2R1bGUKICAjIHdpdGggbW9kaWZpY2F0aW9uIGZvciB0aGlzIG1vZHVsZS4gVGhhbmtzIExpbmNvbG4hCiAgIwogIAogIG5vIHN0cmljdCAncmVmcyc7CiAgbXkgJHRoaW5nID0gc2hpZnQ7CiAgcmV0dXJuICR0aGluZyBpZiBkZWZpbmVkKGZpbGVubyAkdGhpbmcpOwojICByZXR1cm4gJHRoaW5nIGlmIGRlZmluZWQoJHRoaW5nKSAmJiByZWYoJHRoaW5nKSAmJiBkZWZpbmVkKGZpbGVubyAkdGhpbmcpOwogIAogICMgb3RoZXJ3aXNlIHRyeSBxdWFsaWZ5aW5nIGl0IGludG8gY2FsbGVyJ3MgcGFja2FnZQogIG15ICRmaCA9IHF1YWxpZnlfdG9fcmVmKCR0aGluZyxjYWxsZXIoMSkpOwogIHJldHVybiAkZmggaWYgZGVmaW5lZChmaWxlbm8gJGZoKTsKIyAgcmV0dXJuICRmaCBpZiBkZWZpbmVkKCR0aGluZykgJiYgcmVmKCR0aGluZykgJiYgZGVmaW5lZChmaWxlbm8gJGZoKTsKICAKICAjIG90aGVyd2lzZSB0cmVhdCBpdCBhcyBhIGZpbGUgdG8gb3BlbgogICRmaCA9IGdlbnN5bTsKICBvcGVuKCRmaCwkdGhpbmcpIHx8IHJldHVybjsKICAKICByZXR1cm4gJGZoOwp9ICMgZW5kIF9tYWtlX2ZpbGVoYW5kbGUKCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMKIyBJTlRFUk5BTCBQQUNLQUdFOiBDb25maWc6OkluaUZpbGVzOjpfc2VjdGlvbgojCiMgRGVzY3JpcHRpb246CiMgVGhpcyBwYWNrYWdlIGlzIHVzZWQgdG8gcHJvdmlkZSBhIHNpbmdsZS1sZXZlbCBUSUVIQVNICiMgaW50ZXJmYWNlIHRvIHRoZSBzZWN0aW9ucyBpbiB0aGUgSW5pRmlsZS4gV2hlbiB0aWVkLCB0aGUgCiMgdXNlciB3YW50cyB0byBsb29rIGF0IHRoaW5rcyBsaWtlICRpbml7c2VjfXtwYXJtfSwgYnV0IHRoZSAKIyBUSUVIQVNIIG9ubHkgcHJvdmlkZXMgb25lIGxldmVsIG9mIGhhc2ggaW50ZXJhY2UsIHNvIHRoZSAKIyByb290IG9iamVjdCBnZXRzIGFza2VkIGZvciBhICRpbml7c2VjfSBhbmQgbXVzdCByZXR1cm4gYSAKIyBoYXMgcmVmZXJlbmNlIHRoYXQgYWNjdXJhdGVseSBjb3ZlcnMgdGhlICd7cGFybX0nIHBhcnQuCiMKIyBUaGlzIHBhY2thZ2UgaXMgb25seSB1c2VkIHdoZW4gdGllZCBhbmQgaXMgaW50ZXItd292ZW4gCiMgYmV0d2VlbiB0aGUgc2VjdGlvbnMgYW5kIHRoZWlyIHBhcmFtZXRlcnMgd2hlbiB0aGUgVElFSEFTSAojIG1ldGhvZCBpcyBjYWxsZWQgYnkgUGVybC4gSXQncyBhIHZlcnkgc2ltcGxlIGltcGxlbWVudGF0aW9uCiMgb2YgYSB0aWVkIGhhc2ggb2JqZWN0IHdpdGggc3VwcG9ydCBmb3IgdGhlIENvbmZpZzo6SW5pRmlsZXMKIyAtbm9jYXNlIGFuZCAtZGVmYXVsdCBvcHRpb25zLgojCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIERhdGUgICAgICAgIE1vZGlmaWNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdXRob3IKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgMjAwMC5NYXkuMDkgQ3JlYXRlZCB0byBleGNhcHN1bGF0ZSBUSUVIQVNIIGludGVyZmFjZSAgICBKVwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKcGFja2FnZSBDb25maWc6OkluaUZpbGVzOjpfc2VjdGlvbjsKCnVzZSBzdHJpY3Q7CnVzZSBDYXJwOwp1c2UgdmFycyBxdyggJFZFUlNJT04gKTsKCiRDb25maWc6OkluaUZpbGVzOjpfc2VjdGlvbjo6VkVSU0lPTiA9IDIuMTY7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBTdWI6IENvbmZpZzo6SW5pRmlsZXM6Ol9zZWN0aW9uOjpUSUVIQVNICiMKIyBBcmdzOiAkY2xhc3MsICVwYXJtcwojCSRjbGFzcwlUaGUgY2xhc3MgdGhhdCB0aGlzIGlzIGJlaW5nIHRpZWQgdG8uCiMJJXBhcm1zICAgQ29udGFpbnMgbmFtZWQgcGFyYW1ldGVycyBwYXNzZWQgZnJvbSB0aGUgCiMgICAgICAgICAgIGNvbnN0cnVjdG9yIHBsdXMgdGhlcyBwYXJhbWV0ZXJzCiMJLV9jdXJyZW50X3ZhbHVlCWhvbGRzIHRoZSB2YWx1ZXMgdG8gYmUgaW5zZXJ0ZWQgaW4gdGhlIGhhc2guCiMJLWRlZmF1bHQJc2hvdWxkIGJlIGEgaGFzaCByZWYuCiMJLXBhcm1zICAJcmVmZXJlbmNlIHRvIHRoZSAkc2VsZi0+e3Bhcm1zfXskc2VjdH0gb2YgdGhlIHBhcmVudAojCiMgRGVzY3JpcHRpb246IEJ1aWxkcyB0aGUgb2JqZWN0IHRoYXQgZ2V0cyB0aWVkIHRvIHRoZSAKIyBzZWN0aW9ucyBuYW1lLiBJbnNlcnRzIHRoZSBleGlzdGluZyBoYXNoLCBkZWZpbmVkIGluIHRoZSAKIyBuYW1lZCBwYXJhbWV0ZXIgJy1fY3VycmVudF92YWx1ZScgaW50byB0aGUgdGllZCBoYXNoLgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBEYXRlICAgICAgTW9kaWZpY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0aG9yCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIFRJRUhBU0ggewogIG15ICRwcm90byA9IHNoaWZ0OwogIG15ICRjbGFzcyA9IHJlZigkcHJvdG8pIHx8ICRwcm90bzsKICBteSAlcGFybXMgPSBAXzsKICAKICAjIE1ha2UgYSBuZXcgb2JqZWN0CiAgbXkgJHNlbGYgPSB7fTsKICAKICAjIFB1dCB0aGUgcGFzc2VkIGhhc2ggaW50byB0aGUgaG9sZGVyCiAgJHNlbGYtPnt2fSA9ICRwYXJtc3stX2N1cnJlbnRfdmFsdWV9OwogIAogICMgR2V0IGFsbCBvdGhlciB0aGUgcGFybXMsIHJlbW92aW5nIGxlYWRpbmcgJy0nLCBpZiBhbnkKICAjIE9wdGlvbiBjaGVja2luZyBpcyBhbHJlYWR5IGhhbmRsZWQgaW4gdGhlIENvbmZpZzo6SW5pRmlsZXMgY29udHJ1Y3RvcgogIGZvcmVhY2goIGtleXMgJXBhcm1zICkgewogICAgcy9eLS8vZzsKICAgICRzZWxmLT57JF99ID0gJHBhcm1zey0kX307CiAgfSAjIGVuZCBmb3JlYWNoCgogIHJldHVybiBibGVzcyggJHNlbGYsICRjbGFzcyApOwp9ICMgZW5kIFRJRUhBU0gKCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBTdWI6IENvbmZpZzo6SW5pRmlsZXM6Ol9zZWN0aW9uOjpGRVRDSAojCiMgQXJnczogJGtleQojCSRrZXkJVGhlIG5hbWUgb2YgdGhlIGtleSB3aG9zZSB2YWx1ZSB0byBnZXQKIwojIERlc2NyaXB0aW9uOiBSZXR1cm5zIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggJGtleS4gSWYKIyB0aGUgdmFsdWUgaXMgYSBoYXNoLCByZXR1cm5zIGEgaGFzaHJlZiwganVzdCBsaWtlIG5vcm1hbAojIFBlcmwgaGFzaGVzLgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBEYXRlICAgICAgTW9kaWZpY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0aG9yCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIDIwMDBKdW4xNSBGaXhlZCBidWdzIGluIC1kZWZhdWx0IGhhbmRsZXIgICAgICAgICAgICAgICAgSlcKIyAyMDAwRGVjMDcgRml4ZWQgYW5vdGhlciBidWcgaW4gLWRlYXVsdCBoYW5kbGVyICAgICAgICAgIEpXCiMgMjAwMkp1bDA0IFJldHVybmluZyBzY2FsYXIgdmFsdWVzIChCdWc6NDQ3NTMyKSAgICAgICAgICBBUwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIEZFVENIIHsKICBteSAkc2VsZiA9IHNoaWZ0OwogIG15ICRrZXkgPSBzaGlmdDsKCiAgJGtleSA9IGxjKCRrZXkpIGlmKCAkc2VsZi0+e25vY2FzZX0gKTsKCiAgbXkgJHZhbCA9ICRzZWxmLT57dn17JGtleX07CiAgCiAgdW5sZXNzKCBkZWZpbmVkICRzZWxmLT57dn17JGtleX0gKSB7CiAgICAkdmFsID0gJHNlbGYtPntkZWZhdWx0fXska2V5fSBpZiByZWYoJHNlbGYtPntkZWZhdWx0fSkgZXEgJ0hBU0gnOwogIH0gIyBlbmQgdW5sZXNzCgogIHJldHVybiAkdmFsOwp9ICMgZW5kIEZFVENICgoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgU3ViOiBDb25maWc6OkluaUZpbGVzOjpfc2VjdGlvbjo6U1RPUkUKIwojIEFyZ3M6ICRrZXksIEB2YWwKIwkka2V5CVRoZSBrZXkgdW5kZXIgd2hpY2ggdG8gc3RvcmUgdGhlIHZhbHVlCiMJQHZhbAlUaGUgdmFsdWUgdG8gc3RvcmUsIGVpdGhlciBhbiBhcnJheSBvciBhIHNjYWxhcgojCiMgRGVzY3JpcHRpb246IFNldHMgdGhlIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkICRrZXkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgRGF0ZSAgICAgIE1vZGlmaWNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhvcgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAyMDAxQXByMDQgRml4ZWQgLW5vY2FzZSBidWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpXCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgU1RPUkUgewogIG15ICRzZWxmID0gc2hpZnQ7CiAgbXkgJGtleSA9IHNoaWZ0OwogIG15IEB2YWwgPSBAXzsKCiAgJGtleSA9IGxjKCRrZXkpIGlmKCAkc2VsZi0+e25vY2FzZX0gKTsKCiAgIyBBZGQgdGhlIHBhcmFtZXRlciB0aGUgdGhlIHBhcmVudCdzIGxpc3QgaWYgaXQgaXNuJ3QgdGhlcmUgeWV0CiAgcHVzaChAeyRzZWxmLT57cGFybXN9fSwgJGtleSkgdW5sZXNzIChncmVwIC9eXFEka2V5XEUkLywgQHskc2VsZi0+e3Bhcm1zfX0pOwoKICBpZiAoQHZhbCA+IDEpIHsKICAgICRzZWxmLT57dn17JGtleX0gPSBAdmFsOwogIH0gZWxzZSB7CiAgICAkc2VsZi0+e3Z9eyRrZXl9ID0gc2hpZnQgQHZhbDsKICB9CgogIHJldHVybiAkc2VsZi0+e3Z9eyRrZXl9Owp9ICMgZW5kIFNUT1JFCgoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgU3ViOiBDb25maWc6OkluaUZpbGVzOjpfc2VjdGlvbjo6REVMRVRFCiMKIyBBcmdzOiAka2V5CiMJJGtleQlUaGUga2V5IHRvIHJlbW92ZSBmcm9tIHRoZSBoYXNoCiMKIyBEZXNjcmlwdGlvbjogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGtleSBmcm9tIHRoZSBoYXNoCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIERhdGUgICAgICBNb2RpZmljYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdXRob3IKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgMjAwMUFwcjA0IEZpeGVkIC1ub2Nhc2UgYnVnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlcKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBERUxFVEUgICB7CiAgbXkgJHNlbGYgPSBzaGlmdDsKICBteSAka2V5ID0gc2hpZnQ7CgogICRrZXkgPSBsYygka2V5KSBpZiggJHNlbGYtPntub2Nhc2V9ICk7CiMJQHskc2VsZi0+e3Bhcm1zfXskc2VjdH19ID0gZ3JlcCAhL14kcGFybSQvLCBAeyRzZWxmLT57cGFybXN9eyRzZWN0fX07CiAgcmV0dXJuIGRlbGV0ZSAkc2VsZi0+e3Z9eyRrZXl9Owp9ICMgZW5kIERFTEVURQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgU3ViOiBDb25maWc6OkluaUZpbGVzOjpfc2VjdGlvbjo6Q0xFQVIKIwojIEFyZ3M6IChOb25lKQojCiMgRGVzY3JpcHRpb246IEVtcHRpZXMgdGhlIGVudGlyZSBoYXNoCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIERhdGUgICAgICBNb2RpZmljYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdXRob3IKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgQ0xFQVIgICAgewogIG15ICRzZWxmID0gc2hpZnQ7CgogIGZvcmVhY2ggKCBrZXlzICV7JHNlbGYtPnt2fX0pIHsKICAgICRzZWxmLT5ERUxFVEUoJF8pOwogIH0gIyBlbmQgZm9yZWFjaAoKICByZXR1cm4gJHNlbGY7Cn0gIyBlbmQgQ0xFQVIKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFN1YjogQ29uZmlnOjpJbmlGaWxlczo6X3NlY3Rpb246OkVYSVNUUwojCiMgQXJnczogJGtleQojCSRrZXkJVGhlIGtleSB0byBsb29rIGZvcgojCiMgRGVzY3JpcHRpb246IFJldHVybnMgd2hldGhlciB0aGUga2V5IGV4aXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBEYXRlICAgICAgTW9kaWZpY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0aG9yCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIDIwMDFBcHIwNCBGaXhlZCAtbm9jYXNlIGJ1ZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlcKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBFWElTVFMgICB7CiAgbXkgJHNlbGYgPSBzaGlmdDsKICBteSAka2V5ID0gc2hpZnQ7CiAgJGtleSA9IGxjKCRrZXkpIGlmKCAkc2VsZi0+e25vY2FzZX0gKTsKICByZXR1cm4gZXhpc3RzICRzZWxmLT57dn17JGtleX07Cn0gIyBlbmQgRVhJU1RTCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBTdWI6IENvbmZpZzo6SW5pRmlsZXM6Ol9zZWN0aW9uOjpGSVJTVEtFWQojCiMgQXJnczogKE5vbmUpCiMKIyBEZXNjcmlwdGlvbjogUmV0dXJucyB0aGUgZmlyc3Qga2V5IGluIHRoZSBoYXNoCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIERhdGUgICAgICBNb2RpZmljYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdXRob3IKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgRklSU1RLRVkgewogIG15ICRzZWxmID0gc2hpZnQ7CgogICMgUmVzZXQgdGhlIGVhY2goKSBpdGVyYXRvcgogIG15ICRhID0ga2V5cyAleyRzZWxmLT57dn19OwoKICByZXR1cm4gZWFjaCAleyRzZWxmLT57dn19Owp9ICMgZW5kIEZJUlNUIEtFWQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgU3ViOiBDb25maWc6OkluaUZpbGVzOjpfc2VjdGlvbjo6TkVYVEtFWQojCiMgQXJnczogJGxhc3QKIwkkbGFzdAlUaGUgbGFzdCBrZXkgYWNjZXNzZWQgYnkgdGhlIGludGVyYXRvcgojCiMgRGVzY3JpcHRpb246IFJldHVybnMgdGhlIG5leHQga2V5IGluIGxpbmUKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgRGF0ZSAgICAgIE1vZGlmaWNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhvcgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBORVhUS0VZICB7CiAgbXkgJHNlbGYgPSBzaGlmdDsKICBteSAkbGFzdCA9IHNoaWZ0OwoKICByZXR1cm4gZWFjaCAleyRzZWxmLT57dn19Owp9ICMgZW5kIE5FWFRLRVkKCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBTdWI6IENvbmZpZzo6SW5pRmlsZXM6Ol9zZWN0aW9uOjpERVNUUk9ZCiMKIyBBcmdzOiAoTm9uZSkKIwojIERlc2NyaXB0aW9uOiBDYWxsZWQgb24gY2xlYW51cAojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBEYXRlICAgICAgTW9kaWZpY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0aG9yCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIERFU1RST1kgIHsKICAjIG15ICRzZWxmID0gc2hpZnQKfSAjIGVuZCBERVNUUk9ZCgojIEVsaW1pbmF0ZSBhbm5veWluZyB3YXJuaW5ncwppZiAoJF5XKQl7CgkkQ29uZmlnOjpJbmlGaWxlczo6VkVSU0lPTiA9ICRDb25maWc6OkluaUZpbGVzOjpWRVJTSU9OOwp9CgoxOwoKPWhlYWQxIERJQUdOT1NUSUNTCgo9aGVhZDIgQENvbmZpZzo6SW5pRmlsZXM6OmVycm9ycwoKQ29udGFpbnMgYSBsaXN0IG9mIGVycm9ycyBlbmNvdW50ZXJlZCB3aGlsZSBwYXJzaW5nIHRoZSBjb25maWd1cmF0aW9uCmZpbGUuICBJZiB0aGUgSTxuZXc+IG1ldGhvZCByZXR1cm5zIEI8dW5kZWY+LCBjaGVjayB0aGUgdmFsdWUgb2YgdGhpcwp0byBmaW5kIG91dCB3aGF0J3Mgd3JvbmcuICBUaGlzIHZhbHVlIGlzIHJlc2V0IGVhY2ggdGltZSBhIGNvbmZpZyBmaWxlCmlzIHJlYWQuCgo9aGVhZDEgQlVHUwoKPW92ZXIgMwoKPWl0ZW0gKgoKVGhlIG91dHB1dCBmcm9tIFtSZV1Xcml0ZUNvbmZpZy9PdXRwdXRDb25maWcgbWlnaHQgbm90IGJlIGFzIHByZXR0eSBhcwppdCBjYW4gYmUuICBDb21tZW50cyBhcmUgdGllZCB0byB3aGF0ZXZlciB3YXMgaW1tZWRpYXRlbHkgYmVsb3cgdGhlbS4KQW5kIGNhc2UgaXMgbm90IHByZXNlcnZlZCBmb3IgU2VjdGlvbiBhbmQgUGFyYW1ldGVyIG5hbWVzIGlmIHRoZSAtbm9jYXNlCm9wdGlvbiB3YXMgdXNlZC4KCj1pdGVtICoKCk5vIGxvY2tpbmcgaXMgZG9uZSBieSBbUmVdV3JpdGVDb25maWcuICBXaGVuIHdyaXRpbmcgc2VydmVycywgdGFrZQpjYXJlIHRoYXQgb25seSB0aGUgcGFyZW50IGV2ZXIgY2FsbHMgdGhpcywgYW5kIGNvbnNpZGVyIG1ha2luZyB5b3VyCm93biBiYWNrdXAuCgo9YmFjawoKPWhlYWQxIERhdGEgU3RydWN0dXJlCgpOb3RlIHRoYXQgdGhpcyBpcyBvbmx5IGEgcmVmZXJlbmNlIGZvciB0aGUgcGFja2FnZSBtYWludGFpbmVycyAtIG9uZSBvZiB0aGUKdXBjb21pbmcgcmV2aXNpb25zIHRvIHRoaXMgcGFja2FnZSB3aWxsIGluY2x1ZGUgYSB0b3RhbCBjbGVhbiB1cCBvZiB0aGUKZGF0YSBzdHJ1Y3R1cmUuCgogICRpbmljb25mLT57Y2Z9ID0gImNvbmZpZ19maWxlX25hbWUiCiAgICAgICAgICAtPntzdGFydHVwX3NldHRpbmdzfSA9IFwlb3JnaW5hbF9vYmplY3RfcGFyYW1ldGVycwogICAgICAgICAgLT57Zmlyc3Rsb2FkfSA9IDAKICAgICAgICAgIC0+e25vY2FzZX0gPSAwCiAgICAgICAgICAtPntyZWxvYWR3YXJufSA9IDAKICAgICAgICAgIC0+e3NlY3RzfSA9IFxAc2VjdGlvbnMKICAgICAgICAgIC0+e3NDTVR9eyRzZWN0fSA9IFxAY29tbWVudF9saW5lcwogICAgICAgICAgLT57Z3JvdXB9eyRncm91cH0gPSBcQGdyb3VwX21lbWJlcnMKICAgICAgICAgIC0+e3Bhcm1zfXskc2VjdH0gPSBcQHNlY3Rpb25fcGFybXMKICAgICAgICAgIC0+e0VPVH17JHNlY3R9eyRwYXJtfSA9ICJlbmQgb2YgdGV4dCBzdHJpbmciCiAgICAgICAgICAtPntwQ01UfXskc2VjdH17JHBhcm19ID0gXEBjb21tZW50X2xpbmVzCiAgICAgICAgICAtPnt2fXskc2VjdH17JHBhcm19ID0gJHZhbHVlICAgT1IgIFxAdmFsdWVzCgo9aGVhZDEgQVVUSE9SIGFuZCBBQ0tOT1dMRURHRU1FTlRTCgpUaGUgb3JpZ2luYWwgY29kZSB3YXMgd3JpdHRlbiBieSBTY290dCBIdXR0b24uClRoZW4gaGFuZGxlZCBmb3IgYSB0aW1lIGJ5IFJpY2ggQm93ZW4gKHRoYW5rcyEpLApJdCBpcyBub3cgbWFuYWdlZCBieSBKZXJlbXkgV2Fkc2FjaywKd2l0aCBtYW55IGNvbnRyaWJ1dGlvbnMgZnJvbSB2YXJpb3VzIG90aGVyIHBlb3BsZS4KCkluIHBhcnRpY3VsYXIsIHNwZWNpYWwgdGhhbmtzIGdvIHRvIChpbiByb3VnaGx5IGNocm9ub2xvZ2ljYWwgb3JkZXIpOgoKQmVybmllIENvc2VsbCwgQWxhbiBZb3VuZywgQWxleCBTYXRyYXBhLCBNaWtlIEJsYXplciwgV2lsYmVydCB2YW4gZGUgUGlldGVybWFuLApTdGV2ZSBDYW1wYmVsbCwgUm9iZXJ0IEtvbmlnc2JlcmcsIFNjb3R0IERlbGxpbmdlciwgUi4gQmVybnN0ZWluLApEYW5pZWwgV2lua2VsbWFubiwgUGlyZXMgQ2xhdWRpbywgQWRyaWFuIFBoaWxsaXBzLCAKTWFyZWsgUm91Y2hhbCwgTHVjIFN0IExvdWlzLCBBZGFtIEZpc2NobGVyLCBLYXkgUvZwa2UsIE1hdHQgV2lsc29uLCAKUmF2aXJhaiBNdXJkZXNod2FyIGFuZCBTbGF2ZW4gUmV6aWMsIEZsb3JpYW4gUGZhZmYKCkdlZXosIHRoYXQncyBhIGxvdCBvZiBwZW9wbGUuIEFuZCBhcG9sb2dpZXMgdG8gdGhlIGZvbGtzIHdobyB3ZXJlIG1pc3NlZC4KCklmIHlvdSB3YW50IHNvbWVvbmUgdG8gYnVnIGFib3V0IHRoaXMsIHRoYXQgd291bGQgYmU6CgoJSmVyZW15IFdhZHNhY2sgPGRnc3VwcG9ydCBhdCB3YWRzYWNrLWFsbGVuIGRvdCBjb20+CgpJZiB5b3Ugd2FudCBtb3JlIGluZm9ybWF0aW9uLCBvciB3YW50IHRvIHBhcnRpY2lwYXRlLCBnbyB0bzoKCglodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2NvbmZpZy1pbmlmaWxlcy8KClBsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzIHRvIGNvbmZpZy1pbmlmaWxlcy1idWdzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAoKRGV2ZWxvcG1lbnQgZGlzY3Vzc2lvbiBvY2N1cnMgb24gdGhlIG1haWxpbmcgbGlzdApjb25maWctaW5pZmlsZXMtZGV2QGxpc3RzLnNvdXJjZWZvcmdlLm5ldCwgd2hpY2ggeW91IGNhbiBzdWJzY3JpYmUKdG8gYnkgZ29pbmcgdG8gdGhlIHByb2plY3Qgd2ViIHNpdGUgKGxpbmsgYWJvdmUpLgoKVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKbW9kaWZ5IGl0IHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLgoKPWhlYWQxIENoYW5nZSBsb2cKCiAgICAgJExvZyQKICAgICBSZXZpc2lvbiAxLjEgIDIwMDQvMDgvMzAgMTU6NTc6NDEgIGp2YW56eWwKICAgICBJbml0aWFsIHJldmlzaW9uCgogICAgIFJldmlzaW9uIDIuMzggIDIwMDMvMDUvMTQgMDE6MzA6MzIgIHdhZGcKICAgICAtIGZpeGVkIFJld3JpdGVDb25maWcgYW5kIFJlYWRDb25maWcgdG8gd29yayB3aXRoIG9wZW4gZmlsZSBoYW5kbGVzCiAgICAgLSBhZGRlZCBhIHRlc3QgdG8gZW5zdXJlIHRoYXQgYmxhbmsgZmlsZXMgdGhyb3cgbm8gd2FybmluZ3MKICAgICAtIGFkZGVkIGEgdGVzdCBmb3IgZXJyb3IgbWVzc2FnZXMgZnJvbSBtYWxmb3JtZWQgbGluZXMKCiAgICAgUmV2aXNpb24gMi4zNyAgMjAwMy8wMS8zMSAyMzowMDozNSAgd2FkZwogICAgIFVwZGF0ZWQgdC8wN21pc2MgdGVzdCA0IHRvIHJlbW92ZSB3YXJuaW5nCgogICAgIFJldmlzaW9uIDIuMzYgIDIwMDIvMTIvMTggMDE6NDM6MTEgIHdhZGcKICAgICAtIEltcHJvdmVkIGVycm9yIG1lc3NhZ2Ugd2hlbiBhbiBpbnZhbGlkIGxpbmUgaXMgZW5jb3VudGVyZWQgaW4gSU5JIGZpbGUKICAgICAtIEZpeGVkIGJ1ZyA2NDkyMjA7IGltcG9ydGluZyBhIG5vbi1maWxlLWJhc2VkIG9iamVjdCBpbnRvIGEgZmlsZSBvbmUKICAgICAgIG5vIGxvbmdlciBkZXN0cm95cyB0aGUgb3JpZ2luYWwgb2JqZWN0CgogICAgIFJldmlzaW9uIDIuMzMgIDIwMDIvMTEvMTIgMTQ6NDg6MTYgIGdyYWlsCiAgICAgQWRkcmVzc2VzIGZlYXR1cmUgcmVxdWVzdCAtIFsgNDAzNDk2IF0gQSBzaW1wbGUgY2hhbmdlIHdpbGwgYWxsb3cgc3VwcG9ydCBvbiBtb3JlIHBsYXRmb3JtcwoKICAgICBSZXZpc2lvbiAyLjMyICAyMDAyLzExLzEyIDE0OjE1OjQ0ICBncmFpbAogICAgIEFkZHJlc3NlcyBidWcgLSBbMjI1OTcxXSBSZXNwZWN0IFJlYWQtT25seSBQZXJtaXNzaW9ucyBvZiBGaWxlIFN5c3RlbQoKICAgICBSZXZpc2lvbiAyLjMxICAyMDAyLzEwLzI5IDAxOjQ1OjQ3ICBncmFpbAogICAgIFsgNTQwODY3IF0gQWRkIEdldEZpbGVOYW1lIG1ldGhvZAoKICAgICBSZXZpc2lvbiAyLjMwICAyMDAyLzEwLzE1IDE4OjUxOjA3ICB3YWRnCiAgICAgUGF0Y2hlZCB0byBzdG9wd2FybmluZ3MgYWJvdXQgdXRmOCB1c2FnZS4KCiAgICAgUmV2aXNpb24gMi4yOSAgMjAwMi8wOC8xNSAyMTozMzo1OCAgd2FkZwogICAgIC0gU3VwcG9ydCBmb3IgVVRGIEJ5dGUtT3JkZXItTWFyayAoUmF2aXJhaiBNdXJkZXNod2FyKQogICAgIC0gTWFkZSB0ZXN0cyBwb3J0YWJsZSB0byBNYWMgKHAuIGtlbnQpCiAgICAgLSBNYWRlIGZpbGUgcGFyc2luZyBwb3J0YWJsZSBmb3IgczM5MC9FQkNESUMsIGV0Yy4gKEFkYW0gRmlzY2hsZXIpCiAgICAgLSBGaXhlZCBpbXBvcnQgYnVnIHdpdGggUGVybCA1LjguMCAoTWFyZWsgUm91Y2hhbCkKICAgICAtIEZpeGVkIHByZWNlZGVuY2UgYnVnIGluIFdyaXRlQ29uZmlnIChMdWMgU3QgTG91aXMpCiAgICAgLSBGaXhlZCBicm9rZW4gZ3JvdXAgZGV0ZWN0aW9uIGluIFNldEdyb3VwTWVtYmVyIGFuZCBSZW1vdmVHcm91cE1lbWJlciAoS2F5IFL2cGtlKQogICAgIC0gQWRkZWQgbGluZSBjb250aW51YXRpb24gY2hhcmFjdGVyICgvKSBzdXBwb3J0IChNYXJlayBSb3VjaGFsKQogICAgIC0gQWRkZWQgY29uZmlndXJhYmxlIGNvbW1lbnQgY2hhcmFjdGVyIHN1cHBvcnQgKE1hcmVrIFJvdWNoYWwpCgogICAgIFJldmlzaW9uIDIuMjggIDIwMDIvMDcvMDQgMDM6NTY6MDUgIGdyYWlsCiAgICAgQ2hhbmdlcyBmb3IgcmVzb2x2aW5nIGJ1ZyA0NDc1MzIgLSBfc2VjdGlvbjo6RkVUQ0ggc2hvdWxkIHJldHVybiBhcnJheSByZWYgZm9yIG11bHRpbGluZSB2YWx1ZXMuCgogICAgIFJldmlzaW9uIDIuMjcgIDIwMDEvMTIvMjAgMTY6MDM6NDkgIHdhZGcKICAgICAtIEZpeGVkIGJ1ZyBpbnRyb2R1Y2VkIGluIG5ldyB2YWxpZCBmaWxlIGNoZWNrIHdoZXJlICc7JyBjb21tZW50cyBpbiBmaXJzdCBsaW5lcyB3ZXJlIG5vdCBjb25zaWRlcmVkIHZhbGlkCiAgICAgLSBSZWFycmFuZ2VkIHNvbWUgdGVzdHMgdG8gcHV0IHRoZW0gaW4gdGhlIHByb3BlciBmaWxlcyAoY2FzZSBhbmQgLWRlZmF1bHQpCiAgICAgLSBBZGRlZCBtb3JlIGNvbW1lbnQgdGVzdCB0byBjb3ZlciBtb3JlIGNhc2VzCiAgICAgLSBGaXhlZCBmaXJzdCB0d28gY29tbWVudHMgdGVzdHMgd2hpY2ggd2VyZW4ndCBkb2luZyBhbnl0aGluZwoKICAgICBSZXZpc2lvbiAyLjI2ICAyMDAxLzEyLzE5IDIyOjIwOjUwICB3YWRnCiAgICAgIzQ4MTUxMyBSZWNvZ25pemUgYmFkbHkgZm9ybWF0dGVkIGZpbGVzCgogICAgIFJldmlzaW9uIDIuMjUgIDIwMDEvMTIvMTIgMjA6NDQ6NDggIHdhZGcKICAgICBVcGRhdGUgdG8gYnJpbmcgQ1ZTIHZlcnNpb24gaW4gc3luY2gKCiAgICAgUmV2aXNpb24gMi4yNCAgMjAwMS8xMi8wNyAxMDowMzowNiAgd2FkZwogICAgIDIyMjQ0NCBBYmlsaXR5IHRvIGxvYWQgZnJvbSBhcmJpdHJhcnkgc291cmNlCgogICAgIFJldmlzaW9uIDIuMjMgIDIwMDEvMTIvMDcgMDk6MzU6MDYgIHdhZGcKICAgICBGb3Jnb3QgdG8gaW5jbHVkZSB1cGRhdGVzIHQvdGVzdC5pbmkKCiAgICAgUmV2aXNpb24gMi4yMiAgMjAwMS8xMi8wNiAxNjo1MjozOSAgd2FkZwogICAgIEZpeGVkIGJ1Z3MgNDgyMzUzLDIzMzM3Mi4gVXBkYXRlZCBkb2MgZm9yIG5ldyBtZ3IuCgogICAgIFJldmlzaW9uIDIuMjEgIDIwMDEvMDgvMTQgMDE6NDk6MDYgIHdhZGcKICAgICBCdWcgZml4OiBtdWx0aXBsZSBibGFuayBsaW5lcyBjb3VudGVkIGFzIG9uZQogICAgIFBhdGNoZWQgUkVBRE1FIGNoYW5nZSBsb2cgdG8gaW5jbHVkZSByZWNlbnQgdXBkYXRlcwoKICAgICBSZXZpc2lvbiAyLjIwICAyMDAxLzA2LzA3IDAyOjQ5OjUyICBncmFpbAogICAgICAtIEFkZGVkIGNoZWNrcyBmb3IgbWV0aG9kIHBhcmFtZXRlcnMgYmVpbmcgZGVmaW5lZAogICAgICAtIGZpeGVkIHNvbWUgcmVnZXhlcyB0byBtYWtlIHRoZW0gc3RyaWN0ZXIKICAgICAgLSBGaXhlZCBncmVwcyB0byBtYWtlIHRoZW0gY29uc2lzdGVudCB0aHJvdWdoIHRoZSBjb2RlIChhbHNvIGEgdmFpbgogICAgICAgIGF0dGVtcHQgdG8gaGVscCBteSBlZGl0b3JzIGRvIHN5bnRheCBjb2xvdXJpbmcgcHJvcGVybHkpCiAgICAgIC0gQWRkZWQgQWRkU2VjdGlvbiBtZXRob2QsIHJlcGxhY2VkIGNodW5rIG9mIFJlYWRDb25maWcgd2l0aCBBZGRTZWN0aW9uCiAgICAgIC0gQWRkZWQgY2FzZSBoYW5kbGluZyBzdHVmZiB0byBtb3JlIG1ldGhvZHMKICAgICAgLSBBZGRlZCBSZW1vdmVHcm91cE1lbWJlcgogICAgICAtIE1hZGUgdmFyaWFibGUgbmFtZXMgbW9yZSBjb25zaXN0ZW50IHRocm91Z2ggT08gbWV0aG9kcwogICAgICAtIFJlc3RvcmVkIFVuaXggRU9McwoKICAgICBSZXZpc2lvbiAyLjE5ICAyMDAxLzA0LzA0IDIzOjMzOjQwICB3YWRnCiAgICAgRml4ZWQgY2FzZSBzZW5zaXRpdml0eSBidWcKCiAgICAgUmV2aXNpb24gMi4xOCAgMjAwMS8wMy8zMCAwNDo0MTowOCAgcmJvd2VuCiAgICAgU21hbGwgZG9jdW1lbnRhdGlvbiBjaGFuZ2UgaW4gSW5pRmlsZXMucG0gLSBwb2QyKiB3YXMgY2hva2luZyBvbiBtaXNwbGFjZXMKICAgICA9aXRlbSB0YWdzLiBBbmQgSSByZWdlbmVyYXRlZCB0aGUgUkVBRE1FCiAgICAgVGhlIG1haW4gcmVhc29uIGZvciB0aGlzIHJlbGVhc2UgaXMgdGhhdCB0aGUgTUFOSUZFU1QgaW4gdGhlIDIuMTcgdmVyc2lvbiB3YXMKICAgICBtaXNzaW5nIG9uZSBvZiB0aGUgbmV3IHRlc3Qgc3VpdGUgZmlsZXMsIGFuZCB0aGF0IGlzIGluY2x1ZGVkIGluIHRoaXMKICAgICByZS1yZWxlYXNlLgoKICAgICBSZXZpc2lvbiAyLjE3ICAyMDAxLzAzLzIxIDIxOjA1OjEyICB3YWRnCiAgICAgRG9jdW1lbnRhdGlvbiBlZGl0cwoKICAgICBSZXZpc2lvbiAyLjE2ICAyMDAxLzAzLzIxIDE5OjU5OjA5IHdhZGcKICAgICA0MTAzMjcgLWRlZmF1bHQgbm90IGluIG9yaWdpbmFsOyAyMzMyNTUgc3Vic3RyaW5nIHBhcmFtZXRlcnMKCiAgICAgUmV2aXNpb24gMi4xNSAgMjAwMS8wMS8zMCAxMTo0Njo0OCAgcmJvd2VuCiAgICAgVmVyeSBtaW5vciBkb2N1bWVudGF0aW9uIGJ1ZyBmaXhlZC4KCiAgICAgUmV2aXNpb24gMi4xNCAgMjAwMS8wMS8wOCAxODowMjozMiAgd2FkZwogICAgIFtCdWcgIzEyNzMyNV0gRml4ZWQgcHJva2VuIGltcG9ydDsgY2hhbmdlbG9nOyBtb3ZlZAoKICAgICBSZXZpc2lvbiAyLjEzICAyMDAwLzEyLzE4IDA3OjE0OjQxICB3YWRnCiAgICAgW0J1Z3MjIDEyMjQ0MSwxMjI0MzddIEFsaWVuIEVPTHMgYW5kIE9PIGRlbGV0ZSBtZXRob2QKCiAgICAgUmV2aXNpb24gMi4xMiAgMjAwMC8xMi8xOCAwNDo1OTozNyAgd2FkZwogICAgIFtCdWcgIzEyNTUyNF0gV3JpdGluZyBtdWx0aWxpbmUgb2YgMiB3aXRoIHRpZWQgaGFzaAoKICAgICBSZXZpc2lvbiAyLjExICAyMDAwLzEyLzE2IDEyOjUzOjEzICBncmFpbAogICAgIFtCVUcgIzEyMjQ1NV0gUHJvYmxlbSB3aXRoIEZpbGUgUGVybWlzc2lvbnMKCiAgICAgUmV2aXNpb24gMi4xMCAgMjAwMC8xMi8xMyAxNzo0MDoxOCAgcmJvd2VuCiAgICAgVXBkYXRlZCB2ZXJzaW9uIG51bWJlciBzbyB0aGF0IENQQU4gd2lsbCBzdG9wIGJlaW5nIGFuZ3J5IHdpdGggdXMuCgogICAgIFJldmlzaW9uIDEuMTggIDIwMDAvMTIvMDggMDA6NDU6MzUgIGdyYWlsCiAgICAgQ2hhbmdlIGFzIHJlcXVlc3RlZCBieSBKZXJlbXkgV2Fkc2FjaywgZm9yIEJ1ZyAxMjMxNDYKCiAgICAgUmV2aXNpb24gMS4xNyAgMjAwMC8xMi8wNyAxNTozMjozNiAgZ3JhaWwKICAgICBGdXJ0aGVyIHBhdGNoIHRvIGR1cGxpY2F0ZSBzZWN0aW9ucyBidWcsIGFuZCByZXBsYWNlbWVudCBvZiByZXBlYXRlZCB2YWx1ZXMgaGFuZGxpbmcgY29kZS4KCiAgICAgUmV2aXNpb24gMS4xNCAgMjAwMC8xMS8yOSAxMToyNjowMyAgZ3JhaWwKICAgICBVcGRhdGVzIGZvciB0YXNrIDIyNDAxIChubyBtb3JlIHJlbG9hZHNpZykgYW5kIDIyNDAyIChHcm91cCBhbmQgR3JvdXBNZW1iZXIgZG9jbykKCiAgICAgUmV2aXNpb24gMS4xMyAgMjAwMC8xMS8yOCAxMjo0MTo0MiAgZ3JhaWwKICAgICBBZGRlZCB0ZXN0IGZvciBiZWluZyBhYmxlIHRvIGFkZCBzZWN0aW9ucyB3aXRoIHdpZXJkIG5hbWVzIGxpa2Ugc2VjdGlvbnx2ZXJzaW9uMgoKICAgICBSZXZpc2lvbiAxLjExICAyMDAwLzExLzI0IDIxOjIwOjExICByYm93ZW4KICAgICBSZXNvbHZlZCBTb3VyY2VGb3JnZSBidWcgIzEyMjQ0NSAtIGEgcGFyYW1ldGVyIHNob3VsZCBiZSBzcGxpdCBmcm9tIGl0cyB2YWx1ZSBvbiB0aGUgZmlyc3QgPSBzaWduIGVuY291bnRlcmVkLCBub3Qgb24gdGhlIGxhc3Qgb25lLiBBZGRlZCB0ZXN0IHN1aXRlIHRvIHRlc3QgdGhpcywgYW5kIHB1dCB0ZXN0IGNhc2UgaW4gdGVzdC5pbmkKCiAgICAgUmV2aXNpb24gMS4xMCAgMjAwMC8xMS8yNCAyMDo0MDo1OCAgcmJvd2VuCiAgICAgVXBkYXRlZCBNQU5JRkVTVCB0byBoYXZlIGZpbGUgbGlzdCBvZiBuZXcgZmlsZXMgaW4gdC8KICAgICBVcGRhdGVkIEluaUZpbGVzLnBtIHRvIGhhdmUgbWVudGlvbiBvZiBzb3VyY2Vmb3JnZSBhZGRyZXNzZXMsIHJhdGhlciB0aGFuIHJjYm93ZW4uY29tIGFkZHJlc3NlcwogICAgIFJlZ2VuZXJhdGVkIFJFQURNRSBmcm9tIEluaUZpbGVzLnBtCgogICAgIFJldmlzaW9uIDEuOSAgMjAwMC8xMS8yMyAwNTowODowOCAgZ3JhaWwKICAgICBGaXhlZCBkb2N1bWVudGF0aW9uIGZvciBidWcgMTIyNDQzIC0gQ2hlY2sgdGhhdCBJTkkgZmlsZXMgY2FuIGJlIGNyZWF0ZWQgZnJvbSBzY3JhdGNoLgoKICAgICBSZXZpc2lvbiAxLjEuMS4xICAyMDAwLzExLzEwIDAzOjA0OjAxICByYm93ZW4KICAgICBJbml0aWFsIGNoZWNraW4gb2YgdGhlIENvbmZpZzo6SW5pRmlsZXMgc291cmNlIHRvIFNvdXJjZUZvcmdlCgogICAgIFJldmlzaW9uIDEuOCAgMjAwMC8xMC8xNyAwMTo1Mjo1NSAgcmJvd2VuCiAgICAgUGF0Y2ggZnJvbSBKZXJlbXkuIEZpeGVkICJkZWZpbmVkIiB3YXJuaW5ncy4KCiAgICAgUmV2aXNpb24gMS43ICAyMDAwLzA5LzIxIDExOjE5OjE3ICByYm93ZW4KICAgICBNb3N0bHkgZG9jdW1lbnRhdGlvbiBjaGFuZ2VzLiBJIG1vdmVkIHRoZSBjaGFuZ2UgbG9nIGludG8gdGhlIFBPRCByYXRoZXIKICAgICB0aGFuIGhhdmluZyBpdCBpbiBhIHNlcGFyYXRlIENoYW5nZXMgZmlsZS4gVGhpcyBhbGxvd3MgcGVvcGxlIHRvIHNlZSB0aGUKICAgICBjaGFuZ2VzIGluIHRoZSBSZWFkbWUgYmVmb3JlIHRoZXkgZG93bmxvYWQgdGhlIG1vZHVsZS4gTm93IEkganVzdAogICAgIG5lZWQgdG8gbWFrZSBzdXJlIEkgcmVtZW1iZXIgdG8gcmVnZW5lcmF0ZSB0aGUgUmVhZG1lIGV2ZXJ5IHRpbWUgSSBkbwogICAgIGEgY29tbWl0LgoKCiAgICAgMS42IFNlcHRlbWJlciAxOSwgMjAwMCBieSBKVywgQVMKICAgICAqIEFwcGxpZWQgc2V2ZXJhbCBwYXRjaGVzIHN1Ym1pdHRlZCB0byBtZSBieSBKZXJlbXkgYW5kIEFsZXguCiAgICAgKiBDaGFuZ2VkIHZlcnNpb24gbnVtYmVyIHRvIHRoZSBDVlMgdmVyc2lvbiBudW1iZXIsIHNvIHRoYXQgSSB3b24ndAogICAgIGhhdmUgdG8gdGhpbmsgYWJvdXQgY2hhbmdpbmcgaXQgZXZlciBhZ2Fpbi4gQmlnIHZlcnNpb24gY2hhbmdlCiAgICAgc2hvdWxkIG5vdCBiZSB0YWtlbiBhcyBhIGh1Z2UgbGVhcCBmb3J3YXJkLgoKICAgICAwLjEyIFNlcHRlbWJlciAxMywgMjAwMCBieSBKVy9XQURHCiAgICAgKiBBZGRlZCBkb2N1bWVudGF0aW9uIHRvIGNsYXJpZnkgYXV0b3ZpdmlmaWNhdGlvbiBpc3N1ZXMgd2hlbiAKICAgICBjcmVhdGluZyBuZXcgc2VjdGlvbnMKICAgICAqIEZpeGVkIHZlcnNpb24gbnVtYmVyIChPb3BzISkKCiAgICAgMC4xMSBTZXB0ZW1iZXIgMTMsIDIwMDAgYnkgSlcvV0FERwogICAgICogQXBwbGllZCBwYXRjaCB0byBHcm91cCBhbmQgR3JvdXBNZW1iZXJzIGZ1bmN0aW9ucyB0byByZXR1cm4gZW1wdHkKICAgICBsaXN0IHdoZW4gbm8gZ3JvdXBzIGFyZSBwcmVzZW50IChzdWJtaXR0ZWQgYnkgSm9obiBCYXNzLCBTZXAgMTMpCgogICAgIDAuMTAgU2VwdGVtYmVyIDEzLCAyMDAwIGJ5IEpXL1dBREcKICAgICAqIEZpeGVkIHJlZmVyZW5jZSBpbiBQT0QgdG8gUmVXcml0ZUZpbGUuIGNoYW5nZXMgdG8gUmV3cml0ZUNvbmZpZwogICAgICogQXBwbGllZCBwYXRjaCBmb3IgZmFpbGVkIG9wZW4gYnVnIHN1Ym1pdHRlZCBieSBNb3JkZWNoYWkgVC4gQWJ6dWcgQXVnIDE4CiAgICAgKiBEb2MnZCBiZWhhdmlvciBvZiBmYWlsZWQgb3BlbgogICAgICogUmVtb3ZlZCBwbGFubmVkIFNJRyB0ZXN0aW5nIGZyb20gdGVzdC5wbCBhcyBTSUdzIGhhdmUgYmVlbiByZW1vdmVkCiAgICAgKiBBcHBsaWVkIHBhdGNoIGZyb20gVGhpYmF1bHQgRGVmbGVycyB0byBmaXggYnVnIGluIHBhcmFtZXRlciBsaXN0CiAgICAgd2hlbiBhIHBhcmFtZXRlciB2YWx1ZSBpcyB1bmRlZgoKICAgICAwLjA5CiAgICAgSGV5ISBXaGVyZSdzIHRoZSBjaGFuZ2UgbG9nIGZvciAwLjA5PwoKICAgICAwLjA4CiAgICAgMjAwMC0wNy0zMCAgQWRyaWFuIFBoaWxsaXBzICA8YWRyaWFucEBwb3dlcnRlY2gubm8+CiAKICAgICAqIHRlc3QucGw6IEZpeGVkIHNvbWUgdGVzdHMgd2hpY2ggdXNlICRcLCBhbmQgbWFkZSB0aG9zZSB0aGF0IHRyeQogICAgIHRvIGNoZWNrIGEgbm9uIGV4aXN0YW50IHZhbCBjaGVjayBhZ2FpbnN0ICEgZGVmaW5lZC4KCiAgICAgKiBJbmlGaWxlcy5wbTogaG9wZWZ1bGx5IGZpeGVkIHVzZSBvZiAkXCB3aGVuIHRoaXMgaXMgdW5zZXQKICAgICAocHJvYmxlbXMgZm91bmQgd2hlbiBydW5uaW5nIHRlc3RzIHdpdGggLXcpLiAgU2ltaWxhciBwcm9ibGVtIHdpdGgKICAgICAkLyB3aGljaCBjYW4gYmUgdW5kZWZpbmVkIGFuZCB0cnlpbmcgdG8gcmV0dXJuIGEgdmFsIHdoaWNoIGRvZXMKICAgICBub3QgZXhpc3QuIE1vZGlmaWVkIHZhbCBkb2NzIHNlY3Rpb24gdG8gaW5kaWNhdGUgYSB1bmRlZiByZXR1cm4KICAgICB3aGVuIHRoaXMgb2NjdXJzLgoKICAgICAwLjA3CiAgICAgTG9va3MgbGlrZSB3ZSBtaXNzZWQgYSBjaGFuZ2UgbG9nIGZvciAwLjA3LiBCdW1tZXIuCgogICAgIDAuMDYgU3VuIEp1biAyNSwgMjAwMCBieSBEYW5pZWwgV2lua2VsbWFubgogICAgICogUGF0Y2ggZm9yIHVuaW5pdGlhbGl6ZWQgdmFsdWUgYnVnIGluIG5ld3ZhbCBhbmQgc2V0dmFsCiAgICAgCiAgICAgMC4wNSBTdW4gSnVuIDE4LCAyMDAwIGJ5IFJCT1cKICAgICAqIEFkZGVkIHNvbWV0aGluZyB0byBzaHV0IHVwIC13IG9uIFZFUlNJT05TCiAgICAgKiBSZW1vdmVkIHVudXNlZCB2YXJpYWJsZXMKCiAgICAgMC4wNCBUaHUgSnVuIDE1IC0gRnJpIEp1biAxNiwgMjAwMCBieSBKVy9XQURHCiAgICAgKiBBZGRlZCBzdXBwb3J0IGZvciAtaW1wb3J0IG9wdGlvbiBvbiAtPm5ldwogICAgICogQWRkZWQgc3VwcG9ydCBmb3IgdHlpbmcgYSBoYXNoCiAgICAgKiBFZGl0ZWQgUE9EIGZvciBncmFtbWVyLCBjbGFyaXR5IGFuZCB1cGRhdGVzCiAgICAgKiBVcGRhdGVkIHRlc3QucGwgZmlsZQogICAgICogRml4ZWQgYnVnIGluIG11bHRpbGluZS9zaW5nbGUgbGluZSBvdXRwdXQKICAgICAqIEZpeGVkIGJ1ZyBpbiBkZWZhdWx0IGhhbmRsaW5nIHdpdGggdGllIGludGVyZmFjZQogICAgICogQWRkZWQgYnVncyB0byB0ZXN0LnBsIGZvciByZWdyZXNzaW9uCiAgICAgKiBGaXhlZCBidWcgaW4ge2dyb3VwfSB2cy4ge2dyb3Vwc30gcHJvcGVydHkgKGZpcnN0IGlzIHZhbGlkKQogICAgICogRml4ZWQgcmV0dXJuIHZhbHVlIGZvciBlbXB0eSB7c2VjdHN9IG9yIHtwYXJtc317JHNlY3R9IGluCiAgICAgU2VjdGlvbnMgYW5kIFBhcmFtZXRlcnMgbWV0aG9kcwoKICAgICAwLjAzIFRodSBKdW4gMTUsIDIwMDAgYnkgUkJPVwogICAgICogTW9kaWZpY2F0aW9ucyB0byBwZXJtaXQgJ3VzZSBzdHJpY3QnLCBhbmQgdG8gZ2V0ICdtYWtlIHRlc3QnIHdvcmtpbmcKICAgICBhZ2Fpbi4KCiAgICAgMC4wMiBUdWUgSnVuIDEzLCAyMDAwIGJ5IFJCT1cKICAgICAqIEZpeGVkIGJ1ZyByZXBvcnRlZCBieSBCZXJuaWUgQ29zZWxsIC0gU2VjdGlvbnMsIFBhcmFtZXRlcnMsIAogICAgIGFuZCBHcm91cE1lbWJlcnMgcmV0dXJuIHVuZGVmIGlmIHRoZXJlIGFyZSBubyBzZWN0aW9ucywKICAgICBwYXJhbWV0ZXJzLCBvciBncm91cCBtZW1iZXJzLiBUaGVzZSBmdW5jdGlvbnMgbm93IHJldHVybgogICAgICgpIGlmIHRoZSBwYXJ0aWN1bGFyIHZhbHVlIGlzIHVuZGVmaW5lZC4KICAgICAqIEFkZGVkIHNvbWUgY29udHJpYnV0ZWQgZG9jdW1lbnRhdGlvbiwgZnJvbSBBbGV4IFNhdHJhcGEsIGV4cGxhaW5pbmcKICAgICBob3cgdGhlIGludGVybmFsIGRhdGEgc3RydWN0dXJlIHdvcmtzLiAKICAgICAqIFNldCB1cCBhIHByb2plY3Qgb24gU291cmNlRm9yZ2UuIChOb3QgYSBjaGFuZ2UsIGJ1dCB3b3J0aAogICAgIG5vdGluZykuCiAgICAgKiBBZGRlZCBHcm91cHMgbWV0aG9kIHRvIHJldHVybiBhIGxpc3Qgb2Ygc2VjdGlvbiBncm91cHMuCgogICAgIDAuMDEgIE1vbiBKdW4gMTIsIDIwMDAgYnkgUkJPVwogICAgIFNvbWUgZ2VuZXJhbCBjb2RlIGNsZWFudXAsIGluIHByZXBhcmF0aW9uIGZvciBjaGFuZ2VzIHRvCiAgICAgY29tZS4gUHV0IHVwIE1ham9yZG9tbyBtYWlsaW5nIGxpc3QgYW5kIHNlbnQgaW52aXRhdGlvbiB0bwogICAgIHZhcmlvdXMgcGVvcGxlIHRvIGpvaW4gaXQuCgo9Y3V0CiNbSlcgZm9yIGVkaXRvcl06bW9kZT1wZXJsOnRhYlNpemU9ODppbmRlbnRTaXplPTI6bm9UYWJzPXRydWU6aW5kZW50T25FbnRlcj10cnVlOgoK