U1dJRyAoU2ltcGxpZmllZCBXcmFwcGVyIGFuZCBJbnRlcmZhY2UgR2VuZXJhdG9yKQoKU2VlIHRoZSBDSEFOR0VTLmN1cnJlbnQgZmlsZSBmb3IgY2hhbmdlcyBpbiB0aGUgY3VycmVudCB2ZXJzaW9uLgpTZWUgdGhlIFJFTEVBU0VOT1RFUyBmaWxlIGZvciBhIHN1bW1hcnkgb2YgY2hhbmdlcyBpbiBlYWNoIHJlbGVhc2UuCgpWZXJzaW9uIDMuMC4wICgxNiBNYXIgMjAxNCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDE0LTAzLTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBDKysxMSBzdXBwb3J0IGluaXRpYWxseSBkZXZlbG9wZWQgYXMgQysrMHggc3VwcG9ydCBieSBNYXRldnogSmVrb3ZlYyBhcyBhIEdvb2dsZSBTdW1tZXIgb2YgQ29kZQogICAgICAgICAgICBwcm9qZWN0IGhhcyBiZWVuIGZ1cnRoZXIgZXh0ZW5kZWQuIFRoZSBDKysxMSBzdXBwb3J0IGlzIGNvbXByZWhlbnNpdmUsIGJ1dCBieSBubyBtZWFucyBjb21wbGV0ZQogICAgICAgICAgICBvciB3aXRob3V0IGxpbWl0YXRpb25zLiBGdWxsIGRldGFpbHMgZm9yIGVhY2ggbmV3IGZlYXR1cmUgaW4gQysrMTEgaXMgY292ZXJlZCBpbiB0aGUKICAgICAgICAgICAgQ1BsdXNQbHVzMTEuaHRtbCBjaGFwdGVyIGluIHRoZSBkb2N1bWVudGF0aW9uIHdoaWNoIGlzIGluY2x1ZGVkIGluIFNXSUcgYW5kIGFsc28gYXZhaWxhYmxlCiAgICAgICAgICAgIG9ubGluZSBhdCBodHRwOi8vd3d3LnN3aWcub3JnL0RvYzMuMC9DUGx1c1BsdXMxMS5odG1sLgoKMjAxNC0wMy0xNDogdi1mb3ItdmFuZGFsCiAgICAgICAgICAgIFtMdWFdIE51bWVyb3VzIEx1YSBpbXByb3ZlbWVudHM6CiAgICAgICAgICAgIDEuICVuc3BhY2Ugc3VwcG9ydCBoYXMgYmVlbiBhZGRlZC4gTmFtZXNwYWNlcyBhcmUgbWFwcGVkIHRvIHRhYmxlcyBpbiB0aGUgbW9kdWxlLCB3aXRoIHRoZSBzYW1lCiAgICAgICAgICAgICAgIG5hbWUgYXMgdGhlIEMrKyBuYW1lc3BhY2UuCiAgICAgICAgICAgIDIuIEluaGVyaXRhbmNlIGlzIG5vdyBoYW5kbGVkIGRpZmZlcmVudGx5LiBFYWNoIGNsYXNzIG1ldGF0YWJsZSBrZWVwcyBhIGxpc3Qgb2YgY2xhc3MgYmFzZXMgaW5zdGVhZAogICAgICAgICAgICAgICBvZiBtZXJnaW5nIGFsbCBtZW1iZXJzIG9mIGFsbCBiYXNlcyBpbnRvIHRoZSBkZXJpdmVkIGNsYXNzLgogICAgICAgICAgICAzLiBUaGUgbmV3IG1ldGF0YWJsZXMgcmVzdWx0IGluIGRpZmZlcmVuY2VzIGluIGFjY2Vzc2luZyBjbGFzcyBtZW1iZXJzLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJW1vZHVsZSBleGFtcGxlCiAgICAgICAgICAgICAgICAgc3RydWN0IFRlc3QgewogICAgICAgICAgICAgICAgICAgICBlbnVtIHsgVEVTVDEgPSAxMCwgVEVTVDIgPSAyMCB9OwogICAgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50IElDT05TVCA9IDEyOwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIE5vdyB0aGlzIGNhbiBiZSB1c2VkIGFzIGZvbGxvd3M6CiAgICAgICAgICAgICAgICAgICBwcmludChleGFtcGxlLlRlc3QuVEVTVDEpCiAgICAgICAgICAgICAgICAgICBwcmludChleGFtcGxlLlRlc3QuSUNPTlNUKQogICAgICAgICAgICAgICAgIFRoZSBvbGQgd2F5IHdhczoKICAgICAgICAgICAgICAgICAgIHByaW50KGV4YW1wbGUuVGVzdF9URVNUMSkKICAgICAgICAgICAgICAgICAgIHByaW50KGV4YW1wbGUuVGVzdF9JQ09OU1QpCgogICAgICAgICAgICA0LiBUaGUgc3BlY2lhbCBjbGFzcyBtZXRhdGFibGUgbWVtYmVyICIuY29uc3RydWN0b3IiIHdhcyByZW1vdmVkLiBOb3cgU1dJRyBnZW5lcmF0ZXMgdGhlIHByb3h5CiAgICAgICAgICAgICAgIGZ1bmN0aW9uIGJ5IGl0c2VsZiBhbmQgYXNzaWducyBpdCBkaXJlY3RseSB0byB0aGUgY2xhc3MgdGFibGUgIl9fY2FsbCIgbWV0aG9kLgogICAgICAgICAgICA1LiBlTHVhIHNob3VsZCBhbHNvIG5vdyBzdXBwb3J0IGluaGVyaXRhbmNlLgogICAgICAgICAgICA2LiAnY29uc3QnIHN1YnRhYmxlIGluIGVMdWEgaXMgY29uc2lkZXJlZCBkZXByZWNhdGVkLgoKICAgICAgICAgICAgQ2hhbmdlcyBpbiBiZWhhdmlvdXI6CiAgICAgICAgICAgIGEuIFlvdSBjYW4gbm8gbG9uZ2VyIGFzc2lnbiB0byBub24tZXhpc3RpbmcgY2xhc3MgbWVtYmVycyBpbiBjbGFzc2VzIHdpdGhvdXQgYSBfX3NldGl0ZW1fXyBtZXRob2QuCiAgICAgICAgICAgICAgIEl0IHdpbGwgY2F1c2UgYSBMdWEgZXJyb3IuCiAgICAgICAgICAgIGIuIFlvdSBjYW4gbm8gbG9uZ2VyIGl0ZXJhdGUgb3ZlciBhIG1vZHVsZSB0YWJsZSBhbmQgY29weSBldmVyeXRoaW5nIGludG8gdGhlIGdsb2JhbCBuYW1lc3BhY2UuCiAgICAgICAgICAgICAgIEFjdHVhbGx5LCB0aGlzIHdhcyBuZXZlciB0aGUgY2FzZSwgYnV0IGl0IGlzIG5vdyBleHBsaWNpdGx5IHByb2hpYml0ZWQuCiAgICAgICAgICAgIGMuIE5vdyBjaGFuZ2luZyBhIGJhc2UgY2xhc3Mgd2lsbCBpbW1lZGlhdGVseSBhZmZlY3QgYWxsIGRlcml2ZWQgY2xhc3Nlcy4KICAgICAgICAgICAgZC4gVGhlcmUgbWlnaHQgYmUgc29tZSBpc3N1ZXMgd2l0aCBpbmhlcml0YW5jZS4gQWx0aG91Z2ggdGhlIGJhc2VzIGl0ZXJhdGlvbiBzY2hlbWUgaXMgdGhlIHNhbWUKICAgICAgICAgICAgICAgYXMgd2FzIHVzZWQgZm9yIG1lcmdpbmcgYmFzZSBjbGFzc2VzIGludG8gZGVyaXZlZCBvbmUsIHNvbWUgdW5rbm93biBpc3N1ZXMgbWF5IGFyaXNlLgoKICAgICAgICAgICAgVGhlIG9sZCBtZXRhdGFibGUgYmVoYXZpb3VyIGNhbiBiZSByZXN0b3JlZCBieSB1c2luZyB0aGUgLW5vLW9sZC1tZXRhdGFibGUtYmluZGluZ3Mgb3B0aW9uLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxNC0wMy0wNjogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQ2hhbmdlIGluIGRlZmF1bHQgYmVoYXZpb3VyIHdyYXBwaW5nIEMrKyBib29sLiBPbmx5IGEgUHl0aG9uIFRydWUgb3IgRmFsc2UKICAgICAgICAgICAgd2lsbCBub3cgd29yayBmb3IgQysrIGJvb2wgcGFyYW1ldGVycy4gVGhpcyBmaXhlcyBvdmVybG9hZGluZyBib29sIHdpdGggb3RoZXIgdHlwZXMuCiAgICAgICAgICAgIFB5dGhvbiAyLjMgbWluaW11bSBpcyBub3cgcmVxdWlyZWQgZm9yIHdyYXBwaW5nIGJvb2wuCgogICAgICAgICAgICBXaGVuIHdyYXBwaW5nOgoKICAgICAgICAgICAgICBjb25zdCBjaGFyKiBvdmVybG9hZGVkKGJvb2wgdmFsdWUpIHsgcmV0dXJuICJib29sIjsgfQogICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG92ZXJsb2FkZWQoaW50IHZhbHVlKSB7IHJldHVybiAiaW50IjsgfQoKICAgICAgICAgICAgUHJldmlvdXMgYmVoYXZpb3VyOgogICAgICAgICAgICAgID4+PiBvdmVybG9hZGVkKEZhbHNlKQogICAgICAgICAgICAgICdpbnQnCiAgICAgICAgICAgICAgPj4+IG92ZXJsb2FkZWQoVHJ1ZSkKICAgICAgICAgICAgICAnaW50JwogICAgICAgICAgICAgID4+PiBvdmVybG9hZGVkKDApCiAgICAgICAgICAgICAgJ2ludCcKCiAgICAgICAgICAgIE5vdyB3ZSBnZXQgdGhlIGV4cGVjdGVkIGJlaGF2aW91cjoKICAgICAgICAgICAgICA+Pj4gb3ZlcmxvYWRlZChGYWxzZSkKICAgICAgICAgICAgICAnYm9vbCcKICAgICAgICAgICAgICA+Pj4gb3ZlcmxvYWRlZCgwKQogICAgICAgICAgICAgICdpbnQnCgogICAgICAgICAgICBUaGUgY29uc2VxdWVuY2UgaXMgd2hlbiB3cmFwcGluZyBib29sIGluIG5vbi1vdmVybG9hZGVkIGZ1bmN0aW9uczoKCiAgICAgICAgICAgICAgY29uc3QgY2hhciogYm9vbGZ1bmN0aW9uKGJvb2wgdmFsdWUpIHsgcmV0dXJuIHZhbHVlID8gInRydWUiIDogImZhbHNlIjsgfQoKICAgICAgICAgICAgVGhlIHByZXZpb3VzIGJlaGF2aW91ciB3YXMgdmVyeSBQeXRob25pYzoKICAgICAgICAgICAgICA+Pj4gYm9vbGZ1bmN0aW9uKCIiKQogICAgICAgICAgICAgICdmYWxzZScKICAgICAgICAgICAgICA+Pj4gYm9vbGZ1bmN0aW9uKCJoaSIpCiAgICAgICAgICAgICAgJ3RydWUnCiAgICAgICAgICAgICAgPj4+IGJvb2xmdW5jdGlvbigxMi4zNCkKICAgICAgICAgICAgICAndHJ1ZScKICAgICAgICAgICAgICA+Pj4gYm9vbGZ1bmN0aW9uKDApCiAgICAgICAgICAgICAgJ2ZhbHNlJwogICAgICAgICAgICAgID4+PiBib29sZnVuY3Rpb24oMSkKICAgICAgICAgICAgICAndHJ1ZScKCiAgICAgICAgICAgIE5vdyB0aGUgbmV3IGJlaGF2aW91ciBtb3JlIGFsb25nIHRoZSBsaW5lcyBvZiBDKysgZHVlIHRvIHN0cmljdGVyIHR5cGUgY2hlY2tpbmcuIFRoZQogICAgICAgICAgICBhYm92ZSBjYWxscyByZXN1bHQgaW4gYW4gZXhjZXB0aW9uIGFuZCBuZWVkIHRvIGJlIGV4cGxpY2l0bHkgY29udmVydGVkIGludG8gYSBib29sIGFzCiAgICAgICAgICAgIGZvbGxvd3M6CiAgICAgICAgICAgICAgPj4+IGJvb2xmdW5jdGlvbigwKQogICAgICAgICAgICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICAgICAgICAgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluIDxtb2R1bGU+CiAgICAgICAgICAgICAgVHlwZUVycm9yOiBpbiBtZXRob2QgJ2Jvb2xmdW5jdGlvbicsIGFyZ3VtZW50IDEgb2YgdHlwZSAnYm9vbCcKICAgICAgICAgICAgICA+Pj4gYm9vbGZ1bmN0aW9uKGJvb2woMCkpCiAgICAgICAgICAgICAgJ2ZhbHNlJwoKICAgICAgICAgICAgVGhlIG9sZCBiZWhhdmlvdXIgY2FuIGJlIHJlc3VycmVjdGVkIGJ5IHBhc3NpbmcgdGhlIC1EU1dJR19QWVRIT05fTEVHQUNZX0JPT0wgY29tbWFuZCBsaW5lCiAgICAgICAgICAgIHBhcmFtZXRlciB3aGVuIGV4ZWN1dGluZyBTV0lHLiBUeXBlbWFwcyBjYW4gb2YgY291cnNlIGJlIHdyaXR0ZW4gdG8gY3VzdG9taXNlIHRoZSBiZWhhdmlvdXIKICAgICAgICAgICAgZm9yIHNwZWNpZmljIHBhcmFtZXRlcnMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDE0LTAzLTA2OiB3c2Z1bHRvbgoJICAgIEZpeCBTRiBCdWcgIzEzNjMgLSBQcm9ibGVtIHdpdGggbWV0aG9kIG92ZXJsb2FkaW5nIHdoZW4gc29tZSBtZXRob2RzIGFyZSBhZGRlZCBieSAlZXh0ZW5kCiAgICAgICAgICAgIGFuZCBvdGhlcnMgYXJlIHJlYWwgbWV0aG9kcyBhbmQgdXNpbmcgdGVtcGxhdGUgZGVmYXVsdCBwYXJhbWV0ZXJzIHdpdGggc21hcnQgcG9pbnRlcnMuCiAgICAgICAgICAgIFRoaXMgaXMgbm90aWNlYWJsZSBhcyBhIHJlZ3Jlc3Npb24gc2luY2UgMi4wLjEyIHdoZW4gdXNpbmcgdGhlIGRlZmF1bHQgc21hcnQgcG9pbnRlcgogICAgICAgICAgICBoYW5kbGluZyBmb3Igc29tZSBsYW5ndWFnZXMgd2hlbiB0aGUgc21hcnQgcG9pbnRlciB3cmFwcyBzdGQ6Om1hcCBhbmQgb3RoZXIgU1RMIGNvbnRhaW5lcnMuCgoyMDE0LTAzLTAyOiB3c2Z1bHRvbgoJICAgIFtQeXRob25dIFNGIFBhdGNoICMzNDYgZnJvbSBKZW5zIEtydWVnZXIuIENvcnJlY3QgZXhjZXB0aW9uIHRocm93biBhdHRlbXB0aW5nIHRvCiAgICAgICAgICAgIGFjY2VzcyBhIG5vbi1leGlzdGVudCBDL0MrKyBnbG9iYWwgdmFyaWFibGUgb24gdGhlICdjdmFyJyBvYmplY3QuIFRoZSBleGNlcHRpb24gdGhyb3duCiAgICAgICAgICAgIHVzZWQgdG8gYmUgYSBOYW1lRXJyb3IuIEhvd2V2ZXIsIGFzIHRoaXMgYWNjZXNzIGlzIHZpYSBhIHByaW1hcnksIGFuIEF0dHJpYnV0ZUVycm9yCiAgICAgICAgICAgIGlzIG1vcmUgY29ycmVjdCBhbmQgc28gdGhlIGV4Y2VwdGlvbiB0aHJvd24gbm93IGlzIGFuIEF0dHJpYnV0ZUVycm9yLiBSZWZlcmVuY2U6CiAgICAgICAgICAgIGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvMi9yZWZlcmVuY2UvZXhwcmVzc2lvbnMuaHRtbCNhdHRyaWJ1dGUtcmVmZXJlbmNlcwoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxNC0wMy0wMTogd3NmdWx0b24KCSAgICBbUHl0aG9uXSBQYXRjaCAjMTQzIEZpeCB0eXBlIHNob3duIHdoZW4gdXNpbmcgdHlwZSgpIHRvIGluY2x1ZGUgdGhlIG1vZHVsZSBhbmQgcGFja2FnZQogICAgICAgICAgICBuYW1lIHdoZW4gdXNpbmcgLWJ1aWx0aW4uCgoyMDE0LTAzLTAxOiB3c2Z1bHRvbgoJICAgIFtQeXRob25dIFNGIHBhdGNoICMzNDcgRml4IG1pc3NpbmcgYXJndW1lbnQgY291bnQgY2hlY2tpbmcgd2l0aCAtbW9kZXJuLgogICAgICAgICAgICBGaXhlcyByZWdyZXNzaW9uIGludHJvZHVjZWQgd2hlbiBidWlsdGluIGNoYW5nZXMgd2VyZSBpbnRyb2R1Y2VkIGluIFNXSUctMi4wLjMuCgoyMDE0LTAyLTIxOiB3c2Z1bHRvbgoJICAgIFtQSFBdIEZpeCB3YXJuaW5nIHN1cHByZXNzaW9uIHVzaW5nICV3YXJuZmlsdGVyIGZvciBQSFAgcmVzZXJ2ZWQgY2xhc3MgbmFtZXMuCgoyMDE0LTAyLTE5OiBvbGx5CgkgICAgW0x1YV0gQWRkIGtleXdvcmQgd2FybmluZ3MgZm9yIEx1YSBrZXl3b3JkcyBhbmQgQmFzaWMgRnVuY3Rpb25zLgoKMjAxNC0wMi0xOTogb2xseQoJICAgIC1XYWxsa3cgbm93IGluY2x1ZGVzIGtleXdvcmRzIGZvciBhbGwgbGFuZ3VhZ2VzIHdpdGgga2V5d29yZAoJICAgIHdhcm5pbmdzIChwcmV2aW91c2x5IEdvIGFuZCBSIHdlcmUgbWlzc2luZykuCgoyMDE0LTAyLTE5OiBvbGx5CgkgICAgW1BIUF0gVXBkYXRlIHRoZSBsaXN0cyBvZiBQSFAga2V5d29yZHMgd2l0aCBuZXcgb25lcyBmcm9tIFBIUCA1LjQKCSAgICBhbmQgbmV3ZXIgKGFuZCBzb21lIG1pc3Npbmcgb25lcyBmcm9tIDUuMykuICBSZXNlcnZlZCBQSFAgY29uc3RhbnRzCgkgICAgbmFtZXMgYXJlIG5vdyBjaGVja2VkIGFnYWluc3QgZW51bSB2YWx1ZXMgYW5kIGNvbnN0YW50cywgaW5zdGVhZAoJICAgIG9mIGFnYWluc3QgZnVuY3Rpb24gYW5kIG1ldGhvZCBuYW1lcy4gIEJ1aWx0LWluIFBIUCBmdW5jdGlvbiBuYW1lcwoJICAgIG5vIGxvbmdlciBtYXRjaCBtZXRob2RzIGFkZGVkIGJ5ICVleHRlbmQuICBGdW5jdGlvbnMgYW5kIG1ldGhvZHMKCSAgICBuYW1lZCAnX19zbGVlcCcsICdfX3dha2V1cCcsICdub3QnLCAncGFyZW50Jywgb3IgJ3ZpcnR1YWwnIGFyZSBubwoJICAgIGxvbmdlciBuZWVkbGVzc2x5IHJlbmFtZWQuCgoyMDE0LTAyLTE1OiB3c2Z1bHRvbgoJICAgIEZpeCB0aGUgJSRpc21lbWJlciAlcmVuYW1lIHByZWRpY2F0ZXMgdG8gYWxzbyBhcHBseSB0byBtZW1iZXJzIGFkZGVkIHZpYSAlZXh0ZW5kLgoKICAgICAgICAgICAgQWRkICUkaXNleHRlbmRtZW1iZXIgZm9yICVyZW5hbWUgb2YgbWVtYmVycyBhZGRlZCB2aWEgJWV4dGVuZC4gVGhpcyBjYW4gYmUgdXNlZCB0bwogICAgICAgICAgICBkaXN0aW5ndWlzaCBiZXR3ZWVuIG5vcm1hbCBjbGFzcy9zdHJ1Y3QgbWVtYmVycyBhbmQgJWV4dGVuZCBtZW1iZXJzLiBGb3IgZXhhbXBsZQogICAgICAgICAgICAnJSRpc21lbWJlciwgJSRub3QgJSRpc2V4dGVuZG1lbWJlcicgd2lsbCBub3cgaWRlbnRpZnkganVzdCBjbGFzcy9zdHJ1Y3QgbWVtYmVycy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTQtMDItMTY6IGhmYWxjaWMKICAgICAgICAgICAgW1B5dGhvbl0gUGF0Y2ggIzEzNyAtIGZpeCBjcmFzaGVzL2V4Y2VwdGlvbnMgaW4gZXhjZXB0aW9uIGhhbmRsaW5nIGluIFB5dGhvbiAzLjMKCjIwMTQtMDItMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBBZGQgc3VwcG9ydCBmb3IgdGhlIGNkYXRhIGxpYnJhcnkuCgoyMDE0LTAyLTA4OiB2a2FsaW5pbgogICAgICAgICAgICBOZXN0ZWQgY2xhc3Mgc3VwcG9ydCBhZGRlZC4gVGhpcyBwcmltYXJpbHkgYWxsb3dzIFNXSUcgdG8gcHJvcGVybHkgcGFyc2UgbmVzdGVkCiAgICAgICAgICAgIGNsYXNzZXMgYW5kIGtlZXAgdGhlIG5lc3RlZCBjbGFzcyBpbmZvcm1hdGlvbiBpbiB0aGUgcGFyc2UgdHJlZS4gSmF2YSBhbmQgQyMKICAgICAgICAgICAgaGF2ZSB1dGlsaXNlZCB0aGlzIGluZm9ybWF0aW9uIHdyYXBwaW5nIHRoZSBDKysgbmVzdGVkIGNsYXNzZXMgYXMgSmF2YS9DIwogICAgICAgICAgICBuZXN0ZWQgY2xhc3Nlcy4gVGhlIHJlbWFpbmluZyB0YXJnZXQgbGFuZ3VhZ2VzIGlnbm9yZSBuZXN0ZWQgY2xhc3NlcyBhcyBpbgogICAgICAgICAgICBwcmV2aW91cyB2ZXJzaW9ucy4gSGVscCBpcyBuZWVkZWQgYnkgdXNlcnMgb2YgdGhlc2UgcmVtYWluaW5nIGxhbmd1YWdlcyB0bwogICAgICAgICAgICBkZXNpZ24gaG93IEMrKyBuZXN0ZWQgY2xhc3NlcyBjYW4gYmUgYmVzdCB3cmFwcGVkLiBQbGVhc2UgdGFsayB0byB1cyBvbiB0aGUKICAgICAgICAgICAgc3dpZy1kZXZlbCBtYWlsaW5nIGxpc3QgaWYgeW91IHRoaW5rIHlvdSBjYW4gaGVscC4KCiAgICAgICAgICAgIFByZXZpb3VzbHksIHRoZXJlIHdhcyBsaW1pdGVkIG5lc3RlZCBjbGFzcyBzdXBwb3J0LiBOZXN0ZWQgY2xhc3NlcyB3ZXJlIHRyZWF0ZWQKICAgICAgICAgICAgYXMgb3BhcXVlIHBvaW50ZXJzLiBIb3dldmVyLCB0aGUgIm5lc3RlZHdvcmthcm91bmQiIGZlYXR1cmUgcHJvdmlkZWQgYSB3YXkgdG8KICAgICAgICAgICAgd3JhcCBhIG5lc3RlZCBjbGFzcyBhcyBpZiBpdCB3YXMgYSBnbG9iYWwgY2xhc3MuIFRoaXMgZmVhdHVyZSBubyBsb25nZXIgZXhpc3RzCiAgICAgICAgICAgIGFuZCBpcyByZXBsYWNlZCBieSB0aGUgbmV3ICJmbGF0bmVzdGVkIiBmZWF0dXJlLiBUaGlzIGVmZmVjdGl2ZWx5IGRvZXMgdGhlIHNhbWUKICAgICAgICAgICAgdGhpbmcgd2l0aCBsZXNzIG1hbnVhbCBjb2RlIHRvIGJlIHdyaXR0ZW4uIFBsZWFzZSBzZWUgdGhlICdOZXN0ZWQgY2xhc3NlcycKICAgICAgICAgICAgc2VjdGlvbiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBpbiBTV0lHUGx1cy5odG1sIGlmIHlvdSB3ZXJlIHByZXZpb3VzbHkgdXNpbmcgdGhpcwogICAgICAgICAgICBmZWF0dXJlLgoKICAgICAgICAgICAgU1dJRyBub3cgcGFyc2VzIHRoZSBjb250ZW50cyBvZiBuZXN0ZWQgY2xhc3NlcyB3aGVyZSBwcmV2aW91c2x5IGl0IGRpZCBub3QuIFlvdQogICAgICAgICAgICBtYXkgZmluZCB0aGF0IHlvdSB3aWxsIG5lZWQgdG8gbWFrZSBhZGp1c3RtZW50cyB0byB5b3VyIGludGVyZmFjZSBmaWxlIGFzCiAgICAgICAgICAgIGVmZmVjdGl2ZWx5IGV4dHJhIGNvZGUgaXMgYmVpbmcgd3JhcHBlZC4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTQtMDItMDY6IGdqYW5zc2VucwogICAgICAgICAgICBbR3VpbGVdIFBhdGNoICMxMzMuIE1ha2Ugc2NtIHRvIHN0cmluZyBjb252ZXJzaW9uIHdvcmsgd2l0aCBub24tYXNjaWkgc3RyaW5ncy4KICAgICAgICAgICAgR3VpbGUgMiBoYXMgYSBjb21wbGV0ZWx5IHJld3JpdHRlbiBzdHJpbmcgaW1wbGVtZW50YXRpb24uIFNXSUcgbWFkZSBzb21lIGFzc3VtcHRpb25zCiAgICAgICAgICAgIHRoYXQgYXJlIG5vIGxvbmdlciB2YWxpZCBhcyB0byB0aGUgaW50ZXJuYWxzIG9mIGd1aWxlJ3Mgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgoKMjAxNC0wMS0zMDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGQgbmV3IHN3aWd0eXBlX2lub3V0LmkgbGlicmFyeSBjb250YWluaW5nIFNXSUdUWVBFIComIE9VVFBVVCB0eXBlbWFwcy4KCiAgICAgICAgICAgIEV4YW1wbGUgdXNhZ2Ugd3JhcHBpbmc6CgogICAgICAgICAgICAgIHZvaWQgZihYWFggKiYgeCkgeyB4ID0gbmV3IFhYWCgxMTEpOyB9CgogICAgICAgICAgICB3b3VsZCBiZToKCiAgICAgICAgICAgICAgWFhYIHggPSBudWxsOwogICAgICAgICAgICAgIGYob3V0IHgpOwogICAgICAgICAgICAgIC8vIHVzZSB4CiAgICAgICAgICAgICAgeC5EaXNwb3NlKCk7IC8vIG1hbnVhbGx5IGNsZWFyIG1lbW9yeSBvciBvdGhlcndpc2UgbGVhdmUgb3V0IGFuZCBsZWF2ZSBpdCB0byB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IKCjIwMTQtMDEtMjE6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBBZGQgJWdvX2ltcG9ydCBkaXJlY3RpdmUuCgoyMDE0LTAxLTIxOiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gQWRkIHN1cHBvcnQgZm9yIEdvIDEuMywgbm90IHlldCByZWxlYXNlZC4KCjIwMTQtMDEtMjA6IHdzZnVsdG9uCiAgICAgICAgICAgIERpcmVjdG9yIGV4Y2VwdGlvbnMgKFN3aWc6OkRpcmVjdG9yRXhjZXB0aW9uKSBub3cgZGVyaXZlIGZyb20gc3RkOjpleGNlcHRpb24KICAgICAgICAgICAgYW5kIGhlbmNlIHByb3ZpZGUgdGhlIHdoYXQoKSBtZXRob2QuIEluIFB5dGhvbiBhbmQgUnVieSwgdGhpcyByZXBsYWNlcyB0aGUgbm93CiAgICAgICAgICAgIGRlcHJlY2F0ZWQgRGlyZWN0b3JFeGNlcHRpb246OmdldE1lc3NhZ2UoKSBtZXRob2QuCgoyMDE0LTAxLTE0OiBkaW9yY2V0eQogICAgICAgICAgICBQYXRjaCAjMTEyIC0gRml4IHN5bWJvbCByZXNvbHV0aW9uIGludm9sdmluZyBzY29wZXMgdGhhdCBoYXZlIG11bHRpcGxlIGxldmVscwogICAgICAgICAgICBvZiB0eXBlZGVmcyAtIGZpeGVzIHNvbWUgdGVtcGxhdGUgcmVzb2x1dGlvbnMgYXMgd2VsbCBhcyBzb21lIHR5cGVtYXAgc2VhcmNoZXMuCgoyMDE0LTAxLTExOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggYW5kIGRvY3VtZW50IHRoZSBuYXR1cmFsdmFyIGZlYXR1cmUgb3ZlcnJpZGUgYmVoYXZpb3VyIC0gdGhlIG5hdHVyYWx2YXIKICAgICAgICAgICAgZmVhdHVyZSBhdHRhY2hlZCB0byBhIHZhcmlhYmxlIG5hbWUgaGFzIHByZWNlZGVuY2Ugb3ZlciB0aGUgbmF0dXJhbHZhcgogICAgICAgICAgICBmZWF0dXJlIGF0dGFjaGVkIHRvIHRoZSB2YXJpYWJsZSdzIHR5cGUuIFRoZSBvdmVycmlkaW5nIHdhcyBub3Qgd29ya2luZwogICAgICAgICAgICB3aGVuIHR1cm5pbmcgdGhlIGZlYXR1cmUgb2ZmIG9uIHRoZSB2YXJpYWJsZSdzIG5hbWUuCgogICAgICAgICAgICBGaXggc28gdGhhdCBhbnkgdXNlIG9mIHRoZSBuYXR1cmFsdmFyIGZlYXR1cmUgd2lsbCBvdmVycmlkZSB0aGUgZ2xvYmFsCiAgICAgICAgICAgIHNldHRpbmcuIFByZXZpb3VzbHkgd2hlbiBzZXQgZ2xvYmFsbHkgYnkgLW5hdHVyYWx2YXIgb3IgJW1vZHVsZShuYXR1cmFsdmFyPTEpLAogICAgICAgICAgICB1c2Ugb2YgdGhlIG5hdHVyYWx2YXIgZmVhdHVyZSB3YXMgbm90IGFsd2F5cyBob25vdXJlZC4KCjIwMTQtMDEtMDY6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBGaXggYnVnIHRoYXQgYnJva2UgdXNpbmcgZGlyZWN0b3JzIGZyb20gYSB0aHJlYWQgbm90CgkgICAgY3JlYXRlZCBieSBHby4KCjIwMTMtMTItMjQ6IHB0b211bGlrCiAgICAgICAgICAgIFtQeXRob25dIFNGIEJ1ZyAjMTI5NwoKICAgICAgICAgICAgUmVzb2x2ZSBzZXZlcmFsIGlzc3VlcyByZWxhdGVkIHRvIHB5dGhvbiBpbXBvcnRzLgogICAgICAgICAgICBGb3IgZXhhbXBsZSwgaXQncyBub3cgcG9zc2libGUgdG8gaW1wb3J0IG1vZHVsZXMgaGF2aW5nIHRoZSBzYW1lIG1vZHVsZQogICAgICAgICAgICBuYW1lcywgYnV0IGJlbG9uZ2luZyBpbiBkaWZmZXJlbnQgcGFja2FnZXMuCiAgICAgICAgICAgIAogICAgICAgICAgICBGcm9tIHRoZSB1c2VyJ3Mgdmlld3BvaW50LCB0aGlzIHBhdGNoIGdpdmVzIGEgbGl0dGxlIGJpdCBtb3JlIGNvbnRyb2wgb24KICAgICAgICAgICAgaW1wb3J0IHN0YXRlbWVudHMgZ2VuZXJhdGVkIGJ5IFNXSUcuIFRoZSB1c2VyIG1heSBjaG9vc2UgdG8gdXNlIHJlbGF0aXZlCiAgICAgICAgICAgIG9yIGFic29sdXRlIGltcG9ydHMuCiAgICAgICAgICAgIAogICAgICAgICAgICBTb21lIGRldGFpbHM6CiAgICAgICAgICAgICAgLSB3ZSAoc3RpbGwpIGdlbmVyYXRlIGltcG9ydCBzdGF0ZW1lbnRzIGluIHRoZSBmb3JtICdpbXBvcnQgYS5iLmMnIHdoaWNoCiAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byBhYnNvbHV0ZSBpbXBvcnRzIGluIHB5dGhvbjMgYW5kICh0aGUgb25seSBhdmFpbGFibGUpCiAgICAgICAgICAgICAgICBhbWJpZ3VvdXMgb25lIGluIHB5dGhvbjIuCiAgICAgICAgICAgICAgLSBhZGRlZCAtcmVsYXRpdmVpbXBvcnQgb3B0aW9uIHRvIHVzZSBleHBsaWNpdCByZWxhdGl2ZSBpbXBvcnQgc3ludGF4CiAgICAgICAgICAgICAgICAocHl0aG9uMyksCgogICAgICAgICAgICBUaGUgIlB5dGhvbiBQYWNrYWdlcyIgc2VjdGlvbiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBkaXNjdXNzZXMgaG93IHRvIHdvcmsKICAgICAgICAgICAgd2l0aCBpbXBvcnRpbmcgcGFja2FnZXMgaW5jbHVkaW5nIHRoZSBuZXcgLXJlbGF0aXZlaW1wb3J0IGNvbW1hbmQgbGluZSBvcHRpb24uCgoyMDEzLTEyLTIzOiB2YWR6CiAgICAgICAgICAgIFtPY3RhdmUsIFBlcmwsIFB5dGhvbiwgUiwgUnVieSwgVGNsXSBDaGFuZ2UgdGhlIGxlbmd0aCBvZiBzdHJpbmdzIGNyZWF0ZWQgZnJvbSBmaXhlZC1zaXplIGNoYXIKICAgICAgICAgICAgYnVmZmVycyBpbiBDIGNvZGUuCgogICAgICAgICAgICBUaGlzIGlzIGEgcG90ZW50aWFsIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGJyZWFrOiBhICJjaGFyIGJ1Zls1XSIgY29udGFpbmluZyAiaG9cMGxhIiB3YXMKICAgICAgICAgICAgcmV0dXJuZWQgYXMgYSBzdHJpbmcgb2YgbGVuZ3RoIDUgYmVmb3JlLCBidXQgaXMgcmV0dXJuZWQgYXMgYSBzdHJpbmcgb2YgbGVuZ3RoIDIgbm93LiBBbHNvLAogICAgICAgICAgICBpdCB3YXMgcG9zc2libGUgdG8gYXNzaWduIGEgKG5vbi1OVUwtdGVybWluYXRlZCkgc3RyaW5nICJoZWxsbyIgdG8gc3VjaCBhIGJ1ZmZlciBiZWZvcmUgYnV0CiAgICAgICAgICAgIG5vdyB0aGlzIGZhaWxzIGFuZCBvbmx5ICJoZWxvIiBjYW4gZml0LgoKICAgICAgICAgICAgQXBwbHkgImNoYXIgRklYU0laRVtBTlldIiB0eXBlbWFwcyB0byBleHBsaWNpdGx5IGNob29zZSB0aGUgb2xkIGJlaGF2aW91ci4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTMtMTItMjM6IHRhbGJ5CiAgICAgICAgICAgIFtQZXJsXSBBZGQgc3VwcG9ydCBmb3IgZGlyZWN0b3JzLgoKMjAxMy0xMi0xODogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIERvbid0IHJlcXVpcmUgdGhhdCBHbyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYmUgc2V0CgkgICAgd2hlbiBydW5uaW5nIGV4YW1wbGVzIG9yIHRlc3RzdWl0ZSB3aGVuIHVzaW5nIEdvIDEgb3IKCSAgICBsYXRlci4KCjIwMTMtMTItMTc6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBSZW1vdmUgLWxvbmdzaXplIG9wdGlvbiAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksCgkgICAgaWdub3JlIGl0IGlmIHNlZW4pLgoKMjAxMy0xMi0xNzogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEFkZCAtZ28tcGtncGF0aCBvcHRpb24uCgoyMDEzLTEyLTE2OiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gVXBkYXRlIGZvciBHbyAxLjIgcmVsZWFzZS4gIEFkZCBzdXBwb3J0IGZvciBsaW5raW5nCgkgICAgU1dJRyBjb2RlIGRpcmVjdGx5IGludG8gZXhlY3V0YWJsZSwgcmF0aGVyIHRoYW4gdXNpbmcgYQoJICAgIHNoYXJlZCBsaWJyYXJ5LgoKMjAxMy0xMi0xMzogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEFkZCBTV0lHIHNvdXJjZSBmaWxlIG5hbWUgYXMgY29tbWVudHMgaW4gZ2VuZXJhdGVkCgkgICAgZmlsZXMuICBUaGlzIGNhbiBiZSB1c2VkIGJ5IEdvIGRvY3VtZW50YXRpb24gdG9vbHMuCgoyMDEzLTEyLTEyOiBqbGV2ZXF1ZQoJICAgIFtMdWFdIEZpeCB0eXBvICh3Y2hhciBpbnN0ZWFkIG9mIHdjaGFyX3QpIHdoaWNoIG1hZGUgd2NoYXIuaQoJICAgIGZvciBMdWEgdXNlbGVzcy4KCjIwMTMtMTItMTI6IHZtaWtsb3MKCSAgICBbUEhQXSBQSFAncyBwZWN1bGlhciBjYWxsLXRpbWUgcGFzcy1ieS1yZWZlcmVuY2UgZmVhdHVyZSB3YXMKCSAgICBkZXByZWNhdGVkIGluIFBIUCA1LjMgYW5kIHJlbW92ZWQgaW4gUEhQIDUuNCwgc28gdXBkYXRlIHRoZSBSRUYKCSAgICB0eXBlbWFwcyBpbiBwaHBwb2ludGVycy5pIHRvIHNwZWNpZnkgcGFzcy1ieS1yZWZlcmVuY2UgaW4gdGhlCgkgICAgZnVuY3Rpb24gZGVmaW5pdGlvbi4gIEV4YW1wbGVzL3BocC9wb2ludGVyIGhhcyBiZWVuIHVwZGF0ZWQKCSAgICBhY2NvcmRpbmdseS4KCjIwMTMtMTItMTI6IG9sbHkKCSAgICBbUEhQXSBUaGUgdXNhZ2Ugb2YgJGlucHV0IGluIFBIUCBkaXJlY3Rvcm91dCB0eXBlbWFwcyBoYXMgYmVlbgoJICAgIGNoYW5nZWQgdG8gYmUgY29uc2lzdGVudCB3aXRoIG90aGVyIGxhbmd1YWdlcy4gIFRoZSB0eXBlbWFwcwoJICAgIHByb3ZpZGVkIGJ5IFNXSUcgaGF2ZSBiZWVuIHVwZGF0ZWQgYWNjb3JkaW5nbHksIGJ1dCBpZiB5b3UKCSAgICBoYXZlIHdyaXR0ZW4geW91ciBvd24gZGlyZWN0b3JvdXQgdHlwZW1hcHMsIHlvdSdsbCBuZWVkIHRvCgkgICAgdXBkYXRlICRpbnB1dCB0byAmJGlucHV0IChvciBtYWtlIGVxdWl2YWxlbnQgY2hhbmdlcykuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDEzLTExLTI3OiB2YWR6CiAgICAgICAgICAgIFtDIywgSmF2YSwgUHl0aG9uXSBBZGQgc3RkX2F1dG9fcHRyLmkgZGVmaW5pbmcgdHlwZW1hcHMgZm9yIHJldHVybmluZyBzdGQ6OmF1dG9fcHRyPD4uCgoyMDEzLTExLTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFwcGx5IHBhdGNoICM3OSBmcm9tIEJyYW50IEt5c2VyCiAgICAgICAgICAgICAgLSBSZW1vdmUgdXNpbmcgZGlyZWN0aXZlcyBmcm9tIHRoZSBnZW5lcmF0ZWQgQyMgY29kZSBhbmQgZnVsbHkgcXVhbGlmeSB0aGUgdXNlIG9mIGFsbCAuTkVUCiAgICAgICAgICAgICAgICBmcmFtZXdvcmsgdHlwZXMgaW4gb3JkZXIgdG8gbWluaW1pemUgcG90ZW50aWFsIG5hbWUgY29sbGlzaW9ucyBmcm9tIGlucHV0IGZpbGVzIGRlZmluaW5nCiAgICAgICAgICAgICAgICB0eXBlcywgbmFtZXNwYWNlLCBldGMgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIC5ORVQgZnJhbWV3b3JrIG1lbWJlcnMuCiAgICAgICAgICAgICAgLSBHbG9iYWxseSBxdWFsaWZ5IHRoZSB1c2Ugb2YgLk5FVCBmcmFtZXdvcmsgdHlwZXMgaW4gdGhlIFN5c3RlbSBuYW1lc3BhY2UKICAgICAgICAgICAgICAtIFJlbW92ZSAuTkVUIDEuMSBzdXBwb3J0LCAuTkVUIDIgaXMgdGhlIG1pbmltdW0gZm9yIHRoZSBDIyBtb2R1bGUKCiAgICAgICAgICAgIFRoaXMgaXMgYSBwb3RlbnRpYWwgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgYnJlYWsgaWYgY29kZSBoYXMgYmVlbiBhZGRlZCByZWx5aW5nIG9uIHRoZXNlIHVzaW5nCiAgICAgICAgICAgIHN0YXRlbWVudHMgdGhhdCB1c2VkIHRvIGJlIGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgdXNpbmcgU3lzdGVtOwogICAgICAgICAgICAgIHVzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKCiAgICAgICAgICAgIFRoZSBxdWljayBmaXggdG8gYWRkIHRoZXNlIGJhY2sgaW4gaXMgdG8gYWRkIHRoZSAtRFNXSUcyX0NTSEFSUCBjb21tYW5kIGxpbmUgb3B0aW9uIHdoZW4KICAgICAgICAgICAgZXhlY3V0aW5nIFNXSUcuIFNlZSBDU2hhcnAuaHRtbCBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm8uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDEzLTExLTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IHNvbWUgY29ybmVyIGNhc2VzIGZvciB0aGUgJHBhY2thZ2VwYXRoLyRqYXZhY2xhc3NuYW1lIHNwZWNpYWwgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgoKMjAxMy0xMS0wNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFwcGx5IHBhdGNoICM5MSBmcm9tIE1hcnZpbiBHcmVlbmJlcmcgLSBBZGQgZGlyZWN0b3I6ZXhjZXB0IGZlYXR1cmUgZm9yIGltcHJvdmVkCiAgICAgICAgICAgIGV4Y2VwdGlvbiBoYW5kbGluZyBpbiBkaXJlY3RvciBtZXRob2RzIGZvciBKYXZhLgoKMjAxMy0xMC0xNTogdmFkegogICAgICAgICAgICBBbGxvdyB1c2luZyBcbCwgXEwsIFx1LCBcVSBhbmQgXEUgaW4gdGhlIHN1YnN0aXR1dGlvbiBwYXJ0IG9mICUocmVnZXg6L3BhdHRlcm4vc3Vic3QvKQogICAgICAgICAgICBpbnNpZGUgJXJlbmFtZSB0byBjaGFuZ2UgdGhlIGNhc2Ugb2YgdGhlIHRleHQgYmVpbmcgcmVwbGFjZWQuCgoyMDEzLTEwLTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBbQ0ZGSV0gQXBwbHkgIzk2IC0gc3VwZXJjbGFzcyBub3QgbGlzcGlmeQoKMjAxMy0xMC0xMjogd3NmdWx0b24KICAgICAgICAgICAgTWVyZ2UgaW4gQysrMTEgc3VwcG9ydCBmcm9tIHRoZSBnc29jMjAwOS1tYXRldnogYnJhbmNoIHdoZXJlIE1hdGV2eiBKZWtvdmVjIGZpcnN0CiAgICAgICAgICAgIHN0YXJ0ZWQgdGhlIEMrKzB4IGFkZGl0aW9ucy4gRG9jdW1lbnRhdGlvbiBvZiB0aGUgQysrMTEgZmVhdHVyZXMgc3VwcG9ydGVkIGlzIGluIGEKICAgICAgICAgICAgbmV3IENoYXB0ZXIgb2YgdGhlIGRvY3VtZW50YXRpb24sICJTV0lHIGFuZCBDKysxMSIgaW4gRG9jL01hbnVhbC9DUGx1c1BsdXMxMS5odG1sLgoKMjAxMy0xMC0wNDogd3NmdWx0b24KICAgICAgICAgICAgRml4ICVuYXR1cmFsdmFyIG5vdCBoYXZpbmcgYW55IGFmZmVjdCBvbiB0ZW1wbGF0ZWQgY2xhc3NlcyBpbnN0YW50aWF0ZWQgd2l0aCBhbgogICAgICAgICAgICBlbnVtIGFzIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgdHlwZS4gUHJvYmxlbSByZXBvcnRlZCBieSBWYWRpbSBaZWl0bGluLgoKMjAxMy0wOS0yMDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCBhIG1lbW9yeSBsZWFrIGZvciB0aGUgamF2YSBjaGFyICoqU1RSSU5HX0FSUkFZIHR5cGVtYXBzLgoKVmVyc2lvbiAyLjAuMTIgKDkgRmViIDIwMTQpCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxNC0wMS0xNjogd3NmdWx0b24KICAgICAgICAgICAgW1BIUF0gRml4IGNvbXBpbGF0aW9uIGVycm9yIGluIFpUUyBtb2RlICg2NCBiaXQgd2luZG93cykgZHVlIHRvIGluY29ycmVjdCBwbGFjZW1lbnQKICAgICAgICAgICAgb2YgVFNSTUxTX0ZFVENIKCkgaW4gU1dJR19QaHBfR2V0TW9kdWxlKCkgYXMgcmVwb3J0ZWQgYnkgTWFyayBEYXdzb24tQnV0dGVyd29ydGguCgoyMDE0LTAxLTEzOiBrd3dldHRlCiAgICAgICAgICAgIFtPY3RhdmVdIHVwZGF0ZSBzdXBwb3J0IHRvIE9jdGF2ZSB2ZXJzaW9uIDMuOC4wCgogICAgICAgICAgICAtIE9jdGF2ZSAzLjguMCBubyBsb25nZXIgZGVmaW5lcyBPQ1RBVkVfQVBJX1ZFUlNJT05fTlVNQkVSLCBidXQgMy44LjEKICAgICAgICAgICAgICB3aWxsIGRlZmluZSBPQ1RBVkVfe01BSk9SLE1JTk9SLFBBVENIfV9WRVJTSU9OIGluc3RlYWQ6IHNlZQogICAgICAgICAgICAgICAgaHR0cDovL2hnLnNhdmFubmFoLmdudS5vcmcvaGd3ZWIvb2N0YXZlL3Jldi9iNmI2ZTBkYzcwMGUKICAgICAgICAgICAgICBTbyB3ZSBub3cgdXNlIGEgbmV3IG1hY3JvIFNXSUdfT0NUQVZFX1BSRVJFUShtYWpvcixtaW5vcixwYXRjaCkgdG8KICAgICAgICAgICAgICBlbmFibGUgZmVhdHVyZXMgcmVxdWlyaW5nIE9jdGF2ZSB2ZXJzaW9uIG1ham9yLm1pbm9yLnBhdGNoIG9yIGxhdGVyLgoKICAgICAgICAgICAgICBGb3IgT2N0YXZlIHZlcnNpb25zIHByaW9yIHRvIDMuOC4xLCB3ZSByZWNvbnN0cnVjdCB2YWx1ZXMgZm9yCiAgICAgICAgICAgICAgT0NUQVZFX3tNQUpPUixNSU5PUixQQVRDSH1fVkVSU0lPTiBiYXNlZCBvbiBPQ1RBVkVfQVBJX1ZFUlNJT05fTlVNQkVSLAogICAgICAgICAgICAgIGV4dHJhY3RlZCBmcm9tIE9jdGF2ZSdzIENoYW5nZUxvZ3MuIEFuIGFkZGl0aW9uYWwgaGFjayBpcyBuZWVkZWQgdG8KICAgICAgICAgICAgICBkaXN0aW5ndWlzaCBiZXR3ZWVuIE9jdGF2ZSA8PSAzLjIueCBhbmQgMy44LjAsIG5laXRoZXIgb2Ygd2hpY2ggZGVmaW5lCiAgICAgICAgICAgICAgT0NUQVZFX0FQSV9WRVJTSU9OX05VTUJFUi4KCiAgICAgICAgICAgIC0gT2N0YXZlIDMuOC4wIGRlcHJlY2F0ZXMgc3ltYm9sX3RhYmxlOjp2YXJyZWYoKSwgc28gcmVtb3ZlIGl0cyB1c2UKICAgICAgICAgICAgICBmb3IgdGhpcyBhbmQgZnV0dXJlIHZlcnNpb25zIG9mIE9jdGF2ZS4KCiAgICAgICAgICAgIC0gT2N0YXZlIDMuOC4wIHJlbW92ZXMgb2N0YXZlX3ZhbHVlOjppc19yZWFsX25kX2FycmF5KCksIHVzZWQgaW4KICAgICAgICAgICAgICBvY3RhdmVfc3dpZ190eXBlOjpkaW1zKCkuIEl0cyB1c2UgaXMgbm90IHJlcXVpcmVkIGhlcmUsIHNvIHJlbW92ZSBpdC4KCiAgICAgICAgICAgIC0gUmV0ZXN0ZWQgYWdhaW5zdCBPY3RhdmUgdmVyc2lvbnMgMy4wLjUsIDMuMi40LCAzLjQuMywgMy42LjQsIGFuZCAzLjguMC4KCiAgICAgICAgICAgIC0gVXBkYXRlZCBPY3RhdmUgZG9jdW1lbnRhdGlvbiB3aXRoIHRlc3RlZCBPY3RhdmUgdmVyc2lvbnMsIGFuZCBhZGRlZCBhCiAgICAgICAgICAgICAgd2FybmluZyBhZ2FpbnN0IHVzaW5nIHZlcnNpb25zIDw9IDMueC54LCB3aGljaCBhcmUgbm8gbG9uZ2VyIHRlc3RlZC4KCjIwMTMtMTItMjI6IHdzZnVsdG9uCiAgICAgICAgICAgIEMrKzExIHN1cHBvcnQgZm9yIG5ldyB2ZXJzaW9ucyBvZiBlcmFzZSBhbmQgaW5zZXJ0IGluIHRoZSBTVEwgY29udGFpbmVycy4KCiAgICAgICAgICAgIFRoZSBlcmFzZSBhbmQgaW5zZXJ0IG1ldGhvZHMgaW4gdGhlIGNvbnRhaW5lcnMgdXNlIGNvbnN0X2l0ZXJhdG9yIGluc3RlYWQKICAgICAgICAgICAgb2YgaXRlcmF0b3IgaW4gQysrMTEuICBUaGVyZSBhcmUgdGltZXMgd2hlbiB0aGUgbWV0aG9kcyB3cmFwcGVkIG11c3QgbWF0Y2gKICAgICAgICAgICAgdGhlIHBhcmFtZXRlcnMgZXhhY3RseS4gU3BlY2lmaWNhbGx5IHdoZW4gZnVsbCB0eXBlIGluZm9ybWF0aW9uIGZvcgogICAgICAgICAgICB0ZW1wbGF0ZSB0eXBlcyBpcyBtaXNzaW5nIG9yIFNXSUcgZmFpbHMgdG8gbG9vayB1cCB0aGUgdHlwZSBjb3JyZWN0bHksCiAgICAgICAgICAgIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlaW5jbHVkZSA8c3RkX3ZlY3Rvci5pPgogICAgICAgICAgICAgIHR5cGVkZWYgZmxvYXQgUmVhbDsKICAgICAgICAgICAgICAldGVtcGxhdGUoUmVhbFZlY3Rvcikgc3RkOjp2ZWN0b3I8UmVhbD47CgogICAgICAgICAgICBTV0lHIGRvZXMgbm90IGZpbmQgc3RkOjp2ZWN0b3I8UmVhbD46Oml0ZXJhdG9yIGJlY2F1c2UgJXRlbXBsYXRlIHVzaW5nCiAgICAgICAgICAgIHR5cGVkZWZzIGRvZXMgbm90IGFsd2F5cyB3b3JrIGFuZCBzbyBTV0lHIGRvZXNuJ3Qga25vdyBpZiB0aGUgdHlwZSBpcwogICAgICAgICAgICBjb3B5YWJsZSBhbmQgc28gdXNlcyBTd2lnVmFsdWVXcmFwcGVyPGl0ZXJhdG9yPiB3aGljaCBkb2VzCiAgICAgICAgICAgIG5vdCBzdXBwb3J0IGNvbnZlcnNpb24gdG8gYW5vdGhlciB0eXBlIChjb25zdF9pdGVyYXRvcikuIFRoaXMgcmVzdWx0ZWQKICAgICAgICAgICAgaW4gY29tcGlsYXRpb24gZXJyb3JzIHdoZW4gdXNpbmcgdGhlIEMrKzExIHZlcnNpb24gb2YgdGhlIGNvbnRhaW5lcnMuCgogICAgICAgICAgICBDbG9zZXMgIzczCgoyMDEzLTEwLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gRml4IFNGICMxMzQwIC0gVmlzdWFsIFN0dWRpbyBjb21waWxlIGVycm9yIGluIEMrKyB3cmFwcGVycyBkdWUgdG8gI2luY2x1ZGUgPGV4Y2VwdGlvbj4KICAgICAgICAgICAgd2l0aGluIGV4dGVybiAiQyIgYmxvY2suCgoyMDEzLTEwLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggU0YgIzEzNDUgLSBNaXNzaW5nICNpbmNsdWRlIDxzdGRkZWYuaD4gZm9yIG9mZnNldG9mIHdoZW4gdXNpbmcgLWJ1aWx0aW4uCgoyMDEzLTEwLTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBBcHBseSAjOTIgLSBtaXNzaW5nIHJldHVybiBzdGF0ZW1lbnRzIGZvciBTV0lHX0x1YV9hZGRfbmFtZXNwYWNlX2RldGFpbHMoKQogICAgICAgICAgICBhbmQgU1dJR19MdWFfbmFtZXNwYWNlX3JlZ2lzdGVyKCkuCgpWZXJzaW9uIDIuMC4xMSAoMTUgU2VwIDIwMTMpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTMtMDktMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSBGaXggYXR0ZW1wdCB0byBmcmVlIGEgbm9uLWhlYXAgb2JqZWN0IGluIE9VVFBVVCB0eXBlbWFwcyBmb3I6CiAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgKk9VVFBVVAogICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgKk9VVFBVVAogICAgICAgICAgICAgIHNpZ25lZCBsb25nIGxvbmcgKk9VVFBVVAogICAgICAgICAgICAgIGNoYXIgKk9VVFBVVAogICAgICAgICAgICAgIHNpZ25lZCBjaGFyKk9VVFBVVAogICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqT1VUUFVUCgoyMDEzLTA5LTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBQdWxsIEdpdCBwYXRjaCAjNjIuCiAgICAgICAgICAgICAgMSkgU3RhdGljIG1lbWJlcnMgYW5kIHN0YXRpYyBmdW5jdGlvbnMgaW5zaWRlIGNsYXNzIGNhbiBiZSBhY2Nlc3NlZCBhcwogICAgICAgICAgICAgICAgIE1vZHVsZU5hbWUuQ2xhc3NOYW1lLkZ1bmN0aW9uTmFtZSAoTWVtYmVyTmFtZSByZXNwZWN0aXZlbHkpLiBPbGQgd2F5IHN1Y2ggYXMKICAgICAgICAgICAgICAgICBNb2R1bGVOYW1lLkNsYXNzTmFtZV9GdW5jdGlvbk5hbWUgc3RpbGwgd29ya3MuCiAgICAgICAgICAgICAgMikgU2FtZSBnb2VzIGZvciBlbnVtcyBpbnNpZGUgY2xhc3NlczogTW9kdWxlTmFtZS5DbGFzc05hbWUuRW51bVZhbHVlMSBldGMuCgoyMDEzLTA5LTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBbVVRMXSBJbmZpbml0eSBpcyBub3cgYnkgZGVmYXVsdCBhbiBhY2NlcHRhYmxlIHZhbHVlIGZvciB0eXBlICdmbG9hdCcuIFRoaXMgZml4IG1ha2VzCiAgICAgICAgICAgIHRoZSBoYW5kbGluZyBvZiB0eXBlICdmbG9hdCcgYW5kICdkb3VibGUnIHRoZSBzYW1lLiBUaGUgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgdGhlCiAgICAgICAgICAgIEM5OSBpc2Zpbml0ZSgpIG1hY3JvLCBvciBvdGhlcndpc2Ugc29tZSBwbGF0Zm9ybSBkZXBlbmRlbnQgZXF1aXZhbGVudHMsIHRvIGJlIGF2YWlsYWJsZS4KCiAgICAgICAgICAgIFVzZXJzIHJlcXVpcmluZyB0aGUgb2xkIGJlaGF2aW91ciBvZiBub3QgYWNjZXB0aW5nIGluZmluaXR5LCBjYW4gZGVmaW5lIGEgJ2NoZWNrJyB0eXBlbWFwCiAgICAgICAgICAgIHdoZXJldmVyIGEgZmxvYXQgaXMgdXNlZCwgc3VjaCBhczoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoY2hlY2ssZnJhZ21lbnQ9IjxmbG9hdC5oPiIpIGZsb2F0LCBjb25zdCBmbG9hdCAmICV7CiAgICAgICAgICAgICAgICBpZiAoJDEgPCAtRkxUX01BWCB8fCAkMSA+IEZMVF9NQVgpIHsKICAgICAgICAgICAgICAgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX1R5cGVFcnJvciwgIk92ZXJmbG93IGluIHR5cGUgZmxvYXQiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxMy0wOC0zMDogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gUHVsbCBHaXQgcGF0Y2ggIzgxOiBJbmNsdWRlIEx1YSBlcnJvciBsb2N1cyBpbiBTV0lHIGVycm9yIG1lc3NhZ2VzLiAgCiAgICAgICAgICAgIFRoaXMgaXMgc3RhbmRhcmQgaW5mb3JtYXRpb24gaW4gTHVhIGVycm9yIG1lc3NhZ2VzLCBhbmQgbWFrZXMgaXQgbXVjaAogICAgICAgICAgICBlYXNpZXIgdG8gZmluZCBidWdzLgoKMjAxMy0wOC0yOTogd3NmdWx0b24KICAgICAgICAgICAgUHVsbCBHaXQgcGF0Y2ggIzc1OiBIYW5kbGUgVVRGLTggZmlsZXMgd2l0aCBCT00gYXQgYmVnaW5uaW5nIG9mIGZpbGUuIFdhcyBnaXZpbmcgYW4KICAgICAgICAgICAgJ0lsbGVnYWwgdG9rZW4nIHN5bnRheCBlcnJvci4KCjIwMTMtMDgtMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gUHVsbCBHaXQgcGF0Y2ggIzc3OiBBbGxvdyBleHBvcnRpbmcgc3RkOjptYXAgdXNpbmcgbm9uLWRlZmF1bHQgY29tcGFyaXNvbiBmdW5jdGlvbi4KCjIwMTMtMDgtMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICVpbXBsaWNpdGNvbnYgaXMgaW1wcm92ZWQgZm9yIG92ZXJsb2FkZWQgZnVuY3Rpb25zLiBMaWtlIGluIEMrKywgdGhlIG1ldGhvZHMKICAgICAgICAgICAgd2l0aCB0aGUgYWN0dWFsIHR5cGVzIGFyZSBjb25zaWRlcmVkIGJlZm9yZSB0cnlpbmcgaW1wbGljaXQgY29udmVyc2lvbnMuIEV4YW1wbGU6CgogICAgICAgICAgICAgICVpbXBsaWNpdGNvbnYgQTsKICAgICAgICAgICAgICBzdHJ1Y3QgQSB7CiAgICAgICAgICAgICAgICBBKGludCBpKTsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIGNsYXNzIENDQyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgIGludCB4eChpbnQgaSkgeyByZXR1cm4gMTE7IH0KICAgICAgICAgICAgICAgICAgaW50IHh4KGNvbnN0IEEmIGkpIHsgcmV0dXJuIDIyOyB9CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgcHl0aG9uIGNvZGU6CgogICAgICAgICAgICAgIENDQygpLnh4KC0xKQoKICAgICAgICAgICAgd2lsbCBub3cgcmV0dXJuIDExIGluc3RlYWQgb2YgMjIgLSB0aGUgaW1wbGljaXQgY29udmVyc2lvbiBpcyBub3QgZG9uZS4KCjIwMTMtMDgtMjM6IG9sbHkKCSAgICBbUHl0aG9uXSBGaXggY2xhbmcrKyB3YXJuaW5nIGluIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUuCgoyMDEzLTA4LTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAlaW1wbGljaXRjb252IHdpbGwgbm93IGFjY2VwdCBOb25lIHdoZXJlIHRoZSBpbXBsaWNpdCBjb252ZXJzaW9uIHRha2VzIGEgQy9DKysgcG9pbnRlci4KICAgICAgICAgICAgUHJvYmxlbSBoaWdobGlnaHRlZCBieSBCbyBQZW5nLiBDbG9zZXMgU0YgcGF0Y2ggIzIzMC4KCjIwMTMtMDgtMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIFNGIFBhdGNoICMzMjYgZnJvbSBLcmlzIFRoaWVsZW1hbnMgLSBSZW1vdmUgU3dpZ1B5T2JqZWN0X3ByaW50IGFuZCBTd2lnUHlPYmplY3Rfc3RyIGFuZAogICAgICAgICAgICBtYWtlIHRoZSBnZW5lcmF0ZWQgd3JhcHBlciB1c2UgdGhlIGRlZmF1bHQgcHl0aG9uIGltcGxlbWVudGF0aW9ucywgd2hpY2ggd2lsbCBmYWxsIGJhY2sgdG8gcmVwcgogICAgICAgICAgICAoZm9yIC1idWlsdGluIG9wdGlvbikuCgogICAgICAgICAgICBBZHZhbnRhZ2VzOgogICAgICAgICAgICAtIGl0IGF2b2lkcyB0aGUgc3dpZyB1c2VyIGhhdmluZyB0byBqdW1wIHRocm91Z2ggaG9vcHMgdG8gZ2V0IHByaW50IHRvIHdvcmsgYXMgZXhwZWN0ZWQgd2hlbgogICAgICAgICAgICAgIHJlZGVmaW5pbmcgcmVwci9zdHIgc2xvdHMuCiAgICAgICAgICAgIC0gdHlwaW5nIHRoZSBuYW1lIG9mIGEgdmFyaWFibGUgb24gdGhlIHB5dGhvbiBwcm9tcHQgbm93IHByaW50cyB0aGUgcmVzdWx0IG9mIGEgKHBvc3NpYmx5IHJlZGVmaW5lZCkKICAgICAgICAgICAgICByZXByLCB3aXRob3V0IHRoZSBzd2lnIHVzZXIgaGF2aW5nIHRvIGRvIGFueSBleHRyYSB3b3JrLgogICAgICAgICAgICAtIHdoZW4gcmVkZWZpbmluZyByZXByLCB0aGUgc3dpZyB1c2VyIGRvZXNuJ3QgbmVjZXNzYXJpbHkgaGF2ZSB0byByZWRlZmluZSBzdHIgYXMgaXQgd2lsbCBjYWxsIHRoZQogICAgICAgICAgICAgIHJlZGVmaW5lZCByZXByCiAgICAgICAgICAgIC0gdGhlIGJlaGF2aW91ciBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIHdpdGhvdXQgdGhlIC1idWlsdGluIG9wdGlvbiB3aGlsZSByZXF1aXJpbmcgbm8gZXh0cmEgd29yawogICAgICAgICAgICAgIGJ5IHRoZSB1c2VyIChhc2lkZSBmcm9tIGFkZGluZyB0aGUgJWZlYXR1cmUoInB5dGhvbjpzbG90Li4uKSBzdGF0ZW1lbnRzIG9mIGNvdXJzZSkKCiAgICAgICAgICAgIERpc2FkdmFudGFnZToKICAgICAgICAgICAgLSBkZWZhdWx0IHN0cigpIHdpbGwgZ2l2ZSBkaWZmZXJlbnQgKGJ1dCBjbGVhcmVyPykgb3V0cHV0IG9uIHN3aWdnZWQgY2xhc3NlcwoKMjAxMy0wNy0zMDogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbiwgUnVieV0gRml4ICM2NCAjNjU6IE1pc3NpbmcgY29kZSBpbiBzdGQ6Om11bHRpbWFwIHdyYXBwZXJzLiBQcmV2aW91c2x5IGFuIGluc3RhbnRpYXRpb24KICAgICAgICAgICAgb2YgYSBzdGQ6Om1hcCB3YXMgZXJyb25lb3VzbHkgcmVxdWlyZWQgaW4gYWRkaXRpb24gdG8gYW4gaW5zdGFudGlhdGlvbiBvZiBzdGQ6Om11bHRpbWFwIHdpdGggdGhlCiAgICAgICAgICAgIHNhbWUgdGVtcGxhdGUgcGFyYW1ldGVycyB0byBwcmV2ZW50IGNvbXBpbGF0aW9uIGVycm9ycyBmb3IgdGhlIHdyYXBwZXJzIG9mIGEgc3RkOjptdWx0aW1hcC4KCjIwMTMtMDctMTQ6IGpvZXF1YW50CiAgICAgICAgICAgIFtSXSBDaGFuZ2UgdHlwZXMgZmlsZSB0byBhbGxvdyBmb3IgU0VYUCByZXR1cm4gdmFsdWVzCgoyMDEzLTA3LTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBZGQgJXB5dGhvbmJlZ2luIGRpcmVjdGl2ZSB3aGljaCB3b3JrcyBsaWtlICVweXRob25jb2RlLCBleGNlcHQgdGhlIHNwZWNpZmllZCBjb2RlIGlzCiAgICAgICAgICAgIGFkZGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGdlbmVyYXRlZCAucHkgZmlsZS4gVGhpcyBpcyBwcmltYXJpbHkgbmVlZGVkIGZvciBpbXBvcnRpbmcgZnJvbQogICAgICAgICAgICBfX2Z1dHVyZV9fIHN0YXRlbWVudHMgcmVxdWlyZWQgdG8gYmUgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLiBFeGFtcGxlOgoKICAgICAgICAgICAgICAlcHl0aG9uYmVnaW4gJXsKICAgICAgICAgICAgICBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCiAgICAgICAgICAgICAgcHJpbnQoIkxvYWRpbmciLCAiV2hpenoiLCAiQmFuZyIsIHNlcD0nIC4uLiAnKQogICAgICAgICAgICAgICV9CgoyMDEzLTA3LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBcHBseSBTRiBwYXRjaCAjMzQwIC0gVW5pbml0aWFsaXplZCB2YXJpYWJsZSBmaXggaW4gU1dJR19QeXRob25fTm9uRHluYW1pY1NldEF0dHIKICAgICAgICAgICAgd2hlbiB1c2luZyAtYnVpbHRpbi4KCjIwMTMtMDctMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob24sIFJ1YnksIE9jYW1sXSBBcHBseSBTRiBwYXRjaCAjMzQxIC0gZml4IGEgY29uc3RfY2FzdCBpbiBnZW5lcmF0ZWQgY29kZSB0aGF0IHdhcyBnZW5lcmF0aW5nCiAgICAgICAgICAgIGEgPDo6IGRpZ3JhcGggd2hlbiB1c2luZyB0aGUgdW5hcnkgc2NvcGUgb3BlcmF0b3IgKDo6KSAoZ2xvYmFsIHNjb3BlKSBpbiBhIHRlbXBsYXRlIHR5cGUuCgoyMDEzLTA3LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBZGQgU0YgcGF0Y2ggIzM0MiBmcm9tIENocmlzdGlhbiBEZWxiYWVyZSB0byBmaXggc29tZSBkaXJlY3RvciBjbGFzc2VzIGNyYXNoaW5nIG9uCiAgICAgICAgICAgIG9iamVjdCBkZWxldGlvbiB3aGVuIHVzaW5nIC1idWlsdGluLiBGaXhlcyBTRiBidWcgIzEzMDEuCgoyMDEzLTA2LTExOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBZGQgU1dJR19QWVRIT05fSU5URVJQUkVURVJfTk9fREVCVUcgbWFjcm8gd2hpY2ggY2FuIGJlIGRlZmluZWQgdG8gdXNlIHRoZSBSZWxlYXNlIHZlcnNpb24KICAgICAgICAgICAgb2YgdGhlIFB5dGhvbiBpbnRlcnByZXRlciBpbiBEZWJ1ZyBidWlsZHMgb2YgdGhlIHdyYXBwZXJzLiBUaGUgVmlzdWFsIFN0dWRpbyAuZHNwIGV4YW1wbGUKICAgICAgICAgICAgZmlsZXMgaGF2ZSBiZWVuIG1vZGlmaWVkIHRvIHVzZSB0aGlzIHNvIHRoYXQgRGVidWcgYnVpbGRzIHdpbGwgbm93IHdvcmsgd2l0aG91dCBoYXZpbmcKICAgICAgICAgICAgdG8gaW5zdGFsbCBvciBidWlsZCBhIERlYnVnIGJ1aWxkIG9mIHRoZSBpbnRlcnByZXRlci4KCjIwMTMtMDYtMDc6IHdzZnVsdG9uCgkgICAgW1J1YnldIEdpdCBpc3N1ZSAjNTIuIEZpeCByZWdyZXNzaW9uIHdpdGggbWlzc2luZyByYl9jb21wbGV4X25ldyBmdW5jdGlvbiBmb3IgUnVieQogICAgICAgICAgICB2ZXJzaW9ucyBwcmlvciB0byAxLjkgdXNpbmcgc3RkOjpjb21wbGV4IHdyYXBwZXJzIGlmIGp1c3QgdXNpbmcgc3RkOjpjb21wbGV4IGFzIGFuIG91dHB1dCB0eXBlLgogICAgICAgICAgICBBbHNvIGZpeCB0aGUgQ29tcGxleCBoZWxwZXIgZnVuY3Rpb25zIGV4dGVybmFsIHZpc2liaWxpdHkgKHRvIHN0YXRpYyBieSBkZWZhdWx0KS4KCjIwMTMtMDYtMDQ6IG9sbHkKCSAgICBbUEhQXSBGaXggU1dJR19aVFNfQ29udmVydFJlc291cmNlUHRyKCkgbm90IHRvIGRlcmVmZXJlbmNlIE5VTEwKCSAgICBpZiB0aGUgdHlwZSBsb29rdXAgZmFpbHMuCgpWZXJzaW9uIDIuMC4xMCAoMjcgTWF5IDIwMTMpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTMtMDUtMjU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBQeXRob24gMyBpbmNvbnNpc3RlbmN5IHdoZW4gbmVnYXRpdmUgbnVtYmVycyBhcmUgcGFzc2VkCiAgICAgICAgICAgIHdoZXJlIGEgcGFyYW1ldGVyIGV4cGVjdHMgYW4gdW5zaWduZWQgQyB0eXBlLiBBbiBPdmVyRmxvdyBlcnJvciBpcwogICAgICAgICAgICBub3cgY29uc2lzdGVudGx5IHRocm93biBpbnN0ZWFkIG9mIGEgVHlwZUVycm9yLgoKMjAxMy0wNS0yNTogQXJ0ZW0gU2VyZWJyaXlza2l5CiAgICAgICAgICAgIFNWTiBQYXRjaCB0aWNrZXQgIzMzOCAtIGZpeGVzIHRvICVhdHRyaWJ1dGUgbWFjcm9zIGZvciB0ZW1wbGF0ZSB1c2FnZQogICAgICAgICAgICB3aXRoICVhcmcuCgoyMDEzLTA1LTE5OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggY2NhY2hlLXN3aWcgaW50ZXJuYWwgZXJyb3IgYnVnIGR1ZSB0byBwcmVtYXR1cmUgZmlsZSBjbGVhbnVwLgoKICAgICAgICAgICAgRml4ZXMgU0YgYnVnIDEzMTkgd2hpY2ggc2hvd3MgdXAgYXMgYSBmYWlsdXJlIGluIHRoZSBjY2FjaGUgdGVzdHMgb24KICAgICAgICAgICAgRGViaWFuIDY0IGJpdCBXaGVlenksIHBvc3NpYmx5IGJlY2F1c2UgRU5BQkxFX1pMSUIgaXMgZGVmaW5lZC4KCiAgICAgICAgICAgIFRoaXMgaXMgYSBjb3JuZXIgY2FzZSB3aGljaCB3aWxsIGJlIGhpdCB3aGVuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBmaWxlcwogICAgICAgICAgICBpbiB0aGUgY2FjaGUgaXMgc2V0IHRvIGJlIHF1aXRlIGxvdyAoLUYgb3B0aW9uKSwgcmVzdWx0aW5nIGluIGEgY2FjaGUgbWlzcy4KCjIwMTMtMDUtMDk6IGt3d2V0dGUKICAgICAgICAgICAgW09jdGF2ZV0gRml4IGJ1Z3MgaW4gT2N0YXZlIG1vZHVsZSBsb2FkaW5nOgogICAgICAgICAgICAtIGZpeCBhIG1lbW9yeSBsZWFrIGluIHNldHRpbmcgb2YgZ2xvYmFsIHZhcmlhYmxlcwogICAgICAgICAgICAtIGluc3RhbGwgZnVuY3Rpb25zIG9ubHkgb25jZSwgdG8gc3BlZWQgdXAgbW9kdWxlIGxvYWRzCgoyMDEzLTA0LTI4OiBnamFuc3NlbnMKICAgICAgICAgICAgW0d1aWxlXSBVcGRhdGVzIGluIGd1aWxlIG1vZHVsZToKICAgICAgICAgICAgLSBBZGQgc3VwcG9ydCBmb3IgZ3VpbGUgMi4wCiAgICAgICAgICAgIC0gRHJvcCBzdXBwb3J0IGZvciBndWlsZSAxLjYKICAgICAgICAgICAgLSBEcm9wIHN1cHBvcnQgZm9yIGdlbmVyYXRpbmcgd3JhcHBlcnMgdXNpbmcgZ3VpbGUncyBnaCBpbnRlcmZhY2UuCiAgICAgICAgICAgICAgQWxsIGdlbmVyYXRlZCB3cmFwcGVycyB3aWxsIHVzZSB0aGUgc2NtIGludGVyZmFjZSBmcm9tIG5vdyBvbi4KICAgICAgICAgICAgLSBEZXByZWNhdGUgLWdoIGFuZCAtc2NtIG9wdGlvbnMuIFRoZXkgYXJlIG5vIGxvbmdlciBuZWVkZWQuCiAgICAgICAgICAgICAgQSB3YXJuaW5nIHdpbGwgYmUgaXNzdWVkIHdoZW4gdGhlc2Ugb3B0aW9ucyBhcmUgc3RpbGwgdXNlZC4KICAgICAgICAgICAgLSBGaXggYWxsIHRlc3RzIGFuZCBleGFtcGxlcyB0byBoYXZlIGEgc3VjY2Vzc2Z1bCB0cmF2aXMgdGVzdAoKMjAxMy0wNC0xODogd3NmdWx0b24KICAgICAgICAgICAgQXBwbHkgUGF0Y2ggIzM2IGZyb20gSmVzdXMgTG9wZXogdG8gYWRkIHN1cHBvcnQgZm9yICRkZXNjcmlwdG9yKCkgc3BlY2lhbCB2YXJpYWJsZSBtYWNybyBleHBhbnNpb24gCiAgICAgICAgICAgIGluIGZyYWdtZW50cy4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVmcmFnbWVudCgibmFtZURlc2NyaXB0b3IiLCAiaGVhZGVyIikKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKm5hbWVEZXNjcmlwdG9yID0gIiRkZXNjcmlwdG9yKE5hbWUpIjsKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgd2hpY2ggd2lsbCBnZW5lcmF0ZSBpbnRvIHRoZSB3cmFwcGVyIGlmIHRoZSBmcmFnbWVudCBpcyB1c2VkOgoKICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqbmFtZURlc2NyaXB0b3IgPSAiU1dJR1RZUEVfTmFtZSI7CgoyMDEzLTA0LTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggU0YgQnVnICM0MjggLSBTeW50YXggZXJyb3Igd2hlbiBwcmVwcm9jZXNzb3IgbWFjcm9zIGFyZSBkZWZpbmVkIGluc2lkZSBvZiBlbnVtIGxpc3RzLCBzdWNoIGFzOgoKICAgICAgICAgICAgICB0eXBlZGVmIGVudW0gewogICAgICAgICAgICAgICAgZVplcm8gPSAwCiAgICAgICAgICAgICAgI2RlZmluZSBPTkUgMQogICAgICAgICAgICAgIH0gRUZvbzsKCiAgICAgICAgICAgIFRoZSBtYWNyb3MgYXJlIHNpbGVudGx5IGlnbm9yZWQuCgoyMDEzLTA0LTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFB1bGwgcGF0Y2ggIzM0IGZyb20gQnJhbnRLeXNlciB0byBmaXggc21hcnQgcG9pbnRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCBkaXJlY3RvcnMuCgoyMDEzLTA0LTE1OiBrd3dldHRlCiAgICAgICAgICAgIFtPY3RhdmVdIEZpeCBidWdzIGluIG91dHB1dCBvZiBjbGVhbnVwIGNvZGUuCiAgICAgICAgICAgIC0gQ2xlYW51cCBjb2RlIGlzIG5vdyB3cml0dGVuIGFsc28gYWZ0ZXIgdGhlICJmYWlsOiIgbGFiZWwsIHNvIGl0IHdpbGwgYmUgY2FsbGVkIGlmCiAgICAgICAgICAgICAgYSBTV0lHX2V4Y2VwdGlvbiBpcyByYWlzZWQgYnkgdGhlIHdyYXBwaW5nIGZ1bmN0aW9uLCBjb25zaXN0ZW50IHdpdGggb3RoZXIgbW9kdWxlcy4KICAgICAgICAgICAgLSBPY3RhdmUgbW9kdWxlIG5vdyBhbHNvIHJlY29nbmlzZXMgdGhlICIkY2xlYW51cCIgc3BlY2lhbCB2YXJpYWJsZSwgaWYgbmVlZGVkLgoKMjAxMy0wNC0wODoga3d3ZXR0ZQogICAgICAgICAgICBBZGQgLU1QIG9wdGlvbiB0byBTV0lHIGZvciBnZW5lcmF0aW5nIHBob255IHRhcmdldHMgZm9yIGFsbCBkZXBlbmRlbmNpZXMuCiAgICAgICAgICAgIC0gUHJldmVudHMgbWFrZSBmcm9tIGNvbXBsYWluaW5nIGlmIGhlYWRlciBmaWxlcyBoYXZlIGJlZW4gZGVsZXRlZCBiZWZvcmUKICAgICAgICAgICAgICB0aGUgZGVwZW5kZW5jeSBmaWxlIGhhcyBiZWVuIHVwZGF0ZWQuCiAgICAgICAgICAgIC0gTW9kZWxsZWQgb24gc2ltaWxhciBvcHRpb24gaW4gR0NDLgoKMjAxMy0wNC0wOTogb2xseQoJICAgIFtQSFBdIEFkZCBtaXNzaW5nIGRpcmVjdG9yaW4gdHlwZW1hcCBmb3IgY2hhciogYW5kIGNoYXJbXSB3aGljaAoJICAgIGZpeGVzIGRpcmVjdG9yX3N0cmluZyB0ZXN0Y2FzZSBmYWlsdXJlLgoKMjAxMy0wNC0wNTogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIFNGIEJ1ZyAjMTI5MiAtIFJ1bnRpbWUgZml4ZXMgZm9yIFByb2MgY2hhbmdlcyBpbiBydWJ5LTEuOSB3aGVuIHVzaW5nIFNUTAogICAgICAgICAgICB3cmFwcGVycyB0aGF0IG92ZXJyaWRlIHRoZSBkZWZhdWx0IHByZWRpY2F0ZSwgc3VjaCBhczoKCiAgICAgICAgICAgICAgJXRlbXBsYXRlKE1hcCkgc3RkOjptYXA8c3dpZzo6TEFOR1VBR0VfT0JKLCBzd2lnOjpMQU5HVUFHRV9PQkosIHN3aWc6OkJpbmFyeVByZWRpY2F0ZTw+ID47CgoyMDEzLTA0LTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gU0YgQnVnICMxMTU5IC0gQ29ycmVjdGx5IGNoZWNrIHJiX3Jlc3BvbmRfdG8gY2FsbCByZXR1cm4gdmFsdWVzIHRvIGZpeCBzb21lCiAgICAgICAgICAgIGZ1cnRoZXIgMS45IHByb2JsZW1zIHdpdGggZnVuY3RvcnMgYW5kIHVzZSBvZiBDb21wbGV4IHdyYXBwZXJzLgoKMjAxMy0wNC0wMjogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIFJ1bnRpbWUgZml4ZXMgZm9yIHN0ZDo6Y29tcGxleCB3cmFwcGVycyBmb3IgcnVieS0xLjkgLSBuZXcgbmF0aXZlIFJ1YnkgY29tcGxleCBudW1iZXJzIGFyZSB1c2VkLgoKMjAxMy0wMy0zMDogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEZpeCBzZWcgZmF1bHQgd2hlbiB1c2luZyBTVEwgY29udGFpbmVycyBvZiBnZW5lcmljIFJ1YnkgdHlwZXMsIEdDX1ZBTFVFIG9yIExBTkdVQUdFX09CSkVDVCwKICAgICAgICAgICAgb24gZXhpdCBvZiB0aGUgUnVieSBpbnRlcnByZXRlci4gTW9yZSBmcmVxdWVudGx5IG9ic2VydmVkIGluIHJ1YnktMS45LgoKMjAxMy0wMy0yOTogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEZpeCBkZWxldGVfaWYgKHJlamVjdCEpIGZvciB0aGUgU1RMIGNvbnRhaW5lciB3cmFwcGVycyB3aGljaCBwcmV2aW91c2x5IHdvdWxkCiAgICAgICAgICAgIHNvbWV0aW1lcyBzZWcgZmF1bHQgb3Igbm90IHdvcmsuCgoyMDEzLTAzLTI1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggc29tZSB1bmRlZmluZWQgYmVoYXZpb3VyIGRlbGV0aW5nIHNsaWNlcyBpbiB0aGUgU1RMIGNvbnRhaW5lcnMuCgoyMDEzLTAzLTE5OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmEsIERdIEZpeCBzZWcgZmF1bHQgaW4gU1dJRyB1c2luZyBkaXJlY3RvcnMgd2hlbiBjbGFzcyBhbmQgdmlydHVhbCBtZXRob2QgbmFtZXMgYXJlCiAgICAgICAgICAgIHRoZSBzYW1lIGV4Y2VwdCBiZWluZyBpbiBkaWZmZXJlbnQgbmFtZXNwYWNlcyB3aGVuIHRoZSAlbnNwYWNlIGZlYXR1cmUgaXMgbm90IGJlaW5nIHVzZWQuCgoyMDEzLTAyLTE5OiBrd3dldHRlCiAgICAgICAgICAgIEZpeCBidWcgaW4gU1dJRydzIGhhbmRsaW5nIG9mIHF1YWxpZmllZCAoZS5nLiBjb25zdCkgdmFyaWFibGVzIG9mIGFycmF5IHR5cGUuIEdpdmVuIHRoZSB0eXBlZGVmCiAgICAgICAgICAgICAgYSg3KS5xKHZvbGF0aWxlKS5kb3VibGUgbXlhcnJheSAgICAgLy8gdHlwZWRlZiB2b2xhdGlsZSBkb3VibGVbN10gbXlhcnJheTsKICAgICAgICAgICAgdGhlIHR5cGUKICAgICAgICAgICAgICBxKGNvbnN0KS5teWFycmF5ICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCBteWFycmF5CiAgICAgICAgICAgIGJlY29tZXMKICAgICAgICAgICAgICBhKDcpLnEoY29uc3Qgdm9sYXRpbGUpLmRvdWJsZSAgICAgICAvLyBjb25zdCB2b2xhdGlsZSBkb3VibGVbN10KICAgICAgICAgICAgUHJldmlvdXNseSwgU3dpZ1R5cGVfdHlwZWRlZl9yZXNvbHZlKCkgcHJvZHVjZXMgdGhlIHR5cGUKICAgICAgICAgICAgICBxKGNvbnN0KS5hKDcpLnEodm9sYXRpbGUpLmRvdWJsZSAgICAvLyBub24tc2Vuc2ljYWwgdHlwZQogICAgICAgICAgICB3aGljaCB3b3VsZCBuZXZlciBtYXRjaCAldHlwZW1hcCBkZWNsYXJhdGlvbnMsIHdob3NlIHR5cGVzIHdlcmUgcGFyc2VkIGNvcnJlY3RseS4KICAgICAgICAgICAgQWRkIHR5cGVtYXBfYXJyYXlfcXVhbGlmaWVycy5pIHRvIHRoZSB0ZXN0IHN1aXRlIHdoaWNoIGNoZWNrcyBmb3IgdGhlIGNvcnJlY3QgYmVoYXZpb3VyLgoKMjAxMy0wMi0xODogd3NmdWx0b24KICAgICAgICAgICAgRGVwcmVjYXRlIHR5cGVkZWYgbmFtZXMgdXNlZCBhcyBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciBuYW1lcyBpbiAlZXh0ZW5kLiBUaGUgcmVhbAogICAgICAgICAgICBjbGFzcy9zdHJ1Y3QgbmFtZSBzaG91bGQgYmUgdXNlZC4KCiAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgdGFnRVN0cnVjdCB7CiAgICAgICAgICAgICAgICBpbnQgaXZhcjsKICAgICAgICAgICAgICB9IEVTdHJ1Y3Q7CgogICAgICAgICAgICAgICVleHRlbmQgdGFnRVN0cnVjdCB7CiAgICAgICAgICAgICAgICBFU3RydWN0KCkgLy8gaWxsZWdhbCBuYW1lLCBzaG91bGQgYmUgdGFnRVN0cnVjdCgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIEVTdHJ1Y3QgKnMgPSBuZXcgRVN0cnVjdCgpOwogICAgICAgICAgICAgICAgICBzLT5pdmFyID0gaXZhcjA7CiAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfkVTdHJ1Y3QoKSAvLyBpbGxlZ2FsIG5hbWUsIHNob3VsZCBiZSB+dGFnRVN0cnVjdCgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkc2VsZjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CgogICAgICAgICAgICBGb3Igbm93IHRoZXNlIHRyaWdnZXIgYSB3YXJuaW5nOgoKICAgICAgICAgICAgICBleHRlbmRfY29uc3RydWN0b3JfZGVzdHJ1Y3Rvci5pOjEwNzogV2FybmluZyA1MjI6IFVzZSBvZiBhbiBpbGxlZ2FsIGNvbnN0cnVjdG9yIG5hbWUgJ0VTdHJ1Y3QnIGluCiAgICAgICAgICAgICAgJWV4dGVuZCBpcyBkZXByZWNhdGVkLCB0aGUgY29uc3RydWN0b3IgbmFtZSBzaG91bGQgYmUgJ3RhZ0VTdHJ1Y3QnLgogICAgICAgICAgICAgIGV4dGVuZF9jb25zdHJ1Y3Rvcl9kZXN0cnVjdG9yLmk6MTExOiBXYXJuaW5nIDUyMzogVXNlIG9mIGFuIGlsbGVnYWwgZGVzdHJ1Y3RvciBuYW1lICdFU3RydWN0JyBpbgogICAgICAgICAgICAgICVleHRlbmQgaXMgZGVwcmVjYXRlZCwgdGhlIGRlc3RydWN0b3IgbmFtZSBzaG91bGQgYmUgJ3RhZ0VTdHJ1Y3QnLgoKICAgICAgICAgICAgVGhlc2UgJWV4dGVuZCBkZXN0cnVjdG9yIGFuZCBjb25zdHJ1Y3RvciBuYW1lcyB3ZXJlIHZhbGlkIHVwIHRvIHN3aWctMi4wLjQsIGhvd2V2ZXIgc3dpZy0yLjAuNSBpZ25vcmVkCiAgICAgICAgICAgIHRoZW0gYWx0b2dldGhlciBmb3IgQyBjb2RlIGFzIHJlcG9ydGVkIGluIFNGIGJ1ZyAjMTMwNi4gVGhlIG9sZCBiZWhhdmlvdXIgb2YgdXNpbmcgdGhlbSBoYXMgYmVlbgogICAgICAgICAgICByZXN0b3JlZCBmb3Igbm93LCBidXQgaXMgb2ZmaWNpYWxseSBkZXByZWNhdGVkLiBUaGlzIGRvZXMgbm90IGFwcGx5IHRvIGFub255bW91c2x5IGRlZmluZWQgdHlwZWRlZgogICAgICAgICAgICBjbGFzc2VzL3N0cnVjdHMgc3VjaCBhczoKCiAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3Qgey4uLn0gWDsKCjIwMTMtMDItMTc6IGt3d2V0dGUKICAgICAgICAgICAgV2hlbiBnZW5lcmF0aW5nIGZ1bmN0aW9ucyBwcm92aWRlZCBieSAlZXh0ZW5kLCB1c2UgIih2b2lkKSIgZm9yIG5vLWFyZ3VtZW50IGZ1bmN0aW9ucwogICAgICAgICAgICBpbnN0ZWFkIG9mICIoKSIuIFRoaXMgcHJldmVudHMgd2FybmluZ3Mgd2hlbiBjb21waWxpbmcgd2l0aCAiZ2NjIC1Xc3RyaWN0LXByb3RvdHlwZXMiLgoKMjAxMy0wMi0xNzoga3d3ZXR0ZQogICAgICAgICAgICBbT2N0YXZlXSBNaW5vciBmaXggdG8gYXV0b2RvYyBnZW5lcmF0aW9uOiBnZXQgdGhlIHJpZ2h0IHR5cGUgZm9yIGZ1bmN0aW9ucyByZXR1cm5pbmcgc3RydWN0cy4KCjIwMTMtMDItMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIERlcHJlY2F0ZSB0eXBlZGVmIG5hbWVzIHVzZWQgaW4gJWV4dGVuZCB0aGF0IGFyZSBub3QgdGhlIHJlYWwgY2xhc3Mvc3RydWN0IG5hbWUuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCBTdHJ1Y3RCTmFtZSB7CiAgICAgICAgICAgICAgICBpbnQgbXlpbnQ7CiAgICAgICAgICAgICAgfSBTdHJ1Y3RCOwoKICAgICAgICAgICAgICAlZXh0ZW5kIFN0cnVjdEIgewogICAgICAgICAgICAgICAgdm9pZCBtZXRob2QoKSB7fQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHdpbGwgbm93IHRyaWdnZXIgYSB3YXJuaW5nOgoKICAgICAgICAgICAgICBzd2lnX2V4dGVuZC5pOjE5OiBXYXJuaW5nIDMyNjogRGVwcmVjYXRlZCAlZXh0ZW5kIG5hbWUgdXNlZCAtIHRoZSBzdHJ1Y3QgbmFtZSBTdHJ1Y3RCTmFtZQogICAgICAgICAgICAgIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHR5cGVkZWYgbmFtZSBTdHJ1Y3RCLgoKICAgICAgICAgICAgVGhpcyBpcyBvbmx5IHBhcnRpYWxseSB3b3JraW5nIGFueXdheSAodGhlICVleHRlbmQgb25seSB3b3JrZWQgaWYgcGxhY2VkIGFmdGVyIHRoZSBjbGFzcwogICAgICAgICAgICBkZWZpbml0aW9uKS4gCgoyMDEzLTAyLTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBbQ0ZGSV0gQXBwbHkgcGF0Y2ggIzIyIC0gRml4IG1pc3NpbmcgcGFja2FnZSBiZWZvcmUgJmJvZHkKCjIwMTMtMDEtMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBFbnN1cmUgJ2phdmFwYWNrYWdlJyB0eXBlbWFwIGlzIHVzZWQgYXMgaXQgc3RvcHBlZCB3b3JraW5nIGZyb20gdmVyc2lvbiAyLjAuNS4KCjIwMTMtMDEtMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFwcGx5IHBhdGNoIFNGICMzMzQgLSBGaXggZGVmYXVsdCB2YWx1ZSBjb252ZXJzaW9ucyAiVFJVRSItPlRydWUsICJGQUxTRSItPkZhbHNlLgoKMjAxMy0wMS0yODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFwcGx5IHBhdGNoIFNGICMzMzUgLSBUcnVseSBpZ25vcmUgY29uc3RydWN0b3JzIGluIGRpcmVjdG9ycyB3aXRoICVpZ25vcmUuCgoyMDEzLTAxLTE4OiBCcmFudCBLeXNlcgogICAgICAgICAgICBbSmF2YV0gUGF0Y2ggIzE1IC0gQWxsb3cgdGhlIHVzZSBvZiB0aGUgbnNwYWNlIGZlYXR1cmUgd2l0aG91dCB0aGUgLXBhY2thZ2UgY29tbWFuZGxpbmUgb3B0aW9uLgogICAgICAgICAgICBUaGlzIHdvcmtzIGFzIGxvbmcgYW5kIHRoZSBuZXcgam5pY2xhc3NwYWNrYWdlIHByYWdtYSBpcyB1c2VkIHRvIHBsYWNlIHRoZSBKTkkgaW50ZXJtZWRpYXRlIGNsYXNzCiAgICAgICAgICAgIGludG8gYSBwYWNrYWdlIGFuZCB0aGUgbnNwYWNlIGZlYXR1cmUgaXMgdXNlZCB0byBwbGFjZSBhbGwgZXhwb3NlZCB0eXBlcyBpbnRvIGEgcGFja2FnZS4KCjIwMTMtMDEtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBWaXN1YWwgU3R1ZGlvIGV4YW1wbGVzIHRvIHdvcmsgd2hlbiBTV0lHIGlzIHVuemlwcGVkIGludG8gYSBkaXJlY3RvcnkgY29udGFpbmluZyBzcGFjZXMuCgoyMDEzLTAxLTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCBjc3R5cGUgdHlwZW1hcCBsb29rdXAgZm9yIG1lbWJlciB2YXJpYWJsZXMgc28gdGhhdCBhIGZ1bGx5IHF1YWxpZmllZCB2YXJpYWJsZSBuYW1lCiAgICAgICAgICAgIG1hdGNoZXMuIEZvciBleGFtcGxlOgogICAgICAgICAgICAgICV0eXBlbWFwKGNzdHlwZSkgYm9vbCBNVmFyOjptdmFyICJNeUJvb2wiCiAgICAgICAgICAgICAgc3RydWN0IE1WYXIgewogICAgICAgICAgICAgICAgYm9vbCBtdmFyOwogICAgICAgICAgICAgIH07CgoyMDEzLTAxLTExOiBCcmFudCBLeXNlcgoJICAgIFtKYXZhLCBDIywgRF0gU0YgQnVnICMxMjk5IC0gRml4IGdlbmVyYXRlZCBuYW1lcyBmb3Igd2hlbiAlbnNwYWNlIGlzIHVzZWQgb24KICAgICAgICAgICAgY2xhc3NlcyB3aXRoIHRoZSBzYW1lIG5hbWUgaW4gdHdvIGRpZmZlcmVudCBuYW1lc3BhY2VzLgoKMjAxMy0wMS0xMTogVmxhZGltaXIgS2FsaW5pbgoJICAgIFtDI10gQWRkIHN1cHBvcnQgZm9yIGNzZGlyZWN0b3JpbiAncHJlJywgJ3Bvc3QnIGFuZCAndGVybWluYXRvcicgYXR0cmlidXRlcy4KCjIwMTMtMDEtMDg6IG9sbHkKCSAgICBbUEhQXSBGaXggdG8gd29yayB3aXRoIGEgWlRTIGJ1aWxkIG9mIFBIUCAoYnJva2VuIGluIDIuMC43KS4KCjIwMTMtMDEtMDc6IG9sbHkKCSAgICBGaXggYmFzaGlzbSBpbiBjb25maWd1cmUsIGludHJvZHVjZWQgaW4gMi4wLjkuCgoyMDEzLTAxLTA2OiB3c2Z1bHRvbgogICAgICAgICAgICBQdWxsIHBhdGNoICM0IGZyb20gcHRvbXVsaWsgdG8gZml4IFNGIEJ1ZyAjMTI5NiAtIEZpeCBpbmNvcnJlY3Qgd2FybmluZyBmb3IgdmlydHVhbCBkZXN0cnVjdG9ycwogICAgICAgICAgICBpbiB0ZW1wbGF0ZXMsIHN1Y2ggYXM6CiAgICAgICAgICAgICBXYXJuaW5nIDUyMTogSWxsZWdhbCBkZXN0cnVjdG9yIG5hbWUgQjwgQSA+Ojp+QigpLiBJZ25vcmVkLgoKMjAxMy0wMS0wNTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gUHVsbCBwYXRjaCAjMyBmcm9tIHB0b211bGlrIHRvIGZpeCBTRiBCdWcgIzEyOTUgLSBzdGFuZGFyZCBleGNlcHRpb25zIGFzCiAgICAgICAgICAgIGNsYXNzZXMgdXNpbmcgdGhlIFNXSUdfU1REX0VYQ0VQVElPTlNfQVNfQ0xBU1NFUyBtYWNyby4KCjIwMTMtMDEtMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQdWxsIHBhdGNoICMyIGZyb20gQnJhbnRLeXNlciB0byBmaXggU0YgQnVnICMxMjgzIC0gZml4IHNtYXJ0IHBvaW50ZXJzIGluIGNvbmp1Y3Rpb24KICAgICAgICAgICAgd2l0aCBkaXJlY3RvcnMuCgoyMDEzLTAxLTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUHVsbCBwYXRjaCAjMSBmcm9tIEJyYW50S3lzZXIgdG8gZml4IFNGIEJ1ZyAjMTI3OCAtIGZpeCBkaXJlY3RvcnMgYW5kIG5zcGFjZSBmZWF0dXJlIHdoZW4KICAgICAgICAgICAgbXVsdGlsZXZlbCBuYW1lc3BhY2VzIGFyZSB1c2VkLgoKVmVyc2lvbiAyLjAuOSAoMTYgRGVjZW1iZXIgMjAxMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTItMTItMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBnYXJiYWdlIGxpbmUgbnVtYmVyIC8gZW1wdHkgZmlsZSBuYW1lIHJlcG9ydGluZyBmb3Igc29tZSBtaXNzaW5nCiAgICAgICAgICAgICd9JyBvciAnKScgZXJyb3IgbWVzc2FnZXMuCgoyMDEyLTEyLTE1OiBra2FlbXBmCiAgICAgICAgICAgIFtSdWJ5XSBBcHBseSBwYXRjaCAzNTMwNDQ0LCBDbGFzcyNtZXRob2RzIGFuZCBDbGFzcyNjb25zdGFudHMgcmV0dXJucyBhcnJheSBvZgogICAgICAgICAgICBzeW1ib2xzIGluIFJ1YnkgMS45KwoKMjAxMi0xMi0xNDoga2thZW1wZgogICAgICAgICAgICBbUnVieV0gQXBwbHkgcGF0Y2ggMzUzMDQzOSBhbmQgZmluYWxseSByZXBsYWNlIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgU1RSMkNTVFIoKSBtYWNybwogICAgICAgICAgICB3aXRoIFN0cmluZ1ZhbHVlUHRyKCkuIFNUUjJDU1RSIHdhcyBkZXByZWNhdGVkIHNpbmNlIHllYXJzIGFuZCBnb3QgcmVtb3ZlZCBpbiBSdWJ5IDEuOQoKMjAxMi0xMi0xNDoga2thZW1wZgogICAgICAgICAgICBbUnVieV0gQXBwbGllZCBwYXRjaGVzICMzNTMwNDQyIGFuZCAzNTMwNDQzIHRvIGFkYXB0IGNvbXBpbGUgYW5kIHJ1bnRpbWUgaW5jbHVkZQogICAgICAgICAgICBwYXRocyB0byBtYXRjaCBSdWJ5IDEuOSsKCjIwMTItMTItMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDRkZJXSBGaXggIzMxNjE2MTQgLSBTb21lIHN0cmluZyBjb25zdGFudHMgYXJlIGluY29ycmVjdAoKMjAxMi0xMi0xMzogd3NmdWx0b24KICAgICAgICAgICAgW0NGRkldIEZpeCAjMzUyOTY5MCAtIEZpeCBpbmNvcnJlY3QgY29uc3RhbnQgbmFtZXMuCgoyMDEyLTEyLTEyOiBkcmpvZQoJICAgIFtSXSBhZGQgZml4IHRvIGZpbmFsaXplciB0aGF0IHdhcyBtaXNzZWQgZWFybGllcgoKMjAxMi0xMi0xMTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQXBwbHkgcGF0Y2ggIzM1OTA1MjIgLSBmdWxseSBxdWFsaWZpZWQgcGFja2FnZSBwYXRocyBmb3IgUHl0aG9uIDMgZXZlbiBpZiBhIG1vZHVsZSBpcyBpbiB0aGUKICAgICAgICAgICAgc2FtZSBwYWNrYWdlLgoKMjAxMi0xMi0wODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQnVnICMzNTYzNjQ3IC0gUHlJbnRfRnJvbVNpemVfdCB1bmF2YWlsYWJsZSBwcmlvciB0byBQeXRob24gMi41IGZvciB1bnNpZ25lZCBpbnQgdHlwZXMuCgoyMDEyLTEyLTA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gRml4IGJ1ZyAjMzU3MTM2MSAtIEMrKyBjb21tZW50IGluIEMgd3JhcHBlcnMuCgoyMDEyLTEyLTA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFwcGx5IHBhdGNoICMzNTcxMDI5IHdoaWNoIGFkZHMgbWlzc2luZyBkaXJlY3RvciBzdXBwb3J0IGZvciBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgJi4KCjIwMTItMTEtMjg6IGt3d2V0dGUKICAgICAgICAgICAgW09jdGF2ZV0gU2ltcGxpZmllZCBtb2R1bGUgbG9hZGluZzogbm93IGp1c3QgdGhlIHN5bnRheAogICAgICAgICAgICAkIGV4YW1wbGU7CiAgICAgICAgICAgIGlzIGFjY2VwdGVkLCB3aGljaCBsb2FkcyBmdW5jdGlvbnMgZ2xvYmFsbHkgYnV0IGNvbnN0YW50cyBhbmQgdmFyaWFibGVzIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHNjb3BlLgogICAgICAgICAgICBUaGlzIG1ha2UgbW9kdWxlIGxvYWRpbmcgYmVoYXZpb3VyIHJlbGlhYmx5IGNvbnNpc3RlbnQsIGFuZCByZWR1Y2VzIHByb2JsZW1zIHdoZW4gbG9hZGluZyBtb2R1bGVzIHdoaWNoCiAgICAgICAgICAgIGRlcGVuZCBvbiBvdGhlciBtb2R1bGVzIHdoaWNoIG1heSBub3QgaGF2ZSBiZWVuIHByZXZpb3VzbHkgbG9hZGVkLgoKMjAxMi0xMS0yNzogd3NmdWx0b24KICAgICAgICAgICAgW2NmZmldIEZpeCBqdW5rIG91dHB1dCB3aGVuIHdyYXBwaW5nIHNpbmdsZSBjaGFyYWN0ZXIgbGl0ZXJhbCBjb25zdGFudHMuCgoyMDEyLTExLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBbVGNsLCBNb2R1bGEzXSBBZGQgbWlzc2luZyBzdXBwb3J0IGZvciAtb3V0ZGlyLgoKMjAxMi0xMS0xNzogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNlZ2ZhdWx0cyB3aGVuIHVzaW5nIGZpbGVuYW1lIHBhdGhzIGdyZWF0ZXIgdGhhbiAxMDI0IGNoYXJhY3RlcnMgaW4gbGVuZ3RoLgoKMjAxMi0xMS0xNDogd3NmdWx0b24KICAgICAgICAgICAgW2NjYWNoZS1zd2lnXSBBcHBseSBwYXRjaCAjMzU4NjM5MiBmcm9tIEZyZWRlcmlrIERld2VlcmR0IHRvIGZpeCBzb21lIGVycm9yIGNhc2VzIC0gaW5jb3JyZWN0bHkgdXNpbmcKICAgICAgICAgICAgbWVtb3J5IGFmdGVyIGl0IGhhcyBiZWVuIGRlbGV0ZWQuCgoyMDEyLTExLTA5OiB2emVpdGxpbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggb3ZlcmZsb3cgd2hlbiBwYXNzaW5nIHZhbHVlcyBncmVhdGVyIHRoYW4gTE9OR19NQVggZnJvbSBQeXRob24gMyBmb3IgcGFyYW1ldGVycyB3aXRoIHVuc2lnbmVkIGxvbmcgQyB0eXBlLgoKMjAxMi0xMS0wOTogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNvbWUgZmVhdHVyZSBtYXRjaGluZyBpc3N1ZXMgZm9yIGltcGxpY2l0IGRlc3RydWN0b3JzIGFuZCBpbXBsaWNpdCBjb25zdHJ1Y3RvcnMgYW5kIGltcGxpY2l0CiAgICAgICAgICAgIGNvcHkgY29uc3RydWN0b3JzIGFkZGVkIHdpdGggJWNvcHljdG9yLiBQcmV2aW91c2x5IGEgZmVhdHVyZSBmb3IgdGhlc2UgaGFkIHRvIGJlIGZ1bGx5IHF1YWxpZmllZAogICAgICAgICAgICBpbiBvcmRlciB0byBtYXRjaC4gTm93IHRoZSBmb2xsb3dpbmcgd2lsbCBhbHNvIG1hdGNoOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgieHl6IikgflhYWCgpOwogICAgICAgICAgICAgIHN0cnVjdCBYWFgge307CgoyMDEyLTExLTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBGdXJ0aGVyIGNvbnNpc3RlbmN5IGluIG5hbWVkIG91dHB1dCB0eXBlbWFwIGxvb2t1cHMgZm9yIGltcGxpY2l0IGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgYW5kCiAgICAgICAgICAgIGltcGxpY2l0IGNvcHkgY29uc3RydWN0b3JzIGFkZGVkIHdpdGggJWNvcHljdG9yLiBQcmV2aW91c2x5IG9ubHkgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIHdhcyBiZWluZwogICAgICAgICAgICB1c2VkLCBub3cgdGhlIHVucXVhbGlmaWVkIG5hbWUgd2lsbCBhbHNvIGJlIHVzZWQuIEZvciBleGFtcGxlLCBwcmV2aW91c2x5OgoKICAgICAgICAgICAgICBleGFtcGxlLmk6Mzg6IFNlYXJjaGluZyBmb3IgYSBzdWl0YWJsZSAnb3V0JyB0eXBlbWFwIGZvcjogdm9pZCBTcGFjZTo6TW9yZTo6fk1vcmUKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiB2b2lkIFNwYWNlOjpNb3JlOjp+TW9yZQogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IHZvaWQKCiAgICAgICAgICAgIE5vdyB0aGUgdW5xdWFsaWZpZWQgbmFtZSBpcyBhbHNvIHVzZWQ6CgogICAgICAgICAgICAgIGV4YW1wbGUuaTozODogU2VhcmNoaW5nIGZvciBhIHN1aXRhYmxlICdvdXQnIHR5cGVtYXAgZm9yOiB2b2lkIFNwYWNlOjpNb3JlOjp+TW9yZQogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IHZvaWQgU3BhY2U6Ok1vcmU6On5Nb3JlCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogdm9pZCB+TW9yZQogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IHZvaWQKCjIwMTItMTEtMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzb21lIHN1YnRsZSBuYW1lZCBvdXRwdXQgdHlwZW1hcCBsb29rdXAgbWlzc2VzLCB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgd2FzIG5vdCBhbHdheXMgYmVpbmcKICAgICAgICAgICAgdXNlZCBmb3IgdmFyaWFibGVzLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgc3RydWN0IEdsb2IgewogICAgICAgICAgICAgICAgaW50IE15VmFyOwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICBQcmV2aW91c2x5IHRoZSBzZWFyY2ggcnVsZXMgKGFzIHNob3duIGJ5IC1kZWJ1Zy10bXNlYXJjaCkgZm9yIHRoZSBnZXR0ZXIgd3JhcHBlciB3ZXJlOgoKICAgICAgICAgICAgICBleGFtcGxlLmk6NDQ6IFNlYXJjaGluZyBmb3IgYSBzdWl0YWJsZSAnb3V0JyB0eXBlbWFwIGZvcjogaW50IE15VmFyCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogaW50IE15VmFyCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogaW50CgogICAgICAgICAgICBOb3cgdGhlIHNjb3BlIGlzIG5hbWVkIGNvcnJlY3RseToKCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjQ0OiBTZWFyY2hpbmcgZm9yIGEgc3VpdGFibGUgJ291dCcgdHlwZW1hcCBmb3I6IGludCBHbG9iOjpNeVZhcgogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IGludCBHbG9iOjpNeVZhcgogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IGludCBNeVZhcgogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IGludAoKMjAxMi0xMC0yNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IGRpcmVjdG9yIHR5cGVtYXAgc2VhcmNoaW5nIHNvIHRoYXQgYSB0eXBlbWFwIHNwZWNpZmllZCB3aXRoIGEgbmFtZSB3aWxsIGJlIGNvcnJlY3RseSBtYXRjaGVkLiBQcmV2aW91c2x5CiAgICAgICAgICAgIHRoZSBuYW1lIHdhcyBpZ25vcmVkIGR1cmluZyB0aGUgdHlwZW1hcCBzZWFyY2guIEFwcGxpZXMgdG8gdGhlIGZvbGxvd2luZyBsaXN0IG9mIHR5cGVtYXBzOiAKICAgICAgICAgICAgZGlyZWN0b3JvdXQsIGNzZGlyZWN0b3JvdXQsIGNzdHlwZSwgaW10eXBlLCBjdHlwZSwgZGRpcmVjdG9yb3V0LCBkdHlwZSwgZ290eXBlLCBqdHlwZSwgam5pLCBqYXZhZGlyZWN0b3JvdXQuCgoyMDEyLTEwLTExOiB3c2Z1bHRvbgogICAgICAgICAgICBNb3N0IG9mIHRoZSBzcGVjaWFsIHZhcmlhYmxlcyBhdmFpbGFibGUgZm9yIHVzZSBpbiAlZXhjZXB0aW9uIGFyZSBub3cgYWxzbyBhdmFpbGFibGUgZm9yIGV4cGFuc2lvbiBpbgogICAgICAgICAgICAlZXh0ZW5kIGJsb2Nrcy4gVGhlc2UgYXJlOiAkbmFtZSAkc3ltbmFtZSAkb3Zlcm5hbWUgJGRlY2wgJGZ1bGxkZWNsICRwYXJlbnRuYW1lICRwYXJlbnRzeW1uYW1lLCBzZWUgZG9jcwogICAgICAgICAgICBvbiAiQ2xhc3MgZXh0ZW5zaW9uIiBpbiBTV0lHUGx1cy5odG1sLiBQYXRjaCBiYXNlZCBvbiBzdWJtaXNzaW9uIGZyb20gS3JpcyBUaGllbGVtYW5zLgoKMjAxMi0xMC0xMDogd3NmdWx0b24KICAgICAgICAgICAgQWRkaXRpb25hbCBuZXcgc3BlY2lhbCB2YXJpYWJsZXMgaW4gJWV4Y2VwdGlvbiBhcmUgZXhwYW5kZWQgYXMgZm9sbG93czoKICAgICAgICAgICAgICAkcGFyZW50bmFtZSAtIFRoZSBwYXJlbnQgY2xhc3MgbmFtZSAoaWYgYW55KSBmb3IgYSBtZXRob2QuCiAgICAgICAgICAgICAgJHBhcmVudHN5bW5hbWUgLSBUaGUgdGFyZ2V0IGxhbmd1YWdlIHBhcmVudCBjbGFzcyBuYW1lIChpZiBhbnkpIGZvciBhIG1ldGhvZC4KCjIwMTItMTAtMDg6IGlhbnQKCSAgICBbR29dIEdlbmVyYXRpbmcgR28gY29kZSBub3cgcmVxdWlyZXMgdXNpbmcgdGhlIC1pbnRnb3NpemUgb3B0aW9uIHRvCgkgICAgaW5kaWNhdGUgdGhlIHNpemUgb2YgdGhlICdpbnQnIHR5cGUgaW4gR28uICBUaGlzIGlzIGJlY2F1c2UgdGhlCgkgICAgc2l6ZSBvZiB0aGUgdHlwZSBpcyBjaGFuZ2luZyBmcm9tIEdvIDEuMCB0byBHbyAxLjEgZm9yIHg4Nl82NC4gCgoyMDEyLTA5LTE0OiB3c2Z1bHRvbgoJICAgIEFkZCBuZXcgd2FybmluZyBpZiB0aGUgZW1wdHkgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiBpcyB1c2VkIGFzIGEgYmFzZSBjbGFzcywgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBCYXNlIHt9OwogICAgICAgICAgICAgICV0ZW1wbGF0ZSgpIEJhc2U8aW50PjsKICAgICAgICAgICAgICBjbGFzcyBEZXJpdmVkIDogcHVibGljIEJhc2U8aW50PiB7fTsKCiAgICAgICAgICAgIGdpdmVzIHRoZSBmb2xsb3dpbmcgd2FybmluZyBpbnN0ZWFkIG9mIHNpbGVudGx5IGlnbm9yaW5nIHRoZSBiYXNlOgoKICAgICAgICAgICAgY3BwX2luaGVyaXQuaTo1MjogV2FybmluZyA0MDE6IEJhc2UgY2xhc3MgJ0Jhc2U8IGludCA+JyBoYXMgbm8gbmFtZSBhcyBpdCBpcyBhbiBlbXB0eSB0ZW1wbGF0ZSBpbnN0YW50aWF0ZWQgd2l0aCAnJXRlbXBsYXRlKCknLiBJZ25vcmVkLgogICAgICAgICAgICBjcHBfaW5oZXJpdC5pOjUxOiBXYXJuaW5nIDQwMTogVGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgbXVzdCBiZSB3cml0dGVuIGJlZm9yZSAnQmFzZTwgaW50ID4nIGlzIHVzZWQgYXMgYSBiYXNlIGNsYXNzIGFuZCBiZSBkZWNsYXJlZCB3aXRoIGEgbmFtZS4KCgoyMDEyLTA5LTExOiB3c2Z1bHRvbgoJICAgIFtKYXZhXSBGaXggIzM1MzUzMDQgLSBEaXJlY3QgdXNlIG9mIGEgd2VhayBnbG9iYWwgcmVmZXJlbmNlIGluIGRpcmVjdG9ycwogICAgICAgICAgICBzb21ldGltZXMgY2F1c2luZyBzZWcgZmF1bHRzIGVzcGVjaWFsbHkgb24gQW5kcm9pZC4KCjIwMTItMDktMDY6IHdzZnVsdG9uCgkgICAgW0phdmFdIEZpeCAoY2hhciAqU1RSSU5HLCBzaXplX3QgTEVOR1RIKSB0eXBlbWFwcyB0byBhY2NlcHQgTlVMTCBzdHJpbmcuCgoyMDEyLTA4LTI2OiBkcmpvZQoJICAgIFtSXSBtYWtlIEV4dGVybmFsUmVmZXJlbmNlIHNsb3QgcmVmIHRvIGNvbnRhaW4gcmVmZXJlbmNlCgoyMDEyLTA4LTI2OiBkcmpvZQoJICAgIFtSXSBmaXggRXhhbXBsZXMvTWFrZWZpbGUgdG8gdXNlIEMgaW4gJChDQykgcmF0aGVyIHRoYW4gJChDWFgpCgpWZXJzaW9uIDIuMC44ICgyMCBBdWd1c3QgMjAxMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDEyLTA4LTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gQWRkIHNpemVfdHlwZSwgdmFsdWVfdHlwZSwgY29uc3RfcmVmZXJlbmNlIHRvIHRoZSBTVEwgY29udGFpbmVycy4KCjIwMTItMDgtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFkZCBkaXNjYXJkIGFuZCBhZGQgbWV0aG9kcyB0byBzdGQ6OnNldCB3cmFwcGVycyBzbyB0aGF0IHB5YWJjLmkgY2FuIGJlIHVzZWQgZW5zdXJpbmcKICAgICAgICAgICAgTXV0YWJsZVNldCBpcyBhIHZhbGlkIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHN0ZDo6c2V0LiBBcyByZXBvcnRlZCBieSBBbGV4ZXkgU29rb2xvdi4KICAgICAgICAgICAgU2ltaWxhcmx5IGZvciBzdGQ6Om11bHRpc2V0LgoKMjAxMi0wOC0xNTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4ICMzNTQxNzQ0IC0gTWlzc2luZyBQeUludF9Gcm9tU2l6ZV90IGNhbGxzIGZvciBQeXRob24gMy4KCjIwMTItMDgtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQYXRjaCBmcm9tIERhdmlkIEJhdW0gdG8gYWRkIHRoZSBhc3N1bWVvdmVycmlkZSBmZWF0dXJlIGZvciBKYXZhIGRpcmVjdG9ycyB0bwogICAgICAgICAgICBpbXByb3ZlIHBlcmZvcm1hbmNlIHdoZW4gYWxsIG92ZXJyaWRkZW4gbWV0aG9kcyBjYW4gYmUgYXNzdW1lZCB0byBiZSBvdmVycmlkZGVuLgoKMjAxMi0wOC0wNTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzM1MzAwMjEgRml4IHVudXNlZCB2YXJpYWJsZSB3YXJuaW5nLgoKMjAxMi0wOC0wNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggIzM1MzYzNjAgLSBJbnZhbGlkIGNvZGUgc29tZXRpbWVzIGJlaW5nIGdlbmVyYXRlZCBmb3IgZGlyZWN0b3IgbWV0aG9kcwogICAgICAgICAgICB3aXRoIG1hbnkgYXJndW1lbnRzLgoKMjAxMi0wOC0wNTogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdICMzNTQ1ODc3IC0gRG9uJ3QgdW5kZWZpbmUgYm9vbCBpZiBkZWZpbmVkIGJ5IEM5OSBzdGRib29sLmggLSBwcm9ibGVtIHVzaW5nIAogICAgICAgICAgICBQZXJsIDUuMTYgYW5kIGxhdGVyLgoKMjAxMi0wOC0wNDogd3NmdWx0b24KICAgICAgICAgICAgUmVtb3ZlIGluY29ycmVjdCB3YXJuaW5nICgzMTQpIGFib3V0IHRhcmdldCBsYW5ndWFnZSBrZXl3b3JkcyB3aGljaCB3ZXJlIHRyaWdnZXJlZAogICAgICAgICAgICBieSB1c2luZyBkZWNsYXJhdGlvbnMgYW5kIHVzaW5nIGRpcmVjdGl2ZXMuIEZvciBleGFtcGxlICdzdHJpbmcnIGlzIGEga2V5d29yZCBpbiBDIzoKICAgICAgICAgICAgICBuYW1lc3BhY2Ugc3RkIHsgY2xhc3Mgc3RyaW5nOyB9CiAgICAgICAgICAgICAgdXNpbmcgc3RkOjpzdHJpbmc7CgoyMDEyLTA3LTIxOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZGlzcGxheSBvZiBwb2ludGVycyBpbiB2YXJpb3VzIHBsYWNlcyBvbiA2NCBiaXQgc3lzdGVtcyAtIG9ubHkgMzIgYml0cyB3ZXJlIGJlaW5nIHNob3duLgoKMjAxMi0wNy0yMTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGdkYiBkZWJ1Z2dlciBmdW5jdGlvbnMgJ3N3aWdwcmludCcgYW5kICdsb2Nzd2lncHJpbnQnIHRvIGRpc3BsYXkgdG8gdGhlIGdkYiBvdXRwdXQgd2luZG93CiAgICAgICAgICAgIHJhdGhlciB0aGFuIHN0ZG91dC4gVGhpcyBmaXhlcyBkaXNwbGF5IHByb2JsZW1zIGluIGdkYnR1aSBhbmQgdGhlIGVuc3VyZXMgdGhlIG91dHB1dAogICAgICAgICAgICBhcHBlYXJzIHdoZXJlIGV4cGVjdGVkIGluIG90aGVyIGdkYiBiYXNlZCBkZWJ1Z2dlcnMgc3VjaCBhcyBFY2xpcHNlIENEVC4KCjIwMTItMDctMjA6IGt3d2V0dGUKICAgICAgICAgICAgW09jdGF2ZV0gc2VnZmF1bHQtb24tZXhpdCBwcmV2ZW50aW9uIGhhY2sgbm93IHByZXNlcnZlcyBleGl0IHN0YXR1cywgYW5kIHVzZXMgQzk5IF9FeGl0KCkuCgoyMDEyLTA3LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggRGViaWFuIGJ1ZyBodHRwOi8vYnVncy5kZWJpYW4ub3JnLzY3MjAzNSwgdHlwZW1hcCBjb3B5IGZhaWx1cmUgLSByZWdyZXNzaW9uIGludHJvZHVjZWQgCiAgICAgICAgICAgIGluIHN3aWctMi4wLjU6CiAgICAgICAgICAgICAgJWluY2x1ZGU8c3RsLmk+CiAgICAgICAgICAgICAgdXNpbmcgc3RkOjpwYWlyOwogICAgICAgICAgICAgICV0ZW1wbGF0ZShTdHJQYWlyKSBwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz47CgoyMDEyLTA3LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggdXNpbmcgZGVjbGFyYXRpb25zIGNvbWJpbmVkIHdpdGggdXNpbmcgZGlyZWN0aXZlcyB3aXRoIGZvcndhcmQgY2xhc3MgZGVjbGFyYXRpb25zIHNvIHRoYXQKICAgICAgICAgICAgdHlwZXMgYXJlIGNvcnJlY3RseSBmb3VuZCBpbiBzY29wZSBmb3IgdGVtcGxhdGVzLiBFeGFtcGxlOgoKICAgICAgICAgICAgICBuYW1lc3BhY2UgT3V0ZXIyIHsKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZTIgewogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBUaGluZzI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBPdXRlcjI7CiAgICAgICAgICAgICAgdXNpbmcgU3BhY2UyOjpUaGluZzI7CiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgVGhpbmcyIHt9OwogICAgICAgICAgICAgIC8vIFNUSUxMIEJST0tFTiB2b2lkIHVzZWl0MihUaGluZzI8aW50PiB0KSB7fQogICAgICAgICAgICAgIHZvaWQgdXNlaXQyYShPdXRlcjI6OlNwYWNlMjo6VGhpbmcyPGludD4gdCkge30KICAgICAgICAgICAgICB2b2lkIHVzZWl0MmIoOjpPdXRlcjI6OlNwYWNlMjo6VGhpbmcyPGludD4gdCkge30KICAgICAgICAgICAgICB2b2lkIHVzZWl0MmMoU3BhY2UyOjpUaGluZzI8aW50PiB0KSB7fQogICAgICAgICAgICAgIG5hbWVzcGFjZSBPdXRlcjIgewogICAgICAgICAgICAgICAgdm9pZCB1c2VpdDJkKFNwYWNlMjo6VGhpbmcyPGludD4gdCkge30KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICV0ZW1wbGF0ZShUaGluZzJJbnQpIFRoaW5nMjxpbnQ+OwoKCjIwMTItMDYtMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB0ZW1wbGF0ZSBuYW1lc3BhY2UgcHJvYmxlbXMgZm9yIHN5bWJvbHMgZGVjbGFyZWQgd2l0aCBhIGZvcndhcmQgY2xhc3MgZGVjbGFyYXRpb25zLCBzdWNoIGFzOgoKICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UxIHsKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZTIgewogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgWVlZOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFNwYWNlMjo6WVlZIHsKICAgICAgICAgICAgICAgICAgVCB5eXkoVCBoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGg7CiAgICAgICAgICAgICAgICAgIH0gICAgCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdm9pZCB0ZXN0WVlZMShTcGFjZTE6OlNwYWNlMjo6WVlZPGludD4geXkpIHt9CiAgICAgICAgICAgICAgICB2b2lkIHRlc3RZWVkyKFNwYWNlMjo6WVlZPGludD4geXkpIHt9CiAgICAgICAgICAgICAgICB2b2lkIHRlc3RZWVkzKDo6U3BhY2UxOjpTcGFjZTI6OllZWTxpbnQ+IHl5KSB7fQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgJXRlbXBsYXRlKFlZWUludCkgU3BhY2UxOjpTcGFjZTI6OllZWTxpbnQ+OwoKMjAxMi0wNi0zMDogd3NmdWx0b24KICAgICAgICAgICAgRml4IG5hbWVzcGFjZSBwcm9ibGVtcyBmb3Igc3ltYm9scyBkZWNsYXJlZCB3aXRoIGEgZm9yd2FyZCBjbGFzcyBkZWNsYXJhdGlvbnMsIHN1Y2ggYXM6CgogICAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZTEgewogICAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlMiB7CiAgICAgICAgICAgICAgICAgIHN0cnVjdCBYWFg7CiAgICAgICAgICAgICAgICAgIHN0cnVjdCBZWVk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc3RydWN0IFNwYWNlMjo6WVlZIHt9OwogICAgICAgICAgICAgICAgc3RydWN0IFNwYWNlMTo6U3BhY2UyOjpYWFgge307CgogICAgICAgICAgICAgICAgdm9pZCB0ZXN0WFhYMihTcGFjZTI6OlhYWCB4eCkge30KICAgICAgICAgICAgICAgIHZvaWQgdGVzdFlZWTIoU3BhY2UyOjpZWVkgeXkpIHt9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgd2hlcmUgeHggYW5kIHl5IHdlcmUgbm90IHJlY29nbmlzZWQgYXMgdGhlIHByb3h5IGNsYXNzZXMgWFhYIGFuZCBZWVkuCgoyMDEyLTA2LTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggdXNpbmcgZGVjbGFyYXRpb25zIGNvbWJpbmVkIHdpdGggdXNpbmcgZGlyZWN0aXZlcyB3aXRoIGZvcndhcmQgY2xhc3MgZGVjbGFyYXRpb25zIHNvIHRoYXQKICAgICAgICAgICAgdHlwZXMgYXJlIGNvcnJlY3RseSBmb3VuZCBpbiBzY29wZS4gCgogICAgICAgICAgICAgIG5hbWVzcGFjZSBPdXRlcjIgewogICAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlMiB7CiAgICAgICAgICAgICAgICAgIGNsYXNzIFRoaW5nMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIE91dGVyMjsKICAgICAgICAgICAgICB1c2luZyBTcGFjZTI6OlRoaW5nMjsKICAgICAgICAgICAgICBjbGFzcyBUaGluZzIge307CiAgICAgICAgICAgICAgLy8gTm9uZSBvZiB0aGUgbWV0aG9kcyBiZWxvdyBjb3JyZWN0bHkgdXNlZCB0aGUgVGhpbmcyIHByb3h5IGNsYXNzCiAgICAgICAgICAgICAgdm9pZCB1c2VpdDIoVGhpbmcyIHQpIHt9CiAgICAgICAgICAgICAgdm9pZCB1c2VpdDJhKE91dGVyMjo6U3BhY2UyOjpUaGluZzIgdCkge30KICAgICAgICAgICAgICB2b2lkIHVzZWl0MmIoOjpPdXRlcjI6OlNwYWNlMjo6VGhpbmcyIHQpIHt9CiAgICAgICAgICAgICAgdm9pZCB1c2VpdDJjKFNwYWNlMjo6VGhpbmcyIHQpIHt9CiAgICAgICAgICAgICAgbmFtZXNwYWNlIE91dGVyMiB7CiAgICAgICAgICAgICAgICB2b2lkIHVzZWl0MmQoU3BhY2UyOjpUaGluZzIgdCkge30KICAgICAgICAgICAgICB9CgoyMDEyLTA2LTI1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggdXNpbmcgZGVjbGFyYXRpb25zIGNvbWJpbmVkIHdpdGggdXNpbmcgZGlyZWN0aXZlcyBzbyB0aGF0IHR5cGVzIGFyZSBjb3JyZWN0bHkgZm91bmQgaW4gc2NvcGUuCiAgICAgICAgICAgIEV4YW1wbGU6CgogICAgICAgICAgICAgIG5hbWVzcGFjZSBPdXRlcjIgewogICAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlMiB7CiAgICAgICAgICAgICAgICAgIGNsYXNzIFRoaW5nMiB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIE91dGVyMjsgLy8gdXNpbmcgZGlyZWN0aXZlCiAgICAgICAgICAgICAgdXNpbmcgU3BhY2UyOjpUaGluZzI7IC8vIHVzaW5nIGRlY2xhcmF0aW9uCiAgICAgICAgICAgICAgdm9pZCB1c2VpdDIoVGhpbmcyIHQpIHt9CgogICAgICAgICAgICBTaW1pbGFybHkgZm9yIHRlbXBsYXRlZCBjbGFzc2VzLgoKMjAxMi0wNS0yOTogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMzNTI5NjAxIC0gc2VnIGZhdWx0IHdoZW4gYSBwcm90ZWN0ZWQgbWV0aG9kIGhhcyB0aGUgImRpcmVjdG9yIgogICAgICAgICAgICBmZWF0dXJlIGJ1dCB0aGUgcGFyZW50IGNsYXNzIGRvZXMgbm90LiBBbHNvIGZpeCBzaW1pbGFyIHByb2JsZW1zIHdpdGgKICAgICAgICAgICAgdGhlIGFsbHByb3RlY3RlZCBmZWF0dXJlLgoKMjAxMi0wNS0yODogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNlZyBmYXVsdCB3aGVuIGF0dGVtcHRpbmcgdG8gd2FybiBhYm91dCBhbiBpbGxlZ2FsIGRlc3RydWN0b3IgLSAjMzUzMDA1NSwgMzUzMDA3OCBhbmQgIzM1MzAxMTguCgpWZXJzaW9uIDIuMC43ICgyNiBNYXkgMjAxMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09CjIwMTItMDUtMjY6IHdzZnVsdG9uCiAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHR5cGVtYXAgbW9kaWZpY2F0aW9ucyBzbyB0aGV5IGNhbiBiZSB1c2VkIHdpdGggJWFwcGx5IGZvciBvdGhlciBzdHJpbmcKICAgICAgICAgICAgY2xhc3Nlcy4KCjIwMTItMDUtMjU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIEZpeGVzIGZvciAtZXh0ZXJuYWwtcnVudGltZSB0byB3b3JrIGFnYWluLgoKMjAxMi0wNS0yMjogc3phZ2VyCgkgICAgW3B5dGhvbl0gRGlzYW1iaWd1YXRlIFNXSUdfRnJvbV91bnNpZ25lZF9TU19pbnQgYW5kIFNXSUdfRnJvbV91bnNpZ25lZF9TU19sb25nLgoKMjAxMi0wNS0xODogb2xseQoJICAgIFtQSFBdIEZpeCBnZXR0ZXJzIGZvciB0ZW1wbGF0ZSBtZW1iZXJzLiAoU0YjMzQyODgzMywgU0YjMzUyODAzNSkKCjIwMTItMDUtMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzb21lIGxhbmd1YWdlJ3Mgc3RkOjptYXAgd3JhcHBlcnMgdG8gcmVjb2duaXNlIGRpZmZlcmVuY2VfdHlwZSwgc2l6ZV90eXBlLCBrZXlfdHlwZQogICAgICAgICAgICBhbmQgbWFwcGVkX3R5cGUuCgoyMDEyLTA1LTE0OiBrd3dldHRlIChzaWduZWQgb2ZmIGJ5IHhhdmllcjk4KQogICAgICAgICAgICBbT2N0YXZlXSBQcmV2ZW50IE9jdGF2ZSBmcm9tIHNlZy1mYXVsdGluZyBhdCBleGl0IHdoZW4gU1dJRwogICAgICAgICAgICBtb2R1bGVzIGFyZSBsb2FkZWQsIGR1ZSB0byBidWdzIGluIE9jdGF2ZSdzIGNsZWFudXAgY29kZToKICAgICAgICAgICAgKiBXcmFwcGluZyBmdW5jdGlvbnMgbm93IGRlY2xhcmVkIHdpdGggT2N0YXZlIERFRlVOX0RMRCBtYWNybywKICAgICAgICAgICAgICBhbmQgbG9hZGVkIHRocm91Z2ggT2N0YXZlJ3MgZHluYW1pYyBtb2R1bGUgbG9hZGVyCiAgICAgICAgICAgICogR2xvYmFsIHZhcmlhYmxlcyBvZiBzd2lncmVmIHR5cGUgYXJlIG5vdyBhc3NpZ25lZCBhIG5ldygpCiAgICAgICAgICAgICAgY29weSBvZiB0aGUgc3dpZ3JlZiBjbGFzcywgdG8gcHJldmVudCBkb3VibGUtZnJlZSBlcnJvcnMKICAgICAgICAgICAgKiBTV0lHIG1vZHVsZSBhdC1leGl0IGNsZWFudXAgZnVuY3Rpb24gbm93IGNyZWF0ZWQgaW4gT2N0YXZlCiAgICAgICAgICAgICAgdGhyb3VnaCBldmFsKCksIHNvIG5vdCBkZXBlbmRlbnQgb24gbG9hZGVkIC5vY3QgbGlicmFyeQogICAgICAgICAgICAqIEZvciBPY3RhdmUgdmVyc2lvbnMgMy4xLiogdG8gMy4zLiosIHJlZ2lzdGVyIEMtbGV2ZWwgYXQtZXhpdAogICAgICAgICAgICAgIGZ1bmN0aW9uIHdoaWNoIHRlcm1pbmF0ZXMgT2N0YXZlIGltbWVkaWF0ZWx5ICh3aXRoIGNvcnJlY3QKICAgICAgICAgICAgICBzdGF0dXMgY29kZSkgd2l0aG91dCBwZXJmb3JtaW5nIG1lbW9yeSBjbGVhbnVwLiBUaGlzIGZ1bmN0aW9uCiAgICAgICAgICAgICAgY2FuIGJlIGNvbnRyb2xsZWQgd2l0aCBtYWNyb3MgaW4gTGliL29jdGF2ZS9vY3RydW50aW1lLnN3ZwoKICAgICAgICAgICAgW09jdGF2ZV0gTmV3IHN5bnRheCBmb3IgZGV0ZXJtaW5nIHdoZXRoZXIgU1dJRyBtb2R1bGUgc2hvdWxkIGJlCiAgICAgICAgICAgIGxvYWRlZCBnbG9iYWxseSBvciBub24tZ2xvYmFsbHkuIFRvIGxvYWQgbW9kdWxlICJleGFtcGxlIiBnbG9iYWxseSwKICAgICAgICAgICAgdHlwZSB0aGUgbW9kdWxlIG5hbWUKICAgICAgICAgICAgJCBleGFtcGxlOwogICAgICAgICAgICBhcyBiZWZvcmU7IHRvIGxvYWQgbW9kdWxlIG5vbi1nbG9iYWxseSwgYXNzaWduIGl0IHRvIGEgdmFyaWFibGU6CiAgICAgICAgICAgICQgZXhhbXBsZSA9IGV4YW1wbGU7CiAgICAgICAgICAgIG9yCiAgICAgICAgICAgICQgZXggPSBleGFtcGxlOwogICAgICAgICAgICBmb3IgYSBzaG9ydGVyIChsb2NhbCkgbW9kdWxlIG5hbWUuIC1nbG9iYWwvLW5vZ2xvYmFsIGNvbW1hbmQtbGluZQogICAgICAgICAgICBvcHRpb25zIGFuZCBtb2R1bGUgY29tbWFuZCBsaW5lIGFyZSBkZXByZWNhdGVkLiBBZGRlZCB1c2FnZSBpbmZvCiAgICAgICAgICAgIHRvIG1vZHVsZSwgc28gdHlwaW5nCiAgICAgICAgICAgICQgaGVscCBleGFtcGxlCiAgICAgICAgICAgIG9yIGluY29ycmVjdCB1c2FnZSBzaG91bGQgZGlzcGxheSBwcm9wZXIgdXNhZ2UsIHdpdGggZXhhbXBsZXMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDEyLTA1LTEyOiBvbGx5CgkgICAgW1BIUF0gRml4IG1lbW9yeSBsZWFrIGluIGNvZGUgZ2VuZXJhdGVkIGZvciBhIGNhbGxiYWNrLiAgUGF0Y2ggZnJvbQoJICAgIFNGIGJ1ZyAjMzUxMDgwNi4KCjIwMTItMDUtMTI6IG9sbHkKCSAgICBbUEhQXSBBdm9pZCB1c2luZyB6ZW5kX2Vycm9yX25vcmV0dXJuKCkgYXMgaXQgZG9lc24ndCB3b3JrIHdpdGggYWxsCgkgICAgYnVpbGRzIG9mIFBIUCAoU0YgYnVnICMzMTY2NDIzKS4gIEluc3RlYWQgd2Ugbm93IHdyYXAgaXQgaW4gYQoJICAgIFNXSUdfRkFJTCgpIGZ1bmN0aW9uIHdoaWNoIHdlIGFubm90YXRlIGFzICJub3JldHVybiIgZm9yIEdDQyB0bwoJICAgIGF2b2lkcyB3YXJuaW5ncy4gIFRoaXMgYWxzbyByZWR1Y2VzIHRoZSBzaXplIG9mIHRoZSBjb21waWxlZAoJICAgIHdyYXBwZXIgKGUuZy4gdGhlIHN0cmlwcGVkIHNpemUgaXMgcmVkdWNlZCBieSA2JSBmb3IgWGFwaWFuJ3MgUEhQCgkgICAgYmluZGluZ3MpLgoKMjAxMi0wNS0xMTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFNGIHBhdGNoICMzNTIyODU1IEZpeCB1bmludGVuZGVkIHVuaW5pdGlhbGlzZWQgbWVtb3J5IGFjY2VzcyBpbiBPVVRQVVQgdHlwZW1hcHMuCgoyMDEyLTA1LTExOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gU0YgcGF0Y2ggIzM1MjI2NzQgRml4IHBvc3NpYmxlIHVuaW5pdGlhbGlzZWQgbWVtb3J5IGFjY2VzcyBpbiBjaGFyICoqU1RSSU5HX09VVAogICAgICAgICAgICB0eXBlbWFwLgoKMjAxMi0wNS0xMTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFNGIHBhdGNoICMzNTIyNjExIEZpeCB1bmluaXRpYWxpc2VkIHNpemUgcmVncmVzc2lvbiBpbiBjaGFyICoqU1RSSU5HX0FSUkFZCiAgICAgICAgICAgIGludHJvZHVjZWQgaW4gc3dpZy0yLjAuNi4KCjIwMTItMDUtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIFNGIGJ1ZyAjMzUyNTA1MCAtIEZpeCByZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gc3dpZy0yLjAuNSB3aGVyZWJ5IGRlZmluaW5nIG9uZSB0eXBlbWFwCiAgICAgICAgICAgIG1ldGhvZCBzdWNoIGFzIGFuICdvdXQnIHR5cGVtYXAgbWF5IGhpZGUgYW5vdGhlciB0eXBlbWFwIG1ldGhvZCBzdWNoIGFzIGFuICdpbicgdHlwZW1hcCAtCiAgICAgICAgICAgIG9ubHkgb2NjdXJzIHdoZW4gdGhlIHR5cGUgaXMgYSB0ZW1wbGF0ZSB0eXBlIHdoZXJlIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGFyZSB0aGUgc2FtZQogICAgICAgICAgICB2aWEgYSB0eXBlZGVmLgoKMjAxMi0wNS0xMDogb2xseQoJICAgIFtQSFBdIEZpeCB0aGUgY29uc3RhbnQgdHlwZW1hcHMgZm9yIFNXSUdUWVBFLCBldGMgLSBwcmV2aW91c2x5CgkgICAgdGhlc2UgdXNlZCB0aGUgd3JvbmcgbmFtZSBmb3IgcmVuYW1lZCBjb25zdGFudHMuICBBZGQKCSAgICBhdXRvZG9jX3J1bm1lLnBocCB0byB0aGUgdGVzdHN1aXRlIGFzIGEgcmVncmVzc2lvbiB0ZXN0IGZvciB0aGlzLgoKMjAxMi0wNS0wMjogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIFJlbW92ZSBjb21wYXRpYmlsaXR5IHN1cHBvcnQgZm9yIGdjY2dvIDQuNi4gIFVzaW5nCgkgICAgU1dJRyB3aXRoIGdjY2dvIHdpbGwgbm93IHJlcXVpcmUgZ2NjZ28gNC43LiAgVXNpbmcgU1dJRwoJICAgIHdpdGggdGhlIG1vcmUgY29tbW9ubHkgdXNlZCBnYyBjb21waWxlciBpcyB1bmFmZmVjdGVkLgoKMjAxMi0wNS0wMTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGdlbmVyYXRlZCBjb2RlIGZvciBDIGZvcndhcmQgZW51bSBkZWNsYXJhdGlvbnMgaW4gc29tZSBsYW5ndWFnZXMuCgpWZXJzaW9uIDIuMC42ICgzMCBBcHJpbCAyMDEyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxMi0wNC0yNTogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gRml4IHVuaW5pdGlhbGlzZWQgdmFyaWFibGUgaW4gU1dJR1RZUEUgKipPVVRQVVQgdHlwZW1hcHMgYXMgcmVwb3J0ZWQgYnkgSmltIEFuZGVyc29uLgoKMjAxMi0wNC0yODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4IGNvbXBpbGF0aW9uIGVycm9ycyB3aGVuIHdyYXBwaW5nIFNUTCBjb250YWluZXJzIG9uIE1hYyBPU1ggYW5kIHBvc3NpYmx5IG90aGVyIHN5c3RlbXMuCgoyMDEyLTA0LTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUGF0Y2ggMzUyMTgxMSBmcm9tIExlbyBEYXZpcyAtIGNoYXIgKipTVFJJTkdfQVJSQVkgdHlwZW1hcHMgZml4ZWQgdG8gaGFuZGxlCiAgICAgICAgICAgIG51bGwgcG9pbnRlcnMuCgpWZXJzaW9uIDIuMC41ICgxOSBBcHJpbCAyMDEyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxMi0wNC0xNDogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gQXBwbHkgcGF0Y2ggIzM1MTc0MzUgZnJvbSBNaWxlcyBCYWRlciAtIHByZWZlciB0byB1c2UgTHVhX3B1c2hnbG9iYWx0YWJsZQoKMjAxMi0wNC0xNDogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEFwcGx5IHBhdGNoICMzNTE3NzY5IGZyb20gUm9iaW4gU3RvY2tlciB0byBmaXggY29tcGlsZSBlcnJvciBvbiBNYWNSdWJ5IHVzaW5nIFJTVFJJTkdfUFRSLgoKMjAxMi0wNC0xMzogd3NmdWx0b24KICAgICAgICAgICAgQXBwbHkgcGF0Y2ggIzM1MTEwMDkgZnJvbSBMZWlmIE1pZGRlbHNjaHVsdGUgZm9yIHNsaWdodGx5IG9wdGltaXNlZCBjaGFyICogdmFyaWFibGUgd3JhcHBlcnMuCgoyMDEyLTA0LTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBBcHBseSAjMzIxOTY3NiBmcm9tIFNoYW5lIExpZXNlZ2FuZyB3aGljaCBhZGRzOgogICAgICAgICAgICAtIHN1cHBvcnQgZm9yICVmYWN0b3J5CiAgICAgICAgICAgIC0gYSBfX3Rvc3RyaW5nIG1ldGhvZAogICAgICAgICAgICAtIGEgX19kaXNvd24gbWV0aG9kCgoyMDEyLTA0LTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbWG1sXSBBcHBseSAjMzUxMzU2OSB3aGljaCBhZGRzIGEgY2F0Y2hsaXN0IHRvIHRoZSB4bWwgb3V0cHV0LgoKMjAxMi0wNC0wNTogb2xseQoJICAgIFtMdWFdIEFkZCBzdXBwb3J0IGZvciBMdWEgNS4yIChwYXRjaCBTRiMzNTE0NTkzIGZyb20gTWlsZXMgQmFkZXIpCgoyMDEyLTAzLTI2OiB4YXZpZXI5OAoJICAgIFtvY3RhdmVdIEFwcGx5IHBhdGNoICMzNDI1OTkzIGZyb20gamdpbGxpczogYWRkIGV4dHJhIGxvZ2ljIHRvIHRoZSBvY3RhdmVfc3dpZ190eXBlOjpkaW1zKHZvaWQpIG1ldGhvZDogaXQgY2hlY2tzIGlmIHRoZSB1c2VyIGhhcyBkZWZpbmVkIGEgX19kaW1zX18gbWV0aG9kIGFuZCB1c2VzIHRoaXMgaW4gc3RlYWQgb2YgcmV0dXJuaW5nICgxLDEpCgkgICAgW29jdGF2ZV0gQXBwbHkgcGF0Y2ggIzM0MjQ4MzMgZnJvbSBqZ2lsbGlzOiBtYWtlIGlzX29iamVjdCByZXR1cm4gdHJ1ZSBmb3Igc3dpZyB0eXBlcwoKMjAxMi0wMy0yNDogd3NmdWx0b24KICAgICAgICAgICAgW0RdIEFwcGx5ICMzNTAyNDMxIHRvIGZpeCBkdXBsaWNhdGUgc3ltYm9scyBpbiBtdWx0aXBsZSBtb2R1bGVzLgoKMjAxMi0wMy0yMTogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMzNDk0NzkxIC0gJSRpc2dsb2JhbCBmb3IgJXJlbmFtZSBtYXRjaGluZy4KCjIwMTItMDMtMjA6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMzQ4NzcwNiBhbmQgIzMzOTE5MDYgLSBtaXNzaW5nIHN0ZGRlZi5oIGluY2x1ZGUgZm9yIHB0cmRpZmZfdCB3aGVuIHVzaW5nICVpbXBvcnQKICAgICAgICAgICAgZm9yIFNUTCBjb250YWluZXJzIGFuZCBjb21waWxpbmcgd2l0aCBnKystNC42LiBBbiBpbmNsdWRlIG9mIHN0ZGRlZi5oIGlzIG5vdyBvbmx5CiAgICAgICAgICAgIGdlbmVyYXRlZCB3aGVuIFNXSUcgZ2VuZXJhdGVzIFNUTCBoZWxwZXIgdGVtcGxhdGVzIHdoaWNoIHJlcXVpcmUgcHRyZGlmZl90LiBJZiB5b3UgCiAgICAgICAgICAgIHdlcmUgcHJldmlvdXNseSByZWx5aW5nIG9uICIjaW5jbHVkZSA8c3RkZGVmLmg+IiBhbHdheXMgYmVpbmcgZ2VuZXJhdGVkIHdoZW4gdXNpbmcgYQogICAgICAgICAgICAlaW5jbHVkZSBvZiBhbiBTVEwgaGVhZGVyLCB5b3UgbWF5IG5vdyBuZWVkIHRvIGFkZCB0aGlzIGluIG1hbnVhbGx5LgoKMjAxMi0wMy0xNjogd3NmdWx0b24KICAgICAgICAgICAgQXBwbHkgcGF0Y2ggIzMzOTIyNjQgZnJvbSBTZWJhc3RpZW4gQmluZSB0byBwYXJzZSAodW5zaWduZWQpIGxvbmcgbG9uZyB0eXBlcyBpbiBlbnVtIHZhbHVlIGFzc2lnbm1lbnQuCgoyMDEyLTAzLTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBBcHBseSBwYXRjaCAjMzUwNTUzMCBmcm9tIEthcmwgV2V0dGUgdG8gYWxsb3cgY3VzdG9tIGFsbG9jYXRvcnMgaW4gU1RMIHN0cmluZyBjbGFzc2VzIGZvciB0aGUgVVRMIGxhbmd1YWdlcy4KCjIwMTItMDMtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGx5IHBhdGNoICMzNDY4MzYyIGZyb20gS2FybCBXZXR0ZSB0byBmaXggJWluY2x1ZGUgaW5zaWRlICVkZWZpbmUuCgoyMDEyLTAzLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uLCBSdWJ5LCBPY3RhdmUsIFJdIEZpeCAjMzQ3NTQ5MiAtIGl0ZXJhdGluZyB0aHJvdWdoIHN0ZDo6dmVjdG9yIHdyYXBwZXJzIG9mIGVudW1lcmF0aW9ucy4KCjIwMTItMDItMjc6IHhhdmllcjk4IChwYXRjaGVzIGZyb20gS2FybCBXZXR0ZSkKCSAgICBbT2N0YXZlXSBVc2UgLWdsb2JhbHMgLiB0byBsb2FkIGdsb2JhbCB2YXJpYWJsZXMgaW4gbW9kdWxlIG5hbWVzcGFjZQoJICAgIFtPY3RhdmVdIENvbW1lbnQgZGVjbGFyYXRpb24gb2YgdW5pbXBsZW1lbnRlZCBmdW5jdGlvbiBzd2lnX3JlZ2lzdGVyX2RpcmVjdG9yCgkgICAgW09jdGF2ZV0gRml4IE9DVEFWRV9QQVRIIGluIG9jdGF2ZSBNYWtlZmlsZXMKCSAgICBbT2N0YXZlXSBBZGQgc3VwcG9ydCBmb3Igc3RkOjpsaXN0IC0gZml4IGxpX3N0ZF9jb250YWluZXJzX2ludCB0ZXN0CgkgICAgW09jdGF2ZV0gRml4IGltcG9ydHMgdGVzdAoKMjAxMi0wMi0xNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIE1ha2UgZ2VuZXJhdGVkIHN1cHBvcnQgZnVuY3Rpb25zIGluIGFycmF5c19qYXZhLmkgc3RhdGljIHNvIHRoYXQgZ2VuZXJhdGVkIGNvZGUKICAgICAgICAgICAgZnJvbSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgU1dJRyBjYW4gYmUgY29tcGlsZWQgYW5kIGxpbmtlZCB0b2dldGhlciAtIHByb2JsZW0gcmVwb3J0ZWQgYnkKICAgICAgICAgICAgRXZhbiBLcmF1c2UuCgoyMDEyLTAxLTI0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggY3Jhc2ggd2l0aCBiYWQgcmVnZXggLSBidWcgIzM0NzQyNTAuCgoyMDEyLTAxLTI0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBZGQgUHl0aG9uIHN0ZXBwZWQgc2xpY2luZyBzdXBwb3J0IHRvIHRoZSBTVEwgd3JhcHBlcnMgKHN0ZDo6dmVjdG9yLCBzdGQ6Omxpc3QpLgogICAgICAgICAgICBBc3NpZ25pbmcgdG8gYSBzbGljZSwgcmVhZGluZyBhIHNsaWNlIGFuZCBkZWxldGluZyBhIHNsaWNlIHdpdGggc3RlcHMgbm93IHdvcmsuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgJXRlbXBsYXRlKHZlY3Rvcl9pKSBzdGQ6OnZlY3RvcjxpbnQ+CgogICAgICAgICAgICAgIHZpID0gdmVjdG9yX2kocmFuZ2UoMTApKQogICAgICAgICAgICAgIHByaW50IGxpc3QodmkpCiAgICAgICAgICAgICAgdmlbMTo0OjJdID0gWzExMSwgMzMzXQogICAgICAgICAgICAgIHByaW50IGxpc3QodmkpCiAgICAgICAgICAgICAgZGVsIHZpWzM6MTA6M10KICAgICAgICAgICAgICBwcmludCBsaXN0KHZpKQogICAgICAgICAgICAgIHByaW50IGxpc3QodmlbOjotMV0pCgogICAgICAgICAgICBnaXZlcyAoc2FtZSBiZWhhdmlvdXIgYXMgbmF0aXZlIFB5dGhvbiBzZXF1ZW5jZXMgc3VjaCBhcyBsaXN0KToKCiAgICAgICAgICAgICAgWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldCiAgICAgICAgICAgICAgWzAsIDExMSwgMiwgMzMzLCA0LCA1LCA2LCA3LCA4LCA5XQogICAgICAgICAgICAgIFswLCAxMTEsIDIsIDQsIDUsIDcsIDhdCiAgICAgICAgICAgICAgWzgsIDcsIDUsIDQsIDIsIDExMSwgMF0KCjIwMTItMDEtMjM6IGtsaWNrdmVyYm90CiAgICAgICAgICAgIFtEXSBDb3JyZWN0bHkgYW5ub3RhdGUgZnVuY3Rpb24gcG9pbnRlcnMgd2l0aCBDIGxpbmthZ2UuCiAgICAgICAgICAgIFtEXSBFeGNlcHRpb24gYW5kIEVycm9yIGhhdmUgYmVjb21lIGJsZXNzZWQgbmFtZXM7IHJlbW92ZWQgZF9leGNlcHRpb25fbmFtZSB0ZXN0IGNhc2UuCgoyMDEyLTAxLTIwOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggc29tZSBpbmRleGluZyBidWdzIGluIFB5dGhvbiBTVEwgd3JhcHBlcnMgd2hlbiB0aGUgaW5kZXggaXMgbmVnYXRpdmUsIGVnOgoKICAgICAgICAgICAgJXRlbXBsYXRlKHZlY3Rvcl9pKSBzdGQ6OnZlY3RvcjxpbnQ+CgogICAgICAgICAgICAgIGl2PXZlY3Rvcl9pKFswLDEsMiwzLDQsNV0pCiAgICAgICAgICAgICAgaXZbLTc6XQoKICAgICAgICAgICAgbm93IHJldHVybnMgWzAsIDEsIDIsIDMsIDQsIDVdIGluc3RlYWQgb2YgWzVdLgoKICAgICAgICAgICAgICB2dls3OjldID0gWzIyLDMzXQoKICAgICAgICAgICAgbm93IHJldHVybnMgWzAsIDEsIDIsIDMsIDQsIDUsIDIyLCAzM10gaW5zdGVhZCBvZiAiaW5kZXggb3V0IHJhbmdlIiBlcnJvci4KCiAgICAgICAgICAgIEFsc28gZml4IHNvbWUgc2VnZmF1bHRzIHdoZW4gcmVwbGFjaW5nIHJhbmdlcywgZWcgd2hlbiBpbCBpcyBhIHN0ZDo6bGlzdCB3cmFwcGVyOgoKICAgICAgICAgICAgICBpbFswOjJdID0gWzExXQoKMjAxMi0wMS0xNzogd3NmdWx0b24KICAgICAgICAgICAgW0dvXSBGaXggZm9yd2FyZCBjbGFzcyBkZWNsYXJhdGlvbiB3aXRoaW4gYSBjbGFzcyB3aGVuIHVzZWQgYXMgYSBiYXNlLgoKMjAxMi0wMS0wNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGQgc3VwcG9ydCBmb3IgJW5zcGFjZSB3aGVuIHVzaW5nIGRpcmVjdG9ycy4KCjIwMTItMDEtMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQYXRjaCAjMzQ1MjU2MCBmcm9tIEJyYW50IEt5c2VyIC0gYWRkIHN1cHBvcnQgZm9yICVuc3BhY2Ugd2hlbiB1c2luZyBkaXJlY3RvcnMuCgoyMDExLTEyLTIxOiB3c2Z1bHRvbgogICAgICAgICAgICBUaGUgJ2RpcmVjdG9yaW4nIHR5cGVtYXAgbm93IGFjY2VwdHMgJDEsICQyIGV0YyBleHBhbnNpb25zIGluc3RlYWQgb2YgaGF2aW5nIHRvIHVzZSB3b3JrYXJvdW5kcyAtCiAgICAgICAgICAgICQxX25hbWUsICQyX25hbWUgZXRjLgoKMjAxMS0xMi0yMDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFkZCAoY2hhciAqU1RSSU5HLCBzaXplX3QgTEVOR1RIKSBkaXJlY3RvciB0eXBlbWFwcy4KCjIwMTEtMTItMjA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgR28sIEphdmEsIERdIEFkZCBzdXBwb3J0IGZvciB0aGUgJ2RpcmVjdG9yYXJnb3V0JyB0eXBlbWFwLgoKMjAxMS0xMi0yMDogd3NmdWx0b24KICAgICAgICAgICAgW09jYW1sLCBPY3RhdmUsIFBIUCwgUHl0aG9uLCBSdWJ5XSBDb3JyZWN0IHNwZWNpYWwgdmFyaWFibGVzIGluICdkaXJlY3RvcmFyZ291dCcgdHlwZW1hcC4KICAgICAgICAgICAgVGhpcyBjaGFuZ2Ugd2lsbCBicmVhayBhbnkgJ2RpcmVjdG9yYXJnb3V0JyB0eXBlbWFwcyB5b3UgbWF5IGhhdmUgd3JpdHRlbi4gUGxlYXNlIGNoYW5nZToKICAgICAgICAgICAgICAkcmVzdWx0IHRvICQxCiAgICAgICAgICAgICAgJGlucHV0IHRvICRyZXN1bHQKCiAgICAgICAgICAgIEFsc28gZml4IHRoZSBuYW1lZCAnZGlyZWN0b3JhcmdvdXQnIERJUkVDVE9ST1VUIHR5cGVtYXBzIGZvciB0aGVzZSBsYW5ndWFnZXMgd2hpY2ggZGlkbid0CiAgICAgICAgICAgIHByZXZpb3VzbHkgY29tcGlsZSBhbmQgYWRkIGluICQxLCAkMiBldGMgZXhwYW5zaW9uLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxMS0xMi0xMDogdGFsYnkKICAgICAgICAgICAgW3Blcmw1XSBTV0lHX2Vycm9yKCkgbm93IGdldHMgZGVjb3JhdGVkIHdpdGggcGVybCBzb3VyY2UgZmlsZS9saW5lIG51bWJlci4KICAgICAgICAgICAgW3Blcmw1XSBlcnJvciBoYW5kbGluZyBub3cgY29uZm9ybXMgdG8gcHVibGljIFhTIGFwaSAoZml4ZXMgcGVybCB2NS4xNCBpc3N1ZSkuCgoyMDExLTEyLTEwOiB3c2Z1bHRvbgogICAgICAgICAgICBbQW5kcm9pZC9KYXZhXSBGaXggZGlyZWN0b3JzIHRvIGNvbXBpbGUgb24gQW5kcm9pZC4KCiAgICAgICAgICAgIEFkZGVkIGRvY3VtZW50YXRpb24gYW5kIGV4YW1wbGVzIGZvciBBbmRyb2lkLgoKMjAxMS0xMi0wODogdmFkegoJICAgIEJ1ZyBmaXg6IEhhbmRsZSBtZXRob2RzIHJlbmFtZWQgb3IgaWdub3JlZCBpbiB0aGUgYmFzZSBjbGFzcyBjb3JyZWN0bHkgaW4gdGhlIGRlcml2ZWQgY2xhc3NlcwoJICAgICh0aGV5IGNvdWxkIGJlIHNvbWV0aW1lcyBteXN0ZXJpb3VzbHkgbm90IHJlbmFtZWQgb3IgaWdub3JlZCB0aGVyZSBiZWZvcmUpLgoKMjAxMS0xMi0wMzoga2xpY2t2ZXJib3QKICAgICAgICAgICAgW0RdIEZpeCBleGNlcHRpb24gZ2x1ZSBjb2RlIGZvciBuZXdlciBETUQgMiB2ZXJzaW9ucy4KICAgICAgICAgICAgW0RdIERvIG5vdCBkZWZhdWx0IHRvIDMyIGJpdCBnbHVlIGNvZGUgZm9yIERNRCBhbnltb3JlLgogICAgICAgICAgICBbRF0gVXNlIHN0ZGMuY29uZmlnLmNfbG9uZy9jX3Vsb25nIHRvIHJlcHJlc2VudCBDIGxvbmcgdHlwZXMuCgoyMDExLTEyLTAxOiBzemFnZXIKCSAgICBbcHl0aG9uXSBGaXhlZCBidWcgMzQ0NzQyNjogbWVtb3J5IGxlYWsgaW4gdmVjdG9yLl9fZ2V0aXRlbV9fLgoKMjAxMS0xMS0zMDogd3NmdWx0b24KICAgICAgICAgICAgW1JdIFJlbW92ZSBDKysgY29tbWVudHMgZnJvbSBnZW5lcmF0ZWQgQyBjb2RlLgoKMjAxMS0xMS0yNzogb2xseQoJICAgIFtQeXRob25dIEZpeCBzb21lIHdhcm5pbmdzIHdoZW4gY29tcGlsaW5nIGdlbmVyYXRlZCB3cmFwcGVycyB3aXRoCgkgICAgY2VydGFpbiBHQ0Mgd2FybmluZyBvcHRpb25zIChEZWJpYW4gYnVnICM2NTAyNDYpLgoKMjAxMS0xMS0yODogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMzNDMzNTQxICV0eXBlbWFwKGluLCBudW1pbnB1dHM9MCkgd2l0aCAxMCsgYXJndW1lbnRzLgoKMjAxMS0xMS0yODogb2xseQoJICAgIFtQZXJsXSBGaXggd2FybmluZ3Mgd2hlbiBjb21waWxpbmcgZ2VuZXJhdGVkIHdyYXBwZXJzIHdpdGggY2VydGFpbgoJICAgIEdDQyB3YXJuaW5nIG9wdGlvbnMgKERlYmlhbiBidWcgIzQzNjcxMSkuCgoyMDExLTExLTI4OiBvbGx5CgkgICAgW1BIUF0gVXBkYXRlIGtleXdvcmQgbGlzdCB0byBpbmNsdWRlIGtleXdvcmRzIGFkZGVkIGluIFBIUCByZWxlYXNlcyB1cCB0byA1LjMuCgoyMDExLTExLTI1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFByb3ZpZGUgYW4gZWFzeSB3YXkgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgdmlzaWJpbGl0eSBmb3IgdGhlIHByb3h5IGNsYXNzIHBvaW50ZXIKICAgICAgICAgICAgY29uc3RydWN0b3JzIGFuZCBnZXRDUHRyKCkgbWV0aG9kLiBUaGUgdmlzaWJpbGl0eSBpcyAnaW50ZXJuYWwnIGJ5IGRlZmF1bHQgYW5kIGlmIG11bHRpcGxlCiAgICAgICAgICAgIFNXSUcgbW9kdWxlcyBhcmUgYmVpbmcgdXNlZCBhbmQgY29tcGlsZWQgaW50byBkaWZmZXJlbnQgYXNzZW1ibGllcywgdGhlbiB0aGV5IG5lZWQgdG8gYmUgCiAgICAgICAgICAgICdwdWJsaWMnIGluIG9yZGVyIHRvIHVzZSB0aGUgY29uc3RydWN0b3Igb3IgZ2V0Q1B0cigpIG1ldGhvZCBmcm9tIGEgZGlmZmVyZW50IGFzc2VtYmx5LgogICAgICAgICAgICBVc2UgdGhlIGZvbGxvd2luZyBtYWNyb3MgdG8gY2hhbmdlIHRoZSB2aXNpYmlsaXRpZXMgaW4gdGhlIHByb3h5IGFuZCB0eXBlIHdyYXBwZXIgY2xhc3M6CgogICAgICAgICAgICAgIFNXSUdfQ1NCT0RZX1BST1hZKHB1YmxpYywgcHVibGljLCBTV0lHVFlQRSkKICAgICAgICAgICAgICBTV0lHX0NTQk9EWV9UWVBFV1JBUFBFUihwdWJsaWMsIHB1YmxpYywgcHVibGljLCBTV0lHVFlQRSkKCiAgICAgICAgICAgIFtKYXZhXSBQcm92aWRlIGFuIGVhc3kgd2F5IHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHZpc2liaWxpdHkgZm9yIHRoZSBwcm94eSBjbGFzcyBwb2ludGVyCiAgICAgICAgICAgIGNvbnN0cnVjdG9ycyBhbmQgZ2V0Q1B0cigpIG1ldGhvZC4gVGhlIHZpc2liaWxpdHkgaXMgJ3Byb3RlY3RlZCcgYnkgZGVmYXVsdCBhbmQgaWYgbXVsdGlwbGUKICAgICAgICAgICAgU1dJRyBtb2R1bGVzIGFyZSBiZWluZyB1c2VkIGFuZCBjb21waWxlZCBpbnRvIGRpZmZlcmVudCBwYWNrYWdlcywgdGhlbiB0aGV5IG5lZWQgdG8gYmUgCiAgICAgICAgICAgICdwdWJsaWMnIGluIG9yZGVyIHRvIHVzZSB0aGUgY29uc3RydWN0b3Igb3IgZ2V0Q1B0cigpIG1ldGhvZCBmcm9tIGEgZGlmZmVyZW50IHBhY2thZ2UuCiAgICAgICAgICAgIFVzZSB0aGUgZm9sbG93aW5nIG1hY3JvcyB0byBjaGFuZ2UgdGhlIHZpc2liaWxpdGllcyBpbiB0aGUgcHJveHkgYW5kIHR5cGUgd3JhcHBlciBjbGFzczoKCiAgICAgICAgICAgICAgU1dJR19KQVZBQk9EWV9QUk9YWShwdWJsaWMsIHB1YmxpYywgU1dJR1RZUEUpCiAgICAgICAgICAgICAgU1dJR19KQVZBQk9EWV9UWVBFV1JBUFBFUihwdWJsaWMsIHB1YmxpYywgcHVibGljLCBTV0lHVFlQRSkKCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IGZvciBKYXZhIGhhcyBjaGFuZ2VkIGZyb20gcHVibGljIHRvIHByb3RlY3RlZCBmb3IgdGhlIHByb3h5IGNsYXNzZXMuIFVzZSB0aGUKICAgICAgICAgICAgU1dJR19KQVZBQk9EWV9QUk9YWSBtYWNybyBhYm92ZSB0byByZXN0b3JlIHRvIHRoZSBwcmV2aW91cyB2aXNpYmlsaXRpZXMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDExLTExLTIyOiBzemFnZXIKCSAgICBbcHl0aG9uXSBCdWcgMzQ0MDA0NDogI2lmZGVmIG91dCBTV0lHX1B5dGhvbl9Ob25EeW5hbWljU2V0QXR0ciBpZiAtYnVpbHRpbgoJICAgIGlzbid0IGJlaW5nIHVzZWQsIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGJpbmFyeSBpbmNvbXBhdGliaWxpdGllcyBiZXR3ZWVuCgkgICAgcHl0aG9uIGluc3RhbGxhdGlvbnMuCgoyMDExLTExLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBCdWcgZml4OiBSZW1vdmUgcm9vdCBkaXJlY3RvcnkgZnJvbSBkaXJlY3Rvcnkgc2VhcmNoIGxpc3QgaW4gV2luZG93cy4KCjIwMTEtMTEtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBBcHBseSBwYXRjaCAjMzQyMTg3NiBmcm9tIFJvYmluIFN0b2NrZXIgdG8gZml4ICMzNDE2ODE4IC0gc2FtZSBjbGFzcyBuYW1lIGluIAogICAgICAgICAgICBkaWZmZXJlbnQgbmFtZXNwYWNlcyBjb25mdXNpb24gd2hlbiB1c2luZyBtdWx0aXBsZSBtb2R1bGVzLgoKMjAxMS0xMS0xMTogd3NmdWx0b24KICAgICAgICAgICAgRml4IHBjcmUtYnVpbGQuc2ggdG8gd29yayB3aXRoIG5vbi1jb21wcmVzc2VkIHRhcmJhbGxzIC0gcHJvYmxlbSByZXBvcnRlZCBieSBBZHJpYW4gQmxha2VseS4KCjIwMTEtMTEtMDM6IHdzZnVsdG9uCiAgICAgICAgICAgIEV4cGFuZCBzcGVjaWFsIHZhcmlhYmxlcyBpbiB0eXBlbWFwIHdhcm5pbmdzLCBlZzoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4sIHdhcm5pbmc9IjEwMDA6VGVzdCB3YXJuaW5nIGZvciAnaW4nIHR5cGVtYXAgZm9yICQxX3R5cGUgJDFfbmFtZSIpIGludCAiLi4uIgoKMjAxMS0xMS0wMTogd3NmdWx0b24KICAgICAgICAgICAgRml4IG5hbWVkIG91dHB1dCB0eXBlbWFwcyBub3QgYmVpbmcgdXNlZCB3aGVuIHRoZSBzeW1ib2wgdXNlcyBhIHF1YWxpZmllciBhbmQgY29udGFpbnMKICAgICAgICAgICAgYSBudW1iZXIsIGVnOgoKICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIGRvdWJsZSBBQkM6Om0xICIuLi4iCgoyMDExLTEwLTI0OiB0YWxieQogICAgICAgICAgICBbcGVybDVdIFNGIGJ1ZyAjMzQyMzExOSAtIG92ZXJsb2FkIGRpc3BhdGNoIHN0YWNrIGNvcnJ1cHRpb24gZml4LiAgQmV0dGVyLCBidXQgbW9yZSByZXNlYXJjaAogICAgICAgICAgICBpcyBuZWVkZWQgb24gYSBzdGFibGUgcGF0aCBmb3IgdGFpbCBjYWxscyBpbiBYUy4KCiAgICAgICAgICAgIEFsc28sIGZpeCBmb3IgbGFyZ2UgbG9uZyBsb25ncyBpbiAzMiBiaXQgcGVybC4KCjIwMTEtMTAtMTM6IHhhdmllcjk4CgkgICAgW29jdGF2ZV0gQWxsb3cgT2N0YXZlIG1vZHVsZXMgdG8gYmUgcmUtbG9hZGVkIGFmdGVyIGEgImNsZWFyIGFsbCIuCgoyMDExLTA5LTE5OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggcmVncmVzc2lvbiBpbnRyb2R1Y2VkIGluIHN3aWctMi4wLjEgcmVwb3J0ZWQgYnkgVGVlbXUgSWtvbm9uZSBsZWFkaW5nIHRvIHVuY29tcGlsYWJsZSBjb2RlCiAgICAgICAgICAgIHdoZW4gdXNpbmcgdHlwZWRlZiBhbmQgZnVuY3Rpb24gcG9pbnRlciByZWZlcmVuY2VzLCBmb3IgZXhhbXBsZTogCgogICAgICAgICAgICAgIHR5cGVkZWYgaW50IEZOKGNvbnN0IGludCAmYSwgaW50IGIpOwogICAgICAgICAgICAgIHZvaWQgKnR5cGVkZWZfY2FsbDEoRk4gKiYgcHJlY2FsbGJhY2ssIEZOICogcG9zdGNhbGxiYWNrKTsKCjIwMTEtMDktMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIFBhdGNoICMzNDA4MDEyIGZyb20gUmFtYW4gR29wYWxhbiAtIGFkZCBzdXBwb3J0IGZvciBlbWJlZGRlZCBMdWEgKGVMdWEpCiAgICAgICAgICAgIGluY2x1ZGluZyBvcHRpb25zIGZvciB0YXJnZXRpbmcgTHVhIFRpbnkgUkFNIChMVFIpLgoKMjAxMS0wOS0xNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGQgYm9vc3RfaW50cnVzaXZlX3B0ci5pIGxpYnJhcnkgY29udHJpYnV0aW9uIGZyb20gcGF0Y2ggIzM0MDE1NzEuCgoyMDExLTA5LTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgd2FybmluZ3MgZm9yIGJhZGx5IG5hbWVkIGRlc3RydWN0b3JzLCBlZzoKCiAgICAgICAgICAgICAgc3RydWN0IEtTdHJ1Y3QgewogICAgICAgICAgICAgICAgfk5PVF9LU3RydWN0KCkge30KICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgY3BwX2V4dGVuZF9kZXN0cnVjdG9ycy5pOjkyOiBXYXJuaW5nIDUyMTogSWxsZWdhbCBkZXN0cnVjdG9yIG5hbWUgfk5PVF9LU3RydWN0LiBJZ25vcmVkLgoKMjAxMS0wOS0xMzogd3NmdWx0b24KICAgICAgICAgICAgRml4ICVleHRlbmQgYW5kIGRlc3RydWN0b3JzIGZvciB0ZW1wbGF0ZXMuIFRoZSBkZXN0cnVjdG9yIGluICVleHRlbmQgd2FzIG5vdCBhbHdheXMgd3JhcHBlZCwKICAgICAgICAgICAgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVleHRlbmQgRm9vVCB7CiAgICAgICAgICAgICAgICB+Rm9vVCgpIHsgZGVsZXRlICRzZWxmOyB9IC8vIHdhcyBub3Qgd3JhcHBlZCBhcyBleHBlY3RlZAogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgRm9vVCB7fTsKICAgICAgICAgICAgICAldGVtcGxhdGUoRm9vVGkpIEZvb1Q8aW50PjsKCjIwMTEtMDktMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzcGVjaWFsIHZhcmlhYmxlcyBzdWNoIGFzICIkZGVjbCIgYW5kICIkZnVsbGRlY2wiIGluIGRlc3RydWN0b3JzIHRvIGluY2x1ZGUgdGhlIH4gY2hhcmFjdGVyLgoKMjAxMS0wOS0xMDogdGFsYnkKICAgICAgICAgICAgW3Blcmw1XSBTRiBidWcgIzE0ODE5NTggLSBJbXByb3ZlIHJhbmdlIGNoZWNraW5nIGZvciBpbnRlZ2VyIHR5cGVzLgogICAgICAgICAgICBFbmhhbmNlIGxpX3R5cGVtYXBzX3J1bm1lLnBsCgoyMDExLTA5LTA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJWV4dGVuZCBvbiB0eXBlZGVmIGNsYXNzZXMgaW4gYSBuYW1lc3BhY2UgdXNpbmcgdGhlIHR5cGVkZWYgbmFtZSwgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZSB7CiAgICAgICAgICAgICAgJWV4dGVuZCBDU3RydWN0IHsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCB0YWdDU3RydWN0IHsgLi4uIH0gQ1N0cnVjdDsKICAgICAgICAgICAgfQoKMjAxMS0wOC0zMTogeGF2aWVyOTgKCSAgICBbb2N0YXZlXSBwYXRjaGVzIGZyb20gS2FybCBXZXR0ZTogaW1wcm92ZW1lbnRzIHRvIG1vZHVsZSBsb2FkaW5nIGJlaGF2aW9yOwoJICAgIGFkZGVkIGV4YW1wbGUgb2YgZnJpZW5kIG9wZXJhdG9yIHRvIG9wZXJhdG9yIGV4YW1wbGU7IGZpeGVkIG9jdGF2ZSBwYW5pYy9jcmFzaCBpbiAzLjAuNTsKCSAgICBkb2N1bWVudGF0aW9uIGltcHJvdmVtZW50cwoKMjAxMS0wOC0zMDogc3phZ2VyCgkgICAgW3B5dGhvbl0gQnVnIDM0MDA0ODYsIGZpeCBlcnJvciBzaWduYWxsaW5nIGZvciBidWlsdC1pbiBjb25zdHJ1Y3RvcnMuCgoyMDExLTA4LTI2OiB3c2Z1bHRvbgogICAgICAgICAgICBbR29dIEZpeCBmaWxlL2xpbmUgbnVtYmVyIGRpc3BsYXkgZm9yICJnb3R5cGUiIHdoZW4gdXNpbmcgdHlwZW1hcCBkZWJ1Z2dpbmcgb3B0aW9ucwogICAgICAgICAgICAtdG1zZWFyY2ggYW5kIC10bXVzZWQuCgoyMDExLTA4LTI2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIERdIEZpeCAlY2FsbGJhY2sgd2hpY2ggd2FzIGdlbmVyYXRpbmcgdW5jb21waWxlYWJsZSBjb2RlLgoKMjAxMS0wOC0yNTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGNvbnN0cnVjdG9ycyBpbiBuYW1lZCB0eXBlZGVmIGNsYXNzIGRlY2xhcmF0aW9ucyBhcyByZXBvcnRlZCBieSBHcmVnb3J5IEJyb25uZXI6CgogICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCBBIHsKICAgICAgICAgICAgICBBKCl7fSAvLyBDb25zdHJ1Y3RvciB3aGljaCB3YXMgbm90IGFjY2VwdGVkIGJ5IFNXSUcKICAgICAgICAgICAgICBCKCl7fSAvLyBOT1QgYSBjb25zdHJ1Y3RvciAtLWlsbGVnYWwsIGJ1dCB3YXMgYWNjZXB0ZWQgYnkgU1dJRwogICAgICAgICAgICB9IEI7CgogICAgICAgICAgICBGb3IgQyBjb2RlLCB0aGUgZml4IG5vdyByZXN1bHRzIGluIHRoZSB1c2Ugb2YgJ3N0cnVjdCBBIConIGluc3RlYWQgb2YganVzdCAnQiAqJyBpbgogICAgICAgICAgICB0aGUgZ2VuZXJhdGVkIGNvZGUgd2hlbiB3cmFwcGluZyBtZW1iZXJzIGluIEEsIGJ1dCB1bHRpbWF0ZWx5IHRoaXMgZG9lcyBub3QgbWF0dGVyLCBhcwogICAgICAgICAgICB0aGV5IGFyZSB0aGUgc2FtZSB0aGluZy4KCjIwMTEtMDgtMjM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAlbmV3b2JqZWN0IHdoZW4gdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoICVmZWF0dXJlKCJyZWYiKSBhcyByZXBvcnRlZCBieSBKYW4gQmVja2VyLiBUaGUKICAgICAgICAgICAgY29kZSBmcm9tIHRoZSAicmVmIiBmZWF0dXJlIHdhcyBub3QgYWx3YXlzIGJlaW5nIGdlbmVyYXRlZCBmb3IgdGhlIGZ1bmN0aW9uIHNwZWNpZmllZCBieSAlbmV3b2JqZWN0LgogICAgICAgICAgICBEb2N1bWVudGF0aW9uIGZvciAicmVmIiBhbmQgInVucmVmIiBtb3ZlZCBmcm9tIFB5dGhvbiB0byB0aGUgQysrIGNoYXB0ZXIuCgoyMDExLTA4LTIyOiBzemFnZXIKCSAgICBbcHl0aG9uXSBGaXhlZCBtZW1vcnkgbGVhayB3aXRoIC0tYnVpbHRpbiBvcHRpb24gKGJ1ZyAzMzg1MDg5KS4KCjIwMTEtMDgtMjI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIFNGIHBhdGNoICMzMzk0MzM5IGZyb20gVG9yc3RlbiBMYW5kc2Nob2ZmIC0gbmV3IG9wdGlvbiAtbm9tb2R1bGVnbG9iYWwgdG8gZGlzYWJsZSBpbnN0YWxsaW5nIAogICAgICAgICAgICB0aGUgbW9kdWxlIHRhYmxlIGludG8gdGhlIGdsb2JhbCBuYW1lc3BhY2UuIFJlcXVpcmUgY2FsbCBhbHNvIHJldHVybnMgdGhlIG1vZHVsZSB0YWJsZSBpbnN0ZWFkIAogICAgICAgICAgICBvZiBhIHN0cmluZy4KCjIwMTEtMDgtMDk6IHhhdmllcjk4CiAgICAgICAgICAgIEZpeCBidWcgMzM4NzM5NDsgT2N0YXZlIHBhdGNoZXMgZm9yIDMuNC4wIGNvbXBhdGliaWxpdHksIGV0Yy4gKGZyb20gS2FybCBXZXR0ZSkKCjIwMTEtMDgtMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBpbiAkc3ltbmFtZSBleHBhbnNpb24gZm9yIGRpcmVjdG9yIG1ldGhvZHMuCgoyMDExLTA3LTI5OiBvbGx5CgkgICAgW1BIUF0gRG9uJ3QgZ2VuZXJhdGUgInJldHVybiAkcjsiIGluIGNhc2VzIHdoZXJlICRyIGhhc24ndCBiZWVuIHNldC4KCSAgICBUaGlzIHdhcyBiYXNpY2FsbHkgaGFybWxlc3MsIGV4Y2VwdCBpdCBnZW5lcmF0ZWQgYSBQSFAgRV9OT1RJQ0UgaWYKCSAgICB0aGUgY2FsbGluZyBjb2RlIGhhZCBlbmFibGVkIHRoZW0uCgoyMDExLTA3LTI2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc2NvcGluZyBvZiBmb3J3YXJkIGNsYXNzIGRlY2xhcmF0aW9ucyBuZXN0ZWQgd2l0aGluIGEgY2xhc3MgKGZvciBDKyspLiBQcmV2aW91c2x5IHRoZSBzeW1ib2wKICAgICAgICAgICAgd2FzIGluY29ycmVjdGx5IHB1dCBpbnRvIHRoZSBvdXRlciBuYW1lc3BhY2UsIGVnCgogICAgICAgICAgICBuYW1lc3BhY2Ugc3RkIHsKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBLZXksIGNsYXNzIFQ+IHN0cnVjdCBtYXAgewogICAgICAgICAgICAgICAgY2xhc3MgaXRlcmF0b3I7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaXRlcmF0b3Igd2FzIHNjb3BlZCBhcyBzdGQ6Oml0ZXJhdG9yLCBidXQgbm93IGl0IGlzIGNvcnJlY3RseSBzdGQ6Om1hcDxLZXksIFQ+OjppdGVyYXRvcjsKCiAgICAgICAgICAgIEFsc28gZml4ZWQgaXMgJXRlbXBsYXRlIGFuZCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIHRoYXQgYXJlIGEgdHlwZWRlZiB3aGVuIHRoZSB0ZW1wbGF0ZSBjb250YWlucwogICAgICAgICAgICBkZWZhdWx0IHRlbXBsYXRlIHBhcmFtZXRlcnMsIGVnOgoKICAgICAgICAgICAgbmFtZXNwYWNlIFN0ZCB7CiAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgS2V5LCBjbGFzcyBULCBjbGFzcyBDID0gaW50PiBzdHJ1Y3QgTWFwIHsKICAgICAgICAgICAgICAgIHR5cGVkZWYgS2V5IGtleV90eXBlOwogICAgICAgICAgICAgICAgdHlwZWRlZiBUIG1hcHBlZF90eXBlOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHlwZWRlZiBkb3VibGUgRE9VQkxFOwogICAgICAgICAgICAldGVtcGxhdGUoTU0pIFN0ZDo6TWFwPGludCwgRE9VQkxFPjsKCiAgICAgICAgICAgIEFsbCBzeW1ib2xzIHdpdGhpbiBNYXAgd2lsbCBiZSByZXNvbHZlZCBjb3JyZWN0bHksIGVnIGtleV90eXBlIGFuZCBtYXBwZWRfdHlwZSBubyBtYXR0ZXIgaWYgdGhlCiAgICAgICAgICAgIHdyYXBwZWQgY29kZSB1c2VzIFN0ZDo6TWFwPGludCwgZG91YmxlPiBvciBzdGQ6Ok1hcDxpbnQsIERPVUJMRT4gb3IgU3RkOjpNYXA8aW50LCBkb3VibGUsIGludD4KCiAgICAgICAgICAgIEFsc28gZml4ZXMgYnVnICMzMzc4MTQ1IC0gcmVncmVzc2lvbiBpbnRyb2R1Y2VkIGluIDIuMC40IC0gJXRlbXBsYXRlIHVzaW5nIHRyYWl0cy4KCjIwMTEtMDctMjAgIHN6YWdlcgoJICAgIFtweXRob25dIEZpeCBjbG9zdXJlIGZvciB0cF9jYWxsIHNsb3QuCgoyMDExLTA3LTE2OiB3c2Z1bHRvbgoJICAgIFtweXRob25dIEZpeCBkaXJlY3RvciB0eXBlbWFwIHVzaW5nIFB5T2JqZWN0ICouCgoyMDExLTA3LTEzOiBzemFnZXIKCSAgICBbcHl0aG9uXSBTRiBwYXRjaCAjMzM2NTkwOCAtIEFkZCBhbGwgdGVtcGxhdGUgcGFyYW1ldGVycyB0byBtYXAgc3VwcG9ydCBjb2RlIGluIHN0ZF9tYXAuaQoKMjAxMS0wNy0xMzogc3phZ2VyCgkgICAgW3B5dGhvbl0gRml4IGZvciBidWcgMzMyNDc1MzogJXJlbmFtZSBtZW1iZXIgdmFyaWFibGVzIHdpdGggLWJ1aWx0aW4uCgoyMDExLTA3LTAxOiB3c2Z1bHRvbgoJICAgIEZpeCBzb21lIHNjb3BlIGFuZCBzeW1ib2wgbG9va3VwIHByb2JsZW1zIHdoZW4gdGVtcGxhdGUgZGVmYXVsdCBwYXJhbWV0ZXJzIGFyZSBiZWluZwogICAgICAgICAgICB1c2VkIHdpdGggdHlwZWRlZi4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBYWCwgdHlwZW5hbWUgVFQgPSBTb21lVHlwZT4gc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgdHlwZWRlZiBYWCBYOwogICAgICAgICAgICAgIHR5cGVkZWYgVFQgVDsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVFQ+IHN0cnVjdCBVc2VzRm9vIHsKICAgICAgICAgICAgICB2b2lkIHgodHlwZW5hbWUgRm9vPFRUPjo6VCwgdHlwZW5hbWUgRm9vPFRUPjo6WCk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBBbHNvIGZpeGVzIHVzZSBvZiBzdGQ6OnZlY3RvcjxpbnQ+OjpzaXplX3R5cGUgZm9yIFB5dGhvbiBhcyByZXBvcnRlZCBieSBBdWJyZXkgQmFybmFyZC4KCjIwMTEtMDYtMjM6IG9sbHkKCSAgICBbUEhQXSBGaXggZGlyZWN0b3IgY29kZSB0byB3b3JrIHdoZW4gUEhQIGlzIGJ1aWx0IHdpdGggWlRTIGVuYWJsZWQsCgkgICAgd2hpY2ggaXMgdGhlIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gb24gTWljcm9zb2Z0IFdpbmRvd3MuCgoyMDExLTA2LTIxOiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgLSB2YXJpb3VzIHNtYWxsIHR3ZWFrcyBhbmQgYnVnIGZpeGVzLgoJICAgIC0gQXZvaWQgbmFtZSBjb25mbGljdHMgYmV0d2VlbiBzbWFydCBwb2ludGVyIHdyYXBwZXJzIGFuZCB0aGUgd3JhcHBlcnMgZm9yCgkgICAgdGhlIGFjdHVhbCBjbGFzcy4KCSAgICAtIEZpeCBkZWZhdWx0IHR5cGVtYXBzIGZvciBDIGJpbmRpbmdzLCB3aGljaCB3ZXJlIGluY29ycmVjdGx5IGF0dGVtcHRpbmcgdG8KCSAgICBjYWxsIG5vbi1leGlzdGVudCBkZXN0cnVjdG9ycyBvbiB1c2VyLWRlZmluZWQgdHlwZXMuCgkgICAgLSBOZXcgZmVhdHVyZSwgZmVhdHVyZTphY2xtaXhpbnMsIGZvciBhZGRpbmcgc3VwZXJjbGFzcyB0byB0aGUgZm9yZWlnbiBjbGFzcwoJICAgIHdyYXBwZXJzLgoJICAgIC0gSW1wcm92ZSBsb25nbG9uZyB0eXBlbWFwcy4KCjIwMTEtMDYtMTk6IHdzZnVsdG9uCgkgICAgRml4IGluY29ycmVjdCB0eXBlbWFwcyBiZWluZyB1c2VkIGZvciBhIHN5bWJvbCB3aXRoaW4gYSB0ZW1wbGF0ZWQgdHlwZSwgZWc6CiAgICAgICAgICAgIEE8aW50Pjo6dmFsdWVfdHlwZSB3b3VsZCBpbmNvcnJlY3RseSB1c2UgYSB0eXBlbWFwIGZvciB0eXBlIEEuCgoyMDExLTA2LTE4OiBvbGx5CgkgICAgW1RjbF0gRml4IHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBpbiBtaWRkbGUgb2YgYmxvY2tzIHdoaWNoIGlzbid0CgkgICAgcGVybWl0dGVkIGluIEM5MCAoaXNzdWUgcHJvYmFibHkgaW50cm9kdWNlZCBpbiAyLjAuMyBieSBwYXRjaCAjMzIyNDY2MykuCgkgICAgUmVwb3J0ZWQgYnkgUGF1bCBPYmVybWVpZXIgaW4gU0YjMzI4ODU4Ni4KCjIwMTEtMDYtMTc6IHdzZnVsdG9uCgkgICAgW0phdmFdIFNGICMzMzEyNTA1IC0gc2xpZ2h0bHkgZWFzaWVyIHRvIHdyYXAgY2hhcltdIG9yIGNoYXJbQU5ZXSB3aXRoIGEgSmF2YSBieXRlW10KICAgICAgICAgICAgdXNpbmcgYXJyYXlzX2phdmEuaS4KCjIwMTEtMDYtMTM6IHdzZnVsdG9uCgkgICAgW1J1YnksIE9jdGF2ZV0gU0YgIzMzMTA1MjggQXV0b2RvYyBmaXhlcyBzaW1pbGFyIHRvIHRob3NlIGRlc2NyaWJlZCBiZWxvdyBmb3IgUHl0aG9uLgoKMjAxMS0wNi0xMDogd3NmdWx0b24KCSAgICBbUHl0aG9uXSBGZXcgc3VidGxlIGJ1Z2ZpeGVzIGluIGF1dG9kb2MgZG9jdW1lbnRhdGlvbiBnZW5lcmF0aW9uLAogICAgICAgICAgICAtIFVubmFtZWQgYXJndW1lbnQgbmFtZXMgZml4IGZvciBhdXRvZG9jIGxldmVscyA+IDAuCiAgICAgICAgICAgIC0gRGlzcGxheSBvZiB0ZW1wbGF0ZSB0eXBlcyBmaXhlZCBmb3IgYXV0b2RvYyBsZXZlbHMgPiAxLgogICAgICAgICAgICAtIEZpeCBTRiAjMzMxMDUyOCAtIGRpc3BsYXkgb2YgdHlwZWRlZiBzdHJ1Y3RzIGZvciBhdXRvZG9jIGxldmVscyA+IDEuCiAgICAgICAgICAgIC0gQWRkIG1pc3NpbmcgdHlwZSBmb3Igc2VsZiBmb3IgYXV0b2RvYyBsZXZlbHMgMSBhbmQgMy4KICAgICAgICAgICAgLSBhdXRvZG9jIGxldmVscyAyIGFuZCAzIGRvY3VtZW50ZWQuCiAgICAgICAgICAgIC0gTWlub3IgdHdlYWtzIHRvIGF1dG9kb2Mgc3R5bGUgdG8gY29uZm9ybSB3aXRoIFBFUDguCgoyMDExLTA1LTMwOiBvbGx5CgkgICAgW1BIUF0gRml4IGhhbmRsaW5nIG9mIGRpcmVjdG9ycyB3aGVuIC1wcmVmaXggaXMgdXNlZC4KCjIwMTEtMDUtMjQ6IG9sbHkKCSAgICBbUEhQXSBGaXggaGFuZGxpbmcgb2YgbWV0aG9kcyBvZiBjbGFzc2VzIHdpdGggYSB2aXJ0dWFsIGJhc2UgY2xhc3MgKFNGIzMxMjQ2NjUpLgoKVmVyc2lvbiAyLjAuNCAoMjEgTWF5IDIwMTEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxMS0wNS0xOTogd3NmdWx0b24KCSAgICBbR3VpbGVdIFBhdGNoICMzMTkxNjI1IGZpeGluZyBvdmVybG9hZGluZyBvZiBpbnRlZ2VyIHR5cGVzLgoKMjAxMS0wNS0xOTogd3NmdWx0b24KCSAgICBbUGVybF0gUGF0Y2ggIzMyNjAyNjUgZml4aW5nIG92ZXJsb2FkaW5nIG9mIG5vbi1wcmltaXRpdmUgdHlwZXMgYW5kIGludGVnZXJzIGluIAogICAgICAgICAgICBQZXJsIDUuMTIgYW5kIGxhdGVyLgoKMjAxMS0wNS0xOTogd3NmdWx0b24KCSAgICBbUnVieV0gRml4ICVpbXBvcnQgd2hlcmUgb25lIG9mIHRoZSBpbXBvcnRlZCBmaWxlcyAlaW5jbHVkZSBvbmUgb2YgdGhlIFNUTCBpbmNsdWRlCiAgICAgICAgICAgIGZpbGVzIHN1Y2ggYXMgc3RkX3ZlY3Rvci5pLgoKMjAxMS0wNS0xNzogd3NmdWx0b24KCSAgICBbSmF2YV0gQXBwbHkgIzMyODk4NTEgZnJvbSBBbGFuIEhhcmRlciB0byBmaXggbWVtb3J5IGxlYWsgaW4gZGlyZWN0b3JzIHdoZW4gY2hlY2tpbmcKICAgICAgICAgICAgZm9yIHBlbmRpbmcgZXhjZXB0aW9ucy4KCjIwMTEtMDUtMTc6IHdzZnVsdG9uCgkgICAgW1RjbF0gQXBwbHkgIzMzMDAwNzIgZnJvbSBDaHJpc3RpYW4gRGVsYmFlcmUgdG8gZml4IG11bHRpcGxlIG1vZHVsZSBsb2FkaW5nIG5vdAogICAgICAgICAgICBhbHdheXMgc2hhcmluZyB2YXJpYWJsZXMgYWNyb3NzIG1vZHVsZXMuCgoyMDExLTA1LTE2OiB4YXZpZXI5OAoJICAgIFtvY3RhdmVdIEZpeCBhbiBpbmNvbXBhdGliaWxpdHkgd2l0aCBuZXZlciB2ZXJzaW9ucyBvZiBPY3RhdmUuIENhc2Ugb24gT2N0YXZlCgkgICAgQVBJID49IDQwIHRvIGhhbmRsZSByZW5hbWUgb2YgT2N0YXZlX21hcCB0byBvY3RhdmVfbWFwLgoJICAgIFtvY3RhdmVdIEFkZCBzdXBwb3J0IGZvciB5Ll9fcm9wX18oeCkgb3BlcmF0b3JzIHdoZW4geC5fX29wX18oeSkgZG9lc24ndCBleGlzdC4KCSAgICBbb2N0YXZlXSBBbGxvdyBnbG9iYWwgb3BlcmF0b3JzIHRvIGJlIGRlZmluZWQgYnkgU1dJRy13cmFwcGVkIGZ1bmN0aW9ucy4KCSAgICBbb2N0YXZlXSBGaXggc2V2ZXJhbCBidWdzIGFyb3VuZCBtb2R1bGUgbmFtZXNwYWNlczsgYWRkIC1nbG9iYWwsIC1ub2dsb2JhbCwKCSAgICAtZ2xvYmFscyA8bmFtZT4gY29tbWFuZCBsaW5lIG9wdGlvbnMgdG8gdGhlIG1vZHVsZS4KCjIwMTEtMDUtMTQ6IHdzZnVsdG9uCgkgICAgJXZhcmFyZ3Mgd2hlbiB1c2VkIHdpdGggYSBudW1lcmljIGFyZ3VtZW50IHVzZWQgdG8gY3JlYXRlIGFuIGFkZGl0aW9uYWwgYXJndW1lbnQgCiAgICAgICAgICAgIHdoaWNoIHdhcyBpbnRlbmRlZCB0byBwcm92aWRlIGEgZ3VhcmFudGVlZCBzZW50aW5lbCB2YWx1ZS4gVGhpcyBuZXZlciB3b3JrZWQgYW5kIG5vdwogICAgICAgICAgICB0aGUgYWRkaXRpb25hbCBhcmd1bWVudCBpcyBub3QgZ2VuZXJhdGVkLgoKMjAxMS0wNS0xMzogd3NmdWx0b24KCSAgICBbcHl0aG9uXSBBZGRpdGlvbmFsIGZpeGVzIGZvciBweXRob24zLjIgc3VwcG9ydC4KCjIwMTEtMDUtMDc6IHN6YWdlcgoJICAgIFtweXRob25dIEZpeGVkIFB5R2V0U2V0RGVzY3IgZm9yIHB5dGhvbjMuMi4KCjIwMTEtMDUtMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWEsIFB5dGhvbiwgVGNsXSBDL0MrKyBwcm90b3R5cGVzIHNob3duIGluIGVycm9yIG1lc3NhZ2Ugd2hlbiBjYWxsaW5nIGFuIG92ZXJsb2FkZWQKICAgICAgICAgICAgbWV0aG9kIHdpdGggaW5jb3JyZWN0IGFyZ3VtZW50cyBpbXByb3ZlZCB0byBzaG93IGFsd2F5cyBzaG93IGZ1bGx5IHF1YWxpZmllZCBuYW1lCiAgICAgICAgICAgIGFuZCBpZiBhIGNvbnN0IG1ldGhvZC4gCgogICAgICAgICAgICBBbHNvIGZpeGVkIG90aGVyIEx1YSBlcnJvciBtZXNzYWdlcyBpbiBnZW5lcmF0ZWQgY29kZSB3aGljaCB3ZXJlbid0IGNvbnNpc3RlbnRseQogICAgICAgICAgICB1c2luZyB0aGUgZnVsbHkgcXVhbGlmaWVkIEMrKyBuYW1lIC0gcmVxdWVzdGVkIGJ5IEdlZGFsaWEgUGFzdGVybmFrLgoKMjAxMS0wNC0yOTogc3phZ2VyCgkgICAgQnVnIDI2MzU5MTk6IENvbnZlbmllbmNlIG1ldGhvZCB0byBjb252ZXJ0IHN0ZDo6bWFwIHRvIGEgcHl0aG9uIGRpY3QuCgoyMDExLTA0LTI5OiBzemFnZXIKCSAgICBbUHl0aG9uXSBGaXhlZCBidWcgMjgxMTU0OTogcmV0dXJuIG5vbi1jb25zdCBpdGVyYXRvcnMgZnJvbSBTVEwKCSAgICBtZXRob2RzIGJlZ2luKCksIGVuZCgpLCByYmVnaW4oKSwgcmVuZCgpLgoKMjAxMS0wNC0yNTogc3phZ2VyCgkgICAgW1B5dGhvbl0gRml4ZWQgYnVnIDE0OTg5Mjk6IEFjY2VzcyB0byBtZW1iZXIgZmllbGRzIGluIG1hcCBlbGVtZW50cwoKMjAxMS0wNC0yMzoga2xpY2t2ZXJib3QKICAgICAgICAgICAgW0RdIG5zcGFjZTogQ29ycmVjdGx5IGdlbmVyYXRlIGlkZW50aWZpZXJzIGZvciBiYXNlIGNsYXNzZXMgd2hlbgogICAgICAgICAgICBub3QgaW4gc3BsaXQgcHJveHkgbW9kZS4KCjIwMTEtMDQtMTM6IHN6YWdlcgoJICAgIEZpeGVkIGJ1ZyAzMjg2MzMzOiBpbmZpbml0ZSByZWN1cnNpb24gd2l0aCBtdXR1YWwgJ3VzaW5nIG5hbWVzcGFjZScgY2xhdXNlcy4KCjIwMTEtMDQtMTI6IHN6YWdlcgoJICAgIEZpeGVkIGJ1ZyAxMTYzNDQwOiB2YXJhcmcgdHlwZW1hcHMuCgoyMDExLTA0LTEyOiBzemFnZXIKCSAgICBGaXhlZCBidWcgIzMyODUzODY6IHBhcnNlIGVycm9yIGZyb20gJ29wZXJhdG9yIFQqJigpJy4gIEFkZGVkIG9wZXJhdG9yX3BvaW50ZXJfcmVmCgkgICAgdGVzdCBjYXNlIHRvIGRlbW9uc3RyYXRlLgoKMjAxMS0wNC0xMTogc3phZ2VyCgkgICAgW1B5dGhvbl0gRml4ZWQgUHlWYXJPYmplY3RfSEVBRF9JTklUIHRvIGVsaW1pbmF0ZSBWQysrIGNvbXBpbGVyIGVycm9ycyBhYm91dAoJICAgIHN0YXRpYyBpbml0aWFsaXphdGlvbiBvZiBzdHJ1Y3QgbWVtYmVycyB3aXRoIHBvaW50ZXJzLgoKMjAxMS0wNC0xMTogd3NmdWx0b24KICAgICAgICAgICAgW1RjbF0gQXBwbHkgcGF0Y2ggIzMyODQzMjYgZnJvbSBDb2xpbiBNY0RvbmFsZCB0byBmaXggc29tZSBjb21waWxlciB3YXJuaW5ncy4KCjIwMTEtMDQtMTE6IHN6YWdlcgoJICAgIFtQeXRob25dIEZpeGVkIFB5VmFyT2JqZWN0X0hFQURfSU5JVCB0byBlbGltaW5hdGUgVkMrKyBjb21waWxlciBlcnJvcnMgYWJvdXQKCSAgICBzdGF0aWMgaW5pdGlhbGl6YXRpb24gb2Ygc3RydWN0IG1lbWJlcnMgd2l0aCBwb2ludGVycy4KCjIwMTEtMDQtMTA6IGtsaWNrdmVyYm90CiAgICAgICAgICAgIFtEXSBGaXhlZCB3cmFwcGluZyBvZiBlbnVtcyB0aGF0IGFyZSB0eXBlIGNoYXIsIGZvciBleGFtcGxlOgogICAgICAgICAgICBlbnVtIHsgWCA9ICdYJzsgfSAodGhpcyB3YXMgYWxyZWFkeSBpbiAyLjAuMyBmb3IgQyMgYW5kIEphdmEpCgoyMDExLTA0LTEwOiBrbGlja3ZlcmJvdAogICAgICAgICAgICBbRF0gbnNwYWNlOiBGaXhlZCByZWZlcmVuY2luZyB0eXBlcyBpbiB0aGUgcm9vdCBuYW1lc3BhY2Ugd2hlbgogICAgICAgICAgICBub3QgaW4gc3BsaXQgcHJveHkgbW9kZS4KCjIwMTEtMDQtMDk6IHN6YWdlcgoJICAgIFtQeXRob25dIEFwcGxpZWQgcGF0Y2ggIzE5MzI0ODQ6IG1pZ3JhdGUgUHlDT2JqZWN0IHRvIFB5Q2Fwc3VsZS4KCjIwMTEtMDQtMDk6IHN6YWdlcgoJICAgIFtQeXRob25dIEFkZGVkIHByZXByb2Nlc3NvciBndWFyZHMgZm9yIHB5dGhvbiBmdW5jdGlvbnMgUHlVbmljb2RlX0FzV2lkZUNoYXIgYW5kCgkgICAgUHlTbGljZV9HZXRJbmRpY2VzLCB3aGljaCBjaGFuZ2VkIHNpZ25hdHVyZXMgaW4gcHl0aG9uMy4yLgoKMjAxMS0wNC0wNzogd3NmdWx0b24KICAgICAgICAgICAgRml4IHdyYXBwaW5nIG9mIGNvbnN0IGFycmF5IHR5cGVkZWZzIHdoaWNoIHdlcmUgZ2VuZXJhdGluZyB1bmNvbXBpbGVhYmxlIGNvZGUgYXMKICAgICAgICAgICAgcmVwb3J0ZWQgYnkgS2FybCBXZXR0ZS4KCjIwMTEtMDQtMDM6IHN6YWdlcgoJICAgIFtQeXRob25dIEZpeGVkIHRoZSBiZWhhdmlvciBvZiAlcHl0aG9ubm9uZHluYW1pYyB0byBjb25mb3JtIHRvIHRoZSBzcGVjIGluIExpYi9weXVzZXJkaXIuc3dnLgoKMjAxMS0wNC0wMzogc3phZ2VyCgkgICAgW1B5dGhvbl0gTWVyZ2VkIGluIHRoZSBzemFnZXItcHl0aG9uLWJ1aWx0aW4gYnJhbmNoLCBhZGRpbmcgdGhlIC1idWlsdGluIGZlYXR1cmUKCSAgICBmb3IgcHl0aG9uLiAgVGhlIC1idWlsdGluIG9wdGlvbiBtYXkgcHJvdmlkZSBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGdhaW4KCSAgICBpbiBweXRob24gd3JhcHBlcnMuICBGb3IgZnVsbCBkZXRhaWxzIGFuZCBsaW1pdGF0aW9ucywgcmVmZXIgdG8gRG9jL01hbnVhbC9QeXRob24uaHRtbC4KCSAgICBBIHNtYWxsIHRlc3Qgc3VpdGUgZGVzaWduZWQgdG8gZGVtb25zdHJhdGUgdGhlIHBlcmZvcm1hbmNlIGdhaW4gaXMgaW4KCSAgICBFeGFtcGxlcy9weXRob24vcGVyZm9ybWFuY2UuCgoyMDExLTA0LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgaW4gbWlzc2luZyB3cmFwcGVycyBmb3IgZnJpZW5kIGZ1bmN0aW9ucyBmb3Igc29tZSB0YXJnZXQgbGFuZ3VhZ2VzLCBtb3N0bHkKICAgICAgICAgICAgdGhlIG5vbi1zY3JpcHRpbmcgbGFuZ3VhZ2VzIGxpa2UgSmF2YSBhbmQgQyMuCgpWZXJzaW9uIDIuMC4zICgyOSBNYXJjaCAyMDExKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxMS0wMy0yOTogd3NmdWx0b24KICAgICAgICAgICAgW1JdIEFwcGx5IHBhdGNoICMzMjM5MDc2IGZyb20gTWFyaWUgV2hpdGUgZml4aW5nIHN0cmluZ3MgZm9yIFIgPj0gMi43LjAKCjIwMTEtMDMtMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtUY2xdIEFwcGx5IHBhdGNoICMzMjQ4MjgwIGZyb20gQ2hyaXN0aWFuIERlbGJhZXJlIHdoaWNoIGFkZHMgYmV0dGVyIGVycm9yIG1lc3NhZ2VzIHdoZW4KICAgICAgICAgICAgdGhlIGluY29ycmVjdCBudW1iZXIgb3IgdHlwZSBvZiBhcmd1bWVudHMgYXJlIHBhc3NlZCB0byBvdmVybG9hZGVkIG1ldGhvZHMuCgoyMDExLTAzLTI5OiB3c2Z1bHRvbgogICAgICAgICAgICBbVGNsXSBBcHBseSBwYXRjaCAjMzIyNDY2MyBmcm9tIENocmlzdGlhbiBEZWxiYWVyZS4KICAgICAgICAgICAgMS4gRml4IHdoZW4gZnVuY3Rpb24gcmV0dXJucyBhIE5VTEwgdmFsdWUsIGEgIk5VTEwiIGNvbW1hbmQgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBUY2wgaW50ZXJwcmV0ZXIKICAgICAgICAgICAgYW5kIGNhbGxpbmcgdGhpcyBjb21tYW5kIHdpbGwgY2F1c2UgYSBzZWdtZW50YXRpb24gZmF1bHQuIAoKICAgICAgICAgICAgMi4gUHJldmlvdXMgaW1wbGVtZW50YXRpb24gc2VhcmNoZXMgZm9yIGNsYXNzIG1ldGhvZHMgdXNpbmcgYSBsaW5lYXIgc2VhcmNoIGNhdXNpbmcgcGVyZm9ybWFuY2UgaXNzdWVzCiAgICAgICAgICAgIGluIHdyYXBwZXJzIGZvciBjbGFzc2VzIHdpdGggbWFueSBtZW1iZXIgZnVuY3Rpb25zLiBUaGUgcGF0Y2ggYWRkcyBhIG1ldGhvZCBoYXNoIHRhYmxlIHRvIGNsYXNzZXMgYW5kCiAgICAgICAgICAgIGNoYW5nZXMgbWV0aG9kIG5hbWUgbG9va3VwIHRvIHVzZSB0aGUgaGFzaCB0YWJsZSBpbnN0ZWFkIG9mIGRvaW5nIGEgbGluZWFyIHNlYXJjaC4KCjIwMTEtMDMtMjY6IHdzZnVsdG9uCgkgICAgW0MjLCBKYXZhXSBTRiBidWcgIzMxOTUxMTIgLSBmaXggd3JhcHBpbmcgb2YgZW51bXMgdGhhdCBhcmUgdHlwZSBjaGFyLCBmb3IgZXhhbXBsZToKICAgICAgICAgICAgICBlbnVtIHsgWCA9ICdYJzsgfQoKMjAxMS0wMy0yMTogdmFkegoJICAgIEFsbG93IHNldHRpbmcgUENSRV9DRkxBR1MgYW5kIFBDUkVfTElCUyBkdXJpbmcgY29uZmlndXJhdGlvbiB0byBvdmVycmlkZSB0aGUgdmFsdWVzIHJldHVybmVkIGJ5CgkgICAgcGNyZS1jb25maWcsIGUuZy4gdG8gYWxsb3cgdXNpbmcgYSBzdGF0aWMgdmVyc2lvbiBvZiBQQ1JFIGxpYnJhcnkuCgoyMDExLTAzLTE3OiB3c2Z1bHRvbgoJICAgIFtVVExdIEFkZCBtaXNzaW5nIGhlYWRlcnMgaW4gZ2VuZXJhdGVkIFNUTCB3cmFwcGVycyB0byBmaXggY29tcGlsYXRpb24gd2l0aCBnY2MtNC42LgoKMjAxMS0wMy0xNzogd3NmdWx0b24KCSAgICBGaXggcmVncmVzc2lvbiBpbnRyb2R1Y2VkIGluIHN3aWctMi4wLjIgd2hlcmUgZmlsZW5hbWVzIHdpdGggc3BhY2VzIHdlcmUgbm90IGZvdW5kCgkgICAgd2hlbiB1c2VkIHdpdGggJWluY2x1ZGUgYW5kICVpbXBvcnQuIFJlcG9ydGVkIGJ5IFNoYW5lIExpZXNlZ2FuZy4KCjIwMTEtMDMtMTU6IHdzZnVsdG9uCgkgICAgW1VUTF0gRml4IG92ZXJsb2FkaW5nIHdoZW4gdXNpbmcgY29uc3QgY2hhcltdLCBwcm9ibGVtIHJlcG9ydGVkIGJ5IERhdmlkIE1heHdlbGwuCiAgICAgICAgICAgIFNpbWlsYXJseSBmb3IgY2hhcltBTlldIGFuZCBjb25zdCBjaGFyW0FOWV0uCgoyMDExLTAzLTE1OiB3c2Z1bHRvbgoJICAgIFtDI10gQXBwbHkgcGF0Y2ggIzMyMTI2MjQgZml4aW5nIHN0ZDo6bWFwIEtleXMgcHJvcGVydHkuCgoyMDExLTAzLTE0OiBvbGx5CgkgICAgW1BIUF0gRml4IGhhbmRsaW5nIG9mIG92ZXJsb2FkZWQgbWV0aG9kcy9mdW5jdGlvbnMgd2hlcmUgc29tZQoJICAgIHJldHVybiB2b2lkIGFuZCBvdGhlcnMgZG9uJ3QgLSB3aGV0aGVyIHRoaXMgd29ya2VkIG9yIG5vdCBkZXBlbmRlZAoJICAgIG9uIHRoZSBvcmRlciB0aGV5IHdlcmUgZW5jb3VudGVyZWQgaW4gKFNGIzMyMDgyOTkpLgoJCjIwMTEtMDMtMTM6IGtsaWNrdmVyYm90CiAgICAgICAgICAgIFtEXSBFeHRlbmRlZCBzdXBwb3J0IGZvciBDKysgbmFtZXNwYWNlcyAobnNwYWNlIGZlYXR1cmUpLgoKMjAxMS0wMy0xMjogb2xseQoJICAgIFtQSFBdIEZpeCBzaGFyaW5nIG9mIHR5cGUgaW5mb3JtYXRpb24gYmV0d2VlbiBtdWx0aXBsZSBTV0lHLXdyYXBwZWQKCSAgICBtb2R1bGVzIChTRiMzMjAyNDYzKS4KCjIwMTEtMDMtMDk6IHdzZnVsdG9uCgkgICAgW1B5dGhvbl0gRml4IFNGICMzMTk0Mjk0IC0gY29ybmVyIGNhc2UgYnVnIHdoZW4gJ05VTEwnIGlzIHVzZWQgYXMgdGhlIGRlZmF1bHQgdmFsdWUKICAgICAgICAgICAgZm9yIGEgcHJpbWl0aXZlIHR5cGUgcGFyYW1ldGVyIGluIGEgbWV0aG9kIGRlY2xhcmF0aW9uLgoKMjAxMS0wMy0wNzogb2xseQoJICAgIFtQSFBdIERvbid0IHVzZSB6ZW5kX2Vycm9yX25vcmV0dXJuKCkgZm9yIGNhc2VzIHdoZXJlIHRoZSBmdW5jdGlvbgoJICAgIHJldHVybnMgdm9pZCAtIG5vdyB0aGlzIGlzc3VlIGNhbiBvbmx5IG1hdHRlciBpZiB5b3UgaGF2ZSBhIGZ1bmN0aW9uCgkgICAgb3IgbWV0aG9kIHdoaWNoIGlzIGRpcmVjdGVkIGFuZCByZXR1cm5zIG5vbi12b2lkLgoKMjAxMS0wMy0wNjogb2xseQoJICAgIFtQSFBdIEFkZCBjYXN0cyB0byB0aGUgdHlwZW1hcHMgZm9yIGxvbmcgbG9uZyBhbmQgdW5zaWduZWQgbG9uZwoJICAgIGxvbmcgdG8gYXZvaWQgaXNzdWVzIHdoZW4gdGhleSBhcmUgdXNlZCB3aXRoIHNob3J0ZXIgdHlwZXMgdmlhCgkgICAgJWFwcGx5LgoKMjAxMS0wMy0wMjogd3NmdWx0b24KCSAgICBUZW1wbGF0ZWQgc21hcnQgcG9pbnRlcnMgb3ZlcmxvYWRlZCB3aXRoIGJvdGggY29uc3QgYW5kIG5vbiBjb25zdCBvcGVyYXRvci0+IGdlbmVyYXRlZCB1bmNvbXBpbGFibGUKCSAgICBjb2RlIHdoZW4gdGhlIHBvaW50ZWUgd2FzIGEgY2xhc3Mgd2l0aCBlaXRoZXIgcHVibGljIG1lbWJlciB2YXJpYWJsZXMgb3Igc3RhdGljIG1ldGhvZHMuCgkgICAgUmVncmVzc2lvbiBpbiAyLjAueCByZXBvcnRlZCBhcyB3b3JraW5nIGluIDEuMy40MCBieSB4YW50YXJlcyBvbiBzd2lnLXVzZXIgbWFpbGluZyBsaXN0LgoKVmVyc2lvbiAyLjAuMiAoMjAgRmVicnVhcnkgMjAxMSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTEtMDItMTk6IHdzZnVsdG9uCgkgICAgW1BIUF0gQWRkIG1pc3NpbmcgSU5QVVQsIE9VVFBVVCBhbmQgSU5PVVQgdHlwZW1hcHMgaW4gdGhlIHR5cGVtYXBzLmkgbGlicmFyeQogICAgICAgICAgICBmb3IgcHJpbWl0aXZlIHJlZmVyZW5jZSB0eXBlcyBhcyB3ZWxsIGFzIHNpZ25lZCBjaGFyICogYW5kIGJvb2wgKi4KCjIwMTEtMDItMTk6IG9sbHkKCSAgICBbUEhQXSBBZGRyZXNzIGJ1ZyBpbiBQSFAgb24gc29tZSBwbGF0Zm9ybXMvYXJjaGl0ZWN0dXJlcyB3aGljaAoJICAgIHJlc3VsdHMgaW4gemVuZF9lcnJvcl9ub3JldHVybigpIG5vdCBiZWluZyBhdmFpbGFibGUgdXNpbmcKCSAgICBTV0lHX1pFTkRfRVJST1JfTk9SRVRVUk4gd2hpY2ggZGVmYXVsdHMgdG8gemVuZF9lcnJvcl9ub3JldHVybiBidXQKCSAgICBjYW4gYmUgb3ZlcnJpZGRlbiB3aGVuIGJ1aWxkaW5nIHRoZSBtb2R1bGUgYnkgcGFzc2luZwoJICAgIC1EU1dJR19aRU5EX0VSUk9SX05PUkVUVVJOPXplbmRfZXJyb3IgdG8gdGhlIGNvbXBpbGVyLiAgVGhpcyBtYXkKCSAgICByZXN1bHQgaW4gY29tcGlsZXIgd2FybmluZ3MsIGJ1dCBzaG91bGQgYXQgbGVhc3QgYWxsb3cgYSBtb2R1bGUKCSAgICB0byBiZSBidWlsdCBvbiB0aG9zZSBwbGF0Zm9ybXMvYXJjaGl0ZWN0dXJlcyAoU0YjMzE2NjQyMykuCgoyMDExLTAyLTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzMxODQ1NDkgLSB2YXJhcmcgZnVuY3Rpb25zIGFuZCBmdW5jdGlvbiBvdmVybG9hZGluZyB3aGVuIHVzaW5nIHRoZSAtZmFzdGRpc3BhdGNoIG9wdGlvbi4KCjIwMTEtMDItMTg6IG9sbHkKCSAgICBbUEhQXSBBbiBvdmVybG9hZGVkIG1ldGhvZCB3aGljaCBjYW4gcmV0dXJuIGFuIG9iamVjdCBvciBhCgkgICAgcHJpbWl0aXZlIHR5cGUgbm8gbG9uZ2VyIGNhdXNlcyBTV0lHIHRvIHNlZ2ZhdWx0LiAgUmVwb3J0ZWQgYnkgUGF1bAoJICAgIENvbGJ5IGluIFNGIzMxNjg1MzEuCgoyMDExLTAyLTE4OiBvbGx5CgkgICAgW1BIUF0gRml4IGludmFsaWQgZXJhc2UgZHVyaW5nIGl0ZXJhdGlvbiBvZiBzdGQ6Om1hcCBpbiBnZW5lcmF0ZWQKCSAgICBkaXJlY3RvciBjb2RlLiAgUmVwb3J0ZWQgYnkgQ29yeSBCZW5uZXR0IGluIFNGIzMxNzU4MjAuCgoyMDExLTAyLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBQcmVwcm9jZXNzaW5nIG5vdyB3YXJucyBpZiBleHRyYSB0b2tlbnMgYXBwZWFyIGFmdGVyICNlbHNlIGFuZCAjZW5kLgoKMjAxMS0wMi0xNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxNjUzMDkyIFByZXByb2Nlc3NvciBkb2VzIG5vdCBlcnJvciBvdXQgd2hlbiAjZWxpZiBpcyBtaXNzaW5nIGFuIGV4cHJlc3Npb24uCiAgICAgICAgICAgIFRoaXMgYW5kIG90aGVyIGNhc2VzIG9mIG1pc3NpbmcgcHJlcHJvY2Vzc29yIGV4cHJlc3Npb25zIG5vdyByZXN1bHQgaW4gYW4gZXJyb3IuCgoyMDExLTAyLTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBbT2NhbWxdIEFwcGx5IHBhdGNoICMzMTUxNzg4IGZyb20gSm9lbCBSZXltb250LiBCcmluZ3MgT2NhbWwgc3VwcG9ydCB1cCB0byBkYXRlIAogICAgICAgICAgICAodmVyIDMuMTEgYW5kIDMuMTIpLCBpbmNsdWRpbmcgc3RkOjpzdHJpbmcuCgoyMDExLTAyLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gQXBwbHkgcGF0Y2ggIzMxNzYyNzQgZnJvbSBKYW1lcyBNYXN0ZXJzIC0gdHlwZWNoZWNrIHR5cGVtYXAgZm9yIHRpbWVfdC4KCjIwMTEtMDItMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGx5IHBhdGNoICMzMTcxNzkzIGZyb20gc3phZ2VyIC0gcHJvdGVjdGVkIGRpcmVjdG9yIG1ldGhvZHMgZmFpbGluZyB3aGVuIC1mdmlydHVhbCBpcyB1c2VkLgoKMjAxMS0wMi0xMzogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxOTI3ODUyIC0gI2luY2x1ZGUgZGlyZWN0aXZlcyBkb24ndCBwcmVwcm9jZXNzIHRoZSBmaWxlIHBhc3NlZCB0byBpdC4gVGhlIGZpeCBpcyBmb3IKICAgICAgICAgICAgI2luY2x1ZGUgd2l0aCAtaW1wb3J0YWxsIG9yIC1pbmNsdWRlYWxsLCAlaW5jbHVkZSBhbmQgJWltcG9ydCwgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgI2RlZmluZSBGSUxFTkFNRSAiYWJjLmgiCiAgICAgICAgICAgICAgJWluY2x1ZGUgRklMRU5BTUUKCjIwMTEtMDItMTI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTk0MDUzNiwgb3ZlcmFjdGl2ZSBwcmVwcm9jZXNzb3Igd2hpY2ggd2FzIGV4cGFuZGluZyBkZWZpbmVkKC4uLikgb3V0c2lkZSBvZiAjaWYgYW5kICNlbGlmCiAgICAgICAgICAgIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzLgoKMjAxMS0wMi0wNTogd3NmdWx0b24KICAgICAgICAgICAgW016U2NoZW1lXSBTRiAjMjk0Mjg5OSBBZGQgdXNlciBzdXBwbGllZCBkb2N1bWVudGF0aW9uIHRvIGhlbHAgZ2V0dGluZyBzdGFydGVkIHdpdGggTXpTY2hlbWUuCiAgICAgICAgICAgIFVwZGF0ZSBjaGFwdGVyIG5hbWUgdG8gTXpTY2hlbWUvUmFja2V0IGFjY291bnRpbmcgZm9yIHRoZSByZW5hbWUgb2YgTXpTY2hlbWUgdG8gUmFja2V0LgoKMjAxMS0wMi0wNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBTRiAjMzA4NTkwNiAtIFBvc3NpYmxlIGZpeCBydW5uaW5nIHRlc3Qtc3VpdGUgb24gTWFjIE9TWC4KCjIwMTEtMDItMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFNGICMzMTczMzY3IEJldHRlciBpbmZvcm1hdGlvbiBkdXJpbmcgY29uZmlndXJlIGFib3V0IEJvb3N0IHByZXJlcXVpc2l0ZSBmb3IgcnVubmluZwogICAgICAgICAgICB0aGUgdGVzdC1zdWl0ZS4KCjIwMTEtMDItMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFNGICMzMTI3NjMzIEZpeCBpbmZpbml0ZSBsb29wIGluIHJlY3Vyc2l2ZSB0eXBlZGVmIHJlc29sdXRpb24uCgoyMDExLTAyLTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gU0YgIzMxNjg2NzYgRml4ICVyZW5hbWUgbm90IHdvcmtpbmcgZm9yIG1lbWJlciB2YXJpYWJsZXMgYW5kIG1ldGhvZHMuCgoyMDExLTAyLTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbY2xpc3BdIFNGICMzMTQ4MjAwIEZpeCBzZWdmYXVsdCBwYXJzaW5nIG5lc3RlZCB1bmlvbnMuCgoyMDExLTAyLTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIERpcmVjdG9ycyAtIGEgY2FsbCB0byBhIG1ldGhvZCBiZWluZyBkZWZpbmVkIGluIHRoZSBiYXNlIGNsYXNzLCBub3QKICAgICAgICAgICAgb3ZlcnJpZGRlbiBpbiBhIHN1YmNsYXNzLCBidXQgYWdhaW4gb3ZlcnJpZGRlbiBpbiBhIGNsYXNzIGRlcml2ZWQgZnJvbQogICAgICAgICAgICB0aGUgZmlyc3Qgc3ViY2xhc3Mgd2FzIG5vdCBiZWluZyBkaXNwYXRjaGVkIGNvcnJlY3RseSB0byB0aGUgbW9zdCBkZXJpdmVkIGNsYXNzLgogICAgICAgICAgICBTZWUgZGlyZWN0b3JfYWx0ZXJuYXRpbmcuaSBmb3IgYW4gZXhhbXBsZS4KCjIwMTEtMDItMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gQW55ICd1c2luZycgc3RhdGVtZW50cyBpbiB0aGUgcHJvdGVjdGVkIHNlY3Rpb24gb2YgYSBjbGFzcyB3ZXJlIHByZXZpb3VzbHkKICAgICAgICAgICAgaWdub3JlZCB3aXRoIGRpcmVjdG9yIHByb3RlY3RlZCAoZGlycHJvdCkgbW9kZS4KCjIwMTEtMDEtMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBvdmVybG9hZGluZyB3aXRoIGNvbnN0IHBvaW50ZXIgcmVmZXJlbmNlIChTV0lHVFlQRSAqY29uc3QmKSBwYXJhbWV0ZXJzIGZvciBhCiAgICAgICAgICAgIG51bWJlciBvZiBzY3JpcHRpbmcgbGFuZ3VhZ2VzLgoKMjAxMS0wMS0xNzogd3NmdWx0b24KICAgICAgICAgICAgTmV3IHdhcm5pbmcgZm9yIHNtYXJ0IHBvaW50ZXJzIGlmIG9ubHkgc29tZSBvZiB0aGUgY2xhc3NlcyBpbiB0aGUgaW5oZXJpdGFuY2UKICAgICAgICAgICAgY2hhaW4gYXJlIG1hcmtlZCBhcyBzbWFydCBwb2ludGVyLCBlZywgJXNoYXJlZF9wdHIgc2hvdWxkIGJlIHVzZWQgZm9yIGFsbCBjbGFzc2VzCiAgICAgICAgICAgIGluIGFuIGluaGVyaXRhbmNlIGhpZXJhcmNoeSwgc28gdGhpcyBuZXcgd2FybmluZyBoaWdobGlnaHRzIGNvZGUgd2hlcmUgdGhpcyBpcwogICAgICAgICAgICBub3QgdGhlIGNhc2UuCgogICAgICAgICAgICAgIGV4YW1wbGUuaToxMjogV2FybmluZyA1MjA6IEJhc2UgY2xhc3MgJ0EnIG9mICdCJyBpcyBub3Qgc2ltaWxhcmx5IG1hcmtlZCBhcyBhIHNtYXJ0IHBvaW50ZXIuCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjE2OiBXYXJuaW5nIDUyMDogRGVyaXZlZCBjbGFzcyAnQycgb2YgJ0InIGlzIG5vdCBzaW1pbGFybHkgbWFya2VkIGFzIGEgc21hcnQgcG9pbnRlci4KCjIwMTEtMDEtMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZGVkIHNvbWUgbWlzc2luZyBtdWx0aS1hcmd1bWVudCB0eXBlbWFwczogKGNoYXIgKlNUUklORywgc2l6ZV90IExFTkdUSCkgYW5kIAogICAgICAgICAgICAoY2hhciAqU1RSSU5HLCBpbnQgTEVOR1RIKS4gRG9jdW1lbnRhdGlvbiBmb3IgdGhpcyB1cGRhdGVkLiBKYXZhIHBhdGNoIGZyb20KICAgICAgICAgICAgVm9sa2VyIEdyYWJzY2guCgoyMDExLTAxLTExOiBpYW50CgkgICAgUmVxdWlyZSBHbyB2ZXJzaW9uIDcwNzcgb3IgbGF0ZXIuCgoyMDEwLTEyLTMwOiBrbGlja3ZlcmJvdAogICAgICAgICAgICBbQyMsIEQsIEphdmFdIENoZWNrIGZvciBjb2xsaXNpb24gb2YgcGFyYW1ldGVyIG5hbWVzIHdpdGggdGFyZ2V0CiAgICAgICAgICAgIGxhbmd1YWdlIGtleXdvcmRzIHdoZW4gZ2VuZXJhdGluZyB0aGUgZGlyZWN0b3IgZ2x1ZSBjb2RlLgogICAgICAgICAgICAKICAgICAgICAgICAgVGhlIHNpdHVhdGlvbiBpbiB3aGljaCB0aGUgZ2VuZXJhdGVkIGNvdWxkIHdvdWxkIHByZXZpb3VzbHkgYmUKICAgICAgICAgICAgaW52YWxpZCBpcyBpbGx1c3RyYXRlZCBpbiB0aGUgbmV3ICdkaXJlY3Rvcl9rZXl3b3JkcycgdGVzdCBjYXNlLgoKMjAxMC0xMi0yMzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggJGNzaW5wdXQgc3BlY2lhbCB2YXJpYWJsZSBub3QgYmVpbmcgZXhwYW5kZWQgZm9yIGNzdmFyaW4gdHlwZW1hcHMKICAgICAgICAgICAgd2hlbiB1c2VkIGZvciBnbG9iYWwgdmFyaWFibGVzLiBSZXBvcnRlZCBieSBWYWRpbSBaZWl0bGluLgoKMjAxMC0xMi0xNDogd3NmdWx0b24KICAgICAgICAgICAgRml4ICRiYXNlbWFuZ2xlIGV4cGFuc2lvbiBpbiBhcnJheSB0eXBlbWFwcy4gRm9yIGV4YW1wbGUgaWYgdHlwZSBpcyBpbnQgKlszXSwKICAgICAgICAgICAgJGJhc2VtYW5nbGUgZXhwYW5kcyB0byBfcF9pbnQuCgoyMDEwLTEyLTA3OiBpYW50CgkgICAgQ2hlY2sgdGhhdCB3ZSBhcmUgdXNpbmcgYSBzdWZmaWNpZW50bHkgbmV3IHZlcnNpb24gb2YgdGhlCgkgICAgNmcgb3IgOGcgR28gY29tcGlsZXIgZHVyaW5nIGNvbmZpZ3VyZSB0aW1lLiBJZiBub3QsIGRpc2FibGUgR28uCiAgICAgICAgICAgIE1pbmltdW0gdmVyc2lvbiBpcyBub3cgNjcwNy4KCgkgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDEwLTEyLTA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzMxMjczOTQgLSB1c2Ugb2YgbmV0d29yayBwYXRocyBvbiBXaW5kb3dzL01TeXMuCgoyMDEwLTExLTE4OiBrbGlja3ZlcmJvdAoJICAgIFtEXSBBZGRlZCB0aGUgRCBsYW5ndWFnZSBtb2R1bGUuCgoyMDEwLTExLTEyOiB2YWR6CgkgICAgRml4IGhhbmRsaW5nIG9mIG11bHRpcGxlIHJlZ2V4LXVzaW5nICVyZW5hbWVzIGF0dGFjaGVkIHRvIHRoZSBzYW1lCgkgICAgZGVjbGFyYXRpb24uIEZvciBleGFtcGxlLCBub3cKCgkgICAgICAlcmVuYW1lKCIlKHJlZ2V4L15TZXQoLiopL3B1dFxcMS8pcyIpICIiOwoJICAgICAgJXJlbmFtZSgiJShyZWdleC9eR2V0KC4qKS9nZXRcXDEvKXMiKSAiIjsKCgkgICAgd29ya3MgYXMgZXhwZWN0ZWQgd2hlcmVhcyBiZWZvcmUgb25seSB0aGUgbGFzdCBhbm9ueW1vdXMgcmVuYW1lIHdhcwoJICAgIHRha2VuIGludG8gYWNjb3VudC4KCjIwMTAtMTAtMTc6IGRyam9lCgkgICAgW1JdIEZpeCBmYWlsdXJlIGluIG92ZXJsb2FkZWQgZnVuY3Rpb25zIHdoaWNoIHdhcyBicmVha2luZwoJICAgIFF1YW50TGliLVNXSUcKCjIwMTAtMTAtMTQ6IG9sbHkKCSAgICBbUEhQXSBBbGxvdyBjb21waWxhdGlvbiBvbiBub24tY29uZm9ybWluZyBNaWNyb3NvZnQgQysrIGNvbXBpbGVycwoJICAgIHdoaWNoIGRvbid0IGFjY2VwdDogcmV0dXJuIGZ1bmN0aW9uX3JldHVybmluZ192b2lkKCk7CgkgICAgUmVwb3J0ZWQgYnkgRnJhbmsgVmFuZGVuIEJlcmdoZW4gb24gdGhlIFNXSUcgbWFpbGluZyBsaXN0LgoKMjAxMC0xMC0xMjogd3NmdWx0b24KICAgICAgICAgICAgRml4IHVuYXJ5IHNjb3BlIG9wZXJhdG9yICg6OikgKGdsb2JhbCBzY29wZSkgcmVncmVzc2lvbiBpbnRyb2R1Y2VkIGluIDIuMC4wLCByZXBvcnRlZCBieQogICAgICAgICAgICBCZW4gV2Fsa2VyLiBUaGUgbWFuZ2xlZCBzeW1ib2wgbmFtZXMgd2VyZSBpbmNvcnJlY3QsIHNvbWV0aW1lcyByZXN1bHRpbmcgaW4gdHlwZXMgYmVpbmcKICAgICAgICAgICAgaW5jb3JyZWN0bHkgdHJlYXRlZCBhcyBvcGFxdWUgdHlwZXMuCgogICAgICAgICAgICBBbHNvIGZpeGVzICMyOTU4NzgxIGFuZCBzb21lIG90aGVyIHR5cGUgcHJvYmxlbXMgZHVlIHRvIGJldHRlciB0eXBlZGVmIHJlc29sdXRpb24sIGVnIAogICAgICAgICAgICBzdGQ6OnZlY3RvcjxUICo+Ojp2YWx1ZV90eXBlIGRpZG4ndCByZXNvbHZlIHRvIFQgKiB3aGVuIGl0IHNob3VsZCBoYXZlLiBUaGUgbWFuZ2xlZCB0eXBlCiAgICAgICAgICAgIHdhcyBpbmNvcnJlY3RseSBTV0lHVFlQRV9zdGRfX3ZlY3RvclRfVGVzdF9wX3N0ZF9fYWxsb2NhdG9yVF9UZXN0X3BfdF90X192YWx1ZV90eXBlIGFuZCBub3cKICAgICAgICAgICAgaXQgaXMgY29ycmVjdGx5IFNXSUdUWVBFX3BfVGVzdC4KClZlcnNpb24gMi4wLjEgKDQgT2N0b2JlciAyMDEwKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTAtMTAtMDM6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGx5IHBhdGNoICMzMDY2OTU4IGZyb20gTWlrYWVsIEpvaGFuc3NvbiB0byBmaXggZGVmYXVsdCBzbWFydCBwb2ludGVyCiAgICAgICAgICAgIGhhbmRsaW5nIHdoZW4gdGhlIHNtYXJ0IHBvaW50ZXIgY29udGFpbnMgYm90aCBhIGNvbnN0IGFuZCBub24tY29uc3Qgb3BlcmF0b3ItPi4KCjIwMTAtMTAtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCAtcGNyZXZlcnNpb24gb3B0aW9uIHRvIGRpc3BsYXkgUENSRSB2ZXJzaW9uIGluZm9ybWF0aW9uLgoKMjAxMC0xMC0wMTogb2xseQoJICAgIFtSdWJ5XSBBdm9pZCBzZWdmYXVsdCB3aGVuIGEgbWV0aG9kIG5vZGUgaGFzIG5vIHBhcmVudE5vZGUKCSAgICAoU0YjMzAzNDA1NCkuCgoyMDEwLTEwLTAxOiBvbGx5CgkgICAgW1B5dGhvbl0gQWxsb3cgcmVpbml0aWFsaXNhdGlvbiB0byB3b3JrIHdpdGggYW4gZW1iZWRkZWQgUHl0aG9uCgkgICAgaW50ZXJwcmV0ZXIgKHBhdGNoIGZyb20gSmltIENhcnJvbGwgaW4gU0YjMzA3NTE3OCkuCgoyMDEwLTA5LTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFwcGx5IHBhdGNoIGZyb20gVG9tYXMgRGlydmFuYXVza2FzIGZvciBzdGQ6Om1hcCB3cmFwcGVycyB0byBhdm9pZAogICAgICAgICAgICB0aHJvd2luZyBleGNlcHRpb25zIHdpdGggbm9ybWFsIHVzYWdlIG9mIGl0ZXJhdG9ycy4KCjIwMTAtMDktMjc6IG9sbHkKCSAgICBbUHl0aG9uXSBJbXByb3ZlIGVycm9yIG1lc3NhZ2UgZ2l2ZW4gd2hlbiBhIHBhcmFtZXRlciBvZiB0aGUgd3JvbmcKCSAgICB0eXBlIGlzIHBhc3NlZCB0byBhbiBvdmVybG9hZGVkIG1ldGhvZCAoU0YjMzAyNzM1NSkuCgoyMDEwLTA5LTI1OiB3c2Z1bHRvbgogICAgICAgICAgICBBcHBseSBTRiBwYXRjaCAjMzA3NTE1MCAtIEphdmEgZGlyZWN0b3JzIHVzaW5nIHN0YXRpYyB2YXJpYWJsZXMgaW4KICAgICAgICAgICAgbmFtZWQgbmFtZXNwYWNlLgoKMjAxMC0wOS0yNDogd3NmdWx0b24KICAgICAgICAgICAgTW9yZSBmaWxlIGFuZCBsaW5lIGVycm9yL3dhcm5pbmcgcmVwb3J0aW5nIGZpeGVzIHdoZXJlIFNXSUcgbWFjcm9zCiAgICAgICAgICAgIGFyZSB1c2VkIHdpdGhpbiB7fSBicmFjZXMgKHdoZXJlIHRoZSBwcmVwcm9jZXNzb3IgZXhwYW5kcyBtYWNyb3MpLAogICAgICAgICAgICBmb3IgZXhhbXBsZSBtYWNyb3Mgd2l0aGluICVpbmxpbmUgey4uLn0gYW5kICVmcmFnbWVudCguLi4pIHsuLi59CiAgICAgICAgICAgIGFuZCBuZXN0ZWQgc3RydWN0cy4KCjIwMTAtMDktMTg6IHdzZnVsdG9uCiAgICAgICAgICAgIE1vcmUgZmlsZSBhbmQgbGluZSBlcnJvci93YXJuaW5nIHJlcG9ydGluZyBmaXhlcyBmb3IgdmFyaW91cyBpbmhlcml0ZWQKICAgICAgICAgICAgY2xhc3MgcHJvYmxlbXMuCgoyMDEwLTA5LTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBBIG11Y2ggaW1wcm92ZWQgZGVidWdnaW5nIG9mIFNXSUcgc291cmNlIGV4cGVyaWVuY2UgaXMgbm93IGF2YWlsYWJsZSBhbmQKICAgICAgICAgICAgZG9jdW1lbnRlZCBpbiB0aGUgIkRlYnVnZ2luZyBTV0lHIiBzZWN0aW9uIGluIHRoZSBEb2MvRGV2ZWwvaW50ZXJuYWxzLmh0bWwKICAgICAgICAgICAgZmlsZSwgaW5jbHVkaW5nIGEgc3dpZy5kYmcgc3VwcG9ydCBmaWxlIGZvciB0aGUgZ2RiIGRlYnVnZ2VyLgoKMjAxMC0wOS0xMTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGluY29ycmVjdCBsaW5lIG51bWJlciByZXBvcnRpbmcgaW4gZXJyb3JzL3dhcm5pbmdzIHdoZW4gYSBtYWNybwogICAgICAgICAgICBkZWZpbml0aW9uIGVuZHMgd2l0aCAnLycgYW5kIGl0IGlzIG5vdCB0aGUgZW5kIG9mIGEgQyBjb21tZW50LgoKMjAxMC0wOS0xMTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGluY29ycmVjdCBsaW5lIG51bWJlciByZXBvcnRpbmcgaW4gZXJyb3JzL3dhcm5pbmdzIGFmdGVyIHBhcnNpbmcKICAgICAgICAgICAgbWFjcm8gaW52b2NhdGlvbnMgd2l0aCBwYXJhbWV0ZXJzIGdpdmVuIG92ZXIgbW9yZSB0aGFuIG9uZSBsaW5lLgoKMjAxMC0wOS0xMDogd3NmdWx0b24KICAgICAgICAgICAgUmVtb3ZlIGV4dHJhbmVvdXMgZXh0cmEgbGluZSBpbiBwcmVwcm9jZXNzZWQgb3V0cHV0IGFmdGVyIGluY2x1ZGluZyBmaWxlcwogICAgICAgICAgICB3aGljaCB3b3VsZCBzb21ldGltZXMgbGVhZCB0byBlcnJvci93YXJuaW5nIG1lc3NhZ2VzIHR3byBsaW5lcyBhZnRlciB0aGUKICAgICAgICAgICAgZW5kIG9mIHRoZSBmaWxlLgoKMjAxMC0wOS0xMDogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMyMTQ5NTIzIC0gSW5jb3JyZWN0IGxpbmUgbnVtYmVyIHJlcG9ydGluZyBpbiBlcnJvcnMgYWZ0ZXIgcGFyc2luZyBtYWNyb3MKICAgICAgICAgICAgY29udGFpbmluZyBDKysgY29tbWVudHMuCgoyMDEwLTA5LTA4OiBvbGx5CgkgICAgW1BIUF0gRml4IGhhbmRsaW5nIG9mIE9VVFBVVCB0eXBlbWFwcyAoUGF0Y2ggZnJvbSBSeWFuIGluIFNGIzMwNTgzOTQpLgoKMjAxMC0wOS0wMzogd3NmdWx0b24KICAgICAgICAgICAgRml4IGVycm9uZW91cyBsaW5lIG51bWJlcnMgaW4gZXJyb3IgbWVzc2FnZXMgZm9yIG1hY3JvIGV4cGFuc2lvbnMsIGZvciBleGFtcGxlLAogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZSBub3cgcG9pbnRzIHRvIGluc3RhbnRpYXRpb24gb2YgdGhlIG1hY3JvLCBpZSB0aGUgbGFzdCBsaW5lIGhlcmU6CgogICAgICAgICAgICAgICNkZWZpbmUgTUFDUk8yKGEsIGIpIAoKICAgICAgICAgICAgICAjZGVmaW5lIE1BQ1JPMShOQU1FKSBNQUNSTzIoTkFNRSwyLDMpIAoKICAgICAgICAgICAgICBNQUNSTzEoYWJjKQoKMjAxMC0wOS0wMjogd3NmdWx0b24KICAgICAgICAgICAgRml4IGxpbmUgbnVtYmVycyBpbiBlcnJvciBhbmQgd2FybmluZyBtZXNzYWdlcyBmb3IgcHJlcHJvY2Vzc29yIG1lc3NhZ2VzIHdpdGhpbgogICAgICAgICAgICAlaW5saW5lLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWlubGluZSAlewogICAgICAgICAgICAgICNkZWZpbmUgRk9PQkFSIDEKICAgICAgICAgICAgICAjZGVmaW5lIEZPT0JBUiAiaGkiCiAgICAgICAgICAgICAgJX0KCjIwMTAtMDktMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBsaW5lIG51bWJlcnMgaW4gZXJyb3IgYW5kIHdhcm5pbmcgbWVzc2FnZXMgd2hpY2ggd2VyZSBjdW11bGF0aXZlbHkgb25lCiAgICAgICAgICAgIGxlc3MgdGhhbiB0aGV5IHNob3VsZCBoYXZlIGJlZW4gYWZ0ZXIgcGFyc2luZyBlYWNoICVpbmNsdWRlLyVpbXBvcnQgLSBidWcKICAgICAgICAgICAgaW50cm9kdWNlZCBpbiBzd2lnLTEuMy4zMi4gQWxzbyBmaXggbGluZSBudW1iZXJzIGluIGVycm9yIGFuZCB3YXJuaW5nIG1lc3NhZ2VzCiAgICAgICAgICAgIHdoZW4gbmV3IGxpbmUgY2hhcmFjdGVycyBhcHBlYXIgYmV0d2VlbiB0aGUgJWluY2x1ZGUgLyAlaW1wb3J0IHN0YXRlbWVudCBhbmQKICAgICAgICAgICAgdGhlIGZpbGVuYW1lLgoKMjAxMC0wOC0zMDogd3NmdWx0b24KICAgICAgICAgICAgRml4IGxpbmUgbnVtYmVyIGFuZCBmaWxlIG5hbWUgcmVwb3J0aW5nIGZvciBzb21lIG1hY3JvIHByZXByb2Nlc3NvciB3YXJuaW5ncy4KICAgICAgICAgICAgVGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBtYWNybyBhcmd1bWVudCBoYXMgYmVlbiBjb3JyZWN0ZWQgYW5kIHRoZSBsaW5lIG51bWJlcgogICAgICAgICAgICBvZiB0aGUgc3RhcnQgb2YgdGhlIG1hY3JvIGluc3RlYWQgb2Ygb25lIHBhc3QgdGhlIGVuZCBvZiB0aGUgbWFjcm8gaXMgdXNlZC4KICAgICAgICAgICAgU29tZSBleGFtcGxlczoKICAgICAgICAgICAgICBmaWxlLmg6MTE6IEVycm9yOiBJbGxlZ2FsIG1hY3JvIGFyZ3VtZW50IG5hbWUgJy4uJwogICAgICAgICAgICAgIGZpbGUuaDoxOTogRXJyb3I6IE1hY3JvICdEVVBMSUNBVEUnIHJlZGVmaW5lZCwKICAgICAgICAgICAgICBmaWxlLmg6MTU6IEVycm9yOiBwcmV2aW91cyBkZWZpbml0aW9uIG9mICdEVVBMSUNBVEUnLgogICAgICAgICAgICAgIGZpbGUuaDoyNTogRXJyb3I6IFZhcmlhYmxlLWxlbmd0aCBtYWNybyBhcmd1bWVudCBtdXN0IGJlIGxhc3QgcGFyYW1ldGVyCiAgICAgICAgICAgICAgZmlsZS5oOjMyOiBFcnJvcjogSWxsZWdhbCBjaGFyYWN0ZXIgaW4gbWFjcm8gYXJndW1lbnQgbmFtZQogICAgICAgICAgICAgIGZpbGUuaTozNzogRXJyb3I6IE1hY3JvICdTSVQnIGV4cGVjdHMgMiBhcmd1bWVudHMKCjIwMTAtMDgtMjY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBfX0xJTkVfXyBhbmQgX19GSUxFX18gZXhwYW5zaW9uIHJlcG9ydGVkIGJ5IENhbWlsbGUgR2lsbG90LiBNb3N0bHkgdGhpcwogICAgICAgICAgICBkaWQgbm90IHdvcmsgYXQgYWxsLiBBbHNvIGZpeGVzIFNGICMyODIyODIyLgoKMjAxMC0wOC0xNzogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIEZpeCBjb3JuZXIgY2FzZSBtYXJzaGFsbGluZyBvZiBkb3VibGVzIC0gZXJybm8gd2FzIG5vdCBiZWluZyBjb3JyZWN0bHkKICAgICAgICAgICAgc2V0IGJlZm9yZSBjYWxsaW5nIHN0cnRvZCAtIHBhdGNoIGZyb20gSnVzdGluIFZhbGxvbiAtIFNGIEJ1ZyAjMzAzODkzNi4KCjIwMTAtMDgtMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBtYWtlIGRpc3RjbGVhbiB3aGVuIHNvbWUgb2YgdGhlIG1vcmUgb2JzY3VyZSBsYW5ndWFnZXMgYXJlIGRldGVjdGVkIGJ5CiAgICAgICAgICAgIGNvbmZpZ3VyZSAtIGZpeGVzIGZyb20gVG9yc3RlbiBMYW5kc2Nob2ZmLgoKMjAxMC0wNy0yODogd3NmdWx0b24KICAgICAgICAgICAgUmVzdG9yZSBjb25maWd1cmluZyBvdXQgb2Ygc291cmNlIGZvciB0aGUgdGVzdC1zdWl0ZSBzaW5jZSBpdCBicm9rZSBpbiAxLjMuMzcuCiAgICAgICAgICAgIEFzIHByZXZpb3VzbHksIGlmIHJ1bm5pbmcgJ21ha2UgY2hlY2stdGVzdC1zdWl0ZScgb3V0IG9mIHNvdXJjZSwgaXQgbmVlZHMgdG8gYmUKICAgICAgICAgICAgZG9uZSBieSBpbnZva2luZyBjb25maWd1cmUgd2l0aCBhIHJlbGF0aXZlIHBhdGguIEludm9raW5nIGNvbmZpZ3VyZSB3aXRoIGFuCiAgICAgICAgICAgIGFic29sdXRlIHBhdGggd2lsbCBub3Qgd29yay4gUnVubmluZyB0aGUgZnVsbCAnbWFrZSBjaGVjaycgc3RpbGwgbmVlZHMgdG8gYmUKICAgICAgICAgICAgZG9uZSBpbiB0aGUgc291cmNlIHRyZWUuCgoyMDEwLTA3LTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggd3JhcHBpbmcgb2YgZnVuY3Rpb24gcG9pbnRlcnMgYW5kIG1lbWJlciBmdW5jdGlvbiBwb2ludGVycyB3aGVuIHRoZSBmdW5jdGlvbgogICAgICAgICAgICByZXR1cm5zIGJ5IHJlZmVyZW5jZS4KCjIwMTAtMDctMTM6IHZhZHoKICAgICAgICAgICAgUmVtb3ZlZCBzdXBwb3J0IGZvciB0aGUgb2xkIGV4cGVyaW1lbnRhbCAicnhzcGVuY2VyIiBlbmNvZGVyIGFuZAogICAgICAgICAgICAiW25vdF1yeHNtYXRjaCIgaW4gJXJlbmFtZSAoc2VlIHRoZSAwMS8xNi8yMDA2IGVudHJ5KS4gVGhlIG5ldyBhbmQKICAgICAgICAgICAgb2ZmaWNpYWxseSBzdXBwb3J0ZWQgInJlZ2V4IiBlbmNvZGVyIGFuZCAiW25vdF1yZWdleG1hdGNoIiBjaGVja3MKICAgICAgICAgICAgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCAoc2VlIHRoZSB0d28gcHJldmlvdXMgZW50cmllcykuIFBsZWFzZQogICAgICAgICAgICByZXBsYWNlICIlKHJ4c3BlbmNlcjpbcGF0XVtzdWJzdF0pcyIgd2l0aCAiJShyZWdleDovcGF0L3N1YnN0LylzIgogICAgICAgICAgICB3aGVuIHVwZ3JhZGluZy4gTm90aWNlIHRoYXQgeW91IHdpbGwgYWxzbyBuZWVkIHRvIHJlcGxhY2UgdGhlIGJhY2stCiAgICAgICAgICAgIHJlZmVyZW5jZXMgb2YgZm9ybSAiQDEiIHdpdGggdGhlIG1vcmUgc3RhbmRhcmQgIlxcMSIgYW5kIG1heSBuZWVkIHRvCiAgICAgICAgICAgIGFkanVzdCB5b3VyIHJlZ3VsYXIgZXhwcmVzc2lvbnMgc3ludGF4IGFzIHRoZSBuZXcgcmVnZXggZW5jb2RlciB1c2VzCiAgICAgICAgICAgIFBlcmwtY29tcGF0aWJsZSBzeW50YXggYW5kIG5vdCAoZXh0ZW5kZWQpIFBPU0lYIHN5bnRheCBhcyB0aGUgb2xkIG9uZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxMC0wNy0xMzogdmFkegogICAgICAgICAgICBBZGQgInJlZ2V4bWF0Y2giLCAicmVnZXh0YXJnZXQiIGFuZCAibm90cmVnZXhtYXRjaCIgd2hpY2ggY2FuIGJlCiAgICAgICAgICAgIHVzZWQgdG8gYXBwbHkgJXJlbmFtZSBkaXJlY3RpdmVzIHRvIHRoZSBkZWNsYXJhdGlvbnMgbWF0Y2hpbmcgdGhlCiAgICAgICAgICAgIHNwZWNpZmllZCByZWd1bGFyIGV4cHJlc3Npb24gb25seS4gVGhlIGZpcnN0IHR3byBjYW4gYmUgdXNlZAogICAgICAgICAgICBpbnRlcmNoYW5nZWFibHksIGJvdGggb2YgdGhlICVyZW5hbWVzIGJlbG93IGRvIHRoZSBzYW1lIHRoaW5nOgoKICAgICAgICAgICAgICAgICVyZW5hbWUoIiRpZ25vcmUiLCByZWdleG1hdGNoJG5hbWU9Ik9sZCQiKSAiIjsKICAgICAgICAgICAgICAgICVyZW5hbWUoIiRpZ25vcmUiLCByZWdleHRhcmdldD0xKSAiT2xkJCI7CgogICAgICAgICAgICAobmFtZWx5IGlnbm9yZSB0aGUgZGVjbGFyYXRpb25zIGhhdmluZyAiT2xkIiBzdWZmaXgpLgoKICAgICAgICAgICAgIm5vdHJlZ2V4bWF0Y2giIHJlc3RyaWN0cyB0aGUgbWF0Y2ggdG8gb25seSB0aGUgZGVjbGFyYXRpb25zIHdoaWNoCiAgICAgICAgICAgIGRvIG5vdCBtYXRjaCB0aGUgcmVndWxhciBleHByZXNzaW9uLCBlLmcuIGhlcmUgaXMgaG93IHRvIHJlbmFtZSB0bwogICAgICAgICAgICBsb3dlciBjYXNlIHZlcnNpb25zIGFsbCBkZWNsYXJhdGlvbnMgZXhjZXB0IHRob3NlIGNvbnNpc3RpbmcgZnJvbQogICAgICAgICAgICBjYXBpdGFsIGxldHRlcnMgb25seToKCiAgICAgICAgICAgICAgICAlcmVuYW1lKCIkKGxvd2VyY2FzZSlzIiwgbm90cmVnZXhtYXRjaCRuYW1lPSJeW0EtWl0rJCIpICIiOwoKMjAxMC0wNy0xMzogdmFkegogICAgICAgICAgICBBZGQgdGhlIG5ldyAicmVnZXgiIGVuY29kZXIgdGhhdCBjYW4gYmUgdXNlZCBpbiAlcmVuYW1lLCBlLmcuCgogICAgICAgICAgICAgICAgJXJlbmFtZSgicmVnZXg6LyhcXHcrKV8oLiopL1xcMi8iKSAiIjsKCiAgICAgICAgICAgIHRvIHJlbW92ZSBhbnkgYWxwaGFiZXRpY2FsIHByZWZpeCBmcm9tIGFsbCBpZGVudGlmaWVycy4gVGhlIHN5bnRheAogICAgICAgICAgICBvZiB0aGUgcmVndWxhciBleHByZXNzaW9ucyBpcyBQZXJsLWxpa2UgYW5kIFBDUkUgbGlicmFyeQogICAgICAgICAgICAoaHR0cDovL3d3dy5wY3JlLm9yZy8pIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoaXMgZmVhdHVyZSBidXQgbm90aWNlCiAgICAgICAgICAgIHRoYXQgYmFja3NsYXNoZXMgbmVlZCB0byBiZSBlc2NhcGVkIGFzIHVzdWFsIGluc2lkZSBDIHN0cmluZ3MuCgogICAgICAgICAgICBPcmlnaW5hbCBwYXRjaCBmcm9tIFRvcnN0ZW4gTGFuZHNjaG9mZi4KCjIwMTAtMDctMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMzAyNDg3NSAtIHNoYXJlZF9wdHIgb2YgY2xhc3NlcyB3aXRoIG5vbi1wdWJsaWMgZGVzdHJ1Y3RvcnMuIFRoaXMgYWxzbyBmaXhlcwogICAgICAgICAgICB0aGUgInVucmVmIiBmZWF0dXJlIHdoZW4gdXNlZCBvbiBjbGFzc2VzIHdpdGggbm9uLXB1YmxpYyBkZXN0cnVjdG9ycy4KCjIwMTAtMDYtMTc6IGlhbmxhbmNldGF5bG9yCiAgICAgICAgICAgIFtHb10gQWRkIHRoZSBHbyBsYW5ndWFnZSBtb2R1bGUuCgoyMDEwLTA2LTEwOiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBGaXggU1dJR19sdWFfaXNuaWxzdHJpbmcgbXVsdGlwbHkgZGVmaW5lZCB3aGVuIHVzaW5nIG11bHRpcGxlCiAgICAgICAgICAgIG1vZHVsZXMgYW5kIHdyYXBwaW5nIHN0cmluZ3MuIFBhdGNoIGZyb20gJ051bWJlciBDcnVuY2hlcicuCgoyMDEwLTA2LTEwOiBvbGx5CgkgICAgW1BIUF0gRml4IGRpcmVjdG9ycyB0byBjb3JyZWN0bHkgY2FsbCBhIG1ldGhvZCB3aXRoIGhhcyBhCgkgICAgZGlmZmVyZW50IG5hbWUgaW4gUEhQIHRvIEMrKyAod2Ugd2VyZSBhbHdheXMgdXNpbmcgdGhlIEMrKyBuYW1lCgkgICAgaW4gdGhpcyBjYXNlKS4KCjIwMTAtMDYtMDM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB1bmNvbXBpbGVhYmxlIGNvZGUgd2hlbiAlcmVuYW1lIHJlc3VsdHMgaW4gdHdvIGVudW0gaXRlbXMKICAgICAgICAgICAgd2l0aCB0aGUgc2FtZSBuYW1lLiBSZXBvcnRlZCBieSBWYWRpbSBaZWl0bGluLgoKVmVyc2lvbiAyLjAuMCAoMiBKdW5lIDIwMTApCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxMC0wNi0wMjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggU1dJR19TVERfVkVDVE9SX0VOSEFOQ0VEIG1hY3JvIHVzZWQgaW4gc3RkOjp2ZWN0b3IgdG8gd29yayB3aXRoCiAgICAgICAgICAgIHR5cGVzIGNvbnRhaW5pbmcgY29tbWFzLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgU1dJR19TVERfVkVDVE9SX0VOSEFOQ0VEKHN0ZDo6cGFpcjwgZG91YmxlLCBzdGQ6OnN0cmluZyA+KQoKMjAxMC0wNi0wMTogd3NmdWx0b24KICAgICAgICAgICAgQWRkIGluIHN0ZF9zaGFyZWRfcHRyLmkgZm9yIHdyYXBwaW5nIHN0ZDo6c2hhcmVkX3B0ci4gUmVxdWlyZXMgdGhlICVzaGFyZWRfcHRyCiAgICAgICAgICAgIG1hY3JvIGxpa2UgaW4gdGhlIGJvb3N0X3NoYXJlZF9wdHIuaSBsaWJyYXJ5LiBzdGQ6OnRyMTo6c2hhcmVkX3B0ciBjYW4gYWxzbyBiZQogICAgICAgICAgICB3cmFwcGVkIGlmIHRoZSBmb2xsb3dpbmcgbWFjcm8gaXMgZGVmaW5lZDoKCiAgICAgICAgICAgICAgI2RlZmluZSBTV0lHX1NIQVJFRF9QVFJfU1VCTkFNRVNQQUNFIHRyMQogICAgICAgICAgICAgICVpbmNsdWRlIDxzdGRfc2hhcmVkX3B0ci5pPgoKICAgICAgICAgICAgc2hhcmVkX3B0ciBpcyBhbHNvIGRvY3VtZW50ZWQgaW4gTGlicmFyeS5odG1sIG5vdy4KCjIwMTAtMDUtMjc6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCB0aGUgYWJpbGl0eSBmb3IgJHR5cGVtYXAgc3BlY2lhbCB2YXJpYWJsZSBtYWNyb3MgdG8gY2FsbCBvdGhlciAkdHlwZW1hcAogICAgICAgICAgICBzcGVjaWFsIHZhcmlhYmxlIG1hY3JvcywgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICV0eXBlbWFwKGNzdHlwZSkgQ0MgIkNDIgogICAgICAgICAgICAgICV0eXBlbWFwKGNzdHlwZSkgQkIgIiR0eXBlbWFwKGNzdHlwZSwgQ0MpIgogICAgICAgICAgICAgICV0eXBlbWFwKGNzdHlwZSkgQUEgIiR0eXBlbWFwKGNzdHlwZSwgQkIpIgogICAgICAgICAgICAgIHZvaWQgaGFoKEFBIGFhKTsKCiAgICAgICAgICAgIFRoaXMgYWxzbyBmaXhlcyBDIyBzdGQ6OnZlY3RvciBjb250YWluZXJzIG9mIHNoYXJlZF9wdHIgYW5kICVzaGFyZWRfcHRyLgoKICAgICAgICAgICAgQWxzbyBhZGRlZCBkaWFnbm9zdGljcyBmb3IgJHR5cGVtYXAgd2l0aCAtZGVidWctdG1zZWFyY2gsIGZvciBleGFtcGxlLCB0aGUKICAgICAgICAgICAgYWJvdmUgZGlzcGxheXMgYWRkaXRpb25hbCBkaWFnbm9zdGljIGxpbmVzIHN0YXJ0aW5nICJDb250YWluaW5nOiAiOgoKICAgICAgICAgICAgICBleGFtcGxlLmk6MzQ6IFNlYXJjaGluZyBmb3IgYSBzdWl0YWJsZSAnY3N0eXBlJyB0eXBlbWFwIGZvcjogQUEgYWEKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiBBQSBhYQogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IEFBCiAgICAgICAgICAgICAgICBVc2luZzogJXR5cGVtYXAoY3N0eXBlKSBBQQogICAgICAgICAgICAgICAgQ29udGFpbmluZzogJHR5cGVtYXAoY3N0eXBlLCBCQikKICAgICAgICAgICAgICBleGFtcGxlLmk6MzE6IFNlYXJjaGluZyBmb3IgYSBzdWl0YWJsZSAnY3N0eXBlJyB0eXBlbWFwIGZvcjogQkIKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiBCQgogICAgICAgICAgICAgICAgVXNpbmc6ICV0eXBlbWFwKGNzdHlwZSkgQkIKICAgICAgICAgICAgICAgIENvbnRhaW5pbmc6ICR0eXBlbWFwKGNzdHlwZSwgQ0MpCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjI5OiBTZWFyY2hpbmcgZm9yIGEgc3VpdGFibGUgJ2NzdHlwZScgdHlwZW1hcCBmb3I6IENDCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogQ0MKICAgICAgICAgICAgICAgIFVzaW5nOiAldHlwZW1hcChjc3R5cGUpIENDCgoyMDEwLTA1LTI2OiBvbGx5CgkgICAgRml4ICVhdHRyaWJ1dGUycmVmIG5vdCB0byBwcm9kdWNlIGEgc3ludGF4IGVycm9yIGlmIHRoZSBsYXN0CgkgICAgYXJndW1lbnQgKEFjY2Vzc29yTWV0aG9kKSBpcyBvbWl0dGVkLiAgUGF0Y2ggZnJvbSBEYXZpZCBQaWVwZ3JhcwoJICAgIGluIFNGIzIyMzU3NTYuCgoyMDEwLTA1LTI2OiBvbGx5CgkgICAgW1BIUF0gV2hlbiB1c2luZyAldGhyb3dzIG9yICVjYXRjaGVzLCBTV0lHLWdlbmVyYXRlZCBQSFA1IHdyYXBwZXJzCgkgICAgbm93IHRocm93IFBIUCBFeGNlcHRpb24gb2JqZWN0cyBpbnN0ZWFkIG9mIGdpdmluZyBhIFBIUCBlcnJvciBvZgoJICAgIHR5cGUgRV9FUlJPUi4KCgkgICAgVGhpcyBjaGFuZ2Ugc2hvdWxkbid0IGNhdXNlIGluY29tcGF0aWJpbGl0eSBpc3N1ZXMsIHNpbmNlIHlvdSBjYW4ndAoJICAgIHNldCBhbiBlcnJvciBoYW5kbGVyIGZvciBFX0VSUk9SLCBzbyBwcmV2aW91c2x5IFBIUCB3b3VsZCBqdXN0IGV4aXQKCSAgICB3aGljaCBhbHNvIGhhcHBlbnMgZm9yIHVuaGFuZGxlZCBleGNlcHRpb25zLiAgVGhlIGJlbmVmaXQgaXMgeW91IGNhbgoJICAgIG5vdyBjYXRjaCB0aGVtIGlmIHlvdSB3YW50IHRvLgoKCSAgICBGaXhlcyBTRiMyNTQ1NTc4IGFuZCBTRiMyOTU1NTIyLgoKMjAxMC0wNS0yNTogb2xseQoJICAgIFtQSFBdIEFkZCBtaXNzaW5nIGRpcmVjdG9yaW4gdHlwZW1hcCBmb3IgY29uc3Qgc3RkOjpzdHJpbmcgJi4KCSAgICBGaXhlcyBTRiMzMDA2NDA0IHJlcG9ydGVkIGJ5IHQtTGVnaWF3LgoKMjAxMC0wNS0yMzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggIzI5NTczNzUgLSBTV0lHU3RyaW5nSGVscGVyIGFuZCBTV0lHRXhjZXB0aW9uSGVscGVyIG5vdCBhbHdheXMgYmVpbmcKICAgICAgICAgICAgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZSBpbiAuTkVUIDQgYXMgdGhlIGNsYXNzZXMgd2VyZSBub3QgbWFya2VkIGJlZm9yZWZpZWxkaW5pdC4KICAgICAgICAgICAgQSBzdGF0aWMgY29uc3RydWN0b3IgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIGludGVybWVkaWFyeSBjbGFzcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICVwcmFnbWEoY3NoYXJwKSBpbWNsYXNzY29kZT0lewogICAgICAgICAgICAgICAgc3RhdGljICRpbWNsYXNzbmFtZSgpIHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgSWYgeW91IGhhZCBhZGRlZCB5b3VyIG93biBjdXN0b20gc3RhdGljIGNvbnN0cnVjdG9yIHRvIHRoZSBpbnRlcm1lZGlhcnkgY2xhc3MgaW4KICAgICAgICAgICAgdGhlIHNhbWUgd2F5IGFzIGFib3ZlLCB5b3Ugd2lsbCBoYXZlIHRvIG1vZGlmeSB5b3VyIGFwcHJvYWNoIHRvIHVzZSBzdGF0aWMgdmFyaWFibGUKICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24gb3IgZGVmaW5lIFNXSUdfQ1NIQVJQX05PX0lNQ0xBU1NfU1RBVElDX0NPTlNUUlVDVE9SIC0gU2VlIGNzaGFycGhlYWQuc3dnLgoKCSAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTAtMDUtMjM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMjQwODIzMi4gSW1wcm92ZSBzaGFyZWRfcHRyIGFuZCBpbnRydXNpdmVfcHRyIHdyYXBwZXJzIGZvciBjbGFzc2VzIGluIGFuCiAgICAgICAgICAgIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4gTm8gc3BlY2lhbCB0cmVhdG1lbnQgaXMgbmVlZGVkIGZvciBkZXJpdmVkIGNsYXNzZXMuCiAgICAgICAgICAgIFRoZSBwcm94eSBjbGFzcyBhbHNvIG5vIGxvbmdlciBuZWVkcyB0byBiZSBzcGVjaWZpZWQsIGl0IGlzIGF1dG9tYXRpY2FsbHkKICAgICAgICAgICAgZGVkdWNlZC4gVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIGRlcHJlY2F0ZWQ6CiAgICAgICAgICAgICAgU1dJR19TSEFSRURfUFRSKFBST1hZQ0xBU1MsIFRZUEUpCiAgICAgICAgICAgICAgU1dJR19TSEFSRURfUFRSX0RFUklWRUQoUFJPWFlDTEFTUywgQkFTRUNMQVNTVFlQRSwgVFlQRSkKICAgICAgICAgICAgYW5kIGhhdmUgYmVlbiByZXBsYWNlZCBieQogICAgICAgICAgICAgICVzaGFyZWRfcHRyKFRZUEUpCiAgICAgICAgICAgIFNpbWlsYXJseSBmb3IgaW50cnVzaXZlX3B0ciB3cmFwcGVycywgdGhlIGZvbGxvd2luZyBtYWNybyBpcyBkZXByZWNhdGVkOgogICAgICAgICAgICAgIFNXSUdfSU5UUlVTSVZFX1BUUihQUk9YWUNMQVNTLCBUWVBFKQogICAgICAgICAgICAgIFNXSUdfSU5UUlVTSVZFX1BUUl9ERVJJVkVEKFBST1hZQ0xBU1MsIEJBU0VDTEFTU1RZUEUsIFRZUEUpCiAgICAgICAgICAgIGFuZCBoYXZlIGJlZW4gcmVwbGFjZWQgYnkKICAgICAgICAgICAgICAlaW50cnVzaXZlX3B0cihUWVBFKQoKMjAxMC0wNS0yMTogb2xseQoJICAgIFtQSFBdIFN0b3AgZ2VuZXJhdGluZyBhIGJvZ3VzIGxpbmUgb2YgY29kZSBpbiBjZXJ0YWluIGNvbnN0cnVjdG9ycy4KCSAgICBUaGlzIHdhcyBtb3N0bHkgaGFybWxlc3MsIGJ1dCBjYXVzZWQgYSBQSFAgbm90aWNlIHRvIGJlIGlzc3VlZCwgaWYKCSAgICBlbmFibGVkIChTRiMyOTg1Njg0KS4KCjIwMTAtMDUtMTg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggbWVtYmVyIHBvaW50ZXJzIG9uIDY0IGJpdCBwbGF0Zm9ybXMuCgoyMDEwLTA1LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggd3JhcHBpbmcgb2YgQysrIGVudW0gYm9vbGVhbiB2YWx1ZXMgcmVwb3J0ZWQgYnkgVG9yc3RlbiBMYW5kc2Nob2ZmOgogICAgICAgICAgICAgIHR5cGVkZWYgZW51bSB7IFBMQVkgPSB0cnVlLCBTVE9QID0gZmFsc2UgfSBwbGF5X3N0YXRlOwoKMjAxMC0wNS0xNDogb2xseQoJICAgIFtQSFBdIEZpeCB3cmFwcGluZyBvZiBnbG9iYWwgdmFyaWFibGVzIHdoaWNoIHdhcyBwcm9kdWNpbmcKCSAgICB1bmNvbXBpbGFibGUgY29kZSBpbiBzb21lIGNhc2VzLgoKMjAxMC0wNS0xMjogZHJqb2UKCSAgICBbUl0gQWRkIHR3byBtb3JlIGNoYW5nZXMgZnJvbSBXaWwgTm9sYW4uICBHZXQgZ2FyYmFnZQoJICAgIGNvbGxlY3Rpb24gdG8gd29yay4gIEltcGxlbWVudCBuZXdmcmVlCgoyMDEwLTA1LTA5OiBkcmpvZQogICAgICAgICAgICBGaXggYnVnIHJlcG9ydGVkIGJ5IFdpbCBOb2xhbiBjaGFuZ2UgY3JlYXRpb24gb2Ygc3RyaW5nIHNvCiAgICAgICAgICAgIHRoYXQgUiAyLjcuMCsgY2FuIHVzZSBjaGFyIGhhc2hlcwoKMjAxMC0wNS0wNzogd3NmdWx0b24KICAgICAgICAgICAgQXBwbHkgcGF0Y2ggIzI5NTUxNDYgZnJvbSBTZXJnZXkgU2F0c2tpeSB0byBmaXggZXhwcmVzc2lvbnMgY29udGFpbmluZyBkaXZpZGUgYnkKICAgICAgICAgICAgb3BlcmF0b3IgaW4gY29uc3RydWN0b3IgaW5pdGlhbGl6YXRpb24gbGlzdHMuCgoyMDEwLTA1LTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gTWVtb3J5IGxlYWsgZml4IGhhbmRsaW5nIGNvbnN0IHN0ZDo6c3RyaW5nICYgaW5wdXRzLCByZXBvcnRlZCBieSBXaWxsIE5vbGFuLgoKMjAxMC0wNS0wMTogd3NmdWx0b24KICAgICAgICAgICAgVHlwZW1hcCBtYXRjaGluZyBlbmhhbmNlbWVudCBmb3Igbm9uLWRlZmF1bHQgdHlwZW1hcHMuIFByZXZpb3VzbHkgYWxsCiAgICAgICAgICAgIHF1YWxpZmllcnMgd2VyZSBzdHJpcHBlZCBpbiBvbmUgc3RlcCwgbm93IHRoZXkgYXJlIHN0cmlwcGVkIG9uZSBhdCBhIHRpbWUKICAgICAgICAgICAgc3RhcnRpbmcgd2l0aCB0aGUgbGVmdCBtb3N0IHF1YWxpZmllci4gRm9yIGV4YW1wbGUsIGludCBjb25zdCpjb25zdCAKICAgICAgICAgICAgaXMgZmlyc3Qgc3RyaXBwZWQgdG8gaW50ICpjb25zdCB0aGVuIGludCAqLgoKCSAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTAtMDQtMjU6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBGaXggIzI5ODU2NTUgLSBicm9rZW4gY29uc3RydWN0b3IgcmVuYW1pbmcuCgoyMDEwLTA0LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBUeXBlbWFwIGZyYWdtZW50cyBhcmUgbm93IG9mZmljaWFsIGFuZCBkb2N1bWVudGVkIGluIFR5cGVtYXBzLmh0bWwuCgoyMDEwLTA0LTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gRml4ICMyMDQ4MDY0IGFuZCAjMjQwODAyMC4KICAgICAgICAgICAgQXBwbHkgVWJ1bnR1IHBhdGNoIHRvIGZpeCBSdWJ5IGFuZCBzdGQ6OnZlY3RvciB3cmFwcGVycyB3aXRoIC1taW5oZXJpdC4KICAgICAgICAgICAgaHR0cHM6Ly9idWdzLmxhdW5jaHBhZC5uZXQvdWJ1bnR1Lytzb3VyY2Uvc3dpZzEuMy8rYnVnLzUyMjg3NAoKMjAxMC0wNC0wOTogd3NmdWx0b24KICAgICAgICAgICAgW016c2NoZW1lXSBBcHBseSBVYnVudHUgcGF0Y2ggdG8gZml4IHN0ZDo6bWFwIHdyYXBwZXJzOgogICAgICAgICAgICBodHRwczovL2J1Z3MubGF1bmNocGFkLm5ldC91YnVudHUvK3NvdXJjZS9zd2lnMS4zLytidWcvMjAzODc2CgoyMDEwLTA0LTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBcHBseSBwYXRjaCAjMjk1MjM3NCAtIGZpeCBkaXJlY3RvcnMgYW5kIHRoZSAtbm9ydHRpIG9wdGlvbi4KCjIwMTAtMDQtMDk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIEZpeCAjMjg4NzI1NCBhbmQgIzI5NDYwMzIgLSBTV0lHX0x1YV90eXBlbmFtZSB1c2luZyB3cm9uZyBzdGFjayBpbmRleC4KCjIwMTAtMDQtMDM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBleGNlcHRpb25zIGJlaW5nIHRocm93biB3aXRoIHRoZSAtdGhyZWFkcyBvcHRpb24gYmFzZWQgb24gcGF0Y2ggZnJvbSBBcnRvIFZ1b3JpLgogICAgICAgICAgICBGaXhlcyBidWcgIzI4MTg0OTkuCgoyMDEwLTA0LTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggTWFrZWZpbGUgdGFyZ2V0czogZGlzdGNsZWFuIGFuZCBtYWludGFpbmVyLWNsZWFuCgoyMDEwLTA0LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBGaXggY2hhciBwb2ludGVycywgd2NoYXJfdCBwb2ludGVycyBhbmQgY2hhciBhcnJheXMgc28gdGhhdCBuaWwgY2FuIGJlIHBhc3NlZCBhcyBhCiAgICAgICAgICAgIHZhbGlkIHZhbHVlLiBCdWcgcmVwb3J0ZWQgYnkgR2VkYWxpYSBQYXN0ZXJuYWsuCgoyMDEwLTA0LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBOdW1lcm91cyBzdWJ0bGUgdHlwZW1hcCBtYXRjaGluZyBydWxlIGZpeGVzIHdoZW4gdXNpbmcgdGhlIGRlZmF1bHQgdHlwZS4gVGhlIHR5cGVtYXAKICAgICAgICAgICAgbWF0Y2hpbmcgcnVsZXMgYXJlIHRvIHRha2UgYSB0eXBlIGFuZCBmaW5kIHRoZSBiZXN0IGRlZmF1bHQgdHlwZW1hcCAoU1dJR1RZUEUsIFNXSUdUWVBFKiBldGMpLAogICAgICAgICAgICB0aGVuIGxvb2sgZm9yIHRoZSBuZXh0IGJlc3QgbWF0Y2ggYnkgcmVkdWNpbmcgdGhlIGNob3NlbiBkZWZhdWx0IHR5cGUuIFRoZSB0eXBlIGRlZHVjdGlvbgogICAgICAgICAgICBub3cgZm9sbG93cyBDKysgY2xhc3MgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBtYXRjaGluZyBydWxlcy4KCiAgICAgICAgICAgIEJlbG93IGFyZSB0aGUgc2V0IG9mIGNoYW5nZXMgbWFkZSBzaG93aW5nIHRoZSBkZWZhdWx0IHR5cGUgZGVkdWN0aW9uCiAgICAgICAgICAgIGFsb25nIHdpdGggdGhlIG9sZCByZWR1Y2VkIHR5cGUgYW5kIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGUgcmVkdWNlZCB0eXBlOgoKICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFIGNvbnN0ICZbQU5ZXQogICAgICAgICAgICAgIG5ldzogU1dJR1RZUEUgY29uc3QgJltdCiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRSAoJilbQU5ZXQoKICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFICpjb25zdCBbQU5ZXQogICAgICAgICAgICAgIG5ldzogU1dJR1RZUEUgY29uc3QgW0FOWV0KICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFICpbQU5ZXQoKICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFIGNvbnN0ICpjb25zdCBbQU5ZXQogICAgICAgICAgICAgIG5ldzogU1dJR1RZUEUgKmNvbnN0IFtBTlldCiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRSBjb25zdCAqW0FOWV0KCiAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSBjb25zdCAqY29uc3QgJgogICAgICAgICAgICAgIG5ldzogU1dJR1RZUEUgKmNvbnN0ICYKICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFIGNvbnN0IComCgogICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgKmNvbnN0ICoKICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFIGNvbnN0ICoKICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFICoqCgogICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgKmNvbnN0ICYKICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFIGNvbnN0ICYKICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFIComCgogICAgICAgICAgICBBZGRpdGlvbmFsbHksIGEgY29uc3QgU1dJR1RZUEUgbG9va3VwIGlzIHVzZWQgbm93IGZvciBhbnkgY29uc3RhbnQgdHlwZS4gU29tZSBleGFtcGxlcywgd2hlcmUKICAgICAgICAgICAgVCBpcyBzb21lIHJlZHVjZWQgdHlwZSwgZWcgaW50LCBzdHJ1Y3QgRm9vOgoKICAgICAgICAgICAgICAgICAgIFQgY29uc3QKICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFIGNvbnN0CiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRQoKICAgICAgICAgICAgICAgICAgIFQgKmNvbnN0CiAgICAgICAgICAgICAgbmV3OiBTV0lHVFlQRSAqY29uc3QKICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFICoKCiAgICAgICAgICAgICAgICAgICBUIGNvbnN0W10KICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFIGNvbnN0W10KICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFW10KCiAgICAgICAgICAgICAgICAgICBlbnVtIFQgY29uc3QKICAgICAgICAgICAgICBuZXc6IGVudW0gU1dJR1RZUEUgY29uc3QKICAgICAgICAgICAgICBvbGQ6IGVudW0gU1dJR1RZUEUKCiAgICAgICAgICAgICAgICAgICBUICgqY29uc3QgKVtdCiAgICAgICAgICAgICAgbmV3OiBTV0lHVFlQRSAoKmNvbnN0IClbXQogICAgICAgICAgICAgIG9sZDogU1dJR1RZUEUgKCopW10KCiAgICAgICAgICAgIFJlbWluZGVyOiB0aGUgdHlwZW1hcCBtYXRjaGluZyBydWxlcyBjYW4gbm93IGJlIHNlZW4gZm9yIGFueSB0eXBlcyBiZWluZyB3cmFwcGVkIGJ5IHVzaW5nCiAgICAgICAgICAgIGVpdGhlciB0aGUgLWRlYnVnLXRtc2VhcmNoIG9yIC1kZWJ1Zy10bXVzZWQgb3B0aW9ucy4KCiAgICAgICAgICAgIEluIHByYWN0aWNlIHRoaXMgbGVhZHMgdG8gc29tZSBzdWJ0bGUgbWF0Y2hpbmcgcnVsZSBjaGFuZ2VzIGFuZCB0aGUgbWFqb3JpdHkgb2YgdXNlcnMKICAgICAgICAgICAgd29uJ3Qgbm90aWNlIGFueSBjaGFuZ2VzLCBleGNlcHQgaW4gdGhlIHByaW1lIGFyZWEgb2YgbW90aXZhdGlvbiBmb3IgdGhpcyBjaGFuZ2U6IEltcHJvdmUKICAgICAgICAgICAgU1RMIGNvbnRhaW5lcnMgb2YgY29uc3QgcG9pbnRlcnMgYW5kIHBhc3NpbmcgY29uc3QgcG9pbnRlcnMgYnkgcmVmZXJlbmNlLiBUaGlzIGlzIGZpeGVkCiAgICAgICAgICAgIGJlY2F1c2UgbWFueSBvZiB0aGUgU1RMIGNvbnRhaW5lcnMgdXNlIGEgdHlwZSAnVCBjb25zdCYnIGFzIHBhcmFtZXRlcnMgYW5kIHdoZW4gVCBpcyAKICAgICAgICAgICAgYSBjb25zdCBwb2ludGVyLCBmb3IgZXhhbXBsZSwgJ0sgY29uc3QqJywgdGhlbiB0aGUgZnVsbCB0eXBlIGlzICdLIGNvbnN0KmNvbnN0JicuIFRoaXMKICAgICAgICAgICAgbWVhbnMgdGhhdCB0aGUgJ1NXSUdUWVBFICpjb25zdCYnIHR5cGVtYXBzIG5vdyBtYXRjaCB3aGVuIFQgaXMgZWl0aGVyIGEgbm9uLWNvbnN0IG9yCiAgICAgICAgICAgIGNvbnN0IHBvaW50ZXIuIEZ1cnRoZXJtb3JlLCBzb21lIHRhcmdldCBsYW5ndWFnZXMgaW5jb3JyZWN0bHkgaGFkICdTV0lHVFlQRSAqJicgdHlwZW1hcHMKICAgICAgICAgICAgd2hlbiB0aGVzZSBzaG91bGQgaGF2ZSBiZWVuICdTV0lHVFlQRSAqY29uc3QmJy4gVGhlc2UgaGF2ZSBiZWVuIGNvcnJlY3RlZCAoSmF2YSwgQyMsIEx1YSwgUEhQKS4KCgkgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDEwLTAzLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gU29tZSB2ZXJ5IG9sZCBkZXByZWNhdGVkIHByYWdtYSB3YXJuaW5ncyBhcmUgbm93IGVycm9ycy4KCjIwMTAtMDMtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIEltcHJvdmUgaGFuZGxpbmcgb2YgZmlsZSBuYW1lcyBhbmQgZGlyZWN0b3JpZXMgY29udGFpbmluZyBkb3VibGUvbXVsdGlwbGUgcGF0aCBzZXBhcmF0b3JzLgoKMjAxMC0wMy0xMDogbXV0YW5kaXogKE1pa2VsIEJhbmNyb2Z0KQoJICAgIFthbGxlZ3JvY2xdIFVzZSBmdWxseSBxdWFsaWZpZWQgc3ltYm9sIG5hbWUgb2YgY2w6OmlkZW50aXR5IGluIGVtaXRfZGVmdW4oKS4KCjIwMTAtMDMtMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBUaGUgaW50ZXJtZWRpYXJ5IEpOSSBjbGFzcyBtb2RpZmllcnMgYXJlIG5vdyBwdWJsaWMgYnkgZGVmYXVsdCBtZWFuaW5nIHRoZXNlCiAgICAgICAgICAgIGludGVybWVkaWFyeSBsb3cgbGV2ZWwgZnVuY3Rpb25zIGFyZSBub3cgYWNjZXNzaWJsZSBieSBkZWZhdWx0IGZyb20gb3V0c2lkZSBhbnkgcGFja2FnZQogICAgICAgICAgICB1c2VkLiBUaGUgcHJveHkgY2xhc3MgcG9pbnRlciBjb25zdHJ1Y3RvciBhbmQgZ2V0Q1B0cigpIG1ldGhvZHMgYXJlIGFsc28gbm93IHB1YmxpYy4KICAgICAgICAgICAgVGhlc2UgYXJlIG5lZWRlZCBpbiBvcmRlciBmb3IgdGhlIG5zcGFjZSBvcHRpb24gdG8gd29yayB3aXRob3V0IGFueSBvdGhlciBtb2RzLgogICAgICAgICAgICBUaGUgcHJldmlvdXMgZGVmYXVsdCBvZiBwcm90ZWN0ZWQgYWNjZXNzIGNhbiBiZSByZXN0b3JlZCB1c2luZzoKCiAgICAgICAgICAgICAgU1dJR19KQVZBQk9EWV9NRVRIT0RTKHByb3RlY3RlZCwgcHJvdGVjdGVkLCBTV0lHVFlQRSkKICAgICAgICAgICAgICAlcHJhZ21hKGphdmEpIGpuaWNsYXNzY2xhc3Ntb2RpZmllcnMgPSAiY2xhc3MiCgoyMDEwLTAzLTA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFkZGVkIHRoZSBuc3BhY2UgZmVhdHVyZSBmb3IgQyMuIERvY3VtZW50YXRpb24gZm9yIHRoZSBuc3BhY2UgZmVhdHVyZSBpcyBub3cgYXZhaWxhYmxlLgoKMjAxMC0wMy0wNDogd3NmdWx0b24KICAgICAgICAgICAgQWRkZWQgdGhlIG5zcGFjZSBmZWF0dXJlLiBUaGlzIGFkZHMgc29tZSBpbXByb3ZlZCBuYW1lc3BhY2Ugc3VwcG9ydC4gQ3VycmVudGx5IG9ubHkgSmF2YQogICAgICAgICAgICBpcyBzdXBwb3J0ZWQgZm9yIHRhcmdldCBsYW5ndWFnZXMsIHdoZXJlIEMrKyBuYW1lc3BhY2VzIGFyZSBhdXRvbWF0aWNhbGx5IHRyYW5zbGF0ZWQgaW50bwogICAgICAgICAgICBKYXZhIHBhY2thZ2VzLiBUaGUgZmVhdHVyZSBvbmx5IGFwcGxpZXMgdG8gY2xhc3NlcyxzdHJ1Y3QsdW5pb25zIGFuZCBlbnVtcyBkZWNsYXJlZCB3aXRoaW4KICAgICAgICAgICAgYSBuYW1lc3BhY2UuIE1ldGhvZHMgYW5kIHZhcmlhYmxlcyBkZWNsYXJlZCBpbiBuYW1lc3BhY2VzIHN0aWxsIGVmZmVjdGl2ZWx5IGhhdmUgdGhlaXIKICAgICAgICAgICAgbmFtZXNwYWNlcyBmbGF0dGVuZWQuIEV4YW1wbGUgdXNhZ2U6CgogICAgICAgICAgICAgICVmZWF0dXJlKG5zcGFjZSkgT3V0ZXI6OklubmVyMTo6Q29sb3I7CiAgICAgICAgICAgICAgJWZlYXR1cmUobnNwYWNlKSBPdXRlcjo6SW5uZXIyOjpDb2xvcjsKCiAgICAgICAgICAgICAgbmFtZXNwYWNlIE91dGVyIHsKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBJbm5lcjEgewogICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ29sb3IgewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbmFtZXNwYWNlIElubmVyMiB7CiAgICAgICAgICAgICAgICAgIHN0cnVjdCBDb2xvciB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgRm9yIEphdmEsIHRoZSAtcGFja2FnZSBvcHRpb24gaXMgYWxzbyByZXF1aXJlZCB3aGVuIHVzaW5nIHRoZSBuc3BhY2UgZmVhdHVyZS4gU2F5CiAgICAgICAgICAgIHdlIHVzZSAtcGFja2FnZSBjb20ubXljbywgdGhlIHR3byBjbGFzc2VzIGNhbiB0aGVuIGJlIGFjY2Vzc2VkIGFzIGZvbGxvd3MgZnJvbSBKYXZhOgoKICAgICAgICAgICAgICBjb20ubXljby5PdXRlci5Jbm5lcjEuQ29sb3IgYW5kIGNvbS5teWNvLk91dGVyLklubmVyMi5Db2xvci4KCjIwMTAtMDItMjc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIFJlbW92ZSAtZGlydnRhYmxlIGZyb20gdGhlIG9wdGltaXphdGlvbnMgaW5jbHVkZWQgYnkgLU8gYXMgaXQgdGhpcyBvcHRpb24KICAgICAgICAgICAgY3VycmVudGx5IGxlYWRzIHRvIG1lbW9yeSBsZWFrcyBhcyByZXBvcnRlZCBieSBKb2hhbiBCbGFrZS4KCjIwMTAtMDItMjc6IHdzZnVsdG9uCiAgICAgICAgICAgIExpY2Vuc2UgY29kZSBjaGFuZ2VzOiBTV0lHIFNvdXJjZSBpcyBHUEwtdjMgYW5kIGxpYnJhcnkgY29kZSBsaWNlbnNlIGlzIG5vdyBjbGVhcmVyCiAgICAgICAgICAgIGFuZCBpcyBwcm92aWRlZCB1bmRlciBhIHZlcnkgcGVybWlzc2l2ZSBsaWNlbnNlLiBTZWUgaHR0cDovL3d3dy5zd2lnLm9yZy9sZWdhbC5odG1sLgoKMjAxMC0wMi0xMzogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEEgZmV3IGZpeGVzIGZvciBjb21waWxpbmcgdW5kZXIgcnVieS0xLjkueCBpbmNsdWRpbmcgcGF0Y2ggZnJvbSAnTmliYmxlJy4KCjIwMTAtMDItMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBBcHBseSBwYXRjaCBmcm9tIFBhdHJpY2sgQmVubmV0dCB0byBmaXggUkFSUkFZX0xFTiBhbmQgUkFSUkFZX1BUUiB1c2FnZSBmb3IgUnVieSAxLjkueAogICAgICAgICAgICB1c2VkIGluIHZhcmlvdXMgU1RMIHdyYXBwZXJzLgoKMjAxMC0wMi0xMzogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBGaXggaW5jb3JyZWN0IG11bHRpcGx5IGRlZmluZWQgc3ltYm9sIG5hbWUgZXJyb3Igd2hlbiBhbiBlbnVtIGl0ZW0KICAgICAgICAgICAgYW5kIGNsYXNzIG5hbWUgaGF2ZSB0aGUgc2FtZSBuYW1lLCBhcyByZXBvcnRlZCBieSBOYXRoYW4gS3JpZWdlci4gRXhhbXBsZToKCiAgICAgICAgICAgICAgY2xhc3MgVmVjdG9yIHt9OwogICAgICAgICAgICAgIG5hbWVzcGFjZSBUZXh0IHsKICAgICAgICAgICAgICAgIGVudW0gUHJlZmVyZW5jZSB7IFZlY3RvciB9OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoaXMgYWxzbyBmaXhlcyBvdGhlciBpbmNvcnJlY3QgY29ybmVyIGNhc2UgdGFyZ2V0IGxhbmd1YWdlIHN5bWJvbCBuYW1lIGNsYXNoZXMuCgoyMDEwLTAyLTExOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgdGhlIC1kZWJ1Zy1sc3ltYm9scyBvcHRpb24gZm9yIGRpc3BsYXlpbmcgdGhlIHRhcmdldCBsYW5ndWFnZSBsYXllciBzeW1ib2xzLgoKMjAxMC0wMi0wOTogd3NmdWx0b24KICAgICAgICAgICAgRml4IC1NTSBhbmQgLU1NRCBvcHRpb25zIG9uIFdpbmRvd3MuIFRoZXkgd2VyZSBub3Qgb21pdHRpbmcgZmlsZXMgaW4gdGhlIFNXSUcgbGlicmFyeSBhcwogICAgICAgICAgICB0aGV5IHNob3VsZCBiZS4KCjIwMTAtMDItMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTgwNzMyOSAtIFdoZW4gTWFrZWZpbGUgZGVwZW5kZW5jaWVzIGFyZSBiZWluZyBnZW5lcmF0ZWQgdXNpbmcgdGhlIC1NIGZhbWlseSBvZiBvcHRpb25zCiAgICAgICAgICAgIG9uIFdpbmRvd3MsIHRoZSBmaWxlIHBhdGhzIGhhdmUgYmVlbiBjb3JyZWN0ZWQgdG8gdXNlIHNpbmdsZSBiYWNrc2xhc2hlcyByYXRoZXIgdGhhbiBkb3VibGUKICAgICAgICAgICAgYmFja3NsYXNoZXMgYXMgcGF0aCBzZXBhcmF0b3JzLgoKMjAxMC0wMi0wNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMyOTE4OTAyIC0gbGFuZ3VhZ2Ugc3BlY2lmaWMgZmlsZXMgbm90IGJlaW5nIGdlbmVyYXRlZCBpbiBjb3JyZWN0IGRpcmVjdG9yeSBvbgogICAgICAgICAgICBXaW5kb3dzIHdoZW4gdXNpbmcgZm9yd2FyZCBzbGFzaGVzIGZvciAtbywgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgc3dpZyAtcHl0aG9uIC1jKysgLW8gc3ViZGlyZWN0b3J5L3RoZWludGVyZmFjZV93cmFwLmNwcCBzdWJkaXJlY3RvcnkvdGhlaW50ZXJmYWNlLmkKCjIwMTAtMDItMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMjg5NDQwNSAtIGFzc2VydGlvbiB3aGVuIHVzaW5nIC14bWxvdXQuCgoyMDEwLTAxLTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggdHlwZW1hcCBtYXRjaGluZyBidWcgd2hlbiBhIHRlbXBsYXRlZCB0eXBlIGhhcyBhIHR5cGVtYXAgYm90aCBzcGVjaWFsaXplZCBhbmQgbm90CiAgICAgICAgICAgIHNwZWNpYWxpemVkLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFhYIHsgLi4uIH07CiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGNvbnN0IFhYICYgIi4uLiIKICAgICAgICAgICAgICAldHlwZW1hcChpbikgY29uc3QgWFg8IGludCA+ICYgIi4uLiIKCiAgICAgICAgICAgIHJlc3VsdGVkIGluIHRoZSAybmQgdHlwZW1hcCBiZWluZyBhcHBsaWVkIGZvciBhbGwgVCBpbiBYWDwgVCA+LgoKMjAxMC0wMS0yMjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMyOTMzMTI5IC0gdHlwZW1hcHMgbm90IGJlaW5nIGZvdW5kIHdoZW4gdGhlIHVuYXJ5IHNjb3BlIG9wZXJhdG9yICg6OikgaXMgdXNlZCB0byBkZW5vdGUKICAgICAgICAgICAgZ2xvYmFsIHNjb3BlLCB0aGUgdHlwZW1hcCBpcyBub3cgdXNlZCBpbiBzaXR1YXRpb25zIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgc3RydWN0IFgge307CiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGNvbnN0IFggJiAiLi4uIgogICAgICAgICAgICAgIHZvaWQgbShjb25zdCA6OlggJik7CgogICAgICAgICAgICBhbmQgdGhpczoKCiAgICAgICAgICAgICAgc3RydWN0IFgge307CiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGNvbnN0IDo6WCAmICIuLi4iCiAgICAgICAgICAgICAgdm9pZCBtKGNvbnN0IFggJik7CgoyMDEwLTAxLTIwOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc29tZSB1bmFyeSBzY29wZSBvcGVyYXRvciAoOjopIGRlbm90aW5nIGdsb2JhbCBzY29wZSBwcm9ibGVtcyBpbiB0aGUgdHlwZXMgZ2VuZXJhdGVkCiAgICAgICAgICAgIGludG8gdGhlIEMrKyBsYXllci4gUHJldmlvdXNseSB0aGUgdW5hcnkgc2NvcGUgb3BlcmF0b3Igd2FzIGRyb3BwZWQgaW4gdGhlIGdlbmVyYXRlZCBjb2RlCiAgICAgICAgICAgIGlmIHRoZSB0eXBlIGhhZCBhbnkgc29ydCBvZiBxdWFsaWZpZXIsIGZvciBleGFtcGxlIHdoZW4gdXNpbmcgcG9pbnRlcnMsIHJlZmVyZW5jZXMsIGxpa2UKICAgICAgICAgICAgOjpmb28qLCA6OmZvbyYsIGJhcjwgOjpmb28qID4uCgoyMDEwLTAxLTEzOiBvbGx5CgkgICAgW1BIUF0gQWRkIGRhdGV0aW1lIHRvIHRoZSBsaXN0IG9mIFBIUCBwcmVkZWZpbmVkIGNsYXNzZXMgKHBhdGNoCgkgICAgZnJvbSBEYXZpZCBGbGV0Y2hlciBpbiBTRiMyOTMxMDQyKS4KCjIwMTAtMDEtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIFNsaWdodCBjaGFuZ2UgdG8gd2FybmluZywgZXJyb3IgYW5kIGRpYWdub3N0aWMgcmVwb3J0aW5nLiBUaGUgd2FybmluZyBudW1iZXIgaXMgbm8gCiAgICAgICAgICAgIGxvbmdlciBzaG93biB3aXRoaW4gYnJhY2tldHMuIFRoaXMgaXMgdG8gaGVscCBkZWZhdWx0IHBhcnNpbmcgb2Ygd2FybmluZyBtZXNzYWdlcyBieQogICAgICAgICAgICBvdGhlciB0b29scywgdmltIG9uIFVuaXggaW4gcGFydGljdWxhci4KCiAgICAgICAgICAgIEV4YW1wbGUgb3JpZ2luYWwgZGlzcGxheSB1c2luZyAtRnN0YW5kYXJkOgogICAgICAgICAgICAgIGV4YW1wbGUuaToyMDogV2FybmluZyg0MDEpOiBOb3RoaW5nIGtub3duIGFib3V0IGJhc2UgY2xhc3MgJ0InLiBJZ25vcmVkLgogICAgICAgICAgICBOZXcgZGlzcGxheToKICAgICAgICAgICAgICBleGFtcGxlLmk6MjA6IFdhcm5pbmcgNDAxOiBOb3RoaW5nIGtub3duIGFib3V0IGJhc2UgY2xhc3MgJ0InLiBJZ25vcmVkLgoKICAgICAgICAgICAgQWxzbyBzdWJ0bGUgZml4IHRvIC1GbWljcm9zb2Z0IGZvcm1hdCBhZGRpbmcgaW4gbWlzc2luZyBzcGFjZS4gRXhhbXBsZSBvcmlnaW5hbCBkaXNwbGF5OgogICAgICAgICAgICAgIGV4YW1wbGUuaSgyMCk6IFdhcm5pbmcoNDAxKTogTm90aGluZyBrbm93biBhYm91dCBiYXNlIGNsYXNzICdCYXNlJy4gSWdub3JlZC4KICAgICAgICAgICAgTmV3IGRpc3BsYXk6CiAgICAgICAgICAgICAgZXhhbXBsZS5pKDIwKSA6IFdhcm5pbmcgNDAxOiBOb3RoaW5nIGtub3duIGFib3V0IGJhc2UgY2xhc3MgJ0Jhc2UnLiBJZ25vcmVkLgoKMjAxMC0wMS0xMDogd3NmdWx0b24KICAgICAgICAgICAgRml4IGEgZmV3IGluY29uc2lzdGVuY2llcyBpbiByZXBvcnRpbmcgb2YgZmlsZS9saW5lIG51bWJlcmluZ3MgaW5jbHVkaW5nIG1vZGlmeWluZwogICAgICAgICAgICB0aGUgb3ZlcmxvYWQgd2FybmluZ3MgNTA5LCA1MTIsIDUxNiwgNDc0LCA0NzUgdG8gbm93IGJlIHR3byBsaW5lIHdhcm5pbmdzLgoKMjAxMC0wMS0xMDogd3NmdWx0b24KICAgICAgICAgICAgTW9kaWZ5IC1kZWJ1Zy10YWdzIG91dHB1dCB0byB1c2Ugc3RhbmRhcmQgZmlsZSBuYW1lL2xpbmUgcmVwb3J0aW5nIHNvIHRoYXQgZWRpdG9ycwogICAgICAgICAgICBjYW4gZWFzaWx5IG5hdmlnYXRlIHRvIHRoZSBhcHByb3ByaWF0ZSBsaW5lcy4KICAgICAgICAgICAgV2FzIHR5cGljYWxseToKICAgICAgICAgICAgICAuIHRvcCAuIGluY2x1ZGUgLiBpbmNsdWRlICgvdXNyL3NoYXJlL3N3aWcvdGVtcC90cnVuay9MaWIvc3dpZy5zd2c6MzEyKQogICAgICAgICAgICAgIC4gdG9wIC4gaW5jbHVkZSAuIGluY2x1ZGUgLiBpbmNsdWRlICgvdXNyL3NoYXJlL3N3aWcvdGVtcC90cnVuay9MaWIvc3dpZ3dhcm5pbmdzLnN3ZzozOSkKICAgICAgICAgICAgbm93OgogICAgICAgICAgICAgIC91c3Ivc2hhcmUvc3dpZy90ZW1wL3RydW5rL0xpYi9zd2lnLnN3ZzozMTI6ICAuIHRvcCAuIGluY2x1ZGUgLiBpbmNsdWRlCiAgICAgICAgICAgICAgL3Vzci9zaGFyZS9zd2lnL3RlbXAvdHJ1bmsvTGliL3N3aWd3YXJuaW5ncy5zd2c6Mzk6ICAuIHRvcCAuIGluY2x1ZGUgLiBpbmNsdWRlIC4gaW5jbHVkZQoKMjAxMC0wMS0wMzogd3NmdWx0b24KICAgICAgICAgICAgRml4IG1pc3NpbmcgZmlsZS9saW5lIG51bWJlcnMgZm9yIHR5cGVtYXAgd2FybmluZ3MgYW5kIGluIG91dHB1dCBmcm9tIHRoZQogICAgICAgICAgIC1kZWJ1Zy10bXNlYXJjaC8tZGVidWctdG11c2VkIG9wdGlvbnMuCgoyMDEwLTAxLTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgdHlwZW1hcHMgdXNlZCBkZWJ1Z2dpbmcgb3B0aW9uICgtZGVidWctdG11c2VkKS4gV2hlbiB1c2VkIGVhY2ggbGluZSBkaXNwbGF5cwogICAgICAgICAgICB0aGUgdHlwZW1hcCB1c2VkIGZvciBlYWNoIHR5cGUgZm9yIHdoaWNoIGNvZGUgaXMgYmVpbmcgZ2VuZXJhdGVkIGluY2x1ZGluZyB0aGUgZmlsZQogICAgICAgICAgICBhbmQgbGluZSBudW1iZXIgcmVsYXRlZCB0byB0aGUgdHlwZS4gVGhpcyBpcyBlZmZlY3RpdmVseSBhIGNvbmRlbnNlZCBmb3JtIG9mIHRoZQogICAgICAgICAgICAtZGVidWctdG1zZWFyY2ggb3B0aW9uLiBEb2N1bWVudGVkIGluIFR5cGVtYXBzLmh0bWwuCgoyMDA5LTEyLTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yICVqYXZhZXhjZXB0aW9uIGFuZCBkaXJlY3RvcnMgc28gdGhhdCBhbGwgdGhlIGFwcHJvcHJpYXRlIHRocm93cyBjbGF1c2VzIAogICAgICAgICAgICBhcmUgZ2VuZXJhdGVkLiBQcm9ibGVtIHJlcG9ydGVkIGJ5IFBldGVyIEdyZWVud29vZC4KCjIwMDktMTItMjA6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCAtZGVidWctdG1zZWFyY2ggb3B0aW9uIGZvciBkZWJ1Z2dpbmcgdGhlIHR5cGVtYXAgcGF0dGVybiBtYXRjaGluZyBydWxlcy4KICAgICAgICAgICAgRG9jdW1lbnRlZCBpbiBUeXBlbWFwcy5odG1sLgoKMjAwOS0xMi0xMjogd3NmdWx0b24KICAgICAgICAgICAgW09jdGF2ZV0gUmVtb3ZlIHRoZSAtYXBpIG9wdGlvbiBhbmQgdXNlIHRoZSBuZXcgT0NUQVZFX0FQSV9WRVJTSU9OX05VTUJFUgogICAgICAgICAgICBtYWNybyBwcm92aWRlZCBpbiB0aGUgb2N0YXZlIGhlYWRlcnMgZm9yIGRldGVybWluaW5nIHRoZSBhcGkgdmVyc2lvbiBpbnN0ZWFkLgoKMjAwOS0xMi0wNDogb2xseQoJICAgIFtSdWJ5XSBJbXByb3ZlIHN1cHBvcnQgZm9yIFJ1YnkgMS45IHVuZGVyIEdDQy4gIEFkZHJlc3NlcyBwYXJ0IG9mCgkgICAgU0YjMjg1OTYxNC4KCjIwMDktMTItMDQ6IG9sbHkKCSAgICBGaXggaGFuZGxpbmcgb2YgbW9kdWxvIG9wZXJhdG9yICglKSBpbiBjb25zdGFudCBleHByZXNzaW9ucwoJICAgIChTRiMyODE4NTYyKS4KCjIwMDktMTItMDQ6IG9sbHkKCSAgICBbUEhQXSAiZW1wdHkiIGlzIGEgcmVzZXJ2ZWQgd29yZCBpbiBQSFAsIHNvIHJlbmFtZSBlbXB0eSgpIG1ldGhvZAoJICAgIG9uIFNUTCBjbGFzc2VzIHRvICJpc19lbXB0eSgpIiAocHJldmlvdXNseSB0aGlzIHdhcyBhdXRvbWF0aWNhbGx5CgkgICAgcmVuYW1lZCB0byAiY19lbXB0eSgpIikuCgkgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDA5LTEyLTAzOiBvbGx5CgkgICAgW1BIUF0gQWRkIHR5cGVtYXBzIGZvciBsb25nIGxvbmcgYW5kIHVuc2lnbmVkIGxvbmcgbG9uZywgYW5kIGZvcgoJICAgIHBvaW50ZXIgdG8gbWV0aG9kLgoKMjAwOS0xMi0wMjogb2xseQoJICAgIFtQSFBdIEZpeCB3YXJuaW5nIGFuZCByZW5hbWUgb2YgcmVzZXJ2ZWQgY2xhc3MgbmFtZSB0byBiZSBjYXNlCgkgICAgaW5zZW5zaXRpdmUuCgoyMDA5LTEyLTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBSZXZlcnQgc3VwcG9ydCBmb3IgJWV4dGVuZCBhbmQgbWVtYmVyaW4gdHlwZW1hcHMgYWRkZWQgaW4gc3dpZy0xLjMuMzkuIFRoZQoJICAgIG1lbWJlcmluIHR5cGVtYXBzIGFyZSBpZ25vcmVkIGFnYWluIGZvciBtZW1iZXIgdmFyaWFibGVzIHdpdGhpbiBhICVleHRlbmQgYmxvY2suCiAgICAgICAgICAgIERvY3VtZW50YXRpb24gaW5jb25zaXN0ZW5jeSByZXBvcnRlZCBieSBUb3JzdGVuIExhbmRzY2hvZmYuCgoyMDA5LTExLTI5OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEZpeCBnZW5lcmF0ZWQgcXVvdGluZyB3aGVuIHVzaW5nICVqYXZhY29uc3QoMSkvJWNzY29uc3QoMSkgZm9yIAogICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBtZW1iZXIgdmFyaWFibGVzLgoKICAgICAgICAgICAgICAlamF2YWNvbnN0KDEpIEE7CiAgICAgICAgICAgICAgJWNzY29uc3QoMSkgQTsKICAgICAgICAgICAgICBzdHJ1Y3QgWCB7CiAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBBID0gJ0EnOyAKICAgICAgICAgICAgICB9OwoKMjAwOS0xMS0yNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXggJWphdmFjb25zdCgxKS8lY3Njb25zdCgxKSBmb3Igc3RhdGljIGNvbnN0IG1lbWJlciB2YXJpYWJsZXMgdG8KICAgICAgICAgICAgdXNlIHRoZSBhY3R1YWwgY29uc3RhbnQgdmFsdWUgaWYgaXQgaXMgc3BlY2lmaWVkLCByYXRoZXIgdGhhbiB0aGUgQysrIGNvZGUgdG8KICAgICAgICAgICAgYWNjZXNzIHRoZSBtZW1iZXIuCgogICAgICAgICAgICAgICVqYXZhY29uc3QoMSkgRU47CiAgICAgICAgICAgICAgJWNzY29uc3QoMSkgRU47CiAgICAgICAgICAgICAgc3RydWN0IFggewogICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCBFTiA9IDI7CiAgICAgICAgICAgICAgfTsKCjIwMDktMTEtMjM6IHdzZnVsdG9uCiAgICAgICAgICAgIEMrKyBuZXN0ZWQgdHlwZWRlZiBjbGFzc2VzIGNhbiBub3cgYmUgaGFuZGxlZCB0b28sIGZvciBleGFtcGxlOgogICAgICAgICAgICAgIHN0cnVjdCBPdXRlciB7CiAgICAgICAgICAgICAgICB0eXBlZGVmIEZvbyB7IH0gRm9vVHlwZWRlZjEsIEZvb1R5cGVkZWYyOwogICAgICAgICAgICAgIH07CgoyMDA5LTExLTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBUaGUgd3JhcHBlcnMgZm9yIEMgbmVzdGVkIHN0cnVjdHMgYXJlIG5vdyBnZW5lcmF0ZWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgZGVjbGFyZWQgCiAgICAgICAgICAgIGluIHRoZSBwYXJzZWQgY29kZS4KCjIwMDktMTEtMTg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjNDkxNDc2IC0gbXVsdGlwbGUgZGVjbGFyYXRpb25zIG9mIG5lc3RlZCBzdHJ1Y3RzLCBmb3IgZXhhbXBsZToKICAgICAgICAgICAgICBzdHJ1Y3QgT3V0ZXIgewogICAgICAgICAgICAgICAgc3RydWN0IHsKICAgICAgICAgICAgICAgICAgaW50IHZhbDsKICAgICAgICAgICAgICAgIH0gaW5uZXIxLCBpbm5lcjIsICppbm5lcjMsIGlubmVyNFsxXTsKICAgICAgICAgICAgICB9IG91dGVyOwoKMjAwOS0xMS0xNzogd3NmdWx0b24KICAgICAgICAgICAgRml4IHBhcnNpbmcgb2YgZW51bSBkZWNsYXJhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb24sIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBlbnVtIEFCQyB7CiAgICAgICAgICAgICAgICBhLAogICAgICAgICAgICAgICAgYiwKICAgICAgICAgICAgICAgIGMKICAgICAgICAgICAgICB9IEEgPSBhLCAqcEMgPSAmQywgYXJyYXlbM10gPSB7YSwgYiwgY307CgoyMDA5LTExLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggcGFyc2luZyBvZiBzdHJ1Y3QgZGVjbGFyYXRpb24gYW5kIGluaXRpYWxpemF0aW9uLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgc3RydWN0IFMgewogICAgICAgICAgICAgICAgIGludCB4OwogICAgICAgICAgICAgIH0gaW5zdGFuY2UgPSB7IDEwIH07CgoyMDA5LTExLTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE5NjA5NzcgLSBTeW50YXggZXJyb3IgcGFyc2luZyBkZXJpdmVkIG5lc3RlZCBjbGFzcyBkZWNsYXJhdGlvbiBhbmQgbWVtYmVyCiAgICAgICAgICAgIHZhcmlhYmxlIGluc3RhbmNlLgoKMjAwOS0xMS0xNDogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMyMzEwNDgzIC0gZnVuY3Rpb24gcG9pbnRlciB0eXBlZGVmIHdpdGhpbiBleHRlcm4gIkMiIGJsb2NrLgoKMjAwOS0xMS0xMzogd3NmdWx0b24KICAgICAgICAgICAgRml4IHVzYWdlIG9mIG5lc3RlZCB0ZW1wbGF0ZSBjbGFzc2VzIHdpdGhpbiB0ZW1wbGF0ZWQgY2xhc3NlcyBzbyB0aGF0IGNvbXBpbGVhYmxlIGNvZGUgCiAgICAgICAgICAgIGlzIGdlbmVyYXRlZC4KCjIwMDktMTEtMTM6IG9sbHkKCSAgICBbcGhwXSBGaXggcGxhY2Ugd2hlcmUgY2xhc3MgcHJlZml4IChhcyBzcGVjaWZpZWQgd2l0aCAtcHJlZml4KQoJICAgIHdhc24ndCBiZWluZyB1c2VkLiAgUGF0Y2ggZnJvbSBndmVyYnJ1Z2dlbiBpbiBTRiMyODkyNjQ3LgoKMjAwOS0xMS0xMjogd3NmdWx0b24KICAgICAgICAgICAgRml4IHVzYWdlIG9mIG5lc3RlZCB0ZW1wbGF0ZSBjbGFzc2VzIHNvIHRoYXQgY29tcGlsZWFibGUgY29kZSBpcyBnZW5lcmF0ZWQgLSB0aGUgbmVzdGVkCiAgICAgICAgICAgIHRlbXBsYXRlIGNsYXNzIGlzIG5vdyB0cmVhdGVkIGxpa2UgYSBub3JtYWwgbmVzdGVkIGNsYXNzZXMsIHRoYXQgaXMsIGFzIGFuIG9wYXF1ZSB0eXBlCiAgICAgICAgICAgIHVubGVzcyB0aGUgbmVzdGVkd29ya2Fyb3VuZCBmZWF0dXJlIGlzIHVzZWQuCgoyMDA5LTExLTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBSZXBsYWNlIFNXSUdXQVJOX1BBUlNFX05FU1RFRF9DTEFTUyB3aXRoIFNXSUdXQVJOX1BBUlNFX05BTUVEX05FU1RFRF9DTEFTUyBhbmQKICAgICAgICAgICAgU1dJR1dBUk5fUEFSU0VfVU5OQU1FRF9ORVNURURfQ0xBU1MgZm9yIG5hbWVkIGFuZCB1bm5hbWVkIG5lc3RlZCBjbGFzc2VzIHJlc3BlY3RpdmVseS4KCiAgICAgICAgICAgIE5hbWVkIG5lc3RlZCBjbGFzcyBpZ25vcmVkIHdhcm5pbmdzIGNhbiBub3cgYmUgc3VwcHJlc3NlZCBieSBuYW1lIHVzaW5nICV3YXJuZmlsdGVyLCBlZzoKCiAgICAgICAgICAgICAgJXdhcm5maWx0ZXIoU1dJR1dBUk5fUEFSU0VfTkFNRURfTkVTVEVEX0NMQVNTKSBPdXRlcjo6SW5uZXI7CgogICAgICAgICAgICBidXQgY2xlYXJseSB1bm5hbWVkIG5lc3RlZCBjbGFzc2VzIGNhbm5vdCBhbmQgdGhlIGdsb2JhbCBzdXBwcmVzc2lvbiBpcyBzdGlsbCByZXF1aXJlZCwgZWc6CgogICAgICAgICAgICAgICNwcmFnbWEgU1dJRyBub3dhcm49U1dJR1dBUk5fUEFSU0VfVU5OQU1FRF9ORVNURURfQ0xBU1MKCjIwMDktMTEtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZGVkIHRoZSBuZXN0ZWR3b3JrYXJvdW5kIGZlYXR1cmUgYXMgYSB3YXkgdG8gdXNlIHRoZSBmdWxsIGZ1bmN0aW9uYWxpdHkgb2YgYSBuZXN0ZWQgY2xhc3MgCiAgICAgICAgICAgIChDKysgbW9kZSBvbmx5KS4gSXQgcmVtb3ZlcyB0aGUgbmVzdGVkIGNsYXNzIGZyb20gU1dJRydzIHR5cGUgaW5mb3JtYXRpb24gc28gaXQgaXMgYXMgaWYgU1dJRwogICAgICAgICAgICBoYWQgbmV2ZXIgcGFyc2VkIHRoZSBuZXN0ZWQgY2xhc3MuIFRoZSBkb2N1bWVudGVkIG5lc3RlZCBjbGFzcyB3b3JrYXJvdW5kcyB1c2luZyBhIGdsb2JhbAogICAgICAgICAgICBmYWtlIGNsYXNzIHN0b3BwZWQgd29ya2luZyB3aGVuIFNXSUcgdHJlYXRlZCB0aGUgbmVzdGVkIGNsYXNzIGFzIGFuIG9wYXF1ZSBwb2ludGVyLCBhbmQKICAgICAgICAgICAgdGhpcyBmZWF0dXJlIHJldmVydHMgdGhpcyBiZWhhdmlvdXIuIFRoZSBkb2N1bWVudGF0aW9uIGhhcyBiZWVuIHVwZGF0ZWQgd2l0aCBkZXRhaWxzIG9mIGhvdwogICAgICAgICAgICB0byB1c2UgYW5kIGltcGxlbWVudCBpdCwgc2VlIHRoZSAiTmVzdGVkIGNsYXNzZXMiIHNlY3Rpb24gaW4gU1dJR1BsdXMuaHRtbC4KCjIwMDktMTEtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIFRoZXJlIHdlcmUgYSBudW1iZXIgb2YgQysrIGNhc2VzIHdoZXJlIG5lc3RlZCBjbGFzc2VzL3N0cnVjdHMvdW5pb25zIHdlcmUgYmVpbmcgaGFuZGxlZAogICAgICAgICAgICBhcyBpZiBDIGNvZGUgd2FzIGJlaW5nIHBhcnNlZCB3aGljaCB3b3VsZCBvZnRlbnRpbWVzIGxlYWQgdG8gdW5jb21waWxlYWJsZSBjb2RlIGFzIGFuCiAgICAgICAgICAgIGF0dGVtcHQgd2FzIG1hZGUgdG8gd3JhcCB0aGUgbmVzdGVkIHN0cnVjdHMgbGlrZSBpdCBpcyBkb2N1bWVudGVkIGZvciBDIGNvZGUuIE5vdyBhbGwKICAgICAgICAgICAgbmVzdGVkIHN0cnVjdHMvY2xhc3Nlcy91bmlvbnMgYXJlIGlnbm9yZWQgaW4gQysrIG1vZGUsIGFzIHdhcyBhbHdheXMgZG9jdW1lbnRlZC4gSG93ZXZlciwKICAgICAgICAgICAgdGhlcmUgaXMgYW4gaW1wcm92ZW1lbnQgYXMgdXNhZ2Ugb2YgbmVzdGVkIHN0cnVjdHMvY2xhc3Nlcy91bmlvbnMgaXMgbm93IGFsd2F5cyB0cmVhdGVkCiAgICAgICAgICAgIGFzIGFuIG9wYXF1ZSB0eXBlIGJ5IGRlZmF1bHQsIHJlc3VsdGluZyBpbiBnZW5lcmF0ZWQgY29kZSB0aGF0IHNob3VsZCBhbHdheXMgY29tcGlsZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAwOS0xMS0wOTogZHJqb2UKCSAgICBGaXggUiBmb3IgLWZjb21wYWN0IGFuZCBhZGQgc3RkX21hcC5pCgoyMDA5LTExLTA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggaW5jb25zaXN0ZW5jeSBmb3IgbmVzdGVkIHN0cnVjdHMvdW5pb25zL2NsYXNzZXMuIFVuY29tcGlsZWFibGUgY29kZSB3YXMgYmVpbmcKICAgICAgICAgICAgZ2VuZXJhdGVkIHdoZW4gaW5uZXIgc3RydWN0IGFuZCB1bmlvbiBkZWNsYXJhdGlvbnMgd2VyZSB1c2VkIGFzIHR5cGVzIHdpdGhpbiB0aGUKICAgICAgICAgICAgaW5uZXIgc3RydWN0LiBUaGUgaW5uZXIgc3RydWN0L3VuaW9uIGlzIG5vdyB0cmVhdGVkIGFzIGEgZm9yd2FyZCBkZWNsYXJhdGlvbiBtYWtpbmcgdGhlCiAgICAgICAgICAgIGJlaGF2aW91ciB0aGUgc2FtZSBhcyBhbiBpbm5lciBjbGFzcy4gKEMrKyBjb2RlKSwgZWc6CgogICAgICAgICAgICAgIHN0cnVjdCBPdXRlciB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgSW5uZXJTdHJ1Y3QgeyBpbnQgeDsgfTsKICAgICAgICAgICAgICAgIElubmVyU3RydWN0KiBnZXRJbm5lclN0cnVjdCgpOwogICAgICAgICAgICAgIH07CgoyMDA5LTExLTA4OiB3c2Z1bHRvbgoJICAgIElnbm9yZWQgbmVzdGVkIGNsYXNzL3N0cnVjdCB3YXJuaW5ncyBub3cgZGlzcGxheSB0aGUgbmFtZSBvZiB0aGUgaWdub3JlZCBjbGFzcy9zdHJ1Y3QuCgoyMDA5LTExLTA3OiB3c2Z1bHRvbgoJICAgIEJ1ZyAjMTUxNDY4MSAtIEZpeCBuZXN0ZWQgdGVtcGxhdGUgY2xhc3NlcyB3aXRoaW4gYSBuYW1lc3BhY2UgZ2VuZXJhdGVkIHVuY29tcGlsZWFibGUKICAgICAgICAgICAgY29kZSBhbmQgaW50cm9kdWNlZCBzdHJhbmdlIHNpZGUgZWZmZWN0cyB0byBvdGhlciB3cmFwcGVyIGNvZGUgZXNwZWNpYWxseSBjb2RlCiAgICAgICAgICAgIGFmdGVyIHRoZSBuZXN0ZWQgdGVtcGxhdGUgY2xhc3MuIE5vdGUgdGhhdCBuZXN0ZWQgdGVtcGxhdGUgY2xhc3NlcyBhcmUgc3RpbGwgaWdub3JlZC4KCjIwMDktMTEtMDc6IHdzZnVsdG9uCgkgICAgQWRkIG5ldyBkZWJ1ZyBvcHRpb25zOgogICAgICAgICAgICAgIC1kZWJ1Zy1zeW10YWJzICAgIC0gRGlzcGxheSBzeW1ib2wgdGFibGVzIGluZm9ybWF0aW9uCiAgICAgICAgICAgICAgLWRlYnVnLXN5bWJvbHMgICAgLSBEaXNwbGF5IHRhcmdldCBsYW5ndWFnZSBzeW1ib2xzIGluIHRoZSBzeW1ib2wgdGFibGVzCiAgICAgICAgICAgICAgLWRlYnVnLWNzeW1ib2xzICAgLSBEaXNwbGF5IEMgc3ltYm9scyBpbiB0aGUgc3ltYm9sIHRhYmxlcwoKMjAwOS0xMS0wMzogd3NmdWx0b24KCSAgICBGaXggc29tZSB1c2FnZSBvZiB1bmFyeSBzY29wZSBvcGVyYXRvciAoOjopIGRlbm90aW5nIGdsb2JhbCBzY29wZSwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIG5hbWVzcGFjZSBBQSB7IC8qIC4uLiAqLyB9CiAgICAgICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIDo6QUE7CgogICAgICAgICAgICBhbmQgYnVnICMxODE2ODAyIC0gU3dpZ1ZhbHVlV3JhcHBlciBzaG91bGQgYmUgdXNlZDoKCiAgICAgICAgICAgICAgc3RydWN0IENDIHsKICAgICAgICAgICAgICAgIENDKGludCk7IC8vIG5vIGRlZmF1bHQgY29uc3RydWN0b3IKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIDo6Q0MgeCgpOwoKICAgICAgICAgICAgYW5kIGluIHRlbXBsYXRlIHBhcmFtZXRlciBzcGVjaWFsaXphdGlvbnM6CgogICAgICAgICAgICAgIHN0cnVjdCBTIHt9OwogICAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgWCB7IHZvaWQgYSgpIHt9OyB9OwogICAgICAgICAgICAgIHRlbXBsYXRlIDw+IHN0cnVjdCBYPFM+IHsgdm9pZCBiKCkge307IH07CiAgICAgICAgICAgICAgJXRlbXBsYXRlKE15VENvbmNyZXRlKSBYPCA6OlMgPjsKCiAgICAgICAgICAgIHBsdXMgcHJvYmFibHkgc29tZSBvdGhlciBjb3JuZXIgY2FzZSB1c2FnZSBvZiA6Oi4KCjIwMDktMTEtMDI6IG9sbHkKCSAgICBbUHl0aG9uXSBGaXggcG90ZW50aWFsIG1lbW9yeSBsZWFrIGluIGluaXRpYWxpc2F0aW9uIGNvZGUgZm9yIHRoZQoJICAgIGdlbmVyYXRlZCBtb2R1bGUuCgoyMDA5LTEwLTIzOiB3c2Z1bHRvbgoJICAgIEZpeCBzZWcgZmF1bHQgd2hlbiB1c2luZyBhIG5hbWVkIG5lc3RlZCB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIHVzaW5nICV0ZW1wbGF0ZShuYW1lKSAKICAgICAgICAgICAgd2l0aGluIGEgY2xhc3MuIEEgd2FybmluZyB0aGF0IHRoZXNlIGFyZSBub3Qgc3VwcG9ydGVkIGlzIG5vdyBpc3N1ZWQgcGx1cyBwcm9jZXNzaW5nIAogICAgICAgICAgICBjb250aW51ZXMgYXMgaWYgbm8gbmFtZSB3YXMgZ2l2ZW4uCgoyMDA5LTEwLTIwOiB3c2Z1bHRvbgoJICAgIFtQeXRob25dIEZpeCBzdGQ6OnZlY3Rvcjxjb25zdCBUKj4uIFRoaXMgd291bGQgcHJldmlvdXNseSBjb21waWxlLCBidXQgbm90IHJ1biBjb3JyZWN0bHkuCgoyMDA5LTEwLTIwOiB3c2Z1bHRvbgoJICAgIEZpeGVkIHByZXZpb3VzbHkgZmFpcmx5IHBvb3IgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBhbmQgZXhwbGljaXQgCiAgICAgICAgICAgIHNwZWNpYWxpemF0aW9uIHN1cHBvcnQuIE51bWVyb3VzIGJ1Z3MgaW4gdGhpcyBhcmVhIGhhdmUgYmVlbiBmaXhlZCBpbmNsdWRpbmc6CgogICAgICAgICAgICAtIFRlbXBsYXRlIGFyZ3VtZW50IGRlZHVjdGlvbiBpbXBsZW1lbnRlZCBmb3IgdGVtcGxhdGUgdHlwZSBhcmd1bWVudHMsIGVnIHRoaXMgbm93CiAgICAgICAgICAgICAgd29ya3M6CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBYICAgICAge307CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBYPFQgKj4ge307CiAgICAgICAgICAgICAgICAldGVtcGxhdGUoWDEpIFg8Y29uc3QgaW50ICo+OyAvLyBDaG9vc2VzIFQgKiBzcGVjaWFsaXphdGlvbgoKICAgICAgICAgICAgICBhbmQgbW9yZSBjb21wbGV4IGNhc2VzIHdpdGggbXVsdGlwbGUgcGFyYW1ldGVycyBhbmQgYSBtaXggb2YgdGVtcGxhdGUgYXJndW1lbnQKICAgICAgICAgICAgICBkZWR1Y3Rpb24gYW5kIGV4cGxpY2l0bHkgc3BlY2lhbGlzZWQgcGFyYW1ldGVycywgZWc6CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPiBzdHJ1Y3QgVHdvUGFybSAgICAgICAgICAgICAgIHsgdm9pZCBhKCkge30gfTsKICAgICAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMT4gICAgICAgICAgICAgIHN0cnVjdCBUd29QYXJtPFQxICosIGludCAqPiAgeyB2b2lkIGUoKSB7fSB9OwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKEUpIFR3b1Bhcm08aW50ICoqLCBpbnQgKj47CgogICAgICAgICAgICBOb3RlIHRoYXQgdGhlIHByaW1hcnkgdGVtcGxhdGUgbXVzdCBub3cgYmUgaW4gc2NvcGUsIGxpa2UgaW4gQysrLCB3aGVuCiAgICAgICAgICAgIGFuIGV4cGxpY2l0IG9yIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gaXMgaW5zdGFudGlhdGVkIHdpdGggJXRlbXBsYXRlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDA5LTA5LTE0OiB3c2Z1bHRvbgoJICAgIFtDI10gQWRkICVjc2F0dHJpYnV0ZXMgZm9yIGFkZGluZyBDIyBhdHRyaWJ1dGVzIHRvIGVudW0gdmFsdWVzLCBzZWUgZG9jcyBmb3IgZXhhbXBsZS4KCjIwMDktMDktMTE6IHdzZnVsdG9uCgkgICAgRml4IG1lbW1vdmUgcmVncmVzc2lvbiBpbiBjZGF0YS5pIGFzIHJlcG9ydGVkIGJ5IEFkcmlhYW4gUmVudGluZy4KCjIwMDktMDktMDc6IHdzZnVsdG9uCgkgICAgRml4IGNvbnN0YW50IGV4cHJlc3Npb25zIGNvbnRhaW5pbmcgPD0gb3IgPj0uCgoyMDA5LTA5LTAyOiB3c2Z1bHRvbgoJICAgIFRoZSBmb2xsb3dpbmcgb3BlcmF0b3JzIGluIGNvbnN0YW50IGV4cHJlc3Npb25zIG5vdyByZXN1bHQgaW4gdHlwZSBib29sIGZvciBDKysgCiAgICAgICAgICAgIHdyYXBwZXJzIGFuZCByZW1haW4gYXMgdHlwZSBpbnQgZm9yIEMgd3JhcHBlcnMsIGFzIHBlciBlYWNoIHN0YW5kYXJkOiAKCiAgICAgICAgICAgICAgJiYgfHwgPT0gIT0gPCA+IDw9ID49IChBY3R1YWxseSB0aGUgbGFzdCA0IGFyZSBzdGlsbCBicm9rZW4pLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgI2RlZmluZSBBIDEwCiAgICAgICAgICAgICAgI2RlZmluZSBCIDEwCiAgICAgICAgICAgICAgI2RlZmluZSBBX0VRX0IgIEEgPT0gQiAvLyBub3cgd3JhcHBlZCBhcyB0eXBlIGJvb2wgZm9yIEMrKwogICAgICAgICAgICAgICNkZWZpbmUgQV9BTkRfQiBBICYmIEIgLy8gbm93IHdyYXBwZWQgYXMgdHlwZSBib29sIGZvciBDKysKCjIwMDktMDktMDI6IHdzZnVsdG9uCgkgICAgRml4ICMyODQ1NzQ2LiB0cnVlIGFuZCBmYWxzZSBhcmUgbm93IHJlY29nbmlzZWQga2V5d29yZHMgKG9ubHkgd2hlbiB3cmFwcGluZyBDKyspLgogICAgICAgICAgICBDb25zdGFudHMgc3VjaCBhcyB0aGUgZm9sbG93aW5nIGFyZSBub3cgd3JhcHBlZCAoYXMgdHlwZSBib29sKToKICAgICAgICAgICAgICAjZGVmaW5lIEZPTyB0cnVlCiAgICAgICAgICAgICAgI2RlZmluZSBCQVIgRk9PICYmIGZhbHNlCgpWZXJzaW9uIDEuMy40MCAoMTggQXVndXN0IDIwMDkpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMDktMDgtMTc6IG9sbHkKCSAgICBbUGVybF0gQWRkICIjdW5kZWYgZG9fZXhlYyIgdG8gb3VyIGNsZWFuIHVwIG9mIFBlcmwgZ2xvYmFsCgkgICAgbmFtZXNwYWNlIHBvbGx1dGlvbi4KCjIwMDktMDgtMTc6IG9sbHkKCSAgICBbUEhQXSBGaXggdG8gd3JhcCBhIHJlc291cmNlIHJldHVybmVkIGJ5IF9fZ2V0KCkgaW4gYSBQSFAgb2JqZWN0IChTRiMyNTQ5MjE3KS4KCjIwMDktMDgtMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMjc5NzQ4NSBBZnRlciBkb2luZyBhICdtYWtlIGNsZWFuJywgaW5zdGFsbCBmYWlscyBpZiB5b2RsMm1hbiBvciB5b2RsMmh0bWwgCiAgICAgICAgICAgIGlzIG5vdCBhdmFpbGFibGUuCgoyMDA5LTA4LTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBbT2N0YXZlXSBDYXVnaHQgZXhjZXB0aW9ucyBkaXNwbGF5IHRoZSB0eXBlIG9mIHRoZSBDKysgZXhjZXB0aW9uIGluc3RlYWQgb2YgdGhlCiAgICAgICAgICAgIGdlbmVyaWMgImMrKy1zaWRlIHRocmV3IGFuIGV4Y2VwdGlvbiIgbWVzc2FnZS4KCjIwMDktMDgtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBXaGVuICVjYXRjaGVzIGlzIHVzZWQsIGZpeCBzbyB0aGF0IGFueSBjbGFzc2VzIHNwZWNpZmllZCBpbiB0aGUgInRocm93cyIKICAgICAgICAgICAgYXR0cmlidXRlIG9mIHRoZSAidGhyb3dzIiB0eXBlbWFwIGFyZSBnZW5lcmF0ZWQgaW50byB0aGUgSmF2YSBtZXRob2QncyB0aHJvd3MgY2xhdXNlLgoKMjAwOS0wOC0xNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggZXhjZXB0aW9uIGhhbmRsaW5nIHdoZW4gJWNhdGNoZXMgaXMgdXNlZCwgcmVwb3J0ZWQgYnkgSnVhbiBNYW51ZWwgQWx2YXJlei4KCjIwMDktMDgtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAldGVtcGxhdGUgc2VnIGZhdWx0IG9uIHNvbWUgY2FzZXMgb2Ygb3ZlcmxvYWRpbmcgdGhlIHRlbXBsYXRlZCBtZXRob2QuCiAgICAgICAgICAgIEJ1ZyByZXBvcnRlZCBieSBKYW4gS3VwZWMuCgoyMDA5LTA4LTE1OiB3c2Z1bHRvbgoJICAgIFtSdWJ5XSBBZGQgbnVtZXJvdXMgbWlzc2luZyB3cmFwcGVkIG1ldGhvZHMgZm9yIHN0ZDo6dmVjdG9yPGJvb2w+IHNwZWNpYWxpemF0aW9uCiAgICAgICAgICAgIGFzIHJlcG9ydGVkIGJ5IFlvdXNzZWYgSm9uZXMuCgoyMDA5LTA4LTE0OiB3c2Z1bHRvbgoJICAgIFtQZXJsXSBBZGQgU1dJR19Db252ZXJ0UHRyQW5kT3duKCkgbWV0aG9kIGludG8gdGhlIHJ1bnRpbWUgZm9yIHNtYXJ0IHBvaW50ZXIgCiAgICAgICAgICAgIG1lbW9yeSBvd25lcnNoaXAgY29udHJvbC4gc2hhcmVkX3B0ciBzdXBwb3J0IHN0aWxsIHRvIGJlIGFkZGVkLiBQYXRjaCBmcm9tIAogICAgICAgICAgICBEYXZpZCBGbGV0Y2hlci4KCjIwMDktMDgtMTQ6IG9sbHkKCSAgICBbUEhQXSBQSFA1IG5vdyB3cmFwcyBzdGF0aWMgbWVtYmVyIHZhcmlhYmxlcyBhcyBkb2N1bWVudGVkLgoKMjAwOS0wOC0xNDogb2xseQoJICAgIFtQSFBdIFVwZGF0ZSB0aGUgUEhQICJjbGFzcyIgZXhhbXBsZSB0byB3b3JrIHdpdGggUEhQNSBhbmQgdXNlCgkgICAgbW9kZXJuIHdyYXBwaW5nIGZlYXR1cmVzLgoKMjAwOS0wOC0xMzogd3NmdWx0b24KCSAgICBbUEhQXSBzdGQ6OnZlY3RvciB3cmFwcGVycyBvdmVyaGF1bC4gVGhleSBubyBsb25nZXIgcmVxdWlyZSB0aGUgCiAgICAgICAgICAgIHNwZWNpYWxpemVfc3RkX3ZlY3RvcigpIG1hY3JvLiBBZGRlZCB3cmFwcGVycyBmb3IgY2FwYWNpdHkoKSBhbmQgcmVzZXJ2ZSgpLgoKMjAwOS0wOC0xMzogd3NmdWx0b24KCSAgICBbUEhQXSBBZGQgY29uc3QgcmVmZXJlbmNlIHR5cGVtYXBzLiBjb25zdCByZWZlcmVuY2UgcHJpbWl0aXZlIHR5cGVzIGFyZQogICAgICAgICAgICBub3cgcGFzc2VkIGJ5IHZhbHVlIHJhdGhlciB0aGFuIHBvaW50ZXIgbGlrZSB0aGUgb3RoZXIgdGFyZ2V0IGxhbmd1YWdlcy4KCSAgICBGaXhlcyBTRiMyNTI0MDI5LgoKMjAwOS0wOC0wODogd3NmdWx0b24KCSAgICBbUHl0aG9uXSBNb3JlIHVzZXIgZnJpZW5kbHkgQXR0cmlidXRlRXJyb3IgaXMgcmFpc2VkIHdoZW4gdGhlcmUgYXJlCiAgICAgICAgICAgIG5vIGNvbnN0cnVjdG9ycyBnZW5lcmF0ZWQgZm9yIHRoZSBwcm94eSBjbGFzcyBpbiB0aGUgZXZlbnQgdGhhdCB0aGUKICAgICAgICAgICAgY2xhc3MgaXMgYWJzdHJhY3QgLSB0aGUgZXJyb3IgbWVzc2FnZSBpcyBub3cgCiAgICAgICAgICAgICJObyBjb25zdHJ1Y3RvciBkZWZpbmVkIC0gY2xhc3MgaXMgYWJzdHJhY3QiIHdoZXJlYXMgaWYgdGhlcmUgYXJlIG5vCiAgICAgICAgICAgIHB1YmxpYyBjb25zdHJ1Y3RvcnMgZm9yIGFueSBvdGhlciByZWFzb24gYW5kIHRoZSBjbGFzcyBpcyBub3QgYWJzdHJhY3QsCiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHJlbWFpbnMKICAgICAgICAgICAgIk5vIGNvbnN0cnVjdG9yIGRlZmluZWQiLgogICAgICAgICAgICBbdGNsXSBTaW1pbGFybHkgZm9yIHRjbCB3aGVuIHVzaW5nIC1pdGNsLgoKMjAwOS0wOC0wNDogb2xseQoJICAgIFtQSFBdIEZpeCBnZW5lcmF0ZWQgY29kZSB0byB3b3JrIHdpdGggUEhQIDUuMy4KCjIwMDktMDgtMDQ6IHZtaWtsb3MKICAgICAgICAgICAgW1BIUF0gVmFyaW91cyBtYXRoZW1hdGljYWwgZnVuY3Rpb25zICh3aGljaCB3b3VsZCBjb25mbGljdAogICAgICAgICAgICB3aXRoIHRoZSBidWlsdC1pbiBQSFAgb25lcykgYXJlIG5vdyBhdXRvbWF0aWNhbGx5IGhhbmRsZWQgYnkKICAgICAgICAgICAgYWRkaW5nIGEgJ2NfJyBwcmVmaXguCgoyMDA5LTA4LTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFRoZSBzdGQ6OnZlY3RvcjxUPiBpbXBsZW1lbnRhdGlvbiBpcyBpbXByb3ZlZCBhbmQgbm93IHVzZXMgJHR5cGVtYXAgc3VjaAogICAgICAgICAgICB0aGF0IHRoZSBwcm94eSBjbGFzcyBmb3IgVCBubyBsb25nZXIgaGFzIHRvIGJlIHNwZWNpZmllZCBpbiBzb21lIG1hY3JvcwogICAgICAgICAgICBmb3IgY29ycmVjdCBDIyBjb21waWxhdGlvbjsgdGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIGRlcHJlY2F0ZWQsIHdoZXJlCiAgICAgICAgICAgIENTVFlQRSB3YXMgdGhlIEMjIHR5cGUgZm9yIHRoZSBDKysgY2xhc3MgQ1RZUEU6CgogICAgICAgICAgICBTV0lHX1NURF9WRUNUT1JfU1BFQ0lBTElaRV9NSU5JTVVNKENTVFlQRSwgQ1RZUEUpCiAgICAgICAgICAgICAgdXNhZ2Ugc2hvdWxkIGJlIHJlbW92ZWQgYWx0b2dldGhlcgoKICAgICAgICAgICAgU1dJR19TVERfVkVDVE9SX1NQRUNJQUxJWkUoQ1NUWVBFLCBDVFlQRSkKICAgICAgICAgICAgICBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aDoKICAgICAgICAgICAgU1dJR19TVERfVkVDVE9SX0VOSEFOQ0VEKENUWVBFKQoKICAgICAgICAgICAgU29tZSBtb3JlIGRldGFpbHMgaW4gY3NoYXJwL3N0ZF92ZWN0b3IuaQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDA5LTA3LTMxOiBvbGx5CgkgICAgW1B5dGhvbl0gRml4IGluZGVudGF0aW9uIHNvIHRoYXQgd2UgZ2l2ZSBhIHVzZWZ1bCBlcnJvciBpZiB0aGUKCSAgICBtb2R1bGUgY2FuJ3QgYmUgbG9hZGVkLiAgUGF0Y2ggZnJvbSBHYWV0YW4gTGVobWFubiBpbiBTRiMyODI5ODUzLgoKMjAwOS0wNy0yOTogd3NmdWx0b24KICAgICAgICAgICAgQWRkICR0eXBlbWFwKG1ldGhvZCwgdHlwZWxpc3QpIHNwZWNpYWwgdmFyaWFibGUgbWFjcm8uIFRoaXMgYWxsb3dzCiAgICAgICAgICAgIHRoZSBjb250ZW50cyBvZiBhIHR5cGVtYXAgdG8gYmUgaW5zZXJ0ZWQgd2l0aGluIGFub3RoZXIgdHlwZW1hcC4KICAgICAgICAgICAgRnVsbHkgZG9jdW1lbnRlZCBpbiBUeXBlbWFwcy5odG1sLgoKMjAwOS0wNy0yOTogdm1pa2xvcwogICAgICAgICAgICBbUEhQXSBTdGF0aWMgbWVtYmVyIHZhcmlhYmxlcyBhcmUgbm93IHByZWZpeGVkIHdpdGggdGhlCiAgICAgICAgICAgIGNsYXNzIG5hbWUuIFRoaXMgYWxsb3dzIHN0YXRpYyBtZW1iZXIgdmFyaWFibGVzIHdpdGggdGhlCiAgICAgICAgICAgIHNhbWUgbmFtZSBpbiBkaWZmZXJlbnQgY2xhc3Nlcy4KCjIwMDktMDctMjk6IG9sbHkKCSAgICBbUHl0aG9uXSBBZGQgbWlzc2luZyBsb2NrcyB0byBzdGQ6Om1hcCB3cmFwcGVycy4gIFBhdGNoIGZyb20gCgkgICAgUGF1bCBIYW1wc29uIGluIFNGIzI4MTM4MzYuCgoyMDA5LTA3LTI5OiBvbGx5CgkgICAgW1BIUF0gRml4IG1lbW9yeSBsZWFrIGluIFBIUCBPVVRQVVQgdHlwZW1hcHMuICBSZXBvcnRlZCBieSBIaXRvc2hpCgkgICAgQW1hbm8gaW4gU0YjMjgyNjMyMi4KCjIwMDktMDctMjk6IG9sbHkKCSAgICBbUEhQXSBGaXggbWVtb3J5IGxlYWsgaW4gUEhQIHJlc291cmNlIGRlc3RydWN0b3IgZm9yIGNsYXNzZXMKCSAgICB3aXRob3V0IGEgZGVzdHJ1Y3RvciBhbmQgbm9uLWNsYXNzIHR5cGVzLiAgUGF0Y2ggZnJvbSBIaXRvc2hpIEFtYW5vCgkgICAgaW4gU0YjMjgyNTMwMy4KCjIwMDktMDctMjg6IG9sbHkKCSAgICBbUEhQXSBVcGRhdGUgd2FybmluZ3MgYWJvdXQgY2xhc2hlcyBiZXR3ZWVuIGlkZW50aWZpZXJzIGFuZCBQSFAKCSAgICBrZXl3b3JkcyBhbmQgYXV0b21hdGljIHJlbmFtaW5nIHRvIHdvcmsgd2l0aCB0aGUgUEhQNSBjbGFzcwoJICAgIHdyYXBwZXJzLiAgRml4ZXMgU0YjMTYxMzY3OS4KCjIwMDktMDctMjg6IHZtaWtsb3MKICAgICAgICAgICAgW1BIUF0gSWYgYSBtZW1iZXIgZnVuY3Rpb24gaXMgbm90IHB1YmxpYyBidXQgaXQgaGFzIGEgYmFzZQogICAgICAgICAgICB3aGljaCBpcyBwdWJsaWMsIHRoZW4gbm93IGEgd2FybmluZyBpcyBpc3N1ZWQgYW5kIHRoZSBtZW1iZXIKICAgICAgICAgICAgZnVuY3Rpb24gd2lsbCBiZSBwdWJsaWMsIGFzIFBIUCByZXF1aXJlcyB0aGlzLgoKMjAwOS0wNy0yMTogdm1pa2xvcwogICAgICAgICAgICBbUEhQXSBEaXJlY3RvciBzdXBwb3J0IGFkZGVkLgoKMjAwOS0wNy0xNTogb2xseQoJICAgIFtQZXJsXSBEb24ndCBzcGVjaWZ5IFBlcmwgcHJvdG90eXBlICIoKSIgZm9yIGEgY29uc3RydWN0b3Igd2l0aCBhCgkgICAgZGlmZmVyZW50IG5hbWUgdG8gdGhlIGNsYXNzLCBhcyBzdWNoIGNvbnN0cnVjdG9ycyBjYW4gc3RpbGwgdGFrZQoJICAgIHBhcmFtZXRlcnMuCgoyMDA5LTA3LTEyOiB4YXZpZXI5OAoJICAgIFtPY3RhdmVdIEFkZCBzdXBwb3J0IGZvciBPY3RhdmUgMy4yIEFQSQoKMjAwOS0wNy0wNTogb2xseQoJICAgIFtQSFBdIFVwZGF0ZSB0aGUgbGlzdCBvZiBQSFAga2V5d29yZHMgLSAiY2Z1bmN0aW9uIiBpcyBubyBsb25nZXIgYQoJICAgIGtleXdvcmQgaW4gUEhQNSBhbmQgUEhQIDUuMyBhZGRlZCAiZ290byIsICJuYW1lc3BhY2UiLCAiX19ESVJfXyIsCgkgICAgYW5kICJfX05BTUVTUEFDRV9fIi4KCjIwMDktMDctMDM6IG9sbHkKCSAgICBbVGNsXSBUbyBjb21wbGVtZW50IFVTRV9UQ0xfU1RVQlMsIGFkZCBzdXBwb3J0IGZvciBVU0VfVEtfU1RVQlMKCSAgICBhbmQgU1dJR19UQ0xfU1RVQlNfVkVSU0lPTi4gIERvY3VtZW50IGFsbCB0aHJlZSBpbiB0aGUgVGNsIGNoYXB0ZXIKCSAgICBvZiB0aGUgbWFudWFsLiAgQmFzZWQgb24gcGF0Y2ggZnJvbSBTRiMyODEwMzgwIGJ5IENocmlzdGlhbgoJICAgIEdvbGx3aXR6ZXIuCgoyMDA5LTA3LTAyOiB2bWlrbG9zCiAgICAgICAgICAgIFtQSFBdIEFkZGVkIGZhY3RvcnkuaSBmb3IgUEhQLCBzZWUgdGhlIGxpX2ZhY3RvcnkgdGVzdGNhc2UKICAgICAgICAgICAgZm9yIG1vcmUgaW5mbyBvbiBob3cgdG8gdXNlIGl0LgoKMjAwOS0wNy0wMjogd3NmdWx0b24KICAgICAgICAgICAgRml4IC1XYWxsa3cgb3B0aW9uIGFzIHJlcG9ydGVkIGJ5IFNvbG9tb24gR2liYnMuCgoyMDA5LTA3LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc3ludGF4IGVycm9yIHdoZW4gYSBuZXN0ZWQgc3RydWN0IGNvbnRhaW5zIGEgY29tbWVudCBjb250YWluaW5nIGEgKiBmb2xsb3dlZCAKICAgICAgICAgICAgZXZlbnR1YWxseSBieSBhIC8uIFJlZ3Jlc3Npb24gZnJvbSAxLjMuMzcsIHJlcG9ydGVkIGJ5IFNvbG9tb24gR2liYnMuCgoyMDA5LTA3LTAxOiB2bWlrbG9zCiAgICAgICAgICAgIFtQSFBdIFVua25vd24gcHJvcGVydGllcyBhcmUgbm8gbG9uZ2VyIGlnbm9yZWQgaW4gcHJveHkKICAgICAgICAgICAgY2xhc3Nlcy4KCjIwMDktMDctMDE6IHZtaWtsb3MKICAgICAgICAgICAgW1BIUF0gRml4ZWQgJW5ld29iamVjdCBiZWhhdmlvdXIsIHByZXZpb3VzbHkgYW55IG1ldGhvZAogICAgICAgICAgICBtYXJrZWQgd2l0aCAlbmV3b2JqZWN0IHdhcyBoYW5kbGVkIGFzIGEgY29uc3RydWN0b3IuCgoyMDA5LTA2LTMwOiBvbGx5CgkgICAgW1J1YnldIFVuZGVmaW5lIGNsb3NlIGFuZCBjb25uZWN0IG1hY3JvcyBkZWZpbmVkIGJ5IFJ1YnkgQVBJCgkgICAgaGVhZGVycyBhcyB3ZSBkb24ndCBuZWVkIHRoZW0gYW5kIHRoZXkgY2FuIGNsYXNoIHdpdGggQysrIG1ldGhvZHMKCSAgICBiZWluZyB3cmFwcGVkLiAgUGF0Y2ggZnJvbSBWaXQgT25kcnVjaCBpbiBTRiMyODE0NDMwLgoKMjAwOS0wNi0yNjogb2xseQoJICAgIFtSdWJ5XSBGaXggdG8gaGFuZGxlIEZJWE5VTSB2YWx1ZXMgZ3JlYXRlciB0aGFuIE1BWElOVCBwYXNzZWQgZm9yIGEKCSAgICBkb3VibGUgcGFyYW1ldGVyLgoKMjAwOS0wNi0yNDogd3NmdWx0b24KICAgICAgICAgICAgRml4IHdyYXBwaW5nIG1ldGhvZHMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBhbmQgdGhlIGNvbXBhY3RkZWZhdWx0YXJncyBmZWF0dXJlIAogICAgICAgICAgICB3aGVyZSBhIGNsYXNzIGlzIHBhc3NlZCBieSB2YWx1ZSBhbmQgaXMgYXNzaWduZWQgYSBkZWZhdWx0IHZhbHVlLiBUaGUgU3dpZ1ZhbHVlV3JhcHBlcgogICAgICAgICAgICB0ZW1wbGF0ZSB3b3JrYXJvdW5kIGZvciBhIG1pc3NpbmcgZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyBubyBsb25nZXIgdXNlZCBhcyB0aGUgY29kZSAKICAgICAgICAgICAgZ2VuZXJhdGVkIGRvZXMgbm90IGNhbGwgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IuCgoyMDA5LTA2LTE2OiB3c2Z1bHRvbgoJICAgIFtKYXZhLEMjXSBGaXggZW51bSBtYXJzaGFsbGluZyB3aGVuICVpZ25vcmUgaXMgdXNlZCBvbiBvbmUgb2YgdGhlIGVudW0gaXRlbXMuCiAgICAgICAgICAgIEluY29ycmVjdCBlbnVtIHZhbHVlcyB3ZXJlIGJlaW5nIHBhc3NlZCB0byB0aGUgQysrIGxheWVyIG9yIGNvbXBpbGF0aW9uIGVycm9ycyByZXN1bHRlZC4KCjIwMDktMDYtMDI6IHRhbGJ5CgkgICAgW1BlcmxdIFJlc29sdmVkIHJlZmVyZW5jZS5pIG92ZXJsb2FkIHN1cHBvcnQgcHJvYmxlbQoJICAgIGlkZW50aWZpZWQgYnkgSm9obiBQb3Rvd3NreS4KCjIwMDktMDUtMjY6IHdzZnVsdG9uCgkgICAgW0MjXSBJbXByb3ZlZCBzdGQ6Om1hcCB3cmFwcGVycyBiYXNlZCBvbiBwYXRjaCBmcm9tIFl1dmFsIEJhcm9yLiBUaGUgQyMgcHJveHkKICAgICAgICAgICAgbm93IGltcGxlbWVudHMgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSURpY3Rpb25hcnk8Pi4KCgkgICAgVGhlc2Ugc3RkOm1hcCB3cmFwcGVycyBoYXZlIGEgbm9uLWJhY2t3YXJkcyBjb21wYXRpYmxlIG92ZXJoYXVsIHRvIG1ha2UgdGhlbQogICAgICAgICAgICBsaWtlIGEgLk5FVCBJRGljdGlvbmFyeS4gU29tZSBtZXRob2QgbmFtZXMgaGF2ZSBjaGFuZ2VkIGFzIGZvbGxvd2luZzoKICAgICAgICAgICAgICBzZXQgLT4gc2V0aXRlbSAodXNlIHRoaXNbXSBwcm9wZXJ0eSBub3cpCiAgICAgICAgICAgICAgZ2V0IC0+IGdldGl0ZW0gKHVzZSB0aGlzW10gcHJvcGVydHkgbm93KQogICAgICAgICAgICAgIGhhc19rZXkgLT4gQ29udGFpbnNLZXkKICAgICAgICAgICAgICBkZWwgLT4gUmVtb3ZlCiAgICAgICAgICAgICAgY2xlYXIgLT4gQ2xlYXIKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgbWFjcm9zIHVzZWQgZm9yIHN0ZDo6bWFwIHdyYXBwZXJzIGFyZSBkZXByZWNhdGVkIGFuZCB3aWxsIG5vIGxvbmdlciB3b3JrOgogICAgICAgICAgICAgIHNwZWNpYWxpemVfc3RkX21hcF9vbl9rZXkKICAgICAgICAgICAgICBzcGVjaWFsaXplX3N0ZF9tYXBfb25fdmFsdWUKICAgICAgICAgICAgICBzcGVjaWFsaXplX3N0ZF9tYXBfb25fYm90aAoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDA5LTA1LTIwOiB2bWlrbG9zCiAgICAgICAgICAgIFtQSFBdIEFkZCB0aGUgJ3RoaXNvd24nIG1lbWJlciB0byBjbGFzc2VzLiBUaGUgdXNhZ2Ugb2YgaXQKICAgICAgICAgICAgaXMgdGhlIHNhbWUgYXMgdGhlIFB5dGhvbiB0aGlzb3duIG9uZTogaXQncyAxIGJ5IGRlZmF1bHQgYW5kCiAgICAgICAgICAgIHlvdSBjYW4gc2V0IGl0IHRvIDAgaWYgeW91IHdhbnQgdG8gcHJldmVudCBmcmVlaW5nIGl0LiAoRm9yCiAgICAgICAgICAgIGV4YW1wbGUgdG8gcHJldmVudCBhIGRvdWJsZSBmcmVlLikKCjIwMDktMDUtMTQ6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBGaXggdGhlIHdyb25nIHBvaW50ZXIgdmFsdWUgcmV0dXJuZWQgYnkgU3dpZ1B5T2JqZWN0X3JlcHIoKS4KCjIwMDktMDUtMTM6IG11dGFuZGl6IChNaWtlbCBCYW5jcm9mdCkKCSAgICBbYWxsZWdyb2NsXSBNaW5vciB0d2VhayB3aGVuIHdyYXBwaW5nIGluIC1ub2N3cmFwIG1vZGUuCgoyMDA5LTA1LTExOiB3c2Z1bHRvbgoJICAgIFtDI10gSW1wcm92ZWQgc3RkOjp2ZWN0b3Igd3JhcHBlcnMgb24gdGhlIEMjIHByb3h5IHNpZGUgZnJvbSBZdXZhbCBCYXJvci4gVGhlc2UKCSAgICBpbXBsZW1lbnQgSUxpc3Q8PiBpbnN0ZWFkIG9mIElFbnVtZXJhYmxlPD4gd2hlcmUgcG9zc2libGUuCgoyMDA5LTA0LTI5OiB3c2Z1bHRvbgoJICAgIFtKYXZhLCBDI10gQWRkIHRoZSAnbm90ZGVyaXZlZCcgYXR0cmlidXRlIHRvIHRoZSBqYXZhYmFzZSBhbmQgY3NiYXNlIHR5cGVtYXBzLgoJICAgIFdoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgc2V0LCB0aGUgdHlwZW1hcCB3aWxsIG5vdCBhcHBseSB0byBjbGFzc2VzIHRoYXQgYXJlIGRlcml2ZWQKCSAgICBmcm9tIGEgQysrIGJhc2UgY2xhc3MsIGVnIAoJICAgICAgJXR5cGVtYXAoY3NiYXNlLCBub3RkZXJpdmVkPSIxIikgU1dJR1RZUEUgIkNvbW1vbkJhc2UiCgoyMDA5LTA0LTI5OiBvbGx5CgkgICAgW1B5dGhvbl0gRG9uJ3QgYXR0ZW1wdCB0byBhY3F1aXJlIHRoZSBHSUwgaW4gc2l0dWF0aW9ucyB3aGVyZSB3ZQoJICAgIGtub3cgdGhhdCBpdCB3aWxsIGFscmVhZHkgYmUgbG9ja2VkLiAgVGhpcyBhdm9pZHMgc29tZSBkZWFkLWxvY2tzCgkgICAgd2l0aCBtb2RfcHl0aG9uIChkdWUgdG8gbW9kX3B5dGhvbiBidWdzIHdoaWNoIGFyZSBhcHBhcmVudGx5CgkgICAgdW5saWtlbHkgdG8gZXZlciBiZSBmaXhlZCksIGFuZCByZXN1bHRzIGluIHNtYWxsZXIgd3JhcHBlcnMgd2hpY2gKCSAgICBydW4gYSBsaXR0bGUgZmFzdGVyIChpbiB0ZXN0cyB3aXRoIFhhcGlhbiBvbiB4ODYtNjQgVWJ1bnR1IDkuMDQsCgkgICAgdGhlIHN0cmlwcGVkIHdyYXBwZXIgbGlicmFyeSB3YXMgMTElIHNtYWxsZXIgYW5kIHJhbiAyLjclIGZhc3RlcikuCgoyMDA5LTA0LTIxOiB3c2Z1bHRvbgoJICAgIFtDI10gRml4ICMyNzUzNDY5IC0gYm9vbCAmT1VUUFVUIGFuZCBib29sICpPVVRQVVQgdHlwZW1hcHMgaW5pdGlhbGlzYXRpb24uCgoyMDA5LTA0LTA5OiB3c2Z1bHRvbgoJICAgIEZpeCAjMjc0Njg1OCAtIEMgbWFjcm8gZXhwcmVzc2lvbiB1c2luZyBmbG9hdGluZyBwb2ludCBudW1iZXJzCgoyMDA5LTAzLTMwOiBvbGx5CgkgICAgW1BIUF0gVGhlIGRlZmF1bHQgb3V0IHR5cGVtYXAgZm9yIGNoYXJbQU5ZXSBub3cgcmV0dXJucyB0aGUgc3RyaW5nIHVwIHRvIGEKCSAgICB6ZXJvIGJ5dGUsIG9yIHRoZSBlbmQgb2YgdGhlIGFycmF5IGlmIHRoZXJlIGlzIG5vIHplcm8gYnl0ZS4gIFRoaXMKCSAgICBpcyB0aGUgc2FtZSBhcyBQeXRob24gZG9lcywgYW5kIHNlZW1zIG1vcmUgZ2VuZXJhbGx5IHVzZWZ1bCB0aGFuCgkgICAgdGhlIHByZXZpb3VzIGJlaGF2aW91ciBvZiByZXR1cm5pbmcgdGhlIHdob2xlIGNvbnRlbnRzIG9mIHRoZSBhcnJheQoJICAgIGluY2x1ZGluZyBhbnkgemVybyBieXRlcy4gIElmIHlvdSB3YW50IHRoZSBvbGQgYmVoYXZpb3VyLCB5b3UgY2FuIHByb3ZpZGUKCSAgICB5b3VyIG93biB0eXBlbWFwIHRvIGRvIHRoaXM6CgoJICAgICV0eXBlbWFwKG91dCkgY2hhciBbQU5ZXQoJICAgICV7CgkJUkVUVkFMX1NUUklOR0woJDEsICQxX2RpbTAsIDEpOwoJICAgICV9CgpWZXJzaW9uIDEuMy4zOSAoMjEgTWFyY2ggMjAwOSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDA5LTAzLTE5OiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4IHRoZSBtZW1vcnkgbGVhayByZWxhdGVkIHRvIFB5dGhvbiAzIHVuaWNvZGUgYW5kIEMgY2hhciogY29udmVyc2lvbiwKICAgICAgICAgICAgd2hpY2ggY2FuIGJlIHNob3duIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBiZWZvcmUgdGhpcyBmaXg6CiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICBmcm9tIGxpX2NzdHJpbmcgaW1wb3J0ICoKICAgICAgICAgICAgICAgICAgaT0wCiAgICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICAgICAgICBpICs9IDEKICAgICAgICAgICAgICAgICAgICAgIG4gPSBzdHIoaSkqMTAKICAgICAgICAgICAgICAgICAgICAgIHRlc3QzKG4pCgogICAgICAgICAgICBUaGlzIGZpeCBhZmZlY3RlZCBTV0lHX0FzQ2hhclB0ckFuZFNpemUoKSBzbyB5b3UgY2Fubm90IGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoCiAgICAgICAgICAgIGEgbnVsbCBhbGxvYyBhbmQgbm9uLW51bGwgY3B0ciBhcmd1bWVudCBpbiBQeXRob24gMywgb3RoZXJ3aXNlIGEgcnVudGltZSBlcnJvcgogICAgICAgICAgICB3aWxsIGJlIHJhaXNlZC4KCjIwMDktMDMtMTg6IHdzZnVsdG9uCgkgICAgW0MjXSBzdGQ6OnZlY3RvcjxUPiB3cmFwcGVyIGltcHJvdmVtZW50cyBmb3IgLk5FVCAyIGFuZCBhbHNvIHByb3ZpZGluZyB0aGUKCSAgICBuZWNlc3NhcnkgbWFjaGluZXJ5IHRvIHVzZSB0aGUgc3RkOjp2ZWN0b3I8VD4gd3JhcHBlcnMgd2l0aCBtb3JlIGFkdmFuY2VkIGZlYXR1cmVzIHN1Y2gKCSAgICBhcyBMSU5RIC0gdGhlIEMjIHByb3h5IGNsYXNzIG5vdyBkZXJpdmVzIGZyb20gSUVudW1lcmFibGU8Pi4gVGhlIGRlZmF1bHQgaXMgbm93IHRvIAoJICAgIGdlbmVyYXRlIGNvZGUgcmVxdWlyaW5nIC5ORVQgMiBhcyBhIG1pbmltdW0sIGFsdGhvdWdoIHRoZSBDIyBjb2RlIGNhbiBiZSBjb21waWxlZCAKCSAgICBmb3IgLk5FVCAxIGJ5IGRlZmluaW5nIHRoZSBTV0lHX0RPVE5FVF8xIEMjIHByZXByb2Nlc3NvciBjb25zdGFudC4gU2VlIHRoZSAKCSAgICBzdGRfdmVjdG9yLmkgZmlsZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDA5LTAzLTEyOiB3c2Z1bHRvbgoJICAgIFtSdWJ5XSBGaXggIzI2NzY3MzggU1dJRyBnZW5lcmF0ZWQgc3ltYm9sIG5hbWUgY2xhc2hlcy4KCjIwMDktMDMtMDE6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBTb21lIGZpeGVzIGZvciBQeXRob24gMy4wLjEgYW5kIGhpZ2hlciBzdXBwb3J0LiBJbiAzLjAuMSwgdGhlIEMgQVBJIGZ1bmN0aW9uCiAgICAgICAgICAgIFB5T2JqZWN0X0NvbXBhcmUgaXMgcmVtb3ZlZCwgc28gUHlPYmplY3RfUmljaENvbXBhcmVCb29sIGlzIHVzZWQgZm9yIHJlcGxhY2VtZW50LgogICAgICAgICAgICBTdHJ1Y3QgaW5pdGlsaXphdGlvbiBvZiBTd2lnUHlPYmplY3QgYW5kIFN3aWdQeU9iamVjdF9hc19udW1iZXIgY2hhbmdlZCB0byByZWZsZWN0CiAgICAgICAgICAgIHRoZSBkcm9wIG9mIHRwX2NvbXBhcmUgYW5kIG5iX2xvbmcuCgoyMDA5LTAzLTAxOiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4IFNGIzI1ODMxNjAuIE5vdyB0aGUgaW1wb3J0ZXIgaW4gUHl0aG9uIHNoYWRvdyB3cmFwcGVyIHRha2UgY2FyZSBvZiB0aGUKICAgICAgICAgICAgY2FzZSB0aGF0IG1vZHVsZSBhbHJlYWR5IGltcG9ydGVkIGF0IG90aGVyIHBsYWNlLgoKMjAwOS0wMi0yODogYmh5CiAgICAgICAgICAgIFtQeXRob25dIEZpeCBTRiMyNjM3MzUyLiBNb3ZlIHN0cnVjdCBkZWNsYXJhdGlvbiBvZiBTV0lHX21vZHVsZSBpbiBweWluaXQuc3dnIGJlZm9yZQogICAgICAgICAgICB0aGUgbWV0aG9kIGNhbGxzLCBzaW5jZSBzb21lIEMgY29tcGlsZXIgZG9uJ3QgYWxsb3cgZGVjbGFyYXRpb24gaW4gbWlkZGxlIG9mIGZ1bmN0aW9uCiAgICAgICAgICAgIGJvZHkuCgoyMDA5LTAyLTIxOiB3c2Z1bHRvbgoJICAgIFtBbGxlZ3JvY2xdIEZpeCBzZWcgZmF1bHQgd3JhcHBpbmcgc29tZSBjb25zdGFudCB2YXJpYWJsZSAoJWNvbnN0YW50KSB0eXBlcy4KCjIwMDktMDItMjA6IHdzZnVsdG9uCgkgICAgW0NGRkldIEZpeCBzZWcgZmF1bHRzIHdoZW4gZm9yICVleHRlbmQgYW5kIHVzaW5nIHN0YXRlbWVudHMuCgoyMDA5LTAyLTIwOiB3c2Z1bHRvbgoJICAgIEZpeCBTRiAjMjYwNTk1NTogLWNvIG9wdGlvbiB3aGljaCBicm9rZSBpbiAxLjMuMzcuIAoKMjAwOS0wMi0yMDogd3NmdWx0b24KCSAgICBOZXcgJWluc2VydCgiYmVnaW4iKSBzZWN0aW9uIGFkZGVkLiBBbHNvIGNhbiBiZSB1c2VkIGFzICViZWdpbi4gVGhpcyBpcyBhIG5ldwoJICAgIGNvZGUgc2VjdGlvbiByZXNlcnZlZCBlbnRpcmVseSBmb3IgdXNlcnMgYW5kIHRoZSBjb2RlIHdpdGhpbiB0aGUgc2VjdGlvbiBpcyBnZW5lcmF0ZWQKCSAgICBhdCB0aGUgdG9wIG9mIHRoZSBDL0MrKyB3cmFwcGVyIGZpbGUgYW5kIHNvIHByb3ZpZGVzIGEgbWVhbnMgdG8gcHV0IGN1c3RvbSBjb2RlCgkgICAgaW50byB0aGUgd3JhcHBlciBmaWxlIGJlZm9yZSBhbnl0aGluZyBlbHNlIHRoYXQgU1dJRyBnZW5lcmF0ZXMuCgoyMDA5LTAyLTE3OiB3c2Z1bHRvbgoJICAgICdtYWtlIGNsZWFuLXRlc3Qtc3VpdGUnIHdpbGwgbm93IHJ1biBjbGVhbiBvbiBBTEwgbGFuZ3VhZ2VzLiBQcmV2aW91c2x5IGl0IG9ubHkKCSAgICByYW4gdGhlIGNvcnJlY3RseSBjb25maWd1cmVkIGxhbmd1YWdlcy4gVGhpcyB3YXkgaXQgaXMgbm93IHBvc3NpYmxlIHRvIGNsZWFuIHVwCgkgICAgcHJvcGVybHkgYWZ0ZXIgcnVubmluZyAnbWFrZSBwYXJ0aWFsY2hlY2stdGVzdC1zdWl0ZScuCgoyMDA5LTAyLTE0OiB3c2Z1bHRvbgoJICAgIEV4dGVuZCBhdHRyaWJ1dGUgbGlicmFyeSBzdXBwb3J0IGZvciBzdHJ1Y3RzL2NsYXNzZXMgYW5kIHRoZSBhY2Nlc3NvciBmdW5jdGlvbnMgdXNlCgkgICAgcGFzcy9yZXR1cm4gYnkgdmFsdWUgc2VtYW50aWNzLiBUd28gbmV3IG1hY3JvcyBhcmUgYXZhaWxhYmxlIGFuZCB1c2FnZSBpcyBpZGVudGljYWwKCSAgICB0byAlYXR0cmlidXRlLiBUaGVzZSBhcmUgJWF0dHJpYnV0ZXZhbCBmb3Igc3RydWN0cy9jbGFzc2VzIGFuZCAlYXR0cmlidXRlc3RyaW5nIGZvcgoJICAgIHN0cmluZyBjbGFzc2VzLCBsaWtlIHN0ZDo6c3RyaW5nLiBTZWUgYXR0cmlidXRlLnN3ZyBmb3IgbW9yZSBkZXRhaWxzLgoKMjAwOS0wMi0xMzogd3NmdWx0b24KCSAgICBBZGQgc3VwcG9ydCBmb3IgJWV4dGVuZCBhbmQgbWVtYmVyaW4gdHlwZW1hcHMuIFByZXZpb3VzbHkgdGhlIG1lbWJlcmluIHR5cGVtYXBzIHdlcmUKCSAgICBpZ25vcmVkIGZvciBtZW1iZXIgdmFyaWFibGVzIHdpdGhpbiBhICVleHRlbmQgYmxvY2suCgoyMDA5LTAyLTEyOiB3c2Z1bHRvbgoJICAgIFJlbW92ZSB1bm5lY2Vzc2FyeSB0ZW1wb3JhcnkgdmFyaWFibGUgd2hlbiB3cmFwcGluZyByZXR1cm4gdmFsdWVzIHRoYXQgYXJlIHJlZmVyZW5jZXMuIAoJICAgIEV4YW1wbGUgb2YgZ2VuZXJhdGVkIGNvZGUgZm9yIHdyYXBwaW5nOgoKCSAgICAgIHN0cnVjdCBYWVogewoJCXN0ZDo6c3RyaW5nJiByZWZSZXR1cm4oKTsKCSAgICAgIH07CgoJICAgIHVzZWQgdG8gYmU6CgogICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpyZXN1bHQgPSAwIDsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmX3Jlc3VsdF9yZWYgPSAoYXJnMSktPnJlZlJldHVybigpOwogICAgICAgICAgICAgICAgcmVzdWx0ID0gKHN0ZDo6c3RyaW5nICopICZfcmVzdWx0X3JlZjsKICAgICAgICAgICAgICB9CgoJICAgICBOb3cgaXQgaXM6CgogICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpyZXN1bHQgPSAwIDsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICByZXN1bHQgPSAoc3RkOjpzdHJpbmcgKikgJihhcmcxKS0+cmVmUmV0dXJuKCk7CgoyMDA5LTAyLTA4OiBiaHkKICAgICAgICAgICAgQ2hhbmdlIHRoZSBTSVpFIG1hcHBlZCBieSAlcHlidWZmZXJfbXV0YWJsZV9iaW5hcnkgYW5kICVweWJ1ZmZlcl9iaW5hcnkgaW4gcHlidWZmZXIuaSBmcm9tCiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciB0byB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBidWZmZXIuCgoyMDA5LTAyLTA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJWZlYXR1cmUgbm90IHdvcmtpbmcgZm9yIGNvbnZlcnNpb24gb3BlcmF0b3JzLCByZXBvcnRlZCBieSBNYXR0IFNwcmFndWUsIGZvciBleGFtcGxlOgoJICAgICAgJWZlYXR1cmUoImNzOm1ldGhvZG1vZGlmaWVycyIpIG9wZXJhdG9yIGJvb2wgInByb3RlY3RlZCI7CgoyMDA5LTAyLTA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbTXpTY2hlbWVdIEFwcGx5ICMyMDgxOTY3IGNvbmZpZ3VyZSBjaGFuZ2VzIGZvciBleGFtcGxlcyB0byBidWlsZCB3aXRoIHJlY2VudCBQTFQgdmVyc2lvbnMuCgkgICAgQWxzbyBmaXhlcyBNYWtlZmlsZSBlcnJvcnMgYnVpbGRpbmcgU1dJRyBleGVjdXRhYmxlIHdoZW4gbXpzY2hlbWUgcGFja2FnZSBpcyBpbnN0YWxsZWQgCgkgICAgKHZlcnNpb24gMy43MiBhcHByb3ggYW5kIGxhdGVyKS4KCjIwMDktMDItMDQ6IHRhbGJ5CiAgICAgICAgICAgIFtQZXJsXSBGaXggU0YjMjU2NDE5MiByZXBvcnRlZCBieSBEYXZpZCBLb2xvdnJhdG5rLgogICAgICAgICAgICBTV0lHX0FzQ2hhclB0ckFuZFNpemUoKSBub3cgaGFuZGxlcyAiZ2V0IiBtYWdpYy4KClZlcnNpb24gMS4zLjM4ICgzMSBKYW51YXJ5IDIwMDkpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDA5LTAxLTMxOiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4IFNGIzI1NTI0ODggcmVwb3J0ZWQgYnkgR2FldGFuIExlaG1hbm4uIE5vdyAlcHl0aG9ucHJlcGVuZAogICAgICAgICAgICBhbmQgJXB5dGhvbmFwcGVuZCBoYXZlIGNvcnJlY3QgaW5kZW50YXRpb24uCgoyMDA5LTAxLTMxOiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4IFNGIzI1NTIwNDggcmVwb3J0ZWQgYnkgR2FldGFuIExlaG1hbm4uIFRoZSBwYXJhbWV0ZXIgbGlzdAogICAgICAgICAgICBvZiBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9uIGluIGdlbmVyYXRlZCBwcm94eSBjb2RlIHNob3VsZCBub3QgaGF2ZSB0aGUKICAgICAgICAgICAgJ3NlbGYnIHBhcmFtZXRlci4KCjIwMDktMDEtMjk6IHdzZnVsdG9uCgkgICAgRml4IHJlZ3Jlc3Npb24gaW50cm9kdWNlZCBpbiAxLjMuMzcgd2hlcmUgdGhlIGRlZmF1bHQgb3V0cHV0IGRpcmVjdG9yeQoJICAgIGZvciB0YXJnZXQgbGFuZ3VhZ2Ugc3BlY2lmaWMgZmlsZXMgKGluIHRoZSBhYnNlbmNlIG9mIC1vdXRkaXIpIHdhcyBubwoJICAgIGxvbmdlciB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGdlbmVyYXRlZCBjL2MrKyBmaWxlLgoKMjAwOS0wMS0yODogd3NmdWx0b24KCSAgICBbSmF2YSwgQyNdIEZpeCBwcm94eSBjbGFzcyBub3QgYmVpbmcgdXNlZCB3aGVuIHRoZSBnbG9iYWwgc2NvcGUgb3BlcmF0b3IKCSAgICB3YXMgdXNlZCBmb3IgcGFyYW1ldGVycyBwYXNzZWQgYnkgdmFsdWUuIFJlcG9ydGVkIGJ5IERhdmlkIFBpZXBncmFzcy4KCjIwMDktMDEtMTU6IHdzZnVsdG9uCgkgICAgW1BlcmxdIEZpeCBzZWcgZmF1bHQgd2hlbiBydW5uaW5nIHdpdGggLXYgb3B0aW9uLCByZXBvcnRlZCBieSBKb2huIEt5LgoKVmVyc2lvbiAxLjMuMzcgKDEzIEphbnVhcnkgMjAwOSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMDktMDEtMTM6IG1nb3NzYWdlCgkgICAgW0x1YV0gQWRkZWQgY29udHJhY3Qgc3VwcG9ydCBmb3IgcmVxdWlyaW5nIHRoYXQgdW5zaWduZWQgbnVtYmVycyBhcmUgPj0wCgkgICAgUmV3cm90ZSBtdWNoIG9mIEV4YW1wbGVzL0x1YS9lbWJlZDMuIAoJICAgIEFkZGVkIGEgbG90IHRvIHRoZSBMdWEgZG9jdW1lbnRhdGlvbi4KCjIwMDktMDEtMTM6IHdzZnVsdG9uCgkgICAgRml4IGNvbXBpbGF0aW9uIGVycm9yIHdoZW4gdXNpbmcgZGlyZWN0b3JzIG9uIHByb3RlY3RlZCB2aXJ0dWFsIG92ZXJsb2FkZWQgCgkgICAgbWV0aG9kcyByZXBvcnRlZCBieSBTYW0gSGVuZGxleS4KCjIwMDktMDEtMTI6IGRyam9lCiAgICAgICAgICAgIFtSXSBGaXhlZCBoYW5kbGluZyBvZiBpbnRlZ2VyIGFycmF5cwoKMjAwOS0wMS0xMDogZHJqb2UKCSAgICBbUl0gRml4IGludGVnZXIgaGFuZGxpbmcgaW4gciB0byBkZWFsIGNvcnJlY3RseSB3aXRoIHNpZ25lZAoJICAgIGFuZCB1bnNpZ25lZCBpc3N1ZXMKCjIwMDktMDEtMTA6IHdzZnVsdG9uCgkgICAgUGF0Y2ggICMxOTkyNzU2IGZyb20gQ29saW4gTWNEb25hbGQgLSAlY29udHJhY3Qgbm90IHdvcmtpbmcgZm9yIGNsYXNzZXMgCgkgICAgaW4gbmFtZXNwYWNlCgoyMDA5LTAxLTA1OiBvbGx5CgkgICAgTWFyayBTV0lHUEVSTDUsIFNXSUdQSFA1LCBhbmQgU1dJR1RDTDggYXMgZGVwcmVjYXRlZCBpbiB0aGUgc291cmNlCgkgICAgY29kZSBhbmQgcmVtb3ZlIGRvY3VtZW50YXRpb24gb2YgdGhlbS4KCjIwMDgtMTItMzA6IHdzZnVsdG9uCgkgICAgQnVnICMyNDMwNzU2LiBBbGwgdGhlIGxhbmd1YWdlcyBub3cgZGVmaW5lIGEgbWFjcm8gaW4gdGhlIGdlbmVyYXRlZCBDL0MrKwoJICAgIHdyYXBwZXIgZmlsZSBpbmRpY2F0aW5nIHdoaWNoIGxhbmd1YWdlIGlzIGJlaW5nIHdyYXBwZWQuIFRoZSBtYWNybyBuYW1lIGlzIHRoZQoJICAgIHNhbWUgYXMgdGhvc2UgZGVmaW5lZCB3aGVuIFNXSUcgaXMgcnVuLCBlZyBTV0lHSkFWQSwgU1dJR09DVEFWRSwgU1dJR0NTSEFSUCBldGMKCSAgICBhbmQgYXJlIGxpc3RlZCBpbiB0aGUgIkNvbmRpdGlvbmFsIENvbXBpbGF0aW9uIiBzZWN0aW9uIGluIHRoZSBkb2N1bWVudGF0aW9uLgoKMjAwOC0xMi0yMzogd3NmdWx0b24KCSAgICBbSmF2YV0gRml4ICMyMTUzNzczIC0gJW5vamF2YWV4Y2VwdGlvbiB3YXMgY2xlYXJpbmcgdGhlIGV4Y2VwdGlvbiBmZWF0dXJlCiAgICAgICAgICAgIGluc3RlYWQgb2YgZGlzYWJsaW5nIGl0LiBDbGVhcmluZyBjaGVja2VkIEphdmEgZXhjZXB0aW9ucyBhbHNvIGRpZG4ndCB3b3JrLiAKCSAgICBUaGUgbmV3ICVjbGVhcmphdmFleGNlcHRpb24gY2FuIGJlIHVzZWQgZm9yIGNsZWFyaW5nIHRoZSBleGNlcHRpb24gZmVhdHVyZS4KCjIwMDgtMTItMjI6IHdzZnVsdG9uCgkgICAgRml4ICMyNDMyODAxIC0gTWFrZSBTd2lnVmFsdWVXcmFwcGVyIGV4Y2VwdGlvbiBzYWZlIGZvciB3aGVuIGNvcHkgY29uc3RydWN0b3JzCgkgICAgdGhyb3cgZXhjZXB0aW9ucy4KCjIwMDgtMTItMjE6IHdzZnVsdG9uCgkgICAgQXBwbHkgcGF0Y2ggIzI0NDAwNDYgd2hpY2ggZml4ZXMgcG9zc2libGUgc2VnIGZhdWx0cyBmb3IgbWVtYmVyIGFuZCBnbG9iYWwKCSAgICB2YXJpYWJsZSBjaGFyIGFycmF5cyB3aGVuIHRoZSBzdHJpbmdzIGFyZSBsYXJnZXIgdGhhbiB0aGUgc3RyaW5nIGFycmF5IHNpemUuCgoyMDA4LTEyLTIwOiB3c2Z1bHRvbgoJICAgIFRoZSBjY2FjaGUgY29tcGlsZXIgY2FjaGUgaGFzIGJlZW4gYWRhcHRlZCB0byB3b3JrIHdpdGggU1dJRyBhbmQKCSAgICBuYW1lZCBjY2FjaGUtc3dpZy4gSXQgbm93IHdvcmtzIHdpdGggQy9DKysgY29tcGlsZXJzIGFzIHdlbGwgYXMgU1dJRwoJICAgIGFuZCBjYW4gcmVzdWx0IGluIGltcHJlc3NpdmUgc3BlZWR1cHMgd2hlbiB1c2VkIHRvIHJlY29tcGlsZSB1bmNoYW5nZWQKCSAgICBjb2RlIHdpdGggZWl0aGVyIGEgQy9DKysgY29tcGlsZXIgb3IgU1dJRy4gRG9jdW1lbnRhdGlvbiBpcyBpbiBDQ2FjaGUuaHRtbAoJICAgIG9yIHRoZSBpbnN0YWxsZWQgY2NhY2hlLXN3aWcgbWFuIHBhZ2UuCgoyMDA4LTEyLTEyOiB3c2Z1bHRvbgoJICAgIEFwcGx5IHBhdGNoIGZyb20gS2FseWFub3YgRG1pdHJ5IHdoaWNoIGZpeGVzIHBhcnNpbmcgb2YgbmVzdGVkIHN0cnVjdHMKCSAgICBjb250YWluaW5nIGNvbW1lbnRzLgoKMjAwOC0xMi0xMjogd3NmdWx0b24KCSAgICBGaXggZXJyb3IgbWVzc2FnZSBpbiBzb21lIG5lc3RlZCBzdHJ1Y3QgYW5kICVpbmxpbmUgcGFyc2luZyBlcnJvciBzaXR1YXRpb25zCgkgICAgc3VjaCBhcyB1bnRlcm1pbmF0ZWQgc3RyaW5ncyBhbmQgY29tbWVudHMuCgoyMDA4LTEyLTA3OiBvbGx5CgkgICAgW1BIUF0gRml4IHdhcm5pbmdzIHdoZW4gY29tcGlsaW5nIGdlbmVyYXRlZCB3cmFwcGVyIHdpdGggR0NDIDQuMy4KCjIwMDgtMTItMDY6IHdzZnVsdG9uCgkgICAgW1BIUF0gRGVwcmVjYXRlICVwcmFnbWEocGhwNCkuIFBsZWFzZSB1c2UgJXByYWdtYShwaHApIGluc3RlYWQuCgkgICAgVGhlIGZvbGxvd2luZyB0d28gd2FybmluZ3MgaGF2ZSBiZWVuIHJlbmFtZWQ6CgkgICAgV0FSTl9QSFA0X01VTFRJUExFX0lOSEVSSVRBTkNFIC0+IFdBUk5fUEhQX01VTFRJUExFX0lOSEVSSVRBTkNFCgkgICAgV0FSTl9QSFA0X1VOS05PV05fUFJBR01BICAgICAgIC0+IFdBUk5fUEhQX1VOS05PV05fUFJBR01BCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMDgtMTItMDQ6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBBcHBsaWVkIHBhdGNoIFNGIzIxNTg5Mzg6IGFsbCB0aGUgU1dJRyBzeW1ib2wgbmFtZXMgc3RhcnRlZCB3aXRoIFB5CiAgICAgICAgICAgIGFyZSBjaGFuZ2VkLCBzaW5jZSB0aGV5IGFyZSBpbmFwcHJvcHJpYXRlIGFuZCBkaXNjb3VyYWdlZCBpbiBQeXRob24KICAgICAgICAgICAgZG9jdW1lbnRhdGlvbiAoZnJvbSBodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jLzIuNS4yL2FwaS9pbmNsdWRlcy5odG1sKToKCiAgICAgICAgICAgICJBbGwgdXNlciB2aXNpYmxlIG5hbWVzIGRlZmluZWQgYnkgUHl0aG9uLmggKGV4Y2VwdCB0aG9zZSBkZWZpbmVkIGJ5CiAgICAgICAgICAgIHRoZSBpbmNsdWRlZCBzdGFuZGFyZCBoZWFkZXJzKSBoYXZlIG9uZSBvZiB0aGUgcHJlZml4ZXMgIlB5IiBvciAiX1B5Ii4KICAgICAgICAgICAgTmFtZXMgYmVnaW5uaW5nIHdpdGggIl9QeSIgYXJlIGZvciBpbnRlcm5hbCB1c2UgYnkgdGhlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbgogICAgICAgICAgICBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGV4dGVuc2lvbiB3cml0ZXJzLiBTdHJ1Y3R1cmUgbWVtYmVyIG5hbWVzIGRvCiAgICAgICAgICAgIG5vdCBoYXZlIGEgcmVzZXJ2ZWQgcHJlZml4LgoKICAgICAgICAgICAgSW1wb3J0YW50OiB1c2VyIGNvZGUgc2hvdWxkIG5ldmVyIGRlZmluZSBuYW1lcyB0aGF0IGJlZ2luIHdpdGggIlB5IiBvciAiX1B5Ii4KICAgICAgICAgICAgVGhpcyBjb25mdXNlcyB0aGUgcmVhZGVyLCBhbmQgamVvcGFyZGl6ZXMgdGhlIHBvcnRhYmlsaXR5IG9mIHRoZSB1c2VyCiAgICAgICAgICAgIGNvZGUgdG8gZnV0dXJlIFB5dGhvbiB2ZXJzaW9ucywgd2hpY2ggbWF5IGRlZmluZSBhZGRpdGlvbmFsIG5hbWVzIGJlZ2lubmluZwogICAgICAgICAgICB3aXRoIG9uZSBvZiB0aGVzZSBwcmVmaXhlcy4iCgogICAgICAgICAgICBIZXJlIGlzIGEgYnJpZWYgbGlzdCBvZiB3aGF0IGNoYW5nZWQ6CgogICAgICAgICAgICAgICAgUHlTd2lnKiAtPiBTd2lnUHkqCiAgICAgICAgICAgICAgICBQeU9iamVjdF9wdHIgLT4gU3dpZ1B0cl9QeU9iamVjdAogICAgICAgICAgICAgICAgUHlPYmplY3RfdmFyIC0+IFN3aWdWYXJfUHlPYmplY3QKICAgICAgICAgICAgICAgIFB5U2VxdWVuY2VfQmFzZSwgUHlTZXF1ZW5jZV9Db250LCBQeVNlcXVlbmNlX1JlZiAtPgogICAgICAgICAgICAgICAgICAgICAgICBTd2lnUHlTZXF1ZW5jZV9CYXNlLCBTd2lnUHlTZXF1ZW5jZV9Db250LCBTd2lnUHlTZXF1ZW5jZV9SZWYKICAgICAgICAgICAgICAgIFB5TWFwKiAtPiBTd2lnUHlNYXAqCgogICAgICAgICAgICBXZSBwcm92aWRlZCBhIHB5bmFtZV9jb21wYXQuaSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gVXNlcnMgd2hvc2UgY29kZSBoYXZpbmcKICAgICAgICAgICAgdGhlc2Ugc3ltYm9scyBhbmQgZG8gbm90IHdhbnQgdG8gY2hhbmdlIGl0IGNvdWxkIHNpbXBseSBpbmNsdWRlIHRoaXMgZmlsZQogICAgICAgICAgICBhdCBmcm9udCBvZiB5b3VyIGNvZGUuIEEgYmV0dGVyIHNvbHV0aW9uIGlzIHRvIHJ1biB0aGUgY29udmVydGluZyB0b29sIG9uCiAgICAgICAgICAgIHlvdXIgY29kZSwgd2hpY2ggaGFzIGJlZW4gcHV0IGluIFNXSUcncyBTVk4gdHJ1bmsgKFRvb2xzL3B5bmFtZV9wYXRjaC5weSkgYW5kCiAgICAgICAgICAgIHlvdSBjYW4gZG93bmxvYWQgaXQgaGVyZToKICAgICAgICAgICAgaHR0cHM6Ly9zd2lnLnN2bi5zb3VyY2Vmb3JnZS5uZXQvc3Zucm9vdC9zd2lnL3RydW5rL1Rvb2xzL3B5bmFtZV9wYXRjaC5weSAKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAwOC0xMi0wMjogd3NmdWx0b24KCSAgICBbUHl0aG9uXSBBcHBseSBwYXRjaCAjMjE0MzcyNyBmcm9tIFNlcmdlIE1vbmtld2l0eiB0byBmaXggaW1wb3J0aW5nIGJhc2UgY2xhc3NlcyAKCSAgICB3aGVuIHRoZSBwYWNrYWdlIG9wdGlvbiBpcyBzcGVjaWZpZWQgaW4gJW1vZHVsZSBhbmQgdGhhdCBtb2R1bGUgaXMgJWltcG9ydCdlZC4KCjIwMDgtMTEtMjg6IHdzZnVsdG9uCgkgICAgW1VUTF0gRml4ICMyMDgwNDk3LiBTb21lIGluY29ycmVjdCBhY2NlcHRhbmNlIG9mIHR5cGVzIGluIHRoZSBTVEwsIGVnIGEgZG91YmxlICogZWxlbWVudAoJICAgIHBhc3NlZCBpbnRvIGEgdmVjdG9yPGludCAqPiBjb25zdHJ1Y3RvciB3b3VsZCBiZSBhY2NlcHRlZCwgYnV0IHRoZSBlbnN1aW5nIGJlaGF2aW91cgoJICAgIHdhcyB1bmRlZmluZWQuIE5vdyB0aGUgdHlwZSBjb252ZXJzaW9uIGNvcnJlY3RseSByYWlzZXMgYW4gZXhjZXB0aW9uLgoKMjAwOC0xMS0yNDogd3NmdWx0b24KCSAgICBBZGQgLW91dGN1cnJlbnRkaXIgb3B0aW9uLiBUaGlzIHNldHMgdGhlIGRlZmF1bHQgb3V0cHV0IGRpcmVjdG9yeSB0byB0aGUgY3VycmVudCAKCSAgICBkaXJlY3RvcnkgaW5zdGVhZCBvZiB0aGUgcGF0aCBzcGVjaWZpZWQgYnkgdGhlIGlucHV0IGZpbGUuIFRoaXMgb3B0aW9uIGVuYWJsZXMKCSAgICBiZWhhdmlvdXIgc2ltaWxhciB0byBjL2MrKyBjb21waWxlcnMuIE5vdGUgdGhhdCB0aGlzIGNvbnRyb2xzIHRoZSBvdXRwdXQgZGlyZWN0b3J5LAoJICAgIGJ1dCBvbmx5IGluIHRoZSBhYnNlbmNlIG9mIHRoZSAtbyBhbmQvb3IgLW91dGRpciBvcHRpb25zLgoKMjAwOC0xMS0yMzogd3NmdWx0b24KCSAgICBbcnVieV0gQXBwbHkgcGF0Y2ggIzIyNjM4NTAgdG8gZml4IHJ1YnkvZmlsZS5pIC4uLiBydWJ5aW8uaCBmaWxlbmFtZSBjaGFuZ2UgaW4gCgkgICAgcnVieSAxLjkuCgoyMDA4LTExLTIzOiB3c2Z1bHRvbgoJICAgIEFwcGx5IHBhdGNoICMyMzE5NzkwIGZyb20gSm9oYW4gSGFrZSB0byBmaXggc2hhcmVkX3B0ciB1c2FnZSBpbiBzdGQ6OnRyMSBuYW1lc3BhY2UuCgoyMDA4LTExLTIxOiB3c2Z1bHRvbgoJICAgIFRoZSB1c2Ugb2YgdGhlIGluY2x1ZGUgcGF0aCB0byBmaW5kIHRoZSBpbnB1dCBmaWxlIGlzIG5vdyBkZXByZWNhdGVkLgoJICAgIFRoaXMgbWFrZXMgdGhlIGJlaGF2aW91ciBvZiBTV0lHIHRoZSBzYW1lIGFzIEMvQysrIGNvbXBpbGVycyBpbiBwcmVwYXJhdGlvbgoJICAgIGZvciB1c2Ugd2l0aCBjY2FjaGUuCgoyMDA4LTExLTE2OiB3c2Z1bHRvbgoJICAgIEZpeCAtbm9wcmVwcm9jZXNzIG9wdGlvbiB0bzoKCSAgICAtIGNvcnJlY3RseSByZXBvcnQgZmlsZSBuYW1lcyBpbiB3YXJuaW5nIGFuZCBlcnJvciBtZXNzYWdlcy4KCSAgICAtIHVzZSB0aGUgb3JpZ2luYWwgaW5wdXQgZmlsZW5hbWUgdGhhdCBjcmVhdGVkIHRoZSBwcmVwcm9jZXNzZWQgb3V0cHV0IHdoZW4gCgkgICAgICBkZXRlcm1pbmluZyB0aGUgQysrIHdyYXBwZXIgZmlsZSBuYW1lIChpbiB0aGUgYWJzZW5jZSBvZiAtbykuIFByZXZpb3VzbHkgCgkgICAgICB0aGUgbmFtZSBvZiB0aGUgaW5wdXQgZmlsZSBjb250YWluaW5nIHRoZSBwcmVwcm9jZXNzZWQgb3V0cHV0IHdhcyB1c2VkLgoKMjAwOC0xMS0xMTogd3NmdWx0b24KCSAgICBbSmF2YV0gQWRkIHBhdGNoICMyMTUyNjkxIGZyb20gTUFUU1VVUkEgVGFrYW5vcmkgd2hpY2ggZml4ZXMgY29tcGlsZXMgdXNpbmcgdGhlCgkgICAgSW50ZWwgY29tcGlsZXIKCjIwMDgtMTEtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBwYXRjaCAjMjEyODI0OSBmcm9tIEFuYXRvbHkgVGVjaHRvbmlrIHdoaWNoIGNvcnJlY3RzIHRoZSBDL0MrKyBwcm94eQogICAgICAgICAgICBjbGFzcyBiZWluZyByZXBvcnRlZCBmb3IgUHl0aG9uIGRvY3N0cmluZ3Mgd2hlbiAlcmVuYW1lIGlzIHVzZWQuCgoyMDA4LTExLTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgdGhlIHN0cmlwIGVuY29kZXIgcGF0Y2ggZnJvbSBBbmF0b2x5IFRlY2h0b25payAjMjEzMDAxNi4gVGhpcyBlbmFibGVzIGFuIAogICAgICAgICAgICBlYXN5IHdheSB0byByZW5hbWUgc3ltYm9scyBieSBzdHJpcHBpbmcgYSBjb21tb25seSB1c2VkIHByZWZpeCBpbiBhbGwgdGhlCiAgICAgICAgICAgIGZ1bmN0aW9uL3N0cnVjdCBuYW1lcy4gSXQgd29ya3MgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZSBvdGhlciBlbmNvZGVycywgc3VjaCBhcwogICAgICAgICAgICB0aXRsZSwgbG93ZXIsIGNvbW1hbmQgZXRjIG91dGxpbmVkIGluIENIQU5HRVMgZmlsZSBkYXRlZCAxMi8zMC8yMDA1LiBFeGFtcGxlCiAgICAgICAgICAgIGJlbG93IHdpbGwgcmVuYW1lIHd4QW5vdGhlcldpZGdldCB0byBBbm90aGVyV2lkZ2V0IGFuZCB3eERvU29tZXRoaW5nIHRvIAogICAgICAgICAgICBEb1NvbWV0aGluZzoKCiAgICAgICAgICAgICAgJXJlbmFtZSgiJShzdHJpcDpbd3hdKXMiKSAiIjsgCgogICAgICAgICAgICAgIHN0cnVjdCB3eEFub3RoZXJXaWRnZXQgewogICAgICAgICAgICAgICAgICB2b2lkIHd4RG9Tb21ldGhpbmcoKTsKICAgICAgICAgICAgICB9OwoKMjAwOC0wOS0yNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIExvdHMgb2YgdGVzdC1zdWl0ZSB3b3JrLgoJICAgIC0gRml4IG9yZGVyaW5nIG9mIHdyYXBwZXIgb3V0cHV0IGFuZCAleyAlfSBoZWFkZXIgb3V0cHV0LgoJICAgIC0gRml4IGRlY2xhcmF0aW9ucyBvZiBsb2NhbCB2YXJzIGluIEMgd3JhcHBlcnMuCgkgICAgLSBGaXggZGVjbGFyYXRpb24gb2YgZGVmaW5lZCBjb25zdGFudHMgaW4gQyB3cmFwcGVycy4KCSAgICAtIEZpeCBkZWNsYXJhdGlvbiBvZiBFbnVtVmFsdWVzIGluIEMgd3JhcHBlcnMuCgkgICAgLSBhZGQgc29tZSBjb25zdCB0eXBlbWFwcyB0byBhbGxlZ3JvY2wuc3dnCgkgICAgLSBhZGQgcmVuYW1lIGZvciBvcGVyYXRvciBib29sKCkgb3ZlcmxvYWRzLgoJCjIwMDgtMDktMjU6IG9sbHkKCSAgICBbUEhQNV0gRmlsbCBpbiB0eXBlbWFwcyBmb3IgU1dJR1RZUEUgYW5kIHZvaWQgKiAoU0YjMjA5NTE4NikuCgoyMDA4LTA5LTIyOiBtdXRhbmRpeiAoTWlrZWwgQmFuY3JvZnQpCgkgICAgW2FsbGVncm9jbF0KCSAgICAtIFN1cHBvcnQgd3JhcHBpbmcgb2YgdHlwZXMgd2hvc2UgZGVmaW5pdGlvbnMgYXJlIG5vdCBzZWVuIGJ5CgkgICAgU1dJRy4gVGhleSBhcmUgdHJlYXRlZCBhcyBmb3J3YXJkLXJlZmVyZW5jZWQgY2xhc3NlcyBhbmQgaWYgYQoJICAgIGRlZmluaXRpb24gaXMgbm90IHNlZW4gYXJlIHRyZWF0ZWQgYXMgKCogOnZvaWQpLgoJICAgIC0gRG9uJ3Qgd3JhcCB0aGUgY29udGVudHMgb2YgdW5uYW1lZCBuYW1lc3BhY2VzLgoJICAgIC0gTW9yZSBjb2RlIGNsZWFudXAuIFJlbW92ZWQgc29tZSBleHRyYW5lb3VzIHdhcm5pbmdzLgoJICAgIC0gc3RhcnQgd29yayBvbiBoYXZpbmcgdGhlIGFsbGVncm9jbCBtb2QgcGFzcyB0aGUgY3BwIHRlc3Qtc3VpdGUuCgoyMDA4LTA5LTE5OiBvbGx5CgkgICAgW1BIUDVdIEFkZCB0eXBlbWFwcyBmb3IgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcuCgoyMDA4LTA5LTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFkZGVkIEMjIGFycmF5IHR5cGVtYXBzIHByb3ZpZGVkIGJ5IEFudHRpIEthcmFudGEuCiAgICAgICAgICAgIFRoZSBhcnJheXMgcHJvdmlkZSBhIHdheSB0byB1c2UgTWFyc2hhbEFzKFVubWFuYWdlZFR5cGUuTFBBcnJheSkKICAgICAgICAgICAgYW5kIHBpbm5pbmcgdGhlIGFycmF5IHVzaW5nICdmaXhlZCcuIFNlZSBhcnJheXNfY3NoYXJwLmkgbGlicmFyeSBmaWxlCiAgICAgICAgICAgIGZvciBkZXRhaWxzLgoKMjAwOC0wOS0xODogd3NmdWx0b24KCSAgICBEb2N1bWVudCB0aGUgb3B0aW9uYWwgbW9kdWxlIGF0dHJpYnV0ZSBpbiB0aGUgJWltcG9ydCBkaXJlY3RpdmUsCiAgICAgICAgICAgIHNlZSBNb2R1bGVzLmh0bWwuIEFkZCBhIHdhcm5pbmcgZm9yIFB5dGhvbiB3cmFwcGVycyB3aGVuIHRoZQogICAgICAgICAgICBtb2R1bGUgbmFtZSBmb3IgYW4gaW1wb3J0ZWQgYmFzZSBjbGFzcyBpcyBtaXNzaW5nLCByZXF1aXJpbmcgdGhlCiAgICAgICAgICAgIG1vZHVsZSBhdHRyaWJ1dGUgdG8gYmUgYWRkZWQgdG8gJWltcG9ydCwgZWcgCgogICAgICAgICAgICAgICVpbXBvcnQobW9kdWxlPSJGb29Nb2R1bGUiKSBmb28uaAoKMjAwOC0wOS0xODogb2xseQoJICAgIFtQSFA1XSBDaGFuZ2UgdGhlIGRlZmF1bHQgaW5wdXQgdHlwZW1hcCBmb3IgY2hhciAqIHRvIHR1cm4gUEhQCgkgICAgTnVsbCBpbnRvIEMgTlVMTCAocHJldmlvdXNseSBpdCB3YXMgY29udmVydGVkIHRvIGFuIGVtcHR5IHN0cmluZykuCgkgICAgVGhlIG5ldyBiZWhhdmlvdXIgaXMgY29uc2lzdGVudCB3aXRoIGhvdyB0aGUgY29ycmVzcG9uZGluZyBvdXRwdXQKCSAgICB0eXBlbWFwIHdvcmtzIChTRiMyMDI1NzE5KS4KCgkgICAgSWYgeW91IHdhbnQgdG8ga2VlcCB0aGUgb2xkIGJlaGF2aW91ciwgYWRkIHRoZSBmb2xsb3dpbmcgdHlwZW1hcAoJICAgIHRvIHlvdXIgaW50ZXJmYWNlIGZpbGUgKFBIUCdzIGNvbnZlcnRfdG9fc3RyaW5nX2V4KCkgZnVuY3Rpb24gZG9lcwoJICAgIHRoZSBjb252ZXJ0aW5nIGZyb20gUEhQIE51bGwgdG8gYW4gZW1wdHkgc3RyaW5nKToKCgkgICAgJXR5cGVtYXAoaW4pIGNoYXIgKiB7CgkJY29udmVydF90b19zdHJpbmdfZXgoJGlucHV0KTsKCQkkMSA9IFpfU1RSVkFMX1BQKCRpbnB1dCk7CgkgICAgfQoKMjAwOC0wOS0xODogb2xseQoJICAgIFtQSFA1XSBGaXggZXh0cmEgY29kZSBhZGRlZCB0byBwcm94eSBjbGFzcyBjb25zdHJ1Y3RvcnMgaW4gdGhlIGNhc2UKCSAgICB3aGVyZSB0aGUgb25seSBjb25zdHJ1Y3RvciB0YWtlcyBubyBhcmd1bWVudHMuCgoyMDA4LTA5LTE4OiBvbGx5CgkgICAgW1BIUDVdIEZpeCB3cmFwcGluZyBvZiBhIHJlbmFtZWQgZW51bWVyYXRlZCB2YWx1ZSBvZiBhbiBlbnVtIGNsYXNzCgkgICAgbWVtYmVyIChTRiMyMDk1MjczKS4KCjIwMDgtMDktMTc6IG11dGFuZGl6IChNaWtlbCBCYW5jcm9mdCkKCSAgICBbYWxsZWdyb2NsXQoJICAgIC0gRml4IGhvdyBmb3J3YXJkIHJlZmVyZW5jZSB0eXBlZGVmcyBhcmUgaGFuZGxlZCwgc28gYXMgbm90IHRvIGNvbmZsaWN0CgkgICAgd2l0aCBvdGhlciBsZWdpdCB0eXBlZGVmcy4KCSAgICAtIERvbid0IChmb3Igbm93KSBwZXJmb3JtIGFuIGZmaXR5cGUgdHlwZW1hcCBsb29rdXAgd2hlbiB0cnlpbmcgdG8KCSAgICB3aGVuIGNhbGxpbmcgY29tcG9zZV9mb3JlaWduX3R5cGUoKS4gVGhpcyBpcyBhY3R1YWxseSBhIHVzZWZ1bCB0aGluZwoJICAgIHRvIGRvIGluIGNlcnRhaW4gY2FzZXMsIHRoZSB0ZXN0IGNhc2VzIGZvciB3aGljaCBJIGNhbid0IGN1cnJlbnRseQoJICAgIGxvY2F0ZSA6Ly4gSXQncyBicmVha2luZyBzb21lIHdyYXBwaW5nIGJlaGF2aW9yIHRoYXQgaXMgbW9yZSBjb21tb25seQoJICAgIHNlZW4sIGhvd2V2ZXIuIEknbGwgcmVhZGQgaW4gYSBtb3JlIGFwcHJvcHJpYXRlIHdheSB3aGVuIEkgY2FuCgkgICAgcmVjcmVhdGUgdGhlIG5lZWRlZCB0ZXN0IGNhc2UsIG9yIGEgdXNlciBjb21wbGFpbnMgKHdoaWNoIG1lYW5zCgkgICAgdGhleSBwcm9iYWJseSBoYXZlIGEgdGVzdCBjYXNlKS4KCSAgICAtIGRvY3VtZW50IHRoZSAtaXNvbGF0ZSBjb21tYW5kLWxpbmUgYXJnIGluIHRoZSAnc3dpZyAtaGVscCcgb3V0cHV0LgoJICAgIEl0IHdhcyBpbiB0aGUgaHRtbCBkb2NzLCBidXQgbm90IHRoZXJlLgoJICAgIC0gc21hbGwgYW1vdW50IG9mIGNvZGUgY2xlYW51cCwgcmVtb3ZlZCBzb21lIHVudXNlZCBjb2RlLgoJICAgIC0gc29tZSBtaW5vciBhZXN0aGV0aWMgY2hhbmdlcy4KCjIwMDgtMDktMTI6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBQeXRob24gMy4wIHN1cHBvcnQgYnJhbmNoIG1lcmdlZCBpbnRvIFNXSUcgdHJ1bmsuIFRoYW5rcyB0bwogICAgICAgICAgICBHb29nbGUgU3VtbWVyIG9mIENvZGUgMjAwOCBmb3Igc3VwcG9ydGluZyB0aGlzIHByb2plY3QhIEJ5IGRlZmF1bHQKICAgICAgICAgICAgU1dJRyB3aWxsIGdlbmVyYXRlIGludGVyZmFjZSBmaWxlcyBjb21wYXRpYmxlIHdpdGggYm90aCBQeXRob24gMi54CiAgICAgICAgICAgIGFuZCAzLjAuIEFuZCB0aGVyZSdzIGFsc28gc29tZSBQeXRob24gMyBuZXcgZmVhdHVyZXMgdGhhdCBjYW4gYmUKICAgICAgICAgICAgZW5hYmxlZCBieSBwYXNzaW5nIGEgIi1weTMiIGNvbW1hbmQgbGluZSBvcHRpb24gdG8gU1dJRy4gVGhlc2UKICAgICAgICAgICAgZmVhdHVyZXMgYXJlOgoKICAgICAgICAgICAgICAtIEZ1bmN0aW9uIGFubm90YXRpb24gc3VwcG9ydAogICAgICAgICAgICAgICAgICBBbHNvLCB0aGUgcGFyYW1ldGVyIGxpc3Qgb2YgcHJveHkgZnVuY3Rpb24gd2lsbCBiZSBnZW5lcmF0ZWQsCiAgICAgICAgICAgICAgICAgIGV2ZW4gd2l0aG91dCB0aGUgIi1weTMiIG9wdGlvbi4gSG93ZXZlciwgdGhlIHBhcmFtZXRlciBsaXN0CiAgICAgICAgICAgICAgICAgIHdpbGwgZmFsbGJhY2sgdG8gKmFyZ3MgaWYgdGhlIGZ1bmN0aW9uIChvciBtZXRob2QpIGlzIG92ZXJsb2FkZWQuCiAgICAgICAgICAgICAgLSBCdWZmZXIgaW50ZXJmYWNlIHN1cHBvcnQKICAgICAgICAgICAgICAtIEFic3RyYWN0IGJhc2UgY2xhc3Mgc3VwcG9ydAoKICAgICAgICAgICAgRm9yIGRldGFpbHMgb2YgUHl0aG9uIDMgc3VwcG9ydCBhbmQgdGhlc2UgZmVhdHVyZXMsIHBsZWFzZSBzZWUgdGhlCiAgICAgICAgICAgICJQeXRob24gMyBTdXBwb3J0IiBzZWN0aW9uIGluIHRoZSAiU1dJRyBhbmQgUHl0aG9uIiBjaGFwdGVyIG9mIHRoZSBTV0lHCiAgICAgICAgICAgIGRvY3VtZW50YXRpb24uCgogICAgICAgICAgICBUaGUgIi1hcHBseSIgY29tbWFuZCBsaW5lIG9wdGlvbiBhbmQgc3VwcG9ydCBvZiBnZW5lcmF0aW5nIGNvZGVzCiAgICAgICAgICAgIHVzaW5nIGFwcGx5KCkgaXMgcmVtb3ZlZC4gU2luY2UgdGhpcyBpcyBvbmx5IHJlcXVpcmVkIGJ5IHZlcnkgb2xkCiAgICAgICAgICAgIFB5dGhvbi4KCiAgICAgICAgICAgIFRoaXMgbWVyZ2UgYWxzbyBwYXRjaGVkIFNXSUcncyBwYXJzZXIgdG8gc29sdmUgYSBidWcuIEJ5IHRoaXMgcGF0Y2gsCiAgICAgICAgICAgIFNXSUcgZmVhdHVyZXMgYWJsZSB0byBiZSBjb3JyZWN0bHkgYXBwbGllZCBvbiBDKysgY29udmVyc2lvbiBvcGVyYXRvciwKICAgICAgICAgICAgc3VjaCBsaWtlIHRoaXM6CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgJWZlYXR1cmUoInNoYWRvdyIpICAqOjpvcGVyYXRvciBib29sICV7IC4uLiAlfQoKMjAwOC0wOS0wMjogcmljaGFyZGIKCSAgICBbUHl0aG9uXSBDb21taXQgcGF0Y2ggIzIwODkxNDk6IERpcmVjdG9yIGV4Y2VwdGlvbiBoYW5kbGluZyBtYW5nbGVzCgkgICAgcmV0dXJuZWQgZXhjZXB0aW9uLiAgRXhjZXB0aW9ucyByYWlzZWQgYnkgUHl0aG9uIGNvZGUgaW4gZGlyZWN0b3JzCgkgICAgYXJlIG5vdyBwYXNzZWQgdGhyb3VnaCB0byB0aGUgY2FsbGVyIHdpdGhvdXQgY2hhbmdlLiAgQWxzbywgcmVtb3ZlCgkgICAgdGhlICI6ICIgcHJlZml4IHdoaWNoIHVzZWQgdG8gYmUgYWRkZWQgdG8gb3RoZXIgZGlyZWN0b3IgZXhjZXB0aW9ucwoJICAgIChlZywgdGhvc2UgZHVlIHRvIGluY29ycmVjdCByZXR1cm4gdHlwZXMpLgoKMjAwOC0wOS0wMjogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQ29tbWl0IHBhdGNoICMxOTg4Mjk2IEdDSXRlbSBtdWx0aXBsZSBtb2R1bGUgbGlua2luZyBpc3N1ZSB3aGVuIHVzaW5nIAogICAgICAgICAgICBkaXJlY3RvcnMuCgoyMDA4LTA5LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFN1cHBvcnQgZm9yICd1c2luZycgYW5kICdmaXhlZCcgYmxvY2tzIGluIHRoZSAnY3NpbicgdHlwZW1hcCBpcyBub3cKICAgICAgICAgICAgcG9zc2libGUgdGhyb3VnaCB0aGUgdXNlIG9mIHRoZSBwcmUgYXR0cmlidXRlIGFuZCB0aGUgbmV3IHRlcm1pbmF0b3IgYXR0cmlidXRlLCBlZwoKICAgICAgICAgICAgICAldHlwZW1hcChjc2luLCAKICAgICAgICAgICAgICAgICAgICAgICBwcmU9IiAgICB1c2luZyAoQ0RhdGUgdGVtcCRjc2lucHV0ID0gbmV3IENEYXRlKCRjc2lucHV0KSkgeyIsCiAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYXRvcj0iICAgIH0gLy8gdGVybWluYXRlIHRlbXAkY3NpbnB1dCB1c2luZyBibG9jayIsCiAgICAgICAgICAgICAgICAgICAgICApIGNvbnN0IENEYXRlICYKICAgICAgICAgICAgICAgICAgICAgICAiJGNzY2xhc3NuYW1lLmdldENQdHIodGVtcCRjc2lucHV0KSIKCiAgICAgICAgICAgIFNlZSBDU2hhcnAuaHRtbCBmb3IgbW9yZSBpbmZvLgoKMjAwOC0wOS0wMTogd3NmdWx0b24KICAgICAgICAgICAgW0NGRkldIENvbW1pdCBwYXRjaCAjMjA3OTM4MSBzdWJtaXR0ZWQgYnkgQm9yaXMgU21pbGdhIC0gY29uc3RhbnQgZXhwcnMgcHV0IGludG8gCiAgICAgICAgICAgIG5vLWV2YWwgY29udGV4dCBpbiBERUZDRU5VTQoKMjAwOC0wOC0wMjogd3V6emViCiAgICAgICAgICAgIFtDaGlja2VuLEFsbGVncm9dIENvbW1pdCBQYXRjaCAyMDE5MzE0CiAgICAgICAgICAgIEZpeGVzIGEgYnVpbGQgZXJyb3IgaW4gY2hpY2tlbiwgYW5kIHNldmVyYWwgYnVpbGQgZXJyb3JzIGFuZCBvdGhlciBlcnJvcnMKICAgICAgICAgICAgaW4gQWxsZWdybyBDTAoKMjAwOC0wNy0xOTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGJ1aWxkaW5nIG9mIFRjbCBleGFtcGxlcy90ZXN0LXN1aXRlIG9uIE1hYyBPU1ggcmVwb3J0ZWQgYnkgR2lkZW9uIFNpbXBzb24uCgoyMDA4LTA3LTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggU0YgIzIwMTkxNTYgQ29uZmlndXJpbmcgd2l0aCAtLXdpdGhvdXQtb2N0YXZlIG9yIC0td2l0aG91dC1hbGxsYW5nCiAgICAgICAgICAgIGRpZCBub3QgZGlzYWJsZSBvY3RhdmUuCgoyMDA4LTA3LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEZpeCBkaXJlY3RvciB0eXBlbWFwcyBmb3IgcG9pbnRlcnMgc28gdGhhdCBOVUxMIHBvaW50ZXJzIGFyZSBjb3JyZWN0bHkgCiAgICAgICAgICAgIG1hcnNoYWxsZWQgdG8gQyMvSmF2YSBudWxsIGluIGRpcmVjdG9yIG1ldGhvZHMuCgoyMDA4LTA3LTA0OiBvbGx5CgkgICAgW1BIUF0gRm9yIHN0ZF92ZWN0b3IuaSBhbmQgc3RkX21hcC5pLCByZW5hbWUgZW1wdHkoKSB0byBpc19lbXB0eSgpCgkgICAgc2luY2UgImVtcHR5IiBpcyBhIFBIUCByZXNlcnZlZCB3b3JkLiAgQmFzZWQgb24gcGF0Y2ggZnJvbSBNYXJrIEtsZWluCgkgICAgaW4gU0YjMTk0MzQxNy4KCjIwMDgtMDctMDQ6IG9sbHkKCSAgICBbUEhQXSBUaGUgZGVwcmVjYXRlZCBjb21tYW5kIGxpbmUgb3B0aW9uICItbWFrZSIgaGFzIGJlZW4gcmVtb3ZlZC4gIAoJICAgIFNlYXJjaGVzIG9uIEdvb2dsZSBjb2Rlc2VhcmNoIHN1Z2dlc3QgdGhhdCBub2JvZHkgaXMgdXNpbmcgaXQgbm93CgkgICAgYW55d2F5LgoKMjAwOC0wNy0wNDogb2xseQoJICAgIFtQSFBdIFRoZSBTV0lHIGNkYXRhLmkgbGlicmFyeSBtb2R1bGUgaXMgbm93IHN1cHBvcnRlZC4KCjIwMDgtMDctMDM6IG9sbHkKCSAgICBbUEhQXSBUaGUgZGVwcmVjYXRlZCBjb21tYW5kIGxpbmUgb3B0aW9uICItcGhwZnVsbCIgaGFzIGJlZW4KCSAgICByZW1vdmVkLiAgV2UgcmVjb21tZW5kIGJ1aWxkaW5nIHlvdXIgZXh0ZW5zaW9uIGFzIGEgZHluYW1pY2FsbHkKCSAgICBsb2FkYWJsZSBtb2R1bGUuCgoyMDA4LTA3LTAyOiBvbGx5CgkgICAgW1BIUDRdIFN1cHBvcnQgZm9yIFBIUDQgaGFzIGJlZW4gcmVtb3ZlZC4gIFRoZSBQSFAgZGV2ZWxvcGVycyBhcmUKCSAgICBubyBsb25nZXIgbWFraW5nIG5ldyBQSFA0IHJlbGVhc2VzLCBhbmQgd29uJ3QgZXZlbiBiZSBwcm92aWRpbmcKCSAgICBwYXRjaGVzIGZvciBjcml0aWNhbCBzZWN1cml0eSBpc3N1ZXMgYWZ0ZXIgMjAwOC0wOC0wOC4KCjIwMDgtMDctMDI6IG9sbHkKCSAgICBbUHl0aG9uXSBJbXBvcnQgdGhlIEMgZXh0ZW5zaW9uIGRpZmZlcmVudGx5IGZvciBQeXRob24gMi42IGFuZAoJICAgIGxhdGVyIHNvIHRoYXQgYW4gaW1wbGljaXQgcmVsYXRpdmUgaW1wb3J0IGRvZXNuJ3QgcHJvZHVjZSBhCgkgICAgZGVwcmVjYXRpb24gd2FybmluZyBmb3IgMi42IGFuZCBhIGZhaWx1cmUgZm9yIDIuNyBhbmQgbGF0ZXIuCgkgICAgUGF0Y2ggZnJvbSBSaWNoYXJkIEJvdWx0b24gaW4gU0YjMjAwODIyOSwgcGx1cyBmb2xsb3ctdXAgcGF0Y2hlcwoJICAgIGZyb20gUmljaGFyZCBhbmQgSGFveXUgQmFpLgoKVmVyc2lvbiAxLjMuMzYgKDI0IEp1bmUgMjAwOCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjA2LzI0LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFJlbW92ZSBkZXByZWNhdGVkIC1jIGNvbW1hbmRsaW5lIG9wdGlvbiAocnVudGltZSBsaWJyYXJ5IGdlbmVyYXRpb24pLgoKMDYvMjQvMjAwODogb2xseQoJICAgIFtQSFBdIEZpeCBhc3NlcnRpb24gZmFpbHVyZSB3aGVuIGhhbmRsaW5nICV0eXBlbWFwKGluLG51bWlucHV0cz0wKQoJICAgICh0ZXN0Y2FzZSBpZ25vcmVfcGFyYW1ldGVyKS4KCjA2LzI0LzIwMDg6IG9sbHkKCSAgICBbUEhQXSBGaXggc2VnZmF1bHQgd2hlbiB3cmFwcGluZyBhIG5vbi1jbGFzcyBmdW5jdGlvbiBtYXJrZWQgd2l0aAoJICAgICVuZXdvYmplY3QgKHRlc3RjYXNlIGNoYXJfc3RyaW5ncykuCgowNi8yMi8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gQWRkIGEgd2F5IHRvIHVzZSBBdHRhY2hDdXJyZW50VGhyZWFkQXNEYWVtb24gaW5zdGVhZCBvZiBBdHRhY2hDdXJyZW50VGhyZWFkCiAgICAgICAgICAgIGluIGRpcmVjdG9yIGNvZGUuIERlZmluZSB0aGUgU1dJR19KQVZBX0FUVEFDSF9DVVJSRU5UX1RIUkVBRF9BU19EQUVNT04gbWFjcm8sIHNlZQogICAgICAgICAgICBMaWIvamF2YS9kaXJlY3Rvci5zd2cuCgowNi8yMS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gRml4IGNyYXNoaW5nIGluIHRoZSBTVEwgd3JhcHBlcnMgKHJlamVjdCEgYW5kIGRlbGV0ZV9pZiBtZXRob2RzKQoKMDYvMTkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBDIyBhbmQgSmF2YSBrZXl3b3JkcyB3aWxsIGJlIHJlbmFtZWQgaW5zdGVhZCBvZiBqdXN0IGlzc3VpbmcgYSB3YXJuaW5nCiAgICAgICAgICAgIGFuZCB0aGVuIGdlbmVyYXRpbmcgdW5jb21waWxlYWJsZSBjb2RlLiBXYXJuaW5nIDMxNCBnaXZlcyB0aGUgbmV3IG5hbWUgd2hlbiBhIAogICAgICAgICAgICBrZXl3b3JkIGlzIGZvdW5kLgoKMDYvMTkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1JdIEtleXdvcmQgaGFuZGxpbmcgYWRkZWQuIFIgS2V5d29yZHMgd2lsbCBiZSByZW5hbWVkIGFzIG5lY2Vzc2FyeS4KICAgICAgICAgICAgV2FybmluZyAzMTQgZ2l2ZXMgdGhlIG5ldyBuYW1lIHdoZW4gYSBrZXl3b3JkIGlzIGZvdW5kLgoKMDYvMTcvMjAwODogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gQWRkZWQgbWlzc2luZyBzdXBwb3J0IGZvciBib29sJiBhbmQgYm9vbCouIEFkZGVkIHJ1bnRlc3QgZm9yIGxpX3R5cGVtYXBzIHRlc3RjYXNlLgogICAgICAgICAgICAoQnVnICMxOTM4MTQyKQoKMDYvMDcvMjAwODogYmh5CiAgICAgICAgICAgIEFkZGVkIHRlc3QgY2FzZSBrZXl3b3JkX3JlbmFtZSwgdGhlbiBtYWRlIHRoZSBrZXl3b3JkIHJlbmFtaW5nIHdvcmtzIHByb3Blcmx5CiAgICAgICAgICAgIGJ5IGZpeGluZyBTd2lnX25hbWVfbWFrZSgpIGZvciBhIGluY29tcGxldGUgY29uZGl0aW9uIGNoZWNraW5nLgoKMDYvMDIvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXggZW51bSB3cmFwcGVycyB3aGVuIHVzaW5nIC1ub3Byb3h5LgoKMDUvMzAvMjAwODogYmh5CiAgICAgICAgICAgIEFkZGVkIHN0ZDo6d3N0cmluZyBpbnRvIExpYi90eXBlbWFwcy9wcmltdHlwZXMuc3dnLCBzaW5jZSBpdCBpcyBhbHNvIGEgcHJpbWl0aXZlIAogICAgICAgICAgICB0eXBlIGluIFNXSUcgLSBmaXhlZCBTRiAjMTk3Njk3OC4KCjA1LzI5LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gRml4IHZhcmlhYmxlIHdyYXBwZXJzIHdoZW4gdXNpbmcgLW5vcHJveHkuCgowNS8yOS8yMDA4OiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4ZWQgYSB0eXBvIG9mICUjaWZkZWYgaW4gTGliL3B5dGhvbi9weWNvbnRhaW5lci5zd2csIHdoaWNoIGlzIHJlbGF0ZWQgCiAgICAgICAgICAgIHRvIC1leHRyYW5hdGl2ZSBTV0lHIG9wdGlvbiAtIFNGICMxOTcxOTc3LgoKMDUvMjAvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgTmV3IHBhcnRpYWxjaGVjayBtYWtlZmlsZSB0YXJnZXRzIGZvciBwYXJ0aWFsIHRlc3Rpbmcgb2YgdGhlIHRlc3Qtc3VpdGUuIFRoZXNlCiAgICAgICAgICAgIGp1c3QgaW52b2tlIFNXSUcsIGllIG5vIGNvbXBpbGF0aW9uIGFuZCBubyBydW50aW1lIHRlc3RpbmcuIEl0IGNhbiBiZSBmYXN0ZXIKICAgICAgICAgICAgd2hlbiBkZXZlbG9waW5nIGJ5IGp1c3QgZG9pbmcgYSBkaXJlY3RvcnkgZGlmZiBvZiB0aGUgZmlsZXMgU1dJRyBnZW5lcmF0ZXMKICAgICAgICAgICAgYWdhaW5zdCB0aG9zZSBmcm9tIGEgcHJldmlvdXMgcnVuLiBFeGFtcGxlIHVzYWdlIGZyb20gdGhlIHRvcCBsZXZlbCBkaXJlY3Rvcnk6CgogICAgICAgICAgICAgIG1ha2UgcGFydGlhbGNoZWNrLXRlc3Qtc3VpdGUKICAgICAgICAgICAgICBtYWtlIHBhcnRpYWxjaGVjay1qYXZhLXRlc3Qtc3VpdGUKCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIGFsc28gZW5jb21wYXNzZXMgbW9yZSBmbGV4aWJpbGl0eSBpbiBydW5uaW5nIHRoZSB0ZXN0LXN1aXRlLCBlZwogICAgICAgICAgICBpdCBpcyBwb3NzaWJsZSB0byBwcmVmaXggdGhlIGNvbW1hbmQgbGluZSB3aGljaCBydW5zIGFueSB0YXJnZXQgbGFuZ3VhZ2UgdGVzdAogICAgICAgICAgICB3aXRoIGEgdG9vbC4gU2VlIHRoZSBSVU5UT09MLCBDT01QSUxFVE9PTCBhbmQgU1dJR1RPT0wgdGFyZ2V0cyBpbiB0aGUgY29tbW9uLm1rCiAgICAgICAgICAgIGZpbGUgYW5kIG1ha2VmaWxlcyBpbiB0aGUgdGVzdC1zdWl0ZSBkaXJlY3RvcnkuIEZvciBleGFtcGxlIGl0IGlzIHBvc3NpYmxlIHRvIAogICAgICAgICAgICBydW4gdGhlIHJ1bnRpbWUgdGVzdHMgdGhyb3VnaCB2YWxncmluZCB1c2luZzoKCiAgICAgICAgICAgICAgbWFrZSBjaGVjayBSVU5UT09MPSJ2YWxncmluZCAtLWxlYWstY2hlY2s9ZnVsbCIKCiAgICAgICAgICAgIG9yIGludm9rZSBTV0lHIHVuZGVyIHZhbGdyaW5kIHVzaW5nOgoKICAgICAgICAgICAgICBtYWtlIGNoZWNrIFNXSUdUT09MPSJ2YWxncmluZCAtLXRvb2w9bWVtY2hlY2siCgowNS8xOS8yMDA4OiBkcmpvZQogICAgICAgICAgICBbUl0gRml4ZWQgZGVmaW5lIHRoYXQgd2FzIGJyZWFraW5nIHByZS0yLjcuICBDaGVja2VkIGluCiAgICAgICAgICAgIHBhdGNoIGZyb20gU29yZW4gU29ubmVuYnVyZyB0aGF0IGNyZWF0ZXMgc3RyaW5ncyBpbiAgCgkgICAgdmVyc2lvbiBpbmRlcGVuZGVudCB3YXkKCjA1LzE1LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggdmFyaWFibGUgbmFtZSBjbGFzaCBpbiBkaXJlY3RvcnMgLSBTRiAjMTk2MzMxNiByZXBvcnRlZCBieSBUcmlzdGFuLgoKMDUvMTQvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgQWRkIGFuIG9wdGltaXNhdGlvbiBmb3IgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIG9iamVjdHMgYnkgdmFsdWUsIHJlZHVjaW5nCiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29waWVzIG9mIHRoZSBvYmplY3QgdGhhdCBhcmUgbWFkZS4gSW1wbGVtZW50ZWQgdXNpbmcgYW4KICAgICAgICAgICAgb3B0aW9uYWwgYXR0cmlidXRlIGluIHRoZSAib3V0IiB0eXBlbWFwIGNhbGxlZCAib3B0aW1hbCIuIERldGFpbHMgaW4gCiAgICAgICAgICAgIFR5cGVtYXBzLmh0bWwuCgowNS8xMS8yMDA4OiBvbGx5CgkgICAgW1BIUF0gQ2hlY2sgZm9yICVmZWF0dXJlKCJub3RhYnN0cmFjdCIpIHdoZW4gZ2VuZXJhdGluZyBQSFA1IGNsYXNzCgkgICAgd3JhcHBlci4KCjA1LzExLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBTRiAjMTk0MzYwOCAtICRzZWxmIHN1YnN0aXR1dGlvbiBpbiAlY29udHJhY3QsIHBhdGNoIHN1Ym1pdHRlZCBieQogICAgICAgICAgICBUb29uIFZlcnN0cmFlbGVuLgoKMDUvMDkvMjAwODogb2xseQoJICAgIFtQSFBdIEZpeCBjaGFyICogdHlwZW1hcHMgdG8gd29yayB3aGVuIGFwcGxpZWQgdG8gc2lnbmVkIGNoYXIgKiBhbmQKCSAgICB1bnNpZ25lZCBjaGFyICogKHVuY292ZXJlZCBieSB0ZXN0Y2FzZSBhcHBseV9zdHJpbmdzKS4KCjA1LzA5LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB3cmFwcGluZyBvZiBjaGFyICogbWVtYmVyIHZhcmlhYmxlcyB3aGVuIHVzaW5nIGFsbHByb3RlY3RlZCBtb2RlLgogICAgICAgICAgICBCdWcgcmVwb3J0ZWQgYnkgV2FycmVuIFdhbmcuCgowNS8wOS8yMDA4OiBvbGx5CgkgICAgW1BIUF0gRml4IGJhZCBQSFAgY29kZSBnZW5lcmF0ZWQgd2hlbiB3cmFwcGluZyBhbiBlbnVtIGluIGEKCSAgICBuYW1lc3BhY2UgKHVuY292ZXJlZCBieSB0ZXN0Y2FzZSBhcnJheXNfc2NvcGUpLgoKMDUvMDkvMjAwODogb2xseQoJICAgIFtQSFBdIFNXSUcgbm93IHJ1bnMgdGhlIFBIUCB0ZXN0c3VpdGUgdXNpbmcgUEhQNSwgbm90IFBIUDQuICBQSFA0CgkgICAgaXMgZXNzZW50aWFsbHkgb2Jzb2xldGUgbm93LCBzbyB3ZSBjYXJlIG11Y2ggbW9yZSBhYm91dCBzb2xpZCBQSFA1CgkgICAgc3VwcG9ydC4KCjA1LzA3LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFNUTCBmaXhlcyB3aGVuIHVzaW5nICVpbXBvcnQgcmF0aGVyIHRoYW4gJWluY2x1ZGUgYW5kIHRoZSBTb2xhcmlzIFdvcmtzaG9wCiAgICAgICAgICAgIGNvbXBpbGVyIGFuZCB0aGUgUm9ndWV3YXZlIFNUTC4KCjA1LzA3LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB3cmFwcGluZyBvZiBvdmVybG9hZGVkIHByb3RlY3RlZCBtZXRob2RzIHdoZW4gdXNpbmcgYWxscHJvdGVjdGVkIG1vZGUuCiAgICAgICAgICAgIEJ1ZyByZXBvcnRlZCBieSBXYXJyZW4gV2FuZy4KCjA1LzAzLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIENvbW1pdCBwYXRjaCAjMTk1NjYwNyB0byBhZGQgLU1UIHN1cHBvcnQgZnJvbSBSaWNoYXJkIEJvdWx0b24uCiAgICAgICAgICAgIFRoaXMgcGF0Y2ggbWlycm9ycyB0aGUgZ2NjIC1NVCBvcHRpb24gd2hpY2ggYWxsb3dzIG9uZSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQKICAgICAgICAgICAgTWFrZWZpbGUgdGFyZ2V0IGJlaW5nIGdlbmVyYXRlZCB3aGVuIGdlbmVyYXRpbmcgbWFrZWZpbGVzIHdpdGggdGhlIC1NIGZhbWlseQogICAgICAgICAgICBvZiBvcHRpb25zLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJCBzd2lnIC1qYXZhIC1NTSAtTVQgb3ZlcnJpZGRlbm5hbWUgLWMrKyAgZXhhbXBsZS5pCiAgICAgICAgICAgICAgb3ZlcnJpZGRlbm5hbWU6IFwKICAgICAgICAgICAgICAgZXhhbXBsZS5pIFwKICAgICAgICAgICAgICAgZXhhbXBsZS5oIAoKMDQvMzAvMjAwODogbWdvc3NhZ2UKCSAgICBbTHVhXSBSZW1vdmVkIGdlbmVyYXRpb24gb2YgX3dyYXBfZGVsZXRlX1hYWFhYICh3cmFwcGVyZWQgZGVzdHJ1Y3RvcikKCSAgICB3aGljaCB3YXMgdW51c2VkIGFuZCBjYXVzaW5nIHdhcm5pbmcgd2l0aCBnKysgLVdhbGwuCgkgICAgUmVtb3ZlZCBvdGhlciB1bnVzZWQgd2FybmluZyBpbiB0eXBlbWFwcy5pIGFuZCBvdGhlciBwbGFjZXMuCgkgICAgQWRkZWQgRXhhbXBsZXMvbHVhL2VtYmVkMywgYW5kIHJ1biB0ZXN0cyBhIGZldyB0ZXN0IGNhc2VzLgoKMDQvMjQvMjAwODogb2xseQoJICAgIFtQeXRob25dIEZpeCBnZW5lcmF0ZWQgY29kZSBmb3IgSUJNJ3MgQysrIGNvbXBpbGVyIG9uIEFJWCAocGF0Y2gKCSAgICBmcm9tIEdvZXJhbiBVZGRlYm9yZyBpbiBTRiMxOTI4MDQ4KS4KCjA0LzI0LzIwMDg6IG9sbHkKCSAgICBSZW5hbWUgQlNJWkUgaW4gRXhhbXBsZXMvdGVzdC1zdWl0ZS9hcnJheXNfc2NvcGUuaSB0byBCQlNJWkUgdG8KCSAgICBhdm9pZCBhIGNsYXNoIHdpdGggQlNJWkUgZGVmaW5lZCBieSBoZWFkZXJzIG9uIEFJWCB3aXRoIFBlcmwKCSAgICAocmVwb3J0ZWQgaW4gU0YjMTkyODA0OCkuCgowNC8yMC8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgdGhlIGFiaWxpdHkgdG8gd3JhcCBhbGwgcHJvdGVjdGVkIG1lbWJlcnMgd2hlbiB1c2luZyBkaXJlY3RvcnMuCiAgICAgICAgICAgIFByZXZpb3VzbHkgb25seSB0aGUgdmlydHVhbCBtZXRob2RzIHdlcmUgYXZhaWxhYmxlIHRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuCiAgICAgICAgICAgIE5vdyBhbGwgcHJvdGVjdGVkIG1lbWJlcnMsIChzdGF0aWMgYW5kIG5vbi1zdGF0aWMgdmFyaWFibGVzLCBub24tdmlydHVhbCBtZXRob2RzCiAgICAgICAgICAgIGFuZCBzdGF0aWMgbWV0aG9kcykgYXJlIHdyYXBwZWQgd2hlbiB1c2luZyB0aGUgYWxscHJvdGVjdGVkIG1vZGUuIFRoZSBhbGxwcm90ZWN0ZWQKICAgICAgICAgICAgbW9kZSBpcyB0dXJuZWQgb24gaW4gdGhlIG1vZHVsZSBkZWNsYXJhdGlvbjoKCiAgICAgICAgICAgICAgJW1vZHVsZShkaXJlY3RvcnM9IjEiLCBhbGxwcm90ZWN0ZWQ9IjEiKSBtb2R1bGVuYW1lCgpWZXJzaW9uIDEuMy4zNSAoNyBBcHJpbCAyMDA4KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDQvMDcvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gQWRkIG1pc3NpbmcgcG9pbnRlciByZWZlcmVuY2UgdHlwZW1hcHMKCjA0LzA2LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzdGFjayBvdmVyZmxvdyB3aGVuIHVzaW5nIHR5cGVtYXAgd2FybmluZyBzdXBwcmVzc2lvbiwgZWcgCiAgICAgICAgICAgICAgJXdhcm5maWx0ZXIoU1dJR1dBUk5fVFlQRU1BUF9DSEFSTEVBS19NU0cpCgowNC8wNS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggc2hhcmVkX3B0ciB0eXBlbWFwcyBzbyB0aGF0ICVweXRob25ub25keW5hbWljIGNhbiBiZSB1c2VkLiBBbHNvIGNvcnJlY3RzCiAgICAgICAgICAgIGRpc3BsYXkgb2YgdGhlIHByb3h5IGNsYXNzIHR5cGUuIFJlcG9ydGVkIGJ5IFJvYmVydCBMdXB0b24uCgowNC8wNC8yMDA4OiBvbGx5CgkgICAgW1B5dGhvbl0gQWRkICVuZXdvYmplY3QgcmVmZXJlbmNlIHRvIHB5dGhvbiBtZW1vcnkgbWFuYWdlbWVudCBzdWJzZWN0aW9uIG9mIG1hbnVhbAoJICAgIChwYXRjaCBmcm9tIG1kYmVhY2h5IGluIFNGIzE4OTQ2MTApLgoKMDMvMjcvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4IHNoYXJlZF9wdHIgdHlwZW1hcHMgd2hlcmUgdGhlIHBvaW50ZXIgdHlwZSBpcyBhIHRlbXBsYXRlZCB0eXBlIHdpdGgKICAgICAgICAgICAgd2l0aCBtb3JlIHRoYW4gb25lIHBhcmFtZXRlci4gUmVwb3J0ZWQgYnkgUm9iZXJ0IEx1cHRvbi4KCjAzLzI3LzIwMDg6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEFkZGVkIGEgdHlwZW1hcCBESVNPV04gZm9yIFNXSUdUWVBFKiBhbmQgU1dJR1RZUEVbXSwgYW5kIHN1cHBvcnQgZm9yICVkZWxvYmplY3QgZmVhdHVyZS4KICAgICAgICAgICAgQWRkZWQgRXhhbXBsZXMvbHVhL293bmVyIHdoaWNoIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIHRoZSBtZW1vcnkgbWFuYWdlbWVudC4KCjAzLzI2LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBBcHBseSBwYXRjaCAjMTg0NDMwMSBmcm9tIE1vbnR5IFRheWxvciB0byBzdXBwcmVzcyBlbnVtIGNvbnN0cnVjdG9yCiAgICAgICAgICAgIHVudXNlZCB3YXJuaW5ncy4KCjAzLzI2LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFwcGx5IHBhdGNoICMxOTI0NTI0IGZyb20gQ2FzZXkgUmF5bW9uZHNvbiB3aGljaCBlbnN1cmVzIHRoZQogICAgICAgICAgICAiTm8gY29uc3RydWN0b3IgZGVmaW5lZCIgbWVzc2FnZSBpcyBkaXNwbGF5ZWQgd2hlbiBhdHRlbXB0aW5nIHRvIGNhbGwgYQogICAgICAgICAgICBjb25zdHJ1Y3RvciBvbiBhIGNsYXNzIHRoYXQgZG9lc24ndCBoYXZlIGEgY29uc3RydWN0b3Igd3JhcHBlciwgZWcgaWYKICAgICAgICAgICAgdGhlIEMrKyBjbGFzcyBpcyBhYnN0cmFjdC4KCjAzLzI2LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFwcGx5IHBhdGNoICMxOTI1NzAyIGZyb20gQ2FzZXkgUmF5bW9uZHNvbiB3aGljaCByZW1vdmVzIHdhcm5pbmcgNTEyCiAgICAgICAgICAgIGZvciBzdGQ6OnZlY3RvciB3cmFwcGVycy4KCjAzLzI2LzIwMDg6IG9sbHkKCSAgICBbUHl0aG9uXSBBcHBseSBHQ0MgNC4zIHdhcm5pbmdzIHBhdGNoIGZyb20gUGhpbGlwcCBUaG9tYXMKCSAgICAoU0YjMTkyNTEyMikuCgowMy8yMS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBUaHJlYWQgc2FmZXR5IHBhdGNoIGZvciBTVEwgaXRlcmF0b3JzIGZyb20gQWJoaW5hbmRhbiBKYWluLgoKMDMvMTcvMjAwODogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gQWRkZWQgJWx1YWNvZGUgZmVhdHVyZSB0byBhZGQgc291cmNlIGNvZGUgaW50byB3cmFwcGVycy4KICAgICAgICAgICAgVXBkYXRlZCBkb2N1bWVudGF0aW9uIHRvIGRvY3VtZW50IHRoaXMuCiAgICAgICAgICAgIEFkZGVkIEV4YW1wbGVzL2x1YS9hcnJheXMgdG8gc2hvdyBpdHMgdXNlIChhbmQgdHlwZW1hcHMpCgowMy8xNy8yMDA4OiBvbGx5CgkgICAgRml4IG5vbnBvcnRhYmxlIHNlZCB1c2FnZSB3aGljaCBmYWlsZWQgb24gTWFjIE9TIFggKGFuZCBwcm9iYWJseQoJICAgIG90aGVyIHBsYXRmb3JtcykuICBGaXhlcyBTRiMxOTAzNjEyLgoKMDMvMTcvMjAwODogb2xseQoJICAgIEZpeCBtZW1vcnkgbGVhayBpbiBTV0lHJ3MgcGFyc2VyIChiYXNlZCBvbiBwYXRjaCBmcm9tIFJ1c3NlbGwKCSAgICBCcnlhbnQgaW4gU0YjMTkxNDAyMykuCgowMy8xMi8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggYnVnICMxODc4Mjg1IC0gdW5uZWNlc3NhcnkgY2FzdCBmb3IgQyBzdHJ1Y3QgY3JlYXRpb24gd3JhcHBlcnMuCgowMy8xMi8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBSZW1vdmUgZGVidWdnaW5nIGluZm8gd2hlbiB1c2luZyBzaGFyZWRfcHRyIHN1cHBvcnQKCjAzLzA2LzIwMDg6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIFVwZGF0ZWQgZG9jdW1lbnRhdGlvbiBmb3IgTHVhIGV4Y2VwdGlvbnMuCiAgICAgICAgICAgIEFkZGVkIEV4YW1wbGVzL2x1YS9leGNlcHRpb24gYW5kIEV4YW1wbGVzL2x1YS9lbWJlZDIuCiAgICAgICAgICAgIFNtYWxsIHVwZGF0ZXMgdG8gdGhlIHR5cGVtYXBzLgoKMDMvMDQvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBBZGQgY2hhciAqJiB0eXBlbWFwcy4KCjAzLzA0LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBvY2Nhc2lvbmFsIHNlZyBmYXVsdCB3aGVuIGF0dGVtcHRpbmcgdG8gcmVwb3J0IG92ZXJsb2FkZWQgbWV0aG9kcyBhcyBiZWluZyBpZ25vcmVkLgoKMDIvMjkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIEZpeCAjMTkwNDUzNyBTd2lnIGNhdXNlcyBhIFBlcmwgd2FybmluZyAieCB1c2VkIG9ubHkgb25jZSIgaW4gUGVybCA1LjEwCiAgICAgICAgICAgIHJlcG9ydGVkIGJ5IEFyaSBKb2xtYQoKMDIvMjkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQWRkIHNoYXJlZF9wdHIgdmFyaW4vdmFyb3V0IHR5cGVtYXBzIGZvciB3cmFwcGluZyBnbG9iYWwgdmFyaWFibGVzLgoKMDIvMjUvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgRml4ICR3cmFwbmFtZSB0byB3b3JrIGluICVleGNlcHRpb24gKGZpeGVzIHNvbWUgd3JhcDpuYW1lIGFzc2VydGlvbnMpCgpWZXJzaW9uIDEuMy4zNCAoMjcgRmVicnVhcnkgMjAwOCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowMi8xMy8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gRml4IHdyYXBwaW5nIG9mIGdsb2JhbCBmdW5jdGlvbiBwb2ludGVyIHZhcmlhYmxlcy4KCjAyLzEzLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBuZXcgc3BlY2lhbCB2YXJpYWJsZXMgZm9yIHVzZSB3aXRoaW4gJWV4Y2VwdGlvbjoKICAgICAgICAgICAgICAkd3JhcG5hbWUgLSBsYW5ndWFnZSBzcGVjaWZpYyB3cmFwcGVyIG5hbWUKICAgICAgICAgICAgICAkb3Zlcm5hbWUgLSBpZiBhIG1ldGhvZCBpcyBvdmVybG9hZGVkIHRoaXMgY29udGFpbnMgdGhlIGV4dHJhIG1hbmdsaW5nIHVzZWQgb24gCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG92ZXJsb2FkZWQgbWV0aG9kCiAgICAgICAgICAgICAgJGRlY2wgICAgIC0gdGhlIGZ1bGx5IHF1YWxpZmllZCBDL0MrKyBkZWNsYXJhdGlvbiBvZiB0aGUgbWV0aG9kIGJlaW5nIHdyYXBwZWQgCiAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aG91dCB0aGUgcmV0dXJuIHR5cGUKICAgICAgICAgICAgICAkZnVsbGRlY2wgLSB0aGUgZnVsbHkgcXVhbGlmaWVkIEMvQysrIGRlY2xhcmF0aW9uIG9mIHRoZSBtZXRob2QgYmVpbmcgd3JhcHBlZCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRpbmcgdGhlIHJldHVybiB0eXBlCgowMi8xMi8yMDA4OiBkcmpvZQogICAgICAgICAgICBbUl0gTm93IHNldHRpbmcgUzQgZmxhZyBpbiBTV0lHIGNyZWF0ZWQgb2JqZWN0cy4gIFRoaXMKICAgICAgICAgICAgZml4ZXMgUi1TV0lHIGZvciAyLjYgYW5kIHdhcm5pbmcgZm9yIDIuNiBmYWlsdXJlIGhhcyBiZWVuIHJlbW92ZWQuCgowMi8xMS8yMDA4OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBBZGRlZCBhIHBhdGNoIGJ5IFRvcnN0ZW4gTGFuZHNjaG9mZiB0byBmaXggdGhlIHVuYXJ5IG1pbnVzIGlzc3VlCiAgICAgICAgICAgIFJhbiAnYXN0eWxlIC0tc3R5bGU9a3IgLTInIGFjcm9zcyBsdWEuY3h4IHRvIG5lYXRlbiBpdCB1cAoKMDIvMTAvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgQnVtcCBTV0lHX1JVTlRJTUVfVkVSU0lPTiB0byA0LiBUaGlzIGlzIGJlY2F1c2Ugb2YgdGhlIHJlY2VudGx5IGludHJvZHVjZWQgQVBJIAogICAgICAgICAgICBjaGFuZ2UgaW4gdGhlIGNvbnZlcnNpb24gZnVuY3Rpb25zLCBpZSBjaGFuZ2UgaW4gZGVmaW5pdGlvbiBvZiBzd2lnX2NvbnZlcnRlcl9mdW5jLgogICAgICAgICAgICBBbnlvbmUgY2FsbGluZyBTV0lHX1R5cGVDYXN0IG11c3QgcGFzcyBpbiBhIHZhbGlkIHZhbHVlIGZvciB0aGUgbmV3IGFkZGl0aW9uYWwKICAgICAgICAgICAgKHRoaXJkKSBwYXJhbWV0ZXIgYW5kIHRoZW4gaGFuZGxlIHRoZSBuZXdseSBjcmVhdGVkIG1lbW9yeSBpZiB0aGUgcmV0dXJuZWQgdmFsdWUKICAgICAgICAgICAgaXMgc2V0IHRvIFNXSUdfQ0FTVF9ORVdfTUVNT1JZIGVsc2UgYSBtZW1vcnkgbGVhayB3aWxsIGVuc3VlLgoKMDIvMDkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRXhwZXJpbWVudGFsIHNoYXJlZF9wdHIgdHlwZW1hcHMgYWRkZWQuIFVzYWdlIGlzIHRoZSBzYW1lIGFzIHRoZSByZWNlbnRseQogICAgICAgICAgICBhZGRlZCBKYXZhIGFuZCBDIyBzaGFyZWRfcHRyIHR5cGVtYXBzLiBUd28gbWFjcm9zIGFyZSBhdmFpbGFibGUsIGFsdGhvdWdoIHRoZXNlCiAgICAgICAgICAgIG1heSB3ZWxsIGNoYW5nZSBpbiBhIGZ1dHVyZSB2ZXJzaW9uOgoKICAgICAgICAgICAgRm9yIGJhc2UgY2xhc3NlcyBvciBjbGFzc2VzIG5vdCBpbiBhbiBpbmhlcml0YW5jZSBjaGFpbjoKICAgICAgICAgICAgICBTV0lHX1NIQVJFRF9QVFIoUFJPWFlDTEFTUywgVFlQRSkKICAgICAgICAgICAgRm9yIGRlcml2ZWQgY2xhc3NlczoKICAgICAgICAgICAgICBTV0lHX1NIQVJFRF9QVFJfREVSSVZFRChQUk9YWUNMQVNTLCBCQVNFQ0xBU1NUWVBFLCBUWVBFKQoKICAgICAgICAgICAgVGhlIFBST1hZQ0xBU1MgaXMgdGhlIG5hbWUgb2YgdGhlIHByb3h5IGNsYXNzLCBidXQgaXMgb25seSByZXF1aXJlZCBmb3IgSmF2YS9DIy4KICAgICAgICAgICAgRXhhbXBsZSB1c2FnZToKCiAgICAgICAgICAgICAgJWluY2x1ZGUgImJvb3N0X3NoYXJlZF9wdHIuaSIKCiAgICAgICAgICAgICAgU1dJR19TSEFSRURfUFRSKEtsYXNzLCBTcGFjZTo6S2xhc3MpCiAgICAgICAgICAgICAgU1dJR19TSEFSRURfUFRSX0RFUklWRUQoS2xhc3NEZXJpdmVkLCBTcGFjZTo6S2xhc3MsIFNwYWNlOjpLbGFzc0Rlcml2ZWQpCgogICAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZSB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgS2xhc3MgeyAuLi4gfTsKICAgICAgICAgICAgICAgIHN0cnVjdCBLbGFzc0Rlcml2ZWQgOiBLbGFzcyB7IC4uLiB9OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEZ1cnRoZXIgZGV0YWlscyB0byBmb2xsb3cgaW4gZnV0dXJlIGRvY3VtZW50YXRpb24sIGJ1dCB0aGUgZm9sbG93aW5nIGZlYXR1cmVzCiAgICAgICAgICAgIHNob3VsZCBiZSBub3RlZDoKCiAgICAgICAgICAgIC0gTm90IHJlc3RyaWN0ZWQgdG8gYm9vc3Q6OnNoYXJlZF9wdHIsIGVnIHN0ZDo6dHIxOjpzaGFyZWRfcHRyIGNhbiBhbHNvIGJlIHVzZWQuCiAgICAgICAgICAgIC0gQXZhaWxhYmxlIHR5cGVtYXAgZ3JvdXBzOgogICAgICAgICAgICAgIChhKSBUeXBlbWFwcyBmb3Igc2hhcmVkX3B0ciBwYXNzZWQgYnkgdmFsdWUsIHJlZmVyZW5jZSwgcG9pbnRlciBhbmQgcG9pbnRlciAKICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlLgogICAgICAgICAgICAtIChiKSBUeXBlbWFwcyBmb3IgcGFzc2luZyBieSByYXcgdmFsdWUsIHJhdyBwb2ludGVyLCByYXcgcmVmZXJlbmNlLCByYXcgcG9pbnRlcgogICAgICAgICAgICAgICAgICByZWZlcmVuY2UuIAogICAgICAgICAgICAtIFRoZSBjb2RlIGJlaW5nIHdyYXBwZWQgZG9lcyBub3QgZXZlbiBoYXZlIHRvIHVzZSBzaGFyZWRfcHRyLCBTV0lHIGNhbiB1c2UKICAgICAgICAgICAgICBzaGFyZWRfcHRyIGFzIHRoZSB1bmRlcmx5aW5nIHN0b3JhZ2UgbWVjaGFuaXNtIGluc3RlYWQgb2YgYSByYXcgcG9pbnRlciBkdWUgdG8gCiAgICAgICAgICAgICAgdGhlIHR5cGVtYXBzIGluIGdyb3VwIChiKSBhYm92ZS4KICAgICAgICAgICAgLSBObyBhcnJheSBzdXBwb3J0IGFzIHNoYXJlZF9wdHIgZG9lcyBub3Qgc3VwcG9ydCBhcnJheXMuCiAgICAgICAgICAgIC0gVGhpcyB3b3JrcyBxdWl0ZSBkaWZmZXJlbnRseSB0byB0aGUgdXN1YWwgU1dJRyBzbWFydCBwb2ludGVyIHN1cHBvcnQgd2hlbgogICAgICAgICAgICAgIG9wZXJhdG9yLT4gaXMgcGFyc2VkIGJ5IFNXSUc6CiAgICAgICAgICAgICAgLSBBbiBhZGRpdGlvbmFsIHNtYXJ0IHBvaW50ZXIgY2xhc3MgaXMgbm90IGdlbmVyYXRlZCByZWR1Y2luZyBjb2RlIGJsb2F0IGluCiAgICAgICAgICAgICAgICB0aGUgd3JhcHBlcnMuCiAgICAgICAgICAgICAgLSBVc2luZyBzbWFydCBwb2ludGVycyBhbmQgcmF3IHBvaW50ZXJzIGNhbiBiZSBtaXhlZCBzZWFtbGVzc2x5LgogICAgICAgICAgICAgIC0gTWlzc2luZyBjb25zdHJ1Y3RvcnMgZm9yIHRoZSBzbWFydCBwb2ludGVycyBpcyBubyBsb25nZXIgYSBwcm9ibGVtIGFuZCBzbwogICAgICAgICAgICAgICAgc2VwYXJhdGUgZmFjdG9yeSB0eXBlIGZ1bmN0aW9ucyBkbyBub3QgaGF2ZSB0byBiZSB3cml0dGVuIGFuZCB3cmFwcGVkLgogICAgICAgICAgICAgIC0gVGhlIGltcGxpY2l0IEMrKyBzaGFyZWRfcHRyPCBkZXJpdmVkIGNsYXNzID4gdG8gc2hhcmVkX3B0cjwgYmFzZSBjbGFzcyA+CiAgICAgICAgICAgICAgICBjYXN0IGFsc28gd29ya3MgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4gVGhpcyBuZWdhdGVzIHRoZSBuZWNlc3NpdHkgdG8gd3JpdGUKICAgICAgICAgICAgICAgIGFuIGV4cGxpY2l0IGhlbHBlciBjYXN0IGZ1bmN0aW9uIHByb3ZpZGluZyB0aGUgdXBjYXN0IHdoaWNoIHdvdWxkIG5lZWQKICAgICAgICAgICAgICAgIGNhbGxpbmcgcHJpb3IgdG8gcGFzc2luZyBhIGRlcml2ZWQgY2xhc3MgdG8gYSBtZXRob2QgdGFraW5nIGEgc2hhcmVkX3B0ciB0bwogICAgICAgICAgICAgICAgYSBiYXNlIGNsYXNzLgoKMDIvMDkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQWRkIHN1cHBvcnQgZm9yIG92ZXJyaWRpbmcgdGhlIGNsYXNzIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbiB2aWEgYSBuZXcKICAgICAgICAgICAgInNtYXJ0cHRyIiBmZWF0dXJlLiBUaGlzIGlzIGEgdmVyeSBsb3cgbGV2ZWwgb2YgY3VzdG9taXNhdGlvbiBtb3N0IHVzZXJzCiAgICAgICAgICAgIHdvdWxkIG5ldmVyIG5lZWQgdG8ga25vdy4gVGhlIGZlYXR1cmUgd2lsbCB0eXBpY2FsbHkgYmUgdXNlZCBmb3IgaW50cnVzaXZlIAogICAgICAgICAgICBzbWFydCBwb2ludGVycyBhbG9uZyB3aXRoIGFkZGl0aW9uYWwgdHlwZW1hcHMuIEV4YW1wbGUgdXNhZ2Ugb2YgdGhlIGZlYXR1cmU6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJzbWFydHB0ciIsIG5vYmxvY2s9MSkgRm9vIHsgYm9vc3Q6OnNoYXJlZF9wdHI8IEZvbyA+IH0KICAgICAgICAgICAgICBjbGFzcyBGb28ge307CgogICAgICAgICAgICBUaGUgZ2VuZXJhdGVkIEZvb19zd2lncmVnaXN0ZXIgZnVuY3Rpb24gd2lsbCB0aGVuIHJlZ2lzdGVyIGJvb3N0OjpzaGFyZWQgPCBGb28gPgogICAgICAgICAgICAoU1dJR1RZUEVfcF9ib29zdF9fc2hhcmVkX3B0clRGb29fdCBpbnN0ZWFkIG9mIFNXSUdUWVBFX3BfRm9vKSBhcyB0aGUgdW5kZXJseWluZwogICAgICAgICAgICB0eXBlIGZvciBpbnN0YW50aWF0aW9ucyBvZiBGb28uCgowMi8wOS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGZWF0dXJlcyBub3cgc3VwcG9ydHMgdGhlIG9wdGlvbmFsICdub2Jsb2NrJyBhdHRyaWJ1dGUgZm9yIGFsbCB1c2FnZSBvZiAlZmVhdHVyZS4gCiAgICAgICAgICAgIFdoZW4gc3BlY2lmaWVkLCB0aGUgeyB9IGJyYWNlcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBmZWF0dXJlIGNvZGUuIFRoaXMgaXMgaWRlbnRpY2FsCiAgICAgICAgICAgIGluIGJlaGF2aW91ciB0byB1c2FnZSBvZiAnbm9ibG9jaycgaW4gdHlwZW1hcHMgYW5kIGlzIHVzZWQgd2hlbiB0aGUgcHJlcHJvY2Vzc29yCiAgICAgICAgICAgIGlzIHJlcXVpcmVkIHRvIG9wZXJhdGUgb24gdGhlIGNvZGUgaW4gdGhlIGZlYXR1cmUgYW5kIHRoZSBlbmNsb3NpbmcgeyB9IGJyYWNlcwogICAgICAgICAgICBhcmUgbm90IHJlcXVpcmVkLiBFeGFtcGxlOgoKICAgICAgICAgICAgICAjZGVmaW5lIEZPTyBmb28KICAgICAgICAgICAgICAlZmVhdHVyZSgic21hcnRwdHIiLCBub2Jsb2NrPSIxIikgeyBGT086OmJhciB9CgogICAgICAgICAgICBUaGUgcHJlcHJvY2Vzc29yIHRoZW4gcmVkdWNlcyB0aGlzIGFzIGlmIHRoaXMgaGFkIGJlZW4gdXNlZCBpbnN0ZWFkOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgic21hcnRwdHIiKSAiZm9vOjpiYXIiCgowMi8wMS8yMDA4OiBvbGx5CgkgICAgW1B5dGhvbl0gRml4IGZvcm1hdCBzdHJpbmcgYnVnIChTRiMxODgyMjIwKS4KCjAxLzMxLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZGl0aW9ucyB0byB0aGUgJXR5cGVzIGRpcmVjdGl2ZS4gTm93IHRoZSBjb252ZXJzaW9uIC8gY2FzdGluZyBjb2RlIGNhbiBiZQogICAgICAgICAgICBvdmVycmlkZGVuIHRvIHNvbWUgY3VzdG9tIGNvZGUgaW4gdGhlICV0eXBlcyBkaXJlY3RpdmUsIGxpa2Ugc286CgogICAgICAgICAgICAgICV0eXBlcyhmcm9tdHlwZSA9IHRvdHlwZSkgJXsKICAgICAgICAgICAgICAgIC4uLiBjb2RlIHRvIGNvbnZlcnQgZnJvbXR5cGUgdG8gdG90eXBlIGFuZCByZXR1cm4gLi4uCiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFRoZSBzcGVjaWFsIHZhcmlhYmxlICRmcm9tIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciBvZiB0aGUKICAgICAgICAgICAgdHlwZSBiZWluZyBjb252ZXJ0ZWQgZnJvbS4gVGhlIGNvZGUgbXVzdCByZXR1cm4gdGhlIHRvdHlwZSBjYXN0IHRvIHZvaWQgKi4gRXhhbXBsZToKCiAgICAgICAgICAgICAgY2xhc3MgVGltZTsKICAgICAgICAgICAgICBjbGFzcyBEYXRlOwogICAgICAgICAgICAgIERhdGUgJlRpbWU6OmRhdGVGcm9tVGltZSgpOwoKICAgICAgICAgICAgICAldHlwZXMoVGltZSA9IERhdGUpICV7CiAgICAgICAgICAgICAgICBUaW1lICp0ID0gKFRpbWUgKikkZnJvbTsKICAgICAgICAgICAgICAgIERhdGUgJmQgPSB0LT5kYXRlRnJvbVRpbWUoKTsKICAgICAgICAgICAgICAgIHJldHVybiAodm9pZCAqKSAmZDsKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgcmVzdWx0aW5nIGluIHRoZSBjb252ZXJzaW9uIC8gY2FzdGluZyBjb2RlIGxvb2tpbmcgc29tZXRoaW5nIGxpa2U6CgogICAgICAgICAgICAgIHN0YXRpYyB2b2lkICpfcF9UaW1lVG9fcF9EYXRlKHZvaWQgKngpIHsKICAgICAgICAgICAgICAgIFRpbWUgKnQgPSAoVGltZSAqKXg7CiAgICAgICAgICAgICAgICBEYXRlICZkID0gdC0+ZGF0ZUZyb21UaW1lKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gKHZvaWQgKikgJmQ7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyBpcyBhZHZhbmNlZCB1c2FnZSwgcGxlYXNlIHVzZSBvbmx5IGlmIHlvdSB1bmRlcnN0YW5kIHRoZSBydW50aW1lIHR5cGUgc3lzdGVtLgoKMDEvMzAvMjAwODogbWdvc3NhZ2UKCSAgICBTbWFsbCB1cGRhdGUgdG8gZG9jdW1lbnRhdGlvbiBpbiBUeXBlbWFwcy5odG1sLCB0byB3YXJuIGFib3V0IHVzZSBvZiBsb2NhbCAKCSAgICB2YXJpYWJsZXMgaW4gdHlwZW1hcHMgZm9yIG11bHRpcGxlIHR5cGVzLgoKMDEvMjUvMjAwODogd3NmdWx0b24KCSAgICBbSmF2YV0gRml4IGJ1ZyByZXBvcnRlZCBieSBLZXZpbiBNaWxscyBpbiBBUlJBWVNPRkNMQVNTRVMgdHlwZW1hcHMgd2hlcmUgYW55CiAgICAgICAgICAgIGNoYW5nZXMgbWFkZSB0byBhbiBhcnJheSBlbGVtZW50IHBhc3NlZCBmcm9tIEphdmEgdG8gQyBhcmUgbm90IHJlZmxlY3RlZCBiYWNrCiAgICAgICAgICAgIGludG8gSmF2YS4KCjAxLzI0LzIwMDg6IG1nb3NzYWdlCgkgICAgTW9yZSB1cGRhdGVzIHRvIHRoZSBjb25maWd1cmUgc2NyaXB0IGZvciBkZXRlY3RpbmcgbHVhLgoJICAgIEFsc28gbG9va3MgaW4gL3Vzci9pbmNsdWRlL2x1YSoKCSAgICBBbHNvIGNoYW5nZWQgdHlwZW1hcHMuaSBub3QgdG8gY2hlY2sgZm9yIE5VTEwgYmVmb3JlIGZyZWVpbmcgYSBwb2ludGVyCgowMS8yMS8yMDA4OiB3c2Z1bHRvbgoJICAgIFtQeXRob25dIEZvciBTVEwgY29udGFpbmVycywgU1dJRyBubyBsb25nZXIgYXR0ZW1wdHMgdG8gY29udmVydCBmcm9tIG9uZQogICAgICAgICAgICBTVEwgY29udGFpbmVyIHRvIGFub3RoZXIsIGVnIGZyb20gc3RkOjp2ZWN0b3I8aW50PiB0byBzdGQ6OnZlY3Rvcjxkb3VibGU+CiAgICAgICAgICAgIG9yIHN0ZDo6bGlzdDxpbnQ+IHRvIHN0ZDo6dmVjdG9yPGludD4gb3IgZXZlbiBzdGQ6OnZlY3RvcjxGb28+IHRvCiAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEJhcj4gYXMgaXQgcHJldmlvdXNseSBkaWQuIEluIGZhY3QgU1dJRyBubyBsb25nZXIgYXR0ZW1wdHMgdG8KICAgICAgICAgICAgY29udmVydCBhbnkgU1dJRyB3cmFwcGVkIEMrKyBwcm94eSBjbGFzcyB0aGF0IGlzIGFsc28gYSBQeXRob24gc2VxdWVuY2UsCiAgICAgICAgICAgIHdoZXJlYXMgcHJldmlvdXNseSBpdCB3b3VsZC4gQW55IG5vbi1TV0lHIFB5dGhvbiBzZXF1ZW5jZSB3aWxsIHN0aWxsIGJlCiAgICAgICAgICAgIGFjY2VwdGVkIHdoZXJldmVyIGFuIFNUTCBjb250YWluZXIgaXMgYWNjZXB0ZWQuIE92ZXJsb2FkZWQgbWV0aG9kcyB1c2luZwogICAgICAgICAgICBjb250YWluZXJzIHNob3VsZCBiZSBmYXN0ZXIuCgowMS8xOC8yMDA4OiB3c2Z1bHRvbgoJICAgIFtDI10gQWRkICdkaXJlY3RvcmluYXR0cmlidXRlcycgYW5kICdkaXJlY3Rvcm91dGF0dHJpYnV0ZXMnIHR5cGVtYXAgYXR0cmlidXRlcwogICAgICAgICAgICBmb3IgdGhlIGltdHlwZSB0eXBlbWFwLiBUaGVzZSBzaG91bGQgY29udGFpbiBDIyBhdHRyaWJ1dGVzIHdoaWNoIHdpbGwKICAgICAgICAgICAgYmUgZ2VuZXJhdGVkIGludG8gdGhlIEMjIGRpcmVjdG9yIGRlbGVnYXRlIG1ldGhvZHMuCgowMS8xOC8yMDA4OiBvbGx5CgkgICAgRml4IGhhbmRsaW5nIG9mIGJ5dGUgdmFsdWUgMjU1IGluIGlucHV0IGZpbGVzIG9uIHBsYXRmb3JtcyB3aGVyZQoJICAgIGNoYXIgaXMgc2lnbmVkIChpdCB3YXMgZ2V0dGluZyBtYXBwZWQgdG8gRU9GKS4gIEZpeGVzIFNGIzE1MTgyMTkuCgowMS8xNi8yMDA4OiB3c2Z1bHRvbgoJICAgIEZpeCB0ZW1wbGF0ZSBtZW1iZXIgdmFyaWFibGVzIHdyYXBwZWQgYnkgYSBzbWFydCBwb2ludGVyLiBCdWcgcmVwb3J0ZWQgCiAgICAgICAgICAgIGJ5IFJvYmVydCBMdXB0b24uCgowMS8xNC8yMDA4OiBtZ29zc2FnZQoJICAgIFN1YnN0YW50aWFsIGNoYW5nZXMgdG8gY29uZmlndXJlIHNjcmlwdCBmb3IgZGV0ZWN0aW5nIGx1YS4KCSAgICAgIENvZGUgY2FuIG5vdyBsaW5rIHRvIGxpYmx1YS5hLCBsaWJsdWE1MC5hIG9yIGxpYmx1YTUxLmEKCSAgICAgIEl0J3MgYWxzbyBhIGxvdCBuZWF0ZXIgbm93LgoKMTIvMTYvMjAwNzogd3NmdWx0b24KCSAgICBbUGVybF0gQmFja2VkIG91dCAjMTc5ODcyOCAtIG51bWJlcnMgY2FuIGJlIHBhc3NlZCB0byBmdW5jdGlvbnMgdGFraW5nIGNoYXIgKgoKMTIvMTYvMjAwNzogd3NmdWx0b24KCSAgICBGaXggIzE4MzI2MTMgLSBUZW1wbGF0ZXMgYW5kIHNvbWUgdHlwZWRlZnMgaW52b2x2aW5nIHBvaW50ZXJzIG9yIGZ1bmN0aW9uIHBvaW50ZXJzCgoxMi8xMi8yMDA3OiB3c2Z1bHRvbgoJICAgIFtKYXZhXSBGaXggIzE2MzI2MjUgLSBDb21waWxhdGlvbiBlcnJvcnMgb24gVmlzdWFsIEMrKyA2IHdoZW4gdXNpbmcgZGlyZWN0b3JzLgoKMTIvMTIvMjAwNzogd3NmdWx0b24KCSAgICBbUGVybF0gRml4ICMxNzk4NzI4IC0gbnVtYmVycyBjYW4gYmUgcGFzc2VkIHRvIGZ1bmN0aW9ucyB0YWtpbmcgY2hhciAqLgoKMTIvMTIvMjAwNzogd3NmdWx0b24KCSAgICBGaXggIzE4MTk4NDcgJXRlbXBsYXRlIHdpdGgganVzdCBvbmUgZGVmYXVsdCB0ZW1wbGF0ZSBwYXJhbWV0ZXIgCgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQgPSBpbnQ+IGNsYXNzIEZvbyB7Li4ufTsKICAgICAgICAgICAgICAldGVtcGxhdGUoRm9vRGVmYXVsdCkgRm9vPD47CgoxMi8xMi8yMDA3OiBtZ29zc2FnZQoJICAgIFtMdWFdIFNtYWxsIGNvcnJlY3Rpb24gb24gTHVhLmh0bWwKCjEyLzA5LzIwMDc6IHdzZnVsdG9uCgkgICAgQXBwbHkgcGF0Y2ggIzE4MzgyNDggZnJvbSBNb250eSBUYXlsb3IgZm9yIHZwYXRoIGJ1aWxkcyBvZiBTV0lHLgoKMTIvMDgvMjAwNzogd3NmdWx0b24KCSAgICBbTHVhXSBGaXhlcyB0byByZW1vdmUgZ2NjLTQuMiB3YXJuaW5ncwoKMTIvMDYvMjAwNzogd3NmdWx0b24KCSAgICBGaXggIzE3MzQ0MTUgLSB0ZW1wbGF0ZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgc3VjaCBhczoKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgdF9pdGVtLCB0ZW1wbGF0ZTx0eXBlbmFtZT4gY2xhc3MgdF9hbGxvYyA9IHBmYzo6YWxsb2NfZmFzdCA+CiAgICAgICAgICAgICAgICBjbGFzcyBsaXN0X3QgOiBwdWJsaWMgbGlzdF9pbXBsX3Q8dF9pdGVtLHBmYzo6YXJyYXlfdDx0X2l0ZW0sdF9hbGxvYz4gPiB7IC4uLiB9OwoKMTIvMDQvMjAwNzogbWdvc3NhZ2UKCSAgICBbbHVhXSBGaXggYSBidWcgaW4gdGhlIGNsYXNzIGhpZXJhY2h5IGNvZGUsIHdoZXJlIHRoZSBtZXRob2RzIHdlcmUgbm90IHByb3BhZ2F0ZWQsIAoJICAgIGlmIHRoZSBuYW1lIG9yZGVyaW5nIHdhcyBpbiBhIGNlcnRhaW4gb3JkZXIuCgkgICAgQWRkZWQgbmV3IGV4YW1wbGUgcHJvZ3JhbXMgKGR1YWwsIGVtYmVkKSBhbmQgcnVudGltZSB0ZXN0cyBmb3IgdGVzdC1zdWl0ZS4KCjExLzMwLzIwMDc6IHdzZnVsdG9uCgkgICAgRml4IHVzaW5nIHN0YXRlbWVudHMgdXNpbmcgYSBiYXNlIGNsYXNzIG1ldGhvZCB3aGVyZSB0aGUgbWV0aG9kcyB3ZXJlIG92ZXJsb2FkZWQuCiAgICAgICAgICAgIERlcGVuZGluZyBvbiB0aGUgb3JkZXIgb2YgdGhlIHVzaW5nIHN0YXRlbWVudHMgYW5kIG1ldGhvZCBkZWNsYXJhdGlvbnMsIHRoZXNlCiAgICAgICAgICAgIHdlcmUgcHJldmlvdXNseSBnZW5lcmF0aW5nIHVuY29tcGlsZWFibGUgd3JhcHBlcnMsIGVnOgoKICAgICAgICAgICAgICBzdHJ1Y3QgRGVyaXZlZCA6IEJhc2UgewogICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGZ1bmsoKTsKICAgICAgICAgICAgICAgIHVzaW5nIEJhc2U6OmZ1bms7CiAgICAgICAgICAgICAgfTsKClZlcnNpb24gMS4zLjMzIChOb3ZlbWJlciAyMywgMjAwNykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTEvMjEvMjAwNzogbWlrZWwKCSAgICBbYWxsZWdyb2NsXSBvbWl0IHByaXZhdGUgc2xvdCB0eXBlIGluZm8gaW4gdGhlIGNsYXNzZXMvdHlwZXMKCSAgICBkZWZpbmVkIG9uIHRoZSBsaXNwIHNpZGUuIEZpeCBidWcgaW4gbWFwcGluZyBvZiBDLysrIHR5cGVzCgkgICAgdG8gbGlzcCB0eXBlcy4gRml4IHR5cG8gaW4gbW9kdWxlcyBnZW5lcmF0ZWQgZGVmcGFja2FnZSBmb3JtLgoJICAgIEhhdmUgc3RkOjpzdHJpbmcgKidzIGF1dG9tYXRpY2FsbHkgbWFyc2hhbGxlZCBiZXR3ZWVuIGZvcmVpZ24KCSAgICBhbmQgbGlzcCBzdHJpbmdzLgoJCjExLzIwLzIwMDc6IG9sbHkKCSAgICBbUHl0aG9uXSBGaWxsIGluIFB5dGhvbiBEaWN0aW9uYXJ5IGZ1bmN0aW9ucyBsaXN0IChwYXRjaCBmcm9tCgkgICAgSmVsbWVyIFZlcm5vb2lqIHBvc3RlZCB0byBzd2lnLWRldmVsKS4KCjExLzIwLzIwMDc6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBidWcgaW4gdGhlIEMgc2Nhbm5lciByZWxhdGVkIHRvIGJhY2tzbGFzaCBjaGFyYWN0ZXJzLgoKMTEvMTkvMjAwNzogd3NmdWx0b24KCSAgICBbUGVybF0gRml4IGJyb2tlbiBjb21waWxhdGlvbiBvZiBDKysgd3JhcHBlcnMgb24gc29tZSBjb21waWxlcnMuCgoxMS8xNi8yMDA3OiBvbGx5CgkgICAgW1B5dGhvbl0gRG9uJ3QgcGFzcyBQeV9zc2l6ZV90IGZvciBhICVkIHByaW50Zi1saWtlIGZvcm1hdCBhcwoJICAgIHRoYXQncyB1bmRlZmluZWQgYmVoYXZpb3VyIHdoZW4gc2l6ZW9mKFB5X3NzaXplX3QpICE9IHNpemVvZihpbnQpLgoKVmVyc2lvbiAxLjMuMzIgKE5vdmVtYmVyIDE1LCAyMDA3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMS8xNC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gUGFja2FnZSBuYW1lIGFuZCBkbGwgbmFtZSBpcyBub3cgdGhlIHNhbWUgYXMgdGhlIFNXSUcgbW9kdWxlCiAgICAgICAgICAgIG5hbWUuIEl0IHVzZWQgdG8gYmUgdGhlIG1vZHVsZSBuYW1lIHdpdGggX3dyYXAgYXMgYSBzdWZmaXguIFRoZSBwYWNrYWdlCiAgICAgICAgICAgIGFuZCBkbGwgbmFtZXMgY2FuIGJlIG1vZGlmaWVkIHVzaW5nIHRoZSAtcGFja2FnZSBhbmQgLWRsbCBjb21tYW5kbGluZQogICAgICAgICAgICBvcHRpb25zLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8xMS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gQWRkIHN1cHBvcnQgZm9yIFdpbmRvd3MgKFZpc3VhbCBDKysgOCB0ZXN0ZWQpCgoxMS8xMC8yMDA3OiBvbGx5CgkgICAgW3BocF0gRml4IG1ha2VmaWxlIGdlbmVyYXRlZCBieSAtbWFrZSAoU0YjMTYzMzY3OSkuICBVcGRhdGUKCSAgICBkb2N1bWVudGF0aW9uIHRvIG1hcmsgIi1tYWtlIiBhcyBkZXByZWNhdGVkIChub25lIG9mIHRoZSBvdGhlcgoJICAgIFNXSUcgYmFja2VuZHMgc2VlbSB0byBvZmZlciBzdWNoIGEgZmVhdHVyZSwgaXQgY2FuJ3QgcmVhbGlzdGljYWxseQoJICAgIGdlbmVyYXRlIGEgZnVsbHkgcG9ydGFibGUgbWFrZWZpbGUsIGFuZCB0aGUgY29tbWFuZHMgdG8gYnVpbGQgYW4KCSAgICBleHRlbnNpb24gYXJlIGVhc3kgZW5vdWdoIHRvIHdyaXRlIGZvciB0aGUgdXNlcidzIHByZWZlcnJlZCBidWlsZAoJICAgIHRvb2wpLiAgQWxzbyByZWNvbW1lbmQgYWdhaW5zdCB0aGUgdXNlIG9mICItcGhwZnVsbCIgKGl0J3Mgb25seQoJICAgIHJlYWxseSB1c2VmdWwgd2hlbiBzdGF0aWMgbGlua2luZywgYW5kIGEgZHluYW1pY2FsbHkgbG9hZGFibGUKCSAgICBtb2R1bGUgaXMgdmlydHVhbGx5IGFsd2F5cyB0aGUgYmV0dGVyIGFwcHJvYWNoKS4KCjExLzA5LzIwMDc6IG9sbHkKCSAgICBGaXggLS1oZWxwIG91dHB1dCB0byBub3RlIHRoYXQgYGV4cG9ydCBTV0lHX0ZFQVRVUkVTJyBpcyByZXF1aXJlZC4KCjEwLzI5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSBGaXggc2VnIGZhdWx0IG9uIFdpbmRvd3MKICAgICAgICAgICAgW1JdIEV4YW1wbGVzIFIgc2NyaXB0cyBhcmUgbm93IHBsYXRmb3JtIGluZGVwZW5kZW50CgoxMC8zMC8yMDA3OiBtZ29zc2FnZQoJICAgIFtsdWFdIGZpeGVkIGJ1ZyBpbiB0ZW1wbGF0ZSBjbGFzc2VzIHdoaWNoIGNhc2VzIHRlbXBsYXRlX2RlZmF1bHQyCgkgICAgYW5kIHRlbXBsYXRlX3NwZWNpYWxpemF0aW9uX2RlZmFyZyB0byBmYWlsLgoJICAgIEFkZGVkIHNldmVyYWwgd2FybmluZyBmaWx0ZXJzIGludG8gdGhlIG92ZXJsb2FkJ3MgdGVzdCBjYXNlcy4KCSAgICBBZGRlZCBydW50aW1lIHRlc3RzIGZvciBzZXZlcmFsIGNvZGVzLgoJICAgIFlvdSBjYW4gbm93IG1ha2UgY2hlY2stbHVhLXRlc3Qtc3VpdGUgd2l0aCBubyBlcnJvcnMgYW5kIG9ubHkgYSBmZXcgd2FybmluZ3MuCgoxMC8zMC8yMDA3OiBvbGx5CgkgICAgW2d1aWxlXSBGaXggdGhlIGNvbmZpZ3VyZSB0ZXN0IHRvIHB1dCBHVUlMRUxJTksgaW4gTElCUyBub3QgTERGTEFHUwoJICAgIChTRiMxODIyNDMwKS4KCjEwLzMwLzIwMDc6IG9sbHkKCSAgICBbZ3VpbGVdIEZpeCB0aGUgZ3VpbGUgZXhhbXBsZXMgb24gNjQtYml0IHBsYXRmb3Jtcy4KCjEwLzI5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IG1lbWJlciBwb2ludGVycyBvbiA2NCBiaXQgcGxhdGZvcm1zLgoKMTAvMjgvMjAwNzogb2xseQoJICAgIFtsdWFdIEZpeCBzd2lnX2x1YV9jbGFzcyBpbnN0YW5jZXMgdG8gYmUgc3RhdGljIHRvIGFsbG93IG11bHRpcGxlCgkgICAgU1dJRyB3cmFwcGVycyB0byBiZSBjb21waWxlZCBpbnRvIHRoZSBzYW1lIGV4ZWN1dGFibGUgc3RhdGljYWxseS4KCSAgICBQYXRjaCBmcm9tIEFuZHJlYXMgRnJlZHJpa3Nzb24gKHBvc3RlZCB0byB0aGUgc3dpZyBtYWlsaW5nIGxpc3QpLgoKMTAvMjgvMjAwNzogb2xseQoJICAgIFtsdWFdIEZpeCBFeGFtcGxlcy9sdWEgdG8gcGFzcyBTUkNTIGZvciBDIHRlc3RzIHJhdGhlciB0aGFuIENYWFNSQ1MuCgkgICAgVGhlIGNvZGUgYXMgaXQgd2FzIGhhcHBlbmVkIHRvIHdvcmsgb24geDg2LCBidXQgYnJva2Ugb24geDg2XzY0IChhbmQKCSAgICBwcm9iYWJseSBhbnkgb3RoZXIgcGxhdGZvcm1zIHdoaWNoIHJlcXVpcmUgLWZQSUMpLgoKMTAvMjgvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBOZXcgYXBwcm9hY2ggZm9yIGZpeGluZyB1bmluaXRpYWxpc2VkIHZhcmlhYmxlIHVzYWdlIG9uIGVycm9yIGluIGRpcmVjdG9yCiAgICAgICAgICAgIG1ldGhvZHMgdXNpbmcgdGhlIG5ldyB0ZW1wbGF0ZWQgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb24gU3dpZ1ZhbHVlSW5pdCgpLgoKMTAvMjgvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIFVzZSBtb3JlIGVmZmljaWVudCBTdlBWX25vbGVuKHgpIGluc3RlYWQgb2YgU3ZQVih4LFBMX25hKSBpZiBTdlBWX25vbGVuIGlzCiAgICAgICAgICAgIHN1cHBvcnRlZC4KCjEwLzI2LzIwMDc6IHd1enplYgoJICAgIFtDaGlja2VuXSBGaXggZ2xvYmFsIHZhcmlhYmxlcyBvZiBjbGFzcyBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMuCgkgICAgT3RoZXIgbWlub3IgZml4ZXMsIHNvIGFsbCB0ZXN0cyBpbiB0aGUgY2hpY2tlbiB0ZXN0IHN1aXRlIG5vdyBwYXNzCgoxMC8yNS8yMDA3OiBvbGx5CgkgICAgRml4IFVUTCB0eXBlY2hlY2sgbWFjcm8gZm9yIGEgZnVuY3Rpb24gdGFraW5nIGNoYXJbXSBvciBjb25zdAoJICAgIGNoYXJbXSAoU0YjMTgyMDEzMikuCgoxMC8yMi8yMDA3OiBta29lcHBlCgkgICAgW0d1aWxlXSBGaWx0ZXIgb3V0IC1hbnNpIC1wZWRhbnRpYyBmcm9tIENGTEFHUyB3aGlsZSBjb21waWxpbmcgdGVzdCBwcm9ncmFtcyBmb3IgR3VpbGUKCSAgICBpbiBjb25maWd1cmUuICBUaGlzIGVuYWJsZXMgcnVubmluZyB0aGUgdGVzdCBzdWl0ZSBmb3IgR3VpbGUgaWYgaXQgaXMgaW5zdGFsbGVkIGFuZAoJICAgIHVzYWJsZS4KCjEwLzIyLzIwMDc6IG1rb2VwcGUKCSAgICBbR3VpbGUgLXNjbV0gRml4IHRlc3RjYXNlcyBhcHBseV9zaWduZWRfY2hhciBhbmQgYXBwbHlfc3RyaW5ncwoJICAgIGJ5IGFkZGluZyBleHBsaWNpdCBjYXN0cyB0byB0aGUgYXBwcm9wcmlhdGUgJGx0eXBlLgoKMTAvMjIvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXggdW5pbml0aWFsaXNlZCB2YXJpYWJsZSB1c2FnZSBvbiBlcnJvciBpbiBkaXJlY3RvciBtZXRob2RzLgoKMTAvMTkvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBCdWcgIzE3OTQyNDcgLSBmaXggZ2VuZXJhdGVkIGNvZGUgZm9yIGRlcml2ZWQgY2xhc3NlcyB3aGVuIGNzYmFzZSBvciBqYXZhYmFzZQogICAgICAgICAgICB0eXBlbWFwcyBhcmUgdXNlZCB3aXRoIHRoZSByZXBsYWNlPSIxIiBhdHRyaWJ1dGUuCgoxMC8xOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBEb2NzIHVwZGF0ZWQgdG8gc3VnZ2VzdCB1c2luZyBkaXN0dXRpbHMuIFBhdGNoICMxNzk2NjgxIGZyb20gQ2hyaXN0b3BoZXIgQmFya2VyLgoKMTAvMTkvMjAwNzogb2xseQoJICAgIFtwZXJsNV0gQ2xlYXIgZXJybm8gYmVmb3JlIGNhbGxzIHRvIHN0cnRvbCgpLCBzdHJ0b3VsKCksIHN0cnRvbGwoKQoJICAgIGFuZCBzdHJ0b3VsbCgpIHdoaWNoIHdlIGNoZWNrIGVycm5vIGFmdGVyIHRvIGF2b2lkIHNlZWluZyBhIGp1bmsKCSAgICB2YWx1ZSBvZiBlcnJubyBpZiB0aGVyZSBpc24ndCBhbiBlcnJvciBpbiB0aGUgY2FsbC4KCjEwLzE2LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIERlcHJlY2F0ZSAlYXR0cmlidXRlX3JlZiBhbmQgcmVwbGFjZSB3aXRoICVhdHRyaWJ1dGVyZWYuIFRoZXJlIGlzIGp1c3QgYW4gYXJndW1lbnQKICAgICAgICAgICAgb3JkZXIgY2hhbmdlIGluIG9yZGVyIHRvIG1haW50YWluIGNvbnNpc3RlbmN5IHdpdGggJWF0dHJpYnV0ZSwgZnJvbToKCiAgICAgICAgICAgICAgJWF0dHJpYnV0ZV9yZWYoQ2xhc3MsIEF0dHJpYnV0ZVR5cGUsIEFjY2Vzc29yTWV0aG9kLCBBdHRyaWJ1dGVOYW1lKQogICAgICAgICAgICB0bwogICAgICAgICAgICAgICVhdHRyaWJ1dGVyZWYoQ2xhc3MsIEF0dHJpYnV0ZVR5cGUsIEF0dHJpYnV0ZU5hbWUsIEFjY2Vzc29yTWV0aG9kKQoKMTAvMTYvMjAwNzogb2xseQoJICAgIFtUY2xdIEZpeCBzZXZlcmFsIG9jdXJyZW5jZXMgb2YgIndhcm5pbmc6IGRlcHJlY2F0ZWQgY29udmVyc2lvbgoJICAgIGZyb20gc3RyaW5nIGNvbnN0YW50IHRvICdjaGFyKiciIGZyb20gR0NDIDQuMiBpbiBnZW5lcmF0ZWQgQy9DKysKCSAgICBjb2RlLgoKMTAvMTYvMjAwNzogb2xseQoJICAgIFtQSFBdIEZpeCBtYW55IG9jY3VycmVuY2VzIG9mICJ3YXJuaW5nOiBkZXByZWNhdGVkIGNvbnZlcnNpb24gZnJvbQoJICAgIHN0cmluZyBjb25zdGFudCB0byAnY2hhcionIiBmcm9tIEdDQyA0LjIgaW4gZ2VuZXJhdGVkIEMvQysrIGNvZGUKCSAgICB3aGVuIGNvbXBpbGluZyB3aXRoIGEgbmV3IGVub3VnaCB2ZXJzaW9uIG9mIFBIUCA1ICh0ZXN0ZWQgd2l0aAoJICAgIFBIUCA1LjIuMywgYnV0IFBIUCA1LjIuMSBpcyBwcm9iYWJseSB0aGUgbWluaW11bSByZXF1aXJlbWVudCkuCgoxMC8xNS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCAjMTc5NzEzMyBmcm9tIERhdmlkIFBpZXBncmFzcyBmaXhlcyAlYXR0cmlidXRlIHdoZW4gdGhlIGdldHRlciBoYXMgdGhlIHNhbWUgbmFtZQogICAgICAgICAgICBhcyB0aGUgYXR0cmlidXRlIG5hbWUgYW5kIG5vIGxvbmdlciBnZW5lcmF0ZSBub24tZnVuY3Rpb25hbCBzZXR0ZXIgZm9yIHJlYWQtb25seSBhdHRyaWJ1dGVzLgoKMTAvMTUvMjAwNzogb2xseQoJICAgIFtUY2xdIFByZXZlbnQgU1dJR19UY2xfQ29udmVydFB0ciBmcm9tIGNhbGxpbmcgdGhlIHVua25vd24gcHJvYy4KCSAgICBBZGQgRXhhbXBsZXMvdGNsL3N0ZF92ZWN0b3IvIHdoaWNoIHRoaXMgY2hhbmdlIGZpeGVzLiAgUGF0Y2gKCSAgICBpcyBmcm9tICJDbGlmZiBDIiBpbiBTRiMxODA5ODE5LgoKMTAvMTIvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFkZCBEZXRhY2hDdXJyZW50VGhyZWFkIGJhY2sgaW4gZm9yIGRpcmVjdG9ycy4gU2VlIGVudHJ5IGRhdGVkIDA4LzExLzIwMDYgYW5kCiAgICAgICAgICAgIHNlYXJjaCBmb3IgRGV0YWNoQ3VycmVudFRocmVhZCBvbiB0aGUgbWFpbGluZyBsaXN0cyBmb3IgZGV0YWlscy4gVGhlIGNyYXNoZXMgb24gU29sYXJpcwogICAgICAgICAgICBzZWVtIHRvIGJlIG9ubHkgcHJlc2VudCBpbiBqZGstMS40LjIgYW5kIGxvd2VyIChqZGstMS41LjAgYW5kIGpkay0xLjYuMCBhcmUgb2theSksIHNvCiAgICAgICAgICAgIGFueW9uZSB1c2luZyBkaXJlY3RvcnMgc2hvdWxkIHVzZSBhIHJlY2VudCBqZGsgb24gU29sYXJpcywgb3IgZGVmaW5lIChzZWUgZGlyZWN0b3Iuc3dnKQogICAgICAgICAgICBTV0lHX0pBVkFfTk9fREVUQUNIX0NVUlJFTlRfVEhSRUFEIHRvIHRoZSBDKysgY29tcGlsZXIgdG8gZ2V0IG9sZCBiZWhhdmlvdXIuCgoxMC8xMi8yMDA3OiB3c2Z1bHRvbgoJICAgIFtKYXZhXSBFbnN1cmUgdGhlIHByZW1hdHVyZSBnYXJiYWdlIGNvbGxlY3Rpb24gcHJldmVudGlvbiBwYXJhbWV0ZXIgKHBnY3BwKSBpcyBnZW5lcmF0ZWQKICAgICAgICAgICAgd2hlbiB0aGVyZSBhcmUgQyBjb21tZW50cyBpbiB0aGUganR5cGUgYW5kIGpzdHlwZSB0eXBlbWFwcy4KCjEwLzEyLzIwMDc6IHd1enplYgoJICAgIEFkZGVkIGEgdGVzdHN1aXRlIGVudHJ5IGZvciBCdWcgIzE3MzU5MzEKCjEwLzA5LzIwMDc6IG9sbHkKCSAgICBBdXRvbWF0aWNhbGx5IHJlcnVuIGF1dG9nZW4uc2ggaWYgY29uZmlndXJlLmluIGlzIG1vZGlmaWVkLgoKMTAvMDkvMjAwNzogb2xseQoJICAgIEVuaGFuY2UgY2hlY2stJS10ZXN0LXN1aXRlIHJ1bGUgYW5kIGZyaWVuZHMgdG8gZ2l2ZSBhIG1vcmUgaGVscGZ1bAoJICAgIGVycm9yIG1lc3NhZ2UgaWYgeW91IHRyeSB0aGVtIGZvciBhIGxhbmd1YWdlIHdoaWNoIGRvZXNuJ3QgZXhpc3QKCSAgICAoZS5nLiAibWFrZSBjaGVjay1waHAtdGVzdC1zdWl0ZSIgcmF0aGVyIHRoYW4gdGhlIGNvcnJlY3QKCSAgICAibWFrZSBjaGVjay1waHA0LXRlc3Qtc3VpdGUiKS4KCjEwLzA5LzIwMDc6IG9sbHkKCSAgICBBZGQgbWFrZSBydWxlIHRvIHJlZ2VuZXJhdGUgTWFrZWZpbGUgZnJvbSBNYWtlZmlsZS5pbiBpZiBpdCBoYXMKCSAgICBjaGFuZ2VkLgoKMTAvMDkvMjAwNzogb2xseQoJICAgIFtwaHBdIEZpeCBsb25nLXN0YW5kaW5nIG1lbW9yeSBsZWFrIGluIHdyYXBwZWQgY29uc3RydWN0b3JzIGFuZAoJICAgIHdyYXBwZWQgZnVuY3Rpb25zL21ldGhvZHMgd2hpY2ggcmV0dXJuIGFuIG9iamVjdC4KCjEwLzA4LzIwMDc6IG9sbHkKCSAgICBGaXggTWFrZWZpbGUuaW4gdG8gcmVhZCBjaGVjay5saXN0IGZpbGVzIGNvcnJlY3RseSBpbiBhIFZQQVRICgkgICAgYnVpbGQuCgoxMC8wNy8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIEV4cGVyaW1lbnRhbCBzaGFyZWRfcHRyIHR5cGVtYXBzIGFkZGVkCgowOS8yNy8yMDA3OiBtZ29zc2FnZQoJICAgIFtsdWFdIGFkZGVkIG1vcmUgdmVyYm9zZSBlcnJvciBtZXNzYWdlcyBmb3IgaW5jb3JyZWN0IHR5cGVjaGVja3MuCgkgICAgQWRkZWQgYSByb3V0aW5lIHdoaWNoIGNoZWNrcyB0aGUgZXhhY3QgbnVtYmVyIG9mIHBhcmFtZXRlcnMgcGFzc2VkIHRvIGEgZnVuY3Rpb24KCSAgICAoYnJlYWtzIG9wZXJhdG9yX292ZXJsb2FkaW5nIGZvciB1bmFyeSBtaW51cyBvcGVyYXRvciwgY3VycmVudGx5IGRpc2FibGVkKS4KCSAgICBSZW9yZ2FuaXNlZCB0aGUgbHVhdHlwZW1hcHMuc3dnIHRvIHRpZHkgaXQgdXAuCgkgICAgQWRkZWQgYSBsb3Qgb2YgJWlnbm9yZXMgb24gdGhlIG9wZXJhdG9ycyBub3Qgc3VwcG9ydGVkIGJ5IGx1YS4KCSAgICBBZGRlZCBzdXBwb3J0IGZvciBjb25zdGFudCBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMgJiBydW50ZXN0IGZvciBtZW1iZXJfcG9pbnRlci5pCgkgICAgQWRkZWQgZmlyc3QgdmVyc2lvbiBvZiB3Y2hhci5pCgowOS8yNS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIHRocm93cyB0eXBlbWFwcyBmb3Igc3RkOjp3c3RyaW5nIHVzaW5nIEMjIHBhdGNoICMxNzk5MDY0IGZyb20gRGF2aWQgUGllcGdyYXNzCgowOS8yNC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbVGNsXSBBcHBseSAjMTc3MTMxMyB0byBmaXggYnVnICMxNjUwMjI5IC0gZml4ZXMgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcKICAgICAgICAgICAgaGFuZGxpbmcuCgowOS8yMC8yMDA3OiBvbGx5CgkgICAgW0phdmFdIEVsaW1pbmF0ZSBzb21lIHVubmVjZXNzYXJ5IHVzZXMgb2YgYSB0ZW1wb3JhcnkgYnVmZmVyCgkgICAgYWxsb2NhdGVkIHVzaW5nIG5ld1tdLiAgU0YjMTc5NjYwOS4KCjA5LzE5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gVGhlICRjc2lucHV0IHNwZWNpYWwgdmFyaWFibGUgY2FuIGJlIHVzZWQgaW4gdGhlIGNzdmFyaW4gdHlwZW1hcCB3aGVyZSBpdCBpcyBhbHdheXMKICAgICAgICAgICAgZXhwYW5kZWQgdG8gJ3ZhbHVlJy4KCjA5LzE5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IGJ1ZyByZXBvcnRlZCBieSBHbGVubiBBIFdhdHNvbiBhbmQgIzE3OTUyNjAgd2hlcmUgdGhlIGNzdHlwZSB0eXBlbWFwIHVzZWQgdGhlICdyZWYnCiAgICAgICAgICAgIGtleXdvcmQgaW4gdGhlIHR5cGVtYXAgYm9keSwgaXQgcHJvZHVjZWQgdW5jb21waWxhYmxlIEMjIHByb3BlcnRpZXMgKHZhcmlhYmxlIHdyYXBwZXJzKS4KICAgICAgICAgICAgVGhlIHR5cGUgZm9yIHRoZSBwcm9wZXJ0eSBub3cgY29ycmVjdGx5IGNvbWVzIGZyb20gdGhlICdvdXQnIGF0dHJpYnV0ZSBpbiB0aGUgY3N0eXBlIHR5cGVtYXAuCgowOS8xOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IGNvbnN0IHN0ZDo6d3N0cmluZyYgdHlwZW1hcHMKCjA5LzE5LzIwMDc6IHdzZnVsdG9uCgkgICAgW0phdmFdIEVuc3VyZSB0aGUgcHJlbWF0dXJlIGdhcmJhZ2UgY29sbGVjdGlvbiBwcmV2ZW50aW9uIHBhcmFtZXRlciAocGdjcHApIGlzIGdlbmVyYXRlZAogICAgICAgICAgICB3aGVyZSBhIHBhcmFtZXRlciBpcyBwYXNzZWQgYnkgcG9pbnRlciByZWZlcmVuY2UsIGVnIGluIHRoZSBzdGQ6OnZlY3RvciB3cmFwcGVycy4gVGhlIHBnY3BwCiAgICAgICAgICAgIGlzIGFsc28gZ2VuZXJhdGVkIG5vdyB3aGVuIHVzZXIncyBjdXN0b20gdHlwZW1hcHMgdXNlIGEgcHJveHkgY2xhc3MgaW4gdGhlIGpzdHlwZSB0eXBlbWFwCiAgICAgICAgICAgIGFuZCBhICdsb25nJyBpbiB0aGUganR5cGUgdHlwZW1hcC4KCjA5LzE4LzIwMDc6IG9sbHkKCSAgICBbcGhwXSBBZGQgdHlwZW1hcHMgZm9yIGhhbmRsaW5nIHBhcmFtZXRlcnMgb2YgdHlwZSBzdGQ6OnN0cmluZyAmCgkgICAgd2hpY2ggYXJlIG1vZGlmaWVkIGJ5IHRoZSB3cmFwcGVkIGZ1bmN0aW9uLgoKMDkvMTcvMjAwNzogb2xseQoJICAgIFtweXRob25dIFNwbGl0IHBvdGVudGlhbGx5IGxvbmcgc3RyaW5nIGxpdGVyYWxzIHRvIGF2b2lkIGhpdHRpbmcKCSAgICBNU1ZDJ3MgbG93IGZpeGVkIGxpbWl0IG9uIHN0cmluZyBsaXRlcmFsIGxlbmd0aCAtIHBhdGNoIGZyb20KCSAgICBTRiMxNzIzNzcwLCBhbHNvIHJlcG9ydGVkIGFzIFNGIzE2MzA4NTUuCgowOS8xNy8yMDA3OiBvbGx5CgkgICAgW29jYW1sXSBGaXggcmVuYW1pbmcgb2Ygb3ZlcmxvYWRlZCBtZXRob2RzIGluIHRoZSBtZXRob2RfdGFibGUgLQoJICAgIG15IHBhdGNoIGZyb20gU0YjOTQwMzk5LgoKMDkvMTcvMjAwNzogb2xseQoJICAgIFtweXRob25dIFNpbXBsZXIgY29kZSBmb3IgU1dJR19Bc1ZhbF9ib29sKCkgd2hpY2ggZml4ZXMgYSAic3RyaWN0CgkgICAgYWxpYXNpbmciIHdhcm5pbmcgZnJvbSBHQ0MgLSBwYXRjaCBmcm9tIFNGIzE3MjQ1ODEgYnkgQW5kcmV3CgkgICAgQmF1bWFubi4KCjA5LzE3LzIwMDc6IG9sbHkKCSAgICBbcGVybDVdIFVzZSBzdl9zZXRwdm4oKSB0byBzZXQgYSBzY2FsYXIgZnJvbSBhIHBvaW50ZXIgYW5kIGxlbmd0aAoJICAgIC0gcGF0Y2ggZnJvbSBTRiMxNzQ0NjAgYnkgIm1hdHN1YmFyYXkiLgoKMDkvMTcvMjAwNzogb2xseQoJICAgIFdoZW4gd3JhcHBpbmcgQysrIGNvZGUsIGdlbmVyYXRlIGNvZGUgd2hpY2ggdXNlcwoJICAgIHN0ZDo6c3RyaW5nOjphc3NpZ24oUFRSLCBMRU4pIHJhdGhlciB0aGFuIGFzc2lnbmluZwoJICAgIHN0ZDo6c3RyaW5nKFBUUiwgTEVOKS4gIFVzaW5nIGFzc2lnbiBnZW5lcmF0ZXMgbW9yZSBlZmZpY2llbnQgY29kZQoJICAgICh0ZXN0ZWQgd2l0aCBHQ0MgNC4xLjIpLgoKMDkvMDcvMjAwNzogd3NmdWx0b24KCSAgICBGaXggJWlnbm9yZSBvbiBjb25zdHJ1Y3RvcnMgd2hpY2ggYXJlIG5vdCBleHBsaWNpdGx5IGRlY2xhcmVkIFtTRiAjMTc3NzcxMl0KCjA5LzA1LzIwMDc6IHd1enplYiAoSm9obiBMZW56KQoJICAgIC0gQ2hhbmdlIHJfbHR5cGUgaW4gdHlwZXN5cy5jIHRvIHN0b3JlIGEgaGFzaHRhYmxlIGluc3RlYWQgb2YgYSBzaW5nbGUgdmFsdWUuCgkgICAgICBzZXZlcmFsIHZlcnkgc3VidGxlIGJ1Z3Mgd2VyZSBiZWluZyBjYXVzZWQgYnkgbXVsdGlwbGUgbHR5cGVzIGJlaW5nIG1hcHBlZAoJICAgICAgdG8gYSBzaW5nbGUgbWFuZ2xlZCB0eXBlLCBtb3N0bHkgd2hlbiB1c2luZyB0eXBlZGVmZWQgdGVtcGxhdGUgcGFyYW1ldGVycy4KCSAgICAgIE5vdywgcl9sdHlwZSBzdG9yZXMgYSBoYXNodGFibGUgb2YgcG9zc2libGUgbHR5cGVzLCBhbmQgd2hlbiBnZW5lcmF0aW5nIHRoZQoJICAgICAgdHlwZSB0YWJsZSwgYWxsIHRoZSBsdHlwZXMgYXJlIGFkZGVkIGludG8gdGhlIHN3aWdfdHlwZV9pbmZvIHN0cnVjdHVyZS4KCjA4LzMxLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFNGICMxNzU0OTY3IGZyb20gSmFtZXMgQmlnbGVyLgogICAgICAgICAgICAtIEZpeCBidWcgaW4gdHVybmluZyBvbiB3YXJuaW5ncyB0aGF0IHdlcmUgdHVybmVkIG9mZiBieSBkZWZhdWx0LiBFZyAnc3dpZyAtdyszMDknIHdpbGwgbm93CiAgICAgICAgICAgICAgdHVybiBvbiB0aGUgbm9ybWFsbHkgc3VwcHJlc3NlZCB3YXJuaW5nIDMwOS4KCiAgICAgICAgICAgIC0gTmV3IC1XZXh0cmEgY29tbWFuZGxpbmUgb3B0aW9uIHdoaWNoIGVuYWJsZXMgdGhlIGV4dHJhIHdhcm5pbmcgbnVtYmVyczoKICAgICAgICAgICAgICAyMDIsMzA5LDQwMyw1MTIsMzIxLDMyMiAodGhpcyBpcyB0aGUgbGlzdCBvZiB3YXJuaW5ncyB0aGF0IGhhdmUgYWx3YXlzIGJlZW4gc3VwcHJlc3NlZCBieQogICAgICAgICAgICAgIGRlZmF1bHQpLiBCeSBzcGVjaWZ5aW5nIC1XZXh0cmEsIGFsbCB3YXJuaW5ncyB3aWxsIGJlIHR1cm5lZCBvbiwgYnV0IHVubGlrZSAtV2FsbCwKICAgICAgICAgICAgICB3YXJuaW5ncyBjYW4gc3RpbGwgYmUgc2VsZWN0aXZlbHkgdHVybmVkIG9uL29mZiB1c2luZyAld2FybmZpbHRlciwKICAgICAgICAgICAgICAjcHJhZ21hIFNXSUcgbm93YXJuIG9yIGZ1cnRoZXIgLXcgY29tbWFuZGxpbmUgb3B0aW9ucywgZWc6CiAgICAgICAgICAgICAgICBzd2lnIC1XZXh0cmEgLXczMDkKICAgICAgICAgICAgICB3aWxsIHR1cm4gb24gYWxsIHdhcm5pbmdzIGV4Y2VwdCAzMDkuCgowOC8yOC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICAtIE5ldyBkZWJ1Z2dpbmcgb3B0aW9ucywgLWRlYnVnLW1vZHVsZSA8bj4gYW5kIC1kZWJ1Zy10b3AgPG4+IHRvIGRpc3BsYXkgdGhlIHBhcnNlIHRyZWUgYXQKICAgICAgICAgICAgICB2YXJpb3VzIHN0YWdlcywgd2hlcmUgPG4+IGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2Ygc3RhZ2VzIDEtNC5Gb3IgZXhhbXBsZSwgdG8KICAgICAgICAgICAgICBkaXNwbGF5IHRvcCBvZiBwYXJzZSB0cmVlIGF0IHN0YWdlcyAxIGFuZCAzOgogICAgICAgICAgICAgICAgc3dpZyAtZGVidWctdG9wIDEsMwoKICAgICAgICAgICAgLSBEZXByZWNhdGUgdGhlIGZvbGxvd2luZyBvcHRpb25zIHdoaWNoIGhhdmUgZXF1aXZhbGVudHMgYmVsb3c6CiAgICAgICAgICAgICAgLWR1bXBfcGFyc2VfbW9kdWxlICAgID0+ICAgLWRlYnVnLW1vZHVsZSAxCiAgICAgICAgICAgICAgLWR1bXBfbW9kdWxlICAgICAgICAgID0+ICAgLWRlYnVnLW1vZHVsZSA0CiAgICAgICAgICAgICAgLWR1bXBfcGFyc2VfdG9wICAgICAgID0+ICAgLWRlYnVnLXRvcCAxCiAgICAgICAgICAgICAgLWR1bXBfdG9wICAgICAgICAgICAgID0+ICAgLWRlYnVnLXRvcCA0CgogICAgICAgICAgICAtIFJlbmFtZWQgc29tZSBjb21tYW5kbGluZSBvcHRpb25zIGZvciBuYW1pbmcgY29uc2lzdGVuY3kgYWNyb3NzIGFsbCBvcHRpb25zOgogICAgICAgICAgICAgIC1kZWJ1Z190ZW1wbGF0ZSAgPT4gICAtZGVidWctdGVtcGxhdGUKICAgICAgICAgICAgICAtZGVidWdfdHlwZW1hcCAgID0+ICAgLWRlYnVnLXR5cGVtYXAKICAgICAgICAgICAgICAtZHVtcF9jbGFzc2VzICAgID0+ICAgLWRlYnVnLWNsYXNzZXMKICAgICAgICAgICAgICAtZHVtcF90YWdzICAgICAgID0+ICAgLWRlYnVnLXRhZ3MKICAgICAgICAgICAgICAtZHVtcF90eXBlZGVmICAgID0+ICAgLWRlYnVnLXR5cGVkZWYKICAgICAgICAgICAgICAtZHVtcF9tZW1vcnkgICAgID0+ICAgLWRlYnVnLW1lbW9yeQoKMDgvMjUvMjAwNzogb2xseQoJICAgIFtQSFA1XSBGaXggaGFuZGxpbmcgb2YgZG91YmxlIG9yIGZsb2F0IHBhcmFtZXRlcnMgd2l0aCBhbiBpbnRlZ2VyCgkgICAgZGVmYXVsdCB2YWx1ZS4KCjA4LzI1LzIwMDc6IG9sbHkKCSAgICBbUEhQNV0gR2VuZXJhdGUgX19pc3NldCgpIG1ldGhvZHMgZm9yIHNldHRlcnMgZm9yIFBIUCA1LjEgYW5kIGxhdGVyLgoKMDgvMjAvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEgQyNdIEZpeCBkaXJlY3RvciBidWcgIzE3NzY2NTEgcmVwb3J0ZWQgYnkgU3RlcGhhbmUgUm91dGVsb3VzIHdoaWNoIG9jY3VycmVkIHdoZW4KICAgICAgICAgICAgdGhlIGRpcmVjdG9yIGNsYXNzIG5hbWUgaXMgdGhlIHNhbWUgYXMgdGhlIHN0YXJ0IG9mIHNvbWUgb3RoZXIgc3ltYm9scyB1c2VkIHdpdGhpbgogICAgICAgICAgICB0aGUgZGlyZWN0b3IgY2xhc3MuCgowOC8xNy8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBDb3JyZWN0IGJlaGF2aW91ciBmb3IgdGVtcGxhdGVkIG1ldGhvZHMgdXNlZCB3aXRoICVyZW5hbWUgb3IgJWlnbm9yZSBhbmQgdGhlIGVtcHR5CiAgICAgICAgICAgIHRlbXBsYXRlIGRlY2xhcmF0aW9uIC0gJXRlbXBsYXRlKCkuIEEgd2FybmluZyBpcyBpc3N1ZWQgaWYgdGhlIG1ldGhvZCBoYXMgbm90IGJlZW4KICAgICAgICAgICAgcmVuYW1lZC4KCjA4LzE2LzIwMDc6IG11dGFuZGl6IChNaWtlbCBCYW5jcm9mdCkKCSAgICBbYWxsZWdyb2NsXSBOYW1lIGdlbmVyYXRlZCBjbCBmaWxlIGJhc2VkIG9uIGlucHV0IGZpbGUgcmF0aGVyIHRoYW4gYnkKCSAgICBtb2R1bGUgbmFtZS4gSXQgd2FzIHBvc3NpYmxlIHRvIGVuZCB1cCB3aXRoIGEgbXlwYWNrYWdlLmNsIGFuZCBhIHRlc3Rfd3JhcC5jCgkgICAgd2hlbiBwYXJzaW5nIGEgdGVzdC5pIGlucHV0IGZpbGUuIENvbmZ1c2luZy4gQWxzbywgaW5jbHVkZSBleHRlcm5hbC1mb3JtYXQKCSAgICB0ZW1wbGF0ZXMgZm9yIDpmYXQgYW5kIDpmYXQtbGUgYXV0b21hdGljYWxseSB0byBhdm9pZCB0aGVzZSBiZWluZyBjb21waWxlZAoJICAgIGF0IHJ1bnRpbWUuCgowOC8xNS8yMDA3OiBlZnV6enlvbmUKICAgICAgICAgICAgW2NmZmldIEFwcGx5IHBhdGNoICMxNzY2MDc2IGZyb20gTGVpZ2ggU21pdGggYWRkaW5nIHN1cHBvcnQgZm9yIG5ld2x5IGludHJvZHVjZWQKICAgICAgICAgICAgaW4gY2ZmaSA6bG9uZy1sb25nIGFuZCA6dW5zaWduZWQtbG9uZy1sb25nLgoKMDgvMTAvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFkZCBkb2N1bWVudGF0aW9uIHBhdGNoICMxNzQzNTczIGZyb20gSmVmZnJleSBTb3JlbnNlbi4gSXQgY29udGFpbnMgYSBuZWF0CiAgICAgICAgICAgIGlkZWEgd2l0aCByZXNwZWN0IHRvIGJldHRlciBtZW1vcnkgbWFuYWdlbWVudCBieSB0aGUgSlZNIG9mIEMrKyBhbGxvY2F0ZWQgbWVtb3J5LgoKMDgvMTAvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIEFwcGx5IHBhdGNoICMxNzcxNDEwIGZyb20gV2FkZSBCcmFpbmVyZCB0byBmaXggdHlwZWRlZiBYUyhTd2lnUGVybFdyYXBwZXIpIGluCiAgICAgICAgICAgIHBlcmxydW4uc3dnIGZvciBBY3RpdmVTdGF0ZSBQZXJsIGJ1aWxkIDgyMiBhbmQgUGVybCA1LjguOSBhbmQgNS4xMCBicmFuY2hlcy4KCjA4LzEwLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIGNvbnN0IGVudW0gcmVmZXJlbmNlIHR5cGVtYXBzIGZpeGVkLgoKMDgvMDkvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGRlZCBtaXNzaW5nIHN1cHBvcnQgZm9yIEMrKyBjbGFzcyBtZW1iZXIgcG9pbnRlcnMuCgowOC8wOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIEFkZCBzdXBwb3J0IGZvciAkb3duZXIgaW4gdGhlICJvdXQiIHR5cGVtYXBzIGxpa2UgaW4gdGhlIHNjcmlwdGluZwogICAgICAgICAgICBsYW5ndWFnZSBtb2R1bGVzLiBOb3RlIHRoYXQgJG93bmVyIGhhcyBhbHdheXMgYmVlbiBzdXBwb3J0ZWQgaW4gdGhlICJqYXZhb3V0IiAvICJjc291dCIKICAgICAgICAgICAgdHlwZW1hcHMuCgowOC8wMS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc21hcnQgcG9pbnRlciBoYW5kbGluZyBmb3IgY2xhc3NlcyB0aGF0IGhhdmUgdGVtcGxhdGVkIG1ldGhvZHMgd2l0aGluIHRoZSBzbWFydAogICAgICAgICAgICBwb2ludGVyIHR5cGUuIFByb2JsZW0gcmVwb3J0ZWQgYnkgY3JhaWdkbyBhdCBlZS53YXNoaW5ndG9uLmVkdS4KCjA3LzMxLzIwMDc6IGVmdXp6eW9uZQogICAgICAgICAgICBbY2ZmaV0gZml4ZWQgbWVtb3J5IGFjY2VzcyBhZnRlciBiZWluZyBmcmVlZCBidWcuIHRoYW5rcyB0byBNYXJ0aW4gUGVyY29zc2kuCiAgICAgICAgICAgIHBhY2thZ2UgbmFtZSBjbG9zIGNoYW5nZWQgdG8gY2wuIHRoYW5rcyB0byBSYWxmIE1hdHRlcwoKMDcvMjQvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgUGFyYWxsZWwgbWFrZSBzdXBwb3J0IGFkZGVkIGZvciB0aGUgZXhhbXBsZXMgYW5kIHRlc3Qtc3VpdGUgZm9yIGRldmVsb3BlcnMgd2hvIGhhdmUKICAgICAgICAgICAgbW9yZSB0aGFuIG9uZSBDUFUuIE5vdyBwYXJhbGxlbCBtYWtlIGNhbiBiZSB1c2VkIGZvciBjaGVja2luZyBpbiBhZGRpdGlvbiB0byBidWlsZGluZwogICAgICAgICAgICB0aGUgU1dJRyBleGVjdXRhYmxlLiBTb21lIHR5cGljYWwgY2hlY2tpbmcgZXhhbXBsZXM6CgogICAgICAgICAgICAgIG1ha2UgLWo4IC1rIGNoZWNrCiAgICAgICAgICAgICAgbWFrZSAtajQgY2hlY2stamF2YS10ZXN0LXN1aXRlCiAgICAgICAgICAgICAgbWFrZSAtajIgY2hlY2stamF2YS1leGFtcGxlcwoKMDcvMTkvMjAwNzogbWdvc3NhZ2UKICAgICAgICAgICAgRml4ZWQgYnVnIHRoYXQgc3RvcHBlZCBjb25maWd1cmUgd29ya2luZyBvbiBtaW5ndyAoYXBwbGllZCBkb3MydW5peCB0byBjb25maWd1cmUuaW4pCgowNy8xMC8yMDA3OiBtZ29zc2FnZQogICAgICAgICAgICBbbHVhXSBFeHRyYSBjb21wYXRpYmlsaXR5IHdpdGggTHVhIDUuMSAodXBkYXRlZCBTV0lHX2luaXQsIGRvY3MsIGV4YW1wbGVzLCB0ZXN0IHN1aXRlKQoJICAgIFJlbW92ZWQgbmFtZSBjbGFzaCBmb3Igc3RhdGljIGxpbmsgb2YgbXVsdGlwbGUgbW9kdWxlcwoKMDcvMDUvMjAwNzogbWdvc3NhZ2UKICAgICAgICAgICAgW2x1YV0gRml4IGEgYnVnIGluIFNXSUdfQUxMT0NfQVJSQVkoKQogICAgICAgICAgICBpbXByb3ZlZCB0aGUgZXJyb3IgbWVzc2FnZXMgZm9yIGluY29ycmVjdCBhcmd1bWVudHMuCiAgICAgICAgICAgIENoYW5nZWQgdGhlIG91dHB1dCBvZiBzd2lnX3R5cGUoKSB0byB1c2UgdGhlIGh1bWFuIHJlYWRhYmxlIGZvcm0gb2YgdGhlIHR5cGUsCgkgICAgcmF0aGVyIHRoYW4gdGhlIHJhdyBzd2lnIHR5cGUuCgowNy8wMy8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCBkaXJlY3RvcnMgZm9yIHNvbWUgb3ZlcmxvYWRlZCBtZXRob2RzIHdoZXJlIHRoZSBpbXR5cGUgcmVzdWx0ZWQgaW4gaWRlbnRpY2FsCiAgICAgICAgICAgIG1ldGhvZHMgYmVpbmcgZ2VuZXJhdGVkIGluIHRoZSBDIyBkaXJlY3RvciBjbGFzcywgZWcgdm9pZCBmb28oaW50ICopIGFuZCB2b2lkIGZvbyhkb3VibGUgKikKICAgICAgICAgICAgdXNlZCB0byBnZW5lcmF0ZWQgdHdvIG9mIHRoZXNlOgoKICAgICAgICAgICAgICBwcml2YXRlIHZvaWQgU3dpZ0RpcmVjdG9yZm9vKEludFB0ciBwKSB7IC4uLiB9CgowNi8yNS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIFNvbWUgcGFyYW1ldGVyIG5hbWUgY2hhbmdlcyBpbiBzdGRfdmVjdG9yLmkgYWxsb3dpbmcgYmV0dGVyIHRhcmdldGluZwogICAgICAgICAgICBvZiB0eXBlbWFwcyBmb3IgbWV0aG9kIHBhcmFtZXRlcnMgKGZvciBtZW1vcnkgbWFuYWdlbWVudCBvZiBjb250YWluZXJzIG9mIHBvaW50ZXJzKS4KCjA2LzA3LzIwMDc6IG11dGFuZGl6IChNaWtlbCBCYW5jcm9mdCkKCSAgICBbYWxsZWdyb2NsXQoJICAgIGZpeCBmb3JlaWduLXR5cGUgY29uc3RydWN0b3IgdG8gcHJvcGVybHkgbG9vayBmb3IgZmZpdHlwZSB0eXBlbWFwCgkgICAgYmluZGluZ3MuIGZpeCBpbm91dF90eXBlbWFwcy5pIGZvciBzdHJpbmdzLgoKMDYvMDYvMjAwNzogb2xseQoJICAgIFtSdWJ5XQoJICAgIFVzZSB3aGljaGV2ZXIgb2YgImxvbmciIG9yICJsb25nIGxvbmciIGlzIHRoZSBzYW1lIHNpemUgYXMgInZvaWQqIgoJICAgIHRvIGhvbGQgcG9pbnRlcnMgYXMgaW50ZWdlcnMsIHJhdGhlciB0aGFuIHdoaWNoZXZlciBtYXRjaGVzIG9mZl90LgoJICAgIEZpeGVzIGNvbXBpbGF0aW9uIG9uIE9TIFggYW5kIEdDQyB3YXJuaW5ncyBvbiBwbGF0Zm9ybXMgd2hlcmUKCSAgICBzaXplb2Yodm9pZCopIDwgc2l6ZW9mKG9mZl90KSAoU0YgcGF0Y2ggIzE3MzE5NzkpLgoKMDYvMDYvMjAwNzogb2xseQoJICAgIFtQSFA1XQoJICAgIEZpeCBoYW5kbGluZyBvZiBhIHBhcnRpY3VsYXIgY2FzZSBpbnZvbHZpbmcgb3ZlcmxvYWRlZCBmdW5jdGlvbnMKCSAgICB3aXRoIGRlZmF1bHQgcGFyYW1ldGVycy4KCjA2LzA1LzIwMDc6IG11dGFuZGl6IChNaWtlbCBCYW5jcm9mdCkKCSAgICBbYWxsZWdyb2NsXQoJICAgIEZpeCBjYXNlIHdoZXJlIHdlJ2QgcGFzcyBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllcnMKCSAgICAoaS5lLiBOUzE6Ok5TMjo6Rk9PKSB0byBzd2lnLWluc2VydC1pZC4gQWxsIG5hbWVzcGFjZXMKCSAgICBzaG91bGQgYmUgc3RyaXBwZWQuCgoJICAgIEZpeCBidWcgaW4gVHlwZWRlZkhhbmRsZXIgaW50cm9kdWNlZCBieSBsYXN0IGZpeC4KCjA2LzA1LzIwMDc6IG9sbHkKCSAgICBGaXggcmVwb3J0aW5nIG9mIGZpbGVuYW1lcyBpbiBlcnJvcnMgYWZ0ZXIgJWluY2x1ZGUgKHBhdGNoIGZyb20KCSAgICBMZWlnaCBTbWl0aCBpbiAjMTczMTA0MDsgYWxzbyByZXBvcnRlZCBhcyAjMTY5OTk0MCkuCgowNS8zMS8yMDA3OiBvbGx5CgkgICAgW1B5dGhvbl0KCSAgICBGaXggIm1pc3NpbmcgaW5pdGlhbGlzZXIiIHdhcm5pbmcgd2hlbiBjb21waWxpbmcgZ2VuZXJhdGVkIEMvQysrCgkgICAgd3JhcHBlciBjb2RlIHdpdGggUHl0aG9uIDIuNSB3aXRoIHdhcm5pbmdzIGVuYWJsZWQgKHBhdGNoIGZyb20KCSAgICBidWcjMTcyNzY2OCBmcm9tIEx1a2UgTW9vcmUpLgoKMDUvMjkvMjAwNzogb2xseQoJICAgIFtQeXRob25dCgkgICAgU3BsaXQgZG9jc3RyaW5ncyBpbnRvIHNlcGFyYXRlIHN0cmluZyBsaXRlcmFscyBhdCBlYWNoIG5ld2xpbmUgd2hlbgoJICAgIGdlbmVyYXRpbmcgQy9DKysgd3JhcHBlciBjb2RlICh0aGUgQy9DKysgY29tcGlsZXIgd2lsbCBqdXN0IGNvbWJpbmUKCSAgICB0aGVtIGJhY2sgaW50byBhIHNpbmdsZSBzdHJpbmcgbGl0ZXJhbCkuICBUaGlzIGF2b2lkcyBNU1ZDCgkgICAgY29tcGxhaW5pbmcgdGhhdCB0aGUgc3RyaW5ncyBhcmUgdG9vIGxvbmcgKHByb2JsZW0gcmVwb3J0ZWQgYnkKCSAgICBCbyBQZW5nIG9uIHRoZSBtYWlsaW5nIGxpc3QpLgoKMDUvMjgvMjAwNzogb2xseQoJICAgIFtQeXRob25dCgkgICAgRXNjYXBlIGJhY2tzbGFzaGVzIGluIGRvY3N0cmluZ3MuCgowNS8yNi8yMDA3OiBvbGx5CgkgICAgW1B5dGhvbl0KCSAgICBGaXggYXV0b2RvYyBnZW5lcmF0aW9uIG9mIGVudW1zIHRvIGJlIG1vcmUgY29uc2lzdGVudCB3aXRoIGhvdyB0aGUKCSAgICBlbnVtcyBhcmUgd3JhcHBlZCAtIHBhdGNoICMxNjk3MjI2IGZyb20gSm9zaCBDaGVycnkuCgowNS8yNi8yMDA3OiBvbGx5CgkgICAgW1BIUDVdCgkgICAgRml4IHdyYXBwaW5nIG9mIG1ldGhvZHMgYW5kIGZ1bmN0aW9ucyB3aGljaCByZXR1cm4gYSBwb2ludGVyIHRvIGEKCSAgICBjbGFzcyAoYnVnIzE3MDA3ODgpIGFuZCB0aG9zZSB3aGljaCBoYXZlIG92ZXJsb2FkZWQgZm9ybXMgcmV0dXJuaW5nCgkgICAgYm90aCBjbGFzc2VzIGFuZCBub24tY2xhc3NlcyAoYnVnIzE3MTI3MTcsIHRoYW5rcyB0byBTaW1vbgoJICAgIEJlcnRoaWF1bWUgZm9yIHRoZSBwYXRjaCkuCgowNS8yNS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlZCAlcmVuYW1lIGluY29uc2lzdGVuY3kgaW4gY29udmVyc2lvbiBvcGVyYXRvcnMgYXMgcmVwb3J0ZWQgYnkgWmhvbmcgUmVuLiBUaGUgbWF0Y2hpbmcKICAgICAgICAgICAgaXMgbm93IGRvbmUgb24gdGhlIG9wZXJhdG9yIG5hbWUgaW4gdGhlIHNhbWUgd2F5IGFzIGl0IGlzIGRvbmUgZm9yIHBhcmFtZXRlcnMuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlcmVuYW1lKG9wQUJDKSBTcGFjZTo6QUJDOjpvcGVyYXRvciBBQkMoKSBjb25zdDsKICAgICAgICAgICAgICAlcmVuYW1lKG1ldGhvZEFCQykgU3BhY2U6OkFCQzo6bWV0aG9kKEFCQyBhKSBjb25zdDsKICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UgewogICAgICAgICAgICAgICAgY2xhc3MgQUJDIHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIHZvaWQgbWV0aG9kKEFCQyBhKSBjb25zdCB7fQogICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yIEFCQygpIGNvbnN0IHsgQUJDIGE7IHJldHVybiBhOyB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIE5vdGUgdGhhdCBxdWFsaWZ5aW5nIHRoZSBjb252ZXJzaW9uIG9wZXJhdG9yIHByZXZpb3VzbHkgbWF5IG9yIG1heSBub3QgaGF2ZSBtYXRjaGVkLgogICAgICAgICAgICBOb3cgaXQgZGVmaW5pdGVseSB3b24ndCwgc28gdGhpcyB3aWxsIG5vdCBtYXRjaDoKCiAgICAgICAgICAgICAgJXJlbmFtZShvcEFCQykgU3BhY2U6OkFCQzo6b3BlcmF0b3IgU3BhY2U6OkFCQygpIGNvbnN0OwoKICAgICAgICAgICAgaW4gdGhlIHNhbWUgd2F5IHRoYXQgdGhpcyBkb2VzIG5vdCBtYXRjaDoKCiAgICAgICAgICAgICAgJXJlbmFtZShtZXRob2RBQkMpIFNwYWNlOjpBQkM6Om1ldGhvZChTcGFjZTo6QUJDIGEpIGNvbnN0OwoKICAgICAgICAgICAgVGhlIGRvY3VtZW50YXRpb24gaGFzIGJlZW4gaW1wcm92ZWQgd2l0aCByZXNwZWN0IHRvICVyZW5hbWUsIG5hbWVzcGFjZXMgYW5kIHRlbXBsYXRlcy4KICAgICAgICAgICAgQ29udmVyc2lvbiBvcGVyYXRvcnMgZG9jdW1lbnRhdGlvbiB0b28uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjA1LzE2LzIwMDc6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBGaXggYmFkIGdlbmVyYXRpb24gb2YgbG9jYWwgdmFyIGx0eXBlJ3MgaW4gZnVuY3Rpb25XcmFwcGVyKCkuCgkgICAgVHJ5IHRvIHdvcmsgYmV0dGVyIHdpdGggdGhlIGJhY2t3YXJkIG9yZGVyIGluIHdoaWNoIHN3aWcKCSAgICB1bnJvbGxzIG5lc3RlZCBjbGFzcyBkZWZpbml0aW9ucy4KCSAgICBjbGVhbmVkIHVwIGEgbGl0dGxlIHVubmVjZXNzYXJ5IGNvZGUvZGVidWcgcHJpbnRmJ3MuCgkgICAgUmVtb3ZlIHdhcm5pbmcgd2hlbiByZXBsYWNpbmcgJGxkZXN0cnVjdG9yIGZvciBmZjpmb3JlaWduLXBvaW50ZXIKCjA1LzEyLzIwMDc6IG9sbHkKCSAgICBbUHl0aG9uXQoJICAgIHN3aWcgLXB5dGhvbiAtdGhyZWFkcyBub3cgZ2VuZXJhdGVzIEMvQysrIGNvZGUgd2hpY2ggdXNlcyBQeXRob24ncwoJICAgIG93biB0aHJlYWRpbmcgYWJzdHJhY3Rpb24gKGZyb20gcHl0aHJlYWQuaCkgcmF0aGVyIHRoYW4gT1Mgc3BlY2lmaWMKCSAgICBjb2RlLiAgVGhlIG9sZCBjb2RlIGZhaWxlZCB0byBjb21waWxlIG9uIE1TIFdpbmRvd3MuICAoU2VlIFNGIHBhdGNoCgkgICAgdHJhY2tlciAjMTcxMDM0MSkuCgowNS8wNC8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBDaGFuZ2VkIFNUTCByZW5hbWVzIHRvIGJlIGdsb2JhbCByZW5hbWVzLiAgVGhpcyBmaXhlcwoJICAgIFNUTCBmdW5jdGlvbnMgbm90IGJlaW5nIHJlbmFtZWQgd2hlbiBhdXRvcmVuYW1lIGlzIG9uLgogICAgICAgICAgICBUaGlzIGlzIGEgbm90IGEgdG90YWxseSBwZXJmZWN0IHdvcmstYXJvdW5kLCBidXQgYmV0dGVyLgoJICAgIFNvbWVvbmUgcmVhbGx5IG5lZWRzIHRvIGZpeCB0aGUgdGVtcGxhdGUgcmVuYW1pbmcgY29kZS4KCSAgICAoU2VlIGJ1ZyAjMTU0NTYzNCkKCjA1LzA0LzIwMDcgIGdnYQoJICAgIFtBbGxdCiAgICAgICAgICAgIENoYW5nZWQgJXJlbmFtZSgiJSh1bmRlcmNhc2UpcyIpIGEgbGl0dGxlIHNvIHRoYXQgc2luZ2xlCgkgICAgbnVtYmVycyBhdCB0aGUgZW5kIG9mIGEgZnVuY3Rpb24gYXJlIG5vdCB1bmRlcmNhc2VkLiAgVGhhdCBpczoKCQlnZXRTb21ldGhpbmcgLT4gZ2V0X3NvbWV0aGluZwoJCWdldDJECSAgICAgLT4gZ2V0XzJkCgkJZ2V0MjM0CSAgICAgLT4gZ2V0XzIzNAoJICAgIEJVVDoKCQlhc0Zsb2F0MiAgICAgLT4gYXNfZmxvYXQyCgkgICAgKEJ1ZyAjMTY5OTcxNCkKCjA1LzAzLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIE1hZGUgX19zd2lndHlwZV9fID0+IEBfX3N3aWd0eXBlX18gc28gaXQgY2FuIGJlIGFjY2Vzc2VkCgkgICAgZnJvbSB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlIChhbmQgZm9sbG93cyBSdWJ5J3Mgb2ZmaWNpYWwKICAgICAgICAgICAgZG9jdW1lbnRhdGlvbiwganVzdCBpbiBjYXNlKS4KCSAgICBNYWRlIHRyYWNraW5nID0+IEBfX3RyYWNraW5nc19fIGZvciBzYW1lIHJlYXNvbi4KCSAgICBDdXJyZW50bHkgc3RvcmluZyBpdmFycyB3aXRob3V0IHRoZSBAIHNlZW1zIHZhbGlkLCBidXQKCSAgICB0aGUgUGlja0F4ZSBzYXlzIHRoaXMgaXMgbm90IGNvcnJlY3QsIHNvIGp1c3QgaW4gY2FzZS4uLgoKMDUvMDMvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgQXBwbGllZCBwYXRjaCBmb3IgLW1pbmhlcml0IGJ1ZyBhbmQgZXhjZXB0aW9uIGNsYXNzZXMuCgkgICAgVGhpcyBpc3N1ZSBzaG91bGQgYmUgcmV2aXNpdGVkIG1vcmUgY2xvc2VseSwgYXMgTXVsdGlwbGUKCSAgICBJbmhlcml0YW5jZSBpbiBSdWJ5IGlzIHN0aWxsIHByb2JsZW1hdGljLgoJICAgIChwYXRjaC9idWcgIzE2MDQ4NzgpCgowNS8wMy8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBPdmVybG9hZGVkIGZ1bmN0aW9ucyBpbiBydWJ5IHdpbGwgbm93IHJlcG9ydCB0byB0aGUgdXNlcgogICAgICAgICAgICB0aGUgcG9zc2libGUgcHJvdG90eXBlcyB3aGVuIHRoZSB1c2VyIG1pc3R5cGVzIHRoZSBudW1iZXIgb3IKICAgICAgICAgICAgdHlwZSBvZiBhIHBhcmFtZXRlci4KCjA1LzAzLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEZvcmdvdCB0byBkb2N1bWVudCB0aGUgYnVnIGZpeGluZyBvZiBhbiBvbGQgYnVnIHJlZ2FyZGluZwoJICAgIGV4Y2VwdGlvbnMuCgkgICAgKGJ1ZyAjMTQ1ODI0NykKCjA1LzAzLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEZpeGVkIFJ1YnkgZG9jdW1lbnRhdGlvbiB0byB1c2UgdGhlIHByb3BlciBjc3Mgc3R5bGVzIGZvcgoJICAgIGVhY2ggc2VjdGlvbi4gQWRkZWQgYXV0b2RvYyBzZWN0aW9uIHRvIFJ1YnkncyBkb2NzIHRvCgkgICAgZG9jdW1lbnQgdGhlIGZlYXR1cmVzIHN1cHBvcnRlZCBieSBSdWJ5IGluIGRvY3VtZW50aW5nIGl0cyBtb2R1bGVzLgoJICAgIE1hZGUgcmRvYyBkb2N1bWVudGF0aW9uIHNwaXQgb3V0IHRoZSBmdWxsIG5hbWUgb2YgdGhlIGNsYXNzICsKCSAgICBtZXRob2QgbmFtZS4gIEFsYmVpdCB0aGlzIHdpbGwgbWFrZSB0aGUgY3VycmVudCByZG9jIG5vdCByZWNvZ25pemUKICAgICAgICAgICAgdGhlIG1ldGhvZCwgdGhpcyBpcyBzdGlsbCBuZWVkZWQgdG8gZGlzYW1iaWd1YXRlIGJldHdlZW4gZGlmZmVyZW50CiAgICAgICAgICAgIGNsYXNzZXMgd2l0aCBzaW1pbGFyIG1ldGhvZHMgKHJkb2Mgd2FzIGNyZWF0ZWQgdG8gZG9jdW1lbnQgdGhlCgkgICAgcnVieSBzb3VyY2Ugd2hpY2ggb25seSBjb250YWlucyBvbmUgY2xhc3MgcGVyIGMgZmlsZSwgdW5saWtlIHN3aWcpCiAgICAgICAgICAgIEkgaGF2ZSBwYXRjaGVkIHJkb2MgdG8gbWFrZSBpdCBtb3JlIGZyaWVuZGx5IHRvIHN3aWcuICBUaGlzCiAgICAgICAgICAgIHBhdGNoIG5lZWRzIHRvIGJlIG1lcmdlZCBpbiB0aGUgcnVieSBzdGQgbGlicmFyeSBub3cuCgowNS8wMy8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBDaGFuZ2VkIGZsYWcgLWZlYXR1cmUgdG8gYmUgLWluaXRfbmFtZSB0byBiZXR0ZXIgcmVmbGVjdCBpdHMKCSAgICBwdXJwb3NlIGFuZCBhdm9pZCBjb25mdXNpb24gd2l0aCAtZmVhdHVyZXMuCgowNS8wMy8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBJbXByb3ZlZCBhdXRvZG9jIGdlbmVyYXRpb24uCgkgICAgQWRkZWQgYXV0b2RvYyAuc3dnIGZpbGVzIHRvIFJ1YnkgbGlicmFyeSBmb3IgZWFzaWx5IGFkZGluZwoJICAgIGRvY3VtZW50YXRpb24gdG8gY29tbW9uIFJ1YnkgbWV0aG9kcyBhbmQgU1RMIG1ldGhvZHMuCgkgICAgRml4ZWQgYXV0b2RvYyBkb2N1bWVudGluZyBvZiBnZXR0ZXJzIGFuZCBzZXR0ZXJzIGFuZCBtb2R1bGUuCgkgICAgTWFkZSB0ZXN0IHN1aXRlIGFsd2F5cyBnZW5lcmF0ZSBhdXRvZG9jcy4KCjA1LzAzLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIFJlbW92ZWQgc29tZSB3YXJuaW5ncyBmcm9tIFNUTCBhbmQgdGVzdCBzdWl0ZS4KCjA1LzAyLzIwMDc6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEZpeGVkIGlzc3VlcyB3aXRoIEMrKyBjbGFzc2VzIGFuZCBoaWVyYWNoaWVzIGFjcm9zcyBtdWx0aXBsZQoJICAgIHNvdXJjZSBmaWxlcy4gRml4ZWQgaW1wb3J0cyB0ZXN0IGNhc2UgJiBhZGRlZCBydW4gdGVzdC4KCSAgICBBZGRlZCBFeGFtcGxlcy9pbXBvcnRzLgoJICAgIEFkZGVkIHR5cGVuYW1lIGZvciByYXcgbHVhX1N0YXRlKgoJICAgIEFkZGVkIGRvY3VtZW50YXRpb24gb24gbmF0aXZlIGZ1bmN0aW9ucy4KCjA1LzAyLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIERvY3N0cmluZ3MgYXJlIG5vdyBzdXBwb3J0ZWQuCgkgICAgJWZlYXR1cmUoImF1dG9kb2MiKSBhbmQgJWZlYXR1cmUoImRvY3N0cmluZyIpIGFyZSBub3cKCSAgICBwcm9wZXJseSBzdXBwb3J0ZWQgaW4gUnVieS4gIFRoZXNlIGZlYXR1cmVzIHdpbGwgZ2VuZXJhdGUKCSAgICBhIF93cmFwLmN4eCBmaWxlIHdpdGggcmRvYyBjb21tZW50cyBpbiB0aGVtLgoKMDUvMDIvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgU1RMIGZpbGVzIGhhdmUgYmVlbiB1cGdyYWRlZCB0byBmb2xsb3cgdGhlIG5ldyBzd2lnL3B5dGhvbgoJICAgIExpYi9zdGQgY29udmVudGlvbnMuCgkgICAgVGhpcyBtZWFucyBzdGQ6OnZlY3Rvciwgc3RkOjpzZXQsIHN0ZDo6bWFwLCBzZXQ6Om11bHRpbWFwLAoJICAgIHN0ZDo6bXVsdGlzZXQsIHN0ZDo6ZGVxdWUgYW5kIHN0ZDo6c3RyaW5nIGFyZSBub3cgcHJvcGVybHkKCSAgICBzdXBwb3J0ZWQsIGluY2x1ZGluZyB0aGVpciBpdGVyYXRvcnMsIHN1cHBvcnQgZm9yIGNvbnRhaW5pbmcKCSAgICBydWJ5IG9iamVjdHMgKHN3aWc6OkdDX1ZBTFVFKSBhbmQgc2V2ZXJhbCBvdGhlciBydWJ5CgkgICAgZW5oYW5jZW1lbnRzLgoJICAgIHN0ZDo6Y29tcGxleCwgc3RkOjppb3MsIHN0ZDo6aW9zdHJlYW0sIHN0ZDo6aW9zdHJlYW1idWYgYW5kCgkgICAgc3RkOjpzc3RyZWFtIGFyZSBub3cgYWxzbyBzdXBwb3J0ZWQuCgkgICAgc3RkOjp3c3RyaW5nLCBzdGQ6Ondpb3MsIHN0ZDo6d2lvc3RyZWFtLCBzdGQ6Ondpb3N0cmVhbWJ1ZgoJICAgIGFuZCBzdGQ6Ondzc3RyZWFtIGFyZSBzdXBwb3J0ZWQgdmVyYmF0aW0gd2l0aCBubyB1bmljb2RlCgkgICAgY29udmVyc2lvbi4KCgkgICAgc3RkX3ZlY3Rvci5pIG5vdyBtaW1pY3MgdGhlIGJlaGF2aW9yIG9mIFJ1YnkgQXJyYXlzIG11Y2ggbW9yZQoJICAgIGNsb3NlbHksIHN1cHBvcnRpbmcgc2xpY2luZywgc2hpZnRpbmcsIHVuc2hpZnRpbmcsCiAgICAgICAgICAgIG11bHRpcGxlIGluZGV4aW5nIGFuZCBwcm9wZXIgcmV0dXJuIHZhbHVlcyBvbiBhc3NpZ25tZW50LgoKCSAgICBDT01QQVRBQklMSVRZIE5PVEU6IHRoaXMgY2hhbmdlcyB0aGUgb2xkZXIgYXBpIGEgbGl0dGxlIGJpdCBpbgoJICAgIHRoYXQgaW1wcm9wZXIgaW5kZXhpbmcgd291bGQgcHJldmlvdXNseSAoaW5jb3JyZWN0bHkpIHJhaXNlCgkgICAgZXhjZXB0aW9ucy4gIE5vdywgbmlsIGlzIHJldHVybmVkIGluc3RlYWQsIGZvbGxvd2luZyBydWJ5J3MKCSAgICBzdGFuZGFyZCBBcnJheSBiZWhhdmlvci4KCjA1LzAyLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIENoYW5nZWQgdGhlIHZhbHVlIG9mIFNXSUdfVFlQRUNIRUNLX0JPT0wgdG8gYmUgMTAwMDAgKGllLiBoaWdoZXIKCSAgICB0aGFuIHRoYXQgb2YgYWxsIGludGVnZXJzKS4KCSAgICBUaGlzIGlzIGJlY2F1c2UgUnVieSBhbGxvd3MgdHlwZWNhc3RpbmcKCSAgICBpbnRlZ2VycyBkb3duIHRvIGJvb2xlYW5zIHdoaWNoIGNhbiBtYWtlIG92ZXJsb2FkZWQgZnVuY3Rpb25zIG9uCgkgICAgYm9vbHMgYW5kIGludGVnZXJzIHRvIGZhaWwuCgkgICAgKGJ1ZyMgMTQ4ODE0MikKCjA1LzAyLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEZpeGVkIGEgc3VidGxlIGJ1ZyBpbiBtdWx0aXBsZSBhcmdvdXRzIHRoYXQgY291bGQgZ2V0IHRyaWdnZXJlZCBpZgoJICAgIHRoZSB1c2VyIHJldHVybmVkIHR3byBvciBtb3JlIGFyZ3VtZW50cyBhbmQgdGhlIGZpcnN0IG9uZSB3YXMgYW4KCSAgICBhcnJheS4KCjA1LzAxLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEltcHJvdmVkIHRoZSBkb2N1bWVudGF0aW9uIHRvIGRvY3VtZW50IHRoZSBuZXcgZmVhdHVyZXMKICAgICAgICAgICAgYWRkZWQsIGFkZCBkaXJlY3RvcmluL291dC9hcmdvdXQgdHlwZW1hcHMsIGV0Yy4KCjA1LzAxLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEFkZGVkICVpbml0c3RhY2sgYW5kICVpZ25vcmVzdGFjayBkaXJlY3RpdmVzIGZvciBkaXJlY3RvcgoJICAgIGZ1bmN0aW9ucy4gIFRoZXNlIGFsbG93IHlvdSB0byBjb250cm9sIHdoZXRoZXIgYSBkaXJlY3RvcgoJICAgIGZ1bmN0aW9uIHNob3VsZCByZS1pbml0IHRoZSBSdWJ5IHN0YWNrLgoJICAgIFRoaXMgaXMgc29tZXRpbWVzIG5lZWRlZCBmb3IgYW4gZW1iZWRkZWQgUnVieSB3aGVyZSB0aGUKCSAgICBkaXJlY3RvciBtZXRob2QgaXMgdXNlZCBhcyBhIEMrKyBjYWxsYmFjayBhbmQgbm90IGNhbGxlZAogICAgICAgICAgICBieSB0aGUgdXNlciBmcm9tIHJ1YnkgY29kZS4KCSAgICBFeHBsYW5hdGlvbjoKCSAgICBSdWJ5J3MgR0MgbmVlZHMgdG8gYmUgYXdhcmUgb2YgdGhlIHJ1bm5pbmcgT1Mgc3RhY2sgaW4gb3JkZXIgdG8KCSAgICBtYXJrIGFueSBWQUxVRSAoUnVieSBvYmplY3RzKSBpdCBmaW5kcyB0aGVyZSB0byBhdm9pZCBjb2xsZWN0aW9uCgkgICAgb2YgdGhlbS4gIFRoaXMgYWxsb3dzIHRoZSBydWJ5IEFQSSB0byBiZSB2ZXJ5IHNpbXBsZSBhbmQgYWxsb3dzCgkgICAgeW91IHRvIHdyaXRlIGNvZGUgbGlrZSAiVkFMVUUgYSA9IHN0aCIgYW55d2hlcmUgd2l0aG91dCBuZWVkaW5nCgkgICAgdG8gZG8gdGhpbmdzIGxpa2UgcmVmY291bnRpbmcgbGlrZSBweXRob24uCgkgICAgQnkgZGVmYXVsdCwgdGhlIHN0YXJ0IG9mIHRoZSBzdGFjayBpcyBzZXQgd2hlbiBydWJ5X2luaXQoKSBpcwoJICAgIGNhbGxlZC4gICBJZiBydWJ5IGlzIGluaXRlZCB3aXRoaW4gbWFpbigpLCBhcyBpdCB1c3VhbGx5IGlzIHRoZQoJICAgIGNhc2Ugd2l0aCB0aGUgbWFpbiBydWJ5IGV4ZWN1dGFibGUsIHJ1Ynkgd2lsbCBiZSBhYmxlIHRvIGNhbGN1bGF0ZQoJICAgIGl0cyBzdGFjayBwcm9wZXJseS4gIEhvd2V2ZXIsIHdoZW4gdGhpcyBpcyBub3QgcG9zc2libGUsIGFzIHdoZW4KCSAgICBydWJ5IGlzIGVtYmVkZGVkIGFzIGEgcGx1Z2luIHRvIGFuIGFwcGxpY2F0aW9uIHdoZXJlIG1haW4gaXMgbm90CgkgICAgYXZhaWxhYmxlLCBydWJ5X2luaXQoKSB3aWxsIGJlIGNhbGxlZCBpbiB0aGUgd3JvbmcgcGxhY2UsIGFuZAoJICAgIHJ1Ynkgd2lsbCBiZSBpbmNvcnJlY3RseSB0cmFja2luZyB0aGUgc3RhY2sgZnJvbSB0aGUgZnVuY3Rpb24KCSAgICB0aGF0IGNhbGxlZCBydWJ5X2luaXQoKSBmb3J3YXJkcyBvbmx5LCB3aGljaCBjYW4gbGVhZCB0bwoJICAgIGFsbCBzb3J0cyBvZiB3ZWlyZCBjcmFzaGVzIG9yIHRvIHJ1YnkgdGhpbmtpbmcgaXQgaGFzIHJ1biBvdXQgb2YKCSAgICBzdGFjayBzcGFjZSBpbmNvcnJlY3RseS4KCSAgICBUbyBhdm9pZCB0aGlzLCBkaXJlY3RvciAoY2FsbGJhY2spIGZ1bmN0aW9ucyBjYW4gbm93IGJlIHRhZ2dlZAoJICAgIHRvIHRyeSB0byByZXNldCB0aGUgcnVieSBzdGFjaywgd2hpY2ggd2lsbCBzb2x2ZSB0aGUgaXNzdWVzLgoJICAgIE5PVEU6IHJ1YnkxLjguNiBzdGlsbCBjb250YWlucyBhIGJ1ZyBpbiBpdCBpbiB0aGF0IGl0cyBmdW5jdGlvbgoJICAgIHRvIHJlc2V0IHRoZSBzdGFjayB3aWxsIG5vdCBhbHdheXMgZG8gc28uICBUaGlzIGJ1ZyBpcyB0cmlnZ2VyZWQKCSAgICB2ZXJ5IHJhcmVseSwgd2hlbiBydWJ5IGlzIGNhbGxlZCBmcm9tIHR3byB2ZXJ5IGRpc3RpbmN0IHBsYWNlcwoJICAgIGluIG1lbW9yeSwgbGlrZSBhIGJyYW5jaCBvZiBtYWluKCkgYW5kIGFub3RoZXIgZHNvLiAgVGhpcyBidWcKCSAgICBoYXMgbm93IGJlZW4gcmVwb3J0ZWQgdG8gcnVieS1jb3JlIGFuZCBpcyBwZW5kaW5nIGZ1cnRoZXIKCSAgICBpbnZlc3RpZ2F0aW9uLgoJICAgIChidWcgIzE3MDA1MzUgYW5kIHBhdGNoICMxNzAyOTA3KQoKMDQvMzAvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxNzA3NTgyIC0gUmVzdG9yZSBidWlsZGluZyBmcm9tIHJlYWQtb25seSBzb3VyY2UgZGlyZWN0b3JpZXMuCgowNC8zMC8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBSdWJ5IHdpbGwgbm93IHJlcG9ydCB0aGUgcGFyYW1ldGVyIGluZGV4IHByb3Blcmx5IG9uIHR5cGUKCSAgICBlcnJvcnMgYXMgd2VsbCBhcyB0aGUgY2xhc3MgYW5kIHZhbHVlIG9mIHRoZSBpbmNvcnJlY3QKCSAgICBhcmd1bWVudCBwYXNzZWQuCgkgICAgKGZlYXR1cmUgcmVxdWVzdCAjMTY5OTY3MCkKCjA0LzMwLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIFJ1Ynkgbm8gbG9uZ2VyIGNyZWF0ZXMgdGhlIGZyZWVfQ2xhc3MgZnVuY3Rpb24gaWYgdGhlIGNsYXNzCgkgICAgY29udGFpbnMgaXRzIG93biB1c2VyIGRlZmluZWQgZnJlZSBmdW5jdGlvbiAoJWZyZWVmdW5jKS4KCSAgICAoYnVnICMxNzAyODgyKQoKMDQvMzAvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgTWFkZSBkaXJlY3RvcnMgcmFpc2UgYSBydWJ5IGV4Y2VwdGlvbiBmb3IgaW5jb3JyZWN0IGFyZ291dAoJICAgIHJldHVybmVkIHZhbHVlcyBpZiBSVUJZX0VNQkVEREVEIGlzIHNldCwgaW5zdGVhZCBvZiB0aHJvd2luZwoJICAgIGFuIGFjdHVhbCBTd2lnRGlyZWN0b3IgZXhjZXB0aW9uLgoJICAgIFRoaXMgd2lsbCBwcmV2ZW50IGNyYXNoZXMgd2hlbiBydWJ5IGlzIGVtYmVkZGVkIGFuZCB1bmF3YXJlCgkgICAgb2YgdGhlIFN3aWdEaXJlY3RvciBleGNlcHRpb24uCgowNC8zMC8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBSZW1vdmVkIHRoZSBuZWVkIGZvciAtRFNXSUdFWFRFUk4uCgkgICAgQ2hhbmdlZCBzd2lnX3J1YnlfdHJhY2tpbmdzIHRvIGJlIGEgc3RhdGljIHZhcmlhYmxlLCBidXQgYWxzbwoJICAgIGJlIGtlcHQgd2l0aGluIGEgaGlkZGVuIGluc3RhbmNlIHZhcmlhYmxlIGluIHRoZSBTV0lHIG1vZHVsZS4KCSAgICBUaGlzIGFsbG93cyBwcm9wZXJseSBkZWFsaW5nIHdpdGggdHJhY2tpbmdzIGFjcm9zcyBtdWx0aXBsZQoJICAgIERTT3MsIHdoaWNoIHdhcyBwcmV2aW91c2x5IGJyb2tlbi4KCSAgICAoYnVnICMxNzAwNTM1IGFuZCBpbXByb3ZlbWVudCB0byBwYXRjaCAjMTcwMjkwNykKCjA0LzI5LzIwMDc6IGdnYQoJICAgIFtSdWJ5XSBGaXhlZCBHQyBtZW1vcnkgaXNzdWVzIHdpdGggdHJhY2tpbmdzIHRoYXQgY291bGQgbGVhZAoJICAgIHRvIHNlZ2ZhdWx0cyB3aGVuIGRlYWxpbmcsIG1haW5seSwgd2l0aCBzdGF0aWMgdmFyaWFibGVzLgoJICAgIChidWcgIzE3MDA1MzUgYW5kIHBhdGNoICMxNzAyOTA3KQoKMDQvMjkvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgRml4ZWQgU3RyaW5nIGNvbnZlcnNpb24gdXNpbmcgb2xkIHJ1YnkxLjYgbWFjcm9zLiAgTm93CgkgICAgU3RyaW5nVmFsdWVQdHIoKSBpcyB1c2VkIGlmIGF2YWlsYWJsZS4gIFRoaXMgcmVtb3ZlcyB3YXJuaW5ncwoJICAgIHdoZW4gY29udmVydGluZyBzdHJpbmdzIHdpdGggXDAgaW4gdGhlbS4KCSAgICAoYnVnICMxNzAwNTM1IGFuZCBwYXRjaCAjMTcwMjkwNykKCjA0LzI5LzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEZpeGVkIHRoZSBhcmdvdXQgY291bnQgaW4gZGlyZWN0b3JzIGZvciBSdWJ5LiAgUHJldmlvdXNseSwKCSAgICBpZ25vcmVkIG9yICJudW1pbnB1dHM9MCIgdHlwZW1hcHMgd291bGQgaW5jb3JyZWN0bHkgbm90IGdldAoJICAgIGNvdW50ZWQgdG93YXJkcyB0aGUgYXJnb3V0IGNvdW50LgoJICAgIChidWcvcGF0Y2ggIzE1NDU1ODUpCgowNC8yOS8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBVcGdyYWRlZCBSdWJ5IGNvbnZlcnRlciB0byByZWNvZ25pemUgIm51bWlucHV0cz0wIi4gIFByZXZpb3VzbHksCgkgICAgb25seSB0aGUgb2xkICJpZ25vcmUiIGZsYWcgd2FzIGNoZWNrZWQgKHdoaWNoIHdvdWxkIGN1cnJlbnRseQoJICAgIHN0aWxsIHdvcmsgcHJvcGVybHksIGJ1dCBpcyBkZXByZWNhdGVkKS4KCjA0LzI5LzIwMDc6IGdnYQoJICAgIFtSdWJ5IC0gYnV0IHNob3VsZCBiZSBtYWRlIGdlbmVyaWNdCgoJICAgICVmZWF0dXJlKCJudW1vdXRwdXRzIiwiMCIpIGFkZGVkLgoKCSAgICBUaGlzIGZlYXR1cmUgYWxsb3dzIHlvdSB0byBpZ25vcmUgdGhlIG91dHB1dCBvZiBhIGZ1bmN0aW9uIHNvCgkgICAgdGhhdCBpdCBpcyBub3QgYWRkZWQgdG8gYSBsaXN0IG9mIG91dHB1dCB2YWx1ZXMKCSAgICAoIGllLiBhcmdvdXRzICkuCgkgICAgVGhpcyBzaG91bGQgYWxzbyBiZWNvbWUgYSBmZWF0dXJlIG9mICV0eXBlbWFwKGRpcmVjdG9yb3V0KQoJICAgIGFzICJudW1vdXRwdXRzIj0wLCBqdXN0IGxpa2UgIm51bWlucHV0cyI9MCBleGlzdHMuCgoJICAgICVmZWF0dXJlKCJkaXJlY3RvcnMiPTEpCgoJICAgICVpbmNsdWRlIDx0eXBlbWFwcy5pPgoKCSAgICAlZmVhdHVyZSgibnVtb3V0cHV0cyIsIjAiKSB7IENsYXNzOjptZW1iZXJfZnVuY3Rpb24xIH07CgkgICAgJXR5cGVtYXAob3V0KSBNU3RhdHVzIHsgLy8gc29tZSBjb2RlLCBsaWtlIGNoZWNrIG1zdGF0dXMKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgcmFpc2UgZXhjZXB0aW9uIGlmIHdyb25nIH07CgoJICAgICVpbmxpbmUgJXsKCSAgICAgIHR5cGVkZWYgaW50IE1TdGF0dXM7CgkgICAgICBjbGFzcyBDbGFzcyB7CgoJICAgICAgLy8gb25lIGFyZ3VtZW50IHJldHVybmVkLCBidXQgZGlyZWN0b3Igb3V0IGNvZGUgYWRkZWQKCSAgICAgIC8vIE1TdGF0dXMgaXMgZGlzY2FyZGVkIGFzIGEgcmV0dXJuIChvdXQpIHBhcmFtZXRlci4KCSAgICAgIHZpcnR1YWwgTVN0YXR1cyBtZW1iZXJfZnVuY3Rpb24xKCBpbnQmIE9VVFBVVCApOwoKCSAgICAgIC8vIHR3byBhcmd1bWVudHMgcmV0dXJuZWQsIGRpcmVjdG9yIG91dCBjb2RlIGFkZGVkCgkgICAgICAvLyBNU3RhdHVzIGlzIG5vdCBkaXNjYXJkZWQKCSAgICAgIHZpcnR1YWwgTVN0YXR1cyBtZW1iZXJfZnVuY3Rpb24yKCBpbnQmIE9VVFBVVCApOwoJICAgICAgfTsKICAgICAgICAgICAgJX0KCgowNC8yMS8yMDA3OiBvbGx5CgkgICAgRml4IHBhcnNpbmcgb2YgZmxvYXQgY29uc3RhbnRzIHdpdGggYW4gZXhwb25lbnQgKGUuZy4gMWUtMDJmKQoJICAgIChidWcgIzE2OTk2NDYpLgoKMDQvMjAvMjAwNzogb2xseQoJICAgIFtQeXRob25dIEZpeCBsYWNrIG9mIGdlbmVyYXRpb24gb2YgZG9jc3RyaW5ncyB3aGVuIC1PIGlzIHVzZWQuCgkgICAgQWxzbywgZml4IGdlbmVyYXRpb24gb2YgZG9jc3RyaW5ncyBjb250YWluaW5nIGEgZG91YmxlIHF1b3RlCgkgICAgY2hhcmFjdGVyLiAgUGF0Y2ggZnJvbSBSaWNoYXJkIEJvdWx0b24gaW4gYnVnIzE3MDAxNDYuCgowNC8xNy8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIFN1cHBvcnQgZm9yIGFkZGluZyBpbiBKYXZhL0MjIGNvZGUgYmVmb3JlIGFuZCBhZnRlciB0aGUgaW50ZXJtZWRpYXJ5IGNhbGwsCiAgICAgICAgICAgIHNwZWNpZmljYWxseSByZWxhdGVkIHRvIHRoZSBtYXJzaGFsbGluZyBvZiB0aGUgcHJveHkgdHlwZSB0byB0aGUgaW50ZXJtZWRpYXJ5IHR5cGUuCiAgICAgICAgICAgIFRoZSBqYXZhaW4vY3NpbiB0eXBlbWFwIG5vdyBzdXBwb3J0cyB0aGUgJ3ByZScgYW5kICdwb3N0JyBhdHRyaWJ1dGVzIHRvIGFjaGlldmUgdGhpcy4KICAgICAgICAgICAgVGhlIGphdmFpbiB0eXBlbWFwIGFsc28gc3VwcG9ydHMgYW4gb3B0aW9uYWwgJ3BnY3BwbmFtZScgYXR0cmlidXRlIGZvciBwcmVtYXR1cmUgZ2FyYmFnZQogICAgICAgICAgICBjb2xsZWN0aW9uIHByZXZlbnRpb24gcGFyYW1ldGVyIG5hbWluZyBhbmQgdGhlIGNzaW4gdHlwZW1hcCBzdXBwb3J0cyBhbiBvcHRpb25hbCAnY3NoaW4nCiAgICAgICAgICAgIGF0dHJpYnV0ZSBmb3IgdGhlIHBhcmFtZXRlciB0eXBlIHVzZWQgaW4gYSBjb25zdHJ1Y3RvciBoZWxwZXIgZ2VuZXJhdGVkIHdoZW4gdGhlIHR5cGUgaXMgdXNlZAogICAgICAgICAgICBpbiBhIGNvbnN0cnVjdG9yLiBEZXRhaWxzIGluIHRoZSBKYXZhLmh0bWwgYW5kIENTaGFycC5odG1sIGRvY3VtZW50YXRpb24uCgowNC8xNi8yMDA3OiBvbGx5CgkgICAgRG9uJ3QgdHJlYXQgYHJlc3RyaWN0JyBhcyBhIHJlc2VydmVkIGlkZW50aWZpZXIgaW4gQysrIG1vZGUKCSAgICAoYnVnIzE2ODU1MzQpLgoKMDQvMTYvMjAwNzogb2xseQoJICAgIFtQSFA1XSBGaXggaG93IHplbmRfdGhyb3dfZXhjZXB0aW9uKCkgaXMgY2FsbGVkIChidWcgIzE3MDA3ODUpLgoKMDQvMTAvMjAwNzogb2xseQoJICAgIERlZmluZSBTV0lHVEVNUExBVEVESVNBTUJJR1VBVE9SIHRvIHRlbXBsYXRlIGZvciBhQ0MgKHJlcG9ydGVkIG9uCgkgICAgc3dpZy11c2VyIHRoYXQgdGhpcyBpcyBuZWVkZWQpLgoKMDQvMDQvMjAwNzogb2xseQoJICAgIFtQSFA1XSBJZiBaVFMgaXMgZW5hYmxlZCwgcmVsZWFzZSA8bW9kdWxlPl9nbG9iYWxzX2lkIGluIE1TSFVURE9XTgoJICAgIHRvIGF2b2lkIFBIUCBpbnRlcnByZXRlciBjcmFzaCBvbiBzaHV0ZG93bi4gIFRoaXMgc29sdXRpb24gd2FzCgkgICAgc3VnZ2VzdGVkIGhlcmU6IGh0dHA6Ly9idWdzLnBocC5uZXQvYnVnLnBocD9pZD00MDk4NQoKMDQvMDMvMjAwNzogb2xseQoJICAgIFtQSFA0XSBBZGQgbWlzc2luZyBaVFMgYW5ub3RhdGlvbnMgdG8gZ2VuZXJhdGVkIEMrKyB3cmFwcGVyIGNvZGUKCSAgICB0byBmaXggY29tcGlsYXRpb24gZmFpbHVyZXMgd2hlbiB1c2luZyBaVFMgZW5hYmxlZCBTV0lHIChMaW51eAoJICAgIGRpc3RyaWJ1dGlvbnMgdGVuZCB0byBkaXNhYmxlIFpUUywgYnV0IG5vdGFibHkgdGhlIFdpbmRvd3MgYnVpbGQKCSAgICB1c2VzIGl0IGJ5IGRlZmF1bHQpLgoKMDQvMDEvMjAwNzogZWZ1enp5b25lCiAgICAgICAgICAgIFtDRkZJXSBQYXRjaCAjMTY4NDI2MTogZml4ZXMgaGFuZGxpbmcgb2YgdW5zaWduZWQgaW50IGxpdGVyYWxzLCB0aGFua3MgTGVpZ2ggU21pdGguCiAgICAgICAgICAgIEFsc28sIGltcHJvdmVkIGRvY3VtZW50YXRpb24uCgowMy8zMC8yMDA3OiBvbGx5CgkgICAgQXZvaWQgZ2VuZXJhdGluZyAnPDonIHRva2VuIHdoZW4gdXNpbmcgU3dpZ1ZhbHVlV3JhcHBlcjw+IG9uIGEgdHlwZQoJICAgIHdoaWNoIHN0YXJ0cyB3aXRoICc6OicgKHBhdGNoICMxNjkwOTQ4KS4KCjAzLzI1LzIwMDc6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtwZXJsNV0gQWRkIFNXSUdfZmFpbCB0byB0aGUgU1dJR19leGNlcHRpb24gbWFjcm8uICBGaXhlcyBhIGZldyBwcm9ibGVtcyByZXBvcnRlZAoJICAgIG9uIHRoZSBtYWlsaW5nIGxpc3QuCgowMy8yMy8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBTdHJpbmcgY29weWluZyBwYXRjaCBmcm9tIEpvc2ggQ2hlcnJ5IHJlZHVjaW5nIG1lbW9yeSBjb25zdW1wdGlvbiBieSBhYm91dCAyNSUuCgowMy8yMS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gQXBwbHkgcGF0Y2ggIzE2MzE5ODcgZnJvbSBVbHJpayBQZXRlcnNvbiAtIGJvb2wgSU5PVVQgdHlwZW1hcHMKICAgICAgICAgICAgZmFpbCBvbiBiaWcgZW5kaWFuIG1hY2hpbmVzLgoKMDMvMTYvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNlZyBmYXVsdCBnaXZlbiBkb2RneSBDKysgY29kZTogbmFtZXNwYWNlIGFiYzo6ZGVmIHsgfQoKMDMvMTYvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeGVzIHNvIHRoYXQgQVJSQVlTT0ZDTEFTU0VTIGFuZCBBUlJBWVNPRkVOVU1TIGluIGFycmF5c19qYXZhLmkgY2FuIGJlIGFwcGxpZWQKICAgICAgICAgICAgdG8gcG9pbnRlciB0eXBlcy4KCjAzLzAzLzIwMDc6IG9sbHkKCSAgICBbUEhQNV0gV2hlbiB3ZSBrbm93IHRoZSBsaXRlcmFsIG51bWVyaWMgdmFsdWUgZm9yIGEgY29uc3RhbnQsIHVzZQoJICAgIHRoYXQgdG8gaW5pdGlhbGlzZSB0aGUgY29uc3QgbWVtYmVyIGluIHRoZSBQSFAgd3JhcHBlciBjbGFzcy4KCjAzLzAyLzIwMDc6IG9sbHkKCSAgICBbUEhQNV0gRml4IFBIUCB3cmFwcGVyIGNvZGUgZ2VuZXJhdGVkIGZvciBjZXJ0YWluIGNhc2VzIG9mCgkgICAgb3ZlcmxvYWRlZCBmb3JtcyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzLgoKMDIvMjYvMjAwNzogZWZ1enp5b25lCiAgICAgICAgICAgIFtDRkZJXSBQYXRjaCAjMTY1NjM5NTogZml4ZWQgaGV4IGFuZCBvY3RhbCB2YWx1ZXMgYnVnLCB0aGFua3MgdG8gQXJ0aHVyIFNteWxlcy4KCjAyLzIyLzIwMDc6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEZpeGVkIGJ1ZyBpbiB0eXBlbWFwcyB3aGljaCBjYXVzZWQgZGVyaXZlZF9ieXZhbHVlIGFuZCBybmFtZSB0ZXN0IGNhc2VzIHRvIGZhaWwuCgkgICAgVXBkYXRlZCBkZXJpdmVkX2J5dmFsdWUuaSB0byBleHBsYWluIGhvdyB0byBmaW5kIGFuZCBmaXggdGhlIHByb2JsZW0KCjAxLzI1LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTUzODUyMiBhbmQgIzEzMzg1MjcsIGZvcndhcmQgdGVtcGxhdGVkIGNsYXNzIGRlY2xhcmF0aW9ucyB3aXRob3V0IGEKICAgICAgICAgICAgbmFtZSBmb3IgdGhlIHRlbXBsYXRlZCBjbGFzcyBwYXJhbWV0ZXJzLCBzdWNoIGFzOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIGNsYXNzPiBjbGFzcyBYOwoKMDEvMjMvMjAwNzogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gUGF0Y2ggIzE2NDA4NjI6IDxtYWxsb2MuaD4gcmVwbGFjZWQgYnkgPHN0ZGxpYi5oPgoJICAgIFBhdGNoICMxNTk4MDYzIFR5cG8gaW4gdHlwZW1hcHMuaQoKMDEvMjIvMjAwNzogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gQWRkZWQgYSBsdWEgc3BlY2lmaWMgY2FycmF5cy5pIHdoaWNoIGFkZHMgdGhlIG9wZXJhdG9yW10gc3VwcG9ydC4KCSAgICBtb2RpZmllZCB0aGUgbWFpbiBjb2RlIHRvIG1ha2UgaXQgbm90IGVtaXQgYWxsIHRoZSBjbGFzcyBtZW1iZXIgZnVuY3Rpb25zICYgYWNjZXNzb3JzCgkgICAgTm90ZTogQyBzdHJ1Y3RzIGFyZSBjcmVhdGVkIHVzaW5nIG5ld19YWFgoKSB3aGlsZSBDKysgY2xhc3NlcyB1c2UgWFhYKCkgKHNob3VsZCBiZSBzdGFuZGFyZGlzZWQpCgkgICAgVXBkYXRlZCB0ZXN0IGNhc2U6IGxpX2NhcnJheXMKCSAgICBVcGRhdGVkIHRoZSBkb2N1bWVudGF0aW9uLgoKMDEvMTIvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW1BocF0gQWRkIHN1cHBvcnQgZm9yIG5ld2ZyZWUgdHlwZW1hcHMgKHNvbWV0aW1lcyB1c2VkIGJ5ICVuZXdvYmplY3QpCgowMS8xMi8yMDA3OiBiZWF6bGV5CiAgICAgICAgICAgIE5ldyBjb21tYW5kIGxpbmUgb3B0aW9uIC1tYWNyb2Vycm9ycy4gICBXaGVuIHN1cHBsaWVkLCB0aGlzIHdpbGwgZm9yY2UKICAgICAgICAgICAgdGhlIEMgc2Nhbm5lci9wYXJzZXIgdG8gcmVwb3J0IHByb3BlciBsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgY29kZSBjb250YWluZWQKICAgICAgICAgICAgaW5zaWRlIFNXSUcgbWFjcm9zIChkZWZpbmVkIHdpdGggJWRlZmluZSkuICBCeSBkZWZhdWx0LCBTV0lHIG1lcmVseSByZXBvcnRzCiAgICAgICAgICAgIGVycm9ycyBvbiB0aGUgbGluZSBhdCB3aGljaCBhIG1hY3JvIGlzIHVzZWQuICBXaXRoIHRoaXMgb3B0aW9uLCB5b3UKICAgICAgICAgICAgY2FuIGV4cGFuZCB0aGUgZXJyb3IgYmFjayB0byBpdHMgc291cmNlLS0tc29tZXRoaW5nIHdoaWNoIG1heSBzaW1wbGlmeQogICAgICAgICAgICBkZWJ1Z2dpbmcuCgowMS8xMi8yMDA3OiBiZWF6bGV5CiAgICAgICAgICAgIFtJbnRlcm5hbHNdIE1ham9yIG92ZXJoYXVsIG9mIEMvQysrIHNjYW5uaW5nIGltcGxlbWVudGF0aW9uLiAgRm9yIHF1aXRlCiAgICAgICAgICAgIHNvbWUgdGltZSwgU1dJRyBjb250YWluZWQgdHdvIGNvbXBsZXRlbHkgaW5kZXBlbmRlbnQgQy9DKysgdG9rZW5pemVycy0tCiAgICAgICAgICAgIHRoZSBsZWdhY3kgc2Nhbm5lciBpbiBDUGFyc2UvY3NjYW5uZXIuYyBhbmQgYSBnZW5lcmFsIHB1cnBvc2Ugc2Nhbm5lcgogICAgICAgICAgICBpbiBTd2lnL3NjYW5uZXIuYy4gU1dJRyBzdGlsbCBoYXMgdHdvIHNjYW5uaW5nIG1vZHVsZXMsIGJ1dCB0aGUgQyBwYXJzZXIKICAgICAgICAgICAgc2Nhbm5lciAoQ1BhcnNlL2NzY2FubmVyLmMpIG5vdyByZWxpZXMgdXBvbiB0aGUgZ2VuZXJhbCBwdXJwb3NlCiAgICAgICAgICAgIHNjYW5uZXIgZm91bmQgaW4gU3dpZy9zY2FubmVyLmMuICBBcyBhIHJlc3VsdCwgaXQgaXMgbXVjaCBzbWFsbGVyIGFuZAogICAgICAgICAgICBsZXNzIGNvbXBsaWNhdGVkLiAgVGhpcyBjaGFuZ2UgYWxzbyBtYWtlcyBpdCBwb3NzaWJsZSB0byBtYWludGFpbiBhbGwKICAgICAgICAgICAgb2YgdGhlIGxvdy1sZXZlbCBDIHRva2VuaXppbmcgaW4gb25lIGNlbnRyYWwgbG9jYXRpb24gaW5zdGVhZCBvZiB0d28KICAgICAgICAgICAgcGxhY2VzIGFzIGJlZm9yZS4KCiAgICAgICAgICAgICoqKlBPVEVOVElBTCBGTEFLSU5FU1MqKioKICAgICAgICAgICAgVGhpcyBjaGFuZ2UgbWF5IGNhdXNlIHByb2JsZW1zIHdpdGggYWNjdXJhdGUgbGluZSBudW1iZXIgcmVwb3J0aW5nCiAgICAgICAgICAgIGFzIHdlbGwgYXMgZXJyb3IgcmVwb3J0aW5nIG1vcmUgZ2VuZXJhbGx5LiBJIGhhdmUgdHJpZWQgdG8gcmVzb2x2ZSB0aGlzCiAgICAgICAgICAgIGFzIG11Y2ggYXMgcG9zc2libGUsIGJ1dCB0aGVyZSBtaWdodCBiZSBzb21lIGNvcm5lciBjYXNlcy4KCjAxLzEyLzIwMDc6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEFkZGVkIHR5cGVtYXAgdGhyb3dzIGZvciBzdGQ6OnN0cmluZyosIHR5cGVtYXAgZm9yIFNXSUdUWVBFIERZTkFNSUMsCgkgICAgY2hhbmdlZCB0aGUgZXhpc3RpbmcgdGhyb3dzIHR5cGVtYXAgdG8gdGhyb3cgYSBzdHJpbmcgaW5zdGVhZCBvZiBtYWtpbmcgYSBjb3B5IG9mCgkgICAgdGhlIG9iamVjdCAodXBkYXRpbmcgYSBmZXcgdGVzdCBjYXNlcyB0byBkZWFsIHdpdGggdGhlIGNoYW5nZSkuCgkgICAgZml4ZWQgdGVzdCBjYXNlOiBkeW5hbWljX2Nhc3RzLCBleGNlcHRpb25fcGFydGlhbF9pbmZvLCBsaV9zdGRfc3RyaW5nLCBzaXplX3QKCjAxLzAzLzIwMDc6IGJlYXpsZXkKICAgICAgICAgICAgW0ludGVybmFsc10uICBVc2Ugb2Ygc3dpZ2tleXMuYy8uaCB2YXJpYWJsZXMgaXMgcmV2b2tlZC4gIFBsZWFzZSB1c2UKICAgICAgICAgICAgc2ltcGxlIHN0cmluZ3MgZm9yIGF0dHJpYnV0ZSBuYW1lcy4KCjEyLzMwLzIwMDY6IGJlYXpsZXkKICAgICAgICAgICAgSW50ZXJuYWwgQVBJIGZ1bmN0aW9ucyBIYXNoR2V0QXR0cigpIGFuZCBIYXNoQ2hlY2tBdHRyKCkgaGF2ZSBiZWVuIHJldm9rZWQuCiAgICAgICAgICAgIFBsZWFzZSB1c2UgR2V0YXR0cigpIHRvIHJldHJpZXZlIGF0dHJpYnV0ZXMuICBUaGUgZnVuY3Rpb24gQ2hlY2thdHRyKCkgY2FuCiAgICAgICAgICAgIGJlIHVzZWQgdG8gY2hlY2sgYXR0cmlidXRlcy4gIE5vdGU6ICBUaGVzZSBmdW5jdGlvbnMgaGF2ZSBiZWVuIHJldm9rZWQKICAgICAgICAgICAgYmVjYXVzZSB0aGV5IG9ubHkgYWRkZWQgYSBtYXJnaW5hbCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBhdCB0aGUgZXhwZW5zZQogICAgICAgICAgICBjb2RlIGNsYXJpdHkuCgoxMi8yNi8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBBZGRlZCBtb3JlIFNUTCAobW9yZSBleGNlcHRpb25zLCBtYXAsIHNpemVfdCksCgkgICAgZml4ZWQgdGVzdCBjYXNlOiBjb252ZXJzaW9uX25zX3RlbXBsYXRlLgoKMTIvMjEvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gVXBkYXRlIHRvIHRocm93IGVycm9ycyB3aGVuIHNldHRpbmcgaW1tdXRhYmxlcywKCSAgICBhbmQgYWxsb3dpbmcgdXNlciBhZGRpdGlvbiBvZiBtb2R1bGUgdmFyaWFibGVzLgoKMTIvMjAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IHR5cGVkZWYnZCB2YXJpYWJsZSB3cmFwcGVycyB0aGF0IHVzZSAlbmF0dXJhbHZhciwgZWcsIHN0ZDo6c3RyaW5nLgoKMTIvMTQvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGQgc3RkOjp3c3RyaW5nIGFuZCB3Y2hhcl90IHR5cGVtYXBzCgoxMi8xNC8yMDA2OiBvbGx5CgkgICAgW3BocF0gRml4IGJ1ZyAjMTYxMzY3MyAoYmFkIFBIUDUgY29kZSBnZW5lcmF0ZWQgZm9yIGdldHRlcnMgYW5kCgkgICAgc2V0dGVycykuCgoxMi8wMi8yMDA2OiB3c2Z1bHRvbiwgSm9obiBMZW56LCBEYXZlIEJlYXpsZXkKICAgICAgICAgICAgTW92ZSBmcm9tIGN2cyB0byBTdWJ2ZXJzaW9uIGZvciBzb3VyY2UgY29udHJvbAoKMTEvMzAvMjAwNjogYmVhemxleQogICAgICAgICAgICBDbGVhbmVkIHVwIHN3aWd3YXJuaW5ncy5zd2cgZmlsZSBub3QgdG8gdXNlIG5lc3RlZCBtYWNybwogICAgICAgICAgICBkZWZpbml0aW9ucy4KCjExLzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gRml4IGZvciAlZXh0ZW5kIHRvIHdvcmsgZm9yIHN0YXRpYyBtZW1iZXIgdmFyaWFibGVzLgoKVmVyc2lvbiAxLjMuMzEgKE5vdmVtYmVyIDIwLCAyMDA2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMS8xMi8yMDA2OiBMdWlnaSBCYWxsYWJpbwogICAgICAgICAgICBbUHl0aG9uXSBBbHRlcm5hdGUgZml4IGZvciBQeXRob24gZXhjZXB0aW9ucyBidWcgIzE1NzgzNDYgKHRoZSBwcmV2aW91cyBvbmUgYnJva2UgUHl0aG9uCiAgICAgICAgICAgIHByb3BlcnRpZXMgaW4gbW9kZXJuIGNsYXNzZXMpCgoxMS8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICAtZmFrZXZlcnNpb24gY29tbWFuZGxpbmUgb3B0aW9uIG5vdyBnZW5lcmF0ZXMgdGhlIGZha2UgdmVyc2lvbiBpbnRvIHRoZSBnZW5lcmF0ZWQgd3JhcHBlcnMKICAgICAgICAgICAgYXMgd2VsbCBhcyBkaXNwbGF5aW5nIGl0IHdoZW4gdGhlIC12ZXJzaW9uIGNvbW1hbmRsaW5lIG9wdGlvbiBpcyB1c2VkLgoKMTQvMTEvMjAwNjogbWdvc3NhZ2UKCSAgICBbbHVhXSB1cGRhdGUgdG8gdHlwZW1hcCBmb3Igb2JqZWN0IGJ5IHZhbHVlLCB0byBtYWtlIGl0IGM4OSBjb21wbGlhbnQKClZlcnNpb24gMS4zLjMwIChOb3ZlbWJlciAxMywgMjAwNikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTEvMTIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW2phdmFdIFJlbW92ZSBEZXRhY2hDdXJyZW50VGhyZWFkIHBhdGNoIGZyb20gIDA4LzExLzIwMDYgLSBpdCBjYXVzZXMgc2VnZmF1bHRzCiAgICAgICAgICAgIG9uIHNvbWUgc3lzdGVtcy4KCjExLzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtweXRob25dIEZpeCAjMTU3ODM0NiAtIFB5dGhvbiBleGNlcHRpb25zIHdpdGggLW1vZGVybgoKMTEvMTAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxNTkzMjkxIC0gU21hcnQgcG9pbnRlcnMgYW5kIGluaGVyaXRpbmcgZnJvbSB0ZW1wbGF0ZXMgCgoxMS8wOS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZGlyZWN0b3Igb3BlcmF0b3IgcG9pbnRlci9yZWZlcmVuY2UgY2FzdHMgLSAjMTU5MjE3My4KCjExLzA3LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCAkc2VsZiBzcGVjaWFsIHZhcmlhYmxlIGZvciAlZXh0ZW5kIG1ldGhvZHMuIFBsZWFzZSB1c2UgdGhpcyBpbnN0ZWFkIG9mIGp1c3QgJ3NlbGYnCiAgICAgICAgICAgIGFzIHRoZSBDKysgJ3RoaXMnIHBvaW50ZXIuCgoxMS8wNy8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdIAoJICAgIGFsbGVncm9jbC5zd2c6IHN3aWctZGVmdmFyIHVwZGF0ZWQgdG8gYWxsb3cgc3BlY2lmeWluZyBvZgoJICAgIAkJICAgbm9uLWRlZmF1bHQgZm9yZWlnbiB0eXBlICh2aWEgOmZ0eXBlIGtleXdvcmQgYXJnKS4KCSAgICBhbGxlZ3JvY2wuY3h4OiBTcGVjaWZ5IHByb3BlciBhY2Nlc3MgdHlwZSBmb3IgZW51bSB2YWx1ZXMuCgoxMS8wMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YS9DI10gRml4IGNvbnN0IHN0ZDo6c3RyaW5nJiByZXR1cm4gdHlwZXMgZm9yIGRpcmVjdG9ycyBhcyByZXBvcnRlZCBieQogICAgICAgICAgICBNYXJrIERvbnNlbHptYW5uCgoxMC8yOS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUmVtb3ZlIERlbGV0ZUxvY2FsUmVmIGZyb20gZW5kIG9mIGRpcmVjdG9yIG1ldGhvZHMgZm9yIG5vdyBhcyBpdCBpcyBjYXVzaW5nIGEKICAgICAgICAgICAgc2VnIGZhdWx0IHdoZW4gcnVuIG9uIFNvbGFyaXMgOC4KCjEwLzI5LzIwMDY6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtHdWlsZV0gUGF0Y2ggZnJvbSBDaHJpcyBTaG9lbWFrZXIgdG8gY2xlYW4gdXAgc29tZSB3YXJuaW5ncyBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuCgoxMC8yOS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gSW1wb3J0YW50IGZpeCB0byBwcmV2ZW50IGVhcmx5IGdhcmJhZ2UgY29sbGVjdGlvbiBvZiB0aGUgSmF2YSBwcm94eSBjbGFzcwogICAgICAgICAgICB3aGlsZSBpdCBpcyBiZWluZyB1c2VkIGluIGEgbmF0aXZlIG1ldGhvZC4gVGhlIGZpbmFsaXplciBjb3VsZCBkZXN0cm95IHRoZSB1bmRlcmx5aW5nCiAgICAgICAgICAgIEMrKyBvYmplY3Qgd2hpbGUgaXQgd2FzIGJlaW5nIHVzZWQuIFRoZSBwcm9ibGVtIG9jY3VycyB3aGVuIHRoZSBwcm94eSBjbGFzcyBpcyBubwogICAgICAgICAgICBsb25nZXIgc3Ryb25nbHkgcmVhY2hhYmxlIGFmdGVyIGEgbmF0aXZlIGNhbGwuICBUaGUgcHJvYmxlbSBzZWVtcyB0byBvY2N1ciBpbgogICAgICAgICAgICBtZW1vcnkgc3RyZXNzIHNpdHVhdGlvbnMgb24gc29tZSBKVk1zLiBJdCBkb2VzIG5vdCBzZWVtIHRvIG9jY3VyIG9uIHRoZQogICAgICAgICAgICBTdW4gY2xpZW50IEpWTSB1cCB0byBqZGsgMS41LiBIb3dldmVyIHRoZSAxLjYgY2xpZW50IGpkayBoYXMgYSBtb3JlIGFnZ3Jlc3NpdmUgZ2FyYmFnZQogICAgICAgICAgICBjb2xsZWN0b3IgYW5kIHNvIHRoZSBwcm9ibGVtIGRvZXMgb2NjdXIuIEl0IGRvZXMgb2NjdXIgb24gdGhlIFN1biBzZXJ2ZXIKICAgICAgICAgICAgSlZNcyAoY2VydGFpbmx5IDEuNCBvbndhcmRzKS4gVGhlIGZpeCBlbnRhaWxzIHBhc3NpbmcgdGhlIHByb3h5IGNsYXNzIGludG8gdGhlIG5hdGl2ZQogICAgICAgICAgICBtZXRob2QgaW4gYWRkaXRpb24gdG8gdGhlIEMrKyBwb2ludGVyIGluIHRoZSBsb25nIHBhcmFtZXRlciwgYXMgSmF2YSBjbGFzc2VzIGFyZSBub3QKICAgICAgICAgICAgY29sbGVjdGVkIHdoZW4gdGhleSBhcmUgcGFzc2VkIGludG8gSk5JIG1ldGhvZHMuIFRoZSBleHRyYSBwYXJhbWV0ZXIgY2FuIGJlIHN1cHByZXNzZWQKICAgICAgICAgICAgYnkgc2V0dGluZyB0aGUgbm9wZ2NwcCBhdHRyaWJ1dGUgaW4gdGhlIGp0eXBlIHR5cGVtYXAgdG8gIjEiIG9yIHVzaW5nIHRoZSBuZXcgLW5vcGdjcHAKICAgICAgICAgICAgY29tbWFuZGxpbmUgb3B0aW9uLgoKICAgICAgICAgICAgU2VlIEphdmEuaHRtbCNqYXZhX3BnY3BwIGZvciBmdXJ0aGVyIGRldGFpbHMgb24gdGhpcyB0b3BpYy4KCjEwLzI0LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IHNtYXJ0IHBvaW50ZXIgd3JhcHBlcnMuIFRoZSB2aXJ0dWFsL292ZXJyaWRlL25ldyBrZXl3b3JkIGlzIG5vdCBnZW5lcmF0ZWQKICAgICAgICAgICAgZm9yIGVhY2ggbWV0aG9kIGFzIHRoZSBzbWFydCBwb2ludGVyIGNsYXNzIGRvZXMgbm90IG1pcnJvciB0aGUgdW5kZXJseWluZyBwb2ludGVyCiAgICAgICAgICAgIGNsYXNzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4gU0YgIzE0OTY1MzUKCjEwLzI0LzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtsdWFdIGFkZGVkIHN1cHBvcnQgZm9yIG5hdGl2ZSBtZXRob2RzICYgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzLgogICAgICAgICAgICBmaXhlZCB0ZXN0IGNhc2VzIGFycmF5c19kaW1lbnNpb25sZXNzICYgY3BwX2Jhc2ljLiBBZGRlZCBuZXcgZXhhbXBsZSAoZnVuY3RvcikuCiAgICAgICAgICAgIHRpZGllZCB1cCBhIGxpdHRsZSBvZiB0aGUgY29kZSAoYXJvdW5kIGNsYXNzSGFuZGxlcikuCgoxMC8xNy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIGRpcmVjdG9yb3V0IHR5cGVtYXAgY2hhbmdlcyB0byBmYWxsIGluIGxpbmUgd2l0aCB0aGUgb3RoZXIgZGlyZWN0b3IKICAgICAgICAgICAgbGFuZ3VhZ2VzLiAkcmVzdWx0IGlzIG5vdyB1c2VkIHdoZXJlICQxIHVzZWQgdG8gYmUgdXNlZC4gUGxlYXNlIGNoYW5nZSB5b3VyIHR5cGVtYXBzCiAgICAgICAgICAgIGlmIHlvdSBoYXZlIGEgY3VzdG9tIGRpcmVjdG9yb3V0IHR5cGVtYXAuCgoxMC8xOC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBTb21lIGZpeGVzIGZvciBhcHBseWluZyB0aGUgY2hhciBhcnJheSB0eXBlbWFwcyB0byB1bnNpZ25lZCBjaGFyIGFycmF5cy4KCjEwLzE3LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gQWRkIGluIGNvbnN0IHNpemVfdCYgYW5kIGNvbnN0IHN0ZDo6c2l6ZV90JiB0eXBlbWFwcy4KCjEwLzE1LzIwMDY6IGVmdXp6eW9uZSAKICAgICAgICAgICAgW0NGRkldIFN1cHByZXNzIGdlbmVyYXRpbmcgZGVmY3R5cGUgZm9yIGVudW1zLCB0aGFua3MgdG8gQXJ0aHVyIFNteWxlcy4gUGF0Y2ggMTU2MDk4My4gCgoxMC8xNC8yMDA2OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW0NoaWNrZW5dIE1pbm9yIGZpeCB0byBtYWtlIFNXSUcgd29yayB3aXRoIHRoZSAoYXMgeWV0IHVucmVsZWFzZWQpIGNoaWNrZW4gMi41CgogICAgICAgICAgICBbR3VpbGUsQ2hpY2tlbl0gRml4IFNGIEJ1ZyAxNTczODkyLiAgQWRkZWQgYW4gZXh0X3Rlc3QgdG8gdGhlIHRlc3Qgc3VpdGUgdG8gdGVzdAogICAgICAgICAgICB0aGlzIGJ1ZywgYnV0IHRoaXMgdGVzdCBjYW4gbm90IHJlYWxseSBiZSBtYWRlIGdlbmVyaWMgYmVjYXVzZSB0aGUgZXh0ZXJuYWwgY29kZSBtdXN0CiAgICAgICAgICAgIHBsdWcgaW50byB0aGUgdGFyZ2V0IGxhbmd1YWdlIGludGVycHJldGVyIGRpcmVjdGx5LgogICAgICAgICAgICBTZWUgRXhhbXBsZXMvdGVzdC1zdWl0ZS9jaGlja2VuL2V4dF90ZXN0LmkgYW5kIGV4dF90ZXN0X2V4dGVybmFsLmN4eAoKICAgICAgICAgICAgQWRkZWQgYSAlLmV4dGVybmFsdGVzdCB0byBjb21tb24ubWssIGFuZCBhbnkgaW50ZXJlc3RlZCBsYW5ndWFnZSBtb2R1bGVzIGNhbgogICAgICAgICAgICBjb3B5IGFuZCBzbGlnaHRseSBtb2RpZnkgZWl0aGVyIHRoZSBjaGlja2VuIG9yIHRoZSBndWlsZSBleHRfdGVzdC5pCgoxMC8xNC8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBhZGRlZCBPVVRQVVQmIGZvciBhbGwgbnVtYmVyIHR5cGVzLCBhZGRlZCBhIGxvbmcgbG9uZyB0eXBlCiAgICAgICAgICAgIGZpeGVkIHNldmVyYWwgdGVzdCBjYXNlcy4KICAgICAgICAgICAgdXBkYXRlOiBjaGFuZ2VkIHR5cGVtYXBzIHRvIHVzZSBTV0lHX0NvbnZlcnRQdHIgcmF0aGVyIHRoYW4gU1dJR19NdXN0R2V0UG9pbnRlcgogICAgICAgICAgICBzdGFydGVkIHNwbGl0aW5nIGx1YS5zd2cgaW50byBzbWFsbGVyIHBhcnRzIHRvIG1ha2UgaXQgbmVhdGVyCgoxMC8xMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIE1hcmdpbmFsbHkgYmV0dGVyIHN1cHBvcnQgZm9yIG11bHRpcGxlIGluaGVyaXRhbmNlIG9ubHkgaW4gdGhhdCB5b3UgY2FuCiAgICAgICAgICAgIGNvbnRyb2wgd2hhdCB0aGUgYmFzZSBjbGFzcyBpcy4gVGhpcyBpcyBkb25lIHVzaW5nIHRoZSBuZXcgJ3JlcGxhY2UnIGF0dHJpYnV0ZSBpbiB0aGUgCiAgICAgICAgICAgIGphdmFiYXNlL2NzYmFzZSB0eXBlbWFwLCBlZyBpbiB0aGUgZm9sbG93aW5nLCAnTWUnIHdpbGwgYmUgdGhlIGJhc2UgY2xhc3MsCiAgICAgICAgICAgIG5vIG1hdHRlciB3aGF0IEZvbyBpcyByZWFsbHkgZGVyaXZlZCBmcm9tIGluIHRoZSBDKysgbGF5ZXIuCgogICAgICAgICAgICAgICV0eXBlbWFwKGphdmFiYXNlLCByZXBsYWNlPSIxIikgRm9vICJNZSI7CiAgICAgICAgICAgICAgJXR5cGVtYXAoY3NiYXNlLCByZXBsYWNlPSIxIikgRm9vICJNZSI7CgogICAgICAgICAgICBQcmV2aW91c2x5IGl0IHdhcyBub3QgcG9zc2libGUgZm9yIHRoZSBqYXZhYmFzZS9jc2Jhc2UgdHlwZW1hcHMgdG8gb3ZlcnJpZGUgdGhlIEMrKyBiYXNlLgoKMTAvMTIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFJlbW92ZSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb24gb24gdGhlIHByb3h5IGNsYXNzJyBkZWxldGUoKSBtZXRob2QgCiAgICAgICAgICAgIChpdCBpcyBub3cgYSBzeW5jaHJvbml6ZWQgbWV0aG9kLCBidXQgaXMgbm93IGN1c3RvbWlzYWJsZSBieSBjaGFuZ2luZyB0aGUgCiAgICAgICAgICAgIG1ldGhvZG1vZGlmaWVycyBhdHRyaWJ1dGUgaW4gdGhlIGphdmFkZXN0cnVjdCBvciBqYXZhZGVzdHJ1Y3RfZGVyaXZlZCB0eXBlbWFwKQoKICAgICAgICAgICAgW0MjXSBSZW1vdmUgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9uIG9uIHRoZSBwcm94eSBjbGFzcycgRGlzcG9zZSgpIG1ldGhvZCwgCiAgICAgICAgICAgIHNpbWlsYXIgdG8gSmF2YSdzIGRlbGV0ZSgpIGFib3ZlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMC8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieSwgUHl0aG9uXSBSZW1vdmUgcmVkdW5kYW50IGRpcmVjdG9yIGNvZGUgaW4gJWV4dGVuZCBtZXRob2RzICglZXh0ZW5kCiAgICAgICAgICAgIG1ldGhvZHMgY2Fubm90IGJlIGRpcmVjdG9yIG1ldGhvZHMpCgoxMC8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieSwgUHl0aG9uXSBGaXggIzE1MDU1OTQgLSBkaXJlY3RvciBvYmplY3RzIG5vdCByZXR1cm5lZCBhcyBkaXJlY3RvciBvYmplY3RzCiAgICAgICAgICAgIGluICVleHRlbmQgbWV0aG9kcy4KCjEwLzExLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggIzEyMzg3OTggLSBEaXJlY3RvcnMgdXNpbmcgdW5zaWduZWQgbG9uZyBsb25nIG9yIGFueSBvdGhlciB0eXBlCiAgICAgICAgICAgIG1hcnNoYWxsZWQgYWNyb3NzIHRoZSBKTkkgYm91bmRhcnkgdXNpbmcgYSBKYXZhIGNsYXNzICh3aGVyZSB0aGUgam5pIHR5cGVtYXAgCiAgICAgICAgICAgIGNvbnRhaW5zIGpvYmplY3QpLgoKMTAvMDYvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxMTYyMTk0IC0gI2luY2x1ZGUvJWluY2x1ZGUgd2l0aGluIGEgc3RydWN0dXJlCgoxMC8wNi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE0NTA2NjEsIHN0cmluZyB0cnVuY2F0aW9uIGluIFN0cmluZ19zZWVrIHRydW5jYXRpbmcgSmF2YS9DIyBlbnVtcy4KCjEwLzA2LzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEZpeCAjMTU2OTU4Ny4gVGhlIG5hbWUgaXMgbm93IGNvcnJlY3QuCgoxMC8wNC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBEaXJlY3RvciBmaXhlcyBmb3IgdmlydHVhbCBjb252ZXJzaW9uIG9wZXJhdG9ycwoKMTAvMDQvMjAwNjogb2xseQoJICAgIFtwaHBdIEZpeCAjMTU2OTU4NyBmb3IgUEhQLiAgRG9uJ3QgdXNlIHNpemVvZigpIGV4Y2VwdCB3aXRoIHN0cmluZwoJICAgIGxpdGVyYWxzLiAgQ2hhbmdlIHNvbWUgIi8vIiBjb21tZW50cyB0byAiLyogKi8iIGZvciBwb3J0YWJpbGl0eS4KCjEwLzA0LzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIFBhcnRpYWwgRml4ICMxNTY5NTg3LiBUaGUgdHlwZSBpcyBub3cgY29ycmVjdCwgYnV0IHRoZSBuYW1lIGlzIHN0aWxsIG5vdCBjb3JyZWN0LgoKMTAvMDMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEZpeCAjMTUyNzg4NSAtIE92ZXJsb2FkZWQgZGlyZWN0b3IgdmlydHVhbCBtZXRob2RzIHNvbWV0aW1lcyBwcm9kdWNlZAogICAgICAgICAgICB1bmNvbXBpbGVhYmxlIGNvZGUgd2hlbiB1c2VkIHdpdGggdGhlIGRpcmVjdG9yOmV4Y2VwdCBmZWF0dXJlLgoKMTAvMDMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRGlyZWN0b3JzOiBEaXJlY3RvcnMgYXJlIG91dHB1dCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgZGVjbGFyZWQgaW4gCiAgICAgICAgICAgIHRoZSBDKysgY2xhc3MgcmF0aGVyIHRoYW4gaW4gc29tZSBwc2V1ZG8tcmFuZG9tIG9yZGVyLgoKMTAvMDMvMjAwNjogbW1hdHVzCiAgICAgICAgICAgIEZpeCAjMTQ4NjI4MSBhbmQgIzE0NzEwMzkuCgoxMC8wMy8yMDA2OiBvbGx5CgkgICAgW1BlcmxdIEZpeCBmb3IgaGFuZGxpbmcgc3RyaW5ncyB3aXRoIHplcm8gYnl0ZXMgZnJvbSBTdGVwaGVuIEh1dHNhbC4KCjA5LzMwLzIwMDY6IGVmdXp6eW9uZQogICAgICAgICAgICBbQ0ZGSV0gQml0ZmllbGQgc3VwcG9ydCBhbmQgdmFyYXJnIHN1cHBvcnQgZHVlIHRvIEFydGh1ciBTbXlsZXMuCiAgICAgICAgICAgIEMgZXhwcmVzc2lvbiB0byBMaXNwIGNvbnZlcnNpb24sIHRoYW5rcyB0byBBcnRodXIgU215bGVzIGZvciB0aGUgaW5pdGlhbAogICAgICAgICAgICBpZGVhLCBpdCBub3cgc3VwcG9ydHMgY29udmVyc2lvbiBmb3IgYSB3aG9sZSByYW5nZSBvZiBDIGV4cHJlc3Npb25zLiAKCjA5LzI4LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTUwODMyNyAtIE92ZXJsb2FkZWQgbWV0aG9kcyBhcmUgaGlkZGVuIHdoZW4gdXNpbmcgLWZ2aXJ0dWFsIG9wdGltaXNhdGlvbi4KICAgICAgICAgICAgT3ZlcmxvYWRlZCBtZXRob2RzIGFyZSBubyBsb25nZXIgY2FuZGlkYXRlcyBmb3IgZWxpbWluYXRpb24gLSB0aGlzIG1pbWljcwogICAgICAgICAgICBDKysgYmVoYXZpb3VyIHdoZXJlIGFsbCBvdmVybG9hZGVkIG1ldGhvZHMgbXVzdCBiZSBkZWZpbmVkIGFuZCBpbXBsZW1lbnRlZAogICAgICAgICAgICBpbiBhIGRlcml2ZWQgY2xhc3MgaW4gb3JkZXIgZm9yIHRoZW0gdG8gYmUgYXZhaWxhYmxlLgoKMDkvMjUvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnksIFB5dGhvbiwgT2NhbWxdIEZpeCAjMTUwNTU5MSBUaHJvd2luZyBleGNlcHRpb25zIGluIGV4dGVuZGVkIGRpcmVjdG9ycwoKMDkvMjUvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxMDU2MTAwIC0gdmlydHVhbCBvcGVyYXRvcnMuIAoKMDkvMjQvMjAwNjogb2xseQoJICAgIERvbid0IGFjY2lkZW50YWxseSBjcmVhdGUgYSAiPDoiIHRva2VuICh3aGljaCBpcyB0aGUgc2FtZSBhcyAiWyIgaW4gQysrKS4KCSAgICBGaXhlcyBidWcgIyAxNTIxNzg4LgoKMDkvMjMvMjAwNjogb2xseQoJICAgIFtSdWJ5XSBTdXBwb3J0IGJ1aWxkaW5nIHdpdGggcmVjZW50IHZlcnNpb25zIG9mIHRoZSBSdWJ5IDEuOQoJICAgIGRldmVsb3BtZW50IGJyYW5jaC4gIEZpeGVzIGJ1ZyAjMTU2MDA5Mi4KCjA5LzIzLzIwMDY6IG9sbHkKCSAgICBUZW1wbGF0ZXMgY2FuIG5vdyBiZSBpbnN0YW50aWF0ZWQgdXNpbmcgbmVnYXRpdmUgbnVtYmVycyBhbmQKCSAgICBjb25zdGFudCBleHByZXNzaW9ucywgZS5nLjoKCgkgICAgdGVtcGxhdGU8aW50IHE+IGNsYXNzIHgge307CgkgICAgJXRlbXBsYXRlKHhfbWludXMxKSB4PC0xPjsKCSAgICAldGVtcGxhdGUoeF8xcGx1czIpIHg8MSsyPjsKCgkgICAgQWxzbywgY29uc3RhbnQgZXhwcmVzc2lvbnMgY2FuIG5vdyBpbmNsdWRlIGNvbXBhcmlzb25zICg+LCA8LCA+PSwKCSAgICA8PSwgIT0sID09KSwgbW9kdWx1cyAoJSksIGFuZCB0ZXJuYXJ5IGNvbmRpdGlvbmFscyAoYSA/IGIgOiBjKS4KCgkgICAgRml4ZXMgYnVncyAjNjQ2Mjc1LCAjOTI1NTU1LCAjOTU2MjgyLCAjOTk0MzAxLgoKMDkvMjIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICVpZ25vcmUgb24gZGlyZWN0b3IgbWV0aG9kcyAtIEJ1Z3MgIzE1NDYyNTQsICMxNTQzNTMzCgowOS8yMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJWlnbm9yZSBvbiBkaXJlY3RvciBjb25zdHJ1Y3RvcnMKCjA5LzIwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzZWcgZmF1bHRzIGFuZCBhc3NlcnRzIHdoZW4gZGlyZWN0b3IgbWV0aG9kcyBhcmUgaWdub3JlZCAoIzE1NDM1MzMpCgowOS8yMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggb3V0IG9mIHNvdXJjZSBidWlsZHMgLSBidWcgIzE1NDQ3MTgKCjA5LzIwLzIwMDY6IG9sbHkKCSAgICBUcmVhdCBhIG5lc3RlZCBjbGFzcyBkZWZpbml0aW9uIGFzIGEgZm9yd2FyZCBkZWNsYXJhdGlvbiByYXRoZXIKCSAgICB0aGFuIGlnbm9yaW5nIGl0IGNvbXBsZXRlbHksIHNvIHRoYXQgd2UgZ2VuZXJhdGUgY29ycmVjdCBjb2RlIGZvcgoJICAgIHBhc3Npbmcgb3BhcXVlIHBvaW50ZXJzIHRvIHRoZSBuZXN0ZWQgY2xhc3MgKGZpeGVzIFNGIGJ1ZyAjOTA5Mzg3KS4KCjA5LzIwLzIwMDY6IG9sbHkKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgkgICAgW3BocF0gT3ZlcmxvYWQgcmVzb2x1dGlvbiBub3cgd29ya3MuICBIb3dldmVyIHRvIGFsbG93IHRoaXMsIFNXSUcKCSAgICBnZW5lcmF0ZWQgd3JhcHBlcnMgbm8gbG9uZ2VyIGNvZXJjZSBQSFAgdHlwZXMgKHdoaWNoIHJldmVydHMgYSBjaGFuZ2UKCSAgICBtYWRlIGluIDEuMy4yNikuICBTbyBmb3IgZXhhbXBsZSwgaWYgYSBtZXRob2QgdGFrZXMgYSBzdHJpbmcsIHlvdQoJICAgIGNhbiBubyBsb25nZXIgcGFzcyBhIG51bWJlciB3aXRob3V0IGV4cGxpY2l0bHkgY29udmVydGluZyBpdCB0byBhCgkgICAgc3RyaW5nIGluIFBIUCB1c2luZzogKHN0cmluZyl4CgowOS8xOC8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbQUxMXSBmaXggb24gc3dpZ2luaXQuc3dnLCBoYXMgYmVlbiByZXBvcnRlZCB0byBjcmFzaCBvbiBzZXZlcmFsIHRlc3QgY2FzZXMKCSAgICBmb3VuZCBhbmQgZml4ZWQgcHJvYmxlbSBpbiBpbXBvcnRzIHVuZGVyIHB5dGhvbiAobWluZ3cpCgowOS8xNi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBQYXRjaCBmcm9tIE1pY2hhbCBNYXJlayBmb3IgUHl0aG9uIDIuNSB0byBmaXggNjQgYml0IGFycmF5IGluZGV4ZXMgb24KICAgICAgICAgICAgNjQgYml0IG1hY2hpbmVzLgoKMDkvMTMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgVGhlIGV4cGxpY2l0Y2FsbCBmZWF0dXJlIGhhcyBiZWVuIHNjcmFwcGVkLiBUaGlzIGZlYXR1cmUgd2FzIGludHJvZHVjZWQgcHJpbWFyaWx5CiAgICAgICAgICAgIHRvIHNvbHZlIHJlY3Vyc2l2ZSBkaXJlY3RvciBtZXRob2QgY2FsbHMuIERpcmVjdG9yIHVwY2FsbCBpbXByb3ZlbWVudHMgbWFkZSBpbnN0ZWFkOgoKICAgICAgICAgICAgW1B5dGhvbiwgUnVieSwgT2NhbWxdIFRoZSBzd2lnX3VwIGZsYWcgaXMgbm8gbG9uZ2VyIHVzZWQuIFRoZSByZXF1aXJlZCBtdXRleGVzCiAgICAgICAgICAgIHdyYXBwaW5nIHRoaXMgZmxhZyBhcmUgYWxzbyBubyBsb25nZXIgbmVlZGVkLiBUaGUgcmVjdXJzaXZlIGNhbGxzIGdvaW5nIGZyb20gQysrCiAgICAgICAgICAgIHRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgYW5kIGJhY2sgYWdhaW4gZXRjIGFyZSBub3cgYXZvaWRlZCBieSBhIHN1YnRsZWx5IGRpZmZlcmVudAogICAgICAgICAgICBhcHByb2FjaC4gSW5zdGVhZCBvZiB1c2luZyB0aGUgc3dpZ191cCBmbGFnIGluIGVhY2ggZGlyZWN0b3IgbWV0aG9kIHRvIGluZGljYXRlCiAgICAgICAgICAgIHdoZXRoZXIgdGhlIGV4cGxpY2l0IEMrKyBjYWxsIHRvIHRoZSBhcHByb3ByaWF0ZSBiYXNlIGNsYXNzIG1ldGhvZCBvciBhIG5vcm1hbAogICAgICAgICAgICBwb2x5bW9ycGhpYyBDKysgY2FsbCBzaG91bGQgYmUgbWFkZSwgdGhlIG5ldyBhcHByb2FjaCBtYWtlcyBvbmUgb2YgdGhlc2UgY2FsbHMKICAgICAgICAgICAgZGlyZWN0bHkgZnJvbSB0aGUgd3JhcHBlciBtZXRob2QuCgogICAgICAgICAgICBbSmF2YSwgQyNdIFRoZSByZWN1cnNpdmUgY2FsbCBwcm9ibGVtIHdoZW4gY2FsbGluZyBhIEMrKyBiYXNlIGNsYXNzIG1ldGhvZCBmcm9tCiAgICAgICAgICAgIEphdmEvQyMgaXMgbm93IGZpeGVkLiBUaGUgaW1wbGVtZW50YXRpb24gaXMgc2xpZ2h0bHkgZGlmZmVyZW50IHRvIHRoZSBvdGhlciBsYW5ndWFnZXMKICAgICAgICAgICAgYXMgdGhlIGRldGVjdGlvbiBhcyB0byB3aGV0aGVyIHRoZSBleHBsaWNpdCBjYWxsIG9yIGEgbm9ybWFsIHBvbHltb3JwaGljIGNhbGwgaXMgbWFkZQogICAgICAgICAgICBpbiB0aGUgSmF2YS9DIyBsYXllciByYXRoZXIgdGhhbiBpbiB0aGUgQysrIGxheWVyLgoKMDkvMTEvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0FMTF0gdXBkYXRlZCBzd2lnaW5pdC5zd2cgdG8gYWxsb3cgbXVsdGlwbGUgaW50ZXJwcmV0ZXJzIHRvIHVzZSBtdWx0aXBsZQoJICAgIHN3aWcgbW9kdWxlcyBhdCBvbmNlLiBUaGlzIGhhcyBiZWVuIHRlc3RlZCBpbiBMdWEgKG1pbmd3ICYgbGludXgpLAoJICAgIHBlcmw1ICYgcHl0aG9uIChsaW51eCkgb25seS4KCjA5LzExLzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtsdWFdIGFkZGVkIHN1cHBvcnQgZm9yIHBhc3NpbmcgZnVuY3Rpb24gcG9pbnRlcnMgYXMgd2VsbCBhcyBuYXRpdmUgbHVhIG9iamVjdAogICAgICAgICAgICBpbnRvIHdyYXBwZXJlZCBmdW5jdGlvbi4KICAgICAgICAgICAgQWRkZWQgZXhhbXBsZSBmdW5jcHRyMyB0byBkZW1vbnN0cmF0ZSB0aGlzIGZlYXR1cmUKCjA5LzA1LzIwMDY6IG9sbHkKCSAgICBbcGhwXSBSZW5hbWUgRXJyb3JDb2RlIGFuZCBFcnJvck1zZyAjZGVmaW5lLXMgdG8gU1dJR19FcnJvckNvZGUKCSAgICBhbmQgU1dJR19FcnJvck1zZyB0byBhdm9pZCBjbGFzaGVzIHdpdGggY29kZSB0aGUgdXNlciBtaWdodCBiZQoJICAgIHdyYXBwaW5nIChwYXRjaCBmcm9tIERhcnJlbiBXYXJuZXIgaW4gU0YgYnVnICMxNDY2MDg2KS4gIEFueQoJICAgIHVzZXIgdHlwZW1hcHMgd2hpY2ggdXNlIEVycm9yQ29kZSBhbmQvb3IgRXJyb3JNc2cgZGlyZWN0bHkgd2lsbAoJICAgIG5lZWQgYWRqdXN0aW5nIC0geW91IGNhbiBlYXNpbHkgZml4IHRoZW0gdG8gd29yayB3aXRoIGJvdGggb2xkCgkgICAgYW5kIG5ldyBTV0lHIGJ5IGNoYW5naW5nIHRvIHVzZSBTV0lHX0Vycm9yTXNnIGFuZCBhZGRpbmc6CgoJCSNpZm5kZWYgU1dJR19FcnJvck1zZwoJCSNkZWZpbmUgU1dJR19FcnJvck1zZygpIEVycm9yTXNnKCkKCQkjZW5kaWYKCjA4LzI5LzIwMDY6IG9sbHkKCSAgICBbcGhwXSBNb3ZlIGNvbnN0YW50IGluaXRpYWxpc2F0aW9uIGZyb20gUklOSVQgdG8gTUlOSVQgdG8gZml4IGEKCSAgICB3YXJuaW5nIHdoZW4gdXNpbmcgQXBhY2hlIGFuZCBtb2RfcGhwLiAgV2Ugb25seSBuZWVkIHRvIGNyZWF0ZQoJICAgIFBIUCBjb25zdGFudHMgb25jZSB3aGVuIHdlJ3JlIGZpcnN0IGluaXRpYWxpc2VkLCBub3QgZm9yIGV2ZXJ5IEhUVFAKCSAgICByZXF1ZXN0LgoKMDgvMjEvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0KCSAgICBCdWdmaXggIzE1NDI0NjYgYWRkZWQgY29kZSB0byBhbGxvdyBtYXBwaW5nIEx1YSBuaWwncyA8LT4gQy9DKysgTlVMTCdzCgkgICAgdXBkYXRlZCB2YXJpb3VzIHR5cGVtYXBzIHRvIHdvcmsgY29ycmVjdGx5IHdpdGggdGhlIGNoYW5nZXMKCSAgICBhZGRlZCB2b2lkdGVzdF9ydW5tZS5sdWEgdG8gc2hvdyB0aGUgZmVhdHVyZXMgd29ya2luZwoKMDgvMTkvMjAwNjogd3V6emViIChKb2huIExlbnopCgkgICAgW0d1aWxlXSBBZGQgZmVhdHVyZTpjb25zdGFzdmFyIHRvIGV4cG9ydCBjb25zdGFudHMgYXMgdmFyaWFibGVzIGluc3RlYWQgb2YgZnVuY3Rpb25zCiAgICAgICAgICAgIHRoYXQgcmV0dXJuIHRoZSBjb25zdGFudCB2YWx1ZS4KCjA4LzExLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBEZXRhY2hDdXJyZW50VGhyZWFkIGNhbGxzIGhhdmUgYmVlbiBhZGRlZCBzbyB0aGF0IG5hdGl2ZWx5IGNyZWF0ZWQgdGhyZWFkcwogICAgICAgICAgICBubyBsb25nZXIgcHJldmVudCB0aGUgSlZNIGZyb20gZXhpdGluZy4gQnVnIHJlcG9ydGVkIGJ5IFRob21hcyBEdWR6aWFrIGFuZAogICAgICAgICAgICBQYXVsIE5vbGwuCgowOC8xMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCBkaXJlY3RvciBwcm90ZWN0ZWQgbWV0aG9kcyBzbyB0aGV5IHdvcmsKCjA3LzI1LzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBtb3JlIGFkZGl0aW9ucyB0byBzdGQ6OnN0cmluZywgc29tZSB0d2Vha3MgYW5kIHNtYWxsIGJ1ZyBmaXhlcwoJICAgIC1ub2N3cmFwIG1vZGUuCgowNy8yMS8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXQoJICAgIEJ1Z2ZpeCAjMTUyNjAyMiBwZGF0ZWQgc3RkOjpzdHJpbmcgdG8gc3VwcG9ydCBzdHJpbmdzIHdpdGggJ1wwJyBpbnNpZGUgdGhlbQoJICAgIHVwZGF0ZWQgdHlwZW1hcHMuaSB0byBhZGQgc3VwcG9ydCBmb3IgcG9pbnRlciB0byBwb2ludGVycwoKMDcvMTkvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIC0gQWRkIHN0ZF9zdHJpbmcuaSBzdXBwb3J0LgoJICAgIC0gQWRkIG5ld29iamVjdCBwYXRjaCBzdWJtaXR0ZWQgYnkgbWtvZXBwZSAodGhhbmtzISkKCSAgICAtIEZpeCB0eXBlIG5hbWUgbWlzbWF0Y2ggaXNzdWUgZm9yIG5lc3RlZCB0eXBlIGRlZmluaXRpb25zLgoJICAgICAgc3BlY2lmaWNhbGx5IHR5cGVkZWZzIGluIHRlbXBsYXRlZCBjbGFzcyBkZWZucy4KCjA3LzE4LzIwMDY6IG1nb3NzYWdlCgkgICAgQnVnZml4ICMxNTIyODU4CgkgICAgdXBkYXRlZCBsdWEuY3h4IHRvIHN1cHBvcnQgLWV4dGVybmFsLXJ1bnRpbWUgY29tbWFuZAoKMDcvMTQvMjAwNjogd3V6emViIChKb2huIExlbnopCgkgICAgSW5jcmVtZW50IHRoZSBTV0lHX1JVTlRJTUVfVkVSU0lPTiB0byAzLCBiZWNhdXNlIG9mIHRoZQoJICAgIGFkZGl0aW9uIG9mIHRoZSBvd25kYXRhIG1lbWJlciBpbiBzd2lnX3R5cGVfaW5mby4KCSAgICBSZXBvcnRlZCBieTogUHJhYmh1IFJhbWFjaGFuZHJhbgoKMDcvMDUvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgU2VhcmNoIHBhdGggZml4ZXM6CiAgICAgICAgICAgIC0gRml4IHNlYXJjaCBwYXRoIGZvciBsaWJyYXJ5IGZpbGVzIHRvIGJlaGF2ZSBhcyBkb2N1bWVudGVkIGluIExpYnJhcnkuaHRtbC4KICAgICAgICAgICAgLSBGaXggbWluZ3cvbXN5cyBidWlsZHMgd2hpY2ggZGlkIG5vdCBmaW5kIHRoZSBTV0lHIGxpYnJhcnkgd2hlbiBpbnN0YWxsZWQuCiAgICAgICAgICAgIC0gV2luZG93cyBidWlsZHMgYWxzbyBvdXRwdXQgdGhlIG1pbmd3L21zeXMgaW5zdGFsbCBsb2NhdGlvbiB3aGVuIHJ1bm5pbmcKICAgICAgICAgICAgICBzd2lnIC1zd2lnbGliLgogICAgICAgICAgICAtIFRoZSBub24tZXhpc3RlbnQgYW5kIHVuZG9jdW1lbnRlZCBjb25maWcgZGlyZWN0b3J5IGluIHRoZSBzZWFyY2ggcGF0aCBoYXMKICAgICAgICAgICAgICBiZWVuIHJlbW92ZWQuCgowNy8wNS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJHN5bW5hbWUgc3BlY2lhbCB2YXJpYWJsZSBleHBhbnNpb24uCgowNy8wNC8yMDA2OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbQ2hpY2tlbl0KCSAgICBBZGQgJWZlYXR1cmUoImNvbnN0YXN2YXIiKSwgd2hpY2ggaW5zdGVhZCBvZiBleHBvcnRpbmcgYSBjb25zdGFudCBhcyBhCgkgICAgc2NoZW1lIGZ1bmN0aW9uLCBleHBvcnRzIHRoZSBjb25zdGFudCBhcyBhIHNjaGVtZSB2YXJpYWJsZS4gIFVwZGF0ZSB0aGUKCSAgICBkb2N1bWVudGF0aW9uIGFzIHdlbGwuCgowNy8wNC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbU2VlIGVudHJ5IG9mIDA5LzEzLzIwMDYgLSBleHBsaWNpdGNhbGwgZmVhdHVyZSBhbmQgZG9jdW1lbnRhdGlvbiB0byBpdCByZW1vdmVkXQogICAgICAgICAgICBOZXcgZXhwbGljaXRjYWxsIGZlYXR1cmUgd2hpY2ggZ2VuZXJhdGVzIGFkZGl0aW9uYWwgd3JhcHBlcnMgZm9yIHZpcnR1YWwgbWV0aG9kcwogICAgICAgICAgICB0aGF0IGNhbGwgdGhlIG1ldGhvZCBleHBsaWNpdGx5LCBub3QgcmVseWluZyBvbiBwb2x5bW9ycGhpc20gdG8gbWFrZSB0aGUgbWV0aG9kCiAgICAgICAgICAgIGNhbGwuIFRoZSBmZWF0dXJlIGlzIGEgZmVhdHVyZSBmbGFnIGFuZCBpcyBlbmFibGVkIGxpa2UgYW55IG90aGVyIGZlYXR1cmUgZmxhZy4KICAgICAgICAgICAgSXQgYWxzbyByZWNvZ25pc2VzIGFuIGF0dHJpYnV0ZSwgInN1ZmZpeCIgZm9yIG1hbmdsaW5nIHRoZSBmZWF0dXJlIG5hbWUsIHNlZQogICAgICAgICAgICBTV0lHUGx1cy5odG1sI1NXSUdQbHVzX2V4cGxpY2l0Y2FsbCBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHMuCgogICAgICAgICAgICBbSmF2YSwgQyNdCiAgICAgICAgICAgIFRoZSBleHBsaWNpdGNhbGwgZmVhdHVyZSBpcyBhbHNvIGEgd29ya2Fyb3VuZCBmb3Igc29sdmluZyB0aGUgcmVjdXJzaXZlIGNhbGxzCiAgICAgICAgICAgIHByb2JsZW0gd2hlbiBhIGRpcmVjdG9yIG1ldGhvZCBtYWtlcyBhIGNhbGwgdG8gYSBiYXNlIGNsYXNzIG1ldGhvZC4gU2VlCiAgICAgICAgICAgIEphdmEuaHRtbCNqYXZhX2RpcmVjdG9yc19leHBsaWNpdGNhbGwgZm9yIHVwZGF0ZWQgZG9jdW1lbnRhdGlvbi4KCjA2LzI4LzIwMDY6IGpvZSAoSm9zZXBoIFdhbmcpCgkgICAgW3JdIEluaXRpYWwgc3VwcG9ydCBmb3IgUgoKMDYvMjAvMjAwNjogd3V6emViIChKb2huIExlbnopCgkgICAgW0NoaWNrZW5dCiAgICAgICAgICAgIE1pbm9yIGZpeGVzIHRvIGdldCBhcHBseV9zdHJpbmdzLmkgdGVzdHN1aXRlIHRvIHBhc3MKCSAgICBSZW1vdmUgaW50ZWdlcnNfcnVubWUuc2NtIGZyb20gdGhlIHRlc3RzdWl0ZSwgYmVjYXVzZSBTV0lHIGFuZCBDaGlja2VuIGRvZXMKICAgICAgICAgICAgaGFuZGxlIG92ZXJmbG93cy4KCjA2LzE5LzIwMDU6IG9sbHkKCSAgICBbcGhwXSBBZGQgc3VwcG9ydCBmb3IgZ2VuZXJhdGluZyBQSFA1IGNsYXNzIHdyYXBwZXJzIGZvciBDKysKCSAgICBjbGFzc2VzICh1c2UgInN3aWcgLXBocDUiKS4KCjA2LzE3LzIwMDY6IG9sbHkKCSAgICBbcGhwXSBBZGRlZCBzb21lIG1pc3Npbmcga2V5d29yZHMgdG8gdGhlIFBIUDQga2V5d29yZCBsaXN0LCBhbmQKCSAgICBmaXhlZCBfX0xJTkVfXyBhbmQgX19GSUxFX18gd2hpY2ggd2VyZSBpbiB0aGUgd3JvbmcgY2F0ZWdvcnkuCgkgICAgQWxzbyBhZGRlZCBhbGwgdGhlIGtleXdvcmRzIG5ldyBpbiBQSFA1LCBhbmQgYWRkZWQgY29tbWVudHMKCSAgICBub3RpbmcgdGhlIFBIUDQga2V5d29yZHMgd2hpY2ggYXJlbid0IGtleXdvcmRzIGluIFBIUDUuCgowNi8xNy8yMDA2OiBvbGx5CgkgICAgW3BocF0gRG9uJ3Qgc2VnZmF1bHQgaWYgUEhQIE51bGwgaXMgcGFzc2VkIGFzIHRoaXMgcG9pbnRlciAoZS5nLgoJICAgIENsYXNzX21ldGhvZChOdWxsKSkgLSBnaXZlIGEgUEhQIEVycm9yIGluc3RlYWQuCgowNi8xNS8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgQWRkIGluaXRpYWwgc3VwcG9ydCBmb3Igc3RkOjpsaXN0IGNvbnRhaW5lciBjbGFzcy4KCSAgICBGaXggYSBmZXcgYnVncyBpbiBoZWxwZXIgZnVuY3Rpb25zLgoKMDUvMTMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFJlcGxhY2UgSk5JRVhQT1JUIHdpdGggU1dJR0VYUE9SVCwgdGhlcmVieSBlbmFibGluZyB0aGUgcG9zc2liaWxpdHkKICAgICAgICAgICAgb2YgdXNpbmcgZ2NjIC1mdmlzaWJpbGl0eT1oaWRkZW4gZm9yIHBvdGVudGlhbGx5IHNtYWxsZXIgZmFzdGVyIGxvYWRpbmcgd3JhcHBlcnMuCgowNS8xMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yIE1ha2VmaWxlcyBmb3IgYXV0b2NvbmYtMi42MCBiZXRhCgowNS8xMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBWbGFkaW1pciBNZW5zaGFrb3YgcGF0Y2ggZm9yIGNvbXBpbGluZyB3cmFwcGVycyB3aXRoIHB5dGhvbi0yLjUgYWxwaGEuCgowNS8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggYnVmZmVyIG92ZXJmbG93IGVycm9yIHdoZW4gdXNpbmcgbGFyZ2UgJWZlYXR1cmUoZG9jc3RyaW5nKSByZXBvcnRlZAogICAgICAgICAgICBieSBKb3NlcGggV2luc3Rvbi4KCjA1LzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBPcGVyYXRvciBvdmVybG9hZCBmaXggZnJvbSBEYW5pZWwgTW9vcmUuCgowNS8yNS8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgRml4IGJ1ZyBpbiBnZW5lcmF0aW9uIG9mIENMT1MgdHlwZSBkZWNsYXJhdGlvbnMgZm9yIHVuaW9ucwoJICAgIGFuZCBlcXVpdmFsZW50IHR5cGVzLgoKMDUvMjQvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIERvbid0IHJlcXVpcmUgYSBmdWxsIGNsYXNzIGRlZmluaXRpb24gdG8gZ2VuZXJhdGUgYSBDTE9TIHdyYXBwZXIuCgowNS8yMC8yMDA2OiBvbGx5CgkgICAgW3BocF0gR0NDIFZpc2liaWxpdHkgc3VwcG9ydCBub3cgd29ya3Mgd2l0aCBQSFAuCgowNS8xOS8yMDA2OiBvbGx5CgkgICAgW3BocF0gUmVtb3ZlZCBzdXBwb3J0IGZvciAtZGxuYW1lICh1c2UgLW1vZHVsZSBpbnN0ZWFkKS4gIEZpeGVkCgkgICAgbmFtaW5nIG9mIFBIUCBleHRlbnNpb24gbW9kdWxlIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBQSFAKCSAgICBjb252ZW50aW9ucyAobm8gInBocF8iIHByZWZpeCBvbiBVbml4OyBvbiBQSFAgPj0gNC4zLjAsIGhhbmRsZSBVbml4CgkgICAgcGxhdGZvcm1zIHdoaWNoIHVzZSBzb21ldGhpbmcgb3RoZXIgdGhhbiAiLnNvIiBhcyB0aGUgZXh0ZW5zaW9uLikKCjA1LzEzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRGlyZWN0b3Igc3VwcG9ydCBhZGRlZAoKMDUvMDcvMjAwNjogb2xseQoJICAgIFtwaHBdIERvbid0IHNlZ2ZhdWx0IGlmIFBIUCBOdWxsIGlzIHBhc3NlZCB3aGVyZSBhIEMrKyByZWZlcmVuY2UKCSAgICBpcyB3YW50ZWQuCgowNS8wNS8yMDA2OiBvbGx5CgkgICAgW3BocF0gRml4IHdyYXBwZXJzIGdlbmVyYXRlZCBmb3IgZ2xvYmFsICdjaGFyJyB2YXJpYWJsZXMgdG8gbm90CgkgICAgaW5jbHVkZSBhIHRlcm1pbmF0aW5nIHplcm8gYnl0ZSBpbiB0aGUgUEhQIHN0cmluZy4KCjA1LzAzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIE1vZGlmeSB0eXBlbWFwcyBzbyB0aGF0IGNoYXIgKiBjYW4gYmUgYXBwbGllZCB0byB1bnNpZ25lZCBjaGFyICogb3Igc2lnbmVkIGNoYXIgKgogICAgICAgICAgICB0eXBlcyBhbmQgdmlzYSB2ZXJzYS4KCjA1LzAzLzIwMDY6IGVmdXp6eW9uZQoJICAgIFtjZmZpXVRoYW5rcyB0byBMdWtlIEogQ3Jvb2sgZm9yIHRoaXMgaWRlYS4KICAgICAgICAgICAgIC0gYSBzdHJ1Y3QvZW51bS91bmlvbiBpcyByZXBsYWNlZCB3aXRoIDpwb2ludGVyIG9ubHkgaWYKICAgICAgICAgICAgICAgdGhhdCBzbG90IGlzIGFjdHVhbGx5IGEgcG9pbnRlciB0byB0aGF0IHR5cGUuIFNvLDogCiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGFfc3RydWN0IHsgaW50IHg7IH0gYW5kCiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJfc3RydWN0IHsgYV9zdHJ1Y3Qgc3RydWN0XzE7IH07IAogICAgICAgICAgICAgICB3aWxsIGJlIGNvbnZlcnRlZCBhczoKICAgICAgICAgICAgICAgICAgIChjZmZpOmRlZmNzdHJ1Y3QgYl9zdHJ1Y3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdF8xIGFfc3RydWN0KSkKICAgICAgICAgICAgIC0gT3RoZXIgbWlub3IgZml4ZXMgaW4gbGlzcGlmeWluZyBuYW1lcy4KCjA1LzAyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBwb3NzaWJsZSByZWRlZmluaXRpb24gb2YgX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIGZvciBWQysrLgoKMDQvMTQvMjAwNjogZWZ1enp5b25lCgkgICAgW2NmZmldCiAgICAgICAgICAgIFRoYW5rcyB0byBUaG9tYXMgV2VpZG5lciBmb3IgdGhlIHBhdGNoLgogICAgICAgICAgICAtIHdoZW4gZmVhdHVyZSBleHBvcnQgaXMgc2V0IChleHBvcnQgJ2ZvbykgaXMgCiAgICAgICAgICAgICAgZ2VuZXJhdGVkIGZvciBldmVyeSBzeW1ib2wKICAgICAgICAgICAgLSB3aGVuIGZlYXR1cmUgaW5saW5lIGlzIHNldCAoZGVjbGFpbSAoaW5saW5lIGZvbykpIGlzIAogICAgICAgICAgICAgIGdlbmVyYXRlZCBiZWZvcmUgZXZlcnkgZnVuY3Rpb24gZGVmaW5pdGlvbgogICAgICAgICAgICAtIHdoZW4gZmVhdHVyZSBpbnRlcm5fZnVuY3Rpb24gaXMgc2V0IAogICAgICAgICAgICAgICMuKHZhbHVlLW9mLWludGVybi1mdW5jdGlvbiAibmFtZSIgIm5vZGVUeXBlIiBwYWNrYWdlKQogICAgICAgICAgICAgIGlzIGVtaXR0ZWQgaW5zdGVhZCBvZiB0aGUgcGxhaW4gc3ltYm9sLiBBIHNhbXBsZSBzd2lnLWxpc3BpZnkgCiAgICAgICAgICAgICAgaXMgcHJvdmlkZWQuCiAgICAgICAgICAgIC0gZXZlcnkgc3ltYm9sIGlzIHByZWZpeGVkIGJ5IGl0J3MgcGFja2FnZS4KCjA0LzEzLzIwMDY6IGVmdXp6eW9uZQoJICAgIFtjZmZpXQoJICAgIEZpeGVkIHRoZSBnZW5lcmF0aW9uIG9mIHdyYXBwZXJzIGZvciBnbG9iYWwgdmFyaWFibGVzLiAKICAgICAgICAgICAgQWRkZWQgdGhlIG9wdGlvbiBbbm9dc3dpZy1saXNwIHdoaWNoIHR1cm5zIG9uL29mZiBnZW5lcmF0aW9uIAogICAgICAgICAgICBvZiBjb2RlIGZvciBzd2lnIGhlbHBlciBsaXNwIG1hY3JvLCBmdW5jdGlvbnMsIGV0Yy4KClZlcnNpb24gMS4zLjI5IChNYXJjaCAyMSwgMjAwNikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDQvMDUvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIEZpeCBvdXRwdXQgdHlwZW1hcCBvZiBjaGFyIHNvIGl0IHByb2R1Y2VzIGEgY2hhcmFjdGVyIGluc3RlYWQKCSAgICBvZiBhbiBpbnRlZ2VyLiBBbHNvIGFkZHMgaW5wdXQvb3V0cHV0IHR5cGVtYXBzIGZvciAnY2hhciAqJy4KCgkgICAgYWRkIGNvbW1hbmQtbGluZSBhcmd1bWVudCAtaXNvbGF0ZSB0byBnZW5lcmF0ZSBhbiBpbnRlcmZhY2UKCSAgICBmaWxlIHRoYXQgd29uJ3QgaW50ZXJmZXJlIHdpdGggb3RoZXIgU1dJRyBnZW5lcmF0ZWQgZmlsZXMgdGhhdAoJICAgIG1heSBiZSB1c2VkIGluIHRoZSBzYW1lIGFwcGxpY2F0aW9uLgoKMDMvMjAvMjAwNTogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIE1vcmUgdHdlYWtzIHRvIElOUFVUL09VVFBVVCB0eXBlbWFwcyBmb3IgYm9vbC4KCgkgICAgRml4IGNvbnN0YW50V3JhcHBlciBmb3IgY2hhciBhbmQgc3RyaW5nIGxpdGVyYWxzLgoKCSAgICBmaW5kLWRlZmluaXRpb24ga2V5YmluZGluZ3Mgc2hvdWxkIHdvcmsgaW4gRUxJL1NMSU1FLgoJICAgIE91dHB1dCAoaW4tcGFja2FnZSA8bW9kdWxlLW5hbWU+KSB0byBsaXNwIHdyYXBwZXIKCSAgICBpbnN0ZWFkIG9mIChpbi1wYWNrYWdlICMuKnN3aWctbW9kdWxlLW5hbWUqKS4KCgkgICAgc2xpZ2h0IHJld29yayBvZiBtdWx0aXBsZSByZXR1cm4gdmFsdWVzLgoKCSAgICBkb2MgdXBkYXRlcy4KCjAzLzE3LzIwMDU6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBtYW5nbGUgbmFtZXMgb2YgY29uc3RhbnRzIGdlbmVyYXRlZCB2aWEgY29uc3RhbnRXcmFwcGVyLgoJICAgIAoJICAgIFdoZW4gdXNpbmcgT1VUUFVUIHR5cGVtYXBzIGFuZCB0aGUgZnVuY3Rpb24gaGFzIGEgbm9uLXZvaWQKCSAgICByZXR1cm4gdmFsdWUsIGl0IHNob3VsZCBiZSBmaXJzdCBpbiB0aGUgdmFsdWVzLWxpc3QsIGZvbGxvd2VkCgkgICAgYnkgdGhlIE9VVFBVVCBtYXBwZWQgdmFsdWVzLgoKCSAgICBGaXggYnVnIHdpdGggYm9vbGVhbiBwYXJhbWV0ZXJzLCB3aGljaCBuZWVkZWQgdG8gYmUKCSAgICBwYXNzZWQgaW4gYXMgaW50IHZhbHVlcywgcmF0aGVyIHRoYW4gVCBvciBOSUwuCgowMy8xNS8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgR2VuZXJhdGUgd3JhcHBlcnMgZm9yIGNvbnN0YW50cyB3aGVuIGluIEMrKyBvciAtY3dyYXAgbW9kZS4KCSAgICBNYWtlIC1jd3JhcCB0aGUgZGVmYXVsdCwgc2luY2UgaXQgaXMgbW9zdCBjb3JyZWN0LiBVc2VycwoJICAgIGNhbiB1c2UgdGhlIC1ub2N3cmFwIG9wdGlvbiB0byBhdm9pZCB0aGUgY3JlYXRpb24gb2YgYSAuY3h4CgkgICAgZmlsZSB3aGVuIGludGVyZmFjaW5nIHRvIEMgY29kZS4KCgkgICAgV2hlbiBpbiAtbm9jd3JhcCBtb2RlLCBpbXByb3ZlIHRoZSBoYW5kbGluZyBvZiBjb252ZXJ0aW5nCiAJICAgIGluZml4IGxpdGVyYWxzIHRvIHByZWZpeCBub3RhdGlvbiBmb3IgbGlzcC4gVGhpcyBpcyB2ZXJ5CgkgICAgYmFzaWMgYW5kIG5vdCBsaWtlbHkgdG8gYmUgaW1wcm92ZWQgdXBvbiBzaW5jZSB0aGlzIG9ubHkKCSAgICBhcHBsaWVzIHRvIHRoZSAtbm9jd3JhcCBjYXNlLiBMaXRlcmFscyB3ZSBjYW4ndCBmaWd1cmUgb3V0CgkgICAgd2lsbCByZXN1bHQgaW4gYSB3YXJuaW5nIGFuZCBiZSBpbmNsdWRlZCBpbiB0aGUgZ2VuZXJhdGVkCgkgICAgY29kZS4KCgkgICAgdmFsaWRJZGVudGlmaWVyIG5vdyBtb3JlIGNsb3NlbHkgYXBwcm94aW1hdGVzIHdoYXQgbWF5IGJlCgkgICAgYSBsZWdhbCBjb21tb24gbGlzcCBzeW1ib2wuCgoJICAgIEZpeCB0eXBlbWFwIGVycm9yIGluIGFsbGVncm9jbC5zd2cKCSAgICAKMDMvMTIvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIGZpeCB1cCBJTlBVVC9PVVRQVVQgdHlwZW1hcHMgZm9yIGJvb2wuCgkgICAgR2VuZXJhdGUgYysrIHN0eWxlIHdyYXBwZXIgZnVuY3Rpb25zIGZvciBzdHJ1Y3QvdW5pb24gbWVtYmVycwoJICAgIHdoZW4gLWN3cmFwIG9wdGlvbiBzcGVjaWZpZWQuCgowMy8xMC8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgRml4IGJ1ZyBpbiBDIHdyYXBwZXIgZ2VuZXJhdGlvbiBpbnRyb2R1Y2VkIGJ5IGxhc3QgYWxsZWdyb2NsCgkgICAgY29tbWl0LgoKMDMvMTAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdCiAgICAgICAgICAgIENvbW1pdCAjMTQ0NzMzNyAtIERlbGV0ZSBMb2NhbFJlZnMgYXQgdGhlIGVuZCBvZiBkaXJlY3RvciBtZXRob2RzIHRvIGZpeCBwb3RlbnRpYWwgbGVhawoKMDMvMTAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxNDQ0OTQ5IC0gY29uZmlndXJlIGRvZXMgbm90IGhvbm9yIC0tcHJvZ3JhbS1wcmVmaXguCiAgICAgICAgICAgIFJlbW92ZWQgbm9uLXN0YW5kYXJkIGNvbmZpZ3VyZSBvcHRpb24gLS13aXRoLXJlbGVhc2Utc3VmZml4LiBGaXggdGhlIGF1dG9jb25mIHN0YW5kYXJkCiAgICAgICAgICAgIG9wdGlvbnMgLS1wcm9ncmFtLXByZWZpeCBhbmQgLS1wcm9ncmFtLXN1ZmZpeCB3aGljaCB3ZXJlIGJlaW5nIHNob3duIGluIHRoZSBoZWxwLAogICAgICAgICAgICBidXQgd2VyZSBiZWluZyBpZ25vcmVkLiBVc2UgLS1wcm9ncmFtLXN1ZmZpeCBpbnN0ZWFkIG9mIC0td2l0aC1yZWxlYXNlLXN1ZmZpeCBub3cuCgowMy8xMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0KICAgICAgICAgICAgRml4ICMxNDQ2MzE5IHdpdGggcGF0Y2ggZnJvbSBhbmRyZWFzdGggLSBtb3JlIHRoYW4gb25lIHdzdHJpbmcgcGFyYW1ldGVyIGluIGRpcmVjdG9yIG1ldGhvZHMKCjAzLzA3LzIwMDY6IG1rb2VwcGUKCSAgICBbR3VpbGVdIAoJICAgIEZpeCBmb3IgbW9kdWxlIG5hbWVzIGNvbnRhaW5pbmcgYSAiLSIgaW4gbm9uLSJzaGFkb3ciIG1vZGUuCgkgICAgUGF0Y2ggZnJvbSBBYXJvbiBWYW5EZXZlbmRlciAoIzE0NDE0NzQpLgoKMDMvMDQvMjAwNjogbW1hdHVzCgkgICAgLSBBZGQgLU8gdG8gdGhlIG1haW4gcHJvZ3JhbSwgd2hpY2ggbm93IGVuYWJsZXMgLWZhc3RkaXNwYXRjaAoJICAgIAoJICAgIFtQeXRob25dCgoJICAgIC0gQWRkIHRoZSAtZmFzdGluaXQgb3B0aW9uIHRvIGVuYWJsZSBmYXN0ZXIgX19pbml0X18KICAgICAgICAgICAgICBtZXRob2RzLiBTZXR0aW5nICd0aGlzJyBhcyAnc2VsZi50aGlzLmFwcGVuZCh0aGlzKScgaW4gdGhlIHB5dGhvbgoJICAgICAgY29kZSBjb25mdXNlcyBQeUx1Y2VuZS4gTm93IHRoZSBpbml0aWFsaXphdGlvbiBpcyBkb25lIGluIHRoZQoJICAgICAgdGhlIEMrKyBzaWRlLCBhcyByZXBvcnRlZCBieSBBbmRpIGFuZCBSb2Jpbi4KCgkgICAgLSBBZGQgdGhlIC1mYXN0cXVlcnkgb3B0aW9uIHRvIGVuYWJsZSBmYXN0ZXIgU1dJR19UeXBlUXVlcnkgdmlhIGEKICAgICAgICAgICAgICBweXRob24gZGljdCBjYWNoZSwgYXMgcHJvcG9zZWQgYnkgQW5kaSBWYWpkYQoKCSAgICAtIEF2b2lkIHRvIGNhbGwgUHlPYmplY3RfR2V0QXR0ciBpbnNpZGUgU1dJR19QeXRob25fR2V0U3dpZ1RoaXMsCgkgICAgICBzaW5jZSB0aGlzIGNvbmZ1c2VzIFB5THVjZW5lLCBhcyByZXBvcnRlZCBieSBBbmRpIFZhamRhLgoJICAgIAowMy8wMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0KICAgICAgICAgICAgUmVtb3ZlZCBleHRyYSAodm9pZCAqKSBjYXN0IHdoZW4gY2FzdGluZyBwb2ludGVycyB0byBhbmQgZnJvbSBqbG9uZyBhcyB0aGlzCiAgICAgICAgICAgIHdhcyBzdXBwcmVzc2luZyBnY2MncyAiZGVyZWZlcmVuY2luZyB0eXBlLXB1bm5lZCBwb2ludGVyIHdpbGwgYnJlYWsgc3RyaWN0LWFsaWFzaW5nIHJ1bGVzIgogICAgICAgICAgICB3YXJuaW5nLiBUaGlzIHdhcm5pbmcgY291bGQgYmUgaWdub3JlZCBpbiB2ZXJzaW9ucyBvZiBnY2MgcHJpb3IgdG8gNC4wLCBidXQgbm93IHRoZQogICAgICAgICAgICB3YXJuaW5nIGlzIHVzZWZ1bCBhcyBnY2MgLU8yIGFuZCBoaWdoZXIgb3B0aW1pc2F0aW9uIGxldmVscyBpbmNsdWRlcyAtZnN0cmljdC1hbGlhc2luZyB3aGljaAogICAgICAgICAgICBnZW5lcmF0ZXMgY29kZSB0aGF0IGRvZXNuJ3Qgd29yayB3aXRoIHRoZXNlIGNhc3RzLiBUaGUgYXNzaWdubWVudCBpcyBzaW1wbHkgbmV2ZXIgbWFkZS4KICAgICAgICAgICAgUGxlYXNlIHVzZSAtZm5vLXN0cmljdC1hbGlhc2luZyB0byBib3RoIHN1cHByZXNzIHRoZSB3YXJuaW5nIGFuZCBmaXggdGhlIGJhZCBhc3NlbWJseQogICAgICAgICAgICBjb2RlIGdlbmVyYXRlZC4gTm90ZSB0aGF0IHRoZSB3YXJuaW5nIGlzIG9ubHkgZ2VuZXJhdGVkIGJ5IHRoZSBDIGNvbXBpbGVyLCBidXQgbm90CiAgICAgICAgICAgIHRoZSBDKysgY29tcGlsZXIsIHlldCB0aGUgQysrIGNvbXBpbGVyIHdpbGwgYWxzbyBnZW5lcmF0ZSBicm9rZW4gY29kZS4gQWx0ZXJuYXRpdmVseSB1c2UgCiAgICAgICAgICAgIC1Xbm8tc3RyaWN0LWFsaWFzaW5nIHRvIHN1cHByZXNzIHRoZSB3YXJuaW5nIGZvciBnY2MtMy54LiBUaGUgdHlwZW1hcHMgYWZmZWN0ZWQKICAgICAgICAgICAgYXJlIHRoZSAiaW4iIGFuZCAib3V0IiB0eXBlbWFwcyBpbiBqYXZhLnN3ZyBhbmQgYXJyYXlzX2phdmEuc3dnLiBVc2VycyBvdWdodCB0byBmaXgKICAgICAgICAgICAgdGhlaXIgb3duIHR5cGVtYXBzIHRvIGRvIHRoZSBzYW1lLiBOb3RlIHRoYXQgcmVtb3ZhbCBvZiB0aGUgdm9pZCAqIGNhc3Qgc2ltcGx5IHByZXZlbnRzCiAgICAgICAgICAgIHN1cHByZXNzaW9uIG9mIHRoZSB3YXJuaW5nIGZvciB0aGUgQyBjb21waWxlciBhbmQgbm90aGluZyBlbHNlLiBUeXBpY2FsIGNoYW5nZToKCiAgICAgICAgICAgIEZyb206CiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIFNXSUdUWVBFICogJXsgJDEgPSAqKCQmMV9sdHlwZSkodm9pZCAqKSYkaW5wdXQ7ICV9CiAgICAgICAgICAgIFRvOgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRSAqICV7ICQxID0gKigkJjFfbHR5cGUpJiRpbnB1dDsgJX0KCiAgICAgICAgICAgIEZyb206CiAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBTV0lHVFlQRSAqICV7ICooJCYxX2x0eXBlKSh2b2lkICopJiRyZXN1bHQgPSAkMTsgJX0gCiAgICAgICAgICAgIFRvOgogICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgU1dJR1RZUEUgKiAleyAqKCQmMV9sdHlwZSkmJHJlc3VsdCA9ICQxOyAlfSAKCjAzLzAyLzIwMDY6IG1rb2VwcGUKCSAgICBbR3VpbGUgLXNjbV0KCSAgICBBZGQgdHlwZW1hcHMgZm9yICJsb25nIGxvbmciOyB3aGV0aGVyIHRoZSBnZW5lcmF0ZWQgY29kZSBjb21waWxlcywgaG93ZXZlciwgZGVwZW5kcwoJICAgIG9uIHRoZSB2ZXJzaW9uIGFuZCBjb25maWd1cmF0aW9uIG9mIEd1aWxlLgoKMDMvMDIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXQogICAgICAgICAgICBBZGQgc3VwcG9ydCBmb3IgaW5uZXIgZXhjZXB0aW9ucy4gSWYgYW55IG9mIHRoZSBkZWxlZ2F0ZXMgYXJlIGNhbGxlZCB3aGljaCBjb25zdHJ1Y3QKICAgICAgICAgICAgYSBwZW5kaW5nIGV4Y2VwdGlvbiBhbmQgdGhlcmUgaXMgYWxyZWFkeSBhIHBlbmRpbmcgZXhjZXB0aW9uLCBpdCB3aWxsIGNyZWF0ZSB0aGUgbmV3CiAgICAgICAgICAgIGV4Y2VwdGlvbiB3aXRoIHRoZSBwZW5kaW5nIGV4Y2VwdGlvbiBhcyBhbiBpbm5lciBleGNlcHRpb24uCgowMy8wMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGhwXQogICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBQaHA1IGV4Y2VwdGlvbnMgaWYgY29tcGlsaW5nIGFnYWluc3QgUGhwNSAocGF0Y2ggZnJvbSBPbGx5IEJldHRzKS4KCjAzLzAxLzIwMDY6IG1tYXR1cwoJICAgIFVzZSB0aGUgR0NDIHZpc2liaWxpdHkgYXR0cmlidXRlIGluIFNXSUdFWFBPUlQuCgoJICAgIE5vdyB5b3UgY2FuIGNvbXBpbGUgKHdpdGggZ2NjIDMuNCBvciBsYXRlcikgdXNpbmcKCSAgICBDRkxBR1M9Ii1mdmlzaWJpbGl0eT1oaWRkZW4iLgoJICAgIAoJICAgIENoZWNrIHRoZSBkaWZmZXJlbmNlIGZvciB0aGUgJ3N0ZF9jb250YWluZXJzLmknIHB5dGhvbiAKCSAgICB0ZXN0IGNhc2U6CiAKICAgICAgICAgICAgU2l6ZXM6CgoJICAgICAgMzMwNTQzMiBfc3RkX2NvbnRhaW5lcnMuc28KCSAgICAgIDIzODM5OTIgX3N0ZF9jb250YWluZXJzLnNvLmhpZGRlbgoKCSAgICBFeHBvcnRlZCBzeW1ib2xzIChubSAtRCA8ZmlsZT4uc28gfCB3YyAtbCk6CgogICAgICAgICAgICAgIDYxNDYgX3N0ZF9jb250YWluZXJzLnNvIAogICAgICAgICAgICAgIDE3NCAgX3N0ZF9jb250YWluZXJzLnNvLmhpZGRlbiAKCgkgICAgRXhlY3V0aW9uIHRpbWVzOgoKCSAgICAgIHJlYWwgMG0wLjA1MHMgdXNlciAwbTAuMDM5cyBzeXMgMG0wLjAwNXMgICBfc3RkX2NvbnRhaW5lcnMuc28KICAgICAgICAgICAgICByZWFsIDBtMC4wMzlzIHVzZXIgMG0wLjAyNnMgc3lzIDBtMC4wMDdzICAgX3N0ZF9jb250YWluZXJzLnNvLmhpZGRlbgoKCSAgICBSZWFkIGh0dHA6Ly9nY2MuZ251Lm9yZy93aWtpL1Zpc2liaWxpdHkgZm9yIG1vcmUgZGV0YWlscy4KCgowMi8yNy8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgQWRkIHN1cHBvcnQgZm9yIElOUFVULCBPVVRQVVQsIGFuZCBJTk9VVCB0eXBlbWFwcy4KCSAgICBGb3IgT1VUUFVUIHZhcmlhYmxlcywgdGhlIGxpc3Agd3JhcHBlciByZXR1cm5zIG11bHRpcGxlCgkgICAgdmFsdWVzLgoKMDIvMjYvMjAwNjogbW1hdHVzCgoJICAgIFtSdWJ5XSBhZGQgYXJnY2FyZ3YuaSBsaWJyYXJ5IGZpbGUuCgkgICAgCgkgICAgVXNlIGl0IGFzIGZvbGxvdzoKCgkJJWluY2x1ZGUgYXJnY2FyZ3YuaQoJICAgICAgCQkJCQkJCQkJIAogICAJICAgICAgICAlYXBwbHkgKGludCBBUkdDLCBjaGFyICoqQVJHVikgeyAoc2l6ZV90IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KSB9IAoJICAgICAgCQkJCQkJCQkJIAogICAJICAgICAgICAlaW5saW5lIHsJCQkJCiAgIAkgICAgICAgICAgaW50IG1haW5BcHAoc2l6ZV90IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KSAJCiAgIAkgICAgICAgICAgewkJCQkJCQogICAJICAgICAgICAgICAgcmV0dXJuIGFyZ2M7CQkJCQkKICAgCSAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CQkJCQkJCQoJICAgICAgCQkJCQkJCQogICAJICAgIHRoZW4gaW4gdGhlIHJ1Ynkgc2lkZToJCQkJCQoJICAgICAgCQkJCQkJCQkKICAgCSAgICAgICAgYXJncyA9IFsiYXNkZiIsICJhc2RmMiJdCQkJCQogICAJICAgICAgICBuID0gbWFpbkFwcChhcmdzKTsKCQoKCSAgICBUaGlzIGlzIHRoZSBzaW1pbGFyIHRvIHRoZSBweXRob24gdmVyc2lvbiBMaWIvcHl0aG9uL2FyZ2Nhcmd2LmkKCjAyLzI0LzIwMDY6IG1nb3NzYWdlCgoJICAgIFNtYWxsIHVwZGF0ZSBMdWEgZG9jdW1lbnRzIG9uIHRyb3VibGVzaG9vdGluZyBwcm9ibGVtcwoJICAgIAowMi8yMi8yMDA2OiBtbWF0dXMgCgoJICAgIEZpeCBhbGwgdGhlIGVycm9ycyByZXBvcnRlZCBmb3IgMS4zLjI4LgoJICAgIC0gZml4IGJ1ZyAjMTE1ODE3OAoJICAgIC0gZml4IGJ1ZyAjMTA2MDc4OQoJICAgIC0gZml4IGJ1ZyAjMTI2MzQ1NwoJICAgIC0gZml4ICdjb25zdCAgY2hhciomJyB0eXBlbWFwIGluIHRoZSBVVEwsIHJlcG9ydGVkIGJ5IEdlb2ZmIEh1dGNoaXNvbgoJICAgIC0gZml4ZXMgZm9yIHB5dGhvbiAyLjEgYW5kIHRoZSBydW50aW1lIGxpYnJhcnkKCSAgICAtIGZpeCBjb3B5Y3RvciArIHRlbXBsYXRlIGJ1ZyAjMTQzMjEyNQoJICAgIC0gZml4IFsgMTQzMjE1MiBdICVyZW5hbWUgZnJpZW5kIG9wZXJhdG9ycyBpbiBuYW1lc3BhY2UKCSAgICAtIGZpeCBnY2Mgd2FybmluZyByZXBvcnRlZCBieSBSLiBCZXJuc3RlaW4KCSAgICAtIGF2b2lkIGFzc2VydCB3aGVuIGZpbmRpbmcgYSByZWN1cnNpdmUgc2NvcGUgaW5oZXJpdGFuY2UsCgkgICAgICBlbWl0IGEgd2FybmluZyBpbiB0aGUgd29yc3QgY2FzZSwgcmVwb3J0ZWQgYnkgTml0cm8gCgkgICAgLSBmaXggcHJlbWF0dXJlIG9iamVjdCBkZWxldGlvbiByZXBvcnRlZCBieSBQYXVsIGluIHRjbDNkCgkgICAgLSBmaXggd2FybmluZyByZXBvcnRlZCBieSBOaXRybyBpbiBWQzcKCSAgICAtIG1vcmUgZml4ZXMgZm9yIG9sZCBTb2xhcmlzIGNvbXBpbGVyCgkgICAgLSBmaXggZm9yIHB5dGhvbiAyLjMgYW5kIGdjX3JlZnMgaXNzdWUgcmVwb3J0ZWQgYnkgTHVpZ2kKCSAgICAtIGZpeCBmYXN0cHJveHkgZm9yIG1ldGhvZHMgdXNpbmcga3dhcmdzCgkgICAgLSBmaXggb3ZlcmxvYWQgKyBwcm90ZWN0ZWQgbWVtYmVyIGlzc3VlIHJlcG9ydGVkIGJ5IENvbGluIE1jRG9uYWxkCgkgICAgLSBmaXggc2V0ZXJyb3Jtc2cgYXMgcmVwb3J0ZWQgYnkgQ29saW4gTWNEb25hbGQKCSAgICAtIGZpeCBkaXJlY3RvcnMsIG5vdyB0aGUgdGVzdC1zdWl0ZSBydW5zIGFnYWluIHVzaW5nIC1kaXJlY3RvcnMKCSAgICAtIGZpeCBmb3IgZnJpZW5kIG9wZXJhdG9yIGFuZCBWaXN1YWwgc3R1ZGlvIGFuZCBidWcgMTQzMjE1MgoJICAgIC0gZml4IGJ1ZyAjMTQzNTA5MAoJICAgIC0gZml4IHVzaW5nICsgJWV4dGVuZCBhcyByZXBvcnRlZCBieSBXaWxsaWFtCgkgICAgLSBmaXggYnVnICMxMDk0OTY0CgkgICAgLSBmaXggZm9yIFB5X05vdEltcGxlbWVudGVkIGFzIHJlcG9ydGVkIGJ5IE9sbHkgYW5kIEFtYXVyeQoJICAgIC0gZml4IG5lc3RlZCBuYW1lc3BhY2UgaXNzdWUgcmVwb3J0ZWQgYnkgQ2hhcmxpZQoKCSAgICBhbmQgYWxzbzoKCSAgICAKCSAgICAtIGFsbG93IGRpcmVjdG9yIHByb3RlY3RlZCBtZW1iZXJzIGJ5IGRlZmF1bHQKCSAgICAtIGRlbGV0ZSBleHRyYSBuZXcgbGluZXMgaW4gc3dpZ21hY3Jvc1tVVExdCgkgICAgLSBjb3NtZXRpYyBmb3IgZ2VuZXJhdGVkIHB5dGhvbiBjb2RlCgkgICAgLSBhZGQgdGhlIGZhY3RvcnkuaSBsaWJyYXJ5IGZvciBVVEwKCSAgICAtIGFkZCBzd2lncmVnaXN0ZXIgcHJveHkgbWV0aG9kIGFuZCBtb3ZlIF9fcmVwcl9fIHRvIGEKCSAgICAgIHNpbmdsZSBnbG9iYWwgbW9kdWxlICBbcHl0aG9uXQoKMDIvMjIvMjAwNjogbW1hdHVzIAoKCSAgICBXaGVuIHVzaW5nIGRpcmVjdG9ycywgbm93IHN3aWcgd2lsbCBlbWl0IGFsbCB0aGUgdmlydHVhbAoJICAgIHByb3RlY3RlZCBtZXRob2RzIGJ5IGRlZmF1bHQuIAoKCSAgICBJbiBwcmV2aW91cyByZWxlYXNlcywgeW91IG5lZWRlZCB0byB1c2UgdGhlICdkaXJwcm90JwoJICAgIG9wdGlvbiB0byBhY2hpZXZlIHRoZSBzYW1lLgoKCSAgICBJZiB5b3Ugd2FudCwgeW91IGNhbiBkaXNhYmxlIHRoZSBuZXcgZGVmYXVsdCBiZWhhdmlvdXIsCgkgICAgdXNlIHRoZSAnbm9kaXJwcm90JyBvcHRpb246IAoKCSAgICAgICBzd2lnIC1ub2RpcnByb3QgLi4uCgoJICAgIGFuZC9vciB0aGUgJW5vZGlyZWN0b3IgZmVhdHVyZSBmb3Igc3BlY2lmaWMgbWV0aG9kcywgaS5lLjoKCgkgICAgICAgJW5vZGlyZWN0b3IgRm9vOjpiYXI7CgoJICAgICAgIHN0cnVjdCBGb28gewoJICAgICAgICAgdmlydHVhbCB+Rm9vKCk7CgoJICAgICAgIHByb3RlY3RlZDoKCSAgICAgICAgIHZpcnR1YWwgdm9pZCBiYXIoKTsKCSAgICAgICB9OwoJICAgIAoKCSAgICBBcyBiZWZvcmUsIHB1cmUgYWJzdHJhY3QgcHJvdGVjdGVkIG1lbWJlcnMgYXJlIGFsbHdheXMKCSAgICBlbWl0dGVkLCBpbmRlcGVuZGVudCBvZiB0aGUgJ2RpcnByb3Qvbm9kaXJwcm90JyBvcHRpb25zLgoKCjAyLzIyLzIwMDY6IG1tYXR1cwoJICAgIEFkZCB0aGUgZmFjdG9yeS5pIGxpYnJhcnkgZm9yIGxhbmd1YWdlcyB1c2luZyB0aGUgVVRMIChweXRob24sdGNsLHJ1YnkscGVybCkuCgkgICAgCiAgICAgICAgICAgIGZhY3RvcnkuaSBpbXBsZW1lbnRzIGEgbW9yZSBuYXR1cmFsIHdyYXAgZm9yIGZhY3RvcnkgbWV0aG9kcy4gCgoJICAgIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZToJCQkJCQkJICAgIAoJICAgIAkJCQkJCQkJICAgIAogIAkgICAgLS0tLSAgZ2VvbWV0cnkuaCAtLS0tLS0tLQkJCQkJICAgIAogIAkgICAgICAgICBzdHJ1Y3QgR2VvbWV0cnkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgCQkgICAgCiAgCSAgICAgICAgICAgZW51bSBHZW9tVHlwZXsJCQkgICAgIAkJCSAgICAKICAJICAgICAgICAgICAgIFBPSU5ULAkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAgICAgQ0lSQ0xFCQkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgfTsJCQkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgCQkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIHZpcnR1YWwgfkdlb21ldHJ5KCkge30gICAgCQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIHZpcnR1YWwgaW50IGRyYXcoKSA9IDA7CQkJCSAgICAKICAJICAgIAkgCQkJCQkJCSAgICAKICAJICAgIAkgLy8JCQkJCQkJICAgIAogIAkgICAgCSAvLyBGYWN0b3J5IG1ldGhvZCBmb3IgYWxsIHRoZSBHZW9tZXRyeSBvYmplY3RzCQkgICAgCiAgCSAgICAJIC8vCQkJCQkJCSAgICAKICAJICAgICAgICAgICBzdGF0aWMgR2VvbWV0cnkgKmNyZWF0ZShHZW9tVHlwZSBpKTsgICAgIAkJICAgIAogIAkgICAgICAgICB9OwkJCQkJICAgICAJCSAgICAKICAJICAgICAgICAgCQkJCQkgICAgIAkJCSAgICAKICAJICAgICAgICAgc3RydWN0IFBvaW50IDogR2VvbWV0cnkgIHsJCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgaW50IGRyYXcoKSB7IHJldHVybiAxOyB9CQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIGRvdWJsZSB3aWR0aCgpIHsgcmV0dXJuIDEuMDsgfSAgICAJICAgICAJCSAgICAKICAJICAgICAgICAgfTsJCQkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgIAkJCQkJICAgICAJCQkgICAgCiAgCSAgICAgICAgIHN0cnVjdCBDaXJjbGUgOiBHZW9tZXRyeSAgewkJICAgICAJCSAgICAKICAJICAgICAgICAgICBpbnQgZHJhdygpIHsgcmV0dXJuIDI7IH0JCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgZG91YmxlIHJhZGl1cygpIHsgcmV0dXJuIDEuNTsgfSAgICAgICAgICAJCSAgICAKICAJICAgICAgICAgfTsgCQkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAJCQkJCQkJCSAgICAKICAJICAgICAgICAgLy8JCQkJCQkJICAgIAogIAkgICAgICAgICAvLyBGYWN0b3J5IG1ldGhvZCBmb3IgYWxsIHRoZSBHZW9tZXRyeSBvYmplY3RzCQkgICAgCiAgCSAgICAgICAgIC8vCQkJCQkJCSAgICAKICAJICAgICAgICAgR2VvbWV0cnkgKkdlb21ldHJ5OjpjcmVhdGUoR2VvbVR5cGUgdHlwZSkgewkJICAgIAogIAkgICAgICAgICAgIHN3aXRjaCAodHlwZSkgewkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgY2FzZSBQT0lOVDogcmV0dXJuIG5ldyBQb2ludCgpOwkgICAgIAkJICAgIAogIAkgICAgICAgICAgIGNhc2UgQ0lSQ0xFOiByZXR1cm4gbmV3IENpcmNsZSgpOyAJICAgICAJCSAgICAKICAJICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gMDsJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIH0JCQkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgIH0JCQkJCSAgICAJCSAgICAKICAJICAgIC0tLS0gIGdlb21ldHJ5LmggLS0tLS0tLS0JCQkJCSAgICAKCSAgICAJCQkJCQkJCSAgICAKCSAgICAJCQkJCQkJCSAgICAKCSAgICBZb3UgY2FuIHVzZSB0aGUgJWZhY3Rvcnkgd2l0aCB0aGUgR2VvbWV0cnk6OmNyZWF0ZSBtZXRob2QgYXMgZm9sbG93czoKCSAgICAJCQkJCQkJCSAgICAKICAJICAgICAgJW5ld29iamVjdCBHZW9tZXRyeTo6Y3JlYXRlOwkJCQkgICAgCiAgCSAgICAgICVmYWN0b3J5KEdlb21ldHJ5ICpHZW9tZXRyeTo6Y3JlYXRlLCBQb2ludCwgQ2lyY2xlKTsJICAgIAogIAkgICAgICAlaW5jbHVkZSAiZ2VvbWV0cnkuaCIJCQkJCSAgICAKCSAgICAJCQkJCQkJCSAgICAKICAJICAgIGFuZCBHZW9tZXRyeTo6Y3JlYXRlIHdpbGwgcmV0dXJuIGEgJ1BvaW50JyBvciAnQ2lyY2xlJyBpbnN0YW5jZSAgIAogIAkgICAgaW5zdGVhZCBvZiB0aGUgcGxhaW4gJ0dlb21ldHJ5JyB0eXBlLiBGb3IgZXhhbXBsZSwgaW4gcHl0aG9uOgkgICAgCgkgICAgCQkJCQkJCQkgICAgCiAgCSAgICAgIGNpcmNsZSA9IEdlb21ldHJ5LmNyZWF0ZShHZW9tZXRyeS5DSVJDTEUpCQkJICAgIAogIAkgICAgICByID0gY2lyY2xlLnJhZGl1cygpCQkJCQkJICAgIAoJICAgIAkJCQkJCQkJICAgIAogIAkgICAgd2hlcmUgJ2NpcmNsZScgbm93IGlzIGEgQ2lyY2xlIHByb3h5IGluc3RhbmNlLgkgICAgCQkgICAgCgoKMDIvMTcvMjAwNjogbWtvZXBwZQoJICAgIFtNelNjaGVtZV0gVHlwZW1hcHMgZm9yIGFsbCBpbnRlZ3JhbCB0eXBlcyBub3cgYWNjZXB0IHRoZSBmdWxsIHJhbmdlIG9mIGludGVncmFsCgkgICAgdmFsdWVzLCBhbmQgdGhleSBzaWduYWwgYW4gZXJyb3Igd2hlbiBhIHZhbHVlIG91dHNpZGUgdGhlIHZhbGlkIHJhbmdlIGlzIHBhc3NlZC4KCSAgICBbR3VpbGVdIFR5cGVtYXBzIGZvciBhbGwgaW50ZWdyYWwgdHlwZXMgbm93IHNpZ25hbCBhbiBlcnJvciB3aGVuIGEgdmFsdWUgb3V0c2lkZQoJICAgIHRoZSB2YWxpZCByYW5nZSBpcyBwYXNzZWQuCgowMi8xMy8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbRG9jdW1lbnRzXSB1cGRhdGVkIHRoZSBleHRlbmRpbmcgZG9jdW1lbnRzIHRvIGdpdmUgYSBza2VsZXRvbiBzd2lnZ2luZyBjb2RlCiAgICAgICAgICAgIHdpdGggYSBmZXcgdHlwZW1hcHMuCiAgICAgICAgICAgIFtMdWFdIGFkZGVkIGFuIGV4dHJhIHR5cGVtYXAgZm9yIHZvaWQqIFtpbl0sIHNvIGEgZnVuY3Rpb24gd2hpY2ggcmVxdWlyZXMgYSB2b2lkKgogICAgICAgICAgICBjYW4gdGFrZSBhbnkga2luZCBvZiBwb2ludGVyCgpWZXJzaW9uIDEuMy4yOCAoRmVicnVhcnkgMTIsIDIwMDYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjAyLzExLzIwMDY6IG1tYXR1cwoJICAgIEZpeCBtYW55IGlzc3VlcyB3aXRoIGxpbmUgY291bnRpbmcgYW5kIGVycm9yIHJlcG9ydHMuCgowMi8xMS8yMDA2OiBtbWF0dXMKCSAgICBbUHl0aG9uXSBCZXR0ZXIgc3RhdGljIGRhdGEgbWVtYmVyIHN1cHBvcnQsIGlmIHlvdSBoYXZlCgkgICAgCiAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgc3RhdGljIGludCBiYXI7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhlbiBub3cgaXMgdmFsaWQgdG8gYWNjZXNzIHRoZSBzdGF0aWMgZGF0YSBtZW1iZXIsIGllOgoKICAgICAgICAgICAgICAgIGYgPSBGb28oKQogICAgICAgICAgICAgICAgZi5iYXIgPSAzCgoJICAgIGp1c3QgYXMgaW4gQysrLgoKCjAyLzExLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXQogICAgICAgICAgICBGaXhlZCBjb2RlIGdlbmVyYXRpb24gdG8gd29yayBhZ2FpbiB3aXRoIG9sZCB2ZXJzaW9ucyBvZiBQZXJsCiAgICAgICAgICAgICg1LjAwNCBhbmQgbGF0ZXIgdGVzdGVkKQoKMDIvMDQvMjAwNjogbW1hdHVzCgkgICAgW1B5dGhvbl0gQWRkIHRoZSAlZXh0ZW5kX3NtYXJ0X3BvaW50ZXIoKSBkaXJlY3RpdmUgdG8gZXh0ZW5kCgkgICAgU1dJRyBzbWFydCBwb2ludGVyIHN1cHBvcnQgaW4gcHl0aG9uLiAKCgkgICAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGEgc21hcnQgcG9pbnRlciBhczoKCSAgICAKCSAgICAgIHRlbXBsYXRlIDxjbGFzcyBUeXBlPiBjbGFzcyBSQ1B0ciB7CgkgICAgICBwdWJsaWM6CgkgICAgICAgIC4uLgoJICAgICAgICBSQ1B0cihUeXBlICpwKTsKCQlUeXBlICogb3BlcmF0b3ItPigpIGNvbnN0OwoJCS4uLgoJICAgICAgfTsKCSAgICAgIAoJICAgIHlvdSB1c2UgdGhlICVleHRlbmRfc21hcnRfcG9pbnRlciBkaXJlY3RpdmUgYXM6CgkgICAgCgkgICAgICAlZXh0ZW5kX3NtYXJ0X3BvaW50ZXIoUkNQdHI8QT4pOwoJICAgICAgJXRlbXBsYXRlKFJDUHRyX0EpICBSQ1B0cjxBPjsKCSAgICAKCSAgICB0aGVuLCBpZiB5b3UgaGF2ZSBzb21ldGhpbmcgbGlrZToKCgkgICAgICBSQ1B0cjxBPiBtYWtlX3B0cigpOwoJICAgICAgaW50IGZvbyhBICopOwoKCSAgICB5b3UgY2FuIGRvIHRoZSBmb2xsb3dpbmc6CgoJICAgICAgYSA9IG1ha2VfcHRyKCk7CgkgICAgICBiID0gZm9vKGEpOwoKICAgICAgICAgICAgaWUsIHN3aWcgd2lsbCBhY2NlcHQgYSBSQ1B0cjxBPiBvYmplY3Qgd2hlcmUgYSAnQSAqJyBpcwogICAgICAgICAgICBleHBlY3RlZC4KCgkgICAgQWxzbywgd2hlbiB1c2luZyB2ZWN0b3JzCgkgICAgCgkgICAgICAlZXh0ZW5kX3NtYXJ0X3BvaW50ZXIoUkNQdHI8QT4pOwoJICAgICAgJXRlbXBsYXRlKFJDUHRyX0EpIFJDUHRyPEE+OwoJICAgICAgJXRlbXBsYXRlKHZlY3Rvcl9BKSBzdGQ6OnZlY3RvcjxSQ1B0cjxBPiA+OwoJCQoJICAgIHlvdSBjYW4gdHlwZQoKCSAgICAgIGEgPSBBKCk7CgkgICAgICB2ID0gdmVjdG9yX0EoMikKCSAgICAgIHZbMF0gPSBhCgogICAgICAgICAgICBpZSwgYW4gJ0EgKicgb2JqZWN0IGlzIGFjY2VwdGVkLCB2aWEgaW1wbGljaXQgY29udmVyc2lvbiwgCgkgICAgd2hlcmUgYSBSQ1B0cjxBPiBvYmplY3QgaXMgZXhwZWN0ZWQuIEFkZGl0aW9uYWxseQoKCSAgICAgIHggPSB2WzBdCgoJICAgIHJldHVybnMgKGFuZCBzZXRzICd4JyBhcykgYSBjb3B5IG9mIHZbMF0sIG1ha2luZyByZWZlcmVuY2UKCSAgICBjb3VudGluZyBwb3NzaWJsZSBhbmQgY29uc2lzdGVudC4KCgkgICAgJWV4dGVuZF9zbWFydF9wb2ludGVyIGlzIGp1c3QgYSBjb2xsZWN0aW9ucyBvZiBuZXcvb2xkCgkgICAgdHJpY2tzLCBpbmNsdWRpbmcgJXR5cGVtYXBzIGFuZCB0aGUgbmV3ICVpbXBsaWNpdGNvbnYKCSAgICBkaXJlY3RpdmUuCgowMi8wMi8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBidWdmaXggIzEzNTY1NzcsIGNoYW5nZWQgZG91YmxlPT5sdWFfbnVtYmVyIGluIGEgZmV3IHBsYWNlcy4KICAgICAgICAgICAgYWRkZWQgdGhlIHN0ZDo6cGFpciB3cmFwcGluZwoKMDEvMzAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgc3RkOjpzdHJpbmcgYW5kIHN0ZDo6d3N0cmluZyBtZW1iZXIgdmFyaWFibGVzIGFuZCBnbG9iYWwgdmFyaWFibGVzIG5vdyB1c2UKICAgICAgICAgICAgJW5hdHVyYWx2YXIgYnkgZGVmYXVsdCwgbWVhbmluZyB0aGV5IHdpbGwgbm93IGJlIHdyYXBwZWQgYXMgZXhwZWN0ZWQgaW4gYWxsIGxhbmd1YWdlcy4KICAgICAgICAgICAgUHJldmlvdXNseSB0aGVzZSB3ZXJlIHdyYXBwZWQgYXMgYSBwb2ludGVyIHJhdGhlciB0aGFuIGEgdGFyZ2V0IGxhbmd1YWdlIHN0cmluZy4KICAgICAgICAgICAgSXQgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeSB0byBhZGQgdGhlIGZvbGxvd2luZyB3b3JrYXJvdW5kIHRvIHdyYXAgdGhlc2UgYXMgc3RyaW5nczoKCgkJJWFwcGx5IGNvbnN0IHN0ZDo6c3RyaW5nICYgeyBzdGQ6OnN0cmluZyAqfQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMDEvMjgvMjAwNjogbWtvZXBwZQoJICAgIFtHdWlsZSAtc2NtXSAKCSAgICBBZGQgdHlwZW1hcHMgZm9yIGhhbmRsaW5nIG9mIG1lbWJlciBmdW5jdGlvbiBwb2ludGVycy4KCjAxLzI0LzIwMDY6IG1tYXR1cwoJICAgIC0gQmV0dGVyIHN1cHBvcnQgZm9yIHRoZSAlbmF0dXJhbHZhciBkaXJlY3RpdmUsIG5vdyBpdAoJICAgICAgd29ya3Mgd2l0aCB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlcyBhcyB3ZWxsIGFzCgkgICAgICBKYXZhL0MjLgoJICAgICAgCgkgICAgICBOb3csIGl0IGNhbiBhbHNvIGJlIGFwcGxpZWQgdG8gY2xhc3MgdHlwZXM6CgoJICAgICAgICAlbmF0dXJhbHZhciBzdGQ6OnN0cmluZzsKCSAgICAgICAgJWluY2x1ZGUgPHN0ZF9zdHJpbmcuaT4KCSAgICAgIAogICAgICAgICAgICAgIHRoYXQgd2lsbCB0ZWxsIHN3aWcgdG8gdXNlIHRoZSAnbmF0dXJhbCcgd3JhcHBpbmcKICAgICAgICAgICAgICBtZWNoYW5pc20gdG8gYWxsIHN0ZDo6c3RyaW5nIGdsb2JhbCBhbmQgbWVtYmVyCiAgICAgICAgICAgICAgdmFyaWFibGVzLgoKCSAgICAtIEFkZCBzdXBwb3J0IGZvciB0aGUgJWFsbG93ZXhjZXB0IGZlYXR1cmUgYWxvbmcgdGhlCiAgICAgICAgICAgICAgc2NyaXB0aW5nIGxhbmd1YWdlcywgd2hpY2ggYWxsb3dzIHRoZSAlZXhjZXB0aW9uIGZlYXR1cmUKICAgICAgICAgICAgICB0byBiZSBhcHBsaWVkIHRvIHRoZSB2YXJpYWJsZSBhY2Nlc3MgbWV0aG9kcy4gQWxzbywgYWRkCiAgICAgICAgICAgICAgdGhlICVleGNlcHRpb252YXIgZGlyZWN0aXZlIHRvIHNwZWNpZnkgYSBkaXN0aW50aWMKICAgICAgICAgICAgICBleGNlcHRpb24gbWVjaGFuaXNtIG9ubHkgZm9yIHZhcmlhYmxlcy4KCSAgICAgIAoJICAgIAoJICAgIC0gQWRkIG1vcmUgZG9jcyBmb3IgdGhlICVkZWxvYmplY3QgZGlyZWN0aXZlIHRvIG1hcmsgYSBtZXRob2QgYXMgYQoJICAgICAgZGVzdHJ1Y3RvciwgJ2Rpc293bmluZycgdGhlIGZpcnN0IGFyZ3VtZW50LiBGb3IgZXhhbXBsZToKCgkgICAgICAgICVuZXdvYmplY3QgY3JlYXRlX2ZvbzsKCSAgICAgICAgJWRlbG9iamVjdCBkZXN0cm95X2ZvbzsKCgkgICAgICAgIEZvbyAqY3JlYXRlX2ZvbygpIHsgcmV0dXJuIG5ldyBGb28oKTsgfQoJICAgICAgICB2b2lkIGRlc3Ryb3lfZm9vKEZvbyAqZm9vKSB7IGRlbGV0ZSBmb287IH0KCgkgICAgICBvciBpbiBhIG1lbWJlciBtZXRob2QgYXM6CgoJICAgICAgICAlZGVsb2JqZWN0IEZvbzo6ZGVzdHJveTsKCgkgICAgICAgIGNsYXNzIEZvbyB7CgkgICAgICAgIHB1YmxpYzoKCSAgICAgICAgICB2b2lkIGRlc3Ryb3koKSB7IGRlbGV0ZSB0aGlzO30KCgkgICAgICAgIHByaXZhdGU6CgkgICAgICAgICAgfkZvbygpOwogICAgICAgICAgICAgICB9OwoKCjAxLzI0LzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdCgkgICAgLSBSZW1vdmVkIHRoZSB0eXBlIHN3aWdfbHVhX2NvbW1hbmRfaW5mbyAmIHJlcGxhY2Ugd2l0aCBsdWFMX3JlZwoJICAgICAgKHdoaWNoIHRoZW4gYnJva2UgdGhlIGNvZGUpLCBmaXhlZCB0aGlzCgkgICAgLSBhZGRlZCBhbiBhZGRpdGlvbmFsIGNhc3QgaW4gdGhlIHR5cGVtYXBzIGZvciBlbnVtJ3MKCSAgICAgIGR1ZSB0byB0aGUgaXNzdWUgdGhhdCBWQy5OZXQgd2lsbCBub3QgYWxsb3cgY2FzdGluZyBvZgoJICAgICAgYSBkb3VibGUgdG8gYW4gZW51bSBkaXJlY3RseS4gVGhlcmVmb3JlIGNhc3QgdG8gaW50IHRoZW4gdG8gZW51bQoJICAgICAgKHRoYW5rcyB0byBKYXNvbiBSZWdvIGZvciB0aGlzIG9ic2VydmF0aW9uKQoKMDEvMTYvMjAwNjogbW1hdHVzIChDaGFuZ2UgZGlzYWJsZWQuLi4gd2lsbCBiZSBiYWNrIGluIENWUyBzb29uKQoJICAgIEFkZCBpbml0aWFsIHN1cHBvcnQgZm9yIHJlZ2V4cCB2aWEgdGhlIGV4dGVybmFsIGxpYnJhcnkKCSAgICBSeFNwZW5jZXIuIFNXSUcgZG9lc24ndCByZXF1aXJlIHRoaXMgbGlicmFyeSB0byBjb21waWxlCgkgICAgYW5kL29yIHJ1bi4gQnV0IGlmIHlvdSBzcGVjaWZ5IC0td2l0aC1yeHNwZW5jZXIsIGFuZCB0aGUKCSAgICBsaWJyYXJ5IGlzIGZvdW5kIGR1cmluZyBpbnN0YWxsYXRpb24sIHRoZW4gc3dpZyB3aWxsIHVzZQoJICAgIGl0IGluIHRocmVlIHBsYWNlczoKCgkgICAgLSBJbiAlcmVuYW1lcyBydWxlcywgdmlhIHRoZSBuZXcgcnhzbWF0Y2ggcnVsZXMsIGZvciBleGFtcGxlOgoJICAgIAkgIAoJICAgIAkgICVyZW5hbWUoIiUobG93ZXJjYXNlKSIscnhzbWF0Y2gkbmFtZT0iR1NMXy4qIikgIiI7CgkgICAgCSAgJXJlbmFtZSgiJShsb3dlcmNhc2UpIixyeHNtYXRjaCRub2RlVHlwZT0iZW51bSBHU0xfLioiKSAiIjsKCSAgICAJIAogICAgICAgICAgICAgIHJ4c21hdGNoIGlzIHNpbWlsYXIgdG8gdGhlIG1hdGNoIHJ1bGUsIGl0IGp1c3QgdXNlcwogICAgICAgICAgICAgIHRoZSBSeFNwZW5jZXIgcmVnZXhwIGxpYnJhcnkgdG8gZGVjaWRlIGlmIHRoZXJlIGlzIGEKICAgICAgICAgICAgICBtYXRjaCB3aXRoIHRoZSBwcm92aWRlZCByZWdleHAuIEFzIHdpdGggdGhlIG1hdGNoCiAgICAgICAgICAgICAgcnVsZSwgeW91IGNhbiBhbHNvIHVzZSB0aGUgbmVnYXRlIHJ1bGUgbm90cnhzbWF0Y2guCgoJICAgIC0gSW4gdGhlICVyZW5hbWUgdGFyZ2V0IG5hbWUgdmlhIHRoZSByeHN0YXJnZXQgb3B0aW9uLCBmb3IgZXhhbXBsZToKCSAgICAJCSAKCSAgICAJICAlcmVuYW1lKCIlKGxvd2VyY2FzZSkiLHJ4c3RhcmdldD0xKSAiR1NMXy4qIjsKCgkgICAgCXdoZXJlIHRoZSB0YXJnZXQgbmFtZSAiR1NMLioiIGlzIG5vdyB1bmRlcnN0b29kIGFzIGEKCSAgICAJcmVnZXhwIHRvIGJlIG1hdGNoZWQuICAKCSAgICAJIAogICAgICAgICAgICAtIEluIHRoZSBuZXcgZW5jb2RlciAicnhzcGVuY2VyIiwgd2hpY2ggbG9va3MgbGlrZToKCgkgICAgCSAgJShyeHNwZW5jZXI6W3JlZ2V4cF1bcmVwbGFjZV0pcwoKCSAgICAJd2hlcmUgInJlZ2V4cCIgaXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbmQgInJlcGxhY2UiCgkgICAgCWlzIGEgc3RyaW5nIHVzZWQgYXMgYSByZXBsYWNlbWVudCwgd2hlcmUgdGhlIEAwLEAxLC4uLixAOQoJICAgIAlwc2V1ZG8gYXJndW1lbnRzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUKCSAgICAJY29ycmVzcG9uZGluZyBtYXRjaGluZyBpdGVtcyBpbiB0aGUgcmVnIGV4cHJlc3Npb24uCgoJICAgIAlGb3IgZXhhbXBsZToKCSAgICAJCSAgICAgIAoJICAgICAgICAlKHJ4c3BlbmNlcjpbR1NMLipdW0AwXSlzICAgICAgIDwtIEhlbGxvICAgIC0+IAoJICAgICAgICAlKHJ4c3BlbmNlcjpbR1NMLipdW0AwXSlzICAgICAgIDwtIEdTTEhlbGxvIC0+IEdTTEhlbGxvCgkgICAgICAgICUocnhzcGVuY2VyOltHU0woLiopXVtAMV0pcyAgICAgPC0gR1NMSGVsbG8gLT4gSGVsbG8KCSAgICAgICAgJShyeHNwZW5jZXI6W0dTTCguKildW2dzbEAxXSlzICA8LSBHU0xIZWxsbyAtPiBnc2xIZWxsbwoKCSAgICAJQW5vdGhlciBleGFtcGxlIGNvdWxkIGJlOgoKICAgICAgICAgICAgICAgICVyZW5hbWUoIiUobG93ZXJjYXNlKXMiLHNvdXJjZWZtdD0iJShyeHNwZW5jZXI6W0dTTF8oLiopXVtAMV0pcyIsJSRpc2Z1bmN0aW9uKSAiIjsKCgkgICAgCXdoaWNoIHRha2Ugb3V0IHRoZSBwcmVmaXggIkdTTF8iIGFuZCByZXR1cm5zIGFsbCB0aGUKCSAgICAJZnVuY3Rpb24gbmFtZXMgaW4gbG93ZXIgY2FzZXMsIGFzIGZvbGxvd2luZzoKCgkgICAgCSAgICB2b2lkIEdTTF9IZWxsbygpOyAgIC0+ICAgaGVsbG8oKTsKCSAgICAJICAgIHZvaWQgR1NMX0hpKCk7ICAgICAgLT4gICBoaSgpOwoJICAgIAkgICAgY29uc3QgaW50IEdTTF9NQVg7ICAtPiAgIEdTTF9NQVg7ICAvLyBubyBjaGFuZ2UsIGlzIG5vdCBhIGZ1bmN0aW9uCgkKCSAgICBXZSB1c2UgdGhlIFJ4U3BlbmNlciBhcyBhbiBpbml0aWFsIHRlc3QgYmVkIHRvCiAgICAgICAgICAgIGltcGxlbWVudGlvbiB3aGlsZSB3ZSBkZWNpZGUgd2hpY2ggbGlicmFyeSB3aWxsIGJlCiAgICAgICAgICAgIGZpbmFsbHkgYWRkZWQgdG8gc3dpZy4KCiAgICAgICAgICAgIFlvdSBjYW4gb2J0YWluIHRoZSBSeFNwZW5jZXIgbGlicmFyeSBmcm9tIAoJICAgIAoJICAgICAgaHR0cDovL2FyZ2xpc3QuY29tL3JlZ2V4IChVbml4KQoKCSAgICBvcgoJICAgICAKCSAgICAgIGh0dHA6Ly9nbnV3aW4zMi5zb3VyY2Vmb3JnZS5uZXQvcGFja2FnZXMuaHRtbCAoV2luZG93cykKCgkgICAgT25jZSBpbnN0YWxsZWQsIHVzZSAibWFuIHJ4c3BlbmNlciIgdG8gZ2V0IG1vcmUgaW5mbwoJICAgIGFib3V0IHRoZSByZWdleHAgZm9ybWF0LCBvciBqdXN0IGdvb2dsZSByeHNwZW5jZXIuCgoJICAgIFNpbmNlIG5vdyB5b3UgY2FuIGVuYWJsZSB0aGUgcnhzbWF0Y2ggcnVsZXMgKHNlZSBhYm92ZSksCiAgICAgICAgICAgIHRoZSBzaW1wbGUgb3IgJ3wnIHN1cHBvcnQgZm9yIHRoZSBtYXRjaCBydWxlcwogICAgICAgICAgICAoMDEvMTIvMjAwNjogbW1hdHVzKSBpcyBkaXNhYmxlZC4gU3RpbGwsIGlmIHlvdSBoYXZlCiAgICAgICAgICAgIHByb2JsZW1zIHdpdGggdGhlIHJ4c3BlbmNlciBsaWJyYXJ5LCB5b3UgY2FuIHJlLWVuYWJsZQogICAgICAgICAgICB0aGUgc2ltcGxlICdtYXRjaCBvcicgc3VwcG9ydCB1c2luZwogICAgICAgICAgICAtRFNXSUdfVVNFX1NJTVBMRV9NQVRDSE9SLgoJICAKCjAxLzE2LzIwMDY6IG1tYXR1cwoJICAgIENoYW5nZSB0aGUgJXJlbmFtZSBwcmVkaWNhdGVzIHRvIHVzZSB0aGUgcHJlZml4ICclJCcsIGFzIGluOgoJICAgIAoJICAgICAgJXJlbmFtZSgiJSh1dGl0bGUpcyIsJSRpc2Z1bmN0aW9uLCUkaXNtZW1iZXIpICIiOyAKCSAgIAkKICAgICAgICAgICAgdG8gYXZvaWQgY2xhc2hlcyB3aXRoIG90aGVyIHN3aWcgbWFjcm9zL2RpcmVjdGl2ZXMuCgowMS8xNC8yMDA2OiBjZmlzYXZhZ2UKICAgICAgICAgICAgW1J1YnldCgkgICAgQWRkZWQgc3VwcG9ydCBmb3IgUnVieSBiYW5nISBtZXRob2RzIHZpYSBhIG5ldyAlYmFuZyBmZWF0dXJlLgoJICAgIEJhbmcgbWV0aG9kcyBlbmQgaW4gZXhjbGFtYXRpb24gcG9pbnRzIGFuZCBpbmRpY2F0ZSB0aGF0IHRoZQoJICAgIG9iamVjdCBiZWluZyBwcm9jZXNzZWQgd2lsbCBiZSBtb2RpZmllZCBpbi1wbGFjZSBhcyAKCSAgICBvcHBvc2VkIHRvIGJlaW5nIGNvcGllZC4KCjAxLzEyLzIwMDY6IGNmaXNhdmFnZQogICAgICAgICAgICBbUnVieV0KCSAgICBVcGRhdGVkIHRoZSBSdWJ5IG1vZHVsZSB0byBhdXRvbWF0aWNhbGx5IGNvbnZlcnQKCSAgICBtZXRob2QgbmFtZXMgdG8gbG93ZXJfY2FzZV93aXRoX3VuZGVyc2NvcmVzIHVzaW5nIHRoZQoJICAgIG5ldyAlcmVuYW1lIGZ1bmN0aW9uYWxpdHkuCgowMS8xMi8yMDA2OiBtbWF0dXMKCSAgICAtIEFkZCBhbGlhc2VzIGZvciAnY2FzZScgZW5jb2RlcnMgdXNlZCB3aXRoICVyZW5hbWUvJW5hbWV3YXJuCgoJICAgICAgJSh1cHBlcmNhc2UpcyAgIGhlbGxvX3dvcmxkIC0+IEhFTExPX1dPUkxECgkgICAgICAlKGxvd2VyY2FzZSlzICAgSGVsbG9Xb3JsZCAgLT4gaGVsbG93b3JsZAoJICAgICAgJShjYW1lbGNhc2UpcyAgIGhlbGxvX3dvcmxkIC0+IEhlbGxvV29ybGQKCSAgICAgICUodW5kZXJjYXNlKXMgICBIZWxsb1dvcmxkICAtPiBoZWxsb193b3JsZAoKCjAxLzEyLzIwMDY6IG1tYXR1cwoJICAgIC0gQWRkIHRoZSAtZHVtcF9wYXJzZV9tb2R1bGUgYW5kIC1kdW1wX3BhcnNlX3RvcCBvcHRpb25zLAoJICAgIHdoaWNoIGFyZSBzaW1pbGFyIHRvIC1kdW1wX21vZHVsZSBhbmQgLWR1bXBfdG9wLCBidXQgdGhleQoJICAgIGR1bXAgdGhlIG5vZGUgdHJlZXMganVzdCBhZnRlciBwYXJzaW5nLCBzaG93aW5nIG9ubHkgdGhlIAoJICAgIGF0dHJpYnV0ZXMgdmlzaWJsZSBhdCB0aGUgcGFyc2luZyBzdGFnZSwgYW5kIG5vdCB0aGUgYWRkZWQKCSAgICBsYXRlciBpbiB0eXBlbWFwLmN4eCwgYWxsb2NhdGUuY3h4LCBsYW5nLmN4eCBvciBlbHNld2hlcmUuCgkgICAgCgkgICAgQmVzaWRlcyBkZWJ1Z2dpbmcgcG9ycHVzZXMsIHRoZXNlIG9wdGlvbnMgYXJlIHZlcnkgdXNlZnVsCgkgICAgaWYgeW91IHBsYW4gdG8gdXNlICVyZW5hbWUgaW4gYW4gImFkdmFuY2Ugd2F5Iiwgc2luY2UgaXQKCSAgICBzaG93cyBvbmx5IGFuZCBhbGwgdGhlIG5vZGUncyBhdHRyaWJ1dGVzIHlvdSBjYW4gdXNlCgkgICAgaW5zaWRlIHRoZSBtYXRjaCBydWxlcy4KCgowMS8xMi8yMDA2OiBtbWF0dXMKCSAgICAtIEFkZCBwcmVkaWNhdGVzIHRvICVyZW5hbWUsIHNvLCB5b3UgZG9uJ3QgbmVlZCB0bwoJICAgICAgcmVtZW1iZXIsIGZvciBleGFtcGxlLCBob3cgdG8gbWF0Y2ggYSBtZW1iZXIgZnVuY3Rpb24uCgoJICAgICAgTm93IGl0IGlzIGVhc3ksIGZvciBleGFtcGxlIHRvIHVzZSB0aGUgJ3V0aXRsZScgZW5jb2RlciAKCSAgICAgIGluIGFsbCB0aGUgbWVtYmVyIG1ldGhvZHMsIHlvdSB0eXBlOgoKCSAgICAgICAgJXJlbmFtZSgiJSh1dGl0bGUpcyIsJWlzZnVuY3Rpb24sJWlzbWVtYmVyKSAiIjsKCgkgICAgICBvciB0byBpZ25vcmUgYWxsIHRoZSBlbnVtaXRlbXMgaW4gYSBnaXZlbiBjbGFzczoKCgkgICAgICAgICVyZW5hbWUoIiRpZ25vcmUiLCAlaXNlbnVtaXRlbSwgJWNsYXNzbmFtZT0iTXlDbGFzcyIpICIiOyAgCgoJICAgICAgQXZhaWxhYmxlIHByZWRpY2F0ZXMgYXJlIChzZWUgc3dpZy5zd2cpOgoKICAgICAgICAgICAgICAgICVpc2VudW0gICAgICAgICAKCQklaXNlbnVtaXRlbSAgICAgCgkJJWlzYWNjZXNzICAgICAgIAoJCSVpc2NsYXNzICAgICAgICAKCQklaXNleHRlbmQgICAgICAgCgkJJWlzZXh0ZW5kICAgICAgIAoJCSVpc2NvbnN0cnVjdG9yICAKCQklaXNkZXN0cnVjdG9yICAgCgkJJWlzbmFtZXNwYWNlICAgIAoJCSVpc3RlbXBsYXRlICAgICAKCQklaXNjb25zdGFudCAgICAgCgkJCQkJCgkJJWlzdW5pb24gICAgICAgIAoJCSVpc2Z1bmN0aW9uICAgICAKCQklaXN2YXJpYWJsZSAgICAgCgkJJWlzaW1tdXRhYmxlICAgIAoJCQkJCQoJCSVpc3N0YXRpYyAgICAgICAKCQklaXNmcmllbmQgICAgICAgCgkJJWlzdHlwZWRlZiAgICAgIAoJCSVpc3ZpcnR1YWwgICAgICAKCQklaXNleHBsaWNpdCAgICAgCgkJJWlzZXh0ZXJuICAgICAgIAoJCQkJCQoJCSVpc21lbWJlciAgICAgICAKCQklaXNnbG9iYWwgCgkJJWlubmFtZXNwYWNlCgoJCSVpc3B1YmxpYyAgICAKCQklaXNwcm90ZWN0ZWQgCgkJJWlzcHJpdmF0ZSAgIAoJCQkJICAgICAKCQklY2xhc3NuYW1lICAgCgogICAgICAgICAgICAgIFRoZXNlIHByZWRpY2F0ZXMgY29ycmVzcG9uZCB0byBzcGVjaWZpYyAnbWF0Y2gnCiAgICAgICAgICAgICAgZGVjbGFyYXRpb25zLCB3aGljaCBzb21ldGltZXMgYXJlIG5vdCBhcyBldmlkZW50IGFzIHRoZQogICAgICAgICAgICAgIHByZWRpY2F0ZXMgbmFtZXMuCgoKICAgICAgICAgICAgLSBBZGQgdGhlIG9yICd8JyBvcGVyYXRpb24gaW4gJXJlbmFtZSBtYXRjaCwgZm9yCiAgICAgICAgICAgICAgZXhhbXBsZSB0byBjYXBpdGFsaXplIGFsbCB0aGUgY29uc3RhbnRzICglY29uc3RhbnQgb3IKICAgICAgICAgICAgICBjb25zdCBjZGVjbCk6CgogICAgICAgICAgICAgICAgICVyZW5hbWUoIiUodXBwZXIpcyIsbWF0Y2g9ImNkZWNsfGNvbnN0YW50IiwlaXNpbW11dGFibGUpICIiOwogICAgICAgICAgICAgICAgCgoKMDEvMTIvMjAwNjogbWdvc3NhZ2UKCSAgICAtCVBhcnRpYWwgZml4ZWQgb2YgZXJyb3JzIHVuZGVyIEM4OSwgYnVnICMxMzU2NTc0CgkgICAgCShjb252ZXJ0ZWQgQysrIHN0eWxlIGNvbW1lbnRzIHRvIEMgc3R5bGUpCgkgICAgLQlBZGRlZCBwYXRjaGVzIGZyb20gbmVvbWFudHJhQHVzZXJzLnNmLm5ldCAjMTM3OTk4OCBhbmQgIzEzODgzNDMKCSAgICAJbWlzc2luZyBhICdyZXR1cm4nIHN0YXRlbWVudCBmb3IgZXJyb3IgY29uZGl0aW9ucwoJICAgIAlhbHNvIHVwZGF0ZWQgdGhlICVpbml0IGJsb2NrIGJ1ZyAjMTM1NjU4NgoJCSAKMDEvMTAvMjAwNjogbW1hdHVzCgkgICAgLSBBZGQgdGhlICd1dGl0bGUnIGVuY29kZXIsIGFzIGFuIGV4YW1wbGUgb2YgaG93IHRvIGFkZAoJICAgICAgeW91ciBvd24gZW5jb2Rlci4gSSBhZGRlZCB0aGUgZW5jb2RlciBtZXRob2QgaW4gbWlzYy5jIAoJICAgICAgYnV0IGRldmVsb3BlcnMgY2FuIGFkZCBvdGhlcnMsIHRoZSBzYW1lIHdheSwgaW5zaWRlIGFueQoJICAgICAgdGFyZ2V0IGxhbmd1YWdlLgoJICAgICAgCgkgICAgICBXZWxsLCAndXRpdGxlJyBpcyB0aGUgcmV2ZXJzZSBvZiAnY3RpdGxlJywgaWU6CgoJICAgICAgICAgJXJlbmFtZSgiJShjdGl0bGUpcyIpIGNhbWVsX2Nhc2U7ICAtPiBDYW1lbENhc2U7CgkgICAgICAgICAlcmVuYW1lKCIlKHV0aXRsZSlzIikgQ2FtZWxDYXNlOyAgIC0+IGNhbWVsX2Nhc2U7CgkJIAoKMDEvMTAvMjAwNjogY2Zpc2F2YWdlCiAgICAgICAgICAgIFtSdWJ5XQogICAgICAgICAgICBVcGRhdGVkIFJ1YnkgRXhjZXB0aW9uIGhhbmRsaW5nLiAgQ2xhc3NlcyB0aGF0IGFyZSBzcGVjaWZpZWQgaW4gdGhyb3dzIGNsYXVzZXMsIAogICAgICAgICAgICBvciBhcmUgbWFya2VkIGFzICVleGNlcHRpb25jbGFzcywgYXJlIG5vdyBpbmhlcml0ZWQgZnJvbSByYl9lUnVudGltZUVycm9yLiAKICAgICAgICAgICAgVGhpcyBhbGxvd3MgaW5zdGFuY2VzIG9mIHRoZXNlIGNsYXNzZXMgdG8gYmUgcmV0dXJuZWQgdG8gUnVieSBhcyBleGNlcHRpb25zLiAKICAgICAgICAgICAgVGh1cyBpZiBhIEMrKyBtZXRob2QgdGhyb3dzIGFuIGluc3RhbmNlIG9mIE15RXhjZXB0aW9uLCB0aGUgY2FsbGluZyBSdWJ5IAogICAgICAgICAgICBtZXRob2Qgd2lsbCBnZXQgYmFjayBhIE15RXhjZXB0aW9uIG9iamVjdC4gIFRvIHNlZSBhbiBleGFtcGxlLCAKICAgICAgICAgICAgbG9vayBhdCBydWJ5L2V4YW1wbGVzL2V4Y2VwdGlvbl9jbGFzcy4KCjAxLzEwLzIwMDY6IG1tYXR1cwoJICAgIAogICAgICAgICAgICAtIEFkZCB0aGUgJWNhdGNoZXMgZGlyZWN0aXZlLCB3aGljaCBjb21wbGVtZW50cyB0aGUgJWV4Y2VwdGlvbgoJICAgIGRpcmVjdGl2ZSBpbiBhIG1vcmUgYXV0b21hdGljIHdheS4gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlCgogICAgICAgICAgICAgICAgaW50IGZvbygpIHRocm93KEUxKTsKCiAgICAgICAgICAgIHN3aWcgZ2VuZXJhdGVzIHRoZSBwcm9wZXIgdHJ5L2NhdGNoIGNvZGUgdG8gZGlzcGF0Y2ggRTEuCgkgICAgCgkgICAgQnV0IGlmIHlvdSBoYXZlOgoKCgkgICAgICAgICAgaW50IGJhcmZvbyhpbnQgaSkgewogICAgICAgICAgICAgICAgICAgIGlmIChpID09IDEpIHsKCSAgICAgICAgICAgICAgIHRocm93IEUxKCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgdGhyb3cgRTIoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGllLCB3aGVyZSB0aGVyZSBpcyBubyBleHBsaWNpdCBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiBpbiB0aGUgZGVjbCwgeW91IAoJICAgIGVuZCB1cCBkb2luZzoKCQkgIAogICAgICAgICAgICAgICAlZXhjZXB0aW9uIGJhcmZvbyB7CQkJCgkgICAgICAgICB0cnkgewkJCQkKCSAgICAgICAgICAgJGFjdGlvbgkJCQoJICAgICAgICAgfSBjYXRjaChFMSkgewkuLi4gfQkJCQkgIAoJICAgICAgICAgfSBjYXRjaChFMikgewkuLi4gfQkJCQkgIAoJICAgICAgIH0JCQkJCgkgICAgCgkgICAgd2hpY2ggaXMgdmVyeSB0ZWRpb3VzLiBXZWxsLCB0aGUgJWNhdGNoZXMgZGlyZWN0aXZlIGRlZmluZXMKCSAgICB0aGUgbGlzdCBvZiBleGNlcHRpb25zIHRvIGNhdGNoLCBhbmQgZnJvbSBzd2lnOgogCQoJICAgICAgICVjYXRjaGVzKEUxLEUyKSBiYXJmb28oaW50IGkpOwoJICAgICAgIGludCBiYXJmb28oaW50IGkpOwoKICAgICAgICAgICAgaXMgZXF1aXZhbGVudCB0byAKCgkgICAgICAgaW50IGJhcmZvbyhpbnQgaSkgdGhyb3coRTEsRTIpOwoKCSAgICBOb3RlLCBob3dldmVyLCB0aGF0IHRoZSAlY2F0Y2hlcyBsaXN0IGRvZXNuJ3QgaGF2ZSB0bwoJICAgIGNvcnJlc3BvbmQgdG8gdGhlIEMrKyBleGNlcHRpb24gc3BlY2lmaWNhdGlvbi4gRm9yIGV4YW1wbGUsIGlmIHlvdQoJICAgIGhhdmU6CgoJCXN0cnVjdCBFIHt9OwoJCXN0cnVjdCBFMSA6IEUge307CgkJc3RydWN0IEUyIDogRSB7fTsKCiAgCSAgICAgICAgaW50IGJhcmZvbyhpbnQgaSkgdGhyb3coRTEsRTIpOwoKICAgICAgICAgICAgeW91IGNhbiBkZWZpbmUKCSAgICAgICAgCgkJJWNhdGNoZXMoRSkgYmFyZm9vKGludCBpKTsKCQoJICAgIGFuZCBzd2lnIHdpbGwgZ2VuZXJhdGUgYW4gYWN0aW9uIGNvZGUgZXF1aXZhbGVudCB0bwoKCSAgICAgICAgIHRyeSB7CQkJCQoJICAgICAgICAgICAkYWN0aW9uCQkJCgkgICAgICAgICB9IGNhdGNoKEUgJl9lKSB7IAoJCSAgIDxyYWlzZSBfZT47CgkJIH0JCgogICAgICAgICAgICBPZiBjb3Vyc2UsIHlvdSBzdGlsbCBoYXZlIHRvIHNhdGlzZnkgdGhlIEMrKyByZXN0cmljdGlvbnMsCgkgICAgYW5kIHRoZSBjYXRjaGVzIGxpc3QgbXVzdCBiZSBjb21wYXRpYmxlIChub3QgdGhlIHNhbWUpCgkgICAgYXMgdGhlIG9yaWdpbmFsIGxpc3Qgb2YgdHlwZXMgaW4gdGhlIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uLgoKCSAgICBBbHNvLCB5b3UgY2FuIG5vdyBzcGVjaWZ5IHRoYXQgeW91IHdhbnQgdG8gY2F0Y2ggdGhlCgkgICAgdW5rbm93biBleGNlcHRpb24gJy4uLicsIGZvciBleGFtcGxlOgoKCSAgICAgICAlY2F0Y2hlcyhFMSxFMiwuLi4pIGJhcmZvbyhpbnQpOwoKCSAgICBJbiBhbnkgY2FzZSwgdGhlICVjYXRjaGVzIGRpcmVjdGl2ZSB3aWxsIGVtaXQgdGhlCgkgICAgY29kZSB0byBjb252ZXJ0IGludG8gdGhlIHRhcmdldCBsYW5ndWFnZSBlcnJvci9leGNlcHRpb24KICAgICAgICAgICAgdXNpbmcgdGhlICd0aHJvd3MnIHR5cGVtYXAuCgoJICAgIEZvciB0aGUgJy4uLicgY2FzZSB0byB3b3JrLCB5b3UgbmVlZCB0bwoJICAgIHdyaXRlIHRoZSBwcm9wZXIgdHlwZW1hcCBpbiB5b3VyIHRhcmdldCBsYW5ndWFnZS4gSW4gdGhlCgkgICAgVVRMLCB0aGlzIGxvb2tzIGxpa2U6CgoJICAgICAgJXR5cGVtYXAodGhyb3dzKSAoLi4uKSB7CgkgICAgICAgIFNXSUdfZXhjZXB0aW9uKFNXSUdfUnVudGltZUVycm9yLCJ1bmtub3duIGV4Y2VwdGlvbiIpOwogICAgICAgICAgICAgIH0KCjAxLzA5LzIwMDY6IG11dGFuZGl6CgkgICAgW0FsbGVncm9jbF0KCiAgICAgICAgICAgIEZpeGVzIGEgbnVtYmVyIG9mIFNFR1ZzIHByaW1hcmlseSBpbiB0aGUgaGFuZGxpbmcgb2YKICAgICAgICAgICAgdmFyaW91cyBhbm9ueW1vdXMgdHlwZXMuIEZvdW5kIGluIGEgcGFzcyB0aHJvdWdoIHRoZQogICAgICAgICAgICBzd2lnIHRlc3Qtc3VpdGUuIFN0aWxsIG1vcmUgdG8gZG8gaGVyZSwgYnV0IHRoaXMgaXMgYQogICAgICAgICAgICBnb29kIGNoZWNrcG9pbnQuCgogICAgICAgICAgICBBZGRzIC1jd3JhcCBhbmQgLW5vY3dyYXAgYXMgYW4gYWxsZWdyb2NsIHNwZWNpZmljCiAgICAgICAgICAgIGNvbW1hbmQtbGluZSBhcmd1bWVudC4gQ29udHJvbHMgZ2VuZXJhdGluZyBvZiBhIEMKICAgICAgICAgICAgd3JhcHBlciBmaWxlIHdoZW4gd3JhcHBpbmcgQyBjb2RlLiBCeSBkZWZhdWx0IG9ubHkgYQogICAgICAgICAgICBsaXNwIGZpbGUgaXMgY3JlYXRlZCBmb3IgQyBjb2RlIHdyYXBwaW5nLgoKICAgICAgICAgICAgRG9jIHVwZGF0ZXMgZm9yIHRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGFuZCBmaXhlcyBhcwogICAgICAgICAgICBwb2ludGVkIG91dCBvbiBzd2lnLWRldmVsCgowMS8wNS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IHVuc2lnbmVkIGxvbmcgbG9uZyBhbmQgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICYgdHlwZW1hcHMKICAgICAgICAgICAgLSBCdWcgIzEzOTgzOTQgIHdpdGggcGF0Y2ggZnJvbSBEcmllcyBEZWNvY2sKCjAxLzA2LzIwMDY6IG1tYXR1cwoJICAgIEFkZCAnbmFtZWQnIHdhcm5pbmcgY29kZXMsIG5vdyBpbiBhZGRpdGlvbiB0bzoKCSAgICAKCSAgICAgICV3YXJuZmlsdGVyKDgxMyk7CgkgICAKCSAgICB5b3UgY2FuIHVzZQoKCSAgICAgICV3YXJuZmlsdGVyKFNXSUdXQVJOX0pBVkFfTVVMVElQTEVfSU5IRVJJVEFOQ0UpOwoKCSAgICBqdXN0IHVzZSB0aGUgc2FtZSBjb2RlIG5hbWUgZm91bmQgaW4gIFNvdXJjZS9JbmNsdWRlL3N3aWd3YXJuLmggCgkgICAgcGx1cyB0aGUgJ1NXSUcnIHByZWZpeC4KCgkgICAgSWYgYSBkZXZlbG9wZXIgYWRkcyBhIG5ldyB3YXJuaW5nIGNvZGUsIHRoZSBMaWIvc3dpZ3dhcm4uc3dnIGZpbGUKICAgICAgICAgICAgd2lsbCBiZSBnZW5lcmF0ZWQgd2hlbiBydW5uaW5nIHRoZSB0b3AgbGV2ZWwgbWFrZS4KCjAxLzA1LzIwMDY6IGNmaXNhdmFnZQogICAgICAgICAgICBbUnVieV0KCSAgICBSZWltcGxlbWVudGVkIG9iamVjdCB0cmFja2luZyBmb3IgUnVieS4gIFRoZSBuZXcgaW1wbGVtZW50YXRpb24gd29ya3MKCSAgICBieSBleHBhbmRpbmcgdGhlIHN3aWdfY2xhc3Mgc3RydWN0dXJlIGZvciBSdWJ5IGJ5IGFkZGluZyBhIHRyYWNrT2JqZWN0cwoJICAgIGZpZWxkLiAgVGhpcyBmaWVsZCBjYW4gYmUgc2V0L3Vuc2V0IHZpYSAldHJhY2tvYmplY3RzIGFzIGV4cGxhaW5lZAoJICAgIGluIHRoZSBSdWJ5IGRvY3VtZW50YXRpb24uICBUaGUgbmV3IGltcGxlbWVudGF0aW9uIGlzIG1vcmUgcm9idXN0CgkgICAgYW5kIHRha2VzIGxlc3MgY29kZSB0byBpbXBsZW1lbnQuCgkJCjAxLzA1LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3IgJWV4dGVuZCBhbmQgc3RhdGljIGNvbnN0IGludGVncmFsIHR5cGVzLCBlZzoKCiAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICVleHRlbmQgewogICAgICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgYmFyID0gNDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfTsgCgoxMi8zMC8yMDA1OiBtbWF0dXMKCgkgIC0gQWRkIGluZm8gZm9yIG9sZCBhbmQgbmV3IGRlYnVnIG9wdGlvbnM6CiAgICAgICAgICAgICAgCiAgICAgICAgICAgIC1kdW1wX3RvcCAgICAgICAtIFByaW50IGluZm9ybWF0aW9uIG9mIHRoZSBlbnRpcmUgbm9kZSB0cmVlLCBpbmNsdWRpbmcgc3lzdGVtIG5vZGVzICAgIAogICAgIAkgICAgLWR1bXBfbW9kdWxlICAgIC0gUHJpbnQgaW5mb3JtYXRpb24gb2YgdGhlIG1vZHVsZSBub2RlIHRyZWUsIGF2b2lkaW5nIHN5c3RlbSBub2RlcyAgICAgCiAgICAgCSAgICAtZHVtcF9jbGFzc2VzICAgLSBQcmludCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2xhc3NlcyBmb3VuZCBpbiB0aGUgaW50ZXJmYWNlCSAgICAgICAKICAgICAJICAgIC1kdW1wX3R5cGVkZWYgICAtIFByaW50IGluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlcyBhbmQgdHlwZWRlZnMgZm91bmQgaW4gdGhlIGludGVyZmFjZQogICAgIAkgICAgLWR1bXBfdGFncyAgICAgIC0gUHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRhZ3MgZm91bmQgaW4gdGhlIGludGVyZmFjZQkgICAgICAgCiAgICAgCSAgICAtZGVidWdfdHlwZW1hcCAgLSBQcmludCBpbmZvcm1hdGlvbiBmb3IgZGVidWdnaW5nIHR5cGVtYXBzCQkJICAgICAgIAogICAgICAgICAgICAtZGVidWdfdGVtcGxhdGUgLSBQcmludCBpbmZvcm1hdGlvbiBmb3IgZGVidWdnaW5nIHRlbXBsYXRlcwkJCSAgICAgICAgCgoJICAtIEFkZCB0aGUgZmFrZXZlcnNpb24uIElmIHlvdSBoYXZlIGEgcHJvamVjdCB0aGF0IHVzZXMKICAgICAgICAgICAgY29uZmlndXJlL3NldHVwLnB5LCBvciBhbm90aGVyIGF1dG9tYXRpYyBidWlsZGluZyBzeXN0ZW0KICAgICAgICAgICAgYW5kIHJlcXVpcmVzIGEgc3BlY2lmaWMgc3dpZyB2ZXJzaW9uLCBsZXQgc2F5IDEuMy4yMiAKCSAgICB5b3UgY2FuIHVzZToKCgkgICAgICAgU1dJR19GRUFUVVJFUz0iLWZha2V2ZXJzaW9uIDEuMy4yMiIKCgkgICAgIG9yCiAKICAgICAgICAgICAgICAgc3dpZyAtZmFrZXZlcnNpb24gMS4zLjIyCgogICAgICAgICAgICAgYW5kIHRoZW4gc3dpZyAtdmVyc2lvbiB3aWxsIHJlcG9ydCAxLjMuMjIgaW5zdGVhZCBvZiB0aGUKICAgICAgICAgICAgIGN1cnJlbnQgdmVyc2lvbi4KCgkgICAgIFR5cGljYWwgdXNlIHdvdWxkIGJlCgoJICAgICAgIFNXSUdfRkVBVFVSRVM9Ii1mYWtldmVyc2lvbiAxLjMuMjIiIC4vY29uZmlndXJlIAkgICAgIAoKMTIvMzAvMjAwNTogbW1hdHVzCgoJICAtIEFkZCBvcHRpb24vZm9ybWF0IHN1cHBvcnQgdG8gJXJlbmFtZSBhbmQgJW5hbWV3YXJuLgkKCSAgICBOb3cgJW5hbWV3YXJuIGNhbiBmb3JjZSByZW5hbWluZywgZm9yIGV4YW1wbGU6CgoJICAgICAgJW5hbWV3YXJuKCIzMTQ6IGltcG9ydCBpcyBhIGtleXdvcmQiLHJlbmFtZT0iXyVzIikgImltcG9ydCI7CgkgICAgCgkgICAgYW5kIHJlbmFtZSBjYW4gYWxzbyBzdXBwb3J0IGZvcm1hdCBmb3JtczoKCgkgICAgICAgJXJlbmFtZSgic3dpZ18lcyIpIGltcG9ydDsKCgkgICAgTm93LCBzaW5jZSB0aGUgZm9ybWF0IGlzIHByb2Nlc3NlZCB2aWEgc3dpZyBQcmludGYsIHlvdQoJICAgIGNhbiB1c2UgZW5jb2RlcnMgYXMgZm9sbG93czoKCgkgICAgICAgJXJlbmFtZSgiJSh0aXRsZSlzIikgIGltcG9ydDsgICAgIC0+IEltcG9ydAoJICAgICAgICVyZW5hbWUoIiUodXBwZXIpcyIpICBpbXBvcnQ7ICAgICAtPiBJTVBPUlQKCSAgICAgICAlcmVuYW1lKCIlKGxvd2VyKXMiKSAgSW1wb3J0OyAgICAgLT4gaW1wb3J0CgkgICAgICAgJXJlbmFtZSgiJShjdGl0bGUpcyIpIGNhbWVsX2Nhc2U7IC0+IENhbWVsQ2FzZQoJICAgICAgIAoJICAgIFRoaXMgd2lsbCBhbGxvdyB1cyB0byBhZGQgbW9yZSBlbmNvZGVycywgYXMgdGhlIAoJICAgIGV4cGVjdGVkIG9uZSBmb3IgcmVndWxhciBleHByZXNzaW9ucy4gCgoJICAtIEFkZCB0aGUgYWJvdmUgJ2N0aXRsZScgZW5jb2Rlciwgd2hpY2ggZG9lcyB0aGUgY2FtZWwgY2FzZToKCgkgICAgICAgIGNhbWVsX2Nhc2UgLT4gQ2FtZWxDYXNlCiAgCgkgIC0gQWxzbywgd2hpbGUgd2UgZ2V0IHRoZSByZWdleHAgc3VwcG9ydCwgYWRkIHRoZSAnY29tbWFuZCcgZW5jb2RlciwKICAgICAgICAgICAgeW91IGNhbiB1c2UgaXQgYXMgZm9sbG93cwoKICAgICAgICAgICAgICAgJXJlbmFtZSgiJShjb21tYW5kOnNlZCAtZSAncy9cKFthLXpdXCkvXFVcXDEvJyA8PDwgKXMiKSBpbXBvcnQ7IAoKCSAgICB0aGVuIHN3aWcgd2lsbCBwb3BlbiB0aGUgY29tbWFuZAoJICAgIAoJCSJzZWQgLWUgJ3MvXChbYS16XVwpL1xVXFwxLycgPDw8IGltcG9ydCIKCQkKICAgICAgICAgICAgc2VlIGJlbG93IGZvciBhbm9ueW1vdXMgcmVuYW1lcyBmb3IgYmV0dGVyIGV4YW1wbGVzLgkJCgogICAgICAgICAgLSBUaGUgcmVuYW1lIGRpcmVjdGl2ZSBub3cgYWxzbyBhbGxvd3M6CgoJICAgIC0gc2ltcGxlIG1hdGNoOiBvbmx5IGFwcGx5IHRoZSByZW5hbWUgaWYgYSB0eXBlIG1hdGNoCgkgICAgICBoYXBwZW4sIGZvciBleGFtcGxlCgoJCSAlcmVuYW1lKCUodGl0bGUpcyxtYXRjaD0iZW51bWl0ZW0iKSBoZWxsbzsKCgkJIGVudW0gSGVsbG8gewoJCSAgIGhpLCBoZWxsbyAgLT4gIGhpLCBIZWxsbyAgCgkJIH07CgkJIGludCBoZWxsbygpICAtPiAgaGVsbG87IAoKCSAgICAtIGV4dGVuZGVkIG1hdGNoOiBvbmx5IGFwcGx5IHRoZSByZW5hbWUgaWYgdGhlICdleHRlbmRlZCBhdHRyaWJ1dGUnIG1hdGNoCgkgICAgICBvY2N1cnJlZCwgZm9yIGV4YW1wbGU6IAoKCSAgICAgICAgIC8vIHNhbWUgYXMgc2ltcGxlIG1hdGNoIAkJCgkJICVyZW5hbWUoJSh0aXRsZSlzLG1hdGNoJG5vZGVUeXBlPSJlbnVtaXRlbSIpIGhlbGxvOyAKCgkJIGVudW0gSGVsbG8gewoJCSAgIGhpLCBoZWxsbyAgLT4gIGhpLCBIZWxsbyAgCgkJIH07CgoJICAgICAgIE5vdGUgdGhhdCB0aGUgc3ltYm9sICckJyBpcyB1c2VkIHRvIGRlZmluZSB0aGUgYXR0cmlidXRlIG5hbWUgaW4KCSAgICAgICBhICdyZWN1cnNpdmUnIHdheSwgZm9yIGV4YW1wbGU6CgoJCSAvLyBtYXRjaCBvbmx5IGhlbGxvIGluICdlbnVtIEhlbGxvJwoJCSAlcmVuYW1lKCUodGl0bGUpcyxtYXRjaCRwYXJlbnROb2RlJHR5cGU9ImVudW0gSGVsbG8iKSBoZWxsbzsgCgoJCSBlbnVtIEhlbGxvIHsKIAkJICAgaGksIGhlbGxvICAtPiAgaGksIEhlbGxvICAgLy8gbWF0Y2gKCQkgfTsKCgkJIGVudW0gSGkgewogCQkgICBoaSwgaGVsbG8gIC0+ICBoaSwgaGVsbG8gICAvLyBubyBtYXRjaAoJCSB9OwoKICAgICAgICAgICAgICAgaGVyZSwgZm9yIEhlbGxvOjpoaSwgdGhlICJwYXJlbnROb2RlIiBpcyAiSGVsbG8iLCBhbmQgaXRzICJ0eXBlIgogICAgICAgICAgICAgICBpcyAiZW51bSBIZWxsbyIuCgkgICAgICAgCgkgICAgICAgCiAgICAgICAgICAgIC0gQW5vbnltb3VzIHJlbmFtZXM6IHlvdSBjYW4gdXNlICdhbm9ueW1vdXMnIHJlbmFtZSBkaXJlY3RpdmVzLCBmb3IgZXhhbXBsZTogCgoJICAgICAgICAgLy8gcmVuYW1lIGFsbCB0aGUgZW51bSBpdGVtcyBpbiBIZWxsbwoJCSAlcmVuYW1lKCUodGl0bGUpcyxtYXRjaCRwYXJlbnROb2RlJHR5cGU9ImVudW0gSGVsbG8iKSAiIjsgCgoJCSBlbnVtIEhlbGxvIHsKIAkJICAgaGksIGhlbGxvICAtPiAgSGksIEhlbGxvICAgLy8gbWF0Y2ggYm90aAoJCSB9OwoKCQkgZW51bSBIaSB7CiAJCSAgIGhpLCBoZWxsbyAgLT4gIGhpLCBoZWxsbyAgIC8vIG5vIG1hdGNoCgkJIH07CgkJIAoJICAgICAgICAgLy8gcmVuYW1lIGFsbCB0aGUgZW51bSBpdGVtcyAKCQkgJXJlbmFtZSglKHRpdGxlKXMsbWF0Y2gkbm9kZVR5cGU9ImVudW1pdGVtIikgIiI7IAoKCSAgICAgICAgIC8vIHJlbmFtZSBhbGwgdGhlIGl0ZW1zIGluIGdpdmVuIGNvbW1hbmQgKHNsb29vb3csIGJ1dC4uLikKCQkgJXJlbmFtZSglKGNvbW1hbmQ6PG15IGV4dGVybmFsIGNtZD4pcykgIiI7IAoKCQoJICAgICAgQW5vbnltb3VzIHJlbmFtZXMgd2l0aCBjb21tYW5kcyBjYW4gYmUgdmVyeSBwb3dlcmZ1bCwgc2luY2UgeW91CgkgICAgICBjYW4gJ291dHNvdXJjZScgYWxsIHRoZSByZW5hbWluZyBtZWNoYW5pc20gKG9yIHBhcnQgb2YgaXQpIHRvIGFuCgkgICAgICBleHRlcm5hbCBwcm9ncmFtOgoJICAgICAgCgkgICAgICAgIC8vIFVwcGVyY2FzZSBhbGwgKGFuZCBvbmx5KSB0aGUgbmFtZXMgdGhhdCBzdGFydCB3aXRoICdpJwoJICAgICAgICAlcmVuYW1lKCIlKGNvbW1hbmQ6YXdrICcvXmkve3ByaW50IHRvdXBwZXIoJDEpfScgPDw8KXMiKSAiIjsgICAKCSAgICAgICAKCSAgICAgICAgaW50IGltcG9ydGVkKCkgLT4gSU1QT1JURUQ7CgkgICAgICAgIGludCBoZWxsbygpICAgIC0+IGhlbGxvCgoJICAgICAgTm90ZSB0aGF0IGlmIHRoZSAnY29tbWFuZCcgZW5jb2RlciByZXR1cm5zIGFuIGVtcHR5IHN0cmluZywgc3dpZwoJICAgICAgdW5kZXJzdGFuZHMgdGhhdCBubyByZW5hbWUgaXMgbmVjZXNzYXJ5LgoKCSAgICAgIEFsc28gbm90ZSB0aGF0ICVyZW5hbWUgJ3Bhc3NlcycgdGhlIG1hdGNoZWQgbmFtZS4gRm9yIGV4YW1wbGUsIGluCgkgICAgICB0aGlzIGNhc2UKCgkgICAgICAgIG5hbWVzcGFjZSBuczEgewoJCSAgaW50IGZvbygpOwoJCX0KCgkgICAgICAgIG5hbWVzcGFjZSBuczIgewoJCSAgaW50IGJhcigpOwoJCX0KCgkgICAgICB0aGUgZXh0ZXJuYWwgcHJvZ3JhbSBvbmx5IHJlY2VpdmVzICJmb28iIGFuZCAiYmFyIi4gSWYgbmVlZGVkLAoJICAgICAgaG93ZXZlciwgeW91IGNhbiByZXF1ZXN0IHRoZSAnZnVsbG5hbWUnIAoJICAgICAgIAkKCSAgICAgICAgJXJlbmFtZSgiJShjb21tYW5kOmF3ayAnYXdrICcvbnMxOjove2w9c3BsaXQoJDEsYSwiOjoiKTsgcHJpbnQgdG91cHBlcihhW2xdKX0nJyA8PDwpcyIsZnVsbG5hbWU9MSkgIiI7ICAgCiAgICAgICAgICAgICAgICAKCQluczE6OmZvbyAtPiBGT08KCQluczI6OmJhciAtPiBiYXIJCgkKCSAgICAtIE1peGluZyBlbmNvZGVycyBhbmQgbWF0Y2hpbmc6IG9mIGNvdXJzZSwgeW91IGNhbiBkbyBtaXggY29tbWFuZHMKCSAgICAgIGFuZCBtYXRjaCBmaWVsZHMsIGZvciBleGFtcGxlOgoKCSAgICAgICAgJXJlbmFtZSgiJSg8bXkgZW5jb2RlciBmb3IgZm5jcz4pIixtYXRjaD0iY2RlY2wiKSAiIjsKCSAgICAgICAgJXJlbmFtZSgiJSg8bXkgZW5jb2RlciBmb3IgZW51bXM+KSIsbWF0Y2g9ImVudW1pdGVtIikgIiI7CgkgICAgICAgICVyZW5hbWUoIiUoPG15IGVuY29kZXIgZm9yIGVudW1zIGluc2lkZSBhIGNsYXNzPikiLG1hdGNoPSJlbnVtaXRlbSIsCgkJICAgICAgICBtYXRjaCRwYXJlbnROb2RlJHBhcmVudE5vZGUkbm9kZVR5cGU9ImNsYXNzIikgIiI7CgkJCgkgICAgICBVc2UgInN3aWcgLWR1bXBfcGFyc2VfbW9kdWxlIiB0byBzZWUgdGhlIGF0dHJpYnV0ZSBuYW1lcyB5b3UgY2FuIHVzZSB0bwoJICAgICAgbWF0Y2ggYSBzcGVjaWZpYyBjYXNlLgoJCiAgICAgICAgICAgIC0gJ3NvdXJjZWZtdCcgYW5kICd0YXJnZXRmbXQnOiBzb21ldGltZXMgeW91IG5lZWQgdG8KICAgICAgICAgICAgICBwcm9jZXNzIHRoZSAnc291cmNlJyBuYW1lIGJlZm9yZSBjb21wYXJpbmcsIGZvciBleGFtcGxlCgoJICAgICAgICAlbmFtZXdhcm4oIjMxNDogZW1wdHkgaXMgYSBrZXl3b3JkIixzb3VyY2VmbXQ9IiUobG93ZXIpcyIpICJlbXB0eSI7CgoJICAgICAgdGhlbiBpZiB5b3UgaGF2ZQoKCSAgICAgICAgaW50IEVtcHR5KCk7ICAvLyAiRW1wdHkiIGlzIHRoZSBzb3VyY2UgCgkJCgkgICAgICB5b3Ugd2lsbCBnZXQgdGhlIGtleXdvcmQgd2FybmluZyBzaW5jZSAnRW1wdHknIHdpbGwgYmUKCSAgICAgIGxvd2VyIGNhc2VkLCB2aWEgdGhlIHNvdXJjZWZtdD0iJShsb3dlcilzIiBvcHRpb24sCgkgICAgICBiZWZvcmUgYmVlbiBjb21wYXJlZCB0byB0aGUgJ3RhcmdldCcgImVtcHR5Ii4KCgkgICAgICBUaGVyZSBpcyBhbiBhZGRpdGlvbmFsICd0YXJnZXRmbXQnIG9wdGlvbiB0byBwcm9jZXNzIHRoZQoJICAgICAgJ3RhcmdldCcgYmVmb3JlIGNvbXBhcmluZy4KCgkgICAgLSBjb21wbGVtZW50aW5nICdtYXRjaCc6IHlvdSBjYW4gdXNlICdub3RtYXRjaCcsIGZvciBleGFtcGxlCgkgICAgICAKCSAgICAgICAgJW5hbWV3YXJuKCIzMTQ6IGVtcHR5IGlzIGEga2V5d29yZCIsc291cmNlZm10PSIlKGxvd2VyKXMiLG5vdG1hdGNoPSJuYW1lc3BhY2UiKSAiZW1wdHkiOwoKCSAgICAgIGhlcmUsIHRoZSBuYW1lIHdhcm5pbmcgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCB0aGUgc3ltYm9scyBleGNlcHQgbmFtZXNwYWNlcy4KCSAgICAKICAgICAgCQoxMi8zMC8yMDA1OiBtbWF0dXMKCgkgIC0gQWRkIGluaXRpYWwgc3VwcG9ydCBmb3IgZ2NqIGFuZCBKYXZhIC0+IDx0YXJnZXQgbGFuZ3VhZ2U+IG1lY2hhbmlzbS4KCgkgICAgU2VlCWV4YW1wbGVzIGluOiAgCgkgIAoJCUV4YW1wbGVzL3B5dGhvbi9qYXZhCgkJRXhhbXBsZXMvcnVieS9qYXZhCgkJRXhhbXBsZXMvdGNsL2phdmEKCiAgICAgICAgICAgIHRvIHNlZSBob3cgdG8gdXNlIGdjaitzd2lnIHRvIGV4cG9ydCBqYXZhIGNsYXNzZXMgaW50bwogICAgICAgICAgICBweXRob24vcnVieS90Y2wuCgkgICAgCgkgICAgVGhlIGlkZWEgaXMgdG8gcHV0IGFsbCB0aGUgY29tbW9uIGNvZGUgZm9yIGdjaiBpbnNpZGUKCgkgICAgICAgICAgTGliL2djagoKICAgICAgICAgICAgYW5kIGxvY2FsaXplIHNwZWNpZmljIHR5cGVzIHN1Y2ggYXMganN0cmluZywgYXMgY2FuIGJlIGZvdW5kCiAgICAgICAgICAgIGluCgoJICAgICAgICAgTGliL3B5dGhvbi9qc3RyaW5nLmkKCSAgICAgICAgIExpYi9ydWJ5L2pzdHJpbmcuaQoJICAgICAgICAgTGliL3RjbC9qc3RyaW5nLmkKCiAgICAgICAgICAgIFVzaW5nIHRoZSBVVEwsIHRoaXMgaXMgdmVyeSBlYXN5LCBhbmQgdGhlIHBlcmwgdmVyc2lvbiBmb3IKICAgICAgICAgICAganN0cmluZy5pIHdpbGwgYmUgbmV4dC4KCQkgCSAgICAKCjEyLzI5LzIwMDU6IG1tYXR1cwoJICAtIEFkZCB0aGUgY29weWN0b3IgZmVhdHVyZS9kaXJlY3RpdmUvb3B0aW9uIHRvIGVuYWJsZSB0aGUgYXV0b21hdGljCgkgICAgZ2VuZXJhdGlvbiBvZiBjb3B5IGNvbnN0cnVjdG9ycy4gVXNlIGFzIGluOgoKCSAgICAgICVjb3B5Y3RvciBBOwoKCSAgICAgIHN0cnVjdCBBIHsKCiAgICAgICAgICAgICAgfTsKCgkgICAgdGhlbiB0aGlzIHdpbGwgd29yawoKCSAgICAgIGExID0gQSgpOwoJICAgICAgYTIgPSBBKGExKTsKCgkgICAgQWxzbywgc2luY2UgaXQgaXMgYSBmZWF0dXJlLCBpZiB5b3UganVzdCB0eXBlCgoJICAgICAgJWNvcHljdG9yOwoKCSAgICB0aGF0IHdpbGwgIGVuYWJsZSB0aGUgYXV0b21hdGljIGdlbmVyYXRpb24gZm9yIGFsbCB0aGUKCSAgICBjbGFzc2VzLiBJdCBpcyBhbHNvIGVxdWl2YWxlbnQgdG8KCgkgICAgICAgc3dpZyAtY29weWN0b3IgLWMrKyAuLi4KCgkgICAgTm90ZXM6IAoKCSAgICAxLi0gVGhlIGZlYXR1cmUgb25seSB3b3JrcyBpbiBDKysgbW9kZS4KCgkgICAgMi4tIFRoZSBhdXRvbWF0aWMgY3JlYXRpb24gb2YgdGhlIGNvcHkgY29uc3RydWN0b3Igd2lsbAoJICAgICAgICB1c3VhbGx5IHByb2R1Y2Ugb3ZlcmxvYWRpbmcuIEhlbmNlLCBpZiB0aGUgdGFyZ2V0CgkgICAgICAgIGxhbmd1YWdlIGRvZXNuJ3Qgc3VwcG9ydCBvdmVybG9hZGluZywgYSBzcGVjaWFsIG5hbWUKCSAgICAgICAgd2lsbCBiZSB1c2VkIChBX2NvcHkpLgoJICAgIAoJICAgIDMuLSBGb3IgdGhlIG92ZXJsb2FkaW5nIHJlYXNvbnMgYWJvdmUsIGl0IGlzIHByb2JhYmx5IG5vdAogICAgICAgICAgICAgICAgYSBnb29kIGlkZWEgdG8gdXNlIHRoZSBmbGFnIHdoZW4sIGZvciBleGFtcGxlLCB5b3UgYXJlCgkJdXNpbmcga2V5d29yZHMgaW4gUHl0aG9uLgoKICAgICAgICAgICAgNC4tIFRoZSBjb3B5Y3RvciBhdXRvbWF0aWMgbWVjaGFuaXNtIGZvbGxvd3MgbW9yZSBvciBsZXNzCgkgICAgICAgIHRoZSBzYW1lIHJ1bGVzIGFzIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIG1lY2hhbmlzbSwKCSAgICAgICAgaS5lLiwgYSBjb3B5IGNvbnN0cnVjdG9yIHdpbGwgbm90IGJlIGFkZGVkIGlmIHRoZQoJICAgICAgICBjbGFzcyBpcyBhYnN0cmFjdCBvciBpZiB0aGVyZSBpcyBhIHBlcnRpbmVudCBub24tcHVibGljIAoJCWNvcHkgY3RvciBpbiB0aGUgY2xhc3Mgb3IgaXRzIGhpZXJhcmNoeS4KCgkJSGVuY2UsIGl0IG1pZ2h0IGJlIG5lY2Vzc2FyeSBmb3IgeW91IHRvIGNvbXBsZXRlIHRoZQoJCWNsYXNzIGRlY2xhcmF0aW9uIHdpdGggdGhlIHByb3BlciBub24tcHVibGljIGNvcHkgY3RvcgoJCXRvIGF2b2lkIGEgd3JvbmcgY29uc3RydWN0b3IgYWRkaXRpb24uCgkJCiAgICAgICAgICAtIEZpeCBmZWF0dXJlcy9yZW5hbWUgZm9yIHRlbXBsYXRlcyBjdG9yL2R0b3IgYW5kIG90aGVyCiAgICAgICAgICAgIHRoaW5ncyBhcm91bmQgd2hpbGUgYWRkaW5nIHRoZSBjb3B5Y3RvciBtZWNoYW5pc20uCgkgICAgCgoxMi8yNy8yMDA1OiBtbWF0dXMKCSAgLSBBZGQgdGhlICdtYXRjaCcgb3B0aW9uIHRvIHR5cGVtYXBzLiBBc3N1bWUgeW91IGhhdmU6CgoJICAgICAgJXR5cGVtYXAoaW4pIFNXSUdUWVBFICogKGludCByZXMpIHsuLn0KCSAgICAgICV0eXBlbWFwKGZyZWVhcmcpIFNXSUdUWVBFICogeyBpZiAocmVzJGFyZ251bSkgLi4ufQoKCSAgICB0aGVuIGlmIHlvdSBkbwogCgkgICAgICAldHlwZW1hcChpbikgQSAqIHsuLi59CgoJICAgIHN3aWcgd2lsbCAnb3ZlcmxvYWQgdGhlICdpbicgdHlwZW1hcCwgYnV0IHRoZSAnZnJlZWFyZycgCgkgICAgdHlwZW1hcCB3aWxsIGJlIGFsc28gYXBwbGllZCwgZXZlbiB3aGVuIHRoaXMgaXMgd3JvbmcuIFRoZSBvbGQKCSAgICBzb2x1dGlvbnMgaXMgdG8gd3JpdGU6CgoJICAgICAgJXR5cGVtYXAoaW4pIEEgKiB7Li4ufQogIAkgICAgICAldHlwZW1hcChmcmVlYWcpIEEgKiAiIjsKCgkgICAgb3ZlcmxvYWQgJ2ZyZWVhcmcnIHdpdGggYW4gZW1wdHkgZGVmaW5pdGlvbi4KCgkgICAgVGhlIHByb2JsZW0gaXMsIGhvd2V2ZXIsIHRoZXJlIGlzIG5vIHdheSB0byBrbm93IHlvdSBuZWVkCgkgICAgdG8gZG8gdGhhdCB1bnRpbCB5b3Ugc3RhcnQgZ2V0dGluZyBicm9rZW4gQysrIGNvZGUsIG9yCgkgICAgd29yc2UsIGJyb2tlbiBydW50aW1lIGNvZGUuCgoJICAgIFRoZSBzYW1lIGFwcGxpZXMgdG8gdGhlIGluZmFtb3VzICd0eXBlY2hlY2snIHR5cGVtYXAsCgkgICAgd2hpY2ggYWx3YXlzIGNvbmZ1c2VzIHBlb3BsZSwgc2luY2UgdGhlIGZpcnN0IHRoaW5nIHlvdSBkbwoJICAgIGlzIHRvIGp1c3Qgd3JpdGUgdGhlICdpbicgdHlwZW1hcC4KCgkgICAgVGhlICdtYXRjaCcgb3B0aW9uIHNvbHZlcyB0aGUgcHJvYmxlbSwgYW5kIGlmIGluc3RlYWQgeW91IHdyaXRlOgoKCSAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRSAqIChpbnQgcmVzKSB7Li59CgkgICAgICAldHlwZW1hcChmcmVlYXJnLG1hdGNoPSJpbiIpIFNXSUdUWVBFICogeyBpZiAocmVzJGFyZ251bSkgLi4ufQoJICAgICAgJXR5cGVtYXAodHlwZWNoZWNrLG1hdGNoPSJpbiIscHJlY2VkZW5jZS4uLikgU1dJR1RZUEUgKiB7Li4ufQoJICAgIAoJICAgIGl0IHdpbGwgdGVsbCBzd2lnIHRvIGFwcGx5IHRoZSAnZnJlZWFyZy90eXBlY2hlY2snCgkgICAgdHlwZW1hcHMgb25seSBpZiB0aGV5ICdtYXRjaCcgdGhlIHR5cGUgb2YgdGhlICdpbicKCSAgICB0eXBlbWFwLiBUaGUgc2FtZSBjYW4gYmUgZG9uZSB3aXRoIG90aGVyIHR5cGVtYXBzIGFzOgoKCSAgICAgICV0eXBlbWFwKGRpcmVjdG9yb3V0KSBTV0lHVFlQRSAqIHsuLi59CgkgICAgICAldHlwZW1hcChkaXJlY3RvcmZyZWUsbWF0Y2g9ImRpcmVjdG9yb3V0IikgU1dJR1RZUEUgKiB7Li4ufQoJICAgIAoKMTIvMjcvMjAwNTogbW1hdHVzCgkgIC0gQWRkIHRoZSAnbmF0dXJhbHZhcicgb3B0aW9uL21vZGUvZmVhdHVyZSB0byB0cmVhdCBtZW1iZXIKCSAgICB2YXJpYWJsZXMgaW4gYSBtb3JlIG5hdHVyYWwgd2F5LCBpZSwgc2ltaWxhciB0byB0aGUgZ2xvYmFsCgkgICAgdmFyaWFibGUgYmVoYXZpb3IuCgoJICAgIFlvdSBjYW4gdXNlIGl0IGluIGEgZ2xvYmFsIHdheSB2aWEgdGhlIGNvbW1hbmQgbGluZQoKCSAgICAgIHN3aWcgLW5hdHVyYWx2YXIgLi4uCgoJICAgIG9yIHRoZSBtb2R1bGUgbW9kZSBvcHRpb24KIAoJICAgICAgJW1vZHVsZShuYXR1cmFsdmFyPTEpCgoJICAgIGJvdGggZm9ybXMgbWFrZSBzd2lnIHRyZWF0IGFsbCB0aGUgbWVtYmVyIHZhcmlhYmxlcyBpbiB0aGUKCSAgICBzYW1lIHdheSBpdCB0cmVhdHMgZ2xvYmFsIHZhcmlhYmxlcy4gCgoJICAgIEFsc28sIHlvdSBjYW4gdXNlIGl0IGluIGEgY2FzZSBieSBjYXNlIGFwcHJvYWNoIGZvcgoJICAgIHNwZWNpZmljIG1lbWJlciB2YXJpYWJsZXMgdXNpbmcgdGhlIGRpcmVjdGl2ZSBmb3JtOgoKCSAgICAgICVuYXR1cmFsdmFyIEJhcjo6czsKCSAgICAKCSAgICBUaGVuLCBpbiB0aGUgZm9sbG93aW5nIGNhc2UgZm9yIGV4YW1wbGU6CgoJICAgICAgIHN0ZDo6c3RyaW5nIHM7CgkgICAgICAgc3RydWN0IEJhciB7CgkJIHN0ZDo6c3RyaW5nIHM7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICB5b3UgY2FuIGRvOiAgCgoJICAgICAgIGIgPSBCYXIoKQoJICAgICAgIGIucyA9ImhlbGxvIgoJICAgICAgIGN2YXIucyA9ICJoZWxsbyIKCSAgICAgICAKCSAgICAgICBpZiAoYi5zICE9IGN2YXIucyk6CgkgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yCgoJCSAgCiAgICAgICAgICAgIFRoaXMgaXMgdmFsaWQgZm9yIGFsbCB0aGUgbGFuZ3VhZ2VzLCBhbmQgdGhlCiAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIGZvcmNpbmcgdGhlIHVzZSBvZiB0aGUgCiAgICAgICAgICAgIGNvbnN0IFNXSUdUWVBFJiAoQysrKS9TV0lHVFlQRSAoQykgdHlwZW1hcHMgZm9yIHRoZQogICAgICAgICAgICBnZXQvc2V0IG1ldGhvZHMgaW5zdGVhZCBvZiB0aGUgU1dJR1RZUEUgKiB0eXBlbWFwcy4KCSAgICBIZW5jZSwgZm9yICduYXR1cmFsdmFyJyB0byB3b3JrLCBlYWNoIHRhcmdldCBsYW5ndWFnZQoJICAgIG11c3QgaW1wbGVtZW50ICd0eXBlbWFwKGluL291dCkgY29uc3QgVHlwZSYnIHByb3Blcmx5LgoKCSAgICBUaGUgJ25hdHVyYWx2YXInIG9wdGlvbiByZXBsYWNlcyBvciBtYWtlcyB3b3JrYXJvdW5kcyBzdWNoICBhczoKCSAgICAKCQklYXBwbHkgY29uc3Qgc3RkOjpzdHJpbmcgJiB7IHN0ZDo6c3RyaW5nICp9CgogICAgICAgICAgICB1bm5lY2Vzc2FyeS4KCgkgICAgTm90ZTE6IElmIHlvdXIgaW50ZXJmYWNlIGhhcyBvdGhlciBraW5kcyBvZiB3b3JrYXJvdW5kcyB0bwoJICAgIGRlYWwgd2l0aCB0aGUgb2xkICd1bm5hdHVyYWwnIHdheSB0byBkZWFsIHdpdGggbWVtYmVyCgkgICAgdmFyaWFibGVzIChyZXR1cm5pbmcvZXhwZWN0aW5nIHBvaW50ZXJzKSwgdGhlCgkgICAgJ25hdHVyYWx2YXInIG9wdGlvbiBjb3VsZCBicmVhayB0aGVtLgoJICAgIAoJICAgIE5vdGUyOiB0aGUgb3B0aW9uIGhhcyBubyBlZmZlY3Qgb24gdW5uYW1lZCB0eXBlcywgc3VjaAoJICAgIGFzIHVubmFtZWQgbmVzdGVkIHVuaW9ucy4KCSAgICAKCSAgCjEyLzI3LzIwMDU6IG1tYXR1cwoJICAtIEFkZCBtb3JlICdleHByZXNzaXZlJyByZXN1bHQgc3RhdGVzIGZvciB0aGUgdHlwZW1hcAogICAgICAgICAgICBsaWJyYXJpZXMuCgoJICAgIEluIHRoZSBwYXN0LCBmb3Igc2NyaXB0aW5nIGxhbmd1YWdlcywgeW91IHdvdWxkIGRvIGNoZWNraW5nIHNvbWV0aGluZyBsaWtlOgoKCSAgICAgIGlmIChDb252ZXJ0UHRyKG9iaiwmdnB0cix0eSxmbGFncykgIT0gLTEpIHsKCSAgICAgICAgLy8gc3VjY2VzcwogICAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgIC8vIGVycm9yCgkgICAgICB9CgoJICAgIE5vdyB0aGUgcmVzdWx0IHN0YXRlIGNhbiBjYXJyeSBtb3JlIGluZm9ybWF0aW9uLAoJICAgIGluY2x1ZGluZzoKCgkgICAgICAtIEVycm9yIHN0YXRlOiBsaWtlIHRoZSBvbGQgLTEvMCwgYnV0IHdpdGggZXJyb3IgY29kZXMgZnJvbSBzd2lnZXJyb3JzLnN3Zy4KCgkgICAgICAgICBpbnQgcmVzID0gQ29udmVydFB0cihvYmosJnZwdHIsdHksZmxhZ3MpOwoJCSBpZiAoU1dJR19Jc09LKHJlcykpIHsKCQkgICAvLyBzdWNjZXNzIGNvZGUKICAgICAgICAgICAgICAgICB9IGVsc2UgewoJCSAgIFNXSUdfRXJyb3IocmVzKTsgLy8gcmVzIGNhcnJpZXMgdGhlIGVycm9yIGNvZGUKICAgICAgICAgICAgICAgICB9CgoJICAgICAgLSBDYXN0IHJhbms6IHdoZW4gcmV0dXJuaW5nIGEgc2ltcGxlIHN1Y2Nlc3NmdWwKICAgICAgICAgICAgICAgIGNvbnZlcnNpb24sIHlvdSBqdXN0IHJldHVybiBTV0lHX09LLCBidXQgaWYgeW91IG5lZWQKICAgICAgICAgICAgICAgIHRvIGRvIGEgJ2Nhc3QnLCB5b3UgY2FuIGFkZCB0aGUgY2FzdGluZyByYW5rLCBpZToKCQkKCQkgIGlmIChQeUZsb2F0X0NoZWNrKG9iaikpIHsKCQkgICAgdmFsdWUgPSBQeUZsb2F0X0FzRG91YmxlKG9iaik7CgkJICAgIHJldHVybiBTV0lHX09LOwoJCSAgfSBlbHNlIGlmIChQeUludF9DaGVjayhvYmopKSB7CgkJICAgIHZhbHVlID0gKGRvdWJsZSkgUHlJbnRfQXNMb25nKG9iaik7CgkJICAgIHJldHVybiBTV0lHX0FkZENhc3QoU1dJR19PSyk7CQkgICAgCiAgICAgICAgICAgICAgICAgIH0KCQkKCQlsYXRlciwgdGhlIGNhc3RpbmcgcmFuayBpcyB1c2VkIHRvIHByb3Blcmx5IGRpc3BhdGNoCgkJdGhlIG92ZXJsb2FkZWQgZnVuY3Rpb24sIGZvciBleGFtcGxlLiBUaGlzIG9mIGNvdXJzZQoJCXJlcXVpcmVzIHlvdXIgbGFuZ3VhZ2UgdG8gc3VwcG9ydCBhbmQgdXNlIHRoZSBuZXcKCQlkaXNwYXRjaCBjYXN0L3JhbmsgbWVjaGFuaXNtIChOb3cgbWFpbmx5IHN1cHBvcnRlZCBpbgoJCXBlcmwgYW5kIHB5dGhvbiwgYW5kIGVhc2lseSBleHBhbmRhYmxlIHRvIHJ1YnkgYW5kIHRjbCkuCgkgICAgICAKCSAgLSBbVVRMXSBBZGQgc3VwcG9ydCBmb3IgdGhlIG5ldyAnZXhwcmVzc2l2ZScgcmVzdWx0IHN0YXRlcy4KCjEyLzI3LzIwMDU6IG1tYXR1cwoJICAtIEFkZCBzdXBwb3J0IGZvciB0aGUgQysrIGltcGxpY2l0IGNvbnZlcnNpb24gbWVjaGFuaXNtLCB3aGljaAogICAgICAgICAgICByZXF1aXJlZCBzb21lIG1vZGlmaWNhdGlvbnMgaW4gcGFyc2VyLnkgKHRvIHJlY29nbml6ZQogICAgICAgICAgICAnZXhwbGljaXQnKSBhbmQgb3ZlcmxvYWQuY3h4ICh0byByZXBsYWNlICRpbXBsaWNpdGNvbnYgYXMKICAgICAgICAgICAgbmVlZGVkKS4KCSAgICAKCSAgICBTdGlsbCwgcmVhbCBzdXBwb3J0IGluIGVhY2ggdGFyZ2V0IGxhbmd1YWdlIHJlcXVpcmVzIGVhY2gKCSAgICB0YXJnZXQgbGFuZ3VhZ2UgdG8gYmUgbW9kaWZpZWQuIFB5dGhvbiBwcm92aWRlcyBhbiBleGFtcGxlLAogICAgICAgICAgICBzZWUgYmVsb3cuCgoKCSAgLSBBZGQgc3VwcG9ydCBmb3IgbmF0aXZlIEMrKyBpbXBsaWNpdCBjb252ZXJzaW9ucywgaWUsIGlmIHlvdQogICAgICAgICAgICBoYXZlCgoJICAgICAgICAlaW1wbGljaXRjb252IEE7CgoJICAgICAgICBzdHJ1Y3QgQSB7CgkJICAgaW50IGlpOwoJCSAgIEEoKSB7aWkgPSAxO30KCQkgICBBKGludCkge2lpID0gMjt9CgkJICAgQShkb3VibGUpIHtpaSA9IDM7fQoJCSAgIGV4cGxpY2l0IEEoY2hhciAqcykge2lpID0gNDt9CgkJfTsKCQkKCQlpbnQgZ2V0KGNvbnN0IEEmIGEpIHtyZXR1cm4gYS5paTt9CgogICAgICAgICAgICB5b3UgY2FuIGNhbGw6CgoJICAgICAgICBhID0gQSgpCgkgICAgICAgIGFpID0gQSgxKQoJICAgICAgICBhZCA9IEEoMS4wKQoJICAgICAgICBhcyA9IEEoImhlbGxvIikKCQkKCQkjIG9sZCBmb3JtcwoJICAgICAgICBnZXQoYSkgIC0+IDEKCSAgICAgICAgZ2V0KGFpKSAtPiAyCgkgICAgICAgIGdldChhZCkgLT4gMwoJICAgICAgICBnZXQoYXMpIC0+IDQKCQkKCQkjaW1wbGljaXQgY29udmVyc2lvbnMKCSAgICAgICAgZ2V0KDEpICAgICAgIC0+IDIKCSAgICAgICAgZ2V0KDEuMCkgICAgIC0+IDMKCSAgICAgICAgZ2V0KCJoZWxsbyIpIC0+IEVycm9yLCBleHBsaWNpdCBjb25zdHJ1Y3RvcgoKICAgICAgICAgICAgQWxzbywgYXMgaW4gQysrLCBub3cgaW1wbGljaXQgY29udmVyc2lvbnMgYXJlIHN1cHBvcnRlZCBpbgogICAgICAgICAgICB2YXJpYWJsZSBhc3NpZ21lbnRzLCBhbmQgaWYgeW91IGhhdmU6CgoJICAgICAgQSBnYTsKCSAgICAgIHN0cnVjdCBCYXIgewoJICAgICAgICBBIGE7CiAgICAgICAgICAgICAgfTsKCgkgICAgeW91IGNhbiBkbzoKCgkgICAgICBjdmFyLmdhID0gQSgxKQoJICAgICAgY3Zhci5nYSA9IDEKCSAgICAgIGN2YXIuZ2EgPSAxLjAKCSAgICAgIGN2YXIuZ2EgPSBBKCJoZWxsbyIpIAoJICAgICAgY3Zhci5nYSA9ICJoZWxsbyIgLT4gZXJyb3IsIGV4cGxpY2l0IGNvbnN0cnVjdG9yCgoJICAgICAgYiA9IEJhcigpCgkgICAgICBiLmEgPSBBKCJoZWxsbyIpCgkgICAgICBiLmEgPSAxCgkgICAgICBiLmEgPSAxLjAKCSAgICAgIGIuYSA9ICJoZWxsbyIgLT4gZXJyb3IsIGV4cGxpY2l0IGNvbnN0cnVjdG9yCgoJICAgIE5vdGUgdGhhdCB0aGUgbGFzdCBjYXNlLCBhc3NpZ25pbmcgYSBtZW1iZXIgdmFyIGRpcmVjdGx5LCAKCSAgICBhbHNvIHJlcXVpcmVzIHRoZSAnbmF0dXJhbHZhcicgb3B0aW9uLgoKCSAgICBUaGlzIHN1cHBvcnQgbm93IG1ha2VzIHRoZSBvbGQgJyVpbXBsaWNpdCcgbWFjcm8sIHdoaWNoCgkgICAgd2FzIGZvdW5kIGluICdpbXBsaWNpdC5pJyBhbmQgaXQgd2FzIGZyYWdpbGUgaW4gbWFueSB3YXlzLAoJICAgIG9ic29sZXRlLCBhbmQgeW91IHNob3VsZCB1c2UgdGhlIG5ldyAnJWltcGxpY2l0Y29udicKCSAgICBkaXJlY3RpdmUgaW5zdGVhZC4KCgkgICAgTm90ZSB0aGF0IHdlIGZvbGxvdyB0aGUgQysrIGNvbnZlbnRpb25zLCBpZSwgaW4gdGhlCgkgICAgZm9sbG93aW5nIHRoZSBpbXBsaWNpdCBjb252ZXJzaW9uIGlzIGFsbG93ZWQ6CgoJCWludCBnZXQoQSBhKSB7cmV0dXJuIGEuaWk7fQoJCWludCBnZXQoY29uc3QgQSYgYSkge3JldHVybiBhLmlpO30KCSAgICAKCSAgICBidXQgbm90IGluIHRoZXNlIGNhc2VzOgoKCQlpbnQgZ2V0KEEgKmEpIHtyZXR1cm4gYS0+aWk7fQoJCWludCBnZXQoQSYgYSkge3JldHVybiBhLmlpO30KCQkKCSAgICBBbHNvLCBpdCB3b3JrcyBmb3IgZGlyZWN0b3IgbWV0aG9kcyB0aGF0IHJldHVybiBhIGJ5IHZhbHVlCgkgICAgcmVzdWx0LCBpZSwgdGhlIGZvbGxvd2luZyB3aWxsIHdvcms6CgogICAgICAgICAgICAgICAgdmlydHVhbCBBIGdldF9hKCkgPSAwOwoKCQlkZWYgZ2V0X2Eoc2VsZik6CgkJICAgcmV0dXJuIDEKCiAgICAgICAgICAgIGJ1dCBub3QgaW4gdGhpcyBjYXNlOgoKICAgICAgICAgICAgICAgIHZpcnR1YWwgY29uc3QgQSYgZ2V0X2EoKSA9IDA7CiAgICAgICAgICAgICAgICB2aXJ0dWFsIEEmIGdldF9hKCkgPSAwOwogICAgICAgICAgICAgICAgdmlydHVhbCBBKiBnZXRfYSgpID0gMDsKCSAgICAKCSAgTm90ZXM6CgoJICAtIHRoZSBpbXBsaWNpdGNvbnYgbWVjaGFuaXNtIGlzIGltcGxlbWVudGVkIGJ5IGRpcmVjdGx5CgkgICAgY2FsbGluZy9kaXNwYXRjaGluZyB0aGUgcHl0aG9uIGNvbnN0cnVjdG9yLCB0cmlnZ2VyaW5nIGEKCSAgICBjYWxsIHRvIHRoZSBfX2luaXRfX21ldGhvZC4gSGVuY2UsIGlmIHlvdSBleHBhbmRlZCB0aGUKCSAgICBfX2luaXRfXyBtZXRob2QsIGxpa2UgaW46CgoJICAgICAgICBjbGFzcyBBOgoJCSAgIGRlZiBfX2luaXRfXyhzZWxmLGFyZ3MpOgoJCSAgICAgIDxzd2lnIGNvZGU+CgkJICAgICAgPG15IGNvZGUgaGVyZT4KCiAgICAgICAgICAgIHRoZW4gJ215IGNvZGUnIHdpbGwgYWxzbyBiZSBleGVjdXRlZC4KCSAgICAKCSAgLSBTaW5jZSB0aGUgJWltcGxpY2l0Y29udiBkaXJlY3RpdmUgaXMgYSBTV0lHIGZlYXR1cmUsIGlmIHlvdSB0eXBlOgoJICAgIAogIAkgICAgICAgJWltcGxpY2l0Y29udjsgIAoKCSAgICB0aGF0IHdpbGwgZW5hYmxlIGltcGxpY2l0IGNvbnZlcnNpb24gZm9yIGFsbCB0aGUgY2xhc3NlcyBpbgoJICAgIHlvdXIgbW9kdWxlLgoKCSAgICBCdXQgaWYgeW91IGFyZSB3b3JyaWVkIGFib3V0IHBlcmZvcm1hbmNlLCBtYXliZSB0aGF0IHdpbGwgYmUKCSAgICB0b28gbXVjaCwgZXNwZWNpYWxseSBpZiB5b3UgaGF2ZSBvdmVybG9hZGVkIG1ldGhvZHMsIHNpbmNlCgkgICAgdG8gcmVzb2x2ZSB0aGUgZGlzcGF0Y2hpbmcgcHJvYmxlbSwgcHl0aG9uIHdpbGwgZWZlY3RpdmVseQoJICAgIHRyeSB0byBjYWxsIGFsbCB0aGUgaW1wbGljaXQgY29uc3RydWN0b3JzIGFzIG5lZWRlZC4KCgkgIC0gRm9yIHRoZSBzYW1lIHJlYXNvbiwgaXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRoYXQgeW91IHVzZQogICAgICAgICAgICB0aGUgbmV3ICdjYXN0bW9kZScgd2hlbiBtaXhpbmcgaW1wbGljaXQgY29udmVyc2lvbiBhbmQKICAgICAgICAgICAgb3ZlcmxvYWRpbmcuCgoJIC0gW3B5dGhvbl0gVGhlICVpbXBsaWNpdCBkaXJlY3RpdmUgaXMgZGVjbGFyZWQgb2Jzb2xldGUsIGFuZAogICAgICAgICAgIHlvdSBzaG91bGQgdXNlICVpbXBsaWNpdGNvbnYgaW5zdGVhZC4gSWYgeW91IGluY2x1ZGUKCSAgIHRoZSBpbXBsaWNpdC5pIGZpbGUsIGEgd2FybmluZyB3aWxsIHJlbWluZCB5b3Ugb2YgdGhpcy4KCgkgICBOb3RlOiBTaW5jZSAlaW1wbGljaXQgaXMgZnJhZ2lsZSwganVzdCByZXBsYWNpbmcgaXQgYnkKCSAgICVpbXBsaWNpdGNvbnYgY291bGQgbGVhZCB0byBkaWZmZXJlbnQgYmVoYXZpb3IuIEhlbmNlLCB3ZQoJICAgZG9uJ3QgYXV0b21hdGljYWxseSBzd2l0Y2ggZnJvbSB0byB0aGUgb3RoZXIsIGFuZCB0aGUgdXNlcgoJICAgbXVzdCBtaWdyYXRlIHRvIHRoZSBuZXcgJWltcGxpY2l0Y29udiBkaXJlY3RpdmUgbWFudWFsbHkuCgoKMTIvMjYvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXQogICAgICAgICAgICBNb2RpZnkgc3RkOjp2ZWN0b3Igd3JhcHBlcnMgdG8gdXNlIHN0ZDo6dmVjdG9yOjp2YWx1ZV90eXBlIGFzIHRoaXMgaXMKICAgICAgICAgICAgY2xvc2VyIHRvIHRoZSByZWFsIFNUTCBkZWNsYXJhdGlvbnMgZm9yIHNvbWUgbWV0aG9kcywgZWcgZm9yIHB1c2hfYmFjaygpLgogICAgICAgICAgICBGaXhlcyBzb21lIGNvbXBpbGF0aW9uIGVycm9ycyBmb3Igc29tZSBjb21waWxlcnMgZWcgd2hlbiB0aGUgdGVtcGxhdGVkCiAgICAgICAgICAgIHR5cGUgaXMgYSBwb2ludGVyLgoKICAgICAgICAgICAgW0phdmFdCiAgICAgICAgICAgIHN0ZDo6dmVjdG9yIGltcHJvdmVtZW50cyAtIGEgZmV3IG1vcmUgbWV0aG9kcyBhcmUgd3JhcHBlZCBhbmQgc3BlY2lhbGl6YXRpb25zIGFyZQogICAgICAgICAgICBubyBsb25nZXIgcmVxdWlyZWQuIFRoZSBzcGVjaWFsaXplX3N0ZF92ZWN0b3IgbWFjcm8gaXMgbm8gbG9uZ2VyIG5lZWRlZCAoYQogICAgICAgICAgICB3YXJuaW5nIGlzIGlzc3VlZCBpZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gdXNlIGl0KS4KCjEyLzI2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10KICAgICAgICAgICAgQWRkIGluIHBvaW50ZXIgcmVmZXJlbmNlIHR5cGVtYXBzLiBUaGlzIGFsc28gZW5hYmxlcyBvbmUgdG8gZWFzaWx5IHdyYXAKICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VD4gd2hlcmUgVCBpcyBhIHBvaW50ZXIuCgoxMi8yNC8yMDA1OiBlZnV6enlvbmUKICAgICAgICAgICAgW0NGRkldIFRoZSBjZmZpIG1vZHVsZSBmb3IgU1dJRzoKICAgICAgICAgICAgICAtIEZ1bGx5IHN1cHBvcnRzIEMsIGJ1dCBwcm92aWRlcyBsaW1pdGVkIHN1cHBvcnRzIGZvciBDKyssIGluCiAgICAgICAgICAgICAgIHBhcnRpY3VsYXIgQysrIHN1cHBvcnQgZm9yIHRlbXBsYXRlcyBhbmQgb3ZlcmxvYWRpbmcgbmVlZHMgdG8KICAgICAgICAgICAgICAgYmUgd29ya2VkIHVwb24uIAoKMTIvMjMvMjAwNTogbW1hdHVzCgkgICAgW3B5dGhvbl0gQWRkIHRoZSBjYXN0bW9kZSB0aGF0IGFsbG93cyB0aGUgcHl0aG9uCgkgICAgdHlwZSBjYXN0aW5nIHRvIG9jY3VyLgoKCSAgICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgJ2ludCBmb28oaW50KScsIG5vdwoJICAgIAoJICAgICAgY2xhc3MgQWkoKToKCSAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLHgpOiAKCQkgICAgc2VsZi54ID0geAoJICAgICAgICAgZGVmIF9faW50X18oc2VsZik6IAoJCSAgICByZXR1cm4gc2VsZi54CgoJICAgICAgZm9vKDEpICAgLy8gT2sKCSAgICAgIGZvbygxLjApIC8vIE9rCgkgICAgICBmb28oMS4zKSAvLyBFcnJvcgoJICAgICAgYSA9IEFpKDQpCiAgICAgICAgICAgICAgZm9vKGFpKSAgLy8gT2sKCiAgICAgICAgICAgIFRoZSBjYXN0bW9kZSwgd2hpY2ggY2FuIGJlIGVuYWJsZWQgZWl0aGVyIHdpdGggdGhlCiAgICAgICAgICAgICctY2FzdG1vZGUnIG9wdGlvbiBvciB0aGUgJW1vZHVsZSgiY2FzdG1vZGUiKSBvcHRpb24sIHVzZXMKICAgICAgICAgICAgdGhlIG5ldyBjYXN0L3JhbmsgZGlzcGF0Y2ggbWVjaGFuaXNtLiBIZW5jZSwgbm93IGlmIHlvdQogICAgICAgICAgICBoYXZlICdpbnQgZm9vKGludCk7IGludCBmb28oZG91YmxlKTsnLCB0aGUgZm9sbG93aW5nIHdvcmtzCiAgICAgICAgICAgIGFzIGV4cGVjdGVkOgoKCSAgICAgIGZvbygxKSAgIC0+IGZvbyhpbnQpCgkgICAgICBmb28oMS4wKSAtPiBmb28oZG91YmxlKQoJICAgICAgYWkgPSBBaSg0KQoJICAgICAgZm9vKGFpKSAgLT4gZm9vKGludCkKCgkgICAgTm90ZTE6IHRoZSAnY2FzdG1vZGUnIGNvdWxkIGRpc3J1cHQgc29tZSBzcGVjaWFsaXplZAoJICAgIHR5cGVtYXBzLiBJbiBwYXJ0aWN1bGFyLCB0aGUgImltcGxpY2l0LmkiIGxpYnJhcnkgc2VlbXMgdG8KCSAgICBoYXZlIHByb2JsZW0gd2l0aCB0aGUgY2FzdG1vZGUuIEJ1dCBiZXNpZGVzIHRoYXQgb25lLCB0aGUKCSAgICBlbnRpcmUgdGVzdC1zdWl0ZSBjb21waWxlcyBmaW5lIHdpdGggYW5kIHdpdGhvdXQgdGhlCgkgICAgY2FzdG1vZGUuCgogCSAgICBOb3RlMjogdGhlIGNhc3QgbW9kZSBjYW4ndCBiZSBjb21iaW5lZCB3aXRoIHRoZSBmYXN0CgkgICAgZGlzcGF0Y2ggbW9kZSwgaWUsIHRoZSAtZmFzdGRpc3BhdGNoIG9wdGlvbiBoYXMgbm8gZWZmZWN0CgkgICAgd2hlbiB0aGUgY2FzdCBtb2RlIGlzIHNlbGVjdGVkLiBUaGUgcGVuYWx0aWVzLCBob3dldmVyLAoJICAgIGFyZSBtaW5pbXVtIHNpbmNlIHRoZSBjYXN0IGRpc3BhdGNoIGNvZGUgaXMgYWxyZWFkeSBiYXNlZAoJICAgIG9uIHRoZSBzYW1lIGZhc3QgZGlzcGF0Y2ggbWVjaGFuaXNtLgoKCSAgICBTZWUgdGhlIGZpbGUgb3ZlcmxvYWRfZGlzcGF0Y2hfY2FzdF9ydW5tZS5weSBmaWxlIGZvcgoJICAgIG5ldyBjYXNlcyBhbmQgZXhhbXBsZXMuCgoxMi8yMi8yMDA1OiBtbWF0dXMKCSAgICBBZGQgdGhlIGNhc3QgYW5kIHJhbmsgbWVjaGFuaXNtIHRvIGRpc3BhdGNoIG92ZXJsb2FkaW5nCgkgICAgZnVuY3Rpb25zLiBUaGUgVVRGIHN1cHBvcnRzIGl0IG5vdywgYnV0IGZvciBlYWNoIGxhbmd1YWdlCgkgICAgaXQgbXVzdCBiZSBkZWNpZGVkIGhvdyB0byBpbXBsZW1lbnQgYW5kL29yIHdoZW4gdG8gdXNlIGl0LgoKCSAgICBbcGVybF0gTm93IHBlcmwgdXNlcyB0aGUgbmV3IGNhc3QgYW5kIHJhbmsgZGlzcGF0Y2gKCSAgICBtZWNoYW5pc20sIHdoaWNoIHNvbHZlcyBhbGwgdGhlIHBhc3QgcHJvYmxlbXMga25vd24gCgkgICAgaW4gcGVybCwgc3VjaCBhcyB0aGUgb2xkICcrIDEnIHByb2JsZW06CgoJICAgICAgICBpbnQgZm9vKGludCk7CgkgICAgCgkJJG4gPSAxCiAgICAgICAgICAgICAgICAkbiA9ICRuICsgMQogICAgICAgICAgICAgICAgJHIgPSBmb28obikKCiAgICAgICAgICAgIGFsc28gd29ya3M6CgogICAgICAgICAgICAgICAgIGZvbygxKTsKICAgICAgICAgICAgICAgICBmb28oIjEiKTsKICAgICAgICAgICAgICAgICBmb28oMS4wKTsKICAgICAgICAgICAgICAgICBmb28oIjEuMCIpOwoKICAgICAgICAgICAgIGJ1dCBmYWlscwoKICAgICAgICAgICAgICAgICBmb28oImwiKTsKCiAgICAgICAgICAgICBhbmQgd2hlbiBvdmVybG9hZGluZyAgZm9vKGludCkgYW5kIGZvbyhkb3VibGUpOwoKICAgICAgICAgICAgICAgICBmb28oMSkgLT4gZm9vKGludCkKICAgICAgICAgICAgICAgICBmb28oMS4wKSAtPiBmb28oZG91YmxlKQogICAgICAgICAgICAgICAgIGZvbygiMSIpIC0+IGZvbyhpbnQpCiAgICAgICAgICAgICAgICAgZm9vKCIxLjAiKSAtPiBmb28oZG91YmxlKQogICAgICAgICAgICAgICAgIGZvbygibCIpIC0+IGVycm9yCgkJIGZvbygkbikgLT4gZm9vKGludCkgIGZvciBnb29kIHBlcmwgdmVyc2lvbnMKCQkgZm9vKCRuKSAtPiBmb28oZG91YmxlKSAgZm9yIG9sZCBiYWQgcGVybCB2ZXJzaW9ucwoKCSAgICAgd2hlbiBvdmVybG9hZGluZyBmb28oaW50KSwgZm9vKGNoYXIqKSBhbmQgZm9vKGRvdWJsZSk6CgogICAgICAgICAgICAgICAgIGZvbygxKSAtPiBmb28oaW50KQogICAgICAgICAgICAgICAgIGZvbygxLjApIC0+IGZvbyhkb3VibGUpCiAgICAgICAgICAgICAgICAgZm9vKCIxIikgLT4gZm9vKGNoYXIqKQogICAgICAgICAgICAgICAgIGZvbygiMS4wIikgLT4gZm9vKGNoYXIqKQogICAgICAgICAgICAgICAgIGZvbygibCIpIC0+IGZvbyhjaGFyKikKCiAgICAgICAgICAgICBOb3RlOiBJbiBwZXJsIHRoZSBvbGQgZGlzcGF0Y2ggbWVjaGFuaXNtIHdhcyBicm9rZW4sCiAgICAgICAgICAgICBzbywgd2UgZG9uJ3QgcHJvdmlkZSBhbiBvcHRpb24gdG8gZW5hYmxlIHRoZSBvbGQgb25lCgkgICAgIHNpbmNlLCBhZ2FpbiwgaXQgd2FzIHJlYWxseSByZWFsbHkgYnJva2VuLgoKCSAgICAgU2VlICdvdmVybG9hZF9zaW1wbGVfcnVubWUucGwnIGZvciBtb3JlIGNhc2VzIGFuZCB0ZXN0cy4KCgkgICAgIFBTOiBhbGwgdGhlIG9sZCBrbm93biBpc3N1ZXMgYXJlIGRlY2xhcmVkIHJlc29sdmVkLCBhbnkKCSAgICAgbmV3ICJwcm9ibGVtIiB0aGF0IGNvdWxkIGJlIGRpc2NvdmVyZWQgaXMgZGVjbGFyZWQsIAoJICAgICBhIHByaW9yaSwgYXMgImZlYXR1cmVzIiBvZiB0aGUgbmV3IGRpc3BhdGNoIG1lY2hhbmlzbQoJICAgICAodW50aWwgd2UgZmluZCBhbm90aGVyIHNvbHV0aW9uIGF0IGxlYXN0KS4KCSAgICAgCgkgICAgIAogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoJICAgIEFzIHdpdGggdGhlIGludHJvZHVjdGlvbiBvZiB0aGUgVVRGLCBzb21lIHRoaW5ncyBjb3VsZAoJICAgIG5vdyBzdGFydCB0byB3b3JrIGFzIGV4cGVjdGVkLCBhbmQgcGVvcGxlIHVzZWQgdG8gZGVhbCBvcgoJICAgIHdvcmthcm91bmQgcHJldmlvdXMgYnVncyByZWxhdGVkIHRvIHRoZSBkaXNwYXRjaAoJICAgIG1lY2hhbmlzbSwgY291bGQgc2VlIG5vdyBhIGRpZmZlcmVuY2UgaW4gcGVybCBiZWhhdmlvci4KCjEyLzIxLzIwMDU6IG1tYXR1cwoJICAtIFRoZSAnLW5vZGVmYXVsdCcgZmxhZyAocHJhZ21hIGFuZCBmZWF0dXJlKSBub3cgZ2VuZXJhdGVzCgkgICAgYSB3YXJuaW5nLCBhbmQgcmVjb21tZW5kcyB0byB1c2UgdGhlIGV4cGxpY2l0CgkgICAgLW5vZGVmYXVsdGN0b3IgYW5kICAtbm9kZWZhdWx0ZHRvciBvcHRpb25zLgoJICAgIAoJICAgIFRoZSByZWFzb24gdG8gc3BsaXQgdGhlICdub2RlZmF1bHQnIGJlaGF2aW9yIGlzIHRoYXQsIGluCgkgICAgZ2VuZXJhbCwgaWdub3JpbmcgdGhlIGRlZmF1bHQgZGVzdHJ1Y3RvciBnZW5lcmF0ZXMgbWVtb3J5CgkgICAgbGVha3MgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4gSGVuY2UsIGlzIHRvbyByaXNreSBqdXN0IHRvCgkgICAgZGlzYWJsZSBib3RoIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yCgkgICAgYXQgdGhlIHNhbWUgdGltZS4KCgkgICAgSWYgeW91IG5lZWQgdG8gZGlzYWJsZSB0aGUgZGVmYXVsdCBkZXN0cnVjdG9yLCBpdCBpcwoJICAgIGFsc28gcmVjb21tZW5kZWQgeW91IHVzZSB0aGUgZGlyZWN0aXZlIGZvcm06CgoJICAgICAgICVub2RlZmF1bHRkdG9yICBNeVZlcnlTcGVjaWFsQ2xhc3M7CgogICAgICAgICAgICBmb3Igc3BlY2lmaWMgY2xhc3NlcywgYW5kIGFsd2F5cyBhdm9pZCB1c2luZyB0aGUgZ2xvYmFsCiAgICAgICAgICAgIC1ub2RlZmF1bHQgYW5kIC1ub2RlZmF1bHRkdG9yIG9wdGlvbnMuCgkgICAgCjEyLzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10KICAgICAgICAgICAgRml4IGluY29ycmVjdCBjb2RlIGdlbmVyYXRpb24gd2hlbiB0aGUgaW50ZXJtZWRpYXJ5IGNsYXNzbmFtZSBpcyBjaGFuZ2VkCiAgICAgICAgICAgIGluIHRoZSBtb2R1bGUgZGlyZWN0aXZlIGZyb20gaXRzIGRlZmF1bHQuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlbW9kdWxlKGpuaWNsYXNzbmFtZT0ibXlpbWNsYXNzbmV3bmFtZSIpICJteW1vZHVsZSIgLy8gSmF2YQogICAgICAgICAgICAgICVtb2R1bGUoaW1jbGFzc25hbWU9Im15aW1jbGFzc25ld25hbWUiKSAibXltb2R1bGUiIC8vIEMjCgogICAgICAgICAgICBBZGQgaW4gbmV3IHNwZWNpYWwgdmFyaWFibGUgJGltY2xhc3NuYW1lLiBTZWUgZG9jcy4KCjEyLzE3LzIwMDU6IG1tYXR1cwoJICBbUHl0aG9uXQoJICAtIEFkZCB0aGUgLWFsaWFzb2JqMC8tbm9hbGlhc29iajAgb3B0aW9ucyB0byB1c2Ugd2l0aAoJICAgIC1mYXN0dW5wYWNrIGFuZC9vciAtTyBhbmQgb2xkIHR5cGVtYXBzIHRoYXQgdXNlICdvYmowJwoJICAgIGRpcmVjdGx5LgoKCSAgICBTbywgaWYgeW91IGNvbXBpbGUgeW91ciBjb2RlIHVzaW5nIC1PIGFuZCBnZXQgZXJyb3JzIGFib3V0CgkgICAgdGhlIHVuZGVjbGFyZWQgJ29iajAnIHZhcmlhYmxlLCBydW4gYWdhaW4gdXNpbmcgCgoJCXN3aWcgLU8gLWFsaWFzb2JqMCAtcHl0aG9uIC4uLi4KCSAgICAKCSAgICBGb3IgbmV3IHR5cGVtYXBzLCBuZXZlciB1c2UgJ29iajAnIGRpcmVjdGx5LCBpZiBuZWVkZWQsCgkgICAgdXNlIHRoZSAnJHNlbGYnIG5hbWUgdGhhdCB3aWxsIGJlIHByb3Blcmx5ICBleHBhbmRlZCB0bwoJICAgICdvYmowJyAobm9mYXN0dW5wYWNrKSBvciAnc3dpZ19vYmpbMF0nIChmYXN0dW5wYWNrKS4gCiAgCgkgICAgSWYgeW91IGhhdmUgbm8gaWRlYSB3aGF0IEkgYW0gdGFsa2luZyBhYm91dCwgYmV0dGVyLCB0aGF0CgkgICAgbWVhbnMgeW91IGhhdmUgbm8gdHlwZW1hcCB3aXRoIHRoaXMgcHJvYmxlbS4KCgoxMi8xNC8yMDA1OiBtbWF0dXMgCSAKCSAgW1B5dGhvbl0KCSAgLSBBZGQgdGhlIC1mYXN0dW5wYWNrLy1ub2Zhc3R1bnBhY2sgb3B0aW9ucyB0byBlbmFibGUvZGlzYWJsZQoJICAgIHRoZSB1c2Ugb2YgdGhlIGludGVybmFsIFVucGFja1R1cGxlIG1ldGhvZCwgaW5zdGVhZCBvZgoJICAgIGNhbGxpbmcgdGhlIG9uZSBmcm9tIHRoZSBweXRob24gQyBBUEkuCgoJICAgIFRoZSBvcHRpb24gLU8gbm93IGFsc28gaW1wbGllcyAtZmFzdHVucGFjay4KCSAgICAKCjEyLzExLzIwMDU6IG1tYXR1cyAKCSAgW1B5dGhvbl0KCSAgLSBBZGQgdGhlIC1wcm94eWRlbC8tbm9wcm94eWRlbCBvcHRpb25zIHRvIGVuYWJsZS9kaXNhYmxlCgkgICAgdGhlIGdlbmVyYXRpb24gb2YgcHJveHkvc2hhZG93IF9fZGVsX18gbWV0aG9kcywgZXZlbgoJICAgIHdoZW4gbm93IHRoZXkgYXJlIHJlZHVuZGFudCwgc2luY2UgdGhleSBhcmUgZW1wdHkuCgkgICAgSG93ZXZlciwgb2xkIGludGVyZmFjZXMgY291bGQgcmVseSBvbiBjYWxsaW5nIHRoZW0uCgoJICAgIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGdlbmVyYXRlIHRoZSBfX2RlbF9fIG1ldGhvZHMKCSAgICBhcyBpbiAxLjMuMjcgb3Igb2xkZXIgc3dpZyB2ZXJzaW9ucy4KCgkgICAgVGhlIG9wdGlvbiAtTyBub3cgYWxzbyBpbXBsaWVzIC1ub3Byb3h5ZGVsLgoKMTIvMTAvMjAwNTogbW1hdHVzIAoJICBbVVRGXQogICAgICAgICAgLSBGaXggdW5uZWNjZXNzYXJ5IGNhbGxzIHRvIFNXSUdfVHlwZVF1ZXJ5IGZvciAnY2hhciAqJwoJICAgIGFuZCAnd2NoYXJfdCAqJywgcHJvYmxlbSBmb3VuZCBieSBDbGF5IEN1bHZlciB3aGlsZQoJICAgIHByb2ZpbGluZyB0aGUgUHlPZ3JlIHByb2plY3QuCgoJICAKCSAgW1B5dGhvbl0gCgkgIC0gQWRkIHRoZSAtZGlydnRhYmxlLy1ub2RpcnZ0YWJsZSB0byBlbmFibGUvZGlzYWJsZQoJICAgIGEgcHNldWRvIHZpcnR1YWwgdGFibGUgdXNlZCBmb3IgZGlyZWN0b3JzLCBhdm9pZGluZwoJICAgIHRoZSBuZWVkIHRvIHJlc29sdmUgdGhlIHB5dGhvbiBtZXRob2QgYXQgZWFjaCBjYWxsLgoJICAgIAoJICAtIEFkZCB0aGUgLXNhZmVjc3RyaW5ncy8tbm9zYWZlY3N0cmluZ3Mgb3B0aW9ucyB0bwoJICAgIGVuYWJsZS9kaXNhYmxlIHRoZSB1c2Ugb2Ygc2FmZSBjb252ZXJzaW9ucyBmcm9tIFB5U3RyaW5nCgkgICAgdG8gY2hhciAqLiBQeXRob24gcmVxdWlyZXMgeW91IHRvIG5ldmVyIGNoYW5nZSB0aGUgaW50ZXJuYWwKCSAgICBidWZmZXIgZGlyZWN0bHksIGFuZCBoZW5jZSAnc2FmZWN0cmluZ3MnIHdhcnJhbnRpZXMgdGhhdAoJICAgIGJ1dCByZXR1cm5pbmcgYSBjb3B5IG9mIHRoZSBpbnRlcm5hbCBweXRob24gc3RyaW5nIGJ1ZmZlci4KCgkgICAgVGhlIGRlZmF1bHQsIGFzIGluIHByZXZpb3VzIHJlbGVhc2VzLCBpcyB0byByZXR1cm4gYQoJICAgIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciAobm9zYWZlY3N0cmluZ3MpLCBzbywgaXQgaXMgdGhlIHVzZXIncwoJICAgIHJlc3BvbnNpYmlsaXR5IHRvIGF2b2lkIGl0cyBtb2RpZmljYXRpb24uCgkgICAgCgkgIC0gQWRkIHRoZSAtTyBvcHRpb24gdG8gZW5hYmxlIGFsbCB0aGUgb3B0aW1pemF0aW9uIG9wdGlvbnMKCSAgICBhdCBvbmNlLCBpbml0aWFsbHkgZXF1aXZhbGVudCB0bwoKCSAgICAtbW9kZXJuIC1mYXN0ZGlzcGF0Y2ggLWRpcnZ0YWJsZSAtbm9zYWZlY3N0cmluZ3MgLWZ2aXJ0dWFsCgoxMi8wOC8yMDA1OiBtbWF0dXMgCgoJICAtIEFkZCB0aGUgLWZhc3RkaXNwYXRjaCBvcHRpb24gKGZhc3RkaXNwYXRjaCBmZWF0dXJlKS4gVGhpcwoJICAgIGVuYWJsZXMgdGhlICJmYXN0IGRpc3BhdGNoIiBtZWNoYW5pc20gZm9yIG92ZXJsb2FkZWQKCSAgICBtZXRob2RzIHByb3ZpZGVkIGJ5IFNhbHZhZG9yIEZhbmRpfm5vIEdhcmMnaWEgKCM5MzA1ODYpLgoKCSAgICBUaGUgcmVzdWx0aW5nIGNvZGUgaXMgc21hbGxlciBhbmQgZmFzdGVyIHNpbmNlIGxlc3MgdHlwZQoJICAgIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4gSG93ZXZlciwgdGhlIGVycm9yIG1lc3NhZ2VzIHlvdQoJICAgIGdldCB3aGVuIHRoZSBvdmVybG9hZGluZyBpcyBub3QgcmVzb2x2ZWQgY291bGQgYmUKCSAgICBkaWZmZXJlbnQgZnJvbSB3aGF0IHRoZSB0cmFkaXRpb25hbCBtZXRob2QgcmV0dXJucy4KCgkgICAgV2l0aCB0aGUgb2xkIG1ldGhvZCB5b3UgYWx3YXlzIGdldCBhbiBlcnJvciBzdWNoIGFzIAoKCSAgICAgICAiTm8gbWF0Y2hpbmcgZnVuY3Rpb24gZm9yIG92ZXJsb2FkZWQgLi4uIgoKICAgICAgICAgICAgd2l0aCB0aGUgbmV3IG1ldGhvZCB5b3UgY2FuIGFsc28gZ2V0IGVycm9ycyBzdWNoIGFzCgoJICAgICAgICJUeXBlIGVycm9yIGluIGFyZ3VtZW50IDEgb2YgdHlwZSAuLi4iCgoJICAgIFNlZSBidWcgcmVwb3J0ICM5MzA1ODYgZm9yIG1vcmUgZGV0YWlscy4KICAgICAgICAgICAgCiAgCSAgICBTbywgdGhpcyBvcHRpbWl6YXRpb24gbXVzdCBiZSBleHBsaWNpdGx5IGVuYWJsZWQgYnkgdXNlcnMuCgoJICAgIFRoZSBuZXcgbWVjaGFuaXNtIGNhbiBiZSB1c2VkIGFzOgoKICAgICAgICAgICAgICBzd2lnIC1mYXN0ZGlzcGF0Y2gKCiAgICAgICAgICAgIG9yIHVzaW5nIHRoZSBmZWF0dXJlIGZvcm0KCgkgICAgICAlZmVhdHVyZSgiZmFzdGRpc3BhdGNoIikgbWV0aG9kOwogICAgICAgICAgICBvcgogICAgICAgICAgICAgICVmYXN0ZGlzcGF0Y2ggbWV0aG9kOwoJICAgIAoKMTIvMDYvMjAwNTogbW1hdHVzIAoKICAgICAgICAgIC0gU2V2ZXJhbCBtZW1vcnkgYW5kIHNwZWVkIGltcHJvdmVtZW50cywgc3BlY2lhbGx5IGZvcgoJICAgIHRlbXBsYXRlcy4gTm93IHN3aWcgaXMgdXAgdG8gMjAgZmFzdGVyIHRoYW4gYmVmb3JlIGZvcgoJICAgIGxhcmdlIHRlbXBsYXRlIGludGVyZmFjZXMsIHN1Y2ggYXMgdGhlIHN0ZF9jb250YWluZXJzLmkKCSAgICBhbmQgdGVtcGxhdGVfbWF0cml4LmkgZmlsZXMgaW4gdGhlIHB5dGhvbiB0ZXN0LXN1aXRlLgoKCSAgICBNZW1vcnkgZm9vdHByaW50IGlzIGFsc28gcmVkdWNlZCBpbiBjb25zaWRlcmF0aW9uIG9mIHNtYWxsCgkgICAgcGNzL2FyY2hpdGVjdHVyZXMuCgoJICAtIGFkZCBjb21tYW5kbGluZSBvcHRpb25zIC1jcHBlcnJhc3dhcm4gYW5kIC1ub2NwcGVycmFzd2FybiIgdG8gZm9yY2UKICAgICAgICAgICAgdGhlIHN3aWcgcHJlcHJvY2Vzc29yIHRvIHRyZWF0IHRoZSAjZXJyb3IgZGlyZWN0aXZlIGFzIGEgI3dhcm5pbmcuCgkgICAgCgkgICAgdGhlIHByYWdtYXMKCiAgICAgICAgICAgICAgICNwcmFnbWEgU1dJRyBjcHBlcnJhc3dhcm49MQogICAgICAgICAgICAgICAjcHJhZ21hIFNXSUcgY3BwZXJyYXN3YXJuPTAKCSAgICAgICAKCSAgICBhcmUgZXF1aXZhbGVudCB0byB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMsIHJlc3BlY3RpdmVseS4KICAgICAgICAgICAgIAoKMTIvMDYvMjAwNTogbW1hdHVzCgkgICAgW1B5dGhvbl0gVGhlIGdlbmVyYXRlZCBjb2RlIGlzIG5vdyBtb3JlIHBvcnRhYmxlLCBlc3BlY2lhbGx5CgkgICAgZm9yIFdpbmRvd3MuIEZvbGxvd2luZyAKCiAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5weXRob24ub3JnL2RvYy9mYXEvd2luZG93cy5odG1sCgogICAgICAgICAgICBQeV9Ob25lIGlzIG5ldmVyIGFjY2Vzc2VkIGFzIGEgc3RydWN0dXJlLCBwbHVzIG90aGVyCiAgICAgICAgICAgIHRyaWNrcyBtZW50aW9uZWQgdGhlcmUuCgoxMi8wNi8yMDA1OiBtbWF0dXMKCSAgICBbUHl0aG9uXSBBZGRlZCBpbml0aWFsIHN1cHBvcnQgZm9yIHRocmVhZHMgYmFzZWQgaW4gdGhlCgkgICAgcHJvcG9zYWwgYnkgSm9zZXBoIFdpbnN0b24uCgoJICAgIFRoZSB1c2VyIGludGVyZmFjZSBpcyBhcyBmb2xsb3dzOgoKCSAgICAxLi0gdGhlIG1vZHVsZSB0aHJlYWQgc3VwcG9ydCBpcyBlbmFibGUgdmlhIHRoZSAidGhyZWFkcyIgbW9kdWxlCiAgICAgICAgICAgICAgICBvcHRpb24sIGkuZS4KCiAgICAgICAgICAgICAgICAgICVtb2R1bGUoInRocmVhZHMiPTEpCgogICAgICAgICAgICAyLi0gRXF1aXZhbGVudCB0byB0aGF0LCBpcyB0aGUgbmV3ICctdGhyZWFkcycgc3dpZyBvcHRpb24KCiAgICAgICAgICAgICAgICAgIHN3aWcgLXRocmVhZHMgLXB5dGhvbiAuLi4KCiAgICAgICAgICAgIDMuLSBZb3UgY2FuIHBhcnRpYWxseSBkaXNhYmxlIHRocmVhZCBzdXBwb3J0IGZvciBhIGdpdmVuCiAgICAgICAgICAgICAgICBtZXRob2QgdXNpbmc6CgogICAgICAgICAgICAgICAgICAlZmVhdHVyZSgibm90aHJlYWQiKSBtZXRob2Q7CiAgICAgICAgICAgICAgICBvcgoJCSAgJW5vdGhyZWFkIG1ldGhvZDsKCiAgICAgICAgICAgICAgICBhbHNvLCB5b3UgY2FuIGRpc2FibGUgc2VjdGlvbnMgb2YgdGhlIHRocmVhZCBzdXBwb3J0LCAKICAgICAgICAgICAgICAgIGZvciBleGFtcGxlCgogICAgICAgICAgICAgICAgICAlZmVhdHVyZSgibm90aHJlYWRibG9jayIpIG1ldGhvZDsKICAgICAgICAgICAgICAgIG9yCgkJICAlbm90aHJlYWRibG9jayBtZXRob2Q7CgogICAgICAgICAgICAgICAgICAlZmVhdHVyZSgibm90aHJlYWRhbGxvdyIpIG1ldGhvZDsKICAgICAgICAgICAgICAgIG9yCgkJICAlbm90aHJlYWRhbGxvdyBtZXRob2Q7CgogICAgICAgICAgICAgICAgdGhlIGZpcnN0IGRpc2FibGVzIHRoZSBDKysvcHl0aG9uIHRocmVhZCBwcm90ZWN0aW9uLCBhbmQgdGhlCiAgICAgICAgICAgICAgICBzZWNvbmQgZGlzYWJsZXMgdGhlIHB5dGhvbi9DKysgdGhyZWFkIHByb3RlY3Rpb24uIAoKICAgICAgICAgICAgNC4tIFRoZSBjdXJyZW50IHRocmVhZCBzdXBwb3J0IGlzIGJhc2VkIGluIHRoZSBQeUdJTAogICAgICAgICAgICAgICAgZXh0ZW5zaW9uIHByZXNlbnQgaW4gcHl0aG9uIHZlcnNpb24gMi4zIG9yIGxhdGVyLCBidXQKICAgICAgICAgICAgICAgIHlvdSBjYW4gcHJvdmlkZSB0aGUgdGhyZWFkIGNvZGUgZm9yIG9sZGVyIHZlcnNpb25zIGJ5CiAgICAgICAgICAgICAgICBkZWZpbmluZyB0aGUgbWFjcm9zIGluIHB5dGhyZWFkcy5zd2cuCgoJCUlmIHlvdSBnZXQgYSB3b3JraW5nIGltcGxlbWVudGF0aW9uIGZvciBvbGRlciB2ZXJzaW9ucywKCQlwbGVhc2Ugc2VuZCB1cyBhIHBhdGNoLgoKICAgICAgICAgICAgRm9yIHRoZSBjdXJpb3VzIGFib3V0IHBlcmZvcm1hbmNlLCBoZXJlIGFyZSBzb21lIG51bWJlcnMKICAgICAgICAgICAgZm9yIHRoZSBwcm9maWxldGVzdC5pIHRlc3QsIHdoaWNoIGlzIHVzZWQgdG8gY2hlY2sgdGhlIHNwZWVkCgkgICAgb2YgdGhlIHdyYXBwZWQgY29kZToKCgkgICAgICAgIG5vdGhyZWFkICAgICAgICAgICA5LjZzICAobm8gdGhyZWFkIGNvZGUpCgkJbm90aHJlYWRibG9jayAgICAgMTIuMnMgIChvbmx5ICdhbGxvdycgY29kZSkKCQlub3RocmVhZGFsbG93ICAgICAxMy42cyAgKG9ubHkgJ2Jsb2NrJyBjb2RlKQogICAgICAgICAgICAgICAgZnVsbCB0aHJlYWQgICAgICAgMTUuNXMgICgnYWxsb3cnICsgJ2Jsb2NrJyBjb2RlKQoJICAgIAoJICAgIGkuZS4sIGZ1bGwgdGhyZWFkIGNvZGUgZGVjcmVhc2VzIHRoZSB3cmFwcGluZyBwZXJmb3JtYW5jZSBieQoJICAgIGFyb3VuZCA2MCUuIElmIHRoYXQgaXMgaW1wb3J0YW50IHRvIHlvdXIgYXBwbGljYXRpb24sIHlvdQoJICAgIGNhbiB0dW5lIGVhY2ggbWV0aG9kIHVzaW5nIHRoZSBkaWZmZXJlbnQgJ25vdGhyZWFkJywKCSAgICAnbm90aHJlYWRibG9jaycgb3IgJ25vdGhyZWFkYWxsb3cnIGZlYXR1cmVzIGFzCgkgICAgbmVlZGVkLiBOb3RlIHRoYXQgZm9yIHNvbWUgbWV0aG9kcyBkZWFjdGl2YXRpbmcgdGhlCgkgICAgJ3RocmVhZCBibG9jaycgb3IgJ3RocmVhZCBhbGxvdycgY29kZSBpcyBub3QgYW4gb3B0aW9uLAoJICAgIHNvLCBiZSBjYXJlZnVsLgoJICAgIAoKMTEvMjYvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgU1dJRyBsaWJyYXJ5IGZpbGVzIHVzZSBzeXN0ZW0gYW5nbGUgYnJhY2tldHMgZXZlcnl3aGVyZSBmb3IgJWluY2x1ZGUsIGVnCiAgICAgICAgICAgICAgJWluY2x1ZGUgInN0ZF9jb21tb24uaSIKICAgICAgICAgICAgYmVjb21lcwogICAgICAgICAgICAgICVpbmNsdWRlIDxzdGRfY29tbW9uLmk+CgoxMS8yNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdCiAgICAgICAgICAgIFR5cGVzYWZlIGVudW1zIGFuZCBwcm9wZXIgZW51bXMgaGF2ZSBhbiBleHRyYSBjb25zdHJ1Y3RvciBzbyB0aGF0IGVudW0gaXRlbSB2YWx1ZXMgdGhhdAogICAgICAgICAgICBhcmUgaW5pdGlhbGlzZWQgYnkgYW5vdGhlciBlbnVtIGl0ZW0gdmFsdWUgY2FuIGJlIHdyYXBwZWQgd2l0aG91dCBoYXZpbmcgdG8gdXNlICVqYXZhY29uc3R2YWx1ZS8KICAgICAgICAgICAgJWNzY29uc3R2YWx1ZSBmb3Igd2hlbiB1c2luZyAlamF2YWNvbnN0KDEpLyVjc2NvbnN0KDEpLiBTdWdnZXN0aW9uIGJ5CiAgICAgICAgICAgIEJvYiBNYXJpbmllci9Eb3VnbGFzIFBlYXJzb24uCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB0eXBlZGVmIGVudW0KICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgeHl6LAogICAgICAgICAgICAgICAgIGxhc3QgPSB4eXoKICAgICAgICAgICAgICB9IHJlcGVhdDsKCjExLzIxLzIwMDU6IG1tYXR1cwoJICAgIFtydWJ5ICsgcHl0aG9uXQoKCSAgICBGaXhlcyBmb3IgZGlyZWN0b3JzICsgcG9pbnRlcnMuIFRoaXMgaXMgYW4gdWdseSBwcm9ibGVtIHdpdGhvdXQgYW4gZWFzeQoJICAgIHNvbHV0aW9uLiBCZWZvcmUgd2UgaWRlbnRpZmllZCB0aGlzIGNhc2UgYXMgcHJvYmxlbWF0aWM6CgoJICAgICAgICAgIHZpcnR1YWwgY29uc3QgTXlDbGFzcyYgbXlfbWV0aG9kKCk7CgogICAgICAgICAgICBidXQgaXQgdHVybnMgb3V0IHRoYXQgYWxsIHRoZSBjYXNlcyB3aGVyZSBhIHBvaW50ZXIsIGFycmF5IG9yCiAgICAgICAgICAgIHJlZmVyZW5jZSBpcyByZXR1cm5lZCwgYXJlIHByb2JsZW1hdGljLCBldmVuIGZvciAKCSAgICBwcmltaXRpdmUgdHlwZXMgKGFzIGludCwgZG91YmxlLCBjaGFyKiwgZXRjKS4KCgkgICAgVG8gdHJ5IHRvIGZpeCB0aGUgaXNzdWUsIGEgbmV3IHR5cGVtYXAgd2FzIGFkZGVkLAoJICAgICdkaXJlY3RvcmZyZWUnLCB3aGljaCBpcyB1c2VkIHRvICdmcmVlJyB0aGUgcmVzb3VyY2VzCgkgICAgYWxsb2NhdGVkIGR1cmluZyB0aGUgJ2RpcmVjdG9yb3V0JyBwaGFzZS4gQXQgdGhlIHNhbWUKCSAgICB0aW1lLCBhIHByaW1pdGl2ZSBnYXJiYWdlIGNvbGxlY3RvciBlbmdpbmUgd2FzIGFkZGVkIHRvCgkgICAgZGVhbCB3aXRoIG9ycGhhbmVkIGFkZHJlc3Nlcywgd2hlbiBuZWVkZWQuCgkgICAgCgkgICAgVGhlIHNpdHVhdGlvbiBpcyBtdWNoIGJldHRlciBub3csIGJ1dCBzdGlsbCBpdCBpcyBwb3NzaWJsZSB0byBoYXZlCgkgICAgbWVtb3J5IGV4aGF1c3RhdGlvbiBpZiByZWN1cnNpb24gaXMgdXNlZC4KCgkgICAgU28sIHN0aWxsIHlvdSBuZWVkIHRvIGF2b2lkIHJldHVybmluZyBwb2ludGVycywgYXJyYXlzIG9yCgkgICAgcmVmZXJlbmNlcyB3aGVuIHVzaW5nIGRpcmVjdG9yIG1ldGhvZHMuCgoJICAgIC0gQWRkZWQgc3RkaW50LmkgLSB0eXBlbWFwcyBmb3IgbGF0ZXN0IEM5OSBpbnRlZ3JhbCB0eXBlcyBmb3VuZCBpbiBzdGRpbnQuaC4KCSAgICAKMTEvMTQvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgTW9yZSB0eXBlcyBhZGRlZCB0byB3aW5kb3dzLmksIGVnIFVJTlQ4LCBXT1JELCBCWVRFIGV0Yy4gCiAgICAgICAgICAgIEluY2x1ZGluZyB3aW5kb3dzLmkgd2lsbCBhbHNvIGVuYWJsZSBTV0lHIHRvIHBhcnNlIHRoZSBfX2RlY2xzcGVjIE1pY3Jvc29mdAogICAgICAgICAgICBleHRlbnNpb24sIGVnIF9fZGVjbHNwZWMoZGxsaW1wb3J0KS4gQWxzbyBvdGhlciBXaW5kb3dzIGNhbGxpbmcgY29udmVudGlvbnMKICAgICAgICAgICAgc3VjaCBhcyBfX3N0ZGNhbGwuCgoxMS8xMC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBOZXcgbGlicmFyeSBmaWxlIGZvciBXaW5kb3dzIC0gd2luZG93cy5pLiBUaGlzIGZpbGUgd2lsbCBjb250YWluIHVzZWZ1bCB0eXBlCiAgICAgICAgICAgIGluZm9ybWF0aW9uIGZvciB1c2VycyB3aG8gaW5jbHVkZSB3aW5kb3dzLmguIEluaXRpYWwgc3VwcG9ydCBpcyBmb3IgdGhlCiAgICAgICAgICAgIG5vbiBJU08gaW50ZWdyYWwgdHlwZXM6IF9faW50OCwgX19pbnQxNiwgX19pbnQzMiwgX19pbnQ2NCBhbmQgdW5zaWduZWQgdmVyc2lvbnMuCiAgICAgICAgICAgIFRoZSB1bnNpZ25lZCB2ZXJzaW9ucyBwcmV2aW91c2x5IGNvdWxkIG5vdCBiZSBwYXJzZWQgYnkgU1dJRy4gIFNGICM4NzIwMTMuCgoxMS8wOS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIFBvcnRhYmlsaXR5IHdhcm5pbmcgZm9yIGZpbGVzIHdoaWNoIHdpbGwgb3ZlcndyaXRlIGVhY2ggb3RoZXIgb24gY2FzZQogICAgICAgICAgICBpbnNlbnNpdGl2ZSBmaWxlIHN5c3RlbXMgc3VjaCBhcyBGQVQzMi9OVEZTLiBUaGlzIHdpbGwgb2NjdXIsIGZvciBleGFtcGxlLCB3aGVuIHR3bwogICAgICAgICAgICBjbGFzcyBuYW1lcyBhcmUgdGhlIHNhbWUgYmFycmluZyBjYXNlLiBUaGUgd2FybmluZyBpcyBpc3N1ZWQgb24gYWxsIHBsYXRmb3JtcyBhbmQKICAgICAgICAgICAgY2FuIGJlIHN1cHByZXNzZWQgd2l0aCB0aGUgdXN1YWwgd2FybmluZyBzdXBwcmVzc2lvbiB0ZWNobmlxdWVzLiBTRiBidWcgIzEwODQ1MDcuCgoxMS8wOS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICAuL2NvbmZpZ3VyZSAtLXdpdGgtcHl0aG9uIC0td2l0aC1ydWJ5IC0td2l0aC1wZXJsNSBldGMgZW5hYmxlIHRoZXNlIGxhbmd1YWdlcywKICAgICAgICAgICAgaWUgdGhlIC0td2l0aC14eHh4IG9wdGlvbnMsIHdoZXJlIG5vIHBhdGggaXMgc3BlY2lmaWVkLCB3b3JrIHRoZSBzYW1lIGFzIGlmIAogICAgICAgICAgICB0aGUgb3B0aW9uIHdhcyBub3Qgc3BlY2lmaWVkIGF0IGFsbC4gQmFzZWQgb24gcGF0Y2hlcyAjMTMzNTA0MiAjMTMyOTA0OCAjMTMyOTA0Ny4KCjExLzA5LzIwMDU6IGRhbmN5CgoJICAgIFtBbGxlZ3JvY2xdCgkgICAgQWRkIEMrKyBzdXBwb3J0IHRvIHRoZSBBbGxlZ3JvY2wgbW9kdWxlLiBGdXJ0aGVyCgkgICAgZW5oYW5jZXMgdGhlIEMgc3VwcG9ydCBhcyB3ZWxsLiBTb21lIG9mIHRoZQoJICAgIGZlYXR1cmVzOgoKCSAgICAtIE1VQ0ggYmV0dGVyIGdlbmVyYXRpb24gb2YgZm9yZWlnbiB0eXBlcyBiYXNlZCBvbgoJICAgIHRoZSBDL0MrKyB0eXBlcyBmb3IgdXNlIGluIGRlZmluaW5nIHRoZSBGRkkgb24KCSAgICB0aGUgbGlzcCBzaWRlLiBXZSBkb24ndCBwYXNzIGV2ZXJ5dGhpbmcgYXMgYSAoKiA6dm9pZCkKCSAgICBhbnkgbG9uZ2VyLgoKCSAgICAtIFVzZXMgdHlwZW1hcHMgZm9yIGJldHRlciBjb250cm9sIG9mIHR5cGUgY29udmVyc2lvbnMKCSAgICBhbmQgY29kZSBnZW5lcmF0aW9uIGluIHRoZSBnZW5lcmF0ZWQgbGlzcCBhbmQgYysrIHdyYXBwZXIKCSAgICBjb2RlLgoKCSAgICAtIENMT1Mgd3JhcHBpbmcgb2YgcG9pbnRlcnMgcmV0dXJuZWQgZnJvbSBmb3JlaWduIHNwYWNlCgkgICAgbWFrZXMgaXQgZWFzaWVyIHRvIGRpZmZlcmVudGlhdGUgcG9pbnRlcnMgaW4gdXNlciBjb2RlLgoJICAgIFRoZSB3cmFwcGluZyBvYmplY3RzIGNhbiBiZSBwYXNzZWQgZGlyZWN0bHkgdG8gRkYgY2FsbHMuCgoJICAgIC0gRGVmdW4gd3JhcHBpbmcgb2YgRkYgY2FsbHMsIGFsbG93aW5nIGZvciBtb3JlIGxpc3B5CgkgICAgaW50ZXJmYWNlLiBDb252ZXJzaW9uLCBHQ2luZywgb2YgbGlzcCBvYmplY3RzIHRvIAoJICAgIGZvcmVpZ24gb2JqZWN0cyBjYW4gYmUgZG9uZSBpbiB0aGUgd3JhcHBpbmcgZGVmdW4gdmlhCgkgICAgdGhlIHVzZSBvZiB0eXBlbWFwcy4KCSAgICAKCSAgICAtIG92ZXJsb2FkIGRpc3BhdGNoaW5nIGltcGxlbWVudGVkIG9uIHRoZSBsaXNwIHNpZGUKCSAgICB1c2luZyBnZW5lcmljIGZ1bmN0aW9ucy4KCgkgICAgLSBUZW1wbGF0ZXMgYW5kIHN5bm9ueW1vdXMgdHlwZXMgc3VwcG9ydGVkLgoKMTEvMDcvMjAwNTogbW1hdHVzCgoJICAgIFtQeXRob25dIEFkZGluZyBwcm9wZXIgc3VwcG9ydCBmb3IgbXVsdGktaW5oZXJpdGFuY2UgaW4KCSAgICB0aGUgcHl0aG9uIHNpZGUsIGllLCBpZiB5b3UgaGF2ZSB0d28gQysrIHdyYXBwZWQgY2xhc3MsIEZvbwoJICAgIGFuZCBCYXIsIG5vdzoKCgkgICAgICAgY2xhc3MgTXlQeXRob25DbGFzcyhGb28sQmFyKToKCSAgICAgICAgICAuLi4uCgogICAgICAgICAgICB3aWxsIHByb3Blcmx5IHdvcmssIGV2ZW4gd2l0aCBkaXJlY3RvcnMsIGFuZCB0aGUKICAgICAgICAgICAgZGVhbGxvY2F0aW9uIG9mIEZvby50aGlzIGFuZCBCYXIudGhpcyB3aWxsIGZvbGxvdwogICAgICAgICAgICBjb3JyZWN0bHkuIEJlZm9yZSwgYSBjbGFzcyBjb3VsZCBvbmx5IGhhdmUgb25lICd0aGlzJwogICAgICAgICAgICBpbnN0YW5jZSAodW5saWtlIEMrKyksIG9ubHkgdGhlIGxhc3QgYmFzZSBjbGFzcyB3YXMKICAgICAgICAgICAgcHJvcGVybHkgZGVsZXRlZCwgb3IgZGV0ZWN0ZWQgd2l0aCBkaXJlY3RvcnMuCgoJICAgIE5vdyAnc2VsZi50aGlzJyBjYW4gYmUgYSBsaXN0LCB3aGljaCB3aWxsIGNvbnRhaW4gdGhlIEMrKwoJICAgIGluc3RhbmNlIHBvaW50ZXJzIGZvciBhbGwgdGhlIGJhc2UgY2xhc3Nlcy4KCSAgICAKCSAgICBBbHNvLCBzd2lnLnRoaXMgaXMgcmVzcG9uc2libGUgZm9yIGRlYWxsb2NhdGluZyB0aGUgQysrCgkgICAgaW5zdGFuY2UocyksIGFuZCB0aGUgX19kZWxfXyBtZXRob2QgaXMgbm90IGVtaXR0ZWQgdW5sZXNzCgkgICAgdGhlIHVzZXIgcHJlcHBlbmQvYXBwZW5kIHNvbWUgY29kZSB0byBpdC4KCgkgIC0gU3dpZyBjYW4gbm93IGRldGVjdCBtZW1vcnkgbGVha3MsIGllLCBpZiB5b3Ugc3RpbGwKCSAgICBkb24ndCB1c2UgcHJveHkvc2hhZG93IGNsYXNzZXMsIGFuZCB0eXBlIHNvbWV0aGluZyBsaWtlCgkgICAgCgkgICAgICAgICBpbXBvcnQgX2V4YW1wbGUKCSAgICAgICAgIGYgPSBfZXhhbXBsZS5uZXdfRm9vKCkKCgkgICAgYW5kIGZvcmdldCB0byBjYWxsIF9leGFtcGxlLmRlbGV0ZV9Gb28oZiksIHRoZW4gc3dpZyB3aWxsCgkgICAgdGVsbCB5b3UgdGhhdCB0aGVyZSBpcyBhIG1lbW9yeSBsZWFrLgoKCSAgICBPdGhlcndpc2UsIGlmIHlvdSBhbHdheXMgdXNlIHRoZSBwcm94eSBjbGFzc2VzLCB5b3UgcHJvYmFibHkKCSAgICB5b3Ugd2lsbCBuZXZlciBldmVyIHNlZSB0aGlzIHdhcm5pbmcgdW5sZXNzIHRoZXJlIGlzCgkgICAgc29tZXRoaW5nIHdyb25nIGluc2lkZSB0aGUgc3dpZyB3cmFwcGluZyBjb2RlLgoJICAgICAgIAoJCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoJICAgIAoJICAgIElmIHlvdSBvdmVybG9hZGVkIHRoZSBfX2RlbF9fIG1ldGhvZCwgYW5kIGNhbGwgdGhlIGJhc2UKCSAgICBvbmUJIHdpdGhvdXQgYSB0cnkgYmxvY2ssIGFzIGluCgoJICAgICAgICAgICBjbGFzcyBNeUNsYXNzKFN3aWdDbGFzcyk6CgoJICAgICAgICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKCQkgICAgICAgICAgPHlvdXIgY29kZSBoZXJlPgoJCSAgICAgICAgICBTd2lnQ2xhc3MuX19kZWxfXyhzZWxmKQoJCQkgIAogICAgICAgICAgICBweXRob24gY291bGQgY29tcGxhaW4gdGhhdCB0aGUgbWV0aG9kIFN3aWdDbGFzcy5fX2RlbF9fIGlzCiAgICAgICAgICAgIHVuZGVmaW5lZC4gVHJ5IHRvIHVzZSBpbnN0ZWFkOgoJICAgIAoJICAgICAgICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKCQkgICAgICAgICAgPHlvdXIgY29kZSBoZXJlPgoJCSAgICAgICAgICB0cnk6IFN3aWdDbGFzcy5fX2RlbF9fKHNlbGYpCgkJCSAgZXhjZXB0OiBwYXNzCgoJICAgIG9yIHNpbXBseSAJCSAgCgoJICAgICAgICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKCQkgICAgICAgICAgPHlvdXIgY29kZSBoZXJlPgoKMTEvMDIvMjAwNTogbW1hdHVzCgoJICAgIFtQeXRob25dIEFkZGluZyBtb3JlIGZ1biB0byBTVEwvU1REIGNvbnRhaW5lcnMsIG5vdyB5b3UKCSAgICBjYW4gZG8KCgkgICAgICAgJXRlbXBsYXRlKHB5c2V0KSBzdGQ6OnNldDxQeU9iamVjdCAqPjsJCQoJICAgICAgICV0ZW1wbGF0ZShweXZlY3Rvcikgc3RkOjp2ZWN0b3I8UHlPYmplY3QgKj47CQoJICAgICAgICV0ZW1wbGF0ZSgpIHN0ZDo6cGFpcjxQeU9iamVjdCAqLFB5T2JqZWN0ICo+OwkKCSAgICAgICAldGVtcGxhdGUocHl2ZWN0b3IpIHN0ZDo6bWFwPFB5T2JqZWN0ICosUHlPYmplY3QgKj47CgkgICAgICAgLi4uLgoKCSAgICBUaGUgc2FtZSAgYXBwbGllcyB0byBzdGQ6Omxpc3QsIHN0ZDo6ZGVxdWUsIHN0ZDo6bXVsdGlzZXQsIGV0Yy4KCgkgICAgVGhlbiwgYXQgdGhlIHB5dGhvbiBzaWRlIHlvdSBjYW4gZG8gbm93OgoKCSAgICAgICAjIEMrKyBzdGQ6OnZlY3RvciBhcyBuYXRpdmUgcHl0aG9uIHNlcXVlbmNlCgkgICAgICAgdiA9IHB5dmVjdG9yKFsxLCJoZWxsbyIsKDEsMildKQoJICAgICAgIHByaW50IHZbMV0KCSAgICAgICA+PiAnaGVsbG8nCgkgICAgICAgcHJpbnQgdlsyXQoJICAgICAgID4+ICgxLDIpCgkgICAgICAgCQkJCQkgICAKCSAgICAgICAjIEMrKyBzdGQ6OnNldCBhcyBuYXRpdmUgcHl0aG9uIHNlcXVlbmNlCgkgICAgICAgcyA9IHB5c2V0KCkJCQkgICAKCSAgICAgICBzLmluc2VydCgoMSwyKSkJCSAgIAoJICAgICAgIHMuaW5zZXJ0KDEpCQkJICAgCgkgICAgICAgcy5pbnNlcnQoImhlbGxvIikKCSAgICAgICBzdW09KCkKCSAgICAgICBmb3IgaSBpbiBzOgoJICAgICAgICAgc3VtICs9KGksKQoJICAgICAgIHByaW50IHN1bQoJICAgICAgID4+PiAoMSwgJ2hlbGxvJywgKDEsIDIpKQoJICAgICAgIAkJCQkgICAKCSAgICAgICAjIEMrKyBzdGQ6Om1hcCBhcyBuYXRpdmUgcHl0aG9uIHNlcXVlbmNlCgkgICAgICAgbSA9IHB5bWFwKCkJCQkgICAKCSAgICAgICBtWyJmb28iXSA9ICJoZWxsbyIJCSAgIAoJICAgICAgIG1bMV0gPSAoMSwyKQoJICAgICAgIHBtID0ge30KCSAgICAgICBmb3IgayBpbiBtOgkgICAgCSAgIAoJICAgICAgICAgcG1ba10gPSBtW2tdCgkgICAgICAgcHJpbnQgcG0KCSAgICAgICA+Pj4gezE6ICgxLCAyKSwgJ2Zvbyc6ICdoZWxsbyd9CgoJICAgIGllLCB0aGUgU1REL1NUTCBjb250YWluZXJzIHdvcmsgYXMgcmVhbCBuYXRpdmUgcHl0aG9uCgkgICAgY29udGFpbmVyLCB3aXRoIGFyYml0cmFyeSBpdGVtIHR5cGVzIGFuZCBzby4KCgkgICAgQnV0IHNpbmNlIG5vcm1hbCBDKysgY29udGFpbmVycyBkbyBub3QgcHJvcGVybHkgcmVmL3VucmVmCgkgICAgdGhlaXIgaXRlbXMsIHlvdSBzaG91bGQgdXNlIHRoZSBzYWZlciB2ZXJzaW9uczoKCSAgICAKCSAgICAgICV0ZW1wbGF0ZShweXNldCkgc3RkOjpzZXQ8c3dpZzo6UHlPYmplY3RfcHRyPjsKCSAgICAgICV0ZW1wbGF0ZShweXZlY3Rvcikgc3RkOjp2ZWN0b3I8c3dpZzo6UHlPYmplY3RfcHRyPjsKCSAgICAgICV0ZW1wbGF0ZSgpIHN0ZDo6cGFpcjxzd2lnOjpQeU9iamVjdF9wdHIsIHN3aWc6OlB5T2JqZWN0X3B0cj47CgkgICAgICAldGVtcGxhdGUocHl2ZWN0b3IpIHN0ZDo6bWFwPHN3aWc6OlB5T2JqZWN0X3B0cixzd2lnOjpQeU9iamVjdF9wdHI+OwoJICAgICAgLi4uLgoKCSAgICB3aGVyZSBzd2lnOjpQeU9iamVjdF9wdHIgaXMgYSBQeU9iamVjdCAqIGVudmVsb3BlIGNsYXNzIHByb3ZpZGVkCgkgICAgdG8gc2FmZWx5IGluY3JlZi9kZWNyZWYgdGhlIHB5dGhvbiBvYmplY3QuIAoJICAgIAoJICAgIFNvLCBub3cgeW91IGNhbiB1c2UgYWxsIHRoZSBTVEwvU1REIGNvbnRhaW5lcnMgYXMgbmF0aXZlCgkgICAgUHl0aG9uIGNvbnRhaW5lcnMuIAoKCSAgICBOb3RlIDE6IHN0ZDo6bWFwLCBzdGQ6OnNldCBhbmQgdGhlIG90aGVyICdvcmRlcmVkJwoJICAgIGNvbnRhaW5lcnMgd2lsbCBwcm9wZXJseSB1c2UgUHlPYmplY3RfQ29tcGFyZSBmb3Igc29ydGluZywKCSAgICB3aGVuIG5lZWRlZC4KCgkgICAgTm90ZSAyOiBhbGwgdGhlIFNUTC9TVEQgY29udGFpbmVycyBoYXZlIGEgbGltaXQgc2l6ZSBvZgoJICAgIFNJWkVfTUFYLCBpZSwgeW91IGNhbiBoYXZlIG1hbmFnZSBjb250YWluZXJzIGxhcmdlciB0aGFuCgkgICAgSU5UX01BWCwgdGhlIHB5dGhvbiBsaW1pdC4KCSAgICAKCSAgICAgIAoxMS8wMi8yMDA1OiBtbWF0dXMKCgkgICAgW1B5dGhvbl0KCSAgICAtIGFkZCAnaXRlcmF0b3IoKScgbWV0aG9kIGZvciBhbGwgc2VxdWVuY2VzIGFuZCBhZGRpdGlvbmFsbHkKCSAgICAgICdrZXlfaXRlcmF0b3IoKScgZm9yIG1hcHMuCgoJICAgICAgJ2l0ZXJhdG9yKCknIHdpbGwgYWx3YXlzIHJldHVybiB0aGUgbmF0aXZlIEMrKyBpdGVyYXRvci4KCSAgICAgIEFkZGl0aW9uYWxseSwgaW4gbWFwcywgJ2tleV9pdGVyYXRvcigpJyB3aWxsIHJldHVybiBhIHB5dGhvbgoJICAgICAgaXRlcmF0b3IgdXNpbmcgb25seSB0aGUgbWFwIGtleXMuCgkgICAgICAKCSAgICAgIEluIGdlbmVyYWwgdGhlIHNlcXVlbmNlIG1ldGhvZCBfX2l0ZXJfXyB3aWxsIGNhbGwKCSAgICAgICdpdGVyYXRvcigpJywgcmV0dXJuaW5nIHRoZSBuYXRpdmUgQysrIGl0ZXJhdG9yLCBidXQgaW4KCSAgICAgIG1hcHMgaXQgd2lsbCBjYWxsICdrZXlfaXRlcmF0b3IoKScsIG1haW50YWluaW5nCgkgICAgICBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgoKCSAgICAgIEhlbmNlLCBmb3Igc3RkOjptYXBzLCB5b3UgY2FuIHBsYXkgdGhlbiB3aXRoIHRoZSBuYXRpdmUKCSAgICAgIEMrKyBpdGVyYXRvciwgd2hpY2ggdmFsdWUgaXMgYSAoa2V5LCB2YWx1ZSkgcGFpciwgYnkKCSAgICAgIGNhbGxpbmcgbWFwLml0ZXJhdG9yKCksIGFzIHdpdGggbWFwLmJlZ2luKCksIG1hcC5lbmQoKSwgZXRjLgoKCSAgICAgIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgbWFwLml0ZXJhdG9yKCkgcmV0dXJucyBhIHNhZmUKCSAgICAgICdjbG9zZWQnIGl0ZXJhdG9yLCB3aGlsZSBtYXAuYmVnaW4oKSBhbmQgbWFwLmVuZCgpIGFyZQoJICAgICAgJ29wZW4nIGl0ZXJhdG9ycy4KCgkgICAgICBBICdjbG9zZWQnIGl0ZXJhdG9yIGtub3dzIHRoZSBiZWdpbiBhbmQgdGhlIGVuZCBvZiB0aGUKCSAgICAgIHNlcXVlbmNlLCBhbmQgaXQgbmV2ZXIgY2FuIHNlZy4gZmF1bHQuIEFuICdvcGVuJwoJICAgICAgaXRlcmF0b3IsIGFzIGluIEMrKywgY2FuIHNlZy4gZmF1bHQgYXQgdGhlIEMrKyBzaWRlLgoKCSAgICAgICAgICMgYSBjbG9zZWQgaXRlcmF0b3IgaXMgc2FmZSBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUuCgkJICMgdGhlIG5leHQoKSBtZXRob2Qgd2lsbCB0aHJvdyBhIFN0b3BJdGVyYXRpb24KCSAgICAgICAgICMgZXhjZXB0aW9uIGFzIG5lZWRlZAoJCgkgICAgICAgICBpID0gc2VxLml0ZXJhdG9yKCkKCQkgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKCQkgICAgICAgIHN1bSArPSBpLm5leHQoKQoJCSBleGNlcHQ6IHBhc3MKCQkgCgkJICMgYW4gb3BlbiBpdGVyYXRvciBhbHdheXMgbmVlZCB0byBiZSBjaGVja2VkLAoJCSAjIG9yIGl0IHdpbGwgY3Jhc2ggYXQgdGhlIEMrKyBzaWRlCgoJICAgICAgICAgY3VycmVudCA9IHNlcS5iZWdpbigpCiAgICAgICAgICAgICAgICAgZW5kID0gc2VxLmVuZCgpCgkJIHdoaWxlIChjdXJyZW50ICE9IGVuZCk6CgkJICAgIHN1bSArPSBjdXJyZW50Lm5leHQoKQoJICAgICAgCgkgICAgICAKCSAgICBbUHl0aG9uXQoJICAgIC0gRmluYWxseSwgd2hlbiB3ZSBjYWxsIAoKCSAgICAgICAgZiA9IEZvbygpCgoJICAgICAgdGhlIGNvbnN0cnVjdGlvbiBpcyAnb25lLXdheScuIEJlZm9yZSBjb25zdHJ1Y3Rpb24gIHdhcyBkb25lCgkgICAgICBzb21ldGhpbmcgbGlrZQoKCSAgICAgICAgICBGb28oKSAocHl0aG9uKSAtPiBfbmV3X0ZvbygpIChDKyspIAogICAgICAgICAgICAgICAgICBuZXdfRm9vKCkgKEMrKykgLT4gRm9vUHRyKCkgKHB5dGhvbikgCiAgICAgICAgICAgICAgICAgIEZvb1B0cigpIChweXRob24pIC0+IEZvbygpIChweXRob24pCgogICAgICAgICAgICAgIGFuZCByZXR1cm5pbmcgYSBwb2ludGVyIHdhcyBkb25lIGxpa2UKCiAgICAgICAgICAgICAgICAgIE5ld1BvaW50ZXJPYmooKSAoQysrKSAtPiBGb29QdHIoKSAocHl0aG9uKQogICAgICAgICAgICAgICAgICBGb29QdHIocHl0aG9uKSAtPiBGb28oKSAocHl0aG9uKQogICAgICAgICAgICAgICAgICAJCSAgCgoJICAgICAgaWUsIHdlIHdoZW4gZ29pbmcgYmFjayBhbmQgZm9yd2FyZCBiZXR3ZWVuIHRoZSBDKysgYW5kCgkgICAgICBweXRob24gc2lkZS4KCgkgICAgICBOb3cgc2luY2UgdGhlcmUgaXMgbm8gRm9vUHRyIHRoZSBjb25zdHJ1Y3Rpb24gcHJvY2VzcyBpcwoKCSAgICAgICAgICBGb28oKSAocHl0aG9uKSAtPiBfbmV3X0ZvbygpIChDKyspCiAgICAgICAgICAgICAgICAgIF9uZXdfRm9vKCkgKEMrKykgLT4gTmV3UG9pbnRlck9iaigpIChDKyspIChubyBzaGFkb3cgY2xhc3MpCgogICAgICAgICAgICAgIGFuZCByZXR1cm5pbmcgYSBwb2ludGVyIGlzIGRvbmUKCiAgICAgICAgICAgICAgICAgIE5ld1BvaW50ZXJPYmooKSAoQysrKSAod2l0aCBzaGFkb3cgY2xhc3MpIC0+IE5ld0luc3RhY2VPYmooKSAoQysrKQoKCSAgICAgIHdoZXJlIE5ld0luc3RhbmNlT2JqIGNyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugd2l0aG91dAoJICAgICAgY2FsbGluZyBfX2luaXRfXyBhbmQgaXQgZG9lc24ndCBnbyAnYmFjaycgdG8gcHl0aG9uLCBpcwoJICAgICAgJ3B1cmUnIEMgQVBJLgoKCSAgICAgLSBXaXRoIHRoaXMgY2hhbmdlLCBhbmQgdGhlIG90aGVyIG9uZXMgaW4gdGhlCiAgICAgICAgICAgICAgIFB5U3dpZ09iamVjdCB0eXBlLCB3aGljaCBub3cgY2FycmllcyB0aGUgdGhpc293biBhbmQKICAgICAgICAgICAgICAgc3dpZ190eXBlX2luZm8gcG9pbnRlciwgdGhlIGdlbmVyYXRlZCBjb2RlIHNob3VsZCBiZSBhcwogICAgICAgICAgICAgICBmYXN0IGFzIGJvb3N0OjpQeXRob24gYW5kL29yIHRoZSBvdGhlciBweXRob24gd3JhcHBlcnMKICAgICAgICAgICAgICAgYmFzZWQgaW4gcHVyZSBQeXRob24vQyBBUEkgY2FsbHMuCgoJICAgICAgIEFzIGEgcmVmZXJlbmNlLCB0aGUgcHJvZmlsZXRlc3RfcnVubWUucHkgZXhhbXBsZSwgd2hpY2gKCSAgICAgICBkb2VzIGEgc2ltcGxlIGNhbGwgZnVuY3Rpb24gbWFueSB0aW1lcywgc3VjaCBhcyB0aGlzIGNvZGU6CgogICAgICAgICAgICAgICAgICAgIGltcG9ydCBwcm9maWxldGVzdCAgICAgICAKCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoJCSAgICBhID0gcHJvZmlsZXRlc3QuQSgpICAgICAgCgkJICAgIGIgPSBwcm9maWxldGVzdC5CKCkgICAgICAKCQkgICAgZm9yIGkgaW4gcmFuZ2UoMCwxMDAwMDAwKQoJICAgICAgICAgICAgICBhID0gYi5mbihhKSAgICAgICAgICAgIAoKCgkgICAgICAgd2hlcmUgZm4gaXMgZGVmaW5lZCBhcyAnQSogQjo6Zm4oQSAqYSkge3JldHVybiBhO30nLAoJICAgICAgIHByb2R1Y2VzICB0aGUgZm9sbG93aW5nIHRpbWVzCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9tb2Rlcm4gICAgbW9kZXJuCgkgICAgICAgICBzd2lnLTEuMy4yNiAgICAxOS43MHMgICAgICA1Ljk4cwogICAgICAgICAgICAgICAgIHN3aWctQ1ZTICAgICAgICAwLjk5cyAgICAgIDAuOThzCgkgICAgICAgCgoJICAgICAgIENsZWFybHksIHRoZXJlIGlzIGEgbGFyZ2UgaW1wcm92ZW1lbnQgZm9yIHRoZSBweXRob24KCSAgICAgICAnbm9tb2Rlcm4nIG1vZGUuIFN0aWxsLCB0aGUgJ21vZGVybicgbW9kZSBpcyBhcm91bmQKCSAgICAgICA2IHRpbWVzIGZhc3RlciB0aGFuIGJlZm9yZS4gRm9yIHRoZSBzYW1lIHRlc3QsIGJ1dAoJICAgICAgIHVzaW5nIHRoZSBub24tc2hhZG93IHZlcnNpb24gb2YgdGhlIG1vZHVsZSwgd2UgZ2V0CgoJICAgICAgICAgICAgICAgICAgICAgICBfcHJvZmlsZXRlc3QgKG5vbi1zaGFkb3cpCgkgICAgICAgICBzd2lnLTEuMy4yNiAgICAgMC44MHMgCiAgICAgICAgICAgICAgICAgc3dpZy1DVlMgICAgICAgIDAuNjBzIAoKCSAgICAgICBIZW5jZSwgbm93IGZvciBwcmFjdGljYWwgcHVycG9zZXMsIHRoZSBwcm94eSBvdmVyaGVhZAoJICAgICAgIGlzIGluc2lnbmlmaWNhbnQuCgoJICAgICAgIE5vdGUgdGhhdCB0aGUgcGVyZm9ybWFuY2UgbnVtYmVycyB3ZSBhcmUgc2hvd2luZyBpcyBmb3IKCSAgICAgICBhIHNpbXBsZSBtb2R1bGUgKHR3byB0eXBlcykgYW5kIGEgc2ltcGxlIGZ1bmN0aW9uIChvbmUKCSAgICAgICBhcmd1bWVudCkuIEZvciByZWFsIHNpdHVhdGlvbnMsIGZvciBtb2R1bGVzIHdpdGggbWFueQoJICAgICAgIG1vcmUgdHlwZXMgYW5kL29yIGZ1bmN0aW9ucyB3aXRoIG1hbnkgbW9yZSBwYXJhbWV0ZXJzLAoJICAgICAgIHlvdSB3aWxsIHNlZSBldmVuIGJldHRlciByZXN1bHRzLgoJICAgICAgIAoJCSAgCSAgICAgIAoxMC8zMS8yMDA1OiBtbWF0dXMKCSAgICBbUHl0aG9uXQoKCSAgICAtIEZpbmFsbHksIG5vIG1vcmUgQ2xhc3NQdHIgcHJveHkgY2xhc3Nlcy4gWW91IHdpbGwgc2VlCgkgICAgICBvbmx5IGEgY2xlYW4gQ2xhc3MgcHJveHkgY2xhc3MgaW4gdGhlIC5weSBmaWxlLgoKCSAgICAtIE5vIG1vcmUgJ3JlYWwnIHRoaXNvd24gYXR0cmlidXRlIGVpdGhlciwgdGhlIFB5U3dpZ09iamVjdCBub3cKICAgICAgICAgICAgICBjYXJyaWVzIHRoZSBvd25lcnNoaXAgaW5mby4KCgkgICAgICBZb3UgY2FuIGFsc28gZG8gc29tZXRoaW5nIGxpa2UKCgkgICAgICAgICAgcHJpbnQgc2VsZi50aGlzLm93bigpIAoJCSAgPj4+IFRydWUKCQkgIAoJCSAgc2VsZi50aGlzLmRpc293bigpCgkJICBzZWxmLnRoaXMub3duKDApCgkgICAgICAgICAgcHJpbnQgc2VsZi50aGlzLm93bigpIAoJCSAgPj4+IEZhbHNlCQkgIAoKCQkgIHNlbGYudGhpcy5hY3F1aXJlKCkKCQkgIHNlbGYudGhpcy5vd24oMSkKCSAgICAgICAgICBwcmludCBzZWxmLnRoaXMub3duKCkgCgkJICA+Pj4gVHJ1ZQoKCSAgICAgIFN0aWxsIHRoZSBvbGQgd2F5LAoJICAgICAgCgkgICAgICAgICAgcHJpbnQgc2VsZi50aGlzb3duCgkJICA+Pj4gVHJ1ZQoKCQkgIHNlbGYudGhpc293biA9IDAKCSAgICAgICAgICBwcmludCBzZWxmLnRoaXNvd24KCQkgID4+PiBGYWxzZQkJICAKCgkJICBzZWxmLnRoaXNvd24gPSAxCgkgICAgICAgICAgcHJpbnQgc2VsZi50aGlzb3duCgkJICA+Pj4gVHJ1ZQoKICAgICAgICAgICAgICBpcyBzdXBwb3J0ZWQsIGFuZCBweXRob24gZGlzcGF0Y2hlcyB0aGUgcHJvcGVyIG1ldGhvZAogICAgICAgICAgICAgIGNhbGxzIGFzIG5lZWRlZC4gCQkgIAoJICAgICAgIAoKCSAgICAtIFN1cHBvcnQgZm9yIGl0ZXJhdG9ycyBpbiBTVEwvU1REIGNvbnRhaW5lcnMsIGZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZQoKICAgICAgICAgICAgICAgICAgICAldGVtcGxhdGU8c2V0X3N0cmluZz4gc3RkOjpzZXQ8c3RkOjpzdHJpbmc+OwoJICAgICAgICAgIAogICAgICAgICAgICAgICB5b3UgY2FuIHVzZSB0aGUgQysrIGl0ZXJhdG9ycyBhczogIAoKICAgICAgICAgICAgICAgICAgICAgcyA9IHNldF9zdHJpbmcoKQoJCSAgICAgICAgICAgICAgICAgICAgIAoJCSAgICAgcy5hcHBlbmQoImMiKSAgIAoJCSAgICAgcy5hcHBlbmQoImEiKSAgIAoJICAgICAgICAgICAgIHMuYXBwZW5kKCJiIikKCiAgICAgICAgICAgICAgICAgICAgIGIgPSBzLmJlZ2luKCkgICAgICAKCQkgICAgIGUgPSBzLmVuZCgpICAgICAgICAKCQkgICAgIHN1bSA9ICIiICAgICAgICAgICAKCQkgICAgIHdoaWxlIChiICE9IGUpOiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBiLm5leHQoKSAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIHByaW50IHN1bQoKICAgICAgICAgICAgICAgICAgICAgPj4+ICJhYmMiIAoKCQlhZHZhbmNlIHRoZSBpdGVyYXRvciBhcyBpbiBDKysKCiAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBzLmJlZ2luKCkgICAgICAKCQkgICAgIGN1cnJlbnQgKz0gMQogICAgICAgICAgICAgICAgICAgICBwcmludCBjdXJyZW50LnZhbHVlKCkKCQkgICAgID4+PiAiYiIKCQkgICAgIAoJCW5vdyB1c2luZyB0aGUgcmV2ZXJzZSBvcGVyYXRvcnMKCiAgICAgICAgICAgICAgICAgICAgIGIgPSBzLnJiZWdpbigpICAgICAgCgkJICAgICBlID0gcy5yZW5kKCkgICAgICAgIAoJCSAgICAgc3VtID0gIiIgICAgICAgICAgIAoJCSAgICAgd2hpbGUgKGIgIT0gZSk6ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgc3VtICs9IGIubmV4dCgpICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgcHJpbnQgc3VtCgogICAgICAgICAgICAgICAgICAgICA+Pj4gImNiYSIgCgoJICAgICAgICBvciB0aGUgJ3ByZXZpb3VzJyBtZXRob2QKCiAgICAgICAgICAgICAgICAgICAgIGIgPSBzLmJlZ2luKCkgICAgICAKCQkgICAgIGUgPSBzLmVuZCgpICAgICAgICAKCQkgICAgIHN1bSA9ICIiICAgICAgICAgICAKCQkgICAgIHdoaWxlIChiICE9IGUpOiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBlLnByZXZpb3VzKCkKICAgICAgICAgICAgICAgICAgICAgcHJpbnQgc3VtCgogICAgICAgICAgICAgICAgICAgICA+Pj4gImNiYSIgCgogICAgICAgICAgICAgICAgb3IganVzdCBhcyBpbiBhIHB5dGhvbiBmYXNoaW9uCgogICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiBzOgogICAgICAgICAgICAgICAgICAgICAgICAgc3VtICs9IGkgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIE5vdGUgMTogSXRlcmF0b3JzIGluIEMrKyBhcmUgdmVyeSBwb3dlcmZ1bCwgYnV0CiAgICAgICAgICAgICAgICBkYW5nZXJvdXMgdG9vLiBBbmQgaW4gcHl0aG9uIHlvdSBjYW4gc2hvb3QgeW91cnNlbGYgaW4gdGhlIGZvb3QKICAgICAgICAgICAgICAgIGp1c3QgbGlrZSBpbiBDKyssIHNvLCBiZSBjYXJlZnVsLgoJCQoJCU5vdGUgMjogdGhlIGl0ZXJhdG9ycyBhcmUgJ2xpZ2h0JywgaWUsIHRoZXkgZG8gbm90CgkJY29udmVydCBzZXF1ZW5jZSBlbGVtZW50cyB1bnRpbCB5b3UgcmVxdWVzdCB0byBkbyBzbywgdmlhCgkJbmV4dCgpLCB2YWx1ZSgpIG9yIHByZXZpb3VzKCkuIElmIHlvdSBqdXN0IGluY3JlbWVudC9kZWNyZW1lbnQgb25lCgkJbm8gY29udmVyc2lvbiBpcyBwZXJmb3JtZWQsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICBiID0gcy5iZWdpbigpICAgICAgCgkgICAgICAgICAgICAgYiArPSAxCiAgICAgICAgICAgICAgICAgICAgIGIuaW5jcigpCiAgICAgICAgICAgICAgICAgICAgIGIuaW5jcigyKQoJCSAgICAgYi5kZWNyKDIpCiAgICAgICAgICAgICAgICAgICAgIGIuZGVjcigpCiAgICAgICAgICAgICAgICAgICAgIGIgLT0gMQoKCQkgb25seSB0aGUgaXRlcmF0b3IgaXMgbW9kaWZpZWQsIGFuZCBub3QgdmFsdWUgd3JhcHBlcgoJCSBpcyBnZW5lcmF0ZWQuIE90aGVyIHR5cGljYWwgQysrIG9wZXJhdGlvbnMgYXJlIGFsc28gCgkJIGF2YWlsYWJsZSwgc3VjaCBhczoKCgkJICAgICBwcmludCBzLmVuZCgpIC0gcy5iZWdpbigpCgkJICAgICA+Pj4gMwoJCSAgICAgZiA9IHMuYmVnaW4oKSArIDEKCQkgICAgIHByaW50IGYudmFsdWUoKQoJCSAgICAgPj4+ICJiIgoJCSAgICAgbCA9IHMuZW5kKCkgLSAxCgkJICAgICBwcmludCBsLnZhbHVlKCkKCQkgICAgID4+PiAiYyIKCQkgCgkJIGV0Yy4gIE9mIGNvdXJzZSwgdGhlICdmaW5kJywgJ2luc2VydCcsICdlcmFzZScsIGFuZAoJCSBzbyBvbiBtZXRob2RzIGFsc28gc3VwcG9ydHMgaXRlcmF0b3JzIG5vdywgaWU6CgoJCSAgICAgIGkgPSBzLmJlZ2luKCkKCQkgICAgICBpICs9IDEKCQkgICAgICBzLmVyYXNlKGkpCiAgICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiBzOgogICAgICAgICAgICAgICAgICAgICAgICAgc3VtICs9IGkKCQkgICAgICBwcmludCBzdW0KCQkgICAgICA+Pj4gImFjIgoJCSAgICAgIAogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCgkgICAgVGhlcmUgaXMgbm8gbW9yZSAndGhpc293bicgYXR0cmlidXRlLiBJZiB5b3UgdXNlIGl0LCBweXRob24KCSAgICB3aWxsIHRyYW5zbGF0ZSB0aGUgZm9sbG93aW5nIGNvZGUgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi50aGlzb3duKTogICA9PT4gICBpZiAoc2VsZi50aGlzLm93bigpKToKCQlzZWxmLnRoaXNvd24gPSAxICAgICA9PT4gICBzZWxmLnRoaXMub3duKDEpCiAgICAgICAgICAgICAgICBzZWxmLnRoaXNvd24gPSAwICAgICA9PT4gICBzZWxmLnRoaXMub3duKDApCgoJICAgIFN0aWxsLCBtYXliZSBpbiBzb21lIHVudXN1YWwgY2FzZXMgdGhlIHRyYW5zbGF0aW9uIHdpbGwgbm90IGJlCgkgICAgMTAwJSBjb3JyZWN0LCBzbyBpZiB5b3UgaGF2ZSBhIHByb2JsZW0sIHBsZWFzZSByZXBvcnQgaXQKCSAgICBhbmQvb3IgdXNlIHRoZSBuZXcgJ3NlbGYudGhpcy5vd24oKScgYWNjZXNzb3IuCgkgICAgCgkgICAgCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoJICAgIAoJICAgIFRoZXJlIGlzIG5vIG1vcmUgQ2xhc3NQdHIgY2xhc3NlcyBpbiB0aGUgcHl0aG9uIGNvZGUuIEhlbmNlLAoJICAgIGlmIGluIHRoZSBwYXN0IHlvdSBuZWVkZWQgdG8gcmVzb3J0IHRvIHNvbWUga2luZCBvZiB0cmlja2VyeQoJICAgIHdpdGggdGhlbSwgb3Igb3ZlcmNvbWUgdGhlaXIgcHJlc2VuY2UsIGl0IGlzIG5vIGxvbmdlcgoJICAgIHJlcXVpcmVkLCBidXQgdGhlIGV4dHJhIGNvZGUgeW91IGFkZGVkIGNvdWxkIG5vdyBicmVhawoJICAgIHRoaW5ncy4KCgkgICAgSWYgbmVlZGVkLCB5b3UgY2FuIHVzZSB0aGUgb3B0aW9uIC1jbGFzc3B0ciwgaS5lLiwKCiAgICAgICAgICAgICAgIHN3aWcgLWNsYXNzcHRyIC1weXRob24gLi4uCgoJICAgIHRvIGdlbmVyYXRlIHRoZSBvbGQgQ2xhc3NQdHIgY2xhc3Nlcy4KCgoxMC8zMC8yMDA1OiBta29lcHBlIAoJICAgIFtHdWlsZV0gTWFrZSBkZWNsYXJlZCBhbmQgZGVmaW5lZCBsaW5rYWdlIG9mIFNXSUdfaW5pdCBjb25zaXN0ZW50LiAgCgkgICAgUmVwb3J0ZWQgYnkgU3RldmVuIEcuIEpvaG5zb24gKFNGIHBhdGNoIDEzMTU0OTgpLgoKMTAvMjYvMjAwNTogbW1hdHVzCgoJICAtIEFkZGVkIHRoZSBhdHRyaWJ1dGUuaSBmaWxlIHRvIHRoZSBnbG9iYWwgbGlicmFyeSBkaXJlY3Rvci4KCSAgICBOb3cgaXQgY2FuIGJlIHVzZWQgZnJvbSBvdGhlciBsYW5ndWFnZXMgdGhhdCBkbyBub3QgdXNlCgkgICAgdGhlIHVuaWZpZWQgdHlwZW1hcCBsaWJyYXJ5IGFzIHdlbGwuCgoJICAgIFNvLCBpZiB5b3UgaGF2ZSBzb21ldGhpbmcgbGlrZToKCgkgICAgICAgJWluY2x1ZGUgYXR0cmlidXRlLmkKCiAgICAgICAgICAgICAgICVhdHRyaWJ1dGUoQSwgaW50LCBhLCBnZXRfYSwgc2V0X2EpOwoJICAgICAgIAkJCQkgICAgICAJICAKCSAgICAgICBzdHJ1Y3QgQQkJCSAgICAgIAkgIAoJICAgICAgIHsgICAgCQkJCSAgCgkgICAgICAgICBpbnQgZ2V0X2EoKSBjb25zdDsgCQkgIAoJICAgICAgICAgdm9pZCBzZXRfYShpbnQgYWEpOyAJCSAgCgkgICAgICAgfTsJCQkJICAKCiAgICAgICAgICAgICAgICVhdHRyaWJ1dGVfcmVmKEIsIGludCwgYyk7CgkgICAgICAgCQkJCQoJICAgICAgIHN0cnVjdCBCCQkJCgkgICAgICAgeyAgICAJCQkKCSAgICAgICAgIGludCYgYygpOyAJCQoJICAgICAgIH07IAoKCSAgICB0aGVuIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgdGhlICdBLmEnIGFuZCAnQi5jJyBhdHRyaWJ1dGVzIHdpbGwKCSAgICBiZSB2aXNpYmxlLCBpZSwgeW91IGNhbiBhY2Nlc3MgdGhlbSBhcyBwbGFpbiB2YXJpYWJsZXM6CgogICAgICAgICAgICAgICBmICAgPSBBKCkKICAgICAgICAgICAgICAgZi5hID0gMwogICAgICAgICAgICAgICBnICAgPSBCKCkKICAgICAgICAgICAgICAgZy5jID0gMyAKICAgICAgICAgICAKCSAgICAgICBoICAgPSBmLmEgKyBnLmMKCgkgICAgYW5kIHRoZSBwcm9wZXIgZ2V0L3NldCBtZXRob2RzIHdpbGwgYmUgZGlzcGF0Y2hlZC4gU2VlCgkgICAgYXR0cmlidXRlLmkgZm9yIG1vcmUgaW5mby4KICAgCiAgICAgICAgICAtIE1vcmUgY2xlYW51cHMgYXJvdW5kIGFuZCBhZGRpbmcgbW9yZSB0ZXN0LWNhc2VzLiBUaGUKICAgICAgICAgICAgRElTT1dOIHR5cGVtYXAgbm93IGlzIHRlc3RlZCBhbmQgd29ya2luZyBpbiBhbGwgdGhlCiAgICAgICAgICAgIGxhbmd1YWdlcyB0aGF0IHVzZSB0aGUgdW5pZmllZCB0eXBlbWFwIGxpYnJhcnksIGllLCB0Y2wsCiAgICAgICAgICAgIHJ1YnksIHBlcmwgYW5kIHB5dGhvbi4KCSAgICAKCjEwLzI1LzIwMDU6IG1tYXR1cwoKCSAgICAtIFBlcmwsIGNvbXBsZXRlIHRoZSBESVNPV04gdHlwZW1hcC4KCSAgICAKCSAgICAtIGFkZGVkIHRoZSBhdHRyaWJ1dGUuaSBmaWxlIHRvIHRoZSB1bmlmaWVkIHR5cGVtYXAKICAgICAgICAgICAgICBsaWJyYXJ5IChiZWZvcmUgd2FzIG9ubHkgdXNhYmxlIGZyb20gcHl0aG9uKS4KCgkgICAgLSB1bmlmeSB0aGUgbmFtZXMgZm9yIHRoZSBzZXR0ZXIgYW5kIGdldHRlciBtZXRob2RzIGluCgkgICAgICBwZXJsLHRjbCxydWJ5IGFuZCBweXRob24sIHNvLCB0aGUgYXR0cmlidXRlLmkgbGlicmFyeQoJICAgICAgY2FuIHdvcmsgYWNyb3NzIHRoZW0uCgkgICAgICAKCSAgICAtIHNlZSB0aGUgbGlfYXR0cmlidXRlLmkgdGVzdC1jYXNlIG9yIHRoZSBsaWJyYXJ5IGZpbGUKCiAJICAgICAgICBMaWIvdHlwZW1hcHMvYXR0cmlidXRlLnN3ZwoKICAgICAgICAgICAgICBmb3IgbW9yZSBpbmZvIGFib3V0IGhvdyB0byB1c2UgaXQuCgogCgkgICAgICAKCjEwLzI0LzIwMDU6IG1tYXR1cwoKCSAgICAtIFBlcmwgbm93IHVzZXMgdGhlIHVuaWZpZWQgdHlwZW1hcCBsaWJyYXJ5LgoKCSAgICAtIENoYW5nZXMgaW4gcnVieSB0byB1c2UgdGhlICR0cmFjayBvcHRpb24gaW4gdHlwZW1hcHMuCgoJICAgIC0gQ2hhbmdlcyBpbiB0aGUgdW5pZmllZCB0eXBlbWFwIGxpYnJhcnkgdG8gZm9sbG93IHRoZQoJICAgICAgY29udmVudGlvbiB0aGF0IGFsbCBtYWNyb3MgdGhhdCBhcmUgbm90IHVzZWQgaW4gdGhlCgkgICAgICBDL0MrKyBzaWRlIHN0YXJ0cyB3aXRoICUsIHN1Y2ggYXMKCgkgICAgICAgICAgICVkZWxldGUKCQkgICAlbmV3X2FycmF5CgogICAgICAgICAgICAgIGV0Yy4KCSAgICAgIAoJICAgIC0gRG9jdW1lbnRpbmcgZnJhZ21lbnRzLCBzZWUgZnJhZ21lbnRzLnN3Zy4KCgkgICAgLSBDbGVhbmVyIHdheSB0byB1c2UgdGhlIHVuaWZpZWQgdHlwZW1hcCBsaWJyYXJ5LCBpbmNsdWRlCgkgICAgICBqdXN0IDx0eXBlbWFwcy9zd2lndHlwZXMuc3dnPi4KCgkgICAgICBDaGVjayBzb21lIG9mIHRoZSBzdXBwb3J0ZWQgbGFuZ3VhZ2VzOiBwZXJsLCB0Y2wsIHJ1YnksCgkgICAgICBweXRob24uCgoJICAgICAgQWx3YXlzIHN0YXJ0IHdpdGggdGhlIGhlYWQgZmlsZSwgc3VjaCBhcwoKCSAgICAgICAgIHB5dGhvbi9weXRob24uc3dnCgkgICAgICAgICB0Y2wvdGNsOC5zd2cKCSAgICAgICAgIHJ1YnkvcnVieS5zd2cKCSAgICAgICAgIHBlcmw1L3Blcmw1LnN3ZwoKICAgICAgICAgICAgICBhbmQgdGhlIHByaW5jaXBhbCBmaWxlIHRoYXQgaW52b2tlcyB0aGUgdW5pZmllZCBsaWJyYXJ5LCBzdWNoIGFzCgoJICAgICAgICAgcHl0aG9uL3B5dHlwZW1hcHMuc3dnCSAgICAKCSAgICAgICAgIHRjbC90Y2x0eXBlbWFwcy5zd2cJICAgIAoJICAgICAgICAgcnVieS9ydWJ5dHlwZW1hcHMuc3dnCSAgICAKCSAgICAgICAgIHBlcmwvcGVybHR5cGVtYXBzLnN3ZwkgICAgCgkgICAgCgkgICAgICBUaGUgZmlsZSB0aGF0IHByb3ZpZGUgdGhlIHNwZWNpYWxpemF0aW9uIGZvciBlYWNoCgkgICAgICBsYW5ndWFnZSBhcmUgdGhlIG9uZSB0aGF0IHByb3ZpZGVzIHRoZSBiYXNpYyB0eXBlczoKCgkgICAgICAgICBweXRob24vcHlwcmltdHlwZXMuc3dnCQoJICAgICAgICAgcnVieS9ydWJ5cHJpbXR5cGVzLnN3ZwkKCSAgICAgICAgIHRjbC90Y2xwcmltdHlwZXMuc3dnCQoJICAgICAgICAgcGVybDUvcGVybHByaW10eXBlcy5zd2cKCgkgICAgICBhbmQgdGhlIHN0cmluZyBtYW5pcHVsYXRpb246ICAJIAoJICAgIAoJICAgICAgICAgcHl0aG9uL3B5c3RyaW5ncy5zd2cJCgkgICAgICAgICBydWJ5L3J1YnlzdHJpbmdzLnN3ZwkKCSAgICAgICAgIHRjbC90Y2xzdHJpbmdzLnN3ZwkKCSAgICAgICAgIHBlcmw1L3BlcmxzdHJpbmdzLnN3ZwoKCQkgCgkgICAgICBUaGUgcmVzdCBvZiB0aGUgZmlsZXMsIHN1Y2ggYXMgY2FycmF5LmksIGFyZSBtb3N0bHkgb25lIAoJICAgICAgbGluZSBmaWxlcyB0aGF0IGluY2x1ZGUgdGhlIHByb3BlciB0eXBlbWFwIGxpYnJhcnkKCSAgICAgIHZlcnNpb24uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBpbiBQZXJsICoqKgoKCSAgICBTb21lIG1pc3Npbmcvd3JvbmcgdHlwZW1hcHMgY291bGQgc3RhcnQgd29ya2luZyBwcm9wZXJseSwKCSAgICBhbmQgY2hhbmdlIHRoZSBvbGQgZXhwZWN0ZWQgYmVoYXZpb3IgaW4gUGVybC4KCjEwLzIzLzIwMDU6IHd1enplYgogICAgICAgICAgICBDaGlja2VuOgogICAgICAgICAgICAgICsgcG9pbnRlcnMgdG8gbWVtYmVyIGZ1bmN0aW9ucyBmaW5hbGx5IHdvcmsgcHJvcGVybHkKICAgICAgICAgICAgICArIGFkZCB0ZXN0IG9mIG1lbWJlciBmdW5jdGlvbiBwb2ludGVycyB0byBjcHBfYmFzaWMuaQoKMTAvMjAvMjAwNTogZGFuY3kKCSAgICBbYWxsZWdyb2NsXSBBZGRlZCBDKysgc3VwcG9ydC4gTGFyZ2UgdXBkYXRlLCBtYW55IGNoYW5nZXMuIFNlZQoJICAgIG5ld2x5IGFkZGVkIEFsbGVncm8gQ29tbW9uIExpc3Agc2VjdGlvbiBpbiBsaXNwLmh0bWwKCjEwLzIwLzIwMDU6IG1tYXR1cwoJICAgIFJ1YnksIFRjbCwgUHl0aG9uOgoKCSAgICAtIFVuaWZvcm0gd2F5IHRvIGZhaWwgKGxhYmVsIGZhaWw6KSwgbm93IGZpbmFsbHkKCSAgICAgIFNXSUdfZXhjZXB0aW9uIHdvcmtzIGFjcm9zcyB0aGUgdGhyZWUgbGFuZ3VhZ2VzIGFuZCBhbGwKCSAgICAgIHRoZSB0eXBlbWFwcy4KCgkgICAgLSBBZGQgcHJvcGVyIGNsZWFudXAgY29kZSB0byBydWJ5CgoJICAgIC0gTW9yZSB2YWxncmluZCBmaXhlcwoKCSAgICAtIFNpbXBsaWZ5IHRoZSBpbmxpbmUgdXNlLCBpdCBzZWVtcyBhIHNtYWxsIGludGVyZmFjZSBvZgoJICAgICAgMjAsMDAwIGxpbmVzIChwbHVzIG1hbnkgbWFueSB0ZW1wbGF0ZXMpIGNhbiBicmVhayAKCSAgICAgIGdjYyAtTzMgZWFzaWx5LgoKCSAgICAtIEZpbmFsaXplIHRoZSB0eXBlbWFwcyBsaWJyYXJ5LiBBbGwgdGhlIG9sZCAgKi5pIGZpbGVzCgkgICAgICAoY2FycmF5LmksIGNwb2ludGVyLmksIGV4Y2VwdGlvbi5pKSBoYWQgYmVlbiBpbXBsZW1lbnRlZAoJICAgICAgaW4gdGhlIG5ldyB0eXBlbWFwcyBsaWJyYXJ5LgoJICAgIAoKMTAvMTkvMjAwNTogd3V6emViCgkgICAgVXBkYXRlIHRoZSBSdW50aW1lIFR5cGVtYXAgZG9jdW1lbnRhdGlvbiBpbiBUeXBlbWFwcy5odG1sCgoxMC8xOC8yMDA1OiB3dXp6ZWIKCSAgICBDaGlja2VuOgoJICAgICAgLSBDb3JyZWN0bHkgaGFuZGxlICVpZ25vcmVkIGNsYXNzZXMKICAgICAgICAgICAgICAtIENvcnJlY3RseSBjb252ZXJ0IGxvbmcsIGxvbmcgbG9uZywgdW5zaWduZWQgbG9uZywgZXRjCiAgICAgICAgICAgICAgICB0byBjaGlja2VuIHByaW1pdGl2ZXMuIChUaGFua3MgdG8gRmVsaXggV2lua2VsbWFubikKICAgICAgICAgICAgICAtIFVzaW5nIGFyZ291dCBwYXJhbWV0ZXJzIHdoZW4gdGhlIHJldHVybiB2YWx1ZSB3YXMgYQogICAgICAgICAgICAgICAgd3JhcHBlZCBwb2ludGVyIGNhdXNlZCBhIG1lbW9yeSBjb3JydXB0aW9uLiAgVGhlIGNoaWNrZW4KICAgICAgICAgICAgICAgIGdhcmJhZ2UgY29sbGVjdG9yIG1vdmVkIGEgcG9pbnRlciBvdXQgZnJvbSB1bmRlciB1cy4KICAgICAgICAgICAgICAgIFRoaXMgaXMgbm93IGZpeGVkIGJ5IHJ1bm5pbmcgYWxsIHRoZSBwcm94eSBjcmVhdGlvbgogICAgICAgICAgICAgICAgZnVuY3Rpb25zIGFzIGNvbnRpbnVhdGlvbnMgYWZ0ZXIgdGhlIHdyYXBwZXIgZnVuY3Rpb24KICAgICAgICAgICAgICAgIHJldHVybnMuICBBcyBwYXJ0IG9mIHRoaXMsIHdlIG5vIGxvbmdlciBuZWVkIHRoZQogICAgICAgICAgICAgICAgY2hpY2tlbmZhc3Rwcm94eSBmbGFnIG9uIG91dHB1dCB0eXBlbWFwcy4KICAgICAgICAgICAgICAtIHVzaW5nIC1wcm94eSBhbmQgLW5vY29sbGVjdGlvbiB0b2dldGhlciB3b3JrcyBub3cKICAgICAgICAgICAgICAgIEJlZm9yZSwgaXQgd2FzIG5vdCBleHBvcnRpbmcgdGhlIGRlc3RydWN0b3IgaW4gdGhlIHByb3h5CiAgICAgICAgICAgICAgICB3cmFwcGVyLgoKMTAvMTgvMjAwNTogbW1hdHVzCgkgICAgCgkgICAgQWRkZWQgdGhlIFVuaWZpZWQgVHlwZW1hcCBMaWJyYXJ5IChVVEwpLiBJdCB1bmlmaWVzIHRoZSB0eXBlbWFwcyBmb3IKCiAJICAgICAgICBweXRob24sIHJ1YnksIHRjbAoKCSAgICBhbmQgaW4gdGhlIHByb2Nlc3MsIGZpeGVzIHNldmVyYWwgcHJvYmxlbXMgaW4gZWFjaCBvZiB0aGUgdGhyZWUKCSAgICBsYW5ndWFnZXMgdG8gd29yayBpbiBhICJjYW5vbmljYWwiIHdheSBub3cgZXN0YWJsaXNoZWQgaW4KCSAgICB0aGUgdHlwZW1hcCBsaWJyYXJ5CgkgICAgCgkgICAgICAgU1dJRy9MaWIvdHlwZW1wYXMKCgkgICAgVGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSB1bmlmaWNhdGlvbiBpcyB0aGF0IGV2ZXJ5dGhpbmcKCSAgICBjb21waWxlcyBhbmQgcnVucyBpbnNpZGUgdGhlIHRlc3Qtc3VpdGUgYW5kIGV4YW1wbGVzCgkgICAgZGlyZWN0b3JpZXMuIEFuZCBmb3IgdGhlIGZpcnN0IHRpbWUgd2UgaGF2ZSB0aHJlZQoJICAgIGxhbmd1YWdlcyB0aGFuIHBhc3MgdGhlIHByaW1pdGl2ZV90eXBlcy5pIGNhc2UuCgoJICAgIEFsc28sIHdlIGhhdmUgYSB1bmlmb3JtIHdheSB0byB0cmVhdCB0aGUgZXJyb3JzLCBmb3IgZXhhbXBsZQoJICAgIGlmIHlvdSBkbyBzb21ldGhpbmcgbGlrZQoKCSAgICAgID4+PiBmcm9tIHByaW1pdGl2ZV90eXBlcyBpbXBvcnQgKgogICAgICAgICAgICAgID4+PiBwcmludCB2YWxfdWNoYXIoMTApCiAgICAgICAgICAgICAgMTAKCSAgICAgID4+PiBwcmludCB2YWxfdWNoYXIoMTAwMCkKICAgICAgICAgICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CQkgICAgICAKCSAgICAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPwkJCSAgICAKCSAgICAgIE92ZXJmbG93RXJyb3I6IGluIGFyZ3VtZW50IDEgb2YgdHlwZSAndW5zaWduZWQgY2hhcicKCgkgICAgeW91IGdldCB0aGUgc2FtZSBleGNlcHRpb24gaW4gYWxsIHRoZSB0aHJlZSBsYW5ndWFnZXMuCgkgICAgCgkgICAgQW5kIHdlbGwsIG1hbnkgbW9yZSBnb29kIHRoaW5ncyB3aWxsIGNvbWUgZnJvbSB0aGlzCgkgICAgdW5pZmljYXRpb24sIGZvciBleGFtcGxlLCBwcm9wZXIgc3VwcG9ydCBvZiB0aGUgU1RML1NURCBjbGFzc2VzCgkgICAgZm9yIGFsbCB0aGUgbGFuZ3VhZ2VzLCBhbmQgaG9wZWZ1bGx5LCB3ZSBjYW4ga2VlcAoJICAgIGFkZGluZyBvdGhlciBsYW5ndWFnZXMuCgoJICAgIFRoZSBoYXJkZXN0IHBhcnQsIHdyaXRpbmcgYSBjb21tb24gdHlwZW1hcCBsaWJyYXJ5CgkgICAgdGhhdCBzdWl0ZXMgdGhlIHRocmVlIGRpZmZlcmVudCBsYW5ndWFnZXMsIGlzIGRvbmUsCgkgICAgYW5kIGFkZGluZyBhbm90aGVyIGxhbmd1YWdlIHNob3VsZCBub3cgYmUgZWFzeS4gCgoJICAgIFN0aWxsIHRoZSBnbG9iYWwgdW5pZmljYXRpb24gaXMgbm90IGNvbXBsZXRlLCB0aGUgU1RML1NURCAKCSAgICBwYXJ0IGlzIG5leHQsIGFuZCBwcm9iYWJseSBhcyB3ZWxsIGFzIGFkZGluZyBvbmUgb3IgdHdvIG1vcmUKCSAgICBsYW5ndWFnZXMuCgoJICAgIElmIHlvdSBhcmUgY3VyaW91cywgbG9vayBhdCB0aGUgcHl0aG9uLCBydWJ5IGFuZC9vciB0Y2wKCSAgICBkaXJlY3RvcmllcyB0byBzZWUgd2hhdCBpcyBuZWVkZWQgdG8gc3VwcG9ydCB0aGUgbmV3CgkgICAgY29tbW9uIHR5cGVtYXBzIGxpYnJhcnkuICBTdGlsbCwgdGhlIGZpbmFsIHdheSB0bwoJICAgIGludGVncmF0ZSBhIG5ldyBsYW5ndWFnZSBjb3VsZCBjaGFuZ2UgYXMgd2UgbW92ZSB0bwoJICAgIGludGVncmF0ZSB0aGUgU1REL1NUTC4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIGluIFJ1YnkvVGNsICoqKgoKCSAgICBTb21lIG1pc3Npbmcvd3JvbmcgdHlwZW1hcHMgY291bGQgc3RhcnQgd29ya2luZyBwcm9wZXJseSwKCSAgICBhbmQgY2hhbmdlIHRoZSBvbGQgYmVoYXZpb3IsIHNwZWNpYWxseSBpbiBydWJ5IGFuZCB0Y2wuCgpWZXJzaW9uIDEuMy4yNyAoT2N0b2JlciAxNSwgMjAwNSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMC8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IGZvciB0eXBlc2FmZSBlbnVtIHdyYXBwaW5nIHNvIHRoYXQgaXQgaXMgcG9zc2libGUgdG8KICAgICAgICAgICAgb3ZlcmxvYWQgYSBtZXRob2Qgd2l0aCAyIGRpZmZlcmVudCBlbnVtIHR5cGVzLgoKMTAvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciAlZmVhdHVyZSgiaW1tdXRhYmxlIiwiMCIpIGF0dGVtcHRpbmcgdG8gZ2VuZXJhdGUgc2V0dGVycwogICAgICAgICAgICBmb3IgY29uc3RhbnRzLgoKICAgICAgICAgICAgUmVzdG9yZWQgJWltbXV0YWJsZSBhbmQgJW1ha2VkZWZhdWx0IHRvIGNsZWFyIHRoZSBmZWF0dXJlIGFzIGl0CiAgICAgICAgICAgIGJlaGF2ZWQgaW4gU1dJRy0xLjMuMjUgYW5kIGVhcmxpZXIuCgoxMC8xNC8yMDA1OiBtbWF0dXMKICAgICAgICAgICAgRml4IGJ1ZyBpbiBhbm9ueW1vdXMgdHlwZWRlZiBzdHJ1Y3R1cmVzIHdoaWNoIHdhcyBsZWFkaW5nIHRvCiAgICAgICAgICAgIHN0cmFuZ2UgYmVoYXZpb3VyLgoKMTAvMTMvMjAwNTogbW1hdHVzCgkgICAgU2V2ZXJhbCBtaW5vciBjaGFuZ2VzOgoJICAgIAoJICAgIC0gSW1wcm92ZSB0aGUgd2NoYXJfdCB0eXBlIHN1cHBvcnQKCSAgICAtIEFkZCBhIHdhcm5pbmcgZm9yIHdoZW4geW91IGRlZmluZSB0aGUgJ2luJyB0eXBlbWFwIGJ1dAoJICAgICAgeW91IGRvbid0IGRlZmluZSB0aGUgJ3R5cGVjaGVjaycgb25lLiBWZXJ5IGNvbW1vbiBtaXN0YWtlLgoJICAgIC0gQWRkIHByb3BlciBkZWZhdWx0IHJ1bGUgZm9yIGZ1bmN0aW9uIHBvaW50ZXJzLCBub3cgeW91CgkgICAgICBjYW4gZGVmaW5lIGEgdHlwZW1hcCBzdWNoIGFzOgoKCSAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRSAoKCopKEFOWSkpIHsuLi59CgoJICAgICAgVGhhdCB3aWxsIGFwcGx5IHRvIGFsbCB0aGUgcG9pbnRlciB0byBmdW5jdGlvbnMuIFRoZQoJICAgICAgcnVsZSBpbiBDKysgYWxzbyBhcHBseSB0byB0aGUgZnVuY3Rpb24gJ3JlZmVyZW5jZScsIGllLAoJICAgICAgaW4gYm90aCBjYXNlcwoKCSAgICAgICAgdHlwZWRlZiAgaW50ICgqZnB0cikoaW50IGEpOwoJICAgICAgICB0eXBlZGVmICBpbnQgKGZ1bmMpKGludCBhKTsKCgkgICAgICBUaGlzIHdhcyBuZWVkZWQgc2luY2UgaXQgc2VlbXMgdG8gYmUgJ2lsbGVnYWwnIGluIEMrKyB0bwoJICAgICAgZG8gc29tZXRoaW5nIGxpa2U6CgoJICAgICAgICAgdm9pZCAqcHRyID0gc3RhdGljX2Nhc3Q8dm9pZCAqPihmcHRyKTsKCgkgICAgICBhbmQgcHJvYmFibHksIGFzIGZvciBtZW1iZXIgZnVuY3Rpb25zLCBpdCBpcyBub3QKCSAgICAgIHdhcnJhbnRpZWQgdGhhdCB0aGUgcG9pbnRlciBzaXplcyB3aWxsIG1hdGNoLgoKCSAgICAtIEFkZCB0aGUgI2Vycm9yLyN3YXJuaW5nIGRpcmVjdGl2ZXMgdG8gc3dpZydzIGNwcC4KCgkgICAgLSBBZGQgdGhlIG5vYmxvY2sgb3B0aW9uIGZvciB0eXBlbWFwcywgd2hpY2ggaXMgdXNlZCBhcwogICAgICAgICAgICAgIGZvbGxvd3M6IHN1cHBvc2VkIHlvdSBhIHR5cGVtYXAsIGxpa2UgdGhpcwoKCSAgICAgIAoJICAgICAgJXR5cGVtYXAoaW4sbm9ibG9jaz0xKSBIZWxsbyB7CQkJICAgCgkgICAgICAgICAuLi4uCiAgICAgICAgICAgICAgfQoKCSAgICAgIHRoZW4gdGhlIHR5cGVtYXAgd2lsbCBiZSBpbnNlcnRlZCB3aXRob3V0IHRoZSBibG9jawoJICAgICAgaW1wb3NlZCBieSB0aGUgYnJhY2tldHMsIHNpbWlsYXIgdG8KCgkgICAgICAgJXR5cGVtYXAoaW4pIEhlbGxvICIuLi4iOwoKCSAgICAgIFNvLCB3aHkgeW91IGRvbid0IGp1c3QgdXNlIHRoZSBxdW90ZSBzdHlsZT8sIGJlY2F1c2U6CgkgICAgICAKCSAgICAgICAgIDEuLSBUaGUgcXVvdGUgc3R5bGUgZG9lc24ndCBnZXQgcHJlcHJvY2Vzc2VkLCBmb3IgZXhhbXBsZQoJICAgICAgCgkgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBIZWxsbyAiJDE9IFNXSUdfbWFjcm8oJDEpOyI7CgkgICAgICAKCSAgICAgICAgICAgICBoZXJlLCBTV0lHX21hY3JvIGRvZXNuJ3QgZ2V0IGV4cGFuZGVkCgogICAgICAgICAgICAgICAgIDIuLSBJbnNpZGUgYSBxdW90ZSB0eXBlbWFwLCB5b3UgaGF2ZSB0byB1c2UgCiAgICAgICAgICAgICAgICAgICAgIHF1b3RlcyBjYXJlZnVsbHkKCgkJICAgICAgJXR5cGVtYXAoaW4pIEhlbGxvICIkMSA9IFwiaGVsbG9cIiAiOwoKCQkgMy4tIFlvdSBjYW4ndCBtYWtlIGVtYWNzIGFuZC9vciBvdGhlciBlZGl0b3JzCgkJICAgICB0byBpbmRlbnQgaW5zaWRlIGEgc3RyaW5nIS4gCgoKCSAgICAgIFNvLCB3aHkgZG8geW91IHdhbnQgdG8gcmVtb3ZlIHRoZSBibG9jaz8sIGJlY2F1c2UgYW4gZXh0cmEKCSAgICAgIGJsb2NrIHdoZW4gbm90IG5lZWRlZCAobm8gbG9jYWwgdmFyaWFibGVzIGluIGl0KToKCgkgICAgICAgICAgMS4tIG1ha2VzIHRoZSBjb2RlIGhhcmRlciB0byByZWFkCiAgICAgICAgICAgICAgICAgIDIuLSBtYWtlcyB0aGUgY29kZSBsYXJnZXIKICAgICAgICAgICAgICAgICAgMy4tIG9yIGluIHNob3J0LCBmb3IgdGhlIHNhbWUgcmVhc29uIHdlIGhhdmUgdGhlIHF1b3RlIHN0eWxlLgoKVmVyc2lvbiAxLjMuMjYgKE9jdG9iZXIgOSwgMjAwNSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEwLzA4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQaHBdIEFkZGVkICd0aHJvd3MnIHR5cGVtYXBzLgoKMTAvMDgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4ZXMgZm9yIGxhbmd1YWdlcyB0aGF0IGRvbid0IHN1cHBvcnQgbXVsdGlwbGUgaW5oZXJpdGFuY2UuIFRoZQogICAgICAgICAgICBmaXJzdCBub24taWdub3JlZCBjbGFzcyBpbiB0aGUgcHVibGljIGJhc2UgY2xhc3MgbGlzdCBpcyB1c2VkIGZvciBpbmhlcml0YW5jZS4KICAgICAgICAgICAgYnkgdGhlIHByb3h5IGNsYXNzLiBQcmV2aW91c2x5LCBpZiB0aGUgZmlyc3QgY2xhc3MgaW4gdGhlIGxpc3Qgd2FzIGlnbm9yZWQsIHRoZW4KICAgICAgICAgICAgdGhlIHByb3h5IGNsYXNzIHdvdWxkbid0IGhhdmUgYW55IGJhc2UgY2xhc3Nlcy4KCjEwLzA3LzIwMDU6IG1tYXR1cwoJICAgICBVcGRhdGUgbW9yZSBmZWF0dXJlcyB0byBmb2xsb3cgbmV3IGNvbnZlbnRpb24sIGluY2x1ZGluZzoKCgkgICAgICAgY2FsbGJhY2sKCSAgICAgICByZWYvdW5yZWYKCSAgICAgICBleGNlcHQKCSAgICAKCSAgICAgQWxsIG9mIHRoZW0gdXNlIG5vdCBvbmx5IHRoZSBmZWF0dXJlIGFzIGEgZmxhZywgYnV0IGFsc28KCSAgICAgYXMgY29kZSB2YWx1ZS4gVG8gZGVhbCB3aXRoIHRob3NlIGZlYXR1cmVzLCB3ZSB1c2Ugbm93CgkgICAgIEdldEZsYWdBdHRyLCB3aGljaCBpcyBzaW1pbGFyIHRvIEdldEZsYWcsIGJ1dCBpbnN0ZWFkIG9yCgkgICAgIHJldHVybmluZyAxIG9yIDAsIGl0IHJldHVybnMgdGhlIGF0dHIgdmFsdWUsIGlmIGhhcHBlbnMKCSAgICAgdG8gYmUgZGlmZmVyZW50IG9mICIwIiBvZiBjb3Vyc2UuCgoJICAgICBOb3cgdGhlcmUgYXJlIGFsc28gbW9yZSB1bmlmb3JtIGRpcmVjdGl2ZSBuYW1lcyBmb3IgdGhlIAoJICAgICBvbmVzIGJhc2VkIGluIGZlYXR1cmVzLCBmb3IgZXhhbXBsZSwgZm9yIHRoZSBvbGQKCSAgICAgJW5ld29iamVjdCBkaXJlY3RpdmUgbm93IHdlIGhhdmUgdHJlZSBkaXJlY3RpdmVzIGRlZmluZWQ6CgkgICAgIAoKCSAgICAgI2RlZmluZSAlbmV3b2JqZWN0ICAgICAgICAlZmVhdHVyZSgibmV3IikKCSAgICAgI2RlZmluZSAlbm9uZXdvYmplY3QgICAgICAlZmVhdHVyZSgibmV3IiwiMCIpCgkgICAgICNkZWZpbmUgJWNsZWFybmV3b2JqZWN0ICAgJWZlYXR1cmUoIm5ldyIsIiIpCgoJICAgICBhbmQgc28gb24gZm9yIGFsbCB0aGUgb3RoZXIgZmVhdHVyZSBkaXJlY3RpdmVzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgowOS8zMC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBTdWJ0bGUgY2hhbmdlIHRvIHNvbWUgZmVhdHVyZXMuIFByZXZpb3VzbHkgaXQgd2FzIG5vdCBwb3NzaWJsZSB0byBkaXNhYmxlIG1hbnkKICAgICAgICAgICAgZmVhdHVyZXMgb25jZSB0aGV5IGhhZCBiZWVuIGVuYWJsZWQuIFRoaXMgd2FzIGZvciBtb3N0IGZlYXR1cmVzIHRoYXQgYmVoYXZlIGFzCiAgICAgICAgICAgIGZsYWdzLiBUaGVzZSBmZWF0dXJlcyBub3cgd29yayBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgibmFtZSIpICAgICAgICAgICAgICAvLyBlbmFibGVzIHRoZSBmZWF0dXJlCiAgICAgICAgICAgICAgJWZlYXR1cmUoIm5hbWUiLCAiMSIpICAgICAgICAgLy8gZW5hYmxlcyB0aGUgZmVhdHVyZQogICAgICAgICAgICAgICVmZWF0dXJlKCJuYW1lIiwgIjAiKSAgICAgICAgIC8vIGRpc2FibGVzIHRoZSBmZWF0dXJlCiAgICAgICAgICAgICAgJWZlYXR1cmUoIm5hbWUiLCAiIikgICAgICAgICAgLy8gY2xlYXJzIHRoZSBmZWF0dXJlCgogICAgICAgICAgICBJbiBmYWN0IGFueSBub24tZW1wdHkgdmFsdWUgb3RoZXIgdGhhbiAiMCIgd2lsbCBlbmFibGUgdGhlIGZlYXR1cmUgKGxpa2UgQyBib29sZWFuIGxvZ2ljKS4KICAgICAgICAgICAgUHJldmlvdXNseSAiMSIsICIwIiBvciBhbnkgb3RoZXIgbm9uLWVtcHR5IHZhbHVlIHdvdWxkIGVuYWJsZSB0aGUgZmVhdHVyZSBhbmQgaXQgd291bGQKICAgICAgICAgICAgb25seSBiZSBwb3NzaWJsZSB0byBkaXNhYmxlIHRoZSBmZWF0dXJlIGJ5IGNsZWFyaW5nIGl0IChhc3N1bWluZyB0aGVyZSB3YXMgbm8gZ2xvYmFsIGVuYWJsZSkuCgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBhZmZlY3RlZDoKCiAgICAgICAgICAgICAgYWxsb3dleGNlcHQKICAgICAgICAgICAgICBjb21wYWN0ZGVmYXVsdGFyZ3MKICAgICAgICAgICAgICBjbGFzc2ljICAgICAgICAgICAgICAgIChQeXRob24pCiAgICAgICAgICAgICAgY3M6Y29uc3QgICAgICAgICAgICAgICAoQyMpCiAgICAgICAgICAgICAgZGlyZWN0b3IKICAgICAgICAgICAgICBleGNlcHRpb25jbGFzcyAgICAgICAgIChQeXRob24pCiAgICAgICAgICAgICAgaWdub3JlCiAgICAgICAgICAgICAgaW1tdXRhYmxlCiAgICAgICAgICAgICAgamF2YTpjb25zdCAgICAgICAgICAgICAoSmF2YSkKICAgICAgICAgICAgICBqYXZhOmRvd25jYXN0ICAgICAgICAgIChKYXZhKQogICAgICAgICAgICAgIGt3YXJncwogICAgICAgICAgICAgIG1vZGVybiAgICAgICAgICAgICAgICAgKFB5dGhvbikKICAgICAgICAgICAgICBuZXcKICAgICAgICAgICAgICBub2F1dG9kb2MgICAgICAgICAgICAgIChQeXRob24pCiAgICAgICAgICAgICAgbm9kZWZhdWx0CiAgICAgICAgICAgICAgbm9kaXJlY3RvcgogICAgICAgICAgICAgIG5vcmVmCiAgICAgICAgICAgICAgbm90YWJzdHJhY3QKICAgICAgICAgICAgICBub3VucmVmCiAgICAgICAgICAgICAgbm92YWx1ZXdyYXBwZXIKICAgICAgICAgICAgICBweXRob246bWF5YmVjYWxsICAgICAgIChQeXRob24pCiAgICAgICAgICAgICAgcHl0aG9uOm5vbmR5bmFtaWMgICAgICAoUHl0aG9uKQogICAgICAgICAgICAgIG1vZHVsYTM6bXVsdGlyZXR2YWwgICAgKE1vZHVsYTMpCiAgICAgICAgICAgICAgcHJlZGljYXRlICAgICAgICAgICAgICAoUnVieSkKICAgICAgICAgICAgICB0cmFja29iamVjdHMgICAgICAgICAgIChSdWJ5KQogICAgICAgICAgICAgIHZhbHVld3JhcHBlcgoKICAgICAgICAgICAgSXQgaXMgbm93IHBvc3NpYmxlLCBmb3IgZXhhbXBsZSB0byBpZ25vcmUgYWxsIG1ldGhvZHMvY2xhc3NlcyBpbiBhIGhlYWRlciBmaWxlLCBleGNlcHQgZm9yIGEKICAgICAgICAgICAgZmV3IHRhcmdldHRlZCBtZXRob2RzLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWZlYXR1cmUoImlnbm9yZSIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGFsbCBtZXRob2RzL2NsYXNzZXMKICAgICAgICAgICAgICAlZmVhdHVyZSgiaWdub3JlIiwiMCIpIHNvbWVfZnVuY3Rpb24oaW50LCBkb3VibGUpOyAvLyBkbyBub3QgaWdub3JlIHRoaXMgZnVuY3Rpb24KICAgICAgICAgICAgICAlZmVhdHVyZSgiaWdub3JlIiwiMCIpIFNvbWVDbGFzczsgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgaWdub3JlIHRoaXMgQ2xhc3MKICAgICAgICAgICAgICAlZmVhdHVyZSgiaWdub3JlIiwiMCIpIFNvbWVDbGFzczo6bWV0aG9kOyAgICAgICAgICAvLyBkbyBub3QgaWdub3JlIHRoaXMgbWV0aG9kCiAgICAgICAgICAgICAgJWluY2x1ZGUgImJpZ2hlYWRlci5oIgoKICAgICAgICAgICAgUmVtb3ZlZCAlcHl0aG9uZHluYW1pYyAtIGl0IG5ldmVyIHdvcmtlZCBwcm9wZXJseS4gVXNlICVweXRob25ub25keW5hbWljIGluc3RlYWQuCiAgICAgICAgICAgIFJlbW92ZWQgJWZlYXR1cmUoIm5va3dhcmdzIikgLSBpdCB3YXNuJ3QgZnVsbHkgaW1wbGVtZW50ZWQgIC0gdXNlICVmZWF0dXJlKCJrd2FyZ3MiLCIwIikgaW5zdGVhZC4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMDkvMjUvMjAwNTogbWtvZXBwZQoJICAgIFtHdWlsZV0gQWRkICJ0aHJvd3MiIHR5cGVtYXBzLgoKMDkvMjQvMjAwNTogY2Zpc2F2YWdlCiAgICAgICAgICAgIFtSdWJ5XSBBZGRzIG5ldyAldHJhY2tvYmplY3RzIGZ1bmN0aW9uYWxpdHkgdGhhdCBtYXBzIEMrKyBvYmplY3RzIHRvCiAgICAgICAgICAgIFJ1Ynkgb2JqZWN0cy4gIFRoaXMgZnVuY3Rpb25hbGl0eSBtYWtlcyBpdCBtdWNoIGVhc2llciB0byBpbXBsZW1lbnQKICAgICAgICAgICAgbWFyayBmdW5jdGlvbnMgZm9yIHRoZSBnYXJiYWdlIGNvbGxlY3Rvci4gIEZvciBtb3JlIGluZm9ybWF0aW9uCiAgICAgICAgICAgIHJlZmVyIHRvIHRoZSB1cGRhdGUgZG9jdW1lbnRhdGlvbiBhbmQgZXhhbXBsZXMuCiAgICAgICAgICAgIAowOS8yMC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gUGF0Y2ggMTExNjQzMSBmcm9tIEpvc2ggQ2hlcnJ5LiBGaXhlcyBub24gbWVtYmVyIGZ1bmN0aW9ucyBpbmFkdmVydGVudGx5CiAgICAgICAgICAgIGJlaW5nIGNhbGxlZCBpbnN0ZWFkIG9mIG1lbWJlciBmdW5jdGlvbnMuCgowOS8yMC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBQYXRjaCBmcm9tIE1hcmsgR29zc2FnZSB0byBhZGQgc3VwcG9ydCBmb3IgTHVhLTUuMSwgc3RkOjpzdHJpbmcsCiAgICAgICAgICAgIHN0ZDo6dmVjdG9yLCBzdGQ6OmV4Y2VwdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KCjA5LzE0LzIwMDU6IG1tYXR1cwoJICAgIFtQeXRob25dIEFkZCAtbm9jcHBjYXN0LiBOb3cgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8KCSAgICBhbHdheXMgdXNlIHRoZSBjcHBjYXN0IG9wZXJhdG9ycy4gQmVmb3JlIHRoYXQgd2FzIHRoZSBjYXNlCgkgICAgb25seSB3aGVuIHlvdSB1c2VkIHRoZSAtY3BwY2FzdCBvcHRpb24uCgogICAgICAgICAgICBJZiB0aGlzIHNlZW1zIHRvIGJyZWFrIHlvdXIgY29kZS4uLiB5b3VyIHdlbGNvbWUhLCBpdAoJICAgIG1lYW5zIGl0IHdhcyBicm9rZW4gYmVmb3JlLCBhbmQgeW91IG5ldmVyIG5vdGljZS4gCgoJICAgIElmIHlvdSB0aGluZyB0aGUgZXJyb3IgaXMgZHVlIHRvIG9uZSBvZiB0aGUgU1dJRyB0eXBlbWFwcywKCSAgICBzZW5kIHVzIGFuIGV4YW1wbGUuCgoJICAgIFVzZSAtbm9jcHBjYXN0IG9ubHkgd2l0aCB2ZXJ5IG9sZCBDKysgY29tcGlsZXJzIHRoYXQKCSAgICBkbyBub3Qgc3VwcG9ydCB0aGUgY3BwY2FzdCBvcGVyYXRpb25zLiAKCgkgICAgU28sIGhlcmUgYXBwbGllczoKCgkJVGhpcyBjaGFuZ2UgZG9lc24ndCBicmVhayBjb21wYXRpYmlsaXR5LCBpdCB3YXMgYnJva2VuIGJlZm9yZS4KCjA5LzEzLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIGRpcmVjdG9yIG1ldGhvZHMgd2hlbiBhIGNsYXNzIGlzIHBhc3NlZCBieSB2YWx1ZSBhcyBhCiAgICAgICAgICAgIHBhcmFtZXRlci4KCjA5LzExLzIwMDU6IG1tYXR1cwogICAgICAgICAgICBBZGRpbmcgdGhlIG1vZHVsZSBvcHRpb24gdG8gdGhlICVpbXBvcnQgZGlyZWN0aXZlLiBOb3cgeW91CiAgICAgICAgICAgIGNhbiB1c2UgaXQgYXMKCgkgICAgICAgICVpbXBvcnQobW9kdWxlPSJCaWdNb2R1bGUiKSBmb28uaQoKCSAgICB3aGVyZSBzdWJmaWxlIGNvdWxkIChvciBub3QpIGRlZmluZSB0aGUgbW9kdWxlIG5hbWUgdmlhCgkgICAgdGhlICVtb2R1bGUgZGlyZWN0aXZlLiBUaGUgbW9kdWxlIG9wdGlvbiB0YWtlIHByZWNlZGVuY2UKCSAgICBhbmQgaXQgaGFzIHRoZSBzYW1lIGVmZmVjdHMgdGhhbiBoYXZpbmcgdGhlIGRpcmVjdGl2ZSAKCgkgICAgICAgICVtb2R1bGUgQmlnTW9kdWxlICAKCgkgICAgaW5zaWRlIHRoZSBpbXBvcnRlZCBmaWxlIGZvby5pLgoKCSAgICBZb3UgY2FuIHVzZSB0aGUgb3B0aW9uIGluIG1haW5seSB0d28gY2FzZXM6CgoJICAgIDEuLSBZb3UgdXNlZCB0aGUgLW1vZHVsZSBvcHRpb24gd2hlbiB5b3UgZ2VuZXJhdGVkIHRoZQogICAgICAgICAgICAgICAgbW9kdWxlIHRvIGJlIGltcG9ydGVkLCBhbmQgaGVuY2UgdGhlIG1vZHVsZSBuYW1lIGluCiAgICAgICAgICAgICAgICB0aGUgaW1wb3J0ZWQgJW1vZHVsZSBkaXJlY3RpdmUgaXMgbm90IHJlYWxseSB1c2VmdWwuCgoJICAgIDIuLSBUaGUgbW9kdWxlIHlvdSB3YW50IHRvIGltcG9ydCBpcyB2ZXJ5IGxhcmdlLCBhbmQgaXQKICAgICAgICAgICAgICAgIGhhcyBzZXZlcmFsIC5pLy5oIGZpbGVzLiBUaGVuLCBpZiB5b3UganVzdCBvbmUgdG8KICAgICAgICAgICAgICAgIGltcG9ydCBhIGNsYXNzIG9yIHNvIGZyb20gdGhlIG1vZHVsZSwgc2F5cyAnZm9vJywgYW5kCiAgICAgICAgICAgICAgICBub3QgdGhlIGVudGlyZSBtb2R1bGUgdmlhIGltcG9ydGluZyB0aGUgbWFpbgogICAgICAgICAgICAgICAgQmlnTW9kdWxlLmkgZmlsZSwgdGhlbiB5b3UganVzdCBkbzoKCiAJCSAgICAlaW1wb3J0KG1vZHVsZT0iQmlnTW9kdWxlIikgZm9vLmgKCiAgIAkgICAgICAgIG9yCgkJCiAJCSAgICAlaW1wb3J0KG1vZHVsZT0iQmlnTW9kdWxlIikgZm9vLmkKCgkJd2hlcmUgZm9vLmkgY29udGFpbnMgdGhlICdmb28nIGRlY2xhcmF0aW9uIGFuZCBtYXliZSBhCgkJY291cGxlIG9mIGV4dHJhICVpbmNsdWRlIGRpcmVjdGl2ZXMsIGFzIG5lZWRlZC4KCgkgICAgCjA5LzExLzIwMDU6IG1tYXR1cwoJICAgIEZpeCBidWcgIzEyODI2MzcsIGFib3V0IHRoZSAtbW9kdWxlIG9wdGlvbiBub3QgaGF2aW5nIGVmZmVjdAoJICAgIGluIHBsYWNlcyB3aGVyZSBpdCB3YXMgbmVlZGVkLgoKMDkvMTEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgV2hlbiB3cmFwcGluZyB2YXJpYWJsZXMsIGVuc3VyZSB0aGF0IG5vbmUgb2YgdGhlIHR5cGVtYXBzIHVzZWQgZm9yIHRoZQogICAgICAgICAgICBzZXQgd3JhcHBlcnMgYXJlIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHRoZSBnZXQgd3JhcHBlcnMuIEkgZG91YnQgdGhpcyB3YXMgYQogICAgICAgICAgICBwcm9ibGVtIGZvciBhbnkgbGFuZ3VhZ2VzIGV4Y2VwdCBmb3IgdGhlIHJlY2VudGx5IGludHJvZHVjZWQgbnVsbCBhdHRyaWJ1dGUKICAgICAgICAgICAgaW4gdGhlIG91dCB0eXBlbWFwIChDIyBvbmx5KS4KCjA5LzA4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIE1vcmUgZGVzY3JpcHRpdmUgZXJyb3IgbWVzc2FnZXMgd2hlbiBmaWxlcyBmYWlsIHRvIG9wZW4uCgowOS8wNi8yMDA1OiBtbWF0dXMgCgoJICAgIEFsbG93IGEgJWRlZmluZSBhIG1hY3JvIGluc2lkZSBhbm90aGVyICVkZWZpbmUgbWFjcm8sIGZvciBleGFtcGxlCgoJICAgICAgJWRlZmluZSBoZWxsbyhuYW1lLCBUeXBlKQoJICAgICAgJWRlZmluZSBuYW1lICMjIGEoVHlwZSkKCSAgICAgICV0eXBlbWFwKGluKSBUeXBlICJoZWxsbzsiOwoJICAgICAgJWVuZGRlZgoJICAgICAgJWVuZGRlZgoJICAgICAgCgkgICAgVG8gbGVhcm4gaG93IHRvIHVzZSB0aGlzIG5ldyBmZWF0dXJlcyBpbiB5b3VyIG93biB0eXBlbWFwcyBsaWJyYXJ5LCBzZWUKCSAgICBweXRob24vY3N0cmluZy5pLCBweXRob24vY3dzdHJpbmcuaSBhbmQgcHl0aG9uL2N3c3RyYmFzZS5pLgkgICAgCgogICAgICAgICAgICBbUHl0aG9uXSBOb3JtYWxpemUgdGhlIGNzdHJpbmcuaSBpbXBsZW1lbnRhdGlvbiB0byB1c2UgZnJhZ21lbnRzLCBhbmQgYWRkCiAgICAgICAgICAgIGN3c3RyaW5nLmksIHdoaWNoIGltcGxlbWVudHMgdGhlIHNhbWUgdHlwZW1hcHMgYnV0IGZvciB3Y2hhcl90IHN0cmluZ3MuCgoJICAgIFtQeXRob25dIEJ1ZyBmaXhlZDogMTI0NzQ3NywgMTI0NTU5MSwgMTI0OTg3OCBhbmQgb3RoZXJzLgoKMDgvMTgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEltcGxlbWVudCBzdXBwb3J0IGZvciBTV0lHVFlQRSogRElTT1dOIHR5cGVtYXAgKGxpa2UgaW4gUHl0aG9uKSBmb3IKICAgICAgICAgICAgYmV0dGVyIGNvbnRyb2wgb2YgbWVtb3J5IG1hbmFnZW1lbnQsIGVnIHdoZW4gYWRkaW5nIGFuIG9iamVjdCBjcmVhdGVkIGluIFJ1YnkKICAgICAgICAgICAgdG8gYSBDKysgY29udGFpbmVyLiBQYXRjaCAjMTI2MTY5MiBmcm9tIENoYXJsaWUgU2F2YWdlLgoKMDgvMTgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1RjbF0gNjQgYml0IHBsYXRmb3JtIGZpeGVzIGZvciB0aGUgdmFyYXJncyBoYW5kbGluZyBpbiBTV0lHX0dldEFyZ3MuIFRoaXMgaXMgYW4KICAgICAgICAgICAgaW1wcm92ZWQgZml4IGZvciBidWcgIzEwMTE2MDQgYXMgc3VnZ2VzdGVkIGJ5IEplcmVteSBMaW4uCgowOC8xOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbVGNsXSBCdWcgIzEyNDA0NjkgLSAlbmV3b2JqZWN0IHN1cHBvcnQgZm9yIFRjbC4gUGF0Y2ggZnJvbSBCb2IgTWFyaW5pZXIuCgowOC8xNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gQnVnICMxMjU0NDk0IC0gRml4IGZvciBnbG9iYWwgbmFtZXNwYWNlIHBvbGx1dGlvbiBieSBwZXJsIGhlYWRlciBmaWxlcwogICAgICAgICAgICAoYm9vbCBkZWZpbmUpIHByZXZlbnRlZCBTVEwgaGVhZGVycyBmcm9tIGJlaW5nIHVzZWQgb24gc29tZSBzeXN0ZW1zLCBlZwogICAgICAgICAgICBXaW5kb3dzIHdpdGggVmlzdWFsIFN0dWRpby4KCjA4LzE2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBCdWcgIzEyNDA5MzcgLSBSZWRlZmluaXRpb24gb2YgX19pbnQ2NCB0eXBlZGVmIGZvciBJbnRlbCBjb21waWxlcnMuCgowOC8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbWG1sXSBCdWcgIzEyNTE4MzIgLSAgQysrIHRlbXBsYXRlIG1heSBnZW5lcmF0ZSBpbnZhbGlkIFhNTCBmaWxlCgowOC8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBTdXBwb3J0IGFkZGVkIGZvciBMdWEuIFBhdGNoICMxMjQyNzcyIGZyb20gTWFyayBHb3NzYWdlLgogICAgICAgICAgICBJdCBzdXBwb3J0cyBtb3N0IEMvQysrIGZlYXR1cmVzIChmdW5jdGlvbnMsIHN0cnVjdCwgY2xhc3NlcywgYXJyYXlzLCBwb2ludGVycywKICAgICAgICAgICAgZXhjZXB0aW9ucyksIGFzIHdlbGwgYXMgbG90cyBvZiBkb2N1bWVudGF0aW9uIGFuZCBhIGZldyB0ZXN0IGNhc2VzICYgZXhhbXBsZXMuCgowOC8xNC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbWG1sXSBGaXggaW5jb3JyZWN0IHhtbCBlc2NhcGluZyBpbiBiYXNlIGNsYXNzIG5hbWUgd2hlbiBiYXNlIGNsYXNzIGlzIGEgdGVtcGxhdGUuCgowOC8xMy8yMDA1OiBlZnV6enlvbmUKCSAgICBbQ0xJU1BdIEFkZGVkIHN1cHBvcnQgZm9yIGhhbmRsaW5nIGVudW1zLiBEb2VzIG5vdCBhZGRzIHRoZSByZXR1cm4gdHlwZSBkZWNsYXJhdGlvbgoJICAgIHRvIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uLCBpZiBhIGZ1bmN0aW9uIHJldHVybnMgdm9pZC4KCjA4LzA5LzIwMDU6IG1rb2VwcGUKCSAgICBOZXcgbGFuZ3VhZ2UgbW9kdWxlLCBDb21tb24gTGlzcCB3aXRoIFVGRkksIGZyb20gVXR6LVV3ZSBIYXVzLgoKMDgvMDkvMjAwNTogbWtvZXBwZQoJICAgIEZpeCB0aGUgTGlzcCBzLWV4cHJlc3Npb24gb3V0cHV0IG1vZHVsZTsgaXQgbm8gbG9uZ2VyIGNvbXBsYWlucyBhYm91dCAidW5rbm93biB0YXJnZXRzIi4KCjA3LzI3LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIE1vZGlmaWNhdGlvbnMgdG8gU1RMIHdyYXBwZXJzIHNvIHRoYXQgaXQgaXMgcG9zc2libGUgZm9yIGEgdXNlcidzICVleGNlcHRpb24gZGlyZWN0aXZlCiAgICAgICAgICAgIHRvIGJlIGFwcGxpZWQgdG8gdGhlIFNUTCB3cmFwcGVyIG1ldGhvZHMuIFByZXZpb3VzbHkgdGhlIGZvbGxvd2luZyBnbG9iYWwgJWV4Y2VwdGlvbgogICAgICAgICAgICBkaXJlY3RpdmUgd291bGQgbm90IGJlIHVzZWQgb24gdGhlIHdyYXBwZXIgbWV0aG9kczoKCiAgICAgICAgICAgICAgICAlZXhjZXB0aW9uIHsgCiAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgJGFjdGlvbgogICAgICAgICAgICAgICAgICB9IGNhdGNoICguLi4pIHsKICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgdW5jYXVnaHQgZXhjZXB0aW9ucwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGlzIGhhcyBiZWVuIGltcGxlbWVudGVkIGJ5IHJlcGxhY2luZyAlZXhjZXB0aW9uIGRpcmVjdGl2ZXMgZm9yIHNwZWNpZmljIFNUTCB3cmFwcGVyCiAgICAgICAgICAgIG1ldGhvZHMgd2l0aCBhbiBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiBkZWNsYXJlZCBvbiB0aGUgd3JhcHBlciBtZXRob2RzLiB0aHJvd3MgdHlwZW1hcHMKICAgICAgICAgICAgYXJlIG5vdyBzdXBwbGllZCBmb3IgaGFuZGxpbmcgdGhlIFNUTCBleGNlcHRpb24gc3BlY2lmaWNhdGlvbi4gVGhlc2UgY2FuIGFsc28gYmUgZWFzaWx5CiAgICAgICAgICAgIG92ZXJyaWRkZW4sIGZvciBleGFtcGxlIHRoZSBzdGQ6Om91dF9vZl9yYW5nZSBleGNlcHRpb24sIHdoaWNoIGlzIHVzZWQgYSBsb3QgaW4gdGhlIFNUTAogICAgICAgICAgICB3cmFwcGVycywgY2FuIGJlIGN1c3RvbWlzZWQgZWFzaWx5OgoKICAgICAgICAgICAgICAlaW5jbHVkZSAic3RkX3ZlY3Rvci5pIgogICAgICAgICAgICAgICV0eXBlbWFwKHRocm93cykgc3RkOjpvdXRfb2ZfcmFuZ2UgewogICAgICAgICAgICAgICAgLy8gY3VzdG9tIGV4Y2VwdGlvbiBoYW5kbGVyCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICV0ZW1wbGF0ZShWZWN0SW50KSBzdGQ6OnZlY3RvcjxpbnQ+OwoKMDcvMjIvMjAwNTogZWZ1enp5b25lCiAgICAgICAgICAgIFtDTElTUF0gVGhlIGNsaXNwIG1vZHVsZSBmb3IgU1dJRzoKICAgICAgICAgICAgICAtIEl0IGNhbiBvbmx5IGhhbmRsZSBDLCBjbGlzcCBjdXJyZW50bHkgZG9lcyBub3Qgc3VwcG9ydHMgZmZpIGJpbmRpbmdzIHRvIEMrKy4KICAgICAgICAgICAgICAtIEl0IGhhcyB0d28gb3B0aW9ucywgKGEpIC1leHRlcm4tYWxsIHRoaXMgd2lsbCBnZW5lcmF0ZSB3cmFwcGVycyBmb3IgYWxsIGZ1bmN0aW9ucwogICAgICAgIAlhbmQgdmFyaWFibGVzdGlvbnMsIChiKSAtZ2VuZXJhdGUtdHlwZWRlZiB0aGlzIHdpbGwgZ2VuZXJhdGUgd3JhcHBlcnMgImRlZi1jLXR5cGUiCgkgICAgICAgIHdyYXBwZXJzIGZvciB0eXBlZGVmcwoJICAgICAgLSBDYW4gaGFuZGxlIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucywgY29tcGxleCB0eXBlcyBzdWNoIGFzIG4tZGltZW5zaW9uYWwgYXJyYXlzIG9mIAoJIAlwb2ludGVycyBvZiBkZXB0aCBkCgkgICAgICAtIEdlbmVyYXRlcyB3cmFwcGVycyBmb3IgY29uc3RhbnRzIGFzIHdlbGwgYXMgdmFyaWFibGVzCgkgICAgICAtIENvcnJlY3RseSBkaXN0aW5ndWlzaGVzIGJldHdlZW4gdGhlIGRlY2xhcmF0aW9uIG9mIHZhcmlhYmxlcyBpbiBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbnMKCSAgICAgIC0gQ3JlYXRlcyBhIGRlZnBhY2thZ2UgImRlY2xhcmF0aW9uIiB3aXRoIHRoZSBtb2R1bGUgbmFtZSBhcyB0aGUgcGFja2FnZSBuYW1lLCB0aGUgY3JlYXRlZCAKCSAgICAJcGFja2FnZSBleHBvcnRzIGJvdGggZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMKCSAgICAgIC0gdHJpZXMgdG8gZ3Vlc3Mgd2hlbiBzaG91bGQgYSBwb2ludGVyIHZhcmlhYmxlIGJlIGRlY2xhcmVkIGFzIGMtcHRyIG9yIGMtcG9pbnRlcgoKMDcvMjIvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBDaGFuZ2VzIHRvIHN1cHBvcnQgQyMgc3RydWN0cyByZXR1cm5lZCBieSB2YWx1ZS4gVGhlIGNoYW5nZXMgcmVxdWlyZWQgYXJlOgogICAgICAgICAgICAgIC0gVXNpbmcgYW4gb3B0aW9uYWwgJ251bGwnIGF0dHJpYnV0ZSBpbiB0aGUgb3V0IHR5cGVtYXAuIElmIHRoaXMgYXR0cmlidXRlIGlzIHNwZWNpZmllZCwKICAgICAgICAgICAgICAgIHRoZW4gaXQgaXMgdXNlZCBmb3IgdGhlICRudWxsIHNwZWNpYWwgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgogICAgICAgICAgICAgIC0gVGhlIGN0eXBlIHVzZWQgaW4gdGhlIEMvQysrIHdyYXBwZXJzIGlzIG5vIGxvbmdlciBpbml0aWFsaXNlZCB0byAwIG9uIGRlY2xhcmF0aW9uLgogICAgICAgICAgICBCb3RoIG9mIHRoZXNlIGNoYW5nZXMgZml4IHRoZSBzaXR1YXRpb25zIHdoZXJlIGFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gYXNzaWduIDAgdG8gdGhlCiAgICAgICAgICAgIHJldHVybmVkIHN0cnVjdC4gTWFyc2hhbGxpbmcgc3RydWN0cyBhcyB2YWx1ZSB0eXBlcyBzdGlsbCByZXF1aXJlcyB1c2VyIGRlZmluZWQgdHlwZW1hcHMuCiAgICAgICAgICAgIFNlZSBkb2N1bWVudGF0aW9uIGZvciBhbiBleGFtcGxlLgoKMDcvMjIvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBGaXggU1dJR19leGNlcHRpb24gdXNhZ2UgdG8gd29yayB3aXRoIGNvbXBpbGVycyB0aGF0IGRvbid0IHN1cHBvcnQgZW1wdHkgbWFjcm8KICAgICAgICAgICAgYXJndW1lbnRzLiBVbmZvcnR1bmF0ZWx5IHRoaXMgZml4IHdpbGwgc3RvcCB1c2FnZSBvZiBTV0lHX2V4Y2VwdGlvbiBiZWluZyB1c2VkIHdpdGhpbiB0eXBlbWFwcwogICAgICAgICAgICB0aGF0IHVzZSAiIiBvciAleyAlfSBkZWxpbWl0ZXJzLCBidXQgY29udGludWVzIHRvIHdvcmsgd2l0aCB0eXBlbWFwcyB1c2luZyB7fSBkZWxpbWl0ZXJzLgogICAgICAgICAgICBQbGVhc2UgdXNlIHRoZSBTV0lHX0NTaGFycFNldFBlbmRpbmdFeGNlcHRpb25Bcmd1bWVudCBvciBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbiBtZXRob2RzIGluc3RlYWQKICAgICAgICAgICAgYXMgU1dJR19leGNlcHRpb24gaXMgcmVhbGx5IGludGVuZGVkIGFzIGEgcGxhdGZvcm0gaW5kZXBlbmRlbnQgbWFjcm8gZm9yIHRoZSBTV0lHIGxpYnJhcnkgd3JpdGVycy4KCjA3LzE2LzIwMDU6IG1rb2VwcGUKCSAgICBbQWxsZWdybyBDTF0gVXNlIHNwZWNpZmljIGZvcmVpZ24gdHlwZXMgcmF0aGVyIHRoYW4gKCogOnZvaWQpLiAKCSAgICBVc2UgKnN3aWctaWRlbnRpZmllci1jb252ZXJ0ZXIqLgoKMDYvMjcvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRnVuY3Rpb25zIGRlY2xhcmVkIGFzICdleHRlcm4nIG5vIGxvbmdlciBoYXZlIGFuIGFkZGl0aW9uYWwgZnVuY3Rpb24gZGVjbGFyYXRpb24gYWRkZWQgdG8gdGhlIAogICAgICAgICAgICB3cmFwcGVyIGZpbGVzLiBUaGVyZSBhcmUgc29tZSBjYXNlcyB3aGVyZSBTV0lHIGRvZXMgbm90IGdldCB0aGlzIHJpZ2h0LCBlZyBidWcgIzEyMDU4NTkgKGV4dGVybgogICAgICAgICAgICBmdW5jdGlvbnMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBkZWNsYXJlZCBpbiBhIG5hbWVzcGFjZSkuIEFsc28gU1dJRyBjYW5ub3QgZ2V0IG5vbi1zdGFuZGFyZAogICAgICAgICAgICBjYWxsaW5nIGNvbnZlbnRpb25zIGNvcnJlY3QsIGVnIFdpbmRvd3MgY2FsbGluZyBjb252ZW50aW9ucyBhcmUgdXN1YWxseSBoYW5kbGVkIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICAjZGVmaW5lIERMTElNUE9SVCBfX2RlY2xzcGVjKGRsbGltcG9ydCkKICAgICAgICAgICAgICAjZGVmaW5lIFNURENBTEwgX19zdGRjYWxsCiAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICAjZGVmaW5lIERMTElNUE9SVAogICAgICAgICAgICAgICNkZWZpbmUgU1REQ0FMTAogICAgICAgICAgICAgICVpbmxpbmUgJXsKICAgICAgICAgICAgICBETExJTVBPUlQgZXh0ZXJuIFNURENBTEwgdm9pZCBmdW5jdGlvbihpbnQpOwogICAgICAgICAgICAgICV9CgogICAgICAgICAgICBTV0lHIGluY29ycmVjdGx5IGdlbmVyYXRlczoKCiAgICAgICAgICAgIGV4dGVybiB2b2lkIGZ1bmN0aW9uKGludCk7CgogICAgICAgICAgICBUbyB3aGljaCB0aGVyZSBpcyBubyBzb2x1dGlvbiBhcyBTV0lHIGRvZXNuJ3QgaGFuZGxlIG5vbi1zdGFuZGFyZCBjYWxsaW5nIGNvbnZlbnRpb25zLiBUaGUgZXh0cmEKICAgICAgICAgICAgJ2V4dGVybicgZnVuY3Rpb24gdGhhdCBTV0lHIGdlbmVyYXRlcyBpcyBzdXBlcmZsdW91cyB1bmxlc3MgYSB1c2VyIGhhcyBmb3Jnb3R0ZW4gdG8gYWRkIHRoZSBmdW5jdGlvbgogICAgICAgICAgICBkZWNsYXJhdGlvbiBpbnRvIHRoZSB3cmFwcGVycy4KCiAgICAgICAgICAgIFRoZSAtbm9leHRlcm4gY29tbWFuZGxpbmUgYXJndW1lbnQgaXMgbm93IHJlZHVuZGFudCBhbmQgYSBuZXcgY29tbWFuZGxpbmUgYXJndW1lbnQgLWFkZGV4dGVybiBjYW4KICAgICAgICAgICAgYmUgdXNlZCB0byBvYnRhaW4gdGhlIG9yaWdpbmFsIGJlaGF2aW91ci4gVGhpcyBzaG91bGRuJ3QgYmUgbmVjZXNzYXJ5IHVubGVzcyB0aGUgaGVhZGVyIGZpbGUKICAgICAgICAgICAgY29udGFpbmluZyB0aGUgZnVuY3Rpb24gZGVjbGFyYXRpb24gd2FzIGluYWR2ZXJ0ZW50bHkgbm90IGFkZGVkIHRvIHRoZSB3cmFwcGVycy4gVG8gZml4IHRoaXMKICAgICAgICAgICAgYWRkIHRoZSBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpbnRvIHlvdXIgd3JhcHBlcnMsIEZvciBleGFtcGxlLCByZXBsYWNlOgoKICAgICAgICAgICAgICBleHRlcm4gdm9pZCBmb28oaW50KTsKCiAgICAgICAgICAgIHdpdGg6CgogICAgICAgICAgICAgICVpbmxpbmUgJXsKICAgICAgICAgICAgICBleHRlcm4gdm9pZCBmb28oaW50KTsKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgowNi8yMi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmEsIE1vZHVsYTMsIE9jYW1sXQogICAgICAgICAgICBUaGUgaW50ZXJtZWRpYXJ5IGZ1bmN0aW9uIG5hbWVzIGhhdmUgYmVlbiBjaGFuZ2VkIHdoZW4gd3JhcHBpbmcgdmFyaWFibGVzIHRvCiAgICAgICAgICAgIG1hdGNoIHRoZSBvdGhlciBsYW5ndWFnZSBtb2R1bGVzIHNvIHRoYXQgJWV4dGVuZCBmb3IgYSBtZW1iZXIgdmFyaWFibGUgd29ya3MKICAgICAgICAgICAgdW5pZm9ybWx5IGFjcm9zcyBhbGwgbGFuZ3VhZ2UgbW9kdWxlcywgZWc6CgogICAgICAgICAgICAgICVleHRlbmQgRXh0ZW5kTWUgewogICAgICAgICAgICAgICAgVmFyOwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgICB2b2lkIEV4dGVuZE1lX1Zhcl9zZXQoRXh0ZW5kTWUgKiwgZG91YmxlKSB7Li4ufQogICAgICAgICAgICAgICAgZG91YmxlIEV4dGVuZE1lX1Zhcl9nZXQoRXh0ZW5kTWUgKikgey4uLn0KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgVGhlIG1ldGhvZHMgaW1wbGVtZW50aW5nIHRoZSBnZXQvc2V0IHVzZWQgdG8gYmU6CgogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgICB2b2lkIHNldF9FeHRlbmRNZV9WYXIoRXh0ZW5kTWUgKiwgZG91YmxlKSB7Li4ufQogICAgICAgICAgICAgICAgZG91YmxlIGdldF9FeHRlbmRNZV9WYXIoRXh0ZW5kTWUgKikgey4uLn0KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgVGhpcyBhbHNvIGNoYW5nZXMgdGhlIG5hbWUgb2YgdmFyaWFibGUgd3JhcHBlciBmdW5jdGlvbnMgd2hlbiB1c2luZyAtbm9wcm94eS4KICAgICAgICAgICAgVGhlIG9yaWdpbmFsIG5hbWVzIGNhbiBiZSBnZW5lcmF0ZWQgd2l0aCB0aGUgLW9sZHZhcm5hbWVzIGNvbW1hbmRsaW5lIG9wdGlvbi4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKVmVyc2lvbiAxLjMuMjUgKEp1bmUgMTEsIDIwMDUpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDYvMTEvMjAwNjogbWtvZXBwZQoJICAgIFtHdWlsZV0gRml4IGhhbmRsaW5nIG9mIGFub255bW91cy1lbnVtIHZhcmlhYmxlcy4KCjA2LzEwLzIwMDU6IG1rb2VwcGUKCSAgICBbR3VpbGVdIEZpeCBmb3IgZnVuY3Rpb24gYXJndW1lbnRzIHRoYXQgYXJlIHBhc3NlZCBieQoJICAgIGNvcHktb2YtdmFsdWUuICBGaXggZm9yIGdsb2JhbCAiY29uc3QgY2hhciAqIiB2YXJpYWJsZXMuCgkgICAgRml4IHRlc3RjYXNlcyBhcnJheXNfZGltZW5zaW9ubGVzcywgYXJyYXlzX2dsb2JhbC4KCjA2LzA4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3Igd2hlbiBhIGJhc2UgY2xhc3MgZGVmaW5lcyBhIHN5bWJvbCBhcyBhIG1lbWJlciB2YXJpYWJsZSBhbmQgYSBkZXJpdmVkIGNsYXNzIGRlZmluZXMKICAgICAgICAgICAgdGhlIHNhbWUgc3ltYm9sIGFzIGEgbWVtYmVyIG1ldGhvZC4KCjA2LzA4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gTW9yZSBmaXhlcyBmb3IgdmlydHVhbC9uZXcvb3ZlcnJpZGUgbW9kaWZpZXJzIC0gd2hlbiBhIG1ldGhvZCBoYXMgcHJvdGVjdGVkIGFjY2VzcyAKICAgICAgICAgICAgaW4gYmFzZSBhbmQgcHVibGljIGFjY2VzcyBpbiBkZXJpdmVkIGNsYXNzLgoKMDYvMDIvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxMDY2MzYzIC0gRm9sbG93IGNvbnZlbnRpb24gb2YgcmVsZWFzZSB0YXJiYWxsIG5hbWUgbWF0Y2hpbmcgZGlyZWN0b3J5IG5hbWUuCgowNi8wMi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIEZpeCAjMTIxMTM1MyAtIHR5cGVzYWZlIGVudW1zIChhbmQgSmF2YSBwcm9wZXIgZW51bXMpIHdyYXBwZXJzIHdoZW4gZW51bSB2YWx1ZQogICAgICAgICAgICBpcyBuZWdhdGl2ZS4KCjA1LzI3LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIE1vZGVybmlzZWQgYW5kIHRpZGllZCB1cCBXaW5kb3dzIG1hY3JvcyAtLT4gU1dJR0VYUE9SVCwgU1dJR1NURENBTEwuIFRoZXkgY2FuIGJlIG92ZXJyaWRkZW4KICAgICAgICAgICAgYnkgdXNlcnMgdmlhIC1EIGNvbXBpbGVyIGRpcmVjdGl2ZXMgaWYgbmVlZCBiZS4KCjA1LzI2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgICVjc21ldGhvZG1vZGlmaWVycyBjYW4gYmUgYXBwbGllZCB0byB2YXJpYWJsZXMgYXMgd2VsbCBhcyBtZXRob2RzIG5vdy4KCiAgICAgICAgICAgIEluIGFkZGl0aW9uIHRvIHRoZSBkZWZhdWx0ICdwdWJsaWMnIG1vZGlmaWVyIHRoYXQgU1dJRyBnZW5lcmF0ZXMsICVjc21ldGhvZG1vZGlmaWVycyB3aWxsIGFsc28KICAgICAgICAgICAgcmVwbGFjZSB0aGUgdmlydHVhbC9uZXcvb3ZlcnJpZGUgbW9kaWZpZXJzIHRoYXQgU1dJRyB0aGlua3MgaXMgYXBwcm9wcmlhdGUuIFRoaXMgZmVhdHVyZSBpcwogICAgICAgICAgICB1c2VmdWwgZm9yIHNvbWUgb2JzY3VyZSBjYXNlcyB3aGVyZSBTV0lHIG1pZ2h0IGdldCB0aGUgbW9kaWZpZXJzIGluY29ycmVjdCwgZm9yIGV4YW1wbGUKICAgICAgICAgICAgd2l0aCBtdWx0aXBsZSBpbmhlcml0YW5jZSBhbmQgb3ZlcnJpZGluZyBhIG1ldGhvZCBpbiB0aGUgYmFzZSBjbGFzcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBDIyBNT0RVTEUgKioqCgowNS8yNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGRlZCBtaXNzaW5nIGNvbnN0cnVjdG9ycyB0byBzdGQ6OnBhaXIgd3JhcHBlcnMgKHN0ZF9wYWlyLmkpIGZvciBhbGwgbGFuZ3VhZ2VzLgoKMDUvMjUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGRlZCBzdGQ6OnBhaXIgd3JhcHBlcnMgaW4gc3RkX3BhaXIuaQoKMDUvMjUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBUaGUgQyMgJ25ldycgYW5kICdvdmVycmlkZScgbW9kaWZpZXJzIHdpbGwgYmUgZ2VuZXJhdGVkIHdoZW4gYSBDKysgY2xhc3MgaW5oZXJpdHMgbWV0aG9kcwogICAgICAgICAgICB2aWEgYSBDKysgJ3VzaW5nJyBkZWNsYXJhdGlvbi4KCjA1LzI1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3IgZXhjZXB0aW9uIHNwZWNpZmljYXRpb25zIHByZXZpb3VzbHkgYmVpbmcgaWdub3JlZCBpbiBjbGFzc2VzIHRoYXQgaW5oZXJpdGVkIG1ldGhvZHMKICAgICAgICAgICAgZnJvbSAndXNpbmcnIGRlY2xhcmF0aW9ucywgZWcgY2FsbHMgdG8gRGVyaXZlZDo6YmFyIGJlbG93IHdpbGwgY29udmVydCBDKysgZXhjZXB0aW9ucyBpbnRvCiAgICAgICAgICAgIGEgdGFyZ2V0IGxhbmd1YWdlIGV4Y2VwdGlvbi9lcnJvciwgbGlrZSBpdCBhbHdheXMgaGFzIGRvbmUgZm9yIEJhc2U6OkJhci4KCiAgICAgICAgICAgIGNsYXNzIEJhc2UgewogICAgICAgICAgICAgIHZpcnR1YWwgYmFyKCkgdGhyb3cgKHN0ZDo6c3RyaW5nKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgY2xhc3MgRGVyaXZlZCA6IHB1YmxpYyBCYXNlIHsKICAgICAgICAgICAgICB1c2luZyBCYXNlOjpiYXI7CiAgICAgICAgICAgIH07CgowNS8yMy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlcyBmb3IgZGV0ZWN0aW5nIHZpcnR1YWwgbWV0aG9kcyBpbiAlZXh0ZW5kIGZvciB0aGUgLWZ2aXJ0dWFsIG9wdGlvbiBhbmQgQyMgb3ZlcnJpZGUgYW5kIG5ldwogICAgICAgICAgICBtZXRob2QgbW9kaWZpZXJzLgoKMDUvMjMvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBUaGUgJ25ldycgbW9kaWZpZXIgaXMgbm93IGdlbmVyYXRlZCBvbiB0aGUgcHJveHkgbWV0aG9kIHdoZW4gYSBtZXRob2QgaW4gYSBkZXJpdmVkCiAgICAgICAgICAgIGNsYXNzIGlzIG5vdCBwb2x5bW9ycGhpYyBhbmQgdGhlIHNhbWUgbWV0aG9kIGV4aXN0cyBpbiB0aGUgZGVyaXZlZCBjbGFzcyAoaWUgaXQgaGlkZXMKICAgICAgICAgICAgdGhlIGJhc2UgY2xhc3MnIG5vbi12aXJ0dWFsIG1ldGhvZCkuCgowNS8yMy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEZpeGVzIHRvIGRldGVjdGlvbiBvZiBjb3ZhcmlhbnQgcmV0dXJuIHR5cGVzIC0gd2hlbiB0aGUgY2xhc3MgaGllcmFyY2h5IGlzIG1vcmUKICAgICAgICAgICAgdGhhbiAyIGNsYXNzZXMgZGVlcC4KCjA1LzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBzdGQ6OndzdHJpbmcgdHlwZW1hcHMgbW92ZWQgZnJvbSBzdGRfc3RyaW5nLmkgdG8gc3RkX3dzdHJpbmcuaQoKMDUvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciBjcmFzaCBpbiBEb2hTdHJzdHIsIGJ1ZyAjMTE5MDkyMQoKMDUvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1RDTF0gRml4IGZvciBtZXRob2RzIHdpdGggc2ltaWxhciBuYW1lcyB3aGVuIHNob3dpbmcgbGlzdCBvZiBuYW1lcyBvbiBlcnJvciAtIGJ1ZyAjMTE5MTgyOC4KICAgICAgICAgICAgUGF0Y2ggZnJvbSBKZXJvZW4gRG9iYmVsYWVyZS4KCjA1LzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtUQ0xdIGxvbmcgbG9uZyBvdmVybG9hZGluZyBmaXggLSBidWcgIzExOTE4MzUsIHBhdGNoIGZyb20gSmVyb2VuIERvYmJlbGFlcmUuCgowNS8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggYnVnICMxMTk2NzU1IHRvIHJlbW92ZSBkZWJ1ZyBmcm9tIHN3aWd0Y2w4LnN3Zy4KCjA1LzE5LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIyBhbmQgLWZ2aXJ0dWFsIG9wdGlvbl0gRml4IGZvciB0aGUgb3ZlcnJpZGUga2V5IG5vdCBiZWluZyBnZW5lcmF0ZWQgaW4gdGhlIGRlcml2ZWQgY2xhc3Mgd2hlbiBhCiAgICAgICAgICAgIHZpcnR1YWwgbWV0aG9kJ3MgcmV0dXJuIHR5cGUgd2FzIGEgdHlwZWRlZiBpbiBlaXRoZXIgdGhlIGJhc2Ugb3IgZGVyaXZlZCBjbGFzcy4gQWxzbyBlbnN1cmVzIHRoZQogICAgICAgICAgICBtZXRob2QgaXMgZWxpbWluYXRlZCB3aGVuIHVzaW5nIHRoZSAtZnZpcnR1YWwgb3B0aW9uLiBGb3IgZXhhbXBsZSwgRGVyaXZlZC5tZXRob2Qgbm93IGhhcyB0aGUgQyMKICAgICAgICAgICAgb3ZlcnJpZGUga2V5d29yZCBnZW5lcmF0ZWQ6CgogICAgICAgICAgICAgIHR5cGVkZWYgaW50KiBJbnRlZ2VyUHRyOwoKICAgICAgICAgICAgICBzdHJ1Y3QgQmFzZSB7CiAgICAgICAgICAgICAgICB2aXJ0dWFsIEludGVnZXJQdHIgbWV0aG9kKCk7CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgc3RydWN0IERlcml2ZWQgOiBCYXNlIHsKICAgICAgICAgICAgICAgIGludCAqIG1ldGhvZCgpIGNvbnN0OwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICBbQyNdIEZpeCBmb3IgdGhlIG92ZXJyaWRlIGtleSBiZWluZyBpbmNvcnJlY3RseSBnZW5lcmF0ZWQgZm9yIHZpcnR1YWwgbWV0aG9kcyB3aGVuIGEgYmFzZSBjbGFzcwogICAgICAgICAgICBpcyBpZ25vcmVkIHdpdGggJWlnbm9yZS4KCjA1LzEzLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXhlcyB0byByZW1vdmUgImRlcmVmZXJlbmNpbmcgdHlwZS1wdW5uZWQgcG9pbnRlciB3aWxsIGJyZWFrIHN0cmljdC1hbGlhc2luZyBydWxlcyIKICAgICAgICAgICAgd2FybmluZ3MgaW4gQyB3cmFwcGVycyB3aGVuIGNvbXBpbGluZyBDIGNvZGUgd2l0aCAnZ2NjIC1XYWxsIC1mc3RyaWN0LWFsaWFzaW5nJy4gUGF0Y2ggZnJvbQogICAgICAgICAgICBNaWNoYWVsIENhaGlsbC4gVGhpcyBtb2RpZmllcyBtYW55IG9mIHRoZSBjYXN0cyBzbGlnaHRseSwgZm9yIGV4YW1wbGUKICAgICAgICAgICAgICBhcmcxID0gKihEQl9FTlYgKiopJmphcmcxOwogICAgICAgICAgICB0bwogICAgICAgICAgICAgIGFyZzEgPSAqKERCX0VOViAqKikodm9pZCAqKSZqYXJnMTsKCjA1LzEyLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gU3VwcG9ydCBmb3IgQyMgYXR0cmlidXRlcy4gQyMgYXR0cmlidXRlcyBjYW4gYmUgZ2VuZXJhdGVkOgogICAgICAgICAgICAxKSBPbiBhIEMvQysrIHR5cGUgYmFzaXMgYnkgc3BlY2lmeWluZyBhbiBpbmF0dHJpYnV0ZXMgYW5kL29yIG91dGF0dHJpYnV0ZXMgdHlwZW1hcCBhdHRyaWJ1dGUKICAgICAgICAgICAgICAgaW4gdGhlIGltdHlwZSBvciBjc3R5cGUgdHlwZW1hcHMgKGZvciBDIyByZXR1cm4gdHlwZSBvciBDIyBwYXJhbWV0ZXIgdHlwZSBhdHRyaWJ1dGVzKS4KICAgICAgICAgICAgMikgT24gYSB3cmFwcGVkIG1ldGhvZCBvciB2YXJpYWJsZSBieSBzcGVjaWZ5aW5nIGEgY3NhdHRyaWJ1dGVzIGZlYXR1cmUgKCVmZWF0dXJlKS4KICAgICAgICAgICAgMykgT24gYSB3cmFwcGVkIHByb3h5IGNsYXNzIG9yIGVudW0gYnkgc3BlY2lmeWluZyBhIGNzYXR0cmlidXRlcyB0eXBlbWFwLgoKICAgICAgICAgICAgRXhhbXBsZXMgYXJlIGluIHRoZSBDIyBkb2N1bWVudGF0aW9uIChDU2hhcnAuaHRtbCkuCgowNC8yOS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBOZXcgY29uZmlndXJlIG9wdGlvbiB0byB0dXJuIG9mZiB0aGUgZGVmYXVsdCBtYXhpbXVtIGNvbXBpbGVyIHdhcm5pbmcgYXMKICAgICAgICAgICAgdGhleSBjb3VsZG4ndCBiZSByZW1vdmVkIGV2ZW4gd2hlbiBvdmVycmlkaW5nIENGTEFHUyBhbmQgQ1hYRkxBR1Mgd2l0aCBjb25maWd1cmUKICAgICAgICAgICAgKC4vY29uZmlndXJlIENGTEFHUz0gQ1hYRkxBR1M9KS4gVG8gdHVybiB0aGUgbWF4aW11bSB3YXJuaW5ncyBvZmYsIHJ1bjogIAoKICAgICAgICAgICAgICAuL2NvbmZpZ3VyZSAtLXdpdGhvdXQtbWF4aW11bS1jb21waWxlLXdhcm5pbmdzCgowNC8yOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCBmcm9tIFNjb3R0IE1pY2hlbCB3aGljaCByZXdvcmtzIHRoZSBKYXZhIGNvbnN0cnVjdG9yIGFuZCBmaW5hbGl6ZS9kZXN0cnVjdG9yIHR5cGVtYXBzLAogICAgICAgICAgICBmb3IgZGlyZWN0b3JzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIG92ZXJhbGwgSmF2YSB0eXBlbWFwcy4gQWRkZWQgdGhlIGRpcmVjdG9yX3Rha2UgYW5kIAogICAgICAgICAgICBkaXJlY3Rvcl9yZWxlYXNlIHR5cGVtYXBzIHRvIGVtdWxhdGUgb3RoZXIgbW9kdWxlcycgX19kaXNvd25fXyBmdW5jdGlvbmFsaXR5LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgRElSRUNUT1JTICoqKgoKMDQvMjgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXhlZCBwcm9ibGVtcyBkdWUgdG8gdGhlIG92ZXIgZWFnZXIgZ2FyYmFnZSBjb2xsZWN0b3IuIE9jY2FzaW9uYWxseSB0aGUKICAgICAgICAgICAgZ2FyYmFnZSBjb2xsZWN0b3Igd291bGQgY29sbGVjdCBhIEMjIHByb3h5IGNsYXNzIGluc3RhbmNlIHdoaWxlIGl0IHdhcyBiZWluZyB1c2VkCiAgICAgICAgICAgIGluIHVubWFuYWdlZCBjb2RlIGlmIHRoZSBvYmplY3Qgd2FzIHBhc3NlZCBhcyBhIHBhcmFtZXRlciB0byBhIHdyYXBwZWQgZnVuY3Rpb24uCiAgICAgICAgICAgIE5lZWRsZXNzIHRvIHNheSB0aGlzIGNhdXNlZCBoYXZvYyBhcyB0aGUgQyMgcHJveHkgY2xhc3MgY2FsbHMgdGhlIEMrKyBkZXN0cnVjdG9yCiAgICAgICAgICAgIHdoZW4gaXQgaXMgY29sbGVjdGVkLiBQcm94eSBjbGFzc2VzIGFuZCB0eXBlIHdyYXBwZXIgY2xhc3NlcyBub3cgdXNlIGEgSGFuZGxlUmVmLAogICAgICAgICAgICB3aGljaCBob2xkcyBhbiBJbnRQdHIsIGluc3RlYWQgb2YgYSBwbGFpbiBJbnRQdHIgdG8gbWFyc2hhbCB0aGUgQysrIHBvaW50ZXIgdG8gdW5tYW5hZ2VkCiAgICAgICAgICAgIGNvZGUuIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGFueSBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvbiBhcyBhIHJlc3VsdCBvZiB0aGlzCiAgICAgICAgICAgIG1vZGlmaWNhdGlvbi4KCiAgICAgICAgICAgIFRoZSBjaGFuZ2VzIGFyZSBpbiB0aGUgcHJveHkgYW5kIHR5cGUgd3JhcHBlciBjbGFzc2VzLiBUaGUgc3dpZ0NQdHIgaXMgbm93IG9mIHR5cGUgSGFuZGxlUmVmCiAgICAgICAgICAgIGluc3RlYWQgb2YgSW50UHRyIGFuZCBjb25zZXF1ZW50bHkgdGhlIGdldENQdHIgbWV0aG9kIHJldHVybiB0eXBlIGhhcyBhbHNvIGNoYW5nZWQuIFRoZSBuZXQKICAgICAgICAgICAgZWZmZWN0IGlzIHRoYXQgYW55IGN1c3RvbSB3cml0dGVuIHR5cGVtYXBzIG1pZ2h0IGhhdmUgdG8gYmUgbW9kaWZpZWQgdG8gc3VpdGUuIEFmZmVjdGVkIHVzZXJzCiAgICAgICAgICAgIHNob3VsZCBub3RlIHRoYXQgdGhlIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIG5ldyAnb3V0JyBhdHRyaWJ1dGUgaW4gdGhlIGltdHlwZSB0eXBlbWFwIGFzIHRoZQogICAgICAgICAgICBpbnB1dCB0eXBlIGlzIG5vdyBhIEhhbmRsZVJlZiBhbmQgdGhlIG91dHB1dCB0eXBlIGlzIHN0aWxsIGFuIEludFB0ci4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBDIyBNT0RVTEUgKioqCgowNC8yOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFN1cHBvcnQgZm9yIGFzeW1tZXRyaWMgdHlwZSBtYXJzaGFsbGluZyBhZGRlZC4gU29tZXRpbWVzIHRoZSBvdXRwdXQgdHlwZSBuZWVkcyB0byBiZQogICAgICAgICAgICBkaWZmZXJlbnQgdG8gdGhlIGlucHV0IHR5cGUuIFN1cHBvcnQgZm9yIHRoaXMgY29tZXMgaW4gdGhlIGZvcm0gb2YgYSBuZXcgb3B0aW9uYWwgJ291dCcKICAgICAgICAgICAgYXR0cmlidXRlIGZvciB0aGUgY3R5cGUsIGltdHlwZSBhbmQgY3N0eXBlIHR5cGVtYXBzLiBJZiB0aGlzIHR5cGVtYXAgYXR0cmlidXRlIGlzIG5vdAogICAgICAgICAgICBzcGVjaWZpZWQsIHRoZW4gdGhlIHR5cGUgdXNlZCBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0IGlzIHRoZSB0eXBlIHNwZWNpZmllZCBpbiB0aGUKICAgICAgICAgICAgdHlwZW1hcCwgYXMgaGFzIGFsd2F5cyBwcmV2aW91c2x5IGJlZW4gdGhlIGNhc2UuIElmIHRoaXMgdHlwZW1hcCBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLAogICAgICAgICAgICB0aGVuIHRoZSB0eXBlIHNwZWNpZmllZCBpbiB0aGUgYXR0cmlidXRlIGlzIHVzZWQgZm9yIG91dHB1dCB0eXBlcyBhbmQgdGhlIHR5cGUgc3BlY2lmaWVkCiAgICAgICAgICAgIGluIHRoZSB0eXBlbWFwIGl0c2VsZiBpcyB1c2VkIGZvciB0aGUgaW5wdXQgdHlwZS4gQW4gb3V0cHV0IHR5cGUgaXMgYSByZXR1cm4gdmFsdWUgZnJvbQogICAgICAgICAgICBhIHdyYXBwZWQgbWV0aG9kIG9yIHdyYXBwZWQgY29uc3RhbnQgYW5kIGFuIGlucHV0IHR5cGUgaXMgYSBwYXJhbWV0ZXIgaW4gYSB3cmFwcGVkIG1ldGhvZC4KCiAgICAgICAgICAgIEFuIGV4YW1wbGUgc2hvd3MgdGhhdCBjaGFyICogY291bGQgYmUgbWFyc2hhbGxlZCBpbiBkaWZmZXJlbnQgd2F5cywgCgogICAgICAgICAgICAgICV0eXBlbWFwKGltdHlwZSwgb3V0PSJJbnRQdHIiKSBjaGFyICogInN0cmluZyIKICAgICAgICAgICAgICBjaGFyICogZnVuY3Rpb24oY2hhciAqKTsKCiAgICAgICAgICAgIFRoZSBvdXRwdXQgdHlwZSBpcyB0aHVzIEludFB0ciBhbmQgdGhlIGlucHV0IHR5cGUgaXMgc3RyaW5nLiBUaGUgcmVzdWx0aW5nIGludGVybWVkaWFyeSBDIyBjb2RlIGlzOgoKICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGV4dGVybiBJbnRQdHIgZnVuY3Rpb24oc3RyaW5nIGphcmcxKTsKCjA0LzIyLzIwMDU6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEZpeCBnZW5lcmF0aW9uIG9mICJkZWZpbmUtbWV0aG9kIiBmb3IgbWV0aG9kcyBvZgoJICAgIGNsYXNzZXMgd2l0aCBhIGNvbnN0cnVjdG9yLiAgUmVwb3J0ZWQgYnkgTHVpZ2kgQmFsbGFiaW8uCgowNC8xNS8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbQ2hpY2tlbl0KCSAgICBGb3Igd3JhcHBlZCBmdW5jdGlvbnMgdGhhdCByZXR1cm4gbXVsdGlwbGUgdmFsdWVzICh1c2luZyBhcmdvdXQpLAoJICAgIFNXSUcgQ0hJQ0tFTiBub3cgcmV0dXJucyB0aGVtIGFzIG11bHRpcGxlIHZhbHVlcyBpbnN0ZWFkIG9mIGFzCgkgICAgYSBsaXN0LiAgVGhleSBjYW4gdGhlbiBiZSBhY2Nlc3NlZCB1c2luZyAoY2FsbC13aXRoLXZhbHVlcykuCgowNC8xNC8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW0NoaWNrZW5dCiAgICAgICAgICAgICsgQWRkZWQgYSB3aG9sZSBidW5jaCBvZiBuZXcgX3J1bm1lIHNjcmlwdHMgaW50byB0aGUgY2hpY2tlbiB0ZXN0CiAgICAgICAgICAgIHN1aXRlLiAgQWxzbyBmaXggc29tZSBidWdzIHRoZXNlIG5ldyBzY3JpcHRzIHR1cm5lZCB1cC4KCiAgICAgICAgICAgICsgQWRkZWQgb3B0aW1pemF0aW9uIHdoZW4gcmV0dXJuaW5nIGEgd3JhcHBlZCBwcm94eSBjbGFzcy4gIEJlZm9yZSwKICAgICAgICAgICAgYSBtaW5vciBnYXJiYWdlIGNvbGxlY3Rpb24gd2FzIGludm9rZWQgZXZlcnkgdGltZSBhIGZ1bmN0aW9uIHJldHVybmVkLgoKCSAgICArIEFsbCB0aGUgY2hpY2tlbiBFeGFtcGxlcyBzaG91bGQgbm93IHJ1biBjb3JyZWN0bHkKCjA0LzE0LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gTW9yZSBmaXhlcyBmb3IgdHlwZW1hcCBtYXRjaGluZyB3aGVuIHdyYXBwaW5nIHZhcmlhYmxlcywgaW4gcGFydGljdWxhcgogICAgICAgICAgICBzdGQ6OnN0cmluZywgc28gdGhhdCBzdGQ6OnN0cmluZyB2YXJpYWJsZXMgY2FuIGJlIGVhc2lseSBtYXJzaGFsbGVkIHdpdGgKICAgICAgICAgICAgYSBDIyBzdHJpbmcgcHJvcGVydHkgdXNpbmc6CgogICAgICAgICAgICAgICVpbmNsdWRlICJzdGRfc3RyaW5nLmkiCiAgICAgICAgICAgICAgJWFwcGx5IGNvbnN0IHN0ZDo6c3RyaW5nICYgeyBzdGQ6OnN0cmluZyAqdmFyaWFibGVfbmFtZSB9OwogICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZhcmlhYmxlX25hbWU7CgogICAgICAgICAgICAoUmVjYWxsIHRoYXQgYWxsIGNsYXNzIHZhcmlhYmxlcyBhcmUgd3JhcHBlZCB1c2luZyBwb2ludGVycykKCjA0LzA1LzIwMDU6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtDaGlja2VuXQoJICAgICsgQWRkZWQgRXhhbXBsZXMvY2hpY2tlbi9lZ2csIGFuIGV4YW1wbGUgb24gaG93IHRvIGJ1aWxkIGEgY2hpY2tlbgoJICAgICAgZXh0ZW5zaW9uIGxpYnJhcnkgaW4gdGhlIGZvcm0gb2YgYW4gZWdnLiAgQWxzbyB1cGRhdGVkIHRoZQoJICAgICAgZG9jdW1lbnRhdGlvbiBvbiB0aGUgZGlmZmVyZW50IGxpbmtpbmcgb3B0aW9ucy4KCgkgICAgKyBjaGlja2VuIHRlc3Qtc3VpdGUgbm93IGhhcyBzdXBwb3J0IHRvIGNoZWNrIFNXSUcgd2l0aCB0aGUgLXByb3h5CgkgICAgICBhcmd1bWVudCBpZiB0aGVyZSBleGlzdHMgYSBfcHJveHlfcnVubWUuc3MgZmlsZS4KCgkgICAgKyBNb3JlIGZpeGVzIGZvciBvdmVybG9hZGVkIGZ1bmN0aW9ucyBhbmQgLXByb3h5CgowMy8zMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBUdXJuZWQgb24gZXh0cmEgdGVtcGxhdGUgZmVhdHVyZXMgZm9yIGFsbCBsYW5ndWFnZXMgd2hpY2ggd2VyZQogICAgICAgICAgICBwcmV2aW91c2x5IG9ubHkgYXZhaWxhYmxlIHRvIFB5dGhvbi4KCiAgICAgICAgICAgIFRoaXMgZW5hYmxlcyB0eXBlbWFwcyBkZWZpbmVkIHdpdGhpbiBhIHRlbXBsYXRlZCBjbGFzcyB0byBiZSB1c2VkIGFzCiAgICAgICAgICAgIGV4cGVjdGVkLiBSZXF1aXJlcyAldGVtcGxhdGUgb24gdGhlIHRlbXBsYXRlZCBjbGFzcywgJXRlbXBsYXRlKCkgd2lsbAogICAgICAgICAgICBhbHNvIHBpY2sgdXAgdGhlIHR5cGVtYXBzLiBFeGFtcGxlOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBGb28gImluIHR5cGVtYXAgZm9yIEZvbzxUPiAiCiAgICAgICAgICAgICAgICBvcgogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIEZvbzxUPiAiaW4gdHlwZW1hcCBmb3IgRm9vPFQ+ICIKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIAogICAgICAgICAgICAgICV0ZW1wbGF0ZShGb29faSkgRm9vPGludD47CiAgICAgICAgICAgICAgJXRlbXBsYXRlKCkgRm9vPGRvdWJsZT47CiAgICAgICAgICAgICAgCiAgICAgICAgICAgIHdpbGwgZ2VuZXJhdGUgdGhlIHByb3BlciAnaW4nIHR5cGVtYXBzIHdoZXJldmVyIEZvbzxpbnQ+IGFuZCBGb288ZG91YmxlPgogICAgICAgICAgICBhcmUgdXNlZC4KCjAzLzMwLzIwMDU6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbTXpTY2hlbWVdIFBhdGNoIGZyb20gSGFucyBPZXN0ZXJob2x0IGZvciBzdXBwb3J0aW5nIE16U2NoZW1lIDMweC4KCjAzLzI5LzIwMDU6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtDaGlja2VuXQoJICAgICsgUmVhbGxvdyBvbGRlciB2ZXJzaW9ucyBvZiBjaGlja2VuICgxLjQwIHRvIDEuODkpIGJ5IHBhc3NpbmcgLW5vY29sbGVjdGlvbgoJICAgICAgYXJndW1lbnQgdG8gU1dJRwoJICAgICsgJWltcG9ydCBub3cgd29ya3MgY29ycmVjdGx5IHdpdGggdGlueWNsb3MuICAoZGVjbGFyZSAodXNlcyAuLi4pKSB3aWxsIGJlCgkgICAgICBleHBvcnRlZCBjb3JyZWN0bHkuCgkgICAgKyBUaW55Q0xPUyBwcm94eSBjbGFzc2VzIG5vdyB3b3JrIGNvcnJlY3RseSB3aXRoIG92ZXJsb2FkZWQgZnVuY3Rpb25zCgkgICAgICBhbmQgY29uc3RydWN0b3JzLgoKMDMvMjkvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFBhdGNoIGZyb20gU2NvdHQgTWljaGVsIGZvciBkaXJlY3Rvcm91dCB0eXBlbWFwcy4gSmF2YSBkaXJlY3RvcnMKICAgICAgICAgICAgcmVxdWlyZSB0aGUgZGlyZWN0b3JvdXQgdHlwZW1hcHMgbGlrZSB0aGUgb3RoZXIgbGFuZ3VhZ2VzIG5vdy4gVGhlIG5ldwogICAgICAgICAgICB0eXBlbWFwcyBwcm92aWRlIGZpeGVzIGZvciBtZXRob2RzIHdoZXJlIHRoZSByZXR1cm4gdHlwZSBpcyByZXR1cm5lZAogICAgICAgICAgICBieSByZWZlcmVuY2UgKHRoaXMgY2Fubm90IGF1dG9tYXRpY2FsbHkgYmUgbWFkZSB0aHJlYWQgc2FmZSB0aG91Z2gpLgoKMDMvMjIvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRW51bSBjYXN0aW5nIGZpeGVzLiBWaXN1YWwgQysrIGRpZG4ndCBsaWtlIHRoZSBDIHR5cGUgY2FzdGluZyBTV0lHIHByb2R1Y2VkCiAgICAgICAgICAgIHdoZW4gd3JhcHBpbmcgQysrIGVudW0gcmVmZXJlbmNlcywgYXMgcmVwb3J0ZWQgYnkgQWRtaXJlIEthbmRhd2FzdmlrYS4KCjAzLzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBTRiAjMTEyNDQ5MC4gRml4IFBlcmwgbWFjcm8gY2xhc2hlcyB3aGVuIHVzaW5nIFZpc3VhbCBTdHVkaW8ncyBTVEwgc3RyaW5nLAogICAgICAgICAgICBzbyBub3cgcHJvamVjdHMgY2FuICNpbmNsdWRlIDxzdHJpbmc+LgoKMDMvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4ZWQgJXZhcmFyZ3Mgd2hpY2ggZ290IGJyb2tlbiB3aXRoIHRoZSByZWNlbnQgZGVmYXVsdCBhcmd1bWVudCBjaGFuZ2VzLgogICAgICAgICAgICBBbHNvIHdvcmtzIGZvciBKYXZhIGFuZCBDIyBmb3IgdGhlIGZpcnN0IHRpbWUgbm93LgoKMDMvMTcvMjAwNTogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtDaGlja2VuXSAKCSAgICArIEZpeCBhIHdob2xlIGJ1bmNoIG9mIGJ1Z3MgaW4gdGhlIGNoaWNrZW4gbW9kdWxlLiAgVGhlIGVudGlyZQogICAgICAgICAgICAgIHRlc3Qgc3VpdGUgbm93IGNvbXBpbGVzLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIHRlc3RzIHRoYXQgcmVxdWlyZQoJICAgICAgc3RkX3ZlY3Rvci5pLCBzdGRfZGVxdWUuaSwgYW5kIHNvIG9uLCB3aGljaCBjaGlja2VuIGRvZXMgbm90IGhhdmUgeWV0LgoKCSAgICArIEFkZCBzdXBwb3J0IGZvciAlZXhjZXB0aW9uIGFuZCAldHlwZW1hcChleGNlcHRpb25zKS4gIEV4Y2VwdGlvbnMgYXJlCgkgICAgICB0aHJvd24gd2l0aCBhIGNhbGwgdG8gKGFib3J0KSBhbmQgY2FuIGJlIGhhbmRsZWQgYnkgKGhhbmRsZS1leGNlcHRpb25zKQoKMDMvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFBhdGNoIGZyb20gU2NvdHQgTWljaGVsIGZvciBkaXJlY3RvcnMuIE1vZGlmaWNhdGlvbnMgdG8gdGhlIHR5cGVtYXBzCiAgICAgICAgICAgIGdpdmluZyB1c2VycyBmaW5lIGNvbnRyb2wgb3ZlciBtZW1vcnkgb3duZXJzaGlwIGFuZCBsaWZldGltZSBvZiBkaXJlY3RvciBjbGFzc2VzLgogICAgICAgICAgICBEaXJlY3RvciBjbGFzc2VzIG5vIGxvbmdlciBsaXZlIGZvcmV2ZXIgYnkgZGVmYXVsdCBhcyB0aGV5IGFyZSBub3cgY29sbGVjdGFibGUKICAgICAgICAgICAgYnkgdGhlIEdDLgoKMDMvMTUvMjAwNTogd3V6emViIChKb2huIExlbnopCgkgICAgW0NoaWNrZW5dIEFkZCBzdXBwb3J0IGZvciBhZGRpbmcgZmluYWxpemVycyBnYXJiYWdlIGNvbGxlY3RlZCBvYmplY3RzLgoJICAgIEZ1bmN0aW9ucyB0aGF0IHJldHVybiBuZXcgb2JqZWN0cyBzaG91bGQgYmUgbWFya2VkIHdpdGggJW5ld29iamVjdCBhbmQKCSAgICBpbnB1dCBhcmd1bWVudHMgd2hpY2ggY29uc3VtZSAob3IgdGFrZSBvd25lcnNoaXApIG9mIGEgcG9pbnRlciBzaG91bGQKCSAgICBiZSBtYXJrZWQgd2l0aCB0aGUgRElTT1dOIHR5cGVtYXAuCgoJICAgIEFsc28gYWRkIHN1cHBvcnQgZm9yIGNvcnJlY3RseSBjaGVja2luZyB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBwYXNzZWQKCSAgICB0byBhIGZ1bmN0aW9uLCBhbmQgcmFpc2luZyBhbiBlcnJvciBpZiB0aGUgd3JvbmcgbnVtYmVyIGFyZSBwYXNzZWQuCgowMy8xNC8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgQWRkIC0td2l0aG91dC1hbGxsYW5nIG9wdGlvbiB0byBjb25maWd1cmUuaW4sIHdoaWNoIGlzIHRoZSBzYW1lIGFzCiAgICAgICAgICAgIHBhc3NpbmcgYWxsIHRoZSAtLXdpdGhvdXQtcHl0aG9uIC0td2l0aG91dC1wZXJsNSBldGMuLi4gdGhhdCBNYXR0aGlhcyBhZGRlZC4KCjAzLzA5LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQaHBdIE1lbW9yeSBsZWFrIGZpeCBmb3IgZnVuY3Rpb25zIHJldHVybmluZyBjbGFzc2VzL3N0cnVjdHMgYnkgdmFsdWUuCgowMy8wOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gRml4IGZvciBQZXJsIGluY29ycmVjdGx5IHRha2luZyBtZW1vcnkgb3duZXJzaGlwIGZvciByZXR1cm4gdHlwZXMgdGhhdAogICAgICAgICAgICBhcmUgdHlwZWRlZnMgdG8gYSBzdHJ1Y3QvY2xhc3MgcG9pbnRlci4gUmVwb3J0ZWQgYnkgSm9zaCBDaGVycnkuCgowMy8wNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFZhcmlvdXMgZXhjZXB0aW9uIGNoYW5nZXMgZm9yIHRoZSBzdGQ6OnZlY3RvciB3cmFwcGVycy4gVGhlc2Ugbm93IG1vcmUKICAgICAgICAgICAgYWNjdXJhdGVseSBtaXJyb3IgdGhlIHNhbWUgZXhjZXB0aW9ucyB0aGF0IFN5c3RlbS5Db2xsZWN0aW9ucy5BcnJheUxpc3QgdGhyb3cuCgowMy8wNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCB1bmRlZmluZWQgYmVoYXZpb3VyIGFmdGVyIGFueSBvZiB0aGUgc3RkOjp2ZWN0b3IgbWV0aG9kcwogICAgICAgICAgICB0aHJvdyBhbiBleGNlcHRpb24uCgowMy8wNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFdoZW4gbnVsbCBpcyBwYXNzZWQgZm9yIGEgQysrIHJlZmVyZW5jZSBvciB2YWx1ZSBwYXJhbWV0ZXIsIHRoZSAKICAgICAgICAgICAgZXhjZXB0aW9uIHRocm93biBoYXMgYmVlbiBjb3JyZWN0ZWQgdG8gYW4gQXJndW1lbnROdWxsRXhjZXB0aW9uIGluc3RlYWQKICAgICAgICAgICAgb2YgTnVsbFJlZmVyZW5jZUV4Y2VwdGlvbiBhcyByZWNvbW1lbmRlZCBpbiB0aGUgLk5FVCBGcmFtZXdvcmsgZG9jdW1lbnRhdGlvbi4KCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IHRocm93cyB0eXBlbWFwcyB0dXJuIGEgQysrIGV4Y2VwdGlvbiBpbnRvIGFuIEFwcGxpY2F0aW9uRXhjZXB0aW9uLAogICAgICAgICAgICBub3QgYSBTeXN0ZW1FeGNlcHRpb24gbm93LgoKMDMvMDcvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBOdW1lcm91cyBjaGFuZ2VzIGluIEMjIGV4Y2VwdGlvbiBoYW5kbGluZyBoYXZlIGJlZW4gbWFkZSBvdmVyIHRoZSBwYXN0CiAgICAgICAgICAgIGZldyB3ZWVrcy4gQSBzdW1tYXJ5IGZvbGxvd3M6CgogICAgICAgICAgICBUaGUgd2F5IGluIHdoaWNoIEMrKyBleGNlcHRpb25zIGFyZSBtYXBwZWQgdG8gQyMgZXhjZXB0aW9ucyBpcyBxdWl0ZSBkaWZmZXJlbnQuCiAgICAgICAgICAgIFRoZSBjaGFuZ2UgaXMgdG8gZml4IEMjIGV4Y2VwdGlvbnMgc28gdGhhdCB0aGUgQysrIGV4Y2VwdGlvbiBzdGFjayBpcyBjb3JyZWN0bHkKICAgICAgICAgICAgdW53b3VuZCBhcyBwcmV2aW91c2x5IEMrKyBleGNlcHRpb25zIHdlcmUgYmVpbmcgdGhyb3duIGFjcm9zcyB0aGUgQyBQSW52b2tlIGxheWVyCiAgICAgICAgICAgIGludG8gdGhlIG1hbmFnZWQgd29ybGQuCgogICAgICAgICAgICBOZXcgdHlwZW1hcCBhdHRyaWJ1dGVzIChjYW50aHJvdyBhbmQgZXhjb2RlKSBoYXZlIGJlZW4gaW50cm9kdWNlZCB0byBjb250cm9sIHRoZQogICAgICAgICAgICBtYXBwaW5nIG9mIEMrKyB0byBDIyBleGNlcHRpb25zLiBFc3NlbnRpYWxseSBhIGNhbGxiYWNrIGludG8gdGhlIHVubWFuYWdlZCB3b3JsZAogICAgICAgICAgICBpcyBtYWRlIHRvIHNldCBhIHBlbmRpbmcgZXhjZXB0aW9uLiBUaGUgZXhjZXB0aW9uIHRvIHRocm93IGlzIHN0b3JlZCBpbiB0aHJlYWQgbG9jYWwKICAgICAgICAgICAgc3RvcmFnZSAoc28gdGhlIGFwcHJvYWNoIGlzIHRocmVhZC1zYWZlKS4gVGhlIHR5cGVtYXBzIGFyZSBleHBlY3RlZCB0byByZXR1cm4KICAgICAgICAgICAgZnJvbSB1bm1hbmFnZWQgY29kZSBhcyBzb29uIGFzIHRoZSBwZW5kaW5nIGV4Y2VwdGlvbiBpcyBzZXQuIEFueSBwZW5kaW5nIGV4Y2VwdGlvbnMKICAgICAgICAgICAgYXJlIGNoZWNrZWQgZm9yIGFuZCB0aHJvd24gb25jZSBtYW5hZ2VkIGNvZGUgc3RhcnRzIGV4ZWN1dGluZy4gVGhlcmUgc2hvdWxkCiAgICAgICAgICAgIGJlIG1pbmltYWwgaW1wYWN0IG9uIGV4ZWN1dGlvbiBzcGVlZCBkdXJpbmcgbm9ybWFsIGJlaGF2aW91ci4gRnVsbCBkZXRhaWxzIHdpbGwgYmUKICAgICAgICAgICAgZG9jdW1lbnRlZCBpbiBDU2hhcnAuaHRtbC4KCiAgICAgICAgICAgIFRoZSBTV0lHX0NTaGFycFRocm93RXhjZXB0aW9uKCkgZnVuY3Rpb24gaGFzIGJlZW4gcmVtb3ZlZCBhbmQgcmVwbGFjZWQgd2l0aCB0aGUKICAgICAgICAgICAgU1dJR19DU2hhcnBTZXRQZW5kaW5nRXhjZXB0aW9uQXJndW1lbnQoKSBhbmQgU1dJR19DU2hhcnBTZXRQZW5kaW5nRXhjZXB0aW9uKCkKICAgICAgICAgICAgZnVuY3Rpb25zLiBUaGUgb3JpZ2luYWwgbmFtZSBoYXMgYmVlbiBkZWxpYmVyYXRlbHkgY2hhbmdlZCB0byBicmVhayBvbGQgY29kZSBhcwogICAgICAgICAgICB0aGUgb2xkIGFwcHJvYWNoIHdhcyBzb21ld2hhdCBmbGF3ZWQuIEFueSB1c2VyIGRlZmluZWQgZXhjZXB0aW9ucyB0aGF0IGZvbGxvdyB0aGUKICAgICAgICAgICAgc2FtZSBwYXR0ZXJuIGFzIHRoZSBvbGQgYXBwcm9hY2ggc2hvdWxkIGFsc28gYmUgZml4ZWQuCgogICAgICAgICAgICBOdW1lcm91cyBuZXcgLk5FVCBmcmFtZXdvcmsgZXhjZXB0aW9ucyBhcmUgbm93IGF2YWlsYWJsZSBmb3IgZWFzeSB0aHJvd2luZyBmcm9tIAogICAgICAgICAgICB1bm1hbmFnZWQgY29kZS4gVGhlIGNvbXBsZXRlIGxpc3QgaXM6IAoKICAgICAgICAgICAgICBBcHBsaWNhdGlvbkV4Y2VwdGlvbiwgQXJpdGhtZXRpY0V4Y2VwdGlvbiwgRGl2aWRlQnlaZXJvRXhjZXB0aW9uLCAKICAgICAgICAgICAgICBJbmRleE91dE9mUmFuZ2VFeGNlcHRpb24sIEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uLCAKICAgICAgICAgICAgICBOdWxsUmVmZXJlbmNlRXhjZXB0aW9uLCBPdXRPZk1lbW9yeUV4Y2VwdGlvbiwgT3ZlcmZsb3dFeGNlcHRpb24sIAogICAgICAgICAgICAgIFN5c3RlbUV4Y2VwdGlvbiwgQXJndW1lbnRFeGNlcHRpb24sIEFyZ3VtZW50TnVsbEV4Y2VwdGlvbiBhbmQKICAgICAgICAgICAgICBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgQyMgTU9EVUxFICoqKgoKMDUvMDUvMjAwNTogbW1hdHVzCgkgICAgCgkgICAgRml4IHNldmVyYWwgbWVtb3J5IGxlYWtzIGFyb3VuZC4gRXZlbiB3aGVuIHdlIHN1cnZpdmUgIGtub3duaW5nCgkgICAgc3dpZyBpcyBhIG1lbW9yeSBsZWFrIGZhY3RvcnksIGl0IHdhcyBhIGxpdHRsZSBvdXQgb2YKCSAgICBjb250cm9sLiBUbyBydW4gc3RkX2NvbnRhaW5lcnMuaSBpbiB0aGUgcHl0aG9uIHRlc3Qtc3VpdGUsCgkgICAgc3dpZyB3YXMgdXNpbmcgfjI2ME1CLCBub3cgaXQgdXNlcyAnb25seScgfjQwTUIsIHdoaWNoIGlzCgkgICAgdGhlIHNhbWUgYW1tb3VudCB0aGF0IGcrKyB1c2VzLCBzbywgaXMgbm90IHRoYXQgYmFkLgoJICAgIEluIHRoZSBwcm9jZXNzLCBJIGZvdW5kIGEgY291cGxlIG9mIGV4dHJhIERlbGV0ZXMsIHdoaWNoCgkgICAgaW4gc29tZSBjYXNlcyBjb3VsZCB0cmlnZ2VyIHNlZy4gZmF1bHRzIGFuZC9vcgoJICAgIERPSC9hc3NlcnRzLgoJICAgIAoJICAgIFtweXRob25dIEJldHRlciBzdXBwb3J0IGZvciBkaXJlY3RvcnMgKyBleGNlcHRpb24uIE1vcmUKCSAgICB2ZXJib3NlIGVycm9ycyBhbmQgYWRkZWQgYW4gdW5leHBlY3RlZCBleGNlcHRpb24gaGFuZGxlci4KCgkgICAgW3B5dGhvbl0gRml4IG1lbW9yeSBsZWFrIGZvciB0aGUKCgkgICAgCSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxpbnQ+ID4gCgoJICAgIGNhc2UscmVwb3J0ZWQgYnkgQm8gUGVuZy4KCgkgICAgW3B5dGhvbl0gRml4IFN3aWdQeU9iamVjdCBjb21wYXJlIHByb2JsZW0gcmVwb3J0ZSBieQoJICAgIENhbWVyb24gUGF0cmljay4gCgoJICAgIFtweXRob25dIEZpeCBzZXZlcmFsIHdhcm5pbmdzIGluIHRoZSBnZW5lcmF0ZWQgY29kZSAKCSAgICBmb3IgZ251LWdjYywgSW50ZWwgYW5kIFZDNy4xICBjb21waWxlcnMuCgoKMDIvMjUvMjAwNTogd3V6emViIChKb2huIExlbnopCgkgICAgVXBkYXRlIGRvY3VtZW50YXRpb24gdG8gdXNlIENTUyBhbmQgPGRpdj4gaW5zdGVhZCBvZiA8YmxvY2txdW90ZT4KCSAgICBJIHVzZWQgYSBzY3JpcHQgdG8gY29udmVydCB0aGUgZG9jcywgYW5kIGl0IHNldCBhbGwgdGhlIGJveCBjbGFzc2VzCgkgICAgdG8gYmUgImNvZGUiLiAgVGhlcmUgYXJlIGFjdHVhbGx5IDQgZGlmZmVyZW50IGNsYXNzZXMsCgkgICAgInNoZWxsIiwgImNvZGUiLCAidGFyZ2V0bGFuZyIsIGFuZCAiZGlhZ3JhbSIuICBXZSBuZWVkIHRvIGdvIHRocm91Z2gKCSAgICBhbmQgY29udmVydCB0aGUgZGl2cyBkZXBlbmRpbmcgb24gd2hhdCB0aGV5IGNvbnRhaW4uCgowMi8yMy8yMDA1OiBtbWF0dXMKCgkgICAgW1B5dGhvbl0gQWRkZWQgb3B0aW9uIC1ub3J0dGkgdG8gZGlzYWJsZSB0aGUgdXNlIG9mIG5hdGl2ZQoJICAgIEMrKyBSVFRJIHdpdGggZGlyZWN0b3JzIChkeW5hbWljX2Nhc3Q8PiBpcyBub3QgdXNlZCkuCgoJICAgIEFkZCBtb3JlIGNvZGUgZm9yIGRpcmVjdG9ycyB0byBkZXRlY3QgYW5kIHJlcG9ydCBlcnJvcnMgaW4KCSAgICB0aGUgcHl0aG9uIHNpZGUuCgoJICAgIEV4dGVuZCB0aGUgdXNlIG9mIFNXSUdJTlRFUk4gd2hlbmV2ZXIgaXMgcG9zc2libGUuCgoJICAgIFJlbW92ZSB0ZW1wbGF0ZSB3YXJuaW5ncyByZXBvcnRlZCBieSBWQzcuMS4KCgkgICAgUmVtb3ZlIHdhcm5pbmdzIHJlcG9ydGVkIGJ5IGdjYy9nKysuIEZpbmFsbHkgeW91IGNhbgoJICAgIGNvbXBpbGUgdXNpbmcKCgkgICAgICAgZysrIC1XIC1XYWxsIC1jIG15bW9kdWxlX3dyYXAuY3h4CgoJICAgIGFuZCBubyBzcHVyaW91cyBlcnJvcnMgd2lsbCBiZSBnZW5lcmF0ZWQgaW4gdGhlIHdyYXBwZXIKCSAgICBjb2RlLgoKMDIvMjMvMjAwNTogd3V6emViIChKb2huIExlbnopCgkgICAgQWRkZWQgLWV4dGVybmFsLXJ1bnRpbWUgYXJndW1lbnQuICBUaGlzIGFyZ3VtZW50IGlzIHVzZWQgdG8gZHVtcAoJICAgIG91dCBhbGwgdGhlIGNvZGUgbmVlZGVkIGZvciBleHRlcm5hbCBhY2Nlc3MgdG8gdGhlIHJ1bnRpbWUgc3lzdGVtLAoJICAgIGFuZCBpdCByZXBsYWNlcyBpbmNsdWRpbmcgdGhlIGZpbGVzIGRpcmVjdGx5LiAgVGhpcyBjaGFuZ2UgYWRkcwoJICAgIHR3byBuZXcgdmlydHVhbCBmdW5jdGlvbnMgdG8gdGhlIExhbmd1YWdlIGNsYXNzLCB3aGljaCBhcmUgdXNlZAoJICAgIHRvIGZpbmQgdGhlIGxhbmd1YWdlIHNwZWNpZmljIHJ1bnRpbWUgY29kZS4gIEkgYWxzbyB1cGRhdGVkCgkgICAgYWxsIGxhbmd1YWdlcyB0aGF0IHVzZSB0aGUgcnVudGltZSB0byBpbXBsZW1lbnQgdGhlc2UgdHdvIGZ1bmN0aW9ucy4KCjAyLzIyLzIwMDU6IG1tYXR1cyAKCSAgICBGaXggJXRlbXBsYXRlICsgcHJpdmF0ZSBlcnJvciBTRiMxMDk5OTc2LgoKMDIvMjEvMjAwNTogbW1hdHVzIAoKCSAgICBGaXggc3dpZ3J1bi5zd2cgd2FybmluZ3MgcmVwb3J0ZWQgd2hlbiB1c2luZyAiZ2NjIC1XIC1XYWxsIgoJICAgIChzdGF0aWMvaW5saW5lIG5vdCB1c2VkIGluIGZyb250IG9mIGEgZnVuY3Rpb24KCSAgICBkZWNsYXJhdGlvbiksIGFuZCBhZGQgU1dJR1VOVVNFRCBhdHRyaWJ1dGUgdG8gYXZvaWQKCSAgICB1bnVzZWQgd2FybmluZ3MgZWxzZXdoZXJlLgoKCSAgICBGaXggdW51c2VkIHZhcmlhYmxlIHdhcm5pbmdzLgoKCSAgICBbUHl0aG9uXSBVc2UgbmV3IFNXSUdVTlVTRUQgYXR0cmlidXRlIHRvIGF2b2lkIHdhcm5pbmdzIGluCgkgICAgU1dJR0lOVEVSTiBtZXRob2RzLgoKCSAgICBbUHl0aG9uXSBGaXggUHlPU19zbnByaW50ZiBmb3IgcHl0aG9uIHZlcnNpb25zIDwgMi4yIChTRiAjMTEwNDkxOSkuCgoJICAgIFtQeXRob25dIEZpeCBtYXAvbXVsdGltYXAgdG8gYWxsb3cgZW1wdHkgbWFwcyAocmVwb3J0ZWQgYnkKICAJICAgIFBoaWxpcHBlIEhldHJveSkuCgoJICAgIFtEb2NzXSBBZGQgc29tZSBkb2N1bWVudGF0aW9uIHRvIFB5dGhvbi5odG1sIGFuZAoJICAgIFNXSUdQbHVzLmh0bWwsIGluY2x1ZGluZyBmb3IgZXhhbXBsZSB0aGUgZmFjdCB0aGF0CgkgICAgJ2ZyaWVuZHMnIGFyZSBub3cgc3VwcG9ydGVkLgoKMDIvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1BIUF0gUGF0Y2ggZnJvbSBPbGx5IEJldHRzLCBzbyB0aGF0IHdyYXBwZXJzIGNvbXBpbGUgd2l0aCBaZW5kIHRocmVhZCBzYWZldHkgZW5hYmxlZC4KCjAyLzE3LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIE1lbW9yeSBsZWFrIGZpeCBpbiBzb21lIG9mIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgbW9kdWxlcyB3aGVuIHVzaW5nIGRlZmF1bHQKICAgICAgICAgICAgYXJndW1lbnRzIGluIGNvbnN0cnVjdG9ycy4gVGhlIHNjcmlwdGluZyBsYW5ndWFnZSB3YXMgbm90IHRha2luZyBvd25lcnNoaXAgb2YgdGhlCiAgICAgICAgICAgIEMrKyBvYmplY3QgbWVtb3J5IHdoZW4gYW55IG9mIHRoZSBjb25zdHJ1Y3RvcnMgdGhhdCB1c2UgZGVmYXVsdCBhcmd1bWVudHMgd2FzIGNhbGxlZC4KCjAyLzE2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFNGICMxMTE1MDU1OiBGYWlsZWQgbWFrZSBpbnN0YWxsLiBQYXRjaCBmcm9tIFJvYiBTdG9uZS4KCjAyLzE2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBTRiAjMTEyMzQxNiBmcm9tIFBhdWwgTW9vcmUuIENvcnJlY3QgbWVtb3J5IGFsbG9jYXRpb24gZm9yIFNUUklOR0FSUkFZCiAgICAgICAgICAgIHR5cGVtYXBzIGluIHZhcmlvdXMuaS4KCjAyLzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIERpc2FibGVkIHR5cGVtYXAgc2VhcmNoIGNoYW5nZXMgZm9yIG5vdyAoc2VlIGVudHJ5IDE5LzEyLzIwMDQpLiBJdCBicmVha3MKICAgICAgICAgICAgb2xkIHR5cGVtYXBzLCBsZW5ndGhlbnMgdGhlIGV4ZWN1dGlvbiB0aW1lIGJ5IGFib3V0IDI1JSBhbmQgaW50cm9kdWNlcwogICAgICAgICAgICBpbmNvbnNpc3RlbmNpZXMuCgowMi8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBzd2lnIC1oZWxwIGZvbGxvd3Mgb3RoZXIgc29mdHdhcmUgYnkgcHJpbnRpbmcgdG8gc3Rkb3V0IGluc3RlYWQgb2Ygc3RkZXJyIG5vdy4KICAgICAgICAgICAgc3dpZyAtdmVyc2lvbiBhbHNvIGRpc3BsYXlzIHRvIHN0ZG91dCBpbnN0ZWFkIG9mIHN0ZGVyciBub3cuCiAgICAgICAgICAgIEJlaGF2aW91ciByZXBvcnRlZCBieSBUb3JzdGVuIExhbmRzY2hvZmYuCgowMi8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gRml4IGZvciB0aGUgbGVzcyBjb21tb25seSB1c2VkIG9yZGVyaW5nIG9mICVpbmNsdWRlIGFuZCAjaW5jbHVkZSwgc28KICAgICAgICAgICAgdGhhdCB0aGUgZ2VuZXJhdGVkIGNvZGUgY29tcGlsZXMuIEJ1ZyByZXBvcnRlZCBieSByZXBvcnRlZCBieSBNYXggQm93c2hlci4KICAgICAgICAgICAgICAlaW5jbHVkZSBmb28uaAogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgI2luY2x1ZGUgZm9vLmgKICAgICAgICAgICAgICAlfSAKCjAyLzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gU1dJR19leGNlcHRpb24gbWFjcm8gd2lsbCBub3cgcmV0dXJuIGZyb20gdW5tYW5hZ2VkIGNvZGUgLyBuYXRpdmUgY29kZQogICAgICAgICAgICBhcyBzb29uIGFzIGl0IGlzIGNhbGxlZC4gRml4ZXMgcG9zc2libGUgSlZNIGNyYXNoZXMgYW5kIG90aGVyIGNvZGUgdW5leHBlY3RlZGx5CiAgICAgICAgICAgIGJlaW5nIGV4ZWN1dGVkLiBOb3RlIFNXSUdfZXhjZXB0aW9uIGlzIG9ubHkgb2NjYXNpb25hbGx5IHVzZWQgYnkgU1dJRyBsaWJyYXJ5CiAgICAgICAgICAgIHdyaXRlcnMsIGFuZCBpcyBiZXN0IGF2b2lkZWQgYnkgU1dJRyB1c2Vycy4KCjAyLzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gVHlwZW1hcHMgY2FuIG5vdyBiZSB0YXJnZXRlZCBhdCBnbG9iYWwgdmFyaWFibGUgbmFtZXMKICAgICAgICAgICAgYW5kIHN0YXRpYyBtZW1iZXIgdmFyaWFibGUgbmFtZXMuIFByZXZpb3VzbHkgdGhlIHR5cGVtYXBzIGZvciAKICAgICAgICAgICAgdGhlIHNldHRlcnMgd2VyZSBpZ25vcmVkLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludCBnbG9iYWxpbnQgIi4uLiIKICAgICAgICAgICAgICBpbnQgZ2xvYmFsaW50OwoKMDIvMTMvMjAwNTogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gQWRkICV0eXBlY2hlY2sgZm9yIFNXSUdUWVBFLCBhZGQgJXR5cGVjaGVjayBmb3IgcHRyZGlmZl90LCBmaXgKCSAgICB0eXBlbWFwcyBmb3Igc2l6ZV90LgoKCSAgICBbUGlrZV0gTWVyZ2UgcGF0Y2ggZnJvbSBUb3JzdGVuIExhbmRzY2hvZmYgZm9yIGltcHJvdmVkIFBpa2UgY29uZmlndXJhdGlvbi4KCjAyLzEyLzIwMDU6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBOZXcgY29uZmlndXJlIHN3aXRjaGVzIC0td2l0aG91dC10Y2wsIC0td2l0aG91dC1weXRob24gZXRjLiBhbGxvdyB0bwogICAgICAgICAgICBkaXNhYmxlIHRoZSBzZWFyY2ggZm9yIGluc3RhbGxlZCBsYW5ndWFnZXMuCgowMS8zMS8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgLSBBZGQgRG9oU29ydExpc3QgdG8gRE9ICgkgICAgCgkgICAgLSBJbXByb3ZlIHRoZSBydW50aW1lIHR5cGUgc3lzdGVtOgogICAgICAgICAgICAgICArIFNwZWVkLiBUeXBlIGxvYWRpbmcgaXMgbm93IE8obiBsb2cgbikgaW5zdGVhZCBvZiBPKE5eMiksIHdoaWNoCgkgICAgICAgICBmb3IgbGFyZ2UgbW9kdWxlcyBpcyBhIGh1Z2UgaW1wcm92ZW1lbnQuCiAgICAgICAgICAgICAgICsgQSB3aG9sZSBidW5jaCBvZiBmdW5jdGlvbnMgaW4gc3dpZ3J1bi5zd2cgbm8gbG9uZ2VyIG5lZWQgdGhlIAogICAgICAgICAgICAgICAgIHN3aWdfdHlwZV9saXN0X2hhbmRsZSBwYXNzZWQgdG8gdGhlbS4gIFRoZSBvbmx5IG9uZSBsZWZ0IGlzIAoJCSBUeXBlUXVlcnkuICBUaGlzIGFsc28gbWFrZXMgcnVudGltZS5zd2cgYSBsb3Qgc21hbGxlci4KCSAgICAgICArIFNwbGl0IHVwIHN3aWdfdHlwZV9pbmZvIHN0cnVjdHVyZSBpbnRvIHR3byBzdHJ1Y3R1cmVzCgkgICAgICAgICAoc3dpZ190eXBlX2luZm8gYW5kIHN3aWdfY2FzdF9pbmZvKQoJICAgICAgICsgU3RvcmUgYSBwb2ludGVyIHRvIGEgc3dpZ190eXBlX2luZm8gcmF0aGVyIHRoYW4ganVzdCB0aGUgdHlwZQoJICAgICAgICAgbmFtZSBzdHJpbmcgaW4gdGhlIGxpbmtlZCBsaXN0IG9mIGNhc3RzLiBGaXJzdCBvZmYsIHRoaXMgbWFrZXMKCSAgICAgICAgIHRoZSBndWlsZSBtb2R1bGUgYSBsaXR0bGUgZmFzdGVyLCBhbmQgc2Vjb25kLCB0aGUKCSAgICAgICAgIFNXSUdfVHlwZUNsaWVudERhdGEoKSBmdW5jdGlvbiBpcyBmYXN0ZXIgdG9vLiAKCSAgICAgICArIEFkZCB0aGUgaWRlYSBvZiBhIG1vZHVsZSBpbnRvIHRoZSB0eXBlIHN5c3RlbS4gIEJlZm9yZSwgYWxsIHRoZQoJICAgICAgICAgdHlwZXMgd2VyZSBzdG9yZWQgaW4gb25lIGh1Z2UgbGlua2VkIGxpc3QuIE5vdywgYW5vdGhlciBsZXZlbCBpcwoJICAgICAgICAgYWRkZWQsIGFuZCB0aGUgdHlwZSBzeXN0ZW0gc3RvcmVzIGEgbGlua2VkIGxpc3Qgb2YgbW9kdWxlcywgZWFjaAoJICAgICAgICAgb2Ygd2hpY2ggc3RvcmVzIGFuIGFycmF5IG9mIHR5cGVzIGFzc29jaWF0ZWQgd2l0aCBpdC4KCSAgICAgICArIEZvciBtb3JlIGluZm9ybWF0aW9uIG9mIGhvdyB0aGUgcnVudGltZSB0eXBlIHN5c3RlbSBub3cgd29ya3MsCgkgICAgICAgICBwbGVhc2Ugc2VlIERvYy9NYW51YWwvdHlwZW1hcHMuaHRtbCBhbmQgRG9jL0RldmVsL3J1bnRpbWUudHh0CgkJIAoJICAgIC0gVXBkYXRlIGFsbCBsYW5ndWFnZSBtb2R1bGVzIHRvIHVzZSB0aGUgbmV3IHR5cGUgc3lzdGVtLiAgVGhlIGNoYW5nZXMKCSAgICAgIHRvIGVhY2ggbGFuZ3VhZ2UgbW9kdWxlIGFyZSBtaW5vci4gIEFsbCBsYW5ndWFnZXMgYXJlIG5vdyBhYmxlIHRvCgkgICAgICB1c2UgcnVudGltZS5zd2cgZm9yIGV4dGVybmFsIGFjY2VzcyB0byB0aGUgdHlwZSBzeXN0ZW0uICBCZWZvcmUKCSAgICAgIG9ubHkgcHl0aG9uIGFuZCBwZXJsIGRpZC4KCgkgICAgLSBbZ3VpbGUsIG16c2NoZW1lLCBvY2FtbCwgYW5kIHBocDRdICBUaGVzZSBsYW5ndWFnZXMgb3BlbmVkIHVwIHRoZQoJICAgICAgaW5pdCBmdW5jdGlvbiBpbnNpZGUgdGhlIC5jeHggY29kZSwgYW5kIGFueSBjb2RlIGluIHRoZSAuc3dnIGZpbGVzCgkgICAgICBpbiB0aGUgaW5pdCBzZWN0aW9uIHdhcyBpbnNpZGUgdGhpcyBmdW5jdGlvbi4gIFRoaXMgd2FzIGEgcHJvYmxlbQoJICAgICAgZm9yIHN3aWdpbml0LnN3Zywgd2hpY2ggbmVlZHMgdG8gYmUgaW5zZXJ0ZWQgYmVmb3JlIHRoZSBTV0lHX2luaXQKCSAgICAgIGZ1bmN0aW9uIGlzIG9wZW5lZC4gIFRodXMgSSBjaGFuZ2VkIHRoZXNlIGxhbmd1YWdlcyB0byBiZSBsaWtlCgkgICAgICBweXRob24gb3IgcGVybCwgd2hlcmUgdGhlIGluaXQgZnVuY3Rpb24gaXMgZGVjbGFyZWQgaW4gdGhlIC5zd2cKCSAgICAgIGZpbGUuCgkgICAgICAKCSAgICAtIFtSdWJ5XSBJbnN0ZWFkIG9mIG1vdmluZyB0aGUgaW5pdCBmdW5jdGlvbiB0byB0aGUgLnN3ZyBmaWxlLCBJCgkgICAgICBhZGRlZCBhIG5ldyBzZWN0aW9uIGluaXRiZWZvcmVmdW5jLCBhbmQgdGhlbiBhZGRlZAoJICAgICAgJWluc2VydChpbml0YmVmb3JlZnVuYykgInN3aWdpbml0LnN3ZyIKCgkgICAgLSBbTXpTY2hlbWVdIEZpeCBlbnVtcyBhbmQgZml4IEV4YW1wbGVzL01ha2VmaWxlLmluIHNvIHRoYXQgaWYKCSAgICAgIG11bHRpcGxlIC1JIGFyZ3VtZW50cyBhcmUgc3BlY2lmaWVkIGluIHRoZSBJTkNMVURFUyB2YXJpYWJsZSwgZWFjaAoJICAgICAgZ2V0cyBhICsrY2NmLgoKCSAgICAtIFtHdWlsZSBHSF0gVXBkYXRlIEd1aWxlIEdIIHRvIHVzZSB0aGUgbmV3IHR5cGUgc3lzdGVtLiAgU2VlCgkgICAgICBEb2MvTWFudWFsL0d1aWxlLmh0bWwgZm9yIGhvdyBzbW9icyBhcmUgbm93IHVzZWQuCgowMS8xMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIE5ldyB0eXBlbWFwIGNhbGxlZCAnY3Njb25zdHJ1Y3QnLiBUaGUgY29kZSBpbiB0aGlzIHR5cGVtYXBzIHdhcyBwcmV2aW91c2x5IGhhcmQKICAgICAgICAgICAgY29kZWQgYW5kIGNvdWxkIG5vdCBiZSBjdXN0b21pc2VkIGJ5IGEgdXNlci4gVGhpcyB0eXBlbWFwIGNvbnRhaW5zIHRoZSBjb2RlIHRoYXQgaXMKICAgICAgICAgICAgZ2VuZXJhdGVkIGludG8gYSBwcm94eSBjbGFzcydzIGNvbnN0cnVjdG9yLgoKICAgICAgICAgICAgW0phdmFdIE5ldyB0eXBlbWFwIGNhbGxlZCAnamF2YWNvbnN0cnVjdCcuIFRoZSBjb2RlIGluIHRoaXMgdHlwZW1hcHMgd2FzIHByZXZpb3VzbHkgaGFyZAogICAgICAgICAgICBjb2RlZCBhbmQgY291bGQgbm90IGJlIGN1c3RvbWlzZWQgYnkgYSB1c2VyLiBUaGlzIHR5cGVtYXAgY29udGFpbnMgdGhlIGNvZGUgdGhhdCBpcwogICAgICAgICAgICBnZW5lcmF0ZWQgaW50byBhIHByb3h5IGNsYXNzJ3MgY29uc3RydWN0b3IuIEFub3RoZXIgdHlwZW1hcCBuYW1lZCAnamF2YWNvbnN0cnVjdF9kaXJlY3RvcicKICAgICAgICAgICAgaXMgdXNlZCBpbnN0ZWFkIHdoZW4gdGhlIHByb3h5IGNsYXNzIGlzIGEgZGlyZWN0b3IgY2xhc3MuCgogICAgICAgICAgICBbQyMsIEphdmFdIElmIGEgQysrIGNsYXNzIGRpZCBub3QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3IsIGEgcHJvdGVjdGVkIGRlZmF1bHQgY29uc3RydWN0b3IKICAgICAgICAgICAgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IFNXSUcuIFRoaXMgc2VlbXMgaXMgdW5uZWNlc3NhcnkgYW5kIGhhcyBiZWVuIHJlbW92ZWQKICAgICAgICAgICAgYW5kIHRoZXJlYnkgZ2l2aW5nIHRoZSB1c2VyIGFsbW9zdCBjb21wbGV0ZSBjb250cm9sIG92ZXIgdGhlIGdlbmVyYXRlZCBjb2RlIGFsb25nIHdpdGggdGhlCiAgICAgICAgICAgIG5ldyB0eXBlbWFwcyBhYm92ZS4KCjE5LzEyLzIwMDQ6IG1tYXR1cwogICAgICAgICAgICBbRGlzYWJsZWQsIHNlZSBlbnRyeSAwMi8xNS8yMDA0XQogICAgICAgICAgICAtIEZpeCB0eXBlbWFwIHNlYXJjaCwgbm93IHRoZSAib3V0IiB0eXBlbWFwIHNlYXJjaCBpcyBkb25lIGFzIGZvbGxvd3MKCiAgICAgICAgICAgICAgICAgaW50ICpGb286OmZvbyhpbnQgYmFyKSAgIC0+ICBpbnQgKkZvbzo6Zm9vKGludCBiYXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBpbnQgKkZvbzo6Zm9vCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBpbnQgKmZvbyhpbnQgYmFyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgaW50ICpmb28KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIGludCAqCgogICAgICAgICAgICAgICB0aGVuLCBub3cgeW91IGNhbiBiZSBtb3JlIHNwZWNpZmljLCBhbmQgZGVmaW5lCgogICAgICAgICAgICAgIC8qIGFwcGx5IG9ubHkgZm9yICAnRm9vOjpmb28nIG1ldGhvZCAqLwogICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgaW50ICogRm9vOjpmb28oaW50ICpiYXIpIC4uLjsgCgogICAgICAgICAgICAgIC8qIGFwcGx5IGZvciBhbGwgJ2ZvbycgZnVuY3Rpb25zL21ldGhvZHMgKi8KICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIGludCAqIGZvbyhpbnQgKmJhcikgLi4uOyAKCiAgICAgICAgICAgICAgJWlubGluZSB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgIGludCAqZm9vKGludCAqYmFyKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgfQoJICAKCjE1LzEyLzIwMDQ6IG1tYXR1cwogICAgICAgICAgICAtIE1vcmUgZml4ZXMgZm9yIHRlbXBsYXRlcyBhbmQgdGVtcGxhdGUgZGVmYXVsdCBhcmdzLgogICAgICAgICAgICAgIFNlZSB0ZW1wbGF0ZV9kZWZhdWx0LmkgZm9yIHNjYXJ5IGNhc2VzIHRoYXQgbm93IGFyZSAKICAgICAgICAgICAgICBzdXBwb3J0ZWQsIGJlc2lkZXMgdGhlIGFscmVhZHkgdWdseSBTVEwvc3RkIGNhc2VzLgogICAgICAgICAgICAgIAogICAgICAgICAgICAtIENvc21ldGljcyBhbmQgbW9yZSB1c2Ugb2YgJ2NvbnN0JyB3aGVyZSBpdCB3YXMgaW1wbGljaXQuCiAgICAgICAgICAgIC0gT3RoZXIgZml4ZXMgZm9yIE9TUywgd2hpY2ggaXMgbm93IHdvcmtpbmcgYWdhaW4gd2l0aCAxLjMuMjUuCgkKVmVyc2lvbiAxLjMuMjQgKERlY2VtYmVyIDE0LCAyMDA0KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMi8xMi8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW0NoaWNrZW5dIEZpeCBhIGJ1bmNoIG9mIGJ1Z3MgcmVsYXRpbmcgdG8gLXByb3h5IHN1cHBvcnQKCSAgICAgICsgbm9uLWNsYXNzIHZhcmlhYmxlcyBub3cgZXhwb3J0IHByb3Blcmx5IHVzaW5nIC1wcm94eQoJICAgICAgKyBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9ucyBub3cgZXhwb3J0IHByb3Blcmx5IHVzaW5nIC1wcm94eQoJICAgICAgKyBtZW1iZXIgY2xhc3MgdmFyaWFibGVzIG5vdyBleHBvcnQgcHJvcGVybHkgdXNpbmcgLXByb3h5CgkgICAgICArIGFkZGVkIGEgLW5vdW5pdCBhcmd1bWVudCwgd2hpY2ggZG9lcyBub3QgZXhwb3J0IHRoZSAoZGVjbGFyZSAodW5pdCAuLi4pKQoJICAgICAgKyBjb3JyZWN0bHkgaW5zdGFsbCBzd2lnY2xvc3ByZWZpeC5zY20KCSAgICAgICsgY29uc3RhbnRzIChlbnVtcywgZGVmaW5lcykgbm93IGNvcnJlY2x5IGV4cG9ydCB3aGVuIHVzaW5nIC1wcm94eQoKMTIvMTEvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgY29uZmlndXJlIGZpeCBmb3Igd2hlbiBtb3JlIHRoYW4gb25lIHZlcnNpb24gb2Ygam5pX21kLmggaXMgZm91bmQKICAgICAgICAgICAgaW4gdGhlIEphdmEgaW5jbHVkZSBkaXJlY3RvcnkgKHdhcyBnZW5lcmF0aW5nIGxvdHMgb2Ygc2VkIGVycm9yCiAgICAgICAgICAgIG1lc3NhZ2VzKS4KCjEyLzA4LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXhlcyB0byBhcnJheXNfamF2YS5pIHNvIHRoYXQgb25lIGNhbiBhcHBseSB0aGUgYXJyYXkKICAgICAgICAgICAgdHlwZW1hcHMgdG8gZnVuY3Rpb25zIHRha2luZyBwb2ludGVycyBhcyBpbnB1dCwgZWcKCiAgICAgICAgICAgICAgICAlaW5jbHVkZSAiYXJyYXlzX2phdmEuaSIKICAgICAgICAgICAgICAgICVhcHBseSBpbnRbXSB7aW50Kn07CiAgICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgKmEpOwoKMTIvMDUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIERpcmVjdG9yIG1vZHMgY29udHJpYnV0ZWQgYnkgU2NvdHQgTWljaGVsLiBOZXcgdHlwZW1hcHMKICAgICAgICAgICAgZGlyZWN0b3JkaXNjb25uZWN0IGFuZCBkaXJlY3RvcmRpc2Nvbm5lY3RfZGVyaXZlZCBmb3IgdGhlIAogICAgICAgICAgICBzd2lnRGlyZWN0b3JEaXNjb25uZWN0KCkgbWV0aG9kLiBBbHNvIGZpeCB0byBnZXQgdGhlIGphdmFwYWNrYWdlCiAgICAgICAgICAgIHR5cGVtYXAgd29ya2luZyBhZ2Fpbi4KCjEyLzA1LzIwMDQ6IG1tYXR1cwoJICAgIC0gRmluaXNoaW5nIHRoZSBmaXhlcyBmb3IgdGVtcGxhdGVzICsgZGVmYXVsdCB0ZW1wbGF0ZQoJICAgICAgYXJncyArIHNwZWNpYWxpemF0aW9ucy4KCiAgICAgICAgICAgIC0gW1B5dGhvbl0gTm93IHdlIHVzZSB0aGUgbmV3IHRlbXBsYXRlcyArIGRlZmF1bHQgdGVtcGxhdGUKCSAgICAgIGFyZ3MgaW4gdGhlIHN0ZC9TVEwgbGlicmFyeS4gVGhhdCBtZWFucyB0aGUgaW50ZXJuYWwKCSAgICAgIHN3aWcgZmlsZXMgYXJlIGdldHRpbmcgdWdsaWVyIHNpbmNlIHdlIG5vdyBzdXBwb3J0IHRoZQoJICAgICAgb3JpZ2luYWwgZGVjbGFyYXRpb25zOgoKCSAgICAgICAgdGVtcGxhdGU8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjwgX1RwID4gPgoJCWNsYXNzIHZlY3RvciB7CgkJLi4uLgoJCX07CgkgICAgICAJICAgICAKICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUgPSBzdGQ6Omxlc3M8X0tleSA+LAoJICAgICAgICBjbGFzcyBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwID4gPiA+CiAgICAgICAgICAgICAgICBjbGFzcyBtYXAgewoJCS4uLi4KCQl9OwogCiAgICAgICAgICAgICAgYW5kIHRoZSB1c2VyIGNhbiB1c2UgdGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgYXMKCgkgICAgICAgICV0ZW1wbGF0ZSgpIHN0ZDo6dmVjdG9yPGludD47CgkgICAgICAgICV0ZW1wbGF0ZSgpIHN0ZDo6dmVjdG9yPGludCwgc3RkOjphbGxvY2F0b3I8aW50PiA+OwoJICAgICAgICAldGVtcGxhdGUoKSBzdGQ6OnZlY3RvcjxpbnQsIE15QWxsb2NhdG9yPGludD4gPjsKCiAgICAgICAgICAgICAgTm93IHdlIGFyZSBjbG9zZXIgdG8gdGhlIGNsZWFuaW5nL3Jld3JpdGluZyBvZiB0aGUKCSAgICAgIHB5dGhvbiBzdGQvU1RMIHN1cHBvcnQsIHN1Y2ggdGhhdCB3ZSByZWNvdmVyIHN1cHBvcnQgZm9yCgkgICAgICBNU1ZDKysgNi4wLCBhbmQgd2UgY2FuIGFkZCBzdXBwb3J0IGZvciBvdGhlciBsYW5ndWFnZXMKCSAgICAgIHRvby4KCgoxMi8wMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IGZvciBkaXJlY3RvcnMgd2hlbiB3cmFwcGluZyBtZXRob2RzIHVzaW5nIGEgbWVtYmVyIGVudW0KICAgICAgICAgICAgYW5kIHR5cGVzYWZlL3Byb3BlciBlbnVtcyBlbmFibGVkLgoKMTIvMDEvMjAwNDogbW1hdHVzCgkgICAgLSBGaXggdHlwZW1hcHMgdG8gd29yayB3aXRoIHRlbXBsYXRlcyBhbmQgZGVmYXVsdCB0ZW1wbGF0ZQoJICAgICAgYXJncywgaWUKCgkgICAgICAgdGVtcGxhdGUgPGNsYXNzIEEsIGNsYXNzIEIgPSBpbnQ+CiAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewoJICAgICAgIH07CgoJICAgICAgICV0eXBlbWFwKGluKSBGb288aW50PiAqey4uLn0KCSAgICAgICAldHlwZW1hcChvdXQpIEZvbzxpbnQsaW50PiAqey4uLn0KCgkgICAgICAgRm9vPGludD4gKiBmb28oIEZvbzxpbnQ+ICpmMSwgRm9vPGludCxpbnQ+ICpmMik7CgoJICAgICAgbm93ICdmMScsICdmMicgYW5kIHRoZSByZXR1cm4gdmFsdWUgcmVzb2x2ZSB0aGUgcHJvdmlkZWQKCSAgICAgIHR5cGVtYXBzIHByb3Blcmx5LgoKCSAgICAgIFRoaXMgaXMgaGlnaGx5IG5lZWRlZCBmb3IgcHJvcGVyIFNUTCBzdXBwb3J0LCBzZWUgbmV3IAoJICAgICAgc3RkX2Jhc2ljX3N0cmluZy5pLCBzdGRfc3N0cmVhbS5pLCBldGMuCgoJICAgIC0gQWRkZWQgc3RkX3NzdHJlYW0uaSwgYW5kIGZpeCBzdGRfYmFzaWNfc3RyaW5nLmkgdG8gdXNlCgkgICAgICB0aGUgbmV3IHR5cGVtYXBzICsgdGVtcGxhdGUgZGVmLiBhcmcgbWVjaGFuaXNtLiBBbHNvLAoJICAgICAgYWRkZWQgdGhlIG5lZWRlZCBzdGRfYWxsb2MuaS4gTm93LCBhbGwgdGhlIGNvbnRhaW5lcnMKCSAgICAgIGNhbiBiZSBtb2RpZmllZCB0byBzdXBwb3J0IHN0ZDo6YWxsb2NhdG9yLCBsaWtlIGluOgoJICAgICAgCgkgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIEEgPSBzdGQ6OmFsbG9jYXRvcjxUID4gPgoJCWNsYXNzIHZlY3RvciB7CgkJcHVibGljOgoJCS4uLi4KCQl9OwoJICAgICAgCgkgICAgICBUaGlzIGNoYW5nZSBpcyBvbmx5IGNvbXBsZXRlZCBieSBub3cgZm9yIGJhc2ljX3N0cmluZy4KCgkgICAgLSBGaXggZm9yIHNtYXJ0IHBvaW50ZXJzICsgbWVtYmVycyArIGV4dGVuc2lvbnM6CgoJICAgICAgJWV4dGVuZCBGb28gewoJICAgICAgICBpbnQgZXh0ZW5zaW9uKGludCBpLCBpbnQgaikgeyByZXR1cm4gaTsgfQoJCWludCBleHRlbnNpb24oKSB7IHJldHVybiAxOyB9CgkgICAgICB9CgoJICAgICAgJWlubGluZSAlewoKCSAgICAgIGNsYXNzIEZvbyB7CgkgICAgICBwdWJsaWM6CgkJaW50IHk7CgkJc3RhdGljIGNvbnN0IGludCB6OwoJICAgICAgfTsKICAKCSAgICAgIGNsYXNzIEJhciB7CgkgICAgICAgIEZvbyAqZjsKCSAgICAgIHB1YmxpYzoKCSAgICAgICAgQmFyKEZvbyAqZikgOiBmKGYpIHsgfQoJCUZvbyAqb3BlcmF0b3ItPigpIHsKCQkgIHJldHVybiBmOwoJCX0KCSAgICAgIH07CgoJICAgICAgbm93IHlvdSBjYW4gCgkgICAgIAoJICAgICAgZiA9IEZvbygpCgkgICAgICBmLnkgPSAzCgkgICAgICBhID0gZi56CgkgICAgICBmLT5leHRlbnNpb24oKQogCgkgICAgICBiID0gQmFyKGYpCgkgICAgICBiLnkgPSAzCgkgICAgICBhID0gYi56CgkgICAgICBiLT5leHRlbnNpb24oKQoKCSAgICAtIE90aGVyIHNtYWxsIGVycm9ycyBmaXhlcywgbW9zdGx5IHB5dGhvbi4KCjExLzI1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBOdW1lcm91cyBkaXJlY3RvciBidWcgZml4ZXMgc28gdGhhdCB0aGUgY29ycmVjdCBqYXZhIHR5cGVzCiAgICAgICAgICAgIGFuZCBjYW5vbmljYWxpemVkIHR5cGVzIGluIHRoZSBKTkkgY29kZSBhcmUgZW1pdHRlZC4gVXNlIG9mIHRoZQogICAgICAgICAgICAkamF2YWNsYXNzbmFtZSBzcGVjaWFsIHZhcmlhYmxlcyBpbiB0aGUgZGlyZWN0b3IgdHlwZW1hcHMgbm93CiAgICAgICAgICAgIGNvbnNpc3RlbnQgd2l0aCB0aGUgbm9uLWRpcmVjdG9yIHR5cGVtYXBzLiBUaGUgdHlwZXMgdXNlZCBmb3IgCiAgICAgICAgICAgIHR5cGVtYXAgbG9va3VwcyBhcmUgYWxzbyBjb3JyZWN0ZWQgaW4gYSBmZXcgcGxhY2VzLiBJZiB5b3UgCiAgICAgICAgICAgIHByZXZpb3VzbHkgaGFkIHlvdXIgb3duIGRpcmVjdG9yIHR5cGVtYXBzLCBlbnN1cmUgdGhleSBhcmUgdXNpbmcgdGhlCiAgICAgICAgICAgIGNvcnJlY3QgQysrIHR5cGUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBESVJFQ1RPUlMgKioqCgoxMS8yNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBjb25zdCBlbnVtIFNXSUdUWVBFICYgdHlwZW1hcHMgYWRkZWQuIFRoZXNlIHdyYXAgY29uc3QgZW51bSByZWZlcmVuY2VzCiAgICAgICAgICAgIGFzIGlmIHRoZXkgd2VyZSBwYXNzZWQgYnkgdmFsdWUuIENvbnN0IGVudW0gcmVmZXJlbmNlcyB0aHVzIHdvcmsgdGhlCiAgICAgICAgICAgIHNhbWUgYXMgY29uc3QgcmVmZXJlbmNlIHByaW1pdGl2ZSB0eXBlcyBzdWNoIGFzIGNvbnN0IGRvdWJsZSAmLCAKICAgICAgICAgICAgY29uc3QgaW50ICYgZXRjLiBUeXBlbWFwcyBhZGRlZCBmb3IgSmF2YSwgQyMsIFJ1YnksIFRjbCwgUGVybCBhbmQgUGlrZS4KCjExLzI1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gTmV3IHNwZWNpYWwgdmFyaWFibGU6ICQqamF2YWNsYXNzbmFtZSwgc2ltaWxhciB0byAkamF2YWNsYXNzbmFtZQogICAgICAgICAgICBhbmQgJCZqYXZhY2xhc3NuYW1lLiBUaGUgbmV3IG9uZSByZW1vdmVzIGEgcG9pbnRlciBmcm9tIHRoZSBDIHR5cGUgYmVmb3JlCiAgICAgICAgICAgIG9idGFpbmluZyB0aGUgSmF2YSBjbGFzcyBuYW1lLiBPbmUgb3IgbW9yZSBvZiAkamF2YWNsYXNzbmFtZSwKICAgICAgICAgICAgJCZqYXZhY2xhc3NuYW1lIG9yICQqamF2YWNsYXNzbmFtZSBtYXkgbm93IGFwcGVhciBpbiBhIHR5cGVtYXAuIExpa2V3aXNlIGZvcgogICAgICAgICAgICBDIyB1c2luZyBjc2NsYXNzbmFtZSBpbnN0ZWFkIG9mIGphdmFjbGFzc25hbWUuCgoxMS8yNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBUaGUgbGFzdCB2ZXN0aWdlcyBvZiBlbnVtcyBiZWluZyBoYW5kbGVkIGFzIGludGVnZXJzIHJlbW92ZWQgZnJvbSB0aGUKICAgICAgICAgICAgaW50ZXJuYWxzLiBUaGUgd3JhcHBlciBtZXRob2RzIHVzZSB0aGUgZW51bSB0eXBlIHJhdGhlciB0aGFuIGFuIGludAogICAgICAgICAgICBub3cuIFRoZSBuZXQgcmVzdWx0IGlzIGFkZGVkIHR5cGUgc2FmZXR5IGZvciBlbnVtcyB3aGVuIGhhbmRsZWQgYXMKICAgICAgICAgICAgcG9pbnRlcnMsIHJlZmVyZW5jZXMgZXRjLiBQcmV2aW91c2x5IGluIHNpdHVhdGlvbnMgc3VjaCBhcyBhIG1ldGhvZAogICAgICAgICAgICB0YWtpbmcgYSBwb2ludGVyIHRvIGFuIGVudW0sIGEgcG9pbnRlciB0byBhbiBpbnQgb3IgYSBwb2ludGVyIHRvIGFuCiAgICAgICAgICAgIGVudW0gb2Ygc29tZSBvdGhlciB0eXBlIGNvdWxkIGluYWR2ZXJ0YW50bHkgYmUgcGFzc2VkIHRvIHRoZSBtZXRob2QuCiAgICAgICAgICAgIFRoaXMgaXMgbm93IGZpeGVkIGFzIHRoZSBkZXNjcmlwdG9yIGZvciBhbiBlbnVtIGlzIG5vIGxvbmdlciBiYXNlZCBvbgogICAgICAgICAgICBhbiBpbnQsIGJ1dCB0aGUgZW51bSB0eXBlIGluc3RlYWQuIEFub255bW91cyBlbnVtcyBhcmUgc3RpbGwgaGFuZGxlZAogICAgICAgICAgICBhcyBpbnRlZ2Vycy4KCiAgICAgICAgICAgIFRoZSBjb25zZXF1ZW5jZSBmb3Igc2NyaXB0aW5nIGxhbmd1YWdlIHVzZXJzIGluIGNvcnJlY3QgdXNhZ2Ugb2YgZW51bXMKICAgICAgICAgICAgc2hvdWxkIG5vdCBiZSBub3RpY2VhYmxlLiBUaGVyZSBpcyBubyBjaGFuZ2UgZm9yIGFueSBvZiB0aGUgbGFuZ3VhZ2VzCiAgICAgICAgICAgIHdoZXJlIGVudW1zIGFyZSBwYXNzZWQgYnkgdmFsdWUgLSBtb3N0IG9mIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2VzIHdpbGwKICAgICAgICAgICAgc3RpbGwgYWNjZXB0IGFuIGludGVnZXIgZm9yIGFuIGVudW0gdmFsdWUgYW5kIHRoZSBzdHJvbmdseSB0eXBlZAogICAgICAgICAgICBsYW5ndWFnZXMgc3RpbGwgdXNlIGVpdGhlciB0eXBlc2FmZSBlbnVtcywgaW50ZWdlcnMgb3IgcHJvcGVyIGVudW1zCiAgICAgICAgICAgIGRlcGVuZGluZyBvbiB3aGF0IHRoZSB1c2VyIGNvbmZpZ3VyZXMuIEZvciBKYXZhIGFuZCBDIyB1c2VycyBhIGNoYW5nZQogICAgICAgICAgICBpbiB0aGUgdHlwZXdyYXBwZXIgY2xhc3MgbmFtZSBoYXMgb2NjdXJyZWQgKGZvciBlbnVtIHBvaW50ZXJzLAogICAgICAgICAgICByZWZlcmVuY2VzIGV0YykuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBlbnVtIE51bWJlcnMgeyBvbmU9MSwgdHdvIH07CiAgICAgICAgICAgICAgZW51bSBOdW1iZXJzKiBudW1iZXIoKTsKCiAgICAgICAgICAgIEluIEphdmEgYW5kIEMjIHRoaXMgbXVzdCBub3cgYmUgY29kZWQgYXMKCiAgICAgICAgICAgICAgU1dJR1RZUEVfcF9OdW1iZXJzIG4gPSBtb2R1bGVuYW1lLm51bWJlcigpOwoKICAgICAgICAgICAgcmF0aGVyIHRoYW4KCiAgICAgICAgICAgICAgU1dJR1RZUEVfcF9pbnQgbiA9IG1vZHVsZW5hbWUubnVtYmVyKCk7CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjExLzIxLzIwMDQ6IHdzZnVsdG9uL21tYXR1cwogICAgICAgICAgICBBZGRlZCBtaXNzaW5nIGRlcHJlY2F0ZWQgd2FybmluZyBmb3IgJW5hbWUgYW5kIHJlbW92ZSByZW1haW5pbmcgJW5hbWUKICAgICAgICAgICAgdXNhZ2UgaW4gdGhlIFNXSUcgbGlicmFyaWVzLgoKMTEvMjEvMDQ6IG1tYXR1cwoJICAgIC0gW1B5dGhvbl0gQWRkaW5nIHRoZSBQeVN3aWdPYmplY3QgdG8gYmUgdXNlZCBmb3IgY2FycnlpbmcKCSAgICAgIHRoZSBpbnN0YW5jZSBDL0MrKyBwb2ludGVycy4gVGhpcyBpcyB1c2VkIGluc3RlYWQgb2YKCSAgICAgIHN0cmluZyBhbmQgUHlDT2JqZWN0cy4KCgkgICAgICBUaGUgbmV3IFB5U3dpZ09iamVjdCBpcyBldmVuIHNhZmVyIHRoYW4gUHlDT2JqZWN0LCBhbmQKCSAgICAgIG1vcmUgZnJpZW5kbHkgdGhhbiBwbGFpbiBzdHJpbmdzOgoKCSAgICAgIG5vdyB5b3UgY2FuIGRvCgoJICAgICAgICBwcmludCBhLnRoaXMKCQk8U3dpZyBPYmplY3QgYXQgXzAwNjkxNjA4X3BfQT4KCgkJcHJpbnQgc3RyKGEudGhpcykKCQlfMDA2OTE2MDhfcF9BCgoJCXByaW50IGxvbmcoYS50aGlzKQoJCTEzNTY4NjQwMAoKCQlwcmludCAiJXMgMHgleCIgJSAoYS50aGlzLCBhLnRoaXMpCgkJXzAwNjkxNjA4X3BfQSAweDgxNjY5MDAKCgkgICAgICB0aGUgbGFzdCBvbmUgaXMgdmVyeSB1c2VmdWwgd2hlbiBkZWJ1Z2dpbmcgdGhlIEMvQysrCgkgICAgICBzaWRlLCBzaW5jZSBpcyB0aGUgcG9pbnRlciB2YWx1ZSB5b3Ugd2lsbCB1c3VhbGx5IGdldAoJICAgICAgZnJvbSB0aGUgZGVidWdnZXIuCgoJICAgICAgQWxzbywgaWYgeW91IGhhdmUgc29tZSBvbGQgY29kZSB0aGF0IHVzZXMgdGhlIHN0cmluZwoJICAgICAgcmVwcmVzZW50YXRpb24gIl8wMDY5MTYwOF9wX0EiLCB5b3UgY2FuIHVzZSBpdCBub3cgYWdhaW4KCSAgICAgIHVzaW5nICdzdHIocHRyKScsIG9yIGJ5IGNhbGxpbmcgJ3N0ciA9IFB5T2JqZWN0X1N0cihvYmopJwoJICAgICAgaW4gdGhlIEMvQysrIHNpZGUuCiAKCSAgICAgIFRoaXMgY2hhbmdlIGlzIG1haW5seSBmb3Igbm9zdGFsZ2ljIHN3aWcgdXNlcnMgdGhhdCBtaXNzCgkgICAgICB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uLCBidXQgYWxzbyBhbGxvd3MgdG8gc2F5IGFnYWluCgoJICAgICAgICBpZiBhLnRoaXMgPT0gYi50aGlzOgoJCSAgcmV0dXJuICJhIGlzIGIiCgoJICAgICAgYW5kIHdlbGwsIHNpbmNlIHRoZSBjaGFuZ2Ugd2VyZSByZWFsbHkgc2ltcGxlLCBtYXliZSBpbgoJICAgICAgdGhlIGZ1dHVyZSB3ZSB3aWxsIGJlIGFibGUgdG8gZG8KICAgCgkJbmV4dCA9IGEudGhpcyArIDEKCgkgICAgICBvciBhZGQgbmF0aXZlIHB5dGhvbiBpdGVyYXRpb24gb3ZlciBuYXRpdmUgQy9DKysgYXJyYXlzLAoJICAgICAgaWUsIG5vIG5lZWQgdG8gY3JlYXRlL2NvcHkgbmV3IHR1cGxlcyB3aGVuIHJldHVybmluZyBhbmQKCSAgICAgIGFycmF5IG9yIHZlY3Rvci4KCgkgICAgICBBbHNvLCBhIFB5U3dpZ1BhY2tlZCBvYmplY3Qgd2FzIGFkZGluZyB0byBjYXJyeSBhIG1lbWJlcgoJICAgICAgbWV0aG9kIHBvaW50ZXIsIGJ1dCB0aGlzIGlzIHByb2JhYmx5IGEgdGVtcG9yYWwgc29sdXRpb24KCSAgICAgIHVudGlsIGEgbW9yZSBnZW5lcmFsIG9iamVjdCBmb3IgbWV0aG9kcyBpcyBhZGRlZC4KCgkgICAgICBCZSBhd2FyZSB0aGF0IHRvIHNpbXBsaWZ5IG1haW50YWluaW5nIGFuZCBjb21wYXRpYmlsaXR5CgkgICAgICB3aXRoIG90aGVyIHRvb2xzLCB0aGUgb2xkIHN0cmluZyBhbmQgUHlDT2JqZWN0cwoJICAgICAgcmVwcmVzZW50YXRpb24gY291bGQgZGlzYXBwZWFyIHZlcnkgc29vbiwgYW5kIHRoZQoJICAgICAgU1dJR19DT0JKRUNUU19UWVBFUyBvciBTV0lHX05PX09CSkVDVF9UWVBFUyBtYWNyb3Mgd2lsbAoJICAgICAgaGF2ZSBubyBlZmZlY3QgYXQgY29tcGlsYXRpb24gdGltZS4gU3RpbGwsIHRoZSB0aHJlZQoJICAgICAgbWVjaGFuaXNtcyBhcmUgcHJlc2VudCBpbiB0aGUgY29kZSBqdXN0IGZvciB0ZXN0aW5nLAoJICAgICAgZGVidWdnaW5nIGFuZCBjb21wYXJpc29uIHB1cnBvc2VzLgoJICAgICAgCjExLzIxLzA0OiBtbWF0dXMKCgkgICAgLSBbUHl0aG9uXSBBZGRpbmcgYmFjayBzdXBwb3J0IGZvciB1c2luZyB0aGUgc3dpZyBydW50aW1lIGNvZGUKCSAgICAgIGluc2lkZSB0aGUgdXNlciBjb2RlLiBXZSBqdXN0IGFsbG93IHRoZSB1c2VyIHRvIGluY2x1ZGUKCSAgICAgIHRoZSBtaW5pbWFsIGNvZGUgbmVlZGVkIHRvIGltcGxlbWVudCB0aGUgcnVudGltZQoJICAgICAgbWVjaGFuaXNtIHN0YXRpY2FsbHksIGp1c3QgYXMgaW4gZG9uZSBpbiB0aGUgc3dpZwoJICAgICAgbW9kdWxlcy4KCSAgICAgIAoJICAgICAgVG8gdXNlIHRoZSBzd2lnIHJ1bnRpbWUgY29kZSwgZm9yIGV4YW1wbGUgd2l0aCBweXRob24sCgkgICAgICB0aGUgdXNlciBuZWVkcyBpbmNsdWRlIHRoZSBmb2xsb3dpbmc6CiAKICAgICAgICAgICAgICAgI2luY2x1ZGUgPFB5dGhvbi5oPiAgICAgICAgIC8vIG9yIHVzaW5nIHlvdXIgZmF2b3JpdGUgbGFuZ3VhZ2UKICAgICAgICAgICAgICAgI2luY2x1ZGUgPHN3aWdydW4uc3dnPgogICAgICAgICAgICAgICAjaW5jbHVkZSA8cHl0aG9uL3B5cnVuLnN3Zz4gLy8gb3IgdXNpbmcgeW91ciBmYXZvcml0ZSBsYW5ndWFnZQogICAgICAgICAgICAgICAjaW5jbHVkZSA8cnVudGltZS5zd2c+CgoJICAgICAgdGhlIGZpbGVzIHN3aWdydW4uc3dnLCBweXJ1bi5zd2cgYW5kIHJ1bnRpbWUuc3dnIGNhbiAKCSAgICAgIGJlIGNoZWNrZWQgb3V0IGJ5IHVzaW5nIHN3aWcgLWNvLCBvciB0aGV5IGNhbiBzaW1wbHkgCgkgICAgICBiZSBmb3VuZCBieSBhZGRpbmcgdGhlIHN3aWcgbGliIGRpcmVjdG9yeSB0byB0aGUKCSAgICAgIGNvbXBpbGVyIGluY2x1ZGUgZGlyZWN0b3J5IGxpc3QsIGZvciBleGFtcGxlCgoJICAgICAgIFNXSUdMSUI9YHN3aWcgLXN3aWdsaWJgCgkgICAgICAgYysrIC1JJHtTV0lHTElCfSAuLgoKCSAgICAgIG9mIGJldHRlciwgdXNpbmcgdGhlIENQUEZMQUdTLCBidXQgdGhhdCBkZXBlbmRzIG9uIHlvdXIKCSAgICAgIGVudmlyb25tZW50LgoJICAgICAgIAoJICAgICAgVGhpcyBjaGFuZ2UgY2FuIGJlIHBvcnRlZCB0byB0aGUgb3RoZXIgbGFuZ3VhZ2VzIHRvbywKCSAgICAgIHlvdSBqdXN0IG5lZWQgdG8gaXNvbGF0ZSB0aGUgbmVlZGVkIHJ1bnRpbWUgY29kZSBpbgoJICAgICAgYSBzaW5nbGUgZmlsZSBsaWtlICdweXJ1bi5zd2cnLCBhbmQgcHJvdmlkZSB0aGUgCgkgICAgICBTV0lHX1J1bnRpbWVfR2V0VHlwZUxpc3QoKSBtZXRob2QuIExvb2sgYXQgdGhlCgkgICAgICBMaWIvcHl0aG9uL3B5cnVuLnN3ZyBmaWxlIGFuZCB0aGUgRXhhbXBsZXMvcHl0aG9uL3N3aWdydW4KCSAgICAgIGV4YW1wbGUuCgoxMS8xNS8wNDogbW1hdHVzCgkgICAgLSBGaXggbWl4ZWRfdHlwZXMuaSArIGdjYy0zLjQsIGllLCBhcnJheXMgKyByZWZlcmVuY2VzICsKCSAgICAgIHR5cGVkZWZzCgoJICAgIC0gRml4IG11bHRpZGltIGFycmF5cyArIHR5cGVkZWZzLGllCgoJICAgICAgIHR5cGVkZWYgY2hhciBjaGFyYWN0ZXJbMV07CgkgICAgICAgdHlwZWRlZiBjaGFyYWN0ZXIgd29yZFs2NF07CgoJICAgIC0gUHJvY2VzcyBwcm90ZWN0ZWQvcHJpdmF0ZSBiYXNlcyBpbiB0aGUgc2FtZSB3YXkgYmVmb3JlCgkgICAgICB3ZSBwcm9jZXNzIHByb3RlY3RlZC9wcml2YXRlIG1lbWJlcnMsIGllLCB3ZSBjaGVjawoJICAgICAgZm9yIGNvbnN0cnVjdG9ycywgb3BlcmF0b3IgbmV3LCB2aXJ0dWFsIG1lbWJlcnMsIGV0Yy4KICAgCgkgICAgLSBGaXggUnVieS9KYXZhIHRvIHdvcmsgKG9yIGlnbm9yZSkgbXVsdGktaW5oZXJpdGFuY2UgKwogICAgICAgICAgICAgIGRpcmVjdG9ycy4gQWxsb3cgb3RoZXIgbGFuZ3VhZ2VzIHRvIGRlZmluZSBpZiBpdCBpcwogICAgICAgICAgICAgIHN1cHBvcnRlZCBvciBub3QuCgkgICAgCgkgICAgLSBOb3cgeW91IGNhbiBydW4KCiAgICAgICAgICAgICAgICBTV0lHX0ZFQVRVUkVTPSItZGlyZWN0b3JzIC1kaXJwcm90IiAKICAgICAgICAgICAgICAgIG1ha2UgY2hlY2stcnVieS10ZXN0LXN1aXRlCiAgICAgICAgICAgICAgICBtYWtlIGNoZWNrLXB5dGhvbi10ZXN0LXN1aXRlCiAgICAgICAgICAgICAgICBtYWtlIGNoZWNrLWphdmEtdGVzdC1zdWl0ZQogICAgICAgICAgICAgICAgbWFrZSBjaGVjay1vY2FtbC10ZXN0LXN1aXRlCgoJICAgICAgYW5kIHlvdSB3aWxsIGdldCBvbmx5ICdyZWFsJyBlcnJvcnMuIHJ1YnkgYW5kIHB5dGhvbgoJICAgICAgY29tcGlsZSB3aXRoIG5vIGVycm9ycywgamF2YSBzaG93cyBzb21lIHByb2JsZW1zLgkKClZlcnNpb24gMS4zLjIzIChOb3ZlbWJlciAxMSwgMjAwNCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTEvMDUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggIzk4Mjc1MyBmcm9tIEZhYnJpY2UgU2FsdmFpcmU6IEFkZHMgZGVwZW5kZW5jaWVzIGdlbmVyYXRpb24gZm9yCiAgICAgICAgICAgIGNvbnN0cnVjdGluZyBtYWtlZmlsZXMuIE5ldyBjb21tYW5kIGxpbmUgb3B0aW9ucyAtTUYgLU1EIC1NTUQgdG8gd29yawogICAgICAgICAgICB3aXRoIHRoZSBjdXJyZW50IG9wdGlvbnMgLU0gYW5kIC1NTS4gVGhlc2Ugb3B0aW9ucyBhcmUgbmFtZWQgdGhlIHNhbWUKICAgICAgICAgICAgYW5kIHdvcmsgdGhlIHNhbWUgYXMgaW4gZ2NjLgoKMTEvMDUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgJWlnbm9yZS8lcmVuYW1lIGNoYW5nZXMgZm9yIG1ldGhvZHMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyB0byBtaXJyb3IKICAgICAgICAgICAgJWZlYXR1cmUgYmVoYXZpb3VyLiBTZWUgcHJldmlvdXMgZW50cnkuCgogICAgICAgICAgICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8wNC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICAlZmVhdHVyZSBpbXByb3ZlbWVudHMgZm9yIGZpbmUgdHVuaW5nIHdoZW4gd3JhcHBpbmcgbWV0aG9kcyB3aXRoCiAgICAgICAgICAgIGRlZmF1bHQgYXJndW1lbnRzLiBBbnkgJWZlYXR1cmUgdGFyZ2V0aW5nIGEgbWV0aG9kIHdpdGggZGVmYXVsdCBhcmd1bWVudHMKICAgICAgICAgICAgd2lsbCBhcHBseSB0byBhbGwgdGhlIGV4dHJhIG92ZXJsb2FkZWQgbWV0aG9kcyB0aGF0IFNXSUcgZ2VuZXJhdGVzIGlmIHRoZQogICAgICAgICAgICBkZWZhdWx0IGFyZ3VtZW50cyBhcmUgc3BlY2lmaWVkIGluIHRoZSBmZWF0dXJlLiBJZiB0aGUgZGVmYXVsdCBhcmd1bWVudHMgYXJlCiAgICAgICAgICAgIG5vdCBzcGVjaWZpZWQgaW4gdGhlIGZlYXR1cmUsIHRoZW4gdGhlIGZlYXR1cmUgd2lsbCBtYXRjaCB0aGF0IGV4YWN0CiAgICAgICAgICAgIHdyYXBwZXIgbWV0aG9kIG9ubHkgYW5kIG5vdCB0aGUgZXh0cmEgb3ZlcmxvYWRlZCBtZXRob2RzIHRoYXQgU1dJRyBnZW5lcmF0ZXMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgiZXhjZXB0Iikgdm9pZCBoZWxsbyhpbnQgaT0wLCBkb3VibGUgZD0wLjApOwogICAgICAgICAgICAgIHZvaWQgaGVsbG8oaW50IGk9MCwgZG91YmxlIGQ9MC4wKTsKCiAgICAgICAgICAgd2lsbCBhcHBseSB0aGUgZmVhdHVyZSB0byBhbGwgdGhyZWUgd3JhcHBlciBtZXRob2RzLCB0aGF0IGlzOgoKICAgICAgICAgICAgICB2b2lkIGhlbGxvKGludCBpLCBkb3VibGUgZCk7CiAgICAgICAgICAgICAgdm9pZCBoZWxsbyhpbnQgaSk7CiAgICAgICAgICAgICAgdm9pZCBoZWxsbygpOwoKICAgICAgICAgICBJZiB0aGUgZGVmYXVsdCBhcmd1bWVudHMgYXJlIG5vdCBzcGVjaWZpZWQgaW4gdGhlIGZlYXR1cmU6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJleGNlcHQiKSB2b2lkIGhlbGxvKGludCBpLCBkb3VibGUgZCk7CiAgICAgICAgICAgICAgdm9pZCBoZWxsbyhpbnQgaT0wLCBkb3VibGUgZD0wLjApOwoKICAgICAgICAgICB0aGVuIHRoZSBmZWF0dXJlIHdpbGwgb25seSBhcHBseSB0byB0aGlzIHdyYXBwZXIgbWV0aG9kOgoKICAgICAgICAgICAgICB2b2lkIGhlbGxvKGludCBpLCBkb3VibGUgZCk7CgogICAgICAgICAgIGFuZCBub3QgdGhlc2Ugd3JhcHBlciBtZXRob2RzOgoKICAgICAgICAgICAgICB2b2lkIGhlbGxvKGludCBpKTsKICAgICAgICAgICAgICB2b2lkIGhlbGxvKCk7CgogICAgICAgICAgIFRoaXMgaGFzIGJlZW4gaW50cm9kdWNlZCB0byBtYWtlICVmZWF0dXJlIG1vcmUgcG93ZXJmdWwgdG8gZWFzZSB0aGUgbWlncmF0aW9uCiAgICAgICAgICAgdG8gbmV3IGRlZmF1bHQgYXJndW1lbnRzIHdyYXBwaW5nIGFwcHJvYWNoLgoKICAgICAgICAgICAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKICAgICAgICAgICBJZiB5b3UgcHJldmlvdXNseSBoYWQgYSAlZmVhdHVyZSBhbmQgZGlkbid0IHNwZWNpZnkgdGhlIGRlZmF1bHQgYXJndW1lbnRzLAogICAgICAgICAgIHlvdSB3aWxsIGhhdmUgdG8gYWRkIHRoZW0gaW4gbm93IG9yIHlvdSBjYW4gb2J0YWluIHRoZSBvcmlnaW5hbCBiZWhhdmlvdXIKICAgICAgICAgICBieSB1c2luZyAlZmVhdHVyZSgiY29tcGFjdGRlZmF1bHRhcmdzIikuCgoxMS8wNC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFR5cGVtYXBzIGZvciBzdGQ6OnZlY3RvciBhZGRlZCBpbnRvIHN0ZF92ZWN0b3IuaS4gVGhlIHByb3h5IGNsYXNzZXMKICAgICAgICAgICAgZ2VuZXJhdGVkIGFyZSBtb2RlbGxlZCBvbiB0aGUgLk5FVCBBcnJheUxpc3QgY2xhc3MuIFRoaXMgaXNuJ3QgcXVpdGUKICAgICAgICAgICAgcmVhZHkgZm9yIGdlbmVyYWwgY29uc3VtcHRpb24geWV0LCBidXQgd2lsbCB3b3JrIHdpdGggdmVjdG9ycyBvZiBwcmltaXRpdmUKICAgICAgICAgICAgdHlwZXMgYW5kIHNvbWUgY2xhc3Nlcy4KCjEwLzMvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtHVUlMRV0gVGhlIC1zY20gaW50ZXJmYWNlIGlzIG5vdyB0aGUgZGVmYXVsdC4gIFRoZSBvbGQgR0ggaW50ZXJmYWNlIGNhbgoJICAgIHN0aWxsIGJlIGVuYWJsZWQgYnkgcGFzc2luZyAtZ2ggdG8gU1dJRy4KCjEwLzIvMjAwNDogbW1hdHVzCgoJICAgIC0gTW9yZSBmaXhlcyBmb3IgbmFtZXNwYWNlICsgY2xhc3MgZGVjbGFyYXRpb25zLgoJICAgICAgQXMgYW4gZXh0cmEgYm9udXMsIHdlIGdldCAldGVtcGxhdGUgc3VwcG9ydCBmb3Igc3RhdGljL21lbWJlcnMgY2xhc3MKCSAgICAgIG1ldGhvZHMsIGllLCBub3cgeW91IGNhbiBzYXk6CgoJICAgICAgICBuYW1lc3BhY2Ugc3BhY2UgewogICAgICAgICAgICAgICAgIHN0cnVjdCBBCQkJICAgIAoJICAgICAgICAgewkJCQkgICAgCgkgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBZPgkgICAgCgkgICAgICAgICAgIHN0YXRpYyB2b2lkIGZvb1QoWSB5KSB7IH0KCSAgICAgICAgIH07CQoJCX0JCQkgICAgCgkgICAgICAJICAgICAgCQkJICAgIAoJICAgICAgICBzdHJ1Y3QgQgkJCSAgICAKCSAgICAgICAgewkJCQkgICAgCgkgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFk+CQkgICAgCgkgICAgICAgICAgdm9pZCBiYXJUKFkgeSkge30gCgkgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgCgoJCSV0ZW1wbGF0ZShmb28pIHNwYWNlOjpBOjpmb29UPGRvdWJsZT47CgkJJXRlbXBsYXRlKGZvbykgc3BhY2U6OkE6OmZvb1Q8aW50PjsKCQkldGVtcGxhdGUoZm9vKSBzcGFjZTo6QTo6Zm9vVDxjaGFyPjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCQkldGVtcGxhdGUoYmFyKSBCOjpiYXJUPGRvdWJsZT47CgkJJXRlbXBsYXRlKGJhcikgQjo6YmFyVDxpbnQ+OwoJCSV0ZW1wbGF0ZShiYXIpIEI6OmJhclQ8Y2hhcj47CgoJICAgICAgYW5kIGNhbGwKCgkgICAgICAgIEEuZm9vKDEpCgkJYiA9IEIoKQoJCWIuYmFyKDEpCgkgICAgICAKCSAgICAgIG5vdGUgdGhlIG1ldGhvZHMgYXJlIGVtaXR0ZWQgaW5zaWRlIHRoZSBjbGFzc2VzLAoJICAgICAgYW5kIGhlbmNlLCB0aGUgJXRlbXBsYXRlIG5hbWUgcmVmZXJzIHRvIHRoZSAnbWVtYmVyJwoJICAgICAgbWV0aG9kIG5hbWUsIG5vdCBhIGdsb2JhbCBuYW1lc3BhY2UgbmFtZS4KCjEwLzMxLzIwMDQ6IG1tYXR1cwoJICAgIC0gU29sdmUgbmFtZXNwYWNlICsgY2xhc3MgZGVjbGFyYXRpb25zLCBhcyBpbgoKCSAgICAgICBuYW1lc3BhY2UgZm9vIHsKICAgICAgICAgICAgICAgICBzdHJ1Y3QgQmFyOwoJCSBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICBzdHJ1Y3QgZm9vOjpCYXIgOiBGb28gewogICAgICAgICAgICAgICB9OwoKCSAgICAgICBzZWUgbmFtZXNwYWNlX2NsYXNzLmkgZm9yIG1vcmUgZXhhbXBsZXMuCgogICAgICAgICAgICAtIEZpeCAldGVtcGxhdGUgZGlyZWN0aXZlIHRvIHByb3Blcmx5IHVzZSBuYW1lc3BhY2VzLAogICAgICAgICAgICAgIGluY2x1ZGluZyB0aGUgY2FzZToKCgkJICAgbmFtZXNwYWNlIG9uZQoJCSAgIHsKCQkgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CgkJICAgICAgIHN0cnVjdCBQdHIge307CiAgICAgICAgICAgICAgICAgICB9CgoJCSAgIG5hbWVzcGFjZSBvbmUKCQkgICB7CQkgIAoJCSAgICAgICBzdHJ1Y3QgT2JqMSB7fTsKCQkgICAgICAgdHlwZWRlZiBQdHI8T2JqMT4gT2JqMV9wdHI7CiAgCQkgICAgICAgJXRlbXBsYXRlKE9iajFfcHRyKSBQdHI8T2JqMT47IAoJCSAgIH0JCQkJICAKCQkgICAJCQkJICAKCQkgICBuYW1lc3BhY2UgdHdvICAKCQkgICB7CgkJICAgICAgIHN0cnVjdCBPYmoyIHt9OwkKCQkgICAgICAgdHlwZWRlZiBvbmU6OlB0cjxPYmoyPiBPYmoyX3B0cjsKCQkgICAgICAgJXRlbXBsYXRlKE9iajJfcHRyKSBvbmU6OlB0cjxPYmoyPjsKCQkgICB9CgoJICAgICAgdGhpcyBpcyBkb25lIGJ5IHVzaW5nIHRoZSBuYW1lc3BhY2UgbmFtZSAnb25lJyB0byBjcmVhdGUKICAgICAgICAgICAgICBhIG5hbWVzcGFjZSBub2RlIHRvIGVtaXQgdGhlIHRlbXBsYXRlIGluc3RhbnRpYXRpb24sCiAgICAgICAgICAgICAganVzdCBhcyBiZWZvcmUsIGJ1dCB0aGUgdGVtcGxhdGUgcGFyYW1ldGVycyBhcmUgcmVzb2x2ZWQKICAgICAgICAgICAgICBhbmQgcXVhbGlmaWVkIGluIHRoZSBjdXJyZW50IG5hbWVzcGFjZSAoJ29uZScgb3IgJ3R3bycpLgogICAgICAgICAgICAgIFRoaXMgaXMgc2FtZSB3YXkgdGhhdCB0eXBlZGVmIHdvcmtzLiAKCgkgICAgICBUaGlzIHJlc29sdmUgdGhlIHNtYXJ0X3BvaW50ZXJfbmFtZXNwYWNlMi5pIGNhc2UsIGFuZCBhdAogICAgICAgICAgICAgIHRoZSBzYW1lIHRpbWUsIHNldmVyYWwgb3RoZXIgb25lcyB3aGVyZSBiZWZvcmUgc3dpZyB3YXMKICAgICAgICAgICAgICBnZW5lcmF0aW5nIHRoZQoKCSAgICAgICAgIkNhbid0IGluc3RhbnRpYXRlIHRlbXBsYXRlICd4eCcgaW5zaWRlIG5hbWVzcGFjZSAneXknIgoJICAgICAgCgkgICAgICBlcnJvciBtZXNzYWdlLiBJbiBmYWN0LCB0aGF0IGVycm9yIGRvZXNuJ3QgZXhpc3QKCSAgICAgIGFueW1vcmUuIFlvdSBjYW4gb25seSBnZXQgYW4gZXJyb3IgaWYgeW91IHVzZSBhIGJhZAoJICAgICAgbmFtZXNwYWNlIG5hbWUgb3Igc28uCgoxMC8zMC8yMDA0OiBtbWF0dXMKCSAgICAtIFtydWJ5XSBEaXJlY3RvcnMgZml4ZXM6CgkgICAgICAtIGVudW1zIGFuZCBzdGQ6OnN0cmluZ3MgYXJlIHdvcmtpbmcgbm93IChzZXZlcmFsCgkgICAgICAgIHJlcG9ydHMgaW4gYnVnIHRyYWNrIHN5c3RlbSkKCSAgICAgIC0gYWRkZWQgcGF0Y2ggMTAyNTg2MSBmb3IgZGlyZWN0b3IgKyBleGNlcHRpb25zCgkJCiAgICAgICAgICAgICAgKioqIEF0dGVudGlvbiAqKio6IHJ1Ynkgd2l0aCBkaXJlY3RvcnMgKyBwcm90ZWN0ZWQKICAgICAgICAgICAgICBtZW1iZXJzIHdvcmsgd2l0aCB2ZXJzaW9uIDEuNysuIE9sZGVyIHZlcnNpb25zIHNlZW1zIHRvCiAgICAgICAgICAgICAgaGF2ZSBhIGJyb2tlbiBzaWduYXR1cmUgZm9yJ3JiX3Byb3RlY3QnLgoJCQoJICAgICAgSWYgeW91IG5lZWQgdG8gdXNlIGFuIG9sZCB2ZXJzaW9uLCBsb29rIGF0CgoJICAgICAgaHR0cDovL2V4Y3J1Ynkuc291cmNlZm9yZ2UubmV0L2RvY3MvaHRtbC9ydWJ5X19oYWNrc184aHBwLXNvdXJjZS5odG1sCiAgCSAgICAgIGZvciB3b3JrYXJvdW5kcy4KCSAgICAgIAogICAgICAgICAgICAtIFtydWJ5XSBGaXggbWVtb3J5IGFsbG9jYXRpb24gcHJvYmxlbSBpbiB0eXBlbWFwIChidWcgMTAzNzI1OSkKCgkgICAgLSBbdGNsXSBGaXggKGVudW1zfGNvbnN0YW50cykgKyBuYW1lc3BhY2Ugb3B0aW9uIAoJICAgICAgICAgICAgKHJlcG9ydGVkIGJ5IGphc29uLm0uc3VycHJpc2VAaW50ZWwuY29tKS4KCiAgICAgICAgICAgIC0gW3BlcmxdIEFkZCBwYXRjaCA5NjIxNjggZm9yIG11bHRpcGxlIGluaGVyZXRhbmNlCgkgICAgCgkgICAgLSBGaXggJ2RlZmluZWQnIGFzIHZhcmlhYmxlIG5hbWUuCgoxMC8yOS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBTZWcgZmF1bHQgZml4IGZvciBnbG9iYWwgc2NvcGUgb3BlcmF0b3IgdXNlZCBmb3IgZnJpZW5kIG1ldGhvZHM6CgogICAgICAgICAgICAgIGNsYXNzIEIgewogICAgICAgICAgICAgICAgZnJpZW5kIHZvaWQgOjpnbG9iYWxzY29wZSgpOwogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKCjEwLzI4LzIwMDQ6bW1hdHVzCgkgICAgLSBBZGRlZCBtb2R1bGUgYW5kIHN3aWcgb3B0aW9uICJ0ZW1wbGF0ZXJlZHVjZSIgdG8gZm9yY2Ugc3dpZwoJICAgICAgdG8gcmVkdWNlIGFueSB0eXBlIG5lZWRlZCB3aXRoIHRlbXBsYXRlcywgaWUsIGluIHRoZXNlIGNhc2VzCgogICAgICAgICAgICAgICAgJW1vZHVsZSgidGVtcGxhdGVyZWR1Y2UiKSB0ZXN0CgogICAgICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBBIHsgfTsKCiAgICAgICAgICAgICAgICB0eXBlZGVmIGludCBJbnQ7CgkgICAgICAgICV0ZW1wbGF0ZShBX0ludCkgQTxJbnQ+ICA9PT4gICV0ZW1wbGF0ZShBX0ludCkgQTxpbnQ+CgogICAgICAgICAgICAgICAgdHlwZWRlZiBCKiBCcDsKCSAgICAgICAgJXRlbXBsYXRlKEFfQnApIEE8QnA+ICA9PT4gICV0ZW1wbGF0ZShBX0JwKSBBPEIqPgoKICAgICAgICAgICAgICBzd2lnIHJlZHVjZXMgdGhlIHR5cGVzIEludCBhbmQgQnAgdG8gdGhlaXIgcHJpbWl0aXZlcwogICAgICAgICAgICAgIGludCBhbmQgQiouIFRoaXMgaXMgY2xvc2VyIHRvIHRoZSB1c3VhbCBjb21waWxlcgogICAgICAgICAgICAgIHJlc29sdXRpb24gbWVjaGFuaXNtLCBhbmQgaXQgaXMgcmVhbGx5IG5lZWRlZCBzb21ldGltZXMKICAgICAgICAgICAgICB3aGVuIHlvdSBtaXggdGVtcGxhdGVzICsgdHlwZWRlZnMgKyBzcGVjaWFsaXphdGlvbnMuCgoJICAgICAgRG9uJ3QgdXNlIGl0IGlmIHlvdSBkb24ndCBoYXZlIGFueSBwcm9ibGVtIGFscmVhZHksCgkgICAgICBzaW5jZSB0aGUgdHlwZSByZWR1Y3Rpb24gY2FuIGludGVyZmVyZSB3aXRoIHNvbWUKCSAgICAgIHVzZXIgdHlwZW1hcHMsIHNwZWNpYWxseSBpZiB5b3UgZGVmaW5lZCBzb21ldGhpbmcgbGlrZQoKCQkgICB0eXBlZGVmIGludCBJbnQ7CgkJICAgJXR5cGVtYXAoaW4pIEludCAuLi47CgogICAgICAgICAgICAgIGluIHRoaXMgY2FzZSwgd2hlbiB5b3UgdXNlIHRoZSAidGVtcGxhdGVyZWR1Y2UiIG9wdGlvbiwKCSAgICAgIHN3aWcgd2lsbCBpZ25vcmUgdGhlIHVzZXIgdHlwZW1hcCwgc2luY2UgdGhlICJ0eXBlZGVmIGludCBJbnQiCgkgICAgICB3aWxsIHRha2UgcHJlY2VkZW5jZSwgYW5kIHRoZSB1c3VhbCAiaW50IiB0eXBlbWFwIHdpbGwgYmUKCSAgICAgIGFwcGxpZWQuIAoKCSAgICAgIE5vdGUgdGhhdCB0aGUgcHJldmlvdXMgY2FzZSBpcyBub3QgY29tbW9uLCBhbmQgc2hvdWxkIGJlCgkgICAgICBhdm9pZGVkLCBpZSwgaXMgbm90IHJlY29tbWVuZGVkIHRvIHVzZSBhIHR5cGVkZWYgYW5kIGEKCSAgICAgIHR5cGVtYXAgYXQgdGhlIHNhbWUgdGltZSwgc3BlY2lhbGx5IGlmIHlvdSBhcmUgZ29pbmcgdG8KCSAgICAgIHVzZSB0ZW1wbGF0ZXMgKyBzcGVjaWFsaXphdGlvbnMuCgoJICAgIC0gRGlyZWN0b3JzOgoKCSAgICAgICAgdmlydHVhbCBkZXN0cnVjdG9yIGlzIGFsd2F5cyBlbWl0dGVkIG5vdywgdGhpcyBkb2Vzbid0CgkgICAgICAgIGNhdXNlIGFueSBoYXJtLCBhbmQgY291bGQgc29sdmUgc29tZSBuYXN0eSBhbmQKCSAgICAgICAgbXlzdGVyaW91cyBlcnJvcnMsIGxpa2UgdGhlIG9uZSBtZW50aW9uZWQgYnkgU2NvdHQuCgoJCWFsc28gdGhlIGRlc3RydWN0b3IgaXMgbm90IGluLWxpbmVkLCBzbywgdGhhdCBjYW4gc29sdmUKCQlzb21lIG90aGVyIG15c3RlcmlvdXMgZXJyb3JzIHdoZW4gbWl4aW5nIGRpcmVjdG9ycyArCgkJaW1wb3J0cyArIGVtYmVkZGVkIGFwcGxpY2F0aW9ucyArIHNvbWUgc3BlY2lmaWMgY29tcGlsZXJzLgoJCQoxMC8yNy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIHR5cGVtYXBzLmkgbGlicmFyeSBmaWxlIHdpdGggSU5QVVQsIE9VVFBVVCBhbmQgSU5PVVQgdHlwZW1hcHMgYWRkZWQuCgoxMC8yNy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gc3RkOjp3c3RyaW5nIHR5cGVtYXAgZml4ZXMgaW4gc3RkX3N0cmluZy5pIGZyb20gUnVzc2VsbCBLZWl0aC1NYWdlZS4KCjEwLzI1LzIwMDQ6IG1tYXR1cyAKCgkgICAgLSBVc2luZyArIG5hbWVzcGFjZSBpcyB3b3JraW5nIG5vdyAodXNpbmdfbmFtZXNwYWNlLmkpLgoKCSAgICAtIERlcml2ZWQgKyBuZXN0ZWQgY2xhc3NlcyBpcyB3b3JraW5nIG5vdwoJICAgICAgKGRlcml2ZXJfbmVzdGVkLmkpLCBidXQgb2YgY291cnNlLCB3ZSBhcmUgc3RpbGwgd2FpdGluZwoJICAgICAgZm9yIHRoZSBuZXN0ZWQgY2xhc3Mgc3VwcG9ydC4KCSAgICAKCSAgICAtIERpcmVjdG9yczoKCSAgICAgIC0gdW5uYW1lZCBwYXJhbWV0ZXJzIHN1cHBvcnQsCgoJICAgICAgLSBwcm90ZWN0ZWQgY29uc3RydWN0b3Igc3VwcG9ydCAoYXV0b21hdGljIGFuZCB3aXRoCiAgICAgICAgICAgICAgICBkaXJwcm90IG1vZGUpLAoKCSAgICAgIC0gZGV0ZWN0aW9uIG9mIHJlYWxseSBuZWVkZWQgcHJvdGVjdGVkIGRlY2xhcmF0aW9ucwogICAgICAgICAgICAgICAgKG1lbWJlcnMgYW5kIGNvbnN0cnVjdG9ycykgbm93IGlzIGRvbmUgYXV0b21hdGljYWxseS4KICAgICAgICAgICAgICAgIEV2ZW4gaWYgeW91IGRvbid0IHVzZSB0aGUgJ2RpcnByb3QnIG1vZGUsIHN3aWcgd2lsbAogICAgICAgICAgICAgICAgd3JhcCB3aGF0IGlzIG1pbmltYWxseSBuZWVkZWQgKGFuZCBwcm90ZWN0ZWQpIGZvciB0aGUKICAgICAgICAgICAgICAgIGNvZGUgdG8gY29tcGlsZS4KCQkKCQl3aGF0IGlzIHB1YmxpYywgYXMgdXN1YWwsIGlzIGFsd2F5cyB3cmFwcGVkLCBhbmQgaWYKCQl5b3UgdXNlIHRoZSAnZGlycG9ydCcKCQkKCgkgICAgLSBGaW5hbCBmaXhlcyBmb3IgdGhlIE9TUyB0byBjb21waWxlIHdpdGggU1dJRyAxLjMuMjMgKG15CgkgICAgICB2ZXJ5IHZlcnkgdWdseSBDKysgKyB0ZW1wbGF0ZXMgKyBldmVyeXRoaW5nIG1vdW50ZXJzIHdyYXApLgoKMTAvMjUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBOZXcgY29tbWFuZGxpbmUgb3B0aW9uIC1kbGxpbXBvcnQuIFRoaXMgZW5hYmxlcyBvbmUgdG8gc3BlY2lmeQogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgRExMIGZvciB0aGUgRGxsSW1wb3J0IGF0dHJpYnV0ZS4gTm9ybWFsbHkgdGhpcyBuYW1lCiAgICAgICAgICAgIGNvbWVzIGZyb20gdGhlIG1vZHVsZSBuYW1lLCBzbyBub3cgaXQgaXMgcG9zc2libGUgdG8gb3ZlcnJpZGUgdGhpczoKCiAgICAgICAgICAgICAgc3dpZyAtY3NoYXJwIC1kbGxpbXBvcnQgeHl6IGV4YW1wbGUuaQoKICAgICAgICAgICAgd2lsbCBnZW5lcmF0ZSBmb3IgYWxsIHRoZSB3cmFwcGVkIFBJbnZva2UgbWV0aG9kczoKCiAgICAgICAgICAgICAgW0RsbEltcG9ydCgieHl6IiwgRW50cnlQb2ludD0iLi4uIildCiAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBleHRlcm4gLi4uCgogICAgICAgICAgICBUaGUgd3JhcHBlcnMgZnJvbSBtYW55IGRpZmZlcmVudCBTV0lHIGludm9jYXRpb25zIGNhbiB0aHVzIGJlIGNvbXBpbGVkCiAgICAgICAgICAgIGludG8gb25lIERMTC4KCiAgICAgICAgICAgIEEgbmV3IHNwZWNpYWwgdmFyaWFibGUgJGRsbGltcG9ydCBjYW4gYWxzbyBiZSB1c2VkIGluIHR5cGVtYXBzLCBwcmFnbWFzLAogICAgICAgICAgICBmZWF0dXJlcyBldGMuIFRoaXMgd2lsbCBnZXQgdHJhbnNsYXRlZCBpbnRvIHRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkgLWRsbGltcG9ydAogICAgICAgICAgICBpZiBzcGVjaWZpZWQsIG90aGVyd2lzZSB0aGUgbW9kdWxlIG5hbWUuCgoxMC8yMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUGF0Y2ggIzEwNDk0OTYgZnJvbSBTY290dCBNaWNoZWwgZml4ZXMgZGlyZWN0b3JzIG1ldGhvZHMgd2l0aCAKICAgICAgICAgICAgZW51bXMgd2hlbiB3cmFwcGVkIHdpdGggdHlwZXNhZmUgb3IgcHJvcGVyIEphdmEgZW51bXMuCgoxMC8yMS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlcyBmb3IgZGVmYXVsdCBhcmd1bWVudHMgaW4gZGlyZWN0b3IgY29uc3RydWN0b3JzIChQeXRob24sIFJ1YnksIE9jYW1sKS4KCjEwLzIxLzIwMDQ6IG1tYXR1cwoJICAgIC0gW1B5dGhvbl0gQWRkIHRoZSAnLWNwbHVzY2FzdCcgb3B0aW9uIHRvIGVuYWJsZSB0aGUgJ25ldycKCSAgICAgIEMrKyBjYXN0aW5nIG9wZXJhdG9ycywgc3VjaCBhcyAnc3RhdGljX2Nhc3QnLCBpbnNpZGUgdGhlCgkgICAgICB0eXBlbWFwcy4gQnkgZGVmYXVsdCBzd2lnIHVzZSB0aGUgb2xkIEMgY2FzdCBzdHlsZSwgZXZlbgoJICAgICAgd2hlbiBwYXJzaW5nIEMrKy4KCSAgICAgIAoJICAgIC0gW1B5dGhvbl0gQWRkIHRoZSAnLW5ld192d20nIG9wdGlvbiB0byBlbmFibGUgdGhlIG5ldwogICAgICAgICAgICAgIFN3aWdWYWx1ZVdyYXBwZXIgbW9kZS4gTm93IHRoaXMgaXMgbWFpbmx5IGZvciB0ZXN0aW5nCiAgICAgICAgICAgICAgdGhhdCB0aGUgdHlwZW1hcHMgYXJlIHJlYWxseSBzYWZlIGZvciBhbnkgZnV0dXJlCiAgICAgICAgICAgICAgc29sdXRpb24sIGJ1dCB5b3UgY2FuIHVzZSBpdCBpZiB5b3UgaGF2ZSBhIHZlcnkgc3RyYW5nZQogICAgICAgICAgICAgIGVycm9yIHdpdGggZGVmYXVsdCBjb3NudHJ1Y3RvcnMgbWlzc2luZyArICVhcHBseSArCiAgICAgICAgICAgICAgJXR5cGVtYXAsIGFuZCBpZiBldmVyeXRoaW5nIGVsc2UgZmFpbHMgKHNlZQogICAgICAgICAgICAgIHZhbHV3cmFwcGVyX29wYXF1ZS5pIGZvciBhbHRlcm5hdGl2ZSBhbmQgY3VycmVudAogICAgICAgICAgICAgIHNvbHV0aW9ucykuIElmIHlvdSBhcmUgYSB1c2VyIHRoYXQgZG9uJ3Qga25vdyB3aGF0IGlzCiAgICAgICAgICAgICAgU3dpZ1ZhbHVlV3JhcHBlciwgZG9uJ3QgZXZlbiB0cnkgaXQuCgoJICAgIC0gW1B5dGhvbl0gQWRkIHRoZSAnLW5vaCcgb3B0aW9uIHRvIGJlIHVzZWQgd2l0aCBkaXJlY3RvcnMKCSAgICAgIGFuZCB3aGVuIHlvdSBwcmVmZXIgdG8gZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUKCSAgICAgIGRpcmVjdG9yIGhlYWRlciBmaWxlLiBJZiBub3QgdXNlZCwgc3dpZyB3aWxsIHdvcmsgYXMKCSAgICAgIHVzdWFsIGdlbmVyYXRpbmcgYm90aCB0aGUgd3JhcC5jeHggYW5kIHdyYXAuaCBmaWxlcy4gSWYKCSAgICAgIHlvdSB1c2UgaXQsIHN3aWcgd2lsbCBvbmx5IGdlbmVyYXRlIHdyYXAuY3h4LgoKMTAvMjEvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIC0gSWYgeW91IGRlZmluZSBTV0lHX1RZUEVfVEFCTEUgd2hlbiBjb21waWxpbmcgYSB3cmFwcGVyIGZpbGUsCgkgICAgICB0aGUgcnVudGltZSB0eXBlcyB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgZ2l2ZW4gdHlwZSB0YWJsZSBuYW1lLgoJICAgICAgVXNpbmcgdGhpcywgeW91IGNhbiBzZXBlcmF0ZSBkaWZmZXJlbnQgbW9kdWxlcyB0byBzaGFyZSB0aGVpcgoJICAgICAgb3duIHR5cGUgc3lzdGVtcy4gIC1EU1dJR19UWVBFX1RBQkxFPU15dGFibGUKCgkgICAgLSBbUHl0aG9uXSBJZiB5b3UgZGVmaW5lIFNXSUdfU1RBVElDX1JVTlRJTUUgdGhlbiB0aGUgdHlwZSBpbmZvcm1hdGlvbgoJICAgICAgd2lsbCBiZSBzdGF0aWMgdG8gdGhpcyB3cmFwcGVyLiAgTm90aGluZyB3aWxsIGJlIHNoYXJlZCB3aXRoIGFueQoJICAgICAgb3RoZXIgbW9kdWxlcwoKCSAgICAtIFtQeXRob25dIElmIHlvdSBkZWZpbmUgU1dJR19MSU5LX1JVTlRJTUUsIHRoZW4gaW5zdGVhZCBvZiB1c2luZwoJICAgICAgdGhlIG5ldyB3YXkgb2Ygc2hhcmluZyB0eXBlIGluZm9ybWF0aW9uLCB0aGUgd3JhcHBlciB3aWxsIGV4cGVjdAoJICAgICAgdG8gYmUgbGlua2VkIGFnYWluc3QgdGhlIExpYi9saW5rcnVudGltZS5jIGZpbGUuICBBbnkgbW9kdWxlcyBjb21waWxlZAoJICAgICAgd2l0aCBTV0lHX0xJTktfUlVOVElNRSBhbmQgbGlua2VkIGFnYWluc3QgbGlua3J1bnRpbWUuYyB3aWxsIGFsbAoJICAgICAgc2hhcmUgdHlwZSBpbmZvcm1hdGlvbi4KCjEwLzIwLzIwMDQ6IG1tYXR1cwoJICAgIC0gW1B5dGhvbl0gSW5pdGlhbCBmaXggZm9yIHB5dGhvbi9pbXBvcnQgZXhhbXBsZS4gUGxlYXNlCgkgICAgICB1cGRhdGUgdGhlIE1ha2VmaWxlIChhdXRvY29uZiwgY29uZmlndXJlLCBldGMsIGV4cGVydCksCgkgICAgICBzaW5jZSBub3cgcHJvYmFibHkgaXMgb25seSB3b3JraW5nIHdpdGggZysrLCBpY2MgYW5kIGEKCSAgICAgIGZldyBvdGhlciBjb21waWxlcnMgdGhhdCBoYXZlIHRoZSAtc2hhcmVkIG9wdGlvbi4KCgkgICAgICBXZSBuZWVkIHRvIGNyZWF0ZSBhZGRpdGlvbmFsIHNoYXJlZCBsaWJyYXJpZXMgZm9yIHRoZQoJICAgICAgdmlydHVhbCBkZXN0cnVjdG9ycy4gT2xkIGFuZCB1c3VhbGx5IGZvcmdvdHRlbiBDKysKCSAgICAgIHJlcXVpcmVtZW50LgoJICAgICAgCgkgICAgICBTYW1lIGZpeCBuZWVkIHRvIGJlIHVzZWQgaW4gcGVybCwgSSB0aGluay4KCiAgICAgICAgICAgIC0gW1B5dGhvbl0gRml4IGdlbmVyYXRpb24gb2YgaGVhZGVyIGZpbGUgZm9yIGRpcmVjdG9ycywKICAgICAgICAgICAgICBub3cgZGlyZWN0b3JzLnN3ZyBpcyBhbHNvIGluY2x1ZGVkLCBzbywgaXQgY2FuIGJlIHJlYWxseQoJICAgICAgdXNlZCBmcm9tIEMrKywgYW5kIGl0IHNvbHZlcyBzb21lIHByb2JsZW0gd2l0aCBjb21waWxlcgoJICAgICAgdGhhdCByZXF1aXJlIHRoYXQsIGV2ZW4gd2l0aCB0aGUgc2ltcGxlIHN3aWcgaW5jbHVzaW9uLiAgCgogICAgICAgICAgICAtIFtQeXRob25dIFJlb3JkZXJpbmcgdGhlIG1ldGhvZHMgYW5kIG1vdmluZyBzb21lIGJvZGllcwogICAgICAgICAgICAgIG91dHNpZGUgdGhlIGNsYXNzIGRlY2xhcmF0aW9uLiBUaGlzIGlzIG5lZWRlZCBkdWUgdG8KICAgICAgICAgICAgICBzb21lIGdjYy0yLjk2IGludGVybmFsIGNvbXBpbGVyIGVycm9ycy4gSXQgc2VlbXMgdGhlCiAgICAgICAgICAgICAgUFlUSE9OIGNsYXNzIGlzIGdldHRpbmcgdG9vIGxhcmdlIHRvIGJlZW4gZGVjbGFyZWQgYW5kCiAgICAgICAgICAgICAgZGVmaW5lZCBhdCB0aGUgc2FtZSB0aW1lLgoKCSAgICAtIEFkZCB0aGUgLW9oIG9wdGlvbiB0byBjaGFuZ2UgdGhlIG91dHB1dCBoZWFkZXIgZmlsZSBuYW1lCiAgICAgICAgICAgICAgaWYgbmVlZGVkOgoKICAgICAgICAgICAgICAgICBzd2lnIC1jKysgLXB5dGhvbiB0ZXN0LmkgLW8gdGVzdC5DQyAtb2ggdGVzdC5ISAoJICAgICAgCiAgICAgICAgICAgICAgdGhpcyBpcyBtYWlubHkgbmVlZGVkIHdoZW4gdXNpbmcgZGlyZWN0b3JzLCBhbmQgaWYgdGhlCiAgICAgICAgICAgICAgY3VycmVudCBkZWZhdWx0IGhlYWRlciBmaWxlIG5hbWUgaXMgbm90IGdvb2QgZm9yIHlvdSwKICAgICAgICAgICAgICB3aGljaCBpcyBnZW5lcmF0ZWQgYXMgZm9sbG93OgkgICAgICAKCiAgICAgICAgICAgICAgICAgc3dpZyAtYysrIC1weXRob24gdGVzdC5pICAgICAgICAgICAgID0+IHRlc3Rfd3JhcC5oCiAgICAgICAgICAgICAgICAgc3dpZyAtYysrIC1weXRob24gdGVzdC5pIC1vIHRlc3QuQ0MgID0+IHRlc3QuaAoKCjEwLzIwLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIDEpIENvbXBhY3QgZGVmYXVsdCBhcmd1bWVudHMgZmVhdHVyZSBhZGRlZC4gVGhpcyBmZWF0dXJlIGFsbG93cyBvbmUKICAgICAgICAgICAgICB0byB1c2UgdGhlIGRlZmF1bHQgYXJndW1lbnQgY29kZSBnZW5lcmF0aW9uIHRoYXQgd2FzIHVzZWQgaW4KICAgICAgICAgICAgICBTV0lHLTEuMy4yMiBhbmQgZWFybGllciB2ZXJzaW9ucy4gSXQgcHJvZHVjZXMgbW9yZSBjb21wYWN0IHdyYXBwZXJzCiAgICAgICAgICAgICAgYXMgb25seSBvbmUgd3JhcHBlciBtZXRob2QgaXMgZ2VuZXJhdGVkIGZvciBhbnkgbWV0aG9kIHdpdGggZGVmYXVsdAogICAgICAgICAgICAgIGFyZ3VtZW50cy4gU28gdGhlIGFkdmFudGFnZSBpcyBpdCBnZW5lcmF0ZXMgbGVzcyBjb2RlIGJ1dCBoYXMgdGhlCiAgICAgICAgICAgICAgb3JpZ2luYWwgbGltaXRhdGlvbnMsIGxpa2UgaXQgaXQgZG9lcyBub3Qgd29yayB3aXRoIGFsbCBkZWZhdWx0IGFyZ3VtZW50cwogICAgICAgICAgICAgIGFuZCBkZWZhdWx0IGFyZ3VtZW50cyBjYW5ub3QgYmUgdGFrZW4gYWR2YW50YWdlIG9mIGluIHRoZSBzdHJvbmdseSB0eXBlZAogICAgICAgICAgICAgIGxhbmd1YWdlcyAoQyMgYW5kIEphdmEpLiBJdCBpcyBpbXBsZW1lbnRlZCB2aWEgdGhlIHVzdWFsICVmZWF0dXJlIG1lY2hhbmlzbToKCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgiY29tcGFjdGRlZmF1bHRhcmdzIik7CgogICAgICAgICAgICAyKSBLZXl3b3JkIGFyZ3VtZW50cyAoa3dhcmdzKSBhcmUgd29ya2luZyBhZ2FpbiBmb3IgZGVmYXVsdCBhcmd1bWVudHMKICAgICAgICAgICAgICAgaW4gdGhlIGxhbmd1YWdlcyB0aGF0IHN1cHBvcnQgaXQsIGllLCBQeXRob24gYW5kIFJ1YnkuIFRoZSBuZXcgZGVmYXVsdAogICAgICAgICAgICAgICBhcmd1bWVudCB3cmFwcGluZyBhcHByb2FjaCB1c2luZyBvdmVybG9hZGVkIG1ldGhvZHMgY2Fubm90IHN1cHBvcnQga3dhcmdzCiAgICAgICAgICAgICAgIHNvIHRoZSBjb21wYWN0IGRlZmF1bHQgYXJndW1lbnQgZmVhdHVyZSBpcyBhdXRvbWF0aWNhbGx5IHR1cm5lZCBvbiB3aGVuCiAgICAgICAgICAgICAgIGt3YXJncyBhcmUgc3BlY2lmaWVkLCBieSAlZmVhdHVyZSgia3dhcmdzIikuCgogICAgICAgICAgICAzKSBDb21wYWN0IGRlZmF1bHQgYXJndW1lbnRzIGFyZSBhbHNvIGF1dG9tYXRpY2FsbHkgdHVybmVkIG9uIHdoZW4gd3JhcHBpbmcKICAgICAgICAgICAgICAgQyAobm90IEMrKykgY29kZS4gVGhpcyBpcyB0byBzdXBwb3J0IHRoZSBiaXphcnJlIG5vdGlvbiBvZiBkZWZhdWx0IGFyZ3VtZW50cwogICAgICAgICAgICAgICBmb3IgQyBjb2RlLgoKMTAvMjAvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgT3ZlcmxvYWRlZCB0ZW1wbGF0ZWQgZnVuY3Rpb25zIGluIG5hbWVzcGFjZXMgYWxzbyB3b3JraW5nIG5vdy4KICAgICAgICAgICAgVGVtcGxhdGVkIGZ1bmN0aW9ucyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIGluIG5hbWVzcGFjZXMgdG9vLgoKMTAvMTkvMjAwNDogbW1hdHVzCgoJICAgIC0gQWxsb3cgdG8gZGlzYWJsZSB0aGUgbmV3IFN3aWdWYWx1ZVdyYXBwZXIgbWVjaGFuaXNtLAoJICAgICAgaWYgeW91IGFkZCB0aGUgZm9sbG93aW5nIGxpbmUgaW4geW91ciBsYW5ndWFnZSBtYWluLgoKCQkgLyogVHVybiBvbiBzYWZlIHZhbHVlIHdyYXBwZXIgdXNlIG1vZGUgKi8KICAgICAgICAgICAgICAgICBTd2lnX3ZhbHVlX3dyYXBwZXJfbW9kZSgxKTsKCgkgICAgICAKCSAgICAgIE5vdyBpcyBvbmx5IGFjdGl2ZSBpbiBweXRob24uIEFsbCB0aGUgb3RoZXIgbGFuZ3VhZ2VzCgkgICAgICBhcmUgdXNpbmcgdGhlIG9sZCByZXNvbHV0aW9uLCBidXQgdGhleSAgY2FuIGFsc28gdXNlIHRoZQoJICAgICAgInZhbHVld3JhcHBlciIvIm5vdmFsdWV3cmFwcGVyIiBmZWF0dXJlcyB0byBmaXggc29tZQoJICAgICAgb2YgdGhlIG9sZCBicm9rZW4gY2FzZXMuIE5vdGUsIGhvd2V2ZXIsICB0aGF0IG5vdCBhbGwgCgkgICAgICB0aGUgYnJva2VuIGNhc2VzIGNhbiBiZSBzb2x2ZWQgaW4gdGhhdCB3YXkuCgoJICAgICAgVGhlIG5ldyBtZWNoYW5pc20gc2VlbXMgdG8gYmUgd29ya2luZyBmaW5lIGluIHBlcmwsIHJ1YnkKCSAgICAgIGFuZCB0Y2wsIGJ1dCBmYWlsaW5nIGluIHNvbWUgdHlwZW1hcHMgaW4gamF2YS4KCgkgICAgICBIZW5jZSwgaXMgdXB0byB0aGUgbGFuZ3VhZ2UgbWFpbnRhaW5lciB0byB0ZXN0IGl0LCBhbmQKCSAgICAgIGRlY2lkZSB0byBlbmFibGUgaXQgb3Igbm90LgoKCSAgICAgIExvb2sgYXQgdGhlIHZhbHVld3JhcHBlcl9vcGFxdWUuaSBmb3IgZXhhbXBsZXMuCgoJICAgIC0gRml4IG1vcmUgU3dpZ1ZhbHVlV3JhcHBlciBjYXNlcyB3aGVuIHRoZSBuZXcgbWVjaGFuaXNtCgkgICAgICBpcyBhY3RpdmUuIE5vdyBpdCBhbHNvIGNoZWNrIGZvciBsb2NhbCB0eXBlbWFwCgkgICAgICB2YXJpYWJsZXMsIHNlZSB2YWx1ZXdyYXBwZXJfb3BhcXVlLmkgZm9yIGFuIGV4YW1wbGUgd2hlbgoJICAgICAgdGhpcyBpcyBuZWVkZWQuIEJ1dCBhZ2FpbiwgdGhpcyBleHRyYSBjaGVja2luZyB3aWxsIG9ubHkKCSAgICAgIGJlIGFjdGl2YXRlZCB3aGVuIHVzaW5nIHRoZSBuZXcgdmFsdWUgd3JhcHBlciBtb2RlLgoKCSAgICAtIFtQeXRob25dIEZpeCB2YXJpYWJsZSB3cmFwcGluZyBvZiBjbGFzc2VzIHdpdGggcHJpdmF0ZQoJICAgICAgYXNzaWduIG9wZXJhdG9ycy4gSXQgc2hvdWxkIGJlIGVhc3kgdG8gZml4IGluIGFsbCB0aGUgCgkgICAgICBvdGhlciBtb2R1bGVzLCBpbnN0ZWFkIG9mIGNoZWNraW5nCgoJICAgICAgICAgaWYgKCFHZXRhdHRyKG4sImltbXV0YWJsZSIpKSAuLi4KCQoJICAgICAgeW91IG5lZWQgdG8gdmVyaWZ5CgoJICAgICAgICAgaWYgKGlzX2Fzc2lnbmFibGUobikpIC4uLgoKCSAgICAgIExvb2sgYXQgdGhlIHByaXZhdGVfYXNzaWduLmkgZm9yIGFuIGV4YW1wbGUuCgoxMC8xOC8yMDA0OiBtbWF0dXMKCSAgICAtICVmZWF0dXJlcyAiZGlyZWN0b3IiLyJub2RpcmVjdG9yIiBub3cgd29yayBhcyBleHBlY3RlZC4KICAgICAgICAgICAgLSBHZW5lcmFsIGZpeGVzIGluICVmZWF0dXJlIHRvIHJlc29sdmUgZnVuY3Rpb24gZGVjbAoJICAgICAgcHJvcGVybHksCgkgICAgICAKCSAgICAgICAgJWZlYXR1cmUoImhlbGxvIikgZm9vKCk7CgkgICAgICAgIGNoYXIgZm9vKCkgLT4gIGYoKSAgICAvLyB3YXMgd29ya2luZwoJICAgICAgICBjaGFyICpmb28oKSAtPiBmKCkucCAgLy8gaXQgd2Fzbid0CiAKCiAgICAgICAgICAgIC0gVGVtcGxhdGUgKyBzcGVjaWFsaXphdGlvbiArIGRlZmF1bHQgdGVtcGxhdGUgYXJncyBub3cgaXMKCSAgICAgIHdvcmtpbmcsIChkb24ndCBjb25mdXNlIHdpdGggdGVtcGxhdGUgKyBkZWZhdWx0IGFyZwoJICAgICAgdmFsdWVzLCB0aGF0IHdhcyBzb2x2ZWQgYmVmb3JlKSwgbm93IHRoaXMgdWdseSBjYXNlIGlzCgkgICAgICB3b3JraW5nOgoKCSAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEEgPSBBbGxvYzxUPiA+CgkJc3RydWN0IFZlY3RvcgoJCXsKCQkgICBWZWN0b3IoVCBhKXt9CgkJfTsJCSAgIAoKCQl0ZW1wbGF0ZSA8PgoJCXN0cnVjdCBWZWN0b3I8ZG91YmxlPgoJCXsKCQkgIFZlY3Rvcigpe30KCQkgIGludCBmb28oKSB7IHJldHVybiAwOyB9CiAgICAgICAgICAgICAgICB9OwoKCSAgICAgICAgJXRlbXBsYXRlKFZfYykgVmVjdG9yPGNoYXIsIEFsbG9jPGNoYXI+ID47CgkgICAgICAgICV0ZW1wbGF0ZShWX2kpIFZlY3RvcjxpbnQ+OyAgICAvLyBwaWNrcyBWZWN0b3I8aW50LEFsbG9jPGludD4gPgoJICAgICAgICAldGVtcGxhdGUoVl9kKSBWZWN0b3I8ZG91YmxlPjsgLy8gcGlja3MgdGhlIHNwZWNpYWxpemF0aW9uCgkgICAgICAKICAgICAgICAgICAgICB0aGlzIGlzIG5lZWRlZCBmb3IgYXV0b21hdGljIFNUTCBzdXBwb3J0IChsYXRlciB3aWxsCiAgICAgICAgICAgICAgYmUpLgoKCSAgICAtIEZpeCB0aGUgdGVtcGxhdGUgKyB0eXBlZGVmIGVycm9ycyBpbiB0ZXN0LXN1aXRlLCB3aGljaAogICAgICAgICAgICAgIHByb2JhYmx5IHdpbGwgZml4IGFub3RoZXIgZ3JvdXAgb2Ygc3RyYW5nZSB0ZW1wbGF0ZSArCiAgICAgICAgICAgICAgbmFtZXNwYWNlcyArIHR5cGVkZWZzIGVycm9ycy4KCgkgICAgLSAld2FybmZpbHRlciBpcyB3b3JraW5nIGJldHRlciBub3csIHBhcnNlci55IHRyaWVzIHRvIHVzZQoJICAgICAgdGhlbSB3aGVuIG5lZWRlZC4KCgkgICAgLSAqKioqIE5ldyBkZWZhdWx0IHR5cGUgcmVzb2x1dGlvbiBtZXRob2QgKHN0eXBlLmMpICoqKioqIAoKCSAgICAgIEl0IHByZXNlcnZlcyB0aGUgb3JpZ2luYWwgbWl4ZWQgdHlwZXMsIHRoZW4gaXQgZ29lcwoJICAgICAgJ2JhY2t3YXJkJyBmaXJzdCBkZWxldGluZyB0aGUgcXVhbGlmaWVyLCB0aGVuIHRoZSBpbm5lcgoJICAgICAgdHlwZXMsIGZvciBleGFtcGxlOgogICAgCQkgCQkJCQkJCSAgCiAgICAJCSB0eXBlZGVmIEEgKkFwdHI7CQkJCSAgCiAgICAJCSBjb25zdCBBcHRyJjsJCQkJCQkKICAgIAkJIHIucShjb25zdCkuQXB0ciAgICAgICAtPiByLnEoY29uc3QpLnAuU1dJR1RZUEUJCQogICAgCQkgci5xKGNvbnN0KS5wLlNXSUdUWVBFIC0+IHIucC5TV0lHVFlQRQkJCQogICAgCQkgci5wLlNXSUdUWVBFICAgICAgICAgIC0+IHIuU1dJR1RZUEUJCQkKICAgIAkJIHIuU1dJR1RZUEUgICAgICAgICAgICAtPiBTV0lHVFlQRQkJCQoJCSAJCQkJCQkJCiAgICAJCSBlbnVtIEhlbGxvIHt9OwkJCQkJCQogICAgCQkgY29uc3QgSGVsbG8mIGhpOwkJCQkJCiAgICAJCSByLnEoY29uc3QpLkhlbGxvICAgICAgICAgIC0+IHIucShjb25zdCkuZW51bSBTV0lHVFlQRQkKICAgIAkJIHIucShjb25zdCkuZW51bSBTV0lHVFlQRSAgLT4gci5lbnVtIFNXSUdUWVBFCQkKICAgIAkJIHIuZW51bSBTV0lHVFlQRSAgICAgICAgICAgLT4gci5TV0lHVFlQRQkJCiAgICAJCSByLlNXSUdUWVBFICAgICAgICAgICAgICAgIC0+IFNXSUdUWVBFCQkJCgkJIAkJCQkJCQkKICAgIAkJIGludCBhWzJdWzRdOwkJCQkJCQogICAgCQkgYSgyKS5hKDQpLmludCAgICAgICAgICAgLT4gYShBTlkpLmEoQU5ZKS5TV0lHVFlQRQkKICAgIAkJIGEoQU5ZKS5hKEFOWSkuU1dJR1RZUEUgIC0+IGEoQU5ZKS5hKCkuU1dJR1RZUEUJCQogICAgCQkgYShBTlkpLmEoKS5TV0lHVFlQRSAgICAgLT4gYShBTlkpLnAuU1dJR1RZUEUJCQogICAgCQkgYShBTlkpLnAuU1dJR1RZUEUgICAgICAgLT4gYShBTlkpLlNXSUdUWVBFCQkKICAgIAkJIGEoQU5ZKS5TV0lHVFlQRSAgICAgICAgIC0+IGEoKS5TV0lHVFlQRQkJCiAgICAJCSBhKCkuU1dJR1RZUEUgICAgICAgICAgICAtPiBwLlNXSUdUWVBFCQkJCiAgICAJCSBwLlNXSUdUWVBFICAgICAgICAgICAgICAtPiBTV0lHVFlQRSAgICAgICAgICAgICAgICAgICAgCgoJICAgICAgYmVmb3JlIGl0IGFsd2F5cyBzdG9wcyBhZnRlciBmaW5kaW5nIHJlZi9wb2ludGVyL2VudW0vYXJyYXkvZXRjLgoJICAgICAgIAoJICAgICAgTm93LCB0aGVuLCB5b3UgY2FuIGRlZmluZSAodXNlIGFuZCBhcHBseSkgJ2hpZ2hlcicgdHlwZW1hcHMgc3VjaCBhczoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgU1dJR1RZUEUqIGNvbnN0JiAgCgkgICAgICAgICV0eXBlbWFwKG91dCkgY2hhciBGSVhTSVpFW0FOWV0KICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRSogY29uc3QmICAKCSAgICAgICAgJXR5cGVtYXAoaW4pIGNvbnN0IGVudW0gU1dJR1RZUEUmCgkgICAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRVtBTlldW0FOWV0KCSAgICAgICAgJXR5cGVtYXAoaW4pIGNvbnN0IGNoYXIgKCYpW0FOWV0KCSAgICAgICAKCSAgICAgIEl0IGlzIHBvc3NpYmxlIHdpdGggdGhpcyBjaGFuZ2UgdGhhdCBwcmV2aW91cyB0eXBlbWFwcwoJICAgICAgdGhhdCB3ZXJlIGRlZmluZWQgKGJ1dCBpZ25vcmVkKSwgbm93IHdpbGwgc3RhcnQgdG8gd29yay4KCgkgICAgICBBbHNvLCBpdCBpcyBuZWNlc3NhcnkgY2hlY2sgZm9yIHRoZSAnJXR5cGVtYXAodmFyaW4pIFNXSUdUWVBFW10nLAoJICAgICAgYmVmb3JlIGl0IHdhcyB1c3VhbGx5IG5vdCBkZWZpbmVkIChidXQgY2hhcltdIHdhcyksCgkgICAgICBhbmQgdGhhdCBjYW4gcHJvZHVjZSBzb21lIGluY29uc2lzdGVuY2llcy4KCiAgICAgICAgICAgICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCgkgICAgICBUaGlzIGNoYW5nZSB3YXMgbmVlZGVkIGZvciBTVEwsIHNpbmNlIHN0ZDo6dmVjdG9yPGVudW0gSGVsbG8+IAoJICAgICAgc3RkOjp2ZWN0b3I8QSo+LCBldGMsIHdpbGwgYWx3YXlzIGdlbmVyYXRlIG1ldGhvZHMgdGhhdAoJICAgICAgbWl4IGNvbnN0IHJlZmVyZW5jZXMgd2l0aCB0aGUgdmVjdG9yIHR5cGUuCgoJICAgICAgTm93IHRoYXQgaXMgd29ya2luZywgYWxsIHRoZSBzdGQ6OmNvbnRhaW5lcjxUKj4KCSAgICAgIHNwZWNpYWxpemF0aW9uIHdpbGwgbm90IGJlIG5lZWRlZCBhbnltb3JlLCB3ZWxsLCBpbgoJICAgICAgdGhlb3J5LiAKCgkgICAgICBJbiB0aGUgcHJhY3RpY2UsIGV2ZXJ5dGhpbiBpcyB3b3JraW5nIGFzIGJlZm9yZSB1bnRpbAoJICAgICAgdGhlIHByb3BlciBtaXhlZCB0eXBlcyBhcmUgZGVmaW5lZCBhbmQgdGhlIGxpYnJhcmllcwoJICAgICAgc2ltcGxpZmllZCB0byB1c2UgdGhlbS4KCgkgICAgLSBDaGFuZ2UgdGhlIGJlaGF2aW9yIG9mIGV4dGVybiAiamF2YSIvImZvcnRyYW4iLyJldGMiLCAKCSAgICAgIG5vdyBzd2lnIHByb2R1Y2VzIGEgd2FybmluZywgYW5kIHVzZSBleHRlcm4gIkMiIGluc3RlYWQuCgkgICAgICBUaGUgd2FybmluZyBjYW4gYWxzbyBiZSBkaXNhYmxlIHdpdGggdGhlICItdyAzMTMiIGZsYWcuCgkgICAgICAoV0FSTl9QQVJTRV9VTkRFRklORURfRVhURVJOKS4KCgkgICAgLSBTd2lnVmFsdWVXcmFwcGVyIGlzIG5vdyBtb3JlIHNlbGVjdGl2ZSAobGFuZy5jeHgpLgoKICAgICAgICAgICAgW1BlcmwvVGNsXQoJICAgIC0gRml4IHNvbWUgdHlwZW1hcHMgKHBlcmwvdGNsKSB0byB3b3JrIHByb3Blcmx5IHdpdGgKCSAgICAgIFN3aWdWYWx1ZVdyYXBwZXIuIFRoaXMgd2FzIG5vdCBhIHByb2JsZW0gd2l0aAoJICAgICAgU3dpZ1ZhbHVlV3JhcHBlciwgYnV0IHdpdGggdGhlIHR5cGVtYXBzIHRoYXQgbm93IGFyZQoJICAgICAgc2FmZSB0byB1c2Ugd2l0aCAlYXBwbHkuCgoJICAgIFtQeXRob25dCgogICAgICAgICAgICAtIEZpeCAlY2FsbGJhY2svJXB5dGhvbmNhbGxiYWNrIHdvcmsgbm93IGFzIGJlZm9yZSBhZnRlcgoJICAgICAgdGhlIGRlZiBhcmdzIGNoYW5nZXMuIEFsc28sICVjYWxsYmFjayBub3cgaXMgYW4gYWxpYXMKCSAgICAgIGZvciAlcHl0aG9uY2FsbGJhY2ssIHNvLCB0aGV5IGRvIHRoZSBzYW1lLgoKCSAgICBbUHl0aG9uL1J1YnldCgkgICAgLSAlY2FsbGJhY2sgaXMgbW9yZSB1c2FibGUgYW5kIHVuaWZvcm06CgogICAgICAgICAgICAgICAgICVjYWxsYmFjaygiJXNfY2IiKSBmb28oKTsgIC8vIGZvciBib3RoLCBweXRob24vcnVieQogICAgICAgICAgICAgICAgICVjYWxsYmFjaygiJXNfY2IiKTsgICAgICAgIC8vIGZvciBib3RoLCBweXRob24vcnVieQogICAgICAgICAgICAgICAgICVjYWxsYmFjaygxKSBmb28oKTsgICAgICAgIC8vIG9ubHkgaW4gcHl0aG9uLgoKMTAvMTcvMjAwNDogYXJ0eQoJICAgIFtPQ0FNTF0KCSAgICAtIFR3ZWFrIHRvIGVudW0gdHlwaW5nIGZvciBzb3VuZG5lc3MgaW4gdGhlIHByZXNlbmNlIG9mIG11bHRpcGxlCgkgICAgICBtb2R1bGVzLgoJICAgIC0gZ2xvYmFsIGZ1bmN0aW9ucyBhcmUgbm93IHVuYW1iaWd1b3VzIGluIG11bHRpcGxlIGxvYWRlZCBtb2R1bGVzLgoJICAgIC0gRml4ZWQgdGVzdCBjYXNlIGNvZGUgdG8gYnVpbGQgbXVsdGltb2R1bGUgdGVzdCBjYXNlcyBjb3JyZWN0bHkuCgkgICAgLSBUaGVyZSBpcyBubyB3YXkgdG8gc2hhcmUgb3ZlcmxvYWQgcmVzb2x1dGlvbiBhY3Jvc3MgbW9kdWxlcwoJICAgICAgYmVjYXVzZSBvZiBzb3VuZG5lc3MgaXNzdWVzLiAgSWYgdGhlIHVzZXIgd2FudHMgdG8gY2FsbCBzb21lCgkgICAgICBmdW5jdGlvbiBmb28gZnJvbSBhbiBhcmJpdHJhcnkgbW9kdWxlIGJhciwgdGhleSB3aWxsIGhhdmUgdG8KCSAgICAgIHVzZSBCYXIuX2ZvbyB0byBjYWxsIGl0IGNvcnJlY3RseS4gIExhdGVyIEkgd2lsbCBmaXggdGhlIAoJICAgICAgY2FtbHA0IG1vZHVsZSB0byBkbyBzb21ldGhpbmcgY2xldmVyIGluIHRoaXMgY2FzZS4gIAogICAgICAgICAgICAtIFByb21pZGVkIHBlcmZvcm1hbmNlIG92ZXJoYXVsIG9mIGNsYXNzIG1lY2hhbmlzbS4KCSAgICAtIFJlbW92ZWQgc3ltYm9sIGhhY2sgZm9yIG9jYW1sLTMuMDcgYW5kIGJlbG93IHdoaWNoIGlzIG5vdCBuZWVkZWQKCSAgICAgIGZvciBvY2FtbC0zLjA4IGFuZCBhYm92ZS4KCjEwLzE2LzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbQ0hJQ0tFTl0KCSAgICAtIENvbXBsZXRseSBjaGFuZ2UgaG93IGNoaWNrZW4uY3h4IGhhbmRsZXMgQ0xPUyBhbmQgZ2VuZXJpYyBjb2RlLgoJICAgICAgY2hpY2tlbiBubyBsb25nZXIgZXhwb3J0cyAtY2xvcy5zY20gYW5kIC1nZW5lcmljLnNjbS4gIFRoZSBjbG9zCgkgICAgICBjb2RlIGlzIGV4cG9ydGVkIGRpcmVjdGx5IGludG8gdGhlIG1vZHVsZS5zY20gZmlsZSBpZiAtcHJveHkgaXMgcGFzc2VkLgoJICAgIC0gVGhlIGNvZGUgbm93IGFsd2F5cyBleHBvcnRzIGEgdW5pdC4gIFJ1bm5pbmcgdGhlIHRlc3Qtc3VpdGUgaXMgbm93CgkgICAgICBtYWpvcmx5IGJyb2tlbiwgYW5kIG5lZWRzIHRvIGJlIGZpeGVkLgoJICAgIC0gQ0xPUyBub3cgZ2VuZXJhdGVzIHZpcnR1YWwgc2xvdHMgZm9yIG1lbWJlciB2YXJpYWJsZXMgc2ltaWxhciB0byBob3cKCSAgICAgIEdPT1BTIHN1cHBvcnQgd29ya3MgaW4gdGhlIGd1aWxlIG1vZHVsZS4KCSAgICAtIGNoaWNrZW4gbm8gbG9uZ2VyIHByZWZpeGVzIHN5bWJvbHMgYnkgdGhlIG1vZHVsZSBuYW1lLCBhbmQgbm8gbG9uZ2VyCgkgICAgICBmb3JjZXMgYWxsIG5hbWVzIHRvIGxvd2VyIGNhc2UuICBJdCBub3cgaGFzIC11c2VjbGFzc3ByZWZpeCBhbmQgLWNsb3NwcmVmaXgKCSAgICAgIHNpbWlsYXIgdG8gaG93IGd1aWxlIGhhbmRsZXMgR09PUFMgbmFtZXMuCgoxMC8xNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBUZW1wbGF0ZWQgZnVuY3Rpb25zIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgd29ya2luZyB3aXRoIG5ldyBkZWZhdWx0IGFyZ3VtZW50CiAgICAgICAgICAgIHdyYXBwaW5nIGFwcHJvYWNoLiBUaGUgbmV3IGFwcHJvYWNoIG5vIGxvbmdlciBmYWlscyB3aXRoIHRoZSBmb2xsb3dpbmcgZGVmYXVsdAogICAgICAgICAgICBhcmd1bWVudCBwYXR0ZXJuIChwcmV2aW91c2x5IGZhaWxlZCB3aXRoIHNvbWUgcHJpbWl0aXZlIHR5cGVzLCBsaWtlIAogICAgICAgICAgICB1bnNpZ25lZCBwcmltaXRpdmUgdHlwZXMpOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbnQgZm9vKGNvbnN0IFQmIHUgPSBUKCkpOwogICAgICAgICAgICAgICV0ZW1wbGF0ZShmb28pIGZvbzx1bnNpZ25lZCBpbnQ+OwoKICAgICAgICAgICAgVGhpcyByZWxpZXMgb24gdGhlIHRlbXBsYXRlZCBmdW5jdGlvbiBvdmVybG9hZGluZyBzdXBwb3J0IGp1c3QgYWRkZWQsIHNvIGFsbAogICAgICAgICAgICB0aGUgY29tYmluYXRpb25zIG9mIG92ZXJsb2FkaW5nIGJ5IHRlbXBsYXRlIHBhcmFtZXRlcnMgYW5kIG5vcm1hbCBwYXJhbWV0ZXJzCiAgICAgICAgICAgIGFzIHdlbGwgYXMgb3ZlcmxvYWRpbmcgd2l0aCBkZWZhdWx0IHBhcmFtZXRlcnMgd29ya3MuCgoxMC8xNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciB0aGUgbGFyZ2UgcmFuZ2Ugb2YgdGVtcGxhdGVkIGZ1bmN0aW9uIG92ZXJsb2FkaW5nIHRoYXQgQysrCiAgICAgICAgICAgIHN1cHBvcnRzLgoKICAgICAgICAgICAgLSBPdmVybG9hZGVkIHRlbXBsYXRlZCBmdW5jdGlvbnMsIGVnCgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGludCBvdmVybG9hZChUIHQpOwogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGludCBvdmVybG9hZChUIHQsIGNvbnN0IFQgJnIpOwoKICAgICAgICAgICAgLSBGaXhlcyB3aGVyZSB0aGUgdGVtcGxhdGVkIHR5cGUgaXMgbm90IHVzZWQgaW4gdGhlIHBhcmFtZXRlciBsaXN0LCBlZwoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIHh5eigpOwogICAgICAgICAgICAgIHRlbXBsYXRlPD4gdm9pZCB4eXo8ZG91YmxlPigpOwoKICAgICAgICAgICAgLSBGaXhlcyBmb3Igb3ZlcmxvYWRpbmcgb2YgcGxhaW4gZnVuY3Rpb25zIGJ5IGEgdGVtcGxhdGVkIGZ1bmN0aW9uOgoKICAgICAgICAgICAgICB2b2lkIGFiYyhkb3VibGUgZCk7CiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBhYmMoVCB0KTsKCiAgICAgICAgICAgIC0gT3ZlcmxvYWRpbmcgYnkgdGVtcGxhdGVkIHBhcmFtZXRlcnMgZml4ZWQ6CgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgZm9vKFQgdCkge30KICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPiB2b2lkIGZvbyhUIHQsIFUgdSkge30KCiAgICAgICAgICAgICAgJXRlbXBsYXRlKGZvbykgZm9vPGRvdWJsZSwgZG91YmxlPjsKCiAgICAgICAgICAgIC0gQWxsIGNvbWJpbmF0aW9ucyBvZiB0aGUgYWJvdmUgYWxzbyB3b3JraW5nIGluY2x1ZGluZyBzcGVjaWFsaXphdGlvbnMsIGVnOgoKICAgICAgICAgICAgICB2b2lkIGFiYyhkb3VibGUgZCk7CiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBhYmMoVCB0KTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTw+IHZvaWQgYWJjPGRvdWJsZT4oZG91YmxlIHQpOwogICAgICAgICAgICAgIHRlbXBsYXRlPD4gdm9pZCBhYmMoaW50IHQpOwoKMTAvMTYvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIC0gUmVtb3ZlIHRoZSBhYmlsaXR5IHRvIHNoYXJlIHR5cGUgaW5mb3JtYXRpb24gYnkgdXNpbmcgYyBsaW5raW5nLgogICAgICAgICAgICAgIEFsbCB0eXBlIHNoYXJpbmcgaGFwcGVucyB0aHJvdWdoIGEgZ2xvYmFsIHZhcmlhYmxlIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuCiAgICAgICAgICAgICAgICArIFJlbW92ZSBTV0lHX05PSU1QT1JULCBTV0lHX1JVTlRJTUUsIGFuZCByZWxhdGVkIGRlZmluZXMuCiAgICAgICAgICAgICAgICArIERlcHJlY2lhdGUgLXJ1bnRpbWUsIC1ub3J1bnRpbWUgY29tbWFuZCBsaW5lIG9wdGlvbnMKICAgICAgICAgICAgICAgICsgVXBkYXRlIHRlc3Qtc3VpdGUgY29tbW9uLm1rIHRvIGNvcnJlY3RseSBidWlsZCBtdWx0aWNwcHRlc3QKICAgICAgICAgICAgICAgICsgUmVtb3ZlIHJlZmVyZW5jZSB0byBwcmVjb21tb24uc3dnCiAgICAgICAgICAgICAgICArIFVwZGF0ZSB0aGUgZ3VpbGVfZ2ggaW50ZXJmYWNlIHRvIHNoYXJlIGRhdGEgYnkgYSBnbG9iYWwgdmFyIGluc3RlYWQKICAgICAgICAgICAgICAgICAgb2YgYyBsaW5rYWdlLgoKICAgICAgICAgICAgLSBSZW1vdmUgQWR2YW5jZWQuaHRtbCwgc2luY2UgZXZlcnl0aGluZyBpbiBpdCBpcyBub3cgb2Jzb2xldGUKCjEwLzA5LzIwMDQ6IG1tYXR1cwoJICAgIC0gU3BsaXQgdGhlIHB5dGhvbiBzdGQvU1RMIEMrKyBsaWJyYXJ5IGZpbGVzLCBub3cKCSAgICAgIGFsbCB0aGUgbGFuZ3VhZ2UgaW5kZXBlbmRlbnQgZGVmaW5pdGlvbnMgYXJlIHVuZGVyCgkgICAgICB0aGUgZGlyZWN0b3J5CgkgICAgICAKCQlMaWIvc3RkCgoJICAgICAgYW5kIGhlbmNlLCBjYW4gYmUgdXNlZCBmcm9tIG90aGVyIGxhbmd1YWdlcy4KCgkgICAgLSBBZGQgbW9yZSBkb2N1bWVudGF0aW9uIHRvIHRoZSBQeXRob24gU1RMLCBhbmQKCSAgICAgIGNsZWFuIHVubmVjZXNzYXJ5IGNvZGUuCgoJICAgIC0gQWRkIGluaXRpYWwgQzk5IGNvbXBsZXggc3VwcG9ydCwgYW5kIHNvbWUgZml4ZXMKCSAgICAgIGZvciBsb25nIGRvdWJsZS4KCjEwLzA4LzIwMDQ6IG1tYXR1cwoJICAgIC0gRml4IHRoZSBTd2lnVmFsdWVXcmFwcGVyIGZvciBvcGFxdWUgdHlwZXMsIG5vdyBpdCBpcyAKCSAgICAgIGFwcGxpZWQgZm9yIG9wYXF1ZSB0ZW1wbGF0ZXMgYW5kIGNsYXNzZXMsIGZvciB3aGljaCB3ZQoJICAgICAgZG9uJ3Qga25vdyBpZiB0aGVyZSBpcyBvciBub3QgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLCBpZQoKICAgICAgICAgICAgICAgICBzdHJ1Y3QgQSB7IAogICAgICAgICAgICAgICAgICAgQShpbnQpOwogICAgICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgICBTdGlsbCwgaWYgeW91IGtub3cgdGhhdCB5b3UgY2xhc3MgaGFzIGEgZGVmYXVsdAogICAgICAgICAgICAgIGNvbnN0cnVjdG9yLCBhbmQgZm9yIHNvbWUgdmVyeSB2ZXJ5IHBhcnRpY3VsYXIgcmVhc29uCiAgICAgICAgICAgICAgeW91IHdhbnQgdG8gYXZvaWQgdGhlIFN3aWdWYWx1ZVdyYXBwZXIsIGFuZCB5b3UgZG9uJ3QKICAgICAgICAgICAgICB3YW50IG9yIGNhbid0IGV4cG9zZSB0aGUgY2xhc3MgdG8gc3dpZywgbm93IHlvdSBjYW4KICAgICAgICAgICAgICBzYXkKCiAgICAgICAgICAgICAgICAgJWZlYXR1cmUoIm5vdmFsdWV3cmFwcGVyIikgQTsgICAgCiAgICAgICAgICAgICAgICAgY2xhc3MgQTsKICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgb3IgdGhlIG90aGVyIHdheSBhcm91bmQsIGlmIHRoZSBjbGFzcyBoYXMgYSBkZWZhdWx0CiAgICAgICAgICAgICAgY29uc3RydWN0b3IsIGJ1dCB5b3Ugd2FudCB0byB1c2UgdGhlIHZhbHVlIHdyYXBwZXIsIHlvdQogICAgICAgICAgICAgIGNhbiBzYXkKCiAgICAgICAgICAgICAgICAgJWZlYXR1cmUoInZhbHVld3JhcHBlciIpIEE7CiAgICAgICAgICAgICAgICAgc3RydWN0IEEgeyAKICAgICAgICAgICAgICAgICAgIEEoKTsKCQkgICAuLi4uCiAgICAgICAgICAgICAgICAgfTsgICAKICAgICAgCgkgICAgLSBGaXggZm9yIGNoYXIgPiAxMjgsIGllCgogICAgICAgICAgICAgICAgY29uc3QgY2hhciB0aWxkZV9hID0gJ1wzNDEnOwoKICAgICAgICAgICAgLSBBZGQgcGF0Y2ggMTA0MTg1OCBmb3IgJGxleHR5cGUsIHdoaWNoIGNhcnJpZXMgdGhlIAogICAgICAgICAgICAgIGxpdGVyYWwgdHlwZSBvZiBhIHN5bWJvbC4gU2VlIGxleHR5cGUuaSBpbiB0aGUKICAgICAgICAgICAgICB0ZXN0LXN1aXRlIGZvciBtb3JlIGRldGFpbHMuCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKCjEwLzA3LzIwMDQ6IHdzZnVsdG9uCgkgICAge1J1YnksIEphdmFdIEZpeCBkaXJlY3RvciArICdlbXB0eScgdGhyb3dzCgoJCSAgICBzdHJ1Y3QgQSB7CgkJICAgICAgQSgpIHRocm93KCk7CgkJICAgICAgdmlydHVhbCB+QSgpIHRocm93KCk7CgkJICAgICAgaW50IGZvbygpIHRocm93KCk7CgkJICAgIH07CgoKMTAvMDYvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtUQ0xdCiAgICAgICAgICAgIC0gRml4IGJ1ZyByZXBvcnRlZCBieSBXaWxsaWFtIEEuIEhvZmZtYW4gcHJvcGFnYXRpbmcgY2xpZW50ZGF0YQogICAgICAgICAgICBiZXR3ZWVuIG1vZHVsZXMuICBBZGRlZCBjbGllbnRkYXRhX3Byb3AubXVsdGljcHB0ZXN0IHRvIGNoZWNrIGZvcgogICAgICAgICAgICB0aGlzIGJ1Zy4gIFRoZSBmaXggaW52b2x2ZWQgdGhlIGZvbGxvd2luZyBjaGFuZ2VzOgogICAgICAgICAgICAgICAgKyBTd2lnVHlwZV9jbGllbnRkYXRhX2NvbGxlY3QgZG9lcyBub3QgbmVlZCB0byBjaGVjawogICAgICAgICAgICAgICAgdHlwZXMgaW4gcl9yZXNvbHZlZCBiZWNhdXNlIHdlIG9ubHkgd2FudCB0byBwcm9wYWdhdGUgY2xpZW50ZGF0YQogICAgICAgICAgICAgICAgdG8gdHlwZWRlZmVkIGNsYXNzZXMsIGFuZCByX21hbmdsZWQgYWxyZWFkeSB0YWtlcyBjYXJlIG9mIHR5cGVkZWZzLgoKICAgICAgICAgICAgICAgICsgU1dJR19UeXBlUmVnaXN0ZXIgbm93IGNvcGllcyB0aGUgY2xpZW50ZGF0YSBmaWVsZCBjb3JyZWN0bHkKCiAgICAgICAgICAgICAgICArIE1vdmUgU1dJR19HdWlsZV9Qcm9wYWdhdGVDbGllbnREYXRhIGZ1bmN0aW9uIGZyb20gZ3VpbGUgbW9kdWxlCiAgICAgICAgICAgICAgICBpbnRvIGNvbW1vbi5zd2csIGJlY2F1c2Ugd2UgbmVlZCB0byBjYWxsIGl0IGZyb20gYm90aCBndWlsZSBhbmQgdGNsLgoKICAgICAgICAgICAgICAgICsgQWRkIGJhc2VfbmFtZXMgdG8gc3dpZ19jbGFzcyB0byBkZWxheSB0aGUgbG9va3VwIG9mIGJhc2VzLiAgU1dJRwogICAgICAgICAgICAgICAgbm93IGV4cG9ydHMgdGhlIGJhc2UgbmFtZXMgYW5kIG9ubHkgd2hlbiB0aGUgYmFzZSBzd2lnX2NsYXNzIGlzCiAgICAgICAgICAgICAgICBuZWVkZWQgaXMgU1dJR19UeXBlUXVlcnkobmFtZSktPmNsaWVudGRhdGEgbG9va2VkIHVwLgoKICAgICAgICAgICAgLSBjb252ZXJzaW9uX25zX3RlbXBsYXRlIHRlc3RzdWl0ZSB0ZXN0IHdhcyBmYWlsaW5nIGJlY2F1c2UKICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHdyYXBwZWQgY29uc3RydWN0b3IgZnVuY3Rpb24gd2FzIG5vdCBjYWxjdWxhdGVkCiAgICAgICAgICAgIGNvcnJlY3RseSBmb3Igc3RydWN0cy4gIEZpeGVkLgoKMTAvMDYvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgRml4ZXMgZm9yIGRlZmF1bHQgYXJndW1lbnRzIHVzZWQgaW4gZGlyZWN0b3JzIC0gaW4gdmlydHVhbAogICAgICAgICAgICBtZXRob2RzIGFuZCBkaXJlY3RvciBjb25zdHJ1Y3RvcnMuCgoxMC8wNi8yMDA0OiBtbWF0dXMKCSAgICBGaXggdGhlIF9fY3BsdXNwbHVzIG1hY3JvLCBhbmQgYnVnIDEwNDExNzAuCgkgICAgTm93IGl0IGlzIHdvcmtpbmcgYXMgc3VwcG9zZWQsIGllLCB5b3UgY2FuIHNhZmVseSB1c2UKCgkgICAgICAjaWZkZWYgX19jcGx1c3BsdXMKCSAgICAgIC4uLgoJICAgIAoJICAgIGFsbCBvdmVyIHN3aWcsIGluY2x1ZGluZyBpbnNpZGUgJWRlZmluZXMgYW5kICV7ICV9IGJvZGllcy4KCgkgICAgCiAgICAgICAgICAgICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCgkgICAgVGhlIG9sZCB0cmljayBvZiB1c2luZwoKCSAgICAgICNpZiBfX2NwbHVzcGx1cwoKCSAgICBkb2Vzbid0IHdvcmsgYW55IG1vcmUuIFNvLCBpZiB5b3UgaGF2ZSB5b3VyIG93biB0eXBlbWFwcwoJICAgIHVzaW5nIHRoYXQgc3ludGF4LCB5b3Ugd2lsbCBuZWVkIHRvIG1pZ3JhdGUgdGhlbSB0byB1c2UKCSAgICAiI2lmZGVmIF9fY3BsdXNwbHVzIi4KCjEwLzA1LzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICAtIFJlb3JnYW5pemUgaG93IHJ1bnRpbWUgdHlwZSBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgYW5kIHNoYXJlZAoJICAgIGJldHdlZW4gbW9kdWxlcy4gIEZvciBjaGlja2VuIGFuZCBtenNjaGVtZSwgSSByZW1vdmVkCgkgICAgdGhlIGFiaWxpdHkgdG8gdXNlIHJ1bnRpbWUgbGlicmFyaWVzLCB3aGlsZSBwZXJsLCB0Y2wsIHB5dGhvbiwgYW5kCgkgICAgcnVieSBkZWZhdWx0IHRvIHVzaW5nIHRoZSBuZXcgbWV0aG9kIGJ1dCBjYW4gZ28gYmFjayB0byB0aGUgb2xkCgkgICAgbWV0aG9kIGJ5IGRlY2xhcmluZyBTV0lHX0FMTE9XX1JVTlRJTUUuCgoJICAgIC0gbGluZSA1ODIgaW4gbXpzY2hlbWUuY3h4IHdhcyBnZW5lcmF0aW5nIGEgc2VnZmF1bHQgb24gCgkgICAgaW1wb3J0cy5tdWx0aWNwcHRlc3QsIHNvIEkgZml4ZWQgaXQuCgoxMC8wNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlcyBmb3IgJWV4dGVuZCBhbmQgb3ZlcmxvYWRlZCBzdGF0aWMgbWV0aG9kcyB3aXRoIGRlZmF1bHQKICAgICAgICAgICAgYXJndW1lbnRzLgoKMTAvMDUvMjAwNDogbW1hdHVzCgkgICAgLSBbcHl0aG9uXSBGaXggZGlyZWN0b3IgKyBtZXRob2Qgd2l0aCAnZW1wdHknIHRocm93LCBpZQoKCQkgICAgc3RydWN0IEEgewoJCSAgICAgIHZpcnR1YWwgaW50IGZvbygpIHRocm93KCk7CgkJICAgIH07CgkJICAgIAoJICAgICAgb3RoZXIgbGFuZ3VhZ2VzIHNob3VsZCBhbHNvIGVhc3kgdG8gZml4LCBsb29rIGZvcgoJICAgICAgR2V0YXR0cihuLCJ0aHJvdyIpIGluIHB5dGhvbi5jeHguCgoJICAgIC0gRml4IGRpcmVjdG9yICsgZGVzdHJ1Y3RvciB3aXRoICdlbXB0eScgdGhyb3cKCgkJICAgIHN0cnVjdCBBIHsKCQkgICAgICB2aXJ0dWFsIH5BKCkgdGhyb3coKTsKCQkgICAgfTsKCgkgICAgLSBOb3cgU1dJR19GRUFUVVJFUyBwYXJzZSBhbGwgYW5kIHRoZSBzYW1lICBvcHRpb25zIHlvdQogICAgICAgICAgICAgIGNhbiBwYXNzIHRvIHN3aWcgaW4gdGhlIGNvbW1hbmQgbGluZS4KCSAgICAgIAoJICAgIC0gTmV3IGNvbW1hbmQgbGluZSBmbGFnOiAtZmVhdHVyZXMgPGxpc3Q+LCBhcyBpbgoKCSAgICAgICAgc3dpZyAtZmVhdHVyZXMgYXV0b2RvYz0zLGRpcmVjdG9yCgoJICAgICAgaWUsIGFueSBnbG9iYWwgZmVhdHVyZSBjYW4gYmUgaW5pdGlhbGl6ZWQgZnJvbSB0aGUKCSAgICAgIGNvbW1hbmQgbGluZS4gVGhpcyBpcyBtYWlubHkgZm9yIHRlc3RpbmcsIGJ1dCB1c2VycwoJICAgICAgY2FuIGFsc28gdGFrZSBhZHZhbnRhZ2Ugb2YgaXQuCgoxMC8wNC8yMDA0OiBtbWF0dXMKCSAgICAtIFByb3Blcmx5IHF1YWxpZnkgdHlwZSBpbiBzeW50YXggYXMgJ2xvbmcoMiknIG9yICdGb28oKScsCgkgICAgICB0aGlzIHNvbHZlIG9sZCBwcm9ibGVtIHdpdGggZGVmYXVsdCBhcmdzLCBhbmQgcHJvYmFibHkKCSAgICAgIG90aGVyIHByb2JsZW1zIGFyb3VuZC4gSG93ZXZlciwgdGhlIGRlZmF1bHQgYXJnIHByb2JsZW0KCSAgICAgIHdhcyBhbHNvIGFscmVhZHkgc29sdmVkIGJ5IFdpbGxpYW0gKHNlZSBiZWxsb3cpLgoKCSAgICAtIEZpeCBmZWF0dXJlX3NldCBhbmQgZmVhdHVyZV9nZXQgbWV0aG9kcy4gQmVmb3JlCgkgICAgICB0aGV5IGxvb2sgZnJvbSBwYXJ0aWN1bGFyIHRvIGdlbmVyYWwgYW5kIGtlZXAgdGhlIGZpcnN0CgkgICAgICBmZWF0dXJlIGZvdW5kLiBUaGlzIGRpZG4ndCB3b3JrIHdlbGwgd2l0aCB0ZW1wbGF0ZXMuCgkgICAgICBOb3cgdGhlIG1ldGhvZHMgbG9vayBmcm9tIGdlbmVyYWwgdG8gcGFydGljdWxhciwgYW5kCgkgICAgICBvdmVycmlkZSBhbnkgZm91bmQgZmVhdHVyZS4KCiAgICAgICAgICAgIC0gUHJldmlvdXNseSBhIGZlYXR1cmUgY291bGQgbm90IGJlIGFwcGxpZWQgdG8gY29uc3RydWN0b3JzCiAgICAgICAgICAgICAgb3IgZGVzdHJ1Y3RvcnMgdGhhdCB3ZXJlbid0IGV4cGxpY2l0bHkgZGVjbGFyZWQgaW4gdGhlIGNsYXNzLgogICAgICAgICAgICAgIFRoaXMgaXMgbm93IGZpeGVkLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgiZmVhdHVyZW5hbWUiKSBGb28oKSAiLi4uIgogICAgICAgICAgICAgICAgJWZlYXR1cmUoImZlYXR1cmVuYW1lIikgfkZvbygpICIuLi4iCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICAvLyBpbXBsaWNpdCBGb28oKSBhbmQgfkZvbygpCiAgICAgICAgICAgICAgICB9OwoKCSAgICAtIEZpeCBtaXNzaW5nIGZlYXR1cmVzIGZvciBkZWZhdWx0IGNvbnN0L2Rlc3QsIGJ5IHJlYWxseQoJICAgICAgJ2NyZWF0aW5nJyB0aGUgbWV0aG9kcyBhbmQgYXBwbHlpbmcgdGhlIGZlYXR1cmVzLgoKCSAgICAtIEZpeCByZXR1cm5fY29uc3RfdmFsdWUuaSBjYXNlIGJ5IGFkZGluZyBTd2lnVmFsdWVXcmFwcGVyPGNvbnN0IFQ+CgkgICAgICBzcGVjaWFsaXphdGlvbi4KCgkgICAgLSBGaXggJWV4dGVuZCArIG92ZXJsb2FkLCBpbmNsdWRpbmcgb3ZlcmxvYWRpbmcgYWN0dWFsCiAgICAgICAgICAgICAgY2xhc3MgbWV0aG9kcy4gCgoJICAgIC0gQWRkaW5nIG1vcmUgY2FzZXMgaW4gcmVsYXRlZCBmaWxlcyBpbiB0aGUgdGVzdC1zdWl0ZS4gIAoKMTAvMDQvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgQ2hhbmdlcyB0byB0aGUgd2F5IGRlZmF1bHQgYXJndW1lbnRzIGFyZSB3cmFwcGVkLiBQcmV2aW91c2x5IGEgc2luZ2xlCiAgICAgICAgICAgIG1ldGhvZCB3YXMgZ2VuZXJhdGVkIGZvciBlYWNoIG1ldGhvZCB0aGF0IGhhZCBkZWZhdWx0IGFyZ3VtZW50cy4gSWYKICAgICAgICAgICAgYSBtZXRob2QgaGFkIDUgYXJndW1lbnRzLCBzYXksIG9mIHdoaWNoIDEgaGFkIGEgZGVmYXVsdCBhcmd1bWVudAogICAgICAgICAgICB0aGVuIHRoZSBjYWxsIHRvIHRoZSB3cmFwcGVkIG1ldGhvZCB3b3VsZCBwYXNzIDUgYXJndW1lbnRzLiBUaGUgZGVmYXVsdAogICAgICAgICAgICB2YWx1ZSB3YXMgY29waWVkIGludG8gdGhlIHdyYXBwZXIgbWV0aG9kIGFuZCB1c2VkIGlmIHRoZSBzY3JpcHRpbmcKICAgICAgICAgICAgbGFuZ3VhZ2UgcGFzc2VkIGp1c3QgNCBhcmd1bWVudHMuIEhvd2V2ZXIsIHRoaXMgd2FzIGZsYXdlZCBhcyB0aGUKICAgICAgICAgICAgZGVmYXVsdCBhcmd1bWVudCBzb21ldGltZXMgZG9lcyBub3QgaGF2ZSBnbG9iYWwgYWNjZXNzLCBmb3IgZXhhbXBsZQogICAgICAgICAgICBTV0lHIHdvdWxkIGdlbmVyYXRlIGNvZGUgdGhhdCBjb3VsZG4ndCBjb21waWxlIHdoZW4gd3JhcHBpbmc6CgogICAgICAgICAgICAgIGNsYXNzIFRyaWNreSB7CiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbCA9IHByaXZhdGV2YWx1ZSk7CiAgICAgICAgICAgICAgICB2b2lkIGJhcihpbnQgdmFsID0gVHJpY2t5OjpnZXREZWZhdWx0KCkpOwogICAgICAgICAgICAgIHByaXZhdGU6CiAgICAgICAgICAgICAgICBzdGF0aWMgaW50IGdldERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGVudW0geyBwcml2YXRldmFsdWUgPSAyMDAgfTsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgQWxzbyBidWdzIGluIHJlc29sdmluZyBzeW1ib2xzIGdlbmVyYXRlZCBjb2RlIHRoYXQgd291bGRuJ3QgY29tcGlsZSwgZm9yIGV4YW1wbGUKICAgICAgICAgICAgKHByb2JhYmx5IGZpeGFibGUgdGhvdWdoKToKCiAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlIHsKICAgICAgICAgICAgICAgIGNsYXNzIEtsYXNzIHsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBLbGFzcyBjb25zdHJ1Y3RvcmNhbGwoY29uc3QgS2xhc3MmIGsgPSBLbGFzcygpKTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGUgYXBwcm9hY2ggYWxzbyBkb2VzIG5vdCB3b3JrIGZvciBzdGF0aWNhbGx5IHR5cGVkIGxhbmd1YWdlcyAoQyMgYW5kIEphdmEpCiAgICAgICAgICAgIGFzIHRoZXNlIGxhbmd1YWdlcyBkbyBub3QgYWxsb3cgbWV0aG9kcyB0byBoYXZlIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMuCiAgICAgICAgICAgIEFsdGhvdWdoIEMjIGhhcyBhIG1lY2hhbmlzbSB0byBwYXNzIGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB0aGV5CiAgICAgICAgICAgIG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZSBhbmQgYXJlIG1vcmUgbGlrZSB2YXJhcmdzLgoKICAgICAgICAgICAgVGhlIG5ldyBhcHByb2FjaCBzb2x2ZXMgdGhlIGFib3ZlIHByb2JsZW1zIGFuZCB3cmFwcyBtZXRob2RzIHdpdGggZGVmYXVsdAogICAgICAgICAgICBhcmd1bWVudHMgYXMgaWYgdGhlIG1ldGhvZCB3YXMgb3ZlcmxvYWRlZC4gU28gU1dJRyB3aWxsIG5vdyB0cmVhdAoKICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsPTApOwoKICAgICAgICAgICAgYXMgaWYgaXQgaGFkIHBhcnNlZDoKCiAgICAgICAgICAgICAgdm9pZCBmb28oaW50KTsKICAgICAgICAgICAgICB2b2lkIGZvbygpOwoKICAgICAgICAgICAgVGhlIGNvZGUgZ2VuZXJhdGVkIGlzIHRoZW4gZXhhY3RseSB0aGUgc2FtZSBhcyBpZiBTV0lHIGhhZCBwYXJzZWQgdGhlIHR3bwogICAgICAgICAgICBvdmVybG9hZGVkIG1ldGhvZHMuIFRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2VzIGNvdW50IHRoZSBhcmd1bWVudHMgcGFzc2VkIGFuZCBjYWxsCiAgICAgICAgICAgIHRoZSBhcHByb3ByaWF0ZSBtZXRob2QsIGp1c3QgbGlrZSBvdmVybG9hZGVkIG1ldGhvZHMuIEMjIGFuZCBKYXZhIGFyZSBub3cgYWJsZQogICAgICAgICAgICB0byBwcm9wZXJseSB3cmFwIG1ldGhvZHMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBieSBnZW5lcmF0aW5nIGV4dHJhIG1ldGhvZHMsCiAgICAgICAgICAgIGFnYWluIGFzIGlmIHRoZSBtZXRob2Qgd2FzIG92ZXJsb2FkZWQsIHNvIGZvcjoKCiAgICAgICAgICAgICAgdm9pZCBiYXIoc3RyaW5nIHM9ImhlbGxvIiwgZG91YmxlIGQ9MTAuMCwgaW50IGk9MCk7CgogICAgICAgICAgICB0aGUgZm9sbG93aW5nIHByb3h5IG1ldGhvZHMgYXJlIGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgdm9pZCBiYXIoc3RyaW5nIHMsIGRvdWJsZSBkLCBpbnQgaSk7CiAgICAgICAgICAgICAgdm9pZCBiYXIoc3RyaW5nIHMsIGRvdWJsZSBkKTsKICAgICAgICAgICAgICB2b2lkIGJhcihzdHJpbmcgcyk7CiAgICAgICAgICAgICAgdm9pZCBiYXIoKTsKCiAgICAgICAgICAgIFRoZSBuZXcgYXBwcm9hY2ggY29tZXMgd2l0aCBhIGNvdXBsZSBvZiBtaW5vciBrbm9jayBvbiBlZmZlY3RzLgoKICAgICAgICAgICAgMSkgU1dJRyBzdXBwb3J0IGZvciBkZWZhdWx0IGFyZ3VtZW50cyBmb3IgQyAobm90IEMrKykgY29kZSBubyBsb25nZXIgd29ya3MuCiAgICAgICAgICAgIFByZXZpb3VzbHkgeW91IGNvdWxkIGhhdmUgdGhpcyBpbnRlcmZhY2U6CgogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbCk7CiAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsPTApOwoKICAgICAgICAgICAgYW5kIGNhbGwgdGhlIHdyYXBwZWQgbWV0aG9kIGZyb20gYSBzY3JpcHRpbmcgbGFuZ3VhZ2UgYW5kIHBhc3Mgbm8gYXJndW1lbnRzCiAgICAgICAgICAgIHdoZXJldXBvbiB0aGUgZGVmYXVsdCBvZiAwIHdhcyB1c2VkLiBZb3UgY2FuIGdldCB0aGUgc2FtZSBiZWhhdmlvdXIgZm9yIEMKICAgICAgICAgICAgY29kZSBieSB1c2luZyB0aGUgImRlZmF1bHQiIHR5cGVtYXA6CgogICAgICAgICAgICAgICV0eXBlbWFwKGRlZmF1bHQpIGludCB2YWwgIiQxID0gMDsiOwogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbCk7CiAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsKTsKCiAgICAgICAgICAgIG9yIHlvdSBjb3VsZCBvZiBjb3Vyc2UgY29tcGlsZSB5b3VyIGNvZGUgYXMgQysrIGlmIHlvdSB3YW50IEMrKyBmZWF0dXJlcyA6KSA6CgogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbD0wKTsKICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWw9MCk7CgogICAgICAgICAgICBBIGNvdXBsZSBvZiBTV0lHJ3MgbGlicmFyaWVzIHVzZWQgdGhpcyBDIGV4dGVuc2lvbiBhbmQgdGhlc2UgaGF2ZSBiZWVuIG1vZGlmaWVkCiAgICAgICAgICAgIHRvIHVzZSB0aGUgImRlZmF1bHQiIHR5cGVtYXAuIFRoZSAiZGVmYXVsdCIgdHlwZW1hcCBpcyB0aHVzIHVuY2hhbmdlZCAoYW5kIHN0aWxsCiAgICAgICAgICAgIGlzIG5vdCBhbmQgaXMgbm90IGZ1bGx5IHN1cHBvcnRlZCBieSBDIyBhbmQgSmF2YSwgYW5kIGlzIGxpa2VseSB0byByZW1haW4gc28pLgoKCiAgICAgICAgICAgIDIpIEFsbCBmZWF0dXJlcyAoJWZlYXR1cmUsICVyZW5hbWUsICVpZ25vcmUgZXRjKSBubyBsb25nZXIgd29yayBhcyBpZiB0aGUgbWV0aG9kCiAgICAgICAgICAgIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgaXMganVzdCBvbmUgbWV0aG9kLiBGb3IgZXhhbXBsZSwgcHJldmlvdXNseQoKICAgICAgICAgICAgICAlaWdub3JlIGZvbyhpbnQpOwoKICAgICAgICAgICAgd291bGQgaGF2ZSBpZ25vcmVkIHRoZSBtZXRob2QgY29tcGxldGVseS4gTm93IGl0IHdpbGwgb25seSBpZ25vcmUgZm9vKGludCkgYnV0CiAgICAgICAgICAgIG5vdCB0aGUgZXh0cmEgZm9vKCkgbWV0aG9kLiBJbnN0ZWFkIHVzZToKCiAgICAgICAgICAgICAgJWlnbm9yZSBmb287CgogICAgICAgICAgICB0byBpZ25vcmUgdGhlbSBhbGwuIG9yCgogICAgICAgICAgICAgICVpZ25vcmUgZm9vKGludCk7CiAgICAgICAgICAgICAgJWlnbm9yZSBmb28oKTsKCiAgICAgICAgICAgIFRoaXMgb2YgY291cnNlIGFsbG93cyBvbmUgdG8gZmluZSB0dW5lIHRoZSB3cmFwcGluZywgZm9yIGV4YW1wbGUgb25lIGNvdWxkIHVzZToKCiAgICAgICAgICAgICAgJXJlbmFtZShmb29pbnQpIGZvbyhpbnQpOwogICAgICAgICAgICAgICVyZW5hbWUoZm9vZGVmYXVsdHMpIGZvbygpOwogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWw9MCk7CgogICAgICAgICAgICBhbmQgY2FsbCB0aGVtIGZyb20gYW55IGxhbmd1YWdlIGxpa2Ugc286CgogICAgICAgICAgICAgIGZvb2ludCgyMDApCiAgICAgICAgICAgICAgZm9vZGVmYXVsdHMoKQoKICAgICAgICAgICAgb3IgZm9yIGV4YW1wbGUgaWdub3JlIHRoZSBleHRyYSBvdmVybG9hZGVkIG1ldGhvZCwgc28gdGhlIGRlZmF1bHRzIGNhbm5vdCBiZSB1c2VkOgoKICAgICAgICAgICAgICAlaWdub3JlIGZvbygpOwogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWw9MCk7CgogICAgICAgICAgICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMC8yLzIwMDQ6IG1tYXR1cwoJICAgW1B5dGhvbl0KCSAgIC0gTW9yZSBjbGVhbmluZyB1cCBhbmQgdW5pZm9ybWF0aW9uIG9uIHRoZSBQeXRob24gTGliCgoJICAgLSBBZGRlZCBSb2JpbidzIGRvY3N0cmluZyBwYXRjaCwgcGx1cyBzb21lIGZpeGVzLCBwbHVzCgkgICAgIHNvbWUgZXh0ZW5zaW9ucywgc2VlIGF1dG9kb2MuaSBleGFtcGxlIGluIHRoZSB0ZXN0LXN1aXRlLAoJICAgICBhbmQgdHJ5IHVzaW5nICVmZWF0dXJlKCJhdXRvZG9jIiwiZXh0ZW5kZWQiKS4KCSAgICAKCSAgICAgVGhpcyBwYXRjaCBpcyBub3QgYSBjb21wbGV0ZSBzb2x1dGlvbiBmb3IgdGhlCgkgICAgIGRvY3VtZW50YXRpb24gcHJvYmxlbSwganVzdCBlbm91Z2ggdG8gaW5mb3JtIHB5dGhvbiBhYm91dAoJICAgICB0aGUgcGFyYW1ldGVyIGxpc3QuCgoJICAgICBUaGUgZXhwZWN0ZWQgc3dpZyBkb2N1bWVudGF0aW9uIHN1cHBvcnQgaXMgZmFyIGZhciBhd2F5IHlldC4KCSAgICAgCgoxMC8xLzIwMDQ6IG1tYXR1cwoJICAgLSBGaXggdGhlICVjYWxsYmFjayBmZWF0dXJlIChvbmx5IHVzZWQgaW4gcnVieSBhbmQgcHl0aG9uIGV4YW1wbGVzLAoJICAgICBieSBub3csIGJ1dCBpdCBzaG91bGQgYmUgZ2VuZXJpYyksIG5vdyBtZW1iZXIgY2FsbGJhY2tzCgkgICAgIGFyZSB3b3JraW5nIGFnYWluCgkgICAgIAoJICAgLSBGaXggd3JhcHBpbmcgb2YgZnVuY3Rpb25zIHBvaW50ZXJzIGxpa2UKCgkJIHN0ZDo6b3N0cmVhbSYgc3RkOjplbmRsKHN0ZDo6b3N0cmVhbSYpOwoKCSAgICAgaWUsIHRoZSBvbmVzIHRoYXQgcmV0dXJuIHJlZmVyZW5jZXMgb3IgZW51bXMuCgkgCgkgICBbUHl0aG9uXSBBZGQgdGhlICVweXRob25jYWxsYmFjayBkaXJlY3RpdmUsIHdoaWNoIGlzIAoJICAgYW4gaW1wcm92ZWQgdmVyc2lvbiBvZiAlY2FsbGJhY2ssIGllLAoKCSAgICAgJXB5dGhvbmNhbGxiYWNrKDEpIGZvbzsKCSAgICAgJXB5dGhvbmNhbGxiYWNrKDEpIEE6OmJhcjsKCSAgICAgJXB5dGhvbmNhbGxiYWNrKDEpIEE6OmJhcm07CgoJICAgICBpbnQgZm9vKGludCBhKSB7CgkgICAgICAgICByZXR1cm4gYTsKCSAgICAgfQogIAoJICAgICBzdHJ1Y3QgQSAKCSAgICAgewoJICAgICAgIHN0YXRpYyBpbnQgYmFyKGludCBhKTsKCSAgICAgICBpbnQgYmFybShpbnQgYSk7CgoJICAgICB9OwoKICAgICAgICAgICAgIGludCBmb29iYXIoaW50IGEsIGludCAoKnBmKShpbnQgYSkpOwoKCSAgIGluIHB5dGhvbiB5b3UgY2FuIHVzZQoKICAgICAgICAgICAgIGZvbygyKQoJICAgICBmb29iYXIoMixmb28pCiAgICAgICAgICAgICBBLmJhcigyKQoJICAgICBmb29iYXIoMixBLmJhcikKICAgICAgICAgIAogICAgICAgICAgIGllLCBubyBhZGRpdGlvbmFsIHBvaW50ZXIgZWxlbWVudHMgYXJlIGNyZWF0ZWQsIGFuZAoJICAgdGhlIG9yaWdpbmFsICdmb28nIGFuZCAnQS5iYXInIGNhbiBiZSB1c2VkIGFzIHBhcmFtZXRlcnMuCgoJICAgSW4gdGhlIGNhc2Ugb2YgbWVtYmVyIGZ1Y250aW9uIGhvd2V2ZXIsIHN0aWxsIHlvdSBuZWVkCgkgICB0byB1c2UgdGhlIHNwZWNpYWwgdmFyaWFibGUgQ2xhc3M6OjxmbmNfbmFtZT5fY2JfcHRyLCBpZToKCiAJICAgICBmb29iYXJtKDMsIGEsIEEuYmFybV9jYl9wdHIpCgkgICAKCSAgIHdlIHdpbGwgdHJ5IHRvIGZpeCB0aGlzIHNpdHVhdGlvbiBhbHNvLCBidXQgbGF0ZXIuICAKCgkgICBbUHl0aG9uXSBBZGQgbW9yZSBlbGVtZW50cyBmcm9tIHRoZSBTVEwgbGlicmFyeSwgbm93CgkgICB5b3UgY2FuIHVzZQoKCSAgICAgaW1wb3J0IHN0ZAoJICAgICBzdGQuY291dCA8PCAiaGVsbG8gIiA8PCAxMjMgPDwgc3RkLmVuZGwKCgkgICBbUHl0aG9uXSBGaXggaW4vb3V0IHJldHVybiBtZWNoYW5pc20sIG5vdyBzd2lnIHdpbGwgYmVoYXZlCgkgICBhcyAxLjMuMjEgYnV0IHVzaW5nIGEgcHl0aG9uIGxpc3Qgd2hlbiBuZWVkZWQuIFRoZSBwcm9ibGVtCgkgICBpcyB0aGF0IHRoZSB0eXBlcyBzdGQ6OnBhaXIsc3RkOjp2ZWN0b3IsZXRjLCB1c2UgdHVwbGVzLAoJICAgYW5kIHRoZXkgaW50ZXJmZXIgd2l0aCB0aGUgcHJldmlvdXMgaW5vdXQgdHVwbGUgdHlwZS4KCgkgICBCeSB1c2luZyBsaXN0cyB3ZSBzb2x2ZSB0aGUgY29uZmxpY3RzLCBzd2lnIGFjdHMgYXMgYmVmb3JlLAoJICAgYnV0IHJldHVybnMgYSBsaXN0IHdoZW4gbW9yZSB0aGFuIG9uZSBwYXJhbWV0ZXIgYXJlIHVzaW5nCgkgICB0aGUgT1VUIHR5cGVtYXAuIFNlZSB0aGUgbmV3IGlub3V0LmkgZXhhbXBsZSBpbiB0aGUKCSAgIHRlc3Qtc3VpdGUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgUFlUSE9OIE1PRFVMRSAqKioKCQkgICAKICAgICAgICAgICBbUHl0aG9uXSBNdWNoIGJldHRlciBlcnJvciBtZXNzYWdlcyBmb3IgYmFkIGFyZ3VtZW50cywgbm93CgkgICB5b3UgYWx3YXlzIGdldCB0aGUgYXJndW1lbnQgbnVtYmVyIHdoZXJlIHRoZSBlcnJvciBvY2N1cnJlZC4KCjA5LzI3LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoIGZyb20gQmlsbCBDbGFya2UgLQogICAgICAgICAgICAxKSBXYXJuaW5nIGVtaXR0ZWQgd2hlbiAtaW1wb3J0YWxsIGFuZCAtaW5jbHVkZWFsbCBpcyB1c2VkIHRvZ2V0aGVyLAogICAgICAgICAgICAgICB3aXRoIC1pbmNsdWRlYWxsIHRha2luZyBwcmVjZWRlbmNlLgogICAgICAgICAgICAyKSBFbnN1cmUgU1dJR0lNUE9SVEVEIGlzIGFsd2F5cyBkZWZpbmVkIHdoZW4gYSBmaWxlIGlzIGJlaW5nCiAgICAgICAgICAgICAgIGltcG9ydGVkIHdpdGggJWltcG9ydC4gTm90ZSB0aGF0IHRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIFNXSUdJTVBPUlQsCiAgICAgICAgICAgICAgIHdoaWNoIGdldHMgZGVmaW5lZCBpbiBhbGwgZ2VuZXJhdGVkIHdyYXBwZXIgZmlsZXMuCgowOS8yNi8yMDA0OiBtbWF0dXMKCgkgICAgLSBhZGQgJWZlYXR1cmUoImV4Y2VwdGlvbmNsYXNzIikgdG8gaWRlbnRpZnkgYSBjbGFzcyB1c2VkCgkgICAgICBhcyBleGNlcHRpb24uIEJlZm9yZSBzd2lnIGlkZW50aWZpZWQgYW5kIG1hcmtlZCBhIGNsYXNzCgkgICAgICB1c2luZyB0aGUgImNwbHVzOmV4Y2VwdGlvbmNsYXNzIiBhdHRyaWJ1dGUuIEhvd2V2ZXIsIHRoZQoJICAgICAgY2xhc3MgbmVlZGVkIHRvIGFwcGVhciBvbiBhbiB0aHJvdygpIHN0YXRlbWVudC4gIE5vdwoJICAgICAgc3dpZyBrZWVwcyB0cnlpbmcgdG8gaWRlbnRpZnkgdGhlIGV4Y2VwdGlvbiBjbGFzc2VzLCBhcwoJICAgICAgYmVmb3JlLCBidXQgaXQgYWxzbyBhbGxvd3MgdGhlIHVzZXIgdG8gbWFyayBhIGNsYXNzIGJ5CgkgICAgICB1c2luZyB0aGUgJWZlYXR1cmUgZXhwbGljaXRseS4gKG1vc3RseSByZWxldmFudCBmb3IKCSAgICAgIHB5dGhvbiBhbmQgY2hpY2tlbikKCgkgICAgW1B5dGhvbl0KCgkgICAgLSBmaXggLW1vZGVybiBvcHRpb24gKyBleGNlcHRpb25zLCB3aGljaCBtaXggb2xkIGNsYXNzCgkgICAgICBzdHlsZSB3aXRoIHRoZSBuZXcgb25lLiBTbywgd2UgYWx3YXlzIG5lZWQgdG8gZW1pdAoJICAgICAgdGhlICJub25tb2Rlcm4iIHB5dGhvbiBjb2RlLgoKCSAgICAtIGFkZCB0aGUgInB5dGhvbjpub25keW5hbWljIiBmZWF0dXJlIGFuZCBpdHMgaGFuZGxlcgoKCSAgICAgIG5vdyBpZiB5b3UgaGF2ZQoJICAgICAgCgkgICAgICAlcHl0aG9ubm9uZHluYW1pYygxKSBBOwoJICAgICAgCgkgICAgICBzdHJ1Y3QgQSB7CgkgICAgICAgaW50IGE7CgkgICAgICAgaW50IGI7CgkgICAgICB9OwoKCSAgICAgIHRoZW4sIGluIHRoZSBweXRob24gc2lkZQoJICAgICAgCgkgICAgICBhYSA9IEEoKQoJICAgICAgCgkgICAgICBhYS5hID0gMSAjIG9rCgkgICAgICBhYS5iID0gMiAjIG9rCgkgICAgICBhYS5jID0gMyAjIGVycm9yLCB0aGUgY2xhc3MgY2FuIG5vdCBiZSBleHRlbmRlZCBkeW5hbWljYWxseS4KCgkgICAgCgkgICAgU2luY2UgdGhpcyBpcyBhIGZlYXR1cmUsIHlvdSBjYW4gdXNlCgoJICAgICAgJXB5dGhvbm5vbmR5bmFtaWMoMSk7CgogICAgICAgICAgICBvciAKCgkgICAgICAlcHl0aG9uZHluYW1pYygwKTsgWyBOb3RlOiAlcHl0aG9uZHluYW1pYyBzaW5jZSBkZXByZWNhdGVkIF0KICAgCgkgICAgdG8gZm9yY2UgYWxsIHRoZSB3cmFwcGVkIGNsYXNzZXMgdG8gYmUgIm5vbmR5bmFtaWMiIG9uZXMuCgoJICAgIFRoZSBkZWZhdWx0LCBhcyBpbiByZWd1bGFyIHB5dGhvbiwgaXMgdGhhdCBhbGwgdGhlIHdyYXBwZWQKCSAgICBjbGFzc2VzIGFyZSBkeW5hbWljcy4gU28sIGNhcmVmdWwgd2l0aCB5b3VyIHNwZWxsaW5nLgoKMDkvMTQvMjAwNDogbW1hdHVzIAoJICAgIC0gU3VwcG9ydCB0aGUgLUktIG9wdGlvbi4KCgkgICAgLSBEaWZmZXJlbnRpYXRlIGJldHdlZW4gJWluY2x1ZGUgPGZpbGU+IGFuZCAlaW5jbHVkZSAiZmlsZSIuCgkgICAgICBUaGlzIGZpeCBzZXZlcmFsIGNvcm5lciBjYXNlcy4KCgkgICAgCgkgICAgW1B5dGhvbl0gU2V2ZXJhbCBwYXRjaGVzOgoKCSAgICAtIE5vcm1hbGl6ZSB0aGUgTGliIGZpbGUgbmFtZXM6IAoJCSouc3dnIGludGVybmFsIGZpbGVzLCAKCQkqLmkgICB1c2VyIGZpbGVzLgoKCSAgICAtIEZpeCBDaGFyW0FOWV0gdHlwZW1hcHMsIHNvIHRoZXkgYWxzbyBkZWxldGUgYW55IGV4dHJhICdcMCcgY2hhcnMsCgkgICAgICBub3cgdGhleSBiZWhhdmUgYXMgYmVmb3JlICgxLjMuMjEpLiBTdGlsbCwgeW91IGNhbiB1c2UKCSAgICAgIHRoZSBTV0lHX1BSRVNFUlZFX0NBUlJBWV9TSVpFIG1hY3JvIGlmIHlvdSBuZWVkIHRvCgkgICAgICBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgc2l6ZSAoc2VlIHB5c3RyYmFzZS5zd2cpLgoKCSAgICAtIEFkZCB0aGUgQ2hhciBGSVhTSVpFW0FOWV0gdHlwZW1hcHMsIHRvIHByZXNlcnZlIHRoZQogICAgICAgICAgICAgIG9yaWdpbmFsIEMgYXJyYXkgc2l6ZXMgKHNlZSBhYm92ZSkuIFRob3VnaCwgeW91IGNhbid0CiAgICAgICAgICAgICAgdXNlIHRoZW0geWV0IHNpbmNlICVhcHBseSBhbmQgYXJyYXlzIGFyZSBub3Qgd29ya2luZwogICAgICAgICAgICAgIHRvZ2V0aGVyLgoKICAgICAgICAgICAgLSBBZGQgcHlmcmFnbWVudHMuc3dnLCBub3cgdGhlIHVzZXIgY2FuIGFkZCBmcmFnbWVudHMKCSAgICAgIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IG9uZXMuCgowOS8xMC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCBmcm9tIEJpbGwgQ2xhcmtlIHdoaWNoIGZpeGVzIHNwdXJpb3VzIHByZXByb2Nlc3NvciBidWcgd2hpY2gKICAgICAgICAgICAgc2hvd3Mgb24gU29sYXJpcyBhbmQgZ2NjLCBlZzoKICAgICAgICAgICAgICAgIFdhcm5pbmcoMjAyKTogQ291bGQgbm90IGV2YWx1YXRlICchZGVmaW5lZChTV0lHSkFWQSkgJiYKICAgICAgICAgICAgICAgICEoZGVmaW5lZChTV0lHQ1NIQVJQKScKICAgICAgICAgICAgQWxzbyBmaXhlcyBhIGJ1ZyB3aGVyZSAnI2lmICJhIiA9PSAiYiIgPT0gMScgd291bGRuJ3QgaGF2ZSB3b3JrZWQgCgowOS8xMC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBSZXN0b3JlZCBtdWx0aXBsZSBidWlsZCBkaXJlY3RvcmllcyBmb3IgdGhlIHRlc3Qtc3VpdGUuIFBhdGNoIGZyb20KICAgICAgICAgICAgQmlsbCBDbGFya2UuCgowOS8wNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGRlZCB0aGUgbWlzc2luZyBydW50aW1lLmRzcCBWaXN1YWwgU3R1ZGlvIHByb2plY3QgZmlsZXMgZm9yIHRoZQogICAgICAgICAgICBpbXBvcnQgZXhhbXBsZXMgdG8gd29yay4KCgpWZXJzaW9uIDEuMy4yMiAoU2VwdGVtYmVyIDQsIDIwMDQpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjA5LzAzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFRoZSBzd2lnLm00IG1hY3JvIGZvciB1c2Ugd2l0aCB0aGUgQXV0b2NvbmYvQXV0b21ha2UvTGlidG9vbCBoYXMKICAgICAgICAgICAgYmVlbiByZW1vdmVkIGFuZCBpcyBubyBsb25nZXIgaW5zdGFsbGVkLiBQbGVhc2UgdXNlIHRoZSBuZXcgYW5kIGJldHRlcgogICAgICAgICAgICBtYWludGFpbmVkIHZlcnNpb24gZGVyaXZlZCBmcm9tIHN3aWcubTQgaW4gdGhlIEF1dG9jb25mIG1hY3JvIGFyY2hpdmUuCiAgICAgICAgICAgIFNlZSBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYWMtYXJjaGl2ZS9odG1sZG9jL2FjX3BrZ19zd2lnLmh0bWwgYW5kCiAgICAgICAgICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hYy1hcmNoaXZlL2h0bWxkb2MvYWNfcHl0aG9uX2RldmVsLmh0bWwuCgowOS8wMS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gQXBwbGllZCBwYXRjaCAjMTAxOTY2OSBmcm9tIENocmlzdG9waCBGbGFtbS4gQWRkcyBzdXBwb3J0CiAgICAgICAgICAgIGZvciAlZmVhdHVyZSgic2hhZG93IikgaW4gdGhlIHNhbWUgd2F5IGFzIGl0IHdvcmtzIGluIFB5dGhvbi4gVGhpcwogICAgICAgICAgICBlbmFibGVzIG9uZSB0byBvdmVycmlkZSB0aGUgZ2VuZXJhdGVkIHNoYWRvdy9wcm94eSBtZXRob2RzLCBpbmNsdWRpbmcKICAgICAgICAgICAgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycy4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIC8qIExldCdzIG1ha2UgdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBjbGFzcyBTcXVhcmUgbW9yZSB2ZXJib3NlICovCgogICAgICAgICAgICAgICVmZWF0dXJlKCJzaGFkb3ciKSBTcXVhcmUoZG91YmxlIHcpCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICAgIHN1YiBuZXcgewogICAgICAgICAgICAgICAgICBteSAkcGtnID0gc2hpZnQ7CiAgICAgICAgICAgICAgICAgIG15ICRzZWxmID0gZXhhbXBsZWM6Om5ld19TcXVhcmUoQF8pOwogICAgICAgICAgICAgICAgICBwcmludCBTVERFUlIgIkNvbnN0cnVjdGVkIGFuIEB7W3JlZigkc2VsZildfVxuIjsKICAgICAgICAgICAgICAgICAgYmxlc3MgJHNlbGYsICRwa2cgaWYgZGVmaW5lZCgkc2VsZik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICAgY2xhc3MgU3F1YXJlIHsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICBTcXVhcmUoZG91YmxlIHcpOwogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKCjA4LzMxLzIwMDQ6IG1tYXR1cyAKCSAgICBbUHl0aG9uXSBJbmNvbXBhdGliaWxpdHkgcmVwb3J0ZWQgYnkgQmlsbCBDbGFya2UgKGxsaWJAY29tcHV0ZXIub3JnKToKCSAgICAKCSAgICBJZiB5b3UgYXJlIHVzaW5nIFN1biBTdHVkaW8gOCAoYW5kIHBvc3NpYmx5IGVhcmxpZXIKCSAgICB2ZXJzaW9ucykgdG8gY29tcGlsZSB0aGUgb3V0cHV0IHByb2R1Y2VkIGJ5IHN3aWcKCSAgICAxLjMuMjJyYzEsIGFuZCB5b3UgYXJlIHVzaW5nIEMrKyBhbmQgU1RMIHRlbXBsYXRlcyB0aGVuCgkgICAgeW91IG5lZWQgdG8gdXNlIGVpdGhlciAiLXJ1bnRpbWUiIG9yICItbm9ydW50aW1lIi4gIElmIHlvdQoJICAgIHVzZSBuZWl0aGVyIG9mIHRoZXNlIG9wdGlvbnMgdGhlbiB5b3Ugd2lsbCBwcm9iYWJseSBnZXQKCSAgICBjb21waWxlciBlcnJvcnMgd2hlbiB0cnlpbmcgdG8gY29tcGlsZSB0aGUgd3JhcHBlciBmaWxlOwoJICAgIHRoZSBlcnJvciBtZXNzYWdlIHdpbGwgYmUgbGlrZSB0aGlzOiBUaGUgbmFtZQoJICAgIFNXSUdfUHl0aG9uX0NvbnZlcnRQdHJbLi4uXSBpcyB1bnVzYWJsZSBpbiBzdGF0aWMKCSAgICBzd2lncHk6OnRyYWl0c19hc3B0clsuLi5dICBJZiB5b3UgZ2V0IHRoaXMgZXJyb3IgbWVzc2FnZSwKCSAgICB5b3UgbmVlZCB0byByZWdlbmVyYXRlIHlvdXIgd3JhcHBlciBmaWxlIHVzaW5nICdzd2lnCgkgICAgLXJ1bnRpbWUnIG9yICdzd2lnIC1ub3J1bnRpbWUnLgoKCSAgICBZb3Ugc2hvdWxkbid0IGdldCB0aGlzIHByb2JsZW0gd2l0aCBTdW4gU3R1ZGlvIDkuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgUFlUSE9OIE1PRFVMRSAqKioKCSAgICAKMDgvMjYvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIEFwcGxpZWQgIzkzMjMzMyBmcm9tIElrZWdhbWkgVHN1dG9tdS4gRml4ZXMgbG9uZyBsb25nICpPVVRQVVQKICAgICAgICAgICAgYW5kIHVuc2lnbmVkIGxvbmcgbG9uZyAqT1VUUFVUIHR5cGVtYXBzIGluIHR5cGVtYXBzLmkuCgowOC8yNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBBcHBsaWVkIHBhdGNoICM4NTczNDQgZnJvbSBBcnQgWWVya2VzLiBXb3JrYXJvdW5kIGZvciBhdXRvY29uZiBidWcgd2hlbgogICAgICAgICAgICBydW5uaW5nICdtYWtlIGluc3RhbGwnLgoKMDgvMjYvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIFBhcnQgb2YgcGF0Y2ggIzk4Mjc1MyBhcHBsaWVkLiBUaGlzIGltcGxlbWVudHMgYSAlcGVybGNvZGUgZGlyZWN0aXZlLgogICAgICAgICAgICBJdCBhbGxvd3Mgb25lIHRvIGFkZCBQZXJsIGNvZGUgdG8gdGhlIGdlbmVyYXRlZCAucG0gZmlsZS4gV29ya3MgdGhlIHNhbWUgCiAgICAgICAgICAgIGFzICVweXRob25jb2RlLgoKMDgvMjYvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgZGlyZWN0b3JzIHdoZW4gd3JhcHBpbmcgdmlydHVhbCBtZXRob2RzIHdpdGggZXhjZXB0aW9uCiAgICAgICAgICAgIHNwZWNpZmljYXRpb25zIHRoYXQgd2VyZSBub3Qgc2ltcGxlIHR5cGVzLiBQcmV2aW91c2x5IGNvZGUgd2FzIGdlbmVyYXRlZCB0aGF0CiAgICAgICAgICAgIGRpZG4ndCBjb21waWxlLCBmb3IgZXhhbXBsZSB3aGVuIHRoZSBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiB3YXMgYSBwb2ludGVyLgoKMDgvMjUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBUeXBlbWFwIGZpeCBmb3IgbWV0aG9kcyB0aGF0IHJldHVybiBjaGFyICouIFRoZSBDTFIgd291bGQgaW5jb3JyZWN0bHkKICAgICAgICAgICAgZGVsZXRlIHRoZSBtZW1vcnkgcG9pbnRlZCB0byBieSBjaGFyICouIEFsc28gYXBwbGllZCB0aGUgc2FtZSBjb3JyZWN0aW9uIHRvCiAgICAgICAgICAgIHRoZSBjaGFyIGFycmF5IHR5cGVtYXBzLgoKMDgvMjQvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgRml4ZXMgZm9yIC1mbWljcm9zb2Z0IGVycm9yL3dhcm5pbmcgbWVzc2FnZSBkaXNwbGF5OiAKICAgICAgICAgICAgLSBFbmQgb2YgZmlsZSAoRU9GKSB3YXJuaW5nIG1lc3NhZ2VzIG5vdCBkaXNwbGF5aW5nIGluIGNvcnJlY3QgZm9ybWF0CiAgICAgICAgICAgIC0gU29tZSBtZXNzYWdlcyBjb250YWluaW5nIGEgZmlsZSBwYXRoIHdlcmUgZGlzcGxheWluZyBhIGRvdWJsZSBiYWNrc2xhc2gKICAgICAgICAgICAgICBpbnN0ZWFkIG9mIGEgc2luZ2xlIGJhY2tzbGFzaAoKMDgvMjMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgQXBwbGllZCBwYXRjaCAjMTAxMTYwNCBzdWJtaXR0ZWQgYnkgQ2hhcmxlcyBTY2h3aWV0ZXJzLiBGaXggZm9yIDY0IGJpdCB0Y2wKICAgICAgICAgICAgaW50ZXJwcmV0ZXJzLgoKMDgvMjMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciBidWcgIzg3NTU4MyAtIGVudW0gZm9yd2FyZCBkZWNsYXJhdGlvbnMgcHJldmlvdXNseSBnYXZlIGEgc3ludGF4IGVycm9yLgoKMDgvMjMvMjAwNDogbWtvZXBwZQoJICAgIFtBbGxlZ3JvIENMXSBVc2UgdHlwZW1hcHMgImZmaXR5cGUiIGFuZCAibGlzcHR5cGUiIHRvIGRldGVybWluZSB0aGUgRkZJIHR5cGUKCSAgICBzcGVjaWZpZXJzIGZyb20gdGhlIEMgdHlwZS4gIFRoaXMgbWFrZXMgaXQgcG9zc2libGUsIGZvciBpbnN0YW5jZSwgdG8gY29udHJvbAoJICAgIHdoZXRoZXIgYSBDICJjaGFyIiBhcmd1bWVudCB0YWtlcyBhIExpc3AgY2hhcmFjdGVyIG9yIGEgTGlzcCBpbnRlZ2VyIHZhbHVlLgoJICAgIFRoZSBkZWZhdWx0ICh0YWtpbmcgTGlzcCBjaGFyYWN0ZXJzKSBpcyBkb25lIGJ5IHRoZXNlIGJ1aWx0LWluIHR5cGVtYXBzOgoJICAgICAgJXR5cGVtYXAoZmZpdHlwZSkgY2hhciAiOmNoYXIiOyAldHlwZW1hcChsaXNwdHlwZSkgY2hhciAiY2hhcmFjdGVyIjsKCSAgICBJZiBjaGFyIG1lYW5zIGFuIGludGVnZXIgaW5zdGVhZCwgdXNlIHRoZXNlIHR5cGVtYXBzOgoJICAgICAgJXR5cGVtYXAoZmZpdHlwZSkgY2hhciAiOmNoYXIiOyAldHlwZW1hcChsaXNwdHlwZSkgY2hhciAiaW50ZWdlciI7CgowOC8yMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBBcyBkaXNjdXNzZWQgaW4gYnVnICM3NzI0NTMsIHRoZSBTV0lHIGxpYnJhcnkgZGlyZWN0b3J5IGlzIG5vdyBpbnN0YWxsZWQKICAgICAgICAgICAgaW50byBhIGRpZmZlcmVudCBkZWZhdWx0IGRpcmVjdG9yeS4gVGhlIGxpYnJhcnkgdXNlZCB0byBiZSBpbnN0YWxsZWQgdG8KICAgICAgICAgICAgL3Vzci9sb2NhbC9saWIvc3dpZzEuMy4gSXQgaXMgbm93IGluIHRoZSBtb3JlIHVzdWFsIGFyY2hpdGVjdHVyZSBpbmRlcGVuZGVudAogICAgICAgICAgICBkaXJlY3RvcnkgYW5kIEkgaGF2ZSBhZGRpdGlvbmFsbHkgdXNlZCBhIHZlcnNpb24gc3BlY2lmaWMgc3ViZGlyZWN0b3J5IGFzCiAgICAgICAgICAgIHRoZSBsaWJyYXJ5IHdpbGwgcmFyZWx5IHdvcmsgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBTV0lHLiBUaGlzIHJlbGVhc2UKICAgICAgICAgICAgd2lsbCB0aHVzIHVzZSAvdXNyL2xvY2FsL3NoYXJlL3N3aWcvMS4zLjIyIGJ5IGRlZmF1bHQsIHdoaWNoIGNhbiBiZQogICAgICAgICAgICB0YWlsb3JlZCBhcyBiZWZvcmUgdXNpbmcgJy4vY29uZmlndXJlIC0tc3dpZ2xpYmRpcicuCgowOC8xNy8yMDA0OiBta29lcHBlCgkgICAgW016U2NoZW1lXSBBZGQgc3VwcG9ydCB0byBjcmVhdGUgbmF0aXZlIE16U2NoZW1lIHN0cnVjdHVyZXMgZnJvbSBDIHN0cnVjdHVyZXMuCgkgICAgVG8gY29udmVydCBhIEMgc3RydWN0dXJlIHRvIGFuIE16U2NoZW1lIHN0cnVjdHVyZSwgdXNlIHRoZSBuZXcgcnVudGltZSBtYWNybwoJICAgIFNXSUdfTmV3U3RydWN0RnJvbVB0ciBpbiBhIHR5cGVtYXAuICBQYXRjaCBmcm9tIERtaXRyaXkgWmF2aW4uIAoKMDgvMTIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggIzgzNzcxNSBmcm9tIEJlbiBSZXNlciB0byBjb3JyZWN0bHkgZGV0ZWN0IFB5dGhvbiBsaWIgZGlyZWN0b3J5CiAgICAgICAgICAgIG9uIDY0IGJpdCBzeXN0ZW1zLgoKMDgvMTIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjIGFuZCBKYXZhXSBQcmV2ZW50IG1lbW9yeSBsZWFrcyBpbiB0aGUgY2FzZSBvZiBlYXJseSByZXR1cm4KICAgICAgICAgICAgZnJvbSB3cmFwcGVyIG1ldGhvZHMgdXNpbmcgY29uc3Qgc3RkOjpzdHJpbmcgJiBwYXJhbWV0ZXJzLiBNb2RpZmllZAogICAgICAgICAgICBNYXJrIFRyYXVkdCBwYXRjaCAjOTUxNTY1LgoKMDgvMTIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgQnVnICM5NDM3ODMgd2l0aCBwYXRjaCBmaXhlcyBwaHAgY2hhciAqIG91dCB0eXBlbWFwIE5VTEwgdmFsdWVzLgoKMDgvMDMvMjAwNDogQWhtb24gRGFuY3kgIDxkYW5jeUBkYW5jeT4KCiAgICAgICAgICAgIFthbGxlZ3JvY2xdIEFkZGl0aW9uYWwgY2FzZSBtb2RlIGZpeGVzLiAgQWxzbywgbWFrZSBzdXJlCgkgICAgZm9yZWlnbiB0eXBlcyBhcmUgZXhwb3J0ZWQuCgowNy8yNC8yMDA0OiBta29lcHBlIAoJICAgIFtHdWlsZV0gSW4gLXNjbSBtb2RlLCBTV0lHIG1vZHVsZXMgbm93IGV4Y2hhbmdlIHRoZWlyIHBvaW50ZXIgdHlwZQoJICAgIGluZm9ybWF0aW9uIHZpYSB0aGUgR3VpbGUgaW50ZXJwcmV0ZXIuICBJdCBpcyBubyBsb25nZXIgbmVjZXNzYXJ5IHRvIGJ1aWxkIGEKCSAgICBydW50aW1lIGxpYnJhcnkgb3IgdG8gdXNlIC1ub3J1bnRpbWUgYW5kIC1ydW50aW1lIGV0Yy4KCSAgICAKCSAgICBUaGUgbW9kdWxlIChTd2lnIHN3aWdydW4pIHdoaWNoIHdhcyBpbnRyb2R1Y2VkIGluIHRoZSBjaGFuZ2Ugb2YgMDUvMTcvMjAwNCBpcwoJICAgIG5vIGxvbmdlciBhdXRvbWF0aWNhbGx5IGJ1aWx0LiAgSWYgeW91IG5lZWQgaXQsIHJ1biBTV0lHIG9uIHRoZSBpbnRlcmZhY2UgZmlsZQoJICAgIHN3aWdydW4uaS4gCgowNy8yMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEJ1ZyAjOTE3NjAxIE1hcHBpbmcgQysrIGJvb2wgZml4IGZyb20gTWFyayBUcmF1ZHQKCjA3LzIzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFJQTSBmaXhlcyBmb3IgbGF0ZXN0IENWUyB2ZXJzaW9uIGluY2x1ZGluZyByZW1vdmFsIG9mIHJ1bnRpbWUKICAgICAgICAgICAgbGlicmFyeS4KCjA3LzIzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoICM5MDg5NTUgZnJvbSBSb2JlcnQgSCBEZSBWcmllcy4KICAgICAgICAgICAgUlBNIGZpbGUgZ2VuZXJhdGlvbiBmaXggZm9yIEZlZG9yZSBDb3JlIDEgYW5kIFJlZGhhdCBBUzIuMS4KCjA3LzEyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoICM4NjQ2ODkgZnJvbSBSb2JpbiBEdW5uOgoKICAgICAgICAgICAgVGhpcyBwYXRjaCBjb3JyZWN0cyB0d28gcHJvYmxlbXMgaW4gdGhlIFhNTCBvdXRwdXQgb2YgU1dJRzoKICAgICAgICAgICAgIAogICAgICAgICAgICAgIDEuIFRoZXJlIHdlcmUgb2Z0ZW4gZXh0cmEgJy8+XG4nIGluIHRoZSBvdXRwdXQuCiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgMi4gdmFsdWUgYXR0cmlidXRlcyB3ZXJlIG91dHB1dCB3aXRoICdcbicgaW4gdGhlbSBidXQKICAgICAgICAgICAgICBzaW5jZSB0aGF0IGlzIG5vdCB0ZWNobmljYWxseSBsZWdhbCBtb3N0IChhbGw/KSBYTUwKICAgICAgICAgICAgICBwYXJzZXJzIHdpbGwgc3RyaXAgdGhlbSBvdXQuIFJlcGxhY2luZyB0aGUgJ1xuJyB3aXRoCiAgICAgICAgICAgICAgdGhlICcmIzEwOycgZW50aXR5IHJlZmVyZW5jZSBzb2x2ZXMgdGhpcyBhcyB0aGF0IGlzCiAgICAgICAgICAgICAgbGVnYWwgYW5kIFhNTCBwYXJzZXJzIHdpbGwgY29udmVydCBpdCB0byBhICdcbicgd2hlbgogICAgICAgICAgICAgIHJlYWRpbmcgdGhlIHZhbHVlcyBiYWNrIGluLgogICAgICAgICAgICAgIAogICAgICAgICAgICAgIFRoaXMgcGF0Y2ggYWxzbyBhZGRzIGEgbmV3IGdsb2JhbCBjb21tYW5kIGxpbmUgb3B0aW9uCiAgICAgICAgICAgICAgdGhhdCB3aWxsIGFsbG93IHRoZSBwYXJzZSB0cmVlIHRvIGJlIHdyaXR0ZW4gb3V0IGluIFhNTAogICAgICAgICAgICAgICphZnRlciogc29tZSBvdGhlciBsYW5ndWFnZSBtb2R1bGUgaGFzIGJlZW4gcnVuLCBpbgogICAgICAgICAgICAgIG9yZGVyIHRvIGJlIGFibGUgdG8gZ2V0IGV4dHJhIGluZm8gdGhhdCB0aGUgbGFuZ3VhZ2UKICAgICAgICAgICAgICBtb2R1bGUgcHV0cyBpbiB0aGUgdHJlZS4gSW4gdGhpcyB3YXkgdGhlIFhNTCBpcyBhCiAgICAgICAgICAgICAgcG9zdC1wcm9jZXNzZWQgdmVyc2lvbiBvZiB0aGUgdHJlZSByYXRoZXIgdGhhbiBhCiAgICAgICAgICAgICAgcHJlLXByb2Nlc3NlZCB2ZXJzaW9uLiAKIAogICAgICAgICAgICAgIENvbW1hbmQgbGluZSBvcHRpb24gaXMgLWR1bXBfeG1sIG9yIC14bWxvdXQgPGZpbGU+CgowNy8xMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUGF0Y2ggZnJvbSBTY290dCBNaWNoZWwgdG8gZml4IHR5cGVzYWZlIGVudW1zIGFuZCBwcm9wZXIgZW51bXMKICAgICAgICAgICAgd2l0aCBkaXJlY3RvcnMuCgowNy8xMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBIVE1MIGRvY3VtZW50YXRpb24gKG1ha2VjaGFwLnB5KSBmaWxlIGdlbmVyYXRvciBtaXNzaW5nIGVuZCBvZiBsaW5lCiAgICAgICAgICAgIHBhdGNoICM5MDg5NTEgZnJvbSBSb2JlcnQgZGUgVnJpZXMuCgowNy8wOC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBUaGUgZGVwcmVjYXRlZCBydW50aW1lIGxpYnJhcnkgYnVpbGQgaGFzIGJlZW4gcmVtb3ZlZC4gVGhpcyBhbHNvIHJlbW92ZXMKICAgICAgICAgICAgdGhlIGRlcGVuZGVuY3kgb24gTGlidG9vbC4gTGlidG9vbCBpcyBubyBsb25nZXIgcmVxdWlyZWQgdG8gYnVpbGQgU1dJRy4KICAgICAgICAgICAgVGhlIGFzc29jaWF0ZWQgLWxkZmxhZ3MgU1dJRyBjb21tYW5kbGluZSBvcHRpb24gaGFzIGFsc28gYmVlbiByZW1vdmVkLgoKICAgICAgICAgICAgVGhlIGV4YW1wbGVzIGFuZCB0ZXN0LXN1aXRlIHRlc3RjYXNlcyB0aGF0IHVzZWQgdGhlIHJ1bnRpbWUgbGlicmFyeSBoYXZlCiAgICAgICAgICAgIGJlZW4gdXBkYXRlZCB0byB1c2UgdGhlIHJlcGxhY2VtZW50IGFwcHJvYWNoIHRvIHVzaW5nIFNXSUcgYWNyb3NzIAogICAgICAgICAgICBtdWx0aXBsZSBtb2R1bGVzLCB0aGF0IGlzIHRoZXkgdXNlIHRoZSAtbm9ydW50aW1lIGFuZCAtcnVudGltZSBjb21tYW5kbGluZQogICAgICAgICAgICBvcHRpb25zLCBzZWUgTW9kdWxlcy5odG1sLiBFZmZlY3RpdmVseSB0aGV5IGJ1aWxkIHRoZWlyIG93biBydW50aW1lCiAgICAgICAgICAgIGxpYnJhcmllcyB1c2luZyAtcnVudGltZS4gVGhlIGV4YW1wbGVzIGFyZSBpbXBvcnQgYW5kIGltcG9ydF90ZW1wbGF0ZS4KICAgICAgICAgICAgVGhlIHRlc3QgY2FzZXMgYXJlIGluIHRoZSBpbXBvcnRzIGFuZCB0ZW1wbGF0ZV90eXBlZGVmX2ltcG9ydCBkaXJlY3Rvcmllcy4KCiAgICAgICAgICAgIEFueW9uZSB3aG8gd2FudHMgdGhlIG9yaWdpbmFsIHJ1bnRpbWUgbGlicmFyaWVzIGNhbiBlaXRoZXIgcnVuIHRoZSB0ZXN0LXN1aXRlCiAgICAgICAgICAgIG9yIGJ1aWxkIHRoZSBleGFtcGxlcyBhbmQgdXNlIHRoZSBhcHByb3ByaWF0ZSBzaGFyZWQgb2JqZWN0L0RMTCB0aGF0IGlzCiAgICAgICAgICAgIGdlbmVyYXRlZCB3aXRoIHRoZSAtcnVudGltZSBjb21tYW5kbGluZSBvcHRpb24uIEZvciBleGFtcGxlIGxpYmltcG9ydHNfcnVudGltZS5zbwogICAgICAgICAgICAoUHl0aG9uIGNhbGxzIGl0IGxpYl9pbXBvcnRzX3J1bnRpbWUuc28pIGlzIGdlbmVyYXRlZCBhZnRlciBydW5uaW5nIHRoZSAKICAgICAgICAgICAgJ21ha2UgaW1wb3J0cy5tdWx0aWNwcHRlc3QnIHRlc3RjYXNlIGluIHRoZSBFeGFtcGxlcy90ZXN0LXN1aXRlLzxsYW5nPgogICAgICAgICAgICBkaXJlY3RvcnkuIE9yIHVzZSBsaWJydW50aW1lLnNvIC8gcnVudGltZS5kbGwgYWZ0ZXIgYnVpbGRpbmcgdGhlIGltcG9ydAogICAgICAgICAgICBleGFtcGxlcyBpbiBFeGFtcGxlcy88bGFuZz4vaW1wb3J0LgoKMDcvMDcvMjAwNDogbWtvZXBwZQoJICAgIFtBbGxlZ3JvIENMXSBDb252ZXJ0IGNoYXJhY3RlciBhbmQgc3RyaW5nIGxpdGVyYWxzIGluIGNvbnN0YW50cyB0byAKCSAgICBDTCBzeW50YXguICBGaXggRkY6REVGLUZPUkVJR04tQ0FMTCBmb3IgbWl4ZWQtY2FzZSBDIGZ1bmN0aW9ucy4KCjA2LzI3LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBOZXcgZmVhdHVyZSBmb3IgSmF2YSBleGNlcHRpb25zIHdpdGggZm9ybWF0ICVqYXZhZXhjZXB0aW9uKGV4Y2VwdGlvbmNsYXNzZXMpLgogICAgICAgICAgICBUaGlzIGZlYXR1cmUgaXMgYSBzbGlnaHQgZW5oYW5jZW1lbnQgdG8gJWV4Y2VwdGlvbiBhbmQgdGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aGUgCiAgICAgICAgICAgIGFkZGl0aW9uIG9mIHRoZSBleGNlcHRpb24gY2xhc3NlcyB3aGljaCBhcmUgZ2VuZXJhdGVkIGludG8gYSB0aHJvd3MgY2xhdXNlLgogICAgICAgICAgICBUaGUgJ2V4Y2VwdGlvbmNsYXNzZXMnIGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgY2xhc3NlcyB3aGljaCB3aWxsIGJlCiAgICAgICAgICAgIGFkZGVkIHRvIHRoZSBhc3NvY2lhdGVkIHByb3h5IG1ldGhvZCdzIHRocm93cyBjbGF1c2UuIFRoZSAnZXhjZXB0aW9uY2xhc3NlcycKICAgICAgICAgICAgYXJlIHNwZWNpZmllZCBsaWtlIHRoZSBleGNlcHRpb24gY2xhc3NlcyBpbiB0aGUgJ3Rocm93cycgYXR0cmlidXRlIGluIHRoZQogICAgICAgICAgICB0eXBlbWFwcy4gVGhpcyBmZWF0dXJlIHNob3VsZCBiZSB1c2VkIGZvciBjb3JyZWN0bHkgaGFuZGxpbmcgY2hlY2tlZCBleGNlcHRpb25zCiAgICAgICAgICAgIHRocm93biBmcm9tIEpOSSBjb2RlLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWphdmFleGNlcHRpb24oImphdmEubGFuZy5FeGNlcHRpb24iKSB0aHJvd0V4Y2VwdGlvbiAlewogICAgICAgICAgICAgICAgLi4uIGNvbnZlcnQgYSBzdGQ6OmxvZ2ljX2Vycm9yIGludG8gYSBqYXZhLmxhbmcuRXhjZXB0aW9uIHVzaW5nIEpOSSBjb2RlIC4uLgogICAgICAgICAgICAgICV9CgogICAgICAgICAgICAgICNpbmNsdWRlIDxzdGRleGNlcHQ+CiAgICAgICAgICAgICAgdm9pZCB0aHJvd0V4Y2VwdGlvbigpIHsKICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoIkxvZ2ljIGVycm9yISIpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHdpbGwgZ2VuZXJhdGUgYSBtZXRob2Qgd2l0aCBhIHRocm93cyBjbGF1c2UgaW4gdGhlIG1vZHVsZSBjbGFzczoKCiAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHRocm93RXhjZXB0aW9uKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24geyAuLi4gfQoKMDYvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBOZXcgJWNzY29uc3R2YWx1ZSh2YWx1ZSkgZmVhdHVyZSBkaXJlY3RpdmUgZm9yIHVzZSB3aXRoIGNvbnN0YW50cyBhbmQKICAgICAgICAgICAgZW51bXMuIFRoaXMgd29ya3MgdGhlIHNhbWUgd2F5IGFzICVqYXZhY29uc3R2YWx1ZS4gRm9yIEMjLCB0aGlzIGRpcmVjdGl2ZQogICAgICAgICAgICBpcyB0aGUgb25seSB3YXkgdGhhdCBvbmUgY2FuIGZpeCB3cmFwcGluZyBvZiBDL0MrKyBlbnVtcyB3aXRoIHByb3BlciBDIwogICAgICAgICAgICBlbnVtcyBpZiB0aGUgZW51bSBpdGVtJ3MgaW5pdGlhbGlzZXIgY2Fubm90IGNvbXBpbGUgYXMgQyMgY29kZS4gVGhpcyBpcwogICAgICAgICAgICBiZWNhdXNlIEphdmEgZW51bXMgY2FuIHVzZSBhIGNhbGwgaW50byBDIGNvZGUgdG8gaW5pdGlhbGlzZSB0aGUgZW51bSBpdGVtLAogICAgICAgICAgICB3aGVyZWFzIGluIEMjLCB0aGUgZW51bSB2YWx1ZSBtdXN0IGJlIGEgY29tcGlsZSB0aW1lIGNvbnN0YW50LiBUaGF0IGlzLAogICAgICAgICAgICB1c2luZyAlY3Njb25zdCgwKSBjYW5ub3QgYmUgdXNlZCBpbiBDIyB0byBpbml0aWFsaXNlIHRoZSBDIyBlbnVtIGl0ZW0gdmlhCiAgICAgICAgICAgIGEgUElOVk9LRSBjYWxsLgoKMDYvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIE5ldyAlamF2YWNvbnN0dmFsdWUodmFsdWUpIGZlYXR1cmUgZGlyZWN0aXZlIGZvciB1c2Ugd2l0aCBjb25zdGFudHMgYW5kCiAgICAgICAgICAgIGVudW1zLiBTb21ldGltZXMgdGhlIHVzZSBvZiAlamF2YWNvbnN0KDEpIHdpbGwgcHJvZHVjZSBjb2RlIHRoYXQgd29uJ3QgY29tcGlsZQogICAgICAgICAgICB1bmRlciBKYXZhLiBJZiBhIGNvbXBpbGUgdGltZSBjb25zdGFudCBpcyByZXF1aXJlZCwgJWphdmFjb25zdCgwKSBpcyBub3QgYW4KICAgICAgICAgICAgb3B0aW9uLiBUaGUgJWphdmFjb25zdHZhbHVlIGRpcmVjdGl2ZSBhY2hpZXZlcyB0aGlzIGdvYWwgYW5kIHRoZSB2YWx1ZSBzcGVjaWZpZWQKICAgICAgICAgICAgaXMgZ2VuZXJhdGVkIGFzIEphdmEgY29kZSB0byBpbml0aWFsaXNlIHRoZSBjb25zdGFudC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlamF2YWNvbnN0KDEpOwogICAgICAgICAgICAgICVqYXZhY29uc3R2YWx1ZSgxMDAwKSBCSUc7CiAgICAgICAgICAgICAgJWphdmFjb25zdHZhbHVlKCJuZXcgamF2YS5tYXRoLkJpZ0ludGVnZXIoXCIyMDAwXCIpIikgTEFSR0U7CiAgICAgICAgICAgICAgJWphdmFjb25zdHZhbHVlKDEwKSBiYXI7CiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICAgIGNvbnN0IGludCBiYXIgPSAxMDsKICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgICVpbmxpbmUgJXsKICAgICAgICAgICAgICAgICNkZWZpbmUgQklHIDEwMDBMTAogICAgICAgICAgICAgICAgI2RlZmluZSBMQVJHRSAyMDAwVUxMCiAgICAgICAgICAgICAgICBlbnVtIEZvbyB7IEJBUiA9IDo6YmFyIH07CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIEdlbmVyYXRlczoKCiAgICAgICAgICAgICAgcHVibGljIGludGVyZmFjZSBleGFtcGxlQ29uc3RhbnRzIHsKICAgICAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgbG9uZyBCSUcgPSAxMDAwOwogICAgICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBMQVJHRSA9IG5ldyBqYXZhLm1hdGguQmlnSW50ZWdlcigiMjAwMCIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBwdWJsaWMgZmluYWwgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgRm9vIEJBUiA9IG5ldyBGb28oIkJBUiIsIDEwKTsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFByZXZpb3VzbHksIG5vbmUgb2YgQklHLCBMQVJHRSBvciBCQVIgd291bGQgaGF2ZSBwcm9kdWNlZCBjb21waWxlYWJsZSBjb2RlCiAgICAgICAgICAgIHdoZW4gdXNpbmcgJWphdmFjb25zdCgxKS4KCjA2LzI3LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgICVmZWF0dXJlIGVuaGFuY2VtZW50cy4gRmVhdHVyZXMgY2FuIG5vdyB0YWtlIGFuIHVubGltaXRlZCBudW1iZXIgb2YgYXR0cmlidXRlcwogICAgICAgICAgICBpbiBhZGRpdGlvbiB0byB0aGUgZmVhdHVyZSBuYW1lIGFuZCBmZWF0dXJlIHZhbHVlLiBUaGUgYXR0cmlidXRlcyBhcmUgb3B0aW9uYWwgCiAgICAgICAgICAgIGFuZCBhcmUgbXVjaCB0aGUgc2FtZSBhcyB0aGUgdHlwZW1hcCBhdHRyaWJ1dGVzLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZwogICAgICAgICAgICBzcGVjaWZpZXMgdHdvIG9wdGlvbmFsIGF0dHJpYnV0ZXMsIGF0dHJpYjEgYW5kIGF0dHJpYjI6CgogICAgICAgICAgICAgJWZlYXR1cmUoZmVhdHVyZW5hbWUsIGF0dHJpYjE9ImF0dHJpYnZhbDEiLCBhdHRyaWIyPSJhdHRyaWJ2YWwyIikgbmFtZSAidmFsIjsKICAgICAgICAgICAgICVmZWF0dXJlKGZlYXR1cmVuYW1lLCB2YWwsIGF0dHJpYjE9ImF0dHJpYnZhbDEiLCBhdHRyaWIyPSJhdHRyaWJ2YWwyIikgbmFtZTsKCjA2LzI3LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgICVmZWF0dXJlIGltcHJvdmVtZW50cyBmb3IgdGhlIHN5bnRheCB0aGF0IHRha2VzIHRoZSBmZWF0dXJlIHZhbHVlIHdpdGhpbiB0aGUKICAgICAgICAgICAgJWZlYXR1cmUoKSBicmFja2V0cy4gVGhlIHZhbHVlIHNwZWNpZmllZCBpcyBubyBsb25nZXIgcmVzdHJpY3RlZCB0byBiZWluZyBqdXN0CiAgICAgICAgICAgIGEgc3RyaW5nLiBJdCBjYW4gYmUgYSBzdHJpbmcgb3IgYSBudW1iZXIuIEZvciBleGFtcGxlLCB0aGlzIGlzIG5vdyBhY2NlcHRhYmxlCiAgICAgICAgICAgIHN5bnRheDoKICAgICAgICAgICAgICAlZmVhdHVyZSgiZmVhdHVyZW5hbWUiLDIwLjApOwogICAgICAgICAgICB3aGVyZWFzIHByZXZpb3VzbHkgaXQgd291bGQgaGF2ZSB0byBoYXZlIGJlZW46CiAgICAgICAgICAgICAgJWZlYXR1cmUoImZlYXR1cmVuYW1lIiwiMjAuMCIpOwogICAgICAgICAgICBVc2VmdWwgZm9yIGZlYXR1cmVzIHRoYXQgYXJlIGltcGxlbWVudGVkIGFzIGEgbWFjcm8sIGZvciBleGFtcGxlOgogICAgICAgICAgICAgICNkZWZpbmUgJXNvbWVmZWF0dXJlKHZhbHVlKSAgICAgICVmZWF0dXJlKCJzb21lZmVhdHVyZSIsdmFsdWUpCiAgICAgICAgICAgIFRoZXNlIHdpbGwgbm93IHdvcmsgYWNjZXB0aW5nIGVpdGhlciBhIHN0cmluZyBvciBhIG51bWJlcjoKICAgICAgICAgICAgICAlc29tZWZlYXR1cmUoIkZyZWQiKTsKICAgICAgICAgICAgICAlc29tZWZlYXR1cmUoNCk7CgowNi8wNi8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW0NoaWNrZW4sIEd1aWxlXQogICAgICAgICAgICAgLSBDcmVhdGVkIHRoZSBFeGFtcGxlcy90ZXN0LXN1aXRlL3NjaGVtZXJ1bm1lIGRpcmVjdG9yeSwgd2hpY2ggaG9sZHMgYWxsIHRoZQoJICAgICAgIHJ1bm1lIHNjcmlwdHMgZm9yIGd1aWxlIGFuZCBjaGlja2VuIChhbmQgcG9zc2libHkgbXpzY2hlbWUuLi4pLiAgVGhlIGd1aWxlCgkgICAgICAgYW5kIGNoaWNrZW4gX3J1bm1lIGZpbGVzIHRoZW4gKGxvYWQgIi4uL3NjaGVtZXJ1bm1lL2Zvby5zY20iKS4KICAgICAgICAgICAgIC0gSW4gY2hpY2tlbiBtb2R1bGUsIGZpeCBhIGZldyBidWdzIGludmxvbHZpbmcgZHluYW1pYyBjYXN0cy4KCjA2LzAzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoIHRvIGZpeCB3cmFwcGluZyBvZiB0ZW1wbGF0ZWQgbWV0aG9kcy4gSVNPIGNvbXBsaWFudCBjb21waWxlcnMsIGxpa2UKICAgICAgICAgICAgQ29tZWF1IGFuZCBHQ0MtMy40LjAsIGRvbid0IGxpa2UgdGhlIHRlbXBsYXRlIHNwZWNpZmllciB0aGF0IFNXSUcgd2FzIGdlbmVyYXRpbmcKICAgICAgICAgICAgd2hlbiBjYWxsaW5nIHRoZSBtZXRob2QuIFRoaXMgZml4IG1heSBicmVhayBzb21lIG5vbiBzdGFuZGFyZCBjb21wbGlhbnQgY29tcGlsZXJzLAogICAgICAgICAgICBmb3IgZXhhbXBsZSwgU3VuIHdvcmtzaG9wIGNvbXBpbGVycyBwcmlvciB0byB2ZXJzaW9uIDYuMi5wMi4gUGF0Y2ggc3VibWl0dGVkCiAgICAgICAgICAgIGJ5IEJpbGwgQ2xhcmtlLgoKMDYvMDMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBVbmRvY3VtZW50ZWQgc3BlY2lhbCB2YXJpYWJsZSAkaW1jbGFzc25hbWUgcmVtb3ZlZC4KICAgICAgICAgICAgTmV3IHNwZWNpYWwgdmFyaWFibGUgJG1vZHVsZSBpcyByZXBsYWNlZCBieSB0aGUgbW9kdWxlIG5hbWUsIGFzIHNwZWNpZmllZAogICAgICAgICAgICBieSAlbW9kdWxlIG9yIC1tb2R1bGUgY29tbWFuZGxpbmUgb3B0aW9uLiAkaW1jbGFzc25hbWUgY2FuIGJlIGNyZWF0ZWQgZnJvbSAkbW9kdWxlLgoKMDYvMDMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBTYW1lIGFzIGZvciBKYXZhIGJlbG93LiBUaGUgbmV3IHR5cGVtYXBzIGFyZSBuYW1lZCBkaWZmZXJlbnRseSwgbmFtZWx5LAogICAgICAgICAgICBjc2JvZHkgYW5kIGNzYm9keV9kZXJpdmVkLiBUaGUgZGVwcmVjYXRlZCB0eXBlbWFwcyBhcmUgY3NnZXRjcHRyIGFuZAogICAgICAgICAgICBjc3B0cmNvbnN0cnVjdG9ybW9kaWZpZXJzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEMjIE1PRFVMRSAqKioKCjA2LzAzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBUeXBlbWFwIGNoYW5nZXMgZm9yIHRoZSBKYXZhIHByb3h5IC8gdHlwZXdyYXBwZXIgYW5kIGVudW0gY2xhc3Nlcy4gQSBuZXcKICAgICAgICAgICAgdHlwZW1hcCBjYWxsZWQgamF2YWJvZHkgY29udGFpbnMgdGhlIGVzc2VudGlhbCBzdXBwb3J0IGNvZGUgZm9yIGdlbmVyYXRpb24gaW50byB0aGUgYm9keQogICAgICAgICAgICBvZiB0aGVzZSBjbGFzc2VzLiBUaGVyZSBpcyBhbHNvIGEgbmV3IGphdmFib2R5X2Rlcml2ZWQgdHlwZW1hcCB3aGljaCBpcyB1c2VkIGluc3RlYWQgZm9yCiAgICAgICAgICAgIHdyYXBwZWQgY2xhc3NlcyB0aGF0IGhhdmUgYSB3cmFwcGVkIGJhc2UgY2xhc3MuIFRoZSBjb2RlIGlzIGJhc2ljYWxseSwgdGhlIGdldENQdHIoKQogICAgICAgICAgICBtZXRob2QgYW5kIHN3aWdDUHRyIGFuZCBzd2lnQ01lbU93biBtZW1iZXIgdmFyaWFibGVzLiBUaGVzZSB1c2VkIHRvIGJlIGhhcmQgY29kZWQKICAgICAgICAgICAgd2l0aCBubyB3YXkgdG8gbW9kaWZ5IHRoZSBjb2RlLiBUaGUgaW50cm9kdWN0aW9uIG9mIHRoaXMgdHlwZW1hcCBtYWtlcyBpdCBwb3NzaWJsZSBmb3IKICAgICAgICAgICAgdGhlIHVzZXIgdG8gdGFpbG9yIG5lYXJseSBldmVyeSBhc3BlY3Qgb2YgdGhlIGNvZGUgZ2VuZXJhdGlvbi4KICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBub3cgaXMgdGhlIGNvZGUgZm9yIGRpcmVjdG9yIGNsYXNzZXMuCgogICAgICAgICAgICBUaGUgamF2YWdldGNwdHIgYW5kIGphdmFwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycyB0eXBlbWFwcyBhcmUgZGVwcmVjYXRlZCBhbmQgYXJlCiAgICAgICAgICAgIG5vIGxvbmdlciB1c2VkIGFzIHRoZSBjb2RlIHRoYXQgdGhlc2UgZ2VuZXJhdGVkIGNhbiBiZSBwdXQgaW4gdGhlIG1vcmUgZmxleGlibGUKICAgICAgICAgICAgamF2YWJvZHkgYW5kIGphdmFib2R5X2Rlcml2ZWQgdHlwZW1hcHMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIG1hY3JvcyBjb250cmlidXRlZCBieSBTY290dCBNaWNoZWwgbWF5IGhlbHAgeW91IHVwZ3JhZGUgaWYgeW91IGhhdmUgdXNlZAogICAgICAgICAgICB0aGUgamF2YWdldGNwdHIgdHlwZW1hcDoKCiAgICAgICAgICAgICAgICAvKiBVdGlsaXR5IG1hY3JvIGZvciBtYW5pcHVsYXRpbmcgdGhlIEphdmEgYm9keSBjb2RlIG1ldGhvZCBhdHRyaWJ1dGVzICovCiAgICAgICAgICAgICAgICAlZGVmaW5lIFNXSUdKQVZBX0FUVFJJQlMoVFlQRU5BTUUsIENUT1JfQVRUUklCLCBHRVRDUFRSX0FUVFJJQikKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFib2R5KSBUWVBFTkFNRSAlewogICAgICAgICAgICAgICAgICBwcml2YXRlIGxvbmcgc3dpZ0NQdHI7CiAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBib29sZWFuIHN3aWdDTWVtT3duOwoKICAgICAgICAgICAgICAgICAgQ1RPUl9BVFRSSUIgJGphdmFjbGFzc25hbWUobG9uZyBjUHRyLCBib29sZWFuIGNNZW1vcnlPd24pIHsKICAgICAgICAgICAgICAgICAgICBzd2lnQ01lbU93biA9IGNNZW1vcnlPd247CiAgICAgICAgICAgICAgICAgICAgc3dpZ0NQdHIgPSBjUHRyOwogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICBHRVRDUFRSX0FUVFJJQiBzdGF0aWMgbG9uZyBnZXRDUHRyKCRqYXZhY2xhc3NuYW1lIG9iaikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAob2JqID09IG51bGwpID8gMCA6IG9iai5zd2lnQ1B0cjsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhYm9keV9kZXJpdmVkKSBUWVBFTkFNRSAlewogICAgICAgICAgICAgICAgICBwcml2YXRlIGxvbmcgc3dpZ0NQdHI7CgogICAgICAgICAgICAgICAgICBDVE9SX0FUVFJJQiAkamF2YWNsYXNzbmFtZShsb25nIGNQdHIsIGJvb2xlYW4gY01lbW9yeU93bikgewogICAgICAgICAgICAgICAgICAgIHN1cGVyKCRtb2R1bGVKTkkuU1dJRyRqYXZhY2xhc3NuYW1lVXBjYXN0KGNQdHIpLCBjTWVtb3J5T3duKTsKICAgICAgICAgICAgICAgICAgICBzd2lnQ1B0ciA9IGNQdHI7CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgIEdFVENQVFJfQVRUUklCIHN0YXRpYyBsb25nIGdldENQdHIoJGphdmFjbGFzc25hbWUgb2JqKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvYmogPT0gbnVsbCkgPyAwIDogb2JqLnN3aWdDUHRyOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgICAgJWVuZGRlZgoKICAgICAgICAgICAgICAgIC8qIFRoZSBkZWZhdWx0IGlzIHByb3RlY3RlZCBnZXRDUHRyLCBwcm90ZWN0ZWQgY29uc3RydWN0b3IgKi8KICAgICAgICAgICAgICAgIFNXSUdKQVZBX0FUVFJJQlMoU1dJR1RZUEUsIHByb3RlY3RlZCwgcHJvdGVjdGVkKQoKICAgICAgICAgICAgICAgIC8qIFB1YmxpYyBnZXRDUHRyIG1ldGhvZCwgcHJvdGVjdGVkIGNvbnN0cnVjdG9yICovCiAgICAgICAgICAgICAgICAlZGVmaW5lIFBVQkxJQ19HRVRDUFRSKFRZUEVOQU1FKQogICAgICAgICAgICAgICAgU1dJR0pBVkFfQVRUUklCUyhUWVBFTkFNRSwgcHJvdGVjdGVkLCBwdWJsaWMpCiAgICAgICAgICAgICAgICAlZW5kZGVmCgogICAgICAgICAgICAgICAgLyogUHVibGljIGdldENQdHIgbWV0aG9kLCBwdWJsaWMgY29uc3RydWN0b3IgKi8KICAgICAgICAgICAgICAgICVkZWZpbmUgUFVCTElDX0JPRFlNRVRIT0RTKFRZUEVOQU1FKQogICAgICAgICAgICAgICAgU1dJR0pBVkFfQVRUUklCUyhUWVBFTkFNRSwgcHVibGljLCBwdWJsaWMpCiAgICAgICAgICAgICAgICAlZW5kZGVmCgowNi8wMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIFRoZSBjb250ZW50cyBvZiB0aGUgY2xhc3MgbW9kaWZpZXIgdHlwZW1hcHMgYW5kIHByYWdtYXMgaGF2ZSBjaGFuZ2VkLgogICAgICAgICAgICBUaGV5IG11c3Qgbm93IGluY2x1ZGUgdGhlIGNsYXNzIHR5cGUuIFByZXZpb3VzbHkgJ2NsYXNzJyB3YXMgaGFyZCBjb2RlZC4KICAgICAgICAgICAgVGhpcyBjaGFuZ2UgZW5hYmxlcyBmbGV4aWJpbGl0eSBpbnRvIHdoYXQgdHlwZSBvZiBjbGFzcyBpcyBnZW5lcmF0ZWQsCiAgICAgICAgICAgIGZvciBleGFtcGxlIHRoZSBwcm94eSBjbGFzcyBjb3VsZCBiZSBhbiBpbnRlcmZhY2UgaW5zdGVhZCBvZiBhIGNsYXNzLgoKICAgICAgICAgICAgRm9yIEphdmEgdGhpcyBhZmZlY3RzIHRoZSBqYXZhY2xhc3Ntb2RpZmllcnMgdHlwZW1hcCBhbmQgdGhlIGpuaWNsYXNzY2xhc3Ntb2RpZmllcnMKICAgICAgICAgICAgYW5kIG1vZHVsZWNsYXNzbW9kaWZpZXJzIHByYWdtYXMuCgogICAgICAgICAgICBGb3IgQyMgdGhpcyBhZmZlY3RzIHRoZSBjc2NsYXNzbW9kaWZpZXJzIHR5cGVtYXAgYW5kIHRoZSBpbWNsYXNzY2xhc3Ntb2RpZmllcnMKICAgICAgICAgICAgYW5kIG1vZHVsZWNsYXNzbW9kaWZpZXJzIHByYWdtYXMuCgogICAgICAgICAgICBVbmxlc3MgeW91IGhhdmUgb3ZlcnJpZGRlbiB0aGUgZGVmYXVsdCB2ZXJzaW9ucyBvZiB0aGVzZSB0eXBlbWFwcyBvciBwcmFnbWFzLCB5b3UKICAgICAgICAgICAgc2hvdWxkbid0IGJlIGFmZmVjdGVkLiBIb3dldmVyLCBpZiB5b3UgaGF2ZSwgdXBncmFkaW5nIGlzIGVhc3ksIGZvciBleGFtcGxlCgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHt9OwogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWNsYXNzbW9kaWZpZXJzKSBGb28gInB1YmxpYyBmaW5hbCIKCiAgICAgICAgICAgIG11c3Qgbm93IGJlOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7fTsKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFjbGFzc21vZGlmaWVycykgRm9vICJwdWJsaWMgZmluYWwgY2xhc3MiCgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEMjIE1PRFVMRSAqKioKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMDUvMzEvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciBDKysgZXhjZXB0aW9uIHNwZWNpZmljYXRpb25zIHRoYXQgYXJlIHJlZmVyZW5jZXMuIFByb2JsZW0gcmVwb3J0ZWQgYnkKICAgICAgICAgICAgT3JlbiBNaWxsZXIuIEFsc28gaW1wcm92ZXMgdGhlIGdlbmVyYXRlZCBleGNlcHRpb24gZGVjbGFyYXRpb25zIGluIHRoZQogICAgICAgICAgICBjYXRjaCBoYW5kbGVyIGZvciBwb2ludGVycyAtIGEgcG9pbnRlciBpcyB1c2VkIGluc3RlYWQgb2YgYSByZWZlcmVuY2UgdG8KICAgICAgICAgICAgYSBwb2ludGVyLiBBZGRlZCBkZWZhdWx0IHRocm93cyB0eXBlbWFwcyBmb3IgU1dJR1RZUEUgJiwgU1dJR1RZUEUgKiBhbmQKICAgICAgICAgICAgU1dJR1RZUEVbQU5ZXSAoSmF2YSBhbmQgQyMpLgoKMDUvMzEvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBTb21lIG1pbm9yIHR5cGVzYWZlIGVudW0gaW1wcm92ZW1lbnRzLCBpbmNsdWRpbmcgc3RvcmluZyB0aGUgbmFtZSBvZgogICAgICAgICAgICB0aGUgZW51bSBpdGVtLiBUaGUgdG9TcmluZygpIC8gVG9TdHJpbmcoKSBtZXRob2RzIGFyZSBvdmVycmlkZGVuIHRvIHJldHVybiB0aGlzIG5hbWUuCgowNS8zMC8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW0NoaWNrZW5dIAoJICAgICAtIFVwZGF0ZSBob3cgZXhhbXBsZXMgYW5kIHRoZSB0ZXN0IHN1aXRlIGFyZSBidWlsdC4KCSAgICAgLSBTeW1ib2wgbmFtZXMgYXJlIG5vIGxvbmdlciBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZQoJICAgICAtIEFkZGVkIHVuaW9uX3J1bm1lLnNzLCB3aGljaCB3YXMgY29waWVkIGFuZCBtb2RpZmllZCBmcm9tIHRoZSBndWlsZSBtb2R1bGUKCjA1LzI2LzIwMDQ6IGxiYWxsYWJpbyAoTHVpZ2kgQmFsbGFiaW8pCiAgICAgICAgICAgIENvbW1pdHRlZCBvbiBiZWhhbGYgb2YgTWFyY2VsbyAod2hvIHN0aWxsIGhhcyBwcm9ibGVtcyB3aXRoIAoJICAgIHRoZSBTb3VyY2VGb3JnZSBDVlMuKQoKCSAgICBBZGRlZCBQeXRob24gdHlwZW1hcHMgZm9yIEZJTEUqIHdpdGggKFB5dGhvbi1vbmx5KSB0ZXN0LgoKNS8yNC8yMDA0OiAgZGFuY3kKCgkqIEFsbGVncm8gQ0wgbW9kdWxlOiAgTm93IHVzaW5nIHNvbWUgbWFjcm9zIChkZWZpbmVkIGluCglMaWIvYWxsZWdyb2NsL2FsbGVncm9jbC5zd2cpLCBzd2lnLWRlZmNvbnN0YW50IGFuZCBzd2lnLWRlZnVuLCBmb3IKCWRlZmluaW5nIGNvbnN0YW50cyBhbmQgZm9yZWlnbiBmdW5jdGlvbnMuICBUaGlzIG1ha2VzIHRoZQoJZ2VuZXJhdGVkIGZpbGUgYSBiaXQgbmVhdGVyLiAgICAKCglOb3cgc3RyaXBzIGEgbGF5ZXIgb2YgcGFyZW50aGVzaXMgZnJvbSBjb25zdGFudHMuCgoJVXNlcyAoKiA6dm9pZCkgaW5zdGVhZCBvZiA6Zm9yZWlnbi1hZGRyZXNzIG5vdy4KCjA1LzIwLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFVubmFtZWQgZW51bSBnbG9iYWwgdmFyaWFibGVzIGFyZSBub3cgc3VwcG9ydGVkIGluIGFkZGl0aW9uCiAgICAgICAgICAgIHRvIHRoZSByZWNlbnRseSBhZGRlZCBzdXBwb3J0IGZvciB1bm5hbWVkIGVudW0gbWVtYmVyIHZhcmlhYmxlcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgIGVudW0geyBlbnVtMSwgZW51bTIgfSBNZW1iZXJJbnN0YW5jZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBlbnVtIHsgZW51bTMsIGVudW00IH0gR2xvYmFsSW5zdGFuY2U7CgogICAgICAgICAgICBUaGUgaW50IHR5cGVtYXBzIGFyZSB1c2VkIGZvciB3cmFwcGluZyB0aGUgZ2V0L3NldCBhY2Nlc3NvciBtZXRob2RzLgogICAgICAgICAgICBJZiB0aGUgc2l6ZW9mIGFuIGVudW0gaXMgbm90IHRoZSBzYW1lIHNpemUgYXMgYW4gaW50IHRoZW4gc2V0dGluZyB0aGUKICAgICAgICAgICAgdmFyaWFibGUgd2lsbCBzaWxlbnRseSBkbyBub3RoaW5nIGFzIHRoZSBjYXN0cyBjYW5ub3QgYmUgZWFzaWx5IGFuZCBwb3J0YWJseQogICAgICAgICAgICBnZW5lcmF0ZWQuIElmIHlvdSBuZWVkIHRvIHNvbHZlIHRoaXMgaGlnaGx5IG9ic2N1cmUgc2l0dWF0aW9uLCB3cml0ZQogICAgICAgICAgICB0aGUgYXNzaWdubWVudCB1c2luZyB0aGUgJWV4Y2VwdGlvbiBmZWF0dXJlLgoKMDUvMjAvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBDIyBlbnVtIHdyYXBwaW5nIG1vZHMuIFNpbWlsYXIgdG8gdGhlIEphdmEgbW9kdWxlLCBlbnVtcyBjYW4gYmUgd3JhcHBlZCB1c2luZwogICAgICAgICAgICBvbmUgb2YgMyBhcHByb2FjaGVzOgoKICAgICAgICAgICAgMSkgUHJvcGVyIEMjIGVudW1zIC0gdXNlICVpbmNsdWRlICJlbnVtcy5zd2ciCiAgICAgICAgICAgIDIpIFR5cGVzYWZlIGVudW1zIC0gdXNlICVpbmNsdWRlICJlbnVtdHlwZXNhZmUuc3dnIgogICAgICAgICAgICAzKSBTaW1wbGUgY29uc3RhbnQgaW50ZWdlcnMgKG9yaWdpbmFsIGFwcHJvYWNoKSAtIHVzZSAlaW5jbHVkZSAiZW51bXNpbXBsZS5zd2ciCgogICAgICAgICAgICBTZWUgZWFjaCBvZiB0aGVzZSBmaWxlcyBmb3IgZnVydGhlciBkZXRhaWxzLiBFYWNoIG9mIHRoZXNlIGZpbGVzIHVzZSB0eXBlbWFwcwogICAgICAgICAgICBhbmQgYSBuZXcgZmVhdHVyZSB0byBjb250cm9sIHRoZSBnZW5lcmF0ZWQgY29kZS4gVGhlIGZlYXR1cmUgaXM6CgogICAgICAgICAgICAgICAgJWNzZW51bSh3cmFwYXBwcm9hY2gpOwoKICAgICAgICAgICAgd2hlcmUgd3JhcGFwcHJvYWNoIHNob3VsZCBiZSBvbmUgb2Y6ICJwcm9wZXIiLCAidHlwZXNhZmUiLCAidHlwZXVuc2FmZSIgb3IgInNpbXBsZSIuCiAgICAgICAgICAgIFtObyBpbXBsZW1lbnRhdGlvbiBkZWVtZWQgbmVjZXNzYXJ5IGZvciB0eXBlIHVuc2FmZSBlbnVtc10uCgogICAgICAgICAgICBUaGUgZGVmYXVsdCBhcHByb2FjaCBpcyBwcm9wZXIgQyMgZW51bXMuIEFub255bW91cyBlbnVtcyBhcmUgYWx3YXlzIHdyYXBwZWQgYnkKICAgICAgICAgICAgY29uc3RhbnQgaW50ZWdlcnMuIAoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEMjIE1PRFVMRSAqKioKCjA1LzIwLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBKYXZhIGVudW0gc3VwcG9ydCBhZGRlZC4gVGhlcmUgYXJlIG5vdyA0IHdheXMgaW4gd2hpY2ggZW51bXMgY2FuIGJlIHdyYXBwZWQ6CgogICAgICAgICAgICAxKSBQcm9wZXIgSmF2YSBlbnVtcyAtIHVzZSAlaW5jbHVkZSAiZW51bXMuc3dnIgogICAgICAgICAgICAyKSBUeXBlc2FmZSBlbnVtcyAtIHVzZSAlaW5jbHVkZSAiZW51bXR5cGVzYWZlLnN3ZyIKICAgICAgICAgICAgMykgVHlwZSB1bnNhZmUgZW51bXMgKGNvbnN0YW50IGludGVnZXJzKSAtIHVzZSAlaW5jbHVkZSAiZW51bXR5cGV1bnNhZmUuc3dnIgogICAgICAgICAgICA0KSBTaW1wbGUgY29uc3RhbnQgaW50ZWdlcnMgKG9yaWdpbmFsIGFwcHJvYWNoKSAtIHVzZSAlaW5jbHVkZSAiZW51bXNpbXBsZS5zd2ciCgogICAgICAgICAgICBTZWUgZWFjaCBvZiB0aGVzZSBmaWxlcyBmb3IgZnVydGhlciBkZXRhaWxzLiBFYWNoIG9mIHRoZXNlIGZpbGVzIHVzZSB0eXBlbWFwcwogICAgICAgICAgICBhbmQgYSBuZXcgZmVhdHVyZSB0byBjb250cm9sIHRoZSBnZW5lcmF0ZWQgY29kZS4gVGhlIGZlYXR1cmUgaXM6CgogICAgICAgICAgICAgICAgJWphdmFlbnVtKHdyYXBhcHByb2FjaCk7CgogICAgICAgICAgICB3aGVyZSB3cmFwYXBwcm9hY2ggc2hvdWxkIGJlIG9uZSBvZjogInByb3BlciIsICJ0eXBlc2FmZSIsICJ0eXBldW5zYWZlIiBvciAic2ltcGxlIi4KICAgICAgICAgICAgVGhlIGRlZmF1bHQgdHlwZW1hcHMgd2lsbCBoYW5kbGUgZW51bXMgdGhhdCBtYXkgb3IgbWF5IG5vdCBoYXZlIHNwZWNpZmllZCBpbml0aWFsCiAgICAgICAgICAgIHZhbHVlcywgZm9yIGV4YW1wbGUgdGVuIGlzIHNwZWNpZmllZDoKCiAgICAgICAgICAgICAgICBlbnVtIE51bWJlcnMgeyB6ZXJvLCB0ZW4oMTApIH07CgogICAgICAgICAgICBIb3dldmVyLCB0aGUgYW1vdW50IG9mIGdlbmVyYXRlZCBKYXZhIGNvZGUgY2FuIGJlIGN1dCBkb3duLCBieSBtb2RpZnlpbmcgdGhlc2UgdHlwZW1hcHMKICAgICAgICAgICAgaWYgbm9uZSBvZiB0aGUgZW51bXMgaGF2ZSBpbml0aWFsIHZhbHVlcyAocHJvcGVyIEphdmEgZW51bXMgYW5kIHR5cGVzYWZlIGVudW1zIGFwcHJvYWNoKS4KICAgICAgICAgICAgCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IGFwcHJvYWNoIGlzIHR5cGVzYWZlIGVudW1zLiBBbm9ueW1vdXMgZW51bXMgYXJlIGFsd2F5cyB3cmFwcGVkIGJ5CiAgICAgICAgICAgIGNvbnN0YW50IGludGVnZXJzLiAKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA1LzExLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gRml4IGJ1ZyB1c2luZyAlcmVuYW1lIG9uIGVudW0gaXRlbXMgYW5kIHdoZW4gdXNpbmcKICAgICAgICAgICAgJWphdmFjb25zdCgxKSAvICVjc2NvbnN0KDEpCiAgICAgICAgICAgIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHVzZWQgdG8gZ2VuZXJhdGUgY29kZSB0aGF0IHdvdWxkbid0IGNvbXBpbGU6CgogICAgICAgICAgICAgICAgJXJlbmFtZShPYmopIE9iamVjdDsKICAgICAgICAgICAgICAgIGVudW0gR3JhbW1hciB7IFN1YmplY3QsIE9iamVjdCB9OwoKMDQvMjgvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBNaW5vciBmaXhlcyB3aGVuIHVzaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgCiAgICAgICAgICAgIGphdmFpbnRlcmZhY2VzLCBqYXZhYmFzZSwgY3NpbnRlcmZhY2VzIGFuZCBjc2Jhc2UgdHlwZW1hcHMuCgowNS8xOC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gSlZNIGxpbmsgZmFpbHVyZSBvbiBzb21lIHN5c3RlbXMgZml4ZWQgd2hlbiB1c2luZyBzdGRfdmVjdG9yLmkuCiAgICAgICAgICAgIEFsc28gYWRkcyBkZWZhdWx0IHZlY3RvciBjb25zdHJ1Y3RvciBmb3IgdXNlIGZyb20gSmF2YS4KCjA1LzE3LzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCgkgICAgW0d1aWxlXSBOZXcgcnVudGltZSBmdW5jdGlvbnMgU1dJR19Qb2ludGVyQWRkcmVzcywKCSAgICBTV0lHX1BvaW50ZXJUeXBlLCBTV0lHX0lzUG9pbnRlck9mVHlwZSwgU1dJR19Jc1BvaW50ZXIuCgoJICAgIFtHdWlsZV0gSW4gLXNjbSBtb2RlLCB3cmFwIHNldmVyYWwgU1dJRyBydW50aW1lIGZ1bmN0aW9ucwoJICAgIGFuZCBleHBvcnQgdGhlbSBpbnRvIHRoZSBtb2R1bGUgKFN3aWcgc3dpZ3J1bikuICBUaGUKCSAgICBydW50aW1lIG1vZHVsZSBpcyBub3cgYnVpbHQgd2l0aCAibW9kdWxlIiBsaW5rYWdlLgoKCSAgICBbR3VpbGVdIEdPT1BTIHByb3h5IG9iamVjdHMgbm93IGFsc28gcHJpbnQgdGhlIHBvaW50ZXIKCSAgICBhZGRyZXNzIG9mIHRoZSBDIG9iamVjdC4KCjA1LzE0LzIwMDQ6IGx5bGUKICAgICAgICAgICAgQWRkZWQgS291J3MgcGF0Y2ggZm9yIHRoZSBSdWJ5ICVpbXBvcnQgZGlyZWN0aXZlIHNvIHRoYXQgbW9kdWxlcwogICAgICAgICAgICB3aXRoICJuZXN0ZWQiIG5hbWVzIGFyZSBoYW5kbGVkIHByb3Blcmx5LiBDb25zaWRlciBhbiBpbnRlcmZhY2UKICAgICAgICAgICAgZmlsZSBmb28uaSB0aGF0IGhhcyB0aGlzICVtb2R1bGUgZGVjbGFyYXRpb24gYXQgaXRzIHRvcDoKCiAgICAgICAgICAgICAgICAlbW9kdWxlICJtaXNjOjp0ZXh0Ojpmb28iCgogICAgICAgICAgICBOb3cgY29uc2lkZXIgYW5vdGhlciBpbnRlcmZhY2UgZmlsZSBzcGFtLmkgdGhhdCBpbXBvcnRzIGZvby5pOgoKICAgICAgICAgICAgICAgICVpbXBvcnQgZm9vLmkKICAgICAgICAgICAgCiAgICAgICAgICAgIEJlZm9yZSB0aGlzIHBhdGNoLCB0aGlzIHdvdWxkIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIGNvZGUgYmVpbmcKICAgICAgICAgICAgZ2VuZXJhdGVkIGZvciBzcGFtX3dyYXAuYzoKCiAgICAgICAgICAgICAgICByYl9yZXF1aXJlKCJtaXNjOjp0ZXh0Ojpmb28iKTsKCiAgICAgICAgICAgIFdpdGggdGhpcyBwYXRjaCwgaG93ZXZlciwgeW91J2xsIGdldCB0aGUgY29ycmVjdCBwYXRoIG5hbWUKICAgICAgICAgICAgZm9yIHRoZSBjYWxsIHRvIHJiX3JlcXVpcmUoKSwgZS5nLgoKICAgICAgICAgICAgICAgIHJiX3JlcXVpcmUoIm1pc2MvdGV4dC9mb28iKTsKCiAgICAgICAgICAgIFNlZSBTb3VyY2VGb3JnZSBCdWcgIzkyODI5OS4KCjA1LzEyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoIGZvciBlbWl0dGluZyBkaXJlY3RvcnMgd2hlbiAlZmVhdHVyZSgiZGlyZWN0b3IiKSBzcGVjaWZpZWQKICAgICAgICAgICAgZm9yIGEgY2xhc3Mgd2l0aCBubyB2aXJ0dWFsIG1ldGhvZHMsIGJ1dCBkb2VzIGhhdmUgYSB2aXJ0dWFsIGRlc3RydWN0b3IuCiAgICAgICAgICAgIFN1Ym1pdHRlZCBieSBLZXZpbiBTbWl0aC4KCjA1LzA2LzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBOZXcgU1dJRyBydW50aW1lIGZ1bmN0aW9uIFNXSUdfVHlwZVByZXR0eU5hbWUsIHdoaWNoIAoJICAgIHJldHVybnMgYW4gdW5tYW5nbGVkIHR5cGUgbmFtZSBmb3IgYSBzd2lnX3R5cGVfaW5mbwoJICAgIG9iamVjdC4gCgoJICAgIFtHdWlsZV06IFVzZSBpdCBmb3IgcHJpbnRpbmcgcG9pbnRlciBvYmplY3RzLgoKMDUvMDMvMjAwNDogIGRhbmN5IChBaG1vbiBEYW5jeSkKCgkqIExpYi9hbGxlZ3JvY2wvYWxsZWdyb2NsLnN3ZzogIFVwZGF0ZWQgY29tbWVudHMgYWJvdXQgaWRlbnRpZmVyCgljb252ZXJzaW9uLiAgCgoJKiBTb3VyY2VzL01vZHVsZXMvYWxsZWdyb2NsLmN4eDogIFJlZ2lzdGVyIC9kZXYvbnVsbCBmb3IgImhlYWRlciIKCXRhcmdldC4gICBBbHNvLCBkaXNyZWdhcmQgImNvbnN0IiBxdWFsaWZpZXJzIGR1cmluZyB0eXBlCgljb252ZXJzaW9uLiAgCgoJCjA1LzAyLzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtDaGlja2VuXSBGaXggYnVnIDc4MjQ2OC4KCSAgICBUbyBmaXggdGhpcyBidWcsIHRoZSBydW50aW1lIGNvZGUgaGFzIGJlZW4gcmV3cml0dGVuLCBhbmQKCSAgICBwb2ludGVycyBhcmUgbm93IHJlcHJlc2VudGVkIGFzIGEgQ19TV0lHX1BPSU5URVJfVFlQRS4KCgkgICAgQ2hpY2tlbiB2ZXJzaW9uID4gMS40MCBpcyBub3cgcmVxdWlyZWQhCgoJICAgICogVHlwZW1hcCBpbmNvbXBhdGliaWxpdHk6ICB0eXBlbWFwcyBubyBsb25nZXIgdXNlIGNoaWNrZW5fd29yZHMuCgkgICAgICBJZiBhIHR5cGVtYXAgbmVlZHMgc29tZSBzcGFjZSwgaXQgc2hvdWxkIGp1c3QgY2FsbCBDX2FsbG9jCgoJICAgICogYXJnb3V0IHR5cGVtYXBzIG5vIGxvbmdlciB1c2UgdGhlIC8qIGlmIE9ORSAqLyBjb25zdHJ1Y3QgdG8KCSAgICAgIGJ1aWxkIGFuIG91dHB1dCBsaXN0LiAgQSBTV0lHX0FQUEVORF9WQUxVRSBtYWNybywgZXhhY3RseSBsaWtlCgkgICAgICBndWlsZSBhbmQgbXpzY2hlbWUgaXMgbm93IHVzZWQuCgowNC8yNS8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBJbiB0aGUgZ2VuZXJhdGVkIEdPT1BTIGNvZGUsIGRvbid0IGNyZWF0ZSBtZXRob2RzCgkgICAgdGhhdCB3b3VsZCBub3Qgc3BlY2lhbGl6ZSBhbnkgYXJndW1lbnRzOyBzaW1wbHkgcmUtZXhwb3J0CgkgICAgdGhlIHByaW1pdGl2ZSBmdW5jdGlvbnMuICAoVGhpcyBpcyBhIHBlcmZvcm1hbmNlCgkgICAgb3B0aW1pemF0aW9uIHdoaWNoIHJlZHVjZXMgbG9hZCB0aW1lIGFuZCBleGVjdXRpb24gdGltZS4pCgoJICAgIFtHdWlsZV0gSW4gLWdoIG1vZGUsIGZpeCB0aGUgInRvbyBtYW55IGluaXRpYWxpemVycyIgZXJyb3IKCSAgICB3aGljaCB3YXMgY2F1c2VkIGJ5IGFuIGluY29tcGF0aWJsZSBzd2lnX3R5cGVfaW5mbyBsYXlvdXQuCgoJICAgIFtHdWlsZV0gVGhlIHR5cGVtYXAgZm9yIEZJTEUgKiBpbiBwb3J0cy5pIG5vdyBhbHNvIGFjY2VwdHMKCSAgICBhIHJlZ3VsYXIgRklMRSAqIHBvaW50ZXIgb2JqZWN0LiAgQWxzbyBhIGJ1ZyB3aXRoIFNjaGVtZQoJICAgIGZpbGUgcG9ydHMgdGhhdCBhcmUgb3BlbiBmb3IgaW5wdXQgYW5kIG91dHB1dCBoYXMgYmVlbgoJICAgIGZpeGVkLiAKCjA0LzI1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIENoYW5nZSBlbnRyeSAwMy8yMS8yMDA0IHJldm9rZWQuIFRoZSBjaGFuZ2UgaW50cm9kdWNlZCBhbm90aGVyCiAgICAgICAgICAgIGluY29uc2lzdGVuY3kgKHJlZmVyZW5jZSB0eXBlbWFwcyBiZWluZ3MgdXNlZCBpbnN0ZWFkIG9mCiAgICAgICAgICAgIHBvaW50ZXIgdHlwZW1hcHMgZm9yIG1lbWJlciB2YXJpYWJsZXMgYXMgd2VsbCBhcyBzdGF0aWMKICAgICAgICAgICAgbWVtYmVyIHZhcmlhYmxlcyBhbmQgZ2xvYmFsIHZhcmlhYmxlcyBmb3Igc29tZSBsYW5ndWFnZXMsCiAgICAgICAgICAgIGJ1dCBvbmx5IGZvciBDKysgYW5kIG5vdCBDKS4gVGhpcyB3b3VsZCBicmVhayB1c2VyJ3MgY3VycmVudAogICAgICAgICAgICB0eXBlbWFwcyBhbmQgaW50cm9kdWNlIGZ1cnRoZXIgaW5jb25zaXN0ZW5jaWVzLiBBbHRlcm5hdGl2ZQogICAgICAgICAgICBzb2x1dGlvbiByZXF1aXJlZCBhbmQgYmVpbmcgZGlzY3Vzc2VkLgoKMDQvMTAvMjAwNDogbW1hdHVzIChNYXJjZWxvIE1hdHVzKSAKCSAgICAKCSAgICBBZGRlZCB0aGUgLWRpcmVjdG9ycyBmbGFnLiBUaGlzIGVuYWJsZXMgdGhlIGRpcmVjdG9yCgkgICAgbW9kZSBmb3IgdGhlIGludGVyZmFjZSBhbmQgYWxsIHRoZSBjbGFzc2VzIHRoYXQKCSAgICBkb24ndCBzZXQgdGhlICJmZWF0dXJlOm5vZGlyZWN0b3IiIGV4cGxpY2l0bHkuCgoJICAgIFlvdSBjYW4gdXNlIHRoaXMgaW4geW91ciBtb2R1bGUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZQoJICAgIGRpcmVjdG9yIGZlYXR1cmUgaW4gYWxsIHlvdXIgY2xhc3NlcywgYnV0IGl0IGlzIG1vc3QKCSAgICBpbnRlbmRlZCBmb3IgdGVzdGluZyBwdXJwb3NlcywgbGlrZToKCgkgICAgICBtYWtlIGNoZWNrLXB5dGhvbi10ZXN0LXN1aXRlIFNXSUc9Ii4uLy4uLy4uL3N3aWcgIC1kaXJlY3RvcnMiCgkgICAgICBtYWtlIGNoZWNrLXJ1YnktdGVzdC1zdWl0ZSBTV0lHPSIuLi8uLi8uLi9zd2lnICAtZGlyZWN0b3JzIgoJICAgICAgbWFrZSBjaGVjay1qYXZhLXRlc3Qtc3VpdGUgU1dJRz0iLi4vLi4vLi4vLi4vc3dpZyAgLWRpcmVjdG9ycyIKCgkgICAgVGhlc2UgY29tbWFuZHMgd2lsbCBydW4gdGhlIGVudGlyZSB0ZXN0LXN1aXRlIHVzaW5nCgkgICAgZGlyZWN0b3JzLCBhbmQgbm90IG9ubHkgdGhlIHNwZWNpZmljICdkaXJlY3RvcnNfKicKCSAgICBjYXNlcy4gVGhpcyBzaG91bGQgYmUgZG9uZSBmcm9tIHRpbWUgdG8gdGltZS4KCjA0LzEwLzIwMDQ6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykgCgkgICAgCgkgICAgW3B5dGhvbl0gQWRkZWQgc3VwcG9ydCBmb3Igc3RkOjp3c3RyaW5nIGFuZCB3Y2hhcl90LAoJICAgIGZvciBjb21waWxlciBhbmQgcHl0aG9uIHZlcnNpb25zIHRoYXQgc3VwcG9ydCB0aGVtLgoJICAgIAoJICAgIFdoZW4gbmVlZGVkLCB1c2UgCgoJICAgICAlaW5sY3VkZSBzdGRfc3RyaW5nLmkgICAgICAvLyAnY2hhcicgc3RyaW5ncwoJICAgICAlaW5sY3VkZSBzdGRfd3N0cmluZy5pICAgICAvLyAnd2NoYXJfdCcgc3RyaW5ncwoJICAgIAoKMDQvMTAvMjAwNDogbW1hdHVzIChNYXJjZWxvIE1hdHVzKSAKCSAgICAKCSAgICBbcHl0aG9uXSBGaXggdGhlIGRlZmF1bHQgYmVoYXZpb3VyIChzZWcuIGZhdWx0KSB3aGVuIGFuCgkgICAgaW5wbGFjZSBvcGVyYXRvciAoKz0sLT0sLi4uKSB3YXMgd3JhcHBlZCwgYXMgcmVwb3J0ZWQgYnkKCSAgICBMdWNyaXogKGx1Y3JpekBzaXRpbGFuZGlhLml0KSwgd2hlbiB0aGUgbW9zdCBjb21tb24KCSAgICBmb3JtIHdhcyB1c2VkOgoKICAgICAgICAgICAgICAgICAgIEEmICBBOjpvcGVyYXRvcis9KGludCBpKSB7IC4uLjsgcmV0dXJuICp0aGlzOyB9CiAgICAgICAgICAgICAgICAgIF5eXl4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl4KCSAgICAKCgkgICAgaWUsIGFuIG9iamVjdCBpcyByZXR1cm5lZCBhbmQgaXRzIGNvbnRhaW5zIHRoZSBzYW1lICd0aGlzJwoJICAgIHZhbHVlIHRoYW4gdGhlIGlucHV0IG9iamVjdCwgd2hpY2ggaXMgZGVsZXRlZCBhZnRlciB0aGUKCSAgICBvcGVyYXRpb24gImEgKz0gYiIsIGxlYXZpbmcgdGhlIHJlc3VsdCB3aXRoIG5vIHJlYWwKCSAgICBvYmplY3QsIGJ1dCBhIHNlZy4gZmF1bHQuCgoJICAgIFRvIGZpeCBpdCwgd2UgbmVlZGVkIHRvIGludHJvZHVjZSBhIG5ldyBmZWF0dXJlIGFuZCB1c2UgYW4KCSAgICBvbGQgb25lOgoKICAgICAgICAgICAgICAgJWZlYXR1cmUoInNlbGY6ZGlzb3duIikgQTo6b3BlcmF0b3IrPTsKICAgICAgICAgICAgICAgJWZlYXR1cmUoIm5ldyIpIEE6Om9wZXJhdG9yKz07CgkgICAgCgkgICAgaGVyZSwgInNlbGY6ZGlzb3duIiBkaXNhYmxlIHRoZSBvd25lcnNoaXAgb2YgdGhlICdzZWxmJwoJICAgIG9yIGlucHV0IG9iamVjdCwgYW5kIHRoZSAibmV3IiBmZWF0dXJlIHRyYW5zZmVycyB0aGUKCSAgICBvd25lcnNoaXAgdG8gdGhlIHJlc3VsdCBvYmplY3QuCgkgICAgCgkgICAgVGhlIGZlYXR1cmUvc29sdXRpb24gY291bGQgYWxzbyBiZSB1c2VkIGluIG90aGVyIGxhbmd1YWdlcwoJICAgIHRoYXQgdXNlIGdjIGFuZCBpbXBsZW1lbnQgdGhlIGlucGxhY2Ugb3BlcmF0b3JzLCBvciBvdGhlcgoJICAgIG9wZXJhdG9ycywgaW4gYSBzaW1pbGFyIHdheS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBQeXRob24gTU9EVUxFICoqKgoKCSAgICBJZiB5b3UgYWxyZWFkeSBhcmUgdXNpbmcgdGhlIGlucGxhY2Ugb3BlcmF0b3JzIGluIHB5dGhvbiwKCSAgICBhbmQgeW91IGltcGxlbWVudGVkIHNvbWUga2luZCBvZiB3b3JrYXJvdW5kIHRvIHRoZSBwcm9ibGVtCgkgICAgZml4ZWQgaGVyZSwgaXQgaXMgcG9zc2libGUgeW91IGNvdWxkIGVuZCB3aXRoICdmcmVlJwoJICAgIG9iamVjdHMgdGhhdCBuZXZlciBnZXQgZGVsZXRlZC4gSWYgdGhhdCBpcyB0aGUgY2FzZSwgYW5kCgkgICAgeW91IHdhbnQgdG8gZGlzYWJsZSB0aGUgY3VycmVudCBmaXgsIHVzZToKCiAgICAgICAgICAgICAgICVmZWF0dXJlKCJzZWxmOmRpc293biIsIiIpIEE6Om9wZXJhdG9yKz07CiAgICAgICAgICAgICAgICVmZWF0dXJlKCJuZXciLCIiKSBBOjpvcGVyYXRvcis9OwoKCjA0LzA3LzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEMrKyBlbnVtcyBhcmUgbm8gbG9uZ2VyIHdyYXBwZWQgYnkgaW50ZWdlcnMsIHRoZXkgYXJlIG5vdyB3cmFwcGVkIGJ5IAogICAgICAgICAgICBDIyBlbnVtcy4gRm9yIEV4YW1wbGUsIGdpdmVuIEMrKzoKCiAgICAgICAgICAgICAgICBlbnVtIEFuRW51bSB7IGZvbywgYmFyIH07CiAgICAgICAgICAgICAgICB0eXBlZGVmIEFuRW51bSBBbkVudW1lcmF0aW9uOwogICAgICAgICAgICAgICAgdm9pZCBzb21ldGhpbmcoQW5FbnVtIGUsIEFuRW51bWVyYXRpb24gZik7CgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgICBwdWJsaWMgZW51bSBBbkVudW0gewogICAgICAgICAgICAgICAgICBmb28sCiAgICAgICAgICAgICAgICAgIGJhcgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNvbWV0aGluZyhBbkVudW0gZSwgQW5FbnVtIGYpIHsuLi59CgogICAgICAgICAgICBOb3RlIHRoYXQgYSBnbG9iYWwgZW51bSBsaWtlIEFuRW51bSBhYm92ZSBpcyBnZW5lcmF0ZWQgaW50byBpdHMgb3duCiAgICAgICAgICAgIGZpbGUgY2FsbGVkIEFuRW51bS5jcy4gRW51bXMgZGVmaW5lZCB3aXRoaW4gYSBDKysgY2xhc3MgYXJlIGRlZmluZWQKICAgICAgICAgICAgd2l0aGluIHRoZSBDIyBwcm94eSBjbGFzcy4gU29tZSBvZiB0aGUgdHlwZW1hcHMgZm9yIG1vZGlmeWluZyBDIyBwcm94eQogICAgICAgICAgICBjbGFzc2VzIGFsc28gd29yayBmb3IgZW51bXMuIEZvciBleGFtcGxlIGdsb2JhbCBlbnVtcyBjYW4gdXNlCgogICAgICAgICAgICAgICAgJXR5cGVtYXAoY3NpbXBvcnRzKSB0byBhZGQgaW4gZXh0cmEgdXNpbmcgc3RhdGVtZW50cy4KCiAgICAgICAgICAgIEdsb2JhbCBlbnVtcyBhbmQgY2xhc3MgZW51bXMgY2FuIHVzZQoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGNzY2xhc3Ntb2RpZmllcnMpIHRvIG1ha2UgdGhlIGVudW0gcHJpdmF0ZSwgcHVibGljIGV0Yy4KICAgICAgICAgICAgICAgICV0eXBlbWFwKGNzYmFzZSkgdG8gY2hhbmdlIHRoZSB1bmRlcmx5aW5nIGVudW0gdHlwZSAoZW51bSBiYXNlKQoKICAgICAgICAgICAgSWYgd2UgYWRkIHRoaXMgZm9yIHRoZSBhYm92ZSBleGFtcGxlOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGNzY2xhc3Ntb2RpZmllcnMpIEFuRW51bSAicHJvdGVjdGVkIgogICAgICAgICAgICAgICAgJXR5cGVtYXAoY3NiYXNlKSBBbkVudW0gImxvbmciCgogICAgICAgICAgICB0aGUgZm9sbG93aW5nIGlzIGdlbmVyYXRlZDoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgZW51bSBBbkVudW0gOiBsb25nIHsKICAgICAgICAgICAgICAgICAgZm9vLAogICAgICAgICAgICAgICAgICBiYXIKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBDIyBNT0RVTEUgKioqCgowNC8wNy8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgU2VnIGZhdWx0IGZpeCBmb3IgZW1wdHkgZW51bXMsIGxpa2UKICAgICAgICAgICAgICAgIGVudW0gRm9vIHt9OwoKMDMvMjEvMjAwNDogbW1hdHVzCiAgICAgICAgICAgIFtOb3RlOiB0aGlzIGNoYW5nZSByZXZva2VkIG9uIDA0LzI1LzIwMDRdCgkgICAgW1B5dGhvbl0gTWFrZXMgdGhlIGZvbGxvd2luZyAndmFyJyBjYXNlcyBtb3JlIHVuaWZvcm06CgogICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZ2E7CiAKICAgICAgICAgICAgICAgIHN0cnVjdCBBIHsKICAgICAgICAgICAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIHNhOwogICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtYTsKICAgICAgICAgICAgICAgIH07CgoKICAgICAgICAgICAgbm93IHRoZSB0aHJlZSB2YXJpYWJsZXMgKGdhLCBzYSwgbWEpIGNhbiBiZSBhc3NpZ25lZCBhczoKCgogICAgICAgICAgICAgICAgICBjdmFyLmdhID0gImhlbGxvIjsKICAgICAgICAgICAgICAgICAgQS5zYSA9ICJoZWxsbyI7CiAgICAgICAgICAgICAgICAgIGEubWEgPSAiaGVsbG8iOwoKICAgICAgICAgICAgaWUsIG5vdyAnbWEnIHdpbGwgYWxzbyB1c2UgYSBzdGQ6OnN0cmluZyB0eXBlbWFwICdpbicgaWYKICAgICAgICAgICAgZGVmaW5lZCwgYmVmb3JlIGl0IHdhcyBvbmx5IGFjY2VwdGluZyBhICdwX3N0ZF9zdHJpbmcnCiAgICAgICAgICAgIHBvaW50ZXIuICBOb3RlLCBob3dldmVyLCB0aGF0ICdtYScgd2lsbCBub3QgdXNlIHRoZQogICAgICAgICAgICAndmFyaW4vdmFyb3V0JyB0eXBlbWFwcyAodGhhdCBwcm9iYWJseSBjb3VsZCBiZSBtb3JlCiAgICAgICAgICAgIG5hdHVyYWwpLCBidXQgaXQgd2lsbCBwaWNrIHVwIHRoZSAnaW4nIHR5cGVtYXAgZm9yIGNvbnN0CiAgICAgICAgICAgIHN0ZDo6c3RyaW5nJiAod2hpY2ggaXMgZWFzaWVyKS4KCgkgICAgVGhlIGNoYW5nZXMgaW4gY3dyYXAuYyBhbmQgbGFuZy5jeHggd2lsbCBwcm9iYWJseSBmaXggdGhlCgkgICAgYmVoYXZpb3VyIGluIG90aGVyIGxhbmd1YWdlcyB0aGF0IGRvIG5vdCBvdmVybG9hZCB0aGUKCSAgICBtZW1iZXJ2YXJIYW5kbGVyIG1ldGhvZCAidG9vIG11Y2giLgogCiAgICAgICAgICAgIAowMy8yMS8yMDA0OiBtbWF0dXMKCSAgICBbUHl0aG9uXSBEaXNhYmxpbmcgdGhlIGRlZmF1bHQgaW5zdGFudGlhdGlvbnMgbGlrZToKCgkgICAgICAldGVtcGxhdGUoKSBzdGQ6OnBhaXI8aW50LGludD47CgogICAgICAgICAgICBmb3IgYWxsIHRoZSBwcmltaXRpdmUgdHlwZXMgYW5kIFNUTCBjb250YWluZXJzL2NsYXNzZXMuCgkgICAgVGhleSBhcmUgZXhwZW5zaXZlLCBzcGVjaWFsbHkgZm9yIHBhaXIgYW5kIG1hcCwgYW5kIHRoZQoJICAgIHByZXZpb3VzIGJlaGF2aW91ciBhbHNvIHJlcXVpcmVzIHRoZSB1c2VyIHRvIHBlcmZvcm0KCSAgICBtYW51YWwgaW5zdGFudGlhdGlvbnMuIFN0aWxsLCBpZiB0aGUgc3BlZWQgZGlmZmVyZW5jZSBpcwoJICAgIG5vdCBpbXBvcnRhbnQsIGl0IGNhbiBiZSByZS1lbmFibGVkIGJ5IGRlZmluaW5nIHRoZSBtYWNybwoJICAgIFNXSUdfU1REX0RFRkFVTFRfSU5TVEFOVElBVElPTiAoc2VlIHN0ZF9jb21tb24uaSkuCgoJICAgIEFsc28sIG5vcm1hbGl6aW5nIHRoZSBJTlBVVC9PVVRQVVQvSU5PVVQgdHlwZW1hcHMuIE5vdwoJICAgIHRoZXkgdXNlIHRoZSBzYW1lIGNvbnZlcnNvcnMgdGhhbiB0aGUgcmVzdCBvZiB0aGUKCSAgICB0eXBlbWFwcywgYW5kIHlvdSBjYW4gdXNlIHRoZW0gZm9yIHN0ZDo6cGFpciwgc3RkOjpzdHJpbmcKCSAgICBhbmQgYWxsIHRoZSBvdGhlciBTVEwgdHlwZXMsIGxpa2UgaW46CgoJICAgICAgdm9pZCBwX2lub3V0ZChzdGQ6OnBhaXI8ZG91YmxlLCBkb3VibGU+ICpJTk9VVCk7CgoJICAgIEFkZGVkIHRoZSBhdHRyaWJ1dGUuaSBhbmQgaW1wbGljaXQuaSBmaWxlcyB3aXRoIG1hY3JvcyB0bwoJICAgIHRyYW5zZm9ybSBmdW5jdGlvbnMgcGFpcnMgbGlrZSAnc2V0X3gnLydnZXRfeCcgCgkgICAgKG9yICdUJiB4KCknLydjb25zdCBUJiB4KCkgY29uc3QnKSBpbnRvIGFuIGF0dHJpYnV0ZSwKCSAgICBhbmQgYWxsb3dpbmcgdGhlIHVzZSBvZiBpbXBsaWNpdCBjb25zdHJ1Y3RvcnMgaW4gdHlwZW1hcHMKCSAgICAoc2VlIHRoZSBmaWxlcyBmb3IgbW9yZSBkZXRhaWxzKS4KCjAzLzIxLzIwMDQ6IG1rb2VwcGUKCSAgICBbR3VpbGVdIEZpeCB0aGUgZG9jdW1lbnRhdGlvbiBzdHJpbmdzIG9mIGZ1bmN0aW9ucyB3aXRoCgkgICAgYW5vbnltb3VzIGFyZ3VtZW50cy4KCjAzLzE4LzIwMDQ6IG1tYXR1cwoJICAgIFtQeXRob25dIE1vcmUgZ2VuZXJhbCBzdGRfc3RyaW5nLmkgaW50ZXJmYWNlLgoJICAgIE5vdyB5b3UgY2FuIHdyYXAgaXQgdXNpbmcKCgkgICAgICAldGVtcGxhdGUoc3RyaW5nKSBzdGQ6OmJhc2ljX3N0cmluZzxjaGFyPjsKCiAgICAgICAgICAgIGFuZCB1c2UgdGhlIHN0ZDo6c3RyaW5nIGFzIGEgYmFzZSBjbGFzczoKCgkgICAgICBzdHJ1Y3QgQSA6IHN0ZDo6c3RyaW5nIHsKICAgICAgICAgICAgICB9OwoKCSAgICBCdXQgbW9yZSBpbXBvcnRhbnQsIHN3aWcgd2lsbCByZWNvZ25pemUgCgkgICAgYm90aCBzdGQ6OmJhc2ljX3N0cmluZzxjaGFyPiBhbmQgc3RkOjpzdHJpbmcgYXMKCSAgICB0aGUgc2FtZSB0eXBlLgoKMDMvMTYvMjAwNDogbW1hdHVzCgkgICAgUHJldmlvdXNseSBhZGRlZCwgYnV0IG5vdCBtZW50aW9uZWQgYmVmb3JlOgoKCSAgICAtIGZyaWVuZCBkZWNsYXJhdGlvbiBzdXBwb3J0LCBzd2lnIG5vdyBlbWl0cyBhIGdsb2JhbAoJICAgICAgZnVuY3Rpb24gaW4gdGhlIHNhbWUgY2xhc3Mgc2NvcGUuCgoJICAgIC0gcmVmL3VucmVmIGZlYXR1cmVzOiB0byBtaXggcmVmIGNvdW50aW5nIEMrKyBjbGFzc2VzCgkgICAgICBhbmQgbmF0aXZlIHNjcmlwdCByZWYgY291bnRpbmcgbWVjaGFuaXNtcyAobGlrZSBpbiBweXRob24pLgoJICAgIAoJICAgICAgVXNlIGl0IGxpa2U6CgogCSAgICAgICAgJWZlYXR1cmUoInJlZiIpICAgUkNPYmogIiR0aGlzLT5yZWYoKTsiCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgidW5yZWYiKSBSQ09iaiAiJHRoaXMtPnVucmVmKCk7IgoKCSAgICAgIEFuZCB0aGUgY2xhc3MgUkNPYmosIGFuZCBhbGwgdGhlIGRlcml2ZWQgb25lcywgd2lsbAoJICAgICAgcGVyZm9ybSB0aGUgcmlnaHQgcmVmL3VucmVmIGNhbGxzIHdoZW4gYSBuZXcgcG9pbnRlciAgCgkgICAgICBpcyByZXR1cm5lZCB0byB0aGUgdGFyZ2V0IGxhbmd1YWdlLCBvciB3aGVuIHRoZSB0YXJnZXQKCSAgICAgIGxhbmd1YWdlIGF0dGVtcHRzIHRvIGRlbGV0ZSB0aGUgb2JqZWN0LgoJICAgICAgCgkgICAgICBTZWUgdGhlIHJlZmNvdW50LmkgZmlsZSBpbiB0aGUgdGVzdC1zdWl0ZSBmb3IgbW9yZQoJICAgICAgZGV0YWlscy4KCgkgICAgCjAzLzE2LzIwMDQ6IG1tYXR1cwoJICAgIFtQeXRob25dIFVzaW5nIHRoZSBuZXcgJWZyYWdtZW50IHN1cHBvcnQsIG1ham9yIHJld3JvdGUgCgkgICAgb2YgdGhlIHB5dGhvbiBzd2lnIGxpYnJhcnksIGluY2x1ZGluZzoKCgkgICAgLSBBbG1vc3QgYXV0b21hdGljIHRlbXBsYXRlL3R5cGVtYXAgaW5zdGFudGlhdGlvbiBmb3IKCSAgICAgIHRoZSBTVEwgY29tcG9uZW50cy4gRm9yIGV4YW1wbGUsIG5vdyB5b3UgY2FuIHdyaXRlOgoKCQkgICAldGVtcGxhdGUodmVjdG9yX2kpIHN0ZDo6dmVjdG9yPGludD47CgogICAgICAgICAgICAgIGFuZCBhIHNwZWNpYWxpemVkIHZlY3Rvcl9pIGNsYXNzIGlzIGVtaXR0ZWQgd2l0aCBhbGwKCSAgICAgIHRoZSBuZWVkZWQgdHlwZW1hcHMuIE5vIG5lZWQgdG8gdXNlIHRoZSBvbGQKCSAgICAgICdzcGVjaWFsaXplX3ZlY3RvcicgbWFjcm9zLgoKCSAgICAgIE5vdGUgeW91IGNhbiBhbHNvIGRlZmluZQoKCSAgICAgICAgICAldGVtcGxhdGUobWF0cml4X2kpICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8aW50PiA+OwoJICAgICAgICAgICV0ZW1wbGF0ZSh2ZWN0b3JfcGlpKSBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50LGludD4gPjsKCgkgICAgLSBUaGUgZW1wdHkgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiAKIAkgCiAgICAgICAgICAgCSAgJXRlbXBsYXRlKCkgc3RkOjp2ZWN0b3I8aW50PjsKCgkgICAgICBkZWZpbmVzIHRoZSB2ZWN0b3IgdHlwZW1hcHMsIGJ1dCBubyBwcm94eSBjbGFzcy4gRm9yIGFsbCB0aGUKICAgICAgICAgICAgICBmdW5kYW1lbnRhbCB0eXBlcywgdGhlIGVtcHR5IHRlbXBsYXRlIGluc3RhbnRpYXRpb24gYXJlCiAgICAgICAgICAgICAgZGVmaW5lZCwgc28sIHlvdSBjYW4gc2F5CgoJICAgICAgJWluY2x1ZGUgc3RkX3ZlY3RvcgoKCSAgICAgIGludCBmdW5jKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIGEpOwoJICAgICAgCgkgICAgICB3aGVyZSB0aGUgcHJvcGVyIHR5cGVtYXAgaXMgYXBwbGllZCB0byAnYScsIGJ1dCBubwoJICAgICAgc3RkOjp2ZWN0b3I8aW50PiBwcm94eSBpcyBnZW5lcmF0ZWQuCgkgICAgICAKCiAgICAgICAgICAgIC0gQWxsIHRoZSBTVEwgY29udGFpbmVycyBwcmVzZW50IGEgbW9yZSB1bmlmb3JtIGJlaGF2aW9yIGFuZAoJICAgICAgbW9yZSBjb21wbGV0ZSBpbnRlcmZhY2UgZGVjbGFyYXRpb24uIFRoZSBmb2xsb3dpbmcgYXJlIAoJICAgICAgbm93IHN1cHBvcnRlZDoKCgkJICBzdGQ6OnZlY3RvcjxUPgoJCSAgc3RkOjpsaXN0PFQ+CgkJICBzdGQ6OmRlcXVlPFQ+CgkJICBzdGQ6OnNldDxUPgoJCSAgc3RkOjptdWx0aXNldDxUPgoJCSAgc3RkOjptYXA8VD4KCQkgIHN0ZDo6bXVsdGltYXA8VD4KICAgICAgICAgICAgICAKICAgICAgICAgICAgICBub3QgYSBjb250YWluZXIsIGJ1dCBhbHNvIHN1cHBvcnRlZDoKCgkJICBzdGQ6OnBhaXI8VCxVPgoKICAgICAgICAgICAgICBhbHNvLCBtb3JlIHR5cGVtYXBzIGFyZSBkZWZpbmVkIGZvciBhbGwgb2YgdGhlbSwKCSAgICAgIGluY2x1ZGluZyB2YXJpbiwgdmFyb3V0LCB0eXBlY2hlY2ssIGV0Yy4KCiAgICAgICAgICAgIC0gSW5pdGlhbCBhdHRlbXB0IHRvIGltcGxlbWVudCB0aGUgU1RMIGNvbnRhaW5lcnMKICAgICAgICAgICAgICBjb25zaWRlcmluZyBhbGxvY2F0b3JzLCBpZToKCgkgICAgICAgICAgc3RkOjp2ZWN0b3I8VCxBPgkJCQoKCSAgICAgIGl0IGlzIHBhcnRpYWxseSB3b3JraW5nLCBidXQgaXQgaXMganVzdCBhIHdvcmthcm91bmQKCSAgICAgIHdoaWxlIHN3aWcgaW1wcm92ZXMgaXRzIHRlbXBsYXRlIHR5cGUgc3VwcG9ydC4KCSAgICAgIAoJICAgICAgCgkgICAgIFBsZWFzZSB0ZXN0IHdpdGggeW91ciBwYXJ0aWN1bGFyIHNldHVwLiBJdCBzZWVtcyB0byBiZQoJICAgICB3b3JraW5nIHdpdGggZysrIDMuMi4yLCBnKysgMi45NiwgSW50ZWwgaWNjIGFuZCBTR0kgQ0MKCSAgICAgY29tcGlsZXJzLCBwbHVzIHB5dGhvbiAxLjUuMiwgMi4wIGFuZCAyLjMsIGJ1dCBzaW5jZQoJICAgICB3ZSBhcmUgdXNpbmcgdGVtcGxhdGVzLCB0aGVyZSBpcyBhIGNoYW5jZSB5b3UgY2FuIGZpbmQKCSAgICAgc29tZSBwcm9ibGVtcyB3aGVuIHVzaW5nIHdpdGggYW4gb2xkIEMrKyBjb21waWxlci4KCjAzLzE2LzIwMDQ6IG1tYXR1cwoKICAgICAgICAgICAgLSBBbGxvd2luZyB0aGUgZW1wdHkgJXRlbXBsYXRlIGRpcmVjdGl2ZSwgc3VjaCBhcwoKICAgICAgICAgICAgICAgICAldGVtcGxhdGUoKSBzdGQ6OnZlY3RvcjxpbnQ+OwoKCSAgICAgIHRvIHByb2Nlc3MgdGhlIGNsYXNzICJ0eXBlZGVmInMgYW5kICJ0eXBlbWFwInMuIEJlZm9yZQoJICAgICAgb25seSB0aGUgaW50ZXJuYWwgInR5cGVkZWYicyB3ZXJlIHByb2Nlc3NlZC4KCiAgICAgICAgICAgICAgVGhpcyBtYWtlcyBwb3NzaWJsZSB0byBlbWl0IHRoZSBkZWZhdWx0IGluL291dAogICAgICAgICAgICAgIHR5cGVtYXBzIHdpdGhvdXQgdGhlIG5lZWQgb2Ygd3JhcHBpbmcgYW4gc3BlY2lhbGl6ZWQKICAgICAgICAgICAgICB2ZWN0b3IgaW5zdGFuY2UuCgoJICAgIC0gQWRkaW5nIHRoZSBwcmVwcm9jZXNzb3IgZXh0ZW5zaW9uICNAIHdoaWNoIG1hbmdsZXMgdGhlCiAgICAgICAgICAgICAgZm9sbG93aW5nIG1hY3JvIGFyZ3VtZW50LCBsaWtlIGluOgoKICAgICAgICAgICAgICAgICNkZWZpbmUgbWFjcm8oWCkgICNAWAogICAgICAgICAgICAgICAgbWFjcm8oaW50KSAgICAgICAgIC0+IGludAogICAgICAgICAgICAgICAgbWFjcm8oc3RkOjpzdHJpbmcpIC0+IHN0ZF9zX3Nfc3RyaW5nCiAgICAgICAgICAgICAgICAKCSAgICAtIEZyYWdtZW50cyBjYW4gbm93IGJlICJ0eXBlIHNwZWNpYWxpemVkIiwgYXMgdGhlIHR5cGVtYXBzLiBUaGUKCSAgICAgIHN5bnRheCBpcyBhcyBmb2xsb3dzCiAKICAgICAgICAgICAgICAgICVmcmFnbWVudCgibmFtZSIsImhlYWRlciIpIAogICAgICAgICAgICAgICAgICB7IC8qIGEgdHlwZSBpbmRlcGVuZGVudCBmcmFnbWVudCAob2xkIHN5bnRheCkgKi8gfQogICAgICAgICAgICAgICAgJWZyYWdtZW50KCJuYW1lIiB7VHlwZX0sICJoZWFkZXIiKSAKICAgICAgICAgICAgICAgICAgeyAvKiB0aGUgZnJhZ21lbnQgaXMgdHlwZSBkZXBlbmRlbnQgKi99CiAKICAgICAgICAgICAgICBOb3cgZnJhZ21lbnRzIGNhbiBhbHNvIGJlIHVzZWQgaW5zaWRlIHRlbXBsYXRlczogCgogICAgICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+CiAgICAgICAgICAgICAgICBzdHJ1Y3QgQSB7CiAgICAgICAgICAgICAgICAgICAlZnJhZ21lbnQoImluY29kZSJ7QTxUPn0sImhlYWRlciIpIHsKCQkgICAgICAvKiAnaW5jb2RlJyBzcGVjaWFsaXplZCBmcmFnbWVudCAqLwoJCSAgIH0KIAoJCSAgICV0eXBlbWFwKGluLGZyYWdtZW50PSJpbmNvZGUie0E8VD59KSB7CgkJICAgICAgLyoKCQkgICAgICAgICBoZXJlIHdlIHVzZSB0aGUgJ3R5cGUgc3BlY2lhbGl6ZWQnIAogICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQgImluY29kZSJ7QTxUPn0KICAgICAgICAgICAgICAgICAgICAgICovCgkJICAgIH0KICAgICAgICAgICAgICAgIH07CgkJCSAgICAgCQoKMDMvMTEvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBEaXJlY3RvciBidWcgd2hpY2ggbWVhbnQgdGhhdCBzb21lIHZpcnR1YWwgZnVuY3Rpb25zIG92ZXJyaWRkZW4gaW4KICAgICAgICAgICAgSmF2YSB3ZXJlIG5vdCBiZWluZyBjYWxsZWQgb24gc29tZSBvcGVyYXRpbmcgc3lzdGVtcy4gQnVnIHJlcG9ydGVkIGFuZCBmaXhlZAogICAgICAgICAgICBieSBSb2JlcnQgZGUgVnJpZXMgYW5kIFNjb3R0IE1pY2hlbC4KCjAzLzAyLzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEluIC1zY20gbW9kZSwgZG9uJ3QgZm9yZ2V0IHRvIGNoZWNrIHRoZSB0eXBlIG9mIHN0cmluZyBhcmd1bWVudHMuCgowMi8yNC8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBOZXcgY29tbWFuZGxpbmUgb3B0aW9uIC1uYW1lc3BhY2UgPG5hbWU+LiBUaGlzIGFsbG93cyBvbmUgdG8gc3BlY2lmeQogICAgICAgICAgICBhIEMjIG5hbWVzcGFjZSBpbnRvIHdoaWNoIGFsbCBDIyBjbGFzc2VzIGFyZSBnZW5lcmF0ZWQuCgowMi8yMy8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpIAoJICAgIFtNelNjaGVtZV0gVXNlIEZVTkNfTkFNRSByYXRoZXIgdGhhbiBhIGJvZ3VzIHR5cGVtYXAgdmFyaWFibGUgZm9yIHNpZ25hbGxpbmcKCSAgICBlcnJvcnMuICBDYWxsIHNjaGVtZV93cm9uZ190eXBlIHdpdGggYSB6ZXJvLWJhc2VkIGFyZ3VtZW50IG51bWJlci4gIAoJICAgIFJlcG9ydGVkIGJ5IE9uZHJlaiBQYWNvdnNreSwgU0YgIzkwMjYyMS4KCgkgICAgW0d1aWxlXSBEZWZpbmUgRlVOQ19OQU1FIGFsc28gaW4gdGhlIGRpc3BhdGNoIHdyYXBwZXIgZm9yIG92ZXJsb2FkZWQKCSAgICBmdW5jdGlvbnMuICBQYXRjaCBieSBKb2huIExlbnosIFNGICM4OTYyNTUuCgowMi8yMi8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBJbiAtc2NtIG1vZGUsIGRvbid0IHRyeSB0byBpbnZva2UgYSBudWxsIGRlc3RydWN0b3IgZnVuY3Rpb24uCgowMi8yMC8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4ZXMgc28gdGhhdCB0aGUgU1dJRyBzb3VyY2Ugd2lsbCBjb21waWxlIHVzaW5nIHRoZSBEaWdpdGFsIE1hcnMgQ29tcGlsZXIKICAgICAgICAgICAgKGZvcm1lcmx5IFN5bWFudGljIGNvbXBpbGVyKSBvbiBXaW5kb3dzLiBTdWJtaXR0ZWQgYnkgU2NvdHQgTWljaGVsLgoKMDIvMTMvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtNelNjaGVtZV0gTmV3IGNvbW1hbmQtbGluZSBhcmd1bWVudCAtbm9pbml0LiAgVXNlIGl0IGZvciBidWlsZGluZwoJICAgIHRoZSBydW50aW1lIGxpYnJhcnksIHdoZXJlIHdlIGRvbid0IHdhbnQgdG8gZGVmaW5lIHRoZSBmdW5jdGlvbnMKCSAgICBzY2hlbWVfaW5pdGlhbGl6ZSBldGMuICBSZXBvcnRlZCBieSBUaW0gQnJvd24sIFNGICM4OTE3NTQuCgoJICAgIFtNelNjaGVtZV0gRG9uJ3QgcHJvZHVjZSBpbnZhbGlkIEMgY29kZSB3aGVuIGludm9rZWQgd2l0aCB0aGUKCSAgICAtZGVjbGFyZW1vZHVsZSBvcHRpb24uICBSZXBvcnRlZCBieSBUaW0gQnJvd24sIFNGICM4OTExMDguCgkgICAgCgkgICAgW0d1aWxlXSBCdWlsZCB0aGUgcnVudGltZSBsaWJyYXJ5IHdpdGggcGFzc2l2ZSBsaW5rYWdlLCB0byByZW5hbWUKCSAgICB0aGUgU1dJR19pbml0IGZ1bmN0aW9uIHVuaXF1ZWx5LgoKMDIvMTIvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhLCBDI10gUGF0Y2ggc3VibWl0dGVkIGJ5IEJpbGwgSG9mZm1hbiB3aGljaCBwcmV2ZW50cyBTV0lHIGZyb20gY3Jhc2hpbmcKICAgICAgICAgICAgd2hlbiBhIGZpbGUgZm9yIHRoZSB0eXBld3JhcHBlciBjbGFzcyBjYW5ub3QgYmUgb3BlbmVkLgoKMDIvMTEvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhLCBDI10gT3ZlcmxvYWRpbmcgY2hhbmdlczoKICAgICAgICAgICAgICAtIE1ldGhvZHMgd2hpY2ggYXJlIG92ZXJsb2FkZWQgaW4gY29uc3Qgb25seSBubyBsb25nZXIgZ2VuZXJhdGUgSmF2YQogICAgICAgICAgICAgICAgY29kZSB0aGF0IHdvbid0IGNvbXBpbGUgLSB0aGUgZmlyc3QgbWV0aG9kIHBhcnNlZCBpcyB1c2VkIGFuZCBhCiAgICAgICAgICAgICAgICB3YXJuaW5nIGlzIGRpc3BsYXllZC4gTm90ZSB0aGF0IHRoaXMgYmVoYXZpb3VyIGlzIHNsaWdodGx5IGRpZmZlcmVudAogICAgICAgICAgICAgICAgdG8gdGhlIHNjcmlwdGluZyBsYW5ndWFnZXMgd2hpY2ggYWx3YXlzIHVzZXMgdGhlIG5vbi1jb25zdCBtZXRob2QuCiAgICAgICAgICAgICAgLSBXYXJuaW5nIG1lc3NhZ2VzIDUwOSBhbmQgNTEyIHJlcGxhY2VkIGJ5IG5ldyB3YXJuaW5nIG51bWJlciA1MTYsIHdoaWNoIAogICAgICAgICAgICAgICAgaXMgbW9yZSByZWxldmFudCB0byB0aGVzZSBzdGF0aWNhbGx5IHR5cGVkIGxhbmd1YWdlcyBhcyB0aGUgb3ZlcmxvYWRlZAogICAgICAgICAgICAgICAgbWV0aG9kcyBhcmVuJ3QgJ3NoYWRvd2VkJywgdGhleSBhcmUgaWdub3JlZC4KCjAxLzIzLzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIFJlcGxhY2UgdGhlICJrbm93bl9jbGFzc2VzIiBoYXNoIHRhYmxlIGJ5IGEgbm9kZQoJICAgIGF0dHJpYnV0ZS4gIE1ldGhvZHMgb2YgY2xhc3NlcyBpbiBDKysgbmFtZXNwYWNlcyBub3cgZ2V0CgkgICAgdGhlIHByb3BlciBzcGVjaWFsaXplciBpbiB0aGUgR09PUFMgZGVjbGFyYXRpb24uCgkgICAgUmVwb3J0ZWQgYnkgcm1AbWgtZnJlaWJ1cmcuZGUuCgowMS8yMy8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBVbmlxdWlmeSB0aGUgYXJndW1lbnQgbmFtZXMgaW4gR09PUFMgc2hhZG93IG1ldGhvZAoJICAgIGRlY2xhcmF0aW9ucy4gIFJlcG9ydGVkIGJ5IHJtQG1oLWZyZWlidXJnLmRlLgoKMDEvMjEvMjAwNDogc3Vuc2hpbmUgKEVyaWMgU3Vuc2hpbmUpCiAgICAgICAgICAgIFJldml2ZWQgdGhlIE5leHRTdGVwIHBvcnQgb2YgU1dJRy4KCiAgICAgICAgICAgIEZpeGVkIGZhdGFsIHByb2JsZW0gaW4gRG9oU3Ryc3RyKCkgY2F1c2VkIGJ5IGRpZmZlcmVuY2UgaW4gc3Ryc3RyKCkKICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gd2hpY2ggbWFkZSAlYXBwbHkgYmVjb21lIGVudGlyZWx5IGR5c2Z1bmN0aW9uYWwuICBPbgogICAgICAgICAgICBOZXh0U3RlcCwgc3Ryc3RyKCJmb28iLCIiKSBldmFsdWF0ZXMgdG8gTlVMTDsgd2hlcmVhcywgb24gbW9kZXJuCiAgICAgICAgICAgIHBsYXRmb3JtcywgaXQgZXZhbHVhdGVzIHRvICJmb28iLiAgJWFwcGx5IHJlbGllcyBleHRlbnNpdmVseSB1cG9uCiAgICAgICAgICAgIHN0cnN0cigiZm9vIiwiIikgZXZhbHVhdGluZyB0byBub24tTlVMTCwgdGhlcmVmb3JlIGl0IGZhaWxlZAogICAgICAgICAgICBjYXRhc3Ryb3BoaWNhbGx5IHdoZW4gZmFjZWQgd2l0aCBOZXh0U3RlcCdzIHN0cnN0cigpLgoKICAgICAgICAgICAgQWRkZWQgYGJvb2wnIGNoZWNrIHRvIGNvbmZpZ3VyZS5pbiBzaW5jZSBOZXh0U3RlcCdzIEMrKyBjb21waWxlcgogICAgICAgICAgICBkb2VzIG5vdCBzdXBwbHkgdGhpcyB0eXBlLiAgc3dpZy5oIG5vdyBmYWtlcyB1cCBgYm9vbCcgaWYgbmVlZGVkLgoKICAgICAgICAgICAgV29ya2VkIGFyb3VuZCBOZXh0U3RlcCBDKysgY29tcGlsZXIgYnVnIGluIHdoaWNoIEMrKyBjb2RlIGlzCiAgICAgICAgICAgIGRpc2FsbG93ZWQgaW5zaWRlIGV4dGVybiAiQyIgZnVuY3Rpb25zLiAgVGhpcyBwcm9ibGVtIGFmZmVjdGVkIGFsbAogICAgICAgICAgICBsYW5ndWFnZSBtb2R1bGVzLCBzaW5jZSB0aGV5IHB1Ymxpc2ggaG9vayBmdW5jdGlvbnMgb2YgdGhlIGZvcm06CiAgICAgICAgICAgICAgICBleHRlcm4gIkMiIExhbmd1YWdlICpzd2lnX2Zvbyh2b2lkKSB7IHJldHVybiBuZXcgRk9PKCk7IH0KICAgICAgICAgICAgRml4ZWQgYnkgY3JlYXRpbmcgYSBDKysgd3JhcHBlcjoKICAgICAgICAgICAgICAgIHN0YXRpYyBMYW5ndWFnZSAqbmV3X3N3aWdfZm9vKCkgeyByZXR1cm4gbmV3IEZPTygpOyB9CiAgICAgICAgICAgICAgICBleHRlcm4gIkMiIExhbmd1YWdlICpzd2lnX2Zvbyh2b2lkKSB7IHJldHVybiBuZXdfc3dpZ19mb28oKTsgfQoKICAgICAgICAgICAgRW5zdXJlZCB0aGF0IFN3aWdfY29weV9zdHJpbmcoKSBpcyB1c2VkIGluIHBsYWNlIG9mIHN0cmR1cCgpIHNpbmNlCiAgICAgICAgICAgIE5leHRTdGVwIGRvZXMgbm90IHN1cHBseSBzdHJkdXAoKS4KCiAgICAgICAgICAgIEZpeGVkIGRldGVjdGlvbiBvZiBSdWJ5IGxpYnJhcnkgbmFtZSBhbmQgbG9jYXRpb24gaW4gY29uZmlndXJlLmluLgogICAgICAgICAgICBQcm9ibGVtIDE6IEFzc3VtZWQgdGhhdCBsaWJyYXJ5IGFsd2F5cyByZXNpZGVkIGluIFJ1YnkncyAiYXJjaGRpciIsCiAgICAgICAgICAgIHdoaWNoIHdhcyBjb3JyZWN0IGZvciBSdWJ5IDEuNi54LCBidXQgd2hpY2ggaXMgaW5jb3JyZWN0IGZvciBSdWJ5CiAgICAgICAgICAgIDEuOC54LCBpbiB3aGljaCBjYXNlIHRoZSBsaWJyYXJ5IG5vcm1hbGx5IHJlc2lkZXMgaW4gUnVieSdzCiAgICAgICAgICAgICJsaWJkaXIiLiAgUHJvYmxlbSAyOiBBc3N1bWVkIHRoYXQgdGhlIGxpYnJhcnkgY291bGQgYWx3YXlzIGJlCiAgICAgICAgICAgIGxpbmtlZCB2aWEgIi1sIitSVUJZX0lOU1RBTExfTkFNRSAod2hlcmUgUlVCWV9JTlNUQUxMX05BTUUKICAgICAgICAgICAgdHlwaWNhbGx5IGlzICJydWJ5IiksIGhvd2V2ZXIgdGhpcyBmYWlsZWQgZm9yIHBsYXRmb3Jtcywgc3VjaCBhcwogICAgICAgICAgICBOZXh0U3RlcCwgd2hpY2ggZG8gbm90IHN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcy4gIEluIHRoaXMgY2FzZSwgdGhlCiAgICAgICAgICAgIHN0YXRpYyBsaWJyYXJ5IG5hbWUgaW4gMS44LnggaXMgbGlicnVieS1zdGF0aWMuYSwgdGh1cwogICAgICAgICAgICAtbHJ1Ynktc3RhdGljIGlzIHJlcXVpcmVkLiAgVGhlIG5ldyBsb2dpYyB3b3JrcyBjb3JyZWN0bHkgZm9yCiAgICAgICAgICAgIHN0YXRpYyBhbmQgc2hhcmVkIGxpYnJhcmllcyBmb3IgMS42LnggYW5kIDEuOC54LgoKICAgICAgICAgICAgRml4ZWQgZGV0ZWN0aW9uIG9mIFBlcmwgQ0ZMQUdTIGluIGNvbmZpZ3VyZS5pbiBmb3IgTmV4dFN0ZXAuCiAgICAgICAgICAgIERldGVjdGlvbiBjb2RlIGV4dHJhY3RlZCBDRkxBR1MgZnJvbSBQZXJsJ3MgJUNvbmZpZyBoYXNoIGJ1dAogICAgICAgICAgICBuZWdsZWN0ZWQgdG8gYWRkIGEgbmV3bGluZSB0byB0aGUgdmFsdWUgYmVmb3JlIHBhc3NpbmcgaXQgdGhyb3VnaAogICAgICAgICAgICBgc2VkJy4gIE5leHRTdGVwJ3MgYW5jaWVudCBgc2VkJyBkaXNjYXJkcyBpbnB1dCB3aGljaCBpcyBub3QKICAgICAgICAgICAgdGVybWluYXRlZCB3aXRoIGEgbmV3bGluZSwgdGh1cyBQZXJsIENGTEFHUyBhbHdheXMgZXZhbHVhdGVkIHRvIHRoZQogICAgICAgICAgICBlbXB0eSBzdHJpbmcuCgowMS8xNi8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgVGlkeSB1cCBpbiB0aGUgZXhjZXB0aW9uIGhhbmRsaW5nIGNvZGUgdGhhdCBpcyBnZW5lcmF0ZWQgd2hlbgogICAgICAgICAgICBDKysgZXhjZXB0aW9uIHNwZWNpZmljYXRpb25zIGFyZSB3cmFwcGVkIHdpdGggdGhlIHRocm93cyB0eXBlbWFwLgogICAgICAgICAgICBUaGlzIHJlZHVuZGFudCBjb2RlIGlzIG5vIGxvbmdlciBnZW5lcmF0ZWQ6CgogICAgICAgICAgICAgICAgY2F0Y2goLi4uKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3c7IAogICAgICAgICAgICAgICAgfQoKMDEvMTIvMjAwNDogd3NmdWx0b24gb24gYmVoYWxmIG9mIG1tYXR1cyAobWFyY2VsbyBtYXR1cykgCiAgICAgICAgICAgIGlmIGEgbWV0aG9kIHVzZXMgJWV4Y2VwdGlvbiBhbmQgdGhlIG1ldGhvZCByZXF1aXJlcyB0aGUgdXNlCiAgICAgICAgICAgIG9mIHRoZSB0aHJvd3MgdHlwZW1hcCwgdGhlIGNvZGUgaW4gYSB0aHJvd3MgdHlwZW1hcCB3aWxsIGJlCiAgICAgICAgICAgIGdlbmVyYXRlZCBpbnNpZGUgdGhlIHRyeSBib2R5LiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWV4Y2VwdGlvbiBtZXRob2QgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgLy8gbWV0aG9kIGFjdGlvbiAKICAgICAgICAgICAgICAgICAgJGFjdGlvbgogICAgICAgICAgICAgICAgfSBjYXRjaCAoaW50IGkpIHsKICAgICAgICAgICAgICAgICAgLy8gbWV0aG9kIGludCBjYXRjaCBoYW5kbGVyCiAgICAgICAgICAgICAgICB9IGNhdGNoICguLi4pIHsKICAgICAgICAgICAgICAgICAgLy8gbWV0aG9kIGdlbmVyaWMgY2F0Y2ggaGFuZGxlcgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAldHlwZW1hcCh0aHJvd3MpIEV4Y2VwdCAlewogICAgICAgICAgICAgICAgLy8gdGhyb3dzIHR5cGVtYXAgRXhjZXB0IGNhdGNoIGhhbmRsZXIKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgICAlaW5saW5lICV7CiAgICAgICAgICAgICAgY2xhc3MgRXhjZXB0IHt9OwogICAgICAgICAgICAgIHZvaWQgbWV0aG9kKGludCBpKSB0aHJvdyAoRXhjZXB0KTsKCiAgICAgICAgICAgIFdpbGwgZ2VuZXJhdGU6CgogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgIC8vIG1ldGhvZCBhY3Rpb24gCiAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZChhcmcxKTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIGNhdGNoKEV4Y2VwdCAmX2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJvd3MgdHlwZW1hcCBFeGNlcHQgY2F0Y2ggaGFuZGxlcgogICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGludCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAvLyBtZXRob2QgaW50IGNhdGNoIGhhbmRsZXIKICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoLi4uKSB7CiAgICAgICAgICAgICAgICAgICAgICAvLyBtZXRob2QgZ2VuZXJpYyBjYXRjaCBoYW5kbGVyCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgQXMgY2FuIGJlIHNlZW4sIHRoZSBpbm5lciB0cnkgY2F0Y2ggYmxvY2sgaXMgZm9yIHRoZSB0aHJvd3MgdHlwZW1hcHMuCiAgICAgICAgICAgIFByZXZpb3VzbHksIHRoaXMgd2FzIHJldmVyc2VkIHNvIHRoYXQgdGhlIGlubmVyIHRyeSBjYXRjaCBibG9jawogICAgICAgICAgICB3YXMgdGhlICVleGNlcHRpb24gY29kZS4gSW4gdGhlIGV4YW1wbGUgYWJvdmUsIGl0IHdvdWxkIGhhdmUgYmVlbgogICAgICAgICAgICBpbXBvc3NpYmxlIHRvIGNhdGNoIEV4Y2VwdCBhcyB0aGUgY2F0Y2ggYWxsICguLi4pIHdvdWxkIGNhdGNoIHRoZQogICAgICAgICAgICBleGNlcHRpb24gaW5zdGVhZC4KClZlcnNpb24gMS4zLjIxIChKYW51YXJ5IDExLCAyMDA0KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjAxLzEwLzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBUaGUgb3V0cHV0IGZvcm1hdCBmb3IgYm90aCB3YXJuaW5ncyBhbmQgZXJyb3JzIGNhbiBiZSBzZWxlY3RlZCBmb3IKICAgICAgICAgICAgaW50ZWdyYXRpb24gd2l0aCB5b3VyIGZhdm91cml0ZSBJREUvZWRpdG9yLiBFZGl0b3JzIGFuZCBJREVzIGNhbiB1c3VhbGx5CiAgICAgICAgICAgIHBhcnNlIGVycm9yIG1lc3NhZ2VzIGFuZCBpZiBpbiB0aGUgYXBwcm9wcmlhdGUgZm9ybWF0IHdpbGwgZWFzaWx5IHRha2UgeW91IAogICAgICAgICAgICBkaXJlY3RseSB0byB0aGUgc291cmNlIG9mIHRoZSBlcnJvci4gVGhlIHN0YW5kYXJkIGZvcm1hdCBpcyB1c2VkIGJ5IAogICAgICAgICAgICBkZWZhdWx0IGV4Y2VwdCBvbiBXaW5kb3dzIHdoZXJlIHRoZSBNaWNyb3NvZnQgZm9ybWF0IGlzIHVzZWQgYnkgZGVmYXVsdC4KICAgICAgICAgICAgVGhlc2UgY2FuIGJlIG92ZXJyaWRkZW4gdXNpbmcgY29tbWFuZCBsaW5lIG9wdGlvbnMsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICQgc3dpZyAtcHl0aG9uIC1Gc3RhbmRhcmQgZXhhbXBsZS5pCiAgICAgICAgICAgICAgICBleGFtcGxlLmk6NDogU3ludGF4IGVycm9yIGluIGlucHV0LgogICAgICAgICAgICAgICAgJCBzd2lnIC1weXRob24gLUZtaWNyb3NvZnQgZXhhbXBsZS5pCiAgICAgICAgICAgICAgICBleGFtcGxlLmkoNCk6IFN5bnRheCBlcnJvciBpbiBpbnB1dC4KCjAxLzA5LzIwMDQ6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA4NzE5MDkgXSBzaW1wbGUgbmFtZXNwYWNlIHByb2JsZW0uCiAgICAgICAgICAgIFRoaXMgd2FzIGEgcHJvYmxlbSB1c2luZyBhbm9ueW1vdXMgc3RydWN0dXJlcyBpbiBhIG5hbWVzcGFjZS4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIG5zIHsKICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0ICB7CiAgICAgICAgICAgICAgICAgICAgICBpbnQgbjsKICAgICAgICAgICAgICAgICAgIH0gUzsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBSZXBvcnRlZCBieSBKb3NoIENoZXJyeS4KCjAxLzA5LzIwMDQ6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc29tZSBicm9rZW4gUGVybCBleGFtcGxlcy4KCjEyLzI4LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YSBhbmQgQyNdIEZpeGVzIGZvciB3cmFwcGluZyBjb3ZhcmlhbnQgKHBvbHltb3JwaGljKSByZXR1cm4gdHlwZXMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIHN0cnVjdCBCYXNlIHsKICAgICAgICAgICAgICAgICAgdmlydHVhbCB+QmFzZSgpOwogICAgICAgICAgICAgICAgICB2aXJ0dWFsIEJhc2UqIGNvcHkoKSBjb25zdCA9IDA7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgc3RydWN0IERlcml2ZWQgOiBCYXNlIHsKICAgICAgICAgICAgICAgICAgdmlydHVhbCBEZXJpdmVkKiBjb3B5KCkgY29uc3Q7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIERlcml2ZWQ6OmNvcHkgcHJveHkgbWV0aG9kIHJldHVybnMgQmFzZSBub3QgRGVyaXZlZC4gQSB3YXJuaW5nIGlzIGlzc3VlZAogICAgICAgICAgICBhYm91dCB0aGlzLiBQcmV2aW91c2x5IHRoZSBwb2ludGVyIHVzZWQgYnkgdGhlIHByb3h5IGNsYXNzIHdhcyBpbmNvcnJlY3RseQogICAgICAgICAgICB0cmVhdGVkIGFzIGEgQmFzZSogaW5zdGVhZCBvZiBhIERlcml2ZWQqLgoKMTIvMTgvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeCBzbyB0aGF0IFdpbmRvd3MgcGF0aHMgYXJlIGRpc3BsYXllZCBjb3JyZWN0bHkgd2hlbiByZXBvcnRpbmcgZXJyb3JzLgogICAgICAgICAgICBBbiBlcnJvciBwcmV2aW91c2x5IHdvdWxkIGhhdmUgYmVlbiBzaG93biBzb21ldGhpbmcgbGlrZToKCiAgICAgICAgICAgICAgLj94YW1wbGUuaToxNDogU3ludGF4IGVycm9yIGluIGlucHV0LgoKICAgICAgICAgICAgaW5zdGVhZCBvZjoKCiAgICAgICAgICAgICAgLlxleGFtcGxlLmk6MTQ6IFN5bnRheCBlcnJvciBpbiBpbnB1dC4KCgpWZXJzaW9uIDEuMy4yMCAoRGVjZW1iZXIgMTcsIDIwMDMpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEyLzE3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgTGFzdCBtaW51dGUgbW9kaWZpY2F0aW9ucy4gICBQZXJsNSBtb2R1bGUgbm93IGdlbmVyYXRlcyBzaGFkb3cgY2xhc3NlcwogICAgICAgICAgICBieSBkZWZhdWx0IGxpa2UgYWxsIG9mIHRoZSBvdGhlciBtb2R1bGVzLiAgUEhQNCB3cmFwcGVycyBubyBsb25nZXIKICAgICAgICAgICAgaW5jbHVkZSAiY29uZmlnLmgiLiAKCjEyLzE0LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgV2Vha2VuZWQgd2FybmluZyBtZXNzYWdlIHJlbGF0ZWQgdG8gY29uc3RydWN0b3IgbmFtZXMgc28gdGhhdCBhbgogICAgICAgICAgICB1bnVzdWFsIG5lc3RlZC1jbGFzcyB3cmFwcGluZyB0ZWNobmlxdWUgd291bGQgd29yayBhZ2FpbiAoYXBwYXJlbnRseQogICAgICAgICAgICBpdCB3b3JrZWQgaW4gc29tZSBvbGRlciBTV0lHIHJlbGVhc2VzKS4gICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGNsYXNzIFNjb3BlIHsKICAgICAgICAgICAgICAgICAgIGNsYXNzIENsYXNzQTsKICAgICAgICAgICAgICAgICAgIGNsYXNzIENsYXNzQjsKICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgY2xhc3MgU2NvcGU6OkNsYXNzQSB7CiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICBjbGFzcyBTY29wZTo6Q2xhc3NCIHsKICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIE5vdGU6ICBUaGVyZSBpcyBzdGlsbCBzb21lIG9kZCBpbnRlcmFjdGlvbiB3aXRoIHRoZSBTV0lHIHN5bWJvbAogICAgICAgICAgICB0YWJsZS90eXBlIHN5c3RlbSB0aGF0IHdpbGwgbmVlZCB0byBiZSBsb29rZWQgYXQgaW4gYSBmdXR1cmUgcmVsZWFzZS4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgR3VzdGF2byBOaWVtZXllci4KCgoxMi8xMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFByb3RlY3RlZCBjbGFzcyBtZXRob2RzIGFyZSB3cmFwcGVkIGFzIHByb3RlY3RlZCBKYXZhIG1ldGhvZHMgCiAgICAgICAgICAgIHdoZW4gdXNpbmcgdGhlIGRpcnByb3QgZGlyZWN0b3IgZmVhdHVyZS4gVGhpcyBjYW4gYmUgY2hhbmdlZCB1c2luZwogICAgICAgICAgICAlamF2YW1ldGhvZG1vZGlmaWVycyB0byBzb21ldGhpbmcgZWxzZSBzaG91bGQgdGhlIG5lZWQgYXJpc2UsIGZvcgogICAgICAgICAgICBleGFtcGxlLCBwcml2YXRlIG9yIHBhY2thZ2UgYWNjZXNzLgoKMTIvMTEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhLCBDI10gCiAgICAgICAgICAgICVqYXZhbWV0aG9kbW9kaWZpZXJzIChKYXZhKSBhbmQgJWNzbWV0aG9kbW9kaWZpZXJzIChDIykgb3BlcmF0ZSBzbGlnaHRseSAKICAgICAgICAgICAgZGlmZmVyZW50bHkuIFByZXZpb3VzbHkgdGhpcyBmZWF0dXJlIGhhZCB0byBiZSBwcmVzZW50IHRvIHNldCB0aGUgbWV0aG9kCiAgICAgICAgICAgIG1vZGlmaWVycy4gTm93IGl0IGlzIG9ubHkgdXNlZCBpZiBpdCBleGlzdHMgZm9yIHRoZSBtZXRob2QgYmVpbmcgd3JhcHBlZC4KICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgInB1YmxpYyIgYXMgcHJldmlvdXMgaG93ZXZlciwgd2hlbiB3cmFwcGluZyBwcm90ZWN0ZWQKICAgICAgICAgICAgZGlyZWN0b3IgbWV0aG9kcyBpdCBpcyAicHJvdGVjdGVkIi4gVGhpcyBjaGFuZ2Ugd2lsbCBub3QgYWZmZWN0IGV4aXN0aW5nCiAgICAgICAgICAgIHVzZSBvZiB0aGUgJWphdmFtZXRob2Rtb2RpZmllcnMgb3IgJWNzbWV0aG9kbW9kaWZpZXJzLgoKMTIvMTEvMjAwMzogbW1hdHVzIChNYXJjZWxvIE1hdHVzKQoKCSAgICBUaGlzIGZpeCBzb21lIHJlY3VycmluZyByZXBvcnRzIGFib3V0IGtleXdvcmRzIG5vdCBiZWVuCgkgICAgcHJvcGVybHkgaWRlbnRpZmllZCBhbmQgd2FybmVkLCBhbmQgaXQgc29sdmVzIHRoZSBwcm9ibGVtCgkgICAgb2YgaG93IHRvIGFkZCBhIHRlc3QgZmlsZSB0byB0aGUgdGVzdC1zdWl0ZSBzdWNoIHRoYXQgaXQKCSAgICBkb2Vzbid0IHVzZSBhbnkga2V5d29yZCBvZiBhbGwgdGhlIHN1cHBvcnRlZCBsYW5ndWFnZXMKCSAgICAoYW5kIGRvaW5nIGl0IHdpdGhvdXQgY29tcGlsaW5nIHRoZSB0ZXN0IGZvciBhbGwgdGhlCgkgICAgc3VwcG9ydGVkIGxhbmd1YWdlcywgdGhpbmcgdGhhdCBpcyBub3QgYWx3YXlzIHBvc3NpYmxlLAoJICAgIGFuZCB3aXRob3V0IHJlcXVpcmluZyB5b3UgdG8ga25vdyBhbGwgdGhlIHN1cHBvcnRlZAoJICAgIGxhbmd1YWdlIGtleXdvcmRzLCB0aGluZyB0aGF0IGlzIGFsd2F5cyBpbXBvc3NpYmxlKS4KCgkgICAgU28gdGhlc2UgYXJlIHRoZSBjaGFuZ2VzIGdsb2JhbGx5IHNwZWFraW5nOgoKCSAgICAtIFVuaWZvcm0gdGhlIGRlZmluaXRpb24gb2YgdGhlIGtleXdvcmQgd2FybmluZ3MgdGhyb3VnaAoJICAgICAgdGhlIHN1cHBvcnRlZCBsYW5ndWFnZXM6IGFsbCB0aGUgbGFuZ3VhZ2VzIGhhcyBub3cgYQoJICAgICAgc2VwYXJhdGUgZmlsZSB0aGF0IGRlZmluZXMgdGhlIGtleXdvcmRzIG9yIGJhZCBuYW1lczoKCgkJICBweXRob24vcHl0aG9ua3cuc3dnCgkJICBjaGlja2VuL2NoaWNrZW5rdy5zd2cKICAgICAgICAgICAgICAgICAgLi4uLgoKCSAgICAtIEFkZGVkIGtleXdvcmQgbGlzdCBmb3IgbW9zdCBvZiB0aGUgbGFuZ3VhZ2VzIHRoYXQgZGlkbid0CgkgICAgICBoYXZlIG9uZSAodXNpbmcgdGhlIG5ldyBzZXBhcmF0ZWQgZmlsZSkuCgkJICAgIAkgICAgCgkgICAgLSBBZGRlZCB0aGUgIkFsbCBrZXl3b3JkcyIgd2FybmluZyBzdXBwb3J0OiAtV2FsbGt3IG9wdGlvbi4KCiAgICAgICAgICAgICAgVGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBpbmNsdWRlIGFsbCB0aGUga25vd24ga2V5d29yZHMKCSAgICAgIGZvciBhbGwgdGhlIHN1cHBvcnRlZCBsYW5ndWFnZXMsIGFuZCBjYW4gYmUgdXNlZCBhczoKCiAgICAgICAgICAgICAgICAgc3dpZyAtV2FsbGt3IC4uLi4KCSAgICAKCSAgICAgIFRoaXMgd2lsbCBoZWxwIHRvIHRoZSBwcm9jZXNzIG9mIGFkZGluZyBhIHRlc3Qtc3VpdGUKCSAgICAgIGZpbGUgdGhhdCBjYW4gYmUgY29tcGlsZWQgaW4gYWxsIHRoZSBzd2lnIHN1cHBvcnRlZAoJICAgICAgbGFuZ3VhZ2VzLCBhbmQgaXQgd2lsbCBiZSBhbHNvIGhlbHBmdWwgZm9yIHVzZXJzIHdobwoJICAgICAgd2FudCB0byBjcmVhdGUgbXVsdGktbGFuZ3VhZ2UgbGlicmFyaWVzLgoJICAgIAoJICAgIEFuZCB0aGVzZSBhcmUgdGhlIGRldGFpbGVkIGNoYW5nZXMgKG1vc3RseSBmaWxlIGFkZGl0aW9uKToKCgkgICAgLSBGb3IgdGhlIGxhbmd1YWdlcyB0aGF0IGFscmVhZHkgaGF2ZSBzb21lIHNvcnQgb2Yga2V5d29yZAoJICAgICAgd2FybmluZyBsaXN0LCBtb3ZlIGl0IHRvIGFuIGV4dGVybmFsIGxhbmd1YWdla3cuc3dnCgkgICAgICBmaWxlLCBpZToKCSAgICAKCSAgICAgICAgIG1vdmUga2V5d29yZHMgZnJvbSBweXRob24uc3dnIC0+IHB5dGhvbmt3LnN3ZwoJICAgICAgICAgbW92ZSBrZXl3b3JkcyBmcm9tIGNoaWNrZW4uc3dnIC0+IGNoaWNrZW5rdy5zd2cKCSAgICAgICAgIG1vdmUga2V5d29yZHMgZnJvbSB0Y2w4LnN3ZyAtPiB0Y2xrdy5zd2cKIAogICAgICAgICAgICAgIGFuZCByZS1pbmNsdWRlIGxhbmd1YWdla3cuc3dnIGZyb20gbGFuZ3VhZ2Uuc3dnLgoJICAgIAoJICAgIC0gRm9yIHRoZSBsYW5ndWFnZSB0aGF0IGRpZG4ndCBoYXZlIGEga2V5d29yZCBsaXN0LCBhbmQKCSAgICAgIGZvciB0aGUgb25lcyB0aGF0IEkgY291bGQgZmluZCBhIGxpc3QsIGFkZCB0aGUKCSAgICAgIGxhbmd1YWdla3cuc3dnIGZpbGUsIGllOgoKICAgICAgICAgICAgICAgICBjc2hhcnAvY3NoYXJwa3cuc3dnCiAgICAgICAgICAgICAgICAgamF2YS9qYXZha3cuc3dnCiAgICAgICAgICAgICAgICAgcGhwNC9waHBrdy5zd2cKCQkgcGlrZS9waWtla3cuc3dnCSAKCQkgcnVieS9ydWJ5a3cuc3dnCgoKICAgICAgICAgICAgICBhbHNvIGFkZCBhIGxpbmUgaW4gbGFuZ3VhZ2Uuc3dnIHRvIGluY2x1ZGUKCSAgICAgIGxhbmd1YWdla3cuc3dnLCBidXQgbm93IGl0IGlzIGNvbW1lbnRlZCEhISwgbGlrZSBpbgoJICAgICAgamF2YS5zd2c6CgogICAgICAgICAgICAgICAgICAvKiBqYXZhIGtleXdvcmRzICovCiAgICAgICAgICAgICAgICAgIC8qIHBsZWFzZSB0ZXN0IGFuZCBhY3RpdmF0ZSAqLwogICAgICAgICAgICAgICAgICAvLyVpbmNsdWRlICJqYXZha3cuc3dnIgoKCSAgICAgIGllLCB0aGVyZSB3aWxsIGJlIG5vIGNoYW5nZSBpbiBob3cgc3dpZyBydW5zIG5vcm1hbGx5CgkgICAgICB1bnRpbCB0aGUgbGFuZ3VhZ2UgbWFpbnRhaW5lciB0ZXN0IGFuZCB1bmNvbW1lbnQgdGhhdAoJICAgICAgbGluZS4KCSAgICAgIAoJICAgICAgU28sIHBsZWFzZSBjaGVjayBlYWNoIGxhbmd1YWdla3cuc3dnIGZpbGUgKEkgbGVmdCB0aGUKCSAgICAgIGxpbmsgdG8gdGhlIGtleXdvcmQgbGlzdCBzb3VyY2UgZm9yIGNoZWNraW5nKSwgYW5kIGFmdGVyCgkgICAgICB0ZXN0aW5nLCB1bmNvbW1lbnQgdGhlICVpbmNsdWRlIGxpbmUuCgoJICAgIC0gQWRkZWQgdGhlIGZpbGUgYWxsa3cuc3dnLCB3aGljaCBpbmNsdWRlcyBhbGwgdGhlCiAgICAgICAgICAgICAgbGFuZ3VhZ2Vrdy5zd2cgZmlsZXMuCgoJICAgICAgRm9yIHRoZSBsYW5ndWFnZXMgdGhhdCBoYXMgbm8gbGFuZ3VhZ2Vrdy5zd2cgZmlsZSByaWdodAoJICAgICAgbm93LCBhbmQgaWYgdGhleSBuZWVkIG9uZSwgYWRkIHRoZSBmaWxlIGludG8gdGhlCgkgICAgICBsYW5ndWFnZSBkaXJlY3RvcnksIGFuZCBhZGQgdGhlIGNvcnJlc3BvbmRpbmcgaW5jbHVkZQoJICAgICAgbGluZSBpbnRvIHRoZSBhbGxrdy5zd2cgZmlsZS4KCSAgICAgIAoJICAgIC0gQWRkZWQgdGhlIC1XYWxsa3cgdGhhdCBpbmNsdWRlcyB0aGUgYWxsa3cuc3dnIGZpbGUuCgkgICAgICBOb3RlIHRoYXQgdGhlIG9sZCAtbGFsbGt3LnN3ZyBvcHRpb24gY291bGRuJ3QgYmUgdXNlZAoJICAgICAgc2luY2UgaXQgaW5jbHVkZSB0aGUgZmlsZSBhZnRlciBpdCB3b3VsZCBiZSBuZWVkZWQuCgoKCSAgICBIb3BlZnVsbHksIHRoZSAtV2FsbGt3IG9wdGlvbiB3aWxsIGJlIGFkZGVkIHRvIHRoZSBkZWZhdWx0CgkgICAgcnVsZXMgaW4gdGhlIHJlbGF0ZWQgdGVzdC1zdWl0ZSBNYWtlZmlsZXMsIHNvLCB3aGVuCgkgICAgY3JlYXRpbmcgYSBuZXcgdGVzdCwgb3IgYWRkaW5nIGEgbmV3IHN3aWcgbGlicmFyeSBmaWxlCgkgICAgKGxpa2UgX3N0ZF9kZXF1ZS5pKSwgc3dpZyB3aWxsIHdhcm4geW91IGlmIHlvdSBhcmUgdXNpbmcgYQoJICAgIGJhZCBuYW1lLCBjb25zaWRlcmluZyBhbGwgdGhlIGxhbmd1YWdlIHdoZXJlIGl0IG5lZWRzIHRvCgkgICAgcnVuLgoJICAgIAoJICAgIFJpZ2h0IG5vdyB5b3UgY2FuIHRlc3QgaXQgYnkgdXNpbmc6CgogICAgICAgICAgICAgICBtYWtlIGNoZWNrLXB5dGhvbi10ZXN0LXN1aXRlIFNXSUc9InN3aWcgLVdhbGxrdyIKCgkgICAgb3IgdXNpbmcgeW91ciBmYXZvcml0ZSB0YXJnZXQgbGFuZ3VhZ2UsIGl0IGRvZXNuJ3QgbWF0dGVyLgoKCSAgICBBbmQgeWVzLCB0aGVyZSBhcmUgc2V2ZXJhbCBleGFtcGxlcyB0aGF0IGFyZSB1c2luZwoJICAgIHJlc2VydmVkIGtleXdvcmRzLCBzcGVjaWFsbHkgZnJvbSBjc2hhcnAuCiAgICAgICAgICAKCSAgICAqKiogUmVtZW1iZXIgKioqKjogdGhlIG5ldyBrZXl3b3JkIHdhcm5pbmcgbGlzdHMgYXJlIG5vdAoJICAgIGluY2x1ZGVkIGJ5IGRlZmF1bHQgaW4gYW55IG9mIGxhbmd1YWdlIHRoYXQgYmVmb3JlIGRpZG4ndAoJICAgIGhhdmUgb25lLiBUbyBlbmFibGUgdGhlIGtleXdvcmQgd2FybmluZ3MgYXMgdGhlIGRlZmF1bHQKCSAgICBiZWhhdmlvciwgdGhlIGluY2x1c2lvbiBvZiB0aGUgbGFuZ3VhZ2Vrdy5zd2cgZmlsZSBoYXMgdG8KCSAgICBiZSB1bmNvbW1lbnRlZCBhdCBlYWNoIGxhbmd1YWdlLnN3ZyBmaWxlLgoKCSAgICBTbywgYWxsIHRoZSBsYW5ndWFnZSBtYWludGFpbmVycywgcGxlYXNlIGNoZWNrIHRoZQoJICAgIGtleXdvcmRzIGxpc3QuIAoKCSAgICBBbHNvLCB5b3UgY2FuIGFkZCBidWl0LWluIG5hbWVzLCBhbmQgbm90IG9ubHkga2V5d29yZHMsIGxpa2UKCSAgICAnVHJ1ZS9GYWxzZScgaW4gcHl0aG9uLiAgUmVtZW1iZXIgdGhhdCB5b3UgY2FuIGJlIG1vcmUKCSAgICBzcGVjaWZpYyBhbmQgcmVmZXIgb25seSB0byBtZW1iZXIgbmFtZXMsIGxpa2UgKjo6Y29uZmlndXJlCgkgICAgb3IgKjo6Y2dldCAoc2VlIGFuIGV4YW1wbGUgaW4gdGhlIHRjbDgvdGNsOGt3LnN3ZyBmaWxlKSwKCSAgICBvciBvbmx5IGdsb2JhbCBuYW1lcywgbGlrZSA6OnJhbmdlIChzZWUgYW4gZXhhbXBsZSBpbiB0aGUKCSAgICBweXRob24vcHl0aG9ua3cuc3dnIGZpbGUuCgoJICAgIEp1c3QgdG8gYmUgY29uc2lzdGVudCwgdXNlIHRoZSBmb2xsb3dpbmcgY29kZXM6CgoJICAgIC0gVXNlIGNvZGUgMzE0IGZvciBrZXl3b3JkIGFuZC9vciBmYXRhbCBiYWQgbmFtZXMuCgkgICAgLSBVc2UgY29kZSAzMjEgZm9yIGJ1aXQtaW4gYW5kL29yIG5vdCBmYXRhbCBiYWQgbmFtZXMuCiAgICAgICAgICAgCiAgICAgICAgICAgIHNvLCB0aGV5IGNhbid0IGJlIGRpc2FibGVkL2VuYWJsZWQgaW5kZXBlbmRlbnRseSAoc2VlCgkgICAgcHl0aG9uL3B5aHRvbmt3LnN3ZyBmb3IgZXhhbXBsZXMpLgoKCSAgICAqKioqIEFuZCBkb24ndCBhZGQgYW55IG5ldyB0ZXN0IGZpbGUgd2l0aG91dCBjaGVja2luZyBpdAoJICAgIHdpdGggdGhlIC1XYWxsa3cgb3B0aW9uISEgKHRoYXQgaW5jbHVkZXMgbWUpICoqKioqLgoJICAKCjEyLzExLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBTRiBidWcgIzg1NDYzNAogICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBhY2NlcHRpbmcgdGhlIFVuaXggZGlyZWN0b3J5IHNlcGFyYXRvciAnLycgb24gCiAgICAgICAgICAgIFdpbmRvd3MgYW5kIHRoZSBNYWMgaW4gYWRkaXRpb24gdG8gdGhlIG5hdGl2ZSBvbmUgKCAnXCcgb24gCiAgICAgICAgICAgIFdpbmRvd3MpLiBUaGlzIGNhbiBiZSB1c2VkIGluICVpbXBvcnQsICVpbmNsdWRlIGFuZCBjb21tYW5kbGluZSAKICAgICAgICAgICAgb3B0aW9ucyB0YWtpbmcgYSBwYXRoLCBmb3IgZXhhbXBsZSAtSS4gT24gQ3lnd2luLCBib3RoIHRoZSBXaW5kb3dzCiAgICAgICAgICAgIGFuZCBVbml4IGRpcmVjdG9yeSBzZXBhcmF0b3IgY2FuIG5vdyBiZSB1c2VkICh3YXMgJy8nIG9ubHkpLgogICAgICAgICAgICAKMTIvMTAvMjAwMzogbW1hdHVzIChNYXJjZWxvIE1hdHVzKQoKICAgICAgICAgICAgW3B5dGhvbl0gSW1wbGVtZW50aW5nIHRoZSBydW50aW1lICJyZXByb3RlY3RlZCIgZGlyZWN0b3IKCSAgICBtZW1iZXJzLCBpZiB5b3UgaGF2ZToKICAgIAogICAgICAgICAgICAgICAgJWZlYXR1cmUoImRpcmVjdG9yIikgQjsKCiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICB2aXJ0dWFsIH5CYXIoKTsKICAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgaGVsbG8oKSB7IHJldHVybiBkb19oZWxsbygpOykKCiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGRvX2hpKCkge3JldHVybiAwO30KICAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgZG9faGVsbG8oKSB7cmV0dXJuIDA7fQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoZW4sIGF0IHRoZSBweXRob24gc2lkZQoKICAgICAgICAgICAgICAgIGltcG9ydCBteV9tb2R1bGUKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28obXlfbW9kdWxlLkJhcik6CiAgICAgICAgICAgICAgICAgIGRlZiBkb19oZWxsbyhzZWxmKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMQogICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICAgICAgCgkgICAgICAgIGIgPSBCYXIoKSAjIFB1cmUgQysrIERpcmVjdG9yIGNsYXNzCiAgICAgICAgICAgICAgICBmID0gRm9vKCkgIyBDKysgRGlyZWN0b3IgKyBweXRob24gbWV0aG9kcwoKICAgICAgICAgICAgICAgIGIuaGVsbG8oKSAjIE9rLCBhbmQgaXQgY2FsbHMgQysrIEJhcjo6ZG9faGVsbG8oKQogICAgICAgICAgICAgICAgZi5oZWxsbygpICMgT2ssIGFuZCBpdCBjYWxscyBQeXRob24gRm9vOjpkb19oZWxsbygpCgogICAgICAgICAgICAgICAgYi5kb19oaSgpICMgUnVudGltZUVycm9yLCBkb19oaSgpIGlzIHByb3RlY3RlZCEhCiAgICAgICAgICAgICAgICBmLmRvX2hpKCkgIyBSdW50aW1lRXJyb3IsIGRvX2hpKCkgaXMgcHJvdGVjdGVkISEKIAogICAgICAgICAgICAgICAgYi5kb19oZWxsbygpICMgUnVudGltZUVycm9yLCBkb19oZWxsbygpIGlzIHByb3RlY3RlZCEhCiAgICAgICAgICAgICAgICBmLmRvX2hlbGxvKCkgIyBPaywgc2luY2UgaXQgaXRzIHJlZGVmaW5lZCBpbiBweXRob24uCgogICAgICAgICAgICBIZXJlIEJhci5kb19oZWxsbyBpcyBhbHdheXMgcHJvdGVjdGVkLCBidXQgRm9vLmRvX2hlbGxvCiAgICAgICAgICAgIGlzICJwdWJsaWMiLCBiZWNhdXNlIGl0IGlzIHJlZGVmaW5lZCBpbiBweXRob24uIEJlZm9yZSwKCSAgICBhbGwgdGhlICdkb19oZWxsbycgbWV0aG9kcyB3ZXJlIHB1YmxpYy4KCgkgICAgVGhpcyBzZWVtcyB0byBiZSBhIGdvb2QgY29tcHJvbWlzZSBiZXR3ZWVuIEMrKyBhbmQgcHl0aG9uCgkgICAgcGhpbG9zb3BoaWVzLCBpZSwgYWxsIHRoZSBkaXJlY3RvciBwcm90ZWN0ZWQgbWV0aG9kcyBrZWVwCgkgICAgcHJvdGVjdGVkIGF0IHRoZSB1c2VyIHNpZGUgKEMrKyB3YXkpIHVudGlsIHRoZXkgYXJlCgkgICAgcmVkZWZpbmVkIChweXRob24gd2F5LCB3ZXJlIGFsbCBkZWZpbmVkIG1ldGhvZHMgYXJlIGFsd2F5cwoJICAgIHB1YmxpYykuIEFuZCB0aGlzIGlzIG5vdCBvbmx5IGEgZ29vZCBjb21wcm9taXNlLCBpdCBhbHNvCgkgICAgc2VlbXMgdG8gYmUgdGhlIG9ubHkgd2F5IHRvIGRvIGl0IDopLgoKCSAgICBOb3cgcnVieSBoYXMgbmF0aXZlIGRpcmVjdG9yIHByb3RlY3RlZCBtZW1iZXJzLCBhbmQgcHl0aG9uCgkgICAgcHVyZSBydW50aW1lIHN1cHBvcnQuIEkgZ3Vlc3MgdGhlc2UgYXJlIHRoZSB0d28gcG9zc2libGUKCSAgICBleHRyZW1lIGNhc2VzLiBBbmQgaG9wZWZ1bGx5LCB0aGV5IGNvdWxkIGJlIHVzZWQgYXMKCSAgICB0ZW1wbGF0ZXMgdG8gbW9kaWZ5IHRoZSBvdGhlciBsYW5ndWFnZXMgdGhhdCBzdXBwb3J0CgkgICAgZGlyZWN0b3JzLCBzbyB0aGV5IGNhbiAicmVwcm90ZWN0IiB0aGUgcHJvdGVjdGVkIGRpcmVjdG9yCgkgICAgbWVtYmVycyBhdCB0aGUgdGFyZ2V0IGxhbmd1YWdlIHNpZGUuCgoJICAgIFRoaXMgZmluaXNoZWQgdGhlIGRpcmVjdG9yIHByb3RlY3RlZCBzdXBwb3J0IGZvciB0aGUgCgkgICAgcHl0aG9uIGxhbmd1YWdlLiBPY2FsbSB3aWxsIG5lZWQgdG8gYWRkIHRoZQoJICAgICJyZXByb3RlY3Rpb24iIGxhdGVyLgoKMTIvMTAvMjAwMzogbW1hdHVzIChNYXJjZWxvIE1hdHVzKQoKCSAgICBUaGUgZm9sbG93aW5nIGNhc2UgKHJlcG9ydGVkIGJ5IEx5bGUgSm9obnNvbikgd2FzIGZpeGVkOgoKCSAgICAgICVyZW5hbWUoeCkgRm9vOjp5KCk7CiAKCSAgICAgIGNsYXNzIEZvbyB7IAoJICAgICAgcHVibGljOgoJICAgICAgICB2b2lkIHkoKTsKCgkgICAgICBwcm90ZWN0ZWQ6CgkgICAgICAgIGludCB4OwoJICAgICAgfTsKCgkgICBzd2lnIHdhcm5lZCB0aGF0IHRoZSBzeW1ib2wgJ3gnIHdhcyBhbHJlYWR5IGRlZmluZWQsIGFuZAogICAgICAgICAgIHRoZSByZW5hbWluZyBmYWlscy4gJ3gnIHdhcyBub3QgZW1pdHRlZCwgc2luY2UgaXQgaXMKICAgICAgICAgICBwcm90ZWN0ZWQsIGJ1dCBpdCB3YXMga2VwdCBpbiB0aGUgc3ltYm9sIHRhYmxlIHdpdGggdG9vCiAgICAgICAgICAgbXVjaCBpbmZvcm1hdGlvbi4KCgkgICBOb3cgc3dpZyB3b3JrcyBmb3IgYWxsIHRoZSBjYXNlcyAocGxhaW4sIGRpcmVjdG9yIGFuZAoJICAgZGlycHJvdCkgYWdhaW4uIFRoaXMgd2FzIGZpeGVkIGJ5IGFsbG93aW5nIHRoZSBwYXJzZXIueSB0bwoJICAgZGVjaWRlIG11Y2ggY2xvc2VyIHdoYXQgdG8gZG8gd2l0aCAneCcuIEJlZm9yZSBhbGwgdGhlCgkgICBkaXNjYXJkaW5nIG9yIGdlbmVyYXRpb24gd2FzIHJlc29sdmVkIGF0IHRoZSBsYW5nLmN4eAoJICAgc3RhZ2UuIEFsc28gdGhlIGNoYW5nZXMgaW4gcGFyc2VyLnkgdG8gaW1wbGVtZW50IHRoZQoJICAgZGlyZWN0b3IgcHJvdGVjdGVkIG1vZGUgYXJlIG5vdyBtdWNoIG1vcmUgZW5jYXBzdWxhdGVkLCBhbmQKCSAgIHRoZXkgZ2V0IGRpc2FibGVkIGlmIHRoZSBtb2RlIGlzIG5vdCBlbmFibGVkLiBCZWZvcmUgdGhlCgkgICBkZWFjdGl2YXRpb24gd2FzIGRvbmUgYXQgdGhlIGdlbmVyYXRpb24gc3RhZ2UgKGxhbmcuY3h4KS4KCgkgICBCeSB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlIGRpcmVjdG9yIG1vZGUgaXMgZW5hYmxlZCwgYW5kCgkgICAlcmVuYW1lIGlzIGRvbmUsIHJldXNpbmcgYSBwcm90ZWN0ZWQgbWVtYmVyIG5hbWUsIHRoZXJlIGlzCgkgICBhIHBhdGhvbG9naWNhbCBjYXNlOgoKCSAgICAgJXJlbmFtZSh4KSBGb286OnkoKTsKIAogICAgICAgICAgICAgY2xhc3MgRm9vIDogcHVibGljIEEgewoJICAgICBwdWJsaWM6CgkgICAgICAgdm9pZCB5KCk7CgoJICAgICBwcm90ZWN0ZWQ6CgkgICAgICAgaW50IHg7ICAgICAgICAgICAgLyogd29ya3MgKi8KCSAgICAgICBzdGF0aWMgIGludCB4OyAgICAvKiB3b3JrcyAqLwoJICAgICAgIHN0YXRpYyAgdm9pZCB4KCk7IC8qIHdvcmtzICovCgkgICAgICAgdHlwZWRlZiB2b2lkIHgoKTsgLyogd29ya3MgKi8KCgkgICAgICAgdmlydHVhbCB2b2lkIHgoKTsgLyogYWx3YXlzIGZhaWxzLCBhcyBpdCBzaG91bGQsIHNpbmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbzo6eCgpIHdpbGwgYmUgZW1pdHRlZCBpbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3IgKi8KCgkgICAgICAgdm9pZCB4KCk7IC8qIGFsd2F5cyBmYWlscywgYnV0IHNvbWV0aW1lcyBpdCBzaG91bGRuJ3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5jZSB0aGUgRm9vOjp4KCkgd2lsbCBub3QgYmUgZW1pdHRlZCBpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgaXMgbm90IHZpcnR1YWwgKi8KCgkgICAgIH07CgoJICAgVGhlIGxhc3QgY2FzZSBpcyBub3QgYWx3YXlzIHJpZ2h0IGJlY2F1c2UgYXQgdGhlIHBhcnNlci5weQoJICAgc3RhZ2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGRlY2lkZSBpZiB0aGUgcHJvdGVjdGVkIG1lbWJlcgoJICAgRm9vOjp4KCkgY291bGQgb3Igbm90IGNvbmZsaWN0IHdpdGggdGhlIHJlbmFtZWQgRm9vOjp5KCksCgkgICBzaW5jZSBGb286OngoKSBjb3VsZCBiZSB2aXJ0dWFsIGJ5IGluaGVyaXRhbmNlLgoKCSAgIEkgZ3Vlc3MgdGhpcyBqdXN0IGFuIGludHJpbnNpYyBsaW1pdGF0aW9uLCBhbmQgbm8gbXVjaCBjYW4KCSAgIGJlIGRvbmUgYWJvdXQgaXQgd2l0aG91dCByZXNvcnRpbmcgaW50byBsYXJnZXIgY2hhbmdlcyB0bwoJICAgcG9zdHBvbmUsIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucywgdGhlIG11bHRpcGx5IHN5bWJvbAoJICAgZGV0ZWN0aW9uIChsYW5nLmN4eCBzdGFnZSkuCgkgICAKCSAgIFNvLCBieSBub3csIGl0IGlzIGp1c3QgY29uc2lkZXJlZCBhIHdlbGwga25vd24gImZlYXR1cmUiIGluCgkgICB0aGUgZGlyZWN0b3IgcHJvdGVjdGVkIG1vZGUuIFRoZSBnb29kIG5ld3MgaXMgdGhhdCBpdCBzZWVtcwoJICAgdG8gYmUgYSByYXJlIGNhc2UsIGFuZCBpdCBjYW4gYmUgYXZvaWRlZCBieSB0aGUgdXNlciBieQoJICAgaGlkaW5nICd4JyBiZWZvcmUgcmVuYW1pbmcgJ3knOgoKCSAgICAgJXJlbmFtZShfeCkgRm9vOjp4KCk7CgkgICAgICVyZW5hbWUoeCkgRm9vOjp5KCk7CgkgICAKCjEyLzA4LzIwMDM6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykKCSAgICBUaGUgdmlydHVhbCBtZXRob2QgZGV0ZWN0aW9ucyBub3cgcHJvcGVybHkKCSAgICB0cmVhdHMgdGhlIGZvbGxvd2luZyBjYXNlczoKCiAgICAgICAgICAgICBuYW1lc3BhY2UgZm9vIHsgdHlwZWRlZiBpbnQgSW50OyB9CgkgICAgIHN0cnVjdCBBIHt9OwoJICAgICB0eXBlZGVmIEEgQjsKCiAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgdmlydHVhbCB+Rm9vKCkge30KCiAgICAgICAgICAgICAgIHZpcnR1YWwgRm9vKiBjbG9uZXIoKSA9IDA7CgkgICAgICAgdmlydHVhbCBpbnQgZ2V0X3ZhbHVlKCkgPSAwOwoJICAgICAgIHZpcnR1YWwgQSogZ2V0X2NsYXNzKCkgPSAwOwoJICAgICAgIHZpcnR1YWwgdm9pZCBqdXN0X2RvX2l0KCkgPSAwOwoJICAgICB9OwoKICAgICAgICAgICAgIHN0cnVjdCBCYXIgOiBGb28KICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgQmFyKiBjbG9uZXIoKTsKICAgICAgICAgICAgICAgZm9vOjpJbnQgZ2V0X3ZhbHVlKCk7CiAgICAgICAgICAgICAgIEIqIGdldF9jbGFzcygpOwogICAgICAgICAgICAgICB2b2lkIGp1c3RfZG9faXQoKTsKICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgQWxsIHRoZSBGb28gYW5kIEJhciBtZXRob2RzIGFyZSB2aXJ0dWFsLiAgQSBuZXcgYXR0cmlidXRlCgkgICAgInZpcnR1YWw6dHlwZSIgcmVjb3JkIHRoZSBiYXNlIHBvbHltb3JwaGljIHR5cGUuIEluIHRoZQoJICAgIHByZXZpb3VzIGNhc2VzIHdlIGhhdmU6CgoJICAgICAgIHR5cGUgOiBCYXIgICAgICAgdmlydHVhbDp0eXBlIDogRm9vCgkgICAgICAgdHlwZSA6IGZvbzo6SW50ICB2aXJ0dWFsOnR5cGUgOiBpbnQKCSAgICAgICB0eXBlIDogQiAgICAgICAgIHZpcnR1YWw6dHlwZSA6IEEKCSAgICAgICB0eXBlIDogdm9pZCAgICAgIHZpcnR1YWw6dHlwZSA6IHZvaWQKCiAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIGlzIHVzZWZ1bCBpbiBsYW5ndWFnZXMgKGphdmErZGlyZWN0b3JzKQoJICAgIHRoYXQgY291bGQgaGF2ZSBwcm9ibGVtcyByZWRlZmluaW5nIEJhciogQmFyOjpjbG9uZXIoKS4KCgkgICAgSWYgeW91IG5ldmVyIGhhZCBjb2RlIGxpa2UgdGhlIGFib3ZlLCB5b3Ugd2lsbCBzZWUgbm8KCSAgICBlZmZlY3RzLiBCdXQgaWYgeW91IGhhdmUgc29tZSBjb2RlIGxpa2UgdGhhdCwgeW91CgkgICAgd2lsbCBzZWUgc29tZSBlZmZlY3RzIHNpbmNlIHNvbWUgbWV0aG9kcyB0aGF0CgkgICAgYmVmb3JlIHdlcmUgbm90IHByb3Blcmx5IHRyZWF0ZWQgYXMgdmlydHVhbCwKCSAgICB3aWxsIHN0YXJ0IHRvIGFjdCBsaWtlIHRoYXQuIFRoaXMgY291bGQgZW5sYXJnZQoJICAgIHlvdXIgZGlyZWN0b3IgY2xhc3Nlcy4KCSAgICAKCjEyLzA4LzIwMDM6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykKCSAgICBUaGUgZGlyZWN0b3IgcHJvdGVjdGVkIG1lbWJlciBzdXBwb3J0IChkaXJwcm90KQoJICAgIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCgkgICAgCgkgICAgSXQgY2FuIGJlIGVuYWJsZSBieSB1c2luZyAnLWRpcnByb3QnIG9yIGJ5IGFkZGluZwoJICAgIHRoZSBvcHRpb24gdG8gdGhlIG1vZHVsZSBkZWNsYXJhdGlvbiwgbGlrZToKCiAgICAgICAgICAgICVtb2R1bGUoZGlyZWN0b3JzPSIxIixkaXJwcm90PSIxIikgbXlfbW9kdWxlCgoJICAgIFRoaXMgbW9kdWxlIG9wdGlvbiB3YXMgYWRkZWQgdG8gcHJvcGVybHkgY29tcGlsZSB0aGUKCSAgICBkaXJlY3Rvcl9wcm90ZWN0ZWQuaSBhbmQgZGlyZWN0b3JfbmVzdGVkLmkgZXhhbXBsZXMuCgkgICAgCgkgICAgVGhlIGZlYXR1cmUgaGFzIGJlZW4gdGVzdGVkIHdpdGggcHl0aG9uWzIuMiwyLjNdIAoJICAgIGFuZCBydWJ5WzEuNi43XSwgYm90aCBhdCBjb21waWxhdGlvbiBhbmQgcnVudGltZSwgYW5kIAoJICAgIGphdmFbajJzZGsxLjQuMV8wMV0sIGJ1dCBvbmx5IGF0IGNvbXBpbGF0aW9uIChteSBqYXZhCgkgICAgaW5zdGFsbGF0aW9uIGRvZXNuJ3QgcnVuIGFueSBvZiB0aGUgZGlyZWN0b3IgZXhhbXBsZXMsCgkgICAgb2xkcyBub3IgbmV3cykuCgoJICAgIFBsZWFzZSB0ZXN0IGZvciBvY2FtbCBhbmQgamF2YS4KCSAgICAKCSAgICBUaGUgZXJyb3JzIHJlcG9ydGVkIGJ5IFdpbGxpYW0gYW5kIFNjb3R0IHdlcmUgZml4ZWQsCgkgICAgZXhjZXB0IGZvciBhIHdhcm5pbmcgYWJvdXQgIFNXSUdfSmF2YVRocm93RXhlY3B0aW9uKCkKCSAgICBtdWx0aXBseSBkZWZpbmVkLiBJIGNhbid0IHJlcHJvZHVjZSB0aGlzIGVycm9yIHdpdGggbXkKCSAgICBleGFtcGxlcy4gV2Ugd2lsbCB3YWl0IGZvciBTY290dCB0byBzZW5kIHVzIGEgbWluaW1hbAoJICAgIGNhc2UuCgoKMTIvMDcvMjAwMzogbW1hdHVzIChNYXJjZWxvIE1hdHVzKQoJICAgIFRoZSBkaXJlY3RvciBwcm90ZWN0ZWQgbWVtYmVyIHN1cHBvcnQgaGFzIGJlZW4KCSAgICBjb21wbGV0bHkgbW92ZWQgb3V0IGZyb20gcHl0aG9uLmN4eCwgYW5kIG5vdwoJICAgIHJlc2lkZXMgaW4gdGhlIGNvbW1vbiBsYW5nLmN4eCwgZW1pdC5jeHggYW5kCgkgICAgYWxsb2NhdGUuY3h4IGZpbGVzLiAKCgkgICAgVGhpcyBtZWFucyBpdCBzaG91bGQgd29yayBmb3IgYWxsIHRoZSBvdGhlciBsYW5ndWFnZXMKCSAgICB0aGF0IGN1cnJlbnRseSBzdXBwb3J0IGRpcmVjdG9ycywgaWUsIHB5dGhvbiwgamF2YSwgb2NhbG0KCSAgICBhbmQgcnVieS4KCgkgICAgVGhlIGNoYW5nZSBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCBweXRob24gKGNvbXBpbGF0aW9uK3J1bnRpbWUpCgkgICAgYW5kIGphdmEgKGp1c3QgY29tcGlsYXRpb24pLgoJICAgIAoJICAgIFBsZWFzZSBhZGQgcnVudGltZSB0ZXN0cyBmb3IgdGhlIG1pc3NpbmcgbGFuZ3VhZ2VzIAoJICAgIGFuZCB0ZXN0IGl0LgoKCSAgICBUaGUgJy1ub2RpcnByb3QnIG9wdGlvbiB3YXMgbW92ZWQgdG8gdGhlIHByaW5jaXBhbCBtYWluLAoJICAgIGFuZCBjYW4gYmUgdXNlZCBmcm9tIGFsbCB0aGUgbGFuZ3VhZ2VzLgoKMTIvMDcvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXhlZCBhbmQgaW1wcm92ZWQgZXJyb3IgY2hlY2tpbmcgb2YgU1RSSU5HX09VVCB0eXBlbWFwcyBpbiAKICAgICAgICAgICAgdmFyaW91cy5pLgoKMTIvMDQvMjAwMzogbW1hdHVzIChNYXJjZWxvIE1hdHVzKQoKCSAgICAtIE5vdyB0aGUgdmlydHVhbCBtZW1iZXJzIHdpdGggbm8gZXhwbGljaXQgZGVjbGFyYXRvcgoJICAgIGFyZSBwcm9wZXJseSBpZGVudGlmaWVkOgoJICAgIAogICAgICAgICAgICAgICAgc3RydWN0IEEgIHsKICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBmKCkgPSAwOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgQiA6IEEgewogICAgICAgICAgICAgICAgICBpbnQgZigpOwogICAgICAgICAgICAgICAgfTsKCgkgICAgSGVyZSwgQjo6ZigpIGlzIHZpcnR1YWwsIGFuZCB0aGUgZGlyZWN0b3IgYW5kIHRoZQoJICAgIHZpcnR1YWwgZWxpbWluYXRpb24gbWVjaGFuaXNtIG5vdyByZWNvZ25pemUgdGhhdC4KCiAgICAgICAgICAgIC0gW0MjXSBUaGlzIGZpeCBhbHNvIGZpeGVzIHRoZSBwcm9ibGVtIHdoZXJlICdvdmVycmlkZScgd2FzIG5vdCBiZWluZyAKICAgICAgICAgICAgdXNlZCBvbiBhbnkgb3ZlcnJpZGRlbiB2aXJ0dWFsIG1ldGhvZCwgc28gZm9yIHN0cnVjdCBCIGFib3ZlLCAKICAgICAgICAgICAgdGhpcyBDIyBjb2RlIGlzIGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgICBwdWJsaWMgY2xhc3MgQiA6IEEgewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBmKCkgewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQoKCSAgICAtIEluaXRpYWwgc3VwcG9ydCBmb3IgcHJvdGVjdGVkIHZpcnR1YWwgbWV0aG9kcy4gVGhleSBhcmUgbm93CgkgICAgcHJvcGVybHkgZW1pdHRlZCB3aGVuIHVzaW5nIHdpdGggZGlyZWN0b3IgKHB5dGhvbiBvbmx5IGJ5CgkgICAgbm93KS4KCSAgICAKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJkaXJlY3RvciIpIEE7ICAgIAogICAgICAgICAgICAgICAgc3RydWN0IEEgIHsKICAgICAgICAgICAgICAgIHByb3RlY3RlZDoKICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBmMSgpID0gMDsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgJWZlYXR1cmUoImRpcmVjdG9yIikgQjsKICAgICAgICAgICAgICAgIHN0cnVjdCBCIDogQXsKICAgICAgICAgICAgICAgIHByb3RlY3RlZDoKICAgICAgICAgICAgICAgICAgaW50IGYxKCk7CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgZjIoKTsKICAgICAgICAgICAgICAgIH07CgoJICAgIFRoaXMgY2FuIGJlIGRpc3NhYmxlZCBieSB1c2luZyB0aGUgJy1ub2RpcnByb3QnIG9wdGlvbi4KCgkgICAgLSBUaGUgZmVhdHVyZSAnbm9kaXJlY3RvcicgaXMgd29ya2luZyBub3cgYXQgdGhlIHRvcCBsZXZlbCwKCSAgICBzbywgaXQgbXVzdCB3b3JrIGZvciBhbGwgdGhlIGxhbmd1YWdlczoKCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgiZGlyZWN0b3IiKSBBOwogICAgICAgICAgICAgICAgJWZlYXR1cmUoIm5vZGlyZWN0b3IiKSBBOjpmMjsKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgQSB7CiAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgZjEoKTsKICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBmMigpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIAoJICAgIGluIHRoaXMgY2FzZSwgb25seSAnZjEnIGlzIGV4cG9ydGVkIHRvIHRoZSBkaXJlY3RvciBjbGFzcy4KCSAgICAKCSAgICAtIEFkZGVkIGRpcmVjdG9yIHN1cHBvcnQgZm9yIGNvbnN0IFRZUEUmIGFyZ3VtZW50cyAocHl0aG9uKS4KCjEyLzAyLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4IGZvciBJTk9VVCBhbmQgT1VUUFVUIHR5cGVtYXBzIGluIHR5cGVtYXBzLmkgZm9yIHdoZW4gdGhlIEpOSSB0eXBlIAogICAgICAgICAgICBpcyBiaWdnZXIgdGhhbiB0aGUgQyB0eXBlLiBGb3IgZXhhbXBsZSwgdW5zaWduZWQgbG9uZyAoMzJiaXRzIG9uIG1vc3Qgc3lzdGVtcykKICAgICAgICAgICAgaXMgbWFwcGVkIHRvIGpsb25nICg2NGJpdHMpLiBSZXR1cm5lZCB2YWx1ZSB3YXMgaW5jb3JyZWN0LiBCdWcgcmVwb3J0ZWQgYnkgCiAgICAgICAgICAgIEJyaWFuIEhhd2xleS4KCjEyLzAyLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyMgYW5kIEphdmFdIEJldHRlciBmaXggZm9yIGVudHJ5IGRhdGVkIDA1LzExLzIwMDMuIEZpeGVzIHRoZSBmb2xsb3dpbmcKICAgICAgICAgICAgdHlwZW1hcHM6CgogICAgICAgICAgICBKYXZhOiBqYXZhYmFzZSwgamF2YWludGVyZmFjZXMsIGphdmFpbXBvcnRzLCBqYXZhY2xhc3Ntb2RpZmllcnMsCiAgICAgICAgICAgIGphdmFwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycywgamF2YWZpbmFsaXplLCBqYXZhZ2V0Y3B0ciAmIGphdmFjb2RlLgogICAgICAgICAgICBDIzogY3NiYXNlLCBjc2ludGVyZmFjZXMsIGNzaW1wb3J0cywgY3NjbGFzc21vZGlmaWVycywKICAgICAgICAgICAgY3NwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycywgY3NmaW5hbGl6ZSwgY3NnZXRjcHRyICYgY3Njb2RlLgoKICAgICAgICAgICAgSXQgYWxzbyBmaXhlcyBidWcgaW4gdXNpbmcgYXJyYXlzIG9mIEMgc3RydWN0cyB3aXRoIGFycmF5c19qYXZhLmkgCiAgICAgICAgICAgIGFzIHJlcG9ydGVkIFNjb3R0IE1pY2hlbC4KCjEyLzAyLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgW1BlcmxdIEZpeGVkIFsgODUyMTE5IF0gcmVjdXJzaXZlIGluaGVyaXRhbmNlIGluIG91dHB1dCAucG0sIHBlcmw1LgogICAgICAgICAgICBSZXBvcnRlZCBieSBXaWxsaWFtIERvd2xpbmcuCgoxMi8wMi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtUY2xdIEZpeGVkIFsgNzU1MzgyIF0gY2FsbGluZyBmdW5jKGNvbnN0IHZlY3RvcjxUPiYgcCkgZXZhbHVhdGVzIHBbMF0gaW4gaW50ZXJwLgogICAgICAgICAgICBUaGUgVGNsIHR5cGUgY2hlY2tlciB3YXMgaW1wcm9wZXJseSBoYW5kbGluZyB0aGUgaW50ZXJwcmV0ZXIgcmVzdWx0IHdoZW4KICAgICAgICAgICAgdHlwZSB2aW9sYXRpb25zIHdlcmUgc3VwcG9zZWQgdG8gYmUgaWdub3JlZC4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgRmxhdml1IFBvcHAtTm93YWsuCgoxMS8zMC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4ZWQgWyA1NDUwNTggXSBjb25maWd1cmUncyAtLXdpdGgtdGNsaW5jbCBoYXMgbm8gZWZmZWN0CgoxMS8zMC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeGVkIFsgNzY2NDA5IF0gbWlzc2luZyBzeW1ib2wgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24gZHVyaW5nIG1vZHVsZSBsb2FkCiAgICAgICAgICAgIFNXSUcncyBpbnRlcm5hbCBmdW5jdGlvbnMgYXJlIGFsbCBzdGF0aWMgYXMgdGhlcmUgaXMgbm8gbmVlZCBmb3IgZGlmZmVyZW50IFNXSUcKICAgICAgICAgICAgZ2VuZXJhdGVkIG1vZHVsZXMgdG8gc2hhcmUgYW55IGNvZGUgYXQgcnVudGltZS4KCjExLzMwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgW1RjbF0gQWRkZWQgc3VwcG9ydCBmb3IgQysrIHBvaW50ZXJzIHRvIG1lbWJlcnMuCgoxMS8yOC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4ZWQgWyA4NDgzMzUgXSBEaXJlY3RvcnM6ICNpbmNsdWRlIHdyYXBwZXIgLmggZmlsZSAtIHdhcyBpbmNvcnJlY3RseQogICAgICAgICAgICBhZGRpbmcgYSBkaXJlY3RvcnkgdG8gdGhlIGdlbmVyYXRlZCAjaW5jbHVkZSAiZm9vX3dyYXAuaCIgc3RhdGVtZW50CiAgICAgICAgICAgIGluIHNvbWUgc2l0dWF0aW9ucy4KCjExLzI4LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4ZWQgWyA4NDkwNjQgXSBKQVZBIDogQWNjZXNzIG1vZGlmaWVyIGZvciBkZXJpdmVkIGNsYXNzIHdyb25nLgogICAgICAgICAgICBUaGUgZGVsZXRlKCkgbWV0aG9kIGlzIGFsd2F5cyBwdWJsaWMgbm93LiBJdCB1c2VkIHRvIGJlIHByb3RlY3RlZCB3aGVuZXZlciBhIAogICAgICAgICAgICBkZXN0cnVjdG9yIHdhcyBub24gcHVibGljLiBBbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBydW50aW1lIAogICAgICAgICAgICBleGNlcHRpb24gaXMgdGhyb3duIGluc3RlYWQgb2YgbWFraW5nIGRlbGV0ZSgpIHByb3RlY3RlZCBub3cuCgoxMS8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtQZXJsNV0gQWRkZWQgc3VwcG9ydCBmb3IgQysrIHBvaW50ZXJzIHRvIG1lbWJlcnMuCgoxMS8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgODUwMTUxIF0gUFlWRVJTSU9OIHdpdGggcHl0aG9uMi4zIGluIGNvbmZpZ3VyZSBvZiBTV0lHIDEuMy4xOSAoTWF5YmUpLgoKMTEvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCAgWyA4NTA2NjYgXSAjaW5jbHVkZSBleHRyYSBsaW5lIGFkZGVkLiAgCiAgICAgICAgICAgIFRoaXMgc2hvdWxkIGZpeCBzb21lIHByb2JsZW1zIHdpdGggZ2V0dGluZyBjb3JyZWN0IGxpbmUgbnVtYmVycyBvbgogICAgICAgICAgICBlcnJvciBtZXNzYWdlcy4KCjExLzI2LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYW5vdGhlciBvbmUgb2YgTWFyY2VsbydzIGV2aWwgdGVtcGxhdGUgYnVncyAoaW5maW5pdGUKICAgICAgICAgICAgcmVjdXJzaW9uKS4gWyA4NDk1MDQgXSB0ZW1wbGF0ZSBhbmQgdHlwZWRlZiAtPiBpbmYuIHJlY3Vyc2lvbi4KCjExLzI2LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcGFyc2luZyBwcm9ibGVtIHdpdGggZGVjbGFyYXRpb25zIGxpa2UgdGhpczoKCgkgICAgICAgICBpbnQgKnggPSAmc29tZWFycmF5WzBdOwoKMTEvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc1NjU1MiBdIG1pc3NpbmcgZGVmYXVsdCBhcmd1bWVudCBjbGFzcyBzY29wZSB3aXRoICJ8Ii4KICAgICAgICAgICAgVGhpcyBpcyByZWFsbHkgb25seSBhIGJhbmQtYWlkIGZpeCBmb3IgdXNlIG9mIGNsYXNzLWVudW1zIGluCiAgICAgICAgICAgIGV4cHJlc3Npb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICBjbGFzcyBBIHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBlbnVtIEZsYWcgeyBmbGFnMSA9IDB4MSwgZmxhZzIgPSAweDIgfTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHggPSBmbGFnMSB8IGZsYWcyKTsKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIE5vdGU6IHRoZXJlIGFyZSBzdGlsbCBzb21lIChtb3JlIHN1YnRsZSkgY2FzZXMgdGhhdCBhcmUgYnJva2VuLAogICAgICAgICAgICBidXQgaGFyZCB0byBmaXggZHVlIHRvIGFuIGlzc3VlIHdpdGggdGVtcGxhdGUgZXhwYW5zaW9uLiBXaWxsCiAgICAgICAgICAgIGFkZHJlc3MgbGF0ZXIuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IERtaXRyeSBNaXJvbm92LgoKMTEvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBJbmNvcnBvcmF0ZWQgWyA4NDA4NzggXSBzdXBwb3J0IGZvciAlaW5saW5lIHsgLi4uIH0gKFBBVENIKS4KICAgICAgICAgICAgVGhpcyBhZGRzIHN1cHBvcnQgZm9yIHRoZSBmb2xsb3dpbmc6CgogICAgICAgICAgICAgICAgICAlaW5saW5lIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiBzb21lIGNvZGUgLi4uCiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBhbmQgJWlubGluZSAleyAuLi4gJX0gaXMgdGhhdCB0aGUKICAgICAgICAgICAgZW5jbG9zZWQgdGV4dCBpcyBwcm9jZXNzZWQgYnkgdGhlIFNXSUcgcHJlcHJvY2Vzc29yLiAgIFRoaXMKICAgICAgICAgICAgYWxsb3dzIHNwZWNpYWwgbWFjcm9zIGFuZCBvdGhlciBwcm9jZXNzaW5nIHRvIGJlIHVzZWQgaW4gCiAgICAgICAgICAgIGNvbmp1bmN0aW9uIHdpdGggJWlubGluZS4KICAgICAgICAgICAgQ29udHJpYnV0ZWQgYnkgU2FsdmFkb3IgRmFuZGlubyBHYXJjaWEuCgoxMS8yNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgODM2OTAzIF0gQysrIGluY29uc2lzdGVuY3kgKHdpdGggdm9pZCBhcmd1bWVudHMpLgogICAgICAgICAgICBTV0lHIHdhcyBoYXZpbmcgZGlmZmljdWx0eSB3aXRoIGYoKSB2cyBmKHZvaWQpIGluIEMrKyBwcm9ncmFtcy4KICAgICAgICAgICAgRm9yIGluc3RhbmNlOgoKICAgICAgICAgICAgICAgICAgY2xhc3MgQSB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBmKHZvaWQpID0gMDsKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgIGNsYXNzIEIgewogICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZigpOyAgICAvLyBOb3QgbWF0Y2hlZCB0byBmKHZvaWQpIGNvcnJlY3RseQogICAgICAgICAgICAgICAgICB9OyAKCiAgICAgICAgICAgIFRoZSBwYXJzZXIgbm93IG5vcm1hbGl6ZXMgYWxsIGRlY2xhcmF0aW9ucyBvZiB0aGUgZm9ybSBmKHZvaWQpIAogICAgICAgICAgICBpbiBDKysgY2xhc3NlcyB0byBmKCkuICBUaGlzIHNob3VsZCBmaXggYSB2YXJpZXR5IG9mIHN1YnRsZSAKICAgICAgICAgICAgcHJvYmxlbXMgd2l0aCBpbmhlcml0YW5jZSwgb3B0aW1pemF0aW9ucywgb3ZlcmxvYWRpbmcsIGV0Yy4KICAgICAgICAgICAgUHJvYmxlbSByZXBvcnRlZCBieSBQYXJ0aG8gQmhvd21pY2suCiAKMTEvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBbUGVybDVdIEluY29ycG9yYXRlZCBbIDg0MTA3NCBdIGJldHRlciBjcm9ha2luZyAoUEFUQ0gpLiAgVGhpcyBmaXhlcyBzb21lIHByb2JsZW1zCiAgICAgICAgICAgIHdpdGggc3RyaW5ncyBhbmQgcHJvdmlkZXMgc29tZSBuZXcgZXJyb3IgZnVuY3Rpb25zLiAKICAgICAgICAgICAgQ29udHJpYnV0ZWQgYnkgU2FsdmFkb3IgRmFuZGlubyBHYXJjaWEuCiAgICAgICAgICAgIAoxMS8yNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzkxODM1IF0gRGVmYXVsdCBhcmd1bWVudCB3aXRoIGNhc3Q6IHR4dCA9IChjaGFyICopInR4dCIgc3ludGF4IEVycm9yLgogICAgICAgICAgICBUaGUgcGFyc2VyIHNob3VsZCBub3cgYWNjZXB0IHRoaW5ncyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgIHZvaWQgZm9vKGNoYXIgKnMgPSAoY2hhciAqKSAiSGVsbG8iKTsKCiAgICAgICAgICAgIFByb2JsZW0gcmVwb3J0ZWQgYnkgQ2xhdWRpdXMgU2Nobm9yci4KCjExLzI0LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgW1RjbF0gRml4ZWQgcHJvYmxlbSB3aXRoIGNyb3NzIG1vZHVsZSBsaW5raW5nLiAgUHJldmlvdXNseSBtb2R1bGVzIHJlZmVycmVkCiAgICAgICAgICAgIHRvIGJhc2UgY2xhc3NlcyB0aHJvdWdoIGEgZ2xvYmFsIHZhcmlhYmxlLiAgIE5vdywgdGhlIG1vZHVsZSBsb29rcyB1cCBiYXNlCiAgICAgICAgICAgIGNsYXNzZXMgdGhyb3VnaCB0aGUgdHlwZSBzeXN0ZW0gaXRzZWxmLS0tYXZvaWRpbmcgdGhlIG5lZWQgdG8gbGluayB0byBhIGdsb2JhbAogICAgICAgICAgICBsaWtlIGJlZm9yZS4gIENhdmVhdDogIG1vZHVsZXMgd2l0aCBiYXNlIGNsYXNzZXMgbXVzdCBiZSBsb2FkZWQgYmVmb3JlCiAgICAgICAgICAgIG1vZHVsZXMgd2l0aCBkZXJpdmVkIGNsYXNzZXMuCiAKMTEvMjQvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gSW4gLXNjbSBtb2RlLCB1c2UgKCkgdG8gcmVwcmVzZW50IG51bGwgcG9pbnRlcnMsCgkgICAgYXMgaXQgaXMgZG9uZSBpbiAtZ2ggbW9kZS4KCjExLzIzLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBBZGQgYSBnZW5lcmF0ZWQgc2NyaXB0ICJwcmVpbnN0LXN3aWciLCB3aGljaCBjYW4gYmUgdXNlZAoJICAgIHRvIGludm9rZSBTV0lHIGJlZm9yZSBpdCBoYXMgYmVlbiBpbnN0YWxsZWQuICBJdCBhcnJhbmdlcwoJICAgIHRoYXQgdGhlIHJ1bnRpbWUgbGlicmFyaWVzIGZyb20gdGhlIHNvdXJjZSBkaXJlY3RvcnkgYXJlCgkgICAgdXNlZC4gCgoxMS8yMy8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBJbiAtZ2ggbW9kZSwgZG9uJ3QgZm9yZ2V0IHRvIGNhbGwgU1dJR19HdWlsZV9Jbml0LgoJICAgIEFkZCBhIFNXSUdfY29udHJhY3RfYXNzZXJ0IG1hY3JvLgoKMTEvMjMvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtNelNjaGVtZV0gVXBkYXRlIHRoZSBjb25maWd1cmUgY2hlY2sgZm9yIHRoZSBkeW5leHQgb2JqZWN0IHRvIHdvcmsKCSAgICB3aXRoIE16U2NoZW1lIDIwNS4KCjExLzIwLzIwMDM6IG1tYXR1cwoJICAgIEZpeGVkIHRoZSBpbmNsdWRlL2ltcG9ydCBlcnJvciByZXBvcnRlZCBieSBLZXJpbSBCb3JjaGFldiwKCSAgICB3aGVyZSB0d28gZmlsZXMgd2l0aCBuYW1lcyBsaWtlCgoJICAgICdkaXIxL2hlbGxvLmknCgkgICAgJ2RpcjIvaGVsbG8uaScKCSAgICAKCSAgICBjYW4gbm90IGJlIGluY2x1ZGUgYXQgdGhlIHNhbWUgdGltZS4gU3dpZyB3YXMgaW5jbHVkaW5nCgkgICAganVzdCB0aGUgZmlyc3Qgb25lLCBhc3N1bWluZyB0aGUgc2Vjb25kIG9uZSB3YXMgbm90IGEKCSAgICBkaWZmZXJlbnQgb25lLCBzaW5jZSBpdCB3YXMgY2hlY2tpbmcva2VlcGluZyBqdXN0IHRoZQoJICAgIGJhc2VuYW1lICdoZWxsby5pJy4KCjExLzE5LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgQ2hhbmdlcyB0byB0aGUgU1dJRyBydW50aW1lIGxpYnJhcnkgc3VwcG9ydC4gCiAgICAgICAgICAgICAgLSAgVGhlIC1jIGNvbW1hbmQgbGluZSBvcHRpb24gaGFzIGJlZW4gcmVuYW1lZCB0byAtbm9ydW50aW1lCiAgICAgICAgICAgICAgLSAgTmV3IGNvbW1hbmQgbGluZSBvcHRpb246IC1ydW50aW1lLiAgV2hlbiBzdXBwbGllZCwgdGhpcwogICAgICAgICAgICAgICAgIGluc2VydHMgdGhlIHN5bWJvbCBTV0lHX0dMT0JBTCBpbnRvIHRoZSB3cmFwcGVyIGNvZGUuICBUaGlzLAogICAgICAgICAgICAgICAgIGluIHR1cm4sIG1ha2VzIGFsbCBvZiB0aGUgcnVudGltZSBzdXBwb3J0IGZ1bmN0aW9ucyBnbG9iYWxseQogICAgICAgICAgICAgICAgIHZpc2libGUuCiAgICAgICAgICAgICAgIC0gTmV3IGxpYnJhcnkgZmlsZTogc3dpZ3J1bi5pLiAgIFVzZWQgdG8gY3JlYXRlIG1vZHVsZXMKICAgICAgICAgICAgICAgICBmb3IgcnVudGltZSBsaWJyYXJ5IChpZiBuZWVkZWQpLgogICAgCjExLzE4LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICAnbWFrZSBzcmNycG0nIHJwbWJ1aWxkIGZpeCAtIHBhdGNoIGZyb20gSm9lIENvb3BlcgoKMTEvMTgvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gQ2hhbmdlIG1lYW5pbmcgb2YgY29uZmlndXJlIG9wdGlvbiAtLXdpdGgtZ3VpbGUgdG8KCSAgICB0aGUgbmFtZSBvZiB0aGUgR3VpbGUgZXhlY3V0YWJsZS4gIFRoZSBuZXcgb3B0aW9uIC0td2l0aC1ndWlsZS1wcmVmaXggCgkgICAgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgdHJlZSB3aGVyZSBHdWlsZSBpcwoJICAgIGluc3RhbGxlZC4gIChIb3dldmVyLCB1c3VhbGx5IGl0IHN1ZmZpY2VzIHRvIHVzZSB0aGUKCSAgICBzaW5nbGUgb3B0aW9uIC0td2l0aC1ndWlsZS1jb25maWcuKSAgCgkgICAgV2hlbiBydW5uaW5nIHRoZSBydW4gdGVzdHMgdGVzdC1zdWl0ZSwgbWFrZSBzdXJlIHRvIHVzZSB0aGUKCSAgICB2ZXJzaW9uIG9mIEd1aWxlIHRoYXQgU1dJRyB3YXMgY29uZmlndXJlZCBmb3IuCgoxMS8xNy8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBJbXByb3ZlbWVudHMgdG8gb2JqZWN0LW93bmVyc2hpcCBtYW5hZ2VtZW50IGluIAoJICAgICItc2NtIiBtb2RlLiAgKFRoZXkgZG8gbm90IGFwcGx5IHRvIHRoZSBkZWZhdWx0ICItZ2giIG1vZGUuKQoJICAgICogUmVuYW1lZCB0aGUgc21vYiB0eXBlIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIG9iamVjdCBjYW4KCSAgICAgIGJlIGdhcmJhZ2UgY29sbGVjdGVkIGZyb20gImNvbGxlY3RlZCBzd2lnIiB0byAiY29sbGVjdGFibGUKCSAgICAgIHN3aWciLCB3aGljaCBpcyBtb3JlIHByZWNpc2UuICAKCSAgICAqIEV4cG9ydCB0aGUgZGVzdHJ1Y3RvciBmdW5jdGlvbnMgYWdhaW4uICBJdCBpcyBub3cKIAkgICAgICBhbGxvd2VkIHRvIGV4cGxpY2l0bHkgY2FsbCBkZXN0cnVjdG9ycywgZXZlbiBmb3IKCSAgICAgIGdhcmJhZ2UtY29sbGVjdGVkIHBvaW50ZXIgb2JqZWN0cy4gIEEgcG9pbnRlciBvYmplY3QKCSAgICAgIHRoYXQgaGFzIGJlZW4gcGFzc2VkIHRvIGEgZGVzdHJ1Y3RvciBpcyBtYXJrZWQgaW4gYQoJICAgICAgc3BlY2lhbCB3YXkgdXNpbmcgYSBuZXcgc21vYiB0eXBlLCAiZGVzdHJveWVkIHN3aWciLgoJICAgICAgKFRoaXMgaGVscHMgYXZvaWQgbmFzdHkgbWVtb3J5IGJ1Z3MsIHdoZXJlIHJlZmVyZW5jZXMgdG8KCSAgICAgIGRlYWQgQyBvYmplY3RzIGFyZSBzdGlsbCBoZWxkIGluIFNjaGVtZS4gTW9yZW92ZXIsIHRoZQoJICAgICAgZ2FyYmFnZSBjb2xsZWN0b3Igd2lsbCBub3QgdHJ5IHRvIGZyZWUgYSBkZXN0cm95ZWQKCSAgICAgIG9iamVjdCBvbmNlIG1vcmUuKQoJICAgICogRGVzdHJ1Y3Rvci1saWtlIGZ1bmN0aW9ucyBjYW4gYWxzbyBtYXJrIHRoZWlyIGFyZ3VtZW50cyAKCSAgICAgIGFzIGRlc3Ryb3llZCBieSBhcHBseWluZyB0aGUgdHlwZW1hcCBTV0lHVFlQRSAqREVTVFJPWUVELgoJICAgICAgKEl0IGNhbGxzIHRoZSBmdW5jdGlvbiBTV0lHX0d1aWxlX01hcmtQb2ludGVyRGVzdHJveWVkLikKCSAgICAqIEZ1bmN0aW9ucyB0aGF0ICJjb25zdW1lIiB0aGVpciBvYmplY3RzIChvciB0aGF0ICJvd24iCgkgICAgICB0aGVtIGFmdGVyIHRoZSBjYWxsKSBjYW4gbWFyayB0aGVpciBhcmd1bWVudHMgYXMKCSAgICAgIG5vdCBnYXJiYWdlIGNvbGxlY3RhYmxlLiAgVGhpcyBjYW4gYmUgZG9uZSBieSBhcHBseWluZwoJICAgICAgdGhlIHR5cGVtYXAgU1dJR1RZUEUgKkNPTlNVTUVELiAgKEl0IGNhbGxzIHRoZSBmdW5jdGlvbgoJICAgICAgU1dJR19HdWlsZV9NYXJrUG9pbnRlck5vbmNvbGxlY3RhYmxlLikKCSAgICAqIFRoZSBtYWNybyBUWVBFTUFQX1BPSU5URVJfSU5QVVRfT1VUUFVUIGZyb20gbGlicmFyeQoJICAgICAgcG9pbnRlci1pbi1vdXQuaSBjcmVhdGVzIGFkZGl0aW9uYWwgdHlwZW1hcHMgCgkgICAgICBQVFJUWVBFICpJTlBVVF9DT05TVU1FRCwgUFRSVFlQRSAqSU5QVVRfREVTVFJPWUVELgoJICAgICAgVGhleSBtYXJrIHRoZSBwYXNzZWQgcG9pbnRlciBvYmplY3QgbGlrZXdpc2UuCgkgICAgICBUaGUgdHlwZW1hcCBQVFJUWVBFICpPVVRQVVQgY3JlYXRlcyBhIGdhcmJhZ2UtY29sbGVjdGFibGUKCSAgICAgIHBvaW50ZXIgb2JqZWN0LCBsaWtlICVuZXdvYmplY3QgZG9lcyBmb3IgYSByZXR1cm5lZCAKCSAgICAgIHBvaW50ZXIuICBVc2UgdGhlIG5ldyB0eXBlbWFwIFBUUlRZUEUgKk9VVFBVVF9OT05DT0xMRUNUQUJMRQoJICAgICAgdG8gY3JlYXRlIGEgcG9pbnRlciBvYmplY3QgdGhhdCB3aWxsIG5vdCBiZSBnYXJiYWdlIGNvbGxlY3RlZC4KCjExLzE3LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEhhbmRsZSAkaW5wdXQgaW4gImZyZWVhcmciIHR5cGVtYXBzLgoJICAgIE5ldmVyIHF1YWxpZnkgR09PUFMgc2xvdCBuYW1lcyB3aXRoIHRoZSBjbGFzcyBuYW1lLiAKCSAgICBIYW5kbGUgb3B0aW9uYWwgYXJndW1lbnRzIHByb3Blcmx5IGluIHRoZSBHT09QUyBtZXRob2RzLgoKMTEvMTYvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeGVzIGZvciBpbnN0YWxsYXRpb24gdG8gd29yayB3aXRoIHRoZSB1cGNvbWluZyBBdXRvbWFrZS0xLjguCiAgICAgICAgICAgIG1raW5zdGFsbGRpcnMgd2FzIGJlaW5nIHVzZWQgYnkgYSBub24tQXV0b21ha2UgbWFrZWZpbGUuIAogICAgICAgICAgICBta2luc3RhbGxkaXJzIGlzIGJlaW5nIHBoYXNlZCBvdXQgYW5kIHNvIHdhcyBub3QgYmVpbmcKICAgICAgICAgICAgY3JlYXRlZCBieSBBdXRvbWFrZS4gaW5zdGFsbC1zaCB1c2VkIGluc3RlYWQuCgoxMS8xNi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIE51bWVyb3VzIGRpcmVjdG9yIGltcHJvdmVtZW50cywgdHdlYWtzIGFuZCBidWcgZml4ZXMgc2luY2UgCiAgICAgICAgICAgIHRoZSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGhhdmUgYmVlbiBjb250cmlidXRlZCBieSBTY290dCBNaWNoZWwuCgoxMS8xMi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtQeXRob25dIFdoZW4gJWZlYXR1cmUoInNoYWRvdyIpIGlzIHVzZWQgdG8gYWRkIGNvZGUgdG8gc2hhZG93CiAgICAgICAgICAgIGNsYXNzZXMsIHRoZSBzcGVjaWFsIHZhcmlhYmxlICRhY3Rpb24gZXhwYW5kcyB0byB0aGUgbmFtZSBvZiB0aGUKICAgICAgICAgICAgdW5kZXJseWluZyB3cmFwcGVyIGZ1bmN0aW9uIHRoYXQgd291bGQgaGF2ZSBiZWVuIGNhbGxlZCBub3JtYWxseS4KCjExLzEyLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgW1B5dGhvbl0gV2hlbiBnZW5lcmF0aW5nIHByb3h5IGNsYXNzIGNvZGUsIFNXSUcgZW1pdHMgYSBmZXcKICAgICAgICAgICAgZGVmYXVsdCBtZXRob2RzIGZvciBfX3JlcHJfXygpIGFuZCBvdGhlciBQeXRob24gc3BlY2lhbAogICAgICAgICAgICBtZXRob2RzLiAgU29tZSBvZiB0aGVzZSBtZXRob2RzIGFyZSBlbWl0dGVkIGFmdGVyIGFsbCBvZiB0aGUKICAgICAgICAgICAgY29udGVudHMgb2YgYSBjbGFzcy4gSG93ZXZlciwgdGhpcyBtYWtlcyBpdCBoYXJkIHRvIG92ZXJyaWRlCiAgICAgICAgICAgIHRoZSBtZXRob2RzIHVzaW5nICVweXRob25jb2RlIGFuZCBzb21lIG90aGVyIGRpcmVjdGl2ZXMgdGhhdAogICAgICAgICAgICBhbGxvdyBjb2RlIHRvIGJlIGluc2VydGVkIGludG8gYSBjbGFzcy4gIFRoZXNlIHNwZWNpYWwgbWV0aG9kcwogICAgICAgICAgICBhcmUgbm93IGVtaXR0ZWQgaW50byB0aGUgY29kZSAqYmVmb3JlKiBhbGwgb2YgdGhlIG90aGVyIG1ldGhvZHMuCiAgICAgICAgICAgIFN1Z2dlc3RlZCBieSBFcmljIEpvbmVzLgogCjExLzExLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgUHJlcHJvY2Vzc29yIGVuaGFuY2VtZW50LiAgIEZvciBpbmNsdWRlIHN0YXRlbWVudHMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgJWluY2x1ZGUgImZvby9iYXIuaSIKCiAgICAgICAgICAgIHRoZSBkaXJlY3RvcnkgImZvbyIgaXMgbm93IGFkZGVkIHRvIHRoZSBzZWFyY2ggcGF0aCB3aGlsZSAKICAgICAgICAgICAgcHJvY2Vzc2luZyB0aGUgY29udGVudHMgb2YgYmFyLmkuICBUaHVzLCBpZiBiYXIuaSBpbmNsdWRlcyBvdGhlcgogICAgICAgICAgICBmaWxlcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnksIHRoZXkgd2lsbCBiZSBmb3VuZC4gUHJldmlvdXNseSwKICAgICAgICAgICAgeW91IHdvdWxkIGhhdmUgdG8gYWRkIGFkZGl0aW9uYWwgZGlyZWN0b3JpZXMgdXNpbmcgLUkgdG8gbWFrZSB0aGlzCiAgICAgICAgICAgIHdvcmsgY29ycmVjdGx5LiAgTm90ZTogdGhlIEMgcHJlcHJvY2Vzc29yIHNlZW1zIHRvIGJlaGF2ZSBpbgogICAgICAgICAgICBhbiBpZGVudGljYWwgbWFubmVyIG9uIG1hbnkgKG1vc3Q/IGFsbD8pIHN5c3RlbXMuCiAgICAgICAgICAgIFN1Z2dlc3RlZCBieSBLZXJpbSBCb3JjaGFldi4KCjExLzExLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBjaGFuZ2VzIHRvIG1ha2UgU1dJRyB3b3JrIG9uIE1hYyBPU1ggMTAuMy54IChQYW50aGVyKS4KICAgICAgICAgICAgVGVzdGVkIHdpdGggUHl0aG9uLCBUY2wsIFBlcmwsIGFuZCBSdWJ5LS0tYWxsIG9mIHdoaWNoIHNlZW0gdG8gd29yay4KCjExLzA4LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4ZWQgdGhlIHR5cGVtYXBzIGluIHZhcmlvdXMuaSB3aGljaCB3ZXJlIG1vc3RseSBicm9rZW4uCiAgICAgICAgICAgIGNoYXIgKipTVFJJTkdfSU4gYW5kIGNoYXIgKipTVFJJTkdfUkVUIHR5cGVtYXBzIHJlcGxhY2VkIHdpdGggCiAgICAgICAgICAgIFNUUklOR19BUlJBWS4gZmxvYXQgKkZMT0FUX0FSUkFZX1JFVFVSTiB0eXBlbWFwIHJlbW92ZWQuCgoxMS8wOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtUY2xdIFRjbCBtb2R1bGUgbm93IGVtaXRzIGEgc2FmZSBtb2R1bGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gYnkKICAgICAgICAgICAgZGVmYXVsdC4gIEl0IGNhbiBiZSByZW1vdmVkIGJ5IHJ1bm5pbmcgJ3N3aWcgLW5vc2FmZScuCgoxMS8wNC8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBPbmx5IHVzZSB0aGUgU0NNXyBBUEkgd2hlbiB0aGUgZnVuY3Rpb24KCSAgICBgc2NtX3Nsb3RfZXhpc3RzX3AnIGV4aXN0cyAobmVlZGVkIGZvciBHT09QUyBzdXBwb3J0KS4gIAoJICAgIFRoaXMgZnVuY3Rpb24gd2FzIHJlbmFtZWQgZHVyaW5nIHRoZSBHdWlsZSAxLjUgc2VyaWVzCgkgICAgZnJvbSBgc2NtX3Nsb3RzX2V4aXN0c19wJy4KCSAgICBSZXBvcnQgdGhlIHJpZ2h0IHJ1bnRpbWUgbGlicmFyeSB3aGVuIGludm9rZWQgd2l0aAoJICAgIC1zY20gLWxkZmxhZ3MuCgoxMS8wMy8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0NoaWNrZW5dIEZpeCAjNzgyMDUyLiAgVGhlIC0td2l0aC1jaGlja2VuY2ZnIGNvbmZpZ3VyZQoJICAgIG9wdGlvbiAoYW5kIG90aGVycykgd2VyZSBub3QgYWNjZXB0ZWQuCgoxMS8wMi8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBNZXJnZSBuZXcgc2V0IG9mIEdPT1BTIGNoYW5nZXMgYnkgSm9obiBMZW56LgoJICAgIEdPT1BTIG9iamVjdHMgYXJlIG5vdyBtYW5pcHVsYXRlZCBkaXJlY3RseSBieSB0aGUgQyBjb2RlLgoJICAgIFNvbWUgZml4ZXMgdG8gdHlwZW1hcC1HT09QUyBpbnRlcmFjdGlvbi4KCjExLzAyLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIFJlbW92ZSB0aGUgZmlsZSBhcmd1bWVudCB0byAtc2Ntc3R1YiBhbmQgLWdvb3BzLgoJICAgIFRoZSBTY2hlbWUgZmlsZXMgYXJlIG5vdyBhbHdheXMgY2FsbGVkIE1PRFVMRS5zY20gb3IKCSAgICBNT0RVTEUtcHJpbWl0aXZlLnNjbSwgd2hlcmUgTU9EVUxFIGlzIHRoZSBtb2R1bGUgbmFtZSBhbmQgCgkgICAgInByaW1pdGl2ZSIgY2FuIGJlIGNoYW5nZWQgYnkgdGhlIC1wcmltc3VmZml4IG9wdGlvbi4KCSAgICBUaGUgU2NoZW1lIGZpbGVzIGFyZSBub3cgcGxhY2VkIGluIHRoZSBkaXJlY3RvcnkgZ2l2ZW4gYnkKCSAgICB0aGUgLW91dGRpciBvcHRpb24sIG9yIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KCSAgICAoUGF0Y2ggYnkgSm9obiBMZW56LCBzbGlnaHRseSBtb2RpZmllZC4pCgoJICAgICoqKiBJTkNPTVBBVElCSUxJVFkgW0d1aWxlXSAqKioKCjExLzAyLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBVbmlmeSB0aGUgcG9pbnRlci1jb252ZXJzaW9uIHJ1bnRpbWUgQVBJLiAgVGhlIHN0YW5kYXJkCgkgICAgZnVuY3Rpb25zIGFyZToKCSAgICAgKiBTV0lHX05ld1BvaW50ZXJPYmogKFBPSU5URVIsIFRZUEUsIEZMQUdTKQoJICAgICAgICAtLSBDcmVhdGUgYW4gc2NyaXB0aW5nIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgYSB0eXBlZAoJCSAgIHBvaW50ZXIuIEZMQUdTIGFyZSBsYW5ndWFnZSBzcGVjaWZpYy4KCSAgICAgKiBTV0lHX0NvbnZlcnRQdHIgKElOUFVULCBSRVNVTFQsIFRZUEUsIEZMQUdTKQoJICAgICAgICAtLSBHZXQgYSBwb2ludGVyIGZyb20gdGhlIHNjcmlwdGluZyBvYmplY3QgSU5QVVQgYW5kCgkJICAgc3RvcmUgaXQgaW4gdGhlIHBsYWNlIFJFU1VMVC4gIFdoZW4gYSB0eXBlIG1pc21hdGNoIAoJCSAgIG9jY3VycywgcmV0dXJuIG5vbnplcm8uCgkgICAgICogU1dJR19NdXN0R2V0UHRyIChJTlBVVCwgVFlQRSwgQVJHTlVNLCBGTEFHUykKCSAgICAgICAgLS0gR2V0IGEgcG9pbnRlciBmcm9tIHRoZSBzY3JpcHRpbmcgb2JqZWN0IElOUFVUIGFuZAoJCSAgIHJldHVybiBpdC4gIFdoZW4gYSB0eXBlIG1pc21hdGNoIG9jY3VycywgdGhyb3cgYW4KCQkgICBleGNlcHRpb24uICBJZiBBUkdOVU0gPiAwLCByZXBvcnQgaXQgYXMgdGhlIAoJCSAgIGFyZ3VtZW50IG51bWJlciB0aGF0IGhhcyB0aGUgdHlwZSBtaXNtYXRjaC4KICAgICAgICAgICAgW0d1aWxlXTogICAgTm8gY2hhbmdlcy4KCSAgICBbTXpTY2hlbWVdOiBObyBjaGFuZ2VzLgoJICAgIFtQZXJsXTogICAgIEFkZCB0aGUgZnVuY3Rpb24gU1dJR19OZXdQb2ludGVyT2JqLgoJCSAgICAgICAgVGhlIGZ1bmN0aW9uIFNXSUdfTWFrZVB0ciBpcyBrZXB0LgoJCQlUaGUgZnVuY3Rpb24gU1dJR19NdXN0R2V0UHRyIGlzIGN1cnJlbnRseSBub3QKCQkJc3VwcG9ydGVkLgoJICAgIFtQeXRob25dOiAgIEFkZCB0aGUgZnVuY3Rpb24gU1dJR19NdXN0R2V0UHRyLgoJICAgIFtSdWJ5XTogICAgIEFkZCB0aGUgZnVuY3Rpb24gU1dJR19NdXN0R2V0UHRyLgoJICAgIFtUY2xdOiAgICAgIFJlbW92ZSB0aGUgImludGVycCIgYXJndW1lbnQgb2YKCQkgICAgICAgIFNXSUdfTmV3SW5zdGFuY2VPYmosIFNXSUdfQ29udmVydFB0ciwKCQkgICAgICAgIFNXSUdfQ29udmVydFBhY2tlZCwgYW5kIFNXSUdfQ29udmVydFB0ckZyb21TdHJpbmcuCgkJCVRoZSBmdW5jdGlvbiBTV0lHX011c3RHZXRQdHIgaXMgY3VycmVudGx5IAoJCQlub3Qgc3VwcG9ydGVkLgoJICAgIE5vIGNoYW5nZXMgdG8gUGlrZSBiZWNhdXNlIGl0cyBwb2ludGVyIGNvbnZlcnNpb24gY29kZSBkaWQKCSAgICBub3QgbG9vayBjb21wbGV0ZS4gIE5vIGNoYW5nZXMgdG8gUEhQNCwgYmVjYXVzZSBJIGRpZCBub3QKCSAgICB1bmRlcnN0YW5kIGl0cyBydW50aW1lIGNvZGUuICBObyBjaGFuZ2VzIHRvIENoaWNrZW4KCSAgICBiZWNhdXNlIG1ham9yIGNoYW5nZXMgYXJlIGV4cGVjdGVkIHNvb24gYW55d2F5LiAgTm8KCSAgICBjaGFuZ2VzIHRvIEphdmEsIE9DYW1sLCBDIyBiZWNhdXNlIHRoZXkgZG8gbm90IHNlZW0gdG8KCSAgICBoYXZlIGEgcG9pbnRlci1jb252ZXJzaW9uIHJ1bnRpbWUgQVBJLgoKICAgICAgICAgICAgKioqIElOQ09NUEFUSUJJTElUWSBbVGNsXSAqKioKCjExLzAyLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbUGVybDUsIFBIUDQsIFBpa2UsIFB5dGhvbiwgUnVieSwgVGNsXTogVXNlIHRoZQoJICAgIHByZXByb2Nlc3NvciB0byByZW5hbWUgZXh0ZXJuYWwgZnVuY3Rpb25zIG9mIHRoZSBTV0lHCgkgICAgcnVudGltZSBBUEkgdG8gZm9sbG93IHRoZSBuYW1pbmcgY29udmVudGlvbgoJICAgIFNXSUdfPGxhbmd1YWdlPl88ZnVuY3Rpb24+LiAgVGhpcyBzaG91bGQgYWxsb3cgbGlua2luZwoJICAgIG1vcmUgdGhhbiBvbmUgaW50ZXJwcmV0ZXIgaW50byBhIHByb2dyYW0uCgoxMC8zMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBGaXggc2luY2UgaW50cm9kdWNpbmcgdGhlIGV4Y2VwdGlvbiBhbmQgc3RkOjpzdHJpbmcgZGVsZWdhdGVzLgogICAgICAgICAgICBUaGUgZml4IG92ZXJjb21lcyBsaW5rZXIgZXJyb3JzIHdoZW4gdXNpbmcgbW9yZSB0aGFuIG9uZSBTV0lHIG1vZHVsZS4KICAgICAgICAgICAgUHJvYmxlbSByZXBvcnRlZCBieSBBbmRyZWFzIFNjaPZyay4KCjEwLzMxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgSW5jb3Jwb3JhdGVkIHBhdGNoOiBbIDgyMzMwMiBdIEluY3IgVGNsIHN1cHBvcnQuCiAgICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IEFsZXhleSBEeWFjaGVua28uCiAgICAgICAgICAgIE5vdGU6IG5lZWRzIGRvY3VtZW50YXRpb24uCgoxMC8zMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEluY29ycG9yYXRlZCBwYXRjaDogWyA4MjkzMjUgXSBuZXcgUHl0aG9uIE1vZHVsZSBvcHRpb25zIGFuZCBmZWF0dXJlcy4KICAgICAgICAgICAgUm9iaW4gRHVubiB3cml0ZXM6CgogICAgICAgICAgICBUaGlzIHBhdGNoIG1ha2VzIGEgbnVtYmVyIG9mIGNoYW5nZXMgdG8gdGhlIFNXSUcgcHl0aG9uIG1vZHVsZS4KCiAgICAgICAgICAgIDEuIEFkZCAtYXBwbHkgb3B0aW9uLCBhbmQgY2hhbmdlIHRoZSBkZWZhdWx0IGNvZGUKICAgICAgICAgICAgb3V0cHV0IHRvIHVzZSB0aGUgZm9vKCphcmdzLCAqKmt3KSBjYWxsaW5nIHN5bnRheAogICAgICAgICAgICBpbnN0ZWFkIG9mIHVzaW5nIGFwcGx5KCkuIElmIHRoZSAtYXBwbHkgb3B0aW9uIGlzCiAgICAgICAgICAgIGdpdmVuIHRoZW4gY29kZSBpcyBnZW5lcmF0ZWQgYXMgYmVmb3JlLiBUaGlzIGlzIHZlcnkKICAgICAgICAgICAgc2ltaWxhciB0byBQYXRjaCAjNzM3MjgxIGJ1dCB0aGUgbmV3IC1tb2Rlcm4gb3B0aW9uCiAgICAgICAgICAgIG1ha2VzIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGF0IHBhdGNoIHVubmVjZXNzYXJ5IHNvIGl0CiAgICAgICAgICAgIGlzIG5vdCBpbmNsdWRlZCBoZXJlLgoJICAgIAogICAgICAgICAgICAyLiBBZGQgLW5ld19yZXByIG9wdGlvbi4gVGhpcyBpcyB0aGUgc2FtZSBhcyBteSBQYXRjaAogICAgICAgICAgICAjNzk3MDAyIHdoaWNoIEkgd2lsbCBtYXJrIGFzIGNsb3NlZCBzaW5jZSBpdCBpcyBubwogICAgICAgICAgICBsb25nZXIgbmVlZGVkLiBXaGVuIHRoaXMgbmV3IG9wdGlvbiBpcyB1c2VkIHRoZW4gdGhlCiAgICAgICAgICAgIF9fcmVwcl9fIG1ldGhvZHMgdGhhdCBhcmUgZ2VuZXJhdGVkIGZvciBwcm94eSBjbGFzc2VzCiAgICAgICAgICAgIHdpbGwgYmUgbW9yZSBpbmZvcm1hdGl2ZSBhbmQgZ2l2ZSBkZXRhaWxzIGFib3V0IHRoZQogICAgICAgICAgICBweXRob24gY2xhc3MgYW5kIHRoZSBDKysgY2xhc3MuCgkgICAgCiAgICAgICAgICAgIDMuIEFkZCAlZmVhdHVyZSgiYWRkdG9mdW5jIikuIEl0IGFsbG93cyB5b3UgdG8gaW5zZXJ0CiAgICAgICAgICAgIG9uZSBvciBtb3JlIGxpbmVzIG9mIGNvZGUgaW5zaWRlIHRoZSBzaGFkb3cgbWV0aG9kIG9yCiAgICAgICAgICAgIGZ1bmN0aW9uIHRoYXQgaXMgYWxyZWFkeSBnZW5lcmF0ZWQsIGluc3RlYWQgb2YKICAgICAgICAgICAgcmVwbGFjaW5nIHRoZSB3aG9sZSB0aGluZyBsaWtlICVmZWF0dXJlKCJzaGFkb3ciKSBkb2VzLgogICAgICAgICAgICBGb3IgX19pbml0X18gaXQgZ29lcyBhdCB0aGUgZW5kLCBmb3IgX19kZWxfXyBpdCBnb2VzCiAgICAgICAgICAgIGF0IHRoZSBiZWdpbmluZyBhbmQgZm9yIGFsbCBvdGhlcnMgdGhlIGNvZGUgZ2VuZXJhdGVkCiAgICAgICAgICAgIGlzIGV4cGFuZGVkIG91dCB0byBiZSBsaWtlCgkgICAgCiAgICAgICAgICAgIGRlZiBCYXIoKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAgICAgdmFsID0gX21vZHVsZS5Gb29fQmFyKCphcmdzLCAqKmt3YXJncykKICAgICAgICAgICAgcmV0dXJuIHZhbAoJICAgIAogICAgICAgICAgICBhbmQgdGhlICJhZGR0b2Z1bmMiIGNvZGUgaXMgaW5zZXJ0ZWQganVzdCBiZWZvcmUgdGhlCiAgICAgICAgICAgIHJldHVybiBzdGF0ZW1lbnQuIElmIHRoZSBmZWF0dXJlIGlzIG5vdCB1c2VkIGZvciBhCiAgICAgICAgICAgIHBhcnRpY3VsYXIgbWV0aG9kIG9yIGZ1bmN0aW9uIHRoZW4gdGhlIHNob3J0ZXIgY29kZSBpcwogICAgICAgICAgICBnZW5lcmF0ZWQganVzdCBsaWtlIGJlZm9yZS4KCSAgICAKICAgICAgICAgICAgNC4gQSBsaXR0bGUgYml0IG9mIHJlZmFjdG9yaW5nIHRvIG1ha2UgaW1wbGVtZW50aW5nCiAgICAgICAgICAgIGFkZHRvZnVuYyBhIGxpdHRsZSBlYXNpZXIuCgkgICAgCiAgICAgICAgICAgIDUuIEFkZGVkIGEgLW1vZGVybiBjb21tYW5kLWxpbmUgZmxhZyB0aGF0IHdpbGwgY2F1c2UKICAgICAgICAgICAgU1dJRyB0byBvbWl0IHRoZSBjcnVmdCBpbiB0aGUgcHJveHkgbW9kdWxlcyB0aGF0IGFsbG93cwogICAgICAgICAgICBpdCB0byB3b3JrIHdpdGggdmVyc2lvbnMgb2YgUHl0aG9uIHByaW9yIHRvIDIuMi4gVGhlCiAgICAgICAgICAgIHJlc3VsdCBpcyBhIHNpbXBsZXIsIGNsZWFuZXIgYW5kIGZhc3RlciBweXRob24gcHJveHkKICAgICAgICAgICAgbW9kdWxlLCBidXQgb25lIHRoYXQgcmVxdWlyZXMgUHl0aG9uIDIuMiBvciBncmVhdGVyLiAKCjEwLzMxLzIwMDM6IGJlYXpsZXkgCiAgICAgICAgICAgIEluY29ycG9yYXRlZCBwYXRjaDogWyA4MjkzMTkgXSBYTUwgbW9kdWxlIHR3ZWFrcy4KICAgICAgICAgICAgVGhpcyBhZGRzIGEgbmV3IGNvbW1hbmQgbGluZSBvcHRpb24gLXhtbGxpdGUgdGhhdCAKICAgICAgICAgICAgZ3JlYXRseSByZWR1Y2VzIHRoZSBhbW91bnQgb2YgZW1pdHRlZCBYTUwgY29kZSBieQogICAgICAgICAgICBlbGltaW5hdGluZyBzb21lIGZpZWxkcyBtb3N0bHkgdXNlZCBpbiBTV0lHJ3MKICAgICAgICAgICAgaW50ZXJuYWwgcHJvY2Vzc2luZy4gIENvbnRyaWJ1dGVkIGJ5IFJvYmluIER1bm4uCgoxMC8zMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEluY29ycG9yYXRlZCBwYXRjaDogWyA4MjkzMTcgXSBBZGRzIERvaFNwbGl0TGluZXMgZnVuY3Rpb24uCiAgICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IFJvYmluIER1bm4uCgoxMC8yOS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgODI3OTA3IF0gYXJnb3V0IG9iamVjdHMgbm90IGJlaW5nIHdyYXBwZWQgcHJvcGVybHkgKFBBVEgpLgogICAgICAgICAgICBQYXRjaCBjb250cmlidXRlZCBieSBTYWx2YWRvciBGYW5kafFvIEdhcmPtYS4KCSAgICAgCjEwLzI5LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA4MjY5OTYgXSBwZXJsIHR5cGUgY2hlY2tpbmcgaWdub3JlcyBwZXJsIHN1YmNsYXNzZXMuCiAgICAgICAgICAgIFRoaXMgZW5oYW5jZW1lbnQgbWFrZXMgaXQgc28gd3JhcHBlZCBjbGFzc2VzIGFuZCBzdHJ1Y3RzIGNhbgogICAgICAgICAgICBiZSBzdWJjbGFzc2VkIGluIFBlcmwgYW5kIHVzZWQgbm9ybWFsbHkuIAogICAgICAgICAgICBQYXRjaCBjb250cmlidXRlZCBieSBTYWx2YWRvciBGYW5kafFvIEdhcmPtYS4KCjEwLzE2LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEludFB0ciBtYXJzaGFsbGVkIHdpdGggYSB2b2lkKiBpbnN0ZWFkIG9mIGludCBpbiBDIGZ1bmN0aW9uIAogICAgICAgICAgICBkZWNsYXJhdGlvbnMuIFRoZSBjYXN0cyB0aHVzIGxvb2sgbW9yZSBjb252ZW50aW9uYWwsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIC8vIG9sZAogICAgICAgICAgICAgICAgRGxsRXhwb3J0IGRvdWJsZSBTV0lHU1REQ0FMTCBDU2hhcnBfZ2V0X1NoYXBlX3goaW50IGphcmcxKSB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgU2hhcGUgKmFyZzEgPSAoU2hhcGUgKikgMCA7CiAgICAgICAgICAgICAgICAgICAgYXJnMSA9ICooU2hhcGUgKiopJmphcmcxOyAKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIG5ldwogICAgICAgICAgICAgICAgRGxsRXhwb3J0IGRvdWJsZSBTV0lHU1REQ0FMTCBDU2hhcnBfZ2V0X1NoYXBlX3godm9pZCAqIGphcmcxKSB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgU2hhcGUgKmFyZzEgPSAoU2hhcGUgKikgMCA7CiAgICAgICAgICAgICAgICAgICAgYXJnMSA9IChTaGFwZSAqKWphcmcxOyAKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KCgoxMC8xNC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgc3VidGxlIHByb2JsZW0gd2l0aCBvdmVybG9hZGVkIG1ldGhvZHMgYW5kIHNtYXJ0IHBvaW50ZXJzLgogICAgICAgICAgICBJZiBhIGNsYXNzIGhhcyBvdmVybG9hZGVkIG1ldGhvZHMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgaW50IGJhcihpbnQgeCk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyBpbnQgYmFyKGludCB4LCBpbnQgeSk7CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGFuZCB0aGUgY2xhc3MgaXMgdXNlZCBhcyBhIHNtYXJ0IHBvaW50ZXI6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vUHRyIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgRm9vICpvcGVyYXRvci0+KCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIFNXSUcgd291bGQgdHJ5IHRvIGV4cG9zZSB0aGUgc3RhdGljIG1lbWJlciBGb286OmJhcgogICAgICAgICAgICB0aHJvdWdoIEZvb1B0ci0tLXJlc3VsdGluZyBib2d1cyB3cmFwcGVyIGNvZGUgYW5kIGEgY29tcGlsZXIKICAgICAgICAgICAgZXJyb3IuCgogICAgICAgICAgICBEdWUgdG8gdGhlIHdheSBpbiB3aGljaCBvdmVybG9hZGluZyBpcyBoYW5kbGVkLCBpdCBpcwogICAgICAgICAgICBleHRyZW1lbHkgZGlmZmljdWx0IHRvIGVsaW1pbmF0ZSB0aGUgc3RhdGljIG1ldGhvZCBpbgogICAgICAgICAgICB0aGlzIGNhc2UuICBUaGVyZWZvcmUsIGl0IGlzIHN0aWxsIGV4cG9zZWQuICBIb3dldmVyLAogICAgICAgICAgICB0aGUgZ2VuZXJhdGVkIGNvZGUgbm93IGNvbXBpbGVzIGFuZCB3b3Jrcy4KCjEwLzA1LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGUsIE16U2NoZW1lLCBDaGlja2VuXTogUmVtb3ZlIHN5bWJvbCBjbGFzaGVzIGJldHdlZW4KCSAgICB0aGUgcnVudGltZSBsaWJyYXJpZXMgYnkgcmVuYW1pbmcgYWxsIGV4dGVybiBjb21tb24uc3dnCgkgICAgZnVuY3Rpb25zIHdpdGggdGhlIHByZXByb2Nlc3Nvci4KCjEwLzA1LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEFkZGVkIGJhc2ljIEdPT1BTIHN1cHBvcnQsIGNvbnRyaWJ1dGVkIGJ5IEpvaG4gTGVuei4KCSAgICBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuCgkgICAgCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjEwLzA0LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIE5ldyBvcHRpb24sIC1vbmx5LXNldHRlcnMsIHdoaWNoIGRpc2FibGVzCgkgICAgdHJhZGl0aW9uYWwgZ2V0dGVyIGFuZCBzZXR0ZXIgcHJvY2VkdXJlcyBmb3Igc3RydWN0dXJlIHNsb3RzLgoKMTAvMDMvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gQWRkZWQgcnVuIHRlc3QgZm9yIHJlZmVyZW5jZV9nbG9iYWxfdmFycyBieSBKb2huIExlbnouCgowOS8zMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFBhcnRpYWwgc29sdXRpb24gdG8gWyA3OTIxODAgXSBDKysgc21hcnQtcG9pbnRlci9uYW1lc3BhY2UgbWl4dXAgcmV2aXNpdGVkLgogICAgICAgICAgICBUaGUgcHJvYmxlbSBpcyBub3QgZWFzeSB0byBmaXggKGF0IGxlYXN0IGl0IGRvZXNuJ3Qgc2VlbSBzbyksIGJ1dCBpcwogICAgICAgICAgICByZWxhdGVkIHRvIHRoZSBpbnN0YW50aWF0aW9uIG9mIHF1YWxpZmllZCB0ZW1wbGF0ZXMgaW5zaWRlIG9mIG90aGVyCiAgICAgICAgICAgIG5hbWVzcGFjZXMuICAgU1dJRyBub3cgZ2VuZXJhdGVzIGFuIGVycm9yIG1lc3NhZ2UgaW4gdGhpcyBjYXNlIHJhdGhlcgogICAgICAgICAgICB0aGFuIGdlbmVyYXRpbmcgYnJva2VuIHdyYXBwZXJzLgoKMDkvMzAvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDgwMDAxMiBdIEVOVEVSIG1hY3JvIGZyb20gQ09SRS9zY29wZS5oIGNsYXNoZXMgd2l0aCBsaWJjIHNlYXJjaC5oLgogICAgICAgICAgICBSZXBvcnRlZCBieSBCcml0dG9uIExlbyBLZXJpbi4KCjA5LzMwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA4MTE1MTggXSBDYXN0aW5nIGludHMgdG8gZG91YmxlcyAody8gc29sdXRpb24/KQogICAgICAgICAgICBBZGRyZXNzZXMgYSBwcm9ibGVtIHdpdGggb3ZlcmxvYWRpbmcgaW4gdGhlIFBlcmwgbW9kdWxlLgogICAgICAgICAgICBSZXBvcnRlZCBieSBHZXJhbGQgRGFsbGV5LgoKMDkvMjgvMjAwMzogbWtvZXBwZQoJICAgIFtHdWlsZSB3aXRoIC1zY20gb3B0aW9uXSBGaXggdHlwbyBpbiBnZW5lcmF0ZWQgY29kZSBmb3IKCSAgICBwcm9jZWR1cmVzLXdpdGgtc2V0dGVycy4gIFJlcG9ydGVkIGJ5IEpvaG4gTGVuei4KCjA5LzI2LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA4MTI1MjggXSBleHRlcm5zIG5vdCBjb3JyZWN0IHdoZW4gdGhyb3cgaXMgaW4gc2lnbmF0dXJlLgogICAgICAgICAgICBSZXBvcnRlZCBieSBKb3NlcGggV2luc3Rvbi4KICAgICAgICAgICAgCjA5LzIzLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBTV0lHIHdhcyBnZW5lcmF0aW5nIGEgbnVtYmVyIG9mIHN5bWJvbHMgdGhhdCBkaWRuJ3QgY29tcGx5IHdpdGggCiAgICAgICAgICAgIHRoZSBJU08gQy9DKysgc3RhbmRhcmQsIGluIHBhcnRpY3VsYXIgSVNPL0lFQyAxNDg4MjoxOTk4KEUpIDE3LjQuMy4xLjIKICAgICAgICAgICAgd2hlcmUgZG91YmxlIHVuZGVyc2NvcmVzIGFyZSBmb3JiaWRkZW4gYXMgd2VsbCBhcyBzeW1ib2xzIHN0YXJ0aW5nIHdpdGgKICAgICAgICAgICAgYW4gdW5kZXJzY29yZSBmb2xsb3dlZCBieSBhbiB1cHBlciBjYXNlIGxldHRlci4gTW9zdCBvZiB0aGVzZSBoYXZlCiAgICAgICAgICAgIGJlZW4gcm9vdGVkIG91dC4gU2VlIG5ldyBzZWN0aW9uIGFkZGVkIHRvIGludGVybmFscy5odG1sIGRldmVsb3BtZW50CiAgICAgICAgICAgIG1hbnVhbCAnU3ltYm9sIE5hbWluZyBHdWlkZWxpbmVzIGZvciBHZW5lcmF0ZWQgQy9DKysgQ29kZScuCgowOS8yMy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRGlyZWN0b3IgdHlwZW1hcCBuYW1lIGNoYW5nZXM6CiAgICAgICAgICAgIGludiAgICAgPT4gZGlyZWN0b3JpbgogICAgICAgICAgICBvdXR2ICAgID0+IGRpcmVjdG9yb3V0CiAgICAgICAgICAgIGFyZ291dHYgPT4gZGlyZWN0b3JhcmdvdXQKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMDkvMTkvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgW1B5dGhvbl0gRGlyZWN0b3IgY29uc3RydWN0b3JzIG5vdyBkZWZhdWx0IHRvIF9fZGlzb3duID0gMCwgCgkgICAgd2hpY2ggaXMgdGhlIGludGVuZGVkIGJlaGF2aW9yIGFuZCBmaXhlcyB0aGUgZGlyZWN0b3JfZmluYWxpemVyIAoJICAgIHRlc3QgY2FzZSB1bmRlciBweXRob24uCgowOS8xMi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSAtIFR5cGVtYXBzIGFkZGVkIGZvciBzdGQ6OnN0cmluZyBhbmQgY29uc3Qgc3RkOjpzdHJpbmcgJi4KICAgICAgICAgICAgICAgICAtIE5ldyBkZWxlZ2F0ZSBmb3IgY3JlYXRpbmcgYSBDIyBzdHJpbmcgZ2l2ZW4gYSBjaGFyICouIEl0CiAgICAgICAgICAgICAgICAgICBjYW4gYmUgdXNlZCBieSBjYWxsaW5nIFNXSUdfY3NoYXJwX3N0cmluZ19jYWxsYmFjayBhcyBzaG93bgogICAgICAgICAgICAgICAgICAgaW4gdGhlIHN0ZDo6c3RyaW5nICdvdXQnIHR5cGVtYXAuIFVzZWZ1bCBpZiB0aGUgcmV0dXJuIHR5cGUgaXMKICAgICAgICAgICAgICAgICAgIG1hcHBlZCB0byBhIEMjIHN0cmluZyBhbmQgdGhlIGNhbGxpbmcgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgCiAgICAgICAgICAgICAgICAgICBmb3IgY2xlYW5pbmcgdXAgbWVtb3J5IGFzIHRoZSBDIyBnYXJiYWdlIGNvbGxlY3RvciBkb2Vzbid0CiAgICAgICAgICAgICAgICAgICBmcmVlIHRoZSBtZW1vcnkgY3JlYXRlZCBpbiBDL0MrKyBhbmQgdGhlbiByZXR1cm5lZCBhcyBhIEMjIHN0cmluZy4KICAgICAgICAgICAgICAgICAtIFRoZSBleGNlcHRpb24gZGVsZWdhdGVzIGhhdmUgbW92ZWQgaW50byBhbiBpbm5lciBjbGFzcyBpbiB0aGUKICAgICAgICAgICAgICAgICAgIGludGVybWVkaWF0ZSBjbGFzcywgdGhlcmVieSBmcmVlaW5nIHVwIHRoZSBzdGF0aWMgY29uc3RydWN0b3IuCgowOS8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIChJbnRlcm5hbHMpCiAgICAgICAgICAgIE1ham9yIHJlZmFjdG9yaW5nIG9mIGl0ZXJhdGlvbiBvdmVyIGxpc3RzIGFuZCBoYXNoZXMuICBUaGUKICAgICAgICAgICAgRE9IIGxpYnJhcnkgbm93IHVzZXMgaXRlcmF0b3JzLiAgVGhleSB3b3JrIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBMaXN0ICpsID0gKHNvbWUgbGlzdCk7CgogICAgICAgICAgICAgICAgSXRlcmF0b3IgaTsKICAgICAgICAgICAgICAgIGZvciAoaSA9IEZpcnN0KGwpOyBpLml0ZW07IGkgPSBOZXh0KGkpKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaS5pdGVtIGNvbnRhaW5zIHRoZSBhY3R1YWwgbGlzdCBpdGVtLgogICAgICAgICAgICAgICAgICAgIC8vIGkuaXRlbSBpcyBOVUxMIGF0IGVuZCBvZiBsaXN0CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgSGFzaCAqaCA9IChzb21lIGhhc2gpOwogICAgICAgICAgICAgICAgSXRlcmF0b3IgajsKICAgICAgICAgICAgICAgIGZvciAoaiA9IEZpcnN0KGgpOyBqLml0ZW07IGogPSBOZXh0KGopKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gai5pdGVtIGNvbnRhaW5zIGhhc2ggdGFibGUgaXRlbQogICAgICAgICAgICAgICAgICAgIC8vIGoua2V5ICBjb250YWlucyBoYXNoIHRhYmxlIGtleQogICAgICAgICAgICAgICAgICAgIC8vIEJvdGggai5pdGVtIGFuZCBqLmtleSBhcmUgTlVMTCBhdCBlbmQKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICBUaGUgb2xkIGl0ZXJhdGlvbiBmdW5jdGlvbnMgRmlyc3RpdGVtKCksIE5leHRpdGVtKCksIEZpcnN0a2V5KCksCiAgICAgICAgICAgIGFuZCBOZXh0a2V5KCkgYXJlIGdvbmUuICAKCiAgICAgICAgICAgIFRoZSBuZXcgaXRlcmF0b3JzIGFyZSBzaW1wbGVyLCByZXN1bHQgaW4gYmV0dGVyIG1lbW9yeSB1c2UsCiAgICAgICAgICAgIGFuZCBtYXkgYmUgZmFzdGVyLiAgQWxzbywgdGhlcmUgYXJlIG5vIGxvbmdlciBhbnkgcHJvYmxlbXMKICAgICAgICAgICAgaXRlcmF0aW5nIG92ZXIgdGhlIHNhbWUgbGlzdC9oYXNoIGluIG11bHRpcGxlIHBsYWNlcyBhdAogICAgICAgICAgICB0aGUgc2FtZSB0aW1lLiAgRm9yIGV4YW1wbGUsIHRoaXMgaXMgZmluZToKCiAgICAgICAgICAgICAgICAgSXRlcmF0b3IgaSxqOwogICAgICAgICAgICAgICAgIGZvciAoaSA9IEZpcnN0KGwpOyBpLml0ZW07IGkgPSBOZXh0KGkpKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gRmlyc3QobCk7IGouaXRlbTsgaiA9IE5leHQoaikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAoVGhpcyBuZXZlciB3b3JrZWQgaW4gcHJldmlvdXMgdmVyc2lvbnMpLgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiouICBUaGlzIHdpbGwgcHJvYmFibHkgYnJlYWsgCiAgICAgICAgICAgIHRoaXJkIHBhcnR5IGV4dGVuc2lvbnMgdG8gU1dJRyAob3IgZ2l2ZSB0aGVtIGZ1cnRoZXIgZW5jb3VyYWdlbWVudAogICAgICAgICAgICB0byBqb2luIHRoZSBTV0lHIENWUy10cmVlIDotKS4KCjA5LzEwLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEZpeCBtZW1vcnkgbGVha3MgaW4gdGhlICJsaXN0LXZlY3Rvci5pIiB0eXBlbWFwcy4KCjA5LzA5LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbQ2hpY2tlbl0gVXNlIENfbWtfYm9vbCByYXRoZXIgdGhhbiBDX21rYm9vbC4gIFRoaXMgZml4ZXMKCSAgICB0aGUgd3JhcHBpbmcgb2YgYm9vbGVhbiB2YWx1ZXMgZm9yIENoaWNrZW4gMS4xMCBhbmQgbmV3ZXIuCgkgICAgUmVwb3J0ZWQgYnkgRGF2ZSA8aHVuZG9AeWFob28uY29tPiAvIEZlbGl4IFdpbmtlbG1hbm4KCSAgICA8ZmVsaXhAcHJveGltYS1tdC5kZT4uCgowOS8wNS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIERpcmVjdG9ycyBpbXBsZW1lbnRlZCBmb3IgSmF2YS4gSW4gc3VtbWFyeSB0aGlzIGlzIGEgYmlnIG5ldyBmZWF0dXJlIAogICAgICAgICAgICB3aGljaCBzdXBwb3J0cyB1cGNhbGxzIGZyb20gQysrIHRvIEphdmEuIENvZGUgaXMgZ2VuZXJhdGVkIHRvIHN1cHBvcnQgQysrIAogICAgICAgICAgICBjYWxsYmFja3MgdG8gY2FsbCBpbnRvIEphdmEgYW5kIHRydWUgcG9seW1vcnBoaWMgYmVoYXZpb3VyIGZvciBKYXZhIGNsYXNzZXMgCiAgICAgICAgICAgIGRlcml2ZWQgZnJvbSBDKysgY2xhc3Nlcy4gU2VlIGphdmEuaHRtbCBmb3IgZGV0YWlscy4gQ29udHJpYnV0ZWQgYnkgCiAgICAgICAgICAgIFNjb3R0IE1pY2hlbC4KCjA5LzA1LzIwMDM6IFRpZ2VyCiAgICAgICAgICAgIENyZWF0ZWQgY29udHJhY3QgZXhhbXBsZSBkaXJlY3RvcnkgYXQgL1NXSUcvRXhhbXBsZXMvY29udHJhY3QKICAgICAgICAgICAgQWRkZWQgc2ltcGxlIGNvbnRyYWN0IGV4YW1wbGVzIChzaW1wbGVfYyAmIHNpbXBsZV9jeHgpCiAgICAgICAgICAgIE1vZGlmaWVkIGNvbnRyYWN0IG1vZHVsZSdzIG91dHB1dCBmb3JtYXQKCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA5LzAxLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBUZXN0LXN1aXRlIGJ1aWxkIGltcHJvdmVtZW50czoKICAgICAgICAgICAgLSBNdWx0aXBsZSBidWlsZCBkaXJlY3RvcmllcyB3b3JraW5nIGZvciB0aGUgdGVzdCBzdWl0ZSwgc28gaXQgaXMgbm93CiAgICAgICAgICAgICAgcG9zc2libGUgdG8gcnVuIGNvbmZpZ3VyZSBpbiBtdWx0aXBsZSBzdWJkaXJlY3RvcmllcyBhbmQgcnVuIHRoZSB0ZXN0CiAgICAgICAgICAgICAgc3VpdGUgaW4gZWFjaCBvZiB0aGVzZSBzdWIgZGlyZWN0b3JpZXMuCiAgICAgICAgICAgIC0gJ21ha2UgZGlzdGNsZWFuJyBmaXhlZCBzbyBpdCBkb2Vzbid0IGJvbWIgb3V0IG9uIHRoZSBFeGFtcGxlcyBkaXJlY3RvcnkKICAgICAgICAgICAgICB3aGVuIHVzaW5nIG11bHRpcGxlIHN1YmRpcmV0b3J5IGJ1aWxkcy4gUmVxdWlyZWQgdGhlIGZvbGxvd2luZyBkaXJlY3RvcmllcwogICAgICAgICAgICAgIHRvIGJlIG1vdmVkOgogICAgICAgICAgICAgICAgRXhhbXBsZXMvR0lGUGxvdC9QZXJsIC0+IEV4YW1wbGVzL0dJRlBsb3QvUGVybDUKICAgICAgICAgICAgICAgIEV4YW1wbGVzL0dJRlBsb3QvUGhwICAtPiBFeGFtcGxlcy9HSUZQbG90L1BocDQKICAgICAgICAgICAgICBUaGVzZSBuZXcgZGlyZWN0b3JpZXMgdXNlZCB0byBiZSBzeW1ib2xpYyBsaW5rcyB0byB0aGUgb2xkIGRpcmVjdG9yeS4KICAgICAgICAgICAgICBBbHNvIHRoZSBFeGFtcGxlcy90ZXN0LXN1aXRlL1Blcmwgc3ltYm9saWMgbGluayBoYXMgYmVlbiByZW1vdmVkLgogICAgICAgICAgICAtIFJ1bm5pbmcgdGhlIHRlc3Qtc3VpdGUsIG90aGVyIHRoYW4gZnJvbSB0aGUgcm9vdCBkaXJlY3RvcnksIHNheQogICAgICAgICAgICAgIGluIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvcHl0aG9uIHdpbGwgbm93IGRpc3BsYXkgYWxsIHRoZSBjb2RlIGJlaW5nCiAgICAgICAgICAgICAgZXhlY3V0ZWQuCiAgICAgICAgICAgIC0gVGhlIGZvbGxvd2luZyAzIEMjIGNvbXBpbGVycyBhcmUgZGV0ZWN0ZWQgZHVyaW5nIGNvbmZpZ3VyZSBhbmQgd29yayB3aXRoIAogICAgICAgICAgICAgIHRoZSB0ZXN0LXN1aXRlOiBNb25vLCBQb3J0YWJsZS5ORVQgYW5kIE1pY3Jvc29mdC4KCjA5LzAxLzIwMDM6IFRpZ2VyCiAgICAgICAgICAgIEFkZGVkIGluaGVyaXRhbmNlIHN1cHBvcnQgZm9yIGRlc2lnbiBieSBjb250cmFjdCBmZWF0dXJlLgoKMDkvMDEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc5NDkxNCBdIFdyb25nIHR5cGVzIGluIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uLgogICAgICAgICAgICBTV0lHIHdhcyBub3QgaGFuZGxpbmcgYXJndW1lbnRzIGNvcnJlY3RseSBpbiB0ZW1wbGF0ZSAKICAgICAgICAgICAgcGFydGlhbCBzcGVjaWFsaXphdGlvbi4gIEZvciBleGFtcGxlLAoKICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIEZvbzxUICo+IHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICBUICpibGFoKCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShGb29JbnQpIEZvbzxpbnQgKj47CgogICAgICAgICAgICBpbiB0aGlzIGNsYXNzLCB0aGUgcmV0dXJuIHR5cGUgb2YgYmxhaCB3YXMgc2V0IHRvCiAgICAgICAgICAgICdpbnQgKionLCBidXQgaXQgc2hvdWxkIHJlYWxseSBiZSAnaW50IConLiAgVGhpcyBoYXMgYmVlbgogICAgICAgICAgICBmaXhlZCwgYnV0IGl0IHdpbGwgYWZmZWN0IGFsbCBwcmlvciB1c2VzIG9mIHBhcnRpYWwKICAgICAgICAgICAgc3BlY2lhbGl6YXRpb24uCiAKMDkvMDEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc4NjM5NCBdIFBhdGNoIGZvciBnZW5lcmF0ZWQgcGVybCBjb2RlIGRvZXMgbm90IGNvbXBpbGUgdW5kZXIgUmVkSGF0OS4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgU2NvdHQgRmlubmVyYW4uCgowOS8wMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzkxNTc5IF0gKHVuc2lnbmVkKSBsb25nIGxvbmcgaGFuZGxlZCBpbmNvcnJlY3RseSAoVGNsKS4KICAgICAgICAgICAgVGhpcyB3YXMgYW4gZXJyb3IgaW4gdGhlIFRjbCB0eXBlbWFwcy5pIGZpbGUuIAogICAgICAgICAgICBSZXBvcnRlZCBieSBLamVsbCBXb29kaW5nLgogICAgICAgIAowOS8wMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzk3NTczIF0gbm8gd2F5IHRvIHJlbmFtZSBjbGFzc2VzIGNvbWluZyBmcm9tIEMgc3RydWN0dXJlcy4KICAgICAgICAgICAgVGhpcyBwcm9ibGVtIHJlbGF0ZXMgdG8gcmVuYW1pbmcgb2YgYW5vbnltb3VzIHN0cnVjdHVyZXMgd2l0aCBhCiAgICAgICAgICAgIHR5cGVkZWYuICBGb3IgZXhhbXBsZTogCgogICAgICAgICAgICAgICAgICAlcmVuYW1lKEJhcikgRm9vOwogICAgICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCB7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9IEZvbzsKCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEJyaXR0b24gTGVvIEtlcmluLgogICAgICAgICAgICAKMDkvMDEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc5NzU3NiBdIC1oZWxwIHNlZW1zIHRvIGltcGx5IHRoYXQgb25seSB0Y2wtc3BlY2lmaWMgb3B0aW9ucyBleGlzdC4KICAgICAgICAgICAgQWRkZWQgYSBjb21tZW50IHRvIGFsZXJ0IHVzZXIgdG8gb3RoZXIgb3B0aW9ucy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQnJpdHRvbiBMZW8gS2VyaW4uCgowOS8wMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzk4MjA1IF0gU2VnZmF1bHQgaW4gU1dJR19Db252ZXJ0UHRyLgogICAgICAgICAgICBSZXBvcnRlZCBieSBQcmFiaHUgUmFtYWNoYW5kcmFuLgoKMDgvMzAvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgTW9kaWZpZWQgdGhlIGRpcmVjdG9yIHR5cGVtYXBzIGluIHB5dGhvbi9zdGRfY29tcGxleC5pIHRvIHVzZSB0aGUgCgkgICAgbmV3LXN0eWxlIG1hY3JvIGFuZCBjb252ZXJzaW9uIGZ1bmN0aW9ucywgd2hpY2ggZWxpbWluYXRlZCBzb21lCgkgICAgcmVkdW5kYW50IGNvZGUuICBGaXhlZCBhIGZldyBidWdzIGluIHRoZXNlIHR5cGVtYXBzIGFzIHdlbGwsIGFsdGhvdWdoCgkgICAgbW9yZSB0ZXN0aW5nIGlzIG5lZWRlZC4KCjA4LzI5LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIENvbXBsZXRlZCBpbml0aWFsIHN1cHBvcnQgZm9yIHdyYXBwaW5nIGFic3RyYWN0IGNsYXNzZXMgd2l0aCBkaXJlY3RvcnMuCgkgICAgQ29uc3RydWN0b3Igd3JhcHBlcnMgd2lsbCBiZSBnZW5lcmF0ZWQgZm9yIGFic3RyYWN0IGNsYXNzZXMgdGhhdCBoYXZlCgkgICAgZGlyZWN0b3JzLCBhbmQgaW5zdGFuY2VzIG9mIHRoZSBkaXJlY3RvciBjbGFzc2VzIHdpbGwgYmUgY3JlYXRlZCByZWdhcmRsZXNzCgkgICAgb2Ygd2hldGhlciB0aGUgcHJveHkgY2xhc3MgaGFzIGJlZW4gc3ViY2xhc3NlZCBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLgoJICAgIE5vIGNoZWNrcyBhcmUgbWFkZSBkdXJpbmcgY29uc3RydWN0aW9uIHRvIGVuc3VyZSB0aGF0IGFsbCBwdXJlIHZpcnR1YWwKCSAgICBtZXRob2RzIGFyZSBpbXBsZW1lbnRlZCBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLiAgSW5zdGVhZCwgY2FsbHMgdG8KCSAgICB1bmltcGxlbWVudGVkIG1ldGhvZHMgd2lsbCB0aHJvdyBTV0lHX0RJUkVDVE9SX1BVUkVfVklSVFVBTF9FWENFUFRJT04KCSAgICBleGNlcHRpb25zIGluIEMrKy4KCgkgICAgSW50ZWdyYXRlZCBQcmFiaHUgUmFtYWNoYW5kcmFuJ3MgdHlwZW1hcCBwYXRjaGVzLCB3aGljaCBwcm92aWRlIGRpcmVjdG9yCgkgICAgdHlwZW1hcCBzdXBwb3J0IGZvciBlbnVtcyBhbmQgc3RkOjpzaXplX3QsIGFuZCBmaXggYSBjb3VwbGUgYnVncyBpbiB0aGUgCgkgICAgZGlyZWN0b3Igc3RkOjp2ZWN0b3I8PiB0eXBlbWFwcy4KCjA4LzI5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEltcGxlbWVudGVkIGV4Y2VwdGlvbiBoYW5kbGluZyBmb3IgdGhyb3dpbmcgQyMgZXhjZXB0aW9ucyBmcm9tIEMvQysrIGNvZGUuCiAgICAgICAgICAgIEEgZmV3IGRlbGVnYXRlIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlIGZvciBjYWxsaW5nIHdoaWNoIHRoZW4gdGhyb3cgdGhlIEMjCiAgICAgICAgICAgIGV4Y2VwdGlvbi4gVXNlIHRoZSBTV0lHX0NTaGFycFRocm93RXhjZXB0aW9uIGZ1bmN0aW9uIGZyb20gQy9DKysgdHlwZW1hcHMuCiAgICAgICAgICAgIFNlZSB0aGUgZ2VuZXJhdGVkIHdyYXBwZXIgY29kZSBvciBjc2hhcnBoZWFkLnN3ZyBmb3IgYWxsIGF2YWlsYWJsZSBleGNlcHRpb25zLgogICAgICAgICAgICBFeGFtcGxlOgoKICAgICAgICAgICAgICBTV0lHX0NTaGFycFRocm93RXhjZXB0aW9uKFNXSUdfQ1NoYXJwRXhjZXB0aW9uLCAiZXhjZXB0aW9uIGRlc2NyaXB0aW9uIik7CgogICAgICAgICAgICBUaGUgJ3Rocm93cycgdHlwZW1hcHMgYXJlIGFsc28gbm93IGltcGxlbWVudGVkLCBzbyBjb2RlIGlzIGF1dG9tYXRpY2FsbHkgCiAgICAgICAgICAgIGdlbmVyYXRlZCB0byBjb252ZXJ0IGFueSBDKysgZXhjZXB0aW9uIGludG8gYSBDIyBTeXN0ZW0uRXhjZXB0aW9uIHdoZW4gdGhlIEMrKyAKICAgICAgICAgICAgbWV0aG9kIGRlY2xhcmVzIGFuIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIHN1Y2ggYXM6CgogICAgICAgICAgICAgICBpbnQgZm9vKCkgdGhyb3coQmFyKTsKCiAgICAgICAgICAgIEFsc28gYW55IHBhcmFtZXRlcnMgdGhhdCBhcmUgcmVmZXJlbmNlcyB0byBhIEMrKyBjbGFzcyBvciBhIGNsYXNzIHBhc3NlZCBieSB2YWx1ZQogICAgICAgICAgICBhbmQgYXJlIHBhc3NlZCBhcyBhIEMjIG51bGwgd2lsbCBub3cgdGhyb3cgYSBDIyBOdWxsUmVmZXJlbmNlRXhjZXB0aW9uLgoKMDgvMjkvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gRml4IHRvIG1hdGNoIHRoZSBjYWxsaW5nIGNvbnZlbnRpb24gb2YgYWxsIHBpbnZva2UgbWV0aG9kcyBzbyB0aGF0IHRoZXkKICAgICAgICAgICAgbWF0Y2ggdGhlIGNhbGxpbmcgY29udmVudGlvbiB1c2VkIGJ5IGRlZmF1bHQgaW4gdGhlIEMjICdzdGF0aWMgZXh0ZXJuJyBkZWNsYXJhdGlvbnMgCiAgICAgICAgICAgIChfX3N0ZGNhbGwgaXMgdXNlZCBvbiBXaW5kb3dzKS4KCjA4LzE5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gUmV3b3JrZWQgc3RkOjpzdHJpbmcgdHlwZW1hcHMuIEZpeGVzIGEgbnVtYmVyIG9mIHN0cmluZyBpbiBzdGQgbmFtZXNwYWNlIAogICAgICAgICAgICBwcm9ibGVtcy4gRm9yIGV4YW1wbGUgJXRlbXBsYXRlIHZlY3RvcjxzdHJpbmc+LiBUaGUgdGVtcGxhdGVkIGNsYXNzJyBnZXQgbWV0aG9kIAogICAgICAgICAgICB3YXNuJ3QgcmV0dXJuaW5nIGEgSmF2YSBTdHJpbmcsIGJ1dCBhIFNXSUdUWVBFX3Bfc3RyaW5nLiBSZXBvcnRlZAogICAgICAgICAgICBieSBaYWNoIEJhdW0uCgowOC8xNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzYzNTIyIF0gMS4zLjE5IHNlZ2ZhdWx0IGluIFN3aWdUeXBlX2FkZF9wb2ludGVyL0RvaEluc2VydGl0ZW0uCiAgICAgICAgICAgIFJlbGF0ZWQgdG8gcHJvYmxlbSB3aXRoIHVubmFtZWQgY2xhc3MgaGFuZGxpbmcgaW4gUGVybCBtb2R1bGUuCgowOC8xNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzYzNTYzIF0gTWlzc2luZyBpbmRpY2F0aW9uIG9mIG9wdGlvbmFsIGFyZ3VtZW50cy4KICAgICAgICAgICAgVGNsIG1vZHVsZS4gIFJlcG9ydGVkIGJ5IEtyenlzenRvZiBLb3ptaW5za2kuCgowOC8xNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzg3NDMyIF0gbG9uZyBwYXJhbSBoYW5kbGVkIGFzIGludC4gIFRjbCBtb2R1bGUKICAgICAgICAgICAgbm93IHVzZXMgVGNsX0dldExvbmdGcm9tT2JqIHRvIGNvbnZlcnQgaW50ZWdlciB2YWx1ZXMuCgowOC8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzc1OTg5IF0gbnVtZXJpYyB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLiAgIFRoZXJlIHdlcmUKICAgICAgICAgICAgc29tZSBlcnJvcnMgaW4gdGVtcGxhdGUgZXhwYW5zaW9uIHJlbGF0ZWQgdG8gdGhlIHVzZSBvZgogICAgICAgICAgICBhcnJheXMgd2hlcmUgdGhlIGFycmF5IGRpbWVuc2lvbiB3YXMgYSB0ZW1wbGF0ZSBwYXJhbWV0ZXIuCiAgICAgICAgICAgIEl0IHNob3VsZCB3b3JrIG5vdy4gIFJlcG9ydGVkIGJ5IEJyeWFuIEdyZWVuLgoKMDgvMTAvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgQWRkZWQgYSBkaXJlY3RvciB0eXBlbWFwIChvdXR2KSBmb3IgcmV0dXJuIGJ5IHZhbHVlIGFuZCBjbGVhbmVkIHVwIHVwIGEgZmV3IAoJICAgIG9mIHRoZSBjb21tZW50ZWQgZGlyZWN0b3IgdHlwZW1hcHMuCgowOC8xMC8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBGaXhlZCBjb25zdHJ1Y3RvciBnZW5lcmF0aW9uIGZvciBkaXJlY3RvciBjbGFzc2VzIHRvIGlnbm9yZSBwcml2YXRlCgkgICAgY29uc3RydWN0b3JzLiAgUHJvdGVjdGVkIGNvbnN0cnVjdG9ycyBhcmUgYWxzbyBpZ25vcmVkIGZvciBub3csIHBlbmRpbmcKCSAgICBhIHNvbHV0aW9uIHRvIHRoZSBwcm9ibGVtIG9mIHdyYXBwaW5nIGNsYXNzZXMgdGhhdCBvbmx5IGRlZmluZSBwcm90ZWN0ZWQKCSAgICBjb25zdHJ1Y3RvcnMuCgowOC8wNy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgTmV3IGNvbW1hbmRsaW5lIG9wdGlvbiAtb3V0ZGlyIDxkaXI+IHRvIHNwZWNpZnkgd2hlcmUgdGhlIGxhbmd1YWdlIHNwZWNpZmljCiAgICAgICAgICAgIGZpbGVzIGFyZSB0byBiZSBnZW5lcmF0ZWQuIFRoaXMgaXMgdXNlZnVsIGZvciB0YXJnZXQgbGFuZ3VhZ2VzIGxpa2UgUHl0aG9uLAogICAgICAgICAgICBKYXZhIGV0YyB3aGljaCBnZW5lcmF0ZSBwcm94eSBmaWxlcyBpbiB0aGUgYXBwcm9wcmlhdGUgbGFuZ3VhZ2UuCiAgICAgICAgICAgIFRoaXMgb3B0aW9uIGRvZXMgbm90IGFwcGx5IHRvIHRoZSBDL0MrKyB3cmFwcGVyIGZpbGUuCgowOC8wNy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgT24gV2luZG93cyB0aGUgZ2VuZXJhdGVkIGZpbGVzIChvdGhlciB0aGFuIHRoZSBfd3JhcC5jIG9yIF93cmFwLmN4eCBmaWxlcykKICAgICAgICAgICAgd2VyZSBzb21ldGltZXMgaW5jb3JyZWN0bHkgYmVpbmcgZ2VuZXJhdGVkIGludG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHVubGVzcwogICAgICAgICAgICB0aGUgaW5wdXQgZmlsZSB1c2VkIHRoZSBVbml4IHBhdGggc2VwYXJhdG9yLiBUaGUgV2luZG93cyBwYXRoIHNlcGFyYXRvciAKICAgICAgICAgICAgc2hvdWxkIG5vdyBiZSB1c2VkLiBCdWcgcmVwb3J0ZWQgYnkgUm9iZXJ0IERhdmllcy4KCjA4LzA3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgYXJyYXkgdmFyaWFibGUgc2V0IHR5cGVtYXAgdG8gUGVybCBtb2R1bGUuCgowOC8wNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzc1Njc3IF0gQXJyYXkgaW5pdCBjYXVzZXMgY29kZWdlbiBidWcuLgoKMDgvMDcvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc3OTA2MiBdIENsYXNzIlxuIjo6Zm9vIG5vdCBzdXBwb3J0ZWQuICBTV0lHCiAgICAgICAgICAgIHNob3VsZCBub3cgY29ycmVjdGx5IGhhbmRsZSB3aGl0ZXNwYWNlIGluIGJldHdlZW4gCiAgICAgICAgICAgIG5hbWVzcGFjZSBxdWFsaWZpZXJzLiAgRm9yIGV4YW1wbGUgIkEgOjogRm9vIDo6IEJhciIuCiAgICAgICAgICAgIAowNy8zMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4ZXMgZm9yIHBhcmFtZXRlcnMgd2hpY2ggYXJlIGNsYXNzZXMgdGhhdCBhcmUgcGFzc2VkIGJ5IHZhbHVlIGFuZCBoYXZlIAogICAgICAgICAgICBhIGRlZmF1bHQgdmFsdWUuIEEgY29weSBjb25zdHJ1Y3RvciBmb3IgU3dpZ1ZhbHVlV3JhcHBlciBpcyByZXF1aXJlZCAKICAgICAgICAgICAgKFNGICM3ODAwNTYpLiBBbHNvIGZpeGVkIG1lbW9yeSBsZWFrIGluIHRoZXNlIGNpcmN1bXN0YW5jZXMuIFRoZXNlIG1vZHMKICAgICAgICAgICAgYWxzbyBmaXggU0YgIzc4MDA1NC4KCjA3LzI4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgSW1wcm92ZWQgcnVuLXRpbWUgZXJyb3IgbWVzc2FnZSBmb3IgcG9pbnRlcnMgaW4gUHl0aG9uIG1vZHVsZS4KICAgICAgICAgICAgQ29udHJpYnV0ZWQgYnkgWm9va28uCgowNy8xMC8yMDAzOiBiYWxsYWJpbyAoTHVpZ2kgQmFsbGFiaW8pCiAgICAgICAgICAgIFtBbG1vc3QgYWxsIGxhbmd1YWdlc10gV3JhcHBlcnMgZm9yIHN0ZDo6cGFpciBhZGRlZC4KCSAgICBUeXBlbWFwcyBmb3IgUHl0aG9uLCBSdWJ5LCBHdWlsZSBhbmQgTXpTY2hlbWUuCgowNy8wMS8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0NoaWNrZW5dIEhhbmRsZSB0aGUgY2FzZSBvZiBtb3JlIHRoYW4gb25lIGFyZ291dCB0eXBlbWFwCgkgICAgcGVyIGZ1bmN0aW9uLgoKMDYvMjkvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhLCBDI10gU0YgIzY3MDk0OSByZXF1ZXN0LiBUaGUgZGVzdHJ1Y3RvciB3cmFwcGVyIGZ1bmN0aW9uIG5hbWUgaXMgbm93IAogICAgICAgICAgICBjb25maWd1cmFibGUuICBBIG5ldyBhdHRyaWJ1dGUgY2FsbGVkIG1ldGhvZG5hbWUgaW4gdGhlIAogICAgICAgICAgICBqYXZhZGVzdHJ1Y3QvamF2YWRlc3RydWN0X2Rlcml2ZWQgKEphdmEpIG9yIGNzZGVzdHJ1Y3QvY3NkZXN0cnVjdF9kZXJpdmVkIChDIykKICAgICAgICAgICAgdHlwZW1hcHMgc3BlY2lmaWVzIHRoZSBtZXRob2QgbmFtZS4gRm9yIGV4YW1wbGUgaW4gSmF2YSB0aGUgZGVzdHJ1Y3RvciBpcyAKICAgICAgICAgICAgd3JhcHBlZCBieSBkZWZhdWx0IHdpdGggdGhlIGRlbGV0ZSBtZXRob2Q6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWRlc3RydWN0LCBtZXRob2RuYW1lPSJkZWxldGUiKSBTV0lHVFlQRSB7Li4ufQoKMDYvMjcvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhLCBDI10gVGhlIHRocm93cyBhdHRyaWJ1dGUgZm9yIGFkZGluZyBleGNlcHRpb24gY2xhc3NlcyB0byB0aGUgdGhyb3dzCiAgICAgICAgICAgIGNsYXVzZSBhbHNvIG5vdyB3b3JrcyB3aXRoIHRoZSBmb2xsb3dpbmcgdHlwZW1hcHM6IAogICAgICAgICAgICBuZXdmcmVlCiAgICAgICAgICAgIGphdmFpbiwgamF2YW91dCAoSmF2YSkKICAgICAgICAgICAgY3NpbiwgY3NvdXQgKEMjKQoKICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHRoZSAnQW5FeGNlcHRpb24nIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHRocm93cyBjbGF1c2UgaW4gdGhlCiAgICAgICAgICAgIHByb3h5IGZ1bmN0aW9uOgoKICAgICAgICAgICAgJXR5cGVtYXAoamF2YW91dCwgdGhyb3dzPSJBbkV4Y2VwdGlvbiIpIGludCB7CiAgICAgICAgICAgICAgICBpbnQgcmV0dXJuVmFsdWU9JGpuaWNhbGw7CiAgICAgICAgICAgICAgICBpZiAocmV0dXJuVmFsdWU9PTApIHRocm93IG5ldyBBbkV4Y2VwdGlvbigiVmFsdWUgbXVzdCBub3QgYmUgemVybyIpOwogICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwogICAgICAgICAgICB9CgowNi8yNS8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBbUHl0aG9uXSBEaXJlY3RvciB0eXBlbWFwIG1hcnNoYWxsaW5nIGNoZWNrcyBmb3IgbnVsbCBwb2ludGVycyB3aGVuCgkgICAgd2Fsa2luZyB0aGUgcGFyYW1ldGVyIGxpc3QgaW5zdGVhZCBvZiByZWx5aW5nIHNvbGV5IG9uIHRoZSBwYXJhbWV0ZXIKCSAgICBjb3VudC4gIEN1cmVzIGEgc2VnZmF1bHQgdGhhdCBvY2N1cnJlZCBmb3IgbXVsdGlwbGUgYXJndW1lbnQgaW52IHR5cGVtYXBzLgoJICAgIFNvbWVvbmUgd2l0aCBtb3JlIFN3aWcgZXhwZXJpZW5jZSBzaG91bGQgcHJvYmFibHkgcmV2aWV3IHRoaXMgY29kZS4KCjA2LzI0LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbQ2hpY2tlbl0gRG9uJ3QgZW1pdCBjYWxscyB0byAiQ19jaGVja19mb3JfaW50ZXJydXB0IiwKCSAgICB3aGljaCBtYXkgcmVzdWx0IGluIGFuIGVuZGxlc3MgbG9vcC4gIFBhdGNoIGJ5IGZlbGl4QHByb3hpbWEtbXQuZGUuCgowNi8yMC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBGaW5hbGl6ZXJzIG5vdyB1c2UgZGVzdHJ1Y3RvciBzeW50YXggYXMgdGhlIG92ZXJyaWRlIHdoaWNoIHdhcyB1c2VkIGluIAogICAgICAgICAgICB0aGUgRmluYWxpemUgbWV0aG9kIGlzIG5vdCBpbiB0aGUgRUNNQSBzdGFuZGFyZHMsIHNwb3R0ZWQgYnkgdGhlIE1TIGNvbXBpbGVyLgoKMDYvMTAvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gQSBudW1iZXIgb2YgY2hhbmdlcyBoYXZlIGJlZW4gbWFkZSB0byByZW1vdmUgdGhlIEphdmEgbmFtaW5nIAogICAgICAgICAgICB0aGF0IHdhcyB1c2VkIGluIHRoZSBDIyBtb2R1bGUuCiAgICAgICAgICAgIAogICAgICAgICAgICBUeXBlbWFwIG5hbWUgY2hhbmdlczoKICAgICAgICAgICAgam5pICAgICAgICAgICAgICAgICAgICAgICAgIC0+IGN0eXBlCiAgICAgICAgICAgIGp0eXBlICAgICAgICAgICAgICAgICAgICAgICAtPiBpbXR5cGUKICAgICAgICAgICAganN0eXBlICAgICAgICAgICAgICAgICAgICAgIC0+IGNzdHlwZQogICAgICAgICAgICBqYXZhaW4gICAgICAgICAgICAgICAgICAgICAgLT4gY3NpbgogICAgICAgICAgICBqYXZhb3V0ICAgICAgICAgICAgICAgICAgICAgLT4gY3NvdXQKICAgICAgICAgICAgamF2YWludGVyZmFjZXMgICAgICAgICAgICAgIC0+IGNzaW50ZXJmYWNlcwogICAgICAgICAgICBqYXZhYmFzZSAgICAgICAgICAgICAgICAgICAgLT4gY3NiYXNlCiAgICAgICAgICAgIGphdmFjbGFzc21vZGlmaWVycyAgICAgICAgICAtPiBjc2NsYXNzbW9kaWZpZXJzCiAgICAgICAgICAgIGphdmFjb2RlICAgICAgICAgICAgICAgICAgICAtPiBjc2NvZGUKICAgICAgICAgICAgamF2YWltcG9ydHMgICAgICAgICAgICAgICAgIC0+IGNzaW1wb3J0cwogICAgICAgICAgICBqYXZhcHRyY29uc3RydWN0b3Jtb2RpZmllcnMgLT4gY3NwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycwogICAgICAgICAgICBqYXZhZ2V0Y3B0ciAgICAgICAgICAgICAgICAgLT4gY3NnZXRjcHRyCiAgICAgICAgICAgIGphdmFmaW5hbGl6ZSAgICAgICAgICAgICAgICAtPiBjc2ZpbmFsaXplCgogICAgICAgICAgICBGZWF0dXJlIG5hbWUgY2hhbmdlczoKICAgICAgICAgICAgamF2YWNvbnN0ICAgICAgICAgICAgICAgICAgIC0+IGNzY29uc3QKICAgICAgICAgICAgamF2YW1ldGhvZG1vZGlmaWVycyAgICAgICAgIC0+IGNzbWV0aG9kbW9kaWZpZXJzCgogICAgICAgICAgICBQcmFnbWEgY2hhbmdlczoKICAgICAgICAgICAgcHJhZ21hKGphdmEpICAgICAgICAgICAgICAgIC0+IHByYWdtYShjc2hhcnApCiAgICAgICAgICAgIGpuaWNsYXNzYmFzZSAgICAgICAgICAgICAgICAtPiBpbWNsYXNzYmFzZQogICAgICAgICAgICBqbmljbGFzc2NsYXNzbW9kaWZpZXJzICAgICAgLT4gaW1jbGFzc2NsYXNzbW9kaWZpZXJzCiAgICAgICAgICAgIGpuaWNsYXNzY29kZSAgICAgICAgICAgICAgICAtPiBpbWNsYXNzY29kZQogICAgICAgICAgICBqbmljbGFzc2ltcG9ydHMgICAgICAgICAgICAgLT4gaW1jbGFzc2ltcG9ydHMKICAgICAgICAgICAgam5pY2xhc3NpbnRlcmZhY2VzICAgICAgICAgIC0+IGltY2xhc3NpbnRlcmZhY2VzCgogICAgICAgICAgICBTcGVjaWFsIHZhcmlhYmxlIG5hbWUgY2hhbmdlczoKICAgICAgICAgICAgJGphdmFjbGFzc25hbWUgICAgICAgICAgICAgIC0+ICRjc2NsYXNzbmFtZQogICAgICAgICAgICAkamF2YWlucHV0ICAgICAgICAgICAgICAgICAgLT4gJGNzaW5wdXQKICAgICAgICAgICAgJGpuaWNhbGwgICAgICAgICAgICAgICAgICAgIC0+ICRpbWNhbGwKCiAgICAgICAgICAgIFRoaXMgd2lsbCBicmVhayBTV0lHIGludGVyZmFjZSBmaWxlcyB0aGF0IHVzZSB0aGVzZSB0eXBlbWFwcywgZmVhdHVyZXMKICAgICAgICAgICAgYW5kIHByYWdtYXMuIFBsZWFzZSB1cGRhdGUgeW91ciBjb2RlIG9yIHVzZSBtYWNyb3MgZm9yIGJhY2t3YXJkcwogICAgICAgICAgICBjb21wYXRpYmlsaXR5LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEMjIE1PRFVMRSAqKioKCjA2LzEwLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbTXpTY2hlbWVdIEFwcGxpZWQgTXpTY2hlbWUgbW9kdWxlIHVwZGF0ZXMgY29udHJpYnV0ZWQgYnkKCSAgICBKb2huIExlbnogPGplbGVuekBzdHVkZW50cy53aXNjLmVkdT4uCgogICAgICAgICAgICAtIFVwZGF0ZWQgbXpzY2hlbWUgdG8gdXNlIFNXSUcncyBjb21tb24gcnVudGltZSB0eXBlCiAgICAgICAgICAgICAgc3lzdGVtIGZyb20gY29tbW9uLnN3Zy4gCgoJICAgIC0gVGhlIExpYi9tenNjaGVtZSBkaXJlY3RvcnkgaGFzIGJlZW4gcmVvcmdhbml6ZWQgdG8KICAgICAgICAgICAgICBzdGFuZGFyZGl6ZSBuYW1lcyBhY3Jvc3MgdGhlIGxhbmd1YWdlIG1vZHVsZXM6CiAgICAgICAgICAgICAgbXpzY2hlbWUuaSB3YXMgbW92ZWQgdG8gbXpzY2hlbWUuc3dnLCBtenNjaGVtZS5zd2cgYW5kCiAgICAgICAgICAgICAgbXpzY2hlbWVkZWMuc3dnIGhhdmUgYmVlbiByZW1vdmVkLCBtenJ1bi5zd2cgKHdoaWNoCiAgICAgICAgICAgICAgY29udGFpbnMgdGhlIHJ1bnRpbWUgY29kZSkgaGFzIGJlZW4gYWRkZWQuCgogICAgICAgICAgICAtIFRoZSBzd2lnX3Byb3h5IHN0cnVjdHVyZSB3YXMgcmVuYW1lZCB0byBzd2lnX216X3Byb3h5LgogICAgICAgICAgICAgIHN3aWdfbXpfcHJveHkgbm93IGNvbnRhaW5zIGEgcG9pbnRlciB0byBhIHN3aWdfdHlwZV9pbmZvCiAgICAgICAgICAgICAgc3RydWN0dXJlLiAgCgoJICAgIC0gQWRkZWQgdmFyaW4gYW5kIHZhcm91dCB0eXBlbWFwcyBmb3IgU1dJR1RZUEUgW10gYW5kCiAgICAgICAgICAgICAgU1dJR1RZUEUgJi4KCgkgICAgLSBHYXJiYWdlIGNvbGxlY3Rpb24gYnkgY2FsbGluZyBzY2hlbWVfYWRkX2ZpbmFsaXplcigpIGhhcwogICAgICAgICAgICAgIGJlZW4gYWRkZWQuCgoJICAgICoqKiBORVcgRkVBVFVSRSBbTXpTY2hlbWVdICoqKgoKMDYvMTAvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBOZXcgdHlwZW1hcHM6IGphdmFkZXN0cnVjdCBhbmQgamF2YWRlc3RydWN0X2Rlcml2ZWQKICAgICAgICAgICAgZm9yIHRoZSBDKysgZGVzdHJ1Y3RvciB3cmFwcGVyLiBUaGUgamF2YWRlc3RydWN0IHZlcnNpb24gZ2V0cyB1c2VkIGJ5CiAgICAgICAgICAgIGNsYXNzZXMgYXQgdGhlIHRvcCBvZiBhbiBpbmhlcml0YW5jZSBjaGFpbiBhbmQgdGhlIGphdmFkZXN0cnVjdF9kZXJpdmVkIAogICAgICAgICAgICB2ZXJzaW9uIGdldHMgdXNlZCBieSBvdGhlciBjbGFzc2VzLgoKICAgICAgICAgICAgW0MjXSBjaWxkaXNwb3NlIGFuZCBjaWxkaXNwb3Nlb3ZlcnJpZGUgdHlwZW1hcHMgcmVwbGFjZWQgYnkKICAgICAgICAgICAgY3NkZXN0cnVjdCBhbmQgY3NkZXN0cnVjdF9kZXJpdmVkIHR5cGVtYXBzLiBUaGUgZGVsZXRlKCkKICAgICAgICAgICAgbWV0aG9kIGhhcyBiZWVuIHJlbW92ZWQgYW5kIGl0cyBmdW5jdGlvbmFsaXR5IHB1dCBpbnRvIHRoZXNlCiAgICAgICAgICAgIHR5cGVtYXBzIGRlc2lnbmVkIGZvciB0aGUgRGlzcG9zZSgpIG1ldGhvZC4KCiAgICAgICAgICAgIC0gTmV3IHR5cGVtYXBzIGNzaW50ZXJmYWNlcyBhbmQgY3NpbnRlcmZhY2VzX2Rlcml2ZWQgcmVwbGFjZQogICAgICAgICAgICB0aGUgamF2YWludGVyZmFjZXMgdHlwZW1hcC4gQWxzbyBmaXhlcyB0aGUgcGVjdWxpYXJpdHkgb2YgYWxsIGNsYXNzZXMKICAgICAgICAgICAgaW4gYW4gaW5oZXJpdGFuY2UgY2hhaW4gaW5kaXZpZHVhbGx5IGRlcml2aW5nIGZyb20gdGhlIElEaXNwb3NhYmxlIAogICAgICAgICAgICBpbnRlcmZhY2UuCgogICAgICAgICAgICAtIE5ldyB0eXBlbWFwIGNzZmluYWxpemUgZm9yIGZpbmFsaXplcnMuIEMrKyBkZXN0cnVjdG9ycyBhcmUgbm93IGNhbGxlZAogICAgICAgICAgICBieSBnYXJiYWdlIGNvbGxlY3RvciBkdXJpbmcgZmluYWxpemF0aW9uLiBQcm9ibGVtIHJlcG9ydGVkIGJ5IAogICAgICAgICAgICBBbmRyZWFzIFNjaPZyay4KCjA2LzEwLzIwMDM6IFRpZ2VyCgkgICAgTW9kaWZpZWQgY29udHJhY3QgY29kZSBmb3IgZXJyb3IgbWVzc2FnZSBvdXRwdXQuCiAgICAgICAgICAgIENvbnRyYWN0IGNvZGUgY2FuIG5vdyBwcmludCBvdXQgc2ltcGxlIGVycm9yIG1lc3NhZ2UuCiAgICAgICAgICAgIE1vZGlmaWVkIGNvbnRyYWN0IGNvZGUgdG8gcHJlcGFyZSBmb3IgaW5oZXJpdGFuY2UKICAgICAgICAgICAgCjA2LzAzLzIwMDM6IG1rb2VwcGUKCSAgICBbR3VpbGVdIEFwcGxpZWQgR3VpbGUgbW9kdWxlIHVwZGF0ZXMgY29udHJpYnV0ZWQgYnkgCgkgICAgSm9obiBMZW56IDxqZWxlbnpAc3R1ZGVudHMud2lzYy5lZHU+LiAKCgkgICAgLSBTV0lHIGN1cnJlbnRseSB1c2VzIEd1aWxlJ3MgZ2hfIEFQSSwgd2hpY2ggaXMgbWFya2VkIGFzCgkgICAgICBkZXByZWNhdGVkIGluIEd1aWxlIDEuNiBhbmQgd2lsbCBiZSByZW1vdmVkIGluIEd1aWxlCgkgICAgICAxLjkuICBUaGlzIGNoYW5nZSBpbnRyb2R1Y2VzIGEgY29tbWFuZC1saW5lIGZsYWcgIi1zY20iCgkgICAgICB3aGljaCBjYXVzZXMgU1dJRyB0byBnZW5lcmF0ZSB3cmFwcGVycyB0aGF0IHVzZSBHdWlsZSdzCgkgICAgICBTQ00gQVBJIGluc3RlYWQ7IHRoaXMgcmVxdWlyZXMgR3VpbGUgPj0gMS42LgoJICAgIAoJICAgIC0gVGhlIExpYi9ndWlsZSBkaXJlY3RvcnkgaGFzIGJlZW4gcmVvcmdhbml6ZWQgdG8KICAgICAgICAgICAgICBzdGFuZGFyZGl6ZSBuYW1lcyBhY3Jvc3MgbGFuZ3VhZ2UgbW9kdWxlczogZ3VpbGVkZWMuc3dnCiAgICAgICAgICAgICAgYW5kIGd1aWxlLnN3ZyBoYXZlIGJlZW4gbW92ZWQgaW50byBndWlsZV9naF9ydW4uc3dnLAogICAgICAgICAgICAgIGd1aWxlLmkgaGFzIGJlZW4gbW92ZWQgdG8gZ3VpbGVfZ2guc3dnLCBndWlsZV9zY20uc3dnCiAgICAgICAgICAgICAgYW5kIGd1aWxlX3NjbV9ydW4uc3dnIHdoaWNoIGNvbnRhaW4gdGhlIFNDTSBBUEkgc3R1ZmYKICAgICAgICAgICAgICBoYXZlIGJlZW4gYWRkZWQKCgkgICAgLSBnaGludGVyZmFjZS5pLCB3aGljaCBjb250YWlucyB0aGUgZGVmaW5lcyBmcm9tIHRoZSBnaF8KICAgICAgICAgICAgICBmdW5jdGlvbnMgdG8gdGhlIHNjbV9mdW5jdGlvbnMgaGFzIGJlZW4gYWRkZWQKCgkgICAgLSBUaGUgQVBJIGZvciBkZWFsaW5nIHdpdGggcG9pbnRlciBvYmplY3RzIGlzIG5vdwoJICAgICAgU1dJR19Db252ZXJ0UHRyLCBTV0lHX011c3RHZXRQdHIsIFNXSUdfTmV3UG9pbnRlck9iai4KCiAgICAgICAgICAgIC0gQWRkZWQgdmFyaW4gYW5kIHZhcm91dCB0eXBlbWFwcyBmb3IgU1dJR1RZUEUgW10gYW5kIFNXSUdUWVBFICYKCiAgICAgICAgICAgIC0gR2FyYmFnZSBjb2xsZWN0aW9uIGhhcyBiZWVuIGFkZGVkLgoKICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFIFtHdWlsZV0gKioqCgkgICAgCQowNi8wMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRGltZW5zaW9ubGVzcyBhcnJheXMgc3VjaCBhcyAKCiAgICAgICAgICAgICAgICBpbnQgZm9vW10gPSB7MSwgMn07CiAgICAgICAgICAgICAgICBleHRlcm4gaW50IGJhcltdOwoKICAgICAgICAgICAgcHJvZHVjZSBhIHdhcm5pbmcgdGhhdCB0aGUgdmFyaWFibGUgaXMgcmVhZC1vbmx5LiBEZXBlbmRpbmcgb24gdGhlIHRhcmdldAogICAgICAgICAgICBsYW5ndWFnZSwgdGhpcyB1c2VkIHRvIGNhdXNlIGNvbXBpbGUgZXJyb3JzIG9yIGdlbmVyYXRlIGEgc2V0dGVyIHRoYXQKICAgICAgICAgICAgZ2VuZXJhdGVkIGEgcnVudGltZSBlcnJvci4gQSBzZXR0ZXIgY2Fubm90IGJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCiAgICAgICAgICAgIGJlY2F1c2UgdGhlIGFycmF5IHNpemUgY2Fubm90IGJlIGRldGVybWluZWQgYnkgU1dJRy4gQSB2YXJpbiwgZ2xvYmFsaW4gCiAgICAgICAgICAgIG9yIG1lbWJlcmluIHR5cGVtYXAgKGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0IGxhbmd1YWdlKSBtdXN0IGJlIHdyaXR0ZW4gCiAgICAgICAgICAgIGJ5IHRoZSB1c2VyLgoKMDUvMjkvMjAwMzogYmVhemxleQogICAgICAgICAgICBSZWZpbmVtZW50IHRvIGRlZmF1bHQgdHlwZW1hcCBtYXRjaGluZyBhbmQgYXJyYXlzLiAgV2hlbiBhbgogICAgICAgICAgICBhcnJheSBpcyBkZWNsYXJlZCBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICAgICAgIGludCBmb29bNF07CgogICAgICAgICAgICBUaGUgZGVmYXVsdCB0eXBlbWFwIG5vdyByZXNvbHZlcyB0byAKCiAgICAgICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgW0FOWV0KCiAgICAgICAgICAgIElmIG5vIG1hdGNoIGlzIGZvdW5kIGZvciB0aGF0LCBpdCB0aGVuIHJlc29sdmVzIHRvCgogICAgICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFIFtdCgogICAgICAgICAgICBJZiBubyBhcnJheSBkaW1lbnNpb24gaXMgc3BlY2lmaWVkIGluIHRoZSBvcmlnaW5hbCBkZWNsYXJhdGlvbiwKICAgICAgICAgICAgdGhlIFNXSUdUWVBFIFtdIGlzIHVzZWQgcmlnaHQgYXdheS4gCgogICAgICAgICAgICBOb3RlOiBUaGlzIGNoYW5nZSBoYXMgYmVlbiBtYWRlIHRvIHJlc29sdmUgcHJvYmxlbXMgcmVsYXRlZCB0bwogICAgICAgICAgICBhcnJheXMgd2l0aCBhbmQgd2l0aG91dCBkaW1lbnNpb25zLiAgRm9yIGV4YW1wbGUsIHNvbWV0aW1lcyBTV0lHCiAgICAgICAgICAgIHdhcyBnZW5lcmF0aW5nIHNldHRlciBmdW5jdGlvbnMgZm9yIGFycmF5IHZhcmlhYmxlcyB3aXRoIG5vIGRpbWVuc2lvbnMKICAgICAgICAgICAgKGFuIGVycm9yKS4gTGlrZXdpc2UsIFNXSUcgc29tZXRpbWVzIG1hZGUgYXJyYXlzIHdpdGggZGltZW5zaW9ucwogICAgICAgICAgICByZWFkLW9ubHkgKGFsc28gYW4gZXJyb3IpLiAgVGhpcyBmaXhlcyB0aGUgYXJyYXlzX2dsb2JhbCB0ZXN0CiAgICAgICAgICAgIHByb2JsZW0uCiAgICAgICAgICAgICAgICAgICAgICAgIAowNS8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN1YnRsZSB0eXBlIGhhbmRsaW5nIGJ1ZyB3aXRoIHJlZmVyZW5jZXMgYW5kIHBvaW50ZXJzLgogICAgICAgICAgICBJZiB5b3UgaGFkIGZ1bmN0aW9ucyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICB0eXBlZGVmIEZvbyBCYXI7CgogICAgICAgICAgICAgICAgICBGb28gKmZ1bmMxKCk7CiAgICAgICAgICAgICAgICAgIHZvaWQgZnVuYzIoQmFyICZ4KTsKCiAgICAgICAgICAgIFRoZW4gZnVuYzIoKSB3b3VsZG4ndCBhY2NlcHQgb2JqZWN0cyByZXR1cm5lZCBieSBmdW5jMSgpCiAgICAgICAgICAgIGJlY2F1c2Ugb2YgYSB0eXBlIGVycm9yLiAgIEl0IHNob3VsZCB3b3JrIG5vdy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQnJpYW4gWWFuZy4KCjA1LzIxLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXhlcyB0byBzb21lIG9mIHRoZSBWaXN1YWwgQysrIGV4YW1wbGUgcHJvamVjdCBmaWxlcyB3aGljaCB3b3VsZCBub3QgCiAgICAgICAgICAgIHdvcmsgd2l0aCBzcGFjZXMgaW4gdGhlIHBhdGhzIGhlbGQgaW4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyB1c2VkIHRvIAogICAgICAgICAgICBwb2ludCB0byB0aGUgdGFyZ2V0IGxhbmd1YWdlJ3MgbGlicmFyeSAvIGluY2x1ZGUgZGlyZWN0b3J5LgogICAgICAgICAgICBTRiBidWcgIzc0MDc2OQoKMDUvMjEvMjAwMzogIHNvbmd5YW5mIChUaWdlcikKICAgICAgICAgICAgQWRkZWQgLWNvbnRyYWN0cyBvcHRpb24uCiAgICAgICAgICAgIEZpcnN0IHRyeSBvZiB0aGUgaWRlYSBvZiAiV3JhcCBieSBDb250cmFjdCI6IAogICAgICAgICAgICBidWlsZCB1cCByZWFsaWFibGUgY3Jvc3MtbGFuZ3VhZ2UgbW9kdWxlIGJ5IHdyYXBwaW5nIHdpdGggU1dJRy4KICAgICAgICAgICAgSW1wbGVtZW50ZWQgYmFzaWMgYXNzZXJ0aW9uCiAgICAgICAgICAgIChwcmVhc3NlcnRpb24gJiBwb3N0YXNzZXJ0aW9uICYgaW52YXJpYW50KQogICAgICAgICAgICBmb3Igc2ltcGxlIEMvQysrIGZ1bmN0aW9ucy4KICAgICAgICAgICAgCiAgICAgICAgICAgIEN1cnJlbnQgZm9ybWF0IG9mIGNvbnRyYWN0cyBhcmU6CiAgICAgICAgICAgICVjb250cmFjdCBjbGFzc19uYW1lIDo6IGZ1bmNfbmFtZSAocGFyYXMuLi4pIHsKICAgICAgICAgICAgcmVxdWlyZToKICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZXhwcnM7CiAgICAgICAgICAgICAgICAgICBleHByczsKICAgICAgICAgICAgZW5zdXJlOgogICAgICAgICAgICAgICAgICAgYm9vbGVhbiBleHByOwogICAgICAgICAgICAgICAgICAgZXhwcnM7CiAgICAgICAgICAgIGludmFyaWFudDoKICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZXhwcjsKICAgICAgICAgICAgICAgICAgIGV4cHJzOwogICAgICAgICAgICB9CgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgkgICAgCQowNS8xOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgQnVpbGQgdHdlYWtzLiBUaGVyZSB3ZXJlIGEgZmV3IHByZXByb2Nlc3NvciBkZWZpbml0aW9ucyB3aGljaCB3ZXJlCiAgICAgICAgICAgIHNwZWNpZmllZCBpbiB0aGUgTWFrZWZpbGUgZm9yIHBhc3Npbmcgb24gdGhlIGNvbW1hbmRsaW5lIHdoZW4gY29tcGlsaW5nLgogICAgICAgICAgICBUaGVzZSBhcmUgbm93IGFsbCBkZWZpbmVkIGluIHN3aWdjb25maWcuaC4gQXV0b2NvbmYgZG9lc24ndCBub3JtYWxseSAKICAgICAgICAgICAgYWxsb3cgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzIHRvIGJlIGRlZmluZWQgaW4gdGhpcyBjb25maWcgaGVhZGVyIGZpbGUsIAogICAgICAgICAgICBidXQgYW4gYXV0b2NvbmYgYXJjaGl2ZSBtYWNybyBlbmFibGVzIHRoaXMuIFRoaXMgbWFjcm8gYWxvbmcgd2l0aCBmdXR1cmUgCiAgICAgICAgICAgIGF1dG9jb25mIG1hY3JvcyBhcmUgZ29pbmcgdG8gYmUgcHV0IGluIHRoZSBUb29scy9jb25maWcgZGlyZWN0b3J5LgoKICAgICAgICAgICAgJ3N3aWcgLXZlcnNpb24nIG5vdyByZXBvcnRzIHRoZSB0YXJnZXQgYnVpbGQgcGxhdGZvcm0uCgowNS8xMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjIGFuZCBKYXZhXSBGaXggdG8gdGhlIGZvbGxvd2luZyB0eXBlbWFwczoKCiAgICAgICAgICAgIGphdmFiYXNlLCBqYXZhaW50ZXJmYWNlcywgamF2YWltcG9ydHMsIGphdmFjbGFzc21vZGlmaWVycywKICAgICAgICAgICAgamF2YXB0cmNvbnN0cnVjdG9ybW9kaWZpZXJzLCBqYXZhZmluYWxpemUsIGphdmFnZXRjcHRyICYgamF2YWNvZGUuCgogICAgICAgICAgICBUaGVzZSBhcmUgdGhlIHR5cGVtYXBzIGZvciBtb2RpZnlpbmcvZ2VuZXJhdGluZyBwcm94eSBjbGFzc2VzLgogICAgICAgICAgICBQcmV2aW91c2x5IHRoZSB0eXBlbWFwcyB3b3VsZCB1c2UgdGhlIHByb3h5IGNsYXNzIG5hbWUgYW5kIG5vdCB0aGUgCiAgICAgICAgICAgIEMrKyB0eXBlLCB3aGljaCB3YXMgaW5jb25zaXN0ZW50IHdpdGggYWxsIG90aGVyIHR5cGVtYXBzLiAKCiAgICAgICAgICAgIEluIG1vc3QgY2lyY3Vtc3RhbmNlcyB0aGUgcHJveHkgY2xhc3MgbmFtZSBhbmQgdGhlIEMrKyBjbGFzcyBuYW1lL3R5cGUgCiAgICAgICAgICAgIGlzIHRoZSBzYW1lIGV4Y2VwdCBmb3IgY2xhc3NlcyBpbiBuYW1lc3BhY2UsIHRlbXBsYXRlZCBjbGFzc2VzIGV0Yy4gc28KICAgICAgICAgICAgdGhpcyBzaG91bGRuJ3QgYWZmZWN0IG1vc3QgY2FzZXMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBhbmQgQyMgTU9EVUxFUyAqKioKCjA1LzA5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBWaXN1YWwgQysrIFByb2plY3QgZmlsZXMgaGF2ZSBiZWVuIGFkZGVkIHNvIHRoYXQgdGhlIHJ1bnRpbWUgbGlicmFyaWVzCiAgICAgICAgICAgIGNhbiBiZSBidWlsdCBvbiBXaW5kb3dzIChmb3IgVGNsLCBQZXJsLCBQeXRob24gYW5kIFJ1YnkpLgoKMDUvMDEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggcmV0dXJuIGJ5IHZhbHVlLCBjb25zdCwgYW5kIHByaXZhdGUgY29uc3RydWN0b3JzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBjbGFzcyBCIHsKICAgICAgICAgICAgICAgIHByaXZhdGU6CiAgICAgICAgICAgICAgICAgICBCKCk7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICBCKGNvbnN0IEImKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgY2xhc3MgQSB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIGNvbnN0IEIgcmV0dXJuQigpIGNvbnN0OwogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgUHJvYmxlbSBhbmQgcGF0Y2ggc3VnZ2VzdGlvbiByZXBvcnRlZCBieSBCaWxsIEhvZmZtYW4uCgowNC8yOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgQnVpbGQgY2hhbmdlczoKICAgICAgICAgICAgLSBTaW5nbGUgYXV0b2NvbmYgaW52b2NhdGlvbiAtIGF1dG9jb25mIGluIHRoZSBUb29scyBkaXJlY3RvcnkgaGFzIGdvbmUuCgogICAgICAgICAgICAtIExpYnRvb2wgYm9vdHN0cmFwcGVkIHdoZW4gcnVubmluZyBhdXRvZ2VuLnNoLiBUaGlzIHJlcXVpcmVzIGFueW9uZQogICAgICAgICAgICAgIHVzaW5nIHRoZSBjdnMgdmVyc2lvbiBvZiBTV0lHIHRvIGhhdmUgbGlidG9vbCBpbnN0YWxsZWQgb24gdGhlaXIKICAgICAgICAgICAgICBtYWNoaW5lLiBTdWdnZXN0IHZlcnNpb24gMS40LjIgb3IgaGlnaGVyLCBwcmVmZXJhYmx5IHRoZSBsYXRlc3QgLSAxLjUuCgogICAgICAgICAgICAtIEF1dG9tYWtlIGlzIG5vdyB1c2VkIHRvIGJ1aWxkIHRoZSBydW50aW1lIGxpYnJhcmllcyBpbiBjb25qdW5jdGlvbiAKICAgICAgICAgICAgICB3aXRoIGxpYnRvb2wuCgogICAgICAgICAgICAtIFJ1bnRpbWUgbGlicmFyaWVzIGFyZSBub3cgc3VjY2Vzc2Z1bGx5IGJ1aWx0IGFzIERMTHMgb24gQ3lnd2luLgoKICAgICAgICAgICAgLSBTa2lwcGluZyBsYW5ndWFnZXMgaXMgbm8gbG9uZ2VyIGp1c3QgZGV0ZXJtaW5lZCBpbiB0aGUgdG9wIGxldmVsIAogICAgICAgICAgICAgIG1ha2VmaWxlIGJ1dCBpbiBjb25maWd1cmUuaW4uIFRoaXMgaW5mbyBpcyB1c2VkIGZvciBidWlsZGluZwogICAgICAgICAgICAgIHRoZSBydW50aW1lIGxpYnJhcmllcyBhbmQgZm9yIHJ1bm5pbmcgdGhlIGV4YW1wbGVzIGFuZCB0ZXN0LXN1aXRlLgoKICAgICAgICAgICAgLSBUaGVzZSBjaGFuZ2VzIGhhdmUgZml4ZWQgbXVsdGlwbGUgYnVpbGQgZGlyZWN0b3J5IGJ1aWxkcywgdGhhdCBpcwogICAgICAgICAgICAgIGJ1aWxkaW5nIGZyb20gZGlyZWN0b3JpZXMgb3RoZXIgdGhhbiB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeS4gCiAgICAgICAgICAgICAgSW5zdGFsbGF0aW9uIGZyb20gbXVsdGlwbGUgYnVpbGQgZGlyZWN0b3JpZXMgYWxzbyB3b3JraW5nLiBBbiBpbml0aWFsCiAgICAgICAgICAgICAgY29uZmlndXJlIGluIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5IGlzIG5vIGxvbmdlciBuZWVkZWQgYXMgZGVzY3JpYmVkCiAgICAgICAgICAgICAgaW4gMDQvMDIvMjAwMyBlbnRyeS4gQSAnbWFrZSBkaXN0Y2xlYW4nIHdpbGwgYmUgbmVlZGVkIGJlZm9yZSBidWlsZGluZwogICAgICAgICAgICAgIGluIGEgZGlyZWN0b3J5IG90aGVyIHRoYW4gdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnkgaWYgdGhlIGF1dG90b29scyAKICAgICAgICAgICAgICBoYXZlIGJlZW4gcnVuIGZyb20gdGhpcyB0b3AgbGV2ZWwgZGlyZWN0b3J5IGF0IHNvbWUgcG9pbnQsIGJ1dCAKICAgICAgICAgICAgICBhdXRvY29uZiB3aWxsIHRlbGwgeW91IHRoaXMuIE5vdGUgdGhhdCAnbWFrZSBjaGVjaycgb25seSB3b3JrcyBmcm9tIAogICAgICAgICAgICAgIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5IGF0IHRoZSBtb21lbnQuCgowNC8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzIzNDcxIF0gV3JhcHBlcl9wcmludCgpIGZhaWxzIHdpdGggcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMuCgowNC8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIHJlZmluZW1lbnQgb2YgY29uc3Qgc3RhdGljIG1lbWJlciB2YXJpYWJsZSBoYW5kbGluZyAKICAgICAgICAgICAgZGVzY3JpYmVkIGluIENIQU5HRVMgMDgvMTEvMjAwMi4gICBQcmV2aW91c2x5LCBTV0lHIG1lcmVseQogICAgICAgICAgICBjaGVja2VkIHRvIHNlZSBpZiB0aGVyZSB3YXMgYW4gaW5pdGlhbGl6ZXIgaW4gdGhlIGRlY2xhcmF0aW9uLgogICAgICAgICAgICBOb3csIFNXSUcgYWRkaXRpb25hbGx5IGNoZWNrcyB0byBtYWtlIHN1cmUgdGhlIHN0YXRpYyBtZW1iZXIKICAgICAgICAgICAgaXMgY29uc3QuCgowNC8yNS8yMDAzOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgYSBraW5kIG9mIGxpbWl0ZWQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgaW5oZXJpdGFuY2UsCiAgICAgICAgICAgIGFjdGl2YXRlZCB1c2luZyB0aGUgLW1pbmhlcml0IGNvbW1hbmQtbGluZSBvcHRpb24uIEkndmUgYWxzbyB1cGRhdGVkCiAgICAgICAgICAgIHRoZSAiQysrIEluaGVyaXRhbmNlIiBzZWN0aW9uIG9mIHRoZSBSdWJ5IGRvY3VtZW50YXRpb24gdG8gZGlzY3VzcwogICAgICAgICAgICBob3cgdGhpcyB3b3JrcywgYW5kIGl0cyBsaW1pdGF0aW9ucy4gQWxzbyBhbHNvIG1vZGlmaWVkIHRoZSBtaW5oZXJpdC5pCiAgICAgICAgICAgIHRlc3QgY2FzZSB0byBydW4gYWdhaW5zdCB0aGlzLgoKMDQvMjUvMjAwMzogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIHRoZSAtZ2xvYmFsbW9kdWxlIGNvbW1hbmQtbGluZSBvcHRpb24gZm9yIHRoZSBSdWJ5CiAgICAgICAgICAgIG1vZHVsZSwgZm9yIHdyYXBwaW5nIHN0dWZmIGludG8gdGhlIGdsb2JhbCBtb2R1bGUgKEtlcm5lbCkgaW5zdGVhZAogICAgICAgICAgICBvZiBhIG5lc3RlZCBtb2R1bGUuIFVwZGF0ZWQgZG9jdW1lbnRhdGlvbiBhY2NvcmRpbmdseS4KCjA0LzIzLzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIEZpeGVkIHN5bW5hbWUgZXJyb3IgaW4gZGlyZWN0b3IgY2FsbHMgdG8gUHl0aG9uIG1ldGhvZHMKCSAgICB0aGF0IGV4dGVuZCBDKysgb3BlcmF0b3JzLgoKCSAgICBTdG9wcGVkIGRpcmVjdG9yIGRlc3RydWN0b3Igd3JhcHBlcnMgZnJvbSBjYWxsaW5nIF9fc2V0X3VwLAoJICAgIHdoaWNoIHdhcyBsZWF2aW5nIHRoZSBkaXJlY3RvciBmbGFnIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4KCjA0LzIzLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIG5hbWVzcGFjZSByZXNvbHV0aW9uIGFuZCBuZXN0ZWQgbmFtZXNwYWNlcy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQWxmcmVkIExvcmJlciAoYW5kIE1hcmNlbG8gTWF0dXMpLgoKMDQvMTYvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFBhdGNoIGZvciBKYXZhIGV4YW1wbGVzIGFuZCB0ZXN0LXN1aXRlIHRvIHJ1biBvbiBNYWMgT1MgWC4KCjA0LzE1LzIwMDM6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBJbmNvcnBvcmF0ZWQgTm9idSBOYWthZGEncyBwYXRjaGVzIGZvciBzdXBwb3J0aW5nIHRoZSBSdWJ5CiAgICAgICAgICAgIDEuOCBhbGxvY2F0aW9uIGZyYW1ld29yay4KCjA0LzE1LzIwMDM6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBSZXBsYWNlZCBhbGwgdXNlcyBvZiB0aGUgZGVwcmVjYXRlZCBTVFIyQ1NUUigpIG1hY3JvIHdpdGggdGhlCiAgICAgICAgICAgIHNhZmVyIFN0cmluZ1ZhbHVlUHRyKCkgbWFjcm8uIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgcnVieS10YWxrOjY3MDU5CiAgICAgICAgICAgIGFuZCBmb2xsb3ctdXBzIHRvIHRoYXQgcG9zdC4KCjA0LzExLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIHByZXByb2Nlc3NvciBtYWNybyBleHBhbnNpb24uICBGb3IgZXhhbXBsZToKIAogICAgICAgICAgICAgICAgI2RlZmluZSBtaW4oeCx5KSAoKHgpIDwgKHkpKSA/ICh4KSA6ICh5KSAKICAgICAgICAgICAgICAgIGludCBmKGludCBtaW4pOwoKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgU2ViYXN0aWVuIFJlY2lvLgoKMDQvMTAvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBBZGRlZCBhIHJ1bnRpbWUgY2hlY2sgdG8gdHlwZW1hcHMgaW4gYXJyYXlzX2phdmEuaSBsaWJyYXJ5IHRvIGNoZWNrIAogICAgICAgICAgICB0aGF0IHRoZSBKYXZhIGFycmF5IHBhc3NlZCBpbiBpcyB0aGUgc2FtZSBzaXplIGFzIHRoZSBDIGFycmF5IGFuZCB0aHJvdyBhbiAKICAgICAgICAgICAgZXhjZXB0aW9uIGlmIG5vdC4KCiAgICAgICAgICAgIEFsc28gZml4IHRvIHVzZSBkZWxldGUgaW5zdGVhZCBvZiBmcmVlIGZvciBhcnJheXMgY3JlYXRlZCB1c2luZyBuZXcuCgowNC8wNy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgUmVtb3ZlIEdDQzMgd2FybmluZyB3aGVuIGNvbXBpbGluZyB0aGUgZXhhbXBsZXMgYW5kIHRlc3Qtc3VpdGU6CgogICAgICAgICAgICAgIGNjMXBsdXM6IHdhcm5pbmc6IGNoYW5naW5nIHNlYXJjaCBvcmRlciBmb3Igc3lzdGVtIGRpcmVjdG9yeSAiL3Vzci9pbmNsdWRlIgogICAgICAgICAgICAgIGNjMXBsdXM6IHdhcm5pbmc6IGFzIGl0IGhhcyBhbHJlYWR5IGJlZW4gc3BlY2lmaWVkIGFzIGEgbm9uLXN5c3RlbSBkaXJlY3RvcnkgCgogICAgICAgICAgICBTZWUgU0YgcGF0Y2ggIzcxNTUzMSBzdWJtaXR0ZWQgYnkgR2VyYWxkIFdpbGxpYW1zCgowNC8wMy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBJbXByb3ZlZCB3cmFwcGluZyBvZiBlbnVtcyBhbmQgY29uc3RhbnRzLiBUaGVzZSB3ZXJlIHByZXZpb3VzbHkKICAgICAgICAgICAgd3JhcHBlZCBhcyBDIyB2YXJpYWJsZXMgcmF0aGVyIHRoYW4gY29uc3RhbnRzLiBFaXRoZXIgdGhlc2UgYXJlIHdyYXBwZWQKICAgICAgICAgICAgYXMgcmVhZG9ubHkgKHJ1bnRpbWUpIGNvbnN0YW50cyBvciBjb21waWxlIHRpbWUgY29uc3RhbnRzLCBkZXBlbmRpbmcgb24KICAgICAgICAgICAgdGhlICVqYXZhY29uc3QgZGlyZWN0aXZlIChUaGUgZGlyZWN0aXZlIGlzIGxpa2VseSB0byBjaGFuZ2UgbmFtZSBzb29uKS4KICAgICAgICAgICAgRm9yIGV4YW1wbGUgd3JhcHBpbmc6CiAgICAgICAgICAgICAgJWphdmFjb25zdCgwKTsKICAgICAgICAgICAgICAjZGVmaW5lIEFCQyAyMgogICAgICAgICAgICAgICVqYXZhY29uc3QoMSkgWFlaOwogICAgICAgICAgICAgICNkZWZpbmUgWFlaIDMzCiAgICAgICAgICAgIGlzIG5vdzoKICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGludCBBQkMgPSBleGFtcGxlUElOVk9LRS5nZXRfQUJDKCk7CiAgICAgICAgICAgICAgcHVibGljIGNvbnN0IGludCBYWVogPSAzMzsKCjA0LzAzLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gR2xvYmFsIGNvbnN0YW50cyBhbmQgZW51bXMgYXJlIHB1dCBpbiB0aGVpciBvd24gaW50ZXJmYWNlIGNhbGxlZAogICAgICAgICAgICB4eHhDb25zdGFudHMsIHdoZXJlIHh4eCBpcyB0aGUgbW9kdWxlIG5hbWUuIFRoaXMgaXMgYW4gaW1wcm92ZW1lbnQgYXMgCiAgICAgICAgICAgIGl0IGlzIHBvc3NpYmxlIHRvIGRlcml2ZSAoaW1wbGVtZW50KSBhIEphdmEgY2xhc3MgZnJvbSB0aGUgeHh4Q29uc3RhbnRzCiAgICAgICAgICAgIGludGVyZmFjZSB0byBpbXByb3ZlIHRoZSBzeW50YXg7IG5hbWVseSB3aGVuIHdyYXBwaW5nOgogICAgICAgICAgICAgIGVudW0ge09ORT0xLCBUV08sIFRIUkVFfTsKICAgICAgICAgICAgYWNjZXNzaW5nIHRoZXNlIGZyb20gYSBKYXZhIGNsYXNzIGltcGxlbWVudGluZyB4eHhDb25zdGFudHMgaXMgbmVhdGVyOgogICAgICAgICAgICAgIGludCBudW1iZXIgPSBPTkU7CiAgICAgICAgICAgIHRoYW4gdGhlIHByZXZpb3VzOgogICAgICAgICAgICAgIGludCBudW1iZXIgPSB4eHguT05FOwoKICAgICAgICAgICAgUGF0Y2ggc3VibWl0dGVkIGJ5IERhdmUgRHJpYmluLgoKMDQvMDIvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEJ1aWxkIGltcHJvdmVtZW50cyBmb3IgbXVsdGlwbGUgYnVpbGRzLiBUaGlzIGFsbG93cyBvbmUgdG8gYnVpbGQKICAgICAgICAgICAgdGhlIFNXSUcgZXhlY3V0YWJsZSBhbmQgcnVudGltZSBsaWJyYXJpZXMgZm9yIGRpZmZlcmVudCBwbGF0Zm9ybXMvY29tcGlsZXJzIAogICAgICAgICAgICBldGMgYnkgcnVubmluZyBjb25maWd1cmUgaW4gZGlmZmVyZW50IGRpcmVjdG9yaWVzLiBUaGlzIGlzbid0IDEwMCUganVzdCAKICAgICAgICAgICAgeWV0IGFuZCB3b24ndCBiZSB1bnRpbCBsaWJ0b29sIGlzIGJldHRlciBjb25maWd1cmVkLi4uIGEgJ2NvbmZpZ3VyZScgYW5kIAogICAgICAgICAgICAnbWFrZSBkaXN0Y2xlYW4nIG5lZWRzIHRvIGJlIHJ1biBpbiB0aGUgcm9vdCBkaXJlY3RvcnkgYmVmb3JlIGl0IGFsbCB3b3Jrcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgJCAuL2NvbmZpZ3VyZQogICAgICAgICAgICAgICQgbWFrZSBkaXN0Y2xlYW4KICAgICAgICAgICAgICAkIG1rZGlyIGNvbmZpZzE7IGNkIGNvbmZpZzE7IC4uL2NvbmZpZ3VyZSBDQz1nY2MgQ1hYPWcrKzsgbWFrZTsgY2QgLi4KICAgICAgICAgICAgICAkIG1rZGlyIGNvbmZpZzI7IGNkIGNvbmZpZzI7IC4uL2NvbmZpZ3VyZSBDQz1jYyBDWFg9YysrOyBtYWtlOyBjZCAuLgogICAgICAgICAgICAKICAgICAgICAgICAgVG8gYmUgaW1wcm92ZWQuIEEgJ21ha2UgY2hlY2snIGRvZXMgbm90IHdvcmsgeWV0IGVpdGhlci4gCgowNC8wMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gYXJndW1lbnQgZXhwYW5zaW9uIGJ1Zy4KICAgICAgICAgICAgVGhpcyBzaG93ZWQgdXAgd2hlbiB0cnlpbmcgdG8gdXNlIHN0ZF92ZWN0b3IuaSB3aXRoIHZlY3RvcnMKICAgICAgICAgICAgb2YgcG9pbnRlcnMuCgowMy8zMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4IGZvciBwYXJhbGxlbCBtYWtlIGJ1aWxkcyBvZiBTV0lHLCBmb3IgZXhhbXBsZQogICAgICAgICAgICAgIG1ha2UgLWogNAogICAgICAgICAgICBCdWlsZCBmYWlsdXJlIHJlcG9ydGVkIGJ5IEJpbGwgQ2xhcmtlLgoKMDMvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBSZWxlYXNlZCAxLjMuMTkuCgoKClZlcnNpb24gMS4zLjE5IChNYXJjaCAyOCwgMjAwMykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDMvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBWYXJpZXR5IG9mIG1pbm9yIGJ1ZyBmaXhlcyB0byB0aGUgMS4zLjE4IHJlbGVhc2UgaW5jbHVkaW5nOgoKICAgICAgICAgICAgICAgIC0gU2VnbWVudGF0aW9uIGZhdWx0IHdpdGggJWV4dGVuZCBkaXJlY3RpdmUuCiAgICAgICAgICAgICAgICAtIFR5cGVtYXAgdmFyaWFibGUgc3Vic3RpdHV0aW9uIGJ1Zy4KICAgICAgICAgICAgICAgIC0gRXhwcmVzc2lvbiBldmFsdWF0aW9uIGJ1Zy4KICAgICAgICAgICAgICAgIC0gTGFyZ2UgbWVtb3J5IGxlYWsgd2l0aCB0ZW1wbGF0ZSBleHBhbnNpb24uCgpWZXJzaW9uIDEuMy4xOCAoTWFyY2ggMjMsIDIwMDMpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjAzLzIxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgdHdvIHByb2JsZW1zIHdpdGggdGhlICVleHRlbmQgZGlyZWN0aXZlLCBvdmVybG9hZGluZywgYW5kCiAgICAgICAgICAgIHRlbXBsYXRlIGV4cGFuc2lvbi4gIFNlZSB0aGUgJ3RlbXBsYXRlX2V4dGVuZF9vdmVybG9hZCcgYW5kCiAgICAgICAgICAgICd0ZW1wbGF0ZV9leHRlbmRfb3ZlcmxvYWRfMicgdGVzdHMgaW4gRXhhbXBsZXMvdGVzdC1zdWl0ZSBmb3IKICAgICAgICAgICAgZGV0YWlscy4KCjAzLzIwLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEFkZGVkIHNvbWUgdHlwZW1hcHMgYXMgc3VnZ2VzdGVkIGJ5IEFuZHJlYXMgU2Nob2VyayBmb3IgaGFuZGxpbmcKICAgICAgICAgICAgcGFyYW1ldGVycyB0aGF0IGFyZSBwYXNzZWQgYXMgcG9pbnRlcnMgb3IgYnkgcmVmZXJlbmNlLiBUaGVzZSBoYXZlCiAgICAgICAgICAgIGJlZW4gcHV0IGluIHR5cGVtYXBzLmkuCgowMy8yMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgQysrIHNjb3BpbmcgYnVnIHJlbGF0ZWQgdG8gY29kZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgaW50IEZvbzo6YmFyKCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgUHJldmlvdXNseSwgU1dJRyBqdXN0IHRvc3NlZCBvdXQgdGhlIEZvbzo6YmFyKCkgZGVjbGFyYXRpb24uIE5vdywKICAgICAgICAgICAgdGhlIGRlY2xhcmF0aW9uIGlzIHdyYXBwZWQgcHJvdmlkZWQgdGhhdCB0aGUgcHJlZml4IGlzIGV4YWN0bHkgdGhlCiAgICAgICAgICAgIHNhbWUgYXMgdGhlIGN1cnJlbnQgc2NvcGUgKGluY2x1ZGluZyBhbnkgZW5jbG9zaW5nIG5hbWVzcGFjZXMpLgogICAgICAgICAgICBSZXBvcnRlZCBieSBCcnVjZSBMb3dlcnkuCgowMy8yMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEluY29ycG9yYXRlZCBbIDY5NjUxNiBdIEVuYWJsaW5nIGV4Y2VwdGlvbiBwcm9jZXNzaW5nIGZvciBkYXRhIG1lbWJlciBhY2Nlc3MuCiAgICAgICAgICAgIEluIHNvbWUgY29tcGlsZXJzLCBhdHRyaWJ1dGUgYWNjZXNzIGNhbiBnZW5lcmF0ZSBleGNlcHRpb25zLiAgSG93ZXZlciwKICAgICAgICAgICAgU1dJRyBvcmRpbmFyaWx5IGFzc3VtZXMgdGhhdCBubyBleGNlcHRpb25zIHdpbGwgYmUgcmFpc2VkLiAgVG8gZGlzYWJsZSB0aGlzLAogICAgICAgICAgICB1c2UgdGhlICVmZWF0dXJlKCJhbGxvd2V4Y2VwdCIpLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAlZmVhdHVyZSgiYWxsb3dleGNlcHQiKSBGb286Ong7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICBpbnQgeDsgICAgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyBlbmFibGVkICovCiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IFlha292IE1hcmtvdml0Y2guIAogCjAzLzIwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgSW5jb3Jwb3JhdGVkIFBhdGNoLiBbIDcwMTg2MCBdIEltcHJvdmUgUGVyZm9ybWFuY2UgKHB5dGhvbiBwcm94aWVzKS4KICAgICAgICAgICAgR2l2ZXMgYSBwZXJmb3JtYW5jZSBib29zdCB0byBwcm94eSBjbGFzcyBjb2RlIGFuZCB0aGUgbWFuYWdlbWVudCBvZiB0aGUKICAgICAgICAgICAgLnRoaXMgYW5kIC50aGlzb3duIGF0dHJpYnV0ZXMuICBDb250cmlidXRlZCBieSBNaWtlIFJvbWJlcmcuCgowMy8xOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjIGFuZCBKYXZhXSBBZGRlZCBtaXNzaW5nIHZhcmFyZyBzdXBwb3J0LgoKMDMvMTgvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgUmVtb3ZlZCBjb2RlIHJlbGF0ZWQgdG8gdGFnZ2luZyBpbmRpdmlkdWFsIG1ldGhvZHMgZm9yIGRpcmVjdG9ycy4KCSAgICBUaGUgY29uY2VwdCBvZiBoYXZpbmcgZGlyZWN0b3JzIGZvciBzb21lIGJ1dCBub3QgYWxsIHZpcnR1YWwgbWV0aG9kcwoJICAgIG9mIGEgY2xhc3MgaXMgZGVlcGx5IGZsYXdlZC4gIFRoZSAlZmVhdHVyZSgibm9kaXJlY3RvciIpIHRhZyBpcyBhbHNvCgkgICAgZ29uZS4gIAoJICAgIAoJICAgIERpcmVjdG9ycyBhcmUgb2ZmIGJ5IGRlZmF1bHQuICBUbyBlbmFibGUgdGhlbSBmb3IgYSBjbGFzcywgaXNzdWUKCSAgICAlZmVhdHVyZSgiZGlyZWN0b3IiKSBjbGFzc25hbWU7IHdoaWNoIHdpbGwgY3JlYXRlIGRpcmVjdG9yIG1ldGhvZHMKCSAgICBmb3IgZXZlcnkgdmlydHVhbCBtZXRob2QgaW4gdGhlIGhpZXJhcmNoeSBvZiB0aGUgY2xhc3MuCgowMy8xNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgc3VidGxlIHByb2JsZW0gd2l0aCBwYXNzaW5nIGFyZ3VtZW50cyBvZiB0eXBlIGZ1bmN0aW9uLiAgRm9yCiAgICAgICAgICAgIGV4YW1wbGU6CgogICAgICAgICAgICAgICBpbnQgZm9vKGludCB4KGludCwgaW50KSk7CgogICAgICAgICAgICBvcgoKICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgYmlub3BfdChpbnQsIGludCk7CiAgICAgICAgICAgICAgIGludCBmb28oYmlub3BfdCB4KTsKCiAgICAgICAgICAgIEluIG9sZCB2ZXJzaW9ucywgdGhpcyB3b3VsZCBwcm9kdWNlIGNvZGUgdGhhdCB3b3VsZG4ndCBjb21waWxlLiAgTm93LAogICAgICAgICAgICBTV0lHIG1lcmVseSBhZGRzIGFuIGV4dHJhIHBvaW50ZXIsIG1ha2luZyB0aGVzZSBkZWNsYXJhdGlvbnMgdGhlIHNhbWUKICAgICAgICAgICAgYXM6CgogICAgICAgICAgICAgICBpbnQgZm9vKGludCAoKngpKGludCwgaW50KSk7CgogICAgICAgICAgICAgICB0eXBlZGVmIGludCBiaW5vcF90KGludCwgaW50KTsKICAgICAgICAgICAgICAgaW50IGZvbyhiaW5vcF90ICp4KTsKCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEdhcnRoIEJ1c2hlbGwuCgowMy8xNy8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBGaXhlZCB0aGUgcmV0dXJuIHN0YXRlbWVudCBmb3IgZGlyZWN0b3IgYmFzZSBjbGFzcyBjYWxscyB0aGF0IGhhdmUgbm8KICAgICAgICAgICAgcmV0dXJuIHZhbHVlLgoKMDMvMTUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHByb2JsZW0gd2l0aCBjb25zdCBzbWFydC1wb2ludGVyIHdyYXBwaW5nLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIGludCB4OwogICAgICAgICAgICAgICAgICAgIHZvaWQgYmFyKCkgY29uc3Q7CiAgICAgICAgICAgICAgICAgICAgdm9pZCBzcGFtKCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGNsYXNzIEJsYWggewogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICBjb25zdCBGb28gKm9wZXJhdG9yLT4oKTsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgb25seSAieCIgYW5kICJiYXIiIGFyZSB2aXNpYmxlIGZyb20gQmxhaCAoc2luY2UgYXBwbGljYXRpb24KICAgICAgICAgICAgb2Ygc3BhbSB2aW9sYXRlcyBjb25zdG5lc3MpLiAgTW9yZW92ZXIsIGFjY2VzcyB0byAieCIgaXMgcmVhZC1vbmx5LgogICAgICAgICAgIAowMy8xNS8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBDbGVhbmVkIHVwIHR3byBzaWduZWQgdmVyc3VzIHVuc2lnbmVkIGNvbXBhcmlzb25zIGluIHB5dGhvbi9zdGRfdmVjdG9yLmkuCgkgICAgCjAzLzE1LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEdsb2JhbCB2YXJpYWJsZXMgYXJlIHdyYXBwZWQgdXNpbmcgcHJvcGVydGllcyBpbnN0ZWFkIG9mIGdldCBhbmQgc2V0IG1ldGhvZHMuCiAgICAgICAgICAgIE1lbWJlciB2YXJpYWJsZSB3cmFwcGluZyBidWcgZml4ZXMsIGZvciBleGFtcGxlIHdyYXBwaW5nIHBvaW50ZXJzIHdvcmsgbm93LgogICAgICAgICAgICBUeXBlbWFwcyBhcmUgdXNlZCBmb3IgYWxsIHZhcmlhYmxlIHdyYXBwaW5nIHRvIGdlbmVyYXRlIHRoZSBwcm9wZXJ0eSBjb2RlLgoKMDMvMTMvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgRml4ZWQgYSBidWcgaW4gdGhlIHZpcnR1YWwgbWV0aG9kIHVucm9sbGluZyBmb3IgZGlyZWN0b3JzLiAKCSAgICBUaGUgb3JkZXIgb2YgdW5yb2xsaW5nIGlzIG5vdyBmcm9tIGJhc2UgdG8gZGVyaXZlZCwgdG8gZW5zdXJlCgkgICAgdGhhdCB0aGUgbW9zdCBkZXJpdmVkIGltcGxlbWVudGF0aW9uIG9mIGEgZGlyZWN0b3IgbWV0aG9kIGlzCgkgICAgZm91bmQuCgoJICAgIERpcmVjdG9yIG1ldGhvZHMgZm9yIHB1cmUgdmlydHVhbCBtZXRob2RzIG5vdyB0aHJvdwoJICAgIERJUkVDVE9SX1BVUkVfVklSVFVBTF9FWENFUFRJT04gaWYgX3VwIGlzIHNldC4KCjAzLzEyLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIFBvbHltb3JwaGlzbSBmaXg6IHZpcnR1YWwgZnVuY3Rpb25zIG5vdyB1c2UgdGhlIGFwcHJvcHJpYXRlCiAgICAgICAgICAgIGtleXdvcmQgaW4gdGhlIEMjIHByb3h5IGNsYXNzLCB2aXJ0dWFsIG9yIG92ZXJyaWRlLgogICAgICAgICAgICBTb21lICd1c2luZyBTeXN0ZW07JyBzdGF0ZW1lbnQgZml4ZXMgbmVlZGVkIGJ5IHRoZSBNb25vIGNvbXBpbGVyLgoKMDMvMTEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzdWJ0bGUgYnVnIGluIHRoZSBhcHBsaWNhdGlvbiBvZiBTd2lnVmFsdWVXcmFwcGVyPD4gdG8KICAgICAgICAgICAgdGVtcGxhdGUgY2xhc3NlcyB3aXRoIGRlZmF1bHQgY29uc3RydWN0b3JzLiAgUmVwb3J0ZWQgYnkKICAgICAgICAgICAgQnJ1Y2UgTG93ZXJ5LgoKMDMvMTEvMjAwMzogYmVhemxleQogICAgICAgICAgICBUaGUgJGRlc2NyaXB0b3IodHlwZSkgdmFyaWFibGUgaXMgbm93IGV4cGFuZGVkIGluIGNvZGUgc3VwcGxpZWQgdG8KICAgICAgICAgICAgJWV4dGVuZC4gIFRoaXMgaXMgdXNlZnVsIGZvciBjZXJ0YWluIGtpbmRzIG9mIGFkdmFuY2VkIHdyYXBwaW5nIAogICAgICAgICAgICAoZXNwZWNpYWxseSBjb250YWluZXIgY2xhc3NlcykuCgowMy8xMS8yMDAzOiBsdWlnaQogICAgICAgICAgICBTdXBwb3J0IGZvciBzdGQ6Om1hcC4KICAgICAgICAgICAgKGEpIEludGVncmF0aW9uIHdpdGggc2NyaXB0aW5nIGxhbmd1YWdlIChhIGxhIHN0ZDo6dmVjdG9yKSBmb3IKICAgICAgICAgICAgICAgIFB5dGhvbiwgUnVieSwgTXpTY2hlbWUsIGFuZCBHdWlsZTsKICAgICAgICAgICAgKGIpIFNpbXBsZSB3cmFwcGVyIGZvciBvdGhlciBsYW5ndWFnZXMKCjAzLzEwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIGVzY2FwZSBzZXF1ZW5jZXMgaW4gc3RyaW5nIGFuZCBjaGFyYWN0ZXIgY29uc3RhbnRzLiAgU1dJRwogICAgICAgICAgICB3YXNuJ3QgcGFyc2luZyBjZXJ0YWluIG9jdGFsIGNvZGVzIGNvcnJlY3RseS4KCjAzLzA3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSB2YXJpZXR5IG9mIHN1YnRsZSBwcmVwcm9jZXNzb3IgcHJvYmxlbXMgcmVwb3J0ZWQgYnkKICAgICAgICAgICAgU2ViYXN0aWVuIFJlY2lvLgoKICAgICAgICAgICAgKGEpIEVtcHR5IHByZXByb2Nlc3NvciB2YWx1ZXMgbm8gbG9uZ2VyIGdlbmVyYXRlICJiYWQgY29uc3RhbnQKICAgICAgICAgICAgdmFsdWUiIGVycm9ycy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgI2RlZmluZSBGT08KICAgICAgICAgICAgICAgICAgI2RlZmluZSBGT08gQkFSCgogICAgICAgICAgICAoYikgTWFjcm8gbmFtZXMgY2FuIG5vdyBzcGFuIG11bHRpcGxlIGxpbmVzICh0ZWNobmljYWxseSB2YWxpZCwKICAgICAgICAgICAgYWx0aG91Z2ggcXVlc3Rpb25hYmxlIHByYWN0aWNlKS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgI2RlZmluZSBBX0xPTkdfTUFDUk9fXAogICAgICAgICAgICAgICAgICBOQU1FIDQyCgogICAgICAgICAgICAoYykgV2hpdGVzcGFjZSBpcyBubyBsb25nZXIgcmVxdWlyZWQgYmVmb3JlIGNlcnRhaW4gbWFjcm8gdmFsdWVzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICNkZWZpbmUgRk9PIkhlbGxvIgogICAgICAgICAgICAgICAgICAjZGVmaW5lIEJBUlwKICAgICAgICAgICAgICAgICAgIkhlbGxvIgogCjAzLzA3LzIwMDM6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBtaXNzaW5nIGxvbmcgbG9uZyBhbmQgdW5zaWduZWQgbG9uZyBsb25nIHR5cGVtYXBzCiAgICAgICAgICAgIGluIHRoZSBMaWIvcnVieS90eXBlbWFwcy5pIGxpYnJhcnkgZmlsZS4KCjAzLzA3LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIEFkZGVkIEV4YW1wbGVzL3B5dGhvbi9jYWxsYmFjayB0byBkZW1vc3RyYXRlIGhvdyBkaXJlY3RvcnMgY2FuCgkgICAgYmUgdXNlZCB0byBpbXBsZW1lbnQgY2FsbGJhY2tzIGluIFB5dGhvbgoJICAgIEFkZGVkIEV4YW1wbGVzL3B5dGhvbi9leHRlbmQgdG8gZGVtb25zdHJhdGUgdmlydHVhbCBtZXRob2QKCSAgICBjYWxscyBmcm9tIEMrKyB0byBQeXRob24gKHJlYWxseSB0aGUgc2FtZSBhcyB0aGUgY2FsbGJhY2sKCSAgICBleGFtcGxlLCBqdXN0IGEgZGlmZmVyZW50IGNvbnRleHQpLgoJICAgIEFkZGVkIGZvdXIgdGVzdHMgZm9yIHZlcnkgYmFzaWMgZGlyZWN0b3IgZnVuY3Rpb25hbGl0eS4gIFRoZXNlCgkgICAgaGF2ZSBydW50aW1lIHRlc3RzIHVuZGVyIHB5dGhvbi4KCSAgICBUaGUgUHl0aG9uIG1vZHVsZSBub3cgZW1pdHMgI2RlZmluZSBTV0lHX0RJUkVDVE9SUyBuZWFyIHRoZQoJICAgIHRvcCBvZiB0aGUgb3V0cHV0IGZpbGUgaWYgZGlyZWN0b3JzIGFyZSBlbmFibGVkLiAgVGhpcyBpcyB1c2VmdWwKCSAgICBmb3IgZGlzYWJsaW5nIHBhcnRzIG9mIHRlc3RzIGluIHRhcmdldCBsYW5ndWFnZXMgdGhhdCBkb24ndAoJICAgIHN1cHBvcnQgZGlyZWN0b3JzLgoKMDMvMDYvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgQWRkZWQgYSBzZWN0aW9uIHRvIERvYy9NYW51YWwvUHl0aG9uLmh0bWwgb24gY3Jvc3MgbGFuZ3VhZ2UKCSAgICBwb2x5bW9ycGhpc20gKGRpcmVjdG9ycykuCgowMy8wNi8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBUaGUgc2hvcnQtbGl2ZWQgIi1mZGlyZWN0b3JzIiBjb21tYW5kIGxpbmUgb3B0aW9uIGhhcyBiZWVuCgkgICAgcmVtb3ZlZC4gIFRvIGVuYWJsZSBkaXJlY3RvcnMsIGluc3RlYWQgdXNlIHRoZSBleHRlbmRlZCAlbW9kdWxlIAoJICAgIGRpcmVjdGl2ZSBhcyBmb2xsb3dzOgoKCSAgICAgICAgJW1vZHVsZShkaXJlY3RvcnM9IjEiKSBtb2R1bGVuYW1lCgowMy8wNi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgVGhlIGxvbmcgbG9uZyB0eXBlbWFwcyBoYXZlIGJlZW4gcmV3cml0dGVuIHNvIHRoYXQgdGhleSBjYW4gYmUgbW9yZQogICAgICAgICAgICBlYXNpbHkgdXNlZCB3aXRoIG5vbiBJU08gY29tcGlsZXJzLCBsaWtlIFZpc3VhbCBDKysuIEZvciBleGFtcGxlCiAgICAgICAgICAgIGlmIHlvdSBhcmUgd3JhcHBpbmcgdGhlIFdpbmRvd3MgNjQgYml0IHR5cGUgX19pbnQ2NCB0aGUgbG9uZyBsb25nCiAgICAgICAgICAgIHR5cGVtYXBzIGNhbiBiZSB1c2VkIHdpdGggJWFwcGx5OgoKICAgICAgICAgICAgICAgICVhcHBseSBsb25nIGxvbmcgeyBfX2ludDY0IH07CiAgICAgICAgICAgICAgICBfX2ludDY0IHZhbHVlMShfX2ludDY0IHgpOwoKICAgICAgICAgICAgX19pbnQ2NCB3aWxsIG5vdyBhcHBlYXIgaW4gdGhlIGdlbmVyYXRlZCBjb2RlIGluc3RlYWQgb2YgbG9uZyBsb25nLgogICAgICAgICAgICAKMDMvMDYvMjAwMzogYmVhemxleQogICAgICAgICAgICAqKiogREVWRUxPUEVSIENIQU5HRSAqKioKICAgICAgICAgICAgU3dpZyBtb2R1bGUgbXV0YXRpb24gaGFzIGJlZW4gY2hhbmdlZCBzbGlnaHRseS4gIFdoZW4gYSBsYW5ndWFnZQogICAgICAgICAgICBjbGFzcyBtZXRob2Qgd2FudHMgdG8gc2F2ZSBub2RlIGF0dHJpYnV0ZXMsIGl0IG5vdyB1c2VzIG9uZSBvZiB0aGUKICAgICAgICAgICAgZm9sbG93aW5nIGZ1bmN0aW9uczoKCiAgICAgICAgICAgICAgICAgIFN3aWdfcmVxdWlyZSgpCiAgICAgICAgICAgICAgICAgIFN3aWdfc2F2ZSgpCgogICAgICAgICAgICBUaGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlc2UgZnVuY3Rpb25zIGlzIGEgbmFtZXNwYWNlIGluIHdoaWNoCiAgICAgICAgICAgIHNhdmVkIGF0dHJpYnV0ZXMgYXJlIHBsYWNlZC4gIEZvciBleGFtcGxlLHRoaXMgY29kZQoKICAgICAgICAgICAgICAgICAgTm9kZSAqbjsKICAgICAgICAgICAgICAgICAgU3dpZ19zYXZlKCJjRGVjbGFyYXRpb24iLG4sInR5cGUiLCJwYXJtcyIsIm5hbWUiLE5JTCk7CgogICAgICAgICAgICBzYXZlcyB0aGUgYXR0cmlidXRlcyBhcyAiY0RlY2xhcmF0aW9uOnR5cGUiLCAiY0RlY2xhcmF0aW9uOnBhcm1zIiwKICAgICAgICAgICAgYW5kIHNvIGZvcnRoLiAgIElmIG5lY2Vzc2FyeSwgYSBsYW5ndWFnZSBtb2R1bGUgY2FuIHJlZmVyIHRvCiAgICAgICAgICAgIG9sZCB2YWx1ZXMgYnkgdXNpbmcgdGhpcyBzcGVjaWFsIG5hbWVzcGFjZSBxdWFsaWZpZXIuCgogICAgICAgICAgICBJbiBhZGRpdGlvbiB0byB0aGlzLCBhIHNwZWNpYWwgYXR0cmlidXRlICJ2aWV3IiBjb250YWlucyB0aGUgbmFtZQogICAgICAgICAgICBvZiB0aGUgbGFzdCBuYW1lc3BhY2UgdXNlZCB0byBzYXZlIGF0dHJpYnV0ZXMuICBJbiB0aGUgYWJvdmUgCiAgICAgICAgICAgIGV4YW1wbGUsICJ2aWV3IiB3b3VsZCBoYXZlIHRoZSB2YWx1ZSAiY0RlY2xhcmF0aW9uIi4gICBUaGUgdmFsdWUKICAgICAgICAgICAgb2YgImNEZWNsYXJhdGlvbjp2aWV3IiB3b3VsZCBoYXZlIHRoZSBwcmV2aW91cyB2aWV3IGFuZCBzbyBmb3J0aC4KCiAgICAgICAgICAgIFN3aWdfcmVzdG9yZShuKSByZXN0b3JlcyBhIG5vZGUgdG8gdGhlIHN0YXRlIGJlZm9yZSB0aGUgbGFzdAogICAgICAgICAgICBTd2lnX3JlcXVpcmUoKSBvciBTd2lnX3NhdmUoKSBjYWxsLgoKICAgICAgICAgICAgTm90ZTogIFRoaXMgY2hhbmdlIG1ha2VzIGl0IGVhc2llciBmb3IgbGFuZ3VhZ2UgbW9kdWxlcyB0byByZWZlcgogICAgICAgICAgICB0byBvbGQgdmFsdWVzIG9mIGF0dHJpYnV0ZXMuICAKCgowMy8wNi8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBNZXJnZWQgdGhlIGNyb3NzLWxhbmd1YWdlIHBvbHltb3JwaGlzbSBwYXRjaC4gIFdoZW4gZW5hYmxlZCwgQysrIAoJICAgICJwcm94eSIgY2xhc3NlcyAoY2FsbGVkIGRpcmVjdG9ycykgYXJlIGdlbmVyYXRlZCBmb3IgZWFjaCBzcGVjaWZpZWQgCgkgICAgQysrIGNsYXNzLiAgRGlyZWN0b3JzIHBhc3MgbWV0aG9kIGNhbGxzIGZyb20gQysrIHRvIFB5dGhvbiwgc2ltaWxhciAKCSAgICB0byB0aGUgd2F5IHRoZSB1c3VhbCBwcm94eSAoc2hhZG93KSBjbGFzc2VzIHBhc3MgbWV0aG9kIGNhbGxzIGZyb20gCgkgICAgUHl0aG9uIHRvIEMrKy4gIFRvZ2V0aGVyLCB0aGVzZSB0d28gdHlwZXMgb2YgcHJveGllcyBhbGxvdyBDKysgCgkgICAgY2xhc3NlcyB0aGF0IGFyZSBleHRlbmRlZCBpbiBQeXRob24gdG8gYmVoYXZlIGp1c3QgbGlrZSBvcmRpbmFyeSAKCSAgICBDKysgY2xhc3NlcyBhbmQgYmUgdXNlZCBpbiBDKysgbGlrZSBuYXRpdmUgb2JqZWN0cy4gIAoJICAgIAoJICAgIFRoaXMgZmVhdHVyZSBpcyBzdGlsbCB2ZXJ5IGV4cGVyaW1lbnRhbCBhbmQgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KCSAgICBUbyBlbmFibGUgZGlyZWN0b3Igc3VwcG9ydCwgc3BlY2lmeSAnLWZkaXJlY3RvcnMnIG9uIHRoZSBTV0lHIGNvbW1hbmQKCSAgICBsaW5lIG9yIGluIHRoZSBTV0lHX0ZFQVRVUkVTIGVudmlyb25tZW50IHZhcmlhYmxlLiAgSW4gdGhlIGludGVyZmFjZQoJICAgIGZpbGUsIGFkZCAlZmVhdHVyZSgiZGlyZWN0b3IiKSB0byBnZW5lcmF0ZSBkaXJlY3RvcnMgZm9yIGFsbCBjbGFzc2VzCgkgICAgdGhhdCBoYXZlIHZpcnR1YWwgbWV0aG9kcy4gIAoJICAgIAoJICAgIFNlZSBodHRwOi8vc3RtLmxibC5nb3YvfnRtMi9zd2lnL1Byb3h5RG9jLmh0bWwgZm9yIG1vcmUgZGV0YWlscy4KCSAgICAKCjAzLzAzLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBzbWFsbCBnbGl0Y2ggaW4gdHlwZW1hcCBsb2NhbCB2YXJpYWJsZSByZXBsYWNlbWVudC4gIElmIHlvdSBoYWQKICAgICAgICAgICAgYSB0eXBlbWFwIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHR5cGUgKCQxX3R5cGUgdGVtcCkgewogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gLi4uOwogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgYW5kIG5vIG9jY3VycmVuY2Ugb2YgIiQxX3R5cGUiIGFwcGVhcmVkIGluIHRoZSBib2R5LCB0aGVuIHRoZSBsb2NhbAogICAgICAgICAgICB2YXJpYWJsZSB0eXBlIHdvdWxkbid0IGJlIHN1YnN0aXR1dGVkLgoKMDMvMDMvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gTmV3IHZlcnNpb24gb2YgdGhlIENTaGFycCBtb2R1bGUgd2hpY2ggaXMgdHlwZW1hcCBiYXNlZC4KICAgICAgICAgICAgSXQgYWxzbyB1c2VzIEVDTUEgQyMgYW5kIG5vIGxvbmdlciB1c2VzIE1pY3Jvc29mdCBWaXN1YWwgQysrLk5FVCAKICAgICAgICAgICAgZ2x1ZS4gVGhpcyBtZWFucyB0aGF0IGl0IHdpbGwgd29yayBvbiBub24tV2luZG93cyBwbGF0Zm9ybXMuCiAgICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IE5laWwgQ2F3c2UuCgowMi8yNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjUzNTQ4IF0gZXJyb3IgcGFyc2luZyBjYXN0aW5nIG9wZXJhdG9yIGRlZmluaXRpb24uCiAgICAgICAgICAgIFNXSUcgbm93IGlnbm9yZXMgY2FzdGluZyBvcGVyYXRvcnMgZGVjbGFyZWQgb3V0c2lkZSBvZiBhIGNsYXNzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBpbmxpbmUgQTo6b3BlcmF0b3IgY2hhciAqKCkgeyAuLi4gfQoKICAgICAgICAgICAgQnVnIHJlcG9ydGVkIGJ5IE1hcnRpbiBDYXNhZG8uCgowMi8yNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIGFub255bW91cyBiaXQtZmllbGRzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICAgICAgaW50IHggOiA0OwogICAgICAgICAgICAgICAgICAgICAgaW50ICAgOiA0OwogICAgICAgICAgICAgICAgICAgICAgaW50IHkgOiA4OwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBBbm9ueW1vdXMgYml0LWZpZWxkcyBhcmUgaWdub3JlZCBieSBTV0lHLiAgIFByb2JsZW0KICAgICAgICAgICAgcmVwb3J0ZWQgYnkgRnJhbnogSPZwZmluZ2VyLgoKMDIvMjYvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBCZXR0ZXIgdHlwZW1hcHMgaW4gdGhlIEV4YW1wbGVzL2phdmEvdHlwZW1hcCBleGFtcGxlIGFuZCBhbHNvIAogICAgICAgICAgICBmaXhlcyBzdWJ0bGUgYnVnIHdoZW4gdXNpbmcgdGhlIFN0cmluZ0J1ZmZlciB0eXBlbWFwcyBtb3JlIHRoYW4gb25jZS4KCjAyLzI2LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2NDIxMTIgXSBDb25zdGFudHMgY2hhciBidWcuCgowMi8yNi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjc1MzM3IF0gUGFydGlhbCB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBub3QgZW50aXJlbHkgd29ya2luZy4KICAgICAgICAgICAgVGhlcmUgd2FzIGEgc3VidGxlIHByb2JsZW0gcmVsYXRlZCB0byB0aGUgbmFtaW5nIGFuZCBvcmRlcmluZyBvZgogICAgICAgICAgICB0ZW1wbGF0ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGFyZ3VtZW50cy4gIE1hdGNoaW5nIHdvcmtlZCBva2F5LAogICAgICAgICAgICB0aGUgcmVzdWx0aW5nIHRlbXBsYXRlcyB3ZXJlbid0IGV4cGFuZGVkIGNvcnJlY3RseS4KCjAyLzI1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIHBhcnNpbmcgKGFuZCBnZW5lcmF0aW5nIGNvZGUpIGZvciAKICAgICAgICAgICAgcmVmZXJlbmNlcyB0byBhcnJheXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBpbnQgZm9vKGludCAoJngpWzEwXSk7CiAgCjAyLzI1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2MzUzNDcgXSBDb21waWxhdGlvbiB3YXJuaW5nIGZyb20gbGlicHkuYy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgRGFuaWVsIEwuIFJhbGwuCiAKMDIvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHN1YnRsZSBwcm9ibGVtIHdpdGggdmlydHVhbCBtZXRob2QgaW1wbGVtZW50YXRpb24KICAgICAgICAgICAgY2hlY2tpbmcgYW5kIHR5cGVkZWYuCgogICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50ICppbnRwdHI7CgogICAgICAgICAgICAgICAgIHN0cnVjdCBBIHsKICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCAqZm9vKCkgPSAwOwogICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgc3RydWN0IEIgOiBwdWJsaWMgQSB7CiAgICAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnRwdHIgZm9vKCkgeyB9OwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBTV0lHIHdhcyB0cmVhdGluZyB0aGVzZSBkZWNsYXJhdGlvbnMgYXMgZGlmZmVyZW50IGV2ZW4gdGhvdWdoCiAgICAgICAgICAgIHRoZXkgYXJlIHRoZSBzYW1lICh2aWEgdHlwZWRlZikuCgowMi8yNS8yMDAzOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgcmFuZ2UgY2hlY2tpbmcgZm9yIHRoZSBOVU0yVVNIUlQgbWFjcm8sIHBlciBbIDY3NTM1MyBdLgoKMDIvMjQvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHN1YnRsZSBwcm9ibGVtIHdpdGggdGhlIGNvZGUgdGhhdCBkZXRlcm1pbmVkIGlmIGEgY2xhc3MgaXMgYWJzdHJhY3QKICAgICAgICAgICAgYW5kIGNhbiBiZSBpbnN0YW50aWF0ZWQuICAgIElmIHlvdSBoYWQgY2xhc3NlcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICBzdHJ1Y3QgQSB7CiAgICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGZvbyhpbnQpID0gMDsKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgc3RydWN0IEIgOiB2aXJ0dWFsIEEgewogICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBmb28oaW50KTsKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgIHN0cnVjdCBDIDogdmlydHVhbCBBIHsgCiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAvKiBOb3RlIG9yZGVyIG9mIGJhc2UgY2xhc3NlcyAqLwkKICAgICAgICAgICAgICAgICAgc3RydWN0IEQgOiBCLCBDIHsgfTsgICAgLyogT2sgKi8KICAgICAgICAgICAgICAgICAgc3RydWN0IEUgOiBDLCBCIHsgfTsgICAgLyogQnJva2VuICovCgogICAgICAgICAgICB0aGVuIFNXSUcgZGV0ZXJtaW5lZCB0aGF0IGl0IGNvdWxkIGluc3RhbnRpYXRlIEQoKSwgYnV0IG5vdCBFKCkuCiAgICAgICAgICAgIFRoaXMgaW5jb25zaXN0ZW5jeSBhcm9zZSBmcm9tIHRoZSBkZXB0aC1maXJzdCBzZWFyY2ggb2YgdGhlIAogICAgICAgICAgICBpbmhlcml0YW5jZSBoaWVyYXJjaHkgdG8gbG9jYXRlIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdmlydHVhbAogICAgICAgICAgICBtZXRob2RzLiAgIFRoaXMgcHJvYmxlbSBzaG91bGQgbm93IGJlIGZpeGVkLS0tU1dJRyB3aWxsIGF0dGVtcHQKICAgICAgICAgICAgdG8gbG9jYXRlIGFueSB2YWxpZCBpbXBsZW1lbnRhdGlvbiBvZiBhIHZpcnR1YWwgbWV0aG9kIGJ5CiAgICAgICAgICAgIHRyYXZlcnNpbmcgb3ZlciB0aGUgZW50aXJlIGhpZXJhcmNoeS4KCjAyLzIyLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4IGZvciB1c2luZyBlbnVtIHR5cGVtYXBzLiBUaGUgSmF2YSBmaW5hbCBzdGF0aWMgdmFyaWFibGUgdHlwZQogICAgICAgICAgICBjYW4gYmUgc2V0IHVzaW5nIHRoZSBqc3R5cGUgdHlwZW1hcCwgZW5hYmxpbmcgZW51bXMgdG8gYmUgbWFwcGVkIHRvIAogICAgICAgICAgICBzb21ldGhpbmcgb3RoZXIgdGhhbiBpbnQuIEJ1ZyByZXBvcnRlZCBieSBIZWluZXIgUGV0aXRoLgoKMDIvMjEvMjAwMzogc29uZ3lhbmYgKFRpZ2VyKQogICAgICAgICAgICBBZGRlZCBDU2hhcnAgKEMjKSBtb2R1bGUgcHJvdG90eXBlCiAgICAgICAgICAgIGkuZS4gY3NoYXJwLmN4eCAmIGNzaGFycC5oIGF0IFNvdXJjZS9Nb2R1bGVzLy4KICAgICAgICAgICAgVGhleSBhcmUgZm9yIHRlc3QgdXNhZ2Ugb25seSBub3cgYW5kIG5lZWQgaW1wcm92ZW1lbnQuCiAgICAgICAgICAgIFRoZSBpbnRlcmZhY2UgYWxzbyBuZWVkIHRvIGJlIG1vZGlmaWVkLgoKICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgIAowMi8yMC8yMDAzOiBzb25neWFuZiAoVGlnZXIpCiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCB0eXBlZGVmIHdpdGggLWZ2aXJ0dWFsLgogICAgICAgICAgICBTaW1pbGFyIGFzIGJlYXpsZXkncyBtb2RpZmljYXRpb24gdG9kYXkuCgowMi8yMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIGdjYy1zdHlsZSB2YXJpYWRpYyBwcmVwcm9jZXNzb3IgbWFjcm9zLiAgCiAgICAgICAgICAgIFBhdGNoIFsgNjIzMjU4IF0gR0NDLXN0eWxlIHZhcmFyZyBtYWNybyBzdXBwb3J0LgogICAgICAgICAgICBDb250cmlidXRlZCBieSBKb2UgTWFzb24uCgowMi8yMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjA1MTYyIF0gVHlwZW1hcCBsb2NhbCB2YXJpYWJsZXMuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEx5bGUgSm9obnNvbi4KCjAyLzIwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIGFic3RyYWN0IGNsYXNzZXMgYW5kIHR5cGVkZWYuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGZvbyhpbnQgeCkgPSAwOwogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgSW50ZWdlcjsKICAgICAgICAgICAgICAgY2xhc3MgQmFyIDogcHVibGljIEZvbyB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGZvbyhJbnRlZ2VyIHgpOwogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgU1dJRyB3YXMgZ2V0dGluZyBjb25mdXNlZCBhYm91dCB0aGUgbGF0dGVyIG1ldGhvZC0tLW1ha2luZyBCYXIKICAgICAgICAgICAgYWJzdHJhY3QuICBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDIvMTkvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSAlamF2YWNvbnN0KGZsYWcpIGNhbiBhbHNvIGJlIHVzZWQgb24gZW51bXMgYXMgd2VsbCBhcyBjb25zdGFudHMuCiAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBlbmFibGVzIHRydWUgSmF2YSBjb21waWxlciBjb25zdGFudHMgc28gdGhhdCB0aGV5IGNhbiBiZSAKICAgICAgICAgICAgdXNlZCBpbiBKYXZhIHN3aXRjaCBzdGF0ZW1lbnRzLiBUaGFua3MgdG8gSGVpbmVyIFBldGl0aCBmb3IgcGF0Y2hlcy4KCjAyLzE5LzIwMDM6IHNvbmd5YW5mIChUaWdlcikKICAgICAgICAgICAgTW9kaWZpZWQgLWZjb21wYWN0IGZlYXR1cmUgdG8gZGVhbCB3aXRoIFBQIGxpbmVzCgowMi8xOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjg5MDQwIF0gTWlzc2luZyByZXR1cm4gdmFsdWUgaW4gc3RkX3ZlY3Rvci5pLgogICAgICAgICAgICBSZXBvcnRlZCBieSBSb2JlcnQgSC4gZGUgVnJpZXMuCgowMi8xOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgZmV3IGV2aWwgc2NvcGluZyBwcm9ibGVtcyB3aXRoIHRlbXBsYXRlcywgbmFtZXNwYWNlcywgYW5kIHRoZQogICAgICAgICAgICAlZXh0ZW5kIGRpcmVjdGl2ZS4gIFByb2JsZW0gcmVwb3J0ZWQgYnkgTHVpZ2kgQmFsbGFiaW8uCgoKMDIvMTgvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtSdWJ5XSBJbXByb3ZlZCBzdXBwb3J0IGZvciBWaXN1YWwgQysrIGFuZCBvdGhlciBuYXRpdmUgV2luZG93cyBjb21waWxlcnMuIAogICAgICAgICAgICBJdCBpcyBubyBsb25nZXIgbmVjZXNzYXJ5IHRvIHNwZWNpZnkgIi9FWFBPUlQ6SW5pdF88bW9kdWxlPiIsIHdoZXJlIDxtb2R1bGU+IGlzIHRoZQogICAgICAgICAgICBzd2lnIG1vZHVsZSBuYW1lIHdoZW4gbGlua2luZyB1c2luZyB0aGVzZSBuYXRpdmUgV2luZG93cyBjb21waWxlcnMuCgowMi8xNS8yMDAzOiBzb25neWFuZiAoVGlnZXIpCiAgICAgICAgICAgIEFkZGVkIC1mdmlydHVhbCBvcHRpb24uCiAgICAgICAgICAgIFJlZHVjZSB0aGUgbGluZXMgYW5kIHNpemUgb2YgdGhlIHdyYXBwZXIgZmlsZQogICAgICAgICAgICBieSBvbWl0dGluZyByZWRpZmluZWQgdmlydHVhbCBmdW5jdGlvbiBpbiBjaGlsZHJlbiBjbGFzc2VzLgoKICAgICAgICAgICAgTW9kaWZpZWQgLWNvbXBhY3Qgb3B0aW9uIHRvIC1mY29tcGFjdCBvcHRpb24KCiAgICAgICAgICAgIEFkZGVkIC1zbWFsbCBvcHRpb24uCiAgICAgICAgICAgIC1zbWFsbCA9IC1mdmlydHVhbCAtZmNvbXBhY3QKICAgICAgICAgICAgQW5kIGl0IGNhbiBiZSBleHRlbmRlZCBieSBmdXR1cmUgZmVhdHVyZSBvcHRpb25zLAogICAgICAgICAgICB3aGljaCBhcmUgdXNlZCB0byByZWR1Y2Ugd3JhcHBlciBmaWxlIHN6aWUuCgogICAgICAgICAgICBBZGRlZCBTV0lHX0ZFQVRVUkVTIGVudmlyb25tZW50IHZhcmlhYmxlIGNoZWNrLgogICAgICAgICAgICBUbyBkeW5hbWljYWxseSBzZXQgdGhlIGZlYXR1cmUgb3B0aW9ucyBzdWNoIGFzIC1mY29tcGFjdCAmIC1mdmlydHVhbAogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowMi8xMy8yMDAzOiBsZW56CiAgICAgICAgICAgIFVwZGF0ZWQgRG9jL01hbnVhbC9QZXJsNS5odG1sIHRvIHRhbGsgYWJvdXQgQysrIGNvbXBpbGUgcHJvYmxlbXMKICAgICAgICAgICAgY29uZmlndXJlLmluIG5vdyBjaGVja3MgZm9yIFBFUkw1X0NDRkxBR1MKICAgICAgICAgICAgUnVudGltZS9NYWtlZmlsZS5pbiBhbmQgRXhhbXBsZS9NYWtlZmlsZS5pbiBub3cgdXNlIFBFUkw1X0NDRkxBR1MKICAgICAgICAgICAgQWRkZWQgTGliL3Blcmw1L25vZW1iZWQuaCB3aGljaCBjb250YWlucyBhbGwgdGhlIGtub3duIG1hY3JvIGNvbmZsaWN0cwoKMDIvMTIvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDY4NTQxMCBdIEMrKyBFeHBsaWNpdCB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIGNhdXNlcyBTV0lHIHRvIGV4aXQuCiAgICAgICAgICAgIEZpeGVzIGEgc3ludGF4IGVycm9yIHdpdGggZGVjbGFyYXRpb25zIHNpbWlsYXIgdG8gdGhpczoKCiAgICAgICAgICAgICAgICAgdGVtcGxhdGUgY2xhc3Mgc3RkOjp2ZWN0b3I8aW50PjsKCiAgICAgICAgICAgIFNXSUcgbm93IGlnbm9yZXMgdGhlIGluc3RhbnRpYXRpb24gYW5kIGdlbmVyYXRlcyBhIHdhcm5pbmcgbWVzc2FnZS4KICAgICAgICAgICAgV2UgbWlnaHQgZG8gbW9yZSBsYXRlci4gIFJlcG9ydGVkIGJ5IFRob21hcyBXaWxsaWFtc29uLgoKMDIvMTEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFJld3JvdGUgYm9vbCB0eXBlbWFwcyB0byByZW1vdmUgcGVyZm9ybWFuY2Ugd2FybmluZyBmb3IgY29tcGlsaW5nIGdlbmVyYXRlZCBjb2RlCiAgICAgICAgICAgIHVuZGVyIFZpc3VhbCBDKysuCgowMi8xMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4IGZvciB3cmFwcGluZyByZWZlcmVuY2UgdmFyaWFibGVzIChjb25zdCBub24tcHJpbWl0aXZlIGFuZCBhbGwgbm9uLWNvbnN0IHR5cGVzKSAKICAgICAgICAgICAgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgaW50JiBpOwogICAgICAgICAgICAgIENsYXNzJiBjOwogICAgICAgICAgICAgIGNvbnN0IENsYXNzJiBjOwoKMDIvMTEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBtb3JlIHZlcnkgc3VidGxlIHByZXByb2Nlc3NvciBjb3JuZXIgY2FzZXMgcmVsYXRlZCB0byByZWN1cnNpdmUKICAgICAgICAgICAgbWFjcm8gZXhwYW5zaW9uLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAgI2RlZmluZSBjYXQoeCx5KSB4ICMjIHkKCiAgICAgICAgICAgICAgICAgICBjYXQoY2F0KDEsMiksMykgICAgLy8gUHJvZHVjZXM6IGNhdCgxLDIpMwogICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAjZGVmaW5lIHhjYXQoeCx5KSBjYXQoeCx5KQoKICAgICAgICAgICAgICAgICAgIHhjYXQoeGNhdCgxLDIpLDMpICAvLyBQcm9kdWNlcyAxMjMKCiAgICAgICAgICAgIFNlZSBLJlIsIDJuZCBFZC4gcC4gMjMxLgoKMDIvMTAvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeGVkIFsgNjgzODgyIF0gLSBwYXRjaCBzdWJtaXR0ZWQgYnkgRi4gUG9zdG1hIGZvciBTV0lHIHRvIGNvbXBpbGUgb24gSFAtVVguCgowMi8xMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN1YnRsZSBwcmVwcm9jZXNzb3IgYXJndW1lbnQgZXhwYW5zaW9uIGJ1Zy4gUmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjAyLzEwLzIwMDM6IHNvbmd5YW5mCiAgICAgICAgICAgIEFkZGVkIC1jb21wYWN0IG9wdGlvbi4KICAgICAgICAgICAgUmVkdWNlIHRoZSBsaW5lcyBhbmQgc2l6ZSBvZiB0aGUgd3JhcHBlciBmaWxlCiAgICAgICAgICAgIGJ5IG9taXR0aW5nIGNvbW1lbnRzIGFuZCBjb21iaW5pbmcgc2hvcnQgbGluZXMuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKIAowMi8wNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjUxMzU1IF0gU3ludGF4IGVycm9yIHdpdGggY3N0cmluZy5pCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IE9tcmkgQmFyZWwuCgowMi8wNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjYzNjMyIF0gaW5jb21wYXRpYmlsaXR5IHdpdGggc3RhbmRhcmQgY3BwLgogICAgICAgICAgICBUaGlzIGlzIGEgcmVmaW5lbWVudCB0aGF0IGZpeGVzIHRoaXMgcHJvYmxlbToKCiAgICAgICAgICAgICAgICAgLy8gU29tZSBtYWNybyB3aXRoIGFuIGFyZ3VtZW50CiAgICAgICAgICAgICAgICAgI2RlZmluZSBGT08oeCkgICAgICAgeAoKICAgICAgICAgICAgICAgICBpbnQgRk9POyAgICAgICAgLyogTm90IGEgbWFjcm8tLS1ubyBhcmd1bWVudHMgKi8KIAowMi8wNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjc1NDkxIF0gcGFyc2UgZXJyb3Igd2l0aCBnbG9iYWwgbmFtZXNwYWNlIHF1YWxpZmljYXRpb24uCiAgICAgICAgICAgIFN1Ym1pdHRlZCBieSBKZXJlbXkgWWFsbG9wLgoKMDIvMDQvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBidWcgaW4gdmFyYXJncyBwcm9jZXNzaW5nIGludHJvZHVjZWQgYnkgdGhlIG51bWlucHV0cyB0eXBlbWFwIHBhcmFtZXRlci4KCjAxLzA4LzIwMDM6IHR0bgoJICAgIFt4bWxdIEZpeCBzdHJpbmctcmVwbGFjZW1lbnQgb3JkZXJpbmcgYnVnbGV0LgoJICAgIFRoYW5rcyB0byBHYXJ5IEhlcnJvbi4KCjEyLzIzLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGdXJ0aGVyIGJ1aWxkIGNoYW5nZXM6CiAgICAgICAgICAgIC0gVGhlIFNXSUcgZXhlY3V0YWJsZSBpcyBub3cgYnVpbHQgdXNpbmcgYSBzaW5nbGUgTWFrZWZpbGUuCiAgICAgICAgICAgIC0gVGhpcyBtYWtlZmlsZSBpcyBnZW5lcmF0ZWQgYnkgQXV0b21ha2UgKFNvdXJjZS9NYWtlZmlsZS5hbSkuCiAgICAgICAgICAgIC0gRGVwZW5kZW5jeSB0cmFja2luZyBhbmQgdGFncyBzdXBwb3J0IGFyZSBpbiB0aGlzIG1ha2VmaWxlLgogICAgICAgICAgICAtIEF1dG9tYWtlIDEuNy4yIGFuZCBBdXRvY29uZiAyLjU0IG1pbmltdW0gdmVyc2lvbnMgYXJlIG5lZWRlZCB0byBidWlsZCBTV0lHIGZyb20gQ1ZTLgogICAgICAgICAgICAtIFJ1bm5pbmcgLi9hdXRvZ2VuLnNoIG5vdyBpbnN0YWxscyBBdXRvY29uZi9BdXRvbWFrZSBzdXBwb3J0IGZpbGVzIGludG8KICAgICAgICAgICAgICBUb29scy9jb25maWcgYW5kIHRoZXNlIGZpbGVzIGFyZSBubyBsb25nZXIgc3RvcmVkIGluIENWUy4KICAgICAgICAgICAgLSBCdWcgZml4ZXMgaW4gJ21ha2UgaW5zdGFsbCcgZm9yIHN5c3RlbXMgdXNpbmcgLmV4ZSBleGVjdXRhYmxlIGV4dGVuc2lvbiBhbmQKICAgICAgICAgICAgICAuL2NvbmZpZ3VyZSAtLXdpdGgtcmVsZWFzZS1zdWZmaXg9d2hhdGV2ZXIKCjEyLzE2LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBNb3JlIGJ1aWxkIGNoYW5nZXM6CiAgICAgICAgICAgIC0gQXV0b2NvbmYncyBBQ19DQU5PTklDQUxfSE9TVCByZXBsYWNlcyBwcm9wcmlldGFyeSBhcHByb2FjaCBmb3IgZGV0ZWN0aW5nIGJ1aWxkIGhvc3QuCiAgICAgICAgICAgIC0gQXV0b2NvbmYgc3VwcG9ydCBmaWxlcyBtb3ZlZCB0byBUb29scy9jb25maWcuCgoxMi8xNi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgTW9kaWZpY2F0aW9ucyB0byBydW4gb24gTWFjT1MsIHN1Ym1pdHRlZCBieSBCZXJuYXJkIERlc2dyYXVwZXMuCiAgICAgICAgICAgIE1haW5seSBlbnN1cmluZyBnZW5lcmF0ZWQgZmlsZXMgYXJlIG91dHB1dCBpbiB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0b3J5IGZvcgogICAgICAgICAgICBzb21lIG1vZHVsZXMuCgoxMi8xMS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgVmFyaW91cyBidWlsZCBtb2RpZmljYXRpb25zIGFuZCBidWcgZml4ZXM6CiAgICAgICAgICAgIC0gU2ltcGxpZmljYXRpb24gb2YgdmVyc2lvbiBzdHJpbmcuIFVzZSBhdXRvY29uZidzIFBBQ0tBR0VfVkVSU0lPTiBpbnN0ZWFkLgogICAgICAgICAgICAtIEJ1aWxkIHRpbWUgcmVtb3ZlZCBmcm9tIFNXSUcgdmVyc2lvbi4KICAgICAgICAgICAgLSBVc2luZyBzdGFuZGFyZCBhdXRvY29uZiBjb25maWcgaGVhZGVyIGdlbmVyYXRpb24uCiAgICAgICAgICAgIC0gVXBkYXRlZCBvbGQgYXV0b2NvbmYgbWFjcm9zIGFzIHJlcG9ydGVkIGJ5IGF1dG91cGRhdGUuCiAgICAgICAgICAgIC0gUmVtb3ZlZCAkcHJlZml4IGluIGF1dG9jb25mIGZyb20gc2VhcmNoIHBhdGhzIGFzIGF1dG9jb25mIHdvbid0IGV4cGFuZCB0aGVtLgogICAgICAgICAgICAtIFN1YnRsZSBidWcgZml4IHdoZXJlICdtYWtlIHByZWZpeD0vc29tZXdoZXJlOyBtYWtlIGNsZWFuOyBtYWtlIHByZWZpeD0vc29td2hlcmUvZWxzZScKICAgICAgICAgICAgICBwcm9kdWNlZCBhbiBleGVjdXRhYmxlIHVzaW5nIHRoZSBpbmNvcnJlY3QgbGlicmFyeSBkaXJlY3Rvcmllcy4KICAgICAgICAgICAgLSBBZGRlZCAtbGRmbGFncyBjb21tYW5kbGluZSBvcHRpb24gZm9yIE16U2NoZW1lLCBPY2FtbCwgUGlrZSBhbmQgUEhQLgogICAgICAgICAgICAtIEZpeGVkIHJlcG9ydGluZyBvZiBjb21waWxlciB1c2VkIHdoZW4gdXNpbmcgLXZlcnNpb24gY29tbWFuZGxpbmUgb3B0aW9uLgogICAgICAgICAgICAtIFNXSUcgd2ViIGFkZHJlc3MgYWRkZWQgdG8gLXZlcnNpb24gY29tbWFuZGxpbmUgb3B0aW9uLgoKMTIvMTEvMjAwMjogYmVhemxleQogICAgICAgICAgICBNaW5vciBmaXggdG8gVGNsIGR5bmFtaWMgY2FzdCB0eXBlbWFwcy4gUmVwb3J0ZWQgYnkKICAgICAgICAgICAgS3Jpc3RvcGhlciBCbG9tLgoKMTIvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzdWJ0bGUgdGVtcGxhdGUgYXJndW1lbnQgcmVwbGFjZSBidWcuICBSZXBvcnRlZCBieQogICAgICAgICAgICBDaHJpcyBGbGF0bGV5LgoKMTIvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBSZXZlcnRlZCBDSEFOR0VTIDA5LzAzLzIwMDIsIHByZXByb2Nlc3NvciBhcmd1bWVudCBldmFsdWF0aW9uLiAgQXJndW1lbnRzCiAgICAgICAgICAgIGFyZSBub3QgZXZhbHVhdGVkIGR1cmluZyBjb2xsZWN0aW9uLCBLJlIsIHAuIDIzMC4KCjEyLzA2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2NDkwMjIgXSBDb21waWxhdGlvbiBwcm9ibGVtcyB3aXRoIEtBSS9LQ0MKCjEyLzAyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU1dJRyAncmVsLTEtMycgQ1ZTIGJyYW5jaCBtZXJnZWQgYmFjayBpbnRvIHRoZSBtYWluIGJyYW5jaC4KCgpWZXJzaW9uIDEuMy4xNyAoTm92ZW1iZXIgMjIsIDIwMDIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjExLzE5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2MTM5MjIgXSBwcmVwcm9jZXNzb3IgZXJyb3JzIHdpdGggSEFWRV9MT05HX0xPTkcuCiAgICAgICAgICAgIAoxMS8xOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjE1NDgwIF0gbXpzY2hlbWUgU1dJR19NdXN0R2V0UHRyXy4KCjExLzE5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2MzUxMTkgXSBTV0lHX2Nyb2FrIGNhdXNlcyBjb21waWxlciB3YXJuaW5nLgoKMTEvMTYvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBBZGRlZCB0eXBlbWFwcyBmb3IgcG9pbnRlcnMgdG8gY2xhc3MgbWVtYmVycy4KCjExLzE1LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQnVnIGZpeDogT3ZlcmxvYWRlZCBDKysgZnVuY3Rpb25zIHdoaWNoIGNhbm5vdCBiZSBvdmVybG9hZGVkIGluIEphdmEgCiAgICAgICAgICAgIG9uY2UgYWdhaW4gaXNzdWUgYSB3YXJuaW5nLgoKMTEvMTQvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBIYW5kbGluZyBvZiBOVUxMIHBvaW50ZXJzIGlzIGltcHJvdmVkLiBBIGphdmEgbnVsbCBvYmplY3Qgd2lsbCBub3cKICAgICAgICAgICAgYmUgdHJhbnNsYXRlZCB0byBhbmQgZnJvbSBhIE5VTEwgQy9DKysgcG9pbnRlciBieSBkZWZhdWx0LiBQcmV2aW91c2x5IHdoZW4gCiAgICAgICAgICAgIHdyYXBwaW5nOgoKICAgICAgICAgICAgICAgIGNsYXNzIFNvbWVDbGFzcyB7Li4ufTsKICAgICAgICAgICAgICAgIHZvaWQgZm9vKFNvbWVDbGFzcyAqcyk7CgogICAgICAgICAgICBhbmQgaXQgd2FzIGNhbGxlZCBmcm9tIEphdmEgd2l0aCBudWxsOgoKICAgICAgICAgICAgICAgIG1vZHVsZW5hbWUuZm9vKG51bGwpCgogICAgICAgICAgICBhIEphdmEgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2FzIHRocm93bi4gRXh0cmEgdHlwZW1hcHMgaGFkIHRvIGJlIHdyaXR0ZW4gaW4KICAgICAgICAgICAgb3JkZXIgdG8gb2J0YWluIGEgTlVMTCBwb2ludGVyIHRvIHBhc3MgdG8gZnVuY3Rpb25zIGxpa2UgdGhpcyBvbmUuIE5vdyB0aGUgCiAgICAgICAgICAgIGRlZmF1bHQgd3JhcHBpbmcgd2lsbCBkZXRlY3QgJ251bGwnIGFuZCB0cmFuc2xhdGUgaXQgaW50byBhIE5VTEwgcG9pbnRlci4KICAgICAgICAgICAgQWxzbyBpZiBhIGZ1bmN0aW9uIHJldHVybnMgYSBOVUxMIHBvaW50ZXIsIGVnOgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIFNvbWVDbGFzcyAqYmFyKCkgeyByZXR1cm4gTlVMTDsgfQogICAgICAgICAgICAKICAgICAgICAgICAgVGhlbiB0aGlzIHVzZWQgdG8gYmUgd3JhcHBlZCB3aXRoIGEgU29tZUNsYXNzIHByb3h5IGNsYXNzIGhvbGRpbmcgYSBOVUxMCiAgICAgICAgICAgIHBvaW50ZXIuIE5vdyBudWxsIGlzIHJldHVybmVkIGluc3RlYWQuIFRoZXNlIGNoYW5nZXMgYXJlIHN1YnRsZSBidXQgdXNlZnVsLgogICAgICAgICAgICBUaGUgb3JpZ2luYWwgYmVoYXZpb3VyIGNhbiBiZSBvYnRhaW5lZCBieSB1c2luZyB0aGUgb3JpZ2luYWwgdHlwZW1hcHM6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YW91dCkgU1dJR1RZUEUgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgJCZqYXZhY2xhc3NuYW1lKCRqbmljYWxsLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YW91dCkgU1dJR1RZUEUgKiwgU1dJR1RZUEUgJiwgU1dJR1RZUEUgW10gewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgJGphdmFjbGFzc25hbWUoJGpuaWNhbGwsICRvd25lcik7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFnZXRjcHRyKSBTV0lHVFlQRSwgU1dJR1RZUEUgKiwgU1dJR1RZUEUgJiwgU1dJR1RZUEUgW10gJXsKICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyBsb25nIGdldENQdHIoJGphdmFjbGFzc25hbWUgb2JqKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iai5zd2lnQ1B0cjsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCgoxMS8xMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBhYnN0cmFjdCBtZXRob2RzIGFuZCBzaWduYXR1cmVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICBjbGFzcyBhYnN0cmFjdF9mb28geyAKICAgICAgICAgICAgcHVibGljOiAKICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50ICAgbWV0aChpbnQgbWV0aF9wYXJhbSkgPSAwOyAKICAgICAgICAgICAgfTsgCiAKIAogICAgICAgICAgICBjbGFzcyBhYnN0cmFjdF9iYXIgOiBwdWJsaWMgYWJzdHJhY3RfZm9vIHsgCiAgICAgICAgICAgIHB1YmxpYzogCiAgICAgICAgICAgICAgICBpbnQgbWV0aChpbnQgbWV0aF9wYXJhbV8xLCBpbnQgbWV0aF9wYXJhbV8yKSB7IHJldHVybiAwOyB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIGFic3RyYWN0X2JhciBpcyBzdGlsbCBhYnN0cmFjdC4KCiAgICAgICAgICAgIEZpeGVzIFsgNjI4NDM4IF0gRGVyaXZlZCBhYnN0cmFjdCBjbGFzcyBub3QgYWJzdHJhY3QuCiAgICAgICAgICAgIFJlcG9ydGVkIGFuZCBwYXRjaGVkIGJ5IFNjb3R0IE1pY2hlbC4KCjExLzExLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBtYXRjaGluZyBwcm9ibGVtIHdpdGggdHlwZW1hcHMgYW5kIGFycmF5IGRpbWVuc2lvbnMuICBGb3IgZXhhbXBsZSwgaWYgeW91CiAgICAgICAgICAgIGhhZCB0aGlzOgoKICAgICAgICAgICAgICAgdHlwZWRlZiBjaGFyIGJsYWhbMjBdOwoKICAgICAgICAgICAgYW5kIGEgdHlwZW1hcDoKCiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgY2hhciBbQU5ZXSB7CiAgICAgICAgICAgICAgICAgICAuLi4gJDFfZGltMCAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhlbiAkMV9kaW0qIHZhcmlhYmxlcyB3ZXJlbid0IGJlIGV4cGFuZGVkIHByb3Blcmx5LiAgSXQgc2hvdWxkIHdvcmsgbm93LgogICAgICAgICAgICBQcm9ibGVtIHJlcG9ydGVkIGJ5IFBhbmthaiBLdW1hciBHb2VsLgogICAgICAgICAgICAgICAKMTEvMDcvMjAwMjogbWtvZXBwZQoJICAgIEFkZGVkIGFuIGV4cGVyaW1lbnRhbCBuZXcgbW9kdWxlIHRoYXQgZHVtcHMgU1dJRydzIHBhcnNlCgkgICAgdHJlZSBhcyAoQ29tbW9uKSBMaXNwIHMtZXhwcmVzc2lvbnMuICBUaGUgbW9kdWxlIGlzCgkgICAgaW52b2tlZCB3aXRoIFNXSUcncyAtc2V4cCBjb21tYW5kLWxpbmUgc3dpdGNoLiAgVGhlIG91dHB1dAoJICAgIGNhbiBiZSByZWFkIGludG8gQ29tbW9uIExpc3AuICBUaGVyZSBpcyAocHJvdG90eXBlKQoJICAgIGV4YW1wbGUgTGlzcCBjb2RlIHRoYXQgZ2VuZXJhdGVzIEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlCgkgICAgZGVmaW5pdGlvbnMgZm9yIHVzZSB3aXRoIEtldmluIFJvc2VuYmVyZydzIFVGRkkuCgoJICAgICoqKiBFWFBFUklNRU5UQUwgTkVXIEZFQVRVUkUgKioqCgoxMS8wNy8yMDAyOiBta29lcHBlCgkgICAgUmVtb3ZlZCBkdXBsaWNhdGUgZGVjbGFyYXRpb24gb2YgImNwcF90ZW1wbGF0ZV9kZWNsIiBpbgoJICAgIHBhcnNlci55OyBiaXNvbiAxLjc1IGNvbXBsYWluZWQuCgoxMS8wNi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIERlZmF1bHQgcHJpbWl0aXZlIGFycmF5IGhhbmRsaW5nIGhhcyBjaGFuZ2VkIGxpa2UgYXJyYXlzIG9mIGNsYXNzZXMuIAogICAgICAgICAgICBDIHByaW1pdGl2ZSBhcnJheXMgYXJlIG5vIGxvbmdlciB3cmFwcGVkIGJ5IGEgSmF2YSBhcnJheSBidXQgd2l0aCBhIHBvaW50ZXIgCiAgICAgICAgICAgICh0eXBlIHdyYXBwZXIgY2xhc3MpLiBBZ2FpbiB0aGUgY2hhbmdlcyBoYXZlIGJlZW4gbWFkZSBmb3IgZWZmaWNpZW5jeSByZWFzb25zLiAKICAgICAgICAgICAgVGhlIG9yaWdpbmFsIHR5cGVtYXBzIGhhdmUgYmVlbiBtb3ZlZCBpbnRvIGFycmF5c19qYXZhLmksIHNvIHRoZSBvcmlnaW5hbCAKICAgICAgICAgICAgYmVoYXZpb3VyIGNhbiBiZSBvYnRhaW5lZCBtZXJlbHkgaW5jbHVkaW5nIHRoaXMgZmlsZToKCiAgICAgICAgICAgICAgICAlaW5jbHVkZSAiYXJyYXlzX2phdmEuaSIKCiAgICAgICAgICAgIFRoZSBhcnJheSBzdXBwb3J0IGZ1bmN0aW9ucyBhcmUgbm8gbG9uZ2VyIGdlbmVyYXRlZCBieSBkZWZhdWx0LiBUaGV5IGFyZSBvbmx5CiAgICAgICAgICAgIGdlbmVyYXRlZCB3aGVuIGluY2x1ZGluZyB0aGlzIGZpbGUsIHRodXMgdGhpcyBvZnRlbiB1bnVzZWQgY29kZSBpcyBvbmx5CiAgICAgICAgICAgIGdlbmVyYXRlZCB3aGVuIHNwZWNpZmljYWxseSByZXF1aXJpbmcgdGhpcyB0eXBlIG9mIGFycmF5IHN1cHBvcnQuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgoxMS8wNS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgc3VwcG9ydCBmb3IgbmVzdGVkIG1vZHVsZSBkZWNsYXJhdGlvbnMgKGFzIHdhcwogICAgICAgICAgICBwcmV2aW91c2x5IGFkZGVkIGZvciB0aGUgUGVybCBtb2R1bGUpLiBTbyBhICVtb2R1bGUgZGlyZWN0aXZlCiAgICAgICAgICAgIG9mIHRoZSBmb3JtOgoKICAgICAgICAgICAgICAgICVtb2R1bGUgIk91dGVyOjpJbm5lcjo6Rm9vIgoKICAgICAgICAgICAgd2lsbCBuZXN0IGV2ZXJ5dGhpbmcgYXMgKGluIFJ1YnkgY29kZSk6CgogICAgICAgICAgICAgICAgbW9kdWxlIE91dGVyCiAgICAgICAgICAgICAgICAgIG1vZHVsZSBJbm5lcgogICAgICAgICAgICAgICAgICAgIG1vZHVsZSBGb28KICAgICAgICAgICAgICAgICAgICAgICMgc3R1ZmYgZ29lcyBoZXJlCiAgICAgICAgICAgICAgICAgICAgZW5kCiAgICAgICAgICAgICAgICAgIGVuZAogICAgICAgICAgICAgICAgZW5kCiAKMTEvMDUvMjAwMjogbWtvZXBwZSAKCSAgICBbTXpTY2hlbWVdIEFkZCBhbiBhcmd1bWVudCAoLWRlY2xhcmVtb2R1bGUpIHRoYXQgZ2VuZXJhdGVzCgkgICAgY29kZSB0byBjb3JyZWN0bHkgZGVjbGFyZSBhIHByaW1pdGl2ZSBtb2R1bGUgZXh0ZW5zaW9uLgoJICAgIFBhdGNoIHN1Ym1pdHRlZCBieSBCcnVjZSBCdXR0ZXJmaWVsZC4KCjExLzAyLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQWRkZWQgcGF0Y2ggc3VibWl0dGVkIGJ5IE1pY2hhZWwgQ2FoaWxsIHRvIHJlbW92ZSB1bnVzZWQgcGFyYW1ldGVyCiAgICAgICAgICAgIHdhcm5pbmdzIGZvciB0aGUgamVudiBhbmQgY2xzIHBhcmFtZXRlcnMuIFRoaXMgcGF0Y2ggYWxzbyBhbHNvIGFsbG93cyBvbmUKICAgICAgICAgICAgdG8gdXNlICJ2b2lkIiBpbiB0aGUgam5pIHR5cGVtYXAgZm9yIGFueSB0eXBlIHdpdGhvdXQgY29kZSBiZWluZyBnZW5lcmF0ZWQKICAgICAgICAgICAgYXR0ZW1wdGluZyB0byByZXR1cm4gYSB2YWx1ZS4KCjEwLzI5LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQXJyYXkgaGFuZGxpbmcgaXMgZGlmZmVyZW50LiBBcnJheXMgb2YgY2xhc3NlcyBhcmUgbm8gbG9uZ2VyIHdyYXBwZWQKICAgICAgICAgICAgd2l0aCBwcm94eSBhcnJheXMsIGVnIHdyYXBwaW5nCgogICAgICAgICAgICAgICAgY2xhc3MgWCB7Li4ufTsKICAgICAgICAgICAgICAgIFggZm9vWzEwXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHVzZWQgdG8gYmUgd3JhcHBlZCB3aXRoIHRoZXNlIEphdmEgZ2V0dGVycyBhbmQgc2V0dGVyczoKCiAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Rm9vKFhbXSB2YWx1ZSkgey4uLn0KICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgWFtdIGdldEZvbygpIHsuLi59CgogICAgICAgICAgICBUaGlzIGFwcHJvYWNoIGlzIHZlcnkgaW5lZmZpY2llbnQgYXMgdGhlIGVudGlyZSBhcnJheSBpcyBjb3BpZWQgbnVtZXJvdXMKICAgICAgICAgICAgdGltZXMgb24gZWFjaCBpbnZvY2F0aW9uIG9mIHRoZSBnZXR0ZXIgb3Igc2V0dGVyLiBUaGVzZSBhcnJheXMgYXJlIG5vdwogICAgICAgICAgICB3cmFwcGVkIHdpdGggYSBwb2ludGVyIHNvIGl0IGlzIG9ubHkgcG9zc2libGUgdG8gYWNjZXNzIHRoZSBmaXJzdCBhcnJheSBlbGVtZW50IAogICAgICAgICAgICB1c2luZyBhIHByb3h5IGNsYXNzOgoKICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGb28oWCB2YWx1ZSkgey4uLn0KICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgWCBnZXRGb28oKSB7Li4ufQoKICAgICAgICAgICAgQXJyYXlzIG9mIGVudW1zIGhhdmUgYWxzbyBiZWVuIHNpbWlsYXJseSBjaGFuZ2VkLiBUaGlzIGJlaGF2aW91ciBpcyBub3cgbGlrZSB0aGUgCiAgICAgICAgICAgIG90aGVyIFNXSUcgbGFuZ3VhZ2UncyBpbXBsZW1lbnRhdGlvbiBhbmQgdGhlIGFycmF5IGxpYnJhcnkgc2hvdWxkIGJlIHVzZWQgdG8gCiAgICAgICAgICAgIGFjY2VzcyB0aGUgb3RoZXIgZWxlbWVudHMuIFRoZSBvcmlnaW5hbCBiZWhhdmlvdXIgY2FuIGJlIGFjaGlldmVkIHVzaW5nIHRoZSAKICAgICAgICAgICAgbWFjcm9zIGFuZCB0eXBlbWFwcyBpbiBhcnJheXNfamF2YS5pLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlaW5jbHVkZSAiYXJyYXlzX2phdmEuaSIKICAgICAgICAgICAgICAgIEpBVkFfQVJSQVlTT0ZDTEFTU0VTKFgpCiAgICAgICAgICAgICAgICBjbGFzcyBYIHsuLi59OwogICAgICAgICAgICAgICAgWCBmb29bMTBdOwoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMTAvMjkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBUd28gbmV3IHR5cGVtYXBzIGphdmFpbiBhbmQgamF2YW91dCBmb3IgZ2VuZXJhdGluZyB0aGUgcHJveHkgY2xhc3MgCiAgICAgICAgICAgIGFuZCB0eXBlIHdyYXBwZXIgY2xhc3MgbWV0aG9kIGNhbGxzIHRvIHRoZSBKTkkgY2xhc3MuIFRoZSBuZXcgdHlwZW1hcHMgYXJlIAogICAgICAgICAgICByZWFsbHkgdXNlZCBmb3IgdHJhbnNmb3JtaW5nIHRoZSBqc3R5cGUgKHVzZWQgaW4gcHJveHkgY2xhc3MgYW5kIHR5cGUgd3JhcHBlcgogICAgICAgICAgICBjbGFzc2VzKSB0byB0aGUganR5cGUgKHVzZWQgaW4gdGhlIEpOSSBjbGFzcykgYW5kIHZpc2EgdmVyc2EuIEEgamF2YWluIHR5cGVtYXAKICAgICAgICAgICAgaXMgcmVxdWlyZWQgd2hlbmV2ZXIgYW4gaW4gdHlwZW1hcCBpcyB3cml0dGVuIGFuZCBzaW1pbGFybHkgamF2YW91dCBmb3IgYW4gb3V0CiAgICAgICAgICAgIHR5cGVtYXAuIEFuIGV4YW1wbGUgaXMgcHJvYmFibHkgYmVzdCB0byBzaG93IHRoZW0gd29ya2luZzoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhaW4pIENsYXNzICJDbGFzcy5nZXRDUHRyKCRqYXZhaW5wdXQpIgogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWluKSB1bnNpZ25lZCBzaG9ydCAiJGphdmFpbnB1dCIKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFvdXQpIENsYXNzICogewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2xhc3MoJGpuaWNhbGwsICRvd25lcik7CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAlaW5saW5lICV7CiAgICAgICAgICAgICAgICAgICAgY2xhc3MgQ2xhc3Mge307CiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgKiBiYXIoQ2xhc3MgY2xzLCB1bnNpZ25lZCBzaG9ydCB1c2gpIHsgcmV0dXJuIG5ldyBDbGFzcygpOyB9OwogICAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFRoZSBnZW5lcmF0ZWQgcHJveHkgY29kZSBpcyB0aGVuOgoKICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3MgYmFyKENsYXNzIGNscywgaW50IHVzaCkgewogICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENsYXNzKGV4YW1wbGVKTkkuYmFyKENsYXNzLmdldENQdHIoY2xzKSwgdXNoKSwgZmFsc2UpOwogICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIFNvbWUgbmV3IHNwZWNpYWwgdmFyaWFibGVzIGhhdmUgYmVlbiBpbnRyb2R1Y2VkIGluIG9yZGVyIHRvIHVzZSB0aGVzZSB0eXBlbWFwcy4KICAgICAgICAgICAgSGVyZSAkamF2YWlucHV0IGhhcyBiZWVuIHJlcGxhY2VkIGJ5ICdjbHMnIGFuZCAndXNoJy4gJGpuaWNhbGwgaGFzIGJlZW4gcmVwbGFjZWQgYnkgCiAgICAgICAgICAgIHRoZSBuYXRpdmUgbWV0aG9kIGNhbGwsICdleGFtcGxlSk5JLmJhciguLi4pJyBhbmQgJG93bmVyIGhhcyBiZWVuIHJlcGxhY2VkIGJ5ICdmYWxzZScuCiAgICAgICAgICAgICRqYXZhaW5wdXQgaXMgYW5hbG9nb3VzIHRvIHRoZSAkaW5wdXQgc3BlY2lhbCB2YXJpYWJsZS4gSXQgaXMgcmVwbGFjZWQgYnkgdGhlIHBhcmFtZXRlciBuYW1lLgogICAgICAgICAgICAkam5pY2FsbCBpcyBhbmFsb2dvdXMgdG8gJGFjdGlvbiBpbiAlZXhjZXB0aW9uLiBJdCBpcyByZXBsYWNlZCBieSB0aGUgY2FsbCB0byB0aGUgbmF0aXZlCiAgICAgICAgICAgIG1ldGhvZCBpbiB0aGUgSk5JIGNsYXNzLgogICAgICAgICAgICAkb3duZXIgaXMgcmVwbGFjZWQgYnkgZWl0aGVyIHRydWUgaWYgJW5ld29iamVjdCBoYXMgYmVlbiB1c2VkIG90aGVyd2lzZSBmYWxzZS4KCiAgICAgICAgICAgIFRoZSBqYXZhLnN3ZyBmaWxlIGNvbnRhaW5zIGRlZmF1bHQgamF2YWluIGFuZCBqYXZvdXQgdHlwZW1hcHMgd2hpY2ggd2lsbCBwcm9kdWNlIHRoZSBzYW1lIGNvZGUKICAgICAgICAgICAgYXMgcHJldmlvdXNseS4gVGhpcyBjaGFuZ2UgaXMgb25seSBvZiBjb25jZXJuIHRvIHRob3NlIHdobyBoYXZlIHdyaXR0ZW4gdGhlaXIgb3duIHR5cGVtYXBzIGFzCiAgICAgICAgICAgIHlvdSB3aWxsIHRoZW4gbW9zdCBsaWtlbHkgaGF2ZSB0byB3cml0ZSB5b3VyIG93biBqYXZhaW4gYW5kIGphdmFvdXQgdHlwZW1hcHMuCgogICAgICAgICAgICBUaGUgamF2YW91dCB0eXBlbWFwIGFsc28gbWFrZXMgaXQgcG9zc2libGUgdG8gdXNlIGEgSmF2YSBkb3duY2FzdCB0byBiZSB1c2VkIG9uIGFic3RyYWN0IAogICAgICAgICAgICBwcm94eSBiYXNlIGNsYXNzZXMuIFNlZSB0aGUgSmF2YSBkb2N1bWVudGF0aW9uIG9uIGR5bmFtaWNfY2FzdC4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjEwLzI0LzIwMDI6IHR0bgoJICAgIFtNZXRob2RvbG9neV0gVXBnYWRlZCB0byBsaWJ0b29sIDEuNC4zLCBwcmVzdW1hYmx5IHcvIGJldHRlcgoJICAgIHN1cHBvcnQgZm9yIG5ld2lzaCBwbGF0Zm9ybXMgKGxpa2UgTWFjT1MgWCkuCgoxMC8yMS8yMDAyOiB0dG4KCSAgICBGaXhlZCBSdW50aW1lL01ha2VmaWxlLmluIGJ1ZyAtLSB0aGFua3MgdG8gUmljaGFyZCBDYWxtYmFjaC4KCjEwLzE4LzIwMDI6IHR0bgoJICAgIEZpeGVkIHR5cG8gaW4gZG9oLmggLS0gdGhhbmtzIHRvIE1heCBIb3JuLgoKVmVyc2lvbiAxLjMuMTYgKE9jdG9iZXIgMTQsIDIwMDIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTAvMTMvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBidWcgd2l0aCAlZXh0ZW5kIGRpcmVjdGl2ZSBhbmQgJWZlYXR1cmUgcmVwb3J0ZWQKICAgICAgICAgICAgYnkgV2lsbGlhbSBGdWx0b24uCgoxMC8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIE9wZW5WTVMgYnVpbGQgZGlyZWN0b3J5ICh2bXMpLiAgQ29udHJpYnV0ZWQgYnkgCiAgICAgICAgICAgIEplYW4tRnJhbudvaXMgUGllcm9ubmUuCgoxMC8wOS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEFkZGVkIHRocm93cyBjbGF1c2UgdG8gdGhlIG5hdGl2ZSBmdW5jdGlvbnMgaW4gdGhlIEpOSSBjbGFzcy4KICAgICAgICAgICAgVGhlIHRocm93cyBjbGF1c2UgaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSBnZW5lcmF0ZWQgZm9yIHByb3h5IGZ1bmN0aW9ucwogICAgICAgICAgICBhbmQgbW9kdWxlIGNsYXNzIGZ1bmN0aW9ucy4KCjA5LzI3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc29tZSBwcm9ibGVtcyB3aXRoIHRoZSAlaW1wb3J0IGRpcmVjdGl2ZSBhbmQgY2xhc3NlcyB0aGF0CiAgICAgICAgICAgIHdlcmUgZGVmaW5lZCBidXQgbm90IHdyYXBwZWQuICBQcm9ibGVtIHJlcG9ydGVkIGJ5IExlc2xpZSBCcm9va3MsCiAgICAgICAgICAgIEdlcnJ5IFdvb2RzLCBhbmQgb3RoZXJzLgoKMDkvMjMvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBTb21lIGVycm9yIGNoZWNraW5nIGFkZGVkOgogICAgICAgICAgICAxKSBPdXRPZk1lbW9yeUV4Y2VwdGlvbiBjaGVjayBpbiB0aGUgY2hhciAqIHR5cGVtYXBzLiAKICAgICAgICAgICAgMikgQXMgU1dJRyB0cmVhdHMgcG9pbnRlcnMsIHJlZmVyZW5jZXMgYW5kIHBhc3NpbmcgYnkgdmFsdWUgYWxsIHRoZQogICAgICAgICAgICBzYW1lLCBpdCBpcyBwb3NzaWJsZSB0byBwYXNzIGEgTlVMTCBwb2ludGVyIHRvIGEgZnVuY3Rpb24gdGhhdCBleHBlY3RzCiAgICAgICAgICAgIGFuIG9iamVjdCBwYXNzZWQgYnkgdmFsdWUgb3IgYnkgcmVmZXJlbmNlLiBBIE51bGxQb2ludGVyRXhjZXB0aW9uIGlzIAogICAgICAgICAgICBub3cgdGhyb3duIHVuZGVyIHRoaXMgc2NlbmFyaW8uCgowOS8yMC8yMDAyOiB0dG4KCSAgICBbTWV0aG9kb2xvZ3ldIFJld29ya2VkICJtYWtlIGNsZWFuIiBhbmQgIm1ha2UgaW5zdGFsbCIKCQkJICB0byBiZSBtb3JlIHRhYmxlIGRyaXZlbi4KCSAgICBbRG9jc10gRXhwbGFpbiBob3cgdG8gZXh0ZW5kICJtYWtlIGluc3RhbGwiIHcvIGV4dHJhLWluc3RhbGwubGlzdC4KCjA5LzE1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRGVwcmVjYXRpb24gb2YgdGhlICJpZ25vcmUiIHR5cGVtYXAuICAgVGhlICJpZ25vcmUiIHR5cGVtYXAgaGFzCiAgICAgICAgICAgIGJlZW4gZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBhIGdlbmVyYWxpemF0aW9uIG9mIHRoZSAiaW4iIHR5cGVtYXAuCiAgICAgICAgICAgIFRvIGlnbm9yZSBhbiBhcmd1bWVudCwgdXNlIHNvbWV0aGluZyBsaWtlIHRoaXMgaW5zdGVhZDoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChpbixudW1pbnB1dHM9MCkgaW50ICpvdXRwdXQgKGludCB0ZW1wKSB7CiAgICAgICAgICAgICAgICAgICAgICQxID0gJnRlbXA7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGlzIGNoYW5nZSBmaXhlcyBhIG51bWJlciBvZiBzdWJ0bGUgYnVncyByZWxhdGVkIHRvIHRoZSBpbnRlcmFjdGlvbgogICAgICAgICAgICBvZiB0aGUgImluIiBhbmQgImlnbm9yZSIgdHlwZW1hcHMgKHdoaWNoIHdlcmUgc3VwcG9zZWQgdG8gYmUKICAgICAgICAgICAgbXV0dWFsbHkgZXhjbHVzaXZlKS4KCiAgICAgICAgICAgIFRoZSB1c2Ugb2YgdGhlIG51bWlucHV0cyBhcmd1bWVudCBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIGV4cGFuc2lvbi4KICAgICAgICAgICAgQ3VycmVudGx5LCB2YWx1ZXMgPjEgd2lsbCBnZW5lcmF0ZSBhbiBlcnJvci4gIEhvd2V2ZXIsIGZ1dHVyZQogICAgICAgICAgICByZWxlYXNlcyBvZiBTV0lHIG1heSB1dGlsaXplIHRoYXQgdG8gc3VwcG9ydCBtdWx0aS1pbnB1dCB0eXBlbWFwcy4KCiAgICAgICAgICAgICV0eXBlbWFwKGlnbm9yZSkgc3RpbGwgd29ya3MsIGJ1dCBnZW5lcmF0ZXMgYSB3YXJuaW5nIG1lc3NhZ2UgYW5kIGlzCiAgICAgICAgICAgIHRyYW5zbGF0ZWQgdG8gJXR5cGVtYXAoaW4sbnVtaW5wdXRzPTApLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA5LzE1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc2VnbWVudGF0aW9uIGZhdWx0IGZvciB1bm5hbWVkIHN0cnVjdHVyZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0IHsKICAgICAgICAgICAgICAgfSAqYmxhaDsKCgogICAgICAgICAgICBSZXBvcnRlZCBieSBSb2dlciBHaWJzb24uCiAgICAgICAgICAgIE5vdGU6IHdlIG1pZ2h0IGJlIGFibGUgdG8gZ2VuZXJhdGUgd3JhcHBlcnMgaW4gc3BlY2lhbCBjYXNlcy4KCjA5LzEzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWlub3IgbW9kaWZpY2F0aW9uIHRvIGdlbmVyYXRlZCB3cmFwcGVyIGZ1bmN0aW9ucy4gIFBvaW50ZXIgYXJndW1lbnRzIGFyZSBub3cKICAgICAgICAgICAgYWx3YXlzIHNldCB0byBhbiBpbml0aWFsIHZhbHVlIG9mIDAuICAgU2ltcGxpZmllcyB0eXBlbWFwIHdyaXRpbmcgYW5kIGNsZWFudXAKICAgICAgICAgICAgY29kZSAoc2luY2UgeW91IGNhbiByZWx5IG9uIHplcm8tdmFsdWUgaW5pdGlhbGl6YXRpb24pLiAgIFRoaXMgYWxzbyBncmVhdGx5CiAgICAgICAgICAgIHJlZHVjZXMgdGhlIG5lZWQgdG8gZXZlciB3cml0ZSBhbiAiYXJnaW5pdCIgdHlwZW1hcC4KCjA5LzEyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWlub3IgZW5oYW5jZW1lbnQgdG8gc21hcnQtcG9pbnRlciBzdXBwb3J0LiAgSWYgb3BlcmF0b3ItPigpCiAgICAgICAgICAgIGlzIHBhcnQgb2YgYW4gaWdub3JlZCBiYXNlIGNsYXNzIGxpa2UgdGhpcywKCiAgICAgICAgICAgICAgICAgJWlnbm9yZSBCYXI7CgogICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBpbnQgYmxhaCgpOwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7ICAgICAgICAgLyogSWdub3JlZCAqLwogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgIEZvbyAqb3BlcmF0b3ItPigpOwogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICBjbGFzcyBTcGFtIDogcHVibGljIEJhciB7IH07CgogICAgICAgICAgICB0aGVuIG1ldGhvZHMgZnJvbSBGb28gYXJlIHN0aWxsIGF2YWlsYWJsZS4gIEZvciBleGFtcGxlLAoKICAgICAgICAgICAgICAgICA+Pj4gcyA9IFNwYW0oKQogICAgICAgICAgICAgICAgID4+PiBzLmJsYWgoKQogICAgICAgICAgICAgICAgIDAKICAgICAgICAgICAgICAgICA+Pj4KCiAgICAgICAgICAgICBUaGUgb25seSBjYXRjaCBpcyB0aGF0IHRoZSBvcGVyYXRvci0+KCkgaXRzZWxmIGlzIG5vdCBhdmFpbGFibGUKICAgICAgICAgICAgIChzaW5jZSBpdCB3YXNuJ3Qgd3JhcHBlZCkuICAgVGhlcmVmb3JlLCB0aGVyZSB3b24ndCBiZSBhbnkKICAgICAgICAgICAgIF9fZGVyZWZfXygpIG9wZXJhdGlvbiB1bmxlc3MgaXQgaXMgZXhwbGljaXRseSBhZGRlZCB0byBTcGFtCiAgICAgICAgICAgICAoZWl0aGVyIHVzaW5nICVleHRlbmQgb3IganVzdCBwbGFjaW5nIG9wZXJhdG9yLT4oKSBpbiB0aGUKICAgICAgICAgICAgIGRlZmluaXRpb24gb2YgU3BhbSkuCgowOS8xMS8yMDAyOiB0dG4KCSAgICBbTWV0aG9kb2xvZ3ldIFJld29ya2VkICJtYWtlIGNoZWNrIiB0byBiZSBtb3JlIHRhYmxlIGRyaXZlbi4KCSAgICBbRG9jc10gRG9jdWVtZW50ZWQgbWV0aG9kb2xvZ3kgaW4gTWFudWFsL0V4dGVuZGluZy5odG1sLgoKMDkvMTEvMjAwMjogdHRuCgkgICAgW0RvY3NdIFByZWZpeGVkIE1hbnVhbC8qLmh0bWwgd2l0aCAiPCFET0NUWVBFIGh0bWwgLi4uPiIgdG8KCSAgICBwYW5kZXIgZG90aW5nbHkgdG8gKG92ZXItKXNlbnNpdGl2ZSBlZGl0b3JzLgoKMDkvMTAvMjAwMjogdHRuCgkgICAgW0d1aWxlXSBDb252ZXJ0ZWQgRXhhbXBsZXMvZ3VpbGUvc2ltcGxlICJtYWtlIGNoZWNrIgoJICAgIGJlaGF2aW9yIHRvIGFjdHVhbGx5IGNoZWNrIGV4ZWN1dGlvbiByZXN1bHRzLiAgUmVkdWNlZAoJICAgIGl0ZXJhdGlvbiBjb3VudHMgc28gdGhhdCB0aGUgdGVzdCBkb2Vzbid0IHRha2UgdG9vIGxvbmcuCgowOS8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNXSUctMS4zLjE1IHJlbGVhc2VkLgoKClZlcnNpb24gMS4zLjE1IChTZXB0ZW1iZXIgOSwgMjAwMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDkvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBuYXN0eSBydW50aW1lIHR5cGUgY2hlY2tpbmcgYnVnIHdpdGggc3VidHlwZXMgYW5kIGluaGVyaXRhbmNlCiAgICAgICAgICAgIGFuZCB0ZW1wbGF0ZXMuIAoKMDkvMDkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBKYXZhIGV4Y2VwdGlvbiBjbGFzc2VzIGZvciBhIG1ldGhvZCdzIHRocm93cyBjbGF1c2UgY2FuIGJlIGdlbmVyYXRlZCBieSAKICAgICAgICAgICAgc3BlY2lmeWluZyB0aGVtIGluIGEgY29tbWEgc2VwYXJhdGVkIGxpc3QgaW4gdGhlIHRocm93cyBhdHRyaWJ1dGUgaW4gYW55IG9uZQogICAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHR5cGVtYXBzOiBpbiwgb3V0LCBjaGVjaywgZnJlZWFyZywgYXJnb3V0IGFuZCB0aHJvd3MuIEEgY2xhc3NpYwogICAgICAgICAgICBleGFtcGxlIHdvdWxkIGJlIHRvIGNvbnZlcnQgQysrIGV4Y2VwdGlvbnMgaW50byBhIHN0YW5kYXJkIEphdmEgZXhjZXB0aW9uOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKHRocm93cywgdGhyb3dzPSJqYXZhLmlvLklPRXhjZXB0aW9uIikgZmlsZV9leGNlcHRpb24gewogICAgICAgICAgICAgICAgICAgIGpjbGFzcyBleGNlcCA9IGplbnYtPkZpbmRDbGFzcygiamF2YS9pby9JT0V4Y2VwdGlvbiIpOwogICAgICAgICAgICAgICAgICAgIGlmIChleGNlcCkKICAgICAgICAgICAgICAgICAgICAgICAgamVudi0+VGhyb3dOZXcoZXhjZXAsICQxLndoYXQoKSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRudWxsOyAvLyBvciB1c2UgU1dJR19mYWlsCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2xhc3MgZmlsZV9leGNlcHRpb24gey4uLn07CiAgICAgICAgICAgICAgICB2b2lkIG9wZW4oY29uc3QgY2hhciAqZmlsZW5hbWUpIHRocm93KGZpbGVfZXhjZXB0aW9uKTsKCiAgICAgICAgICAgIFRoZSBKYXZhIG1ldGhvZCB3aWxsIHRoZW4gYmUgZGVjbGFyZWQgd2l0aCBhIHRocm93cyBjbGF1c2U6CgogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIG9wZW4oU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Li4ufQoKMDkvMDgvMjAwMjogbWtvZXBwZQoJICAqIFtHdWlsZV0gSW1wcm92ZWQgdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtLiAgVGhlIGFyZ2xpc3Qgbm8KCSAgICBsb25nZXIgZ2V0cyBjbHV0dGVyZWQgd2l0aCB0eXBlIHNwZWNpZmljYXRpb24sIG1ha2luZyBpdAoJICAgIG1vcmUgcmVhZGFibGUuICAoQWxzbyB0aGUgSUxJU1AgZnVuY3Rpb24gQy11IE0teAoJICAgIGBhcmdsaXN0LWxpc3AnIFJFVCB3b3JrcyBiZXR0ZXIgdGhpcyB3YXkuKSAgVGhlIHR5cGVzIG9mCgkgICAgYXJndW1lbnRzIGFyZSBleHBsYWluZWQgaW4gYW4gZXh0cmEgc2VudGVuY2UgYWZ0ZXIgdGhlCgkgICAgYXJnbGlzdC4gCgkgICAgCgkgICAgVGhlcmUgYXJlIG5vdyB0d28gZG9jdW1lbnRhdGlvbi1yZWxhdGVkIHR5cGVtYXAgYXJndW1lbnRzOgoKCSAgICAgICAgJXR5cGVtYXAoaW4sIGRvYz0iJE5BTUUgaXMgYSB2ZWN0b3Igb2YgaW50ZWdlcnMiLCAKCQkJIGFyZ2xpc3Q9IiRuYW1lIikgIGludCAqVkVDVE9SIHsgLi4uIH0KCQkJIAogICAgICAgICAgICBUaGUgImFyZ2xpc3QiIHRleHRzIG9mIGFsbCBhcmd1bWVudHMgb2YgYSBmdW5jdGlvbiBtYWtlIHVwCgkgICAgaXRzIGFyZ2xpc3QgaW4gdGhlIGRvY3VtZW50YXRpb24uICBUaGUgImRvYyIgdGV4dHMgb2YgYWxsCgkgICAgYXJndW1lbnRzIGFyZSBjb2xsZWN0ZWQgdG8gbWFrZSBhIHNlbnRlbmNlIHRoYXQgZGVzY3JpYmVzCgkgICAgdGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMuICBSZWFzb25hYmxlIGRlZmF1bHRzIGFyZQoJICAgIHByb3ZpZGVkLiAKCgkgICAgQXMgdXN1YWwsICRuYW1lIGlzIHN1YnN0aXR1dGVkIGJ5IHRoZSBuYW1lIG9mIHRoZQoJICAgIGFyZ3VtZW50LiBUaGUgbmV3IHR5cGVtYXAgdmFyaWFibGUgJE5BTUUgaXMgbGlrZSAkbmFtZSwKCSAgICBidXQgbWFya2VkLXVwIGFzIGEgdmFyaWFibGUuICBUaGlzIG1lYW5zIHRoYXQgaXQgaXMKCSAgICB1cHBlci1jYXNlZDsgaW4gVGVYaW5mbyBtb2RlICgiLXByb2Nkb2Nmb3JtYXQgdGV4aW5mbyIpIGl0CgkgICAgY29tZXMgb3V0IGFzIEB2YXJ7bmFtZX0uIAoJICAgIAoJICAgIFRoZSBkaXJlY3RpdmVzICV2YWx1ZXNfYXNfbGlzdCwgJXZhbHVlc19hc192ZWN0b3IsCgkgICAgJW11bHRpcGxlX3ZhbHVlcyBub3cgYWxzbyBoYXZlIGFuIGVmZmVjdCBvbiB0aGUKCSAgICBkb2N1bWVudGF0aW9uLiAoVGhpcyBpcyBhY2hpZXZlZCB2aWEgdGhlIG5ldyBwcmFnbWFzCgkgICAgcmV0dXJuX25vdGhpbmdfZG9jLCByZXR1cm5fb25lX2RvYywgcmV0dXJuX211bHRpX2RvYy4pCgoJICAgIERvY3VtZW50YXRpb24gaGFzIGFsc28gaW1wcm92ZWQgZm9yIHZhcmlhYmxlcyB0aGF0IGFyZQoJICAgIHdyYXBwZWQgYXMgcHJvY2VkdXJlcy13aXRoLXNldHRlcnMgKGNvbW1hbmQtbGluZSBzd2l0Y2gKCSAgICAiLWVtaXQtc2V0dGVycyIpLgoKICAgICAgICAgICogW0d1aWxlXSBFbWl0IGNvbnN0YW50cyBhcyBfaW1tdXRhYmxlXyB2YXJpYWJsZXMuICAoVGhpcwogICAgICAgICAgICB3YXMgYnJva2VuIHJlY2VudGx5LikKCjA5LzA3LzIwMDI6IG1rb2VwcGUKCSAgICBbR3VpbGVdIFVwZGF0ZWQgdGhlIHR5cGVtYXBzIGluIGxpc3QtdmVjdG9yLmkuCgowOS8wNy8yMDAyOiBta29lcHBlCgkgICAgU2hvcnQtY2lyY3VpdCB0aGUgdHlwZWNoZWNrcyBmb3Igb3ZlcmxvYWRlZCBmdW5jdGlvbnMuCgkgICAgKFRoZSBjaGFuZ2VzIGluIGNvZGUgZ2VuZXJhdGlvbiBhcmUgdmlzaWJsZSBpbiB0aGUgbmV3CgkgICAgdGVzdGNhc2UgIm92ZXJsb2FkX2NvbXBsaWNhdGVkIi4pCgowOS8wNi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFNvbHV0aW9uIGZvciBbIDU5NjQxMyBdCiAgICAgICAgICAgIE5ldyB0eXBlbWFwIHNvIHRoYXQgdGhlIEphdmEgcHJveHkgY2xhc3NlcyBhbmQgdHlwZSB3cmFwcGVyIGNsYXNzZXMKICAgICAgICAgICAgd3JhcHBlciBjb25zdHJ1Y3RvciBtb2RpZmllciBjYW4gYmUgdGFpbG9yZWQgYnkgdXNlcnMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIAogICAgICAgICAgICBwcm90ZWN0ZWQuIE5vcm1hbGx5IFNXSUcgZ2VuZXJhdGVzIGEgY29uc3RydWN0b3IgbGlrZSB0aGlzIHdoaWNoIGNhbiBvbmx5IAogICAgICAgICAgICBiZSBhY2Nlc3NlZCB3aXRoaW4gb25lIHBhY2thZ2U6CgogICAgICAgICAgICAgIHByb3RlY3RlZCBCYXIobG9uZyBjUHRyLCBib29sZWFuIGNNZW1vcnlPd24pIHsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBJZiB5b3UgYXJlIHVzaW5nIFNXSUcgYWNyb3NzIG11bHRpcGxlIHBhY2thZ2VzIG9yIHdhbnQgdG8gdXNlIHRoaXMgY29uc3RydWN0b3IKICAgICAgICAgICAgYW55d2F5LCBpdCBjYW4gbm93IGJlIGFjY2Vzc2VkIG91dHNpZGUgdGhlIHBhY2thZ2UuIFRvIG1vZGlmeSB1c2UgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICV0eXBlbWFwKGphdmFwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycykgU1dJR1RZUEUgInB1YmxpYyIKCiAgICAgICAgICAgIHRvIGNoYW5nZSB0byBwdWJsaWMgZm9yIGFsbCBwcm94eSBjbGFzc2VzIGFuZCBzaW1pbGFybHkgZm9yIGFsbCB0eXBlIHdyYXBwZXIgY2xhc3NlczoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YXB0cmNvbnN0cnVjdG9ybW9kaWZpZXJzKSBTV0lHVFlQRSwgU1dJR1RZUEUgKiwgU1dJR1RZUEUgJiwgU1dJR1RZUEUgW10gInB1YmxpYyIKCjA5LzA2LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQWRkZWQgdGhyb3dzIHR5cGVtYXBzIGZvciB0aGUgSmF2YSBtb2R1bGUuIEMrKyBleGNlcHRpb25zIGdldCBjb252ZXJ0ZWQgaW50bwogICAgICAgICAgICBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiBKYXZhIGV4Y2VwdGlvbnMuIAogICAgICAgICAgICAKICAgICAgICAgICAgV2FybmluZzogVGhpcyBtYXkgY2hhbmdlIGZyb20gamF2YS5sYW5nLlJ1bnRpbWUgZXhjZXB0aW9uIGluIHRoZSBmdXR1cmUuCgowOS8wNS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgdmFyaWFibGVzIGRlY2xhcmVkIGFzIHJlZmVyZW5jZXMuCgowOS8wNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjA1MTYyIF0gVHlwZW1hcCBsb2NhbCB2YXJpYWJsZXMuIFJlcG9ydGVkIGJ5IEx5bGUgSm9obnNvbi4KCjA5LzA1LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBNb3JlIHVwZGF0ZXMgdG8gdGhlIFJ1YnkgbW9kdWxlIGRvY3VtZW50YXRpb24sIGluY2x1ZGluZwoJICAgIGEgbmV3IHR5cGVtYXAgZXhhbXBsZSB0aGF0IGRlbW9uc3RyYXRlcyBob3cgdG8gY29sbGVjdCBrZXktdmFsdWUKCSAgICBwYWlycyBmcm9tIGFuIGFyZ3VtZW50IGxpc3QgaW50byBhIEhhc2guCgowOS8wNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGJ1ZyB3aXRoIHRlbXBsYXRlIGV4cGFuc2lvbiBhbmQgY29uc3RydWN0b3JzLgoKICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgRm9vPFQ+KCkgeyB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIGV4dHJhIDxUPiBpbiB0aGUgY29uc3RydWN0b3Igd2FzIGNhcnJpZWQgdGhyb3VnaCBpbiB0aGUKICAgICAgICAgICAgbmFtZS0tY2F1c2luZyBydW50aW1lIHByb2JsZW1zIGluIGdlbmVyYXRlZCBtb2R1bGVzLgogICAgICAgICAgICBSZXBvcnRlZCBieSBKb3JkaSBBcm5hYmF0IEJlbmVkaWN0by4KIAowOS8wNS8yMDAyOiBta29lcHBlCgkgICAgW0d1aWxlXSBTdXBwb3J0IG92ZXJsb2FkaW5nLgoKMDkvMDQvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIFVwZGF0ZWQgdHlwZW1hcHMgZm9yIGxvbmcgbG9uZyBhbmQgdW5zaWduZWQgbG9uZyBsb25nIHR5cGVzCgkgICAgdG8gdXNlIFJ1YnkgMS43IHN1cHBvcnQgZm9yIHRoZXNlIHR5cGVzIHdoZW4gYXZhaWxhYmxlLgoKMDkvMDQvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIG91dHB1dCB0eXBlbWFwcyBmb3IgY29uc3QgcmVmZXJlbmNlIHRvIHByaW1pdGl2ZQoJICAgIHR5cGVzLgoKMDkvMDQvMjAwMjogbWtvZXBwZQoJICAgIFtHdWlsZV0gRml4IHBhc3MtYnktdmFsdWUgdHlwZW1hcHMuICBSZXBvcnRlZCBieSBBcm5vCgkgICAgUGV0ZXJzIHZpYSBEZWJpYW4gYnVndHJhY2tpbmcgKCMxNTY5MDIpLCBwYXRjaCBieSBUb3JzdGVuCgkgICAgTGFuZHNjaG9mZiA8dG9yc3RlbkBkZWJpYW4ub3JnPi4KCjA5LzAzLzIwMDI6IHNhbWphbSAoU2FtIExpZGRpY290dCkKCSAgICBCZXR0ZXIgcmVmZXJlbmNlIHN1cHBvcnQuCgkgICAgRnVuY3Rpb25zIHRoYXQgd2FudCBhIHZvaWQqKiBjYW4gdGFrZSBhIE5VTEwgYnkgcmVmZXJlbmNlIGFuZAoJICAgIHRoZSB2b2lkKiB3aWxsIGJlIG1hZGUgZm9yIHlvdSBhbmQgdGhlbiBwYXNzZWQtYnktcmVmZXJlbmNlCgoJICAgIEFsc28gYWxsIGludGVnZXItY2xhc3MgbmF0aXZlIHR5cGVzIGNhbiBiZSBwYXNzZWQgYnkgcmVmZXJlbmNlCgkgICAgd2hlcmUgYW4gaW50KiBvciBpbnQmIGV0YyBpcyBuZWVkZWQKCjA5LzAzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQ2hhbmdlZCB0aGUgZXZhbHVhdGlvbiBvcmRlciBvZiBwcmVwcm9jZXNzb3IgbWFjcm8gYXJndW1lbnRzLgogICAgICAgICAgICBBcmd1bWVudHMgYXJlIG5vdyBleHBhbmRlZCBieSB0aGUgcHJlcHJvY2Vzc29yICpiZWZvcmUqIHRoZXkKICAgICAgICAgICAgYXJlIHBhc3NlZCB0byBtYWNybyBleHBhbnNpb24uICBUaGlzIGZpeGVzIGEgc3VidGxlIGV4cGFuc2lvbgogICAgICAgICAgICBidWcgcmVwb3J0ZWQgYnkgQW50aG9ueSBIZWFkaW5nLgoKMDkvMDMvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCB0aGUgZmlsZSBpbmNsdWRlIG9yZGVyIChhZ2FpbiwgYXBwYXJlbnRseSkuIFNlZSAyLzI3Lzk5LgoKMDkvMDIvMjAwMjogYmVhemxleQogICAgICAgICAgICBbUGVybF0gQmV0dGVyIGV4Y2VwdGlvbiBoYW5kbGluZyBzdXBwb3J0LiAgU2luY2UgUGVybCBlcnJvciBoYW5kbGluZwogICAgICAgICAgICByZWxpZXMgb24gc2V0am1wL2xvbmdqbXAsIHdyYXBwZXIgZnVuY3Rpb25zIGhhdmUgYmVlbiBtb2RpZmllZCBzbGlnaHRseQogICAgICAgICAgICB0byBwcm92aWRlIGFuIGV4dHJhIGJsb2NrIHNjb3BlOgoKICAgICAgICAgICAgICAgIFhTKGZvbykgewogICAgICAgICAgICAgICAgICAgY2hhciBfc3dpZ21zZ1tTV0lHX01BWF9FUlJNU0ddID0gIiI7CiAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpfc3dpZ2VyciA9IF9zd2lnbXNnOwogICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgLyogTm9ybWFsIHdyYXBwZXIgZnVuY3Rpb24gaGVyZSAqLwogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgICBTV0lHX2Nyb2FrKCJBbiBlcnJvciBvY2N1cnJlZFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgIFhTUkVUVVJOKGFyZ3ZpKTsgICAgICAvKiBTdWNjZXNzZnVsIHJldHVybiAqLwogICAgICAgICAgICAgICAgICAgICAgZmFpbDoKICAgICAgICAgICAgICAgICAgICAgICAgLyogY2xlYW51cCBjb2RlICovCiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICBjcm9hayhfc3dpZ19lcnIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhlIG1hY3JvIFNXSUdfY3JvYWsoeCkgc2V0cyB0aGUgdmFsdWUgb2YgX3N3aWdlcnIgdG8geCBhbmQKICAgICAgICAgICAgZXhlY3V0ZXMgYSAiZ290byBmYWlsIi4gIFRoZSB3aG9sZSB3cmFwcGVyIGZ1bmN0aW9uIGlzIGVuY2xvc2VkCiAgICAgICAgICAgIGJsb2NrIHNjb3BlIHRvIHByb3ZpZGUgcHJvcGVyIGNsZWFudXAgb2YgQysrIG9iamVjdHMuICBTaW5jZQogICAgICAgICAgICBjcm9hayBleGVjdXRlcyBhIGxvbmdqbXAoKSwgdGhlcmUgaXMgbm8gd2F5IHRvIHByb3Blcmx5IHJlY2xhaW0KICAgICAgICAgICAgcmVzb3VyY2VzIGlmIHRoaXMgZXhlY3V0ZXMgaW4gdGhlIHNhbWUgc2NvcGUgYXMgdGhlIHdyYXBwZXIKICAgICAgICAgICAgZnVuY3Rpb24uCgogICAgICAgICAgICBUaGUgX3N3aWdtc2dbXSB2YXJpYWJsZSBpcyBub3JtYWxseSB1bnVzZWQsIGJ1dCBjYW4gYmUgdXNlZAogICAgICAgICAgICB0byBzdG9yZSBzbWFsbCBlcnJvciBtZXNzYWdlcyB1c2luZyBzcHJpbnRmIG9yIHNucHJpbnRmLiBJdAogICAgICAgICAgICBoYXMgYSBjYXBhY2l0eSBvZiBhdCBsZWFzdCAyNTYgYnl0ZXMgKFNXSUdfTUFYX0VSUk1TRykuCiAgICAgICAgICAgIAowOS8wMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtUY2xdIEFkZGVkIGJldHRlciBzdXBwb3J0IGZvciBleGNlcHRpb25zLiAgSW5zdGVhZCBvZiByZXR1cm5pbmcgVENMX0VSUk9SLAogICAgICAgICAgICB1c2UgdGhlIG1hY3JvIFNXSUdfZmFpbCB0byByZXR1cm4gd2l0aCBhbiBlcnJvci4gIFRoaXMgZW5zdXJlcyB0aGF0CiAgICAgICAgICAgIGFyZ3VtZW50cyBhcmUgcHJvcGVybHkgY2xlYW5lZCB1cC4gIEV4Y2VwdGlvbiBzcGVjaWZpZXJzIGFyZSBub3cKICAgICAgICAgICAgaGFuZGxlZCBieSBkZWZhdWx0LgoKMDkvMDIvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIFRoZSB0eXBlLWNoZWNraW5nIHN5c3RlbSBmb3IgdGhlIFJ1YnkgbW9kdWxlIGhhcyBoYWQgYSBmbGF3CgkgICAgaW4gdGhhdCBzb21lIHR5cGVzIHdoaWNoIHNob3VsZCBiZSBjb25zaWRlcmVkIGVxdWl2YWxlbnQKCSAgICB3ZXJlbid0LiBUaGlzIGJ1ZyB3YXMgYmVzdCBkZW1vbnN0cmF0ZWQgYnkgdGhlIGluaGVyaXRfbWlzc2luZy5pCgkgICAgdGVzdCBzdWl0ZSBjYXNlLCB3aGljaCBkZWZpbmVzIGEgYmFzZSBjbGFzcyAiRm9vIiB0aGF0IGlzCgkgICAgc3ViY2xhc3NlZCBieSAiQmFyIi4gVGhlICJGb28iIGNsYXNzIGlzbid0IGFjdHVhbGx5IHdyYXBwZWQgKGkuZS4KCSAgICBpdCdzIG5vdCBkaXJlY3RseSBhY2Nlc3NpYmxlIGZyb20gUnVieSkgYnV0IHdlJ2Qgc3RpbGwgbGlrZSB0byBiZQoJICAgIGFibGUgdG8gcGFzcyAiQmFyIiBpbnN0YW5jZXMgdG8gZnVuY3Rpb25zIGV4cGVjdGluZyBGb29zIGFuZCBoYXZlCgkgICAgdGhhdCB3b3JrOyBpdCB3YXNuJ3QuIFRoZSByZXZpc2VkIGltcGxlbWVudGF0aW9uIChzaW1pbGFyIHRvIHRoYXQKCSAgICB1c2VkIGZvciBzb21lIG90aGVyIGxhbmd1YWdlIG1vZHVsZXMpIGFkZHMgYSBuZXcgaW5zdGFuY2UgdmFyaWFibGUKCSAgICAoX19zd2lndHlwZV9fKSB0byBlYWNoIG9iamVjdCB0aGF0IGluZGljYXRlcyBpdHMgU1dJRyB0eXBlOwoJICAgIHRoYXQgaXMsIGVhY2ggIkJhciIgaW5zdGFuY2Ugd2lsbCBub3cgaGF2ZSBhIHN0cmluZyBpbnN0YW5jZQoJICAgIHZhcmlhYmxlIGNhbGxlZCAiX19zd2lndHlwZV9fIiB3aG9zZSB2YWx1ZSBpcyAiX3BfQmFyIi4KCiAgICAgICAgICAgIFVubGVzcyBkZXZlbG9wZXJzIHdlcmUgdGFraW5nIGFkdmFudGFnZSBvZiB0aGlzIGxvdy1sZXZlbAoJICAgIGltcGxlbWVudGF0aW9uIGRldGFpbCwgdGhleSBzaG91bGRuJ3Qgbm90aWNlIGFueSBjb21wYXRpYmlsaXR5CgkgICAgcHJvYmxlbXM7IG5ldmVydGhlbGVzcywgSSdtIG1hcmtpbmcgaXQgYXMgYSAicG90ZW50aWFsCgkgICAgaW5jb21wYXRpYmlsaXR5Ii4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMDkvMDEvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEZpeGVkIFNGIEJ1ZyAjNjAzMTk5LgoKMDgvMDgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBBZGRlZCBPVVRQVVQsIElOUFVUIGFuZCBJTk9VVCB0eXBlbWFwcyBpbiB0eXBlbWFwcy5pIGZvciBDKysgCiAgICAgICAgICAgIHJlZmVyZW5jZXMuCgowOC8yNy8yMDAyOiBta29lcHBlCgkgICAgW0d1aWxlXSBGaXhlZCBlcnJvciBpbiAibGliX3N0ZF92ZWN0b3IiIHRlc3RjYXNlIGFuZAoJICAgIGNvbXBpbGVyIHdhcm5pbmcgaW4gImxpYl9jZGF0YSIgdGVzdGNhc2UuCgowOC8yNy8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgdGhlICIlbWl4aW4iIGRpcmVjdGl2ZSwgd2hpY2ggYWxsb3dzIHRoZSB1c2VyIHRvCgkgICAgc3BlY2lmeSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1vZHVsZSBuYW1lcyB0byBtaXgtaW4gdG8gYQoJICAgIGNsYXNzLiBTbywgZm9yIGV4YW1wbGUsIGlmIHlvdSdkIGxpa2UgdG8gc3BlY2lmeSB0aGF0IFJ1YnkncwoJICAgIEVudW1lcmFibGUgbW9kdWxlIHNob3VsZCBiZSBtaXhlZC1pbiB0byB5b3VyIGNsYXNzIEZvbywgeW91J2QKCSAgICB3cml0ZToKCSAgICAKCSAgICAgICAgJW1peGluIEZvbyAiRW51bWVyYWJsZSI7CgkJCiAgICAgICAgICAgIG9yIHRvIHNwZWNpZnkgdGhhdCB0aGUgbW9kdWxlcyBGZWUsIEZpZSBhbmQgRm8gc2hvdWxkIGJlIG1peGVkCgkgICAgaW4gdG8gRm9vOgoJICAgIAoJICAgICAgICAlbWl4aW4gRm9vICJGZWUsRmllLEZvIjsKCQkKCSAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowOC8yNy8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gTW9kaWZpZWQgdGhlICVhbGlhcyBkaXJlY3RpdmUgc28gdGhhdCBtdWx0aXBsZSBhbGlhc2VzCgkgICAgY2FuIGJlIHNwZWNpZmllZCBmb3IgYW4gaW5zdGFuY2UgbWV0aG9kIGJ5IHVzaW5nIGEgY29tbWEtc2VwYXJhdGVkCgkgICAgbGlzdCBvZiBhbGlhc2VzLgoKMDgvMjcvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkICJ0aHJvdyIgdHlwZW1hcHMgZm9yIHRoZSBSdWJ5IG1vZHVsZS4KCjA4LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVHdvIG5ldyBjb21tYW5kIGxpbmUgb3B0aW9ucyBmb3IgcHJpbnRpbmcgZGVwZW5kZW5jaWVzLgogICAgICAgICAgICAnc3dpZyAtTScgbGlzdHMgYWxsIGZpbGUgZGVwZW5kZW5jaWVzLiAgJ3N3aWcgLU1NJyBsaXN0cwogICAgICAgICAgICBkZXBlbmRlbmNpZXMsIGJ1dCBleGNsdWRlcyBmaWxlcyBpbiB0aGUgU1dJRyBsaWJyYXJ5LiAKICAgICAgICAgICAgRXhhbXBsZToKCiAgICAgICAgICAgICAgICUgc3dpZyAtTSAtcHl0aG9uIGV4YW1wbGUuaQogICAgICAgICAgICAgICBleGFtcGxlX3dyYXAuY3h4OiBcCiAgICAgICAgICAgICAgICAvdTAvYmVhemxleS9Qcm9qZWN0cy9saWIvc3dpZzEuMy9zd2lnLnN3ZyBcCiAgICAgICAgICAgICAgICAvdTAvYmVhemxleS9Qcm9qZWN0cy9saWIvc3dpZzEuMy9weXRob24vcHl0aG9uLnN3ZyBcCiAgICAgICAgICAgICAgICBleGFtcGxlLmkgXAogICAgICAgICAgICAgICAgZXhhbXBsZS5oIAoKICAgICAgICAgICAgICAgJSBzd2lnIC1NTSAtcHl0aG9uIGV4YW1wbGUuaQogICAgICAgICAgICAgICBleGFtcGxlX3dyYXAuY3h4OiBcCiAgICAgICAgICAgICAgICBleGFtcGxlLmkgXAogICAgICAgICAgICAgICAgZXhhbXBsZS5oIAoKICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDgvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDU5NzU5OSBdIHVuaW9uIGluIGNsYXNzOiBpbmNvcnJlY3Qgc2NvcGUuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEFydCBZZXJrZXMuCgowOC8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjAwMTMyIF0gRGVmYXVsdCBhcmd1bWVudCB3aXRoIG5hbWVzcGFjZS4gCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFNoaWJ1a2F3YSBZb3NoaWtpLgogCjA4LzI0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQXV0b21hdGljIEMrKyBleGNlcHRpb24gaGFuZGxpbmcgZW5hYmxlZCBmb3IgYWxsIGxhbmd1YWdlIG1vZHVsZXMuICAgIFRoaXMgaXMKICAgICAgICAgICAgcHJldHR5IHNpbXBsZS4gIElmIHlvdSBoYXZlIGEgY2xhc3MgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoKSB0aHJvdyhGb28pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhlbiB0aGUgZ2VuZXJhdGVkIHdyYXBwZXIgY29kZSBsb29rcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICB3cmFwX0Jhcl9ibGFoKCkgewogICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzEtPmJsYWgoKTsKICAgICAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChGb28gJl9lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICJ0aHJvdyIgdHlwZW1hcCBjb2RlIGluc2VydGVkLiAkMSA9IF9lICovCiAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgIGNhdGNoICguLi4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdzsKICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgVGhlICJ0aHJvdyIgdHlwZW1hcCBjYW4gYmUgdXNlZCB0byByYWlzZSBhbiBlcnJvciBpbiB0aGUgdGFyZ2V0IAogICAgICAgICAgICBsYW5ndWFnZS4gIEl0IGNhbiBkbyBhbnl0aGluZy4gIEhlcmUgaXMgYSB2ZXJ5IHNpbXBsZSBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAldHlwZW1hcCgidGhyb3ciKSBGb28gewogICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiRm9vIGV4Y2VwdGlvbiIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUbyBtYWtlIHRoaXMgd29yayBpbiBlYWNoIGxhbmd1YWdlIG1vZHVsZSwgc2ltcGx5IGRlZmluZSBhIGZldyBkZWZhdWx0CiAgICAgICAgICAgICJ0aHJvdyIgdHlwZW1hcHMgZm9yIFNXSUdUWVBFLCBTV0lHVFlQRSAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgYW5kIGEKICAgICAgICAgICAgZmV3IGNvbW1vbiBleGNlcHRpb24gdHlwZXMuICAgVGhhdCdzIGFsbCB0aGVyZSBpcyB0byBpdC4KCiAgICAgICAgICAgIEF1dG9tYXRpYyBleGNlcHRpb24gaGFuZGxpbmcgY2FuIGJlIGRpc2FibGVkIHVzaW5nIC1ub2V4Y2VwdCBvcgogICAgICAgICAgICBzZXR0aW5nIHRoZSBOb0V4Y2VwdCBnbG9iYWwgdmFyaWFibGUgdG8gMS4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDgvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBbIFB5dGhvbiBdCiAgICAgICAgICAgIEF1dG9tYXRpYyB0cmFuc2xhdGlvbiBvZiBDKysgZXhjZXB0aW9uIHNwZWNpZmljYXRpb25zIGludG8gZXJyb3IgaGFuZGxpbmcgY29kZS4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CiAKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoKSB0aHJvdyhGb28pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBGb28gaXMgd3JhcHBlZCBhcyBhIGNsYXNzaWMtc3R5bGUgY2xhc3MgKGNvbXBhdGlibGUKICAgICAgICAgICAgd2l0aCBleGNlcHRpb24gaGFuZGxpbmcpLiAgRnVydGhlcm1vcmUsIHlvdSBjYW4gd3JpdGUgUHl0aG9uIGNvZGUKICAgICAgICAgICAgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGIgPSBCYXIoKQogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGIuYmxhaCgpOwogICAgICAgICAgICAgICAgZXhjZXB0IEZvbyxlOiAgICAgIyBOb3RlIHVzZSBvZiBleGNlcHRpb24gY2xhc3MgaGVyZSEKICAgICAgICAgICAgICAgICAgICAjIEhhbmRsZSBGb28gZXJyb3IKICAgICAgICAgICAgICAgICAgICAuLi4KCiAgICAgICAgICAgIFRoZSBvYmplY3QgImUiIGluIHRoZSBleGNlcHRpb24gaGFuZGxlciBpcyBqdXN0IGEgd3JhcHBlZCBGb28KICAgICAgICAgICAgb2JqZWN0LiAgQWNjZXNzIGl0IGxpa2UgYSBub3JtYWwgb2JqZWN0LgoKICAgICAgICAgICAgSWYgYW4gZXhjZXB0aW9uIGlzIG5vdCB3cmFwcGVkIGFzIGEgY2xhc3MsIGEgUnVudGltZUVycm9yCiAgICAgICAgICAgIGV4Y2VwdGlvbiBpcyByYWlzZWQuICBUaGUgYXJndW1lbnQgdG8gdGhpcyBleGNlcHRpb24gaXMKICAgICAgICAgICAgdGhlIGV4Y2VwdGlvbiBvYmplY3QuICBGb3IgZXhhbXBsZToKIAogICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoKSB0aHJvdyhpbnQpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGIgPSBCYXIoKQogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgYi5ibGFoKCk7CiAgICAgICAgICAgICAgICBleGNlcHQgUnVudGltZUVycm9yLGU6CiAgICAgICAgICAgICAgICAgICBwcmludCBlLmFyZ3NbMF0gICAgICAgIyBJbnRlZ2VyIGV4Y2VwdGlvbiB2YWx1ZQoKICAgICAgICAgICAgQ29tbWVudHM6CgogICAgICAgICAgICAgICAgLSAgSWYgYSBjbGFzcyBpcyB1c2VkIGFzIGFuIGV4Y2VwdGlvbiwgaXQgKm11c3QqIGJlIHdyYXBwZWQKICAgICAgICAgICAgICAgICAgIGFzIGEgUHl0aG9uIGNsYXNzaWMtc3R5bGUgY2xhc3MgKG5ldyBjbGFzc2VzIGRvbid0IHdvcmspLgoKICAgICAgICAgICAgICAgIC0gIEF1dG9tYXRpYyBleGNlcHRpb24gaGFuZGxpbmcgaXMgY29tcGF0aWJsZSB3aXRoICVleGNlcHRpb24uCgogICAgICAgICAgICAgICAgLSAgVXNlIC1ub2V4Y2VwdCB0byB0dXJuIG9mZiB0aGlzIGZlYXR1cmUuCgogICAgICAgICAgICAgICAgLSAgVGhlIG5ld2x5IGludHJvZHVjZWQgInRocm93IiB0eXBlbWFwIGlzIHVzZWQgdG8gcmFpc2UKICAgICAgICAgICAgICAgICAgIFB5dGhvbiBlcnJvcnMgKG5hdHVyYWxseSkuCgogICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIE5FVyBGRUFUVVJFICoqKgoKMDgvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBJbmZvcm1hdGlvbiBmcm9tIHRocm93KCkgc3BlY2lmaWVycyBpcyBub3cgc3RvcmVkIGluIHRoZSBwYXJzZQogICAgICAgICAgICB0cmVlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgaW50IGJsYWgoKSB0aHJvdyhzcGFtLGJhcik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGUgc3RvcmVkIGluZm9ybWF0aW9uIGlzIGZ1bGx5IGNvcnJlY3RlZCBmb3IgbmFtZXNwYWNlcyBhbmQgd29ya3MKICAgICAgICAgICAgd2l0aCB0ZW1wbGF0ZXMuICBVc2VzIHdpbGwgZm9sbG93LgogICAgICAgICAgICAKMDgvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBFeGNlcHRpb24gaGFuZGxpbmcgY29kZSBpcyBubyBsb25nZXIgYXBwbGllZCB0byBtZW1iZXIgYWNjZXNzCiAgICAgICAgICAgIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGUsIGluIHRoaXMgY29kZQoKICAgICAgICAgICAgICAgICVleGNlcHRpb24gewogICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICRhY3Rpb24KICAgICAgICAgICAgICAgICAgIH0gY2F0Y2god2hhdGV2ZXIpIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGhhbmRsaW5nIGNvZGUgaXMgbm90IGFwcGxpZWQgdG8gYWNjZXNzb3IgZnVuY3Rpb25zCiAgICAgICAgICAgIGZvciBGb286OnguICAgVGhpcyBzaG91bGQgcmVkdWNlIHRoZSBhbW91bnQgb2YgZXh0cmEgY29kZQogICAgICAgICAgICBnZW5lcmF0ZWQuCgogICAgICAgICAgICBDYXZlYXQ6ICBFeGNlcHRpb24gaGFuZGxpbmcgY29kZSAqaXMqIHVzZWQgd2hlbiBhdHRyaWJ1dGVzIGFyZQogICAgICAgICAgICBhY2Nlc3NlZCB0aHJvdWdoIGEgc21hcnQtcG9pbnRlciBvciBhIHN5bnRoZXNpemVkIGF0dHJpYnV0ZWQKICAgICAgICAgICAgYWRkZWQgd2l0aCAlZXh0ZW5kIGlzIHVzZWQuCgowOC8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1hZGUgbW9yZSBwYXRjaGVzIHRvIGhvcGVmdWxseSBlbGltaW5hdGUgcHJvYmxlbXMgd2hlbiBjb21waWxpbmcgU1dJRyAKICAgICAgICAgICAgYXMgYSA2NC1iaXQgZXhlY3V0YWJsZS4KCjA4LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBidWcgd2l0aCBjb25zdCByZWZlcmVuY2UgbWVtYmVycywgdmFyaWFibGVzLCBhbmQgc3RhdGljIG1lbWJlcnMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgJnJlZjsKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFNXSUcgd2FzIHRyeWluZyB0byBnZW5lcmF0ZSAic2V0IiBmdW5jdGlvbnMgd2hpY2ggd291bGRuJ3QgY29tcGlsZS4gCgowOC8yMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1hZGUgdGhlIHdhcm5pbmcgbWVzc2FnZSBmb3IgIkNsYXNzIFggbWlnaHQgYWJzdHJhY3QiIG9mZiBieSBkZWZhdWx0LgogICAgICAgICAgICBFbmFibGUgd2l0aCAtV2FsbC4KCjA4LzIxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgUmVmaW5lZCBoYW5kbGluZyBvZiBjb25zdCBhbmQgbm9uLWNvbnN0IG92ZXJsb2FkZWQgbWV0aG9kcy4gIElmCiAgICAgICAgICAgIGEgY2xhc3MgZGVmaW5lcyBhIG1ldGhvZCBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICBpbnQgYmFyKGludCk7CiAgICAgICAgICAgICAgICAgICAgaW50IGJhcihpbnQpIGNvbnN0OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhlbiB0aGUgbm9uLWNvbnN0IG1ldGhvZCBpcyAqYWx3YXlzKiBzZWxlY3RlZCBpbiBvdmVybG9hZGluZyBhbmQKICAgICAgICAgICAgdGhlIGNvbnN0IG1ldGhvZCBzaWxlbnRseSBkaXNjYXJkZWQuICBJZiBydW5uaW5nIHdpdGggLVdhbGwsIGEgd2FybmluZwogICAgICAgICAgICBtZXNzYWdlIHdpbGwgYmUgZ2VuZXJhdGVkLgoKMDgvMTkvMjAwMjogYmVhemxleQogICAgICAgICAgICBCZXR0ZXIgc3VwcG9ydCBmb3IgdXNpbmcgZGVjbGFyYXRpb25zIGFuZCBpbmhlcml0YW5jZS4gICBDb25zaWRlciB0aGlzOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxhaChpbnQgeCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYmxhaChkb3VibGUgeCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGNsYXNzIEZvb0JhciA6IHB1YmxpYyBGb28sIHB1YmxpYyBCYXIgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgY2hhciAqYmxhaChjaGFyICp4KTsKICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIEZvbzo6YmxhaDsKICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIEJhcjo6YmxhaDsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBOb3cgU1dJRyB3cmFwcyBGb29CYXI6OmJsYWggYXMgYW4gb3ZlcmxvYWRlZCBtZXRob2QgdGhhdCB1c2VzIGFsbAogICAgICAgICAgICBhY2Nlc3NpYmxlIHZlcnNpb25zIG9mIGJsYWgoKS4gIFNlZSBzZWN0aW9uIDE1LjIuMiBpbiBTdHJvdXN0cnVwLCAzcmQgRWQuCgogICAgICAgICAgICBTV0lHIGFsc28gc3VwcG9ydHMgYWNjZXNzIGNoYW5nZSB0aHJvdWdoIHVzaW5nIGRlY2xhcmF0aW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICAgICAgICAgIGludCB4OwogICAgICAgICAgICAgICAgICAgICBpbnQgYmxhaChpbnQgeCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGNsYXNzIEJhciA6IHB1YmxpYyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICB1c2luZyBGb286Ong7CiAgICAgICAgICAgICAgICAgICAgIHVzaW5nIEZvbzo6YmxhaDsKICAgICAgICAgICAgICAgIH07CgoKICAgICAgICAgICAgQ2F2ZWF0OiAgIFNXSUcgZG9lcyBub3QgYWN0dWFsbHkgY2hlY2sgdG8gc2VlIGlmIGRlY2xhcmF0aW9ucyBpbXBvcnRlZAogICAgICAgICAgICB2aWEgJ3VzaW5nJyBhcmUgaW4gdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4gIElmIHRoaXMgb2NjdXJzLCB0aGUKICAgICAgICAgICAgd3JhcHBlciBjb2RlIHdvbid0IGNvbXBpbGUgYW55d2F5cy0tLW5vdCBzdXJlIGl0J3Mgd29ydGggd29ycnlpbmcgYWJvdXQuCiAgICAgICAgICAKMDgvMTgvMjAwMjogYmVhemxleQogICAgICAgICAgICBNb2RpZmllZCBvdmVybG9hZGluZyBkaXNwYXRjaCB0byBub3QgaW5jbHVkZSBub2RlcyB3aXRoIGFuICJlcnJvciIgYXR0cmlidXRlLgogICAgICAgICAgICBBIGxhbmd1YWdlIG1vZHVsZSBjYW4gc2V0IHRoaXMgaWYgYSBub2RlIGNvdWxkbid0IGJlIHdyYXBwZWQgYW5kIHlvdSBkb24ndCB3YW50CiAgICAgICAgICAgIGl0IGluY2x1ZGVkIGluIHRoZSBkaXNwYXRjaCBmdW5jdGlvbi4KCjA4LzE4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRW5oYW5jZW1lbnQgdG8gb3ZlcmxvYWRlZCBmdW5jdGlvbiBkaXNwYXRjaC4gICBUaGUgZGlzcGF0Y2hlciBpcyBub3cgYXdhcmUgb2YKICAgICAgICAgICAgaW5oZXJpdGFuY2UgcmVsYXRpb25zaGlwcy4gICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICBjbGFzcyBGb28geyB9OwogICAgICAgICAgICAgICAgICAgY2xhc3MgQmFyIDogcHVibGljIEZvbyB7IH07CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICB2b2lkIHNwYW0oRm9vICpmKTsKICAgICAgICAgICAgICAgICAgIHZvaWQgc3BhbShCYXIgKmIpOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgZGlzcGF0Y2hlciByZS1vcmRlcnMgdGhlIGZ1bmN0aW9ucyBzbyB0aGF0IHNwYW0oQmFyICpiKSBpcwogICAgICAgICAgICBjaGVja2VkIGZpcnN0LS0taXQgaXMgbW9yZSBzcGVjaWZpYyB0aGFuIHNwYW0oRm9vICpmKS4KCjA4LzE3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgLVdlcnJvciBjb21tYW5kIGxpbmUgb3B0aW9uLiAgIElmIHN1cHBsaWVkLCB3YXJuaW5nIG1lc3NhZ2VzIGFyZSB0cmVhdGVkCiAgICAgICAgICAgIGFzIGVycm9ycyBhbmQgU1dJRyB3aWxsIHJldHVybiBhIG5vbi16ZXJvIGV4aXQgY29kZS4KCjA4LzE3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1OTYxMzUgXSBUeXBlZGVmIG9mIHJlZmVyZW5jZSBjYW4ndCBjb21waWxlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50ICZJbnRSZWY7CiAgICAgICAgICAgICAgICAgdm9pZCBmb28oSW50UmVmIGkpOwoKICAgICAgICAgICAgU1dJRy0xLjMuMTQgZ2VuZXJhdGVkIGNvZGUgdGhhdCB3b3VsZG4ndCBjb21waWxlLgoKVmVyc2lvbiAxLjMuMTQgKEF1Z3VzdCAxMiwgMjAwMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjA4LzExLzIwMDI6IG1tYXR1cwoJICAgIFN0YXRpYyBjb25zdCBtZW1iZXJzIGluaXRpYWxpemVkIGR1cmluZyBkZWNsYXJhdGlvbiwgYW5kCgkgICAgb25seSB0aGVtLCBpZToKCgkgICAgc3RydWN0IEEKCSAgICB7CQkgCgkJc3RhdGljIGNvbnN0IGludCBhID0gMSA7ICAvLyB0aGlzIG9uZQoJCXN0YXRpYyBjb25zdCBpbnQgYjsgICAgICAgLy8gbm90IHRoaXMgb25lCiAgICAgICAgICAgIH07ICAgICAKCgkgICAgYXJlIGVtaXR0ZWQgbGlrZSBjb25zdGFudHMgKGVxdWl2YWxlbnQgdG8gZW51bXMgb3IKCSAgICBleHBsaWNpdCAlY29uc3RhbnQpLgoJICAgIAoJICAgIFRoaXMgaXMgYmVjYXVzZSB0aGV5IGNhbm5vdCBiZSBhZGRlZCBkaXJlY3RseSB0byAnY3ZhcicKCSAgICBzaW5jZSB0aGV5IGxhY2sgdGhlIG5lZWRlZCByZWZlcmVuY2UgKHdlbGwsIHlvdSBjYW4gZm9yY2UKCSAgICB0aGVtIHRvIGhhdmUgYSByZWFsIHJlZmVyZW5jZSwgYnV0IGluIGFuIHVnbHkgd2F5IHdoaWNoCgkgICAgZ29lcyBjb21wbGV0ZWx5IGFnYWluIHRoZSBvcmlnaW5hbCBwdXJwb3NlIG9mIGluaXRpYWxpemUKCSAgICB0aGVtIGR1cmluZyBkZWNsYXJhdGlvbiwgeW91IGFsc28gaGF2ZSB0byBkZWFsIHdpdGggZXh0cmEKCSAgICBsaW5raW5nIG1hdHRlcnMsIGFuZCBpdCB0YWtlIGEgd2hpbGUgdG8gZmlndXJlIG91dCB3aGF0IGlzCgkgICAgdGhlIHByb2JsZW0gYW5kIGhvdyB0byBzb2x2ZSBpdCkuCgkgICAgCgkgICAgUGxlYXNlIHRlc3QgaXQgd2l0aCB5b3VyIHByZWZlcnJlZCB0YXJnZXQgbGFuZ3VhZ2UsIGFuZAoJICAgIG5vdCBvbmx5IHRoZSBjb2RlIGdlbmVyYXRpb24sIGJ1dCByZWFsbHkgcnVuIHRoZSBleGFtcGxlCgkgICAgaW4gdGhlIHRlc3Qtc3VpdGUgKHN0YXRpYy1jb25zdC1tZW1iZXItMi5pKSBiZWNhdXNlIHRoZQoJICAgIHByb2JsZW0gYW5kIHRoZSBzb2x1dGlvbiBjYW5ub3QgYmUgImZ1bGx5IiBhcHByZWNpYXRlZAoJICAgIHVudGlsIHlvdSB0cnkgdG8gbG9hZCB0aGUgbW9kdWxlIGFuZCBydW4gaXQuCgoJICAgIEluIHNvbWUgdGFyZ2V0IGxhbmd1YWdlcyAocHl0aG9uIHNwZWNpYWxseSksIHRoaXMgY2FuCgkgICAgcHJvZHVjZXMgYSBkaWZmZXJlbmNlIGluIHRoZSB3YXkgdGhhdCB0aGUgc3RhdGljIGNvbnN0YW50CgkgICAgbWVtYmVycyAnYScgYW5kICdiJyBhcmUgaW50ZXJuYWxseSB3cmFwcGVkLiBIb3BlZnVsbHksCgkgICAgdGhleSBzdGlsbCBjYW4gYmUgYWNjZXNzZWQgaW4gdGhlIHNhbWUgd2F5LgoKCjA4LzExLzIwMDI6IG1tYXR1cwoJICAgIFtweXRob25dIE5vdyBzdGF0aWMgY29uc3QgbWVtYmVycyBjYW4gYmUgYWNjZXNzZWQgaW4gYSBtb3JlCgkgICAgbmF0dXJhbCB3YXksIGllLCBpZiB5b3UgaGF2ZQoKCSAgICBzdHJ1Y3QgQQogICAgICAgICAgICAgewkJIAoJCXR5cGVkZWYgdW5zaWduZWQgaW50IHZpZXdmbGFnczsKCQlzdGF0aWMgY29uc3Qgdmlld2ZsYWdzIGZvcndhcmRfZmllbGQgPSAwOwoJCXN0YXRpYyBjb25zdCB2aWV3ZmxhZ3MgYmFja3dhcmRfZmllbGQ7CiAgICAgICAgICAgIH07ICAgICAKCSAgICAKCSAgICBub3cgeW91IGNhbiBkbzoKCgkJcHJpbnQgQS5iYWNrd2FyZF9maWVsZAoKCSAgICBhbmQgYWxzbwoKCSAgICAgICAgYSA9IEEoKQoJCXByaW50IGEuZm9yd2FyZF9maWVsZAoJCQoJICAgIE5vdGUgdGhhdCBpZiB0aGUgc3RhdGljIGNvbnN0IG1lbWJlcnMgZG9uJ3QgaGF2ZSBhbgoJICAgIGluaXRpYWxpemVyIChsaWtlIGJhY2t3YXJkX2ZpZWxkKSwgc3RpbGwgeW91IGNhbiBhY2Nlc3MKCSAgICB0aGVtIGluIHRoZSBzYW1lIHdheSBpbiB0aGUgcHl0aG9uIHNpZGUsIGJ1dCB0aGUKCSAgICBpbXBsZW1lbnRhdGlvbiBpcyBhIHF1aXRlIGRpZmZlcmVudDogYmFja3dhcmRfZmllbGQgd2lsbAoJICAgIHN0aWxsIGFwcGVhciBpbiB0aGUgY3ZhciBlbnRpdHksIGFuZCBhbHNvLCB5b3UgYXJlIAoJICAgIHJlc3BvbnNpYmxlIHRvIGluaXRpYWxpemUgaXQgaW4gc29tZSBjb2RlIHVuaXQsIGFuZCBsaW5rIGl0CgkgICAgcHJvcGVybHkuIGZvcndhcmRfZmllbGQsIGJ5IHRoZSBvdGhlciBoYW5kLCB3aWxsIG5vdAoJICAgIGFwcGVhciBpbiB0aGUgY3ZhciBlbnRpdHkgYnV0IG9ubHkgYXMgYSBBIG1lbWJlciwgc2ltaWxhcgoJICAgIHRvIHdoYXQgaGFwcGVuIHdpdGggZW51bSBvciAlY29uc3RhbnQgbWVtYmVycy4KCjA4LzExLzIwMDI6IG1tYXR1cwoJICAgIFtweXRob25dIENvbW1vbiBjb2RlIGluIHRoZSBfX3NldGF0dHJfXy9fX2dldGF0dHJfXyBub3cKCSAgICBnb2VzIHRvIHR3byAiZnJlZSIgbWV0aG9kcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwcm94eQoJICAgIGZpbGUsIGZyb20gd2hlcmUgZWFjaCBjbGFzcyB1c2UgaXQuIFRoaXMgY2hhbmdlIHJlZHVjZXMKCSAgICB0aGUgc2l6ZSBvZiB0aGUgcHJveHkgZmlsZSwgc3BlY2lhbGx5IGlmIHlvdSB3cmFwIGEgbG90IG9mCgkgICAgc21hbGwgY2xhc3NlcyBpbiBvbmUgbW9kdWxlICh1cCB0byAzMyUgaW4gc29tZSBjYXNlcyksCgkgICAgbWFraW5nIGl0IGZhc3RlciB0byBsb2FkIHRvby4KCjA4LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1Blcmw1XSBJZiBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBjaGFyICogcmV0dXJucyBOVUxMLAogICAgICAgICAgICB1bmRlZiBpcyByZXR1cm5lZCB0byB0aGUgUGVybCBpbnRlcnByZXRlci4KIAowOC8wOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeCB0byBjb252ZXJzaW9uIG9wZXJhdG9ycyBhbmQgbmFtZXNwYWNlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBucyB7CiAgICAgICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7IH07CiAgICAgICAgICAgICAgICAgICAgc3RydWN0IEJhciB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yIEZvbyooKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgSW4gdGhlIHdyYXBwZXIgY29kZSwgU1dJRyB3YXMgdXNpbmcgLT5vcGVyYXRvciBGb28qKCkKICAgICAgICAgICAgd2hlbiBpdCBzaG91bGQgaGF2ZSBiZWVuIHVzaW5nIC0+b3BlcmF0b3IgbnM6OkZvbyooKS4KCiAgICAgICAgICAgIE5vdGU6IGlmIHVzaW5nICVyZW5hbWUgd2l0aCBhIGNvbnZlcnNpb24gb3BlcmF0b3IsIHlvdQogICAgICAgICAgICBtaWdodCBoYXZlIHRvIGRvIHRoaXM6CgogICAgICAgICAgICAgICAlcmVuYW1lKHRvRm9vUHRyKSBuczo6b3BlcmF0b3IgbnM6OkZvbyooKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIF5eXl4gbm90ZSBleHRyYSBxdWFsaWZpZXIKICAgICAgICAgICAgICAgbmFtZXNwYWNlIG5zIHsKICAgICAgICAgICAgICAgICAgICAuLi4KCiAgICAgICAgICAgIAowOC8wOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtQeXRob25dIE1pbm9yIGVuaGFuY2VtZW50IHRvICdjb25zdCcgdmFyaWFibGUgZGVjbGFyYXRpb25zLiAKICAgICAgICAgICAgTm9ybWFsbHkgY29uc3QgZGVjbGFyYXRpb25zIGFyZSB3cmFwcGVkIGFzIHJlYWQtb25seSB2YXJpYWJsZXMKICAgICAgICAgICAgYWNjZXNzaWJsZSBvbmx5IHRocm91Z2ggdGhlIGN2YXIgYXR0cmlidXRlIChzZWUgU1dJRy5odG1sIGZvcgogICAgICAgICAgICBhIGRpc2N1c3Npb24gb2Ygd2h5KS4gIEhvd2V2ZXIsIGluIG1hbnkgcHJvZ3JhbXMsICJjb25zdCIgCiAgICAgICAgICAgIGRlY2xhcmF0aW9ucyBtYXkganVzdCBiZSBjb25zdGFudHMtLS1tYWtpbmcgdGhlIGN2YXIuIGFjY2VzcwogICAgICAgICAgICBhd2t3YXJkLiAgVG8gZml4IHRoaXMsICJjb25zdCIgZGVjbGFyYXRpb25zIGFyZSBub3cgYXZhaWxhYmxlCiAgICAgICAgICAgIGJvdGggdGhyb3VnaCBjdmFyLiBhbmQgYXMgYSBzaW1wbGUgbmFtZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBjb25zdCBpbnQgRk9PID0gNDI7CgogICAgICAgICAgICBJbiBQeXRob246CgogICAgICAgICAgICAgICAgID4+PiBwcmludCBleGFtcGxlLmN2YXIuRk9PCiAgICAgICAgICAgICAgICAgNDIKICAgICAgICAgICAgICAgICA+Pj4gcHJpbnQgZXhhbXBsZS5GT08KICAgICAgICAgICAgICAgICA0MgoKICAgICAgICAgICAgTm90ZTogVGhlcmUgYXJlIGNhc2VzIHdoZXJlIHRoZSB2YWx1ZSBvZiBhICJjb25zdCIgdmFyaWFibGUKICAgICAgICAgICAgbWlnaHQgY2hhbmdlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIGNoYXIgKmNvbnN0IEJBUiA9ICJIZWxsbyBXb3JsZCI7CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSBwb2ludGVyIGl0c2VsZiBjYW4gbm90IGNoYW5nZSwgYnV0IHRoZSAKICAgICAgICAgICAgZGF0YSBiZWluZyBwb2ludGVkIHRvIGNvdWxkIGJlIG1vZGlmaWVkLiAgSW4gdGhlc2Ugc2l0dWF0aW9ucywKICAgICAgICAgICAgY3Zhci5CQVIgc2hvdWxkIGJlIGFjY2Vzc2VkIHRvIG9idGFpbmVkIHRoZSBjdXJyZW50IHZhbHVlLgoKMDgvMDgvMjAwMjogYmVhemxleQogICAgICAgICAgICBbUHl0aG9uXSBGaXhlZCBnZW5lcmF0aW9uIG9mIHRoZSBwcm94eSBjb2RlICgucHkgZmlsZXMpIHRvIG1vcmUKICAgICAgICAgICAgY2xvc2VseSBmb2xsb3cgdGhlIG9yZGVyIG9mIGRlY2xhcmF0aW9ucyBhcyB0aGV5IGFwcGVhciBpbgogICAgICAgICAgICB0aGUgLmkgZmlsZS4gICBJbiB0aGUgcGFzdCwgYWxsIG9mIHRoZSBjbGFzcyB3cmFwcGVycyBhcHBlYXJlZAogICAgICAgICAgICBmaXJzdCwgZm9sbG93ZWQgYnkgZnVuY3Rpb24gc3R1YnMsIGluc2VydGVkIFB5dGhvbiBjb2RlLCBhbmQKICAgICAgICAgICAgb3RoZXIgZGV0YWlscy4KCjA4LzA4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gUHJveHkgbWV0aG9kIF9kZWxldGUoKSBjaGFuZ2VkIHRvIGRlbGV0ZSgpLiBUaGVyZSBzaG91bGRuJ3QgZXZlcgogICAgICAgICAgICBiZSBhIHdyYXBwZWQgZnVuY3Rpb24gY2FsbGVkIGRlbGV0ZSgpIGFzIGl0IGlzIGEgQysrIGtleXdvcmQgYW5kIHRoZXJlCiAgICAgICAgICAgIGlzIG5vIHN1Y2ggdGhpbmcgYXMgYSBtZW1iZXIgZnVuY3Rpb24gaW4gQy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCiAgICAgICAgICAgIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGNhbiBiZSBhY2hpZXZlZCBieSBhZGRpbmcgdGhlIGZ1bmN0aW9uIGJhY2sgaW4KICAgICAgICAgICAgZm9yIGFsbCBwcm94eSBjbGFzc2VzOgogICAgICAgICAgICAldHlwZW1hcChqYXZhY29kZSkgU1dJR1RZUEUgJXsKICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBfZGVsZXRlKCkgewogICAgICAgICAgICAgICAgZGVsZXRlKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAlfQoKICAgICAgICAgICAgSmF2YSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBzdW1tYXJ5CiAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgICAgICAgVGhlcmUgYXJlIGEgbnVtYmVyIG9mIGNoYW5nZXMgdGhhdCBoYXZlIGJlZW4gbWFkZSBpbiBpbXByb3ZpbmcgdGhlIEphdmEgbW9kdWxlIAogICAgICAgICAgICBmb3IgdmVyIDEuMy4xNC4gIElmIGF0IGFsbCBwb3NzaWJsZSBjaGFuZ2UgeW91ciBjb2RlIHRvIHRha2UgYWR2YW50YWdlcyBvZiB0aGUgCiAgICAgICAgICAgIGltcHJvdmVtZW50cy4gSWYgeW91IHdlcmUgdXNpbmcgcHJveHkgY2xhc3NlcyB5b3UgbWF5IG5vdCBub3RpY2UgYW55IGJhY2t3YXJkcyAKICAgICAgICAgICAgY29tcGF0aWJpbGl0eSBpc3N1ZXMuIEhlcmUgaXMgYW4gZXhhbXBsZSB3aGljaCB3aWxsIGhlbHAgd2l0aCBtb3N0IGJhY2t3YXJkcyAKICAgICAgICAgICAgY29tcGF0aWJpbGl0eSBwcm9ibGVtcyB3aGVyZSBpdCBpcyBub3QgcG9zc2libGUgdG8gbW9kaWZ5IHRoZSBjb2RlIHRoYXQgdXNlcwogICAgICAgICAgICB0aGUgZ2VuZXJhdGVkIG91dHB1dDoKCiAgICAgICAgICAgIFJlcGxhY2U6CiAgICAgICAgICAgICAgICAlbW9kdWxlIG1vZHVsZW5hbWUKCiAgICAgICAgICAgIFdpdGg6CiAgICAgICAgICAgICAgICAlbW9kdWxlIChqbmljbGFzc25hbWU9Im1vZHVsZW5hbWUiKSBtb2R1bGVuYW1lOwogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWNvZGUpIFNXSUdUWVBFICV7CiAgICAgICAgICAgICAgICAgICAgcHVibGljIGxvbmcgZ2V0Q1B0ciRqYXZhY2xhc3NuYW1lKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3dpZ0NQdHI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIF9kZWxldGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICBkZWxldGUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgICAgJXByYWdtYShqYXZhKSBqbmljbGFzc2NsYXNzbW9kaWZpZXJzPSJwdWJsaWMiOwoKICAgICAgICAgICAgVGhlIHByb3h5IGNvbnN0cnVjdG9ycyB0aGF0IHRvb2sgcGFyYW1ldGVycyAobG9uZyBjUHRyLCBib29sZWFuIGNNZW1vcnlPd24pCiAgICAgICAgICAgIHdlcmUgcHVibGljIGFuZCBhcmUgbm93IHByb3RlY3RlZC4gSWYgeW91IHdlcmUgbWFraW5nIHVzZSBvZiB0aGVzZSB0aGVuIHlvdSdsbCAKICAgICAgICAgICAgaGF2ZSB0byBtb2RpZnkgeW91ciBjb2RlIGFuZCB0aGUgYmVzdCBzb2x1dGlvbiB3b3VsZCBiZSB0byB1c2UgdGhlIG5ldyB0eXBlIAogICAgICAgICAgICB3cmFwcGVyIGNsYXNzZXMuCgogICAgICAgICAgICBUaGUgb3RoZXIgbWFpbiBhcmVhcyBhcmUgdGhlIHByYWdtYXMgYW5kIGdsb2JhbCB2YXJpYWJsZSB3cmFwcGluZy4gUmVwbGFjZSAKICAgICAgICAgICAgdGhlIHByYWdtYXMgd2l0aCBvbmUgb2YgdGhlIG5ldyBkaXJlY3RpdmVzIG9yIHR5cGVtYXBzIG1lbnRpb25lZCBiZWxvdyBhbmQgdXNlCiAgICAgICAgICAgICVyZW5hbWUgb24gdGhlIHZhcmlhYmxlcy4KCiAgICAgICAgICAgIElmIHlvdSB3ZXJlIG5vdCB1c2luZyBwcm94eSBjbGFzc2VzLCB5b3Ugd2lsbCBoYXZlIHRvIGRlZmluZSBhIGpzdHlwZSB0eXBlbWFwCiAgICAgICAgICAgIGFzIHdlbGwgYXMgYSBqdHlwZSB0eXBlbWFwLgoKMDgvMDgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIHdyYXBwaW5nIHR3byBkaW1lbnNpb24gYXJyYXkgdmFyaWFibGVzLgoKMDgvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBbUHl0aG9uLFRjbF0KICAgICAgICAgICAgT2JqZWN0IG1hbmFnZW1lbnQgbm93IGhhcyBhIG11Y2ggYmV0dGVyIHNlbnNlIG9mIG93bmVyc2hpcC4KICAgICAgICAgICAgT3duZXJzaGlwIGJpdHMgaXMgY2hhbmdlZCB3aGVuZXZlciBhbiBvYmplY3QgaXMgc3RvcmVkIGluIGEKICAgICAgICAgICAgZ2xvYmFsIHZhcmlhYmxlIG9yIHN0cnVjdHVyZSBtZW1iZXIuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgICBpbnQgdmFsOwogICAgICAgICAgICAgICAgICAgIEZvbyAqbmV4dDsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBOb3cgaW4gUHl0aG9uCgogICAgICAgICAgICAgICA+Pj4gZiA9IEZvbygpCiAgICAgICAgICAgICAgID4+PiBmLnRoaXNvd24KICAgICAgICAgICAgICAgMQogICAgICAgICAgICAgICA+Pj4gZyA9IEZvbygpCiAgICAgICAgICAgICAgID4+PiBnLm5leHQgPSBmICAgICAgICAgICMgQXNzaWduIGEgcG9pbnRlcgogICAgICAgICAgICAgICA+Pj4gZi50aGlzb3duICAgICAgICAgICAjIE5vdGljZSBvd25lcnNoaXAgY2hhbmdlCiAgICAgICAgICAgICAgIDAKICAgICAgICAgICAgICAgPj4+CgogICAgICAgICAgICBUaGlzIHNjaGVtZSBpcyBtb3N0bHkgYSBjb25zZXJ2YXRpdmUgaGV1cmlzdGljIGRlc2lnbmVkIHRvIAogICAgICAgICAgICBwcm92aWRlIHNlZ21lbnRhdGlvbiBmYXVsdHMuICBJdCBjb3VsZCBjYXVzZSBhIG1lbW9yeSBsZWFrCiAgICAgICAgICAgIGlmIG93bmVyc2hpcCBpcyBjaGFuZ2VkIHVubmVjZXNzYXJpbHkuICBJbiB0aGlzIGNhc2UsIHlvdSBjYW4KICAgICAgICAgICAgZWl0aGVyIHdyaXRlIGEgdHlwZW1hcCAodGhhdCBkb2Vzbid0IGNoYW5nZSBvd25lcnNoaXApLCBvcgogICAgICAgICAgICBtYW51YWxseSBzZXQgdGhlIHRoaXNvd24gYXR0cmlidXRlIGJhY2sgdG8gMS4KCjA4LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1RjbF0gTWFqb3IgdXNhYmlsaXR5IGltcHJvdmVtZW50cyB0byB0aGUgb2JqZWN0IGludGVyZmFjZS4KICAgICAgICAgICAgU3VwcG9zZSB5b3UgaGFkIGNvZGUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsgCiAgICAgICAgICAgICAgICAgICAgIGludCB4OwogICAgICAgICAgICAgICAgICAgICBpbnQgc3BhbSgpOwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIHZvaWQgIGJsYWgoRm9vICpmKTsKCiAgICAgICAgICAgIEluIHBhc3QgdmVyc2lvbnMgb2YgU1dJRywgeW91IGNvdWxkIGNyZWF0ZSBvYmplY3RzIGFuZCB1c2UKICAgICAgICAgICAgdGhlbSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgJSBGb28gZgogICAgICAgICAgICAgICAgJSBmIGNvbmZpZ3VyZSAteCAzCiAgICAgICAgICAgICAgICAlIGYgc3BhbQogICAgICAgICAgICAgICAgMzcKICAgIAogICAgICAgICAgICBUaGUgb25seSBwcm9ibGVtIGlzIHRoYXQgaWYgeW91IHRyaWVkIHRvIGNhbGwgYmxhaCgpLCBpdCBkaWRuJ3QKICAgICAgICAgICAgd29yazoKCiAgICAgICAgICAgICAgICAlIGJsYWggZgogICAgICAgICAgICAgICAgVHlwZSBFcnJvci4gRXhwZWN0ZWQgX3BfRm9vCiAgICAgICAgICAgICAgICAlCgogICAgICAgICAgICBJbnN0ZWFkLCB5b3UgaGFkIHRvIGRvIHRoaXM6CgogICAgICAgICAgICAgICAgJSBibGFoIFtmIGNnZXQgLXRoaXNdCiAgCiAgICAgICAgICAgIFNXSUcgbm93IGF1dG9tYXRpY2FsbHkgZXh0cmFjdHMgdGhlIC10aGlzIHBvaW50ZXIsIGF2b2lkaW5nIHRoaXMKICAgICAgICAgICAgcHJvYmxlbS4gIFRoaXMgbWVhbnMgdGhhdCBzYXlpbmcgImJsYWggZiIgaXMgcGVyZmVjdGx5IGxlZ2FsIGFuZAogICAgICAgICAgICBldmVyeXRoaW5nIHdpbGwgc3RpbGwgd29yayBub3JtYWxseS4KCiAgICAgICAgICAgIENhdmVhdDogU2luY2UgcG9pbnRlciBzdHJpbmdzIHN0YXJ0IHdpdGggYSBsZWFkaW5nIHVuZGVyc2NvcmUgKF8pLAogICAgICAgICAgICBkb24ndCB1c2UgdGhpcyBpbiBvYmplY3QgbmFtZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlIEZvbyBfZiAKICAgICAgICAgICAgICAgICUgYmxhaCBfZiAgICAgICAgIyBQb3RlbnRpYWwgY3Jhc2gKCiAgICAgICAgICAgIE9iamVjdHMgbm93IGhhdmUgYSAtdGhpc293biBhdHRyaWJ1dGUgdGhhdCBzaG93cyB0aGUgb3duZXJzaGlwLgogICAgICAgICAgICBUaGlzIGJ1aWxkcyB1cG9uIHRoZSBDSEFOR0VTIDExLzI0LzIwMDEgZW50cnkuCgowOC8wNy8yMDAyOiBzYW1qYW0sIFNhbSBMaWRkaWNvdHQKICAgICAgICAgICAgUHJvcGVybHkgaW1wbGVtZW50ZWQgcG9pbnRlciBzeXN0ZW0gdXNpbmcgcGhwIHJlc291cmNlcy4KICAgICAgICAgICAgU3RpbGwgbmVlZCB0byB3b3JrIG91dCB3aGV0aGVyIG9yIG5vdCB0byBsZXQgc2NyaXB0LXVzZXJzIGNhbGwKICAgICAgICAgICAgZGVzdHJ1Y3RvcnMgZGlyZWN0bHkKCjA4LzA2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVXBncmFkZWQgbXpzY2hlbWUgbW9kdWxlIHRvIHN1cHBvcnQgdmVyc2lvbiAyMDEgYW5kIGFkZGVkCiAgICAgICAgICAgIG92ZXJsb2FkaW5nIHN1cHBvcnQuCgowOC8wNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIHBhcnNpbmcgc3VwcG9ydCBmb3IgZXh0cmEgZ3JvdXBpbmcgKGluIHZlcnkgbGltaXRlZCBjYXNlcykuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgICB0eXBlZGVmIGludCAoRnVuY1B0cikoaW50LCBkb3VibGUpOwoKICAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCAqKioKICAgICAgICAgICAgCjA4LzAzLzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBVcGRhdGVzIHRvIHR5cGVtYXBzLmkgYXMgdGhvc2UgZG9uZSBwcmV2aW91c2x5IGZvciBQZXJsLAogICAgICAgICAgICBQeXRob24gYW5kIFRjbCBtb2R1bGVzLiBOb3cgc3VwcG9ydHMgcmVmZXJlbmNlIHR5cGVzIHdpdGggSU5QVVQsCiAgICAgICAgICAgIE9VVFBVVCBhbmQgSU5PVVQgdHlwZW1hcHMuCgowOC8wMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE5ldyBsaWJyYXJ5IGZpbGUgY3N0cmluZy5pIGFkZGVkLiAgUHJvdmlkZXMgbWFjcm9zIGZvcgogICAgICAgICAgICBtYW5pcHVsYXRpbmcgY2hhciAqIGRhdGEuCiAKMDgvMDIvMjAwMjogYmVhemxleQogICAgICAgICAgICBEZXByZWNhdGVkIHRoZSAlbmV3IGRpcmVjdGl2ZS4gIFVzZSAlbmV3b2JqZWN0IGluc3RlYWQuICBGb3IKICAgICAgICAgICAgZXhhbXBsZToKCiAgICAgICAgICAgICAgICVuZXdvYmplY3QgZm9vOwogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgY2hhciAqZm9vKCk7CgogICAgICAgICAgICAlbmV3b2JqZWN0IGZvbGxvd3MgdGhlIHNhbWUgcnVsZXMgYXMgJXJlbmFtZSwgJWlnbm9yZSwgJWZlYXR1cmUsCiAgICAgICAgICAgIGV0Yy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMDgvMDEvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBOZXcgYXR0cmlidXRlICdqbmljbGFzc25hbWUnIGZvciB0aGUgbW9kdWxlIGRpcmVjdGl2ZSBhbGxvd3MgYSB3YXkgb2YKICAgICAgICAgICAgY2hhbmdpbmcgdGhlIEpOSSBjbGFzcyBuYW1lIGZyb20gdGhlIGRlZmF1bHQgd2hpY2ggdXNlcyB0aGUgbW9kdWxlbmFtZSB3aXRoIEpOSQogICAgICAgICAgICBhcHBlbmRlZCBhZnRlciBpdC4KCiAgICAgICAgICAgICAgICAlbW9kdWxlIChqbmljbGFzc25hbWU9Im5hbWUiKSBtb2R1bGVuYW1lCgogICAgICAgICAgICBJZiAnbmFtZScgaXMgdGhlIHNhbWUgYXMgJ21vZHVsZW5hbWUnIHRoZW4gdGhlIG1vZHVsZSBjbGFzcyBuYW1lIGdldHMgY2hhbmdlZAogICAgICAgICAgICBmcm9tICdtb2R1bGVuYW1lJyB0byBtb2R1bGVuYW1lTW9kdWxlLgoKMDgvMDEvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggZmlsZSBpbmNsdWRlIG9yZGVyLiAgTGFuZ3VhZ2Ugc3BlY2lmaWMKICAgICAgICAgICAgZGlyZWN0b3JpZXMgc2hvdWxkIHRha2UgcHJlY2VkZW5jZSBvdmVyIGdlbmVyaWMgZGlyZWN0b3JpZXMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOiAgInN3aWdfbGliL3B5dGhvbi9mb28uaSIgc2hvdWxkIGJlIGxvYWRlZCBiZWZvcmUKICAgICAgICAgICAgInN3aWdfbGliL2Zvby5pIi4gICAgSSB0aG91Z2h0IHRoaXMgd2FzIHRoZSBjYXNlIGFscmVhZHksIGJ1dAogICAgICAgICAgICBhcHBhcmVudGx5IGl0IGhhcyBiZWVuIGJyb2tlbiBmb3IgcXVpdGUgc29tZSB0aW1lLgoKMDgvMDEvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCBzdGRfZGVxdWUuaSBsaWJyYXJ5IGZpbGUuICBXb3JrIGluIHByb2dyZXNzLgoKMDgvMDEvMjAwMjogYmVhemxleQogICAgICAgICAgICBbUHl0aG9uLFRjbCxQZXJsXQogICAgICAgICAgICBJbXByb3ZlbWVudHMgdG8gdHlwZW1hcHMuaS4gIElOUFVUL0lOT1VUIHR5cGVtYXBzIHBlcmZvcm0gYmV0dGVyCiAgICAgICAgICAgIGVycm9yIGNoZWNraW5nLiAgVHlwZW1hcHMgYXJlIG5vdyBzdXBwbGllZCBmb3IgcmVmZXJlbmNlcyBsaWtlIAogICAgICAgICAgICBpbnQgJk9VVFBVVCwgZG91YmxlICZJTk9VVCwgZXRjLgogICAgICAgICAgCjA4LzAxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1B5dGhvbl0gRGVwcmVjYXRlZCB0aGUgVF8qIGFuZCBMXyogdHlwZW1hcHMgaW4gdHlwZW1hcHMuaS4KICAgICAgICAgICAgTXVsdGlwbGUgcmV0dXJuIHZhbHVlcyBhcmUgYWx3YXlzIHBsYWNlZCBpbiBhIHR1cGxlLiBEZXByZWNhdGVkCiAgICAgICAgICAgIHRoZSBCT1RIIHR5cGVtYXBzLiAgVGhpcyBpcyBub3cgSU5PVVQgKGUuZy4sIGludCAqSU5PVVQpLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIFBZVEhPTiBNT0RVTEUgKioqCgowOC8wMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIERlcHJlY2F0ZWQgdGhlIGFycmF5LmksIGNhcnJheS5pLCBhbmQgdGltZXIuaSBsaWJyYXJ5IGZpbGVzLgoKMDgvMDEvMjAwMjogYmVhemxleQogICAgICAgICAgICBEZXByZWNhdGVkIHRoZSBwb2ludGVyLmkgbGlicmFyeSBmaWxlLiAgVXNlIGNwb2ludGVyLmkgaW5zdGVhZC4KICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgIAowOC8wMS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZvciBjb25zaXN0ZW5jeSB0aGUgZ2xvYmFsIHZhcmlhYmxlIGdldHRlcnMgYW5kIHNldHRlcnMgdXNlIHRoZSBKYXZhQmVhbiAKICAgICAgICAgICAgcHJvcGVydHkgZGVzaWduIHBhdHRlcm4gbGlrZSBtZW1iZXIgdmFyaWFibGVzIGFsd2F5cyBoYXZlLiBUaGlzIG1lYW5zIGlmIHlvdSBhcmUgCiAgICAgICAgICAgIHdyYXBwaW5nIGEgdmFyaWFibGUgY2FsbGVkIGZvbywgdGhlIGdldHRlciBpcyBjYWxsZWQgZ2V0Rm9vKCkgYW5kIHRoZSBzZXR0ZXIgaXMgCiAgICAgICAgICAgIGNhbGxlZCBzZXRGb28oKS4gQmVmb3JlIHRoZSByZWNlbnQgY2hhbmdlcyB0byB0aGUgSmF2YSBtb2R1bGUgdGhlIGdldHRlcnMgYW5kIAogICAgICAgICAgICBzZXR0ZXJzIHdlcmUgY2FsbGVkIGdldF9mb28oKSBhbmQgc2V0X2ZvbygpLiBJZiB5b3UgcmVhbGx5IHdhbnQgdGhlIG9yaWdpbmFsIAogICAgICAgICAgICBmdW5jdGlvbiBuYW1lcyB1c2UgdGhlICVyZW5hbWUgZGlyZWN0aXZlIGxpa2UgdGhpczogJXJlbmFtZShfZm9vKSBGb287CgowNy8zMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGNhc3RpbmcgcHJvYmxlbSB3aXRoIG11bHRpcGxlIGluaGVyaXRhbmNlLiAgSWYgeW91IGhhZCB0aGlzLAoKICAgICAgICAgICAgICAgICAgY2xhc3MgZm9vIHt9OwogICAgICAgICAgICAgICAgICBjbGFzcyBiYXIgOiBwdWJsaWMgZm9vIHt9OwogICAgICAgICAgICAgICAgICBjbGFzcyBiYXogOiBwdWJsaWMgZm9vIHt9OwogICAgICAgICAgICAgICAgICBjbGFzcyBzcGFtIDogcHVibGljIGJhciwgcHVibGljIGJheiB7fTsKCiAgICAgICAgICAgIHRoZW4gdGhlIHdyYXBwZXJzIHdvdWxkbid0IGNvbXBpbGUgZHVlIHRvIGFuIGFtYmlndW91cyBjYXN0LgogICAgICAgICAgICBSZXBvcnRlZCBieSBBcnQgWWVya2VzLgoKMDcvMzAvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBEdWUgdG8gbmV3IHN0YXRpYyB0eXBlY2hlY2tpbmcgYWxsIHBvaW50ZXJzIGhlbGQgaW4gYSBKYXZhIGxvbmcgYXJlIHBhcnQgb2YgCiAgICAgICAgICAgIHRoZSBpbnRlcm5hbCB3b3JraW5ncyBhbmQgdGhpcyBwb2ludGVyIHZhbHVlIGluIHRoZSBKYXZhIGxvbmcgaGFzIGJlY29tZSBhYnN0cmFjdGVkCiAgICAgICAgICAgIGRhdGEuIFRoZSB0eXBlIHdyYXBwZXIgY29uc3RydWN0b3IgYW5kIGdldENQdHIoKSBtZXRob2RzIGFyZSBhcyBzdWNoIHByb3RlY3RlZC4KICAgICAgICAgICAgSWYgeW91IG5lZWQgdG8gbWVzcyBhcm91bmQgd2l0aCBwb2ludGVycyBmcm9tIEphdmEgb3IgZm9yIGV4YW1wbGUgY3JlYXRlIGEgcHJveHkgCiAgICAgICAgICAgIGNsYXNzIG9yIHR5cGUgd3JhcHBlciBjbGFzcyBhcm91bmQgYSBudWxsIHBvaW50ZXIsIGFkZCBhIGZ1bmN0aW9uL2NvbnN0cnVjdG9yIAogICAgICAgICAgICB0byBkbyBzbyB3aXRoIHRoZSAlamF2YWNvZGUgdHlwZW1hcC4gWW91IGNhbiBhbHNvIG1ha2UgZ2V0Q1B0cigpIHB1YmxpYyBhZ2FpbiB3aXRoCiAgICAgICAgICAgIHRoZSAlamF2YWdldGNwdHIgdHlwZW1hcC4KCjA3LzMwLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4ZXMgZm9yICV0eXBlbWFwKGlnbm9yZSkuIEluIHBhcnRpY3VsYXIgd2hlbiBpZ25vcmluZyB0aGUgbGFzdCBwYXJhbWV0ZXIKICAgICAgICAgICAgaW4gYSBmdW5jdGlvbi4gQWxzbyBmb3IgYWxsIHBhcmFtZXRlcnMgaW4gY29uc3RydWN0b3JzLiBUaGVzZSBtb2RzIGhhdmUgYWxzbyBmaXhlZAogICAgICAgICAgICBtdWx0aS1hcmd1bWVudCB0eXBlbWFwcyBmb3IgcHJveHkgY2xhc3NlcyAtIFNGIDU4MTc5MS4KCjA3LzMwLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gJW5ld29iamVjdCAocmVwbGFjZW1lbnQgZm9yICVuZXcpIG5vdyBpbXBsZW1lbnRlZCBmb3IgSmF2YS4gCgowNy8yOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCB0eXBlbWFwIGNvcGllcywgJWFwcGx5LCBhbmQgJWNsZWFyIGluc2lkZQogICAgICAgICAgICBDKysgbmFtZXNwYWNlcy4KCjA3LzI4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gVGhlIEpOSSBjbGFzcyBub3cgaGFzIHBhY2thZ2UgYWNjZXNzIGFzIHRoZSBjbGFzcyBtb2RpZmllcgogICAgICAgICAgICBoYXMgYmVlbiBjaGFuZ2VkIGZyb20gInB1YmxpYyIgdG8gbm90aGluZy4gVGhpcyBoYXMgYmVlbiBkb25lCiAgICAgICAgICAgIGFzIHRoaXMgY2xhc3MgaXMgbm93IG1vcmUgZm9yIHRoZSBpbnRlcm5hbCB3b3JraW5ncyBvZiBTV0lHIHNpbmNlIHRoZSBtb2R1bGUKICAgICAgICAgICAgY2xhc3MgaGFzIHN0YXRpYyB0eXBlIGNoZWNraW5nIGZvciBhbGwgdHlwZXMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgogICAgICAgICAgICBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBjYW4gYmUgYWNoaWV2ZWQgYnkgdXNpbmcgdGhlICVqbmljbGFzc2NsYXNzbW9kaWZpZXIgCiAgICAgICAgICAgIHByYWdtYSB0byBjaGFuZ2UgaXQgYmFjayB0byAicHVibGljIi4KCjA3LzI4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gUHJveHkvU2hhZG93IGNsYXNzZXMgYXJlIGdlbmVyYXRlZCBieSBkZWZhdWx0LiBUaGUgLXByb3h5IGFuZCAKICAgICAgICAgICAgLXNoYWRvdyBjb21tYW5kIGxpbmUgb3B0aW9ucyBhcmUgZGVwcmVjYXRlZC4gSWYgeW91IHdhbnQgdG8gdXNlIHRoZSAKICAgICAgICAgICAgbG93LWxldmVsIGZ1bmN0aW9uYWwgaW50ZXJmYWNlIHRoZW4gdXNlIHRoZSBuZXcgLW5vcHJveHkgY29tbWFuZGxpbmUgb3B0aW9uLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMDcvMjgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBSZW1haW5pbmcgcHJhZ21hcyBzaGFrZXVwLiBUaGVzZSB3ZXJlIHRoZSByZW1haW5pbmcgcHJhZ21hcyBhbmQgdGhlaXIKICAgICAgICAgICAgbmV3IG5hbWVzIHdoZXJlIGNoYW5nZWQ6CgogICAgICAgICAgICBtb2R1bGViYXNlCiAgICAgICAgICAgIG1vZHVsZWNvZGUKICAgICAgICAgICAgbW9kdWxlY2xhc3Ntb2RpZmllcnMKICAgICAgICAgICAgbW9kdWxlaW1wb3J0ID0+IG1vZHVsZWltcG9ydHMKICAgICAgICAgICAgbW9kdWxlaW50ZXJmYWNlID0+IG1vZHVsZWludGVyZmFjZXMKCiAgICAgICAgICAgIFRoZSBtb2R1bGVpbXBvcnRzIHdvcmtzIHNsaWdodGx5IGRpZmZlcmVudGx5IHRvIGhvdyB0aGUgbW9kdWxlaW1wb3J0IHByYWdtYSB3b3JrZWQuIAogICAgICAgICAgICBOb3cgaXQgYWN0dWFsbHkgdGFrZXMgY29kZSB3aGljaCBnZXRzIHBsYWNlZCBiZWZvcmUgdGhlIGNsYXNzIGRlZmluaXRpb24gc28gdGhlIAogICAgICAgICAgICB3aG9sZSBpbXBvcnQgc3RhdGVtZW50IGhhcyB0byBiZSBnaXZlbiwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAlcHJhZ21hKGphdmEpIG1vZHVsZWltcG9ydHM9JXsKICAgICAgICAgICAgaW1wb3J0IGphdmEuaW8uKjsKICAgICAgICAgICAgaW1wb3J0IGphdmEubWF0aC4qOwogICAgICAgICAgICAlfQoKICAgICAgICAgICAgVGhlIG1vZHVsZWludGVyZmFjZXMgaXMgc2xpZ2h0bHkgZGlmZmVyZW50IHRvIHRoZSBvbGQgbW9kdWxlaW50ZXJmYWNlIGluIHRoYXQgaWYgCiAgICAgICAgICAgIG1vcmUgdGhhbiBvbmUgaW50ZXJmYWNlIGlzIHJlcXVpcmVkIHRoZXkgbXVzdCBiZSBjb21tYSBzZXBhcmF0ZWQgaW4gb25lIHVzZSBvZiAKICAgICAgICAgICAgdGhlIHByYWdtYSwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAlcHJhZ21hKGphdmEpIG1vZHVsZWludGVyZmFjZXM9IlNlcmlhbGl6YWJsZSwgTXlJbnRlcmZhY2UiCgogICAgICAgICAgICBUaGVzZSBsYXN0IHR3byBwcmFnbWFzIGFyZSBjb25zaXN0ZW50IHdpdGggdGhlIGphdmFpbnRlcmZhY2VzIGFuZCBqYXZhaW1wb3J0cyAKICAgICAgICAgICAgdHlwZW1hcC4KCiAgICAgICAgICAgIEEgc2ltaWxhciBzZXQgb2YgcHJhZ21hcyBoYXMgYmVlbiBpbnRyb2R1Y2VkLCBuYW1lbHk6CgogICAgICAgICAgICBqbmljbGFzc2Jhc2UKICAgICAgICAgICAgam5pY2xhc3Njb2RlCiAgICAgICAgICAgIGpuaWNsYXNzY2xhc3Ntb2RpZmllcnMKICAgICAgICAgICAgam5pY2xhc3NpbXBvcnQKICAgICAgICAgICAgam5pY2xhc3NpbnRlcmZhY2UKCiAgICAgICAgICAgIFRoZXNlIHdvcmsgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZWlyIG1vZHVsZSBjb3VudGVycGFydHMuIE5vdGUgdGhhdCBwcmV2aW91c2x5CiAgICAgICAgICAgIHRoZSBtb2R1bGVYWFggcHJhZ21hcyB3b3JrZWQgb24gdGhlIG9sZCBtb2R1bGUgY2xhc3Mgd2hpY2ggaXMgbm93IGNhbGxlZCB0aGUKICAgICAgICAgICAgSk5JIGNsYXNzICh0aGUgY2xhc3Mgd2l0aCB0aGUgbmF0aXZlIGZ1bmN0aW9ucykuIFRoZSBqbmljbGFzc1hYWCBwcmFnbWFzIG5vdyAKICAgICAgICAgICAgd29yayBvbiB0aGUgbmV3IG1vZHVsZSBjbGFzcyAodGhlIGNsYXNzIHRoYXQgaGFzIGFsbCB0aGUgZ2xvYmFsIGZ1bmN0aW9ucyBhbmQKICAgICAgICAgICAgZ2xvYmFsIHZhcmlhYmxlIGdldHRlcnMgYW5kIHNldHRlcnMgd2hlbiB1c2luZyBwcm94eSBjbGFzc2VzLCBwbHVzIGFsbCBvdGhlcgogICAgICAgICAgICByZW1haW5pbmcgZnVuY3Rpb25zIHdoZW4gdXNpbmcgdGhlIGxvdy1sZXZlbCBwcm9jZWR1cmFsIGludGVyZmFjZSkuCgogICAgICAgICAgICBJbiBzdW1tYXJ5IHRoZSBjb250ZW50cyBvZiB0aGUgcHJhZ21hcyBtYWtlIHVwIGEgY2xhc3MgbGlrZSB0aGlzOgoKICAgICAgICAgICAgPGpuaWNsYXNzaW1wb3J0cz4KICAgICAgICAgICAgPGpuaWNsYXNzbW9kaWZpZXJzPiBjbGFzcyBtb2R1bGVuYW1lIGV4dGVuZHMgPGpuaWNsYXNzYmFzZT4gaW1wbGVtZW50cyA8am5pY2xhc3NpbnRlcmZhY2VzPiB7CiAgICAgICAgICAgICAgICA8am5pY2xhc3Njb2RlPgogICAgICAgICAgICAgICAgLi4uIFNXSUcgZ2VuZXJhdGVkIGZ1bmN0aW9ucyAuLi4KICAgICAgICAgICAgfQp9CiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA3LzI4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRGVwcmVjYXRlZCBtb2R1bGVtZXRob2Rtb2RpZmllcnMgcHJhZ21hIGFuZCByZXBsYWNlZCB3aXRoIAogICAgICAgICAgICBhIGJldHRlciAlZmVhdHVyZSBiYXNlZCBkaXJlY3RpdmUgY2FsbGVkICVqYXZhbWV0aG9kbW9kaWZpZXJzLgogICAgICAgICAgICBBIHVzZWZ1bCBleGFtcGxlIHdvdWxkIGJlIGZvciBzeW5jaHJvbmlzYXRpb24gaW4gbXVsdGktdGhyZWFkZWQgYXBwczoKCiAgICAgICAgICAgICVqYXZhbWV0aG9kbW9kaWZpZXJzIGZvbyhpbnQgYSkgInB1YmxpYyBzeW5jaHJvbml6ZWQiOwoKICAgICAgICAgICAgQ2hhbmdlcyB0aGlzIGZ1bmN0aW9uIGZyb20gdGhlIGRlZmF1bHQgKCJwdWJsaWMiKSB0byAicHVibGljIHN5bmNocm9uaXplZCIuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNy8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNldmVyYWwgZGlyZWN0aXZlcyBub3cgYWxsb3cgb3B0aW9uYWwgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLgogICAgICAgICAgICBUaGVzZSBpbmNsdWRlOgoKICAgICAgICAgICAgICAgICVtb2R1bGUobmFtZT0idmFsdWUiLCBuYW1lPSJ2YWx1ZSIsIC4uLikgbW9kdWxlbmFtZQogICAgICAgICAgICAgICAgJWltcG9ydChuYW1lPSJ2YWx1ZSIsIC4uLikgImZpbGVuYW1lLmkiCiAgICAgICAgICAgICAgICAlZXh0ZW5kKG5hbWU9InZhbHVlIiwgLi4uKSBjbGFzc25hbWUgewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGVzZSBjdXJyZW50bHkgaGF2ZSBubyBlZmZlY3QgYW5kIGFyZSByZXNlcnZlZCBmb3IKICAgICAgICAgICAgZnV0dXJlIGV4cGFuc2lvbi4KICAgICAgICAgICAgICAgCjA3LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRW5oYW5jZW1lbnRzIHRvIHNtYXJ0LXBvaW50ZXIgaGFuZGxpbmcuICBTV0lHIG9ubHkgcHJvdmlkZXMKICAgICAgICAgICAgZXh0cmEgc3VwcG9ydCBmb3IgYSBzbWFydC1wb2ludGVyIGlmIG9wZXJhdG9yLT4oKSByZXR1cm5zCiAgICAgICAgICAgIGEgcHJvcGVyIHBvaW50ZXIuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgRm9vICpvcGVyYXRvci0+KCk7CgogICAgICAgICAgICBJZiBvcGVyYXRvci0+KCkgcmV0dXJucyBhbiBvYmplY3QgYnkgdmFsdWUgb3IgcmVmZXJlbmNlLAogICAgICAgICAgICB0aGVuIFNXSUcgZXhhbWluZXMgdGhlIHJldHVybmVkIG9iamVjdCB0byBzZWUgaWYgaXQgYWxzbwogICAgICAgICAgICBpbXBsZW1lbnRzIG9wZXJhdG9yLT4oKS4gIElmIHNvLCBTV0lHIGNoYXNlcyBvcGVyYXRvci0+KCkKICAgICAgICAgICAgdW50aWwgaXQgY2FuIGZpbmQgb25lIHRoYXQgcmV0dXJucyBhIHBvaW50ZXIuICBUaGlzIGFsbG93cwogICAgICAgICAgICBjYXNlcyBsaWtlIHRoaXMgdG8gd29yazoKCiAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaCgpOwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIEZvbyAqb3BlcmF0b3ItPigpOwogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgY2xhc3MgU3BhbSB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIEJhciBvcGVyYXRvci0+KCk7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgID4+PiBzID0gU3BhbSgpCiAgICAgICAgICAgICAgICAgPj4+IHMuYmxhaCgpICAgICAgIyBJbnZva2VzIEZvbzo6YmxhaCgpCgogICAgICAgICAgICBUaGUgcy5ibGFoKCkgY2FsbCBhY3R1YWxseSBpbnZva2VzOgoKICAgICAgICAgICAgICAgICAgKChzLm9wZXJhdG9yLT4oKSkub3BlcmF0b3ItPigpKS0+YmxhaCgpOwogCjA3LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBidWcgd2l0aCB0eXBlZGVmIGFuZCByZWZlcmVuY2VzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIHR5cGVkZWYgRm9vICYgRm9vUmVmOwogICAgICAgICAgICAgICAgIEZvb1JlZiBibGFoKCk7CgogICAgICAgICAgICBQcmV2aW91cyB2ZXJzaW9ucyBvZiBTV0lHIGdlbmVyYXRlZCBjb2RlIHRoYXQgd291bGRuJ3QKICAgICAgICAgICAgY29tcGlsZS4KCjA3LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgV3JhcHBpbmcgb2Ygc3RhdGljIG1ldGhvZHMgaGFzIGJlZW4gaW1wcm92ZWQgaW4gcHJveHkgY2xhc3Nlcy4gIEluIG9sZGVyCiAgICAgICAgICAgIHZlcnNpb25zIG9mIFNXSUcsIGlmIHlvdSBoYWQgdGhpczoKCiAgICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgc3RhdGljIHZvaWQgYmFyKCk7CiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGUgc3RhdGljIG1ldGhvZCB3YXMgb25seSBhdmFpbGFibGUgYXMgYSBmdW5jdGlvbiBGb29fYmFyKCkuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgID4+PiBGb29fYmFyKCkKCiAgICAgICAgICAgIE5vdywgdGhlIHN0YXRpYyBtZXRob2QgY2FuIGFsc28gYmUgaW52b2tlZCB0aHJvdWdoIGFuIGluc3RhbmNlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgID4+PiBmID0gRm9vKCkKICAgICAgICAgICAgICAgICAgPj4+IGYuYmFyKCkgICAgICAgICMgSW52b2tlcyBzdGF0aWMgbWV0aG9kCgogICAgICAgICAgICBUaGlzIHdvcmtzIHdpdGggYWxsIHZlcnNpb25zIG9mIFB5dGhvbi4gIEFkZGl0aW9uYWxseSwgZm9yIFB5dGhvbi0yLjIsCiAgICAgICAgICAgIHRoZSBzdGF0aWMgbWV0aG9kIGNhbiBiZSBpbnZva2VkIGFzOgoKICAgICAgICAgICAgICAgICAgPj4+IEZvby5iYXIoKQoKICAgICAgICAgICAgVGhlIG9sZC1zdHlsZSBmdW5jdGlvbiBpcyBzdGlsbCBzdXBwb3J0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gSWYKICAgICAgICAgICAgeW91IGNhcmUgYWJvdXQgbWFraW5nIHlvdXIgY29kZSBhY3Jvc3MgZGlmZmVyZW50IHZlcnNpb25zIG9mIFB5dGhvbiwKICAgICAgICAgICAgZWl0aGVyIHVzZSBGb29fYmFyKCkgb3IgYWNjZXNzIHRoZSBtZXRob2QgdGhyb3VnaCBhbiBpbnN0YW5jZS4KIAowNy8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIENoYW5nZXMgdG8gdGhlIFB5dGhvbiBtb2R1bGUuICBQcm94eSBjbGFzc2VzIG5vdyB1dGlsaXplIG5ldyBQeXRob24tMi4yCiAgICAgICAgICAgIGZlYXR1cmVzIGluY2x1ZGluZyBwcm9wZXJ0aWVzIGFuZCBzdGF0aWMgbWV0aG9kcy4gIEhvd2V2ZXIsIHRoZXNlIGZlYXR1cmVzCiAgICAgICAgICAgIGFyZSBzdXBwb3J0ZWQgaW4gYSB3YXkgdGhhdCBwcm92aWRlcyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyCiAgICAgICAgICAgIFB5dGhvbiB2ZXJzaW9ucy4gIEluIG90aGVyIHdvcmRzLCBwcm94eSBjbGFzc2VzIHdvcmsgd2l0aCBhbGwgdmVyc2lvbnMKICAgICAgICAgICAgb2YgUHl0aG9uIGFuZCBvbmx5IHVzZSBuZXcgZmVhdHVyZXMgd2hlbiBydW5uaW5nIG9uIFB5dGhvbi0yLjIuCgoKMDcvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBNb2RpZmllZCAlZXh0ZW5kIHNvIHRoYXQgb3ZlcmxvYWRlZCBtZXRob2RzIGNhbiBiZSBhZGRlZC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVleHRlbmQgRm9vIHsKICAgICAgICAgICAgICAgICAgICAgdm9pZCBiYXIoaW50IHgpIHsgfTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCBiYXIoY2hhciAqcykgeyB9OwogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoaXMgd29ya3Mgd2l0aCBib3RoIEMrKyAqYW5kKiBDLgoKMDcvMjQvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBNb3JlIG5ldyB0eXBlbWFwcyBzbyB0aGF0IHRoZSBKYXZhIHByb3h5IGNsYXNzZXMgYW5kIHR5cGUgd3JhcHBlciBjbGFzc2VzCiAgICAgICAgICAgIGNhbiBiZSBmdXJ0aGVyIHRhaWxvcmVkIGJ5IHVzZXJzLiBUaGVzZSBhcmUgdGhlIGRlZmF1bHQgY29kZSBmb3IgZ2VuZXJhdGluZyB0aGUgCiAgICAgICAgICAgIGZpbmFsaXplKCkgbWV0aG9kcyAocHJveHkgY2xhc3NlcyBvbmx5KSBhbmQgdGhlIGdldENQdHIoKSBtZXRob2RzIGZvciBwcm94eSAKICAgICAgICAgICAgY2xhc3NlcyBhbmQgdHlwZSB3cmFwcGVyIGNsYXNzZXM6CgogICAgICAgICAgICAldHlwZW1hcChqYXZhZmluYWxpemUpIFNXSUdUWVBFICV7CiAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB7CiAgICAgICAgICAgICAgICBfZGVsZXRlKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAlfQogICAgICAgICAgICAKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWdldGNwdHIpIFNXSUdUWVBFLCBTV0lHVFlQRSAqLCBTV0lHVFlQRSAmLCBTV0lHVFlQRSBbXSAlewogICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBnZXRDUHRyKCRqYXZhY2xhc3NuYW1lIG9iaikgewogICAgICAgICAgICAgICAgcmV0dXJuIG9iai5zd2lnQ1B0cjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICV9CgogICAgICAgICAgICBUaGUgamF2YWdldGNwdHIgdHlwZW1hcCB3aWxsIGVuYWJsZSB1c2VycyB0byBoYW5kbGUgSmF2YSBudWxsIGJ5IG92ZXJyaWRpbmcKICAgICAgICAgICAgdGhpcyB0eXBlbWFwIC0gYSByZXF1ZXN0ZWQgZmVhdHVyZS4KCiAgICAgICAgICAgIFRoZSAtbm9maW5hbGl6ZSBjb21tYW5kbGluZSBvcHRpb24gaGFzIGJlZW4gZGVwcmVjYXRlZC4gVGhlIGphdmFmaW5hbGl6ZQogICAgICAgICAgICB0eXBlbWFwIGlzIG1vcmUgcG93ZXJmdWwgYXMgaXQgd2lsbCBhbGxvdyB0aGUgcmVtb3ZhbCBvZiB0aGUgZmluYWxpemUgbWV0aG9kcyAKICAgICAgICAgICAgZm9yIGFsbCBvciBhbnkgb25lIG9yIG1vcmUgcGFydGljdWxhciBwcm94eSBjbGFzcy4KCjA3LzIzLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gVGhlIGdldENQdHJYWFgoKSBmdW5jdGlvbiBoYXMgYmVlbiBjaGFuZ2VkIHRvIGEgc3RhdGljIGZ1bmN0aW9uIGFuZAogICAgICAgICAgICBpcyBub3cgb2YgdGhlIGZvcm06CgogICAgICAgICAgICBwcm90ZWN0ZWQgc3RhdGljIGxvbmcgZ2V0Q1B0cihYWFggb2JqKSB7Li4ufQoKICAgICAgICAgICAgVGhpcyBpcyBhIHJlcXVlc3RlZCBjaGFuZ2Ugd2hpY2ggd2lsbCBhbGxvdyBKYXZhIG51bGwgcG9pbnRlcnMgdG8gYmUgdXNlZCBhcyBudWxsCiAgICAgICAgICAgIGNhbiBiZSBwYXNzZWQgaW4gZm9yIG9iai4gSG93ZXZlciwgdG8gYWNoaWV2ZSB0aGlzIHRoZSBhcHByb3ByaWF0ZSBjb2RlIG11c3QgYmUKICAgICAgICAgICAgd3JpdHRlbiB1c2luZyB0aGUgbmV3IGphdmFnZXRjcHRyIHR5cGVtYXAgZGlyZWN0aXZlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKICAgICAgICAgICAgQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgY2FuIGJlIGFjaGlldmVkIGJ5IGFkZGluZyB0aGlzIGZ1bmN0aW9uIGJhY2sgaW4gdXNpbmcgdGhlCiAgICAgICAgICAgIG5ldyBqYXZhY29kZSB0eXBlbWFwOgoKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWNvZGUpIFNXSUdUWVBFICV7CgogICAgICAgICAgICAgIC8vIFNXSUctMS4zLjEyIGFuZCBTV0lHLTEuMy4xMwogICAgICAgICAgICAgIHB1YmxpYyBsb25nIGdldENQdHIkamF2YWNsYXNzbmFtZSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBzd2lnQ1B0cjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLy8gU1dJRy0xLjMuMTEgYW5kIGVhcmxpZXIKICAgICAgICAgICAgICBwdWJsaWMgbG9uZyBnZXRDUHRyKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHN3aWdDUHRyOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICV9CgoKMDcvMjMvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBOZXcgZGlyZWN0aXZlIHRvIGNvbnRyb2wgY29uc3RhbnQgY29kZSBnZW5lcmF0aW9uIC0gJWphdmFjb25zdC4KICAgICAgICAgICAgVGhlIGRlZmF1bHQgaGFuZGxpbmcgZm9yIGhhbmRsaW5nIGNvbnN0YW50cyBpcyB0byBnZXQgdGhlIHZhbHVlIHRocm91Z2gKICAgICAgICAgICAgYSBKTkkgY2FsbCwgZWcKCiAgICAgICAgICAgICNkZWZpbmUgWUVMTE9XIDUKICAgICAgICAgICAgI2RlZmluZSBCSUcgMTIzNExMCgogICAgICAgICAgICByZXN1bHRzIGluOgoKICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgWUVMTE9XID0gbW9kdWxlbmFtZS5nZXRfWUVMTE9XKCk7CiAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgbG9uZyBCSUcgPSBtb2R1bGVuYW1lLmdldF9CSUcoKTsKCiAgICAgICAgICAgIEVhcmxpZXIgdmVyc2lvbnMgb2YgdGhlIEphdmEgbW9kdWxlIGluaXRpYWxpc2VkIHRoZSB2YWx1ZSB1c2luZyB0aGUgQyB2YWx1ZToKCiAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFlFTExPVyA9IDU7CiAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgbG9uZyBCSUcgPSAxMjM0TEw7CgogICAgICAgICAgICBUaGlzIHdvcmtzIGluIG1vc3QgY2FzZXMsIGJ1dCB0aGUgdmFsdWUgZm9yIEJJRyB3b24ndCBjb21waWxlIGFzIDEyMzRMTCBpcyBub3QKICAgICAgICAgICAgdmFsaWQgSmF2YSBjb2RlIGFuZCB0aGlzIGlzIG9uZSBvZiB0aGUgcmVhc29ucyB3aHkgdGhlIGRlZmF1bHQgaXMgbm93IHRvIGdldCB0aGUgCiAgICAgICAgICAgIHZhbHVlcyB0aHJvdWdoIGEgSk5JIGNhbGwuIFRoZSBzaWRlIGVmZmVjdCBpcyB0aGF0IHRoZXNlICdjb25zdGFudHMnIGNhbm5vdCBiZSB1c2VkIAogICAgICAgICAgICBpbiBzd2l0Y2ggc3RhdGVtZW50cy4gVGhlICVqYXZhY29uc3QgZGlyZWN0aXZlIGFsbG93cyBvbmUgdG8gc3BlY2lmeSB0aGUKICAgICAgICAgICAgd2F5IHRoZSBjb25zdGFudCB2YWx1ZSBpcyBpbml0aWFsaXNlZCBhbmQgd29ya3MgbGlrZSBvdGhlciAlZmVhdHVyZQogICAgICAgICAgICBkaXJlY3RpdmVzLCBlZwoKICAgICAgICAgICAgJWphdmFjb25zdCgwKTsgICAgIC8vIGFsbCBjb25zdGFudHMgZnJvbSB0aGlzIHBvaW50IG9uIGFyZSBpbml0aWFsaXNlZCB1c2luZyB0aGUgQyB2YWx1ZQogICAgICAgICAgICAlamF2YWNvbnN0KDEpIEJJRzsgLy8ganVzdCBCSUcgaW5pdGlhbGlzZWQgdXNpbmcgSk5JIGNhbGwgKG11c3QgYmUgcGFyc2VkIGJlZm9yZSBCSUcgaXMgZGVmaW5lZCkKCjA3LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgKioqIElNUE9SVEFOVCBDSEFOR0VTIFRPIFRIRSBQWVRIT04gTU9EVUxFICoqKgoKICAgICAgICAgICAgKDEpIFRoZSBQeXRob24gbW9kdWxlIG5vdyBlbmFibGVzIHNoYWRvdy9wcm94eSBjbGFzc2VzIGJ5IGRlZmF1bHQuCiAgICAgICAgICAgIFRoaXMgbWVhbnMgdGhhdCB0d28gZmlsZXMgYXJlIGFsd2F5cyBjcmVhdGVkIGJ5IFNXSUcuICBGb3IKICAgICAgICAgICAgaW5zdGFuY2UsIGlmIHlvdSBoYXZlIHRoaXM6CgogICAgICAgICAgICAgICAgIC8vIGZpbGU6IGZvby5pCiAgICAgICAgICAgICAgICAgJW1vZHVsZSBmb28KICAgICAgICAgICAgICAgICAuLi4KCiAgICAgICAgICAgIFRoZW4gc3dpZyBnZW5lcmF0ZXMgdHdvIGZpbGVzICJmb29fd3JhcC5jIiBhbmQgImZvby5weSIuCgogICAgICAgICAgICAoMikgVGhlIG5hbWUgb2YgdGhlIGxvdy1sZXZlbCBDIGV4dGVuc2lvbiBtb2R1bGUgaGFzIGJlZW4gY2hhbmdlZAogICAgICAgICAgICB0byBzdGFydCB3aXRoIGEgbGVhZGluZyB1bmRlcnNjb3JlLiAgIFRoaXMgbWVhbnMgdGhhdCB5b3UgaGF2ZQogICAgICAgICAgICB0byBjb21waWxlIHRoZSBtb2R1bGUgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICAkIGNjIC1jIC1JL3Vzci9sb2NhbC9pbmNsdWRlL3B5dGhvbjIuMiBmb29fd3JhcC5jCiAgICAgICAgICAgICAgICAkIGNjIC1zaGFyZWQgZm9vX3dyYXAubyAkKE9CSlMpIC1vIF9mb28uc28KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RlIGV4dHJhIHVuZGVyc2NvcmUKCiAgICAgICAgICAgIFRoaXMgbmFtaW5nIHNjaGVtZSBpcyBjb25zaXN0ZW50IHdpdGggb3RoZXIgUHl0aG9uIG1vZHVsZXMgdGhhdAogICAgICAgICAgICB1dGlsaXplIGV4dGVuc2lvbiBjb2RlLiAgRm9yIGluc3RhbmNlLCB0aGUgc29ja2V0IG1vZHVsZSBjb25zaXN0cwogICAgICAgICAgICBvZiAiX3NvY2tldC5zbyIgYW5kICJzb2NrZXQucHkiLiAgSW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgU1dJRywKICAgICAgICAgICAgdGhlIHNoYXJlZCBvYmplY3QgZmlsZSB3YXMgbmFtZWQgImZvb2Ntb2R1bGUuc28iLgoKICAgICAgICAgICAgKDMpIEEgbmV3IGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0byBpbnNlcnQgUHl0aG9uIGNvZGUgaW50bwogICAgICAgICAgICB0aGUgY29ycmVzcG9uZGluZyAucHkgZmlsZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVweXRob25jb2RlICV7CiAgICAgICAgICAgICAgICBkZWYgZm9vKCk6CiAgICAgICAgICAgICAgICAgICAgcHJpbnQgIkhlbGxvIFdvcmxkIgogICAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICBUaGlzIGRpcmVjdGl2ZSBhbGxvd3MgeW91IHRvIGNyZWF0ZSBtb2R1bGVzIGFzIGEgbWl4IG9mIEMgYW5kIFB5dGhvbi4KICAgICAgICAgICAgIFB5dGhvbiBjb2RlIGlzIHNlYW1sZXNzbHkgYWRkZWQgdG8gdGhlIG1vZHVsZS4KCiAgICAgICAgICAgICg0KSBUaGUgLXNoYWRvdyBjb21tYW5kIGxpbmUgb3B0aW9uIGlzIGRlcHJlY2F0ZWQuICBUaGlzIGlzIHR1cm5lZCBvbgogICAgICAgICAgICBieSBkZWZhdWx0LgoKICAgICAgICAgICAgKDUpIFRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIGV4dHJhIHB5dGhvbiBmaWxlLCB1c2UgdGhlICItbm9wcm94eSIKICAgICAgICAgICAgY29tbWFuZCBsaW5lIG9wdGlvbi4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICBUaGlzIGNoYW5nZSB3aWxsIGxpa2VseSBicmVhayB0aGUgYnVpbGQgZW52aXJvbm1lbnQgb2YgcHJvamVjdHMgdGhhdAogICAgICAgICAgICB1dGlsaXplIHNoYWRvdyBjbGFzc2VzLiAgIFRvIGZpeCB0aGlzLCB5b3UgcHJvYmFibHkgb25seSBuZWVkIHRvCiAgICAgICAgICAgIGNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0IC5zbyBmaWxlLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlCiAgICAgICAgICAgIE1ha2VmaWxlIGluZm9ybWF0aW9uIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgICBUQVJHRVQgPSBleGFtcGxlY21vZHVsZS5zbwoKICAgICAgICAgICAgSnVzdCBjaGFuZ2UgaXQgdG86CgogICAgICAgICAgICAgICAgICAgVEFSR0VUID0gX2V4YW1wbGUuc28KCiAgICAgICAgICAgICoqKiBET0NVTUVOVEFUSU9OIFVQREFURSAqKioKICAgICAgICAgICAgVGhlIGZpbGUgRG9jL01hbnVhbC9QeXRob24uaHRtbCBoYXMgYmVlbiB1cGRhdGVkIHRvIGRlc2NyaWJlIHRoZXNlIGNoYW5nZXMuCgoKMDcvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCAtbm9leHRlcm4gb3B0aW9uLiAgIElmIHN1cHBsaWVkLCBTV0lHIHdpbGwgbm90IGdlbmVyYXRlCiAgICAgICAgICAgIGV4dHJhIGV4dGVybiBkZWNsYXJhdGlvbnMuICBUaGlzIGlzIHNvbWV0aW1lcyBhbiBpc3N1ZSBvbiAKICAgICAgICAgICAgbm9uLXVuaXggcGxhdGZvcm1zLgoKMDcvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCBhIHdhcm5pbmcgZm9yIGlnbm9yZWQgZnJpZW5kIGZ1bmN0aW9ucy4KCjA3LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1NzQ0OTggXSAtcHJveHkgYW5kICVpbmNsdWRlICJwb2ludGVyLmkiIGNsYXNoLgogICAgICAgICAgICBSZXBvcnRlZCBieSBEYXZpZCBDcmVhc3kuCgowNy8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTc2MTAzIF0gZ2xvYmFsIGRlc3RydWN0aW9uIHdhcm5pbmcgd2l0aCBzaGFkb3cuCiAgICAgICAgICAgIFBlcmwgZXh0ZW5zaW9ucyBzaG91bGQgbm8gbG9uZ2VyIHJlcG9ydCB0aGUgd2FybmluZwoKICAgICAgICAgICAgICAgIlVzZSBvZiB1bmluaXRpYWxpemVkIHZhbHVlIGR1cmluZyBnbG9iYWwgZGVzdHJ1Y3Rpb24uIgogCiAgICAgICAgICAgIHdoZW4gcnVubmluZyB3aXRoICJwZXJsIC13Ii4gIFJlcG9ydGVkIGJ5CiAgICAgICAgICAgIEJyZXR0IFdpbGxpYW1zLgoKMDcvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBJbiBDKysgbW9kZSwgU1dJRyBub3cgYWx3YXlzIGRlZmluZXMgbmFtZXNwYWNlIHN0ZC4gIEJ5IGRlZmF1bHQsCiAgICAgICAgICAgIGl0J3MgZW1wdHkuICBIb3dldmVyLCB0aGlzIHdpbGwgc2lsZW5jZSBlcnJvcnMgZnJvbSBwcm9ncmFtcwogICAgICAgICAgICB0aGF0IGluY2x1ZGUgc3RhdGVtZW50cyBzdWNoIGFzICJ1c2luZyBuYW1lc3BhY2Ugc3RkOyIuCiAgICAgICAgICAgIFRoaXMgZml4ZXMgQnVnIFsgNTg0MDE3IF0gdXNpbmcgbmFtZXNwYWNlIHN0ZCBnZW5lcmF0ZXMgZXJyb3IuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEpvc2VwaCBXaW5zdG9uLgoKMDcvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCBhIG5ldyB3YXJuaW5nIG1lc3NhZ2UgZm9yICVhcHBseS4gIElmIHlvdSB1c2UgJWFwcGx5IGJ1dCBubyB0eXBlbWFwcwogICAgICAgICAgICBhcmUgZGVmaW5lZCwgeW91IHdpbGwgZ2V0IGEgd2FybmluZyBtZXNzYWdlLiAgVGhpcyBzaG91bGQgaGVscCB3aXRoCiAgICAgICAgICAgIHByb2JsZW1zIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgICAlYXBwbHkgY2hhciAqT1VUUFVUIHsgLi4uIH07CgogICAgICAgICAgICBJbiBvbGQgdmVyc2lvbnMgb2YgU1dJRywgdGhpcyBzaWxlbnRseSBkaWQgbm90aGluZy4gIE5vdyB5b3UgZ2V0IGFuIGVycm9yIGxpa2UgdGhpczoKICAKICAgICAgICAgICAgICAgICAgIGZpbGU6bGluZS4gV2FybmluZy4gQ2FuJ3QgYXBwbHkgKGNoYXIgKk9VVFBVVCkuIE5vIHR5cGVtYXBzIGFyZSBkZWZpbmVkLgoKMDcvMjIvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBTdGFydGVkIEphdmEgcHJhZ21hIGRlcHJlY2F0aW9uLiBSZXBsYWNlbWVudHMgdXNlICV0eXBlbWFwIGJhc2VkIAogICAgICAgICAgICBkaXJlY3RpdmVzIGFuZCBlbmFibGUgcHJveHkgY2xhc3NlcyBhbmQgdGhlIG5ldyB0eXBlIHdyYXBwZXIgY2xhc3NlcyB0byBiZSAKICAgICAgICAgICAgdGFpbG9yZWQgaW4gdmFyaW91cyB3YXlzLiBUaGVzZSBhcmUgdGhlIG5ldyB0eXBlbWFwczoKICAgICAgICAgICAgCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFiYXNlKSAgICAgICAgICAgLSBiYXNlIChleHRlbmRzKSBmb3IgSmF2YSBjbGFzcwogICAgICAgICAgICAldHlwZW1hcChqYXZhY2xhc3Ntb2RpZmllcnMpIC0gY2xhc3MgbW9kaWZpZXJzIGZvciB0aGUgSmF2YSBjbGFzczogZGVmYXVsdCBpcyAicHVibGljIgogICAgICAgICAgICAldHlwZW1hcChqYXZhY29kZSkgICAgICAgICAgIC0gamF2YSBjb2RlIGlzIGNvcGllZCB2ZXJiYXRpbSB0byB0aGUgSmF2YSBjbGFzcwogICAgICAgICAgICAldHlwZW1hcChqYXZhaW1wb3J0cykgICAgICAgIC0gaW1wb3J0IHN0YXRlbWVudHMgZm9yIEphdmEgY2xhc3MKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWludGVyZmFjZXMpICAgICAtIGludGVyZmFjZXMgKGV4dGVuZHMpIGZvciBKYXZhIGNsYXNzCiAgICAgICAgICAgIAogICAgICAgICAgICBBbmQgdGhlc2UgYXJlIHRoZSAlcHJhZ21hIGRpcmVjdGl2ZXMgYmVpbmcgZGVwcmVjYXRlZDoKICAgICAgICAgICAgYWxsc2hhZG93YmFzZQogICAgICAgICAgICBhbGxzaGFkb3djbGFzc21vZGlmaWVycwogICAgICAgICAgICBhbGxzaGFkb3djb2RlCiAgICAgICAgICAgIGFsbHNoYWRvd2ltcG9ydAogICAgICAgICAgICBhbGxzaGFkb3dpbnRlcmZhY2UKICAgICAgICAgICAgc2hhZG93YmFzZQogICAgICAgICAgICBzaGFkb3djbGFzc21vZGlmaWVycwogICAgICAgICAgICBzaGFkb3djb2RlCiAgICAgICAgICAgIHNoYWRvd2ltcG9ydAogICAgICAgICAgICBzaGFkb3dpbnRlcmZhY2UKICAgICAgICAgICAgCiAgICAgICAgICAgIE5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSB0byB0YXJnZXQgYSBwYXJ0aWN1bGFyIHByb3h5IGNsYXNzOgogICAgICAgICAgICAldHlwZW1hcChqYXZhaW1wb3J0cykgRm9vICJpbXBvcnQgamF2YS51dGlsLioiOwogICAgICAgICAgICBvciBhIHBhcnRpY3VsYXIgdHlwZSB3cmFwcGVyIGNsYXNzOgogICAgICAgICAgICAldHlwZW1hcChqYXZhaW1wb3J0cykgZG91YmxlKiAiaW1wb3J0IGphdmEubWF0aC4qIjsKICAgICAgICAgICAgTm90ZSB0aGF0ICRqYXZhY2xhc3NuYW1lIGluIHRoZXNlIHR5cGVtYXBzIGFyZSBzdWJzdGl0dXRlZCB3aXRoIGVpdGhlciB0aGUgcHJveHkgCiAgICAgICAgICAgIGNsYXNzbmFtZSB3aGVuIHVzaW5nIHByb3h5IGNsYXNzZXMgb3IgdGhlIFNXSUdUWVBFIGNsYXNzIG5hbWUuCgowNy8xOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEphdmEgbW9kdWxlIG92ZXJoYXVsIHRvIGltcGxlbWVudCBzdGF0aWMgdHlwZSBjaGVja2luZyBvZiBhbGwgCiAgICAgICAgICAgIHR5cGVzLiAKICAgICAgICAgICAgCiAgICAgICAgICAgIDEpIENoYW5nZXMgd2hlbiB1c2luZyBKYXZhIFByb3h5IGNsYXNzZXMKICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgICAgICAgUHJldmlvdXNseSB3aGVuIHdyYXBwaW5nIGdsb2JhbCBmdW5jdGlvbnM6IAoKICAgICAgICAgICAgY2xhc3MgU29tZUNsYXNze307CiAgICAgICAgICAgIHZvaWQgZm9vKFNvbWVDbGFzcyogcyk7CiAgICAgICAgICAgIFNvbWVDbGFzcyogYmFyKCk7CgogICAgICAgICAgICBUaGUgbmF0aXZlIG1ldGhvZCBwcm90b3R5cGVzIHVzZWQgYSBsb25nIGZvciBwb2ludGVycyBhbmQgbG9va2VkIGxpa2UgdGhpczoKCiAgICAgICAgICAgIHB1YmxpYyBjbGFzcyBtb2R1bGVuYW1lICB7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgbmF0aXZlIHZvaWQgZm9vKGxvbmcgamFyZzEpOwogICAgICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBuYXRpdmUgbG9uZyBiYXIoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYW5kIHVubGlrZSBtZW1iZXIgZnVuY3Rpb25zIG9mIGEgQysrIGNsYXNzIHRoZXJlIHdhcyBubyB3cmFwcGVyIGFyb3VuZCB0aGUgbmF0aXZlIGNhbGxzIAogICAgICAgICAgICB0byBtYWtlIHRoZSB1c2Ugb2YgdGhlbSBtb3JlIHVzZXIgZnJpZW5kbHkuIFRoZXkgd291bGQgYmUgdXNlZCBmcm9tIEphdmEgbGlrZSB0aGlzOgoKICAgICAgICAgICAgU29tZUNsYXNzIHMgPSBuZXcgU29tZUNsYXNzKG1vZHVsZW5hbWUuYmFyKCksIGZhbHNlKTsKICAgICAgICAgICAgbW9kdWxlbmFtZS5mb28ocy5nZXRDUHRyU29tZUNsYXNzKCkpOwoKICAgICAgICAgICAgTm90ZSB0aGF0IHRoZSBmb2xsb3dpbmcgd2lsbCBoYXZlIHRoZSBzYW1lIGVmZmVjdCwgYnV0IHRoZW4gaXQgd291bGQgbm90IGhhdmUgCiAgICAgICAgICAgIGJlZW4gcG9zc2libGUgdG8gY2FsbCBhbnkgcHJveHkgbWVtYmVyIGZ1bmN0aW9ucyBpbiBTb21lQ2xhc3M6CgogICAgICAgICAgICBsb25nIHMgPSBtb2R1bGVuYW1lLmJhcigpOwogICAgICAgICAgICBtb2R1bGVuYW1lLmZvbyhzKTsKCiAgICAgICAgICAgIE5vdyB3cmFwcGVyIGZ1bmN0aW9ucyBhcmUgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgcHVibGljIGNsYXNzIG1vZHVsZW5hbWUgIHsKICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmb28oU29tZUNsYXNzIHMpIHsKICAgICAgICAgICAgICAgICAgICAvLyBjYWxscyB0aGUgbmF0aXZlIGZ1bmN0aW9uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBTb21lQ2xhc3MgYmFyKCkgewogICAgICAgICAgICAgICAgICAgIC8vIGNhbGxzIHRoZSBuYXRpdmUgZnVuY3Rpb24KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgV2hpY2ggbWVhbnMgdGhlc2UgZnVuY3Rpb25zIGNhbiBub3cgYmUgdXNlZCBtb3JlIG5hdHVyYWxseSB3aXRoIHByb3h5IGNsYXNzZXM6CgogICAgICAgICAgICBTb21lQ2xhc3MgcyA9IG1vZHVsZW5hbWUuYmFyKCk7CiAgICAgICAgICAgIG1vZHVsZW5hbWUuZm9vKHMpOwoKICAgICAgICAgICAgMikgQ2hhbmdlcyB3aGVuIG5vdCB1c2luZyBKYXZhIFByb3h5IGNsYXNzZXMKICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAgICAgICAgIFRoZSBzbyBjYWxsZWQgbG93LWxldmVsIGludGVyZmFjZSB3YXMgcmF0aGVyIGxvdy1sZXZlbCBpbmRlZWQuIFRoZSAKICAgICAgICAgICAgbmV3IHN0YXRpYyB0eXBlIGNoZWNraW5nIGltcGxlbWVudGF0aW9uIG1ha2VzIGl0IGxlc3Mgc28gYnV0IGl0IHJlbWFpbnMgYQogICAgICAgICAgICBmdW5jdGlvbmFsIGludGVyZmFjZSB0byB0aGUgQy9DKysgd29ybGQuIFByb3h5IGNsYXNzZXMgYXJlIHRoZSBvYnZpb3VzIHdheSB0byB1c2UKICAgICAgICAgICAgU1dJRyBnZW5lcmF0ZWQgY29kZSwgYnV0IGZvciB0aG9zZSB3aG8gd2FudCBhIGZ1bmN0aW9uYWwgaW50ZXJmYWNlIGFsbCBub24tcHJpbWl0aXZlCiAgICAgICAgICAgIHR5cGVzIG5vdyBoYXZlIGEgc2ltcGxlIEphdmEgY2xhc3Mgd3JhcHBlciBhcm91bmQgdGhlIEMvQysrIHR5cGUuIFBvaW50ZXJzIGFuZAogICAgICAgICAgICByZWZlcmVuY2VzIHRvIHByaW1pdGl2ZSB0eXBlcyBhcmUgYWxzbyB3cmFwcGVkIGJ5IHR5cGUgd3JhcHBlciBjbGFzc2VzLiBUaGUgdHlwZQogICAgICAgICAgICB3cmFwcGVyIGNsYXNzbmFtZXMgYXJlIGJhc2VkIG9uIHRoZSBTV0lHIGRlc2NyaXB0b3JzIHVzZWQgYnkgdGhlIG90aGVyIGxhbmd1YWdlIAogICAgICAgICAgICBtb2R1bGVzLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgIEMvQysrIHR5cGUgICAgICBKYXZhIHR5cGUgd3JhcHBlciBjbGFzcyBuYW1lCiAgICAgICAgICAgIC0tLS0tLS0tLS0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIGludCogICAgICAgICAgICBTV0lHVFlQRV9wX2ludAogICAgICAgICAgICBkb3VibGUqKiAgICAgICAgU1dJR1RZUEVfcF9wX2RvdWJsZQogICAgICAgICAgICBTb21lQ2xhc3MqICAgICAgU1dJR1RZUEVfcF9Tb21lQ2xhc3MKICAgICAgICAgICAgU29tZUNsYXNzJiAgICAgIFNXSUdUWVBFX3BfU29tZUNsYXNzCiAgICAgICAgICAgIFNvbWVDbGFzcyAgICAgICBTV0lHVFlQRV9wX1NvbWVDbGFzcwoKICAgICAgICAgICAgTm90ZSB0aGF0IGV2ZXJ5dGhpbmcgd3JhcHBlZCBieSBTV0lHIGlzIGFjY2Vzc2VkIHZpYSBhIHBvaW50ZXIgZXZlbiB3aGVuIHdyYXBwaW5nIAogICAgICAgICAgICBmdW5jdGlvbnMgdGhhdCBwYXNzIGJ5IHZhbHVlIG9yIHJlZmVyZW5jZS4gU28gdGhlIHByZXZpb3VzIGV4YW1wbGUgd291bGQgbm93IGJlIAogICAgICAgICAgICB1c2VkIGxpa2UgdGhpczoKCiAgICAgICAgICAgIFNXSUdUWVBFX3BfU29tZUNsYXNzIHMgPSBleGFtcGxlLmJhcigpOwogICAgICAgICAgICBleGFtcGxlLmZvbyhzKTsKCiAgICAgICAgICAgIE5vdGUgdGhhdCB0eXBlZGVmcyB0aGF0IFNXSUcga25vd3MgYWJvdXQgYXJlIHJlc29sdmVkLCBzbyB0aGF0IGlmIG9uZSBoYXMgCgogICAgICAgICAgICBjbGFzcyBGb297fTsKICAgICAgICAgICAgdHlwZWRlZiBGb28gQmFyOwoKICAgICAgICAgICAgdGhlbiBhbnkgdXNlIG9mIEJhciB3aWxsIHJlcXVpcmUgb25lIHRvIHVzZSBTV0lHVFlQRV9wX0ZvbzsKCiAgICAgICAgICAgIFNvbWUgY29uc2lkZXJhdGlvbnM6CiAgICAgICAgICAgIE1ha2Ugc3VyZSB5b3UgbWFrZSBhIGZpcm0gZGVjaXNpb24gdG8gdXNlIGVpdGhlciBwcm94eSBjbGFzc2VzIG9yIHRoZSBmdW5jdGlvbmFsIAogICAgICAgICAgICBpbnRlcmZhY2UgZWFybHkgb24gYXMgdGhlIGNsYXNzbmFtZXMgYXJlIGRpZmZlcmVudC4KCiAgICAgICAgICAgIDMpIFBvaW50ZXJzIGFuZCBub24tcGFyc2VkIHR5cGVzCiAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIFNvbWV0aW1lcyBTV0lHIGNhbm5vdCBnZW5lcmF0ZSBhIHByb3h5IGNsYXNzLiBUaGlzIG9jY3VycyB3aGVuIHRoZSBkZWZpbml0aW9uIG9mIAogICAgICAgICAgICBhIHR5cGUgaXMgbm90IHBhcnNlZCBieSBTV0lHLCBidXQgaXMgdGhlbiB1c2VkIGFzIGEgdmFyaWFibGUgb3IgYSBwYXJhbWV0ZXIuIAogICAgICAgICAgICBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgIHZvaWQgZm9vKFNuYXp6eSBzZHMpOwoKICAgICAgICAgICAgSWYgU1dJRyBoYXMgbm90IHBhcnNlZCBTbmF6enkgaXQgaGFuZGxlcyBpdCBzaW1wbHkgYXMgYSBwb2ludGVyIHRvIGEgU25henp5LgogICAgICAgICAgICBUaGUgSmF2YSBtb2R1bGUgZ2l2ZXMgaXQgYSB0eXBlIHdyYXBwZXIgY2xhc3MgYXJvdW5kIHRoZSBwb2ludGVyIGFuZCBjYWxscyBpdCAKICAgICAgICAgICAgU1dJR1RZUEVfcF9TbmF6enkuIEluIG90aGVyIHdvcmRzIGl0IGhhbmRsZXMgaXQgaW4gdGhlIHNhbWUgbWFubmVyIGFzIHR5cGVzIGFyZSAKICAgICAgICAgICAgaGFuZGxlZCBpbiB0aGUgbG93LWxldmVsIGZ1bmN0aW9uYWwgaW50ZXJmYWNlLiBUaGlzIGFwcHJvYWNoIGlzIHVzZWQgZm9yIGFsbCAKICAgICAgICAgICAgbm9uLXByb3h5IGNsYXNzZXMsIGVnIGFsbCBwb2ludGVyIHRvIHBvaW50ZXJzIGFuZCBwb2ludGVycyB0byBwcmltaXRpdmUgdHlwZXMuCgogICAgICAgICAgICA0KSBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eQogICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpcyBub3QgYW4gaXNzdWUgaWYgeW91IGhhdmUgYmVlbiB1c2luZyBwcm94eSBjbGFzc2VzIGFuZCAKICAgICAgICAgICAgbm8gZ2xvYmFsIHZhcmlhYmxlcy9mdW5jdGlvbnMuIE90aGVyd2lzZSBzb21lIGNoYW5nZXMgd2lsbCBoYXZlIHRvIGJlIG1hZGUuIAogICAgICAgICAgICBUaGUgbmF0aXZlIG1ldGhvZHMgc3RpbGwgZXhpc3QgYnV0IHRoZXkgYXJlIG5vdyBpbiBhIEpOSSBjbGFzcywgd2hpY2ggaXMgY2FsbGVkIAogICAgICAgICAgICBtb2R1bGVuYW1lSk5JLiBBcyB0aGlzIGNsYXNzIGlzIHJlYWxseSBwYXJ0IG9mIHRoZSBpbnRlcm5hbCB3b3JraW5ncywKICAgICAgICAgICAgaXQgc2hvdWxkIG5vdCBiZSByZXF1aXJlZCBzbyB0aGUgY2xhc3MgaGFzIGJlY29tZSBwcm90ZWN0ZWQuIFNvbWUgcHJhZ21hcy9kaXJlY3RpdmVzCiAgICAgICAgICAgIHdpbGwgaG9wZWZ1bGx5IGJlIGFkZGVkIHRvIGhlbHAgd2l0aCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA3LzE4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTW9kaWZpZWQgd3JhcHBpbmcgb2YgdW5pbnN0YW50aWF0ZWQgdGVtcGxhdGVzIHJldHVybmVkIGJ5CiAgICAgICAgICAgIHZhbHVlLiAgSnVzdCB0byBiZSBzYWZlLCB0aGV5IGFyZSBub3cgd3JhcHBlZCBieSBTd2lnVmFsdWVXcmFwcGVyPD4KICAgICAgICAgICAganVzdCBpbiBjYXNlIHRoZXkgZG9uJ3QgZGVmaW5lIGEgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gIFRoaXMKICAgICAgICAgICAgd291bGQgYmUgdXNlZCBpZiB5b3UgaGFkIGNvZGUgbGlrZSB0aGlzCgogICAgICAgICAgICAgICAgIEZvbzxpbnQ+IGJsYWgoKTsKICAgICAgICAgICAgICAgICB2b2lkICAgICBtb3JlYmxhaChGb288aW50PiB4KTsKCiAgICAgICAgICAgIGJ1dCB5b3UgZGlkbid0IGluc3RhbnRpYXRlIEZvbzxpbnQ+IHVzaW5nICV0ZW1wbGF0ZS4gIAogICAgICAgICAgICBXZSBzaG91bGQgcHJvYmFibHkgYWRkIGEgd2FybmluZyBmb3IgdGhpcy4KCjA3LzE3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgYW4gZXJyb3IgY2hlY2sgdG8gZGV0ZWN0IHNoYWRvd2VkIHRlbXBsYXRlIHBhcmFtYXRlcnMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgICBpbnQgVDsKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoaXMgcmVzdWx0cyBpbiBhbiBlcnJvciwgbm90IGEgd2FybmluZy4gIFRoaXMgd2FybmluZyBpcwogICAgICAgICAgICBhbHNvIG5lZWRlZCB0byBmaXggc29tZSByYXRoZXIgaW5zaWRpb3VzIHByb2JsZW1zIGxpa2UKICAgICAgICAgICAgdGhpczoKCiAgICAgICAgICAgICAgICAgc3RydWN0IFQgewogICAgICAgICAgICAgICAgICAgICAgaW50ICBibGFoOwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiBUIFRyYWl0czsgICAgLy8gV2hpY2ggVCBpcyB0aGlzPz8/PwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgVCBzaGFkb3dzIHRoZSBvdXRlcgogICAgICAgICAgICBzdHJ1Y3R1cmUgKHdoaWNoIGlzIHdoYXQgeW91IHdhbnQpLgoKMDcvMTYvMjAwMjogYmVhemxleQogICAgICAgICAgICBJbXByb3ZlZCBzdXBwb3J0IGZvciB0ZW1wbGF0ZXMgd2l0aCBpbnRlZ2VyIGFyZ3VtZW50cy4gIFNXSUcgaXMKICAgICAgICAgICAgbXVjaCBtb3JlIGF3YXJlIG9mIHNpdHVhdGlvbnMgc3VjaCBhcyB0aGlzOgoKICAgICAgICAgICAgICAgIGNvbnN0IGludCBTaXplID0gMTAwOwoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShGb28xMDApIEZvbzwxMDA+OwogICAgICAgICAgICAgICAgdm9pZCBiYXIoRm9vPFNpemU+ICp4KTsgICAvLyBLbm93cyB0aGF0IEZvbzxTaXplPiBpcyB0aGUgc2FtZSBhcyBGb288MTAwPjsKCjA3LzE1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYnVnIHdpdGggJWZlYXR1cmUvJWlnbm9yZS8lcmVuYW1lIGFuZCBuYW1lc3BhY2VzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlaWdub3JlIEZvbzo6QmFyCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgRm9vIHsKICAgICAgICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDcvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCBwYXJzaW5nIHN1cHBvcnQgZm9yIGNvbnN0cnVjdG9ycyB0aGF0IHRyeSB0byBjYXRjaAogICAgICAgICAgICBleGNlcHRpb25zIGluIGluaXRpYWxpemVycy4gICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBCYXIgYjsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgRm9vKGludCB4KSB0cnkgCiAgICAgICAgICAgICAgICAgICAgIDogYih4KSB7IC4uLiB9CiAgICAgICAgICAgICAgICAgY2F0Y2goaW50KSB7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGlzIGhhcyBubyBlZmZlY3Qgb24gdGhlIGdlbmVyYXRlZCB3cmFwcGVycy4gIEhvd2V2ZXIsIHRoZSB0cnkgYW5kIGNhdGNoCiAgICAgICAgICAgIHBhcnRzIG9mIHRoZSBkZWNsYXJhdGlvbiBhcmUgaWdub3JlZC4gIFNlZSBTdHJvdXN0cnVwLCAzcmQgRWQsIHNlY3Rpb24gCiAgICAgICAgICAgIDE0LjQuNi4xIGZvciBkZXRhaWxzLgogICAgICAgICAgICAgICAgICAgCjA3LzA2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYnVnIGluIHRlbXBsYXRlIHN5bWJvbCB0YWJsZSBtYW5hZ2VtZW50LiAgVGhpcyBmaXhlcwogICAgICAgICAgICB0d28gYnVncy4gIEZpcnN0LCBtaXhpbmcgYWJzdHJhY3QgbWV0aG9kcywgdGVtcGxhdGVzLCBhbmQgCiAgICAgICAgICAgIGluaGVyaXRhbmNlIG5vIGxvbmdlciBnZW5lcmF0ZXMgYSBmYWlsZWQgYXNzZXJ0aW9uLgogCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KICAgICAgICAgICAgICAgIGNsYXNzIEEgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGZvbygpID0gMDsKICAgICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+CiAgICAgICAgICAgICAgIGNsYXNzIEIgOiBwdWJsaWMgQTxUPgogICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICV0ZW1wbGF0ZShBX2ludCkgQTxpbnQ+OwogICAgICAgICAgICAgICAldGVtcGxhdGUoQl9pbnQpIEI8aW50PjsKCiAgICAgICAgICAgIFRoaXMgZml4IGFsc28gZml4ZXMgYSBzdWJ0bGUgcHJvYmxlbSB3aXRoIGRlZmF1bHQgdmFsdWVzIGFuZAogICAgICAgICAgICB0ZW1wbGF0ZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBDPgogICAgICAgICAgICAgICBzdHJ1Y3QgQiB7CiAgICAgICAgICAgICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIGludCBzaXplX3R5cGU7CiAgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90eXBlIG5pbmRleCA9IHN0YXRpY19jYXN0PHNpemVfdHlwZT4oLTEpOwogICAgICAgICAgICAgICAgICAgdm9pZCBmb28oc2l6ZV90eXBlIGluZGV4ID0gbmluZGV4KTsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEJ1Z3MgcmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCgowNy8wNS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQ2hhbmdlZCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgU1dJR19Db252ZXJ0UHRyKCkgZnVuY3Rpb24KCSAgICBmb3IgdGhlIFNXSUcvUnVieSBydW50aW1lIHN1cHBvcnQgc28gdGhhdCBpdCBsb29rcyBsaWtlIHRoZQoJICAgIFB5dGhvbiB2ZXJzaW9uLiBJZiB0aGUgbGFzdCBhcmd1bWVudCAoZmxhZ3MpIGlzIG5vbi16ZXJvLAoJICAgIFNXSUdfQ29udmVydFB0cigpIHdpbGwgcmFpc2UgYW4gZXhjZXB0aW9uIGZvciB0eXBlIG1pc21hdGNoZXMKCSAgICBhcyBiZWZvcmUuIElmIGZsYWdzIGlzIHplcm8sIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gLTEgZm9yCgkgICAgdHlwZSBtaXNtYXRjaGVzIHdpdGhvdXQgcmFpc2luZyBhbiBleGNlcHRpb24uIAoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIFJVQlkgTU9EVUxFICoqKgoKMDcvMDQvMjAwMjogYmVhemxleQogICAgICAgICAgICBPdmVybG9hZGVkIGZ1bmN0aW9ucy9tZXRob2RzL2NvbnN0cnVjdG9ycyBub3cgd29yayBpbiBtYW55IGxhbmd1YWdlCiAgICAgICAgICAgIG1vZHVsZXMuICBUaGUgc3VwcG9ydCBpcyBjb21wbGV0ZWx5IHRyYW5zcGFyZW50LS1qdXN0IGNhbGwgdGhlCiAgICAgICAgICAgIGZ1bmN0aW9uIG5vcm1hbGx5IGFuZCBTV0lHIHdpbGwgZGlzcGF0Y2ggdG8gdGhlIGNvcnJlY3QgaW1wbGVtZW50YXRpb24uCiAgICAgICAgICAgIFRoZXJlIGFyZSBhIHZhcmlldHkgb2YgaXNzdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzLiAgUGxlYXNlIHJlZmVyCiAgICAgICAgICAgIHRvIHRoZSBvdmVybG9hZGluZyBzZWN0aW9uIG9mIERvYy9NYW51YWwvU1dJR1BsdXMuaHRtbCBmb3IgZGV0YWlscy4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgICAKMDcvMDQvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIGJ1ZyB3aXRoIG5hbWVzcGFjZXMsIGVudW1zLCBhbmQgdGVtcGxhdGVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBuYW1lc3BhY2UgaGVsbG8gewogICAgICAgICAgICAgICAgICBlbnVtIEhlbGxvIHsgSGksIEhvbGEgfTsKIAogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8SGVsbG8gSD4KICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0cmFpdHMKICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlZGVmIGRvdWJsZSB2YWx1ZV90eXBlOwogICAgICAgICAgICAgICAgICAgICAgfTsKIAogICAgICAgICAgICAgICAgIHRyYWl0czxIaT46OnZhbHVlX3R5cGUgc2F5X2hpKCkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyYWl0czxIaT46OnZhbHVlX3R5cGUoMSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIFNXSUcgd2Fzbid0IGdlbmVyYXRpbmcgd3JhcHBlcnMgdGhhdCBwcm9wZXJseSBxdWFsaWZpZWQgCiAgICAgICAgICAgIHRyYWl0czxIaT4uICBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLiAgICAgICAgIAoKMDYvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBTdXBwbGllZCBhcnJheSB2YXJpYWJsZSB0eXBlbWFwcyBmb3IgVGNsIG1vZHVsZS4gICBJZiB5b3UgaGF2ZSBhCiAgICAgICAgICAgIHZhcmlhYmxlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBpbnQgZm9vWzEwXTsKCiAgICAgICAgICAgIHRoZW4gYSBzZXQgZnVuY3Rpb24gbGlrZSB0aGlzIGlzIGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgICB2b2lkIGZvb19zZXQoaW50ICp4KSB7CiAgICAgICAgICAgICAgICAgICBtZW1tb3ZlKGZvbyx4LDEwKnNpemVvZihpbnQpKTsKICAgICAgICAgICAgICAgIH0KCjA2LzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3ICVmcmFnbWVudCBkaXJlY3RpdmUuICAgV2hlbiB3cml0aW5nIHR5cGVtYXBzLCBpdCBjYW4gYmUgZWFzeSB0bwogICAgICAgICAgICBnZXQgY2FycmllZCBhd2F5IGFuZCB3cml0ZSBhIGxvdCBvZiBjb2RlLiAgSG93ZXZlciwgZG9pbmcgc28gY2F1c2VzCiAgICAgICAgICAgIHRyZW1lbmRvdXMgY29kZSBibG9hdC4gICBBIGNvbW1vbiB3YXkgdG8gc29sdmUgdGhpcyBpcyB0byB3cml0ZSAKICAgICAgICAgICAgaGVscGVyIGZ1bmN0aW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgICB2b2lkIHNvbWVfaGVscGVyX2Z1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICV9CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHR5cGUgewogICAgICAgICAgICAgICAgICAgc29tZV9oZWxwZXJfZnVuY3Rpb24oLi4uKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoZSBvbmx5IHByb2JsZW0gd2l0aCB0aGlzIGlzIHRoYXQgdGhlIHdyYXBwZXIgZmlsZSBnZXRzIHBvbGx1dGVkCiAgICAgICAgICAgIHdpdGggaGVscGVyIGZ1bmN0aW9ucyBldmVuIGlmIHRoZXkgYXJlbid0IHVzZWQuICAgIFRvIGZpeCB0aGlzLAogICAgICAgICAgICBhIG5ldyBmcmFnbWVudCBkaXJlY3RpdmUgaXMgYXZhaWxhYmxlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAoY29ycmVjdGVkIHR5cG8gaW4gbGluZSBiZWxvdyAtIDA2LzI2LzIwMDgpCiAgICAgICAgICAgICAgICVmcmFnbWVudCgidHlwZV9oZWFkZXIiLCJoZWFkZXIiKSAlewogICAgICAgICAgICAgICAgICB2b2lkIHNvbWVfaGVscGVyX2Z1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICAgICV0eXBlbWFwKGluLCBmcmFnbWVudD0idHlwZV9oZWFkZXIiKSB0eXBlIHsKICAgICAgICAgICAgICAgICAgIHNvbWVfaGVscGVyX2Z1bmN0aW9uKC4uLik7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIGNvZGUgZnJhZ21lbnQgaXMgb25seSBlbWl0dGVkIGlmIHRoZSB0eXBlbWFwIGlzCiAgICAgICAgICAgIGFjdHVhbGx5IHVzZWQuICAgQSBzaW1pbGFyIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgZm9yIGRlY2xhcmF0aW9uCiAgICAgICAgICAgIGFubm90YXRpb24gYW5kIHRoZSAlZmVhdHVyZSBkaXJlY3RpdmUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICVmZWF0dXJlKCJmcmFnbWVudCIsInR5cGVfaGVhZGVyIikgIFNvbWVEZWNsYXJhdGlvbjsKCiAgICAgICAgICAgIFRoZSBmaXJzdCBhcmd1bWVudCB0byAlZnJhZ21lbnQgaXMgdGhlIGZyYWdtZW50IG5hbWUuICBUaGUgc2Vjb25kIGFyZ3VtZW50CiAgICAgICAgICAgIGlzIHRoZSBmaWxlIHNlY3Rpb24gd2hlcmUgdGhlIGZyYWdtZW50IHNob3VsZCBiZSBlbWl0dGVkLiAgCgogICAgICAgICAgICBUaGUgcHJpbWFyeSB1c2Ugb2YgdGhpcyBkaXJlY3RpdmUgaXMgZm9yIHdyaXRlcnMgb2YgbGFuZ3VhZ2UgbW9kdWxlcwogICAgICAgICAgICBhbmQgYWR2YW5jZWQgdXNlcnMgd2FudGluZyB0byBzdHJlYW1saW5lIHR5cGVtYXAgY29kZS4KCiAgICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgTkVXIEZFQVRVUkUgKioqCgowNi8zMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFN1cHBsaWVkIG1lbWJlcmluIHR5cGVtYXBzIGZvciBhbGwgYXJyYXlzIGluIGFuIGF0dGVtcHQgdG8gZWxpbWluYXRlCiAgICAgICAgICAgIGNvbmZ1c2lvbiBhYm91dCB0aGVpciB1c2UuCgowNi8yOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciBzbWFydC1wb2ludGVycy4gIFdoZW4gYSBjbGFzcyBkZWZpbmVzCiAgICAgICAgICAgIG9wZXJhdG9yLT4oKSBsaWtlIHRoaXMKCiAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBCYXIgKm9wZXJhdG9yLT4oKTsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBTV0lHIGxvY2F0ZXMgY2xhc3MgQmFyIGFuZCB0cmllcyB0byB3cmFwIGl0cyBtZW1iZXIgdmFyaWFibGVzIGFuZAogICAgICAgICAgICBtZXRob2RzIGFzIHBhcnQgb2YgRm9vLiAgRm9yIGV4YW1wbGUsIGlmIEJhciB3YXMgZGVmaW5lZCBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICAgICAgICAgaW50IHNwYW0oKTsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFlvdSBjb3VsZCBkbyB0aGlzIChpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlKToKCiAgICAgICAgICAgICAgZiA9IEZvbygpCiAgICAgICAgICAgICAgZi54ID0gNCAgICAgICAgICAgICMgQWNjZXNzZXMgQmFyOjp4CiAgICAgICAgICAgICAgZi5zcGFtKCkgICAgICAgICAgICMgQWNjZXNzZXMgQmFyOjpzcGFtCgogICAgICAgICAgICBUaGUgcHJpbWFyeSB1c2Ugb2YgdGhpcyBmZWF0dXJlIGlzIHRvIGVtdWxhdGUgdGhlIGJlaGF2aW9yIG9mIEMrKwogICAgICAgICAgICBzbWFydC1wb2ludGVycy0tLXdoaWNoIGFsbG93IGF0dHJpYnV0ZXMgdG8gYWNjZXNzZWQgdHJhbnNwYXJlbnRseQogICAgICAgICAgICB0aHJvdWdoIG9wZXJhdG9yLT4uCgogICAgICAgICAgICBUaGlzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGF1dG9tYXRpY2FsbHkgaW4gU1dJRy0tLW5vIHNwZWNpYWwgZGlyZWN0aXZlcwogICAgICAgICAgICBhcmUgbmVlZGVkLiAgIFRvIGRpc2FibGUgdGhpcyBiZWhhdmlvci4gIFVzZSAlaWdub3JlIHRvIGlnbm9yZSAKICAgICAgICAgICAgb3BlcmF0b3ItPi4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDYvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICBEZXByZWNhdGVkIHRoZSAlZXhjZXB0IGRpcmVjdGl2ZS4gICAlZXhjZXB0aW9uIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCgowNi8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1ham9yIGNsZWFudXAgb2YgdGhlIG1vZHVsZXMgZGlyZWN0b3J5LiAgRWxpbWluYXRlZCBtb3N0CiAgICAgICAgICAgIGhlYWRlciBmaWxlcywgY29uc29saWRhdGVkIG1vZHVsZSBjb2RlIGludG8gc2luZ2xlIGZpbGVzLgoKMDYvMjQvMjAwMjogYmVhemxleQogICAgICAgICAgICBSZXdvcmtlZCB0aGUgaW5zdGFudGlhdGlvbiBvZiBsYW5ndWFnZSBtb2R1bGVzLiAgQWxsIGxhbmd1YWdlCiAgICAgICAgICAgIG1vZHVsZXMgbXVzdCBub3cgZGVmaW5lIGEgZmFjdG9yeSBmdW5jdGlvbiBzaW1pbGFyIHRvIHRoaXM6CgogICAgICAgICAgICAgICAgZXh0ZXJuICJDIiBMYW5ndWFnZSAqCiAgICAgICAgICAgICAgICBzd2lnX3B5dGhvbih2b2lkKSB7CiAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBZVEhPTigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyB0aGVuIHBsYWNlZCBpbiBhIHRhYmxlIGFuZCBhc3NvY2lhdGVkIHdpdGgKICAgICAgICAgICAgYSBjb21tYW5kIGxpbmUgb3B0aW9uIGluIHN3aWdtYWluLmN4eC4gIAoKICAgICAgICAgICAgVGhpcyBhcHByb2FjaCBoYXMgYSBudW1iZXIgb2YgYmVuZWZpdHMuICBJdCBkZWNvdXBsZXMgdGhlIAogICAgICAgICAgICBTV0lHIG1haW4gcHJvZ3JhbSBmcm9tIGhhdmluZyB0byBrbm93IGFib3V0IHRoZSBjbGFzcwogICAgICAgICAgICBkZWZpbml0aW9ucyBmb3IgZWFjaCBtb2R1bGUuICBBbHNvLCBieSB1c2luZyBhIGZhY3RvcnkKICAgICAgICAgICAgZnVuY3Rpb24sIGl0IHdpbGwgYmUgZWFzaWVyIHRvIGltcGxlbWVudCBkeW5hbWljIGxvYWRpbmcKICAgICAgICAgICAgb2YgbW9kdWxlcyAoc2ltcGx5IGxvYWQgdGhlIGZpbGUgYW5kIGludm9rZSB0aGUgZmFjdG9yeQogICAgICAgICAgICBmdW5jdGlvbikuCgowNi8yNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN5bnRheCBlcnJvciBmb3IgcmVmZXJlbmNlIGNvbnZlcnNpb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciBGb28gJigpOwoKMDYvMjQvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzeW50YXggZXJyb3IgZm9yIG9wZXJhdG9yIG5ld1tdIGFuZCBvcGVyYXRvciBkZWxldGVbXS4KCjA2LzI0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgY29kZSBnZW5lcmF0aW9uIHByb2JsZW0gZm9yIGNvbnN0YW50cyBhbmQgZGVmYXVsdCBhcmd1bWVudHMKICAgICAgICAgICAgaW52b2x2aW5nIHRlbXBsYXRlcy4KCjA2LzE5LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBGaXhlZCBhIGJ1ZyBmb3IgdGhlICctZmVhdHVyZScgY29tbWFuZCBsaW5lIGFyZ3VtZW50OwogICAgICAgICAgICB0aGF0IHNldHRpbmcgd2FzIGVmZmVjdGl2ZWx5IGJlaW5nIGlnbm9yZWQgYW5kIHNvIHRoZSBmZWF0dXJlCiAgICAgICAgICAgIG5hbWUgd2FzIGFsd2F5cyBzZXQgZXF1YWwgdG8gdGhlIG1vZHVsZSBuYW1lLgoKMDYvMTcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtcyB3aXRoIHN0YXRpYyBtZW1iZXJzIGFuZCBlbnVtcyBpbiB0ZW1wbGF0ZXMuCgpWZXJzaW9uIDEuMy4xMyAoSnVuZSAxNywgMjAwMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowNi8xNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgYnVnIHdpdGggX19GSUxFX18gZXhwYW5zaW9uIGluIHRoZSBwcmVwcm9jZXNzb3IuICAgT24gV2luZG93cywKICAgICAgICAgICAgdGhlIGJhY2tzbGFzaCAoXCkgaXMgbm93IGNvbnZlcnRlZCB0byAoXFwpIGluIHRoZSBzdHJpbmcgbGl0ZXJhbAogICAgICAgICAgICB1c2VkIGZvciBfX0ZJTEVfXy4gIFJlcG9ydGVkIGJ5IFN0ZXZlIEdsYXNlci4KCjA2LzE0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgd2FybmluZyBtZXNzYWdlIGFib3V0ICduYW1lIHByaXZhdGUgaW4gdGhpcyBjb250ZXh0Jy4gIFRoZQogICAgICAgICAgICB3YXJuaW5nIGlzIG9ubHkgZ2VuZXJhdGVkIGZvciBwdWJsaWMgbWV0aG9kcy4gIFJlcG9ydGVkIGJ5CiAgICAgICAgICAgIFNjb3R0IE1pY2hlbC4KIAowNi8xNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHNvbWUgcHJvYmxlbXMgcmVsYXRlZCB0byB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIAogICAgICAgICAgICBhbmQgbmFtZXNwYWNlcy4gICBXaGVuIFNXSUcgZXhwYW5kcyBhIHRlbXBsYXRlLCBpdCBkb2VzCiAgICAgICAgICAgIHNvIHdpdGggZnVsbHkgcmVzb2x2ZWQgdHlwZXMuICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdGhpczoKCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBmb28geyB9OwogICAgICAgICAgICAgICAgdHlwZWRlZiBkb3VibGUgRG91YmxlOwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKGZvb19kKSBmb288RG91YmxlPjsKCiAgICAgICAgICAgIHRoZW4sIGl0IGlzIGhhbmRsZWQgYXMgZm9vPGRvdWJsZT4gaW4gdGhlIHR5cGVzeXN0ZW0uCiAgICAgICAgICAgIFRoaXMgZml4ZXMgYSBudW1iZXIgb2Ygc3VidGxlIHByb2JsZW1zIHdpdGggaW5oZXJpdGFuY2UKICAgICAgICAgICAgYW5kIHRlbXBsYXRlcy4KCjA2LzE0LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBtaXNzaW5nIGJvb2wgdHlwZW1hcHMgZm9yIElOUFVULCBPVVRQVVQgYW5kCgkgICAgSU5PVVQgaW4gTGliL3J1YnkvdHlwZW1hcHMuaS4KCjA1LzI5LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4IGZvciBhIGNvdXBsZSBvZiBicm9rZW4gcHJhZ21hcy4KCjA1LzI5LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXggZm9yIHVubmVjZXNzYXJ5IGNhc3Qgd2hlbiB3cmFwcGluZyBnbG9iYWwgdmFyaWFibGUgd2hlcmUgCiAgICAgICAgICAgIHRoZSB0eXBlIGlzIG5vdCBwYXJzZWQgYnkgU1dJRyAtIEphdmEgdmFyaWFibGVzIGV4YW1wbGUgCiAgICAgICAgICAgIGZhaWx1cmUgYXMgcmVwb3J0ZWQgYnkgTGFycnkgVmlyZGVuLgoKMDYvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBNb2RpZmllZCAldGVtcGxhdGUgdG8gYWxsb3cgZm9yIGVtcHR5IGluc3RhbnRpYXRpb25zLgoKICAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKCkgZm9vPGludCxpbnQ+OwoKICAgICAgICAgICAgVGhpcyByZWdpc3RlcnMgZm9vPGludCxpbnQ+IHdpdGggdGhlIHR5cGUgc3lzdGVtLCBidXQKICAgICAgICAgICAgZG9lc24ndCB3cmFwIGl0IChzYW1lIGFzICVpZ25vcmUpLiAgIFRoaXMgbWF5IG9ubHkgYmUgYQogICAgICAgICAgICB0ZW1wb3JhcnkgbWVhc3VyZS4gICBTV0lHIG1pZ2h0IGJlIGFibGUgdG8gYXV0b21hdGljYWxseQogICAgICAgICAgICBpbnN0YW50aWF0ZSB0ZW1wbGF0ZXMgaW4gY2VydGFpbiBjYXNlcy4KCjA2LzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgZnVuY3Rpb24gcHJvdG90eXBlIHByb2JsZW1zIHdpdGggVGNsIDguNAoKMDYvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggdGVtcGxhdGVzIGFuZCBsb2NhdGlvbiBvZiBiYXNlIGNsYXNzZXMuICAKICAgICAgICAgICAgVGhpcyBvbmUgaXMgYSBsaXR0bGUgbWluZC1iZW5kaW5nLCBidXQgaGVyZSBpcyBhbiBleGFtcGxlCiAgICAgICAgICAgIHRoYXQgaWxsdXN0cmF0ZXM6CiAKICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBBcmdUeXBlLCBjbGFzcyBSZXNUeXBlPgogICAgICAgICAgICAgc3RydWN0IHRyYWl0cwogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICB0eXBlZGVmIEFyZ1R5cGUgYXJnX3R5cGU7CiAgICAgICAgICAgICAgICAgIHR5cGVkZWYgUmVzVHlwZSByZXNfdHlwZTsKICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBBcmdUeXBlLCBjbGFzcyBSZXNUeXBlPgogICAgICAgICAgICAgc3RydWN0IEZ1bmN0aW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9OwogCiAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgQUYsIGNsYXNzIEFHPgogICAgICAgICAgICAgc3RydWN0IENsYXNzIDogRnVuY3Rpb248dHlwZW5hbWUgdHJhaXRzPEFGLCBBRz46OmFyZ190eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgdHJhaXRzPEFGLCBBRz46OnJlc190eXBlPgogICAgICAgICAgICAgewogICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAldGVtcGxhdGUodHJhaXRzX2RkKSB0cmFpdHMgPGRvdWJsZSwgZG91YmxlPjsKICAgICAgICAgICAgICV0ZW1wbGF0ZShGdW5jdGlvbl9kZCkgRnVuY3Rpb24gPGRvdWJsZSwgZG91YmxlPjsKICAgICAgICAgICAgICV0ZW1wbGF0ZShDbGFzc19kZCkgQ2xhc3MgPGRvdWJsZSwgZG91YmxlPjsKCgogICAgICAgICAgICBJbiB0aGlzIGV4YW1wbGUsIHRoZSBiYXNlIGNsYXNzIG9mICdDbGFzcycgaXMgZGV0ZXJtaW5lZCBmcm9tCiAgICAgICAgICAgIHRoZSBGdW5jdGlvbiB0ZW1wbGF0ZSwgYnV0IHRoZSB0eXBlcyBhcmUgb2J0YWluZWQgdGhyb3VnaCB0eXBlZGVmcy4KICAgICAgICAgICAgQmVjYXVzZSBvZiB0aGlzLCBTV0lHIGNvdWxkIG5vdCBsb2NhdGUgdGhlIHdyYXBwZWQgYmFzZSBjbGFzcwogICAgICAgICAgICAoRnVuY3Rpb248ZG91YmxlLGRvdWJsZT4pLiAgIFNob3VsZCBiZSBmaXhlZCBpbiAxLjMuMTMgZXZlbgogICAgICAgICAgICB0aG91Z2ggSSBjYW4gdGhpbmsgb2YgYSBtaWxsaW9uIG90aGVyIHRoaW5ncyB0aGF0IG1pZ2h0CiAgICAgICAgICAgIGFsc28gYmUgYnJva2VuLgoKMDYvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHByb2JsZW0gd2l0aCBjb252ZXJzaW9uIG9wZXJhdG9ycy4gIElmIHlvdSBoYWQgYW4KICAgICAgICAgICAgb3BlcmF0b3IgbGlrZSB0aGlzLAoKICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgZG91YmxlKCkgY29uc3Q7CgogICAgICAgICAgICBTV0lHIHdhcyBvbW1pdHRpbmcgdGhlICJjb25zdCIgcXVhbGlmaWVyLiAgVGhpcyBhZmZlY3RlZAogICAgICAgICAgICAlcmVuYW1lIGFuZCBvdGhlciBkaXJlY3RpdmVzLiAgUmVwb3J0ZWQgYnkgWmhvbmcgUmVuLgoKMDYvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBMZXNzZW5lZCB0aGUgc3RyaWN0bmVzcyBvZiBhYnN0cmFjdCBjbGFzcyBjaGVja2luZy4gIElmCiAgICAgICAgICAgIHlvdSBoYXZlIGNvZGUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBtZXRob2QoKSA9IDA7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGNsYXNzIEJhciA6IHB1YmxpYyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIEJhcigpOwogICAgICAgICAgICAgICAgICAgfkJhcigpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICBTV0lHIHdpbGwgZ28gYWhlYWQgYW5kIGdlbmVyYXRlIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3JzCiAgICAgICAgICAgICBmb3IgQmFyLiAgSG93ZXZlciwgaXQgd2lsbCBhbHNvIGdlbmVyYXRlIGEgd2FybmluZyBtZXNzYWdlIAogICAgICAgICAgICAgdGhhdCAiQmFyIiBtaWdodCBiZSBhYnN0cmFjdCAoc2luY2UgbWV0aG9kKCkgaXNuJ3QgZGVmaW5lZCkuCiAgICAgICAgICAgICBJbiBTV0lHLTEuMy4xMiwgU1dJRyByZWZ1c2VkIHRvIGdlbmVyYXRlIGEgY29uc3RydWN0b3IgYXQgYWxsLgoKMDYvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBDaGFuZ2UgdG8gJXRlbXBsYXRlIGRpcmVjdGl2ZS4gIElmIHlvdSBzcGVjaWZ5IHNvbWV0aGluZyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZpKSBzdGQ6OnZlY3RvcjxpbnQ+OwoKICAgICAgICAgICAgSXQgaXMgKmV4YWN0bHkqIHRoZSBzYW1lIGFzIHRoaXM6CiAKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBzdGQgewogICAgICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2aSkgdmVjdG9yPGludD47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBTV0lHLTEuMy4xMiB0cmllZCB0byBpbnN0YW50aWF0ZSB0aGUgdGVtcGxhdGUgb3V0c2lkZSBvZiB0aGUgbmFtZXNwYWNlCiAgICAgICAgICAgIHVzaW5nIHNvbWUgdHJpY2suICBIb3dldmVyLCB0aGlzIHdhcyBleHRyZW1lbHkgcHJvYmxlbWF0aWMgYW5kIGZ1bGwKICAgICAgICAgICAgaG9sZXMuICAgVGhpcyB2ZXJzaW9uIGlzIHNhZmVyLgoKMDYvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBidWcgd2l0aCBzY29wZSBxdWFsaWZpY2F0aW9uIGFuZCB0ZW1wbGF0ZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgQTxCOjpDPjo6REQKCiAgICAgICAgICAgIEJlZm9yZSwgdGhpcyB3YXMgc2VwYXJhdGVkIGFzIHNjb3BlcyBBPEIsIEM+LCBhbmQgREQuICBGaXhlZCBub3cuCgowNi8wNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFsbG93IHRoZSBmb2xsb3dpbmcgc3ludGF4OiAKICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIGNsYXNzIEEgeyB9OwogICAgICAgICAgICAgICBzdHJ1Y3QgQiA6IEEgeyAuLi4gfTsKCiAgICAgICAgICAgIEEgYmFzZSBjbGFzcyB3aXRob3V0IGEgc3BlY2lmaWVyIGlzIGFzc3VtZWQgdG8gYmUgcHVibGljIGZvciBhIHN0cnVjdC4KIAowNi8wNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN5bnRheCBlcnJvciB3aXRoIHRlbXBsYXRlIGNvbnN0cnVjdG9yIGluaXRpYWxpemVycy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjA2LzA2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYnVnIHdpdGggZGVmYXVsdCB0ZW1wbGF0ZSBhcmd1bWVudHMuIAogICAgICAgICAgICBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDYvMDUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzdWJ0bGUgcHJvYmxlbXMgd2l0aCAlcmVuYW1lIGRpcmVjdGl2ZSBhbmQgdGVtcGxhdGUKICAgICAgICAgICAgZXhwYW5zaW9uLgoKICAgICAgICAgICAgQ29kZSBsaWtlIHRoaXMgc2hvdWxkIG5vdyB3b3JrOgoKICAgICAgICAgICAgICAgJXJlbmFtZShibGFoKSBmb288ZG91YmxlPjo6bWV0aG9kOwogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgZm9vIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgdm9pZCBtZXRob2QoKTsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh3aGF0ZXZlcikgZm9vPGRvdWJsZT47CgowNi8wNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFJlc29sdmVkIHNvbWUgdHJpY2t5IGlzc3VlcyBvZiBtdWx0aS1wYXNzIGNvbXBpbGF0aW9uIGFuZCAKICAgICAgICAgICAgYW5kIGluaGVyaXRhbmNlLiAgVGhlIGZvbGxvd2luZyBzaXR1YXRpb24gbm93IGdlbmVyYXRlcwogICAgICAgICAgICBhbiBlcnJvcjoKCiAgICAgICAgICAgICAgICAgIGNsYXNzIEZvbyA6IHB1YmxpYyBCYXIgewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBjb2RlIGdlbmVyYXRlcyBhIHdhcm5pbmcgYWJvdXQgaW5jb21wbGV0ZSBjbGFzc2VzLgoKICAgICAgICAgICAgICAgICAgY2xhc3MgQmFyOwogICAgICAgICAgICAgICAgICBjbGFzcyBGb28gOiBwdWJsaWMgQmFyIHsgfTsKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgY29kZSBnZW5lcmF0ZXMgYSB3YXJuaW5nIGFib3V0IGFuIHVuZGVmaW5lZCBjbGFzcy4KCiAgICAgICAgICAgICAgICAgIGNsYXNzIEZvbyA6IHB1YmxpYyBCYXIgeyB9OyAgLy8gQmFyIHVuZGVmaW5lZAoKICAgICAgICAgICAgVGhpcyBmaXhlcyBhIGZhaWxlZCBhc3NlcnRpb24gYnVnIHJlcG9ydGVkIGJ5IEphc29uIFN0ZXdhcnQuCgowNi8wNS8yMDAyOiBsam9obnNvbgogICAgICAgICAgICBbUnVieV0gQWRkZWQgYSB3YXJuaW5nIG1lc3NhZ2UgZm9yIHRoZSBSdWJ5IG1vZHVsZSBhYm91dCB0aGUgbGFjawogICAgICAgICAgICBvZiBzdXBwb3J0IGZvciBtdWx0aXBsZSBpbmhlcml0YW5jZS4gT25seSB0aGUgZmlyc3QgYmFzZSBjbGFzcwogICAgICAgICAgICBsaXN0ZWQgaXMgdXNlZCBhbmQgdGhlIG90aGVycyBhcmUgaWdub3JlZC4gKFJlcG9ydGVkIGJ5IENyYWlnCiAgICAgICAgICAgIEZpbGVzKS4KICAgICAgICAgICAgCjA2LzAzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBidWcgd2l0aCBzdHJ1Y3QgZGVjbGFyYXRpb25zIGFuZCB0eXBlZGVmLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgRm9vIEZvbzsKICAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgQSBmZXcgb3RoZXIgc3VidGxlIHN0cnVjdCByZWxhdGVkIHR5cGluZyBwcm9ibGVtcyB3ZXJlCiAgICAgICAgICAgIGFsc28gcmVzb2x2ZWQuCgpWZXJzaW9uIDEuMy4xMiAoSnVuZSAyLCAyMDAyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAKMDUvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHJlbGF0ZWQgdG8gZm9yd2FyZCB0ZW1wbGF0ZSBjbGFzcyBkZWNsYXJhdGlvbnMgYW5kCiAgICAgICAgICAgIG5hbWVzcGFjZXMuICBCdWcgcmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjA1LzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgJ21ha2UgdW5pbnN0YWxsJyB0YXJnZXQuICBDb250cmlidXRlZCBieSBKb2VsIFJlZWQuCgowNS8yOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHJhdGhlciBpbnNpZGlvdXMgYnVnIHdpdGggJXJlbmFtZSwgJWZlYXR1cmUgYW5kIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlZXhjZXB0aW9uIHZlY3Rvcjo6X19nZXRpdGVtX18gewogICAgICAgICAgICAgICAgICAgICAuLi4gc29tZSBleGNlcHRpb24gLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgdmVjdG9yIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICBUIF9fZ2V0aXRlbV9fKGludCBpbmRleCk7ICAgICAgIC8vIEZpbmUKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgdGVtcGxhdGU8PiBjbGFzcyB2ZWN0b3I8aW50PiB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgVCBfX2dldGl0ZW1fXyhpbnQgaW5kZXgpOyAgICAgICAvLyBPb3BzLgogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIE5vdywgdGhlICVleGNlcHRpb24gZGlyZWN0aXZlIChhbmQgb3RoZXIgZmVhdHVyZXMpIHNob3VsZCBjb3JyZWN0bHkgYXBwbHkgdG8KICAgICAgICAgICAgYm90aCB2ZWN0b3IgYW5kIHNwZWNpYWxpemF0aW9ucy4KCjA1LzI5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU3VidGxlIGNoYW5nZXMgdG8gJXRlbXBsYXRlKCkgZGlyZWN0aXZlLiAgIFRlbXBsYXRlIGFyZ3VtZW50cyBhcmUgbm93CiAgICAgICAgICAgIHJlZHVjZWQgdG8gcHJpbWl0aXZlIHR5cGVzIGluIHRlbXBsYXRlIG1hdGNoaW5nLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyB2ZWN0b3I8VCAqPiB7CiAgICAgICAgICAgICAgICAuLi4gcGFydGlhbCBzcGVjaWFsaXphdGlvbiAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgKkludFB0cjsgICAgIC8vIEdyb3NzIHR5cGVkZWYKCiAgICAgICAgICAgICAgIC8vIEdldHMgdGhlIGFib3ZlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24KICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY3RvckludFB0cikgdmVjdG9yPEludFB0cj47CgogICAgICAgICAgICBUaGlzIGNoYW5nZSBpcyBleHRyZW1lbHkgc3VidGxlLCBidXQgaXQgZml4ZXMgYSBudW1iZXIgb2YgcG90ZW50aWFsCiAgICAgICAgICAgIGhvbGVzIGluIEx1aWdpJ3MgU1RMIGxpYnJhcnkgbW9kdWxlcy4gICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgSW50ZWdlcjsKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWN0b3JpKSB2ZWN0b3I8aW50PjsKCjA1LzI5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcmF0aGVyIGluc2lkaW91cyB0eXBlbWFwIGJ1ZyByZWxhdGVkIHRvIGNvbnN0LiAgY29uc3QKICAgICAgICAgICAgd2FzIGJlaW5nIGRpc2NhcmRlZCB0aHJvdWdoIHR5cGVkZWZzLgoKMDUvMjkvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIGlucHV0IHR5cGVtYXBzIGZvciBjb25zdCByZWZlcmVuY2VzIHRvIHByaW1pdGl2ZQogICAgICAgICAgICB0eXBlcyAoaW4gTGliL3J1YnkvcnVieS5zd2cpLgoKMDUvMjkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBUaGUgamF2YSBhcnJyYXkgc3VwcG9ydCBmdW5jdGlvbnMgYXJlIGVuY2xvc2VkIGJ5IAogICAgICAgICAgICBhIFNXSUdfTk9BUlJBWVMgI2RlZmluZS4gVXNlZnVsIGlmIG5vdCB1c2luZyBhcnJheXMgYW5kIAogICAgICAgICAgICBpdCBpcyBkZXNpcmFibGUgdG8gbWluaW1pc2UgdGhlIGFtb3VudCBvZiBjb21waWxlZCBjb2RlLgoKMDUvMjkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBFbnVtcyB3ZXJlIG5vdCByZW5hbWVkIHdoZW4gdXNpbmcgJW5hbWUgb3IgJXJlbmFtZQogICAgICAgICAgICBmaXguCgowNS8yOC8yMDAyOiBsam9obnNvbgogICAgICAgICAgICBbUnVieV0gTW9kaWZpZWQgdGhlIG5hbWUgb2YgdGhlIHdyYXBwZXIgZnVuY3Rpb25zIGZvciB0aGUKCSAgICAibmV3IiBzaW5nbGV0b24gbWV0aG9kIGFuZCAiaW5pdGlhbGl6ZSIgaW5zdGFuY2UgbWV0aG9kIGZvcgoJICAgIGNvbnNpc3RlbmN5IHdpdGggdGhlIG90aGVyIGxhbmd1YWdlIG1vZHVsZXMuIFRoZSB3cmFwcGVyIG5hbWUKCSAgICBmb3IgdGhlIGZ1bmN0aW9uIHRoYXQgaW1wbGVtZW50cyAibmV3IiBpcyBhbGxvY19jbGFzc25hbWUgYW5kCgkgICAgdGhlIHdyYXBwZXIgbmFtZSBmb3IgdGhlIGZ1bmN0aW9uIHRoYXQgaW1wbGVtZW50cyAiaW5pdGlhbGl6ZSIKCSAgICBpcyBuZXdfY2xhc3NuYW1lLgoKCjA1LzI3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQ2hhbmdlcyB0byBydW50aW1lLiAgUG9pbnRlciBjb252ZXJzaW9uL2NyZWF0aW9uIGZ1bmN0aW9ucwogICAgICAgICAgICBub3cgYWxtb3N0IGFsd2F5cyBoYXZlIGFuIGV4dHJhICJmbGFncyIgYXJndW1lbnQuICBGb3IKICAgICAgICAgICAgZXhhbXBsZToKCiAgICAgICAgICAgICAgU1dJR19Db252ZXJ0UHRyKG9iaiwgdm9pZCAqKiwgc3dpZ190eXBlX2luZm8gKnR5LCBpbnQgZmxhZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXgogICAgICAgICAgICBUaGlzIGV4dHJhIHBhcmFtZXRlciBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIGV4cGFuc2lvbiBhbmQgd2lsbAogICAgICAgICAgICBiZSB1c2VkIGZvciBtb3JlIGNvbnRyb2wgb3ZlciBwb2ludGVycyBpbiBmdXR1cmUgdmVyc2lvbnMuCgowNS8yNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeCBmb3IgQysrIGNsYXNzZXMgd2l0aCBwcml2YXRlIGFzc2lnbm1lbnQgb3BlcmF0b3JzLiAgSXQKICAgICAgICAgICAgaXMgbm93IHBvc3NpYmxlIHRvIHNhZmVseSByZXR1cm4gb2JqZWN0cyBsaWtlIHRoaXMgYnkgdmFsdWUuCiAgICAgICAgICAgIENhdmVhdDogIHRoZSBjbGFzcyBtdXN0IHByb3ZpZGUgYSBjb3B5IGNvbnN0cnVjdG9yLgoJICAgIAowNS8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIC1wcm94eSBvcHRpb24gYWRkZWQgdG8gbWFueSBsYW5ndWFnZSBtb2R1bGVzLiAgVGhpcyBpcyB0aGUKICAgICAgICAgICAgc2FtZSBhcyAtc2hhZG93LiAgV2UgYXJlIG1lcmVseSBjaGFuZ2luZyB0ZXJtaW5vbG9neS4KICAgICAgICAgICAgCjA1LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW3BlcmxdIEZpeGVkIHNvbWUgaW5jb25zaXN0ZW5jaWVzIGluIHRoZSAtcGFja2FnZSBvcHRpb24uCiAgICAgICAgICAgIC1wYWNrYWdlIG1lcmVseSBzZXRzIHRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgdXNlZCBvbiB0aGUKICAgICAgICAgICAgd3JhcHBlcnMuICBJdCBkb2VzIG5vdCBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5CiAgICAgICAgICAgIGZpbGUgb3IgdGhlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCAucG0gZmlsZS4gIFRoaXMgd2FzCiAgICAgICAgICAgIGJyb2tlbiBhdCBzb21lIHBvaW50LCBidXQgd29ya3MgYWdhaW4gbm93LgoKMDUvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBbcGVybF0gRml4ZWQgWyA0NzU0NTIgXSBtZW1vcnkgbGVhayBpbiByZXR1cm4tYnktdmFsdWUuCiAgICAgICAgICAgIFByb2JsZW0gcmVsYXRlZCB0byBzdGF0aWMgbWVtYmVyIHZhcmlhYmxlcyByZXR1cm5pbmcgbmV3bHkKICAgICAgICAgICAgYWxsb2NhdGVkIG9iamVjdHMuIFJlcG9ydGVkIGJ5IFJveSBMZWNhdGVzLgogCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW3BlcmxdIEZpeGVkIFsgNTEzMTM0IF0gJUJMRVNTRURNRU1CRVJTIGlzbid0IGFsd2F5cyByaWdodC4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgRmxldXIgRGlhbmEgRHJhZ2FuLgoKMDUvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDU0MDczNSBdIC1pbXBvcnRhbGwgYW5kIHRoZSAtSSBvcHRpb24uCgowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtndWlsZV0gRml4ZWQgWyA1MzI3MjMgXSBEZWZhdWx0IGFyZyBmb3IgY2hhciogY2FuIFNlZ1YuICAKICAgICAgICAgICAgRXJyb3IgaW4gZ3VpbGUgbW9kdWxlLiAgUmVwb3J0ZWQgYnkgQnJldHQgV2lsbGlhbXMuCgowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFN1YnRsZSBjaGFuZ2UgdG8gdHlwZW1hcCBhcHBsaWNhdGlvbiBjb2RlLiAgVGhlICJmcmVlYXJnIgogICAgICAgICAgICB0eXBlbWFwIG11c3QgZXhhY3RseSBtYXRjaCB1cCB3aXRoIHRoZSAiaW4iIG9yICJpZ25vcmUiCiAgICAgICAgICAgIHR5cGVtYXAuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIChjaGFyICpkYXRhLCBpbnQgbGVuKSB7IC4uLiB9OwogICAgICAgICAgICAgICAgICV0eXBlbWFwKGZyZWVhcmcpIGNoYXIgKmRhdGEgeyAuLi4gfTsgCgogICAgICAgICAgICAgICAgIHZvaWQgZm9vKGNoYXIgKmRhdGEsIGludCBsZW4pOwoKICAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlICJpbiIgdHlwZW1hcCBpcyBhcHBsaWVkLCBidXQgdGhlCiAgICAgICAgICAgICBmcmVlYXJnIHR5cGVtYXAgaXMgbm90LiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBmcmVlYXJnCiAgICAgICAgICAgICB0eXBlbWFwIGRvZXNuJ3QgbWF0Y2ggdXAgd2l0aCB0aGUgaW5wdXQgYXJndW1lbnQgc2VxdWVuY2UuCgowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTQ4MjcyIF0gRGVmYXVsdCBhcmd1bWVudCBjb2RlIG1pc3NpbmcgYnJhY2VzLgogICAgICAgICAgICBSZXBvcnRlZCBieSBCcmV0dCBXaWxsaWFtcy4KCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1NDc3MzAgXSBTd2lnVmFsdWVXcmFwcGVyIG5lZWRlZCBmb3IgY29uc3RydWN0b3JzLgogICAgICAgICAgICBSZXBvcnRlZCBieSBXaWxsaWFtIEZ1bHRvbi4KCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVW5kZWZpbmVkIGlkZW50aWZpZXJzIG5vdyBldmFsdWF0ZSB0byAwIHdoZW4gZXZhbHVhdGluZwogICAgICAgICAgICBwcmVwcm9jZXNzb3IgZXhwcmVzc2lvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICNpZiAhRk9PCiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAjZW5kaWYKICAgICAgCiAgICAgICAgICAgIHdoZXJlIEZPTyBpcyB1bmRlZmluZWQgb3Igc2V0IHRvIHNvbWUgbm9uLW51bWVyaWMgdmFsdWUuCgogICAgICAgICAgICBGaXhlcyBbIDU0MDg2OCBdICNpZiBkZWZpbmVkIHdoYXRldmVyIC0gbm90IHBhcnNlZC4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQWRhbSBIdXBwLgoKIAowNS8yNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNXSUcgbm93IGlnbm9yZXMgdGhlIEMrKyAnZXhwb3J0JyBrZXl3b3JkLgoKMDUvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBTb21lIHJlZmluZW1lbnQgb2YgdHlwZS1uYW1lIG1hbmdsaW5nIHRvIGFjY291bnQgZm9yIHBvaW50ZXJzLCBhcnJheXMsCiAgICAgICAgICAgIHJlZmVyZW5jZXMsIGFuZCBvdGhlciBlbWJlZGRlZCB0eXBlIGNvbnN0cnVjdHMuCgowNS8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEluaXRpYWwgYXR0ZW1wdCBhdCBzdXBwb3J0aW5nIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24uICBBdAogICAgICAgICAgICB0aGUgdmVyeSBsZWFzdCwgaXQgaXMgcGFyc2VkIGFuZCB0aGUgY2xhc3NlcyBhcmUgc3RvcmVkLiAgTWF0Y2hpbmcKICAgICAgICAgICAgb2YgaW5zdGFudGlhdGlvbnMgdG8gc3BlY2lhbGl6ZWQgdmVyc2lvbiBpcyBtb3JlIGxpbWl0ZWQgYW5kIGJhc2VkIG9uCiAgICAgICAgICAgIHRoZSBTV0lHIGRlZmF1bHQgdHlwZW1hcCBydWxlczoKCiAgICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFICoKICAgICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgW10KICAgICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgJgoKICAgICAgICAgICAgTm93LCB3aHkgaW4gdGhlIHdvcmxkIHdvdWxkIHlvdSB3YW50IHRvIHVzZSB0aGlzIGZlYXR1cmU/ICBPdGhlcgogICAgICAgICAgICB0aGFuIGFsbG93aW5nIGZvciBzbGlnaHRseSBtb2RpZmllZCBjbGFzcyBBUElzLCB0aGlzIGNhcGFiaWxpdHkgaXMKICAgICAgICAgICAgcHJpbWFyaWx5IHVzZWQgdG8gcHJvdmlkZSBhZHZhbmNlZCB3cmFwcGluZyBzdXBwb3J0IGZvciBTVEwtbGlrZQogICAgICAgICAgICBvYmplY3RzLiAgSXQgY2FuIGFsc28gYmUgbWl4ZWQgd2l0aCB0eXBlbWFwcy4gIEhlcmUgaXMgYW4gZXhhbXBsZToKCgogICAgICAgICAgICAgICAgLyogR2VuZXJpYyB2ZXJzaW9uICovCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyB2ZWN0b3IgewogICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSB2ZWN0b3I8VD4gKiB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgY29udGFpbmVyIG9mIG9iamVjdHMgCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIC8qIFBhcnRpYWwgc3BlY2lhbGl6YXRpb24gKHBvaW50ZXJzKSAqLwogICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgdmVjdG9yPFQgKj4gewogICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSB2ZWN0b3I8VD4gKiB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgY29udGFpbmVyIG9mIHBvaW50ZXJzIHRvIG9iamVjdHMuCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIC8qIFNwZWNpYWxpemF0aW9uIChpbnRlZ2VycykuICovCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTw+IGNsYXNzIHZlY3RvcjxpbnQ+IHsKICAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgdmVjdG9yPGludD4gKiB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgY29udGFpbmVyIG9mIGludGVnZXJzLgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBGRUFUVVJFICoqKgogICAgICAgICAgICAKMDUvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBFbmhhbmNlbWVudCB0byB0eXBlbWFwcy4gICBOb3JtYWxseSwgdHlwZW1hcCB2YXJpYWJsZXMgYXJlCiAgICAgICAgICAgIHJlbmFtZWQgdG8gYXZvaWQgY29uZmxpY3RzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50ICogKGludCB0ZW1wKSB7CiAgICAgICAgICAgICAgICAgICAgJDEgPSAmdGVtcDsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyByZXN1bHRzIGluIGNvZGUgdGhhdCBjcmVhdGVzIGFuZCB1c2VzIHZhcmlhYmxlcyAidGVtcDEiLCJ0ZW1wMiIsIAogICAgICAgICAgICAidGVtcDMiIGFuZCBzbyBmb3J0aCBkZXBlbmRpbmcgb24gaG93IG1hbnkgdGltZXMgdGhlIHR5cGVtYXAgaXMgdXNlZC4KICAgICAgICAgICAgU29tZXRpbWVzIHlvdSB3YW50IGEgc2luZ2xlIHZhcmlhYmxlIGluc3RlYWQuICBUbyBkbyB0aGF0LCB1c2luZwogICAgICAgICAgICB0aGUgZm9sbG93aW5nIG5hbWluZyBzY2hlbWU6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludCAqKGludCBfZ2xvYmFsX3RlbXApIHsKICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICBJcyB0aGlzIGNhc2UsIGEgc2luZ2xlIHZhcmlhYmxlIF9nbG9iYWxfdGVtcCBpcyBlbWl0dGVkIGluIHRoZQogICAgICAgICAgICB3cmFwcGVyIGZ1bmN0aW9ucy4gIEl0IGlzIHNoYXJlZCBhY3Jvc3MgYWxsIHR5cGVtYXBzLiAgUmVwZWF0ZWQKICAgICAgICAgICAgdHlwZW1hcHMgZG8gbm90IHJlcGxpY2F0ZSB0aGUgdmFyaWFibGUtLS10aGV5IHVzZSB0aGUgZmlyc3Qgb25lCiAgICAgICAgICAgIGVtaXR0ZWQuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAKMDUvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBNaW5vciBlbmhhbmNlbWVudCB0byB0eXBlbWFwcy4gIElmIHlvdSBoYXZlIHRoaXMgY29kZSwKCiAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBGb28gKGludCBzb21ldmFyID0gMykgewogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHNvbWV2YXIgaXMgbm93IGVtaXR0ZWQgaW50byB0aGUgd3JhcHBlciBjb2RlLgoKMDUvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCAlZXh0ZW5kIHRvIGJlIGJldHRlciBiZWhhdmVkIGluIG5hbWVzcGFjZXMuICBJZiB5b3UgaGF2ZSBjb2RlCiAgICAgICAgICAgIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgZm9vIHsKICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJhciB7CiAgICAgICAgICAgICAgICAgICAgICAgICVleHRlbmQgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogIAogICAgICAgICAgICBTV0lHIG1hdGNoZXMgdGhlIGJsYWgoKSBtZXRob2QgdG8gYSBDIGZ1bmN0aW9uIG5hbWVkIAogICAgICAgICAgICB2b2lkIGZvb19iYXJfYmxhaChmb286OmJhciAqc2VsZikuCgogICAgICAgICAgICBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgbm9uLW5hbWVzcGFjZSB2ZXJzaW9uLgogICAgICAgICAgICBCdWcgcmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjA1LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3IGxpYnJhcnkgZmlsZXM6IGNwb2ludGVyLmksIGNhcnJheXMuaSwgY21hbGxvYy5pLiAgVGhlc2UKICAgICAgICAgICAgcHJvdmlkZSBhY2Nlc3MgdG8gQyBwb2ludGVycyBhbmQgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zLgogICAgICAgICAgICBTZWUgRG9jL01hbnVhbC9MaWJyYXJ5Lmh0bWwgZm9yIGRldGFpbHMuCgowNS8yMi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEMgdHlwZSBjaGFyIG5vIGxvbmdlciBtYXBzIHRvIEphdmEgdHlwZSBieXRlLCBidXQgdG8gSmF2YSB0eXBlIGNoYXIuCiAgICAgICAgICAgIEl0IGlzIG5vdyB0cmVhdGVkIGFzIGEgY2hhcmFjdGVyIHJhdGhlciB0aGFuIGEgc2lnbmVkIG51bWJlci4gVGhpcyBmaXRzIGluCiAgICAgICAgICAgIHdpdGggdGhlIG90aGVyIGxhbmd1YWdlIG1vZHVsZXMgYW5kIGlzIGEgbW9yZSBuYXR1cmFsIG1hcHBpbmcgYXMgY2hhciogaXMgCiAgICAgICAgICAgIG1hcHBlZCBhcyBhIHN0cmluZyBvZiBjaGFyYWN0ZXJzLiBOb3RlIHRoYXQgdGhlIEMgc2lnbmVkIGNoYXIgdHlwZSBpcyBzdGlsbAogICAgICAgICAgICBtYXBwZWQgdG8gYSBKYXZhIGJ5dGUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNS8yMi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEltcHJvdmVkIGNvbnN0YW50cyB3cmFwcGluZy4gQ29uc3RhbnRzICgjZGVmaW5lIGFuZCAlY29uc3RhbnQpIHZhbHVlcyAKICAgICAgICAgICAgYXJlIG5vdyBvYnRhaW5lZCB0aHJvdWdoIGEgSk5JIGNhbGwuIFByZXZpb3VzbHkgdGhlIHZhbHVlIHdhcyBjb21waWxlZCBhcyAKICAgICAgICAgICAgSmF2YSBjb2RlLCBidXQgdGhpcyBkaWRuJ3Qgd29yayBmb3IgYWxsIGNhc2VzLCBlZyAjZGVmaW5lIDEyM1VMTC4KCjA1LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYm9ndXMgZXJyb3IgbWVzc2FnZSB3aXRoICVleHRlbmQgZGlyZWN0aXZlIGFuZCBDKysKICAgICAgICAgICAgYWNjZXNzIHNwZWNpZmllcnMuICBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDUvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBOYW1lc3BhY2VzIGFuZCBlbnVtcyBub3cgd29yayBjb3JyZWN0bHkuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgRm9vIHsKICAgICAgICAgICAgICAgICAgICBlbnVtIEJhciB7IEEsIEIgfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEJ1ZyByZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDUvMjEvMjAwMjogYmVhemxleQogICAgICAgICAgICBUaGUgJXR5cGVzIGRpcmVjdGl2ZSBjYW4gbm93IGJlIHVzZWQgdG8gc3BlY2lmeSBpbmhlcml0YW5jZSByZWxhdGlvbnNoaXBzCiAgICAgICAgICAgIGluIHRoZSBydW50aW1lIHR5cGUgc3lzdGVtLiAgRm9yIGV4YW1wbGUsCgogICAgICAgICAgICAgICAgJXR5cGVzKEZvbyA9IEJhcik7CgogICAgICAgICAgICBzcGVjaWZpZXMgdGhhdCBGb28gaXNhIEJhci4gICAgVXNpbmcgdGhpcyBpcyBwb3RlbnRpYWxseSBxdWl0ZSBkYW5nZXJvdXMuCiAgICAgICAgICAgIEhvd2V2ZXIsIHRoaXMgaXMgdXNlZnVsIGluIGNlcnRhaW4gY2FzZXMgKGFuZCBpbiB0aGUgU1dJRyBsaWJyYXJ5KS4KICAgICAgICAgICAgCjA1LzIwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgJW5vZGVmYXVsdCBhbmQgJW1ha2VkZWZhdWx0IGRpcmVjdGl2ZXMgbm93IHJlcXVpcmUgYSB0cmFpbGluZyBzZW1pY29sb24uCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVub2RlZmF1bHQ7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICVtYWtlZGVmYXVsdDsKCiAgICAgICAgICAgIEluIGFkZGl0aW9uIGJvdGggZGlyZWN0aXZlcyBjYW4gdGFrZSBhIGNsYXNzIG5hbWUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlbm9kZWZhdWx0IEZvbzsKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28geyAgIC8qIE5vIGRlZmF1bHQgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciAqLwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgeyAgLyogRGVmYXVsdCBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIGdlbmVyYXRlZCAqLwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICBJZiB5b3UgZG9uJ3QgdXNlIHRoZSB0cmFpbGluZyBzZW1pY29sb24sIHRoaW5ncyB3aWxsIG15c3RlcmlvdXNseSBicmVhay4KCjA1LzIwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTW9yZSBpbXByb3ZlbWVudHMgdG8gdHlwZSBzeXN0ZW0gaGFuZGxpbmcuICBTV0lHIG5vdyBjb3JyZWN0bHkgaGFuZGxlcwogICAgICAgICAgICB0ZW1wbGF0ZSBuYW1lcyBhbmQgcGFyYW1ldGVycyBpbiBhIG5hbWVzcGFjZS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIGZvbyB7CiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgYmFyIHsgfTsKICAgICAgICAgICAgICAgICAgICB0eXBlZGVmIGludCBJbnRlZ2VyOwoKICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoYmFyPEludGVnZXI+ICp4KTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBJbiB0aGUgZ2VuZXJhdGVkIGNvZGUsIGFsbCBvZiB0aGUgdHlwZW5hbWVzIGFyZSBwcm9wZXJseSBxdWFsaWZpZWQuCgowNS8xNy8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIGRlcHJlY2F0ZWQgYnJva2VuIC1qbmljIGFuZCAtam5pY3BwIGNvbW1hbmRsaW5lIG9wdGlvbnMuIFRoZSBDIG9yIEMrKyAKICAgICAgICAgICAgSk5JIGNhbGxpbmcgY29udmVudGlvbiBpcyBub3cgZGV0ZXJtaW5lZCBmcm9tIHRoZSAtYysrIGNvbW1hbmRsaW5lIG9wdGlvbi4KCjA1LzE2LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gVGhlIEpDQUxMIG1hY3JvcyB3aGljaCBleGlzdCBzbyB0aGF0IHRoZSBzYW1lIHR5cGVtYXBzIGNhbiBiZSB1c2VkCiAgICAgICAgICAgIGZvciBnZW5lcmF0aW5nIGJvdGggdGhlIEMgYW5kIEMrKyBKTkkgY2FsbGluZyBjb252ZW50aW9ucyBubyBsb25nZXIgYXBwZWFyCiAgICAgICAgICAgIGluIHRoZSBnZW5lcmF0ZWQgY29kZS4gVGhpcyBpcyBiZWNhdXNlIHRoZSBvdXRwdXQgaXMgbm93IHBhc3NlZCB0aHJvdWdoIHRoZSAKICAgICAgICAgICAgU1dJRyBwcmVwcm9jZXNzb3Igd2hpY2ggZG9lcyB0aGUgbWFjcm8gZXhwYW5zaW9uIGZvciBlaXRoZXIgQyBvciBDKysgKGRlcGVuZGluZwogICAgICAgICAgICBvbiB3aGV0aGVyIC1jKysgaXMgcGFzc2VkIG9uIHRoZSBTV0lHIGNvbW1hbmRsaW5lKS4KCiAgICAgICAgICAgIFRoZSBnZW5lcmF0aW9uIG9mIHRoZSBmdW5jdGlvbnMgdXNlZCBpbiB0aGUgYXJyYXkgdHlwZW1hcHMgaGF2ZSBiZWVuIGFkanVzdGVkIAogICAgICAgICAgICB0byB0YWtlIGFjY291bnQgb2YgdGhpcy4gVGhlIHNpZGUgZWZmZWN0IGlzIHRoYXQgYW55IHR5cGVtYXBzIHdoaWNoIGNvbnRhaW5lZCAKICAgICAgICAgICAgSkNBTEwgbWFjcm9zIHdpdGhpbiAleyAlfSBicmFja2V0cyB3aWxsIGhhdmUgdG8gYmUgbW92ZWQgd2l0aGluIHt9IGJyYWNrZXRzIAogICAgICAgICAgICBzbyB0aGF0IHRoZSBTV0lHIHByZXByb2Nlc3NvciBjYW4gZXhwYW5kIHRoZSBtYWNyb3MuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNS8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIENsYXNzIHRlbXBsYXRlcyBtYXkgbm93IGJlIHVzZWQgYXMgdGVtcGxhdGUgcGFyYW1ldGVycy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBULCB0ZW1wbGF0ZTxjbGFzcz4gY2xhc3MgQz4gY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAldGVtcGxhdGUoRm9vaSkgRm9vPGludCwgQmFyPjsKICAgICAKICAgICAgICAgICAgU1dJRyBkb2Vzbid0IHJlYWxseSBkbyBhbnl0aGluZyBzcGVjaWFsIHdpdGggdGhpcy0tLWl0J3MganVzdAogICAgICAgICAgICBhbm90aGVyIHdheSBvZiBzcGVjaWZ5aW5nIGEgdGVtcGxhdGUgcGFyYW1ldGVyLiAgCiAgICAgICAgIAowNS8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIHJlZmluZW1lbnQgb2YgdGVtcGxhdGUgc3VwcG9ydC4gIFRlbXBsYXRlIHBhcmFtZXRlciBuYW1lcyBhcmUgbm8gbG9uZ2VyCiAgICAgICAgICAgIHJlcXVpcmVkIGZvciB0eXBlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIHRlbXBsYXRlPGJvb2w+IGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgT2J2aW91c2x5LCBuYW1lcyBhcmUgcmVxdWlyZWQgZm9yIHRlbXBsYXRlPGNsYXNzIFQ+OwoKMDUvMTIvMjAwMjogYmVhemxleQogICAgICAgICAgICBOZXcgbWFjcm8gZXhwYW5zaW9uIGluIHR5cGVtYXBzLiAgVGhlIHNlcXVlbmNlOgoKICAgICAgICAgICAgICAgICRkZXNjcmlwdG9yKHR5cGUpCgogICAgICAgICAgICBXaWxsIGV4cGFuZCBpbnRvIHRoZSBTV0lHIHR5cGUgZGVzY3JpcHRvciBzdHJ1Y3RvciBmb3IKICAgICAgICAgICAgdGhlIGdpdmVuIHR5cGUuICBUeXBlIG1heSBiZSBhbnkgYWJzdHJhY3QgZGF0YXR5cGUuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICRkZXNjcmlwdG9yKGludCAqKQogICAgICAgICAgICAgICAgJGRlc2NyaXB0b3IoaW50ICgqKShpbnQsZG91YmxlKSkKICAgICAgICAgICAgICAgICRkZXNjcmlwdG9yKHZlY3RvcjxpbnQ+ICopCgogICAgICAgICAgICBDYXZlYXQ6IEl0IGlzICpOT1QqIGN1cnJlbnRseSBsZWdhbCB0byB1c2Ugb3RoZXIgdHlwZW1hcAogICAgICAgICAgICBzdWJzdGl0dXRpb24gdmFyaWFibGVzIGluIHRoZSBtYWNyby4gIEZvciBleGFtcGxlIAogICAgICAgICAgICAkZGVzY3JpcHRvcigkMV90eXBlKS4KCiAgICAgICAgICAgIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgdGhpcyBtb2RpZmljYXRpb24gaXMgdG8gYmV0dGVyCiAgICAgICAgICAgIHN1cHBvcnQgdHlwZW1hcHMgZm9yIGNvbnRhaW5lciBvYmplY3RzIG9yIHRvIGFsbG93IHR5cGVtYXBzCiAgICAgICAgICAgIHRoYXQgbWlnaHQgYmUgcGVyZm9ybWluZyB0eXBlIGNvbnZlcnNpb25zLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowNS8xMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFRoZSB3cmFwcGluZyBvZiByZWZlcmVuY2VzIHRvIHByaW1pdGl2ZSB0eXBlcyBoYXMgYmVlbgogICAgICAgICAgICBjaGFuZ2VkIGFzIGZvbGxvd3M6CgogICAgICAgICAgICBBcmd1bWVudHMgb2YgdHlwZSAnY29uc3QgcHJpbWl0aXZlICYnIGFyZSBub3cgcGFzc2VkCiAgICAgICAgICAgIGJ5IHZhbHVlIGFzIG9wcG9zZWQgdG8gcG9pbnRlcnMuICBSZXR1cm4gdmFsdWVzIG9mCiAgICAgICAgICAgIHR5cGUgJ2NvbnN0IHByaW1pdGl2ZSAmJyBhcmUgcmV0dXJuZWQgYXMgdmFsdWVzIGluc3RlYWQgb2YKICAgICAgICAgICAgcG9pbnRlcnMuCgogICAgICAgICAgICAncHJpbWl0aXZlJyBpcyBhbnkgb25lIG9mIGludCwgc2hvcnQsIGxvbmcsIGxvbmcgbG9uZywKICAgICAgICAgICAgY2hhciwgZmxvYXQsIGRvdWJsZSwgYm9vbCAoYXMgd2VsbCBhcyB1bnNpZ25lZCB2YXJpYW50cykuCiAgICAgICAgICAgIAogICAgICAgICAgICBUaGlzIGNoYW5nZSBpcyBiZWluZyBtYWRlIHRvIGJldHRlciBzdXBwb3J0IEMrKyB3cmFwcGluZy0tZXNwZWNpYWxseQogICAgICAgICAgICBjb2RlIHRoYXQgbWFrZXMgdXNlIG9mIHRlbXBsYXRlcyBhbmQgdGhlIFNUTC4KICAgICAgICAgICAgCjA1LzExLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgY2FuIG5vdyBiZSB1c2VkIHRvIGFjY2VzcyB0ZW1wbGF0ZXMKICAgICAgICAgICAgaW4gYSBuYW1lc3BhY2UuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2Ugc3RkIHsKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBjb21wbGV4IHsKICAgICAgICAgICAgICAgICAgICAgICBUIHJlLCBpbTsKICAgICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgY29tcGxleChUIF9yID0gVCgpLCBUIF9pID0gVCgpKSA6IHJlKF9yKSwgaW0oX2kpIHsgfQogICAgICAgICAgICAgICAgICAgICAgIFQgcmVhbCgpIHsgcmV0dXJuIHJlOyB9CiAgICAgICAgICAgICAgICAgICAgICAgVCBpbWFnKCkgeyByZXR1cm4gaW07IH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShjb21wbGV4KSBzdGQ6OmNvbXBsZXg8ZG91YmxlPjsKCiAgICAgICAgICAgIE5vdGU6IFRoZXJlIGFyZSBzb21lIHZlcnkgc3VidGxlIG5hbWVzcGFjZS9zeW1ib2wgdGFibGUgCiAgICAgICAgICAgIG1hbmFnZW1lbnQgaXNzdWVzIGludm9sdmVkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzLgogICAgICAgICAgICBJdCBtYXkgbm90IHdvcmsgaW4gY2VydGFpbiBjYXNlcy4KCjA1LzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWVtYmVyIHRlbXBsYXRlIGNvbnN0cnVjdG9yIHN1cHBvcnQgYWRkZWQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1QyPiAKICAgICAgICAgICAgICAgc3RydWN0IHBhaXIgewogICAgICAgICAgICAgICAgIF9UMSBmaXJzdDsKICAgICAgICAgICAgICAgICBfVDIgc2Vjb25kOwogICAgICAgICAgICAgICAgIHBhaXIoKSA6IGZpcnN0KF9UMSgpKSwgc2Vjb25kKF9UMigpKSB7IH0KICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVTEsIGNsYXNzIF9VMj4gcGFpcihjb25zdCBwYWlyPF9VMSxfVTI+ICZ4KTsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRvIGluc3RhbnRpYXRlIHRoZSB0ZW1wbGF0ZSwgdXNlICV0ZW1wbGF0ZSBhbmQgJWV4dGVuZC4KICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHRoaXMgZXhwYW5kcyB0aGUgY29uc3RydWN0b3IgaW50byBhIGRlZmF1bHQKICAgICAgICAgICAgY29weSBjb25zdHJ1Y3RvcjoKCiAgICAgICAgICAgICAgICVleHRlbmQgcGFpciB7CiAgICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShwYWlyKSBwYWlyPF9UMSxfVDI+OwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBIaWdobHkgZXhwZXJpbWVudGFsLiAgT3RoZXIgdXNlcyBtYXkgYmUgYnJva2VuLgoKMDUvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBUaGUgJWV4dGVuZCAoJWFkZG1ldGhvZHMpIGRpcmVjdGl2ZSBubyBsb25nZXIgd29ya3MgdW5sZXNzCiAgICAgICAgICAgIGl0IGFwcGVhcnMgaW4gdGhlIHB1YmxpYyBzZWN0aW9uIG9mIGEgY2xhc3MuICAgQW4gZXJyb3IKICAgICAgICAgICAgbWVzc2FnZSBpcyBub3cgZ2VuZXJhdGVkIChhcyBvcHBvc2VkIHRvIGEgc2VnbWVudGF0aW9uIGZhdWx0KS4KCjA1LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3ICV3YXJuZmlsdGVyKCkgZGlyZWN0aXZlLiAgVGhpcyBkaXJlY3RpdmUgYXR0YWNoZXMgYSB3YXJuaW5nCiAgICAgICAgICAgIGZpbHRlciB0byBzcGVjaWZpYyBkZWNsYXJhdGlvbnMgYW5kIGhhcyB0aGUgc2FtZSBzZW1hbnRpY3MgYXMKICAgICAgICAgICAgJXJlbmFtZSwgJWlnbm9yZSwgJWZlYXR1cmUsIGFuZCBzbyBmb3J0aC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJXdhcm5maWx0ZXIoNTAxKSBmb287ICAgLy8gU3VwcHJlc3Mgb3ZlcmxvYWRlZCB3YXJuaW5nCiAgICAgICAgICAgICAgIGludCBmb28oaW50KTsKICAgICAgICAgICAgICAgaW50IGZvbyhkb3VibGUpOyAKCiAgICAgICAgICAgIG9yCgogICAgICAgICAgICAgICAld2FybmZpbHRlcig1MDEpIE9iamVjdDo6Zm9vKGRvdWJsZSk7CiAgICAgICAgICAgICAgIGNsYXNzIE9iamVjdCB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgaW50IGZvbyhpbnQpOwogICAgICAgICAgICAgICAgICBpbnQgZm9vKGRvdWJsZSk7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGlzIGZlYXR1cmUgb25seSBzdXBwcmVzc2VzIHdhcm5pbmdzIGluIGxhdGVyIHN0YWdlcyBvZiBjb2RlCiAgICAgICAgICAgIGdlbmVyYXRpb24uICBJdCBkb2VzIG5vdCBzdXBwcmVzcyB3YXJuaW5ncyByZWxhdGVkIHRvIHByZXByb2Nlc3NpbmcKICAgICAgICAgICAgb3IgcGFyc2luZy4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDUvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBTV0lHIG5vdyBzdXBwb3J0cyBDOTkgdmFyaWFkaWMgcHJlcHJvY2Vzc29yIG1hY3Jvcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgI2RlZmluZSBkZWJ1Z2YoZm10LC4uLikgZnByaW50ZihzdGRlcnIsZm10LF9fVkFfQVJHU19fKQoKICAgICAgICAgICAgVGhlIGFyZ3VtZW50ICIuLi4iIGlzIHVzZWQgdG8gaW5kaWNhdGUgdmFyaWFibGUgYXJndW1lbnRzIHdoaWNoCiAgICAgICAgICAgIGFyZSBhbGwgcGxhY2VkIGludG8gdGhlIHNwZWNpYWwgYXJndW1lbnQgbmFtZSBfX1ZBX0FSR1NfXyBpbgogICAgICAgICAgICB0aGUgbWFjcm8gZXhwYW5zaW9uLiAgCgogICAgICAgICAgICBTV0lHIGFsc28gaW1wbGVtZW50cyB0aGUgR05VICgjIykgZXh0ZW5zaW9uIGZvciBzd2FsbG93aW5nIHRoZQogICAgICAgICAgICBwcmVjZWRpbmcgY29tbWEgd2hlbiBfX1ZBX0FSR1NfXyBpcyBlbXB0eS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAjZGVmaW5lIGRlYnVnZihmbXQsLi4uKSBmcHJpbnRmKHN0ZGVycixmbXQsICMjX19WQV9BUkdTX18pCgogICAgICAgICAgICBIZXJlIGlzIGhvdyB0aGlzIGlzIGV4cGFuZGVkOgoKICAgICAgICAgICAgICAgZGVidWdmKCIlZCIsIDMpICAtLT4gZnByaW50ZihzdGRlcnIsIiVkIiwzKQogICAgICAgICAgICAgICBkZWJ1Z2YoIkhlbGxvIikgIC0tPiBmcHJpbnRmKHN0ZGVyciwiSGVsbG8iICkKCiAgICAgICAgICAgIChub3RpY2UgdGhlIGRlbGV0ZWQgY29tbWEpLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowNS8wOC8yMDAyOiBzYW1qYW0gKFNhbSBMaWRkaWNvdHQpCiAgICAgICAgICAgIE1hbnkgY2hhbmdlcyB0byBwaHAgbW9kdWxlLiAgU2hhZG93IGNsYXNzZXMgYXJlIG5vdyBpbXBsZW1lbnRlZAogICAgICAgICAgICBlbnRpcmVseSBpbiBuYXRpdmUgQyBhbmQgbm8gbmVlZCBmb3IgcGhwLWNvZGUgc2hhZG93IHdyYXBwZXJzCiAgICAgICAgICAgIFBvcHVsYXRlZCB0ZW1wbGF0ZSBjb25maWcubTQgYW5kIE1ha2VmaWxlLmluIGFzIG5lZWRlZCBieQogICAgICAgICAgICBwaHBpemUgYXJlIGdlbmVyYXRlZC4KCjA1LzA4LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBIGNvcHkgY29uc3RydWN0b3IgaXMgbm93IHR1cm5lZCBpbnRvIGEgImNsb25lIgogICAgICAgICAgICBpbnN0YW5jZSBtZXRob2QgKHNlZSBEYXZlJ3MgY2hhbmdlIGZvciBjb3B5IGNvbnN0cnVjdG9ycwogICAgICAgICAgICBkYXRlZCA0LzcvMjAwMikuIFRoaXMgc2VlbXMgbGlrZSB0aGUgYXBwcm9wcmlhdGUgdGhpbmcKICAgICAgICAgICAgdG8gZG8gZm9yIFJ1YnkgY29kZS4KCjA1LzA4LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBGaXhlZCBbIDU1Mzg2NCBdIElubGluZSBkZXN0cnVjdG9yIGNvZGUgbm90IHdyaXR0ZW4uCgowNS8wOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgICVpZ25vcmUgYmVoYXZlcyBiZXR0ZXIgd2l0aCBjb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3JzLCBhbmQgdGhlCiAgICAgICAgICAgIHR5cGUgc3lzdGVtIGluIGdlbmVyYWwuICAgRm9yIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMsCiAgICAgICAgICAgICVpZ25vcmUgbm93IHN1cHByZXNzZXMgdGhlIGNyZWF0aW9uIG9mIGEgZGVmYXVsdCBjb25zdHJ1Y3RvcgogICAgICAgICAgICBvciBkZXN0cnVjdG9yLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICVpZ25vcmUgfkZvbzsKICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgRm9vKCk7CiAgICAgICAgICAgICAgICAgICAgfkZvbygpOwogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgSW4gU1dJRy0xLjMuMTEsIH5Gb28oKSBzaW1wbHkgImRpc2FwcGVhcmVkIiBhbmQgdGhlIGNvZGUgZ2VuZXJhdG9yCiAgICAgICAgICAgIGNyZWF0ZWQgYSB3cmFwcGVyIGZvciBhIGRlZmF1bHQgZGVzdHJ1Y3RvciAoYXMgaWYgaXQgd2FzIG5ldmVyCiAgICAgICAgICAgIGRlY2xhcmVkIGluIHRoZSBpbnRlcmZhY2UpLiAgSW4gU1dJRy0xLjMuMTIsICVpZ25vcmUgc3VwcHJlc3NlcwogICAgICAgICAgICB0aGUgY3JlYXRpb24gb2YgYSBkZXN0cnVjdG9yIGlmIG9uZSBpcyBhY3R1YWxseSBkZWZpbmVkLiAKCiAgICAgICAgICAgIFNpbWlsYXJseSwgZXZlbiB0aG91Z2ggYSBkZWNsYXJhdGlvbiBpcyBpZ25vcmVkLCBpbmZvcm1hdGlvbgogICAgICAgICAgICBtYXkgc3RpbGwgYmUgbmVlZGVkIHRvIHByb3Blcmx5IGhhbmRsZSB0eXBlcy4gRm9yIGV4YW1wbGUsIGhlcmUKICAgICAgICAgICAgaXMgYSB2ZXJ5IHN1YnRsZSBlcnJvciB0aGF0IGlzIGZpeGVkIGJ5IHRoaXMgY2hhbmdlOgoKICAgICAgICAgICAgICAgICVpZ25vcmUgc3RkOjpzdHJpbmc7ICAgICAgICAgLy8gUHJldmVudCBjbGFzcyB3cmFwcGluZwogICAgICAgICAgICAgICAgbmFtZXNwYWNlIHN0ZCB7CiAgICAgICAgICAgICAgICAgICBjbGFzcyBzdHJpbmcgewogICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgc3RyaW5nICogewogICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdm9pZCBmb28oc3RkOjpzdHJpbmcgKnMpOyAgIC8vIEJyb2tlbi4KCiAgICAgICAgICAgIEJlZm9yZSB0aGlzIGZpeCwgJWlnbm9yZSB3b3VsZCBjYXVzZSB0aGUgY2xhc3MgZGVmaW5pdGlvbiB0byBkaXNhcHBlYXIuCiAgICAgICAgICAgIFRoaXMsIGluIHR1cm4sIHdvdWxkIGNhdXNlIHRoZSB0eXBlbWFwIHRvIGJlIG1pc2FwcGxpZWQuIAogCjA1LzA4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWlub3IgY2hhbmdlcyB0byAlcmVuYW1lLCAlaWdub3JlLCAlZmVhdHVyZSwgYW5kIHJlbGF0ZWQgZGlyZWN0aXZlcwogICAgICAgICAgICBmb3IgYmV0dGVyIHN1cHBvcnQgb2YgZGVzdHJ1Y3RvcnMuICBEZXN0cnVjdG9ycyBjYW4gbm93IGJlIHByZWNpc2VseQogICAgICAgICAgICB0YWdnZWQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICVpZ25vcmUgRm9vOjp+Rm9vOwogICAgICAgICAgICAgICAgICAlZmVhdHVyZSgiYWN0aW9uIikgfkJhciB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgCiAgICAgICAgICAgICpEZXZlbG9wZXIgd2FybmluZyogCiAgICAgICAgICAgIE9wZXJhdGlvbnMgc3VjaCBhcyByZW5hbWluZyBhbmQgZmVhdHVyZSBhdHRhY2htZW50IGZvciBjbGFzc2VzIHVzZWQgdG8KICAgICAgICAgICAgYmUgYXBwbGllZCB0byBkZXN0cnVjdG9ycyBhcyB3ZWxsLiAgRm9yIGluc3RhbmNlLCBpZiB5b3UgZGlkIHRoaXM6CiAKICAgICAgICAgICAgICAgICAlcmVuYW1lKEJhcikgRm9vOwoKICAgICAgICAgICAgVGhlIG9wZXJhdGlvbiBhcHBsaWVkIHRvIHRoZSBjbGFzcyBpdHNlbGYsIHRoZSBjb25zdHJ1Y3RvciwgYW5kCiAgICAgICAgICAgIHRoZSBkZXN0cnVjdG9yLiAgIFRoaXMgaXMgbm8gbG9uZ2VyIHRoZSBjYXNlLiAgTm93IHN1Y2ggb3BlcmF0aW9ucwogICAgICAgICAgICB3aWxsIG9ubHkgYXBwbHkgdG8gdGhlIGNsYXNzIGFuZCB0aGUgY29uc3RydWN0b3IuICBOb3RlOiBpZiB5b3UKICAgICAgICAgICAgd2VyZSByZWx5aW5nIG9uIHRoaXMgZm9yIGNsYXNzIHJlbmFtaW5nLCBiZSBhd2FyZSB0aGF0IHJlbmFtZWQKICAgICAgICAgICAgY2xhc3NlcyBzaG91bGQgcmVhbGx5IG9ubHkgYmUgaGFuZGxlZCBhdCB0aGUgbGV2ZWwgb2YgdGhlIGNsYXNzIGl0c2VsZgogICAgICAgICAgICBhbmQgbm90IHRoZSBsZXZlbCBvZiBpbmRpdmlkdWFsIGRlY2xhcmF0aW9ucyBpbiB0aGUgY2xhc3MgKGFsdGhvdWdoCiAgICAgICAgICAgIHRoZXkgY2FuIGJlIHJlbmFtZWQgaW5kaXZpZHVhbGx5IGlmIG5lZWRlZCkuICBBcyBmYXIgYXMgSSBrbm93LAogICAgICAgICAgICB0aGUgTGFuZ3VhZ2UgY2xhc3MgaXMgYWxyZWFkeSB0YWtpbmcgY2FyZSBvZiB0aGlzIGNhc2UgY29ycmVjdGx5LgoKMDUvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBOZXcgc2V0IG9mIHRlc3RzLiAgVGhlIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvZXJyb3JzIGRpcmVjdG9yeSBjb250YWlucwogICAgICAgICAgICB0ZXN0cyB0aGF0IHRyeSB0byBleGVyY2lzZSBhbGwgb2YgU1dJRydzIGVycm9yIGFuZCB3YXJuaW5nIG1lc3NhZ2VzLgoKMDUvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBTdGFydCBvZiBhIHdhcm5pbmcgZnJhbWV3b3JrLiAgV2FybmluZyBtZXNzYWdlcyBhcmUgbm93IGFzc2lnbmVkIG51bWVyaWMgdmFsdWVzCiAgICAgICAgICAgIHRoYXQgYXJlIHNob3duIGluIHdhcm5pbmcgbWVzc2FnZXMuICAgVGhlc2UgY2FuIGJlIHN1cHByZXNzZWQgdXNpbmcgdGhlCiAgICAgICAgICAgIC13IG9wdGlvbi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBzd2lnIC13MzAyIGV4YW1wbGUuaQogICAgICAgICAgICAgICAgIHN3aWcgLXczMDIsMzA1IGV4YW1wbGUuaQoKICAgICAgICAgICAgQWx0ZXJuYXRpdmVseSwgdGhlICNwcmFnbWEgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0byBkaXNhYmxlIHRoaXM6CgogICAgICAgICAgICAgICAgICNwcmFnbWEgU1dJRyBub3dhcm49MzAyCiAgICAgICAgICAgICAgICAgI3ByYWdtYSBTV0lHIG5vd2Fybj0zMDIsMzA1CgogICAgICAgICAgICBOb3RlOiBTaW5jZSBTV0lHIGlzIGEgbXVsdGktcGFzcyBjb21waWxlciwgdGhpcyBwcmFnbWEgc2hvdWxkCiAgICAgICAgICAgIG9ubHkgYmUgdXNlZCB0byBjaGFuZ2UgZ2xvYmFsIHNldHRpbmdzIG9mIHRoZSB3YXJuaW5nIGZpbHRlci4gIEl0IHNob3VsZAogICAgICAgICAgICBub3QgYmUgdXNlZCB0byBzZWxlY3RpdmVseSBlbmFibGUvZGlzYWJsZSB3YXJuaW5ncyBpbiBhbiBpbnRlcmZhY2UgZmlsZS4KICAgICAgICAgICAgVGhlIGhhbmRsaW5nIG9mICNwcmFnbWEgb2NjdXJzIGluIHRoZSBDKysgcHJlcHJvY29lc3NvciBhbmQgYWZmZWN0cyBhbGwgCiAgICAgICAgICAgIHN1YnNlcXVlbnQgc3RhZ2VzIG9mIGNvbXBpbGF0aW9uLgoKICAgICAgICAgICAgVGhlIC1XYWxsIG9wdGlvbiB0dXJucyBvbiBhbGwgd2FybmluZ3MgYW5kIG92ZXJyaWRlcyBhbnkgZmlsdGVycyB0aGF0CiAgICAgICAgICAgIG1pZ2h0IGhhdmUgYmVlbiBzZXQuCgogICAgICAgICAgICBXYXJuaW5ncyBjYW4gYmUgaXNzdWVkIGZyb20gYW4gaW50ZXJmYWNlIHVzaW5nICV3YXJuLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICV3YXJuICIxMTA6JXNlY3Rpb24gaXMgZGVwcmVjYXRlZCIKCiAgICAgICAgICAgIFRoZSBmaXJzdCBwYXJ0IG9mIGEgd2FybmluZyBtZXNzYWdlIGlzIGFuIG9wdGlvbmFsIHdhcm5pbmcgbnVtYmVyLgogICAgICAgICAgICBBIGNvbXBsZXRlIHNldCBvZiB3YXJuaW5nIG51bWJlcnMgaXMgZm91bmQgaW4gU291cmNlL0luY2x1ZGUvc3dpZ3dhcm4uaC4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDUvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBJbnRlcm5hbCBwYXJzaW5nIGNoYW5nZS4gICBEaXJlY3RpdmVzIHRvIGluY2x1ZGUgZmlsZXMgbm93IHVzZSBicmFja2V0cyBbIC4uLiBdCiAgICAgICAgICAgIGluc3RlYWQgb2YgeyAuLi4gfS4gICAKCiAgICAgICAgICAgICAgICAgICVpbmNsdWRlZmlsZSAiZm9vLmkiIFsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIF0KCiAgICAgICAgICAgIFRoZSB1c2Ugb2YgeyAuLi4gfSB3YXMgYSBiYWQgY2hvaWNlIGJlY2F1c2UgdGhleSB3ZXJlIGluY2x1ZGVkIGltcGxpY2l0bHkgYnkKICAgICAgICAgICAgdGhlIHByZXByb2Nlc3NvciBhbmQgbWFkZSBpdCBpbXBvc3NpYmxlIHRvIHByb3Blcmx5IGRldGVjdCBsZWdpdGltYXRlIG1pc3NpbmcgJ30nIAogICAgICAgICAgICBlcnJvcnMuCgowNC8xNi8yMDAyLQowNS8wMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNXSUcgRXVyb3BlYW4gVG91cjogUGFyaXMtQW1zdGVyZGFtLUJhdGguCgowNC8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFRoZSAlYWRkbWV0aG9kcyBkaXJlY3RpdmUgaGFzIGJlZW4gcmVuYW1lZCB0byAlZXh0ZW5kLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICVleHRlbmQgRm9vIHsKICAgICAgICAgICAgICAgICAgIGludCBibGFoKCkgeyAuLi4gfTsKICAgICAgICAgICAgICAgICAgIGludCBiYXIoKSB7IC4uLiB9OwogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgTW90aXZhdGlvbjogdGhlICVhZGRtZXRob2RzIGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCBmb3IgbWFueQogICAgICAgICAgICBvdGhlciB0YXNrcyBpbmNsdWRpbmcgYWRkaW5nIHN5bnRoZXNpemVkIGF0dHJpYnV0ZXMsIGNvbnN0cnVjdG9ycywKICAgICAgICAgICAgYW5kIHR5cGVtYXBzLiBCZWNhdXNlIG9mIHRoaXMsICJhZGRtZXRob2RzIiBpcyBzb21ld2hhdCBtaXNsZWFkaW5nLgogICAgICAgICAgICAlZXh0ZW5kIG1vcmUgcHJlY2lzZWx5IGRlc2NyaWJlcyB0aGlzIG9wZXJhdGlvbi0tLWV4dGVuc2lvbiBvZiBhCiAgICAgICAgICAgIGNsYXNzIG9yIHN0cnVjdHVyZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICAlYWRkbWV0aG9kcyBzdGlsbCB3b3JrcyB2aWEgYSBtYWNybyBkZWZpbml0aW9uLiAgIEhvd2V2ZXIsCiAgICAgICAgICAgIGEgd2FybmluZyBtZXNzYWdlIG1heSBiZSBnZW5lcmF0ZWQuICAgRXJyb3JzIGludm9sdmluZyAlYWRkbWV0aG9kcwogICAgICAgICAgICB3aWxsIGFjdHVhbGx5IHJlZmVyIHRvIHRoZSAlZXh0ZW5kIGRpcmVjdGl2ZS4gIAogICAgICAgICAgICAKMDQvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBGdXJ0aGVyIHJlZmluZW1lbnQgb2YgdGhlIHR5cGUgc3lzdGVtLiAgVHlwZWRlZiBub3cKICAgICAgICAgICAgcHJvcGFnYXRlcyB0aHJvdWdoIGZ1bmN0aW9ucywgcG9pbnRlcnMgdG8gZnVuY3Rpb25zLAogICAgICAgICAgICBhbmQgcG9pbnRlcnMgdG8gbWVtYmVyIGZ1bmN0aW9ucy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICB0eXBlZGVmIGludCBJbnRlZ2VyOwogICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgKCp4KShpbnQpLCBJbnRlZ2VyICgqeSkoSW50ZWdlcikpOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBhcmd1bWVudHMgJ3gnIGFuZCAneScgaGF2ZSBleGFjdGx5CiAgICAgICAgICAgIHRoZSBzYW1lIHR5cGUgKGFuZCB3b3VsZCBvYnZpb3VzbHkgYWNjZXB0IG9iamVjdHMKICAgICAgICAgICAgb2YgZWl0aGVyIHR5cGUpLgoKICAgICAgICAgICAgU2ltaWxhcmx5LCBjb25zaWRlciB0aGlzOgoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgIHR5cGVkZWYgRm9vIEJhcjsKICAgICAgICAgICAgICAgdm9pZCBiYXIoaW50IChGb286Oip4KShpbnQpLCBpbnQgKEJhcjo6KnkpKGludCkpOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBhcmd1bWVudHMgeCBhbmQgeSBhcmUgdGhlIHNhbWUgCiAgICAgICAgICAgIHR5cGUgKHZpYSB0eXBlZGVmKS4KICAgICAgICAgICAgCjA0LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU1dJRyBub3cgZ2VuZXJhdGVzIGEgd2FybmluZyBtZXNzYWdlIGlmIGFueSBwYXJ0IG9mCiAgICAgICAgICAgIGFuIGV4cHJlc3Npb24gaW52b2x2ZXMgdmFsdWVzIGZyb20gYSBwcml2YXRlIHBhcnQgb2YgYSBjbGFzcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHByaXZhdGU6CiAgICAgICAgICAgICAgICAgICAgc3RhdGljIGludCBYOwogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoaW50IGEsIGludCBiID0gWCk7ICAgLy8gV2FybmluZwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIGRlZmF1bHQgYXJndW1lbnQgaXMgaWdub3JlZC4gIFRoZXJlCiAgICAgICAgICAgIGFyZSB3b3JrYXJvdW5kcywgYnV0IHRoZXkgYXJlIHJhdGhlciBjbHVtc3kuICBGb3IgaW5zdGFuY2UsCiAgICAgICAgICAgIHlvdSBtaWdodCBkbyB0aGlzOgoKICAgICAgICAgICAgICAgICAgICAlZmVhdHVyZSgiYWN0aW9uIikgYmxhaChpbnQsaW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRuYXJncyA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYmxhaChhcmcxKTsKICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGJsYWgoYXJnMSxhcmcyKTsKICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaChpbnQgYSwgaW50IGIgPSAwKTsKCgowNC8yMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFVzZSBvZiB0aGUgJWlubGluZSBkaXJlY3RpdmUgaW5zaWRlIGEgbmFtZXNwYWNlIGlzCiAgICAgICAgICAgIGZvcmJpZGRlbiBhbmQgbm93IGdlbmVyYXRlcyBhbiBlcnJvciBtZXNzYWdlLiAgIFRoaXMgaXMKICAgICAgICAgICAgbm90IGFsbG93ZWQgc2luY2UgdGhlIGlubGluZWQgY29kZSB0aGF0IGlzIGVtaXR0ZWQgaXMKICAgICAgICAgICAgbm90IHBsYWNlZCBpbnNpZGUgYSBuYW1lc3BhY2UuICBUaGlzIGNvbmZ1c2VzIG90aGVyCiAgICAgICAgICAgIHN0YWdlcyBvZiBwYXJzaW5nLgogICAgICAgICAgICAgICAgICAgIAowNC8yMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNvbWUgYnVnIGZpeGVzIHRvIGNhc3Rpbmcgb3BlcmF0aW9ucyBhbmQgZXhwcmVzc2lvbgogICAgICAgICAgICBwYXJzaW5nLiAgIER1ZSB0byBzb21lIHBhcnNpbmcgaXNzdWVzLCBpdCBpcyBub3QgCiAgICAgICAgICAgIGN1cnJlbnRseSBwb3NzaWJsZSB0byB1c2UgY2FzdHMgZm9yIGFsbCBwb3NzaWJsZQogICAgICAgICAgICBkYXRhdHlwZXMuICAgSG93ZXZlciwgdGhlIGNvbW1vbiBjYXNlcyB3b3JrLgoKMDQvMjAvMjAwMjogYmVhemxleSAoQW1zdGVyZGFtKQogICAgICAgICAgICBNZW1iZXIgdGVtcGxhdGVzIG5vdyB3b3JrLiAgU2ltcGx5IHVzZSB0aGUgJXRlbXBsYXRlCiAgICAgICAgICAgIGRpcmVjdGl2ZSBpbnNpZGUgYSBjbGFzcyBvciAlYWRkbWV0aG9kcyB0byBjcmVhdGUKICAgICAgICAgICAgaW5zdGFudGlhdGlvbnMgKHNlZSBEb2MvTWFudWFsL1NXSUdQbHVzLmh0bWwpLiAgU3VwcG9ydGluZwogICAgICAgICAgICB0aGlzIHdhcyBlYXN5LS0tZWFybGllciBjaGFuZ2VzIHRvIHRlbXBsYXRlcyBtYWRlIGl0CiAgICAgICAgICAgIHBvc3NpYmxlIHVzaW5nIG9ubHkgYSB0d28tbGluZSBtb2RpZmljYXRpb24gdG8gdGhlIHBhcnNlcgogICAgICAgICAgICBhbmQgYSBmZXcgbWlub3IgbW9kaWZpY2F0aW9ucyBlbHNld2hlcmUuICBIbW1tLCBjb21lIHRvIAogICAgICAgICAgICB0aGluayBvZiBpdCwgdGhlIHNtb2tlIHdhcyByYXRoZXIgdGhpY2sgaW4gdGhhdCBJbnRlcm5ldCAiY2FmZSIuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAgCjA0LzE5LzIwMDI6IGJlYXpsZXkgKFRHVikKICAgICAgICAgICAgSW1wcm92ZWQgaGFuZGxpbmcgb2Ygbm9uLXR5cGUgdGVtcGxhdGUgcGFyYW1ldGVycy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICB2ZWN0b3I8aW50LDEwMD47CgogICAgICAgICAgICBTaW1wbGUgbnVtYmVycyBhbmQgc3RyaW5ncyBjYW4gYmUgdXNlZCB3aXRoIHRoZSAldGVtcGxhdGUKICAgICAgICAgICAgZGlyZWN0aXZlIGFzIHdlbGwuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY2ludDEwMCkgdmVjdG9yPGludCwxMDA+OwoKICAgICAgICAgICAgTm90ZTogQXJpdGhtZXRpYyBleHByZXNzaW9ucyBhcmUgbm90IGN1cnJlbnRseSBhbGxvd2VkLgogICAgICAgICAgICAKICAgICAgICAgICAgRGVmYXVsdCB0ZW1wbGF0ZSBhcmd1bWVudHMgbm93IHdvcmsgYW5kIGRvIG5vdCBoYXZlIHRvCiAgICAgICAgICAgIGJlIGdpdmVuIHRvICV0ZW1wbGF0ZS4KICAgICAgICAgICAgICAgICAgICAgICAgCjA0LzE4LzIwMDI6IGJlYXpsZXkgKFBhcmlzKQogICAgICAgICAgICBDaGFuZ2UgaW4gaW50ZXJuYWwgdGVtcGxhdGUgaGFuZGxpbmcuICBUZW1wbGF0ZQogICAgICAgICAgICBwYXJhbWV0ZXJzIGFyZSBub3cgZnVsbHkgaW50ZWdyYXRlZCBpbnRvIHRoZSB0eXBlCiAgICAgICAgICAgIHN5c3RlbSBhbmQgYXJlIGF3YXJlIG9mIHR5cGVkZWZzLCBldGMuICBUaGlzIGJ1aWxkcwogICAgICAgICAgICB1cG9uIHRoZSBjaGFuZ2UgYmVsb3cuICAgCgogICAgICAgICAgICAqKiogREVWRUxPUEVSIFdBUk5JTkcgKioqCiAgICAgICAgICAgIFdvcmQgb2YgY2F1dGlvbiB0byBsYW5ndWFnZSBtb2R1bGUgd3JpdGVycy4gIFRoZSAibmFtZSIKICAgICAgICAgICAgcGFyYW1ldGVyIG9mIGNlcnRhaW4gcGFyc2UgdHJlZSBub2RlcyAoY2xhc3NlcywgZnVuY3Rpb25zLCBldGMuKQogICAgICAgICAgICBtYXkgYmUgcGFyYW1ldGVyaXplZCB3aXRoIHR5cGVzLiAgIFRoaXMgcGFyYW1ldGVyaXphdGlvbiBpcwogICAgICAgICAgICBkb25lIHVzaW5nIFNXSUcgdHlwZS1zdHJpbmdzIGFuZCBub3QgdGhlIHVuZGVybHlpbmcgQyB2ZXJzaW9uLgogICAgICAgICAgICBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgIGludCBtYXg8aW50ICo+KGludCAqLGludCAqKSAgCgogICAgICAgICAgICBoYXMgYSBuYW1lIG9mICJtYXg8KHAuaW50KT4iLiAgSWYgeW91IHVzZSB0aGUgbmFtZSBkaXJlY3RseSwKICAgICAgICAgICAgeW91IG1heSBnZXQgc3ludGF4IGVycm9ycyBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuICBUbyBmaXggdGhpcywKICAgICAgICAgICAgdXNlIFN3aWdUeXBlX25hbWVzdHIobmFtZSkgdG8gY29udmVydCBhIHBhcmFtZXRlcml6ZWQgbmFtZSAKICAgICAgICAgICAgdG8gYSBDIG5hbWUgd2l0aCB2YWxpZCBzeW50YXguICBUaGUgaW50ZXJuYWwgdmVyc2lvbiBpcwogICAgICAgICAgICB1c2VkIHRvIHJlZHVjZSB0ZW1wbGF0ZSB0eXBlcyB0byBhIGNvbW1vbiByZXByZXNlbnRhdGlvbiAKICAgICAgICAgICAgYW5kIHRvIGhhbmRsZSBpc3N1ZXMgb2YgdHlwZWRlZi4KICAgICAgICAgICAgCjA0LzE2LzIwMDI6IGJlYXpsZXkgKHNvbWV3aGVyZSBvdmVyIHRoZSBBdGxhbnRpYykKICAgICAgICAgICAgRW5oYW5jZW1lbnQgb2YgdHlwZWRlZiByZXNvbHV0aW9uLiAgVGhlIHR5cGUgc3lzdGVtIGlzIG5vdwogICAgICAgICAgICBhd2FyZSBvZiB0ZW1wbGF0ZSBhcmd1bWVudHMgYW5kIHR5cGVkZWYuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IEludGVnZXI7CiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgIGZvbyh2ZWN0b3I8aW50PiAqeCwgdmVjdG9yPEludGVnZXI+ICp5KTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdmVjdG9yPGludD4gYW5kIHZlY3RvcjxJbnRlZ2VyPiBhcmUKICAgICAgICAgICAgdGhlIHNhbWUgdHlwZS4gICBUaGVyZSBpcyBzb21lIGludGVyYWN0aW9uIGJldHdlZW4gdGhpcwogICAgICAgICAgICBtZWNoYW5pc20gYW5kIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0eXBlbWFwcy4gIEZvciBleGFtcGxlLAogICAgICAgICAgICBhIHR5cGVtYXAgZGVmaW5lZCBmb3IgdmVjdG9yPGludD4gKiB3b3VsZCBhcHBseSB0byBlaXRoZXIgdHlwZS4KICAgICAgICAgICAgSG93ZXZlciwgYSB0eXBlbWFwIGZvciB2ZWN0b3I8SW50ZWdlcj4gKiB3b3VsZCBvbmx5IGFwcGx5IHRvCiAgICAgICAgICAgIHRoYXQgdHlwZS4KCiAgICAgICAgICAgIFR5cGVkZWZzIGFuZCB0eXBlbWFwcyBhbmQgbWF0Y2hlZCBieSBsZWZ0LW1vc3QgZXhwYW5zaW9uLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgdmVjdG9yPEludGVnZXIsSW50ZWdlcj4gLS0+IAogICAgICAgICAgICAgIHZlY3RvcjxpbnQsIEludGVnZXI+IC0tPgogICAgICAgICAgICAgIHZlY3RvcjxpbnQsIGludD4KCgowNC8yNC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIENoYW5nZXMgdG8gSmF2YSBzaGFkb3cgY2xhc3Nlcy4KICAgICAgICAgICAgT3ZlcmNvbWVzIGEgYnVnIHdoZXJlIHRoZSBtb2R1bGUgYXNzdW1lZCB0aGF0IGEgcG9pbnRlciB0byBhIGRlcml2ZWQKICAgICAgICAgICAgY2xhc3MgY291bGQgYmUgdXNlZCBpbiBwbGFjZSBvZiBhIHBvaW50ZXIgdG8gYSBiYXNlIGNsYXNzLiBUaGFua3MgCiAgICAgICAgICAgIHRvIFN0ZXBoZW4gTWNDYXVsIGZvciBhbmFseXNpbmcgdGhlIGJ1ZyBhbmQgc3VibWl0dGluZyBwYXRjaGVzLgoKICAgICAgICAgICAgQSBjb25zZXF1ZW5jZSBpcyB0aGF0IHRoZSBnZXRDUHRyKCkgbWV0aG9kIGluIGVhY2ggc2hhZG93IGNsYXNzIGhhcwogICAgICAgICAgICBkaXNhcHBlYXJlZCBhbmQgaGFzIGJlZW4gcmVwbGFjZWQgd2l0aCBhIGdldENQdHJYWFgoKSwgd2hlcmUgWFhYIGlzIHRoZSAKICAgICAgICAgICAgc2hhZG93IGNsYXNzIG5hbWUuIElmIHlvdSBoYXZlIGNvZGUgdGhhdCBwcmV2aW91c2x5IHVzZWQgZ2V0Q1B0cigpLCAKICAgICAgICAgICAgYW5kIHRoZSBhc3NvY2lhdGVkIGNsYXNzIGlzIHdyYXBwaW5nIGEgQyBzdHJ1Y3Qgb3IgYSBDKysgY2xhc3MgdGhhdAogICAgICAgICAgICBpcyBub3QgaW52b2x2ZWQgaW4gYW4gaW5oZXJpdGFuY2UgY2hhaW4sIGp1c3QgdXNlIHRoZSBuZXcgbWV0aG9kLiBJZgogICAgICAgICAgICBob3dldmVyLCB0aGUgY2xhc3MgaXMgaW52b2x2ZWQgaW4gYW4gaW5oZXJpdGFuY2UgY2hhaW4sIHlvdSdsbCBoYXZlCiAgICAgICAgICAgIHRvIGNob29zZSB3aGljaCBwb2ludGVyIHlvdSByZWFsbHkgd2FudC4gQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgCiAgICAgICAgICAgIGhhcyBiZWVuIGJyb2tlbiBhcyBub3QgdXNpbmcgdGhlIGNvcnJlY3QgcG9pbnRlciBjYW4gbGVhZCB0byB3ZWlyZCBidWdzCiAgICAgICAgICAgIHRocm91Z2ggaWxsLWRlZmluZWQgYmVoYXZpb3VyLiBJZiB5b3UgYXJlIHN1cmUgeW91IHdhbnQgdGhlIG9sZCBtZXRob2RzLCAKICAgICAgICAgICAgeW91IGNvdWxkIGFkZCB0aGVtIGJhY2sgaW50byBhbGwgc2hhZG93IGNsYXNzZXMgYnkgYWRkaW5nIHRoaXMgYXQgdGhlIAogICAgICAgICAgICBiZWdpbm5pbmcgb2YgeW91ciBpbnRlcmZhY2UgZmlsZToKCiAgICAgICAgICAgICVwcmFnbWEoamF2YSkgYWxsc2hhZG93Y29kZT0lewogICAgICAgICAgICAgIHB1YmxpYyBsb25nIGdldENQdHIoKXsKICAgICAgICAgICAgICAgIHJldHVybiBzd2lnQ1B0cjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICV9CgogICAgICAgICAgICBQbGVhc2Ugc2VlIGVudHJ5IGRhdGVkIDA3LzIzLzIwMDIgdG8gc2VlIGhvdyB0byBkbyB0aGlzIGFmdGVyIHRoZSBkZXByZWNhdGlvbgogICAgICAgICAgICBvZiB0aGUgYWxsc2hhZG93Y29kZSBwcmFnbWEuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNC8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBhbmQgcmVmZXJlbmNlcy4gICBEZWNsYXJhdGlvbnMgc3VjaCAKICAgICAgICAgICAgYXMgdGhpcyBzaG91bGQgbm93IHdvcms6CgogICAgICAgICAgICAgICAgdm9pZCBmb28oY29uc3Qgc3RyaW5nICZ4ID0gIkhlbGxvIik7CgowNC8xMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIHR5cGVtYXAgJCogc3Vic3RpdHV0aW9ucyBmb3IgdHlwZW1hcHMgaW52b2x2aW5nIGFycmF5cy4KICAgICAgICAgICAgUmVxdWVzdGVkIGJ5IFdpbGxpYW0gRnVsdG9uLgoKMDQvMTEvMjAwMjogYmVhemxleQogICAgICAgICAgICBUZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBpcyBub3cgc3VwcG9ydGVkLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICB0ZW1wbGF0ZTw+IGNsYXNzIHZlY3RvcjxpbnQ+IHsKICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBXaGVuIHRoZSAldGVtcGxhdGUgZGlyZWN0aXZlIGlzIHVzZWQsIGl0IHdpbGwgdXNlIGEgc3BlY2lhbGl6YXRpb24KICAgICAgICAgICAgaWYgb25lIGlzIGRlZmluZWQuICAgVGhlcmUgYXJlIHN0aWxsIHNvbWUgbGltaXRhdGlvbnMuIFBhcnRpYWwKICAgICAgICAgICAgc3BlY2lhbGl6YXRpb24gaXMgbm90IHN1cHBvcnRlZC4gIEEgdGVtcGxhdGUgb2YgdHlwZSA8dm9pZCAqPiBkb2VzCiAgICAgICAgICAgIG5vdCBtYXRjaCBhbGwgcG9pbnRlcnMuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA0LzExLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWFqb3IgY2hhbmdlIHRvIHRlbXBsYXRlIHdyYXBwaW5nIGludGVybmFscy4gVGVtcGxhdGUgZGVjbGFyYXRpb25zIGFyZQogICAgICAgICAgICBubyBsb25nZXIgcHJvY2Vzc2VkIGFzIG1hY3JvcyBidXQgbm93IHJlc3VsdCBpbiByZWFsIHBhcnNlLXRyZWUKICAgICAgICAgICAgbm9kZXMuICBUaGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBleHBhbmRzIHRoZXNlIG5vZGVzIGludG8gYQogICAgICAgICAgICBzcGVjaWZpYyBpbnN0YW50aWF0aW9uLiAgIFRoaXMgY2hhbmdlIGVuYWJsZXMgYSBudW1iZXIgb2YKICAgICAgICAgICAgbmV3IGFuZCBpbnRlcmVzdGluZyBjYXBhYmlsaXRpZXM6CgogICAgICAgICAgICBEaXJlY3RpdmVzIHN1Y2ggYXMgJXJlbmFtZSwgJWZlYXR1cmUsIGFuZCAlYWRkbWV0aG9kcyBjYW4KICAgICAgICAgICAgbm93IGJlIGFwcGxpZWQgdG8gdW5pbnN0YW50aWF0ZWQgdGVtcGxhdGVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVyZW5hbWUoYmFyc2l6ZSkgdmVjdG9yOjpiYXIoY2hhciAqYnVmLCBpbnQgbGVuKTsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyB2ZWN0b3IgewogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB2b2lkIGJhcihjaGFyICpidWYpOwogICAgICAgICAgICAgICAgIHZvaWQgYmFyKGNoYXIgKmJ1ZiwgaW50IGxlbik7ICAgLy8gUmVuYW1lZAogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICV0ZW1wbGF0ZShpbnR2ZWN0b3IpIHZlY3RvcjxpbnQ+OyAgIC8vIFJlbmFtaW5nIGNhcnJpZXMgdGhyb3VnaAoKICAgICAgICAgICAgCiAgICAgICAgICAgIEJ5IHBhcnNpbmcgdGVtcGxhdGVzIGludG8gYW4gaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUsIGl0IHdpbGwKICAgICAgICAgICAgYmUgcG9zc2libGUgdG8gc3VwcG9ydCBzcGVjaWFsaXphdGlvbiAoYW5kIG1heWJlIHBhcnRpYWwKICAgICAgICAgICAgc3BlY2lhbGl6YXRpb24pLgogICAgICAgICAgICAKICAgICAgICAgICAgVGhpcyBpcyBoaWdobHkgZXhwZXJpbWVudGFsIGFuZCBhIHdvcmsgaW4gcHJvZ3Jlc3MuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgSW4gU1dJRy0xLjMuMTEsIHRlbXBsYXRlIGRlY2xhcmF0aW9ucyB3ZXJlIHNpbXBseSBwcm9jZXNzZWQKICAgICAgICAgICAgYXMgd2VpcmQgbWFjcm9zLiAgTm8gb3RoZXIgaW5mb3JtYXRpb24gd2FzIHJldGFpbmVkLiAgIFRoaXMgCiAgICAgICAgICAgIG1hZGUgaXQgaW1wb3NzaWJsZSB0byBzdXBwb3J0IG1vcmUgYWR2YW5jZWQgZmVhdHVyZXMgYW5kIAogICAgICAgICAgICBjb21wbGljYXRlZCBtYW55IG90aGVyIHBhcnRzIG9mIHRoZSBpbXBsZW1lbnRhdGlvbi4KCjA0LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQ2hhbmdlIHRvIHRlbXBsYXRlIGNsYXNzIHdyYXBwaW5nLiAgIFRoZXJlIHdlcmUgYSB2YXJpZXR5IG9mCiAgICAgICAgICAgICJpc3N1ZXMiIHdpdGggdGhlIG9sZCBhcHByb2FjaCByZWxhdGVkIHRvIHBhcnNpbmcsIHRoZSB0eXBlCiAgICAgICAgICAgIHN5c3RlbSwgYW5kIG5hbWVzcGFjZXMuICAgVGhlc2UgY2hhbmdlcyBhcmUgbWVhbnQgdG8gcmVjdGlmeQogICAgICAgICAgICBzb21lIG9mIHRoZXNlIHByb2JsZW1zOgoKICAgICAgICAgICAgQSBzcGVjaWZpYyBpbnN0YW50aWF0aW9uIG9mIGEgdGVtcGxhdGUgY2FuIG5vdyBiZSBzcGVjaWZpZWQKICAgICAgICAgICAgYnkgaW5jbHVkaW5nIHRoZSBjbGFzcyBpbmxpbmUgbGlrZSB0aGlzOgogCiAgICAgICAgICAgICAgICAgIGNsYXNzIHZlY3RvcjxpbnQ+IHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcigpOwogICAgICAgICAgICAgICAgICAgICAgfnZlY3RvcigpOwogICAgICAgICAgICAgICAgICAgICAgIC4uLiB3aGF0ZXZlciAuLi4KCSAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGlzIGlzIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uLCBidXQgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBpcwogICAgICAgICAgICBub3QgeWV0IGltcGxlbWVudGVkLgogICAgICAgICAgICAKICAgICAgICAgICAgVGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgaGFzIGJlZW4gbW9kaWZpZWQgdG8gZXhwYW5kIHJvdWdobHkgYXMKICAgICAgICAgICAgZm9sbG93czoKCiAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY2ludCkgdmVjdG9yPGludD47CgogICAgICAgICAgICBiZWNvbWVzCgogICAgICAgICAgICAgICAgICVyZW5hbWUodmVjaW50PiB2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICAgICBjbGFzcyB2ZWN0b3I8aW50PiB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICB2ZWN0b3IoKTsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIE5vdGUgdGhhdCB0aGlzIHNpbXBseSBidWlsZHMgdXBvbiB0aGUgY29kZSBhYm92ZSAodGVtcGxhdGVzCiAgICAgICAgICAgIGluY2x1ZGVkIGlubGluZSkuCgogICAgICAgICAgICBUaGlzIG1vZGlmaWVkIGFwcHJvYWNoIHRvIHdyYXBwaW5nIGZpeGVzIHNvbWUgc3VidGxlIHR5cGUKICAgICAgICAgICAgaXNzdWVzLiAgRm9yIGluc3RhbmNlLCB5b3UgY2FuIG5vdyBkZWZpbmUgdHlwZW1hcHMgYW5kIHR5cGVkZWZzCiAgICAgICAgICAgIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHZlY3RvcjxpbnQ+ICogewogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB0eXBlZGVmIHZlY3RvcjxpbnQ+IGludHZlY3RvcjsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoaW50dmVjdG9yICp2KTsgICAvLyBHZXRzIHRoZSBhYm92ZSB0eXBlbWFwCgogICAgICAgICAgICBUaGlzIGRpZCBub3Qgd29yayBpbiBTV0lHLTEuMy4xMSBkdWUgdG8gYSBwZWN1bGlhcml0eSBvZgogICAgICAgICAgICB0aGUgdGVtcGxhdGUgaW1wbGVtZW50YXRpb24uCgogICAgICAgICAgICAldGVtcGxhdGUobmFtZSkgbm8gbG9uZ2VyIGluc3RhbGxzIHRoZSB0ZW1wbGF0ZSBhcyBhIGNsYXNzCiAgICAgICAgICAgIHdpdGggbmFtZSAibmFtZSIuICAgVGhpcyBtaWdodCBicmVhayAlYWRkbWV0aG9kcyBhcyBkZXNjcmliZWQKICAgICAgICAgICAgaW4gdGhlIG1hbnVhbC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjaW50KSB2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICAgICAlYWRkbWV0aG9kcyB2ZWNpbnQgeyAgICAvLyBGYWlscy4gdmVjaW50IG5vdCBhIGNsYXNzCiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgIAogICAgICAgICAgICBUbyBmaXggdGhpcywganVzdCB1c2UgdGhlIHRlbXBsYXRlIG5hbWUgaW5zdGVhZDoKCiAgICAgICAgICAgICAgICAgJWFkZG1ldGhvZHMgdmVjdG9yPGludD4gewogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBOb3RlOiBUaGlzIHRlY2huaXF1ZSBtaWdodCBiZSBhIHdheSB0byBpbXBsZW1lbnQgc29tZSBiaXphcnJlCiAgICAgICAgICAgIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIHRlY2huaXF1ZXMuICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICVhZGRtZXRob2RzIHZlY3RvcjxpbnQ+IHsKICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBhcHBsaWVkIGlmIHZlY3RvcjxpbnQ+IGluc3RhbnRpYXRlZCBsYXRlcgogICAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgdmVjdG9yPGludD4gKiB7CiAgICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgIAowNC8wOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTQwODY4IF0gI2lmIGRlZmluZWQgd2hhdGV2ZXIgLSBub3QgcGFyc2VkLiAgU1dJRyBzaG91bGQKICAgICAgICAgICAgbm93IGNvcnJlY3RseSBoYW5kbGUgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICNpZiBkZWZpbmVkIF9fY3BsdXNwbHVzCiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICNlbmRpZgogICAgICAgICAgICAgCiAgICAgICAgICAgIE5vdGU6IHdhcyBpbXBsZW1lbnRlZCBwcmV2aW91c2x5LCBidXQgdGhlcmUgd2FzIGEgbWlub3IgYnVnLgogICAgICAgICAgICBSZXBvcnRlZCBieSBBZGFtIEh1cHAuCiAgICAgICAgICAgICAgICAgICAKMDQvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICAlcmVhZG9ubHkgYW5kICVyZWFkd3JpdGUgYXJlIGRlcHJlY2F0ZWQgZHVlIHRvIGEgY2hhbmdlIGluIHRoZSAKICAgICAgICAgICAgaW1wbGVtZW50YXRpb24uICBJbnN0ZWFkIG9mIGJlaW5nIHByYWdtYXMsIG11dGFiaWxpdHkgaXMgbm93CiAgICAgICAgICAgIGNvbnRyb2xsZWQgYXMgYSAiZmVhdHVyZSIgdXNpbmcgdGhlIGZvbGxvd2luZyB0d28gZGlyZWN0aXZlczoKCiAgICAgICAgICAgICAgICAgJWltbXV0YWJsZTsKICAgICAgICAgICAgICAgICBpbnQgeDsgICAgICAgICAgIC8vIHJlYWQtb25seSB2YXJpYWJsZQogICAgICAgICAgICAgICAgIGludCB5OyAgICAgICAgICAgLy8gcmVhZC1vbmx5IHZhcmlhYmxlCiAgICAgICAgICAgICAgICAgJW11dGFibGU7CiAgICAgICAgICAgICAgICAgaW50IHo7ICAgICAgICAgICAvLyBNb2RpZmlhYmxlCgogICAgICAgICAgICAlaW1tdXRhYmxlIGFuZCAlbXV0YWJsZSBhcmUgbXVjaCBtb3JlIHBvd2VyZnVsIHRoYW4gdGhlaXIgb2xkZXIKICAgICAgICAgICAgY291bnRlcnBhcnRzLiAgVGhleSBjYW4gbm93IHBpbnBvaW50IGEgc3BlY2lmaWMgZGVjbGFyYXRpb24gbGlrZQogICAgICAgICAgICB0aGlzOgoKICAgICAgICAgICAgICAgJWltbXV0YWJsZSAgeDsgICAgICAgICAvKiBBbnkgeCAqLwogICAgICAgICAgICAgICAlaW1tdXRhYmxlICBGb286Ong7ICAgIC8qIHggaW4gY2xhc3MgRm9vICovCgogICAgICAgICAgICBJbiBmYWN0LCB0aGUgbWF0Y2hpbmcgYWxnb3JpdGhtIGlzIHRoZSBzYW1lIGFzIGZvciAlcmVuYW1lLCAKICAgICAgICAgICAgJWlnbm9yZSwgYW5kIG90aGVyIGRpcmVjdGl2ZXMuICAgVGhpcyBtZWFucyB0aGF0IHRoZSBkZWNsYXJhdGlvbgogICAgICAKICAgICAgICAgICAgICAgJWltbXV0YWJsZSAgRm9vOjp4OwoKICAgICAgICAgICAgd291bGQgbm90IG9ubHkgYXBwbHkgdG8gY2xhc3MgRm9vIGJ1dCB0byBhbGwgZGVyaXZlZCBjbGFzc2VzCiAgICAgICAgICAgIGFzIHdlbGwuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgJWltbXV0YWJsZSBhbmQgJW11dGFibGUgbXVzdCBiZSB0ZXJtaW5hdGVkIGJ5IGEgc2VtaS1jb2xvbi4gIFRoaXMKICAgICAgICAgICAgZGlmZmVycyBzbGlnaHRseSBmcm9tIHRoZSBvbGRlciAlcmVhZG9ubHkgYW5kICVyZWFkd3JpdGUgZGlyZWN0aXZlcy4KICAgICAgICAgICAgU2luY2UgJWltbXV0YWJsZSBhbmQgJW11dGFibGUgY2FuIGJlIGFwcGxpZWQgdG8gZGVjbGFyYXRpb25zIHRoZQogICAgICAgICAgICBzZW1pY29sb24gaXMgbmVlZGVkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gYSBnbG9iYWwgZmVhdHVyZSBhbmQgCiAgICAgICAgICAgIG9uZSB0YXJnZXRlZCB0byBhIHNpbmdsZSBkZWNsYXJhdGlvbi4gIE5vdGU6IHRoaXMgaW5jb21wYXRpYmlsaXR5IGlzIHRoZQogICAgICAgICAgICBwcmltYXJ5IHJlYXNvbiBmb3IgY2hhbmdpbmcgdGhlIG5hbWUgb2YgdGhlIGRpcmVjdGl2ZS4KCjA0LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3IGhhbmRsaW5nIG9mIGNvcHkgY29uc3RydWN0b3JzLiAgSWYgYSBjbGFzcyBkZWZpbmVzIAogICAgICAgICAgICBjb25zdHJ1Y3RvcnMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICBGb28oKTsKICAgICAgICAgICAgICAgICAgICAgIEZvbyhjb25zdCBGb28gJik7ICAgICAgIC8vIENvcHkgY29uc3RydWN0b3IKICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFNXSUcgbm93IGdlbmVyYXRlcyBhIGZ1bmN0aW9uIGNvcHlfRm9vKCkgZm9yIHRoZSBjb3B5CiAgICAgICAgICAgIGNvbnN0cnVjdG9yLgoKICAgICAgICAgICAgSW4gcHJldmlvdXMgdmVyaW9ucywgdGhpcyBnZW5lcmF0ZWQgYSBuYW1lLWNsYXNoIGFuZCBhbgogICAgICAgICAgICBlcnJvciBtZXNzYWdlLiAgIFRvIHByZXNlcnZlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBTV0lHCiAgICAgICAgICAgIGRvZXMgbm90IGNoYW5nZSB0aGUgYmVoYXZpb3IgaWYgJXJlbmFtZSBpcyB1c2VkIHRvIHJlc29sdmUKICAgICAgICAgICAgdGhlIG5hbWUgY29uZmxpY3QuICAgSG93ZXZlciwgaWYgbm8gbmFtZSByZXNvbHV0aW9uIGlzIG1hZGUsCiAgICAgICAgICAgIHRoaXMgbmV3IGFwcHJvYWNoIGlzIHVzZWQuCgogICAgICAgICAgICBDb3B5IGNvbnN0cnVjdG9ycyBtYXkgYmUgaGFuZGxlZCBhcyBhIHNwZWNpYWwgY2FzZSBpbiB0aGUKICAgICAgICAgICAgdGFyZ2V0IGxhbmd1YWdlLiAgSG93ZXZlciwgdGhpcyBpcyB1cCB0byB0aGUgbGFuZ3VhZ2UgbW9kdWxlCiAgICAgICAgICAgIGl0c2VsZi4KICAgICAgICAgICAgICAgICAgCjA0LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgaXMgbm93IG5hbWVzcGFjZSBhd2FyZS4gICBUaGlzIGFsbG93cwogICAgICAgICAgICBjb2RlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgZm9vIHsKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBtYXgoVCBhLCBUIGIpIHsgcmV0dXJuIGEgPiBiID8gYSA6IGI7IH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2UgZm9vOwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKG1heGludCkgbWF4PGludD47ICAgICAgICAgICAgLy8gT2sKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgYmFyIHsKICAgICAgICAgICAgICAgICAgIHVzaW5nIGZvbzo6bWF4OwogICAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKG1heGRvdWJsZSkgbWF4PGRvdWJsZT47ICAgLy8gT2sKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIENhdmVhdDogdGhlIHRlbXBsYXRlIG5hbWUgc3VwcGxpZWQgdG8gJXRlbXBsYXRlIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUKICAgICAgICAgICAgc2FtZSBzY29wZSBpbiB3aGljaCB0aGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBhcHBlYXJzLiAgIFRoaXMgY29kZSBpcwogICAgICAgICAgICBpbGxlZ2FsOgoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShtYXhpbnQpIGZvbzo6bWF4PGludD47CgowNC8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIGVuaGFuY2VtZW50IHRvIHByZXByb2Nlc3Nvci4gICBUaGUgcHJlcHJvY2Vzc29yIGNhbiBub3cgcGVyZm9ybQogICAgICAgICAgICBzdHJpbmcgY29tcGFyaXNvbi4gICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICNkZWZpbmUgQSAiaGVsbG8iCiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAjaWYgQSA9PSAiaGVsbG8iCiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAjZW5kaWYKCiAgICAgICAgICAgIFRoZSBwcmltYXJ5IHVzZSBvZiB0aGlzIGlzIGluIFNXSUcgbWFjcm9zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVkZWZpbmUgRk9PKHgpIAogICAgICAgICAgICAgICNpZiAjeCA9PSAiaW50IgogICAgICAgICAgICAgIC8qIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGludCAqLwogICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICNlbmRpZgogICAgICAgICAgICAgICVlbmRkZWYKCiAgICAgICAgICAgIE5vcm1hbCB1c2VycyBjYW4gcHJvYmFibHkgc2FmZWx5IGlnbm9yZSB0aGlzIGZlYXR1cmUuICBIb3dldmVyLCBpdCBtYXkKICAgICAgICAgICAgYmUgdXNlZCBpbiBwYXJ0cyBvZiB0aGUgU1dJRyBsaWJyYXJ5LgoKMDQvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGdXJ0aGVyIHJlZmluZW1lbnQgb2YgZGVmYXVsdCBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIHdyYXBwZXIgZ2VuZXJhdGlvbi4KICAgICAgICAgICAgU1dJRyBpcyBub3cgbXVjaCBtb3JlIGF3YXJlIG9mIHB1cmUgdmlydHVhbCBtZXRob2RzLiBGb3IgaW5zdGFuY2U6CgogICAgICAgICAgICAgIGNsYXNzIEEgeyAgICAgICAgICAgICAvKiBBYnN0cmFjdCAqLwogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgbWV0aG9kMSgpID0gMDsKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgbWV0aG9kMigpID0gMDsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIGNsYXNzIEIgOiBwdWJsaWMgQSB7ICAvKiBBYnN0cmFjdCAqLwogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgbWV0aG9kMSgpIHsgfTsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICBjbGFzcyBDIDogcHVibGljIEIgeyAgLyogT2sgKi8KICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIG1ldGhvZDIoKSB7IH07CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgU1dJRyB3aWxsIG9ubHkgZ2VuZXJhdGUgZGVmYXVsdCBjb25zdHJ1Y3RvcnMgZm9yIEMuCiAgICAgICAgICAgIEV2ZW4gdGhvdWdoIEIgbG9va3MgZmluZSwgaXQncyBtaXNzaW5nIGEgcmVxdWlyZWQgbWV0aG9kIGFuZCBpcyBhYnN0cmFjdC4KCjA0LzA0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU3VidGxlIGNoYW5nZSB0byBzdHJ1Y3R1cmUgZGF0YSBtZW1iZXIgYWNjZXNzLiAgSWYgeW91CiAgICAgICAgICAgIGhhdmUgYSBzdHJ1Y3R1cmUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICAgIEJhciAgIGI7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIGFjY2Vzc29yIGZ1bmN0aW9ucyBmb3IgYiBhcmUgZ2VuZXJhdGVkIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAoMSkgSWYgYiBpcyAqbm90KiBkZWZpbmVkIGFzIGEgc3RydWN0dXJlIG9yIGNsYXNzOgoKICAgICAgICAgICAgICAgIEJhciBGb29fYl9nZXQoRm9vICpzZWxmKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYtPmI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2b2lkIEZvb19iX3NldChGb28gKnNlbGYsIEJhciB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHNlbGYtPmIgPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICgyKSBJZiBiICppcyogZGVmaW5lZCBhcyBhIHN0cnVjdHVyZSBvciBjbGFzczoKCiAgICAgICAgICAgICAgICBCYXIgKkZvb19iX2dldChGb28gKnNlbGYpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJnNlbGYtPmI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2b2lkIEZvb19iX3NldChGb28gKnNlbGYsIEJhciAqdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLT5iID0gKnZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBTZWUgdGhlICJTdHJ1Y3R1cmUgZGF0YSBtZW1iZXJzIiBzZWN0aW9uIG9mIERvYy9NYW51YWwvU1dJRy5odG1sCiAgICAgICAgICAgIGZvciBmdXJ0aGVyIGRldGFpbHMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgVGhpcyBtYXkgYnJlYWsgaW50ZXJmYWNlcyB0aGF0IHJlbGllZCBvbiBhIGxvdCBvZiBhIHVuZGVjbGFyZWQKICAgICAgICAgICAgc3RydWN0dXJlIGFuZCBjbGFzcyBuYW1lcy4gICAgVG8gZ2V0IHRoZSBvbGQgYmVoYXZpb3IsIHNpbXBseQogICAgICAgICAgICB1c2UgYSBmb3J3YXJkIGRlY2xhcmF0aW9uIHN1Y2ggYXMgInN0cnVjdCBCYXI7IgogICAgICAgICAgICAKMDQvMDQvMjAwMjogYmVhemxleQogICAgICAgICAgICBDKysgbmFtZXNwYWNlIHN1cHBvcnQgYWRkZWQuICBTV0lHIHN1cHBvcnRzIGFsbCBhc3BlY3RzIG9mCiAgICAgICAgICAgIG5hbWVzcGFjZXMgaW5jbHVkaW5nIG5hbWVzcGFjZSwgdXNpbmcsIGFuZCBuYW1lc3BhY2UgYWxpYXMKICAgICAgICAgICAgZGVjbGFyYXRpb25zLiAgICBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiBTV0lHIGlzIHRvIGZsYXR0ZW4KICAgICAgICAgICAgbmFtZXNwYWNlcyBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLiAgSG93ZXZlciwgbmFtZXNwYWNlcyBhcmUKICAgICAgICAgICAgZnVsbHkgc3VwcG9ydGVkIGF0IHRoZSBDKysgbGV2ZWwgYW5kIGluIHRoZSB0eXBlIHN5c3RlbS4KICAgICAgICAgICAgU2VlIERvYy9NYW51YWwvU1dJR1BsdXMuaHRtbCBmb3IgZGV0YWlscyBvbiB0aGUgaW1wbGVtZW50YXRpb24uCiAgICAgCjA0LzAyLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gU3VuIGhhcyBtb2RpZmllZCBqYXZhYyBpbiBqZGsxLjQgdG8gbm8gbG9uZ2VyIGNvbXBpbGUKICAgICAgICAgICAgYW4gaW1wb3J0IG9mIGFuIHVubmFtZWQgbmFtZXNwYWNlLiBUbyBmaXggdGhpcyBTV0lHIG5vIGxvbmdlciAKICAgICAgICAgICAgZ2VuZXJhdGVzIHRoZSBpbXBvcnQgZm9yIHBhY2thZ2VsZXNzIGNsYXNzZXMuCiAgICAgICAgICAgIGh0dHA6Ly9kZXZlbG9wZXIuamF2YS5zdW4uY29tL2RldmVsb3Blci9idWdQYXJhZGUvYnVncy80MzYxNTc1Lmh0bWwKICAgICAgICAgICAgQXMgcmVwb3J0ZWQgU0YgIzUzODQxNS4KCjAzLzI3LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBzdXBwb3J0IGZvciBwb2ludGVyLXRvLW1lbWJlciwgc2ltaWxhciB0byB0aGF0CiAgICAgICAgICAgIGZvciB0aGUgUHl0aG9uIG1vZHVsZS4gUmVtYXJrYWJseSBzaW1pbGFyLiBBbHNvIGFkZGVkIGEgbmV3CiAgICAgICAgICAgIGV4YW1wbGUgZm9yIHRoaXMgKEV4YW1wbGVzL3J1YnkvbXBvaW50ZXIpLCB3aGljaCBpcyByZW1hcmthYmx5CiAgICAgICAgICAgIHNpbWlsYXIgdG8gdGhlIFB5dGhvbiBleGFtcGxlIG9mIHRoZSBzYW1lIG5hbWUuCgowMy8yNi8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gTWFkZSBhIGZldyBtaW5vciBlZGl0cyB0byB0aGUgIkFkdmFuY2VkIFRvcGljcyIKICAgICAgICAgICAgY2hhcHRlciBvZiB0aGUgU1dJRyBtYW51YWwgYW5kIGFkZGVkIGEgbmV3IG1ham9yIHNlY3Rpb24KICAgICAgICAgICAgYWJvdXQgaG93IHRvIGNyZWF0ZSBtdWx0aS1tb2R1bGUgUnVieSBwYWNrYWdlcyB3aXRoIFNXSUcuCgowMy8yNi8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gUmVtb3ZlZCBhbGwgb2YgdGhlIG9sZCBSdWJ5IHByYWdtYXMuIElmIGFueSBvZiB0aGlzCiAgICAgICAgICAgIGZ1bmN0aW9uYWxpdHkgaXMgdHJ1bHkgbWlzc2VkIHdlIGNhbiByZXN1cnJlY3QgaXQsIHByZWZlcmFibHkKICAgICAgICAgICAgd2l0aCBzb21lIGtpbmQgb2YgZmVhdHVyZS1iYXNlZCBkaXJlY3RpdmUuCiAgICAgICAgICAgIAowMy8yNS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gRml4ZWQgU1dJRyBleGNlcHRpb24gbGlicmFyeSBzdXBwb3J0IGZvciBSdWJ5LCB3aGljaAogICAgICAgICAgICBoYXMgYXBwYXJlbnRseSBiZWVuIGJyb2tlbiBmb3Igc29tZSB0aW1lLiBMdWNraWx5LCBubyBvbmUgc2VlbXMKICAgICAgICAgICAgdG8gaGF2ZSBub3RpY2VkLgoKMDMvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBDKystbmFtZXNwYWNlIHN1cHBvcnQgaW4gU1dJRyBkaXJlY3RpdmVzLgoKICAgICAgICAgICAgJWFkZG1ldGhvZHM6IAoKICAgICAgICAgICAgVGhlICVhZGRtZXRob2RzIGRpcmVjdGl2ZSBub3cgYWNjZXB0cyBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUKICAgICAgICAgICAgYW5kIGNhbiBiZSB1c2VkIGluc2lkZSBDKysgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAvLyBBdHRhY2hlcyB0byB0aGUgY2xhc3MgRm9vOjpCYXIgYmVsb3cKICAgICAgICAgICAgICAgICAlYWRkbWV0aG9kcyBGb286OkJhciB7CiAgICAgICAgICAgICAgICAgICAgIGludCBzb21lbWV0aG9kKCkgeyAuLi4gfQogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBGb28gewogICAgICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIC8vIEF0dGFjaGVzIHRvIHRoZSBjbGFzcyBCYXIgYWJvdmUKICAgICAgICAgICAgICAgICAgICAlYWRkbWV0aG9kcyBCYXIgewogICAgICAgICAgICAgICAgICAgICAgaW50IG90aGVybWV0aG9kKCkgeyAuLi4gfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgJWZlYXR1cmUsICVyZW5hbWUsICVpZ25vcmUsICVleGNlcHRpb24sIGFuZCByZWxhdGVkIGRpcmVjdGl2ZXM6CgogICAgICAgICAgICBOYW1lc3BhY2VzIGFyZSBmdWxseSBpbnRlZ3JhdGVkIGludG8gdGhlIHJlbmFtaW5nIGFuZCBkZWNsYXJhdGlvbgogICAgICAgICAgICBtYXRjaGVyLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICVyZW5hbWUoZGlzcGxheSkgRm9vOjpwcmludDsgICAgICAgICAgLy8gUmVuYW1lIGluIG5hbWVzcGFjZSBGb28KICAgICAgICAgICAgICAgICAlaWdub3JlIEZvbzo6QmFyOjpibGFoOyAgICAgICAgICAgICAgIC8vIElnbm9yZSBhIGRlY2xhcmF0aW9uCgogICAgICAgICAgICAlcmVuYW1lIGRpcmVjdGl2ZXMgY2FuIGJlIHBsYWNlZCBpbnNpZGUgbmFtZXNwYWNlIGJsb2NrcyBhcyB3ZWxsLiBGb3IKICAgICAgICAgICAgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgRm9vIHsKICAgICAgICAgICAgICAgICAgICVyZW5hbWUoZGlzcGxheSkgcHJpbnQ7ICAgICAgICAgLy8gQXBwbGllcyB0byBwcmludCBiZWxvdwoKICAgICAgICAgICAgICAgICAgIHZvaWQgcHJpbnQoKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBNb3N0IG90aGVyIFNXSUcgZGlyZWN0aXZlcyBzaG91bGQgd29yayBwcm9wZXJseSBpbnNpZGUgbmFtZXNwYWNlcy4KICAgICAgICAgICAgTm8gb3RoZXIgY2hhbmdlcyBhcmUgbmVlZGVkLgogICAgICAKMDMvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBTb21lIGNoYW5nZXMgdG8gaW50ZXJuYWwgc3ltYm9sIHRhYmxlIGhhbmRsaW5nLiAgIFNXSUcgbm8gbG9uZ2VyCiAgICAgICAgICAgIG1hbmFnZXMgc3RydWN0dXJlcyBhbmQgdW5pb25zIGluIGEgc2VwYXJhdGUgbmFtZXNwYWNlIHRoYW4gbm9ybWFsCiAgICAgICAgICAgIGRlY2xhcmF0aW9ucyBsaWtlIEFOU0kgQy4gIFRoaXMgbWVhbnMgeW91IGNhbid0IGhhdmUgYSBzdHJ1Y3R1cmUKICAgICAgICAgICAgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIGEgZnVuY3Rpb24uICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaW50IEZvbygpIHsgLi4uIH0KCiAgICAgICAgICAgIFRoaXMgYXBwcm9hY2ggaXMgbW9yZSBsaWtlIEMrKy4gICBJdCdzIG5vdCBjbGVhciB0aGF0IFNXSUcgZXZlcgogICAgICAgICAgICByZWFsbHkgc3VwcG9ydGVkIHRoZSBBTlNJIEMgYW55d2F5cy0tLXVzaW5nIHRoZSBzYW1lIG5hbWUgd291bGQKICAgICAgICAgICAgYWxtb3N0IGNlcnRhaW5seSBnZW5lcmF0ZSBhIG5hbWUtY2xhc2ggaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4KCjAzLzIyLzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBGaXhlZCBbIDUxNzMwMiBdIGZvciBoYW5kbGluZyBvZiByZW5hbWVkIG92ZXJsb2FkZWQKICAgICAgICAgICAgY29uc3RydWN0b3JzLiBOb3csIHJlbmFtZWQgb3ZlcmxvYWRlZCBjb25zdHJ1Y3RvcnMgYXJlIGNvbnZlcnRlZAogICAgICAgICAgICBpbnRvIGNsYXNzIHNpbmdsZXRvbiBtZXRob2RzIChiYXNpY2FsbHkgYWN0aW5nIGFzICJmYWN0b3J5IgogICAgICAgICAgICBtZXRob2RzKS4KCjAzLzIxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1MzI5NTcgXSAlaWdub3JlIHBhcnNlIGVycm9yIGFuZCBjYXN0aW5nIG9wZXJhdG9yLgogICAgICAgICAgICBSZXBvcnRlZCBieSBXaWxsaWFtIEZ1bHRvbi4KCjAzLzE4LzIwMDI6IGJlYXpsZXkgKCoqIEFEVkFOQ0VEIFVTRVJTIE9OTFkgKiopCiAgICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIGR5bmFtaWMgY2FzdGluZyBpbiByZXR1cm4gdmFsdWVzLiAgQSBzb21ld2hhdAogICAgICAgICAgICBjb21tb24gcHJvYmxlbSBpbiBjZXJ0YWluIEMrKyBwcm9ncmFtcyBpcyBmdW5jdGlvbnMgdGhhdCBoaWRlCiAgICAgICAgICAgIHRoZSBpZGVudGl0eSBvZiB1bmRlcmx5aW5nIG9iamVjdHMgd2hlbiB0aGV5IGFyZSByZXR1cm5lZCAKICAgICAgICAgICAgZnJvbSBtZXRob2RzIGFuZCBmdW5jdGlvbnMuICBGb3IgZXhhbXBsZSwgYSBwcm9ncmFtIG1pZ2h0IGluY2x1ZGUKICAgICAgICAgICAgc29tZSBnZW5lcmljIG1ldGhvZCBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICAgICAgTm9kZSAqZ2V0Tm9kZSgpOwoKICAgICAgICAgICAgSG93ZXZlciwgTm9kZSAqIG1heSBqdXN0IGJlIGJhc2UgY2xhc3MgdG8gYSB3aG9sZSBoaWVyYXJjaHkKICAgICAgICAgICAgb2YgZGlmZmVyZW50IG9iamVjdHMuICAgSW5zdGVhZCBvZiByZXR1cm5pbmcgdGhpcyBnZW5lcmljIE5vZGUgKiwKICAgICAgICAgICAgaXQgbWlnaHQgYmUgbmljZSB0byBhdXRvbWF0aWNhbGx5IGRvd25jYXN0IHRoZSBvYmplY3QgaW50byB0aGUKICAgICAgICAgICAgYXBwcm9wcmlhdGUgdHlwZSB1c2luZyBzb21lIGtpbmQgZHluYW1pYyBjYXN0LgoKICAgICAgICAgICAgQXNzdW1pbmcgeW91IHVuZGVyc3RhbmQgdGhlIHBlcmlsIGludm9sdmVkLCBhIGRvd25jYXN0IGNhbiBub3cKICAgICAgICAgICAgYmUgcGVyZm9ybWVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gaW4gdGhlIHJ1bi10aW1lIHR5cGUKICAgICAgICAgICAgY2hlY2tlcjoKCiAgICAgICAgICAgICAgc3dpZ190eXBlX2luZm8gKlNXSUdfVHlwZUR5bmFtaWNDYXN0KHN3aWdfdHlwZV9pbmZvICosIHZvaWQgKipwdHIpOwoKICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBjaGVja3MgdG8gc2VlIGlmIHRoZSB0eXBlIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYW5vdGhlcgogICAgICAgICAgICB0eXBlLiAgSWYgc28sIGEgZGlmZmVyZW50IHR5cGUgZGVzY3JpcHRvciAoZm9yIHRoZSBjb252ZXJ0ZWQgdHlwZSkKICAgICAgICAgICAgaXMgcmV0dXJuZWQuICAgVGhpcyB0eXBlIGRlc2NyaXB0b3Igd291bGQgdGhlbiBiZSB1c2VkIHRvIGNyZWF0ZQogICAgICAgICAgICBhIHBvaW50ZXIgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4KCiAgICAgICAgICAgIFRvIHVzZSB0aGlzLCB5b3Ugd291bGQgd3JpdGUgYSB0eXBlbWFwIHNpbWlsYXIgdG8gdGhpczoKCiAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBOb2RlICogewogICAgICAgICAgICAgICAgc3dpZ190eXBlX2luZm8gKnR5ID0gU1dJR19UeXBlRHluYW1pY0Nhc3QoJDFfZGVzY3JpcHRvciwgKHZvaWQgKiopICYkMSk7CiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gU1dJR19OZXdQb2ludGVyT2JqKCQxLCB0eSk7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgQWx0ZXJuYXRpdmVseSwKCiAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBOb2RlICogPSBTV0lHVFlQRSAqRFlOQU1JQzsKCiAgICAgICAgICAgIFRvIG1ha2UgdGhlIHR5cGVtYXAgaGF2ZSBhbnkgZWZmZWN0LCB5b3UgaGF2ZSB0byB3cml0ZSBhIHN1cHBvcnRpbmcgCiAgICAgICAgICAgIGZ1bmN0aW9uIHRoYXQga25vd3MgaG93IHRvIHBlcmZvcm0gZG93bmNhc3RpbmcuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgIHN0YXRpYyBzd2lnX3R5cGVfaW5mbyAqCiAgICAgICAgICAgICAgTm9kZV9keW5hbWljX2Nhc3Qodm9pZCAqKnB0cikgewogICAgICAgICAgICAgICAgIE5vZGUgKipucHRyID0gKE5vZGUgKiopIHB0cjsKICAgICAgICAgICAgICAgICBFbGVtZW50ICplID0gZHluYW1pY19jYXN0PEVsZW1lbnQgKj4oKm5wdHIpOwogICAgICAgICAgICAgICAgIGlmIChlKSB7CiAgICAgICAgICAgICAgICAgICAgKnB0ciA9ICh2b2lkICopIGU7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNXSUdUWVBFX3BfRWxlbWVudDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgRGF0YSAqZCA9IGR5bmFtaWNfY2FzdDxEYXRhICo+KCpucHRyKTsKICAgICAgICAgICAgICAgICBpZiAoZCkgewogICAgICAgICAgICAgICAgICAgICpwdHIgPSAodm9pZCAqKSBkOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBTV0lHVFlQRV9wX0RhdGE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgVGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24gb24gaG93IHR5cGVzIGFyZSBkZXRlcm1pbmVkLiBkeW5hbWljX2Nhc3Q8PgogICAgICAgICAgICB1c2VzIEMrKyBSVFRJLiAgSG93ZXZlciwgaWYgeW91IGhhZCBzb21lIG90aGVyIG1lY2hhbmlzbSBmb3IgZGV0ZXJtaW5pbmcKICAgICAgICAgICAgdGhlIHR5cGUsIHlvdSBjb3VsZCB1c2UgdGhhdCBoZXJlLiAgTm90ZTogaXQgaXMgaW1wb3J0YW50IHRvIHNhdmUKICAgICAgICAgICAgdGhlIG5ldyBwb2ludGVyIHZhbHVlIGJhY2sgaW50byB0aGUgYXJndW1lbnQgYXMgc2hvd24uICBXaGVuIGRvd25jYXN0aW5nLAogICAgICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIHBvaW50ZXIgY291bGQgY2hhbmdlLiAKCiAgICAgICAgICAgIEZpbmFsbHksIHRvIG1ha2UgdGhlIGNhc3RpbmcgZnVuY3Rpb24gYXZhaWxhYmxlLCB5b3UgaGF2ZSB0byByZWdpc3RlcgogICAgICAgICAgICBpdCB3aXRoIHRoZSBydW4tdGltZSB0eXBlIGNoZWNrZXIuIFB1dCB0aGlzIG1hY3JvIGluIHlvdXIgaW50ZXJmYWNlIGZpbGUuCgogICAgICAgICAgICAgICBEWU5BTUlDX0NBU1QoU1dJR1RZUEVfcF9Ob2RlLCBOb2RlX2R5bmFtaWNfY2FzdCk7CgogICAgICAgICAgICBOb3RlOiB0aGlzIGZlYXR1cmUgZG9lcyBub3QgaW50cm9kdWNlIGEgcGVyZm9ybWFuY2UgcGVuYWx0eSBvbiAKICAgICAgICAgICAgbm9ybWFsIFNXSUcgb3BlcmF0aW9uLiAgVGhlIGZlYXR1cmUgaXMgb25seSBlbmFibGVkIGJ5IHdyaXRpbmcKICAgICAgICAgICAgYSBuZXcgdHlwZW1hcCB0aGF0IGV4cGxpY2l0bHkgY2FsbHMgU1dJR19UeXBlRHluYW1pY0Nhc3QoKSB0bwogICAgICAgICAgICBtYWtlIGEgY29udmVyc2lvbi4gCiAgCiAgICAgICAgICAgIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvZHluYW1pY19jYXN0LmkgY29udGFpbnMgYSBzaW1wbGUgZXhhbXBsZS4KICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIEphdmEgbW9kdWxlIGR1ZSB0byBkaWZmZXJlbmNlcwogICAgICAgICAgICBpbiB0aGUgdHlwZS1jaGVja2luZyBpbXBsZW1lbnRhdGlvbi4KCiAgICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgRkVBVFVSRSAqKioKCjAzLzE3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU21hbGwgY2hhbmdlIHRvIHR5cGUtbmFtZSBoYW5kbGluZyBvZiB1bm5hbWVkIHN0cnVjdHVyZXMgYW5kCiAgICAgICAgICAgIHR5cGVkZWYuICBJZiBhIHN0cnVjdHVyZSBvZiB0aGlzIGZvcm0gYXBwZWFyczoKCiAgICAgICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCB7CiAgICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgfSBGb287CgogICAgICAgICAgICBUaGVuICdGb28nIGlzIHVzZWQgYXMgdGhlIHByb3BlciB0eXBlbmFtZSBmb3IgdGhlIHN0cnVjdHVyZS4KICAgICAgICAgICAgRnVydGhlcm1vcmUsIEZvbyBjYW4gbm93IGJlIHVzZWQgYXMgYSBuYW1lIGluIEMrKyBpbmhlcml0YW5jZS4KICAgICAgICAgICAgU1dJRyB3YXMgYWxyZWFkeSBraW5kIG9mIGRvaW5nIHRoaXMsIGJ1dCB0aGlzIG1vZGlmaWNhdGlvbiByZWZpbmVzCiAgICAgICAgICAgIHRoZSBpbXBsZW1lbnRhdGlvbiB0byBtb3JlIGNsb3NlbHkgZm9sbG93IHRoZSBDKysgQVJNLCBzZWN0aW9uCiAgICAgICAgICAgIDcuMS4zLCBwLiAxMDYuICBUaGlzIGZpeGVzIGEgY291cGxlIG9mIG9ic2N1cmUgY29ybmVyIGNhc2VzLgoKMDMvMTYvMjAwMjogYmVhemxleQogICAgICAgICAgICBNb2RpZmllZCBDKysgaW5oZXJpdGFuY2Ugd2l0aCBhIGZldyBlbmhhbmNlbWVudHMuICBGaXJzdCwgdHlwZSBpbmZvcm1hdGlvbgogICAgICAgICAgICBuZWVkZWQgZm9yIGNhc3RpbmcgYW5kIHR5cGUtZXF1aXZhbGVuY2UgaXMgZ2VuZXJhdGVkIGV2ZW4gd2hlbiBiYXNlLWNsYXNzZXMKICAgICAgICAgICAgYXJlbid0IGRlZmluZWQgaW4gdGhlIGludGVyZmFjZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyA6IHB1YmxpYyBCYXIgIHsgICAgLyogQmFyIHVuc3BlY2lmaWVkICovCiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgIHZvaWQgYmxhaChCYXIgKmIpOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgYmxhaCgpIGZ1bmN0aW9uIHN0aWxsIGFjY2VwdHMgRm9vICogZXZlbiB0aG91Z2ggbm90aGluZwogICAgICAgICAgICBpcyByZWFsbHkga25vd24gYWJvdXQgQmFyLiAgIFByZXZpb3VzIFNXSUcgdmVyc2lvbnMgd291bGQganVzdCBnZW5lcmF0ZQogICAgICAgICAgICBhIHR5cGUgZXJyb3IuCgogICAgICAgICAgICBJbmhlcml0YW5jZSBoYXMgYWxzbyBiZWVuIG1vZGlmaWVkIHRvIHdvcmsgdGhyb3VnaCB0eXBlZGVmLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgdHlwZWRlZiBCYXIgT3RoZXJCYXI7CiAgICAgICAgICAgICAgIGNsYXNzIEZvbzogcHVibGljIE90aGVyQmFyIHsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgYmFzZSBjbGFzcyBvZiBPdGhlckJhciBpcyBjb3JyZWN0bHkgcmVzb2x2ZWQgYmFjayB0bwogICAgICAgICAgICBCYXIuICAgVGhlIHVzZSBvZiB0aGUgbmFtZSBPdGhlckJhciBpcyBsb3N0IGluIHRoaXMgcmVzb2x1dGlvbiAodGhlIHdyYXBwZXJzCiAgICAgICAgICAgIHdpbGwgc2ltcGx5IHVzZSBCYXIgaW5zdGVhZCBvZiB0aGUgdHlwZWRlZiBuYW1lIE90aGVyQmFyKS4KICAgICAgICAgICAKMDMvMTMvMjAwMjogYmVhemxleQogICAgICAgICAgICAldHlwZW1hcCwgJWFwcGx5LCBhbmQgcmVsYXRlZCBkaXJlY3RpdmVzIGNhbiBub3cgYXBwZWFyIGluc2lkZQogICAgICAgICAgICBjbGFzcyBkZWZpbml0aW9ucy4gICAKCjAzLzEzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSB2YXJpZXR5IG9mIHByb2JsZW1zIHJlbGF0ZWQgdG8gY29tcGlsaW5nIFNXSUcgb24gNjQtYml0CiAgICAgICAgICAgIHBsYXRmb3Jtcy4KCjAzLzEyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoICJpZ25vcmUiIGFuZCAiaW4iIHR5cGVtYXBzLiAgTG9jYWwgdmFyaWFibGVzCiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCAiaW4iIHdlcmUgYmVpbmcgYWRkZWQgdG8gdGhlIHdyYXBwZXIgZnVuY3Rpb24gZXZlbgogICAgICAgICAgICB0aG91Z2ggdGhleSB3ZXJlIG5ldmVyIHVzZWQuICAgTW9zdGx5IGhhcm1sZXNzLCBidXQgaXQgd291bGQgbGVhZAogICAgICAgICAgICB0byBhIHZhcmlldHkgb2YgY29tcGlsYXRpb24gd2FybmluZ3MuCiAgCjAzLzEyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU29tZSBjaGFuZ2VzIHRvIHRoZSBpbnRlcm5hbCB0eXBlIHN5c3RlbSBhbmQgaGFuZGxpbmcgb2YgbmVzdGVkIEMrKwogICAgICAgICAgICB0eXBlcy4gICBJbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBTV0lHLCBpZiB5b3UgaGFkIHRoZSBmb2xsb3dpbmc6CgogICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgQmxhaDsKICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgIGNsYXNzIEJhciA6IHB1YmxpYyBGb28gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICB2b2lkIHNvbWVtZXRob2QoQmxhaCB4KTsKICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIGFyZ3VtZW50IHR5cGUgaW4gc29tZW1ldGhvZCgpIHdvdWxkIGltcGxpY2l0bHkgYmUgc2V0IHRvIEJhcjo6QmxhaC4KICAgICAgICAgICAgQWx0aG91Z2ggdGhpcyBpcyB0ZWNobmljYWxseSBhbGxvd2VkLCBpdCBicmVha3MgdHlwZW1hcHMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIEZvbzo6QmxhaCB7IC4uLiB9CgogICAgICAgICAgICBkb2Vzbid0IG1hdGNoIGxpa2UgeW91IGV4cGVjdC4gICBUaGlzIGhhcyBiZWVuIGNoYW5nZWQgaW4gU1dJRy0xLjMuMTIuCiAgICAgICAgICAgIE5vdywgdHlwZXMgYXJlIGV4cGFuZGVkIHVzaW5nIHRoZSBjbGFzcyBpbiB3aGljaCB0aGV5IHdlcmUgZGVmaW5lZC4KICAgICAgICAgICAgU28sIHRoZSBhcmd1bWVudCB0eXBlIGluIHNvbWVtZXRob2QoKSB3aWxsIGJlIEZvbzo6QmxhaC0tLXNpbmNlIHRoZQogICAgICAgICAgICB0eXBlIEJsYWggd2FzIGRlZmluZWQgaW4gRm9vLgogCjAzLzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc29tZSBzdWJ0bGUgdHlwZSBzY29waW5nIHByb2JsZW1zIHdpdGggdHlwZWRlZiBhbmQgQysrIGNsYXNzZXMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgogCiAgICAgICAgICAgICAgICB0eXBlZGVmIGludCBCbGFoOwogICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICB0eXBlZGVmIGRvdWJsZSBCbGFoOwogICAgICAgICAgICAgICAgICAgIHZvaWQgZm9vKEJsYWggeCwgOjpCbGFoIHkpOwogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CgowMy8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEhpZ2hseSBleHBlcmltZW50YWwgY2hhbmdlIHRvIGhhbmRsZSB2YXJpYWJsZSBsZW5ndGggYXJndW1lbnRzLgogICAgICAgICAgICBGaXJzdCwgdGhlcmUgaXMgbm8gcG9ydGFibGUgb3IgcmVsaWFibGUgd2F5IHRvIHdyYXAKICAgICAgICAgICAgYSB2YXJhcmdzIGZ1bmN0aW9uIGluIGZ1bGwgZ2VuZXJhbGl0eS4gIEhvd2V2ZXIsIHlvdSAqY2FuKiBjaGFuZ2UKICAgICAgICAgICAgdGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSB1c2luZyAldmFyYXJncy4KCiAgICAgICAgICAgICAgICV2YXJhcmdzKGNoYXIgKikgZnByaW50ZjsKICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIHZvaWQgZnByaW50ZihGSUxFICpmLCBjaGFyICpmbXQsIC4uLik7CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSB2YXJpYWJsZSBsZW5ndGggcGFyYW1ldGVyICIuLi4iIGlzCiAgICAgICAgICAgIHNpbXBseSByZXBsYWNlZCBieSB0aGUgcGFyYW1ldGVycyBnaXZlbiBpbiAldmFyYXJncy4gVGhpcwogICAgICAgICAgICByZXN1bHRzIGluIGEgZnVuY3Rpb24gbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgdm9pZCBmcHJpbnRmKEZJTEUgKmYsIGNoYXIgKmZtdCwgY2hhciAqcyk7CgogICAgICAgICAgICBNb3JlIHRoYW4gb25lIGFyZ3VtZW50IGNhbiBiZSB1c2VkIGFuZCBkZWZhdWx0IHZhbHVlcwogICAgICAgICAgICBjYW4gYmUgZGVmaW5lZC4gIEZvciBleGFtcGxlLCB0aGlzIGNvZGUgc3BlY2lmaWVzIGEKICAgICAgICAgICAgbWF4aW11bSBvZiBmb3VyIGFyZ3VtZW50cy4KCiAgICAgICAgICAgICAgICV2YXJhcmdzKGNoYXIgKngxID0gMCwgY2hhciAqeDIgPSAwLCBjaGFyICp4MyA9IDAsIGNoYXIgKng0ID0gMCkgZnByaW50ZjsKIAogICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIE5FVyBGRUFUVVJFICoqKgogCjAzLzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQ2hhbmdlIHRvIGhhbmRsaW5nIG9mIHZhcmlhYmxlIGxlbmd0aCBhcmd1bWVudHMuICB2YXJhcmdzCiAgICAgICAgICAgIGlzIG5vdyBoYW5kbGVkIGFzIGEgcHJvcGVyIHBhcmFtZXRlciBhbmQgaXMgcGFzc2VkIHRvIHRoZQogICAgICAgICAgICBjb2RlIGdlbmVyYXRvci4gIEhvd2V2ZXIsIGl0IHN0aWxsIGNhbid0IGJlIGhhbmRsZWQgY29ycmVjdGx5CiAgICAgICAgICAgIChhbmQgd2lsbCBnZW5lcmF0ZSBhIHR5cGVtYXAgd2FybmluZykuICAgVGhpcyBjaGFuZ2UgaGFzIGJlZW4KICAgICAgICAgICAgbWFkZSB0byBiZXR0ZXIgaW5jb3Jwb3JhdGUgdmFyaWFibGUgbGVuZ3RoIGFyZ3VtZW50cyB3aXRoIG90aGVyCiAgICAgICAgICAgIGRpcmVjdGl2ZXMgc3VjaCBhcyAlaWdub3JlLCAlcmVuYW1lLCAlZmVhdHVyZSwgYW5kIHNvIGZvcnRoLgoKMDMvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDUyMjU1NSBdIFN5bnRheCBlcnJvciBwYXJzaW5nICJkZWZpbmUiIGNvbnN0cnVjdC4gU1dJRwogICAgICAgICAgICBpcyBhIGxpdHRsZSBtb3JlIHJlc3RyaWN0aXZlIGluIGRldGVybWluaW5nICNkZWZpbmUgc3RhdGVtZW50cwogICAgICAgICAgICB0aGF0IHdpbGwgYmUgd3JhcHBlZCBhcyBjb25zdGFudHMuICBBbHNvIGFkZGVkIGEgYmV0dGVyIHBhcnNlcgogICAgICAgICAgICBlcnJvciBydWxlIGZvciBoYW5kbGluZyBiYWQgY29uc3RhbnRzLgoKMDMvMDgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBCdWcgZml4OiBDbGFzc2VzIHJlbmFtZWQgd2l0aCAlcmVuYW1lIHRoYXQgYXJlIGRlcml2ZWQgZnJvbSAKICAgICAgICAgICAgYW5vdGhlciBjbGFzcyBnZW5lcmF0ZSBtb3JlIGFwcHJvcHJpYXRlIHNoYWRvdyBjbGFzcyBjb2RlLgoKMDMvMDgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXhlZCBTRiBbICM1MjM2MzIgXSBhbmQgWyAjNTEzMzM1IF0gYm90aCByZXBvcnRlZCBieSBJc3JhZWwgCiAgICAgICAgICAgIFRhbm5lci4gU3VwcG9ydCBmb3IgdHlwZXMgdGhhdCBhcmUgdXNlZCB3aGljaCBhcmUgaW4gYSB0eXBlZGVmLiBUaGUKICAgICAgICAgICAgYXBwcm9wcmlhdGUgc2hhZG93IGNsYXNzIG5hbWUgaXMgZ2VuZXJhdGVkLiBBbHNvIGdlbmVyYXRlZCBjb3JyZWN0CiAgICAgICAgICAgIHNoYWRvdyBjbGFzc25hbWUgd2hlbiBhIHRlbXBsYXRlZCBjbGFzcyBpcyB1c2VkIHdpdGhpbiBhbm90aGVyIAogICAgICAgICAgICB0ZW1wbGF0ZWQgY2xhc3MuIFNlZSB0aGUgY3BwX3R5cGVkZWYuaSB0ZXN0Y2FzZS4KCjAzLzA4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQnVnIGZpeDogTm8gdHlwZSB3YXMgZ2VuZXJhdGVkIGluIHNoYWRvdyBjbGFzc2VzIGZvciB0eXBlcyAKICAgICAgICAgICAgdGhhdCB3ZXJlbid0IHdyYXBwZWQgYnkgU1dJRy4gIFRoZSB0eXBlIGlzIHRyZWF0ZWQgYXMgYSByYXcgCiAgICAgICAgICAgIHBvaW50ZXIsIGllIG5vIHNoYWRvdyBjbGFzcy4KCjAyLzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgUmVmaW5lZCB0aGUgbWF0Y2hpbmcgYWxnb3JpdGhtIHVzZWQgYnkgJXJlbmFtZSwgJWlnbm9yZSwgYW5kCiAgICAgICAgICAgICVmZWF0dXJlLiAgIElmIGEgdHlwZSBzaWduYXR1cmUgaXMgc3VwcGxpZWQsIGl0IG11c3QgZXhhY3RseQogICAgICAgICAgICBtYXRjaCB0aGF0IHVzZWQgaW4gdGhlIGRlY2xhcmF0aW9uLS0taW5jbHVkaW5nIGFueSB1c2Ugb2YKICAgICAgICAgICAgY29uc3QuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlcmVuYW1lKGZvbzEpICAgZm9vKGludCk7CiAgICAgICAgICAgICAgICAlcmVuYW1lKGJhcjEpICAgYmFyKGludCkgY29uc3Q7CgogICAgICAgICAgICAgICAgY2xhc3MgQmxhaCB7CiAgICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQpOyAgICAgICAvLyBNYXRjaGVkIC0tPiBmb28xCiAgICAgICAgICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQpIGNvbnN0OyAvLyBOb3QgbWF0Y2hlZCAKICAgICAgICAgICAgICAgICAgICAgIHZvaWQgYmFyKGludCk7ICAgICAgIC8vIE5vdCBtYXRjaGVkCiAgICAgICAgICAgICAgICAgICAgICB2b2lkIGJhcihpbnQpIGNvbnN0OyAvLyBNYXRjaGVkIC0tPiBiYXIxCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBJbiBwcmV2aW91cyB2ZXJzaW9ucywgYSBub24tY29uc3Qgc3BlY2lmaWNhdGlvbiB3b3VsZCBtYXRjaAogICAgICAgICAgICBib3RoIHRoZSBub24tY29uc3QgYW5kIGNvbnN0IGRlY2xhcmF0aW9ucy4gIEhvd2V2ZXIsIHRoZSB3aG9sZQogICAgICAgICAgICBwb2ludCBvZiAlcmVuYW1lIGFuZCByZWxhdGVkIGRpcmVjdGl2ZXMgaXMgdGhhdCB0aGV5IGJlIGFibGUKICAgICAgICAgICAgdG8gcHJlY2lzZWx5IHBpbnBvaW50IGV4YWN0IGRlY2xhcmF0aW9ucyBpbiBhbiBpbnRlcmZhY2UuICBUaGlzCiAgICAgICAgICAgIGZpeGVzIHRoZSBwcm9ibGVtLgoKMDIvMjEvMjAwMjogYmVhemxleQogICAgICAgICAgICBSZXdvcmtlZCB0aGUgaGFuZGxpbmcgb2YgZGVmYXVsdCBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvcnMuCiAgICAgICAgICAgIFNXSUcgbm93IG1ha2VzIGEgcHJlbGltaW5hcnkgcGFzcyBvdmVyIHRoZSBwYXJzZSB0cmVlIHRvIGRpc2NvdmVyCiAgICAgICAgICAgIHdoaWNoIGNsYXNzZXMgc3VwcG9ydCBkZWZhdWx0IGFsbG9jYXRpb24uICAgVGhpcyBmaXhlcyBhIG51bWJlcgogICAgICAgICAgICBvZiB2ZXJ5IHN1YnRsZSBpc3N1ZXMgaW4gY29kZSBnZW5lcmF0aW9uIGFuZCBjYWxsL3JldHVybiBieSB2YWx1ZS4KCjAyLzE4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBJbXByb3ZlZCBzdXBwb3J0IG9uIEN5Z3dpbjogUGVybCwgUHl0aG9uLCBUY2wsIFJ1YnkgYW5kIEphdmEgc2hvdWxkCiAgICAgICAgICAgIHdvcmsgb3V0IG9mIHRoZSBib3gsIGJhcnJpbmcgdGhlIHJ1bnRpbWUgbGlicmFyeS4gUmVtb3ZlZCBkbGx3cmFwIAogICAgICAgICAgICBhbmQgcmVwbGFjZWQgd2l0aCBuZXdseSB3b3JraW5nIGdjYyAtc2hhcmVkIGluc3RlYWQgZm9yIEN5Z3dpbi4gCiAgICAgICAgICAgIEFsbCB0aGlzIHdpbGwgcmVxdWlyZSB0aGUgbmV3IGltcHJvdmVkIGJpbnV0aWxzIDIwMDEwODAyIGFuZCBsYXRlciwKICAgICAgICAgICAgYnV0IHRoZSBsYXRlc3QgQ3lnd2luIGlzIHVzdWFsbHkgdGhlIGJlc3QgcmVjb21tZW5kYXRpb24uCgowMi8xNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHNvbWUgcHJvYmxlbXMgcmVsYXRlZCB0byB3cmFwcGluZyBvZiBnbG9iYWwgdmFyaWFibGVzCiAgICAgICAgICAgIGFuZCBQZXJsIHNoYWRvdyBjbGFzc2VzLiBSZXBvcnRlZCBieSBDaGlhLWxpYW5nIEthby4KCjAyLzE1LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBNYWRlIGEgZml4IHRvIHRoZSBjb2RlIGdlbmVyYXRpb24gZm9yIEMrKyBjbGFzcwogICAgICAgICAgICBjb25zdHJ1Y3RvcnMgc28gdGhhdCB3ZSBnZXQgYm90aCBhICJuZXciIHNpbmdsZXRvbiBtZXRob2QKICAgICAgICAgICAgYW5kIGFuICJpbml0aWFsaXplIiBpbnN0YW5jZSBtZXRob2QgZm9yIGVhY2ggY2xhc3MuIFRoaXMKICAgICAgICAgICAgY2hhbmdlIGVuYWJsZXMgZGV2ZWxvcGVycyB0byBkZXJpdmUgbmV3IFJ1YnkgY2xhc3NlcyBmcm9tCiAgICAgICAgICAgIFNXSUctd3JhcHBlZCBDKysgY2xhc3NlcyBhbmQgdGhlbiBvdmVycmlkZSB0aGVpciBpbml0aWFsaXplCiAgICAgICAgICAgIG1ldGhvZHMgdG8gcHJvdmlkZSBzdWJjbGFzcy1zcGVjaWZpYyBpbnN0YW5jZSBpbml0aWFsaXphdGlvbi4KCjAyLzE1LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBNYXNzaXZlIGRvY3VtZW50YXRpb24gdXBkYXRlIGZvciB0aGUgUnVieSBtb2R1bGUsCiAgICAgICAgICAgIGNvbnRyaWJ1dGVkIGJ5IENyYWlnIEZpbGVzLgoKMDIvMTQvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEJ1ZyBmaXg6IEFuIGVycm9yIGluIHRoZSBTV0lHIHJ1bnRpbWUgc3VwcG9ydCBmb3IgUnVieQogICAgICAgICAgICB3YXMgY2F1c2luZyBzZXZlcmFsIG9mIHRoZSBleGFtcGxlcyB0byBmYWlsLiBSZXBvcnRlZCBieQogICAgICAgICAgICBXaWxsaWFtIEZ1bHRvbi4KCjAyLzE0LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBCdWcgZml4OiBFbnVtZXJhdGlvbnMgZGVmaW5lZCB3aXRoaW4gYSBjbGFzcyAoc3VjaAogICAgICAgICAgICBhcyB0aG9zZSBzZWVuIGluIHRoZSBFeGFtcGxlcy9ydWJ5L2VudW0gZXhhbXBsZSkgd2VyZSBub3QKICAgICAgICAgICAgYmVpbmcgZXhwb3J0ZWQgd2l0aCB0aGUgY29ycmVjdCBuYW1lcy4gUmVwb3J0ZWQgYnkgV2lsbGlhbQogICAgICAgICAgICBGdWx0b24uCgowMi8xMy8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgYSB3YXJuaW5nIG1lc3NhZ2Ugd2hlbiB3ZSBydW4gYWNyb3NzIG92ZXJsb2FkZWQKICAgICAgICAgICAgY2xhc3MgY29uc3RydWN0b3JzIGZvciBDKysgY29kZSwgdGhhdCB0aGlzIGlzIGN1cnJlbnRseSBub3QKICAgICAgICAgICAgc3VwcG9ydGVkIChldmVuIGlmIHRoZSBvdmVybG9hZHMgaGF2ZSBiZWVuICVyZW5hbWVkKS4gRm9yIGFuCiAgICAgICAgICAgIGV4YW1wbGUgb2Ygd2hlcmUgdGhpcyBkb2Vzbid0IHdvcmssIHNlZSBFeGFtcGxlcy9ydWJ5L29wZXJhdG9yLgoKMDIvMTMvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIGFuICJpZ25vcmVkIiB3YXJuaW5nIG1lc3NhZ2Ugd2hlbiB0aGUgcGFyc2VyIHJ1bnMKICAgICAgICAgICAgYWNyb3NzIGFuIG9wZXJhdG9yIT0oKSBkZWNsYXJhdGlvbiBmb3IgQysrIGNvZGUuCgowMi8xMS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgdGhlICJpbXBvcnQiLCAiaW1wb3J0X3RlbXBsYXRlIiwgIm9wZXJhdG9yIiBhbmQKICAgICAgICAgICAgInRlbXBsYXRlIiBleGFtcGxlcy4KCjAyLzExLzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBtdWx0aS1tb2R1bGUgc3VwcG9ydC4KCjAyLzA5LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCB0aGUgbWlzc2luZyAiI2RlZmluZSBTV0lHX05PSU5DTFVERSIgYXQgdGhlIHRvcCBvZgogICAgICAgICAgICB0aGUgd3JhcHBlciBjb2RlIHdoZW4gdGhlICctYycgb3B0aW9uIGlzIHVzZWQuCgowMi8wOS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBDb3JyZWN0ZWQgYSBtaW5vciBvZmYtYnktb25lIGVycm9yIGZvciB0aGUgc2l6ZSBvZiB0aGUKICAgICAgICAgICAgc3dpZ190eXBlc1tdIGFycmF5IHRoYXQncyBnZW5lcmF0ZWQgaW4gdGhlIHdyYXBwZXIgY29kZS4KCjAyLzA4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgU0YgWyAjNTE1MDU4IF0gV3JvbmcgY29kZSBmb3IgQysrIHRlbXBsYXRlcy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgSXNyYWVsIFRhbGxlci4KClZlcnNpb24gMS4zLjExIChKYW51YXJ5IDMxLCAyMDAyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjAxLzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4IHRvIHBhc3MvcmV0dXJuIGJ5IHZhbHVlIGZvciBDKysgb2JqZWN0cyB0aGF0IGRlZmluZQogICAgICAgICAgICBubyBkZWZhdWx0IGNvbnN0cnVjdG9yLiAgQ2hhbmdlcyB0byB0aGUgdHlwZW1hcCBzeXN0ZW0KICAgICAgICAgICAgbWFkZSBpdCBpbXBvc3NpYmxlIHRvIHdyYXAgQysrIG9iamVjdHMgd2l0aCBubyBkZWZhdWx0CiAgICAgICAgICAgIGNvbnN0cnVjdG9yLiAgIFRoaXMgaGFzIGJlZW4gZml4ZWQsIGJ1dCB0aGUgc29sdXRpb24gCiAgICAgICAgICAgIGludm9sdmVzIHNvbWUgY2xldmVyIHRlbXBsYXRlIG1hZ2ljIGNvbnRyaWJ1dGVkIGJ5IAogICAgICAgICAgICBXaWxsaWFtIEZ1bHRvbi4gIFBsZWFzZSBzZWUgdGhlIGNvbW1lbnRzIGluIHRoZSBmaWxlCiAgICAgICAgICAgIExpYi9zd2lnLnN3ZyBmb3IgZnVydGhlciBkZXRhaWxzLiAgVGhpcyBzb2x1dGlvbiBpcwogICAgICAgICAgICBleHBlcmltZW50YWwgYW5kIG1heSBiZSByZWZpbmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuCgowMS8zMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEdsb2JhbCB2YXJpYWJsZXMgYW5kIG1lbWJlciBkYXRhIG9mIHR5cGUgImNvbnN0IGNoYXIgKiIKICAgICAgICAgICAgY2FuIGJlIHNldCwgYnV0IHRoZSBvbGQgdmFsdWUgaXMgc2lsZW50bHkgZGlzY2FyZGVkIHdpdGhvdXQKICAgICAgICAgICAgYW55IGdhcmJhZ2UgY29sbGVjdGlvbi4gICBUaGlzIG1heSBnZW5lcmF0ZSBhIG1lbW9yeSBsZWFrLgogICAgICAgICAgICBUaGlzIGNoYW5nZSBpcyBuZWVkZWQgdG8gbW9yZSBzYWZlbHkgaGFuZGxlIHZhcmlhYmxlcwogICAgICAgICAgICBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9vID0gIkhlbGxvIFdvcmxkXG4iOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBpdCdzIG5vdCBzYWZlIHRvIGZyZWUgdGhlIG9sZCB2YWx1ZS4gIEhvd2V2ZXIsCiAgICAgICAgICAgIFNXSUcgY2FuIGR5bmFtaWNhbGx5IGFsbG9jYXRlIGEgbmV3IHZhbHVlIGFuZCBtYWtlIGZvbyBwb2ludAogICAgICAgICAgICB0byBpdC4gICBUbyBmaXggdGhpcyBtZW1vcnkgbGVhaywgeW91IGNhbiBwcm9iYWJseSBkbyB0aGlzOgoKICAgICAgICAgICAgICAgJWNsZWFyIGNvbnN0IGNoYXIgKmZvbzsKICAgICAgICAgICAgICAgJWFwcGx5IGNoYXIgKiB7Y29uc3QgY2hhciAqZm9vfTsKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICAKMDEvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBUd28gbWlub3IgdHlwZW1hcCBlbmhhbmNlbWVudHMgaGF2ZSBiZWVuIGFkZGVkLiAgRmlyc3QsCiAgICAgICAgICAgIHR5cGVtYXBzIGNhbiBpc3N1ZSBhIHdhcm5pbmcgbWVzc2FnZSBieSBpbmNsdWRpbmcgYSBzcGVjaWFsCiAgICAgICAgICAgIHdhcm5pbmcgYXR0cmlidXRlLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAldHlwZW1hcChpbix3YXJuaW5nPSJJJ20gZ29pbmcgdG8gZG8gc29tZXRoaW5nIGRhbmdlcm91cyIpIC4uLgoKICAgICAgICAgICAgVGhlIHdhcm5pbmcgbWVzc2FnZSB3aWxsIHNob3cgdXAgd2hlbmV2ZXIgdGhlIHR5cGVtYXAgaXMKICAgICAgICAgICAgYXBwbGllZC4KCiAgICAgICAgICAgIFNlY29uZCwgYSB0eXBlbWFwIGNhbiBmb3JjZSBhIG5vLW1hdGNoIGJ5IGRlZmluaW5nCgogICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHNvbWV0eXBlICJwYXNzIjsKCiAgICAgICAgICAgIElmIHRoaXMgaXMgdXNlZCwgdGhlIHR5cGVtYXAgc3lzdGVtIHdpbGwgKm5vdCogcmVjb3JkIGEKICAgICAgICAgICAgdHlwZW1hcCBtYXRjaCBmb3IgInNvbWV0eXBlIi4gICBUaGlzIGNhbiBiZSB1c2VkIHRvIGJsb2NrCiAgICAgICAgICAgIHNlbGVjdGVkIHR5cGVtYXBzLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50ZWQgdG8gZGlzYWJsZQogICAgICAgICAgICBhIHR5cGVtYXAgZmVhdHVyZSBmb3Igc29tZSB0eXBlLCB5b3UgY291bGQgZG8gdGhpcy4KCiAgICAgICAgICAgICAgIC8vIERvIG5vdCBhbGxvdyBnbG9iYWwgdmFyaWFibGVzIG9mIHR5cGUgJ2NvbnN0IGNoYXIgKicgdG8gYmUgc2V0LgogICAgICAgICAgICAgICAldHlwZW1hcCh2YXJpbikgY29uc3QgY2hhciAqICJwYXNzIjsKCiAgICAgICAgICAgIEl0IG1pZ2h0IGFsc28gYmUgcG9zc2libGUgdG8gdXNlIHRoaXMgdG8gZG8gc3VidGxlIGFuZAogICAgICAgICAgICBzdHJhbmdlIHRoaW5ncyB3aXRoIHR5cGVtYXBzLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50ZWQgdG8KICAgICAgICAgICAgbWFrZSAnYmxhaCAqJyBhbiBvdXRwdXQgdmFsdWUgYW5kICdjb25zdCBibGFoIConIGFuIGlucHV0CiAgICAgICAgICAgIHBhcmFtZXRlciwgeW91IG1pZ2h0IGRvIHRoaXM6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoaWdub3JlKSBibGFoICooYmxhaCB0ZW1wKSB7CiAgICAgICAgICAgICAgICAgICAgJDEgPSAmdGVtcDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICV0eXBlbWFwKGFyZ291dCkgYmxhaCAqIHsKICAgICAgICAgICAgICAgICAgICAuLi4gcmV0dXJuIGEgdmFsdWUgLi4uCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiBCbG9jayB1bnF1YWxpZmllZCB0eXBlbWFwcyBkZWZpbmVkIGFib3ZlICovCiAgICAgICAgICAgICAgICAldHlwZW1hcChpZ25vcmUpIGNvbnN0IGJsYWggKiAicGFzcyI7CiAgICAgICAgICAgICAgICAldHlwZW1hcChhcmdvdXQpIGNvbnN0IGJsYWggKiAicGFzcyI7CiAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgICAgIGNvbnN0IGJsYWggKiB7CiAgICAgICAgICAgICAgICAgICAgLi4uIGdldCBpbnB1dCB2YWx1ZSAuLi4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAoVGhpcyBwb3RlbnRpYWwgYXBwbGljYXRpb25zIG9mIHR5cGVtYXBzIHN1Z2dlc3RlZCBieSBHcmVnIFN0ZWluKS4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDEvMjkvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIEJ1ZyBmaXg6IE5vIGVudW1lcmF0aW9ucyB3ZXJlIHdyYXBwZWQgd2hlbiB0aGUgLXNoYWRvdyAKICAgICAgICAgICBjb21tYW5kbGluZSBvcHRpb24gd2FzIG5vdCBzcGVjaWZpZWQuIFJlcG9ydGVkIGJ5IElzcmFlbCBUYWxsZXIuCgowMS8yOC8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gR2xvYmFsIGFycmF5cyBhcmUgc3VjY2Vzc2Z1bGx5IHdyYXBwZWQuIEluIGZhY3QgdGhleSBzdGFydGVkCiAgICAgICAgICAgbW9zdGx5IHdvcmtpbmcgaW4gU1dJRy0xLjMuMTAuCgowMS8yOC8yMDAyOnJpY2hhcmRwCgkgICBBZGRlZCBmaXJzdCBhdHRlbXB0IGF0IEMrKyBhbmQgLXNoYWRvdyBzdXBwb3J0IGZvciBQSFA0IG1vZHVsZSwKCSAgIHBsZWFzZSB0ZXN0IGFuZCBtYWlsIG1lIGlmIGFueSBwcm9ibGVtcy9pZGVhcyBvbiBpbXByb3ZpbmcgaXQuCgoJICAgVGhlcmUgaXMgYSBrbm93biBwcm9ibGVtIHdpdGggdW5pbml0aWFsaXplZCBtZW1iZXIgdmFyaWFibGVzLAoJICAgcGxlYXNlIHNlZSBFeGFtcGxlcy9waHA0L3N5bmMvUkVBRE1FIGZvciBkZXRhaWxzLgoKCSAgIEFsc28gbW9yZSBQSFAgZG9jdW1lbnRhdGlvbiBhZGRlZCB0byBEb2MvTWFudWFsL1BocC5odG1sCgowMS8yNy8yMDAyOmJlYXpsZXkKICAgICAgICAgICBUaGUgQU5TSSBDIHNpemVfdCB0eXBlIGlzIG5vdyByZWNvZ25pemVkIGFzIGFuIGludGVnZXIgYnkgZGVmYXVsdC4KCjAxLzI2LzIwMDI6YmVhemxleQogICAgICAgICAgIGxvbmcgbG9uZyBhbmQgdW5zaWduZWQgbG9uZyBsb25nIHN1cHBvcnQgYWRkZWQgdG8gbWFueSBsYW5ndWFnZSBtb2R1bGVzLgogICAgICAgICAgIFRoaXMgaXMgbm90IGEgcG9ydGFibGUgZmVhdHVyZSBhbmQgd2lsbCByZXF1aXJlIGNvbXBpbGVyIHN1cHBvcnQKICAgICAgICAgICBmb3IgdGhlIGxvbmcgbG9uZyB0eXBlLiAgSW4gdGFyZ2V0IGxhbmd1YWdlcyB0aGF0IGRvIG5vdCBzdXBwb3J0CiAgICAgICAgICAgbG9uZyBsb25nIChlLmcuLCBUY2wgYW5kIFBlcmwpLCBudW1iZXJzIGFyZSBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcKICAgICAgICAgICBvZiBkaWdpdHMuICBUaGlzIHByZXZlbnRzIHRoZWlyIHVzZSBpbiBhcml0aG1ldGljIGNhbGN1bGF0aW9ucywgYnV0CiAgICAgICAgICAgc3RpbGwgYWxsb3dzIHZhbHVlcyB0byBiZSBzZXQgZnJvbSBhIHN0cmluZy4gIAoKICAgICAgICAgICBsb25nIGxvbmcgc3VwcG9ydCByZXF1aXJlcyB0aGUgdXNlIG9mIHRoZSBzdHJ0b2xsKCkgYW5kIHN0cnRvdWxsKCkKICAgICAgICAgICBmdW5jdGlvbnMgYXMgd2VsbCBhcyB0aGUgJ2xsZCcgYW5kICdsbHUnIGZvcm1hdCBzcGVjaWZpZXJzCiAgICAgICAgICAgb2Ygc3ByaW50ZigpLgoKMDEvMjYvMjAwMjpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyAjNTAxODI3IF0gRGVsZXRlIG1ldGhvZCBpcyBub3QgY2FsbGVkLiAgIFRoZSBUY2wKICAgICAgICAgICBtb2R1bGUgd2Fzbid0IGNvcnJlY3RseSBjYWxsaW5nIGRlc3RydWN0b3JzIHdoZW4gdGhleQogICAgICAgICAgIHdlcmUgZGVmaW5lZCB1c2luZyAlYWRkbWV0aG9kcy4gIFRoaXMgaGFzIGJlZW4gZml4ZWQuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgUmVpbmhhcmQgRm9iYmUuCgowMS8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgQmV0dGVyIHN1cHBvcnQgZm9yIGxvbmcgbG9uZyBhbmQgdW5zaWduZWQgbG9uZyBsb25nLiAgVHlwZW1hcHMKICAgICAgICAgICBoYXZlIGJlZW4gaW5jbHVkZWQgaW4gYSBudW1iZXIgb2YgbW9kdWxlcyBmb3IgaGFuZGxpbmcgdGhlc2UgdHlwZXMuCiAgICAgICAgICAgSW4gYWRkaXRpb24sIHRoZSBwYXJzZXIgaGFzIGJlZW4gbW9kaWZpZWQgdG8gYWNjZXB0IGxvbmcgbG9uZwogICAgICAgICAgIGxpdGVyYWxzIHN1Y2ggYXMgMTIzNExMIGFuZCAxMjM0VUxMLgoKMDEvMjcvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIEEgQyBjaGFyW10gaXMgbWFwcGVkIHRvIGEgSmF2YSBTdHJpbmcgd2hpY2ggaXMgdGhlIGRlZmF1bHQgCiAgICAgICAgICAgU1dJRyBoYW5kbGluZyBvZiBjaGFyW10gYW5kIGNoYXIqLiBJdCB1c2VkIHRvIGJlIG1hcHBlZCB0byBieXRlW10uIAogICAgICAgICAgIE5vdGUgdGhhdCBhIEMgc2lnbmVkIGNoYXJbXSBhcnJheSBpcyBtYXBwZWQgdG8gYnl0ZVtdLgoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjAxLzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBhIHByb2JsZW0gd2l0aCByZXR1cm4tYnktdmFsdWUsIEMrKywgYW5kCiAgICAgICAgICAgb2JqZWN0cyB0aGF0IGRlZmluZSBubyBkZWZhdWx0IGNvbnN0cnVjdG9yLgogICAgICAgICAgIFJlcG9ydGVkIGJ5IEpvZWwgUmVlZC4KCjAxLzI1LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBPdmVyaGF1bCBvZiB0aGUgSmF2YSBtb2R1bGUuIFRoZSBDIGNvZGUgZ2VuZXJhdGlvbiBpcyBub3cgCiAgICAgICAgICAgZG9uZSBmcm9tIHR5cGVtYXBzLgoKMDEvMjQvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIFN1cHBvcnQgZm9yIGFycmF5cyBvZiBlbnVtIHBvaW50ZXJzCgowMS8yMC8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gRXJyb3IgY2hlY2tpbmcgZm9yIG51bGwgSmF2YSBvYmplY3RzIGJlaW5nIHBhc3NlZCB0byBuYXRpdmUgCiAgICAgICAgICAgZnVuY3Rpb25zLiAgRXhjZXB0aW9uIHRocm93biBub3cgd2hlcmVhcyBiZWZvcmUgdGhlIEpWTSBjcmFzaGVkLgoKMDEvMTgvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIENvcnJlY3RlZCBiZWhhdmlvdXIgZm9yIGZ1bmN0aW9ucyB0aGF0IHRha2UgYXJyYXlzLiBGb3IgCiAgICAgICAgICAgZXhhbXBsZSwgd2hlbiB0aGlzIGMgZnVuY3Rpb246IAoKICAgICAgICAgICB2b2lkIGFycmF5Zm4oaW50IGFycmF5W10pOwogICAgICAgICAgIAogICAgICAgICAgIGlzIHdyYXBwZWQgdGhlIGNvcnJlc3BvbmRpbmcgbmF0aXZlIGZ1bmN0aW9uCgogICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgbmF0aXZlIHZvaWQgYXJyYXlmbihpbnRbXSBhcnJheSk7CgogICAgICAgICAgIGlzIHByb2R1Y2VkLiBQcmV2aW91c2x5IGlmIHRoZSBDIGZ1bmN0aW9uIG1hZGUgYW55IGNoYW5nZXMgdG8gdGhlIAogICAgICAgICAgIGFycmF5IGVsZW1lbnRzLCB0aGVzZSB3ZXJlIG5vdCByZWZsZWN0ZWQgYmFjayBpbnRvIHRoZSBKYXZhIGFycmF5LiAKICAgICAgICAgICBUaGlzIGhhcyBub3cgYmVlbiBjb3JyZWN0ZWQgc28gdGhhdCB0aGUgY2hhbmdlcyBhcmUgcHJvcG9nYXRlZCBiYWNrCiAgICAgICAgICAgdG8gSmF2YSBhbmQgdGhlIGNhbGxpbmcgZnVuY3Rpb24gd2lsbCBzZWUgdGhlc2UgY2hhbmdlcy4gVGhpcyBpcyAKICAgICAgICAgICBob3cgcHVyZSBKYXZhIGZ1bmN0aW9ucyB3b3JrLCBpZSBhcnJheXMgYXJlIHBhc3NlZCBieSByZWZlcmVuY2UuCgowMS8xNS8yMDAyOm1rb2VwcGUKICAgICAgICAgICBbR3VpbGVdIE5ldyBmaWxlIGNwbHVzcGx1cy5pIHdpdGggQysrIHR5cGVtYXBzIGNvbnRyaWJ1dGVkCiAgICAgICAgICAgYnkgTWFyY2lvIEx1aXMgVGVpeGVpcmEgPG1hcmNpb3RAaG9sbHkuY29sb3N0YXRlLmVkdT4uCgowMS8xMS8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gQ2hhbmdlZCBtYXBwaW5nIG9mIEMgbG9uZyB0byBKYXZhIHR5cGUuIFdhcyBtYXBwZWQgdG8gSmF2YQogICAgICAgICAgIGxvbmcsIG5vdyBtYXBwZWQgdG8gSmF2YSBpbnQuIElmIHlvdSB3YW50IHRoZSBwcmV2aW91cyBtYXBwaW5nIHRvIAogICAgICAgICAgIEphdmEgbG9uZyB1c2UgdGhpcyBhcHByb2FjaCBpbiB5b3VyIGludGVyZmFjZSBmaWxlOgogICAgICAgICAgIAogICAgICAgICAgICAgJWNsZWFyIGxvbmc7CiAgICAgICAgICAgICAldHlwZW1hcChqbmkpIGxvbmcgICAgICAgICAgICAgImpsb25nIgogICAgICAgICAgICAgJXR5cGVtYXAoanR5cGUpIGxvbmcgICAgICAgICAgICJsb25nIgogICAgICAgICAgICAgJXR5cGVtYXAoanN0eXBlKSBsb25nICAgICAgICAgICJsb25nIgoKICAgICAgICAgICAgICVjbGVhciBsb25nW0FOWV07CiAgICAgICAgICAgICAldHlwZW1hcChqbmkpIGxvbmdbQU5ZXSAgICAgICAgImpsb25nQXJyYXkiCiAgICAgICAgICAgICAldHlwZW1hcChqdHlwZSkgbG9uZ1tBTlldICAgICAgImxvbmdbXSIKICAgICAgICAgICAgICV0eXBlbWFwKGpzdHlwZSkgbG9uZ1tBTlldICAgICAibG9uZ1tdIgogICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGxvbmdbQU5ZXSAgICAgICAgIHt3cml0ZSBtZSBmb3IgYXJyYXkgc3VwcG9ydH0KICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgbG9uZ1tBTlldICAgICAgICB7d3JpdGUgbWUgZm9yIGFycmF5IHN1cHBvcnR9CiAgICAgICAgICAgICAldHlwZW1hcChhcmdvdXQpIGxvbmdbQU5ZXSAgICAge3dyaXRlIG1lIGZvciBhcnJheSBzdXBwb3J0fQogICAgICAgICAgICAgJXR5cGVtYXAoZnJlZWFyZykgbG9uZ1tBTlldICAgIHt3cml0ZSBtZSBmb3IgYXJyYXkgc3VwcG9ydH0KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgogICAgICAgICAgIFRoaXMgbmV3IG1hcHBpbmcgaXMgbW9yZSBhcHByb3ByaWF0ZSB3aGVuIGludGVyZmFjaW5nIHRvIDMyIGJpdCAKICAgICAgICAgICBhcHBsaWNhdGlvbnMgd2hpY2ggYXJlIHVzZWQgaW4gdGhlIGN1cnJlbnQgMzItYml0IEpWTXMuIEZvciBmdXR1cmUgCiAgICAgICAgICAgNjQtYml0IEpWTXMgeW91IG1heSBoYXZlIHRvIGNoYW5nZSB0aGVzZSBtYXBwaW5ncyAtIGVnIG9uIFVuaXggTFA2NCAKICAgICAgICAgICBzeXN0ZW1zLCBidXQgbm90IG9uIE1pY3Jvc29mdCA2NGJpdCBXaW5kb3dzIHdoaWNoIHdpbGwgYmUgdXNpbmcgYSAKICAgICAgICAgICBQNjQgSUwzMiBtb2RlbC4gVGhpcyBtYXkgYmUgYXV0b21hdGVkIGluIGEgZnV0dXJlIHZlcnNpb24gb2YgU1dJRy4KCjAxLzEwLzIwMDI6YmVhemxleQogICAgICAgICAgIEZpeGVkIFsgNTAxNjc3IF0gJWluaXQgYmxvY2sgaW4gd3JvbmcgcGxhY2UuIFJlcG9ydGVkCiAgICAgICAgICAgYnkgTHVpZ2kgQmFsbGFiaW8uCgowMS8wOS8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gRGVmYXVsdCBzdXBwb3J0IGZvciB0aGUgbG9uZyBsb25nIHR5cGUuIHNpZ25lZCBsb25nIGxvbmcgaXMgCiAgICAgICAgICAgbWFwcGVkIHRvIGEgSmF2YSBsb25nLiB1bnNpZ25lZCBsb25nIGxvbmcgaXMgbWFwcGVkIHRvIEJpZ0ludGVnZXIuCgowMS8wOS8yMDAyOmJlYXpsZXkKICAgICAgICAgICBFeHBlcmltZW50YWwgY2hhbmdlIHRvIHBhcnNlciB0byBiZXR0ZXIgc3VwcG9ydCBtaXhpbmcgb2YKICAgICAgICAgICBpbnQsIGxvbmcsIHNob3J0LCB1bnNpZ25lZCwgZmxvYXQsIGFuZCBkb3VibGUuICAgVGhlIHBhcnNlcgogICAgICAgICAgIHNob3VsZCBub3cgc3VwcG9ydCB0eXBlcyBsaWtlIHRoaXM6CiAgICAKICAgICAgICAgICAgICAgIHNob3J0IHVuc2lnbmVkIGludAogICAgICAgICAgICAgICAgaW50ICAgdW5zaWduZWQgc2hvcnQKICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGludAogICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNob3J0CgogICAgICAgICAgICBUaGlzIGNoYW5nZSBhbHNvIGVuYWJsZXMgYSB0eXBlIG9mICdsb25nIGRvdWJsZScgKHByZXZpb3VzbHkKICAgICAgICAgICAgdW5zdXBwb3J0ZWQpIHRvIGJlIHVzZWQuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjAxLzA1LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBDYXN0aW5nIGZpeCBmb3Igd2hlbiBmdW5jdGlvbiByZXR1cm4gdHlwZSBpcyBhIHBvaW50ZXIgYXMgCiAgICAgICAgICAgcmVwb3J0ZWQgYnkgR2FyeSBQZW5uaW5ndG9uIDIwMDItMDEtMDUuIFRoZSB1cHBlciAzMmJpdHMgb2YgdGhlIAogICAgICAgICAgIDY0IGJpdCBqbG9uZyB3aWxsIGhhdmUgY29udGFpbmVkIGp1bmsgZm9yIDMyYml0IHBvaW50ZXJzLgoKMDEvMDUvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIEJldHRlciBwb2ludGVyIGhhbmRsaW5nIGluIEphdmEgaXMgcG9zc2libGUgYXMgdGhlIAogICAgICAgICAgIElOUFVULCBPVVRQVVQgYW5kIElOT1VUIHR5cGVtYXBzIGhhdmUgYmVlbiBhZGRlZCBpbnRvIHR5cGVtYXBzLmkuCgowMS8wNS8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gJG51bGwgY2FuIGJlIHVzZWQgaW4gaW5wdXQgdHlwZW1hcHMgdG8gcmV0dXJuIGVhcmx5IGZyb20gSk5JIAogICAgICAgICAgIGZ1bmN0aW9ucyB0aGF0IGhhdmUgZWl0aGVyIHZvaWQgb3IgYSBub24tdm9pZCByZXR1cm4gdHlwZS4gRXhhbXBsZToKCiAgICAgICAgICAgICAldHlwZW1hcChjaGVjaykgaW50ICogJXsgCiAgICAgICAgICAgICAgIGlmIChlcnJvcikgewogICAgICAgICAgICAgICAgIFNXSUdfZXhjZXB0aW9uKFNXSUdfSW5kZXhFcnJvciwgIkFycmF5IGVsZW1lbnQgZXJyb3IiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gJG51bGw7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICV9CgogICAgICAgICAgIElmIHRoZSB0eXBlbWFwIGdldHMgcHV0IGludG8gYSBmdW5jdGlvbiB3aXRoIHZvaWQgYXMgcmV0dXJuLCAkbnVsbCAKICAgICAgICAgICB3aWxsIGV4cGFuZCB0byBub3RoaW5nOgoKICAgICAgICAgICAgIHZvaWQgam5pX2ZuKC4uLikgewogICAgICAgICAgICAgICAgIGlmIChlcnJvcikgewogICAgICAgICAgICAgICAgICAgU1dJR19leGNlcHRpb24oU1dJR19JbmRleEVycm9yLCAiQXJyYXkgZWxlbWVudCBlcnJvciIpOwogICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgfQoKICAgICAgICAgICBvdGhlcndpc2UgJG51bGwgZXhwYW5kcyB0byB6ZXJvLCB3aGVyZSBqYXZhcmV0dXJudHlwZSBpcyBlaXRoZXIgYSAKICAgICAgICAgICBwb2ludGVyIG9yIGEgcHJpbWl0aXZlIHR5cGU6CgogICAgICAgICAgICAgamF2YXJldHVybnR5cGUgam5pX2ZuKC4uLikgewogICAgICAgICAgICAgICAgIGlmIChlcnJvcikgewogICAgICAgICAgICAgICAgICAgU1dJR19leGNlcHRpb24oU1dJR19JbmRleEVycm9yLCAiQXJyYXkgZWxlbWVudCBlcnJvciIpOwogICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgIH0KCjAxLzAyLzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBUaGUgSmF2YSBtb2R1bGUgaW5jb3JyZWN0bHkgdXNlZCBhcmdvdXQgdHlwZW1hcHMgZm9yIAogICAgICAgICAgIHN0cmluZ3MuIFRoaXMgaXMgbm93IGNvcnJlY3RlZCBhbmQgdGhlIGNvZGUgbm93IHJlc2lkZXMKICAgICAgICAgICBpbiB0aGUgZnJlZWFyZyB0eXBlbWFwLiBUaGUgYXJnb3V0IGFycmF5IHR5cGVtYXBzIGhhdmUgYmVlbiBzcGxpdCBpbnRvIAogICAgICAgICAgIGFyZ291dCBhbmQgZnJlZWFyZyB0eXBlbWFwcy4gVGhpcyBjb3JyZWN0aW9uIG1heSByZXF1aXJlIHNvbWUgdXNlciAKICAgICAgICAgICB3cml0dGVuIHR5cGVtYXBzIHRvIGJlIG1vZGlmaWVkLiAKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEyLzI4LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBNdWx0aSB0eXBlbWFwcyBub3cgd29ya2luZyBmb3IgSmF2YSBzZWUgbXVsdGltYXAgZXhhbXBsZS4KICAgICAgICAgICBbSmF2YV0gRml4IGZvciByZWNlbnRseSBpbnRyb2R1Y2VkIGJ1ZyAtIGZyZWVhcmcgdHlwZW1hcCBjb2RlIHdhcyBhcHBlYXJpbmcKICAgICAgICAgICBiZWZvcmUgdGhlIGZ1bmN0aW9uIGNhbGwuCgoxMi8yOC8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gSkNBTEwgbWFjcm8gZm9yIEpOSSBjYWxscyB0aGF0IHdvcmsgaW4gYm90aCBDIGFuZCBDKysgdHlwZW1hcHMKICAgICAgICAgICBoYXZlIGJlZW4gcmVwbGFjZWQgd2l0aCBKQ0FMTDAsIEpDQUxMMSwgSkNBTEwyLCBKQ0FMTDMgYW5kIEpDQUxMNCAKICAgICAgICAgICBtYWNyb3MuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMi8yMi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBSZXNvbHZlZCBzb21lIGluY29uc2lzdGVudCBiZWhhdmlvciB3aXRoICVyZW5hbWUgYW5kIGNsYXNzIHJlbmFtaW5nLgogICAgICAgICAgIElmIHlvdSBzcGVjaWZ5IHRoZSBmb2xsb3dpbmc6CiAKICAgICAgICAgICAgICAgJXJlbmFtZShGb28pICBCYXI7CgogICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgQmFyKCk7CiAgICAgICAgICAgICAgICAgICAgfkJhcigpOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgIFRoZW4gdGhlICVyZW5hbWUgZGlyZWN0aXZlIGFwcGxpZXMgdG8gdGhlIGNsYXNzIGl0c2VsZiwgdGhlIGNvbnN0cnVjdG9yLAogICAgICAgICAgIGFuZCB0aGUgZGVzdHJ1Y3RvciAoYWxsIHdpbGwgYmUgcmVuYW1lZCB0byBGb28pLgoKICAgICAgICAgICBJZiBhIGNsYXNzIGRlZmluZXMgbW9yZSB0aGFuIG9uZSBjb25zdHJ1Y3RvciwgdGhlIG92ZXJsb2FkZWQgdmFyaWFudHMKICAgICAgICAgICBjYW4gc3RpbGwgYmUgcmVuYW1lZCBieSBzcGVjaWZ5aW5nIHBhcmFtZXRlcnMgdG8gJXJlbmFtZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJXJlbmFtZShCYXJfY29weSkgQmFyKEJhciAmKTsKICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBCYXIoKTsKICAgICAgICAgICAgICAgICAgICAgQmFyKEJhciAmKTsKICAgICAgICAgICAgICAgICAgICB+QmFyKCk7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgIFRoZXJlIGFyZSBzdGlsbCBzb21lIG9kZCBjb3JuZXIgY2FzZXMuICBJZiB5b3Ugc3BlY2lmeQoKICAgICAgICAgICAgICAgJXJlbmFtZShGb28pIDo6QmFyOwoKICAgICAgICAgICB0aGVuIG9ubHkgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIGlzIGNoYW5nZWQgYW5kIHRoZSBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yCiAgICAgICAgICAgbmFtZXMgYXJlIGxlZnQgdW5tb2RpZmllZC4gIElmIHlvdSBzcGVjaWZ5IAoKICAgICAgICAgICAgICAgJXJlbmFtZShGb28pICo6OkJhcjsKCiAgICAgICAgICAgdGhlbiB0aGUgbmFtZXMgb2YgdGhlIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgZnVuY3Rpb25zIGFyZSBtb2RpZmllZCBidXQKICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgaXMgbm90LgoKMTIvMjEvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIGpuaSwganR5cGUgYW5kIGpzdHlwZSB0eXBlbWFwcyBubyBsb25nZXIgaGFyZGNvZGVkIGJ1dCByZWFsIAogICAgICAgICAgIHR5cGVtYXBzLiBOZXcgdmFyaWFibGUgc3Vic3RpdHV0aW9uLCAkamF2YWNsYXNzbmFtZSwgY2FuIGJlIHVzZWQgaW4KICAgICAgICAgICB0aGUganN0eXBlIHR5cGVtYXBzLiBJdCBpcyByZXBsYWNlZCB3aXRoIHRoZSBKYXZhIHNoYWRvdyBjbGFzcyBuYW1lCiAgICAgICAgICAgd2hlcmUgYXBwbGljYWJsZS4KICAgICAgICAgICBbSmF2YV0gRml4IGZvciByZWNlbnRseSBpbnRyb2R1Y2VkIGJ1ZyB0byBkbyB3aXRoIGluaGVyaXRhbmNlIHdoZW4gCiAgICAgICAgICAgdXNpbmcgJWltcG9ydC4KICAgICAgICAgICBbSmF2YV0gQSBmZXcgbW9yZSBidWcgZml4ZXMsIHRvZG8gd2l0aCAlcmVuYW1lIGFuZCB1c2luZyB0aGUga2luZAogICAgICAgICAgIHdpdGggdGhlIHR5cGUsIGVnIAogICAgICAgICAgIHZvaWQgZm4odW5pb24gdW5pIG15dW5pLCBzdHJ1Y3Qgc3RyIG15c3RyLCBjbGFzcyBjbCBteWNsKTsKCjEyLzIwLzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFsgIzQ5NDUyNCBdIFByZXByb2Nlc3NvciBidWcgLSBhcG9zdHJvcGhlIGFuZCAjc3Vic3QuCgoxMi8yMC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBBZGRlZCBTV0lHX1ZFUlNJT04gcHJlcHJvY2Vzc29yIHN5bWJvbC4gICBUaGlzIGlzIGEgaGV4YWRlY2ltYWwKICAgICAgICAgICBpbnRlZ2VyIHN1Y2ggYXMgMHgwMTAzMTEgKGNvcnJlc3BvbmRpbmcgdG8gU1dJRy0xLjMuMTEpLiAgVGhpcyBjYW4KICAgICAgICAgICBiZSB1c2VkIGluIHRoZSBpbnRlcmZhY2UgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICNpZiBTV0lHX1ZFUlNJT04gPj0gMHgwMTAzMTEKICAgICAgICAgICAgICAgLyogVXNlIHNvbWUgZmFuY3kgbmV3IGZlYXR1cmUgKi8KICAgICAgICAgICAgICAgI2VuZGlmCgogICAgICAgICAgIE5vdGU6IFRoZSB2ZXJzaW9uIHN5bWJvbCBpcyBub3QgZGVmaW5lZCBpbiB0aGUgZ2VuZXJhdGVkIFNXSUcKICAgICAgICAgICB3cmFwcGVyIGZpbGUuCgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjEyLzIwLzIwMDE6bWtvZXBwZQoJICAgW016U2NoZW1lXTogUmVuYW1lZCBtenN3aWdfbWFrZV9ib29sZWFuIHRvCgkgICBzd2lnX21ha2VfYm9vbGVhbiwgYXMgdGhlIGxhdHRlciBpcyB1c2VkIGluIHRoZSB0eXBlbWFwcy4KCSAgIFJlcG9ydGVkIGJ5IEx1aWdpIEJhbGxhYmlvLgoKMTIvMTcvMjAwMTpta29lcHBlCgkgICBbR3VpbGVdOiBSZXdyb3RlIGxpc3QtdmVjdG9yLmkgdXNpbmcgbXVsdGktZGlzcGF0Y2gKCSAgIHR5cGVtYXBzLiAgVXBkYXRlZCBwb2ludGVyLWluLW91dC5pLiAgTWFrZSB0aGUKCSAgIGRlcHJlY2F0ZWQgdHlwZW1hcC1zdWJzdGl0dXRpb24gb2YgIiRzb3VyY2UiIGluICJhcmdvdXQiCgkgICB3b3JrIGFzIGJlZm9yZS4KCjEyLzE2LzIwMDE6bWtvZXBwZQoJICAgW0d1aWxlXTogRml4ZWQgbWFjcm9zICV2YWx1ZXNfYXNfbGlzdCwgJXZhbHVlc19hc192ZWN0b3IsCgkgICAlbXVsdGlwbGVfdmFsdWVzIHRvIHVzZSB0aGUgcHJvcGVyICVwcmFnbWEgc3ludGF4LiAgTmV3CgkgICBHdWlsZSBleGFtcGxlL3Rlc3QgIm11bHRpdmFsdWUiOyBuZXcgR3VpbGUgcnVuLXRlc3QgZm9yCgkgICB0ZXN0LXN1aXRlIGl0ZW0gImxpc3QtdmVjdG9yIiAoY3VycmVudGx5IGJyb2tlbikuCgoxMi8xNC8yMDAxOm1rb2VwcGUKCSAgIFtHdWlsZV06IEZpeGVkIHR5cGVtYXAtc3Vic3RpdGlvbiBidWcgZm9yICJ2YXJpbiIuICBSZWxheGVkCgkgICB2YWxpZC1pZGVudGlmaWVyIGNoZWNrIHRvIGFsbG93IGFsbCBSNVJTIGlkZW50aWZpZXJzLgoKClZlcnNpb24gMS4zLjEwIChEZWNlbWJlciAxMCwgMjAwMSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTIvMDgvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgTW9kaWZpZWQgJXR5cGVtYXAgc28gdGhhdCAleyAuLi4gJX0gY2FuIGFsc28gYmUgdXNlZCBhcyBhCiAgICAgICAgICAgY29kZSBibG9jayAobW9zdGx5IGZvciBjb21wbGV0ZW5lc3MpLiAgRm9yIGV4YW1wbGU6CiAKICAgICAgICAgICAgICAldHlwZW1hcChpbikgYmxhaCAlewogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICV9CgogICAgICAgICAgIFRoaXMgZm9ybSBkb2VzIG5vdCBpbnRyb2R1Y2UgYSBuZXcgYmxvY2sgc2NvcGUuICBBbHNvLCB0aGUKICAgICAgICAgICBjb2RlIGVuY2xvc2VkIGluICV7IC4uLiAlfSBpcyBub3QgcHJvY2Vzc2VkIGJ5IHRoZSBwcmVwcm9jZXNzb3IuCgoxMi8wOC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbICM0NTk2MTQgXSBTV0lHIHdpdGggbXVsdGlwbGUgVENMIGludGVycHJldGVycy4KCjEyLzA4LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFsgIzQxNzE0MSBdIHJ1YnlkZWMuc3dnIGlzIHdyb25nCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgUGF1bCBCcmFubmFuLgoKMTIvMDgvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyAjNDEwNTU3IF0gUHJvYmxlbSB3aXRoICVhZGRtZXRob2RzIG9uIE5ULgogICAgICAgICAgIFJlcG9ydGVkIGJ5IE1hZ251cyBManVuZy4KCjEyLzA4LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFsgIzQ0NTIzMyBdIEVuaGFuY2VtZW50OiBoYW5kbGUgYWNjZXNzIGNoYW5nZS4KICAgICAgICAgICBTV0lHIG5vdyBwYXJzZXMgKGJ1dCBpZ25vcmVzKSBDKysgYWNjZXNzIGNoYW5nZXMgZm9yIHRoZQogICAgICAgICAgIHRoZSBmb2xsb3dpbmc6CgogICAgICAgICAgICAgY2xhc3MgQSB7CiAgICAgICAgICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICAgICB2b2lkIHNvbWV0aGluZygpIHsgfQogICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgQSgpIHt9CiAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgIGNsYXNzIEIgOiBwcml2YXRlIEEgewogICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgQigpIDogQSgpIHsgfQogICAgICAgICAgICAgcHJvdGVjdGVkOgogICAgICAgICAgICAgICAgQTo6c29tZXRoaW5nOyAgICA8LS0tLSBQYXJzZWQsIGJ1dCBpZ25vcmVkCiAgICAgICAgICAgICB9OwogCiAgICAgICAgICAgU3VnZ2VzdGVkIGJ5IEtyenlzenRvZiBLb3ptaW5za2kuCgoxMi8wOC8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBGaXggZm9yIFJ1YnkgdG8gd29yayB1c2luZyBWaXN1YWwgQysrLgoKMTIvMDYvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyAjNDY1Njg3IF0gdW5zaWduZWQgc2hvcnQgcGFyYW1ldGVycyBmYWlsLgogICAgICAgICAgIFJlcG9ydGVkIGJ5IEdlcmFsZCBXaWxsaWFtcy4KCjEyLzA2LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIFsgIzQ4OTU5NCBdIFB5U3RyaW5nX0Zyb21TdHJpbmcgY2FuJ3QgdGFrZSBOVUxMIGFyZy4KICAgICAgICAgICBSZXBvcnRlZCBieSBKb2huIE1lcnJpdHQuICAgU1dJRyBub3cgY29udmVydHMgc3RyaW5nIHZhbHVlcwogICAgICAgICAgIHRvIFB5dGhvbiB1c2luZyBjb2RlIGxpa2UgdGhpczoKCiAgICAgICAgICAgcmVzdWx0b2JqID0gcmVzdWx0ID8gUHlTdHJpbmdfRnJvbVN0cmluZyhyZXN1bHQpIDogUHlfQnVpbGRWYWx1ZSgiIik7CgoxMi8wNi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBbICM0NjM1NjEgXSBUeXBlIGNvbnZlcnNpb25zIG5vdCBnZW5lcmF0ZWQuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgR2VyYWxkIFdpbGxpYW1zLgoJCjEyLzA0LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIFsgIzQ3MDIxNyBdIFRjbCBkZWZhdWx0IGFyZ3VtZW50IGhhbmRsaW5nLgogICAgICAgICAgIFJlcG9ydGVkIGJ5IFNoYXVuIExvd3J5LgoKMTIvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgWyAjNDcyMDg4IF0gZGVmaW5lZChNQUNSTykgZXhwYW5kZWQgZXZlcnl3aGVyZS4KICAgICAgICAgICBFbWJlZGRlZCBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyBzdWNoIGFzCgogICAgICAgICAgICAgICUjaWYgZGVmaW5lZChGT08pCgogICAgICAgICAgIGFyZSBub3QgZXhwYW5kZWQgYnkgdGhlIFNXSUcgcHJlcHJvY2Vzc29yLgogICAgICAgICAgIFJlcG9ydGVkIGJ5IEdlcmFsZCBXaWxsaWFtcy4KCjEyLzA0LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIFsgIzQ3NjQ2NyBdIFByb2JsZW1zIHdpdGggI2RlZmluZSAmIGNvbW1hcy4KCjEyLzA0LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIFsgIzQ3NzU0NyBdIHdyb25nIGRlY2xhcmF0aW9uIG9mIHBvaW50ZXIgZnVuY3Rpb25zLgogICAgICAgICAgIEJhZCBwcm90b3R5cGVzIGluIExpYi90Y2wvcHRybGFuZy5pLgoKMTIvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgWyAjNDgzMTgyIF0gQ29uc3RhbnRzIGNhbiB0YWtlIGFyZ3MgYnkgbWlzdGFrZS4gCiAgICAgICAgICAgV2hlbiBzd2lnIC1wZXJsNSAtY29uc3QgaXMgdXNlZCwgY29uc3RhbnRzIGFyZSBkZWNsYXJlZAogICAgICAgICAgIHdpdGggYSB2b2lkIHByb3RvdHlwZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIHN1YiBJQ09OU1QgKCkgeyAkZXhhbXBsZWM6OklDT05TVCB9CgogICAgICAgICAgIFBhdGNoIHN1Ym1pdHRlZCBieSBSaWNoIFdhbGVzLgoKMTIvMDMvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgTmV3ICVleGNlcHRpb24gZGlyZWN0aXZlLiAgIFRoaXMgaXMgaW50ZW5kZWQgdG8gcmVwbGFjZSAlZXhjZXB0LgogICAgICAgICAgIEl0IHdvcmtzIGluIGV4YWN0bHkgdGhlIHNhbWUgbWFubmVyIGV4Y2VwdCBpdCBkb2VzIG5vdCBhY2NlcHQgYSAKICAgICAgICAgICBsYW5ndWFnZSBzcGVjaWZpZXIuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJWV4Y2VwdGlvbiB7CiAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgJGFjdGlvbgogICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgIGNhdGNoKFNvbWVFcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgIGVycm9yCiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgJWV4Y2VwdGlvbiBpcyBhbHNvIG5hbWUgYXdhcmUtLS1hbGxvd2luZyBpdCB0byBiZSBhcHBsaWVkIHRvCiAgICAgICAgICAgc3BlY2lmaWMgZGVjbGFyYXRpb25zIGluIGFuIGludGVyZmFjZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlZXhjZXB0aW9uIGZvbyB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBleGNlcHRpb24gZm9yIGFueSBmdW5jdGlvbi9tZXRob2QgZm9vCiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgJWV4Y2VwdGlvbiBGb286OmJhciB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBleGNlcHRpb24gZm9yIG1ldGhvZCBiYXIgaW4gY2xhc3MgRm9vCiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICVleGNlcHRpb24gRm9vOjpiYXIoZG91YmxlKSB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBleGNlcHRpb24gZm9yIG1ldGhvZCBiYXIoZG91YmxlKSBpbiBjbGFzcyBGb28KICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICBUaGUgc2VtYW50aWNzIG9mIHRoaXMgbmFtZSBtYXRjaGluZyBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIGZvciAlcmVuYW1lLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAKMTIvMDMvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgU3Vic3RhbnRpYWwgY2xlYW51cCBvZiB0aGUgUHl0aG9uIHNoYWRvdyBjbGFzcyBjb2RlLiAgU2hhZG93IGNsYXNzZXMKICAgICAgICAgICB1c2VkIHRvIGJlIGNyZWF0ZWQgaW4gdGhpcyByYXRoZXIgY29tcGxpY2F0ZWQgbWFubmVyIGludm9sdmluZyBhYm91dAogICAgICAgICAgIGEgaGFsZi1kb3plbiBzdHJpbmdzIGNyZWF0ZWQgaW4gYml0cyBhbmQgcGllY2VzLiAgIFNoYWRvdyBjbGFzc2VzCiAgICAgICAgICAgYXJlIG5vdyBnZW5lcmF0ZWQgaW4gYSBtb3JlIHN0cmFpZ2h0Zm9yd2FyZCBtYW5uZXItLWluIHRoZSBzYW1lCiAgICAgICAgICAgb3JkZXIgdGhhdCBhcHBlYXJzIGluIHRoZSBpbnRlcmZhY2UgZmlsZS4KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgVGhlIG9yZGVyIGluIHdoaWNoIGRlY2xhcmF0aW9ucyBhcHBlYXIgaW4gdGhlIHNoYWRvdyBmaWxlIG1heSBkaWZmZXIuCiAgICAgICAgICAgCjEyLzAzLzIwMDE6YmVhemxleQogICAgICAgICAgIFRoZSAlaW5zZXJ0IGRpcmVjdGl2ZSAoJXsgLi4uICV9LCAlcnVudGltZSwgJWhlYWRlciwgJXdyYXBwZXIsIGV0Yy4pCiAgICAgICAgICAgY2FuIG5vdyBiZSB1c2VkIGluc2lkZSBvZiBhIGNsYXNzIGRlZmluaXRpb24uICAgVGhpcyBoYXMgcG90ZW50aWFsCiAgICAgICAgICAgdXNlcyB3aGVuIGdlbmVyYXRpbmcgc2hhZG93IGNsYXNzIGNvZGUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgJWluc2VydCgic2hhZG93IikgJXsKICAgICAgICAgICAgICAgICAjIFNvbWUgcHl0aG9uIGNvZGUKICAgICAgICAgICAgICAgICBkZWYgYmxhaChzZWxmKToKICAgICAgICAgICAgICAgICAgICAgIHByaW50ICJJJ20gYmxhaCEiCiAgICAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgVGhlIHN1cHBvcnQgZm9yIGNsYXNzIGNvZGUgaW5zZXJ0aW9uIGRlcGVuZHMgb24gdGhlIGxhbmd1YWdlIG1vZHVsZS4KICAgICAgICAgICBIb3dldmVyLCB0aGUgaW50ZW50IG9mIHRoaXMgZmVhdHVyZSBpcyB0byBzaW1wbGlmeSB0aGUgdGFzayBvZiBleHRlbmRpbmcKICAgICAgICAgICBzaGFkb3cgY2xhc3MgY29kZS4gICBJbiB0aGUgUHl0aG9uIG1vZHVsZSwgdGhpcyBpbnNlcnRzIGNvZGUgd2l0aCB0aGUKICAgICAgICAgICBwcm9wZXIgbGV2ZWwgb2YgaW5kZW5kYXRpb24gKHJlZ2FyZGxlc3Mgb2Ygd2hhdCB3YXMgdXNlZCBpbiB0aGUgU1dJRwogICAgICAgICAgIGludGVyZmFjZSkuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTEvMjkvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgTW9kaWZpY2F0aW9ucyBmb3IgSmF2YSBhbmQgUHl0aG9uIG1vZHVsZXMgdG8gd29yayBvbiBjeWd3aW4uCiAgICAgICAgICAgVW5mb3J0dW5hdGVseSBhIGxvdCBvZiB0aGUgcHl0aG9uIG1vZHVsZSBoYXMgc3RhcnRlZCB0byBwcm9kdWNlcyBjb2RlIAogICAgICAgICAgIHdoaWNoIGNhbm5vdCBiZSBhdXRvLWltcG9ydGVkIHVzaW5nIGN5Z3dpbiBsaWJ0b29scyBzbyBtb3N0IG9mIGl0IGlzIAogICAgICAgICAgIHN0aWxsIGJyb2tlbi4KCjExLzI4LzIwMDE6YmVhemxleQogICAgICAgICAgIFRoZSAlcmVuYW1lIGFuZCAlZmVhdHVyZSBkaXJlY3RpdmUgY2FuIG5vdyBiZSB1c2VkIGluc2lkZQogICAgICAgICAgIG9mIGEgY2xhc3MgZGVmaW5pdGlvbi4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAlcmVuYW1lKGZvb19pKSBmb28oaW50KTsKICAgICAgICAgICAgICAgICAlcmVuYW1lKGZvb19kKSBmb28oZG91YmxlKTsKICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQpOwogICAgICAgICAgICAgICAgIHZvaWQgZm9vKGRvdWJsZSk7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICB9OwoKICAgICAgICAgICBXaGVuIHVzZWQgaW4gdGhpcyBtYW5uZXIsIHRoZSAlcmVuYW1lIGRpcmVjdGl2ZSBvbmx5IGFwcGxpZXMKICAgICAgICAgICB0byBtZW1iZXJzIG9mIHRoZSBjbGFzcyBpbiB3aGljaCBpdCBhcHBlYXJzIGFzIHdlbGwgYXMgYWxsCiAgICAgICAgICAgZGVyaXZlZCBjbGFzc2VzLiAgSW4gZmFjdCwgdGhpcyBpcyByZWFsbHkganVzdCB0aGUgc2FtZQogICAgICAgICAgIGFzIHNheWluZzoKCiAgICAgICAgICAgICAlcmVuYW1lKGZvb19pKSBGb286OmZvbyhpbnQpOwogICAgICAgICAgICAgJXJlbmFtZShmb29fZCkgRm9vOjpmb28oZG91YmxlKTsKICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgIH07CgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjExLzI2LzIwMDE6YmVhemxleQogICAgICAgICAgIEFkZGVkIHRoZSBleHBlcmltZW50YWwgJWZlYXR1cmUgZGlyZWN0aXZlLiAgJWZlYXR1cmUgY2FuIGJlCiAgICAgICAgICAgdXNlZCB0byBhdHRhY2ggYXJiaXRyYXJ5IHN0cmluZyBhdHRyaWJ1dGVzIHRvIHBhcnNlIHRyZWUgbm9kZXMuCiAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAlZmVhdHVyZSgiZXhjZXB0IikgYmxhaCB7CiAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgJGZ1bmN0aW9uCiAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgIHdoYXRldmVyOyAgICAgIAogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CgogICAgICAgICAgIG9yCgogICAgICAgICAgICAgICVmZWF0dXJlKCJzZXQiKSAqOjp4X3NldCAieCI7CgogICAgICAgICAgIG9yCgogICAgICAgICAgICAgICVmZWF0dXJlKCJibGFoIikgRm9vOjpiYXIoaW50LGRvdWJsZSkgY29uc3QgInNwYW0iOwoKICAgICAgICAgICBUaGUgc3ludGF4IGlzIGJvcnJvd2VkIGZyb20gdGhlICVyZW5hbWUgZGlyZWN0aXZlLiAgSW4gZmFjdCwgdGhlCiAgICAgICAgICAgZXhhY3Qgc2FtZSBzZW1hbnRpY3MgYXBwbHkgKGluaGVyaXRhbmNlLCBtYXRjaGluZywgZXRjLikuCgogICAgICAgICAgICVmZWF0dXJlIGlzIGEgdmVyeSBwb3dlcmZ1bCBsb3ctbGV2ZWwgcHJpbWl0aXZlIHRoYXQgY2FuIGJlIHVzZWQgdG8KICAgICAgICAgICBjdXN0b21pemUgaW5kaXZpZHVhbCBsYW5ndWFnZSBtb2R1bGVzIGFuZCB0byBwcm92aWRlIGhpbnRzIHRvIAogICAgICAgICAgIGFueSBzdGFnZSBvZiBjb2RlIGdlbmVyYXRpb24uICAgRmVhdHVyZXMgYXJlIGF0dGFjaGVkIHRvCiAgICAgICAgICAgcGFyc2UgdHJlZSBub2RlcyBhcyBhdHRyaWJ1dGVzIHdpdGggbmFtZXMgbGlrZSAiZmVhdHVyZToqIiB3aGVyZSAqIAogICAgICAgICAgIGlzIHJlcGxhY2VkIGJ5IHRoZSBmZWF0dXJlIG5hbWUgKGUuZy4sICJmZWF0dXJlOmV4Y2VwdCIsICJmZWF0dXJlOnNldCIsIAogICAgICAgICAgIGV0Yy4pLiAgIExhbmd1YWdlIG1vZHVsZXMgY2FuIHRoZW4gbG9vayBmb3IgdGhlIGZlYXR1cmVzIHVzaW5nIAogICAgICAgICAgIGEgc2ltcGxlIGF0dHJpYnV0ZSBsb29rdXAuCgogICAgICAgICAgICVmZWF0dXJlIGlzIGludGVuZGVkIHRvIGJlIGEgcmVwbGFjZW1lbnQgZm9yIGEgbnVtYmVyIG9mCiAgICAgICAgICAgb2xkZXIgU1dJRyBkaXJlY3RpdmVzIGluY2x1ZGluZyAlZXhjZXB0IGFuZCBzcGVjaWFsaXplZAogICAgICAgICAgIHByYWdtYXMuIEl0IGlzIG1vcmUgcG93ZXJmdWwgKGR1ZSB0byBpdHMgcGFyYW1ldGVyaXplZAogICAgICAgICAgIG5hbWUgbWF0Y2hpbmcpIGFuZCBpdCBwcm92aWRlcyB2ZXJ5IHByZWNpc2UgY29udHJvbCBvdmVyCiAgICAgICAgICAgaG93IGN1c3RvbWl6YXRpb24gZmVhdHVyZXMgYXJlIGF0dGFjaGVkIHRvIGluZGl2aWR1YWwKICAgICAgICAgICBkZWNsYXJhdGlvbnMuICAgVGhlcmUgYXJlIGZ1dHVyZSBleHBhbnNpb24gcGxhbnMgdGhhdCB3aWxsCiAgICAgICAgICAgYnVpbGQgdXBvbiB0aGlzIGNhcGFiaWxpdHkgYXMgd2VsbC4KCiAgICAgICAgICAgSXQncyBub3QgY2VydGFpbiB0aGF0ICVmZWF0dXJlIHdpbGwgZXZlciBiZSB1c2VkIGRpcmVjdGx5CiAgICAgICAgICAgYnkgU1dJRyB1c2Vycy4gIEluc3RlYWQsIGl0IG1heSBiZSBhIGxvdy1sZXZlbCBwcmltaXRpdmUKICAgICAgICAgICB0aGF0IGlzIHVzZWQgaW4gaGlnaC1sZXZlbCBtYWNybyBkZWZpbml0aW9ucy4gIEZvciBpbnN0YW5jZSwKICAgICAgICAgICB0byBzdXBwb3J0IHByb3BlcnRpZXMsIHlvdSBtaWdodCBkZWZpbmUgYSBtYWNybyBsaWtlIHRoaXM6CgogICAgICAgICAgICVkZWZpbmUgJXByb3BlcnR5KG5hbWUsIHNldGYsIGdldGYpCiAgICAgICAgICAgJWZlYXR1cmUoInNldCIpIHNldGYgI25hbWU7CiAgICAgICAgICAgJWZlYXR1cmUoImdldCIpIGdldGYgI25hbWU7CiAgICAgICAgICAgJWVuZGRlZgoKICAgICAgICAgICBXaGljaCBhbGxvd3MgYSB1c2VyIHRvIHNwZWNpZnkgdGhpbmdzIGxpa2UgdGhpczoKCiAgICAgICAgICAgJXByb3BlcnR5KHAsIGdldF9wLCBzZXRfcCk7CgogICAgICAgICAgIGNsYXNzIEJsYWggewogICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICBpbnQgIGdldF9wKCk7CiAgICAgICAgICAgICAgdm9pZCBzZXRfcChpbnQpOwogICAgICAgICAgIH07CgogICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgTkVXIEZFQVRVUkUgKioqCiAgCjExLzI0LzIwMDE6YmVhemxleQogICAgICAgICAgIFRoZSBUY2wgbW9kdWxlIGhhcyBiZWVuIGV4cGFuZGVkIHdpdGggc29tZSBuZXcgZmVhdHVyZXMgZm9yCiAgICAgICAgICAgbWFuYWdpbmcgb2JqZWN0IG93bmVyc2hpcC4gIEZvciBleGFtcGxlOgogICAgICAgICAKICAgICAgICAgICAgICAgIHNldCBjIFtDaXJjbGUgLWFyZ3MgMjBdCiAgICAgICAgICAgICAgICAkYyBhcmVhICAgICAgICAgICAgICMgSW52b2tlIGEgbWV0aG9kCiAgICAgICAgICAgICAgICAkYyAtZGlzb3duICAgICAgICAgICMgUmVsZWFzZXMgb3duZXJzaGlwIG9mIHRoZSBvYmplY3QKICAgICAgICAgICAgICAgICRjIC1hY3F1aXJlICAgICAgICAgIyBBY3F1aXJlcyBvd25lcnNoaXAgb2YgdGhlIG9iamVjdAoKICAgICAgICAgICBJZiBUY2wgb3ducyB0aGUgb2JqZWN0LCBpdHMgZGVzdHJ1Y3RvciBpcyBpbnZva2VkIHdoZW4gdGhlIAogICAgICAgICAgIGNvcnJlc3BvbmRpbmcgb2JqZWN0IGNvbW1hbmQgaXMgZGVsZXRlZCBpbiBUY2wuICAKCiAgICAgICAgICAgVG8gc2ltcGxpZnkgdGhlIGRlc3RydWN0aW9uIG9mIG9iamVjdHMsIHRoZSBmb2xsb3dpbmcgc3ludGF4CiAgICAgICAgICAgY2FuIGJlIHVzZWQ6CgogICAgICAgICAgICAgICAgJGMgLWRlbGV0ZSAgICAgICAgICMgRGVsZXRlIGFuIG9iamVjdAoKICAgICAgICAgICBUaGlzIGlzIGFuIGFsdGVybmF0aXZlIGZvciB0aGUgbW9yZSBvYnNjdXJlIHZhcmlhbnQgb2YgCgogICAgICAgICAgICAgICAgcmVuYW1lICRjIHt9CgogICAgICAgICAgIFRoZXNlIGZlYXR1cmVzIGFsc28gYWRkIGZ1bmN0aW9uYWxpdHkgYXQgdGhlIEMgQVBJIGxldmVsLgogICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIG1hbmFnZSBvd25lcnNoaXAgZnJvbSBDIGFuZAogICAgICAgICAgIGNhbiBiZSB1c2VkIGluIHR5cGVtYXBzLgoKICAgICAgICAgICAgICAgIFNXSUdfQWNxdWlyZSh2b2lkICpwdHIpOwogICAgICAgICAgICAgICAgU1dJR19EaXNvd24odm9pZCAqcHRyKTsKCiAgICAgICAgICAgQSBuZXcgZnVuY3Rpb24gZm9yIGNvbnN0cnVjdGluZyBpbnN0YW5jZXMgaXMgYWxzbyBhdmFpbGFibGU6CgogICAgICAgICAgICAgICAgVGNsX09iaiAqCiAgICAgICAgICAgICAgICBTV0lHX05ld0luc3RhbmNlT2JqKFRjbF9JbnRlcnAgKmludGVycCwgdm9pZCAqcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2lnX3R5cGVfaW5mbyAqdHlwZSwgaW50IG93bik7CgogICAgICAgICAgIFdoZW4gdXNlZCBpbiBhIHR5cGVtYXAsIHRoaXMgY3JlYXRlcyBhIHBvaW50ZXIgb2JqZWN0IGFuZAogICAgICAgICAgIGFuIGludGVycHJldGVyIGNvbW1hbmQgdGhhdCBjYW4gYmUgdXNlZCB0byBpc3N1ZSBtZXRob2RzIGFuZAogICAgICAgICAgIGFjY2VzcyBhdHRyaWJ1dGVzIGFzIHNob3duIGFib3ZlLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAKMTEvMjMvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQWxsIFB5dGhvbi1yZWxhdGVkICVwcmFnbWEgb3BlcmF0aW9ucyBoYXZlIGJlZW4gZWxpbWluYXRlZC4KICAgICAgICAgICBNb3N0IG9mIHRoZXNlIHdlcmUgd3JpdHRlbiBmb3Igb2xkZXIgU1dJRyB2ZXJzaW9ucyBpbiBvcmRlciB0bwogICAgICAgICAgIGNvbXBlbnNhdGUgZm9yIGxpbWl0YXRpb25zIGluIGVhcmxpZXIgcmVsZWFzZXMuICBJbiBhbiBlZmZvcnQKICAgICAgICAgICB0byByZWR1Y2UgdGhlIGFtb3VudCBvZiBjb2RlLWNsdXR0ZXIgYW5kIHBvdGVudGlhbCBmb3IgZXJyb3JzLAogICAgICAgICAgIGl0IGlzIGVhc2llciB0byBzaW1wbHkgZWxpbWluYXRlIHRoZSBwcmFnbWFzIGFuZCB0byBzdGFydCBvdmVyCiAgICAgICAgICAgKGlmIG5lZWRlZCkuICBUbyBiZSBob25lc3QsIEknbSBub3QgZXZlbiBzdXJlIHRoZSBwcmFnbWFzCiAgICAgICAgICAgd29ya2VkIGluIDEuMy45IGFuZCByZWNlbnQgcmVsZWFzZXMuCgogICAgICAgICAgIE5vdGU6IElmIHlvdSBuZWVkIHRvIGluc2VydCBjb2RlIGludG8gdGhlIHNoYWRvdyBjbGFzcyBmaWxlCiAgICAgICAgICAgY3JlYXRlZCBieSBTV0lHLCBzaW1wbHkgdXNlIHRoZSAlc2hhZG93IGRpcmVjdGl2ZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICVzaGFkb3cgJXsKICAgICAgICAgICAgICBkZWYgc29tZV9weXRob25fY29kZSgpOiAgICAgICAgIAogICAgICAgICAgICAgICAgICBwcmludCAiYmxhaCEiCiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8yMi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBTd2VlcGluZyBjaGFuZ2VzIHRvIHRoZSB3YXkgaW4gd2hpY2ggdGhlIFB5dGhvbiBtb2R1bGUgaGFuZGxlcwogICAgICAgICAgIHNoYWRvdyBjbGFzc2VzLiAgIEluIGVhcmx5IGltcGxlbWVudGF0aW9ucywgc2hhZG93IGNsYXNzZXMgd2VyZQogICAgICAgICAgIG1lcmVseSBQeXRob24gd3JhcHBlcnMgYXJvdW5kIHR5cGVkIHBvaW50ZXIgb2JqZWN0cy4gSG93ZXZlciwgCiAgICAgICAgICAgc29tZSB1c2VycyBhY3R1YWxseSB3YW50ZWQgdG8gcmVjZWl2ZSB0aGUgc2hhZG93IGNsYXNzIG9iamVjdCBpbiBDLgogICAgICAgICAgIFRvIGFjY29tbW9kYXRlIHRoaXMsIHRoZSBkZXJlZmVyZW5jaW5nIG9mIHRoZSAidGhpcyIgcG9pbnRlciBpbgogICAgICAgICAgIGEgc2hhZG93IGNsYXNzIHdhcyBtb3ZlZCB0byBDIGFzIGRlc2NyaWJlZCBpbiBDSEFOR0VTIFs4LzgvOTldLgogICAgICAgICAgIEhvd2V2ZXIsIHRoZSBwcm9jZXNzIG9mIHJldHVybmluZyBwb2ludGVycyB0byBQeXRob24gd2FzIHN0aWxsCiAgICAgICAgICAgc29tZXdoYXQgcHJvYmxlbWF0aWMuICBTcGVjaWZpY2FsbHksIHNoYWRvdyBjbGFzc2VzIG5ldmVyIHdvcmtlZAogICAgICAgICAgIGluIHNpdHVhdGlvbnMgc3VjaCBhcyB0aGVzZToKCiAgICAgICAgICAgICAtICAgVXNlIG9mIGFueSBraW5kIG9mIG91dHB1dCB0eXBlbWFwICgnb3V0JyBvciAnYXJnb3V0JykKICAgICAgICAgICAgIC0gICBHbG9iYWwgdmFyaWFibGVzIChicm9rZW4gYXMgZmFyIGFzIEkgY2FuIHRlbGwpLgoKICAgICAgICAgICBJbiB0aGUgcGFzdCwgc29tZSB1c2VycyBoYXZlIGRlYWx0IHdpdGggdGhpcyBieSBtYW51YWxseSB0cnlpbmcKICAgICAgICAgICB0byBjcmVhdGUgc2hhZG93IGNsYXNzIG9iamVjdHMgdGhlbXNlbHZlcyBmcm9tIEMvQysrLiAgSG93ZXZlciwKICAgICAgICAgICB0aGlzIHdhcyBkaWZmaWN1bHQgYmVjYXVzZSB0aGUgQyB3cmFwcGVycyBkb24ndCByZWFsbHkga25vdyBob3cKICAgICAgICAgICB0byBnZXQgYWNjZXNzIHRvIHRoZSBjb3JyZXNwb25kaW5nIFB5dGhvbiBjbGFzcy4KCiAgICAgICAgICAgVGhlIFB5dGhvbiBtb2R1bGUgaGFzIG5vdyBiZWVuIG1vZGlmaWVkIHRvIGF1dG9tYXRpY2FsbHkgYXR0YWNoCiAgICAgICAgICAgc2hhZG93IGNsYXNzIG9iamVjdHMgdG8gcG9pbnRlcnMgd2hlbiB0aGV5IGFyZSByZXR1cm5lZCB0byAKICAgICAgICAgICBQeXRob24uICAgVGhpcyBwcm9jZXNzIG9jY3VycyBpbiB0aGUgZnVuY3Rpb24gU1dJR19OZXdQb2ludGVyT2JqKCkKICAgICAgICAgICBzbyB0aGUgcHJvY2VzcyBpcyBjb21wbGV0ZWx5IHRyYW5zcGFyZW50IHRvIHVzZXJzLiAgICBBcyBhIHJlc3VsdCwKICAgICAgICAgICBzaGFkb3cgY2xhc3NlcyBhcmUgbm93IG1vcmUgc2VhbWxlc3NseSBpbnRlZ3JhdGVkIHdpdGggdHlwZW1hcHMKICAgICAgICAgICBhbmQgb3RoZXIgZmVhdHVyZXMgb2YgU1dJRy4KCiAgICAgICAgICAgVGhpcyBjaGFuZ2UgbWF5IGludHJvZHVjZSBhIG51bWJlciBvZiBpbmNvbXBhdGliaWxpdGllcy4gIFRoZQogICAgICAgICAgIFNXSUdfTmV3UG9pbnRlck9iaigpIG5vdyB0YWtlcyBhbiBleHRyYSBwYXJhbWV0ZXIgIm93biIgdG8gCiAgICAgICAgICAgaW5kaWNhdGUgb2JqZWN0IG93bmVyc2hpcC4gICBUaGlzIGNhbiBiZSB1c2VkIHRvIHJldHVybiBhIHBvaW50ZXIKICAgICAgICAgICB0byBQeXRob24gdGhhdCBQeXRob24gc2hvdWxkIGRlc3Ryb3kuICAgSW4gYWRkaXRpb24sIG9sZGVyIGNvZGUKICAgICAgICAgICB0aGF0IHRyaWVzIHRvIG1hbnVhbGx5IGNvbnN0cnVjdCBzaGFkb3cgY2xhc3Mgb2JqZWN0cyBvciB3aGljaAogICAgICAgICAgIGV4cGVjdHMgYmFyZSBwb2ludGVycyBtYXkgYnJlYWstLS1zdWNoIHBvaW50ZXJzIG1heSBhbHJlYWR5IGJlCiAgICAgICAgICAgZW5jYXBzdWxhdGVkIGJ5IGEgc2hhZG93IGNsYXNzLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTEvMjAvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgTW9kaWZpZWQgdGhlICVpbnNlcnQgZGlyZWN0aXZlIHRvIGFjY2VwdCBzaW5nbGUgYnJhY2VzIHsgLi4uIH0uCiAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJWluc2VydCgiaGVhZGVyIikgewogICAgICAgICAgICAgICAgICAgLi4uIHNvbWUgY29kZSAuLi4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgVGhpcyB3b3JrcyBleGFjdGx5IGxpa2UgJXsgLi4uICV9IGV4Y2VwdCB0aGF0IHRoZSBjb2RlIGluIHRoZQogICAgICAgICAgIGJyYWNlcyBpcyBwcm9jZXNzZWQgdXNpbmcgdGhlIHByZXByb2Nlc3Nvci4gICBUaGlzIGNhbiBiZSB1c2VmdWwKICAgICAgICAgICBpbiBjZXJ0YWluIGNvbnRleHRzIHN1Y2ggYXMgbG93LWxldmVsIGNvZGUgZ2VuZXJhdGlvbiBpbiAKICAgICAgICAgICBsYW5ndWFnZSBtb2R1bGVzLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAKMTEvMjAvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQ29tbWFuZCBsaW5lIG9wdGlvbnMgYXJlIG5vdyB0cmFuc2xhdGVkIGludG8gcHJlcHJvY2Vzc29yCiAgICAgICAgICAgc3ltYm9scy4gIEZvciBleGFtcGxlOgoJCiAgICAgICAgICAgICAgLi9zd2lnIC1weXRob24gLXNoYWRvdyAtbW9kdWxlIGJsYWggaW50ZXJmYWNlLmkKCiAgICAgICAgICAgQ3JlYXRlcyB0aGUgc3ltYm9sczoKCiAgICAgICAgICAgICAgU1dJR09QVF9QWVRIT04gMQogICAgICAgICAgICAgIFNXSUdPUFRfU0hBRE9XIDEKICAgICAgICAgICAgICBTV0lHT1BUX01PRFVMRSBibGFoCiAgICAgICAgICAgICAgCiAgICAgICAgICAgTW9kdWxlcyBjYW4gbG9vayBmb3IgdGhlc2Ugc3ltYm9scyB0byBhbHRlciB0aGVpciBjb2RlIGdlbmVyYXRpb24KICAgICAgICAgICBpZiBuZWVkZWQuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgICAgCjExLzIwLzIwMDE6YmVhemxleQogICAgICAgICAgIE1hc3NpdmUgb3ZlcmhhdWwgb2YgdGhlIFBlcmw1IG1vZHVsZS4gIEEgbG90IG9mIGNvZGUgZ2VuZXJhdGlvbiBpcwogICAgICAgICAgIG5vdyBkcml2ZW4gYnkgdGFibGVzIGFuZCB0eXBlbWFwcy4gICBUaGUgZ2VuZXJhdGVkIHdyYXBwZXIgY29kZSAKICAgICAgICAgICBhbHNvIG1ha2VzIHVzZSBvZiB0YWJsZXMgdG8gaW5zdGFsbCBjb25zdGFudHMsIHZhcmlhYmxlcywgYW5kCiAgICAgICAgICAgZnVuY3Rpb25zIGluc3RlYWQgb2YgaW5saW5pbmcgYSBidW5jaCBvZiBwcm9jZWR1cmUgY2FsbHMuICBUaGUKICAgICAgICAgICBzZXBhcmF0ZSB2YXJpYWJsZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBpcyBnb25lLiAgIE1vc3QKICAgICAgICAgICBjb2RlIGdlbmVyYXRpb24gaXMgY29udHJvbGxlZCB2aWEgdGhlIHBlcmw1LnN3ZyBmaWxlIGluIHRoZQogICAgICAgICAgIGxpYnJhcnkuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgCjExLzEzLzIwMDE6YmVhemxleQogICAgICAgICAgIEFkZGVkIHBhcnNpbmcgc3VwcG9ydCBmb3IgdGhlIEMrKyB0eXBlbmFtZSBrZXl3b3JkLiAgUHJpbWFyaWx5IHRoaXMKICAgICAgICAgICBpcyBhZGRlZCB0byBiZXR0ZXIgc3VwcG9ydCB0ZW1wbGF0ZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkICBibGFoKEMmIHYpIHsKICAgICAgICAgICAgICAgICB0eXBlbmFtZSBDOjppdGVyYXRvciBpID0gdi5iZWdpbigpOwogICAgICAgICAgICAgfQoKICAgICAgICAgICBOb3RlOiB0eXBlbmFtZSBpcyBzdXBwb3J0ZWQgaW4gdGhlIHBhcnNlciBpbiB0aGUgc2FtZSB3YXkgYXMgJ3N0cnVjdCcKICAgICAgICAgICBvciAnY2xhc3MnLiAgWW91IHByb2JhYmx5IHNob3VsZG4ndCB1c2UgaXQgYW55d2hlcmUgZXhjZXB0IGluIHRlbXBsYXRlcy4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMS8xMS8yMDAxOmJlYXpsZXkKICAgICAgICAgICBNYXNzaXZlIG92ZXJoYXVsIG9mIHRoZSBsYW5ndWFnZSBtb2R1bGUgQVBJLiAgIE1vc3QgZnVuY3Rpb25zIG5vdwogICAgICAgICAgIHVzZSBhIGNvbW1vbiwgdmVyeSBzaW1wbGUsICBBUEkuICAgVGhlcmUgYXJlIGFsc28gYSBudW1iZXIgb2YKICAgICAgICAgICBpbnRlcmVzdGluZyBzZW1hbnRpYyBzaWRlLWVmZmVjdHMgb2YgaG93IGNvZGUgaXMgYWN0dWFsbHkgZ2VuZXJhdGVkLgogICAgICAgICAgIERldGFpbHMgd2lsbCBiZSBmb3J0aGNvbWluZyBpbiBEb2MvTWFudWFsL0V4dGVuZGluZy5odG1sLgoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiogTGFuZ3VhZ2UgbW9kdWxlcyB3cml0dGVuIGZvcgogICAgICAgICAgIHByZXZpb3VzIHZlcnNpb25zIG9mIFNXSUcgd2lsbCBubyBsb25nZXIgd29yaywKCjExLzEwLzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIGEgdmVyeSBzdWJ0bGUgYnVnIGR1ZSB0byB1bm5hbWVkIGNsYXNzIHdyYXBwaW5nLiBGb3IgZXhhbXBsZSwgaWYKICAgICAgICAgICB5b3UgZGlkIHRoaXMKCiAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgewogICAgICAgICAgICAgICAgICBpbnQgeCx5OwogICAgICAgICAgICAgIH0gZ2RQb2ludCwgKmdkUG9pbnRQdHI7CgogICAgICAgICAgICAgIHZvaWQgZm9vKGdkUG9pbnRQdHIgeCk7CgogICAgICAgICAgIFRoZW4gdGhlIGZvbyBmdW5jdGlvbiB3b3VsZCBnZXQgYSB0eXBlLWVycm9yLiAgIFRoZSBwcm9ibGVtIGhhcwogICAgICAgICAgIHRvIGRvIHdpdGggaW50ZXJuYWwgdHlwZWRlZiBoYW5kbGluZyBhbmQgdGhlIGZhY3QgdGhhdCB0aGUgdHlwZWRlZgogICAgICAgICAgIGRlY2xhcmF0aW9ucyBhZnRlciB0aGUgc3RydWN0IGFwcGVhciBsYXRlciBpbiB0aGUgcGFyc2UgdHJlZS4KICAgICAgICAgICBJdCBzaG91bGQgd29yayBub3cuICBQcm9ibGVtIHJlcG9ydGVkIGJ5IFZpbiBKb3Zhbm92aWMuCgoxMS8wOS8yMDAxOmJlYXpsZXkKICAgICAgICAgICBTdWJ0bGUgY2hhbmdlIHRvICJvdXQiIHR5cGVtYXBzIChhbmQgcmVsYXRlZCB2YXJpYXRpb25zKS4gIFRoZSBuYW1lCiAgICAgICAgICAgdGhhdCBpcyBhdHRhY2hlZCB0byB0aGUgdHlwZW1hcCBpcyBub3cgdGhlIHJhdyBDIGlkZW50aWZpZXIgdGhhdAogICAgICAgICAgIGFwcGVhcnMgb24gYSBkZWNsYXJhdGlvbi4gIFRoaXMgY2hhbmdlcyB0aGUgYmVoYXZpb3Igb2YKICAgICAgICAgICBtZW1iZXIgZnVuY3Rpb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIGludCBmb28gewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgY2xhc3MgQmxhaCB7CiAgICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9vKCk7ICAgIC8vIHR5cGVtYXAgZ2V0cyBhcHBsaWVkCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgUHJldmlvdXMgdmVyc2lvbnMgbmV2ZXIgcmVhbGx5IHNwZWNpZmllZCBob3cgdGhpcyB3YXMgc3VwcG9zZWQgdG8KICAgICAgICAgICB3b3JrLiAgSW4gU1dJRzEuMSwgeW91IGNvdWxkIHByb2JhYmx5IHdyaXRlIGEgdHlwZW1hcCBmb3IgdGhlCiAgICAgICAgICAgd3JhcHBlciBuYW1lIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIGludCBCbGFoX2ZvbyB7IC4uLiB9CgogICAgICAgICAgIEhvd2V2ZXIsIHRoaXMgb2xkIGJlaGF2aW9yIGlzIG5vdyB3aXRoZHJhd24gYW5kIG5vdCBzdXBwb3J0ZWQuIAogICAgICAgICAgIEp1c3QgdXNlIHRoZSBtZW1iZXIgbmFtZSB3aXRob3V0IGFueSBzb3J0IG9mIHNwZWNpYWwgcHJlZml4LgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTEvMDYvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlcyB0byBUY2wgbW9kdWxlIGluaXRpYWxpemF0aW9uOgoKICAgICAgICAgICAoMSkgU1dJRyBub3cgYXV0b21hdGljYWxseSBpbmNsdWRlcyB0aGUgY29kZSBuZWVkZWQgdG8gd29yayB3aXRoCiAgICAgICAgICAgICAgICBUY2wgc3R1YnMuICBTaW1wbHkgY29tcGlsZSB3aXRoIC1EVVNFX1RDTF9TVFVCUy4KCiAgICAgICAgICAgKDIpIFNXSUcgbm93IGF1dG9tYXRpY2FsbHkgY2FsbHMgVGNsX1BrZ1Byb3ZpZGUgdG8gcmVnaXN0ZXIKICAgICAgICAgICAgICAgYSBwYWNrYWdlIG5hbWUuICBUaGUgcGFja2FnZSBuYW1lIGlzIHRoZSBzYW1lIGFzIHRoZSBuYW1lCiAgICAgICAgICAgICAgIHNwZWNpZmllZCB3aXRoIHRoZSAlbW9kdWxlIGRpcmVjdGl2ZS4gIFRoZSB2ZXJzaW9uIG51bWJlciBpcwogICAgICAgICAgICAgICBzZXQgdG8gIjAuMCIgYnkgZGVmYXVsdC4gIFRvIGNoYW5nZSB0aGUgdmVyc2lvbiBudW1iZXIsIHVzZQogICAgICAgICAgICAgICBzd2lnIC1wa2d2ZXJzaW9uIDEuMiBpbnRlcmZhY2UuaS4KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgTW9kdWxlcyB0aGF0IHByb3ZpZGVkIHN0dWJzIGFuZCBUY2xfUGtnUHJvdmlkZSBvbiB0aGVpciBvd24gbWlnaHQKICAgICAgICAgICBicmVhay4gIFNpbXBseSByZW1vdmUgdGhhdCBjb2RlLgoKMTEvMDUvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlZCBjb2RlIGdlbmVyYXRpb24gb2YgY29uc3RhbnRzIGluIHRoZSBUY2wgbW9kdWxlLiAgQ29uc3RhbnRzCiAgICAgICAgICAgYXJlIG5vdyBzdG9yZWQgaW4gYSBsYXJnZSB0YWJsZSB0aGF0IGdldCBpbnN0YWxsZWQgYXQgbW9kdWxlIHN0YXJ0dXAuCiAgICAgICAgICAgVGhlcmUgYXJlIGFsc28gbm8gbG9uZ2VyIGFueSBzdGF0aWMgdmFyaWFibGVzIHNvIGl0IHNob3VsZCBnZW5lcmF0ZQogICAgICAgICAgIHNvbWV3aGF0IGxlc3MgY29kZS4KCjExLzA0LzIwMDE6YmVhemxleQogICAgICAgICAgIFRoZSAiY29uc3QiIHR5cGVtYXAgaGFzIGJlZW4gcmVuYW1lZCB0byAiY29uc3RhbnQiIGluIG1hbnkgbGFuZ3VhZ2UKICAgICAgICAgICBtb2R1bGVzLiAgImNvbnN0IiBpcyBhIEMga2V5d29yZCB3aGljaCBtYWRlIHRoZSBoYW5kbGluZyBvZiB0aGUgdHlwZW1hcAogICAgICAgICAgIGRpcmVjdGl2ZSBzb21ld2hhdCBhd2t3YXJkIGluIHRoZSBwYXJzZXIuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8wNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICAldHlwZW1hcCBkaXJlY3RpdmUgY2FuIG5vdyBhY2NlcHQgbmVhcmx5IGFyYml0cmFyeSBrZXl3b3JkIHBhcmFtZXRlcnMuCiAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICV0eXBlbWFwKGluLHBhcnNlPSJpIixkb2M9ImludGVnZXIiKSBpbnQgIi4uLiI7CgogICAgICAgICAgIFRoZSBwdXJwb3NlIG9mIHRoZSBrZXl3b3JkIHBhcmFtZXRlcnMgaXMgdG8gc3VwcGx5IGNvZGUgZ2VuZXJhdGlvbgogICAgICAgICAgIGhpbnRzIHRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgbW9kdWxlLiAgIFRoZSBpbnRlcHJldGF0aW9uIG9mIHRoZQogICAgICAgICAgIHBhcmFtZXRlcnMgaXMgbGFuZ3VhZ2Ugc3BlY2lmaWMuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTEvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgU2xpZ2h0IHNlbWFudGljIGNoYW5nZSB0byBpbnRlcm5hbCBjYWxsL3JldHVybiBieSB2YWx1ZSBoYW5kbGluZy4KICAgICAgICAgICBJbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBTV0lHLCBjYWxsLWJ5LXZhbHVlIHdhcyB0cmFuc2xhdGVkCiAgICAgICAgICAgaW50byBwb2ludGVycy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgZG91YmxlIGRvdF9wcm9kdWN0KFZlY3RvciBhLCBWZWN0b3IgYik7CgogICAgICAgICAgIHR1cm5lZCBpbnRvIHRoaXM6CgogICAgICAgICAgICAgICBkb3VibGUgd3JhcF9kb3RfcHJvZHVjdChWZWN0b3IgKmEsIFZlY3RvciAqYikgewogICAgICAgICAgICAgICAgICByZXR1cm4gZG90X3Byb2R1Y3QoKmEsKmIpOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgIFRoaXMgdHJhbnNsYXRpb24gd2FzIG5vcm1hbGx5IHBlcmZvcm1lZCBieSB0aGUgU1dJRyBjb3JlLCBvdXRzaWRlCiAgICAgICAgICAgb2YgdGhlIGNvbnRyb2wgb2YgbGFuZ3VhZ2UgbW9kdWxlcy4gIEhvd2V2ZXIsIGEgc2lkZSBlZmZlY3QKICAgICAgICAgICBvZiB0aGlzIHdhcyBhIGxvdCBvZiBiaXphcnJlIHR5cGVtYXAgYmVoYXZpb3IuICAgRm9yIGV4YW1wbGUsCiAgICAgICAgICAgaWYgeW91IGRpZCBzb21ldGhpbmcgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBpbnQzMiB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgIFlvdSB3b3VsZCBmaW5kIHRoYXQgaW50MzIgd2FzIHRyYW5zZm9ybWVkIGludG8gYSBwb2ludGVyIGV2ZXJ5d2hlcmUhCiAgICAgICAgICAgKG5lZWRsZXNzIHRvIHNheSwgc3VjaCBiZWhhdmlvciBpcyB1bmV4cGVjdGVkIGFuZCBxdWl0ZSBhd2t3YXJkIHRvCiAgICAgICAgICAgZGVhbCB3aXRoKS4gIFRvIG1ha2UgbWF0dGVycyB3b3JzZSwgaWYgYSB0eXBlZGVmIHdhcyBhbHNvIHVzZWQsCiAgICAgICAgICAgdGhlIHBvaW50ZXIgYmVoYXZpb3Igc3VkZGVubHkgZGlzYXBwZWFyZWQuCgogICAgICAgICAgIFRvIGZpeCB0aGlzLCB0aGUgcG9pbnRlciB0cmFuc2Zvcm1hdGlvbiBpcyBub3cgcHVzaGVkIHRvIHRoZQogICAgICAgICAgIGxhbmd1YWdlIG1vZHVsZXMuICAgVGhpcyBwcm9kdWNlcyB3cmFwcGVycyB0aGF0IGxvb2sgcm91Z2hseQogICAgICAgICAgIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgIGRvdWJsZSB3cmFwX2RvdF9wcm9kdWN0KFZlY3RvciAqYSwgVmVjdG9yICpiKSB7CiAgICAgICAgICAgICAgICAgIFZlY3RvciBhcmcxID0gKmE7CiAgICAgICAgICAgICAgICAgIFZlY3RvciBhcmcyID0gKmI7CiAgICAgICAgICAgICAgICAgIHJldHVybiBkb3RfcHJvZHVjdChhcmcxLGFyZzIpOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgIFRoaXMgY2hhbmdlIGFsc28gbWFrZXMgaXQgZWFzeSB0byBkZWZpbmUgdHlwZW1hcHMgZm9yCiAgICAgICAgICAgYXJiaXRyYXJ5IHVuZGVmaW5lZCB0eXBlcy4gIEZvciBleGFtcGxlLCB5b3UgY2FuIGRvIHRoaXMgKGFuZCBpdAogICAgICAgICAgIHdpbGwgd29yayByZWdhcmRsZXNzIHdoYXQgaW50MzIgaXMpOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludDMyIHsKICAgICAgICAgICAgICAgICAgJDEgPSAoaW50MzIpIFB5SW50X0FzTG9uZygkaW5wdXQpOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU1DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgIFRoaXMgY2hhbmdlIG1heSBicmVhayBjYWxsL3JldHVybiBieSB2YWx1ZSBjb2RlIGdlbmVyYXRpb24gaW4KICAgICAgICAgICBzb21lIGxhbmd1YWdlIG1vZHVsZXMuCgoxMS8wMy8yMDAxOmJlYXpsZXkKICAgICAgICAgICBDaGFuZ2VkIHRoZSBuYW1lIG9mIHRoZSBkZWZhdWx0IHR5cGVtYXBzIHRvIHRoZSBmb2xsb3dpbmc6CgogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdUWVBFICB7IAogICAgICAgICAgICAgICAgICAgLi4uIGFuIG9iamVjdCAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdUWVBFICogewogICAgICAgICAgICAgICAgICAgLi4uIGEgcG9pbnRlciAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdUWVBFICYgewogICAgICAgICAgICAgICAgICAgLi4uIGEgcmVmZXJlbmNlIC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR1RZUEUgW10gewogICAgICAgICAgICAgICAgICAgLi4uIGFuIGFycmF5IC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgZW51bSBTV0lHVFlQRSB7CiAgICAgICAgICAgICAgICAgIC4uLiBhbiBlbnVtIHZhbHVlIC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR1RZUEUgKENMQVNTOjoqKSB7CiAgICAgICAgICAgICAgICAgICAuLi4gcG9pbnRlciB0byBtZW1iZXIgLi4uCiAgICAgICAgICAgICAgIH0KCgogICAgICAgICAgIFRoZXNlIHR5cGVzIGFyZSB1c2VkIGFzIHRoZSBkZWZhdWx0IGZvciBhbGwgdHlwZXMgdGhhdCBkb24ndCBtYXRjaAogICAgICAgICAgIGFueXRoaW5nIGVsc2UuICBTZWUgQ0hBTkdFUyBsb2cgZW50cnkgZm9yIDgvMjcvMjAwMCBmb3IgdGhlCiAgICAgICAgICAgb2xkIGJlaGF2aW9yLiAgVGhlIHJvbGUgb2YgdGhlc2UgdHlwZXMgaXMgYWxzbyBkZXNjcmliZWQgaW4gCiAgICAgICAgICAgRG9jL01hbnVhbC9UeXBlbWFwcy5odG1sCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgCjEwLzI1LzIwMDE6YmVhemxleQogICAgICAgICAgIE1vZGlmaWVkIEd1aWxlIGFuZCBNenNjaGVtZSBtb2R1bGVzIHRvIHN1cHBvcnQKICAgICAgICAgICBtdWx0aS1hcmd1bWVudCB0eXBlbWFwcy4KCjEwLzI1LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBGaXggdG8gaGFuZGxlIHBvaW50ZXJzIHRvIGFycmF5cy4KCjEwLzI0LzIwMDE6YmVhemxleQogICAgICAgICAgIERlZmluaW5nIGEgdHlwZW1hcCBydWxlIGZvciBlbnVtIFNXSUdFTlVNIGNhbiBub3cgYmUgdXNlZAogICAgICAgICAgIHRvIGRlZmluZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBlbnVtIHZhcmlhYmxlcy4KCjEwLzIyLzIwMDE6YmVhemxleQogICAgICAgICAgIFJ1YnkgbW9kdWxlIG1vZGlmaWVkIHRvIHN1cHBvcnQgbXVsdGktYXJndW1lbnQgdHlwZW1hcHMuCgoxMC8yMi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBUaGUgUnVieSBtb2R1bGUgY2FuIG5vdyBoYW5kbGUgZnVuY3Rpb25zIHdpdGggYW4gYXJiaXRyYXJ5CiAgICAgICAgICAgbnVtYmVyIG9mIGFyZ3VtZW50cy4gIFByZXZpb3VzIHZlcnNpb25zIHdlcmUgbGltaXRlZCB0byAKICAgICAgICAgICB0byBmdW5jdGlvbnMgd2l0aCBvbmx5IDkgb3IgMTYgYXJndW1lbnRzIGRlcGVuZGluZyBvbgogICAgICAgICAgIHRoZSB1c2Ugb2YgZGVmYXVsdCBhcmd1bWVudHMuICAgTm90ZTogZnJvbSBzb21lIGluc3BlY3Rpb24KICAgICAgICAgICBvZiB0aGUgUnVieSBpbnRlcnByZXRlciBzb3VyY2UsIHRoZSBuZXcgYXBwcm9hY2ggbWlnaHQgYmUKICAgICAgICAgICBhIGxpdHRsZSBmYXN0ZXIgYXMgd2VsbC4KCjEwLzE4LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIGEgYnVnIHdpdGggZm9yd2FyZCBjbGFzcyBkZWNsYXJhdGlvbnMgYW5kCiAgICAgICAgICAgdGVtcGxhdGVzLgoKICAgICAgICAgICAgICAgICBjbGFzcyBGb28gPFMsVD47CgogICAgICAgICAgIEJ1ZyByZXBvcnRlZCBieSBJcmluYSBLb3Rsb3ZhLgoKMTAvMTYvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgU3VwcG9ydCBmb3IgbXVsdGl2YWx1ZWQgdHlwZW1hcHMgYWRkZWQuICBUaGUgdHlwZW1hcHMKICAgICAgICAgICBhcmUgc3BlY2lmaWVkIHVzaW5nIHRoZSBzeW50YXggYmVsb3cuICAgV2l0aGluIGVhY2gKICAgICAgICAgICB0eXBlbWFwLCB2YXJpYWJsZSBzdWJzdGl0dXRpb24gaXMgaGFuZGxlZCBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAldHlwZW1hcChpbikgKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKICAgICAgICAgICAgICAgICAgJGFyZzsgIC8vIFRoZSBpbnB1dCBvYmplY3QgaW4gdGhlIHRhcmdldCBsYW5ndWFnZQogICAgICAgICAgICAgICAgICAkMTsgICAgLy8gQyBsb2NhbCB2YXJpYWJsZSBmb3IgZmlyc3QgYXJndW1lbnQKICAgICAgICAgICAgICAgICAgJDI7ICAgIC8vIEMgbG9jYWwgdmFyaWFibGUgZm9yIHNlY29uZCBhcmd1bWVudAoKICAgICAgICAgICAgICAgICAgLy8gVGhlc2UgdmFyaWFibGVzIHJlZmVyIHRvIGVpdGhlciBhcmd1bWVudAogICAgICAgICAgICAgICAgICAkMV90eXBlLCAkMV9sdHlwZSwgJDFfYmFzZXR5cGUsIGV0Yy4uLiAgKGFyZ2MpCiAgICAgICAgICAgICAgICAgICQyX3R5cGUsICQyX2x0eXBlLCAkMl9iYXNldHlwZSwgZXRjLi4uICAoYXJndltdKQoKICAgICAgICAgICAgICAgICAgLy8gQXJyYXkgZGltZW5zaW9uIG9mIGFyZ3YKICAgICAgICAgICAgICAgICAgJDJfZGltMAogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgQmFzaWNhbGx5IGFueSB2YXJpYWJsZSB0aGF0IHdhcyBhdmFpbGFibGUgaW4gbm9ybWFsIHR5cGVtYXBzCiAgICAgICAgICAgaXMgYXZhaWxhYmxlIGZvciBlaXRoZXIgYXJndW1lbnQgYnkgcHJlZmFjaW5nIHRoZSB2YXJpYWJsZQogICAgICAgICAgIG5hbWUgYnkgJyRuXycgd2hlcmUgbiBpcyB0aGUgYXJndW1lbnQgcG9zaXRpb24uCgogICAgICAgICAgIE5vdGVzOiAgCiAgICAgICAgICAgKDEpIE11bHRpLXZhbHVlZCB0eXBlbWFwcyBjYW4gb25seSBiZSBhcHBsaWVkIHRvIGEgc2luZ2xlCiAgICAgICAgICAgICAgIG9iamVjdCBpbiB0aGUgdGFyZ2V0IHNjcmlwdGluZyBsYW5ndWFnZS4gICBGb3IgZXhhbXBsZSwKICAgICAgICAgICAgICAgeW91IGNhbiBzcGxpdCBhIHN0cmluZyBpbnRvIGEgKGNoYXIgKiwgaW50KSBwYWlyIG9yCiAgICAgICAgICAgICAgIHNwbGl0IGEgbGlzdCBpbnRvIGEgKGludCwgY2hhciBbXSkgcGFpci4gIEl0IGlzIG5vdAogICAgICAgICAgICAgICBwb3NzaWJsZSB0byBtYXAgbXVsdGlwbGUgb2JqZWN0cyB0byBtdWx0aXBsZSBhcmd1bWVudHMuCgogICAgICAgICAgICgyKSBUbyBtYWludGFpbiBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgU1dJRyB2ZXJzaW9ucywgdGhlCiAgICAgICAgICAgICAgIHZhcmlhYmxlcyBzdWNoIGFzICR0YXJnZXQgYW5kICR0eXBlIGFyZSBwcmVzZXJ2ZWQgYW5kCiAgICAgICAgICAgICAgIGFyZSBtYXBwZWQgb250byB0aGUgZmlyc3QgYXJndW1lbnQgb25seS4KCiAgICAgICAgICAgKDMpIFRoaXMgc2hvdWxkIG5vdCBhZmZlY3QgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIGNvZGUuCiAgICAgICAgICAgICAgIE11bHRpLXZhbHVlZCB0eXBlbWFwcyBhcmUgYW4gZXh0ZW5zaW9uIHRvIHR5cGVtYXAgaGFuZGxpbmcuCiAgICAgICAgICAgICAgIFNpbmdsZSB2YWx1ZWQgdHlwZW1hcHMgY2FuIGJlIHNwZWNpZmllZCBpbiB0aGUgdXN1YWwKICAgICAgICAgICAgICAgd2F5LgoKICAgICAgICAgICBUaGUgb2xkICRzb3VyY2UgYW5kICR0YXJnZXQgdmFyaWFibGVzIGFyZSBvZmZpY2lhbGx5CiAgICAgICAgICAgZGVwcmVjYXRlZC4gIElucHV0IHZhcmlhYmxlcyBhcmUgcmVmZXJlbmNlZCB0aHJvdWdoCiAgICAgICAgICAgJGFyZyQgYW5kIG91dHB1dCB2YWx1ZXMgYXJlIHJlZmVyZW5jZSB0aHJvdWdoICRyZXN1bHQkLgoKICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMC8xNi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBBZGRlZCBwYXJzaW5nIHN1cHBvcnQgZm9yIG11bHRpdmFsdWVkIHR5cGVtYXBzLiAgVGhlIHN5bnRheAogICAgICAgICAgIGlzIGEgbGl0dGxlIGZ1bmt5LCBidXQgaGVyZSBnb2VzOgoKICAgICAgICAgICAgICAvLyBEZWZpbmUgYSBtdWx0aXZhbHVlZCB0eXBlbWFwCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIChpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CiAgICAgICAgICAgICAgICAgICAgLi4uIHR5cGVtYXAgY29kZSAuLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIC8vIE11bHRpdmFsdWVkIHR5cGVtYXAgd2l0aCBsb2NhbHMKICAgICAgICAgICAgICAldHlwZW1hcChpbikgKGludCBhcmdjLCBjaGFyICphcmd2W10pKGludCB0ZW1wKSB7CiAgICAgICAgICAgICAgICAgICAgLi4uIHR5cGVtYXAgY29kZSAuLi4KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgLy8gQ29weSBhIG11bHRpdmFsdWVkIHR5cGVtYXAKICAgICAgICAgICAgICAldHlwZW1hcChpbikgKGludCBhcmdjb3VudCwgY2hhciAqKmFyZ3YpID0gKGludCBhcmdjLCBjaGFyICphcmd2W10pOwoKICAgICAgICAgICAgICAvLyBBcHBseSBhIG11bHRpdmFsdWVkIHR5cGVtYXAKICAgICAgICAgICAgICAlYXBwbHkgKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsgKGludCBhcmdjb3VudCwgY2hhciAqKmFyZ3YpIH07CgogICAgICAgICAgIE5vdGU6IHRoaXMgZXh0cmEgcGFyc2luZyBzdXBwb3J0IGlzIGFkZGVkIGZvciBmdXR1cmUgZXh0ZW5zaW9uLgogICAgICAgICAgIE5vIGxhbmd1YWdlIG1vZHVsZXMgY3VycmVudGx5IHN1cHBvcnQgbXVsdGktdmFsdWVkIHR5cGVtYXBzLgoKMTAvMTEvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgTW9kaWZpZWQgdGhlIHR5cGVtYXAgbWF0Y2hpbmcgY29kZSB0byBkaXNjYXJkIHF1YWxpZmllcnMgd2hlbgogICAgICAgICAgIGNoZWNraW5nIGZvciBhIG1hdGNoLiAgIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhIGRlY2xhcmF0aW9uCiAgICAgICAgICAgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoY29uc3QgY2hhciAqeCk7CgogICAgICAgICAgIFRoZSB0eXBlbWFwIGNoZWNrZXIgY2hlY2tzIGZvciBhIG1hdGNoIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6CgogICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKngKICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoKICAgICAgICAgICAgICAgICBjaGFyICp4CiAgICAgICAgICAgICAgICAgY2hhciAqCgogICAgICAgICAgIElmIHR5cGVkZWYncyBhcmUgaW52b2x2ZWQsIHF1YWxpZmllciBzdHJpcHBpbmcgb2NjdXJzIGJlZm9yZQogICAgICAgICAgIHR5cGVkZWYgcmVzb2x1dGlvbi4gIFNvIGlmIHlvdSBoYWQgdGhpcywKCiAgICAgICAgICAgICAgICB0eXBlZGVmIGNoYXIgKnN0cmluZzsKICAgICAgICAgICAgICAgIHZvaWQgYmxhaChjb25zdCBzdHJpbmcgeCk7CgogICAgICAgICAgIHR5cGVtYXAgY2hlY2tpbmcgd291bGQgYmUgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcgeAogICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nCiAgICAgICAgICAgICAgICBzdHJpbmcgeAogICAgICAgICAgICAgICAgc3RyaW5nCiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp4CiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoKICAgICAgICAgICAgICAgIGNoYXIgKngKICAgICAgICAgICAgICAgIGNoYXIgKgoKICAgICAgICAgICBUaGUgcHJpbWFyeSByZWFzb24gZm9yIHRoaXMgY2hhbmdlIGlzIHRvIHNpbXBsaWZ5IHRoZSBpbXBsZW1lbnRhdGlvbgogICAgICAgICAgIG9mIGxhbmd1YWdlIG1vZHVsZXMuICBXaXRob3V0IHF1YWxpZmllciBzdHJpcHBpbmcsIG9uZSBoYXMgdG8gd3JpdGUKICAgICAgICAgICBzZXBlcmF0ZSB0eXBlbWFwcyBmb3IgYWxsIHZhcmlhdGlvbnMgb2YgY29uc3QgYW5kIHZvbGF0aWxlICh3aGljaAogICAgICAgICAgIGlzIGEgcGFpbikuCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKiAgVHlwZW1hcHMgbWlnaHQgYmUgYXBwbGllZCBpbgogICAgICAgICAgIHBsYWNlcyB3aGVyZSB0aGV5IHdlcmVuJ3QgYmVmb3JlLgoKCjEwLzkvMjAwMTogYmVhemxleQogICAgICAgICAgIFNXSUcgbm93IGdlbmVyYXRlcyB3cmFwcGVycyB0aGF0IHByb3Blcmx5IGRpc2FtYmlndWF0ZQogICAgICAgICAgIG92ZXJsb2FkZWQgbWV0aG9kcyB0aGF0IG9ubHkgdmFyeSBpbiBjb25zdG5lc3MuICBGb3IKICAgICAgICAgICBleGFtcGxlOgoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaCgpOwogICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoKSBjb25zdDsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgIFRvIGhhbmRsZSB0aGlzLCB0aGUgJXJlbmFtZSBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgbm9ybWFsbHkuCiAgICAgICAgICAgCiAgICAgICAgICAgICAgICVyZW5hbWUoYmxhaF9jb25zdCkgYmxhaCgpIGNvbnN0OwoKICAgICAgICAgICBJbiB0aGUgcmVzdWx0aW5nIHdyYXBwZXIgY29kZSwgbWV0aG9kIGNhbGxzIGxpa2UgdGhpcwogICAgICAgICAgIGFyZSBub3cgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgICAgKG9iaiktPmJsYWgoKSAgICAgICAgICAgICAgIC8vIE5vbi1jb25zdCB2ZXJzaW9uCiAgICAgICAgICAgICAgICgoRm9vIGNvbnN0ICopb2JqKS0+YmxhaCgpICAvLyBjb25zdCB2ZXJzaW9uCgogICAgICAgICAgIFRoaXMgc2hvdWxkIGZvcmNlIHRoZSByaWdodCBtZXRob2QgdG8gYmUgaW52b2tlZC4KICAgICAgICAgICBBZG1pdHRlZGx5LCB0aGlzIGlzIHByb2JhYmx5IG9ic2N1cmUsIGJ1dCB3ZSBtaWdodAogICAgICAgICAgIGFzIHdlbGwgZ2V0IGl0IHJpZ2h0LgoKMTAvOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgVGhlIHByZXByb2Nlc3NvciBub3cgaWdub3JlcyAnXHInIGluIHRoZSBpbnB1dC4KICAgICAgICAgICBUaGlzIHNob3VsZCBmaXggdGhlIGZvbGxvd2luZyBidWc6CiAgICAgICAgICAgWyAjNDY4NDE2IF0gU1dJRyB0aGlua3MgbWFjcm8gZGVmcyBhcmUgZGVjbGFyYXRpb25zPwoKMTAvOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgfHwsICYmLCBhbmQgISBpbiBjb25zdGFudHMuICBUaGlzCiAgICAgICAgICAgZml4ZXMgU0YgWyAjNDY4OTg4IF0gTG9naWNhbCBvcHMgYnJlYWsgcHJlcHJvY2Vzc29yLgogICAgICAgICAgIEhvd2V2ZXIsIGF0IHRoaXMgdGltZSwgY29uc3RhbnRzIHVzaW5nIHRoZXNlIG9wZXJhdG9ycwogICAgICAgICAgIGFyZSBub3Qgc3VwcG9ydGVkICh0aGUgcGFyc2VyIHdpbGwgaXNzdWUgYSB3YXJuaW5nKS4KCjEwLzQvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIC1zaG93X3RlbXBsYXRlcyBjb21tYW5kIGxpbmUgb3B0aW9uLiAgVGhpcyBtYWtlcwogICAgICAgICAgIFNXSUcgZGlzcGxheSB0aGUgY29kZSBpdCBhY3R1YWxseSBwYXJzZXMgdG8gZ2VuZXJhdGUKICAgICAgICAgICB0ZW1wbGF0ZSB3cmFwcGVycy4gIE1vc3RseSB1c2VmdWwgZm9yIGRlYnVnZ2luZy4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMC80LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBDaGFuZ2UgdG8gc2VtYW50aWNzIG9mICV0ZW1wbGF0ZSBkaXJlY3RpdmUuICBXaGVuCiAgICAgICAgICAgdXNpbmcgJXRlbXBsYXRlLCB0aGUgdGVtcGxhdGUgYXJndW1lbnRzIGFyZSBoYW5kbGVkCiAgICAgICAgICAgYXMgdHlwZXMgYnkgZGVmYXVsdC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWNpbnQpIHZlY3RvcjxpbnQ+OwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY2RvdWJsZSkgdmVjdG9yPGRvdWJsZT47CgogICAgICAgICAgIFRvIHNwZWNpZnkgYSB0ZW1wbGF0ZSBhcmd1bWVudCB0aGF0IGlzICpub3QqIGEgdHlwZSwgeW91CiAgICAgICAgICAgbmVlZCB0byB1c2UgZGVmYXVsdC12YWx1ZSBzeW50YXguIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWNpbnQpIHZlY3RvcjxpbnQsaW50PTUwPjsKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWNkb3VibGUpIHZlY3RvcjxpbnQsc2l6ZT0xMDA+OwoKICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSB0eXBlIG5hbWUgZG9lc24ndCByZWFsbHkgbWF0dGVyLS1vbmx5CiAgICAgICAgICAgdGhlIGRlZmF1bHQgdmFsdWUgKGUuZy4sIDUwLCAxMDApIGlzIHVzZWQgZHVyaW5nCiAgICAgICAgICAgZXhwYW5zaW9uLiAgVGhpcyBkaWZmZXJzIGZyb20gbm9ybWFsIEMrKywgYnV0IEkgY291bGRuJ3QKICAgICAgICAgICBmaWd1cmUgb3V0IGEgYmV0dGVyIHdheSB0byBkbyBpdCBpbiB0aGUgcGFyc2VyLiAgTWlnaHQKICAgICAgICAgICBpbXBsZW1lbnQgYW4gYWx0ZXJuYXRpdmUgbGF0ZXIuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAKMTAvNC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTWFqb3IgY2hhbmdlcyB0byB0ZW1wbGF0ZSBoYW5kbGluZyBpbiBvcmRlciB0byBwcm92aWRlCiAgICAgICAgICAgYmV0dGVyIGludGVncmF0aW9uIHdpdGggdGhlIEMrKyB0eXBlLXN5c3RlbS4gVGhlIG1haW4KICAgICAgICAgICBwcm9ibGVtIGlzIGFzIGZvbGxvd3M6CgogICAgICAgICAgIFN1cHBvc2UgeW91IGhhdmUgYSB0ZW1wbGF0ZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IHZvaWQgYmxhaChjb25zdCBUIHgpIHsgc3R1ZmYgfTsKICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgIE5vdyBzdXBwb3NlLCB0aGF0IHlvdSBpbnN0YW50aWF0ZSB0aGUgdGVtcGxhdGUgb24gYQogICAgICAgICAgIHR5cGUgbGlrZSB0aGlzIGluIFNXSUc6CgogICAgICAgICAgICAgICV0ZW1wbGF0ZShibGFoaW50KSBibGFoPGludCAqPjsKCiAgICAgICAgICAgSW4gQysrLCB0aGlzIGlzICpzdXBwb3NlZCogdG8gZ2VuZXJhdGUgY29kZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgIHZvaWQgYmxhaChpbnQgKmNvbnN0IHgpIHsgc3R1ZmYgfTsKCiAgICAgICAgICAgSG93ZXZlciwgaW4gU1dJRy0xLjMuOSwgdGhlIHRlbXBsYXRlIHN1YnN0aXR1dGlvbiBnZXRzIGl0IHdyb25nCiAgICAgICAgICAgYW5kIHByb2R1Y2VzCgogICAgICAgICAgICAgIHZvaWQgYmxhaChjb25zdCBpbnQgKngpIHsgc3R1ZmYgfTsKCiAgICAgICAgICAgKG5vdGljZSB0aGUgYmFkIHBsYWNlbWVudCBvZiB0aGUgJ2NvbnN0JyBxdWFsaWZpZXIpLgoKICAgICAgICAgICBUbyBmaXggdGhpcywgdGhlIFNXSUcgcGFyc2VyIG5vdyBnZW5lcmF0ZXMgaW1wbGljaXQgdHlwZWRlZnMKICAgICAgICAgICBmb3IgdGVtcGxhdGUgdHlwZSBhcmd1bWVudHMgdGhhdCBwcm9kdWNlcyBjb2RlIHJvdWdobHkKICAgICAgICAgICBlcXVpdmFsZW50IHRvIGRvaW5nIHRoaXM6CgogICAgICAgICAgICAgIHR5cGVkZWYgaW50ICpfX3N3aWd0bXBsMTsKICAgICAgICAgICAgICAldGVtcGxhdGUoYmxhaGludCkgYmxhaDxfX3N3aWd0bXBsMT47CgogICAgICAgICAgIHdoaWNoIGdlbmVyYXRlcyBjb2RlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgdm9pZCBibGFoKGNvbnN0IF9fc3dpZ3RtcGwxIHgpIHsgc3R1ZmYgfTsKCiAgICAgICAgICAgU2luY2UgdGhpcyBpcyBjb3JyZWN0IGluIGJvdGggQysrIGFuZCBTV0lHLCBpdCBwcm92aWRlcyB0aGUgcmlnaHQKICAgICAgICAgICBzZW1hbnRpY3MgYW5kIGFsbG93cyBldmVyeXRoaW5nIHRvIGNvbXBpbGUgcHJvcGVybHkuICBIb3dldmVyLAogICAgICAgICAgIHRvIGNsZWFuIHVwIHRoZSBnZW5lcmF0ZWQgY29kZSBhIGxpdHRsZSBiaXQsIHRoZSBwYXJzZXIga2VlcHMKICAgICAgICAgICB0cmFjayBvZiB0aGUgdGVtcGxhdGUgdHlwZXMgYW5kIHBlcmZvcm1zIGJhY2stc3Vic3RpdHV0aW9uIHRvCiAgICAgICAgICAgdGhlIG9yaWdpbmFsIHR5cGUgd2hlbiBidWlsZGluZyB0aGUgcGFyc2UgdHJlZS4gIFRodXMsIGV2ZW4KICAgICAgICAgICB0aG91Z2ggdGhlIGltcGxpY2l0IHR5cGVkZWYgaXMgdXNlZCBpbiB0aGUgaW5wdXQgYW5kIG1heSBhcHBlYXIKICAgICAgICAgICBpbiB0aGUgZ2VuZXJhdGVkIHdyYXBwZXIgZmlsZSAoZm9yIHByb3BlciBjb21waWxhdGlvbiksIHRoZSBwYXJzZQogICAgICAgICAgIHRyZWUgd2lsbCBoaWRlIGEgbG90IG9mIHRoZXNlIGRldGFpbHMuICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHZvaWQgYmxhaChjb25zdCBfX3N3aWd0bXBsMSB4KSB7IHN0dWZmIH07CgogICAgICAgICAgIHdpbGwgbG9vayBsaWtlIGl0IHdhcyBkZWNsYXJlZCBhcyBmb2xsb3dzICh3aGljaCBpcyB3aGF0CiAgICAgICAgICAgeW91IHdhbnQpOgoKICAgICAgICAgICAgICB2b2lkIGJsYWgoaW50ICpjb25zdCB4KSB7IHN0dWZmIH0KCiAgICAgICAgICAgVGhlIG9ubHkgcGxhY2UgeW91IGFyZSBsaWtlbHkgdG8gbm90aWNlIHRoZSB0eXBlZGVmIGhhY2sKICAgICAgICAgICBpcyBpbiBib2RpZXMgb2YgdGVtcGxhdGUgZnVuY3Rpb25zLiAgRm9yIGV4YW1wbGUsIGlmIHlvdQogICAgICAgICAgIGRpZCB0aGlzLAoKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBibGFoIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgJWFkZG1ldGhvZHMgewogICAgICAgICAgICAgICAgICAgICAgIHZvaWQgc3BhbSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBUICB0ZW1wdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgeW91IHdpbGwgZmluZCB0aGF0ICdUIHRlbXB2YWx1ZScgZ290IGV4cGFuZGVkIGludG8gc29tZQogICAgICAgICAgIHN0cmFuZ2UgdHlwZWRlZiB0eXBlLiAgVGhpcyAqc3RpbGwqIGNvbXBpbGVzIGNvcnJlY3RseSAKICAgICAgICAgICBzbyBpdCdzIG5vdCBhIGJpZyBkZWFsIChvdGhlciB0aGFuIGxvb2tpbmcga2luZCBvZiB1Z2x5CiAgICAgICAgICAgaW4gdGhlIHdyYXBwZXIgZmlsZSkuCgoxMC80LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBzb21lIGluaGVyaXRhbmNlIHByb2JsZW1zIGluIFRjbCBPYmplY3QgaW50ZXJmYWNlLgoKMTAvMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgVGNsIG1vZHVsZSBoYXMgY2hhbmdlZCB0byB1c2UgYnl0ZS1iYWNrZWQgcG9pbnRlciBzdHJpbmdzLiAgVGhpcwogICAgICAgICAgIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSBzYWZlIG9uIDY0LWJpdCBwbGF0Zm9ybXMuICBIb3dldmVyLAogICAgICAgICAgIHRoZSBvcmRlciBpbiB3aGljaCBkaWdpdHMgYXBwZWFyIGluIHBvaW50ZXIgdmFsdWVzIG5vIGxvbmdlcgogICAgICAgICAgIGRpcmVjdGx5IGNvcnJlc3BvbmRzIHRvIHRoZSBhY3R1YWwgbnVtZXJpY2FsIHZhbHVlIG9mIGEKICAgICAgICAgICBwb2ludGVyIChvbiBsaXR0bGUtZW5kaWFuIG1hY2hpbmVzLCBwYWlycyBvZiBkaWdpdHMgYXBwZWFyCiAgICAgICAgICAgaW4gcmV2ZXJzZSBvcmRlcikuCgoxMC8xLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBQZXJsNSBtb2R1bGUgaXMgbm93IGRyaXZlbiBieSBhIGNvbmZpZ3VyYXRpb24gZmlsZSAncGVybDUuc3dnJwogICAgICAgICAgIGluIHRoZSBTV0lHIGxpYnJhcnkuCgoxMC8xLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBUaGUgcGVybDUgbW9kdWxlIG5vIGxvbmdlciB0cmllcyB0byBhcHBseSB0aGUgIm91dCIgdHlwZW1hcAogICAgICAgICAgIGluIGNvZGUgZ2VuZXJhdGVkIGZvciBtYWdpYyB2YXJpYWJsZXMuICBJJ20gc3VycHJpc2VkIHRoYXQKICAgICAgICAgICB0aGlzIGV2ZXIgd29ya2VkIGF0IGFsbCAoc2luY2UgYWxsIG9mIHRoZSBjb2RlIHRoYXQgd2FzIHRoZXJlCiAgICAgICAgICAgd2FzIHdyb25nIGFueXdheXMpLiAgIFVzZSB0aGUgInZhcm91dCIgdHlwZW1hcCB0byBoYW5kbGUKICAgICAgICAgICBnbG9iYWwgdmFyaWFibGVzLgoKMTAvMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgYSBidWcgcmVsYXRlZCB0byBjaGFyYWN0ZXIgYXJyYXkgbWVtYmVycyBvZiBzdHJ1Y3R1cmVzLgogICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICAgY2hhciBuYW1lWzMyXTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgIFNXSUcgaXMgbm9ybWFsbHkgc3VwcG9zZWQgdG8gcmV0dXJuIGEgc3RyaW5nLCBidXQgdGhpcyB3YXMKICAgICAgICAgICBicm9rZW4gaW4gMS4zLjkuICAgVGhlIHJlYXNvbiBpdCB3YXMgYnJva2VuIHdhcyBhY3R1YWxseQogICAgICAgICAgIGR1ZSB0byBhIHN1YnRsZSBuZXcgZmVhdHVyZSBvZiB0eXBlbWFwcy4gIFdoZW4gYSBkYXRhIG1lbWJlcgogICAgICAgICAgIGlzIHNldCB0byBhbiBhcnJheSBsaWtlIHRoaXMsIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgcmVsYXRlZAogICAgICAgICAgIGFjY2Vzc29yIGZ1bmN0aW9uIGlzIGFjdHVhbGx5IHNldCB0byBhbiBhcnJheS4gIFRoaXMgbWVhbnMKICAgICAgICAgICB0aGF0IHlvdSBjYW4gbm93IHdyaXRlIHR5cGVtYXBzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgJXR5cGVtYXAocHl0aG9uLG91dCkgY2hhciBbQU5ZXSB7CiAgICAgICAgICAgICAgICAgJHRhcmdldCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKCRzb3VyY2UsJGRpbTApOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgVGhpcyBmdW5jdGlvbmFsaXR5IGNhbiBiZSB1c2VkIHRvIHJlcGxhY2UgdGhlIGRlZnVuY3QKICAgICAgICAgICBtZW1iZXJvdXQgdHlwZW1hcCBpbiBhIG1vcmUgZWxlZ2FudCBtYW5uZXIuCgo5LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTb21lIGZ1cnRoZXIgcmVmaW5lbWVudCBvZiBxdWFsaWZpZWQgQysrIG1lbWJlciBmdW5jdGlvbnMuCiAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgdm9pZCBmb28oKSBjb25zdDsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgIChpKSBUaGUgU1dJRyBwYXJzZXIgd2FzIGV4dGVuZGVkIHNsaWdodGx5IHRvIGFsbG93ICd2b2xhdGlsZScKICAgICAgICAgICBhbmQgY29tYmluYXRpb25zIG9mICdjb25zdCcgYW5kICd2b2xhdGlsZScgdG8gYmUgdXNlZC4gIFRoaXMKICAgICAgICAgICBpcyBwcm9iYWJseSByYXJlLCBidXQgdGVjaG5pY2FsbHkgbGVnYWwuICBPbmx5IGFkZGVkIGZvcgogICAgICAgICAgIGNvbXBsZXRlbmVzcy4KCiAgICAgICAgICAgKGlpKSBGb3IgdGhlIHB1cnBvc2VzIG9mIG92ZXJsb2FkaW5nLCBxdWFsaWZpZWQgYW5kIG5vbi1xdWFsaWZpZWQKICAgICAgICAgICBmdW5jdGlvbnMgYXJlIGRpZmZlcmVudC4gIFRodXMsIHdoZW4gYSBjbGFzcyBoYXMgbWV0aG9kcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgIHZvaWQgZm9vKCk7CiAgICAgICAgICAgICAgICAgdm9pZCBmb28oKSBjb25zdDsKCiAgICAgICAgICAgVHdvIGRpc3RpbmN0IG1ldGhvZHMgYXJlIGRlY2xhcmVkLiAgVG8gZGVhbCB3aXRoIHRoaXMsICVyZW5hbWUKICAgICAgICAgICBhbmQgc2ltaWxhciBkaXJlY3RpdmVzIGhhdmUgYmVlbiBleHRlbmRlZCB0byByZWNvZ25pemUgY29uc3QuCiAgICAgICAgICAgVGh1cywgb25lIGNhbiBkaXNhbWJpZ3VhdGUgdGhlIHR3byBmdW5jdGlvbnMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICVyZW5hbWUoZm9vY29uc3QpIEZvbzo6Zm9vKCkgY29uc3Q7CgogICAgICAgICAgIG9yIHNpbXBseSBpZ25vcmUgdGhlIGNvbnN0IHZhcmlhbnQgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICVpZ25vcmUgRm9vOjpmb28oKSBjb25zdDsKCiAgICAgICAgICAgTm90ZTogU1dJRyBjdXJyZW50bHkgaGFzIG5vIHdheSB0byBhY3R1YWxseSBpbnZva2UgdGhlIGNvbnN0CiAgICAgICAgICAgbWVtYmVyIHNpbmNlIHRoZSAnY29uc3QnIGlzIGRpc2NhcmRlZCB3aGVuIGdlbmVyYXRpbmcgd3JhcHBlcnMKICAgICAgICAgICBmb3Igb2JqZWN0cy4gIAoKOS8yNy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTmV3IGRpcmVjdGl2ZS4gJW5hbWV3YXJuIGNhbiBiZSB1c2VkIHRvIGlzc3VlIHdhcm5pbmcKICAgICAgICAgICBtZXNzYWdlcyBmb3IgY2VydGFpbiBkZWNsYXJhdGlvbiBuYW1lcy4gICBUaGUgbmFtZQogICAgICAgICAgIG1hdGNoaW5nIGlzIHRoZSBzYW1lIGFzIGZvciB0aGUgJXJlbmFtZSBkaXJlY3RpdmUuCiAgICAgICAgICAgVGhlIGludGVudCBvZiB0aGlzIGRpcmVjdGl2ZSBpcyB0byBpc3N1ZSB3YXJuaW5ncyBmb3IKICAgICAgICAgICBwb3NzaWJsZSBuYW1lc3BhY2UgY29uZmxpY3RzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVuYW1ld2FybigicHJpbnQgaXMgYSBweXRob24ga2V5d29yZCIpIHByaW50OwoKICAgICAgICAgICBUaGUgbmFtZSBtYXRjaGluZyBhbGdvcml0aG0gaXMgcGVyZm9ybWVkIGFmdGVyIGEgbmFtZQogICAgICAgICAgIGhhcyBiZWVuIHJlc29sdmVkIHVzaW5nICVyZW5hbWUuICBUaGVyZWZvcmUsIGEKICAgICAgICAgICBkZWNsYXJhdGlvbiBsaWtlIHRoaXMgd2lsbCBub3QgZ2VuZXJhdGUgYSB3YXJuaW5nOgoKICAgICAgICAgICAgICAlcmVuYW1lKCJQcmludCIpIHByaW50OwogICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIHZvaWQgcHJpbnQoKTsgICAgLyogTm8gd2FybmluZyBnZW5lcmF0ZWQgKi8KCiAgICAgICAgICAgU2luY2UgdGhlIHdhcm5pbmcgbWVjaGFuaXNtIGZvbGxvd3MgJXJlbmFtZSBzZW1hbnRpY3MsIGl0IGlzCiAgICAgICAgICAgYWxzbyB0byBpc3N1ZSB3YXJuaW5ncyBmb3Igc3BlY2lmaWMgY2xhc3NlcyBvciBqdXN0IGZvcgogICAgICAgICAgIGNlcnRhaW4gbWVtYmVyIGZ1bmN0aW9uIG5hbWVzLgoKICAgICAgICAgICAoRGF2ZSAtIEkndmUgYmVlbiB0aGlua2luZyBhYm91dCBhZGRpbmcgc29tZXRoaW5nIGxpa2UgdGhpcwogICAgICAgICAgIGZvciBxdWl0ZSBzb21lIHRpbWUuICBKdXN0IG5ldmVyIGdvdCBhcm91bmQgdG8gaXQpCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKCjkvMjcvMjAwMTogYmVhemxleQogICAgICAgICAgIEVuaGFuY2VkIHRoZSAlaWdub3JlIGRpcmVjdGl2ZSBzbyB0aGF0IHdhcm5pbmcgbWVzc2FnZXMKICAgICAgICAgICBjYW4gYmUgaXNzdWVkIHRvIHVzZXJzLiAgIFRoaXMgaXMgZG9uZSB1c2luZyAlaWdub3Jld2FybgogICAgICAgICAgIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAlaWdub3Jld2Fybigib3BlcmF0b3IgbmV3IGlnbm9yZWQiKSBvcGVyYXRvciBuZXc7CgogICAgICAgICAgIFRoZSBuYW1lcyBhbmQgc2VtYW50aWNzIG9mICVpZ25vcmV3YXJuIGlzIGV4YWN0bHkgdGhlIAogICAgICAgICAgIHNhbWUgYXMgJWlnbm9yZS4gVGhlIHByaW1hcnkgcHVycG9zZSBvZiB0aGlzIGRpcmVjdGl2ZQogICAgICAgICAgIGlzIGZvciBtb2R1bGUgd3JpdGVycyB3aG8gd2FudCB0byBpZ25vcmUgY2VydGFpbiB0eXBlcwogICAgICAgICAgIG9mIGRlY2xhcmF0aW9ucywgYnV0IHdobyBhbHNvIHdhbnQgdG8gYWxlcnQgdXNlcnMgYWJvdXQgaXQuCiAgICAgICAgICAgQSB1c2VyIG1pZ2h0IGFsc28gdXNlIHRoaXMgZm9yIGRlYnVnZ2luZyAoc2luY2UgbWVzc2FnZXMKICAgICAgICAgICB3aWxsIGFwcGVhciB3aGVuZXZlciBhbiBpZ25vcmVkIGRlY2xhcmF0aW9uIGFwcGVhcnMpLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjkvMjYvMjAwMTogYmVhemxleQogICAgICAgICAgIFN1cGVyLWV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciBvdmVybG9hZGVkIG9wZXJhdG9ycy4gCiAgICAgICAgICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBjb25zaXN0cyBvZiBhIGZldyBkaWZmZXJlbnQgcGFydHMuCgogICAgICAgICAgIChpKSBPcGVyYXRvciBuYW1lcyBzdWNoIGFzICdvcGVyYXRvcisnIGFyZSBub3cgYWxsb3dlZAogICAgICAgICAgIGFzIHZhbGlkIGRlY2xhcmF0b3IgbmFtZXMuICBUaHVzIHRoZSAnb3BlcmF0b3InIHN5bnRheAogICAgICAgICAgIGNhbiBhcHBlYXIgKmFueXBsYWNlKiBhIG5vcm1hbCBkZWNsYXJhdG9yIG5hbWUgd2FzIHVzZWQKICAgICAgICAgICBiZWZvcmUuICBPbiB0aGUgc3VyZmFjZSwgdGhpcyBtZWFucyB0aGF0IG9wZXJhdG9ycyBjYW4KICAgICAgICAgICBiZSBwYXJzZWQganVzdCBsaWtlIG5vcm1hbCBmdW5jdGlvbnMgYW5kIG1ldGhvZHMuIAogICAgICAgICAgIEhvd2V2ZXIsIGl0IGFsc28gbWVhbnMgdGhhdCBvcGVyYXRvciBuYW1lcyBjYW4gYmUgdXNlZAogICAgICAgICAgIGluIG1hbnkgb3RoZXIgU1dJRyBkaXJlY3RpdmVzIGxpa2UgJXJlbmFtZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgJXJlbmFtZShfX2FkZF9fKSBDb21wbGV4OjpvcGVyYXRvcisoY29uc3QgQ29tcGxleCAmKTsKCiAgICAgICAgICAgKGlpKSBPcGVyYXRvcnMgYXJlIHdyYXBwZWQgKmV4YWN0bHkqIGxpa2Ugbm9ybWFsIGZ1bmN0aW9ucwogICAgICAgICAgIGFuZCBtZXRob2RzLiAgSW50ZXJuYWxseSwgdGhlIG9wZXJhdG9yIG5hbWUgaXMgdXNlZCAKICAgICAgICAgICBkaXJlY3RseSBtZWFuaW5nIHRoYXQgdGhlIHdyYXBwZXIgY29kZSBtaWdodCBjb250YWluCiAgICAgICAgICAgc3RhdGVtZW50cyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgYXJnMC0+b3BlcmF0b3IqKChDb21wbGV4IGNvbnN0ICYpKmFyZzEpOwoKICAgICAgICAgICBUaGlzIGFsbCBzZWVtcyB0byBwYXJzZSBhbmQgY29tcGlsZSBjb3JyZWN0bHkgKGF0IGxlYXN0CiAgICAgICAgICAgb24gbXkgbWFjaGluZSkuCgogICAgICAgICAgIChpaWkpIFNXSUcgd2lsbCBubyBsb25nZXIgd3JhcCBhIGRlY2xhcmF0aW9uIGlmIGl0cyBzeW1ib2wKICAgICAgICAgICB0YWJsZSBuYW1lIGNvbnRhaW5zIGlsbGVnYWwgaWRlbnRpZmllciBjaGFyYWN0ZXJzLiAgSWYKICAgICAgICAgICBpbGxlZ2FsIGNoYXJhY3RlcnMgYXJlIGRldGVjdGVkLCB5b3Ugd2lsbCBzZWUgYW4gZXJyb3IKICAgICAgICAgICBsaWtlIHRoaXM6CiAKICAgICAgICAgICAgICAgIFdhcm5pbmcuIENhbid0IHdyYXAgb3BlcmF0b3IqIHVubGVzcyByZW5hbWVkIHRvIGEgdmFsaWQgaWRlbnRpZmllci4KCiAgICAgICAgICAgVGhlIG9ubHkgd2F5IHRvIGZpeCB0aGlzIGlzIHRvIHVzZSAlcmVuYW1lIG9yICVuYW1lIHRvIGJpbmQKICAgICAgICAgICB0aGUgb3BlcmF0b3IgdG8gYSBuaWNlIG5hbWUgbGlrZSAiYWRkIiBvciBzb21ldGhpbmcuIE5vdGU6CiAgICAgICAgICAgdGhlIGxlZ2FsIGlkZW50aWZpZXIgY2hhcmFjdGVycyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgdGFyZ2V0CiAgICAgICAgICAgbGFuZ3VhZ2UuCgogICAgICAgICAgIFRoZXJlIGFyZSBjZXJ0YWluIGlzc3VlcyB3aXRoIGZyaWVuZCBmdW5jdGlvbnMgYW5kIG9wZXJhdG9ycy4KICAgICAgICAgICBTb21ldGltZXMsIGZyaWVuZHMgYXJlIHVzZWQgdG8gZGVmaW5lIG1peGVkIG9wZXJhdG9ycyBzdWNoCiAgICAgICAgICAgYXMgYWRkaW5nIGEgQ29tcGxleCBhbmQgYSBkb3VibGUgdG9nZXRoZXIuICBDdXJyZW50bHksIFNXSUcKICAgICAgICAgICBpZ25vcmVzIGFsbCBmcmllbmQgZGVjbGFyYXRpb25zIGluIGEgY2xhc3MuICBBIGdsb2JhbCBvcGVyYXRvcgogICAgICAgICAgIGRlY2xhcmF0aW9uIGNhbiBwcm9iYWJseSBiZSBtYWRlIHRvIHdvcmssIGJ1dCB5b3UnbGwgaGF2ZSB0bwogICAgICAgICAgIHJlbmFtZSBpdCBhbmQgaXQgcHJvYmFibHkgd29uJ3Qgd29yayB2ZXJ5IGNsZWFubHkgaW4gdGhlCiAgICAgICAgICAgdGFyZ2V0IGxhbmd1YWdlIHNpbmNlIGl0J3Mgbm90IGEgY2xhc3MgbWVtYmVyLgoKICAgICAgICAgICBTV0lHIGRvZXNuJ3Qga25vdyBob3cgdG8gaGFuZGxlIG9wZXJhdG9yIHNwZWNpZmljYXRpb25zIAogICAgICAgICAgIHNvbWV0aW1lcyB1c2VkIGZvciBhdXRvbWF0aWMgdHlwZSBjb252ZXJzaW9uLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgY2xhc3MgU3RyaW5nIHsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICBvcGVyYXRvciBjb25zdCBjaGFyKigpOwogICAgICAgICAgICAgIC4uLgogICAgICAgICAgIH07CgogICAgICAgICAgICh0aGlzIGRvZXNuJ3QgcGFyc2UgY29ycmVjdGx5IGFuZCBnZW5lcmF0ZXMgYSBzeW50YXggZXJyb3IpLgoKICAgICAgICAgICBBbHNvOiBvcGVyYXRvcnMgbm8gbG9uZ2VyIHNob3cgdXAgYXMgc2VwYXJhdGUgcGFyc2UtdHJlZQogICAgICAgICAgIG5vZGVzIChpbnN0ZWFkIHRoZXkgYXJlIG5vcm1hbCAnY2RlY2wnIG5vZGVzKS4gIEkgbWF5CiAgICAgICAgICAgc2VwYXJhdGUgdGhlbSBhcyBhIHNwZWNpYWwgY2FzZSBsYXRlci4KCiAgICAgICAgICAgU2VlIEV4YW1wbGVzL3B5dGhvbi9vcGVyYXRvciBmb3IgYW4gZXhhbXBsZS4KCiAgICAgICAgICAgKioqIFNVUEVSLUVYUEVSSU1FTlRBTCBORVcgRkVBVFVSRSAqKioKClZlcnNpb24gMS4zLjkgKFNlcHRlbWJlciAyNSwgMjAwMSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKOS8yNS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgcGFyc2luZyBwcm9ibGVtIHdpdGggdHlwZSBkZWNsYXJhdGlvbnMgbGlrZSAKICAgICAgICAgICAnY2hhciAqKiBjb25zdCcuICBTV0lHIHBhcnNlZCB0aGlzIGNvcnJlY3RseSwgYnV0IHRoZQogICAgICAgICAgIGludGVybmFsIHR5cGUgd2FzIHJlcHJlc2VudGVkIGluY29ycmVjdGx5ICh0aGUgcG9pbnRlcnMKICAgICAgICAgICBhbmQgcXVhbGlmaWVycyB3ZXJlIGluIHRoZSB3cm9uZyBvcmRlcikuCgo5LzI1LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBXaXRoZHJldyBleHBlcmltZW50YWwgZmVhdHVyZSAobm90ZWQgYmVsb3cpIHRoYXQgd2FzCiAgICAgICAgICAgY2F1c2luZyBzZXJpb3VzIHBhcnNpbmcgcHJvYmxlbXMuCgpWZXJzaW9uIDEuMy44IChTZXB0ZW1iZXIgMjMsIDIwMDEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjkvMjMvMjAwMTogYmVhemxleQogICAgICAgICAgIEluY2x1ZGVkIGltcHJvdmVkIGRpc3R1dGlscyBzZXR1cC5weSBmaWxlIGluIHRoZSBUb29scyAKICAgICAgICAgICBkaXJlY3RvcnkgKGxvb2sgZm9yIHRoZSBzZXR1cC5weS50bXBsIGZpbGUpLiAgQ29udHJpYnV0ZWQgYnkKICAgICAgICAgICBUb255IFNld2FyZC4KCjkvMjMvMjAwMTogYmVhemxleQogICAgICAgICAgIEluY2x1ZGVkIHR3byBuZXcgUlBNIHNwZWMgZmlsZXMgaW4gdGhlIFRvb2xzIGRpcmVjdG9yeS4gQ29udHJpYnV0ZWQKICAgICAgICAgICBieSBUb255IFNld2FyZCBhbmQgVXdlIFN0ZWlubWFubi4KICAKOS8yMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgQnVnIFsgIzQ2MzYzNSBdIFBlcmw1LnN3ZyBkb2VzIG5vdCBjb21waWxlIGluIFZpc3VhbCBDKysKCjkvMjEvMjAwMTogYmVhemxleQogICAgICAgICAgIFR3byBuZXcgZGlyZWN0aXZlcyBjb250cm9sIHRoZSBjcmVhdGlvbiBvZiBkZWZhdWx0CiAgICAgICAgICAgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9yczoKCiAgICAgICAgICAgICAgICAlbm9kZWZhdWx0CiAgICAgICAgICAgICAgICAlbWFrZWRlZmF1bHQKCiAgICAgICAgICAgVGhlc2UgcmVwbGFjZSAlcHJhZ21hIG5vZGVmYXVsdCBhbmQgJXByYWdtYSBtYWtlZGVmYXVsdC4KICAgICAgICAgICAob2xkIGNvZGUgd2lsbCBzdGlsbCB3b3JrLCBidXQgZG9jdW1lbnRhdGlvbiB3aWxsIG9ubHkKICAgICAgICAgICBkZXNjcmliZSB0aGUgbmV3IGRpcmVjdGl2ZXMpLgoKOS8yMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgQnVnIFsgIzQ2MjM1NCBdICVpbXBvcnQgYnJva2VuIGluIDEuMy43LgoKOS8yMC8yMDAxOiBiZWF6bGV5CgogICAgICAgICAgIFBhcnNlciBtb2RpZmllZCB0byBpZ25vcmUgb3V0LW9mLWNsYXNzIGNvbnN0cnVjdG9yCiAgICAgICAgICAgYW5kIGRlc3RydWN0b3IgZGVjbGFyYXRpb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBpbmxpbmUgRm9vOjpGb28oKSA6CiAgICAgICAgICAgICAgICAgICAgQmFyKCJmb28iKQogICAgICAgICAgICAgICB7IAogICAgICAgICAgICAgICB9IAoKICAgICAgICAgICAgICAgaW5saW5lIEZvbzo6fkZvbygpIHsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBTdWdnZXN0ZWQgYnkgSmFzb24gU3Rld2FydC4KICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIEZFQVRVUkUgKioqCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBNb2RpZmllZCB0aGUgcGFyc2VyIHRvIGlnbm9yZSBmb3J3YXJkIHRlbXBsYXRlIGNsYXNzCiAgICAgICAgICAgZGVjbGFyYXRpb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBWLCBsb25nIFM+IGNsYXNzIE1hcEl0ZXI7CgogICAgICAgICAgIFN1Z2dlc3RlZCBieSBhbiBlbWFpbCBleGFtcGxlIGZyb20gSXJpbmEgS290bG92YS4KCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCB1bmRlY2xhcmVkIHRjbF9yZXN1bHQgdmFyaWFibGUgaW4gCiAgICAgICAgICAgdGhlICJvdXQiIHR5cGVtYXAgZm9yIFRjbC4gIFJlcG9ydGVkIGJ5IFNoYXVuIExvd3J5LgoKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgSW5jb3Jwb3JhdGVkIGNoYW5nZXMgdG8gbWFrZSBTV0lHIHdvcmsgd2l0aCBBY3RpdmVQZXJsLiAgCiAgICAgICAgICAgQ29udHJpYnV0ZWQgYnkgSm9lbCBSZWVkLgoKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgU2xpZ2h0IGNoYW5nZSB0byB0aGUgcGFyc2luZyBvZiBDKysgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXJzLgogICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICBjbGFzcyBGb28gOiBwdWJsaWMgQmFyIHsKICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgIEZvbygpIDogQmFyKC4uLikgey4uLn0KICAgICAgICAgICB9OwoKICAgICAgICAgICBTV0lHIG5vdyBkaXNjYXJkcyB0aGUgY29udGVudHMgb2YgdGhlICguLi4pIHJlZ2FyZGxlc3Mgb2YgCiAgICAgICAgICAgd2hhdCBtaWdodCBlbmNsb3NlZCAoZXZlbiBpZiBzeW50YWN0aWNhbGx5IHdyb25nKS4gIFNXSUcKICAgICAgICAgICBkb2Vzbid0IG5lZWQgdGhpcyBpbmZvcm1hdGlvbiBhbmQgdGhlcmUgaXMgbm8gcmVhc29uIHRvCiAgICAgICAgICAgbmVlZGxlc3MgYWRkIHN5bnRheCBydWxlcyB0byBoYW5kbGUgYWxsIG9mIHRoZSBwb3NzaWJpbGl0aWVzCiAgICAgICAgICAgaGVyZS4KCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIENoYW5nZSB0byB0eXBlbWFwcyBmb3Igc3RydWN0dXJlIG1lbWJlcnMuICBJZiB5b3UgaGF2ZSBhCiAgICAgICAgICAgc3RydWN0dXJlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgc3RydWN0IFZlY3RvciB7CiAgICAgICAgICAgICAgICBpbnQgKmJhcjsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICBUaGUgbWVtYmVyIG5hbWUgJ2JhcicgaXMgbm93IHVzZWQgaW4gYW55IGFjY2Vzc29yIGZ1bmN0aW9ucy4KICAgICAgICAgICBUaGlzIGFsbG93cyB0aGUgImluIiB0eXBlbWFwIHRvIGJlIHVzZWQgd2hlbiBzZXR0aW5nIHRoZSB2YWx1ZS4KICAgICAgICAgICBGb3IgZXhhbXBsZSwgdGhpcyB0eXBlbWFwCgogICAgICAgICAgICAgICAldHlwZW1hcChweXRob24saW4pIGludCAqYmFyIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgIG5vdyBtYXRjaGVzIFZlY3Rvcjo6YmFyLiAgSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgdGhpcyB3aWxsIGFsc28KICAgICAgICAgICBtYXRjaCBhbnkgZnVuY3Rpb24gd2l0aCBhbiBhcmd1bWVudCBvZiAiaW50ICpiYXIiIChzbyB5b3Ugc2hvdWxkCiAgICAgICAgICAgYmUgY2FyZWZ1bCkuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFLiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgYnVnICM0NjI2NDIgc2V0dGluZyBzdHJpbmcgdmFsdWVzIGluIHN0cnVjdHVyZXMKCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIGJ1ZyAjNDYyMzk4IHByb2JsZW0gd2l0aCBuZXN0ZWQgdGVtcGxhdGVzLgoKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgYnVnICM0NjE2MjYgcHJvYmxlbSB3aXRoIGZvcm1hdHRpbmcgYW5kIEMrKyBjb21tZW50cy4KICAgICAgICAgICAgCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIGJ1ZyAjNDYyODQ1IFdyb25nIG93bmVyc2hpcCBvZiByZXR1cm5lZCBvYmplY3RzLgogICAgICAgICAgIAo5LzE5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBidWcgIzQ1OTM2Ny4gIERlZmF1bHQgY29uc3RydWN0b3JzIGZvciBjbGFzc2VzCiAgICAgICAgICAgd2l0aCBwdXJlIHZpcnR1YWwgbWV0aG9kcy4KCjkvMTkvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBhbmQgY2xhc3Mgc2NvcGUuICBGb3IKICAgICAgICAgICBleGFtcGxlOgoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICBlbnVtIGJhciB7IEZPTywgQkFSIH07CiAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaChiYXIgYiA9IEZPTyk7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgIFNXSUcgbm93IGNvcnJlY3RseSBnZW5lcmF0ZXMgYSBkZWZhdWx0IHZhbHVlIG9mICJGb286OkZPTyIgZm9yCiAgICAgICAgICAgdGhlIGJsYWgoKSBtZXRob2QgYWJvdmUuICBUaGlzIHVzZWQgdG8gd29yayBpbiAxLjEsIGJ1dCB3YXMKICAgICAgICAgICBicm9rZW4gaW4gMS4zLjcuICAgQnVnIHJlcG9ydGVkIGJ5IE1pa2UgUm9tYmVyZy4KClZlcnNpb24gMS4zLjcgIChTZXB0ZW1iZXIgMywgMjAwMSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKOS8wMi8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgc3BlY2lhbCAlaWdub3JlIGRpcmVjdGl2ZSB0byBpZ25vcmUgZGVjbGFyYXRpb25zLiAgVGhpcwogICAgICAgICAgIGZlYXR1cmUgd29ya3MgZXhhY3RseSBsaWtlICVyZW5hbWUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAlaWdub3JlICBmb287ICAgICAgICAvLyBJZ25vcmUgYWxsIGRlY2xhcmF0aW9ucyBmb28KICAgICAgICAgICAgICVpZ25vcmUgIDo6Zm9vOyAgICAgIC8vIE9ubHkgaWdub3JlIGZvbyBpbiBnbG9iYWwgc2NvcGUKICAgICAgICAgICAgICVpZ25vcmUgIFNwYW06OmZvbzsgIC8vIE9ubHkgaWdub3JlIGluIGNsYXNzIFNwYW0KICAgICAgICAgICAgICVpZ25vcmUgICo6OmZvbzsgICAgIC8vIElnbm9yZSBpbiBhbGwgY2xhc3NlcwoKICAgICAgICAgICAlaWdub3JlIGNhbiBhbHNvIGJlIHBhcmFtZXRlcml6ZWQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAlaWdub3JlIGZvbyhpbnQpOwogICAgICAgICAgICAgJWlnbm9yZSA6OmZvbyhpbnQpOwogICAgICAgICAgICAgJWlnbm9yZSBTcGFtOjpmb28oaW50KTsKICAgICAgICAgICAgICVpZ25vcmUgKjo6Zm9vKGludCk7CgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAgCgo5LzAyLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBzaGFkb3djb2RlIHByYWdtYSBtb2RpZmllZCBzbyB0aGF0IHRoZSBjb2RlIHRoYXQgaXMgb3V0cHV0IAogICAgICAgICAgIGluIHRoZSBzaGFkb3cgZmlsZSBpcyBwbGFjZWQgcmVsYXRpdmUgdG8gd2hlcmUgaXQgaXMgcGxhY2VkIGluIHRoZSAKICAgICAgICAgICBjL2MrKyBjb2RlLiBUaGlzIGFsbG93cyBzdXBwb3J0IGZvciBKYXZhRG9jIGZ1bmN0aW9uIGNvbW1lbnRzLiAKCjkvMDEvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIFBhdGNoIFsgIzQ0Nzc5MSBdIEZpeCBmb3IgcHl0aG9uIC1pbnRlcmZhY2Ugb3B0aW9uLgogICAgICAgICAgIFN1Ym1pdHRlZCBieSBUYXJuIFdlaXNuZXIgQnVydG9uLgoKOS8wMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgU1dJRyBubyBsb25nZXIgZ2VuZXJhdGVzIGRlZmF1bHQgY29uc3RydWN0b3JzL2Rlc3RydWN0b3JzCiAgICAgICAgICAgZm9yIGEgY2xhc3MgaWYgaXQgb25seSBkZWZpbmVzIGEgcHJpdmF0ZS9wcm90ZWN0ZWQgY29uc3RydWN0b3IKICAgICAgICAgICBvciBkZXN0cnVjdG9yIG9yIGlmIGFueSBvbmUgb2YgaXRzIGJhc2UgY2xhc3NlcyBvbmx5IGhhcwogICAgICAgICAgIHByaXZhdGUgY29uc3RydWN0b3JzL2Rlc3RydWN0b3JzLiAgVGhpcyB3YXMgcmVwb3J0ZWQgaW4KICAgICAgICAgICBTRiBQYXRjaCBbICM0NDQyODEgXSBub25wdWJsaWMvZGVmYXVsdC9pbmhlcmV0ZWQgY3Rvci9kdG9yCiAgICAgICAgICAgYnkgTWFyY2VsbyBNYXR1cy4KCjkvMDEvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIHBhdGNoIHRvIFBlcmw1IG1vZHVsZSB0aGF0IGFsbG93cyBjb25zdGFudHMgdG8gYmUKICAgICAgICAgICB3cmFwcGVkIGFzIGNvbnN0YW50cyB0aGF0IGRvbid0IHJlcXVpcmUgdGhlIGxlYWRpbmcgJC4KICAgICAgICAgICBUaGlzIGZlYXR1cmUgaXMgZW5hYmxlZCB1c2luZyB0aGUgLWNvbnN0IG9wdGlvbi4KICAgICAgICAgICBQYXRjaCBjb250cmlidXRlZCBieSBSaWNoIFdhbGVzLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMzEvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIHBhcnNpbmcgc3VwcG9ydCBmb3IgdGhlICd2b2xhdGlsZScgdHlwZSBxdWFsaWZpZXIuCiAgICAgICAgICAgdm9sYXRpbGUgZG9lc24ndCBtZWFuIGFueXRoaW5nIHRvIFNXSUcsIGJ1dCBpdCBpcwogICAgICAgICAgIG5lZWRlZCB0byBwcm9wZXJseSBnZW5lcmF0ZSBwcm90b3R5cGVzIGZvciBkZWNsYXJhdGlvbnMKICAgICAgICAgICB0aGF0IHVzZSBpdC4gIEl0J3MgYWxzbyBiZWVuIGFkZGVkIHRvIG1ha2UgdGhlIFNXSUcgdHlwZQogICAgICAgICAgIHN5c3RlbSBtb3JlIGNvbXBsZXRlLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMzAvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHBhcmFtZXRlcml6ZWQgJXJlbmFtZSBkaXJlY3RpdmUuICAqKiogVGhpcwogICAgICAgICAgIG5ldyBmZWF0dXJlIGNhbiBiZSB1c2VkIHRvIGdyZWF0bHkgc2ltcGxpZnkgdGhlIHRhc2sgb2YKICAgICAgICAgICByZXNvbHZpbmcgb3ZlcmxvYWRlZCBtZXRob2RzIGFuZCBmdW5jdGlvbnMuICoqKgogICAgICAgICAgIAogICAgICAgICAgIEluIHByaW9yIHZlcnNpb25zIG9mIFNXSUcsIHRoZSAlcmVuYW1lIGRpcmVjdGl2ZSB3YXMKICAgICAgICAgICB1c2VkIHRvIGNvbnNpc3RlbnRseSBhcHBseSBhbiBpZGVudGlmaWVyIHJlbmFtaW5nLiBGb3IgCiAgICAgICAgICAgZXhhbXBsZSwgaWYgeW91IHNhaWQgdGhpczoKCiAgICAgICAgICAgICAgICAlcmVuYW1lIGZvbyBiYXI7CgogICAgICAgICAgIEV2ZXJ5IG9jY3VycmVuY2Ugb2YgJ2Zvbycgd291bGQgYmUgcmVuYW1lZCB0byAnYmFyJy4gCiAgICAgICAgICAgQWx0aG91Z2ggdGhpcyB3b3JrcyBmaW5lIGZvciByZXNvbHZpbmcgYSBjb25mbGljdCB3aXRoIGEKICAgICAgICAgICB0YXJnZXQgbGFuZ3VhZ2UgcmVzZXJ2ZWQgd29yZCwgaXQgaXMgdXNlbGVzcyBmb3IKICAgICAgICAgICBmb3IgZGVhbGluZyB3aXRoIG92ZXJsb2FkZWQgbWV0aG9kcy4gICAgVGhpcyBpcyBiZWNhdXNlCiAgICAgICAgICAgYWxsIG1ldGhvZHMgYXJlIHNpbXBseSByZW5hbWVkIHRvIHRoZSBzYW1lIHRoaW5nIAogICAgICAgICAgIChnZW5lcmF0aW5nIHRoZSBzYW1lIGNvbmZsaWN0IGFzIGJlZm9yZSkuCgogICAgICAgICAgIFRoZXJlZm9yZSwgdGhlIG9ubHkgd2F5IHRvIGRlYWwgd2l0aCBvdmVybG9hZGVkIG1ldGhvZHMKICAgICAgICAgICB3YXMgdG8gZ28gdGhyb3VnaCBhbmQgaW5kaXZpZHVhbGx5IHJlbmFtZSB0aGVtIGFsbCB1c2luZwogICAgICAgICAgICVuYW1lLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgYmFyKHZvaWQpOwogICAgICAgICAgICAgICAgICVuYW1lKGJhcl9pKSB2aXJ0dWFsIHZvaWQgYmFyKGludCk7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICB9OwoKICAgICAgICAgICBUbyBtYWtlIG1hdHRlcnMgd29yc2UsIHlvdSBoYWQgdG8gZG8gdGhpcyBmb3IgYWxsCiAgICAgICAgICAgZGVyaXZlZCBjbGFzc2VzIHRvby4KCiAgICAgICAgICAgICBjbGFzcyBTcGFtIDogcHVibGljIEZvbyB7CiAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGJhcih2b2lkKTsKICAgICAgICAgICAgICAgICAlbmFtZShiYXJfaSkgdmlydHVhbCB2b2lkIGJhcihpbnQpOwogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgfTsKCiAgICAgICAgICAgTmVlZGxlc3MgdG8gc2F5LCB0aGlzIG1ha2VzIGl0IGV4dHJlbWVseSBoYXJkIHRvIHJlc29sdmUKICAgICAgICAgICBvdmVybG9hZGluZyB3aXRob3V0IGEgbG90IG9mIHdvcmsgYW5kIG1ha2VzIGl0IGFsbW9zdAogICAgICAgICAgIGltcG9zc2libGUgdG8gdXNlIFNXSUcgb24gcmF3IEMrKyAuaCBmaWxlcy4KCiAgICAgICAgICAgVG8gZml4IHRoaXMsICVyZW5hbWUgbm93IGFjY2VwdHMgcGFyYW1ldGVyIGRlY2xhcmF0b3JzLgogICAgICAgICAgIFRoZSBzeW50YXggaGFzIGFsc28gYmVlbiBjaGFuZ2VkIHNsaWdodGx5LiAgRm9yIGV4YW1wbGUsCiAgICAgICAgICAgdGhlIGZvbGxvd2luZyBkZWNsYXJhdGlvbiByZW5hbWVzIGFsbCBvY2N1cnJlbmNlcyBvZiAnYmFyKGludCknCiAgICAgICAgICAgdG8gJ2Jhcl9pJywgbGVhdmluZyBhbnkgb3RoZXIgb2NjdXJyZW5jZSBvZiAnYmFyJyBhbG9uZS4KCiAgICAgICAgICAgICAlcmVuYW1lKGJhcl9pKSBiYXIoaW50KTsKCiAgICAgICAgICAgVXNpbmcgdGhpcyBmZWF0dXJlLCB5b3UgY2FuIG5vdyBzZWxlY3RpdmVseSByZW5hbWUgCiAgICAgICAgICAgY2VydGFpbiBkZWNsYXJhdGlvbnMgaW4gYWR2YW5jZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICVyZW5hbWUoYmFyX2kpIGJhcihpbnQpOwogICAgICAgICAgICAgJXJlbmFtZShiYXJfZCkgYmFyKGRvdWJsZSk7CgogICAgICAgICAgICAgLy8gSW5jbHVkZSByYXcgQysrIGhlYWRlciAgICAKICAgICAgICAgICAgICVpbmNsdWRlICJoZWFkZXIuaCIKCiAgICAgICAgICAgV2hlbiAlcmVuYW1lIGlzIHVzZWQgaW4gdGhpcyBtYW5uZXIsIGFsbCBvY2N1cnJlbmNlIG9mIGJhcihpbnQpCiAgICAgICAgICAgYXJlIHJlbmFtZWQgd2hlcmV2ZXIgdGhleSBtaWdodCBvY2N1ci4gIE1vcmUgY29udHJvbCBpcyBvYnRhaW5lZAogICAgICAgICAgIHRocm91Z2ggZXhwbGljaXQgcXVhbGlmaWNhdGlvbi4gRm9yIGV4YW1wbGUsCgogICAgICAgICAgICAgICVyZW5hbWUoYmFyX2kpIDo6YmFyKGludCk7CgogICAgICAgICAgIG9ubHkgYXBwbGllcyB0aGUgcmVuYW1pbmcgaWYgYmFyKGludCkgaXMgZGVmaW5lZCBpbiB0aGUgZ2xvYmFsIHNjb3BlLgogICAgICAgICAgIFRoZSBkZWNsYXJhdGlvbiwKICAgICAKICAgICAgICAgICAgICAlcmVuYW1lKGJhcl9pKSBGb286OmJhcihpbnQpOwoKICAgICAgICAgICBhcHBsaWVzIHRoZSByZW5hbWluZyBpZiBiYXIoaW50KSBpcyBkZWZpbmVkIGluIGEgY2xhc3MgRm9vLgogICAgICAgICAgIFRoaXMgbGF0dGVyIGZvcm0gYWxzbyBzdXBwb3J0cyBpbmhlcml0YW5jZS4gIFRoZXJlZm9yZSwgaWYgeW91CiAgICAgICAgICAgaGFkIGEgY2xhc3MgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgY2xhc3MgU3BhbSA6IHB1YmxpYyBGb28gewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICB2b2lkIGJhcihpbnQpOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgIFRoZSBTcGFtOjpiYXIoaW50KSBtZXRob2Qgd291bGQgYWxzbyBiZSByZW5hbWVkIChzaW5jZSBTcGFtIAogICAgICAgICAgIGlzIGEgc3ViY2xhc3Mgb2YgRm9vKS4gICBUaGlzIGxhdHRlciBmZWF0dXJlIG1ha2VzIGl0IGVhc3kKICAgICAgICAgICBmb3IgU1dJRyB0byBhcHBseSBhIGNvbnNpc3RlbnQgcmVuYW1pbmcgYWNyb3NzIGFuIGVudGlyZQogICAgICAgICAgIGNsYXNzIGhpZXJhcmNoeSBzaW1wbHkgYnkgc3BlY2lmeWluZyByZW5hbWluZyBydWxlcyBmb3IKICAgICAgICAgICB0aGUgYmFzZSBjbGFzcy4KCiAgICAgICAgICAgQSBjbGFzcyB3aWxkY2FyZCBvZiAqIGNhbiBiZSB1c2VkIGlmIHlvdSB3YW50IHRvIHJlbmFtaW5nCiAgICAgICAgICAgYWxsIG1hdGNoaW5nIG1lbWJlcnMgb2YgYWxsIGNsYXNzZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXJlbmFtZShiYXJfaSkgKjo6YmFyKGludCk7CgogICAgICAgICAgIHdpbGwgcmVuYW1lIGFsbCBtZW1iZXJzIGJhcihpbnQpIHRoYXQgYXJlIGRlZmluZWQgaW4gY2xhc3Nlcy4KICAgICAgICAgICBJdCB3aWxsIG5vdCByZW5hbWVkIGRlZmluaXRpb25zIG9mIGJhcihpbnQpIGluIHRoZSBnbG9iYWwKICAgICAgICAgICBzY29wZS4KCiAgICAgICAgICAgVGhlIG9sZCB1c2Ugb2YgJXJlbmFtZSBpcyBzdGlsbCBzdXBwb3J0ZWQsIGJ1dCBpcyBzb21ld2hhdAogICAgICAgICAgIGVuaGFuY2VkLiAgCgogICAgICAgICAgICAgICVyZW5hbWUoZm9vKSBiYXI7ICAgICAgLy8gUmVuYW1lcyBhbGwgb2NjdXJyZW5jZXMgb2YgJ2JhcicuCiAgICAgICAgICAgICAgJXJlbmFtZShmb28pIDo6YmFyOyAgICAvLyBSZW5hbWUgYWxsICdiYXInIGluIGdsb2JhbCBzY29wZSBvbmx5LgogICAgICAgICAgICAgICVyZW5hbWUoZm9vKSAqOjpiYXI7ICAgLy8gUmVuYW1lIGFsbCAnYmFyJyBpbiBjbGFzc2VzIG9ubHkuCiAgICAgICAgICAgICAgJXJlbmFtZShmb28pIEZvbzo6YmFyOyAvLyBSZW5hbWUgYWxsICdiYXInIGRlZmluZWQgaW4gY2xhc3MgRm9vLgoKICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzMwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBkYXRhLW1lbWJlciB0byBtZW1iZXItZnVuY3Rpb24gCiAgICAgICAgICAgdHJhbnNmb3JtYXRpb24uICBGb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3UgaGFkIGEKICAgICAgICAgICBzdHJ1Y3R1cmUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIHN0cnVjdCBWZWN0b3IgewogICAgICAgICAgICAgICAgICAgIGRvdWJsZSB4LHk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICBOb3cgc3VwcG9zZSB0aGF0IHlvdSB3YW50ZWQgdG8gYWNjZXNzIHggYW5kIHkgCiAgICAgICAgICAgdGhyb3VnaCBhIG1lbWJlciBmdW5jdGlvbiBpbnRlcmZhY2UgaW5zdGVhZCAKICAgICAgICAgICBvZiB0aGUgdXN1YWwgU1dJRyBiZWhhdmlvci4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIGYuc2V0X3goMy40KSAgICAgICMgaW5zdGVhZCBvZiBmLnggPSAzLjQKICAgICAgICAgICAgICB4ID0gZi5nZXRfeCgpICAgICAjIGluc3RlYWQgb2YgeCA9IGYueAoKICAgICAgICAgICBUbyBkbyB0aGlzLCBzaW1wbHkgdXNlIHRoZSBuZXcgJWF0dHJpYnV0ZWZ1bmMKICAgICAgICAgICBkaXJlY3RpdmUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWF0dHJpYnV0ZWZ1bmMoZ2V0XyVzLHNldF8lcykKICAgICAgICAgICAgICBzdHJ1Y3QgVmVjdG9yIHsKICAgICAgICAgICAgICAgICBkb3VibGUgeCx5OwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgJW5vYXR0cmlidXRlZnVuYwoKICAgICAgICAgICBUaGUgYXJndW1lbnRzIHRvICVhdHRyaWJ1dGVmdW5jIGFyZSBDLXN0eWxlIHByaW50ZgogICAgICAgICAgIGZvcm1hdCBzdHJpbmdzIHRoYXQgZGV0ZXJtaW5lIHRoZSBuYW1pbmcgY29udmVudGlvbgogICAgICAgICAgIHRvIHVzZS4gICVzIGlzIHJlcGxhY2VkIHdpdGggdGhlIGFjdHVhbCBuYW1lIG9mIHRoZQogICAgICAgICAgIGRhdGEgbWVtYmVyLiBTV0lHIHByb3ZpZGVzIGEgbnVtYmVyIG9mIHByaW50ZgogICAgICAgICAgIGV4dGVuc2lvbnMgdGhhdCBtaWdodCBoZWxwLiAgRm9yIGV4YW1wbGUsIGlmIHlvdQogICAgICAgICAgIHdhbnRlZCB0byB0aXRsZSBjYXNlIGFsbCBvZiB0aGUgYXR0cmlidXRlcywgeW91CiAgICAgICAgICAgY291bGQgZG8gdGhpczoKCiAgICAgICAgICAgICAgJWF0dHJpYnV0ZWZ1bmMoZ2V0JSh0aXRsZSlzLHNldCUodGl0bGUpcyk7CgogICAgICAgICAgIFRoaXMgd2lsbCB0dXJuIGFuIGF0dHJpYnV0ZSAnYmFyJyB0byAnZ2V0QmFyKCknIGFuZCAnc2V0QmFyKCknLgoKICAgICAgICAgICAoc29tZW9uZSByZXF1ZXN0ZWQgdGhpcyBsb25nIGFnbywgYnV0IEkgZmluYWxseSBmaWd1cmVkCiAgICAgICAgICAgaG93IHRvIGltcGxlbWVudCBpdCBpbiBhIHN0cmFpZ2h0Zm9yd2FyZCBtYW5uZXIpLgogICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgCjgvMzAvMjAwMTogYmVhemxleQogICAgICAgICAgIFNXSUcgbm93IGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVzIGRlZmF1bHQgY29uc3RydWN0b3JzCiAgICAgICAgICAgYW5kIGRlc3RydWN0b3JzIGlmIG5vbmUgYXJlIGRlZmluZWQuICBUaGlzIHVzZWQgdG8gYmUKICAgICAgICAgICBlbmFibGVkIHdpdGggYSBjb21tYW5kIGxpbmUgc3dpdGNoIC1tYWtlX2RlZmF1bHQsIGJ1dAogICAgICAgICAgIG1vc3QgcGVvcGxlIHdhbnQgdGhlc2UgZnVuY3Rpb25zIGFueXdheXMuICBUbyB0dXJuCiAgICAgICAgICAgb2ZmIHRoaXMgYmVoYXZpb3IgdXNlIHRoZSAtbm9fZGVmYXVsdCBvcHRpb24gb3IgaW5jbHVkZQogICAgICAgICAgIHRoZSBmb2xsb3dpbmcgcHJhZ21hIGluIHRoZSBpbnRlcmZhY2UgZmlsZToKIAogICAgICAgICAgICAgICAgICVwcmFnbWEgbm9fZGVmYXVsdDsKICAKICAgICAgICAgICBUaGlzIG1heSBicmVhayBjZXJ0YWluIGludGVyZmFjZXMgdGhhdCBkZWZpbmVkIHRoZWlyCiAgICAgICAgICAgb3duIGNvbnN0cnVjdG9ycy9kZXN0cnVjdG9ycyB1c2luZyB0aGUgc2FtZSBuYW1pbmcKICAgICAgICAgICBjb252ZW50aW9uIGFzIFNXSUcuICBJZiBzbywgeW91IHdpbGwgZ2V0IGR1cGxpY2F0ZQogICAgICAgICAgIHN5bWJvbHMgd2hlbiBjb21waWxpbmcgdGhlIFNXSUcgd3JhcHBlciBmaWxlLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOC8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlcyB0byBQZXJsNSBzaGFkb3cgY2xhc3MgY29kZSBnZW5lcmF0aW9uLiAgSXRlcmF0b3JzCiAgICAgICAgICAgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQgKEZJUlNUS0VZLCBORVhUS0VZKS4gIEFsc28sIGF0dHJpYnV0ZQogICAgICAgICAgIGFjY2VzcyBoYXMgYmVlbiBjaGFuZ2VkIHRvIHJlbHkgb24gaW5oZXJpdGFuY2UgaW4gb3JkZXIKICAgICAgICAgICB0byBwcm92aWRlIGJldHRlciBiZWhhdmlvciBhY3Jvc3MgbW9kdWxlcy4gIAoKOC8yOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgVmFyaW91cyBvYnNjdXJlIGltcHJvdmVtZW50cyB0byB0aGUgdHlwZSBzeXN0ZW0gYW5kIGNsYXNzZXMuCiAgICAgICAgICAgU3RyYW5nZSBkZWNsYXJhdGlvbnMgbGlrZSB0aGlzIGFyZSBub3cgd3JhcHBlZCBjb3JyZWN0bHkKICAgICAgICAgICAoaS5lLiwgdGhlIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUgZG9lc24ndCBjYXVzZSB0aGUgQysrCiAgICAgICAgICAgIGNvbXBpbGVyIHRvIGRpZSB3aXRoIGEgdHlwZSBlcnJvcikuCgogICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgdHlwZWRlZiBkb3VibGUgUmVhbDsKICAgICAgICAgICAgICAgICBSZWFsIGZvbyhSZWFsICgqb3ApKFJlYWwsUmVhbCksIFJlYWwgeCwgUmVhbCB5KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgSW5oZXJpdGFuY2Ugb2YgdHlwZXMgaXMgYWxzbyBoYW5kbGVkIGNvcnJlY3RseS4KICAgICAgICAgICAKOC8yOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlcyB0byBjbGFzcyB3cmFwcGVycy4gICBXaGVuIFNXSUcgc2VlcyB0d28gY2xhc3NlcyBsaWtlIHRoaXMsCiAKICAgICAgICAgICBjbGFzcyBYIHsKICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICB2b2lkIGZvbygpOwogICAgICAgICAgICAgLi4uCiAgICAgICAgICAgfQogCiAgICAgICAgICAgY2xhc3MgWSA6IHB1YmxpYyBYIHsKICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICB2b2lkIGJhcigpOwogICAgICAgICAgICAgLi4uCiAgICAgICAgICAgfQogCiAgICAgICAgICAgaXQgbm93IG9ubHkgZ2VuZXJhdGVzIHR3byB3cmFwcGVyIGZ1bmN0aW9uczoKIAogICAgICAgICAgICAgWF9mb28oWCAqeCkgeyB4LT5mb28oKTsgfQogICAgICAgICAgICAgWV9iYXIoWSAqeSkgeyB5LT5iYXIoKTsgfQogCiAgICAgICAgICAgVW5saWtlIFNXSUcxLjE1LCB0aGUgZm9vKCkgbWV0aG9kIGRvZXMgKm5vdCogcHJvcGFnYXRlIHRvIGEgd3JhcHBlcgogICAgICAgICAgIGZ1bmN0aW9uIFlfZm9vKCkuIEluc3RlYWQsIHRoZSBiYXNlIGNsYXNzIG1ldGhvZCBYX2ZvbygpIG11c3QgYmUKICAgICAgICAgICB1c2VkLgoKICAgICAgICAgICBUaGlzIGNoYW5nZSBzaG91bGQgbm90IGFmZmVjdCBtb2R1bGVzIHRoYXQgdXNlIHNoYWRvdyBjbGFzc2VzLCBidXQKICAgICAgICAgICBpdCBtaWdodCBicmVhayBtb2R1bGVzIHRoYXQgZGlyZWN0bHkgdXNlIHRoZSBsb3ctbGV2ZWwgQyB3cmFwcGVycy4KICAgICAgICAgICBUaGlzIGNoYW5nZSBpcyBiZWluZyBtYWRlIGZvciBhIG51bWJlciBvZiByZWFzb25zOgoKICAgICAgICAgICAgICAgLSAgSXQgZ3JlYXRseSBzaW1wbGlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBTV0lHLS1lc3BlY2lhbGx5CiAgICAgICAgICAgICAgICAgIHdpdGggYW50aWNpcGF0ZWQgZnV0dXJlIGNoYW5nZXMgc3VjaCBhcyBvdmVybG9hZGVkIG1ldGhvZHMuCgogICAgICAgICAgICAgICAtICBJdCByZXN1bHRzIGluIHN1YnN0YW50aWFsbHkgbGVzcyB3cmFwcGVyIGNvZGUtLWVzcGVjaWFsbHkKICAgICAgICAgICAgICAgICAgZm9yIGJpZyBDKysgY2xhc3MgaGllcmFyY2hpZXMgKGluaGVyaXRlZCBkZWNsYXJhdGlvbnMKICAgICAgICAgICAgICAgICAgYXJlIG5vIGxvbmdlciBjb3BpZWQgaW50byBldmVyeSBzaW5nbGUgZGVyaXZlZCBjbGFzcykuCgogICAgICAgICAgICAgICAtICBJdCBhbGxvd3MgZm9yIGJldHRlciBjb2RlIGdlbmVyYXRpb24gYWNyb3NzIG11bHRpcGxlCiAgICAgICAgICAgICAgICAgIFNXSUcgZ2VuZXJhdGVkIG1vZHVsZXMgKGNvZGUgaXNuJ3QgcmVwbGljYXRlZCBpbgogICAgICAgICAgICAgICAgICBldmVyeSBzaW5nbGUgbW9kdWxlKS4KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgo4LzIyLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFByb3ZpZGVkIHNvbWUgV2luZG93cyBkb2N1bWVudGF0aW9uIGluIHRoZSBXaW4gZGlyZWN0b3J5IGFuZCBzb21lCiAgICAgICAgICAgVmlzdWFsIEMrKyBwcm9qZWN0IGZpbGVzIGZvciBydW5uaW5nIGV4YW1wbGVzIG9uIFdpbmRvd3MuCgo4LzI4LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gSGFuZGxlIHJlbmFtZWQgb3ZlcmxvYWRlZCBmdW5jdGlvbnMgcHJvcGVybHk7CgkgICB0aGFua3MgdG8gTWFyYyBab256b24gPE1hcmMuWm9uem9uQHVuaXYtcmVubmVzMS5mcj4gZm9yIHRoZQoJICAgcGF0Y2guICBTZWUgdGhlIG5ldyB0ZXN0IGNhc2UgbmFtZV9jeHguCgo4LzI3LzIwMDE6IG1rb2VwcGUKCSAgIFtUY2xdIFJlbW92ZWQgbG90cyBvZiB3YXJuaW5ncyBpc3N1ZWQgYnkgdGhlIFN1biBGb3J0ZQoJICAgY29tcGlsZXJzLCB3aGljaCB3ZXJlIGNhdXNlZCBieSBtaXhpbmcgZnVuY3Rpb24gcG9pbnRlcnMKCSAgIG9mIGRpZmZlcmVudCBsaW5rYWdlcyAoQysrL0MpLiAKCjgvMjMvMjAwMTogbWtvZXBwZQoJICAgSW1wcm92ZWQgdGhlIE16U2NoZW1lIG1vZHVsZSBieSBwb3J0aW5nIEd1aWxlJ3MgcG9pbnRlcgoJICAgdHlwZSBjaGVja2luZyBzeXN0ZW0gYW5kIG1ha2luZyB0eXBlIGRpc3BhdGNoCgkgICB0eXBlbWFwLWRyaXZlbi4gCgo4LzIyLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBFbnRpcmVseSBuZXcgc3ltYm9sIHRhYmxlIHByb2Nlc3NpbmcuICAgU1dJRyBzaG91bGQgYmUgYWJsZSB0bwogICAgICAgICAgIHJlcG9ydCBtdWNoIGJldHRlciBlcnJvciBtZXNzYWdlcyBmb3IgbXVsdGlwbGUgZGVjbGFyYXRpb25zLiAKICAgICAgICAgICBBbHNvLCB0aGUgbmV3IHN5bWJvbCB0YWJsZSBhbGxvd3MgZm9yIG92ZXJsb2FkZWQgZnVuY3Rpb25zCiAgICAgICAgICAgKGFsdGhvdWdoIG92ZXJsb2FkaW5nIGlzbid0IHF1aXRlIHN1cHBvcnRlZCBpbiB0aGUgbGFuZ3VhZ2UKICAgICAgICAgICBtb2R1bGVzIHlldCkuCgo4LzIyLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgICogW0phdmFdICVuZXcgc3VwcG9ydCBhZGRlZC4KICAgICAgICAgICAqIFtKYXZhXSBQYWNrYWdlIEpOSSBuYW1lIHJlZml4ZWQhCgo4LzE5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBQeXRob24gbW9kdWxlIG1vZGlmaWVkIHRvIHN1cHBvcnQgcG9pbnRlcnMgdG8gQysrIG1lbWJlcnMuICBUaGlzCiAgICAgICAgICAgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgIAo4LzE5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCBsaW1pdGVkIHBhcnNpbmcgYW5kIGZ1bGwgdHlwZS1zeXN0ZW0gc3VwcG9ydCBmb3IgcG9pbnRlcnMgdG8KICAgICAgICAgICBtZW1iZXJzLiBOb25lIG9mIFNXSUcncyBsYW5ndWFnZSBtb2R1bGVzIHJlYWxseSBrbm93IGhvdyB0byBkZWFsIHdpdGgKICAgICAgICAgICB0aGlzIHNvIHRoaXMgaXMgcmVhbGx5IG9ubHkgcHJvdmlkZWQgZm9yIGNvbXBsZXRlbmVzcyBhbmQgZnV0dXJlCiAgICAgICAgICAgZXhwYW5zaW9uLiAgTm90ZTogU1dJRyBkb2VzIG5vdCBzdXBwb3J0IHBvaW50ZXJzIHRvIG1lbWJlcnMgd2hpY2ggCiAgICAgICAgICAgYXJlIHRoZW1zZWx2ZXMgcG9pbnRlcnMgdG8gbWVtYmVycywgcmVmZXJlbmNlcyB0byBwb2ludGVycyB0byBtZW1iZXJzLAogICAgICAgICAgIG9yIG90aGVyIGNvbXBsaWNhdGVkIGRlY2xhcmF0aW9ucyBsaWtlIHRoaXMuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8xOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgU1dJRyBpcyBtdWNoIGJldHRlciBhdCBwYXJzaW5nIGNlcnRhaW4gQysrIGRlY2xhcmF0aW9ucy4gT3BlcmF0b3JzIGFuZAogICAgICAgICAgIGZyaWVuZHMgZ2VuZXJhbGx5IGRvbid0IGNhdXNlIGFueW1vcmUgc3ludGF4IGVycm9ycy4gIEhvd2V2ZXIsIG5laXRoZXIKICAgICAgICAgICBhcmUgcmVhbGx5IHN1cHBvcnRlZC4KCjgvMTgvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkICpoaWdobHkqIGV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciB3cmFwcGluZyBvZiBDKysKICAgICAgICAgICB0ZW1wbGF0ZSBkZWNsYXJhdGlvbnMuICBTaW5jZSBDKysgdGVtcGxhdGVzIGFyZSBlc3NlbnRpYWxseQogICAgICAgICAgIGdsb3JpZmllZCBtYWNyb3MgYW5kIFNXSUcgaGFzIGEgZnVsbHkgb3BlcmF0aW9uYWwgQyAKICAgICAgICAgICBwcmVwcm9jZXNzb3Igd2l0aCBtYWNybyBzdXBwb3J0LCB0aGUgcGFyc2VyIG5vdyBjb252ZXJ0cwogICAgICAgICAgIHRlbXBsYXRlIGRlY2xhcmF0aW9ucyB0byBtYWNyb3MuICBGb3IgZXhhbXBsZSwgYSBmdW5jdGlvbgogICAgICAgICAgIHRlbXBsYXRlIGxpa2UgdGhpcwoKICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gVCBtYXgoVCBhLCBUIGIpOwoKICAgICAgICAgICBpcyBpbnRlcm5hbGx5IGNvbnZlcnRlZCBpbnRvIGEgbWFjcm8gbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgJWRlZmluZSAlX3RlbXBsYXRlX21heChfX25hbWUsVCkKICAgICAgICAgICAgICAgJW5hbWUoX19uYW1lKSBUIG1heChUIGEsIFQgYik7CiAgICAgICAgICAgICAgICVlbmRkZWYKCiAgICAgICAgICAgVG8gaW5zdGFudGlhdGUgYSB2ZXJzaW9uIG9mIHRoZSB0ZW1wbGF0ZSwgYSBzcGVjaWFsICV0ZW1wbGF0ZSBkZWNsYXJhdGlvbgogICAgICAgICAgIGlzIHVzZWQgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgJXRlbXBsYXRlKG1heGludCkgbWF4PGludD47ICAgICAgICAgIAogICAgICAgICAgICAgICAldGVtcGxhdGUobWF4ZG91YmxlKSBtYXg8ZG91YmxlPjsKCiAgICAgICAgICAgVGhlIHBhcmFtZXRlciB0byB0aGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBtdXN0IGJlIHByb3BlciBDIGlkZW50aWZpZXIgdGhhdCdzCiAgICAgICAgICAgdXNlZCB0byB1bmlxdWVseSBuYW1lIHRoZSByZXN1bHRpbmcgaW5zdGFudGlhdGlvbi4gICBXaGVuIHVzZWQsIHRoZQogICAgICAgICAgIHRoZSBleHBhbmRlZCBtYWNybyBsb29rcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICVuYW1lKG1heGludCkgaW50IG1heChpbnQgYSwgaW50IGIpOwogICAgICAgICAgICAgICVuYW1lKG1heGRvdWJsZSkgZG91YmxlIG1heChkb3VibGUgYSwgZG91YmxlIGIpOwoKICAgICAgICAgICBBIHNpbWlsYXIgdGVjaG5pcXVlIGlzIHVzZWQgZm9yIHRlbXBsYXRlIGNsYXNzZXMuICAgRm9yIGluc3RhbmNlOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyB2ZWN0b3IgewogICAgICAgICAgICAgICAgIFQgKmRhdGE7CiAgICAgICAgICAgICAgICAgaW50IHN6OwogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICB2ZWN0b3IoaW50IG5pdGVtcyk7CiAgICAgICAgICAgICAgICAgVCAqZ2V0KGludCBuKTsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwoKICAgICAgICAgICBHZXRzIGNvbnZlcnRlZCBpbnRvIGEgbWFjcm8gbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAlZGVmaW5lICVfdGVtcGxhdGVfdmVjdG9yKF9fbmFtZSwgVCkKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgIHR5cGVkZWYgdmVjdG9yPFQ+IF9fbmFtZTsKICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgIGNsYXNzIF9fbmFtZSB7CiAgICAgICAgICAgICAgICAgVCAqZGF0YTsKICAgICAgICAgICAgICAgICBpbnQgc3o7CiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIF9fbmFtZShpbnQgbml0ZW1zKTsKICAgICAgICAgICAgICAgICBUICpnZXQoaW50IG4pOwogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgdHlwZWRlZiBfX25hbWUgdmVjdG9yPFQ+OwogICAgICAgICAgICAgICVlbmRkZWYKCiAgICAgICAgICAgQW4gYSBzcGVjaWZpYyBpbnN0YW50aWF0aW9uIGlzIGNyZWF0ZWQgaW4gZXhhY3RseSB0aGUgc2FtZSB3YXk6CgogICAgICAgICAgICAgJXRlbXBsYXRlKGludHZlYykgdmVjdG9yPGludD47CgogICAgICAgICAgIFRoZSByZXN1bHRpbmcgY29kZSBwYXJzZWQgYnkgU1dJRyBpcyB0aGVuOgoKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgIHR5cGVkZWYgdmVjdG9yPGludD4gaW50dmVjOwogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgY2xhc3MgaW50dmVjIHsKICAgICAgICAgICAgICAgICAgaW50ICpkYXRhOwogICAgICAgICAgICAgICAgICBpbnQgc3o7CiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICBpbnR2ZWMoaW50IG5pdGVtcyk7CiAgICAgICAgICAgICAgICAgIGludCAqZ2V0KGludCBuKTsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB0eXBlZGVmIGludHZlYyB2ZWN0b3I8aW50PjsKCiAgICAgICAgICAgTm90ZTogdGhlIGxhc3QgdHlwZWRlZiBpcyBub24tc3RhbmRhcmQgQyBhbmQgaXMgdXNlZCBieSBTV0lHIHRvIHByb3ZpZGUKICAgICAgICAgICBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRoZSBuYW1lICJpbnR2ZWMiIGFuZCB0aGUgdGVtcGxhdGUgdHlwZSAKICAgICAgICAgICAidmVjdG9yPGludD4iLgoKICAgICAgICAgICBDQVVUSU9OOiAgVGhpcyBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBhbmQgdGhlIGZpcnN0IHRpbWUgU1dJRyBoYXMKICAgICAgICAgICBzdXBwb3J0ZWQgQysrIHRlbXBsYXRlcy4gICBFcnJvciByZXBvcnRpbmcgaXMgZXNzZW50aWFsIG5vbi1leGlzdGVudC4KICAgICAgICAgICBJdCB3aWxsIHByb2JhYmx5IGJyZWFrIGluIGNlcnRhaW4gY2FzZXMuCiAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBORVcgRkVBVFVSRSAqKioqCgo4LzE1LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBDaGFuZ2UgdG8gd3JhcHBpbmcgb2YgbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzLiAgQXJyYXlzCiAgICAgICAgICAgYXJlIG5vdyBwcm9wZXJseSBtYXBwZWQgdG8gYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mCiAgICAgICAgICAgb25lIGxlc3MgZGltZW5zaW9uLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgaW50IFsxMF07ICAgICAgICAgICAgICAtLT4gIGludCAqCiAgICAgICAgICAgICAgICBpbnQgWzEwXVsyMF07ICAgICAgICAgIC0tPiAgaW50ICgqKVsyMF07CiAgICAgICAgICAgICAgICBpbnQgWzEwXVsyMF1bMzBdOyAgICAgIC0tPiAgaW50ICgqKVsyMF1bMzBdOwoKICAgICAgICAgICBUaGlzIGNoYW5nZSBtYXkgYnJlYWsgY2VydGFpbiBTV0lHIGV4dGVuc2lvbnMgYmVjYXVzZQogICAgICAgICAgIG9sZGVyIHZlcnNpb25zIHNpbXBseSBtYXBwZWQgYWxsIGFycmF5cyBpbnRvIGEgc2luZ2xlCiAgICAgICAgICAgcG9pbnRlciBzdWNoIGFzICJpbnQgKiIuICAgQWx0aG91Z2ggcG9zc2libHkgdW51c3VhbCwgCiAgICAgICAgICAgdGhlIG5ldyB2ZXJzaW9uIGlzIGNvcnJlY3QgaW4gdGVybXMgb2YgdGhlIEMgdHlwZSBzeXN0ZW0uCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAKOC8wNi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICAqIFtKYXZhXSBBcnJheSBzZXR0ZXJzIGdlbmVyYXRlZCBmb3Igc3RydWN0L2NsYXNzIGFycmF5IG1lbWJlcnMuCgo4LzEzLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBNYW55IGltcHJvdmVtZW50cyB0byBUY2wvUGVybC9QeXRob24gbW9kdWxlcyB0byBiZXR0ZXIKICAgICAgICAgICB3b3JrIHdpdGggbXVsdGlwbGUgaW50ZXJmYWNlIGZpbGVzIGFuZCB0aGUgJWltcG9ydCBkaXJlY3RpdmUuCgo4LzEzLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCB1cCB0aGUgYmVoYXZpb3Igb2YgJWltcG9ydCBpbiB0aGUgUHl0aG9uIG1vZHVsZS4KICAgICAgICAgICBTV0lHIG5vIGxvbmdlciBwb2xsdXRlcyB0aGUgbW9kdWxlIG5hbWVzcGFjZSBieSB1c2luZwogICAgICAgICAgICdmcm9tIG1vZHVsZSBpbXBvcnQgKicgdG8gcmVmZXIgdG8gdGhlIG90aGVyIG1vZHVsZS4gCiAgICAgICAgICAgSW5zdGVhZCwgaXQgZG9lcyBhIHByb3BlciAnaW1wb3J0IG1vZHVsZScuICAgQWxzbywgU1dJRwogICAgICAgICAgIG1heSB3b3JrIGEgbG90IGJldHRlciB3aGVuIGltcG9ydGluZyBtb2R1bGVzIHRoYXQgaW5jbHVkZQogICAgICAgICAgIHJlZmVyZW5jZXMgdG8gb3RoZXIgaW1wb3J0ZWQgbW9kdWxlcy4KCjgvMTMvMjAwMTogbWtvZXBwZQoJICAgQWRkZWQgbmV3IHR5cGVtYXAgc3Vic3RpdHV0aW9ucywgZ2VuZXJhbGl6aW5nIHRob3NlIG9mIHRoZQoJICAgR3VpbGUtc3BlY2lmaWMgNS8yNy8yMDAxIGNoYW5nZXM6IAoJICAgKiAkZGVzY3JpcHRvciBpcyB0aGUgc2FtZSBhcyBTV0lHVFlQRSRtYW5nbGUsIGJ1dCBhbHNvCgkgICAgIGVuc3VyZXMgdGhhdCB0aGUgdHlwZSBkZXNjcmlwdG9yIG9mIHRoaXMgbmFtZSBnZXRzCgkgICAgIGRlZmluZWQuCgkgICAqICQqdHlwZSwgJCpsdHlwZSwgJCptYW5nbGUsICQqZGVzY3JpcHRvciBhcmUgdGhlIHNhbWUgYXMKCSAgICAgdGhlIHZhcmlhbnRzIHdpdGhvdXQgc3RhciwgYnV0IHRoZXkgUkVNT1ZFIG9uZSBsZXZlbCBvZgoJICAgICBwb2ludGVycyBmcm9tIHRoZSB0eXBlLiAoVGhpcyBpcyBvbmx5IHZhbGlkIGZvciBwb2ludGVyIAoJICAgICB0eXBlcy4pCgkgICAqICQmdHlwZSwgJCZsdHlwZSwgJCZtYW5nbGUsICQmZGVzY3JpcHRvciBhcmUgdGhlIHNhbWUgYXMKCSAgICAgdGhlIHZhcmlhbnRzIHdpdGhvdXQgYW1wZXJzYW5kLCBidXQgdGhleSBBREQgb25lIGxldmVsIG9mCgkgICAgIHBvaW50ZXJzIHRvIHRoZSB0eXBlLgoJICAgVGhlIEd1aWxlLXNwZWNpZmljIHN1YnN0aXR1dGlvbiAkYmFzZWRlc2NyaXB0b3Igd2FzIHJlbW92ZWQKCSAgIGJlY2F1c2UgaXQgd2FzIHVzZWxlc3MuCgo4LzEyLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBUaGUgJWV4dGVybiBkaXJlY3RpdmUgaXMgbm93IGRlcHJlY2F0ZWQgYW5kIHdpdGhkcmF3bi4gIFRoZQogICAgICAgICAgIHB1cnBvc2Ugb2YgdGhpcyBkaXJlY3RpdmUgd2FzIHRvIGltcG9ydCBzZWxlY3RlZCBkZWZpbml0aW9ucwogICAgICAgICAgIGZyb20gb3RoZXIgaW50ZXJmYWNlIGZpbGVzIGFuZCBoZWFkZXJzLiAgSG93ZXZlciwgdGhlIHNhbWUKICAgICAgICAgICBmdW5jdGlvbmFsaXR5IGlzIGJldHRlciBoYW5kbGVkIHRocm91Z2ggJWltcG9ydC4gICBUaGlzCiAgICAgICAgICAgbGVhdmVzIFNXSUcgd2l0aCB0d28gZmlsZSBpbmNsdXNpb24gZGlyZWN0aXZlczoKCiAgICAgICAgICAgICAgJWluY2x1ZGUgZmlsZW5hbWUgICAgIC0gSW5zZXJ0cyBpbnRvIGN1cnJlbnQgaW50ZXJmYWNlCiAgICAgICAgICAgICAgJWltcG9ydCBmaWxlbmFtZSAgICAgIC0gSW1wb3J0IHR5cGVzIGFuZCBjbGFzc2VzIGZyb20gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5vdGhlciBtb2R1bGUKCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo4LzA5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCBuZXcgc3VwcG9ydCBmb3Igd3JhcHBpbmcgQy9DKysgY2FsbGJhY2sgZnVuY3Rpb25zLiAKICAgICAgICAgICBBIGNvbW1vbiBwcm9ibGVtIHdpdGggc29tZSBDIGxpYnJhcmllcyBpcyB0aGF0IG1hbnkKICAgICAgICAgICBmdW5jdGlvbnMgdGFrZSBhIGZ1bmN0aW9uIHBvaW50ZXIgYXMgYW4gYXJndW1lbnQuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBpbnQgZG9fb3AoLi4uLCBpbnQgKCpvcCkoaW50LGludCksIC4uLik7CgogICAgICAgICAgIFVuZm9ydHVuYXRlbHksIHRoZSBvbmx5IHdheSB0byBjYWxsIHN1Y2ggYSBmdW5jdGlvbiBpcyB0bwogICAgICAgICAgIHBhc3MgaXQgYSBmdW5jdGlvbiBwb2ludGVyIG9mIHNvbWUgY29tcGF0aWJsZSB0eXBlLiAgSW4KICAgICAgICAgICBwcmV2aW91cyB2ZXJzaW9ucyBvZiBTV0lHLCB5b3UgaGFkIHRvIHNvbHZlIHRoaXMgcHJvYmxlbQogICAgICAgICAgIHdpdGggc29tZSByZWFsbHkgZ3Jvc3MgaGFja3MuICBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnRlZCB0bwogICAgICAgICAgIHVzZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIGFzIGEgY2FsbGJhY2ssCgogICAgICAgICAgICAgICBpbnQgZm9vKGludCwgaW50KTsKCiAgICAgICAgICAgeW91IGhhZCB0byBpbnN0YWxsIGEgcG9pbnRlciB0byBpdCBhcyBhIGNvbnN0YW50LiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAlY29uc3RhbnQgaW50ICgqRk9PKShpbnQsaW50KSA9IGZvbzsKCiAgICAgICAgICAgb3IgCgogICAgICAgICAgICAgICBjb25zdCBpbnQgKCpGT08pKGludCxpbnQpID0gZm9vOwoKICAgICAgICAgICBvciBpZiB5b3UgaGFkIGEgcmVhbGx5IG9sZCBTV0lHIHZlcnNpb246CgogICAgICAgICAgICAgICB0eXBlZGVmIGludCAoKk9QX0ZVTkMpKGludCxpbnQpOwogICAgICAgICAgICAgICBpbnQgZG9fb3AoLi4uLCBPUF9GVU5DLCAuLi4pOwogICAgICAgICAgICAgICBjb25zdCBPUF9GVU5DIEZPTyA9IGZvbzsKCiAgICAgICAgICAgCiAgICAgICAgICAgTm93LCB5b3UgY2FuIGRvIG9uZSBvZiB0d28gdGhpbmdzOgoKICAgICAgICAgICAgICAgJWNvbnN0YW50IGludCBmb28oaW50LGludCk7CgogICAgICAgICAgIFRoaXMgY3JlYXRlcyBhIGNvbnN0YW50ICdmb28nIG9mIHR5cGUgaW50ICgqKShpbnQsaW50KS4KICAgICAgICAgICBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGRvIHRoaXM6CgogICAgICAgICAgICAgICAlY2FsbGJhY2soIiVzIik7CiAgICAgICAgICAgICAgIGludCBmb28oaW50LGludCk7CiAgICAgICAgICAgICAgIGludCBiYXIoaW50LGludCk7CiAgICAgICAgICAgICAgICVub2NhbGxiYWNrOwoKICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSBmdW5jdGlvbnMgYXJlIGluc3RhbGxlZCBhcyBjb25zdGFudHMgd2hlcmUKICAgICAgICAgICB0aGUgbmFtZSBpcyBkZWZpbmVkIGJ5IHRoZSBmb3JtYXQgc3RyaW5nIGdpdmVuIHRvICVjYWxsYmFjaygpLgogICAgICAgICAgIElmIHRoZSBuYW1lcyBnZW5lcmF0ZWQgYnkgdGhlIGZvcm1hdCBzdHJpbmcgZGlmZmVyIGZyb20gdGhlCiAgICAgICAgICAgYWN0dWFsIGZ1bmN0aW9uIG5hbWUsIGJvdGggYSBmdW5jdGlvbiB3cmFwcGVyIGFuZCBhIGNhbGxiYWNrIAogICAgICAgICAgIGNvbnN0YW50IGFyZSBjcmVhdGVkLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAlY2FsbGJhY2soIiUodXBwZXIpcyIpOwogICAgICAgICAgICAgICBpbnQgZm9vKGludCxpbnQpOwogICAgICAgICAgICAgICBpbnQgYmFyKGludCxpbnQpOwogICAgICAgICAgICAgICAlbm9jYWxsYmFjazsKICAgICAgICAgICAKICAgICAgICAgICBDcmVhdGVzIHR3byB3cmFwcGVyIGZ1bmN0aW9ucyAnZm9vJywgJ2JhcicgYW5kIGFkZGl0aW9uYWxseQogICAgICAgICAgIGNyZWF0ZXMgdHdvIGNhbGxiYWNrIGNvbnN0YW50cyAnRk9PJywgJ0JBUicuCgogICAgICAgICAgIE5vdGU6IFNXSUcgc3RpbGwgZG9lcyBub3QgcHJvdmlkZSBhdXRvbWF0aWMgc3VwcG9ydCBmb3IgCiAgICAgICAgICAgd3JpdGluZyBjYWxsYmFjayBmdW5jdGlvbnMgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzA2LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgICogc3RydWN0IG5lc3RpbmcgZml4ZXMgYXMgcGVyIFNGIGJ1ZyAjNDQ3NDg4LgoKOC8wMy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgVGhlICVuYW1lIGRpcmVjdGl2ZSBub3cgYXBwbGllcyB0byBjb25zdGFudHMgY3JlYXRlZCB3aXRoCiAgICAgICAgICAgI2RlZmluZSBhbmQgJWNvbnN0YW50LiAgSG93ZXZlciwgbW9zdCBsYW5ndWFnZSBtb2R1bGVzCiAgICAgICAgICAgd2VyZSBuZXZlciB3cml0dGVuIHRvIHN1cHBvcnQgdGhpcyBhbmQgd2lsbCBoYXZlIHRvIGJlCiAgICAgICAgICAgbW9kaWZpZWQgdG8gbWFrZSBpdCB3b3JrLiAgVGNsLCBQeXRob24sIGFuZCBQZXJsIG1vZHVsZXMKICAgICAgICAgICBhcmUgd29ya2luZyBub3cuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8wMy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTWFzc2l2ZSBjaGFuZ2VzIGFuZCBzaW1wbGlmaWNhdGlvbiBvZiBDIGRlY2xhcmF0aW9uIHBhcnNpbmcuCiAgICAgICAgICAgQWx0aG91Z2ggU1dJRyBpcyBzdGlsbCBub3QgYSBmdWxsIEMgcGFyc2VyLCBpdHMgYWJpbGl0eQogICAgICAgICAgIHRvIGhhbmRsZSBjb21wbGV4IGRhdGF0eXBlcyBpbmNsdWRpbmcgcG9pbnRlcnMgdG8gZnVuY3Rpb25zCiAgICAgICAgICAgYW5kIHBvaW50ZXJzIHRvIGFycmF5cyBoYXMgYmVlbiB2YXN0bHkgaW1wcm92ZWQuICAKCjgvMDMvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgKiBEaXN0cmlidXRpb24gZml4ZXM6IGF1dG9jb25mIG5vIGxvbmdlciBuZWVkZWQgdG8gaW5zdGFsbCBTV0lHLgoKOC8wMi8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgUmVtb3ZlZCB0d28gdW5kb2N1bWVudGVkIHBhcnNpbmcgZmVhdHVyZXMuICBTV0lHIG5vIGxvbmdlcgogICAgICAgICAgIHN1cHBvcnRzIG91dC1vZi1jbGFzcyBzdGF0aWMgZnVuY3Rpb24gb3IgdmFyaWFibGUKICAgICAgICAgICBkZWNsYXJhdGlvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBzdGF0aWMgaW50IEZvbzo6YmFyOwoKICAgICAgICAgICBUaGlzIGZlYXR1cmUgbWF5IHJldHVybiBpZiB0aGVyZSBpcyBzdWZmaWNpZW50IGRlbWFuZC4gCiAgICAgICAgICAgSG93ZXZlciwgc2luY2UgU1dJRyBpcyBtb3N0IG9mdGVuIHVzZWQgd2l0aCBoZWFkZXIgZmlsZXMsCiAgICAgICAgICAgaXQgaXMgbW9yZSBsaWtlbHkgZm9yIHRoZXNlIGRlZmluaXRpb25zIHRvIGJlIGluY2x1ZGVkCiAgICAgICAgICAgaW4gdGhlIGNsYXNzIGRlZmluaXRpb24uCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo4LzAyLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBDbGVhbnVwIG9mIHRoZSBHSUZQbG90IGV4YW1wbGVzLiBVcGdyYWRlZCBKYXZhIEdJRlBsb3QgZXhhbXBsZS4KCjgvMDEvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIFtKYXZhXSBFZmZpY2llbmN5IGNoYW5nZXM6IF9jUHRyIHVzZWQgd2hlcmUgcG9zc2libGUgcmF0aGVyIHRoYW4KCSAgICAgZ2V0Q1B0cigpLiBCdWcgZml4ZXMgZm9yIGluaGVyaXRhbmNlIC0gZGVyaXZlZCBjbGFzcyBzb21ldGltZXMKCSAgICAgZGlkbid0IGRlbGV0ZSB0aGUgYyBtZW1vcnkgd2hlbiBfZGVsZXRlKCkgd2FzIGNhbGxlZC4KCSAgICogW0phdmFdIEFic3RyYWN0IGMrKyBjbGFzc2VzIGFyZSB3cmFwcGVkIHdpdGggYSBqYXZhIGFic3RyYWN0IHNoYWRvdwoJICAgICBjbGFzcy4gQWxzbyBhIHB1cmUgdmlydHVhbCBmdW5jdGlvbiBpcyBtYXBwZWQgd2l0aCBhbiBhYnN0cmFjdCBtZXRob2QuCgkgICAqIFRoZSBkZWZhdWx0IG91dHB1dCBmaWxlIGhhcyBhbHdheXMgYmVlbiA8bW9kdWxlPl93cmFwLmMuIEl0IGlzIG5vdwoJICAgICA8bW9kdWxlPl93cmFwLmN4eCBpZiB0aGUgLWMrKyBjb21tYW5kbGluZSBvcHRpb24gaXMgcGFzc2VkIHRvIHN3aWcuCgkgICAgIFRoaXMgaGFzIGJlZW4gZG9uZSBhcyBvdGhlcndpc2UgYysrIGNvZGUgd291bGQgYXBwZWFyIGluIGEgYyBmaWxlLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKiAKCjcvMzEvMjAwMTogYmVhemxleQogICAgICAgICAgIE1vZGlmaWVkIHRoZSAlY29uc3RhbnQgZGlyZWN0aXZlIHRvIGJlIG1vcmUgQy1saWtlIGluIHN5bnRheC4KICAgICAgICAgICBUaGUgc3ludGF4IGlzIG5vdzoKCiAgICAgICAgICAgICAgICAlY29uc3RhbnQgTkFNRSA9IFZBTFVFOwogICAgICAgICAgICAgICAgJWNvbnN0YW50IFRZUEUgTkFNRSA9IFZBTFVFOwogCiAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJWNvbnN0YW50IEZvbyAqQmFyID0gJlNwYW07CgogICAgICAgICAgIEEgbW9yZSBzdWJ0bGUgY2FzZSBpcyBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgJWNvbnN0YW50IGludCAoKkZPTykoaW50LGludCkgPSBibGFoOwoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiogIE1vZHVsZXMgdGhhdCB3ZXJlIHVzaW5nCiAgICAgICAgICAgdGhlICVjb25zdGFudCBkaXJlY3RpdmUgZGlyZWN0bHkgd2lsbCBuZWVkIHRvIGJlIG1vZGlmaWVkLgogICAgICAKNy8zMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgUmVtb3ZlZCBvYnNjdXJlIGFuZCB1bmRvY3VtZW50ZWQgZm9ybSBvZiB0aGUgJWlubGluZSBkaXJlY3RpdmU6CgogICAgICAgICAgICAgICAlaW5saW5lIGludCBibGFoKGludCBhLCBpbnQgYikgewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiogCiAgICAgICAgICAgKG5vdGU6IHRoaXMgZmVhdHVyZSB3YXMgbmV2ZXIgZG9jdW1lbnRlZCBhbmQgaXMgd2l0aGRyYXduKQoKNy8zMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgUmVtb3ZlZCBzdXBwb3J0IGZvciBmdW5jdGlvbnMgd2l0aCBubyBleHBsaWNpdGx5IGRlY2xhcmVkCiAgICAgICAgICAgcmV0dXJuIHR5cGUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgIGZvbyhpbnQpOwoKICAgICAgICAgICBJbiBDLCBzdWNoIGZ1bmN0aW9ucyB3ZXJlIGltcGxpY2l0bHkgYXNzdW1lZCB0byByZXR1cm4gYW4gJ2ludCcuCiAgICAgICAgICAgSW4gQysrLCB0aGlzIGlzIGlsbGVnYWwuICBFaXRoZXIgd2F5LCBpdCdzIGNvbnNpZGVyZWQgYmFkCiAgICAgICAgICAgc3R5bGUuICBSZW1vdmluZyBzdXBwb3J0IGZvciB0aGlzIGluIFNXSUcgd2lsbCBzaW1wbGlmeQogICAgICAgICAgIGNlcnRhaW4gaXNzdWVzIGluIHBhcnNpbmcuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzMwLzIwMDE6IG1rb2VwcGUKCSAgICogUGFydGlhbCBtZXJnZSBmcm9tIHRoZSBDVlMgdHJ1bmsuICBUaGUgU291cmNlL0RPSCBkaXJlY3RvcnkKCSAgICAgYW5kIG1vc3Qgb2YgdGhlIFNvdXJjZS9Td2lnIGRpcmVjdG9yeSBpcyB1cC10by1kYXRlIG5vdy4KCSAgICogW0d1aWxlXSAlc2NoZW1lIGlzIG5vdyBhIG1hY3JvIGZvciAlaW5zZXJ0KCJzY2hlbWUiKS4gIAoJICAgICBOZXcgc3ludGF4OiAgJXNjaGVtZSAiRklMRU5BTUUiOyAKCSAgICAgTmV3IHN5bnRheDogICVzY2hlbWUgJXsgU0NIRU1FLUNPREUgJX0KCSAgICAgTmV3IG1hY3JvcyAlbXVsdGlwbGVfdmFsdWVzLCAldmFsdWVzX2FzX2xpc3QsCgkgICAgICV2YWx1ZXNfYXNfdmVjdG9yLiAKCjcvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgICVyZWFkb25seSBhbmQgJXJlYWR3cml0ZSBoYXZlIGJlZW4gdHVybmVkIGludG8gU1dJRyBwcmFnbWFzLgogICAgICAgICAgICVwcmFnbWEoc3dpZykgcmVhZG9ubHkgYW5kICVwcmFnbWEoc3dpZykgcmVhZHdyaXRlLiAgTWFjcm9zCiAgICAgICAgICAgYXJlIHVzZWQgdG8gcHJvdmlkZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KCjcvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIE1pbm9yIGNoYW5nZXMgdG8gJXByYWdtYSBkaXJlY3RpdmUuICAlcHJhZ21hIG11c3QgYWx3YXlzCiAgICAgICAgICAgYmUgZGlyZWN0ZWQgdG8gYSBzcGVjaWZpYyBsYW5ndWFnZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlcHJhZ21hKHN3aWcpIG1ha2VfZGVmYXVsdDsKICAgICAgICAgICAgICAlcHJhZ21hKHBlcmw1KSBpbmNsdWRlID0gImJsYWguaSI7CgogICAgICAgICAgIEFsc28gZXh0ZW5kZWQgdGhlIHByYWdtYSBkaXJlY3RpdmUgdG8gYWxsb3cgY29kZSBibG9ja3MKIAogICAgICAgICAgICAgICVwcmFnbWEoZm9vKSBjb2RlID0gJXsKICAgICAgICAgICAgICAgICAgLi4uIHNvbWUgY29kZSAuLi4KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIENoYW5nZSB0byB0aGUgd2F5ICdjb25zdCcgdmFyaWFibGVzIGFyZSB3cmFwcGVkLiAgSW4gCiAgICAgICAgICAgcHJldmlvdXMgdmVyc2lvbnMgb2YgU1dJRywgYSAnY29uc3QnIHZhcmlhYmxlIHdhcwogICAgICAgICAgIHdyYXBwZWQgYXMgYSBjb25zdGFudC4gICBOb3csICdjb25zdCcgdmFyaWFibGVzIGFyZQogICAgICAgICAgIHdyYXBwZWQgYXMgcmVhZC1vbmx5IHZhcmlhYmxlcy4gIFRoZXJlIGFyZSBzZXZlcmFsCiAgICAgICAgICAgcmVhc29ucyBmb3IgbWFraW5nIHRoaXMgY2hhbmdlLCBtb3N0bHkgcGVydGFpbmluZyB0bwogICAgICAgICAgIHN1YnRsZSBkZXRhaWxzIG9mIGhvdyAnY29uc3QnIGFjdHVhbGx5IHdvcmtzLiAKCiAgICAgICAgICAgVGhpcyB3aWxsIHByb2JhYmx5IGJyZWFrIG9sZCBpbnRlcmZhY2VzIHRoYXQgdXNlZCAnY29uc3QnCiAgICAgICAgICAgdG8gY3JlYXRlIGNvbnN0YW50cy4gICBBcyBhIHJlcGxhY2VtZW50LCBjb25zaWRlciB1c2luZyB0aGlzOgoKICAgICAgICAgICBjb25zdCBpbnQgYSA9IDQ7ICAgPT09PiAgICVjb25zdGFudCBpbnQgYSA9IDQ7CiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBSZW9yZ2FuaXphdGlvbiBhbmQgc2ltcGxpZmljYXRpb24gb2YgdHlwZSBwYXJzaW5nLgogICAgICAgICAgIFR5cGVzIHdpdGggJ2NvbnN0JyBzaG91bGQgd29yayBjb3JyZWN0bHkgbm93LgoKNy8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTW9zdCBzd2lnIGRpcmVjdGl2ZXMgcmVsYXRlZCB0byB0aGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0KICAgICAgICAgICBhcmUgbm93IGRlcHJlY2F0ZWQuCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBSZW1vdmVkIHN1cHBvcnQgZm9yIE9iamVjdGl2ZS1DIGluIG9yZGVyIHRvIHNpbXBsaWZ5CiAgICAgICAgICAgcGFyc2VyIHJlY29uc3RydWN0aW9uLiAgV2lsbCByZXR1cm4gaWYgdGhlcmUgaXMgc3VmZmljaWVudAogICAgICAgICAgIGRlbWFuZC4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIENvZGUgaW5jbHVzaW9uIGhhcyBiZWVuIG1vZGlmaWVkIGluIHRoZSBwYXJzZXIuICBBIGNvbW1vbgogICAgICAgICAgIGRpcmVjdGl2ZSAlaW5zZXJ0IGlzIG5vdyB1c2VkIGZvciBldmVyeXRoaW5nLiAgVGhpcwogICAgICAgICAgIGluc2VydHMgYSBmaWxlIGludG8gdGhlIG91dHB1dDoKCiAgICAgICAgICAgICAgICVpbnNlcnQoaGVhZGVyKSAiZm9vLnN3ZyIKCiAgICAgICAgICAgVGhpcyBpbnNlcnRzIHNvbWUgaW5saW5lIGNvZGUgaW50byB0aGUgb3V0cHV0CgogICAgICAgICAgICAgICAlaW5zZXJ0KGhlYWRlcikgJXsKICAgICAgICAgICAgICAgICAgIC4uLiBzb21lIGNvZGUgLi4uIAogICAgICAgICAgICAgICAlfQoKICAgICAgICAgICBUaGVyZSBhcmUgZml2ZSBwcmVkZWZpbmVkIHRhcmdldHMgZm9yIHRoZSBpbnNlcnQgZGlyZWN0aXZlOgoKICAgICAgICAgICAgICAgImhlYWRlciIgICAgLSBIZWFkZXIgc2VjdGlvbiBvZiB3cmFwcGVyIGZpbGUKICAgICAgICAgICAgICAgInJ1bnRpbWUiICAgLSBSdW50aW1lIHNlY3Rpb24gb2Ygd3JhcHBlciBmaWxlCiAgICAgICAgICAgICAgICJ3cmFwcGVyIiAgIC0gV3JhcHBlciBzZWN0aW9uCiAgICAgICAgICAgICAgICJpbml0IiAgICAgIC0gSW5pdGlhbGl6YXRpb24gZnVuY3Rpb24KICAgICAgICAgICAgICAgIm51bGwiICAgICAgLSBOb3RoaW5nLiBEaXNjYXJkLgoKICAgICAgICAgICBUaGUgZm9sbG93aW5nIGRpcmVjdGl2ZXMgYXJlIHN0aWxsIHN1cHBvcnRlZCwgYnV0IGFyZQogICAgICAgICAgIG5vdyBkZWZpbmVkIGluIHRlcm1zIG9mIG1hY3JvczoKCiAgICAgICAgICAgICAgICV7IC4uLiAlfSAgICAgICAgICAgLT4gJWluc2VydChoZWFkZXIpICAleyAuLi4gJX0KICAgICAgICAgICAgICAgJWluaXQgJXsgLi4uICV9ICAgICAtPiAlaW5zZXJ0KGluaXQpICAgICV7IC4uLiAlfQogICAgICAgICAgICAgICAld3JhcHBlciAleyAuLi4gJX0gIC0+ICVpbnNlcnQod3JhcHBlcikgJXsgLi4uICV9CiAgICAgICAgICAgICAgICVydW50aW1lICV7IC4uLiAlfSAgLT4gJWluc2VydChydW50aW1lKSAleyAuLi4gJX0KCiAgICAgICAgICAgTGFuZ3VhZ2UgbW9kdWxlcyBjYW4gZGVmaW5lIG5ldyBuYW1lZCB0YXJnZXRzIGJ5IHVzaW5nIHRoZQogICAgICAgICAgIEMgQVBJIGZ1bmN0aW9uIFN3aWdfcmVnaXN0ZXJfZmlsZWJ5bmFtZSgpIChzZWUgbWFpbi5jeHgpLgogICAgICAgICAgIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudGVkIHRvIGV4cG9zZSBhIHNoYWRvdyBjbGFzcyBmaWxlLAogICAgICAgICAgIHlvdSBjb3VsZCBkbyB0aGlzOgoKICAgICAgICAgICAgICBTd2lnX3JlZ2lzdGVyX2ZpbGVieW5hbWUoInNoYWRvdyIsIGZfc2hhZG93KTsKCiAgICAgICAgICAgVGhlbiBpbiB0aGUgaW50ZXJmYWNlIGZpbGU6CgogICAgICAgICAgICAgICVpbnNlcnQoc2hhZG93KSAleyAuLi4gJX0KCiAgICAgICAgICAgTm90ZTogdGhpcyBjaGFuZ2Ugc2hvdWxkIG5vdCBhZmZlY3QgYW55IG9sZCBpbnRlcmZhY2VzLCBidXQKICAgICAgICAgICBkb2VzIG9wZW4gdXAgbmV3IHBvc3NpYmlsaXRpZXMgZm9yIGVuaGFuY2VtZW50cy4KCjcvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIFNXSUcgbm93IGFsd2F5cyBpbmNsdWRlcyBhIHN0YW5kYXJkIGxpYnJhcnkgZmlsZSAnc3dpZy5zd2cnLgogICAgICAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIGEgbGFyZ2UgbnVtYmVyIG9mIG1hY3JvIGRlZmluaXRpb25zCiAgICAgICAgICAgdGhhdCBkZWZpbmUgdGhlIGJlaGF2aW9yIG9mIHZhcmlvdXMgU1dJRyBkaXJlY3RpdmVzLgogICAgICAgICAgIFByZXZpb3VzbHksIGFsbCBTV0lHIGRpcmVjdGl2ZXMgd2VyZSBoYW5kbGVkIGFzIHNwZWNpYWwKICAgICAgICAgICBjYXNlcyBpbiB0aGUgcGFyc2VyLiAgVGhpcyBtYWRlIHRoZSBwYXJzZXIgYSBsYXJnZSAKICAgICAgICAgICBibG9hdGVkIG1lc3MuICBOb3csIHRoZSBwYXJzZXIgaXMgc3RyaXBwZWQgZG93biB0byBhIGZldwogICAgICAgICAgIHNpbXBsZSBkaXJlY3RpdmVzIGFuZCBtYWNyb3MgYXJlIHVzZWQgdG8gaGFuZGxlIGV2ZXJ5dGhpbmcgZWxzZS4KCjcvMjYvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIEZpeGVzIGZvciBTb3VyY2Vmb3JnZSBidWcgIzQ0NDc0OCAtIG5ldyB0ZXN0Y2FzZSBjcHBfc3RhdGljOgoJICAgICBbVENMXSBDbGFzcyB3aXRoIGp1c3Qgc3RhdGljIG1lbWJlciB2YXJpYWJsZS9mdW5jdGlvbiBmaXgKCSAgICAgW0phdmFdIEZpeGVkIHN0YXRpYyB2YXJpYWJsZXMgc3VwcG9ydAoJICAgICBbUnVieV0gU3RhdGljIHZhcmlhYmxlcyB3b3JrYXJvdW5kIHJlbW92ZWQKCjcvMjcvMjAwMTogbWtvZXBwZQoJICAgKiBzdHlwZS5jIChTd2lnVHlwZV9kZWZhdWx0KTogU3RyaXAgcXVhbGlmaWVycyBmaXJzdC4gVGhlCgkgICAgIGRlZmF1bHQgdHlwZSBvZiAiaW50ICogY29uc3QiIGlzIG5vdyAiU1dJR1BPSU5URVIgKiIuCgkgICAqIG1haW4uY3h4OiBEZWZpbmUgIl9fY3BsdXNwbHVzIiBpbiBTV0lHJ3MgcHJlcHJvY2Vzc29yIGlmCgkgICAgIGluIEMrKyBtb2RlLgoJICAgKiBbR3VpbGVdOiBBZGRlZCBzb21lIHN1cHBvcnQgZm9yIGFycmF5cyBhbmQgQysrCgkgICAgIHJlZmVyZW5jZXMsIGZpeGluZyB0aGUgImNvbnN0YW50X3BvaW50ZXJzIiB0ZXN0IGNhc2UuCgkgICAqIE1vdmVkIG1vc3QgdGVzdHMgZnJvbSB0aGUgb2xkIEd1aWxlLXNwZWNpZmljIHRlc3Qtc3VpdGUKCSAgICAgdG8gdGhlIG5ldyB0ZXN0LXN1aXRlLiAgQWxzbyBtb3ZlZCBwZXJsNS9wb2ludGVyLWN4eAoJICAgICBleGFtcGxlIHRoZXJlLgoKNy8yNi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogVGVzdC1zdWl0ZSBhZGRlZC4KCSAgICogSW5pdGlhbCB0ZXN0Y2FzZXM6IGNvbnN0YW50X3BvaW50ZXJzIGNwcF9lbnVtIGRlZmluZXMKCSAgICAgc2l6ZW9mX3BvaW50ZXJzIHVuaW9ucyB2aXJ0dWFsX2Rlc3RydWN0b3IKCSAgICogTWFrZSBjbGVhbiBpbXByb3ZlbWVudHMuCgo3LzI0LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBbSmF2YV0gVW5kZXJzY29yZXMgaW4gdGhlIHBhY2thZ2UgbmFtZSBhbmQvb3IgbW9kdWxlIG5hbWUKCSAgIG5vIGxvbmdlciBnaXZlIGxpbmtpbmcgcHJvYmxlbXMuCgo3LzE3LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBNb3JlIHBhcnNlciBidWcgZml4ZXMgZm9yIGNvbnN0YW50IHBvaW50ZXJzCgo3LzE5LzIwMDE6IG1rb2VwcGUKCSAgICogW0d1aWxlXSBBZXN0aGV0aWMgaW1wcm92ZW1lbnQgaW4gdmFyaWFibGUgd3JhcHBlcnMuCgo3LzE4LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICAqIEZpeGVkIGNvcmUtZHVtcCBwcm9ibGVtIGluIHBvaW50ZXIgbGlicmFyeSB3aGVuIAogICAgICAgICAgICAgZnJlZWluZyBjaGFyYWN0ZXIgYXJyYXlzLgogICAgICAgICAgICAgU0YgQnVnIFsgIzQxNTgzNyBdIHBvaW50ZXIgbGliIGNvcmUgZHVtcAoKNy8xOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgKiBGaXhlZCBwcm9ibGVtIHdpdGggZGVmYXVsdCBkZXN0cnVjdG9ycyBhbmQgc2hhZG93CiAgICAgICAgICAgICBjbGFzc2VzLiAgU0YgYnVnICMyMjExMjguCgo3LzE4LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICAqIFRvIHByb3ZpZGUgYmV0dGVyIGxpbmUtbnVtYmVyIHRyYWNraW5nIGluIGludGVyZmFjZXMKICAgICAgICAgICAgIHdpdGggbG90cyBvZiBtYWNyb3MsIHNwZWNpYWwgbG9jYXRvciBjb21tZW50cyBhcmUKICAgICAgICAgICAgIG5vdyBnZW5lcmF0ZWQgYnkgdGhlIFNXSUcgcHJlcHJvY2Vzc29yLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIC8qQGZvby5pLDQyLEJMQUhAKi9leHBhbmRlZCBtYWNyby8qQEAqLwoKICAgICAgICAgICAgIFRoZSBmaXJzdCAvKkAuLi5AKi8gc2VxdWVuY2Ugc2V0cyB0aGUgY29udGV4dAogICAgICAgICAgICAgdG8gcG9pbnQgdG8gdGhlIG1hY3JvIGNvZGUuICBUaGUgLypAQCovIGNvbW1lbnQKICAgICAgICAgICAgIHRlcm1pbmF0ZXMgdGhlIGNvbnRleHQuICBUaGUgU1dJRyBwYXJzZXIgc2hvdWxkCiAgICAgICAgICAgICBpZ25vcmUgYWxsIG9mIHRoZSBsb2NhdG9yIGNvbW1lbnRzIGFzIHNob3VsZAogICAgICAgICAgICAgdGhlIEMgY29tcGlsZXIgKHNob3VsZCBzdWNoIGNvbW1lbnRzIGVuZCB1cAogICAgICAgICAgICAgaW4gZ2VuZXJhdGVkIHdyYXBwZXIgY29kZSkuCgo3LzE4LzIwMDE6IG1rb2VwcGUKCSAgICogVGhlIHBhcnNlciBub3cgaGFuZGxlcyBzZXZlcmVseSBjb25zdGlmaWVkIHR5cGVzIGluCgkgICB0eXBlbWFwcy4gIFRoaXMgaW50cm9kdWNlZCBhIG5ldyBzaGlmdC9yZWR1Y2UgY29uZmxpY3QsIGJ1dAoJICAgb25seSB3aXRoIGEgaGV1cmlzdGljIGZ1bmN0aW9uLXBvaW50ZXIgY2F0Y2gtYWxsIHJ1bGUuICAKCSAgICogW0d1aWxlXTogQWRkZWQgdHlwZW1hcHMgZm9yIHNldmVyZWx5IGNvbnN0aWZpZWQgdHlwZXMuIAoJICAgKiBGaXhlZCB0aGUgInRlbXBsYXRlLXdoaXRlc3BhY2UiIHByb2JsZW0gYnkgY2Fub25pY2FsaXppbmcKCSAgICAgd2hpdGVzcGFjZSwgZXNwZWNpYWxseSBhcm91bmQgYW5nbGUgYnJhY2tldHMgYW5kIGNvbW1hcy4gCgo3LzE3LzIwMDE6IG1rb2VwcGUKCSAgICogW0d1aWxlXTogQSBTY2hlbWUgZmlsZSBpcyBlbWl0dGVkIGlmIHRoZSAtc2Ntc3R1YiBGSUxFLlNDTQoJICAgY29tbWFuZC1saW5lIG9wdGlvbiBpcyB1c2VkLiAgVGhlICVzY2hlbWUgZGlyZWN0aXZlCgkgICAoaW1wbGVtZW50ZWQgYXMgYSBtYWNybyBmb3IgYSBwcmFnbWEpIGFsbG93cyB0byBpbnNlcnQKCSAgIGFyYml0cmFyeSBjb2RlIGhlcmUuICBJbiAic2ltcGxlIiBhbmQgInBhc3NpdmUiIGxpbmthZ2UsCgkgICB0aGUgZmlsZSBnZXRzIGZpbGxlZCB3aXRoIGRlZmluZS1tb2R1bGUgYW5kIGV4cG9ydAoJICAgZGVjbGFyYXRpb25zLgoKNy8xNy8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogUGFyc2VyIGJ1ZyBmaXggdG8gc3VwcG9ydCBjb25zdGFudCBwb2ludGVycywgZWcgaW50KiBjb25zdCBwdHIuCgkgICBGaXhlZCBldmVyeXdoZXJlIC0gdmFyaWFibGVzLCBwYXJhbWV0ZXJzLCByZXR1cm4gdHlwZXMgZXRjLiBOb3RlIHRoYXQKCSAgIHdoZW4gd3JhcHBpbmcgYSBjb25zdGFudCBwb2ludGVyIHZhcmlhYmxlIG9ubHkgdGhlIGdldHRlciBpcyBnZW5lcmF0ZWQuCgo3LzE3LzIwMDE6IG1rb2VwcGUKCSAgICogRml4ZWQgU0YgYnVnICM0NDE0NzAgKCNkZWZpbmUgWCAiLy8iIHdvdWxkIG5vdCBiZSBwYXJzZWQsCgkgICAgIHNlZSB0ZXN0LXN1aXRlIGVudHJ5ICJwcmVwcm9jLTEiKSwgcmVwb3J0ZWQgYnkgVC4gVy4gQnVydG9uCgkgICAgIDx0d2J1cnRvbkB1c2Vycy5zZi5uZXQ+LgoJICAgKiBDaGFuZ2VkIHRoZSB0eXBlIG9mIGNoYXJhY3RlciBjb25zdGFudHMgdG8gImNoYXIiLCByYXRoZXIKCSAgICAgdGhhbiAiY2hhciAqIi4gIENoYW5nZWQgdGhlIGluZGl2aWR1YWwgbGFuZ3VhZ2UgbW9kdWxlcwoJICAgICB0byBrZWVwIHRoZSBvbGQgYmVoYXZpb3VyLCBleGNlcHQgZm9yIHRoZSBHdWlsZSBtb2R1bGUsCgkgICAgIHdoZXJlIGl0IGlzIGRlc2lyZWQgdG8gbWFrZSB0aGVtIFNjaGVtZSBjaGFyYWN0ZXJzLiAgVGhpcwoJICAgICBmaXhlcyBTRiBidWcgIzIzMTQwOSwgdGVzdC1zdWl0ZSBlbnRyeSAiY2hhci1jb25zdGFudCIuCgkgICAqIEFwcGxpZWQgcGF0Y2ggZm9yIERPSC9Eb2gvbWVtb3J5LmMgYnkgTGVzIFNjaGFmZmVyCgkgICAgIDxzY2hhZmZlckBvcHRvbmxpbmUubmV0PiAoYXZvaWQgcmVxdWlyZWQgc2lkZSBlZmZlY3RzIGluCgkgICAgIGFzc2VydCkuIAoKNy8xNy8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogQnVnIGZpeCBpbiBwYXJzZXIgZm9yIHZpcnR1YWwgZGVzdHJ1Y3RvciB3aXRoIHZvaWQgYXMgcGFyYW1ldGVyCgkgICAqIEJ1ZyBmaXggaW4gcGFyc2VyICNkZWZpbmVzIGVtYmVkZGVkIHdpdGhpbiBjbGFzc2VzL3N0cnVjdHMvdW5pb25zCgkgICBDb25zZXF1ZW50bHkgJWNvbnN0YW50IGNhbiBub3cgYWxzbyBiZSBwbGFjZWQgd2l0aGluIGEgc3RydWN0L2NsYXNzL3VuaW9uLgoJICAgKiBCdWcgZml4IGluIHBhcnNlciB0byBhbGxvdyBzaXplb2YoKklfYW1fYV9wb2ludGVyKSB3aXRoaW4gYSAjZGVmaW5lCgo3LzE2LzIwMDE6IG1rb2VwcGUKCSAgICogQWRkZWQgY2hhbmdlcyBmb3IgdGhlIE1hY2ludG9zaCBjb250cmlidXRlZCBieSBMdWlnaQoJICAgQmFsbGFiaW8gPGJhbGxhYmlvQG1hYy5jb20+LiAKCSAgICogU29tZSAiY29uc3QiIGZpeGVzIGluIHRoZSBjb2RlLgoJICAgKiBbR3VpbGVdOiBNYWRlIHRoZSBjb25zdGFudC13cmFwcGVyIGZ1bmN0aW9ucyBtdWNoIHNob3J0ZXIuCgo3LzEzLzIwMDE6IG1rb2VwcGUKCSAgICogW0d1aWxlXTogU29tZSAiY29uc3QiIGZpeGVzIGZvciBHdWlsZSB2ZXJzaW9uIDEuMy40LgoJICAgKiBIYW5kbGUgYW5vbnltb3VzIGFyZ3VtZW50cyB3aXRoIGRlZmF1bHQgdmFsdWVzIGFuZCBzdGF0aWMKCSAgICAgYXJyYXkgbWVtYmVycyBvZiBjbGFzc2VzLiAgQm90aCBidWdzIHJlcG9ydGVkIGJ5IEFubmFsaXNhIFRlcnJhY2luYQoJICAgICA8YW5uYWxpc2EudGVycmFjaW5hQGRhdGFtYXQuaXQ+OyBzZWUgdGhlIGZpbGVzCgkgICAgIEV4YW1wbGVzL2d1aWxlL3Rlc3Qtc3VpdGUvc3RhdGljLWFycmF5LW1lbWJlci5pIGFuZAoJICAgICBhbm9ueW1vdXMtYXJnLmkuCgpWZXJzaW9uIDEuMy42ICAoSnVseSA5LCAyMDAxKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKNy8wOS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogR0lGUGxvdCBleGFtcGxlczogRk9SRUdST1VORCBhbmQgQkFDS0dST1VORCBkZWZpbml0aW9uIG1pc3NpbmcgCgkgICBhZnRlciBUUkFOU1BBUkVOVCAjZGVmaW5lIGZpeCBpbiBHSUZQbG90Cgo3LzAzLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCB1cCB0aGUgdmVyc2lvbiBudW1iZXJzIHNvIHRoYXQgdGhlIHJlbGVhc2UgaXMga25vd24KICAgICAgICAgICBhcyAxLjMuNi4gIEFsbCBmdXR1cmUgcmVsZWFzZXMgc2hvdWxkIGhhdmUgYSBzaW1pbGFyCiAgICAgICAgICAgdmVyc2lvbiBmb3JtYXQuCgo3LzAyLzIwMDE6IG1rb2VwcGUKCSAgICogW1B5dGhvbl06IFByZXZlbnQgdGhlIHByb2JsZW0gb2Ygc2VsZi50aGlzb3duIG5vdCBiZWluZwoJICAgZGVmaW5lZCBpZiB0aGUgQysrIGNsYXNzIGNvbnN0cnVjdG9yIHJhaXNlZCBhbiBleGNlcHRpb24uCgkgICBUaGFua3MgdG8gTHVpZ2kgQmFsbGFiaW8gPGJhbGxhYmlvQG1hYy5jb20+LgoKNi8yOS8yMDAxOiBta29lcHBlCgkgICAqIE1vcmUgcG9ydGFiaWxpdHkgZml4ZXM7IGZpeGVkICJnY2MgLVdhbGwiIHdhcm5pbmdzLgoKNi8yOS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogR0lGUGxvdCBleGFtcGxlczogVFJBTlNQQVJFTlQgI2RlZmluZSBtdWx0aXBsZSB0aW1lcyBvbiBTb2xhcmlzIAoJICAgKGNsYXNoZXMgd2l0aCBzdHJlYW0uaCkuCgkgICAqIE11bHRpcGxlIGRlZmluaXRpb24gYnVnIGZpeCBmb3Igc2hhZG93IGNsYXNzZXMuIFRoZSBwZXJsIGFuZCBweXRob24gCgkgICBtb2R1bGVzIGhhZCB3b3JrYXJvdW5kcyB3aGljaCBoYXZlIGJlZW4gcmVwbGFjZWQgd2l0aCBmaXhlcyBpbiAKCSAgIHRoZSBjb3JlLiBNYW55IG9mIHRoZSBMYW5ndWFnZTo6Y3BwX3h4eHggZnVuY3Rpb25zIG5vdyBzZXQgYSAKCSAgIGZsYWcgd2hpY2ggdGhlIGRlcml2ZWQgY2xhc3NlcyBjYW4gYWNjZXNzIHRocm91Z2ggCgkgICBpc19tdWx0aXBsZV9kZWZpbml0aW9uKCkgdG8gc2VlIHdoZXRoZXIgb3Igbm90IGNvZGUgc2hvdWxkIGJlIAoJICAgZ2VuZXJhdGVkLiAgVGhlIGNvZGUgYmVsb3cgd291bGQgaGF2ZSBwcm9kdWNlZCB2YXJ5aW5nIGRlZ3JlZXMgCgkgICBvZiBpbmNvcnJlY3Qgc2hhZG93IGNsYXNzIGNvZGUgZm9yIHRoZSB2YXJpb3VzIG1vZHVsZXM6CgkgICBjbGFzcyBUZXN0Q2xhc3MKCSAgIHsKCSAgIHB1YmxpYzoKCSAgICAgVGVzdENsYXNzKCkge307CgkgICAgIFRlc3RDbGFzcyhpbnQgYSkge307CgkgICAgIH5UZXN0Q2xhc3MoKSB7fTsKCSAgICAgdW5zaWduZWQgbG9uZyB4eXooc2hvcnQgaykge307CgkgICAgIHVuc2lnbmVkIGxvbmcgeHl6KGludCBuKSB7fTsKCSAgICAgc3RhdGljIHZvaWQgc3RhdGljX2Z1bmMoKSB7fTsKCSAgICAgc3RhdGljIHZvaWQgc3RhdGljX2Z1bmMoaW50IGEpIHt9OwoJICAgfTsKCSAgIHZvaWQgZGVsZXRlX1Rlc3RDbGFzcyhpbnQgYSk7Cgo2LzI3LzIwMDE6IG1rb2VwcGUKCSAgICogW1BlcmxdIEFub3RoZXIgY29uc3QtcmVsYXRlZCBwb3J0YWJpbGl0eSBmaXguCgo2LzI2LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBbSmF2YV0gQWRkZWQgaW4gY3BwX3ByYWdtYSgpIHN1cHBvcnQgd2l0aCBhIGhvc3Qgb2YgbmV3IHByYWdtYXMgLSBzZWUgCgkgICBqc3dpZy5odG1sLiBUaGVzZSBhcmUgZGVzaWduZWQgZm9yIGJldHRlciBtaXhpbmcgb2YgSmF2YSBhbmQgYysrLiBJdCAKCSAgIGVuYWJsZXMgdGhlIHVzZXIgdG8gc3BlY2lmeSBwdXJlIEphdmEgY2xhc3NlcyBhcyBiYXNlcyBhbmQvb3IgaW50ZXJmYWNlcyAKCSAgIGZvciB0aGUgd3JhcHBlZCBjL2MrKy4KCSAgICogW0phdmFdIE9sZCBwcmFnbWFzIHJlbmFtZWQuIFdhcm5pbmcgZ2l2ZW4gZm9yIHRoZSBtb21lbnQgaWYgdXNlZC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjYvMjUvMjAwMTogbWtvZXBwZQoJICAgKiBJbmNvcnBvcmF0ZWQgbW9yZSBidWlsZCBjaGFuZ2VzIGNvbnRyaWJ1dGVkIGJ5IFd5c3MgQ2xlbWVucwoJICAgPFdZU0BoZWxibGluZy5jaD4gZm9yIHN3aWcvcnVieSBvbiBjeWd3aW4uCgo2LzIwLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBNYWtlZmlsZSBtb2RzIHNvIHRoYXQgJ21ha2UgY2hlY2snIHVzZXMgdGhlIHN3aWcgb3B0aW9ucyBpbiB0aGUgbWFrZWZpbGVzCgkgICAqIFtKYXZhXSBSZW1vdmVkIEdlbmVyYXRpbmcgd3JhcHBlcnMgbWVzc2FnZQoJICAgKiBbSmF2YV0gTlVMTCBwb2ludGVyIGJ1ZyBmaXgKCSAgICogW0phdmFdIEJ1ZyBmaXggZm9yIEthZmZlIEpWTQoKNi8yMC8yMDAxOiBta29lcHBlCgkgICAqIFNXSUdfVHlwZVF1ZXJ5IGZyb20gY29tbW9uLnN3ZyBub3cgcmV0dXJucyBhCgkgICBzd2lnX3R5cGVfaW5mbyogcmF0aGVyIHRoYW4gYSB2b2lkKi4gIFRoaXMgZml4ZXMgYSBwcm9ibGVtCgkgICB3aGVuIHVzaW5nIHBvaW50ZXIuaSBhbmQgQysrLCBhcyBpbGx1c3RyYXRlZCBieSB0aGUgbmV3CgkgICB0ZXN0LXN1aXRlIGV4YW1wbGUgcGVybDUvcG9pbnRlci1jeHguCgkgICAqIFBvcnRhYmlsaXR5IGZpeGVzIChjb25zdCBjaGFyICopLiAKCSAgICogSW5jb3Jwb3JhdGVkIGJ1aWxkIGNoYW5nZXMgY29udHJpYnV0ZWQgYnkgV3lzcyBDbGVtZW5zCgkgICA8V1lTQGhlbGJsaW5nLmNoPiwgd2hpY2ggbWFrZSBzd2lnIHJ1bm5hYmxlIG9uIGN5Z3dpbi4KCjYvMTkvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIFtKYXZhXSBCdWcgZml4IGZvciBTRiBidWcgIzIxMTE0NC4gVGhpcyBmaXggaXMgYSB3b3JrYXJvdW5kIAoJICAgICB1bnRpbCBmaXhlZCBpbiB0aGUgY29yZS4KCjYvMTkvMjAwMTogbWtvZXBwZQoJICAgKiBbR3VpbGVdOiBQb3J0YWJpbGl0eSBmaXhlcyBmb3IgdXNlIHdpdGggdGhlIFN1biBGb3J0ZQoJICAgY29tcGlsZXJzLiAKCSAgICogW1RjbF06IFBvcnRhYmlsaXR5IGZpeCAoY29uc3QgY2hhciAqKS4KCSAgICogW1RjbF06IENvbmZpZ3VyZSBub3cgZmlyc3QgdHJpZXMgdG8gZmluZCBhIHRjbENvbmZpZy5zaAoJICAgZmlsZSBpbiBvcmRlciB0byBmaW5kIHRoZSBUY2wgaW5jbHVkZSBkaXJlY3RvcnksIGxpYnJhcnkKCSAgIGxvY2F0aW9uIGFuZCBsaWJyYXJ5IG5hbWUuCgkgICAqIFtQeXRob25dOiBBZGRlZCBhIGZldyBwb3NzaWJsZSBsaWJyYXJ5IGxvY2F0aW9ucy4KCjYvMTgvMjAwMTogbWtvZXBwZQoJICAgKiBbR3VpbGVdOiBEb24ndCBjYWxsIHNjbV9jX2V4cG9ydCBpZiBub3RoaW5nIGlzIHRvIGJlCgkgICAgIGV4cG9ydGVkLiAgRG9uJ3Qgd2FybiBvbiAlbW9kdWxlIGlmIG1vZHVsZSBoYXMgYmVlbiBzZXQKCSAgICAgYWxyZWFkeSAodGhpcyBmcmVxdWVudGx5IG9jY3VycyB3aGVuICVpbXBvcnQgaXMgdXNlZCkuCgo2LzE2LzIwMDE6IG1rb2VwcGUKCSAgICogW0d1aWxlXTogTmV3ICJwYXNzaXZlIiBsaW5rYWdlLCB3aGljaCBpcyBhcHByb3ByaWF0ZSBmb3IKCSAgICAgbXVsdGktbW9kdWxlIGV4dGVuc2lvbnMgd2l0aG91dCBHdWlsZSBtb2R1bGUgbWFnaWMuCgo2LzE1LzIwMDE6IG1rb2VwcGUKCSAgICogW0d1aWxlXTogRml4ZWQgcHJpbnRpbmcgb2Ygc21vYnMgKHNwYWNlIGFuZCBhbmdsZSB3ZXJlCgkgICAgIG1pc3NpbmcpLiAKCSAgICogUHJvcGVybHkgZ2VuZXJhdGUgdHlwZSBpbmZvcm1hdGlvbiBmb3IgYmFzZSBjbGFzc2VzCgkgICAgIGltcG9ydGVkIHdpdGggdGhlICVpbXBvcnQgZGlyZWN0aXZlLiAgVGhhbmtzIHRvIE1hcmNlbG8KCSAgICAgTWF0dXMgPG1tYXR1c0BhY21zLmFyaXpvbmEuZWR1PiBmb3IgdGhlIHJlcG9ydCBhbmQgdGhlCgkgICAgIHBhdGNoOyB0aGlzIGNsb3NlcyBTRiBidWcgIzIzMTYxOTsgc2VlIGFsc28KCSAgICAgRXhhbXBsZXMvZ3VpbGUvdGVzdC1zdWl0ZS9pbXBvcnQqLiAKCSAgICogW0d1aWxlXTogRml4IGNhc3RpbmcgYmV0d2VlbiBjbGFzcyBhbmQgYmFzZSBjbGFzczsgdGhlCgkgICAgIHJ1bnRpbWUgdHlwZSBzeXN0ZW0gaGFkIGl0IHRoZSB3cm9uZyB3YXkgYXJvdW5kOyBzZWUKCSAgICAgRXhhbXBsZXMvZ3VpbGUvdGVzdC1zdWl0ZS9jYXN0cy5pCgkgICAqIE1ha2UgdHlwZW1hcHMgZm9yIFNXSUdQT0lOVEVSICogd2l0aCBhcmcgbmFtZSB0YWtlCgkgICAgIHByZWNlZGVuY2Ugb3ZlciB0aG9zZSB3aXRob3V0IGFyZyBuYW1lLCB0byBtYXRjaCBub3JtYWwKCSAgICAgdHlwZW1hcCBwcmVjZWRlbmNlIHJ1bGVzLgoJICAgKiBGaXhlZCB0aGUgcmFuZG9tLWxpbmUtbnVtYmVycyBwcm9ibGVtIHJlcG9ydGVkIGFzIFNGIGJ1ZwoJICAgICAjMjE3MzEwOyB0aGFua3MgdG8gTWljaGFlbCBTY2hhcmYgPHNjaGFyZkB1c2Vycy5zZi5uZXQ+LgoJICAgKiBbR3VpbGVdOiBIYW5kbGUgdGhlICVuYW1lIGFuZCAlcmVuYW1lIGRpcmVjdGl2ZXMuCgkgICAqIE5ldyBzeW50YXg6ICVuYW1lIGFuZCAlcmVuYW1lIG5vdyBvcHRpb25hbGx5IHRha2UgZG91YmxlCgkgICAgIHF1b3RlcyBhcm91bmQgdGhlIHNjcmlwdGluZyBuYW1lLiAgVGhpcyBpcyB0byBhbGxvdyBzY3JpcHRpbmcKCSAgICAgbmFtZXMgdGhhdCBhcmVuJ3QgdmFsaWQgQyBpZGVudGlmaWVycy4KCjYvMTQvMjAwMTogYmVhemxleQogICAgICAgICAgIE1hZGUgYSBtaW5vciBjaGFuZ2UgdG8gdGhlIHdheSBmaWxlcyBhcmUgbG9hZGVkIGluCiAgICAgICAgICAgb3JkZXIgdG8gZ2V0IGZpbGUvbGluZSBudW1iZXIgcmVwb3J0aW5nIGNvcnJlY3QgaW4KICAgICAgICAgICB0aGUgcHJlcHJvY2Vzc29yLgoKNi8xNC8yMDAxOiBta29lcHBlCgkgICAqIFRoZSBwYXJzZXIgbm93IHVuZGVyc3RhbmRzIHRoZSAobm9uLXN0YW5kYXJkKSAibG9uZyBsb25nIgoJICAgICB0eXBlcy4gSXQgaXMgdXAgdG8gdGhlIGluZGl2aWR1YWwgbGFuZ3VhZ2UgbW9kdWxlcyB0bwoJICAgICBwcm92aWRlIHR5cGVtYXBzIGlmIG5lZWRlZC4gUmVwb3J0ZWQgYnkgU2FtIFN0ZWluZ29sZCwgU0YKCSAgICAgYnVnICM0MjkxNzYuCgkgICAqIFRoZSBwYXJzZXIgbm93IHVuZGVyc3RhbmRzIGFyZ3VtZW50cyBsaWtlICJjb25zdCBpbnQgKgoJICAgICBjb25zdCBpIi4gVGhpcyBmaXhlcyBTRiBidWcgIzIxNTY0OS4KCSAgICogRml4ZWQgdGhlIEd1aWxlIHRlc3Qtc3VpdGUuCgo2LzEzLzIwMDE6IG1rb2VwcGUKCSAgIFBhcnRpYWwgbWVyZ2UgZnJvbSB0aGUgQ1ZTIHRydW5rIGF0IHRhZwoJICAgIm1rb2VwcGUtbWVyZ2UtMSIuIFRoaXMgY292ZXJzIHRoZSBmb2xsb3dpbmcgY2hhbmdlczoKCnwgMDEvMTYvMDE6IHR0bgp8CSAgIFdyb3RlIHRhYmxlIG9mIGNvbnRlbnRzIGZvciBEb2MvZW5naW5lZXJpbmcuaHRtbC4gIEFkZGVkIHNlY3Rpb24KfAkgICBvbiBDVlMgdGFnZ2luZyBjb252ZW50aW9ucy4gIEFkZGVkIGNvcHlyaWdodCB0byBvdGhlciBkb2NzLgp8IDkvMjUvMDAgOiBiZWF6bGV5CnwgCSAgIE1vZGlmaWVkIHRoZSBwcmVwcm9jZXNzb3Igc28gdGhhdCBtYWNybyBuYW1lcyBjYW4gc3RhcnQgd2l0aCBhICclJy4KfCAJICAgVGhpcyBtYXkgYWxsb3cgbmV3IFNXSUcgImRpcmVjdGl2ZXMiIHRvIGJlIGRlZmluZWQgYXMgbWFjcm9zIGluc3RlYWQKfCAJICAgb2YgaGF2aW5nIHRvIGJlIGhhcmQtY29kZWQgaW50byB0aGUgcGFyc2VyLiAgCnwKfCAqKiogQWxzbyBhIHlldC10by1iZS1kb2N1bWVudGVkIHF1b3RpbmcgbWVjaGFuaXNtIHdpdGggYmFja3F1b3Rlcwp8ICoqKiBoYXMgYmVlbiBpbXBsZW1lbnRlZD8KCjYvMTMvMjAwMTogbWtvZXBwZQoJICogV2hlbiBjb25maWd1cmUgZG9lcyBub3QgZmluZCBhIGxhbmd1YWdlLCBkb24ndCB1c2UgZGVmYXVsdAoJICAgcGF0aHMgbGlrZSAvdXNyL2xvY2FsL2luY2x1ZGU7IHRoaXMgb25seSBjYXVzZXMgYnVpbGQKCSAgIHByb2JsZW1zLgoJICogTmV3IGRpcmVjdG9yeTogRXhhbXBsZXMvR3VpbGUvdGVzdC1zdWl0ZSwgd2hlcmUgYSBmZXcKCSAgIGJ1Z3MgaW4gMS4zYTUgYXJlIGRlbW9uc3RyYXRlZC4gCgkgKiBIYW5kbGUgQysrIG1ldGhvZHMgdGhhdCBoYXZlIGJvdGggYSAiY29uc3QiIGFuZCBhICJ0aHJvdyIKCSAgIGRpcmVjdGl2ZSAoc2VlIEV4YW1wbGVzL0d1aWxlL3Rlc3Qtc3VpdGUvY3BsdXNwbHVzLXRocm93LmkpOyAKCSAgIHRoYW5rcyB0byBTY290dCBCLiBEcnVtbW9uZHMgZm9yIHRoZSByZXBvcnQgYW5kIHRoZSBmaXguIAoJICogSGFuZGxlIEMrKyBwb2ludGVyLXJlZmVyZW5jZSBhcmd1bWVudHMgKGxpa2UgImludCAqJiBhcmciKSAKCSAgIChzZWUgRXhhbXBsZXMvR3VpbGUvdGVzdC1zdWl0ZS9wb2ludGVyLXJlZmVyZW5jZS5pLAoJICAgcmVwb3J0ZWQgYXMgU0YgYnVnICM0MzIyMjQpLgoJICogW1J1YnldIEZpeGVkIHR5cG8gaW4gcnVieWRlYy5zd2c7IHRoYW5rcyB0byBMeWxlIEpvaG5zb24hCgkgKiBEb24ndCBzdG9wIHRlc3Rpbmcgd2hlbiBvbmUgdGVzdCBmYWlscy4KCSAqIFtHdWlsZSwgTXpTY2hlbWVdIERvbid0IHByaW50ICJHZW5lcmF0aW5nIHdyYXBwZXJzLi4uIi4KCjYvMTIvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBWRUNUT1JMRU5JTlBVVCBhbmQgTElTVExFTklOUFVUIG5vdyBoYXZlIHNlcGFyYXRlCgkgICBsaXN0IGxlbmd0aCB2YXJpYWJsZXMuIFRZUEVNQVBfUE9JTlRFUl9JTlBVVF9PVVRQVVQKCSAgIGF0dGFjaGVzIGFyZ3VtZW50IGRvY3VtZW50YXRpb24gaW52b2x2aW5nIFNDTV9UWVBFIHRvIHRoZQoJICAgc3RhbmRhcmQgcG9pbnRlciB0eXBlbWFwcy4gSU5PVVQgaXMgbm93IGFuIGFsaWFzIGZvciBCT1RILgoKNi8xMi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFNvbWUgSmF2YSBkb2N1bWVudGF0aW9uIGFkZGVkLgoJICAgW0phdmFdIEZpeGVkIGJ1Z3MgaW4gaW1wb3J0IHByYWdtYSBhbmQgc2hhZG93IHByYWdtYS4gCgo2LzEyLzIwMDE6IG1rb2VwcGUKCSAgIEZpeCBkZWNsYXJhdGlvbnMgb2YgU1dJR19kZWZpbmVfY2xhc3MKCSAgIChMaWIvcnVieS9ydWJ5ZGVjLnN3ZykgYW5kIFNXSUdfVHlwZVF1ZXJ5CgkgICAoTGliL2NvbW1vbi5zd2cpLiBUaGFua3MgdG8gTHlsZSBKb2huc29uCgkgICA8bGpvaG5zb25AcmVzZ2VuLmNvbT4gZm9yIHRoZSBwYXRjaGVzLgoKNi8xMS8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIFVzZSBsb25nIGluc3RlYWQgb2Ygc2NtX2JpdHNfdDsgdGhpcyBtYWtlcyB0aGUKCSAgIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUgY29tcGF0aWJsZSB3aXRoIEd1aWxlIDEuMy40CgkgICBhZ2Fpbi4gVGhhbmtzIHRvIE1hc2FraSBGdWt1c2hpbWEgZm9yIHBvaW50aW5nIHRoaXMgb3V0LgoKNi8xMS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFRoZSBnZW5lcmljIElOU1RBTEwgZmlsZSBmcm9tIGF1dG9jb25mIGFkZGVkLiBGZXcgY2hhbmdlcyB0byBSRUFETUUgZmlsZS4KCjYvMTEvMjAwMTogbWtvZXBwZQoJICAgRml4ZWQgdHlwbyBpbiBNYWtlZmlsZS5pbjsgdGhhbmtzIHRvIEdyZWcgVHJveGVsCgkgICA8Z2R0QGlyLmJibi5jb20+LiAKCjYvMDgvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICBtYWtlIGNoZWNrIHdvcmtzIGFnYWluLiBFeGFtcGxlcy9HSUZQbG90IGNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkKCSAgIHRvcCBsZXZlbCBhdXRvY29uZiBub3cuCgo2LzA4LzIwMDE6IG1rb2VwcGUKCSAgIEFub3RoZXIgYnVpbGQgY2hhbmdlOiBUaGUgbmV3IHNjcmlwdCBhdXRvZ2VuLnNoIHJ1bnMKCSAgIGF1dG9jb25mIGluIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3Rvcmllcy4gIFRoZSB0b3AtbGV2ZWwKCSAgIGNvbmZpZ3VyZSBhbHNvIGNvbmZpZ3VyZXMgaW4gRXhhbXBsZXMvR0lGUGxvdC4KCjYvMDcvMjAwMTogbWtvZXBwZQoJICAgTWFkZSB0aGUgTWFrZWZpbGUgd29yayB3aXRoIG5vbi1HTlUgbWFrZSBhZ2Fpbi4KCjYvMDcvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICBbSmF2YV0gQ2xhc3Mvc3RydWN0IG1lbWJlcnMgdGhhdCBhcmUgYXJyYXlzIG9mIHBvaW50ZXJzIHRvIGNsYXNzZXMvc3RydWN0cyAtCgkgICBTaGFkb3cgY2xhc3MncyBnZXQvc2V0IGFjY2Vzc29ycyBub3cgdXNlIEphdmEgY2xhc3NlcyBpbnN0ZWFkIG9mIGxvbmdzIChwb2ludGVycykuCgkgICBbSmF2YV0gU2hhZG93IGNsYXNzZXMgd2lsbCBub3cgY2xlYW4gdXAgbWVtb3J5IGlmIGZ1bmN0aW9uIHJldHVybiB0eXBlIAoJICAgaXMgYSBjbGFzcy9zdHJ1Y3QuCgkgICBbSmF2YV0gTmV3IGV4YW1wbGUgY2FsbGVkIHJlZmVyZW5jZSBiYXNlZCBvbiB0aGUgc2FtZSBleGFtcGxlIGZyb20gb3RoZXIgbW9kdWxlcy4KCjYvMDYvMjAwMTogbWtvZXBwZQoJICAgTmV3IGNvbmZpZ3VyZSBvcHRpb24gLS13aXRoLXJlbGVhc2Utc3VmZml4IGFsbG93cyBmb3IKCSAgIGF0dGFjaGluZyBhIHN1ZmZpeCB0byB0aGUgc3dpZyBiaW5hcnkgYW5kIHRoZSBzd2lnIHJ1bnRpbWUKCSAgIGxpYnJhcmllcy4gIE1pbm9yIGNoYW5nZXMgdG8gdGhlIGJ1aWxkIHN5c3RlbS4gICJzd2lnCgkgICAtc3dpZ2xpYiIgd29ya3MgYWdhaW4uICBJZiBpbnZva2VkIHdpdGggdGhlIG5ldyBvcHRpb24KCSAgICItbGRmbGFncyIsIFNXSUcgcHJpbnRzIGEgbGluZSBvZiBsaW5rZXIgZmxhZ3MgbmVlZGVkIHRvCgkgICBsaW5rIHdpdGggdGhlIHJ1bnRpbWUgbGlicmFyeSBvZiB0aGUgc2VsZWN0ZWQgbGFuZ3VhZ2UKCSAgIG1vZHVsZS4gCgo2LzA2LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gZ3N3aWdfbGlzdF9wIGlzIGFuIGludCwgbm90IGEgU0NNLiAgVGhpcyB0eXBvCgkgICBjYXVzZWQgd2FybmluZ3Mgd2hlbiBjb21waWxpbmcgd2l0aCBhIEd1aWxlIGNvbmZpZ3VyZWQgd2l0aAoJICAgc3RyaWN0IEMgdHlwZSBjaGVja2luZy4gSW4gSU5QVVQgYW5kIEJPVEggdHlwZW1hcHMKCSAgIGdlbmVyYXRlZCBieSB0aGUgU0lNUExFX01BUCBtYWNybywgdXNlIHRoZSBTQ01fVE9fQwoJICAgZnVuY3Rpb24gdG8gY29udmVydCBmcm9tIEd1aWxlIHRvIEMgKHJhdGhlciB0aGFuIENfVE9fU0NNKS4KCSAgIFVzZSBzY21faW50cHJpbnQgdG8gcHJpbnQgcG9pbnRlcnMgKHJhdGhlciB0aGFuCgkgICBzcHJpbnRmKS4gQWxsb3cgdXNpbmcgIi1saW5rYWdlIiBpbnN0ZWFkIG9mICItTGlua2FnZSIuIAoKNi8wNS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFtKYXZhXSBNb2RzIGZvciB1c2luZyBpbmhlcml0ZWQgYysrIGNsYXNzZXMgZnJvbSBKYXZhCgkgICBbSmF2YV0gTmV3IGV4YW1wbGUgY2FsbGVkIGNsYXNzIGJhc2VkIG9uIHRoZSBzYW1lIGV4YW1wbGUgZnJvbSBvdGhlciBtb2R1bGVzCgo2LzA1LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgW0phdmFdIGRlc3RydWN0b3IgKF9kZWxldGUoKSkgd2FzIG5vdCBhd2FyZSBvZiAlbmFtZSByZW5hbWluZwoJICAgW0phdmFdIGV4dGVuZHMgYmFzZWNsYXNzIGRpZCBub3Qga25vdyBhYm91dCAlbmFtZSByZW5hbWluZwoJICAgW0phdmFdIGV4dGVuZHMgYmFzZWNsYXNzIGRpZCBleHRlbmQgZXZlbiB3aGVuIHRoZSBiYXNlY2xhc3Mgd2FzIG5vdCBrbm93biB0byBzd2lnCgkgICBbSmF2YV0gc29tZXRpbWVzIGVudW0tZGVjbGFyYXRpb25zIG9jY3VycmVkIGJlZm9yZSB0aGUgSmF2YSBjbGFzcyBkZWNsYXJhdGlvbgoJICAgW0phdmFdIHVucmVsYXRlZCBlbnVtIGluaXRpYWxpc2F0aW9ucyBubyBsb25nZXIgYXBwZWFyIGluIEphdmEgY2xhc3MKCSAgIFtKYXZhXSBpZiBtb2R1bGUgZW5kcyBpbiAnXycgY29ycmVjdCBKTkkgbmFtZXMgYXJlIG5vdyBwcm9kdWNlZAoKNi8wNC8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFtKYXZhXSBTaGFkb3cgY2xhc3MgbW9kcyAtIE1vZGlmaWVkIGNvbnN0cnVjdG9yIHJlcGxhY2VzCgkgICBuZXdJbnN0YW5jZSgpLiBfZGVsZXRlKCkgbm93IHRocmVhZCBzYWZlLiBnZXRDUHRyKCkgcmVwbGFjZXMKCSAgIF9zZWxmLiBfc2VsZkNsYXNzKCkgcmVtb3ZlZCBhcyBub3cgcmVkdW5kYW50LiAKICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCgkgICBbSmF2YV0gTm90IGFsbCBvdXRwdXQgamF2YSBmaWxlcyBoYWQgU1dJRyBiYW5uZXIuIE5ldyBiYW5uZXIuCgoJICAgW0phdmFdIFNoYWRvdyBjbGFzcyBmaW5hbGl6ZXJzIGFyZSBvdXRwdXQgYnkgZGVmYXVsdDogQ29tbWFuZAoJICAgbGluZSBvcHRpb24gLWZpbmFsaXplIGRlcHJlY2F0ZWQgYW5kIHJlcGxhY2VkIHdpdGggLW5vZmluYWxpemUuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgo2LyAxLzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gQ2FzdCBTQ01fQ0FSKCkgdG8gc2NtX2JpdHNfdCBiZWZvcmUgc2hpZnRpbmcgaXQuCgkgICBUaGlzIGlzIHJlcXVpcmVkIGZvciBjb21waWxpbmcgd2l0aCBhIEd1aWxlIGNvbmZpZ3VyZWQgd2l0aAoJICAgc3RyaWN0IEMgdHlwZSBjaGVja2luZy4gIAoKNi8gMS8yMDAxOiBta29lcHBlCgkgICBBZGRlZCBjb25maWd1cmUgb3B0aW9uICItLXdpdGgtc3dpZ2xpYmRpciIuCgo1LzMxLzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gU3VwcG9ydCBtdWx0aXBsZSBwYXJhbGxlbCBsaXN0cyBvciB2ZWN0b3JzIGluCgkgICB0aGUgdHlwZW1hcHMgcHJvdmlkZWQgYnkgbGlzdC12ZWN0b3IuaS4gIE5ldyB0eXBlbWFwcyBmaWxlLAoJICAgcG9pbnRlci1pbi1vdXQuaS4gCgo1LzI1LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgW0phdmFdIEhUTUwgdXBkYXRlIGZvciBleGFtcGxlcy4KCjUvMjgvMjAwMTogbWtvZXBwZQoJICAgTWlub3IgY2hhbmdlcyB0byB0aGUgYnVpbGQgc3lzdGVtLiAgQWRkZWQgc3ViZGlyZWN0b3J5IGZvcgoJICAgRGViaWFuIHBhY2thZ2UgY29udHJvbCBmaWxlcy4KCjUvMjgvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBCdWlsZCBhIHJ1bnRpbWUgbGlicmFyeSwgbGlic3dpZ2d1aWxlLgoKNS8yOC8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIE5ldyB0eXBlbWFwIHN1YnN0aXR1dGlvbiAkKmRlc2NyaXB0b3IuICBVc2UgdGhlIHt9CgkgICBzeW50YXgsIHJhdGhlciB0aGFuIHRoZSAiIiBzeW50YXggZm9yIHRoZSBzdGFuZGFyZAoJICAgdHlwZW1hcHMsIGluIG9yZGVyIHRvIHdvcmsgYXJvdW5kIHN0cmFuZ2UgbWFjcm8tZXhwYW5zaW9uCgkgICBiZWhhdmlvciBvZiB0aGUgU1dJRyBwcmVwcm9jZXNzb3IuICBUaGlzIGludHJvZHVjZXMgc29tZQoJICAgZXh0cmEgYnJhY2VzLgoKNS8yNy8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIEhhbmRsZSBwb2ludGVyIHR5cGVzIHdpdGggdHlwZW1hcHMsIHJhdGhlciB0aGFuCgkgICBoYXJkLWNvZGVkLiBOZXcgdHlwZW1hcCBzdWJzdGl0dXRpb25zICRkZXNjcmlwdG9yLAoJICAgJGJhc2VkZXNjcmlwdG9yOyBzZWUgZG9jdW1lbnRhdGlvbi4gU29tZSBjbGVhbi11cCBpbiB0aGUKCSAgIHZhcmlhYmxlL2NvbnN0YW50cyB3cmFwcGVyIGdlbmVyYXRvciBjb2RlLiAgTmV3IGNvbnZlbmllbmNlCgkgICBtYWNybyBTV0lHX0d1aWxlX011c3RHZXRQdHIsIHdoaWNoIGFsbG93cyBnZXR0aW5nIHBvaW50ZXJzCgkgICBmcm9tIHNtb2JzIGluIGEgZnVuY3Rpb25hbCBzdHlsZS4gIE5ldyB0eXBlbWFwIGZpbGUKCSAgICJsaXN0LXZlY3Rvci5pIiwgcHJvdmlkaW5nIG1hY3JvcyB0aGF0IGRlZmluZSB0eXBlbWFwcyBmb3IKCSAgIGNvbnZlcnRpbmcgYmV0d2VlbiBDIGFycmF5cyBhbmQgU2NoZW1lIGxpc3RzIGFuZCB2ZWN0b3JzLgoKNS8yNS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFtKYXZhXSBTVEwgc3RyaW5nIG1vdmVkIGludG8gaXRzIG93biB0eXBlbWFwIGFzIGl0IGlzIGMrKyBjb2RlIGFuZCAKCSAgIGl0IGJyZWFrIGFueSBjIGNvZGUgdXNpbmcgdGhlIHR5cGVtYXBzLmkgZmlsZS4KCSAgIC0gRml4ZXMgZm9yIHdyYXBwZXJzIGFyb3VuZCBnbG9iYWwgdmFyaWFibGVzIC0gYXBwbGllcyB0byBwcmltaXRpdmUgCgkgICB0eXBlcyBhbmQgdXNlciB0eXBlcyAoY2xhc3Mvc3RydWN0KSBhbmQgcG9pbnRlcnMgdG8gdGhlc2UuCgkgICAtIFN0cnVjdHVyZSBtZW1iZXIgdmFyaWFibGVzIGFuZCBjbGFzcyBwdWJsaWMgbWVtYmVyIHZhcmlhYmxlcyBnZXR0ZXJzIAoJICAgYW5kIHNldHRlcnMgcGFzcyBhIHBvaW50ZXIgdG8gdGhlIG1lbWJlciBhcyB3YXMgaW4gMS4zYTMgYW5kIDEuMSAKCSAgICgxLjNhNSB3YXMgcGFzc2luZyBieSB2YWx1ZSkKCSAgIC0gUGFyYW1ldGVycyB0aGF0IHdlcmUgYXJyYXlzIGFuZCByZXR1cm4gdHlwZXMgd2VyZSBpbmNvcnJlY3RseSAKCSAgIGJlaW5nIHBhc3NlZCB0byBjcmVhdGVfZnVuY3Rpb24oKSBhcyBwb2ludGVycy4KCSAgIC0gRml4IGZvciBhcnJheXMgb2YgZW51bXMuIAoJICAgW0phdmFdIFVwZGF0ZWQgamF2YSBleGFtcGxlcyBhbmQgYWRkZWQgdHdvIG1vcmUuCgkgICBbSmF2YV0gSmF2YSBtb2R1bGUgdXBkYXRlZCBmcm9tIFNXSUcxLjNhMyBpbmNsdWRpbmcgY29kZSBjbGVhbnVwIGV0Yy4KCSAgIFtKYXZhXSBlbnVtIHN1cHBvcnQgYWRkZWQuCgkgICBbSmF2YV0gQXJyYXkgc3VwcG9ydCBpbXBsZW1lbnRlZAoJICAgW0phdmFdIFNoYWRvdyBjbGFzc2VzIGltcHJvdmVkIC0gSmF2YSBvYmplY3RzIHVzZWQgcmF0aGVyIHRoYW4gCgkgICBsb25ncyBob2xkaW5nIHRoZSBjIHBvaW50ZXIgdG8gdGhlIHdyYXBwZWQgc3RydWN0dXJlL2MrK2NsYXNzCgo1LzIyLzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gRml4ZWQgZXh0ZXJuICJDIiBkZWNsYXJhdGlvbnMgaW4gQysrIG1vZGUuIFRoYW5rcwoJICAgdG8gR3JlZyBUcm94ZWwgPGdkdEBpci5iYm4uY29tPi4KCjUvMjEvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBOZXcgbGlua2FnZSAibW9kdWxlIiBmb3IgY3JlYXRpbmcgR3VpbGUgbW9kdWxlcyBmb3IKCSAgIEd1aWxlIHZlcnNpb25zID49IDEuNS4wLiAKCjQvMTgvMjAwMTogbWtvZXBwZQoJICAgW016U2NoZW1lXSBBZGRlZCB0eXBlbWFwcyBmb3IgcGFzc2luZyB0aHJvdWdoIFNjaGVtZV9PYmplY3QKCSAgIHBvaW50ZXJzLiAKCjQvOS8yMDAxIDogbWtvZXBwZSAKCSAgIFtNelNjaGVtZV0gQWRkZWQgdHlwZW1hcHMgZm9yIGBib29sJy4gIEluY2x1c2lvbiBvZiBoZWFkZXJzCgkgICBhbmQgc3VwcG9ydCByb3V0aW5lcyBpcyBub3cgZGF0YS1kcml2ZW4gdmlhIG16c2NoZW1lLmkuCgkgICBIZWFkZXJzIGNvbWUgZnJvbSB0aGUgbmV3IGZpbGUgbXpzY2hlbWRlYy5zd2cuICBEb24ndCBhYm9ydAoJICAgaW1tZWRpYXRlbHkgd2hlbiBhIHR5cGUtaGFuZGxpbmcgZXJyb3IgaXMgcmVwb3J0ZWQuICBXaGVuCgkgICBzZWFyY2hpbmcgZm9yIHR5cGVtYXBzIGZvciBlbnVtcywgZmFsbCBiYWNrIHRvIHVzaW5nIGludCwKCSAgIGxpa2UgdGhlIEd1aWxlIGJhY2tlbmQgZG9lcy4gIFN1cHBvcnQgY2hhciBjb25zdGFudHMuICBFbWl0CgkgICBjb3JyZWN0IHdyYXBwZXIgY29kZSBmb3IgdmFyaWFibGVzLgoKMy8xMi8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIEZpeGVkIHR5cGVtYXBzIGZvciBjaGFyICoqT1VUUFVULCBjaGFyICoqQk9USC4KCjMvMi8yMDAxIDogbWtvZXBwZSAKCSAgIFtHdWlsZV0gRXZlcnkgd3JhcHBlciBmdW5jdGlvbiBub3cgZ2V0cyBhIGJvb2xlYW4gdmFyaWFibGUKCSAgIGdzd2lnX2xpc3RfcCB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciBtdWx0aXBsZSB2YWx1ZXMgYXJlCgkgICBwcmVzZW50LiBUaGUgbWFjcm9zIEdVSUxFX0FQUEVORF9SRVNVTFQsIEdVSUxFX01BWUJFX1ZBTFVFUwoJICAgYW5kIEdVSUxFX01BWUJFX1ZFQ1RPUiB1c2UgdGhpcyB2YXJpYWJsZSwgcmF0aGVyIHRoYW4KCSAgIGNoZWNraW5nIHdoZXRoZXIgdGhlIGN1cnJlbnQgcmV0dXJuIHZhbHVlIGlzIGEgbGlzdC4gVGhpcwoJICAgYWxsb3dzIGZvciB0eXBlbWFwcyByZXR1cm5pbmcgYSBsaXN0IGFzIGEgc2luZ2xlIHZhbHVlIChhCgkgICBsaXN0IHdhcyBlcnJvbmVvdXNseSBjb252ZXJ0ZWQgaW50byBhIHZlY3RvciBvciBhCgkgICBtdWx0aXBsZS12YWx1ZSBvYmplY3QgaW4gdGhpcyBjYXNlKS4KCjMvMS8yMDAxIDogbWtvZXBwZQoJICAgW0d1aWxlXSBBZGRlZCBzdXBwb3J0IGZvciByZXR1cm5pbmcgbXVsdGlwbGUgdmFsdWVzIGFzCgkgICB2ZWN0b3JzLCBvciBwYXNzaW5nIHRoZW0gdG8gYSBtdWxpcGxlLXZhbHVlCgkgICBjb250aW51YXRpb24uIEJ5IGRlZmF1bHQsIG11bHRpcGxlIHZhbHVlcyBzdGlsbCBnZXQKCSAgIHJldHVybmVkIGFzIGEgbGlzdC4KCjMvMS8yMDAxIDogbWtvZXBwZQoJICAgW0d1aWxlXSBBZGRlZCBhICJiZWZvcmVyZXR1cm4iIHByYWdtYS4gVGhlIHZhbHVlIG9mIHRoaXMKCSAgIHByYWdtYSBpcyBpbnNlcnRlZCBqdXN0IGJlZm9yZSBldmVyeSByZXR1cm4gc3RhdGVtZW50LgoKMy8xLzIwMDEgOiBta29lcHBlCgkgICBbR3VpbGVdIEFkZGVkIHN1cHBvcnQgZm9yIEd1aWxlIDEuNC4xIHByb2NlZHVyZQoJICAgZG9jdW1lbnRhdGlvbiBmb3JtYXRzLCBzZWUgaW50ZXJuYWxzLmh0bWwuCgoyLzI2LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gTWFkZSB0aGUgd3JhcHBlciBjb2RlIGNvbXBpbGUgd2l0aCBDKysgaWYgdGhlCgkgICAiLWMrKyIgY29tbWFuZC1saW5lIHN3aXRjaCBpcyBnaXZlbi4gIFRoYW5rcyB0bwoJICAgPG1vbmtleWlxQGRpbmdvYmx1ZS5uZXQuYXU+LiAKCjIvMjYvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBOb3cgdHdvIHR5cGUgdGFibGVzLCBzd2lnX3R5cGVzIGFuZAoJICAgc3dpZ190eXBlc19pbml0aWFsLCBhcmUgdXNlZCwgYXMgYWxsIG90aGVyIFNXSUcgbGFuZ3VhZ2UKCSAgIG1vZHVsZXMgZG8uICBUaGlzIHJlbW92ZXMgdGhlIG5lZWQgZm9yIHRoZSB0cmlja3kKCSAgIGNvbnN0cnVjdGlvbiB1c2VkIGJlZm9yZSB0aGF0IHRoZSBicm9rZW4gUmVkaGF0IDcuMCBnY2MKCSAgIGRvZXNuJ3QgcGFyc2UuIFJlcG9ydGVkIGJ5IDxtb25rZXlpcUBkaW5nb2JsdWUubmV0LmF1Pi4gCgoyLzI2LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gRml4ZWQgdHlwZW1hcHMgZm9yIGNoYXIgKk9VVFBVVCwgY2hhciAqQk9USDsgYSBiYWQKCSAgIGZyZWUoKSB3b3VsZCBiZSBlbWl0dGVkLiAgQWRkZWQgdHlwZW1hcCBmb3IgU0NNLgoKClZlcnNpb24gMS4zIEFscGhhIDUgCj09PT09PT09PT09PT09PT09PT0KCjkvMTkvMDAgOiBiZWF6bGV5CiAgICAgICAgICBbUHl0aG9uXSBQeXRob24gbW9kdWxlIGdlbmVyYXRlcyBtb3JlIGVmZmljaWVudCBjb2RlIGZvcgogICAgICAgICAgY3JlYXRpbmcgdGhlIHJldHVybiB2YWx1ZSBvZiBhIHdyYXBwZXIgZnVuY3Rpb24uIE1vZGlmaWNhdGlvbgogICAgICAgICAgc3VnZ2VzdGVkIGJ5IEpvbiBUcmF2aXMuCgo5LzE5LzAwIDogYmVhemxleQogICAgICAgICAgTGlicmFyeSBmaWxlcyBzcGVjaWZpZWQgd2l0aCB0aGUgLWwgb3B0aW9uIGFyZSBub3cgaW5jbHVkZWQgYXQgdGhlCiAgICAgICAgICBlbmQgb2YgdGhlIGludGVyZmFjZSBmaWxlIChyZXZlcnRpbmcgdG8gdGhlIG9sZCBiZWhhdmlvcikuCgo5LzE5LzAwIDogYmVhemxleQogICAgICAgICAgRml4ZWQgc29tZSBwcm9ibGVtcyB3aXRoIGVudW0gaGFuZGxpbmcuICBlbnVtcyBhcmUgbm93IG1hbmlwdWxhdGVkIGFzCiAgICAgICAgICAnaW50JywgYnV0IGNhc3QgaW50byB0aGUgZW51bSB0eXBlIHdoZW4gdmFsdWVzIGFyZSBwYXNzZWQgdG8gdGhlIAogICAgICAgICAgY29ycmVzcG9uZGluZyBDIGZ1bmN0aW9uLgoKOS8xOS8wMCA6IG1rb2VwcGUKCSAgW0d1aWxlXSBSZW1vdmVkICItd2l0aC1zbW9icyIgY29tbWFuZC1saW5lIG9wdGlvbiwgYXMgdGhpcyBpcyB0aGUKCSAgZGVmYXVsdCBub3cuICBBZGRlZCAiLWVtaXQtc2V0dGVycyIgY29tbWFuZC1saW5lIG9wdGlvbiwKCSAgd2hpY2ggdHVybnMgb24gZ2VuZXJhdGluZyBwcm9jZWR1cmVzLXdpdGgtc2V0dGVyczsgc2VlCgkgIGludGVybmFscy5odG1sLgoKOS8xOC8wMCA6IG1rb2VwcGUKCSAgSW5jb3Jwb3JhdGVkIHBhdGNoICMxMDE0MzAsIGZpeGluZyBidWdzIGluIHRoZSBHdWlsZSBtb2R1bGU6IAoJICAxLiBTb21lIGFyZ3VtZW50cyB3ZXJlIGVycm9uZW91c2x5IHRha2VuIGFzICpvcHRpb25hbCogYXJndW1lbnRzIHdoZW4KCSAgICAgaWdub3JlZCBhcmd1bWVudHMgd2VyZSBwcmVzZW50LiAKCSAgMi4gR3VpbGUgMS4zLjQgd2FzIG5vdCBzdXBwb3J0ZWQgc2luY2UgZnVuY3Rpb25zIGludHJvZHVjZWQgaW4gR3VpbGUKCSAgICAgIDEuNCB3ZXJlIHVzZWQuCSAgCgkgIDMuIEFkZGVkIGhhbmRsaW5nIG9mIGBjb25zdCBjaGFyIConLgoKOS8xNy8wMCA6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBmYWlsZWQgYXNzZXJ0aW9uIGFuZCBsYXJnZSBmaWxlcy4KCjkvMTcvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggdGhlICclJyBjaGFyYWN0ZXIgYXBwZWFyaW5nIGluIGFkZGVkIG1ldGhvZHMKICAgICAgICAgIGFuZCBmdW5jdGlvbiBib2RpZXMuICBQcmVwcm9jZXNzb3IgYnVnLgoKVmVyc2lvbiAxLjMgQWxwaGEgNCAoU2VwdGVtYmVyIDQsIDIwMDApCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKOS8zLzAwICA6IHR0bgogICAgICAgICAgQWRkZWQgaW5zdHJ1Y3Rpb25zIGZvciBtYWludGFpbmVycyBpbiBFeGFtcGxlcy9SRUFETUUgb24gaG93CiAgICAgICAgICB0byBtYWtlIGV4YW1wbGVzIGFsc28gYmUgdXNlZnVsIGluIHRoZSB0ZXN0aW5nIGZyYW1ld29yay4KICAgICAgICAgIEFsc28sICJtYWtlIGNoZWNrIiBub3cgdXNlcyAuL0xpYiBieSB2aWEgZW52IHZhciBgU1dJR19MSUInLgogICAgICAgICAgVGhpcyBpcyBvdmVycmlkYWJsZSBsaWtlIHNvOgogICAgICAgICAgICAgbWFrZSBjaGstc3dpZ2xpYj0vbXkvZXhwZXJpbWVudGFsL3N3aWcvTGliIGNoZWNrCgo5LzMvMDAgIDogYmVhemxleQogICAgICAgICAgQWRkZWQgJHR5cGVtYXAgdmFyaWFibGUgdG8gdHlwZW1hcHMuICBUaGlzIGdldHMgcmVwbGFjZWQgd2l0aAogICAgICAgICAgYSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgdHlwZW1hcCB0aGF0IGlzIGFwcGxpZWQuICBGZWF0dXJlCiAgICAgICAgICByZXF1ZXN0IGZyb20gcnNhbHouCgo5LzMvMDAgIDogYmVhemxleQogICAgICAgICAgRXhwZXJpbWVudGFsIG9wdGltaXphdGlvbiB0byBjb2RlIGdlbmVyYXRpb24gZm9yIHZpcnR1YWwKICAgICAgICAgIG1lbWJlciBmdW5jdGlvbnMuICBJZiB5b3UgaGF2ZSB0d28gY2xhc3NlcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgIGNsYXNzIEEoKSB7CiAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZm9vKCk7CiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICBjbGFzcyBCKCkgOiBwdWJsaWMgQSB7CiAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZm9vKCk7CiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFN3aWcgbm93IHdpbGwgZ2VuZXJhdGUgYSBzaW5nbGUgd3JhcHBlciBmdW5jdGlvbiBmb3IgdGhpcwoKICAgICAgICAgICAgICAgIEFfZm9vKEEgKmEpIHsKICAgICAgICAgICAgICAgICAgICBhLT5mb28oKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBhbmQgdXNlIGl0IGFzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBib3RoIEFfZm9vKCkgYW5kIEJfZm9vKCkuCiAgICAgICAgICBUaGlzIG9wdGltaXphdGlvbiBvbmx5IHRha2VzIHBsYWNlIGlmIGJvdGggbWV0aG9kcyBhcmUgZGVjbGFyZWQKICAgICAgICAgIGFzIHZpcnR1YWwgYW5kIGJvdGggdGFrZSBpZGVudGljYWwgcGFyYW1ldGVycy4KICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgRkVBVFVSRSAqKioKCjkvMy8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBSZXN0b3JlZCB0aGUgIm1lbWJlcmluIiB0eXBlbWFwIGZvciBzZXR0aW5nIHN0cnVjdHVyZSBtZW1iZXJzLgogICAgICAgICAgVW5saWtlIHRoZSBvbGQgdmVyc2lvbiwgdGhlIG5ldyB2ZXJzaW9uIGlzIGV4cGFuZGVkIGlubGluZSBpbiB0aGUKICAgICAgICAgIHdyYXBwZXIgZnVuY3Rpb24gYWxsb3dpbmcgYWNjZXNzIHRvIHNjcmlwdGluZyBsYW5ndWFnZQogICAgICAgICAgaW50ZXJuYWxzIChhIHNvbWV0aW1lcyByZXF1ZXN0ZWQgZmVhdHVyZSkuIFRoZSAibWVtYmVyb3V0IiB0eXBlbWFwCiAgICAgICAgICBpcyBnb25lLiBVc2UgdGhlICJvdXQiIHR5cGVtYXBzIGluc3RlYWQuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjkvMy8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBBdHRyaWJ1dGUgc2V0IG1ldGhvZHMgbm8gbG9uZ2VyIHJldHVybiB0aGUgdmFsdWUgb2YgYSBtZW1iZXIuCiAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICAgIGludCB4OwogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgbm93IGdldHMgc2V0IGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgIHZvaWQgRm9vX3hfc2V0KEZvbyAqZiwgaW50IHgpIHsKICAgICAgICAgICAgICAgICAgICBmLT54ID0geDsKICAgICAgICAgICAgICB9CgogICAgICAgICAgSW4gU1dJRzEuMSBpdCB1c2VkIHRvIGJlIHRoaXM6CgogICAgICAgICAgICAgIGludCBGb29feF9zZXQoRm9vICpmLCBpbnQgeCkgewogICAgICAgICAgICAgICAgICAgcmV0dXJuIChmLT54ID0geCk7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgIFRoaXMgaGFzIGJlZW4gY2hhbmdlZCBkdWUgdG8gdGhlIGNvbXBsZXhpdHkgY3JlYXRlZCBieSB0cnlpbmcKICAgICAgICAgIHRvIGRvIHRoaXMgd2l0aCBtb3JlIGV4b3RpYyBkYXRhdHlwZXMgc3VjaCBhcyBhcnJheXMuICBJdCBhbHNvCiAgICAgICAgICBjb21wbGljYXRlcyBpbmxpbmluZyBhbmQgaGFuZGxpbmcgb2YgdGhlICJtZW1iZXJpbiIgdHlwZW1hcC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOS8yLzAwICA6IGJlYXpsZXkKICAgICAgICAgIFJlbW92ZWQgdGhlIHB0cmNhc3QoKSBhbmQgcHRybWFwKCkgZnVuY3Rpb25zIGZyb20gdGhlCiAgICAgICAgICBwb2ludGVyLmkgbGlicmFyeSBmaWxlLiAgT2xkIGltcGxlbWVudGF0aW9uIGlzIGluY29tcGF0aWJsZQogICAgICAgICAgd2l0aCBuZXcgdHlwZSBzeXN0ZW0uCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjkvMi8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBOZXcgcnVudGltZSBmdW5jdGlvbiBTV0lHX1R5cGVRdWVyeShjb25zdCBjaGFyICpuYW1lKSBhZGRlZC4KICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZXh0cmFjdCB0aGUgdHlwZSBpbmZvIHN0cnVjdHVyZQogICAgICAgICAgdGhhdCBpcyB1c2VkIGZvciB0eXBlLWNoZWNraW5nLiAgSXQgd29ya3Mgd2l0aCBlaXRoZXIgdGhlCiAgICAgICAgICBuaWNlIEMgbmFtZSBvciBtYW5nbGVkIHZlcnNpb24gb2YgYSBkYXRhdHlwZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBzd2lnX3R5cGVfaW5mbyAqdHkgPSBTd2lnX1R5cGVRdWVyeSgiaW50ICoiKTsKICAgICAgICAgICAgICBzd2lnX3R5cGVfaW5mbyAqdHkgPSBTd2lnX1R5cGVRdWVyeSgiX3BfaW50Iik7CgogICAgICAgICAgVGhpcyBpcyBhbiBhZHZhbmNlZCBmZWF0dXJlIHRoYXQgaGFzIGJlZW4gYWRkZWQgdG8gc3VwcG9ydCBzb21lCiAgICAgICAgICBleG90aWMgZXh0ZW5zaW9uIG1vZHVsZXMgdGhhdCBuZWVkIHRvIGRpcmVjdGx5IG1hbmlwdWxhdGUKICAgICAgICAgIHNjcmlwdGluZyBsYW5ndWFnZSBvYmplY3RzLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOS8yLzAwICA6IGJlYXpsZXkKICAgICAgICAgIE5ldyBkaXJlY3RpdmUgJXR5cGVzKCkgYWRkZWQuICBUaGlzIGlzIHVzZWQgdG8KICAgICAgICAgIGV4cGxpY2l0bHkgbGlzdCBkYXRhdHlwZXMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4KICAgICAgICAgIHRoZSBydW50aW1lIHR5cGUtY2hlY2tpbmcgY29kZS4gTm9ybWFsbHkgaXQgaXMgbmV2ZXIKICAgICAgICAgIG5lY2Vzc2FyeSB0byB1c2UgdGhpcyBidXQgc29tZXRpbWVzIGFkdmFuY2VkIGV4dGVuc2lvbnMKICAgICAgICAgIChzdWNoIGFzIHRoZSBwb2ludGVyLmkgbGlicmFyeSkgbWF5IG5lZWQgdG8gbWFudWFsbHkKICAgICAgICAgIGFkZCB0eXBlcyB0byB0aGUgdHlwZS1jaGVja2VyLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8zMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIEltcHJvdmVkIGhhbmRsaW5nIG9mIHN0cmluZyBhcnJheSB2YXJpYWJsZXMuIEZvciBleGFtcGxlLAogICAgICAgICAgYSBnbG9iYWwgdmFyaWFibGUgb2YgdGhlIGZvcm0gImNoYXIgbmFtZVs2NF0iIGlzIGF1dG9tYXRpY2FsbHkKICAgICAgICAgIG1hbmFnZWQgYXMgYSA2NCBjaGFyYWN0ZXIgc3RyaW5nLiAgUHJldmlvdXNseSB0aGlzIGRpZG4ndAogICAgICAgICAgd29yayBhdCBhbGwgb3IgcmVxdWlyZWQgdGhlIHVzZSBvZiBhIHNwZWNpYWwgdHlwZW1hcC4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAoVGNsLCBQZXJsLCBQeXRob24pICoqKgoKOC8zMS8wMCA6IHR0bgoJICBBZGRlZCBNYWtlZmlsZSB0YXJnZXQgYGNoZWNrLWMrKy1leGFtcGxlcycsIHdoaWNoIHVzZXMgbmV3CgkgIGZpbGVzIHVuZGVyIEV4YW1wbGVzL0MrKyBjb250cmlidXRlZCBieSBUYWwgU2hhbGlmLiAgTm93ICJtYWtlCgkgIGNoZWNrIiBhbHNvIGRvZXMgIm1ha2UgY2hlY2stYysrLWV4YW1wbGVzIi4gIEFsc28sIGV4cGFuZGVkCgkgIGFjdGlvbnMgaW4gYGNoZWNrLWdpZnBsb3QtZXhhbXBsZScgYW5kIGBjaGVjay1hbGl2ZW5lc3MnLgoKOC8zMC8wMCA6IG1rb2VwcGUKCSAgTWFqb3IgY2xlYW4tdXAgaW4gdGhlIEd1aWxlIG1vZHVsZS4gQWRkZWQgdHlwZW1hcC1kcml2ZW4KCSAgZG9jdW1lbnRhdGlvbiBzeXN0ZW0uIENoYW5nZWQgdG8gaGFuZGxlIG1vcmUgdGhhbiAxMAoJICBhcmdzLiBVcGRhdGVkIGFuZCBleHRlbmRlZCBleGFtcGxlcy4KCSAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8yOS8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIG5ldyAlaW5zZXJ0IGRpcmVjdGl2ZSB0aGF0IGluc2VydHMgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZQogICAgICAgICAgaW50byBhIHBvcnRpb24gb2YgdGhlIG91dHB1dCB3cmFwcGVyIGZpbGUuICBUaGlzIGlzIG9ubHkgaW50ZW5kZWQKICAgICAgICAgIGZvciB1c2UgYnkgd3JpdGVycyBvZiBsYW5ndWFnZSBtb2R1bGVzLiAgV29ya3MgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICVpbnNlcnQoaGVhZGVycykgICJmaWxlLnN3ZyI7CiAgICAgICAgICAgICAgICVpbnNlcnQocnVudGltZSkgICJmaWxlLnN3ZyI7CiAgICAgICAgICAgICAgICVpbnNlcnQod3JhcHBlcnMpICJmaWxlLnN3ZyI7CiAgICAgICAgICAgICAgICVpbnNlcnQoaW5pdCkgICAgICJmaWxlLnN3ZyI7CgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8yOS8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIG5ldyAlcnVudGltZSBkaXJlY3RpdmUgd2hpY2ggaW5jbHVkZXMgY29kZSBpbnRvIHRoZSBydW50aW1lCiAgICAgICAgICBwb3J0aW9uIG9mIHRoZSB3cmFwcGVyIGNvZGUuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlcnVudGltZSAlewogICAgICAgICAgICAgICAgICAgIC4uLiBzb21lIGludGVybmFsIHJ1bnRpbWUgY29kZSAuLi4KICAgICAgICAgICAgICAlfQoKICAgICAgICAgIFRoZXJlIGlzIG5vIHByYWN0aWNhbCByZWFzb24gZm9yIG9yZGluYXJ5IHVzZXJzIHRvIHVzZSB0aGlzCiAgICAgICAgICBmZWF0dXJlIChhbG1vc3QgZXZlcnl0aGluZyBjYW4gYmUgZG9uZSB1c2luZyAleyAuLi4gJX0KICAgICAgICAgIGluc3RlYWQpLiAgIEhvd2V2ZXIsIHdyaXRlcnMgb2YgbGFuZ3VhZ2UgbW9kdWxlcyBtYXkgd2FudCB0bwogICAgICAgICAgdXNlIHRoaXMgaW4gbGFuZ3VhZ2UgY29uZmlndXJhdGlvbiBmaWxlcy4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMjgvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUeXBlbWFwcyBjYW4gbm93IGJlIHNwZWNpZmllZCB1c2luZyBzdHJpbmcgbGl0ZXJhbHMgbGlrZQogICAgICAgICAgdGhpczoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludCAiJHRhcmdldCA9IFN2SVYoJHNvdXJjZSk7IjsKCiAgICAgICAgICBXaGVuIGNvZGUgaXMgc3BlY2lmaWVkIGxpa2UgdGhpcywgaXQgaXMgKk5PVCogZW5jbG9zZWQKICAgICAgICAgIGluc2lkZSBhIGxvY2FsIHNjb3BlIChhcyB3aXRoIG9sZGVyIHR5cGVtYXAgZGVjbGFyYXRpb25zKS4KICAgICAgICAgIE5vdGU6IGNoYXJhY3RlciBlc2NhcGUgc2VxdWVuY2VzIGFyZSBpbnRlcnByZXRlZCBpbiB0aGUKICAgICAgICAgIGNvZGUgc3RyaW5nIHNvIGlmIHlvdSB3YW50IHRvIGluY2x1ZGUgYSBxdW90ZSBvciBzb21lCiAgICAgICAgICBvdGhlciBzcGVjaWFsIGNoYXJhY3RlciwgbWFrZSBzdXJlIHlvdSB1c2UgYSAoXCkuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzI3LzAwIDogYmVhemxleQogICAgICAgICAgVHlwZW1hcHMgaGF2ZSBiZWVuIG1vZGlmaWVkIHRvIGZvbGxvdyB0eXBlZGVmIGRlY2xhcmF0aW9ucy4KICAgICAgICAgIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSB0aGlzOgoKICAgICAgICAgICAgICB0eXBlZGVmIGludCBOdW1iZXI7CgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBpbnQgewogICAgICAgICAgICAgICAgICAgICAgLi4uIGdldCBhbiBpbnRlZ2VyIC4uLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgdm9pZCBmb28oTnVtYmVyIGEpOwoKICAgICAgICAgIFRoZSB0eXBlbWFwIGZvciAnaW50JyB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIGFyZ3VtZW50ICdOdW1iZXIgYScuCiAgICAgICAgICBPZiBjb3Vyc2UsIGlmIHlvdSBzcGVjaWZ5IGEgdHlwZW1hcCBmb3IgJ051bWJlcicgaXQgd2lsbCB0YWtlCiAgICAgICAgICBwcmVjZWRlbmNlIChub3Igd2lsbCBpdCBldmVyIGJlIGFwcGxpZWQgdG8gYW4gJ2ludCcpLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo4LzI3LzAwIDogYmVhemxleQogICAgICAgICAgRGVmYXVsdCB0eXBlbWFwIHNwZWNpZmljYXRpb24gaGFzIGNoYW5nZWQuICAgSW4gb2xkZXIKICAgICAgICAgIHZlcnNpb25zIG9mIHN3aWcsIHlvdSBjb3VsZCBkbyB0aGlzOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludCBTV0lHX0RFRkFVTFRfVFlQRSB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFRvIHNwZWNpZnkgdGhlIGRlZmF1bHQgaGFuZGxpbmcgb2YgYSBkYXRhdHlwZS4gICBOb3cgdGhhdAogICAgICAgICAgU1dJRyBmb2xsb3dzIHR5cGVkZWYgZGVjbGFyYXRpb25zLCB0aGlzIGlzIHVubmVjZXNzYXJ5LgogICAgICAgICAgU2ltcGx5IHNwZWNpZnlpbmcgYSB0eXBlbWFwIGZvciAnaW50JyB3aWxsIHdvcmsgZm9yIGFsbAogICAgICAgICAgdmFyaWF0aW9ucyBvZiBpbnRlZ2VycyB0aGF0IGFyZSB0eXBlZGVmJ2QgdG8gJ2ludCcuCgogICAgICAgICAgQ2F2ZWF0LCBzcGVjaWZ5aW5nIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBwb2ludGVycywKICAgICAgICAgIHJlZmVyZW5jZXMsIGFycmF5cywgYW5kIHVzZXIgZGVmaW5lZCB0eXBlcyBpcyBhIGxpdHRsZQogICAgICAgICAgZGlmZmVyZW50LiAgVGhpcyBtdXN0IGJlIGRvbmUgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR1BPSU5URVIgKiB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4gYSBwb2ludGVyIC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR1JFRkVSRU5DRSAmIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiBhIHJlZmVyZW5jZSAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdBUlJBWSBbXSB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4gYW4gYXJyYXkgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHVFlQRSB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4gYSB1c2VyLWRlZmluZWQgdHlwZSAoYnkgdmFsdWUpIC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjgvMTUvMDAgOiBkdXN0aW4KICAgICAgICAgIFRoZSBmaWxlIHN3aWctMS4zYTEtMS5zcGVjIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBUb29scyBkaXJlY3RvcnkuCiAgICAgICAgICBJdCBjYW4gYmUgdXNlZCB0byBidWlsZCBhIHJlZGhhdCBwYWNrYWdlIGZvciBTV0lHLCBhbHRob3VnaCBpdAogICAgICAgICAgd2lsbCBuZWVkIHRvIGJlIHVwZGF0ZWQgZm9yIHRoZSBuZXh0IHB1YmxpYyByZWxlYXNlLgoKOC8xNS8wMCA6IGJlYXpsZXkKICAgICAgICAgIFR5cGVtYXBzIGhhdmUgYmVlbiBjb21wbGV0ZWx5IHJld3JpdHRlbi4gIEV2ZW50dWFsbHkgdGhleSBtYXkgYmUKICAgICAgICAgIHJlcGxhY2VkIHdpdGggc29tZXRoaW5nIGJldHRlciwgYnV0IGZvciBub3cgdGhleSBzdGF5LiAgSG93ZXZlciwKICAgICAgICAgIHRoZXJlIGFyZSBhIG51bWJlciBvZiBhIHNpZ25pZmljYW50IGNoYW5nZXMgdGhhdCBtYXkgdHJpcCBzb21lCiAgICAgICAgICBwZW9wbGUgdXA6CgogICAgICAgICAgMS4gIFR5cGVtYXAgc2NvcGluZyBpcyBjdXJyZW50bHkgYnJva2VuLiAgQmVjYXVzZSBvZiB0aGlzLCB0aGUKICAgICAgICAgICAgICBmb2xsb3dpbmcgY29kZSB3b24ndCB3b3JrLgoKICAgICAgICAgICAgICAldHlwZW1hcChpbikgYmxhaCAqIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICBpbnQgYmFyKGJsYWggKngpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAldHlwZW1hcChpbikgYmxhaCAqOyAgIC8qIENsZWFyIHR5cGVtYXAgKi8KCiAgICAgICAgICAgICAgKHRoaXMgYnJlYWtzIGJlY2F1c2UgdGhlIGNvZGUgZm9yIHRoZSBjbGFzcyBGb28gaXMgYWN0dWFsbHkKICAgICAgICAgICAgICBnZW5lcmF0ZWQgYWZ0ZXIgdGhlIGVudGlyZSBpbnRlcmZhY2UgZmlsZSBoYXMgYmVlbiBwcm9jZXNzZWQpLgogICAgICAgICAgICAgIFRoaXMgaXMgb25seSBhIHRlbXBvcmFyeSBidWcuCgogICAgICAgICAgMi4gIEluIFNXSUcxLjEsIHRoZSAlYXBwbHkgZGlyZWN0aXZlIHdvcmtlZCBieSBwZXJmb3JtaW5nIGEKICAgICAgICAgICAgICB2ZXJ5IGNvbXBsZXggdHlwZS1hbGlhc2luZyBwcm9jZWR1cmUuICBGcm9tIHRoaXMgcG9pbnQgb24sCiAgICAgICAgICAgICAgJWFwcGx5IGlzIHNpbXBseSBhIGdlbmVyYWxpemVkIHR5cGVtYXAgY29weSBvcGVyYXRpb24uCiAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsCgogICAgICAgICAgICAgICAgICAlYXBwbHkgZG91YmxlICpPVVRQVVQgeyBkb3VibGUgKngsIGRvdWJsZSAqeSB9OwoKICAgICAgICAgICAgICBDb3BpZXMgKkFMTCogY3VycmVudGx5IGRlZmluZWQgdHlwZW1hcHMgZm9yICdkb3VibGUgKk9VVFBVVCcgYW5kCiAgICAgICAgICAgICAgY29waWVzIHRoZW0gdG8gJ2RvdWJsZSAqeCcgYW5kICdkb3VibGUgKnknLgoKICAgICAgICAgICAgICBNb3N0IHBlb3BsZSBwcm9iYWJseSB3b24ndCBldmVuIG5vdGljZSB0aGlzIGNoYW5nZSBpbgogICAgICAgICAgICAgICVhcHBseS4gIEhvd2V2ZXIsIHdoZXJlIGl0IHdpbGwgYnJlYWsgdGhpbmdzIGlzIGluIGNvZGUgbGlrZQogICAgICAgICAgICAgIHRoaXM6CgogICAgICAgICAgICAgICAgICAlYXBwbHkgZG91YmxlICpPVVRQVVQgeyBkb3VibGUgKnggfTsKICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGRvdWJsZSAqT1VUUFVUIHsKICAgICAgICAgICAgICAgICAgICAgICAuLi4gd2hhdGV2ZXIgLi4uCiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgIHZvaWQgZm9vKGRvdWJsZSAqeCk7CgogICAgICAgICAgICAgIEluIFNXSUcxLjEsIHlvdSB3aWxsIGZpbmQgdGhhdCAnZm9vJyB1c2VzIHRoZSAnZG91YmxlICpPVVRQVVQnIHJ1bGUKICAgICAgICAgICAgICBldmVuIHRob3VnaCBpdCB3YXMgZGVmaW5lZCBhZnRlciB0aGUgJWFwcGx5IGRpcmVjdGl2ZSAodGhpcyBpcwogICAgICAgICAgICAgIHRoZSB3ZWlyZCBhbGlhc2luZyBzY2hlbWUgYXQgd29yaykuICBJbiBTV0lHMS4zIGFuZCBsYXRlciwKICAgICAgICAgICAgICB0aGUgJ2RvdWJsZSAqT1VUUFVUJyBydWxlIGlzIGlnbm9yZWQgYmVjYXVzZSBpdCBpcyBkZWZpbmVkCiAgICAgICAgICAgICAgYWZ0ZXIgdGhlICVhcHBseSBkaXJlY3RpdmUuCgogICAgICAgICAgMy4gIFRoZSAlY2xlYXIgZGlyZWN0aXZlIGhhcyBiZWVuIG1vZGlmaWVkIHRvIGVyYXNlIGFsbCBjdXJyZW50bHkKICAgICAgICAgICAgICBkZWZpbmVkIHR5cGVtYXBzIGZvciBhIHBhcnRpY3VsYXIgdHlwZS4gIFRoaXMgZGlmZmVycyBmcm9tCiAgICAgICAgICAgICAgU1dJRzEuMSB3aGVyZSAlY2xlYXIgb25seSByZW1vdmVkIHJ1bGVzIHRoYXQgd2VyZSBhZGRlZCB1c2luZwogICAgICAgICAgICAgIHRoZSAlYXBwbHkgZGlyZWN0aXZlLgoKICAgICAgICAgIDQuICBUeXBlbWFwIG1hdGNoaW5nIGlzIG5vdyBwZXJmb3JtZWQgdXNpbmcgKmV4YWN0KiB0eXBlcy4KICAgICAgICAgICAgICBUaGlzIG1lYW5zIHRoYXQgdGhpbmdzIGxpa2UgdGhpcwoKICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBjaGFyICogeyB9CiAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgY29uc3QgY2hhciAqIHsgfQoKICAgICAgICAgICAgICBhcmUgZGlmZmVyZW50IHR5cGVtYXBzLiAgICBBIHNpbWlsYXIgcnVsZSBhcHBsaWVzIGZvciBwb2ludGVycywKICAgICAgICAgICAgICBhcnJheXMsIGFuZCByZWZlcmVuY2VzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGRvdWJsZSAqIHsgfQoKICAgICAgICAgICAgICB1c2VkIHRvIGFwcGx5IHRvICdkb3VibGUgJicsICdkb3VibGUgW10nLCAgTm93LCBpdCBvbmx5IGFwcGxpZXMKICAgICAgICAgICAgICB0byAnZG91YmxlIConLiAgSWYgeW91IHdhbnQgYSAnZG91YmxlICYnLCB5b3UnbGwgbmVlZCB0byBoYW5kbGUKICAgICAgICAgICAgICB0aGF0IHNlcGFyYXRlbHkuCgogICAgICAgICAgNS4gIEFycmF5IG1hdGNoaW5nIGhhcyBiZWVuIHNpbXBsZmllZC4gIEluIFNXSUcxLjEsIGFycmF5IG1hdGNoaW5nCiAgICAgICAgICAgICAgd2FzIHBlcmZvcm1lZCBieSB0cnlpbmcgdmFyaW91cyBjb21iaW5hdGlvbnMgb2YgZGltZW5zaW9ucy4KICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgJ2RvdWJsZSBhWzEwXVsyMF0nIHdhcyBtYXRjaGVkIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAgICAgZG91YmxlIFsxMF1bMjBdCiAgICAgICAgICAgICAgICAgICBkb3VibGUgW0FOWV1bMjBdCiAgICAgICAgICAgICAgICAgICBkb3VibGUgWzEwXVtBTlldCiAgICAgICAgICAgICAgICAgICBkb3VibGUgW0FOWV1bQU5ZXQoKICAgICAgICAgICAgICBJbiBTV0lHMS4zLCBvbmx5IHRoZSBmb2xsb3dpbmcgbWF0Y2hlcyBhcmUgYXR0ZW1wdGVkOgoKICAgICAgICAgICAgICAgICAgIGRvdWJsZSBbMTBdWzIwXQogICAgICAgICAgICAgICAgICAgZG91YmxlIFtBTlldW0FOWV0KCiAgICAgICAgICBPbiB0aGUgcG9zaXRpdmUgc2lkZSwgdHlwZW1hcCBtYXRjaGluZyBpcyBub3cgKnNpZ25pZmljYW50bHkqIGZhc3RlcgogICAgICAgICAgdGhhbiBiZWZvcmUuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjgvMTUvMDAgOiBiZWF6bGV5CiAgICAgICAgICBTZWNyZXQgZGV2ZWxvcGVyIGZlYXR1cmUuICBTaW5jZSBkYXRhdHlwZXMgYXJlIG5vdyByZXByZXNlbnRlZCBhcyAKICAgICAgICAgIHN0cmluZ3MgaW50ZXJuYWxseSwgeW91IGNhbiBieXBhc3MgbGltaXRhdGlvbnMgb2YgdGhlIHBhcnNlciBhbmQKICAgICAgICAgIGNyZWF0ZSBhIHdpbGQgZGF0YXR5cGUgYnkgc2ltcGx5IGVuY2xvc2luZyB0aGUgcmF3IHN0cmluZyBlbmNvZGluZwogICAgICAgICAgaW4gYmFja3RpY2tzIChgYCkgYW5kIHN0aWNraW5nIGl0IGluIHRoZSBpbnRlcmZhY2UgZmlsZSBhbnl3aGVyZSBhCiAgICAgICAgICB0eXBlIGlzIGV4cGVjdGVkLiAgRm9yIGV4YW1wbGUsIGBhKDIwKS5hKDEwKS5wLmYoaW50LGludClgLiAgVGhpcyAKICAgICAgICAgIGZlYXR1cmUgaXMgb25seSBpbnRlbmRlZCBmb3IgdGVzdGluZyAoaS5lLiwgeW91IHdhbnQgdG8gc2VlIHdoYXQKICAgICAgICAgIGhhcHBlbnMgdG8geW91ciBsYW5ndWFnZSBtb2R1bGUgaWYgaXQgZ2V0cyBhIHJlZmVyZW5jZSB0byBhIHBvaW50ZXIKICAgICAgICAgIHRvIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyBvciBzb21ldGhpbmcpLiAKICAgICAgICAgICoqKiBTSUNLIEhBQ0sgKioqCgo4LzE0LzAwIDogYmVhemxleQogICAgICAgICAgQ29tcGxldGVseSBuZXcgdHlwZS1zeXN0ZW0gYWRkZWQgdG8gdGhlIGltcGxlbWVudGF0aW9uLgogICAgICAgICAgTW9yZSBkZXRhaWxzIGxhdGVyLgoKOC8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIENsZWFuZWQgdXAgc29tZSBvZiB0aGUgSS9PIGhhbmRsaW5nLiAgU1dJRyBubyBsb25nZXIgZ2VuZXJhdGVzCiAgICAgICAgICBhbnkgdGVtcG9yYXJ5IGZpbGVzIHN1Y2ggYXMgX3dyYXAud3JhcCwgX3dyYXAuaWksIF93cmFwLmluaXQuCiAgICAgICAgICBJbnN0ZWFkLCB0aGVzZSAiZmlsZXMiIGFyZSBrZXB0IGFyb3VuZCBpbiBtZW1vcnkgYXMgc3RyaW5ncwogICAgICAgICAgKGFsdGhvdWdoIHRoaXMgaXMgdHJhbnNwYXJlbnQgdG8gbGFuZ3VhZ2UgbW9kdWxlcykuCgo4LzQvMDAgIDogdHRuCgkgIEFkZGVkIE1ha2VmaWxlIHRhcmdldCAiY2hlY2siIGFuZCB2YXJpYW50cy4KCSAgVGhpcyBjYW4gYmUgdXNlZCBsaWtlICJtYWtlIGNoZWNrIiBvciwgdG8gZXhwbGljaXRseSBza2lwIGEKCSAgbGFuZ3VhZ2UgTEFORzogIm1ha2Ugc2tpcC1MQU5HPXRydWUgY2hlY2siLiAgTEFORyBpcyBza2lwcGVkCgkgIGF1dG9tYXRpY2FsbHkgaWYgLi9jb25maWd1cmUgZGV0ZXJtaW5lcyB0aGF0IExBTkcgc3VwcG9ydCBpcwoJICBpbnN1ZmZpY2llbnQuCgoJICBDdXJyZW50bHksIHRoZSBjaGVjayBpcyBsaW1pdGVkIHRvIGRvaW5nIHRoZSBlcXVpdmFsZW50IG9mCgkgICJtYWtlIGFsbCIgaW4gc29tZSBvZiB0aGUgRXhhbXBsZXMgZGlyZWN0b3JpZXMuICBUaGlzIHNob3VsZAoJICBiZSBleHBhbmRlZCBib3RoIGhvcml6b250YWxseSAoZGlmZmVyZW50IHR5cGVzIG9mIHRlc3RzKSBhbmQKCSAgdmVydGljYWxseSAoYWZ0ZXIgIm1ha2UgYWxsIiBpbiBhbiBFeGFtcGxlcyBzdWJkaXIgc3VjY2VlZHMsCgkgIGRvIHNvbWUgYWRkaXRpb25hbCB0ZXN0cyB3aXRoIHRoZSByZXN1bHRpbmcgaW50ZXJwcmV0ZXIsIGV0YykuCgo4LzQvMDAgIDogdHRuCgkgIEFkZGVkIE1ha2VmaWxlIHRhcmdldCAiZGlzdGNsZWFuIiwgd2hpY2ggZGVsZXRlcyBhbGwgdGhlCgkgIGZpbGVzIC4vY29uZmlndXJlIGNyZWF0ZXMsIGluY2x1ZGluZyBjb25maWcuc3RhdHVzIGFuZCBmcmllbmRzLgoKOC8zLzAwICA6IGhhcmNvaAoJICBqYXZhIGNoYW5nZXM/Pz8gW3RvZG86IGRvY3VtZW50IGNoYW5nZXNdCgo3LzIzLzAwIDogYmVhemxleQogICAgICAgICAgVHlwZW1hcHMgaGF2ZSBiZWVuIG1vZGlmaWVkIHRvIGtleSBvZmYgb2YgdGhlIHJlYWwgZGF0YXR5cGVzCiAgICAgICAgICB1c2VkIGluIHRoZSBpbnRlcmZhY2UgZmlsZS4gIFRoaXMgbWVhbnMgdGhhdCB0eXBlbWFwcyBmb3IKICAgICAgICAgICJjb25zdCBjaGFyICoiIGFuZCAiY2hhciAqIiB3aWxsIGJlIGRpZmZlcmVuY2UgYXMgd2lsbCB0eXBlbWFwcwogICAgICAgICAgZm9yICJWZWN0b3IiIGFuZCAiVmVjdG9yICouIgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICBUaGlzIGlzIGxpa2VseSB0byBicmVhayBpbnRlcmZhY2VzIHRoYXQgcmVseSBvbiB0aGUgb2RkIHR5cGUKICAgICAgICAgIGhhbmRsaW5nIGJlaGF2aW9yIG9mIHR5cGVtYXBzIGluIFNXSUcxLjEtLWVzcGVjaWFsbHkgd2l0aAogICAgICAgICAgcmVzcGVjdCB0byBpbnRlcmZhY2VzIGludm9sdmluZyBwYXNzLWJ5LXZhbHVlLgoKNy8yMy8wMCA6IGJlYXpsZXkKICAgICAgICAgIE5ldyAlY29uc3RhbnQgZGlyZWN0aXZlLiAgVGhpcyBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgdG8KICAgICAgICAgIGNyZWF0ZSB0cnVlIGNvbnN0YW50cyBpbiB0aGUgdGFyZ2V0IHNjcmlwdGluZyBsYW5ndWFnZS4KICAgICAgICAgIEl0J3MgbW9zdCBzaW1wbGUgZm9ybSBpcyBzb21ldGhpbmcgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICVjb25zdGFudCBGT08gNDI7CgogICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgdHlwZSBpcyBpbmZlcnJlZCBmcm9tIHRoZSBzeW50YXggb2YgdGhlCiAgICAgICAgICB2YWx1ZSAoaW4gcmVhbGl0eSwgYWxsICNkZWZpbmUgbWFjcm9zIGFyZSB0cmFuc2xhdGVkIGludG8KICAgICAgICAgIGRpcmVjdGl2ZXMgb2YgdGhpcyBmb3JtKS4KCiAgICAgICAgICBBbiBleHBhbmRlZCB2ZXJzaW9uIGlzIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAlY29uc3RhbnQoRm9vICopIEZPTyA9ICZGb29PYmo7CgogICAgICAgICAgSW4gdGhpcyBjYXNlLCBhbiBleHBsaWNpdCB0eXBlIGNhbiBiZSBzcGVjaWZpZWQuICBUaGlzCiAgICAgICAgICBsYXR0ZXIgZm9ybSBtYXkgYmUgdXNlZnVsIGZvciBjcmVhdGluZyBjb25zdGFudHMgdGhhdAogICAgICAgICAgdXNlZCB0byBiZSBzcGVjaWZpZWQgYXMKCiAgICAgICAgICAgICBjb25zdCBGb28gKkZPTyA9ICZGb29PYmo7CgogICAgICAgICAgKHdoaWNoIGFyZSBub3cgdHJlYXRlZCBhcyB2YXJpYWJsZXMpLgogICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBGRUFUVVJFICoqKiBUaGUgc3ludGF4IG1heSBjaGFuZ2UgaW4KICAgICAgICAgIHRoZSBmaW5hbCByZWxlYXNlLgoKNy8yMy8wMCA6IGJlYXpsZXkKICAgICAgICAgIE1vZGlmaWVkIHRoZSBwYXJzZXIgc28gdGhhdCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgb2YgdGhlIGZvcm0KICAgICAgICAgICJjb25zdCB0eXBlICphIiBhcmUgaGFuZGxlZCBhcyB2YXJpYWJsZXMsIG5vdCBjb25zdGFudHMuCiAgICAgICAgICBOb3RlOiBTV0lHMS4xIGhhbmRsZWQgdGhpcyBjYXNlIGVycm9uZW91c2x5IGJlY2F1c2UKICAgICAgICAgIGNvbnN0IGNoYXIgKmEgaXMgYSBwb2ludGVyIHZhcmlhYmxlIHRoYXQgY2FuIGJlIHJlYXNzaWduZWQuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgIE5vdGU6IGp1c3QgYmVjYXVzZSB0aGlzIGlzIHRoZSAicmlnaHQiIHdheSB0byBkbyB0aGluZ3MsCiAgICAgICAgICBkb2Vzbid0IG1lYW4gaXQncyB0aGUgbW9zdCBhcHByb3ByaWF0ZSBpbnRlcnByZXRhdGlvbi4KICAgICAgICAgIEkgc3VzcGVjdCB0aGF0IG1hbnkgQyBwcm9ncmFtbWVycyBtaWdodCB1c2UgJ2NvbnN0IGNoYXIgKicKICAgICAgICAgIHdpdGggdGhlIGludGVudCBvZiBjcmVhdGluZyBhIGNvbnN0YW50LCB3aXRob3V0IHJlYWxpemluZwogICAgICAgICAgdGhhdCB0aGV5J3ZlIGNyZWF0ZWQgYSByZWFzc2lnbmFibGUgZ2xvYmFsIHZhcmlhYmxlLgoKNy8yMy8wMCA6IGJlYXpsZXkKICAgICAgICAgIFRoZSBDL0MrKyB3cmFwcGluZyBsYXllciBoYXMgYmVlbiBjb21wbGV0ZWx5IHJlZGVzaWduZWQgYW5kCiAgICAgICAgICByZWltcGxlbWVudGVkLiAgVGhpcyBjaGFuZ2Ugc2hvdWxkIGlyb24gb3V0IGEgZmV3IHJvdWdoCiAgICAgICAgICBzcG90cyB3aXRoIHRoZSBoYW5kbGluZyBvZiBkYXRhdHlwZXMuICBJbiBhZGRpdGlvbiwgdGhlCiAgICAgICAgICB3cmFwcGVyIGNvZGUgaXMgc29tZXdoYXQgY2xlYW5lci4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgVGhpcyBjaGFuZ2UgbWF5IGJyZWFrIGludGVyZmFjZXMgdGhhdCBpbnZvbHZlCiAgICAgICAgICBzdWJ0bGUgY29ybmVyLWNhc2VzIHdpdGggdHlwZW1hcHMgYW5kIHRoZSAlYWRkbWV0aG9kcwogICAgICAgICAgZGlyZWN0aXZlIHNpbmNlIHNvbWUgb2YgdGhlc2UgZmVhdHVyZXMgaGFkIHNvbWV3aGF0CiAgICAgICAgICB0eXBlIGhhbmRsaW5nIGJlaGF2aW9yIGluIFNXSUcxLjEuCgo3LzIzLzAwIDogYmVhemxleQogICAgICAgICAgVGhlICJtZW1iZXJpbiIgYW5kICJtZW1iZXJvdXQiIHR5cGVtYXBzIGFyZSBnb25lIGZvciB0aGUKICAgICAgICAgIG1vbWVudCwgYnV0IHRoZXkgbWlnaHQgcmV0dXJuIGFzIHNvb24gYXMgSSBmaWd1cmUgb3V0CiAgICAgICAgICBob3cgdG8gaW50ZWdyYXRlIHRoZW0gd2l0aCBzb21lIG9mIHRoZSBzdHJlYW1saW5lZCBDIHdyYXBwZXIKICAgICAgICAgIGZ1bmN0aW9ucy4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8yMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIEEgdmFyaWV0eSBvZiBvbGQgdHlwZSBoYW5kbGluZyBmdW5jdGlvbnMgc3VjaCBhcyBwcmludF90eXBlKCksCiAgICAgICAgICBwcmludF9mdWxsKCksIHByaW50X21hbmdsZSgpLCBldGMuLi4gYXJlIGdvbmUgYW5kIGhhdmUgYmVlbgogICAgICAgICAgcmVwbGFjZWQgd2l0aCBhIHNtYWxsZXIgc2V0IG9mIGZ1bmN0aW9ucy4gIFNlZSB0aGUgZmlsZQogICAgICAgICAgRG9jL2ludGVybmFscy5odG1sIGZvciBkZXRhaWxzLiAgVGhpcyB3aWxsIGJyZWFrIGFsbCB0aGlyZAogICAgICAgICAgcGFydHkgbGFuZ3VhZ2UgbW9kdWxlcy4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8yMC8wMCA6IGJlYXpsZXkKICAgICAgICAgIERlcHJlY2F0ZWQgdGhlICV2YWwgYW5kICVvdXQgZGlyZWN0aXZlcy4gIFRoZXNlIGRpcmVjdGl2ZXMKICAgICAgICAgIHNob3VsZG4ndCByZWFsbHkgYmUgbmVjZXNzYXJ5IHNpbmNlIHR5cGVtYXBzIGNhbiBiZSB1c2VkCiAgICAgICAgICB0byBhY2hpZXZlIHNpbWlsYXIgcmVzdWx0cy4gICBUaGlzIGFsc28gY2xlYW5zIHVwIHRoZQogICAgICAgICAgaGFuZGxpbmcgb2YgdHlwZXMgYW5kIHBhcmFtZXRlcnMgcXVpdGUgYSBiaXQuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvMjAvMDAgOiB0dG4KCSAgRml4ZWQgdW5zcGVjaWZpZWQtbW9kdWxlIGJ1ZyBpbiBHdWlsZSBzdXBwb3J0IGFuZCByZW1vdmVkCgkgIG1vcmUgbm9uLSJ3aXRoLXNtb2JzIiBmdW5jdGlvbmFsaXR5IHVzaW5nIHBhdGNoZXMgc3VibWl0dGVkCgkgIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCgkgIFJlLWVuYWJsZSByZWNvZ25pdGlvbiBvZiAiLXdpdGgtc21vYnMiICh3aXRoIG5vIGVmZmVjdCBzaW5jZQoJICB3ZSB1c2Ugc21vYnMgYnkgZGVmYXVsdCBub3cpIGZvciB0aGUgdGltZSBiZWluZy4gIEFmdGVyIHRoZQoJICAxLjNhNCByZWxlYXNlLCB0aGlzIG9wdGlvbiB3aWxsIHNpZ25hbCBhbiBlcnJvci4KCjcvMTcvMDAgOiB0dG4KCSAgRml4ZWQgTlVMTC1pbnB1dCBidWcgaW4gcGFyYW1ldGVyIGxpc3QgaGFuZGxpbmcuCgkgIFJlcG9ydGVkIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCjcvMTIvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBtZW1vcnkgbGVhayBpbiBQeXRob24gdHlwZS1jaGVja2luZyBjb2RlLiBSZXBvcnRlZCBieQogICAgICAgICAgS2VpdGggRGF2aWRzb24uICBCdWcgIzEwOTM3OS4KCjcvMTAvMDAgOiBiZWF6bGV5CiAgICAgICAgICBDaGFuZ2VkIGludGVybmFsIGRhdGEgc3RydWN0dXJlcyByZWxhdGVkIHRvIGZ1bmN0aW9uIHBhcmFtZXRlcnMuCgo3LzEwLzAwIDogYmVhemxleQogICAgICAgICAgRml4ZWQgc29tZSBidWdzIHJlbGF0ZWQgdG8gdGhlIGhhbmRsaW5nIG9mIHRoZSAlbmFtZSgpIGRpcmVjdGl2ZQogICAgICAgICAgYW5kIGNsYXNzZXMgaW4gdGhlIFRjbCBtb2R1bGUuIFByb2JsZW0gcmVwb3J0ZWQgYnkgSmFtZXMgQmFpbGV5LgoKNy8xMC8wMCA6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIHBhcnNpbmcgYW5kIGVudW0gaGFuZGxpbmcgcHJvYmxlbXMgd2l0aCBjaGFyYWN0ZXIgY29uc3RhbnRzLgogICAgICAgICAgUmVwb3J0ZWQgYnkgR3JlZyBLb2NoYW5za2kuCgo3LzEwLzAwIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCBXcmFwcGVyRnVuY3Rpb24gY2xhc3MgZnJvbSB0aGUgY29yZSBhbmQgdXBkYXRlZCB0aGUgbGFuZ3VhZ2UKICAgICAgICAgIG1vZHVsZS4gIFRoaXMgd2lsbCBicmVhayB0aGlyZCBwYXJ0eSBtb2R1bGVzLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzkvMDAgIDogYmVhemxleQogICAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgU1dJRyBubyBsb25nZXIgbWFrZXMgdXNlIG9mIEMrKyBvcGVyYXRvciBvdmVybG9hZGluZy4KICAgICAgICAgIFRoaXMgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJyZWFrICphbGwqIHRoaXJkIHBhcnR5IGxhbmd1YWdlIG1vZHVsZXMKICAgICAgICAgIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBtYWluIFNXSUcgQ1ZTIHRyZWUuIFNvcnJ5LgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzgvMDAgIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgZXhwZXJpbWVudGFsIGFuZCB1bmRvY3VtZW50ZWQgImJ1aWxkIiB0eXBlbWFwIHRoYXQKICAgICAgICAgIHdhcyBpbnRlbmRlZCB0byB3b3JrIHdpdGggbXVsdGlwbGUgYXJndW1lbnRzLiBTaW1wbHkgdG9vIHdlaXJkCiAgICAgICAgICB0byBrZWVwIGFyb3VuZC4gIEJlc2lkZXMsIGEgYmV0dGVyIHJlcGxhY2VtZW50IGlzIGluIHRoZSB3b3Jrcy4KCjcvNi8wMCAgOiB0dG4KICAgICAgICAgIFJlbW92ZWQgbm9uLSJ3aXRoLXNtb2JzIiBmdW5jdGlvbmFsaXR5IChHdWlsZSBzdXBwb3J0KSwgaS5lLiwKICAgICAgICAgICItd2l0aC1zbW9icyIgaXMgbm93IHRoZSBkZWZhdWx0IGFuZCBubyBsb25nZXIgbmVlZHMgdG8gYmUKCSAgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kLWxpbmUuCgo3LzUvMDAgIDogdHRuCiAgICAgICAgICBJbmNvcnBvcmF0ZWQgUnVieSBzdXBwb3J0IGNvbnRyaWJ1dGVkIGJ5IE1hc2FraSBGdWt1c2hpbWEuCgo2LzI4LzAwIDogdHRuCiAgICAgICAgICBBcHBsaWVkIG1vcmUtdGhhbi0xMC1hcmdzIGJ1Z2ZpeCBwYXRjaCBjb250cmlidXRlZAoJICBieSBNYXR0aGlhcyBLb2VwcGUuCgo2LzI3LzAwIDogYmVhemxleQogICAgICAgICAgUmV3cm90ZSBzb21lIG9mIHRoZSBzdHJpbmcgaGFuZGxpbmcgYW5kIGVsaW1pbmF0ZWQgdGhlIEMrKwogICAgICAgICAgaW1wbGVtZW50YXRpb24gKHdoaWNoIGlzIG5vdyBqdXN0IGEgd3JhcHBlcikuCgo2LzI3LzAwIDogdHRuCiAgICAgICAgICBBZGRlZCBEb2MvaW5kZXguaHRtbCBhbmQgRG9jL2ludGVybmFscy5odG1sLiAgVGhlIHRhcmdldAogICAgICAgICAgYXVkaWVuY2UgZm9yIHRoZSBsYXR0ZXIgaXMgbmV3IFNXSUcgZGV2ZWxvcGVycy4KCgpWZXJzaW9uIDEuMyBBbHBoYSAzIChKdW5lIDE4LCAyMDAwKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKNi8xOC8wMCA6IGJlYXpsZXkKICAgICAgICAgIFJlbW92ZWQgdGhlIG5hbWluZy5jeHgsIGhhc2guY3h4LCBhbmQgc3ltYm9sLmN4eCBmaWxlcyBmcm9tCiAgICAgICAgICB0aGUgU1dJRzEuMSBkaXJlY3RvcnkuICAgQ29udGludWVkIHRvIG1pZ3JhdGUgdGhpbmdzIGF3YXkKICAgICAgICAgIGZyb20gdGhlIEMrKyBiYXNlIChhbHRob3VnaCB0aGVyZSdzIHN0aWxsIGEgbG90IG9mIHdvcmsgdG8gZG8pLgoKNi8xNy8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIGEgZmV3IG1vcmUgZXhhbXBsZXMgdG8gdGhlIEV4YW1wbGVzIGRpcmVjdG9yeS4gIFN0aWxsCiAgICAgICAgICBuZWVkIHRvIGRvIGEgbG90IG9mIHdvcmsgb24gdGhpcy4KCjYvMTYvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCAtaW5jbHVkZWFsbCB0byBmb2xsb3cgYWxsICNpbmNsdWRlIHN0YXRlbWVudHMgaW4gdGhlCiAgICAgICAgICBwcmVwcm9jZXNzb3IuCgo2LzE1LzAwIDogYmVhemxleQogICAgICAgICAgVHJpZWQgdG8gZml4IGFzIG1hbnkgQysrIHdhcm5pbmdzIGFzIHBvc3NpYmxlIHdoZW4gY29tcGlsaW5nCiAgICAgICAgICB3aXRoIHRoZSBTdW4gV29ya3Nob3AgQysrIGNvbXBpbGVyLiAgVW5mb3J0dW5hdGVseSwgdGhpcyBtZWFucwogICAgICAgICAgdGhhdCB0aGVyZSBhcmUgYSBsb3Qgb2Ygc3RhdGVtZW50cyB0aGF0IGNvbnRhaW4gc3RyaW5nIGxpdGVyYWxzCiAgICAgICAgICBvZiB0aGUgZm9ybSAoY2hhciopIkJsYWgiLgoKNi8xNS8wMDogIGJlYXpsZXkKICAgICAgICAgIEEgdmFyaWV0eSBvZiBjbGVhbnVwIGFuZCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gaW4gdGhlCiAgICAgICAgICBsb3ctbGV2ZWwgRE9IIGxpYnJhcnkuICAgVGhpcyBzZWVtcyB0byByZXN1bHQgaW4gYSBzcGVlZHVwCiAgICAgICAgICBvZiA1MC0xMDAlIGZvciBwcmVwcm9jZXNzaW5nIGFuZCBvdGhlciByZWxhdGVkIHRhc2tzLgoKNS8xMC8wMCA6IHR0bgoJICBBcHBsaWVkIHZhcmlhYmxlLXdyYXBwaW5nIGJ1Z2ZpeCBwYXRjaCBjb250cmlidXRlZAoJICBieSBNYXR0aGlhcyBLb2VwcGUuCgo0LzE3LzAwIDogdHRuCgkgIFVwZGF0ZWQgTXpTY2hlbWUgc3VwcG9ydCBjb250cmlidXRlZCBieSBPbGVnIFRvbG1hdGNldi4KCSAgV2Ugbm93IHVzZSBhIGBTY2hlbWVfVHlwZSctYmFzZWQgc3RydWN0dXJlIHRvIHdyYXAgcG9pbnRlcnMuCgo0LzExLzAwIDogdHRuCgkgIEluY29ycG9yYXRlZCBmdXJ0aGVyIEd1aWxlLXN1cHBvcnQgcGF0Y2ggYnkgTWF0dGhpYXMgS29lcHBlLgoJICBUeXBlbWFwcyBwcmV2aW91c2x5IGRlbGV0ZWQgaGF2ZSBiZWVuIHJlLWFkZGVkLiAgVGhlcmUgaXMgbm93CgkgIGV4Y2VwdGlvbiBoYW5kbGluZyAoc2VlIERvYy9lbmdpbmVlcmluZy5odG1sKS4gIGBTV0lHX2luaXQnIGlzIG5vdwoJICBkZWNsYXJlZCBleHRlcm4gb25seSBmb3Igc2ltcGxlIGxpbmthZ2UuICBTb21lIGJ1Z3Mgd2VyZSBmaXhlZC4KCjQvMDYvMDAgOiB0dG4KCSAgSW5jb3Jwb3JhdGVkIE16U2NoZW1lIHN1cHBvcnQgY29udHJpYnV0ZWQgYnkgT2xlZyBUb2xtYXRjZXYuCgkgIFRoaXMgaW5jbHVkZXMgbmV3IGRpcmVjdG9yaWVzIExpYi9tenNjaGVtZSBhbmQgRXhhbXBsZXMvbXpzY2hlbWUuCgo0LzAzLzAwIDogdHRuCgkgIEFkZGVkIEV4YW1wbGVzL2d1aWxlIGFuZCBjaGlsZHJlbi4gIFRoaXMgaXMgYW4gYWRhcHRhdGlvbiBvZgoJICB0aGUgc2FtZS1uYW1lZCBkaXJlY3RvcnkgZnJvbSB0aGUgU1dJRy0xLjFwNSBkaXN0cmlidXRpb24uCgkgIEFkZGVkIEd1aWxlLXNwZWNpZmljIHNlY3Rpb24gdG8gRG9jL2VuZ2luZWVyaW5nLmh0bWwuCgo0LzAyLzAwIDogdHRuCgkgIEluY29ycG9yYXRlZCBuZXcgZ3VpbGVtYWluLmkgYnkgTWFydGluIEZyb2VobGljaC4KCSAgSW5jb3Jwb3JhdGVkIEd1aWxlLXN1cHBvcnQgcmV3cml0ZSBwYXRjaCBieSBNYXR0aGlhcyBLb2VwcGUuCgkgIFRoZSBjb21tYW5kIGxpbmUgb3B0aW9uICItd2l0aC1zbW9icyIgZW5hYmxlcyBpbXBsZW1lbnRhdGlvbiBvZgoJICBwb2ludGVyIHR5cGUgaGFuZGxpbmcgdXNpbmcgc21vYnMsIHRoZSBjYW5vbmljYWwgbWVjaGFuaXNtIGZvcgoJICBkZWZpbmluZyBuZXcgdHlwZXMgaW4gR3VpbGUuICBQcmV2aW91cyBpbXBsZW1lbnRhdGlvbiAodXNpbmcKCSAgc3RyaW5ncykgaXMgYXQgdGhlIG1vbWVudCBzdGlsbCBzdXBwb3J0ZWQgYnV0IGRlcHJlY2F0ZWQuICBBdAoJICBzb21lIHBvaW50LCAiLXdpdGgtc21vYnMiIHdpbGwgYmUgdGhlIGRlZmF1bHQgYW5kIG5vIGxvbmdlcgoJICByZXF1aXJlZC4KCjMvMTMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCBwdXJpZnkgcGF0Y2hlcyBzdWJtaXR0ZWQgYnkgUmFtIEJoYW1pZGlwYXR5LgoKMy8wMi8wMCA6IHR0bgogICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgZGlmZmVyZW50IEd1aWxlICJsaW5rYWdlIiBzY2hlbWVzLgoJICBDdXJyZW50bHksICItTGlua2FnZSBob2JiaXQiIHdvcmtzLgoKClZlcnNpb24gMS4zIEFscGhhIDIgKE1hcmNoIDEsIDIwMDApCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyLzI5LzAwIDogYmVhemxleQogICAgICAgICAgTWFkZSBTV0lHIGlnbm9yZSB0aGUgJ211dGFibGUnIGtleXdvcmQuCgoyLzI5LzAwIDogYmVhemxleQogICAgICAgICAgSW5jb3Jwb3JhdGVkIHNvbWUgcGF0Y2hlcyB0byB0aGUgUGVybDUgbW9kdWxlIHJlbGF0ZWQgdG8KICAgICAgICAgIHRoZSAtaGlkZSBvcHRpb24gYW5kIHRoZSBkZXN0cnVjdGlvbiBvZiBvYmplY3RzLgogICAgICAgICAgUGF0Y2ggc3VibWl0dGVkIGJ5IEthcmwgRm9ybmVyLgoKMi8yNy8wMCA6IHR0bgoJICBJbmNvcnBvcmF0ZWQgR3VpbGUgc3VwcG9ydCBjb250cmlidXRlZCBieSBNYXR0aGlhcyBLb2VwcGUuCgkgIFRoaXMgaW5jbHVkZXMgYSBjcHAgbWFjcm8gaW4gTGliL2d1aWxlL2d1aWxlLnN3ZyBhbmQgdGhlCgkgIGVudGlyZSBmaWxlIExpYi9ndWlsZS90eXBlbWFwcy5pLgoKMi8yNS8wMCA6IHR0bgoJICBNb2RpZmllZCBjb25maWd1cmUuaW4gYW5kIE1ha2VmaWxlLmluIGZpbGVzIHRvIHN1cHBvcnQKCSAgbm9uLWxvY2FsIGJ1aWxkICh1c2VmdWwgaW4gbXVsdGktYXJjaCBlbnZpcm9ubWVudHMpLgoKMi8yNC8wMCA6IHR0bgoJICBJbmNvcnBvcmF0ZWQgR3VpbGUgc3VwcG9ydCBjb250cmlidXRlZCBieSBDbGFyayBNY0dyZXcuCgkgIFRoaXMgd29ya3Mgd2l0aCBHdWlsZSAxLjMsIGJ1dCBzaW5jZSBpdCBkZXBlbmRzIGhlYXZpbHkKCSAgb24gdGhlIGdoXyBpbnRlcmZhY2UsIGl0IHNob3VsZCB3b3JrIGZvciBhbGwgbGF0ZXIgdmVyc2lvbnMuCgkgIEl0IGhhcyBub3QgYmVlbiB0ZXN0ZWQgd2l0aCB2ZXJzaW9ucyBiZWZvcmUgMS4zLgoJICBXQVJOSU5HOiBDb2RlIGlzIHVuc3RhYmxlIGR1ZSB0byBleHBlcmltZW50YXRpb24gYnkgdHRuLgoKMi8xNi8wMCA6IGJlYXpsZXkKICAgICAgICAgIEEgdmFyaWV0eSBvZiBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMgdG8gdGhlIFB5dGhvbiBzaGFkb3cKICAgICAgICAgIGNsYXNzIGNvZGUgZ2VuZXJhdGlvbi4gIE1hbnkgb2YgdGhlc2UgcmVzdWx0IGluIHN1YnN0YW50aWFsCiAgICAgICAgICBydW50aW1lIHBlcmZvcm1hbmNlIGdhaW5zLiAgSG93ZXZlciwgdGhlc2UgaGF2ZSBjb21lIGF0CiAgICAgICAgICBhIGNvc3Qgb2YgcmVxdWlyaW5nIHRoZSB1c2Ugb2YgUHl0aG9uIDEuNS4yLiAgRm9yIG9sZGVyCiAgICAgICAgICB2ZXJzaW9ucywgdXNlICdzd2lnIC1ub29wdCAtcHl0aG9uJyB0byB0dXJuIG9mZiB0aGVzZQogICAgICAgICAgb3B0aW1pemF0aW9uIGZlYXR1cmVzLgoKVmVyc2lvbiAxLjMgQWxwaGEgMSAoRmVicnVhcnkgMTEsIDIwMDApCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMi8xMS8wMCA6IEFkZGVkICd2b2lkJyB0byBwcm90b3R5cGUgb2YgUHl0aG9uIG1vZHVsZSBpbml0aWFsaXplci4KICAgICAgICAgIFJlcG9ydGVkIGJ5IE1hcmsgSG93c29uICgxLzIwLzAwKS4KCjIvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBNb2RpZmllZCB0aGUgUHl0aG9uIHNoYWRvdyBjbGFzcyBjb2RlIHRvIGRpc2NhcmQgb3duZXJzaGlwIG9mIGFuCiAgICAgICAgICBvYmplY3Qgd2hlbmV2ZXIgaXQgaXMgYXNzaWduZWQgdG8gYSBtZW1iZXIgb2YgYW5vdGhlciBvYmplY3QuCiAgICAgICAgICBUaGlzIHByb2JsZW0gaGFzIGJlZW4gYXJvdW5kIGZvciBhd2hpbGUsIGJ1dCB3YXMgbW9zdCByZWNlbnRseQogICAgICAgICAgcmVwb3J0ZWQgYnkgQnVya2hhcmQgS2xvc3MgKDEyLzMwLzk5KS4KCjIvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCBicmFjZXMgYXJvdW5kIG1hY3JvcyBpbiB0aGUgZXhjZXB0aW9uLmkgbGlicmFyeS4gIFJlcG9ydGVkCiAgICAgICAgICBieSBCdWNrIEhvZGdlcyAoMTIvMTkvOTkpCgoyLzExLzAwIDogYmVhemxleQogICAgICAgICAgRml4ZWQgYnVnIGluIHRoZSBjb25zdHJhaW50cy5pIGxpYnJhcnkuIFJlcG9ydGVkIGJ5IEJ1Y2sKICAgICAgICAgIEhvZGdlcyAoMTIvMTQvOTkpCgoyLzExLzAwIDogYmVhemxleQogICAgICAgICAgVGhlICVuYXRpdmUgZGlyZWN0aXZlIG5vdyBnZW5lcmF0ZXMgVGNsOCBvYmplY3Qtc3R5bGUgY29tbWFuZCBjYWxscy4KICAgICAgICAgIEEgZnVsbCBzb2x1dGlvbiBmb3IgVGNsNyBhbmQgVGNsOCBpcyBzdGlsbCBuZWVkZWQuIFBhdGNoIHN1Z2dlc3RlZAogICAgICAgICAgYnkgTWlrZSBXZWlibGVuICgxMS8yOS85OSkKCjIvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBNb2RpZmllZCB0aGUgdHlwZW1hcCBjb2RlIHRvIGluY2x1ZGUgdGhlICRuZGltIHZhcmlhYmxlIGZvciBhcnJheXMuCiAgICAgICAgICBQYXRjaCBwcm92aWRlZCBieSBNaWNoZWwgU2FubmVyICgxMS8xMi85OSkuCgoyLzExLzAwIDogYmVhemxleQogICAgICAgICAgTW9kaWZpZWQgdGhlIFB5dGhvbiBtb2R1bGUgdG8gcmFpc2UgYSBSdW50aW1lIGVycm9yIGlmIGFuIGF0dGVtcHQKICAgICAgICAgIGlzIG1hZGUgdG8gc2V0IGEgcmVhZC1vbmx5IG1lbWJlciBvZiBhIHNoYWRvdyBjbGFzcy4gIFJlcG9ydGVkIGJ5CiAgICAgICAgICBNaWNoZWwgU2FubmVyICgxMS81Lzk5KS4KCjIvMTAvMDAgOiBUaGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0gaGFzIGJlZW4gcmVtb3ZlZC4gSG93ZXZlciwgaXQgaXMgbGlrZWx5CiAgICAgICAgICB0byByZXR1cm4gYXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlLgoKMi8xLzAwICA6IEFkZGVkIGEgbnVtYmVyIG9mIHBlcmZvcm1hbmNlIGVuaGFuY2VtZW50cyB0byB0aGUgUHl0aG9uIHNoYWRvdwogICAgICAgICAgY2xhc3NpbmcgYW5kIHR5cGUtY2hlY2tpbmcgY29kZS4gIENvbnRyaWJ1dGVkIGJ5IFZhZGltIENodWd1bm92LgoKICAgICAgICAgIDEuIFJlbW92ZSBfa3dhcmdzIGFyZ3VtZW50IGZyb20gdGhlIHNoYWRvdyB3cmFwcGVycyB3aGVuIC1rZXl3b3JkCiAgICAgICAgICAgICBvcHRpb24gaXMgbm90IHNwZWNpZmllZC4gVGhpcyBzYXZlcyB1cyBhIGNvbnN0cnVjdGlvbiBvZiBrZXl3b3JkCiAgICAgICAgICAgICBkaWN0aW9uYXJ5IG9uIGVhY2ggbWV0aG9kIGNhbGwuCgogICAgICAgICAgICAgZGVmIG1ldGhvZDEoc2VsZiwgKl9hcmdzLCAqKl9rd2FyZ3MpOgogICAgICAgICAgICAgICAgIHZhbCA9IGFwcGx5KHRlc3QyYy5QeUNsYXNzMV9tZXRob2QxLCAoc2VsZiwpICsgX2FyZ3MsIF9rd2FyZ3MpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbAoKICAgICAgICAgICAgIGJlY29tZXMKCiAgICAgICAgICAgICBkZWYgbWV0aG9kMShzZWxmLCAqX2FyZ3MpOgogICAgICAgICAgICAgICAgIHZhbCA9IGFwcGx5KHRlc3QyYy5QeUNsYXNzMV9tZXRob2QxLCAoc2VsZiwpICsgX2FyZ3MpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbAoKICAgICAgICAgIDIuIEluY29ycG9yYXRlIHNlbGYgaW50byB0aGUgX2FyZ3MgdHVwbGUuICBUaGlzIHNhdmVzIGF0IGxlYXN0IG9uZSB0dXBsZQogICAgICAgICAgICAgYWxsb2NhdGlvbiBwZXIgbWV0aG9kIGNhbGwuCgogICAgICAgICAgICAgZGVmIG1ldGhvZDEoc2VsZiwgKl9hcmdzKToKICAgICAgICAgICAgICAgICB2YWwgPSBhcHBseSh0ZXN0MmMuUHlDbGFzczFfbWV0aG9kMSwgKHNlbGYsKSArIF9hcmdzKQogICAgICAgICAgICAgICAgIHJldHVybiB2YWwKCiAgICAgICAgICAgICBiZWNvbWVzCgogICAgICAgICAgICAgZGVmIG1ldGhvZDEoKl9hcmdzKToKICAgICAgICAgICAgICAgICB2YWwgPSBhcHBseSh0ZXN0MmMuUHlDbGFzczFfbWV0aG9kMSwgX2FyZ3MpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbAoKICAgICAgICAgIDMuIFJlbW92ZSAqUHRyIGNsYXNzZXMuCiAgICAgICAgICAgICBBc3N1bWUgdGhhdCB3ZSBhcmUgU1dJR2dpbmcgYSBjKysgY2xhc3MgQ3BwQ2xhc3MuCiAgICAgICAgICAgICBDdXJyZW50bHkgU1dJRyB3aWxsIGdlbmVyYXRlIGJvdGggQ3BwQ2xhc3NQdHIgY2xhc3MKICAgICAgICAgICAgIHRoYXQgaG9zdHMgYWxsIG1ldGhvZHMgYW5kIGFsc28gQ3BwQ2xhc3MgdGhhdCBpcyBkZXJpdmVkCiAgICAgICAgICAgICBmcm9tIHRoZSBmb3JtZXIgYW5kIGNvbnRhaW5zIGp1c3QgdGhlIGNvbnN0cnVjdG9yLgogICAgICAgICAgICAgV2hlbiBDcHBDbGFzcyBtZXRob2QgaXMgY2FsbGVkLCB0aGUgaW50ZXJwcmV0ZXIgd2lsbCB0cnkKICAgICAgICAgICAgIHRvIGZpbmQgaXQgaW4gdGhlIENwcENsYXNzJ3MgZGljdGlvbmFyeSBmaXJzdCwgYW5kIG9ubHkgdGhlbgogICAgICAgICAgICAgY2hlY2sgdGhlIGJhc2UgY2xhc3MuCgogICAgICAgICAgICAgQ3BwQ2xhc3NQdHIgZnVuY3Rpb25hbGl0eSBtYXkgYmUgZW11bGF0ZWQgd2l0aDoKCiAgICAgICAgICAgICBpbXBvcnQgbmV3CiAgICAgICAgICAgICBfbmV3X2luc3RhbmNlID0gbmV3Lmluc3RhbmNlCiAgICAgICAgICAgICBkZWYgQ3BwQ2xhc3NQdHIodGhpcyk6CiAgICAgICAgICAgICAgICAgIHJldHVybiBfbmV3X2luc3RhbmNlKENwcENsYXNzLCB7InRoaXMiOnRoaXMsInRoaXNvd24iOjB9KQoKICAgICAgICAgICAgIFRoaXMgc2F2ZXMgdXMgb25lIGRpY3Rpb25hcnkgbG9va3VwIHBlciBjYWxsLgoKICAgICAgICAgICAgIDxEQj5UaGUgbmV3IG1vZHVsZSB3YXMgZmlyc3QgYWRkZWQgaW4gUHl0aG9uLTEuNS4yIHNvIGl0CiAgICAgICAgICAgICB3b24ndCB3b3JrIHdpdGggb2xkZXIgdmVyc2lvbnMuICBJJ3ZlIGltcGxlbWVudGVkIGFuCiAgICAgICAgICAgICBhbHRlcm5hdGl2ZSB0aGF0IGFjaGlldmVzIHRoZSBzYW1lIHRoaW5nPC9EQj4KCiAgICAgICAgICA0LiBVc2UgQ09iamVjdHMgaW5zdGVhZCBvZiBzdHJpbmdzIGZvciBwb2ludGVycy4KCiAgICAgICAgICBEYXZlOiBUaGlzIGVuaGFuY2VtZW50cyByZXN1bHQgaW4gc3BlZWR1cHMgb2YgdXAgdG8gNTAlIGluIHNvbWUKICAgICAgICAgIG9mIHRoZSBwcmVsaW1pbmFyeSB0ZXN0cyBJIHJhbi4KCjIvMS8wMCAgOiBVcGdyYWRlZCB0aGUgUHl0aG9uIG1vZHVsZSB0byB1c2UgYSBuZXcgdHlwZS1jaGVja2luZyBzY2hlbWUgdGhhdAogICAgICAgICAgaXMgbW9yZSBtZW1vcnkgZWZmaWNpZW50LCBwcm92aWRlcyBiZXR0ZXIgcGVyZm9ybWFuY2UsIGFuZAogICAgICAgICAgaXMgbGVzcyBlcnJvciBwcm9uZS4gVW5mb3J0dW5hdGVseSwgaXQgd2lsbCBicmVhayBhbGwgY29kZSB0aGF0CiAgICAgICAgICBkZXBlbmRzIG9uIHRoZSBTV0lHX0dldFB0cigpIGZ1bmN0aW9uIGNhbGwgaW4gdHlwZW1hcHMuCiAgICAgICAgICBUaGVzZSBmdW5jdGlvbnMgc2hvdWxkIGJlIGNoYW5nZWQgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICBpZiAoU1dJR19HZXRQdHIoc3RyaW5nLCZwdHIsIl9Gb29fcCIpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgYmVjb21lcwoKICAgICAgICAgICAgICAgIGlmIChTV0lHX0NvbnZlcnRQdHIocHlvYmosICZwdHIsIFNXSUdfVFlQRV9Gb29fcCkgPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBOb3RlOiBJbiB0aGUgbmV3IGltcGxlbWVudGF0aW9uIFNXSUdfVFlQRV9Gb29fcCBpcyBubyBsb25nZXIKICAgICAgICAgIGEgdHlwZS1zaWduYXR1cmUgc3RyaW5nLCBidXQgcmF0aGVyIGFuIGluZGV4IGludG8gYSB0eXBlCiAgICAgICAgICBlbmNvZGluZyB0YWJsZSB0aGF0IGNvbnRhaW5zIHR5cGUgaW5mb3JtYXRpb24uCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEvMzAvMDAgOiBsb2ljCgkgIENvbmRpdGlvbmFseSBjb21waWxlIGV4cGVyaW1lbnRhbCBjb2RlIHdpdGggLS1lbmFibGUtZXhwZXJpbWVudAoJICBjb25maWd1cmUgZmxhZy4KCSAgRml4IC5jdnNpZ25vcmUgdG8gaWdub3JlIGNvbmZpZ3J1ZSAmIHlhY2MgZ2VuZXJhdGVkIGZpbGVzCgoxLzI4LzAwIDogbG9pYwoJICBBcHBseSBhdXRvbWFrZSBldmVyeXdoZXJlCgkgIEtlZXAgY29uZmlndXJlIHNjcmlwdHMgc28gdGhhdCBwZW9wbGUgYXJlIG5vdCAqZm9yY2VkKiB0byBhdXRvY29uZgogICAgICAgICAgS2VlcCBzb3VyY2VzIGdlbmVyYXRlZCBieSB5YWNjIHNvIHRoYXQgY29tcGlsYXRpb24gd2l0aG91dCB5YWNjCgkgIGlzIHBvc3NpYmxlLgoJICBTb3VyY2UvTFBhcnNlL2NzY2FubmVyLmM6IGNoYW5nZSBseWFjYy5oIGludG8gcGFyc2VyLmggdG8gcGxlYXNlCgkgIGRlZmF1bHQgeWFjYyBnZW5lcmF0aW9uIHJ1bGVzLgoJICBVc2UgQUNfQ09ORklHX1NVQkRJUlMgaW4gY29uZmlndXJlLmluIGluc3RlYWQgb2YgaGFuZCBtYWRlIHNjcmlwdC4KCSAgVXBkYXRlIGFsbCByZWxldmFudCAuY3ZzaWdub3JlIHRvIGluY2x1ZGUgLmRlcHMKCSAgRml4ZWQgbWlzc2luZyA7IGxpbmUgMTM2IFNvdXJjZS9Td2lnL3N3aWcuaAoKMS8xMy8wMCA6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIGEgbnVtYmVyIG9mIG1pbm9yIGVuZC1vZi1maWxlIHBhcnNpbmcgcHJvYmxlbXMgaW4gdGhlCiAgICAgICAgICBwcmVwcm9jZXNzb3IuCgoxLzEzLzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgLWZyZWV6ZSBvcHRpb24gdGhhdCBmb3JjZXMgU1dJRyB0byBmcmVlemUgdXBvbiBleGl0LgogICAgICAgICAgVGhpcyBpcyBvbmx5IHVzZWQgYXMgYSBkZWJ1Z2dpbmcgdG9vbCBzbyB0aGF0IEkgY2FuIG1vcmUKICAgICAgICAgIGVhc2lseSBleGFtaW5lIFNXSUcncyBtZW1vcnkgZm9vdHByaW50LgoKMS8xMy8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIHBhdGNoIHRvIGd1aWxlIG1vZHVsZSBmb3Igc3VwcG9ydGluZyBvcHRpb25hbCBhcmd1bWVudHMKICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IERpZXRlciBCYXJvbi4KCjEvMTMvMDAgOiBsb2ljCgkgIEFkZGVkIC5jdnNpZ25vcmUsIEV4YW1wbGVzLy5jdnNpZ25vcmUsIFNvdXJjZS9ET0gvRG9oLy5jdnNpZ25vcmUKCSAgU291cmNlL1NXSUcxLjEvbWFpbi5jeHg6IEZpeGVkIC1JIGhhbmRsaW5nIGJ1ZwoJICBTb3VyY2UvTW9kdWxlczEuMS9qYXZhLmN4eDogZml4ZWQgY2hhciogLT4gY29uc3QgY2hhciogd2FybmluZ3MgdGhhdCBhcmUKCSAgZXJyb3JzIHdoZW4gY29tcGlsaW5nIHdpdGggZ2NjLTIuOTUuMgoJICBTb3VyY2UvU1dJRzEuMS9tYWluLmN4eDogY2FzdCBjb25zdCBjaGFyKiB0byBjaGFyKiBmb3IgU3RyaW5nX3JlcGxhY2UKCSAgdG9rZW4gYW5kIHJlcCBzaG91bGQgcmVhbGx5IGJlIGNvbnN0LgoKMS8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIEhhcmNvJ3MgSmF2YSBtb2R1bGVzLgoKMS8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIFJldm9rZWQgdGhlICVpZmRlZiwgJWlmbmRlZiwgJWVuZGlmLCAlaWYsICVlbGlmLCBhbmQgJWVsc2UKICAgICAgICAgIGRpcmVjdGl2ZXMuICBUaGVzZSBhcmUgbm8gbG9uZ2VyIG5lZWRlZCBhcyBTV0lHIG5vdyBoYXMgYSByZWFsCiAgICAgICAgICBwcmVwcm9jZXNzb3IuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEvMTIvMDAgOiBiZWF6bGV5CiAgICAgICAgICBNb3ZlZCB0aGUgZG9jdW1lbnRhdGlvbiBtb2R1bGVzIGZyb20gdGhlIFNXSUcgZGlyZWN0b3J5CiAgICAgICAgICB0byB0aGUgTW9kdWxlcyBkaXJlY3RvcnkgKHdoZXJlIHRoZXkgcmVhbGx5IHNob3VsZCBoYXZlIGJlZW4KICAgICAgICAgIHRvIGJlZ2luIHdpdGgpLgoKMS8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIFJlbW92ZWQgdGhlIC1zdGF0IG9wdGlvbiBmb3IgcHJpbnRpbmcgc3RhdGlzdGljcy4gVGhlCiAgICAgICAgICBzdGF0aXN0aWNzIHJlcG9ydGluZyB3YXMgaW5hZGVxdWF0ZSBhbmQgbW9zdGx5IGJyb2tlbgogICAgICAgICAgYW55d2F5LgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxLzEyLzAwIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgLXQgb3B0aW9uIGZvciByZWFkaW5nIGEgdHlwZW1hcCBmaWxlLiAgTW9yZQogICAgICAgICAgdHJvdWJsZSB0aGFuIGl0J3Mgd29ydGguICBKdXN0IGluY2x1ZGUgdHlwZW1hcHMgYXQgdGhlIHRvcAogICAgICAgICAgb2YgdGhlIGludGVyZmFjZSBmaWxlLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxLzEyLzAwIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgJWNoZWNrb3V0IGRpcmVjdGl2ZS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMS8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIFJlbW92ZWQgdGhlIC1jaSBvcHRpb24gZm9yIGZpbGUgY2hlY2tpbi4gICBUb28gcHJvYmxlbWF0aWMKICAgICAgICAgIHRvIGltcGxlbWVudC4gIFByb2JhYmx5IGJldHRlciB0byBqdXN0IHB1dCB5b3VyIFNXSUcgbGlicmFyeQogICAgICAgICAgdW5kZXIgQ1ZTIGluc3RlYWQuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiouCgoxLzExLzAwIDogYmVhemxleQogICAgICAgICAgRGVsZXRlZCB0aGUgTEFURVggbW9kdWxlLiAgU29ycnkuLi4gRGlkbid0IGtub3cgYW55b25lCiAgICAgICAgICB3aG8gd2FzIHVzaW5nIGl0LiAgQmVzaWRlcywgSSdtIGxvb2tpbmcgdG8gc2ltcGxpZnkKICAgICAgICAgIHRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMS8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIE1vZGlmaWVkIHRoZSBBU0NJSSBkb2N1bWVudGF0aW9uIG1vZHVsZSB0byB1c2UgYSAudHh0CiAgICAgICAgICBzdWZmaXggZm9yIGl0cyBvdXRwdXQgZmlsZSBpbnN0ZWFkIG9mIC5kb2MuCgoxLzExLzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgdGhlIGxvbmctbG9zdCBTV0lHIHByZXByb2Nlc3NvciBiYWNrIHRvIHRoZSBzeXN0ZW0uCiAgICAgICAgICBJdCBzaG91bGQgYmUgZW5hYmxlZCBieSBkZWZhdWx0LiAgUmF3IHByZXByb2Nlc3NlZCBvdXRwdXQKICAgICAgICAgIGNhbiBiZSB2aWV3ZWQgdXNpbmcgc3dpZyAtRSBmaWxlLmkuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxLzExLzAwIDogYmVhemxleSBhbmQgZGptaXRjaGUKICAgICAgICAgIENvbXBsZXRlbHkgcmVvcmdhbml6ZWQgdGhlIFNXSUcgZGlyZWN0b3J5IHN0cnVjdHVyZS4gIFRoZQogICAgICAgICAgYmFzaWMgb3JnYW5pemF0aW9uIGlzIG5vdzoKCiAgICAgICAgICAgICAgICBTb3VyY2UvICAgICAgICAgU1dJRyBzb3VyY2UgY29kZQogICAgICAgICAgICAgICAgTGliLyAgICAgICAgICAgIFNXSUcgbGlicmFyeSBmaWxlcyAoc3dpZ19saWIpCiAgICAgICAgICAgICAgICBEb2MvICAgICAgICAgICAgRG9jdW1lbnRhdGlvbgogICAgICAgICAgICAgICAgRXhhbXBsZXMvICAgICAgIEV4YW1wbGVzCgogICAgICAgICAgTW9yZSBkaXJlY3RvcmllcyB3aWxsIGJlIGFkZGVkIGFzIG5lZWRlZC4KCjEyLzA4Lzk5OiBMb2ljIERhY2hhcnkgKGxvaWNAc2VuZ2Eub3JnKQoJICBFbmhhbmNlZCBwYWNrYWdlIGhhbmRsaW5nIGZvciBwZXJsNSBhbmQgYysrLgoKCSAgV2l0aCBuZXcgb3B0aW9uIC1oaWRlIEZvbzo6QmFyLCBldmVyeSBwZXJsNSBvYmplY3QgKEZyb2IpIGlzCgkgIHF1YWxpZmllZCBieSBGb286OkJhcjo6RnJvYi4gVGhlIHBhY2thZ2UgbmFtZSBpcyBzb2xlbHkgdXNlZAoJICB0byBlbmNhcHN1bGF0ZSBDL0MrKyB3cmFwcGVycyBvdXRwdXQgaW4gPG1vZHVsZT5fd3JhcC5jIGFuZCB0aGUKCSAgY29ycmVzcG9uZGluZyBwZXJsIHBhY2thZ2UgaW4gPG1vZHVsZT4ucG0uIE5vdGUgdGhhdCBhIHBhY2thZ2UKCSAgbmFtZSBtYXkgY29udGFpbiA6OiAoRnJvYjo6Tml0eikgYW5kIHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlCgkgIHBhY2thZ2UgbmFtZSBwcm92aWRlZCBieSAtaGlkZSAoRm9vOjpCYXI6OkZyb2I6Ok5pdHopLgoKCSAgSW4gKl93cmFwLmMsIFNXSUdfaW5pdCBtYWNybyBpcyB1c2VkLiBXYXMgcHJldmlvdXNseSBkZWZpbmVkCgkgIGJ1dCBub3QgdXNlZCBhbmQgc2ltcGxpZmllcyBjb2RlLgoKCSAgQWRkZWQgdHlwZW1hcChwZXJsNSxwZXJsNWluKSBhbmQgdHlwZW1hcChwZXJsNSxwZXJsNW91dCkgdGhhdAoJICBkbyB0aGUgZXF1aXZhbGVudCBvZiB0eXBlbWFwKHBlcmw1LGluKSBhbmQgdHlwZW1hcChwZXJsNSxvdXQpCgkgIGJ1dCBjb250YWluIHBlcmwgY29kZSBhbmQgYXBwbGllcyB0byB3cmFwcGVycyBnZW5lcmF0ZWQgYnkKCSAgLXNoYWRvdy4KCgkgIExhY2tpbmcgcHJvcGVyIHJlZ3Jlc3Npb24gdGVzdHMgSSB1c2VkCgkgIEV4YW1wbGVzL3Blcmw1L3tjKyssY29uc3RyYWludCxkZWZhcmcsZXhjZXB0LAoJICBncmFwaC9ncmFwaFsxMjM0XSxtdWx0aW5oZXJpdCxuZXN0ZWQsc2hhZG93LHNpbXBsZSx0cmVlLAoJICB0eXBlbWFwcy97YXJndixhcmd2MixhcnJheW1lbWJlcixkYXRhYmFzZSxmaWxlLGlnbm9yZSxpbnRlZ2VyLAoJICBvdXRwdXQscGFzc3JlZixyZWZlcmVuY2UscmV0dXJufX0vLiBJIHJhbiBzd2lnIHdpdGggYW5kIHdpdGhvdXQKCSAgdGhlIHBhdGNoZXMsIGRpZmYgdGhlIGdlbmVyYXRlZHNvdXJjZXMsIHJ1biB0aGUgLnBsIGZpbGVzCgkgIGFuZCBjaGVja2VkIHRoYXQgdGhlIHJlc3VsdHMgYXJlIGlkZW50aWNhbC4gSW4gYWxsIHRob3NlIGV4YW1wbGVzCgkgIEkgaGFkIG5vIGVycm9yLgoKMTEvMjEvOTk6IE1vZGlmaWVkIHRoZSBUY2wgbW9kdWxlIHRvIHByb3ZpZGUgZnVsbCB2YXJpYWJsZSBsaW5raW5nIGNhcGFiaWxpdGllcwogICAgICAgICAgdG8gYWxsIGRhdGF0eXBlcy4gICBJbiBwcmV2aW91cyB2ZXJzaW9ucywgYSBwYWlyIG9mIGFjY2Vzc29yIGZ1bmN0aW9ucwogICAgICAgICAgd2VyZSBjcmVhdGVkIGZvciBkYXRhdHlwZXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIFRjbF9MaW5rVmFyKCkgZnVuY3Rpb24uCiAgICAgICAgICBOb3csIHdlIHNpbXBseSB1c2UgdmFyaWFibGUgdHJhY2VzIHRvIHN1cHBvcnQgZXZlcnl0aGluZy4gVGhpcyBtYXkKICAgICAgICAgIGJyZWFrIHNjcmlwdHMgdGhhdCByZWx5IHVwb24gdGhlIG9sZGVyIGJlaGF2aW9yLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8yMS85OTogQWRkZWQgc2xpZ2h0IHR3ZWFrIHRvIHdyYXBwZXIgZ2VuZXJhdG9yIHRvIGNvbGxlY3QgbG9jYWwgdmFyaWFibGVzCiAgICAgICAgICBvZiBzaW1pbGFyIHR5cGUuICBQcm9kdWNlcyBzb21ld2hhdCBtb3JlIGNvbXBhY3Qgd3JhcHBlciBjb2RlLgoKMTEvMjAvOTk6IE1vZGlmaWVkIHRoZSBUY2wgbW9kdWxlIHRvIHVzZSBTV0lHX0dldEFyZ3MoKSB0byBwYXJzZQogICAgICAgICAgYXJndW1lbnRzLiAgICBUaGlzIGlzIGEgdGVjaG5pcXVlIGJvcnJvd2VkIGZyb20gUHl0aG9uIGluIHdoaWNoCiAgICAgICAgICBhcmd1bWVudHMgYXJlIGNvbnZlcnRlZCB1c2luZyBhIGZvcm1hdCBzdHJpbmcgY29udmVudGlvbiBzaW1pbGlhcgogICAgICAgICAgdG8gZnByaW50ZigpLiAgIFRoaXMgcmVzdWx0cyBpbiBhICpzdWJzdGFudGlhbCogcmVkdWN0aW9uIGluIHRoZQogICAgICAgICAgc2l6ZSBvZiB0aGUgcmVzdWx0aW5nIHdyYXBwZXIgY29kZSB3aXRoIG9ubHkgYSBtb2Rlc3QgcnVudGltZSBvdmVyaGVhZAogICAgICAgICAgaW4gZ29pbmcgdGhyb3VnaCB0aGUgZXh0cmEgY29udmVyc2lvbiBmdW5jdGlvbi4KCjExLzEzLzk5OiBDb21wbGV0ZWx5IHJld3JvdGUgdGhlIGNsYXNzL3N0cnVjdHVyZSBnZW5lcmF0aW9uIGNvZGUgZm9yIHRoZQogICAgICAgICAgVGNsIG1vZHVsZS4gIE5vdywgYSBzbWFsbCBzZXQgb2YgcnVudGltZSBmdW5jdGlvbnMgYXJlIHVzZWQKICAgICAgICAgIHRvIGltcGxlbWVudCB0aGUgZnVuY3Rpb25hbGl0eSBmb3IgYWxsIGNsYXNzZXMgKGluc3RlYWQgb2YgYQogICAgICAgICAgbWFzc2l2ZSBhbW91bnQgb2YgcnVudGltZSBjb2RlIGJlaW5nIGdlbmVyYXRlZCBmb3IgZWFjaCBjbGFzcykuCiAgICAgICAgICBDbGFzcyBzcGVjaWZpYyBpbmZvcm1hdGlvbiBpcyBzaW1wbHkgZW5jb2RlZCBpbiBhIHNlcmllcyBvZgogICAgICAgICAgc3RhdGljIHRhYmxlcy4gICBUaGlzIHJlc3VsdHMgaW4gYSAqSFVHRSogcmVkdWN0aW9uIGluIHdyYXBwZXIKICAgICAgICAgIGNvZGUgc2l6ZS0tZXNwZWNpYWxseSBmb3IgQysrLgoKMTEvMTMvOTk6IFJlbW92ZWQgdGhlIC10Y2wgKFRjbCA3LngpIG1vZHVsZS4gIFRjbCA4LjAgaXMgbm93IHNldmVyYWwKICAgICAgICAgIHllYXJzIG9sZCBhbmQgdGhlIGRlZmFjdG8gc3RhbmRhcmQtLW5vIHJlYWwgcmVhc29uIHRvIGtlZXAKICAgICAgICAgIHN1cHBvcnRpbmcgdGhlIG9sZCB2ZXJzaW9uIGF0IHRoaXMgcG9pbnQuCgoxMS8xMy85OTogQ2xlYW5lZCB1cCAtYyBvcHRpb24gZm9yIFB5dGhvbiBtb2R1bGUuICBUaGUgcHlleHAuc3dnIGZpbGUKICAgICAgICAgIGlzIG5vdyBnb25lLgoKMTEvMTMvOTk6IEZpeGVkIGV4dGVybmFsIGRlY2xhcmF0aW9ucyB0byB3b3JrIGJldHRlciB3aXRoIHN0YXRpYyBsaW5raW5nCiAgICAgICAgICBvbiBXaW5kb3dzLiAgU3RhdGljIGxpbmtpbmcgc2hvdWxkIG5vdyBiZSBwb3NzaWJsZSBieSBkZWZpbmluZwogICAgICAgICAgdGhlIC1EU1RBVElDX0xJTksgb3B0aW9uIG9uIHRoZSBjb21tYW5kIGxpbmUuICBQYXRjaCBjb250cmlidXRlZAogICAgICAgICAgYnkgQWxiZXJ0byBGb25zZWNhLgoKMTEvNS85OSA6IEZpeGVkIGFuIG9ic2N1cmUgY29kZSBnZW5lcmF0aW9uIGJ1ZyByZWxhdGVkIHRvIHRoZSBnZW5lcmF0aW9uCiAgICAgICAgICBvZiBkZWZhdWx0IGNvbnN0cnVjdG9ycy4gICBCdWcgcmVwb3J0ZWQgYnkgQnJhZCBDbGVtZW50cy4KCjExLzUvOTkgOiBGaXhlZCBhIGZldyBtZW1vcnkgcHJvYmxlbXMgZm91bmQgYnkgcHVyaWZ5LgoKMTEvNS85OSA6IE9mZmljaWFsbHkgZGVwcmVjYXRlZCB0aGUgLWh0Y2wsIC1odGssIGFuZCAtcGx1Z2luIG9wdGlvbnMKICAgICAgICAgIGZyb20gdGhlIFRjbCBhbmQgVGNsOCBtb2R1bGVzLgoKMTAvMjYvOTk6IFJlbW92ZWQgdW51c2VkIHZhcmlhYmxlIGZyb20gcHl0aG9uL3R5cGVtYXBzLmkuICBQYXRjaAogICAgICAgICAgY29udHJpYnV0ZWQgYnkgS2VpdGggRGF2aWRzb24uCgo4LzE2Lzk5IDogQWRkZWQgX1dJTjMyIHN5bWJvbCB0byBsaWJyYXJpZXMgdG8gYmV0dGVyIHN1cHBvcnQgV2luZG93cy4KCjgvMTYvOTkgOiBEZXByZWNhdGVkIHRoZSBQZXJsNCBtb2R1bGUuICAgSXQgaXMgbm8gbG9uZ2VyIGluY2x1ZGVkIGluIHRoZQogICAgICAgICAgZGlzdHJpYnV0aW9uIGFuZCBubyBsb25nZXIgc3VwcG9ydGVkLiAgSW4gdGhlIGVudGlyZSAzIHllYXJzIFNXSUcKICAgICAgICAgIGhhcyBiZWVuIGFyb3VuZCBJIG5ldmVyIHJlY2VpdmVkIGEgc2luZ2xlIGNvbW1lbnQgYWJvdXQgaXQgc28gSSdtCiAgICAgICAgICBhc3N1bWluZyBubyBvbmUgd2lsbCBtaXNzIGl0Li4uCgo4LzE2Lzk5IDogTW9kaWZpZWQgdGhlIHR5cGUtY2hlY2tpbmcgY29kZSB0byByZWdpc3RlciB0eXBlIG1hcHBpbmdzIHVzaW5nIGEKICAgICAgICAgIHRhYmxlIGluc3RlYWQgb2YgcmVwZWF0ZWQgY2FsbHMgdG8gU1dJR19SZWdpc3Rlck1hcHBpbmcoKS4gIFRoaXMKICAgICAgICAgIHJlZHVjZXMgdGhlIHNpemUgb2YgdGhlIG1vZHVsZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBzb21ld2hhdC4KCjgvMTUvOTkgOiBDbGVhbmVkIHVwIHRoZSBwb2ludGVyIHR5cGUtY2hlY2tpbmcgY29kZSBpbiB0aGUgVGNsIG1vZHVsZS4KCjgvMTUvOTkgOiBNYW55IGNoYW5nZXMgdG8gdGhlIGxpYnJhcmllcyB0byBzdXBwb3J0IHJ1bnRpbWUgbGlicmFyaWVzLgoKOC8xMy85OSA6IEVsaW1pbmF0ZWQgQysrIGNvbXBpbGVyIHdhcm5pbmcgbWVzc2FnZXMgYWJvdXQgZXh0ZXJuICJDIiBsaW5rYWdlLgoKOC8xMy85OSA6IFNvbWUgY2xlYW51cCBvZiBQeXRob24gLnN3ZyBmaWxlcyB0byBiZXR0ZXIgc3VwcG9ydCBydW50aW1lIGxpYnJhcmllcwogICAgICAgICAgb24gV2luZG93cy4KCjgvMTMvOTkgOiBNb2RpZmllZCB0aGUgJXByYWdtYSBkaXJlY3RpdmUgdG8gYXR0YWNoIHByYWdtYXMgZGVjbGFyZWQgaW5zaWRlCiAgICAgICAgICBhIGNsYXNzIGRlZmluaXRpb24gdG8gdGhlIGNsYXNzIGl0c2VsZi4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBjbGFzcyBmb28gewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICVwcmFnbWEocHl0aG9uKSBhZGR0b21ldGhvZCA9ICJpbnNlcnQ6cHJpbnQgYGhlbGxvIHdvcmxkJyIKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgIE1vc3QgcGVvcGxlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgaG93IHRoaXMgd29ya3MuICBGb3IgcGVvcGxlCiAgICAgICAgICB3cml0aW5nIGJhY2tlbmQgbW9kdWxlcywgY2xhc3MtYmFzZWQgcHJhZ21hcyB3b3JrIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgbGFuZy0+Y3BwX29wZW5fY2xhc3MoKSAgICAgICAgICAgICAvLyBPcGVuIGEgY2xhc3MKICAgICAgICAgICAgICBsYW5nLT5jcHBfcHJhZ21hKCkgICAgICAgICAgICAgICAgIC8vIFN1cHBseSBwcmFnbWFzCiAgICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbWl0IG1lbWJlcnMKCiAgICAgICAgICAgICAgbGFuZy0+Y3BwX2Nsb3NlX2NsYXNzKCkgICAgICAgICAgICAvLyBDbG9zZSB0aGUgY2xhc3MKCiAgICAgICAgICBBbGwgb2YgdGhlIHByYWdtYXMgYXJlIHBhc3NlZCBmaXJzdCBzaW5jZSB0aGV5IG1pZ2h0IGJlIHVzZWQgdG8KICAgICAgICAgIGFmZmVjdCB0aGUgY29kZSBnZW5lcmF0aW9uIG9mIG90aGVyIG1lbWJlcnMuICAgUGxlYXNlIHNlZQogICAgICAgICAgdGhlIFB5dGhvbiBtb2R1bGUgZm9yIGFuIGV4YW1wbGUuICAgUGF0Y2hlcyBjb250cmlidXRlZAogICAgICAgICAgYnkgUm9iaW4gRHVubi4KCjgvMTMvOTkgOiBQYXRjaCB0byBQeXRob24gc2hhZG93IGNsYXNzZXMgdG8gZWxpbWluYXRlIGlnbm9yZWQKICAgICAgICAgIGV4Y2VwdGlvbiBlcnJvcnMgaW4gZGVzdHJ1Y3RvcnMuICBQYXRjaCBjb250cmlidXRlZAogICAgICAgICAgYnkgUm9iaW4gRHVubi4KCjgvMTEvOTkgOiBNaW5vciBwYXRjaCB0byBzd2lnX2xpYi9weXRob24vc3dpZ3B0ci5zd2cgIChhZGRlZCBTV0lHU1RBVElDCiAgICAgICAgICBkZWNsYXJhdGlvbikuICBQYXRjaCBjb250cmlidXRlZCBieSBMeWxlIEpvaG5zb24uCgo4LzExLzk5IDogQWRkZWQgRklSU1RLRVkvTkVYVEtFWSBtZXRob2RzIHRvIFBlcmw1IHNoYWRvdyBjbGFzc2VzCiAgICAgICAgICBQYXRjaCBjb250cmlidXRlZCBieSBEZW5uaXMgTWFyc2EuCgo4LzExLzk5IDogTW9kaWZpZWQgUHl0aG9uIG1vZHVsZSBzbyB0aGF0IE5VTEwgcG9pbnRlcnMgYXJlIHJldHVybmVkCiAgICAgICAgICBhbmQgcGFzc2VkIGFzICdOb25lLicgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IFRhbCBTaGFsaWYuCgo4LzEwLzk5IDogRml4ZWQgbWlzc2luZyAnaW50JyBzcGVjaWZpZXJzIGluIHZhcmlvdXMgcGxhY2VzLgoKOC8xMC85OSA6IEFkZGVkIFdpbmRvd3MgbWFrZWZpbGUgZm9yIFJ1bnRpbWUgbGlicmFyaWVzLiAgQ29udHJpYnV0ZWQKICAgICAgICAgIGJ5IEJvYiBUZWNoZW50aW4uCgo4LzEwLzk5IDogRml4ZWQgbWlub3IgcHJvYmxlbSBpbiBQeXRob24gcnVudGltZSBtYWtlZmlsZSBpbnRyb2R1Y2VkCiAgICAgICAgICBieSBrZXl3b3JkIGFyZ3VtZW50cy4KCjgvOC85OSAgOiBDaGFuZ2VkICR0YXJnZXQgb2YgcGVybDUob3V0KSB0eXBlbWFwIGZyb20gU1QoMCkgdG8KICAgICAgICAgIFNUKGFyZ3ZpKS4gIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IEdlb2ZmcmV5IEhvcnQuCgo4LzgvOTkgIDogRml4ZWQgYnVnIGluIHR5cGVtYXAgY2hlY2tpbmcgcmVsYXRlZCB0byB0aGUgQU5ZIGtleXdvcmQKICAgICAgICAgIGluIGFycmF5cyBhbmQgaWdub3JlZCBhcmd1bWVudHMuICBFcnJvciByZXBvcnRlZCBieQogICAgICAgICAgR2VvZmZyZXkgSG9ydC4KCjgvOC85OSAgOiAlZW5hYmxlZG9jIGFuZCAlZGlzYWJsZWRvYyBkaXJlY3RpdmVzIGNhbiBub3cgYmUgdXNlZAogICAgICAgICAgaW5zaWRlIGNsYXNzL3N0cnVjdHVyZSBkZWZpbml0aW9ucy4gICBIb3dldmVyLCBubyBjaGVjawogICAgICAgICAgaXMgbWFkZSB0byBzZWUgaWYgdGhleSBhcmUgYmFsYW5jZWQgKGkuZS4sIGEgJWRpc2FibGVkb2MKICAgICAgICAgIGRpcmVjdGl2ZSBpbnNpZGUgYSBjbGFzcyBkb2VzIG5vdCBoYXZlIHRvIGhhdmUgYSBtYXRjaGluZwogICAgICAgICAgJWVuYWJsZWRvYyBpbiB0aGUgc2FtZSBjbGFzcykuCgo4LzgvOTkgIDogS2V5d29yZCBhcmd1bWVudCBoYW5kbGluZyBpcyBub3cgc3VwcG9ydGVkIGluIHRoZSBQeXRob24KICAgICAgICAgIG1vZHVsZS4gICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGludCBmb28oY2hhciAqYmFyLCBpbnQgc3BhbSwgZG91YmxlIHgpOwoKICAgICAgICAgIENhbiBiZSBjYWxsZWQgZnJvbSBQeXRob24gYXMKCiAgICAgICAgICAgICAgIGZvbyh4ID0gMy40LCBiYXI9ImhlbGxvIiwgc3BhbT00MikKCiAgICAgICAgICBUbyBlbmFibGUgdGhpcyBmZWF0dXJlLCBydW4gU1dJRyB3aXRoIHRoZSAnLWtleXdvcmQnIGNvbW1hbmQKICAgICAgICAgIGxpbmUgb3B0aW9uLiAgICBNaXhpbmcga2V5d29yZCBhbmQgZGVmYXVsdCBhcmd1bWVudHMKICAgICAgICAgIHNob3VsZCB3b3JrIGFzIHdlbGwuICAgVW5uYW1lZCBhcmd1bWVudHMgYXJlIGFzc2lnbmVkIG5hbWVzCiAgICAgICAgICBzdWNoIGFzICJhcmcxIiwgImFyZzIiLCBldGMuLi4KCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgIEZ1bmN0aW9ucyB3aXRoIGR1cGxpY2F0ZSBhcmd1bWVudCBuYW1lcyBzdWNoIGFzCiAgICAgICAgICBiYXIoaW50ICpPVVRQVVQsIGludCAqT1VUUFVUKSB3aWxsIGxpa2VseSBjYXVzZSBwcm9ibGVtYXRpYwogICAgICAgICAgd3JhcHBlciBjb2RlIHRvIGJlIGdlbmVyYXRlZC4gICBUbyBmaXggdGhpcywgIHVzZSBkaWZmZXJlbnQKICAgICAgICAgIG5hbWVzIG9yIHVzZSAlYXBwbHkgdG8gbWFwIHR5cGVtYXBzIHRvIGFsdGVybmF0ZSBuYW1lcy4KCjgvOC85OSAgOiBIYW5kbGluZyBvZiB0aGUgJ3RoaXMnIHBvaW50ZXIgaGFzIGJlZW4gY2hhbmdlZCBpbiBQeXRob24gc2hhZG93CiAgICAgICAgICBjbGFzc2VzLiAgUHJldmlvdXNseSwgZGVyZWZlcmVuY2luZyBvZiAnLnRoaXMnIG9jY3VycmVkIGluIHRoZQogICAgICAgICAgUHl0aG9uIHNoYWRvdyBjbGFzcyBpdHNlbGYuICAgTm93LCB0aGlzIHN0ZXAgb2NjdXJzIGluIHRoZSBDCiAgICAgICAgICB3cmFwcGVycyB1c2luZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uOgoKICAgICAgICAgICAgICAgIFNXSUdfR2V0UHRyT2JqKFB5T2JqZWN0ICosIHZvaWQgKipwdHIsIGNoYXIgKnR5cGUpCgogICAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYWNjZXB0IGVpdGhlciBhIHN0cmluZyBjb250YWluaW5nIGEgcG9pbnRlcgogICAgICAgICAgb3IgYSBzaGFkb3cgY2xhc3MgaW5zdGFuY2Ugd2l0aCBhICcudGhpcycgYXR0cmlidXRlIG9mCiAgICAgICAgICBhcHByb3ByaWF0ZSB0eXBlLiAgVGhpcyBjaGFuZ2UgYWxsb3dzIHRoZSBmb2xsb3dpbmc6CgogICAgICAgICAgMS4gIFRoZSByZWFsIHNoYWRvdyBjbGFzcyBpbnN0YW5jZSBmb3IgYW4gb2JqZWN0IGlzCiAgICAgICAgICAgICAgcGFzc2VkIHRvIHRoZSBDIHdyYXBwZXJzIHdoZXJlIGl0IGNhbiBiZSBleGFtaW5lZC9tb2RpZmllZAogICAgICAgICAgICAgIGJ5IHR5cGVtYXBzLgoKICAgICAgICAgIDIuICBIYW5kbGluZyBvZiBkZWZhdWx0L2tleXdvcmQgYXJndW1lbnRzIGlzIG5vdyBncmVhdGx5CiAgICAgICAgICAgICAgc2ltcGxpZmllZC4KCiAgICAgICAgICAzLiAgVGhlIFB5dGhvbiB3cmFwcGVyIGNvZGUgaXMgbXVjaCBtb3JlIHNpbXBsZS4KCiAgICAgICAgICBQbHVzLCBpdCBlbGltaW5hdGVkIG1vcmUgdGhhbiAzMDAgbGluZXMgb2YgQysrIGNvZGUgaW4gdGhlCiAgICAgICAgICBQeXRob24gbW9kdWxlLgoKICAgICAgICAgICoqKiBDQVZFQVQgOiBUaGlzIHJlcXVpcmVzIHRoZSBhYnN0cmFjdCBvYmplY3QgaW50ZXJmYWNlLgogICAgICAgICAgSXQgc2hvdWxkIHdvcmsgd2l0aCBQeXRob24gMS40LCBidXQgcHJvYmFibHkgbm90aGluZyBvbGRlcgogICAgICAgICAgdGhhbiB0aGF0LgoKCjgvOC85OSAgOiBGaXhlZCBoYW5kbGluZyBvZiAiY29uc3QiIGFuZCBwb2ludGVycyBpbiBjbGFzc2VzLiAgSW4gcGFydGljdWxhciwKICAgICAgICAgIGRlY2xhcmF0aW9ucyBzdWNoIGFzCgogICAgICAgICAgIGNsYXNzIGZvbyB7CiAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1zZzsKICAgICAgICAgICAgIGNvbnN0IGludCAgKmlwdHI7CiAgICAgICAgICB9CgogICAgICAgICAgYXJlIGhhbmRsZWQgYXMgYXNzaWduYWJsZSB2YXJpYWJsZXMgYXMgb3Bwb3NlZCB0byBjb25zdGFudAogICAgICAgICAgdmFsdWVzICh0aGlzIGlzIHRoZSBjb3JyZWN0IGJlaGF2aW9yIGluIEMvQysrKS4gICBOb3RlOgogICAgICAgICAgZGVjbGFyYXRpb25zIHN1Y2ggYXMgImNoYXIgKmNvbnN0IG1zZyIgYXJlIHN0aWxsIHVuc3VwcG9ydGVkLgogICAgICAgICAgQ29uc3RhbnRzIGRlY2xhcmVkIGF0IHRoZSBnbG9iYWwgbGV2ZWwgdXNpbmcgY29uc3QgYXJlIGFsc28KICAgICAgICAgIGJyb2tlbiAoYmVjYXVzZSBJIGhhdmUgYSBudW1iZXIgb2YgaW50ZXJmYWNlcyB0aGF0IHJlbHkgdXBvbgogICAgICAgICAgdGhpcyBiZWhhdmlvcikuCgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqICBUaGlzIG1heSBicmVhayBpbnRlcmZhY2VzIHRoYXQKICAgICAgICAgIG1pc3Rha2VubHkgdHJlYXQgJ2NvbnN0IGNoYXIgKicgdHlwZXMgYXMgY29uc3RhbnQgdmFsdWVzLgoKOC84Lzk5ICA6IE1vZGlmaWVkIHRoZSBwYXJzZXIgdG8gc3VwcG9ydCBiaXQtZmllbGRzLiAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICB0eXBlZGVmIHN0cnVjdCB7CiAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGlzX2tleXdvcmQgOiAxOwogICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpc19leHRlcm4gIDogMTsKICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaXNfc3RhdGljICA6IDE7CiAgICAgICAgICB9IGZsYWdzOwoKICAgICAgICAgIEJpdC1maWVsZHMgY2FuIG9ubHkgYmUgYXBwbGllZCB0byBpbnRlZ2VyIHR5cGVzIGFuZCB0aGVpcgogICAgICAgICAgYXJlIG90aGVyIHJlc3RyaWN0aW9ucy4gIFNXSUcgcGVyZm9ybXMgbm8gc3VjaCB0eXBlLWNoZWNraW5nCiAgICAgICAgICAoYWx0aG91Z2ggdGhlIEMgY29tcGlsZXIgd2lsbCBjYXRjaCBwcm9ibGVtcyB3aGVuIGl0IHRyaWVzIHRvCiAgICAgICAgICBjb21waWxlIHRoZSB3cmFwcGVyIGNvZGUpLgoKOC84Lzk5ICA6IFJlbW92ZWQgdHJhaWxpbmcgc3BhY2Ugb2YgJGJhc2V0eXBlIHN1YnN0aXR1dGlvbiBpbiB0eXBlbWFwcy4KICAgICAgICAgIFRoaXMgaXMgdG8gYWxsb3cgdGhpbmdzIGxpa2UgdGhpczoKCiAgICAgICAgICAldHlwZW1hcChweXRob24sIGFyZ291dCkgc3BhbSoqIE9VVFBVVHsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICBjaGFyKiBhID0gIiRiYXNldHlwZV9wIjsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgIH0KCiAgICAgICAgICAoUGF0Y2ggc3VnZ2VzdGVkIGJ5IE5hdGhhbiBEdW5maWVsZCkuCgo2LzIyLzk5IDogTWFkZSBhIHZlcnkgc2xpZ2h0IHR3ZWFrIHRvIHRoZSBQZXJsNSBzaGFkb3cgY2xhc3MKICAgICAgICAgIGNvZGUgdGhhdCBhbGxvd3MgdHlwZW1hcHMgdG8gYWx0ZXIgdGhlIHJldHVybiB0eXBlCiAgICAgICAgICBvZiBvYmplY3RzICh0byBzdXBwb3J0IHBvbHltb3JwaGljIHR5cGVzKS4gIFBhdGNoCiAgICAgICAgICBjb250cmlidXRlZCBieSBEcmFrZSBEaWVkcmljaC4KCjQvOC85OSAgOiBGaXhlZCBudWxsIHBvaW50ZXIgaGFuZGxpbmcgYnVnIGluIFBlcmwgbW9kdWxlLgogICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgSnVuaW8gSGFtYW5vLgoKMy8xNy85OSA6IEZpeGVkIGJ1ZyBpbiBwZXJsNXB0ci5zd2cgZm9yIEFjdGl2ZVN0YXRlIFBlcmwuCiAgICAgICAgICBQYXRjaCBjb250cmlidXRlZCBieSBHcmVnIEFuZGVyc29uLgoKMi8yNy85OSA6IEVsaW1pbmF0ZWQgc2VnbWVudGF0aW9uIGZhdWx0IHdoZW4gU3dpZyBydW5zIG9uCiAgICAgICAgICBlbXB0eSBmaWxlcy4KCjIvMjcvOTkgOiBBZGRlZCBwYXRjaCB0byBHdWlsZSBtb2R1bGUgdG8gZWxpbWluYXRlIHVudXNlZAogICAgICAgICAgdmFyaWFibGVzLiAgIENvbnRyaWJ1dGVkIGJ5IE1pa2UgU2ltb25zLgoKMi8yNy85OSA6IEZpeGVkIHByb2JsZW0gd2l0aCAlYWRkbWV0aG9kcyByZXR1cm5pbmcgcmVmZXJlbmNlcy4KCjIvMjcvOTkgOiBGaXhlZCBSdW50aW1lL01ha2VmaWxlLiBQYXRjaCBjb250cmlidXRlZCBieQogICAgICAgICAgTWlrZSBSb21iZXJnLgoKMi8yNy85OSA6IEluY29ycG9yYXRlZCBwYXRjaGVzIHRvIHRoZSB0eXBlLWNoZWNrZXIuCgoyLzI3Lzk5IDogRml4ZWQgcHJvYmxlbSB3aXRoIC1leHBvcnRhbGwgc3dpdGNoIGFuZCBzaGFkb3cgY2xhc3NlcwogICAgICAgICAgaW4gUGVybDUgbW9kdWxlLiAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgRGVubmlzIE1hcnNhLgoKMi8yNy85OSA6IE1vZGlmaWVkIFBlcmw1IG1vZHVsZSB0byByZWNvZ25pemUgJ3VuZGVmJyBhcyBhIE5VTEwgY2hhciAqLgogICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgSnVuaW8gSGFtYW5vLgoKMi8yNy85OSA6IEZpeGVkIHRoZSBQZXJsNSBtb2R1bGUgdG8gc3VwcG9ydCB0aGUgbmV3ZXIgdmVyc2lvbnMgb2YKICAgICAgICAgIEFjdGl2ZVN0YXRlIFBlcmwgZm9yIFdpbjMyLgoKMi8yNy85OSA6IEZpeGVkIHRoZSBpbmNsdWRlIG9yZGVyIG9mIGZpbGVzIHNwZWNpZmllZCB3aXRoIHRoZQogICAgICAgICAgLUkgb3B0aW9uLgoKMi81Lzk4LSA6IERhdmUgZmluaXNoZXMgaGlzIGRpc3NlcnRhdGlvbiwgZ29lcyBqb2IgaHVudGluZywgbW92ZXMgdG8KMi81Lzk5ICAgIENoaWNhZ28gYW5kIGdlbmVyYWxseSB0aHJhc2hlcyBhYm91dC4KClZlcnNpb24gMS4xIFBhdGNoIDUgKEZlYnJ1YXJ5IDUsIDE5OTgpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyLzQvOTggIDogRml4ZWQgYSBidWcgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgd2hlbiBkaWZmZXJlbnQgcGFja2FnZQogICAgICAgICAgbG9jYXRpb25zIGFyZSBzcGVjaWZpZWQgKC0td2l0aC10Y2xpbmNsLCBldGMuLi4pLgoKMi8yLzk4ICA6IEZpeGVkIG5hbWUtY2xhc2ggYnVnIHJlbGF0ZWQgdG8gdGhlIHN3aXRjaCB0byBDIG1hY3JvcyBmb3IgYWNjZXNzb3IKICAgICAgICAgIGZ1bmN0aW9ucy4gIFRoZSBuZXcgc2NoZW1lIGRpZCBub3Qgd29yayBjb3JyZWN0bHkgZm9yIG9iamVjdHMKICAgICAgICAgIHdpdGggbWVtYmVycyBzdWNoIGFzICdvYmonLCAndmFsJywgZXRjLi4uICAgRml4ZWQgdGhlIGJ1ZyBieQogICAgICAgICAgYXBwZW5kaW5nIHRoZSB3b3JkICdzd2lnJyB0byBtYWNybyBhcmd1bWVudCBuYW1lcy4gIFBhdGNoCiAgICAgICAgICBjb250cmlidXRlZCBieSBSdWR5IEFsYmFjaHRlbi4KCjIvMi85OCAgOiBTbGlnaHQgZml4IHRvIHRoZSBQZXJsNSBtb2R1bGUgdG8gZWxpbWluYXRlIHdhcm5pbmcgbWVzc2FnZXMKICAgICAgICAgIGFib3V0ICd2YXJuYW1lIHVzZWQgb25seSBvbmNlIDogcG9zc2libGUgdHlwbycuICBGaXgKICAgICAgICAgIGNvbnRyaWJ1dGVkIGJ5IFJ1ZHkgQWxiYWNodGVuLgoKMS85Lzk4ICA6IEZpeGVkIGEgYnVnIGluIHRoZSBQZXJsIDUgbW9kdWxlIHJlbGF0ZWQgdG8gdGhlIGNyZWF0aW9uIG9mCiAgICAgICAgICBjb25zdGFudHMgYW5kIHNoYWRvdyBjbGFzc2VzLgoKMS85Lzk4ICA6IEZpeGVkIGxpbmtpbmcgYnVnIHdpdGggUHl0aG9uIDEuNSBlbWJlZC5pIGxpYnJhcnkgZmlsZS4KClZlcnNpb24gMS4xIFBhdGNoIDQgKEphbnVhcnkgNCwgMTk5OCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMS80Lzk4ICA6IENoYW5nZWQgc3RydWN0dXJlZCBvZiB0aGUgRXhhbXBsZXMgZGlyZWN0b3J5IHRvIGJlIG1vcmUgZnJpZW5kbHkKICAgICAgICAgIHRvIEJvcmxhbmQgQysrLgoKMS80Lzk4ICA6IEFkZGVkIHRoZSBmdW5jdGlvbiBNYWtlZmlsZS53aW4uYmMgZm9yIGNvbXBpbGluZyB0aGUgZXhhbXBsZXMKICAgICAgICAgIHVuZGVyIEJvcmxhbmQgNS4yLgoKMS80Lzk4ICA6IFNsaWdodCBjaGFuZ2UgdG8gdGhlIHBlcmw1IG1vZHVsZSBhbmQgQysrIGNvbXBpbGF0aW9uLiAgVGhlCiAgICAgICAgICA8bWF0aC5oPiBsaWJyYXJ5IGlzIG5vdyBpbmNsdWRlZCBiZWZvcmUgYW55IFBlcmwgaGVhZGVycwogICAgICAgICAgYmVjYXVzZSBQZXJsIHRoZSBleHRlcm4gIkMiIGxpbmthZ2Ugb2YgbWF0aC5oIHNjcmV3cyBhbG90CiAgICAgICAgICBvZiB0aGluZ3MgdXAgKGVzcGVjaWFsbHkgb24gV2luZG93cykuCgoxLzIvOTggIDogQ2hhbmdlIHRvIHRoZSBQeXRob24gbW9kdWxlIHRoYXQgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIGNvbnN0YW50cwogICAgICAgICAgY3JlYXRlZCBieSBDKysgY2xhc3NlcywgaW5oZXJpdGFuY2UsIGFuZCBzaGFkb3cgY2xhc3Nlcy4gICBUaGlzCiAgICAgICAgICBtb2RpZmljYXRpb24gbWF5IGludHJvZHVjZSBhIGZldyBzbGlnaHQgaW5jb21wYXRpYmlsaXRpZXMgaWYKICAgICAgICAgIHlvdSBhdHRlbXB0IHRvIHVzZSB0aGUgbm9uLXNoYWRvdyBjbGFzcyBpbnRlcmZhY2Ugd2l0aCBzaGFkb3cKICAgICAgICAgIGNsYXNzZXMgZW5hYmxlZC4gICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgTWlrZSBSb21iZXJnLgoKMS8yLzk4ICA6IFN1cHBvcnQgZm9yIFRjbCA4LjAgbmFtZXNwYWNlcyBoYXMgYmVlbiBhZGRlZC4gICBUaGlzICpyZXBsYWNlcyoKICAgICAgICAgIHRoZSBvcmlnaW5hbCBTV0lHIG1lY2hhbmlzbSB0aGF0IGFzc3VtZWQgW2luY3IgVGNsXSBuYW1lc3BhY2VzLgogICAgICAgICAgVG8gdXNlIG5hbWVzcGFjZXMsIHNpbXBseSBydW4gU1dJRyB3aXRoIHRoZSBmb2xsb3dpbmcgb3B0aW9ucwoKICAgICAgICAgICAgIHN3aWcgLXRjbCAtbmFtZXNwYWNlICBmb28uaQoKICAgICAgICAgICAgICAgICAgICBUaGlzIHBsYWNlcyBldmVyeXRoaW5nIGluIGEgbmFtZXNwYWNlIHRoYXQgbWF0Y2hlcwogICAgICAgICAgICAgICAgICAgIHRoZSBtb2R1bGUgbmFtZQoKICAgICAgICAgICAgIHN3aWcgLXRjbCAtbmFtZXNwYWNlIC1wcmVmaXggYmFyIGZvby5pCgogICAgICAgICAgICAgICAgICAgIFRoaXMgcGxhY2VzIGV2ZXJ5dGhpbmcgaW4gdGhlIG5hbWVzcGFjZSAnYmFyJwoKICAgICAgICAgIFRoZSB1c2Ugb2YgbmFtZXNwYWNlcyBpcyBuZXcgaW4gVGNsIDguMC4gIEhvd2V2ZXIsIHRoZSB3cmFwcGVyIGNvZGUKICAgICAgICAgIGdlbmVyYXRlZCBieSBTV0lHIHdpbGwgc3RpbGwgd29yayB3aXRoIGFsbCB2ZXJzaW9ucyBvZiBUY2wgbmV3ZXIKICAgICAgICAgIHRoYW4gYW5kIGluY2x1ZGluZyBUY2wgNy4zL1RrMy42IGV2ZW4gaWYgdGhlIC1uYW1lc3BhY2Ugb3B0aW9uIGlzCiAgICAgICAgICB1c2VkLgoKICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgVGhpcyBjaGFuZ2UgbWF5IGJyZWFrIGV4aXN0aW5nIGFwcGxpY2F0aW9ucyB0aGF0IHJlbGllZCBvbiB0aGUKICAgICAgICAgIC1wcmVmaXggYW5kIC1uYW1lc3BhY2Ugb3B0aW9ucy4KCjEvMi85OCAgOiBBZGRlZCB0aGUgZm9sbG93aW5nIGNvbnN0YW50cyB0byB0aGUgVGNsIHdyYXBwZXIgY29kZQoKICAgICAgICAgICAgICAgICBTV0lHX25hbWUgICAgICAtIE5hbWUgb2YgdGhlIFNXSUcgbW9kdWxlCiAgICAgICAgICAgICAgICAgU1dJR19wcmVmaXggICAgLSBQcmVmaXgvbmFtZXNwYWNlIGFwcGVuZGVkIHRvIGNvbW1hbmQgbmFtZXMKICAgICAgICAgICAgICAgICBTV0lHX25hbWVzcGFjZSAtIE5hbWUgb2YgdGhlIG5hbWVzcGFjZQoKICAgICAgICAgIFNXSUcgbGlicmFyeSB3cml0ZXJzIGNhbiB1c2UgdGhlc2UgdG8gdGhlaXIgYWR2YW50YWdlcy4KCjEvMi85OCAgOiBGaXhlZCBhIGJ1ZyBpbiB0aGUgVGNsOCBtb2R1bGUgcmVsYXRlZCB0byB0aGUgY3JlYXRpb24gb2YKICAgICAgICAgIHBvaW50ZXIgY29uc3RhbnRzICh0aGUgZnVuY3Rpb24gU1dJR19NYWtlUHRyIHdhcyBtaXNzaW5nIGZyb20KICAgICAgICAgIHRoZSB3cmFwcGVyIGNvZGUpLgoKMS8yLzk4ICA6IEFkZGVkIHRoZSBjb25zdGhhc2guaSBsaWJyYXJ5IGZpbGUgdG8gdGhlIFRjbCBhbmQgVGNsOCBtb2R1bGVzLgoKMS8xLzk4ICA6IENoYW5nZWQgYW5kIGNsZWFuZWQgdXAgdGhlIFB5dGhvbiB0eXBlbWFwcy5pIGZpbGUuICAgVGhlIGZvbGxvd2luZwogICAgICAgICAgc2lnbmlmaWNhbnQgY2hhbmdlcyB3ZXJlIG1hZGUgOgoKICAgICAgICAgICAgICAgIDEuICBUaGUgT1VUUFVUIHR5cGVtYXAgbm93IHJldHVybnMgUHl0aG9uIHR1cGxlcyBpbnN0ZWFkIG9mCiAgICAgICAgICAgICAgICAgICAgbGlzdHMuICAgTGlzdHMgY2FuIGJlIHJldHVybmVkIGFzIGJlZm9yZSBieSB1c2luZyB0aGUKICAgICAgICAgICAgICAgICAgICBMX09VVFBVVCB0eXBlLiAgICBJZiBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgdmVyc2lvbnMKICAgICAgICAgICAgICAgICAgICBpcyBuZWVkZWQsIHJ1biBTV0lHIHdpdGggdGhlIC1ET1VUUFVUX0xJU1Qgb3B0aW9uLgoKICAgICAgICAgICAgICAgIDIuICBUaGUgQk9USCB0eXBlbWFwIGhhcyBiZWVuIHJlbmFtZWQgdG8gSU5PVVQuICBGb3IgYmFja3dhcmRzCiAgICAgICAgICAgICAgICAgICAgY29tcGF0aWJpbGl0eSwgdGhlICJCT1RIIiBtZXRob2Qgc3RpbGwgZXhpc3RzIGhvd2V2ZXIuCgogICAgICAgICAgICAgICAgMy4gIE91dHB1dCB0eXBlbWFwcyBub3cgZ2VuZXJhdGUgbGVzcyBjb2RlIHRoYW4gYmVmb3JlLgoKICAgICAgICAgIENoYW5nZXMgdG8gdHlwZW1hcHMuaSBtYXkgYnJlYWsgZXhpc3RpbmcgUHl0aG9uIHNjcmlwdHMgdGhhdCBhc3N1bWUKICAgICAgICAgIG91dHB1dCBpbiB0aGUgZm9ybSBvZiBhIGxpc3QuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEyLzMxLzk3OiBGaXhlZCBsb25nIG92ZXJkdWUgcHJvYmxlbXMgd2l0aCB0aGUgdGVzdGluZyBzY3JpcHRzIGFuZCBjZXJ0YWluCiAgICAgICAgICBtYWtlZmlsZXMgdGhhdCByZXF1aXJlZCB0aGUgdXNlIG9mIHRoZSBiYXNoIHNoZWxsLiAgIEV2ZXJ5dGhpbmcgc2hvdWxkCiAgICAgICAgICB3b3JrIHByb3Blcmx5IHdpdGggdGhlIHN0YW5kYXJkIEJvdXJuZSBzaGVsbCAoc2gpIG5vdy4KCjEyLzMxLzk3OiBNb2RpZmllZCB0eXBlbWFwcyB0byBhbGxvdyAkYmFzZXR5cGUgYXMgYSB2YWxpZCBsb2NhbCB2YXJpYWJsZS4KICAgICAgICAgIFRoaXMgYWxsb3dzIGZvciBhbGwgc29ydHMgb2YgYml6YXJyZSBoYWNraXNoIHR5cGVtYXBzIHRoYXQKICAgICAgICAgIGRvIGNvb2wgdGhpbmdzLiAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IERvbWluaXF1ZSBEdW1vbnQuCgoxMi8zMS85NzogU3dpdGNoZWQgYWNjZXNzb3IgZnVuY3Rpb25zIGdlbmVyYXRlZCBmb3IgbWVtYmVyIGRhdGEgdG8KICAgICAgICAgIEMgcHJlcHJvY2Vzc29yIG1hY3JvcyAoZXhjZXB0IGluIGNhc2VzIGludm9sdmluZyB0eXBlbWFwcwogICAgICAgICAgb3IgY2hhciAqKS4KCjEyLzMxLzk3OiBGaXhlZCBhIGJ1ZyByZWxhdGVkIHRvIEMrKyBtZW1iZXIgZGF0YSBpbnZvbHZpbmcgcmVmZXJlbmNlcy4KCjEyLzMxLzk3OiBDaGFuZ2VkIGFjY2Vzc29yIGZ1bmN0aW9ucyBmb3IgQysrIG1lbWJlciBmdW5jdGlvbnMgdG8KICAgICAgICAgIHByZXByb2Nlc3NvciBtYWNyb3MuICAgVGhpcyBjbGVhbnMgdXAgdGhlIHdyYXBwZXIgY29kZQogICAgICAgICAgYW5kIHJlc3VsdHMgaW4gZmV3ZXIgZnVuY3Rpb24gZGVmaW5pdGlvbnMuCgoxMi8zMS85NzogQ2hhbmdlZCB0aGUgZGVmYXVsdCBDIGNvbnN0cnVjdG9yIHRvIHVzZSBjYWxsb2MoKSBpbnN0ZWFkCiAgICAgICAgICBvZiBtYWxsb2MoKQoKMTIvMzAvOTc6IENoYW5nZWQgdGhlIGNyZWF0aW9uIG9mIGNvbnN0YW50cyBpbiB0aGUgUGVybDUgbW9kdWxlLgogICAgICAgICAgRm9yIGFsbCBwcmFjdGljYWwgcHVycG9zZXMsIHRoZXkgc2hvdWxkIHdvcmsgaW4gZXhhY3RseSB0aGUKICAgICAgICAgIHNhbWUgd2F5IGFzIGJlZm9yZSBleGNlcHQgdGhhdCB0aGV5IG5vdyByZXF1aXJlIG11Y2ggbGVzcwogICAgICAgICAgd3JhcHBlciBjb2RlLiAgIE1vZHVsZXMgY29udGFpbmluZyBsYXJnZSBudW1iZXJzIG9mCiAgICAgICAgICBjb25zdGFudHMgbWF5IHNlZSBncmVhdGVyIHRoYW4gYSA1MCUgcmVkdWN0aW9uIGluIHdyYXBwZXIKICAgICAgICAgIGNvZGUgc2l6ZS4KCjEyLzMwLzk3OiBNb2RpZmllZCB0aGUgUHl0aG9uIG1vZHVsZSB0byBiZSBtb3JlIGludGVsbGlnZW50IGFib3V0IHRoZQogICAgICAgICAgY3JlYXRpb24gb2YgY29uc3RhbnRzLiAgU1dJRyBubyBsb25nZXIgZ2VuZXJhdGVzIHJlZHVuZGFudAogICAgICAgICAgZ2xvYmFsIHZhcmlhYmxlcyBhbmQgdGhlIHNpemUgb2YgdGhlIG1vZHVsZSBpbml0aWFsaXphdGlvbgogICAgICAgICAgZnVuY3Rpb24gc2hvdWxkIGJlIHJlZHVjZWQuICAgKE1hbnkgdGhhbmtzIHRvIEppbSBGdWx0b24pLgoKMTIvMjkvOTc6IEZpeGVkIGEgYnVnIGluIEMrKyBjb2RlIGdlbmVyYXRpb24gcmVsYXRlZCB0byBtZW1iZXIgZnVuY3Rpb25zLAogICAgICAgICAgZGVmYXVsdCBhcmd1bWVudHMsIGFuZCByZWZlcmVuY2VzLgoKMTIvMjkvOTc6IEZpeGVkIGNvbmZpZ3VyZSBzY3JpcHQgYW5kIGEgZmV3IG1ha2VmaWxlcyB0byBzdXBwb3J0IFB5dGhvbiAxLjUKCjEyLzI5Lzk3OiBBZGRlZCAnZW1iZWQxNS5pJyBsaWJyYXJ5IGZpbGUuICBUaGlzIGZpbGUgc2hvdWxkIGJlIHVzZWQgdG8KICAgICAgICAgIHN0YXRpY2FsbHkgbGluayB2ZXJzaW9ucyBvZiBQeXRob24gMS41LiAgICBUbyBtYWtlIGl0IHRoZSBkZWZhdWx0LAogICAgICAgICAgc2ltcGx5IGNvcHkgJ3N3aWdfbGliL3B5dGhvbi9lbWJlZDE1LmknIHRvICdzd2lnX2xpYi9weXRob24vZW1iZWQuaScKClZlcnNpb24gMS4xIFBhdGNoIDMgKE5vdmVtYmVyIDI0LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMS8yMy85NzogRml4ZWQgYSBidWcgaW4gdGhlIFBlcmw1IG1vZHVsZSB3aXRoIHNoYWRvdyBjbGFzc2VzIGFuZAogICAgICAgICAgc3RhdGljIGNsYXNzIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBjbGFzcyBpbnN0YW5jZXMuCiAgICAgICAgICBOb3RlIDogVGhlIGZpeCBmb3IgdGhpcyBidWcgcmVxdWlyZXMgYSBzbGlnaHQgcmVzdHJ1Y3R1cmluZyBvZgogICAgICAgICAgb2YgdGhlIC5wbSBmaWxlcyBjcmVhdGVkIGJ5IFNXSUcuCgoxMS8yMy85NzogRml4ZWQgYSBidWcgaW4gdGhlIFRjbC9UY2w4IG1vZHVsZXMgcmVsYXRlZCB0byB2YXJpYWJsZSBsaW5raW5nCiAgICAgICAgICBvZiBjaGFyYWN0ZXIgYXJyYXlzLiAgSWYgeW91IGRlY2xhcmVkIGEgZ2xvYmFsIHZhcmlhYmxlICdjaGFyIGZvb1sxMF0nLAogICAgICAgICAgdGhlIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUgd291bGQgZWl0aGVyIGNhdXNlIGEgc2VnbWVudGF0aW9uIGZhdWx0CiAgICAgICAgICBpbW1lZGlhdGVseSB1cG9uIGxvYWRpbmcgb3Igd2VpcmQgbWVtb3J5IGNvcnJ1cHRpb24gZWxzZXdoZXJlLgogICAgICAgICAgVGhpcyBzaG91bGQgbm93IGJlIGZpeGVkIGFsdGhvdWdoIGNoYXJhY3RlciBhcnJheXMgY2FuIG9ubHkgYmUKICAgICAgICAgIHJlYWQtb25seS4KCjExLzIzLzk3OiBGaXhlZCBhIGJ1ZyB3aXRoIHRoZSAlaW1wb3J0IGRpcmVjdGl2ZSB0aGF0IGNhdXNlZCBpdCB0bwogICAgICAgICAgZmFpbCBpZiBmaWxlcyB3ZXJlIGltcG9ydGVkIGZyb20gZGlyZWN0b3JpZXMgb3RoZXIgdGhhbgogICAgICAgICAgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCgoxMS8yMy85NzogRml4ZWQgaW5jb3JyZWN0IGRpYWdub3N0aWMgbWVzc2FnZSBpbiB0aGUgQVNDSUkgZG9jdW1lbnRhdGlvbgogICAgICAgICAgbW9kdWxlLgoKMTEvMjMvOTc6IENoYW5nZWQgdGhlIGJlaGF2aW9yIG9mIHRoZSAtbyBvcHRpb24gd2hlbiB1c2VkIHdpdGggc2hhZG93CiAgICAgICAgICBjbGFzc2VzLiBJZiAtbyB3YXMgdXNlZCB0byBzcGVjaWZ5IGJvdGggdGhlIHBhdGhuYW1lIGFuZCBmaWxlbmFtZQogICAgICAgICAgb2YgU1dJRydzIG91dHB1dCBzdWNoIGFzCgogICAgICAgICAgICAgICAgIHN3aWcgLW8gL2hvbWUvc3dpZy93cmFwcGVyLmMgLXNoYWRvdyAtcGVybDUgZm9vLmkKCiAgICAgICAgICBUaGUgd3JhcHBlciBjb2RlIHdvdWxkIGJlIHBsYWNlZCB0aGUgZmlsZSBzcGVjaWZpZWQgd2l0aCAtbywKICAgICAgICAgIGJ1dCB0aGUgLnBtIGZpbGUgYW5kIGRvY3VtZW50YXRpb24gd291bGQgYmUgcGxhY2VkIGluIHRoZQogICAgICAgICAgZGlyZWN0b3J5IHdoZXJlIFNXSUcgd2FzIHJ1bi4gICBOb3csIHRoZXNlIGZpbGVzIGFyZSBwbGFjZWQKICAgICAgICAgIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgZmlsZSBzcGVjaWZpZWQgd2l0aCB0aGUgLW8gb3B0aW9uLgogICAgICAgICAgVGhpcyBjaGFuZ2UgaXMgYWxzbyBuZWVkZWQgZm9yIHByb3BlciBvcGVyYXRpb24gb24gdGhlCiAgICAgICAgICBNYWNpbnRvc2guCgoxMS8yMy85NzogQWRkZWQgYSAndGhpcygpJyBtZXRob2QgdG8gUGVybDUgc2hhZG93IGNsYXNzZXMuICAgVGhpcyBjYW4KICAgICAgICAgIGJlIHVzZWQgdG8gcmV0dXJuIHRoZSBub3JtYWwgcG9pbnRlciB2YWx1ZSBmcm9tIGEgc2hhZG93CiAgICAgICAgICBjbGFzcyB0aGF0IGlzIHJlcHJlc2VudGVkIGFzIGEgdGllZCBoYXNoLiAgIFRvIHVzZSBqdXN0CiAgICAgICAgICBpbnZva2UgYXMgYSBtZXRob2QgbGlrZSB0aGlzIDoKCiAgICAgICAgICAgICAgJGwgPSBuZXcgTGlzdDsgICAgICAgIyBDcmVhdGUgYW4gb2JqZWN0CiAgICAgICAgICAgICAgJHB0ciA9ICRsLT50aGlzKCk7ICAgIyBHZXQgdGhlIG5vcm1hbCBwb2ludGVyIHZhbHVlCgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTEvMjMvOTc6IEZpeGVkIHRoZSBUY2wgOCBwb2ludGVyLmkgbGlicmFyeSBmaWxlICh3aGljaCB3YXMgY29tcGxldGVseQogICAgICAgICAgYnJva2VuIGluIDEuMXAyKS4KCjExLzIzLzk3OiBNb2RpZmllZCB0aGUgUGVybDUgdHlwZS1jaGVja2VyIHRvIGZpeCBhIGZldyBwcm9ibGVtcwogICAgICAgICAgd2l0aCBnbG9iYWwgdmFyaWFibGVzIG9mIHBvaW50ZXIgdHlwZXMgYW5kIHRvIGFsbG93CiAgICAgICAgICB0aWVkIGhhc2hlcyB0byBiZSB1c2VkIGludGVyY2hhbmdhYmx5IHdpdGggbm9ybWFsCiAgICAgICAgICBwb2ludGVyIHZhbHVlcy4KCjExLzIzLzk3OiBNb2RpZmllZCB0aGUgdHlwZW1hcCBtZWNoYW5pc20gdG8gYWxsb3cgb3V0cHV0CiAgICAgICAgICB0eXBlbWFwcyBvZiB0eXBlICd2b2lkJy4gICBUaGVzZSB3ZXJlIGlnbm9yZWQgcHJldmlvdXNseSwKICAgICAgICAgIGJ1dCBub3cgaWYgeW91IHNwZWNpZnksCgogICAgICAgICAgICAgICAgJXR5cGVtYXAobGFuZyxvdXQpIHZvaWQgewogICAgICAgICAgICAgICAgICAgICAgLi4uIHJldHVybiBhIHZvaWQgLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgWW91IGNhbiBjaGFuZ2Ugb3IgYXNzaWduIGEgcmV0dXJuIHZhbHVlIHRvIHRoZSBmdW5jdGlvbi4KCjExLzIzLzk3OiBGaXhlZCBwcm9jZXNzaW5nIG9mICdib29sJyBkYXRhdHlwZXMgaW4gdGhlIFB5dGhvbiBtb2R1bGUuCgoxMS8yMy85NzogRml4ZWQgbWlub3IgcGFyc2luZyBlcnJvciB3aXRoIEMrKyBpbml0aWFsaXplcnMuIEZvciBleGFtcGxlLAoKICAgICAgICAgICAgICAgICBjbGFzcyBCIDogcHVibGljIEEgewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICBCKCkgOiBBKCkgeyAuLi4gfTsKICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9CgoxMS8yMy85NzogRml4ZWQgdGhlIFRjbDggbW9kdWxlIHNvIHRoYXQgQyBmdW5jdGlvbnMgdGhhdCBjYWxsIGJhY2sgaW50bwogICAgICAgICAgVGNsIGRvbid0IGNvcnJ1cHQgdGhlIHJldHVybiByZXN1bHQgb2JqZWN0IChTV0lHIHdhcyBnYXRoZXJpbmcKICAgICAgICAgIHRoZSByZXN1bHQgb2JqZWN0IHRvbyBlYXJseSB3aGljaCBsZWFkcyB0byBwcm9ibGVtcyBpZiBzdWJzZXF1ZW50CiAgICAgICAgICBUY2wgY2FsbHMgYXJlIG1hZGUpLgoKMTEvMjMvOTc6IEZpeGVkIGEgY29kZSBnZW5lcmF0aW9uIGJ1ZyBpbiB0aGUgUHl0aG9uIG1vZHVsZSB3aGVuIHR3byBvcgogICAgICAgICAgbW9yZSBvdXRwdXQgcGFyYW1ldGVycyB3ZXJlIHVzZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50cyBvZiBhCiAgICAgICAgICBmdW5jdGlvbi4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgJWluY2x1ZGUgdHlwZW1hcHMuaQogICAgICAgICAgICAgICAgIHZvaWQgZm9vKGRvdWJsZSAqT1VUUFVULCBkb3VibGUgKk9VVFBVVCwgZG91YmxlIGEpOwoKICAgICAgICAgIFByZXZpb3VzbHksIGRvaW5nIHRoaXMgcmVzdWx0ZWQgaW4gdGhlIGNyZWF0aW9uIG9mIGFuCiAgICAgICAgICBleHRyYW5lb3VzIGNvbW1hIGluIHRoZSBvdXRwdXQsIHJlc3VsdGluZyBpbiBhIEMgc3ludGF4IGVycm9yLgoKMTEvMjIvOTc6IEZpeGVkIGEgYnVnIHdoZW4gdGVtcGxhdGUgaGFuZGxpbmcgdGhhdCB3YXMgc3RyaXBwaW5nIHdoaXRlc3BhY2UKICAgICAgICAgIGFyb3VuZCBuZXN0ZWQgdGVtcGxhdGVzLiAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgRm9vPEJhcjxkb3VibGU+ID4KCiAgICAgICAgICB3YXMgZ2V0dGluZyBtdW5nZWQgaW50byBGb288QmFyPj4gd2hpY2ggaXMgYSBzeW50YXggZXJyb3IgaW4KICAgICAgICAgIGluIHRoZSBDKysgY29tcGlsZXIuCgoxMS8yMi85NzogRml4ZWQgYnVncyBpbiB0aGUgQm9ybGFuZCBDKysgbWFrZWZpbGVzLgoKMTEvMjIvOTc6IEZpeGVkIG1lbW9yeSBjb3JydXB0aW9uIGJ1ZyB3aGVuIHByb2Nlc3NpbmcgaW50ZWdlcgogICAgICAgICAgYXJndW1lbnRzIGluIFRjbDggbW9kdWxlLgoKMTEvMjEvOTc6IEZpeGVkIGEgYnVnIGluIHRoZSBSdW50aW1lL01ha2VmaWxlIHJlbGF0ZWQgdG8gVGNsIDguCgoxMS8yMS85NzogRml4ZWQgYSBidWcgd2l0aCB0aGUgJW5ldyBkaXJlY3RpdmUgYW5kIFBlcmw1IHNoYWRvdyBjbGFzc2VzLgogICAgICAgICAgTm8gbG9uZ2VyIGdlbmVyYXRlcyBhIHBlcmwgc3ludGF4IGVycm9yLgoKMTEvOS85NyA6IENoYW5nZWQgYSBzdHJuY3B5KCkgdG8gc3RyY3B5KCkgaW4gdGhlIHBvaW50ZXIgdHlwZS1jaGVja2VyLgogICAgICAgICAgVGhpcyByZXN1bHRzIGluIGEgc3Vic3RhbnRpYWwgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgaW4KICAgICAgICAgIHR5cGUtY2hlY2tpbmcuCgoxMC8yOS85NzogRml4ZWQgYSBidWcgaW4gdGhlIGNvZGUgZ2VuZXJhdGlvbiBvZiBkZWZhdWx0IGFyZ3VtZW50cyBhbmQKICAgICAgICAgIHVzZXItZGVmaW5lZCB0eXBlcy4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgdm9pZCBmb28oVmVjdG9yIGEsIFZlY3RvciBiID0gZCk7CgogICAgICAgICAgc2hvdWxkIG5vdyB3b3JrIHByb3Blcmx5LgoKVmVyc2lvbiAxLjEgUGF0Y2ggMiAoU2VwdGVtYmVyIDQsIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKOS80Lzk3ICA6IEZpeGVkIHByb2JsZW0gd2l0aCBoYW5kbGluZyBvZiB2aXJ0dWFsIGZ1bmN0aW9ucyB0aGF0CiAgICAgICAgICB3YXMgaW50cm9kdWNlZCBieSBzb21lIGNoYW5nZXMgaW4gdGhlIEMrKyBtb2R1bGUuCgpWZXJzaW9uIDEuMSBQYXRjaCAxIChBdWd1c3QgMjcsIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjgvMjYvOTcgOiBGaXhlZCBjb21waWxhdGlvbiBhbmQgcnVuLXRpbWUgYnVncyB3aXRoIFRjbCA4LjAgZmluYWwuCgo4LzIxLzk3IDogRml4ZWQgY29kZSBnZW5lcmF0aW9uIGJ1ZyB3aXRoIGFycmF5cyBhcHBlYXJpbmcgYXMgYXJndW1lbnRzCiAgICAgICAgICB0byBDKysgbWVtYmVyIGZ1bmN0aW9ucy4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgdm9pZCBCYXIoaW50IGFbMjBdWzIwXSk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgIFRoZXJlIGlzIHN0aWxsIGEgYnVnIHVzaW5nIGFycmF5cyB3aXRoIGFkZGVkIG1ldGhvZHMKICAgICAgICAgIGhvd2V2ZXIuCgo4LzIwLzk3IDogRml4ZWQgYSBidWcgd2l0aCBnZW5lcmF0aW5nIHRoZSBjb2RlIGZvciBhZGRlZCBtZXRob2RzCiAgICAgICAgICBpbnZvbHZpbmcgcGFzcy1ieS12YWx1ZS4KCjgvMTkvOTcgOiBNb2RpZmllZCB0aGUgdHlwZW1hcHBlciB0byBzdWJzdGl0dXRlIHRoZSAnJGFyZycgdmFsdWUKICAgICAgICAgIHdoZW4gZGVjbGFyaW5nIGxvY2FsIHZhcmlhYmxlcy4gICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAldHlwZW1hcChpbikgZG91YmxlICogKGRvdWJsZSB0ZW1wXyRhcmcpIHsKICAgICAgICAgICAgICAgICAgICAuLi4gZG8gc29tZXRoaW5nIC4uLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICBXaGVuIGFwcGxpZWQgdG8gYSByZWFsIGZ1bmN0aW9uIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyA6CgogICAgICAgICAgICAgIHZvaWQgZm9vKGRvdWJsZSAqYSwgZG91YmxlICpiLCBkb3VibGUgKnJlc3VsdCk7CgogICAgICAgICAgdGhyZWUgbG9jYWwgdmFyaWFibGVzIHdpbGwgYmUgY3JlYXRlZCBhcyBmb2xsb3dzIDoKCiAgICAgICAgICAgICAgZG91YmxlIHRlbXBfYTsKICAgICAgICAgICAgICBkb3VibGUgdGVtcF9iOwogICAgICAgICAgICAgIGRvdWJsZSB0ZW1wX3Jlc3VsdDsKCiAgICAgICAgICBUaGlzIGNhbiBiZSB1c2VkIHdoZW4gd3JpdGluZyBtdWx0aXBsZSB0eXBlbWFwcyB0aGF0IG5lZWQKICAgICAgICAgIHRvIGFjY2VzcyB0aGUgc2FtZSBsb2NhbCB2YXJpYWJsZXMuCgoKNy8yNy85NyA6IEZpeGVkIGEgdmFyaWV0eSBvZiBwcm9ibGVtcyB3aXRoIHRoZSAlYXBwbHkgZGlyZWN0aXZlIGFuZCBhcnJheXMuCiAgICAgICAgICBUaGUgZm9sbG93aW5nIHR5cGVzIG9mIGRlY2xhcmF0aW9ucyBzaG91bGQgbm93IHdvcmsgOgoKICAgICAgICAgICAgICAgJWFwcGx5IGRvdWJsZSBbQU5ZXSB7IFJlYWwgW0FOWV0gfTsKICAgICAgICAgICAgICAgJWFwcGx5IGRvdWJsZSBbNF0geyBkb3VibGUgWzEwXSB9OwoKICAgICAgICAgIEEgZ2VuZXJpYyB2ZXJzaW9uIG9mIGFwcGx5IGxpa2UgdGhpcyA6CgogICAgICAgICAgICAgICAlYXBwbHkgZG91YmxlIHsgUmVhbCB9OwoKICAgICAgICAgIHNob3VsZCBub3cgd29yay0tZXZlbiBpZiBhcnJheXMgaW52b2x2aW5nIGRvdWJsZXMgYW5kIFJlYWxzIGFyZQogICAgICAgICAgdXNlZCBsYXRlci4KCjcvMjcvOTcgOiBDaGFuZ2VkIHdhcm5pbmcgbWVzc2FnZSBhYm91dCAiQXJyYXkgWCBoYXMgYmVlbiBjb252ZXJ0ZWQgdG8gWSIgdG8KICAgICAgICAgIG9ubHkgYXBwZWFyIGlmIHJ1bm5pbmcgU1dJRyBpbiB2ZXJib3NlIG1vZGUuCgo3LzI3Lzk3IDogQWRkZWQgdGhlIHZhcmlhYmxlcyAkcGFybW5hbWUgYW5kICRiYXNlbWFuZ2xlIHRvIHRoZSB0eXBlbWFwCiAgICAgICAgICBnZW5lcmF0b3IuICAgICRwYXJtbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIHVzZWQKICAgICAgICAgIHdoZW4gdGhlIHR5cGVtYXAgd2FzIG1hdGNoZWQuICBJdCBtYXkgYmUgIiIgaWYgbm8gcGFyYW1ldGVyCiAgICAgICAgICB3YXMgdXNlZC4gICAkYmFzZW1hbmdsZSBpcyBhIG1hbmdsZWQgdmVyc2lvbiBvZiB0aGUgYmFzZQogICAgICAgICAgZGF0YXR5cGUuICAgIFNvbWV0aW1lcyB1c2VkIGZvciBhcnJheSBoYW5kbGluZy4KCjcvMjcvOTcgOiBDaGFuZ2VkIHRoZSBiZWhhdmlvciBvZiBvdXRwdXQgYXJndW1lbnRzIHdpdGggUHl0aG9uIHNoYWRvdyBjbGFzc2VzLgogICAgICAgICAgT3JpZ2luYWxseSwgaWYgYSBmdW5jdGlvbiByZXR1cm5lZCBhbiBvYmplY3QgJ0ZvbycsIHRoZSBzaGFkb3cgY2xhc3MKICAgICAgICAgIG1lY2hhbmlzbSB3b3VsZCBjcmVhdGUgY29kZSBsaWtlIHRoaXMgOgoKICAgICAgICAgICAgICAgIGRlZiByZXR1cm5fZm9vKCk6CiAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBGb29QdHIoc2hhZG93Yy5yZXR1cm5fZm9vKCkpCiAgICAgICAgICAgICAgICAgICAgICB2YWwudGhpcyA9IDEKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWwKCiAgICAgICAgICBUaGUgcHJvYmxlbSB3aXRoIHRoaXMgaXMgdGhhdCB0eXBlbWFwcyBhbGxvdyBhIHVzZXIgdG8gcmVkZWZpbmUKICAgICAgICAgIHRoZSBvdXRwdXQgYmVoYXZpb3Igb2YgYSBmdW5jdGlvbi0tYXMgYSByZXN1bHQsIHdlIGNhbiBubyBsb25nZXIKICAgICAgICAgIG1ha2UgYW55IGFzc3VtcHRpb25zIGFib3V0IHRoZSByZXR1cm4gdHlwZSBiZWluZyBhIHBvaW50ZXIgb3IKICAgICAgICAgIGV2ZW4gYmVpbmcgYSBzaW5nbGUgdmFsdWUgZm9yIHRoYXQgbWF0dGVyIChpdCBjb3VsZCBiZSBhIGxpc3QsCiAgICAgICAgICB0dXBsZSwgZXRjLi4uKS4gICBJZiBTV0lHIGRldGVjdHMgdGhlIHVzZSBvZiBvdXRwdXQgdHlwZW1hcHMKICAgICAgICAgIChlaXRoZXIgIm91dCIgb3IgImFyZ291dCIpIGl0IHJldHVybnMgdGhlIHJlc3VsdCB1bm1vZGlmaWVkIGxpa2UKICAgICAgICAgIHRoaXMgOgoKICAgICAgICAgICAgICAgIGRlZiByZXR1cm5fZm9vKCk6CiAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBzaGFkb3djLnJldHVybl9mb28oKQogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbAoKICAgICAgICAgIEluIHRoaXMgY2FzZSwgaXQgaXMgdXAgdG8gdGhlIHVzZXIgdG8gZmlndXJlIG91dCB3aGF0IHRvIGRvCiAgICAgICAgICB3aXRoIHRoZSByZXR1cm4gdmFsdWUgKGluY2x1ZGluZyB0aGUgcG9zc2liaWxpdHkgb2YgY29udmVydGluZyBpdAogICAgICAgICAgaW50byBhIFB5dGhvbiBjbGFzcykuCgo3LzI2Lzk3IDogRml4ZWQgYSBwYXJzaW5nIHByb2JsZW0gd2l0aCB0eXBlcyBsaWtlICd1bnNpZ25lZCBsb25nIGludCcsCiAgICAgICAgICAndW5zaWduZWQgc2hvcnQgaW50JywgZXRjLi4uCgo3LzI0Lzk3IDogTWlub3IgYnVnIGZpeCB0byBUY2wgOCBtb2R1bGUgdG8gcGFyc2UgZW51bXMgcHJvcGVybHkuICBBbHNvCiAgICAgICAgICBmaXhlZCBhIG1lbW9yeSBjb3JydXB0aW9uIHByb2JsZW0gaW4gdGhlIHR5cGUtY2hlY2tlci4KICAgICAgICAgIChwYXRjaCBjb250cmlidXRlZCBieSBIZW5yeSBSb3dsZXkuCgo3LzI0Lzk3IDogQWRkZWQgUHl0aG9uLXR1cGxlIHR5cGVtYXBzIGNvbnRyaWJ1dGVkIGJ5IFJvYmluIER1bm4uCgo3LzI0Lzk3IDogSW5jb3Jwb3JhdGVkIHNvbWUgY2hhbmdlcyB0byB0aGUgUHl0aG9uIG1vZHVsZSBpbiBzdXBwb3J0IG9mCiAgICAgICAgICBNYXJrIEhhbW1vbmQncyBDT00gc3VwcG9ydC4gIEknbSBub3QgZW50aXJlbHkgc3VyZSB0aGV5CiAgICAgICAgICB3b3JrIHlldCBob3dldmVyLiAgTmVlZHMgZG9jdW1lbnRhdGlvbiBhbmQgdGVzdGluZy4KCjcvMjQvOTcgOiBGaXhlZCBjb2RlIGdlbmVyYXRpb24gYnVncyB3aGVuIHN0cnVjdHVyZXMgaGFkIGFycmF5IG1lbWJlcnMKICAgICAgICAgIGFuZCB0eXBlbWFwcyB3ZXJlIHVzZWQuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICV0eXBlbWFwKG1lbWJlcmluKSBkb3VibGUgWzIwXVsyMF0gewogICAgICAgICAgICAgICAgICAgICAgLi4uIGdldCBhIGRvdWJsZSBbMjBdWzIwXSAuLi4KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhWzIwXVsyMF07CiAgICAgICAgICAgICAgfQoKICAgICAgICAgIE9yaWdpbmFsbHksIHRoaXMgd291bGQgZ2VuZXJhdGUgYSBjb21waWxlci10eXBlIGVycm9yIHdoZW4KICAgICAgICAgIHRoZSB3cmFwcGVyIGNvZGUgd2FzIGNvbXBpbGVkLiAgIE5vdywgYSBoZWxwZXIgZnVuY3Rpb24gbGlrZQogICAgICAgICAgdGhpcyBpcyBnZW5lcmF0ZWQgOgoKICAgICAgICAgICAgICAgIGRvdWJsZSAqRm9vX2Ffc2V0KEZvbyAqYSwgZG91YmxlIHZhbFsyMF1bMjBdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAuLi4gbWVtYmVyaW4gdHlwZW1hcCBoZXJlIC4uLgogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkb3VibGUgKikgdmFsOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFdoZW4gd3JpdGluZyB0eXBlbWFwcywgb25lIGNhbiBhc3N1bWUgdGhhdCB0aGUgc291cmNlIHZhcmlhYmxlCiAgICAgICAgICBpcyBhbiBhcnJheSBvZiB0aGUgKnNhbWUqIHR5cGUgYXMgdGhlIHN0cnVjdHVyZSBtZW1iZXIuIFRoaXMKICAgICAgICAgIG1heSBicmVhayBzb21lIGNvZGVzIHRoYXQgbWFuYWdlZCB0byB3b3JrIGFyb3VuZCB0aGUgYXJyYXkgYnVnLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzEzLzk3IDogRml4ZWQgYnVnIGluIFBlcmw1IG1vZHVsZSB3aGVuIHVzaW5nIEMgZ2xvYmFsIHZhcmlhYmxlcyB0aGF0CiAgICAgICAgICBhcmUgcG9pbnRlcnMuICBXaGVuIHVzZWQgaW4gZnVuY3Rpb24gY2FsbHMgYW5kIG90aGVyIG9wZXJhdGlvbnMsCiAgICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIHBvaW50ZXIgd291bGQgYmUgaW52YWxpZC0tLWNhdXNpbmcgY29yZQogICAgICAgICAgZHVtcHMgYW5kIG90aGVyIHByb2JsZW1zLiAgU1dJRyBpbXBsZW1lbnRzIGdsb2JhbCB2YXJpYWJsZXMKICAgICAgICAgIHVzaW5nIFBlcmwgbWFnaWMgdmFyaWFibGVzLiAgQXMgaXQgdHVybnMgb3V0LCB0aGUgZXJyb3IKICAgICAgICAgIHdhcyBjYXVzZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGUgcG9pbnRlci1leHRyYWN0aW9uIGNvZGUKICAgICAgICAgIHdhcyBzb21laG93IGJ5cGFzc2luZyB0aGUgcHJvY2VkdXJlIHVzZWQgdG8gcmVzb2x2ZSBtYWdpY2FsCiAgICAgICAgICB2YXJpYWJsZXMgKGhlbmNlLCBsZWF2aW5nIHRoZSB2YWx1ZSB1bmRlZmluZWQpLiAgVG8gZml4CiAgICAgICAgICB0aGUgcHJvYmxlbSwgU1dJRyBub3cgZXhwbGljaXRseSByZXNvbHZlcyBtYWdpYyBiZWZvcmUKICAgICAgICAgIGV4dHJhY3RpbmcgcG9pbnRlciB2YWx1ZXMuCgo3LzEyLzk3IDogRWxpbWluYXRlZCB0aGUgbGFzdCByZW1uYW50cyBvZiBmcmVlKCkgYW5kIG1hbGxvYygpIGZyb20KICAgICAgICAgIHRoZSBTV0lHIGNvbXBpbGVyLgoKNy8xMi85NyA6IEZpeGVkIHBhcnNpbmcgcHJvYmxlbXMgd2l0aCB0eXBlbWFwcyBpbnZvbHZpbmcgYXJyYXlzIGFuZAogICAgICAgICAgdGVtcG9yYXJ5IHZhcmlhYmxlcyBvZiBhcnJheXMuICAgIEFsc28gbWFkZSBpdCBwb3NzaWJsZSBmb3IKICAgICAgICAgIFNXSUcgdG8gaGFuZGxlIHR5cGVtYXBzIGxpa2UgdGhpcyA6CgogICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBkb3VibGUgW0FOWV0gKGRvdWJsZSB0ZW1wWyRkaW0wXSkgewoJCSAgICAgIC4uLiBzdG9yZSBkYXRhIGluIHRlbXBbJGRpbTBdIC4uLgogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBOb3Qgb25seSBkb2VzIHRoaXMgdHlwZW1hcCBtYXRjaCBhbnkgZG91YmxlIFtdIGFycmF5LCBpdAogICAgICAgICAgY3JlYXRlcyBhIGxvY2FsIHZhcmlhYmxlIHdpdGggcHJlY2lzZWx5IHRoZSByaWdodCBkaW1lbnNpb25zLgogICAgICAgICAgKGllLiAkZGltMCBnZXRzIGZpbGxlZCBpbiB3aXRoIHRoZSByZWFsIG51bWJlciBvZiBkaW1lbnNpb25zKS4KICAgICAgICAgIE9mIGNvdXJzZSwgb2ZmIHRoZSByZWNvcmQsIHRoaXMgd2lsbCBiZSBhIHdheSB0byBhZGQgbW9yZQogICAgICAgICAgZnVuY3Rpb25hbGl0eSB0byB0aGUgdHlwZW1hcHMuaSBsaWJyYXJpZXMuCgo3LzkvOTcgIDogRml4ZWQgc29tZSBwcm9ibGVtcyB3aXRoIFBlcmw1LCBzdGF0aWMgbGlua2luZywgYW5kIHNoYWRvdwogICAgICAgICAgY2xhc3Nlcy4gIFdoZW4gc3RhdGljYWxseSBsaW5raW5nIG11bHRpcGxlIG1vZHVsZXMgdG9nZXRoZXIsIHdyaXRlCiAgICAgICAgICBhIHRvcC1sZXZlbCBpbnRlcmZhY2UgZmlsZSBsaWtlIHRoaXMgd2hlbiBzaGFkb3cgY2xhc3NlcyBhcmUgbm90CiAgICAgICAgICB1c2VkIDoKCiAgICAgICAgICAgICAgICAgJW1vZHVsZSBzd2lnLCBmb28sIGJhciwgZ2xvYjsKICAgICAgICAgICAgICAgICAlaW5jbHVkZSBwZXJsbWFpbi5pCgogICAgICAgICAgV2hlbiBzaGFkb3cgY2xhc3NlcyBhcmUgdXNlZCwgdGhlIG1vZHVsZSBuYW1lcyBoYXZlIGFuIGV4dHJhICdjJwogICAgICAgICAgYXBwZW5kZWQgc28gaXQgc2hvdWxkIHJlYWQgYXMgOgoKICAgICAgICAgICAgICAgICAlbW9kdWxlIHN3aWcsIGZvb2MsIGJhcmMsIGdsb2JjOwogICAgICAgICAgICAgICAgICVpbmNsdWRlIHBlcmxtYWluLmkKCiAgICAgICAgICBXaGVuIGxpbmtpbmcgbXVsdGlwbGUgbW9kdWxlcywgY29uc2lkZXIgdXNpbmcgdGhlIFNXSUcgcnVudGltZQogICAgICAgICAgbGlicmFyeS4KCjcvOC85NyAgOiBJbmNvcnBvcmF0ZWQgZml4ZWQgdmVyc2lvbnMgb2YgdGhlIEJvcmxhbmQgQysrIE1ha2VmaWxlcy4KCjcvOC85NyAgOiBGaXJzdCBjdXQgYXQgdHJ5aW5nIHRvIGVsaW1pbmF0ZSBleGNlc3NpdmUgY29tcGlsZXIgd2FybmluZ3MuCiAgICAgICAgICBBcyBpdCB0dXJucyBvdXQsIGFsb3Qgb2Ygd2FybmluZ3MgZ28gYXdheSBpZiB5b3UganVzdCBtYWtlCiAgICAgICAgICBkZWNsYXJhdGlvbnMgbGlrZSB0aGlzCgogICAgICAgICAgICAgICAgICBjbGllbnREYXRhID0gY2xpZW50RGF0YTsKCiAgICAgICAgICBpbiB0aGUgcmVzdWx0aW5nIHdyYXBwZXIgY29kZS4gIE1vc3QgY29tcGlsZXJzIHNob3VsZCBqdXN0CiAgICAgICAgICBpZ25vcmUgdGhpcyBjb2RlIChhdCBsZWFzdCB3b3VsZCBjYW4gaG9wZSkuCgo3LzgvOTcgIDogRml4ZWQgYml6YXJyZSBjb2RlIGdlbmVyYXRpb24gYnVnIHdpdGggdHlwZW1hcHMgYW5kIEMrKyBjbGFzc2VzLgogICAgICAgICAgSW4gc29tZSBjYXNlcywgdHlwZW1hcHMgY29udGFpbmluZyBwcmludGYgZm9ybWF0dGluZyBzdHJpbmdzIHN1Y2ggYXMKCiAgICAgICAgICAgICAgICAgICV0eXBlbWFwKG1lbWJlcm91dCkgaW50ICogewogICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlZCIsNDIpOwogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgV291bGQgZ2VuZXJhdGUgY29tcGxldGVseSBib2d1cyBjb2RlIHdpdGggZ2FyYmFnZSByZXBsYWNpbmcKICAgICAgICAgIHRoZSAnJWQnLiAgIENhdXNlZCBieSBvbmUgZmF1bHR5IHVzZSBvZiBwcmludGYgKHdhc24ndCBhYmxlIHRvIGZpbmQKICAgICAgICAgIGFueSBvdGhlciBvY2N1cnJlbmNlcykuCgo3LzcvOTcgIDogRml4ZWQgYnVnIGluIFB5dGhvbiBzaGFkb3cgY2xhc3MgZ2VuZXJhdGlvbiB3aXRoIG5vbi1tZW1iZXIKICAgICAgICAgIGZ1bmN0aW9ucyB0aGF0IGFyZSByZXR1cm5pbmcgbW9yZSB0aGFuIG9uZSB2YWx1ZS4KCjcvNy85NyAgOiBJbmNvcnBvcmF0ZWQgbW9kaWZpY2F0aW9ucyB0byBtYWtlIFNXSUcgd29yayB3aXRoIEd1aWxlIDEuMi4KICAgICAgICAgIFN0aWxsIG5lZWQgdG8gdGVzdCBpdCBvdXQsIGJ1dCBpdCBpcyBydW1vcmVkIHRvIHdvcmsuCgo3LzIvOTcgIDogRml4ZWQgc29tZSBidWdzIHJlbGF0ZWQgdG8gb3V0cHV0IGFyZ3VtZW50cyBhbmQgUHl0aG9uIHNoYWRvdwogICAgICAgICAgY2xhc3Nlcy4gICAgSWYgYW4gb3V0cHV0IGFyZ3VtZW50IGlzIGRldGVjdGVkLCBTV0lHIGFzc3VtZXMKICAgICAgICAgIHRoYXQgdGhlIHJlc3VsdCBpcyBhIGxpc3QgYW5kIGhhbmRsZXMgaXQgYXBwcm9wcmlhdGVseS4KICAgICAgICAgIElmIHRoZSBub3JtYWwgcmV0dXJuIHR5cGUgb2YgYW4gZnVuY3Rpb24gaXMgYW4gb2JqZWN0LAogICAgICAgICAgaXQgd2lsbCBiZSBjb252ZXJ0ZWQgaW50byBhIHNoYWRvdyBjbGFzcyBhcyBiZWZvcmUsIGJ1dAogICAgICAgICAgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IGl0IGlzIHRoZSBmaXJzdCBlbGVtZW50IG9mIGEKICAgICAgICAgIGxpc3QuICAqKiogTk9URSA6IFRoaXMgYmVoYXZpb3IgaGFzIGJlZW4gc3Vic2VxdWVudGx5IGNoYW5nZWQgKioqCgo2LzI5Lzk3IDogQ2hhbmdlZCBFWFBPUlQgdG8gU1dJR0VYUE9SVCBpbiBhbGwgb2YgdGhlIGxhbmd1YWdlIG1vZHVsZXMuCiAgICAgICAgICBTaG91bGQgcHJvdmlkZSBiZXR0ZXIgY29tcGF0aWJpbGl0eSB3aXRoIFdpbmRvd3MuCgo2LzI5Lzk3IDogTW9kaWZpZWQgUHl0aG9uIHNoYWRvdyBjbGFzc2VzIHNvIHRoYXQgb3V0cHV0IGFyZ3VtZW50cwogICAgICAgICAgd29yayBjb3JyZWN0bHkgKHdoZW4gdHlwZW1hcHMgYXJlIHVzZWQpLgoKVmVyc2lvbiAxLjEgKEp1bmUgMjQsIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKNi8yNC85NyA6IEZpeGVkIE9iamVjdGl2ZS1DIGNvbnN0cnVjdG9yIGJ1ZyB3aGVuIHdvcmtpbmcgd2l0aCBQZXJsNQogICAgICAgICAgc2hhZG93IGNsYXNzZXMuCgo2LzIzLzk3IDogRml4ZWQgc29tZSBwYXJzaW5nIHByb2JsZW1zIHdpdGggT2JqZWN0aXZlLUMuICBEZWNsYXJhdGlvbnMKICAgICAgICAgIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyBzaG91bGQgd29yayBub3cgOgoKICAgICAgICAgICAgICAgLSBmb28gOiAoaW50KSBhIHdpdGg6IChpbnQpIGI7Cgo2LzIyLzk3IDogQWRkZWQgU1dJRyBSdW50aW1lIGxpYnJhcnkuICAgVGhpcyBsaWJyYXJ5IGNvbnRhaW5zCiAgICAgICAgICB0aGUgU1dJRyBwb2ludGVyIHR5cGUtY2hlY2tlciBhbmQgc3VwcG9ydCBmdW5jdGlvbnMKICAgICAgICAgIHRoYXQgYXJlIG5vcm1hbGx5IGluY2x1ZGVkIGluIGV2ZXJ5IG1vZHVsZS4gIEJ5IHVzaW5nCiAgICAgICAgICB0aGUgbGlicmFyeSwgaXQgaXMgZWFzaWVyIHRvIHdvcmsgd2l0aCBtdWx0aXBsZSBTV0lHCiAgICAgICAgICBnZW5lcmF0ZWQgbW9kdWxlcy4KCjYvMjIvOTcgOiBGaXhlZCBtaW5vciBidWcgaW4gUGVybDUgbW9kdWxlIHJlbGF0ZWQgdG8gc3RhdGljIGxpbmtpbmcKICAgICAgICAgIG9mIG11bHRpcGxlIG1vZHVsZXMuCgo2LzIyLzk3IDogRml4ZWQgc29tZSBidWdzIHdpdGggdGhlICVpbXBvcnQgZGlyZWN0aXZlLiBXaGVuIHVzZWQgd2l0aAogICAgICAgICAgUGVybDUgc2hhZG93IGNsYXNzZXMsIHRoaXMgZ2VuZXJhdGVzIGEgJ3JlcXVpcmUnIHN0YXRlbWVudAogICAgICAgICAgdG8gbG9hZCBpbiBleHRlcm5hbCBtb2R1bGVzLgoKNi8yMi85NyA6IEFkZGVkIC1zd2lnbGliIG9wdGlvbi4gIFRoaXMgcHJpbnRzIG91dCB0aGUgbG9jYXRpb24gb2YgdGhlCiAgICAgICAgICBTV0lHIGxpYnJhcnkgYW5kIGV4aXRzLiAgVGhpcyBvcHRpb24gaXMgb25seSByZWFsbHkgdXNlZnVsIHRvCiAgICAgICAgICBjb25maWd1cmF0aW9uIHRvb2xzIHRoYXQgYXJlIGxvb2tpbmcgZm9yIFNXSUcgYW5kIGl0cyBsaWJyYXJ5CiAgICAgICAgICBsb2NhdGlvbiAoZS5nLiBhdXRvY29uZiwgY29uZmlndXJlLCBldGMuLi4pLgoKNi8yMS85NyA6IEZpeGVkIGV4cG9ydCBidWcgd2l0aCBQZXJsNS4wMDQgb24gV2luZG93cy1OVC4KCjYvMjAvOTcgOiBNaW5vciBjaGFuZ2UgdG8gY29kZSBnZW5lcmF0aW9uIG9mIGNsYXNzL3N0cnVjdHVyZSBtZW1iZXJzIGluCiAgICAgICAgICBvcmRlciB0byB3b3JrIGJldHRlciB3aXRoIHR5cGVtYXBzLiBTaG91bGQgaGF2ZSBubyBub3RpY2FibGUKICAgICAgICAgIGltcGFjdCBvbiBleGlzdGluZyBTV0lHIG1vZHVsZXMuCgo2LzE5Lzk3IDogQWRkZWQgLXQgb3B0aW9uLiBUaGlzIGFsbG93cyBTV0lHIHRvIGxvYWQgYSB0eXBlbWFwIGZpbGUgYmVmb3JlCiAgICAgICAgICBwcm9jZXNzaW5nIGFueSBkZWNsYXJhdGlvbnMuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgIHN3aWcgLXQgdHlwZW1hcHMuaSAtcHl0aG9uIGV4YW1wbGUuaQoKICAgICAgICAgIEF0IG1vc3QsIG9ubHkgb25lIHR5cGVtYXAgZmlsZSBjYW4gYmUgc3BlY2lmaWVkIGluIHRoaXMgbWFubmVyLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKNi8xOC85NyA6IE5lZWQgYSBNYWtlZmlsZSBmYXN0PyBUeXBlCgogICAgICAgICAgICAgICAgIHN3aWcgWy10Y2wsIC1wZXJsNSwgLXB5dGhvbl0gLWNvIE1ha2VmaWxlCgogICAgICAgICAgYW5kIHlvdSB3aWxsIGdldCBhIE1ha2VmaWxlIHNwZWNpZmljIHRvIHRoYXQgdGFyZ2V0IGxhbmd1YWdlLgogICAgICAgICAgWW91IGp1c3QgbmVlZCB0byBtb2RpZnkgaXQgZm9yIHlvdXIgYXBwbGljYXRpb24gYW5kIHlvdSdyZQogICAgICAgICAgcmVhZHkgdG8gcnVuLgoKNi8xOC85NyA6IENvbXBsZXRlZCB0aGUgLWNpIG9wdGlvbi4gIFRoaXMgb3B0aW9uIGNoZWNrcyBhIGZpbGUgaW50byB0aGUKICAgICAgICAgIFNXSUcgbGlicmFyeS4gICBJdCBzaG91bGQgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGEKICAgICAgICAgIGxhbmd1YWdlIG9wdGlvbi4gRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAgc3dpZyAtdGNsIC1jaSBmb29iYXIuaQoKICAgICAgICAgIENoZWNrcyB0aGUgZmlsZSBmb29iYXIuaSBpbnRvIHRoZSBUY2wgcGFydCBvZiB0aGUgbGlicmFyeS4KICAgICAgICAgIEluIG9yZGVyIHRvIGNoZWNrIGEgZmlsZSBpbnRvIHRoZSBnZW5lcmFsIGxpYnJhcnkgKGFjY2Vzc2libGUKICAgICAgICAgIHRvIGFsbCBsYW5ndWFnZXMgbW9kdWxlcyksIGRvIHRoZSBmb2xsb3dpbmcKCiAgICAgICAgICAgICAgICAgIHN3aWcgLWNpIC1vIC4uL2Zvb2Jhci5pIGZvb2Jhci5pCgogICAgICAgICAgKEFkbWl0dGVkbHkgdGhpcyBsb29rcyBhIGxpdHRsZSBzdHJhbmdlIGJ1dCBpcyB1bmF2b2lkYWJsZSkuCiAgICAgICAgICBUaGUgY2hlY2staW4gb3B0aW9uIGlzIHByaW1hcmlseSBkZXNpZ25lZCBmb3IgU1dJRyBtYWludGVuYW5jZQogICAgICAgICAgYW5kIGxpYnJhcnkgZGV2ZWxvcG1lbnQuIFRoZSBjb21tYW5kIHdpbGwgZmFpbCBpZiB0aGUgdXNlciBkb2VzCiAgICAgICAgICBub3QgaGF2ZSB3cml0ZSBwZXJtaXNzaW9uIHRvIHRoZSBTV0lHIGxpYnJhcnkuICBUaGlyZCBwYXJ0eSBsaWJyYXJ5CiAgICAgICAgICBleHRlbnNpb25zIGNhbiBlYXNpbHkgaW5zdGFsbCB0aGVtc2VsdmVzIGJ5IHNpbXBseSBwcm92aWRpbmcKICAgICAgICAgIGEgc2hlbGwgc2NyaXB0IHRoYXQgdXNlcyAnc3dpZyAtY2knIHRvIGluc3RhbGwgdGhlIGFwcHJvcHJpYXRlCiAgICAgICAgICBsaWJyYXJ5IGZpbGVzLiAgSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBrbm93IHdoZXJlIHRoZSBTV0lHIGxpYnJhcnkKICAgICAgICAgIGlzIGxvY2F0ZWQgaWYgeW91IHVzZSB0aGlzIG1lY2hhbmlzbS4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjYvMTYvOTcgOiBGaXhlZCBhIGJ1ZyBpbiBzaGFkb3cgY2xhc3MgZ2VuZXJhdGlvbiB3aGVuICVuYW1lKCkgd2FzIGFwcGxpZWQKICAgICAgICAgIHRvIGEgY2xhc3MgZGVmaW5pdGlvbi4gICBVbmZvcnR1bmF0ZWx5LCBmaXhpbmcgdGhlIGJ1ZyByZXF1aXJlZAogICAgICAgICAgYSBjaGFuZ2UgaW4gdGhlIExhbmd1YWdlIEMgQVBJIGJ5IGFkZGluZyBhbiBleHRyYSBhcmd1bWVudCB0bwogICAgICAgICAgdGhlIExhbmd1YWdlOjpjcHBfY2xhc3NfZGVjbCgpIGZ1bmN0aW9uLiAgVGhpcyBtYXkgYnJlYWsKICAgICAgICAgIFNXSUcgQysrIGV4dGVuc2lvbnMuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjYvMTUvOTcgOiBBZGRlZCBhIHdhcm5pbmcgbWVzc2FnZSBpZiBubyBtb2R1bGUgbmFtZSBpcyBzcGVjaWZpZWQgd2l0aCB0aGUKICAgICAgICAgICVtb2R1bGUgZGlyZWN0aXZlIG9yIC1tb2R1bGUgb3B0aW9uLgoKNi8xNS85NyA6IEZpeGVkIGxpbmUgbnVtYmVyIGJ1ZyB3aGVuIHJlcG9ydGluZyBlcnJvcnMgZm9yIHVuZGVmaW5lZAogICAgICAgICAgYmFzZSBjbGFzc2VzLgoKNi8xNS85NyA6IEFkZGVkIG5ldyAlcmVuYW1lIGRpcmVjdGl2ZS4gIFRoaXMgYWxsb3dzIHRoZSBmb3J3YXJkIGRlY2xhcmF0aW9uCiAgICAgICAgICBvZiBhIHJlbmFtaW5nLiAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAlcmVuYW1lIE9sZE5hbWUgTmV3TmFtZTsKCiAgICAgICAgICAgICAgICAgLi4uLiBsYXRlciAuLi4KICAgICAgICAgICAgICAgICBpbnQgT2xkTmFtZShpbnQpOwoKICAgICAgICAgIFVubGlrZSAlbmFtZSwgJXJlbmFtZSB3aWxsIHJlbmFtZSBhbnkgb2NjdXJyZW5jZSBvZiB0aGUgb2xkIG5hbWUuCiAgICAgICAgICBUaGlzIGFwcGxpZXMgdG8gZnVuY3Rpb25zLCB2YXJpYWJsZXMsIGNsYXNzIG1lbWJlcnMgYW5kIHNvIGZvcnRoLgogICAgICAgICAgVGhlcmUgaXMgbm8gd2F5IHRvIGRpc2FibGUgJXJlbmFtZSBvbmNlIHNldCwgYnV0IHlvdSBjYW4gY2hhbmdlIHRoZQogICAgICAgICAgbmFtZSBieSByZWRlY2xhcmluZyBpdCB0byBzb21ldGhpbmcgZWxzZS4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjYvMTUvOTcgOiBJbXByb3ZlZCB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlICVuYW1lIGRpcmVjdGl2ZSBzbyB0aGF0IGl0CiAgICAgICAgICBjb3VsZCBiZSB1c2VkIHdpdGggY29uZGl0aW9uYWwgY29tcGlsYXRpb24gOgoKICAgICAgICAgICAgICAgICAgICAjaWZkZWYgU1dJRwogICAgICAgICAgICAgICAgICAgICVuYW1lKE5ld05hbWUpCiAgICAgICAgICAgICAgICAgICAgI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgaW50IE9sZE5hbWUoaW50KTsKCjYvMTUvOTcgOiBBZGRlZCBzdXBwb3J0IGZvciBmdW5jdGlvbnMgd2l0aCBubyByZXR1cm4gZGF0YXR5cGUuICBJbiB0aGlzIGNhc2UsCiAgICAgICAgICBTV0lHIGFzc3VtZXMgYSByZXR1cm4gdHlwZSBvZiAnaW50Jy4KCjYvMTEvOTcgOiBJbXByb3ZlZCBlcnJvciByZXBvcnRpbmcgaW4gdGhlIHBhcnNlci4gIEl0IHNob3VsZCBiZSBhIGxpdHRsZQogICAgICAgICAgbGVzcyBzZW5zaXRpdmUgdG8gZXJyb3JzIHRoYXQgb2NjdXIgaW5zaWRlIGNsYXNzIGRlZmluaXRpb25zCiAgICAgICAgICBub3cuICBBbHNvIHJlcG9ydHMgZXJyb3JzIGZvciBmdW5jdGlvbiBwb2ludGVycy4KCjYvMTEvOTcgOiBNYWRlICckJyBhIGxlZ2FsIHN5bWJvbCBpbiBpZGVudGlmaWVycy4gIFRoaXMgaXMgdG8gc3VwcG9ydAogICAgICAgICAgc29tZSBPYmplY3RpdmUtQyBsaWJyYXJpZXMuICBTb21lIGNvbXBpbGVycyAoc3VjaCBhcyBnY2MpIG1heSBhbHNvCiAgICAgICAgICBhbGxvdyBpZGVudGlmaWVycyB0byBjb250YWluIGEgJCBpbiBDL0MrKyBjb2RlIGFzIHdlbGwgKHRoaXMgaXMKICAgICAgICAgIGFuIG9ic2N1cmUgZmVhdHVyZSBvZiBDKS4gV2hlbiAnJCcgYXBwZWFycyBpbiBpZGVudGlmaWVyLCBTV0lHCiAgICAgICAgICByZW1hcHMgaXQgdG8gdGhlIHN0cmluZyAnX1NfJyB3aGVuIGNyZWF0aW5nIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UKICAgICAgICAgIGZ1bmN0aW9uLiBUaHVzIGEgZnVuY3Rpb24gJ2ZvbyRiYXInIHdvdWxkIGJlIGNhbGxlZCAnZm9vX1NfYmFyJy4KCjYvMTEvOTcgOiBGaXhlZCBidWcgaW4gUHl0aG9uIHNoYWRvdyBjbGFzc2VzIHdpdGggX19yZXByX18gbWV0aG9kLiAgSWYKICAgICAgICAgIHN1cHBsaWVkIGJ5IHRoZSB1c2VyLCBpdCB3YXMgaWdub3JlZCwgYnV0IG5vdyBpdCBzaG91bGQgd29yay4KCjYvOS85NyAgOiBGaXhlZCB0aGUgVGNsIDguMCBtb2R1bGUgdG8gd29yayB3aXRoIFRjbCA4LjBiMS4gICBTV0lHIGlzIG5vCiAgICAgICAgICBsb25nZXIgY29tcGF0aWJsZSB3aXRoICphbnkqIGFscGhhIHJlbGVhc2Ugb2YgVGNsIDguMC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNi83Lzk3ICA6IFB1dCBhIG1heGltYWwgZXJyb3IgY291bnQgaW4gKGN1cnJlbnRseSBzZXQgdG8gMjApLiBTV0lHIHdpbGwgYmFpbCBvdXQKICAgICAgICAgIGlmIGl0IGdlbmVyYXRlcyBtb3JlIGVycm9ycyB0aGFuIHRoaXMgKHVzZWZ1bCBmb3IgcHJldmVudGluZyBTV0lHCiAgICAgICAgICBmcm9tIHByaW50aW5nIDQwMDAgc3ludGF4IGVycm9ycyB3aGVuIGl0IGdldHMgY29uZnVzZWQpLgoKNi83Lzk3ICA6IEZpeGVkIHNlZ21lbnRhdGlvbiBmYXVsdCB3aGVuIHBhcnNpbmcgdmFyaWFibGUgbGVuZ3RoIGFyZ3VtZW50cy4KCjYvNy85NyAgOiBNaW5vciBjaGFuZ2UgdG8gUGVybDUgbW9kdWxlLiAgQysrIHN0YXRpYyBmdW5jdGlvbnMgYXJlIG5vdwogICAgICAgICAgcHV0IGluIHRoZSBzYW1lIHBhY2thZ2UgYXMgdGhlaXIgY2xhc3Mgd2hlbiB1c2luZyBzaGFkb3cgY2xhc3Nlcy4KCjYvNy85NyAgOiBDZW50cmFsaXplZCB0aGUgbmFtaW5nIG9mIGZ1bmN0aW9ucywgbWVtYmVycywgd3JhcHBlcnMgZXRjLi4uIEJ5CiAgICAgICAgICBjZW50cmFsaXppbmcgdGhlIG5hbWluZyBzY2hlbWUsIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBtYWtlCiAgICAgICAgICBzb21lIG11bHRpLWZpbGUgb3B0aW1pemF0aW9ucy4gIEFsc28sIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0bwogICAgICAgICAgY2hhbmdlIFNXSUcncyBuYW1pbmcgc2NoZW1lIChwZXJoYXBzIGEgbmV3IGZlYXR1cmUgdG8gYmUgYWRkZWQKICAgICAgICAgIGxhdGVyKS4KCjYvMi85NyAgOiBBZGRlZCAnYXJnaW5pdCcgdHlwZW1hcC4gICBUaGlzIGNhbiBiZSB1c2VkIHRvIGFzc2lnbiBpbml0aWFsIHZhbHVlcwogICAgICAgICAgdG8gZnVuY3Rpb24gYXJndW1lbnRzLiAgRG9pbmcgc28gbWFrZXMgaXQgc29tZXdoYXQgZWFzaWVyIHRvIGRldGVjdAogICAgICAgICAgaW1wcm9wZXIgYXJndW1lbnQgcGFzc2luZyB3aGVuIHdvcmtpbmcgd2l0aCBvdGhlciB0eXBlbWFwcy4KCjYvMi85NyAgOiBGaXhlZCBjb2RlIGdlbmVyYXRpb24gYnVnIHdoZW4gcmVhZC1vbmx5IHZhcmlhYmxlcyB3ZXJlIGluaGVyaXRlZAogICAgICAgICAgaW50byBvdGhlciBjbGFzc2VzLiAgVW5kZXIgaW5oZXJpdGFuY2UsIHRoZSB2YXJpYWJsZXMgd291bGQKICAgICAgICAgIGJlY29tZSB3cml0YWJsZSwgYnV0IHRoaXMgaGFzIG5vdyBiZWVuIGNvcnJlY3RlZC4KCjUvMzAvOTcgOiBBbiBlbXB0eSAlbmFtZSgpIGRpcmVjdGl2ZSBpcyBubyBsb25nZXIgYWxsb3dlZCBvciBzdXBwb3J0ZWQuCiAgICAgICAgICBUaGlzIGRpcmVjdGl2ZSB3YXMgb3JpZ2luYWxseSB1c2VkIHRvIHN0cmlwIHRoZSBwcmVmaXgKICAgICAgICAgIG9mZiBvZiBhIGNsYXNzIG9yIHN0cnVjdHVyZS4gIFVuZm9ydHVuYXRlbHksIHRoaXMgbmV2ZXIgcmVhbGx5CiAgICAgICAgICBzZWVtZWQgdG8gd29yayByaWdodCBhbmQgaXQgY29tcGxpY2F0ZWQgdGhlIEMrKyBjb2RlIGdlbmVyYXRvcgogICAgICAgICAgc2lnbmlmaWNhbnRseS4gICBBcyBmYXIgYXMgSSBjYW4gdGVsbCBubyBvbmUgdXNlcyBpdCwgc28gaXQKICAgICAgICAgIGlzIG5vdyBoaXN0b3J5LiAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo1LzI4Lzk3IDogRml4ZWQgYSBwYXJzaW5nIGJ1ZyB3aXRoICNkZWZpbmUgYW5kIEMrKyBjb21tZW50cy4gIERlY2xhcmF0aW9ucwogICAgICAgICAgc3VjaCBhcyB0aGUgZm9sbG93aW5nIG5vdyB3b3JrIHByb3Blcmx5IDoKCiAgICAgICAgICAgICAgICAgICAjZGVmaW5lIENPTlNUICAgNCAgICAgLy8gQSBDb21tZW50Cgo1LzI4Lzk3IDogTWFkZSBzb21lIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyB0byB0aGUgU1dJRyBTdHJpbmcgY2xhc3MuCiAgICAgICAgICAob25seSBhZmZlY3RzIHRoZSBTV0lHIGNvbXBpbGVyIGl0c2VsZikuCgo1LzI4Lzk3IDogTW9kaWZpZWQgdGhlIHBhcnNlciB0byBza2lwIHRlbXBsYXRlIGRlZmluaXRpb25zIGFuZCBpc3N1ZSBhCiAgICAgICAgICB3YXJuaW5nIG1lc3NhZ2UuCgo1LzI4Lzk3IDogUHJlbGltaW5hcnkgc3VwcG9ydCBmb3IgcGFyYW1ldGVyaXplZCB0eXBlcyBhZGRlZCAoaWUuIHRlbXBsYXRlcykuCiAgICAgICAgICBUeXBlcyBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgc2hvdWxkIHBhc3MgdGhyb3VnaCB0aGUgU1dJRyBjb21waWxlcgoKICAgICAgICAgICAgICAgICAgICB2b2lkIGZvbyh2ZWN0b3I8Y29tcGxleD4gKmEsIHZlY3Rvcjxkb3VibGU+ICpiKTsKCiAgICAgICAgICBXaGVuIHVzZWQsIHRoZSBlbnRpcmUgbmFtZSAndmVjdG9yPGNvbXBsZXg+JyBiZWNvbWVzIHRoZSBuYW1lCiAgICAgICAgICBvZiB0aGUgZGF0YXR5cGUuICAgICAgRHVlIHRvIHNwYWNlIGxpbWl0YXRpb25zIGluIGRhdGF0eXBlCiAgICAgICAgICByZXByZXNlbnRhdGlvbnMsIHRoZSBuYW1lIHNob3VsZCBub3QgZXhjZWVkIDk2IGNoYXJhY3RlcnMuCgogICAgICAgICAgTm90ZSA6IFRoaXMgaXMgb25seSBwYXJ0IG9mIHdoYXQgaXMgbmVlZGVkIGZvciB0ZW1wbGF0ZSBzdXBwb3J0LgogICAgICAgICAgVGVtcGxhdGUgY2xhc3MgZGVmaW5pdGlvbnMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkIGJ5IFNXSUcuCgogICAgICAgICAgVGhlIHRlbXBsYXRlIG5vdGF0aW9uIGFib3ZlIG1heSBhbHNvIGJlIHVzZWQgd2hlbiBzcGVjaWZ5aW5nCiAgICAgICAgICBPYmplY3RpdmUtQyBwcm90b2NvbCBsaXN0cy4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjUvMjQvOTcgOiBGaXJzdCBjdXQgYXQgT2JqZWN0aXZlLUMgc3VwcG9ydCBhZGRlZC4gICBBcyBpdCB0dXJucyBvdXQsIGFsbW9zdAogICAgICAgICAgZXZlcnl0aGluZyBjYW4gYmUgaGFuZGxlZCB3aXRoIG9ubHkgYSBmZXcgbWlub3IgbW9kaWZpY2F0aW9ucyB0bwogICAgICAgICAgdGhlIEMrKyBtb2R1bGUuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo1LzIzLzk3IDogRml4ZWQgcmVwZWF0ZWQgZGVmaW5pdGlvbiBidWcgaW4gbXVsdGlwbGUgaW5oZXJpdGFuY2UgaGFuZGxpbmcKICAgICAgICAgIHdoZW4gbXVsdGlwbGUgYmFzZSBjbGFzc2VzIHNoYXJlIGEgY29tbW9uIGJhc2UgY2xhc3MgKGllLgogICAgICAgICAgdGhlIGV2aWwgZGlhbW9uZCkuCgo1LzIxLzk3IDogRml4ZWQgcmF0aGVyIGVtYmFycmFzc2luZyB0eXBvIHRoYXQgd29ya2VkIGl0cyB3YXkgaW50byB0aGUKICAgICAgICAgIFRlc3RzL0J1aWxkIGRpcmVjdG9yeS4KCjUvMTkvOTcgOiBGaXhlZCBjb2RlIGdlbmVyYXRpb24gYnVnIHdoZW4gdXNpbmcgbmF0aXZlIG1ldGhvZHMgYW5kCiAgICAgICAgICBzaGFkb3cgY2xhc3NlcyB3aXRoIFB5dGhvbiBhbmQgUGVybDUgbW9kdWxlcy4KCjUvMTkvOTcgOiBNb2RpZmllZCB0aGUgJWFwcGx5IGRpcmVjdGl2ZSBzbGlnaHRseSBzbyB0aGF0IGl0IHdvdWxkIHdvcmsKICAgICAgICAgIHdpdGggcG9pbnRlcnMgYSBsaXR0bGUgYmV0dGVyLiBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICAlYXBwbHkgdW5zaWduZWQgbG9uZyB7IERXT1JEIH07CgogICAgICAgICAgQXBwbGllcyAqYWxsKiB0eXBlbWFwcyBhc3NvY2lhdGVkIHdpdGggInVuc2lnbmVkIGxvbmciIHRvCiAgICAgICAgICAiRFdPUkQiLiAgIFRoaXMgbm93IGluY2x1ZGVzIHBvaW50ZXJzIHRvIHRoZSB0d28gZGF0YXR5cGVzLgogICAgICAgICAgRm9yIGV4YW1wbGUsIGEgdHlwZW1hcCBhcHBsaWVkIHRvICJ1bnNpZ25lZCBsb25nICoqIiB3b3VsZAogICAgICAgICAgYWxzbyBiZSBhcHBsaWVkIHRvIGFueSBvY2N1cnJlbmNlIG9mICJEV09SRCAqKiIgYXMgd2VsbC4KCjUvMTkvOTcgOiBGaXhlZCBhbiBvd25lcnNoaXAgYXNzaWdubWVudCBidWcgaW4gdGhlIFBlcmw1IG1vZHVsZSB3aGVuCiAgICAgICAgICBjbGFzcyBtZW1iZXJzIHdlcmUgcmV0dXJuaW5nIG5ldyBvYmplY3RzIGJlbG9uZ2luZyB0bwogICAgICAgICAgZGlmZmVyZW50IGNsYXNzZXMuCgo1LzE3Lzk3IDogQWRkZWQgYSBmZXcgbW9yZSB0eXBlbWFwIHZhcmlhYmxlcy4KCiAgICAgICAgICAgICAgICAgICRuYW1lICAgICAgICAgIC0gTmFtZSBvZiBmdW5jdGlvbi92YXJpYWJsZS9tZW1iZXIKICAgICAgICAgICAgICAgICAgJGJhc2V0eXBlICAgICAgLSBCYXNlIGRhdGF0eXBlICh0eXBlIHdpdGhvdXQgcG9pbnRlcnMpCiAgICAgICAgICAgICAgICAgICRhcmdudW0gICAgICAgIC0gQXJndW1lbnQgbnVtYmVyCgo1LzE2Lzk3IDogRml4ZWQgZW1iYXJyYXNzaW5nIHVuZGVyc2NvcmUgZXJyb3IgaW4gbG9jYWwgdmFyaWFibGUKICAgICAgICAgIGFsbG9jYXRvci4KCjUvMTYvOTcgOiBGaXhlZCBuYW1lc3BhY2UgY2xhc2ggYnVnIGluIHBhcmFtZXRlcml6ZWQgdHlwZW1hcHMKICAgICAgICAgIHdoZW4gY3JlYXRpbmcgYXJyYXlzIGFzIG5ldyBsb2NhbCB2YXJpYWJsZXMuCgo1LzE1Lzk3IDogRml4ZWQgc29tZSBidWdzIHdpdGggaW5oZXJpdGFuY2Ugb2YgYWRkZWQgbWV0aG9kcyBhY3Jvc3MKICAgICAgICAgIG11bHRpcGxlIGZpbGVzLiAgIFNXSUcgbm93IHVzZXMgbmFtZXMgb2YgYmFzZSBjbGFzc2VzCiAgICAgICAgICB3aGVuIGdlbmVyYXRpbmcgc3VjaCBmdW5jdGlvbnMuCgo1LzE0Lzk3IDogRmluaXNoZWQgc3VwcG9ydCBmb3IgZGVmYXVsdCB0eXBlbWFwcy4gIFByaW1hcmlseSB1c2VkCiAgICAgICAgICBpbnRlcm5hbGx5LCB0aGV5IGNhbiBiZSB1c2VkIHRvIG1hdGNoIHRoZSBiYXNpYwogICAgICAgICAgYnVpbHQtaW4gZGF0YXR5cGVzIHVzZWQgaW5zaWRlIG9mIFNXSUcuICAgWW91IGNhbgogICAgICAgICAgc3BlY2lmeSB0aGVtIGluIGludGVyZmFjZSBmaWxlcyBhcyB3ZWxsIGxpa2UgdGhpcyA6CgogICAgICAgICAgICAgICAldHlwZW1hcCh0Y2wsaW4pIGludCBTV0lHX0RFRkFVTFRfVFlQRSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPSBhdG9pKCR0YXJnZXQpOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgVW5saWtlIG5vcm1hbCB0eXBlbWFwcywgdGhpcyBkZWZhdWx0IG1hcCB3aWxsIGdldCBhcHBsaWVkCiAgICAgICAgICB0byAqYWxsKiBpbnRlZ2VyIGRhdGF0eXBlcyBlbmNvdW50ZXJlZCwgaW5jbHVkaW5nIHRob3NlCiAgICAgICAgICByZW5hbWVkIHdpdGggdHlwZWRlZiwgZXRjLi4uCgo1LzEzLzk3IDogRml4ZWQgc3Vic3RyaW5nIGJ1ZyBpbiB0eXBlIGNoZWNrZXIuCgo1LzEyLzk3IDogRml4ZWQgYnVnIGluIHBhcmFtZXRlcml6ZWQgdHlwZW1hcHMgd2hlbiBkZWNsYXJpbmcgbG9jYWwKICAgICAgICAgIHZhcmlhYmxlcyBvZiBzdHJ1Y3R1cmVzLgoKVmVyc2lvbiAxLjEgQmV0YTYgKE1heSA5LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo1LzkvOTcgIDogRml4ZWQgYml6YXJyZSBOVUxMIHBvaW50ZXIgaGFuZGxpbmcgYnVnIGluIFBlcmw1IG1vZHVsZS4KCjUvOC85NyAgOiBGaXhlZCBteXN0ZXJpb3VzIHNlZ21lbnRhdGlvbiBmYXVsdCB3aGVuIHJ1bm5pbmcgU1dJRyBvbiBhbgogICAgICAgICAgZW1wdHkgZmlsZS4KCjUvNy85NyAgOiBUaGUgY29kZSBnZW5lcmF0b3Igd2lsbCBub3cgcmVwbGFjZSB0aGUgc3BlY2lhbCBzeW1ib2wgIiRjbGVhbnVwIgogICAgICAgICAgd2l0aCB0aGUgY2xlYW51cCBjb2RlIHNwZWNpZmllZCB3aXRoIHRoZSAiZnJlZWFyZyIgdHlwZW1hcC4KICAgICAgICAgIFRoaXMgY2hhbmdlIG5lZWRlZCB0byBwcm9wZXJseSBtYW5hZ2UgbWVtb3J5IGFuZCBleGNlcHRpb25zLgoKNS81Lzk3ICA6IEFkZGVkIHRoZSAndHlwZW1hcHMuaScgbGlicmFyeSBmaWxlLiAgVGhpcyBjb250YWlucyBhCiAgICAgICAgICB2YXJpZXR5IG9mIGNvbW1vbiB0eXBlbWFwcyBmb3IgaW5wdXQgdmFsdWVzLCBwb2ludGVycywKICAgICAgICAgIGFuZCBzbyBvbi4KCjUvNS85NyAgOiBDaGFuZ2VkIGJlaGF2aW9yIG9mICJhcmdvdXQiIHR5cGVtYXAgaW4gUHl0aG9uIG1vZHVsZS4KICAgICAgICAgIE9sZCB2ZXJzaW9ucyBhdXRvbWF0aWNhbGx5IHR1cm5lZCB0aGUgcmVzdWx0IGludG8gYQogICAgICAgICAgUHl0aG9uIGxpc3QuICBUaGUgbmV3IHZlcnNpb24gZG9lcyBub3RoaW5nLCBsZWF2aW5nIHRoZQogICAgICAgICAgaW1wbGVtZW50YXRpb24gdXAgdG8gdGhlIHVzZXIuICBUaGlzIHByb3ZpZGVzIG1vcmUgZmxleGliaWxpdHkKICAgICAgICAgIGJ1dCBtYXkgYnJlYWsgb2xkZXIgY29kZXMgdGhhdCByZWx5IG9uIHR5cGVtYXBzLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo1LzUvOTcgIDogRml4ZWQgYnVnIGluIFB5dGhvbiBtb2R1bGUgcmVsYXRlZCB0byB0aGUgaW50ZXJhY3Rpb24gb2YKICAgICAgICAgICJhcmdvdXQiIGFuZCAiaWdub3JlIiB0eXBlbWFwcy4KCjUvNS85NyAgOiBGaXhlZCBidWcgaW4gUHl0aG9uIG1vZHVsZSB0aGF0IHdvdWxkIGdlbmVyYXRlIGluY29ycmVjdCBjb2RlCiAgICAgICAgICBpZiBhbGwgZnVuY3Rpb24gYXJndW1lbnRzIGFyZSAiaWdub3JlZCIuCgo1LzQvOTcgIDogQWRkZWQgJWFwcGx5IGFuZCAlY2xlYXIgZGlyZWN0aXZlcy4gICBUaGVzZSBmb3JtIGEgaGlnaGVyIGxldmVsCiAgICAgICAgICBpbnRlcmZhY2UgdG8gdGhlIHR5cGVtYXAgbWVjaGFuaXNtLiAgSW4gYSBudXRzaGVsbCwgdGhleQogICAgICAgICAgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSBwcm9jZXNzaW5nIG9mIHZhcmlvdXMgZGF0YXR5cGVzIHdpdGhvdXQKICAgICAgICAgIGV2ZXIgaGF2aW5nIHRvIHdyaXRlIGEgdHlwZW1hcC4gIFNlZSB0aGUgU1dJRyBkb2N1bWVudGF0aW9uCiAgICAgICAgICBmb3IgbW9yZSBkZXRhaWxzLiAgKiogTkVXIEZFQVRVUkUgKioKCjUvNC85NyAgOiBBZGRlZCBhIGxvY2FsIHZhcmlhYmxlIGV4dGVuc2lvbiB0byB0aGUgdHlwZW1hcCBoYW5kbGVyLgogICAgICAgICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAldHlwZW1hcCh0Y2wsaW4pIGRvdWJsZSAqKGRvdWJsZSB0ZW1wKSB7CgkJICAgICAgICB0ZW1wID0gYXRvZigkc291cmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9ICZ0ZW1wOwogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBJbiB0aGlzIGNhc2UsICd0ZW1wJyBpcyBhIGxvY2FsIHZhcmlhYmxlIHRoYXQgZXhpc3RzCiAgICAgICAgICBpbiB0aGUgZW50aXJlIHdyYXBwZXIgZnVuY3Rpb24gKG5vdCBqdXN0IHRoZSB0eXBlbWFwCiAgICAgICAgICBjb2RlKS4gIFRoaXMgbWVjaGFuaXNtIHByb3ZpZGVzIGJldHRlciBzdXBwb3J0IGZvcgogICAgICAgICAgY2VydGFpbiB0eXBlcyBvZiBhcmd1bWVudCBoYW5kbGluZyBhbmQgYWxzbyBtYWtlcyBpdAogICAgICAgICAgcG9zc2libGUgdG8gd3JpdGUgdGhyZWFkLXNhZmUgdHlwZW1hcHMuICBBbnkgbnVtYmVyCiAgICAgICAgICBsb2NhbCB2YXJpYWJsZXMgY2FuIGJlIGRlY2xhcmVkIGJ5IHN1cHBseWluZyBhIGNvbW1hCiAgICAgICAgICBzZXBhcmF0ZWQgbGlzdC4gICBMb2NhbCB2YXJpYWJsZXMgYXJlIGd1YXJhbnRlZWQgdG8gYmUKICAgICAgICAgIHVuaXF1ZSwgZXZlbiBpZiB0aGUgc2FtZSB0eXBlbWFwIGlzIGFwcGxpZWQgbWFueSB0aW1lcwogICAgICAgICAgaW4gYSBnaXZlbiBmdW5jdGlvbi4KICAgICAgICAgICoqIE5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGluIFBlcmw0IG9yIEd1aWxlIG1vZHVsZXMuCgo1LzIvOTcgIDogRml4ZWQgcHJvY2Vzc2luZyBvZiAlaWZkZWYsICVlbmRpZiwgJWlmLCBldGMuLi4gIChUaGVzZSBhcmUKICAgICAgICAgIFNXSUcgZXF1aXZhbGVudHMgb2YgdGhlIEMgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgdGhhdAogICAgICAgICAgY2FuIHBhc3MgdGhyb3VnaCB0aGUgQyBwcmVwcm9jZXNzb3Igd2l0aG91dCBtb2RpZmljYXRpb24pLgoKNS8yLzk3ICA6IEZpeGVkIG1ham9yIChidXQgc3VidGxlKSBidWcgaW4gdGhlIHJ1bi10aW1lIHR5cGUgY2hlY2tlcgogICAgICAgICAgcmVsYXRlZCB0byBzZWFyY2hpbmcgYW5kIHR5cGUtY2hlY2tpbmcgZm9yIEMrKyBpbmhlcml0YW5jZS4KICAgICAgICAgIFRvIG1ha2UgYSBsb25nIHN0b3J5IHNob3J0LCBpZiB5b3UgaGFkIHR3byBjbGFzc2VzIG5hbWVkCiAgICAgICAgICAiRm9vIiBhbmQgIkZvb09iamVjdCIgdGhlIHR5cGUgY2hlY2tlciB3b3VsZCBzb21ldGltZXMKICAgICAgICAgIGdldCBjb25mdXNlZCBhbmQgYmUgdW5hYmxlIHRvIGxvY2F0ZSAiRm9vIiBpbiBhbiBpbnRlcm5hbAogICAgICAgICAgdGFibGUuCgo1LzIvOTcgIDogRml4ZWQgc29tZSBidWdzIGluIHRoZSAtY28gb3B0aW9uLgoKNC8yNC85NyA6IFBvaW50ZXIgbGlicmFyeSBhZGRlZCB0byB0aGUgU1dJRyBsaWJyYXJ5LgoKNC8xOS85NyA6IEFkZGVkIHRoZSAlbmV3IGRpcmVjdGl2ZS4gICBUaGlzIGlzIGEgImhpbnQiIHRoYXQgY2FuIGJlIHVzZWQKICAgICAgICAgIHRvIHRlbGwgU1dJRyB0aGF0IGEgZnVuY3Rpb24gaXMgcmV0dXJuaW5nIGEgbmV3IG9iamVjdC4gRm9yCiAgICAgICAgICBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgICVuZXcgRm9vICpjcmVhdGVfZm9vKCk7CgogICAgICAgICAgVGhpcyB0ZWxscyBTV0lHIHRoYXQgY3JlYXRlX2ZvbygpIGlzIGNyZWF0aW5nIGEgbmV3IG9iamVjdAogICAgICAgICAgYW5kIHJldHVybmluZyBhIHBvaW50ZXIgdG8gaXQuICAgTWFueSBsYW5ndWFnZSBtb2R1bGVzIG1heQogICAgICAgICAgY2hvb3NlIHRvIGlnbm9yZSB0aGUgaGludCwgYnV0IHdoZW4gd29ya2luZyB3aXRoIHNoYWRvdyBjbGFzc2VzLAogICAgICAgICAgdGhlICVuZXcgaXMgdXNlZCB0byBoYW5kbGUgcHJvcGVyIG93bmVyc2hpcCBvZiBvYmplY3RzLgoKICAgICAgICAgICVuZXcgY2FuIGFsc28gYmUgdXNlZCB3aXRoIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBzdHJpbmdzLgogICAgICAgICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAgJW5ldyBjaGFyICpjcmVhdGVfc3RyaW5nKCk7CgogICAgICAgICAgV2hlbiB1c2VkLCBhbGwgb2YgdGhlIGxhbmd1YWdlIG1vZHVsZXMgd2lsbCBhdXRvbWF0aWNhbGx5IGNsZWFudXAKICAgICAgICAgIHRoZSByZXR1cm5lZCBzdHJpbmctLWVsaW1pbmF0aW5nIG1lbW9yeSBsZWFrcy4KICAgICAgICAgICoqIE5FVyBGRUFUVVJFICoqCgo0LzE5Lzk3IDogQWRkZWQgYSBuZXcgdHlwZW1hcCAibmV3ZnJlZSIuICAgVGhpcyBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGgKICAgICAgICAgIHRoZSAlbmV3IGRpcmVjdGl2ZSBhbmQgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSBtZXRob2QgYnkgd2hpY2gKICAgICAgICAgIGEgbmV3IG9iamVjdCByZXR1cm5lZCBieSBhIGZ1bmN0aW9uIGlzIGRlbGV0ZWQuCgo0LzE5Lzk3IDogVGhlIHN5bWJvbCAiX19jcGx1c3BsdXMiIGlzIG5vdyBkZWZpbmVkIGluIHRoZSBTV0lHIGludGVycHJldGVyCiAgICAgICAgICB3aGVuIHJ1bm5pbmcgd2l0aCB0aGUgLWMrKyBvcHRpb24uCgo0LzE3Lzk3IDogQWRkZWQgc3VwcG9ydCBmb3Igc3RhdGljIG1lbWJlciBmdW5jdGlvbnMgd2hlbiB1c2VkIGluc2lkZSB0aGUKICAgICAgICAgICVhZGRtZXRob2RzIGRpcmVjdGl2ZS4KCjQvMTUvOTcgOiBBZGRlZCBhIHNwZWNpYWwgdHlwZW1hcCBzeW1ib2wgUFJFVklPVVMgdGhhdCBjYW4gYmUgdXNlZCB0bwogICAgICAgICAgcmVzdG9yZSBhIHByZXZpb3VzIHR5cGVtYXAuIEZvciBleGFtcGxlIDoKCgkgICAgICAgICAldHlwZW1hcCh0Y2wsaW4pIGludCAqID0gUFJFVklPVVM7CgogICAgICAgICAgVGhpcyBpcyBwcmltYXJpbHkgdXNlZCBpbiBsaWJyYXJ5IGZpbGVzLgoKNC8xMy85NyA6IEFkZGVkICVwcmFnbWEgZGlyZWN0aXZlIGZvciBQZXJsNSBtb2R1bGUuICAgVHdvIG5ldyBwcmFnbWFzIGFyZQogICAgICAgICAgYXZhaWxhYmxlIDoKCiAgICAgICAgICAgICAgICAgJXByYWdtYShwZXJsNSkgY29kZSA9ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgJXByYWdtYShwZXJsNSkgaW5jbHVkZSA9ICJmaWxlLnBsIgoKICAgICAgICAgIEJvdGggaW5zZXJ0IGNvZGUgaW50byB0aGUgLnBtIGZpbGUgY3JlYXRlZCBieSBTV0lHLiAgVGhpcyBjYW4KICAgICAgICAgIGJlIHVzZWQgdG8gYXV0b21hdGljYWxseSBjdXN0b21pemUgdGhlIC5wbSBmaWxlIGNyZWF0ZWQgYnkgU1dJRy4KCjQvMTMvOTcgOiBTY2FubmVyIG1vZGlmaWVkIHRvIG9ubHkgcmVjb2duaXplIEMrKyBrZXl3b3JkcyB3aGVuIHRoZSAtYysrCiAgICAgICAgICBvcHRpb24gaGFzIGJlZW4gc3BlY2lmaWVkLiAgVGhpcyBwcm92aWRlcyBzdXBwb3J0IGZvciBDIHByb2dyYW1zCiAgICAgICAgICB0aGF0IG1ha2UgdXNlIG9mIHRoZXNlIGtleXdvcmRzIGZvciBpZGVudGlmaWVycy4KICAgICAgICAgIFNXSUcgbWF5IG5lZWQgdG8gYmUgZXhwbGljaXRseSBydW4gd2l0aCB0aGUgLWMrKyBvcHRpb24gd2hlbgogICAgICAgICAgY29tcGlsaW5nIEMrKyBjb2RlICh0aGlzIHdhcyBhbGxvd2VkLCBidXQgbm90IHJlY29tbWVuZGVkIGluCiAgICAgICAgICBwcmV2aW91cyB2ZXJzaW9ucykuICoqUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSoqCgo0LzExLzk3IDogRml4ZWQgYSByYXRoZXIgbmFzdHkgYnVnIGluIHRoZSBQZXJsNSBtb2R1bGUgcmVsYXRlZCB0byB1c2luZwogICAgICAgICAgdmFyaWFibGUgbGlua2luZyB3aXRoIGNvbXBsZXggZGF0YXR5cGVzIGFuZCBwb2ludGVycy4gICBPbiBVbml4LAogICAgICAgICAgY29kZSB3b3VsZCB3b3JrIChzb21laG93KSwgYnV0IHdvdWxkIGNhdXNlIGFuIGFjY2VzcyB2aW9sYXRpb24KICAgICAgICAgIHVuZGVyIFdpbmRvd3MtTlQuICBUaGUgZml4IHNob3VsZCBjb3JyZWN0IHRoZSBwcm9ibGVtLAogICAgICAgICAgYnV0IHRoZXJlIG1heSBzdGlsbCBiZSBhIHByb2JsZW0gdXNpbmcgZ2xvYmFsIHZhcmlhYmxlcyBvZgogICAgICAgICAgY29tcGxleCBkYXRhdHlwZXMgaW4gY29uanVuY3Rpb24gd2l0aCBzaGFkb3cgY2xhc3Nlcy4gIEZvcnR1bmF0ZWx5LAogICAgICAgICAgdGhpcyBzb3J0IG9mIHRoaW5nIHNlZW1zIHRvIGJlIHJlbGF0aXZlbHkgcmFyZSAoY29uc2lkZXJpbmcKICAgICAgICAgIHRoYXQgdGhlIGJ1ZyBoYXMgYmVlbiBhcm91bmQgZm9yIG1vcmUgdGhhbiBhIHllYXIgLSB5aWtlcyEpLgoKNC8xMS85NyA6IEZpeGVkIGJpemFycmUgY29uc3RhbnQgZXZhbHVhdGlvbiBidWcgaW4gUGVybDUgY29kZSBnZW5lcmF0aW9uCiAgICAgICAgICB3aGVuIHJ1bm5pbmcgdW5kZXIgV2luZG93cy1OVC4KCjQvOC85NyAgOiBCdWcgd2hlbiB1c2luZyBkZWZhdWx0IGFyZ3VtZW50cyBhbmQgQysrIHJlZmVyZW5jZXMgZml4ZWQuCgo0LzgvOTcgIDogRml4ZWQgY29kZSBnZW5lcmF0aW9uIGJ1Z3MgaW4gUHl0aG9uIGFuZCBQZXJsNSBtb2R1bGVzIHJlbGF0ZWQgdG8KICAgICAgICAgIHVzaW5nIGNsYXNzIHJlbmFtaW5nIChhcHBseWluZyB0aGUgJW5hbWUgZGlyZWN0aXZlIHRvIGEgY2xhc3MKICAgICAgICAgIGRlZmluaXRpb24pIGFuZCBzaGFkb3cgY2xhc3Nlcy4KCjQvNy85NyAgOiBGaXhlZCBtaW5vciBidWdzIGluIHN3aWdwdHIuc3dnLCB0Y2w4cHRyLnN3ZywgYW5kIHBlcmw1cHRyLnN3ZyB0bwogICAgICAgICAgcHJldmVudCBpbmZpbml0ZSBsb29wcyB3aGVuIHdlaXJkIGRhdGF0eXBlcyBhcmUgcGFzc2VkLgoKMy8yOS85NyA6ICdNYWtlZmlsZS53aW4nIGFkZGVkLiAgIFRoaXMgaXMgdXNlZCB0byBidWlsZCBtb3N0IG9mIHRoZSBleGFtcGxlcwogICAgICAgICAgaW4gdGhlIEV4YW1wbGVzIGRpcmVjdG9yeSB1bmRlciBXaW5kb3dzIE5ULzk1LgoKMy8yNy85NyA6IEZpeGVzIHRvIFNXSUcncyBlcnJvciByZXR1cm4gY29kZXMuICAgU1dJRyBub3cgcmV0dXJucyBub24temVybwogICAgICAgICAgZXhpdCBjb2RlcyBmb3IgY2VydGFpbiBraW5kcyBvZiBlcnJvcnMgKHdoaWNoIG1ha2VzIGl0IG1vcmUKICAgICAgICAgIGZyaWVuZGx5IHRvIG1ha2VmaWxlcykuICAgICBBbiBvdmVyaGF1bCBvZiB0aGUgZXJyb3IgaGFuZGxpbmcKICAgICAgICAgIGlzIG9uIHRoZSB0by1kbyBsaXN0IGFuZCB3aWxsIHByb2JhYmx5IHNob3cgdXAgaW4gYSBsYXRlciByZWxlYXNlLgoKMy8yNS85NyA6IEJ1ZyBmaXguICAiZnJlZWFyZyIgYW5kICJhcmdvdXQiIHR5cGVtYXBzIGhhdmUgYmVlbiBmaXhlZCBpbgogICAgICAgICAgdGhlIFBlcmw1IG1vZHVsZS4gIEluIHByZXZpb3VzIHZlcnNpb25zLCBmdW5jdGlvbiBpbnB1dCBwYXJhbWV0ZXJzCiAgICAgICAgICBhbmQgZnVuY3Rpb24gb3V0cHV0IHBhcmFtZXRlcnMgc2hhcmVkIHRoZSBzYW1lIG1lbW9yeSBzcGFjZS0tY2F1c2luZwogICAgICAgICAgYWxsIHNvcnRzIG9mIG5hc3R5IHByb2JsZW1zIHdoZW4gdHJ5aW5nIHRvIHBhc3MgcGVybCB2YWx1ZXMgYnkKICAgICAgICAgIHJlZmVyZW5jZS4gICBTV0lHIG5vdyBpbnRlcm5hbGx5IG1ha2VzIGEgImNvcHkiICh3aGljaCBpcyByZWFsbHkKICAgICAgICAgIGp1c3QgYSBwb2ludGVyKSBvZiBhZmZlY3RlZCBwYXJhbWV0ZXJzIGFuZCB1c2VzIHRoYXQuICAgVGhpcwogICAgICAgICAgaXMgZG9uZSB0cmFuc3BhcmVudGx5IHNvIHRoZXJlIGlzIG5vIG5vdGljYWJsZSBpbXBhY3Qgb24gYW55CiAgICAgICAgICBTV0lHIGdlbmVyYXRlZCBtb2R1bGVzLiAgIFRoaXMgY2hhbmdlIGlzIHByb2JhYmx5IG9ubHkgbm90aWNhYmxlCiAgICAgICAgICB0byBleHBlcnQgdXNlcnMuCgozLzI1Lzk3IDogQWRkZWQgdHlwZS1jaGVjayB0byB2ZXJib3NlIGFuZCBzdGF0IG1vZGUuICBTV0lHIHdpbGwgbm93IGdlbmVyYXRlIGEgbGlzdAogICAgICAgICAgb2YgYWxsIGRhdGF0eXBlcyB0aGF0IHdlcmUgdXNlZCBidXQgdW5kZWZpbmVkICh1c2VmdWwgZm9yIHRyYWNraW5nCiAgICAgICAgICBkb3duIHdlaXJkIGJ1Z3MpLiAgIFRoaXMgaXMgZW5hYmxlZCB3aXRoIHRoZSAtdiBvcHRpb24gKHdoaWNoCiAgICAgICAgICBpcyBub3cgb2ZmaWNpYWxseSBrbm93biBhcyAib3Zlcmx5IHZlcmJvc2UiIG1vZGUpIG9yIHRoZSAtc3RhdCBvcHRpb24uCgozLzI1Lzk3IDogU2xpZ2h0IGNoYW5nZSB0byB0aGUgcGFyc2VyIHRvIG1ha2UgaW5jbHVkZSBndWFyZHMgd29yayBjb3JyZWN0bHkuCiAgICAgICAgICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgI2lmbmRlZiBJTlRFUkZBQ0VfSQogICAgICAgICAgICAgICAgI2RlZmluZSBJTlRFUkZBQ0VfSQogICAgICAgICAgICAgICAgJW1vZHVsZSBmb29iYXIuaQogICAgICAgICAgICAgICAgLi4uIGRlY2xhcmF0aW9ucyAuLi4KICAgICAgICAgICAgICAgICNlbmRpZgoKMy8yNC85NyA6ICVjaGVja291dCBkaXJlY3RpdmUgYWRkZWQuICAgVGhpcyBhbGxvd3MgYW4gaW50ZXJmYWNlIGZpbGUgdG8KICAgICAgICAgIGV4dHJhY3QgZmlsZXMgZnJvbSB0aGUgU1dJRyBsaWJyYXJ5IGFuZCBwbGFjZSB0aGVtIGluIHRoZQogICAgICAgICAgY3VycmVudCBkaXJlY3RvcnkuICAgVGhpcyBjYW4gYmUgdXNlZCB0byBleHRyYWN0IHNjcmlwdHMgYW5kCiAgICAgICAgICBvdGhlciBoZWxwZXIgY29kZSB0aGF0IG1pZ2h0IGJlIGFzc29jaWF0ZWQgd2l0aCBsaWJyYXJ5IGZpbGVzLgogICAgICAgICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICVjaGVja291dCBhcnJheS50Y2wKCiAgICAgICAgICBXaWxsIGxvb2sgZm9yIGEgZmlsZSAiYXJyYXkudGNsIiBpbiB0aGUgbGlicmFyeSBhbmQgY29weSBpdAogICAgICAgICAgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgICBJZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUKICAgICAgICAgIGRpcmVjdG9yeSwgdGhpcyBkaXJlY3RpdmUgZG9lcyBub3RoaW5nIChpdCB3aWxsIG5vdCBvdmVyd3JpdGUgYW4KICAgICAgICAgIGV4aXN0aW5nIGZpbGUpLiAgVGhpcyBvbmx5IGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGZvciBub3cuCgozLzI0Lzk3IDogU1dJRyB3aWxsIG5vdyBsb29rIGluIHRoZSBTV0lHIExpYnJhcnkgZm9yIGEgZmlsZSBpZiBpdCBjYW4ndAogICAgICAgICAgZmluZCBpdCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBBcyBhIHJlc3VsdCwgaXQgaXMgZWFzeSB0bwogICAgICAgICAgbWFrZSBtb2R1bGVzIGZyb20gU1dJRyBsaWJyYXJ5IGZpbGVzLiAgRm9yIGV4YW1wbGUsIGlmIHlvdQogICAgICAgICAgd2FudCB0byBtYWtlIGEgUHl0aG9uIG1vZHVsZSBmcm9tIHRoZSBTV0lHIHRpbWVycyBsaWJyYXJ5LCBqdXN0CiAgICAgICAgICB0eXBlIHRoaXMgaW4gYW55IGRpcmVjdG9yeSA6CgogICAgICAgICAgICAgICAgc3dpZyAtcHl0aG9uIHRpbWVycy5pCgogICAgICAgICAgWW91IHdpbGwgZ2V0IHRoZSBmaWxlcyB0aW1lcnNfd3JhcC5jIGFuZCB0aW1lcnNfd3JhcC5kb2MgaW4KICAgICAgICAgIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB0aGF0IHlvdSBjYW4gbm93IGNvbXBpbGUuICAgVGhlIGZpbGUKICAgICAgICAgIHJlbWFpbnMgaW4gdGhlIFNXSUcgbGlicmFyeSAoYWx0aG91Z2ggeW91IGNhbiBjaGVjayBpdCBvdXQKICAgICAgICAgIHVzaW5nIHRoZSAtY28gb3B0aW9uKS4gICoqKiBOZXcgRmVhdHVyZSAqKioKCjMvMjQvOTcgOiAtY28gb3B0aW9uIGFkZGVkIHRvIFNXSUcgdG8gYWxsb3cgZWFzeSBhY2Nlc3MgdG8gdGhlIFNXSUcgbGlicmFyeS4KICAgICAgICAgIFdoZW4gdXNlZCwgdGhpcyBpbnN0cnVjdHMgU1dJRyB0byBjaGVjayBvdXQgYSBsaWJyYXJ5IGZpbGUgYW5kCiAgICAgICAgICBwbGFjZSBpdCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgdW5peCA+IHN3aWcgLWNvIGFycmF5LmkKICAgICAgICAgICAgICAgIGFycmF5LmkgY2hlY2tlZCBvdXQgZnJvbSB0aGUgU1dJRyBsaWJyYXJ5CiAgICAgICAgICAgICAgICB1bml4ID4KCiAgICAgICAgICBPbmNlIGluIHlvdXIgZGlyZWN0b3J5IHlvdSBjYW4gY3VzdG9taXplIHRoZSBmaWxlIHRvIHN1aXQgeW91cgogICAgICAgICAgcGFydGljdWxhciBwdXJwb3Nlcy4gIFRoZSBjaGVja291dCBvcHRpb24gbWFrZXMgaXQgZWFzeSB0bwogICAgICAgICAgZ3JhYiBsaWJyYXJ5IGZpbGVzIHdpdGhvdXQga25vd2luZyBhbnl0aGluZyBhYm91dCB0aGUgU1dJRwogICAgICAgICAgaW5zdGFsbGF0aW9uLCBidXQgaXQgYWxzbyBtYWtlcyBpdCBwb3NzaWJsZSB0byBzdGFydAogICAgICAgICAgaW5jbHVkaW5nIHNjcmlwdHMsIEMgY29kZSwgYW5kIG90aGVyIG1pc2NlbGxhbmVvdXMgZmlsZXMKICAgICAgICAgIGluIHRoZSBsaWJyYXJ5LiAgRm9yIGV4YW1wbGUsIHlvdSBjb3VsZCBwdXQgYSBjb29sIHNjcmlwdAogICAgICAgICAgaW4gdGhlIGxpYnJhcnkgYW5kIGNoZWNrIGl0IG91dCB3aGVuZXZlciB5b3Ugd2FudGVkIHRvIHVzZSBpdC4KICAgICAgICAgICoqKiBOZXcgRmVhdHVyZSAqKioKCjMvMjQvOTcgOiAjcHJhZ21hIGV4cG9ydCBkaXJlY3RpdmVzIGFkZGVkIHRvIFRjbCBvdXRwdXQgZm9yIGNvbXBpbGluZwogICAgICAgICAgc2hhcmVkIGxpYnJhcmllcyBvbiB0aGUgTWFjLgoKMy8yNC85NyA6IE1pbm9yIGNoYW5nZXMgdG8gd2lzaC5pIGFuZCB0Y2xzaC5pIGxpYnJhcnkgZmlsZXMgdG8gcHJvdmlkZQogICAgICAgICAgc3VwcG9ydCBmb3IgdGhlIE1hY2ludG9zaC4KCjMvMTkvOTcgOiBTV0lHJ3MgcG9saWN5IHRvd2FyZHMgTlVMTCBwb2ludGVycyBoYXMgYmVlbiByZWxheGVkLiAgVGhlCiAgICAgICAgICBwb2xpY3kgb2YgcmVxdWlyaW5nIGEgc3BlY2lhbCBjb21waWxlciBkaXJlY3RpdmUgLURBTExPV19OVUxMCiAgICAgICAgICB0byB1c2UgTlVMTCBwb2ludGVycyBpcyBubyBsb25nZXIgc3VwcG9ydGVkLiAgV2hpbGUgdGhpcyBtYXkKICAgICAgICAgIHNlZW0gInVuc2FmZSIsIGl0IHR1cm5zIG91dCB0aGF0IHlvdSBjYW4gdXNlIGEgImNoZWNrIgogICAgICAgICAgdHlwZW1hcCB0byBhY2hpZXZlIHNvbWUgc2FmZXR5LiAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChwZXJsNSxjaGVjaykgTm9kZSAqIHsKICAgICAgICAgICAgICAgICAgICAgICBpZiAoISR0YXJnZXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9haygiTlVMTCBQb2ludGVycyBub3QgYWxsb3dlZC4iKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBUaGlzIHByZXZlbnRzIGFueSBOVUxMIHZhbHVlIG9mIGEgIk5vZGUgKiIgcG9pbnRlciB0byBiZQogICAgICAgICAgcGFzc2VkIHRvIGEgZnVuY3Rpb24uICAgKEkgdGhpbmsgdGhpcyBpcyBtdWNoIGNsZWFuZXIKICAgICAgICAgIHRoYW4gdGhlIG9sZCAtREFMTE9XX05VTEwgaGFjayBhbnl3YXlzKS4KCjMvMTkvOTcgOiBGaXhlZCBwb2ludGVyIGhhbmRsaW5nIGVycm9ycyBpbiBQZXJsNSBtb2R1bGUuICBNb2R1bGVzIG5vCiAgICAgICAgICBsb25nZXIgY29yZSBkdW1wIHdoZW4gYSBQZXJsIHJlZmVyZW5jZSBpcyBpbmFkdmVydGVudGx5CiAgICAgICAgICBwYXNzZWQgaW4gYXMgYSBDIHBvaW50ZXIuCgozLzE4Lzk3IDogQWRkZWQgYSAiY2hlY2siIHR5cGVtYXAuICAgVGhpcyBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUKICAgICAgICAgIHZhbGlkaXR5IG9mIGZ1bmN0aW9uIGlucHV0IHZhbHVlcy4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChwZXJsNSxjaGVjaykgaW50IHBvc2ludCB7CiAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR0YXJnZXQgPCAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9haygiQXJndW1lbnQgaXMgbm90IGEgcG9zaXRpdmUgaW50ZWdlciIpOwogICAgICAgICAgICAgICAgfQoKMy8xOC85NyA6IEFkZGVkIGFuICRhcmcgdmFyaWFibGUgdG8gVGNsIHR5cGVtYXBzLiAgIFRoaXMgbWFrZXMgaXQgZWFzaWVyCiAgICAgICAgICB0byByZXR1cm4gYXJndW1lbnQgdmFsdWVzIGJ5ICJyZWZlcmVuY2UiLgoKMy8xOC85NyA6IEZpeGVkIGEgY29kZSBnZW5lcmF0aW9uIGJ1ZyB3aGVuIHVzaW5nIEMrKyByZWZlcmVuY2VzIGFuZAogICAgICAgICAgdGhlICVhZGRtZXRob2RzIGRpcmVjdGl2ZS4KCjMvMTgvOTcgOiBGaXhlZCBhIGZldyBnbGl0Y2hlcyBpbiB0aGUgdHlwZW1hcCBtb2R1bGUgd2l0aCByZXNwZWN0IHRvCiAgICAgICAgICBjaGFpbmluZy4gRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKHRjbCxpbikgaW50IHsKICAgICAgICAgICAgICAgICAgICAgICAkaW4gICAgICAgICAgICAgICAgLy8gSW5zZXJ0cyBwcmV4aXN0aW5nIHR5cGVtYXAKICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlJlY2VpdmVkIGEgJWRcbiIsICR0YXJnZXQpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFRoaXMgaGFzIGJlZW4gYWxsb3dlZCBmb3IgcXVpdGUgc29tZSB0aW1lLCBidXQgZGlkbid0IHdvcmsKICAgICAgICAgIGlmIG5vIGV4aXN0aW5nIHR5cGVtYXAgd2FzIGRlZmluZWQuICBOb3csIGl0IHN0aWxsIGRvZXNuJ3QKICAgICAgICAgIHdvcmsgaWYgbm8gZXhpc3RpbmcgdHlwZW1hcCBpcyBkZWZpbmVkLCBidXQgaXQgaXNzdWVzIGEKICAgICAgICAgIHdhcm5pbmcgbWVzc2FnZS4gICBUaGVyZSBpcyBzb21lIHN1cHBvcnQgdXNpbmcgZGVmYXVsdCB0eXBlbWFwcywKICAgICAgICAgIGJ1dCBub25lIG9mIHRoZSBsYW5ndWFnZSBtb2R1bGVzIHRha2UgYWR2YW50YWdlIG9mIGl0LiAgVGhpcwogICAgICAgICAgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZXhwZXJpbWVudGFsIGF0IHRoaXMgdGltZS4KClZlcnNpb24gMS4xYjUgUGF0Y2ggMSAoTWFyY2ggMTYsIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgozLzE2Lzk3IDogRml4ZWQgcmVmZXJlbmNlcyBidWcgd2l0aCBDKysgY29kZSBnZW5lcmF0aW9uLgoKMy8xNi85NyA6IEZpeGVkIGluaXRpYWxpemF0aW9uIGJ1ZyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0gdGhhdAogICAgICAgICAgd2FzIGNhdXNpbmcgd2VpcmQgcHJvYmxlbXMuCgozLzE2Lzk3IDogRml4ZWQgZmF0YWwgYnVnIHdpdGggLWMgb3B0aW9uIGluIHRoZSBQeXRob24gbW9kdWxlLgoKMy8xMy85NyA6IEZpeGVkIGJ1ZyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0gaW52b2x2aW5nIHRoZSAldGV4dCBkaXJlY3RpdmUKICAgICAgICAgIGFuZCBzb3J0aW5nLiBJbiB0aGUgb2xkIHN5c3RlbSwgJXRleHQgZW50cmllcyB3b3VsZCBmbG9hdCB0byB0aGUKICAgICAgICAgIHRvcCBvZiBhIHNlY3Rpb24gYmVjYXVzZSB0aGV5IHdlcmUgIm5hbWVsZXNzIi4gICBOb3cgdGhleSBhcmUKICAgICAgICAgIGF0dGFjaGVkIHRvIHRoZSBwcmV2aW91cyBkZWNsYXJhdGlvbiBhbmQgd2lsbCBzdGF5IGluIHRoZSBwcm9wZXIKICAgICAgICAgIGxvY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSBwcmV2aW91cyBlbnRyeS4KClZlcnNpb24gMS4xYjUgKE1hcmNoIDEyLCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjMvMTEvOTcgOiBGaXhlZCBjb21waWxhdGlvbiBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IFRjbC9UayA4LjBhMi4KICAgICAgICAgICoqKiBJTkNPTVBBVElCSUxJVFkgKioqIFNXSUcgbm8gbG9uZ2VyIHdvcmtzIHdpdGggVGNsL1RrIDguMGExLgoKMy8xMC85NyA6IEZpeGVkIGJ1ZyB3aXRoIGlnbm9yZWQgYXJndW1lbnRzIGFuZCBDKysgbWVtYmVyIGZ1bmN0aW9ucyBpbgogICAgICAgICAgdGhlIFB5dGhvbiBtb2R1bGUuCgozLzkvOTcgIDogUGFyc2luZyBidWdzIHdpdGggbmVzdGVkIGNsYXNzIGRlZmluaXRpb25zIGFuZCBwcml2YXRlbHkKICAgICAgICAgIGRlY2xhcmVkIG5lc3RlZCBjbGFzcyBkZWZpbml0aW9ucyBmaXhlZC4KCjMvOS85NyAgOiBGaXhlZCBhIGZldyBtaW5vciBjb2RlIGdlbmVyYXRpb24gYnVncyB3aXRoIEMrKyBjbGFzc2VzIGFuZAogICAgICAgICAgY29uc3RydWN0b3JzLiAgIEluIHNvbWUgY2FzZXMsIHRoZSByZXN1bHRpbmcgd3JhcHBlciBjb2RlCiAgICAgICAgICB3b3VsZCBub3QgY29tcGlsZSBwcm9wZXJseS4gICBTV0lHIG5vdyBhdHRlbXB0cyB0byB1c2UKICAgICAgICAgIHRoZSBkZWZhdWx0IGNvcHkgY29uc3RydWN0b3IgaW5zdGVhZC4KCjMvOC85NyAgOiBBZGRlZCBhIC1sIG9wdGlvbiB0byBTV0lHIHRoYXQgYWxsb3dzIGFkZGl0aW9uYWwgU1dJRyBsaWJyYXJ5IGZpbGVzCiAgICAgICAgICB0byBiZSBncmFiYmVkIHdpdGhvdXQgaGF2aW5nIHRoZW0gc3BlY2lmaWVkIGluIHRoZSBpbnRlcmZhY2UgZmlsZS4KICAgICAgICAgIFRoaXMgbWFrZXMgaXQgZWFzaWVyIHRvIGtlZXAgdGhlIGludGVyZmFjZSBmaWxlIGNsZWFuIGFuZCBtb3ZlIGNlcnRhaW4KICAgICAgICAgIG9wdGlvbnMgaW50byBhIE1ha2VmaWxlLiAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgc3dpZyAtdGNsIGV4YW1wbGUuaSAgICAgICAgICAgICAgIyAgQnVpbGQgYSBub3JtYWwgVGNsIGV4dGVuc2lvbgogICAgICAgICAgICAgIHN3aWcgLXRjbCAtbHdpc2guaSBleGFtcGxlLmkgICAgICMgIEJ1aWxkIGl0IGFzIGEgd2lzaCBleHRlbnNpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICBieSBpbmNsdWRpbmcgdGhlICd3aXNoLmknIGZpbGUuCgogICAgICAgICAgICAgIHN3aWcgLXB5dGhvbiBleGFtcGxlLmkgICAgICAgICAgICMgQnVpbGQgYSBkeW5hbWljYWxseSBsb2FkZWQgZXh0ZW5zaW9uCiAgICAgICAgICAgICAgc3dpZyAtcHl0aG9uIC1sZW1iZWQuaSBleGFtcGxlLmkgIyBCdWlsZCBhIHN0YXRpYyBleHRlbnNpb24KCiAgICAgICAgICBUaGVzZSBraW5kcyBvZiBvcHRpb25zIGNvdWxkIHByZXZpb3VzbHkgYmUgYWNjb21wbGlzaGVkIHdpdGgKICAgICAgICAgIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHN1Y2ggYXMgOgoKICAgICAgICAgICAgICAgICAgICVtb2R1bGUgZXhhbXBsZQogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAjaWZkZWYgU1RBVElDCiAgICAgICAgICAgICAgICAgICAlaW5jbHVkZSBlbWJlZC5pCiAgICAgICAgICAgICAgICAgICAjZW5kaWYKCjMvOC85NyAgOiBJbmNvcnBvcmF0ZWQgY2hhbmdlcyB0byBHdWlsZSBtb2R1bGUgdG8gdXNlIHRoZSBuZXcgZ2ggaW50ZXJmYWNlCiAgICAgICAgICBpbiBGU0YgR3VpbGUgMS4wLiAgICBUaGUgb2xkZXIgZ3NjbSBpbnRlcmZhY2UgdXNlZCBpbiBDeWdudXMKICAgICAgICAgIEd1aWxlIHJlbGVhc2VzIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgYnkgU1dJRy4KCjMvOC85NyAgOiBDbGVhbmVkIHVwIHRoZSBUY2wgTmV0c2NhcGUgcGx1Z2luIGV4YW1wbGUuICAgSXQgc2hvdWxkIHdvcmsgd2l0aAogICAgICAgICAgdmVyc2lvbiAxLjEgb2YgdGhlIHBsdWdpbiBub3cuCgozLzgvOTcgIDogQWRkZWQgYmV0dGVyIGFycmF5IHN1cHBvcnQgdG8gdGhlIHR5cGVtYXAgbW9kdWxlLiAgVGhlIGtleXdvcmQKICAgICAgICAgIEFOWSBjYW4gbm93IGJlIHVzZWQgdG8gbWF0Y2ggYW55IGFycmF5IGRpbWVuc2lvbi4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgICAgJXR5cGVtYXAodGNsLGluKSBkb3VibGUgW0FOWV0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4gZ2V0IGFuIGFycmF5IC4uLgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBUaGlzIHdpbGwgbWF0Y2ggYW55IHNpbmdsZS1kaW1lbnNpb25hbCBkb3VibGUgYXJyYXkuICAgVGhlIGFycmF5CiAgICAgICAgICBkaW1lbnNpb24gaXMgcGFzc2VkIGluIHRoZSB2YXJpYWJsZXMgJGRpbTAsICRkaW0xLCAuLi4gJGRpbTkuICBGb3IKICAgICAgICAgIGV4YW1wbGUgOgoKCQkgICAgJXR5cGVtYXAodGNsLGluKSBkb3VibGUgW0FOWV1bQU5ZXVtBTlldIHsKCQkJcHJpbnRmKCJSZWNlaXZlZCBhIGRvdWJsZVslZF1bJWRdWyVkXVxuIiwkZGltMCwkZGltMSwkZGltMik7CgkgICAgICAgICAgICB9CgogICAgICAgICAgQW55IHR5cGVtYXAgaW52b2x2aW5nIGEgc3BlY2lmaWMgYXJyYXkgZGltZW5zaW9uIHdpbGwgb3ZlcnJpZGUgYW55CiAgICAgICAgICBzcGVjaWZpZWQgd2l0aCB0aGUgQU5ZIHRhZy4gIFRodXMsIGEgJXR5cGVtYXAodGNsLGluKSBkb3VibGUgWzVdWzRdW0FOWV0ge30KICAgICAgICAgIHdvdWxkIG92ZXJyaWRlIGEgZG91YmxlIFtBTlldW0FOWV1bQU5ZXS4gIEhvd2V2ZXIsIG92ZXJ1c2Ugb2YgdGhlIEFOWQogICAgICAgICAgdGFnIGluIGFycmF5cyBvZiBoaWdoLWRpbWVuc2lvbnMgbWF5IG5vdCB3b3JrIGFzIHlvdSBleHBlY3QgZHVlIHRvCiAgICAgICAgICB0aGUgcGF0dGVybiBtYXRjaGluZyBydWxlIHVzZWQuIEZvciBleGFtcGxlLCB3aGljaCBvZiB0aGUgZm9sbG93aW5nCiAgICAgICAgICB0eXBlbWFwcyBoYXMgcHJlY2VkZW5jZT8KCiAgICAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgZG91YmxlIFtBTlldWzVdIHt9ICAgICAvLyBBdm9pZCB0aGlzIQogICAgICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGRvdWJsZSBbNV1bQU5ZXSB7fQoKMy83Lzk3ICA6IEZpeGVkIGEgbnVtYmVyIG9mIGJ1Z3MgcmVsYXRlZCB0byBtdWx0aS1kaW1lbnNpb25hbCBhcnJheSBoYW5kbGluZy4KICAgICAgICAgIFR5cGVkZWZzIGludm9sdmluZyBtdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgbm93IHdvcmtzIGNvcnJlY3RseS4KICAgICAgICAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiBkb3VibGUgTUFUUklYWzRdWzRdOwoKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICBleHRlcm4gZG91YmxlIGZvbyhNQVRSSVggYSk7CgogICAgICAgICAgVHlwZWNhc3Rpbmcgb2YgcG9pbnRlcnMgaW50byBtdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgaXMgbm93CiAgICAgICAgICBpbXBsZW1lbnRlZCBwcm9wZXJseSB3aGVuIG1ha2luZyBDL0MrKyBmdW5jdGlvbiBjYWxscy4KCjMvNi85NyAgOiBGaXhlZCBwb3RlbnRpYWxseSBkYW5nZXJvdXMgYnVnIGluIHRoZSBUY2wgT2JqZWN0LW9yaWVudGVkCiAgICAgICAgICBpbnRlcmZhY2UuICBXZWxsLCBhY3R1YWxseSwgZGlkbid0IGZpeCBpdCBidXQgaXNzdWVkIGEKICAgICAgICAgIFRjbCBlcnJvciBpbnN0ZWFkLiAgIFRoZSBidWcgd291bGQgbWFuaWZlc3QgaXRzZWxmIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAgICUgc2V0IGwgW0xpc3RdICAgICAgICAgICAjIENyZWF0ZSBhbiBvYmplY3QKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAlIHNldCBtIFtMaXN0IC10aGlzICRsXSAgIyBNYWtlICRtIGludG8gYW4gb2JqZWN0IGFzc3VtaW5nICRsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY29udGFpbnMgYSBwb2ludGVyLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFNpbmNlICRtID09ICRsLCAkbCBnZXRzIGRlc3Ryb3llZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChzaW5jZSBpdHMgdGhlIHNhbWUgY29tbWFuZCBuYW1lKQogICAgICAgICAgICAgICAgICUgJG0gaW5zZXJ0IEZvbwogICAgICAgICAgICAgICAgIFNlZ21lbnRhdGlvbiBmYXVsdCAgICAgICAjIE5vdGUgOiB0aGUgbGlzdCBubyBsb25nZXIgZXhpc3RzIQoKICAgICAgICAgIE5vdywgYW4gZXJyb3Igd2lsbCBiZSBnZW5lcmF0ZWQgaW5zdGVhZCBvZiByZWRlZmluaW5nIHRoZSBjb21tYW5kLgogICAgICAgICAgQXMgaW4gOgoKICAgICAgICAgICAgICAgICAlIHNldCBsIFtMaXN0XQogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICUgc2V0IG0gW0xpc3QgLXRoaXMgJGxdCiAgICAgICAgICAgICAgICAgT2JqZWN0IG5hbWUgYWxyZWFkeSBleGlzdHMhCgogICAgICAgICAgVXNlIGNhdGNoe30gdG8gaWdub3JlIHRoZSBlcnJvci4KCjMvMy85NyAgOiBCZXR0ZXIgc3VwcG9ydCBmb3IgZW51bXMgYWRkZWQuICAgRGF0YXR5cGVzIG9mICdlbnVtIE15RW51bScKICAgICAgICAgIGFuZCB0eXBlZGVmcyBzdWNoIGFzICd0eXBlZGVmIGVudW0gTXlFbnVtIEZvbzsnIG5vdyB3b3JrLgoKMy8zLzk3ICA6IFBhcnNlciBtb2RpZmllZCB0byBpZ25vcmUgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXJzIHN1Y2ggYXMgOgoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIDogcHVibGljIEJhciB7CiAgICAgICAgICAgICAgIGludCBhLGI7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgRm9vKGludCBpKSA6IGEoMCksIGIoaSksIEJhcihpLDApIHsgfTsKICAgICAgICAgICAgICAgfTsKCjMvMy85NyAgOiBNb2RpZmllZCBwYXJzZXIgdG8gaWdub3JlIEMrKyBleGNlcHRpb24gc3BlY2lmaWNhdGlvbnMgc3VjaCBhcyA6CgogICAgICAgICAgICAgICBpbnQgZm9vKGRvdWJsZSkgdGhyb3coWCxZKTsKCjMvMy85NyAgOiBBZGRlZCAlaW1wb3J0IGRpcmVjdGl2ZS4gIFRoaXMgd29ya3MgZXhhY3RseSBsaWtlICVleHRlcm4KICAgICAgICAgIGV4Y2VwdCBpdCB0ZWxscyB0aGUgbGFuZ3VhZ2UgbW9kdWxlIHRoYXQgdGhlIGRlY2xhcmF0aW9ucyBhcmUKICAgICAgICAgIGNvbWluZyBmcm9tIGEgc2VwYXJhdGUgbW9kdWxlLiAgIFRoaXMgaXMgdXN1YWxseSBvbmx5CiAgICAgICAgICBuZWVkZWQgd2hlbiB3b3JraW5nIHdpdGggc2hhZG93IGNsYXNzZXMuCgozLzIvOTcgIDogQ2hhbmdlZCBwb2ludGVyIHR5cGUtY2hlY2tlciB0byBiZSBzaWduaWZpY2FudGx5IG1vcmUKICAgICAgICAgIGVmZmljaWVudCB3aGVuIHdvcmtpbmcgd2l0aCBkZXJpdmVkIGRhdGF0eXBlcy4gIFRoaXMKICAgICAgICAgIGhhcyBiZWVuIGFjY29tcGxpc2hlZCBieSBzdG9yaW5nIHR5cGUtbWFwcGluZ3MgaW4gc29ydGVkCiAgICAgICAgICBvcmRlciwgdXNpbmcgYmluYXJ5IHNlYXJjaCBzY2hlbWVzLCBhbmQgY2FjaGluZyByZWNlbnRseQogICAgICAgICAgdXNlZCBkYXRhdHlwZXMuICAgRm9yIFNXSUcgZ2VuZXJhdGVkIEMrKyBtb2R1bGVzIHRoYXQKICAgICAgICAgIG1ha2UgYSBsYXJnZSBudW1iZXIgb2YgQyBmdW5jdGlvbiBjYWxscyB3aXRoIGRlcml2ZWQgdHlwZXMsCiAgICAgICAgICB0aGlzIGNvdWxkIHJlc3VsdCBpbiBzcGVlZHVwcyBvZiBiZXR3ZWVuIDEwMCBhbmQgNTAwMDAgcGVyY2VudC4KICAgICAgICAgIEhvd2V2ZXIsIGR1ZSB0byB0aGUgcmVxdWlyZWQgc29ydGluZyBvcGVyYXRpb24sIG1vZHVsZQogICAgICAgICAgbG9hZGluZyB0aW1lIG1heSBpbmNyZWFzZWQgc2xpZ2h0bHkgd2hlbiB0aGVyZSBhcmUgbG90cyBvZgogICAgICAgICAgZGF0YXR5cGVzLgoKMy8yLzk3ICA6IEZpeGVkIHNvbWUgQysrIGNvbXBpbGF0aW9uIHByb2JsZW1zIHdpdGggUHl0aG9uCiAgICAgICAgICBlbWJlZC5pIGxpYnJhcnkgZmlsZXMuCgoyLzI3Lzk3IDogU2xpZ2h0IGNoYW5nZSB0byBDKysgY29kZSBnZW5lcmF0aW9uIHRvIHVzZSBjb3B5IGNvbnN0cnVjdG9ycwogICAgICAgICAgd2hlbiByZXR1cm5pbmcgY29tcGxleCBkYXRhIHR5cGUgYnkgdmFsdWUuCgoyLzI2Lzk3IDogRml4ZWQgYnVnIGluIFB5dGhvbiBtb2R1bGUgd2l0aCAtYyBvcHRpb24uCgoyLzI2Lzk3IDogU2xpZ2h0IHR3ZWFrIG9mIHBhcnNlciB0byBhbGxvdyB0cmFpbGluZyBjb21tYSBpbiBlbnVtZXJhdGlvbnMKICAgICAgICAgIHN1Y2ggYXMKCiAgICAgICAgICAgICAgICBlbnVtIFZhbHVlIChBTEUsIFNUT1VULCBMQUdFUiwgfTsKCjIvMjUvOTcgOiBGaXhlZCBjb2RlIGdlbmVyYXRpb24gYnVnIGluIFRjbCBtb2R1bGUgd2hlbiB1c2luZyB0aGUKICAgICAgICAgICVuYW1lKCkgZGlyZWN0aXZlIG9uIGEgY2xhc3NuYW1lLgoKMi8yNS85NyA6IEZpbmlzaGVkIGNvZGUtc2l6ZSBvcHRpbWl6YXRpb24gb2YgQysrIGNvZGUgZ2VuZXJhdGlvbiB3aXRoCiAgICAgICAgICBpbmhlcml0YW5jZSBvZiBhdHRyaWJ1dGVzLiAgICBJbmhlcml0ZWQgYXR0cmlidXRlcyBub3cKICAgICAgICAgIG9ubHkgZ2VuZXJhdGUgb25lIHNldCBvZiB3cmFwcGVyIGZ1bmN0aW9ucyB0aGF0IGFyZSByZS11c2VkCiAgICAgICAgICBpbiBhbnkgZGVyaXZlZCBjbGFzc2VzLiAgIFRoaXMgY291bGQgcHJvdmlkZSBiaWcgY29kZQogICAgICAgICAgc2l6ZSBpbXByb3ZlbWVudHMgaW4gc29tZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgaW50ZXJmYWNlcy4KCjIvMjUvOTcgOiBQZXJsNSBtb2R1bGUgbW9kaWZpZWQgdG8gc3VwcG9ydCBib3RoIHRoZSBVbml4IGFuZCBXaW5kb3dzCiAgICAgICAgICB2ZXJzaW9ucy4gIFRoZSB3aW5kb3dzIHZlcnNpb24gaGFzIGJlZW4gdGVzdGVkIHdpdGggdGhlCiAgICAgICAgICBBY3RpdmV3YXJlIHBvcnQgb2YgUGVybCA1LjAwMyBydW5uaW5nIHVuZGVyIFdpbmRvd3MgOTUuCiAgICAgICAgICBUaGUgQyBzb3VyY2UgZ2VuZXJhdGVkIGJ5IFNXSUcgc2hvdWxkIGNvbXBpbGUgd2l0aG91dAogICAgICAgICAgbW9kaWZpY2F0aW9uIHVuZGVyIGJvdGggdmVyc2lvbnMgb2YgUGVybCwgYnV0IGlzIG5vdwogICAgICAgICAgZXZlbiBtb3JlIGhpZGVvdXMgdGhhbiBiZWZvcmUuCgoyLzI1Lzk3IDogTW9kaWZpZWQgcGFyc2VyIHRvIGFsbG93IHNjb3BlIHJlc29sdXRpb24gb3BlcmF0aW9uIHRvCiAgICAgICAgICBhcHBlYXIgaW4gZXhwcmVzc2lvbnMgYW5kIGRlZmF1bHQgYXJndW1lbnRzIGFzIGluIDoKCiAgICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgYSA9ICBCYXI6OmRlZnZhbHVlKTsKCjIvMjUvOTcgOiBGaXhlZCBidWcgd2hlbiByZXNvbHZpbmcgc3ltYm9scyBpbnNpZGUgQysrIGNsYXNzZXMuCiAgICAgICAgICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICBlbnVtIFZhbHVlIHtBTEUsIFNUT1VULCBMQUdFUn07CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIHZvaWQgZGVmYXJnKFZhbHVlIHYgPSBTVE9VVCk7CgogICAgICAgICAgICAgIH07CgoyLzI0Lzk3IDogRml4ZWQgYnVnIHdpdGggbWVtYmVyIGZ1bmN0aW9ucyByZXR1cm5pbmcgdm9pZCAqLgoKMi8yMy85NyA6IE1vZGlmaWVkIFB5dGhvbiBtb2R1bGUgdG8gYmUgYmV0dGVyIGJlaGF2ZWQgdW5kZXIgV2luZG93cwoKICAgICAgICAgICAgLSAgTW9kdWxlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGlzIG5vdyBwcm9wZXJseSBleHBvcnRlZC4KICAgICAgICAgICAgICAgSXQgc2hvdWxkIG5vdCBiZSBuZWNjZXNzYXJ5IHRvIGV4cGxpY2l0bHkgZXhwb3J0IHRoaXMgZnVuY3Rpb24KICAgICAgICAgICAgICAgeW91cnNlbGYuCgogICAgICAgICAgICAtICBCaXphcnJlIGNvbXBpbGF0aW9uIHByb2JsZW1zIHdoZW4gY29tcGlsaW5nIHRoZSBTV0lHIHdyYXBwZXIKICAgICAgICAgICAgICAgY29kZSBhcyBBTlNJIEMgdW5kZXIgVmlzdWFsIEMrKyA0LnggZml4ZWQuCgogICAgICAgICAgICAtICBUZXN0ZWQgd2l0aCBib3RoIHRoZSBzdG9jayBQeXRob24tMS40IGRpc3RyaWJ1dGlvbiBhbmQgUHl0aG9ud2luCiAgICAgICAgICAgICAgIHJ1bm5pbmcgdW5kZXIgV2luOTUuCgoyLzE5Lzk3IDogRml4ZWQgdHlwZWRlZiBoYW5kbGluZyBidWcgaW4gUGVybDUgc2hhZG93IGNsYXNzZXMuCgoyLzE5Lzk3IDogQWRkZWQgZXhjZXB0aW9uIHN1cHBvcnQuICBUbyB1c2UgaXQsIGRvIHRoZSBmb2xsb3dpbmcgOgoKICAgICAgICAgICAgICAlZXhjZXB0KGxhbmcpIHsKICAgICAgICAgICAgICAgICAgLi4uIHRyeSBwYXJ0IG9mIHRoZSBleGNlcHRpb24gLi4uCiAgICAgICAgICAgICAgICAgICRmdW5jdGlvbgogICAgICAgICAgICAgICAgICAuLi4gY2F0Y2ggcGFydCBvZiBleGNlcHRpb24gLi4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICRmdW5jdGlvbiBpcyBhIFNXSUcgdmFyaWFibGUgdGhhdCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZQogICAgICAgICAgYWN0dWFsIEMvQysrIGZ1bmN0aW9uIGNhbGwgaW4gYSB3cmFwcGVyIGZ1bmN0aW9uLiAgVGh1cywKICAgICAgICAgIGEgcmVhbCBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiBtaWdodCBsb29rIGxpa2UgdGhpcyA6CgogICAgICAgICAgICAgJWV4Y2VwdChwZXJsNSkgewogICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAkZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoY2hhciAqJiBzeikgewogICAgICAgICAgICAgICAgICAgIC4uLiBwcm9jZXNzIGFuIGV4Y2VwdGlvbiAuLi4KICAgICAgICAgICAgICAgICAgfSBjYXRjaCguLi4pIHsKICAgICAgICAgICAgICAgICAgICBjcm9haygiVW5rbm93biBleGNlcHRpb24uIEJhaWxpbmcgb3V0Li4uIik7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KCjIvMTkvOTcgOiBBZGRlZCBzdXBwb3J0IGZvciBtYW5hZ2luZyBnZW5lcmljIGNvZGUgZnJhZ21lbnRzIChuZWVkZWQKICAgICAgICAgIGZvciBleGNlcHRpb25zKS4KCjIvMTkvOTcgOiBGaXhlZCBzb21lIHJlYWxseSBvYnNjdXJlIHR5cGVtYXAgc2NvcGluZyBidWdzIGluIHRoZSBDKysKICAgICAgICAgIGhhbmRsZXIuCgoyLzE4Lzk3IDogQ2xlYW5lZCB1cCBwZXJsbWFpbi5pIGZpbGUgYnkgcmVtb3Zpbmcgc29tZSBwcm9ibGVtYXRpYywKICAgICAgICAgIGJ1dCBzZWVtaW5nbHkgdW5uZWNlc3NhcnkgZGVjbGFyYXRpb25zLgoKMi8xOC85NyA6IE9wdGltaXplZCBoYW5kbGluZyBvZiBtZW1iZXIgZnVuY3Rpb25zIHVuZGVyIGluaGVyaXRhbmNlLgogICAgICAgICAgU1dJRyBjYW4gbm93IHVzZSB3cmFwcGVyIGZ1bmN0aW9ucyBnZW5lcmF0ZWQgZm9yIGEKICAgICAgICAgIGJhc2UgY2xhc3MgaW5zdGVhZCBvZiByZWdlbmVyYXRpbmcgd3JhcHBlcnMgZm9yCiAgICAgICAgICB0aGUgc2FtZSBmdW5jdGlvbnMgaW4gYSBkZXJpdmVkIGNsYXNzLiAgICBUaGlzIGNvdWxkCiAgICAgICAgICBtYWtlIGEgZHJhc3RpYyByZWR1Y3Rpb24gaW4gd3JhcHBlciBjb2RlIHNpemUgZm9yIEMrKwogICAgICAgICAgYXBwbGljYXRpb25zIHdpdGggZGVlcCBpbmhlcml0YW5jZSBoaWVyYXJjaGllcyBhbmQKICAgICAgICAgIGxvdHMgb2YgZnVuY3Rpb25zLgoKMi8xOC85NyA6IEFkZGl0aW9uYWwgbWV0aG9kcyBzcGVjaWZpZWQgd2l0aCAlYWRkbWV0aG9kcyBjYW4gbm93CiAgICAgICAgICBiZSBpbmhlcml0ZWQgYWxvbmcgd2l0aCBub3JtYWwgQysrIG1lbWJlciBmdW5jdGlvbnMuCgoyLzE4Lzk3IDogTWlub3IgaW50ZXJuYWwgZml4ZXMgdG8gbWFrZSBTV0lHJ3Mgc3RyaW5nIGhhbmRsaW5nIGEgbGl0dGxlCiAgICAgICAgICBzYWZlci4KCjIvMTYvOTcgOiBNb3ZlZCBzb21lIGNvZGUgZ2VuZXJhdGlvbiBvZiBUY2wgc2hhZG93IGNsYXNzZXMgdG8KICAgICAgICAgIGxpYnJhcnkgZmlsZXMuCgoyLzE2Lzk3IDogRml4ZWQgZG9jdW1lbnRhdGlvbiBlcnJvciBvZiAnLWNvbmZpZ3VyZScgbWV0aG9kIGluCiAgICAgICAgICBUY2wgbW9kdWxlcy4KCjIvMTYvOTcgOiBNb2RpZmllZCBQZXJsNSBtb2R1bGUgc2xpZ2h0bHkgdG8gYWxsb3cgdHlwZW1hcHMKICAgICAgICAgIHRvIHVzZSBQZXJsIHJlZmVyZW5jZXMuCgoyLzEyLzk3IDogRml4ZWQgYXJndW1lbnQgY2hlY2tpbmcgYnVnIHRoYXQgd2FzIGludHJvZHVjZWQgYnkKICAgICAgICAgIGRlZmF1bHQgYXJndW1lbnRzIChmdW5jdGlvbiBjYWxscyB3aXRoIHRvbyBtYW55CiAgICAgICAgICBhcmd1bWVudHMgd291bGQgc3RpbGwgYmUgZXhlY3V0ZWQpLiAgRnVuY3Rpb25zIG5vdwogICAgICAgICAgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBhcmd1bWVudHMgYXMgQyB2ZXJzaW9uCiAgICAgICAgICAod2l0aCBwb3NzaWJpbGl0eSBvZiBkZWZhdWx0L29wdGlvbmFsIGFyZ3VtZW50cwogICAgICAgICAgc3RpbGwgc3VwcG9ydGVkKS4KCjIvMTIvOTcgOiBGaXhlZCBkZWZhdWx0IGFyZ3VtZW50IGJ1ZyBpbiBQZXJsNSBtb2R1bGUgd2hlbgogICAgICAgICAgZ2VuZXJhdGluZyB3cmFwcGVyIGZ1bmN0aW9ucyBpbnZvbHZpbmcgZGVmYXVsdAogICAgICAgICAgYXJndW1lbnRzIG9mIGNvbXBsZXggZGF0YXR5cGVzLgoKMi8xMi85NyA6IEZpeGVkIHR5cGVtYXAgc2NvcGluZyBwcm9ibGVtcy4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgJXR5cGVtYXAodGNsLGluKSBkb3VibGUgewogICAgICAgICAgICAgICAgICAgIC4uIGdldCBhIGRvdWJsZSAuLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICBkb3VibGUgYmFyKGRvdWJsZSk7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAldHlwZW1hcCh0Y2wsaW4pIGRvdWJsZSB7CiAgICAgICAgICAgICAgICAgICAgLi4gbmV3IGdldCBkb3VibGUgLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgV291bGQgYXBwbHkgdGhlIHNlY29uZCB0eXBlbWFwIHRvIGFsbCBmdW5jdGlvbnMgaW4gRm9vCiAgICAgICAgICBkdWUgdG8gZGVsYXllZCBnZW5lcmF0aW9uIG9mIEMrKyB3cmFwcGVyIGNvZGUgKGNsZWFybHkgdGhpcwogICAgICAgICAgaXMgbm90IHRoZSBkZXNpcmVkIGVmZmVjdCkuICAgUHJvYmxlbSBoYXMgYmVlbiBmaXhlZCBieQogICAgICAgICAgYXNzaWduaW5nIHVuaXF1ZSBudW1lcmljYWwgaWRlbnRpZmllcnMgdG8gZXZlcnkgZGF0YXR5cGUgaW4KICAgICAgICAgIGFuIGludGVyZmFjZSBmaWxlIGFuZCByZWNvcmRpbmcgdGhlICJyYW5nZSBvZiBlZmZlY3QiIG9mIGVhY2gKICAgICAgICAgIHR5cGVtYXAuCgoyLzExLzk3IDogQWRkZWQgc3VwcG9ydCBmb3IgImlnbm9yZSIgYW5kICJkZWZhdWx0IiB0eXBlbWFwcy4gIE9ubHkgdXNlCiAgICAgICAgICBpZiB5b3UgYWJzb2x1dGVseSBrbm93IHdoYXQgeW91J3JlIGRvaW5nLgoKMi85Lzk3ICA6IEFkZGVkIGF1dG9tYXRpYyBjcmVhdGlvbiBvZiBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGZvcgogICAgICAgICAgQyBzdHJ1Y3RzIGFuZCBDKysgY2xhc3NlcyB0aGF0IGRvIG5vdCBzcGVjaWZ5IGFueSBzb3J0IG9mCiAgICAgICAgICBjb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yLiAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgZW5hYmxlZCBieQogICAgICAgICAgcnVubmluZyBTV0lHIHdpdGggdGhlICctbWFrZV9kZWZhdWx0JyBvcHRpb24gb3IgYnkgaW5zZXJ0aW5nCiAgICAgICAgICB0aGUgZm9sbG93aW5nIHByYWdtYSBpbnRvIGFuIGludGVyZmFjZSBmaWxlIDoKCiAgICAgICAgICAgICAgICAgJXByYWdtYSBtYWtlX2RlZmF1bHQKCiAgICAgICAgICBUaGUgZm9sbG93aW5nIHByYWdtYSBkaXNhYmxlcyBhdXRvbWF0aWMgY29uc3RydWN0b3IgZ2VuZXJhdGlvbgoKICAgICAgICAgICAgICAgICAlcHJhZ21hIG5vX2RlZmF1bHQKCjIvOS85NyAgOiBBZGRlZCAtbWFrZV9kZWZhdWx0IG9wdGlvbiBmb3IgcHJvZHVjaW5nIGRlZmF1bHQgY29uc3RydWN0b3JzCiAgICAgICAgICBhbmQgZGVzdHJ1Y3RvcnMgZm9yIGNsYXNzZXMgd2l0aG91dCB0aGVtLgoKMi85Lzk3ICA6IENoYW5nZWQgdGhlIHN5bnRheCBvZiB0aGUgU1dJRyAlcHJhZ21hIGRpcmVjdGl2ZSB0bwogICAgICAgICAgJXByYWdtYSBvcHRpb249dmFsdWUgb3IgJXByYWdtYShsYW5nKSBvcHRpb249dmFsdWUuCiAgICAgICAgICBUaGlzIGNoYW5nZSBtYWtlcyB0aGUgc3ludGF4IGEgbGl0dGxlIG1vcmUgY29uc2lzdGVudAogICAgICAgICAgYmV0d2VlbiBnZW5lcmFsIHByYWdtYXMgYW5kIGxhbmd1YWdlLXNwZWNpZmljIHByYWdtYXMuCiAgICAgICAgICBUaGUgb2xkIHN5bnRheCBzdGlsbCB3b3JrcywgYnV0IHdpbGwgcHJvYmFibHkgYmUgcGhhc2VkCiAgICAgICAgICBvdXQgKGEgd2FybmluZyBtZXNzYWdlIGlzIGN1cnJlbnRseSBwcmludGVkKS4KCjIvOS85NyAgOiBJbXByb3ZlZCBUY2wgc3VwcG9ydCBvZiBnbG9iYWwgdmFyaWFibGVzIHRoYXQgYXJlIG9mCiAgICAgICAgICBzdHJ1Y3R1cmVzLCBjbGFzc2VzLCBhbmQgdW5pb25zLgoKMi85Lzk3ICA6IEZpeGVkIEMrKyBjb21waWxhdGlvbiBwcm9ibGVtIGluIFB5dGhvbiAnZW1iZWQuaScgbGlicmFyeSBmaWxlLgoKMi85Lzk3ICA6IEZpeGVkIG1pc3NpbmcgcmV0dXJuIHZhbHVlIGluIHBlcmxtYWluLmkgbGlicmFyeSBmaWxlLgoKMi85Lzk3ICA6IEZpeGVkIFB5dGhvbiBzaGFkb3cgY2xhc3NlcyB0byByZXR1cm4gYW4gQXR0cmlidXRlRXJyb3Igd2hlbgogICAgICAgICAgdW5kZWZpbmVkIGF0dHJpYnV0ZXMgYXJlIGFjY2Vzc2VkIChvbGRlciB2ZXJzaW9ucyByZXR1cm5lZAogICAgICAgICAgYSBOYW1lRXJyb3IpLgoKMi85Lzk3ICA6IEZpeGVkIGJ1ZyB3aGVuICVhZGRtZXRob2RzIGlzIHVzZWQgYWZ0ZXIgYSBjbGFzcyBkZWZpbml0aW9uIHdob3NlCiAgICAgICAgICBsYXN0IHNlY3Rpb24gaXMgcHJvdGVjdGVkIG9yIHByaXZhdGUuCgoyLzgvOTcgIDogTWFkZSBzbGlnaHQgY2hhbmdlcyBpbiBpbmNsdWRlIGZpbGUgcHJvY2Vzc2luZyB0byBzdXBwb3J0CiAgICAgICAgICB0aGUgTWFjaW50b3NoLgoKMi84Lzk3ICA6IEV4dGVuZGVkIHN3aWdtYWluLmN4eCB0byBwcm92aWRlIGEgcnVkaW1lbnRhcnkgTWFjaW50b3NoIGludGVyZmFjZS4KICAgICAgICAgIEl0J3MgYSByZWFsbHkgYmFkIGludGVyZmFjZSwgYnV0IHdvcmtzIHVudGlsIHNvbWV0aGluZyBiZXR0ZXIKICAgICAgICAgIGlzIHdyaXR0ZW4uCgoxLzI5Lzk3IDogRml4ZWQgdHlwZS1jYXN0aW5nIGJ1ZyBpbnRyb2R1Y2VkIGJ5IDEuMWI0IHdoZW4gc2V0dGluZy9nZXR0aW5nIHRoZQogICAgICAgICAgdmFsdWUgb2YgZ2xvYmFsIHZhcmlhYmxlcyBpbnZvbHZpbmcgY29tcGxleCBkYXRhIHR5cGVzLgoKMS8yOS85NyA6IFJlbW92ZWQgZXJyb25lb3VzIHdoaXRlIHNwYWNlIGJlZm9yZSBhbiAjZW5kaWYgaW4gdGhlIGNvZGUgZ2VuZXJhdGVkCiAgICAgICAgICBieSB0aGUgUHl0aG9uIG1vZHVsZSAod2FzIGNhdXNpbmcgZXJyb3JzIG9uIERFQyBBbHBoYSBjb21waWxlcnMpLgoKMS8yNi85NyA6IEZpeGVkIGVycm9ycyB3aGVuIHVzaW5nIGRlZmF1bHQvb3B0aW9uYWwgYXJndW1lbnRzIGluIFB5dGhvbiBzaGFkb3cKCSAgc2hhZG93IGNsYXNzZXMuCgoxLzIzLzk3IDogRml4ZWQgYnVnIHdpdGggbmVzdGVkICVleHRlcm4gZGVjbGFyYXRpb25zLgoKMS8yMS85NyA6IEZpeGVkIHByb2JsZW0gd2l0aCB0eXBlZGVmIGludm9sdmluZyBjb25zdCBkYXRhdHlwZXMuCgoxLzIxLzk3IDogU29tZXdoYXQgb2JzY3VyZSwgYnV0IHNlcmlvdXMgYnVnIHdpdGggaGF2aW5nIG11bHRpcGxlIGxldmVscwogICAgICAgICAgb2YgdHlwZWRlZnMgZml4ZWQuICBGb3IgZXhhbXBsZSA6CgoJCXR5cGVkZWYgY2hhciAqU3RyaW5nOwogICAgICAgICAgICAgICAgdHlwZWRlZiBTdHJpbmcgIE5hbWU7CgpWZXJzaW9uIDEuMSBCZXRhNCAoSmFudWFyeSAxNiwgMTk5NykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpOb3RlIDogU1dJRyAxLjFiMyBjcmFzaGVkIGFuZCBidXJuZWQgc2hvcnRseSBhZnRlciB0YWtlIG9mZiBkdWUKdG8gYSBmZXcgbWFqb3IgcnVuLXRpbWUgcHJvYmxlbXMgdGhhdCBzdXJmYWNlZCBhZnRlciByZWxlYXNlLgpUaGlzIHJlbGVhc2Ugc2hvdWxkIGZpeCBtb3N0LCBpZiBub3QgYWxsLCBvZiB0aG9zZSBwcm9ibGVtcy4KCjEvMTYvOTcgOiBGaXhlZCBtYWpvciBtZW1vcnkgbWFuYWdlbWVudCBidWcgb24gTGludXgKCjEvMTQvOTcgOiBGaXhlZCBidWcgaW4gZnVuY3Rpb25zIHJldHVybmluZyBjb25zdGFudCBDKysgcmVmZXJlbmNlcy4KCjEvMTQvOTcgOiBNb2RpZmllZCBDKysgbW9kdWxlIHRvIGhhbmRsZSBkYXRhdHlwZXMgYmV0dGVyLgoKMS8xNC85NyA6IE1vZGlmaWVkIHBhcnNlciB0byBhbGxvdyBhICpzaW5nbGUqIHNjb3BlIHJlc29sdXRpb24KICAgICAgICAgIG9wZXJhdG9yIGluIGRhdGF0eXBlcy4gIEllIDogRm9vOjpiYXIuICAgU1dJRyBkb2Vzbid0CiAgICAgICAgICB5ZXQgaGFuZGxlIG5lc3RlZCBjbGFzc2VzLCBzbyB0aGlzIHNob3VsZCBiZQogICAgICAgICAgc3VmZmljaWVudCBmb3Igbm93LgoKMS8xNC85NyA6IE1vZGlmaWVkIHBhcnNlciB0byBhbGxvdyB0eXBlZGVmIGluc2lkZSBhIEMrKyBjbGFzcy4KCjEvMTQvOTcgOiBGaXhlZCBzb21lIHByb2JsZW1zIHJlbGF0ZWQgdG8gZGF0YXR5cGVzIGRlZmluZWQgaW5zaWRlCiAgICAgICAgICBhIEMrKyBjbGFzcy4gIFNXSUcgd2FzIG5vdCBnZW5lcmF0aW5nIGNvcnJlY3QgY29kZSwKICAgICAgICAgIGJ1dCBhIG5ldyBzY29waW5nIG1lY2hhbmlzbSBhbmQgbWV0aG9kIGZvciBoYW5kbGluZwogICAgICAgICAgZGF0YXR5cGVzIGluc2lkZSBhIEMrKyBjbGFzcyBoYXZlIGJlZW4gYWRkZWQuCgoxLzE0Lzk3IDogQ2hhbmdlZCBlbnVtZXJhdGlvbnMgdG8gdXNlIHRoZSB2YWx1ZSBuYW1lIGluc3RlYWQKICAgICAgICAgIG9mIGFueSB2YWx1ZXMgdGhhdCBtaWdodCBoYXZlIGFwcGVhcmVkIGluIHRoZSBpbnRlcmZhY2UKICAgICAgICAgIGZpbGUuICBUaGlzIG1ha2VzIHRoZSBjb2RlIGEgbGl0dGxlIG1vcmUgZnJpZW5kbHkgdG8KICAgICAgICAgIEMrKyBjb21waWxlcnMuCgoxLzE0Lzk3IDogUmVtb3ZlZCB0eXBlZGVmIGJ1ZyB0aGF0IG1hZGUgYWxsIGVudW1lcmF0aW9ucwogICAgICAgICAgZXF1aXZhbGVudCB0byBlYWNoIG90aGVyIGluIHRoZSB0eXBlIGNoZWNrZXIgKHNpbmNlCiAgICAgICAgICBpdCBnZW5lcmF0ZWQgYWxvdCBvZiB1bm5lY2Vzc2FyeSBjb2RlKS4KClZlcnNpb24gMS4xIEJldGEzIChKYW51YXJ5IDksIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpOb3RlIDogQSAqaHVnZSogbnVtYmVyIG9mIGNoYW5nZXMgcmVsYXRlZCB0byBvbmdvaW5nIG1vZGlmaWNhdGlvbnMuCgoxLiAgU3VwcG9ydCBmb3IgQysrIG11bHRpcGxlIGluaGVyaXRhbmNlIGFkZGVkLgoKMi4gIFR5cGVtYXBzIGFkZGVkLgoKMy4gIFNvbWUgc3VwcG9ydCBmb3IgbmVzdGVkIHN0cnVjdHVyZSBkZWZpbml0aW9ucyBhZGRlZC4KCjQuICBEZWZhdWx0IGFyZ3VtZW50IGhhbmRsaW5nIGFkZGVkLgoKNS4gIC1jIG9wdGlvbiBhZGRlZCBmb3IgYnVpbGRpbmcgYmFyZSB3cmFwcGVyIGNvZGUgbW9kdWxlcy4KCjYuICBSZXdyb3RlIFBvaW50ZXIgdHlwZS1jaGVja2luZyB0byBzdXBwb3J0IG11bHRpcGxlIGluaGVyaXRhbmNlCiAgICBjb3JyZWN0bHkuCgo3LiAgVGNsIDguMCBtb2R1bGUgYWRkZWQuCgo4LiAgUGVybDQgYW5kIEd1aWxlIG1vZHVsZXMgcmVzdXJyZWN0ZWQgZnJvbSB0aGUgZGVhZCAod2VsbCwgdGhleQogICAgYXQgbGVhc3Qgd29yayBhZ2FpbikuCgo5LiAgTmV3IE9iamVjdCBPcmllbnRlZCBUY2wgaW50ZXJmYWNlIGFkZGVkLgoKMTAuIEJ1ZyBmaXhlcyB0byBQZXJsNSBzaGFkb3cgY2xhc3Nlcy4KCjExLiBDbGVhbmVkIHVwIG1hbnkgb2YgdGhlIGludGVybmFsIG1vZHVsZXMgb2YgdGhlIHBhcnNlci4KCjEyLiBUb25zIG9mIGV4YW1wbGVzIGFuZCB0ZXN0aW5nIG1vZHVsZXMgYWRkZWQuCgoxMy4gRml4ZWQgYnVncyByZWxhdGVkIHRvIHVzZSBvZiAiY29uc3QiIHJldHVybiB2YWx1ZXMuCgoxNC4gRml4ZWQgYnVnIHdpdGggQysrIG1lbWJlciBmdW5jdGlvbnMgcmV0dXJuaW5nIHZvaWQgKi4KCjE1LiBDaGFuZ2VkIFNXSUcgY29uZmlndXJhdGlvbiBzY3JpcHQuCgpWZXJzaW9uIDEuMSBCZXRhMiAoRGVjZW1iZXIgMywgMTk5NikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxLiBDb21wbGV0ZWx5IHJld3JvdGUgdGhlIFNXSUcgZG9jdW1lbnRhdGlvbiBzeXN0ZW0uICBUaGUgY2hhbmdlcwogICBpbnZvbHZlZCBhcmUgdG9vIG51bWVyb3VzIHRvIG1lbnRpb24uICBCYXNpY2FsbHksIHRha2UgZXZlcnl0aGluZwogICB5b3Uga25ldyBhYm91dCB0aGUgb2xkIHN5c3RlbSwgdGhyb3cgdGhlbSBvdXQsIGFuZCByZWFkIHRoZQogICBmaWxlIERvYy9kb2MucHMuCgoyLiBMaW1pdGVkIHN1cHBvcnQgZm9yICNpZiBkZWZpbmVkKCkgYWRkZWQuCgozLiBUeXBlIGNhc3RzIGFyZSBub3cgYWxsb3dlZCBpbiBjb25zdGFudCBleHByZXNzaW9ucy4gIGllCgogICAgICAgICAjZGVmaW5lICBBICAgKGludCkgMwoKNC4gQWRkZWQgc3VwcG9ydCBmb3IgdHlwZWRlZiBsaXN0cy4gIEZvciBleGFtcGxlIDoKCgl0eXBlZGVmIHN0cnVjdCB7CgkgICAgICAgIGRvdWJsZSB4LHksejsKICAgICAgICB9IFZlY3RvciwgKlZlY3RvclB0cjsKCjUuIE5ldyBTV0lHIGRpcmVjdGl2ZXMgKHJlbGF0ZWQgdG8gZG9jdW1lbnRhdGlvbiBzeXN0ZW0pCgoJJXN0eWxlCgklbG9jYWxzdHlsZQoJJXN1YnNlY3Rpb24KCSVzdWJzdWJzZWN0aW9uCgo2LiBSZW9yZ2FuaXplZCB0aGUgQysrIGhhbmRsaW5nIGFuZCBtYWRlIGl0IGEgbGl0dGxlIGVhc2llciB0bwogICB3b3JrIHdpdGggaW50ZXJuYWxseS4KCjcuICBGaXhlZCBwcm9ibGVtIHdpdGggaW5oZXJpdGluZyBkYXRhIG1lbWJlcnMgaW4gUHl0aG9uCiAgICBzaGFkb3cgY2xhc3Nlcy4KCjguICBGaXhlZCBzeW1ib2wgdGFibGUgcHJvYmxlbXMgd2l0aCBzaGFkb3cgY2xhc3NlcyBpbiBib3RoCiAgICBQeXRob24gYW5kIFBlcmwuCgo5LiAgRml4ZWQgYW5ub3lpbmcgc2VnbWVudGF0aW9uIGZhdWx0IGJ1ZyBpbiB3cmFwcGVyIGNvZGUKICAgIGdlbmVyYXRlZCBmb3IgUGVybDUuCgoxMC4gRml4ZWQgYnVnIHdpdGggJWFkZG1ldGhvZHMgZGlyZWN0aXZlLiAgTm93IGl0IGNhbiBiZSBwbGFjZWQKICAgIGFueXdoZXJlIGluIGEgY2xhc3MuCgoxMS4gTW9yZSB0ZXN0IGNhc2VzIGFkZGVkIHRvIHRoZSBTV0lHIHNlbGYtdGVzdC4gICBEb2N1bWVudGF0aW9uCiAgICB0ZXN0cyBhcmUgbm93IHBlcmZvcm1lZCBhbG9uZyB3aXRoIG90aGVyIHRoaW5ncy4KCjEyLiBSZW9yZ2FuaXplZCB0aGUgU1dJRyBsaWJyYXJ5IGEgbGl0dGxlIGJpdCBhbmQgc2V0IGl0IHVwIHRvCiAgICBzZWxmLWRvY3VtZW50IGl0c2VsZiB1c2luZyBTV0lHLgoKMTMuIExvdHMgYW5kIGxvdHMgb2YgbWlub3IgYnVnIGZpeGVzIChtb3N0bHkgb2JzY3VyZSwgYnV0IGJ1Z3MKICAgIG5vbmV0aGVsZXNzKS4KCgpWZXJzaW9uIDEuMSBCZXRhMSAoT2N0b2JlciAzMCwgMTk5NikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxLiBBZGRlZCBuZXcgJWV4dGVybiBkaXJlY3RpdmUgZm9yIGhhbmRsaW5nIG11bHRpcGxlIGZpbGVzCgoyLiBQZXJsNSBzaGFkb3cgY2xhc3NlcyBhZGRlZAoKMy4gUmV3cm90ZSBjb25kaXRpb25hbCBjb21waWxhdGlvbiB0byB3b3JrIGJldHRlcgoKNC4gQWRkZWQgJ2Jvb2wnIGRhdGF0eXBlCgo1LiAleywlfSBibG9jayBpcyBub3cgb3B0aW9uYWwuCgo2LiBGaXhlZCBzb21lIGJ1Z3MgaW4gdGhlIFB5dGhvbiBzaGFkb3cgY2xhc3MgbW9kdWxlCgo3LiBSZXdyb3RlIGFsbCBvZiB0aGUgU1dJRyB0ZXN0cyB0byBiZSBtb3JlIGluZm9ybWF0aXZlCiAgIChhbmQgbGVzcyBzY2FyeSkuCgo4LiBSZXdyb3RlIHBhcmFtZXRlciBsaXN0IGhhbmRsaW5nIHRvIGJlIG1vcmUgbWVtb3J5CiAgIGVmZmljaWVudCBhbmQgZmxleGlibGUuCgo5LiBDaGFuZ2VkIHBhcnNlciB0byBpZ25vcmUgJ3N0YXRpYycgZGVjbGFyYXRpb25zLgoKMTAuIEluaXRpYWxpemVycyBhcmUgbm93IGlnbm9yZWQuICBGb3IgZXhhbXBsZSA6CgoJc3RydWN0IEZvb0JhciBhID0gezMsNCw1fTsKCjExLiBTb21ld2hhdCBiZXR0ZXIgcGFyc2luZyBvZiBhcnJheXMgKGFsdGhvdWdoIGl0J3MKICAgIHVzdWFsbHkganVzdCBhIGJldHRlciBlcnJvciBtZXNzYWdlIG5vdykuCgoxMi4gTG90J3Mgb2YgbWlub3IgYnVnIGZpeGVzLgoKClZlcnNpb24gMS4wIEZpbmFsIChBdWd1c3QgMzEsIDE5OTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxLiBGaXhlZCBtaW5vciBidWcgaW4gQysrIG1vZHVsZQoKMi4gRml4ZWQgbWlub3IgYnVnIGluIHBvaW50ZXIgdHlwZS1jaGVja2VyIHdoZW4gdXNpbmcKICAgLURBTExPV19OVUxMLgoKMy4gRml4ZWQgY29uZmlndXJlIHNjcmlwdCB0byB3b3JrIHdpdGggUHl0aG9uIDEuNGJldGEzCgo0LiBDaGFuZ2VkIGNvbmZpZ3VyZSBzY3JpcHQgdG8gYWxsb3cgY29tcGlsYXRpb24gd2l0aG91dAogICB5YWNjIG9yIGJpc29uLgoKVmVyc2lvbiAxLjAgRmluYWwgKEF1Z3VzdCAyOCwgMTk5NikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEuICBDaGFuZ2VkIHBhcnNlciB0byBzdXBwb3J0IG1vcmUgQy9DKysgZGF0YXR5cGVzICh3ZWxsLAogICAgbW9yZSB2YXJpYW50cykuICAgVHlwZXMgbGlrZSAidW5zaWduZWQiLCAic2hvcnQgaW50IiwKICAgICJsb25nIGludCIsIGV0Yy4uLiBub3cgd29yay4KCjIuICAidW5pb25zIiBhZGRlZCB0byBwYXJzZXIuCgozLiAgVXNlIG9mICJ0eXBlZGVmIiBhcyBpbiA6CgoJdHlwZWRlZiBzdHJ1Y3QgewoJICAgICBkb3VibGUgeCx5LHo7Cgl9IFZlY3RvcjsKCiAgICBOb3cgd29ya3MgY29ycmVjdGx5LiAgIFRoZSBuYW1lIG9mIHRoZSB0eXBlZGVmIGlzIHVzZWQgYXMKICAgIHRoZSBzdHJ1Y3R1cmUgbmFtZS4KCjQuICBDb25kaXRpb25hbCBjb21waWxhdGlvbiB3aXRoICNpZmRlZiwgI2Vsc2UsICNlbmRpZiwgZXRjLi4uCiAgICBhZGRlZC4KCjUuICBOZXcgJWRpc2FibGVkb2MsICVlbmFibGVkb2MgZGlyZWN0aXZlcyBhbGxvdyBkb2N1bWVudGF0aW9uCiAgICB0byBzZWxlY3RpdmVseSBiZSBkaXNhYmxlZCBmb3IgY2VydGFpbiBwYXJ0cyBvZiBhIHdyYXBwZXIKICAgIGZpbGUuCgo2LiAgTmV3IFB5dGhvbiBtb2R1bGUgc3VwcG9ydHMgYmV0dGVyIHZhcmlhYmxlIGxpbmtpbmcsIGNvbnN0YW50cywKICAgIGFuZCBzaGFkb3cgY2xhc3Nlcy4KCjcuICBQZXJsNSBtb2R1bGUgaW1wcm92ZWQgd2l0aCBiZXR0ZXIgY29tcGF0aWJpbGl0eSB3aXRoIFhTCiAgICBhbmQgeHN1YnBwLiAgIFNXSUcgcG9pbnRlcnMgYW5kIG5vdyBjcmVhdGVkIHNvIHRoYXQgdGhleQogICAgYXJlIGNvbXBhdGlibGUgd2l0aCB4c3VicHAgcG9pbnRlcnMuCgo4LiAgU3VwcG9ydCBmb3IgW2luY3IgVGNsXSBuYW1lc3BhY2VzIGFkZGVkIHRvIFRjbCBtb2R1bGUuCgo5LiAgJXByYWdtYSBkaXJlY3RpdmUgYWRkZWQuCgoxMC4gJWFkZG1ldGhvZHMgZGlyZWN0aXZlIGFkZGVkLgoKMTEuICVuYXRpdmUgZGlyZWN0aXZlIGFkZGVkIHRvIGFsbG93IHByZS1leGlzdGluZyB3cmFwcGVyIGZ1bmN0aW9ucwogICAgdG8gYmUgdXNlZC4KCjEyLiBXcm90ZSBjb25maWd1cmUgc2NyaXB0IGZvciBTV0lHIGluc3RhbGxhdGlvbi4KCjEzLiBGdW5jdGlvbiBwb2ludGVycyBub3cgYWxsb3dlZCB3aXRoIHR5cGVkZWYgc3RhdGVtZW50cy4KCjE0LiAldHlwZWRlZiBtb2RpZmllZCB0byBpbnNlcnQgYSBjb3JyZXNwb25kaW5nIEMgdHlwZWRlZiBpbnRvCiAgICB0aGUgb3V0cHV0IGZpbGUuCgoxNS4gRml4ZWQgc29tZSBwcm9ibGVtcyByZWxhdGVkIHRvIEMrKyByZWZlcmVuY2VzLgoKMTYuIE5ldyBTdHJpbmcgYW5kIFdyYXBwZXJGdW5jdGlvbiBjbGFzc2VzIGFkZCB0byBtYWtlIGdlbmVyYXRpbmcKICAgIHdyYXBwZXIgY29kZSBlYXNpZXIuCgoxNy4gRml4ZWQgY29tbWFuZCBsaW5lIG9wdGlvbiBwcm9jZXNzaW5nIHRvIGVsaW1pbmF0ZSBjb3JlIGR1bXBzCiAgICBhbmQgdG8gYWxsb3cgaGVscCBtZXNzYWdlcy4KCjE4LiBMb3QncyBvZiBtaW5vciBidWcgZml4ZXMgdG8gYWxtb3N0IGFsbCBjb2RlIG1vZHVsZXMKCgpWZXJzaW9uIDEuMCBCZXRhIDMgKFBhdGNoIDEpIEp1bHkgMTcsIDE5OTYKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxLjAgRmluYWwgaXMgbm90IHF1aXRlIHJlYWR5IHlldCwgYnV0IHRoaXMgcmVsZWFzZSBmaXhlcyBhCm51bWJlciBvZiBpbW1lZGlhdGUgcHJvYmxlbXMgOgoKMS4gIENvbXBpbGVyIGVycm9ycyB3aGVuIHVzaW5nIC1zdHJpY3QgMSB0eXBlIGNoZWNraW5nIGhhdmUgYmVlbiBmaXhlZC4KCjIuICBQb2ludGVyIHR5cGUgY2hlY2tlciBub3cgcmVjb2duaXplcyBwb2ludGVycyBvZiB0aGUgZm9ybQogICAgXzBfVHlwZSBjb3JyZWN0bHkuCgozLiAgQSBmZXcgbWlub3IgZml4ZXMgd2VyZSBtYWRlIGluIHRoZSBNYWtlZmlsZQoKVmVyc2lvbiAxLjAgQmV0YSAzIChKdW5lIDE0LCAxOTk2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoKVGhlcmUgYXJlIGxvdHMgb2YgY2hhbmdlcyBpbiB0aGlzIHJlbGVhc2UgOgoKMS4gIFNXSUcgaXMgbm93IGludm9rZWQgdXNpbmcgdGhlICJzd2lnIiBjb21tYW5kIGluc3RlYWQgb2YgIndyYXAiLgogICAgSGV5LCBzd2lnIHNvdW5kcyBjb29sZXIuCgoyLiAgVGhlIFNXSUdfTElCIGVudmlyb25tZW50IHZhcmlhYmxlIGNhbiBiZSBzZXQgdG8gY2hhbmdlIHRoZQogICAgbG9jYXRpb24gd2hlcmUgU1dJRyBsb29rcyBmb3IgbGlicmFyeSBmaWxlcy4KCjMuICBDKysgc3VwcG9ydCBoYXMgYmVlbiBhZGRlZC4gICBZb3Ugc2hvdWxkIHVzZSB0aGUgLWMrKyBvcHRpb24KICAgIHRvIGVuYWJsZSBpdC4KCjQuICBUaGUgJWluaXQgZGlyZWN0aXZlIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IHRoZSAlbW9kdWxlIGRpcmVjdGl2ZS4KICAgICVtb2R1bGUgY29uc3RydWN0cyBhIHZhbGlkIG5hbWUgZm9yIHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbgogICAgZm9yIHdoYXRldmVyIHRhcmdldCBsYW5ndWFnZSB5b3UncmUgdXNpbmcgKGFjdHVhbGx5IHRoaXMgbWFrZXMKICAgIFNXSUcgZmlsZXMgYSBsaXR0bGUgY2xlYW5lcikuICBUaGUgb2xkICVpbml0IGRpcmVjdGl2ZSBzdGlsbCB3b3Jrcy4KCjUuICBUaGUgc3ludGF4IG9mIHRoZSAlbmFtZSBkaXJlY3RpdmUgaGFzIGJlZW4gY2hhbmdlZC4gICBVc2Ugb2YgdGhlCiAgICBvbGQgb25lIHNob3VsZCBnZW5lcmF0ZSBhIHdhcm5pbmcgbWVzc2FnZSwgYnV0IG1heSBzdGlsbCB3b3JrLgoKNi4gIFRvIHN1cHBvcnQgVGNsL1RrIG9uIG5vbi11bml4IHBsYXRmb3JtcywgU1dJRyBpbXBvcnRzIGEgZmlsZSBjYWxsZWQKICAgIHN3aWd0Y2wuY2ZnIGZyb20gdGhlICQoU1dJR19MSUIpL3RjbCBkaXJlY3RvcnkuICAgSSBkb24ndCBoYXZlIGFjY2VzcwogICAgdG8gYW4gTlQgbWFjaGluZSwgYnV0IHRoaXMgZmlsZSBpcyBzdXBwb3NlZGx5IGFsbG93cyBTV0lHIHRvCiAgICBwcm9kdWNlIHdyYXBwZXIgY29kZSB0aGF0IGNvbXBpbGVzIG9uIGJvdGggVU5JWCBhbmQgbm9uIFVOSVggbWFjaGluZXMuCiAgICBJZiB0aGlzIGRvZXNuJ3Qgd29yaywgeW91J2xsIGhhdmUgdG8gZWRpdCB0aGUgZmlsZSBzd2lndGNsLmNmZy4gUGxlYXNlCiAgICBsZXQgbWUga25vdyBpZiB0aGlzIGRvZXNuJ3Qgd29yayBzbyBJIGNhbiB1cGRhdGUgdGhlIGZpbGUgYXMKICAgIG5lY2Vzc2FyeS4KCjcuICBUaGUgU1dJRyBydW4tdGltZSB0eXBlY2hlY2tlciBoYXMgYmVlbiBpbXByb3ZlZC4gICAgWW91IGNhbiBhbHNvCiAgICBub3cgcmVkZWZpbmUgaG93IGl0IHdvcmtzIGJ5IHN1cHBseWluZyBhIGZpbGUgY2FsbGVkICJzd2lncHRyLmNmZyIKICAgIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB5b3VyIFNXSUcgaW50ZXJmYWNlIGZpbGVzLiAgIEJ5IGRlZmF1bHQsCiAgICBTV0lHIHJlYWRzIHRoaXMgZmlsZSBmcm9tICQoU1dJR19MSUIpL2NvbmZpZy4KCjguICBUaGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0gaGFzIGJlZW4gY2hhbmdlZCB0byBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgOgoKCS0gIERvY3VtZW50YXRpb24gb3JkZXIgaXMgcHJpbnRlZCBpbiBpbnRlcmZhY2UgZmlsZSBvcmRlciBieQogICAgICAgICAgIGRlZmF1bHQuICAgVGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBwdXR0aW5nIGFuICVhbHBoYQogICAgICAgICAgIGRpcmVjdGl2ZSBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnRlcmZhY2UgZmlsZS4KCiAgICAgICAgLSAgWW91IGNhbiBzdXBwbHkgYWRkaXRpb25hbCBkb2N1bWVudGF0aW9uIHRleHQgdXNpbmcKCiAgICAgICAgICAgJXRleHQgJXsgcHV0IHlvdXIgdGV4dCBoZXJlICV9CgogICAgICAgIC0gIEEgZmV3IG1pbm9yIGJ1Z3Mgd2VyZSBmaXhlZC4KCjkuICBBIGZldyBpbXByb3ZlbWVudHMgaGF2ZSBiZWVuIG1hZGUgdG8gdGhlIGhhbmRsaW5nIG9mIGNvbW1hbmQgbGluZQogICAgb3B0aW9ucyAoYnV0IGl0J3Mgc3RpbGwgbm90IGZpbmlzaGVkKS4KCjEwLiAgTG90cyBvZiBtaW5vciBidWcgZml4ZXMgaW4gbW9zdCBvZiB0aGUgbGFuZ3VhZ2UgbW9kdWxlcyBoYXZlIGJlZW4KICAgICBtYWRlLgoKMTEuIEZpbGVuYW1lcyBoYXZlIGJlZW4gY2hhbmdlZCB0byA4LjMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBhIFNXSUcKICAgIHBvcnQgdG8gbm9uLXVuaXggcGxhdGZvcm1zICh3b3JrIGluIHByb2dyZXNzKS4KCjEyLiBDKysgZmlsZSBzdWZmaXggaXMgbm93IC5jeHggKGZvciBzYW1lIHJlYXNvbikuCgoxMy4gVGhlIGRvY3VtZW50YXRpb24gaGFzIGJlZW4gdXBncmFkZWQgc2lnbmlmaWNhbnRseSBhbmQgaXMgbm93CiAgICBhcm91bmQgMTAwIHBhZ2VzLiAgICBJIGFkZGVkIG5ldyBleGFtcGxlcyBhbmQgYSBzZWN0aW9uIG9uCiAgICBDKysuICBUaGUgZG9jdW1lbnRhdGlvbiBub3cgaW5jbHVkZXMgYSBUYWJsZSBvZiBDb250ZW50cy4KCjE0LiBUaGUgU1dJRyBFeGFtcGxlcyBkaXJlY3RvcnkgaXMgc3RpbGwgd29lZnVsbHkgc3BhcnNlLCBidXQgaXMKICAgIGdldHRpbmcgYmV0dGVyLgoKU3BlY2lhbCBub3RpY2UgYWJvdXQgQysrCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpUaGlzIGlzIHRoZSBmaXJzdCB2ZXJzaW9uIG9mIFNXSUcgdG8gc3VwcG9ydCBDKysgcGFyc2luZy4gIEN1cnJlbnRseQp0aGUgQysrIGlzIGZhciBmcm9tIGNvbXBsZXRlLCBidXQgc2VlbXMgdG8gd29yayBmb3Igc2ltcGxlIGNhc2VzLgpObyB3b3JrIGhhcyBiZWVuIGRvbmUgdG8gYWRkIHNwZWNpYWwgQysrIHByb2Nlc3NpbmcgdG8gYW55IG9mCnRoZSB0YXJnZXQgbGFuZ3VhZ2VzLiAgIFNlZSB0aGUgdXNlciBtYW51YWwgZm9yIGRldGFpbHMgYWJvdXQgaG93CkMrKyBpcyBoYW5kbGVkLiAgIElmIHlvdSBmaW5kIHByb2JsZW1zIHdpdGggdGhlIEMrKyBpbXBsZW1lbnRhdGlvbiwKcGxlYXNlIGxldCBtZSBrbm93LiAgRXhwZWN0IG1ham9yIGltcHJvdmVtZW50cyBpbiB0aGlzIGFyZWEuCgpOb3RlIDogSSBoYXZlIG9ubHkgc3VjY2Vzc2Z1bGx5IHVzZWQgU1dJRyBhbmQgQysrIHdpdGggVGNsIGFuZApQeXRob24uCgpOb3RpY2UgYWJvdXQgVmVyc2lvbiAxLjBGaW5hbAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKVmVyc2lvbiAxLjBCMyBpcyB0aGUgbGFzdCBCZXRhIHJlbGVhc2UgYmVmb3JlIHZlcnNpb24gMS4wIEZpbmFsIGlzCnJlbGVhc2VkLiAgSSBoYXZlIGZyb3plbiB0aGUgbGlzdCBvZiBmZWF0dXJlcyBzdXBwb3J0ZWQgaW4gdmVyc2lvbiAxLjAKYW5kIHdpbGwgb25seSBmaXggYnVncyBhcyB0aGV5IHNob3cgdXAuICBXb3JrIG9uIFNXSUcgdmVyc2lvbiAyLjAgaXMKYWxyZWFkeSBpbiBwcm9ncmVzcywgYnV0IGlzIGdvaW5nIHRvIHJlc3VsdCBpbiByYXRoZXIgc2lnbmlmaWNhbnQKY2hhbmdlcyB0byBTV0lHJ3MgaW50ZXJuYWwgc3RydWN0dXJlIChob3BlZnVsbHkgZm9yIHRoZSBiZXR0ZXIpLiAgTm8KYW50aWNpcGF0ZWQgZGF0ZSBmb3IgdmVyc2lvbiAyLjAgaXMgc2V0LCBidXQgaWYgeW91J3ZlIGdvdCBhbiBpZGVhLApsZXQgbWUga25vdy4KClZlcnNpb24gMS4wIEJldGEgMiAoQXByaWwgMjYsIDE5OTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpUaGlzIHJlbGVhc2UgaXMgaWRlbnRpY2FsIHRvIEJldGExIGV4Y2VwdCBhIGZldyBtaW5vciBidWdzIGFyZQpmaXhlZCBhbmQgdGhlIFNXSUcgbGlicmFyeSBoYXMgYmVlbiB1cGRhdGVkIHRvIHdvcmsgd2l0aCBUY2wgNy41L1RrIDQuMS4KQSB0Y2w3LjUgZXhhbXBsZXMgZGlyZWN0b3J5IGlzIG5vdyBpbmNsdWRlZC4KCi0gRml4ZWQgYSBidWcgaW4gdGhlIE1ha2VmaWxlIHRoYXQgZGlkbid0IGluc3RhbGwgdGhlIGxpYnJhcmllcwogIGNvcnJlY3RseS4KCi0gU1dJRyBMaWJyYXJ5IGZpbGVzIGFyZSBub3cgdXBkYXRlZCB0byB3b3JrIHdpdGggVGNsIDcuNSBhbmQgVGsgNC4xLgoKLSBNaW5vciBidWcgZml4ZXMgaW4gb3RoZXIgbW9kdWxlcy4KCgpWZXJzaW9uIDEuMCBCZXRhIDEgIChBcHJpbCAxMCwgMTk5NikuCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClRoaXMgaXMgdGhlIGZpcnN0ICJzZW1pLW9mZmljaWFsIiByZWxlYXNlIG9mIFNXSUcuICAgIEl0IGhhcyBhCm51bWJlciBvZiBzdWJzdGFudGlhbCBpbXByb3ZlbWVudHMgb3ZlciB0aGUgQWxwaGEgcmVsZWFzZS4gICBUaGVzZQpub3RlcyBhcmUgaW4gbm8gcGFydGljdWxhciBvcmRlci0taG9wZSBJIHJlbWVtYmVyZWQgZXZlcnl0aGluZy4uLi4KCjEuICBUY2wvVGsKClNXSUcgaXMga25vd24gdG8gd29yayB3aXRoIFRjbDcuMywgVGszLjYgYW5kIGxhdGVyIHZlcnNpb25zLgpJJ3ZlIGFsc28gdGVzdGVkIFNXSUcgd2l0aCBleHBlY3QtNS4xOS4KCk5vcm1hbGx5IFNXSUcgZXhwZWN0cyB0byB1c2UgdGhlIGhlYWRlciBmaWxlcyAidGNsLmgiIGFuZCAidGsuaCIuCk5ld2VyIHZlcnNpb25zIG9mIFRjbC9UayB1c2UgdmVyc2lvbiBudW1iZXJzLiAgIFlvdSBjYW4gc3BlY2lmeSB0aGVzZQppbiBTV0lHIGFzIGZvbGxvd3MgOgoKICAgICAgICAlIHdyYXAgLWh0Y2wgdGNsNy40LmggLWh0ayB0azQuMC5oIGV4YW1wbGUuaQoKT2YgY291cnNlLCBJIHByZWZlciB0byBzaW1wbHkgc2V0IHVwIHN5bWJvbGljIGxpbmtzIGJldHdlZW4gInRjbC5oIiBhbmQKdGhlIG1vc3QgcmVjZW50IHN0YWJsZSB2ZXJzaW9uIG9uIHRoZSBtYWNoaW5lLgoKMi4gIFBlcmw0CgpUaGlzIGltcGxlbWVudGF0aW9uIGhhcyBiZWVuIGJhc2VkIG9uIFBlcmwtNC4wMzUuICBTV0lHJ3MgaW50ZXJmYWNlIHRvClBlcmw0IGlzIGJhc2VkIG9uIHRoZSBkb2N1bWVudGF0aW9uIHByb3ZpZGVkIGluIHRoZSAiUHJvZ3JhbW1pbmcgUGVybCIKYm9vayBieSBMYXJyeSBXYWxsLCBhbmQgZmlsZXMgbG9jYXRlZCBpbiB0aGUgInVzdWIiIGRpcmVjdG9yeSBvZiB0aGUKUGVybDQgZGlzdHJpYnV0aW9uLgoKSW4gb3JkZXIgdG8gY29tcGlsZSB3aXRoIFBlcmw0LCB5b3UnbGwgbmVlZCB0byBsaW5rIHdpdGggdGhlIHVwZXJsLm8KZmlsZSBmb3VuZCBpbiB0aGUgUGVybDQgc291cmNlIGRpcmVjdG9yeS4gIFlvdSBtYXkgd2FudCB0byBtb3ZlIHRoaXMKZmlsZSB0byBhIG1vcmUgY29udmVuaWVudCBsb2NhdGlvbi4KCjMuICBQZXJsNQoKVGhpcyBpcyBhIHNvbWV3aGF0IGV4cGVyaW1lbnRhbCBpbXBsZW1lbnRhdGlvbiwgYnV0IGlzIGFsb3QgbGVzcwpidWdneSB0aGFuIHRoZSBhbHBoYSByZWxlYXNlLiAgICAgU1dJRyBvcGVyYXRlcyBpbmRlcGVuZGVudGx5IG9mCnRoZSBYUyBsYW5ndWFnZSBhbmQgeHN1YnBwIHN1cHBsaWVkIHdpdGggUGVybDUuICBDdXJyZW50bHkgU1dJRwpwcm9kdWNlcyB0aGUgbmVjZXNzYXJ5IEMgY29kZSBhbmQgLnBtIGZpbGUgbmVlZGVkIHRvIGR5bmFtaWNhbGx5CmxvYWQgYSBtb2R1bGUgaW50byBQZXJsNS4KClRvIHN1cHBvcnQgUGVybDUncyBub3Rpb24gb2YgbW9kdWxlcyBhbmQgcGFja2FnZXMgKGFzIHdpdGggeHN1YnBwKSwKeW91IGNhbiB1c2UgdGhlIGZvbGxvd2luZyBjb21tYW5kIGxpbmUgb3B0aW9ucyA6CgogICAgICAgICUgd3JhcCAtcGVybDUgLW1vZHVsZSBNeU1vZHVsZSAtcGFja2FnZSBNeVBhY2thZ2UgZXhhbXBsZS5pCgpOb3RlIDogSW4gb3JkZXIgZm9yIGR5bmFtaWMgbG9hZGluZyB0byBiZSBlZmZlY3RpdmUsIHlvdSBuZWVkIHRvIGJlCmNhcmVmdWwgYWJvdXQgbmFtaW5nLiAgICBGb3IgYSBtb2R1bGUgbmFtZWQgIk15TW9kdWxlIiwgeW91J2xsIG5lZWQgdG8KY3JlYXRlIGEgc2hhcmVkIG9iamVjdCBmaWxlIGNhbGxlZCAiTXlNb2R1bGUuc28iIHVzaW5nIHNvbWV0aGluZyBsaWtlCgogICAgICAgICUgbGQgLXNoYXJlZCBteV9vYmoubyAtbyBNeU1vZHVsZS5zbwoKVGhlIHVzZSBvZiB0aGUgJWluaXQgZGlyZWN0aXZlIG11c3QgbWF0Y2ggdGhlIG1vZHVsZSBuYW1lIHNpbmNlIFBlcmw1CmNhbGxzIGEgZnVuY3Rpb24gImJvb3RfTW9kdWxlTmFtZSIgaW4gb3JkZXIgdG8gaW5pdGlhbGl6ZSB0aGluZ3MuClNlZSB0aGUgRXhhbXBsZXMgZGlyZWN0b3J5IGZvciBzb21lIGV4YW1wbGVzIG9mIGhvdyB0byBnZXQgdGhpbmdzCnRvIHdvcmsuCgo0LiAgUHl0aG9uMS4zCgpUaGlzIGlzIHRoZSBmaXJzdCByZWxlYXNlIHN1cHBvcnRpbmcgUHl0aG9uLiAgICBUaGUgUHl0aG9uIHBvcnQgaXMKZXhwZXJpbWVudGFsIGFuZCBtYXkgYmUgcmV3cml0dGVuLiAgIFZhcmlhYmxlIGxpbmthZ2UgaXMgZG9uZSB0aHJvdWdoCmZ1bmN0aW9ucyB3aGljaCBpcyBzb3J0IG9mIGEga2x1ZGdlLiAgSSBhbHNvIHRoaW5rIGl0IHdvdWxkIGJlIG5pY2UKdG8gaW1wb3J0IFNXSUcgcG9pbnRlcnMgaW50byBQeXRob24gYXMgYSBuZXcgb2JqZWN0IChpbnN0ZWFkIG9mIHN0cmluZ3MpLgpPZiBjb3Vyc2UsIHRoaXMgbmVlZHMgYSBsaXR0bGUgbW9yZSB3b3JrLgoKNS4gIEd1aWxlMwoKSWYgeW91IHJlYWxseSB3YW50IHRvIGxpdmUgb24gdGhlIGVkZ2UsIHBpY2sgdXAgYSBjb3B5IG9mIEd1aWxlLWlpaSBhbmQKcGxheSBhcm91bmQgd2l0aCB0aGlzLiAgICAgIFRoaXMgaXMgaGlnaGx5IGV4cGVyaW1lbnRhbC0tLWVzcGVjaWFsbHkgc2luY2UKSSdtIG5vdCBzdXJlIHdoYXQgdGhlIG9mZmljaWFsIHN0YXRlIG9mIEd1aWxlIGlzIHRoZXNlIGRheXMuICBUaGlzCmltcGxlbWVudGF0aW9uIG1heSBjaGFuZ2UgYXQgYW55IHRpbWUgc2hvdWxkIEkgc3VkZGVubHkgZmlndXJlIG91dCBiZXR0ZXIKd2F5cyB0byBkbyB0aGluZ3MuCgo2LiAgRXh0ZW5kaW5nIFNXSUcKClNXSUcgaXMgd3JpdHRlbiBpbiBDKysgYWx0aG91Z2ggSSB0ZW5kIHRvIHRoaW5rIG9mIHRoZSBjb2RlIGFzIG1vc3RseQpiZWluZyBBTlNJIEMgd2l0aCBhIGxpdHRsZSBpbmhlcml0YW5jZSB0aHJvd24gaW4uICAgRWFjaCB0YXJnZXQgbGFuZ3VhZ2UKaXMgaW1wbGVtZW50ZWQgYXMgYSBDKysgY2xhc3MgdGhhdCBjYW4gYmUgcGx1Z2dlZCBpbnRvIHRoZSBzeXN0ZW0uCklmIHlvdSB3YW50IHRvIGFkZCB5b3VyIG93biBtb2RpZmljYXRpb25zLCBzZWUgQXBwZW5kaXggQyBvZiB0aGUgdXNlcgptYW51YWwuICAgVGhlbiB0YWtlIGEgbG9vayBhdCB0aGUgInVzZXIiIGRpcmVjdG9yeSB3aGljaCBjb250YWlucyBzb21lCmNvZGUgZm9yIGJ1aWxkaW5nIHlvdXIgb3duIGV4dGVuaW9ucy4KCjcuIFRoZSBTV0lHIGxpYnJhcnkKClRoZSBTV0lHIGxpYnJhcnkgaXMgc3RpbGwgaW5jb21wbGV0ZS4gIFNvbWUgb2YgdGhlIGZpbGVzIG1lbnRpb25lZCBpbgp0aGUgdXNlciBtYW51YWwgYXJlIHVuYXZhaWxhYmxlLiAgICBUaGVzZSBmaWxlcyB3aWxsIGJlIG1hZGUgYXZhaWxhYmxlCndoZW4gdGhleSBhcmUgcmVhZHkuICAgU3Vic2NyaWJlIHRvIHRoZSBTV0lHIG1haWxpbmcgbGlzdCBmb3IgYW5ub3VuY2VtZW50cwphbmQgdXBkYXRlcy4KCjguIFNXSUcgRG9jdW1lbnRhdGlvbgoKSSBoYXZlIHNvbWV0aW1lcyBleHBlcmllbmNlZCBwcm9ibGVtcyB2aWV3aW5nIHRoZSBTV0lHIGRvY3VtZW50YXRpb24gaW4Kc29tZSBwb3N0c2NyaXB0IHZpZXdlcnMuICAgSG93ZXZlciwgdGhlIGRvY3VtZW50YXRpb24gc2VlbXMgdG8gcHJpbnQKbm9ybWFsbHkuICAgIEknbSB3b3JraW5nIG9uIG1ha2luZyBtdWNoIG9mIHRoZSBkb2N1bWVudGF0aW9uIG9ubGluZSwKYnV0IHRoaXMgdGFrZXMgdGltZS4KClZlcnNpb24gMC4xIEFscGhhIChGZWJydWFyeSA5LCAxOTk2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEuICBSdW4tdGltZSB0eXBlLWNoZWNraW5nIG9mIFNXSUcgcG9pbnRlcnMuICAgUG9pbnRlcnMgYXJlIG5vdyByZXByZXNlbnRlZAogICAgYXMgc3RyaW5ncyB3aXRoIGJvdGggbnVtZXJpYyBhbmQgZW5jb2RlZCB0eXBlIGluZm9ybWF0aW9uLiAgICBUaGlzIG1ha2VzCiAgICBpdCBhIGxpdHRsZSBoYXJkZXIgdG8gc2hvb3QgeW91cnNlbGYgaW4gdGhlIGZvb3QgKGFuZCBpdCBlbGltaW5hdGVzCiAgICBzb21lIHNlZ21lbnRhdGlvbiBmYXVsdHMgYW5kIG90aGVyIG9kZGl0aWVzKS4KCjIuICBQeXRob24gMS4zIG5vdyBzdXBwb3J0ZWQuCgozLiAgI2RlZmluZSBhbmQgZW51bSBjYW4gYmUgdXNlZCB0byBpbnN0YWxsIGNvbnN0YW50cy4KCjQuICBDb21wbGV0ZWx5IHJld3JvdGUgdGhlICVpbmNsdWRlIGRpcmVjdGl2ZSBhbmQgbWFkZSBpdCBhbG90IG1vcmUgcG93ZXJmdWwuCgo1LiAgUmVzdHJ1Y3R1cmVkIHRoZSBTV0lHIGxpYnJhcnkgdG8gbWFrZSBpdCB3b3JrIGJldHRlci4KCjYuICBWYXJpb3VzIGJ1ZyBmaXhlcyB0byBUY2wsIFBlcmw0LCBQZXJsNSwgYW5kIEd1aWxlIGltcGxlbWVudGF0aW9ucy4KCjcuICBCZXR0ZXIgaW1wbGVtZW50YXRpb24gb2YgJXR5cGVkZWYgZGlyZWN0aXZlLgoKOC4gIE1hZGUgc29tZSBjaGFuZ2VzIHRvIFNXSUcncyBjbGFzcyBzdHJ1Y3R1cmUgdG8gbWFrZSBpdCBlYXNpZXIgdG8gZXhwYW5kLgogICAgU1dJRyBpcyBub3cgYnVpbHQgaW50byBhIGxpYnJhcnkgZmlsZSB0aGF0IHlvdSBjYW4gdXNlIHRvIG1ha2UgeW91cgogICAgb3duIGV4dGVuaW9ucy4KCjkuICBNYWRlIGV4dGVuc2l2ZSBjaGFuZ2VzIHRvIHRoZSBkb2N1bWVudGF0aW9uLgoKMTAuIE1pbm9yIGNoYW5nZXMgdG8gdGhlIFNXSUcgcGFyc2VyIHRvIG1ha2UgaXQgdXNlIGxlc3MgbWVtb3J5LgogICAgQWxzbyB0b29rIG91dCBzb21lIGV4dHJhbmVvdXMgcnVsZXMgdGhhdCB3ZXJlIHVuZG9jdW1lbnRlZCBhbmQKICAgIGRpZG4ndCB3b3JrIGluIHRoZSBmaXJzdCBwbGFjZS4KCjExLiBUaGUgU1dJRyBsaWJyYXJ5IGZpbGVzICJ0Y2xzaCIsICJ3aXNoIiwgImV4cGVjdCIsIGV0Yy4uLiBpbiB0aGUgZmlyc3QKICAgIHJlbGVhc2UgaGF2ZSBiZWVuIHJlc3RydWN0dXJlZCBhbmQgcmVuYW1lZCB0byAidGNsc2guaSIsICJ3aXNoLmkiLAogICAgYW5kIHNvIG9uLgo=